summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/Makefile.nmake4
-rw-r--r--src/common/address.c4
-rw-r--r--src/common/address.h2
-rw-r--r--src/common/aes.c2
-rw-r--r--src/common/aes.h2
-rw-r--r--src/common/backtrace.c2
-rw-r--r--src/common/backtrace.h2
-rw-r--r--src/common/compat.c2
-rw-r--r--src/common/compat.h2
-rw-r--r--src/common/compat_libevent.c2
-rw-r--r--src/common/compat_libevent.h2
-rw-r--r--src/common/compat_openssl.h2
-rw-r--r--src/common/compat_pthreads.c2
-rw-r--r--src/common/compat_threads.c116
-rw-r--r--src/common/compat_threads.h16
-rw-r--r--src/common/compat_time.c2
-rw-r--r--src/common/compat_time.h2
-rw-r--r--src/common/compat_winthreads.c2
-rw-r--r--src/common/compress.c593
-rw-r--r--src/common/compress.h88
-rw-r--r--src/common/compress_lzma.c351
-rw-r--r--src/common/compress_lzma.h43
-rw-r--r--src/common/compress_none.c53
-rw-r--r--src/common/compress_none.h20
-rw-r--r--src/common/compress_zlib.c304
-rw-r--r--src/common/compress_zlib.h43
-rw-r--r--src/common/compress_zstd.c401
-rw-r--r--src/common/compress_zstd.h43
-rw-r--r--src/common/confline.c338
-rw-r--r--src/common/confline.h49
-rw-r--r--src/common/container.c2
-rw-r--r--src/common/container.h3
-rw-r--r--src/common/crypto.c16
-rw-r--r--src/common/crypto.h6
-rw-r--r--src/common/crypto_curve25519.c2
-rw-r--r--src/common/crypto_curve25519.h2
-rw-r--r--src/common/crypto_ed25519.c18
-rw-r--r--src/common/crypto_ed25519.h2
-rw-r--r--src/common/crypto_format.c2
-rw-r--r--src/common/crypto_format.h2
-rw-r--r--src/common/crypto_pwbox.c2
-rw-r--r--src/common/crypto_s2k.c2
-rw-r--r--src/common/crypto_s2k.h2
-rw-r--r--src/common/di_ops.c2
-rw-r--r--src/common/di_ops.h2
-rw-r--r--src/common/handles.h2
-rw-r--r--src/common/include.am16
-rw-r--r--src/common/log.c6
-rw-r--r--src/common/memarea.c93
-rw-r--r--src/common/memarea.h2
-rw-r--r--src/common/procmon.c2
-rw-r--r--src/common/procmon.h2
-rw-r--r--src/common/pubsub.c2
-rw-r--r--src/common/pubsub.h2
-rw-r--r--src/common/sandbox.c5
-rw-r--r--src/common/sandbox.h2
-rw-r--r--src/common/storagedir.c542
-rw-r--r--src/common/storagedir.h51
-rw-r--r--src/common/testsupport.h2
-rw-r--r--src/common/timers.c2
-rw-r--r--src/common/timers.h2
-rw-r--r--src/common/torgzip.c584
-rw-r--r--src/common/torgzip.h72
-rw-r--r--src/common/torint.h2
-rw-r--r--src/common/torlog.h6
-rw-r--r--src/common/tortls.c40
-rw-r--r--src/common/tortls.h48
-rw-r--r--src/common/util.c281
-rw-r--r--src/common/util.h22
-rw-r--r--src/common/util_bug.c2
-rw-r--r--src/common/util_bug.h2
-rw-r--r--src/common/util_format.c108
-rw-r--r--src/common/util_format.h24
-rw-r--r--src/common/util_process.c2
-rw-r--r--src/common/util_process.h2
-rw-r--r--src/common/workqueue.c5
-rw-r--r--src/common/workqueue.h4
-rw-r--r--src/config/geoip16029
-rw-r--r--src/config/geoip62034
-rw-r--r--src/ext/byteorder.h67
-rw-r--r--src/ext/csiphash.c36
-rw-r--r--src/ext/ed25519/donna/ed25519-hash-custom.h31
-rw-r--r--src/ext/ed25519/ref10/crypto_hash_sha512.h30
-rw-r--r--src/ext/ht.h2
-rw-r--r--src/ext/include.am2
-rw-r--r--src/ext/keccak-tiny/keccak-tiny-unrolled.c19
-rw-r--r--src/ext/trunnel/trunnel-impl.h2
-rw-r--r--src/ext/trunnel/trunnel.c4
-rw-r--r--src/ext/trunnel/trunnel.h2
-rw-r--r--src/include.am1
-rw-r--r--src/or/addressmap.c2
-rw-r--r--src/or/addressmap.h2
-rw-r--r--src/or/bridges.c49
-rw-r--r--src/or/bridges.h6
-rw-r--r--src/or/buffers.c57
-rw-r--r--src/or/buffers.h6
-rw-r--r--src/or/channel.c2
-rw-r--r--src/or/channel.h6
-rw-r--r--src/or/channeltls.c6
-rw-r--r--src/or/channeltls.h2
-rw-r--r--src/or/circpathbias.c2
-rw-r--r--src/or/circpathbias.h2
-rw-r--r--src/or/circuitbuild.c129
-rw-r--r--src/or/circuitbuild.h5
-rw-r--r--src/or/circuitlist.c19
-rw-r--r--src/or/circuitlist.h2
-rw-r--r--src/or/circuitmux.c2
-rw-r--r--src/or/circuitmux.h2
-rw-r--r--src/or/circuitmux_ewma.c2
-rw-r--r--src/or/circuitmux_ewma.h2
-rw-r--r--src/or/circuitstats.c2
-rw-r--r--src/or/circuitstats.h2
-rw-r--r--src/or/circuituse.c6
-rw-r--r--src/or/circuituse.h2
-rw-r--r--src/or/command.c12
-rw-r--r--src/or/command.h2
-rw-r--r--src/or/config.c50
-rw-r--r--src/or/config.h2
-rw-r--r--src/or/confparse.c183
-rw-r--r--src/or/confparse.h11
-rw-r--r--src/or/connection.c18
-rw-r--r--src/or/connection.h12
-rw-r--r--src/or/connection_edge.c22
-rw-r--r--src/or/connection_edge.h2
-rw-r--r--src/or/connection_or.c2
-rw-r--r--src/or/connection_or.h2
-rw-r--r--src/or/conscache.c541
-rw-r--r--src/or/conscache.h61
-rw-r--r--src/or/consdiff.c1412
-rw-r--r--src/or/consdiff.h98
-rw-r--r--src/or/consdiffmgr.c1410
-rw-r--r--src/or/consdiffmgr.h54
-rw-r--r--src/or/control.c57
-rw-r--r--src/or/control.h6
-rw-r--r--src/or/cpuworker.c16
-rw-r--r--src/or/cpuworker.h8
-rw-r--r--src/or/dircollate.c2
-rw-r--r--src/or/dircollate.h2
-rw-r--r--src/or/directory.c2500
-rw-r--r--src/or/directory.h78
-rw-r--r--src/or/dirserv.c875
-rw-r--r--src/or/dirserv.h87
-rw-r--r--src/or/dirvote.c2
-rw-r--r--src/or/dirvote.h2
-rw-r--r--src/or/dns.c2
-rw-r--r--src/or/dns.h2
-rw-r--r--src/or/dns_structs.h2
-rw-r--r--src/or/dnsserv.c2
-rw-r--r--src/or/dnsserv.h2
-rw-r--r--src/or/entrynodes.c57
-rw-r--r--src/or/entrynodes.h2
-rw-r--r--src/or/ext_orport.c2
-rw-r--r--src/or/ext_orport.h2
-rw-r--r--src/or/fp_pair.c2
-rw-r--r--src/or/fp_pair.h2
-rw-r--r--src/or/geoip.c2
-rw-r--r--src/or/geoip.h2
-rw-r--r--src/or/hibernate.c2
-rw-r--r--src/or/hibernate.h2
-rw-r--r--src/or/hs_cache.c2
-rw-r--r--src/or/hs_cache.h2
-rw-r--r--src/or/hs_circuitmap.c298
-rw-r--r--src/or/hs_circuitmap.h71
-rw-r--r--src/or/hs_common.c78
-rw-r--r--src/or/hs_common.h49
-rw-r--r--src/or/hs_descriptor.c921
-rw-r--r--src/or/hs_descriptor.h36
-rw-r--r--src/or/hs_intropoint.c101
-rw-r--r--src/or/hs_intropoint.h6
-rw-r--r--src/or/hs_ntor.c626
-rw-r--r--src/or/hs_ntor.h77
-rw-r--r--src/or/hs_service.c56
-rw-r--r--src/or/hs_service.h19
-rw-r--r--src/or/include.am15
-rw-r--r--src/or/keypin.c2
-rw-r--r--src/or/keypin.h2
-rw-r--r--src/or/main.c83
-rw-r--r--src/or/main.h2
-rw-r--r--src/or/microdesc.c14
-rw-r--r--src/or/microdesc.h4
-rw-r--r--src/or/networkstatus.c78
-rw-r--r--src/or/networkstatus.h3
-rw-r--r--src/or/nodelist.c2
-rw-r--r--src/or/nodelist.h2
-rw-r--r--src/or/ntmain.c2
-rw-r--r--src/or/ntmain.h2
-rw-r--r--src/or/onion.c6
-rw-r--r--src/or/onion.h2
-rw-r--r--src/or/onion_fast.c2
-rw-r--r--src/or/onion_fast.h2
-rw-r--r--src/or/onion_ntor.c2
-rw-r--r--src/or/onion_ntor.h2
-rw-r--r--src/or/onion_tap.c4
-rw-r--r--src/or/onion_tap.h2
-rw-r--r--src/or/or.h128
-rw-r--r--src/or/parsecommon.c2
-rw-r--r--src/or/parsecommon.h8
-rw-r--r--src/or/periodic.c2
-rw-r--r--src/or/periodic.h2
-rw-r--r--src/or/policies.c2
-rw-r--r--src/or/policies.h2
-rw-r--r--src/or/protover.c2
-rw-r--r--src/or/protover.h2
-rw-r--r--src/or/reasons.c2
-rw-r--r--src/or/reasons.h2
-rw-r--r--src/or/relay.c37
-rw-r--r--src/or/relay.h2
-rw-r--r--src/or/rendcache.c2
-rw-r--r--src/or/rendcache.h2
-rw-r--r--src/or/rendclient.c24
-rw-r--r--src/or/rendclient.h2
-rw-r--r--src/or/rendcommon.c2
-rw-r--r--src/or/rendcommon.h2
-rw-r--r--src/or/rendmid.c18
-rw-r--r--src/or/rendmid.h2
-rw-r--r--src/or/rendservice.c506
-rw-r--r--src/or/rendservice.h15
-rw-r--r--src/or/rephist.c2
-rw-r--r--src/or/rephist.h2
-rw-r--r--src/or/replaycache.c2
-rw-r--r--src/or/replaycache.h2
-rw-r--r--src/or/router.c114
-rw-r--r--src/or/router.h5
-rw-r--r--src/or/routerkeys.c2
-rw-r--r--src/or/routerkeys.h2
-rw-r--r--src/or/routerlist.c48
-rw-r--r--src/or/routerlist.h5
-rw-r--r--src/or/routerparse.c74
-rw-r--r--src/or/routerparse.h7
-rw-r--r--src/or/routerset.c2
-rw-r--r--src/or/routerset.h2
-rw-r--r--src/or/scheduler.c2
-rw-r--r--src/or/scheduler.h2
-rw-r--r--src/or/shared_random.c10
-rw-r--r--src/or/shared_random.h11
-rw-r--r--src/or/shared_random_state.c2
-rw-r--r--src/or/shared_random_state.h2
-rw-r--r--src/or/statefile.c2
-rw-r--r--src/or/statefile.h2
-rw-r--r--src/or/status.c2
-rw-r--r--src/or/status.h2
-rw-r--r--src/or/tor_main.c2
-rw-r--r--src/or/torcert.c2
-rw-r--r--src/or/torcert.h2
-rw-r--r--src/or/transports.c2
-rw-r--r--src/or/transports.h2
-rw-r--r--src/test/Makefile.nmake2
-rw-r--r--src/test/bench.c25
-rwxr-xr-xsrc/test/bt_test.py2
-rw-r--r--src/test/ed25519_exts_ref.py2
-rw-r--r--src/test/fakechans.h2
-rw-r--r--src/test/fuzz/dict/http2
-rw-r--r--src/test/fuzz/fuzz_consensus.c2
-rw-r--r--src/test/fuzz/fuzz_descriptor.c2
-rw-r--r--src/test/fuzz/fuzz_diff.c69
-rw-r--r--src/test/fuzz/fuzz_diff_apply.c65
-rw-r--r--src/test/fuzz/fuzz_extrainfo.c2
-rw-r--r--src/test/fuzz/fuzz_hsdescv2.c2
-rw-r--r--src/test/fuzz/fuzz_http.c6
-rw-r--r--src/test/fuzz/fuzz_iptsv2.c2
-rw-r--r--src/test/fuzz/fuzz_microdesc.c2
-rw-r--r--src/test/fuzz/fuzz_vrs.c2
-rw-r--r--src/test/fuzz/fuzzing.h2
-rw-r--r--src/test/fuzz/fuzzing_common.c3
-rw-r--r--src/test/fuzz/include.am134
-rwxr-xr-xsrc/test/fuzz_static_testcases.sh2
-rw-r--r--src/test/hs_ntor_ref.py408
-rw-r--r--src/test/include.am44
-rw-r--r--src/test/log_test_helpers.c2
-rw-r--r--src/test/log_test_helpers.h6
-rwxr-xr-xsrc/test/ntor_ref.py2
-rw-r--r--src/test/rend_test_helpers.c2
-rw-r--r--src/test/rend_test_helpers.h2
-rw-r--r--src/test/test-child.c2
-rwxr-xr-xsrc/test/test-network.sh187
-rw-r--r--src/test/test-timers.c2
-rw-r--r--src/test/test.c10
-rw-r--r--src/test/test.h8
-rw-r--r--src/test/test_addr.c2
-rw-r--r--src/test/test_address.c2
-rw-r--r--src/test/test_bt_cl.c2
-rw-r--r--src/test/test_buffers.c178
-rw-r--r--src/test/test_cell_formats.c2
-rw-r--r--src/test/test_cell_queue.c2
-rw-r--r--src/test/test_channel.c2
-rw-r--r--src/test/test_channeltls.c2
-rw-r--r--src/test/test_checkdir.c2
-rw-r--r--src/test/test_circuitbuild.c133
-rw-r--r--src/test/test_circuitlist.c139
-rw-r--r--src/test/test_circuitmux.c2
-rw-r--r--src/test/test_circuituse.c2
-rw-r--r--src/test/test_compat_libevent.c2
-rw-r--r--src/test/test_config.c2
-rw-r--r--src/test/test_connection.c4
-rw-r--r--src/test/test_conscache.c340
-rw-r--r--src/test/test_consdiff.c1184
-rw-r--r--src/test/test_consdiffmgr.c891
-rw-r--r--src/test/test_containers.c2
-rw-r--r--src/test/test_controller.c2
-rw-r--r--src/test/test_controller_events.c2
-rw-r--r--src/test/test_crypto.c76
-rw-r--r--src/test/test_crypto_openssl.c107
-rw-r--r--src/test/test_crypto_slow.c5
-rw-r--r--src/test/test_data.c2
-rw-r--r--src/test/test_dir.c246
-rw-r--r--src/test/test_dir_common.c2
-rw-r--r--src/test/test_dir_common.h2
-rw-r--r--src/test/test_dir_handle_get.c77
-rw-r--r--src/test/test_entryconn.c2
-rw-r--r--src/test/test_entrynodes.c5
-rw-r--r--src/test/test_extorport.c6
-rw-r--r--src/test/test_guardfraction.c2
-rw-r--r--src/test/test_handles.c2
-rw-r--r--src/test/test_helpers.c6
-rw-r--r--src/test/test_helpers.h4
-rw-r--r--src/test/test_hs.c45
-rw-r--r--src/test/test_hs_cache.c8
-rw-r--r--src/test/test_hs_descriptor.c148
-rw-r--r--src/test/test_hs_intropoint.c123
-rwxr-xr-xsrc/test/test_hs_ntor.sh11
-rw-r--r--src/test/test_hs_ntor_cl.c255
-rw-r--r--src/test/test_hs_service.c155
-rw-r--r--src/test/test_introduce.c2
-rw-r--r--src/test/test_keypin.c2
-rw-r--r--src/test/test_link_handshake.c26
-rw-r--r--src/test/test_logging.c2
-rw-r--r--src/test/test_microdesc.c8
-rw-r--r--src/test/test_nodelist.c2
-rw-r--r--src/test/test_ntor_cl.c2
-rw-r--r--src/test/test_oom.c2
-rw-r--r--src/test/test_oos.c2
-rw-r--r--src/test/test_options.c157
-rw-r--r--src/test/test_policy.c2
-rw-r--r--src/test/test_procmon.c2
-rw-r--r--src/test/test_protover.c2
-rw-r--r--src/test/test_pt.c8
-rw-r--r--src/test/test_pubsub.c2
-rw-r--r--src/test/test_relay.c2
-rw-r--r--src/test/test_relaycell.c2
-rw-r--r--src/test/test_rendcache.c3
-rw-r--r--src/test/test_replay.c2
-rw-r--r--src/test/test_routerkeys.c2
-rw-r--r--src/test/test_routerlist.c2
-rw-r--r--src/test/test_scheduler.c2
-rw-r--r--src/test/test_slow.c2
-rw-r--r--src/test/test_socks.c2
-rw-r--r--src/test/test_storagedir.c375
-rw-r--r--src/test/test_switch_id.c2
-rw-r--r--src/test/test_threads.c2
-rw-r--r--src/test/test_tortls.c3
-rw-r--r--src/test/test_util.c359
-rw-r--r--src/test/test_util_format.c70
-rw-r--r--src/test/test_util_process.c2
-rw-r--r--src/test/test_util_slow.c6
-rw-r--r--src/test/test_workqueue.c2
-rw-r--r--src/test/testing_common.c8
-rw-r--r--src/test/testing_rsakeys.c2
-rw-r--r--src/tools/include.am11
-rw-r--r--src/tools/tor-checkkey.c89
-rw-r--r--src/tools/tor-gencert.c2
-rw-r--r--src/tools/tor-resolve.c2
-rw-r--r--src/trace/debug.h25
-rw-r--r--src/trace/events.h45
-rw-r--r--src/trace/include.am22
-rw-r--r--src/trace/trace.c11
-rw-r--r--src/trace/trace.h10
-rw-r--r--src/trunnel/hs/cell_common.c179
-rw-r--r--src/trunnel/hs/cell_common.h207
-rw-r--r--src/trunnel/hs/cell_common.trunnel6
-rw-r--r--src/trunnel/hs/cell_establish_intro.c242
-rw-r--r--src/trunnel/hs/cell_establish_intro.h237
-rw-r--r--src/trunnel/hs/cell_establish_intro.trunnel10
-rw-r--r--src/trunnel/hs/cell_introduce1.c398
-rw-r--r--src/trunnel/hs/cell_introduce1.h416
-rw-r--r--src/trunnel/hs/cell_introduce1.trunnel14
375 files changed, 30237 insertions, 12298 deletions
diff --git a/src/common/Makefile.nmake b/src/common/Makefile.nmake
index b8c5dd4fea..a1c819fffa 100644
--- a/src/common/Makefile.nmake
+++ b/src/common/Makefile.nmake
@@ -7,8 +7,8 @@ LIBOR_OBJECTS = address.obj backtrace.obj compat.obj container.obj di_ops.obj \
log.obj memarea.obj mempool.obj procmon.obj sandbox.obj util.obj \
util_codedigest.obj
-LIBOR_CRYPTO_OBJECTS = aes.obj crypto.obj crypto_format.obj torgzip.obj tortls.obj \
- crypto_curve25519.obj curve25519-donna.obj
+LIBOR_CRYPTO_OBJECTS = aes.obj crypto.obj crypto_format.obj compress.obj compress_zlib.obj \
+ tortls.obj crypto_curve25519.obj curve25519-donna.obj
LIBOR_EVENT_OBJECTS = compat_libevent.obj
diff --git a/src/common/address.c b/src/common/address.c
index 2693239146..c5d0e918ca 100644
--- a/src/common/address.c
+++ b/src/common/address.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -1198,7 +1198,7 @@ tor_addr_hash(const tor_addr_t *addr)
/* LCOV_EXCL_START */
tor_fragile_assert();
return 0;
- /* LCOV_EXCL_END */
+ /* LCOV_EXCL_STOP */
}
}
diff --git a/src/common/address.h b/src/common/address.h
index 0dc6edae37..ce85b3d81d 100644
--- a/src/common/address.h
+++ b/src/common/address.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/aes.c b/src/common/aes.c
index 35c2d1e3a5..73abef143e 100644
--- a/src/common/aes.c
+++ b/src/common/aes.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/aes.h b/src/common/aes.h
index 1cda53f2fa..6fd9c3ea16 100644
--- a/src/common/aes.h
+++ b/src/common/aes.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Implements a minimal interface to counter-mode AES. */
diff --git a/src/common/backtrace.c b/src/common/backtrace.c
index 61096952d8..0f0fa857bf 100644
--- a/src/common/backtrace.c
+++ b/src/common/backtrace.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/backtrace.h b/src/common/backtrace.h
index b53fd2c668..8cd1dcf06c 100644
--- a/src/common/backtrace.h
+++ b/src/common/backtrace.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_BACKTRACE_H
diff --git a/src/common/compat.c b/src/common/compat.c
index 0dbede6bed..390cff7dba 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/compat.h b/src/common/compat.h
index ee1c9454de..68fad9b598 100644
--- a/src/common/compat.h
+++ b/src/common/compat.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_COMPAT_H
diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c
index 4a3b1af922..1146d02168 100644
--- a/src/common/compat_libevent.c
+++ b/src/common/compat_libevent.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2016, The Tor Project, Inc. */
+/* Copyright (c) 2009-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/compat_libevent.h b/src/common/compat_libevent.h
index c2e34764e4..96c48d53a1 100644
--- a/src/common/compat_libevent.h
+++ b/src/common/compat_libevent.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2016, The Tor Project, Inc. */
+/* Copyright (c) 2009-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_COMPAT_LIBEVENT_H
diff --git a/src/common/compat_openssl.h b/src/common/compat_openssl.h
index 1bfe188075..2b94fe5b4e 100644
--- a/src/common/compat_openssl.h
+++ b/src/common/compat_openssl.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_COMPAT_OPENSSL_H
diff --git a/src/common/compat_pthreads.c b/src/common/compat_pthreads.c
index c1ae66c1d2..8e4b833573 100644
--- a/src/common/compat_pthreads.c
+++ b/src/common/compat_pthreads.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/compat_threads.c b/src/common/compat_threads.c
index f4809060d6..c593e9af8d 100644
--- a/src/common/compat_threads.c
+++ b/src/common/compat_threads.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -94,51 +94,73 @@ in_main_thread(void)
}
#if defined(HAVE_EVENTFD) || defined(HAVE_PIPE)
-/* As write(), but retry on EINTR */
+/* As write(), but retry on EINTR, and return the negative error code on
+ * error. */
static int
write_ni(int fd, const void *buf, size_t n)
{
int r;
again:
r = (int) write(fd, buf, n);
- if (r < 0 && errno == EINTR)
- goto again;
+ if (r < 0) {
+ if (errno == EINTR)
+ goto again;
+ else
+ return -errno;
+ }
return r;
}
-/* As read(), but retry on EINTR */
+/* As read(), but retry on EINTR, and return the negative error code on error.
+ */
static int
read_ni(int fd, void *buf, size_t n)
{
int r;
again:
r = (int) read(fd, buf, n);
- if (r < 0 && errno == EINTR)
- goto again;
+ if (r < 0) {
+ if (errno == EINTR)
+ goto again;
+ else
+ return -errno;
+ }
return r;
}
#endif
-/** As send(), but retry on EINTR. */
+/** As send(), but retry on EINTR, and return the negative error code on
+ * error. */
static int
send_ni(int fd, const void *buf, size_t n, int flags)
{
int r;
again:
r = (int) send(fd, buf, n, flags);
- if (r < 0 && ERRNO_IS_EINTR(tor_socket_errno(fd)))
- goto again;
+ if (r < 0) {
+ int error = tor_socket_errno(fd);
+ if (ERRNO_IS_EINTR(error))
+ goto again;
+ else
+ return -error;
+ }
return r;
}
-/** As recv(), but retry on EINTR. */
+/** As recv(), but retry on EINTR, and return the negative error code on
+ * error. */
static int
recv_ni(int fd, void *buf, size_t n, int flags)
{
int r;
again:
r = (int) recv(fd, buf, n, flags);
- if (r < 0 && ERRNO_IS_EINTR(tor_socket_errno(fd)))
- goto again;
+ if (r < 0) {
+ int error = tor_socket_errno(fd);
+ if (ERRNO_IS_EINTR(error))
+ goto again;
+ else
+ return -error;
+ }
return r;
}
@@ -149,7 +171,7 @@ eventfd_alert(int fd)
{
uint64_t u = 1;
int r = write_ni(fd, (void*)&u, sizeof(u));
- if (r < 0 && errno != EAGAIN)
+ if (r < 0 && -r != EAGAIN)
return -1;
return 0;
}
@@ -160,8 +182,8 @@ eventfd_drain(int fd)
{
uint64_t u = 0;
int r = read_ni(fd, (void*)&u, sizeof(u));
- if (r < 0 && errno != EAGAIN)
- return -1;
+ if (r < 0 && -r != EAGAIN)
+ return r;
return 0;
}
#endif
@@ -172,8 +194,8 @@ static int
pipe_alert(int fd)
{
ssize_t r = write_ni(fd, "x", 1);
- if (r < 0 && errno != EAGAIN)
- return -1;
+ if (r < 0 && -r != EAGAIN)
+ return (int)r;
return 0;
}
@@ -188,7 +210,7 @@ pipe_drain(int fd)
r = read_ni(fd, buf, sizeof(buf));
} while (r > 0);
if (r < 0 && errno != EAGAIN)
- return -1;
+ return -errno;
/* A value of r = 0 means EOF on the fd so successfully drained. */
return 0;
}
@@ -200,13 +222,13 @@ static int
sock_alert(tor_socket_t fd)
{
ssize_t r = send_ni(fd, "x", 1, 0);
- if (r < 0 && !ERRNO_IS_EAGAIN(tor_socket_errno(fd)))
- return -1;
+ if (r < 0 && !ERRNO_IS_EAGAIN(-r))
+ return (int)r;
return 0;
}
/** Drain all the input from a socket <b>fd</b>, and ignore it. Return 0 on
- * success, -1 on error. */
+ * success, -errno on error. */
static int
sock_drain(tor_socket_t fd)
{
@@ -215,8 +237,8 @@ sock_drain(tor_socket_t fd)
do {
r = recv_ni(fd, buf, sizeof(buf), 0);
} while (r > 0);
- if (r < 0 && !ERRNO_IS_EAGAIN(tor_socket_errno(fd)))
- return -1;
+ if (r < 0 && !ERRNO_IS_EAGAIN(-r))
+ return (int)r;
/* A value of r = 0 means EOF on the fd so successfully drained. */
return 0;
}
@@ -330,3 +352,49 @@ alert_sockets_close(alert_sockets_t *socks)
socks->read_fd = socks->write_fd = -1;
}
+/*
+ * XXXX We might be smart to move to compiler intrinsics or real atomic
+ * XXXX operations at some point. But not yet.
+ *
+ */
+
+/** Initialize a new atomic counter with the value 0 */
+void
+atomic_counter_init(atomic_counter_t *counter)
+{
+ memset(counter, 0, sizeof(*counter));
+ tor_mutex_init_nonrecursive(&counter->mutex);
+}
+/** Clean up all resources held by an atomic counter. */
+void
+atomic_counter_destroy(atomic_counter_t *counter)
+{
+ tor_mutex_uninit(&counter->mutex);
+ memset(counter, 0, sizeof(*counter));
+}
+/** Add a value to an atomic counter. */
+void
+atomic_counter_add(atomic_counter_t *counter, size_t add)
+{
+ tor_mutex_acquire(&counter->mutex);
+ counter->val += add;
+ tor_mutex_release(&counter->mutex);
+}
+/** Subtract a value from an atomic counter. */
+void
+atomic_counter_sub(atomic_counter_t *counter, size_t sub)
+{
+ // this relies on unsigned overflow, but that's fine.
+ atomic_counter_add(counter, -sub);
+}
+/** Return the current value of an atomic counter */
+size_t
+atomic_counter_get(atomic_counter_t *counter)
+{
+ size_t val;
+ tor_mutex_acquire(&counter->mutex);
+ val = counter->val;
+ tor_mutex_release(&counter->mutex);
+ return val;
+}
+
diff --git a/src/common/compat_threads.h b/src/common/compat_threads.h
index 171a9f93ff..9fa3d0d0b7 100644
--- a/src/common/compat_threads.h
+++ b/src/common/compat_threads.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_COMPAT_THREADS_H
@@ -147,5 +147,19 @@ void *tor_threadlocal_get(tor_threadlocal_t *threadlocal);
*/
void tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value);
+/**
+ * Atomic counter type; holds a size_t value.
+ */
+typedef struct atomic_counter_t {
+ tor_mutex_t mutex;
+ size_t val;
+} atomic_counter_t;
+
+void atomic_counter_init(atomic_counter_t *counter);
+void atomic_counter_destroy(atomic_counter_t *counter);
+void atomic_counter_add(atomic_counter_t *counter, size_t add);
+void atomic_counter_sub(atomic_counter_t *counter, size_t sub);
+size_t atomic_counter_get(atomic_counter_t *counter);
+
#endif
diff --git a/src/common/compat_time.c b/src/common/compat_time.c
index d044bbe1d7..2ccaa36e49 100644
--- a/src/common/compat_time.c
+++ b/src/common/compat_time.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/compat_time.h b/src/common/compat_time.h
index 2262446e57..90194c5ebc 100644
--- a/src/common/compat_time.h
+++ b/src/common/compat_time.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/compat_winthreads.c b/src/common/compat_winthreads.c
index 735be4ad17..915368b94f 100644
--- a/src/common/compat_winthreads.c
+++ b/src/common/compat_winthreads.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/compress.c b/src/common/compress.c
new file mode 100644
index 0000000000..6fe4569868
--- /dev/null
+++ b/src/common/compress.c
@@ -0,0 +1,593 @@
+/* Copyright (c) 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 compress.c
+ * \brief Common compression API.
+ **/
+
+#include "orconfig.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include "torint.h"
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#include "util.h"
+#include "torlog.h"
+#include "compress.h"
+#include "compress_lzma.h"
+#include "compress_none.h"
+#include "compress_zlib.h"
+#include "compress_zstd.h"
+
+/** Total number of bytes allocated for compression state overhead. */
+static atomic_counter_t total_compress_allocation;
+
+/** @{ */
+/* These macros define the maximum allowable compression factor. Anything of
+ * size greater than CHECK_FOR_COMPRESSION_BOMB_AFTER is not allowed to
+ * have an uncompression factor (uncompressed size:compressed size ratio) of
+ * any greater than MAX_UNCOMPRESSION_FACTOR.
+ *
+ * Picking a value for MAX_UNCOMPRESSION_FACTOR is a trade-off: we want it to
+ * be small to limit the attack multiplier, but we also want it to be large
+ * enough so that no legitimate document --even ones we might invent in the
+ * future -- ever compresses by a factor of greater than
+ * MAX_UNCOMPRESSION_FACTOR. Within those parameters, there's a reasonably
+ * large range of possible values. IMO, anything over 8 is probably safe; IMO
+ * anything under 50 is probably sufficient.
+ */
+#define MAX_UNCOMPRESSION_FACTOR 25
+#define CHECK_FOR_COMPRESSION_BOMB_AFTER (1024*64)
+/** @} */
+
+/** Return true if uncompressing an input of size <b>in_size</b> to an input of
+ * size at least <b>size_out</b> looks like a compression bomb. */
+int
+tor_compress_is_compression_bomb(size_t size_in, size_t size_out)
+{
+ if (size_in == 0 || size_out < CHECK_FOR_COMPRESSION_BOMB_AFTER)
+ return 0;
+
+ return (size_out / size_in > MAX_UNCOMPRESSION_FACTOR);
+}
+
+/** Guess the size that <b>in_len</b> will be after compression or
+ * decompression. */
+static size_t
+guess_compress_size(int compress, compress_method_t method,
+ compression_level_t compression_level,
+ size_t in_len)
+{
+ // ignore these for now.
+ (void)compression_level;
+ if (method == NO_METHOD) {
+ /* Guess that we'll need an extra byte, to avoid a needless realloc
+ * for nul-termination */
+ return (in_len < SIZE_MAX) ? in_len + 1 : in_len;
+ }
+
+ /* Always guess a factor of 2. */
+ if (compress) {
+ in_len /= 2;
+ } else {
+ if (in_len < SIZE_T_CEILING/2)
+ in_len *= 2;
+ }
+ return MAX(in_len, 1024);
+}
+
+/** Internal function to implement tor_compress/tor_uncompress, depending on
+ * whether <b>compress</b> is set. All arguments are as for tor_compress or
+ * tor_uncompress. */
+static int
+tor_compress_impl(int compress,
+ char **out, size_t *out_len,
+ const char *in, size_t in_len,
+ compress_method_t method,
+ compression_level_t compression_level,
+ int complete_only,
+ int protocol_warn_level)
+{
+ tor_compress_state_t *stream;
+ int rv;
+
+ stream = tor_compress_new(compress, method, compression_level);
+
+ if (stream == NULL)
+ return -1;
+
+ size_t in_len_orig = in_len;
+ size_t out_remaining, out_alloc;
+ char *outptr;
+
+ out_remaining = out_alloc =
+ guess_compress_size(compress, method, compression_level, in_len);
+ *out = outptr = tor_malloc(out_remaining);
+
+ const int finish = complete_only || compress;
+
+ while (1) {
+ switch (tor_compress_process(stream,
+ &outptr, &out_remaining,
+ &in, &in_len, finish)) {
+ case TOR_COMPRESS_DONE:
+ if (in_len == 0 || compress) {
+ goto done;
+ } else {
+ // More data is present, and we're decompressing. So we may need to
+ // reinitialize the stream if we are handling multiple concatenated
+ // inputs.
+ tor_compress_free(stream);
+ stream = tor_compress_new(compress, method, compression_level);
+ }
+ break;
+ case TOR_COMPRESS_OK:
+ if (compress || complete_only) {
+ goto err;
+ } else {
+ goto done;
+ }
+ break;
+ case TOR_COMPRESS_BUFFER_FULL: {
+ if (!compress && outptr < *out+out_alloc) {
+ // A buffer error in this case means that we have a problem
+ // with our input.
+ log_fn(protocol_warn_level, LD_PROTOCOL,
+ "Possible truncated or corrupt compressed data");
+ goto err;
+ }
+ if (out_alloc >= SIZE_T_CEILING / 2) {
+ log_warn(LD_GENERAL, "While %scompresing data: ran out of space.",
+ compress?"":"un");
+ goto err;
+ }
+ if (!compress &&
+ tor_compress_is_compression_bomb(in_len_orig, out_alloc)) {
+ // This should already have been caught down in the backend logic.
+ // LCOV_EXCL_START
+ tor_assert_nonfatal_unreached();
+ goto err;
+ // LCOV_EXCL_STOP
+ }
+ const size_t offset = outptr - *out;
+ out_alloc *= 2;
+ *out = tor_realloc(*out, out_alloc);
+ outptr = *out + offset;
+ out_remaining = out_alloc - offset;
+ break;
+ }
+ case TOR_COMPRESS_ERROR:
+ log_fn(protocol_warn_level, LD_GENERAL,
+ "Error while %scompresing data: bad input?",
+ compress?"":"un");
+ goto err; // bad data.
+ default:
+ // LCOV_EXCL_START
+ tor_assert_nonfatal_unreached();
+ goto err;
+ // LCOV_EXCL_STOP
+ }
+ }
+ done:
+ *out_len = outptr - *out;
+ if (compress && tor_compress_is_compression_bomb(*out_len, in_len_orig)) {
+ log_warn(LD_BUG, "We compressed something and got an insanely high "
+ "compression factor; other Tors would think this was a "
+ "compression bomb.");
+ goto err;
+ }
+ if (!compress) {
+ // NUL-terminate our output.
+ if (out_alloc == *out_len)
+ *out = tor_realloc(*out, out_alloc + 1);
+ (*out)[*out_len] = '\0';
+ }
+ rv = 0;
+ goto out;
+
+ err:
+ tor_free(*out);
+ *out_len = 0;
+ rv = -1;
+ goto out;
+
+ out:
+ tor_compress_free(stream);
+ return rv;
+}
+
+/** Given <b>in_len</b> bytes at <b>in</b>, compress them into a newly
+ * allocated buffer, using the method described in <b>method</b>. Store the
+ * compressed string in *<b>out</b>, and its length in *<b>out_len</b>.
+ * Return 0 on success, -1 on failure.
+ */
+int
+tor_compress(char **out, size_t *out_len,
+ const char *in, size_t in_len,
+ compress_method_t method)
+{
+ return tor_compress_impl(1, out, out_len, in, in_len, method,
+ BEST_COMPRESSION,
+ 1, LOG_WARN);
+}
+
+/** Given zero or more compressed strings of total length <b>in_len</b> bytes
+ * at <b>in</b>, uncompress them into a newly allocated buffer, using the
+ * method described in <b>method</b>. Store the uncompressed string in
+ * *<b>out</b>, and its length in *<b>out_len</b>. Return 0 on success, -1 on
+ * failure.
+ *
+ * If any bytes are written to <b>out</b>, an extra byte NUL is always
+ * written at the end, but not counted in <b>out_len</b>. This is a
+ * safety feature to ensure that the output can be treated as a
+ * NUL-terminated string -- though of course, callers should check
+ * out_len anyway.
+ *
+ * If <b>complete_only</b> is true, we consider a truncated input as a
+ * failure; otherwise we decompress as much as we can. Warn about truncated
+ * or corrupt inputs at <b>protocol_warn_level</b>.
+ */
+int
+tor_uncompress(char **out, size_t *out_len,
+ const char *in, size_t in_len,
+ compress_method_t method,
+ int complete_only,
+ int protocol_warn_level)
+{
+ return tor_compress_impl(0, out, out_len, in, in_len, method,
+ BEST_COMPRESSION,
+ complete_only, protocol_warn_level);
+}
+
+/** Try to tell whether the <b>in_len</b>-byte string in <b>in</b> is likely
+ * to be compressed or not. If it is, return the likeliest compression method.
+ * Otherwise, return UNKNOWN_METHOD.
+ */
+compress_method_t
+detect_compression_method(const char *in, size_t in_len)
+{
+ if (in_len > 2 && fast_memeq(in, "\x1f\x8b", 2)) {
+ return GZIP_METHOD;
+ } else if (in_len > 2 && (in[0] & 0x0f) == 8 &&
+ (ntohs(get_uint16(in)) % 31) == 0) {
+ return ZLIB_METHOD;
+ } else if (in_len > 2 &&
+ fast_memeq(in, "\x5d\x00\x00", 3)) {
+ return LZMA_METHOD;
+ } else if (in_len > 3 &&
+ fast_memeq(in, "\x28\xb5\x2f\xfd", 4)) {
+ return ZSTD_METHOD;
+ } else {
+ return UNKNOWN_METHOD;
+ }
+}
+
+/** Return 1 if a given <b>method</b> is supported; otherwise 0. */
+int
+tor_compress_supports_method(compress_method_t method)
+{
+ switch (method) {
+ case GZIP_METHOD:
+ case ZLIB_METHOD:
+ return tor_zlib_method_supported();
+ case LZMA_METHOD:
+ return tor_lzma_method_supported();
+ case ZSTD_METHOD:
+ return tor_zstd_method_supported();
+ case NO_METHOD:
+ return 1;
+ case UNKNOWN_METHOD:
+ default:
+ return 0;
+ }
+}
+
+/**
+ * Return a bitmask of the supported compression types, where 1&lt;&lt;m is
+ * set in the bitmask if and only if compression with method <b>m</b> is
+ * supported.
+ */
+unsigned
+tor_compress_get_supported_method_bitmask(void)
+{
+ static unsigned supported = 0;
+ if (supported == 0) {
+ compress_method_t m;
+ for (m = NO_METHOD; m <= UNKNOWN_METHOD; ++m) {
+ if (tor_compress_supports_method(m)) {
+ supported |= (1u << m);
+ }
+ }
+ }
+ return supported;
+}
+
+/** Table of compression method names. These should have an "x-" prefix,
+ * if they are not listed in the IANA content coding registry. */
+static const struct {
+ const char *name;
+ compress_method_t method;
+} compression_method_names[] = {
+ { "gzip", GZIP_METHOD },
+ { "deflate", ZLIB_METHOD },
+ // We call this "x-tor-lzma" rather than "x-lzma", because we impose a
+ // lower maximum memory usage on the decoding side.
+ { "x-tor-lzma", LZMA_METHOD },
+ { "x-zstd" , ZSTD_METHOD },
+ { "identity", NO_METHOD },
+
+ /* Later entries in this table are not canonical; these are recognized but
+ * not emitted. */
+ { "x-gzip", GZIP_METHOD },
+};
+
+/** Return the canonical string representation of the compression method
+ * <b>method</b>, or NULL if the method isn't recognized. */
+const char *
+compression_method_get_name(compress_method_t method)
+{
+ unsigned i;
+ for (i = 0; i < ARRAY_LENGTH(compression_method_names); ++i) {
+ if (method == compression_method_names[i].method)
+ return compression_method_names[i].name;
+ }
+ return NULL;
+}
+
+/** Return the compression method represented by the string <b>name</b>, or
+ * UNKNOWN_METHOD if the string isn't recognized. */
+compress_method_t
+compression_method_get_by_name(const char *name)
+{
+ unsigned i;
+ for (i = 0; i < ARRAY_LENGTH(compression_method_names); ++i) {
+ if (!strcmp(compression_method_names[i].name, name))
+ return compression_method_names[i].method;
+ }
+ return UNKNOWN_METHOD;
+}
+
+/** Return a string representation of the version of the library providing the
+ * compression method given in <b>method</b>. Returns NULL if <b>method</b> is
+ * unknown or unsupported. */
+const char *
+tor_compress_version_str(compress_method_t method)
+{
+ switch (method) {
+ case GZIP_METHOD:
+ case ZLIB_METHOD:
+ return tor_zlib_get_version_str();
+ case LZMA_METHOD:
+ return tor_lzma_get_version_str();
+ case ZSTD_METHOD:
+ return tor_zstd_get_version_str();
+ case NO_METHOD:
+ case UNKNOWN_METHOD:
+ default:
+ return NULL;
+ }
+}
+
+/** Return a string representation of the version of the library, found at
+ * compile time, providing the compression method given in <b>method</b>.
+ * Returns NULL if <b>method</b> is unknown or unsupported. */
+const char *
+tor_compress_header_version_str(compress_method_t method)
+{
+ switch (method) {
+ case GZIP_METHOD:
+ case ZLIB_METHOD:
+ return tor_zlib_get_header_version_str();
+ case LZMA_METHOD:
+ return tor_lzma_get_header_version_str();
+ case ZSTD_METHOD:
+ return tor_zstd_get_header_version_str();
+ case NO_METHOD:
+ case UNKNOWN_METHOD:
+ default:
+ return NULL;
+ }
+}
+
+/** Return the approximate number of bytes allocated for all
+ * supported compression schemas. */
+size_t
+tor_compress_get_total_allocation(void)
+{
+ return atomic_counter_get(&total_compress_allocation) +
+ tor_zlib_get_total_allocation() +
+ tor_lzma_get_total_allocation() +
+ tor_zstd_get_total_allocation();
+}
+
+/** Internal state for an incremental compression/decompression. The body of
+ * this struct is not exposed. */
+struct tor_compress_state_t {
+ compress_method_t method; /**< The compression method. */
+
+ union {
+ tor_zlib_compress_state_t *zlib_state;
+ tor_lzma_compress_state_t *lzma_state;
+ tor_zstd_compress_state_t *zstd_state;
+ } u; /**< Compression backend state. */
+};
+
+/** Construct and return a tor_compress_state_t object using <b>method</b>. If
+ * <b>compress</b>, it's for compression; otherwise it's for decompression. */
+tor_compress_state_t *
+tor_compress_new(int compress, compress_method_t method,
+ compression_level_t compression_level)
+{
+ tor_compress_state_t *state;
+
+ state = tor_malloc_zero(sizeof(tor_compress_state_t));
+ state->method = method;
+
+ switch (method) {
+ case GZIP_METHOD:
+ case ZLIB_METHOD: {
+ tor_zlib_compress_state_t *zlib_state =
+ tor_zlib_compress_new(compress, method, compression_level);
+
+ if (zlib_state == NULL)
+ goto err;
+
+ state->u.zlib_state = zlib_state;
+ break;
+ }
+ case LZMA_METHOD: {
+ tor_lzma_compress_state_t *lzma_state =
+ tor_lzma_compress_new(compress, method, compression_level);
+
+ if (lzma_state == NULL)
+ goto err;
+
+ state->u.lzma_state = lzma_state;
+ break;
+ }
+ case ZSTD_METHOD: {
+ tor_zstd_compress_state_t *zstd_state =
+ tor_zstd_compress_new(compress, method, compression_level);
+
+ if (zstd_state == NULL)
+ goto err;
+
+ state->u.zstd_state = zstd_state;
+ break;
+ }
+ case NO_METHOD: {
+ break;
+ }
+ case UNKNOWN_METHOD:
+ goto err;
+ }
+
+ atomic_counter_add(&total_compress_allocation,
+ sizeof(tor_compress_state_t));
+ return state;
+
+ err:
+ tor_free(state);
+ return NULL;
+}
+
+/** Compress/decompress some bytes using <b>state</b>. Read up to
+ * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes
+ * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true,
+ * we've reached the end of the input.
+ *
+ * Return TOR_COMPRESS_DONE if we've finished the entire
+ * compression/decompression.
+ * Return TOR_COMPRESS_OK if we're processed everything from the input.
+ * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>.
+ * Return TOR_COMPRESS_ERROR if the stream is corrupt.
+ */
+tor_compress_output_t
+tor_compress_process(tor_compress_state_t *state,
+ char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish)
+{
+ tor_assert(state != NULL);
+
+ switch (state->method) {
+ case GZIP_METHOD:
+ case ZLIB_METHOD:
+ return tor_zlib_compress_process(state->u.zlib_state,
+ out, out_len, in, in_len,
+ finish);
+ case LZMA_METHOD:
+ return tor_lzma_compress_process(state->u.lzma_state,
+ out, out_len, in, in_len,
+ finish);
+ case ZSTD_METHOD:
+ return tor_zstd_compress_process(state->u.zstd_state,
+ out, out_len, in, in_len,
+ finish);
+ case NO_METHOD:
+ return tor_cnone_compress_process(out, out_len, in, in_len,
+ finish);
+ case UNKNOWN_METHOD:
+ goto err;
+ }
+
+ err:
+ return TOR_COMPRESS_ERROR;
+}
+
+/** Deallocate <b>state</b>. */
+void
+tor_compress_free(tor_compress_state_t *state)
+{
+ if (state == NULL)
+ return;
+
+ switch (state->method) {
+ case GZIP_METHOD:
+ case ZLIB_METHOD:
+ tor_zlib_compress_free(state->u.zlib_state);
+ break;
+ case LZMA_METHOD:
+ tor_lzma_compress_free(state->u.lzma_state);
+ break;
+ case ZSTD_METHOD:
+ tor_zstd_compress_free(state->u.zstd_state);
+ break;
+ case NO_METHOD:
+ break;
+ case UNKNOWN_METHOD:
+ break;
+ }
+
+ atomic_counter_sub(&total_compress_allocation,
+ sizeof(tor_compress_state_t));
+ tor_free(state);
+}
+
+/** Return the approximate number of bytes allocated for <b>state</b>. */
+size_t
+tor_compress_state_size(const tor_compress_state_t *state)
+{
+ tor_assert(state != NULL);
+
+ size_t size = sizeof(tor_compress_state_t);
+
+ switch (state->method) {
+ case GZIP_METHOD:
+ case ZLIB_METHOD:
+ size += tor_zlib_compress_state_size(state->u.zlib_state);
+ break;
+ case LZMA_METHOD:
+ size += tor_lzma_compress_state_size(state->u.lzma_state);
+ break;
+ case ZSTD_METHOD:
+ size += tor_zstd_compress_state_size(state->u.zstd_state);
+ break;
+ case NO_METHOD:
+ case UNKNOWN_METHOD:
+ break;
+ }
+
+ return size;
+}
+
+/** Initialize all compression modules. */
+void
+tor_compress_init(void)
+{
+ atomic_counter_init(&total_compress_allocation);
+
+ tor_zlib_init();
+ tor_lzma_init();
+ tor_zstd_init();
+}
+
diff --git a/src/common/compress.h b/src/common/compress.h
new file mode 100644
index 0000000000..5b47c5d458
--- /dev/null
+++ b/src/common/compress.h
@@ -0,0 +1,88 @@
+/* Copyright (c) 2003, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file compress.h
+ * \brief Headers for compress.c
+ **/
+
+#ifndef TOR_COMPRESS_H
+#define TOR_COMPRESS_H
+
+/** Enumeration of what kind of compression to use. Only ZLIB_METHOD and
+ * GZIP_METHOD is guaranteed to be supported by the compress/uncompress
+ * functions here. Call tor_compress_supports_method() to check if a given
+ * compression schema is supported by Tor. */
+typedef enum {
+ NO_METHOD=0, // This method must be first.
+ GZIP_METHOD=1,
+ ZLIB_METHOD=2,
+ LZMA_METHOD=3,
+ ZSTD_METHOD=4,
+ UNKNOWN_METHOD=5, // This method must be last. Add new ones in the middle.
+} compress_method_t;
+
+/**
+ * Enumeration to define tradeoffs between memory usage and compression level.
+ * BEST_COMPRESSION saves the most bandwidth; LOW_COMPRESSION saves the most
+ * memory.
+ **/
+typedef enum {
+ BEST_COMPRESSION, HIGH_COMPRESSION, MEDIUM_COMPRESSION, LOW_COMPRESSION
+} compression_level_t;
+
+int tor_compress(char **out, size_t *out_len,
+ const char *in, size_t in_len,
+ compress_method_t method);
+
+int tor_uncompress(char **out, size_t *out_len,
+ const char *in, size_t in_len,
+ compress_method_t method,
+ int complete_only,
+ int protocol_warn_level);
+
+compress_method_t detect_compression_method(const char *in, size_t in_len);
+
+int tor_compress_is_compression_bomb(size_t size_in, size_t size_out);
+
+int tor_compress_supports_method(compress_method_t method);
+unsigned tor_compress_get_supported_method_bitmask(void);
+const char * compression_method_get_name(compress_method_t method);
+compress_method_t compression_method_get_by_name(const char *name);
+
+const char *tor_compress_version_str(compress_method_t method);
+
+const char *tor_compress_header_version_str(compress_method_t method);
+
+size_t tor_compress_get_total_allocation(void);
+
+/** Return values from tor_compress_process; see that function's documentation
+ * for details. */
+typedef enum {
+ TOR_COMPRESS_OK,
+ TOR_COMPRESS_DONE,
+ TOR_COMPRESS_BUFFER_FULL,
+ TOR_COMPRESS_ERROR
+} tor_compress_output_t;
+
+/** Internal state for an incremental compression/decompression. */
+typedef struct tor_compress_state_t tor_compress_state_t;
+
+tor_compress_state_t *tor_compress_new(int compress,
+ compress_method_t method,
+ compression_level_t level);
+
+tor_compress_output_t tor_compress_process(tor_compress_state_t *state,
+ char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish);
+void tor_compress_free(tor_compress_state_t *state);
+
+size_t tor_compress_state_size(const tor_compress_state_t *state);
+
+void tor_compress_init(void);
+
+#endif // TOR_COMPRESS_H.
+
diff --git a/src/common/compress_lzma.c b/src/common/compress_lzma.c
new file mode 100644
index 0000000000..b5393a6ba6
--- /dev/null
+++ b/src/common/compress_lzma.c
@@ -0,0 +1,351 @@
+/* Copyright (c) 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 compress_lzma.c
+ * \brief Compression backend for LZMA.
+ *
+ * This module should never be invoked directly. Use the compress module
+ * instead.
+ **/
+
+#include "orconfig.h"
+
+#include "util.h"
+#include "torlog.h"
+#include "compress.h"
+#include "compress_lzma.h"
+
+#ifdef HAVE_LZMA
+#include <lzma.h>
+#endif
+
+/** The maximum amount of memory we allow the LZMA decoder to use, in bytes. */
+#define MEMORY_LIMIT (16 * 1024 * 1024)
+
+/** Total number of bytes allocated for LZMA state. */
+static atomic_counter_t total_lzma_allocation;
+
+#ifdef HAVE_LZMA
+/** Given <b>level</b> return the memory level. */
+static int
+memory_level(compression_level_t level)
+{
+ switch (level) {
+ default:
+ case BEST_COMPRESSION:
+ case HIGH_COMPRESSION: return 6;
+ case MEDIUM_COMPRESSION: return 4;
+ case LOW_COMPRESSION: return 2;
+ }
+}
+
+/** Convert a given <b>error</b> to a human readable error string. */
+static const char *
+lzma_error_str(lzma_ret error)
+{
+ switch (error) {
+ case LZMA_OK:
+ return "Operation completed successfully";
+ case LZMA_STREAM_END:
+ return "End of stream";
+ case LZMA_NO_CHECK:
+ return "Input stream lacks integrity check";
+ case LZMA_UNSUPPORTED_CHECK:
+ return "Unable to calculate integrity check";
+ case LZMA_GET_CHECK:
+ return "Integrity check available";
+ case LZMA_MEM_ERROR:
+ return "Unable to allocate memory";
+ case LZMA_MEMLIMIT_ERROR:
+ return "Memory limit reached";
+ case LZMA_FORMAT_ERROR:
+ return "Unknown file format";
+ case LZMA_OPTIONS_ERROR:
+ return "Unsupported options";
+ case LZMA_DATA_ERROR:
+ return "Corrupt input data";
+ case LZMA_BUF_ERROR:
+ return "Unable to progress";
+ case LZMA_PROG_ERROR:
+ return "Programming error";
+ default:
+ return "Unknown LZMA error";
+ }
+}
+#endif // HAVE_LZMA.
+
+/** Return 1 if LZMA compression is supported; otherwise 0. */
+int
+tor_lzma_method_supported(void)
+{
+#ifdef HAVE_LZMA
+ return 1;
+#else
+ return 0;
+#endif
+}
+
+/** Return a string representation of the version of the currently running
+ * version of liblzma. Returns NULL if LZMA is unsupported. */
+const char *
+tor_lzma_get_version_str(void)
+{
+#ifdef HAVE_LZMA
+ return lzma_version_string();
+#else
+ return NULL;
+#endif
+}
+
+/** Return a string representation of the version of liblzma used at
+ * compilation time. Returns NULL if LZMA is unsupported. */
+const char *
+tor_lzma_get_header_version_str(void)
+{
+#ifdef HAVE_LZMA
+ return LZMA_VERSION_STRING;
+#else
+ return NULL;
+#endif
+}
+
+/** Internal LZMA state for incremental compression/decompression.
+ * The body of this struct is not exposed. */
+struct tor_lzma_compress_state_t {
+#ifdef HAVE_LZMA
+ lzma_stream stream; /**< The LZMA stream. */
+#endif
+
+ int compress; /**< True if we are compressing; false if we are inflating */
+
+ /** Number of bytes read so far. Used to detect compression bombs. */
+ size_t input_so_far;
+ /** Number of bytes written so far. Used to detect compression bombs. */
+ size_t output_so_far;
+
+ /** Approximate number of bytes allocated for this object. */
+ size_t allocation;
+};
+
+#ifdef HAVE_LZMA
+/** Return an approximate number of bytes stored in memory to hold the LZMA
+ * encoder/decoder state. */
+static size_t
+tor_lzma_state_size_precalc(int compress, compression_level_t level)
+{
+ uint64_t memory_usage;
+
+ if (compress)
+ memory_usage = lzma_easy_encoder_memusage(memory_level(level));
+ else
+ memory_usage = lzma_easy_decoder_memusage(memory_level(level));
+
+ if (memory_usage == UINT64_MAX) {
+ log_warn(LD_GENERAL, "Unsupported compression level passed to LZMA %s",
+ compress ? "encoder" : "decoder");
+ goto err;
+ }
+
+ if (memory_usage + sizeof(tor_lzma_compress_state_t) > SIZE_MAX)
+ memory_usage = SIZE_MAX;
+ else
+ memory_usage += sizeof(tor_lzma_compress_state_t);
+
+ return (size_t)memory_usage;
+
+ err:
+ return 0;
+}
+#endif // HAVE_LZMA.
+
+/** Construct and return a tor_lzma_compress_state_t object using
+ * <b>method</b>. If <b>compress</b>, it's for compression; otherwise it's for
+ * decompression. */
+tor_lzma_compress_state_t *
+tor_lzma_compress_new(int compress,
+ compress_method_t method,
+ compression_level_t level)
+{
+ tor_assert(method == LZMA_METHOD);
+
+#ifdef HAVE_LZMA
+ tor_lzma_compress_state_t *result;
+ lzma_ret retval;
+ lzma_options_lzma stream_options;
+
+ // Note that we do not explicitly initialize the lzma_stream object here,
+ // since the LZMA_STREAM_INIT "just" initializes all members to 0, which is
+ // also what `tor_malloc_zero()` does.
+ result = tor_malloc_zero(sizeof(tor_lzma_compress_state_t));
+ result->compress = compress;
+ result->allocation = tor_lzma_state_size_precalc(compress, level);
+
+ if (compress) {
+ lzma_lzma_preset(&stream_options, memory_level(level));
+
+ retval = lzma_alone_encoder(&result->stream, &stream_options);
+
+ if (retval != LZMA_OK) {
+ log_warn(LD_GENERAL, "Error from LZMA encoder: %s (%u).",
+ lzma_error_str(retval), retval);
+ goto err;
+ }
+ } else {
+ retval = lzma_alone_decoder(&result->stream, MEMORY_LIMIT);
+
+ if (retval != LZMA_OK) {
+ log_warn(LD_GENERAL, "Error from LZMA decoder: %s (%u).",
+ lzma_error_str(retval), retval);
+ goto err;
+ }
+ }
+
+ atomic_counter_add(&total_lzma_allocation, result->allocation);
+ return result;
+
+ err:
+ tor_free(result);
+ return NULL;
+#else // HAVE_LZMA.
+ (void)compress;
+ (void)method;
+ (void)level;
+
+ return NULL;
+#endif // HAVE_LZMA.
+}
+
+/** Compress/decompress some bytes using <b>state</b>. Read up to
+ * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes
+ * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true,
+ * we've reached the end of the input.
+ *
+ * Return TOR_COMPRESS_DONE if we've finished the entire
+ * compression/decompression.
+ * Return TOR_COMPRESS_OK if we're processed everything from the input.
+ * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>.
+ * Return TOR_COMPRESS_ERROR if the stream is corrupt.
+ */
+tor_compress_output_t
+tor_lzma_compress_process(tor_lzma_compress_state_t *state,
+ char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish)
+{
+#ifdef HAVE_LZMA
+ lzma_ret retval;
+ lzma_action action;
+
+ tor_assert(state != NULL);
+ tor_assert(*in_len <= UINT_MAX);
+ tor_assert(*out_len <= UINT_MAX);
+
+ state->stream.next_in = (unsigned char *)*in;
+ state->stream.avail_in = *in_len;
+ state->stream.next_out = (unsigned char *)*out;
+ state->stream.avail_out = *out_len;
+
+ action = finish ? LZMA_FINISH : LZMA_RUN;
+
+ retval = lzma_code(&state->stream, action);
+
+ state->input_so_far += state->stream.next_in - ((unsigned char *)*in);
+ state->output_so_far += state->stream.next_out - ((unsigned char *)*out);
+
+ *out = (char *)state->stream.next_out;
+ *out_len = state->stream.avail_out;
+ *in = (const char *)state->stream.next_in;
+ *in_len = state->stream.avail_in;
+
+ if (! state->compress &&
+ tor_compress_is_compression_bomb(state->input_so_far,
+ state->output_so_far)) {
+ log_warn(LD_DIR, "Possible compression bomb; abandoning stream.");
+ return TOR_COMPRESS_ERROR;
+ }
+
+ switch (retval) {
+ case LZMA_OK:
+ if (state->stream.avail_out == 0 || finish)
+ return TOR_COMPRESS_BUFFER_FULL;
+
+ return TOR_COMPRESS_OK;
+
+ case LZMA_BUF_ERROR:
+ if (state->stream.avail_in == 0 && !finish)
+ return TOR_COMPRESS_OK;
+
+ return TOR_COMPRESS_BUFFER_FULL;
+
+ case LZMA_STREAM_END:
+ return TOR_COMPRESS_DONE;
+
+ // We list all the possible values of `lzma_ret` here to silence the
+ // `switch-enum` warning and to detect if a new member was added.
+ case LZMA_NO_CHECK:
+ case LZMA_UNSUPPORTED_CHECK:
+ case LZMA_GET_CHECK:
+ case LZMA_MEM_ERROR:
+ case LZMA_MEMLIMIT_ERROR:
+ case LZMA_FORMAT_ERROR:
+ case LZMA_OPTIONS_ERROR:
+ case LZMA_DATA_ERROR:
+ case LZMA_PROG_ERROR:
+ default:
+ log_warn(LD_GENERAL, "LZMA %s didn't finish: %s.",
+ state->compress ? "compression" : "decompression",
+ lzma_error_str(retval));
+ return TOR_COMPRESS_ERROR;
+ }
+#else // HAVE_LZMA.
+ (void)state;
+ (void)out;
+ (void)out_len;
+ (void)in;
+ (void)in_len;
+ (void)finish;
+ return TOR_COMPRESS_ERROR;
+#endif // HAVE_LZMA.
+}
+
+/** Deallocate <b>state</b>. */
+void
+tor_lzma_compress_free(tor_lzma_compress_state_t *state)
+{
+ if (state == NULL)
+ return;
+
+ atomic_counter_sub(&total_lzma_allocation, state->allocation);
+
+#ifdef HAVE_LZMA
+ lzma_end(&state->stream);
+#endif
+
+ tor_free(state);
+}
+
+/** Return the approximate number of bytes allocated for <b>state</b>. */
+size_t
+tor_lzma_compress_state_size(const tor_lzma_compress_state_t *state)
+{
+ tor_assert(state != NULL);
+ return state->allocation;
+}
+
+/** Return the approximate number of bytes allocated for all LZMA states. */
+size_t
+tor_lzma_get_total_allocation(void)
+{
+ return atomic_counter_get(&total_lzma_allocation);
+}
+
+/** Initialize the lzma module */
+void
+tor_lzma_init(void)
+{
+ atomic_counter_init(&total_lzma_allocation);
+}
+
diff --git a/src/common/compress_lzma.h b/src/common/compress_lzma.h
new file mode 100644
index 0000000000..1433c89f88
--- /dev/null
+++ b/src/common/compress_lzma.h
@@ -0,0 +1,43 @@
+/* Copyright (c) 2003, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file compress_lzma.h
+ * \brief Header for compress_lzma.c
+ **/
+
+#ifndef TOR_COMPRESS_LZMA_H
+#define TOR_COMPRESS_LZMA_H
+
+int tor_lzma_method_supported(void);
+
+const char *tor_lzma_get_version_str(void);
+
+const char *tor_lzma_get_header_version_str(void);
+
+/** Internal state for an incremental LZMA compression/decompression. */
+typedef struct tor_lzma_compress_state_t tor_lzma_compress_state_t;
+
+tor_lzma_compress_state_t *
+tor_lzma_compress_new(int compress,
+ compress_method_t method,
+ compression_level_t compression_level);
+
+tor_compress_output_t
+tor_lzma_compress_process(tor_lzma_compress_state_t *state,
+ char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish);
+
+void tor_lzma_compress_free(tor_lzma_compress_state_t *state);
+
+size_t tor_lzma_compress_state_size(const tor_lzma_compress_state_t *state);
+
+size_t tor_lzma_get_total_allocation(void);
+
+void tor_lzma_init(void);
+
+#endif // TOR_COMPRESS_LZMA_H.
+
diff --git a/src/common/compress_none.c b/src/common/compress_none.c
new file mode 100644
index 0000000000..b76e6010ec
--- /dev/null
+++ b/src/common/compress_none.c
@@ -0,0 +1,53 @@
+/* Copyright (c) 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 compress_lzma.c
+ * \brief Compression backend for identity compression.
+ *
+ * We actually define this backend so that we can treat the identity transform
+ * as another case of compression.
+ *
+ * This module should never be invoked directly. Use the compress module
+ * instead.
+ **/
+
+#include "orconfig.h"
+
+#include "util.h"
+#include "torlog.h"
+#include "compress.h"
+#include "compress_none.h"
+
+/** Transfer some bytes using the identity transformation. Read up to
+ * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes
+ * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true,
+ * we've reached the end of the input.
+ *
+ * Return TOR_COMPRESS_DONE if we've finished the entire
+ * compression/decompression.
+ * Return TOR_COMPRESS_OK if we're processed everything from the input.
+ * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>.
+ * Return TOR_COMPRESS_ERROR if the stream is corrupt.
+ */
+tor_compress_output_t
+tor_cnone_compress_process(char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish)
+{
+ size_t n_to_copy = MIN(*in_len, *out_len);
+
+ memcpy(*out, *in, n_to_copy);
+ *out += n_to_copy;
+ *in += n_to_copy;
+ *out_len -= n_to_copy;
+ *in_len -= n_to_copy;
+ if (*in_len == 0) {
+ return finish ? TOR_COMPRESS_DONE : TOR_COMPRESS_OK;
+ } else {
+ return TOR_COMPRESS_BUFFER_FULL;
+ }
+}
+
diff --git a/src/common/compress_none.h b/src/common/compress_none.h
new file mode 100644
index 0000000000..d1ebb4b625
--- /dev/null
+++ b/src/common/compress_none.h
@@ -0,0 +1,20 @@
+/* Copyright (c) 2003, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file compress_none.h
+ * \brief Header for compress_none.c
+ **/
+
+#ifndef TOR_COMPRESS_NONE_H
+#define TOR_COMPRESS_NONE_H
+
+tor_compress_output_t
+tor_cnone_compress_process(char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish);
+
+#endif // TOR_COMPRESS_NONE_H.
+
diff --git a/src/common/compress_zlib.c b/src/common/compress_zlib.c
new file mode 100644
index 0000000000..284542e885
--- /dev/null
+++ b/src/common/compress_zlib.c
@@ -0,0 +1,304 @@
+/* Copyright (c) 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 compress_zlib.c
+ * \brief Compression backend for gzip and zlib.
+ *
+ * This module should never be invoked directly. Use the compress module
+ * instead.
+ **/
+
+#include "orconfig.h"
+
+#include "util.h"
+#include "torlog.h"
+#include "compress.h"
+#include "compress_zlib.h"
+
+/* zlib 1.2.4 and 1.2.5 do some "clever" things with macros. Instead of
+ saying "(defined(FOO) ? FOO : 0)" they like to say "FOO-0", on the theory
+ that nobody will care if the compile outputs a no-such-identifier warning.
+
+ Sorry, but we like -Werror over here, so I guess we need to define these.
+ I hope that zlib 1.2.6 doesn't break these too.
+*/
+#ifndef _LARGEFILE64_SOURCE
+#define _LARGEFILE64_SOURCE 0
+#endif
+#ifndef _LFS64_LARGEFILE
+#define _LFS64_LARGEFILE 0
+#endif
+#ifndef _FILE_OFFSET_BITS
+#define _FILE_OFFSET_BITS 0
+#endif
+#ifndef off64_t
+#define off64_t int64_t
+#endif
+
+#include <zlib.h>
+
+#if defined ZLIB_VERNUM && ZLIB_VERNUM < 0x1200
+#error "We require zlib version 1.2 or later."
+#endif
+
+static size_t tor_zlib_state_size_precalc(int inflate,
+ int windowbits, int memlevel);
+
+/** Total number of bytes allocated for zlib state */
+static atomic_counter_t total_zlib_allocation;
+
+/** Given <b>level</b> return the memory level. */
+static int
+memory_level(compression_level_t level)
+{
+ switch (level) {
+ default:
+ case BEST_COMPRESSION: return 9;
+ case HIGH_COMPRESSION: return 8;
+ case MEDIUM_COMPRESSION: return 7;
+ case LOW_COMPRESSION: return 6;
+ }
+}
+
+/** Return the 'bits' value to tell zlib to use <b>method</b>.*/
+static inline int
+method_bits(compress_method_t method, compression_level_t level)
+{
+ /* Bits+16 means "use gzip" in zlib >= 1.2 */
+ const int flag = method == GZIP_METHOD ? 16 : 0;
+ switch (level) {
+ default:
+ case BEST_COMPRESSION:
+ case HIGH_COMPRESSION: return flag + 15;
+ case MEDIUM_COMPRESSION: return flag + 13;
+ case LOW_COMPRESSION: return flag + 11;
+ }
+}
+
+/** Return 1 if zlib/gzip compression is supported; otherwise 0. */
+int
+tor_zlib_method_supported(void)
+{
+ /* We currently always support zlib/gzip, but we keep this function around in
+ * case we some day decide to deprecate zlib/gzip support.
+ */
+ return 1;
+}
+
+/** Return a string representation of the version of the currently running
+ * version of zlib. */
+const char *
+tor_zlib_get_version_str(void)
+{
+ return zlibVersion();
+}
+
+/** Return a string representation of the version of the version of zlib
+* used at compilation. */
+const char *
+tor_zlib_get_header_version_str(void)
+{
+ return ZLIB_VERSION;
+}
+
+/** Internal zlib state for an incremental compression/decompression.
+ * The body of this struct is not exposed. */
+struct tor_zlib_compress_state_t {
+ struct z_stream_s stream; /**< The zlib stream */
+ int compress; /**< True if we are compressing; false if we are inflating */
+
+ /** Number of bytes read so far. Used to detect zlib bombs. */
+ size_t input_so_far;
+ /** Number of bytes written so far. Used to detect zlib bombs. */
+ size_t output_so_far;
+
+ /** Approximate number of bytes allocated for this object. */
+ size_t allocation;
+};
+
+/** Return an approximate number of bytes used in RAM to hold a state with
+ * window bits <b>windowBits</b> and compression level 'memlevel' */
+static size_t
+tor_zlib_state_size_precalc(int inflate_, int windowbits, int memlevel)
+{
+ windowbits &= 15;
+
+#define A_FEW_KILOBYTES 2048
+
+ if (inflate_) {
+ /* From zconf.h:
+
+ "The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects."
+ */
+ return sizeof(tor_zlib_compress_state_t) + sizeof(struct z_stream_s) +
+ (1 << 15) + A_FEW_KILOBYTES;
+ } else {
+ /* Also from zconf.h:
+
+ "The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ ... plus a few kilobytes for small objects."
+ */
+ return sizeof(tor_zlib_compress_state_t) + sizeof(struct z_stream_s) +
+ (1 << (windowbits + 2)) + (1 << (memlevel + 9)) + A_FEW_KILOBYTES;
+ }
+#undef A_FEW_KILOBYTES
+}
+
+/** Construct and return a tor_zlib_compress_state_t object using
+ * <b>method</b>. If <b>compress</b>, it's for compression; otherwise it's for
+ * decompression. */
+tor_zlib_compress_state_t *
+tor_zlib_compress_new(int compress_,
+ compress_method_t method,
+ compression_level_t compression_level)
+{
+ tor_zlib_compress_state_t *out;
+ int bits, memlevel;
+
+ if (! compress_) {
+ /* use this setting for decompression, since we might have the
+ * max number of window bits */
+ compression_level = BEST_COMPRESSION;
+ }
+
+ out = tor_malloc_zero(sizeof(tor_zlib_compress_state_t));
+ out->stream.zalloc = Z_NULL;
+ out->stream.zfree = Z_NULL;
+ out->stream.opaque = NULL;
+ out->compress = compress_;
+ bits = method_bits(method, compression_level);
+ memlevel = memory_level(compression_level);
+ if (compress_) {
+ if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED,
+ bits, memlevel,
+ Z_DEFAULT_STRATEGY) != Z_OK)
+ goto err; // LCOV_EXCL_LINE
+ } else {
+ if (inflateInit2(&out->stream, bits) != Z_OK)
+ goto err; // LCOV_EXCL_LINE
+ }
+ out->allocation = tor_zlib_state_size_precalc(!compress_, bits, memlevel);
+
+ atomic_counter_add(&total_zlib_allocation, out->allocation);
+
+ return out;
+
+ err:
+ tor_free(out);
+ return NULL;
+}
+
+/** Compress/decompress some bytes using <b>state</b>. Read up to
+ * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes
+ * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true,
+ * we've reached the end of the input.
+ *
+ * Return TOR_COMPRESS_DONE if we've finished the entire
+ * compression/decompression.
+ * Return TOR_COMPRESS_OK if we're processed everything from the input.
+ * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>.
+ * Return TOR_COMPRESS_ERROR if the stream is corrupt.
+ */
+tor_compress_output_t
+tor_zlib_compress_process(tor_zlib_compress_state_t *state,
+ char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish)
+{
+ int err;
+ tor_assert(state != NULL);
+ if (*in_len > UINT_MAX ||
+ *out_len > UINT_MAX) {
+ return TOR_COMPRESS_ERROR;
+ }
+
+ state->stream.next_in = (unsigned char*) *in;
+ state->stream.avail_in = (unsigned int)*in_len;
+ state->stream.next_out = (unsigned char*) *out;
+ state->stream.avail_out = (unsigned int)*out_len;
+
+ if (state->compress) {
+ err = deflate(&state->stream, finish ? Z_FINISH : Z_NO_FLUSH);
+ } else {
+ err = inflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH);
+ }
+
+ state->input_so_far += state->stream.next_in - ((unsigned char*)*in);
+ state->output_so_far += state->stream.next_out - ((unsigned char*)*out);
+
+ *out = (char*) state->stream.next_out;
+ *out_len = state->stream.avail_out;
+ *in = (const char *) state->stream.next_in;
+ *in_len = state->stream.avail_in;
+
+ if (! state->compress &&
+ tor_compress_is_compression_bomb(state->input_so_far,
+ state->output_so_far)) {
+ log_warn(LD_DIR, "Possible zlib bomb; abandoning stream.");
+ return TOR_COMPRESS_ERROR;
+ }
+
+ switch (err)
+ {
+ case Z_STREAM_END:
+ return TOR_COMPRESS_DONE;
+ case Z_BUF_ERROR:
+ if (state->stream.avail_in == 0 && !finish)
+ return TOR_COMPRESS_OK;
+ return TOR_COMPRESS_BUFFER_FULL;
+ case Z_OK:
+ if (state->stream.avail_out == 0 || finish)
+ return TOR_COMPRESS_BUFFER_FULL;
+ return TOR_COMPRESS_OK;
+ default:
+ log_warn(LD_GENERAL, "Gzip returned an error: %s",
+ state->stream.msg ? state->stream.msg : "<no message>");
+ return TOR_COMPRESS_ERROR;
+ }
+}
+
+/** Deallocate <b>state</b>. */
+void
+tor_zlib_compress_free(tor_zlib_compress_state_t *state)
+{
+ if (state == NULL)
+ return;
+
+ atomic_counter_sub(&total_zlib_allocation, state->allocation);
+
+ if (state->compress)
+ deflateEnd(&state->stream);
+ else
+ inflateEnd(&state->stream);
+
+ tor_free(state);
+}
+
+/** Return the approximate number of bytes allocated for <b>state</b>. */
+size_t
+tor_zlib_compress_state_size(const tor_zlib_compress_state_t *state)
+{
+ tor_assert(state != NULL);
+ return state->allocation;
+}
+
+/** Return the approximate number of bytes allocated for all zlib states. */
+size_t
+tor_zlib_get_total_allocation(void)
+{
+ return atomic_counter_get(&total_zlib_allocation);
+}
+
+/** Set up global state for the zlib module */
+void
+tor_zlib_init(void)
+{
+ atomic_counter_init(&total_zlib_allocation);
+}
+
diff --git a/src/common/compress_zlib.h b/src/common/compress_zlib.h
new file mode 100644
index 0000000000..df5c196ac7
--- /dev/null
+++ b/src/common/compress_zlib.h
@@ -0,0 +1,43 @@
+/* Copyright (c) 2003, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file compress_zlib.h
+ * \brief Header for compress_zlib.c
+ **/
+
+#ifndef TOR_COMPRESS_ZLIB_H
+#define TOR_COMPRESS_ZLIB_H
+
+int tor_zlib_method_supported(void);
+
+const char *tor_zlib_get_version_str(void);
+
+const char *tor_zlib_get_header_version_str(void);
+
+/** Internal state for an incremental zlib/gzip compression/decompression. */
+typedef struct tor_zlib_compress_state_t tor_zlib_compress_state_t;
+
+tor_zlib_compress_state_t *
+tor_zlib_compress_new(int compress,
+ compress_method_t method,
+ compression_level_t compression_level);
+
+tor_compress_output_t
+tor_zlib_compress_process(tor_zlib_compress_state_t *state,
+ char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish);
+
+void tor_zlib_compress_free(tor_zlib_compress_state_t *state);
+
+size_t tor_zlib_compress_state_size(const tor_zlib_compress_state_t *state);
+
+size_t tor_zlib_get_total_allocation(void);
+
+void tor_zlib_init(void);
+
+#endif // TOR_COMPRESS_ZLIB_H.
+
diff --git a/src/common/compress_zstd.c b/src/common/compress_zstd.c
new file mode 100644
index 0000000000..99d05c37bd
--- /dev/null
+++ b/src/common/compress_zstd.c
@@ -0,0 +1,401 @@
+/* Copyright (c) 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 compress_zstd.c
+ * \brief Compression backend for Zstandard.
+ *
+ * This module should never be invoked directly. Use the compress module
+ * instead.
+ **/
+
+#include "orconfig.h"
+
+#include "util.h"
+#include "torlog.h"
+#include "compress.h"
+#include "compress_zstd.h"
+
+#ifdef HAVE_ZSTD
+#include <zstd.h>
+#endif
+
+/** Total number of bytes allocated for Zstandard state. */
+static atomic_counter_t total_zstd_allocation;
+
+#ifdef HAVE_ZSTD
+/** Given <b>level</b> return the memory level. */
+static int
+memory_level(compression_level_t level)
+{
+ switch (level) {
+ default:
+ case BEST_COMPRESSION:
+ case HIGH_COMPRESSION: return 9;
+ case MEDIUM_COMPRESSION: return 8;
+ case LOW_COMPRESSION: return 7;
+ }
+}
+#endif // HAVE_ZSTD.
+
+/** Return 1 if Zstandard compression is supported; otherwise 0. */
+int
+tor_zstd_method_supported(void)
+{
+#ifdef HAVE_ZSTD
+ return 1;
+#else
+ return 0;
+#endif
+}
+
+/** Return a string representation of the version of the currently running
+ * version of libzstd. Returns NULL if Zstandard is unsupported. */
+const char *
+tor_zstd_get_version_str(void)
+{
+#ifdef HAVE_ZSTD
+ static char version_str[16];
+ size_t version_number;
+
+ version_number = ZSTD_versionNumber();
+ tor_snprintf(version_str, sizeof(version_str),
+ "%lu.%lu.%lu",
+ version_number / 10000 % 100,
+ version_number / 100 % 100,
+ version_number % 100);
+
+ return version_str;
+#else
+ return NULL;
+#endif
+}
+
+/** Return a string representation of the version of the version of libzstd
+ * used at compilation time. Returns NULL if Zstandard is unsupported. */
+const char *
+tor_zstd_get_header_version_str(void)
+{
+#ifdef HAVE_ZSTD
+ return ZSTD_VERSION_STRING;
+#else
+ return NULL;
+#endif
+}
+
+/** Internal Zstandard state for incremental compression/decompression.
+ * The body of this struct is not exposed. */
+struct tor_zstd_compress_state_t {
+#ifdef HAVE_ZSTD
+ union {
+ /** Compression stream. Used when <b>compress</b> is true. */
+ ZSTD_CStream *compress_stream;
+ /** Decompression stream. Used when <b>compress</b> is false. */
+ ZSTD_DStream *decompress_stream;
+ } u; /**< Zstandard stream objects. */
+#endif // HAVE_ZSTD.
+
+ int compress; /**< True if we are compressing; false if we are inflating */
+
+ /** Number of bytes read so far. Used to detect compression bombs. */
+ size_t input_so_far;
+ /** Number of bytes written so far. Used to detect compression bombs. */
+ size_t output_so_far;
+
+ /** Approximate number of bytes allocated for this object. */
+ size_t allocation;
+};
+
+#ifdef HAVE_ZSTD
+/** Return an approximate number of bytes stored in memory to hold the
+ * Zstandard compression/decompression state. */
+static size_t
+tor_zstd_state_size_precalc(int compress, int preset)
+{
+ tor_assert(preset > 0);
+
+ size_t memory_usage = sizeof(tor_zstd_compress_state_t);
+
+ // The Zstandard library provides a number of functions that would be useful
+ // here, but they are, unfortunately, still considered experimental and are
+ // thus only available in libzstd if we link against the library statically.
+ //
+ // The code in this function tries to approximate the calculations without
+ // being able to use the following:
+ //
+ // - We do not have access to neither the internal members of ZSTD_CStream
+ // and ZSTD_DStream and their internal context objects.
+ //
+ // - We cannot use ZSTD_sizeof_CStream() and ZSTD_sizeof_DStream() since they
+ // are unexposed.
+ //
+ // In the future it might be useful to check if libzstd have started
+ // providing these functions in a stable manner and simplify this function.
+ if (compress) {
+ // We try to approximate the ZSTD_sizeof_CStream(ZSTD_CStream *stream)
+ // function here. This function uses the following fields to make its
+ // estimate:
+
+ // - sizeof(ZSTD_CStream): Around 192 bytes on a 64-bit machine:
+ memory_usage += 192;
+
+ // - ZSTD_sizeof_CCtx(stream->cctx): This function requires access to
+ // variables that are not exposed via the public API. We use a _very_
+ // simplified function to calculate the estimated amount of bytes used in
+ // this struct.
+ // memory_usage += (preset - 0.5) * 1024 * 1024;
+ memory_usage += (preset * 1024 * 1024) - (512 * 1024);
+ // - ZSTD_sizeof_CDict(stream->cdictLocal): Unused in Tor: 0 bytes.
+ // - stream->outBuffSize: 128 KB:
+ memory_usage += 128 * 1024;
+ // - stream->inBuffSize: 2048 KB:
+ memory_usage += 2048 * 1024;
+ } else {
+ // We try to approximate the ZSTD_sizeof_DStream(ZSTD_DStream *stream)
+ // function here. This function uses the following fields to make its
+ // estimate:
+
+ // - sizeof(ZSTD_DStream): Around 208 bytes on a 64-bit machine:
+ memory_usage += 208;
+ // - ZSTD_sizeof_DCtx(stream->dctx): Around 150 KB.
+ memory_usage += 150 * 1024;
+
+ // - ZSTD_sizeof_DDict(stream->ddictLocal): Unused in Tor: 0 bytes.
+ // - stream->inBuffSize: 0 KB.
+ // - stream->outBuffSize: 0 KB.
+ }
+
+ return memory_usage;
+}
+#endif // HAVE_ZSTD.
+
+/** Construct and return a tor_zstd_compress_state_t object using
+ * <b>method</b>. If <b>compress</b>, it's for compression; otherwise it's for
+ * decompression. */
+tor_zstd_compress_state_t *
+tor_zstd_compress_new(int compress,
+ compress_method_t method,
+ compression_level_t level)
+{
+ tor_assert(method == ZSTD_METHOD);
+
+#ifdef HAVE_ZSTD
+ const int preset = memory_level(level);
+ tor_zstd_compress_state_t *result;
+ size_t retval;
+
+ result = tor_malloc_zero(sizeof(tor_zstd_compress_state_t));
+ result->compress = compress;
+ result->allocation = tor_zstd_state_size_precalc(compress, preset);
+
+ if (compress) {
+ result->u.compress_stream = ZSTD_createCStream();
+
+ if (result->u.compress_stream == NULL) {
+ log_warn(LD_GENERAL, "Error while creating Zstandard stream");
+ goto err;
+ }
+
+ retval = ZSTD_initCStream(result->u.compress_stream, preset);
+
+ if (ZSTD_isError(retval)) {
+ log_warn(LD_GENERAL, "Zstandard stream initialization error: %s",
+ ZSTD_getErrorName(retval));
+ goto err;
+ }
+ } else {
+ result->u.decompress_stream = ZSTD_createDStream();
+
+ if (result->u.decompress_stream == NULL) {
+ log_warn(LD_GENERAL, "Error while creating Zstandard stream");
+ goto err;
+ }
+
+ retval = ZSTD_initDStream(result->u.decompress_stream);
+
+ if (ZSTD_isError(retval)) {
+ log_warn(LD_GENERAL, "Zstandard stream initialization error: %s",
+ ZSTD_getErrorName(retval));
+ goto err;
+ }
+ }
+
+ atomic_counter_add(&total_zstd_allocation, result->allocation);
+ return result;
+
+ err:
+ if (compress) {
+ ZSTD_freeCStream(result->u.compress_stream);
+ } else {
+ ZSTD_freeDStream(result->u.decompress_stream);
+ }
+
+ tor_free(result);
+ return NULL;
+#else // HAVE_ZSTD.
+ (void)compress;
+ (void)method;
+ (void)level;
+
+ return NULL;
+#endif // HAVE_ZSTD.
+}
+
+/** Compress/decompress some bytes using <b>state</b>. Read up to
+ * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes
+ * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true,
+ * we've reached the end of the input.
+ *
+ * Return TOR_COMPRESS_DONE if we've finished the entire
+ * compression/decompression.
+ * Return TOR_COMPRESS_OK if we're processed everything from the input.
+ * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>.
+ * Return TOR_COMPRESS_ERROR if the stream is corrupt.
+ */
+tor_compress_output_t
+tor_zstd_compress_process(tor_zstd_compress_state_t *state,
+ char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish)
+{
+#ifdef HAVE_ZSTD
+ size_t retval;
+
+ tor_assert(state != NULL);
+ tor_assert(*in_len <= UINT_MAX);
+ tor_assert(*out_len <= UINT_MAX);
+
+ ZSTD_inBuffer input = { *in, *in_len, 0 };
+ ZSTD_outBuffer output = { *out, *out_len, 0 };
+
+ if (state->compress) {
+ retval = ZSTD_compressStream(state->u.compress_stream,
+ &output, &input);
+ } else {
+ retval = ZSTD_decompressStream(state->u.decompress_stream,
+ &output, &input);
+ }
+
+ state->input_so_far += input.pos;
+ state->output_so_far += output.pos;
+
+ *out = (char *)output.dst + output.pos;
+ *out_len = output.size - output.pos;
+ *in = (char *)input.src + input.pos;
+ *in_len = input.size - input.pos;
+
+ if (! state->compress &&
+ tor_compress_is_compression_bomb(state->input_so_far,
+ state->output_so_far)) {
+ log_warn(LD_DIR, "Possible compression bomb; abandoning stream.");
+ return TOR_COMPRESS_ERROR;
+ }
+
+ if (ZSTD_isError(retval)) {
+ log_warn(LD_GENERAL, "Zstandard %s didn't finish: %s.",
+ state->compress ? "compression" : "decompression",
+ ZSTD_getErrorName(retval));
+ return TOR_COMPRESS_ERROR;
+ }
+
+ if (state->compress && !finish) {
+ retval = ZSTD_flushStream(state->u.compress_stream, &output);
+
+ *out = (char *)output.dst + output.pos;
+ *out_len = output.size - output.pos;
+
+ if (ZSTD_isError(retval)) {
+ log_warn(LD_GENERAL, "Zstandard compression unable to flush: %s.",
+ ZSTD_getErrorName(retval));
+ return TOR_COMPRESS_ERROR;
+ }
+
+ if (retval > 0)
+ return TOR_COMPRESS_BUFFER_FULL;
+ }
+
+ if (!finish) {
+ // We're not done with the input, so no need to flush.
+ return TOR_COMPRESS_OK;
+ } else if (state->compress && finish) {
+ retval = ZSTD_endStream(state->u.compress_stream, &output);
+
+ *out = (char *)output.dst + output.pos;
+ *out_len = output.size - output.pos;
+
+ if (ZSTD_isError(retval)) {
+ log_warn(LD_GENERAL, "Zstandard compression unable to write "
+ "epilogue: %s.",
+ ZSTD_getErrorName(retval));
+ return TOR_COMPRESS_ERROR;
+ }
+
+ // endStream returns the number of bytes that is needed to write the
+ // epilogue.
+ if (retval > 0)
+ return TOR_COMPRESS_BUFFER_FULL;
+
+ return TOR_COMPRESS_DONE;
+ } else {
+ // ZSTD_flushStream returns 0 if the frame is done, or >0 if it
+ // is incomplete.
+ return (retval == 0) ? TOR_COMPRESS_DONE : TOR_COMPRESS_OK;
+ }
+
+#else // HAVE_ZSTD.
+ (void)state;
+ (void)out;
+ (void)out_len;
+ (void)in;
+ (void)in_len;
+ (void)finish;
+
+ return TOR_COMPRESS_ERROR;
+#endif // HAVE_ZSTD.
+}
+
+/** Deallocate <b>state</b>. */
+void
+tor_zstd_compress_free(tor_zstd_compress_state_t *state)
+{
+ if (state == NULL)
+ return;
+
+ atomic_counter_sub(&total_zstd_allocation, state->allocation);
+
+#ifdef HAVE_ZSTD
+ if (state->compress) {
+ ZSTD_freeCStream(state->u.compress_stream);
+ } else {
+ ZSTD_freeDStream(state->u.decompress_stream);
+ }
+#endif // HAVE_ZSTD.
+
+ tor_free(state);
+}
+
+/** Return the approximate number of bytes allocated for <b>state</b>. */
+size_t
+tor_zstd_compress_state_size(const tor_zstd_compress_state_t *state)
+{
+ tor_assert(state != NULL);
+ return state->allocation;
+}
+
+/** Return the approximate number of bytes allocated for all Zstandard
+ * states. */
+size_t
+tor_zstd_get_total_allocation(void)
+{
+ return atomic_counter_get(&total_zstd_allocation);
+}
+
+/** Initialize the zstd module */
+void
+tor_zstd_init(void)
+{
+ atomic_counter_init(&total_zstd_allocation);
+}
+
diff --git a/src/common/compress_zstd.h b/src/common/compress_zstd.h
new file mode 100644
index 0000000000..d3e65c2f16
--- /dev/null
+++ b/src/common/compress_zstd.h
@@ -0,0 +1,43 @@
+/* Copyright (c) 2003, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file compress_zstd.h
+ * \brief Header for compress_zstd.c
+ **/
+
+#ifndef TOR_COMPRESS_ZSTD_H
+#define TOR_COMPRESS_ZSTD_H
+
+int tor_zstd_method_supported(void);
+
+const char *tor_zstd_get_version_str(void);
+
+const char *tor_zstd_get_header_version_str(void);
+
+/** Internal state for an incremental Zstandard compression/decompression. */
+typedef struct tor_zstd_compress_state_t tor_zstd_compress_state_t;
+
+tor_zstd_compress_state_t *
+tor_zstd_compress_new(int compress,
+ compress_method_t method,
+ compression_level_t compression_level);
+
+tor_compress_output_t
+tor_zstd_compress_process(tor_zstd_compress_state_t *state,
+ char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish);
+
+void tor_zstd_compress_free(tor_zstd_compress_state_t *state);
+
+size_t tor_zstd_compress_state_size(const tor_zstd_compress_state_t *state);
+
+size_t tor_zstd_get_total_allocation(void);
+
+void tor_zstd_init(void);
+
+#endif // TOR_COMPRESS_ZSTD_H.
+
diff --git a/src/common/confline.c b/src/common/confline.c
new file mode 100644
index 0000000000..d4468f80ea
--- /dev/null
+++ b/src/common/confline.c
@@ -0,0 +1,338 @@
+/* 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 */
+
+#include "compat.h"
+#include "confline.h"
+#include "torlog.h"
+#include "util.h"
+
+/** Helper: allocate a new configuration option mapping 'key' to 'val',
+ * append it to *<b>lst</b>. */
+void
+config_line_append(config_line_t **lst,
+ const char *key,
+ const char *val)
+{
+ tor_assert(lst);
+
+ config_line_t *newline;
+
+ newline = tor_malloc_zero(sizeof(config_line_t));
+ newline->key = tor_strdup(key);
+ newline->value = tor_strdup(val);
+ newline->next = NULL;
+ while (*lst)
+ lst = &((*lst)->next);
+
+ (*lst) = newline;
+}
+
+/** Helper: allocate a new configuration option mapping 'key' to 'val',
+ * and prepend it to *<b>lst</b> */
+void
+config_line_prepend(config_line_t **lst,
+ const char *key,
+ const char *val)
+{
+ tor_assert(lst);
+
+ config_line_t *newline;
+
+ newline = tor_malloc_zero(sizeof(config_line_t));
+ newline->key = tor_strdup(key);
+ newline->value = tor_strdup(val);
+ newline->next = *lst;
+ *lst = newline;
+}
+
+/** Return the first line in <b>lines</b> whose key is exactly <b>key</b>, or
+ * NULL if no such key exists.
+ *
+ * (In options parsing, this is for handling commandline-only options only;
+ * other options should be looked up in the appropriate data structure.) */
+const config_line_t *
+config_line_find(const config_line_t *lines,
+ const char *key)
+{
+ const config_line_t *cl;
+ for (cl = lines; cl; cl = cl->next) {
+ if (!strcmp(cl->key, key))
+ return cl;
+ }
+ return NULL;
+}
+
+/** Helper: parse the config string and strdup into key/value
+ * strings. Set *result to the list, or NULL if parsing the string
+ * failed. Return 0 on success, -1 on failure. Warn and ignore any
+ * misformatted lines.
+ *
+ * If <b>extended</b> is set, then treat keys beginning with / and with + as
+ * indicating "clear" and "append" respectively. */
+int
+config_get_lines(const char *string, config_line_t **result, int extended)
+{
+ config_line_t *list = NULL, **next;
+ char *k, *v;
+ const char *parse_err;
+
+ next = &list;
+ do {
+ k = v = NULL;
+ string = parse_config_line_from_str_verbose(string, &k, &v, &parse_err);
+ if (!string) {
+ log_warn(LD_CONFIG, "Error while parsing configuration: %s",
+ parse_err?parse_err:"<unknown>");
+ config_free_lines(list);
+ tor_free(k);
+ tor_free(v);
+ return -1;
+ }
+ if (k && v) {
+ unsigned command = CONFIG_LINE_NORMAL;
+ if (extended) {
+ if (k[0] == '+') {
+ char *k_new = tor_strdup(k+1);
+ tor_free(k);
+ k = k_new;
+ command = CONFIG_LINE_APPEND;
+ } else if (k[0] == '/') {
+ char *k_new = tor_strdup(k+1);
+ tor_free(k);
+ k = k_new;
+ tor_free(v);
+ v = tor_strdup("");
+ command = CONFIG_LINE_CLEAR;
+ }
+ }
+ /* This list can get long, so we keep a pointer to the end of it
+ * rather than using config_line_append over and over and getting
+ * n^2 performance. */
+ *next = tor_malloc_zero(sizeof(config_line_t));
+ (*next)->key = k;
+ (*next)->value = v;
+ (*next)->next = NULL;
+ (*next)->command = command;
+ next = &((*next)->next);
+ } else {
+ tor_free(k);
+ tor_free(v);
+ }
+ } while (*string);
+
+ *result = list;
+ return 0;
+}
+
+/**
+ * Free all the configuration lines on the linked list <b>front</b>.
+ */
+void
+config_free_lines(config_line_t *front)
+{
+ config_line_t *tmp;
+
+ while (front) {
+ tmp = front;
+ front = tmp->next;
+
+ tor_free(tmp->key);
+ tor_free(tmp->value);
+ tor_free(tmp);
+ }
+}
+
+/** Return a newly allocated deep copy of the lines in <b>inp</b>. */
+config_line_t *
+config_lines_dup(const config_line_t *inp)
+{
+ return config_lines_dup_and_filter(inp, NULL);
+}
+
+/** Return a newly allocated deep copy of the lines in <b>inp</b>,
+ * but only the ones that match <b>key</b>. */
+config_line_t *
+config_lines_dup_and_filter(const config_line_t *inp,
+ const char *key)
+{
+ config_line_t *result = NULL;
+ config_line_t **next_out = &result;
+ while (inp) {
+ if (key && strcasecmpstart(inp->key, key)) {
+ inp = inp->next;
+ continue;
+ }
+ *next_out = tor_malloc_zero(sizeof(config_line_t));
+ (*next_out)->key = tor_strdup(inp->key);
+ (*next_out)->value = tor_strdup(inp->value);
+ inp = inp->next;
+ next_out = &((*next_out)->next);
+ }
+ (*next_out) = NULL;
+ return result;
+}
+
+/** Return true iff a and b contain identical keys and values in identical
+ * order. */
+int
+config_lines_eq(config_line_t *a, config_line_t *b)
+{
+ while (a && b) {
+ if (strcasecmp(a->key, b->key) || strcmp(a->value, b->value))
+ return 0;
+ a = a->next;
+ b = b->next;
+ }
+ if (a || b)
+ return 0;
+ return 1;
+}
+
+/** Return the number of lines in <b>a</b> whose key is <b>key</b>. */
+int
+config_count_key(const config_line_t *a, const char *key)
+{
+ int n = 0;
+ while (a) {
+ if (!strcasecmp(a->key, key)) {
+ ++n;
+ }
+ a = a->next;
+ }
+ return n;
+}
+
+/** Given a string containing part of a configuration file or similar format,
+ * advance past comments and whitespace and try to parse a single line. If we
+ * parse a line successfully, set *<b>key_out</b> to a new string holding the
+ * key portion and *<b>value_out</b> to a new string holding the value portion
+ * of the line, and return a pointer to the start of the next line. If we run
+ * out of data, return a pointer to the end of the string. If we encounter an
+ * error, return NULL and set *<b>err_out</b> (if provided) to an error
+ * message.
+ */
+const char *
+parse_config_line_from_str_verbose(const char *line, char **key_out,
+ char **value_out,
+ const char **err_out)
+{
+ /*
+ See torrc_format.txt for a description of the (silly) format this parses.
+ */
+ const char *key, *val, *cp;
+ int continuation = 0;
+
+ tor_assert(key_out);
+ tor_assert(value_out);
+
+ *key_out = *value_out = NULL;
+ key = val = NULL;
+ /* Skip until the first keyword. */
+ while (1) {
+ while (TOR_ISSPACE(*line))
+ ++line;
+ if (*line == '#') {
+ while (*line && *line != '\n')
+ ++line;
+ } else {
+ break;
+ }
+ }
+
+ if (!*line) { /* End of string? */
+ *key_out = *value_out = NULL;
+ return line;
+ }
+
+ /* Skip until the next space or \ followed by newline. */
+ key = line;
+ while (*line && !TOR_ISSPACE(*line) && *line != '#' &&
+ ! (line[0] == '\\' && line[1] == '\n'))
+ ++line;
+ *key_out = tor_strndup(key, line-key);
+
+ /* Skip until the value. */
+ while (*line == ' ' || *line == '\t')
+ ++line;
+
+ val = line;
+
+ /* Find the end of the line. */
+ if (*line == '\"') { // XXX No continuation handling is done here
+ if (!(line = unescape_string(line, value_out, NULL))) {
+ if (err_out)
+ *err_out = "Invalid escape sequence in quoted string";
+ return NULL;
+ }
+ while (*line == ' ' || *line == '\t')
+ ++line;
+ if (*line == '\r' && *(++line) == '\n')
+ ++line;
+ if (*line && *line != '#' && *line != '\n') {
+ if (err_out)
+ *err_out = "Excess data after quoted string";
+ return NULL;
+ }
+ } else {
+ /* Look for the end of the line. */
+ while (*line && *line != '\n' && (*line != '#' || continuation)) {
+ if (*line == '\\' && line[1] == '\n') {
+ continuation = 1;
+ line += 2;
+ } else if (*line == '#') {
+ do {
+ ++line;
+ } while (*line && *line != '\n');
+ if (*line == '\n')
+ ++line;
+ } else {
+ ++line;
+ }
+ }
+
+ if (*line == '\n') {
+ cp = line++;
+ } else {
+ cp = line;
+ }
+ /* Now back cp up to be the last nonspace character */
+ while (cp>val && TOR_ISSPACE(*(cp-1)))
+ --cp;
+
+ tor_assert(cp >= val);
+
+ /* Now copy out and decode the value. */
+ *value_out = tor_strndup(val, cp-val);
+ if (continuation) {
+ char *v_out, *v_in;
+ v_out = v_in = *value_out;
+ while (*v_in) {
+ if (*v_in == '#') {
+ do {
+ ++v_in;
+ } while (*v_in && *v_in != '\n');
+ if (*v_in == '\n')
+ ++v_in;
+ } else if (v_in[0] == '\\' && v_in[1] == '\n') {
+ v_in += 2;
+ } else {
+ *v_out++ = *v_in++;
+ }
+ }
+ *v_out = '\0';
+ }
+ }
+
+ if (*line == '#') {
+ do {
+ ++line;
+ } while (*line && *line != '\n');
+ }
+ while (TOR_ISSPACE(*line)) ++line;
+
+ return line;
+}
+
diff --git a/src/common/confline.h b/src/common/confline.h
new file mode 100644
index 0000000000..477c6929a2
--- /dev/null
+++ b/src/common/confline.h
@@ -0,0 +1,49 @@
+/* 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 */
+
+#ifndef TOR_CONFLINE_H
+#define TOR_CONFLINE_H
+
+/** Ordinary configuration line. */
+#define CONFIG_LINE_NORMAL 0
+/** Appends to previous configuration for the same option, even if we
+ * would ordinary replace it. */
+#define CONFIG_LINE_APPEND 1
+/* Removes all previous configuration for an option. */
+#define CONFIG_LINE_CLEAR 2
+
+/** A linked list of lines in a config file, or elsewhere */
+typedef struct config_line_t {
+ char *key;
+ char *value;
+ struct config_line_t *next;
+
+ /** What special treatment (if any) does this line require? */
+ unsigned int command:2;
+ /** If true, subsequent assignments to this linelist should replace
+ * it, not extend it. Set only on the first item in a linelist in an
+ * or_options_t. */
+ unsigned int fragile:1;
+} config_line_t;
+
+void config_line_append(config_line_t **lst,
+ const char *key, const char *val);
+void config_line_prepend(config_line_t **lst,
+ const char *key, const char *val);
+config_line_t *config_lines_dup(const config_line_t *inp);
+config_line_t *config_lines_dup_and_filter(const config_line_t *inp,
+ const char *key);
+const config_line_t *config_line_find(const config_line_t *lines,
+ const char *key);
+int config_lines_eq(config_line_t *a, config_line_t *b);
+int config_count_key(const config_line_t *a, const char *key);
+int config_get_lines(const char *string, config_line_t **result, int extended);
+void config_free_lines(config_line_t *front);
+const char *parse_config_line_from_str_verbose(const char *line,
+ char **key_out, char **value_out,
+ const char **err_out);
+#endif
+
diff --git a/src/common/container.c b/src/common/container.c
index 1448ab403c..689e7e55e9 100644
--- a/src/common/container.c
+++ b/src/common/container.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/container.h b/src/common/container.h
index 00c3ca81ad..db68d892f5 100644
--- a/src/common/container.h
+++ b/src/common/container.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CONTAINER_H
@@ -224,6 +224,7 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join,
#define SMARTLIST_FOREACH_END(var) \
var = NULL; \
+ (void) var ## _sl_idx; \
} STMT_END
/**
diff --git a/src/common/crypto.c b/src/common/crypto.c
index 7cb3330bde..a68510103e 100644
--- a/src/common/crypto.c
+++ b/src/common/crypto.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -467,7 +467,7 @@ crypto_new_pk_from_rsa_(RSA *rsa)
return env;
}
-/** Helper, used by tor-checkkey.c and tor-gencert.c. Return the RSA from a
+/** Helper, used by tor-gencert.c. Return the RSA from a
* crypto_pk_t. */
RSA *
crypto_pk_get_rsa_(crypto_pk_t *env)
@@ -3459,3 +3459,15 @@ crypto_global_cleanup(void)
/** @} */
+#ifdef USE_DMALLOC
+/** Tell the crypto library to use Tor's allocation functions rather than
+ * calling libc's allocation functions directly. Return 0 on success, -1
+ * on failure. */
+int
+crypto_use_tor_alloc_functions(void)
+{
+ int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_);
+ return r ? 0 : -1;
+}
+#endif
+
diff --git a/src/common/crypto.h b/src/common/crypto.h
index 42345f80e8..c70d91c262 100644
--- a/src/common/crypto.h
+++ b/src/common/crypto.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -131,6 +131,10 @@ int crypto_early_init(void) ATTR_WUR;
int crypto_global_init(int hardwareAccel,
const char *accelName,
const char *accelPath) ATTR_WUR;
+#ifdef USE_DMALLOC
+int crypto_use_tor_alloc_functions(void);
+#endif
+
void crypto_thread_cleanup(void);
int crypto_global_cleanup(void);
diff --git a/src/common/crypto_curve25519.c b/src/common/crypto_curve25519.c
index 5f328e124c..b99f13a93b 100644
--- a/src/common/crypto_curve25519.c
+++ b/src/common/crypto_curve25519.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/crypto_curve25519.h b/src/common/crypto_curve25519.h
index 4011820949..e7790edac0 100644
--- a/src/common/crypto_curve25519.h
+++ b/src/common/crypto_curve25519.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CRYPTO_CURVE25519_H
diff --git a/src/common/crypto_ed25519.c b/src/common/crypto_ed25519.c
index 525d25a3e0..188e18c710 100644
--- a/src/common/crypto_ed25519.c
+++ b/src/common/crypto_ed25519.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -32,8 +32,6 @@
#include "ed25519/ref10/ed25519_ref10.h"
#include "ed25519/donna/ed25519_donna_tor.h"
-#include <openssl/sha.h>
-
static void pick_ed25519_impl(void);
/** An Ed25519 implementation, as a set of function pointers. */
@@ -442,14 +440,16 @@ ed25519_keypair_from_curve25519_keypair(ed25519_keypair_t *out,
{
const char string[] = "Derive high part of ed25519 key from curve25519 key";
ed25519_public_key_t pubkey_check;
- SHA512_CTX ctx;
- uint8_t sha512_output[64];
+ crypto_digest_t *ctx;
+ uint8_t sha512_output[DIGEST512_LEN];
memcpy(out->seckey.seckey, inp->seckey.secret_key, 32);
- SHA512_Init(&ctx);
- SHA512_Update(&ctx, out->seckey.seckey, 32);
- SHA512_Update(&ctx, string, sizeof(string));
- SHA512_Final(sha512_output, &ctx);
+
+ ctx = crypto_digest512_new(DIGEST_SHA512);
+ crypto_digest_add_bytes(ctx, (const char*)out->seckey.seckey, 32);
+ crypto_digest_add_bytes(ctx, (const char*)string, sizeof(string));
+ crypto_digest_get_digest(ctx, (char *)sha512_output, sizeof(sha512_output));
+ crypto_digest_free(ctx);
memcpy(out->seckey.seckey + 32, sha512_output, 32);
ed25519_public_key_generate(&out->pubkey, &out->seckey);
diff --git a/src/common/crypto_ed25519.h b/src/common/crypto_ed25519.h
index f4a4adad68..77a3313adc 100644
--- a/src/common/crypto_ed25519.h
+++ b/src/common/crypto_ed25519.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CRYPTO_ED25519_H
diff --git a/src/common/crypto_format.c b/src/common/crypto_format.c
index aa2a9d1fb0..1d090a8770 100644
--- a/src/common/crypto_format.c
+++ b/src/common/crypto_format.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/crypto_format.h b/src/common/crypto_format.h
index 86c29d319c..390916cf04 100644
--- a/src/common/crypto_format.h
+++ b/src/common/crypto_format.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CRYPTO_FORMAT_H
diff --git a/src/common/crypto_pwbox.c b/src/common/crypto_pwbox.c
index 31e37c007d..db8892e376 100644
--- a/src/common/crypto_pwbox.c
+++ b/src/common/crypto_pwbox.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/crypto_s2k.c b/src/common/crypto_s2k.c
index 5dbd2ad91f..076df815a9 100644
--- a/src/common/crypto_s2k.c
+++ b/src/common/crypto_s2k.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/crypto_s2k.h b/src/common/crypto_s2k.h
index 9b186450b1..04212b868a 100644
--- a/src/common/crypto_s2k.h
+++ b/src/common/crypto_s2k.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CRYPTO_S2K_H_INCLUDED
diff --git a/src/common/di_ops.c b/src/common/di_ops.c
index 4ed49e1164..e47998107d 100644
--- a/src/common/di_ops.c
+++ b/src/common/di_ops.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2016, The Tor Project, Inc. */
+/* Copyright (c) 2011-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/di_ops.h b/src/common/di_ops.h
index 0a154302bf..e174fcc4e4 100644
--- a/src/common/di_ops.h
+++ b/src/common/di_ops.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/handles.h b/src/common/handles.h
index 1ee2322579..6d7262ab80 100644
--- a/src/common/handles.h
+++ b/src/common/handles.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/include.am b/src/common/include.am
index 40c463c9d9..51b7da65f5 100644
--- a/src/common/include.am
+++ b/src/common/include.am
@@ -84,6 +84,7 @@ LIBOR_A_SRC = \
src/common/compat.c \
src/common/compat_threads.c \
src/common/compat_time.c \
+ src/common/confline.c \
src/common/container.c \
src/common/log.c \
src/common/memarea.c \
@@ -93,6 +94,7 @@ LIBOR_A_SRC = \
src/common/util_format.c \
src/common/util_process.c \
src/common/sandbox.c \
+ src/common/storagedir.c \
src/common/workqueue.c \
$(libor_extra_source) \
$(threads_impl_source) \
@@ -103,11 +105,15 @@ src/common/src_common_libor_testing_a-log.$(OBJEXT) \
LIBOR_CRYPTO_A_SRC = \
src/common/aes.c \
+ src/common/compress.c \
+ src/common/compress_lzma.c \
+ src/common/compress_none.c \
+ src/common/compress_zlib.c \
+ src/common/compress_zstd.c \
src/common/crypto.c \
src/common/crypto_pwbox.c \
src/common/crypto_s2k.c \
src/common/crypto_format.c \
- src/common/torgzip.c \
src/common/tortls.c \
src/common/crypto_curve25519.c \
src/common/crypto_ed25519.c
@@ -143,6 +149,12 @@ COMMONHEADERS = \
src/common/compat_openssl.h \
src/common/compat_threads.h \
src/common/compat_time.h \
+ src/common/compress.h \
+ src/common/compress_lzma.h \
+ src/common/compress_none.h \
+ src/common/compress_zlib.h \
+ src/common/compress_zstd.h \
+ src/common/confline.h \
src/common/container.h \
src/common/crypto.h \
src/common/crypto_curve25519.h \
@@ -157,9 +169,9 @@ COMMONHEADERS = \
src/common/procmon.h \
src/common/pubsub.h \
src/common/sandbox.h \
+ src/common/storagedir.h \
src/common/testsupport.h \
src/common/timers.h \
- src/common/torgzip.h \
src/common/torint.h \
src/common/torlog.h \
src/common/tortls.h \
diff --git a/src/common/log.c b/src/common/log.c
index 5f7151bf0c..6a5819064a 100644
--- a/src/common/log.c
+++ b/src/common/log.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -1086,7 +1086,7 @@ add_file_log(const log_severity_list_t *severity, const char *filename,
int open_flags = O_WRONLY|O_CREAT;
open_flags |= truncate_log ? O_TRUNC : O_APPEND;
- fd = tor_open_cloexec(filename, open_flags, 0644);
+ fd = tor_open_cloexec(filename, open_flags, 0640);
if (fd<0)
return -1;
if (tor_fd_seekend(fd)<0) {
@@ -1177,7 +1177,7 @@ static const char *domain_list[] = {
"GENERAL", "CRYPTO", "NET", "CONFIG", "FS", "PROTOCOL", "MM",
"HTTP", "APP", "CONTROL", "CIRC", "REND", "BUG", "DIR", "DIRSERV",
"OR", "EDGE", "ACCT", "HIST", "HANDSHAKE", "HEARTBEAT", "CHANNEL",
- "SCHED", "GUARD", NULL
+ "SCHED", "GUARD", "CONSDIFF", NULL
};
/** Return a bitmask for the log domain for which <b>domain</b> is the name,
diff --git a/src/common/memarea.c b/src/common/memarea.c
index 7d16b702e3..659d1edf54 100644
--- a/src/common/memarea.c
+++ b/src/common/memarea.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2016, The Tor Project, Inc. */
+/* Copyright (c) 2008-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/** \file memarea.c
@@ -12,6 +12,9 @@
#include "util.h"
#include "compat.h"
#include "torlog.h"
+#include "container.h"
+
+#ifndef DISABLE_MEMORY_SENTINELS
/** If true, we try to detect any attempts to write beyond the length of a
* memarea. */
@@ -304,3 +307,91 @@ memarea_assert_ok(memarea_t *area)
}
}
+#else
+
+struct memarea_t {
+ smartlist_t *pieces;
+};
+
+memarea_t *
+memarea_new(void)
+{
+ memarea_t *ma = tor_malloc_zero(sizeof(memarea_t));
+ ma->pieces = smartlist_new();
+ return ma;
+}
+void
+memarea_drop_all(memarea_t *area)
+{
+ memarea_clear(area);
+ smartlist_free(area->pieces);
+ tor_free(area);
+}
+void
+memarea_clear(memarea_t *area)
+{
+ SMARTLIST_FOREACH(area->pieces, void *, p, tor_free_(p));
+ smartlist_clear(area->pieces);
+}
+int
+memarea_owns_ptr(const memarea_t *area, const void *ptr)
+{
+ SMARTLIST_FOREACH(area->pieces, const void *, p, if (ptr == p) return 1;);
+ return 0;
+}
+
+void *
+memarea_alloc(memarea_t *area, size_t sz)
+{
+ void *result = tor_malloc(sz);
+ smartlist_add(area->pieces, result);
+ return result;
+}
+
+void *
+memarea_alloc_zero(memarea_t *area, size_t sz)
+{
+ void *result = tor_malloc_zero(sz);
+ smartlist_add(area->pieces, result);
+ return result;
+}
+void *
+memarea_memdup(memarea_t *area, const void *s, size_t n)
+{
+ void *r = memarea_alloc(area, n);
+ memcpy(r, s, n);
+ return r;
+}
+char *
+memarea_strdup(memarea_t *area, const char *s)
+{
+ size_t n = strlen(s);
+ char *r = memarea_alloc(area, n+1);
+ memcpy(r, s, n);
+ r[n] = 0;
+ return r;
+}
+char *
+memarea_strndup(memarea_t *area, const char *s, size_t n)
+{
+ size_t ln = strnlen(s, n);
+ char *r = memarea_alloc(area, ln+1);
+ memcpy(r, s, ln);
+ r[ln] = 0;
+ return r;
+}
+void
+memarea_get_stats(memarea_t *area,
+ size_t *allocated_out, size_t *used_out)
+{
+ (void)area;
+ *allocated_out = *used_out = 128;
+}
+void
+memarea_assert_ok(memarea_t *area)
+{
+ (void)area;
+}
+
+#endif
+
diff --git a/src/common/memarea.h b/src/common/memarea.h
index 85bca51ad3..85012c1c34 100644
--- a/src/common/memarea.h
+++ b/src/common/memarea.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2016, The Tor Project, Inc. */
+/* Copyright (c) 2008-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Tor dependencies */
diff --git a/src/common/procmon.c b/src/common/procmon.c
index c485c760c7..d49e7f18f5 100644
--- a/src/common/procmon.c
+++ b/src/common/procmon.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2016, The Tor Project, Inc. */
+/* Copyright (c) 2011-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/procmon.h b/src/common/procmon.h
index 49ead24092..b07cff2c4a 100644
--- a/src/common/procmon.h
+++ b/src/common/procmon.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2016, The Tor Project, Inc. */
+/* Copyright (c) 2011-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/pubsub.c b/src/common/pubsub.c
index b3faf40e00..336e8a6e7f 100644
--- a/src/common/pubsub.c
+++ b/src/common/pubsub.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/pubsub.h b/src/common/pubsub.h
index bbb4f02a42..6f4ce08754 100644
--- a/src/common/pubsub.h
+++ b/src/common/pubsub.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/sandbox.c b/src/common/sandbox.c
index 8e72ebf137..7826b2d40c 100644
--- a/src/common/sandbox.c
+++ b/src/common/sandbox.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -20,7 +20,7 @@
#endif
/** Malloc mprotect limit in bytes. */
-#define MALLOC_MP_LIM 1048576
+#define MALLOC_MP_LIM (16*1024*1024)
#include <stdio.h>
#include <string.h>
@@ -155,6 +155,7 @@ static int filter_nopar_gen[] = {
#ifdef __NR_getgid32
SCMP_SYS(getgid32),
#endif
+ SCMP_SYS(getpid),
#ifdef __NR_getrlimit
SCMP_SYS(getrlimit),
#endif
diff --git a/src/common/sandbox.h b/src/common/sandbox.h
index c5963e3119..a6b83153af 100644
--- a/src/common/sandbox.h
+++ b/src/common/sandbox.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/storagedir.c b/src/common/storagedir.c
new file mode 100644
index 0000000000..309d42db17
--- /dev/null
+++ b/src/common/storagedir.c
@@ -0,0 +1,542 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "container.h"
+#include "compat.h"
+#include "confline.h"
+#include "memarea.h"
+#include "sandbox.h"
+#include "storagedir.h"
+#include "torlog.h"
+#include "util.h"
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#define FNAME_MIN_NUM 1000
+
+/** A storage_dir_t represents a directory full of similar cached
+ * files. Filenames are decimal integers. Files can be cleaned as needed
+ * to limit total disk usage. */
+struct storage_dir_t {
+ /** Directory holding the files for this storagedir. */
+ char *directory;
+ /** Either NULL, or a directory listing of the directory (as a smartlist
+ * of strings */
+ smartlist_t *contents;
+ /** The largest number of non-temporary files we'll place in the
+ * directory. */
+ int max_files;
+ /** If true, then 'usage' has been computed. */
+ int usage_known;
+ /** The total number of bytes used in this directory */
+ uint64_t usage;
+};
+
+/** Create or open a new storage directory at <b>dirname</b>, with
+ * capacity for up to <b>max_files</b> files.
+ */
+storage_dir_t *
+storage_dir_new(const char *dirname, int max_files)
+{
+ if (check_private_dir(dirname, CPD_CREATE, NULL) < 0)
+ return NULL;
+
+ storage_dir_t *d = tor_malloc_zero(sizeof(storage_dir_t));
+ d->directory = tor_strdup(dirname);
+ d->max_files = max_files;
+ return d;
+}
+
+/**
+ * Drop all in-RAM storage for <b>d</b>. Does not delete any files.
+ */
+void
+storage_dir_free(storage_dir_t *d)
+{
+ if (d == NULL)
+ return;
+ tor_free(d->directory);
+ if (d->contents) {
+ SMARTLIST_FOREACH(d->contents, char *, cp, tor_free(cp));
+ smartlist_free(d->contents);
+ }
+ tor_free(d);
+}
+
+/**
+ * Tell the sandbox (if any) configured by <b>cfg</b> to allow the
+ * operations that <b>d</b> will need.
+ *
+ * The presence of this function is why we need an upper limit on the
+ * number of filers in a storage_dir_t: we need to approve file
+ * operaitons one by one.
+ */
+int
+storage_dir_register_with_sandbox(storage_dir_t *d, sandbox_cfg_t **cfg)
+{
+ int problems = 0;
+ int idx;
+ for (idx = FNAME_MIN_NUM; idx < FNAME_MIN_NUM + d->max_files; ++idx) {
+ char *path = NULL, *tmppath = NULL;
+ tor_asprintf(&path, "%s/%d", d->directory, idx);
+ tor_asprintf(&tmppath, "%s/%d.tmp", d->directory, idx);
+
+ problems += sandbox_cfg_allow_open_filename(cfg, tor_strdup(path));
+ problems += sandbox_cfg_allow_open_filename(cfg, tor_strdup(tmppath));
+ problems += sandbox_cfg_allow_stat_filename(cfg, tor_strdup(path));
+ problems += sandbox_cfg_allow_stat_filename(cfg, tor_strdup(tmppath));
+ problems += sandbox_cfg_allow_rename(cfg,
+ tor_strdup(tmppath), tor_strdup(path));
+
+ tor_free(path);
+ tor_free(tmppath);
+ }
+
+ return problems ? -1 : 0;
+}
+
+/**
+ * Remove all files in <b>d</b> whose names end with ".tmp".
+ *
+ * Requires that the contents field of <b>d</b> is set.
+ */
+static void
+storage_dir_clean_tmpfiles(storage_dir_t *d)
+{
+ if (!d->contents)
+ return;
+ SMARTLIST_FOREACH_BEGIN(d->contents, char *, fname) {
+ if (strcmpend(fname, ".tmp"))
+ continue;
+ char *path = NULL;
+ tor_asprintf(&path, "%s/%s", d->directory, fname);
+ if (unlink(sandbox_intern_string(path))) {
+ log_warn(LD_FS, "Unable to unlink %s", escaped(path));
+ tor_free(path);
+ continue;
+ }
+ tor_free(path);
+ SMARTLIST_DEL_CURRENT(d->contents, fname);
+ tor_free(fname);
+ } SMARTLIST_FOREACH_END(fname);
+
+ d->usage_known = 0;
+}
+
+/**
+ * Re-scan the directory <b>d</b> to learn its contents.
+ */
+static int
+storage_dir_rescan(storage_dir_t *d)
+{
+ if (d->contents) {
+ SMARTLIST_FOREACH(d->contents, char *, cp, tor_free(cp));
+ smartlist_free(d->contents);
+ }
+ d->usage = 0;
+ d->usage_known = 0;
+ if (NULL == (d->contents = tor_listdir(d->directory))) {
+ return -1;
+ }
+ storage_dir_clean_tmpfiles(d);
+ return 0;
+}
+
+/**
+ * Return a smartlist containing the filenames within <b>d</b>.
+ */
+const smartlist_t *
+storage_dir_list(storage_dir_t *d)
+{
+ if (! d->contents)
+ storage_dir_rescan(d);
+ return d->contents;
+}
+
+/**
+ * Return the total number of bytes used for storage in <b>d</b>.
+ */
+uint64_t
+storage_dir_get_usage(storage_dir_t *d)
+{
+ if (d->usage_known)
+ return d->usage;
+
+ uint64_t total = 0;
+ SMARTLIST_FOREACH_BEGIN(storage_dir_list(d), const char *, cp) {
+ char *path = NULL;
+ struct stat st;
+ tor_asprintf(&path, "%s/%s", d->directory, cp);
+ if (stat(sandbox_intern_string(path), &st) == 0) {
+ total += st.st_size;
+ }
+ tor_free(path);
+ } SMARTLIST_FOREACH_END(cp);
+
+ d->usage = total;
+ d->usage_known = 1;
+ return d->usage;
+}
+
+/** Mmap a specified file within <b>d</b>. */
+tor_mmap_t *
+storage_dir_map(storage_dir_t *d, const char *fname)
+{
+ char *path = NULL;
+ tor_asprintf(&path, "%s/%s", d->directory, fname);
+ tor_mmap_t *result = tor_mmap_file(path);
+ tor_free(path);
+ return result;
+}
+
+/** Read a file within <b>d</b> into a newly allocated buffer. Set
+ * *<b>sz_out</b> to its size. */
+uint8_t *
+storage_dir_read(storage_dir_t *d, const char *fname, int bin, size_t *sz_out)
+{
+ const int flags = bin ? RFTS_BIN : 0;
+
+ char *path = NULL;
+ tor_asprintf(&path, "%s/%s", d->directory, fname);
+ struct stat st;
+ char *contents = read_file_to_str(path, flags, &st);
+ if (contents && sz_out) {
+ // it fits in RAM, so we know its size is less than SIZE_MAX
+ tor_assert((uint64_t)st.st_size <= SIZE_MAX);
+ *sz_out = (size_t) st.st_size;
+ }
+
+ tor_free(path);
+ return (uint8_t *) contents;
+}
+
+/** Helper: Find an unused filename within the directory */
+static char *
+find_unused_fname(storage_dir_t *d)
+{
+ if (!d->contents) {
+ if (storage_dir_rescan(d) < 0)
+ return NULL;
+ }
+
+ char buf[16];
+ int i;
+ /* Yuck; this is quadratic. Fortunately, that shouldn't matter much,
+ * since disk writes are more expensive by a lot. */
+ for (i = FNAME_MIN_NUM; i < FNAME_MIN_NUM + d->max_files; ++i) {
+ tor_snprintf(buf, sizeof(buf), "%d", i);
+ if (!smartlist_contains_string(d->contents, buf)) {
+ return tor_strdup(buf);
+ }
+ }
+ return NULL;
+}
+
+/** Helper: As storage_dir_save_bytes_to_file, but store a smartlist of
+ * sized_chunk_t rather than a single byte array. */
+static int
+storage_dir_save_chunks_to_file(storage_dir_t *d,
+ const smartlist_t *chunks,
+ int binary,
+ char **fname_out)
+{
+ uint64_t total_length = 0;
+ char *fname = find_unused_fname(d);
+ if (!fname)
+ return -1;
+
+ SMARTLIST_FOREACH(chunks, const sized_chunk_t *, ch,
+ total_length += ch->len);
+
+ char *path = NULL;
+ tor_asprintf(&path, "%s/%s", d->directory, fname);
+
+ int r = write_chunks_to_file(path, chunks, binary, 0);
+ if (r == 0) {
+ if (d->usage_known)
+ d->usage += total_length;
+ if (fname_out) {
+ *fname_out = tor_strdup(fname);
+ }
+ if (d->contents)
+ smartlist_add(d->contents, tor_strdup(fname));
+ }
+ tor_free(fname);
+ tor_free(path);
+ return r;
+}
+
+/** Try to write the <b>length</b> bytes at <b>data</b> into a new file
+ * in <b>d</b>. On success, return 0 and set *<b>fname_out</b> to a
+ * newly allocated string containing the filename. On failure, return
+ * -1. */
+int
+storage_dir_save_bytes_to_file(storage_dir_t *d,
+ const uint8_t *data,
+ size_t length,
+ int binary,
+ char **fname_out)
+{
+ smartlist_t *chunks = smartlist_new();
+ sized_chunk_t chunk = { (const char *)data, length };
+ smartlist_add(chunks, &chunk);
+ int r = storage_dir_save_chunks_to_file(d, chunks, binary, fname_out);
+ smartlist_free(chunks);
+ return r;
+}
+
+/**
+ * As storage_dir_save_bytes_to_file, but saves a NUL-terminated string
+ * <b>str</b>.
+ */
+int
+storage_dir_save_string_to_file(storage_dir_t *d,
+ const char *str,
+ int binary,
+ char **fname_out)
+{
+ return storage_dir_save_bytes_to_file(d,
+ (const uint8_t*)str, strlen(str), binary, fname_out);
+}
+
+/**
+ * As storage_dir_save_bytes_to_file, but associates the data with the
+ * key-value pairs in <b>labels</b>. Files
+ * stored in this format can be recovered with storage_dir_map_labeled
+ * or storage_dir_read_labeled().
+ */
+int
+storage_dir_save_labeled_to_file(storage_dir_t *d,
+ const config_line_t *labels,
+ const uint8_t *data,
+ size_t length,
+ char **fname_out)
+{
+ /*
+ * The storage format is to prefix the data with the key-value pairs in
+ * <b>labels</b>, and a single NUL separator. But code outside this module
+ * MUST NOT rely on that format.
+ */
+
+ smartlist_t *chunks = smartlist_new();
+ memarea_t *area = memarea_new();
+ const config_line_t *line;
+ for (line = labels; line; line = line->next) {
+ sized_chunk_t *sz = memarea_alloc(area, sizeof(sized_chunk_t));
+ sz->len = strlen(line->key) + 1 + strlen(line->value) + 1;
+ const size_t allocated = sz->len + 1;
+ char *bytes = memarea_alloc(area, allocated);
+ tor_snprintf(bytes, allocated, "%s %s\n", line->key, line->value);
+ sz->bytes = bytes;
+ smartlist_add(chunks, sz);
+ }
+
+ sized_chunk_t *nul = memarea_alloc(area, sizeof(sized_chunk_t));
+ nul->len = 1;
+ nul->bytes = "\0";
+ smartlist_add(chunks, nul);
+
+ sized_chunk_t *datachunk = memarea_alloc(area, sizeof(sized_chunk_t));
+ datachunk->bytes = (const char *)data;
+ datachunk->len = length;
+ smartlist_add(chunks, datachunk);
+
+ int r = storage_dir_save_chunks_to_file(d, chunks, 1, fname_out);
+ smartlist_free(chunks);
+ memarea_drop_all(area);
+ return r;
+}
+
+/**
+ * Map a file that was created with storage_dir_save_labeled(). On failure,
+ * return NULL. On success, write a set of newly allocated labels into to
+ * *<b>labels_out</b>, a pointer to the into *<b>data_out</b>, and the data's
+ * into *<b>sz_out</b>. On success, also return a tor_mmap_t object whose
+ * contents should not be used -- it needs to be kept around, though, for as
+ * long as <b>data_out</b> is going to be valid.
+ */
+tor_mmap_t *
+storage_dir_map_labeled(storage_dir_t *dir,
+ const char *fname,
+ config_line_t **labels_out,
+ const uint8_t **data_out,
+ size_t *sz_out)
+{
+ tor_mmap_t *m = storage_dir_map(dir, fname);
+ if (! m)
+ goto err;
+ const char *nulp = memchr(m->data, '\0', m->size);
+ if (! nulp)
+ goto err;
+ if (labels_out && config_get_lines(m->data, labels_out, 0) < 0)
+ goto err;
+ size_t offset = nulp - m->data + 1;
+ tor_assert(offset <= m->size);
+ *data_out = (const uint8_t *)(m->data + offset);
+ *sz_out = m->size - offset;
+
+ return m;
+ err:
+ tor_munmap_file(m);
+ return NULL;
+}
+
+/** As storage_dir_map_labeled, but return a new byte array containing the
+ * data. */
+uint8_t *
+storage_dir_read_labeled(storage_dir_t *dir,
+ const char *fname,
+ config_line_t **labels_out,
+ size_t *sz_out)
+{
+ const uint8_t *data = NULL;
+ tor_mmap_t *m = storage_dir_map_labeled(dir, fname, labels_out,
+ &data, sz_out);
+ if (m == NULL)
+ return NULL;
+ uint8_t *result = tor_memdup(data, *sz_out);
+ tor_munmap_file(m);
+ return result;
+}
+
+/**
+ * Remove the file called <b>fname</b> from <b>d</b>.
+ */
+void
+storage_dir_remove_file(storage_dir_t *d,
+ const char *fname)
+{
+ char *path = NULL;
+ tor_asprintf(&path, "%s/%s", d->directory, fname);
+ const char *ipath = sandbox_intern_string(path);
+
+ uint64_t size = 0;
+ if (d->usage_known) {
+ struct stat st;
+ if (stat(ipath, &st) == 0) {
+ size = st.st_size;
+ }
+ }
+ if (unlink(ipath) == 0) {
+ d->usage -= size;
+ } else {
+ log_warn(LD_FS, "Unable to unlink %s", escaped(path));
+ tor_free(path);
+ return;
+ }
+ if (d->contents) {
+ smartlist_string_remove(d->contents, fname);
+ }
+
+ tor_free(path);
+}
+
+/** Helper type: used to sort the members of storage directory by mtime. */
+typedef struct shrinking_dir_entry_t {
+ time_t mtime;
+ uint64_t size;
+ char *path;
+} shrinking_dir_entry_t;
+
+/** Helper: use with qsort to sort shrinking_dir_entry_t structs. */
+static int
+shrinking_dir_entry_compare(const void *a_, const void *b_)
+{
+ const shrinking_dir_entry_t *a = a_;
+ const shrinking_dir_entry_t *b = b_;
+
+ if (a->mtime < b->mtime)
+ return -1;
+ else if (a->mtime > b->mtime)
+ return 1;
+ else
+ return 0;
+}
+
+/**
+ * Try to free space by removing the oldest files in <b>d</b>. Delete
+ * until no more than <b>target_size</b> bytes are left, and at least
+ * <b>min_to_remove</b> files have been removed... or until there is
+ * nothing left to remove.
+ *
+ * Return 0 on success; -1 on failure.
+ */
+int
+storage_dir_shrink(storage_dir_t *d,
+ uint64_t target_size,
+ int min_to_remove)
+{
+ if (d->usage_known && d->usage <= target_size && !min_to_remove) {
+ /* Already small enough. */
+ return 0;
+ }
+
+ if (storage_dir_rescan(d) < 0)
+ return -1;
+
+ const uint64_t orig_usage = storage_dir_get_usage(d);
+ if (orig_usage <= target_size && !min_to_remove) {
+ /* Okay, small enough after rescan! */
+ return 0;
+ }
+
+ const int n = smartlist_len(d->contents);
+ shrinking_dir_entry_t *ents = tor_calloc(n, sizeof(shrinking_dir_entry_t));
+ SMARTLIST_FOREACH_BEGIN(d->contents, const char *, fname) {
+ shrinking_dir_entry_t *ent = &ents[fname_sl_idx];
+ struct stat st;
+ tor_asprintf(&ent->path, "%s/%s", d->directory, fname);
+ if (stat(sandbox_intern_string(ent->path), &st) == 0) {
+ ent->mtime = st.st_mtime;
+ ent->size = st.st_size;
+ }
+ } SMARTLIST_FOREACH_END(fname);
+
+ qsort(ents, n, sizeof(shrinking_dir_entry_t), shrinking_dir_entry_compare);
+
+ int idx = 0;
+ while ((d->usage > target_size || min_to_remove > 0) && idx < n) {
+ if (unlink(sandbox_intern_string(ents[idx].path)) == 0) {
+ if (! BUG(d->usage < ents[idx].size)) {
+ d->usage -= ents[idx].size;
+ }
+ --min_to_remove;
+ }
+ ++idx;
+ }
+
+ for (idx = 0; idx < n; ++idx) {
+ tor_free(ents[idx].path);
+ }
+ tor_free(ents);
+
+ storage_dir_rescan(d);
+
+ return 0;
+}
+
+/** Remove all files in <b>d</b>. */
+int
+storage_dir_remove_all(storage_dir_t *d)
+{
+ return storage_dir_shrink(d, 0, d->max_files);
+}
+
+/**
+ * Return the largest number of non-temporary files we're willing to
+ * store in <b>d</b>.
+ */
+int
+storage_dir_get_max_files(storage_dir_t *d)
+{
+ return d->max_files;
+}
+
diff --git a/src/common/storagedir.h b/src/common/storagedir.h
new file mode 100644
index 0000000000..db25057e65
--- /dev/null
+++ b/src/common/storagedir.h
@@ -0,0 +1,51 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_STORAGEDIR_H
+#define TOR_STORAGEDIR_H
+
+typedef struct storage_dir_t storage_dir_t;
+struct config_line_t;
+struct sandbox_cfg_elem;
+
+storage_dir_t * storage_dir_new(const char *dirname, int n_files);
+void storage_dir_free(storage_dir_t *d);
+int storage_dir_register_with_sandbox(storage_dir_t *d,
+ struct sandbox_cfg_elem **cfg);
+const smartlist_t *storage_dir_list(storage_dir_t *d);
+uint64_t storage_dir_get_usage(storage_dir_t *d);
+tor_mmap_t *storage_dir_map(storage_dir_t *d, const char *fname);
+uint8_t *storage_dir_read(storage_dir_t *d, const char *fname, int bin,
+ size_t *sz_out);
+int storage_dir_save_bytes_to_file(storage_dir_t *d,
+ const uint8_t *data,
+ size_t length,
+ int binary,
+ char **fname_out);
+int storage_dir_save_string_to_file(storage_dir_t *d,
+ const char *data,
+ int binary,
+ char **fname_out);
+int storage_dir_save_labeled_to_file(storage_dir_t *d,
+ const struct config_line_t *labels,
+ const uint8_t *data,
+ size_t length,
+ char **fname_out);
+tor_mmap_t *storage_dir_map_labeled(storage_dir_t *dir,
+ const char *fname,
+ struct config_line_t **labels_out,
+ const uint8_t **data_out,
+ size_t *size_out);
+uint8_t *storage_dir_read_labeled(storage_dir_t *d, const char *fname,
+ struct config_line_t **labels_out,
+ size_t *sz_out);
+void storage_dir_remove_file(storage_dir_t *d,
+ const char *fname);
+int storage_dir_shrink(storage_dir_t *d,
+ uint64_t target_size,
+ int min_to_remove);
+int storage_dir_remove_all(storage_dir_t *d);
+int storage_dir_get_max_files(storage_dir_t *d);
+
+#endif
+
diff --git a/src/common/testsupport.h b/src/common/testsupport.h
index 9ad2ba77e0..9fc96199b4 100644
--- a/src/common/testsupport.h
+++ b/src/common/testsupport.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_TESTSUPPORT_H
diff --git a/src/common/timers.c b/src/common/timers.c
index e1ad47b15b..6f4a6c30f0 100644
--- a/src/common/timers.c
+++ b/src/common/timers.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/timers.h b/src/common/timers.h
index c5246a3335..e816630e6d 100644
--- a/src/common/timers.h
+++ b/src/common/timers.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_TIMERS_H
diff --git a/src/common/torgzip.c b/src/common/torgzip.c
deleted file mode 100644
index 04ae353cf4..0000000000
--- a/src/common/torgzip.c
+++ /dev/null
@@ -1,584 +0,0 @@
-/* Copyright (c) 2004, Roger Dingledine.
- * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
-/* See LICENSE for licensing information */
-
-/**
- * \file torgzip.c
- * \brief A simple in-memory gzip implementation.
- **/
-
-#include "orconfig.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <assert.h>
-#include <string.h>
-#include "torint.h"
-
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-
-#include "util.h"
-#include "torlog.h"
-#include "torgzip.h"
-
-/* zlib 1.2.4 and 1.2.5 do some "clever" things with macros. Instead of
- saying "(defined(FOO) ? FOO : 0)" they like to say "FOO-0", on the theory
- that nobody will care if the compile outputs a no-such-identifier warning.
-
- Sorry, but we like -Werror over here, so I guess we need to define these.
- I hope that zlib 1.2.6 doesn't break these too.
-*/
-#ifndef _LARGEFILE64_SOURCE
-#define _LARGEFILE64_SOURCE 0
-#endif
-#ifndef _LFS64_LARGEFILE
-#define _LFS64_LARGEFILE 0
-#endif
-#ifndef _FILE_OFFSET_BITS
-#define _FILE_OFFSET_BITS 0
-#endif
-#ifndef off64_t
-#define off64_t int64_t
-#endif
-
-#include <zlib.h>
-
-#if defined ZLIB_VERNUM && ZLIB_VERNUM < 0x1200
-#error "We require zlib version 1.2 or later."
-#endif
-
-static size_t tor_zlib_state_size_precalc(int inflate,
- int windowbits, int memlevel);
-
-/** Total number of bytes allocated for zlib state */
-static size_t total_zlib_allocation = 0;
-
-/** Return a string representation of the version of the currently running
- * version of zlib. */
-const char *
-tor_zlib_get_version_str(void)
-{
- return zlibVersion();
-}
-
-/** Return a string representation of the version of the version of zlib
-* used at compilation. */
-const char *
-tor_zlib_get_header_version_str(void)
-{
- return ZLIB_VERSION;
-}
-
-/** Return the 'bits' value to tell zlib to use <b>method</b>.*/
-static inline int
-method_bits(compress_method_t method, zlib_compression_level_t level)
-{
- /* Bits+16 means "use gzip" in zlib >= 1.2 */
- const int flag = method == GZIP_METHOD ? 16 : 0;
- switch (level) {
- default:
- case HIGH_COMPRESSION: return flag + 15;
- case MEDIUM_COMPRESSION: return flag + 13;
- case LOW_COMPRESSION: return flag + 11;
- }
-}
-
-static inline int
-get_memlevel(zlib_compression_level_t level)
-{
- switch (level) {
- default:
- case HIGH_COMPRESSION: return 8;
- case MEDIUM_COMPRESSION: return 7;
- case LOW_COMPRESSION: return 6;
- }
-}
-
-/** @{ */
-/* These macros define the maximum allowable compression factor. Anything of
- * size greater than CHECK_FOR_COMPRESSION_BOMB_AFTER is not allowed to
- * have an uncompression factor (uncompressed size:compressed size ratio) of
- * any greater than MAX_UNCOMPRESSION_FACTOR.
- *
- * Picking a value for MAX_UNCOMPRESSION_FACTOR is a trade-off: we want it to
- * be small to limit the attack multiplier, but we also want it to be large
- * enough so that no legitimate document --even ones we might invent in the
- * future -- ever compresses by a factor of greater than
- * MAX_UNCOMPRESSION_FACTOR. Within those parameters, there's a reasonably
- * large range of possible values. IMO, anything over 8 is probably safe; IMO
- * anything under 50 is probably sufficient.
- */
-#define MAX_UNCOMPRESSION_FACTOR 25
-#define CHECK_FOR_COMPRESSION_BOMB_AFTER (1024*64)
-/** @} */
-
-/** Return true if uncompressing an input of size <b>in_size</b> to an input
- * of size at least <b>size_out</b> looks like a compression bomb. */
-static int
-is_compression_bomb(size_t size_in, size_t size_out)
-{
- if (size_in == 0 || size_out < CHECK_FOR_COMPRESSION_BOMB_AFTER)
- return 0;
-
- return (size_out / size_in > MAX_UNCOMPRESSION_FACTOR);
-}
-
-/** Given <b>in_len</b> bytes at <b>in</b>, compress them into a newly
- * allocated buffer, using the method described in <b>method</b>. Store the
- * compressed string in *<b>out</b>, and its length in *<b>out_len</b>.
- * Return 0 on success, -1 on failure.
- */
-int
-tor_gzip_compress(char **out, size_t *out_len,
- const char *in, size_t in_len,
- compress_method_t method)
-{
- struct z_stream_s *stream = NULL;
- size_t out_size, old_size;
- off_t offset;
-
- tor_assert(out);
- tor_assert(out_len);
- tor_assert(in);
- tor_assert(in_len < UINT_MAX);
-
- *out = NULL;
-
- stream = tor_malloc_zero(sizeof(struct z_stream_s));
- stream->zalloc = Z_NULL;
- stream->zfree = Z_NULL;
- stream->opaque = NULL;
- stream->next_in = (unsigned char*) in;
- stream->avail_in = (unsigned int)in_len;
-
- if (deflateInit2(stream, Z_BEST_COMPRESSION, Z_DEFLATED,
- method_bits(method, HIGH_COMPRESSION),
- get_memlevel(HIGH_COMPRESSION),
- Z_DEFAULT_STRATEGY) != Z_OK) {
- //LCOV_EXCL_START -- we can only provoke failure by giving junk arguments.
- log_warn(LD_GENERAL, "Error from deflateInit2: %s",
- stream->msg?stream->msg:"<no message>");
- goto err;
- //LCOV_EXCL_STOP
- }
-
- /* Guess 50% compression. */
- out_size = in_len / 2;
- if (out_size < 1024) out_size = 1024;
- *out = tor_malloc(out_size);
- stream->next_out = (unsigned char*)*out;
- stream->avail_out = (unsigned int)out_size;
-
- while (1) {
- switch (deflate(stream, Z_FINISH))
- {
- case Z_STREAM_END:
- goto done;
- case Z_OK:
- /* In case zlib doesn't work as I think .... */
- if (stream->avail_out >= stream->avail_in+16)
- break;
- case Z_BUF_ERROR:
- offset = stream->next_out - ((unsigned char*)*out);
- old_size = out_size;
- out_size *= 2;
- if (out_size < old_size) {
- log_warn(LD_GENERAL, "Size overflow in compression.");
- goto err;
- }
- *out = tor_realloc(*out, out_size);
- stream->next_out = (unsigned char*)(*out + offset);
- if (out_size - offset > UINT_MAX) {
- log_warn(LD_BUG, "Ran over unsigned int limit of zlib while "
- "uncompressing.");
- goto err;
- }
- stream->avail_out = (unsigned int)(out_size - offset);
- break;
- default:
- log_warn(LD_GENERAL, "Gzip compression didn't finish: %s",
- stream->msg ? stream->msg : "<no message>");
- goto err;
- }
- }
- done:
- *out_len = stream->total_out;
-#if defined(OpenBSD)
- /* "Hey Rocky! Watch me change an unsigned field to a signed field in a
- * third-party API!"
- * "Oh, that trick will just make people do unsafe casts to the unsigned
- * type in their cross-platform code!"
- * "Don't be foolish. I'm _sure_ they'll have the good sense to make sure
- * the newly unsigned field isn't negative." */
- tor_assert(stream->total_out >= 0);
-#endif
- if (deflateEnd(stream)!=Z_OK) {
- // LCOV_EXCL_START -- unreachable if we handled the zlib structure right
- tor_assert_nonfatal_unreached();
- log_warn(LD_BUG, "Error freeing gzip structures");
- goto err;
- // LCOV_EXCL_STOP
- }
- tor_free(stream);
-
- if (is_compression_bomb(*out_len, in_len)) {
- log_warn(LD_BUG, "We compressed something and got an insanely high "
- "compression factor; other Tors would think this was a zlib bomb.");
- goto err;
- }
-
- return 0;
- err:
- if (stream) {
- deflateEnd(stream);
- tor_free(stream);
- }
- tor_free(*out);
- return -1;
-}
-
-/** Given zero or more zlib-compressed or gzip-compressed strings of
- * total length
- * <b>in_len</b> bytes at <b>in</b>, uncompress them into a newly allocated
- * buffer, using the method described in <b>method</b>. Store the uncompressed
- * string in *<b>out</b>, and its length in *<b>out_len</b>. Return 0 on
- * success, -1 on failure.
- *
- * If <b>complete_only</b> is true, we consider a truncated input as a
- * failure; otherwise we decompress as much as we can. Warn about truncated
- * or corrupt inputs at <b>protocol_warn_level</b>.
- */
-int
-tor_gzip_uncompress(char **out, size_t *out_len,
- const char *in, size_t in_len,
- compress_method_t method,
- int complete_only,
- int protocol_warn_level)
-{
- struct z_stream_s *stream = NULL;
- size_t out_size, old_size;
- off_t offset;
- int r;
-
- tor_assert(out);
- tor_assert(out_len);
- tor_assert(in);
- tor_assert(in_len < UINT_MAX);
-
- *out = NULL;
-
- stream = tor_malloc_zero(sizeof(struct z_stream_s));
- stream->zalloc = Z_NULL;
- stream->zfree = Z_NULL;
- stream->opaque = NULL;
- stream->next_in = (unsigned char*) in;
- stream->avail_in = (unsigned int)in_len;
-
- if (inflateInit2(stream,
- method_bits(method, HIGH_COMPRESSION)) != Z_OK) {
- // LCOV_EXCL_START -- can only hit this if we give bad inputs.
- log_warn(LD_GENERAL, "Error from inflateInit2: %s",
- stream->msg?stream->msg:"<no message>");
- goto err;
- // LCOV_EXCL_STOP
- }
-
- out_size = in_len * 2; /* guess 50% compression. */
- if (out_size < 1024) out_size = 1024;
- if (out_size >= SIZE_T_CEILING || out_size > UINT_MAX)
- goto err;
-
- *out = tor_malloc(out_size);
- stream->next_out = (unsigned char*)*out;
- stream->avail_out = (unsigned int)out_size;
-
- while (1) {
- switch (inflate(stream, complete_only ? Z_FINISH : Z_SYNC_FLUSH))
- {
- case Z_STREAM_END:
- if (stream->avail_in == 0)
- goto done;
- /* There may be more compressed data here. */
- if ((r = inflateEnd(stream)) != Z_OK) {
- log_warn(LD_BUG, "Error freeing gzip structures");
- goto err;
- }
- if (inflateInit2(stream,
- method_bits(method,HIGH_COMPRESSION)) != Z_OK) {
- log_warn(LD_GENERAL, "Error from second inflateInit2: %s",
- stream->msg?stream->msg:"<no message>");
- goto err;
- }
- break;
- case Z_OK:
- if (!complete_only && stream->avail_in == 0)
- goto done;
- /* In case zlib doesn't work as I think.... */
- if (stream->avail_out >= stream->avail_in+16)
- break;
- case Z_BUF_ERROR:
- if (stream->avail_out > 0) {
- log_fn(protocol_warn_level, LD_PROTOCOL,
- "possible truncated or corrupt zlib data");
- goto err;
- }
- offset = stream->next_out - (unsigned char*)*out;
- old_size = out_size;
- out_size *= 2;
- if (out_size < old_size) {
- log_warn(LD_GENERAL, "Size overflow in uncompression.");
- goto err;
- }
- if (is_compression_bomb(in_len, out_size)) {
- log_warn(LD_GENERAL, "Input looks like a possible zlib bomb; "
- "not proceeding.");
- goto err;
- }
- if (out_size >= SIZE_T_CEILING) {
- log_warn(LD_BUG, "Hit SIZE_T_CEILING limit while uncompressing.");
- goto err;
- }
- *out = tor_realloc(*out, out_size);
- stream->next_out = (unsigned char*)(*out + offset);
- if (out_size - offset > UINT_MAX) {
- log_warn(LD_BUG, "Ran over unsigned int limit of zlib while "
- "uncompressing.");
- goto err;
- }
- stream->avail_out = (unsigned int)(out_size - offset);
- break;
- default:
- log_warn(LD_GENERAL, "Gzip decompression returned an error: %s",
- stream->msg ? stream->msg : "<no message>");
- goto err;
- }
- }
- done:
- *out_len = stream->next_out - (unsigned char*)*out;
- r = inflateEnd(stream);
- tor_free(stream);
- if (r != Z_OK) {
- log_warn(LD_BUG, "Error freeing gzip structures");
- goto err;
- }
-
- /* NUL-terminate output. */
- if (out_size == *out_len)
- *out = tor_realloc(*out, out_size + 1);
- (*out)[*out_len] = '\0';
-
- return 0;
- err:
- if (stream) {
- inflateEnd(stream);
- tor_free(stream);
- }
- if (*out) {
- tor_free(*out);
- }
- return -1;
-}
-
-/** Try to tell whether the <b>in_len</b>-byte string in <b>in</b> is likely
- * to be compressed or not. If it is, return the likeliest compression method.
- * Otherwise, return UNKNOWN_METHOD.
- */
-compress_method_t
-detect_compression_method(const char *in, size_t in_len)
-{
- if (in_len > 2 && fast_memeq(in, "\x1f\x8b", 2)) {
- return GZIP_METHOD;
- } else if (in_len > 2 && (in[0] & 0x0f) == 8 &&
- (ntohs(get_uint16(in)) % 31) == 0) {
- return ZLIB_METHOD;
- } else {
- return UNKNOWN_METHOD;
- }
-}
-
-/** Internal state for an incremental zlib compression/decompression. The
- * body of this struct is not exposed. */
-struct tor_zlib_state_t {
- struct z_stream_s stream; /**< The zlib stream */
- int compress; /**< True if we are compressing; false if we are inflating */
-
- /** Number of bytes read so far. Used to detect zlib bombs. */
- size_t input_so_far;
- /** Number of bytes written so far. Used to detect zlib bombs. */
- size_t output_so_far;
-
- /** Approximate number of bytes allocated for this object. */
- size_t allocation;
-};
-
-/** Construct and return a tor_zlib_state_t object using <b>method</b>. If
- * <b>compress</b>, it's for compression; otherwise it's for
- * decompression. */
-tor_zlib_state_t *
-tor_zlib_new(int compress_, compress_method_t method,
- zlib_compression_level_t compression_level)
-{
- tor_zlib_state_t *out;
- int bits, memlevel;
-
- if (! compress_) {
- /* use this setting for decompression, since we might have the
- * max number of window bits */
- compression_level = HIGH_COMPRESSION;
- }
-
- out = tor_malloc_zero(sizeof(tor_zlib_state_t));
- out->stream.zalloc = Z_NULL;
- out->stream.zfree = Z_NULL;
- out->stream.opaque = NULL;
- out->compress = compress_;
- bits = method_bits(method, compression_level);
- memlevel = get_memlevel(compression_level);
- if (compress_) {
- if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED,
- bits, memlevel,
- Z_DEFAULT_STRATEGY) != Z_OK)
- goto err; // LCOV_EXCL_LINE
- } else {
- if (inflateInit2(&out->stream, bits) != Z_OK)
- goto err; // LCOV_EXCL_LINE
- }
- out->allocation = tor_zlib_state_size_precalc(!compress_, bits, memlevel);
-
- total_zlib_allocation += out->allocation;
-
- return out;
-
- err:
- tor_free(out);
- return NULL;
-}
-
-/** Compress/decompress some bytes using <b>state</b>. Read up to
- * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes
- * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true,
- * we've reached the end of the input.
- *
- * Return TOR_ZLIB_DONE if we've finished the entire compression/decompression.
- * Return TOR_ZLIB_OK if we're processed everything from the input.
- * Return TOR_ZLIB_BUF_FULL if we're out of space on <b>out</b>.
- * Return TOR_ZLIB_ERR if the stream is corrupt.
- */
-tor_zlib_output_t
-tor_zlib_process(tor_zlib_state_t *state,
- char **out, size_t *out_len,
- const char **in, size_t *in_len,
- int finish)
-{
- int err;
- tor_assert(*in_len <= UINT_MAX);
- tor_assert(*out_len <= UINT_MAX);
- state->stream.next_in = (unsigned char*) *in;
- state->stream.avail_in = (unsigned int)*in_len;
- state->stream.next_out = (unsigned char*) *out;
- state->stream.avail_out = (unsigned int)*out_len;
-
- if (state->compress) {
- err = deflate(&state->stream, finish ? Z_FINISH : Z_NO_FLUSH);
- } else {
- err = inflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH);
- }
-
- state->input_so_far += state->stream.next_in - ((unsigned char*)*in);
- state->output_so_far += state->stream.next_out - ((unsigned char*)*out);
-
- *out = (char*) state->stream.next_out;
- *out_len = state->stream.avail_out;
- *in = (const char *) state->stream.next_in;
- *in_len = state->stream.avail_in;
-
- if (! state->compress &&
- is_compression_bomb(state->input_so_far, state->output_so_far)) {
- log_warn(LD_DIR, "Possible zlib bomb; abandoning stream.");
- return TOR_ZLIB_ERR;
- }
-
- switch (err)
- {
- case Z_STREAM_END:
- return TOR_ZLIB_DONE;
- case Z_BUF_ERROR:
- if (state->stream.avail_in == 0 && !finish)
- return TOR_ZLIB_OK;
- return TOR_ZLIB_BUF_FULL;
- case Z_OK:
- if (state->stream.avail_out == 0 || finish)
- return TOR_ZLIB_BUF_FULL;
- return TOR_ZLIB_OK;
- default:
- log_warn(LD_GENERAL, "Gzip returned an error: %s",
- state->stream.msg ? state->stream.msg : "<no message>");
- return TOR_ZLIB_ERR;
- }
-}
-
-/** Deallocate <b>state</b>. */
-void
-tor_zlib_free(tor_zlib_state_t *state)
-{
- if (!state)
- return;
-
- total_zlib_allocation -= state->allocation;
-
- if (state->compress)
- deflateEnd(&state->stream);
- else
- inflateEnd(&state->stream);
-
- tor_free(state);
-}
-
-/** Return an approximate number of bytes used in RAM to hold a state with
- * window bits <b>windowBits</b> and compression level 'memlevel' */
-static size_t
-tor_zlib_state_size_precalc(int inflate_, int windowbits, int memlevel)
-{
- windowbits &= 15;
-
-#define A_FEW_KILOBYTES 2048
-
- if (inflate_) {
- /* From zconf.h:
-
- "The memory requirements for inflate are (in bytes) 1 << windowBits
- that is, 32K for windowBits=15 (default value) plus a few kilobytes
- for small objects."
- */
- return sizeof(tor_zlib_state_t) + sizeof(struct z_stream_s) +
- (1 << 15) + A_FEW_KILOBYTES;
- } else {
- /* Also from zconf.h:
-
- "The memory requirements for deflate are (in bytes):
- (1 << (windowBits+2)) + (1 << (memLevel+9))
- ... plus a few kilobytes for small objects."
- */
- return sizeof(tor_zlib_state_t) + sizeof(struct z_stream_s) +
- (1 << (windowbits + 2)) + (1 << (memlevel + 9)) + A_FEW_KILOBYTES;
- }
-#undef A_FEW_KILOBYTES
-}
-
-/** Return the approximate number of bytes allocated for <b>state</b>. */
-size_t
-tor_zlib_state_size(const tor_zlib_state_t *state)
-{
- return state->allocation;
-}
-
-/** Return the approximate number of bytes allocated for all zlib states. */
-size_t
-tor_zlib_get_total_allocation(void)
-{
- return total_zlib_allocation;
-}
-
diff --git a/src/common/torgzip.h b/src/common/torgzip.h
deleted file mode 100644
index 00f62dcb45..0000000000
--- a/src/common/torgzip.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Copyright (c) 2003, Roger Dingledine
- * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
-/* See LICENSE for licensing information */
-
-/**
- * \file torgzip.h
- * \brief Headers for torgzip.h
- **/
-
-#ifndef TOR_TORGZIP_H
-#define TOR_TORGZIP_H
-
-/** Enumeration of what kind of compression to use. Only ZLIB_METHOD is
- * guaranteed to be supported by the compress/uncompress functions here;
- * GZIP_METHOD may be supported if we built against zlib version 1.2 or later
- * and is_gzip_supported() returns true. */
-typedef enum {
- NO_METHOD=0, GZIP_METHOD=1, ZLIB_METHOD=2, UNKNOWN_METHOD=3
-} compress_method_t;
-
-/**
- * Enumeration to define tradeoffs between memory usage and compression level.
- * HIGH_COMPRESSION saves the most bandwidth; LOW_COMPRESSION saves the most
- * memory.
- **/
-typedef enum {
- HIGH_COMPRESSION, MEDIUM_COMPRESSION, LOW_COMPRESSION
-} zlib_compression_level_t;
-
-int
-tor_gzip_compress(char **out, size_t *out_len,
- const char *in, size_t in_len,
- compress_method_t method);
-int
-tor_gzip_uncompress(char **out, size_t *out_len,
- const char *in, size_t in_len,
- compress_method_t method,
- int complete_only,
- int protocol_warn_level);
-
-int is_gzip_supported(void);
-
-const char *
-tor_zlib_get_version_str(void);
-
-const char *
-tor_zlib_get_header_version_str(void);
-
-compress_method_t detect_compression_method(const char *in, size_t in_len);
-
-/** Return values from tor_zlib_process; see that function's documentation for
- * details. */
-typedef enum {
- TOR_ZLIB_OK, TOR_ZLIB_DONE, TOR_ZLIB_BUF_FULL, TOR_ZLIB_ERR
-} tor_zlib_output_t;
-/** Internal state for an incremental zlib compression/decompression. */
-typedef struct tor_zlib_state_t tor_zlib_state_t;
-tor_zlib_state_t *tor_zlib_new(int compress, compress_method_t method,
- zlib_compression_level_t level);
-
-tor_zlib_output_t tor_zlib_process(tor_zlib_state_t *state,
- char **out, size_t *out_len,
- const char **in, size_t *in_len,
- int finish);
-void tor_zlib_free(tor_zlib_state_t *state);
-
-size_t tor_zlib_state_size(const tor_zlib_state_t *state);
-size_t tor_zlib_get_total_allocation(void);
-
-#endif
-
diff --git a/src/common/torint.h b/src/common/torint.h
index 58c30f41a8..ee31459e94 100644
--- a/src/common/torint.h
+++ b/src/common/torint.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/torlog.h b/src/common/torlog.h
index bc957858d9..6e374b1c11 100644
--- a/src/common/torlog.h
+++ b/src/common/torlog.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -101,8 +101,10 @@
#define LD_SCHED (1u<<22)
/** Guard nodes */
#define LD_GUARD (1u<<23)
+/** Generation and application of consensus diffs. */
+#define LD_CONSDIFF (1u<<24)
/** Number of logging domains in the code. */
-#define N_LOGGING_DOMAINS 24
+#define N_LOGGING_DOMAINS 25
/** This log message is not safe to send to a callback-based logger
* immediately. Used as a flag, not a log domain. */
diff --git a/src/common/tortls.c b/src/common/tortls.c
index 1fe91edf0e..fadf52fa0a 100644
--- a/src/common/tortls.c
+++ b/src/common/tortls.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -17,6 +17,7 @@
#include "orconfig.h"
#define TORTLS_PRIVATE
+#define TORTLS_OPENSSL_PRIVATE
#include <assert.h>
#ifdef _WIN32 /*wrkard for dtls1.h >= 0.9.8m of "#include <winsock.h>"*/
@@ -483,8 +484,22 @@ MOCK_IMPL(STATIC X509 *,
* then we might pick a time where we're about to expire. Lastly, be
* sure to start on a day boundary. */
time_t now = time(NULL);
- start_time = crypto_rand_time_range(now - cert_lifetime, now) + 2*24*3600;
- start_time -= start_time % (24*3600);
+ /* Our certificate lifetime will be cert_lifetime no matter what, but if we
+ * start cert_lifetime in the past, we'll have 0 real lifetime. instead we
+ * start up to (cert_lifetime - min_real_lifetime - start_granularity) in
+ * the past. */
+ const time_t min_real_lifetime = 24*3600;
+ const time_t start_granularity = 24*3600;
+ time_t earliest_start_time = now - cert_lifetime + min_real_lifetime
+ + start_granularity;
+ /* Don't actually start in the future! */
+ if (earliest_start_time >= now)
+ earliest_start_time = now - 1;
+ start_time = crypto_rand_time_range(earliest_start_time, now);
+ /* Round the start time back to the start of a day. */
+ start_time -= start_time % start_granularity;
+
+ end_time = start_time + cert_lifetime;
tor_assert(rsa);
tor_assert(cname);
@@ -518,7 +533,6 @@ MOCK_IMPL(STATIC X509 *,
if (!X509_time_adj(X509_get_notBefore(x509),0,&start_time))
goto error;
- end_time = start_time + cert_lifetime;
if (!X509_time_adj(X509_get_notAfter(x509),0,&end_time))
goto error;
if (!X509_set_pubkey(x509, pkey))
@@ -2250,6 +2264,24 @@ check_cert_lifetime_internal(int severity, const X509 *cert,
return 0;
}
+#ifdef TOR_UNIT_TESTS
+/* Testing only: return a new x509 cert with the same contents as <b>inp</b>,
+ but with the expiration time <b>new_expiration_time</b>, signed with
+ <b>signing_key</b>. */
+STATIC tor_x509_cert_t *
+tor_x509_cert_replace_expiration(const tor_x509_cert_t *inp,
+ time_t new_expiration_time,
+ crypto_pk_t *signing_key)
+{
+ X509 *newc = X509_dup(inp->cert);
+ X509_time_adj(X509_get_notAfter(newc), 0, &new_expiration_time);
+ EVP_PKEY *pk = crypto_pk_get_evp_pkey_(signing_key, 1);
+ tor_assert(X509_sign(newc, pk, EVP_sha256()));
+ EVP_PKEY_free(pk);
+ return tor_x509_cert_new(newc);
+}
+#endif
+
/** Return the number of bytes available for reading from <b>tls</b>.
*/
int
diff --git a/src/common/tortls.h b/src/common/tortls.h
index 6510fdbe64..fd0186cf90 100644
--- a/src/common/tortls.h
+++ b/src/common/tortls.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_TORTLS_H
@@ -63,12 +63,17 @@ typedef enum {
} tor_tls_state_t;
#define tor_tls_state_bitfield_t ENUM_BF(tor_tls_state_t)
+struct x509_st;
+struct ssl_st;
+struct ssl_ctx_st;
+struct ssl_session_st;
+
/** Holds a SSL_CTX object and related state used to configure TLS
* connections.
*/
typedef struct tor_tls_context_t {
int refcnt;
- SSL_CTX *ctx;
+ struct ssl_ctx_st *ctx;
tor_x509_cert_t *my_link_cert;
tor_x509_cert_t *my_id_cert;
tor_x509_cert_t *my_auth_cert;
@@ -78,7 +83,7 @@ typedef struct tor_tls_context_t {
/** Structure that we use for a single certificate. */
struct tor_x509_cert_t {
- X509 *cert;
+ struct x509_st *cert;
uint8_t *encoded;
size_t encoded_len;
unsigned pkey_digests_set : 1;
@@ -92,7 +97,7 @@ struct tor_x509_cert_t {
struct tor_tls_t {
uint32_t magic;
tor_tls_context_t *context; /** A link to the context object for this tls. */
- SSL *ssl; /**< An OpenSSL SSL object. */
+ struct ssl_st *ssl; /**< An OpenSSL SSL object. */
int socket; /**< The underlying file descriptor for this TLS connection. */
char *address; /**< An address to log when describing this connection. */
tor_tls_state_bitfield_t state : 3; /**< The current SSL state,
@@ -128,35 +133,45 @@ struct tor_tls_t {
STATIC int tor_errno_to_tls_error(int e);
STATIC int tor_tls_get_error(tor_tls_t *tls, int r, int extra,
const char *doing, int severity, int domain);
-STATIC tor_tls_t *tor_tls_get_by_ssl(const SSL *ssl);
+STATIC tor_tls_t *tor_tls_get_by_ssl(const struct ssl_st *ssl);
STATIC void tor_tls_allocate_tor_tls_object_ex_data_index(void);
+#ifdef TORTLS_OPENSSL_PRIVATE
STATIC int always_accept_verify_cb(int preverify_ok, X509_STORE_CTX *x509_ctx);
-STATIC int tor_tls_classify_client_ciphers(const SSL *ssl,
+STATIC int tor_tls_classify_client_ciphers(const struct ssl_st *ssl,
STACK_OF(SSL_CIPHER) *peer_ciphers);
-STATIC int tor_tls_client_is_using_v2_ciphers(const SSL *ssl);
+#endif
+STATIC int tor_tls_client_is_using_v2_ciphers(const struct ssl_st *ssl);
MOCK_DECL(STATIC void, try_to_extract_certs_from_tls,
- (int severity, tor_tls_t *tls, X509 **cert_out, X509 **id_cert_out));
+ (int severity, tor_tls_t *tls, struct x509_st **cert_out,
+ struct x509_st **id_cert_out));
#ifndef HAVE_SSL_SESSION_GET_MASTER_KEY
-STATIC size_t SSL_SESSION_get_master_key(SSL_SESSION *s, uint8_t *out,
+STATIC size_t SSL_SESSION_get_master_key(struct ssl_session_st *s,
+ uint8_t *out,
size_t len);
#endif
-STATIC void tor_tls_debug_state_callback(const SSL *ssl, int type, int val);
-STATIC void tor_tls_server_info_callback(const SSL *ssl, int type, int val);
-STATIC int tor_tls_session_secret_cb(SSL *ssl, void *secret,
+STATIC void tor_tls_debug_state_callback(const struct ssl_st *ssl,
+ int type, int val);
+STATIC void tor_tls_server_info_callback(const struct ssl_st *ssl,
+ int type, int val);
+#ifdef TORTLS_OPENSSL_PRIVATE
+STATIC int tor_tls_session_secret_cb(struct ssl_st *ssl, void *secret,
int *secret_len,
STACK_OF(SSL_CIPHER) *peer_ciphers,
CONST_IF_OPENSSL_1_1_API SSL_CIPHER **cipher,
void *arg);
STATIC int find_cipher_by_id(const SSL *ssl, const SSL_METHOD *m,
uint16_t cipher);
-MOCK_DECL(STATIC X509*, tor_tls_create_certificate,(crypto_pk_t *rsa,
+#endif
+MOCK_DECL(STATIC struct x509_st *, tor_tls_create_certificate,
+ (crypto_pk_t *rsa,
crypto_pk_t *rsa_sign,
const char *cname,
const char *cname_sign,
unsigned int cert_lifetime));
STATIC tor_tls_context_t *tor_tls_context_new(crypto_pk_t *identity,
unsigned int key_lifetime, unsigned flags, int is_client);
-MOCK_DECL(STATIC tor_x509_cert_t *, tor_x509_cert_new,(X509 *x509_cert));
+MOCK_DECL(STATIC tor_x509_cert_t *, tor_x509_cert_new,
+ (struct x509_st *x509_cert));
STATIC int tor_tls_context_init_one(tor_tls_context_t **ppcontext,
crypto_pk_t *identity,
unsigned int key_lifetime,
@@ -172,6 +187,11 @@ extern tor_tls_context_t *client_tls_context;
extern uint16_t v2_cipher_list[];
extern uint64_t total_bytes_written_over_tls;
extern uint64_t total_bytes_written_by_tls;
+
+STATIC tor_x509_cert_t *tor_x509_cert_replace_expiration(
+ const tor_x509_cert_t *inp,
+ time_t new_expiration_time,
+ crypto_pk_t *signing_key);
#endif
#endif /* endif TORTLS_PRIVATE */
diff --git a/src/common/util.c b/src/common/util.c
index f980fa296c..ca2a0c4a9c 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -2118,7 +2118,7 @@ read_all(tor_socket_t fd, char *buf, size_t count, int isSocket)
return -1;
}
- while (numread != count) {
+ while (numread < count) {
if (isSocket)
result = tor_socket_recv(fd, buf+numread, count-numread, 0);
else
@@ -3045,137 +3045,6 @@ unescape_string(const char *s, char **result, size_t *size_out)
}
}
-/** Given a string containing part of a configuration file or similar format,
- * advance past comments and whitespace and try to parse a single line. If we
- * parse a line successfully, set *<b>key_out</b> to a new string holding the
- * key portion and *<b>value_out</b> to a new string holding the value portion
- * of the line, and return a pointer to the start of the next line. If we run
- * out of data, return a pointer to the end of the string. If we encounter an
- * error, return NULL and set *<b>err_out</b> (if provided) to an error
- * message.
- */
-const char *
-parse_config_line_from_str_verbose(const char *line, char **key_out,
- char **value_out,
- const char **err_out)
-{
- /*
- See torrc_format.txt for a description of the (silly) format this parses.
- */
- const char *key, *val, *cp;
- int continuation = 0;
-
- tor_assert(key_out);
- tor_assert(value_out);
-
- *key_out = *value_out = NULL;
- key = val = NULL;
- /* Skip until the first keyword. */
- while (1) {
- while (TOR_ISSPACE(*line))
- ++line;
- if (*line == '#') {
- while (*line && *line != '\n')
- ++line;
- } else {
- break;
- }
- }
-
- if (!*line) { /* End of string? */
- *key_out = *value_out = NULL;
- return line;
- }
-
- /* Skip until the next space or \ followed by newline. */
- key = line;
- while (*line && !TOR_ISSPACE(*line) && *line != '#' &&
- ! (line[0] == '\\' && line[1] == '\n'))
- ++line;
- *key_out = tor_strndup(key, line-key);
-
- /* Skip until the value. */
- while (*line == ' ' || *line == '\t')
- ++line;
-
- val = line;
-
- /* Find the end of the line. */
- if (*line == '\"') { // XXX No continuation handling is done here
- if (!(line = unescape_string(line, value_out, NULL))) {
- if (err_out)
- *err_out = "Invalid escape sequence in quoted string";
- return NULL;
- }
- while (*line == ' ' || *line == '\t')
- ++line;
- if (*line == '\r' && *(++line) == '\n')
- ++line;
- if (*line && *line != '#' && *line != '\n') {
- if (err_out)
- *err_out = "Excess data after quoted string";
- return NULL;
- }
- } else {
- /* Look for the end of the line. */
- while (*line && *line != '\n' && (*line != '#' || continuation)) {
- if (*line == '\\' && line[1] == '\n') {
- continuation = 1;
- line += 2;
- } else if (*line == '#') {
- do {
- ++line;
- } while (*line && *line != '\n');
- if (*line == '\n')
- ++line;
- } else {
- ++line;
- }
- }
-
- if (*line == '\n') {
- cp = line++;
- } else {
- cp = line;
- }
- /* Now back cp up to be the last nonspace character */
- while (cp>val && TOR_ISSPACE(*(cp-1)))
- --cp;
-
- tor_assert(cp >= val);
-
- /* Now copy out and decode the value. */
- *value_out = tor_strndup(val, cp-val);
- if (continuation) {
- char *v_out, *v_in;
- v_out = v_in = *value_out;
- while (*v_in) {
- if (*v_in == '#') {
- do {
- ++v_in;
- } while (*v_in && *v_in != '\n');
- if (*v_in == '\n')
- ++v_in;
- } else if (v_in[0] == '\\' && v_in[1] == '\n') {
- v_in += 2;
- } else {
- *v_out++ = *v_in++;
- }
- }
- *v_out = '\0';
- }
- }
-
- if (*line == '#') {
- do {
- ++line;
- } while (*line && *line != '\n');
- }
- while (TOR_ISSPACE(*line)) ++line;
-
- return line;
-}
-
/** Expand any homedir prefix on <b>filename</b>; return a newly allocated
* string. */
char *
@@ -4175,10 +4044,10 @@ tor_process_get_stdout_pipe(process_handle_t *process_handle)
}
#else
/* DOCDOC tor_process_get_stdout_pipe */
-FILE *
+int
tor_process_get_stdout_pipe(process_handle_t *process_handle)
{
- return process_handle->stdout_handle;
+ return process_handle->stdout_pipe;
}
#endif
@@ -4609,10 +4478,6 @@ tor_spawn_background(const char *const filename, const char **argv,
log_warn(LD_GENERAL, "Failed to set stderror/stdout/stdin pipes "
"nonblocking in parent process: %s", strerror(errno));
}
- /* Open the buffered IO streams */
- process_handle->stdout_handle = fdopen(process_handle->stdout_pipe, "r");
- process_handle->stderr_handle = fdopen(process_handle->stderr_pipe, "r");
- process_handle->stdin_handle = fdopen(process_handle->stdin_pipe, "r");
*process_handle_out = process_handle;
return process_handle->status;
@@ -4659,14 +4524,9 @@ tor_process_handle_destroy,(process_handle_t *process_handle,
if (process_handle->stdin_pipe)
CloseHandle(process_handle->stdin_pipe);
#else
- if (process_handle->stdout_handle)
- fclose(process_handle->stdout_handle);
-
- if (process_handle->stderr_handle)
- fclose(process_handle->stderr_handle);
-
- if (process_handle->stdin_handle)
- fclose(process_handle->stdin_handle);
+ close(process_handle->stdout_pipe);
+ close(process_handle->stderr_pipe);
+ close(process_handle->stdin_pipe);
clear_waitpid_callback(process_handle->waitpid_cb);
#endif
@@ -4952,7 +4812,7 @@ tor_read_all_handle(HANDLE h, char *buf, size_t count,
if (count > SIZE_T_CEILING || count > SSIZE_MAX)
return -1;
- while (numread != count) {
+ while (numread < count) {
/* Check if there is anything to read */
retval = PeekNamedPipe(h, NULL, 0, NULL, &byte_count, NULL);
if (!retval) {
@@ -4998,19 +4858,19 @@ tor_read_all_handle(HANDLE h, char *buf, size_t count,
return (ssize_t)numread;
}
#else
-/** Read from a handle <b>h</b> into <b>buf</b>, up to <b>count</b> bytes. If
+/** Read from a handle <b>fd</b> into <b>buf</b>, up to <b>count</b> bytes. If
* <b>process</b> is NULL, the function will return immediately if there is
* nothing more to read. Otherwise data will be read until end of file, or
* <b>count</b> bytes are read. Returns the number of bytes read, or -1 on
* error. Sets <b>eof</b> to true if <b>eof</b> is not NULL and the end of the
* file has been reached. */
ssize_t
-tor_read_all_handle(FILE *h, char *buf, size_t count,
+tor_read_all_handle(int fd, char *buf, size_t count,
const process_handle_t *process,
int *eof)
{
size_t numread = 0;
- char *retval;
+ ssize_t result;
if (eof)
*eof = 0;
@@ -5018,34 +4878,28 @@ tor_read_all_handle(FILE *h, char *buf, size_t count,
if (count > SIZE_T_CEILING || count > SSIZE_MAX)
return -1;
- while (numread != count) {
- /* Use fgets because that is what we use in log_from_pipe() */
- retval = fgets(buf+numread, (int)(count-numread), h);
- if (NULL == retval) {
- if (feof(h)) {
- log_debug(LD_GENERAL, "fgets() reached end of file");
- if (eof)
- *eof = 1;
+ while (numread < count) {
+ result = read(fd, buf+numread, count-numread);
+
+ if (result == 0) {
+ log_debug(LD_GENERAL, "read() reached end of file");
+ if (eof)
+ *eof = 1;
+ break;
+ } else if (result < 0 && errno == EAGAIN) {
+ if (process)
+ continue;
+ else
break;
- } else {
- if (EAGAIN == errno) {
- if (process)
- continue;
- else
- break;
- } else {
- log_warn(LD_GENERAL, "fgets() from handle failed: %s",
- strerror(errno));
- return -1;
- }
- }
+ } else if (result < 0) {
+ log_warn(LD_GENERAL, "read() failed: %s", strerror(errno));
+ return -1;
}
- tor_assert(retval != NULL);
- tor_assert(strlen(retval) + numread <= count);
- numread += strlen(retval);
+
+ numread += result;
}
- log_debug(LD_GENERAL, "fgets() read %d bytes from handle", (int)numread);
+ log_debug(LD_GENERAL, "read() read %d bytes from handle", (int)numread);
return (ssize_t)numread;
}
#endif
@@ -5059,7 +4913,7 @@ tor_read_all_from_process_stdout(const process_handle_t *process_handle,
return tor_read_all_handle(process_handle->stdout_pipe, buf, count,
process_handle);
#else
- return tor_read_all_handle(process_handle->stdout_handle, buf, count,
+ return tor_read_all_handle(process_handle->stdout_pipe, buf, count,
process_handle, NULL);
#endif
}
@@ -5073,7 +4927,7 @@ tor_read_all_from_process_stderr(const process_handle_t *process_handle,
return tor_read_all_handle(process_handle->stderr_pipe, buf, count,
process_handle);
#else
- return tor_read_all_handle(process_handle->stderr_handle, buf, count,
+ return tor_read_all_handle(process_handle->stderr_pipe, buf, count,
process_handle, NULL);
#endif
}
@@ -5267,11 +5121,10 @@ log_from_handle(HANDLE *pipe, int severity)
#else
/** Return a smartlist containing lines outputted from
- * <b>handle</b>. Return NULL on error, and set
+ * <b>fd</b>. Return NULL on error, and set
* <b>stream_status_out</b> appropriately. */
MOCK_IMPL(smartlist_t *,
-tor_get_lines_from_handle, (FILE *handle,
- enum stream_status *stream_status_out))
+tor_get_lines_from_handle, (int fd, enum stream_status *stream_status_out))
{
enum stream_status stream_status;
char stdout_buf[400];
@@ -5280,13 +5133,13 @@ tor_get_lines_from_handle, (FILE *handle,
while (1) {
memset(stdout_buf, 0, sizeof(stdout_buf));
- stream_status = get_string_from_pipe(handle,
+ stream_status = get_string_from_pipe(fd,
stdout_buf, sizeof(stdout_buf) - 1);
if (stream_status != IO_STREAM_OKAY)
goto done;
if (!lines) lines = smartlist_new();
- smartlist_add_strdup(lines, stdout_buf);
+ smartlist_split_string(lines, stdout_buf, "\n", 0, 0);
}
done:
@@ -5294,20 +5147,20 @@ tor_get_lines_from_handle, (FILE *handle,
return lines;
}
-/** Read from stream, and send lines to log at the specified log level.
+/** Read from fd, and send lines to log at the specified log level.
* Returns 1 if stream is closed normally, -1 if there is a error reading, and
* 0 otherwise. Handles lines from tor-fw-helper and
* tor_spawn_background() specially.
*/
static int
-log_from_pipe(FILE *stream, int severity, const char *executable,
+log_from_pipe(int fd, int severity, const char *executable,
int *child_status)
{
char buf[256];
enum stream_status r;
for (;;) {
- r = get_string_from_pipe(stream, buf, sizeof(buf) - 1);
+ r = get_string_from_pipe(fd, buf, sizeof(buf) - 1);
if (r == IO_STREAM_CLOSED) {
return 1;
@@ -5332,7 +5185,7 @@ log_from_pipe(FILE *stream, int severity, const char *executable,
}
#endif
-/** Reads from <b>stream</b> and stores input in <b>buf_out</b> making
+/** Reads from <b>fd</b> and stores input in <b>buf_out</b> making
* sure it's below <b>count</b> bytes.
* If the string has a trailing newline, we strip it off.
*
@@ -5348,52 +5201,28 @@ log_from_pipe(FILE *stream, int severity, const char *executable,
* IO_STREAM_OKAY: If everything went okay and we got a string
* in <b>buf_out</b>. */
enum stream_status
-get_string_from_pipe(FILE *stream, char *buf_out, size_t count)
+get_string_from_pipe(int fd, char *buf_out, size_t count)
{
- char *retval;
- size_t len;
+ ssize_t ret;
tor_assert(count <= INT_MAX);
- retval = fgets(buf_out, (int)count, stream);
+ ret = read(fd, buf_out, count);
- if (!retval) {
- if (feof(stream)) {
- /* Program has closed stream (probably it exited) */
- /* TODO: check error */
- return IO_STREAM_CLOSED;
- } else {
- if (EAGAIN == errno) {
- /* Nothing more to read, try again next time */
- return IO_STREAM_EAGAIN;
- } else {
- /* There was a problem, abandon this child process */
- return IO_STREAM_TERM;
- }
- }
- } else {
- len = strlen(buf_out);
- if (len == 0) {
- /* this probably means we got a NUL at the start of the string. */
- return IO_STREAM_EAGAIN;
- }
+ if (ret == 0)
+ return IO_STREAM_CLOSED;
+ else if (ret < 0 && errno == EAGAIN)
+ return IO_STREAM_EAGAIN;
+ else if (ret < 0)
+ return IO_STREAM_TERM;
- if (buf_out[len - 1] == '\n') {
- /* Remove the trailing newline */
- buf_out[len - 1] = '\0';
- } else {
- /* No newline; check whether we overflowed the buffer */
- if (!feof(stream))
- log_info(LD_GENERAL,
- "Line from stream was truncated: %s", buf_out);
- /* TODO: What to do with this error? */
- }
-
- return IO_STREAM_OKAY;
- }
+ if (buf_out[ret - 1] == '\n') {
+ /* Remove the trailing newline */
+ buf_out[ret - 1] = '\0';
+ } else
+ buf_out[ret] = '\0';
- /* We should never get here */
- return IO_STREAM_TERM;
+ return IO_STREAM_OKAY;
}
/** Parse a <b>line</b> from tor-fw-helper and issue an appropriate
@@ -5630,7 +5459,7 @@ tor_check_port_forwarding(const char *filename,
#ifdef _WIN32
stderr_status = log_from_handle(child_handle->stderr_pipe, LOG_INFO);
#else
- stderr_status = log_from_pipe(child_handle->stderr_handle,
+ stderr_status = log_from_pipe(child_handle->stderr_pipe,
LOG_INFO, filename, &retval);
#endif
if (handle_fw_helper_output(filename, child_handle) < 0) {
diff --git a/src/common/util.h b/src/common/util.h
index 13fcc5142d..18eb57f1bc 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -163,9 +163,9 @@ int64_t clamp_double_to_int64(double number);
void simplify_fraction64(uint64_t *numer, uint64_t *denom);
/* Compute the CEIL of <b>a</b> divided by <b>b</b>, for nonnegative <b>a</b>
- * and positive <b>b</b>. Works on integer types only. Not defined if a+b can
- * overflow. */
-#define CEIL_DIV(a,b) (((a)+(b)-1)/(b))
+ * and positive <b>b</b>. Works on integer types only. Not defined if a+(b-1)
+ * can overflow. */
+#define CEIL_DIV(a,b) (((a)+((b)-1))/(b))
/* Return <b>v</b> if it's between <b>min</b> and <b>max</b>. Otherwise
* return <b>min</b> if <b>v</b> is smaller than <b>min</b>, or <b>max</b> if
@@ -322,7 +322,7 @@ enum stream_status {
const char *stream_status_to_string(enum stream_status stream_status);
-enum stream_status get_string_from_pipe(FILE *stream, char *buf, size_t count);
+enum stream_status get_string_from_pipe(int fd, char *buf, size_t count);
MOCK_DECL(int,tor_unlink,(const char *pathname));
@@ -389,9 +389,6 @@ char *read_file_to_str_until_eof(int fd, size_t max_bytes_to_read,
size_t *sz_out)
ATTR_MALLOC;
const char *unescape_string(const char *s, char **result, size_t *size_out);
-const char *parse_config_line_from_str_verbose(const char *line,
- char **key_out, char **value_out,
- const char **err_out);
char *expand_filename(const char *filename);
MOCK_DECL(struct smartlist_t *, tor_listdir, (const char *dirname));
int path_is_relative(const char *filename);
@@ -463,9 +460,6 @@ struct process_handle_t {
int stdin_pipe;
int stdout_pipe;
int stderr_pipe;
- FILE *stdin_handle;
- FILE *stdout_handle;
- FILE *stderr_handle;
pid_t pid;
/** If the process has not given us a SIGCHLD yet, this has the
* waitpid_callback_t that gets invoked once it has. Otherwise this
@@ -488,7 +482,7 @@ int tor_split_lines(struct smartlist_t *sl, char *buf, int len);
ssize_t tor_read_all_handle(HANDLE h, char *buf, size_t count,
const process_handle_t *process);
#else
-ssize_t tor_read_all_handle(FILE *h, char *buf, size_t count,
+ssize_t tor_read_all_handle(int fd, char *buf, size_t count,
const process_handle_t *process,
int *eof);
#endif
@@ -502,7 +496,7 @@ int tor_process_get_pid(process_handle_t *process_handle);
#ifdef _WIN32
HANDLE tor_process_get_stdout_pipe(process_handle_t *process_handle);
#else
-FILE *tor_process_get_stdout_pipe(process_handle_t *process_handle);
+int tor_process_get_stdout_pipe(process_handle_t *process_handle);
#endif
#ifdef _WIN32
@@ -511,7 +505,7 @@ tor_get_lines_from_handle,(HANDLE *handle,
enum stream_status *stream_status));
#else
MOCK_DECL(struct smartlist_t *,
-tor_get_lines_from_handle,(FILE *handle,
+tor_get_lines_from_handle,(int fd,
enum stream_status *stream_status));
#endif
diff --git a/src/common/util_bug.c b/src/common/util_bug.c
index c7bfdefe80..3d990e3700 100644
--- a/src/common/util_bug.c
+++ b/src/common/util_bug.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/util_bug.h b/src/common/util_bug.h
index e02778110b..7879f880ec 100644
--- a/src/common/util_bug.h
+++ b/src/common/util_bug.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/util_format.c b/src/common/util_format.c
index 6e0a04586a..1f7b8b03aa 100644
--- a/src/common/util_format.c
+++ b/src/common/util_format.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -22,13 +22,16 @@
#include <stdlib.h>
/* Return the base32 encoded size in bytes using the source length srclen.
- * The NUL terminated byte is added as well since every base32 encoding
- * requires enough space for it. */
+ *
+ * (WATCH OUT: This API counts the terminating NUL byte, but
+ * base64_encode_size does not.)
+ */
size_t
base32_encoded_size(size_t srclen)
{
size_t enclen;
- enclen = CEIL_DIV(srclen*8, 5) + 1;
+ tor_assert(srclen < SIZE_T_CEILING / 8);
+ enclen = BASE32_NOPAD_BUFSIZE(srclen);
tor_assert(enclen < INT_MAX && enclen > srclen);
return enclen;
}
@@ -41,7 +44,6 @@ base32_encode(char *dest, size_t destlen, const char *src, size_t srclen)
size_t nbits = srclen * 8;
size_t bit;
- tor_assert(srclen < SIZE_T_CEILING/8);
/* We need enough space for the encoded data and the extra NUL byte. */
tor_assert(base32_encoded_size(srclen) <= destlen);
tor_assert(destlen < SIZE_T_CEILING);
@@ -51,9 +53,10 @@ base32_encode(char *dest, size_t destlen, const char *src, size_t srclen)
for (i=0,bit=0; bit < nbits; ++i, bit+=5) {
/* set v to the 16-bit value starting at src[bits/8], 0-padded. */
- v = ((uint8_t)src[bit/8]) << 8;
- if (bit+5<nbits)
- v += (uint8_t)src[(bit/8)+1];
+ size_t idx = bit / 8;
+ v = ((uint8_t)src[idx]) << 8;
+ if (idx+1 < srclen)
+ v += (uint8_t)src[idx+1];
/* set u to the 5-bit value at the bit'th bit of buf. */
u = (v >> (11-(bit%8))) & 0x1F;
dest[i] = BASE32_CHARS[u];
@@ -133,6 +136,9 @@ base32_decode(char *dest, size_t destlen, const char *src, size_t srclen)
/** Return the Base64 encoded size of <b>srclen</b> bytes of data in
* bytes.
*
+ * (WATCH OUT: This API <em>does not</em> count the terminating NUL byte,
+ * but base32_encoded_size does.)
+ *
* If <b>flags</b>&amp;BASE64_ENCODE_MULTILINE is true, return the size
* of the encoded output as multiline output (64 character, `\n' terminated
* lines).
@@ -141,19 +147,16 @@ size_t
base64_encode_size(size_t srclen, int flags)
{
size_t enclen;
+
+ /* Use INT_MAX for overflow checking because base64_encode() returns int. */
tor_assert(srclen < INT_MAX);
+ tor_assert(CEIL_DIV(srclen, 3) < INT_MAX / 4);
- if (srclen == 0)
- return 0;
+ enclen = BASE64_LEN(srclen);
+ if (flags & BASE64_ENCODE_MULTILINE)
+ enclen += CEIL_DIV(enclen, BASE64_OPENSSL_LINELEN);
- enclen = ((srclen - 1) / 3) * 4 + 4;
- if (flags & BASE64_ENCODE_MULTILINE) {
- size_t remainder = enclen % BASE64_OPENSSL_LINELEN;
- enclen += enclen / BASE64_OPENSSL_LINELEN;
- if (remainder)
- enclen++;
- }
- tor_assert(enclen < INT_MAX && enclen > srclen);
+ tor_assert(enclen < INT_MAX && (enclen == 0 || enclen > srclen));
return enclen;
}
@@ -310,39 +313,6 @@ base64_encode_nopad(char *dest, size_t destlen,
return (int)(out - dest);
}
-/** As base64_decode, but do not require any padding on the input */
-int
-base64_decode_nopad(uint8_t *dest, size_t destlen,
- const char *src, size_t srclen)
-{
- if (srclen > SIZE_T_CEILING - 4)
- return -1;
- char *buf = tor_malloc(srclen + 4);
- memcpy(buf, src, srclen+1);
- size_t buflen;
- switch (srclen % 4)
- {
- case 0:
- default:
- buflen = srclen;
- break;
- case 1:
- tor_free(buf);
- return -1;
- case 2:
- memcpy(buf+srclen, "==", 3);
- buflen = srclen + 2;
- break;
- case 3:
- memcpy(buf+srclen, "=", 2);
- buflen = srclen + 1;
- break;
- }
- int n = base64_decode((char*)dest, destlen, buf, buflen);
- tor_free(buf);
- return n;
-}
-
#undef BASE64_OPENSSL_LINELEN
/** @{ */
@@ -392,15 +362,9 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen)
const char *eos = src+srclen;
uint32_t n=0;
int n_idx=0;
- char *dest_orig = dest;
+ size_t di = 0;
- /* Max number of bits == srclen*6.
- * Number of bytes required to hold all bits == (srclen*6)/8.
- * Yes, we want to round down: anything that hangs over the end of a
- * byte is padding. */
- if (!size_mul_check(srclen, 3) || destlen < (srclen*3)/4)
- return -1;
- if (destlen > SIZE_T_CEILING)
+ if (destlen > INT_MAX)
return -1;
/* Make sure we leave no uninitialized data in the destination buffer. */
@@ -428,9 +392,11 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen)
n = (n<<6) | v;
if ((++n_idx) == 4) {
/* We've accumulated 24 bits in n. Flush them. */
- *dest++ = (n>>16);
- *dest++ = (n>>8) & 0xff;
- *dest++ = (n) & 0xff;
+ if (destlen < 3 || di > destlen - 3)
+ return -1;
+ dest[di++] = (n>>16);
+ dest[di++] = (n>>8) & 0xff;
+ dest[di++] = (n) & 0xff;
n_idx = 0;
n = 0;
}
@@ -448,18 +414,21 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen)
return -1;
case 2:
/* 12 leftover bits: The last 4 are padding and the first 8 are data. */
- *dest++ = n >> 4;
+ if (destlen < 1 || di > destlen - 1)
+ return -1;
+ dest[di++] = n >> 4;
break;
case 3:
/* 18 leftover bits: The last 2 are padding and the first 16 are data. */
- *dest++ = n >> 10;
- *dest++ = n >> 2;
+ if (destlen < 2 || di > destlen - 2)
+ return -1;
+ dest[di++] = n >> 10;
+ dest[di++] = n >> 2;
}
- tor_assert((dest-dest_orig) <= (ssize_t)destlen);
- tor_assert((dest-dest_orig) <= INT_MAX);
+ tor_assert(di <= destlen);
- return (int)(dest-dest_orig);
+ return (int)di;
}
#undef X
#undef SP
@@ -475,7 +444,8 @@ base16_encode(char *dest, size_t destlen, const char *src, size_t srclen)
const char *end;
char *cp;
- tor_assert(destlen >= srclen*2+1);
+ tor_assert(srclen < SIZE_T_CEILING / 2 - 1);
+ tor_assert(destlen >= BASE16_BUFSIZE(srclen));
tor_assert(destlen < SIZE_T_CEILING);
/* Make sure we leave no uninitialized data in the destination buffer. */
diff --git a/src/common/util_format.h b/src/common/util_format.h
index 20ac711d10..adf48c0077 100644
--- a/src/common/util_format.h
+++ b/src/common/util_format.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_UTIL_FORMAT_H
@@ -10,6 +10,26 @@
#include "testsupport.h"
#include "torint.h"
+/** @{ */
+/** These macros don't check for overflow. Use them only for constant inputs
+ * (like array declarations). The *_LEN macros are the raw encoding lengths
+ * (without terminating NUL), while the *_BUFSIZE macros count the terminating
+ * NUL. */
+#define BASE64_LEN(n) (CEIL_DIV((n), 3) * 4)
+#define BASE32_LEN(n) (CEIL_DIV((n), 5) * 8)
+#define BASE16_LEN(n) ((n) * 2)
+
+#define BASE64_BUFSIZE(n) (BASE64_LEN(n) + 1)
+#define BASE32_BUFSIZE(n) (BASE32_LEN(n) + 1)
+#define BASE16_BUFSIZE(n) (BASE16_LEN(n) + 1)
+
+#define BASE64_NOPAD_LEN(n) (CEIL_DIV((n) * 4, 3)
+#define BASE32_NOPAD_LEN(n) (CEIL_DIV((n) * 8, 5)
+
+#define BASE64_NOPAD_BUFSIZE(n) (BASE64_NOPAD_LEN(n) + 1))
+#define BASE32_NOPAD_BUFSIZE(n) (BASE32_NOPAD_LEN(n) + 1))
+/** @} */
+
#define BASE64_ENCODE_MULTILINE 1
size_t base64_encode_size(size_t srclen, int flags);
int base64_encode(char *dest, size_t destlen, const char *src, size_t srclen,
@@ -17,8 +37,6 @@ int base64_encode(char *dest, size_t destlen, const char *src, size_t srclen,
int base64_decode(char *dest, size_t destlen, const char *src, size_t srclen);
int base64_encode_nopad(char *dest, size_t destlen,
const uint8_t *src, size_t srclen);
-int base64_decode_nopad(uint8_t *dest, size_t destlen,
- const char *src, size_t srclen);
/** Characters that can appear (case-insensitively) in a base32 encoding. */
#define BASE32_CHARS "abcdefghijklmnopqrstuvwxyz234567"
diff --git a/src/common/util_process.c b/src/common/util_process.c
index abda63720c..9e9679b099 100644
--- a/src/common/util_process.c
+++ b/src/common/util_process.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/util_process.h b/src/common/util_process.h
index d38301a354..c3a63498b5 100644
--- a/src/common/util_process.h
+++ b/src/common/util_process.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2016, The Tor Project, Inc. */
+/* Copyright (c) 2011-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/workqueue.c b/src/common/workqueue.c
index e1fb663a2a..ec6e257b4c 100644
--- a/src/common/workqueue.c
+++ b/src/common/workqueue.c
@@ -510,12 +510,13 @@ replyqueue_get_socket(replyqueue_t *rq)
void
replyqueue_process(replyqueue_t *queue)
{
- if (queue->alert.drain_fn(queue->alert.read_fd) < 0) {
+ int r = queue->alert.drain_fn(queue->alert.read_fd);
+ if (r < 0) {
//LCOV_EXCL_START
static ratelim_t warn_limit = RATELIM_INIT(7200);
log_fn_ratelim(&warn_limit, LOG_WARN, LD_GENERAL,
"Failure from drain_fd: %s",
- tor_socket_strerror(tor_socket_errno(queue->alert.read_fd)));
+ tor_socket_strerror(-r));
//LCOV_EXCL_STOP
}
diff --git a/src/common/workqueue.h b/src/common/workqueue.h
index 54276767b0..7b483eb7ac 100644
--- a/src/common/workqueue.h
+++ b/src/common/workqueue.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_WORKQUEUE_H
@@ -16,7 +16,7 @@ typedef struct threadpool_s threadpool_t;
typedef struct workqueue_entry_s workqueue_entry_t;
/** Possible return value from a work function: */
-typedef enum {
+typedef enum workqueue_reply_t {
WQ_RPL_REPLY = 0, /** indicates success */
WQ_RPL_ERROR = 1, /** indicates fatal error */
WQ_RPL_SHUTDOWN = 2, /** indicates thread is shutting down */
diff --git a/src/config/geoip b/src/config/geoip
index 90e7f4c43e..02a4b31630 100644
--- a/src/config/geoip
+++ b/src/config/geoip
@@ -1,4 +1,4 @@
-# Last updated based on February 8 2017 Maxmind GeoLite2 Country
+# Last updated based on May 2 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
@@ -39,17 +39,23 @@
18219008,18350079,IN
18350080,18874367,CN
18874368,18907135,MY
-18907136,18924031,SG
+18907136,18923519,SG
+18923520,18924031,HK
18924032,18924287,TW
-18924288,18924799,SG
+18924288,18924799,HK
18924800,18925055,TW
-18925056,18926079,SG
+18925056,18925567,HK
+18925568,18926079,SG
18926080,18926207,TW
18926208,18926335,SG
18926336,18926463,TW
18926464,18926591,SG
18926592,18926719,TW
-18926720,18939903,SG
+18926720,18927615,SG
+18927616,18929663,TW
+18929664,18931711,KR
+18931712,18933759,JP
+18933760,18939903,SG
18939904,19005439,JP
19005440,19005440,CN
19005441,19136511,TW
@@ -167,11 +173,17 @@
48234496,49283071,IT
49283072,49807359,DE
49807360,50331647,SE
-50331648,68182079,US
+50331648,68118783,US
+68118784,68119039,CA
+68119040,68169727,US
+68169728,68171775,CA
+68171776,68182079,US
68182080,68182095,GB
68182096,68305407,US
68305408,68305919,MX
-68305920,69342463,US
+68305920,68978687,US
+68978688,68980735,CA
+68980736,69342463,US
69342464,69342719,GB
69342720,69370367,US
69370368,69370373,CA
@@ -221,7 +233,8 @@
84418560,84418815,UA
84418816,84419071,RU
84419072,84419327,UA
-84419328,84420607,RU
+84419328,84419583,NL
+84419584,84420607,RU
84420608,84421631,GB
84421632,84421759,MX
84421760,84421887,PA
@@ -298,7 +311,9 @@
85395456,85395711,TR
85395968,85396223,LU
85396480,85397503,ES
-85398528,85398783,SA
+85398016,85398047,NO
+85398528,85399039,SA
+85399040,85399047,CH
85399552,85400063,FR
85400576,85400583,ES
85401600,85403647,IT
@@ -319,8 +334,7 @@
85733376,85737471,GB
85737472,85753855,DE
85753856,85770239,IL
-85770240,85778431,ES
-85778432,85786623,DE
+85770240,85786623,IR
85786624,85852159,IL
85852160,86015999,AE
86016000,86018047,BG
@@ -596,7 +610,9 @@
86467208,86467211,IE
86467212,86467320,FR
86467321,86467321,FI
-86467322,86467999,FR
+86467322,86467535,FR
+86467536,86467543,IT
+86467544,86467999,FR
86468000,86468003,PL
86468004,86468055,FR
86468056,86468056,DE
@@ -678,9 +694,7 @@
86497280,86499327,NL
86499328,86503423,FR
86503424,86505471,DE
-86505472,86505727,GB
-86505728,86505983,US
-86505984,86507519,GB
+86505472,86507519,GB
86507520,86573055,ES
86573056,86638591,SA
86638592,86671359,RU
@@ -702,7 +716,9 @@
86769664,86773759,RU
86773760,86777855,GB
86777856,86779903,AZ
-86779904,86786047,RU
+86779904,86781183,RU
+86781184,86781439,NL
+86781440,86786047,RU
86786048,86788095,NO
86788096,86790143,NL
86790144,86794239,TR
@@ -814,12 +830,16 @@
87755520,87755775,KG
87755776,87756799,RU
87756800,87758847,ES
-87758848,87761919,RU
+87758848,87761407,RU
+87761408,87761663,CZ
+87761664,87761919,RU
87761920,87762431,FR
87762432,87762943,UA
87762944,87763967,KZ
87763968,87766527,RU
-87766528,87818239,CZ
+87766528,87769087,CZ
+87769088,87777279,ES
+87777280,87818239,CZ
87818240,87883775,PL
87883776,87885823,IT
87885824,87889919,RU
@@ -848,11 +868,393 @@
87957504,87957759,ES
87957760,87958527,GB
87958528,87959039,CZ
-87959040,87959551,NL
+87959040,87959539,NL
+87959540,87959547,BE
+87959548,87959551,NL
87959552,87960063,DE
87960064,87960575,GB
87960576,87962111,US
-87962112,87965695,GB
+87962112,87962623,GB
+87962624,87963647,CZ
+87963648,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,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,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,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,KP
+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,87965183,CZ
+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,87965695,GB
87965696,87967743,DE
87967744,87969791,IT
87969792,87970815,IM
@@ -934,15 +1336,12 @@
90503168,90505215,IL
90505216,90515455,RU
90515456,90516479,GB
-90516480,90516735,DE
+90516480,90516735,DK
90516736,90516991,RO
-90516992,90517503,NL
+90516992,90517503,FR
90517504,90518527,GB
90518528,90529791,RU
-90529792,90533119,NL
-90533120,90533375,DE
-90533376,90533631,NL
-90533632,90533887,GB
+90529792,90533887,NL
90533888,90537983,EE
90537984,90540031,RU
90540032,90544127,GB
@@ -1269,9 +1668,11 @@
92750912,92750943,PT
92750944,92751243,FR
92751244,92751247,ES
-92751248,92751711,FR
-92751712,92751712,DE
-92751713,92752031,FR
+92751248,92751631,FR
+92751632,92751647,CH
+92751648,92751711,FR
+92751712,92751807,DE
+92751808,92752031,FR
92752032,92752063,FI
92752064,92753079,FR
92753080,92753087,ES
@@ -1320,7 +1721,9 @@
92762056,92762059,GB
92762060,92762127,FR
92762128,92762135,ES
-92762136,92762383,FR
+92762136,92762279,FR
+92762280,92762283,GB
+92762284,92762383,FR
92762384,92762391,ES
92762392,92762719,FR
92762720,92762751,PT
@@ -1332,14 +1735,15 @@
92764224,92764287,ES
92764288,92764687,FR
92764688,92764703,ES
-92764704,92764911,FR
+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,92777839,FR
-92777840,92777855,FI
+92766048,92777855,FR
92777856,92777983,GB
92777984,92778431,FR
92778432,92778495,ES
@@ -1398,7 +1802,9 @@
92787708,92787711,FI
92787712,92788127,FR
92788128,92788131,FI
-92788132,92788479,FR
+92788132,92788399,FR
+92788400,92788415,FI
+92788416,92788479,FR
92788480,92788495,FI
92788496,92789119,FR
92789120,92789183,ES
@@ -1428,7 +1834,9 @@
92794692,92794695,ES
92794696,92795631,FR
92795632,92795639,CZ
-92795640,92796687,FR
+92795640,92796575,FR
+92796576,92796579,GB
+92796580,92796687,FR
92796688,92796691,DE
92796692,92796879,FR
92796880,92796895,FI
@@ -1439,7 +1847,9 @@
92797356,92797359,DE
92797360,92797679,FR
92797680,92797695,FI
-92797696,92798975,FR
+92797696,92798591,FR
+92798592,92798623,PT
+92798624,92798975,FR
92798976,93323263,RU
93323264,93335551,CH
93335552,93339647,IL
@@ -1495,7 +1905,9 @@
93715968,93716479,NL
93716480,93749247,GB
93749248,93753343,IT
-93753344,93765631,GB
+93753344,93756415,GB
+93756416,93757439,FR
+93757440,93765631,GB
93765632,93774847,SE
93774848,93775871,NO
93775872,93782015,SE
@@ -1547,7 +1959,9 @@
94043136,94044159,RO
94044160,94109695,SY
94109696,94175231,SA
-94175232,94176511,SE
+94175232,94175487,SE
+94175488,94175743,CZ
+94175744,94176511,SE
94176512,94176767,US
94176768,94177535,SE
94177536,94177791,IT
@@ -1564,7 +1978,9 @@
94183424,94183935,RU
94183936,94184191,SE
94184192,94184447,RU
-94184448,94187007,SE
+94184448,94186239,SE
+94186240,94186495,IT
+94186496,94187007,SE
94187008,94187263,GB
94187264,94187775,SE
94187776,94188031,NO
@@ -1775,10 +2191,18 @@
96172800,96173055,GP
96173056,96174079,MF
96174080,96206847,HU
-96206848,96247807,RU
+96206848,96245759,RU
+96245760,96246783,KZ
+96246784,96247807,RU
96247808,96248831,NL
-96248832,96258047,RU
-96258048,96260095,NL
+96248832,96251903,RU
+96251904,96252159,DE
+96252160,96252927,NL
+96252928,96259071,RU
+96259072,96259327,NL
+96259328,96259583,RO
+96259584,96259839,US
+96259840,96260095,NL
96260096,96262143,RU
96262144,96262399,NL
96262400,96264191,RU
@@ -1809,12 +2233,15 @@
96325632,96327679,RU
96327680,96327935,NL
96327936,96328191,RO
-96328192,96329727,RU
+96328192,96328447,US
+96328448,96328703,UA
+96328704,96329727,RU
96329728,96333823,GB
96333824,96335871,RU
96335872,96336895,NL
-96336896,96337151,US
-96337152,96337919,NL
+96336896,96337151,CZ
+96337152,96337663,NL
+96337664,96337919,US
96337920,96403455,IR
96403456,96468991,AZ
96468992,96731135,AE
@@ -1859,9 +2286,7 @@
96757884,96757887,ES
96757888,96758247,FR
96758248,96758251,DE
-96758252,96759311,FR
-96759312,96759327,ES
-96759328,96759735,FR
+96758252,96759735,FR
96759736,96759739,ES
96759740,96760099,FR
96760100,96760103,IE
@@ -1885,7 +2310,11 @@
96764384,96764399,FI
96764400,96766063,FR
96766064,96766079,ES
-96766080,96766911,FR
+96766080,96766259,FR
+96766260,96766263,ES
+96766264,96766267,FR
+96766268,96766271,ES
+96766272,96766911,FR
96766912,96766915,GB
96766916,96767031,FR
96767032,96767035,GB
@@ -2044,7 +2473,9 @@
97437696,97439743,AT
97439744,97444863,NL
97444864,97445887,PT
-97445888,97447935,RS
+97445888,97446911,RS
+97446912,97447167,XK
+97447168,97447935,RS
97447936,97452031,PL
97452032,97517567,UA
97517568,98566143,IR
@@ -2190,7 +2621,11 @@
100532480,100532735,US
100532736,100548872,RO
100548873,100548873,TR
-100548874,100554999,RO
+100548874,100552863,RO
+100552864,100552871,AT
+100552872,100554447,RO
+100554448,100554463,DE
+100554464,100554999,RO
100555000,100555000,DE
100555001,100555007,RO
100555008,100555263,DE
@@ -2227,7 +2662,9 @@
100559872,100559935,US
100559936,100560127,RO
100560128,100560383,US
-100560384,100560639,RO
+100560384,100560455,RO
+100560456,100560463,US
+100560464,100560639,RO
100560640,100560643,US
100560644,100560727,RO
100560728,100560751,US
@@ -2267,18 +2704,37 @@
100663296,121195295,US
121195296,121195327,IT
121195328,134221823,US
-134221824,134221824,DE
-134221825,134222335,US
-134222336,134222336,DE
-134222337,134223871,US
-134223872,134223872,GB
-134223873,134224383,US
-134224384,134224384,GB
-134224385,134247423,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,134445823,US
-134445824,134445887,GU
-134445888,134738943,US
+134247425,134443007,US
+134443008,134447103,GU
+134447104,134738943,US
134738944,134739199,CA
134739200,135192575,US
135192576,135200767,MX
@@ -2302,13 +2758,17 @@
135776256,135778303,GU
135778304,135792639,US
135792640,135794687,CA
-135794688,135945727,US
+135794688,135925759,US
+135925760,135926783,VI
+135926784,135945727,US
135945728,135945983,CA
135945984,136054015,US
136054016,136054271,GB
136054272,136175615,US
136175616,136175871,CA
-136175872,136237055,US
+136175872,136176383,US
+136176384,136176639,CA
+136176640,136237055,US
136237056,136239103,CA
136239104,136404991,US
136404992,136407039,CA
@@ -2349,10 +2809,16 @@
214698304,214698311,VI
214698312,214777855,US
214777856,214782975,PR
-214782976,219187465,US
+214782976,214787583,US
+214787584,214787711,PR
+214787712,214787839,US
+214787840,214788095,PR
+214788096,219187465,US
219187468,219249919,US
219249920,219250175,GB
-219250176,221642751,US
+219250176,219512063,US
+219512064,219512319,GB
+219512320,221642751,US
221642752,221773823,AU
221773824,222494719,US
222494720,222527487,SG
@@ -2440,11 +2906,26 @@
225080896,225081855,US
225081856,225082367,AU
225082368,225082879,GB
-225082880,225443839,US
+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,225443839,US
225443840,225705983,JP
225705984,226230271,US
226230272,226295807,KR
-226295808,234881023,US
+226295808,226361343,US
+226361344,226492415,IN
+226492416,231866367,US
+231866368,231997439,AU
+231997440,233046015,US
+233046016,233177087,SG
+233177088,234881023,US
234881024,234883071,CN
234883072,234884095,JP
234884096,234885119,CN
@@ -2466,7 +2947,7 @@
234950656,234951679,AU
234951680,234952703,HK
234952704,234953727,CN
-234953728,234954751,SG
+234953728,234954751,US
234954752,234958591,NZ
234958592,234958847,AU
234958848,234971135,NZ
@@ -2551,7 +3032,8 @@
248512512,249561087,CN
249561088,251658239,VN
251658240,257532415,US
-257532416,257532671,AU
+257532416,257532423,AU
+257532432,257532671,AU
257532672,257534463,US
257534464,257534719,IN
257534720,257597951,US
@@ -2640,8 +3122,7 @@
289787904,289789951,DE
289789952,289791999,US
289792000,289794047,AE
-289794048,289795071,US
-289795072,289796095,GB
+289794048,289796095,GB
289796096,289798143,TR
289798144,289800191,SA
289800192,289948927,US
@@ -2770,7 +3251,8 @@
301989024,301989031,MO
301989032,301989119,US
301989120,301989375,AU
-301989376,323243895,US
+301989376,301989631,SG
+301989632,323243895,US
323243896,323243903,FR
323243904,332132119,US
332132120,332132127,IL
@@ -2815,19 +3297,11 @@
385939968,385940479,NL
385940480,385942527,US
385942528,385943551,NL
-385943552,385950719,US
-385950720,385951743,NL
-385951744,385957887,US
+385943552,385957887,US
385957888,385961983,NL
-385961984,386002431,US
-386002432,386002943,NL
-386002944,386003199,US
+385961984,386003199,US
386003200,386003967,NL
-386003968,386006015,US
-386006016,386007039,NL
-386007040,386010623,US
-386010624,386011135,NL
-386011136,386012159,US
+386003968,386012159,US
386012160,386012671,NL
386012672,386013183,US
386013184,386013695,NL
@@ -2849,13 +3323,9 @@
386088960,386089983,NL
386089984,386095615,US
386095616,386096127,NL
-386096128,386100735,US
-386100736,386101247,NL
-386101248,386109439,US
+386096128,386109439,US
386109440,386113535,NL
-386113536,386125823,US
-386125824,386134015,NL
-386134016,386191359,US
+386113536,386191359,US
386191360,386195455,NL
386195456,386201599,US
386201600,386203135,NL
@@ -2870,20 +3340,14 @@
386245632,386247679,US
386247680,386248703,NL
386248704,386297855,US
-386297856,386301951,NL
+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
+386387968,386400255,US
386400256,386404351,NL
-386404352,386408447,US
-386408448,386412543,NL
-386412544,386453503,US
-386453504,386457599,NL
-386457600,386465791,US
+386404352,386465791,US
386465792,386469887,NL
386469888,386498559,US
386498560,386502655,NL
@@ -2892,26 +3356,22 @@
386523136,386593279,US
386593280,386594815,NL
386594816,386595071,US
-386595072,386596095,NL
-386596096,386613247,US
-386613248,386617343,NL
-386617344,386656255,US
+386595072,386595327,NL
+386595328,386595583,US
+386595584,386596095,NL
+386596096,386656255,US
386656256,386656511,NL
386656512,386662399,US
-386662400,386670591,NL
-386670592,386682879,US
+386662400,386666495,NL
+386666496,386682879,US
386682880,386691071,NL
-386691072,386711551,US
-386711552,386715647,NL
-386715648,386736127,US
-386736128,386744319,NL
-386744320,386774527,US
+386691072,386736127,US
+386736128,386740223,NL
+386740224,386774527,US
386774528,386775039,NL
386775040,386783231,US
386783232,386783743,NL
-386783744,386784255,US
-386784256,386785279,NL
-386785280,386789375,US
+386783744,386789375,US
386789376,386797567,NL
386797568,386816511,US
386816512,386818047,NL
@@ -2919,22 +3379,16 @@
386826752,386827263,NL
386827264,386828287,US
386828288,386829311,NL
-386829312,386842623,US
-386842624,386846719,NL
-386846720,386862079,US
+386829312,386862079,US
386862080,386862335,JP
386862336,386862591,KR
386862592,386868735,US
386868736,386868991,NL
386868992,386875391,US
386875392,386879487,NL
-386879488,386887679,US
-386887680,386891775,NL
-386891776,386892799,US
+386879488,386892799,US
386892800,386893311,NL
-386893312,386904063,US
-386904064,386905087,NL
-386905088,386923519,US
+386893312,386923519,US
386923520,386924543,NL
386924544,387055615,CA
387055616,387121151,PR
@@ -2943,11 +3397,11 @@
387833856,387975167,US
387975168,387976191,NL
387976192,387976703,US
-387976704,387978751,NL
-387978752,387979263,US
-387979264,387980799,NL
-387980800,387985407,US
-387985408,387996159,NL
+387976704,387977727,NL
+387977728,387979263,US
+387979264,387980287,NL
+387980288,387994623,US
+387994624,387996159,NL
387996160,387997695,US
387997696,388005887,NL
388005888,388029439,US
@@ -2972,27 +3426,25 @@
388206592,388207103,NL
388207104,388207871,US
388207872,388208127,NL
-388208128,388222975,US
-388222976,388227071,NL
-388227072,388272127,US
+388208128,388223999,US
+388224000,388225023,NL
+388225024,388272127,US
388272128,388284415,NL
388284416,388288511,US
388288512,388293631,NL
388293632,388294143,US
-388294144,388300799,NL
-388300800,388308991,US
+388294144,388296703,NL
+388296704,388308991,US
388308992,388317183,NL
388317184,388325375,US
388325376,388329471,NL
388329472,388341759,US
388341760,388345855,NL
-388345856,388354047,US
-388354048,388358143,NL
-388358144,388366335,US
+388345856,388366335,US
388366336,388392447,NL
388392448,388397055,US
-388397056,388399103,NL
-388399104,388419583,US
+388397056,388398079,NL
+388398080,388419583,US
388419584,388423679,NL
388423680,388440063,US
388440064,388444159,NL
@@ -3004,11 +3456,7 @@
388481024,388485119,NL
388485120,388493311,US
388493312,388501503,NL
-388501504,388513791,US
-388513792,388514915,NL
-388514916,388514916,US
-388514917,388517887,NL
-388517888,388526079,US
+388501504,388526079,US
388526080,388530175,NL
388530176,388538367,US
388538368,388542463,NL
@@ -3032,17 +3480,15 @@
388788224,388792319,NL
388792320,388812799,US
388812800,388816895,NL
-388816896,388842239,US
-388842240,388842495,NL
-388842496,388843519,US
+388816896,388843519,US
388843520,388844543,NL
-388844544,388844799,US
-388844800,388845055,NL
-388845056,388849663,US
+388844544,388849663,US
388849664,388853759,NL
388853760,388857855,US
-388857856,388878335,NL
-388878336,388885503,US
+388857856,388863999,NL
+388864000,388866047,US
+388866048,388870143,NL
+388870144,388885503,US
388885504,388890623,NL
388890624,388893695,US
388893696,388894719,NL
@@ -3064,13 +3510,11 @@
389044224,389045247,NL
389045248,389060607,US
389060608,389061631,NL
-389061632,389070847,US
-389070848,389078015,NL
+389061632,389074943,US
+389074944,389078015,NL
389078016,389079039,US
389079040,389083135,NL
-389083136,389090303,US
-389090304,389091327,NL
-389091328,389102079,US
+389083136,389102079,US
389102080,389102591,NL
389102592,389136383,US
389136384,389140479,NL
@@ -3082,57 +3526,51 @@
389185536,389201919,NL
389201920,389242879,US
389242880,389251071,NL
-389251072,389259263,US
-389259264,389267455,NL
-389267456,389271551,US
-389271552,389292031,NL
+389251072,389273599,US
+389273600,389283839,NL
+389283840,389287935,US
+389287936,389292031,NL
389292032,389296127,US
389296128,389300223,NL
389300224,389319167,US
389319168,389319679,NL
389319680,389320191,US
389320192,389320447,NL
-389320448,389328895,US
-389328896,389341183,NL
+389320448,389332991,US
+389332992,389341183,NL
389341184,389349375,US
389349376,389365759,NL
-389365760,389390335,US
-389390336,389398527,NL
-389398528,389402623,US
-389402624,389419007,NL
+389365760,389410815,US
+389410816,389419007,NL
389419008,389435391,US
-389435392,389455871,NL
-389455872,389480447,US
-389480448,389484543,NL
-389484544,389495295,US
+389435392,389443583,NL
+389443584,389447679,US
+389447680,389455871,NL
+389455872,389495295,US
389495296,389495807,NL
389495808,389509119,US
389509120,389513215,NL
389513216,389515263,US
389515264,389521407,NL
-389521408,389537791,US
-389537792,389541887,NL
-389541888,389554175,US
+389521408,389554175,US
389554176,389562367,NL
-389562368,389611519,US
-389611520,389619711,NL
+389562368,389615615,US
+389615616,389619711,NL
389619712,389628415,US
389628416,389628927,NL
389628928,389631999,US
389632000,389641215,NL
-389641216,389701119,US
-389701120,389701631,NL
-389701632,389730303,US
+389641216,389730303,US
389730304,389734399,NL
-389734400,389754879,US
-389754880,389765631,NL
+389734400,389764095,US
+389764096,389765631,NL
389765632,389767167,US
389767168,389775359,NL
389775360,389812223,US
389812224,389816319,NL
389816320,389825791,US
-389825792,389826559,NL
-389826560,389852159,US
+389825792,389826047,NL
+389826048,389852159,US
389852160,389853183,NL
389853184,389857279,US
389857280,389873663,NL
@@ -3142,17 +3580,13 @@
389924864,389925375,NL
389925376,389926911,US
389926912,389936127,NL
-389936128,389937151,US
-389937152,389937663,NL
-389937664,389937919,US
-389937920,389938175,NL
-389938176,389938687,US
-389938688,389940223,NL
+389936128,389937407,US
+389937408,389937663,NL
+389937664,389939711,US
+389939712,389940223,NL
389940224,389941503,US
389941504,389941759,NL
-389941760,389952767,US
-389952768,389953023,NL
-389953024,389954815,US
+389941760,389954815,US
389954816,389955071,NL
389955072,389964287,US
389964288,389966335,NL
@@ -3169,12 +3603,10 @@
389992448,389996543,US
389996544,389996799,NL
389996800,389996800,SG
-389996801,389999871,US
-389999872,390000127,NL
-390000128,390011903,US
-390011904,390012927,NL
-390012928,390021119,US
-390021120,390030847,NL
+389996801,390026751,US
+390026752,390029311,NL
+390029312,390029823,US
+390029824,390030847,NL
390030848,390033407,US
390033408,390043135,NL
390043136,390063615,US
@@ -3195,9 +3627,7 @@
390143232,390148095,NL
390148096,390165503,US
390165504,390166527,NL
-390166528,390181887,US
-390181888,390182143,NL
-390182144,390184959,US
+390166528,390184959,US
390184960,390193151,NL
390193152,390205439,US
390205440,390209535,NL
@@ -3212,8 +3642,8 @@
390279168,390284799,US
390284800,390285311,NL
390285312,390286847,US
-390286848,390295551,NL
-390295552,390299647,US
+390286848,390291455,NL
+390291456,390299647,US
390299648,390304767,NL
390304768,390332159,US
390332160,390332415,GB
@@ -3221,9 +3651,7 @@
390731776,390732031,NL
390732032,390732287,US
390732288,390732799,NL
-390732800,390733823,US
-390733824,390737919,NL
-390737920,390746111,US
+390732800,390746111,US
390746112,390758399,NL
390758400,390767615,US
390767616,390768639,NL
@@ -3233,15 +3661,9 @@
390972928,390973951,NL
390973952,390975487,US
390975488,390976511,NL
-390976512,390980607,US
-390980608,390981631,NL
-390981632,390985727,US
-390985728,390987775,NL
-390987776,390995967,US
+390976512,390995967,US
390995968,391020543,NL
-391020544,391081983,US
-391081984,391086079,NL
-391086080,391110655,US
+391020544,391110655,US
391110656,391110911,IL
391110912,391111167,GB
391111168,391111935,US
@@ -3250,7 +3672,11 @@
391112704,391113471,NL
391113472,391116543,US
391116544,391116799,NL
-391116800,391368703,US
+391116800,391331839,US
+391331840,391333887,NL
+391333888,391344127,US
+391344128,391348223,NL
+391348224,391368703,US
391368704,391372799,CA
391372800,391376895,US
391376896,391380991,CA
@@ -3262,11 +3688,9 @@
391937536,391937791,CA
391937792,391938047,IE
391938048,391946239,CA
-391946240,391960639,US
-391960640,391960647,RO
-391960648,391961711,US
-391961712,391961719,RO
-391961720,392044351,US
+391946240,391960335,US
+391960336,391960351,GB
+391960352,392044351,US
392044352,392044359,CA
392044360,392054271,US
392054272,392054527,CA
@@ -3274,7 +3698,11 @@
392055944,392055951,GB
392055952,392073319,US
392073320,392073327,CA
-392073328,392114895,US
+392073328,392103471,US
+392103472,392103479,GB
+392103480,392112815,US
+392112816,392112823,GB
+392112824,392114895,US
392114896,392114903,TH
392114904,392245247,US
392245248,392249343,SG
@@ -3363,11 +3791,9 @@
392675040,392675071,SG
392675072,392684479,US
392684480,392684511,IE
-392684512,392684527,NL
-392684528,392684543,US
+392684512,392684543,NL
392684544,392684575,IE
-392684576,392684591,NL
-392684592,392684607,US
+392684576,392684607,NL
392684608,392684639,IE
392684640,392684655,NL
392684656,392684671,US
@@ -3393,8 +3819,7 @@
392685088,392685103,NL
392685104,392685119,US
392685120,392685151,IE
-392685152,392685167,NL
-392685168,392686607,US
+392685152,392686607,US
392686608,392686623,AT
392686624,392686639,FI
392686640,392686655,IE
@@ -3495,7 +3920,8 @@
392689888,392689903,AT
392689904,392689919,IE
392689920,392689983,US
-392689984,392690015,SG
+392689984,392689999,SG
+392690000,392690015,HK
392690016,392690031,KR
392690032,392690047,MY
392690048,392690079,US
@@ -3524,26 +3950,70 @@
392691440,392691455,AT
392691456,392765439,US
392765440,392765695,GB
-392765696,393166847,US
+392765696,392849663,US
+392849664,392849919,NL
+392849920,392850687,US
+392850688,392850943,NL
+392850944,392851455,US
+392851456,392852479,NL
+392852480,392852735,US
+392852736,392852991,NL
+392852992,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,393154559,US
+393154560,393158655,NL
+393158656,393166847,US
393166848,393170943,CA
393170944,394264575,US
394264576,394264831,CA
394270720,394271231,NL
394296320,394296831,NL
394297344,394297599,US
-394330112,394854399,US
+394330112,394788863,US
+394821632,394821887,US
394854400,394854655,CA
-394919936,395051007,US
+394887168,394887423,US
+394919936,394920191,US
+394952704,394952959,CA
+394985472,394985727,US
+395018240,395018495,CA
395051008,395051263,CA
+395083776,395084031,US
395116544,395116799,US
+395149312,395149567,CA
395182080,395182335,CA
-395247616,395247871,US
-395313152,395706367,US
-395706368,395837439,CA
-395837440,395968511,US
-395968512,395969023,CA
+395214848,395215103,US
+395247616,395313407,US
+395345920,395346175,CA
+395378688,395576319,US
+395608064,395608319,CA
+395640832,395641087,US
+395673600,395673855,CA
+395706368,395706623,CA
+395739136,395739391,US
+395771904,395837439,CA
+395837440,395903231,US
+395935744,395935999,CA
+395968512,396034047,CA
396034048,396034303,US
-396099584,396754943,US
+396066816,396067071,CA
+396099584,396230911,US
+396263424,396263679,CA
+396296192,396754943,US
396754944,396755199,CA
396820480,396820735,US
396886016,397410303,US
@@ -3566,15 +4036,9 @@
398532608,398536703,NL
398536704,398566911,US
398566912,398567423,NL
-398567424,398617599,US
-398617600,398618623,NL
-398618624,398635007,US
-398635008,398644223,NL
-398644224,398644735,US
+398567424,398644735,US
398644736,398645247,NL
-398645248,398647295,US
-398647296,398656511,NL
-398656512,398657535,US
+398645248,398657535,US
398657536,398658559,NL
398658560,398667775,US
398667776,398675967,NL
@@ -3606,9 +4070,7 @@
399032320,399036415,NL
399036416,399055871,US
399055872,399056383,NL
-399056384,399075839,US
-399075840,399076863,NL
-399076864,399087615,US
+399056384,399087615,US
399087616,399088639,NL
399088640,399089663,US
399089664,399114239,NL
@@ -3617,8 +4079,8 @@
399126016,399143935,US
399143936,399145471,NL
399145472,399147007,US
-399147008,399159295,NL
-399159296,399175679,US
+399147008,399155199,NL
+399155200,399175679,US
399175680,399179775,NL
399179776,399280127,US
399280128,399280639,NL
@@ -3626,16 +4088,16 @@
399280896,399281151,NL
399281152,399331327,US
399331328,399339519,NL
-399339520,399342335,US
-399342336,399342591,NL
-399342592,399353855,US
+399339520,399353855,US
399353856,399354879,NL
399354880,399355391,US
399355392,399359999,NL
-399360000,399365119,US
-399365120,399366143,NL
-399366144,399367167,US
-399367168,399378943,NL
+399360000,399367167,US
+399367168,399367679,NL
+399367680,399368191,US
+399368192,399372287,NL
+399372288,399376383,US
+399376384,399378943,NL
399378944,399380479,US
399380480,399388671,NL
399388672,399396863,US
@@ -3648,45 +4110,39 @@
399486976,399491071,NL
399491072,399495167,US
399495168,399503359,NL
-399503360,399591935,US
-399591936,399593471,NL
-399593472,399601663,US
-399601664,399619583,NL
-399619584,399621631,US
-399621632,399639551,NL
-399639552,399688191,US
+399503360,399622143,US
+399622144,399630335,NL
+399630336,399688191,US
399688192,399688703,NL
399688704,399734527,US
399734528,399735807,NL
399735808,399738879,US
-399738880,399739647,NL
+399738880,399739135,NL
+399739136,399739391,US
+399739392,399739647,NL
399739648,399740927,US
399740928,399749119,NL
399749120,399797247,US
399797248,399797759,NL
-399797760,399818751,US
-399818752,399822847,NL
-399822848,399870975,US
+399797760,399870975,US
399870976,399871999,NL
399872000,399908863,US
399908864,399919615,NL
399919616,399921151,US
-399921152,399958015,NL
+399921152,399949823,NL
+399949824,399953919,US
+399953920,399958015,NL
399958016,399969279,US
399969280,399969535,NL
399969536,399970303,US
399970304,399980031,NL
399980032,399981567,US
399981568,399982079,NL
-399982080,399990783,US
-399990784,399991295,NL
-399991296,399998975,US
+399982080,399998975,US
399998976,399999487,NL
399999488,400021247,US
400021248,400021503,NL
-400021504,400033279,US
-400033280,400033791,NL
-400033792,400034815,US
+400021504,400034815,US
400034816,400035327,NL
400035328,400047103,US
400047104,400047615,NL
@@ -3695,8 +4151,8 @@
400064512,400083455,US
400083456,400084991,NL
400084992,400093183,US
-400093184,400101375,NL
-400101376,400111103,US
+400093184,400097279,NL
+400097280,400111103,US
400111104,400111615,NL
400111616,400112639,US
400112640,400113663,NL
@@ -3726,18 +4182,18 @@
400263168,400263679,NL
400263680,400264703,US
400264704,400265215,NL
-400265216,400270847,US
-400270848,400271359,NL
-400271360,400283647,US
+400265216,400283647,US
400283648,400284671,NL
400284672,400293887,US
400293888,400302079,NL
400302080,400400383,US
400400384,400430079,NL
-400430080,400431103,US
-400431104,400442367,NL
+400430080,400432639,US
+400432640,400442367,NL
400442368,400482303,US
-400482304,400527359,NL
+400482304,400486399,NL
+400486400,400494591,US
+400494592,400527359,NL
400527360,400543743,US
400543744,400551935,NL
400551936,400623615,US
@@ -3845,7 +4301,11 @@
401387008,401387263,RU
401387264,401400871,US
401400872,401400879,NO
-401400880,401547263,US
+401400880,401419775,US
+401419776,401420031,CA
+401420032,401420287,US
+401420288,401420543,CA
+401420544,401547263,US
401547264,401555455,CA
401555456,402096639,US
402096640,402096895,FR
@@ -4082,9 +4542,7 @@
412958720,413007871,CA
413007872,413908991,US
413908992,413925375,PR
-413925376,414503135,US
-414503136,414503167,CA
-414503168,415760383,US
+413925376,415760383,US
415760384,416022527,CA
416022528,416059391,US
416059392,416063487,CA
@@ -4113,7 +4571,7 @@
417775616,417796095,CA
417796096,417800191,US
417800192,417808383,BS
-417808384,417816575,CA
+417808384,417820671,CA
417820672,417857535,US
417857536,417923071,AR
417923072,418060287,US
@@ -4175,7 +4633,9 @@
455245824,455258111,JP
455258112,455258623,SG
455258624,455258688,KH
-455258689,455260671,SG
+455258689,455260416,SG
+455260417,455260430,KH
+455260431,455260671,SG
455260672,455260674,KH
455260675,455260927,SG
455260928,455260960,KH
@@ -4194,7 +4654,7 @@
456265728,456269823,ID
456269824,456271871,HK
456271872,456273919,CN
-456273920,456278015,SG
+456273920,456278015,HK
456278016,456286207,AU
456286208,456294399,JP
456294400,456327167,CN
@@ -4237,8 +4697,8 @@
459541504,459542527,IN
459542528,459543295,HK
459543296,459543551,TW
-459543552,459543807,MO
-459543808,459544575,HK
+459543552,459544063,MO
+459544064,459544575,HK
459544576,459545599,IN
459545600,459547647,JP
459547648,459548159,AU
@@ -4356,7 +4816,9 @@
461012992,461045759,KR
461045760,461047807,ID
461047808,461049855,JP
-461049856,461050879,TH
+461049856,461050111,TH
+461050112,461050367,SG
+461050368,461050879,TH
461050880,461051903,NZ
461051904,461054975,AU
461054976,461055999,HK
@@ -4383,7 +4845,9 @@
461111296,461127679,IN
461127680,461131775,PH
461131776,461135871,ID
-461135872,461144063,AU
+461135872,461143329,AU
+461143330,461143331,US
+461143332,461144063,AU
461144064,461209599,KR
461209600,461225983,SG
461225984,461227007,WF
@@ -4469,7 +4933,8 @@
520355840,520421375,ES
520421376,520486911,RO
520486912,520488959,NL
-520488960,520489471,UA
+520488960,520489215,UA
+520489216,520489471,CH
520489472,520489727,EG
520489728,520489983,GR
520489984,520490020,RU
@@ -4559,7 +5024,8 @@
520882176,520884223,IT
520884224,520888319,MK
520888320,520896511,DE
-520896512,520898559,BE
+520896512,520898303,BE
+520898304,520898559,US
520900608,520902655,GB
520902656,520902784,NL
520902785,520912895,GB
@@ -4742,7 +5208,9 @@
521793536,521795583,RU
521795584,521797631,PL
521797632,521928703,IT
-521928704,521945087,RU
+521928704,521929087,RU
+521929088,521929151,UA
+521929152,521945087,RU
521945088,521953279,GB
521953280,521961471,RU
521961472,521969663,CZ
@@ -4839,7 +5307,7 @@
523024896,523025407,DE
523025408,523025663,UA
523025664,523025919,CH
-523025920,523026175,BG
+523025920,523026175,UA
523026176,523026431,GB
523026432,523030527,TR
523030528,523034623,FR
@@ -4853,9 +5321,7 @@
523190272,523192319,FI
523192320,523194367,ES
523194368,523196415,DE
-523196416,523197183,AE
-523197184,523197695,DE
-523197696,523198463,AE
+523196416,523198463,AE
523198464,523202559,CZ
523202560,523223039,RU
523223040,523225087,AM
@@ -4972,11 +5438,12 @@
529800704,529800959,CZ
529800960,529806079,RU
529806080,529809407,UA
-529809408,529817599,RU
-529817600,529818623,CZ
+529809408,529817855,RU
+529817856,529818623,CZ
529818624,529826303,RU
529826304,529826815,CZ
-529826816,529829887,RU
+529826816,529828863,RU
+529828864,529829887,KZ
529829888,529830911,UZ
529830912,529831935,RU
529831936,529833983,SY
@@ -4984,9 +5451,9 @@
529838080,529842175,UA
529842176,529843199,ES
529843200,529843711,RU
-529843712,529845503,CZ
-529845504,529845759,UA
-529845760,529846271,CZ
+529843712,529844735,CZ
+529844736,529845503,RU
+529845504,529846271,UA
529846272,529847295,UZ
529847296,529848319,GB
529848320,529848575,NL
@@ -5087,8 +5554,8 @@
531428200,531428263,GB
531428264,531428271,IT
531428272,531428279,GB
-531428280,531428295,IT
-531428296,531428351,GB
+531428280,531428287,IT
+531428288,531428351,GB
531428352,531428359,IT
531428360,531428439,GB
531428440,531428447,IT
@@ -5139,8 +5606,7 @@
532209664,532210687,DE
532210688,532212223,RU
532212224,532212479,ME
-532212480,532212735,NL
-532212736,532213759,RU
+532212480,532213759,RU
532213760,532214015,GB
532214016,532221951,RU
532221952,532223999,IT
@@ -5177,7 +5643,9 @@
532344320,532344371,FR
532344372,532344372,GB
532344373,532344575,FR
-532344576,532347391,GB
+532344576,532346367,GB
+532346368,532346623,NL
+532346624,532347391,GB
532347392,532347903,DE
532347904,532348927,GB
532348928,532365311,IE
@@ -5198,7 +5666,7 @@
532368640,532370431,DE
532370432,532371455,FI
532371456,532372479,DE
-532372480,532372735,LU
+532372480,532372735,NL
532372736,532372767,GB
532372768,532372783,CA
532372784,532372799,BR
@@ -5234,8 +5702,8 @@
532738048,532740095,GB
532740096,532742143,KG
532742144,532746239,GB
-532746240,532750335,IT
-532750336,532750847,SM
+532746240,532750591,IT
+532750592,532750847,SM
532750848,532752383,IT
532752384,532754431,BE
532754432,532756479,FR
@@ -5365,7 +5833,7 @@
534157312,534157567,TR
534157568,534157823,DE
534157824,534158079,IR
-534158080,534158591,DE
+534158080,534158591,ES
534158592,534158847,NL
534158848,534161407,DE
534161408,534163455,IR
@@ -5378,7 +5846,9 @@
534181888,534183935,IR
534183936,534249471,AE
534249472,534253567,GB
-534253568,534257663,FR
+534253568,534254607,FR
+534254608,534254623,US
+534254624,534257663,FR
534257664,534259711,SE
534259712,534261759,CH
534261760,534263807,GB
@@ -5397,7 +5867,9 @@
534347776,534348031,US
534348032,534348287,GB
534348288,534348543,US
-534348544,534355967,GB
+534348544,534349071,GB
+534349072,534349079,US
+534349080,534355967,GB
534355968,534364159,GR
534364160,534366207,FI
534366208,534368255,IT
@@ -5415,7 +5887,9 @@
534513216,534513279,VG
534513280,534513407,NL
534513408,534513663,SE
-534513664,534515455,US
+534513664,534514687,US
+534514688,534515199,DE
+534515200,534515455,US
534515456,534515711,SE
534515712,534515967,GB
534515968,534516735,US
@@ -5468,8 +5942,7 @@
534663168,534675455,ES
534675456,534691839,GB
534691840,534693887,FR
-534693888,534695935,NL
-534695936,534700031,GB
+534693888,534700031,GB
534700032,534708223,JO
534708224,534740991,TR
534740992,534749183,BA
@@ -5536,9 +6009,9 @@
540825348,540825348,CA
540825349,540826383,US
540826384,540826399,CA
-540826400,540832575,US
-540832576,540832591,CA
-540832592,543690751,US
+540826400,540831743,US
+540831744,540833791,CA
+540833792,543690751,US
543690752,543691007,AR
543691008,543691263,US
543691264,543691775,BR
@@ -5555,7 +6028,9 @@
597426176,597688319,DE
597688320,598736895,US
598736896,598867967,GB
-598867968,603979775,US
+598867968,599130111,US
+599130112,599261183,CA
+599261184,603979775,US
603979776,603980799,CN
603980800,603981823,NP
603981824,604110847,CN
@@ -5589,7 +6064,6 @@
620703744,620704767,NZ
620704768,620705791,BD
620705792,620706815,HK
-620706816,620707839,US
620707840,620708863,IN
620708864,620709887,HK
620709888,620711935,AU
@@ -5639,8 +6113,7 @@
620777472,620781567,NL
620781568,620783615,GB
620783616,620785663,ES
-620785664,620785919,DE
-620785920,620786687,US
+620785664,620786687,DE
620786688,620787199,IE
620787200,620787711,DE
620787712,620789503,RU
@@ -5715,11 +6188,13 @@
621427712,621427967,GB
621427968,621428735,NL
621428736,621429759,IR
-621429760,621430527,DE
+621429760,621430271,DE
+621430272,621430527,ES
621430528,621430783,GB
621430784,621432831,ES
621432832,621436927,IT
-621436928,621440255,DE
+621436928,621439999,DE
+621440000,621440255,ES
621440256,621440511,IR
621440512,621442047,DE
621442048,621442303,ES
@@ -5820,12 +6295,9 @@
622510080,622512127,PL
622512128,622514175,DE
622514176,622518271,NO
-622518272,622518783,GB
-622518784,622519281,NL
-622519282,622519282,GB
-622519283,622519295,NL
+622518272,622519295,GB
622519296,622519551,FR
-622519552,622520319,NL
+622519552,622520319,GB
622520320,622522367,RU
622522368,622524415,FR
622524416,622526463,ES
@@ -5931,7 +6403,7 @@
623822848,623824895,GB
623824896,623826943,CZ
623826944,623827967,UA
-623827968,623828991,MD
+623827968,623828991,BG
623828992,623837183,UA
623837184,623902719,PL
623902720,623919103,CZ
@@ -5986,7 +6458,9 @@
624640952,624640959,PT
624640960,624641187,FR
624641188,624641191,ES
-624641192,624641855,FR
+624641192,624641535,FR
+624641536,624641551,IE
+624641552,624641855,FR
624641856,624641887,GB
624641888,624641983,FR
624641984,624642015,ES
@@ -6008,9 +6482,7 @@
624643244,624643247,ES
624643248,624643423,FR
624643424,624643459,ES
-624643460,624643999,FR
-624644000,624644015,GB
-624644016,624644031,FR
+624643460,624644031,FR
624644032,624644063,FI
624644064,624644095,ES
624644096,624644115,FR
@@ -6160,7 +6632,11 @@
624665612,624665615,ES
624665616,624665663,FR
624665664,624665695,ES
-624665696,624666167,FR
+624665696,624665903,FR
+624665904,624665919,FI
+624665920,624665999,FR
+624666000,624666015,GB
+624666016,624666167,FR
624666168,624666175,GB
624666176,624666219,FR
624666220,624666223,DE
@@ -6302,8 +6778,8 @@
624680800,624680895,FR
624680896,624680927,ES
624680928,624681023,FR
-624681024,624681071,ES
-624681072,624681083,FR
+624681024,624681055,ES
+624681056,624681083,FR
624681084,624681087,ES
624681088,624681535,FR
624681536,624681599,ES
@@ -6386,9 +6862,7 @@
624687784,624687791,PT
624687792,624687827,FR
624687828,624687831,ES
-624687832,624687903,FR
-624687904,624687919,ES
-624687920,624687923,FR
+624687832,624687923,FR
624687924,624687927,ES
624687928,624688007,FR
624688008,624688015,ES
@@ -6482,7 +6956,8 @@
625519104,625520135,NL
625520136,625520447,US
625520448,625520495,NL
-625520496,625520639,US
+625520496,625520511,US
+625520512,625520639,NL
625520640,625522687,RU
625522688,625523455,SE
625523456,625523711,NO
@@ -6571,7 +7046,7 @@
628029440,628031487,GB
628031488,628064255,MM
628064256,628080639,PK
-628080640,628097023,HU
+628080640,628097023,BD
628097024,628230143,RU
628230144,628232191,IT
628232192,628236287,RU
@@ -6779,7 +7254,8 @@
630820096,630820351,RO
630820352,630820607,ES
630820608,630820863,US
-630820864,630828031,RO
+630820864,630827007,RO
+630827008,630828031,NL
630828032,630828543,SE
630828544,630829055,BG
630829056,630833151,IR
@@ -6832,13 +7308,14 @@
631036416,631036543,GB
631036544,631037951,RO
631037952,631038207,BG
-631038208,631039999,RO
+631038208,631038975,RO
+631038976,631039999,NL
631040000,631043071,IR
631043072,631043583,RO
631043584,631043839,TR
631043840,631044095,MD
631044096,631045119,IR
-631045120,631046143,RO
+631045120,631046143,NL
631046144,631048191,DK
631048192,631050239,FR
631050240,631054335,RU
@@ -7008,7 +7485,9 @@
635200168,635200175,IT
635200176,635200263,GB
635200264,635200271,IT
-635200272,635200335,GB
+635200272,635200279,GB
+635200280,635200287,IT
+635200288,635200335,GB
635200336,635200343,IT
635200344,635200431,GB
635200432,635200439,IT
@@ -7026,9 +7505,7 @@
635201160,635201167,IT
635201168,635201183,GB
635201184,635201191,IT
-635201192,635201263,GB
-635201264,635201271,IT
-635201272,635201295,GB
+635201192,635201295,GB
635201296,635201303,IT
635201304,635203583,GB
635203584,635207679,JO
@@ -7068,8 +7545,8 @@
635725824,635727871,US
635727872,635729919,RU
635729920,635731967,DE
-635731968,635732223,SC
-635732224,635732735,DE
+635731968,635732479,SC
+635732480,635732735,DE
635732736,635732991,IR
635732992,635733209,DE
635733210,635733210,PT
@@ -7096,7 +7573,9 @@
635865856,635866111,US
635866112,635871487,RU
635871488,635871743,UA
-635871744,635893503,RU
+635871744,635891967,RU
+635891968,635892223,GB
+635892224,635893503,RU
635893504,635893759,AZ
635893760,635894527,RU
635894528,635894783,KZ
@@ -7120,8 +7599,7 @@
636168192,636170239,GB
636170240,636170495,PL
636170496,636170751,IS
-636170752,636171007,CH
-636171008,636171263,AT
+636170752,636171263,CH
636171264,636171519,CL
636171520,636171775,ES
636171776,636172031,GB
@@ -7141,7 +7619,14 @@
636190720,636223487,RU
636223488,636485631,IQ
636485632,636747775,SA
-636747776,636764159,FR
+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
@@ -7217,41 +7702,63 @@
637337088,637337599,RU
637337600,637403135,NO
637403136,637534207,IR
-637534208,639242239,US
+637534208,638910463,US
+638910464,638918655,CA
+638918656,639242239,US
639242240,639246335,CA
639246336,639442943,US
639442944,639451135,CA
-639451136,641738239,US
+639451136,639459327,US
+639459328,639467519,CA
+639467520,641738239,US
641738240,641738495,CA
641738496,641761535,US
641761536,641761791,CA
-641761792,641765375,US
-641765376,641765887,CA
-641765888,641769471,US
-641769472,641769983,CA
+641761792,641763327,US
+641763328,641767423,CA
+641767424,641768447,US
+641768448,641769983,CA
641769984,641770495,US
-641770496,641771839,CA
-641771840,641773055,US
-641773056,641775615,CA
-641775616,641779199,US
+641770496,641772543,CA
+641772544,641773055,US
+641773056,641776639,CA
+641776640,641777663,US
+641777664,641777919,CA
+641777920,641778175,US
+641778176,641778687,CA
+641778688,641779199,US
641779200,641779327,CA
641779328,641779711,US
-641779712,641780223,CA
-641780224,641781503,US
-641781504,641781759,CA
-641781760,641826815,US
+641779712,641781759,CA
+641781760,641789951,US
+641789952,641790975,CA
+641790976,641826815,US
641826816,641827839,MX
641827840,641828351,US
-641828352,641830911,MX
-641830912,642094335,US
-642094336,642095103,CA
+641828352,641832959,MX
+641832960,642089471,US
+642089472,642089727,CA
+642089728,642092543,US
+642092544,642092799,CA
+642092800,642093055,US
+642093056,642095103,CA
642095104,642096127,US
642096128,642096639,CA
-642096640,642113535,US
+642096640,642097151,US
+642097152,642105343,CA
+642105344,642113535,US
642113536,642115583,AU
642115584,642387967,US
642387968,642392063,CA
-642392064,643219519,US
+642392064,642394111,US
+642394112,642396159,CA
+642396160,642793471,US
+642793472,642794495,CA
+642794496,642797567,US
+642797568,642797823,CA
+642797824,642799615,US
+642799616,642801663,CA
+642801664,643219519,US
643219520,643219523,CA
643219524,643219526,US
643219527,643219527,CA
@@ -7262,70 +7769,102 @@
643294208,643294719,US
643294720,643294975,RU
643294976,643295231,DE
-643295232,643296767,US
+643295232,643295487,PR
+643295488,643295743,US
+643295744,643295999,PR
+643296000,643296255,US
+643296256,643296511,PR
+643296512,643296767,US
643296768,643297023,PR
643297024,643299583,US
643299584,643299839,HK
-643299840,643318847,US
-643318848,643318911,CA
-643318912,643321855,US
-643321856,643325951,CA
-643325952,644051967,US
+643299840,643302911,US
+643302912,643303423,CA
+643303424,643317759,US
+643317760,643325951,CA
+643325952,643346431,US
+643346432,643346943,CA
+643346944,643362815,US
+643362816,643363327,CA
+643363328,644051967,US
644051968,644052479,MF
644052480,644052735,GP
644052736,644052991,MF
644052992,644055039,US
644055040,644055807,CA
644055808,644056063,US
-644056064,644057087,CA
-644057088,644058623,US
-644058624,644058879,CA
+644056064,644057599,CA
+644057600,644058111,US
+644058112,644058879,CA
644058880,644059135,US
644059136,644059647,CA
644059648,644060159,US
-644060160,644061183,CA
-644061184,644067327,US
-644067328,644069375,CA
-644069376,644070143,US
-644070144,644070399,CA
-644070400,644070911,US
-644070912,644071167,CA
-644071168,644084479,US
+644060160,644061631,CA
+644061632,644061663,US
+644061664,644062719,CA
+644062720,644062975,US
+644062976,644065023,CA
+644065024,644065055,US
+644065056,644065279,CA
+644065280,644066303,US
+644066304,644066815,CA
+644066816,644067327,US
+644067328,644071423,CA
+644071424,644084479,US
644084480,644084735,GU
644084736,644239615,US
644239616,644239871,CA
-644239872,644323391,US
-644323392,644323407,CA
-644323408,644403199,US
-644403200,644403327,CA
-644403328,644422911,US
+644239872,644247551,US
+644247552,644249599,CA
+644249600,644323327,US
+644323328,644325375,CA
+644325376,644388863,US
+644388864,644389375,CA
+644389376,644389503,US
+644389504,644390911,CA
+644390912,644399103,US
+644399104,644399359,CA
+644399360,644403199,US
+644403200,644403711,CA
+644403712,644407807,US
+644407808,644408319,CA
+644408320,644413439,US
+644413440,644414463,CA
+644414464,644422911,US
644422912,644423423,JP
-644423424,644634367,US
+644423424,644569087,US
+644569088,644571135,PR
+644571136,644629759,US
+644629760,644630015,CA
+644630016,644634367,US
644634368,644636671,CA
-644636672,644718847,US
-644718848,644718911,CA
-644718912,644719103,RU
-644719104,644719359,US
-644719360,644719615,CA
-644719616,644720127,US
-644720128,644720639,CA
+644636672,644718719,US
+644718720,644718783,CA
+644718784,644718847,US
+644718848,644718943,CA
+644718944,644719359,US
+644719360,644720639,CA
644720640,644759551,US
-644759552,644760575,CA
-644760576,644761087,US
-644761088,644761343,CA
-644761344,644763903,US
-644763904,644764159,CA
-644764160,644765439,US
-644765440,644765695,CA
-644765696,644767878,US
+644759552,644761599,CA
+644761600,644763647,US
+644763648,644767743,CA
+644767744,644767878,US
644767879,644767879,CA
-644767880,644835071,US
+644767880,644773887,US
+644773888,644775935,CA
+644775936,644833279,US
+644833280,644834815,CA
+644834816,644834817,US
+644834818,644834818,CA
+644834819,644835071,US
644835072,644835327,CA
-644835328,644838143,US
-644838144,644838399,CA
-644838400,644838911,US
-644838912,644839679,CA
-644839680,644845839,US
+644835328,644836351,US
+644836352,644837375,CA
+644837376,644838143,US
+644838144,644839679,CA
+644839680,644840447,US
+644840448,644841471,CA
+644841472,644845839,US
644845840,644845840,RU
644845841,644845841,US
644845842,644845855,RU
@@ -7333,39 +7872,55 @@
644845864,644846079,RU
644846080,644874495,US
644874496,644874751,CA
-644874752,644877311,US
+644874752,644875007,US
+644875008,644875263,CA
+644875264,644877311,US
644877312,644877439,CA
-644877440,644897791,US
-644897792,644898047,CA
-644898048,644900863,US
-644900864,644902911,CA
-644902912,644980735,US
+644877440,644896767,US
+644896768,644902911,CA
+644902912,644903170,US
+644903171,644903171,CA
+644903172,644903423,US
+644903424,644903935,CA
+644903936,644980735,US
644980736,644980991,CA
644980992,644981759,US
-644981760,644982783,CA
+644981760,644982399,CA
+644982400,644982527,US
+644982528,644982783,CA
644982784,644986111,US
644986112,644986367,CA
-644986368,645187071,US
-645187072,645187327,CA
-645187328,645221119,US
+644986368,644987135,US
+644987136,644987903,CA
+644987904,645185535,US
+645185536,645193727,CA
+645193728,645221119,US
645221120,645222399,CA
-645222400,645227775,US
-645227776,645228031,CA
-645228032,645481405,US
-645481406,645481406,CA
-645481407,645485567,US
-645485568,645485695,CA
-645485696,645485823,US
-645485824,645486079,CA
-645486080,645486591,US
-645486592,645486847,CA
-645486848,645487103,US
-645487104,645487615,CA
-645487616,645487871,US
-645487872,645487935,CA
-645487936,645547399,US
+645222400,645223935,US
+645223936,645224191,CA
+645224192,645224959,US
+645224960,645225215,CA
+645225216,645225471,US
+645225472,645225983,CA
+645225984,645227519,US
+645227520,645228031,CA
+645228032,645229055,US
+645229056,645230079,CA
+645230080,645480447,US
+645480448,645482495,CA
+645482496,645484543,US
+645484544,645488639,CA
+645488640,645525503,US
+645525504,645529599,CA
+645529600,645539839,US
+645539840,645540863,CA
+645540864,645547399,US
645547400,645547407,CA
-645547408,645611519,US
+645547408,645576703,US
+645576704,645576997,CA
+645576998,645576998,US
+645576999,645577215,CA
+645577216,645611519,US
645611520,645615615,MX
645615616,645644351,US
645644352,645644415,MX
@@ -7384,38 +7939,42 @@
645713920,645744639,US
645744640,645745663,GB
645745664,645873663,US
-645873664,645873919,CA
-645873920,645984255,US
+645873664,645877759,CA
+645877760,645980159,US
+645980160,645982719,CA
+645982720,645984255,US
645984256,645988351,CA
645988352,645989450,US
645989451,645989451,CA
-645989452,646084097,US
-646084098,646084098,CA
-646084099,646160383,US
+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,646195560,US
-646195561,646195561,CA
-646195562,646197247,US
-646197248,646197759,CA
-646197760,646198032,US
-646198033,646198033,CA
-646198034,646198042,US
-646198043,646198043,CA
-646198044,646198271,US
-646198272,646198783,CA
-646198784,646199384,US
-646199385,646199385,CA
-646199386,646199807,US
-646199808,646200319,CA
-646200320,646250495,US
-646250496,646256639,CA
-646256640,646711807,US
+646164480,646193151,US
+646193152,646194943,CA
+646194944,646195199,US
+646195200,646198783,CA
+646198784,646199295,US
+646199296,646201343,CA
+646201344,646250495,US
+646250496,646258687,CA
+646258688,646262783,US
+646262784,646264831,CA
+646264832,646711807,US
646711808,646712319,CA
-646712320,646735103,US
-646735104,646735231,CA
-646735232,646765839,US
+646712320,646734847,US
+646734848,646735359,CA
+646735360,646764543,US
+646764544,646765823,CA
+646765824,646765839,US
646765840,646765847,CA
-646765848,653434879,US
+646765848,646766079,US
+646766080,646766591,CA
+646766592,653434879,US
653434880,653443071,CA
653443072,654311423,US
654311424,654311679,CN
@@ -7439,7 +7998,9 @@
675447168,675447295,HK
675447296,675447423,US
675447424,675447551,BR
-675447552,675545087,US
+675447552,675448575,US
+675448576,675449087,GB
+675449088,675545087,US
675545088,675610623,NL
675610624,675635199,IE
675635200,675643391,CA
@@ -7458,7 +8019,9 @@
676176192,676176255,US
676176256,676176383,HK
676176384,676176639,IE
-676176640,676192767,US
+676176640,676179455,US
+676179456,676179711,IE
+676179712,676192767,US
676192768,676192895,HK
676192896,676193023,IE
676193024,676193535,US
@@ -7496,7 +8059,11 @@
677020192,677020479,US
677020480,677020543,GB
677020544,677020607,KR
-677020608,677021951,US
+677020608,677020927,US
+677020928,677020959,NL
+677020960,677020991,BR
+677020992,677021023,IE
+677021024,677021951,US
677021952,677021983,JP
677021984,677022079,US
677022080,677022143,IN
@@ -7511,22 +8078,35 @@
677022464,677022527,US
677022528,677022591,GB
677022592,677022655,KR
-677022656,677023103,US
-677023104,677023111,IE
-677023112,677380095,US
+677022656,677023007,US
+677023008,677023039,NL
+677023040,677023071,BR
+677023072,677023135,IE
+677023136,677023167,NL
+677023168,677023935,US
+677023936,677023967,NL
+677023968,677023999,BR
+677024000,677024031,IE
+677024032,677380095,US
677380096,677380127,AU
677380128,677380159,IE
677380160,677380191,NL
677380192,677380543,US
-677380544,677380719,SG
-677380720,677380895,KR
+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,677381247,HK
+677381072,677381111,HK
+677381112,677381119,US
+677381120,677381247,HK
677381248,677381375,US
677381376,677381407,AT
677381408,677381423,NL
@@ -7598,7 +8178,7 @@
677385984,677385999,FI
677386000,677386015,US
677386016,677386047,IN
-677386048,677386063,CA
+677386048,677386063,HK
677386064,677386095,US
677386096,677386111,BR
677386112,677386127,CA
@@ -7633,12 +8213,12 @@
677387320,677387327,FI
677387328,677387455,AT
677387456,677387487,FI
-677387488,677387663,SG
+677387488,677387663,US
677387664,677387839,HK
677387840,677387863,AT
677387864,677387967,US
677387968,677388007,FI
-677388008,677388183,KR
+677388008,677388183,US
677388184,677388223,FI
677388224,677388351,US
677388352,677388527,MY
@@ -7682,7 +8262,7 @@
677393744,677393759,NL
677393760,677393855,US
677393856,677393863,FI
-677393864,677393927,BR
+677393864,677393927,US
677393928,677394279,JP
677394280,677394287,FI
677394288,677394303,AU
@@ -7724,18 +8304,13 @@
677655552,677678079,US
677678080,677678591,IN
677678592,677679103,US
-677679104,677679263,AU
-677679264,677679327,US
-677679328,677679615,AU
+677679104,677679615,AU
677679616,677680639,US
-677680640,677680767,AU
-677680768,677680831,US
-677680832,677681119,AU
-677681120,677681151,US
+677680640,677681151,AU
677681152,677683199,JP
677683200,677685247,CA
-677685248,677686271,GB
-677686272,677707775,US
+677685248,677687295,GB
+677687296,677707775,US
677707776,677708799,NL
677708800,677709823,AT
677709824,677713919,NL
@@ -7799,12 +8374,27 @@
677839328,677839343,FI
677839344,677839359,AT
677839360,677840319,US
-677840320,677840639,NL
+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,677841999,FI
+677841968,677841983,NL
+677841984,677841999,FI
677842000,677842015,IE
677842016,677842031,AT
677842032,677842047,NL
@@ -8016,14 +8606,21 @@
678202368,678203135,IE
678203136,678203391,NL
678203392,678205183,US
-678205184,678205439,NL
-678205440,678205695,US
+678205184,678205695,NL
678205696,678205951,KR
678205952,678206463,CA
678206464,678206719,KR
678206720,678206975,IE
678206976,678207487,AU
-678207488,678428671,US
+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,678428671,US
678428672,678436863,IE
678436864,678437887,US
678437888,678438015,IE
@@ -8042,9 +8639,7 @@
678543360,678592511,US
678592512,678623193,NL
678623194,678623194,US
-678623195,678625279,NL
-678625280,678633471,IE
-678633472,678641663,NL
+678623195,678641663,NL
678641664,678649855,AU
678649856,678658047,IE
678658048,678690815,JP
@@ -8085,21 +8680,9 @@
691650560,691666943,GH
691666944,691732479,NG
691732480,691798015,TZ
-691798016,691814399,ZM
-691814400,691814655,ZW
-691814656,691815935,ZM
-691815936,691816191,ZW
-691816192,691816447,ZM
-691816448,691816703,ZW
-691816704,691816959,ZM
-691816960,691817215,ZW
-691817216,691821823,ZM
-691821824,691822079,ZW
-691822080,691823871,ZM
-691823872,691824127,ZW
-691824128,691824639,ZM
-691824640,691825151,ZW
-691825152,691857407,ZM
+691798016,691806207,ZM
+691806208,691830783,ZW
+691830784,691857407,ZM
691857408,691858175,KE
691858176,691863551,ZM
691863552,691929087,ZA
@@ -8130,7 +8713,9 @@
692625408,692626687,KE
692626688,692626943,AO
692626944,692633599,KE
-692633600,692641791,MU
+692633600,692637903,MU
+692637904,692637911,KE
+692637912,692641791,MU
692641792,692649983,GA
692649984,692658175,NG
692658176,692666367,ZA
@@ -8176,7 +8761,9 @@
692852736,692854783,GH
692854784,692856831,ZA
692856832,692858879,MU
-692858880,692860927,MW
+692858880,692859135,MW
+692859136,692859391,UG
+692859392,692860927,MW
692860928,692862975,ZA
692862976,692869119,NG
692869120,692871167,TZ
@@ -8206,8 +8793,8 @@
692932608,692934655,CM
692934656,692936703,BW
692936704,692940799,ZA
-692940800,692941055,MA
-692941056,692941567,CA
+692940800,692941311,MA
+692941312,692941567,CA
692941568,692942847,MA
692942848,692944895,GA
692944896,692946943,MZ
@@ -8314,7 +8901,7 @@
693073920,693074943,SS
693074944,693075967,CV
693075968,693076991,CM
-693076992,693078015,ZW
+693076992,693078015,MU
693078016,693079039,BW
693079040,693080063,KE
693080064,693081087,NG
@@ -8341,7 +8928,10 @@
693103616,693104639,GN
693104640,693105663,ZA
693105664,693106687,MZ
-693106688,693107711,ZA
+693106688,693106951,TZ
+693106952,693106959,ZA
+693106960,693107199,TZ
+693107200,693107711,ZA
693107712,693239807,KE
693239808,693370879,SN
693370880,693403647,ZA
@@ -8389,16 +8979,15 @@
696926208,696928255,ZA
696928256,696930303,BW
696930304,696932351,RW
-696932352,696932607,EG
+696932352,696932607,BJ
696932608,696932863,NG
-696932864,696933375,EG
+696932864,696933375,BJ
696933376,696934399,ZA
696934400,696942591,BF
696942592,696950783,MR
696950784,696958975,NG
696958976,696963071,TZ
-696963072,696965119,UG
-696965120,696966143,NG
+696963072,696966143,UG
696966144,696967167,TZ
696967168,696971263,MZ
696971264,696974335,KE
@@ -8414,7 +9003,9 @@
698056704,698089471,EG
698089472,698220543,ZA
698220544,698351615,GA
-698351616,699400191,ZA
+698351616,699334655,ZA
+699334656,699342847,ZM
+699342848,699400191,ZA
699400192,699465727,EG
699465728,699531263,ZA
699531264,699662335,EG
@@ -8463,7 +9054,7 @@
700381184,700382207,EG
700382208,700383231,KE
700383232,700399615,EG
-700399616,700400639,AO
+700399616,700400639,BW
700400640,700401663,CI
700401664,700402687,MZ
700402688,700403711,UG
@@ -8474,6 +9065,7 @@
700407808,700408831,GH
700408832,700409855,CM
700409856,700410879,LR
+700410880,700411903,NG
700412928,700413951,ZM
700413952,700414975,SC
700414976,700432383,ZA
@@ -8563,13 +9155,11 @@
701423616,701431807,NG
701431808,701439999,CI
701440000,701448191,MG
-701448192,701457919,KE
-701457920,701458175,CG
-701458176,701458831,KE
+701448192,701458831,KE
701458832,701458847,CG
701458848,701462783,KE
-701462784,701463039,CG
-701463040,701463807,KE
+701462784,701463295,CG
+701463296,701463807,KE
701463808,701464063,CG
701464064,701464319,KE
701464320,701464351,CG
@@ -8632,8 +9222,9 @@
702066688,702066943,PL
702066944,702067199,NL
702067200,702067711,PL
-702067712,702070527,CM
-702070528,702070783,RU
+702067712,702068735,NL
+702068736,702070271,CM
+702070272,702070783,RU
702070784,702074879,ZA
702074880,702076927,BW
702076928,702078975,TZ
@@ -8679,9 +9270,13 @@
702328832,702332927,TZ
702332928,702337023,MZ
702337024,702341119,UG
-702341120,702342259,MU
+702341120,702342111,MU
+702342112,702342127,KE
+702342128,702342259,MU
702342260,702342263,KE
-702342264,702344199,MU
+702342264,702343039,MU
+702343040,702343103,KE
+702343104,702344199,MU
702344200,702344971,KE
702344972,702345215,MU
702345216,702349311,KE
@@ -8699,7 +9294,7 @@
702398464,702402559,CV
702402560,702410751,ZA
702410752,702414847,AO
-702414848,702416895,UG
+702414848,702416895,MU
702416896,702418943,KE
702418944,702420991,ZM
702420992,702423039,TZ
@@ -8830,9 +9425,9 @@
703774720,703791103,ZA
703791104,703856639,CD
703856640,703922175,CM
-703922176,703971327,ZA
-703971328,703975423,NG
-703975424,704118783,ZA
+703922176,703954943,ZA
+703954944,703987711,NG
+703987712,704118783,ZA
704118784,704380927,MA
704380928,704643071,LY
704643072,704644095,CN
@@ -8988,9 +9583,9 @@
736188416,736189439,JP
736189440,736190463,IN
736190464,736191487,PK
-736191488,736192511,HK
+736191488,736193535,HK
736193536,736194559,MY
-736194560,736195583,AU
+736194560,736195583,NZ
736195584,736196607,IN
736196608,736198655,CN
736198656,736199679,AU
@@ -9068,7 +9663,7 @@
736394240,736395263,HK
736395264,736396287,MN
736396288,736398335,CN
-736398336,736400383,IN
+736398336,736399359,IN
736400384,736402431,CN
736402432,736402687,NZ
736402688,736402943,SG
@@ -9135,7 +9730,6 @@
736482304,736483327,HK
736483328,736485375,CN
736485376,736486399,IN
-736486400,736487423,NP
736487424,736489471,CN
736489472,736491519,JP
736491520,736493567,ID
@@ -9193,7 +9787,7 @@
736559104,736560127,HK
736560128,736561151,MY
736561152,736562175,HK
-736562176,736563199,CN
+736562176,736563199,SG
736563200,736564223,HK
736564224,736565247,BD
736565248,736566271,AU
@@ -9329,9 +9923,7 @@
737264640,737265663,CN
737265664,737266687,AU
737266688,737267711,HK
-737267712,737276927,CN
-737276928,737277951,IN
-737277952,737279999,CN
+737267712,737279999,CN
737280000,737281023,BD
737281024,737282047,SG
737282048,737288191,CN
@@ -9386,7 +9978,9 @@
737369088,737370111,HK
737370112,737371135,NP
737371136,737375231,HK
-737375232,737376255,AU
+737375232,737375743,AU
+737375744,737375999,SG
+737376000,737376255,AU
737376256,737377279,HK
737377280,737378303,PH
737378304,737379327,CN
@@ -9446,9 +10040,7 @@
737502208,737503231,IN
737503232,737505279,SG
737505280,737506303,AU
-737506304,737507327,BD
-737507328,737507583,AU
-737507584,737508351,BD
+737506304,737508351,BD
737508352,737509375,MY
737509376,737510399,PK
737510400,737511423,AU
@@ -9475,7 +10067,8 @@
737530880,737531903,NC
737531904,737532927,KH
737532928,737533183,HK
-737533184,737533439,PH
+737533184,737533184,PH
+737533185,737533439,MY
737533440,737533695,VN
737533696,737533951,TW
737533952,737534975,AU
@@ -9875,12 +10468,93 @@
738193408,738194431,TH
738194432,738195455,CN
738195456,738197503,KR
-738197504,747175935,US
+738197504,746786303,US
+746786304,746786559,GB
+746786560,747175935,US
747175936,747241471,NL
-747241472,755105791,US
+747241472,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,755417087,BR
+755422208,755423231,AR
+755425280,755429375,BR
+755431424,755433471,UY
756023296,757071871,US
757071872,757071911,NL
757071912,757071919,US
@@ -9900,7 +10574,9 @@
757072776,757072791,US
757072792,757072895,NL
757072896,757072903,US
-757072904,757073007,NL
+757072904,757072911,NL
+757072912,757072919,US
+757072920,757073007,NL
757073008,757073023,US
757073024,757073047,NL
757073048,757073055,US
@@ -9921,8 +10597,7 @@
757110784,757112831,DE
757112832,757113343,US
757113344,757113855,NL
-757113856,757115903,US
-757115904,757116927,NL
+757113856,757116927,US
757116928,757118975,GB
757118976,757119999,NL
757120000,757121023,AU
@@ -9961,7 +10636,9 @@
757716736,757716991,NZ
757716992,757721599,US
757721600,757721855,PH
-757721856,757729279,US
+757721856,757727231,US
+757727232,757728255,VI
+757728256,757729279,US
757729280,757731327,CA
757731328,757733375,US
757733376,757734399,CA
@@ -10051,13 +10728,9 @@
757789440,757789567,NP
757789568,757790975,US
757790976,757791231,WS
-757791232,757792767,US
-757792768,757793279,CA
-757793280,757793791,US
+757791232,757793791,US
757793792,757794047,CA
-757794048,757794815,US
-757794816,757795071,CY
-757795072,757795839,US
+757794048,757795839,US
757795840,757796351,CA
757796352,757796863,US
757796864,757797375,CA
@@ -10066,8 +10739,11 @@
757798400,757799167,US
757799168,757799423,CA
757799424,757799935,US
-757799936,757800959,CA
+757799936,757800191,CA
+757800192,757800447,US
+757800448,757800959,CA
757800960,757809151,US
+757809152,757809407,CA
757809408,757809663,RO
757809664,757809919,GB
757817344,757858303,US
@@ -10115,9 +10791,7 @@
758702080,758710271,NL
758710272,758747391,US
758747392,758747647,LT
-758747648,758750463,US
-758750464,758750719,IN
-758750720,758752199,US
+758747648,758752199,US
758752200,758752207,FI
758752208,758779903,US
758779904,758783999,CA
@@ -10313,7 +10987,13 @@
759693960,759693975,GR
759693976,759726079,US
759726080,759791615,CA
-759791616,759824639,US
+759791616,759799807,US
+759799808,759801855,IL
+759801856,759802367,US
+759802368,759803391,CA
+759803392,759803903,US
+759803904,759804927,GB
+759804928,759824639,US
759824640,759824895,SA
759824896,759825151,CR
759825152,759825407,US
@@ -10361,22 +11041,30 @@
759848960,759955455,CA
759955456,759963647,US
759963648,759965759,NL
-759965760,759975935,US
-759975936,759977471,DE
-759977472,759977983,US
-759977984,759979007,DE
-759979008,759980031,US
+759965760,759966207,US
+759966208,759966719,NL
+759966720,759967743,FR
+759967744,759968767,JP
+759968768,759975935,US
+759975936,759980031,DE
759980032,759984127,JP
-759984128,759985151,AU
-759985152,759988223,US
-759988224,759990783,GB
-759990784,759992319,US
-759992320,759996415,SG
-759996416,760004607,US
-760004608,760006967,JP
-760006968,760007039,US
+759984128,759986175,AU
+759986176,759988223,US
+759988224,759992319,GB
+759992320,759997439,SG
+759997440,760000511,US
+760000512,760004607,SG
+760004608,760006983,JP
+760006984,760006987,US
+760006988,760007007,JP
+760007008,760007039,US
760007040,760012799,JP
-760012800,760111103,US
+760012800,760023039,US
+760023040,760026367,JP
+760026368,760026623,HK
+760026624,760029183,JP
+760029184,760031743,SG
+760031744,760111103,US
760111104,760119295,CA
760119296,760127487,US
760127488,760152063,CA
@@ -10437,7 +11125,8 @@
762398720,762399743,CN
762399744,762400767,IN
762400768,762401023,HK
-762401024,762401791,US
+762401024,762401279,US
+762401280,762401791,KR
762401792,762402815,TH
762402816,762403839,IN
762403840,762404863,AU
@@ -10721,7 +11410,7 @@
762848768,762849279,BD
762849280,762850303,IN
762850304,762851327,HK
-762851328,762852351,IN
+762851328,762851839,IN
762852352,762853375,HK
762853376,762855423,IN
762855424,762857471,KR
@@ -10753,7 +11442,7 @@
762884096,762885119,JP
762885120,762887167,HK
762887168,762888191,IN
-762888192,762890239,JP
+762888192,762889215,JP
762890240,762890495,KR
762890496,762890751,TW
762890752,762891007,HK
@@ -10903,7 +11592,7 @@
763182080,763183103,IN
763183104,763183615,HK
763183616,763183871,LT
-763183872,763184127,HK
+763183872,763184127,JP
763184128,763185151,IN
763186176,763194367,CN
763194368,763196415,HK
@@ -10913,7 +11602,9 @@
763200512,763201535,IN
763201536,763202559,CN
763202560,763207679,IN
-763207680,763209727,HK
+763207680,763208703,HK
+763208704,763208959,US
+763208960,763209727,HK
763209728,763210751,NZ
763210752,763214847,IN
763214848,763215871,JP
@@ -10972,7 +11663,10 @@
763280384,763281407,IN
763281408,763282431,AU
763282432,763285503,IN
-763285504,763286527,SG
+763285504,763286017,SG
+763286018,763286018,US
+763286019,763286271,SG
+763286272,763286527,US
763286528,763287551,CN
763287552,763288575,HK
763288576,763289599,CN
@@ -10988,6 +11682,7 @@
763299840,763301887,CN
763301888,763304959,IN
763304960,763305983,JP
+763305984,763307007,SG
763307008,763308031,CN
763308032,763310079,IN
763310080,763311103,BD
@@ -11022,7 +11717,10 @@
763343872,763344895,AU
763344896,763345919,HK
763345920,763353087,IN
-763353088,763354111,CN
+763353088,763353343,HK
+763353344,763353599,CN
+763353600,763353855,TW
+763353856,763354111,CN
763354112,763360255,IN
763360256,763362303,BD
763362304,763363327,VN
@@ -11037,6 +11735,7 @@
768868352,769130495,ZM
769130496,769392639,MA
769392640,769404927,ZA
+769404928,769405183,TZ
769405184,769405439,ZA
769405440,769405951,CI
769405952,769406975,GN
@@ -11214,7 +11913,8 @@
771683840,771684095,MV
771684096,771684351,MH
771684352,771685375,CN
-771685376,771686399,HK
+771685376,771685631,JP
+771685632,771686399,HK
771686400,771719167,CN
771719168,771720191,US
771720192,771750911,CN
@@ -11229,9 +11929,7 @@
772282624,772282879,KZ
772282880,772283391,RU
772283392,772283647,ES
-772283648,772284159,RU
-772284160,772284415,UZ
-772284416,772284927,RU
+772283648,772284927,RU
772284928,772285183,UA
772285184,772285439,UZ
772285440,772285695,RU
@@ -11292,7 +11990,9 @@
772884480,772886527,LB
772886528,772888575,FR
772888576,772890623,GB
-772890624,772892671,NL
+772890624,772892033,NL
+772892034,772892041,RU
+772892042,772892671,NL
772892672,772894719,GB
772894720,772896767,PL
772896768,772898815,RS
@@ -11569,7 +12269,6 @@
773800960,773801215,SG
773801216,773801471,US
773801472,773801983,CY
-773801984,773804031,IQ
773804032,773806079,GB
773806080,773808127,BE
773808128,773810175,IL
@@ -11701,7 +12400,8 @@
774162739,774162743,UA
774162744,774162778,US
774162779,774162784,CA
-774162785,774162788,UA
+774162785,774162787,UA
+774162788,774162788,VA
774162789,774162798,CA
774162799,774162803,BN
774162804,774162808,TM
@@ -11893,9 +12593,9 @@
778304306,778304306,SI
778304307,778305535,AL
778305536,778371071,IR
-778371072,778388893,GB
-778388894,778388894,DE
-778388895,778395647,GB
+778371072,778388479,GB
+778388480,778389503,DE
+778389504,778395647,GB
778395648,778436607,DE
778436608,778461183,RO
778461184,778461439,TR
@@ -11908,7 +12608,7 @@
778466304,778467327,RO
778467328,778473471,IR
778473472,778474495,RO
-778474496,778475519,GB
+778474496,778475519,US
778475520,778475775,CH
778475776,778476031,RO
778476032,778476287,MD
@@ -11916,7 +12616,9 @@
778477568,778477695,NL
778477696,778480639,RO
778480640,778480895,MD
-778480896,778481663,RO
+778480896,778481151,RO
+778481152,778481407,GB
+778481408,778481663,RO
778481664,778481919,MD
778481920,778482943,GB
778482944,778483199,MD
@@ -11983,9 +12685,7 @@
778666880,778666943,GB
778666944,778667175,FR
778667176,778667179,ES
-778667180,778667295,FR
-778667296,778667311,GB
-778667312,778667347,FR
+778667180,778667347,FR
778667348,778667351,GB
778667352,778667499,FR
778667500,778667503,GB
@@ -12369,7 +13069,9 @@
781975552,782106623,NO
782106624,782254079,RU
782254080,782270463,UA
-782270464,782313471,RU
+782270464,782311167,RU
+782311168,782311423,UA
+782311424,782313471,RU
782313472,782313727,UA
782313728,782317567,RU
782317568,782317695,IN
@@ -12424,9 +13126,7 @@
782667776,782671871,NL
782671872,782672655,LT
782672656,782672663,VG
-782672664,782672783,LT
-782672784,782672791,CH
-782672792,782672871,LT
+782672664,782672871,LT
782672872,782672879,IL
782672880,782673935,LT
782673936,782673943,EE
@@ -12626,8 +13326,7 @@
784334848,784457743,FR
784457744,784458751,GB
784458752,784458767,FR
-784458768,784459775,GB
-784459776,784461823,IT
+784458768,784461823,GB
784461824,784465919,FR
784465920,784596991,SE
784596992,784728063,TR
@@ -12775,15 +13474,11 @@
786919880,786919887,IT
786919888,786920191,GB
786920192,786920199,IT
-786920200,786920223,GB
-786920224,786920231,IT
-786920232,786920615,GB
+786920200,786920615,GB
786920616,786920623,IT
786920624,786920839,GB
786920840,786920847,IT
-786920848,786920855,GB
-786920856,786920863,IT
-786920864,786920999,GB
+786920848,786920999,GB
786921000,786921007,IT
786921008,786921087,GB
786921088,786921095,IT
@@ -12939,8 +13634,7 @@
787711488,787711999,GB
787712000,787712255,MT
787712256,787712511,MA
-787712512,787712767,DE
-787712768,787713023,IT
+787712512,787713023,DE
787713024,787713279,LV
787713280,787713535,SE
787713536,787713791,BG
@@ -12954,13 +13648,18 @@
787715584,787715839,BH
787715840,787718143,NL
787718144,787718655,RU
-787718656,787720191,NL
-787720192,787722239,RU
+787718656,787719167,NL
+787719168,787719423,RU
+787719424,787719935,NL
+787719936,787722239,RU
787722240,787722751,NL
787722752,787725311,RU
-787725312,787742207,NL
-787742208,787742463,RU
-787742464,787750143,NL
+787725312,787741695,NL
+787741696,787741951,RU
+787741952,787742207,NL
+787742208,787742719,RU
+787742720,787749887,NL
+787749888,787750143,US
787750144,787750159,BD
787750160,787750175,BT
787750176,787750191,BN
@@ -12977,7 +13676,9 @@
787750336,787750351,PK
787750352,787750367,PG
787750368,787750383,LK
-787750384,787750911,NL
+787750384,787750399,NL
+787750400,787750655,US
+787750656,787750911,NL
787750912,787755007,GB
787755008,787759103,NL
787759104,787767295,PS
@@ -13069,7 +13770,8 @@
788261376,788261631,GB
788261632,788262143,DE
788262144,788262399,IR
-788262400,788267007,DE
+788262400,788265215,DE
+788265216,788267007,ES
788267008,788271103,SE
788271104,788275199,DE
788275200,788279295,AL
@@ -13173,9 +13875,7 @@
789577728,790102015,US
790102016,790429695,CA
790429696,790626303,IN
-790626304,790841343,US
-790841344,790841599,CA
-790841600,792002559,US
+790626304,792002559,US
792002560,792068095,IT
792068096,792199167,CA
792199168,792330239,US
@@ -13183,14 +13883,21 @@
792723456,793247743,DE
793247744,793313279,NZ
793313280,793378815,DE
-793378816,794329087,US
+793378816,793395199,JP
+793395200,794329087,US
794329088,794361855,SG
794361856,794369288,HK
794369289,794369289,CN
794369290,794378239,HK
794378240,794427391,US
794427392,794460159,HK
-794460160,794558463,US
+794460160,794492927,US
+794492928,794501119,JP
+794501120,794532607,US
+794532608,794532863,HK
+794532864,794533631,US
+794533632,794533887,HK
+794533888,794558463,US
794558464,796917759,CN
796917760,797442047,CA
797442048,800522240,US
@@ -13349,7 +14056,8 @@
839348480,839348735,AT
839348736,839348991,GB
839348992,839349247,AT
-839349248,839350271,DE
+839349248,839349759,DE
+839349760,839350271,US
839350272,839351295,NL
839351296,839352063,DE
839352064,839357439,NL
@@ -13457,7 +14165,9 @@
871038976,871104511,SA
871104512,872153087,GB
872153088,872284159,SA
-872284160,872286871,FR
+872284160,872286271,FR
+872286272,872286335,ES
+872286336,872286871,FR
872286872,872286875,CZ
872286876,872288159,FR
872288160,872288191,ES
@@ -13515,7 +14225,9 @@
872304832,872304895,ES
872304896,872305439,FR
872305440,872305471,GB
-872305472,872306183,FR
+872305472,872305655,FR
+872305656,872305663,GB
+872305664,872306183,FR
872306184,872306191,US
872306192,872306367,FR
872306368,872306399,GB
@@ -13552,7 +14264,9 @@
872316799,872321183,FR
872321184,872321215,FI
872321216,872321279,ES
-872321280,872322943,FR
+872321280,872321379,FR
+872321380,872321383,GB
+872321384,872322943,FR
872322944,872323071,GB
872323072,872323135,FR
872323136,872323199,ES
@@ -13618,7 +14332,9 @@
872346816,872346879,ES
872346880,872346978,FR
872346979,872346979,DE
-872346980,872347063,FR
+872346980,872347039,FR
+872347040,872347055,GB
+872347056,872347063,FR
872347064,872347067,PT
872347068,872348959,FR
872348960,872348975,GB
@@ -13669,9 +14385,7 @@
872374592,872374655,ES
872374656,872375007,FR
872375008,872375039,PT
-872375040,872375215,FR
-872375216,872375231,ES
-872375232,872375295,FR
+872375040,872375295,FR
872375296,872375423,NL
872375424,872375807,FR
872375808,872375871,GB
@@ -13770,7 +14484,10 @@
873725952,874250239,US
874250240,874381311,DE
874381312,874512383,IE
-874512384,875560959,US
+874512384,875446271,US
+875446272,875454463,FR
+875454464,875495423,US
+875495424,875560959,FR
875560960,875823103,IE
875823104,876085247,US
876085248,876150783,GB
@@ -13826,9 +14543,11 @@
878578944,878579199,AU
878579200,878579455,CA
878579456,878579711,GB
-878579712,878579967,US
+878579712,878579967,FR
878579968,878580223,DE
-878580224,878581759,US
+878580224,878580735,US
+878580736,878580991,IN
+878580992,878581759,US
878581760,878582783,IE
878582784,878583807,US
878583808,878591999,GB
@@ -13870,8 +14589,9 @@
878639296,878639311,GB
878639312,878639327,CA
878639328,878639359,US
-878639360,878639375,CN
-878639376,878648831,US
+878639360,878639391,CN
+878639392,878639407,FR
+878639408,878648831,US
878648832,878649343,JP
878649344,878649855,US
878649856,878650111,JP
@@ -13884,14 +14604,17 @@
878657536,878666751,IN
878666752,878667775,US
878667776,878668799,IE
-878668800,878669823,US
+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,878690303,US
+878679808,878680575,US
+878680576,878681343,FR
+878681344,878690303,US
878690304,878694399,KR
878694400,878695423,US
878695424,878696447,SG
@@ -13908,7 +14631,7 @@
878705408,878705663,US
878705664,878705919,KR
878705920,878706175,GB
-878706176,878706431,US
+878706176,878706431,FR
878706432,878706447,BR
878706448,878706463,AU
878706464,878706479,SG
@@ -13917,9 +14640,13 @@
878706512,878706559,US
878706560,878706575,DE
878706576,878706591,CN
-878706592,879763583,US
+878706592,879757055,US
+879757056,879757311,CA
+879757312,879763583,US
879763584,879763711,CA
-879763712,879788031,US
+879763712,879772543,US
+879772544,879772671,CA
+879772672,879788031,US
879788032,879788159,NL
879788160,879788287,IE
879788288,879788543,GB
@@ -13953,7 +14680,10 @@
879821440,879821567,HK
879821568,879821695,SG
879821696,879821823,KR
-879821824,879829119,US
+879821824,879822079,JP
+879822080,879822335,AU
+879822336,879822591,IN
+879822592,879829119,US
879829120,879829247,SG
879829248,879829375,JP
879829376,879829503,HK
@@ -13969,7 +14699,10 @@
879837504,879837567,HK
879837568,879837631,SG
879837632,879837695,KR
-879837696,879841343,US
+879837696,879837823,JP
+879837824,879837951,AU
+879837952,879838079,IN
+879838080,879841343,US
879841344,879841407,SG
879841408,879841471,JP
879841472,879841535,HK
@@ -13979,7 +14712,11 @@
879841792,879841919,KR
879841920,880216831,US
880216832,880217087,CA
-880217088,880269311,US
+880217088,880261119,US
+880261120,880262143,SG
+880262144,880263167,US
+880263168,880264191,IE
+880264192,880269311,US
880269312,880271359,JP
880271360,880543743,US
880543744,880545791,CA
@@ -14000,14 +14737,58 @@
880879234,880879234,CA
880879235,880881663,US
880881664,880885759,PR
-880885760,881859327,US
+880885760,881360895,US
+881360896,881377279,GB
+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,881786879,NL
+881786880,881819647,US
+881819648,881836031,FR
+881836032,881859327,US
881859328,881859583,CA
881859584,881868799,US
881868800,881876991,IT
-881876992,882843337,US
+881876992,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,882843337,US
882843340,882843751,US
-882843754,882851942,US
-882851944,883097599,US
+882843754,882851839,US
+882851840,882851942,IN
+882851944,882860031,IN
+882860032,883097599,US
883097600,883163135,SG
883163136,883228671,IE
883228672,883294207,US
@@ -14070,7 +14851,10 @@
887652352,887654399,CA
887654400,887656447,AU
887656448,887656959,KR
-887656960,887685119,US
+887656960,887657215,US
+887657216,887657471,NL
+887657472,887657727,IE
+887657728,887685119,US
887685120,887701503,CA
887701504,887717887,US
887717888,887750655,NL
@@ -14097,7 +14881,14 @@
888116288,888116351,CA
888116352,888120447,US
888120448,888120511,CA
-888120512,888274943,US
+888120512,888120735,US
+888120736,888120767,KR
+888120768,888120831,GB
+888120832,888126207,US
+888126208,888126335,GB
+888126336,888126719,IN
+888126720,888127103,CA
+888127104,888274943,US
888274944,888291327,CA
888291328,888348671,US
888348672,888356863,JP
@@ -14117,7 +14908,12 @@
888488960,888491007,US
888491008,888492031,IN
888492032,888493055,SG
-888493056,888569855,US
+888493056,888494079,IN
+888494080,888495103,IE
+888495104,888496127,JP
+888496128,888497151,IN
+888497152,888498175,KR
+888498176,888569855,US
888569856,888573951,HK
888573952,888578047,US
888578048,888586239,JP
@@ -14126,9 +14922,19 @@
888758272,889016319,US
889016320,889020415,SG
889020416,889028607,JP
-889028608,889061375,US
-889061376,889094143,JP
-889094144,889192447,US
+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,897238054,DE
897238056,905969663,DE
905969664,910163967,US
@@ -14156,7 +14962,9 @@
916191011,916193279,IE
916193280,916979711,US
916979712,917045247,JP
-917045248,917110783,SG
+917045248,917089018,SG
+917089019,917089019,IN
+917089020,917110783,SG
917110784,917241855,IE
917241856,917635071,US
917635072,917700607,JP
@@ -14202,9 +15010,7 @@
921657344,921657599,JP
921657600,921658111,US
921658112,921658879,IE
-921658880,921661951,US
-921661952,921662207,IE
-921662208,921662463,US
+921658880,921662463,US
921662464,921665535,KR
921665536,921747455,US
921747456,921748479,AU
@@ -14220,10 +15026,7 @@
921755648,921755903,US
921755904,921756159,JP
921756160,921756671,SG
-921756672,921758719,US
-921758720,921759743,KR
-921759744,921759999,DE
-921760000,921760767,US
+921756672,921760767,US
921760768,921761791,BR
921761792,922091519,US
922091520,922189311,IE
@@ -14523,8 +15326,8 @@
962854912,962856959,SG
962856960,964689919,FR
964689920,968753151,BE
-968753152,968761343,NL
-968761344,968818687,CH
+968753152,968757247,NL
+968757248,968818687,CH
968818688,968819711,DE
968819712,968851455,BE
968851456,968852479,US
@@ -14843,7 +15646,8 @@
1024262144,1024327679,SG
1024327680,1024327935,US
1024327936,1024328191,AU
-1024328192,1024328703,US
+1024328192,1024328447,HK
+1024328448,1024328703,US
1024328704,1024329727,CN
1024329728,1024330751,JP
1024330752,1024331775,AU
@@ -14912,7 +15716,9 @@
1026408448,1026416639,JP
1026416640,1026420735,CN
1026420736,1026422783,JP
-1026422784,1026424831,AU
+1026422784,1026423039,AU
+1026423040,1026423295,SG
+1026423296,1026424831,AU
1026424832,1026490623,JP
1026490624,1026491135,SG
1026491136,1026491903,JP
@@ -15006,7 +15812,9 @@
1040449536,1040457727,FR
1040457728,1040465919,ME
1040465920,1040474111,DE
-1040474112,1040482303,CZ
+1040474112,1040477183,CZ
+1040477184,1040477184,KG
+1040477185,1040482303,CZ
1040482304,1040515071,BE
1040515072,1040547839,GB
1040547840,1040580607,RU
@@ -15025,14 +15833,16 @@
1040983552,1040983807,FO
1040983808,1040990207,DK
1040990208,1040998399,CY
-1040998400,1041002495,EG
+1040998400,1041002495,SD
1041002496,1041004543,KE
1041004544,1041006591,EG
1041006592,1041039359,CH
1041039360,1041072127,SE
1041072128,1041080319,GB
1041080320,1041088511,IT
-1041088512,1041096703,AT
+1041088512,1041093631,AT
+1041093632,1041094143,US
+1041094144,1041096703,AT
1041096704,1041235967,ES
1041235968,1041244159,UA
1041244160,1041252351,RU
@@ -15060,7 +15870,9 @@
1041728560,1041728655,FR
1041728656,1041728671,IT
1041728672,1041748991,FR
-1041749248,1041760255,FR
+1041749248,1041752319,FR
+1041752320,1041752575,AT
+1041752576,1041760255,FR
1041760256,1041768447,DE
1041768448,1041776639,NO
1041776640,1041784831,CZ
@@ -15150,10 +15962,11 @@
1043897344,1043897855,NG
1043897856,1043899391,GB
1043899392,1043899647,CG
-1043899648,1043907071,GB
-1043907072,1043907327,NG
-1043907328,1043910143,GB
-1043910400,1043919442,GB
+1043899648,1043902463,GB
+1043902464,1043908607,US
+1043908608,1043910143,DE
+1043910400,1043910655,DE
+1043910656,1043919442,GB
1043919443,1043919443,SS
1043919444,1043920895,GB
1043920896,1043921919,UG
@@ -15202,7 +16015,9 @@
1044589056,1044589311,DE
1044589312,1044625631,GB
1044625632,1044625647,RS
-1044625648,1044636671,GB
+1044625648,1044627391,GB
+1044627392,1044627455,ES
+1044627456,1044636671,GB
1044636672,1044637695,DE
1044637696,1044638463,GB
1044638464,1044638719,DE
@@ -15222,7 +16037,9 @@
1044692423,1044692423,IM
1044692424,1044692991,GG
1044692992,1044697087,AT
-1044697088,1044699135,DE
+1044697088,1044697343,DE
+1044697344,1044698111,AT
+1044698112,1044699135,DE
1044699136,1044701183,AT
1044701184,1044709375,EG
1044709376,1044717567,RU
@@ -15320,7 +16137,8 @@
1045323776,1045364735,FI
1045364736,1045430271,DK
1045430272,1045446655,DE
-1045446656,1045454847,SK
+1045446656,1045453823,HU
+1045453824,1045454847,SK
1045454848,1045460991,DE
1045460992,1045461503,FR
1045461504,1045461631,DE
@@ -15346,9 +16164,7 @@
1045755904,1045757951,UA
1045757952,1045790719,LV
1045790720,1045798911,FR
-1045798912,1045824355,IT
-1045824356,1045824359,SI
-1045824360,1045889023,IT
+1045798912,1045889023,IT
1045889024,1045921791,ES
1045921792,1045954559,PL
1045954560,1045987327,BE
@@ -15393,7 +16209,9 @@
1046482952,1046482952,DE
1046482953,1046483199,GB
1046483200,1046483231,DE
-1046483232,1046485303,GB
+1046483232,1046484711,GB
+1046484712,1046484719,DE
+1046484720,1046485303,GB
1046485304,1046485311,DE
1046485312,1046485903,GB
1046485904,1046485911,DE
@@ -15411,7 +16229,9 @@
1046489472,1046489487,ES
1046489488,1046489503,GB
1046489504,1046489519,DE
-1046489520,1046489999,GB
+1046489520,1046489975,GB
+1046489976,1046489983,DE
+1046489984,1046489999,GB
1046490000,1046490007,DE
1046490008,1046492471,GB
1046492472,1046492479,DE
@@ -15455,11 +16275,7 @@
1046498688,1046498695,DE
1046498696,1046498799,GB
1046498800,1046498807,DE
-1046498808,1046499255,GB
-1046499256,1046499263,DE
-1046499264,1046499367,GB
-1046499368,1046499375,DE
-1046499376,1046502106,GB
+1046498808,1046502106,GB
1046502107,1046502108,DE
1046502109,1046503095,GB
1046503096,1046503103,DE
@@ -15485,7 +16301,9 @@
1046524488,1046524495,DE
1046524496,1046524615,GB
1046524616,1046524623,DE
-1046524624,1046525351,GB
+1046524624,1046524647,GB
+1046524648,1046524655,DE
+1046524656,1046525351,GB
1046525352,1046525359,DE
1046525360,1046525439,GB
1046525440,1046525695,DE
@@ -15493,7 +16311,9 @@
1046525952,1046527999,DE
1046528000,1046528335,GB
1046528336,1046528383,DE
-1046528384,1046528535,GB
+1046528384,1046528505,GB
+1046528506,1046528506,DE
+1046528507,1046528535,GB
1046528536,1046528543,DE
1046528544,1046529023,GB
1046529024,1046530047,DE
@@ -15507,8 +16327,8 @@
1046533538,1046533538,DE
1046533539,1046533615,GB
1046533616,1046533631,DE
-1046533632,1046535439,GB
-1046535440,1046535448,DE
+1046533632,1046535447,GB
+1046535448,1046535448,DE
1046535449,1046535623,GB
1046535624,1046535631,DE
1046535632,1046535665,GB
@@ -15552,10 +16372,10 @@
1046773760,1046781951,FR
1046781952,1046791167,GB
1046791168,1046792191,IT
-1046792192,1046793215,IN
+1046792192,1046793215,US
1046793216,1046794239,GB
-1046794240,1046794495,US
-1046794496,1046796287,GB
+1046794240,1046795007,US
+1046795008,1046796287,GB
1046796288,1046797311,US
1046797312,1046798335,GB
1046798336,1046806527,HU
@@ -15612,8 +16432,7 @@
1047527424,1047529471,US
1047529472,1047530495,NL
1047530496,1047531007,GB
-1047531008,1047531263,RS
-1047531264,1047533567,BE
+1047531008,1047533567,BE
1047533568,1047534847,DE
1047534848,1047535103,BE
1047535104,1047535359,US
@@ -15670,12 +16489,14 @@
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
@@ -15759,6 +16580,8 @@
1048981248,1048981503,GB
1048987480,1048987487,DE
1048991960,1048991967,DE
+1048992528,1048992535,DE
+1048992608,1048992615,DE
1049006080,1049006335,DE
1049008128,1049009151,DE
1049016320,1049018367,DE
@@ -15797,14 +16620,10 @@
1049493504,1049559039,FI
1049559040,1049698303,DE
1049698304,1049699071,NL
-1049699328,1049699583,NL
-1049699584,1049699839,BW
-1049699840,1049700351,NL
+1049699328,1049700351,NL
1049700352,1049702399,DE
1049702400,1049706495,NL
-1049706496,1049716735,GB
-1049716736,1049717759,IQ
-1049717760,1049722879,GB
+1049706496,1049722879,GB
1049722880,1049731071,IS
1049731072,1049739263,FI
1049739264,1049755647,NL
@@ -15919,7 +16738,7 @@
1051984752,1051984767,DE
1051990016,1051991039,DE
1052001280,1052002303,DE
-1052011264,1052012031,DE
+1052011264,1052012287,DE
1052017536,1052017567,DE
1052041216,1052041471,DE
1052041472,1052043215,GB
@@ -17006,9 +17825,7 @@
1056874752,1056874943,IE
1056874944,1056874975,GB
1056874976,1056875007,IE
-1056875008,1056875663,GB
-1056875664,1056875671,IE
-1056875672,1056964607,GB
+1056875008,1056964607,GB
1056964608,1061227263,US
1061227264,1061227519,BO
1061227520,1061558271,US
@@ -17067,7 +17884,11 @@
1064221952,1064222207,MX
1064222208,1064445183,US
1064445184,1064445439,PK
-1064445440,1065493759,US
+1064445440,1065372927,US
+1065372928,1065372959,PR
+1065372960,1065372991,US
+1065372992,1065373055,PR
+1065373056,1065493759,US
1065493760,1065494015,GB
1065494016,1065506047,US
1065506048,1065506559,GB
@@ -17151,7 +17972,9 @@
1068017664,1068018175,YE
1068018176,1068123135,US
1068123136,1068123647,BB
-1068123648,1068175871,US
+1068123648,1068157847,US
+1068157848,1068157851,CA
+1068157852,1068175871,US
1068175872,1068176383,YE
1068176384,1068199935,US
1068199936,1068204031,CA
@@ -17308,7 +18131,9 @@
1073049065,1073049065,CW
1073049066,1073049599,US
1073049600,1073052671,BS
-1073052672,1073116159,US
+1073052672,1073075199,US
+1073075200,1073075455,CA
+1073075456,1073116159,US
1073116160,1073117183,GB
1073117184,1073118207,US
1073118208,1073118719,NL
@@ -17455,21 +18280,23 @@
1074937856,1074946047,CA
1074946048,1074962431,US
1074962432,1074970623,CA
-1074970624,1075265535,US
+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
+1075494912,1075558655,US
+1075558656,1075558911,VI
+1075558912,1075576831,US
1075576832,1075576895,NO
1075576896,1075576896,SE
1075576897,1075585023,NO
1075585024,1075609599,US
1075609600,1075613695,TT
-1075617792,1075769343,US
-1075769344,1075773439,CA
-1075773440,1075855359,US
+1075617792,1075855359,US
1075855360,1075871743,DO
1075871744,1075904511,US
1075904512,1075920895,JP
@@ -17535,9 +18362,7 @@
1076005632,1076006399,US
1076006400,1076006655,CA
1076006656,1076006911,US
-1076006912,1076007167,CA
-1076007168,1076007423,US
-1076007424,1076007935,CA
+1076006912,1076007935,CA
1076007936,1076008447,US
1076008448,1076009215,CA
1076009216,1076009727,US
@@ -17601,14 +18426,13 @@
1076424704,1076428799,CA
1076428800,1076543487,US
1076543488,1076559871,CA
-1076559872,1076625407,US
-1076690944,1076756479,US
+1076559872,1076756479,US
1076756480,1076772863,CA
1076772864,1076823009,US
1076823010,1076823011,CR
1076823012,1076850687,US
-1076850688,1076850943,CA
-1076850944,1076855044,US
+1076850688,1076851711,CA
+1076851712,1076855044,US
1076855045,1076855045,MX
1076855046,1076879505,US
1076879506,1076879507,CA
@@ -17658,9 +18482,7 @@
1077977088,1077985279,CA
1077985280,1077993471,US
1077993472,1078001663,CA
-1078001664,1078065039,US
-1078065040,1078065047,CA
-1078065048,1078067199,US
+1078001664,1078067199,US
1078067200,1078071295,BS
1078071296,1078075391,CA
1078075392,1078124543,US
@@ -17735,7 +18557,9 @@
1078517760,1078525951,CA
1078525952,1078575359,US
1078575360,1078575615,CA
-1078575616,1078722559,US
+1078575616,1078594815,US
+1078594816,1078594943,HK
+1078594944,1078722559,US
1078722560,1078734847,AR
1078734848,1078737919,CO
1078737920,1078738943,EC
@@ -17765,9 +18589,7 @@
1079320576,1079322831,CA
1079322832,1079322839,US
1079322840,1079328767,CA
-1079328768,1079378175,US
-1079378176,1079378943,CA
-1079378944,1079379199,US
+1079328768,1079379199,US
1079379200,1079379455,CA
1079379456,1079383039,US
1079383040,1079383295,VG
@@ -17840,15 +18662,13 @@
1079567360,1079567615,AU
1079567616,1079574527,US
1079574528,1079578623,PR
-1079582720,1079623679,US
+1079578624,1079623679,US
1079623680,1079627775,PR
1079627776,1079664639,US
1079664640,1079668735,CA
1079668736,1079669247,US
1079669248,1079669759,NL
-1079669760,1079675903,US
-1079675904,1079676415,CA
-1079676416,1079861247,US
+1079669760,1079861247,US
1079861248,1079865343,CA
1079865344,1079917055,US
1079917056,1079917311,KY
@@ -17909,7 +18729,9 @@
1081037312,1081037567,CA
1081037568,1081038335,US
1081038336,1081040895,CA
-1081040896,1081212927,US
+1081040896,1081129983,US
+1081129984,1081130495,CA
+1081130496,1081212927,US
1081212928,1081278463,CA
1081278464,1081369599,US
1081369600,1081370111,CO
@@ -17983,7 +18805,9 @@
1082945536,1082949631,CA
1082949632,1082982399,US
1082982400,1083015167,CA
-1083015168,1083267583,US
+1083015168,1083142399,US
+1083142400,1083142655,IN
+1083142656,1083267583,US
1083267584,1083268095,JP
1083268096,1083396095,US
1083396096,1083400191,BM
@@ -18038,9 +18862,13 @@
1087398912,1087399423,GB
1087399424,1087405407,US
1087405408,1087405423,MX
-1087405424,1087413895,US
+1087405424,1087413879,US
+1087413880,1087413883,ES
+1087413884,1087413895,US
1087413896,1087413903,DE
-1087413904,1087416985,US
+1087413904,1087414783,US
+1087414784,1087415039,CA
+1087415040,1087416985,US
1087416986,1087416986,GB
1087416987,1087418367,US
1087418368,1087419391,GB
@@ -18059,7 +18887,7 @@
1087466888,1087496703,US
1087496704,1087496959,CA
1087496960,1087501471,US
-1087501472,1087501479,GB
+1087501472,1087501479,HK
1087501480,1087501535,US
1087501536,1087501695,HK
1087501696,1087501775,US
@@ -18094,19 +18922,21 @@
1087725568,1087726015,GB
1087726016,1087726047,FR
1087726048,1087727615,GB
-1087727616,1087741951,US
+1087727616,1087735743,US
+1087735744,1087735807,CA
+1087735808,1087741951,US
1087741952,1087743569,FR
1087743570,1087743570,GB
1087743571,1087743597,FR
1087743598,1087743598,US
1087743599,1087746047,FR
1087746048,1087758335,US
-1087758336,1087761919,PR
-1087761920,1087762431,US
-1087762432,1087766527,PR
+1087758336,1087766527,PR
1087766528,1087798943,US
1087798944,1087798975,CA
-1087798976,1087837359,US
+1087798976,1087821567,US
+1087821568,1087821823,GB
+1087821824,1087837359,US
1087837360,1087837367,BR
1087837368,1087837695,US
1087837696,1087837951,BR
@@ -18127,9 +18957,7 @@
1087950120,1088012767,US
1088012768,1088012775,PR
1088012776,1088684031,US
-1088684032,1088740351,CA
-1088740352,1088741375,US
-1088741376,1088946175,CA
+1088684032,1088946175,CA
1088946176,1089055999,US
1089056256,1089057279,US
1089057536,1089151231,US
@@ -18138,7 +18966,9 @@
1089152256,1089152511,NL
1089152512,1089153279,US
1089153280,1089153535,SG
-1089153536,1089167359,US
+1089153536,1089154303,US
+1089154304,1089154559,SG
+1089154560,1089167359,US
1089167360,1089171455,CA
1089171456,1089183231,US
1089183232,1089183487,GB
@@ -18176,14 +19006,8 @@
1089462528,1089462783,US
1089462784,1089463039,CA
1089463040,1089463295,US
-1089463296,1089464319,CA
-1089464320,1089465855,US
-1089465856,1089466367,GB
-1089466368,1089526783,US
-1089526784,1089527039,VE
-1089527040,1089579519,US
-1089579520,1089580031,VE
-1089580032,1089881599,US
+1089463296,1089465343,CA
+1089465344,1089881599,US
1089881600,1089882111,GB
1089882112,1089882623,US
1089882624,1089883135,GB
@@ -18274,8 +19098,8 @@
1093120416,1093120431,CA
1093120432,1093120511,US
1093120512,1093120767,GB
-1093120768,1093121023,US
-1093121024,1093122047,CA
+1093120768,1093121535,US
+1093121536,1093122047,CA
1093122048,1093122175,US
1093122176,1093122303,CA
1093122304,1093122751,US
@@ -18286,13 +19110,13 @@
1093123952,1093123967,CA
1093123968,1093126143,US
1093126144,1093126399,CA
-1093126400,1093126911,US
-1093126912,1093127167,CA
-1093127168,1093128447,US
-1093128448,1093129215,CA
+1093126400,1093128447,US
+1093128448,1093128703,CA
+1093128704,1093128959,US
+1093128960,1093129215,CA
1093129216,1093130751,US
-1093130752,1093131007,CA
-1093131008,1093132543,US
+1093130752,1093131263,CA
+1093131264,1093132543,US
1093132544,1093133055,CA
1093133056,1093135359,US
1093135360,1093135615,CA
@@ -18347,12 +19171,7 @@
1094064872,1094064887,IE
1094064888,1094065087,US
1094065088,1094065119,IE
-1094065120,1094065151,US
-1094065152,1094065535,NL
-1094065536,1094065855,US
-1094065856,1094066047,NL
-1094066048,1094066159,US
-1094066160,1094066175,NL
+1094065120,1094066175,US
1094066176,1094066407,IE
1094066408,1094066415,US
1094066416,1094066431,IE
@@ -18390,7 +19209,9 @@
1094124544,1094124799,IE
1094124800,1094139039,US
1094139040,1094139051,IE
-1094139052,1094146047,US
+1094139052,1094139063,US
+1094139064,1094139067,CN
+1094139068,1094146047,US
1094146048,1094146079,KR
1094146080,1094146111,HK
1094146112,1094146143,SG
@@ -18435,20 +19256,18 @@
1097785344,1097830399,US
1097830400,1097834495,CA
1097834496,1097896191,US
-1097896192,1097896447,VI
-1097896448,1097896959,US
-1097896960,1097897215,VI
-1097897216,1097948415,US
-1097948416,1097948927,VI
-1097948928,1097951743,US
-1097951744,1097951999,VI
-1097952000,1097952255,US
-1097952256,1097953279,VI
+1097896192,1097897471,VI
+1097897472,1097947135,US
+1097947136,1097949183,VI
+1097949184,1097951231,US
+1097951232,1097953279,VI
1097953280,1098070271,US
1098070272,1098070279,GR
1098070280,1098070295,US
1098070296,1098070303,BE
-1098070304,1098178383,US
+1098070304,1098096287,US
+1098096288,1098096295,BR
+1098096296,1098178383,US
1098178384,1098178391,CA
1098178392,1098891623,US
1098891624,1098891631,AU
@@ -18480,9 +19299,7 @@
1101425920,1101426175,EC
1101426176,1101459455,US
1101459456,1101461503,BB
-1101461504,1101469695,US
-1101469696,1101471743,HN
-1101471744,1101475839,US
+1101461504,1101475839,US
1101475840,1101479935,CO
1101479936,1101484031,US
1101484032,1101488127,CO
@@ -18514,9 +19331,7 @@
1101869056,1101869567,GH
1101869568,1101871103,US
1101871104,1101873151,BO
-1101873152,1101905407,US
-1101905408,1101905663,GH
-1101905664,1101992063,US
+1101873152,1101992063,US
1101992064,1101992191,NL
1101992192,1102004735,US
1102004736,1102004991,IN
@@ -18637,7 +19452,9 @@
1109934592,1109934847,GB
1109934848,1110126591,US
1110126592,1110130687,CA
-1110130688,1110270207,US
+1110130688,1110248623,US
+1110248624,1110248631,CA
+1110248632,1110270207,US
1110270208,1110270335,CA
1110270336,1110310911,US
1110310912,1110376447,CA
@@ -18677,11 +19494,13 @@
1110473984,1110474239,CA
1110474240,1110540287,US
1110540288,1110573055,CA
-1110573056,1110587391,PR
-1110587392,1110595776,US
-1110595777,1110598655,PR
-1110598656,1110599167,US
-1110599168,1110638591,PR
+1110573056,1110591487,PR
+1110591488,1110593023,US
+1110593024,1110593279,PR
+1110593280,1110593535,US
+1110593536,1110595583,PR
+1110595584,1110595776,US
+1110595777,1110638591,PR
1110638592,1110642687,US
1110642688,1110644735,CA
1110644736,1110654463,US
@@ -18710,21 +19529,35 @@
1111195648,1111212031,CA
1111220224,1111228415,US
1111228416,1111244799,AR
-1111244800,1111982079,US
+1111244800,1111916543,US
+1111916544,1111922687,CA
+1111922688,1111924735,US
+1111924736,1111928831,CA
+1111928832,1111929855,US
+1111929856,1111931135,CA
+1111931136,1111931391,US
+1111931392,1111931903,CA
+1111931904,1111932927,US
+1111932928,1111938047,CA
+1111938048,1111941119,US
+1111941120,1111943167,CA
+1111943168,1111982079,US
1111982080,1111998463,IT
-1111998464,1112424447,US
+1111998464,1112408063,US
+1112408064,1112410111,IL
+1112410112,1112412671,US
+1112412672,1112413183,NL
+1112413184,1112413695,CH
+1112413696,1112414207,CA
+1112414208,1112424447,US
1112432640,1112440831,CA
1112440832,1112498175,US
-1112498176,1112500223,IR
-1112500224,1112500735,US
-1112500736,1112501247,IR
-1112501248,1112502271,US
-1112502272,1112502527,IR
-1112502528,1112502783,US
-1112502784,1112504319,IR
-1112504320,1112530943,US
+1112498176,1112506367,IR
+1112506368,1112530943,US
1112530944,1112539135,CA
-1112539136,1112867327,US
+1112539136,1112653823,US
+1112653824,1112657919,VG
+1112657920,1112867327,US
1112867328,1112867583,BS
1112867584,1112869887,US
1112869888,1112870143,CA
@@ -18738,8 +19571,7 @@
1112907776,1112907783,CA
1112907784,1112931327,US
1112931328,1112931839,CA
-1112931840,1112932095,US
-1112932352,1113591807,US
+1112931840,1113591807,US
1113591808,1113595903,CA
1113595904,1113596415,CL
1113596416,1113596927,GT
@@ -18763,9 +19595,9 @@
1113661440,1113669631,US
1113669632,1113677823,CA
1113677824,1113681919,US
-1113686016,1113696575,US
-1113696576,1113696639,CA
-1113696640,1113718783,US
+1113686016,1113697279,US
+1113697280,1113697791,BM
+1113697792,1113718783,US
1113718784,1113743359,DO
1113743360,1113854207,US
1113854208,1113854463,CA
@@ -18794,8 +19626,10 @@
1114513408,1114513471,SA
1114513472,1114513571,US
1114513572,1114513599,SA
-1114513600,1114514687,US
-1114514688,1114515455,SA
+1114513600,1114514719,US
+1114514720,1114514751,SA
+1114514752,1114514943,US
+1114514944,1114515455,SA
1114515456,1114515463,US
1114515464,1114515471,CA
1114515472,1114517503,US
@@ -18806,7 +19640,9 @@
1114520576,1114520831,PH
1114520832,1114523971,US
1114523972,1114523975,BM
-1114523976,1114524031,US
+1114523976,1114523999,US
+1114524000,1114524007,BM
+1114524008,1114524031,US
1114524032,1114524415,JM
1114524416,1114524671,ZA
1114524672,1114533375,US
@@ -18819,9 +19655,7 @@
1114681344,1114685439,CA
1114685440,1114730495,US
1114730496,1114734591,CA
-1114734592,1114877183,US
-1114877184,1114877439,CY
-1114877440,1115112575,US
+1114734592,1115112575,US
1115112576,1115112607,IN
1115112608,1115113471,US
1115113472,1115114495,HN
@@ -18829,9 +19663,7 @@
1115114752,1115115007,GT
1115115008,1115115519,US
1115115520,1115116543,HN
-1115116544,1115117055,US
-1115117056,1115117311,GB
-1115117312,1115117567,US
+1115116544,1115117567,US
1115117568,1115118591,HN
1115118592,1115119615,SV
1115119616,1115127807,US
@@ -18933,9 +19765,7 @@
1118141184,1118141439,CA
1118141440,1118141695,US
1118141696,1118141951,CA
-1118141952,1118155183,US
-1118155184,1118155199,CA
-1118155200,1118158847,US
+1118141952,1118158847,US
1118158848,1118167039,CA
1118167040,1118474239,US
1118474240,1118478335,CA
@@ -18990,25 +19820,15 @@
1118989312,1118989823,KE
1118989824,1118994175,US
1118994176,1118994431,LR
-1118994432,1119109119,US
+1118994432,1119072255,US
+1119072256,1119073279,CA
+1119073280,1119109119,US
1119109120,1119109375,CA
1119109376,1119109631,US
1119109632,1119109887,CA
1119109888,1119110143,US
1119110144,1119111167,CA
-1119111168,1119166463,US
-1119171072,1119171327,US
-1119171360,1119171383,US
-1119171384,1119171391,CA
-1119171392,1119171583,US
-1119172056,1119172063,US
-1119172096,1119172159,US
-1119172192,1119172199,US
-1119172200,1119172207,CA
-1119172256,1119172263,US
-1119172352,1119172863,US
-1119172864,1119173631,MX
-1119174656,1119199231,US
+1119111168,1119199231,US
1119199232,1119207169,MN
1119207170,1119207170,US
1119207171,1119207423,MN
@@ -19171,16 +19991,19 @@
1121005568,1121009663,CA
1121009664,1121038335,US
1121038336,1121042431,CA
-1121042432,1121230847,US
+1121042432,1121203199,US
+1121203200,1121204223,JM
+1121204224,1121205247,US
+1121205248,1121205759,PR
+1121205760,1121206271,LC
+1121206272,1121230847,US
1121230848,1121239039,CA
1121239040,1121247231,US
1121247232,1121250303,CA
1121250304,1121250815,BZ
1121250816,1121252863,CA
1121252864,1121253119,BZ
-1121253120,1121253887,CA
-1121253888,1121254143,BZ
-1121254144,1121255423,CA
+1121253120,1121255423,CA
1121255424,1121763327,US
1121763328,1121767423,CA
1121767424,1121878015,US
@@ -19208,14 +20031,18 @@
1122476032,1122480127,PR
1122480128,1122493439,US
1122493440,1122493951,PR
-1122493952,1122497327,US
+1122493952,1122494463,US
+1122494464,1122496511,PR
+1122496512,1122497327,US
1122497328,1122497343,BR
1122497344,1122533375,US
1122533376,1122535423,GB
1122535424,1122538495,KR
1122538496,1122635775,US
1122635776,1122639871,CA
-1122639872,1123123199,US
+1122639872,1122667071,US
+1122667072,1122667135,CH
+1122667136,1123123199,US
1123123200,1123127295,CA
1123127296,1123180543,US
1123180544,1123184639,CA
@@ -19295,7 +20122,9 @@
1125147626,1125156304,US
1125156305,1125156305,DE
1125156306,1125228543,US
-1125228544,1125229055,GB
+1125228544,1125228647,GB
+1125228648,1125228651,FI
+1125228652,1125229055,GB
1125229056,1125237277,US
1125237278,1125237278,GB
1125237279,1125237919,US
@@ -19346,7 +20175,9 @@
1128817408,1128817663,NL
1128817664,1130535935,US
1130535936,1130536191,FR
-1130536192,1133461247,US
+1130536192,1130536959,US
+1130536960,1130539007,GU
+1130539008,1133461247,US
1133461248,1133461503,CA
1133461504,1133785351,US
1133785352,1133785359,IE
@@ -19377,9 +20208,7 @@
1137369088,1137371135,CA
1137371136,1137378815,US
1137378816,1137379071,UA
-1137379072,1137385471,US
-1137385472,1137387519,IL
-1137387520,1137426431,US
+1137379072,1137426431,US
1137426432,1137442815,PR
1137442816,1137491967,US
1137491968,1137508351,CA
@@ -19387,16 +20216,17 @@
1137524736,1137541119,CA
1137541120,1137623039,US
1137623040,1137639423,PR
-1137639424,1137681583,US
+1137639424,1137656831,US
+1137656832,1137657855,GB
+1137657856,1137658879,DE
+1137658880,1137681583,US
1137681584,1137681599,AR
1137681600,1137704959,US
1137704960,1137712383,CA
1137712384,1137712639,US
1137712640,1137713151,CA
1137713152,1137717247,US
-1137721344,1137758207,US
-1137758208,1137758463,GB
-1137758464,1137836031,US
+1137721344,1137836031,US
1137840128,1137840383,CA
1137840384,1137840895,US
1137840896,1137841151,DE
@@ -19437,7 +20267,9 @@
1138180096,1138184191,US
1138184192,1138184447,SG
1138184448,1138184703,US
-1138184704,1138184959,HK
+1138184704,1138184714,CN
+1138184715,1138184715,HK
+1138184716,1138184959,CN
1138184960,1138185215,AU
1138185216,1138185727,CA
1138185728,1138185983,ZA
@@ -19448,10 +20280,16 @@
1138204672,1138212863,US
1138212864,1138216959,CA
1138216960,1138372607,US
-1138372608,1138372863,AS
-1138372864,1138374655,US
-1138374656,1138374911,AS
-1138374912,1138419711,US
+1138372608,1138373631,AS
+1138373632,1138373887,US
+1138373888,1138374143,AS
+1138374144,1138374399,US
+1138374400,1138374911,AS
+1138374912,1138375423,US
+1138375424,1138375679,AS
+1138375680,1138417407,US
+1138417408,1138417663,CA
+1138417664,1138419711,US
1138419712,1138419967,DE
1138419968,1138474239,US
1138474240,1138474751,CA
@@ -19481,18 +20319,18 @@
1138774016,1138778111,CA
1138778112,1138780671,US
1138780672,1138780679,CA
-1138780680,1138786303,US
+1138780680,1138781183,US
+1138781184,1138781695,CA
+1138781696,1138786303,US
1138786304,1138819071,PR
1138819072,1138851839,CA
1138851840,1138917375,US
1138917376,1138937855,CA
1138937856,1138941951,US
1138941952,1138950143,CA
-1138950144,1138958335,US
-1138958336,1138959103,IL
-1138959104,1138959615,US
-1138959616,1138959871,IL
-1138959872,1138970111,US
+1138950144,1138956799,US
+1138956800,1138957311,CA
+1138957312,1138970111,US
1138970112,1138970367,IN
1138970368,1139146751,US
1139146752,1139154943,GT
@@ -19501,7 +20339,9 @@
1139167744,1139168767,PR
1139168768,1139169279,US
1139169280,1139169791,PR
-1139169792,1139176447,US
+1139169792,1139170303,US
+1139170304,1139171327,PR
+1139171328,1139176447,US
1139176448,1139176703,PR
1139176704,1139179519,US
1139179520,1139195903,CA
@@ -19509,15 +20349,7 @@
1139216384,1139220479,CA
1139220480,1139265535,US
1139265536,1139269631,CA
-1139269632,1143258367,US
-1143258368,1143258495,CA
-1143258496,1144098815,US
-1144098816,1144099071,CA
-1144099072,1144796287,US
-1144796288,1144796799,CA
-1144796800,1144866687,US
-1144866688,1144866815,CA
-1144866816,1145099519,US
+1139269632,1145099519,US
1145099520,1145099697,SA
1145099698,1145099699,US
1145099700,1145099775,SA
@@ -19552,7 +20384,9 @@
1145503744,1145520127,CA
1145520128,1150287871,US
1150287872,1150812159,CA
-1150812160,1151889407,US
+1150812160,1151867903,US
+1151867904,1151868927,CA
+1151868928,1151889407,US
1151889408,1151892703,CA
1151892704,1151892711,DZ
1151892712,1151897599,CA
@@ -19586,9 +20420,7 @@
1157755248,1157755263,GR
1157755264,1157758207,US
1157758208,1157758463,RU
-1157758464,1157913215,US
-1157913216,1157913279,CA
-1157913280,1157914194,US
+1157758464,1157914194,US
1157914195,1157914202,IN
1157914203,1157931007,US
1157931008,1157935103,BS
@@ -19605,14 +20437,11 @@
1158152192,1158183467,US
1158183468,1158183468,GB
1158183469,1158234111,US
-1158234112,1158242047,CA
-1158242048,1158242303,US
-1158242304,1158249727,CA
-1158249728,1158295807,US
+1158234112,1158250495,CA
+1158250496,1158295807,US
1158295808,1158296063,GB
1158296064,1158316031,US
1158316032,1158318847,CA
-1158319037,1158319037,CA
1158319104,1158322242,CA
1158322243,1158322243,US
1158322244,1158324223,CA
@@ -19808,7 +20637,11 @@
1161773056,1161777151,SZ
1161777152,1161818111,US
1161818112,1161822207,CA
-1161822208,1161833967,US
+1161822208,1161830852,US
+1161830853,1161830853,BZ
+1161830854,1161831181,US
+1161831182,1161831182,BZ
+1161831183,1161833967,US
1161833968,1161833975,DE
1161833976,1161834979,US
1161834980,1161834980,BZ
@@ -19820,9 +20653,9 @@
1161835227,1161835227,BZ
1161835228,1161835230,US
1161835231,1161835231,PH
-1161835232,1161837174,US
-1161837175,1161837175,BZ
-1161837176,1161837567,US
+1161835232,1161835948,US
+1161835949,1161835949,BZ
+1161835950,1161837567,US
1161837568,1161837823,JP
1161837824,1161885695,US
1161885696,1161886207,JP
@@ -19931,29 +20764,21 @@
1163538576,1163538591,CA
1163538592,1163539199,US
1163539200,1163539455,CA
-1163539456,1163540351,US
+1163539456,1163539711,US
+1163539712,1163539967,CA
+1163539968,1163540351,US
1163540352,1163540479,CA
1163540480,1163540735,US
-1163540736,1163541503,CA
-1163541504,1163542015,VG
-1163542016,1163542527,CA
+1163540736,1163542527,CA
1163542528,1163543295,US
1163543296,1163543551,CA
-1163543552,1163544831,US
-1163544832,1163545087,CA
-1163545088,1163546015,US
+1163543552,1163544575,US
+1163544576,1163545599,CA
+1163545600,1163546015,US
1163546016,1163546031,CA
1163546032,1163546623,US
-1163546624,1163546879,CA
-1163546880,1163547135,US
-1163547136,1163547391,CA
-1163547392,1163547647,US
-1163547648,1163547903,CA
-1163547904,1163548159,US
-1163548160,1163549695,CA
-1163549696,1163549951,US
-1163549952,1163550207,CA
-1163550208,1163550815,US
+1163546624,1163550719,CA
+1163550720,1163550815,US
1163550816,1163550831,CA
1163550832,1163550847,US
1163550848,1163550975,CA
@@ -19986,10 +20811,8 @@
1163565312,1163567103,US
1163567104,1163568127,CA
1163568128,1163571199,US
-1163571200,1163571967,CA
-1163571968,1163572223,US
-1163572224,1163572479,CA
-1163572480,1163573439,US
+1163571200,1163573247,CA
+1163573248,1163573439,US
1163573440,1163573503,IN
1163573504,1163575039,US
1163575040,1163575295,IN
@@ -20022,7 +20845,8 @@
1163588864,1163589631,CA
1163589632,1167851519,US
1167851520,1168113663,CA
-1168113664,1168138239,US
+1168113664,1168121855,MM
+1168121856,1168138239,US
1168138240,1168146431,JM
1168146432,1168211967,US
1168211968,1168220159,CA
@@ -20035,8 +20859,10 @@
1168424960,1168461823,US
1168461824,1168465919,CA
1168465920,1168474111,US
-1168474112,1168488447,CA
-1168488448,1168490495,US
+1168474112,1168488703,CA
+1168488704,1168489471,US
+1168489472,1168489983,CA
+1168489984,1168490495,US
1168490496,1168506879,CA
1168506880,1168510975,US
1168510976,1168515071,CA
@@ -20097,7 +20923,9 @@
1168965120,1168965375,CA
1168965376,1168973823,US
1168973824,1168982015,CA
-1168982016,1169203199,US
+1168982016,1169031167,US
+1169031168,1169035263,DE
+1169035264,1169203199,US
1169203200,1169211391,CA
1169211392,1170190335,US
1170190336,1170190847,GB
@@ -20194,8 +21022,8 @@
1177033728,1177059327,US
1177059328,1177061375,CA
1177061376,1177062143,US
-1177062144,1177075455,CA
-1177075456,1177164415,US
+1177062144,1177075711,CA
+1177075712,1177164415,US
1177164416,1177164543,CA
1177164544,1177164863,US
1177164864,1177164895,CA
@@ -20333,12 +21161,10 @@
1210420480,1210421503,US
1210421504,1210421551,CA
1210421552,1210449919,US
-1210449920,1210545471,CA
-1210545472,1210545503,US
-1210545504,1210557823,CA
-1210557824,1210557951,US
-1210557952,1210580991,CA
-1210580992,1210865262,US
+1210449920,1210580991,CA
+1210580992,1210847231,US
+1210847232,1210851327,BR
+1210851328,1210865262,US
1210865263,1210865270,MY
1210865271,1210925055,US
1210925056,1210941439,CA
@@ -20348,9 +21174,7 @@
1211032272,1211032287,DO
1211032288,1211033087,US
1211033088,1211033599,CO
-1211033600,1211035711,US
-1211035712,1211035775,CA
-1211035776,1211038007,US
+1211033600,1211038007,US
1211038008,1211038011,TT
1211038012,1211038063,US
1211038064,1211038079,TT
@@ -20399,8 +21223,7 @@
1211391217,1211391217,IT
1211391218,1211432959,US
1211432960,1211473919,CA
-1211473920,1211482111,US
-1211498496,1211596799,US
+1211473920,1211596799,US
1211596800,1211605999,CA
1211606000,1211606003,US
1211606004,1211613183,CA
@@ -20425,28 +21248,20 @@
1224091904,1224092159,NL
1224092160,1224094463,US
1224094464,1224094719,NL
-1224094720,1224095231,US
-1224095232,1224095487,NL
-1224095488,1224104959,US
-1224104960,1224105471,NL
-1224105472,1224107007,US
-1224107008,1224107519,NL
-1224107520,1224112127,US
-1224112128,1224113151,NL
-1224113152,1224118271,US
+1224094720,1224118271,US
1224118272,1224119807,NL
1224119808,1224124415,US
1224124416,1224126463,NL
1224126464,1224138751,US
1224138752,1224140799,NL
-1224140800,1224151039,US
-1224151040,1224152575,NL
-1224152576,1224157695,US
+1224140800,1224157695,US
1224157696,1224158207,NL
1224158208,1224167935,US
1224167936,1224169471,NL
1224169472,1224169983,US
-1224169984,1224173567,NL
+1224169984,1224171519,NL
+1224171520,1224173055,US
+1224173056,1224173567,NL
1224173568,1224184063,US
1224184064,1224184319,NL
1224184320,1224189951,US
@@ -20463,9 +21278,7 @@
1224200192,1224200959,NL
1224200960,1224201215,US
1224201216,1224202239,NL
-1224202240,1224210431,US
-1224210432,1224212479,NL
-1224212480,1224327167,US
+1224202240,1224327167,US
1224327168,1224327295,NL
1224327296,1224327935,US
1224327936,1224327943,CA
@@ -20491,9 +21304,9 @@
1224523559,1224523559,JM
1224523560,1224523775,US
1224523776,1224540159,JM
-1224540160,1237189631,US
-1237189632,1237189759,CA
-1237189760,1241743359,US
+1224540160,1224728575,US
+1224728576,1224736767,HK
+1224736768,1241743359,US
1241743360,1241759743,CA
1241759744,1242300415,US
1242300416,1242562559,CA
@@ -20532,9 +21345,13 @@
1247124480,1247124991,PR
1247124992,1247129599,US
1247129600,1247133695,NL
-1247133696,1248864255,US
+1247133696,1247498239,US
+1247498240,1247502335,CA
+1247502336,1248864255,US
1248864256,1248866303,CA
-1248866304,1248885759,US
+1248866304,1248877311,US
+1248877312,1248877567,CA
+1248877568,1248885759,US
1248885760,1248886783,CA
1248886784,1248899071,US
1248899072,1248900095,CA
@@ -20554,7 +21371,9 @@
1248946176,1248947199,VG
1248947200,1248964607,US
1248964608,1248966655,CA
-1248966656,1248997375,US
+1248966656,1248979711,US
+1248979712,1248979967,IE
+1248979968,1248997375,US
1248997376,1248998399,ID
1248999424,1249003519,US
1249003520,1249005567,CA
@@ -20563,7 +21382,8 @@
1249011712,1249019903,US
1249019904,1249020927,CA
1249020928,1249023999,US
-1249026048,1249029119,US
+1249024000,1249025023,CA
+1249025536,1249029119,US
1249029120,1249030143,CA
1249030144,1249036287,US
1249036288,1249037311,TC
@@ -20580,8 +21400,7 @@
1249103104,1249103871,CA
1249103872,1249106943,US
1249106944,1249107967,CA
-1249107968,1249128447,US
-1249129472,1249130495,US
+1249107968,1249130495,US
1249130496,1249131519,JM
1249131520,1249139711,US
1249139712,1249140268,MF
@@ -20591,7 +21410,9 @@
1249142016,1249142271,GB
1249142272,1249146879,US
1249146880,1249147903,CA
-1249147904,1249163263,US
+1249147904,1249160703,US
+1249160704,1249161215,GB
+1249161216,1249163263,US
1249163264,1249165311,CA
1249165312,1249171455,US
1249171456,1249173503,CA
@@ -20675,12 +21496,11 @@
1249710144,1249710207,CN
1249710208,1249710271,NL
1249710272,1249710591,BE
-1249710592,1249710847,NL
-1249710848,1249716479,US
+1249710592,1249716479,US
1249716480,1249716735,TW
1249716736,1249717759,US
1249717760,1249718015,FI
-1249718016,1249718271,NL
+1249718016,1249718271,BE
1249718272,1249720319,US
1249720320,1249720351,AU
1249720352,1249720367,JP
@@ -20754,10 +21574,16 @@
1249721836,1249722111,US
1249722112,1249722367,IN
1249722368,1249724671,US
-1249724672,1249724694,NL
-1249724696,1249724927,NL
+1249724672,1249724694,BE
+1249724696,1249724927,BE
1249724928,1249725183,FI
-1249725184,1249736959,US
+1249725184,1249726207,US
+1249726208,1249726463,FI
+1249726464,1249726719,US
+1249726720,1249726975,IE
+1249726976,1249734655,US
+1249734656,1249734911,FI
+1249734912,1249736959,US
1249737472,1249752319,US
1249752320,1249752575,BE
1249752576,1249754111,US
@@ -20822,9 +21648,7 @@
1256054400,1256054783,CZ
1256054784,1256079359,US
1256079360,1256087551,KY
-1256087552,1262783886,US
-1262783887,1262783887,CA
-1262783888,1263525887,US
+1256087552,1263525887,US
1263525888,1263534079,CA
1263534080,1264717823,US
1264717824,1264718079,CA
@@ -20861,9 +21685,7 @@
1275674624,1275707391,US
1275707392,1275711487,CA
1275711488,1275712511,US
-1275712512,1275714047,CA
-1275714048,1275714559,US
-1275714560,1275715583,CA
+1275712512,1275715583,CA
1275715584,1275756543,US
1275756544,1275772927,CA
1275772928,1275789311,US
@@ -20911,10 +21733,8 @@
1279974016,1279975423,US
1279975424,1279976959,CA
1279976960,1279977215,US
-1279977216,1279977471,CA
-1279977472,1279977727,US
-1279977728,1279977983,CA
-1279977984,1279979775,US
+1279977216,1279978495,CA
+1279978496,1279979775,US
1279979776,1279980031,CA
1279980032,1279980287,US
1279980288,1279981567,CA
@@ -20939,8 +21759,8 @@
1280126976,1280131071,JP
1280131072,1280139263,CA
1280139264,1280242175,US
-1280242176,1280242687,CA
-1280242688,1291845631,US
+1280242176,1280243199,CA
+1280243200,1291845631,US
1291845632,1292894207,DE
1292894208,1293156351,NO
1293156352,1293549567,DE
@@ -20964,7 +21784,9 @@
1294532608,1294598143,RU
1294598144,1294606335,IT
1294606336,1294610431,IR
-1294610432,1294619647,IT
+1294610432,1294611455,IT
+1294611456,1294611711,IR
+1294611712,1294619647,IT
1294619648,1294626815,IR
1294626816,1294630911,IT
1294630912,1294663679,LB
@@ -21002,13 +21824,7 @@
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
+1296237568,1296238591,GB
1296238592,1296239103,NL
1296239104,1296239231,IE
1296239232,1296239359,NL
@@ -21038,8 +21854,7 @@
1296248448,1296248575,DE
1296248576,1296248703,IE
1296248704,1296248831,FR
-1296248832,1296248959,IE
-1296248960,1296249023,DE
+1296248832,1296249023,IE
1296249024,1296249087,GB
1296249088,1296249279,IE
1296249280,1296249343,DE
@@ -21143,7 +21958,9 @@
1296578560,1296580607,FI
1296580608,1296582655,CH
1296582656,1296584703,IE
-1296584704,1296586751,RU
+1296584704,1296585215,RU
+1296585216,1296585471,GB
+1296585472,1296586751,RU
1296586752,1296588799,FR
1296588800,1296590847,SE
1296590848,1296592895,ES
@@ -21282,7 +22099,9 @@
1297072128,1297088511,PL
1297088512,1297121279,AT
1297121280,1297154047,SE
-1297154048,1297154815,RO
+1297154048,1297154303,RO
+1297154304,1297154559,US
+1297154560,1297154815,RO
1297154816,1297155071,MD
1297155072,1297155583,RO
1297155584,1297156095,SE
@@ -21314,7 +22133,7 @@
1297184768,1297185279,BZ
1297185280,1297185791,RO
1297185792,1297185919,NL
-1297185920,1297186815,RO
+1297185920,1297186815,US
1297186816,1297188863,IR
1297188864,1297190143,RO
1297190144,1297190399,ES
@@ -21322,7 +22141,8 @@
1297190656,1297190911,IT
1297190912,1297195007,IR
1297195008,1297195135,NL
-1297195136,1297196799,RO
+1297195136,1297196031,US
+1297196032,1297196799,RO
1297196800,1297197055,CN
1297197056,1297202175,RO
1297202176,1297202687,SE
@@ -21381,7 +22201,8 @@
1297727488,1297743871,MD
1297743872,1297760255,DE
1297760256,1297776639,LT
-1297776640,1297793023,DE
+1297776640,1297784831,DE
+1297784832,1297793023,PT
1297793024,1297809407,UA
1297809408,1297825791,PL
1297825792,1297838079,RU
@@ -21463,11 +22284,7 @@
1298137088,1298661375,GB
1298661376,1298677759,FR
1298677760,1298694143,IR
-1298694144,1298705663,US
-1298705664,1298706175,GB
-1298706176,1298709503,US
-1298709504,1298710271,IT
-1298710272,1298710527,US
+1298694144,1298710527,US
1298710528,1298726911,CZ
1298726912,1298743295,RS
1298743296,1298757631,FI
@@ -21508,12 +22325,13 @@
1299103744,1299120127,NO
1299120128,1299136511,SI
1299136512,1299169279,HU
-1299169280,1299172863,GB
-1299172864,1299173375,NL
+1299169280,1299171327,GB
+1299171328,1299172351,US
+1299172352,1299173375,GB
1299173376,1299174399,FR
1299174400,1299178495,GB
-1299178496,1299179519,CH
-1299179520,1299185663,FR
+1299178496,1299180543,CH
+1299180544,1299185663,FR
1299185664,1299447807,PL
1299447808,1299709951,AT
1299709952,1299783679,UA
@@ -21522,7 +22340,9 @@
1299955712,1299963903,RU
1299963904,1299972095,UA
1299972096,1300234239,IL
-1300234240,1300889599,FR
+1300234240,1300824063,FR
+1300824064,1300874239,IL
+1300874240,1300889599,FR
1300889600,1301020671,IL
1301020672,1302331391,FR
1302331392,1303379967,NL
@@ -21544,7 +22364,9 @@
1306279936,1306288127,IT
1306288128,1306296319,AT
1306296320,1306312703,RU
-1306312704,1306320895,UZ
+1306312704,1306317823,UZ
+1306317824,1306318847,NL
+1306318848,1306320895,RU
1306320896,1306329087,DE
1306329088,1306337279,BA
1306337280,1306345471,HU
@@ -21591,7 +22413,8 @@
1307192064,1307192319,GB
1307192320,1307192575,US
1307192576,1307192831,DE
-1307192832,1307193343,CZ
+1307192832,1307193087,US
+1307193088,1307193343,CZ
1307193344,1307195391,NO
1307195392,1307197439,CH
1307197440,1307205631,HU
@@ -21746,7 +22569,8 @@
1307819432,1307819439,FI
1307819440,1307819447,LU
1307819448,1307819519,NL
-1307819520,1307820031,GB
+1307819520,1307819775,GB
+1307819776,1307820031,BE
1307820032,1307824127,ES
1307824128,1307828223,HU
1307828224,1307832319,NL
@@ -21800,7 +22624,11 @@
1308020736,1308024831,BG
1308024832,1308030975,RU
1308030976,1308033023,UA
-1308033024,1308037119,DE
+1308033024,1308033685,DE
+1308033686,1308033686,GB
+1308033687,1308035427,DE
+1308035428,1308035428,GB
+1308035429,1308037119,DE
1308037120,1308041215,UA
1308041216,1308049407,RU
1308049408,1308053503,DK
@@ -21826,7 +22654,9 @@
1309314048,1309314303,CZ
1309314304,1309409279,PL
1309409280,1309671423,IT
-1309671424,1309933567,IE
+1309671424,1309862911,IE
+1309862912,1309863167,GB
+1309863168,1309933567,IE
1309933568,1310195711,BE
1310195712,1310197759,RU
1310197760,1310199807,CZ
@@ -22040,6 +22870,7 @@
1315729408,1315729663,IE
1315730176,1315730431,NL
1315731712,1315731967,DE
+1315731968,1315732223,IE
1315732224,1315732991,DE
1315732992,1315733247,NL
1315733504,1315737599,NL
@@ -22122,7 +22953,11 @@
1317404672,1317437439,IT
1317437440,1317470207,HR
1317470208,1317470463,CY
-1317470464,1317474303,TR
+1317470464,1317471231,TR
+1317471232,1317471743,CY
+1317471744,1317471999,TR
+1317472000,1317472255,CY
+1317472256,1317474303,TR
1317474304,1317478399,CY
1317478400,1317502975,TR
1317502976,1317535743,IE
@@ -22187,7 +23022,10 @@
1317680000,1317680063,GB
1317680064,1317680071,AO
1317680072,1317683199,GB
-1317683200,1317699583,DE
+1317683200,1317685247,DE
+1317685248,1317686271,BE
+1317686272,1317687295,NL
+1317687296,1317699583,DE
1317699584,1317715967,RU
1317715968,1317732351,SA
1317732352,1317748735,HU
@@ -22394,7 +23232,7 @@
1332616192,1332616319,GB
1332616320,1332616447,US
1332616448,1332616703,CZ
-1332616704,1332616959,UA
+1332616704,1332616959,NL
1332616960,1332617087,RU
1332617088,1332617215,CA
1332617216,1332621311,CZ
@@ -22434,11 +23272,10 @@
1334091776,1334099967,LT
1334099968,1334108159,IR
1334108160,1334116351,BE
-1334116352,1334117631,FI
-1334117632,1334117887,AX
-1334117888,1334118399,FI
-1334118400,1334118655,AX
-1334118656,1334124543,FI
+1334116352,1334123519,AX
+1334123520,1334123903,FI
+1334123904,1334124031,AX
+1334124032,1334124543,FI
1334124544,1334125055,AT
1334125056,1334127359,DE
1334127360,1334127615,AT
@@ -22467,8 +23304,8 @@
1334296576,1334304767,UA
1334304768,1334312959,RU
1334312960,1334316031,SE
-1334316032,1334316159,NO
-1334316160,1334345727,SE
+1334316032,1334316095,NO
+1334316096,1334345727,SE
1334345728,1334378495,RU
1334378496,1334379023,FR
1334379024,1334379039,FI
@@ -22478,7 +23315,9 @@
1334379972,1334379975,DE
1334379976,1334380031,FR
1334380032,1334380287,PL
-1334380288,1334382975,FR
+1334380288,1334381983,FR
+1334381984,1334382015,FI
+1334382016,1334382975,FR
1334382976,1334383103,GB
1334383104,1334383679,FR
1334383680,1334383743,ES
@@ -22515,7 +23354,10 @@
1334392848,1334392863,FI
1334392864,1334392895,FR
1334392896,1334392959,GB
-1334392960,1334411263,FR
+1334392960,1334394879,FR
+1334394880,1334409599,IT
+1334409600,1334409607,DE
+1334409608,1334411263,IT
1334411264,1334444031,RU
1334444032,1334503935,SE
1334503936,1334504191,DK
@@ -22623,7 +23465,9 @@
1334833152,1334837247,FR
1334837248,1335885823,ES
1335885824,1336016895,NO
-1336016896,1336147967,PL
+1336016896,1336049663,PL
+1336049664,1336066047,ES
+1336066048,1336147967,PL
1336147968,1336279039,RU
1336279040,1336410111,GR
1336410112,1336541183,PT
@@ -22734,14 +23578,12 @@
1342753792,1342754047,FR
1342754048,1342756863,YT
1342756864,1342757119,FR
-1342757120,1342758143,YT
-1342758144,1342758399,FR
-1342758400,1342758655,YT
+1342757120,1342758655,YT
1342758656,1342758911,FR
1342758912,1342759935,YT
1342759936,1342760447,FR
-1342760448,1342760703,YT
-1342760704,1342761215,FR
+1342760448,1342760959,YT
+1342760960,1342761215,FR
1342761216,1342761471,YT
1342761472,1342761727,FR
1342761728,1342761983,YT
@@ -22761,7 +23603,11 @@
1342834688,1342842879,JO
1342842880,1342844927,FR
1342844928,1342853119,JO
-1342853120,1342959049,FR
+1342853120,1342869503,FR
+1342869504,1342871551,JO
+1342871552,1342875647,FR
+1342875648,1342877695,JO
+1342877696,1342959049,FR
1342959050,1342959050,RE
1342959051,1342988287,FR
1342988288,1342989055,US
@@ -22808,7 +23654,11 @@
1343225856,1343750143,IT
1343750144,1344798719,ES
1344798720,1345323007,GB
-1345323008,1345847295,PL
+1345323008,1345404927,PL
+1345404928,1345421311,ES
+1345421312,1345601535,PL
+1345601536,1345617919,ES
+1345617920,1345847295,PL
1345847296,1345978367,NL
1345978368,1346109439,ES
1346109440,1346240511,NL
@@ -23251,11 +24101,7 @@
1347296233,1347296240,JO
1347296241,1347296264,SE
1347296265,1347296272,US
-1347296273,1347297071,SE
-1347297072,1347297079,US
-1347297080,1347297151,SE
-1347297152,1347297159,SL
-1347297160,1347297279,SE
+1347296273,1347297279,SE
1347297280,1347305471,UA
1347305472,1347309567,AL
1347309568,1347313663,DE
@@ -23313,7 +24159,8 @@
1347534848,1347538943,DE
1347538944,1347543039,RU
1347543040,1347547135,SK
-1347547136,1347551231,DE
+1347547136,1347551167,DE
+1347551168,1347551231,PL
1347551232,1347555327,IT
1347555328,1347559423,PL
1347559424,1347567615,RU
@@ -23353,7 +24200,9 @@
1347674112,1347682303,RU
1347682304,1347686399,DE
1347690496,1347694591,SE
-1347694592,1347706879,GB
+1347694592,1347696375,GB
+1347696376,1347696383,US
+1347696384,1347706879,GB
1347706880,1347710975,IT
1347710976,1347715071,RU
1347715072,1347717375,ES
@@ -23423,6 +24272,7 @@
1347932160,1347936255,SK
1347936256,1347940351,FR
1347940352,1347944447,BA
+1347944448,1347944959,ZA
1347945472,1347946495,NG
1347947520,1347948543,DZ
1347948544,1347952639,DE
@@ -23653,9 +24503,8 @@
1353275248,1353275255,ES
1353275256,1353277439,GB
1353277440,1353279487,CH
-1353279488,1353279583,GB
-1353279584,1353279591,IT
-1353279592,1353286143,GB
+1353279488,1353280511,IT
+1353280512,1353286143,GB
1353286336,1353286367,GB
1353286400,1353287959,GB
1353287960,1353287967,IE
@@ -23675,7 +24524,9 @@
1353312448,1353312479,CH
1353312480,1353312511,GB
1353312512,1353312767,CH
-1353312768,1353315327,GB
+1353312768,1353313167,GB
+1353313168,1353313175,IT
+1353313176,1353315327,GB
1353315328,1353316351,ES
1353316352,1353318399,GB
1353318400,1353383935,SE
@@ -23713,7 +24564,19 @@
1355284480,1355415551,BE
1355415552,1355546623,NO
1355546624,1355808767,IT
-1355808768,1356005375,DK
+1355808768,1355841535,DK
+1355841536,1355857919,CH
+1355857920,1355862015,LU
+1355862016,1355864063,DK
+1355864064,1355866111,GB
+1355866112,1355868159,LT
+1355868160,1355870207,DE
+1355870208,1355872255,DK
+1355872256,1355873279,IT
+1355873280,1355873791,GB
+1355873792,1355874047,GG
+1355874048,1355874303,DE
+1355874304,1356005375,DK
1356005376,1356070911,IT
1356070912,1356201983,NO
1356201984,1356333055,FR
@@ -23721,7 +24584,9 @@
1356464128,1356513497,CH
1356513498,1356513498,US
1356513499,1356595199,CH
-1356595200,1356857343,FI
+1356595200,1356789759,FI
+1356789760,1356790271,AX
+1356790272,1356857343,FI
1356857344,1356922879,ES
1356922880,1356988415,GB
1356988416,1357053951,DE
@@ -23755,7 +24620,9 @@
1357323008,1357323015,CG
1357323264,1357323775,GB
1357323776,1357323791,FI
-1357323792,1357324287,GB
+1357323792,1357323807,GB
+1357323808,1357323839,NO
+1357323840,1357324287,GB
1357324288,1357324295,RU
1357324296,1357324327,PL
1357326336,1357326337,ES
@@ -23768,8 +24635,9 @@
1357328696,1357328703,IT
1357328704,1357328711,IE
1357328896,1357329159,NL
+1357329168,1357329183,NL
1357329408,1357329415,BE
-1357330944,1357331199,GB
+1357330944,1357331207,GB
1357335808,1357336063,IT
1357337600,1357337647,NL
1357337664,1357337727,NL
@@ -23804,6 +24672,7 @@
1357368352,1357368383,NL
1357368576,1357368831,NL
1357369344,1357369599,RO
+1357370368,1357370623,SA
1357371392,1357371647,GB
1357372416,1357372927,GB
1357373468,1357373471,GB
@@ -23815,6 +24684,7 @@
1357375216,1357375223,ES
1357375224,1357375423,GB
1357375424,1357375487,IE
+1357375504,1357375551,GB
1357377536,1357378647,FR
1357378656,1357378671,FR
1357378816,1357379071,FR
@@ -23853,7 +24723,6 @@
1357884160,1357884415,GB
1357885120,1357885183,DE
1357885200,1357885215,AT
-1357885248,1357885311,SE
1357885952,1357886207,SE
1357889024,1357889279,GB
1357889280,1357889535,SE
@@ -23907,7 +24776,9 @@
1357979648,1357983743,KZ
1357983744,1357983919,GB
1357983920,1357983927,IT
-1357983928,1357984103,GB
+1357983928,1357984087,GB
+1357984088,1357984095,IT
+1357984096,1357984103,GB
1357984104,1357984111,IT
1357984112,1357984167,GB
1357984168,1357984175,IT
@@ -24048,7 +24919,10 @@
1358512128,1358516223,DZ
1358516224,1358520319,BY
1358520320,1358524415,GB
-1358528512,1358536703,RU
+1358528512,1358530815,RU
+1358530816,1358532607,KZ
+1358532608,1358534655,RU
+1358534656,1358536703,KZ
1358536704,1358540799,HU
1358540800,1358548991,RU
1358548992,1358551039,NL
@@ -24191,7 +25065,8 @@
1359119104,1359119199,ES
1359119200,1359119231,NL
1359119232,1359119359,ES
-1359119360,1359121407,DE
+1359119360,1359120383,IT
+1359120384,1359121407,DE
1359121408,1359122431,ES
1359122432,1359123967,DE
1359123968,1359124479,ES
@@ -24294,7 +25169,9 @@
1360211200,1360211967,CZ
1360211968,1360216063,GB
1360216064,1360224255,RU
-1360224256,1360228351,ES
+1360224256,1360224767,ES
+1360224768,1360224895,FR
+1360224896,1360228351,ES
1360228352,1360232447,FI
1360232448,1360236543,RU
1360236544,1360240639,AT
@@ -24435,7 +25312,7 @@
1360654336,1360658431,EE
1360658432,1360666623,PL
1360666624,1360674815,NO
-1360674816,1360676863,DZ
+1360674816,1360676863,NG
1360676864,1360678911,ZA
1360678912,1360683007,RU
1360683008,1360691199,GB
@@ -24691,7 +25568,7 @@
1365028864,1365032959,NL
1365032960,1365033471,US
1365033472,1365033599,PT
-1365033600,1365033983,US
+1365033600,1365033983,GB
1365033984,1365035007,SE
1365035008,1365039103,GB
1365039104,1365039135,FI
@@ -24892,12 +25769,8 @@
1371996928,1372000255,GB
1372000256,1372001279,UG
1372001280,1372012543,GB
-1372012544,1372013567,ZM
-1372013568,1372014079,GB
-1372014080,1372014335,NG
-1372014336,1372016127,GB
-1372016128,1372016383,GH
-1372016384,1372017583,GB
+1372012544,1372016639,DE
+1372016640,1372017583,GB
1372017584,1372017599,CD
1372017600,1372020735,GB
1372020736,1372022783,CD
@@ -24957,6 +25830,7 @@
1372684544,1372684799,DE
1372685664,1372685679,DE
1372688384,1372689407,DE
+1372689920,1372690175,DE
1372690432,1372691455,DE
1372693504,1372694015,DE
1372697344,1372697599,DE
@@ -25035,9 +25909,7 @@
1380188160,1380450303,GB
1380450304,1380712447,NL
1380712448,1380974591,RO
-1380974592,1381084671,IL
-1381084672,1381085183,SY
-1381085184,1381105663,IL
+1380974592,1381105663,IL
1381105664,1381236735,DE
1381236736,1381367807,IT
1381367808,1381498879,ES
@@ -25130,7 +26002,9 @@
1383243776,1383251967,YE
1383251968,1383260159,CZ
1383260160,1383268351,RU
-1383268352,1383272191,IR
+1383268352,1383268607,IR
+1383268608,1383269375,NL
+1383269376,1383272191,IR
1383272192,1383272447,NL
1383272448,1383276543,IR
1383276544,1383284735,KZ
@@ -25179,7 +26053,9 @@
1383514112,1383522303,FI
1383522304,1383523839,BG
1383523840,1383524095,GB
-1383524096,1383530495,BG
+1383524096,1383524863,BG
+1383524864,1383525119,GB
+1383525120,1383530495,BG
1383530496,1383538687,DE
1383538688,1383546879,IT
1383546880,1383555071,BG
@@ -25297,7 +26173,9 @@
1385290632,1385290632,IS
1385291344,1385291344,IS
1385291776,1385299967,TR
-1385299968,1385308159,BG
+1385299968,1385303039,BG
+1385303040,1385303551,DK
+1385303552,1385308159,BG
1385308160,1385316351,RU
1385316352,1385324543,NO
1385324544,1385332735,BE
@@ -25363,8 +26241,7 @@
1386283008,1386348543,NL
1386348544,1386414079,RU
1386414080,1386422271,GB
-1386422272,1386422783,IT
-1386422784,1386423295,GB
+1386422272,1386423295,IT
1386423296,1386424319,FR
1386424320,1386424575,NL
1386424576,1386425087,GB
@@ -25396,7 +26273,7 @@
1386449396,1386449399,PT
1386449400,1386449403,RU
1386449404,1386449407,DE
-1386449408,1386449663,IL
+1386449408,1386449663,GB
1386449664,1386449919,HK
1386449920,1386449920,US
1386449921,1386450175,IL
@@ -25472,8 +26349,6 @@
1388587520,1388588031,GB
1388589056,1388589823,GB
1388591104,1388591359,AU
-1388591616,1388591631,US
-1388591648,1388591663,US
1388593152,1388601343,RU
1388601344,1388609535,SE
1388609536,1388617727,RU
@@ -25564,14 +26439,18 @@
1388796683,1388796687,GB
1388796688,1388797951,NL
1388797952,1388806143,RU
-1388806144,1388806783,DE
+1388806144,1388806399,CH
+1388806400,1388806655,DE
+1388806656,1388806783,CH
1388806784,1388806911,GB
-1388806912,1388807839,DE
-1388807840,1388807855,CH
-1388807856,1388814335,DE
+1388806912,1388811775,CH
+1388811776,1388812031,DE
+1388812032,1388814335,CH
1388814336,1388816383,FI
1388816384,1388818431,AX
-1388818432,1388822527,SE
+1388818432,1388819455,SE
+1388819456,1388820479,AX
+1388820480,1388822527,SE
1388822528,1388830719,AM
1388830720,1388838911,FI
1388838912,1388871679,RU
@@ -25749,6 +26628,7 @@
1401094144,1401159679,HR
1401159680,1401225215,PT
1401225216,1401241599,DE
+1401242632,1401242632,DE
1401246720,1401257983,DE
1401271296,1401274367,DE
1401278464,1401283583,DE
@@ -26051,7 +26931,9 @@
1403581952,1403582207,US
1403582208,1403584511,SE
1403584512,1403600895,DE
-1403600896,1403617279,FR
+1403600896,1403601519,FR
+1403601520,1403601535,MC
+1403601536,1403617279,FR
1403617280,1403633663,DE
1403633664,1403650047,RU
1403650048,1403666431,DE
@@ -26079,8 +26961,8 @@
1404026880,1404043263,ES
1404043264,1404051455,EE
1404051456,1404059647,HR
-1404059648,1404076543,SE
-1404076544,1404084223,LV
+1404059648,1404076031,SE
+1404076032,1404084223,LV
1404084224,1404099327,LT
1404099328,1404099583,SE
1404099584,1404103167,LT
@@ -26104,9 +26986,7 @@
1404194816,1404198911,LT
1404198912,1404200959,SE
1404200960,1404207103,HR
-1404207104,1404209151,LV
-1404209152,1404210175,SE
-1404210176,1404212223,LV
+1404207104,1404212223,LV
1404212224,1404215295,SE
1404215296,1404219391,LV
1404219392,1404220415,SE
@@ -26115,8 +26995,8 @@
1404222464,1404222975,LV
1404222976,1404225535,SE
1404225536,1404231679,LV
-1404231680,1404232703,SE
-1404232704,1404233215,LV
+1404231680,1404231935,SE
+1404231936,1404233215,LV
1404233216,1404234239,SE
1404234240,1404239871,HR
1404239872,1404242687,EE
@@ -26177,7 +27057,8 @@
1404875776,1404876799,LT
1404876800,1404887039,SE
1404887040,1404895231,LT
-1404895232,1404921855,NL
+1404895232,1404903423,SE
+1404903424,1404921855,NL
1404921856,1404927999,LT
1404928000,1404944383,SE
1404944384,1404960767,LT
@@ -26254,9 +27135,7 @@
1405855232,1405855487,FR
1405855488,1405855743,MQ
1405855744,1405855999,FR
-1405856000,1405857279,MQ
-1405857280,1405857791,FR
-1405857792,1405860607,MQ
+1405856000,1405860607,MQ
1405860608,1405860863,FR
1405860864,1405862911,MQ
1405862912,1405863423,FR
@@ -26264,8 +27143,8 @@
1405863936,1405865471,FR
1405865472,1405869311,MQ
1405869312,1405869567,FR
-1405869568,1405872895,MQ
-1405872896,1405873407,FR
+1405869568,1405873151,MQ
+1405873152,1405873407,FR
1405873408,1405878271,MQ
1405878272,1406140415,FR
1406140416,1406205951,CZ
@@ -26275,7 +27154,9 @@
1406402560,1406468095,GR
1406468096,1406533631,ES
1406533632,1406599167,FR
-1406599168,1406664703,AT
+1406599168,1406652671,AT
+1406652672,1406652927,DE
+1406652928,1406664703,AT
1406664704,1406672895,FI
1406672896,1406681087,HU
1406681088,1406689279,GB
@@ -26325,9 +27206,9 @@
1406926848,1406935039,IT
1406935040,1406951423,RU
1406951424,1406959615,PL
-1406959616,1406964351,DE
-1406964352,1406964479,NL
-1406964480,1406967807,DE
+1406959616,1406964223,DE
+1406964224,1406964735,NL
+1406964736,1406967807,DE
1406967808,1406975999,RU
1406976000,1406984191,IE
1406984192,1407000575,RU
@@ -26562,7 +27443,12 @@
1410539520,1410547711,GB
1410547712,1410555903,CZ
1410555904,1410564095,GB
-1410564096,1410568501,SE
+1410564096,1410567320,SE
+1410567321,1410567321,NO
+1410567322,1410567322,FI
+1410567323,1410567323,EE
+1410567324,1410567324,IT
+1410567325,1410568501,SE
1410568502,1410568502,DK
1410568503,1410568991,SE
1410568992,1410569007,NO
@@ -26615,9 +27501,7 @@
1411449728,1411449791,DE
1411449792,1411450303,IT
1411450304,1411450367,DE
-1411450368,1411481855,IT
-1411481856,1411483903,DE
-1411483904,1411514367,IT
+1411450368,1411514367,IT
1411514368,1411579903,FI
1411579904,1411645439,NL
1411645440,1411710975,EG
@@ -26666,7 +27550,6 @@
1411907584,1411911679,GB
1411911680,1411915775,US
1411915776,1411919871,GB
-1411919872,1411921919,DE
1411921920,1411922175,GB
1411922176,1411922431,DE
1411922432,1411923967,GB
@@ -26675,8 +27558,8 @@
1411961612,1411961612,IE
1411961613,1411973119,PL
1411973120,1411999743,SI
-1411999744,1412001023,BA
-1412001024,1412002815,SI
+1411999744,1412001279,BA
+1412001280,1412002815,SI
1412002816,1412003839,BA
1412003840,1412005887,SI
1412005888,1412038655,NL
@@ -26699,15 +27582,14 @@
1412406272,1412408831,RU
1412408832,1412409343,RO
1412409344,1412412159,RU
-1412412160,1412412671,RO
+1412412160,1412412415,RO
+1412412416,1412412671,GB
1412412672,1412413439,RU
1412413440,1412413951,RO
1412413952,1412414719,RU
1412414720,1412414975,RO
1412414976,1412415487,RU
-1412415488,1412423679,IR
-1412423680,1412425727,AE
-1412425728,1412431871,IR
+1412415488,1412431871,IR
1412431872,1412562943,NO
1412562944,1412628479,EE
1412628480,1412644863,TR
@@ -26725,7 +27607,7 @@
1412796928,1412800511,US
1412801536,1412804607,US
1412804864,1412805631,US
-1412806144,1412808703,US
+1412806656,1412808703,US
1412808704,1412825087,RU
1412832768,1412833023,SL
1412841472,1412857855,UZ
@@ -26855,7 +27737,7 @@
1424619856,1424619863,BE
1424619864,1424621567,GB
1424621568,1424625663,PL
-1424625664,1424629759,GB
+1424625664,1424629759,US
1424629760,1424633855,PL
1424633856,1424637951,MD
1424637952,1424642047,FI
@@ -26872,7 +27754,9 @@
1424818176,1424850943,RU
1424850944,1424883711,LV
1424883712,1424916479,DK
-1424916480,1424949247,BG
+1424916480,1424928767,BG
+1424928768,1424929279,DK
+1424929280,1424949247,BG
1424949248,1424965631,RO
1424965632,1424982015,FR
1424982016,1425014783,FI
@@ -26929,13 +27813,15 @@
1425478912,1425479679,RO
1425479680,1425480703,BG
1425480704,1425481727,RO
-1425481728,1425482751,GB
+1425481728,1425482751,US
1425482752,1425484799,RO
1425484800,1425485311,MD
1425485312,1425485823,BG
1425485824,1425486847,RO
1425486848,1425487359,MD
-1425487360,1425489407,RO
+1425487360,1425488639,RO
+1425488640,1425488895,US
+1425488896,1425489407,RO
1425489408,1425489663,NL
1425489664,1425506303,RO
1425506304,1425509887,NO
@@ -27047,11 +27933,7 @@
1428142080,1428144127,DE
1428144128,1428152319,FR
1428152320,1428160511,PL
-1428160512,1428183111,IT
-1428183112,1428183119,SI
-1428183120,1428183143,IT
-1428183144,1428183151,SI
-1428183152,1428260863,IT
+1428160512,1428260863,IT
1428260864,1428261119,GB
1428261120,1429209087,IT
1429209088,1430257663,ES
@@ -27093,7 +27975,9 @@
1432024064,1432025087,DE
1432025088,1432027135,GB
1432027136,1432035327,IE
-1432035328,1432043519,GB
+1432035328,1432038399,GB
+1432038400,1432039423,NL
+1432039424,1432043519,GB
1432043520,1432051711,ES
1432051712,1432054015,RU
1432054016,1432054271,RO
@@ -27179,7 +28063,9 @@
1433600000,1433608191,DE
1433608192,1433608447,TR
1433608448,1433608703,NL
-1433608704,1433610239,GB
+1433608704,1433609215,GB
+1433609216,1433609727,SE
+1433609728,1433610239,GB
1433610240,1433611263,US
1433611264,1433614335,GB
1433614336,1433615027,DE
@@ -27359,17 +28245,19 @@
1437335552,1437597695,RU
1437597696,1438121983,DE
1438121984,1438126079,NL
-1438126080,1438127359,CZ
-1438127360,1438127615,SE
-1438127616,1438127871,BE
-1438127872,1438130175,CZ
+1438126080,1438130175,CZ
1438130176,1438138367,NL
1438138368,1438146559,FR
-1438146560,1438154751,MT
+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,1438181375,NL
+1438179328,1438180351,ES
+1438180352,1438181375,NL
1438181376,1438183423,SA
1438183424,1438184447,PS
1438184448,1438185471,CH
@@ -27383,7 +28271,9 @@
1438384128,1438400511,FI
1438400512,1438433279,SE
1438433280,1438515199,GB
-1438515200,1438553855,DE
+1438515200,1438539775,DE
+1438539776,1438547967,NL
+1438547968,1438553855,DE
1438553856,1438554111,BR
1438554112,1438554623,US
1438554624,1438555135,DE
@@ -27553,7 +28443,9 @@
1439459328,1439459839,IR
1439459840,1439460607,RO
1439460608,1439460863,MD
-1439460864,1439462655,RO
+1439460864,1439461375,RO
+1439461376,1439462399,IT
+1439462400,1439462655,RO
1439462656,1439462911,MD
1439462912,1439463167,RO
1439463168,1439463423,IT
@@ -27567,7 +28459,10 @@
1439468544,1439469567,ES
1439469568,1439470335,RO
1439470336,1439470591,IT
-1439470592,1439475711,RO
+1439470592,1439471615,US
+1439471616,1439473663,RO
+1439473664,1439474687,US
+1439474688,1439475711,RO
1439475712,1439475967,IN
1439475968,1439476735,RO
1439476736,1439477759,IN
@@ -27627,8 +28522,8 @@
1440251904,1440284671,SK
1440284672,1440317439,FI
1440317440,1440322559,BG
-1440322560,1440323071,DE
-1440323072,1440325631,BG
+1440322560,1440322815,DE
+1440322816,1440325631,BG
1440325632,1440326655,DE
1440326656,1440328703,BG
1440328704,1440329727,DE
@@ -27819,7 +28714,8 @@
1449706496,1449707519,MD
1449707520,1449709567,SE
1449709568,1449709823,GB
-1449709824,1449710591,RO
+1449709824,1449710079,US
+1449710080,1449710591,RO
1449710592,1449711103,GB
1449711104,1449713151,RO
1449713152,1449714175,GB
@@ -27838,7 +28734,8 @@
1449724928,1449725439,GB
1449725440,1449726463,RO
1449726464,1449726719,NL
-1449726720,1449727999,RO
+1449726720,1449726975,RO
+1449726976,1449727999,NO
1449728000,1449728255,MD
1449728256,1449729023,RO
1449729024,1449730047,ES
@@ -27849,7 +28746,7 @@
1449738240,1449742335,RO
1449742336,1449744383,MD
1449744384,1449748479,RO
-1449748480,1449749503,GB
+1449748480,1449749503,US
1449749504,1449750527,RO
1449750528,1449752575,SE
1449752576,1449754623,RO
@@ -27962,7 +28859,8 @@
1449879168,1449879295,TH
1449879296,1449880319,RO
1449880320,1449880575,MD
-1449880576,1449883647,RO
+1449880576,1449881087,US
+1449881088,1449883647,RO
1449883648,1449885695,BE
1449885696,1449889791,GB
1449889792,1449893887,IR
@@ -28122,13 +29020,7 @@
1467432960,1467449343,BG
1467449344,1467457535,SI
1467457536,1467465727,EE
-1467465728,1467465759,NL
-1467465760,1467465791,DE
-1467465792,1467465799,NL
-1467465800,1467465983,DE
-1467465984,1467466015,NL
-1467466016,1467466495,DE
-1467466496,1467466751,NL
+1467465728,1467466751,NL
1467466752,1467472895,DE
1467472896,1467473919,NL
1467473920,1467482111,RU
@@ -28151,7 +29043,9 @@
1467584512,1467593727,BG
1467593728,1467597823,DE
1467597824,1467604991,BG
-1467604992,1467744255,DE
+1467604992,1467611135,DE
+1467611136,1467613183,BG
+1467613184,1467744255,DE
1467744256,1467777023,GB
1467777024,1467875327,ES
1467875328,1467940863,BG
@@ -28333,11 +29227,7 @@
1475559424,1475563007,GR
1475563008,1475563263,BG
1475563264,1475563519,GR
-1475563520,1475565183,BG
-1475565184,1475565311,GR
-1475565312,1475566207,BG
-1475566208,1475566335,GR
-1475566336,1475575807,BG
+1475563520,1475575807,BG
1475575808,1475592191,AT
1475592192,1475608575,GB
1475608576,1475624959,RU
@@ -28438,7 +29328,8 @@
1475870720,1475878911,NO
1475878912,1475887103,IT
1475887104,1475895295,PL
-1475895296,1475903487,GB
+1475895296,1475901439,GB
+1475901440,1475903487,CH
1475903488,1475911679,IR
1475911680,1475919871,MD
1475919872,1475928063,IT
@@ -28459,12 +29350,12 @@
1476010112,1476011327,RS
1476011328,1476011775,XK
1476011776,1476012095,RS
-1476012096,1476012287,XK
-1476012288,1476013055,RS
-1476013056,1476013311,XK
-1476013312,1476013567,RS
-1476013568,1476013823,XK
-1476013824,1476014079,RS
+1476012096,1476012176,XK
+1476012177,1476012177,RS
+1476012178,1476012250,XK
+1476012251,1476012251,RS
+1476012252,1476012287,XK
+1476012288,1476014079,RS
1476014080,1476014127,XK
1476014128,1476014135,RS
1476014136,1476014591,XK
@@ -28531,13 +29422,7 @@
1476378624,1476386815,KZ
1476386816,1476395007,RU
1476395008,1478492159,ES
-1478492160,1479738383,IT
-1479738384,1479738391,SI
-1479738392,1479738479,IT
-1479738480,1479738487,SI
-1479738488,1480413711,IT
-1480413712,1480413719,SI
-1480413720,1480589311,IT
+1478492160,1480589311,IT
1480589312,1481637887,DE
1481637888,1481646079,SE
1481646080,1481654271,RU
@@ -28570,7 +29455,9 @@
1481834496,1481842687,GL
1481842688,1481843007,SE
1481843008,1481843039,NO
-1481843040,1481850879,SE
+1481843040,1481844959,SE
+1481844960,1481844991,NO
+1481844992,1481850879,SE
1481850880,1481859071,DK
1481859072,1481867263,GB
1481867264,1481875455,SE
@@ -28583,9 +29470,13 @@
1481908224,1481916415,NO
1481916416,1481924607,ES
1481924608,1481932799,SA
-1481932800,1481937183,GB
+1481932800,1481936959,GB
+1481936960,1481936975,FR
+1481936976,1481937183,GB
1481937184,1481937199,NL
-1481937200,1481940991,GB
+1481937200,1481937207,GB
+1481937208,1481937215,FR
+1481937216,1481940991,GB
1481940992,1481949183,NO
1481949184,1481957375,RU
1481957376,1481965567,SE
@@ -28621,9 +29512,7 @@
1483210752,1483735039,GB
1483735040,1483997183,FI
1483997184,1484128255,AT
-1484128256,1484237823,LT
-1484237824,1484238847,PK
-1484238848,1484259327,LT
+1484128256,1484259327,LT
1484259328,1484783615,FR
1484783616,1484849151,DE
1484849152,1484914687,SE
@@ -28652,7 +29541,713 @@
1486159872,1486192639,IS
1486192640,1486225407,IT
1486225408,1486258175,DE
-1486258176,1486292991,GB
+1486258176,1486258463,GB
+1486258464,1486258477,US
+1486258478,1486258479,GB
+1486258480,1486258495,US
+1486258496,1486258543,GB
+1486258544,1486258551,US
+1486258552,1486258567,GB
+1486258568,1486258583,US
+1486258584,1486258591,GB
+1486258592,1486258607,US
+1486258608,1486258671,GB
+1486258672,1486258751,US
+1486258752,1486258815,GB
+1486258816,1486258847,US
+1486258848,1486258863,GB
+1486258864,1486258895,US
+1486258896,1486258911,GB
+1486258912,1486258943,US
+1486258944,1486258959,GB
+1486258960,1486258967,US
+1486258968,1486258975,GB
+1486258976,1486258999,US
+1486259000,1486259039,GB
+1486259040,1486259071,US
+1486259072,1486259087,GB
+1486259088,1486259095,US
+1486259096,1486259183,GB
+1486259184,1486259207,US
+1486259208,1486259231,GB
+1486259232,1486259239,US
+1486259240,1486259287,GB
+1486259288,1486259295,US
+1486259296,1486259455,GB
+1486259456,1486259471,US
+1486259472,1486259503,GB
+1486259504,1486259511,US
+1486259512,1486259559,GB
+1486259560,1486259567,US
+1486259568,1486259575,GB
+1486259576,1486259583,US
+1486259584,1486259631,GB
+1486259632,1486259639,US
+1486259640,1486259663,GB
+1486259664,1486259679,US
+1486259680,1486259711,GB
+1486259712,1486259775,US
+1486259776,1486259807,GB
+1486259808,1486259871,US
+1486259872,1486259999,GB
+1486260000,1486260031,US
+1486260032,1486260095,GB
+1486260096,1486260119,US
+1486260120,1486260135,GB
+1486260136,1486260143,US
+1486260144,1486260183,GB
+1486260184,1486260191,US
+1486260192,1486260239,GB
+1486260240,1486260287,US
+1486260288,1486260327,GB
+1486260328,1486260335,US
+1486260336,1486260383,GB
+1486260384,1486260401,US
+1486260402,1486260402,GB
+1486260403,1486260407,US
+1486260408,1486260415,GB
+1486260416,1486260431,US
+1486260432,1486260435,GB
+1486260436,1486260437,US
+1486260438,1486260463,GB
+1486260464,1486260479,US
+1486260480,1486260735,GB
+1486260736,1486260767,US
+1486260768,1486260863,GB
+1486260864,1486261023,US
+1486261024,1486261135,GB
+1486261136,1486261139,US
+1486261140,1486261151,GB
+1486261152,1486261247,US
+1486261248,1486263295,GB
+1486263296,1486263311,US
+1486263312,1486263327,GB
+1486263328,1486263391,US
+1486263392,1486263423,GB
+1486263424,1486263439,US
+1486263440,1486263463,GB
+1486263464,1486263471,US
+1486263472,1486263487,GB
+1486263488,1486263583,US
+1486263584,1486263599,GB
+1486263600,1486263631,US
+1486263632,1486263663,GB
+1486263664,1486263823,US
+1486263824,1486263947,GB
+1486263948,1486263959,US
+1486263960,1486263983,GB
+1486263984,1486264015,US
+1486264016,1486264031,GB
+1486264032,1486264063,US
+1486264064,1486264143,GB
+1486264144,1486264145,US
+1486264146,1486264223,GB
+1486264224,1486264255,US
+1486264256,1486264319,GB
+1486264320,1486264351,US
+1486264352,1486264399,GB
+1486264400,1486264407,US
+1486264408,1486264409,GB
+1486264410,1486264411,US
+1486264412,1486264447,GB
+1486264448,1486264479,US
+1486264480,1486264703,GB
+1486264704,1486264711,US
+1486264712,1486264751,GB
+1486264752,1486264767,US
+1486264768,1486269439,GB
+1486269440,1486269455,US
+1486269456,1486269487,GB
+1486269488,1486269519,US
+1486269520,1486269535,GB
+1486269536,1486269567,US
+1486269568,1486269583,GB
+1486269584,1486269615,US
+1486269616,1486269631,GB
+1486269632,1486269647,US
+1486269648,1486269663,GB
+1486269664,1486269679,US
+1486269680,1486269711,GB
+1486269712,1486269719,US
+1486269720,1486269735,GB
+1486269736,1486269743,US
+1486269744,1486269751,GB
+1486269752,1486269791,US
+1486269792,1486269799,GB
+1486269800,1486269815,US
+1486269816,1486269823,GB
+1486269824,1486269855,US
+1486269856,1486269871,GB
+1486269872,1486269903,US
+1486269904,1486269919,GB
+1486269920,1486269954,US
+1486269955,1486269955,GB
+1486269956,1486269975,US
+1486269976,1486269983,GB
+1486269984,1486269999,US
+1486270000,1486270015,GB
+1486270016,1486270031,US
+1486270032,1486270039,GB
+1486270040,1486270079,US
+1486270080,1486270143,GB
+1486270144,1486270159,US
+1486270160,1486270175,GB
+1486270176,1486270351,US
+1486270352,1486270367,GB
+1486270368,1486270375,US
+1486270376,1486270391,GB
+1486270392,1486270399,US
+1486270400,1486270415,GB
+1486270416,1486270431,US
+1486270432,1486270447,GB
+1486270448,1486270455,US
+1486270456,1486270991,GB
+1486270992,1486270999,US
+1486271000,1486271103,GB
+1486271104,1486271159,US
+1486271160,1486271167,GB
+1486271168,1486271175,US
+1486271176,1486271199,GB
+1486271200,1486271215,US
+1486271216,1486271751,GB
+1486271752,1486271759,US
+1486271760,1486271775,GB
+1486271776,1486271791,US
+1486271792,1486271807,GB
+1486271808,1486271815,US
+1486271816,1486271823,GB
+1486271824,1486271831,US
+1486271832,1486271871,GB
+1486271872,1486271935,US
+1486271936,1486271943,GB
+1486271944,1486271983,US
+1486271984,1486272047,GB
+1486272048,1486272063,US
+1486272064,1486272079,GB
+1486272080,1486272127,US
+1486272128,1486272263,GB
+1486272264,1486272279,US
+1486272280,1486272287,GB
+1486272288,1486272295,US
+1486272296,1486272303,GB
+1486272304,1486272311,US
+1486272312,1486272351,GB
+1486272352,1486272359,US
+1486272360,1486272367,GB
+1486272368,1486272383,US
+1486272384,1486272399,GB
+1486272400,1486272431,US
+1486272432,1486272439,GB
+1486272440,1486272447,US
+1486272448,1486272455,GB
+1486272456,1486272463,US
+1486272464,1486272479,GB
+1486272480,1486272503,US
+1486272504,1486272505,GB
+1486272506,1486272583,US
+1486272584,1486272623,GB
+1486272624,1486272639,US
+1486272640,1486272663,GB
+1486272664,1486272671,US
+1486272672,1486272687,GB
+1486272688,1486272695,US
+1486272696,1486272703,GB
+1486272704,1486272799,US
+1486272800,1486272815,GB
+1486272816,1486272831,US
+1486272832,1486272839,GB
+1486272840,1486272879,US
+1486272880,1486272911,GB
+1486272912,1486272959,US
+1486272960,1486272975,GB
+1486272976,1486272983,US
+1486272984,1486272999,GB
+1486273000,1486273015,US
+1486273016,1486273023,GB
+1486273024,1486273031,US
+1486273032,1486273033,GB
+1486273034,1486273035,US
+1486273036,1486273087,GB
+1486273088,1486273103,US
+1486273104,1486273111,GB
+1486273112,1486273119,US
+1486273120,1486273127,GB
+1486273128,1486273135,US
+1486273136,1486273143,GB
+1486273144,1486273151,US
+1486273152,1486273159,GB
+1486273160,1486273183,US
+1486273184,1486273199,GB
+1486273200,1486273295,US
+1486273296,1486273303,GB
+1486273304,1486273311,US
+1486273312,1486273319,GB
+1486273320,1486273327,US
+1486273328,1486273335,GB
+1486273336,1486273343,US
+1486273344,1486273367,GB
+1486273368,1486273375,US
+1486273376,1486273383,GB
+1486273384,1486273391,US
+1486273392,1486273399,GB
+1486273400,1486273439,US
+1486273440,1486273447,GB
+1486273448,1486273463,US
+1486273464,1486273503,GB
+1486273504,1486273535,US
+1486273536,1486273543,GB
+1486273544,1486273551,US
+1486273552,1486273559,GB
+1486273560,1486273567,US
+1486273568,1486273583,GB
+1486273584,1486273599,US
+1486273600,1486273631,GB
+1486273632,1486273863,US
+1486273864,1486273879,GB
+1486273880,1486273887,US
+1486273888,1486273919,GB
+1486273920,1486274047,US
+1486274048,1486274079,GB
+1486274080,1486274095,US
+1486274096,1486274111,GB
+1486274112,1486274143,US
+1486274144,1486274175,GB
+1486274176,1486274191,US
+1486274192,1486274223,GB
+1486274224,1486274231,US
+1486274232,1486274255,GB
+1486274256,1486274263,US
+1486274264,1486274271,GB
+1486274272,1486274295,US
+1486274296,1486274335,GB
+1486274336,1486274351,US
+1486274352,1486274359,GB
+1486274360,1486274367,US
+1486274368,1486274399,GB
+1486274400,1486274455,US
+1486274456,1486274463,GB
+1486274464,1486274487,US
+1486274488,1486274495,GB
+1486274496,1486274519,US
+1486274520,1486274527,GB
+1486274528,1486274543,US
+1486274544,1486274551,GB
+1486274552,1486274623,US
+1486274624,1486274631,GB
+1486274632,1486274639,US
+1486274640,1486274655,GB
+1486274656,1486274671,US
+1486274672,1486274679,GB
+1486274680,1486274687,US
+1486274688,1486274719,GB
+1486274720,1486274751,US
+1486274752,1486274763,GB
+1486274764,1486274767,US
+1486274768,1486274799,GB
+1486274800,1486274815,US
+1486274816,1486275071,GB
+1486275072,1486275079,US
+1486275080,1486275095,GB
+1486275096,1486275119,US
+1486275120,1486275127,GB
+1486275128,1486275207,US
+1486275208,1486275223,GB
+1486275224,1486275279,US
+1486275280,1486275311,GB
+1486275312,1486275327,US
+1486275328,1486275335,GB
+1486275336,1486275351,US
+1486275352,1486275359,GB
+1486275360,1486275367,US
+1486275368,1486275383,GB
+1486275384,1486275399,US
+1486275400,1486275407,GB
+1486275408,1486275415,US
+1486275416,1486275431,GB
+1486275432,1486275447,US
+1486275448,1486275519,GB
+1486275520,1486275583,US
+1486275584,1486275591,GB
+1486275592,1486275607,US
+1486275608,1486275647,GB
+1486275648,1486275695,US
+1486275696,1486275775,GB
+1486275776,1486275815,US
+1486275816,1486275823,GB
+1486275824,1486275839,US
+1486275840,1486275887,GB
+1486275888,1486275919,US
+1486275920,1486275951,GB
+1486275952,1486275999,US
+1486276000,1486276047,GB
+1486276048,1486276095,US
+1486276096,1486276103,GB
+1486276104,1486276111,US
+1486276112,1486276135,GB
+1486276136,1486276183,US
+1486276184,1486276191,GB
+1486276192,1486276199,US
+1486276200,1486276319,GB
+1486276320,1486276375,US
+1486276376,1486276399,GB
+1486276400,1486276407,US
+1486276408,1486276479,GB
+1486276480,1486276551,US
+1486276552,1486276575,GB
+1486276576,1486276607,US
+1486276608,1486276671,GB
+1486276672,1486276703,US
+1486276704,1486276711,GB
+1486276712,1486276719,US
+1486276720,1486276735,GB
+1486276736,1486276751,US
+1486276752,1486276767,GB
+1486276768,1486276783,US
+1486276784,1486276791,GB
+1486276792,1486276839,US
+1486276840,1486276863,GB
+1486276864,1486276879,US
+1486276880,1486276895,GB
+1486276896,1486276903,US
+1486276904,1486276911,GB
+1486276912,1486276919,US
+1486276920,1486276943,GB
+1486276944,1486276951,US
+1486276952,1486276975,GB
+1486276976,1486276983,US
+1486276984,1486276991,GB
+1486276992,1486277055,US
+1486277056,1486277063,GB
+1486277064,1486277079,US
+1486277080,1486277087,GB
+1486277088,1486277095,US
+1486277096,1486277111,GB
+1486277112,1486277127,US
+1486277128,1486277135,GB
+1486277136,1486277167,US
+1486277168,1486277175,GB
+1486277176,1486277183,US
+1486277184,1486277187,GB
+1486277188,1486277191,US
+1486277192,1486277207,GB
+1486277208,1486277215,US
+1486277216,1486277231,GB
+1486277232,1486277263,US
+1486277264,1486277279,GB
+1486277280,1486277311,US
+1486277312,1486277343,GB
+1486277344,1486277351,US
+1486277352,1486277359,GB
+1486277360,1486277367,US
+1486277368,1486277375,GB
+1486277376,1486277423,US
+1486277424,1486277431,GB
+1486277432,1486277439,US
+1486277440,1486277503,GB
+1486277504,1486277511,US
+1486277512,1486277527,GB
+1486277528,1486277535,US
+1486277536,1486277559,GB
+1486277560,1486277583,US
+1486277584,1486277591,GB
+1486277592,1486277599,US
+1486277600,1486277607,GB
+1486277608,1486277727,US
+1486277728,1486277735,GB
+1486277736,1486277743,US
+1486277744,1486277759,GB
+1486277760,1486277775,US
+1486277776,1486277783,GB
+1486277784,1486277807,US
+1486277808,1486277815,GB
+1486277816,1486277823,US
+1486277824,1486277863,GB
+1486277864,1486277871,US
+1486277872,1486277895,GB
+1486277896,1486277935,US
+1486277936,1486277943,GB
+1486277944,1486277951,US
+1486277952,1486277991,GB
+1486277992,1486278039,US
+1486278040,1486278055,GB
+1486278056,1486278079,US
+1486278080,1486278095,GB
+1486278096,1486278143,US
+1486278144,1486278399,GB
+1486278400,1486278511,US
+1486278512,1486278527,GB
+1486278528,1486278551,US
+1486278552,1486278567,GB
+1486278568,1486278575,US
+1486278576,1486278583,GB
+1486278584,1486278623,US
+1486278624,1486278639,GB
+1486278640,1486278663,US
+1486278664,1486278679,GB
+1486278680,1486278687,US
+1486278688,1486278695,GB
+1486278696,1486278743,US
+1486278744,1486278791,GB
+1486278792,1486278799,US
+1486278800,1486278815,GB
+1486278816,1486278943,US
+1486278944,1486278951,GB
+1486278952,1486279039,US
+1486279040,1486279103,GB
+1486279104,1486279151,US
+1486279152,1486279161,GB
+1486279162,1486279163,US
+1486279164,1486279295,GB
+1486279296,1486279319,US
+1486279320,1486279327,GB
+1486279328,1486279343,US
+1486279344,1486279359,GB
+1486279360,1486279375,US
+1486279376,1486279383,GB
+1486279384,1486279407,US
+1486279408,1486279479,GB
+1486279480,1486279583,US
+1486279584,1486279599,GB
+1486279600,1486279623,US
+1486279624,1486279631,GB
+1486279632,1486279647,US
+1486279648,1486279663,GB
+1486279664,1486279671,US
+1486279672,1486279679,GB
+1486279680,1486279687,US
+1486279688,1486279703,GB
+1486279704,1486279727,US
+1486279728,1486279735,GB
+1486279736,1486279751,US
+1486279752,1486279775,GB
+1486279776,1486279791,US
+1486279792,1486279799,GB
+1486279800,1486279807,US
+1486279808,1486279839,GB
+1486279840,1486279855,US
+1486279856,1486279887,GB
+1486279888,1486279935,US
+1486279936,1486279991,GB
+1486279992,1486279999,US
+1486280000,1486280023,GB
+1486280024,1486280151,US
+1486280152,1486280159,GB
+1486280160,1486280167,US
+1486280168,1486280191,GB
+1486280192,1486280319,US
+1486280320,1486280335,GB
+1486280336,1486280367,US
+1486280368,1486280383,GB
+1486280384,1486280391,US
+1486280392,1486280399,GB
+1486280400,1486280415,US
+1486280416,1486280423,GB
+1486280424,1486280447,US
+1486280448,1486280455,GB
+1486280456,1486280463,US
+1486280464,1486280487,GB
+1486280488,1486280495,US
+1486280496,1486280511,GB
+1486280512,1486280537,US
+1486280538,1486280539,GB
+1486280540,1486280541,US
+1486280542,1486280543,GB
+1486280544,1486280559,US
+1486280560,1486280567,GB
+1486280568,1486280647,US
+1486280648,1486280655,GB
+1486280656,1486280679,US
+1486280680,1486280687,GB
+1486280688,1486280695,US
+1486280696,1486281983,GB
+1486281984,1486282111,US
+1486282112,1486282143,GB
+1486282144,1486282159,US
+1486282160,1486282263,GB
+1486282264,1486282271,US
+1486282272,1486282279,GB
+1486282280,1486282287,US
+1486282288,1486282303,GB
+1486282304,1486282383,US
+1486282384,1486282415,GB
+1486282416,1486282423,US
+1486282424,1486282431,GB
+1486282432,1486282559,US
+1486282560,1486282567,GB
+1486282568,1486282575,US
+1486282576,1486282591,GB
+1486282592,1486282599,US
+1486282600,1486282639,GB
+1486282640,1486282719,US
+1486282720,1486283007,GB
+1486283008,1486283023,US
+1486283024,1486283031,GB
+1486283032,1486283095,US
+1486283096,1486283263,GB
+1486283264,1486283271,US
+1486283272,1486283279,GB
+1486283280,1486283295,US
+1486283296,1486283391,GB
+1486283392,1486283455,US
+1486283456,1486283495,GB
+1486283496,1486283511,US
+1486283512,1486283647,GB
+1486283648,1486283695,US
+1486283696,1486283711,GB
+1486283712,1486283775,US
+1486283776,1486283831,GB
+1486283832,1486283839,US
+1486283840,1486283855,GB
+1486283856,1486283871,US
+1486283872,1486283903,GB
+1486283904,1486283911,US
+1486283912,1486283927,GB
+1486283928,1486283935,US
+1486283936,1486283951,GB
+1486283952,1486283991,US
+1486283992,1486284007,GB
+1486284008,1486284023,US
+1486284024,1486284039,GB
+1486284040,1486284047,US
+1486284048,1486284063,GB
+1486284064,1486284167,US
+1486284168,1486284191,GB
+1486284192,1486284215,US
+1486284216,1486284223,GB
+1486284224,1486284471,US
+1486284472,1486284479,GB
+1486284480,1486284543,US
+1486284544,1486284599,GB
+1486284600,1486284623,US
+1486284624,1486284647,GB
+1486284648,1486284655,US
+1486284656,1486284671,GB
+1486284672,1486284735,US
+1486284736,1486284743,GB
+1486284744,1486284799,US
+1486284800,1486284815,GB
+1486284816,1486284823,US
+1486284824,1486284831,GB
+1486284832,1486284839,US
+1486284840,1486284855,GB
+1486284856,1486284871,US
+1486284872,1486284879,GB
+1486284880,1486284895,US
+1486284896,1486284903,GB
+1486284904,1486284919,US
+1486284920,1486284959,GB
+1486284960,1486284983,US
+1486284984,1486284991,GB
+1486284992,1486284999,US
+1486285000,1486285023,GB
+1486285024,1486285039,US
+1486285040,1486285055,GB
+1486285056,1486285071,US
+1486285072,1486285095,GB
+1486285096,1486285103,US
+1486285104,1486285135,GB
+1486285136,1486285143,US
+1486285144,1486285151,GB
+1486285152,1486285153,US
+1486285154,1486285167,GB
+1486285168,1486285223,US
+1486285224,1486285231,GB
+1486285232,1486285439,US
+1486285440,1486285447,GB
+1486285448,1486285471,US
+1486285472,1486285487,GB
+1486285488,1486285519,US
+1486285520,1486285535,GB
+1486285536,1486285599,US
+1486285600,1486285631,GB
+1486285632,1486285663,US
+1486285664,1486285695,GB
+1486285696,1486285703,US
+1486285704,1486285711,GB
+1486285712,1486285727,US
+1486285728,1486285735,GB
+1486285736,1486285743,US
+1486285744,1486285759,GB
+1486285760,1486285823,US
+1486285824,1486285951,GB
+1486285952,1486286079,US
+1486286080,1486286351,GB
+1486286352,1486286391,US
+1486286392,1486286399,GB
+1486286400,1486286415,US
+1486286416,1486286431,GB
+1486286432,1486286447,US
+1486286448,1486286455,GB
+1486286456,1486286463,US
+1486286464,1486286495,GB
+1486286496,1486286527,US
+1486286528,1486286575,GB
+1486286576,1486286583,US
+1486286584,1486286591,GB
+1486286592,1486286687,US
+1486286688,1486286719,GB
+1486286720,1486286735,US
+1486286736,1486286743,GB
+1486286744,1486286751,US
+1486286752,1486286759,GB
+1486286760,1486286767,US
+1486286768,1486286815,GB
+1486286816,1486286847,US
+1486286848,1486287831,GB
+1486287832,1486287847,US
+1486287848,1486288079,GB
+1486288080,1486288087,US
+1486288088,1486288095,GB
+1486288096,1486288151,US
+1486288152,1486288167,GB
+1486288168,1486288183,US
+1486288184,1486288215,GB
+1486288216,1486288223,US
+1486288224,1486288271,GB
+1486288272,1486288319,US
+1486288320,1486288351,GB
+1486288352,1486288383,US
+1486288384,1486288639,GB
+1486288640,1486288663,US
+1486288664,1486288679,GB
+1486288680,1486288687,US
+1486288688,1486288703,GB
+1486288704,1486288735,US
+1486288736,1486288751,GB
+1486288752,1486288759,US
+1486288760,1486288767,GB
+1486288768,1486288791,US
+1486288792,1486288799,GB
+1486288800,1486288823,US
+1486288824,1486288903,GB
+1486288904,1486288905,US
+1486288906,1486288907,GB
+1486288908,1486288909,US
+1486288910,1486288911,GB
+1486288912,1486288935,US
+1486288936,1486288943,GB
+1486288944,1486288951,US
+1486288952,1486288991,GB
+1486288992,1486288999,US
+1486289000,1486289015,GB
+1486289016,1486289023,US
+1486289024,1486289535,GB
+1486289536,1486289567,US
+1486289568,1486289583,GB
+1486289584,1486289599,US
+1486289600,1486289615,GB
+1486289616,1486289631,US
+1486289632,1486289767,GB
+1486289768,1486289791,US
+1486289792,1486289823,GB
+1486289824,1486289839,US
+1486289840,1486289863,GB
+1486289864,1486289871,US
+1486289872,1486289883,GB
+1486289884,1486289919,US
+1486289920,1486290623,GB
+1486290624,1486290943,US
+1486290944,1486292991,GB
1486292992,1486295039,RU
1486295040,1486297087,ES
1486297088,1486299135,IE
@@ -28730,7 +30325,9 @@
1489665792,1489666047,IT
1489666048,1489674239,GB
1489674240,1489676287,NL
-1489676288,1489688575,GB
+1489676288,1489678943,GB
+1489678944,1489678959,US
+1489678960,1489688575,GB
1489688576,1489688831,IL
1489688832,1489689087,GB
1489689088,1489689343,IL
@@ -28788,7 +30385,11 @@
1490305024,1490321407,DK
1490321408,1490325503,GB
1490325504,1490328575,FR
-1490328576,1490337791,GB
+1490328576,1490336767,GB
+1490336768,1490337023,ES
+1490337024,1490337279,GB
+1490337280,1490337535,ES
+1490337536,1490337791,GB
1490337792,1490354175,RU
1490354176,1490386943,SA
1490386944,1490403327,CH
@@ -28940,6 +30541,7 @@
1495160240,1495160255,FR
1495160256,1495160263,GB
1495160320,1495160575,FR
+1495160576,1495160831,CN
1495162112,1495162367,DE
1495162496,1495162499,DE
1495162608,1495162623,GB
@@ -29168,7 +30770,8 @@
1495467008,1495468031,RO
1495468032,1495470079,MD
1495470080,1495472127,NL
-1495472128,1495474175,RO
+1495472128,1495473151,RO
+1495473152,1495474175,GB
1495474176,1495474431,NL
1495474432,1495474687,RO
1495474688,1495474943,MD
@@ -29177,8 +30780,7 @@
1495478272,1495479295,RO
1495479296,1495479551,TR
1495479552,1495480319,RO
-1495480320,1495480575,NL
-1495480576,1495480831,RO
+1495480320,1495480831,NL
1495480832,1495481343,IR
1495481344,1495482367,RO
1495482368,1495484415,IR
@@ -29234,8 +30836,8 @@
1495531520,1495535615,RO
1495535616,1495536127,IR
1495536128,1495537663,RO
-1495539712,1495540735,RO
-1495540736,1495540991,NL
+1495539712,1495540735,US
+1495540736,1495540991,GB
1495540992,1495541247,RO
1495541248,1495541759,GB
1495541760,1495543807,RO
@@ -29282,8 +30884,8 @@
1495589376,1495589887,IR
1495589888,1495590143,IT
1495590144,1495590655,RO
-1495590656,1495591935,US
-1495591936,1495596031,RO
+1495590656,1495592959,US
+1495592960,1495596031,RO
1495596032,1495596543,IR
1495596544,1495596799,RO
1495596800,1495597055,MD
@@ -29298,9 +30900,12 @@
1495607552,1495607807,RO
1495607808,1495608319,IR
1495608320,1495609343,MD
-1495609344,1495617535,RO
+1495609344,1495613439,RO
+1495613440,1495614463,GB
+1495614464,1495617535,RO
1495617536,1495618559,ES
-1495618560,1495620607,RO
+1495618560,1495619583,BE
+1495619584,1495620607,AT
1495620608,1495621375,GB
1495621376,1495621631,RO
1495621632,1495621887,GB
@@ -29331,18 +30936,21 @@
1495653376,1495654399,KZ
1495654400,1495654911,RO
1495654912,1495655167,NL
-1495655168,1495655423,BG
-1495655424,1495656959,RO
+1495655168,1495655423,GB
+1495655424,1495656447,US
+1495656448,1495656959,RO
1495656960,1495657215,GB
-1495657216,1495658495,RO
+1495657216,1495657471,RO
+1495657472,1495658495,US
1495658496,1495662591,IR
1495662592,1495668735,RO
1495668736,1495669247,IR
1495669248,1495669503,GB
-1495669504,1495670783,RO
+1495669504,1495669759,RO
+1495669760,1495670783,IL
1495670784,1495671807,MD
1495671808,1495672319,RO
-1495672320,1495672575,NL
+1495672320,1495672575,GB
1495672576,1495672831,MD
1495672832,1495674879,ES
1495674880,1495677951,RO
@@ -29351,7 +30959,8 @@
1495680000,1495682047,RO
1495682048,1495683071,MD
1495683072,1495687167,IR
-1495687168,1495688703,RO
+1495687168,1495688191,NL
+1495688192,1495688703,RO
1495688704,1495689215,IR
1495689216,1495689727,RO
1495689728,1495690239,DE
@@ -29361,14 +30970,16 @@
1495695360,1495699455,RO
1495699456,1495700479,GB
1495700480,1495701503,FR
-1495701504,1495704575,RO
+1495701504,1495703551,RO
+1495703552,1495704575,NL
1495704576,1495705599,KZ
1495705600,1495709695,RO
1495709696,1495713791,IR
1495713792,1495715839,ES
1495715840,1495716863,RO
1495716864,1495717887,IR
-1495717888,1495723519,RO
+1495717888,1495719935,ES
+1495719936,1495723519,RO
1495723520,1495724031,FR
1495724032,1495724287,GB
1495724288,1495724543,RO
@@ -29389,7 +31000,7 @@
1495749632,1495750655,MD
1495750656,1495752703,RO
1495752704,1495754751,MD
-1495754752,1495755775,RO
+1495754752,1495755775,NL
1495755776,1495756031,PL
1495756032,1495756799,RO
1495756800,1495758847,MD
@@ -29412,9 +31023,12 @@
1495767040,1495769087,ES
1495769088,1495771135,RO
1495771136,1495772159,PL
-1495772160,1495775743,RO
+1495772160,1495772671,US
+1495772672,1495775743,RO
1495775744,1495776255,IR
-1495776256,1495782399,RO
+1495776256,1495781375,RO
+1495781376,1495781631,IR
+1495781632,1495782399,RO
1495782400,1495782911,GB
1495782912,1495783167,RO
1495783168,1495783423,GB
@@ -29444,7 +31058,8 @@
1495815168,1495816191,ES
1495816192,1495816703,RO
1495816704,1495817215,IR
-1495817216,1495820799,RO
+1495817216,1495817471,US
+1495817472,1495820799,RO
1495820800,1495821311,IR
1495821312,1495821823,DE
1495821824,1495822335,IR
@@ -29523,7 +31138,8 @@
1495931648,1495931903,BG
1495931904,1495932159,RO
1495932160,1495932415,US
-1495932416,1495932927,RO
+1495932416,1495932671,RO
+1495932672,1495932927,GB
1495932928,1495933439,IR
1495933440,1495934975,RO
1495934976,1495935231,GB
@@ -29569,7 +31185,8 @@
1495976960,1495977983,KZ
1495977984,1495979007,RO
1495979008,1495979263,NL
-1495979264,1495979775,RO
+1495979264,1495979519,US
+1495979520,1495979775,RO
1495979776,1495980031,GB
1495980032,1495982079,RO
1495982080,1495983103,MD
@@ -29635,7 +31252,9 @@
1496066816,1496067071,QA
1496067072,1496072191,RO
1496072192,1496074239,ES
-1496074240,1496082175,RO
+1496074240,1496078335,RO
+1496078336,1496079359,MD
+1496079360,1496082175,RO
1496082176,1496082431,GB
1496082432,1496083967,RO
1496083968,1496084479,FR
@@ -29712,7 +31331,9 @@
1496182784,1496183039,ES
1496183040,1496183551,US
1496183552,1496184063,ES
-1496184064,1496184831,US
+1496184064,1496184740,US
+1496184741,1496184741,ES
+1496184742,1496184831,US
1496184832,1496188927,RO
1496188928,1496189951,ES
1496189952,1496190975,RO
@@ -29721,8 +31342,8 @@
1496197120,1496197631,MD
1496197632,1496198143,RO
1496198144,1496198655,IR
-1496198656,1496198911,NL
-1496198912,1496199167,GB
+1496198656,1496198656,US
+1496198657,1496199167,GB
1496199168,1496202239,RO
1496202240,1496202751,IR
1496202752,1496203263,RO
@@ -29749,11 +31370,13 @@
1496238080,1496240127,IQ
1496240128,1496242175,RO
1496242176,1496243199,IR
-1496243200,1496248595,RO
-1496248596,1496248596,MD
-1496248597,1496253439,RO
+1496243200,1496248575,RO
+1496248576,1496248831,MD
+1496248832,1496253439,RO
1496253440,1496254463,ES
-1496254464,1496260607,RO
+1496254464,1496256255,RO
+1496256256,1496256511,US
+1496256512,1496260607,RO
1496260608,1496261119,IT
1496261120,1496262655,RO
1496262656,1496263167,BG
@@ -29989,17 +31612,11 @@
1503854592,1503887359,RU
1503887360,1503895567,DE
1503895568,1503895571,IT
-1503895572,1503895663,DE
-1503895664,1503895671,FR
-1503895672,1503895679,DE
+1503895572,1503895679,DE
1503895680,1503895687,IT
-1503895688,1503895927,DE
-1503895928,1503895935,DK
-1503895936,1503896159,DE
+1503895688,1503896159,DE
1503896160,1503896175,CH
-1503896176,1503896343,DE
-1503896344,1503896351,AT
-1503896352,1503896411,DE
+1503896176,1503896411,DE
1503896412,1503896415,AT
1503896416,1503897367,DE
1503897368,1503897375,BE
@@ -30059,9 +31676,11 @@
1504051200,1504083967,FI
1504083968,1504116735,DE
1504116736,1504149503,PL
-1504149504,1504149693,GB
+1504149504,1504149691,GB
+1504149692,1504149693,US
1504149694,1504149694,IE
-1504149695,1504149759,GB
+1504149695,1504149695,US
+1504149696,1504149759,GB
1504149760,1504150015,ES
1504150016,1504150271,GB
1504150272,1504150527,DE
@@ -30138,13 +31757,7 @@
1505646848,1505647103,PL
1505647104,1505648639,CZ
1505648640,1505656831,LT
-1505665024,1505669491,IT
-1505669492,1505669495,SI
-1505669496,1505670159,IT
-1505670160,1505670163,SI
-1505670164,1505672239,IT
-1505672240,1505672243,SI
-1505672244,1505673215,IT
+1505665024,1505673215,IT
1505673216,1505681407,BG
1505681408,1505689599,RU
1505689600,1505697791,NO
@@ -30153,7 +31766,7 @@
1505714176,1505722367,LV
1505722368,1505738751,PL
1505738752,1505746943,GB
-1505746944,1505751039,IL
+1505746944,1505751039,UA
1505751040,1505755135,RU
1505755136,1506017279,GB
1506017280,1506082815,IR
@@ -30402,10 +32015,7 @@
1508818944,1508830719,RO
1508830720,1508831487,SK
1508831488,1508835327,RO
-1508835328,1508843519,CZ
-1508843520,1508847615,GB
-1508847616,1508849663,CZ
-1508849664,1508851711,GB
+1508835328,1508851711,CZ
1508851712,1508868095,PL
1508868096,1508884479,RU
1508884480,1508900863,DK
@@ -30432,8 +32042,8 @@
1509494784,1509498879,RU
1509498880,1509502975,DE
1509502976,1509507071,RU
-1509507072,1509507327,GB
-1509507328,1509507583,DE
+1509507072,1509507199,GB
+1509507200,1509507583,DE
1509507584,1509509375,GB
1509509376,1509509631,BE
1509509632,1509511167,GB
@@ -30513,8 +32123,8 @@
1510616832,1510617087,FR
1510617088,1510618111,RE
1510618112,1510618367,FR
-1510618368,1510618879,RE
-1510618880,1510619391,FR
+1510618368,1510619135,RE
+1510619136,1510619391,FR
1510619392,1510619647,RE
1510619648,1510619903,FR
1510619904,1510621183,RE
@@ -30648,8 +32258,8 @@
1512327680,1512328959,GP
1512328960,1512329215,FR
1512329216,1512332287,GP
-1512332288,1512333055,FR
-1512333056,1512333567,GP
+1512332288,1512332799,FR
+1512332800,1512333567,GP
1512333568,1512335615,FR
1512335616,1512336383,GP
1512336384,1512336639,FR
@@ -30752,7 +32362,8 @@
1518476288,1518476799,EE
1518476800,1518477311,SE
1518477312,1518481407,EE
-1518481408,1518501887,SE
+1518481408,1518493695,SE
+1518493696,1518501887,LV
1518501888,1518503935,EE
1518503936,1518510079,LT
1518510080,1518516223,LV
@@ -30767,10 +32378,8 @@
1518565376,1518567423,SE
1518567424,1518583807,LV
1518583808,1518600191,HR
-1518600192,1518633215,SE
-1518633216,1518633471,NL
-1518633472,1518641151,SE
-1518641152,1518649343,NL
+1518600192,1518641151,SE
+1518641152,1518649343,HR
1518649344,1518665727,SE
1518665728,1518723071,LV
1518723072,1518727167,EE
@@ -30801,7 +32410,8 @@
1519208704,1519210495,LV
1519210496,1519214591,LT
1519214592,1519222783,LV
-1519222784,1519271935,SE
+1519222784,1519263743,SE
+1519263744,1519271935,LV
1519271936,1519288319,NL
1519288320,1519292415,SE
1519292416,1519294463,LT
@@ -30836,9 +32446,7 @@
1520009216,1520041983,SY
1520041984,1520074751,RU
1520074752,1520107519,BG
-1520107520,1520139767,GB
-1520139768,1520139775,IE
-1520139776,1520140287,GB
+1520107520,1520140287,GB
1520140288,1520173055,RU
1520173056,1520205823,PL
1520205824,1520230399,RU
@@ -30889,14 +32497,16 @@
1532675072,1532682239,UA
1532682240,1532690431,LV
1532690432,1532755967,FR
-1532755968,1532756991,DE
-1532756992,1532774143,BG
+1532755968,1532756223,GR
+1532756224,1532756479,RO
+1532756480,1532756735,UA
+1532756736,1532774143,BG
1532774144,1532774399,CH
1532774400,1532784639,BG
1532784640,1532785151,TR
1532785152,1532787711,BG
-1532787712,1532789759,DE
-1532789760,1532795903,BG
+1532787712,1532788735,DE
+1532788736,1532795903,BG
1532795904,1532796927,DE
1532796928,1532797951,BG
1532797952,1532798975,DE
@@ -31165,7 +32775,9 @@
1534717344,1534717359,GB
1534717360,1534717739,FR
1534717740,1534717743,GB
-1534717744,1534717995,FR
+1534717744,1534717887,FR
+1534717888,1534717895,GB
+1534717896,1534717995,FR
1534717996,1534717999,GB
1534718000,1534718087,FR
1534718088,1534718091,ES
@@ -31234,7 +32846,9 @@
1534988288,1535049727,ES
1535049728,1535115263,SK
1535115264,1535116287,AT
-1535116288,1535148031,SE
+1535116288,1535123455,SE
+1535123456,1535131647,LV
+1535131648,1535148031,HR
1535148032,1535197183,AT
1535197184,1535203359,EE
1535203360,1535205375,SE
@@ -31364,7 +32978,9 @@
1535563372,1535563375,FI
1535563376,1535563455,FR
1535563456,1535563519,IE
-1535563520,1535566143,FR
+1535563520,1535564351,FR
+1535564352,1535564415,IE
+1535564416,1535566143,FR
1535566144,1535566159,ES
1535566160,1535566563,FR
1535566564,1535566567,GB
@@ -31623,7 +33239,7 @@
1539186688,1539194879,LV
1539194880,1539203071,RU
1539203072,1539204095,NL
-1539204096,1539205119,IN
+1539204096,1539205119,US
1539205120,1539206143,NL
1539206144,1539207167,GB
1539207168,1539211263,RU
@@ -31907,7 +33523,8 @@
1539530240,1539530751,AT
1539530752,1539531263,UA
1539531264,1539531775,RO
-1539531776,1539532799,RU
+1539531776,1539532543,RU
+1539532544,1539532799,CZ
1539532800,1539533311,DE
1539533312,1539533823,CZ
1539533824,1539534335,PL
@@ -32027,7 +33644,9 @@
1539649024,1539649535,LB
1539649536,1539650559,UA
1539650560,1539651583,RU
-1539651584,1539652607,UA
+1539651584,1539651839,UA
+1539651840,1539652095,RU
+1539652096,1539652607,UA
1539652608,1539653631,IL
1539653632,1539654655,RU
1539655680,1539656703,NL
@@ -32187,7 +33806,6 @@
1539738112,1539738367,DK
1539738368,1539738623,DE
1539738624,1539738879,UA
-1539738880,1539739135,NL
1539739136,1539739391,AT
1539739392,1539739647,UA
1539739648,1539739903,DK
@@ -32211,7 +33829,6 @@
1539745024,1539745279,GB
1539745280,1539745535,GI
1539745792,1539746303,DK
-1539746816,1539747071,DK
1539747072,1539747327,CH
1539747328,1539747583,NL
1539747584,1539747839,UA
@@ -32323,8 +33940,7 @@
1539779840,1539780095,NL
1539780096,1539780351,RU
1539780608,1539780863,PL
-1539780864,1539781119,RO
-1539781120,1539781375,NL
+1539780864,1539781375,RO
1539781376,1539781631,PL
1539781632,1539781887,HU
1539781888,1539782143,IL
@@ -32355,7 +33971,6 @@
1539788544,1539788799,HR
1539788800,1539789055,RU
1539789568,1539789823,DE
-1539789824,1539790079,NL
1539790080,1539790335,CH
1539790336,1539790591,LV
1539790848,1539791103,DE
@@ -32808,7 +34423,10 @@
1540217856,1540218879,GB
1540218880,1540219903,RU
1540219904,1540220927,PL
-1540220928,1540221951,US
+1540220928,1540220991,US
+1540220992,1540221439,NL
+1540221440,1540221567,US
+1540221568,1540221951,NL
1540221952,1540223999,RU
1540224000,1540225023,PL
1540225024,1540226047,GB
@@ -33019,7 +34637,6 @@
1540356608,1540357119,DE
1540357120,1540357631,RU
1540357632,1540358143,FR
-1540358144,1540358399,RU
1540358400,1540358655,GB
1540358656,1540358911,SE
1540358912,1540359167,GB
@@ -33152,7 +34769,6 @@
1540396032,1540396287,NO
1540396288,1540396543,AM
1540396544,1540396799,PL
-1540396800,1540397055,RU
1540397056,1540397311,IT
1540397312,1540397823,UA
1540397824,1540398079,DE
@@ -33232,7 +34848,6 @@
1540421376,1540421631,PL
1540421632,1540422143,RU
1540422144,1540422399,PL
-1540422400,1540422655,UA
1540422656,1540422911,GB
1540422912,1540423423,RU
1540423424,1540423679,BA
@@ -33496,8 +35111,8 @@
1540554752,1540555775,SE
1540555776,1540556799,UZ
1540556800,1540557823,DE
-1540557824,1540559871,UA
-1540559872,1540562943,RU
+1540557824,1540558848,UA
+1540558849,1540562943,RU
1540562944,1540563967,AT
1540563968,1540564991,RU
1540564992,1540566015,DE
@@ -33663,7 +35278,6 @@
1540660224,1540660479,RU
1540660480,1540660735,FR
1540660736,1540660991,RU
-1540660992,1540661247,RO
1540661760,1540662015,RO
1540662272,1540662527,RO
1540662528,1540662783,PL
@@ -34343,7 +35957,7 @@
1540981504,1540981759,DE
1540981760,1540982015,PL
1540982016,1540982271,DK
-1540982272,1540982783,GB
+1540982272,1540982527,GB
1540982784,1540983295,RU
1540983296,1540983551,ME
1540983808,1540984063,FR
@@ -34670,7 +36284,6 @@
1541177344,1541177599,CH
1541177600,1541177855,DE
1541177856,1541178111,RO
-1541178112,1541178367,RU
1541178368,1541178623,GB
1541178624,1541178879,RU
1541178880,1541179135,DE
@@ -35032,7 +36645,7 @@
1541362944,1541363199,DK
1541363200,1541363455,UA
1541363456,1541363711,IE
-1541363712,1541364223,UA
+1541363712,1541363967,UA
1541364224,1541364479,RU
1541364480,1541364735,AT
1541364736,1541364991,SE
@@ -35299,7 +36912,8 @@
1541476352,1541477375,GB
1541477376,1541479423,RU
1541479424,1541480447,PL
-1541480448,1541481471,RO
+1541480448,1541480959,US
+1541480960,1541481471,RO
1541481472,1541485567,UA
1541485568,1541486591,IR
1541486592,1541487615,UA
@@ -35388,9 +37002,7 @@
1541568000,1541568511,SE
1541568512,1541569535,RU
1541569536,1541570559,NL
-1541570560,1541571583,RU
-1541571584,1541572607,UA
-1541572608,1541573119,RU
+1541570560,1541573119,RU
1541573120,1541573631,UA
1541573632,1541574655,RU
1541574656,1541575167,SE
@@ -36057,7 +37669,7 @@
1541963520,1541964031,UA
1541964288,1541964543,NL
1541964544,1541965823,RU
-1541965824,1541966847,NL
+1541965824,1541966847,US
1541966848,1541967871,PL
1541967872,1541968895,RU
1541968896,1541969919,GB
@@ -36226,7 +37838,6 @@
1542068224,1542069759,UA
1542069760,1542070015,DE
1542070016,1542071295,UA
-1542071296,1542071551,CN
1542071552,1542071807,UA
1542071808,1542072319,DE
1542072320,1542073343,UA
@@ -36686,7 +38297,7 @@
1542351616,1542351871,PL
1542351872,1542353151,RU
1542353152,1542353407,SA
-1542353408,1542353919,RU
+1542353664,1542353919,RU
1542353920,1542354943,IT
1542354944,1542355711,RU
1542355712,1542355967,GB
@@ -36730,7 +38341,6 @@
1542378496,1542378751,DK
1542379008,1542379519,GB
1542379520,1542379775,PL
-1542379776,1542380031,RU
1542380032,1542380287,RO
1542380288,1542380543,BE
1542380544,1542380799,FR
@@ -36875,7 +38485,7 @@
1542454272,1542454783,NO
1542454784,1542455039,PL
1542455040,1542455295,SE
-1542455296,1542455551,CH
+1542455296,1542455551,US
1542455552,1542455807,RO
1542455808,1542456319,GB
1542456320,1542456831,RO
@@ -36974,7 +38584,6 @@
1542507520,1542508543,NO
1542508544,1542509567,RU
1542509568,1542510079,CY
-1542510080,1542510335,RU
1542510592,1542510847,SI
1542510848,1542511103,DE
1542511104,1542511871,RU
@@ -37196,8 +38805,9 @@
1542904320,1542904575,IL
1542904576,1542904831,RU
1542904832,1542914047,UA
-1542914048,1542922239,RU
-1542922240,1542930431,UA
+1542914048,1542923263,RU
+1542923264,1542923775,BG
+1542923776,1542930431,UA
1542930432,1542930943,CZ
1542930944,1542931455,IR
1542931456,1542932479,RU
@@ -37242,9 +38852,7 @@
1545863168,1545895935,RU
1545895936,1545928703,BA
1545928704,1545961471,SI
-1545961472,1545994751,RU
-1545994752,1545995007,CZ
-1545995008,1545995519,RU
+1545961472,1545995519,RU
1545995520,1545996287,CZ
1545996288,1545998335,RU
1545998336,1546000383,CZ
@@ -37316,7 +38924,15 @@
1546276864,1546278911,IT
1546278912,1546280959,RU
1546280960,1546283007,IT
-1546283008,1546285055,DE
+1546283008,1546283463,DE
+1546283464,1546283471,FR
+1546283472,1546283827,DE
+1546283828,1546283835,FR
+1546283836,1546284287,DE
+1546284288,1546284291,FR
+1546284292,1546284469,DE
+1546284470,1546284471,FR
+1546284472,1546285055,DE
1546285056,1546287103,PL
1546287104,1546289151,GB
1546289152,1546291199,RU
@@ -37599,11 +39215,17 @@
1550996224,1550996479,AU
1550996480,1550998527,RO
1550998528,1550998783,IT
-1550998784,1551007743,RO
+1550998784,1551000575,RO
+1551000576,1551001599,NL
+1551001600,1551007743,RO
1551007744,1551106047,MD
1551106048,1551237119,DE
1551237120,1551302655,GR
-1551368192,1551499263,NL
+1551368192,1551450111,NL
+1551450112,1551452159,SG
+1551452160,1551454207,NL
+1551454208,1551456255,US
+1551456256,1551499263,NL
1551503360,1551504383,GB
1551504384,1551505407,FR
1551516672,1551517695,IT
@@ -37651,7 +39273,9 @@
1558079872,1558079887,GB
1558079888,1558081175,FR
1558081176,1558081183,BE
-1558081184,1558082943,FR
+1558081184,1558082139,FR
+1558082140,1558082143,ES
+1558082144,1558082943,FR
1558082944,1558082959,PL
1558082960,1558083775,FR
1558083776,1558083791,DE
@@ -37665,7 +39289,9 @@
1558084656,1558084659,BE
1558084660,1558085055,FR
1558085056,1558085071,GB
-1558085072,1558091351,FR
+1558085072,1558088319,FR
+1558088320,1558088323,ES
+1558088324,1558091351,FR
1558091352,1558091352,ES
1558091353,1558093531,FR
1558093532,1558093532,HR
@@ -37679,7 +39305,9 @@
1558102508,1558102508,DE
1558102509,1558103159,FR
1558103160,1558103167,GB
-1558103168,1558106901,FR
+1558103168,1558103967,FR
+1558103968,1558103999,ES
+1558104000,1558106901,FR
1558106902,1558106902,DE
1558106903,1558107391,FR
1558107392,1558107455,NL
@@ -37700,11 +39328,25 @@
1558119424,1558122495,RU
1558122496,1558123007,SG
1558123008,1558123519,RU
-1558123520,1558126591,LU
+1558123520,1558125567,LU
+1558125568,1558126079,SG
+1558126080,1558126335,DE
+1558126336,1558126591,LU
1558126592,1558128639,RU
-1558128640,1558129663,LU
+1558128640,1558128895,US
+1558128896,1558129151,LU
+1558129152,1558129407,RU
+1558129408,1558129663,LU
1558129664,1558130687,US
-1558130688,1558138879,LU
+1558130688,1558131199,AU
+1558131200,1558131711,LU
+1558131712,1558132223,HK
+1558132224,1558136831,LU
+1558136832,1558137087,RU
+1558137088,1558137343,KR
+1558137344,1558137855,CZ
+1558137856,1558138367,HK
+1558138368,1558138879,AU
1558138880,1558139135,RU
1558139136,1558139391,NL
1558139392,1558139903,US
@@ -37712,16 +39354,27 @@
1558140160,1558140415,RU
1558140416,1558140671,SG
1558140672,1558140927,RU
-1558140928,1558141439,LU
+1558140928,1558141183,LU
+1558141184,1558141184,CY
+1558141185,1558141439,LU
1558141440,1558141695,CY
1558141696,1558141951,RU
-1558141952,1558142463,LU
+1558141952,1558142463,PL
1558142464,1558142719,US
-1558142720,1558147583,LU
+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,1558148351,SG
-1558148352,1558148607,LU
+1558148096,1558148607,SG
1558148608,1558149631,US
1558149632,1558150143,RU
1558150144,1558150655,DE
@@ -37806,12 +39459,17 @@
1559838720,1559855103,UA
1559855104,1559887871,HU
1559887872,1559920639,PT
-1559920640,1559932927,LU
+1559920640,1559921407,LU
+1559921408,1559921663,FR
+1559921664,1559932159,LU
+1559932160,1559932415,FR
+1559932416,1559932927,LU
1559932928,1559934975,DE
1559934976,1559937023,LU
1559937024,1559943167,DE
1559943168,1559944191,LU
-1559944192,1559945727,FR
+1559944192,1559945215,FR
+1559945216,1559945727,LU
1559945728,1559946751,GB
1559946752,1559947519,DE
1559947520,1559948287,LU
@@ -37829,10 +39487,9 @@
1560117248,1560125439,CZ
1560125440,1560135679,RU
1560135680,1560135807,UA
-1560135808,1560135935,CZ
-1560135936,1560139775,GB
-1560139776,1560141823,CZ
-1560141824,1560143871,GB
+1560135808,1560136447,CZ
+1560136448,1560139775,GB
+1560139776,1560143871,CZ
1560143872,1560145919,FR
1560145920,1560150015,CZ
1560150016,1560182783,NL
@@ -37840,7 +39497,11 @@
1560215552,1560281087,RU
1560281088,1562378239,FR
1562378240,1564999679,IT
-1564999680,1565239295,UA
+1564999680,1565224959,UA
+1565224960,1565227007,BG
+1565227008,1565227519,UA
+1565227520,1565229055,BG
+1565229056,1565239295,UA
1565239296,1565241343,RU
1565241344,1565294591,UA
1565294592,1565302783,PT
@@ -37854,7 +39515,9 @@
1565786112,1565917183,BY
1565917184,1565934591,RS
1565934592,1565935103,XK
-1565935104,1566048255,RS
+1565935104,1566019583,RS
+1566019584,1566020095,XK
+1566020096,1566048255,RS
1566048256,1566052351,RU
1566056448,1566060543,IT
1566060544,1566064639,UA
@@ -37950,7 +39613,8 @@
1566384128,1566386175,CZ
1566386176,1566388223,FR
1566388224,1566388479,HK
-1566388480,1566390271,LU
+1566388480,1566390015,LU
+1566390016,1566390271,US
1566390272,1566392319,LT
1566392320,1566394367,ES
1566394368,1566394528,NO
@@ -38198,7 +39862,7 @@
1567826432,1567827455,RO
1567827456,1567827711,BG
1567827712,1567830015,RO
-1567830016,1567831039,DE
+1567830016,1567831039,US
1567831040,1567832831,RO
1567832832,1567833087,GB
1567833088,1567833599,NL
@@ -38219,7 +39883,8 @@
1567850496,1567852543,RO
1567852544,1567854591,MD
1567854592,1567856639,IR
-1567856640,1567857663,RO
+1567856640,1567857407,RO
+1567857408,1567857663,US
1567857664,1567858687,ES
1567858688,1567860735,SE
1567860736,1567861247,BE
@@ -38369,10 +40034,9 @@
1570619392,1570621439,BA
1570621440,1570625535,RU
1570625536,1570627583,GB
-1570627584,1570635775,RU
-1570635776,1570644767,FR
-1570644768,1570644775,GB
-1570644776,1570644991,FR
+1570627584,1570629631,KG
+1570629632,1570635775,RU
+1570635776,1570644991,FR
1570644992,1570645247,GB
1570645248,1570652159,FR
1570652160,1570660863,SE
@@ -38412,8 +40076,8 @@
1571426048,1571426303,UA
1571426304,1571428351,RU
1571428352,1571428607,CZ
-1571428608,1571428863,UA
-1571428864,1571429375,CZ
+1571428608,1571429119,UA
+1571429120,1571429375,CZ
1571429376,1571430399,BY
1571430400,1571430911,UA
1571430912,1571431167,BY
@@ -38479,7 +40143,7 @@
1571484160,1571484671,CZ
1571484672,1571484927,KZ
1571484928,1571486719,RU
-1571486720,1571486975,CZ
+1571486720,1571486975,BY
1571486976,1571487231,NL
1571487232,1571488767,RU
1571488768,1571489023,CZ
@@ -38787,9 +40451,8 @@
1572669440,1572673535,RU
1572673536,1572675583,AT
1572675584,1572677631,ES
-1572677632,1572681983,RU
-1572681984,1572682239,NL
-1572682240,1572683775,RU
+1572677632,1572681727,RU
+1572681728,1572683775,NL
1572683776,1572685823,CH
1572685824,1572689919,RU
1572689920,1572691967,ES
@@ -38863,6 +40526,7 @@
1572835328,1572837375,IE
1572837376,1572839423,DK
1572839424,1572841471,DE
+1572841728,1572841983,GB
1572842752,1572843007,NL
1572843520,1572845567,JO
1572845568,1572847615,FR
@@ -39002,7 +40666,9 @@
1578596352,1578596863,GB
1578596864,1578602495,FR
1578602496,1578604543,NL
-1578604544,1578606591,RU
+1578604544,1578605014,RU
+1578605015,1578605015,GB
+1578605016,1578606591,RU
1578606592,1578608639,DE
1578608640,1578610687,CZ
1578610688,1578611039,FR
@@ -39053,7 +40719,9 @@
1578614496,1578614511,DE
1578614512,1578614583,FR
1578614584,1578614591,GB
-1578614592,1578631167,FR
+1578614592,1578615915,FR
+1578615916,1578615916,GB
+1578615917,1578631167,FR
1578631168,1578637311,IR
1578637312,1578651647,RO
1578651648,1578657791,IR
@@ -39116,10 +40784,7 @@
1580125952,1580126207,GB
1580126208,1580128255,CY
1580128256,1580129279,NL
-1580129280,1580129535,GB
-1580129536,1580130079,US
-1580130080,1580130095,GB
-1580130096,1580130303,US
+1580129280,1580130303,GB
1580130304,1580134399,CY
1580134400,1580135423,SE
1580135424,1580136447,GB
@@ -39128,7 +40793,11 @@
1580137472,1580138495,SE
1580138496,1580150783,IT
1580150784,1580154879,SY
-1580154880,1580204031,IT
+1580154880,1580199935,IT
+1580199936,1580200959,SY
+1580200960,1580201983,IT
+1580201984,1580203007,SY
+1580203008,1580204031,IT
1580204032,1580335103,SA
1580335104,1580466175,RU
1580466176,1580597247,RO
@@ -39167,9 +40836,7 @@
1582252032,1582268415,TR
1582268416,1582284799,DE
1582284800,1582301183,BH
-1582301184,1583089271,IT
-1583089272,1583089279,SI
-1583089280,1583349759,IT
+1582301184,1583349759,IT
1583349760,1583611903,SA
1583611904,1583615999,LV
1583616000,1583617791,NL
@@ -39227,8 +40894,8 @@
1583780432,1583780447,GB
1583780448,1583780455,IT
1583780456,1583780743,GB
-1583780744,1583780759,IT
-1583780760,1583780767,GB
+1583780744,1583780751,IT
+1583780752,1583780767,GB
1583780768,1583780775,IT
1583780776,1583780791,GB
1583780792,1583780799,IT
@@ -39242,9 +40909,7 @@
1583781672,1583781679,IT
1583781680,1583781863,GB
1583781864,1583781871,IT
-1583781872,1583782239,GB
-1583782240,1583782247,IT
-1583782248,1583782415,GB
+1583781872,1583782415,GB
1583782416,1583782423,IT
1583782424,1583782431,GB
1583782432,1583782439,IT
@@ -39332,7 +40997,9 @@
1585258496,1585260543,GB
1585260544,1585264639,RU
1585264640,1585265663,MT
-1585265664,1585266687,IM
+1585265664,1585265967,IM
+1585265968,1585265983,FR
+1585265984,1585266687,IM
1585266688,1585270783,DE
1585270784,1585272831,IT
1585272832,1585274879,RU
@@ -39415,7 +41082,8 @@
1585440768,1585442815,IT
1585442816,1585446911,RU
1585446912,1585577983,KW
-1585577984,1585709055,UA
+1585577984,1585643519,DE
+1585643520,1585709055,UA
1585709056,1585840127,PT
1585840128,1585971199,DE
1585971200,1585979391,AT
@@ -39558,7 +41226,8 @@
1588594688,1588602879,IR
1588602880,1588603135,RO
1588603136,1588603391,BG
-1588603392,1588604927,RO
+1588603392,1588603903,RO
+1588603904,1588604927,IT
1588604928,1588609023,IR
1588609024,1588613119,MD
1588613120,1588617215,IR
@@ -39577,11 +41246,14 @@
1588640768,1588641279,LT
1588641280,1588641535,RO
1588641536,1588641791,GB
-1588641792,1588643839,ES
+1588641792,1588642303,ES
+1588642304,1588642559,DK
+1588642560,1588642815,NL
+1588642816,1588643839,ES
1588643840,1588649983,RO
1588649984,1588652031,SE
1588652032,1588652159,NL
-1588652160,1588654079,RO
+1588652160,1588654079,LT
1588654080,1588658175,DE
1588658176,1588659199,RO
1588659200,1588659711,GB
@@ -39593,19 +41265,20 @@
1588663808,1588664063,GB
1588664064,1588664319,RO
1588664320,1588664575,TH
-1588664576,1588664831,VG
-1588664832,1588665087,RO
+1588664576,1588665087,RO
1588665088,1588665343,GB
1588665344,1588673535,RO
1588673536,1588674559,BG
-1588674560,1588676607,RO
+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,VG
-1588685312,1588686847,RO
+1588685056,1588686847,RO
1588686848,1588687103,NO
1588687104,1588687359,GB
1588687360,1588688383,RO
@@ -39649,8 +41322,9 @@
1589551104,1589560319,BG
1589560320,1589561343,GI
1589561344,1589563391,NL
-1589563392,1589573631,BG
-1589573632,1589574655,GB
+1589563392,1589569535,HK
+1589569536,1589573631,BG
+1589573632,1589574655,US
1589574656,1589575679,BG
1589575680,1589608447,RU
1589608448,1589616639,SE
@@ -39824,7 +41498,11 @@
1592577024,1592590335,BG
1592590336,1592594431,FI
1592594432,1592598527,DE
-1592598528,1592623103,FI
+1592598528,1592600575,FI
+1592600576,1592601599,NL
+1592601600,1592606719,FI
+1592606720,1592608767,SG
+1592608768,1592623103,FI
1592623104,1592655871,RU
1592655872,1592786943,FR
1592786944,1592803327,PL
@@ -39964,10 +41642,9 @@
1596858368,1596858879,CZ
1596858880,1596859391,RU
1596859392,1596859903,CZ
-1596859904,1596860415,RU
-1596860416,1596861439,BY
+1596859904,1596861439,RU
1596861440,1596861951,UA
-1596861952,1596862207,BY
+1596861952,1596862207,CZ
1596862208,1596866559,RU
1596866560,1596868607,UZ
1596868608,1596869631,RU
@@ -40003,7 +41680,10 @@
1596888064,1596889599,RU
1596889600,1596889855,KG
1596889856,1596890111,UA
-1596890112,1596890623,RU
+1596890112,1596890367,RU
+1596890368,1596890619,UA
+1596890620,1596890620,RU
+1596890621,1596890623,UA
1596890624,1596890879,CZ
1596890880,1596891135,RU
1596891136,1596892159,UA
@@ -40026,8 +41706,8 @@
1596930383,1596930383,TM
1596930384,1596931071,CZ
1596931072,1596931583,BY
-1596931584,1596932095,CZ
-1596932096,1596940287,RU
+1596931584,1596931839,CZ
+1596931840,1596940287,RU
1596940288,1596940543,CZ
1596940544,1596940799,RU
1596940800,1596941055,UA
@@ -40071,9 +41751,7 @@
1596968960,1596973055,BA
1596973056,1596975103,BY
1596975104,1596975359,CZ
-1596975360,1596977663,RU
-1596977664,1596977919,CZ
-1596977920,1596978431,RU
+1596975360,1596978431,RU
1596978432,1596978944,CZ
1596978945,1596978945,RU
1596978946,1596980223,CZ
@@ -40213,8 +41891,7 @@
1602291712,1602293759,SA
1602293760,1602295807,GB
1602295808,1602297855,NL
-1602297856,1602299391,IL
-1602299392,1602299903,GB
+1602297856,1602299903,IL
1602299904,1602301951,GR
1602301952,1602303999,DE
1602304000,1602306047,RU
@@ -40514,19 +42191,11 @@
1605099520,1605107711,RU
1605107712,1605108247,GB
1605108248,1605108255,IT
-1605108256,1605108583,GB
-1605108584,1605108591,IT
-1605108592,1605109079,GB
-1605109080,1605109087,IT
-1605109088,1605109223,GB
-1605109224,1605109231,IT
-1605109232,1605109351,GB
+1605108256,1605109351,GB
1605109352,1605109359,IT
1605109360,1605109495,GB
1605109496,1605109503,IT
-1605109504,1605110183,GB
-1605110184,1605110191,IT
-1605110192,1605110263,GB
+1605109504,1605110263,GB
1605110264,1605110271,IT
1605110272,1605110303,GB
1605110304,1605110311,IT
@@ -40769,9 +42438,7 @@
1611005952,1611007999,NL
1611008000,1611009023,US
1611009024,1611010047,NL
-1611010048,1611016703,US
-1611016704,1611016959,NL
-1611016960,1611036671,US
+1611010048,1611036671,US
1611036672,1611037183,NL
1611037184,1611042815,US
1611042816,1611046911,NL
@@ -40856,9 +42523,7 @@
1632305152,1632321535,CA
1632321536,1632354303,US
1632354304,1632362495,CA
-1632362496,1632979455,US
-1632979456,1632979583,CA
-1632979584,1634414591,US
+1632362496,1634414591,US
1634414592,1634418687,CA
1634418688,1634447359,US
1634447360,1634451455,CA
@@ -40894,9 +42559,7 @@
1654554624,1654558719,CA
1654558720,1654648831,US
1654648832,1654652927,CA
-1654652928,1660561023,US
-1660561024,1660561151,CA
-1660561152,1673527295,US
+1654652928,1673527295,US
1673527296,1673560063,CA
1673560064,1673986047,US
1673986048,1674051583,CA
@@ -40964,7 +42627,9 @@
1699618816,1699627007,CN
1699627008,1699643391,SG
1699643392,1699676159,HK
-1699676160,1699741695,KR
+1699676160,1699714047,KR
+1699714048,1699714815,AU
+1699714816,1699741695,KR
1699741696,1700793343,CN
1700793344,1700794367,VN
1700794368,1700798463,CN
@@ -41041,9 +42706,12 @@
1710882816,1710948351,KR
1710948352,1710949375,CN
1710949376,1710950399,NP
-1710950400,1711210495,CN
+1710950400,1710972671,CN
+1710972672,1710972927,TW
+1710972928,1711210495,CN
1711210496,1711276031,ID
1724715556,1724715556,MU
+1727528960,1728053247,ZA
1728053248,1728120063,AU
1728120064,1728120319,SG
1728120320,1728120575,IN
@@ -41362,7 +43030,6 @@
1728488192,1728488447,MY
1728488448,1728488703,IN
1728488704,1728488959,TH
-1728488960,1728489215,HK
1728489216,1728490495,IN
1728490496,1728491519,KR
1728491520,1728492543,HK
@@ -41431,7 +43098,7 @@
1728549632,1728549887,AU
1728549888,1728550911,IN
1728550912,1728551935,JP
-1728551936,1728552959,MY
+1728551936,1728552959,SG
1728552960,1728553983,HK
1728553984,1728555007,AU
1728555008,1728556031,NZ
@@ -41618,7 +43285,6 @@
1728733184,1728734207,ID
1728734208,1728735231,SG
1728735232,1728736255,ID
-1728736256,1728736511,HK
1728736512,1728736767,IN
1728736768,1728737023,ID
1728737280,1728738303,JP
@@ -41737,7 +43403,6 @@
1728836608,1728837631,HK
1728837632,1728838655,KR
1728838656,1728839679,ID
-1728839680,1728839935,MN
1728839936,1728840191,IN
1728840192,1728840447,SG
1728840448,1728842751,AU
@@ -41779,8 +43444,7 @@
1728872448,1728873471,AU
1728873472,1728874495,IN
1728874496,1728875519,CN
-1728875520,1728876543,HK
-1728876544,1728877567,MY
+1728875520,1728877567,MY
1728877568,1728878591,HK
1728878592,1728879615,MY
1728879616,1728880127,IN
@@ -41976,7 +43640,6 @@
1729042944,1729044479,HK
1729044480,1729045503,JP
1729045504,1729046015,ID
-1729046016,1729046271,HK
1729046272,1729046527,JP
1729046528,1729047551,BD
1729047552,1729048575,AU
@@ -42265,7 +43928,7 @@
1729314816,1729317887,CN
1729317888,1729319423,ID
1729319424,1729319935,SG
-1729319936,1729320959,HK
+1729319936,1729320959,US
1729320960,1729321983,IN
1729321984,1729323007,AU
1729323008,1729324031,VN
@@ -42389,7 +44052,7 @@
1729441792,1729442815,AU
1729442816,1729443839,IN
1729443840,1729444351,AU
-1729444352,1729444863,AE
+1729444352,1729444863,IN
1729444864,1729445887,TW
1729445888,1729446399,SG
1729446400,1729446911,IN
@@ -42443,7 +44106,7 @@
1729532928,1729533951,MY
1729533952,1729534975,JP
1729534976,1729535999,TW
-1729536000,1729537023,HK
+1729536000,1729537023,MY
1729537024,1729537791,ID
1729537792,1729538047,JP
1729538048,1729538559,ID
@@ -42518,7 +44181,6 @@
1729600512,1729601535,VN
1729601536,1729603583,CN
1729603584,1729604607,HK
-1729604608,1729605119,IN
1729605120,1729605375,AU
1729605376,1729605631,ID
1729605632,1729606655,CN
@@ -42725,7 +44387,9 @@
1729807360,1729808383,MY
1729808384,1729808895,IN
1729808896,1729809407,AU
-1729809408,1729810431,IN
+1729809408,1729809663,IN
+1729809664,1729810175,US
+1729810176,1729810431,IN
1729810432,1729812479,ID
1729812480,1729813503,IN
1729813504,1729814527,SG
@@ -43103,7 +44767,7 @@
1730377728,1730378239,IN
1730378240,1730378495,HK
1730378496,1730378751,IN
-1730378752,1730379775,HK
+1730378752,1730379775,US
1730379776,1730380799,AU
1730380800,1730381823,IN
1730381824,1730382847,MY
@@ -43277,8 +44941,7 @@
1730594816,1730596863,IN
1730597888,1730598911,PH
1730599424,1730599935,VU
-1730599936,1730604031,CN
-1730604032,1730605055,NP
+1730599936,1730605055,CN
1730605056,1730607103,IN
1730608128,1730609151,CN
1730609152,1730610687,IN
@@ -43392,7 +45055,7 @@
1730768640,1730768895,BD
1730769920,1730770943,HK
1730770944,1730771967,ID
-1730771968,1730772991,CN
+1730771968,1730772991,HK
1730772992,1730774015,SG
1730774016,1730775039,HK
1730775040,1730776063,JP
@@ -43501,7 +45164,7 @@
1730895872,1730898943,CN
1730898944,1730899967,MO
1730899968,1730900991,IN
-1730900992,1730901247,HK
+1730900992,1730901247,AU
1730901248,1730901503,SG
1730901504,1730901759,DE
1730901760,1730902015,AU
@@ -43557,7 +45220,7 @@
1730948608,1730949119,AU
1730949120,1730951167,IN
1730951168,1730952191,CN
-1730952192,1730953215,HK
+1730952192,1730954239,HK
1730954240,1730955263,SG
1730955264,1730957311,BD
1730957312,1730958335,CN
@@ -43663,7 +45326,7 @@
1731161088,1731162111,CN
1731162112,1731163135,HK
1731163136,1731165183,CN
-1731165184,1731167231,IN
+1731165184,1731166207,IN
1731167232,1731168255,ID
1731168256,1731170559,CN
1731170560,1731170687,HK
@@ -43711,7 +45374,7 @@
1731206656,1731206911,PH
1731206912,1731207167,JP
1731207168,1731208191,IN
-1731208192,1731210239,JP
+1731208192,1731209215,JP
1731210240,1731211263,IN
1731211264,1731211775,HK
1731211776,1731212287,IN
@@ -43766,7 +45429,7 @@
1731275776,1731276799,KR
1731276800,1731279871,IN
1731279872,1731280895,HK
-1731280896,1731281919,JP
+1731280896,1731281919,TH
1731281920,1731282175,IN
1731282176,1731282431,PK
1731282432,1731282943,PH
@@ -43880,14 +45543,13 @@
1731423232,1731424255,HK
1731424256,1731425279,AU
1731425280,1731426303,IN
-1731426304,1731427327,BD
1731427328,1731428351,KH
1731428352,1731428607,IN
1731428864,1731429119,AU
1731429120,1731429375,ID
1731429376,1731431423,IN
1731431424,1731431935,TR
-1731431936,1731432191,TW
+1731431936,1731432191,HK
1731432192,1731432447,TR
1731432448,1731433471,HK
1731433472,1731435519,IN
@@ -43934,12 +45596,12 @@
1731484672,1731485695,VN
1731485696,1731488767,CN
1731488768,1731489791,JP
-1731489792,1731490815,HK
+1731489792,1731490559,HK
+1731490560,1731490815,TW
1731490816,1731491839,AU
1731491840,1731492863,ID
1731492864,1731493887,IN
1731493888,1731495167,JP
-1731495168,1731495423,SG
1731495424,1731495935,BD
1731495936,1731496959,IN
1731496960,1731497983,BD
@@ -44045,8 +45707,7 @@
1731608576,1731609599,IN
1731609600,1731610623,AU
1731610624,1731611647,KR
-1731611648,1731612159,PK
-1731612672,1731614719,PK
+1731611648,1731614719,PK
1731614720,1731615743,JP
1731615744,1731616767,ID
1731616768,1731620351,IN
@@ -44222,7 +45883,8 @@
1731804160,1731805183,KR
1731806208,1731806463,AU
1731806464,1731807231,IN
-1731807232,1731807999,SG
+1731807232,1731807743,SG
+1731807744,1731807999,JP
1731808000,1731808255,DK
1731808256,1731809279,CN
1731809280,1731811583,IN
@@ -44246,8 +45908,8 @@
1731827712,1731828735,PK
1731828736,1731829759,SG
1731829760,1731830783,IN
-1731830784,1731831039,SG
-1731831040,1731831807,AU
+1731830784,1731831551,SG
+1731831552,1731831807,AU
1731831808,1731832831,PK
1731832832,1731836927,IN
1731836928,1731837951,MY
@@ -44325,7 +45987,6 @@
1731957760,1731958783,CN
1731958784,1731959807,IN
1731959808,1731960831,KR
-1731960832,1731961855,AU
1731961856,1731962879,CN
1731962880,1731963903,BD
1731963904,1731964927,KH
@@ -44394,7 +46055,12 @@
1732043776,1732044799,CN
1732044800,1732045823,HK
1732045824,1732046847,CN
-1732046848,1732047871,AU
+1732046848,1732046943,AU
+1732046944,1732046951,CN
+1732046952,1732046959,GB
+1732046960,1732046967,AU
+1732046968,1732046975,GB
+1732046976,1732047871,AU
1732047872,1732048895,IN
1732048896,1732049919,HK
1732049920,1732050943,PH
@@ -44463,8 +46129,7 @@
1732127744,1732128767,HK
1732128768,1732129023,SG
1732129024,1732129279,NZ
-1732129280,1732129535,AU
-1732129536,1732129791,HK
+1732129280,1732129791,AU
1732129792,1732130815,CN
1732130816,1732134911,IN
1732134912,1732140031,CN
@@ -44534,7 +46199,10 @@
1732318208,1732318719,IN
1732318720,1732318975,AU
1732318976,1732322303,IN
-1732322304,1732324351,CN
+1732322304,1732322815,CN
+1732322816,1732323327,HK
+1732323328,1732323839,CN
+1732323840,1732324351,HK
1732324352,1732325375,JP
1732325376,1732337663,CN
1732337664,1732338175,ID
@@ -44563,8 +46231,9 @@
1732374528,1732375551,US
1732375552,1732376575,AU
1732376576,1732377599,US
-1732377600,1732377855,NZ
-1732377856,1732378623,AU
+1732377600,1732377855,AU
+1732377856,1732378111,NZ
+1732378112,1732378623,AU
1732378624,1732384767,IN
1732384768,1732385279,BD
1732385280,1732385791,AU
@@ -44611,7 +46280,9 @@
1732422400,1732422655,JP
1732422656,1732423679,IN
1732423680,1732424703,BD
-1732424704,1732425727,HK
+1732424704,1732424705,HK
+1732424706,1732424707,CN
+1732424708,1732425727,HK
1732425728,1732426751,KH
1732426752,1732428799,KR
1732428800,1732429823,ID
@@ -44664,8 +46335,8 @@
1732504576,1732505599,IN
1732505600,1732506623,ID
1732506624,1732507647,IN
-1732507648,1732507648,PH
-1732507649,1732508671,AU
+1732507648,1732507903,PH
+1732507904,1732508671,AU
1732508672,1732509695,CN
1732509696,1732510719,ID
1732510720,1732511743,BD
@@ -44687,16 +46358,15 @@
1732536832,1732537087,AU
1732537088,1732537343,MN
1732537344,1732537855,AT
-1732537856,1732538367,BZ
+1732537856,1732538111,BZ
+1732538112,1732538367,LT
1732538368,1732539391,IN
1732539392,1732540415,BD
1732540416,1732541439,US
1732541440,1732541695,AU
1732541696,1732542463,SG
1732542464,1732543487,CN
-1732543488,1732543743,SG
-1732543744,1732543999,IL
-1732544000,1732544511,SG
+1732543488,1732544511,SG
1732544512,1732545023,ID
1732545024,1732545279,TW
1732545280,1732545535,MM
@@ -44704,7 +46374,8 @@
1732546560,1732547583,JP
1732547584,1732549631,KR
1732549632,1732550655,PH
-1732550656,1732552703,AU
+1732550656,1732551679,AU
+1732551680,1732552703,SG
1732552704,1732554751,HK
1732554752,1732555263,IN
1732555264,1732555775,AU
@@ -44839,11 +46510,12 @@
1732705280,1732707327,CN
1732707328,1732708351,AU
1732708352,1732709375,ID
-1732709376,1732710399,HK
+1732709376,1732710143,HK
+1732710144,1732710399,JP
1732710400,1732712447,IN
1732712448,1732712703,HK
1732712704,1732712959,AF
-1732712960,1732713215,US
+1732712960,1732713215,SG
1732713216,1732713471,AU
1732713472,1732714495,HK
1732714496,1732715519,CN
@@ -44922,7 +46594,7 @@
1732811776,1732812799,IN
1732812800,1732813311,HK
1732813312,1732813823,MY
-1732813824,1732814847,MO
+1732813824,1732814847,CN
1732814848,1732815871,IN
1732815872,1732816895,CN
1732816896,1732817919,IN
@@ -44948,12 +46620,12 @@
1732852480,1732852735,AU
1732852736,1732853759,ID
1732853760,1732854271,AU
-1732854272,1732854783,US
+1732854272,1732854783,HK
1732854784,1732855807,PH
1732855808,1732857855,ID
1732857856,1732858367,KI
1732858368,1732859903,AU
-1732859904,1732860927,HK
+1732859904,1732860927,CN
1732860928,1732861951,IN
1732861952,1732862975,CN
1732862976,1732863999,PK
@@ -44965,7 +46637,9 @@
1732869632,1732869887,AU
1732869888,1732870143,IN
1732870144,1732875263,CN
-1732875264,1732878335,IN
+1732875264,1732877567,IN
+1732877568,1732877823,US
+1732877824,1732878335,IN
1732878336,1732879359,HK
1732879360,1732880383,KH
1732880384,1732881407,CN
@@ -45066,7 +46740,7 @@
1732995072,1732998143,CN
1732998144,1732998399,AU
1732998400,1732998655,HK
-1732998656,1732998911,SG
+1732998656,1732998911,JP
1732998912,1732999167,CA
1732999168,1733000191,CN
1733000192,1733001215,IN
@@ -45128,7 +46802,10 @@
1733057280,1733057535,IN
1733057536,1733058559,CN
1733058560,1733060607,IN
-1733060608,1733061631,CN
+1733060608,1733060863,JP
+1733060864,1733061119,US
+1733061120,1733061375,CN
+1733061376,1733061631,US
1733061632,1733062655,IN
1733062656,1733063679,HK
1733063680,1733064703,TH
@@ -45293,7 +46970,7 @@
1733224448,1733225471,ID
1733225472,1733226751,IN
1733226752,1733227007,AU
-1733227008,1733227519,TH
+1733227008,1733227519,MY
1733227520,1733228543,IN
1733228544,1733230591,BD
1733230592,1733231615,IN
@@ -45369,7 +47046,7 @@
1733309440,1733309695,IN
1733309696,1733309951,AU
1733309952,1733313791,IN
-1733313792,1733314047,AU
+1733313792,1733314047,SG
1733314048,1733314559,BD
1733314560,1733315583,CN
1733315584,1733315839,NZ
@@ -45464,10 +47141,7 @@
1733406720,1733407743,JP
1733407744,1733407999,TH
1733408000,1733408511,IN
-1733408512,1733408767,CN
-1733408768,1733409279,HK
-1733409280,1733409535,DE
-1733409536,1733409791,CN
+1733408512,1733409791,CN
1733409792,1733411327,IN
1733411328,1733411839,ID
1733411840,1733412863,BD
@@ -45490,7 +47164,7 @@
1733425152,1733425663,ID
1733425664,1733427199,IN
1733427200,1733428223,GB
-1733428224,1733428735,HK
+1733428224,1733428735,US
1733428736,1733429247,ID
1733429248,1733430271,BD
1733430272,1733431295,ID
@@ -45542,7 +47216,7 @@
1733485568,1733486591,MY
1733486592,1733486847,MM
1733486848,1733487103,ID
-1733487104,1733487615,IN
+1733487104,1733487615,US
1733487616,1733488639,CN
1733488640,1733490175,ID
1733490176,1733490431,NZ
@@ -45643,7 +47317,7 @@
1733585920,1733586943,CN
1733586944,1733587967,GB
1733587968,1733588991,ID
-1733588992,1733590015,AU
+1733588992,1733590015,IN
1733590016,1733591039,JP
1733591040,1733592063,IN
1733592064,1733592319,MV
@@ -45675,15 +47349,402 @@
1733616640,1733618687,ID
1733618688,1733620735,IN
1733620736,1733621759,BD
-1733621760,1733622015,MY
+1733621760,1733622015,AU
1733622016,1733622271,ID
-1733622272,1733622527,IN
+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,1733671679,SG
+1733671680,1733671935,US
+1733671936,1733672959,HK
+1733672960,1733676031,BD
+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,CN
+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,CN
+1733701632,1733702655,TH
+1733702656,1733703679,PK
+1733703680,1733704191,NP
+1733704192,1733704703,AU
+1733704704,1733705727,CN
+1733705728,1733706751,HK
+1733706752,1733707007,JP
+1733707008,1733707519,CN
+1733707520,1733707775,US
+1733707776,1733709823,HK
+1733709824,1733710847,CN
+1733710848,1733711615,KR
+1733711616,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,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,NC
+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,HK
+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
1740636160,1740644351,CN
1740644352,1740645375,IN
1740645376,1740647423,HK
@@ -45775,8 +47836,7 @@
1740771328,1740772351,CN
1740772352,1740776447,IN
1740776448,1740777471,HK
-1740777472,1740777983,JP
-1740777984,1740778239,MO
+1740777472,1740778239,JP
1740778240,1740778495,HK
1740778496,1740779519,IN
1740779520,1740780543,AU
@@ -45817,7 +47877,7 @@
1740822016,1740822527,AU
1740822528,1740825599,IN
1740825856,1740826111,AU
-1740826112,1740826623,CN
+1740826112,1740826623,SG
1740826624,1740827647,IN
1740827648,1740828671,HK
1740828672,1740829695,IN
@@ -45832,8 +47892,7 @@
1740837376,1740837887,ID
1740837888,1740838911,MY
1740838912,1740839935,IN
-1740839936,1740840191,SG
-1740840192,1740840959,ID
+1740839936,1740840959,ID
1740840960,1740841983,SG
1740841984,1740845055,IN
1740845056,1740846079,HK
@@ -45866,6 +47925,7 @@
1740876288,1740876799,AU
1740876800,1740880639,IN
1740880640,1740880895,HK
+1740880896,1740881919,SG
1740881920,1740882943,CN
1740882944,1740884991,IN
1740884992,1740885503,BD
@@ -45922,9 +47982,10 @@
1740951552,1740957695,IN
1740957696,1740958719,BD
1740958720,1740959743,VN
-1740959744,1740960255,NL
-1740960256,1740960767,IN
-1740960768,1740962815,VN
+1740959744,1740960767,NL
+1740960768,1740962303,VN
+1740962304,1740962559,TW
+1740962560,1740962815,VN
1740962816,1740964863,SG
1740964864,1740965887,HK
1740965888,1740966399,IN
@@ -46098,8 +48159,10 @@
1741178880,1741183999,IN
1741184000,1741185023,BD
1741185024,1741186047,JP
-1741186048,1741188095,IN
-1741188096,1741191167,HK
+1741186048,1741188607,IN
+1741188608,1741188863,US
+1741188864,1741189119,IN
+1741189120,1741191167,HK
1741191168,1741192191,VN
1741192192,1741193215,HK
1741193216,1741194239,ID
@@ -46208,7 +48271,9 @@
1741456384,1741457407,IN
1741457408,1741462527,CN
1741462528,1741466623,IN
-1741466624,1741467647,JP
+1741466624,1741466879,JP
+1741466880,1741467391,HK
+1741467392,1741467647,JP
1741467648,1741469695,HK
1741469696,1741472767,IN
1741472768,1741473791,CN
@@ -46240,7 +48305,6 @@
1741493248,1741494271,HK
1741494272,1741495295,KH
1741495296,1741497343,AU
-1741497344,1741497855,PH
1741497856,1741498111,NZ
1741498112,1741498367,IN
1741498368,1741500415,CN
@@ -46352,11 +48416,10 @@
1741631488,1741632511,CN
1741632512,1741636607,IN
1741636608,1741637631,HK
-1741637632,1741638655,PH
+1741637632,1741638655,MY
1741638656,1741639679,NZ
1741639680,1741640703,NP
1741640704,1741641727,PK
-1741641728,1741642751,BD
1741642752,1741643007,AU
1741643008,1741643263,HK
1741643264,1741643775,AU
@@ -46449,7 +48512,6 @@
1741756416,1741756927,AU
1741756928,1741757439,IN
1741757440,1741758463,HK
-1741758464,1741759487,US
1741759488,1741760511,IN
1741760512,1741761535,HK
1741761536,1741762559,AU
@@ -46461,7 +48523,10 @@
1741765632,1741766655,HK
1741766656,1741768703,IN
1741768704,1741769727,AU
-1741769728,1741770751,PK
+1741769728,1741769983,PK
+1741769984,1741770239,DK
+1741770240,1741770495,PK
+1741770496,1741770751,PR
1741770752,1741771775,BD
1741771776,1741772799,PK
1741772800,1741774591,IN
@@ -46471,7 +48536,6 @@
1741775616,1741775871,IN
1741775872,1741776895,HK
1741776896,1741777919,MY
-1741777920,1741778431,AU
1741778432,1741778943,IN
1741778944,1741779967,CN
1741779968,1741780991,JP
@@ -46483,7 +48547,7 @@
1741785088,1741786111,CN
1741786112,1741788159,IN
1741788160,1741789183,JP
-1741789184,1741790207,AU
+1741789184,1741789695,AU
1741790208,1741791231,MY
1741791232,1741792255,AU
1741792256,1741794303,SG
@@ -46512,8 +48576,8 @@
1741815808,1741816831,CN
1741816832,1741817855,PK
1741817856,1741818367,PH
-1741818368,1741818879,AU
-1741818880,1741819903,US
+1741818368,1741819902,AU
+1741819903,1741819903,PK
1741819904,1741820927,BD
1741820928,1741821951,PH
1741821952,1741822975,AU
@@ -46680,7 +48744,7 @@
1741989888,1741990143,GB
1741990144,1741990911,SG
1741991936,1741992191,MY
-1741992192,1741992959,IN
+1741992192,1741992447,IN
1741992960,1741993983,TH
1741993984,1741995007,HK
1741995008,1741996031,JP
@@ -46750,7 +48814,8 @@
1742093312,1742095359,IN
1742095360,1742095615,KR
1742095616,1742095871,US
-1742095872,1742096383,MM
+1742095872,1742096127,LT
+1742096128,1742096383,MM
1742096384,1742097407,JP
1742097408,1742098431,NP
1742098432,1742099455,BD
@@ -46979,7 +49044,9 @@
1742451712,1742452735,VN
1742452736,1742453759,CN
1742453760,1742454783,PH
-1742454784,1742455807,HK
+1742454784,1742455295,HK
+1742455296,1742455551,US
+1742455552,1742455807,HK
1742455808,1742456063,TH
1742456064,1742456831,ID
1742456832,1742460415,IN
@@ -47309,7 +49376,6 @@
1742990336,1742991359,IN
1742991360,1742992383,ID
1742992384,1742993407,LK
-1742993408,1742994431,JP
1742994432,1742995455,ID
1742995456,1742996479,BD
1742996480,1742997503,TH
@@ -47379,7 +49445,8 @@
1743062528,1743063039,AU
1743063040,1743064063,SG
1743064064,1743064575,ID
-1743065088,1743066111,TW
+1743065088,1743065599,TW
+1743065600,1743066111,IN
1743066112,1743067135,CN
1743067136,1743068159,IN
1743068160,1743069183,HK
@@ -47464,7 +49531,6 @@
1743145984,1743147007,NZ
1743147008,1743147263,AU
1743147264,1743147519,NZ
-1743147520,1743147775,MN
1743147776,1743148031,ID
1743148032,1743149055,IN
1743149056,1743150079,KR
@@ -47479,8 +49545,7 @@
1743158272,1743159295,MY
1743160320,1743161343,TH
1743161344,1743162367,HK
-1743162368,1743162623,BZ
-1743162624,1743162879,AQ
+1743162368,1743162879,BZ
1743162880,1743163135,KR
1743163136,1743163391,BZ
1743163392,1743166463,IN
@@ -47555,7 +49620,8 @@
1743240192,1743241215,SG
1743241216,1743242239,JP
1743242240,1743244287,ID
-1743244288,1743245311,AU
+1743244288,1743244799,AU
+1743244800,1743245311,AF
1743245312,1743248383,IN
1743248384,1743248895,SG
1743248896,1743249407,IN
@@ -48279,7 +50345,6 @@
1744097280,1744098303,JP
1744098304,1744099327,NZ
1744099328,1744101375,JP
-1744101376,1744102399,HK
1744102400,1744103423,FJ
1744103424,1744104447,CN
1744104448,1744105471,AU
@@ -48606,7 +50671,8 @@
1744411648,1744412671,LA
1744412672,1744413695,TW
1744413696,1744417791,CN
-1744417792,1744418815,IN
+1744417792,1744418559,IN
+1744418560,1744418815,AU
1744418816,1744419839,JP
1744419840,1744421887,CN
1744421888,1744422911,HK
@@ -48832,7 +50898,7 @@
1744655872,1744656383,ID
1744656384,1744657407,VN
1744657408,1744658431,AU
-1744658432,1744659455,HK
+1744658432,1744659455,CA
1744659456,1744660479,JP
1744660480,1744660735,IN
1744660736,1744660991,MY
@@ -48900,7 +50966,6 @@
1744727040,1744728063,HK
1744728064,1744729087,CN
1744730112,1744731135,MN
-1744731136,1744731647,IN
1744731648,1744732159,ID
1744732160,1744733183,IN
1744733184,1744734207,NZ
@@ -48924,7 +50989,6 @@
1744750080,1744750591,US
1744750592,1744752639,IN
1744752640,1744753663,HK
-1744753664,1744754687,SG
1744754688,1744755711,VN
1744755712,1744756735,HK
1744756736,1744757759,PF
@@ -48955,7 +51019,6 @@
1744778752,1744779263,AU
1744779264,1744780287,CN
1744780288,1744781311,HK
-1744781312,1744782335,JP
1744782336,1744783359,CN
1744783360,1744786431,IN
1744786432,1744787455,VN
@@ -49059,12 +51122,12 @@
1747736864,1747736895,SG
1747736896,1747737055,US
1747737056,1747737119,GB
-1747737120,1747737183,US
-1747737184,1747737215,AU
-1747737216,1747737247,US
+1747737120,1747737215,AU
+1747737216,1747737247,SG
1747737248,1747737279,KR
1747737280,1747737311,NL
-1747737312,1747737407,US
+1747737312,1747737343,HK
+1747737344,1747737407,US
1747737408,1747737439,IE
1747737440,1747737535,US
1747737536,1747737567,HK
@@ -49161,7 +51224,9 @@
1747770816,1747770943,US
1747770944,1747771007,SE
1747771008,1747771135,AU
-1747771136,1747777679,US
+1747771136,1747772459,US
+1747772460,1747772491,FR
+1747772492,1747777679,US
1747777680,1747777743,CA
1747777744,1747777791,NL
1747777792,1747779071,US
@@ -49195,7 +51260,11 @@
1747912704,1747912959,NL
1747912960,1747913215,US
1747913216,1747913471,IE
-1747913472,1747915775,US
+1747913472,1747913727,US
+1747913728,1747913983,IE
+1747913984,1747914239,FI
+1747914240,1747914495,AT
+1747914496,1747915775,US
1747915776,1747916287,GB
1747916288,1747926015,US
1747926016,1747926527,CA
@@ -49246,7 +51315,11 @@
1749450240,1749465087,US
1749465088,1749465599,NL
1749465600,1749476863,US
-1749476864,1749496319,NL
+1749476864,1749479423,NL
+1749479424,1749487615,US
+1749487616,1749491711,NL
+1749491712,1749495807,US
+1749495808,1749496319,NL
1749496320,1749497855,US
1749497856,1749499391,NL
1749499392,1749508095,US
@@ -49269,8 +51342,10 @@
1749618176,1749618687,NL
1749618688,1749635071,US
1749635072,1749636095,NL
-1749636096,1749685247,US
-1749685248,1749686783,NL
+1749636096,1749647359,US
+1749647360,1749655551,NL
+1749655552,1749686527,US
+1749686528,1749686783,NL
1749686784,1749696511,US
1749696512,1749698047,NL
1749698048,1749698559,US
@@ -49308,9 +51383,17 @@
1750080512,1750096383,US
1750096384,1750106111,NL
1750106112,1750123007,US
-1750123008,1750153727,NL
+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,1750172671,NL
+1750154240,1750159359,NL
+1750159360,1750163455,US
+1750163456,1750172671,NL
1750172672,1750174719,US
1750174720,1750175743,NL
1750175744,1750192127,US
@@ -49322,10 +51405,16 @@
1750224384,1750224895,US
1750224896,1750252543,NL
1750252544,1750253055,US
-1750253056,1750321663,NL
+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,1750331391,NL
-1750331392,1750350847,US
+1750323200,1750327295,NL
+1750327296,1750350847,US
1750350848,1750351871,NL
1750351872,1750368255,US
1750368256,1750373375,NL
@@ -49340,12 +51429,18 @@
1750425600,1750443519,US
1750443520,1750444031,NL
1750444032,1750463487,US
-1750463488,1750494207,NL
+1750463488,1750482943,NL
+1750482944,1750492159,US
+1750492160,1750492671,NL
+1750492672,1750493183,US
+1750493184,1750494207,NL
1750494208,1750494719,US
1750494720,1750514687,NL
1750514688,1750515199,US
-1750515200,1750552575,NL
-1750552576,1750573055,US
+1750515200,1750534655,NL
+1750534656,1750536191,US
+1750536192,1750544383,NL
+1750544384,1750573055,US
1750573056,1750597631,NL
1750597632,1750664191,US
1750664192,1750665727,NL
@@ -49586,11 +51681,18 @@
1753491456,1753493503,GB
1753493504,1753494527,US
1753494528,1753494783,IL
-1753494784,1753497407,US
+1753494784,1753496575,US
+1753496576,1753497407,CA
1753497408,1753497455,PH
-1753497456,1753499391,US
+1753497456,1753497599,CA
+1753497600,1753499391,US
1753499392,1753499647,PH
-1753499648,1753511167,US
+1753499648,1753499903,AE
+1753499904,1753500159,US
+1753500160,1753500415,SK
+1753500416,1753507391,US
+1753507392,1753507439,KR
+1753507440,1753511167,US
1753511168,1753511423,FR
1753511424,1753512703,US
1753512704,1753512959,SG
@@ -49602,9 +51704,9 @@
1753517568,1753517823,NO
1753517824,1753518591,US
1753518592,1753518847,JP
-1753518848,1753520447,US
-1753520448,1753520495,GB
-1753520496,1753522431,US
+1753518848,1753520383,US
+1753520384,1753520639,GB
+1753520640,1753522431,US
1753522432,1753522687,FR
1753522688,1753526015,US
1753526016,1753526271,DE
@@ -49647,7 +51749,9 @@
1754210304,1754223615,US
1754223616,1754223623,MX
1754223624,1754223631,AU
-1754223632,1754251519,US
+1754223632,1754226687,US
+1754226688,1754228735,IL
+1754228736,1754251519,US
1754251520,1754251775,LY
1754251776,1754252031,US
1754252032,1754252287,MR
@@ -50061,7 +52165,11 @@
1755839744,1755839999,ER
1755840000,1755840255,AL
1755840256,1755840511,RU
-1755840512,1756049407,US
+1755840512,1755846623,US
+1755846624,1755846631,GB
+1755846632,1755863327,US
+1755863328,1755863335,GB
+1755863336,1756049407,US
1756049408,1756053503,CA
1756053504,1756086271,US
1756086272,1756090367,CA
@@ -50087,13 +52195,15 @@
1757457408,1757458431,CA
1757458432,1757460479,US
1757460480,1757462527,VI
-1757462528,1757472767,US
+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,1757502463,US
+1757497344,1757501439,US
1757502464,1757503487,CA
1757503488,1757505535,US
1757505536,1757506559,CA
@@ -50325,7 +52435,8 @@
1759526400,1759526655,JE
1759526656,1759526911,FO
1759526912,1759528959,IL
-1759528960,1759535103,US
+1759528960,1759531007,US
+1759531008,1759535103,SG
1759535104,1759543295,CA
1759543296,1759547391,US
1759547392,1759548415,NL
@@ -50398,10 +52509,9 @@
1760819200,1760819455,IT
1760819456,1760819711,GB
1760819712,1760819967,MA
-1760819968,1760820223,HK
-1760820224,1760820479,US
+1760819968,1760820479,US
1760820480,1760820735,CA
-1760820736,1760823295,US
+1760820736,1760822271,US
1760823296,1760824319,PT
1760824320,1760837631,US
1760837632,1760839679,CA
@@ -50503,8 +52613,10 @@
1761214464,1761222655,MF
1761222656,1761230847,US
1761230848,1761239039,CA
-1761239040,1761255423,US
-1761255424,1761255679,CN
+1761239040,1761241343,US
+1761241344,1761241599,ID
+1761241600,1761255423,US
+1761255424,1761255679,CO
1761255680,1761255935,NZ
1761255936,1761256191,DK
1761256192,1761256447,HR
@@ -50568,13 +52680,15 @@
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
+1761523712,1761524735,US
+1761525760,1761526783,US
1761526784,1761527807,CA
1761527808,1761544191,US
1761544192,1761546239,CA
@@ -50594,7 +52708,7 @@
1761600512,1761601535,US
1761601536,1761602559,VC
1761602560,1761606655,US
-1761606656,1761607679,VC
+1761606656,1761607679,LC
1761607680,1762613861,ZA
1762613862,1762613862,US
1762613863,1762656255,ZA
@@ -50618,7 +52732,9 @@
1762695168,1762701311,ZA
1762701312,1762703359,FR
1762703360,1762705407,GB
-1762705408,1762768895,MU
+1762705408,1762764799,MU
+1762764800,1762766847,NL
+1762766848,1762768895,SE
1762768896,1762770943,DE
1762770944,1762783231,MU
1762783232,1762791423,KE
@@ -50626,7 +52742,8 @@
1762795520,1762799615,TZ
1762799616,1762803711,MZ
1762803712,1762820095,ZA
-1762820096,1762942975,MU
+1762820096,1762824191,GB
+1762824192,1762942975,MU
1762942976,1762947071,NL
1762947072,1762951167,SE
1762951168,1762955263,DE
@@ -50658,7 +52775,9 @@
1763402240,1763402751,KE
1763402752,1763405823,MU
1763405824,1763407871,ZA
-1763407872,1763418111,MU
+1763407872,1763413503,MU
+1763413504,1763414015,ZA
+1763414016,1763418111,MU
1763418112,1763429887,ZA
1763429888,1763438591,KE
1763438592,1763442687,UG
@@ -50675,7 +52794,7 @@
1763581952,1763598335,MU
1763598336,1763602431,IN
1763602432,1763606527,NL
-1763606528,1763610623,MU
+1763606528,1763610623,SE
1763610624,1763614719,DE
1763614720,1763631103,MU
1763631104,1763635199,AE
@@ -50684,9 +52803,8 @@
1763657728,1763659775,ZA
1763659776,1763661823,MU
1763661824,1763663871,FR
-1763663872,1763690495,MU
-1763690496,1763692543,ZA
-1763692544,1763694591,MU
+1763663872,1763688447,MU
+1763688448,1763694591,ZA
1763694592,1763696639,FR
1763696640,1763704831,MU
1763704832,1764753407,EG
@@ -50698,7 +52816,8 @@
1769996288,1772093439,MA
1772093440,1772617727,KE
1772617728,1773142015,AO
-1773142016,1773273087,ZA
+1773142016,1773207551,LR
+1773207552,1773273087,ZA
1773273088,1773404159,RW
1773404160,1773666303,EG
1773666304,1773928447,ZA
@@ -50898,10 +53017,8 @@
1805737984,1805742079,CA
1805742080,1805752575,US
1805752576,1805753087,CA
-1805753088,1805754111,US
-1805754112,1805754129,CA
-1805754130,1805754130,US
-1805754131,1805754367,CA
+1805753088,1805754175,US
+1805754176,1805754367,CA
1805754368,1805756415,US
1805756928,1806131199,US
1806132224,1806132479,US
@@ -50942,16 +53059,23 @@
1806263552,1806263807,KR
1806263808,1806401535,US
1806401536,1806434303,CA
-1806434304,1806925823,US
+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,1807056895,US
+1806958592,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
-1807060992,1807062015,CA
1807062016,1807062271,US
1807063040,1807072255,US
1807072256,1807073023,CA
@@ -50977,7 +53101,9 @@
1807694848,1807695359,JP
1807695360,1807695871,FR
1807695872,1807699967,VI
-1807699968,1807707311,US
+1807699968,1807706793,US
+1807706794,1807706794,CN
+1807706795,1807707311,US
1807707312,1807707312,JP
1807707313,1807732735,US
1807732736,1807736831,GP
@@ -51052,9 +53178,7 @@
1816001792,1816002559,NL
1816002560,1816068095,US
1816068096,1816133631,CA
-1816133632,1816542463,US
-1816542464,1816542719,CA
-1816542720,1819976622,US
+1816133632,1819976622,US
1819976623,1819976623,RE
1819976624,1822429183,US
1822429184,1822433279,CA
@@ -51121,7 +53245,9 @@
1823356160,1823356415,NL
1823356416,1823356671,US
1823356672,1823356927,NL
-1823356928,1823361791,US
+1823356928,1823358799,US
+1823358800,1823358807,GB
+1823358808,1823361791,US
1823361792,1823362303,CA
1823362304,1823375359,US
1823375360,1823379455,CA
@@ -51145,7 +53271,9 @@
1831337984,1831862271,DE
1831862272,1832124415,PT
1832124416,1832386559,IT
-1832386560,1832448895,DK
+1832386560,1832435711,DK
+1832435712,1832435967,SE
+1832435968,1832448895,DK
1832448896,1832449023,SE
1832449024,1832449535,DK
1832449536,1832449663,SE
@@ -51153,8 +53281,10 @@
1832460288,1832460799,SE
1832460800,1832484351,DK
1832484352,1832484607,SE
-1832484608,1832554495,DK
-1832554496,1832555007,SE
+1832484608,1832496127,DK
+1832496128,1832496383,SE
+1832496384,1832550399,DK
+1832550400,1832555007,SE
1832555008,1832648703,DK
1832648704,1832681471,HR
1832681472,1832714239,RU
@@ -51185,11 +53315,7 @@
1832799232,1832800255,FR
1832800256,1832800767,MQ
1832800768,1832801279,FR
-1832801280,1832802303,MQ
-1832802304,1832803583,FR
-1832803584,1832803839,MQ
-1832803840,1832804351,FR
-1832804352,1832806399,MQ
+1832801280,1832806399,MQ
1832806400,1832808447,GP
1832808448,1832812543,FR
1832812544,1832845311,RU
@@ -51263,9 +53389,9 @@
1833315968,1833316351,IM
1833316352,1833318399,DK
1833318400,1833320447,GB
-1833320448,1833321215,IQ
-1833321216,1833321471,AE
-1833321472,1833322495,IQ
+1833320448,1833321282,IQ
+1833321283,1833321283,AE
+1833321284,1833322495,IQ
1833322496,1833324543,IT
1833324544,1833326591,NO
1833326592,1833327103,GB
@@ -51499,9 +53625,7 @@
1835913216,1835917311,RU
1835917312,1835917919,GB
1835917920,1835917935,IT
-1835917936,1835917959,GB
-1835917960,1835917967,IT
-1835917968,1835918439,GB
+1835917936,1835918439,GB
1835918440,1835918447,IT
1835918448,1835918519,GB
1835918520,1835918527,IT
@@ -51513,15 +53637,9 @@
1835918848,1835918855,IT
1835918856,1835919415,GB
1835919416,1835919423,IT
-1835919424,1835919511,GB
-1835919512,1835919519,IT
-1835919520,1835919751,GB
+1835919424,1835919751,GB
1835919752,1835919759,IT
-1835919760,1835919983,GB
-1835919984,1835919991,IT
-1835919992,1835921079,GB
-1835921080,1835921087,IT
-1835921088,1835921111,GB
+1835919760,1835921111,GB
1835921112,1835921127,IT
1835921128,1835921159,GB
1835921160,1835921167,IT
@@ -51535,27 +53653,23 @@
1835922672,1835922679,IT
1835922680,1835923151,GB
1835923152,1835923159,IT
-1835923160,1835923511,GB
-1835923512,1835923527,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,1835924375,GB
-1835924376,1835924383,IT
-1835924384,1835925007,GB
+1835924296,1835924815,GB
+1835924816,1835924823,IT
+1835924824,1835925007,GB
1835925008,1835925015,IT
1835925016,1835925111,GB
1835925112,1835925119,IT
-1835925120,1835925159,GB
-1835925160,1835925167,IT
-1835925168,1835925191,GB
+1835925120,1835925191,GB
1835925192,1835925199,IT
-1835925200,1835925327,GB
-1835925328,1835925335,IT
-1835925336,1835925383,GB
+1835925200,1835925383,GB
1835925384,1835925391,IT
1835925392,1835925479,GB
1835925480,1835925487,IT
@@ -51885,7 +53999,8 @@
1839529984,1839562751,RU
1839562752,1839595519,BA
1839595520,1839603711,SA
-1839603712,1839618047,RO
+1839603712,1839609855,RO
+1839609856,1839618047,KZ
1839618048,1839628287,SA
1839628288,1839661055,RO
1839661056,1839693823,ES
@@ -52000,7 +54115,11 @@
1841926101,1841930239,NL
1841930240,1841938431,KG
1841938432,1841946623,RU
-1841946624,1841954815,UA
+1841946624,1841946658,PT
+1841946659,1841946659,UA
+1841946660,1841948671,PT
+1841948672,1841948927,UA
+1841948928,1841954815,PT
1841954816,1841971199,RU
1841971200,1841979391,CZ
1841979392,1841982975,NL
@@ -52134,7 +54253,8 @@
1843806208,1843822591,IR
1843822592,1843838975,RU
1843838976,1843839487,IR
-1843839488,1843839999,DE
+1843839488,1843839743,ES
+1843839744,1843839999,DE
1843840000,1843840255,TR
1843840256,1843840767,DE
1843840768,1843841023,SE
@@ -52146,18 +54266,19 @@
1843843584,1843843839,AT
1843843840,1843844863,DE
1843844864,1843845119,GB
-1843845120,1843845631,DE
+1843845120,1843845631,ES
1843845632,1843845887,GB
1843845888,1843846143,DE
1843846144,1843846399,GB
1843846400,1843846655,IR
-1843846656,1843846911,DE
+1843846656,1843846911,ES
1843846912,1843847167,IR
1843847168,1843851775,DE
1843851776,1843852031,IR
1843852032,1843852799,DE
1843852800,1843853311,IR
-1843853312,1843854079,DE
+1843853312,1843853823,DE
+1843853824,1843854079,ES
1843854080,1843854335,IR
1843854336,1843855359,DE
1843855360,1843871743,PL
@@ -52178,8 +54299,7 @@
1843943424,1843945471,CH
1843945472,1843947519,FR
1843947520,1843949567,RU
-1843949568,1843950591,ES
-1843950592,1843951615,BY
+1843949568,1843951615,ES
1843951616,1843955711,DE
1843955712,1843957759,IT
1843957760,1843959807,CZ
@@ -52316,11 +54436,7 @@
1844310016,1844318207,FR
1844318208,1844322303,IT
1844322304,1844326399,CZ
-1844326400,1844330239,DK
-1844330240,1844330303,LU
-1844330304,1844330423,DK
-1844330424,1844330439,LU
-1844330440,1844330495,DK
+1844326400,1844330495,DK
1844330496,1844334591,GB
1844334592,1844342783,RU
1844342784,1844346879,IT
@@ -52358,7 +54474,9 @@
1844772864,1844838399,RS
1844838400,1844903935,GB
1844903936,1844969471,NO
-1844969472,1845006335,RU
+1844969472,1844984831,RU
+1844984832,1844985343,GE
+1844985344,1845006335,RU
1845006336,1845010431,KZ
1845010432,1845022719,RU
1845022720,1845023743,KZ
@@ -52371,9 +54489,7 @@
1845027584,1845027839,ES
1845027840,1845029887,RU
1845029888,1845030143,KZ
-1845030144,1845030911,RU
-1845030912,1845031935,GE
-1845031936,1845035007,RU
+1845030144,1845035007,RU
1845035008,1845100543,GB
1845100544,1845166079,DE
1845166080,1845231615,UA
@@ -52423,8 +54539,7 @@
1847853056,1848115199,PK
1848115200,1848377343,CN
1848377344,1848378367,BD
-1848378368,1848379391,HK
-1848379392,1848380415,IN
+1848378368,1848380415,IN
1848380416,1848381439,CN
1848381440,1848382463,NZ
1848382464,1848383487,JP
@@ -52461,7 +54576,9 @@
1848832000,1848836095,JP
1848836096,1849032703,CN
1849032704,1849065471,JP
-1849065472,1849163775,PH
+1849065472,1849092607,PH
+1849092608,1849092863,US
+1849092864,1849163775,PH
1849163776,1849819135,CN
1849819136,1849950207,JP
1849950208,1850212351,KR
@@ -52759,8 +54876,8 @@
1886978048,1886986239,KR
1886986240,1886990335,TW
1886990336,1886994431,IN
-1886994432,1887005695,TW
-1887005696,1887010815,HK
+1886994432,1887006719,TW
+1887006720,1887010815,HK
1887010816,1887019007,TH
1887019008,1887027199,HK
1887027200,1887043583,KR
@@ -52845,7 +54962,8 @@
1897175040,1897176063,JP
1897176064,1897176319,SG
1897176320,1897176575,HK
-1897176576,1897177087,SG
+1897176576,1897176831,JP
+1897176832,1897177087,US
1897177088,1897201663,JP
1897201664,1897209855,KR
1897209856,1897213951,AU
@@ -52885,7 +55003,9 @@
1897743616,1897744575,SI
1897744576,1897744607,SG
1897744608,1897746176,SI
-1897746177,1897758719,US
+1897746177,1897748511,US
+1897748512,1897748514,HK
+1897748515,1897758719,US
1897758720,1897779199,KR
1897779200,1897781247,AU
1897781248,1897783295,JP
@@ -52983,10 +55103,11 @@
1909481472,1909587967,CN
1909587968,1909719039,MY
1909719040,1909735423,CN
+1909735424,1909736713,IN
+1909736715,1909743615,IN
1909743616,1909744639,AU
1909744640,1909745663,CN
1909745664,1909746687,JP
-1909746688,1909747711,MY
1909747712,1909751807,ID
1909751808,1909759999,JP
1909760000,1909762047,ID
@@ -53536,7 +55657,53 @@
1959661568,1959662591,IN
1959662592,1959663615,LK
1959663616,1959664639,SG
-1959664640,1959665663,ID
+1959664640,1959668735,ID
+1959668736,1959670783,BD
+1959670784,1959671807,HK
+1959671808,1959673855,BD
+1959673856,1959674879,PK
+1959674880,1959675903,JP
+1959675904,1959676927,US
+1959676928,1959677951,SG
+1959677952,1959678975,AU
+1959678976,1959679999,PK
+1959680000,1959681023,BD
+1959681024,1959682047,CN
+1959682048,1959683071,IN
+1959683072,1959683327,US
+1959683328,1959684095,CN
+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,1959716863,AU
+1959716864,1959719935,ID
+1959719936,1959720959,LK
+1959720960,1959721983,MY
+1959721984,1959723007,BD
1959723008,1960050687,CN
1960050688,1960058879,KR
1960058880,1960067071,VN
@@ -53571,8 +55738,8 @@
1960211904,1960211967,SG
1960211968,1960212479,AU
1960212480,1960212582,IN
-1960212584,1960212735,IN
-1960212736,1960214015,SG
+1960212584,1960212991,IN
+1960212992,1960214015,SG
1960214016,1960214271,IN
1960214272,1960214527,SG
1960214528,1960574975,CN
@@ -53618,7 +55785,7 @@
1964146688,1964171263,JP
1964171264,1964173311,BD
1964173568,1964173823,JP
-1964173824,1964174079,HK
+1964173824,1964174079,US
1964174080,1964174335,AU
1964174336,1964174591,SG
1964174621,1964174621,TW
@@ -53726,8 +55893,10 @@
1970798592,1970800639,SG
1970800640,1970802943,AU
1970802944,1970803199,SG
-1970803200,1970803711,AU
-1970803712,1970804223,HK
+1970803200,1970803455,AU
+1970803456,1970803711,IN
+1970803712,1970803967,HK
+1970803968,1970804223,SG
1970804224,1970804479,AU
1970804480,1970804735,SG
1970804736,1970806783,KH
@@ -53814,8 +55983,7 @@
1986509824,1986510847,JP
1986510848,1986519039,KR
1986519040,1986523135,PK
-1986523136,1986523904,HK
-1986523905,1986525183,CN
+1986523136,1986525183,CN
1986525184,1986527231,BN
1986527232,1986723839,JP
1986723840,1986740223,AU
@@ -54047,67 +56215,8 @@
2001829888,2001841247,HK
2001841248,2001841248,SA
2001841249,2001846271,HK
-2001846272,2001855231,SG
-2001855232,2001855263,US
-2001855264,2001855743,SG
-2001855744,2001855999,HK
-2001856000,2001856127,SG
-2001856128,2001856151,CZ
-2001856152,2001856155,SG
-2001856156,2001856159,CZ
-2001856160,2001856191,SG
-2001856192,2001856199,CZ
-2001856200,2001857279,SG
-2001857280,2001857535,HK
-2001857536,2001857791,SG
-2001857792,2001858047,HK
-2001858048,2001858319,SG
-2001858320,2001858335,US
-2001858336,2001858639,SG
-2001858640,2001858655,US
-2001858656,2001859071,SG
-2001859072,2001859327,HK
-2001859328,2001860143,SG
-2001860144,2001860159,US
-2001860160,2001860351,SG
-2001860352,2001860607,HK
-2001860608,2001860655,SG
-2001860656,2001860659,US
-2001860660,2001860661,HK
-2001860662,2001860664,US
-2001860665,2001860665,HK
-2001860666,2001860667,US
-2001860668,2001860668,HK
-2001860669,2001860671,US
-2001860672,2001860991,SG
-2001860992,2001860995,US
-2001860996,2001860997,HK
-2001860998,2001861001,US
-2001861002,2001861003,HK
-2001861004,2001861007,US
-2001861008,2001861263,SG
-2001861264,2001861265,US
-2001861266,2001861267,HK
-2001861268,2001861268,US
-2001861269,2001861269,HK
-2001861270,2001861271,US
-2001861272,2001861272,HK
-2001861273,2001861273,US
-2001861274,2001861274,HK
-2001861275,2001861279,US
-2001861280,2001862079,SG
-2001862080,2001862101,US
-2001862102,2001862102,HK
-2001862103,2001862116,US
-2001862117,2001862118,HK
-2001862119,2001862124,US
-2001862125,2001862125,HK
-2001862126,2001862128,US
-2001862129,2001862131,HK
-2001862132,2001862143,US
-2001862144,2001862303,SG
-2001862304,2001862335,HK
-2001862336,2001862655,SG
+2001846272,2001854463,SG
+2001854464,2001862655,HK
2001862656,2001864703,AU
2001864704,2001870847,JP
2001870848,2001879039,KR
@@ -54256,7 +56365,6 @@
2019078144,2019082239,IN
2019082240,2019098623,HK
2019098624,2019115007,PH
-2019115008,2019117055,US
2019117056,2019119103,IN
2019119104,2019121151,NZ
2019121152,2019123199,ID
@@ -54325,7 +56433,7 @@
2032926720,2033057791,AU
2033057792,2033074175,CN
2033074176,2033075199,PK
-2033075200,2033077247,BD
+2033075200,2033076223,BD
2033077248,2033078271,CN
2033078272,2033079295,HK
2033079296,2033088511,IN
@@ -54361,7 +56469,8 @@
2033625088,2033627135,HK
2033627136,2033629183,CN
2033629184,2033630207,AU
-2033630208,2033631231,HK
+2033630208,2033630463,CN
+2033630464,2033631231,HK
2033631232,2033647615,KR
2033647616,2033663999,CN
2033664000,2033696767,KR
@@ -54628,7 +56737,9 @@
2063110144,2063111167,JP
2063111168,2063114239,AU
2063114240,2063115263,IN
-2063115264,2063118159,JP
+2063115264,2063116871,JP
+2063116872,2063116879,KR
+2063116880,2063118159,JP
2063118160,2063118191,PH
2063118192,2063118287,JP
2063118288,2063118303,PH
@@ -55042,7 +57153,9 @@
2097610752,2097643519,AU
2097643520,2097676287,KR
2097676288,2098200575,JP
-2098200576,2098724863,IN
+2098200576,2098593791,IN
+2098593792,2098594303,SG
+2098594304,2098724863,IN
2098724864,2098987007,TH
2098987008,2099183615,JP
2099183616,2099199999,MO
@@ -55163,8 +57276,8 @@
2147497216,2147497471,RO
2147497472,2147498239,DE
2147498240,2147498495,RO
-2147498496,2147500287,DE
-2147500288,2147501055,NL
+2147498496,2147500031,DE
+2147500032,2147501055,NL
2147501056,2147501311,SK
2147501312,2147501823,NL
2147501824,2147502079,US
@@ -55296,9 +57409,7 @@
2155827200,2155831295,PL
2155831296,2155833343,RU
2155833344,2155833855,SE
-2155833856,2155834371,NL
-2155834372,2155834373,SE
-2155834374,2155834623,NL
+2155833856,2155834623,NL
2155834624,2155834879,LU
2155834880,2155835391,NL
2155835392,2155839487,RO
@@ -55332,7 +57443,9 @@
2156920832,2156986367,CA
2156986368,2159017983,US
2159017984,2159083519,DE
-2159083520,2159149055,US
+2159083520,2159110463,US
+2159110464,2159110495,CA
+2159110496,2159149055,US
2159149056,2159280127,CH
2159280128,2159542271,US
2159542272,2159607807,AU
@@ -55385,7 +57498,9 @@
2166030336,2166095871,AT
2166095872,2166292479,US
2166292480,2166358015,GB
-2166358016,2166571007,US
+2166358016,2166472703,US
+2166472704,2166473727,CA
+2166473728,2166571007,US
2166571008,2166575103,GB
2166575104,2166594563,US
2166594564,2166594564,DE
@@ -55419,7 +57534,9 @@
2171076608,2171142143,FR
2171142144,2172256255,US
2172256256,2172272639,GH
-2172272640,2172289023,RE
+2172272640,2172277247,RE
+2172277248,2172277759,FR
+2172277760,2172289023,RE
2172289024,2172321791,AO
2172321792,2172452863,US
2172452864,2172518399,NL
@@ -55589,7 +57706,9 @@
2187264000,2187329535,AU
2187329536,2187331583,US
2187331584,2187332607,CA
-2187332608,2187460607,US
+2187332608,2187333631,US
+2187333632,2187334143,DE
+2187334144,2187460607,US
2187460608,2187526143,FR
2187526144,2187591679,US
2187591680,2187657215,SE
@@ -55609,7 +57728,9 @@
2188718162,2188718162,SI
2188718338,2188718338,AT
2188718474,2188718474,AT
-2188719380,2188719380,NL
+2188719360,2188719615,NL
+2188719616,2188719743,FR
+2188719744,2188719871,DE
2188724464,2188724464,NL
2188725248,2188725503,NL
2188726272,2188730367,ES
@@ -55619,7 +57740,13 @@
2188740608,2188741631,DE
2188749056,2188749311,US
2188754432,2188754687,RU
-2188763136,2188771327,IT
+2188763136,2188769471,IT
+2188769472,2188769503,DE
+2188769504,2188769599,IT
+2188769600,2188769631,DE
+2188769632,2188769663,IT
+2188769664,2188770175,DE
+2188770176,2188771327,IT
2188771328,2188836863,US
2188901754,2188901754,GB
2188902400,2188967935,FR
@@ -55638,8 +57765,8 @@
2190140416,2190737407,NL
2190737408,2190802943,GB
2190802944,2190803967,DE
-2190803968,2190804991,PL
-2190804992,2190868479,DE
+2190803968,2190804735,PL
+2190804736,2190868479,DE
2190868480,2191065087,US
2191065088,2191130623,JP
2191130624,2191196159,US
@@ -55713,17 +57840,13 @@
2193707656,2193707663,IT
2193707664,2193707751,GB
2193707752,2193707759,IT
-2193707760,2193707767,GB
-2193707768,2193707775,IT
-2193707776,2193707791,GB
+2193707760,2193707791,GB
2193707792,2193707799,IT
2193707800,2193707839,GB
2193707840,2193707847,IT
2193707848,2193708375,GB
2193708376,2193708383,IT
-2193708384,2193708863,GB
-2193708864,2193708871,IT
-2193708872,2193709199,GB
+2193708384,2193709199,GB
2193709200,2193709215,IT
2193709216,2193711103,GB
2193711104,2193713151,DE
@@ -55794,7 +57917,7 @@
2197798912,2197815295,IR
2197815296,2197816319,BO
2197816320,2197828607,BR
-2197828608,2197829631,CL
+2197828608,2197829631,AR
2197829632,2197833727,BR
2197833728,2197834751,CR
2197834752,2197841919,BR
@@ -55806,9 +57929,7 @@
2197849088,2197850111,BR
2197850112,2197851135,CO
2197851136,2197858303,BR
-2197858304,2197858431,CO
-2197858432,2197858447,CW
-2197858448,2197859327,CO
+2197858304,2197859327,CO
2197859328,2197860351,CL
2197860352,2197865471,BR
2197865472,2197866495,ES
@@ -55850,9 +57971,7 @@
2204172288,2204237823,SE
2204237824,2204303359,US
2204303360,2204368895,DE
-2204368896,2204369407,PA
-2204369408,2204369663,US
-2204369664,2204369919,PA
+2204368896,2204369919,PA
2204369920,2204376063,BR
2204376064,2204377087,CL
2204377088,2204378111,BR
@@ -55883,18 +58002,13 @@
2204893184,2204894207,AR
2204894208,2204895231,PA
2204895232,2204897279,BR
-2204897280,2204897447,HN
-2204897448,2204897455,CA
-2204897456,2204898095,HN
-2204898096,2204898111,CR
-2204898112,2204898303,HN
+2204897280,2204898303,HN
2204898304,2204899327,PA
2204899328,2204902399,BR
2204902400,2204903423,CR
2204903424,2204904447,AR
2204904448,2204910591,BR
-2204910592,2204910847,AR
-2204910848,2204911615,CL
+2204910592,2204911615,CL
2204911616,2204913663,BR
2204913664,2204914687,AR
2204914688,2204929023,BR
@@ -55906,9 +58020,7 @@
2204943360,2204946431,BR
2204946432,2204947455,CL
2204947456,2204952575,BR
-2204952576,2204952767,HN
-2204952768,2204952775,US
-2204952776,2204953599,HN
+2204952576,2204953599,HN
2204953600,2204958719,BR
2204958720,2205089791,US
2205089792,2205155327,GB
@@ -55957,7 +58069,9 @@
2207776768,2207842303,CH
2207842304,2207846399,US
2207846400,2207848447,NL
-2207848448,2207907839,US
+2207848448,2207852543,US
+2207852544,2207853055,RS
+2207853056,2207907839,US
2207907840,2207973375,IT
2207973376,2208038911,NL
2208038912,2208235519,US
@@ -55995,8 +58109,8 @@
2209087488,2209153023,AU
2209153024,2209218559,DE
2209218560,2209284095,NL
-2209284096,2209349631,IT
-2209349632,2209411839,US
+2209284096,2209349632,IT
+2209349633,2209411839,US
2209411840,2209412095,NL
2209412096,2209415167,US
2209415168,2209480703,FI
@@ -56094,11 +58208,15 @@
2214068224,2214133759,JP
2214133760,2214264831,US
2214264832,2214330367,GB
-2214330368,2214399047,US
+2214330368,2214398975,US
+2214398976,2214398983,CN
+2214398984,2214399047,US
2214399048,2214399055,IE
-2214399056,2214399071,US
+2214399056,2214399071,CN
2214399072,2214399135,SG
-2214399136,2214399295,US
+2214399136,2214399215,US
+2214399216,2214399223,CN
+2214399224,2214399295,US
2214399296,2214399303,SG
2214399304,2214399331,US
2214399332,2214399339,HK
@@ -56150,9 +58268,7 @@
2214460416,2214461439,NL
2214461440,2214526975,FR
2214526976,2214527999,BR
-2214528000,2214528333,AR
-2214528334,2214528334,NL
-2214528335,2214529023,AR
+2214528000,2214529023,AR
2214529024,2214530047,BR
2214530048,2214531071,AR
2214531072,2214537215,BR
@@ -56239,20 +58355,27 @@
2230649728,2230653063,US
2230653064,2230653135,BR
2230653136,2230655559,US
-2230655560,2230655711,IE
+2230655560,2230655575,IE
+2230655576,2230655583,US
+2230655584,2230655711,IE
2230655712,2230655775,US
2230655776,2230655791,IE
2230655792,2230656351,US
2230656352,2230656423,AT
-2230656424,2230656495,FI
+2230656424,2230656431,US
+2230656432,2230656495,FI
2230656496,2230656983,US
2230656984,2230656991,IE
2230656992,2230657007,US
2230657008,2230657023,IE
2230657024,2230657215,US
-2230657216,2230657343,FI
+2230657216,2230657231,FI
+2230657232,2230657239,US
+2230657240,2230657343,FI
2230657344,2230657559,US
-2230657560,2230657727,IE
+2230657560,2230657591,IE
+2230657592,2230657599,US
+2230657600,2230657727,IE
2230657728,2230657775,US
2230657776,2230657815,FI
2230657816,2230657879,US
@@ -56306,7 +58429,9 @@
2230664192,2230664647,US
2230664648,2230664703,AT
2230664704,2230664727,US
-2230664728,2230664871,IE
+2230664728,2230664735,IE
+2230664736,2230664743,US
+2230664744,2230664871,IE
2230664872,2230665087,US
2230665088,2230665183,AT
2230665184,2230665295,US
@@ -56426,7 +58551,9 @@
2230713936,2230713983,SG
2230713984,2230714047,KR
2230714048,2230714079,BR
-2230714080,2230714255,MY
+2230714080,2230714119,MY
+2230714120,2230714127,US
+2230714128,2230714255,MY
2230714256,2230714287,BR
2230714288,2230714303,US
2230714304,2230714311,CL
@@ -56450,11 +58577,7 @@
2231333888,2231335935,BR
2231335936,2231336959,MX
2231336960,2231337983,BR
-2231337984,2231338639,HN
-2231338640,2231338647,US
-2231338648,2231338695,HN
-2231338696,2231338703,US
-2231338704,2231339007,HN
+2231337984,2231339007,HN
2231339008,2231346175,BR
2231346176,2231347199,PY
2231347200,2231355391,BR
@@ -56567,9 +58690,11 @@
2255749120,2255814655,US
2255814656,2255880191,CA
2255880192,2255945727,US
-2255945728,2255998975,DE
-2255998976,2256003071,FR
-2256003072,2256011263,DE
+2255945728,2255994879,DE
+2255994880,2256003071,FR
+2256003072,2256006655,DE
+2256006656,2256006911,FR
+2256006912,2256011263,DE
2256011264,2256535551,US
2256535552,2256543743,GB
2256543744,2256551935,US
@@ -56790,7 +58915,9 @@
2259304976,2259304991,US
2259304992,2259305407,NL
2259305408,2259305439,US
-2259305440,2259306431,NL
+2259305440,2259306239,NL
+2259306240,2259306367,US
+2259306368,2259306431,NL
2259306432,2259308543,US
2259308544,2259312639,IE
2259312640,2259314687,NL
@@ -56810,9 +58937,7 @@
2259342848,2259343359,IE
2259343360,2259343615,HK
2259343616,2259343871,BR
-2259343872,2259348479,US
-2259348480,2259348991,NL
-2259348992,2259352575,US
+2259343872,2259352575,US
2259352576,2259353343,IE
2259353344,2259353599,US
2259353600,2259419135,DE
@@ -56853,7 +58978,9 @@
2262040576,2262106111,FR
2262106112,2262171647,GB
2262171648,2262237183,FR
-2262237184,2262499327,US
+2262237184,2262414335,US
+2262414336,2262415359,IN
+2262415360,2262499327,US
2262499328,2262630399,GB
2262630400,2262722809,NL
2262722811,2262724071,NL
@@ -56884,13 +59011,18 @@
2264909312,2264909567,DE
2264909568,2264909823,TR
2264909824,2264911871,IR
-2264911872,2264920575,DE
-2264920576,2264920831,ES
+2264911872,2264912383,DE
+2264912384,2264912895,ES
+2264912896,2264913663,DE
+2264913664,2264913919,ES
+2264913920,2264920319,DE
+2264920320,2264920831,ES
2264920832,2264921343,DE
2264921344,2264921855,IR
2264921856,2264922111,DE
2264922112,2264922623,IR
-2264922624,2264924159,DE
+2264922624,2264922879,ES
+2264922880,2264924159,DE
2264924160,2264989695,CA
2264989696,2265605887,US
2265605888,2265606143,GB
@@ -56957,7 +59089,9 @@
2282264832,2283151359,US
2283151360,2283159551,IN
2283159552,2291142655,US
-2291142656,2291204095,NL
+2291142656,2291154943,NL
+2291154944,2291171327,GB
+2291171328,2291204095,NL
2291204096,2291269631,PR
2291269632,2291281919,US
2291281920,2291286015,JP
@@ -57069,8 +59203,7 @@
2302404608,2302405631,JP
2302405632,2302406655,HK
2302406656,2302408703,IN
-2302408704,2302409727,AU
-2302409728,2302410751,JP
+2302408704,2302410751,AU
2302410752,2302541823,SE
2302541824,2302607359,CH
2302607360,2302625761,SC
@@ -57102,7 +59235,9 @@
2303340640,2303340671,FI
2303340672,2303341283,FR
2303341284,2303341287,FI
-2303341288,2303342459,FR
+2303341288,2303341951,FR
+2303341952,2303341967,ES
+2303341968,2303342459,FR
2303342460,2303342463,DE
2303342464,2303343039,FR
2303343040,2303343103,PT
@@ -57112,9 +59247,13 @@
2303343488,2303343615,IE
2303343616,2303343827,FR
2303343828,2303343831,DE
-2303343832,2303344639,FR
+2303343832,2303344471,FR
+2303344472,2303344479,IE
+2303344480,2303344639,FR
2303344640,2303344895,GB
-2303344896,2303349119,FR
+2303344896,2303348863,FR
+2303348864,2303348991,GB
+2303348992,2303349119,FR
2303349120,2303349247,ES
2303349248,2303349383,FR
2303349384,2303349391,NL
@@ -57122,7 +59261,9 @@
2303350784,2303351039,ES
2303351040,2303351055,FR
2303351056,2303351071,GB
-2303351072,2303353215,FR
+2303351072,2303352523,FR
+2303352524,2303352524,GB
+2303352525,2303353215,FR
2303353216,2303353343,GB
2303353344,2303353783,FR
2303353784,2303353787,GB
@@ -57152,13 +59293,17 @@
2303382880,2303382895,ES
2303382896,2303383503,FR
2303383504,2303383519,GB
-2303383520,2303384959,FR
+2303383520,2303383807,FR
+2303383808,2303383935,ES
+2303383936,2303384959,FR
2303384960,2303384991,GB
2303384992,2303385087,FR
2303385088,2303385103,FI
2303385104,2303388415,FR
2303388416,2303388543,ES
-2303388544,2303392843,FR
+2303388544,2303391007,FR
+2303391008,2303391039,IE
+2303391040,2303392843,FR
2303392844,2303392847,FI
2303392848,2303393535,FR
2303393536,2303393567,PT
@@ -57286,7 +59431,8 @@
2315257856,2315258879,AR
2315258880,2315259903,CL
2315259904,2315266047,BR
-2315266048,2315267071,VE
+2315266048,2315266559,VE
+2315266560,2315267071,CO
2315267072,2315270143,BR
2315270144,2315271167,AR
2315271168,2315278335,BR
@@ -57332,7 +59478,8 @@
2317395968,2317396223,NO
2317396224,2317398015,US
2317398016,2317398271,GB
-2317398272,2317413375,US
+2317398272,2317412351,US
+2317412352,2317413375,CA
2317413376,2317413631,ID
2317413632,2317414655,US
2317414656,2317414911,AU
@@ -57356,9 +59503,7 @@
2317638656,2317639679,HN
2317639680,2317640703,AR
2317640704,2317649919,BR
-2317649920,2317649991,HN
-2317649992,2317649999,US
-2317650000,2317650943,HN
+2317649920,2317650943,HN
2317650944,2317651967,BR
2317651968,2317652991,PE
2317652992,2317654015,AR
@@ -57381,9 +59526,7 @@
2318598144,2318663679,CA
2318663680,2319122431,US
2319122432,2319123455,AR
-2319123456,2319123999,HN
-2319124000,2319124007,US
-2319124008,2319124479,HN
+2319123456,2319124479,HN
2319124480,2319125503,VE
2319125504,2319126527,UY
2319126528,2319127551,CR
@@ -57406,9 +59549,7 @@
2319165440,2319167487,AR
2319167488,2319168511,HN
2319169536,2319174655,BR
-2319174656,2319175647,HN
-2319175648,2319175663,BR
-2319175664,2319175679,HN
+2319174656,2319175679,HN
2319175680,2319184895,BR
2319184896,2319185919,AR
2319185920,2319187967,BR
@@ -57418,10 +59559,12 @@
2319450112,2319581183,US
2319581184,2319646719,IT
2319646720,2319728639,US
-2319728640,2319740927,DE
-2319740928,2319745023,US
-2319745024,2319757311,GB
-2319757312,2319843327,US
+2319728640,2319741951,DE
+2319741952,2319742975,US
+2319742976,2319743999,NL
+2319744000,2319745023,DE
+2319745024,2319761407,GB
+2319761408,2319843327,US
2319843328,2319908863,IT
2319908864,2319974399,AU
2319974400,2320039935,US
@@ -57445,13 +59588,7 @@
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
+2321446912,2321447935,HN
2321447936,2321452031,BR
2321452032,2321453055,MX
2321453056,2321454079,HN
@@ -57490,13 +59627,7 @@
2321743872,2321744895,SV
2321744896,2321745919,AR
2321745920,2321753087,BR
-2321753088,2321753359,HN
-2321753360,2321753375,NL
-2321753376,2321753599,HN
-2321753600,2321753607,NL
-2321753608,2321753927,HN
-2321753928,2321753935,NL
-2321753936,2321754111,HN
+2321753088,2321754111,HN
2321754112,2321755135,BR
2321755136,2321756159,UY
2321756160,2321769471,BR
@@ -57729,9 +59860,9 @@
2327472128,2327476223,BR
2327476224,2327477247,CL
2327477248,2327480319,BR
-2327480320,2327481055,HN
-2327481056,2327481071,US
-2327481072,2327481343,HN
+2327480320,2327481007,HN
+2327481008,2327481023,US
+2327481024,2327481343,HN
2327481344,2327482367,AR
2327482368,2327483391,BR
2327483392,2327485439,AR
@@ -57744,11 +59875,9 @@
2327494656,2327496703,BR
2327496704,2327497727,MX
2327497728,2327498751,BR
-2327498752,2327499055,HN
-2327499056,2327499063,CL
-2327499064,2327499655,HN
-2327499656,2327499663,CL
-2327499664,2327499775,HN
+2327498752,2327499343,HN
+2327499344,2327499351,CL
+2327499352,2327499775,HN
2327499776,2327501823,AR
2327501824,2327507967,BR
2327507968,2327508991,AR
@@ -57759,8 +59888,8 @@
2327969792,2328035327,AU
2328035328,2328100863,FR
2328100864,2328199167,US
-2328199168,2328207359,CA
-2328207360,2328231935,US
+2328199168,2328211455,CA
+2328211456,2328231935,US
2328231936,2328297471,GB
2328313856,2328317951,NL
2328342528,2328342783,DE
@@ -57846,7 +59975,9 @@
2330198016,2330263551,CH
2330263552,2330267647,US
2330267648,2330271743,CA
-2330271744,2330394623,US
+2330271744,2330288127,US
+2330288128,2330290175,CN
+2330290176,2330394623,US
2330394624,2330460159,FR
2330460160,2330525695,AT
2330525696,2330591231,SE
@@ -57865,7 +59996,7 @@
2331508736,2331574271,GB
2331574272,2331639807,FI
2331639808,2331770879,GB
-2331770880,2331836415,AU
+2331770880,2331836415,HK
2331836416,2331901951,GB
2331901952,2331967487,US
2331967488,2331980799,BR
@@ -57961,14 +60092,12 @@
2335768576,2335834111,CA
2335834112,2335899647,SE
2335899648,2335924223,IN
-2335924224,2335928319,SG
-2335928320,2335932415,IN
+2335924224,2335932415,SG
2335932416,2335940607,DE
2335940608,2335948799,GB
-2335948800,2335951266,SG
-2335951267,2335951267,GB
-2335951268,2335952895,SG
-2335952896,2335954943,DE
+2335948800,2335949823,SG
+2335949824,2335951871,GB
+2335951872,2335954943,DE
2335954944,2335965183,SG
2335965184,2335994879,US
2335994880,2335995903,CA
@@ -58022,7 +60151,9 @@
2340683776,2340749311,AU
2340749312,2340814847,GB
2340814848,2340880383,AU
-2340880384,2341273599,US
+2340880384,2341126143,US
+2341126144,2341134335,CY
+2341134336,2341273599,US
2341273600,2341339135,KW
2341339136,2341404671,CA
2341404672,2341470207,GB
@@ -58101,8 +60232,7 @@
2354053120,2354118655,CA
2354184192,2354249727,US
2354249728,2354315263,AU
-2354315264,2354380799,US
-2354380800,2354446335,NL
+2354315264,2354446335,US
2354446336,2354511871,FR
2354511872,2354839551,US
2354839552,2354905087,TW
@@ -58166,7 +60296,7 @@
2364407808,2364538879,US
2364538880,2364604415,CN
2364604416,2364671487,US
-2364671488,2364671743,MO
+2364671488,2364671743,HK
2364671744,2364675839,US
2364675840,2364676095,CA
2364676096,2364676863,US
@@ -58265,7 +60395,8 @@
2372225024,2372225791,US
2372225792,2372226303,NL
2372226304,2372226559,SG
-2372226560,2372227583,SE
+2372226560,2372227071,US
+2372227072,2372227583,SE
2372227584,2372228607,KR
2372228608,2372229119,US
2372229120,2372229375,FR
@@ -58407,7 +60538,11 @@
2378203648,2378210559,FI
2378210560,2378211071,NO
2378211072,2378235903,FI
-2378235904,2378301439,ES
+2378235904,2378239039,ES
+2378239040,2378239071,CA
+2378239072,2378239175,ES
+2378239176,2378239179,CA
+2378239180,2378301439,ES
2378301440,2378303231,FR
2378303488,2378366975,FR
2378366976,2378432511,US
@@ -58427,9 +60562,23 @@
2379284480,2380201983,US
2380201984,2380267519,KR
2380267520,2380398591,US
-2380398592,2380434431,IL
+2380398592,2380420095,IL
+2380420096,2380420863,GB
+2380420864,2380430847,IL
+2380430848,2380431103,GB
+2380431104,2380431615,IL
+2380431616,2380431871,US
+2380431872,2380432127,TH
+2380432128,2380432383,US
+2380432384,2380434431,IL
2380434432,2380435455,US
-2380435456,2380464127,IL
+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,2380465407,FR
@@ -58533,9 +60682,13 @@
2387476480,2387542015,CA
2387542016,2387607551,US
2387607552,2388328447,CA
-2388328448,2388350207,US
+2388328448,2388330495,US
+2388330496,2388332543,NL
+2388332544,2388350207,US
2388350208,2388350463,LK
-2388350464,2388393983,US
+2388350464,2388367359,US
+2388367360,2388369407,NL
+2388369408,2388393983,US
2388393984,2389245951,CA
2389245952,2389311487,US
2389311488,2389639167,CA
@@ -58578,7 +60731,8 @@
2392025088,2392063999,US
2392064000,2392096767,CA
2392096768,2392129535,US
-2392129536,2392489983,CA
+2392129536,2392457215,CA
+2392457216,2392489983,RO
2392489984,2392514559,US
2392514560,2394947583,CA
2394947584,2395013119,US
@@ -58595,9 +60749,7 @@
2398945280,2399010815,CA
2399010816,2399109119,US
2399109120,2399141887,PR
-2399141888,2399148031,BR
-2399148032,2399149055,DO
-2399149056,2399150079,BR
+2399141888,2399150079,BR
2399150080,2399151103,BQ
2399151104,2399158271,BR
2399158272,2399159295,AR
@@ -58617,7 +60769,9 @@
2399184896,2399185919,AR
2399185920,2399186943,TT
2399186944,2399202303,BR
-2399202304,2399203327,HN
+2399202304,2399202591,HN
+2399202592,2399202623,NL
+2399202624,2399203327,HN
2399203328,2399204351,CL
2399204352,2399205375,AR
2399205376,2399206399,PE
@@ -58688,33 +60842,7 @@
2408182784,2408183807,AR
2408183808,2408185855,BR
2408185856,2409562111,US
-2409562112,2409563135,GB
-2409563136,2409564159,US
-2409564160,2409565695,GB
-2409565696,2409566207,US
-2409566208,2409569791,GB
-2409569792,2409570047,US
-2409570048,2409570559,GB
-2409570560,2409570815,US
-2409570816,2409571327,GB
-2409571328,2409572351,US
-2409572352,2409576447,GB
-2409576448,2409576959,US
-2409576960,2409580543,GB
-2409580544,2409580799,US
-2409580800,2409581311,GB
-2409581312,2409581567,US
-2409581568,2409585151,GB
-2409585152,2409585407,US
-2409585408,2409585535,GB
-2409585536,2409586175,US
-2409586176,2409587199,GB
-2409587200,2409588735,US
-2409588736,2409616383,GB
-2409616384,2409616895,US
-2409616896,2409618175,GB
-2409618176,2409618431,US
-2409618432,2409627647,GB
+2409562112,2409627647,GB
2409627648,2409693183,ZA
2409693184,2409758719,AT
2409758720,2409824255,US
@@ -58852,7 +60980,7 @@
2416085760,2416086015,GB
2416086016,2416086271,SG
2416086272,2416087039,GB
-2416087040,2416091135,NL
+2416087040,2416091135,US
2416091136,2416093183,ES
2416093184,2416095231,NL
2416095232,2416111615,US
@@ -59024,7 +61152,7 @@
2419082240,2419083263,HK
2419083264,2419085311,IN
2419085312,2419086079,MM
-2419086080,2419086335,HK
+2419086080,2419086335,AU
2419086336,2419087359,BD
2419087360,2419088383,CN
2419088384,2419089407,KR
@@ -59034,8 +61162,7 @@
2419090432,2419091455,KR
2419091456,2419091711,US
2419091712,2419091967,SG
-2419091968,2419092223,US
-2419092224,2419092479,SG
+2419091968,2419092479,US
2419092480,2419094527,BD
2419094528,2419095551,AU
2419095552,2419096575,PK
@@ -59131,7 +61258,9 @@
2427536896,2427537151,US
2427537152,2427544575,NO
2427544832,2427584511,NO
-2427584512,2427650047,GB
+2427584512,2427625471,GB
+2427625472,2427633663,ES
+2427633664,2427650047,GB
2427650048,2427846655,NO
2427846656,2428183562,US
2428183564,2428567551,US
@@ -59178,12 +61307,17 @@
2432630784,2432696319,CN
2432696320,2433247231,NL
2433247232,2433247487,GB
-2433247488,2433646591,NL
+2433247488,2433630207,NL
+2433630208,2433638399,GB
+2433638400,2433646591,SE
2433646592,2433647615,DE
-2433647616,2433648639,US
+2433647616,2433648639,CA
2433648640,2433650687,DE
2433650688,2433654783,US
-2433654784,2433679359,DE
+2433654784,2433662975,IT
+2433662976,2433675263,DE
+2433675264,2433677311,PL
+2433677312,2433679359,AT
2433679360,2433810431,NL
2433810432,2433875967,GB
2433875968,2435055615,NL
@@ -59193,8 +61327,8 @@
2436366336,2436628479,NL
2436628480,2436630527,BE
2436630528,2436632575,NL
-2436632576,2436633599,DK
-2436633600,2436694015,BE
+2436632576,2436634623,DK
+2436634624,2436694015,BE
2436694016,2436759551,NL
2436759552,2436767743,GB
2436768000,2436775935,GB
@@ -59338,7 +61472,8 @@
2453864448,2453929983,CH
2453929984,2454061055,US
2454061056,2454126591,GB
-2454126592,2454150655,US
+2454126592,2454149631,US
+2454149632,2454150655,CA
2454150656,2454151167,AE
2454151168,2454192127,US
2454192128,2454257663,NO
@@ -59371,8 +61506,8 @@
2455175168,2455240703,GB
2455240704,2455244799,US
2455244800,2455244943,AU
-2455244944,2455244944,US
-2455244945,2455245055,AU
+2455244944,2455244945,US
+2455244946,2455245055,AU
2455245056,2455245311,US
2455245312,2455245567,AU
2455245568,2455245823,NL
@@ -59469,11 +61604,21 @@
2457379840,2457380095,CZ
2457380096,2457380863,RU
2457380864,2457381631,UA
-2457381632,2457382911,CZ
-2457382912,2457389055,RU
-2457389056,2457391103,CZ
-2457391104,2457393151,RU
-2457393152,2457396223,CZ
+2457381632,2457381887,CZ
+2457381888,2457382399,RU
+2457382400,2457382911,CZ
+2457382912,2457383935,RU
+2457383936,2457384959,UA
+2457384960,2457388031,RU
+2457388032,2457388543,CZ
+2457388544,2457388799,UA
+2457388800,2457390591,CZ
+2457390592,2457392127,RU
+2457392128,2457394431,CZ
+2457394432,2457394687,RU
+2457394688,2457394943,CZ
+2457394944,2457395455,RU
+2457395456,2457396223,CZ
2457396224,2457397247,DE
2457397248,2457403391,RU
2457403392,2457520895,US
@@ -59576,49 +61721,47 @@
2462350336,2462351359,CN
2462351360,2462384127,GM
2462384128,2462449663,US
-2462449664,2462460415,GB
-2462460416,2462460799,US
-2462460800,2462463487,GB
-2462463488,2462464895,US
-2462464896,2462465023,GB
-2462465024,2462465535,US
-2462465536,2462467583,GB
-2462467584,2462468351,US
-2462468352,2462469375,GB
-2462469376,2462471167,US
-2462471168,2462472447,GB
+2462449664,2462463999,GB
+2462464000,2462464767,US
+2462464768,2462467583,GB
+2462467584,2462468095,US
+2462468096,2462469631,GB
+2462469632,2462470143,US
+2462470144,2462472447,GB
2462472448,2462472703,US
2462472704,2462473471,GB
2462473472,2462473727,US
-2462473728,2462474239,GB
-2462474240,2462474751,US
-2462474752,2462475007,GB
-2462475008,2462475135,US
-2462475136,2462476031,GB
-2462476032,2462476287,US
-2462476288,2462477311,GB
+2462473728,2462477311,GB
2462477312,2462478335,US
-2462478336,2462479359,GB
-2462479360,2462479871,US
-2462479872,2462500351,GB
+2462478336,2462500351,GB
2462500352,2462500863,US
-2462500864,2462503167,GB
-2462503168,2462503679,US
-2462503680,2462503935,GB
-2462503936,2462504191,US
-2462504192,2462505471,GB
-2462505472,2462507519,US
-2462507520,2462507775,GB
-2462507776,2462508031,US
-2462508032,2462509823,GB
-2462509824,2462510079,US
-2462510080,2462510847,GB
-2462510848,2462511103,US
-2462511104,2462514175,GB
-2462514176,2462515199,US
-2462515200,2462526602,GB
+2462500864,2462506495,GB
+2462506496,2462507007,US
+2462507008,2462515199,GB
+2462515200,2462519295,US
+2462519296,2462520319,GB
+2462520320,2462521599,US
+2462521600,2462521855,GB
+2462521856,2462523391,US
+2462523392,2462526602,GB
2462526603,2462526603,US
-2462526604,2462580736,GB
+2462526604,2462531583,GB
+2462531584,2462533631,US
+2462533632,2462535167,GB
+2462535168,2462535679,US
+2462535680,2462539775,GB
+2462539776,2462540799,US
+2462540800,2462541055,GB
+2462541056,2462547967,US
+2462547968,2462556415,GB
+2462556416,2462559231,US
+2462559232,2462560255,GB
+2462560256,2462564351,US
+2462564352,2462572543,GB
+2462572544,2462574079,US
+2462574080,2462574591,GB
+2462574592,2462580735,US
+2462580736,2462580736,GB
2462580737,2462582015,US
2462582016,2462582271,GB
2462582272,2462583039,US
@@ -59655,7 +61798,9 @@
2462607104,2462607359,GB
2462607360,2462609919,US
2462609920,2462610175,GB
-2462610176,2462614527,US
+2462610176,2462610943,US
+2462610944,2462611199,GB
+2462611200,2462614527,US
2462614528,2462614783,GB
2462614784,2462615551,US
2462615552,2462615807,GB
@@ -59717,7 +61862,8 @@
2465671168,2465672703,IE
2465672704,2465672959,BG
2465672960,2465673215,IE
-2465673216,2465677311,GB
+2465673216,2465673471,IM
+2465673472,2465677311,GB
2465677312,2465679359,IT
2465679360,2465681407,NL
2465681408,2465683455,SE
@@ -59827,7 +61973,9 @@
2472083456,2472148991,GB
2472148992,2472214527,US
2472214528,2472280063,RS
-2472280064,2472312831,US
+2472280064,2472296447,US
+2472296448,2472300543,CA
+2472300544,2472312831,US
2472312832,2472345599,JP
2472345600,2472411135,BE
2472411136,2472476671,FR
@@ -59926,9 +62074,9 @@
2481586688,2481587199,GB
2481587200,2481848319,IL
2481848320,2482175999,US
-2482176000,2482208767,FI
+2482176000,2482208767,GB
2482208768,2482216959,US
-2482216960,2482225151,FI
+2482216960,2482225151,GB
2482225152,2482233343,SG
2482233344,2482241535,CN
2482241536,2482634751,US
@@ -59952,7 +62100,9 @@
2486928896,2486929151,CA
2486929152,2486929407,US
2486929408,2486929663,CA
-2486929664,2486946815,US
+2486929664,2486945535,US
+2486945536,2486945551,CA
+2486945552,2486946815,US
2486946816,2486947327,CA
2486947328,2486949887,US
2486949888,2486951423,CA
@@ -59964,7 +62114,9 @@
2486960128,2487025663,FR
2487025664,2487156735,US
2487156736,2487222271,PT
-2487222272,2487369727,US
+2487222272,2487363583,US
+2487363584,2487365631,CA
+2487365632,2487369727,US
2487369728,2487386111,PF
2487386112,2487394303,SG
2487394304,2487418879,US
@@ -59972,7 +62124,9 @@
2487549952,2487615487,PT
2487615488,2487681023,US
2487681024,2487746559,PT
-2487746560,2488205311,US
+2487746560,2488066047,US
+2488066048,2488074239,IL
+2488074240,2488205311,US
2488205312,2488270847,GB
2488270848,2488336383,US
2488336384,2488401919,PL
@@ -60052,13 +62206,9 @@
2496004096,2496069631,AT
2496069632,2496135167,US
2496135168,2496200703,NL
-2496200704,2497682431,MX
-2497682432,2497683455,EC
-2497683456,2498475007,MX
+2496200704,2498475007,MX
2498475008,2498476031,EC
-2498476032,2499110519,MX
-2499110520,2499110527,NI
-2499110528,2499477503,MX
+2498476032,2499477503,MX
2499477504,2499543039,DE
2499543040,2499545087,GB
2499545088,2499547135,IE
@@ -60095,9 +62245,15 @@
2500144896,2500145151,IE
2500145152,2500149247,US
2500149248,2500150271,GB
-2500150272,2500150655,US
+2500150272,2500150559,US
+2500150560,2500150591,GB
+2500150592,2500150655,US
2500150656,2500150719,GB
-2500150720,2500155647,US
+2500150720,2500154751,US
+2500154752,2500154815,GB
+2500154816,2500155199,US
+2500155200,2500155391,GB
+2500155392,2500155647,US
2500155648,2500155903,GB
2500155904,2500161023,US
2500161024,2500161535,GB
@@ -60105,16 +62261,18 @@
2500161792,2500162047,GB
2500162048,2500162559,US
2500162560,2500163071,GB
-2500163072,2500166207,US
-2500166208,2500166223,GB
-2500166224,2500170751,US
+2500163072,2500165631,US
+2500165632,2500169727,GB
+2500169728,2500170751,US
2500170752,2500170752,FI
2500170753,2500177935,US
2500177936,2500177943,PL
2500177944,2500180735,US
2500180736,2500180991,HR
2500180992,2500182015,US
-2500182016,2500188679,GB
+2500182016,2500188223,GB
+2500188224,2500188287,CH
+2500188288,2500188679,GB
2500188680,2500188687,CH
2500188688,2500190207,GB
2500190208,2500190975,US
@@ -60160,18 +62318,20 @@
2500238048,2500238055,FR
2500238056,2500239359,IT
2500239360,2500243455,FR
-2500243456,2500247551,US
+2500243456,2500245503,US
+2500245504,2500246015,GB
+2500246016,2500246271,US
+2500246272,2500246527,GB
+2500246528,2500247551,US
2500247552,2500255743,ES
2500255744,2500268031,US
2500268032,2500272127,ES
2500272128,2500273407,GB
-2500273408,2500275455,US
-2500275456,2500275711,GB
-2500275712,2500276223,US
-2500276224,2500276735,GB
+2500273408,2500275199,US
+2500275200,2500276735,GB
2500276736,2500276991,US
-2500276992,2500277055,GB
-2500277056,2500278751,US
+2500276992,2500277247,GB
+2500277248,2500278751,US
2500278752,2500279295,GB
2500279296,2500288511,US
2500288512,2500290815,FR
@@ -60195,9 +62355,9 @@
2500535374,2500535374,IE
2500535375,2500535399,US
2500535400,2500535407,IE
-2500535408,2500537687,US
-2500537688,2500537695,GB
-2500537696,2500542751,US
+2500535408,2500536319,US
+2500536320,2500538367,GB
+2500538368,2500542751,US
2500542752,2500542755,NL
2500542756,2500544767,US
2500544768,2500545023,GR
@@ -60207,9 +62367,9 @@
2500549272,2500549279,ES
2500549280,2500550143,US
2500550144,2500550655,UA
-2500550656,2500553759,US
-2500553760,2500553767,GB
-2500553768,2500554379,US
+2500550656,2500553727,US
+2500553728,2500554239,GB
+2500554240,2500554379,US
2500554380,2500554487,DE
2500554488,2500556295,US
2500556296,2500556303,CZ
@@ -60246,7 +62406,9 @@
2500665344,2500666111,US
2500666368,2500666463,US
2500666464,2500666471,LU
-2500666472,2500680447,US
+2500666472,2500674623,US
+2500674624,2500674687,DE
+2500674688,2500680447,US
2500680448,2500680703,SE
2500680704,2500681759,US
2500681760,2500681767,PL
@@ -60258,7 +62420,11 @@
2500687872,2500689919,FR
2500689920,2500694015,US
2500694016,2500697087,IT
-2500697088,2500719103,US
+2500697088,2500702463,US
+2500702464,2500702471,GB
+2500702472,2500702719,US
+2500702720,2500702975,NL
+2500702976,2500719103,US
2500719104,2500721151,IE
2500721152,2500723799,US
2500723800,2500723807,ES
@@ -60277,11 +62443,11 @@
2500746776,2500748543,US
2500748544,2500748799,ES
2500748800,2500755455,US
-2500755456,2500763647,GB
+2500755456,2500761631,GB
+2500761632,2500761639,FR
+2500761640,2500763647,GB
2500763648,2500984831,US
-2500984832,2500997119,GB
-2500997120,2500999167,US
-2500999168,2501033983,GB
+2500984832,2501033983,GB
2501033984,2501574655,US
2501574656,2501640191,KZ
2501640192,2502033407,US
@@ -60292,10 +62458,12 @@
2502047744,2502049791,ES
2502049792,2502098943,US
2502098944,2502164479,IT
-2502164480,2502165503,GB
-2502165504,2502173695,US
+2502164480,2502165759,GB
+2502165760,2502173695,US
2502173696,2502174207,DE
-2502174208,2502221823,US
+2502174208,2502180863,US
+2502180864,2502181119,FI
+2502181120,2502221823,US
2502221824,2502222591,ES
2502222592,2502222847,US
2502222848,2502223871,ES
@@ -60370,10 +62538,8 @@
2505469952,2505474047,NL
2505474048,2505482239,US
2505482240,2505484287,NL
-2505484288,2505487871,US
-2505487872,2505488127,FR
-2505488128,2505488383,US
-2505488384,2505490431,FR
+2505484288,2505486335,US
+2505486336,2505490431,FR
2505490432,2505498623,HR
2505498624,2505502719,US
2505502720,2505503743,UA
@@ -60414,7 +62580,11 @@
2506530816,2506555391,ES
2506555392,2507124735,US
2507124736,2507124991,IN
-2507124992,2508062719,US
+2507124992,2507145215,US
+2507173888,2507174143,US
+2507175936,2507177983,CA
+2507183360,2507183615,US
+2507210752,2508062719,US
2508062720,2508064767,CH
2508064768,2508066815,ES
2508066816,2508068863,RU
@@ -60479,7 +62649,7 @@
2509936640,2509937919,AT
2509937920,2509938175,IT
2509938176,2509938431,US
-2509938432,2509938687,AT
+2509938432,2509938687,DE
2509938688,2509942783,GB
2509942784,2509946879,UA
2509946880,2509963263,BE
@@ -60601,9 +62771,7 @@
2513102904,2513103895,FR
2513103896,2513103935,PT
2513103936,2513103967,IE
-2513103968,2513104819,FR
-2513104820,2513104823,PL
-2513104824,2513106239,FR
+2513103968,2513106239,FR
2513106240,2513106303,IE
2513106304,2513107079,FR
2513107080,2513107083,FI
@@ -60625,7 +62793,9 @@
2513764352,2514419711,DE
2514419712,2514485247,GB
2514485248,2514681599,DE
-2514681856,2515189759,DE
+2514681856,2515140607,DE
+2515140608,2515142655,US
+2515142656,2515189759,DE
2515189760,2515206143,US
2515206144,2515271679,GB
2515271680,2515599359,DE
@@ -60679,7 +62849,10 @@
2522813440,2522814463,TH
2522814464,2522815487,SG
2522815488,2522816511,TH
-2522816512,2523201535,JP
+2522816512,2522824703,JP
+2522824704,2522834943,SG
+2522834944,2522841087,VN
+2522841088,2523201535,JP
2523201536,2523267071,AU
2523267072,2523463679,US
2523463680,2523529215,CA
@@ -60778,7 +62951,9 @@
2525298688,2525626367,US
2525626368,2525757439,CN
2525757440,2525822975,GR
-2525822976,2526085119,US
+2525822976,2525954047,US
+2525954048,2526019583,GB
+2526019584,2526085119,US
2526085120,2526216191,IT
2526216192,2526412799,US
2526412800,2526478335,KR
@@ -60876,14 +63051,14 @@
2533294080,2533359615,CN
2533359616,2533375999,UA
2533376000,2533392383,HU
-2533392384,2534823255,IT
-2534823256,2534823263,SI
-2534823264,2538602495,IT
+2533392384,2538602495,IT
2538602496,2538604967,FR
2538604968,2538604975,ES
2538604976,2538605271,FR
2538605272,2538605279,ES
-2538605280,2538605471,FR
+2538605280,2538605375,FR
+2538605376,2538605379,GB
+2538605380,2538605471,FR
2538605472,2538605503,PT
2538605504,2538605903,FR
2538605904,2538605919,ES
@@ -60928,7 +63103,9 @@
2538633552,2538633567,IE
2538633568,2538634227,FR
2538634228,2538634231,DE
-2538634232,2538634559,FR
+2538634232,2538634331,FR
+2538634332,2538634335,DE
+2538634336,2538634559,FR
2538634560,2538634623,GB
2538634624,2538634879,FR
2538634880,2538635007,GB
@@ -60950,7 +63127,9 @@
2538646272,2538646399,BE
2538646400,2538646783,FR
2538646784,2538647039,CZ
-2538647040,2538648015,FR
+2538647040,2538647823,FR
+2538647824,2538647831,FI
+2538647832,2538648015,FR
2538648016,2538648031,ES
2538648032,2538648591,FR
2538648592,2538648623,BE
@@ -60986,14 +63165,16 @@
2538653932,2538653935,FR
2538653936,2538653939,GB
2538653940,2538655071,FR
-2538655072,2538655103,ES
+2538655072,2538655103,FI
2538655104,2538656959,FR
2538656960,2538656975,ES
2538656976,2538657135,FR
2538657136,2538657139,RO
2538657140,2538657439,FR
2538657440,2538657443,ES
-2538657444,2538657967,FR
+2538657444,2538657855,FR
+2538657856,2538657919,ES
+2538657920,2538657967,FR
2538657968,2538657983,IE
2538657984,2538658327,FR
2538658328,2538658331,IE
@@ -61064,42 +63245,19 @@
2548563968,2548826111,IR
2548826112,2548829695,AT
2548829696,2548829951,NL
-2548829952,2548829973,AT
-2548829974,2548829974,DE
-2548829975,2548830035,AT
-2548830036,2548830036,DE
-2548830037,2548830736,AT
-2548830737,2548830737,IT
-2548830738,2548830949,AT
-2548830950,2548830950,IT
-2548830951,2548830975,AT
+2548829952,2548830207,DE
+2548830208,2548830463,US
+2548830464,2548830719,DE
+2548830720,2548830975,IT
2548830976,2548831231,GB
-2548831232,2548831297,AT
-2548831298,2548831298,HK
-2548831299,2548831383,AT
-2548831384,2548831384,HK
-2548831385,2548831404,AT
-2548831405,2548831405,HK
-2548831406,2548831501,AT
-2548831502,2548831502,FR
-2548831503,2548831505,AT
-2548831506,2548831506,FR
-2548831507,2548831534,AT
-2548831535,2548831535,FR
-2548831536,2548831735,AT
-2548831736,2548831736,FR
-2548831737,2548831963,AT
-2548831964,2548831964,US
-2548831965,2548832017,AT
-2548832018,2548832018,ES
-2548832019,2548832049,AT
-2548832050,2548832050,ES
-2548832051,2548832628,AT
-2548832629,2548832629,PL
-2548832630,2548832767,AT
+2548831232,2548831487,HK
+2548831488,2548831743,FR
+2548831744,2548831999,US
+2548832000,2548832255,ES
+2548832256,2548832511,IS
+2548832512,2548832767,PL
2548832768,2548833279,CH
-2548833280,2548833535,AT
-2548833536,2548833791,NL
+2548833280,2548833791,NL
2548833792,2548834303,AT
2548834304,2548842495,GB
2548842496,2548848639,RU
@@ -61263,7 +63421,9 @@
2557673472,2557739007,DK
2557739008,2557870079,US
2557870080,2557935615,ID
-2557935616,2558918655,US
+2557935616,2558658499,US
+2558658500,2558658500,PR
+2558658501,2558918655,US
2558918656,2558984191,GB
2558984192,2559246335,US
2559246336,2559311871,CL
@@ -61330,7 +63490,8 @@
2572681216,2572746751,SE
2572746752,2572944127,US
2572944128,2572944383,LT
-2572944384,2572947455,US
+2572944384,2572945407,US
+2572945408,2572947455,ID
2572947456,2572950271,PL
2572950272,2572950527,ES
2572950528,2572951551,DE
@@ -61341,7 +63502,7 @@
2572954368,2572954623,HK
2572954624,2572954879,AU
2572954880,2572955391,HK
-2572955392,2572955647,BG
+2572955392,2572955647,DE
2572955648,2572959743,FR
2572959744,2572960255,DE
2572960256,2572960511,SE
@@ -61370,7 +63531,10 @@
2572986112,2572986367,IE
2572986368,2572986623,PL
2572986624,2572986879,PT
-2572986880,2572988415,DE
+2572986880,2572987391,DE
+2572987392,2572987647,NO
+2572987648,2572987903,LU
+2572987904,2572988415,DE
2572988416,2572989439,IT
2572989440,2572989695,GR
2572989696,2572989823,PL
@@ -61467,8 +63631,7 @@
2584744000,2584744191,ZA
2584744192,2584744447,NL
2584744448,2584744511,AU
-2584744512,2584744575,ZA
-2584744576,2584744703,DE
+2584744512,2584744703,DE
2584744704,2584744959,US
2584744960,2584745023,AU
2584745024,2584745215,ZA
@@ -61593,7 +63756,8 @@
2584763456,2584763903,ZA
2584763904,2584763967,HK
2584763968,2584763999,DE
-2584764000,2584764671,ZA
+2584764000,2584764415,ZA
+2584764416,2584764671,MA
2584764672,2584767231,US
2584767232,2584767487,TR
2584767488,2584768511,US
@@ -61601,8 +63765,9 @@
2584770560,2584773631,US
2584773632,2584773887,GB
2584773888,2584775423,US
-2584775424,2584775679,KE
-2584775680,2584779775,US
+2584775424,2584775679,ZA
+2584775680,2584776703,MA
+2584776704,2584779775,US
2584779776,2584780031,NL
2584780032,2584780287,US
2584780288,2584780543,ES
@@ -61611,7 +63776,7 @@
2584782336,2584789759,US
2584789760,2584790015,NL
2584790016,2584790783,US
-2584790784,2584791039,CN
+2584790784,2584791039,HK
2584791040,2584791295,US
2584791296,2584791551,FR
2584791552,2584796159,US
@@ -61715,11 +63880,7 @@
2586957312,2586968127,US
2586968128,2586968319,FR
2586968320,2587018239,US
-2587018240,2587018495,IE
-2587018496,2587018671,US
-2587018672,2587018687,IE
-2587018688,2587019263,US
-2587019264,2587020799,IE
+2587018240,2587020799,IE
2587020800,2587021823,US
2587021824,2587022847,IE
2587022848,2587050239,US
@@ -61762,10 +63923,10 @@
2587481970,2587481970,LB
2587481971,2587484159,US
2587484160,2587492351,GB
-2587492352,2587496447,ES
-2587496448,2587498495,US
-2587498496,2587498751,ES
-2587498752,2587504639,US
+2587492352,2587497471,ES
+2587497472,2587498495,US
+2587498496,2587499007,ES
+2587499008,2587504639,US
2587504640,2587508735,ES
2587508736,2587525119,GB
2587525120,2587541503,US
@@ -61778,7 +63939,9 @@
2587594256,2587594751,GB
2587594752,2587596799,US
2587596800,2587598847,GB
-2587598848,2587623423,US
+2587598848,2587607295,US
+2587607296,2587607551,DE
+2587607552,2587623423,US
2587623424,2587631615,BG
2587631616,2587631871,US
2587631872,2587632127,ES
@@ -61786,11 +63949,13 @@
2587639808,2587640063,GB
2587640064,2587648511,US
2587648512,2587649023,ES
-2587649024,2587674623,US
+2587649024,2587650815,US
+2587650816,2587651071,ES
+2587651072,2587674623,US
2587674624,2587676671,IT
-2587676672,2587681279,US
-2587681280,2587682815,ES
-2587682816,2587697151,US
+2587676672,2587680767,US
+2587680768,2587683839,ES
+2587683840,2587697151,US
2587697152,2587697407,GB
2587697408,2587698175,US
2587698176,2587699199,GB
@@ -61801,10 +63966,8 @@
2587714560,2587926527,US
2587926528,2587930623,BG
2587930624,2587938815,US
-2587938816,2587939839,PR
-2587939840,2587940607,US
-2587940608,2587940863,PR
-2587940864,2587951103,US
+2587938816,2587942911,PR
+2587942912,2587951103,US
2587951104,2587952127,ZA
2587952128,2587953151,NG
2587953152,2587954175,MU
@@ -61983,7 +64146,7 @@
2591555584,2591571967,GH
2591571968,2591588351,NG
2591588352,2591604735,MG
-2591604736,2591605759,MU
+2591604736,2591605759,ZA
2591605760,2591606783,KE
2591606784,2591610879,MU
2591610880,2591612927,ZM
@@ -61994,9 +64157,7 @@
2591948800,2591981567,MG
2591981568,2591997951,CM
2591997952,2592006143,ZA
-2592006144,2592007167,TZ
-2592007168,2592009215,ZA
-2592009216,2592022527,TZ
+2592006144,2592022527,TZ
2592022528,2592026623,BJ
2592026624,2592026879,US
2592026880,2592027391,ZA
@@ -62017,12 +64178,15 @@
2592043008,2592047103,ZA
2592047104,2592079871,AO
2592079872,2593128447,EG
+2593128448,2593652735,MA
2593652736,2594177023,KE
-2596274176,2596339711,SC
-2596339712,2597322751,ZA
+2594177024,2595225599,GH
+2595225600,2596274175,EG
+2596274176,2597322751,ZA
2597322752,2598371327,US
2598371328,2598895615,UG
2598895616,2599157759,CI
+2599157760,2599419903,EG
2599419904,2600468479,DZ
2600468480,2600534015,ZM
2600534016,2600665087,US
@@ -62293,7 +64457,9 @@
2618028544,2618029055,GB
2618029056,2618032127,CA
2618032128,2618097663,US
-2618097664,2618163199,NZ
+2618097664,2618115583,NZ
+2618115584,2618116095,SG
+2618116096,2618163199,NZ
2618163200,2618228735,IT
2618228736,2618294271,US
2618359808,2618425343,PL
@@ -62312,6 +64478,7 @@
2619539456,2619604991,ES
2619604992,2619735295,US
2619735552,2619736063,US
+2619768832,2619801599,ZA
2619801600,2620063743,US
2620063744,2620129279,GB
2620129280,2620194815,CA
@@ -62537,13 +64704,12 @@
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,2633236479,ZA
-2633236480,2633302015,SC
-2633302016,2634022911,ZA
+2632974336,2634022911,ZA
2634022912,2634088447,CN
2634088448,2635202559,JP
2635202560,2635268095,CN
@@ -62571,12 +64737,11 @@
2637629024,2637629311,IE
2637629312,2637629375,US
2637629376,2637629439,IE
-2637629440,2637629503,US
-2637629504,2637629567,NL
+2637629440,2637629567,NL
2637629568,2637629583,US
2637629584,2637629599,NL
2637629600,2637629631,IE
-2637629632,2637629663,US
+2637629632,2637629663,NL
2637629664,2637629807,IE
2637629808,2637629823,US
2637629824,2637629951,IE
@@ -62584,7 +64749,9 @@
2637630112,2637630119,IE
2637630120,2637630127,US
2637630128,2637630143,IE
-2637630144,2637630479,US
+2637630144,2637630207,US
+2637630208,2637630335,NL
+2637630336,2637630479,US
2637630480,2637630495,IE
2637630496,2637630655,US
2637630656,2637630783,IE
@@ -62602,9 +64769,7 @@
2637638672,2637638815,IE
2637638816,2637638879,US
2637638880,2637638911,IE
-2637638912,2637639167,US
-2637639168,2637639199,IE
-2637639200,2637639359,US
+2637638912,2637639359,US
2637639360,2637639423,IE
2637639424,2637639551,US
2637639552,2637639679,IE
@@ -62634,13 +64799,13 @@
2637686512,2637686527,IE
2637686528,2637686655,US
2637686656,2637686783,IE
-2637686784,2637686847,US
-2637686848,2637686975,IE
+2637686784,2637686855,US
+2637686856,2637686975,IE
2637686976,2637687215,US
2637687216,2637687615,IE
2637687616,2637687679,US
-2637687680,2637688447,IE
-2637688448,2637688479,US
+2637687680,2637688319,IE
+2637688320,2637688479,US
2637688480,2637688831,IE
2637688832,2637722143,US
2637722144,2637722175,IE
@@ -62657,17 +64822,19 @@
2637746176,2637746183,FI
2637746184,2637746191,IE
2637746192,2637746199,NL
-2637746200,2637746223,US
+2637746200,2637746207,FI
+2637746208,2637746215,IE
+2637746216,2637746223,US
2637746224,2637746231,AT
-2637746232,2637746687,US
+2637746232,2637746247,US
+2637746248,2637746255,FI
+2637746256,2637746687,US
2637746688,2637746695,KR
2637746696,2637746743,US
2637746744,2637746751,HK
2637746752,2637746759,SG
-2637746760,2637756687,US
-2637756688,2637756703,NL
-2637756704,2637757423,US
-2637757424,2637757439,NL
+2637746760,2637756415,US
+2637756416,2637757439,NL
2637757440,2637758463,IE
2637758464,2637997055,US
2637997056,2637997311,AU
@@ -62704,9 +64871,10 @@
2640408576,2640410623,NL
2640410624,2640411135,US
2640411136,2640411391,MX
-2640411392,2640411647,NL
-2640411648,2640412671,US
-2640412672,2640423935,NL
+2640411392,2640412671,US
+2640412672,2640417023,NL
+2640417024,2640417279,CA
+2640417280,2640423935,NL
2640423936,2640429055,ES
2640429056,2640445439,NL
2640445440,2640510975,US
@@ -62919,7 +65087,9 @@
2650603520,2650669055,CO
2650669056,2650734591,US
2650734592,2650800127,CN
-2650800128,2652528639,US
+2650800128,2652512255,US
+2652512256,2652520447,CA
+2652520448,2652528639,US
2652528640,2652528895,AR
2652528896,2652537607,US
2652537616,2652541183,US
@@ -63106,7 +65276,8 @@
2666070016,2666135551,SE
2666135552,2666201087,GB
2666201088,2667053055,US
-2667053056,2667118591,NO
+2667053056,2667085823,NO
+2667085824,2667118591,DK
2667118592,2667184127,HU
2667184128,2667249663,RU
2667249664,2667315199,CL
@@ -63124,7 +65295,9 @@
2667534336,2667536383,PL
2667536384,2667536575,AT
2667536576,2667536583,FR
-2667536584,2667537087,AT
+2667536584,2667536615,AT
+2667536616,2667536623,FR
+2667536624,2667537087,AT
2667537088,2667537119,FR
2667537120,2667537151,AT
2667537152,2667537215,FR
@@ -63150,17 +65323,15 @@
2667565431,2667566335,AT
2667566336,2667566591,US
2667566592,2667566847,DE
-2667566848,2667566925,AT
-2667566926,2667566926,FR
-2667566927,2667567103,AT
+2667566848,2667567103,FR
2667567104,2667569151,SE
2667569152,2667571199,GB
2667571200,2667573247,ES
2667573248,2667575295,IT
2667575296,2667577343,SK
2667577344,2667642879,SA
-2667642880,2667708415,US
-2667708416,2667773951,CA
+2667642880,2667712511,US
+2667712512,2667773951,CA
2667773952,2667970559,US
2667970560,2668036095,CA
2668036096,2668101631,SE
@@ -63285,10 +65456,12 @@
2675245056,2675255295,NZ
2675255296,2675257343,PH
2675257344,2675261439,US
-2675261440,2675269631,NZ
+2675261440,2675269631,TW
2675269632,2675271679,PH
2675271680,2675279871,NZ
-2675279872,2675281919,MY
+2675279872,2675280383,MY
+2675280384,2675280895,TH
+2675280896,2675281919,ID
2675281920,2675286015,NZ
2675286016,2675294207,US
2675294208,2675296255,NL
@@ -63301,14 +65474,16 @@
2675574240,2675574271,IT
2675574272,2675574895,US
2675574896,2675574903,NL
-2675574904,2675576703,US
+2675574904,2675575951,US
+2675575952,2675575953,SA
+2675575954,2675576703,US
2675576704,2675576711,JO
2675576712,2675589119,US
2675589120,2675605503,DE
2675605504,2675605791,US
-2675605792,2675605799,CZ
+2675605792,2675605799,IT
2675605800,2675605807,US
-2675605808,2675605811,CZ
+2675605808,2675605811,IT
2675605812,2675605951,US
2675605952,2675605961,CZ
2675605962,2675605962,DE
@@ -63317,9 +65492,13 @@
2675605965,2675605967,CZ
2675605968,2675606271,US
2675606272,2675606527,IT
-2675606528,2675606975,US
+2675606528,2675606571,US
+2675606572,2675606575,IT
+2675606576,2675606975,US
2675606976,2675607039,IT
-2675607040,2675608751,US
+2675607040,2675608735,US
+2675608736,2675608739,IT
+2675608740,2675608751,US
2675608752,2675608767,HK
2675608768,2675608983,US
2675608984,2675608991,AU
@@ -63339,9 +65518,9 @@
2675613464,2675613471,IL
2675613472,2675613599,US
2675613600,2675613631,JP
-2675613632,2675614687,US
-2675614688,2675614719,NL
-2675614720,2675624399,US
+2675613632,2675614975,US
+2675614976,2675614991,NL
+2675614992,2675624399,US
2675624400,2675624415,CN
2675624416,2675626239,US
2675626240,2675626271,GB
@@ -63380,9 +65559,13 @@
2677622784,2677623039,IE
2677623040,2677635071,US
2677635072,2677636095,CN
-2677636096,2677642239,US
+2677636096,2677639167,US
+2677639168,2677639679,CA
+2677639680,2677641215,US
+2677641216,2677641471,CA
+2677641472,2677642239,US
2677642240,2677642495,ES
-2677642496,2677642751,US
+2677642496,2677642751,CA
2677642752,2677643007,SE
2677643008,2677644347,US
2677644348,2677644348,GB
@@ -63636,6 +65819,9 @@
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
@@ -63645,18 +65831,42 @@
2684944384,2685009919,GB
2685009920,2685075455,US
2685075456,2685599743,JP
-2685599744,2685607935,US
-2685612032,2685613055,MO
+2685599744,2685603839,US
+2685604864,2685605887,PK
+2685605888,2685607935,US
+2685608960,2685609983,ZA
+2685611008,2685612031,BR
+2685612032,2685613055,CN
2685613056,2685614079,TW
+2685616128,2685617151,ID
+2685626368,2685627391,US
2685628416,2685632511,ZA
+2685640704,2685641727,US
+2685642752,2685644799,BR
+2685649920,2685650943,ZA
2685652992,2685656063,CN
2685656064,2685657087,IN
+2685657088,2685658111,ID
+2685661184,2685665279,BR
2685665280,2685668351,IN
2685668352,2685669375,SG
+2685670400,2685671423,BR
+2685673472,2685674495,BR
2685675520,2685676543,PH
2685676544,2685677567,JP
2685677568,2685678591,CN
2685678592,2685681663,HK
+2685681664,2685683711,BR
+2685683712,2685684735,BD
+2685685760,2685689855,BR
+2685706240,2685707263,BR
+2685707264,2685708287,EC
+2685708288,2685709311,BR
+2685709312,2685710335,CL
+2685710336,2685712383,BR
+2685713408,2685714431,CL
+2685714432,2685718527,BR
+2685718528,2685719551,US
2685724672,2685726719,CA
2685730816,2685796351,JP
2685861888,2686320639,JP
@@ -63675,7 +65885,8 @@
2688221184,2688286719,CH
2688286720,2688352255,DE
2688352256,2688418825,CH
-2688418827,2688420351,CH
+2688418827,2688420095,CH
+2688420096,2688420351,US
2688420352,2688420607,CN
2688420608,2688420863,CH
2688420864,2688421119,AU
@@ -63691,6 +65902,7 @@
2689204224,2689269759,JP
2689269760,2689335295,TR
2689335296,2689400831,US
+2689400832,2689466367,MA
2689466368,2689531903,IT
2689531904,2689535999,US
2689536000,2689536511,GB
@@ -63728,7 +65940,9 @@
2689835520,2689835775,AU
2689835776,2689925119,US
2689925120,2689990655,CH
-2689990656,2690383871,US
+2689990656,2690187263,US
+2690187264,2690318335,MA
+2690318336,2690383871,US
2690383872,2690449407,FR
2690449408,2690646015,US
2690646016,2690711551,SG
@@ -63739,10 +65953,26 @@
2690973696,2691104767,US
2691104768,2691170303,FR
2691170304,2691235839,GB
+2691235840,2691301375,MA
2691301376,2691366911,CA
2691366912,2691760127,US
2691825664,2691891199,HU
-2691891200,2692218879,ZA
+2691891200,2691956735,SA
+2691956736,2692153343,ZA
+2692169728,2692173823,SC
+2692173824,2692175871,ZA
+2692177920,2692178943,ZA
+2692180992,2692182015,GH
+2692182016,2692184063,MZ
+2692184064,2692185087,ZA
+2692185088,2692186111,NG
+2692194304,2692202495,GA
+2692205568,2692206591,GH
+2692206592,2692207615,SZ
+2692209664,2692214783,ZA
+2692214784,2692215807,AO
+2692215808,2692216319,KE
+2692216832,2692218879,ZA
2692218880,2692284415,CI
2692284416,2692546559,ZA
2692546560,2694316031,US
@@ -63810,13 +66040,19 @@
2699362304,2699624447,US
2699624448,2699689983,JP
2699755520,2699821055,JP
-2699886592,2699968511,JP
+2699886592,2699955199,JP
+2699955200,2699956223,TH
+2699956224,2699957247,BD
+2699957248,2699957503,JP
+2699959808,2699960063,JP
+2699960320,2699968511,JP
2699968512,2699969535,CN
2699969536,2699972607,IN
2699972608,2699973631,NZ
2699973632,2699974655,HK
2699974656,2699976703,IN
2699977728,2699977983,JP
+2699978752,2699980799,BR
2700017664,2700214271,JP
2700214272,2700247039,NA
2700247040,2700263423,UG
@@ -63824,19 +66060,11 @@
2700279808,2700935167,JP
2700935168,2701066239,US
2701066240,2701131775,BG
-2701131776,2701131807,HN
-2701131808,2701131823,CA
-2701131824,2701132159,HN
-2701132160,2701132175,CR
-2701132176,2701132543,HN
-2701132544,2701132559,CR
-2701132560,2701134447,HN
-2701134448,2701134463,US
-2701134464,2701136047,HN
-2701136048,2701136055,US
-2701136056,2701139135,HN
-2701139136,2701139151,UY
-2701139152,2701139967,HN
+2701131776,2701132391,HN
+2701132392,2701132399,CR
+2701132400,2701137903,HN
+2701137904,2701137911,BR
+2701137912,2701139967,HN
2701139968,2701148159,NI
2701148160,2701149183,AR
2701149184,2701150207,HN
@@ -63874,8 +66102,7 @@
2702573568,2702581759,AR
2702581760,2702583807,VE
2702583808,2702585855,MX
-2702585856,2702586367,PA
-2702586368,2702587903,CW
+2702585856,2702587903,CW
2702587904,2702589951,BR
2702589952,2702606335,GF
2702606336,2702639103,BO
@@ -63903,7 +66130,11 @@
2704277504,2704343039,FR
2704343040,2704408575,US
2704408576,2704474111,AU
-2704474112,2704478207,US
+2704474112,2704476159,US
+2704476160,2704476415,GB
+2704476416,2704476927,US
+2704476928,2704477183,GB
+2704477184,2704478207,US
2704478208,2704478463,SG
2704478464,2704485119,US
2704485120,2704485375,AU
@@ -63964,17 +66195,120 @@
2708865024,2708930559,JP
2708930560,2709127167,US
2709127168,2709192703,KR
-2709192704,2709225471,ZA
+2709192704,2709192959,US
+2709192960,2709193983,ZA
+2709193984,2709194239,US
+2709194240,2709194495,ZA
+2709194496,2709195007,US
+2709195008,2709195263,ZA
+2709195264,2709196031,US
+2709196032,2709198335,ZA
+2709198336,2709198847,US
+2709198848,2709199103,ZA
+2709199104,2709199359,US
+2709199360,2709200383,ZA
+2709200384,2709200639,US
+2709200640,2709200895,ZA
+2709200896,2709201407,US
+2709201408,2709202175,ZA
+2709202176,2709202943,US
+2709202944,2709203711,ZA
+2709203712,2709203967,US
+2709203968,2709204991,ZA
+2709204992,2709205247,US
+2709205248,2709205759,ZA
+2709205760,2709206271,US
+2709206272,2709207039,ZA
+2709207040,2709207295,US
+2709207296,2709207551,ZA
+2709207552,2709207807,US
+2709207808,2709208063,ZA
+2709208064,2709208319,US
+2709208320,2709208575,ZA
+2709208576,2709208831,US
+2709208832,2709209343,ZA
+2709209344,2709209599,US
+2709209600,2709210367,ZA
+2709210368,2709211135,US
+2709211136,2709211903,ZA
+2709211904,2709212159,US
+2709212160,2709212415,ZA
+2709212416,2709212927,US
+2709212928,2709213183,ZA
+2709213184,2709213439,US
+2709213440,2709213951,ZA
+2709213952,2709214719,US
+2709214720,2709214975,ZA
+2709214976,2709215999,US
+2709216000,2709216255,ZA
+2709216256,2709216511,US
+2709216512,2709216767,ZA
+2709216768,2709217023,US
+2709217024,2709217791,ZA
+2709217792,2709218559,US
+2709218560,2709219071,ZA
+2709219072,2709219327,US
+2709219328,2709219839,ZA
+2709219840,2709220095,US
+2709220096,2709221119,ZA
+2709221120,2709221375,US
+2709221376,2709221887,ZA
+2709221888,2709222399,US
+2709222400,2709222655,ZA
+2709222656,2709222911,US
+2709222912,2709223423,ZA
+2709223424,2709224703,US
+2709224704,2709224959,ZA
+2709224960,2709225471,US
2709225472,2709225727,ES
2709225728,2709225983,ZA
2709225984,2709226239,ES
-2709226240,2709242111,ZA
+2709226240,2709226495,ZA
+2709226496,2709226511,DE
+2709226512,2709227775,ZA
+2709227776,2709228031,US
+2709228032,2709228287,ZA
+2709228288,2709228543,US
+2709228544,2709228767,ZA
+2709228768,2709228783,DE
+2709228784,2709229695,ZA
+2709229696,2709229711,DE
+2709229712,2709230799,ZA
+2709230800,2709230815,DE
+2709230816,2709230879,ZA
+2709230880,2709230895,DE
+2709230896,2709231103,ZA
+2709231104,2709231119,DE
+2709231120,2709232127,ZA
+2709232128,2709232383,DE
+2709232384,2709232639,ZA
+2709232640,2709232895,DE
+2709232896,2709233151,US
+2709233152,2709233407,DE
+2709233408,2709235199,ZA
+2709235200,2709235455,DE
+2709235456,2709235711,US
+2709235712,2709235967,DE
+2709235968,2709236223,US
+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,US
+2709241344,2709241599,DE
+2709241600,2709241855,ZA
+2709241856,2709242111,DE
2709242112,2709242367,US
2709242368,2709242623,ZA
2709242624,2709242879,US
-2709242880,2709243135,ZA
+2709242880,2709243135,DE
2709243136,2709243391,US
-2709243392,2709243647,ZA
+2709243392,2709243647,DE
2709243648,2709243903,US
2709243904,2709244159,ZA
2709244160,2709244415,US
@@ -63982,17 +66316,42 @@
2709244672,2709244927,US
2709244928,2709245183,ZA
2709245184,2709245439,US
-2709245440,2709245695,ZA
+2709245440,2709245695,DE
2709245696,2709245951,US
2709245952,2709246207,ZA
2709246208,2709246463,US
-2709246464,2709247231,ZA
+2709246464,2709246735,ZA
+2709246736,2709246751,HK
+2709246752,2709246847,ZA
+2709246848,2709246863,HK
+2709246864,2709246959,ZA
+2709246960,2709246975,HK
+2709246976,2709247231,ZA
2709247232,2709247487,MY
-2709247488,2709247743,ZA
+2709247488,2709247743,DE
2709247744,2709247999,US
2709248000,2709248255,ZA
2709248256,2709248511,US
-2709248512,2709258239,ZA
+2709248512,2709249535,ZA
+2709249536,2709249791,DE
+2709249792,2709250047,ZA
+2709250048,2709250303,DE
+2709250304,2709251071,ZA
+2709251072,2709251327,DE
+2709251328,2709251839,ZA
+2709251840,2709252095,GB
+2709252096,2709252351,DE
+2709252352,2709253375,ZA
+2709253376,2709253631,US
+2709253632,2709254399,ZA
+2709254400,2709254655,US
+2709254656,2709255935,ZA
+2709255936,2709256191,US
+2709256192,2709256703,ZA
+2709256704,2709256959,DE
+2709256960,2709257471,ZA
+2709257472,2709257727,US
+2709257728,2709258239,ZA
2709258240,2709389311,US
2709389312,2709454847,SG
2709454848,2709716991,US
@@ -64028,9 +66387,7 @@
2714238976,2714304511,TH
2714304512,2714370263,US
2714370264,2714370271,SG
-2714370272,2714370799,US
-2714370800,2714370815,PH
-2714370816,2714370895,US
+2714370272,2714370895,US
2714370896,2714370911,CN
2714370912,2714371679,US
2714371680,2714371711,CA
@@ -64044,7 +66401,9 @@
2714373280,2714373287,NL
2714373288,2714373743,US
2714373744,2714373759,IN
-2714373760,2714376223,US
+2714373760,2714375039,US
+2714375040,2714375055,ID
+2714375056,2714376223,US
2714376224,2714376239,JP
2714376240,2714377103,US
2714377104,2714377119,IN
@@ -64054,7 +66413,11 @@
2714378464,2714378495,HK
2714378496,2714379103,US
2714379104,2714379135,HK
-2714379136,2714381951,US
+2714379136,2714380031,US
+2714380032,2714380287,HK
+2714380288,2714381311,US
+2714381312,2714381567,HK
+2714381568,2714381951,US
2714381952,2714381983,HK
2714381984,2714382530,US
2714382531,2714382531,HK
@@ -64066,15 +66429,15 @@
2714403997,2714403997,JP
2714403998,2714404789,US
2714404790,2714404790,JP
-2714404791,2714405071,US
-2714405072,2714405087,JP
-2714405088,2714405151,US
+2714404791,2714405151,US
2714405152,2714405167,JP
2714405168,2714405311,US
2714405312,2714405327,CA
2714405328,2714405727,US
2714405728,2714405759,JP
-2714405760,2714407113,US
+2714405760,2714405829,US
+2714405830,2714405831,JP
+2714405832,2714407113,US
2714407114,2714407114,JP
2714407115,2714407160,US
2714407161,2714407161,JP
@@ -64084,15 +66447,11 @@
2714408704,2714408719,JP
2714408720,2714408959,US
2714408960,2714408991,JP
-2714408992,2714412655,US
-2714412656,2714412671,VN
-2714412672,2714413343,US
+2714408992,2714413343,US
2714413344,2714413359,PH
2714413360,2714417215,US
2714417216,2714417247,JP
-2714417248,2714419079,US
-2714419080,2714419087,MU
-2714419088,2714419743,US
+2714417248,2714419743,US
2714419744,2714419775,SG
2714419776,2714419871,US
2714419872,2714419903,SG
@@ -64106,9 +66465,21 @@
2714422880,2714422911,SG
2714422912,2714428767,US
2714428768,2714428783,JP
-2714428784,2714433295,US
+2714428784,2714429532,US
+2714429533,2714429533,JP
+2714429534,2714430301,US
+2714430302,2714430303,JP
+2714430304,2714432775,US
+2714432776,2714432783,JP
+2714432784,2714433295,US
2714433296,2714433311,JP
-2714433312,2714697727,US
+2714433312,2714433535,US
+2714433536,2714433791,JP
+2714433792,2714434911,US
+2714434912,2714434927,JP
+2714434928,2714435055,US
+2714435056,2714435071,JP
+2714435072,2714697727,US
2714697728,2714763263,CN
2714763264,2715025407,US
2715025408,2715090943,VE
@@ -64125,15 +66496,24 @@
2716729344,2716794879,CL
2716794880,2717253631,US
2717253632,2717319167,TH
-2717319168,2717646847,US
+2717319168,2717384703,US
+2717450240,2717581311,US
+2717581312,2717646847,RO
2717646848,2717712383,KW
2717712384,2717843455,US
2717843456,2717908991,VE
2717908992,2717974527,CA
2717974528,2718629887,US
2718629888,2718695423,GB
-2718695424,2718752767,US
-2718755840,2718756863,US
+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
@@ -64235,8 +66615,7 @@
2728288256,2728289279,AE
2728289280,2728290303,PL
2728290304,2728291327,US
-2728291328,2728291839,NL
-2728291840,2728292351,US
+2728291328,2728292351,NL
2728292352,2728293375,DE
2728293376,2728294399,JP
2728294400,2728295423,US
@@ -64251,8 +66630,8 @@
2728304640,2728306687,SG
2728306688,2728308735,US
2728308736,2728309759,HK
-2728309760,2728310783,SE
-2728310784,2728311807,US
+2728309760,2728310015,RU
+2728310016,2728311807,US
2728311808,2728312831,KR
2728312832,2728313087,FR
2728313088,2728313855,US
@@ -64294,27 +66673,23 @@
2731682816,2731685887,US
2731685888,2731686911,CA
2731686912,2731688959,US
-2731688960,2731689983,VG
-2731689984,2731711487,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,2731761663,US
+2731729920,2731739647,US
+2731739648,2731740159,CA
+2731740160,2731761663,US
2731761664,2731763711,CA
2731763712,2731765759,US
2731765760,2731767807,CA
2731767808,2731768079,US
2731768080,2731768083,CA
-2731768084,2731768183,US
-2731768184,2731768191,CA
-2731768192,2731768383,US
-2731768384,2731768391,CA
-2731768392,2731769391,US
-2731769392,2731769399,CA
-2731769400,2731769471,US
+2731768084,2731769471,US
2731769472,2731769475,CA
2731769476,2731771903,US
2731771904,2731772927,KY
@@ -64349,7 +66724,8 @@
2731843584,2731845631,PR
2731845632,2731853823,US
2731853824,2731855871,CA
-2731855872,2731856895,VC
+2731855872,2731856383,LC
+2731856384,2731856895,VC
2731856896,2731862015,US
2731862016,2731864063,CA
2731864064,2731870207,US
@@ -64373,11 +66749,17 @@
2732107776,2732109823,US
2732110848,2732111871,US
2732111872,2732113919,CA
-2732113920,2732131327,US
+2732113920,2732126207,US
+2732127232,2732128767,US
+2732128768,2732129023,NL
+2732129024,2732131327,US
2732131328,2732132351,CA
-2732132352,2732189695,US
+2732132352,2732145151,US
+2732145664,2732146687,CA
+2732146688,2732189695,US
2732189696,2732192767,CA
-2732192768,2732201983,US
+2732192768,2732194559,US
+2732194816,2732201983,US
2732201984,2732203007,VG
2732203008,2732204031,US
2732204032,2732206079,CA
@@ -64402,7 +66784,8 @@
2732321024,2732321279,BM
2732321280,2732321535,CA
2732321536,2732321791,GB
-2732321792,2732322815,CA
+2732321792,2732322047,US
+2732322048,2732322815,CA
2732322816,2732336127,US
2732336128,2732337151,CA
2732337152,2732349439,US
@@ -64417,7 +66800,7 @@
2732375040,2732376063,CA
2732376064,2732379135,US
2732379136,2732380159,CA
-2732380160,2732389631,US
+2732380160,2732389375,US
2732389888,2732390143,IT
2732390144,2732390399,US
2732390400,2732391423,CA
@@ -64458,9 +66841,7 @@
2732549120,2732550143,CA
2732550144,2732580863,US
2732580864,2732582911,CA
-2732582912,2733882879,US
-2733882880,2733883135,CA
-2733883136,2733903871,US
+2732582912,2733903871,US
2733903872,2733904895,PR
2733904896,2733907967,CA
2733907968,2733911039,US
@@ -64493,7 +66874,9 @@
2733953024,2733954047,CA
2733954048,2733958143,US
2733958144,2733959167,CA
-2733959168,2733963263,US
+2733959168,2733960191,US
+2733960192,2733961215,CA
+2733961216,2733963263,US
2733963264,2733964287,CA
2733964288,2733979647,US
2733979648,2733980671,CA
@@ -64530,8 +66913,7 @@
2734105600,2734106623,CA
2734106624,2734119935,US
2734119936,2734120959,CA
-2734120960,2734123007,VG
-2734123008,2734125055,US
+2734120960,2734125055,US
2734125056,2734129151,CA
2734129152,2734139391,US
2734139392,2734140415,CA
@@ -64555,7 +66937,10 @@
2734206976,2734209023,CA
2734209024,2734218239,US
2734218240,2734218751,CA
-2734218752,2734229503,US
+2734218752,2734219263,US
+2734221312,2734224415,US
+2734224416,2734224431,GB
+2734224432,2734229503,US
2734229504,2734230527,CA
2734230528,2734237695,US
2734237696,2734238719,CA
@@ -64571,9 +66956,7 @@
2734296064,2734297087,CA
2734297088,2734304255,US
2734304256,2734305279,CA
-2734305280,2734330367,US
-2734330368,2734330431,IT
-2734330432,2734330623,US
+2734305280,2734330623,US
2734330624,2734330879,IT
2734330880,2734335999,US
2734336000,2734338047,CA
@@ -64619,10 +67002,12 @@
2734457856,2734458879,CA
2734458880,2734467327,US
2734467328,2734467583,CA
-2734467584,2734471167,US
+2734467584,2734467839,US
+2734467840,2734468095,GB
+2734468096,2734471167,US
2734471168,2734472191,CA
2734472192,2734473215,AG
-2734473216,2734477311,US
+2734473216,2734479359,US
2734479360,2734481407,CA
2734481408,2734485503,US
2734485504,2734486527,CA
@@ -64777,7 +67162,7 @@
2738210816,2738214911,IN
2738214912,2738215935,HK
2738215936,2738216959,CN
-2738216960,2738217983,HK
+2738216960,2738217983,MY
2738217984,2738220031,AU
2738221056,2738222079,CN
2738222080,2738223103,MO
@@ -64919,9 +67304,7 @@
2756313088,2756378623,US
2756378624,2756444159,AU
2756444160,2756509695,US
-2756509696,2756556543,CL
-2756556544,2756557311,PE
-2756557312,2756575231,CL
+2756509696,2756575231,CL
2756575232,2756640767,SG
2756640768,2756706303,US
2756706304,2756771839,AU
@@ -64955,7 +67338,9 @@
2760114816,2760114847,FI
2760114848,2760115327,FR
2760115328,2760115455,GB
-2760115456,2760115775,FR
+2760115456,2760115711,FR
+2760115712,2760115719,IE
+2760115720,2760115775,FR
2760115776,2760115839,ES
2760115840,2760116207,FR
2760116208,2760116223,FI
@@ -65025,9 +67410,7 @@
2760137216,2760137471,GB
2760137472,2760137535,FR
2760137536,2760137599,ES
-2760137600,2760138335,FR
-2760138336,2760138367,FI
-2760138368,2760143039,FR
+2760137600,2760143039,FR
2760143040,2760143103,ES
2760143104,2760143615,FR
2760143616,2760143871,GB
@@ -65100,9 +67483,12 @@
2760168128,2760168191,IE
2760168192,2760168319,FR
2760168320,2760168447,GB
-2760168448,2760169679,FR
+2760168448,2760169471,FR
+2760169472,2760169503,FI
+2760169504,2760169679,FR
2760169680,2760169695,ES
-2760169696,2760170047,FR
+2760169696,2760169983,FR
+2760169984,2760170047,ES
2760170048,2760170111,FI
2760170112,2760170815,FR
2760170816,2760170847,PT
@@ -65254,6 +67640,8 @@
2772828160,2772959231,US
2772959232,2773010431,CZ
2773010688,2773024767,CZ
+2773085184,2773086207,SL
+2773086208,2773090303,ZA
2773090304,2773221375,US
2773221376,2773286911,JP
2773286912,2773745663,US
@@ -65318,13 +67706,11 @@
2779971584,2780037119,US
2780037120,2780039167,ZA
2780039168,2780043263,US
-2780043264,2780075007,ZA
-2780075008,2780075263,US
-2780075264,2780075394,ZA
-2780075395,2780075395,US
-2780075396,2780075449,ZA
-2780075450,2780075450,US
-2780075451,2780102655,ZA
+2780043264,2780073471,ZA
+2780073472,2780073727,AU
+2780073728,2780075007,ZA
+2780075008,2780075519,US
+2780075520,2780102655,ZA
2780102656,2780168191,US
2780168192,2780299263,CL
2780299264,2780364799,US
@@ -65413,21 +67799,23 @@
2783008256,2783008767,IT
2783008768,2783009279,BE
2783009280,2783010815,US
-2783010944,2783011071,PH
+2783010944,2783011071,HK
2783011072,2783011327,US
2783011328,2783011839,AU
2783011840,2783012351,JP
2783012352,2783012607,TW
2783012608,2783012863,US
2783012864,2783013887,IN
-2783013888,2783182847,US
+2783013888,2783150079,US
+2783150080,2783154175,DE
+2783154176,2783182847,US
2783182848,2783248383,AU
2783248384,2783313919,KR
2783313920,2783379455,US
2783379456,2783380991,SC
2783380992,2783381503,NZ
-2783381504,2783382527,SC
-2783382528,2783383551,US
+2783381504,2783383039,SC
+2783383040,2783383551,US
2783383552,2783387647,CA
2783387648,2783391743,GB
2783391744,2783395839,US
@@ -65550,7 +67938,9 @@
2807237632,2807259647,US
2807260160,2807271679,US
2807271680,2807271935,AU
-2807271936,2807496703,US
+2807271936,2807288345,US
+2807288346,2807288346,PR
+2807288347,2807496703,US
2807496704,2807562239,DE
2807562240,2807566335,US
2807566336,2807574527,CA
@@ -65678,9 +68068,7 @@
2815988416,2815988863,US
2815988864,2815988895,GB
2815988896,2816159743,US
-2816159744,2816159999,IN
-2816160000,2816162815,US
-2816162816,2816163839,IN
+2816159744,2816163839,IN
2816163840,2816262143,US
2816262144,2816263167,IE
2816263168,2816264191,GB
@@ -65706,9 +68094,10 @@
2817061120,2817277951,US
2817277952,2817294335,NL
2817294336,2817325055,US
-2817325312,2817933056,US
-2817933057,2817933057,CA
-2817933058,2817986303,US
+2817325312,2817933055,US
+2817933056,2817933311,CA
+2817933312,2817933567,PR
+2817933568,2817986303,US
2817986560,2818002943,US
2818002944,2818003722,GB
2818003724,2818004991,GB
@@ -65759,9 +68148,7 @@
2818229248,2818231295,BR
2818231296,2818232319,PE
2818232320,2818233343,AR
-2818233344,2818234095,HN
-2818234096,2818234111,IT
-2818234112,2818234367,HN
+2818233344,2818234367,HN
2818234368,2818235391,BR
2818235392,2818236415,GT
2818236416,2818244607,BR
@@ -65779,20 +68166,22 @@
2818620416,2818623487,BR
2818623488,2818625535,AR
2818625536,2818626559,BR
-2818626560,2818626783,HN
-2818626784,2818626799,BR
-2818626800,2818627583,HN
+2818626560,2818627583,HN
2818627584,2818628607,BR
2818628608,2818629631,MX
2818629632,2818634751,BR
2818634752,2818635775,CO
2818635776,2818637823,BR
2818637824,2818670591,AU
-2818670592,2818687299,US
+2818670592,2818671423,US
+2818671424,2818671439,AU
+2818671440,2818687299,US
2818687300,2818687303,JP
2818687304,2818688903,US
2818688904,2818688927,NL
-2818688928,2822584319,US
+2818688928,2818689479,US
+2818689480,2818689487,AU
+2818689488,2822584319,US
2822584320,2822586367,NL
2822586368,2822590463,US
2822590464,2822591629,IE
@@ -65813,19 +68202,7 @@
2822733824,2822734143,HK
2822734144,2822734159,US
2822734160,2822742015,HK
-2822742016,2822742079,SG
-2822742080,2822742111,US
-2822742112,2822742175,SG
-2822742176,2822742207,US
-2822742208,2822742319,SG
-2822742320,2822742335,US
-2822742336,2822742687,SG
-2822742688,2822742703,US
-2822742704,2822742975,SG
-2822742976,2822743007,US
-2822743008,2822747391,SG
-2822747392,2822747439,US
-2822747440,2822750207,SG
+2822742016,2822750207,SG
2822750208,2822758399,HK
2822758400,2822766591,SG
2822766592,2822848997,US
@@ -65855,14 +68232,12 @@
2824489984,2824492031,BR
2824492032,2824493055,AR
2824493056,2824494079,BR
-2824494080,2824495103,VE
-2824495104,2824495263,HN
-2824495264,2824495279,DE
-2824495280,2824496087,HN
-2824496088,2824496095,NL
-2824496096,2824496127,HN
+2824494080,2824495103,CO
+2824495104,2824496127,HN
2824496128,2824498175,BR
-2824498176,2824499199,HN
+2824498176,2824498527,HN
+2824498528,2824498535,FR
+2824498536,2824499199,HN
2824499200,2824503295,BR
2824503296,2824504319,AR
2824504320,2824510463,BR
@@ -65935,7 +68310,9 @@
2826978048,2826985471,ZA
2826985472,2826987519,NZ
2826987520,2826989567,GB
-2826989568,2827026431,ZA
+2826989568,2827024895,ZA
+2827024896,2827025407,US
+2827025408,2827026431,ZA
2827026432,2827091967,US
2827091968,2827157503,AU
2827157504,2827223039,KR
@@ -65997,7 +68374,9 @@
2830441472,2830445567,BR
2830445568,2830446591,AR
2830446592,2830447615,BR
-2830447616,2830448639,HN
+2830447616,2830447647,HN
+2830447648,2830447655,US
+2830447656,2830448639,HN
2830448640,2830452735,BR
2830452736,2830453759,AR
2830453760,2830454783,MX
@@ -66016,7 +68395,10 @@
2830482432,2830486527,BR
2830486528,2830488575,AR
2830488576,2830492671,BR
-2830492672,2830493695,HN
+2830492672,2830492895,HN
+2830492896,2830492927,UY
+2830492928,2830492935,US
+2830492936,2830493695,HN
2830493696,2830499839,BR
2830499840,2830586879,US
2830587136,2830761983,US
@@ -66150,7 +68532,9 @@
2832010240,2832023551,BR
2832023552,2832024575,CR
2832024576,2832025599,BR
-2832025600,2832026623,HN
+2832025600,2832026015,HN
+2832026016,2832026031,DE
+2832026032,2832026623,HN
2832026624,2832030719,BR
2832030720,2832031743,AR
2832031744,2832032767,BO
@@ -66191,7 +68575,10 @@
2833476608,2833481727,BR
2833481728,2833482751,HN
2833482752,2833484799,BR
-2833484800,2833485823,HN
+2833484800,2833485311,HN
+2833485312,2833485519,US
+2833485520,2833485527,BE
+2833485528,2833485823,US
2833485824,2833486847,AR
2833486848,2833501183,BR
2833501184,2833502207,AR
@@ -66200,7 +68587,9 @@
2833512448,2833513471,BR
2833513472,2833514495,AR
2833514496,2833525759,BR
-2833525760,2833526783,HN
+2833525760,2833526639,HN
+2833526640,2833526655,FR
+2833526656,2833526783,HN
2833526784,2833527807,CR
2833527808,2833528831,MX
2833528832,2833529855,AR
@@ -66257,7 +68646,9 @@
2834030592,2834034687,CA
2834034688,2834497535,US
2834497536,2834563071,SV
-2834563072,2834825215,US
+2834563072,2834690047,US
+2834690048,2834694143,CA
+2834694144,2834825215,US
2834825216,2834956287,KR
2834956288,2835087359,US
2835087360,2835152895,AU
@@ -66288,15 +68679,15 @@
2837970944,2838036479,US
2838036480,2838233087,CH
2838233088,2838237183,GB
-2838237184,2838247551,US
-2838247552,2838247583,NL
-2838247584,2838255167,US
+2838237184,2838255167,US
2838255168,2838255199,JP
2838255200,2838260095,US
2838260096,2838260127,IE
2838260128,2838261759,US
2838261760,2838265855,GB
-2838265856,2838298623,US
+2838265856,2838276159,US
+2838276160,2838276191,NL
+2838276192,2838298623,US
2838298624,2838298655,NL
2838298656,2838298687,US
2838298688,2838298975,NL
@@ -66313,13 +68704,15 @@
2838300672,2838300927,US
2838300928,2838301119,NL
2838301120,2838301183,US
-2838301184,2838301695,NL
+2838301184,2838301191,NL
+2838301192,2838301199,US
+2838301200,2838301695,NL
2838301696,2838301951,US
-2838301952,2838304127,NL
+2838301952,2838302111,NL
+2838302112,2838302127,US
+2838302128,2838304127,NL
2838304128,2838304159,US
-2838304160,2838304223,NL
-2838304224,2838304255,US
-2838304256,2838304319,NL
+2838304160,2838304319,NL
2838304320,2838304383,US
2838304384,2838304447,NL
2838304448,2838304511,US
@@ -66329,23 +68722,27 @@
2838305120,2838305151,US
2838305152,2838305247,NL
2838305248,2838305279,US
-2838305280,2838305503,NL
-2838305504,2838305535,US
-2838305536,2838307055,NL
+2838305280,2838305663,NL
+2838305664,2838305727,US
+2838305728,2838307055,NL
2838307056,2838307063,US
2838307064,2838307135,NL
-2838307136,2838307167,US
-2838307168,2838307199,NL
-2838307200,2838307231,US
-2838307232,2838307295,NL
+2838307136,2838307183,US
+2838307184,2838307295,NL
2838307296,2838307303,US
2838307304,2838307311,NL
2838307312,2838307327,US
-2838307328,2838307903,NL
-2838307904,2838307967,US
-2838307968,2838315023,NL
+2838307328,2838307647,NL
+2838307648,2838307679,US
+2838307680,2838307903,NL
+2838307904,2838307999,US
+2838308000,2838308191,NL
+2838308192,2838308223,US
+2838308224,2838315023,NL
2838315024,2838315039,US
-2838315040,2838315279,NL
+2838315040,2838315151,NL
+2838315152,2838315167,US
+2838315168,2838315279,NL
2838315280,2838315295,US
2838315296,2838315391,NL
2838315392,2838315407,US
@@ -66357,9 +68754,7 @@
2838315741,2838315741,US
2838315742,2838315799,NL
2838315800,2838315801,US
-2838315802,2838315839,NL
-2838315840,2838315871,US
-2838315872,2838316063,NL
+2838315802,2838316063,NL
2838316064,2838316079,US
2838316080,2838316591,NL
2838316592,2838316607,US
@@ -66373,9 +68768,9 @@
2838318512,2838318527,US
2838318528,2838318655,NL
2838318656,2838318687,US
-2838318688,2838319135,NL
-2838319136,2838319167,US
-2838319168,2838320191,NL
+2838318688,2838318867,NL
+2838318868,2838318871,US
+2838318872,2838320191,NL
2838320192,2838320192,US
2838320193,2838320543,NL
2838320544,2838320551,US
@@ -66390,22 +68785,26 @@
2838323104,2838323535,NL
2838323536,2838323551,US
2838323552,2838324039,NL
-2838324040,2838324047,US
-2838324048,2838324063,NL
+2838324040,2838324055,US
+2838324056,2838324063,NL
2838324064,2838324065,US
2838324066,2838324415,NL
2838324416,2838324423,US
-2838324424,2838325343,NL
+2838324424,2838324735,NL
+2838324736,2838324767,US
+2838324768,2838325343,NL
2838325344,2838325375,US
2838325376,2838325439,NL
2838325440,2838325471,JP
2838325472,2838325983,NL
2838325984,2838326015,US
-2838326016,2838327087,NL
-2838327088,2838327103,US
-2838327104,2838328079,NL
-2838328080,2838328095,US
-2838328096,2838328159,NL
+2838326016,2838326591,NL
+2838326592,2838326623,US
+2838326624,2838327623,NL
+2838327624,2838327631,US
+2838327632,2838328079,NL
+2838328080,2838328111,US
+2838328112,2838328159,NL
2838328160,2838328167,US
2838328168,2838328259,NL
2838328260,2838328260,US
@@ -66425,17 +68824,19 @@
2838331568,2838331583,US
2838331584,2838331655,NL
2838331656,2838331663,US
-2838331664,2838331807,NL
+2838331664,2838331711,NL
+2838331712,2838331727,US
+2838331728,2838331807,NL
2838331808,2838331839,US
2838331840,2838333903,NL
2838333904,2838333919,US
2838333920,2838334335,NL
2838334336,2838334351,US
-2838334352,2838337279,NL
+2838334352,2838337239,NL
+2838337240,2838337247,US
+2838337248,2838337279,NL
2838337280,2838337295,US
-2838337296,2838337375,NL
-2838337376,2838337407,US
-2838337408,2838337759,NL
+2838337296,2838337759,NL
2838337760,2838337761,IN
2838337762,2838337763,US
2838337764,2838338271,NL
@@ -66467,15 +68868,15 @@
2838341952,2838341967,US
2838341968,2838343071,NL
2838343072,2838343103,US
-2838343104,2838343711,NL
-2838343712,2838343743,US
-2838343744,2838344451,NL
+2838343104,2838344451,NL
2838344452,2838344455,US
2838344456,2838344457,NL
2838344458,2838344459,US
2838344460,2838344463,NL
2838344464,2838344479,US
-2838344480,2838344919,NL
+2838344480,2838344917,NL
+2838344918,2838344918,US
+2838344919,2838344919,NL
2838344920,2838344927,US
2838344928,2838345215,NL
2838345216,2838345231,US
@@ -66494,8 +68895,10 @@
2838346720,2838347031,NL
2838347032,2838347039,US
2838347040,2838347231,NL
-2838347232,2838347271,US
-2838347272,2838347487,NL
+2838347232,2838347263,US
+2838347264,2838347279,NL
+2838347280,2838347295,US
+2838347296,2838347487,NL
2838347488,2838347519,US
2838347520,2838348063,NL
2838348064,2838348079,US
@@ -66517,11 +68920,11 @@
2838350912,2838350927,US
2838350928,2838351295,NL
2838351296,2838351327,US
-2838351328,2838351623,NL
-2838351624,2838351631,US
-2838351632,2838351711,NL
+2838351328,2838351711,NL
2838351712,2838351743,CO
-2838351744,2838352575,NL
+2838351744,2838352143,NL
+2838352144,2838352159,US
+2838352160,2838352575,NL
2838352576,2838352583,US
2838352584,2838352591,NL
2838352592,2838352599,US
@@ -66538,8 +68941,8 @@
2838357384,2838358687,NL
2838358688,2838358719,US
2838358720,2838358975,NL
-2838358976,2838359007,US
-2838359008,2838360047,NL
+2838358976,2838358991,US
+2838358992,2838360047,NL
2838360048,2838360063,US
2838360064,2838360639,NL
2838360640,2838360735,US
@@ -66575,7 +68978,9 @@
2838400704,2838400735,US
2838400736,2838400895,NL
2838400896,2838400959,US
-2838400960,2838401023,NL
+2838400960,2838400991,NL
+2838400992,2838401007,US
+2838401008,2838401023,NL
2838401024,2838405119,GB
2838405120,2838405183,NL
2838405184,2838405215,US
@@ -66587,21 +68992,25 @@
2838406088,2838406095,US
2838406096,2838406271,NL
2838406272,2838406279,US
-2838406280,2838406463,NL
-2838406464,2838406495,US
-2838406496,2838408143,NL
-2838408144,2838408159,US
-2838408160,2838408735,NL
+2838406280,2838406687,NL
+2838406688,2838406719,US
+2838406720,2838406959,NL
+2838406960,2838406967,US
+2838406968,2838407103,NL
+2838407104,2838407119,US
+2838407120,2838408591,NL
+2838408592,2838408599,US
+2838408600,2838408735,NL
2838408736,2838408767,US
2838408768,2838408799,NL
2838408800,2838408831,US
-2838408832,2838408863,NL
-2838408864,2838408895,US
-2838408896,2838409439,NL
+2838408832,2838409439,NL
2838409440,2838409471,US
2838409472,2838409479,NL
2838409480,2838409503,US
-2838409504,2838410191,NL
+2838409504,2838409599,NL
+2838409600,2838409615,US
+2838409616,2838410191,NL
2838410192,2838410199,US
2838410200,2838410367,NL
2838410368,2838410399,US
@@ -66609,7 +69018,14 @@
2838410896,2838410911,US
2838410912,2838411327,NL
2838411328,2838411359,US
-2838411360,2838415391,NL
+2838411360,2838414207,NL
+2838414208,2838414271,US
+2838414272,2838414815,NL
+2838414816,2838414879,US
+2838414880,2838414911,JP
+2838414912,2838415167,NL
+2838415168,2838415183,US
+2838415184,2838415391,NL
2838415392,2838415487,US
2838415488,2838415655,NL
2838415656,2838415663,US
@@ -66619,9 +69035,15 @@
2838416424,2838416431,US
2838416432,2838416479,NL
2838416480,2838416511,US
-2838416512,2838418143,NL
+2838416512,2838416623,NL
+2838416624,2838416639,AF
+2838416640,2838418143,NL
2838418144,2838418175,US
-2838418176,2838429983,NL
+2838418176,2838418687,NL
+2838418688,2838418751,US
+2838418752,2838419455,NL
+2838419456,2838421503,US
+2838421504,2838429983,NL
2838429984,2838430015,US
2838430016,2838431039,NL
2838431040,2838431135,US
@@ -66641,19 +69063,19 @@
2838433920,2838433951,US
2838433952,2838435519,NL
2838435520,2838435551,US
-2838435552,2838436031,NL
-2838436032,2838436063,US
-2838436064,2838436815,NL
+2838435552,2838436815,NL
2838436816,2838436831,US
2838436832,2838437359,NL
2838437360,2838437361,US
-2838437362,2838437631,NL
-2838437632,2838437663,US
-2838437664,2838438127,NL
+2838437362,2838438127,NL
2838438128,2838438135,US
-2838438136,2838439935,NL
+2838438136,2838438463,NL
+2838438464,2838438495,US
+2838438496,2838439935,NL
2838439936,2838439943,US
-2838439944,2838441215,NL
+2838439944,2838440111,NL
+2838440112,2838440127,US
+2838440128,2838441215,NL
2838441216,2838441247,US
2838441248,2838441375,NL
2838441376,2838441407,US
@@ -66667,27 +69089,95 @@
2838444096,2838444159,US
2838444160,2838444223,NL
2838444224,2838444255,US
-2838444256,2838445695,NL
-2838445696,2838445727,US
-2838445728,2838445951,NL
+2838444256,2838445951,NL
2838445952,2838445983,US
-2838445984,2838478975,NL
+2838445984,2838446079,NL
+2838446080,2838446087,US
+2838446088,2838446095,NL
+2838446096,2838446111,US
+2838446112,2838446143,NL
+2838446144,2838446175,US
+2838446176,2838446223,NL
+2838446224,2838446239,US
+2838446240,2838446319,NL
+2838446320,2838446327,US
+2838446328,2838446431,NL
+2838446432,2838446439,US
+2838446440,2838446559,NL
+2838446560,2838446623,US
+2838446624,2838446631,NL
+2838446632,2838446639,US
+2838446640,2838446783,NL
+2838446784,2838446787,US
+2838446788,2838446847,NL
+2838446848,2838446911,US
+2838446912,2838447127,NL
+2838447128,2838447135,US
+2838447136,2838447167,NL
+2838447168,2838447183,US
+2838447184,2838447335,NL
+2838447336,2838447343,US
+2838447344,2838447471,NL
+2838447472,2838447487,US
+2838447488,2838447759,NL
+2838447760,2838447775,US
+2838447776,2838448223,NL
+2838448224,2838448239,US
+2838448240,2838448255,NL
+2838448256,2838448271,US
+2838448272,2838448591,NL
+2838448592,2838448607,US
+2838448608,2838448799,NL
+2838448800,2838448815,US
+2838448816,2838448895,NL
+2838448896,2838448959,US
+2838448960,2838449375,NL
+2838449376,2838449391,US
+2838449392,2838449535,NL
+2838449536,2838449663,US
+2838449664,2838461535,NL
+2838461536,2838461567,US
+2838461568,2838461823,NL
+2838461824,2838461855,US
+2838461856,2838461951,NL
+2838461952,2838461983,US
+2838461984,2838462111,NL
+2838462112,2838462119,US
+2838462120,2838463583,NL
+2838463584,2838463615,US
+2838463616,2838465599,NL
+2838465600,2838465615,US
+2838465616,2838465663,NL
+2838465664,2838465671,US
+2838465672,2838465711,NL
+2838465712,2838465727,US
+2838465728,2838466063,NL
+2838466064,2838466079,US
+2838466080,2838466607,NL
+2838466608,2838466623,US
+2838466624,2838466687,NL
+2838466688,2838466719,US
+2838466720,2838466959,NL
+2838466960,2838466975,US
+2838466976,2838478975,NL
2838478976,2838479007,US
-2838479008,2838479455,NL
+2838479008,2838479207,NL
+2838479208,2838479215,US
+2838479216,2838479431,NL
+2838479432,2838479439,US
+2838479440,2838479455,NL
2838479456,2838479487,US
2838479488,2838480127,NL
2838480128,2838480159,US
-2838480160,2838480223,NL
-2838480224,2838480255,US
-2838480256,2838480319,NL
+2838480160,2838480319,NL
2838480320,2838480323,IE
2838480324,2838480335,NL
2838480336,2838480351,US
-2838480352,2838481807,NL
-2838481808,2838481823,US
-2838481824,2838481855,NL
+2838480352,2838481855,NL
2838481856,2838481887,US
-2838481888,2838482959,NL
+2838481888,2838482695,NL
+2838482696,2838482703,US
+2838482704,2838482959,NL
2838482960,2838482967,IE
2838482968,2838482975,US
2838482976,2838482991,NL
@@ -66702,7 +69192,79 @@
2838483328,2838483335,US
2838483336,2838483487,NL
2838483488,2838483519,US
-2838483520,2838560767,NL
+2838483520,2838484839,NL
+2838484840,2838484843,US
+2838484844,2838485151,NL
+2838485152,2838485183,US
+2838485184,2838485375,NL
+2838485376,2838485407,US
+2838485408,2838485695,NL
+2838485696,2838485727,US
+2838485728,2838486463,NL
+2838486464,2838486495,US
+2838486496,2838487647,NL
+2838487648,2838487679,US
+2838487680,2838487743,NL
+2838487744,2838487807,US
+2838487808,2838488663,NL
+2838488664,2838488671,US
+2838488672,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,2838496127,NL
+2838496128,2838496159,US
+2838496160,2838511887,NL
+2838511888,2838511903,BR
+2838511904,2838511935,NL
+2838511936,2838511951,JP
+2838511952,2838511983,NL
+2838511984,2838511999,JP
+2838512000,2838512047,NL
+2838512048,2838512079,US
+2838512080,2838512255,NL
+2838512256,2838512271,US
+2838512272,2838512303,NL
+2838512304,2838512319,US
+2838512320,2838512351,NL
+2838512352,2838512367,AF
+2838512368,2838512519,NL
+2838512520,2838512543,US
+2838512544,2838512655,NL
+2838512656,2838512671,US
+2838512672,2838512879,NL
+2838512880,2838512895,US
+2838512896,2838526983,NL
+2838526984,2838527039,US
+2838527040,2838527055,NL
+2838527056,2838527071,US
+2838527072,2838527223,NL
+2838527224,2838527231,US
+2838527232,2838527279,NL
+2838527280,2838527295,US
+2838527296,2838527439,NL
+2838527440,2838527455,US
+2838527456,2838527535,NL
+2838527536,2838527567,US
+2838527568,2838527695,NL
+2838527696,2838527711,US
+2838527712,2838528255,NL
+2838528256,2838528271,US
+2838528272,2838528431,NL
+2838528432,2838528447,US
+2838528448,2838529167,NL
+2838529168,2838529183,US
+2838529184,2838530095,NL
+2838530096,2838530111,US
+2838530112,2838560767,NL
2838560768,2838626303,CH
2838626304,2838626399,US
2838626400,2838626431,SA
@@ -66710,9 +69272,7 @@
2838626576,2838626591,CN
2838626592,2838628319,US
2838628320,2838628351,DE
-2838628352,2838629331,US
-2838629332,2838629333,SA
-2838629334,2838631367,US
+2838628352,2838631367,US
2838631368,2838631375,SA
2838631376,2838631871,US
2838631872,2838631903,DE
@@ -66723,7 +69283,9 @@
2838632096,2838632127,DE
2838632128,2838633295,US
2838633296,2838633311,SA
-2838633312,2838642719,US
+2838633312,2838641263,US
+2838641264,2838641279,NL
+2838641280,2838642719,US
2838642720,2838642723,AE
2838642724,2838643407,US
2838643408,2838643408,GB
@@ -66747,13 +69309,17 @@
2838650528,2838650559,GB
2838650560,2838653631,US
2838653632,2838653639,GB
-2838653640,2838657295,US
+2838653640,2838653646,US
+2838653647,2838653647,GB
+2838653648,2838657295,US
2838657296,2838657299,AE
2838657300,2838658607,US
2838658608,2838658623,NL
2838658624,2838659007,US
2838659008,2838659023,GB
-2838659024,2838663167,US
+2838659024,2838659431,US
+2838659432,2838659439,GB
+2838659440,2838663167,US
2838663168,2838663175,NL
2838663176,2838663807,US
2838663808,2838663809,BO
@@ -66761,15 +69327,17 @@
2838664080,2838664095,BO
2838664096,2838664167,US
2838664168,2838664175,VN
-2838664176,2838664727,US
-2838664728,2838664735,ZA
-2838664736,2838665759,US
+2838664176,2838665759,US
2838665760,2838665791,JP
2838665792,2838669519,US
2838669520,2838669535,NL
2838669536,2838670623,US
2838670624,2838670655,NL
-2838670656,2838708223,US
+2838670656,2838678319,US
+2838678320,2838678327,GB
+2838678328,2838680639,US
+2838680640,2838680655,GB
+2838680656,2838708223,US
2838708224,2838724607,NO
2838724608,2838757375,US
2838757376,2838822911,CH
@@ -66780,9 +69348,9 @@
2838843328,2838859777,US
2838859778,2838859779,HK
2838859780,2838865007,US
-2838865008,2838865015,CZ
+2838865008,2838865015,CA
2838865016,2838865019,US
-2838865020,2838865023,CZ
+2838865020,2838865023,CA
2838865024,2838866247,US
2838866248,2838866255,CA
2838866256,2838867855,US
@@ -66815,35 +69383,39 @@
2838931014,2838931015,CZ
2838931016,2838931016,US
2838931017,2838931023,CZ
-2838931024,2838931667,US
-2838931668,2838931671,CZ
-2838931672,2838933919,US
+2838931024,2838931647,US
+2838931648,2838931663,NO
+2838931664,2838933919,US
2838933920,2838933951,NL
2838933952,2838938991,US
2838938992,2838939007,AU
2838939008,2838946735,US
2838946736,2838946751,CA
-2838946752,2838957535,US
+2838946752,2838950703,US
+2838950704,2838950719,NL
+2838950720,2838957535,US
2838957536,2838957551,HK
-2838957552,2838958991,US
-2838958992,2838958999,CZ
-2838959000,2838960815,US
+2838957552,2838960815,US
2838960816,2838960819,CZ
2838960820,2838960821,US
2838960822,2838960827,CZ
2838960828,2838960829,US
2838960830,2838960831,CZ
-2838960832,2838961023,US
-2838961024,2838961031,CZ
-2838961032,2838968671,US
+2838960832,2838968671,US
2838968672,2838968687,CN
2838968688,2838969167,US
2838969168,2838969183,AF
-2838969184,2838969535,US
+2838969184,2838969456,US
+2838969457,2838969457,HK
+2838969458,2838969535,US
2838969536,2838969536,IL
2838969537,2838969587,US
2838969588,2838969588,AF
-2838969589,2838969737,US
+2838969589,2838969591,US
+2838969592,2838969592,HK
+2838969593,2838969710,US
+2838969711,2838969711,HK
+2838969712,2838969737,US
2838969738,2838969738,ES
2838969739,2838969828,US
2838969829,2838969829,NL
@@ -66855,7 +69427,9 @@
2838989672,2838989679,CA
2838989680,2838990719,US
2838990720,2838990751,CA
-2838990752,2838995823,US
+2838990752,2838994239,US
+2838994240,2838994255,NO
+2838994256,2838995823,US
2838995824,2838995839,NL
2838995840,2838996063,US
2838996064,2838996095,HK
@@ -66865,14 +69439,28 @@
2838999408,2838999423,AF
2838999424,2839001263,US
2839001264,2839001279,CA
-2839001280,2839010815,US
-2839010816,2839010847,NL
-2839010848,2839035903,US
+2839001280,2839019687,US
+2839019688,2839019695,JP
+2839019696,2839035903,US
2839035904,2839052287,KR
-2839052288,2839085055,US
+2839052288,2839055039,US
+2839055040,2839055041,NL
+2839055042,2839055727,US
+2839055728,2839055743,NL
+2839055744,2839085055,US
2839085056,2839117823,MX
2839117824,2839150591,BR
-2839150592,2840015359,US
+2839150592,2839313471,US
+2839313472,2839313475,NL
+2839313476,2839313759,US
+2839313760,2839313775,NL
+2839313776,2839363679,US
+2839363680,2839363683,NL
+2839363684,2839363685,US
+2839363686,2839363687,NL
+2839363688,2839379615,US
+2839379616,2839379631,NL
+2839379632,2840015359,US
2840015360,2840015615,GB
2840015616,2843803647,US
2843803648,2843869183,ZA
@@ -66916,7 +69504,7 @@
2851023872,2851024895,ZA
2851024896,2851025919,NG
2851025920,2851026943,GH
-2851026944,2851027967,DZ
+2851026944,2851027967,NG
2851027968,2851028991,ZA
2851028992,2851030015,CI
2851030016,2851031039,ZA
@@ -66945,8 +69533,10 @@
2851055616,2851057663,KE
2851057664,2851060735,ZA
2851060736,2851062783,NG
-2851062784,2851063807,ZA
-2851063808,2851065855,SC
+2851062784,2851063807,SL
+2851063808,2851064319,SC
+2851064320,2851064831,NA
+2851064832,2851065855,SC
2851065856,2851066879,ZA
2851066880,2851067903,CD
2851067904,2851071999,ZA
@@ -66973,7 +69563,7 @@
2852076032,2852077567,ZA
2852077568,2852078591,CD
2852078592,2852079615,TN
-2852079616,2852080639,GB
+2852079616,2852080639,CG
2852080640,2852081663,ZA
2852081664,2852082687,BW
2852082688,2852083711,EG
@@ -66989,7 +69579,7 @@
2852092928,2852093951,NG
2852093952,2852094975,ZA
2852094976,2852095999,MZ
-2852096000,2852097023,SD
+2852096000,2852097023,SS
2852097024,2852098047,NG
2852098048,2852099071,ZA
2852099072,2852100095,GA
@@ -67001,7 +69591,9 @@
2852107264,2852108287,NG
2852108288,2852109311,TZ
2852109312,2852110335,CD
-2852110336,2852112383,ZA
+2852110336,2852111103,ZA
+2852111104,2852111359,NG
+2852111360,2852112383,ZA
2852112384,2852113407,KE
2852113408,2852114431,CD
2852114432,2852115455,NG
@@ -67044,9 +69636,11 @@
2855288832,2855305215,GB
2855305216,2855309311,HK
2855309312,2855469055,US
-2855469056,2855484671,PY
-2855484672,2855485439,AR
-2855485440,2855501823,UY
+2855469056,2855484415,PY
+2855484416,2855484671,AR
+2855484672,2855484927,PY
+2855484928,2855485183,AR
+2855485184,2855501823,UY
2855501824,2855534591,AR
2855534592,2855706623,US
2855706880,2856058879,US
@@ -67066,7 +69660,9 @@
2857082880,2857086975,CA
2857086976,2857140223,US
2857140224,2857140735,CA
-2857140736,2857238527,US
+2857140736,2857152511,US
+2857152512,2857153535,HK
+2857153536,2857238527,US
2857238528,2857248767,BR
2857248768,2857249791,CO
2857249792,2857250815,AR
@@ -67207,7 +69803,10 @@
2857574400,2857575423,AR
2857575424,2857579519,BR
2857579520,2857580543,AR
-2857580544,2857585663,BR
+2857580544,2857581055,BR
+2857581056,2857581311,AR
+2857581312,2857581567,CO
+2857581568,2857585663,BR
2857585664,2857586687,VE
2857586688,2857593855,BR
2857593856,2857594879,AR
@@ -67439,8 +70038,12 @@
2867851264,2867852287,BR
2867852288,2867853311,AR
2867853312,2867855359,BR
-2867855360,2868117503,US
-2868117504,2868127743,BR
+2867855360,2868057087,US
+2868057088,2868058111,BR
+2868058112,2868117503,US
+2868117504,2868122623,BR
+2868122624,2868123647,GB
+2868123648,2868127743,BR
2868127744,2868128767,HN
2868128768,2868129791,BR
2868129792,2868130815,AR
@@ -67470,7 +70073,10 @@
2868178944,2868179967,HN
2868179968,2868183039,BR
2868183040,2868184063,CW
-2868184064,2868193279,BR
+2868184064,2868191743,BR
+2868191744,2868191999,VE
+2868192000,2868192255,BO
+2868192256,2868193279,BR
2868193280,2868194303,HN
2868194304,2868195327,BR
2868195328,2868196351,CL
@@ -67478,7 +70084,7 @@
2868197376,2868198399,HN
2868198400,2868205567,BR
2868205568,2868206591,MX
-2868206592,2868223999,BR
+2868206592,2868225023,BR
2868225024,2868226047,DO
2868226048,2868227071,AR
2868227072,2868230143,BR
@@ -67489,27 +70095,74 @@
2868242432,2868243455,AR
2868243456,2868244479,BR
2868244480,2868245503,CR
-2868245504,2868247551,BR
-2868248576,2868253695,BR
+2868245504,2868253695,BR
2868253696,2868254719,AR
2868254720,2868257791,BR
2868257792,2868259839,AR
+2868259840,2868260863,BR
2868260864,2868261887,AR
-2868261888,2868262911,HN
+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,2868277247,BR
+2868273152,2868274175,BR
+2868274176,2868275199,CR
+2868275200,2868277247,BR
2868277248,2868278271,CO
-2868281344,2868283391,BR
-2868294656,2868295679,AR
-2868295680,2868305919,BR
-2868307968,2868310015,BR
+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
@@ -67563,7 +70216,8 @@
2868578816,2868579327,IN
2868579328,2868581375,US
2868581376,2868581887,IN
-2868581888,2868586495,US
+2868581888,2868584447,US
+2868584448,2868586495,GB
2868586496,2868588543,IN
2868588544,2868591615,US
2868591616,2868592639,IN
@@ -67572,16 +70226,17 @@
2868599808,2868604415,US
2868604416,2868604927,IN
2868604928,2868628639,US
-2868628672,2868658175,US
+2868628672,2868632575,US
+2868632576,2868633087,BR
+2868633088,2868658175,US
2868658176,2868659199,GB
2868659200,2868660223,US
2868660480,2868662271,US
2868662528,2868673023,US
2868673024,2868673279,FR
2868673280,2868673535,ZA
-2868673536,2868674336,US
-2868674337,2868674337,SE
-2868674338,2868674559,US
+2868673536,2868674303,US
+2868674304,2868674559,SE
2868674560,2868682751,AU
2868682752,2868682752,US
2868682754,2868688895,US
@@ -67611,7 +70266,9 @@
2868814848,2868815871,AR
2868815872,2868816895,BR
2868816896,2868817919,VE
-2868817920,2868818943,HN
+2868817920,2868818887,HN
+2868818888,2868818895,IT
+2868818896,2868818943,HN
2868818944,2868825087,BR
2868825088,2868826111,AR
2868826112,2868828159,BR
@@ -67734,14 +70391,29 @@
2890162176,2890163199,PA
2890163200,2890164223,PT
2890164224,2890165247,TH
-2890165248,2890168319,AU
+2890165248,2890166271,DE
+2890166272,2890168319,AU
2890168320,2890169343,CW
-2890169344,2890170367,AU
-2890170368,2890172415,US
+2890169344,2890170367,AM
+2890170368,2890171391,DJ
+2890171392,2890172415,US
2890172416,2890173439,PL
2890173440,2890174463,US
-2890174464,2890174719,SG
-2890174720,2890956799,US
+2890174464,2890175231,SG
+2890175232,2890176511,US
+2890176512,2890177535,RS
+2890177536,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,2890194943,US
+2890194944,2890195967,HU
+2890195968,2890956799,US
2890956800,2890989567,AE
2890989568,2891017215,US
2891017216,2891017471,JP
@@ -67754,7 +70426,11 @@
2891059200,2891120639,US
2891251712,2891272191,US
2891272192,2891274239,CA
-2891274240,2891282431,US
+2891274240,2891277823,US
+2891277824,2891278079,GB
+2891278080,2891279103,US
+2891279104,2891279359,GB
+2891279360,2891282431,US
2891282432,2891283455,PR
2891283456,2891284479,CA
2891284480,2891364351,US
@@ -67763,7 +70439,11 @@
2891378688,2891380735,CA
2891380736,2891403263,US
2891403264,2891407359,CA
-2891407360,2891796479,US
+2891407360,2891780095,US
+2891780096,2891786239,CA
+2891786240,2891790335,US
+2891790336,2891791359,CA
+2891791360,2891796479,US
2891796480,2891800575,CA
2891800576,2891807231,US
2891807232,2891807487,GB
@@ -67774,31 +70454,45 @@
2891841792,2891842303,US
2891842304,2891843327,GB
2891843328,2891844095,US
-2891844096,2891844351,FR
+2891844096,2891844351,CL
2891844352,2891845119,US
2891845120,2891845631,DE
2891845632,2891845887,US
2891845888,2891846399,DE
-2891846400,2891846655,CH
+2891846400,2891846655,NL
2891846656,2891846911,US
2891846912,2891847167,NL
2891847168,2891848447,US
-2891848448,2891848959,JP
+2891848448,2891848703,JP
+2891848704,2891848959,AR
2891848960,2891849215,BN
2891849216,2891850239,US
2891850240,2891850495,TH
-2891850496,2891850751,SG
-2891850752,2891853567,US
+2891850496,2891850751,AM
+2891850752,2891851263,US
+2891851264,2891851519,AM
+2891851520,2891853567,US
2891853568,2891853823,SG
-2891853824,2891854335,US
+2891853824,2891854079,US
+2891854080,2891854335,IN
2891854336,2891855615,NL
2891855616,2891856127,SE
2891856128,2891856383,LU
-2891856384,2891857919,US
+2891856384,2891856895,US
+2891856896,2891857151,CU
+2891857152,2891857919,US
2891857920,2891858175,ES
2891858176,2891858431,TR
2891858432,2891858687,CA
-2891858688,2891862527,US
+2891858688,2891859455,US
+2891859456,2891859711,NO
+2891859712,2891859967,AT
+2891859968,2891860223,ES
+2891860224,2891860479,NL
+2891860480,2891860735,CH
+2891860736,2891861247,GB
+2891861248,2891861503,AU
+2891861504,2891862527,US
2891862528,2891863039,KR
2891863040,2891863295,FR
2891863296,2891863551,AU
@@ -67825,8 +70519,10 @@
2891974656,2891976703,CA
2891976704,2891982847,US
2891982848,2891984895,CA
-2891984896,2892021759,US
-2892021760,2892038143,CA
+2891984896,2892015615,US
+2892015616,2892016639,PR
+2892016640,2892017663,US
+2892017664,2892038143,CA
2892038144,2892040191,US
2892040192,2892042239,CA
2892042240,2892050431,US
@@ -67892,7 +70588,11 @@
2892401920,2892402047,MF
2892402048,2892402175,US
2892402176,2892402303,MP
-2892402304,2892420607,US
+2892402304,2892414975,US
+2892414976,2892415231,GB
+2892415232,2892417791,US
+2892417792,2892418047,GB
+2892418048,2892420607,US
2892420608,2892420863,CA
2892420864,2892421631,US
2892421632,2892421887,CA
@@ -67906,7 +70606,8 @@
2892496896,2892505087,US
2892505088,2892513279,SG
2892513280,2892529663,JP
-2892529664,2892906495,US
+2892529664,2892537855,DE
+2892537856,2892906495,US
2892906496,2892910591,CA
2892910592,2892943743,US
2892943744,2892943871,LR
@@ -67939,7 +70640,8 @@
2892989696,2892989951,VE
2892989952,2892990207,US
2892990208,2892990463,CA
-2892990464,2892990975,IT
+2892990464,2892990719,US
+2892990720,2892990975,IT
2892990976,2892991231,GB
2892991232,2892991487,US
2892991488,2892991999,GB
@@ -68039,9 +70741,7 @@
2896301500,2896301500,DE
2896301501,2896429280,US
2896429281,2896429281,CA
-2896429282,2896691455,US
-2896691456,2896691711,BR
-2896691712,2897018879,US
+2896429282,2897018879,US
2897018880,2897149951,DE
2897149952,2897215487,US
2897215488,2897739775,DE
@@ -68060,9 +70760,19 @@
2899574784,2899902463,GB
2899902464,2899967999,US
2899968000,2900099071,CA
-2900099072,2901740455,US
+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,2901740455,US
2901740456,2901740463,CA
-2901740464,2902200319,US
+2901740464,2901751295,US
+2901751296,2901751551,GB
+2901751552,2902200319,US
2902200320,2902204415,CN
2902204416,2902208511,US
2902208512,2902212607,CN
@@ -68075,7 +70785,17 @@
2902405936,2902405951,US
2902405952,2902408191,CA
2902408192,2902409215,GB
-2902409216,2902476543,US
+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,2902487551,US
2902487552,2902488063,CA
@@ -68086,8 +70806,7 @@
2904817664,2904981503,US
2904981504,2905002152,NL
2905002153,2905002153,US
-2905002154,2905005087,NL
-2905005096,2905014271,NL
+2905002154,2905014271,NL
2905014272,2905038847,IN
2905038848,2905047039,SG
2905047040,2905079807,HK
@@ -68099,9 +70818,15 @@
2905348096,2905348351,PH
2905348352,2905348863,US
2905348864,2905349119,NZ
-2905349120,2905387519,US
+2905349120,2905376207,US
+2905376208,2905376223,GB
+2905376224,2905387519,US
2905387520,2905388031,CA
-2905388032,2905401855,US
+2905388032,2905390879,US
+2905390880,2905390895,GB
+2905390896,2905391599,US
+2905391600,2905391615,GB
+2905391616,2905401855,US
2905401856,2905402111,CA
2905402112,2905402519,US
2905402520,2905402527,IN
@@ -68124,11 +70849,16 @@
2915106560,2915195647,US
2915195648,2915195903,CL
2915195904,2915196159,NL
-2915196160,2915196927,US
+2915196160,2915196415,TW
+2915196416,2915196927,US
2915196928,2915197183,IE
2915197184,2915197439,US
2915197440,2915197695,FI
-2915197696,2915250175,US
+2915197696,2915215359,US
+2915215360,2915215615,JP
+2915215616,2915216127,NL
+2915216128,2915216383,TW
+2915216384,2915250175,US
2915250176,2915254271,CA
2915254272,2915516415,US
2915516416,2915516671,NL
@@ -68139,8 +70869,8 @@
2915520512,2915520642,AU
2915520643,2915520643,US
2915520644,2915520671,AU
-2915520672,2915520735,US
-2915520736,2915521023,AU
+2915520672,2915520767,US
+2915520768,2915521023,AU
2915521024,2915521279,JP
2915521280,2915521535,PL
2915521536,2915526911,US
@@ -68173,9 +70903,7 @@
2915894592,2915958783,US
2915958784,2916024319,CA
2916024320,2916163583,US
-2916163584,2916167375,CA
-2916167376,2916167383,US
-2916167384,2916168159,CA
+2916163584,2916168159,CA
2916168160,2916168167,US
2916168168,2916171775,CA
2916171776,2916184063,US
@@ -68183,21 +70911,18 @@
2916196352,2916253695,US
2916253696,2916286463,CA
2916286464,2916294655,US
-2916294656,2916295679,IL
-2916295680,2916319231,US
+2916294656,2916296703,IL
+2916296704,2916302847,US
+2916302848,2916303359,CA
+2916303360,2916303871,DE
+2916303872,2916304383,CA
+2916304384,2916304895,US
+2916304896,2916305919,GB
+2916305920,2916319231,US
2916319232,2916335615,PR
2916335616,2916368383,US
2916368384,2916401151,CA
-2916401152,2916401407,US
-2916401408,2916402175,DE
-2916402176,2916402431,US
-2916402432,2916407295,DE
-2916407296,2916407551,US
-2916407552,2916409343,DE
-2916409344,2916409599,US
-2916409600,2916410879,DE
-2916410880,2916411135,GB
-2916411136,2916417535,DE
+2916401152,2916417535,DE
2916417536,2916515839,US
2916515840,2916519935,CA
2916519936,2916581375,US
@@ -68226,19 +70951,13 @@
2917099520,2917100543,NL
2917100544,2917101567,US
2917101568,2917106175,NL
-2917106176,2917106431,US
-2917106432,2917106687,NL
-2917106688,2917112831,US
+2917106176,2917112831,US
2917112832,2917113855,NL
2917113856,2917115903,US
2917115904,2917116927,NL
-2917116928,2917117951,US
-2917117952,2917122047,NL
-2917122048,2917167905,US
+2917116928,2917167905,US
2917167906,2917167906,BZ
-2917167907,2917170854,US
-2917170855,2917170855,UA
-2917170856,2917171199,US
+2917167907,2917171199,US
2917171200,2917175295,CA
2917175296,2917195775,US
2917195776,2917203967,CA
@@ -68289,9 +71008,17 @@
2917656832,2917657087,CN
2917657088,2917660671,US
2917660672,2917661183,GB
-2917661184,2917676031,US
-2917676032,2917676287,CA
-2917676288,2917699839,US
+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
@@ -68303,7 +71030,9 @@
2917710592,2917710847,CA
2917710848,2917713919,US
2917713920,2917714175,CA
-2917714176,2917842175,US
+2917714176,2917828351,US
+2917828352,2917828479,IN
+2917828480,2917842175,US
2917842176,2917842431,CA
2917842432,2918014975,US
2918014976,2918023167,CA
@@ -68315,7 +71044,9 @@
2918154240,2918170623,CA
2918170624,2918174463,US
2918174464,2918174719,MX
-2918174720,2918187007,US
+2918174720,2918180351,US
+2918180352,2918180863,CA
+2918180864,2918187007,US
2918187008,2918187263,CA
2918187264,2918187775,US
2918187776,2918188031,CA
@@ -68344,7 +71075,9 @@
2918407424,2918408191,PR
2918408192,2918432767,US
2918432768,2918436863,CA
-2918436864,2918463231,US
+2918436864,2918459391,US
+2918459392,2918459647,CA
+2918459648,2918463231,US
2918463232,2918463487,CA
2918463488,2918469631,US
2918469632,2918472703,CA
@@ -68352,7 +71085,9 @@
2918473216,2918473727,CA
2918473728,2918477823,US
2918477824,2918481919,CA
-2918481920,2918502911,US
+2918481920,2918498535,US
+2918498536,2918498539,JP
+2918498540,2918502911,US
2918502912,2918503167,SG
2918503168,2918527231,US
2918527232,2918527487,FR
@@ -68431,8 +71166,8 @@
2921512960,2921530367,US
2921530368,2921530879,DE
2921530880,2921541119,US
-2921541120,2921541375,DE
-2921541376,2921542143,US
+2921541120,2921541631,DE
+2921541632,2921542143,US
2921542144,2921542399,CA
2921542400,2921545215,US
2921545216,2921545727,DE
@@ -68497,7 +71232,11 @@
2928261712,2928261887,CA
2928261888,2928263167,US
2928263168,2928279551,CA
-2928279552,2928312319,US
+2928279552,2928283647,US
+2928283648,2928287743,SG
+2928287744,2928304127,US
+2928304128,2928305151,NL
+2928305152,2928312319,US
2928312320,2928316415,CA
2928316416,2928320511,HK
2928320512,2928328703,US
@@ -68664,7 +71403,6 @@
2947593216,2947594239,HK
2947594240,2947595263,IN
2947595264,2947596287,CN
-2947596288,2947597311,IN
2947597312,2947598335,JP
2947598336,2947602431,AU
2947602432,2947603455,NZ
@@ -68697,7 +71435,8 @@
2953461760,2953465855,ES
2953465856,2953466127,GB
2953466368,2953466879,GB
-2953467392,2953467647,GB
+2953466880,2953467135,RO
+2953467392,2953467903,GB
2953467904,2953469951,BE
2953469952,2953478143,CH
2953478144,2953503551,SE
@@ -68737,9 +71476,7 @@
2954822592,2954822599,GB
2954822600,2954822927,FR
2954822928,2954822931,DE
-2954822932,2954823215,FR
-2954823216,2954823223,IE
-2954823224,2954823259,FR
+2954822932,2954823259,FR
2954823260,2954823263,GB
2954823264,2954823687,FR
2954823688,2954823695,NL
@@ -68885,9 +71622,7 @@
2954835444,2954835447,ES
2954835448,2954835451,FR
2954835452,2954835455,ES
-2954835456,2954835475,FR
-2954835476,2954835479,ES
-2954835480,2954835511,FR
+2954835456,2954835511,FR
2954835512,2954835519,ES
2954835520,2954835619,FR
2954835620,2954835620,ES
@@ -68951,9 +71686,7 @@
2954840612,2954840615,GB
2954840616,2954840767,FR
2954840768,2954840775,GB
-2954840776,2954840783,FR
-2954840784,2954840799,ES
-2954840800,2954840927,FR
+2954840776,2954840927,FR
2954840928,2954840931,DE
2954840932,2954841023,FR
2954841024,2954841087,ES
@@ -68970,7 +71703,9 @@
2954841852,2954841855,ES
2954841856,2954842075,FR
2954842076,2954842079,GB
-2954842080,2954842239,FR
+2954842080,2954842111,FR
+2954842112,2954842143,FI
+2954842144,2954842239,FR
2954842240,2954842243,ES
2954842244,2954842247,FR
2954842248,2954842251,ES
@@ -68984,9 +71719,7 @@
2954843044,2954843047,GB
2954843048,2954843187,FR
2954843188,2954843191,GB
-2954843192,2954843479,FR
-2954843480,2954843487,GB
-2954843488,2954843503,FR
+2954843192,2954843503,FR
2954843504,2954843507,ES
2954843508,2954843759,FR
2954843760,2954843771,ES
@@ -69136,7 +71869,9 @@
2954873696,2954873727,FI
2954873728,2954873839,FR
2954873840,2954873847,ES
-2954873848,2954873919,FR
+2954873848,2954873879,FR
+2954873880,2954873887,PT
+2954873888,2954873919,FR
2954873920,2954873983,IE
2954873984,2954874111,GB
2954874112,2954874127,FR
@@ -69194,9 +71929,7 @@
2954878608,2954878623,FI
2954878624,2954878695,FR
2954878696,2954878703,IE
-2954878704,2954878707,FR
-2954878708,2954878711,GB
-2954878712,2954878855,FR
+2954878704,2954878855,FR
2954878856,2954878863,IE
2954878864,2954878899,FR
2954878900,2954878903,GB
@@ -69308,7 +72041,9 @@
2956602368,2956602623,NL
2956602624,2956602879,SE
2956602880,2956603135,GB
-2956603136,2956607487,RU
+2956603136,2956605439,RU
+2956605440,2956605695,DE
+2956605696,2956607487,RU
2956607488,2956611583,PS
2956611584,2956613631,IT
2956613632,2956614911,GB
@@ -69728,8 +72463,8 @@
2960752640,2960769023,RU
2960769024,2960773119,UA
2960773120,2960777215,RU
-2960777216,2960785407,UA
-2960785408,2960793599,RU
+2960777216,2960789503,UA
+2960789504,2960793599,RU
2960793600,2960797695,CZ
2960797696,2960805887,RU
2960805888,2960807935,KZ
@@ -69771,7 +72506,8 @@
2960932864,2960933887,IR
2960933888,2960934655,GB
2960934656,2960934911,NL
-2960934912,2960941055,RO
+2960934912,2960936959,RO
+2960936960,2960941055,KZ
2960941056,2960943103,AM
2960943104,2960945151,RO
2960945152,2960945663,GB
@@ -69818,9 +72554,7 @@
2961065216,2961065471,AU
2961065472,2961065727,SE
2961065728,2961066239,HK
-2961066240,2961066751,DE
-2961066752,2961067007,BG
-2961067008,2961067519,DE
+2961066240,2961067519,DE
2961067520,2961067775,GB
2961067776,2961068543,DE
2961068544,2961068799,NL
@@ -69844,7 +72578,8 @@
2961102848,2961103871,DE
2961103872,2961104895,RO
2961104896,2961106943,GB
-2961106944,2961108991,RO
+2961106944,2961107967,NL
+2961107968,2961108991,RO
2961108992,2961111039,GB
2961111040,2961112063,PL
2961112064,2961113087,RO
@@ -69913,7 +72648,9 @@
2967446016,2967446527,RO
2967446528,2967446783,IT
2967446784,2967447039,DE
-2967447040,2967451647,RO
+2967447040,2967450879,RO
+2967450880,2967451135,US
+2967451136,2967451647,RO
2967451648,2967452671,KZ
2967452672,2967453183,RO
2967453184,2967453439,GB
@@ -69974,15 +72711,11 @@
2984615936,2984935423,MX
2984935424,2984936447,AR
2984936448,2984937471,BR
-2984937472,2984937607,HN
-2984937608,2984937615,US
-2984937616,2984938079,HN
-2984938080,2984938095,US
-2984938096,2984938239,HN
-2984938240,2984938255,US
-2984938256,2984938847,HN
-2984938848,2984938863,CA
-2984938864,2984939519,HN
+2984937472,2984937503,HN
+2984937504,2984937511,US
+2984937512,2984938759,HN
+2984938760,2984938767,CA
+2984938768,2984939519,HN
2984939520,2984951807,BR
2984951808,2984968191,EC
2984968192,2985033727,BR
@@ -70282,7 +73015,9 @@
2988459648,2988459679,GB
2988459680,2988459687,FR
2988459688,2988459691,PL
-2988459692,2988459715,FR
+2988459692,2988459695,FR
+2988459696,2988459699,IE
+2988459700,2988459715,FR
2988459716,2988459719,FI
2988459720,2988459863,FR
2988459864,2988459867,ES
@@ -70309,9 +73044,7 @@
2988461704,2988461707,GB
2988461708,2988461799,FR
2988461800,2988461807,ES
-2988461808,2988462159,FR
-2988462160,2988462167,ES
-2988462168,2988462331,FR
+2988461808,2988462331,FR
2988462332,2988462335,ES
2988462336,2988462747,FR
2988462748,2988462751,ES
@@ -70357,7 +73090,9 @@
2988466088,2988466095,PT
2988466096,2988466098,FR
2988466099,2988466099,BE
-2988466100,2988474687,FR
+2988466100,2988474535,FR
+2988474536,2988474543,GB
+2988474544,2988474687,FR
2988474688,2988474703,FI
2988474704,2988474959,FR
2988474960,2988474975,FI
@@ -70512,9 +73247,7 @@
2988488992,2988489023,ES
2988489024,2988489167,FR
2988489168,2988489175,PT
-2988489176,2988489367,FR
-2988489368,2988489371,GB
-2988489372,2988489375,FR
+2988489176,2988489375,FR
2988489376,2988489379,ES
2988489380,2988489475,FR
2988489476,2988489479,GB
@@ -70619,7 +73352,9 @@
2988504984,2988504987,ES
2988504988,2988505151,FR
2988505152,2988505167,GB
-2988505168,2988505279,FR
+2988505168,2988505215,FR
+2988505216,2988505247,ES
+2988505248,2988505279,FR
2988505280,2988505311,ES
2988505312,2988505375,FR
2988505376,2988505391,GB
@@ -70660,9 +73395,7 @@
2988508608,2988508639,ES
2988508640,2988508847,FR
2988508848,2988508855,GB
-2988508856,2988508959,FR
-2988508960,2988508975,ES
-2988508976,2988509491,FR
+2988508856,2988509491,FR
2988509492,2988509495,IE
2988509496,2988509511,FR
2988509512,2988509515,PL
@@ -70682,9 +73415,7 @@
2988511024,2988511027,GB
2988511028,2988511747,FR
2988511748,2988511751,GB
-2988511752,2988511955,FR
-2988511956,2988511959,ES
-2988511960,2988512127,FR
+2988511752,2988512127,FR
2988512128,2988512143,ES
2988512144,2988512199,FR
2988512200,2988512207,ES
@@ -70827,7 +73558,9 @@
2988529824,2988529855,ES
2988529856,2988530047,FR
2988530048,2988530049,GB
-2988530050,2988530087,FR
+2988530050,2988530067,FR
+2988530068,2988530071,DE
+2988530072,2988530087,FR
2988530088,2988530091,NL
2988530092,2988530399,FR
2988530400,2988530403,ES
@@ -70912,7 +73645,9 @@
2988544768,2988544775,ES
2988544776,2988544799,FR
2988544800,2988544831,FI
-2988544832,2988545515,FR
+2988544832,2988544835,FR
+2988544836,2988544843,ES
+2988544844,2988545515,FR
2988545516,2988545519,GB
2988545520,2988545579,FR
2988545580,2988545583,ES
@@ -71036,9 +73771,7 @@
2988554036,2988554039,ES
2988554040,2988554239,FR
2988554240,2988554495,ES
-2988554496,2988554539,FR
-2988554540,2988554543,GB
-2988554544,2988554815,FR
+2988554496,2988554815,FR
2988554816,2988554879,GB
2988554880,2988554931,FR
2988554932,2988554935,ES
@@ -71371,7 +74104,7 @@
2997521152,2997521407,US
2997521408,2997521663,UY
2997521664,2997521919,IN
-2997521920,2997522175,US
+2997521920,2997522175,NL
2997522176,2997522431,GB
2997522432,2997522687,IT
2997522688,2997522943,BE
@@ -71607,7 +74340,9 @@
3000759552,3000760607,RU
3000760608,3000760623,UA
3000760624,3000762367,RU
-3000762368,3001004031,RS
+3000762368,3000865279,RS
+3000865280,3000865791,XK
+3000865792,3001004031,RS
3001004032,3001005567,XK
3001005568,3001024511,RS
3001024512,3001548799,NL
@@ -71639,66 +74374,10 @@
3001862144,3001863167,EE
3001863168,3001864191,LT
3001864192,3001868287,RU
-3001868288,3001868847,FR
-3001868848,3001868851,AU
-3001868852,3001868855,MX
-3001868856,3001868859,KR
-3001868860,3001868863,FR
-3001868864,3001868867,TR
-3001868868,3001868871,ID
-3001868872,3001868875,CH
-3001868876,3001868879,PL
-3001868880,3001868883,BE
-3001868884,3001868887,SE
-3001868888,3001868891,SA
-3001868892,3001868895,TW
-3001868896,3001868899,SJ
-3001868900,3001868903,AT
-3001868904,3001868907,AR
-3001868908,3001868911,ZA
-3001868912,3001868915,IR
-3001868916,3001868919,TH
-3001868920,3001868923,DK
-3001868924,3001868927,GR
-3001868928,3001868931,AE
-3001868932,3001868935,VE
-3001868936,3001868939,CD
-3001868940,3001868943,FI
-3001868944,3001868947,MY
-3001868948,3001868951,PT
-3001868952,3001868955,HK
-3001868956,3001868959,SG
-3001868960,3001868963,EG
-3001868964,3001868967,NG
-3001868968,3001868971,IL
-3001868972,3001868975,IE
-3001868976,3001868979,CL
-3001868980,3001868983,CZ
-3001868984,3001868987,PH
-3001868988,3001868991,PK
-3001868992,3001868995,RO
-3001868996,3001868999,DZ
-3001869000,3001869003,PE
-3001869004,3001869007,NZ
-3001869008,3001869011,KZ
-3001869012,3001869015,UA
-3001869016,3001869019,KW
-3001869020,3001869023,QA
-3001869024,3001869027,HU
-3001869028,3001869031,BD
-3001869032,3001869035,VN
-3001869036,3001869039,MA
-3001869040,3001869043,SK
-3001869044,3001869047,AO
-3001869048,3001869051,IQ
-3001869052,3001869055,LY
-3001869056,3001869311,RU
+3001868288,3001869311,US
3001869312,3001870335,FR
3001870336,3001871359,HK
-3001871360,3001871615,GR
-3001871616,3001871871,PL
-3001871872,3001872127,PT
-3001872128,3001872383,RO
+3001871360,3001872383,US
3001872384,3001876479,RU
3001876480,3001880575,IT
3001880576,3001884671,RU
@@ -71775,7 +74454,9 @@
3002650624,3002652671,FR
3002652672,3002654719,DE
3002654720,3002656767,NL
-3002656768,3002658815,RU
+3002656768,3002657068,RU
+3002657069,3002657069,EE
+3002657070,3002658815,RU
3002658816,3002660863,DE
3002660864,3002662911,CZ
3002662912,3002664959,DE
@@ -71938,52 +74619,21 @@
3003129088,3003129343,CO
3003129344,3003129599,BO
3003129600,3003129855,HN
-3003129856,3003130111,MX
-3003130112,3003130367,CR
-3003130368,3003130623,MX
-3003130624,3003131647,CR
-3003131648,3003133183,MX
-3003133184,3003133695,CR
-3003133696,3003134719,MX
-3003134720,3003134975,CR
-3003134976,3003135487,MX
-3003135488,3003136255,CR
-3003136256,3003137279,MX
-3003137280,3003137791,CR
-3003137792,3003138047,MX
-3003138048,3003138559,HN
-3003138560,3003139071,PA
-3003139072,3003139583,HN
-3003139584,3003140351,PA
-3003140352,3003140607,HN
-3003140608,3003141375,PA
-3003141376,3003141631,HN
-3003141632,3003141887,PA
-3003141888,3003143679,HN
-3003143680,3003144447,PA
-3003144448,3003146239,HN
-3003146240,3003146495,PA
-3003146496,3003147007,GT
-3003147008,3003147263,PA
-3003147264,3003148031,GT
-3003148032,3003148543,PA
-3003148544,3003148799,GT
-3003148800,3003149311,PA
-3003149312,3003150335,GT
-3003150336,3003151871,SV
-3003151872,3003152383,PA
-3003152384,3003152639,SV
-3003152640,3003152895,PA
-3003152896,3003154431,SV
+3003129856,3003138047,MX
+3003138048,3003146239,HN
+3003146240,3003148287,GT
+3003148288,3003150335,CR
+3003150336,3003154431,SV
3003154432,3003154687,CL
3003154688,3003154943,EC
3003154944,3003159039,AR
3003159040,3003159295,CO
-3003159296,3003160575,AR
+3003159296,3003159807,AR
+3003159808,3003160063,BR
+3003160064,3003160575,AR
3003160576,3003160831,CL
3003160832,3003161087,PE
-3003161088,3003161343,CO
-3003161344,3003161599,CL
+3003161088,3003161599,CL
3003161600,3003162623,UY
3003162624,3003170815,CR
3003170816,3003171071,GT
@@ -71998,9 +74648,7 @@
3003174400,3003174911,BR
3003174912,3003179007,CR
3003179008,3003187199,AR
-3003187200,3003189215,CO
-3003189216,3003189247,AT
-3003189248,3003252735,CO
+3003187200,3003252735,CO
3003252736,3003449343,CL
3003449344,3003514879,SV
3003514880,3003645951,PE
@@ -72014,57 +74662,26 @@
3005218816,3005349887,CO
3005349888,3005480959,BR
3005480960,3005874175,AR
-3005874176,3005875455,PA
-3005875456,3005875711,CO
-3005875712,3005879807,PA
-3005879808,3005880063,CO
-3005880064,3005881343,PA
-3005881344,3005881599,CO
-3005881600,3005883135,PA
-3005883136,3005883391,CO
-3005883392,3005886975,PA
-3005886976,3005887487,CO
-3005887488,3005887999,PA
-3005888000,3005888255,CO
-3005888256,3005890047,PA
-3005890048,3005890303,CO
-3005890304,3005890559,PA
-3005890560,3005891583,CO
-3005891584,3005891839,PA
-3005891840,3005892095,CO
-3005892096,3005893119,PA
-3005893120,3005893631,CO
-3005893632,3005893887,PA
-3005893888,3005894911,CO
-3005894912,3005895167,PA
-3005895168,3005895935,CO
-3005895936,3005896703,PA
-3005896704,3005898495,CO
-3005898496,3005898751,PA
-3005898752,3005900799,CO
-3005900800,3005901055,PA
-3005901056,3005901311,CO
-3005901312,3005901567,PA
-3005901568,3005902079,CO
-3005902080,3005902335,PA
-3005902336,3005905407,CO
-3005905408,3005905663,PA
-3005905664,3005906943,CO
-3005906944,3005911039,PA
-3005911040,3005911295,CO
-3005911296,3005911551,PA
-3005911552,3005911807,CO
-3005911808,3005912063,PA
-3005912064,3005912575,CO
-3005912576,3005912831,PA
-3005912832,3005913087,CO
-3005913088,3005913343,PA
-3005913344,3005915135,CO
+3005874176,3005897983,PA
+3005897984,3005898239,CO
+3005898240,3005898495,PA
+3005898496,3005898751,CO
+3005898752,3005901823,PA
+3005901824,3005902079,CO
+3005902080,3005902591,PA
+3005902592,3005902847,CO
+3005902848,3005903615,PA
+3005903616,3005903871,CO
+3005903872,3005905663,PA
+3005905664,3005905919,CO
+3005905920,3005906431,PA
+3005906432,3005906687,CO
+3005906688,3005914623,PA
+3005914624,3005915135,CO
3005915136,3005918207,AR
3005918208,3005919231,CO
3005919232,3005923327,AR
3005923328,3005939711,BZ
-3005939712,3005956095,CR
3005956096,3005960191,AR
3005960192,3005965311,PE
3005965312,3005966335,AR
@@ -72073,54 +74690,34 @@
3005972480,3005988863,CH
3005988864,3006005247,DO
3006005248,3006267391,VE
-3006267392,3006267647,PA
-3006267648,3006267903,NI
-3006267904,3006268671,PA
-3006268672,3006268927,NI
-3006268928,3006271231,PA
-3006271232,3006271487,NI
-3006271488,3006273535,PA
-3006273536,3006273791,NI
-3006273792,3006275583,PA
-3006275584,3006275839,NI
-3006275840,3006276095,PA
-3006276096,3006276351,NI
-3006276352,3006277887,PA
-3006277888,3006278143,NI
-3006278144,3006279167,PA
-3006279168,3006279423,NI
-3006279424,3006283519,PA
-3006283520,3006283775,NI
-3006283776,3006286335,CR
-3006286336,3006286847,PA
-3006286848,3006287615,CR
-3006287616,3006287871,PA
-3006287872,3006288127,CR
-3006288128,3006288383,PA
-3006288384,3006289151,CR
-3006289152,3006289407,PA
-3006289408,3006290687,CR
-3006290688,3006290943,PA
-3006290944,3006291967,CR
-3006291968,3006308351,PA
-3006308352,3006308863,CR
-3006308864,3006309631,PA
-3006309632,3006310655,CR
-3006310656,3006310911,PA
-3006310912,3006312447,CR
-3006312448,3006312703,PA
-3006312704,3006315007,CR
-3006315008,3006315263,PA
-3006315264,3006315775,CR
-3006315776,3006316031,PA
-3006316032,3006316543,CR
-3006316544,3006321151,PA
-3006321152,3006321407,CR
-3006321408,3006321663,PA
-3006321664,3006324735,CR
+3006267392,3006283775,PA
+3006283776,3006284031,CR
+3006284032,3006284543,PA
+3006284544,3006284799,CR
+3006284800,3006286335,PA
+3006286336,3006286591,CR
+3006286592,3006288127,PA
+3006288128,3006288383,CR
+3006288384,3006308351,PA
+3006308352,3006308607,CR
+3006308608,3006309887,PA
+3006309888,3006310143,CR
+3006310144,3006313727,PA
+3006313728,3006313983,CR
+3006313984,3006314239,PA
+3006314240,3006314751,CR
+3006314752,3006320639,PA
+3006320640,3006320895,CR
+3006320896,3006323967,PA
+3006323968,3006324223,CR
+3006324224,3006324479,PA
+3006324480,3006324735,CR
3006324736,3006328831,PA
-3006328832,3006330623,NI
-3006330624,3006330879,PA
+3006328832,3006329087,NI
+3006329088,3006329343,PA
+3006329344,3006329599,NI
+3006329600,3006330623,PA
+3006330624,3006330879,NI
3006330880,3006331903,CR
3006331904,3006332927,AR
3006332928,3006349311,EC
@@ -72136,27 +74733,9 @@
3006480384,3006484479,DO
3006484480,3006488575,AR
3006488576,3006496767,CO
-3006496768,3006500351,CR
-3006500352,3006500607,MX
-3006500608,3006506239,CR
-3006506240,3006506495,MX
-3006506496,3006506751,CR
-3006506752,3006507007,MX
-3006507008,3006507519,CR
-3006507520,3006507775,MX
-3006507776,3006512895,CR
-3006512896,3006513151,MX
-3006513152,3006513663,PA
-3006513664,3006514431,CR
-3006514432,3006514687,PA
-3006514688,3006516479,CR
-3006516480,3006516735,PA
-3006516736,3006517503,CR
-3006517504,3006517759,NI
-3006517760,3006518527,CR
-3006518528,3006519295,NI
-3006519296,3006521343,CR
-3006521344,3006528511,AR
+3006496768,3006521343,CR
+3006521344,3006527487,AR
+3006527488,3006528511,BR
3006528512,3006529535,BZ
3006529536,3006660607,DO
3006660608,3006791679,BR
@@ -72168,7 +74747,6 @@
3007070208,3007078399,CL
3007078400,3007082495,AR
3007082496,3007086591,BO
-3007086592,3007090687,PA
3007090688,3007091199,NL
3007091200,3007092223,RU
3007092224,3007092479,VE
@@ -72176,28 +74754,14 @@
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,3007100647,HN
-3007100648,3007100655,MX
-3007100656,3007100887,HN
-3007100888,3007100895,PH
-3007100896,3007100927,HN
+3007098880,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
+3007109120,3007115263,AR
3007115264,3007116287,CO
3007116288,3007117311,EC
3007117312,3007122431,AR
@@ -72212,18 +74776,25 @@
3007153168,3007153183,DE
3007153184,3007153279,CL
3007153280,3007153407,US
-3007153408,3007153919,DE
+3007153408,3007153663,DE
+3007153664,3007153679,CL
+3007153680,3007153695,DE
+3007153696,3007153919,CL
3007153920,3007154175,US
3007154176,3007154191,CL
3007154192,3007154207,DE
3007154208,3007154303,CL
3007154304,3007154687,US
-3007154688,3007154943,DE
+3007154688,3007154703,CL
+3007154704,3007154719,DE
+3007154720,3007154943,CL
3007154944,3007155199,US
-3007155200,3007155327,DE
+3007155200,3007155215,CL
+3007155216,3007155231,DE
+3007155232,3007155327,CL
3007155328,3007155711,US
3007155712,3007155967,DE
-3007155968,3007156223,US
+3007155968,3007156223,AT
3007156224,3007156351,DE
3007156352,3007156479,US
3007156480,3007156495,ES
@@ -72341,25 +74912,28 @@
3007171856,3007171871,US
3007171872,3007171873,BR
3007171874,3007171875,CL
-3007171876,3007171903,BR
-3007171904,3007172095,CL
+3007171876,3007172095,BR
3007172096,3007172351,US
3007172352,3007172383,FR
3007172384,3007172415,BE
-3007172416,3007172607,CL
+3007172416,3007172479,CL
+3007172480,3007172607,BR
3007172608,3007172863,US
-3007172864,3007172991,BR
+3007172864,3007172991,CL
3007172992,3007173023,IS
3007173024,3007173055,NZ
-3007173056,3007173119,BR
+3007173056,3007173059,CL
+3007173060,3007173071,BR
+3007173072,3007173119,CL
3007173120,3007173375,US
3007173376,3007173407,NO
3007173408,3007173439,SE
-3007173440,3007173631,BR
+3007173440,3007173443,CL
+3007173444,3007173491,BR
+3007173492,3007173631,CL
3007173632,3007173663,NO
3007173664,3007173695,NZ
-3007173696,3007173887,BR
-3007173888,3007174015,US
+3007173696,3007174015,BR
3007174016,3007174047,NL
3007174048,3007174079,FR
3007174080,3007174271,BR
@@ -72373,13 +74947,15 @@
3007175680,3007175935,GB
3007175936,3007175967,NZ
3007175968,3007175999,BE
-3007176000,3007176319,BR
+3007176000,3007176319,CL
3007176320,3007176351,SE
3007176352,3007176383,FR
-3007176384,3007176447,BR
+3007176384,3007176447,CL
3007176448,3007176703,US
3007176704,3007177727,IN
-3007177728,3007181055,US
+3007177728,3007179007,US
+3007179008,3007179263,KR
+3007179264,3007181055,US
3007181056,3007181183,BR
3007181184,3007181215,IT
3007181216,3007181247,IS
@@ -72407,55 +74983,13 @@
3007184128,3007184383,KW
3007184384,3007184895,BR
3007184896,3007250431,AR
-3007250432,3007268095,CR
-3007268096,3007268607,PA
-3007268608,3007269631,CR
-3007269632,3007270143,PA
-3007270144,3007270911,CR
-3007270912,3007271167,PA
-3007271168,3007272191,CR
-3007272192,3007272447,PA
-3007272448,3007272959,CR
-3007272960,3007273215,PA
-3007273216,3007273727,CR
-3007273728,3007274239,PA
-3007274240,3007274751,CR
-3007274752,3007275007,PA
-3007275008,3007279359,CR
-3007279360,3007279871,PA
-3007279872,3007280639,CR
-3007280640,3007280895,PA
-3007280896,3007281151,CR
-3007281152,3007281919,PA
-3007281920,3007283199,CR
-3007283200,3007284479,PA
-3007284480,3007284991,CR
-3007284992,3007285247,PA
-3007285248,3007285759,CR
-3007285760,3007286271,PA
+3007250432,3007284735,CR
+3007284736,3007284991,PA
+3007284992,3007286015,CR
+3007286016,3007286271,PA
3007286272,3007286783,CR
-3007286784,3007287295,PA
-3007287296,3007287551,CR
-3007287552,3007288063,MX
-3007288064,3007289087,CR
-3007289088,3007289343,MX
-3007289344,3007290367,CR
-3007290368,3007290623,PA
-3007290624,3007291135,CR
-3007291136,3007291391,PA
-3007291392,3007292415,CR
-3007292416,3007292671,MX
-3007292672,3007293439,CR
-3007293440,3007293951,MX
-3007293952,3007294207,CR
-3007294208,3007294463,MX
-3007294464,3007294719,CR
-3007294720,3007294975,MX
-3007294976,3007296255,CR
-3007296256,3007296511,MX
-3007296512,3007296767,CR
-3007296768,3007297023,MX
-3007297024,3007299583,CR
+3007286784,3007287039,PA
+3007287040,3007299583,CR
3007299584,3007301631,PA
3007301632,3007305727,AR
3007305728,3007307775,BZ
@@ -72485,7 +75019,9 @@
3025603216,3025603231,CN
3025603232,3025603247,HK
3025603248,3025603257,CN
-3025603258,3025603327,IN
+3025603258,3025603259,IN
+3025603260,3025603271,HK
+3025603272,3025603327,IN
3025603328,3025603335,GU
3025603336,3025603583,IN
3025603584,3025603839,SG
@@ -72508,14 +75044,10 @@
3025612800,3025612815,IN
3025612816,3025612831,SG
3025612832,3025612895,IN
-3025612896,3025613067,SG
-3025613068,3025613071,IN
-3025613072,3025613087,SG
+3025612896,3025613087,SG
3025613088,3025613119,IN
-3025613120,3025613175,SG
-3025613176,3025613183,IN
-3025613184,3025613311,SG
-3025613312,3025616895,IN
+3025613120,3025613327,SG
+3025613328,3025616895,IN
3025616896,3025617439,SG
3025617440,3025617447,IN
3025617448,3025617455,SG
@@ -72540,8 +75072,10 @@
3025621760,3025622015,IN
3025622016,3025622275,SG
3025622276,3025622279,IN
-3025622280,3025622351,SG
-3025622352,3025623055,IN
+3025622280,3025622399,SG
+3025622400,3025622527,IN
+3025622528,3025622783,ID
+3025622784,3025623055,IN
3025623056,3025623103,SG
3025623104,3025623247,IN
3025623248,3025623251,HK
@@ -72550,7 +75084,9 @@
3025623552,3025623807,SG
3025623808,3025624063,IN
3025624064,3025624319,TW
-3025624320,3025625343,IN
+3025624320,3025624335,IN
+3025624336,3025624343,HK
+3025624344,3025625343,IN
3025625344,3025625375,SG
3025625376,3025625391,IN
3025625392,3025625395,CA
@@ -72585,9 +75121,7 @@
3025631776,3025631839,HK
3025631840,3025631999,IN
3025632000,3025632255,HK
-3025632256,3025632427,SG
-3025632428,3025632431,IN
-3025632432,3025632439,SG
+3025632256,3025632439,SG
3025632440,3025632447,IN
3025632448,3025632463,SG
3025632464,3025632479,HK
@@ -72612,9 +75146,14 @@
3025638028,3025638031,IN
3025638032,3025638047,HK
3025638048,3025638063,MY
-3025638064,3025638279,IN
-3025638280,3025638287,SG
-3025638288,3025638399,IN
+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
@@ -72638,11 +75177,15 @@
3025640000,3025640191,IN
3025640192,3025640447,JP
3025640448,3025640835,MY
-3025640836,3025641727,IN
+3025640836,3025640839,IN
+3025640840,3025640855,MY
+3025640856,3025640863,IN
+3025640864,3025640895,MY
+3025640896,3025641727,IN
3025641728,3025641751,HK
3025641752,3025641759,IN
-3025641760,3025641775,HK
-3025641776,3025641983,IN
+3025641760,3025641779,HK
+3025641780,3025641983,IN
3025641984,3025642495,HK
3025642496,3025642751,SG
3025642752,3025647103,IN
@@ -72744,8 +75287,8 @@
3029715456,3029716991,JP
3029716992,3029721087,PK
3029721088,3029722111,IN
-3029722112,3029722367,AU
-3029722368,3029723135,IN
+3029722112,3029722623,AU
+3029722624,3029723135,IN
3029723136,3029724159,BD
3029724160,3029725183,CN
3029725184,3029727231,IN
@@ -72858,7 +75401,8 @@
3034492928,3034497023,JP
3034497024,3034499071,AU
3034499072,3034500095,HK
-3034500096,3034501119,TW
+3034500096,3034501118,PH
+3034501119,3034501119,TW
3034501120,3034502143,VU
3034502144,3034503167,IN
3034503168,3034504191,ID
@@ -72870,7 +75414,8 @@
3035193344,3035197439,JP
3035197440,3035198463,SG
3035198464,3035198719,KR
-3035198720,3035199487,HK
+3035198720,3035198975,SG
+3035198976,3035199487,HK
3035199488,3035200511,IN
3035200512,3035202559,AU
3035202560,3035205631,JP
@@ -72923,7 +75468,8 @@
3039395840,3039396351,US
3039396352,3039396607,NL
3039396608,3039412223,US
-3039412224,3039412479,CL
+3039412224,3039412351,CL
+3039412352,3039412479,BR
3039412480,3039412735,SG
3039412736,3039412991,TW
3039412992,3039413503,US
@@ -72937,7 +75483,9 @@
3039415808,3039416575,US
3039416576,3039416591,CL
3039416592,3039416607,SG
-3039416608,3039416713,CL
+3039416608,3039416639,CL
+3039416640,3039416703,BR
+3039416704,3039416713,CL
3039416714,3039416715,US
3039416716,3039416719,SG
3039416720,3039416735,CL
@@ -72952,11 +75500,12 @@
3039418112,3039418623,US
3039418624,3039418879,BR
3039418880,3039419135,US
-3039419136,3039419583,BR
+3039419136,3039419391,BR
+3039419392,3039419583,CL
3039419584,3039419647,SG
3039419648,3039419839,BR
3039419840,3039419903,SG
-3039419904,3039420415,BR
+3039419904,3039420415,CL
3039420416,3039428607,AR
3039428608,3039559679,CL
3039559680,3039821823,AR
@@ -72980,9 +75529,7 @@
3044212736,3044245503,HN
3044245504,3044278271,BO
3044278272,3044417535,AR
-3044417536,3044418047,CY
-3044418048,3044421631,PA
-3044421632,3044425727,CY
+3044417536,3044425727,PA
3044425728,3044446207,AR
3044446208,3044450303,CO
3044450304,3044454399,CL
@@ -73003,65 +75550,32 @@
3048123392,3048126463,AR
3048126464,3048128511,ES
3048128512,3048132607,AR
-3048132608,3048135935,CR
-3048135936,3048136447,PA
-3048136448,3048144895,CR
+3048132608,3048144895,CR
3048144896,3048210431,EC
3048210432,3048275967,PE
3048275968,3048292351,AR
-3048292352,3048292607,BZ
-3048292608,3048292799,HN
-3048292800,3048292807,ES
-3048292808,3048293375,HN
-3048293376,3048293599,BZ
-3048293600,3048293615,ES
-3048293616,3048295343,BZ
-3048295344,3048295351,CA
-3048295352,3048295631,BZ
-3048295632,3048295647,CA
-3048295648,3048297407,BZ
-3048297408,3048297423,CA
-3048297424,3048298687,BZ
-3048298688,3048298719,US
-3048298720,3048298799,BZ
-3048298800,3048298807,US
-3048298808,3048299487,BZ
-3048299488,3048299503,BR
-3048299504,3048301935,BZ
-3048301936,3048301951,CA
-3048301952,3048302295,BZ
-3048302296,3048302303,CA
-3048302304,3048302815,BZ
-3048302816,3048302823,NL
-3048302824,3048303303,BZ
-3048303304,3048303311,NL
-3048303312,3048304031,BZ
-3048304032,3048304047,NL
-3048304048,3048304663,BZ
-3048304664,3048304671,CR
-3048304672,3048304919,BZ
-3048304920,3048304927,CR
-3048304928,3048304999,BZ
-3048305000,3048305007,CR
-3048305008,3048305063,BZ
-3048305064,3048305071,CR
-3048305072,3048305471,BZ
-3048305472,3048305487,US
-3048305488,3048305503,BZ
-3048305504,3048305519,US
-3048305520,3048305983,BZ
-3048305984,3048305991,US
-3048305992,3048306671,BZ
-3048306672,3048306679,US
-3048306680,3048307607,BZ
-3048307608,3048307615,CA
-3048307616,3048307967,BZ
-3048307968,3048307983,CA
-3048307984,3048308103,BZ
-3048308104,3048308111,CA
-3048308112,3048308295,BZ
-3048308296,3048308303,CR
-3048308304,3048308735,BZ
+3048292352,3048293271,CA
+3048293272,3048293279,ES
+3048293280,3048294399,CA
+3048294400,3048294627,BZ
+3048294628,3048294631,BR
+3048294632,3048294759,BZ
+3048294760,3048294767,BR
+3048294768,3048296351,BZ
+3048296352,3048296383,CA
+3048296384,3048296751,BZ
+3048296752,3048296759,CA
+3048296760,3048299599,BZ
+3048299600,3048299607,BR
+3048299608,3048299655,BZ
+3048299656,3048299663,BR
+3048299664,3048300543,BZ
+3048300544,3048300863,US
+3048300864,3048300895,CA
+3048300896,3048301311,US
+3048301312,3048301343,CA
+3048301344,3048304639,US
+3048304640,3048308735,BZ
3048308736,3048325119,BO
3048325120,3048331263,AR
3048331264,3048332287,GY
@@ -73081,15 +75595,9 @@
3049111552,3049119743,AR
3049119744,3049127935,HN
3049127936,3049193471,CL
-3049193472,3049255935,PA
-3049255936,3049256959,US
-3049256960,3049259007,PA
-3049259008,3049283583,AR
-3049283584,3049291775,BZ
+3049259008,3049291775,AR
3049291776,3049324543,CO
-3049324544,3049362175,CR
-3049362176,3049362431,NI
-3049362432,3049521151,CR
+3049324544,3049521151,CR
3049521152,3049586687,EC
3049586688,3049635839,PA
3049635840,3049652223,AR
@@ -73112,8 +75620,7 @@
3050700816,3050701055,BR
3050701056,3050701311,DE
3050701312,3050701327,IE
-3050701328,3050701439,BR
-3050701440,3050701567,US
+3050701328,3050701567,BR
3050701568,3050701823,DE
3050701824,3050701839,SG
3050701840,3050702079,BR
@@ -73140,7 +75647,9 @@
3050705424,3050705663,BR
3050705664,3050705919,US
3050705920,3050705935,AU
-3050705936,3050706175,BR
+3050705936,3050705983,BR
+3050705984,3050706047,US
+3050706048,3050706175,BR
3050706176,3050706431,US
3050706432,3050706447,NL
3050706448,3050706687,BR
@@ -73158,41 +75667,42 @@
3050708496,3050708735,BR
3050708736,3050708991,US
3050708992,3050709007,AT
-3050709008,3050709119,BR
-3050709120,3050709247,US
+3050709008,3050709247,BR
3050709248,3050709503,DE
3050709504,3050709519,TH
-3050709520,3050709631,BR
-3050709632,3050709759,US
+3050709520,3050709759,BR
3050709760,3050710015,NL
3050710016,3050710031,ES
-3050710032,3050710079,BR
-3050710080,3050710527,US
+3050710032,3050710271,BR
+3050710272,3050710527,US
3050710528,3050710543,FR
-3050710544,3050710655,BR
-3050710656,3050711039,US
+3050710544,3050710783,BR
+3050710784,3050711039,US
3050711040,3050711055,AU
3050711056,3050711295,BR
3050711296,3050711551,US
3050711552,3050711567,EE
-3050711568,3050711807,BR
+3050711568,3050711615,BR
+3050711616,3050711679,US
+3050711680,3050711807,BR
3050711808,3050712063,US
3050712064,3050712079,FR
-3050712080,3050712127,BR
-3050712128,3050712575,US
+3050712080,3050712319,BR
+3050712320,3050712575,US
3050712576,3050712591,PL
3050712592,3050712831,BR
3050712832,3050713087,US
3050713088,3050713103,LV
-3050713104,3050713343,BR
-3050713344,3050713599,US
+3050713104,3050713215,BR
+3050713216,3050713599,US
3050713600,3050713855,NL
-3050713856,3050714111,BR
-3050714112,3050714367,US
+3050713856,3050714367,US
3050714368,3050714623,GB
3050714624,3050714879,BR
3050714880,3050715135,ES
-3050715136,3050748159,US
+3050715136,3050724351,US
+3050724352,3050724607,BG
+3050724608,3050748159,US
3050748160,3050748415,GB
3050748416,3050753023,US
3050753024,3050753279,BR
@@ -73215,8 +75725,8 @@
3050767888,3050768127,BR
3050768128,3050768383,US
3050768384,3050768399,AT
-3050768400,3050768511,BR
-3050768512,3050768895,US
+3050768400,3050768639,BR
+3050768640,3050768895,US
3050768896,3050768911,CZ
3050768912,3050769151,BR
3050769152,3050769407,US
@@ -73233,8 +75743,8 @@
3050770960,3050771199,BR
3050771200,3050771455,US
3050771456,3050771471,SG
-3050771472,3050771583,BR
-3050771584,3050771967,US
+3050771472,3050771711,BR
+3050771712,3050771967,US
3050771968,3050771983,EE
3050771984,3050772223,BR
3050772224,3050772479,US
@@ -73267,7 +75777,7 @@
3050776832,3050777087,US
3050777088,3050777103,AU
3050777104,3050777343,BR
-3050777344,3050777599,US
+3050777344,3050777599,RO
3050777600,3050777615,HK
3050777616,3050777855,BR
3050777856,3050778111,US
@@ -73276,7 +75786,23 @@
3050778368,3050778623,US
3050778624,3050778639,TR
3050778640,3050778879,BR
-3050778880,3050800383,US
+3050778880,3050789375,US
+3050789376,3050789503,BR
+3050789504,3050789631,US
+3050789632,3050789759,BR
+3050789760,3050789887,US
+3050789888,3050789967,BR
+3050789968,3050789968,US
+3050789969,3050790015,BR
+3050790016,3050790143,US
+3050790144,3050790271,BR
+3050790272,3050790399,US
+3050790400,3050790463,BR
+3050790464,3050790464,US
+3050790465,3050790527,BR
+3050790528,3050790655,US
+3050790656,3050790783,BR
+3050790784,3050800383,US
3050800384,3050800399,AL
3050800400,3050800415,AD
3050800416,3050800431,AI
@@ -73369,35 +75895,25 @@
3050805312,3050805375,FI
3050805376,3050805759,US
3050805760,3050805791,DK
-3050805792,3050816255,US
+3050805792,3050811391,US
+3050811392,3050811647,HK
+3050811648,3050816255,US
3050816256,3050816511,NL
-3050816512,3050829567,US
+3050816512,3050827263,US
+3050827264,3050827519,BR
+3050827520,3050829567,US
3050829568,3050829823,UA
3050829824,3050831871,US
3050831872,3051356159,BR
-3051356160,3051372543,CR
-3051372544,3051372799,PA
-3051372800,3051373055,CR
-3051373056,3051374591,PA
-3051374592,3051374847,CR
-3051374848,3051375871,PA
-3051375872,3051376895,CR
-3051376896,3051377151,PA
-3051377152,3051379455,CR
-3051379456,3051379711,PA
-3051379712,3051380735,CR
+3051356160,3051374335,CR
+3051374336,3051374591,PA
+3051374592,3051380735,CR
3051380736,3051388927,AR
-3051388928,3051389695,US
+3051388928,3051389183,PA
+3051389184,3051389439,NL
+3051389440,3051389695,PA
3051389696,3051389951,NL
-3051389952,3051390719,US
-3051390720,3051390975,NL
-3051390976,3051394047,US
-3051394048,3051394303,NL
-3051394304,3051395071,US
-3051395072,3051395583,NL
-3051395584,3051395839,PA
-3051395840,3051396351,US
-3051396352,3051397119,PA
+3051389952,3051397119,PA
3051397120,3051398143,CO
3051398144,3051399167,AR
3051399168,3051400191,DO
@@ -73416,7 +75932,6 @@
3051454464,3051456511,SV
3051456512,3051457535,AR
3051457536,3051460607,CL
-3051460608,3051462655,AR
3051462656,3051470847,PE
3051470848,3051479039,AR
3051479040,3051487231,CU
@@ -73424,29 +75939,7 @@
3051552768,3051618303,BO
3051618304,3051880447,AR
3051880448,3051913215,CO
-3051913216,3051963135,CR
-3051963136,3051963391,PA
-3051963392,3051964671,CR
-3051964672,3051964927,PA
-3051964928,3051965183,CR
-3051965184,3051965439,PA
-3051965440,3051965695,CR
-3051965696,3051965951,PA
-3051965952,3051968511,CR
-3051968512,3051968767,PA
-3051968768,3051969535,CR
-3051969536,3051969791,PA
-3051969792,3051971071,CR
-3051971072,3051971327,PA
-3051971328,3051971839,CR
-3051971840,3051972351,PA
-3051972352,3051973887,CR
-3051973888,3051974143,PA
-3051974144,3051974399,CR
-3051974400,3051974655,PA
-3051974656,3051976191,CR
-3051976192,3051976447,PA
-3051976448,3051983871,CR
+3051913216,3051983871,CR
3051983872,3051984895,BR
3051984896,3051995135,CR
3051995136,3052011519,PE
@@ -73690,13 +76183,12 @@
3078619136,3081437183,CN
3081437184,3081502719,MY
3081502720,3081764863,CN
-3081764864,3081844735,JP
-3081844736,3081846783,AU
+3081764864,3081842687,JP
+3081842688,3081846783,AU
3081846784,3081847807,TW
3081847808,3081848831,KR
3081848832,3081850879,SG
-3081850880,3081851391,HK
-3081851392,3081851903,SG
+3081850880,3081851903,HK
3081851904,3081852927,JP
3081852928,3081854975,HK
3081854976,3081859071,MN
@@ -73723,21 +76215,11 @@
3088449536,3088515071,TH
3088515072,3088629759,US
3088629760,3088633855,NL
-3088633856,3088654335,US
-3088654336,3088658431,NL
-3088658432,3088673535,US
-3088673536,3088673791,NL
-3088673792,3088686591,US
+3088633856,3088686591,US
3088686592,3088687103,NL
3088687104,3088701439,US
3088701440,3088702463,NL
-3088702464,3088708607,US
-3088708608,3088709631,NL
-3088709632,3088710655,US
-3088710656,3088711167,NL
-3088711168,3088753919,US
-3088753920,3088754175,NL
-3088754176,3088785407,US
+3088702464,3088785407,US
3088785408,3088786431,NL
3088786432,3088812031,US
3088812032,3088812799,NL
@@ -73748,24 +76230,22 @@
3088829952,3088830463,NL
3088830464,3088830975,US
3088830976,3088831487,NL
-3088831488,3088845311,US
-3088845312,3088845823,NL
-3088845824,3088856063,US
-3088856064,3088857599,NL
+3088831488,3088856063,US
+3088856064,3088856575,NL
+3088856576,3088857087,US
+3088857088,3088857599,NL
3088857600,3088858111,US
3088858112,3088858623,NL
-3088858624,3088861695,US
-3088861696,3088862719,NL
-3088862720,3088863231,US
+3088858624,3088863231,US
3088863232,3088863743,NL
3088863744,3088863999,US
3088864000,3088864255,NL
-3088864256,3088866303,US
-3088866304,3088866815,NL
-3088866816,3088867839,US
+3088864256,3088867839,US
3088867840,3088868351,NL
3088868352,3088868607,US
-3088868608,3088870143,NL
+3088868608,3088868863,NL
+3088868864,3088869375,US
+3088869376,3088870143,NL
3088870144,3088871423,US
3088871424,3088871935,NL
3088871936,3088880639,US
@@ -73776,9 +76256,7 @@
3088902144,3088902655,NL
3088902656,3088913663,US
3088913664,3088913919,NL
-3088913920,3088924671,US
-3088924672,3088925695,NL
-3088925696,3088998399,US
+3088913920,3088998399,US
3088998400,3089002495,NL
3089002496,3089027071,US
3089027072,3089031167,NL
@@ -73788,9 +76266,7 @@
3090292224,3090292735,NL
3090292736,3090325503,US
3090325504,3090329599,NL
-3090329600,3090387455,US
-3090387456,3090387711,NL
-3090387712,3090387967,US
+3090329600,3090387967,US
3090387968,3090388479,NL
3090388480,3090389503,US
3090389504,3090389631,CA
@@ -73806,15 +76282,9 @@
3091976192,3091980287,CA
3091980288,3092381695,US
3092381696,3092447231,TH
-3092447232,3092567039,US
-3092567040,3092568063,NL
-3092568064,3092572671,US
+3092447232,3092572671,US
3092572672,3092573183,NL
-3092573184,3092578303,US
-3092578304,3092582399,NL
-3092582400,3092615167,US
-3092615168,3092619263,NL
-3092619264,3092623359,US
+3092573184,3092623359,US
3092623360,3092627455,NL
3092627456,3092634367,US
3092634368,3092634623,NL
@@ -73841,14 +76311,14 @@
3092692992,3092697087,US
3092697088,3092697599,NL
3092697600,3092701183,US
-3092701184,3092703231,NL
-3092703232,3092704255,US
+3092701184,3092702207,NL
+3092702208,3092704255,US
3092704256,3092705279,NL
3092705280,3092754431,US
-3092754432,3092759039,NL
-3092759040,3092764671,US
-3092764672,3092766719,NL
-3092766720,3093168127,US
+3092754432,3092758527,NL
+3092758528,3092764671,US
+3092764672,3092766207,NL
+3092766208,3093168127,US
3093168128,3093200895,CA
3093200896,3093213183,US
3093213184,3093217279,CA
@@ -73891,8 +76361,8 @@
3096969216,3097143823,US
3097143824,3097143831,BD
3097143832,3097493503,US
-3097493504,3097755647,CA
-3097755648,3098095615,US
+3097493504,3097772031,CA
+3097772032,3098095615,US
3098095616,3098099711,CA
3098099712,3098099967,US
3098099968,3098100735,SE
@@ -73918,10 +76388,14 @@
3098181632,3098185727,CA
3098185728,3098263551,US
3098263552,3098271743,CA
-3098271744,3098411007,US
-3098411008,3098415103,PK
-3098415104,3098435583,US
-3098435584,3098437631,IL
+3098271744,3098412031,US
+3098412032,3098413055,CA
+3098413056,3098428415,US
+3098428416,3098428927,RU
+3098428928,3098429439,SE
+3098429440,3098431487,GB
+3098431488,3098436607,US
+3098436608,3098437631,IL
3098437632,3098476543,US
3098476544,3098492927,CA
3098492928,3098494719,US
@@ -74003,12 +76477,18 @@
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
3103916032,3103917055,CH
3103917056,3103918079,IT
3103918080,3103919103,DE
@@ -74175,16 +76655,7 @@
3104078848,3104079871,FR
3104079872,3104080895,GB
3104080896,3104081919,GR
-3104081920,3104082175,DK
-3104082176,3104082343,LU
-3104082344,3104082431,DK
-3104082432,3104082687,LU
-3104082688,3104082751,DK
-3104082752,3104082767,LU
-3104082768,3104082799,DK
-3104082800,3104082815,LU
-3104082816,3104082895,DK
-3104082896,3104082943,LU
+3104081920,3104082943,DK
3104082944,3104083967,IT
3104083968,3104084991,RU
3104084992,3104085247,NL
@@ -74480,7 +76951,8 @@
3104377856,3104378879,DE
3104378880,3104379215,GB
3104379216,3104379223,CZ
-3104379224,3104379647,GB
+3104379224,3104379391,GB
+3104379392,3104379647,CH
3104379648,3104379903,AT
3104379904,3104380927,FR
3104380928,3104381951,DK
@@ -74557,7 +77029,8 @@
3104457984,3104458495,DE
3104458496,3104459775,IR
3104459776,3104460799,IT
-3104460800,3104462847,ES
+3104460800,3104461823,ES
+3104461824,3104462847,CZ
3104462848,3104463871,GB
3104463872,3104464895,DE
3104464896,3104465919,NL
@@ -74589,7 +77062,11 @@
3104495616,3104496639,JO
3104496640,3104497663,DK
3104497664,3104498687,CH
-3104498688,3104500735,NL
+3104498688,3104498695,NL
+3104498696,3104498703,US
+3104498704,3104499391,NL
+3104499392,3104499399,US
+3104499400,3104500735,NL
3104500736,3104501759,CZ
3104501760,3104502783,LY
3104502784,3104503807,DE
@@ -74651,7 +77128,7 @@
3104558080,3104559103,GB
3104559104,3104560127,FI
3104560128,3104561151,TR
-3104561152,3104562175,FR
+3104561152,3104562175,NL
3104562176,3104563199,ES
3104563200,3104564223,IT
3104564224,3104565247,RU
@@ -74792,7 +77269,7 @@
3104703488,3104704511,RU
3104704512,3104705535,IT
3104705536,3104706559,DE
-3104706560,3104707583,UA
+3104706560,3104707583,RU
3104707584,3104708607,TR
3104708608,3104709631,ES
3104709632,3104710655,NL
@@ -74802,7 +77279,6 @@
3104714752,3104715775,DE
3104715776,3104716799,AT
3104716800,3104717823,ES
-3104717824,3104718847,GB
3104718848,3104719871,TR
3104719872,3104720895,RU
3104720896,3104721919,PL
@@ -74903,7 +77379,8 @@
3104818176,3104819199,TR
3104819200,3104820223,CH
3104820224,3104821247,GB
-3104821248,3104822271,RU
+3104821248,3104821503,RU
+3104821504,3104822271,NL
3104822272,3104823295,FI
3104823296,3104824319,NO
3104824320,3104825343,NL
@@ -74953,7 +77430,7 @@
3104868352,3104869375,RU
3104869376,3104870399,DK
3104870400,3104871423,PL
-3104871424,3104872447,CY
+3104871424,3104872447,RU
3104872448,3104873471,GB
3104873472,3104874495,DK
3104874496,3104875519,GB
@@ -75316,7 +77793,7 @@
3105233920,3105234943,IR
3105234944,3105235967,LB
3105235968,3105236991,IT
-3105236992,3105238015,GB
+3105236992,3105238015,FR
3105238016,3105239039,DE
3105239040,3105240063,FR
3105240064,3105241087,CH
@@ -75444,8 +77921,8 @@
3105374208,3105375231,GB
3105375232,3105375295,IT
3105375296,3105375327,DE
-3105375328,3105375367,CA
-3105375368,3105375375,DE
+3105375328,3105375359,CA
+3105375360,3105375375,DE
3105375376,3105375391,US
3105375392,3105375551,IT
3105375552,3105375615,DE
@@ -75546,7 +78023,7 @@
3105460224,3105461247,GB
3105461248,3105462271,PL
3105462272,3105463295,RU
-3105464320,3105465343,BE
+3105464320,3105465343,NL
3105465344,3105466367,DE
3105466368,3105467391,BE
3105467392,3105468415,GB
@@ -75581,7 +78058,7 @@
3105496064,3105497087,RU
3105497088,3105498111,IR
3105498112,3105499135,DE
-3105499136,3105501183,RU
+3105499136,3105500159,RU
3105501184,3105502207,FI
3105502208,3105503231,RU
3105503232,3105504255,NL
@@ -75754,7 +78231,9 @@
3105673216,3105674239,DE
3105674240,3105675263,GB
3105675264,3105676287,ES
-3105676288,3105678335,NL
+3105676288,3105677055,NL
+3105677056,3105677311,US
+3105677312,3105678335,NL
3105678336,3105679359,DE
3105679360,3105680383,FR
3105680384,3105681407,UA
@@ -75999,7 +78478,7 @@
3105925120,3105926143,BE
3105926144,3105927167,BA
3105927168,3105928191,IL
-3105928192,3105928447,ES
+3105928192,3105928447,NL
3105928448,3105929215,CZ
3105929216,3105930239,RU
3105930240,3105931263,PT
@@ -76054,9 +78533,10 @@
3105969664,3105969727,DE
3105969728,3105970175,GB
3105970176,3105971199,FR
-3105971200,3105972223,GB
+3105971200,3105972223,CN
3105972224,3105973247,DK
-3105973248,3105974271,US
+3105973248,3105974048,US
+3105974049,3105974271,NL
3105974272,3105975295,MD
3105975296,3105976319,TR
3105976320,3105977343,LB
@@ -76161,7 +78641,8 @@
3106061312,3106062335,NL
3106062336,3106063359,ES
3106063360,3106064383,DE
-3106064384,3106065407,NL
+3106064384,3106065151,NL
+3106065152,3106065407,MD
3106065408,3106066431,IT
3106066432,3106067455,GB
3106067456,3106068479,DE
@@ -76200,7 +78681,7 @@
3106104320,3106105343,UA
3106105344,3106106367,AE
3106106368,3106106623,US
-3106106624,3106107391,BG
+3106106624,3106107391,DE
3106107392,3106108415,NL
3106108416,3106110463,RU
3106110464,3106111487,GB
@@ -76424,7 +78905,9 @@
3106318336,3106319359,AT
3106319360,3106320383,DK
3106320384,3106321407,HR
-3106321408,3106322431,DK
+3106321408,3106321663,DK
+3106321664,3106321919,SE
+3106321920,3106322431,DK
3106322432,3106323455,ME
3106323456,3106324479,CZ
3106324480,3106325503,AL
@@ -76441,7 +78924,7 @@
3106333696,3106334719,GB
3106334720,3106335743,NL
3106335744,3106336767,NO
-3106336768,3106337791,US
+3106336768,3106337791,DE
3106337792,3106338815,GB
3106338816,3106339839,PL
3106339840,3106340863,IT
@@ -76576,7 +79059,6 @@
3106462720,3106463743,IT
3106463744,3106464767,IR
3106464768,3106465791,PL
-3106466048,3106466303,NL
3106466816,3106467839,EE
3106467840,3106468863,IR
3106468864,3106470911,DE
@@ -76715,7 +79197,8 @@
3106592768,3106593791,LU
3106593792,3106594815,GB
3106594816,3106595839,IR
-3106595840,3106596863,RU
+3106595840,3106596095,EE
+3106596096,3106596863,RU
3106596864,3106597887,FR
3106597888,3106598911,GB
3106598912,3106599935,ES
@@ -76946,7 +79429,8 @@
3106821760,3106821887,CN
3106821888,3106822015,RU
3106822016,3106822143,JP
-3106822144,3106824191,CH
+3106822144,3106823167,CH
+3106823168,3106824191,PL
3106824192,3106825215,RU
3106825216,3106826239,IT
3106826240,3106827263,PL
@@ -77298,7 +79782,8 @@
3107173376,3107174399,PL
3107174400,3107175423,DE
3107175424,3107176447,HU
-3107176448,3107177471,NL
+3107176448,3107176703,NL
+3107176704,3107177471,GB
3107177472,3107178495,AT
3107178496,3107179519,IR
3107179520,3107180543,SA
@@ -77307,7 +79792,9 @@
3107182592,3107183615,FR
3107183616,3107184639,IQ
3107184640,3107185663,SE
-3107185664,3107186687,CZ
+3107185664,3107185919,GB
+3107185920,3107186431,US
+3107186432,3107186687,GB
3107186688,3107187711,NO
3107187712,3107188735,MT
3107188736,3107189759,CZ
@@ -77424,7 +79911,10 @@
3107307520,3107308543,IT
3107308544,3107310591,RO
3107310592,3107311615,DE
-3107311616,3107312639,IL
+3107311616,3107311871,IL
+3107311872,3107312127,US
+3107312128,3107312383,FR
+3107312384,3107312639,IL
3107312640,3107313663,SE
3107313664,3107315711,DE
3107315712,3107316735,GB
@@ -77907,7 +80397,7 @@
3107788800,3107789823,RU
3107789824,3107791871,DE
3107791872,3107792895,RU
-3107792896,3107793919,AT
+3107792896,3107793919,DE
3107793920,3107794943,TR
3107794944,3107795967,LB
3107795968,3107796991,NL
@@ -78109,7 +80599,7 @@
3108001792,3108002815,GB
3108002816,3108003839,RO
3108003840,3108004863,DE
-3108004864,3108005887,GB
+3108004864,3108005887,US
3108005888,3108006911,LT
3108006912,3108007935,NL
3108007936,3108008959,DE
@@ -78254,7 +80744,9 @@
3108149248,3108150271,FR
3108150272,3108151295,CH
3108151296,3108152319,CY
-3108152320,3108153343,GB
+3108152320,3108152575,GB
+3108152576,3108152831,DE
+3108152832,3108153343,GB
3108153344,3108154367,NL
3108154368,3108155391,ES
3108155392,3108156415,DE
@@ -78333,7 +80825,7 @@
3108237312,3108238335,LT
3108238336,3108239359,RU
3108239360,3108240383,GB
-3108240384,3108240639,CZ
+3108240384,3108240639,UA
3108240640,3108240895,RU
3108240896,3108241407,CZ
3108241408,3108242431,GB
@@ -78728,12 +81220,12 @@
3108647936,3108648959,FR
3108648960,3108649983,IM
3108649984,3108651007,CZ
-3108651008,3108651519,DE
-3108651520,3108651775,US
-3108651776,3108652031,DE
+3108651008,3108652031,DE
3108652032,3108653055,CH
3108653056,3108654079,GI
-3108654080,3108655103,NL
+3108654080,3108654591,NL
+3108654592,3108654847,GB
+3108654848,3108655103,NL
3108655104,3108656127,ES
3108656128,3108657151,PL
3108657152,3108658175,RS
@@ -78912,9 +81404,7 @@
3108850688,3108851711,PL
3108851712,3108852039,GB
3108852040,3108852047,IT
-3108852048,3108852079,GB
-3108852080,3108852087,IT
-3108852088,3108852735,GB
+3108852048,3108852735,GB
3108852736,3108853759,IT
3108853760,3108854783,TR
3108854784,3108855807,CH
@@ -78944,7 +81434,9 @@
3108873984,3108874111,SG
3108874112,3108874239,ID
3108874240,3108875263,ES
-3108875264,3108876287,GB
+3108875264,3108875439,GB
+3108875440,3108875447,IT
+3108875448,3108876287,GB
3108876288,3108877311,ES
3108877312,3108878335,FR
3108878336,3108879359,ES
@@ -78960,8 +81452,7 @@
3108889600,3108893695,RU
3108893696,3108894719,FI
3108894720,3108894975,IL
-3108894976,3108895231,RO
-3108895232,3108895743,GB
+3108894976,3108895743,US
3108895744,3108896767,AT
3108896768,3108897791,ES
3108897792,3108899839,GB
@@ -79369,8 +81860,7 @@
3109280768,3109281791,IL
3109281792,3109282815,HU
3109282816,3109283839,DE
-3109283840,3109284095,PL
-3109284096,3109284863,IE
+3109283840,3109284863,IE
3109284864,3109285887,FR
3109285888,3109286911,RU
3109286912,3109287935,TR
@@ -79517,7 +82007,9 @@
3109430272,3109431295,IR
3109431296,3109431807,IL
3109431808,3109432319,IT
-3109432320,3109433343,MT
+3109432320,3109432831,MT
+3109432832,3109433087,SE
+3109433088,3109433343,MT
3109433344,3109435391,FR
3109435392,3109436415,UA
3109436416,3109437439,SM
@@ -79746,8 +82238,9 @@
3109673216,3109673439,SE
3109673451,3109673451,NO
3109673456,3109673471,SE
-3109673472,3109673695,GB
+3109673472,3109673703,GB
3109673704,3109673704,IN
+3109673705,3109673727,GB
3109673728,3109673983,AU
3109673984,3109675007,FR
3109675008,3109677055,DE
@@ -79772,7 +82265,7 @@
3109692416,3109693439,CH
3109693440,3109694463,AT
3109694464,3109695487,CY
-3109695488,3109696511,DE
+3109695488,3109696511,GB
3109696512,3109697535,DK
3109697536,3109698559,PT
3109698560,3109699071,NO
@@ -79838,8 +82331,6 @@
3109763072,3109765119,IT
3109765120,3109766143,NO
3109766144,3109767167,ES
-3109767168,3109767935,UA
-3109767936,3109768191,NL
3109768192,3109769215,GB
3109769216,3109770239,AT
3109770240,3109771263,GB
@@ -79856,7 +82347,7 @@
3109783552,3109784575,ES
3109784576,3109785599,HU
3109785600,3109786623,AT
-3109786624,3109787647,US
+3109786624,3109787647,IT
3109787648,3109788671,NO
3109788672,3109789695,BA
3109789696,3109790719,IT
@@ -79885,7 +82376,9 @@
3109818368,3109819391,NL
3109819392,3109820415,FR
3109820416,3109820671,US
-3109820672,3109821439,GB
+3109820672,3109820927,GB
+3109820928,3109821183,CA
+3109821184,3109821439,GB
3109821440,3109822463,SY
3109822464,3109823487,RU
3109823488,3109824511,FR
@@ -79911,11 +82404,12 @@
3109844992,3109845503,DE
3109845504,3109845759,GB
3109845760,3109846015,DE
-3109846016,3109847039,GB
+3109846016,3109847039,CH
3109847040,3109848063,AE
3109848064,3109849087,BG
3109849088,3109852159,RU
-3109852160,3109854207,DE
+3109852160,3109853183,NL
+3109853184,3109854207,DE
3109854208,3109855231,PL
3109855232,3109856255,DE
3109856256,3109857279,IT
@@ -79942,7 +82436,8 @@
3109877760,3109878783,PL
3109878784,3109879807,GB
3109879808,3109880319,US
-3109880320,3109880831,CZ
+3109880320,3109880575,CZ
+3109880576,3109880831,ES
3109880832,3109881855,FR
3109881856,3109882879,AT
3109882880,3109883903,NL
@@ -80637,7 +83132,8 @@
3110540288,3110541311,LB
3110541312,3110542335,RU
3110542336,3110543359,HK
-3110543360,3110545407,NL
+3110543360,3110544383,NL
+3110544384,3110545407,ES
3110545408,3110546431,UA
3110546432,3110547455,DE
3110547456,3110547967,SE
@@ -81079,12 +83575,13 @@
3111024640,3111025663,AT
3111025664,3111026687,DE
3111026688,3111027967,RU
-3111027968,3111028223,GB
-3111028224,3111028735,UA
+3111027968,3111028735,UA
3111028736,3111029759,AT
3111029760,3111031807,SK
3111031808,3111032831,NO
-3111032832,3111033855,DE
+3111032832,3111033343,DE
+3111033344,3111033599,CH
+3111033600,3111033855,DE
3111033856,3111035903,ES
3111035904,3111036927,GE
3111036928,3111037951,RU
@@ -81129,7 +83626,7 @@
3111079936,3111080959,NL
3111080960,3111081983,RU
3111081984,3111083007,HU
-3111083008,3111084031,UA
+3111083008,3111084031,CA
3111084032,3111085055,CZ
3111085056,3111086079,RU
3111086080,3111087103,KZ
@@ -81312,7 +83809,7 @@
3111268352,3111269375,BE
3111269376,3111270399,RO
3111270400,3111271423,NO
-3111271424,3111272447,NL
+3111271424,3111272447,GB
3111272448,3111273471,ES
3111273472,3111274495,SA
3111274496,3111275519,IR
@@ -81391,8 +83888,7 @@
3111343104,3111344127,GB
3111344128,3111344383,NL
3111344384,3111344639,DE
-3111344640,3111344895,NL
-3111344896,3111345151,US
+3111344640,3111345151,US
3111345152,3111346175,RO
3111346176,3111347199,RU
3111347200,3111348223,LB
@@ -81485,7 +83981,7 @@
3111444480,3111445503,SA
3111445504,3111446527,RU
3111446528,3111447551,DE
-3111447552,3111447775,GB
+3111447552,3111447775,NL
3111447776,3111447807,AT
3111447808,3111448063,GB
3111448064,3111448319,BG
@@ -81513,9 +84009,7 @@
3111467008,3111469055,FR
3111469056,3111470079,EE
3111470080,3111471103,AE
-3111471104,3111471359,NL
-3111471360,3111471615,RO
-3111471616,3111473151,NL
+3111471104,3111473151,NL
3111473152,3111474175,BG
3111474176,3111475199,PL
3111475200,3111475711,SE
@@ -81688,7 +84182,8 @@
3111653120,3111653375,DK
3111653376,3111654399,RO
3111654400,3111654911,GB
-3111654912,3111655423,FR
+3111654912,3111655167,DE
+3111655168,3111655423,FR
3111655424,3111656447,NO
3111656448,3111657471,LB
3111657472,3111658239,GB
@@ -81778,7 +84273,8 @@
3111752704,3111753727,IT
3111753728,3111754751,BG
3111754752,3111755775,IT
-3111755776,3111756799,NO
+3111755776,3111756543,NO
+3111756544,3111756799,US
3111756800,3111757823,NL
3111757824,3111758335,NZ
3111758336,3111758591,NL
@@ -81787,7 +84283,7 @@
3111759872,3111760127,IS
3111760128,3111760383,AQ
3111760384,3111760639,GB
-3111760640,3111760895,IS
+3111760640,3111760895,LT
3111760896,3111761919,NL
3111761920,3111762943,SY
3111762944,3111763967,NL
@@ -81877,8 +84373,7 @@
3111853056,3111854079,GP
3111854080,3111855103,NO
3111855104,3111856127,IT
-3111856128,3111857151,KZ
-3111857152,3111858175,RU
+3111856128,3111858175,RU
3111858176,3111859199,PL
3111859200,3111860223,EE
3111860224,3111861247,ES
@@ -81904,7 +84399,7 @@
3111882752,3111886847,GB
3111886848,3111887871,PL
3111887872,3111888895,RU
-3111888896,3111889919,DE
+3111888896,3111889919,IE
3111889920,3111890943,RU
3111890944,3111891967,AT
3111891968,3111892991,FR
@@ -81994,7 +84489,7 @@
3111990272,3111991295,FR
3111991296,3111992319,RU
3111992320,3111993343,RS
-3111993344,3111994367,GB
+3111993344,3111994367,US
3111994368,3111995391,IT
3111995392,3111996415,RU
3111996416,3111997439,ES
@@ -82289,7 +84784,7 @@
3112268800,3112269823,IR
3112269824,3112270847,RS
3112270848,3112271871,IR
-3112271872,3112272895,RU
+3112271872,3112272895,UA
3112272896,3112273919,IE
3112273920,3112274943,CZ
3112274944,3112275967,IR
@@ -82942,7 +85437,9 @@
3112973312,3112973567,SE
3112973568,3112973823,DE
3112973824,3112974079,UA
-3112974080,3112974335,SE
+3112974080,3112974083,HU
+3112974084,3112974087,AT
+3112974088,3112974335,HU
3112974336,3112975359,IR
3112975360,3112977407,ES
3112977408,3112978431,FR
@@ -82955,8 +85452,7 @@
3112984576,3112985599,AE
3112985600,3112986623,PL
3112986624,3112987647,DE
-3112987648,3112988671,HU
-3112988672,3112988927,AT
+3112987648,3112988927,HU
3112988928,3112989183,NL
3112989184,3112989439,ES
3112989440,3112989695,AT
@@ -83032,7 +85528,9 @@
3113064448,3113065471,SE
3113065472,3113066495,NO
3113066496,3113067519,LT
-3113067520,3113068543,DE
+3113067520,3113067935,DE
+3113067936,3113067936,US
+3113067937,3113068543,DE
3113068544,3113069567,IR
3113069568,3113070591,IT
3113070592,3113071615,GB
@@ -83093,8 +85591,8 @@
3113123840,3113124863,GB
3113124864,3113125887,RU
3113125888,3113126911,FR
-3113126912,3113127167,US
-3113127168,3113127423,NL
+3113126912,3113127167,NL
+3113127168,3113127423,GB
3113127424,3113127935,AT
3113127936,3113128959,NL
3113128960,3113129983,CH
@@ -83219,7 +85717,11 @@
3113246976,3113247231,RU
3113247232,3113247487,FR
3113247488,3113247743,RU
-3113247744,3113248767,GB
+3113247744,3113247999,US
+3113248000,3113248031,DE
+3113248032,3113248063,US
+3113248064,3113248255,DE
+3113248256,3113248767,GB
3113248768,3113249791,NL
3113249792,3113250815,GB
3113250816,3113251839,FR
@@ -83261,8 +85763,7 @@
3113287680,3113288703,AL
3113288704,3113289727,EE
3113289728,3113290751,IR
-3113290752,3113291775,GB
-3113291776,3113292799,NL
+3113290752,3113292799,NL
3113292800,3113293823,AT
3113293824,3113294847,NL
3113294848,3113295871,IL
@@ -83406,7 +85907,9 @@
3113425152,3113425407,SK
3113425408,3113425919,CZ
3113425920,3113426943,KW
-3113426944,3113427967,IM
+3113426944,3113427455,IM
+3113427456,3113427711,NL
+3113427712,3113427967,US
3113427968,3113428991,RU
3113428992,3113430015,IR
3113430016,3113431039,CZ
@@ -83452,10 +85955,9 @@
3113470976,3113471999,FR
3113472000,3113473023,GB
3113473024,3113473279,FR
-3113473280,3113473535,GB
+3113473280,3113473535,SE
3113473536,3113473791,ES
-3113473792,3113474047,GB
-3113474048,3113475071,DE
+3113473792,3113475071,DE
3113475072,3113479167,FR
3113479168,3113480191,SE
3113480192,3113481215,FR
@@ -83529,8 +86031,7 @@
3113552896,3113553919,UA
3113553920,3113554943,NO
3113554944,3113555967,UA
-3113555968,3113556223,NL
-3113556224,3113556991,BZ
+3113555968,3113556991,NL
3113556992,3113558015,DE
3113558016,3113559039,IT
3113559040,3113560063,NL
@@ -83801,7 +86302,7 @@
3113759744,3113760767,FR
3113760768,3113761791,BE
3113761792,3113762815,ES
-3113762816,3113763327,SK
+3113762816,3113763327,CZ
3113763328,3113763839,US
3113763840,3113764863,VA
3113764864,3113765887,IE
@@ -83818,8 +86319,7 @@
3113777152,3113778175,PL
3113778176,3113779199,TR
3113779200,3113780223,GB
-3113780224,3113780479,KZ
-3113780480,3113781247,RU
+3113780224,3113781247,RU
3113781248,3113782271,BY
3113782272,3113783295,IT
3113783296,3113784319,TR
@@ -83889,7 +86389,9 @@
3113853952,3113854975,US
3113854976,3113855999,ES
3113856000,3113857023,GB
-3113857024,3113858047,DE
+3113857024,3113857279,BR
+3113857280,3113857535,MX
+3113857536,3113858047,DE
3113858048,3113859071,UA
3113859072,3113860095,IR
3113860096,3113861119,NL
@@ -83912,8 +86414,7 @@
3113877504,3113878527,ES
3113878528,3113879551,US
3113879552,3113880575,ES
-3113880576,3113880831,NL
-3113880832,3113881599,UA
+3113880576,3113881599,NL
3113881600,3113882623,RO
3113882624,3113883647,RU
3113883648,3113884671,ES
@@ -83956,7 +86457,7 @@
3113922560,3113923583,DK
3113923584,3113924607,UA
3113924608,3113925631,IR
-3113925632,3113926655,KW
+3113925632,3113926655,DE
3113926656,3113927679,RU
3113927680,3113928703,ES
3113928704,3113929727,RU
@@ -84166,7 +86667,6 @@
3114141696,3114142719,ES
3114142720,3114143743,DE
3114143744,3114144767,AT
-3114144768,3114145791,FR
3114145792,3114146815,AT
3114146816,3114147839,IT
3114147840,3114148863,SY
@@ -84210,7 +86710,7 @@
3114173680,3114173695,GB
3114173696,3114174463,DE
3114174464,3114175231,NL
-3114175232,3114175487,HU
+3114175232,3114175487,US
3114175488,3114176511,IT
3114176512,3114177535,NL
3114177536,3114177775,DE
@@ -84243,8 +86743,7 @@
3114199040,3114201087,IT
3114201088,3114203135,GB
3114203136,3114203391,RO
-3114203392,3114203647,NL
-3114203648,3114203903,GB
+3114203392,3114203903,NL
3114203904,3114204159,DE
3114204160,3114205183,ES
3114205184,3114206207,IT
@@ -84404,7 +86903,10 @@
3114359808,3114360831,PL
3114360832,3114361855,ES
3114361856,3114362879,CH
-3114362880,3114363903,NL
+3114362880,3114363135,NL
+3114363136,3114363391,DE
+3114363392,3114363647,GB
+3114363648,3114363903,NL
3114363904,3114364927,TR
3114364928,3114365951,IR
3114365952,3114366975,ES
@@ -84429,7 +86931,9 @@
3114384384,3114385407,GB
3114385408,3114386431,IT
3114386432,3114387455,NL
-3114387456,3114388479,US
+3114387456,3114387711,JP
+3114387712,3114387967,AU
+3114387968,3114388479,US
3114388480,3114389503,HU
3114389504,3114390527,NL
3114390528,3114391551,SE
@@ -84442,11 +86946,11 @@
3114397696,3114398719,CZ
3114398720,3114399743,AT
3114399744,3114400767,GB
-3114400768,3114401023,SK
-3114401024,3114401791,CZ
+3114400768,3114401791,CZ
3114401792,3114402815,HU
3114402816,3114403839,CZ
-3114403840,3114404863,BG
+3114403840,3114404351,NL
+3114404352,3114404863,BG
3114404864,3114405887,RU
3114405888,3114406911,CY
3114406912,3114407935,UA
@@ -84477,9 +86981,7 @@
3114421248,3114422271,SK
3114422272,3114423295,FR
3114423296,3114424319,MD
-3114424320,3114424575,NL
-3114424576,3114424831,GB
-3114424832,3114425343,NL
+3114424320,3114425343,NL
3114425344,3114426367,RU
3114426368,3114427391,PL
3114427392,3114428415,GB
@@ -84543,7 +87045,8 @@
3114488832,3114489855,SE
3114489856,3114490879,IR
3114490880,3114491903,CH
-3114491904,3114492927,GB
+3114491904,3114492159,US
+3114492160,3114492927,GB
3114492928,3114493951,NL
3114493952,3114495999,RO
3114496000,3114497023,DE
@@ -84681,7 +87184,7 @@
3114616832,3114617855,DK
3114617856,3114618879,GB
3114618880,3114619903,SE
-3114619904,3114620927,DE
+3114619904,3114620927,US
3114620928,3114621951,IT
3114621952,3114622975,PT
3114622976,3114623999,BG
@@ -84711,8 +87214,7 @@
3114649600,3114650623,RU
3114650624,3114651647,IR
3114651648,3114652671,CH
-3114652672,3114653695,US
-3114653696,3114654719,DE
+3114652672,3114654719,US
3114654720,3114655743,BG
3114655744,3114656767,RU
3114656768,3114657791,DE
@@ -84781,7 +87283,7 @@
3114726400,3114727423,SE
3114727424,3114728447,BE
3114728448,3114729471,GB
-3114729472,3114730495,RO
+3114729472,3114730495,AU
3114730496,3114731519,GB
3114731520,3114732543,CH
3114732544,3114733567,SY
@@ -84794,7 +87296,8 @@
3114742784,3114743807,IR
3114743808,3114744831,MD
3114744832,3114745855,TR
-3114745856,3114747903,RO
+3114745856,3114746879,CA
+3114746880,3114747903,FR
3114747904,3114748927,IR
3114748928,3114749951,GB
3114749952,3114750975,CH
@@ -84831,9 +87334,7 @@
3114781696,3114782719,NL
3114782720,3114783743,CZ
3114783744,3114784767,PL
-3114784768,3114785023,RU
-3114785024,3114785279,BZ
-3114785280,3114785791,RU
+3114784768,3114785791,RU
3114785792,3114786815,FR
3114786816,3114787839,RU
3114787840,3114788863,GB
@@ -84909,10 +87410,10 @@
3114862592,3114863615,AT
3114863616,3114864639,DK
3114864640,3114865663,UA
-3114865664,3114866687,US
+3114865664,3114866687,IR
3114866688,3114867711,IT
3114867712,3114869759,GB
-3114869760,3114870783,US
+3114869760,3114870783,IR
3114870784,3114871807,SE
3114871808,3114872831,IT
3114872832,3114873855,MD
@@ -84927,7 +87428,9 @@
3114882048,3114883071,CH
3114883072,3114884095,FR
3114884096,3114885119,CH
-3114885120,3114886143,PT
+3114885120,3114885375,PT
+3114885376,3114885631,DE
+3114885632,3114886143,PT
3114886144,3114887167,RU
3114887168,3114888191,DE
3114888192,3114890239,NL
@@ -84958,16 +87461,15 @@
3114915840,3114916863,RU
3114916864,3114917887,LB
3114917888,3114918911,IT
-3114918912,3114919423,CH
-3114919424,3114919679,UA
-3114919680,3114919935,CH
+3114918912,3114919935,CH
3114919936,3114920703,GB
3114920704,3114920959,NL
3114920960,3114921983,IT
3114921984,3114923007,CH
3114923008,3114924031,GB
3114924032,3114925055,HU
-3114925056,3114926079,DE
+3114925056,3114925311,US
+3114925312,3114926079,DE
3114926080,3114927103,RU
3114927104,3114928127,NL
3114928128,3114929151,GB
@@ -85021,7 +87523,11 @@
3114977280,3114978303,PL
3114978304,3114979327,RU
3114979328,3114980351,NL
-3114980352,3114984447,RO
+3114980352,3114981375,DE
+3114981376,3114982399,PL
+3114982400,3114983423,JP
+3114983424,3114983679,RO
+3114983680,3114984447,PL
3114984448,3114985471,CZ
3114985472,3114986495,CY
3114986496,3114987519,IR
@@ -85096,7 +87602,7 @@
3115058176,3115059199,BE
3115059200,3115060223,DE
3115060224,3115062271,FR
-3115062272,3115063295,GB
+3115062272,3115063295,US
3115063296,3115064319,EE
3115064320,3115066367,MD
3115066368,3115067391,NL
@@ -85129,10 +87635,13 @@
3115092992,3115094015,IT
3115094016,3115094527,DE
3115094528,3115095039,NL
-3115095040,3115096063,DE
+3115095040,3115095551,DE
+3115095552,3115096063,CH
3115096064,3115097087,FR
3115097088,3115098111,LT
-3115098112,3115100159,NL
+3115098112,3115099391,NL
+3115099392,3115099647,US
+3115099648,3115100159,NL
3115100160,3115101183,ES
3115101184,3115102207,GB
3115102208,3115103231,ES
@@ -85161,7 +87670,9 @@
3115127808,3115128831,NL
3115128832,3115129855,DE
3115129856,3115130879,BA
-3115130880,3115131903,DE
+3115130880,3115131234,DE
+3115131235,3115131235,US
+3115131236,3115131903,DE
3115131904,3115132927,RU
3115132928,3115133951,KW
3115133952,3115134975,ES
@@ -85206,9 +87717,9 @@
3115176960,3115177983,IT
3115177984,3115179007,NL
3115179008,3115180031,SE
-3115180032,3115180799,DE
-3115180800,3115181055,MT
-3115181056,3115182079,DE
+3115180032,3115180543,DE
+3115180544,3115180799,CY
+3115180800,3115182079,DE
3115182080,3115183103,NL
3115183104,3115184127,IT
3115184128,3115185151,DE
@@ -85222,7 +87733,8 @@
3115192320,3115193343,HU
3115193344,3115194367,TR
3115194368,3115195391,FI
-3115195392,3115196415,DE
+3115195392,3115195647,TR
+3115195648,3115196415,DE
3115196416,3115197439,LI
3115197440,3115198463,DE
3115198464,3115199487,NL
@@ -85240,7 +87752,7 @@
3115210752,3115211775,FR
3115211776,3115212799,CZ
3115212800,3115213823,GE
-3115213824,3115214847,UA
+3115213824,3115214847,US
3115214848,3115215871,CH
3115215872,3115216895,GB
3115216896,3115217919,PL
@@ -85319,7 +87831,9 @@
3115290624,3115291647,GB
3115291648,3115292671,FR
3115292672,3115293695,GB
-3115293696,3115294719,RU
+3115293696,3115293951,US
+3115293952,3115294463,RU
+3115294464,3115294719,IN
3115294720,3115295743,GB
3115295744,3115296767,NL
3115296768,3115297791,IE
@@ -85389,7 +87903,7 @@
3115366400,3115367423,SE
3115367424,3115368447,ES
3115368448,3115369471,BG
-3115369472,3115370495,GB
+3115369472,3115370495,MT
3115370496,3115371519,IT
3115371520,3115372543,GB
3115372544,3115373567,LB
@@ -85401,19 +87915,22 @@
3115378688,3115379711,FR
3115379712,3115380735,CH
3115380736,3115381759,GB
-3115381760,3115382783,NO
+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,3115391999,GB
+3115389952,3115390719,GB
+3115390720,3115390975,NL
+3115390976,3115391999,GB
3115392000,3115393023,AL
3115393024,3115395071,IT
3115395072,3115396095,ES
3115396096,3115397119,FR
-3115397120,3115398143,GB
+3115397120,3115398143,MT
3115398144,3115399167,RU
3115399168,3115400191,BG
3115400192,3115401215,RU
@@ -85460,7 +87977,7 @@
3115441152,3115442175,NL
3115442176,3115443199,FR
3115443200,3115444223,GB
-3115444224,3115445247,US
+3115444224,3115445247,IR
3115445248,3115446271,RU
3115446272,3115447295,UA
3115447296,3115448319,IT
@@ -85592,15 +88109,14 @@
3115582464,3115583487,GB
3115583488,3115584511,NL
3115584512,3115584767,AT
-3115584768,3115585535,CZ
+3115584768,3115585023,US
+3115585024,3115585535,CZ
3115585536,3115586559,RU
3115586560,3115587583,CH
3115587584,3115588607,DE
3115588608,3115589631,TR
3115589632,3115590655,GB
-3115590656,3115591167,GR
-3115591168,3115591183,DE
-3115591184,3115591423,GR
+3115590656,3115591423,GR
3115591424,3115591679,NL
3115591680,3115592703,CH
3115592704,3115593727,BE
@@ -85640,8 +88156,8 @@
3115628544,3115629567,GB
3115629568,3115630591,RU
3115630592,3115631615,GB
-3115631616,3115631871,US
-3115631872,3115632639,NL
+3115631616,3115631871,NL
+3115631872,3115632639,US
3115632640,3115633663,RU
3115633664,3115635711,PL
3115635712,3115636735,RU
@@ -85656,7 +88172,8 @@
3115644928,3115645951,RU
3115645952,3115647999,SE
3115648000,3115649023,FR
-3115649024,3115650047,NL
+3115649280,3115649535,GB
+3115649536,3115649791,DE
3115650048,3115651071,DE
3115651072,3115652095,UA
3115652096,3115653119,DK
@@ -85713,7 +88230,7 @@
3115708416,3115709439,RO
3115709440,3115710463,RU
3115710464,3115711487,GE
-3115711488,3115714559,BG
+3115711488,3115714559,ES
3115714560,3115715583,GB
3115715584,3115717631,RU
3115717632,3115718655,UA
@@ -85726,9 +88243,7 @@
3115725312,3115725567,DE
3115725568,3115726847,GB
3115726848,3115727871,NL
-3115727872,3115728127,GB
-3115728128,3115728383,US
-3115728384,3115728703,GB
+3115727872,3115728703,GB
3115728704,3115728735,NL
3115728736,3115728895,GB
3115728896,3115729919,FR
@@ -85801,8 +88316,7 @@
3115801600,3115802623,LB
3115802624,3115802879,NL
3115802880,3115803135,RO
-3115803136,3115803391,NL
-3115803392,3115803647,RO
+3115803136,3115803647,NL
3115803648,3115804671,GB
3115804672,3115804927,CH
3115804928,3115805183,IT
@@ -85871,8 +88385,7 @@
3115869184,3115870207,DE
3115870208,3115871231,SY
3115871232,3115872255,NL
-3115872256,3115872511,PL
-3115872512,3115873279,GB
+3115872256,3115873279,GB
3115873280,3115874303,CH
3115874304,3115875327,GB
3115875328,3115876351,PL
@@ -85971,7 +88484,8 @@
3115973632,3115974655,UA
3115974656,3115975679,RU
3115975680,3115976703,GB
-3115976704,3115977727,NL
+3115976704,3115977215,US
+3115977216,3115977727,NL
3115977728,3115978751,IT
3115978752,3115980799,PL
3115980800,3115981823,DE
@@ -86006,7 +88520,8 @@
3116008448,3116009471,NO
3116009472,3116010495,BG
3116010496,3116011519,RU
-3116011520,3116012543,DE
+3116011520,3116012031,DE
+3116012032,3116012543,US
3116012544,3116013567,BE
3116013568,3116015615,PL
3116015616,3116016639,CZ
@@ -86091,9 +88606,8 @@
3116102656,3116103679,FR
3116103680,3116104703,HU
3116104704,3116105727,SE
-3116105728,3116106751,DE
-3116106752,3116107007,US
-3116107008,3116107263,JP
+3116105728,3116107007,DE
+3116107008,3116107263,US
3116107264,3116107775,DE
3116107776,3116108799,ES
3116108800,3116109823,RU
@@ -86105,9 +88619,11 @@
3116114944,3116115967,TR
3116115968,3116116991,NL
3116116992,3116118015,CH
-3116118016,3116120063,DE
+3116118016,3116119039,DE
+3116119040,3116119295,AT
+3116119296,3116120063,DE
3116120064,3116121087,HU
-3116121088,3116122111,GB
+3116121344,3116122111,PT
3116122112,3116123135,DE
3116123136,3116124159,PL
3116124160,3116125183,DE
@@ -86140,10 +88656,960 @@
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,3116170239,DE
+3116170240,3116171263,GB
+3116171264,3116172287,DE
+3116172288,3116173311,CZ
+3116173312,3116174335,NL
+3116174336,3116176383,RU
+3116176384,3116177407,FR
+3116177408,3116178431,DE
+3116178432,3116179455,SE
+3116179456,3116180479,CZ
+3116180480,3116181503,RO
+3116181504,3116182527,GB
+3116182528,3116183551,RO
+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,NL
+3116241152,3116241407,FR
+3116241408,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,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,US
+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,DE
+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,RO
+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,3116382719,RU
+3116382720,3116382975,AQ
+3116382976,3116383231,SC
+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,DE
+3116393472,3116394495,PL
+3116394496,3116395519,NL
+3116395520,3116396543,RU
+3116396544,3116397567,IR
+3116397568,3116398591,ES
+3116398592,3116399615,RO
+3116399616,3116399871,IL
+3116399872,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,3116443135,GB
+3116443136,3116443391,FR
+3116443392,3116443647,AT
+3116443648,3116444671,DE
+3116444672,3116445695,FR
+3116445696,3116447743,RO
+3116447744,3116448767,BG
+3116448768,3116449791,EE
+3116449792,3116450815,DE
+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,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,3116526335,RU
+3116526336,3116526591,GB
+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,3116547071,FR
+3116547072,3116548095,UA
+3116548096,3116549119,NL
+3116549120,3116550143,TJ
+3116550144,3116551167,IT
+3116551168,3116552191,FR
+3116552192,3116553215,ES
+3116553216,3116554239,PL
+3116554240,3116555263,DE
+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,RO
+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,3116607743,IL
+3116607744,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,3116625919,GL
+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,3116636159,DE
+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,NL
+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,DE
+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,3116703743,DE
+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,CH
+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
+3116741632,3116742655,PL
+3116742656,3116743679,FR
+3116743680,3116744703,NL
+3116744704,3116745727,DE
+3116745728,3116746751,TR
+3116746752,3116747775,ES
+3116747776,3116748031,IL
+3116748032,3116748287,US
+3116748288,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,DE
+3116760064,3116761087,FR
+3116761088,3116762111,PL
+3116762112,3116763135,SE
+3116763136,3116763146,US
+3116763147,3116763166,GB
+3116763167,3116763167,FR
+3116763168,3116763168,AU
+3116763169,3116763177,US
+3116763178,3116763178,FR
+3116763179,3116763182,US
+3116763183,3116763183,FR
+3116763184,3116763189,US
+3116763190,3116763190,FR
+3116763191,3116763193,US
+3116763194,3116763194,FR
+3116763195,3116763196,US
+3116763197,3116763197,AU
+3116763198,3116763201,US
+3116763202,3116763202,FR
+3116763203,3116763213,US
+3116763214,3116763214,FR
+3116763215,3116763234,US
+3116763235,3116763235,FR
+3116763236,3116763240,US
+3116763241,3116763241,FR
+3116763242,3116763246,US
+3116763247,3116763247,FR
+3116763248,3116763252,US
+3116763253,3116763253,FR
+3116763254,3116763255,US
+3116763256,3116763256,FR
+3116763257,3116763259,US
+3116763260,3116763260,FR
+3116763261,3116763265,US
+3116763266,3116763266,FR
+3116763267,3116763268,US
+3116763269,3116763269,FR
+3116763270,3116763270,US
+3116763271,3116763271,FR
+3116763272,3116763275,US
+3116763276,3116763276,FR
+3116763277,3116763278,US
+3116763279,3116763279,FR
+3116763280,3116763286,US
+3116763287,3116763287,FR
+3116763288,3116763303,US
+3116763304,3116763304,FR
+3116763305,3116763306,US
+3116763307,3116763307,FR
+3116763308,3116763402,US
+3116763403,3116763422,GB
+3116763423,3116763436,US
+3116763437,3116763437,FR
+3116763438,3116763440,US
+3116763441,3116763441,FR
+3116763442,3116763451,US
+3116763452,3116763452,FR
+3116763453,3116763458,US
+3116763459,3116763459,FR
+3116763460,3116763463,US
+3116763464,3116763464,FR
+3116763465,3116763469,US
+3116763470,3116763470,FR
+3116763471,3116763474,US
+3116763475,3116763475,FR
+3116763476,3116763480,US
+3116763481,3116763481,FR
+3116763482,3116763483,US
+3116763484,3116763484,FR
+3116763485,3116763487,US
+3116763488,3116763488,FR
+3116763489,3116763492,US
+3116763493,3116763493,FR
+3116763494,3116763499,US
+3116763500,3116763500,FR
+3116763501,3116763503,US
+3116763504,3116763504,FR
+3116763505,3116763512,US
+3116763513,3116763513,FR
+3116763514,3116763515,US
+3116763516,3116763516,AU
+3116763517,3116763517,FR
+3116763518,3116763520,US
+3116763521,3116763521,FR
+3116763522,3116763524,US
+3116763525,3116763525,FR
+3116763526,3116763528,US
+3116763529,3116763529,FR
+3116763530,3116763533,US
+3116763534,3116763534,FR
+3116763535,3116763538,US
+3116763539,3116763539,FR
+3116763540,3116763658,US
+3116763659,3116763678,FR
+3116763679,3116763680,US
+3116763681,3116763681,FR
+3116763682,3116763684,US
+3116763685,3116763685,FR
+3116763686,3116763687,US
+3116763688,3116763688,FR
+3116763689,3116763692,US
+3116763693,3116763693,FR
+3116763694,3116763699,US
+3116763700,3116763700,FR
+3116763701,3116763705,US
+3116763706,3116763706,FR
+3116763707,3116763717,US
+3116763718,3116763718,FR
+3116763719,3116763722,US
+3116763723,3116763723,FR
+3116763724,3116763729,US
+3116763730,3116763730,FR
+3116763731,3116763742,US
+3116763743,3116763743,FR
+3116763744,3116763747,US
+3116763748,3116763748,FR
+3116763749,3116763751,US
+3116763752,3116763752,FR
+3116763753,3116763756,US
+3116763757,3116763757,FR
+3116763758,3116763769,US
+3116763770,3116763770,FR
+3116763771,3116763774,US
+3116763775,3116763775,FR
+3116763776,3116763778,US
+3116763779,3116763779,FR
+3116763780,3116763782,US
+3116763783,3116763783,FR
+3116763784,3116763787,US
+3116763788,3116763788,FR
+3116763789,3116763791,US
+3116763792,3116763792,FR
+3116763793,3116763796,US
+3116763797,3116763797,FR
+3116763798,3116763830,US
+3116763831,3116763831,AU
+3116763832,3116763914,US
+3116763915,3116763934,FR
+3116763935,3116763935,AU
+3116763936,3116763945,US
+3116763946,3116763946,FR
+3116763947,3116763949,US
+3116763950,3116763950,FR
+3116763951,3116763951,US
+3116763952,3116763952,FR
+3116763953,3116763954,US
+3116763955,3116763955,FR
+3116763956,3116763958,US
+3116763959,3116763959,FR
+3116763960,3116763966,US
+3116763967,3116763967,FR
+3116763968,3116763980,US
+3116763981,3116763981,FR
+3116763982,3116763984,US
+3116763985,3116763985,FR
+3116763986,3116763995,US
+3116763996,3116763996,FR
+3116763997,3116764000,US
+3116764001,3116764001,FR
+3116764002,3116764003,US
+3116764004,3116764004,FR
+3116764005,3116764007,US
+3116764008,3116764008,FR
+3116764009,3116764012,US
+3116764013,3116764013,FR
+3116764014,3116764016,US
+3116764017,3116764017,FR
+3116764018,3116764022,US
+3116764023,3116764023,FR
+3116764024,3116764024,US
+3116764025,3116764025,FR
+3116764026,3116764031,US
+3116764032,3116764032,FR
+3116764033,3116764038,US
+3116764039,3116764039,FR
+3116764040,3116764045,US
+3116764046,3116764046,FR
+3116764047,3116764145,US
+3116764146,3116764146,FR
+3116764147,3116764159,US
+3116764160,3116764175,GB
+3116764176,3116764191,US
+3116764192,3116765183,GB
+3116765184,3116766207,PL
+3116766208,3116767231,FR
+3116767232,3116768255,DE
+3116768256,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,3116823551,US
+3116823552,3116824575,RO
+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,DE
+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,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,RO
+3116938240,3116939263,IT
+3116939264,3116940287,SE
+3116940288,3116941055,RU
+3116941056,3116941311,FI
+3116941312,3116942335,FR
+3116942336,3116943359,CY
+3116943360,3116944383,FR
+3116944384,3116945407,GB
+3116945408,3116946431,US
+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,3116955647,NL
+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
3117416448,3117417471,FR
3120562176,3120594943,CO
3120594944,3120599039,AR
-3120599040,3120601087,EC
3120601088,3120602111,AR
3120602112,3120603135,BO
3120603136,3120610303,AR
@@ -86160,29 +89626,25 @@
3120691200,3120693247,CO
3120693248,3120726015,BO
3120726016,3120734207,HN
-3120734208,3120735487,RU
+3120734208,3120735487,BZ
3120735488,3120735743,NL
-3120735744,3120735999,BZ
-3120736000,3120736255,RU
+3120735744,3120736255,BZ
3120736256,3120736511,EC
3120736512,3120736767,BZ
3120736768,3120737023,RU
-3120737024,3120737279,BZ
-3120737280,3120737535,RU
-3120737536,3120738303,BZ
+3120737024,3120737791,BZ
+3120737792,3120738303,EC
3120738304,3120742399,CW
3120742400,3120754687,PY
3120754688,3120755711,CR
3120755712,3120756735,GF
-3120757504,3120757759,BZ
+3120756736,3120757759,BR
3120757760,3120758783,CL
3120758784,3120824319,EC
3120824320,3120840703,CR
3120840704,3120857087,AR
3120857088,3120922623,EC
-3120922624,3120922879,PA
-3120922880,3120922943,CR
-3120922944,3120930815,PA
+3120922624,3120930815,PA
3120930816,3120934911,CR
3120934912,3120949247,AR
3120949248,3120951295,CL
@@ -86198,9 +89660,7 @@
3121872896,3122003967,CL
3122003968,3122135039,AR
3122135040,3122282495,VE
-3122282496,3122290687,US
-3122290688,3122292735,AR
-3122292736,3122294783,US
+3122282496,3122294783,AR
3122294784,3122298879,CR
3122298880,3122331647,VE
3122331648,3122364415,BO
@@ -86211,30 +89671,7 @@
3122700288,3122716671,CR
3122716672,3122722815,HN
3122722816,3122724863,SV
-3122724864,3122726911,US
-3122726912,3122728447,AR
-3122728448,3122728959,US
-3122728960,3122729471,AR
-3122729472,3122729983,US
-3122729984,3122731007,AR
-3122731008,3122731519,US
-3122731520,3122732031,AR
-3122732032,3122733055,US
-3122733056,3122734079,AR
-3122734080,3122734591,US
-3122734592,3122735103,AR
-3122735104,3122735615,US
-3122735616,3122736127,AR
-3122736128,3122736383,US
-3122736384,3122737407,AR
-3122737408,3122738431,US
-3122738432,3122739199,AR
-3122739200,3122739455,US
-3122739456,3122739711,AR
-3122739712,3122740223,US
-3122740224,3122740479,AR
-3122740480,3122740735,US
-3122740736,3122741247,AR
+3122724864,3122741247,AR
3122741248,3122757631,DO
3122757632,3122774015,EC
3122774016,3122790399,AR
@@ -86261,21 +89698,10 @@
3124840448,3124842495,CL
3124842496,3124844543,AR
3124844544,3124845567,BZ
-3124845568,3124846591,CR
3124846592,3124848639,AR
-3124848640,3124849663,PA
+3124848640,3124849663,BR
3124849664,3124850687,AR
-3124850688,3124851471,HN
-3124851472,3124851487,CM
-3124851488,3124851855,HN
-3124851856,3124851863,IN
-3124851864,3124852175,HN
-3124852176,3124852191,PH
-3124852192,3124853103,HN
-3124853104,3124853119,VN
-3124853120,3124853887,HN
-3124853888,3124853903,FR
-3124853904,3124854783,HN
+3124850688,3124854783,HN
3124854784,3124887551,CL
3124887552,3124953087,EC
3124953088,3125018623,CL
@@ -86285,30 +89711,13 @@
3125673984,3125805055,CL
3125805056,3126329343,CO
3126329344,3126853631,VE
-3126853632,3126855807,AR
-3126855808,3126855935,US
-3126855936,3126857855,AR
-3126857856,3126857983,US
-3126857984,3126858495,AR
-3126858496,3126858623,US
-3126858624,3126860415,AR
-3126860416,3126860543,US
-3126860544,3126860671,AR
-3126860672,3126860799,US
-3126860800,3126861311,AR
-3126861312,3126861439,US
-3126861440,3126862591,AR
-3126862592,3126862719,US
-3126862720,3126863999,AR
-3126864000,3126864127,US
-3126864128,3126870015,AR
-3126870016,3126873343,VE
-3126873344,3126873599,PA
-3126873600,3126874111,VE
+3126853632,3126870015,AR
+3126870016,3126874111,VE
3126874112,3126878207,CR
-3126878208,3126882303,PA
-3126882304,3126886399,US
-3126886400,3126918143,AR
+3126878208,3126886399,PA
+3126886400,3126906879,AR
+3126906880,3126910975,TT
+3126910976,3126918143,AR
3126918144,3126919167,HN
3126919168,3127115775,CO
3127115776,3127181311,AR
@@ -86328,17 +89737,13 @@
3130284032,3130286079,DO
3130286080,3130290175,PA
3130290176,3130302463,AR
-3130302464,3130302975,CY
-3130302976,3130312703,PA
+3130302464,3130306559,PA
+3130306560,3130310655,CO
3130312704,3130314751,AR
3130314752,3130315775,CL
3130315776,3130316799,CR
-3130316800,3130317823,AW
-3130317824,3130318847,CW
-3130318848,3130319871,AR
-3130319872,3130320639,RU
-3130320640,3130320895,BR
-3130320896,3130327039,AR
+3130316800,3130318847,CW
+3130318848,3130327039,AR
3130327040,3130458111,DO
3130458112,3130523647,GT
3130523648,3130654719,AR
@@ -86358,27 +89763,23 @@
3132096512,3132211199,CR
3132211200,3132227583,AR
3132227584,3132293119,EC
-3132293120,3132295647,HN
-3132295648,3132295679,UY
-3132295680,3132297791,HN
-3132297792,3132297807,US
-3132297808,3132297839,HN
-3132297840,3132297855,US
-3132297856,3132297887,HN
-3132297888,3132297903,US
-3132297904,3132300383,HN
-3132300384,3132300391,US
-3132300392,3132302319,HN
-3132302320,3132302335,NL
-3132302336,3132302975,HN
-3132302976,3132302983,NL
-3132302984,3132304303,HN
-3132304304,3132304311,DE
-3132304312,3132306239,HN
-3132306240,3132306271,DE
-3132306272,3132308367,HN
-3132308368,3132308375,US
-3132308376,3132309503,HN
+3132293120,3132298007,HN
+3132298008,3132298015,US
+3132298016,3132298127,HN
+3132298128,3132298143,US
+3132298144,3132301727,HN
+3132301728,3132301743,NL
+3132301744,3132304127,HN
+3132304128,3132304383,US
+3132304384,3132304607,HN
+3132304608,3132304623,DE
+3132304624,3132305143,HN
+3132305144,3132305151,NL
+3132305152,3132307823,HN
+3132307824,3132307839,US
+3132307840,3132308775,HN
+3132308776,3132308783,US
+3132308784,3132309503,HN
3132309504,3132313599,CR
3132313600,3132317695,CL
3132317696,3132321791,CO
@@ -86391,21 +89792,28 @@
3132588032,3132620799,CO
3132620800,3132915711,VE
3132915712,3132948479,PA
-3132948480,3133014015,AR
+3132948480,3132981247,AR
+3132981248,3132997631,AW
+3132997632,3133014015,AR
3133014016,3133046783,HT
3133046784,3133067263,AR
-3133067264,3133071359,PA
-3133071360,3133071871,CY
-3133071872,3133073407,PA
+3133067264,3133073407,PA
3133073408,3133074431,CW
3133074432,3133075455,CL
3133075456,3133079551,CW
3133079552,3133145087,AR
3133145088,3133311999,BR
3133312000,3133313023,MX
-3133313024,3136985087,BR
-3136985088,3136986111,AR
-3136986112,3140614143,BR
+3133313024,3133317119,BR
+3133321216,3136983039,BR
+3136984064,3136985087,BR
+3136985088,3136985947,AR
+3136985948,3136985951,BR
+3136985952,3136986015,AR
+3136986016,3136986023,BR
+3136986024,3136986111,AR
+3136986112,3140587519,BR
+3140599808,3140614143,BR
3140614144,3140616191,CR
3140616192,3145727999,BR
3145728000,3149135871,MX
@@ -86451,7 +89859,13 @@
3156672512,3156738047,GB
3156738048,3156803583,DE
3156803584,3156869119,TR
-3156869120,3156901887,LU
+3156869120,3156876287,LU
+3156876288,3156877311,RU
+3156877312,3156893695,LU
+3156893696,3156894719,IN
+3156894720,3156897791,LU
+3156897792,3156899839,US
+3156899840,3156901887,SG
3156901888,3156906239,NL
3156906240,3156907007,LU
3156907008,3156908031,RU
@@ -86578,8 +89992,8 @@
3158638592,3158704127,LT
3158704128,3158835199,KW
3158835200,3158851583,IQ
-3158851584,3158852607,NL
-3158852608,3158853119,ES
+3158851584,3158852863,NL
+3158852864,3158853119,ES
3158853120,3158853631,NL
3158853632,3158855679,RU
3158855680,3158857727,US
@@ -86762,7 +90176,7 @@
3161571328,3161587711,UZ
3161587712,3161604095,RU
3161604096,3161612287,PL
-3161612288,3161613311,BR
+3161612288,3161613311,US
3161613312,3161614335,IT
3161614336,3161614847,US
3161614848,3161615103,ES
@@ -86990,13 +90404,9 @@
3164946160,3164946175,GB
3164946176,3164946351,FR
3164946352,3164946367,GB
-3164946368,3164946435,FR
-3164946436,3164946439,PT
-3164946440,3164946479,FR
+3164946368,3164946479,FR
3164946480,3164946483,ES
-3164946484,3164946499,FR
-3164946500,3164946503,GB
-3164946504,3164946527,FR
+3164946484,3164946527,FR
3164946528,3164946559,FI
3164946560,3164947023,FR
3164947024,3164947039,FI
@@ -87057,9 +90467,7 @@
3164960392,3164960395,GB
3164960396,3164960439,FR
3164960440,3164960443,DE
-3164960444,3164960511,FR
-3164960512,3164960527,ES
-3164960528,3164960671,FR
+3164960444,3164960671,FR
3164960672,3164960675,ES
3164960676,3164960699,FR
3164960700,3164960703,ES
@@ -87112,9 +90520,7 @@
3164970414,3164970415,IT
3164970416,3164970631,FR
3164970632,3164970639,ES
-3164970640,3164970847,FR
-3164970848,3164970851,IE
-3164970852,3164970927,FR
+3164970640,3164970927,FR
3164970928,3164970943,ES
3164970944,3164971479,FR
3164971480,3164971483,FI
@@ -87157,7 +90563,9 @@
3164978624,3164978655,ES
3164978656,3164979151,FR
3164979152,3164979155,ES
-3164979156,3164995583,FR
+3164979156,3164995345,FR
+3164995346,3164995346,GB
+3164995347,3164995583,FR
3164995584,3165030399,NL
3165030400,3165031423,GB
3165031424,3165032447,NL
@@ -87165,7 +90573,9 @@
3165036544,3165038591,DE
3165038592,3165040639,GB
3165040640,3165044735,SG
-3165044736,3165047807,NL
+3165044736,3165045759,DE
+3165045760,3165046783,SG
+3165046784,3165047807,NL
3165047808,3165061119,SG
3165061120,3165126655,SK
3165126656,3165192191,RU
@@ -87217,7 +90627,7 @@
3165452800,3165453055,AT
3165453056,3165453311,US
3165453312,3165453567,PE
-3165453568,3165453823,ES
+3165453568,3165453823,US
3165453824,3165454335,AT
3165454336,3165519871,RO
3165519872,3165585407,DE
@@ -87259,7 +90669,8 @@
3167753216,3167755263,ES
3167755264,3167757311,RO
3167757312,3167757823,BE
-3167757824,3167758335,US
+3167757824,3167757824,US
+3167757825,3167758335,GB
3167758336,3167758463,NL
3167758464,3167760383,RO
3167760384,3167762431,GB
@@ -87281,7 +90692,7 @@
3167780864,3167783935,RO
3167783936,3167784447,ES
3167784448,3167784703,CA
-3167784704,3167784959,ES
+3167784704,3167784959,PT
3167784960,3167797247,IR
3167797248,3167798271,MD
3167798272,3167798783,RO
@@ -87349,8 +90760,7 @@
3168005888,3168006143,NL
3168006144,3168008191,SE
3168008192,3168008447,RO
-3168008448,3168008703,GB
-3168008704,3168010239,US
+3168008448,3168010239,DE
3168010240,3168011519,MD
3168011520,3168011775,RO
3168011776,3168012287,IR
@@ -87366,13 +90776,15 @@
3168020480,3168022527,MD
3168022528,3168035839,IR
3168035840,3168036863,RO
-3168036864,3168037887,GB
+3168036864,3168037887,US
3168037888,3168038399,SE
3168038400,3168038911,RO
3168038912,3168039935,MD
3168039936,3168040959,BE
3168040960,3168041215,DE
-3168041216,3168047103,RO
+3168041216,3168044799,RO
+3168044800,3168045055,US
+3168045056,3168047103,RO
3168047104,3168049151,IR
3168049152,3168049407,RO
3168049408,3168049663,IT
@@ -87441,7 +90853,7 @@
3168145408,3168147455,RO
3168147456,3168147967,FR
3168147968,3168151551,RO
-3168151552,3168153599,DE
+3168151552,3168153599,US
3168153600,3168154111,RO
3168154112,3168154367,SG
3168154368,3168155135,RO
@@ -87586,7 +90998,8 @@
3169851392,3169853439,NL
3169853440,3169854463,AU
3169854464,3169855487,ES
-3169855488,3169856511,RO
+3169855488,3169855999,US
+3169856000,3169856511,RO
3169856512,3169857023,IT
3169857024,3169862911,RO
3169862912,3169863167,IT
@@ -87717,103 +91130,24 @@
3187826688,3187834879,AR
3187834880,3187843071,CW
3187843072,3187846143,AW
-3187846144,3187849215,CW
-3187849216,3187849471,CO
-3187849472,3187851263,CW
+3187846144,3187851263,CW
3187851264,3187855359,PY
-3187855360,3187855871,CY
-3187855872,3187857407,PA
+3187855360,3187857407,PA
3187857408,3187859455,CR
3187859456,3187863551,PA
3187863552,3187908607,AR
-3187908608,3187910655,CO
-3187910656,3187913727,CL
-3187913728,3187913983,PT
-3187913984,3187914751,CL
+3187910656,3187914751,CL
3187914752,3187916799,BO
3187916800,3187933183,CO
-3187933184,3187933311,HN
-3187933312,3187933341,GT
+3187933184,3187933341,GT
3187933342,3187933342,HN
-3187933343,3187935519,GT
-3187935520,3187935527,HN
-3187935528,3187935543,GT
-3187935544,3187935551,HN
-3187935552,3187935607,GT
-3187935608,3187935615,HN
-3187935616,3187936047,GT
-3187936048,3187936063,HN
-3187936064,3187936583,GT
-3187936584,3187936591,HN
-3187936592,3187936711,GT
-3187936712,3187936719,HN
-3187936720,3187937799,GT
-3187937800,3187937807,HN
-3187937808,3187939847,GT
-3187939848,3187939855,HN
-3187939856,3187940479,GT
-3187940480,3187940543,HN
-3187940544,3187940823,GT
-3187940824,3187940831,HN
-3187940832,3187940963,GT
-3187940964,3187940967,HN
-3187940968,3187941207,GT
-3187941208,3187941215,HN
-3187941216,3187941647,GT
-3187941648,3187941655,HN
-3187941656,3187942271,GT
-3187942272,3187942279,HN
-3187942280,3187942563,GT
-3187942564,3187942567,HN
-3187942568,3187943055,GT
-3187943056,3187943063,HN
-3187943064,3187943127,GT
-3187943128,3187943135,HN
-3187943136,3187943399,GT
-3187943400,3187943403,HN
-3187943404,3187943551,GT
-3187943552,3187943679,HN
-3187943680,3187944383,GT
-3187944384,3187944399,HN
-3187944400,3187944671,GT
-3187944672,3187944679,HN
-3187944680,3187944773,GT
+3187933343,3187944351,GT
+3187944352,3187944359,HN
+3187944360,3187944773,GT
3187944774,3187944774,HN
-3187944775,3187944831,GT
-3187944832,3187944835,HN
-3187944836,3187944855,GT
-3187944856,3187944859,HN
-3187944860,3187945343,GT
-3187945344,3187945471,HN
-3187945472,3187945971,GT
-3187945972,3187945975,HN
-3187945976,3187946111,GT
-3187946112,3187946239,HN
-3187946240,3187946495,GT
-3187946496,3187946511,HN
-3187946512,3187946639,GT
-3187946640,3187946647,HN
-3187946648,3187946687,GT
-3187946688,3187946695,HN
-3187946696,3187946887,GT
-3187946888,3187946895,HN
-3187946896,3187946975,GT
-3187946976,3187946979,HN
-3187946980,3187947983,GT
-3187947984,3187947987,HN
-3187947988,3187947999,GT
-3187948000,3187948159,HN
-3187948160,3187948367,GT
-3187948368,3187948375,HN
-3187948376,3187948479,GT
-3187948480,3187948543,HN
-3187948544,3187948799,GT
-3187948800,3187948927,HN
-3187948928,3187949115,GT
-3187949116,3187949119,HN
-3187949120,3187949311,GT
-3187949312,3187949439,HN
-3187949440,3187949567,GT
+3187944775,3187948031,GT
+3187948032,3187948159,HN
+3187948160,3187949567,GT
3187949568,3187950126,BQ
3187950127,3187950127,CW
3187950128,3187953663,BQ
@@ -87841,23 +91175,18 @@
3188113408,3188117503,HN
3188117504,3188121599,AR
3188121600,3188125695,TT
-3188125696,3188137175,AR
-3188137176,3188137183,DE
-3188137184,3188146175,AR
-3188146176,3188148911,CO
-3188148912,3188148915,PE
-3188148916,3188152171,CO
-3188152172,3188152175,PE
-3188152176,3188170751,CO
+3188125696,3188146175,AR
+3188146176,3188149335,CO
+3188149336,3188149339,PE
+3188149340,3188170751,CO
3188170752,3188174847,CR
3188174848,3188178943,BR
3188178944,3188187135,CR
-3188187136,3188203519,AR
+3188187136,3188199423,AR
3188203520,3188207615,DO
3188207616,3188211711,AR
3188211712,3188228095,CL
3188228096,3188236287,PE
-3188236288,3188237311,PA
3188237312,3188239359,VE
3188239360,3188240383,PE
3188240384,3188241407,CO
@@ -87867,17 +91196,7 @@
3188248576,3188248703,CL
3188248704,3188260863,CO
3188260864,3188269055,AR
-3188269056,3188269439,MX
-3188269440,3188269567,CO
-3188269568,3188269823,MX
-3188269824,3188270079,PA
-3188270080,3188270335,MX
-3188270336,3188270719,PA
-3188270720,3188270783,MX
-3188270784,3188270847,PA
-3188270848,3188271103,BR
-3188271104,3188273151,MX
-3188273152,3188275199,PA
+3188269056,3188275199,PA
3188275200,3188277247,CL
3188277248,3188293631,CO
3188293632,3188301823,VE
@@ -87888,33 +91207,15 @@
3188400128,3188408319,AR
3188408320,3188416511,BO
3188416512,3188445183,AR
-3188445184,3188449279,PE
3188449280,3188453375,HN
3188453376,3188473855,EC
3188473856,3188482047,PE
3188482048,3188490239,AR
3188490240,3188498431,CO
-3188498432,3188511103,AR
-3188511104,3188511231,US
-3188511232,3188512127,AR
-3188512128,3188512255,US
-3188512256,3188513407,AR
-3188513408,3188513535,US
-3188513536,3188516095,AR
-3188516096,3188516223,US
-3188516224,3188517119,AR
-3188517120,3188517247,US
-3188517248,3188517759,AR
-3188517760,3188517887,US
-3188517888,3188518271,AR
-3188518272,3188518399,US
-3188518400,3188523007,AR
+3188498432,3188523007,AR
3188523008,3188539391,CO
-3188539392,3188542207,CL
-3188542208,3188542463,US
-3188542464,3188543487,CL
-3188543488,3188543999,CY
-3188544000,3188545535,PA
+3188539392,3188543487,CL
+3188543488,3188545535,PA
3188545536,3188547583,AR
3188547584,3188551679,CO
3188551680,3188552703,AR
@@ -87936,8 +91237,7 @@
3188662272,3188670463,BR
3188670464,3188674559,HN
3188674560,3188678655,AR
-3188678656,3188682751,BR
-3188682752,3188686847,AR
+3188678656,3188686847,BR
3188686848,3188690943,EC
3188690944,3188695039,CU
3188695040,3188697087,EC
@@ -87959,23 +91259,22 @@
3191095296,3191099391,EC
3191099392,3191103487,AR
3191103488,3191107583,VE
-3191107584,3191108271,PE
-3191108272,3191108287,MX
-3191108288,3191108607,PE
-3191108608,3191108639,MX
-3191108640,3191108959,PE
+3191107584,3191108959,PE
3191108960,3191108991,CO
3191108992,3191109119,PE
-3191109120,3191111167,MX
-3191111168,3191111679,PE
+3191109120,3191109631,MX
+3191109632,3191111679,PE
3191111680,3191128063,PY
3191128064,3191132159,EC
3191132160,3191136255,AR
3191136256,3191144447,DO
-3191144448,3191152639,SV
-3191152640,3191155711,NI
+3191144448,3191153663,SV
+3191153664,3191154175,NI
+3191154176,3191154687,SV
+3191154688,3191155711,NI
3191155712,3191156223,SV
-3191156224,3191156735,NI
+3191156224,3191156479,NI
+3191156480,3191156735,SV
3191156736,3191169023,HN
3191169024,3191193599,SV
3191193600,3191209983,HN
@@ -87986,66 +91285,31 @@
3191439360,3191455743,EC
3191455744,3191472127,AR
3191472128,3191603199,TT
-3191603200,3191603455,CO
-3191603456,3191603519,GT
-3191603520,3191603583,PR
-3191603584,3191603647,CO
-3191603648,3191603711,SV
-3191603712,3191607295,CO
+3191603200,3191607295,CO
3191607296,3191607551,MX
3191607552,3191610111,CO
3191610112,3191610367,PE
-3191610368,3191610623,CO
-3191610624,3191611135,PE
-3191611136,3191611391,CO
+3191610368,3191611391,CO
3191611392,3191619583,VE
-3191619584,3191619903,CL
+3191619584,3191619903,CO
3191619904,3191619935,VE
-3191619936,3191623679,CL
-3191623680,3191625727,CO
-3191625728,3191626751,CL
-3191626752,3191627263,CO
-3191627264,3191627519,CL
-3191627520,3191635967,CO
+3191619936,3191635967,CO
3191635968,3191652351,AR
-3191652352,3191668991,CO
-3191668992,3191669247,PY
-3191669248,3191670015,CO
-3191670016,3191670271,AR
-3191670272,3191670783,CO
-3191670784,3191672831,CL
-3191672832,3191673343,CO
-3191673344,3191676927,CL
-3191676928,3191677951,US
-3191677952,3191678207,AR
-3191678208,3191678719,US
-3191678720,3191678975,AR
-3191678976,3191680767,US
-3191680768,3191681279,AR
-3191681280,3191681535,US
-3191681536,3191682303,AR
-3191682304,3191682559,US
-3191682560,3191683071,AR
-3191683072,3191685119,US
-3191685120,3191693311,CO
+3191652352,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
+3191719936,3191719999,AR
+3191720000,3191720959,CO
3191720960,3191721471,AR
3191721472,3191721983,CO
3191721984,3191722495,AR
3191722496,3191724799,CO
3191724800,3191725311,AR
-3191725312,3191732735,CO
-3191732736,3191732991,AR
-3191732992,3191734079,CO
-3191734080,3191734143,US
-3191734144,3191734271,CO
+3191725312,3191734271,CO
3191734272,3191799807,SV
3191799808,3191865343,EC
3191865344,3191930879,UY
@@ -88058,120 +91322,47 @@
3193143296,3193176063,TT
3193176064,3193307135,CO
3193307136,3193438207,SV
-3193438208,3193569279,CW
-3193569280,3193573087,CO
-3193573088,3193573095,US
-3193573096,3193575311,CO
+3193438208,3193503743,CW
+3193569280,3193575167,CO
+3193575168,3193575295,PE
+3193575296,3193575311,CO
3193575312,3193575327,PE
-3193575328,3193579263,CO
-3193579264,3193579519,EC
-3193579520,3193582591,CO
-3193582592,3193583103,EC
-3193583104,3193589503,CO
-3193589504,3193589759,EC
-3193589760,3193590527,CO
-3193590528,3193590655,EC
-3193590656,3193591807,CO
-3193591808,3193592063,EC
-3193592064,3193592319,CO
-3193592320,3193592575,EC
-3193592576,3193595391,CO
+3193575328,3193590655,CO
+3193590656,3193590783,EC
+3193590784,3193595391,CO
3193595392,3193595647,EC
-3193595648,3193599743,CO
-3193599744,3193600255,EC
-3193600256,3193604351,CO
-3193604352,3193604607,EC
-3193604608,3193604863,CO
-3193604864,3193605631,EC
-3193605632,3193606143,CO
-3193606144,3193606399,EC
-3193606400,3193606655,CO
-3193606656,3193607167,EC
-3193607168,3193617151,CO
-3193617152,3193617407,EC
-3193617408,3193618943,CO
+3193595648,3193606527,CO
+3193606528,3193606655,EC
+3193606656,3193618431,CO
+3193618432,3193618559,US
+3193618560,3193618943,CO
3193618944,3193619071,EC
-3193619072,3193621759,CO
-3193621760,3193623551,EC
-3193623552,3193624063,CO
-3193624064,3193624575,EC
-3193624576,3193625599,CO
+3193619072,3193625599,CO
3193625600,3193625855,EC
-3193625856,3193626111,CO
-3193626112,3193626623,US
-3193626624,3193628927,CO
-3193628928,3193629695,EC
-3193629696,3193630975,CO
-3193630976,3193631231,EC
-3193631232,3193634559,CO
-3193634560,3193634815,EC
+3193625856,3193626367,CO
+3193626368,3193626623,US
+3193626624,3193628671,CO
+3193628672,3193629183,EC
+3193629184,3193631103,CO
+3193631104,3193631231,EC
+3193631232,3193634687,CO
+3193634688,3193634815,EC
3193634816,3193700351,CL
-3193700352,3193722751,HN
-3193722752,3193722879,GT
-3193722880,3193724927,HN
+3193700352,3193724927,HN
3193724928,3193729023,AR
3193729024,3193733119,CU
-3193733120,3193735167,AR
-3193735168,3193735935,US
-3193735936,3193736191,AR
-3193736192,3193736959,US
-3193736960,3193737215,AR
-3193737216,3193739007,US
-3193739008,3193739263,AR
-3193739264,3193742335,US
-3193742336,3193742591,AR
-3193742592,3193742847,US
-3193742848,3193743231,AR
-3193743232,3193743359,US
-3193743360,3193743743,AR
-3193743744,3193744127,US
-3193744128,3193744639,AR
-3193744640,3193745407,US
-3193745408,3193746431,AR
-3193746432,3193746687,US
-3193746688,3193746751,AR
-3193746752,3193746815,US
-3193746816,3193746879,AR
-3193746880,3193748479,US
-3193748480,3193748863,AR
-3193748864,3193750271,US
-3193750272,3193750527,AR
-3193750528,3193750783,US
-3193750784,3193751039,AR
-3193751040,3193751551,US
-3193751552,3193751807,AR
-3193751808,3193752959,US
-3193752960,3193753087,AR
-3193753088,3193753343,US
-3193753344,3193753471,AR
-3193753472,3193753599,US
-3193753600,3193754111,AR
-3193754112,3193754367,US
-3193754368,3193754623,AR
-3193754624,3193754751,US
-3193754752,3193755007,AR
-3193755008,3193755519,US
-3193755520,3193755647,AR
-3193755648,3193755775,US
-3193755776,3193756415,AR
-3193756416,3193756543,US
-3193756544,3193756799,AR
-3193756800,3193756927,US
-3193756928,3193757055,AR
-3193757056,3193757183,US
-3193757184,3193765887,AR
+3193733120,3193740543,AR
+3193740544,3193740799,US
+3193740800,3193765887,AR
3193765888,3193774079,TT
-3193774080,3193775103,PA
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,3193815039,PY
+3193806848,3193810943,CR
+3193810944,3193811967,PY
3193815040,3193823231,AR
3193823232,3193827327,CL
3193827328,3193828351,CR
@@ -88199,37 +91390,21 @@
3194077184,3194085375,CO
3194085376,3194093567,VE
3194093568,3194126335,SR
-3194126336,3194126591,GT
-3194126592,3194126847,NL
-3194126848,3194126911,GT
-3194126912,3194126975,PE
-3194126976,3194127103,GT
-3194127104,3194127359,BR
-3194127360,3194127871,AR
-3194127872,3194128127,PE
-3194128128,3194128383,BR
+3194126336,3194128383,AR
3194128384,3194129407,NI
3194129408,3194129663,AR
3194129664,3194129671,BR
-3194129672,3194129919,AR
-3194129920,3194130047,BR
+3194129672,3194130047,AR
3194130048,3194130175,CO
-3194130176,3194130303,CL
-3194130304,3194130431,AR
-3194130432,3194130687,BR
-3194130688,3194130943,AR
-3194130944,3194132991,BR
-3194132992,3194133247,CL
-3194133248,3194134527,BR
-3194134528,3194135551,AR
-3194135552,3194136319,BR
-3194136320,3194136447,CO
-3194136448,3194136575,GT
+3194130176,3194130303,AR
+3194130304,3194130431,BR
+3194130432,3194135551,AR
+3194135552,3194136063,BR
+3194136064,3194136575,AR
3194136576,3194137087,BR
-3194137088,3194139647,AR
-3194139648,3194139903,BR
-3194139904,3194140159,AR
-3194140160,3194142719,CR
+3194137088,3194139903,AR
+3194139904,3194140159,BR
+3194140160,3194142719,AR
3194142720,3194159103,CL
3194159104,3194165247,HN
3194165248,3194175487,SV
@@ -88249,7 +91424,8 @@
3194368000,3194370047,BO
3194370048,3194372095,PA
3194372096,3194380287,HT
-3194380288,3194388479,US
+3194380288,3194384383,US
+3194384384,3194388479,BZ
3194388480,3194396671,PE
3194396672,3194413055,CO
3194413056,3194421247,CL
@@ -88259,19 +91435,14 @@
3194441728,3194445823,AR
3194445824,3194449031,CO
3194449032,3194449047,CL
-3194449048,3194449175,CO
-3194449176,3194449183,PE
-3194449184,3194454015,CO
+3194449048,3194454015,CO
3194454016,3194458111,AR
3194458112,3194462207,CL
3194462208,3194466303,BR
3194466304,3194467327,AR
3194467328,3194468351,DO
3194468352,3194469375,US
-3194469376,3194469631,CA
-3194469632,3194469887,CR
-3194469888,3194470143,US
-3194470144,3194470399,CR
+3194469376,3194470399,CR
3194470400,3194486783,AR
3194486784,3194494975,BO
3194494976,3194511359,AR
@@ -88279,9 +91450,7 @@
3194515456,3194519551,GT
3194519552,3194535935,PY
3194535936,3194585087,AR
-3194585088,3194586623,HN
-3194586624,3194586879,US
-3194586880,3194589183,HN
+3194585088,3194589183,HN
3194589184,3194591231,AR
3194591232,3194592255,PA
3194592256,3194593279,GY
@@ -88290,7 +91459,7 @@
3194596352,3194597375,HT
3194597376,3194601471,AR
3194601472,3194602495,CW
-3194602496,3194610943,AR
+3194603520,3194610943,AR
3194610944,3194611199,CO
3194611200,3194613503,AR
3194613504,3194613759,CL
@@ -88303,39 +91472,16 @@
3194640384,3194642431,BZ
3194642432,3194646527,AR
3194646528,3194648575,DO
-3194648576,3194652159,AR
-3194652160,3194652415,MX
-3194652416,3194652671,AR
-3194652672,3194652701,MX
-3194652702,3194652705,AR
-3194652706,3194654719,MX
-3194654720,3194659839,AR
-3194659840,3194660351,US
-3194660352,3194661119,AR
-3194661120,3194661375,US
-3194661376,3194661887,AR
-3194661888,3194662399,US
-3194662400,3194663167,AR
-3194663168,3194664447,US
-3194664448,3194664959,AR
-3194664960,3194665215,US
-3194665216,3194665471,AR
-3194665472,3194665727,US
-3194665728,3194665983,AR
-3194665984,3194666239,US
-3194666240,3194667007,AR
+3194648576,3194667007,AR
3194667008,3194675199,GT
-3194675200,3194679295,PA
3194679296,3194683391,BO
3194683392,3194687487,CU
3194687488,3194691583,CO
3194691584,3194699775,BO
3194699776,3194705919,EC
-3194705920,3194707711,CR
-3194707712,3194707967,US
+3194705920,3194707967,CR
3194707968,3194716159,AR
3194716160,3194724351,HN
-3194724352,3194728447,PA
3194728448,3194729471,CL
3194729472,3194730495,PE
3194730496,3194732543,AR
@@ -88350,7 +91496,6 @@
3194757120,3194765311,AR
3194765312,3194767359,EC
3194767360,3194768383,CR
-3194768384,3194769407,AR
3194769408,3194773503,PE
3194773504,3194781695,BR
3194781696,3194798079,CL
@@ -88359,15 +91504,8 @@
3194804224,3194805247,AR
3194805248,3194806271,CR
3194806272,3194814463,AR
-3194814464,3194818559,PA
-3194818560,3194818815,CO
-3194818816,3194819071,AR
-3194819072,3194819583,CO
-3194819584,3194819839,AR
-3194819840,3194820095,CO
-3194820096,3194820351,AR
-3194820352,3194820607,CO
-3194820608,3194830847,AR
+3194814464,3194822655,CO
+3194822656,3194830847,AR
3194830848,3194838015,BR
3194838016,3194839039,MX
3194839040,3194863615,CO
@@ -88381,38 +91519,16 @@
3194925056,3194929151,AR
3194929152,3194937343,EC
3194937344,3194945535,AR
-3194945536,3194953215,GT
-3194953216,3194953343,NI
-3194953344,3194953471,GT
-3194953472,3194953599,NI
-3194953600,3194953727,GT
-3194953728,3194959871,AR
-3194959872,3194960383,US
-3194960384,3194960895,AR
-3194960896,3194961151,US
-3194961152,3194961407,AR
-3194961408,3194961919,US
+3194945536,3194953727,GT
+3194953728,3194961919,AR
3194961920,3194970111,EC
-3194970112,3194974207,PA
3194974208,3194976255,AR
3194976256,3194977279,VE
3194977280,3194978303,AR
-3194978304,3194978559,PA
-3194978560,3194978687,CW
-3194978688,3194982911,PA
-3194982912,3194983039,US
-3194983040,3194984191,PA
-3194984192,3194984319,US
-3194984320,3194984831,PA
-3194984832,3194984959,GB
-3194984960,3194985471,PA
-3194985472,3194985599,US
-3194985600,3194994687,PA
3194994688,3195023359,AR
3195023360,3195024383,CL
3195024384,3195025407,UY
3195025408,3195043839,AR
-3195043840,3195056127,CO
3195056128,3195060223,AR
3195060224,3195061247,US
3195061248,3195062271,AR
@@ -88425,22 +91541,7 @@
3195067392,3195068415,CR
3195068416,3195076607,CW
3195076608,3195084799,CL
-3195084800,3195085055,CR
-3195085056,3195086335,NI
-3195086336,3195087359,CR
-3195087360,3195087615,NI
-3195087616,3195088127,CR
-3195088128,3195088639,NI
-3195088640,3195088895,CR
-3195088896,3195089919,NI
-3195089920,3195090431,CR
-3195090432,3195090687,NI
-3195090688,3195091199,CR
-3195091200,3195091455,NI
-3195091456,3195092223,CR
-3195092224,3195092479,NI
-3195092480,3195092735,CR
-3195092736,3195092991,NI
+3195084800,3195092991,NI
3195092992,3195097087,DO
3195097088,3195099135,CR
3195099136,3195100159,GT
@@ -88452,9 +91553,8 @@
3195138048,3195139071,DO
3195139072,3195140095,CL
3195140096,3195142143,CR
-3195142144,3195142399,MX
-3195142400,3195142655,PA
-3195142656,3195142911,VE
+3195142144,3195142783,PA
+3195142784,3195142911,VE
3195142912,3195143039,EC
3195143040,3195143167,UY
3195143168,3195143295,GT
@@ -88466,19 +91566,12 @@
3195203584,3195205631,VE
3195205632,3195206655,PE
3195206656,3195207679,CL
-3195207680,3195209687,GT
-3195209688,3195209695,PR
-3195209696,3195211775,GT
+3195207680,3195211775,GT
3195211776,3195214988,BZ
3195214989,3195214989,RU
3195214990,3195215871,BZ
3195215872,3195224063,AR
-3195224064,3195232255,PA
-3195232256,3195234559,CR
-3195234560,3195234815,PA
-3195234816,3195235327,CR
-3195235328,3195235583,PA
-3195235584,3195236351,CR
+3195232256,3195236351,CR
3195236352,3195240447,AR
3195240448,3195256831,HT
3195256832,3195265023,AR
@@ -88493,7 +91586,7 @@
3195576320,3195580415,CL
3195580416,3195584511,AR
3195584512,3195592703,HT
-3195592704,3195596799,PA
+3195596391,3195596391,PA
3195596800,3195597823,CR
3195597824,3195598847,AR
3195598848,3195600895,VE
@@ -88517,17 +91610,12 @@
3195721728,3195723775,VE
3195723776,3195731967,AR
3195731968,3195736063,EC
-3195736064,3195736575,BQ
-3195736576,3195736831,AI
-3195736832,3195737087,BQ
+3195736064,3195737087,BQ
3195737088,3195738111,CW
3195738112,3195740159,HN
-3195740160,3195740415,US
-3195740416,3195740927,PA
-3195740928,3195741055,US
+3195740160,3195741055,PA
3195741056,3195741087,HN
-3195741088,3195741695,US
-3195741696,3195744255,PA
+3195741088,3195744255,PA
3195744256,3195748351,EC
3195748352,3195752447,CL
3195752448,3195763711,AR
@@ -88535,38 +91623,16 @@
3195764736,3195768831,CR
3195768832,3195772927,AR
3195772928,3195781119,VE
-3195781120,3195785215,PA
-3195785216,3195785311,HN
-3195785312,3195785343,CA
-3195785344,3195785375,HN
-3195785376,3195785407,DE
-3195785408,3195785815,HN
-3195785816,3195785823,DE
-3195785824,3195786015,HN
-3195786016,3195786023,ES
-3195786024,3195786191,HN
-3195786192,3195786199,US
-3195786200,3195786479,HN
-3195786480,3195786487,CA
-3195786488,3195786527,HN
-3195786528,3195786543,US
-3195786544,3195786991,HN
-3195786992,3195787007,CA
-3195787008,3195787127,HN
-3195787128,3195787135,DE
-3195787136,3195787215,HN
-3195787216,3195787231,US
-3195787232,3195787607,HN
-3195787608,3195787615,DE
-3195787616,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
+3195781120,3195785215,BR
+3195785216,3195785407,HN
+3195785408,3195785439,DE
+3195785440,3195785735,HN
+3195785736,3195785743,GB
+3195785744,3195786239,HN
+3195786240,3195786287,US
+3195786288,3195786295,ES
+3195786296,3195786751,US
+3195786752,3195789311,HN
3195789312,3195793407,PA
3195793408,3195801599,AR
3195801600,3195803647,HN
@@ -88574,13 +91640,7 @@
3195804672,3195805695,VE
3195805696,3195807743,NI
3195807744,3195807871,US
-3195807872,3195808383,BZ
-3195808384,3195808895,US
-3195808896,3195809151,BZ
-3195809152,3195809279,US
-3195809280,3195809407,BZ
-3195809408,3195809535,US
-3195809536,3195809791,BZ
+3195807872,3195809791,BZ
3195809792,3195811839,PE
3195811840,3195813887,AR
3195813888,3195822079,DO
@@ -88594,23 +91654,16 @@
3195853824,3195854847,GY
3195854848,3195859967,AR
3195859968,3195862015,CR
-3195862016,3195863039,AR
3195863040,3196092415,CO
3196092416,3196125183,PY
3196125184,3196190719,BO
3196190720,3196207103,HN
3196207104,3196223487,CO
3196223488,3196305407,EC
-3196305408,3196316183,CO
-3196316184,3196316191,CW
-3196316192,3196321791,CO
+3196305408,3196321791,CO
3196321792,3196583935,UY
-3196583936,3196690687,AR
-3196690688,3196690943,UY
-3196690944,3196846079,AR
-3196846080,3196874431,PA
-3196874432,3196874447,PG
-3196874448,3196977151,PA
+3196583936,3196846079,AR
+3196846080,3196977151,PA
3196977152,3197042687,VE
3197042688,3197075455,CO
3197075456,3197108223,GT
@@ -88654,8 +91707,7 @@
3199729664,3199762431,NI
3199762432,3199778815,CO
3199778816,3199779839,AR
-3199779840,3199780735,CR
-3199780736,3199780863,US
+3199779840,3199780863,CR
3199780864,3199782911,CO
3199782912,3199784959,AR
3199784960,3199785983,EC
@@ -88673,15 +91725,13 @@
3200565248,3200569343,HT
3200569344,3200573439,CL
3200573440,3200577535,AR
-3200577536,3200579583,EC
+3200577536,3200579583,BR
3200579584,3200581631,AR
3200581632,3200614399,BZ
3200614400,3200647167,AR
3200647168,3201302527,VE
3201302528,3201433599,CL
-3201433600,3201435135,AR
-3201435136,3201435263,US
-3201435264,3201441791,AR
+3201433600,3201441791,AR
3201441792,3201442047,US
3201442048,3201499135,AR
3201499136,3201515519,CL
@@ -88706,78 +91756,103 @@
3201630208,3201695743,TT
3201695744,3201761279,EC
3201761280,3201826815,CL
-3201826816,3201851391,AR
-3201851392,3201855487,EC
+3201826816,3201851863,AR
+3201851864,3201851867,EC
+3201851868,3201852519,AR
+3201852520,3201852527,EC
+3201852528,3201854143,AR
+3201854144,3201854151,EC
+3201854152,3201854463,AR
+3201854464,3201854975,EC
+3201854976,3201855295,AR
+3201855296,3201855311,EC
+3201855312,3201855487,AR
3201855488,3201859583,PE
3201859584,3201863679,CO
-3201863680,3201865727,CL
-3201865728,3201867775,CO
-3201867776,3201875967,PE
-3201875968,3201880063,CO
+3201863680,3201864633,AR
+3201864634,3201864634,CL
+3201864635,3201865215,AR
+3201865216,3201865471,CL
+3201865472,3201866607,AR
+3201866608,3201866623,CO
+3201866624,3201866863,AR
+3201866864,3201866871,CO
+3201866872,3201867775,AR
+3201867776,3201869823,PE
+3201869824,3201870911,AR
+3201870912,3201870943,PE
+3201870944,3201872739,AR
+3201872740,3201872740,PE
+3201872741,3201873827,AR
+3201873828,3201873831,PE
+3201873832,3201875071,AR
+3201875072,3201875079,PE
+3201875080,3201876991,AR
+3201876992,3201877247,CO
+3201877248,3201877268,AR
+3201877269,3201877269,CO
+3201877270,3201877503,AR
+3201877504,3201878015,CO
+3201878016,3201878527,AR
+3201878528,3201878783,CO
+3201878784,3201879039,AR
+3201879040,3201880063,CO
3201880064,3201884159,EC
-3201884160,3201889279,VE
+3201884160,3201888511,VE
+3201888512,3201889279,AR
3201889280,3201889535,US
-3201889536,3201894399,VE
-3201894400,3201906111,AR
-3201906112,3201906175,CO
-3201906176,3201906687,AR
-3201906688,3201908735,CO
+3201889536,3201889791,VE
+3201889792,3201890097,AR
+3201890098,3201890098,VE
+3201890099,3201891071,AR
+3201891072,3201891327,VE
+3201891328,3201891583,AR
+3201891584,3201891839,VE
+3201891840,3201892351,AR
+3201892352,3201894399,VE
+3201894400,3201904639,AR
+3201904640,3201906687,CO
+3201906688,3201907233,AR
+3201907234,3201907234,CO
+3201907235,3201907265,AR
+3201907266,3201907266,CO
+3201907267,3201907359,AR
+3201907360,3201907391,CO
+3201907392,3201908223,AR
+3201908224,3201908735,CO
3201908736,3201916927,AR
3201916928,3201917183,CO
3201917184,3201917527,AR
3201917528,3201917535,CO
-3201917536,3201917951,AR
-3201917952,3201918975,CO
-3201918976,3201925119,AR
+3201917536,3201918795,AR
+3201918796,3201918799,CO
+3201918800,3201918975,AR
+3201918976,3201919999,CO
+3201920000,3201925119,AR
3201925120,3201957887,CL
3201957888,3202088959,PA
-3202088960,3202127999,AR
-3202128000,3202128015,CW
-3202128016,3202220031,AR
+3202088960,3202220031,AR
3202220032,3202351103,PE
3202351104,3202875391,AR
3202875392,3203399679,PE
3203399680,3203465215,CO
-3203465216,3203494143,CR
-3203494144,3203494271,CO
-3203494272,3203530751,CR
-3203530752,3203531519,CO
-3203531520,3203531775,PA
-3203531776,3203532287,CO
-3203532288,3203532543,PA
-3203532544,3203532799,CO
-3203532800,3203534847,PA
-3203534848,3203535871,CO
-3203535872,3203536383,PA
-3203536384,3203536895,CO
+3203465216,3203530751,CR
+3203530752,3203536895,CO
3203536896,3203537919,HN
-3203537920,3203538431,GT
-3203538432,3203538687,PA
-3203538688,3203538943,CO
+3203537920,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,3203561471,CO
-3203561472,3203562495,SV
-3203562496,3203563775,CO
-3203563776,3203564031,PA
-3203564032,3203564543,CO
+3203544576,3203548927,CO
+3203548928,3203549183,PA
+3203549184,3203562239,CO
+3203562240,3203562495,SV
+3203562496,3203564543,CO
3203564544,3203565055,DO
-3203565056,3203565567,CO
-3203565568,3203566079,CR
-3203566080,3203566591,CO
+3203565056,3203565567,CR
+3203565568,3203566591,CO
3203566592,3203566847,PA
-3203566848,3203566975,CO
-3203566976,3203567103,DO
-3203567104,3203568639,CO
+3203566848,3203568639,CO
3203568640,3203569663,SV
3203569664,3203570303,CO
3203570304,3203570431,SV
@@ -88786,7 +91861,9 @@
3203661824,3203923967,AR
3203923968,3204448255,CO
3204448256,3208642559,BR
-3208642560,3209691135,CO
+3208642560,3209412607,CO
+3209412608,3209413631,US
+3209413632,3209691135,CO
3209691136,3210084351,AR
3210084352,3210215423,BR
3210215424,3210739711,CO
@@ -88796,10 +91873,10 @@
3210740480,3210740735,US
3210740736,3210742015,BR
3210742016,3210742031,IT
-3210742032,3210742063,BR
+3210742032,3210742047,BR
+3210742048,3210742063,CL
3210742064,3210742079,US
-3210742080,3210742271,BR
-3210742272,3210742527,CL
+3210742080,3210742527,CL
3210742528,3210742543,KR
3210742544,3210742560,CL
3210742561,3210742561,BR
@@ -88817,16 +91894,16 @@
3210743552,3210743567,TH
3210743568,3210743615,BR
3210743616,3210743679,FR
-3210743680,3210743807,BR
+3210743680,3210743807,CL
3210743808,3210744063,US
3210744064,3210744079,TR
-3210744080,3210744095,CL
-3210744096,3210744127,BR
+3210744080,3210744127,BR
3210744128,3210744191,FR
-3210744192,3210744575,US
+3210744192,3210744319,BR
+3210744320,3210744575,US
3210744576,3210744591,BE
-3210744592,3210744703,BR
-3210744704,3210744831,US
+3210744592,3210744607,BR
+3210744608,3210744831,CL
3210744832,3210744863,NZ
3210744864,3210744895,IS
3210744896,3210744959,CL
@@ -88834,46 +91911,49 @@
3210745088,3210745343,US
3210745344,3210745359,RU
3210745360,3210745375,BR
-3210745376,3210745471,CL
+3210745376,3210745407,CL
+3210745408,3210745471,BR
3210745472,3210745599,DE
3210745600,3210745855,US
3210745856,3210745871,IT
-3210745872,3210745919,BR
-3210745920,3210746367,US
+3210745872,3210746047,CL
+3210746048,3210746111,BR
+3210746112,3210746367,US
3210746368,3210746383,SE
-3210746384,3210746623,BR
-3210746624,3210746879,US
+3210746384,3210746495,BR
+3210746496,3210746879,US
3210746880,3210746895,CH
-3210746896,3210747007,CL
-3210747008,3210747135,BR
+3210746896,3210746943,CL
+3210746944,3210747135,BR
3210747136,3210748159,US
3210748160,3210748175,JP
-3210748176,3210748287,BR
-3210748288,3210748415,US
+3210748176,3210748191,BR
+3210748192,3210748351,CL
+3210748352,3210748415,BR
3210748416,3210748671,GB
-3210748672,3210752255,US
-3210752256,3210752511,SG
+3210748672,3210749439,CL
+3210749440,3210752255,US
+3210752256,3210752511,CL
3210752512,3210755839,US
3210755840,3210755855,MY
-3210755856,3210755871,BR
-3210755872,3210755967,CL
-3210755968,3210756095,BR
-3210756096,3210756351,SG
+3210755856,3210756095,BR
+3210756096,3210756351,CL
3210756352,3210756607,US
3210756608,3210756863,DE
3210756864,3210757119,RU
-3210757120,3210758911,US
+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,3210764159,US
-3210764160,3210764287,BR
+3210764096,3210764287,BR
3210764288,3210765055,US
3210765056,3210765071,SE
-3210765072,3210765311,BR
-3210765312,3210765567,CL
+3210765072,3210765087,BR
+3210765088,3210765567,CL
3210765568,3210765823,US
3210765824,3210766079,ES
3210766080,3210766335,CL
@@ -88890,57 +91970,83 @@
3210769920,3210770175,TR
3210770176,3210771199,US
3210771200,3210771215,TH
-3210771216,3210771455,CL
+3210771216,3210771263,CL
+3210771264,3210771455,BR
3210771456,3210772479,US
3210772480,3210772735,CL
3210772736,3210773247,US
3210773248,3210773503,MY
3210773504,3210773519,PL
-3210773520,3210773759,BR
+3210773520,3210773535,BR
+3210773536,3210773759,CL
3210773760,3210774271,US
3210774272,3210774287,NO
-3210774288,3210774527,BR
+3210774288,3210774303,BR
+3210774304,3210774527,CL
3210774528,3210774783,US
3210774784,3210774799,IT
-3210774800,3210775039,BR
+3210774800,3210774815,BR
+3210774816,3210774911,CL
+3210774912,3210775039,BR
3210775040,3210775295,US
3210775296,3210775311,CH
-3210775312,3210775551,BR
+3210775312,3210775327,BR
+3210775328,3210775551,CL
3210775552,3210775807,US
-3210775808,3210776319,CL
+3210775808,3210775935,CL
+3210775936,3210776063,BR
+3210776064,3210776191,CL
+3210776192,3210776319,BR
3210776320,3210776575,US
-3210776576,3210776831,CL
+3210776576,3210776703,CL
+3210776704,3210776831,BR
3210776832,3210777087,US
-3210777088,3210777599,CL
+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,3210783231,CL
+3210782992,3210783039,CL
+3210783040,3210783231,BR
3210783232,3210783487,US
3210783488,3210783503,JP
-3210783504,3210783743,CL
+3210783504,3210783551,CL
+3210783552,3210783743,BR
3210783744,3210783999,US
3210784000,3210784015,JP
-3210784016,3210784255,CL
+3210784016,3210784063,CL
+3210784064,3210784255,BR
3210784256,3210784511,US
3210784512,3210784527,BE
-3210784528,3210784767,CL
+3210784528,3210784575,CL
+3210784576,3210784767,BR
3210784768,3210785791,US
-3210785792,3210786047,BR
+3210785792,3210786047,CL
3210786048,3210786063,AU
-3210786064,3210786303,CL
+3210786064,3210786111,CL
+3210786112,3210786303,BR
3210786304,3210786559,US
3210786560,3210786575,GR
3210786576,3210786591,BR
-3210786592,3210787071,CL
+3210786592,3210786623,CL
+3210786624,3210786687,BR
+3210786688,3210787071,CL
3210787072,3210788863,US
3210788864,3210789119,HR
-3210789120,3210795007,US
+3210789120,3210791935,US
+3210791936,3210792447,CL
+3210792448,3210792959,US
+3210792960,3210793471,GB
+3210793472,3210795007,US
3210795008,3210796031,IL
-3210796032,3210798847,US
+3210796032,3210798079,US
+3210798080,3210798591,CL
+3210798592,3210798847,US
3210798848,3210799103,ES
3210799104,3210802431,US
3210802432,3210802687,ES
@@ -88966,15 +92072,12 @@
3210825728,3210827775,BZ
3210827776,3210829823,DO
3210829824,3210830847,AR
-3210830848,3210831871,PE
+3210830848,3210831359,PE
+3210831360,3210831871,BR
3210831872,3210832895,DO
3210832896,3210835967,AR
3210835968,3210838015,PY
-3210838016,3210868735,AR
-3210868736,3210869759,US
-3210869760,3210870271,AR
-3210870272,3210870527,US
-3210870528,3210870783,AR
+3210838016,3210870783,AR
3210870784,3210903551,CO
3210903552,3210919935,PE
3210919936,3210920959,GT
@@ -88989,58 +92092,57 @@
3211071744,3211071999,DE
3211072000,3211072027,US
3211072028,3211072057,BR
-3211072058,3211072287,US
+3211072058,3211072127,US
+3211072128,3211072255,BR
+3211072256,3211072287,US
3211072288,3211072319,NZ
-3211072320,3211072511,US
+3211072320,3211072511,BR
3211072512,3211073023,NL
3211073024,3211073279,GB
3211073280,3211073535,FR
3211073536,3211074047,US
-3211074048,3211074303,NL
+3211074048,3211074303,CL
3211074304,3211074559,ES
3211074560,3211074815,NL
3211074816,3211075071,US
3211075072,3211075325,DK
3211075326,3211075326,CL
3211075327,3211075327,DK
-3211075328,3211075583,NL
+3211075328,3211075583,CL
3211075584,3211076095,US
3211076096,3211076607,LT
3211076608,3211079935,US
3211079936,3211080191,NG
3211080192,3211080703,US
3211080704,3211080959,GB
-3211080960,3211081215,IQ
+3211080960,3211081215,CL
3211081216,3211081727,CH
3211081728,3211082239,US
3211082240,3211082495,BN
3211082496,3211082751,GB
3211082752,3211083007,SG
-3211083008,3211083519,US
+3211083008,3211083263,US
+3211083264,3211083519,BR
3211083520,3211083775,HK
3211083776,3211083791,RU
3211083792,3211083839,CL
3211083840,3211083855,GB
-3211083856,3211083903,DE
+3211083856,3211083871,DE
+3211083872,3211083903,CL
3211083904,3211084031,FR
-3211084032,3211084287,DE
+3211084032,3211084287,CL
3211084288,3211084303,NL
-3211084304,3211084351,DE
+3211084304,3211084351,CL
3211084352,3211084367,GB
-3211084368,3211084543,DE
-3211084544,3211084559,CL
+3211084368,3211084383,DE
+3211084384,3211084559,CL
3211084560,3211084575,DE
3211084576,3211084671,CL
3211084672,3211084799,BY
3211084800,3211084815,AT
-3211084816,3211084863,CL
+3211084816,3211084863,DE
3211084864,3211084879,GB
-3211084880,3211084895,DE
-3211084896,3211084927,CL
-3211084928,3211085055,DE
-3211085056,3211085071,CL
-3211085072,3211085087,DE
-3211085088,3211085311,CL
+3211084880,3211085311,DE
3211085312,3211085327,GB
3211085328,3211085375,CL
3211085376,3211085391,GB
@@ -89050,13 +92152,19 @@
3211085600,3211085695,CL
3211085696,3211085823,GE
3211085824,3211085839,TH
-3211085840,3211085887,DE
+3211085840,3211085887,CL
3211085888,3211085903,GB
-3211085904,3211086335,DE
+3211085904,3211085919,DE
+3211085920,3211086095,CL
+3211086096,3211086111,DE
+3211086112,3211086335,CL
3211086336,3211086351,FR
3211086352,3211086367,DE
3211086368,3211086463,CL
-3211086464,3211086847,DE
+3211086464,3211086591,DE
+3211086592,3211086607,CL
+3211086608,3211086623,DE
+3211086624,3211086847,CL
3211086848,3211086863,PL
3211086864,3211087359,DE
3211087360,3211087375,GB
@@ -89112,13 +92220,13 @@
3211096064,3211096079,GB
3211096080,3211097103,DE
3211097104,3211097151,GB
-3211097152,3211097215,CL
+3211097152,3211097215,DE
3211097216,3211097343,GB
-3211097344,3211097359,CL
-3211097360,3211097375,DE
-3211097376,3211097599,CL
+3211097344,3211097599,DE
3211097600,3211097855,US
-3211097856,3211098111,DE
+3211097856,3211097871,CL
+3211097872,3211097887,DE
+3211097888,3211098111,CL
3211098112,3211098367,US
3211098368,3211098383,CL
3211098384,3211098399,DE
@@ -89131,11 +92239,9 @@
3211099680,3211099711,GB
3211099712,3211099775,DE
3211099776,3211099903,GB
-3211099904,3211099919,CL
-3211099920,3211099935,DE
-3211099936,3211100159,CL
+3211099904,3211100159,DE
3211100160,3211101951,US
-3211101952,3211102207,SG
+3211101952,3211102207,CL
3211102208,3211102335,AU
3211102336,3211102463,BR
3211102464,3211102591,AU
@@ -89144,14 +92250,17 @@
3211102848,3211102975,BR
3211102976,3211103103,AU
3211103104,3211103231,BR
-3211103232,3211104767,AU
-3211104768,3211105791,US
+3211103232,3211104447,AU
+3211104448,3211104511,BR
+3211104512,3211104703,AU
+3211104704,3211104767,BR
+3211104768,3211105279,GB
+3211105280,3211105791,US
3211105792,3211106303,ES
3211106304,3211111423,US
3211111424,3211112447,JP
3211112448,3211112959,US
-3211112960,3211113215,CL
-3211113216,3211113471,SG
+3211112960,3211113471,CL
3211113472,3211113727,GB
3211113728,3211113983,LT
3211113984,3211114239,US
@@ -89184,49 +92293,25 @@
3211145216,3211147263,NI
3211147264,3211148287,CR
3211148288,3211165695,CO
-3211165696,3211165951,HN
-3211165952,3211165983,UY
-3211165984,3211166415,HN
-3211166416,3211166431,UY
-3211166432,3211167487,HN
-3211167488,3211167503,US
-3211167504,3211167519,HN
-3211167520,3211167527,US
-3211167528,3211167927,HN
-3211167928,3211167935,US
-3211167936,3211171487,HN
-3211171488,3211171503,ES
-3211171504,3211171511,HN
-3211171512,3211171519,ES
-3211171520,3211171791,HN
-3211171792,3211171807,ES
-3211171808,3211172047,HN
-3211172048,3211172063,NL
-3211172064,3211173183,HN
-3211173184,3211173199,NL
-3211173200,3211173279,HN
-3211173280,3211173295,NL
-3211173296,3211174415,HN
-3211174416,3211174431,CA
-3211174432,3211174687,HN
-3211174688,3211174703,CA
-3211174704,3211174719,HN
-3211174720,3211174735,CA
-3211174736,3211175199,HN
-3211175200,3211175215,BR
-3211175216,3211175295,HN
-3211175296,3211175327,BR
-3211175328,3211177831,HN
-3211177832,3211177839,CR
-3211177840,3211178583,HN
+3211165696,3211165727,HN
+3211165728,3211165735,UY
+3211165736,3211166559,HN
+3211166560,3211166567,UY
+3211166568,3211171071,HN
+3211171072,3211171327,US
+3211171328,3211172671,HN
+3211172672,3211172687,NL
+3211172688,3211178583,HN
3211178584,3211178591,ES
-3211178592,3211178671,HN
-3211178672,3211178703,ES
-3211178704,3211180887,HN
-3211180888,3211180895,CR
-3211180896,3211181119,HN
-3211181120,3211181135,CR
-3211181136,3211182079,HN
+3211178592,3211179087,HN
+3211179088,3211179103,US
+3211179104,3211179215,HN
+3211179216,3211179231,US
+3211179232,3211180687,HN
+3211180688,3211180695,BR
+3211180696,3211181439,HN
+3211181440,3211181447,CA
+3211181448,3211182079,HN
3211182080,3211194367,CO
3211194368,3211195391,DO
3211195392,3211214847,AR
@@ -89311,7 +92396,8 @@
3220033536,3220037631,IE
3220037632,3220039679,US
3220039680,3220040703,NL
-3220040704,3220041215,JP
+3220040704,3220040959,JP
+3220040960,3220041215,BR
3220041216,3220041471,HK
3220041472,3220041727,BR
3220041728,3220042239,JP
@@ -89325,7 +92411,10 @@
3220063744,3220066303,US
3220066304,3220070399,JP
3220070400,3220078591,IE
-3220078592,3220127743,US
+3220078592,3220080639,BR
+3220080640,3220094975,US
+3220094976,3220103167,BR
+3220103168,3220127743,US
3220127744,3220135935,AU
3220135936,3220152319,JP
3220152320,3220161535,AU
@@ -89405,7 +92494,9 @@
3221656832,3221657087,AU
3221657088,3221664255,US
3221664512,3221757951,US
-3221757952,3221759999,MY
+3221757952,3221758975,MY
+3221758976,3221759231,AU
+3221759232,3221759999,MY
3221760000,3221761023,IN
3221761024,3221779455,US
3221779456,3221780479,IN
@@ -89442,6 +92533,7 @@
3222036992,3222037247,CA
3222037248,3222037503,GB
3222037504,3222040575,US
+3222040576,3222041599,BR
3222042624,3222044927,US
3222044928,3222045183,CA
3222045184,3222056447,US
@@ -89640,10 +92732,8 @@
3223435008,3223437311,US
3223437312,3223447551,CH
3223447552,3223447807,US
-3223447808,3223448063,NL
-3223448064,3223449087,US
-3223449088,3223449343,NL
-3223449344,3223453183,US
+3223447808,3223449599,NL
+3223449600,3223453183,US
3223453184,3223453439,DE
3223453440,3223458559,US
3223458560,3223458815,GB
@@ -89667,7 +92757,7 @@
3223481088,3223481343,SE
3223481344,3223483391,US
3223483392,3223483647,NL
-3223483904,3223499519,US
+3223483648,3223499519,US
3223499520,3223499775,FI
3223499776,3223504639,US
3223504640,3223504895,CA
@@ -89807,7 +92897,7 @@
3223906304,3223909375,CA
3223909376,3223911935,US
3223911936,3223912191,CA
-3223912448,3223938815,US
+3223912192,3223938815,US
3223938816,3223946239,GB
3223946240,3223947519,CH
3223947520,3223948287,US
@@ -90116,8 +93206,8 @@
3225081088,3225081343,CA
3225081344,3225082367,US
3225082368,3225082623,IT
-3225082624,3225084671,US
-3225084672,3225085183,NL
+3225082624,3225084415,US
+3225084416,3225085183,NL
3225085184,3225085439,ES
3225085440,3225089279,US
3225089280,3225089535,CA
@@ -90334,7 +93424,9 @@
3225847552,3225847807,AU
3225847808,3225848063,IT
3225848064,3225848831,US
-3225848832,3225853951,DE
+3225848832,3225849855,DE
+3225849856,3225850111,US
+3225850112,3225853951,DE
3225853952,3225857023,US
3225857024,3225857279,CA
3225857280,3225857535,US
@@ -90451,9 +93543,7 @@
3226067456,3226067711,BE
3226067712,3226068223,US
3226068224,3226068479,GB
-3226068480,3226074879,US
-3226074880,3226075135,AT
-3226075136,3226110719,US
+3226068480,3226110719,US
3226110720,3226128639,AU
3226128640,3226140927,US
3226140928,3226143487,CA
@@ -90582,8 +93672,7 @@
3226581248,3226583295,US
3226583296,3226583551,CA
3226583552,3226583807,SE
-3226583808,3226585087,US
-3226587136,3226590207,US
+3226583808,3226590207,US
3226590208,3226591231,NL
3226591232,3226592255,CA
3226592256,3226592767,US
@@ -90874,8 +93963,8 @@
3227312384,3227320319,US
3227320320,3227362047,FR
3227362048,3227362303,US
-3227362304,3227362559,GB
-3227362560,3227385855,FR
+3227362304,3227363327,GB
+3227363328,3227385855,FR
3227385856,3227391999,US
3227392000,3227392255,PT
3227392256,3227393023,US
@@ -90975,18 +94064,13 @@
3227467776,3227468287,US
3227468288,3227468799,CA
3227468800,3227484159,US
-3227484160,3227503871,CA
-3227503872,3227504127,US
-3227504128,3227517183,CA
-3227517184,3227518719,ZA
-3227518720,3227519231,MU
-3227519232,3227521279,ZA
+3227484160,3227517183,CA
+3227517184,3227521279,ZA
3227521280,3227521791,US
3227521792,3227522559,ZA
3227522560,3227522815,MU
3227522816,3227523071,US
-3227523072,3227524607,MU
-3227524608,3227525119,ZA
+3227523072,3227525119,ZA
3227525120,3227525375,MU
3227525376,3227526143,ZA
3227526144,3227526399,US
@@ -91031,8 +94115,7 @@
3227559168,3227559423,GB
3227559424,3227559935,ZA
3227559936,3227562239,US
-3227562240,3227562495,MU
-3227562496,3227566079,ZA
+3227562240,3227566079,ZA
3227566080,3227566335,US
3227566336,3227566847,MU
3227566848,3227568127,ZA
@@ -91243,16 +94326,14 @@
3227804672,3227804927,US
3227804928,3227805183,CA
3227805184,3227805439,SG
-3227805440,3227805695,FI
+3227805440,3227805695,GB
3227805696,3227806463,US
-3227806464,3227806495,FI
-3227806496,3227806527,GB
-3227806528,3227806719,FI
+3227806464,3227806719,GB
3227806720,3227806975,US
3227806976,3227807039,SG
3227807040,3227807743,US
-3227807744,3227812351,FI
-3227812608,3227813375,FI
+3227807744,3227812351,GB
+3227812608,3227813375,GB
3227813376,3227813631,US
3227813632,3227815167,GB
3227815168,3227815935,US
@@ -91261,7 +94342,8 @@
3227818496,3227818751,GB
3227818752,3227819263,MX
3227819264,3227819519,AR
-3227819520,3227822847,MX
+3227819520,3227822079,MX
+3227822336,3227822847,MX
3227822848,3227823103,HN
3227823104,3227824383,MX
3227824384,3227824639,BR
@@ -91317,9 +94399,9 @@
3227879680,3227879935,GB
3227879936,3227880959,US
3227880960,3227881215,EG
-3227881216,3227883319,US
-3227883320,3227883320,CA
-3227883321,3227885823,US
+3227881216,3227883007,US
+3227883008,3227883519,CA
+3227883520,3227885823,US
3227885824,3227887871,ES
3227887872,3227888127,PR
3227888128,3227888383,BE
@@ -91513,6 +94595,7 @@
3228297984,3228298495,NL
3228298496,3228309247,US
3228309248,3228311039,DE
+3228311296,3228311551,DE
3228311808,3228312063,DE
3228312320,3228316159,DE
3228316160,3228316415,US
@@ -91796,7 +94879,9 @@
3229391360,3229391615,CN
3229391616,3229391871,AT
3229391872,3229395455,US
-3229395456,3229408255,RU
+3229395456,3229401087,RU
+3229401088,3229405183,GB
+3229405184,3229408255,RU
3229408256,3229412095,US
3229412096,3229412351,DE
3229412352,3229412607,US
@@ -92119,8 +95204,8 @@
3230318592,3230318847,GB
3230318848,3230321663,US
3230321664,3230321919,PT
-3230321920,3230323199,US
-3230323200,3230323711,AT
+3230321920,3230323455,US
+3230323456,3230323711,AT
3230323712,3230327807,US
3230327808,3230328063,AT
3230328064,3230328319,GB
@@ -92152,16 +95237,20 @@
3230370560,3230370815,US
3230370816,3230372607,CA
3230372608,3230372863,US
-3230372864,3230374399,CA
-3230374400,3230374655,US
-3230374656,3230383359,CA
+3230372864,3230383359,CA
3230383360,3230383615,US
3230383616,3230384127,CA
3230384128,3230384383,MF
3230384384,3230387455,CA
3230387456,3230387711,US
3230387712,3230400255,CA
-3230400256,3230400767,US
+3230400256,3230402559,US
+3230402560,3230404607,BR
+3230406656,3230414847,BR
+3230414848,3230415871,CL
+3230415872,3230416895,AR
+3230424064,3230425087,EC
+3230432256,3230432767,CO
3230433280,3230436351,CN
3230436352,3230437375,AU
3230437376,3230439423,PK
@@ -92176,10 +95265,15 @@
3230460928,3230463999,IN
3230465024,3230466047,BD
3230531584,3230662655,ZA
+3230679040,3230681087,BR
3230681088,3230683135,FR
3230683136,3230686207,BD
3230686208,3230687231,ID
+3230687232,3230695423,BR
3230695424,3230728191,US
+3230777344,3230779391,BR
+3230783488,3230784511,BR
+3230784512,3230785535,MX
3230785536,3230823679,US
3230823680,3230823935,DK
3230823936,3230824191,US
@@ -92779,7 +95873,8 @@
3231737600,3231738367,US
3231738368,3231738623,NL
3231738624,3231739135,US
-3231739136,3231739647,NL
+3231739136,3231739391,GB
+3231739392,3231739647,PL
3231739648,3231739903,BR
3231739904,3231742719,US
3231742720,3231742975,FR
@@ -93115,9 +96210,7 @@
3233487872,3233488895,CA
3233488896,3233546751,US
3233546752,3233547007,CA
-3233547008,3233547519,US
-3233547520,3233547775,CA
-3233547776,3233548799,US
+3233547008,3233548799,US
3233548800,3233549055,PT
3233549056,3233549311,BR
3233549312,3233557247,US
@@ -93127,7 +96220,7 @@
3233562368,3233562879,GB
3233562880,3233563135,FR
3233563136,3233563903,US
-3233563904,3233564159,GB
+3233563904,3233564159,NL
3233564160,3233564415,US
3233564416,3233564671,NZ
3233564672,3233564927,US
@@ -93149,8 +96242,7 @@
3233575936,3233576191,RU
3233576192,3233576447,GB
3233576448,3233577215,US
-3233577216,3233577471,AT
-3233577472,3233577727,GB
+3233577216,3233577727,NL
3233577728,3233578239,US
3233578240,3233578495,GB
3233578496,3233578751,US
@@ -93198,7 +96290,7 @@
3233617664,3233617919,GB
3233617920,3233618175,JP
3233618176,3233620479,US
-3233620480,3233620735,AU
+3233620480,3233620735,NZ
3233620736,3233620991,US
3233620992,3233622015,CA
3233622016,3233622271,US
@@ -93250,8 +96342,7 @@
3233676288,3233677311,US
3233677312,3233677567,CA
3233677568,3233684991,US
-3233684992,3233685247,MX
-3233685248,3233685503,BR
+3233684992,3233685503,MX
3233685504,3233688575,US
3233688576,3233688831,GB
3233688832,3233692159,US
@@ -93375,7 +96466,7 @@
3234015744,3234016255,IE
3234016256,3234019327,AU
3234019328,3234023423,US
-3234023424,3234023679,PL
+3234023424,3234023679,NL
3234023680,3234030079,US
3234030080,3234030335,DE
3234030336,3234031103,US
@@ -93446,20 +96537,14 @@
3234198784,3234199039,US
3234199040,3234201343,CA
3234201344,3234203647,US
-3234203648,3234205183,BR
-3234205184,3234205439,AR
-3234205440,3234205695,BR
+3234203648,3234205695,AR
3234205696,3234226431,US
3234226432,3234226687,IN
3234226688,3234226983,US
3234226984,3234226991,CA
3234226992,3234227455,US
-3234227456,3234227839,CA
-3234227840,3234227871,US
-3234227872,3234227903,CA
-3234227904,3234227935,US
-3234227936,3234227951,CA
-3234227952,3234228223,US
+3234227456,3234227711,CA
+3234227712,3234228223,US
3234228224,3234228287,CA
3234228288,3234229215,US
3234229216,3234229223,SE
@@ -93506,7 +96591,7 @@
3234557440,3234564607,US
3234564608,3234566911,KR
3234566912,3234568703,US
-3234568704,3234568959,AU
+3234568704,3234568959,NZ
3234568960,3234569215,US
3234569728,3234569983,CL
3234569984,3234574335,US
@@ -93606,7 +96691,9 @@
3234841600,3234841855,PT
3234841856,3234842367,AU
3234842368,3234842623,US
-3234842624,3234844415,BR
+3234842624,3234843647,BR
+3234843648,3234844159,MX
+3234844160,3234844415,BR
3234844416,3234853375,US
3234853376,3234853631,TH
3234853632,3234853887,US
@@ -93625,7 +96712,9 @@
3235044376,3235044383,GB
3235044384,3235045375,US
3235045376,3235045887,CA
-3235045888,3235065343,US
+3235045888,3235046831,US
+3235046832,3235046847,AF
+3235046848,3235065343,US
3235065344,3235065855,CA
3235065856,3235068511,US
3235068512,3235068575,IT
@@ -93649,12 +96738,17 @@
3235641856,3235642111,US
3235642112,3235643135,CA
3235643136,3235745791,US
-3235745792,3235745792,DE
-3235745793,3235747839,US
+3235745792,3235746047,DE
+3235746048,3235746303,US
+3235746304,3235746559,DE
+3235746560,3235747839,US
3235747840,3235748095,GB
3235748096,3235748351,US
3235748352,3235748607,GB
-3235748608,3235774719,US
+3235748608,3235753983,US
+3235753984,3235754239,SG
+3235754240,3235754495,JP
+3235754496,3235774719,US
3235774720,3235776767,CA
3235776768,3235800575,US
3235800576,3235801087,CA
@@ -93748,13 +96842,13 @@
3236102400,3236106239,PH
3236106240,3236140543,US
3236140544,3236141055,CA
-3236141056,3236142335,US
-3236142336,3236142463,CA
-3236142464,3236146195,US
+3236141056,3236146195,US
3236146196,3236146199,GB
3236146200,3236147063,US
3236147064,3236147071,FR
-3236147072,3236157951,US
+3236147072,3236156959,US
+3236156960,3236156967,GB
+3236156968,3236157951,US
3236157952,3236158207,GB
3236158208,3236167935,US
3236167936,3236175871,CA
@@ -93953,13 +97047,7 @@
3237036544,3237036799,CN
3237036800,3237038079,US
3237038080,3237038335,CA
-3237038336,3237038847,US
-3237038848,3237038863,AE
-3237038864,3237038879,US
-3237038880,3237038911,AE
-3237038912,3237038927,US
-3237038928,3237039103,AE
-3237039104,3237039183,US
+3237038336,3237039183,US
3237039184,3237039199,IN
3237039200,3237039215,US
3237039216,3237039295,IN
@@ -93971,9 +97059,7 @@
3237040896,3237041151,IN
3237041152,3237041183,US
3237041184,3237041199,IN
-3237041200,3237041407,US
-3237041408,3237041663,CA
-3237041664,3237043967,US
+3237041200,3237043967,US
3237043968,3237044223,CH
3237044224,3237046647,US
3237046648,3237046655,SE
@@ -93981,7 +97067,8 @@
3237047040,3237047295,FR
3237047296,3237048831,US
3237048832,3237049087,IN
-3237049088,3237049599,CA
+3237049088,3237049343,US
+3237049344,3237049599,CA
3237049600,3237050111,US
3237050112,3237050159,GB
3237050160,3237050175,US
@@ -93994,7 +97081,8 @@
3237125312,3237154815,US
3237154816,3237155839,ES
3237155840,3237156863,AU
-3237156864,3237167103,US
+3237156864,3237170175,US
+3237170176,3237171199,CA
3237171200,3237182463,US
3237182464,3237183487,NL
3237183488,3237205503,US
@@ -94066,7 +97154,9 @@
3237554432,3237554434,SG
3237554435,3237554435,US
3237554436,3237554463,SG
-3237554464,3237568511,US
+3237554464,3237554943,US
+3237554944,3237555199,SG
+3237555200,3237568511,US
3237568512,3237572607,CA
3237572608,3237576703,US
3237576704,3237609471,CA
@@ -94116,94 +97206,43 @@
3237773312,3237777407,CA
3237777408,3237781503,US
3237781504,3237785599,CA
-3237785600,3237785647,CN
-3237785648,3237785663,US
-3237785664,3237785743,CN
-3237785744,3237785751,US
-3237785752,3237785839,CN
-3237785840,3237785855,US
-3237785856,3237785943,CN
-3237785944,3237785951,US
-3237785952,3237786047,CN
-3237786048,3237786055,US
-3237786056,3237786151,CN
-3237786152,3237786159,US
-3237786160,3237786239,CN
-3237786240,3237786247,US
-3237786248,3237786303,CN
-3237786304,3237786319,US
-3237786320,3237786415,CN
-3237786416,3237786423,US
-3237786424,3237786527,CN
-3237786528,3237786535,US
-3237786536,3237786711,CN
-3237786712,3237786719,US
-3237786720,3237786759,CN
-3237786760,3237786767,US
-3237786768,3237786975,CN
-3237786976,3237786983,US
-3237786984,3237787103,CN
-3237787104,3237787111,US
-3237787112,3237787159,CN
-3237787160,3237787167,US
-3237787168,3237787287,CN
-3237787288,3237787295,US
-3237787296,3237787375,CN
-3237787376,3237787383,US
-3237787384,3237787455,CN
-3237787456,3237787463,US
-3237787464,3237787551,CN
-3237787552,3237787559,US
-3237787560,3237787695,CN
-3237787696,3237787703,US
-3237787704,3237787719,CN
-3237787720,3237787727,US
-3237787728,3237787759,CN
-3237787760,3237787767,US
-3237787768,3237787839,CN
-3237787840,3237787847,US
-3237787848,3237788023,CN
-3237788024,3237788031,US
-3237788032,3237788079,CN
-3237788080,3237788087,US
-3237788088,3237788151,CN
-3237788152,3237788159,US
-3237788160,3237788223,CN
-3237788224,3237788239,US
-3237788240,3237788279,CN
-3237788280,3237788287,US
-3237788288,3237788455,CN
-3237788456,3237788471,US
-3237788472,3237788487,CN
-3237788488,3237788551,US
-3237788552,3237788559,CN
-3237788560,3237788583,US
-3237788584,3237788591,CN
-3237788592,3237788727,US
-3237788728,3237788855,CN
-3237788856,3237788863,US
-3237788864,3237788903,CN
-3237788904,3237788911,US
-3237788912,3237788927,CN
-3237788928,3237788935,US
-3237788936,3237788943,CN
-3237788944,3237788951,US
-3237788952,3237789071,CN
-3237789072,3237789079,US
-3237789080,3237789247,CN
-3237789248,3237789255,US
-3237789256,3237789311,CN
-3237789312,3237789319,US
-3237789320,3237789367,CN
-3237789368,3237789375,US
-3237789376,3237789415,CN
-3237789416,3237789423,US
-3237789424,3237789479,CN
-3237789480,3237789487,US
-3237789488,3237789647,CN
-3237789648,3237789655,US
-3237789656,3237789695,CN
-3237789696,3237797887,US
+3237785600,3237786967,US
+3237786968,3237786975,CN
+3237786976,3237787175,US
+3237787176,3237787191,CN
+3237787192,3237787215,US
+3237787216,3237787223,CN
+3237787224,3237787279,US
+3237787280,3237787287,CN
+3237787288,3237787327,US
+3237787328,3237787343,CN
+3237787344,3237787423,US
+3237787424,3237787431,CN
+3237787432,3237787439,US
+3237787440,3237787447,CN
+3237787448,3237787463,US
+3237787464,3237787471,CN
+3237787472,3237787567,US
+3237787568,3237787575,CN
+3237787576,3237787607,US
+3237787608,3237787615,CN
+3237787616,3237787687,US
+3237787688,3237787695,CN
+3237787696,3237787847,US
+3237787848,3237787855,CN
+3237787856,3237788063,US
+3237788064,3237788071,CN
+3237788072,3237788087,US
+3237788088,3237788095,CN
+3237788096,3237788103,US
+3237788104,3237788111,CN
+3237788112,3237788135,US
+3237788136,3237788143,CN
+3237788144,3237788183,US
+3237788184,3237788207,CN
+3237788208,3237788343,US
+3237788344,3237788359,CN
+3237788360,3237797887,US
3237797888,3237801983,CA
3237801984,3237858303,US
3237858304,3237863423,CA
@@ -94474,7 +97513,7 @@
3237969152,3237969407,RO
3237969408,3238002687,US
3238002688,3238008831,NL
-3238008832,3238010879,ES
+3238008832,3238010879,HU
3238010880,3238017023,CH
3238017024,3238018303,DK
3238018304,3238018559,UA
@@ -94650,7 +97689,7 @@
3239063552,3239075839,DE
3239075840,3239076095,GB
3239076096,3239076351,DE
-3239076352,3239076607,RU
+3239076352,3239076607,CH
3239076608,3239076863,PL
3239076864,3239077119,NL
3239077120,3239077375,UA
@@ -94666,7 +97705,7 @@
3239088640,3239088895,DK
3239088896,3239089151,IL
3239089152,3239089407,RO
-3239089408,3239089919,GB
+3239089664,3239089919,GB
3239089920,3239090175,DE
3239090176,3239090431,SI
3239090432,3239090687,ES
@@ -94798,7 +97837,7 @@
3239264768,3239266303,RU
3239266816,3239267327,UA
3239267328,3239267839,FR
-3239267840,3239268351,DE
+3239267840,3239268351,CH
3239268352,3239268863,SE
3239268864,3239269375,RU
3239269376,3239270399,UA
@@ -94807,8 +97846,7 @@
3239271424,3239271935,AT
3239271936,3239272447,CH
3239272960,3239273471,GB
-3239273472,3239273983,UA
-3239273984,3239274495,RU
+3239273472,3239274495,RU
3239274496,3239275007,PL
3239275520,3239276543,UA
3239276544,3239277055,LU
@@ -95834,7 +98872,7 @@
3240855552,3240857599,IT
3240857600,3240857855,PL
3240858624,3240858879,PL
-3240859136,3240859391,GB
+3240859136,3240859391,NL
3240859392,3240859647,SE
3240859648,3240861183,CH
3240861184,3240861439,AT
@@ -96111,11 +99149,15 @@
3242609920,3242610047,GB
3242610048,3242610271,FR
3242610272,3242610303,FI
-3242610304,3242615167,FR
+3242610304,3242614527,FR
+3242614528,3242614783,PL
+3242614784,3242615167,FR
3242615168,3242615295,IE
3242615296,3242615871,FR
3242615872,3242615935,PL
-3242615936,3242616191,FR
+3242615936,3242616029,FR
+3242616030,3242616030,NL
+3242616031,3242616191,FR
3242616192,3242616319,ES
3242616320,3242616991,FR
3242616992,3242616992,IT
@@ -96128,7 +99170,10 @@
3242618496,3242620223,FR
3242620224,3242620239,PT
3242620240,3242620255,ES
-3242620256,3242622975,FR
+3242620256,3242622915,FR
+3242622916,3242622927,PL
+3242622928,3242622959,FR
+3242622960,3242622975,PL
3242622976,3242655743,IT
3242655744,3242721279,NO
3242721280,3242852351,CH
@@ -96288,7 +99333,6 @@
3244819456,3244819711,GB
3244819712,3244819967,RO
3244819968,3244820223,NL
-3244820224,3244820479,UA
3244820480,3244820735,BE
3244820736,3244820991,DE
3244820992,3244821247,SI
@@ -96555,7 +99599,7 @@
3244897536,3244897791,RU
3244897792,3244898047,GB
3244898048,3244898303,DE
-3244898304,3244898559,IR
+3244898304,3244898559,KW
3244898560,3244898815,GI
3244899072,3244899327,RU
3244899328,3244899583,BG
@@ -96662,7 +99706,7 @@
3244929792,3244930047,RU
3244930048,3244930303,PL
3244930304,3244930559,AT
-3244930560,3244930815,GB
+3244930560,3244930815,CA
3244930816,3244931071,NL
3244931328,3244931583,RO
3244931584,3244931839,FR
@@ -96823,7 +99867,6 @@
3245066240,3245067263,UA
3245067264,3245068287,GB
3245069312,3245070335,PL
-3245070336,3245071359,RU
3245071360,3245072383,NL
3245072384,3245073407,UA
3245073408,3245076479,RU
@@ -97031,7 +100074,9 @@
3245215744,3245217791,UA
3245217792,3245218815,DE
3245218816,3245219839,AT
-3245219840,3245221887,FI
+3245219840,3245220863,FI
+3245220864,3245221119,SE
+3245221120,3245221887,FI
3245221888,3245223935,DE
3245223936,3245225471,NL
3245225728,3245225983,NL
@@ -97209,7 +100254,8 @@
3246129152,3246131711,RU
3246131712,3246132735,SY
3246132736,3246132991,DE
-3246132992,3246135807,RU
+3246132992,3246134271,RU
+3246134784,3246135807,RU
3246135808,3246136831,SY
3246136832,3246138879,RU
3246138880,3246139391,SY
@@ -97244,7 +100290,7 @@
3246182400,3246186495,SY
3246186496,3246187519,RU
3246187520,3246190591,SY
-3246190592,3246191615,GB
+3246190592,3246191615,US
3246191616,3246192639,DE
3246192640,3246193663,PS
3246193664,3246194175,SY
@@ -97255,7 +100301,7 @@
3246329088,3246329855,ES
3246350848,3246351103,ES
3246351616,3246352639,ES
-3246360576,3246362623,US
+3246359552,3246362623,US
3246362624,3246371073,ES
3246371074,3246371074,PT
3246371075,3246379007,ES
@@ -97441,7 +100487,7 @@
3247366144,3247370495,FI
3247371008,3247371263,PL
3247371264,3247371519,SE
-3247371520,3247371775,GB
+3247371520,3247371775,CA
3247371776,3247372031,RU
3247372032,3247372287,FI
3247372288,3247372543,RO
@@ -97676,7 +100722,6 @@
3248792320,3248792343,GB
3248792352,3248792407,GB
3248792416,3248792439,GB
-3248792456,3248792463,GB
3248792480,3248792527,GB
3248792536,3248792575,GB
3248796608,3248796863,GB
@@ -98237,6 +101282,7 @@
3250642944,3250651135,CH
3250651136,3250659327,IT
3250659328,3250660607,GB
+3250661376,3250662399,GB
3250667520,3250675711,PL
3250675712,3250683903,GB
3250683904,3250692095,CH
@@ -98305,8 +101351,7 @@
3251114496,3251114751,RU
3251114752,3251115007,RO
3251115008,3251115263,PL
-3251115264,3251115519,RU
-3251115520,3251115775,UA
+3251115264,3251115775,RU
3251115776,3251116031,BE
3251116288,3251116543,GB
3251117056,3251117311,BG
@@ -98378,7 +101423,8 @@
3251151104,3251151359,UA
3251151360,3251151615,DE
3251151872,3251152127,NL
-3251152128,3251152639,RO
+3251152128,3251152383,RO
+3251152384,3251152639,GB
3251152896,3251153151,RU
3251153408,3251153663,TR
3251153664,3251153919,FR
@@ -98418,7 +101464,7 @@
3251163904,3251164159,RU
3251164160,3251164415,UA
3251164416,3251164671,IT
-3251164672,3251164927,NL
+3251164672,3251164927,GB
3251164928,3251165439,PL
3251165696,3251165951,DE
3251165952,3251166207,UA
@@ -98587,7 +101633,6 @@
3251269120,3251269375,DK
3251269376,3251269631,FR
3251269888,3251270143,GB
-3251270144,3251270399,PL
3251270400,3251270655,NO
3251270656,3251270911,DE
3251270912,3251271167,PL
@@ -98658,12 +101703,10 @@
3251634176,3251896319,FI
3251896320,3252158463,NO
3252158464,3252174847,LT
-3252174848,3252176127,NL
-3252176128,3252177919,SE
+3252174848,3252175871,NL
+3252175872,3252177919,SE
3252177920,3252178943,HR
-3252178944,3252179199,SE
-3252179200,3252179967,NL
-3252179968,3252191231,SE
+3252178944,3252191231,SE
3252191232,3252196351,HR
3252196352,3252197119,LT
3252197120,3252197375,SE
@@ -98672,8 +101715,8 @@
3252220928,3252221183,SE
3252221184,3252222463,LT
3252222464,3252223487,SE
-3252223488,3252223999,LT
-3252224000,3252232319,SE
+3252223488,3252224511,LT
+3252224512,3252232319,SE
3252232320,3252232576,NL
3252232577,3252256767,SE
3252256768,3252273151,EE
@@ -98968,7 +102011,11 @@
3253248000,3253248255,DE
3253248256,3253270527,RU
3253270528,3253271551,BY
-3253271552,3253338111,RU
+3253271552,3253313535,RU
+3253313536,3253313791,NL
+3253313792,3253317631,RU
+3253317632,3253319679,GB
+3253319680,3253338111,RU
3253338112,3253338367,PL
3253338368,3253380351,SE
3253380352,3253380607,GB
@@ -99151,7 +102198,8 @@
3253704704,3253705215,UA
3253705728,3253706239,DE
3253706240,3253706751,RO
-3253706752,3253708799,DE
+3253707264,3253707775,DE
+3253707776,3253708287,MD
3253708800,3253709311,DK
3253709312,3253709823,UA
3253709824,3253710335,RO
@@ -99191,129 +102239,193 @@
3253729792,3253730303,UA
3253730304,3253730815,RO
3253730816,3253731327,UA
-3253731328,3253731583,DE
-3253731584,3253737215,GB
+3253731328,3253731713,DE
+3253731714,3253731714,GB
+3253731715,3253731839,DE
+3253731840,3253732351,GB
+3253732352,3253733375,DE
+3253733376,3253734399,GB
+3253734400,3253734979,DE
+3253734980,3253734980,GB
+3253734981,3253735167,DE
+3253735168,3253735423,GB
+3253735424,3253735425,DE
+3253735426,3253735426,GB
+3253735427,3253735679,DE
+3253735680,3253735935,GB
+3253735936,3253737215,DE
3253737216,3253737471,ES
-3253737472,3253737791,GB
+3253737472,3253737605,DE
+3253737606,3253737606,GB
+3253737607,3253737791,DE
3253737792,3253737807,FR
-3253737808,3253737823,GB
+3253737808,3253737823,DE
3253737824,3253737831,PL
3253737832,3253737839,AT
-3253737840,3253737847,GB
+3253737840,3253737847,DE
3253737848,3253737855,HU
-3253737856,3253738559,GB
+3253737856,3253738495,DE
+3253738496,3253738559,GB
3253738560,3253738567,CZ
3253738568,3253738569,BE
3253738570,3253738570,US
3253738571,3253738575,BE
-3253738576,3253741679,GB
+3253738576,3253740543,GB
+3253740544,3253741615,DE
+3253741616,3253741631,GB
+3253741632,3253741679,DE
3253741680,3253741695,RU
-3253741696,3253741730,GB
+3253741696,3253741730,DE
3253741731,3253741731,SE
-3253741732,3253742227,GB
+3253741732,3253741816,DE
+3253741817,3253741817,GB
+3253741818,3253742079,DE
+3253742080,3253742227,GB
3253742228,3253742228,US
-3253742229,3253744415,GB
+3253742229,3253742335,GB
+3253742336,3253742591,DE
+3253742592,3253744415,GB
3253744416,3253744447,CH
3253744448,3253744511,GB
3253744512,3253744512,US
-3253744513,3253745983,GB
+3253744513,3253744895,GB
+3253744896,3253744908,DE
+3253744909,3253744909,GB
+3253744910,3253745919,DE
+3253745920,3253745983,GB
3253745984,3253745999,SE
3253746000,3253746007,DK
3253746008,3253746015,IE
3253746016,3253746023,AT
3253746024,3253746031,CH
3253746032,3253746039,FI
-3253746040,3253746047,GB
+3253746040,3253746047,DE
3253746048,3253746111,IT
3253746112,3253746175,DE
-3253746176,3253760511,GB
+3253746176,3253746431,GB
+3253746432,3253746559,DE
+3253746560,3253746687,GB
+3253746688,3253747711,DE
+3253747712,3253759999,GB
+3253760000,3253760511,DE
3253760512,3253760767,FR
-3253760768,3253761407,GB
+3253760768,3253761407,DE
3253761408,3253761416,ES
3253761417,3253761417,GB
3253761418,3253761471,ES
-3253761472,3253762815,GB
+3253761472,3253762815,DE
3253762816,3253762943,CH
-3253762944,3253763071,GB
+3253762944,3253762948,DE
+3253762949,3253762949,GB
+3253762950,3253763071,DE
3253763072,3253763327,SE
-3253763328,3253765119,GB
+3253763328,3253763583,DE
+3253763584,3253763839,GB
+3253763840,3253764095,DE
+3253764096,3253765119,GB
3253765120,3253765183,ES
3253765184,3253765247,FR
3253765248,3253765279,PL
3253765280,3253765295,NL
3253765296,3253765311,BE
3253765312,3253765375,TR
-3253765376,3253766463,GB
+3253765376,3253766143,DE
+3253766144,3253766463,GB
3253766464,3253766527,NL
3253766528,3253766655,GB
3253766656,3253766911,FR
3253766912,3253767167,GB
3253767168,3253767615,DE
3253767616,3253767675,IE
-3253767676,3253767679,DE
-3253767680,3253767711,GB
-3253767712,3253767743,DE
-3253767744,3253768369,GB
+3253767676,3253767811,DE
+3253767812,3253767812,GB
+3253767813,3253767935,DE
+3253767936,3253768369,GB
3253768370,3253768370,ES
3253768371,3253768393,GB
3253768394,3253768394,SE
3253768395,3253768565,GB
3253768566,3253768566,DE
-3253768567,3253769362,GB
-3253769363,3253769363,DE
-3253769364,3253769455,GB
-3253769456,3253769463,DE
-3253769464,3253770983,GB
-3253770984,3253770984,DE
-3253770985,3253771199,GB
-3253771200,3253771263,IE
-3253771264,3253771561,GB
+3253768567,3253768703,GB
+3253768704,3253768729,DE
+3253768730,3253768730,GB
+3253768731,3253770657,DE
+3253770658,3253770658,GB
+3253770659,3253770699,DE
+3253770700,3253770700,GB
+3253770701,3253770991,DE
+3253770992,3253770999,GB
+3253771000,3253771165,DE
+3253771166,3253771166,GB
+3253771167,3253771199,DE
+3253771200,3253771217,IE
+3253771218,3253771219,GB
+3253771220,3253771263,IE
+3253771264,3253771519,DE
+3253771520,3253771561,GB
3253771562,3253771562,DE
-3253771563,3253772063,GB
-3253772064,3253772095,DE
-3253772096,3253772519,GB
-3253772520,3253772527,DE
-3253772528,3253773055,GB
-3253773056,3253773311,DE
-3253773312,3253774583,GB
-3253774584,3253774591,DE
-3253774592,3253775183,GB
+3253771563,3253771775,GB
+3253771776,3253771792,DE
+3253771793,3253771793,GB
+3253771794,3253772191,DE
+3253772192,3253772207,GB
+3253772208,3253772311,DE
+3253772312,3253772319,GB
+3253772320,3253774335,DE
+3253774336,3253774583,GB
+3253774584,3253775135,DE
+3253775136,3253775151,GB
+3253775152,3253775183,DE
3253775184,3253775191,FR
-3253775192,3253775215,GB
-3253775216,3253775223,DE
-3253775224,3253775586,GB
-3253775587,3253775587,DE
-3253775588,3253775599,GB
+3253775192,3253775401,DE
+3253775402,3253775402,GB
+3253775403,3253775468,DE
+3253775469,3253775469,GB
+3253775470,3253775599,DE
3253775600,3253775607,IT
-3253775608,3253775807,GB
+3253775608,3253775615,DE
+3253775616,3253775807,GB
3253775808,3253775823,DE
-3253775824,3253776159,GB
-3253776160,3253776175,DE
-3253776176,3253776303,GB
+3253775824,3253775871,GB
+3253775872,3253776303,DE
3253776304,3253776311,ES
-3253776312,3253776809,GB
+3253776312,3253776383,DE
+3253776384,3253776809,GB
3253776810,3253776810,CH
-3253776811,3253777791,GB
+3253776811,3253777407,GB
+3253777408,3253777791,DE
3253777792,3253777855,FR
-3253777856,3253778231,GB
+3253777856,3253778231,DE
3253778232,3253778239,FR
-3253778240,3253778271,GB
-3253778272,3253778287,DE
-3253778288,3253778391,GB
+3253778240,3253778391,DE
3253778392,3253778399,IT
-3253778400,3253778751,GB
+3253778400,3253778751,DE
3253778752,3253778879,BE
-3253778880,3253779215,GB
-3253779216,3253779247,DE
-3253779248,3253781247,GB
-3253781248,3253781415,DE
+3253778880,3253778911,DE
+3253778912,3253778943,NL
+3253778944,3253779135,DE
+3253779136,3253779167,NL
+3253779168,3253779455,DE
+3253779456,3253779711,GB
+3253779712,3253781415,DE
3253781416,3253781423,GB
3253781424,3253781503,DE
3253781504,3253781615,GB
3253781616,3253781631,FR
-3253781632,3253783487,GB
+3253781632,3253782015,GB
+3253782016,3253782527,DE
+3253782528,3253783487,GB
3253783488,3253783519,DE
-3253783520,3253796863,GB
+3253783520,3253783551,GB
+3253783552,3253784803,DE
+3253784804,3253784804,GB
+3253784805,3253785123,DE
+3253785124,3253785124,GB
+3253785125,3253788079,DE
+3253788080,3253788082,GB
+3253788083,3253794303,DE
+3253794304,3253796607,GB
+3253796608,3253796863,DE
3253796864,3253862399,SE
3253862400,3253862655,GB
3253862656,3253882879,FR
@@ -99445,7 +102557,9 @@
3254487264,3254487295,KM
3254487296,3254487419,CF
3254487420,3254487559,FR
-3254487560,3254487803,CI
+3254487560,3254487567,CI
+3254487568,3254487575,FR
+3254487576,3254487803,CI
3254487804,3254488431,FR
3254488432,3254488447,MG
3254488448,3254489087,FR
@@ -99727,7 +102841,6 @@
3254893568,3254894079,CZ
3254894080,3254894335,CH
3254894336,3254894591,SK
-3254894592,3254894847,DK
3254894848,3254895103,UA
3254895104,3254895359,GB
3254895360,3254895615,UA
@@ -100114,9 +103227,7 @@
3255743744,3255743999,US
3255744000,3255752959,SE
3255752960,3255753215,LI
-3255753216,3255760895,SE
-3255760896,3255761151,FO
-3255761152,3255762431,SE
+3255753216,3255762431,SE
3255762432,3255762943,BE
3255762944,3255771135,DE
3255779328,3255787519,DE
@@ -100167,7 +103278,7 @@
3256410112,3256410623,TR
3256410624,3256411135,GR
3256411136,3256411647,FR
-3256411648,3256412159,DE
+3256411648,3256412159,CH
3256412672,3256413183,RO
3256413184,3256413695,UA
3256413696,3256414207,PL
@@ -100450,9 +103561,9 @@
3257467904,3257468927,IT
3257469184,3257469439,IT
3257469952,3257470975,PL
-3257470976,3257471999,FI
+3257470976,3257471999,GB
3257472000,3257472511,SG
-3257472512,3257475071,FI
+3257472512,3257475071,GB
3257476864,3257477119,DE
3257481472,3257481727,DE
3257482240,3257482751,GB
@@ -100702,7 +103813,10 @@
3258230784,3258232831,NO
3258232832,3258249215,SE
3258249216,3258253311,NO
-3258253312,3258269695,NL
+3258253312,3258265599,NL
+3258267648,3258268671,NL
+3258268672,3258268927,IT
+3258269184,3258269695,NL
3258271744,3258272767,NL
3258272768,3258273791,FR
3258273792,3258288127,NL
@@ -100760,10 +103874,11 @@
3258511360,3258515455,CH
3258515456,3258580991,FR
3258580992,3258587135,SY
-3258587136,3258588159,GB
+3258587136,3258588159,US
3258588160,3258593279,RU
3258593280,3258595327,SY
-3258595328,3258599423,RU
+3258595328,3258597375,RU
+3258597888,3258599423,RU
3258599424,3258600959,PS
3258600960,3258613759,RU
3258613760,3258619903,SY
@@ -100773,7 +103888,7 @@
3258621952,3258630143,RU
3258630144,3258634239,SE
3258634240,3258636287,SY
-3258636288,3258637311,GB
+3258636288,3258637311,US
3258637312,3258637823,PS
3258637824,3258638335,RU
3258638336,3258642431,SY
@@ -100830,7 +103945,7 @@
3258771456,3258772479,KZ
3258772480,3258773503,RU
3258773504,3258774015,FR
-3258774016,3258774271,UA
+3258774016,3258774271,RU
3258774272,3258774527,DK
3258774528,3258776063,RU
3258776064,3258776319,GE
@@ -100931,7 +104046,6 @@
3259302400,3259303423,CH
3259303424,3259305983,SE
3259305984,3259310079,NL
-3259310336,3259311103,DK
3259311104,3259311615,DE
3259317248,3259318271,CH
3259318272,3259318343,GB
@@ -100997,8 +104111,8 @@
3259334544,3259334551,IE
3259334552,3259334655,GB
3259334656,3259338751,DE
-3259338752,3259339263,GB
-3259339520,3259341823,GB
+3259338752,3259339007,GB
+3259340800,3259341823,GB
3259342848,3259344895,CH
3259347456,3259347711,CH
3259348224,3259348479,CH
@@ -101024,7 +104138,7 @@
3259454976,3259457279,SE
3259457280,3259457535,IT
3259457536,3259466239,SE
-3259466240,3259466495,LI
+3259466240,3259466495,HU
3259466496,3259470847,SE
3259470848,3259471871,US
3259471872,3259479807,SE
@@ -101261,7 +104375,7 @@
3261759488,3261767679,IE
3261767680,3261775871,RS
3261775872,3261776383,PL
-3261776384,3261777407,RU
+3261776384,3261776895,RU
3261777408,3261777449,GB
3261777450,3261777451,NL
3261777452,3261777919,GB
@@ -101350,8 +104464,8 @@
3262034512,3262034519,AX
3262034520,3262034943,FI
3262034944,3262035199,AX
-3262035200,3262036991,FI
-3262036992,3262038015,AX
+3262035200,3262035967,FI
+3262035968,3262038015,AX
3262038016,3262038271,FR
3262038528,3262038783,IL
3262038784,3262039039,NO
@@ -101640,10 +104754,33 @@
3262473200,3262473203,ES
3262473204,3262473211,DE
3262473212,3262473215,FR
-3262473216,3262473323,JP
-3262473324,3262473327,KR
-3262473328,3262473471,JP
-3262473472,3262473473,DE
+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,3262473473,DE
3262473474,3262473478,US
3262473479,3262473480,CA
3262473481,3262473483,US
@@ -101704,7 +104841,7 @@
3262473972,3262473983,US
3262473984,3262473985,DE
3262473986,3262473986,TW
-3262473987,3262473987,IN
+3262473987,3262473987,DE
3262473988,3262473988,SG
3262473989,3262473989,IN
3262473990,3262473990,SG
@@ -101713,23 +104850,26 @@
3262473993,3262473993,IN
3262473994,3262473995,TW
3262473996,3262473996,MY
-3262473997,3262473998,ID
+3262473997,3262473997,ID
+3262473998,3262473998,DE
3262473999,3262473999,TW
3262474000,3262474000,SG
3262474001,3262474001,TW
-3262474002,3262474002,MY
+3262474002,3262474002,DE
3262474003,3262474003,TW
3262474004,3262474004,SG
3262474005,3262474005,TW
3262474006,3262474007,SG
3262474008,3262474009,TW
3262474010,3262474010,SG
-3262474011,3262474011,ID
+3262474011,3262474011,DE
3262474012,3262474013,SG
3262474014,3262474014,HK
3262474015,3262474016,SG
3262474017,3262474018,MY
-3262474019,3262474026,SG
+3262474019,3262474024,SG
+3262474025,3262474025,DE
+3262474026,3262474026,SG
3262474027,3262474027,CN
3262474028,3262474030,SG
3262474031,3262474031,IN
@@ -101742,12 +104882,15 @@
3262474038,3262474038,MY
3262474039,3262474039,TW
3262474040,3262474041,MY
-3262474042,3262474042,CN
+3262474042,3262474042,DE
3262474043,3262474043,SG
-3262474044,3262474044,GB
-3262474045,3262474048,SG
+3262474044,3262474044,DE
+3262474045,3262474047,SG
+3262474048,3262474048,DE
3262474049,3262474049,IN
-3262474050,3262474061,SG
+3262474050,3262474051,SG
+3262474052,3262474052,DE
+3262474053,3262474061,SG
3262474062,3262474063,CN
3262474064,3262474064,TW
3262474065,3262474065,IN
@@ -101762,10 +104905,12 @@
3262474076,3262474076,MY
3262474077,3262474077,SG
3262474078,3262474078,IN
-3262474079,3262474079,MY
+3262474079,3262474079,DE
3262474080,3262474083,SG
-3262474084,3262474084,TW
-3262474085,3262474087,SG
+3262474084,3262474084,DE
+3262474085,3262474085,SG
+3262474086,3262474086,DE
+3262474087,3262474087,SG
3262474088,3262474088,MY
3262474089,3262474089,SG
3262474090,3262474091,MY
@@ -101773,10 +104918,12 @@
3262474095,3262474095,HK
3262474096,3262474097,SG
3262474098,3262474098,MY
-3262474099,3262474102,SG
+3262474099,3262474100,SG
+3262474101,3262474101,DE
+3262474102,3262474102,SG
3262474103,3262474103,MY
3262474104,3262474104,CN
-3262474105,3262474105,IN
+3262474105,3262474105,DE
3262474106,3262474106,MY
3262474107,3262474107,CN
3262474108,3262474108,HK
@@ -101786,36 +104933,33 @@
3262474113,3262474113,PH
3262474114,3262474114,IN
3262474115,3262474115,SG
-3262474116,3262474116,TW
-3262474117,3262474117,IN
+3262474116,3262474117,DE
3262474118,3262474118,TH
3262474119,3262474119,TW
-3262474120,3262474120,BN
-3262474121,3262474121,TW
+3262474120,3262474121,DE
3262474122,3262474122,SG
3262474123,3262474125,MY
3262474126,3262474126,IN
-3262474127,3262474128,SG
+3262474127,3262474127,SG
+3262474128,3262474128,DE
3262474129,3262474130,MY
3262474131,3262474131,IN
-3262474132,3262474133,MY
+3262474132,3262474133,DE
3262474134,3262474134,CN
3262474135,3262474136,SG
-3262474137,3262474137,TW
-3262474138,3262474139,CN
+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,3262474153,IN
-3262474154,3262474154,SG
-3262474155,3262474155,MY
-3262474156,3262474156,IN
+3262474153,3262474156,DE
3262474157,3262474157,SG
3262474158,3262474159,MY
-3262474160,3262474162,SG
+3262474160,3262474161,DE
+3262474162,3262474162,SG
3262474163,3262474163,MY
3262474164,3262474164,IN
3262474165,3262474165,CN
@@ -101824,83 +104968,93 @@
3262474168,3262474168,TW
3262474169,3262474169,DE
3262474170,3262474170,SG
-3262474171,3262474171,MY
+3262474171,3262474171,DE
3262474172,3262474172,SG
-3262474173,3262474173,CN
+3262474173,3262474173,DE
3262474174,3262474174,TW
3262474175,3262474175,SG
3262474176,3262474176,MY
-3262474177,3262474177,SG
+3262474177,3262474177,DE
3262474178,3262474178,TW
3262474179,3262474179,CN
3262474180,3262474180,MY
3262474181,3262474181,SG
3262474182,3262474182,MY
-3262474183,3262474185,SG
+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,PH
+3262474193,3262474193,DE
3262474194,3262474194,SG
3262474195,3262474195,MY
-3262474196,3262474196,IN
-3262474197,3262474198,SG
+3262474196,3262474197,DE
+3262474198,3262474198,SG
3262474199,3262474199,CN
-3262474200,3262474200,MY
+3262474200,3262474200,DE
3262474201,3262474201,SG
3262474202,3262474203,CN
3262474204,3262474204,IN
3262474205,3262474205,SG
-3262474206,3262474206,IN
+3262474206,3262474206,DE
3262474207,3262474207,MY
3262474208,3262474208,SG
-3262474209,3262474209,MY
-3262474210,3262474210,TW
+3262474209,3262474210,DE
3262474211,3262474211,SG
3262474212,3262474212,MY
3262474213,3262474213,SG
3262474214,3262474214,CN
-3262474215,3262474215,IN
+3262474215,3262474215,DE
3262474216,3262474216,SG
-3262474217,3262474217,MY
+3262474217,3262474217,DE
3262474218,3262474218,SG
3262474219,3262474219,MY
-3262474220,3262474222,IN
+3262474220,3262474220,IN
+3262474221,3262474221,DE
+3262474222,3262474222,IN
3262474223,3262474223,SG
3262474224,3262474224,MY
3262474225,3262474225,SG
3262474226,3262474226,MY
-3262474227,3262474227,IN
+3262474227,3262474227,DE
3262474228,3262474228,SG
-3262474229,3262474230,IN
+3262474229,3262474230,DE
3262474231,3262474231,SG
-3262474232,3262474234,IN
+3262474232,3262474232,DE
+3262474233,3262474233,IN
+3262474234,3262474234,DE
3262474235,3262474236,MY
-3262474237,3262474238,SG
-3262474239,3262474239,DE
-3262474240,3262474255,AU
-3262474256,3262474259,NZ
-3262474260,3262474263,AU
-3262474264,3262474267,NZ
-3262474268,3262474271,AU
-3262474272,3262474275,NZ
-3262474276,3262474367,AU
-3262474368,3262474371,NZ
-3262474372,3262474395,AU
-3262474396,3262474399,NZ
-3262474400,3262474463,AU
-3262474464,3262474467,NZ
-3262474468,3262474495,AU
-3262474496,3262474631,DE
+3262474237,3262474237,DE
+3262474238,3262474238,SG
+3262474239,3262474475,DE
+3262474476,3262474479,AU
+3262474480,3262474631,DE
3262474632,3262474635,DK
-3262474636,3262474791,DE
-3262474792,3262474815,JP
-3262474816,3262474895,DE
-3262474896,3262475007,JP
-3262475008,3262475009,DE
+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,3262475009,DE
3262475010,3262475011,US
3262475012,3262475012,DE
3262475013,3262475019,US
@@ -102274,7 +105428,7 @@
3262477468,3262477471,AT
3262477472,3262477475,DE
3262477476,3262477479,FR
-3262477480,3262477483,SE
+3262477480,3262477483,DE
3262477484,3262477487,NL
3262477488,3262477503,DE
3262477504,3262477507,FR
@@ -102953,8 +106107,7 @@
3262479754,3262479754,FR
3262479755,3262479755,NL
3262479756,3262479756,FR
-3262479757,3262479757,SE
-3262479758,3262479763,DE
+3262479757,3262479763,DE
3262479764,3262479764,FR
3262479765,3262479765,DE
3262479766,3262479766,CH
@@ -103281,7 +106434,7 @@
3263100416,3263100671,DE
3263100672,3263100927,GB
3263100928,3263101183,AT
-3263101184,3263101439,SE
+3263101184,3263101439,US
3263101440,3263101695,DK
3263101952,3263102207,LT
3263102208,3263102463,GB
@@ -103377,7 +106530,8 @@
3263632384,3263632639,UA
3263632640,3263633151,RU
3263633152,3263633663,UA
-3263633664,3263635455,RU
+3263633664,3263633919,RU
+3263634432,3263635455,RU
3263635456,3263636223,UA
3263636224,3263636479,RU
3263636480,3263636991,UA
@@ -103387,7 +106541,7 @@
3263638528,3263639039,UA
3263639040,3263639295,RU
3263639296,3263639551,DE
-3263639552,3263640575,GB
+3263639552,3263640575,US
3263640576,3263647743,RU
3263647744,3263651619,LT
3263651620,3263651620,RU
@@ -103399,7 +106553,7 @@
3263657472,3263657727,DE
3263657728,3263660031,RU
3263660032,3263661055,DE
-3263661056,3263666175,RU
+3263661568,3263666175,RU
3263666176,3263676415,AZ
3263676416,3263678463,RU
3263678464,3263680511,DE
@@ -103627,7 +106781,9 @@
3264610304,3264614399,FR
3264614400,3264614911,GB
3264614912,3264615167,SE
-3264615168,3264616263,GB
+3264615168,3264615575,GB
+3264615576,3264615579,CH
+3264615580,3264616263,GB
3264616264,3264616271,CH
3264616272,3264616335,GB
3264616336,3264616337,CH
@@ -103686,7 +106842,8 @@
3264670720,3264671231,FR
3264671232,3264671743,PL
3264671744,3264672255,DE
-3264672256,3264672767,RO
+3264672256,3264672511,FR
+3264672512,3264672767,RO
3264672768,3264673279,CH
3264673280,3264673791,PL
3264673792,3264674303,CH
@@ -103950,9 +107107,7 @@
3265650688,3265658879,SE
3265658880,3265724415,AT
3265724416,3265789951,FR
-3265789952,3265824767,GB
-3265824768,3265825023,US
-3265825024,3265867775,GB
+3265789952,3265867775,GB
3265868288,3265868543,GB
3265868800,3265869055,DE
3265871872,3265875967,GB
@@ -104594,9 +107749,7 @@
3270672384,3270680575,GB
3270680576,3270684671,IL
3270684672,3270688767,FR
-3270688768,3270716167,IT
-3270716168,3270716171,SI
-3270716172,3270772079,IT
+3270688768,3270772079,IT
3270772080,3270772087,NL
3270772088,3270836223,IT
3270836224,3270901759,DE
@@ -104689,9 +107842,7 @@
3271163904,3271219967,FR
3271219968,3271220223,GP
3271220224,3271229439,FR
-3271229440,3271280687,FI
-3271280688,3271280703,SE
-3271280704,3271360511,FI
+3271229440,3271360511,FI
3271360512,3271363407,GB
3271363408,3271363415,AT
3271363416,3271363423,GB
@@ -104849,7 +108000,7 @@
3271744512,3271745023,AT
3271745024,3271745535,PL
3271745536,3271746047,GB
-3271746048,3271746559,RO
+3271746048,3271746559,CZ
3271746560,3271747071,US
3271747072,3271747583,KZ
3271747584,3271748095,RU
@@ -105054,6 +108205,7 @@
3272216912,3272216927,DE
3272216960,3272217007,GB
3272217088,3272217151,GB
+3272217152,3272217159,BE
3272217216,3272217279,BE
3272217280,3272217303,DE
3272217304,3272217327,BE
@@ -105196,7 +108348,6 @@
3272478464,3272478719,FI
3272478720,3272478975,GB
3272478976,3272479231,UA
-3272479232,3272479487,GB
3272479488,3272479743,SA
3272479744,3272480255,SE
3272480256,3272480511,FR
@@ -105473,7 +108624,7 @@
3273340128,3273340143,DE
3273340144,3273340415,GB
3273340928,3273341711,FR
-3273341760,3273341823,FR
+3273341752,3273341831,FR
3273341888,3273341951,FR
3273342022,3273342022,GB
3273342034,3273342034,GB
@@ -105537,6 +108688,7 @@
3273374856,3273374863,GB
3273374896,3273374903,GB
3273374912,3273374931,GB
+3273375168,3273375168,GB
3273375232,3273375551,DE
3273375744,3273375871,DE
3273376000,3273376255,DE
@@ -105928,7 +109080,6 @@
3274579968,3274580991,UA
3274580992,3274581503,PL
3274581504,3274581759,NL
-3274581760,3274582015,RU
3274582016,3274583039,PL
3274583040,3274584063,DE
3274584064,3274585087,GB
@@ -106245,6 +109396,8 @@
3275423808,3275423839,GB
3275423872,3275424295,GB
3275424320,3275424383,GB
+3275424416,3275424427,GB
+3275424432,3275424439,GB
3275424480,3275424487,GB
3275424496,3275424639,GB
3275424648,3275424703,GB
@@ -106368,7 +109521,8 @@
3275475376,3275475399,GB
3275475408,3275475447,GB
3275475456,3275475791,GB
-3275475800,3275475831,GB
+3275475800,3275475807,GB
+3275475824,3275475831,GB
3275475840,3275475871,GB
3275475876,3275475879,GB
3275475968,3275476223,GB
@@ -106662,9 +109816,7 @@
3276028384,3276028391,FR
3276028392,3276028543,GB
3276028544,3276028671,FR
-3276028672,3276029375,GB
-3276029376,3276029439,FR
-3276029440,3276030591,GB
+3276028672,3276030591,GB
3276030592,3276030607,FR
3276030608,3276031479,GB
3276031480,3276031487,FR
@@ -106769,8 +109921,8 @@
3276300288,3276304383,DE
3276304384,3276304639,BG
3276304640,3276305407,GB
-3276305408,3276306943,IL
-3276306944,3276308479,NL
+3276305408,3276306431,IL
+3276306432,3276308479,NL
3276308480,3276309503,GB
3276309504,3276310527,AT
3276310528,3276311551,PT
@@ -106842,6 +109994,7 @@
3276528128,3276528191,GB
3276530688,3276531711,NL
3276532590,3276532590,GR
+3276532608,3276532608,GB
3276533248,3276533311,SI
3276536752,3276536783,HU
3276537344,3276537599,AT
@@ -106867,7 +110020,8 @@
3276687872,3276688383,KW
3276688384,3276688895,DE
3276688896,3276689407,ES
-3276689408,3276690431,GB
+3276689408,3276689919,GB
+3276689920,3276690431,IT
3276690432,3276690943,NL
3276690944,3276691455,GR
3276691456,3276691967,RO
@@ -107267,9 +110421,13 @@
3276873760,3276873791,ES
3276873792,3276873983,GB
3276873984,3276874239,ES
-3276874240,3276874959,GB
+3276874240,3276874351,GB
+3276874352,3276874367,ES
+3276874368,3276874959,GB
3276874960,3276874975,NL
-3276874976,3276880427,GB
+3276874976,3276876279,GB
+3276876280,3276876283,DK
+3276876284,3276880427,GB
3276880428,3276880431,DK
3276880432,3276881811,GB
3276881812,3276881815,FR
@@ -107293,7 +110451,9 @@
3276889088,3276889215,IT
3276889216,3276890175,GB
3276890176,3276890191,US
-3276890192,3276893695,GB
+3276890192,3276892287,GB
+3276892288,3276892303,IT
+3276892304,3276893695,GB
3276893696,3276893951,IT
3276893952,3276897727,GB
3276897728,3276897791,BE
@@ -107359,9 +110519,13 @@
3276929024,3276931071,GB
3276931072,3276939263,KZ
3276939264,3276955647,DE
-3276955648,3276958719,GB
+3276955648,3276956159,GB
+3276956160,3276957695,ES
+3276957696,3276958719,GB
3276958720,3276959743,IL
-3276959744,3276963839,GB
+3276959744,3276962815,ES
+3276962816,3276963327,GB
+3276963328,3276963839,ES
3276963840,3276964351,IL
3276964352,3276964863,RO
3276965376,3276966399,RU
@@ -107496,7 +110660,6 @@
3277360128,3277360639,BG
3277360640,3277361151,CZ
3277361152,3277361663,PL
-3277361664,3277362175,RU
3277362176,3277362687,ES
3277363200,3277363711,ES
3277363712,3277364223,RU
@@ -107641,7 +110804,9 @@
3277716480,3277716991,SE
3277716992,3277717503,IT
3277717504,3277725695,YE
-3277725696,3277733887,CH
+3277725696,3277730559,CH
+3277730560,3277730563,GB
+3277730564,3277733887,CH
3277733888,3277742079,DE
3277742080,3277745151,FI
3277745152,3277746175,CH
@@ -107983,9 +111148,7 @@
3278939356,3278939379,US
3278939380,3278939383,BR
3278939384,3278939391,US
-3278939392,3278939395,DE
-3278939396,3278939399,GB
-3278939400,3278939403,DE
+3278939392,3278939403,DE
3278939404,3278939407,CH
3278939408,3278939419,DE
3278939420,3278939423,IE
@@ -108053,45 +111216,41 @@
3278939900,3278939903,IT
3278939904,3278939907,HK
3278939908,3278939911,MY
-3278939912,3278939915,TH
-3278939916,3278939923,SG
-3278939924,3278939927,CN
+3278939912,3278939919,DE
+3278939920,3278939923,SG
+3278939924,3278939927,DE
3278939928,3278939931,SG
3278939932,3278939935,IN
3278939936,3278939939,MY
-3278939940,3278939943,SG
-3278939944,3278939947,TW
+3278939940,3278939947,DE
3278939948,3278939951,SG
3278939952,3278939955,MY
-3278939956,3278939959,SG
-3278939960,3278939963,CN
+3278939956,3278939963,DE
3278939964,3278939967,MY
3278939968,3278939971,TW
-3278939972,3278939979,MY
-3278939980,3278939983,TH
-3278939984,3278939987,DE
-3278939988,3278939991,CN
+3278939972,3278939975,MY
+3278939976,3278939991,DE
3278939992,3278939995,SG
-3278939996,3278939999,MY
-3278940000,3278940011,SG
-3278940012,3278940015,ID
-3278940016,3278940059,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,3278940083,SG
-3278940084,3278940091,MY
+3278940072,3278940079,DE
+3278940080,3278940083,SG
+3278940084,3278940087,DE
+3278940088,3278940091,MY
3278940092,3278940095,SG
-3278940096,3278940099,IN
+3278940096,3278940099,DE
3278940100,3278940103,SG
3278940104,3278940107,MY
-3278940108,3278940127,SG
-3278940128,3278940131,TW
-3278940132,3278940135,BD
-3278940136,3278940139,SG
-3278940140,3278940143,IN
-3278940144,3278940151,MY
-3278940152,3278940155,IN
-3278940156,3278940159,PH
+3278940108,3278940111,SG
+3278940112,3278940115,DE
+3278940116,3278940127,SG
+3278940128,3278940159,DE
3278940160,3278940163,GR
3278940164,3278940167,CH
3278940168,3278940171,DE
@@ -108401,75 +111560,50 @@
3278942184,3278942203,DE
3278942204,3278942207,CH
3278942208,3278942211,TW
-3278942212,3278942227,AU
-3278942228,3278942231,NZ
-3278942232,3278942243,AU
-3278942244,3278942247,NZ
-3278942248,3278942255,AU
-3278942256,3278942259,NZ
-3278942260,3278942271,AU
-3278942272,3278942275,NZ
-3278942276,3278942291,AU
-3278942292,3278942295,NZ
-3278942296,3278942299,PG
-3278942300,3278942355,AU
-3278942356,3278942359,NZ
-3278942360,3278942383,AU
-3278942384,3278942387,NZ
-3278942388,3278942399,AU
-3278942400,3278942403,NZ
-3278942404,3278942435,AU
-3278942436,3278942439,DE
-3278942440,3278942443,AU
+3278942212,3278942443,DE
3278942444,3278942447,NZ
-3278942448,3278942455,AU
-3278942456,3278942463,DE
+3278942448,3278942463,DE
3278942464,3278942467,SG
3278942468,3278942471,MY
-3278942472,3278942475,IN
-3278942476,3278942483,SG
-3278942484,3278942487,CN
+3278942472,3278942479,DE
+3278942480,3278942483,SG
+3278942484,3278942487,DE
3278942488,3278942491,IN
3278942492,3278942495,MY
-3278942496,3278942499,CN
+3278942496,3278942499,DE
3278942500,3278942507,MY
3278942508,3278942511,TH
3278942512,3278942515,SG
-3278942516,3278942519,PH
-3278942520,3278942539,IN
-3278942540,3278942543,TW
-3278942544,3278942547,PK
-3278942548,3278942551,MY
+3278942516,3278942519,DE
+3278942520,3278942523,IN
+3278942524,3278942527,DE
+3278942528,3278942531,IN
+3278942532,3278942551,DE
3278942552,3278942555,TW
3278942556,3278942559,IN
-3278942560,3278942571,MY
+3278942560,3278942563,DE
+3278942564,3278942571,MY
3278942572,3278942575,IN
-3278942576,3278942579,MY
-3278942580,3278942583,TW
-3278942584,3278942587,SG
-3278942588,3278942591,CN
+3278942576,3278942591,DE
3278942592,3278942595,TW
-3278942596,3278942599,IN
+3278942596,3278942599,DE
3278942600,3278942603,SG
3278942604,3278942607,TW
-3278942608,3278942611,TH
-3278942612,3278942615,PH
+3278942608,3278942615,DE
3278942616,3278942627,SG
3278942628,3278942635,MY
-3278942636,3278942643,SG
-3278942644,3278942647,MY
-3278942648,3278942651,IN
+3278942636,3278942639,SG
+3278942640,3278942651,DE
3278942652,3278942655,MY
-3278942656,3278942667,SG
-3278942668,3278942671,MY
+3278942656,3278942659,DE
+3278942660,3278942667,SG
+3278942668,3278942671,DE
3278942672,3278942675,SG
-3278942676,3278942679,HK
+3278942676,3278942679,DE
3278942680,3278942683,TW
3278942684,3278942687,DE
3278942688,3278942691,SG
-3278942692,3278942695,IN
-3278942696,3278942699,SG
-3278942700,3278942703,TW
+3278942692,3278942703,DE
3278942704,3278942707,MY
3278942708,3278942719,SG
3278942720,3278942721,DE
@@ -108589,7 +111723,7 @@
3278942890,3278942890,ES
3278942891,3278942894,DE
3278942895,3278942895,NL
-3278942896,3278942896,GB
+3278942896,3278942896,DE
3278942897,3278942897,CH
3278942898,3278942899,NL
3278942900,3278942903,DE
@@ -108689,7 +111823,7 @@
3278943050,3278943050,IT
3278943051,3278943056,DE
3278943057,3278943057,CH
-3278943058,3278943058,FR
+3278943058,3278943058,DE
3278943059,3278943059,CH
3278943060,3278943065,DE
3278943066,3278943066,GB
@@ -109380,9 +112514,7 @@
3278944051,3278944051,BE
3278944052,3278944052,AT
3278944053,3278944053,IT
-3278944054,3278944054,DE
-3278944055,3278944055,IT
-3278944056,3278944058,DE
+3278944054,3278944058,DE
3278944059,3278944059,ES
3278944060,3278944060,BE
3278944061,3278944061,FR
@@ -110214,7 +113346,15 @@
3280134144,3280142335,IT
3280142336,3280207871,RU
3280207872,3280273407,FR
-3280273408,3280338943,RU
+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
@@ -110391,7 +113531,13 @@
3280935088,3280935095,ES
3280935096,3280935119,GB
3280935120,3280935127,FR
-3280935128,3280952783,GB
+3280935128,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
@@ -110451,7 +113597,9 @@
3281028992,3281029055,GB
3281030400,3281035263,GB
3281035264,3281043455,CH
-3281043456,3281059839,RU
+3281043456,3281049615,RU
+3281049616,3281049622,GI
+3281049623,3281059839,RU
3281059840,3281062911,DE
3281063040,3281063111,DE
3281063168,3281125375,DE
@@ -110610,7 +113758,7 @@
3282194432,3282195455,UA
3282195456,3282196479,IE
3282196480,3282197503,UA
-3282197504,3282198527,RU
+3282198272,3282198527,HR
3282198528,3282206719,GB
3282206720,3282223103,CH
3282223104,3282231295,BE
@@ -110618,7 +113766,9 @@
3282239488,3282305023,SE
3282305024,3282370559,PL
3282370560,3282436095,FI
-3282436096,3282477055,GB
+3282436096,3282468095,GB
+3282468096,3282468351,DE
+3282468352,3282477055,GB
3282477056,3282485247,RU
3282485248,3282493439,GI
3282493440,3282501631,NG
@@ -110750,7 +113900,18 @@
3283271680,3283279871,RU
3283279872,3283288063,SE
3283288064,3283419135,DE
-3283419136,3283484671,DK
+3283419136,3283451903,IR
+3283451904,3283460095,NO
+3283460096,3283464191,GB
+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
@@ -110888,7 +114049,8 @@
3283980288,3283980799,RO
3283980800,3283981823,CH
3283981824,3283982335,RO
-3283982848,3283983359,RO
+3283982848,3283983103,SE
+3283983104,3283983359,RO
3283983360,3283983871,CY
3283983872,3283984383,GB
3283984384,3283984895,SE
@@ -111023,7 +114185,7 @@
3284084224,3284084735,UA
3284084736,3284085247,RU
3284085248,3284085759,DE
-3284085760,3284086783,RO
+3284086272,3284086783,RO
3284086784,3284087295,CZ
3284087296,3284087807,RU
3284087808,3284088319,IL
@@ -111049,9 +114211,11 @@
3284099328,3284099583,HU
3284099584,3284100095,GR
3284100096,3284100607,AM
+3284100608,3284101119,US
3284101120,3284101631,UA
3284101632,3284102143,GB
3284102144,3284102399,DK
+3284102627,3284102627,DK
3284102656,3284103167,AT
3284103168,3284103679,NL
3284103680,3284104191,DE
@@ -111245,7 +114409,6 @@
3285118976,3285119487,RU
3285119488,3285119999,RO
3285120000,3285120511,RU
-3285120512,3285121023,RO
3285121024,3285121535,SE
3285121536,3285122047,CY
3285122048,3285123071,RU
@@ -111305,11 +114468,12 @@
3285406720,3285407743,UA
3285407744,3285408767,RU
3285408768,3285409791,GB
-3285409792,3285412863,RU
+3285409792,3285410815,UA
+3285410816,3285412863,RU
3285412864,3285413887,UA
-3285413888,3285414911,RU
-3285414912,3285415935,UA
-3285415936,3285419007,RU
+3285413888,3285414978,RU
+3285414979,3285414979,UA
+3285414980,3285419007,RU
3285419008,3285420031,SE
3285420032,3285425151,UA
3285425152,3285426175,LV
@@ -111346,7 +114510,7 @@
3285480960,3285481215,CH
3285488576,3285488639,CY
3285495296,3285495807,ES
-3285501328,3285501359,CZ
+3285501312,3285501359,CZ
3285501696,3285501951,GB
3285510144,3285512191,GB
3285515776,3285515799,GR
@@ -111454,11 +114618,12 @@
3285924992,3285924995,FR
3285924996,3285924999,CZ
3285925000,3285925007,RU
-3285925008,3285925055,DE
+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
@@ -111468,9 +114633,10 @@
3285931528,3285931559,DE
3285931560,3285931567,HU
3285931568,3285931575,DE
+3285931584,3285931599,DE
3285935872,3285936127,GB
3285936136,3285936147,FR
-3285936152,3285936167,FR
+3285936152,3285936175,FR
3285939136,3285939175,GB
3285939184,3285939191,GB
3285939744,3285939759,GB
@@ -111479,23 +114645,24 @@
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,3285953679,GB
-3285953696,3285953727,GB
+3285953672,3285953735,GB
3285953792,3285953919,GB
3285954048,3285954303,AE
3285954560,3285954567,RO
3285954568,3285954575,PL
3285954576,3285954815,GB
3285958144,3285958399,BG
-3285961984,3285961991,GB
+3285961984,3285961995,GB
3285962752,3285963775,DE
3285964800,3285964935,DE
-3285964944,3285964959,DE
+3285964944,3285964991,DE
+3285964992,3285965007,HU
3285965056,3285966079,DE
3285968896,3285970943,GB
3285975040,3286013695,FR
@@ -112024,7 +115191,6 @@
3287668736,3287668991,SI
3287668992,3287669247,PL
3287669248,3287669503,LI
-3287669504,3287669759,MD
3287669760,3287670015,RO
3287670016,3287670271,UA
3287670272,3287670527,PL
@@ -112184,7 +115350,9 @@
3287965696,3287973887,RS
3287973888,3287982079,CZ
3287982080,3287990271,EE
-3287990272,3287996415,SI
+3287990272,3287994367,SI
+3287994368,3287995391,BA
+3287995392,3287996415,SI
3287996416,3287998463,BA
3287998464,3288006655,IT
3288006656,3288072191,GR
@@ -112326,6 +115494,7 @@
3288569856,3288570111,CU
3288570112,3288570367,JM
3288570368,3288577023,ZA
+3288577280,3288577535,NG
3288578048,3288580095,JM
3288580096,3288588287,BB
3288588288,3288608255,ZA
@@ -112358,7 +115527,8 @@
3288785408,3288785663,UG
3288785664,3288785919,TZ
3288785920,3288786175,NG
-3288786944,3288787967,ZA
+3288786176,3288786431,KE
+3288786688,3288787967,ZA
3288787968,3288788223,EG
3288788224,3288792831,ZA
3288792832,3288793087,AO
@@ -112466,7 +115636,8 @@
3289230848,3289231359,GH
3289231360,3289233919,ZA
3289233920,3289234175,TZ
-3289234176,3289235455,ZA
+3289234176,3289235199,ZA
+3289235200,3289235455,KE
3289235456,3289237503,GH
3289237504,3289238015,ZA
3289238016,3289238271,KE
@@ -112494,7 +115665,9 @@
3289320448,3289321471,ZA
3289321472,3289325567,IN
3289325568,3289333759,SA
-3289333760,3289391103,ZA
+3289333760,3289382911,ZA
+3289382912,3289387007,NL
+3289387008,3289391103,ZA
3289391104,3289440255,SC
3289440256,3289448447,ZA
3289448448,3289645055,SC
@@ -112535,14 +115708,15 @@
3290171392,3290172159,ZA
3290172160,3290172415,KE
3290172416,3290181631,ZA
-3290181632,3290181887,US
-3290181888,3290182399,PR
-3290182400,3290182655,US
-3290182656,3290183423,PR
+3290181632,3290181759,PR
+3290181760,3290181887,US
+3290181888,3290183423,PR
3290183424,3290183679,US
-3290183680,3290184959,PR
-3290184960,3290185215,US
-3290185216,3290185727,PR
+3290183680,3290185105,PR
+3290185106,3290185106,US
+3290185107,3290185107,PR
+3290185108,3290185108,US
+3290185109,3290185727,PR
3290185728,3290226687,ZA
3290226688,3290230783,MZ
3290230784,3290234879,BF
@@ -112626,12 +115800,8 @@
3291045888,3291078655,ZA
3291078656,3291086847,DZ
3291086848,3291103231,PR
-3291103232,3291123711,ZA
-3291123712,3291135999,BG
-3291136000,3291140095,ZA
-3291140096,3291144191,BG
-3291144192,3291148287,ZA
-3291148288,3291152383,BG
+3291103232,3291119615,ZA
+3291119616,3291152383,BG
3291152384,3291168767,ZA
3291168768,3291176959,TZ
3291176960,3291185151,ZW
@@ -112704,7 +115874,8 @@
3291287552,3291291647,ZA
3291291648,3291295743,TZ
3291295744,3291299839,NG
-3291299840,3291313151,ZA
+3291299840,3291312127,ZA
+3291312128,3291313151,MU
3291313152,3291314175,NG
3291314176,3291315199,ZA
3291315200,3291316223,UG
@@ -112748,7 +115919,9 @@
3291387904,3291388927,BJ
3291388928,3291389307,GA
3291389308,3291389311,KM
-3291389312,3291389951,GA
+3291389312,3291389343,GA
+3291389344,3291389347,CG
+3291389348,3291389951,GA
3291389952,3291397119,ZA
3291397120,3291398143,EG
3291398144,3291406335,ZM
@@ -112761,8 +115934,8 @@
3291430912,3291432703,ZA
3291432704,3291432959,NA
3291432960,3291434239,ZA
-3291434752,3291435519,ZA
-3291435520,3291437823,NA
+3291434752,3291436031,ZA
+3291436032,3291437823,NA
3291437824,3291438079,ZA
3291438080,3291439103,NA
3291439104,3291447295,NG
@@ -112809,34 +115982,72 @@
3291554816,3291555071,CD
3291555328,3291555583,CM
3291555840,3291556095,GN
+3291556352,3291556607,SN
+3291556864,3291557119,TG
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
-3291676672,3291742207,ZA
-3291742208,3291742463,US
-3291742464,3291742591,GB
+3291643904,3291660287,MZ
+3291660288,3291742207,ZA
+3291742208,3291742464,US
+3291742465,3291742591,GB
3291742592,3291742719,IE
-3291742720,3291750399,US
-3291750400,3291750655,GB
-3291750656,3291757311,US
+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,3291753471,US
+3291753472,3291753727,GB
+3291753728,3291753983,US
+3291753984,3291754239,JP
+3291754240,3291754495,US
+3291754496,3291754751,AU
+3291754752,3291755007,GB
+3291755008,3291755263,AU
+3291755264,3291755519,US
+3291755520,3291755775,AU
+3291755776,3291756543,US
+3291756544,3291756799,AU
+3291756800,3291757311,US
3291757312,3291757567,GB
-3291757568,3291758079,US
+3291757568,3291757823,AU
+3291757824,3291758079,US
3291758080,3291758335,GB
-3291758336,3291762175,US
+3291758336,3291760639,US
+3291760640,3291760895,AU
+3291760896,3291762175,US
3291762176,3291762431,GB
-3291762432,3291763199,US
+3291762432,3291762687,AU
+3291762688,3291763199,US
3291763200,3291763455,GB
3291763456,3291763711,US
3291763712,3291763967,GB
-3291763968,3291813375,US
+3291763968,3291766271,US
+3291766272,3291766527,AU
+3291766528,3291766783,US
+3291766784,3291767039,AU
+3291767040,3291813375,US
3291813376,3291813631,GB
-3291813632,3291815423,US
+3291813632,3291813887,US
+3291813888,3291814143,GB
+3291814144,3291815423,US
3291815424,3291815679,GB
3291815680,3291817471,US
3291817472,3291817983,NL
@@ -112847,77 +116058,61 @@
3291821568,3291823103,US
3291823104,3291823359,DE
3291823360,3291824127,US
-3291824128,3291824383,GB
-3291824384,3291826175,US
+3291824128,3291824639,GB
+3291824640,3291826175,US
3291826176,3291826431,CA
3291826432,3291827199,US
3291827200,3291827455,CA
3291827456,3291828223,US
3291828224,3291828479,GB
-3291828480,3291878143,US
-3291878144,3291878399,CA
-3291878400,3291880703,US
-3291880704,3291880959,CA
-3291880960,3291883775,US
+3291828480,3291879935,US
+3291879936,3291880191,AU
+3291880192,3291883775,US
3291883776,3291884031,CA
-3291884032,3291884543,US
-3291884544,3291884799,CA
-3291884800,3291886335,US
+3291884032,3291884287,US
+3291884288,3291884543,NZ
+3291884544,3291886335,US
3291886336,3291886591,CA
-3291886592,3291887359,US
+3291886592,3291887103,US
+3291887104,3291887359,GB
3291887360,3291887615,FR
3291887616,3291888895,US
3291888896,3291889151,FR
-3291889152,3291893759,US
+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,3291943423,US
+3291939065,3291939327,US
+3291939328,3291939583,IN
+3291939584,3291943423,US
3291943424,3291943679,FR
-3291943680,3291971583,US
+3291943680,3291945727,US
+3291945728,3291945983,GB
+3291945984,3291971583,US
3291971584,3291972607,JP
3291972608,3292004351,US
-3292004352,3292004607,SC
+3292004352,3292004607,SE
3292004608,3292004863,DK
-3292004864,3292005119,US
-3292005120,3292006143,SC
-3292006144,3292007423,US
+3292004864,3292005375,US
+3292005376,3292005631,CZ
+3292005632,3292005887,SC
+3292005888,3292007423,US
3292007424,3292007679,SC
-3292007680,3292008703,US
-3292008704,3292008959,SC
-3292008960,3292012031,US
-3292012032,3292012799,SC
-3292012800,3292014847,US
-3292014848,3292015103,SC
-3292015104,3292016383,US
-3292016384,3292016895,SC
-3292016896,3292017407,US
-3292017408,3292017663,SC
-3292017664,3292018175,US
-3292018176,3292018431,SC
-3292018432,3292018943,US
-3292018944,3292019455,SC
+3292007680,3292019199,US
+3292019200,3292019455,SC
3292019456,3292019711,US
3292019712,3292019967,SC
3292019968,3292022015,US
3292022016,3292022271,SC
3292022272,3292023295,US
-3292023296,3292023807,SC
-3292023808,3292027391,US
-3292027392,3292027647,SC
-3292027648,3292029183,US
-3292029184,3292029439,SC
-3292029440,3292029695,US
-3292029696,3292030207,SC
-3292030208,3292030463,US
-3292030464,3292030975,SC
-3292030976,3292031743,US
+3292023296,3292023551,SC
+3292023552,3292031743,US
3292031744,3292032255,SC
-3292032256,3292032511,US
-3292032512,3292032767,SC
-3292032768,3292033791,US
+3292032256,3292033791,US
3292033792,3292034047,SC
3292034048,3292034303,US
3292034304,3292034559,SC
@@ -112926,54 +116121,22 @@
3292036096,3292036351,US
3292036352,3292036607,SC
3292036608,3292036863,US
-3292036864,3292037375,SC
-3292037376,3292037631,US
-3292037632,3292037887,SC
-3292037888,3292038655,US
-3292038656,3292038911,SC
-3292038912,3292039167,US
-3292039168,3292039679,SC
-3292039680,3292040191,US
-3292040192,3292040447,SC
-3292040448,3292040703,US
-3292040704,3292040959,SC
-3292040960,3292041471,US
-3292041472,3292041727,SC
-3292041728,3292041983,US
-3292041984,3292042239,SC
-3292042240,3292044031,US
-3292044032,3292044287,SC
-3292044288,3292044543,US
-3292044544,3292044799,SC
-3292044800,3292047103,US
+3292036864,3292037119,SC
+3292037120,3292047103,US
3292047104,3292047359,SC
3292047360,3292049663,US
3292049664,3292049919,SC
-3292049920,3292050175,US
-3292050176,3292050687,SC
-3292050688,3292051455,US
-3292051456,3292051711,SC
-3292051712,3292052991,US
-3292052992,3292053247,SC
-3292053248,3292054015,US
+3292049920,3292050431,US
+3292050432,3292050687,SC
+3292050688,3292054015,US
3292054016,3292054271,SC
-3292054272,3292058111,US
-3292058112,3292058879,SC
-3292058880,3292059135,US
+3292054272,3292059135,US
3292059136,3292059391,SC
-3292059392,3292060159,US
-3292060160,3292060415,SC
-3292060416,3292060671,US
-3292060672,3292060927,SC
-3292060928,3292061951,US
-3292061952,3292062207,SC
-3292062208,3292062719,US
-3292062720,3292062975,SC
-3292062976,3292064767,US
-3292064768,3292065535,SC
-3292065536,3292065791,US
-3292065792,3292066303,SC
-3292066304,3292069375,US
+3292059392,3292065023,US
+3292065024,3292065279,SC
+3292065280,3292065791,US
+3292065792,3292066047,SC
+3292066048,3292069375,US
3292069376,3292069631,DE
3292069632,3292069887,AU
3292069888,3292070143,SE
@@ -112981,283 +116144,127 @@
3292070400,3292070655,US
3292070656,3292070911,SC
3292070912,3292071167,CZ
-3292071168,3292071423,US
-3292071424,3292071679,SC
-3292071680,3292076543,US
-3292076544,3292076799,SC
-3292076800,3292078335,US
-3292078336,3292078591,SC
-3292078592,3292078847,US
+3292071168,3292078847,US
3292078848,3292079103,SC
-3292079104,3292079615,US
-3292079616,3292079871,SC
-3292079872,3292080383,US
+3292079104,3292080383,US
3292080384,3292080639,SC
3292080640,3292081151,US
3292081152,3292081407,SC
-3292081408,3292081663,US
-3292081664,3292081919,SC
-3292081920,3292082175,US
-3292082176,3292082687,SC
-3292082688,3292082943,US
-3292082944,3292083199,SC
-3292083200,3292083967,US
-3292083968,3292084223,SC
-3292084224,3292085247,US
+3292081408,3292082431,US
+3292082432,3292082687,SC
+3292082688,3292085247,US
3292085248,3292085503,SC
3292085504,3292085759,US
-3292085760,3292087295,SC
-3292087296,3292088319,US
-3292088320,3292088831,SC
-3292088832,3292089087,US
-3292089088,3292089599,SC
-3292089600,3292090879,US
-3292090880,3292091135,SC
-3292091136,3292093183,US
-3292093184,3292093439,SC
-3292093440,3292093695,US
+3292085760,3292086015,SC
+3292086016,3292093695,US
3292093696,3292093951,SC
-3292093952,3292094975,US
-3292094976,3292095231,SC
-3292095232,3292096767,US
-3292096768,3292097023,SC
-3292097024,3292098303,US
-3292098304,3292098559,SC
-3292098560,3292099071,US
-3292099072,3292099583,SC
-3292099584,3292101375,US
-3292101376,3292101631,SC
-3292101632,3292102911,US
-3292102912,3292103167,SC
-3292103168,3292104191,US
-3292104192,3292104447,SC
-3292104448,3292104959,US
+3292093952,3292099327,US
+3292099328,3292099583,SC
+3292099584,3292104959,US
3292104960,3292105215,SC
-3292105216,3292105727,US
-3292105728,3292106239,SC
+3292105216,3292105983,US
+3292105984,3292106239,SC
3292106240,3292106751,US
3292106752,3292107007,SC
3292107008,3292108031,US
3292108032,3292108287,SC
3292108288,3292109567,US
3292109568,3292109823,SC
-3292109824,3292110591,US
-3292110592,3292110847,SC
-3292110848,3292111103,US
-3292111104,3292111359,SC
-3292111360,3292112127,US
+3292109824,3292112127,US
3292112128,3292112383,SC
3292112384,3292113919,US
-3292113920,3292114431,SC
-3292114432,3292115967,US
+3292113920,3292114175,SC
+3292114176,3292115967,US
3292115968,3292116223,SC
-3292116224,3292120319,US
-3292120320,3292120575,SC
-3292120576,3292124671,US
-3292124672,3292124927,SC
-3292124928,3292125695,US
+3292116224,3292125695,US
3292125696,3292125951,SC
-3292125952,3292126975,US
-3292126976,3292127231,SC
-3292127232,3292128767,US
+3292125952,3292128767,US
3292128768,3292129023,SC
-3292129024,3292129535,US
-3292129536,3292129791,SC
-3292129792,3292131071,US
-3292131072,3292131327,SC
-3292131328,3292133631,US
+3292129024,3292133631,US
3292133632,3292133887,SC
3292133888,3292134911,US
-3292134912,3292135167,SC
+3292134912,3292135167,DE
3292135168,3292135423,AU
-3292135424,3292135679,SC
+3292135424,3292135679,SE
3292135680,3292135935,DK
3292135936,3292136447,US
3292136448,3292136703,CZ
-3292136704,3292136959,US
-3292136960,3292137471,SC
-3292137472,3292139775,US
-3292139776,3292140799,SC
-3292140800,3292141055,US
-3292141056,3292141311,SC
-3292141312,3292141567,US
+3292136704,3292137215,US
+3292137216,3292137471,SC
+3292137472,3292140031,US
+3292140032,3292140287,SC
+3292140288,3292141567,US
3292141568,3292142079,SC
-3292142080,3292142335,US
-3292142336,3292142591,SC
-3292142592,3292146175,US
-3292146176,3292146431,SC
-3292146432,3292147711,US
-3292147712,3292147967,SC
-3292147968,3292150527,US
-3292150528,3292150783,SC
-3292150784,3292151039,US
-3292151040,3292151295,SC
-3292151296,3292153087,US
-3292153088,3292153343,SC
-3292153344,3292153855,US
+3292142080,3292153855,US
3292153856,3292154111,SC
-3292154112,3292154879,US
-3292154880,3292155135,SC
-3292155136,3292156415,US
-3292156416,3292156671,SC
-3292156672,3292157183,US
-3292157184,3292157439,SC
-3292157440,3292157695,US
-3292157696,3292157951,SC
-3292157952,3292159999,US
+3292154112,3292159999,US
3292160000,3292160255,SC
-3292160256,3292161023,US
-3292161024,3292161279,SC
-3292161280,3292162047,US
-3292162048,3292162303,SC
-3292162304,3292163327,US
+3292160256,3292163327,US
3292163328,3292163583,SC
-3292163584,3292166655,US
-3292166656,3292167167,SC
-3292167168,3292167423,US
-3292167424,3292168191,SC
-3292168192,3292169983,US
-3292169984,3292170495,SC
-3292170496,3292170751,US
-3292170752,3292171007,SC
-3292171008,3292171519,US
-3292171520,3292171775,SC
-3292171776,3292172543,US
-3292172544,3292172799,SC
-3292172800,3292173311,US
-3292173312,3292173823,SC
-3292173824,3292175103,US
+3292163584,3292167935,US
+3292167936,3292168191,SC
+3292168192,3292173311,US
+3292173312,3292173567,SC
+3292173568,3292175103,US
3292175104,3292175359,SC
-3292175360,3292176895,US
-3292176896,3292177407,SC
+3292175360,3292177151,US
+3292177152,3292177407,SC
3292177408,3292178175,US
3292178176,3292178431,SC
-3292178432,3292179199,US
-3292179200,3292179711,SC
-3292179712,3292180735,US
-3292180736,3292181247,SC
-3292181248,3292181503,US
-3292181504,3292181759,SC
-3292181760,3292182015,US
-3292182016,3292182271,SC
-3292182272,3292183039,US
+3292178432,3292180991,US
+3292180992,3292181247,SC
+3292181248,3292183039,US
3292183040,3292183295,SC
3292183296,3292186623,US
3292186624,3292186879,SC
-3292186880,3292188671,US
-3292188672,3292189183,SC
-3292189184,3292189439,US
-3292189440,3292189695,SC
-3292189696,3292191999,US
-3292192000,3292192255,SC
-3292192256,3292196607,US
+3292186880,3292196607,US
3292196608,3292196863,SC
-3292196864,3292197375,US
-3292197376,3292197631,SC
-3292197632,3292197887,US
-3292197888,3292198399,SC
-3292198400,3292199423,US
-3292199424,3292199679,SC
-3292199680,3292200447,US
+3292196864,3292200447,US
3292200448,3292200703,DE
3292200704,3292200959,AU
3292200960,3292201215,SE
3292201216,3292201471,DK
3292201472,3292201983,US
-3292201984,3292202495,SC
-3292202496,3292203007,US
-3292203008,3292203263,SC
-3292203264,3292204799,US
-3292204800,3292205311,SC
-3292205312,3292205823,US
-3292205824,3292206335,SC
-3292206336,3292206591,US
+3292201984,3292202239,CZ
+3292202240,3292205823,US
+3292205824,3292206079,SC
+3292206080,3292206591,US
3292206592,3292206847,SC
-3292206848,3292207359,US
-3292207360,3292208127,SC
-3292208128,3292208639,US
-3292208640,3292208895,SC
-3292208896,3292209663,US
+3292206848,3292207615,US
+3292207616,3292207871,SC
+3292207872,3292209663,US
3292209664,3292209919,SC
3292209920,3292210175,US
3292210176,3292210431,SC
-3292210432,3292211455,US
-3292211456,3292211967,SC
-3292211968,3292212735,US
-3292212736,3292212991,SC
-3292212992,3292214783,US
+3292210432,3292214783,US
3292214784,3292215039,SC
3292215040,3292215295,US
3292215296,3292215551,SC
3292215552,3292216319,US
3292216320,3292216575,SC
-3292216576,3292217343,US
-3292217344,3292217599,SC
-3292217600,3292218879,US
-3292218880,3292219135,SC
-3292219136,3292220415,US
-3292220416,3292220671,SC
-3292220672,3292220927,US
+3292216576,3292220927,US
3292220928,3292221183,SC
-3292221184,3292222207,US
-3292222208,3292222463,SC
-3292222464,3292224511,US
-3292224512,3292224767,SC
-3292224768,3292225279,US
-3292225280,3292225535,SC
-3292225536,3292226303,US
-3292226304,3292226559,SC
-3292226560,3292227071,US
+3292221184,3292227071,US
3292227072,3292227327,SC
-3292227328,3292227839,US
-3292227840,3292228095,SC
-3292228096,3292228607,US
-3292228608,3292229631,SC
-3292229632,3292230911,US
-3292230912,3292231167,SC
-3292231168,3292231679,US
+3292227328,3292231679,US
3292231680,3292231935,SC
-3292231936,3292232447,US
-3292232448,3292232959,SC
-3292232960,3292233471,US
-3292233472,3292233983,SC
-3292233984,3292235007,US
-3292235008,3292235519,SC
-3292235520,3292236031,US
-3292236032,3292236287,SC
-3292236288,3292238079,US
-3292238080,3292238335,SC
-3292238336,3292239615,US
+3292231936,3292233471,US
+3292233472,3292233727,SC
+3292233728,3292239615,US
3292239616,3292239871,SC
-3292239872,3292240383,US
-3292240384,3292240639,SC
-3292240640,3292243711,US
+3292239872,3292243711,US
3292243712,3292243967,SC
3292243968,3292244991,US
3292244992,3292245247,SC
-3292245248,3292245503,US
-3292245504,3292245759,SC
-3292245760,3292246783,US
+3292245248,3292246783,US
3292246784,3292247039,SC
-3292247040,3292248575,US
-3292248576,3292248831,SC
-3292248832,3292249855,US
-3292249856,3292250111,SC
-3292250112,3292252159,US
-3292252160,3292252671,SC
-3292252672,3292253183,US
-3292253184,3292253439,SC
-3292253440,3292254207,US
-3292254208,3292254719,SC
-3292254720,3292255487,US
+3292247040,3292252415,US
+3292252416,3292252671,SC
+3292252672,3292255487,US
3292255488,3292255743,SC
3292255744,3292259327,US
-3292259328,3292259839,SC
-3292259840,3292260351,US
-3292260352,3292260607,SC
-3292260608,3292263167,US
-3292263168,3292263423,SC
-3292263424,3292265983,US
+3292259328,3292259583,SC
+3292259584,3292265983,US
3292265984,3292266239,DE
3292266240,3292266495,SC
3292266496,3292266751,TZ
@@ -113268,6 +116275,8 @@
3292274688,3292274943,ZA
3292275712,3292275967,KE
3292276224,3292276479,GN
+3292276736,3292276991,SN
+3292277248,3292277503,TG
3292332032,3292334079,MU
3292334080,3292336127,TZ
3292336128,3292340223,ZA
@@ -113308,24 +116317,28 @@
3300953088,3300954111,MU
3300954112,3300958207,NG
3300958208,3301113855,ZA
-3301113856,3301138431,NG
+3301113856,3301117951,AF
+3301117952,3301138431,NG
3301138432,3301140479,ZA
-3301140480,3301146623,NG
-3301146624,3301171199,ZA
-3301171200,3301172223,IN
-3301172224,3301173247,ZA
-3301173248,3301173759,UG
-3301173760,3301175295,ZA
-3301175296,3301179391,EG
+3301140480,3301146111,NG
+3301146112,3301146367,ZA
+3301146368,3301146623,NG
+3301146624,3301163007,IN
+3301163008,3301171199,ZA
+3301171200,3301172223,NG
+3301172224,3301173759,UG
+3301173760,3301174271,ZA
+3301174272,3301175295,UG
+3301175296,3301179391,AF
3301179392,3301179903,RU
-3301179904,3301181183,SC
-3301181184,3301185535,US
+3301179904,3301181439,SC
+3301181440,3301185535,US
3301185536,3301187583,GB
3301187584,3301189631,FR
3301189632,3301191679,US
3301191680,3301191935,CA
-3301191936,3301192447,SE
-3301192448,3301192703,CA
+3301191936,3301192191,SE
+3301192192,3301192703,CA
3301192704,3301192959,SE
3301192960,3301193215,CA
3301193216,3301193727,SE
@@ -113360,115 +116373,131 @@
3301238784,3301240831,US
3301240832,3301242879,SE
3301242880,3301244927,GB
-3301244928,3301245439,US
-3301245440,3301246975,SE
-3301246976,3301310463,SC
+3301244928,3301245951,US
+3301245952,3301246975,SE
+3301246976,3301252095,SC
+3301252096,3301253119,US
+3301253120,3301254143,SC
+3301254144,3301255167,US
+3301255168,3301257215,SC
+3301257216,3301258239,US
+3301258240,3301263359,SC
+3301263360,3301264383,US
+3301264384,3301271551,SC
+3301271552,3301272575,US
+3301272576,3301279743,SC
+3301279744,3301280767,PR
+3301280768,3301281791,SC
+3301281792,3301282815,US
+3301282816,3301283839,SC
+3301283840,3301284863,US
+3301284864,3301289983,SC
+3301289984,3301291007,PT
+3301291008,3301292031,PL
+3301292032,3301294079,SC
+3301294080,3301295103,LU
+3301295104,3301301247,SC
+3301301248,3301302271,CZ
+3301302272,3301304319,SC
+3301304320,3301305343,FR
+3301305344,3301306367,AT
+3301306368,3301307391,IN
+3301307392,3301308415,SC
+3301308416,3301309439,SG
+3301309440,3301310463,SC
3301310464,3301310719,ZA
3301310720,3301311487,SC
3301311488,3301313535,SE
3301313536,3301314559,SC
3301314560,3301315583,SE
3301315584,3301318655,SC
-3301318656,3301375999,SE
-3301376000,3301376767,SC
+3301318656,3301320447,SE
+3301320448,3301320959,US
+3301320960,3301322751,SE
+3301322752,3301323007,CA
+3301323008,3301325567,SE
+3301325568,3301325823,US
+3301325824,3301330943,SE
+3301330944,3301331199,HU
+3301331200,3301337087,SE
+3301337088,3301337343,US
+3301337344,3301343487,SE
+3301343488,3301343743,US
+3301343744,3301345535,SE
+3301345536,3301345791,DK
+3301345792,3301349119,SE
+3301349120,3301349375,CH
+3301349376,3301351679,SE
+3301351680,3301351935,US
+3301351936,3301353983,SE
+3301353984,3301354239,US
+3301354240,3301355263,SE
+3301355264,3301355519,US
+3301355520,3301364479,SE
+3301364480,3301364735,NO
+3301364736,3301367551,SE
+3301367552,3301367807,PR
+3301367808,3301373183,SE
+3301373184,3301373439,US
+3301373440,3301375231,SE
+3301375232,3301375487,US
+3301375488,3301375743,SE
+3301375744,3301375999,US
+3301376000,3301376255,SC
+3301376256,3301376511,US
+3301376512,3301376767,SC
3301376768,3301377023,US
3301377024,3301377279,SC
-3301377280,3301377791,US
-3301377792,3301378047,SC
-3301378048,3301378559,US
-3301378560,3301379327,SC
-3301379328,3301379583,US
+3301377280,3301378559,US
+3301378560,3301379071,SC
+3301379072,3301379583,US
3301379584,3301379839,SC
-3301379840,3301381631,US
-3301381632,3301382399,SC
-3301382400,3301384447,US
-3301384448,3301384703,SC
-3301384704,3301385471,US
-3301385472,3301385727,SC
-3301385728,3301389567,US
-3301389568,3301390335,SC
-3301390336,3301390591,US
-3301390592,3301391103,SC
-3301391104,3301391359,US
+3301379840,3301387007,US
+3301387008,3301387263,ES
+3301387264,3301390079,US
+3301390080,3301390335,SC
+3301390336,3301391359,US
3301391360,3301391615,SC
-3301391616,3301392127,US
-3301392128,3301392383,SC
-3301392384,3301394175,US
-3301394176,3301394431,SC
-3301394432,3301396479,US
-3301396480,3301396735,SC
-3301396736,3301397247,US
+3301391616,3301395199,US
+3301395200,3301395455,PR
+3301395456,3301397247,US
3301397248,3301397503,SC
3301397504,3301397759,US
3301397760,3301398015,SC
-3301398016,3301398783,US
-3301398784,3301399039,SC
-3301399040,3301400575,US
-3301400576,3301400831,SC
-3301400832,3301401343,US
-3301401344,3301401855,SC
-3301401856,3301402111,US
-3301402112,3301402367,SC
-3301402368,3301402623,US
-3301402624,3301402879,SC
-3301402880,3301403391,US
+3301398016,3301401343,US
+3301401344,3301401599,SC
+3301401600,3301403391,US
3301403392,3301403647,SC
3301403648,3301404415,US
-3301404416,3301404671,SC
+3301404416,3301404671,NZ
3301404672,3301404927,US
3301404928,3301405183,SC
3301405184,3301407999,US
3301408000,3301408255,SC
-3301408256,3301409535,US
-3301409536,3301409791,SC
-3301409792,3301411327,US
-3301411328,3301411583,SC
-3301411584,3301411839,US
-3301411840,3301412095,SC
-3301412096,3301412607,US
-3301412608,3301412863,SC
-3301412864,3301413887,US
-3301413888,3301414399,SC
-3301414400,3301417215,US
-3301417216,3301417471,SC
-3301417472,3301418751,US
-3301418752,3301419519,SC
-3301419520,3301420799,US
-3301420800,3301421567,SC
+3301408256,3301411583,US
+3301411584,3301411839,PR
+3301411840,3301412863,US
+3301412864,3301413119,CA
+3301413120,3301419007,US
+3301419008,3301419519,SC
+3301419520,3301421311,US
+3301421312,3301421567,SC
3301421568,3301422079,US
3301422080,3301422335,SC
3301422336,3301422591,US
3301422592,3301422847,SC
-3301422848,3301423615,US
-3301423616,3301423871,SC
-3301423872,3301424383,US
+3301422848,3301424383,US
3301424384,3301424639,SC
3301424640,3301424895,US
-3301424896,3301425663,SC
-3301425664,3301426687,US
-3301426688,3301426943,SC
-3301426944,3301427199,US
-3301427200,3301427455,SC
-3301427456,3301429503,US
-3301429504,3301430015,SC
-3301430016,3301431039,US
-3301431040,3301431295,SC
-3301431296,3301431551,US
-3301431552,3301431807,SC
-3301431808,3301432575,US
-3301432576,3301433087,SC
-3301433088,3301434623,US
-3301434624,3301434879,SC
-3301434880,3301435903,US
-3301435904,3301436159,SC
-3301436160,3301436415,US
-3301436416,3301436927,SC
-3301436928,3301437183,US
+3301424896,3301425151,SC
+3301425152,3301432831,US
+3301432832,3301433087,SC
+3301433088,3301437183,US
3301437184,3301437439,SC
-3301437440,3301438719,US
-3301438720,3301439231,SC
-3301439232,3301440255,US
-3301440256,3301440767,SC
+3301437440,3301438975,US
+3301438976,3301439231,SC
+3301439232,3301440511,US
+3301440512,3301440767,SC
3301440768,3301441535,US
3301441536,3301442351,ZA
3301442352,3301442359,NG
@@ -113512,7 +116541,7 @@
3301466112,3301470207,ER
3301470208,3301474303,NG
3301474304,3301490687,MA
-3301490688,3301494783,ZA
+3301490688,3301494783,CD
3301494784,3301498879,BW
3301502976,3301507071,MA
3301507328,3301507583,MU
@@ -113567,20 +116596,11 @@
3302496256,3302498303,EG
3302498304,3302502399,NA
3302502400,3302505471,AO
-3302505472,3302505969,NA
-3302505970,3302505971,AO
-3302505972,3302506055,NA
-3302506056,3302506057,AO
-3302506058,3302506083,NA
-3302506084,3302506085,AO
-3302506086,3302506165,NA
-3302506166,3302506167,AO
-3302506168,3302506191,NA
-3302506192,3302506193,AO
-3302506194,3302506387,NA
-3302506388,3302506391,AO
-3302506392,3302506495,NA
-3302506496,3302514687,KE
+3302505472,3302505679,NA
+3302505680,3302505681,AO
+3302505682,3302506495,NA
+3302506496,3302509567,KE
+3302509568,3302514687,MU
3302514688,3302522879,ZA
3302522880,3302523903,KE
3302523904,3302525951,ZA
@@ -113595,6 +116615,7 @@
3302532096,3302533119,NA
3302533120,3302533631,MU
3302533632,3302533887,ZA
+3302533888,3302534143,MU
3302534144,3302535167,ZA
3302535168,3302536191,UG
3302536192,3302537215,GH
@@ -113697,7 +116718,7 @@
3302961152,3302977535,ZA
3302977536,3302981631,NG
3302981632,3302985727,ZA
-3302985728,3302987775,DJ
+3302985728,3302987775,GM
3302987776,3302989823,SD
3302989824,3302993919,KE
3302993920,3302998015,MA
@@ -113707,15 +116728,97 @@
3303013376,3303013631,SN
3303013632,3303014399,KE
3303014400,3304062975,TN
-3304062976,3304456191,SC
+3304062976,3304066559,SC
+3304066560,3304066815,CA
+3304066816,3304077311,SC
+3304077312,3304077567,DK
+3304077568,3304077823,SC
+3304077824,3304078079,FR
+3304078080,3304084991,SC
+3304084992,3304085247,US
+3304085248,3304102655,SC
+3304102656,3304102911,US
+3304102912,3304107263,SC
+3304107264,3304107519,PL
+3304107520,3304108799,SC
+3304108800,3304109055,AU
+3304109056,3304109311,SC
+3304109312,3304109567,BE
+3304109568,3304115967,SC
+3304115968,3304116223,US
+3304116224,3304120575,SC
+3304120576,3304120831,US
+3304120832,3304126975,SC
+3304126976,3304127231,FR
+3304127232,3304194303,SC
+3304194304,3304194559,US
+3304194560,3304212223,SC
+3304212224,3304212479,FR
+3304212480,3304213247,SC
+3304213248,3304213503,LV
+3304213504,3304213759,SC
+3304213760,3304214015,AT
+3304214016,3304218367,SC
+3304218368,3304218623,PR
+3304218624,3304223231,SC
+3304223232,3304223487,US
+3304223488,3304226047,SC
+3304226048,3304226559,US
+3304226560,3304227839,SC
+3304227840,3304228095,RU
+3304228096,3304228863,SC
+3304228864,3304229119,DE
+3304229120,3304229375,DK
+3304229376,3304232703,SC
+3304232704,3304232959,CH
+3304232960,3304233215,SC
+3304233216,3304233471,GB
+3304233472,3304233727,SC
+3304233728,3304233983,US
+3304233984,3304246271,SC
+3304246272,3304246527,BE
+3304246528,3304249343,SC
+3304249344,3304249599,NL
+3304249600,3304326143,SC
+3304326144,3304326399,DE
+3304326400,3304327935,SC
+3304327936,3304328191,HK
+3304328192,3304340735,SC
+3304340736,3304340991,US
+3304340992,3304342783,SC
+3304342784,3304343039,IN
+3304343040,3304343551,SC
+3304343552,3304343807,DE
+3304343808,3304353023,SC
+3304353024,3304353535,US
+3304353536,3304358399,SC
+3304358400,3304358655,BR
+3304358656,3304360191,SC
+3304360192,3304360447,DK
+3304360448,3304397823,SC
+3304397824,3304399871,US
+3304399872,3304408063,SC
+3304408064,3304411135,US
+3304411136,3304419327,SC
+3304419328,3304420351,US
+3304420352,3304424447,SC
+3304424448,3304425471,US
+3304425472,3304432639,SC
+3304432640,3304433663,NL
+3304433664,3304442879,SC
+3304442880,3304443903,AU
+3304443904,3304451071,SC
+3304451072,3304452095,AT
+3304452096,3304454143,SC
+3304454144,3304455167,SG
+3304455168,3304456191,SC
3304456192,3304521727,NG
3304521728,3304528895,US
3304528896,3304529919,SC
3304529920,3304535295,US
3304535296,3304536063,SC
3304536064,3304538111,CA
-3304538112,3304539135,SC
-3304539136,3304548351,US
+3304538112,3304548351,US
3304548352,3304549375,SC
3304549376,3304562687,US
3304562688,3304563711,GB
@@ -113746,10 +116849,52 @@
3304669184,3304685567,TZ
3304685568,3304701951,ZA
3304701952,3304718335,AO
+3304718336,3304734719,ZA
+3304734720,3304751103,BJ
3304751104,3304759295,ZA
+3304763392,3304767487,LR
+3304771584,3304773631,KE
3304775680,3304781823,ZA
3304781824,3304782847,AO
3304782848,3304783871,MU
+3304783872,3304801023,ZA
+3304801024,3304801279,GH
+3304801280,3304801791,SC
+3304801792,3304802047,GH
+3304802048,3304802559,SC
+3304802560,3304802815,GH
+3304802816,3304803327,SC
+3304803328,3304803583,GH
+3304803584,3304804095,SC
+3304804096,3304804351,NG
+3304804352,3304804863,SC
+3304804864,3304805119,NG
+3304805120,3304805631,SC
+3304805632,3304805887,NG
+3304805888,3304806399,SC
+3304806400,3304806655,ZA
+3304806656,3304807167,SC
+3304807168,3304807423,ZA
+3304807424,3304807935,SC
+3304807936,3304808191,ZA
+3304808192,3304808703,SC
+3304808704,3304808959,ZA
+3304808960,3304809471,SC
+3304809472,3304809727,KE
+3304809728,3304810239,SC
+3304810240,3304810495,KE
+3304810496,3304811007,SC
+3304811008,3304811263,KE
+3304811264,3304811775,SC
+3304811776,3304812031,KE
+3304812032,3304816639,SC
+3304816640,3304820735,ZA
+3304821760,3304822783,MU
+3304822784,3304823807,BJ
+3304824832,3304841215,ZA
+3304841216,3304843263,NG
+3304843264,3304845311,ZA
+3304845312,3304846335,GQ
3304846336,3304847359,SC
3304847360,3304848383,ZA
3304848384,3304849407,MU
@@ -113800,9 +116945,9 @@
3315204096,3315269631,ET
3315269632,3315286015,ZA
3315286016,3315286527,KE
-3315286528,3315288413,MU
-3315288414,3315288414,KE
-3315288415,3315289343,MU
+3315286528,3315288319,MU
+3315288320,3315288575,KE
+3315288576,3315289343,MU
3315289344,3315289599,KE
3315289600,3315291135,MU
3315291136,3315293183,KE
@@ -113996,7 +117141,9 @@
3321364480,3321430015,KE
3321430016,3321495551,MZ
3321495552,3321561087,TZ
-3321561088,3321593855,SD
+3321561088,3321570815,SD
+3321570816,3321571071,SS
+3321571072,3321593855,SD
3321593856,3321626623,GH
3321626624,3321692159,SD
3321692160,3321708543,NG
@@ -114210,9 +117357,9 @@
3322683392,3322691583,AR
3322691584,3322691607,US
3322691608,3322691615,RO
-3322691616,3322691791,US
-3322691792,3322691799,CA
-3322691800,3322691839,US
+3322691616,3322691775,US
+3322691776,3322691791,CA
+3322691792,3322691839,US
3322691840,3322692095,SE
3322692096,3322692103,US
3322692104,3322692111,RO
@@ -114230,7 +117377,10 @@
3322693248,3322693263,BR
3322693264,3322693271,US
3322693272,3322693279,BR
-3322693280,3322694319,US
+3322693280,3322693287,SG
+3322693288,3322693307,US
+3322693308,3322693311,CA
+3322693312,3322694319,US
3322694320,3322694327,CA
3322694328,3322694895,US
3322694896,3322694911,GB
@@ -114250,12 +117400,17 @@
3322697416,3322697423,RO
3322697424,3322697431,US
3322697432,3322697439,CA
-3322697440,3322698303,US
+3322697440,3322697951,US
+3322697952,3322697983,CA
+3322697984,3322698303,US
3322698304,3322698367,IL
3322698368,3322698383,US
3322698384,3322698391,CA
3322698392,3322698399,RO
-3322698400,3322699223,US
+3322698400,3322699199,US
+3322699200,3322699207,PK
+3322699208,3322699215,US
+3322699216,3322699223,CA
3322699224,3322699231,RO
3322699232,3322700095,US
3322700096,3322700127,FR
@@ -114269,9 +117424,7 @@
3322706632,3322706639,GB
3322706640,3322706651,US
3322706652,3322706655,CA
-3322706656,3322707119,US
-3322707120,3322707127,CA
-3322707128,3322707359,US
+3322706656,3322707359,US
3322707360,3322707391,PK
3322707392,3322707743,US
3322707744,3322707751,CA
@@ -114293,15 +117446,9 @@
3322768608,3322768623,IN
3322768624,3322769327,US
3322769328,3322769343,IN
-3322769344,3322775551,US
-3322775552,3322777599,CA
-3322777600,3322785791,US
-3322785792,3322796799,CA
-3322796800,3322801663,US
-3322801664,3322801919,CA
-3322801920,3322804223,US
-3322804224,3322805759,CA
-3322805760,3322875903,US
+3322769344,3322773503,US
+3322773504,3322806271,CA
+3322806272,3322875903,US
3322880000,3322888191,AU
3322888192,3322888815,US
3322888816,3322888823,IN
@@ -114330,9 +117477,7 @@
3322893984,3322893991,BR
3322893992,3322894207,US
3322894208,3322894215,CN
-3322894216,3322894335,US
-3322894336,3322894399,HK
-3322894400,3322894703,US
+3322894216,3322894703,US
3322894704,3322894719,IN
3322894720,3322897063,US
3322897064,3322897071,QA
@@ -114494,10 +117639,11 @@
3322956616,3322956623,DE
3322956624,3322962431,NL
3322962432,3322962687,GB
-3322962688,3322962943,US
+3322962688,3322962943,ES
3322962944,3322963455,NL
3322963456,3322964479,GB
-3322964480,3322969343,US
+3322964480,3322964991,NL
+3322964992,3322969343,US
3322969344,3322970111,NL
3322970112,3323002879,CA
3323002880,3323013887,US
@@ -114567,13 +117713,7 @@
3323241728,3323241983,CA
3323241984,3323242511,US
3323242512,3323242527,BD
-3323242528,3323242559,US
-3323242560,3323242575,GB
-3323242576,3323242591,US
-3323242592,3323242607,GB
-3323242608,3323242623,US
-3323242624,3323242703,AE
-3323242704,3323243087,US
+3323242528,3323243087,US
3323243088,3323243095,IE
3323243096,3323243103,GB
3323243104,3323243143,US
@@ -114611,9 +117751,7 @@
3323245560,3323245567,CN
3323245568,3323246463,US
3323246464,3323246591,CN
-3323246592,3323247359,US
-3323247360,3323247423,CA
-3323247424,3323270420,US
+3323246592,3323270420,US
3323270421,3323270421,CH
3323270422,3323339263,US
3323339776,3323340031,CA
@@ -114638,7 +117776,9 @@
3323416400,3323416479,GB
3323416480,3323437823,US
3323437824,3323438079,CA
-3323438080,3323441043,US
+3323438080,3323440703,US
+3323440704,3323440735,GB
+3323440736,3323441043,US
3323441044,3323441047,GB
3323441048,3323444847,US
3323444848,3323444863,CA
@@ -114703,7 +117843,9 @@
3323660544,3323661311,US
3323661312,3323662335,CA
3323662336,3323674623,US
-3323674624,3323678031,CA
+3323674624,3323677991,CA
+3323677992,3323677995,US
+3323677996,3323678031,CA
3323678032,3323678047,US
3323678048,3323678055,CA
3323678056,3323678059,MX
@@ -114722,8 +117864,7 @@
3323678172,3323678175,US
3323678176,3323678195,CA
3323678196,3323678199,VE
-3323678200,3323678207,CA
-3323678208,3323678463,US
+3323678200,3323678463,US
3323678464,3323678523,CA
3323678524,3323678527,US
3323678528,3323678583,CA
@@ -114748,14 +117889,14 @@
3323681424,3323681439,CA
3323681440,3323681455,AE
3323681456,3323681479,CA
-3323681480,3323681487,IN
+3323681480,3323681487,GB
3323681488,3323681519,CA
3323681520,3323681527,SI
3323681528,3323681535,CA
3323681536,3323681567,IN
3323681568,3323681583,US
3323681584,3323681591,CA
-3323681592,3323681599,PL
+3323681592,3323681599,US
3323681600,3323681631,CA
3323681632,3323681663,NO
3323681664,3323681727,CA
@@ -114771,7 +117912,8 @@
3323682752,3323682767,US
3323682768,3323682771,CA
3323682772,3323682775,RO
-3323682776,3323682839,CA
+3323682776,3323682831,CA
+3323682832,3323682839,IN
3323682840,3323682843,BD
3323682844,3323682947,CA
3323682948,3323682951,US
@@ -114786,13 +117928,17 @@
3323683008,3323683039,AU
3323683040,3323683071,CA
3323683072,3323683103,BA
-3323683104,3323683215,CA
+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,3323683427,CA
+3323683368,3323683399,CA
+3323683400,3323683403,BR
+3323683404,3323683427,CA
3323683428,3323683431,IT
3323683432,3323683439,PL
3323683440,3323683447,CA
@@ -114801,7 +117947,9 @@
3323683536,3323683551,AU
3323683552,3323683583,CA
3323683584,3323683591,PA
-3323683592,3323683707,CA
+3323683592,3323683679,CA
+3323683680,3323683683,FR
+3323683684,3323683707,CA
3323683708,3323683711,US
3323683712,3323683839,GP
3323683840,3323683871,CA
@@ -114819,7 +117967,8 @@
3323684232,3323684239,CA
3323684240,3323684243,GB
3323684244,3323684271,CA
-3323684272,3323684287,US
+3323684272,3323684279,FR
+3323684280,3323684287,ES
3323684288,3323684291,IN
3323684292,3323684387,CA
3323684388,3323684391,MX
@@ -114827,21 +117976,24 @@
3323684396,3323684399,IN
3323684400,3323684415,CA
3323684416,3323684431,DE
-3323684432,3323684439,US
-3323684440,3323684443,CA
+3323684432,3323684435,US
+3323684436,3323684443,CA
3323684444,3323684447,IN
3323684448,3323684463,CA
3323684464,3323684479,US
-3323684480,3323684543,CA
+3323684480,3323684503,CA
+3323684504,3323684507,IN
+3323684508,3323684543,CA
3323684544,3323684559,US
3323684560,3323684607,CA
3323684608,3323684611,BR
-3323684612,3323684695,CA
+3323684612,3323684615,CA
+3323684616,3323684619,US
+3323684620,3323684695,CA
3323684696,3323684703,US
3323684704,3323684735,CA
3323684736,3323684739,IN
-3323684740,3323684767,CA
-3323684768,3323684783,VG
+3323684740,3323684783,CA
3323684784,3323684799,CO
3323684800,3323684835,CA
3323684836,3323684839,MX
@@ -114862,7 +118014,8 @@
3323685264,3323685271,US
3323685272,3323685275,CA
3323685276,3323685287,US
-3323685288,3323685311,CA
+3323685288,3323685295,CA
+3323685296,3323685311,PL
3323685312,3323685315,VG
3323685316,3323685319,CA
3323685320,3323685327,CO
@@ -114870,7 +118023,9 @@
3323685344,3323685347,BZ
3323685348,3323685351,IN
3323685352,3323685359,US
-3323685360,3323685407,CA
+3323685360,3323685391,CA
+3323685392,3323685399,MX
+3323685400,3323685407,CA
3323685408,3323685411,MX
3323685412,3323685415,US
3323685416,3323685419,AR
@@ -114897,7 +118052,9 @@
3323685952,3323686047,CA
3323686048,3323686051,US
3323686052,3323686055,AR
-3323686056,3323686135,CA
+3323686056,3323686095,CA
+3323686096,3323686111,US
+3323686112,3323686135,CA
3323686136,3323686143,MX
3323686144,3323686159,NO
3323686160,3323686163,US
@@ -114909,9 +118066,9 @@
3323686264,3323686271,US
3323686272,3323686287,CA
3323686288,3323686303,US
-3323686304,3323686335,ES
+3323686304,3323686335,IT
3323686336,3323686367,CA
-3323686368,3323686371,VI
+3323686368,3323686371,IN
3323686372,3323686383,CA
3323686384,3323686391,US
3323686392,3323686439,CA
@@ -114922,12 +118079,13 @@
3323686624,3323686631,NL
3323686632,3323686639,BR
3323686640,3323686655,US
-3323686656,3323686683,CA
+3323686656,3323686663,CA
+3323686664,3323686667,US
+3323686668,3323686683,CA
3323686684,3323686687,IN
3323686688,3323686847,CA
-3323686848,3323686851,VE
-3323686852,3323686907,CA
-3323686908,3323686911,US
+3323686848,3323686851,US
+3323686852,3323686911,CA
3323686912,3323686943,BR
3323686944,3323686975,IN
3323686976,3323687031,CA
@@ -114953,7 +118111,9 @@
3323687428,3323687431,BZ
3323687432,3323687567,CA
3323687568,3323687571,PL
-3323687572,3323687591,CA
+3323687572,3323687575,CA
+3323687576,3323687583,ES
+3323687584,3323687591,CA
3323687592,3323687599,US
3323687600,3323687711,CA
3323687712,3323687715,US
@@ -114965,9 +118125,7 @@
3323687916,3323687919,US
3323687920,3323687935,CA
3323687936,3323687999,US
-3323688000,3323688047,CA
-3323688048,3323688051,BD
-3323688052,3323688059,CA
+3323688000,3323688059,CA
3323688060,3323688063,GB
3323688064,3323688135,CA
3323688136,3323688143,US
@@ -114975,7 +118133,9 @@
3323688168,3323688175,BR
3323688176,3323688207,CA
3323688208,3323688215,AR
-3323688216,3323688287,CA
+3323688216,3323688255,CA
+3323688256,3323688271,BR
+3323688272,3323688287,CA
3323688288,3323688303,PA
3323688304,3323688319,CA
3323688320,3323688335,US
@@ -114983,13 +118143,15 @@
3323688392,3323688395,ID
3323688396,3323688415,CA
3323688416,3323688447,DE
-3323688448,3323688471,CA
+3323688448,3323688463,CA
+3323688464,3323688467,US
+3323688468,3323688471,CA
3323688472,3323688479,US
-3323688480,3323688543,CA
+3323688480,3323688531,CA
+3323688532,3323688535,EC
+3323688536,3323688543,CA
3323688544,3323688551,VE
-3323688552,3323688555,CA
-3323688556,3323688559,IN
-3323688560,3323688563,CA
+3323688552,3323688563,CA
3323688564,3323688567,CL
3323688568,3323688571,VE
3323688572,3323688603,CA
@@ -115003,14 +118165,11 @@
3323688844,3323688847,CA
3323688848,3323688855,PT
3323688856,3323688863,CL
-3323688864,3323688879,US
-3323688880,3323688895,CA
-3323688896,3323688911,IN
-3323688912,3323688943,CA
+3323688864,3323688943,CA
3323688944,3323688947,AU
-3323688948,3323689023,CA
-3323689024,3323689039,US
-3323689040,3323689071,CA
+3323688948,3323689055,CA
+3323689056,3323689059,FR
+3323689060,3323689071,CA
3323689072,3323689079,ID
3323689080,3323689167,CA
3323689168,3323689183,US
@@ -115030,8 +118189,10 @@
3323689400,3323689403,DE
3323689404,3323689407,BR
3323689408,3323689435,CA
-3323689436,3323689439,US
-3323689440,3323689519,CA
+3323689436,3323689439,MY
+3323689440,3323689455,CA
+3323689456,3323689471,PK
+3323689472,3323689519,CA
3323689520,3323689527,ES
3323689528,3323689559,CA
3323689560,3323689583,US
@@ -115039,20 +118200,24 @@
3323689600,3323689663,US
3323689664,3323689715,CA
3323689716,3323689719,US
-3323689720,3323689863,CA
+3323689720,3323689815,CA
+3323689816,3323689823,US
+3323689824,3323689863,CA
3323689864,3323689871,PE
3323689872,3323689879,IT
3323689880,3323689927,CA
3323689928,3323689935,US
3323689936,3323689983,CA
3323689984,3323690015,RS
-3323690016,3323690095,CA
+3323690016,3323690047,CA
+3323690048,3323690063,PK
+3323690064,3323690095,CA
3323690096,3323690111,PK
-3323690112,3323690223,CA
+3323690112,3323690199,CA
+3323690200,3323690207,US
+3323690208,3323690223,CA
3323690224,3323690235,US
-3323690236,3323690251,CA
-3323690252,3323690255,BR
-3323690256,3323690263,CA
+3323690236,3323690263,CA
3323690264,3323690267,BR
3323690268,3323690351,CA
3323690352,3323690359,AE
@@ -115063,15 +118228,7 @@
3323740160,3323748351,GB
3323748352,3323805695,US
3323805696,3323805951,GB
-3323805952,3324031999,US
-3324032000,3324032255,KN
-3324032256,3324035583,US
-3324035584,3324035839,KN
-3324035840,3324036351,US
-3324036352,3324036607,KN
-3324036608,3324047359,US
-3324047360,3324047615,KN
-3324047616,3324051455,US
+3323805952,3324051455,US
3324051456,3324182527,CA
3324182528,3324193279,US
3324193280,3324193791,CA
@@ -115660,7 +118817,9 @@
3324939520,3324939535,RO
3324939536,3324939567,US
3324939568,3324939583,RO
-3324939584,3324942855,US
+3324939584,3324939735,US
+3324939736,3324939739,CA
+3324939740,3324942855,US
3324942856,3324942863,RO
3324942864,3324943047,US
3324943048,3324943055,CA
@@ -115695,7 +118854,9 @@
3325120077,3325120081,MX
3325120082,3325120423,US
3325120424,3325120431,IN
-3325120432,3325128703,US
+3325120432,3325122559,US
+3325122560,3325123071,CA
+3325123072,3325128703,US
3325128704,3325129215,TH
3325129216,3325131775,US
3325131776,3325132031,AU
@@ -115721,7 +118882,8 @@
3325198424,3325198559,CA
3325198560,3325198575,PA
3325198576,3325198583,CA
-3325198584,3325198591,US
+3325198584,3325198587,ES
+3325198588,3325198591,US
3325198592,3325198619,CA
3325198620,3325198623,AR
3325198624,3325198627,ES
@@ -115734,7 +118896,11 @@
3325198704,3325198719,US
3325198720,3325198751,CA
3325198752,3325198755,LK
-3325198756,3325198815,CA
+3325198756,3325198759,US
+3325198760,3325198779,CA
+3325198780,3325198783,MX
+3325198784,3325198811,CA
+3325198812,3325198815,US
3325198816,3325198823,DE
3325198824,3325198831,CA
3325198832,3325198847,US
@@ -115750,9 +118916,11 @@
3325199072,3325199079,US
3325199080,3325199103,CA
3325199104,3325199119,DE
-3325199120,3325199123,CA
-3325199124,3325199127,TR
-3325199128,3325199255,CA
+3325199120,3325199127,CA
+3325199128,3325199131,US
+3325199132,3325199143,CA
+3325199144,3325199147,US
+3325199148,3325199255,CA
3325199256,3325199259,BR
3325199260,3325199291,CA
3325199292,3325199295,US
@@ -115770,10 +118938,10 @@
3325199492,3325199495,BR
3325199496,3325199559,CA
3325199560,3325199567,US
-3325199568,3325199623,CA
+3325199568,3325199583,BR
+3325199584,3325199623,CA
3325199624,3325199627,BE
-3325199628,3325199647,CA
-3325199648,3325199655,ID
+3325199628,3325199655,CA
3325199656,3325199663,US
3325199664,3325199775,CA
3325199776,3325199779,BR
@@ -115810,9 +118978,9 @@
3325200312,3325200315,IN
3325200316,3325200323,CA
3325200324,3325200327,IL
-3325200328,3325200451,CA
-3325200452,3325200455,US
-3325200456,3325200463,CA
+3325200328,3325200455,CA
+3325200456,3325200459,US
+3325200460,3325200463,CA
3325200464,3325200467,US
3325200468,3325200567,CA
3325200568,3325200571,US
@@ -115821,10 +118989,13 @@
3325200728,3325200731,US
3325200732,3325200739,CA
3325200740,3325200747,US
-3325200748,3325200807,CA
+3325200748,3325200767,CA
+3325200768,3325200783,ID
+3325200784,3325200807,CA
3325200808,3325200811,TR
3325200812,3325200815,IE
-3325200816,3325200831,CA
+3325200816,3325200827,CA
+3325200828,3325200831,CO
3325200832,3325200863,BA
3325200864,3325200879,ES
3325200880,3325200891,CA
@@ -115859,8 +119030,8 @@
3325201288,3325201367,CA
3325201368,3325201375,MY
3325201376,3325201391,CA
-3325201392,3325201415,US
-3325201416,3325201427,CA
+3325201392,3325201407,US
+3325201408,3325201427,CA
3325201428,3325201431,US
3325201432,3325201439,CA
3325201440,3325201447,IN
@@ -115873,7 +119044,9 @@
3325201592,3325201599,PT
3325201600,3325201603,CA
3325201604,3325201615,US
-3325201616,3325201647,CA
+3325201616,3325201627,CA
+3325201628,3325201631,US
+3325201632,3325201647,CA
3325201648,3325201655,US
3325201656,3325201663,ES
3325201664,3325201671,CO
@@ -115901,7 +119074,7 @@
3325202280,3325202327,CA
3325202328,3325202331,AU
3325202332,3325202367,CA
-3325202368,3325202371,PE
+3325202368,3325202371,PH
3325202372,3325202375,FR
3325202376,3325202395,CA
3325202396,3325202399,IN
@@ -115909,29 +119082,33 @@
3325204480,3325205503,US
3325205504,3325206428,CA
3325206429,3325206429,US
-3325206430,3325206623,CA
+3325206430,3325206543,CA
+3325206544,3325206551,DO
+3325206552,3325206555,US
+3325206556,3325206559,CZ
+3325206560,3325206623,CA
3325206624,3325206625,RO
3325206626,3325206626,CA
3325206627,3325206627,RO
3325206628,3325206639,CA
3325206640,3325206671,US
3325206672,3325206679,BR
-3325206680,3325206683,US
-3325206684,3325206687,CA
+3325206680,3325206683,CL
+3325206684,3325206687,SE
3325206688,3325206719,US
3325206720,3325206799,CA
3325206800,3325206815,US
-3325206816,3325206823,CA
-3325206824,3325206831,PL
+3325206816,3325206831,CA
3325206832,3325206839,US
3325206840,3325206847,BG
3325206848,3325206879,CA
3325206880,3325206911,BA
-3325206912,3325206915,CA
+3325206912,3325206915,BR
3325206916,3325206919,US
3325206920,3325206935,CA
3325206936,3325206943,HR
-3325206944,3325207055,CA
+3325206944,3325207051,CA
+3325207052,3325207055,US
3325207056,3325207059,GB
3325207060,3325207071,CA
3325207072,3325207103,MX
@@ -115941,13 +119118,18 @@
3325207120,3325207131,CA
3325207132,3325207135,US
3325207136,3325207167,BD
-3325207168,3325207283,CA
+3325207168,3325207271,CA
+3325207272,3325207279,IN
+3325207280,3325207283,CA
3325207284,3325207287,US
3325207288,3325207379,CA
3325207380,3325207383,US
-3325207384,3325207455,CA
-3325207456,3325207471,GB
-3325207472,3325207591,CA
+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
@@ -115961,8 +119143,7 @@
3325208064,3325208095,BS
3325208096,3325208119,CA
3325208120,3325208123,US
-3325208124,3325208127,IN
-3325208128,3325208171,CA
+3325208124,3325208171,CA
3325208172,3325208175,BR
3325208176,3325208187,CA
3325208188,3325208191,IN
@@ -115980,9 +119161,7 @@
3325208492,3325208495,US
3325208496,3325208543,CA
3325208544,3325208547,US
-3325208548,3325208639,CA
-3325208640,3325208647,US
-3325208648,3325208735,CA
+3325208548,3325208735,CA
3325208736,3325208743,HK
3325208744,3325208747,CA
3325208748,3325208751,CZ
@@ -115990,13 +119169,12 @@
3325208828,3325208831,EG
3325208832,3325208939,CA
3325208940,3325208943,AU
-3325208944,3325208999,CA
+3325208944,3325208947,BR
+3325208948,3325208999,CA
3325209000,3325209003,AU
3325209004,3325209023,CA
3325209024,3325209055,US
-3325209056,3325209063,CA
-3325209064,3325209067,US
-3325209068,3325209083,CA
+3325209056,3325209083,CA
3325209084,3325209087,US
3325209088,3325209091,CA
3325209092,3325209095,AR
@@ -116011,8 +119189,7 @@
3325209232,3325209247,DE
3325209248,3325209295,CA
3325209296,3325209311,US
-3325209312,3325209323,CA
-3325209324,3325209327,BR
+3325209312,3325209327,CA
3325209328,3325209343,US
3325209344,3325209359,RO
3325209360,3325209379,CA
@@ -116020,11 +119197,13 @@
3325209384,3325209387,CA
3325209388,3325209407,US
3325209408,3325209411,GB
-3325209412,3325209423,CA
-3325209424,3325209439,US
-3325209440,3325209475,CA
+3325209412,3325209435,CA
+3325209436,3325209439,NG
+3325209440,3325209447,CA
+3325209448,3325209451,MT
+3325209452,3325209475,CA
3325209476,3325209479,US
-3325209480,3325209483,FR
+3325209480,3325209483,IN
3325209484,3325209491,CA
3325209492,3325209495,CN
3325209496,3325209543,CA
@@ -116033,17 +119212,13 @@
3325209568,3325209575,US
3325209576,3325209579,CA
3325209580,3325209583,US
-3325209584,3325209631,CA
-3325209632,3325209635,US
-3325209636,3325209639,CA
+3325209584,3325209639,CA
3325209640,3325209647,TR
3325209648,3325209655,CA
3325209656,3325209663,CH
3325209664,3325209679,US
-3325209680,3325209691,CA
-3325209692,3325209695,US
-3325209696,3325209759,CA
-3325209760,3325209775,US
+3325209680,3325209767,CA
+3325209768,3325209775,US
3325209776,3325209779,CA
3325209780,3325209783,ID
3325209784,3325209915,CA
@@ -116081,7 +119256,9 @@
3325210636,3325210639,FR
3325210640,3325210671,CA
3325210672,3325210687,BR
-3325210688,3325210711,CA
+3325210688,3325210703,CA
+3325210704,3325210707,US
+3325210708,3325210711,CA
3325210712,3325210719,IN
3325210720,3325210751,US
3325210752,3325210791,CA
@@ -116091,18 +119268,19 @@
3325210852,3325210863,CA
3325210864,3325210879,US
3325210880,3325210959,CA
-3325210960,3325210991,US
+3325210960,3325210975,IN
+3325210976,3325210991,US
3325210992,3325211087,CA
3325211088,3325211091,US
3325211092,3325211095,CA
3325211096,3325211103,US
-3325211104,3325211111,FR
-3325211112,3325211115,CA
-3325211116,3325211119,GB
+3325211104,3325211119,CA
3325211120,3325211127,US
3325211128,3325211135,CA
3325211136,3325211143,ID
-3325211144,3325211159,CA
+3325211144,3325211151,CA
+3325211152,3325211155,US
+3325211156,3325211159,CA
3325211160,3325211167,US
3325211168,3325211175,CA
3325211176,3325211183,US
@@ -116126,12 +119304,12 @@
3325211420,3325211423,US
3325211424,3325211647,CA
3325211648,3325211807,US
-3325211808,3325211855,CA
+3325211808,3325211839,CA
+3325211840,3325211855,US
3325211856,3325211859,CL
3325211860,3325211863,CA
3325211864,3325211871,NO
-3325211872,3325211879,CA
-3325211880,3325211883,PE
+3325211872,3325211883,CA
3325211884,3325211887,US
3325211888,3325211895,RO
3325211896,3325211967,CA
@@ -116139,7 +119317,8 @@
3325212000,3325212007,US
3325212008,3325212087,CA
3325212088,3325212091,BZ
-3325212092,3325212127,CA
+3325212092,3325212095,US
+3325212096,3325212127,CA
3325212128,3325212143,IN
3325212144,3325212151,US
3325212152,3325212155,MX
@@ -116152,17 +119331,20 @@
3325212204,3325212207,ID
3325212208,3325212215,CA
3325212216,3325212223,HR
-3325212224,3325212495,CA
-3325212496,3325212511,ID
+3325212224,3325212295,CA
+3325212296,3325212303,IN
+3325212304,3325212495,CA
+3325212496,3325212503,FR
+3325212504,3325212511,HU
3325212512,3325212515,CY
3325212516,3325212559,CA
3325212560,3325212575,BR
-3325212576,3325212579,CA
-3325212580,3325212583,US
-3325212584,3325212587,CA
+3325212576,3325212587,CA
3325212588,3325212591,BR
3325212592,3325212599,US
-3325212600,3325212647,CA
+3325212600,3325212611,CA
+3325212612,3325212615,BR
+3325212616,3325212647,CA
3325212648,3325212655,US
3325212656,3325212719,CA
3325212720,3325212727,ID
@@ -116170,9 +119352,7 @@
3325212732,3325212735,AE
3325212736,3325212771,CA
3325212772,3325212775,US
-3325212776,3325212783,CA
-3325212784,3325212799,US
-3325212800,3325212927,CA
+3325212776,3325212927,CA
3325212928,3325212943,LK
3325212944,3325213023,CA
3325213024,3325213055,EE
@@ -116211,9 +119391,7 @@
3325213712,3325213715,AR
3325213716,3325213951,CA
3325213952,3325213983,BA
-3325213984,3325213991,CA
-3325213992,3325213995,US
-3325213996,3325214015,CA
+3325213984,3325214015,CA
3325214016,3325214063,US
3325214064,3325214071,CA
3325214072,3325214079,AE
@@ -116225,10 +119403,11 @@
3325214152,3325214155,US
3325214156,3325214163,CA
3325214164,3325214167,BR
-3325214168,3325214187,CA
+3325214168,3325214171,CA
+3325214172,3325214175,US
+3325214176,3325214187,CA
3325214188,3325214191,US
-3325214192,3325214239,CA
-3325214240,3325214255,US
+3325214192,3325214255,CA
3325214256,3325214259,SA
3325214260,3325214263,US
3325214264,3325214463,CA
@@ -116236,26 +119415,24 @@
3325214480,3325214499,CA
3325214500,3325214503,PA
3325214504,3325214583,CA
-3325214584,3325214587,US
-3325214588,3325214623,CA
+3325214584,3325214591,US
+3325214592,3325214623,CA
3325214624,3325214639,DE
3325214640,3325214647,FR
3325214648,3325214703,CA
3325214704,3325214719,AU
3325214720,3325214735,CA
3325214736,3325214739,US
-3325214740,3325214815,CA
+3325214740,3325214783,CA
+3325214784,3325214791,US
+3325214792,3325214815,CA
3325214816,3325214823,US
3325214824,3325214831,BR
-3325214832,3325214975,CA
-3325214976,3325214979,ES
-3325214980,3325215055,CA
+3325214832,3325215055,CA
3325215056,3325215059,IT
3325215060,3325215079,CA
3325215080,3325215087,BR
-3325215088,3325215103,CA
-3325215104,3325215107,IN
-3325215108,3325215127,CA
+3325215088,3325215127,CA
3325215128,3325215131,US
3325215132,3325215135,BZ
3325215136,3325215175,CA
@@ -116263,8 +119440,7 @@
3325215184,3325215203,CA
3325215204,3325215207,GB
3325215208,3325215211,FR
-3325215212,3325215247,CA
-3325215248,3325215263,US
+3325215212,3325215263,CA
3325215264,3325215295,IN
3325215296,3325215299,US
3325215300,3325215303,IN
@@ -116277,10 +119453,12 @@
3325215472,3325215475,ES
3325215476,3325215495,CA
3325215496,3325215503,BR
-3325215504,3325215667,CA
+3325215504,3325215611,CA
+3325215612,3325215615,BR
+3325215616,3325215667,CA
3325215668,3325215675,BR
3325215676,3325215719,CA
-3325215720,3325215727,US
+3325215720,3325215727,MX
3325215728,3325215731,CA
3325215732,3325215735,BR
3325215736,3325215743,CA
@@ -116295,7 +119473,9 @@
3325215912,3325215915,IN
3325215916,3325215919,GB
3325215920,3325215927,US
-3325215928,3325215951,CA
+3325215928,3325215931,CA
+3325215932,3325215935,BR
+3325215936,3325215951,CA
3325215952,3325215967,BE
3325215968,3325215983,CA
3325215984,3325215999,VE
@@ -116314,14 +119494,15 @@
3325216116,3325216119,US
3325216120,3325216239,CA
3325216240,3325216243,BR
-3325216244,3325216247,IN
-3325216248,3325216319,CA
+3325216244,3325216319,CA
3325216320,3325216327,US
3325216328,3325216359,CA
3325216360,3325216363,GB
3325216364,3325216367,CA
-3325216368,3325216375,US
-3325216376,3325216447,CA
+3325216368,3325216383,US
+3325216384,3325216399,CA
+3325216400,3325216415,BR
+3325216416,3325216447,CA
3325216448,3325216463,FR
3325216464,3325216527,CA
3325216528,3325216531,US
@@ -116345,11 +119526,14 @@
3325217224,3325217227,AU
3325217228,3325217231,CA
3325217232,3325217235,US
-3325217236,3325217247,CA
+3325217236,3325217243,CA
+3325217244,3325217247,US
3325217248,3325217279,BA
3325217280,3325217307,CA
3325217308,3325217311,HK
-3325217312,3325217471,CA
+3325217312,3325217403,CA
+3325217404,3325217407,FR
+3325217408,3325217471,CA
3325217472,3325217503,IE
3325217504,3325217651,CA
3325217652,3325217655,AE
@@ -116364,17 +119548,15 @@
3325217888,3325217939,CA
3325217940,3325217943,US
3325217944,3325217951,CO
-3325217952,3325217975,CA
-3325217976,3325217987,US
-3325217988,3325218015,CA
-3325218016,3325218031,ES
-3325218032,3325218039,CA
+3325217952,3325217971,CA
+3325217972,3325217975,US
+3325217976,3325217983,CA
+3325217984,3325217987,US
+3325217988,3325218039,CA
3325218040,3325218047,US
3325218048,3325218139,CA
3325218140,3325218147,GB
-3325218148,3325218151,CA
-3325218152,3325218155,US
-3325218156,3325218159,CA
+3325218148,3325218159,CA
3325218160,3325218167,US
3325218168,3325218207,CA
3325218208,3325218239,US
@@ -116388,7 +119570,9 @@
3325218488,3325218491,US
3325218492,3325218519,CA
3325218520,3325218523,US
-3325218524,3325218559,CA
+3325218524,3325218531,CA
+3325218532,3325218535,US
+3325218536,3325218559,CA
3325218560,3325218567,US
3325218568,3325218583,CA
3325218584,3325218591,IN
@@ -116416,7 +119600,9 @@
3325219468,3325219475,US
3325219476,3325219503,CA
3325219504,3325219511,VG
-3325219512,3325219535,CA
+3325219512,3325219515,CA
+3325219516,3325219519,BR
+3325219520,3325219535,CA
3325219536,3325219551,PK
3325219552,3325219583,CA
3325219584,3325219599,US
@@ -116434,7 +119620,8 @@
3325219808,3325219811,US
3325219812,3325219839,CA
3325219840,3325219871,TN
-3325219872,3325219919,CA
+3325219872,3325219875,BR
+3325219876,3325219919,CA
3325219920,3325219931,US
3325219932,3325219935,CA
3325219936,3325219951,US
@@ -116456,7 +119643,7 @@
3325220408,3325220411,US
3325220412,3325220415,BZ
3325220416,3325220511,CA
-3325220512,3325220519,PL
+3325220512,3325220519,BR
3325220520,3325220579,CA
3325220580,3325220583,BZ
3325220584,3325220587,US
@@ -116476,7 +119663,9 @@
3325220896,3325220927,FR
3325220928,3325220959,CA
3325220960,3325220967,EC
-3325220968,3325221043,CA
+3325220968,3325220975,CA
+3325220976,3325220983,MX
+3325220984,3325221043,CA
3325221044,3325221047,CL
3325221048,3325221055,CA
3325221056,3325221119,BR
@@ -116487,28 +119676,34 @@
3325221264,3325221279,TW
3325221280,3325221295,CA
3325221296,3325221299,US
-3325221300,3325221439,CA
+3325221300,3325221307,CA
+3325221308,3325221311,VE
+3325221312,3325221439,CA
3325221440,3325221443,PE
3325221444,3325221451,CA
3325221452,3325221455,US
3325221456,3325221467,CA
3325221468,3325221471,FR
3325221472,3325221567,CA
-3325221568,3325221599,US
+3325221568,3325221575,MX
+3325221576,3325221583,CA
+3325221584,3325221599,US
3325221600,3325221615,CA
3325221616,3325221623,GB
3325221624,3325221727,CA
3325221728,3325221731,US
-3325221732,3325221751,CA
+3325221732,3325221739,CA
+3325221740,3325221743,BR
+3325221744,3325221751,CA
3325221752,3325221755,IN
3325221756,3325221779,CA
3325221780,3325221783,US
3325221784,3325221787,BR
-3325221788,3325221795,CA
-3325221796,3325221807,US
-3325221808,3325221819,CA
-3325221820,3325221823,US
-3325221824,3325221831,CA
+3325221788,3325221791,VN
+3325221792,3325221795,CA
+3325221796,3325221799,US
+3325221800,3325221807,BR
+3325221808,3325221831,CA
3325221832,3325221839,BG
3325221840,3325221851,CA
3325221852,3325221855,BZ
@@ -116531,8 +119726,10 @@
3325222392,3325222395,BR
3325222396,3325222399,FR
3325222400,3325222463,US
-3325222464,3325222535,CA
-3325222536,3325222559,US
+3325222464,3325222479,CA
+3325222480,3325222483,US
+3325222484,3325222543,CA
+3325222544,3325222559,ID
3325222560,3325222567,CA
3325222568,3325222571,US
3325222572,3325222575,LK
@@ -116547,7 +119744,8 @@
3325222668,3325222671,MX
3325222672,3325222687,CA
3325222688,3325222703,GB
-3325222704,3325222735,CA
+3325222704,3325222719,CA
+3325222720,3325222735,AU
3325222736,3325222751,US
3325222752,3325222783,MX
3325222784,3325222843,CA
@@ -116555,7 +119753,7 @@
3325222848,3325222851,CA
3325222852,3325222855,BZ
3325222856,3325222947,CA
-3325222948,3325222951,US
+3325222948,3325222951,AE
3325222952,3325222963,CA
3325222964,3325222967,VE
3325222968,3325222983,CA
@@ -116582,20 +119780,23 @@
3325223304,3325223311,RO
3325223312,3325223335,CA
3325223336,3325223343,US
-3325223344,3325223375,CA
+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,3325223463,CA
-3325223464,3325223471,PL
+3325223464,3325223471,US
3325223472,3325223535,CA
3325223536,3325223551,AT
3325223552,3325223583,IE
3325223584,3325223619,CA
-3325223620,3325223623,BR
-3325223624,3325223643,CA
+3325223620,3325223631,BR
+3325223632,3325223643,CA
3325223644,3325223647,CZ
3325223648,3325223663,DE
3325223664,3325223723,CA
@@ -116609,13 +119810,11 @@
3325223856,3325223871,AU
3325223872,3325223907,CA
3325223908,3325223911,VE
-3325223912,3325223915,US
-3325223916,3325223919,CA
+3325223912,3325223919,CA
3325223920,3325223935,BR
3325223936,3325223967,CA
3325223968,3325223991,US
-3325223992,3325223995,FR
-3325223996,3325224031,CA
+3325223992,3325224031,CA
3325224032,3325224039,US
3325224040,3325224043,CO
3325224044,3325224047,CA
@@ -116636,7 +119835,9 @@
3325224392,3325224399,CA
3325224400,3325224415,AU
3325224416,3325224419,US
-3325224420,3325224551,CA
+3325224420,3325224479,CA
+3325224480,3325224511,US
+3325224512,3325224551,CA
3325224552,3325224559,BR
3325224560,3325224647,CA
3325224648,3325224651,IN
@@ -116652,9 +119853,9 @@
3325224736,3325224751,LK
3325224752,3325224767,CA
3325224768,3325224783,FR
-3325224784,3325224787,CA
-3325224788,3325224791,FR
-3325224792,3325224807,CA
+3325224784,3325224795,CA
+3325224796,3325224799,HR
+3325224800,3325224807,CA
3325224808,3325224815,GB
3325224816,3325224823,FR
3325224824,3325224831,CA
@@ -116685,8 +119886,7 @@
3325225316,3325225319,ES
3325225320,3325225367,CA
3325225368,3325225371,US
-3325225372,3325225375,IN
-3325225376,3325225407,CA
+3325225372,3325225407,CA
3325225408,3325225411,IN
3325225412,3325225415,CA
3325225416,3325225419,AU
@@ -116708,14 +119908,14 @@
3325225736,3325225743,US
3325225744,3325225775,CA
3325225776,3325225783,US
-3325225784,3325225787,TR
-3325225788,3325225799,CA
+3325225784,3325225799,CA
3325225800,3325225807,IN
3325225808,3325225819,CA
3325225820,3325225823,US
3325225824,3325225899,CA
3325225900,3325225911,CY
-3325225912,3325225919,CA
+3325225912,3325225915,CA
+3325225916,3325225919,BR
3325225920,3325225923,EG
3325225924,3325225943,CA
3325225944,3325225951,PL
@@ -116728,7 +119928,11 @@
3325226072,3325226075,BR
3325226076,3325226087,CA
3325226088,3325226091,EC
-3325226092,3325226179,CA
+3325226092,3325226095,CA
+3325226096,3325226099,PL
+3325226100,3325226159,CA
+3325226160,3325226167,FR
+3325226168,3325226179,CA
3325226180,3325226183,BR
3325226184,3325226187,US
3325226188,3325226239,CA
@@ -116737,13 +119941,19 @@
3325226288,3325226303,GB
3325226304,3325226307,CA
3325226308,3325226311,FR
-3325226312,3325226343,CA
+3325226312,3325226315,DE
+3325226316,3325226343,CA
3325226344,3325226347,IN
-3325226348,3325226495,CA
+3325226348,3325226439,CA
+3325226440,3325226443,VN
+3325226444,3325226495,CA
3325226496,3325227007,US
3325227008,3325227039,CA
3325227040,3325227071,BR
-3325227072,3325227107,CA
+3325227072,3325227087,US
+3325227088,3325227099,CA
+3325227100,3325227103,US
+3325227104,3325227107,CA
3325227108,3325227111,AR
3325227112,3325227119,US
3325227120,3325227223,CA
@@ -116800,9 +120010,7 @@
3325228616,3325228623,US
3325228624,3325228675,CA
3325228676,3325228683,US
-3325228684,3325228695,CA
-3325228696,3325228703,FR
-3325228704,3325228735,CA
+3325228684,3325228735,CA
3325228736,3325228739,FR
3325228740,3325228783,CA
3325228784,3325228787,US
@@ -116810,9 +120018,8 @@
3325228808,3325228815,PL
3325228816,3325228823,CA
3325228824,3325228831,BR
-3325228832,3325228871,CA
-3325228872,3325228875,US
-3325228876,3325228931,CA
+3325228832,3325228863,US
+3325228864,3325228931,CA
3325228932,3325228935,LU
3325228936,3325228991,CA
3325228992,3325229007,BR
@@ -116820,8 +120027,7 @@
3325229072,3325229079,IN
3325229080,3325229083,CA
3325229084,3325229087,US
-3325229088,3325229167,CA
-3325229168,3325229175,PL
+3325229088,3325229175,CA
3325229176,3325229183,IN
3325229184,3325229247,US
3325229248,3325229255,CA
@@ -116833,11 +120039,10 @@
3325229328,3325229331,US
3325229332,3325229351,CA
3325229352,3325229359,BR
-3325229360,3325229363,CA
-3325229364,3325229367,US
-3325229368,3325229411,CA
+3325229360,3325229411,CA
3325229412,3325229415,RU
-3325229416,3325229471,CA
+3325229416,3325229463,CA
+3325229464,3325229471,BR
3325229472,3325229487,US
3325229488,3325229499,CA
3325229500,3325229503,IN
@@ -116867,7 +120072,7 @@
3325229956,3325229959,US
3325229960,3325229975,CA
3325229976,3325229979,IN
-3325229980,3325229983,US
+3325229980,3325229983,BR
3325229984,3325229991,CA
3325229992,3325229999,IN
3325230000,3325230007,CA
@@ -116881,7 +120086,7 @@
3325230096,3325230103,CA
3325230104,3325230111,US
3325230112,3325230119,CA
-3325230120,3325230123,US
+3325230120,3325230123,MA
3325230124,3325230127,CL
3325230128,3325230135,CA
3325230136,3325230143,FR
@@ -116903,10 +120108,12 @@
3325230716,3325230751,US
3325230752,3325230779,CA
3325230780,3325230783,BR
-3325230784,3325230975,CA
-3325230976,3325230991,US
+3325230784,3325230983,CA
+3325230984,3325230991,US
3325230992,3325231007,FR
-3325231008,3325231095,CA
+3325231008,3325231071,CA
+3325231072,3325231079,US
+3325231080,3325231095,CA
3325231096,3325231099,US
3325231100,3325231103,BR
3325231104,3325232127,US
@@ -116937,7 +120144,8 @@
3325290240,3325290495,CA
3325290496,3325296383,US
3325296384,3325296639,CA
-3325296640,3325304831,US
+3325296640,3325304063,US
+3325304064,3325304831,AS
3325304832,3325305087,CA
3325305088,3325307903,US
3325307904,3325308927,GB
@@ -117658,9 +120866,13 @@
3333783552,3333801727,US
3333801728,3333801983,CA
3333801984,3333825791,US
-3333826048,3333859839,US
+3333826048,3333829631,US
+3333829632,3333830143,IN
+3333830144,3333859839,US
3333859840,3333860095,BM
-3333860096,3333939455,US
+3333860096,3333871103,US
+3333871104,3333871359,CA
+3333871360,3333939455,US
3333939456,3333939711,CA
3333939712,3333988607,US
3333988608,3333988863,BR
@@ -117716,7 +120928,9 @@
3335005648,3335005663,US
3335005664,3335005759,CN
3335005760,3335005823,US
-3335005824,3335008127,CN
+3335005824,3335008071,CN
+3335008072,3335008079,US
+3335008080,3335008127,CN
3335008128,3335008255,US
3335008256,3335009175,CN
3335009176,3335009183,US
@@ -117888,9 +121102,7 @@
3337895616,3337895679,US
3337895680,3337895935,CN
3337895936,3337900031,PR
-3337900032,3337948671,US
-3337948672,3337949183,CA
-3337949184,3337957375,US
+3337900032,3337957375,US
3337957376,3337959423,CA
3337959424,3337960447,US
3337960448,3337961471,CA
@@ -117910,7 +121122,9 @@
3337961664,3337961671,CA
3337961672,3337962623,US
3337962624,3337962751,CA
-3337962752,3337963639,US
+3337962752,3337962799,US
+3337962800,3337962807,GB
+3337962808,3337963639,US
3337963640,3337963647,CA
3337963648,3337963775,US
3337963776,3337963783,AZ
@@ -118102,7 +121316,9 @@
3338912768,3338913023,EC
3338913024,3338916351,US
3338916352,3338916479,CN
-3338916480,3338964991,US
+3338916480,3338921219,US
+3338921220,3338921220,PT
+3338921221,3338964991,US
3338964992,3338965247,CA
3338965248,3338976767,US
3338976768,3338977023,CA
@@ -118168,15 +121384,11 @@
3339264000,3339270399,US
3339270400,3339270655,CA
3339271168,3339327999,US
-3339328512,3339328783,CA
-3339328784,3339328791,US
-3339328792,3339328831,CA
+3339328512,3339328831,CA
3339328832,3339328895,US
3339328896,3339328943,CA
3339328944,3339328959,AE
-3339328960,3339329023,CA
-3339329024,3339329151,GB
-3339329152,3339329279,CA
+3339328960,3339329279,CA
3339329280,3339329407,US
3339329408,3339329439,CA
3339329440,3339329455,GB
@@ -118352,8 +121564,7 @@
3340085248,3340086271,US
3340087296,3340088319,US
3340088320,3340089343,CA
-3340089344,3340090367,US
-3340091392,3340097535,US
+3340089344,3340097535,US
3340097536,3340098559,CA
3340098560,3340107775,US
3340107776,3340369919,CA
@@ -118375,7 +121586,9 @@
3340429824,3340430079,PA
3340430080,3340453375,US
3340453376,3340453887,BM
-3340453888,3340460031,US
+3340453888,3340454911,US
+3340454912,3340455167,DE
+3340455168,3340460031,US
3340460032,3340462079,PR
3340462080,3340481535,US
3340481536,3340482559,CA
@@ -118566,14 +121779,14 @@
3341533952,3341534207,CA
3341534720,3341535007,US
3341535008,3341535015,ID
-3341535016,3341535031,US
+3341535016,3341535023,GH
+3341535024,3341535031,PA
3341535032,3341535039,VN
3341535040,3341535047,MA
-3341535048,3341535087,US
-3341535088,3341535095,BD
-3341535096,3341535151,US
-3341535152,3341535171,CN
-3341535172,3341535183,US
+3341535048,3341535055,GH
+3341535056,3341535151,US
+3341535152,3341535167,CN
+3341535168,3341535183,US
3341535184,3341535187,ID
3341535188,3341535195,US
3341535196,3341535199,SA
@@ -118639,7 +121852,8 @@
3341837312,3341837743,CA
3341837744,3341837747,US
3341837748,3341838335,CA
-3341838336,3341854551,US
+3341838336,3341838591,GB
+3341838592,3341854551,US
3341854552,3341854559,SG
3341854560,3341863935,US
3341863936,3341864447,AG
@@ -118728,8 +121942,10 @@
3342795264,3342831103,US
3342831104,3342831359,IN
3342831360,3342878967,US
-3342878976,3342879551,US
-3342879568,3342979587,US
+3342878976,3342879231,US
+3342879488,3342879551,NL
+3342879568,3342879743,NL
+3342879744,3342979587,US
3342979592,3343013887,US
3343013888,3343015695,CA
3343015696,3343015727,US
@@ -118862,9 +122078,9 @@
3343653632,3343653695,CA
3343653696,3343656511,US
3343656512,3343656575,VI
-3343656576,3343747583,US
-3343747584,3343748095,VE
-3343748096,3343858687,US
+3343656576,3343656703,US
+3343656704,3343656959,VI
+3343656960,3343858687,US
3343858688,3343859199,VG
3343859200,3343922975,US
3343922976,3343923007,PA
@@ -118926,9 +122142,19 @@
3344381224,3344381255,US
3344381256,3344381263,CA
3344381264,3344381271,MX
-3344381272,3344406527,US
+3344381272,3344381887,US
+3344381888,3344381893,ES
+3344381894,3344406527,US
3344406528,3344408575,CA
-3344408576,3344415679,US
+3344408576,3344411135,US
+3344411136,3344411151,BM
+3344411152,3344411295,US
+3344411296,3344411327,BM
+3344411328,3344411519,US
+3344411520,3344411535,BM
+3344411536,3344411631,US
+3344411632,3344411647,BM
+3344411648,3344415679,US
3344415680,3344415743,AR
3344415744,3344429055,US
3344429056,3344429343,CA
@@ -118992,9 +122218,7 @@
3344964608,3344965631,CA
3344965632,3344973823,US
3344973824,3344974847,BM
-3344974848,3344978207,US
-3344978208,3344978215,BD
-3344978216,3344979967,US
+3344974848,3344979967,US
3344979968,3344982015,CA
3344982016,3345007615,US
3345007616,3345008639,CA
@@ -119014,48 +122238,46 @@
3345318944,3345318975,CY
3345318976,3345321471,US
3345321472,3345321983,GB
-3345321984,3345322495,US
-3345322496,3345322503,BR
-3345322504,3345327103,US
+3345321984,3345327103,US
3345327104,3345328127,CA
3345328128,3345332287,US
-3345332288,3345332295,BR
+3345332288,3345332295,GH
3345332296,3345332303,PK
3345332304,3345332311,US
-3345332312,3345332319,BR
+3345332312,3345332319,LK
3345332320,3345332327,PT
3345332328,3345332339,US
-3345332340,3345332343,BR
+3345332340,3345332343,GH
3345332344,3345332347,VN
3345332348,3345332351,CY
3345332352,3345332375,US
3345332376,3345332383,CA
-3345332384,3345332399,US
-3345332400,3345332403,BR
-3345332404,3345332411,ID
+3345332384,3345332403,US
+3345332404,3345332407,GH
+3345332408,3345332411,ID
3345332412,3345332423,US
3345332424,3345332431,MY
3345332432,3345332435,VN
3345332436,3345332439,GB
-3345332440,3345332455,US
-3345332456,3345332459,MY
+3345332440,3345332451,US
+3345332452,3345332455,IN
+3345332456,3345332459,GH
3345332460,3345332463,US
-3345332464,3345332471,BR
-3345332472,3345332475,US
-3345332476,3345332479,CN
-3345332480,3345332487,US
+3345332464,3345332471,VN
+3345332472,3345332487,US
3345332488,3345332495,AU
3345332496,3345332503,CA
-3345332504,3345332511,US
-3345332512,3345332519,ID
+3345332504,3345332515,BR
+3345332516,3345332519,GH
3345332520,3345332583,US
3345332584,3345332587,CY
-3345332588,3345332591,ID
+3345332588,3345332591,BR
3345332592,3345332595,US
3345332596,3345332599,BD
3345332600,3345332603,US
3345332604,3345332607,ID
-3345332608,3345332655,US
+3345332608,3345332647,US
+3345332648,3345332655,ID
3345332656,3345332659,CY
3345332660,3345332667,US
3345332668,3345332671,ID
@@ -119069,7 +122291,8 @@
3345332864,3345333055,VN
3345333056,3345333183,US
3345333184,3345333215,IN
-3345333216,3345333223,US
+3345333216,3345333219,CN
+3345333220,3345333223,GH
3345333224,3345333227,MX
3345333228,3345333231,CY
3345333232,3345333247,US
@@ -119155,7 +122378,8 @@
3345409950,3345410032,US
3345410033,3345410036,GB
3345410037,3345412095,US
-3345414144,3345418239,US
+3345412096,3345413119,CA
+3345413120,3345418239,US
3345418240,3345419519,NL
3345419520,3345422847,US
3345423360,3345424383,TC
@@ -119192,9 +122416,7 @@
3345447680,3345448447,FR
3345448448,3345448703,BE
3345448704,3345448959,DE
-3345448960,3345666567,US
-3345666568,3345666591,IN
-3345666592,3345666623,US
+3345448960,3345666623,US
3345666624,3345666639,NO
3345666640,3345667103,US
3345667104,3345667119,IN
@@ -119321,10 +122543,8 @@
3346793472,3346793983,US
3346794496,3346923519,US
3346923520,3346989055,CA
-3346989056,3347014143,US
-3347014144,3347014255,CA
-3347014256,3347014271,CY
-3347014272,3347014399,CA
+3346989056,3347013631,US
+3347013632,3347014399,CA
3347014400,3347014655,US
3347014656,3347015167,CA
3347015168,3347015295,QA
@@ -119402,9 +122622,9 @@
3349648166,3349648168,NG
3349648169,3349649407,US
3349649408,3349653503,CA
-3349653504,3349702623,US
-3349702624,3349702655,LK
-3349702656,3349723199,US
+3349653504,3349723175,US
+3349723176,3349723183,LK
+3349723184,3349723199,US
3349723200,3349723215,PK
3349723216,3349723260,US
3349723261,3349723265,CA
@@ -119560,7 +122780,7 @@
3350836268,3350836275,IN
3350836276,3350836279,ZA
3350836280,3350836283,CA
-3350836284,3350836991,US
+3350836736,3350836991,US
3350836992,3350837247,CA
3350837248,3350837759,US
3350837760,3350843391,CA
@@ -119648,9 +122868,7 @@
3351058944,3351059455,CA
3351059456,3351071743,US
3351071744,3351072767,CA
-3351072768,3351074260,US
-3351074261,3351074261,BR
-3351074262,3351074271,US
+3351072768,3351074271,US
3351074272,3351074272,GT
3351074273,3351074283,US
3351074284,3351074284,BR
@@ -119665,25 +122883,25 @@
3351074376,3351074377,DE
3351074378,3351074379,US
3351074380,3351074380,DE
-3351074381,3351074384,US
-3351074385,3351074385,CL
-3351074386,3351074386,US
+3351074381,3351074381,US
+3351074382,3351074382,KW
+3351074383,3351074386,US
3351074387,3351074387,BR
3351074388,3351074388,DE
3351074389,3351074389,US
3351074390,3351074390,DE
3351074391,3351074391,BR
3351074392,3351074392,CL
-3351074393,3351074393,US
-3351074394,3351074395,UA
+3351074393,3351074394,US
+3351074395,3351074395,TR
3351074396,3351074396,BR
-3351074397,3351074397,UA
-3351074398,3351074402,US
+3351074397,3351074402,US
3351074403,3351074403,BR
3351074404,3351074404,CL
3351074405,3351074405,US
3351074406,3351074406,CA
-3351074407,3351074409,BR
+3351074407,3351074407,US
+3351074408,3351074409,BR
3351074410,3351074410,DE
3351074411,3351074411,US
3351074412,3351074413,PA
@@ -119693,20 +122911,19 @@
3351074419,3351074419,IN
3351074420,3351074422,US
3351074423,3351074423,UA
-3351074424,3351074426,US
+3351074424,3351074424,GB
+3351074425,3351074426,US
3351074427,3351074427,DE
3351074428,3351074429,US
3351074430,3351074430,BR
-3351074431,3351074439,US
+3351074431,3351074434,US
+3351074435,3351074435,BR
+3351074436,3351074439,US
3351074440,3351074440,CA
3351074441,3351074444,US
3351074445,3351074445,CA
3351074446,3351074446,CL
-3351074447,3351074451,US
-3351074452,3351074452,IN
-3351074453,3351074453,US
-3351074454,3351074457,IN
-3351074458,3351074463,US
+3351074447,3351074463,US
3351074464,3351074466,BR
3351074467,3351074472,US
3351074473,3351074473,BR
@@ -119728,9 +122945,7 @@
3351074558,3351074558,CA
3351074559,3351074690,US
3351074691,3351074691,BR
-3351074692,3351074708,US
-3351074709,3351074709,CA
-3351074710,3351074711,US
+3351074692,3351074711,US
3351074712,3351074712,TR
3351074713,3351074728,US
3351074729,3351074729,EG
@@ -119766,19 +122981,17 @@
3351196672,3351197695,US
3351197696,3351197711,PT
3351197712,3351197715,EG
-3351197716,3351197719,CN
+3351197716,3351197719,GH
3351197720,3351197735,US
3351197736,3351197739,CY
-3351197740,3351197743,BR
+3351197740,3351197743,PK
3351197744,3351197751,VN
3351197752,3351197759,PT
3351197760,3351197775,US
3351197776,3351197783,BR
-3351197784,3351197787,US
-3351197788,3351197791,GT
+3351197784,3351197791,US
3351197792,3351197795,IN
-3351197796,3351197799,BR
-3351197800,3351197803,SI
+3351197796,3351197803,BR
3351197804,3351197807,AE
3351197808,3351197827,US
3351197828,3351197831,VN
@@ -119788,9 +123001,10 @@
3351197844,3351197847,CN
3351197848,3351197859,US
3351197860,3351197863,CY
-3351197864,3351197867,VN
+3351197864,3351197867,US
3351197868,3351197871,CY
-3351197872,3351197887,US
+3351197872,3351197879,US
+3351197880,3351197887,GH
3351197888,3351197891,MX
3351197892,3351197895,VN
3351197896,3351197899,BR
@@ -119798,12 +123012,16 @@
3351197904,3351197911,VN
3351197912,3351197983,US
3351197984,3351198015,MX
-3351198016,3351198031,US
+3351198016,3351198023,US
+3351198024,3351198031,GH
3351198032,3351198039,MD
3351198040,3351198047,AE
-3351198048,3351198071,US
+3351198048,3351198059,US
+3351198060,3351198063,GH
+3351198064,3351198071,BR
3351198072,3351198079,VN
-3351198080,3351198095,US
+3351198080,3351198091,US
+3351198092,3351198095,GT
3351198096,3351198103,MX
3351198104,3351198111,VN
3351198112,3351198131,US
@@ -119812,18 +123030,18 @@
3351198152,3351198155,GB
3351198156,3351198159,EG
3351198160,3351198171,US
-3351198172,3351198175,AU
+3351198172,3351198175,GH
3351198176,3351198179,BD
-3351198180,3351198187,US
-3351198188,3351198191,GH
-3351198192,3351198195,CN
-3351198196,3351198207,US
+3351198180,3351198183,US
+3351198184,3351198191,GH
+3351198192,3351198207,US
3351198208,3351198215,VN
3351198216,3351198223,AE
3351198224,3351198231,US
3351198232,3351198235,CA
3351198236,3351198239,US
-3351198240,3351198251,ID
+3351198240,3351198247,VN
+3351198248,3351198251,ID
3351198252,3351198255,GH
3351198256,3351198259,VN
3351198260,3351198263,DE
@@ -119831,20 +123049,21 @@
3351198272,3351198279,ID
3351198280,3351198335,US
3351198336,3351198351,CA
-3351198352,3351198359,US
+3351198352,3351198355,GT
+3351198356,3351198359,US
3351198360,3351198363,GB
3351198364,3351198371,US
3351198372,3351198383,CA
-3351198384,3351198387,MX
+3351198384,3351198387,GH
3351198388,3351198391,US
3351198392,3351198399,TR
3351198400,3351198403,US
3351198404,3351198407,IN
3351198408,3351198411,BR
3351198412,3351198415,GB
-3351198416,3351198423,CL
+3351198416,3351198423,GT
3351198424,3351198427,RO
-3351198428,3351198431,US
+3351198428,3351198431,BR
3351198432,3351198439,IN
3351198440,3351198447,US
3351198448,3351198463,JO
@@ -119852,16 +123071,18 @@
3351198476,3351198479,CY
3351198480,3351198487,BR
3351198488,3351198495,US
-3351198496,3351198503,VN
-3351198504,3351198507,US
+3351198496,3351198499,PK
+3351198500,3351198507,US
3351198508,3351198511,CY
3351198512,3351198515,US
-3351198516,3351198519,ID
+3351198516,3351198519,BR
3351198520,3351198527,IN
3351198528,3351198535,RU
3351198536,3351198539,CY
-3351198540,3351198559,US
-3351198560,3351198567,LK
+3351198540,3351198551,US
+3351198552,3351198559,VN
+3351198560,3351198563,BR
+3351198564,3351198567,CN
3351198568,3351198575,US
3351198576,3351198579,CY
3351198580,3351198607,US
@@ -119963,7 +123184,9 @@
3351357440,3351359487,CA
3351359488,3351372799,US
3351372800,3351373823,BM
-3351373824,3351380223,US
+3351373824,3351375871,US
+3351375872,3351376895,PR
+3351376896,3351380223,US
3351380224,3351380479,CA
3351380480,3351380991,US
3351380992,3351381759,CA
@@ -120098,14 +123321,13 @@
3351696384,3351696639,CA
3351696640,3351697407,US
3351697408,3351698431,CA
-3351698432,3351699303,US
-3351699304,3351699305,CA
-3351699306,3351699306,US
-3351699307,3351699311,CA
-3351699312,3351706367,US
+3351698432,3351698943,US
+3351698944,3351699455,CA
+3351699456,3351706367,US
3351706368,3351706623,CA
3351706624,3351850239,US
-3351850496,3351855871,US
+3351850496,3351855615,US
+3351855616,3351855871,GB
3351856128,3351860223,US
3351860224,3351861247,KY
3351861248,3351869439,US
@@ -120176,9 +123398,15 @@
3352916535,3352916541,BR
3352916542,3352916542,US
3352916543,3352916557,BR
-3352916558,3352916566,US
+3352916558,3352916561,US
+3352916562,3352916562,GB
+3352916563,3352916564,BR
+3352916565,3352916566,US
3352916567,3352916584,BR
-3352916585,3352916607,US
+3352916585,3352916586,US
+3352916587,3352916592,BR
+3352916593,3352916593,AE
+3352916594,3352916607,US
3352916608,3352916615,BR
3352916616,3352916619,US
3352916620,3352916635,BR
@@ -120188,7 +123416,9 @@
3352916640,3352916640,BR
3352916641,3352916648,US
3352916649,3352916689,BR
-3352916690,3352918015,US
+3352916690,3352916690,US
+3352916691,3352916694,BR
+3352916695,3352918015,US
3352918016,3352919039,CA
3352919040,3353335303,US
3353335304,3353335309,NL
@@ -120203,8 +123433,8 @@
3353335334,3353335335,US
3353335336,3353335339,NL
3353335340,3353335341,US
-3353335342,3353335349,NL
-3353335350,3353335353,US
+3353335342,3353335347,NL
+3353335348,3353335353,US
3353335354,3353335359,NL
3353335360,3353335361,US
3353335362,3353335363,NL
@@ -120219,8 +123449,8 @@
3353335391,3353335392,US
3353335393,3353335394,NL
3353335395,3353335396,US
-3353335397,3353335406,NL
-3353335407,3353335407,US
+3353335397,3353335404,NL
+3353335405,3353335407,US
3353335408,3353335411,NL
3353335412,3353335414,US
3353335415,3353335420,NL
@@ -120405,24 +123635,26 @@
3354507296,3354507299,VN
3354507300,3354507303,US
3354507304,3354507307,IN
-3354507308,3354507311,MA
-3354507312,3354507315,BR
-3354507316,3354507327,US
-3354507328,3354507335,MD
+3354507308,3354507315,BR
+3354507316,3354507319,US
+3354507320,3354507323,PK
+3354507324,3354507327,US
+3354507328,3354507335,RU
3354507336,3354507343,US
-3354507344,3354507347,IN
-3354507348,3354507351,BR
+3354507344,3354507347,BR
+3354507348,3354507351,CN
3354507352,3354507359,AU
3354507360,3354507363,EG
3354507364,3354507367,CY
3354507368,3354507375,CA
3354507376,3354507383,ID
-3354507384,3354507387,BR
-3354507388,3354507391,CN
+3354507384,3354507387,CN
+3354507388,3354507391,BR
3354507392,3354507399,CA
3354507400,3354507403,EG
3354507404,3354507407,CN
-3354507408,3354507439,US
+3354507408,3354507431,US
+3354507432,3354507439,MY
3354507440,3354507443,CY
3354507444,3354507447,JO
3354507448,3354507459,US
@@ -120432,30 +123664,32 @@
3354507472,3354507475,MY
3354507476,3354507479,CY
3354507480,3354507483,BR
-3354507484,3354507507,US
-3354507508,3354507511,PK
+3354507484,3354507511,US
3354507512,3354507519,MA
3354507520,3354507535,US
-3354507536,3354507539,CN
+3354507536,3354507539,ID
3354507540,3354507543,HU
3354507544,3354507551,US
-3354507552,3354507567,CN
+3354507552,3354507559,NI
+3354507560,3354507567,CN
3354507568,3354507575,VN
3354507576,3354507583,AE
3354507584,3354507591,US
3354507592,3354507599,CY
3354507600,3354507607,US
3354507608,3354507611,CN
-3354507612,3354507615,US
+3354507612,3354507615,BR
3354507616,3354507623,IN
-3354507624,3354507631,EG
+3354507624,3354507631,CN
3354507632,3354507639,US
-3354507640,3354507647,MD
-3354507648,3354507655,US
-3354507656,3354507659,ID
+3354507640,3354507643,CN
+3354507644,3354507647,ID
+3354507648,3354507655,CN
+3354507656,3354507659,CA
3354507660,3354507667,CY
3354507668,3354507671,BR
-3354507672,3354507683,IN
+3354507672,3354507679,US
+3354507680,3354507683,GH
3354507684,3354507687,PT
3354507688,3354507691,CA
3354507692,3354507703,US
@@ -120472,7 +123706,8 @@
3354507760,3354507767,LK
3354507768,3354507775,US
3354507776,3354507779,CY
-3354507780,3354507787,US
+3354507780,3354507783,US
+3354507784,3354507787,BR
3354507788,3354507791,CY
3354507792,3354507803,US
3354507804,3354507807,CY
@@ -120494,7 +123729,7 @@
3354507928,3354507931,US
3354507932,3354507943,CY
3354507944,3354507959,US
-3354507960,3354507967,AE
+3354507960,3354507967,GH
3354507968,3354507983,MX
3354507984,3354507991,AE
3354507992,3354507999,PK
@@ -120504,7 +123739,7 @@
3354508036,3354508039,BR
3354508040,3354508043,US
3354508044,3354508047,DK
-3354508048,3354508051,US
+3354508048,3354508051,BR
3354508052,3354508055,VN
3354508056,3354508059,AU
3354508060,3354508063,BR
@@ -120525,7 +123760,8 @@
3354508140,3354508143,CY
3354508144,3354508147,MY
3354508148,3354508151,BB
-3354508152,3354508163,US
+3354508152,3354508159,US
+3354508160,3354508163,GH
3354508164,3354508167,CY
3354508168,3354508187,US
3354508188,3354508191,VN
@@ -120543,7 +123779,9 @@
3354508248,3354508251,VN
3354508252,3354508255,US
3354508256,3354508259,EG
-3354508260,3354508271,US
+3354508260,3354508263,US
+3354508264,3354508267,TH
+3354508268,3354508271,US
3354508272,3354508275,TW
3354508276,3354508287,US
3354508288,3354508303,CY
@@ -120558,8 +123796,7 @@
3354508360,3354508367,AU
3354508368,3354508375,BD
3354508376,3354508383,MA
-3354508384,3354508391,US
-3354508392,3354508395,BR
+3354508384,3354508395,US
3354508396,3354508399,VN
3354508400,3354508423,US
3354508424,3354508431,MD
@@ -120569,8 +123806,7 @@
3354508456,3354508487,US
3354508488,3354508491,VN
3354508492,3354508495,CY
-3354508496,3354508515,US
-3354508516,3354508519,VN
+3354508496,3354508519,US
3354508520,3354508527,IN
3354508528,3354508535,AE
3354508536,3354508543,BD
@@ -120578,7 +123814,8 @@
3354508560,3354508571,US
3354508572,3354508575,CN
3354508576,3354508579,BR
-3354508580,3354508603,US
+3354508580,3354508583,AE
+3354508584,3354508603,US
3354508604,3354508607,CY
3354508608,3354508623,US
3354508624,3354508639,MX
@@ -120619,9 +123856,9 @@
3354509256,3354509263,US
3354509264,3354509279,BR
3354509280,3354509283,AU
-3354509284,3354509287,ID
+3354509284,3354509287,GH
3354509288,3354509291,CY
-3354509292,3354509295,US
+3354509292,3354509295,IN
3354509296,3354509299,CA
3354509300,3354509391,US
3354509392,3354509399,CN
@@ -120668,7 +123905,9 @@
3354737152,3354770687,US
3354770688,3354770943,CA
3354770944,3354788095,US
-3354788096,3354806383,CA
+3354788096,3354789887,CA
+3354789888,3354790399,US
+3354790400,3354806383,CA
3354806384,3354806399,US
3354806400,3354806639,CA
3354806640,3354806655,SE
@@ -120689,8 +123928,8 @@
3355012608,3355017215,CA
3355017216,3355052287,US
3355052288,3355052543,AU
-3355052544,3355053311,CA
-3355053312,3355249151,US
+3355052544,3355053055,CA
+3355053056,3355249151,US
3355249152,3355249663,CA
3355249664,3355260927,US
3355260928,3355262719,CA
@@ -120747,7 +123986,7 @@
3355418112,3355418367,US
3355418368,3355418371,BR
3355418372,3355418375,US
-3355418376,3355418379,VN
+3355418376,3355418379,GH
3355418380,3355418383,BR
3355418384,3355418395,US
3355418396,3355418399,GT
@@ -120780,28 +124019,23 @@
3355449344,3355450367,CU
3355450368,3355451391,EC
3355451392,3355458559,BR
-3355458560,3355458591,HN
-3355458592,3355458599,US
-3355458600,3355459071,HN
+3355458560,3355459071,HN
3355459072,3355459327,BR
3355459328,3355459583,EC
-3355459584,3355459839,PA
3355459840,3355460095,VE
3355460096,3355460351,CL
3355460352,3355460607,BR
-3355460608,3355460863,UY
-3355460864,3355461887,BR
+3355460608,3355461119,UY
+3355461120,3355461887,BR
3355461888,3355463423,EC
3355463424,3355463935,AR
3355463936,3355464191,BR
3355464192,3355464447,CL
3355464448,3355464959,MX
-3355464960,3355465727,BR
-3355465728,3355465983,UY
+3355464960,3355465215,BR
+3355465216,3355465983,UY
3355465984,3355466239,BR
-3355466240,3355466751,MX
-3355466752,3355467007,BR
-3355467008,3355467263,MX
+3355466240,3355467263,MX
3355467264,3355467519,US
3355467520,3355467775,MX
3355467776,3355468799,AR
@@ -120836,7 +124070,6 @@
3355491072,3355491327,CO
3355491328,3355494655,AR
3355494656,3355494911,CO
-3355494912,3355495423,PA
3355495424,3355496447,UY
3355496448,3355498495,AR
3355498496,3355500543,US
@@ -120855,7 +124088,7 @@
3355539200,3355539455,VE
3355539456,3355540479,CL
3355540480,3355540735,CO
-3355540736,3355540991,BZ
+3355540736,3355540991,BR
3355540992,3355541503,CO
3355541504,3355545599,CL
3355545600,3355547647,VE
@@ -120892,12 +124125,13 @@
3355615232,3355623423,SR
3355623424,3355639807,CL
3355639808,3355642367,VE
-3355642368,3355642879,PA
3355642880,3355643903,UY
3355643904,3355647999,BR
3355648000,3355668991,AR
3355668992,3355669247,PE
-3355669248,3355672575,AR
+3355669248,3355669503,AR
+3355669504,3355670527,VE
+3355670528,3355672575,AR
3355672576,3355677183,CO
3355677184,3355677439,GT
3355677440,3355682815,CO
@@ -120907,7 +124141,7 @@
3355688960,3355689471,CO
3355689472,3355689727,HN
3355689728,3355689983,AR
-3355689984,3355693055,PA
+3355691008,3355693055,PA
3355693056,3355695103,CL
3355695104,3355697151,AR
3355697152,3355701503,HN
@@ -120932,8 +124166,7 @@
3355774976,3355779071,VE
3355779072,3355781119,BR
3355781120,3355783167,VE
-3355783168,3355785215,AR
-3355785216,3355787263,CR
+3355783168,3355787263,CR
3355787264,3355803647,AR
3355803648,3355820031,VE
3355820032,3355836415,AR
@@ -120951,13 +124184,12 @@
3355850752,3355852799,CW
3355852800,3355856639,CL
3355856640,3355856895,PA
-3355856896,3355858943,EC
3355860992,3355869183,CL
3355869184,3355870719,BR
3355870720,3355871231,CR
3355871232,3355873279,BR
3355873280,3355875327,BQ
-3355875328,3355877375,MX
+3355875328,3355877375,PA
3355877376,3355885567,CO
3355885568,3355901951,GT
3355901952,3355902975,BR
@@ -120975,7 +124207,8 @@
3355928064,3355928575,CA
3355928576,3355929087,GB
3355929088,3355929599,US
-3355929600,3355930623,PA
+3355929600,3355930367,PA
+3355930368,3355930623,HK
3355930624,3355934719,BR
3355934720,3355939839,AR
3355939840,3355940863,SR
@@ -120989,7 +124222,7 @@
3356033792,3356034047,CL
3356034048,3356035071,PY
3356035072,3356037119,MX
-3356037120,3356041215,CO
+3356037120,3356041215,BR
3356041216,3356049407,CR
3356049408,3356049663,CL
3356049664,3356051455,BR
@@ -121007,11 +124240,11 @@
3356057856,3356059135,CL
3356059136,3356060671,BR
3356060672,3356061695,CL
-3356061696,3356062463,BR
+3356061696,3356062207,BR
+3356062208,3356062463,CL
3356062464,3356062719,JM
3356062720,3356063743,CR
-3356063744,3356063999,HN
-3356064000,3356064255,BR
+3356063744,3356064255,HN
3356064256,3356064511,CL
3356064512,3356065791,BR
3356065792,3356066047,CL
@@ -121026,15 +124259,13 @@
3356073472,3356073983,CO
3356073984,3356075263,BR
3356075264,3356076287,BO
-3356076288,3356077055,BR
-3356077056,3356077567,MX
+3356076288,3356076543,AR
+3356076544,3356077567,MX
3356077568,3356078079,BR
3356078080,3356078335,EC
3356078336,3356079359,CL
3356079360,3356079615,AR
-3356079616,3356080127,MX
-3356080128,3356080383,BR
-3356080384,3356080639,MX
+3356079616,3356080639,MX
3356080640,3356080895,BR
3356080896,3356082431,NI
3356082432,3356082687,CL
@@ -121054,18 +124285,18 @@
3356089088,3356089343,AR
3356089344,3356090623,BR
3356090624,3356090879,CL
-3356090880,3356091135,BR
-3356091136,3356091391,AR
+3356090880,3356091391,AR
3356091392,3356091647,CL
-3356091648,3356091903,BR
-3356091904,3356092927,CL
-3356092928,3356093183,BR
+3356091648,3356091903,AR
+3356091904,3356093183,CL
3356093184,3356093951,AR
3356093952,3356094975,CL
3356094976,3356096255,AR
3356096256,3356096511,CL
3356096512,3356096767,EC
-3356096768,3356097791,BR
+3356096768,3356097023,BR
+3356097024,3356097535,CL
+3356097536,3356097791,BR
3356097792,3356098303,AR
3356098304,3356098559,GT
3356098560,3356099583,CL
@@ -121074,31 +124305,17 @@
3356102400,3356102655,PA
3356102656,3356105727,CL
3356105728,3356106751,SV
-3356106752,3356107263,HN
-3356107264,3356107327,BR
-3356107328,3356107519,HN
-3356107520,3356107551,BR
-3356107552,3356107975,HN
-3356107976,3356107983,IS
-3356107984,3356108063,HN
-3356108064,3356108071,IT
-3356108072,3356109119,HN
-3356109120,3356109135,FR
-3356109136,3356109263,HN
-3356109264,3356109271,DE
-3356109272,3356109495,HN
-3356109496,3356109503,IT
-3356109504,3356109687,HN
-3356109688,3356109695,CA
-3356109696,3356110527,HN
-3356110528,3356110543,US
-3356110544,3356110847,HN
+3356106752,3356110495,HN
+3356110496,3356110503,US
+3356110504,3356110847,HN
3356110848,3356113919,BR
3356113920,3356114943,UY
3356114944,3356123135,PE
3356123136,3356131839,AR
3356131840,3356132351,PE
-3356132352,3356134143,BR
+3356132352,3356133375,BR
+3356133376,3356133887,CO
+3356133888,3356134143,BR
3356134144,3356134655,AR
3356134656,3356134911,PY
3356134912,3356135167,DO
@@ -121108,11 +124325,10 @@
3356135936,3356136191,BR
3356136192,3356137471,EC
3356137472,3356137727,JM
-3356137728,3356137983,BR
+3356137728,3356137983,HN
3356137984,3356138239,CO
3356138240,3356138495,US
-3356138496,3356138751,BR
-3356138752,3356139007,BO
+3356138496,3356139007,BO
3356139008,3356139263,CL
3356139264,3356139519,BR
3356139520,3356139775,US
@@ -121125,7 +124341,8 @@
3356142848,3356143103,GT
3356143104,3356143615,CO
3356143616,3356144127,CR
-3356144128,3356145151,BR
+3356144128,3356144639,BR
+3356144640,3356145151,AR
3356145152,3356145407,CL
3356145408,3356145663,BR
3356145664,3356145919,CL
@@ -121150,7 +124367,8 @@
3356151296,3356151551,BR
3356151552,3356151807,AR
3356151808,3356152063,CL
-3356152064,3356152575,BR
+3356152064,3356152319,EC
+3356152320,3356152575,MX
3356152576,3356152831,CL
3356152832,3356154623,MX
3356154624,3356154879,AR
@@ -121176,16 +124394,12 @@
3356171520,3356171775,AR
3356171776,3356172031,NI
3356172032,3356172287,SV
-3356172288,3356172543,PE
-3356172544,3356172799,AR
-3356172800,3356174335,PE
+3356172288,3356174335,PE
3356174336,3356176383,CO
3356176384,3356180479,PE
3356180480,3356190719,CL
-3356190720,3356192767,DO
3356192768,3356194815,AR
-3356196864,3356213247,KY
-3356213248,3356229631,VE
+3356196864,3356229631,VE
3356229632,3356233727,BR
3356233728,3356237823,CL
3356237824,3356246015,GT
@@ -121198,7 +124412,6 @@
3356265472,3356267007,CL
3356267008,3356267263,PY
3356267264,3356268799,CL
-3356268800,3356269055,PA
3356269056,3356269311,AR
3356269312,3356269823,UY
3356269824,3356270079,BR
@@ -121247,14 +124460,8 @@
3356332032,3356334079,CU
3356334080,3356336127,BO
3356336128,3356336895,SV
-3356336896,3356338175,HN
-3356338176,3356339967,SV
-3356339968,3356341247,HN
-3356341248,3356341503,SV
-3356341504,3356342271,HN
-3356342272,3356343039,SV
-3356343040,3356343551,HN
-3356343552,3356344319,SV
+3356336896,3356337151,HN
+3356337152,3356344319,SV
3356344320,3356360703,CO
3356360704,3356362751,CL
3356362752,3356363519,VE
@@ -121273,7 +124480,6 @@
3356380160,3356380927,CL
3356380928,3356381183,DO
3356381184,3356381439,CL
-3356381440,3356381695,PA
3356381696,3356381951,CL
3356381952,3356382207,EC
3356382208,3356389375,CL
@@ -121282,17 +124488,15 @@
3356390400,3356390655,AR
3356390656,3356391167,CL
3356391168,3356391423,PA
-3356393472,3356413439,CL
-3356413440,3356413951,CO
-3356413952,3356419839,CL
-3356419840,3356419967,CO
-3356419968,3356420863,CL
-3356420864,3356421375,CO
-3356421376,3356421503,CL
-3356421504,3356422143,CO
-3356422144,3356425471,CL
-3356425472,3356425599,CO
-3356425600,3356426239,CL
+3356393472,3356413567,CL
+3356413568,3356413823,CO
+3356413824,3356420287,CL
+3356420288,3356420351,CO
+3356420352,3356420863,CL
+3356420864,3356420991,CO
+3356420992,3356421119,CL
+3356421120,3356421247,CO
+3356421248,3356426239,CL
3356426240,3356427263,BR
3356427264,3356491775,US
3356491776,3356493823,PE
@@ -121301,9 +124505,8 @@
3356499968,3356508159,MX
3356508160,3356508671,AR
3356508672,3356509183,CR
-3356509184,3356509439,VE
-3356509440,3356509503,US
-3356509504,3356510207,VE
+3356509184,3356509695,CO
+3356509696,3356510207,VE
3356510208,3356511999,AR
3356512000,3356512255,CO
3356512256,3356514303,AR
@@ -121370,7 +124573,7 @@
3357190144,3357192191,DO
3357192192,3357194239,PY
3357194240,3357196287,AR
-3357196288,3357212671,CW
+3357196288,3357204479,CW
3357212672,3357368319,CL
3357368320,3357376511,CO
3357376512,3357403135,CL
@@ -121403,160 +124606,40 @@
3357424640,3357425663,CL
3357425664,3357442047,CO
3357442048,3357442303,NI
-3357442304,3357442319,GT
-3357442320,3357442327,HN
-3357442328,3357442335,GT
-3357442336,3357442343,HN
-3357442344,3357442391,GT
-3357442392,3357442395,HN
-3357442396,3357442559,GT
-3357442560,3357442815,NI
-3357442816,3357443071,SV
-3357443072,3357443327,NI
-3357443328,3357443583,GT
-3357443584,3357444351,HN
-3357444352,3357444479,GT
-3357444480,3357444487,HN
-3357444488,3357444607,GT
-3357444608,3357444863,SV
-3357444864,3357448407,GT
-3357448408,3357448415,SV
-3357448416,3357448447,GT
-3357448448,3357448703,SV
-3357448704,3357448959,GT
-3357448960,3357449727,HN
-3357449728,3357450751,GT
-3357450752,3357451007,SV
-3357451008,3357451119,GT
-3357451120,3357451127,HN
-3357451128,3357451143,GT
-3357451144,3357451151,HN
-3357451152,3357451263,GT
-3357451264,3357451519,HN
-3357451520,3357451775,NI
-3357451776,3357452287,GT
-3357452288,3357452799,HN
-3357452800,3357453055,NI
-3357453056,3357453071,GT
-3357453072,3357453079,SV
-3357453080,3357453135,GT
-3357453136,3357453151,SV
-3357453152,3357453311,GT
+3357442304,3357449471,GT
+3357449472,3357449727,HN
+3357449728,3357453311,GT
3357453312,3357453567,HN
-3357453568,3357454591,GT
-3357454592,3357454847,NI
-3357454848,3357455103,HN
-3357455104,3357455359,SV
-3357455360,3357455871,GT
+3357453568,3357455871,GT
3357455872,3357456127,NI
-3357456128,3357456639,GT
-3357456640,3357456895,HN
-3357456896,3357457711,GT
-3357457712,3357457727,CR
-3357457728,3357457919,GT
-3357457920,3357458047,HN
-3357458048,3357458431,GT
+3357456128,3357457919,GT
+3357457920,3357458431,HN
3357458432,3357474815,CL
-3357474816,3357475015,US
-3357475016,3357475019,AR
-3357475020,3357475071,US
-3357475072,3357475887,AR
-3357475888,3357475903,VE
-3357475904,3357475999,AR
-3357476000,3357476015,VE
-3357476016,3357476031,AR
-3357476032,3357476047,VE
-3357476048,3357476071,AR
-3357476072,3357476079,VE
-3357476080,3357476255,AR
-3357476256,3357476271,VE
-3357476272,3357476287,AR
-3357476288,3357476351,VE
-3357476352,3357476479,AR
-3357476480,3357476607,EC
-3357476608,3357476687,AR
-3357476688,3357476703,US
-3357476704,3357476735,AR
-3357476736,3357476799,US
-3357476800,3357476863,AR
+3357474816,3357475071,US
+3357475072,3357476863,AR
3357476864,3357477375,EC
-3357477376,3357477423,AR
-3357477424,3357477431,EC
-3357477432,3357477543,AR
-3357477544,3357477551,EC
-3357477552,3357477887,AR
+3357477376,3357477887,AR
3357477888,3357478911,CO
-3357478912,3357479063,AR
-3357479064,3357479071,CO
-3357479072,3357479087,AR
-3357479088,3357479095,CO
-3357479096,3357479135,AR
-3357479136,3357479151,CO
-3357479152,3357479183,AR
-3357479184,3357479191,CO
-3357479192,3357479215,AR
-3357479216,3357479223,CO
-3357479224,3357479551,AR
-3357479552,3357479679,CO
-3357479680,3357479863,AR
-3357479864,3357479867,CO
-3357479868,3357479871,AR
-3357479872,3357479879,CO
-3357479880,3357480031,AR
-3357480032,3357480039,CO
-3357480040,3357480103,AR
-3357480104,3357480111,CO
-3357480112,3357480159,AR
-3357480160,3357480175,CO
-3357480176,3357480335,AR
-3357480336,3357480343,CO
-3357480344,3357480359,AR
-3357480360,3357480367,CO
-3357480368,3357480407,AR
-3357480408,3357480415,CO
-3357480416,3357480463,AR
-3357480464,3357480479,CO
-3357480480,3357480511,AR
-3357480512,3357480543,CO
-3357480544,3357480703,AR
-3357480704,3357480711,CO
-3357480712,3357480719,AR
-3357480720,3357480735,CO
-3357480736,3357480751,AR
-3357480752,3357480767,CO
-3357480768,3357480799,AR
-3357480800,3357480807,CO
-3357480808,3357480959,AR
-3357480960,3357483007,EC
+3357478912,3357480423,AR
+3357480424,3357480427,CO
+3357480428,3357482591,AR
+3357482592,3357482623,EC
+3357482624,3357482865,AR
+3357482866,3357482866,EC
+3357482867,3357483007,AR
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,3357559807,US
-3357559808,3357559935,AR
-3357559936,3357560063,VE
-3357560064,3357560159,AR
-3357560160,3357560167,VE
-3357560168,3357560175,AR
-3357560176,3357560183,VE
-3357560184,3357560199,AR
-3357560200,3357560207,VE
-3357560208,3357560247,AR
-3357560248,3357560255,VE
-3357560256,3357560263,AR
-3357560264,3357560271,VE
-3357560272,3357560319,AR
-3357560320,3357560575,MX
-3357560576,3357560831,US
-3357560832,3357561855,CO
-3357561856,3357581311,AR
+3357532160,3357556991,AR
+3357556992,3357557247,MX
+3357557248,3357561199,AR
+3357561200,3357561215,CO
+3357561216,3357561247,AR
+3357561248,3357561279,CO
+3357561280,3357581311,AR
3357581312,3357589503,CL
3357589504,3357605887,BZ
3357605888,3357606911,MX
@@ -121609,21 +124692,12 @@
3357728768,3357736959,BR
3357736960,3357745151,VE
3357745152,3357753343,CO
-3357753344,3357757487,VE
-3357757488,3357757495,BO
-3357757496,3357773823,VE
-3357773824,3357775871,PA
+3357753344,3357773823,VE
3357775872,3357776127,US
3357776128,3357776383,UY
3357776384,3357776895,US
3357776896,3357777919,CL
-3357777920,3357778415,GT
-3357778416,3357778423,SV
-3357778424,3357784319,GT
-3357784320,3357784335,SV
-3357784336,3357784503,GT
-3357784504,3357784511,SV
-3357784512,3357786111,GT
+3357777920,3357786111,GT
3357786112,3357802495,VE
3357802496,3357868031,MX
3357868032,3357933567,PE
@@ -121632,156 +124706,75 @@
3358023680,3358064639,MX
3358064640,3358130175,UY
3358130176,3358131199,EC
-3358131200,3358131327,AR
-3358131328,3358131455,CO
-3358131456,3358131839,AR
-3358131840,3358131967,CO
-3358131968,3358131983,AR
-3358131984,3358132031,CO
-3358132032,3358132087,AR
-3358132088,3358132095,CO
-3358132096,3358132127,AR
-3358132128,3358132135,CO
-3358132136,3358132607,AR
-3358132608,3358132735,CO
-3358132736,3358132975,AR
-3358132976,3358133119,EC
-3358133120,3358133247,AR
-3358133248,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,3358145023,VE
-3358145024,3358149695,AR
-3358149696,3358149703,CO
-3358149704,3358149719,AR
-3358149720,3358149727,CO
-3358149728,3358150015,AR
-3358150016,3358150143,CO
-3358150144,3358150423,AR
-3358150424,3358150431,CO
-3358150432,3358150479,AR
-3358150480,3358150655,CO
-3358150656,3358150911,EC
-3358150912,3358151039,AR
-3358151040,3358151167,EC
-3358151168,3358151263,AR
-3358151264,3358151271,EC
-3358151272,3358151423,AR
-3358151424,3358151679,EC
-3358151680,3358152703,PE
-3358152704,3358152959,US
-3358152960,3358153215,EC
-3358153216,3358153279,AR
-3358153280,3358153311,US
-3358153312,3358153343,AR
-3358153344,3358153535,US
-3358153536,3358153599,AR
-3358153600,3358153663,PR
-3358153664,3358153703,AR
-3358153704,3358153711,PR
-3358153712,3358153727,AR
-3358153728,3358153983,EC
-3358153984,3358154239,US
-3358154240,3358154751,CL
-3358154752,3358158847,PE
-3358158848,3358159159,AR
-3358159160,3358159167,US
-3358159168,3358159359,AR
-3358159360,3358159615,EC
-3358159616,3358159871,US
+3358131200,3358144639,AR
+3358144640,3358144767,VE
+3358144768,3358154495,AR
+3358154496,3358154751,CL
+3358154752,3358158079,AR
+3358158080,3358158207,PE
+3358158208,3358158335,AR
+3358158336,3358158591,PE
+3358158592,3358159871,AR
3358159872,3358160895,VE
3358160896,3358236671,AR
3358236672,3358244863,CL
3358244864,3358261247,DO
-3358261248,3358264063,AR
-3358264064,3358264319,PY
-3358264320,3358326783,AR
+3358261248,3358326783,AR
3358326784,3358392319,VE
3358392320,3358457855,AR
-3358457856,3358523391,PA
-3358523392,3358523903,VE
-3358523904,3358526463,AR
-3358526464,3358527487,VE
-3358527488,3358530815,AR
-3358530816,3358530943,VE
-3358530944,3358531071,AR
-3358531072,3358531583,VE
-3358531584,3358531839,AR
-3358531840,3358532351,VE
-3358532352,3358532863,AR
-3358532864,3358533631,VE
-3358533632,3358533887,AR
-3358533888,3358534399,VE
-3358534400,3358538751,AR
-3358538752,3358539519,VE
-3358539520,3358543615,AR
-3358543616,3358543871,VE
-3358543872,3358544127,MX
+3358457856,3358482175,PA
+3358482176,3358482431,BZ
+3358482432,3358523391,PA
+3358523392,3358523903,AR
+3358523904,3358525951,VE
+3358525952,3358526719,AR
+3358526720,3358527487,VE
+3358527488,3358530047,AR
+3358530048,3358530303,VE
+3358530304,3358530815,AR
+3358530816,3358534143,VE
+3358534144,3358534655,AR
+3358534656,3358535167,VE
+3358535168,3358535679,AR
+3358535680,3358536447,VE
+3358536448,3358536703,AR
+3358536704,3358543359,VE
+3358543360,3358543615,AR
+3358543616,3358544127,VE
3358544128,3358544383,AR
-3358544384,3358545407,VE
-3358545408,3358547967,AR
-3358547968,3358548223,VE
-3358548224,3358548479,AR
-3358548480,3358548623,VE
+3358544384,3358545919,VE
+3358545920,3358547967,AR
+3358547968,3358548623,VE
3358548624,3358548639,AR
-3358548640,3358549759,VE
-3358549760,3358553855,AR
-3358553856,3358554879,VE
-3358554880,3358555135,AR
-3358555136,3358556159,VE
-3358556160,3358558463,AR
-3358558464,3358558591,PY
-3358558592,3358559231,AR
-3358559232,3358560255,VE
-3358560256,3358561791,AR
-3358561792,3358562303,VE
-3358562304,3358562399,AR
-3358562400,3358562407,PE
-3358562408,3358563327,AR
-3358563328,3358564095,CO
-3358564096,3358564351,MX
-3358564352,3358566975,AR
-3358566976,3358567103,VE
-3358567104,3358567167,AR
-3358567168,3358567231,VE
-3358567232,3358567263,AR
-3358567264,3358567327,VE
-3358567328,3358567343,AR
-3358567344,3358567375,VE
-3358567376,3358567391,AR
-3358567392,3358567407,VE
-3358567408,3358567423,AR
-3358567424,3358568959,CO
-3358568960,3358569471,AR
-3358569472,3358570495,VE
-3358570496,3358570751,MX
-3358570752,3358571263,PE
-3358571264,3358572543,MX
-3358572544,3358577151,AR
-3358577152,3358577407,PE
-3358577408,3358578431,AR
-3358578432,3358578687,VE
-3358578688,3358579967,CO
-3358579968,3358587903,AR
-3358587904,3358588927,CL
+3358548640,3358550015,VE
+3358550016,3358552063,AR
+3358552064,3358553087,VE
+3358553088,3358553599,AR
+3358553600,3358554111,VE
+3358554112,3358560767,AR
+3358560768,3358562303,VE
+3358562304,3358563327,AR
+3358563328,3358564095,VE
+3358564096,3358564351,AR
+3358564352,3358565375,VE
+3358565376,3358566399,AR
+3358566400,3358566911,VE
+3358566912,3358567423,AR
+3358567424,3358568447,CO
+3358568448,3358570495,VE
+3358570496,3358578687,AR
+3358578688,3358579711,CO
+3358579712,3358580735,VE
+3358580736,3358584831,AR
+3358584832,3358586879,VE
+3358586880,3358587903,AR
+3358587904,3358588927,VE
3358588928,3358654463,PE
3358654464,3358658559,AR
3358658560,3358660607,CL
3358660608,3358662655,AR
-3358662656,3358666751,BR
-3358666752,3358667663,AR
-3358667664,3358667671,BR
-3358667672,3358668031,AR
-3358668032,3358668287,BR
-3358668288,3358668799,AR
-3358668800,3358669055,BR
-3358669056,3358695423,AR
+3358662656,3358670847,BR
+3358670848,3358695423,AR
3358695424,3358703615,GT
3358703616,3358715903,AR
3358715904,3358717951,EC
@@ -121797,7 +124790,6 @@
3358752768,3358756863,BB
3358756864,3358760959,CL
3358760960,3358769151,AR
-3358769152,3358777343,HT
3358777344,3358779391,CR
3358779392,3358781439,EC
3358781440,3358851071,AR
@@ -121805,8 +124797,8 @@
3358855168,3358859263,BR
3358859264,3358887935,MX
3358887936,3358892031,HN
-3358892032,3358918655,MX
-3358918656,3358924799,BR
+3358892032,3358916607,MX
+3358916608,3358924799,BR
3358924800,3358965759,MX
3358965760,3358973951,BR
3358973952,3358982143,MX
@@ -121815,10 +124807,7 @@
3359080448,3359096831,CU
3359096832,3359105023,CL
3359105024,3359109119,EC
-3359109120,3359109375,US
-3359109376,3359110079,AR
-3359110080,3359110143,GB
-3359110144,3359111167,AR
+3359109120,3359111167,AR
3359111168,3359113215,EC
3359113216,3359244287,MX
3359244288,3359260671,US
@@ -121834,17 +124823,9 @@
3359318016,3359356927,AR
3359356928,3359357951,VE
3359357952,3359358975,US
-3359358976,3359363071,AR
-3359363072,3359367167,PA
-3359367168,3359375359,AR
+3359358976,3359375359,AR
3359375360,3359440895,PE
-3359440896,3359461951,AR
-3359461952,3359462015,HN
-3359462016,3359462271,AR
-3359462272,3359462335,UY
-3359462336,3359463399,AR
-3359463400,3359463407,CO
-3359463408,3359463679,AR
+3359440896,3359463679,AR
3359463680,3359463743,HN
3359463744,3359477759,AR
3359477760,3359478015,UY
@@ -121877,56 +124858,38 @@
3359598592,3359599615,EC
3359599616,3359621119,AR
3359621120,3359637503,EC
-3359637504,3359789583,MX
-3359789584,3359789599,US
-3359789600,3359789823,MX
-3359789824,3359789887,US
-3359789888,3359797247,MX
+3359637504,3359797247,MX
3359797248,3359801343,BR
3359801344,3359899647,MX
3359899648,3359916031,CL
3359916032,3359932415,AR
3359932416,3359948799,MX
-3359948800,3359989247,AR
-3359989248,3359989503,US
-3359989504,3359989759,AR
+3359948800,3359989759,AR
3359989760,3359997951,CO
3359997952,3360006143,AR
3360006144,3360014335,EC
3360014336,3360096255,AR
3360096256,3360104447,UY
-3360104448,3360116735,CO
+3360104448,3360112639,CO
+3360112640,3360116735,BR
3360116736,3360118783,BO
3360118784,3360120831,AR
-3360120832,3360124927,CO
3360124928,3360125439,US
3360125440,3360125951,VE
3360125952,3360127999,BR
-3360128000,3360128319,HN
-3360128320,3360128327,IT
-3360128328,3360128543,HN
-3360128544,3360128575,US
-3360128576,3360129023,HN
+3360128000,3360128775,HN
+3360128776,3360128783,BE
+3360128784,3360129023,HN
3360129024,3360145407,VE
3360145408,3360153599,CL
3360153600,3360157695,AR
3360157696,3360159743,VE
3360159744,3360161791,BQ
-3360161792,3360229007,CL
-3360229008,3360229012,US
-3360229013,3360229013,CL
-3360229014,3360229023,US
-3360229024,3360231775,CL
-3360231776,3360231807,US
-3360231808,3360246783,CL
-3360246784,3360247039,AR
-3360247040,3360251903,CL
+3360161792,3360251903,CL
3360251904,3360253951,BO
3360253952,3360255999,SV
3360256000,3360260095,CL
-3360260096,3360260351,AR
-3360260352,3360260607,US
-3360260608,3360276479,AR
+3360260096,3360276479,AR
3360276480,3360278527,VE
3360278528,3360280575,EC
3360280576,3360282623,CL
@@ -121936,9 +124899,7 @@
3360342016,3360354303,VE
3360354304,3360356351,PA
3360356352,3360358399,CR
-3360358400,3360358911,CL
-3360358912,3360358919,CO
-3360358920,3360366591,CL
+3360358400,3360366591,CL
3360366592,3360382975,CO
3360382976,3360399359,VE
3360399360,3360403455,BO
@@ -121954,49 +124915,13 @@
3360669696,3360686079,MX
3360686080,3360698367,AR
3360698368,3360699135,UY
-3360699136,3360705535,AR
-3360705536,3360705791,US
-3360705792,3360707071,AR
-3360707072,3360707327,US
-3360707328,3360707583,AR
-3360707584,3360708095,US
-3360708096,3360708223,AR
-3360708224,3360708351,US
-3360708352,3360708479,AR
-3360708480,3360708863,US
-3360708864,3360708991,AR
-3360708992,3360709247,US
-3360709248,3360709631,AR
-3360709632,3360709759,US
-3360709760,3360710271,AR
-3360710272,3360710399,US
-3360710400,3360710527,AR
-3360710528,3360710655,US
+3360699136,3360710655,AR
3360710656,3360718847,HT
3360718848,3360763903,AR
-3360763904,3360765951,GT
3360765952,3360767999,CO
-3360768000,3360772351,AR
-3360772352,3360772479,BO
-3360772480,3360780303,AR
-3360780304,3360780319,BR
-3360780320,3360780399,AR
-3360780400,3360780415,BR
-3360780416,3360780991,AR
-3360780992,3360780995,BR
-3360780996,3360781055,AR
-3360781056,3360781071,BR
-3360781072,3360781791,AR
-3360781792,3360781795,MX
-3360781796,3360781839,AR
-3360781840,3360781847,DO
-3360781848,3360781943,AR
-3360781944,3360781947,MX
-3360781948,3360782167,AR
-3360782168,3360782175,MX
-3360782176,3360782239,AR
-3360782240,3360782247,MX
-3360782248,3360788479,AR
+3360768000,3360781599,AR
+3360781600,3360781615,BS
+3360781616,3360788479,AR
3360788480,3360790527,CL
3360790528,3360849919,AR
3360849920,3360882687,VE
@@ -122008,7 +124933,9 @@
3361030144,3361034239,VE
3361034240,3361036287,EC
3361036288,3361046527,AR
-3361046528,3361052671,BO
+3361046528,3361048575,BO
+3361048576,3361049599,AR
+3361049600,3361052671,BO
3361052672,3361054463,AR
3361054464,3361054719,PE
3361054720,3361058815,NI
@@ -122052,28 +124979,7 @@
3361726464,3361734655,MX
3361734656,3362258943,BR
3362258944,3362324479,CL
-3362324480,3362324735,AR
-3362324736,3362324991,US
-3362324992,3362326015,AR
-3362326016,3362326271,US
-3362326272,3362327039,AR
-3362327040,3362327551,US
-3362327552,3362328063,AR
-3362328064,3362328575,US
-3362328576,3362337279,AR
-3362337280,3362338047,US
-3362338048,3362338559,AR
-3362338560,3362338815,US
-3362338816,3362339327,AR
-3362339328,3362339583,US
-3362339584,3362342143,AR
-3362342144,3362342399,PA
-3362342400,3362343423,AR
-3362343424,3362343679,US
-3362343680,3362344447,AR
-3362344448,3362344959,US
-3362344960,3362348799,AR
-3362348800,3362349055,US
+3362324480,3362349055,AR
3362349056,3362351103,CR
3362351104,3362353151,AR
3362353152,3362355199,EC
@@ -122081,15 +124987,14 @@
3362357248,3362381823,BO
3362381824,3362390015,EC
3362390016,3362422783,PE
-3362422784,3362426879,CO
-3362426880,3362428927,PA
+3362426880,3362428927,BR
3362428928,3362430975,CL
3362430976,3362447359,CO
-3362447360,3362448895,HN
-3362448896,3362449151,SV
-3362449152,3362449407,HN
-3362449408,3362450175,SV
-3362450176,3362451455,HN
+3362447360,3362448383,SV
+3362448384,3362448895,HN
+3362448896,3362450175,SV
+3362450176,3362450431,HN
+3362450432,3362451455,SV
3362451456,3362452479,AR
3362452480,3362452991,BO
3362452992,3362453247,HN
@@ -122115,19 +125020,9 @@
3362529280,3362537471,PA
3362537472,3362545663,AR
3362545664,3362549759,PE
-3362549760,3362551871,AR
-3362551872,3362551887,MX
-3362551888,3362552143,AR
-3362552144,3362552159,PR
-3362552160,3362552431,AR
-3362552432,3362552447,MX
-3362552448,3362553023,AR
-3362553024,3362553039,PR
-3362553040,3362553167,AR
-3362553168,3362553183,DO
-3362553184,3362553247,AR
-3362553248,3362553263,CO
-3362553264,3362553855,AR
+3362549760,3362552575,AR
+3362552576,3362552591,MX
+3362552592,3362553855,AR
3362553856,3362557951,PY
3362557952,3362562047,AR
3362570240,3362586623,UY
@@ -122149,17 +125044,13 @@
3362711552,3362713599,EC
3362713600,3362714623,VE
3362714624,3362714879,HN
-3362714880,3362716415,VE
-3362716416,3362716671,CR
-3362716672,3362717695,VE
+3362714880,3362717695,VE
3362717696,3362815999,CL
3362816000,3362832383,AR
3362832384,3362838527,CO
3362838528,3362840575,EC
3362840576,3362897919,CL
-3362897920,3362903551,HT
-3362903552,3362904063,MX
-3362904064,3362914303,HT
+3362897920,3362914303,HT
3362914304,3362930687,CO
3362930688,3362934783,CL
3362934784,3362936831,AR
@@ -122176,9 +125067,7 @@
3362992128,3362996223,AR
3362996224,3363000319,UY
3363000320,3363004415,AR
-3363012608,3363013967,PA
-3363013968,3363013975,NI
-3363013976,3363024895,PA
+3363012608,3363024895,PA
3363024896,3363025151,HN
3363025152,3363025407,PA
3363025408,3363025663,CO
@@ -122200,15 +125089,11 @@
3363471360,3363487743,CR
3363487744,3363504127,CO
3363504128,3363512319,PE
-3363512320,3363554047,AR
-3363554048,3363554175,US
-3363554176,3363554303,AR
-3363554304,3363554431,BR
-3363554432,3363554943,AR
-3363554944,3363555327,US
-3363555328,3363555839,AR
-3363555840,3363556607,US
-3363556608,3363557375,AR
+3363512320,3363553919,AR
+3363553920,3363554047,US
+3363554048,3363554175,AR
+3363554176,3363554303,US
+3363554304,3363557375,AR
3363557376,3363559423,BZ
3363559424,3363561471,AR
3363565568,3363569663,AR
@@ -122222,45 +125107,35 @@
3363601920,3363602175,AR
3363602176,3363602431,PA
3363602432,3363610623,CW
-3363614720,3363617791,AR
-3363617792,3363618815,PE
+3363614720,3363618815,AR
3363618816,3363627007,UY
3363627008,3363635199,EC
3363635200,3363651583,UY
3363651584,3363667967,AR
3363667968,3363676159,EC
3363676160,3363678207,TT
-3363680256,3363682303,GT
3363682304,3363684351,VE
3363684352,3363708927,EC
3363708928,3363713023,CL
3363713024,3363713279,EC
3363713280,3363714047,CL
-3363714048,3363715583,PE
-3363715584,3363715839,CL
-3363715840,3363716607,PE
-3363716608,3363716863,AR
-3363716864,3363717119,PE
+3363714048,3363715839,PE
+3363715840,3363716095,CL
+3363716096,3363717119,PE
3363717120,3363733503,CL
3363733504,3363831807,AR
3363831808,3367763967,BR
-3367763968,3367774207,MX
-3367774208,3367776255,BR
-3367776256,3367788543,MX
-3367788544,3367796735,BR
-3367796736,3367804927,MX
+3367763968,3367804927,MX
3367804928,3367840767,BR
-3367840768,3367841023,HN
-3367841024,3367841039,CA
-3367841040,3367841407,HN
-3367841408,3367841423,CA
-3367841424,3367841791,HN
+3367840768,3367841791,HN
3367841792,3368052991,BR
3368052992,3368053247,PE
3368053248,3368053503,CO
3368053504,3368086527,BR
3368086528,3368087551,CR
-3368087552,3368601799,BR
+3368087552,3368157183,BR
+3368157184,3368173567,MX
+3368173568,3368601799,BR
3368601801,3370188799,BR
3370188800,3370196991,MX
3370196992,3370214399,BR
@@ -122274,21 +125149,22 @@
3370507264,3370512383,BR
3370514432,3370515455,BR
3370515456,3370516479,AR
-3370516480,3371106303,BR
+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
+3380764672,3380811775,MX
3380811776,3380813823,BR
3380813824,3380815103,MX
3380815104,3380815359,CR
@@ -122305,7 +125181,8 @@
3380818176,3380818431,PA
3380818432,3380818687,DO
3380818688,3380818943,PY
-3380818944,3380822527,MX
+3380818944,3380822015,MX
+3380822272,3380822527,MX
3380822528,3380822783,NI
3380822784,3380823039,PE
3380823040,3380824063,BR
@@ -122317,7 +125194,6 @@
3380825600,3380825855,CO
3380825856,3380826111,AR
3380826112,3380828159,BR
-3380828160,3380828671,MX
3380828672,3380829183,CO
3380829184,3380830207,BR
3380830208,3380830463,MX
@@ -122325,7 +125201,7 @@
3380830720,3380831231,PA
3380831232,3380831743,MX
3380831744,3380831999,AR
-3380832000,3380832255,SR
+3380832000,3380832255,BR
3380832256,3380832767,MX
3380832768,3380833279,DO
3380833280,3380833791,MX
@@ -122362,8 +125238,8 @@
3381387264,3381448703,MX
3381448704,3381452799,BR
3381452800,3381453823,AR
-3381453824,3381455871,BR
-3381455872,3381456895,US
+3381453824,3381456383,BR
+3381456384,3381456895,US
3381456896,3381460991,BR
3381460992,3381944319,MX
3381944320,3381946367,BR
@@ -122371,9 +125247,9 @@
3381947392,3381952511,BR
3381952512,3381960703,MX
3381960704,3381962751,BR
-3381962752,3381963559,HN
-3381963560,3381963567,FR
-3381963568,3381963775,HN
+3381962752,3381963711,HN
+3381963712,3381963727,CA
+3381963728,3381963775,HN
3381963776,3381968895,BR
3381968896,3381972991,MX
3381972992,3381974015,BR
@@ -122411,7 +125287,8 @@
3382587392,3382588415,HN
3382588416,3382589439,PE
3382589440,3382591487,BR
-3382591488,3382602751,MX
+3382591488,3382599679,MX
+3382601728,3382602751,MX
3382602752,3382603775,BR
3382603776,3382605823,MX
3382605824,3382607871,AR
@@ -122427,17 +125304,12 @@
3382661120,3382662143,MX
3382662144,3382665215,BR
3382665216,3382669311,MX
-3382669312,3382669567,SV
-3382669568,3382669823,GT
-3382669824,3382670079,HN
-3382670080,3382670335,GT
+3382669312,3382670335,GT
3382670336,3382672383,BR
3382672384,3382677503,MX
3382677504,3382681599,BR
-3382681600,3382683647,MX
3382683648,3382685695,CL
-3382685696,3382686655,MX
-3382686656,3382686719,US
+3382685696,3382686719,MX
3382686720,3382689791,BR
3382689792,3382695935,MX
3382695936,3382696959,AR
@@ -122450,14 +125322,6 @@
3383701504,3383705599,BR
3383705600,3383754751,MX
3383754752,3384147967,AR
-3384147968,3384154879,US
-3384154880,3384155135,HN
-3384155136,3384156159,US
-3384156160,3384160255,PA
-3384160256,3384164351,US
-3384164352,3384183807,PA
-3384183808,3384184831,VE
-3384184832,3384213503,PA
3384213504,3384279039,EC
3384279040,3384410111,CO
3384410112,3384672255,CL
@@ -122469,7 +125333,6 @@
3386114048,3386245119,AR
3386245120,3386376191,CL
3386376192,3386392575,CO
-3386392576,3386408959,CW
3386408960,3386425343,GT
3386425344,3386441727,AR
3386441728,3386458111,PY
@@ -122486,7 +125349,9 @@
3386548224,3386556415,CR
3386556416,3386562047,PA
3386562048,3386562303,PE
-3386562304,3386572799,PA
+3386562304,3386571263,PA
+3386571264,3386571519,BZ
+3386571520,3386572799,PA
3386572800,3386589183,EC
3386589184,3386601471,AR
3386601472,3386605567,CO
@@ -122530,7 +125395,6 @@
3386769408,3386773503,VE
3386773504,3386774527,AR
3386774528,3386777599,BR
-3386777600,3386781695,CW
3386781696,3386783743,PY
3386783744,3386784767,AR
3386784768,3386785791,GT
@@ -122545,16 +125409,32 @@
3387424768,3387502599,CO
3387502600,3387502607,JP
3387502608,3387555839,CO
-3387555840,3387568127,AR
-3387568128,3387572223,PE
+3387555840,3387568879,AR
+3387568880,3387568883,PE
+3387568884,3387570673,AR
+3387570674,3387570674,PE
+3387570675,3387570847,AR
+3387570848,3387570863,PE
+3387570864,3387570943,AR
+3387570944,3387571071,PE
+3387571072,3387572223,AR
3387572224,3387576319,CO
3387576320,3387578367,EC
3387578368,3387584511,AR
-3387584512,3387588607,PE
-3387588608,3387600895,AR
+3387584512,3387585535,PE
+3387585536,3387600895,AR
3387600896,3387604991,CO
-3387604992,3387613183,EC
-3387613184,3387617279,VE
+3387604992,3387609959,AR
+3387609960,3387609967,EC
+3387609968,3387611007,AR
+3387611008,3387611135,EC
+3387611136,3387613811,AR
+3387613812,3387613812,VE
+3387613813,3387613831,AR
+3387613832,3387613839,VE
+3387613840,3387615615,AR
+3387615616,3387615743,VE
+3387615744,3387617279,AR
3387617280,3387619327,CO
3387619328,3387686911,AR
3387686912,3387736063,CL
@@ -122679,7 +125559,6 @@
3389212672,3389213183,IN
3389213184,3389213439,AU
3389213440,3389213695,MY
-3389213696,3389213951,US
3389213952,3389214207,IN
3389214208,3389214463,SG
3389214464,3389214719,AU
@@ -123037,9 +125916,7 @@
3389970432,3389971199,NZ
3389971200,3389971711,CN
3389971712,3389971967,AU
-3389971968,3389972479,CN
-3389972480,3389972735,US
-3389972736,3389973503,CN
+3389971968,3389973503,CN
3389973504,3389973759,NZ
3389973760,3389974271,AU
3389974272,3389974527,CN
@@ -123155,9 +126032,7 @@
3391192320,3391356927,JP
3391356928,3391414783,NZ
3391414784,3391415039,CN
-3391415040,3391441407,NZ
-3391441408,3391441663,PH
-3391441664,3391444479,NZ
+3391415040,3391444479,NZ
3391444480,3391444991,VN
3391444992,3391453183,NZ
3391453184,3391453439,ID
@@ -123606,7 +126481,9 @@
3391848448,3391848959,AU
3391848960,3391849471,IN
3391849472,3391851007,AU
-3391851264,3391852543,AU
+3391851008,3391851263,SG
+3391851264,3391851519,JP
+3391851520,3391852543,AU
3391852544,3391856639,CN
3391856640,3391864831,ID
3391864832,3391866879,TW
@@ -123694,7 +126571,9 @@
3392073728,3392077823,ID
3392077824,3392079871,AU
3392079872,3392086015,JP
-3392086016,3392094207,AU
+3392086016,3392089599,PK
+3392089600,3392089855,AU
+3392089856,3392094207,PK
3392094208,3392098559,ID
3392098560,3392098815,AU
3392098816,3392099327,CN
@@ -123880,12 +126759,13 @@
3392799488,3392799743,AU
3392799744,3392800767,JP
3392800768,3392802815,SG
-3392802816,3392806911,JP
+3392802816,3392805887,JP
+3392805888,3392806911,HK
3392806912,3392815103,AU
3392815104,3392819199,ID
3392819200,3392823295,MY
3392823296,3392824319,KH
-3392824320,3392824831,AU
+3392824320,3392824575,AU
3392824832,3392825343,IN
3392825344,3392826367,CN
3392826368,3392827391,BD
@@ -124575,7 +127455,8 @@
3395059712,3395067903,PH
3395067904,3395076095,HK
3395076096,3395080191,ID
-3395080192,3395084287,AU
+3395080192,3395082239,AU
+3395082240,3395084287,NZ
3395084288,3395088383,IN
3395088384,3395091455,AU
3395091456,3395093503,CN
@@ -124624,6 +127505,8 @@
3395182848,3395190783,SG
3395190784,3395198975,JP
3395198976,3395199999,IN
+3395200000,3395200511,BD
+3395200512,3395200767,TH
3395200768,3395201023,MY
3395201024,3395202047,TH
3395202048,3395203071,IN
@@ -124663,8 +127546,7 @@
3397027072,3397027327,PH
3397027328,3397027839,IN
3397027840,3397029887,JP
-3397029888,3397031423,MY
-3397031680,3397033983,MY
+3397029888,3397033983,MY
3397033984,3397038079,ID
3397038080,3397058559,JP
3397058560,3397066751,MU
@@ -124675,7 +127557,9 @@
3397087232,3397088255,HK
3397088256,3397090303,CN
3397090304,3397091327,TW
-3397091328,3397099519,GU
+3397091328,3397093375,MP
+3397093376,3397097471,GU
+3397097472,3397099519,MP
3397099520,3397103615,HK
3397103616,3397105663,LA
3397105664,3397107711,JP
@@ -124754,7 +127638,9 @@
3397338040,3397338043,SG
3397338044,3397338375,HK
3397338376,3397338379,JP
-3397338380,3397339647,HK
+3397338380,3397338423,HK
+3397338424,3397338427,JP
+3397338428,3397339647,HK
3397339648,3397339687,SG
3397339688,3397340927,HK
3397340928,3397341183,TH
@@ -124831,8 +127717,7 @@
3397531648,3397532671,SG
3397532672,3397533695,JP
3397533696,3397551359,HK
-3397551616,3397557247,HK
-3397557252,3397557252,HK
+3397551616,3397557279,HK
3397557504,3397566463,HK
3397566464,3397574655,AU
3397574656,3397582847,CN
@@ -125204,7 +128089,8 @@
3399827456,3399835647,AU
3399839744,3399841791,JP
3399841792,3399842815,HK
-3399842816,3399843839,AU
+3399842816,3399843583,AU
+3399843584,3399843839,US
3399843840,3399852031,TW
3399852032,3399856127,JP
3399856128,3399860223,CN
@@ -125241,7 +128127,9 @@
3399995392,3399999487,KR
3399999488,3400000475,JP
3400000476,3400000479,US
-3400000480,3400003583,JP
+3400000480,3400002303,JP
+3400002304,3400002367,HK
+3400002368,3400003583,JP
3400003584,3400005631,AU
3400005632,3400006143,JP
3400006400,3400007679,JP
@@ -125255,8 +128143,7 @@
3400032256,3400040447,AU
3400040448,3400044543,CN
3400044544,3400045567,IN
-3400045568,3400046591,HK
-3400046592,3400047615,KR
+3400045568,3400047615,HK
3400047616,3400048639,IN
3400048640,3400056831,CN
3400056832,3400060927,TW
@@ -125394,7 +128281,9 @@
3400648816,3400648831,HK
3400648832,3400649943,JP
3400649944,3400649951,HK
-3400649952,3400650409,JP
+3400649952,3400650143,JP
+3400650144,3400650159,HK
+3400650160,3400650409,JP
3400650410,3400650410,AU
3400650411,3400650751,JP
3400650752,3400654847,AU
@@ -125425,7 +128314,6 @@
3400849408,3400851455,MN
3400851456,3400859647,AU
3400859648,3400860671,HK
-3400860672,3400861695,IN
3400861696,3400862719,CN
3400862720,3400864767,BD
3400864768,3400865791,AU
@@ -125877,7 +128765,8 @@
3406622720,3406623743,CN
3406623744,3406625023,AU
3406625024,3406625279,NF
-3406625280,3406631423,AU
+3406625280,3406625791,AU
+3406626816,3406631423,AU
3406631424,3406631679,CN
3406631680,3406632959,AU
3406632960,3406633215,CN
@@ -126068,7 +128957,7 @@
3406976768,3406977023,CN
3406977024,3406980095,AU
3406980096,3406980607,CN
-3406980608,3406981375,AU
+3406980608,3406981119,AU
3406981376,3406981631,CN
3406981632,3406981887,AU
3406981888,3406982143,CN
@@ -126258,7 +129147,7 @@
3407258368,3407258623,CN
3407258624,3407259135,AU
3407259136,3407259391,CN
-3407259392,3407260159,AU
+3407259648,3407260159,AU
3407260160,3407260415,CN
3407260416,3407261695,AU
3407261696,3407263743,HK
@@ -127114,9 +130003,8 @@
3409871872,3409873663,AU
3409873664,3409873919,CN
3409873920,3409875967,AU
-3409875968,3409876839,JP
-3409876840,3409876847,AU
-3409876848,3409876991,JP
+3409875968,3409876735,JP
+3409876736,3409876991,AU
3409876992,3409878015,TH
3409878016,3409879295,AU
3409879296,3409879551,CN
@@ -127200,7 +130088,9 @@
3410959360,3410959615,VN
3410959616,3410959871,ID
3410959872,3410960383,AU
-3410960384,3410964479,GB
+3410960384,3410960447,GB
+3410960448,3410960463,SG
+3410960464,3410964479,GB
3410964480,3410968575,JP
3410968576,3410984959,NZ
3410984960,3411017727,TW
@@ -127929,7 +130819,9 @@
3414409216,3414413311,JP
3414413312,3414417407,TH
3414417408,3414425599,HK
-3414425600,3414433791,AU
+3414425600,3414431743,AU
+3414431744,3414432767,US
+3414432768,3414433791,AU
3414433792,3414441983,CN
3414441984,3414450175,AU
3414450176,3414458367,JP
@@ -127941,7 +130833,8 @@
3414491136,3414523903,TW
3414523904,3414532095,JP
3414532096,3414540287,KR
-3414540288,3414555647,JP
+3414540288,3414554623,JP
+3414554624,3414555647,AU
3414555648,3414556671,PK
3414556672,3414605823,AU
3414605824,3414616063,IN
@@ -128157,7 +131050,8 @@
3416710144,3416711167,HK
3416711168,3416719359,AU
3416719360,3416721407,PH
-3416721408,3416723455,VN
+3416721408,3416723199,VN
+3416723200,3416723455,TW
3416723456,3416724479,KH
3416724480,3416725503,HK
3416725504,3416726527,AU
@@ -128217,7 +131111,9 @@
3416930816,3416931327,CN
3416931328,3416932351,IN
3416932352,3416936447,PK
-3416936448,3416939007,AU
+3416936448,3416937215,AU
+3416937216,3416937471,HK
+3416937472,3416939007,AU
3416939008,3416939519,HK
3416939520,3416940543,AU
3416940544,3416948735,KR
@@ -128348,7 +131244,6 @@
3418162688,3418163199,CN
3418163200,3418165247,PH
3418165248,3418167295,MY
-3418167296,3418167551,IN
3418167552,3418167807,AU
3418167808,3418168319,HK
3418168320,3418169343,VN
@@ -128548,7 +131443,11 @@
3419529216,3419537407,CN
3419537408,3419541503,HK
3419541504,3419553791,KR
-3419553792,3419557631,AU
+3419553792,3419556095,AU
+3419556096,3419556351,CN
+3419556352,3419556607,AU
+3419556608,3419556863,CN
+3419556864,3419557631,AU
3419557888,3419558399,ID
3419558400,3419558655,AU
3419558656,3419559935,ID
@@ -128677,9 +131576,15 @@
3423092848,3423093759,VI
3423093760,3423094783,US
3423094784,3423095807,CA
-3423095808,3423131647,US
+3423095808,3423128575,US
+3423129088,3423129343,NG
+3423129600,3423131647,US
3423131648,3423133695,PL
-3423133696,3423143935,US
+3423133696,3423135999,US
+3423136000,3423136255,CA
+3423136256,3423137023,US
+3423137024,3423137279,CA
+3423137280,3423143935,US
3423143936,3423145983,CA
3423145984,3423162367,US
3423162368,3423163391,CA
@@ -128688,14 +131593,12 @@
3423182848,3423184895,CA
3423184896,3423258623,US
3423258624,3423260671,CA
-3423260672,3423264831,US
-3423264832,3423264863,NG
-3423264864,3423268863,US
+3423260672,3423268863,US
3423268864,3423269887,CA
3423269888,3423285247,US
3423285248,3423287295,CA
-3423287296,3423288319,VG
-3423288320,3423303679,US
+3423287296,3423287807,VG
+3423287808,3423303679,US
3423303680,3423304703,CA
3423304704,3423311871,US
3423311872,3423313151,VI
@@ -128708,11 +131611,17 @@
3423366496,3423371263,US
3423371264,3423375359,ZA
3423375360,3423379455,CA
-3423379456,3423416319,US
+3423379456,3423410175,US
+3423410176,3423412223,BM
+3423412224,3423416319,US
3423416320,3423417343,CA
3423417344,3423430655,US
3423430656,3423431679,TC
-3423431680,3423468543,US
+3423431680,3423465471,US
+3423465472,3423465727,VC
+3423465728,3423465983,US
+3423465984,3423466239,VC
+3423466240,3423468543,US
3423468544,3423469567,CA
3423469568,3423473663,US
3423473664,3423474687,CA
@@ -128737,7 +131646,9 @@
3423586304,3423588351,US
3423590400,3423602687,US
3423602688,3423603711,KN
-3423603712,3423626239,US
+3423603712,3423614975,US
+3423614976,3423615487,CA
+3423615488,3423626239,US
3423626240,3423627263,CA
3423627264,3423629311,US
3423629312,3423630335,AG
@@ -128750,9 +131661,7 @@
3423705856,3423725423,US
3423725424,3423725427,CA
3423725428,3423731711,US
-3423731712,3423752191,AE
-3423752192,3423756287,US
-3423756288,3423797247,AE
+3423731712,3423797247,AE
3423797248,3423797503,US
3423797504,3423801087,CA
3423801088,3423801343,US
@@ -128792,7 +131701,9 @@
3425173504,3425304575,CA
3425304576,3425471487,US
3425471488,3425472511,CA
-3425472512,3425697791,US
+3425472512,3425516799,US
+3425516800,3425517055,MX
+3425517056,3425697791,US
3425697792,3425699839,CA
3425699840,3425714175,US
3425714176,3425722367,CA
@@ -128801,12 +131712,12 @@
3425847040,3425869167,CA
3425869168,3425869183,US
3425869184,3425894399,CA
-3425894400,3425994495,US
-3425994496,3425994751,CA
-3425994752,3426007807,US
+3425894400,3426007807,US
3426008064,3426013183,US
3426013184,3426013439,IL
-3426013440,3426369023,US
+3426013440,3426356991,US
+3426356992,3426357247,CA
+3426357248,3426369023,US
3426369024,3426369535,CA
3426369536,3426387967,US
3426387968,3426388991,MX
@@ -128841,7 +131752,8 @@
3427133184,3427408393,US
3427408395,3427487743,US
3427487744,3427487999,GB
-3427488000,3427503871,US
+3427488000,3427503615,US
+3427503616,3427503871,AU
3427503872,3427504127,SG
3427504128,3427618303,US
3427618304,3427618559,CA
@@ -128936,7 +131848,7 @@
3427767808,3427769599,US
3427769600,3427770111,JP
3427770112,3427770367,NO
-3427770368,3427770623,GB
+3427770368,3427770623,US
3427770624,3427771391,CH
3427771392,3427771647,US
3427771648,3427771903,CA
@@ -128951,8 +131863,7 @@
3427774720,3427775231,DE
3427775232,3427776511,US
3427776512,3427776767,CZ
-3427776768,3427777023,US
-3427777024,3427777279,NL
+3427776768,3427777279,US
3427777280,3427777535,DE
3427777536,3427777791,US
3427777792,3427778047,HK
@@ -128963,8 +131874,7 @@
3427779328,3427780095,US
3427780096,3427780351,GB
3427780352,3427780863,DE
-3427780864,3427781375,US
-3427781376,3427781631,GB
+3427780864,3427781631,US
3427781632,3427781887,BE
3427781888,3427782399,US
3427782400,3427782655,GB
@@ -128986,7 +131896,7 @@
3427790080,3427790847,US
3427790848,3427791103,IT
3427791104,3427791615,DE
-3427791616,3427791871,GB
+3427791616,3427791871,US
3427791872,3427792383,CA
3427792384,3427792639,NL
3427792640,3427793407,SG
@@ -128997,22 +131907,19 @@
3427796992,3427831551,US
3427831552,3427831807,MX
3427831808,3427860479,US
-3427860480,3428025343,CA
-3428025344,3428025855,US
-3428025856,3428057087,CA
+3427860480,3428057087,CA
3428057088,3428286719,US
3428286720,3428286975,CA
3428286976,3428296959,US
3428296960,3428297215,CL
3428297216,3428299519,US
3428299520,3428299775,ZA
-3428299776,3428302079,US
-3428302080,3428302335,CA
-3428302336,3428306175,US
+3428299776,3428306175,US
3428306176,3428306431,PE
3428306432,3428318975,US
3428318976,3428319231,CA
-3428319232,3428399359,US
+3428319232,3428398079,US
+3428399104,3428399359,US
3428399360,3428399615,CA
3428399616,3428434943,US
3428434944,3428435199,CA
@@ -129023,16 +131930,14 @@
3428582912,3428585215,US
3428585216,3428585471,CA
3428585472,3428585983,US
-3428585984,3428586495,CA
-3428586496,3428587007,US
-3428587008,3428587519,CA
+3428585984,3428586239,CA
+3428586240,3428587263,US
+3428587264,3428587519,CA
3428587520,3428587775,US
-3428587776,3428588287,CA
-3428588288,3428588543,US
+3428587776,3428588031,CA
+3428588032,3428588543,US
3428588544,3428588799,CA
-3428588800,3428589311,US
-3428589312,3428589567,CA
-3428589568,3428591871,US
+3428588800,3428591871,US
3428591872,3428592127,CA
3428592128,3428592383,US
3428592384,3428593919,CA
@@ -129057,7 +131962,9 @@
3428605184,3428607999,US
3428608000,3428609023,CA
3428609024,3428610047,US
-3428610048,3428611071,CA
+3428610048,3428610559,CA
+3428610560,3428610815,US
+3428610816,3428611071,CA
3428611072,3428612607,US
3428612608,3428613887,CA
3428613888,3428614143,US
@@ -129098,9 +132005,7 @@
3428660736,3428661503,CA
3428661504,3428743167,US
3428743168,3428744191,CA
-3428744192,3428752383,US
-3428752384,3428753407,GH
-3428753408,3428958207,US
+3428744192,3428958207,US
3428958208,3428962303,CO
3428962304,3429027839,US
3429027840,3429028351,GB
@@ -129124,9 +132029,7 @@
3429957632,3430073343,US
3430073600,3430074111,US
3430074112,3430074367,AU
-3430074368,3430328831,US
-3430328832,3430329087,GH
-3430329088,3430354943,US
+3430074368,3430354943,US
3430354944,3430356991,PR
3430356992,3430417151,US
3430417152,3430417167,BR
@@ -129206,9 +132109,7 @@
3431518144,3431520767,US
3431521024,3431526921,US
3431526923,3431596287,US
-3431596288,3431602687,CA
-3431602688,3431602943,US
-3431602944,3431606271,CA
+3431596288,3431606271,CA
3431606272,3431609343,US
3431609344,3431613439,CA
3431613440,3431613695,US
@@ -129231,9 +132132,7 @@
3431745024,3431745279,BE
3431745280,3431745791,US
3431745792,3431746047,GB
-3431746048,3431746559,US
-3431746560,3431746815,DE
-3431746816,3431747071,US
+3431746048,3431747071,US
3431747072,3431747327,LU
3431747328,3431748607,US
3431748608,3431749119,FR
@@ -129246,7 +132145,9 @@
3431755008,3431755775,NL
3431755776,3431759615,CA
3431759616,3431759871,DE
-3431759872,3432004607,US
+3431759872,3431851007,US
+3431851008,3431851263,GB
+3431851264,3432004607,US
3432004608,3432005631,CA
3432005632,3432009215,US
3432009216,3432009471,PR
@@ -129258,9 +132159,7 @@
3432133888,3432134143,GB
3432134144,3432205311,US
3432205312,3432206335,CA
-3432206336,3432280063,US
-3432280064,3432280319,GB
-3432280320,3432324607,US
+3432206336,3432324607,US
3432324608,3432324863,CA
3432324864,3432329215,US
3432329216,3432330239,DE
@@ -129295,13 +132194,23 @@
3432689152,3432689663,CA
3432689664,3432695807,US
3432695808,3432697855,CA
-3432697856,3432736255,US
+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,3432807423,US
+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,3433964799,CA
@@ -129329,27 +132238,13 @@
3434807552,3434831359,CA
3434831360,3434831615,US
3434831616,3434872575,CA
-3434872576,3434913951,US
-3434913952,3434913959,AG
-3434913960,3434914047,US
-3434914048,3434914303,DM
-3434914304,3434914559,VG
-3434914560,3434914815,AG
-3434914816,3434915327,VG
-3434915328,3434915583,DM
-3434915584,3434915839,KN
-3434915840,3434916095,LC
-3434916096,3434916351,US
-3434916352,3434916607,DM
-3434916608,3434916863,AG
-3434916864,3434917119,US
-3434917120,3434917375,LC
-3434917376,3434917887,AG
-3434917888,3435069439,US
+3434872576,3435069439,US
3435069440,3435134975,CA
-3435134976,3435216637,US
-3435216639,3435216650,US
-3435216652,3435271423,US
+3435134976,3435216383,US
+3435216384,3435216637,DE
+3435216639,3435216650,DE
+3435216652,3435216895,DE
+3435216896,3435271423,US
3435271424,3435271679,CA
3435271680,3435507711,US
3435507712,3435511807,CA
@@ -129412,7 +132307,9 @@
3437343232,3437343487,US
3437343488,3437350911,CA
3437350912,3437351423,US
-3437351424,3437358847,CA
+3437351424,3437353471,CA
+3437353472,3437353727,SG
+3437353728,3437358847,CA
3437358848,3437359103,US
3437359104,3437428735,CA
3437428736,3437691391,US
@@ -129464,9 +132361,7 @@
3437731584,3437731615,AF
3437731616,3437734399,US
3437734400,3437734655,SG
-3437734656,3437736447,US
-3437736448,3437737471,CL
-3437737472,3437748223,US
+3437734656,3437748223,US
3437748224,3437748479,GB
3437748480,3437748991,NL
3437748992,3437749247,US
@@ -129502,7 +132397,9 @@
3438132560,3438132575,CA
3438132576,3438137183,US
3438137184,3438137191,CA
-3438137192,3438215423,US
+3438137192,3438139391,US
+3438139392,3438140415,GB
+3438140416,3438215423,US
3438215424,3438215935,CA
3438215936,3438216191,US
3438216192,3438217983,CA
@@ -129522,23 +132419,21 @@
3438542848,3438608383,CA
3438608384,3438610125,US
3438610126,3438610126,DE
-3438610127,3438610325,US
+3438610127,3438610169,US
+3438610170,3438610170,PL
+3438610171,3438610325,US
3438610326,3438610326,GB
3438610327,3438610408,US
3438610409,3438610410,GB
3438610411,3438734335,US
3438734336,3438735359,CA
-3438735360,3438813183,US
-3438813184,3438814207,GH
-3438814208,3438895103,US
+3438735360,3438895103,US
3438895104,3438896639,HN
3438896640,3439059711,US
3439059712,3439059967,PR
3439059968,3439071103,US
3439071104,3439071135,MX
-3439071136,3448303615,US
-3448303616,3448303871,KY
-3448303872,3448338687,US
+3439071136,3448338687,US
3448338688,3448339455,GB
3448339456,3448377343,US
3448377344,3448377855,AG
@@ -129576,15 +132471,7 @@
3449100288,3449100799,HK
3449100800,3449101311,AU
3449101312,3449159679,US
-3449159680,3449160703,CA
-3449160704,3449161471,US
-3449161472,3449163519,CA
-3449163520,3449163775,US
-3449163776,3449165055,CA
-3449165056,3449165311,US
-3449165312,3449165567,CA
-3449165568,3449166079,US
-3449166080,3449168639,CA
+3449159680,3449168639,CA
3449168640,3449168895,US
3449168896,3449169151,CA
3449169152,3449169663,US
@@ -130181,9 +133068,7 @@
3455132160,3455133695,BO
3455133696,3455320063,US
3455320064,3455322111,FR
-3455322112,3455328255,US
-3455328256,3455329279,DO
-3455329280,3455330815,US
+3455322112,3455330815,US
3455330816,3455331327,ES
3455331328,3455333887,US
3455333888,3455334399,NL
@@ -130193,11 +133078,11 @@
3455359232,3455359487,ES
3455359488,3455418367,US
3455418368,3455418879,KY
-3455418880,3455421439,US
-3455421440,3455421951,BE
-3455421952,3455453439,US
+3455418880,3455453439,US
3455453440,3455453695,HT
-3455453696,3455551999,US
+3455453696,3455488103,US
+3455488104,3455488111,CA
+3455488112,3455551999,US
3455552000,3455552255,EC
3455552256,3455566079,US
3455566080,3455566335,EC
@@ -130354,7 +133239,9 @@
3458195456,3458196479,SG
3458196480,3458233343,US
3458233344,3458234367,CA
-3458234368,3458813951,US
+3458234368,3458806783,US
+3458806784,3458807807,GB
+3458807808,3458813951,US
3458813952,3458818047,CA
3458818048,3458820095,US
3458820096,3458820351,CA
@@ -130531,7 +133418,10 @@
3460453632,3460453887,BS
3460453888,3460507647,US
3460507648,3460507903,MX
-3460507904,3460801023,US
+3460507904,3460762367,US
+3460762368,3460762623,CA
+3460762624,3460762879,US
+3460763648,3460801023,US
3460801280,3460878335,US
3460878336,3460878591,CA
3460878592,3460880383,US
@@ -130675,7 +133565,9 @@
3461515776,3461516031,CA
3461516032,3461516287,US
3461516288,3461516543,IL
-3461516544,3461808127,US
+3461516544,3461554175,US
+3461554176,3461556223,CA
+3461558272,3461808127,US
3461808128,3461873663,CA
3461873664,3461897727,US
3461897728,3461897983,CA
@@ -130770,8 +133662,10 @@
3462635008,3462635263,US
3462635264,3462635519,SG
3462635520,3462660295,US
-3462660296,3462660303,GB
-3462660304,3462661375,US
+3462660296,3462660303,SG
+3462660304,3462660327,US
+3462660328,3462660335,SG
+3462660336,3462661375,US
3462661376,3462661631,SG
3462661632,3463004159,US
3463004160,3463006207,CO
@@ -130822,9 +133716,9 @@
3464202240,3464202495,CA
3464202496,3464203007,US
3464203008,3464203263,SE
-3464203264,3464203519,DE
-3464203520,3464204799,US
-3464204800,3464205311,NL
+3464203264,3464204799,US
+3464204800,3464205055,DK
+3464205056,3464205311,NL
3464205312,3464205567,SE
3464205568,3464205823,US
3464205824,3464205951,AF
@@ -130952,7 +133846,8 @@
3466489856,3466490111,CA
3466490112,3466558207,US
3466558208,3466558463,EC
-3466558464,3466756095,US
+3466558464,3466717445,US
+3466717450,3466756095,US
3466756096,3466772479,CA
3466772480,3466846207,US
3466846208,3466854399,CA
@@ -131164,11 +134059,7 @@
3468468224,3468545791,US
3468545792,3468546047,SG
3468546048,3468597759,US
-3468597760,3468598015,SG
-3468598016,3468598143,US
-3468598144,3468598175,SG
-3468598176,3468598271,US
-3468598272,3468598391,SG
+3468597760,3468598391,SG
3468598392,3468598399,NL
3468598400,3468599039,SG
3468599040,3468599295,HK
@@ -131180,17 +134071,15 @@
3468623872,3468656639,CA
3468656640,3468658175,US
3468658176,3468658431,KY
-3468658432,3468682399,US
-3468682400,3468682415,HK
-3468682416,3468682447,US
+3468658432,3468682447,US
3468682448,3468682463,SG
3468682464,3468682495,US
3468682496,3468682559,HK
3468682560,3468682575,US
3468682576,3468682591,HK
3468682592,3468682607,US
-3468682608,3468682639,SG
-3468682640,3468682735,HK
+3468682608,3468682671,SG
+3468682672,3468682735,HK
3468682736,3468682751,US
3468682752,3468682911,HK
3468682912,3468682927,US
@@ -131248,7 +134137,9 @@
3468688912,3468688927,NL
3468688928,3468688943,US
3468688944,3468688959,IE
-3468688960,3468977919,US
+3468688960,3468802303,US
+3468802304,3468802559,CA
+3468802560,3468977919,US
3468978176,3469032191,US
3469032448,3469055743,US
3469055744,3469055999,CA
@@ -131306,8 +134197,7 @@
3470755840,3470756095,MU
3470756096,3470761983,US
3470761984,3470770175,CA
-3470770176,3470778367,US
-3470786560,3470794751,US
+3470770176,3470794751,US
3470794752,3470802943,PA
3470802944,3470884863,US
3470884864,3470885887,HK
@@ -131332,26 +134222,17 @@
3471558656,3471560703,CA
3471560704,3471570943,US
3471570944,3471572991,CA
-3471572992,3472245759,US
-3472245760,3472245760,GB
-3472245761,3472246783,US
-3472246784,3472246784,GB
-3472246785,3472248319,US
-3472248320,3472248320,GB
-3472248321,3472249343,US
+3471572992,3472249343,US
3472249344,3472249599,CA
-3472249600,3472250367,US
-3472250368,3472250368,GB
-3472250369,3472252415,US
-3472252416,3472252416,GB
-3472252417,3472256511,US
-3472256512,3472256767,GB
-3472256768,3472259583,US
-3472259584,3472259584,GB
-3472259585,3472375807,US
+3472249600,3472257599,US
+3472257600,3472257631,MX
+3472257632,3472257663,MY
+3472257664,3472375807,US
3472375808,3472392191,PR
3472392192,3472408575,CA
-3472408576,3472721919,US
+3472408576,3472678911,US
+3472678912,3472687103,PL
+3472687104,3472721919,US
3472721920,3472723967,CA
3472723968,3473039359,US
3473039360,3473040639,BM
@@ -131423,9 +134304,8 @@
3475909144,3475909359,US
3475909360,3475909367,IE
3475909368,3475910655,US
-3475910656,3475911167,SG
-3475911296,3475911487,SG
-3475911488,3475911551,HK
+3475910656,3475911519,SG
+3475911520,3475911551,HK
3475911552,3475912959,SG
3475912960,3475913215,US
3475913216,3475914751,SG
@@ -131492,7 +134372,9 @@
3475953024,3475953663,US
3475953664,3475953919,IE
3475953920,3475954175,SG
-3475954176,3475955711,US
+3475954176,3475954547,US
+3475954548,3475954551,PT
+3475954552,3475955711,US
3475955712,3475959807,SG
3475959808,3475996671,US
3475996672,3476029439,CA
@@ -131504,7 +134386,9 @@
3476447232,3476455423,CA
3476455424,3476881407,US
3476881408,3476946943,CA
-3476946944,3477384735,US
+3476946944,3477384711,US
+3477384712,3477384719,CN
+3477384720,3477384735,US
3477384736,3477384743,IE
3477384744,3477384783,US
3477384784,3477384799,IE
@@ -131686,7 +134570,9 @@
3481812992,3481822063,CA
3481822064,3481822079,US
3481822080,3481829375,CA
-3481829376,3481937919,US
+3481829376,3481843199,US
+3481843200,3481843711,GB
+3481843712,3481937919,US
3481937920,3481938943,GB
3481938944,3481951977,US
3481951978,3481951978,DE
@@ -131790,11 +134676,7 @@
3482048000,3482048511,US
3482048512,3482048767,CA
3482048768,3482049791,US
-3482049792,3482050559,CA
-3482050560,3482051327,US
-3482051328,3482051583,CA
-3482051584,3482051839,US
-3482051840,3482052863,CA
+3482049792,3482052863,CA
3482052864,3482053631,US
3482053632,3482053887,CA
3482053888,3482053999,US
@@ -131810,8 +134692,10 @@
3482779648,3482910719,US
3482910720,3482927103,CA
3482927104,3483025407,US
-3483025408,3483037695,DE
-3483037696,3483435007,US
+3483025408,3483041791,DE
+3483041792,3483296004,US
+3483296005,3483296005,BE
+3483296006,3483435007,US
3483435008,3483533311,CA
3483533312,3483631615,US
3483631616,3483697151,CA
@@ -131820,9 +134704,7 @@
3483791624,3483791631,US
3483791632,3483791815,PR
3483791816,3483791823,US
-3483791824,3483793919,PR
-3483793920,3483794431,US
-3483794432,3483795455,PR
+3483791824,3483795455,PR
3483795456,3483828223,US
3483828224,3483836415,CA
3483836416,3483844607,US
@@ -131947,9 +134829,7 @@
3485969152,3485969152,GB
3485969153,3485969663,US
3485969664,3485969664,GB
-3485969665,3485969919,US
-3485969920,3485969920,GB
-3485969921,3485970431,US
+3485969665,3485970431,US
3485970432,3485970943,CA
3485970944,3485972991,US
3485972992,3485973247,CA
@@ -132269,7 +135149,11 @@
3489398784,3489399039,IT
3489399040,3489464319,US
3489464320,3489529855,CA
-3489529856,3489562623,US
+3489529856,3489535999,US
+3489536000,3489538047,IE
+3489538048,3489547263,US
+3489547264,3489548287,IE
+3489548288,3489562623,US
3489566720,3489575935,US
3489575936,3489576191,CN
3489576192,3489576703,US
@@ -132305,13 +135189,11 @@
3490265344,3490267135,CO
3490267136,3490488319,US
3490488320,3490489343,PR
-3490489344,3490703615,US
+3490489344,3490702847,US
+3490702848,3490703103,AS
+3490703104,3490703615,US
3490703616,3490703871,PR
-3490703872,3490786047,US
-3490786048,3490786303,PR
-3490786304,3490879231,US
-3490879232,3490879487,PR
-3490879488,3491381247,US
+3490703872,3491381247,US
3491381248,3491389439,BM
3491389440,3491476991,US
3491476992,3491478527,VI
@@ -132336,15 +135218,21 @@
3492812760,3492812763,JP
3492812764,3492845823,US
3492845824,3492846079,CH
-3492846080,3492866047,US
+3492846080,3492863999,US
+3492864000,3492865023,CA
+3492865024,3492866047,US
3492866048,3492868095,GB
3492868096,3492877954,US
3492877955,3492877955,CA
-3492877956,3492894015,US
+3492877956,3492880745,US
+3492880746,3492880746,ES
+3492880747,3492894015,US
3492894016,3492894207,GB
3492894208,3492896767,US
3492896768,3492897791,GB
-3492897792,3492906495,US
+3492897792,3492904217,US
+3492904218,3492904218,AT
+3492904219,3492906495,US
3492906752,3492909989,US
3492909990,3492909990,DE
3492909991,3492912127,US
@@ -132352,9 +135240,13 @@
3492912384,3492921855,US
3492921856,3492922111,VI
3492922112,3492926079,US
-3492926096,3492933376,US
+3492926096,3492931583,US
+3492931584,3492933119,CA
+3492933120,3492933375,US
+3492933376,3492933376,CA
3492933377,3492933377,CH
-3492933378,3492939022,US
+3492933378,3492933631,CA
+3492933632,3492939022,US
3492939023,3492939023,DE
3492939024,3492944127,US
3492944128,3492944383,VE
@@ -132364,13 +135256,17 @@
3492957696,3492958207,VI
3492958208,3492962303,US
3492962304,3492963327,GB
-3492963328,3492994047,US
+3492963328,3492969471,US
+3492969472,3492969727,VI
+3492969728,3492994047,US
3492994048,3492995071,GB
3492995072,3492998655,US
3492998656,3492999136,GB
3492999137,3492999137,US
3492999138,3492999167,GB
-3492999168,3493039359,US
+3492999168,3493007359,US
+3493007360,3493008383,GB
+3493008384,3493039359,US
3493039360,3493039615,AR
3493039616,3493073151,US
3493073152,3493073407,BO
@@ -132384,8 +135280,7 @@
3493140224,3493140479,DE
3493140480,3493244927,US
3493244928,3493249023,PR
-3493249024,3493863423,US
-3493864448,3493866495,US
+3493249024,3493866495,US
3493866496,3493867519,VG
3493867520,3493881855,US
3493881856,3493882879,CA
@@ -132414,7 +135309,8 @@
3494011088,3494011095,US
3494011136,3494011231,US
3494011232,3494011247,HK
-3494011264,3494014975,US
+3494011264,3494011903,US
+3494012928,3494014975,US
3494014976,3494017023,CA
3494017024,3494043647,US
3494043648,3494045695,CA
@@ -132446,15 +135342,15 @@
3494184960,3494187007,CA
3494187008,3494191359,US
3494191360,3494191615,DE
-3494191616,3494191626,US
-3494191627,3494191627,GB
-3494191628,3494191871,US
+3494191616,3494191871,GB
3494191872,3494192127,NL
3494192128,3494192383,US
3494192384,3494192639,JP
3494192640,3494197247,US
3494197248,3494198271,CA
-3494198272,3494244351,US
+3494198272,3494211583,US
+3494211584,3494212607,NL
+3494212608,3494244351,US
3494244352,3494246399,CA
3494246400,3494247423,US
3494247424,3494250495,CA
@@ -132524,9 +135420,7 @@
3494627328,3494628351,BM
3494628352,3494651903,US
3494651904,3494652927,CA
-3494652928,3494655359,US
-3494655360,3494655423,GB
-3494655424,3494655743,US
+3494652928,3494655743,US
3494655744,3494655759,GB
3494655760,3494660095,US
3494660096,3494661119,CA
@@ -132562,19 +135456,21 @@
3494862848,3494863871,DM
3494863872,3494866943,US
3494866944,3494867967,CA
-3494867968,3494874111,US
+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
+3494917120,3494918143,CA
+3494918144,3494928383,US
3494928384,3494930431,CA
3494930432,3494938623,US
3494938624,3494939647,CA
-3494939648,3494950655,US
+3494939648,3494948863,US
+3494949888,3494950655,US
3494950656,3494950911,PH
3494950912,3494964223,US
3494964224,3494965247,PR
@@ -132608,7 +135504,8 @@
3495090176,3495091199,KY
3495091200,3495098367,US
3495098368,3495100415,CA
-3495100416,3495120895,US
+3495100416,3495100927,IE
+3495100928,3495120895,US
3495120896,3495122943,AG
3495122944,3495153663,US
3495153664,3495155711,CA
@@ -132661,7 +135558,8 @@
3495475200,3495477247,CA
3495477248,3495478271,US
3495478272,3495479295,CA
-3495479296,3495505919,US
+3495479296,3495481343,US
+3495483392,3495505919,US
3495505920,3495507967,CA
3495507968,3495515135,US
3495515136,3495516159,CA
@@ -132683,7 +135581,9 @@
3495618560,3495619583,CA
3495619584,3495620607,US
3495620608,3495622655,CA
-3495622656,3495673855,US
+3495622656,3495651327,US
+3495653376,3495654399,CA
+3495654400,3495673855,US
3495673856,3495674879,MF
3495674880,3495675162,VG
3495675163,3495675163,US
@@ -132705,7 +135605,9 @@
3495749632,3495749856,CA
3495749857,3495749861,RU
3495749862,3495750655,CA
-3495750656,3495815167,US
+3495750656,3495758335,US
+3495758336,3495758847,CA
+3495758848,3495815167,US
3495815168,3495817215,CA
3495817216,3495828479,US
3495828480,3495829503,CA
@@ -132833,22 +135735,11 @@
3499436032,3499436287,DE
3499436288,3499450367,US
3499450368,3499451391,IN
-3499451392,3499705343,US
-3499705344,3499705855,TZ
+3499451392,3499705855,US
3499705856,3499706367,MG
3499706368,3499986943,US
3499986944,3499988991,KY
-3499988992,3500015871,US
-3500015872,3500016127,AG
-3500016128,3500016383,US
-3500016384,3500016639,KN
-3500016640,3500016895,US
-3500016896,3500017151,DM
-3500017152,3500018943,US
-3500018944,3500019199,LC
-3500019200,3500019455,US
-3500019456,3500019711,LC
-3500019712,3500126207,US
+3499988992,3500126207,US
3500126208,3500126463,SE
3500126464,3500126719,GB
3500126720,3500351487,US
@@ -132968,9 +135859,13 @@
3507012608,3507012639,GR
3507012640,3507025407,US
3507025408,3507025663,IQ
-3507025664,3507054591,US
+3507025664,3507037183,US
+3507037184,3507037439,DE
+3507037440,3507054591,US
3507054592,3507055615,CN
-3507055616,3507060735,US
+3507055616,3507055903,US
+3507055904,3507055911,HK
+3507055912,3507060735,US
3507060736,3507068927,CN
3507068928,3507290111,US
3507290112,3507355647,AR
@@ -133352,11 +136247,15 @@
3510788448,3510788479,GB
3510788480,3510844415,US
3510844416,3510844927,CA
-3510844928,3511140351,US
+3510844928,3510935551,US
+3510935552,3510943743,CA
+3510943744,3511140351,US
3511140352,3511156735,CA
3511156736,3511257855,US
3511257856,3511258111,CN
-3511258112,3511812095,US
+3511258112,3511314215,US
+3511314216,3511314223,CA
+3511314224,3511812095,US
3511812096,3511844863,CA
3511844864,3512012095,US
3512012096,3512012159,GB
@@ -133454,11 +136353,7 @@
3512397824,3512401919,CA
3512401920,3512418303,US
3512418304,3512451071,CA
-3512451072,3512465407,PR
-3512465408,3512465663,US
-3512465664,3512466687,PR
-3512466688,3512466943,US
-3512466944,3512467455,PR
+3512451072,3512467455,PR
3512467456,3512532991,US
3512532992,3512598527,GB
3512598528,3512647679,US
@@ -133613,9 +136508,7 @@
3517054976,3517095935,US
3517095936,3517100031,CA
3517100032,3517112319,US
-3517112320,3517116159,CA
-3517116160,3517116415,US
-3517116416,3517120511,CA
+3517112320,3517120511,CA
3517120512,3517233151,US
3517233152,3517235199,GU
3517235200,3517382655,US
@@ -133627,11 +136520,7 @@
3517385440,3517385471,US
3517385472,3517385727,CA
3517385728,3517385983,US
-3517385984,3517387263,CA
-3517387264,3517387519,US
-3517387520,3517387775,CA
-3517387776,3517388287,US
-3517388288,3517388799,CA
+3517385984,3517388799,CA
3517388800,3517389311,US
3517389312,3517389567,CA
3517389568,3517389823,US
@@ -133864,7 +136753,9 @@
3519901696,3519930367,US
3519934464,3519938559,CA
3519938560,3519946751,IL
-3519946752,3519967231,US
+3519946752,3519948287,US
+3519948288,3519948799,DE
+3519948800,3519967231,US
3519967232,3519969279,CA
3519969280,3519971071,US
3519971072,3519971327,CA
@@ -133887,7 +136778,8 @@
3520937984,3520954367,CA
3520954368,3520994815,US
3520994816,3520995071,GB
-3520995072,3520999423,US
+3520995072,3520995135,JP
+3520995136,3520999423,US
3520999424,3521003519,CA
3521003520,3521028095,US
3521028096,3521032191,CA
@@ -133932,9 +136824,7 @@
3522101248,3522109439,CA
3522109440,3522118143,US
3522118144,3522118655,GB
-3522118656,3522118911,US
-3522118912,3522119679,GB
-3522119680,3522119935,US
+3522118656,3522119935,US
3522119936,3522120191,LY
3522120192,3522120447,US
3522120448,3522121215,AE
@@ -133959,7 +136849,9 @@
3522174976,3522179071,BM
3522179072,3522195455,US
3522195456,3522199551,CA
-3522199552,3522854911,US
+3522199552,3522816767,US
+3522816768,3522817023,CA
+3522817024,3522854911,US
3522854912,3522871295,CA
3522871296,3522893823,US
3522893824,3522894847,CA
@@ -134114,10 +137006,11 @@
3524282368,3524288511,IN
3524288512,3524289535,HK
3524289536,3524290559,IN
-3524290560,3524291583,CN
+3524290560,3524291327,CN
+3524291328,3524291583,TW
3524291584,3524294655,IN
3524294656,3524295679,SG
-3524295680,3524296703,PH
+3524295680,3524296703,MY
3524296704,3524313087,CN
3524313088,3524329471,KR
3524329472,3524362239,TW
@@ -134294,7 +137187,14 @@
3526926336,3526934527,JP
3526934528,3526942719,CN
3526942720,3526950911,AU
-3526950912,3527002111,JP
+3526950912,3526951935,MY
+3526951936,3526952959,JP
+3526952960,3526953983,ID
+3526953984,3526971439,JP
+3526971440,3526971443,HK
+3526971444,3526971667,JP
+3526971668,3526971671,HK
+3526971672,3527002111,JP
3527002112,3527003647,IN
3527003648,3527004159,JP
3527004160,3527008255,ID
@@ -134351,13 +137251,15 @@
3534758976,3534759039,PH
3534759040,3534759167,AU
3534759168,3534759215,JP
-3534759216,3534760447,AU
+3534759216,3534759963,AU
+3534759964,3534759967,US
+3534759968,3534760447,AU
3534760448,3534760959,NZ
3534760960,3534761983,AU
3534761984,3534763775,HK
-3534764032,3534785279,HK
-3534785280,3534785535,SG
-3534785536,3534786815,HK
+3534764032,3534785043,HK
+3534785044,3534785047,SG
+3534785048,3534786815,HK
3534786816,3534787327,MY
3534787328,3534787583,TH
3534787584,3534863443,HK
@@ -134430,7 +137332,9 @@
3541565440,3541696511,MY
3541696512,3542089727,AU
3542089728,3542847487,KR
-3542847488,3542851583,US
+3542847488,3542851071,US
+3542851072,3542851327,DE
+3542851328,3542851583,US
3542851584,3544186879,KR
3544186880,3544711167,CN
3544711168,3545235455,TW
@@ -134530,7 +137434,9 @@
3557343232,3557351423,DE
3557351424,3557356543,RU
3557356544,3557357311,NL
-3557357312,3557359615,RU
+3557357312,3557358079,RU
+3557358080,3557358847,NL
+3557358848,3557359615,RU
3557359616,3557359991,JE
3557359992,3557359999,GB
3557360000,3557360047,JE
@@ -134629,7 +137535,9 @@
3557892096,3557900287,IE
3557900288,3557916671,AT
3557916672,3557924863,NO
-3557924864,3557933055,FI
+3557924864,3557928959,AX
+3557928960,3557931007,FI
+3557931008,3557933055,AX
3557933056,3557941247,IT
3557941248,3557957631,DE
3557957632,3557965823,SI
@@ -134670,8 +137578,8 @@
3558178816,3558187007,BG
3558187008,3558195199,DE
3558195200,3558196327,GB
-3558196328,3558196343,IT
-3558196344,3558197247,GB
+3558196328,3558196351,IT
+3558196352,3558197247,GB
3558197248,3558199295,US
3558199296,3558203391,GB
3558203392,3558211583,ES
@@ -134681,18 +137589,22 @@
3558230016,3558231039,PL
3558231040,3558231551,RU
3558231552,3558231807,SK
-3558231808,3558232063,FR
+3558231808,3558232063,RU
3558232064,3558232575,LB
3558232576,3558236159,RU
3558236160,3558244351,GB
3558244352,3558252543,IT
3558252544,3558260735,KE
3558260736,3558268927,UA
-3558268928,3558273279,GI
-3558273280,3558273535,GB
-3558273536,3558275839,GI
+3558268928,3558269439,GB
+3558269440,3558269695,GI
+3558269696,3558270167,GB
+3558270168,3558270168,GI
+3558270169,3558270463,GB
+3558270464,3558275839,GI
3558275840,3558276095,HK
-3558276096,3558277119,GI
+3558276096,3558276351,GB
+3558276352,3558277119,GI
3558277120,3558285951,GB
3558285952,3558286079,DE
3558286080,3558286591,GB
@@ -134724,11 +137636,7 @@
3558350848,3558359039,RU
3558359040,3558367231,GB
3558367232,3558371327,LT
-3558371328,3558372383,AT
-3558372384,3558372607,BG
-3558372608,3558372735,AT
-3558372736,3558372863,ES
-3558372864,3558375423,AT
+3558371328,3558375423,AT
3558375424,3558383615,CZ
3558383616,3558391807,HU
3558391808,3558399999,LU
@@ -134784,7 +137692,9 @@
3558842368,3558850559,SE
3558850560,3558851327,GB
3558851328,3558851335,ES
-3558851336,3558854135,GB
+3558851336,3558851815,GB
+3558851816,3558851823,ES
+3558851824,3558854135,GB
3558854136,3558854143,ES
3558854144,3558856703,GB
3558856704,3558858751,US
@@ -134850,8 +137760,8 @@
3559164160,3559178239,GB
3559178240,3559186431,LB
3559186432,3559194623,RU
-3559194624,3559197535,SE
-3559197536,3559197567,FI
+3559194624,3559197551,SE
+3559197552,3559197567,FI
3559197568,3559200143,SE
3559200144,3559200151,FI
3559200152,3559200255,SE
@@ -135341,7 +138251,7 @@
3560941088,3560941091,DE
3560941092,3560941095,BE
3560941096,3560941099,AT
-3560941100,3560941103,IT
+3560941100,3560941103,DE
3560941104,3560941107,FR
3560941108,3560941119,DE
3560941120,3560941123,BE
@@ -135755,7 +138665,7 @@
3560943196,3560943197,IT
3560943198,3560943198,DE
3560943199,3560943199,PT
-3560943200,3560943200,AT
+3560943200,3560943200,DE
3560943201,3560943201,IT
3560943202,3560943202,IL
3560943203,3560943204,DE
@@ -135985,8 +138895,7 @@
3560943526,3560943526,IT
3560943527,3560943529,DE
3560943530,3560943530,CH
-3560943531,3560943532,DE
-3560943533,3560943533,HU
+3560943531,3560943533,DE
3560943534,3560943534,BY
3560943535,3560943535,FR
3560943536,3560943536,BE
@@ -136381,50 +139290,50 @@
3560944880,3560944883,DE
3560944884,3560944887,ES
3560944888,3560944891,CH
-3560944892,3560944895,DE
-3560944896,3560944899,TW
+3560944892,3560944899,DE
3560944900,3560944903,SG
3560944904,3560944907,MY
-3560944908,3560944919,SG
-3560944920,3560944923,MY
+3560944908,3560944915,DE
+3560944916,3560944919,SG
+3560944920,3560944923,DE
3560944924,3560944927,CN
-3560944928,3560944931,MY
+3560944928,3560944931,DE
3560944932,3560944935,SG
3560944936,3560944943,CN
3560944944,3560944947,MY
-3560944948,3560944951,SG
-3560944952,3560944955,TW
+3560944948,3560944955,DE
3560944956,3560944959,SG
-3560944960,3560944963,IN
+3560944960,3560944963,DE
3560944964,3560944967,MY
3560944968,3560944971,SG
3560944972,3560944975,CN
-3560944976,3560944987,IN
+3560944976,3560944979,IN
+3560944980,3560944983,DE
+3560944984,3560944987,IN
3560944988,3560944991,SG
3560944992,3560944995,MY
3560944996,3560944999,SG
3560945000,3560945003,MY
-3560945004,3560945007,IN
+3560945004,3560945007,DE
3560945008,3560945011,SG
-3560945012,3560945015,DE
-3560945016,3560945027,IN
+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,IN
+3560945048,3560945059,DE
3560945060,3560945063,SG
3560945064,3560945067,MY
3560945068,3560945075,IN
-3560945076,3560945083,CN
-3560945084,3560945087,IN
-3560945088,3560945091,DE
+3560945076,3560945091,DE
3560945092,3560945095,SG
3560945096,3560945099,CN
3560945100,3560945103,SG
3560945104,3560945107,MY
-3560945108,3560945111,TW
+3560945108,3560945111,DE
3560945112,3560945115,SG
3560945116,3560945119,IN
3560945120,3560945123,CN
@@ -136434,31 +139343,24 @@
3560945140,3560945143,SG
3560945144,3560945147,IN
3560945148,3560945151,SG
-3560945152,3560945153,DE
-3560945154,3560945156,AU
-3560945157,3560945157,NZ
-3560945158,3560945167,AU
-3560945168,3560945168,DE
-3560945169,3560945169,AU
-3560945170,3560945191,DE
-3560945192,3560945192,AU
-3560945193,3560945194,DE
-3560945195,3560945195,AU
-3560945196,3560945204,DE
-3560945205,3560945205,AU
-3560945206,3560945206,IN
-3560945207,3560945209,AU
-3560945210,3560945227,DE
-3560945228,3560945231,IN
-3560945232,3560945267,DE
-3560945268,3560945271,AU
-3560945272,3560945275,DE
-3560945276,3560945279,AU
-3560945280,3560945355,JP
+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,3560945403,JP
-3560945404,3560945407,TH
-3560945408,3560945409,DE
+3560945360,3560945379,JP
+3560945380,3560945387,DE
+3560945388,3560945403,JP
+3560945404,3560945409,DE
3560945410,3560945410,MY
3560945411,3560945411,TW
3560945412,3560945412,CN
@@ -136530,23 +139432,21 @@
3560945503,3560945539,DE
3560945540,3560945543,SG
3560945544,3560945551,IN
-3560945552,3560945555,DE
-3560945556,3560945559,IN
-3560945560,3560945563,DE
+3560945552,3560945563,DE
3560945564,3560945567,SG
-3560945568,3560945571,DE
-3560945572,3560945575,IN
+3560945568,3560945575,DE
3560945576,3560945579,SG
3560945580,3560945583,MY
3560945584,3560945587,SG
3560945588,3560945591,TW
-3560945592,3560945603,SG
-3560945604,3560945607,US
-3560945608,3560945611,IN
+3560945592,3560945595,SG
+3560945596,3560945599,DE
+3560945600,3560945603,SG
+3560945604,3560945611,DE
3560945612,3560945619,SG
3560945620,3560945627,CN
3560945628,3560945635,SG
-3560945636,3560945639,CN
+3560945636,3560945639,DE
3560945640,3560945643,SG
3560945644,3560945647,MY
3560945648,3560945651,IN
@@ -136852,13 +139752,32 @@
3560947436,3560947439,DE
3560947440,3560947443,BR
3560947444,3560947455,US
-3560947456,3560947495,JP
-3560947496,3560947499,KR
-3560947500,3560947663,JP
-3560947664,3560947667,DE
-3560947668,3560947686,JP
-3560947687,3560947687,DE
-3560947688,3560947711,JP
+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,NL
@@ -136959,7 +139878,9 @@
3561609216,3561611263,FR
3561611264,3561611519,GB
3561611520,3561611775,FR
-3561611776,3561615359,GB
+3561611776,3561613759,GB
+3561613760,3561613823,FR
+3561613824,3561615359,GB
3561615360,3561617407,FR
3561617408,3561618431,IE
3561618432,3561618877,GB
@@ -137039,7 +139960,9 @@
3562059520,3562061823,ES
3562070016,3562078207,DE
3562078208,3562086399,SK
-3562094592,3562102449,GB
+3562094592,3562094911,GB
+3562094912,3562094975,CH
+3562094976,3562102449,GB
3562102450,3562102450,DE
3562102451,3562110607,GB
3562110608,3562110623,FR
@@ -137088,7 +140011,13 @@
3562422272,3562430463,IR
3562430464,3562431231,UA
3562431232,3562431487,RU
-3562431488,3562438655,UA
+3562431488,3562431999,UA
+3562432000,3562432255,NL
+3562432256,3562433535,UA
+3562433536,3562434047,NL
+3562434048,3562435071,UA
+3562435072,3562435583,NL
+3562435584,3562438655,UA
3562438656,3562463231,DE
3562463232,3562471423,UA
3562471424,3562479615,PL
@@ -137404,7 +140333,9 @@
3564363776,3564371967,UA
3564371968,3564380159,DE
3564380160,3564388351,FI
-3564388352,3564396543,SE
+3564388352,3564391135,SE
+3564391136,3564391167,US
+3564391168,3564396543,SE
3564396544,3564404735,RU
3564404736,3564412927,BG
3564412928,3564421119,IL
@@ -137455,7 +140386,9 @@
3564733260,3564733263,DE
3564733264,3564733343,GB
3564733344,3564733351,DE
-3564733352,3564734207,GB
+3564733352,3564733807,GB
+3564733808,3564733823,DE
+3564733824,3564734207,GB
3564734458,3564734458,DE
3564734464,3564734741,GB
3564734742,3564734742,DE
@@ -137507,14 +140440,12 @@
3564882688,3564883071,GB
3564883072,3564883079,NL
3564883080,3564883199,GB
-3564883200,3564883455,NL
-3564883456,3564886015,GB
+3564883200,3564883967,NL
+3564883968,3564886015,GB
3564886016,3564886527,NL
3564886528,3564886719,GB
3564886720,3564886751,NL
-3564886752,3564888479,GB
-3564888480,3564888495,NL
-3564888496,3564888991,GB
+3564886752,3564888991,GB
3564888992,3564889007,ES
3564889008,3564889633,GB
3564889634,3564889634,NL
@@ -137524,8 +140455,9 @@
3564892160,3564896255,NL
3564896256,3564904447,RU
3564904448,3564912639,DE
-3564912640,3564915711,NL
-3564915712,3564916735,IN
+3564912640,3564914687,NL
+3564914688,3564915711,GB
+3564915712,3564916735,US
3564916736,3564917759,MX
3564917760,3564918783,US
3564918784,3564920831,IT
@@ -137759,7 +140691,9 @@
3567173632,3567239167,GB
3567239168,3567241215,NL
3567241472,3567255551,NL
-3567255552,3567321087,PL
+3567255552,3567263743,PL
+3567263744,3567271935,ES
+3567271936,3567321087,PL
3567321088,3567353855,GB
3567353856,3567386623,CH
3567386624,3567388351,GB
@@ -137804,7 +140738,9 @@
3567490048,3567490303,ES
3567490304,3567499007,GB
3567499008,3567499135,ES
-3567499136,3567500543,GB
+3567499136,3567499519,GB
+3567499520,3567499775,ES
+3567499776,3567500543,GB
3567500544,3567500799,ES
3567500800,3567502615,GB
3567502616,3567502623,ES
@@ -137875,9 +140811,7 @@
3568484352,3568486655,NL
3568486912,3568492543,NL
3568492544,3568500735,RS
-3568500736,3568510975,IL
-3568510976,3568511487,SY
-3568511488,3568566271,IL
+3568500736,3568566271,IL
3568566272,3568585471,FR
3568585728,3568599039,FR
3568599040,3568631807,PL
@@ -138250,8 +141184,11 @@
3572355072,3572356095,CH
3572356096,3572357119,GB
3572357120,3572358143,NL
-3572358144,3572360191,GB
-3572360192,3572361215,ES
+3572358144,3572359167,GB
+3572359168,3572360191,US
+3572360192,3572360831,ES
+3572360832,3572360895,MX
+3572360896,3572361215,ES
3572361216,3572362239,LT
3572362240,3572363263,ES
3572363264,3572364287,RS
@@ -138324,7 +141261,9 @@
3574174840,3574174847,ES
3574174848,3574182904,GB
3574182905,3574182905,ES
-3574182906,3574186799,GB
+3574182906,3574183423,GB
+3574183424,3574183679,ES
+3574183680,3574186799,GB
3574186800,3574186815,ES
3574186816,3574187007,GB
3574187008,3574188031,ES
@@ -138347,8 +141286,8 @@
3574530208,3574530239,DE
3574530240,3574594559,SE
3574594560,3574595583,GB
-3574595584,3574596863,GP
-3574596864,3574597119,MQ
+3574595584,3574596607,GP
+3574596608,3574597119,MQ
3574597120,3574598655,GP
3574598656,3574599679,MQ
3574599680,3574603775,GP
@@ -138361,7 +141300,9 @@
3574792192,3574824959,CZ
3574824960,3574830079,GB
3574830080,3574831103,NL
-3574831104,3574842367,GB
+3574831104,3574841629,GB
+3574841630,3574841630,NL
+3574841631,3574842367,GB
3574842368,3574842623,NL
3574842624,3574857727,GB
3574857728,3574923263,DE
@@ -138392,7 +141333,9 @@
3575624960,3575631103,GB
3575631360,3575638181,GB
3575638183,3575644159,GB
-3575644160,3575646975,FR
+3575644160,3575646303,FR
+3575646304,3575646319,ES
+3575646320,3575646975,FR
3575646976,3575647231,GB
3575647232,3575648223,FR
3575648224,3575648255,PT
@@ -138418,9 +141361,7 @@
3575658304,3575658367,FI
3575658368,3575659007,FR
3575659008,3575659071,ES
-3575659072,3575659167,FR
-3575659168,3575659183,FI
-3575659184,3575659863,FR
+3575659072,3575659863,FR
3575659864,3575659867,GB
3575659868,3575660155,FR
3575660156,3575660159,GB
@@ -138440,9 +141381,7 @@
3575671616,3575671679,FI
3575671680,3575671855,FR
3575671856,3575671871,GB
-3575671872,3575672879,FR
-3575672880,3575672895,GB
-3575672896,3575673087,FR
+3575671872,3575673087,FR
3575673088,3575673343,GB
3575673344,3575676255,FR
3575676256,3575676271,GB
@@ -138747,7 +141686,10 @@
3578363904,3578396671,NL
3578396672,3578462207,TR
3578462208,3578527743,NL
-3578527744,3578658815,PL
+3578527744,3578576895,PL
+3578576896,3578593279,ES
+3578593280,3578626047,PL
+3578626048,3578658815,ES
3578658816,3578724351,GB
3578724352,3578732543,RU
3578732544,3578740735,IE
@@ -138921,7 +141863,9 @@
3579838464,3580039167,ES
3580039168,3580039199,NL
3580039200,3580039231,AT
-3580039232,3580039515,ES
+3580039232,3580039247,ES
+3580039248,3580039423,IT
+3580039424,3580039515,ES
3580039516,3580039551,NL
3580039552,3580100607,ES
3580100608,3580108799,LV
@@ -138934,7 +141878,9 @@
3580135936,3580136447,SE
3580136448,3580141567,HR
3580141568,3580142591,LV
-3580142592,3580149759,SE
+3580142592,3580143615,SE
+3580143616,3580145663,LV
+3580145664,3580149759,SE
3580149760,3580166143,EE
3580166144,3580198911,SE
3580198912,3580199935,LV
@@ -138944,8 +141890,7 @@
3580203648,3580203775,AT
3580203776,3580204031,SE
3580204032,3580204543,LT
-3580204544,3580205055,NL
-3580205056,3580206079,SE
+3580204544,3580206079,SE
3580206080,3580207103,HR
3580207104,3580208127,LV
3580208128,3580209151,EE
@@ -138971,16 +141916,14 @@
3580244992,3580246015,LT
3580246016,3580248063,LV
3580248064,3580254207,EE
-3580254208,3580259327,LV
-3580259328,3580260351,SE
+3580254208,3580260351,LV
3580260352,3580265471,AT
3580265472,3580265727,SE
3580265728,3580268543,EE
3580268544,3580272639,LV
3580272640,3580280831,SE
-3580280832,3580289023,NL
-3580289024,3580297215,HR
-3580297216,3580329983,NL
+3580280832,3580297215,HR
+3580297216,3580329983,SE
3580329984,3580338175,EE
3580338176,3580338687,SE
3580338688,3580339199,HR
@@ -139022,9 +141965,7 @@
3580698624,3580702719,PL
3580702720,3580706815,RU
3580706816,3580708863,KG
-3580708864,3580709887,RU
-3580709888,3580710399,US
-3580710400,3580710911,RU
+3580708864,3580710911,RU
3580710912,3580715007,UA
3580715008,3580719103,RU
3580719104,3580723199,NL
@@ -139072,7 +142013,11 @@
3582074880,3582077439,GB
3582077440,3582077471,DE
3582077472,3582083071,GB
-3582083072,3582091263,BG
+3582083072,3582085631,BG
+3582085632,3582085887,DK
+3582085888,3582087167,BG
+3582087168,3582089215,DK
+3582089216,3582091263,BG
3582091264,3582099455,QA
3582099456,3582107647,GB
3582107648,3582115839,NL
@@ -139190,7 +142135,9 @@
3582861312,3582869503,RU
3582869504,3582877695,NO
3582877696,3582885887,AT
-3582885888,3582894079,TR
+3582885888,3582892031,TR
+3582892032,3582892543,US
+3582892544,3582894079,TR
3582894080,3582902271,CH
3582902272,3582910463,RU
3582910464,3582916607,SI
@@ -139337,8 +142284,7 @@
3583959040,3583967231,NO
3583967232,3583969279,TR
3583969280,3583969791,FR
-3583969792,3583970815,GB
-3583970816,3583971327,US
+3583969792,3583971327,US
3583971328,3583973887,NL
3583973888,3583974399,IT
3583974400,3583975423,TR
@@ -139545,9 +142491,11 @@
3585523712,3585531903,LV
3585531904,3585540095,AT
3585540096,3585548287,DE
-3585548288,3585553151,RU
-3585553152,3585553407,NL
-3585553408,3585556479,RU
+3585548288,3585550335,NL
+3585550336,3585550399,DE
+3585550400,3585553919,NL
+3585553920,3585555007,RU
+3585555008,3585556479,NL
3585556480,3585564671,DE
3585564672,3585572863,RU
3585572864,3585581055,IT
@@ -139680,13 +142628,12 @@
3586162688,3586179071,FI
3586179072,3586195455,ES
3586195456,3586203647,RU
-3586203648,3586205695,KE
+3586203648,3586205695,ZA
3586205696,3586207743,BW
3586207744,3586207999,ZA
-3586208256,3586208767,ZA
-3586208768,3586211071,KE
+3586208256,3586211071,ZA
3586211072,3586211327,BW
-3586211328,3586211839,KE
+3586211328,3586211839,ZA
3586211840,3586228223,CH
3586228224,3586244607,BE
3586244608,3586246655,NL
@@ -139706,7 +142653,9 @@
3586342912,3586359295,ES
3586359296,3586375679,PL
3586375680,3586392063,CZ
-3586392064,3586408447,NL
+3586392064,3586405375,NL
+3586405376,3586406399,RU
+3586406400,3586408447,NL
3586408448,3586424831,BA
3586424832,3586441215,CH
3586441216,3586457599,DE
@@ -139729,10 +142678,7 @@
3586596864,3586605055,GB
3586605056,3586621439,SE
3586621696,3586625535,NL
-3586625536,3586628095,GB
-3586628096,3586628118,NL
-3586628119,3586628119,GB
-3586628120,3586628127,NL
+3586625536,3586628127,GB
3586628128,3586628159,AT
3586628160,3586628191,IE
3586628192,3586628223,NL
@@ -139741,15 +142687,17 @@
3586628288,3586628319,GB
3586628320,3586628351,AT
3586628352,3586629631,GB
-3586629632,3586634047,IE
+3586629632,3586631935,IE
+3586631936,3586632191,CN
+3586632192,3586634047,IE
3586634048,3586634079,NL
3586634080,3586634783,IE
3586634784,3586634815,NL
3586634816,3586634847,IE
3586634848,3586634911,NL
3586634912,3586634943,FI
-3586634944,3586635263,NL
-3586635264,3586635519,IE
+3586634944,3586635007,NL
+3586635008,3586635519,IE
3586635520,3586635775,NL
3586635776,3586637823,IE
3586637824,3586654207,PL
@@ -139798,15 +142746,19 @@
3586850816,3586867199,NO
3586867200,3586883583,FR
3586883584,3586899967,IT
-3586899968,3586911007,DE
-3586911008,3586911039,BE
-3586911040,3586916351,DE
+3586899968,3586910207,DE
+3586910208,3586910719,NL
+3586910720,3586911231,BE
+3586911232,3586916351,DE
3586916352,3586924543,IT
3586924544,3586925695,FI
3586925696,3586925759,AX
3586925760,3586925823,FI
3586925824,3586926079,SE
-3586926080,3586932735,FI
+3586926080,3586926591,FI
+3586926592,3586929663,AX
+3586929664,3586930687,FI
+3586930688,3586932735,AX
3586932736,3586949119,LB
3586949120,3586965503,SE
3586965504,3586981887,NL
@@ -139836,7 +142788,8 @@
3587194880,3587211263,GB
3587211264,3587219455,AT
3587219456,3587227647,RU
-3587227648,3587231231,GB
+3587227648,3587227648,NL
+3587227649,3587231231,GB
3587231232,3587231263,NL
3587231264,3587233087,GB
3587233088,3587233095,NL
@@ -139858,7 +142811,12 @@
3587242672,3587242679,NL
3587242680,3587244031,GB
3587244032,3587260415,IT
-3587260416,3587284991,DE
+3587260416,3587278591,DE
+3587278592,3587279359,PT
+3587279360,3587279615,DE
+3587279616,3587280383,PT
+3587280384,3587281151,DE
+3587281152,3587284991,PT
3587291136,3587292159,FR
3587293184,3587309567,IT
3587309568,3587325951,GB
@@ -139868,7 +142826,11 @@
3587375104,3587383295,TR
3587383296,3587391487,CZ
3587391488,3587407871,KZ
-3587407872,3587420159,BE
+3587407872,3587408127,BE
+3587408128,3587408383,NL
+3587408384,3587415039,BE
+3587415040,3587415807,NL
+3587415808,3587420159,BE
3587420160,3587421183,NL
3587421184,3587421439,BE
3587421440,3587423743,NL
@@ -139983,7 +142945,19 @@
3588751360,3588767743,TR
3588779648,3588779775,GB
3588784128,3588800511,CH
-3588800512,3588816895,RU
+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
@@ -140078,14 +143052,18 @@
3589722032,3589734399,BE
3589734400,3589738495,ZA
3589738496,3589739519,EG
-3589739520,3589742591,ZA
+3589739520,3589740543,GB
+3589740544,3589742591,ZA
3589742592,3589746175,NL
3589746176,3589746687,US
3589746688,3589767167,NL
3589767168,3589810431,RU
3589810432,3589810687,PL
3589810688,3589816319,RU
-3589825792,3589826047,DE
+3589819562,3589819563,GB
+3589825792,3589825807,DE
+3589825808,3589825809,US
+3589825810,3589826047,DE
3589826718,3589826718,AT
3589827584,3589827647,DE
3589827712,3589827839,DE
@@ -140097,7 +143075,13 @@
3589849088,3589865471,GB
3589865472,3589881855,GR
3589881856,3589890047,NL
-3589890048,3589931007,GB
+3589890048,3589904639,GB
+3589904640,3589905151,KZ
+3589905152,3589905407,GB
+3589905408,3589905663,KZ
+3589905664,3589905919,GB
+3589905920,3589906175,KZ
+3589906176,3589931007,GB
3589931008,3589947391,SI
3589947392,3589963775,FI
3589963776,3589980159,ES
@@ -140112,7 +143096,9 @@
3589999032,3589999039,DE
3589999040,3590000191,GB
3590000192,3590000207,DE
-3590000208,3590005055,GB
+3590000208,3590001967,GB
+3590001968,3590001983,IT
+3590001984,3590005055,GB
3590005056,3590005071,DE
3590005072,3590005119,GB
3590005120,3590005135,IT
@@ -140214,8 +143200,8 @@
3624257536,3624271871,US
3624271872,3624272383,SY
3624272384,3624272447,US
-3624272448,3624272451,CA
-3624272452,3624272639,US
+3624272448,3624272455,CA
+3624272456,3624272639,US
3624272640,3624272895,DZ
3624272896,3624281087,US
3624281088,3624281343,HT
@@ -140284,11 +143270,17 @@
3624480768,3624484863,CA
3624484864,3624525823,US
3624529920,3624534015,CA
-3624534016,3624587263,US
+3624534016,3624536063,US
+3624536064,3624538111,IL
+3624538112,3624540671,US
+3624540672,3624541183,GB
+3624541184,3624587263,US
3624587264,3624591359,JM
3624591360,3624592383,US
3624592384,3624593919,CA
-3624593920,3624714239,US
+3624593920,3624595455,US
+3624595456,3624599551,IN
+3624599552,3624714239,US
3624714240,3624722431,SG
3624722432,3624730623,US
3624730624,3624796159,CA
@@ -140318,18 +143310,18 @@
3625295872,3625346047,US
3625346048,3625346303,AR
3625346304,3625418751,US
-3625418752,3625420031,CA
-3625420032,3625420543,US
-3625420544,3625422591,CA
-3625422592,3625422847,US
-3625422848,3625426943,CA
+3625418752,3625426943,CA
3625426944,3625508863,US
3625508864,3625512959,CA
3625512960,3625631743,US
3625631744,3625639935,CA
-3625639936,3626091519,US
+3625639936,3625959423,US
+3625959424,3625963519,GB
+3625963520,3626091519,US
3626091520,3626092031,AR
-3626092032,3626234111,US
+3626092032,3626233655,US
+3626233656,3626233663,GB
+3626233664,3626234111,US
3626234112,3626234367,GB
3626234368,3626270719,US
3626270720,3626287103,CA
@@ -140350,7 +143342,8 @@
3626926080,3626934271,CA
3626934272,3627044863,US
3627044864,3627048959,CA
-3627053056,3627065343,US
+3627048960,3627049983,AG
+3627049984,3627065343,US
3627065344,3627069439,CA
3627069440,3627220223,US
3627220224,3627220479,CA
@@ -140454,7 +143447,12 @@
3628657920,3628658175,BS
3628658176,3628679167,US
3628679168,3628683263,CA
-3628683264,3628834815,US
+3628683264,3628744703,US
+3628744704,3628746751,IL
+3628746752,3628747775,US
+3628747776,3628748287,LU
+3628748288,3628748799,AU
+3628748800,3628834815,US
3628834816,3628843007,CA
3628843008,3628848639,US
3628848896,3629187071,US
@@ -140472,8 +143470,8 @@
3629201936,3629201939,US
3629201940,3629202103,CA
3629202104,3629202107,US
-3629202108,3629203199,CA
-3629203200,3629318143,US
+3629202108,3629203455,CA
+3629203456,3629318143,US
3629318144,3629326335,CA
3629326336,3629539327,US
3629539328,3629547519,CA
@@ -140582,9 +143580,9 @@
3630102784,3630103807,CA
3630103808,3630104063,US
3630104064,3630104575,CA
-3630104576,3630141951,US
-3630141952,3630142207,CA
-3630142208,3630148095,US
+3630104576,3630137343,US
+3630137344,3630145535,CA
+3630145536,3630148095,US
3630148096,3630148607,CA
3630148608,3630148863,US
3630148864,3630149119,CA
@@ -140592,11 +143590,9 @@
3630151680,3630152191,CA
3630152192,3630152703,US
3630152704,3630152959,CA
-3630152960,3630156287,US
-3630156288,3630156543,CA
-3630156544,3630157311,US
-3630157312,3630157567,CA
-3630157568,3630159615,US
+3630152960,3630153727,US
+3630153728,3630157823,CA
+3630157824,3630159615,US
3630159616,3630159871,CA
3630159872,3630160127,US
3630160128,3630160383,CA
@@ -140612,9 +143608,11 @@
3630165504,3630166015,CA
3630166016,3630169855,US
3630169856,3630170111,CA
-3630170112,3630309375,US
+3630170112,3630313471,US
3630313472,3630317567,CA
-3630317568,3630375423,US
+3630317568,3630354431,US
+3630354432,3630358527,BR
+3630358528,3630375423,US
3630375424,3630383103,CA
3630383104,3630391295,US
3630391296,3630395391,CA
@@ -140637,14 +143635,11 @@
3630850048,3630854143,CA
3630854144,3630866431,US
3630866432,3630870527,GT
-3630870528,3630895103,US
-3630895104,3630895104,GB
-3630895105,3630895615,US
+3630870528,3630895615,US
3630895616,3630895871,CA
3630895872,3630897407,US
3630897408,3630897408,GB
-3630897409,3630897663,CA
-3630897664,3630900735,US
+3630897409,3630900735,US
3630900736,3630900991,CA
3630900992,3630905599,US
3630905600,3630905855,CA
@@ -140725,7 +143720,7 @@
3632881664,3632889855,CA
3632889856,3632898047,US
3632898048,3632902143,CA
-3632906240,3632971775,US
+3632902144,3632971775,US
3632971776,3632988159,CA
3632988160,3633029119,US
3633029120,3633029631,PY
@@ -140779,9 +143774,7 @@
3633885184,3633889279,US
3633889280,3633893375,CA
3633893376,3633971199,US
-3633971200,3633974527,CA
-3633974528,3633974783,US
-3633974784,3634020351,CA
+3633971200,3634020351,CA
3634020352,3634037247,US
3634037248,3634037759,CA
3634037760,3634040063,US
@@ -140813,14 +143806,14 @@
3634749440,3634880511,US
3634880512,3634888703,CA
3634888704,3634913279,US
-3634913280,3634914815,CA
-3634914816,3634915071,US
-3634915072,3634915663,CA
+3634913280,3634915663,CA
3634915664,3634915679,US
3634915680,3634921471,CA
3634921472,3634925567,US
3634925568,3634929663,CA
-3634929664,3635044351,US
+3634929664,3635015935,US
+3635015936,3635016191,CA
+3635016192,3635044351,US
3635048448,3635051103,US
3635051104,3635051119,CA
3635051120,3635051439,US
@@ -140831,10 +143824,10 @@
3635142656,3635146751,CA
3635146752,3635159039,US
3635159040,3635163135,CA
-3635163136,3635167487,US
+3635163136,3635167231,US
+3635167232,3635167487,NL
3635167488,3635167743,ES
-3635167744,3635167999,IT
-3635168000,3635171071,US
+3635167744,3635171071,NL
3635171072,3635171327,CA
3635171328,3635187967,US
3635187968,3635188223,CN
@@ -141006,7 +143999,9 @@
3637665792,3637669887,CA
3637669888,3637706751,US
3637706752,3637739519,CA
-3637739520,3638165503,US
+3637739520,3637821439,US
+3637821440,3637829631,CA
+3637829632,3638165503,US
3638165504,3638181887,CA
3638181888,3638214399,US
3638214400,3638214655,GR
@@ -141026,7 +144021,11 @@
3638399744,3638399999,CH
3638400000,3638401087,US
3638401088,3638401119,CA
-3638401120,3638500125,US
+3638401120,3638401151,US
+3638401152,3638401423,CA
+3638401424,3638401443,US
+3638401444,3638403071,CA
+3638403072,3638500125,US
3638500126,3638500126,CA
3638500127,3638509567,US
3638509568,3638534143,CA
@@ -141034,7 +144033,9 @@
3638697984,3638706175,CA
3638706176,3638874111,US
3638874112,3638878207,CA
-3638878208,3638898943,US
+3638878208,3638880511,US
+3638880512,3638880767,CA
+3638880768,3638898943,US
3638898944,3638899455,MX
3638899456,3638984703,US
3638984704,3638992895,GT
@@ -141091,9 +144092,7 @@
3639400448,3639401471,RS
3639401472,3639402239,US
3639402240,3639402495,GH
-3639402496,3639513239,US
-3639513240,3639513243,AE
-3639513244,3639525375,US
+3639402496,3639525375,US
3639529472,3639533567,US
3639533568,3639537663,CA
3639537664,3639550207,US
@@ -141126,9 +144125,7 @@
3639593984,3639595007,GB
3639595008,3639607295,US
3639607296,3639611391,CA
-3639611392,3639656447,US
-3639656448,3639660543,CA
-3639660544,3639664639,US
+3639611392,3639664639,US
3639664640,3639668735,CA
3639668736,3639672831,US
3639672832,3639681023,CL
@@ -141139,6 +144136,7 @@
3639692288,3639704573,US
3639704574,3639704574,GB
3639704575,3639730175,US
+3639730176,3639734271,CA
3639734272,3639736575,US
3639736576,3639736831,HK
3639736832,3639737343,US
@@ -141147,7 +144145,98 @@
3639737375,3639737599,GB
3639737600,3639737629,US
3639737630,3639737630,GB
-3639737631,3639902207,US
+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
@@ -141159,9 +144248,12 @@
3640201216,3640205311,US
3640205312,3640209407,BM
3640209408,3640213503,CA
-3640213504,3640288255,US
+3640213504,3640287231,US
+3640287232,3640287743,HK
+3640287744,3640288255,US
3640288256,3640289279,PH
-3640289280,3640291327,HK
+3640289280,3640290303,HK
+3640290304,3640291327,CN
3640291328,3640312319,US
3640312320,3640312575,NI
3640312576,3640312831,US
@@ -141355,7 +144447,9 @@
3641888768,3641892863,IT
3641892864,3641896959,ES
3641896960,3641901055,BG
-3641901056,3641905151,RO
+3641901056,3641901311,RO
+3641901312,3641901567,US
+3641901568,3641905151,RO
3641905152,3641909247,NL
3641909248,3641913343,AT
3641913344,3641917439,FR
@@ -141408,19 +144502,21 @@
3642032128,3642036223,PS
3642036224,3642040319,HU
3642040320,3642048511,BY
-3642048512,3642048767,IL
+3642048512,3642048767,US
3642048768,3642049023,DE
3642049024,3642049279,CH
3642049280,3642049535,NO
-3642049536,3642050047,GB
+3642049536,3642049791,SE
+3642049792,3642050047,FI
3642050048,3642050303,FR
3642050304,3642050559,GB
3642050560,3642050815,ES
3642050816,3642051071,IT
3642051072,3642051327,CA
-3642051328,3642051583,JP
+3642051328,3642051583,US
3642051584,3642051839,TR
-3642051840,3642056703,GB
+3642051840,3642054399,DE
+3642054400,3642056703,US
3642056704,3642060799,RU
3642060800,3642064895,KE
3642064896,3642068991,IT
@@ -141453,7 +144549,7 @@
3642118144,3642122239,GB
3642122240,3642126335,ES
3642126336,3642130431,IL
-3642130432,3642134527,DE
+3642130432,3642134527,CH
3642134528,3642138623,GB
3642138624,3642142719,RU
3642142720,3642146815,MT
@@ -141564,10 +144660,10 @@
3642535936,3642540031,IS
3642540032,3642544127,SE
3642544128,3642552319,RU
-3642552320,3642553855,UA
-3642553856,3642553936,RU
-3642553937,3642553937,US
-3642553938,3642554367,RU
+3642552320,3642553343,UA
+3642553344,3642553599,RU
+3642553600,3642553855,UA
+3642553856,3642554367,RU
3642554368,3642554623,LT
3642554624,3642554720,UA
3642554721,3642554721,LV
@@ -141588,7 +144684,6 @@
3642609664,3642613759,ZA
3642613760,3642617855,FI
3642617856,3642621951,JO
-3642621952,3642626047,IT
3642626048,3642628607,BE
3642628864,3642630143,BE
3642630144,3642634239,DK
@@ -142222,9 +145317,7 @@
3645764052,3645764052,FR
3645764053,3645764055,DE
3645764056,3645764056,BE
-3645764057,3645764057,DE
-3645764058,3645764058,TR
-3645764059,3645764059,DE
+3645764057,3645764059,DE
3645764060,3645764060,FR
3645764061,3645764061,IT
3645764062,3645764062,SE
@@ -142777,8 +145870,9 @@
3647965696,3647965951,CH
3647965952,3647966207,DE
3647966208,3647967231,GB
-3647967232,3647968255,BE
-3647968256,3647968895,DE
+3647967232,3647967759,DE
+3647967760,3647967775,BE
+3647967776,3647968895,DE
3647968896,3647968911,FR
3647968912,3647969327,DE
3647969328,3647969335,IT
@@ -142837,7 +145931,9 @@
3647994880,3647995391,BE
3647995392,3647995903,DE
3647995904,3648004095,RU
-3648004096,3648007167,GB
+3648004096,3648004837,GB
+3648004838,3648004838,RU
+3648004839,3648007167,GB
3648007168,3648007679,US
3648007680,3648007935,RU
3648007936,3648008191,GB
@@ -142979,7 +146075,9 @@
3648512000,3648516095,NL
3648516096,3648519167,RS
3648519168,3648520191,MK
-3648520192,3648747227,NL
+3648520192,3648745820,NL
+3648745821,3648745821,US
+3648745822,3648747227,NL
3648747228,3648747228,US
3648747229,3648747229,NL
3648747230,3648747230,US
@@ -143202,8 +146300,8 @@
3650921391,3650922799,GB
3650922800,3650922815,FR
3650922816,3650926591,GB
-3650926592,3650929663,ES
-3650929664,3650929831,GB
+3650926592,3650928639,ES
+3650928640,3650929831,GB
3650929832,3650929839,DK
3650929840,3650929847,BE
3650929848,3650929855,FR
@@ -143317,8 +146415,10 @@
3651870720,3651874815,IT
3651874816,3651878911,PL
3651878912,3651883007,IT
-3651883008,3651884287,CD
-3651884288,3651885839,BE
+3651883008,3651884543,CD
+3651884544,3651885055,BE
+3651885056,3651885311,CD
+3651885312,3651885839,BE
3651885840,3651885843,CD
3651885844,3651887103,BE
3651887104,3651891199,GB
@@ -143342,8 +146442,7 @@
3651944448,3651948543,ES
3651948544,3651952639,FO
3651952640,3651954175,AE
-3651954176,3651958783,IR
-3651958784,3651960831,AE
+3651954176,3651960831,IR
3651960832,3651964927,GB
3651964928,3651969023,SK
3651969024,3651977215,DE
@@ -143392,7 +146491,103 @@
3652173824,3652177919,AT
3652177920,3652182015,CY
3652182016,3652190207,DE
-3652190208,3652648959,GB
+3652190208,3652583423,GB
+3652583424,3652583487,FR
+3652583488,3652583503,NL
+3652583504,3652583551,FR
+3652583552,3652583583,FI
+3652583584,3652584447,FR
+3652584448,3652584575,GB
+3652584576,3652584639,IE
+3652584640,3652584895,FR
+3652584896,3652584927,PT
+3652584928,3652584959,FR
+3652584960,3652585023,ES
+3652585024,3652585087,FR
+3652585088,3652585151,ES
+3652585152,3652585791,FR
+3652585792,3652585823,FI
+3652585824,3652585983,FR
+3652585984,3652586047,ES
+3652586048,3652590783,FR
+3652590784,3652590847,ES
+3652590848,3652591615,FR
+3652591616,3652591743,GB
+3652591744,3652593023,FR
+3652593024,3652593055,PT
+3652593056,3652593215,FR
+3652593216,3652593279,IE
+3652593280,3652593407,FR
+3652593408,3652593471,ES
+3652593472,3652593631,FR
+3652593632,3652593663,PT
+3652593664,3652596479,FR
+3652596480,3652596543,ES
+3652596544,3652597887,FR
+3652597888,3652597903,GB
+3652597904,3652608191,FR
+3652608192,3652608223,PT
+3652608224,3652609023,FR
+3652609024,3652609279,GB
+3652609280,3652609503,FR
+3652609504,3652609535,FI
+3652609536,3652609919,FR
+3652609920,3652609983,ES
+3652609984,3652611231,FR
+3652611232,3652611263,PT
+3652611264,3652611679,FR
+3652611680,3652611711,PT
+3652611712,3652612223,FR
+3652612224,3652612287,ES
+3652612288,3652612351,FR
+3652612352,3652612479,GB
+3652612480,3652612543,IE
+3652612544,3652613375,FR
+3652613376,3652613407,FI
+3652613408,3652620671,FR
+3652620672,3652620735,PT
+3652620736,3652620799,FR
+3652620800,3652620831,PT
+3652620832,3652621375,FR
+3652621376,3652621439,ES
+3652621440,3652622271,FR
+3652622272,3652622335,GB
+3652622336,3652631807,FR
+3652631808,3652631823,GB
+3652631824,3652638655,FR
+3652638656,3652638719,ES
+3652638720,3652638815,FR
+3652638816,3652638847,FI
+3652638848,3652638975,GB
+3652638976,3652640575,FR
+3652640576,3652640703,GB
+3652640704,3652640767,FR
+3652640768,3652640831,ES
+3652640832,3652641727,FR
+3652641728,3652641791,GB
+3652641792,3652642111,FR
+3652642112,3652642175,IE
+3652642176,3652642367,FR
+3652642368,3652642431,GB
+3652642432,3652642719,FR
+3652642720,3652642751,PT
+3652642752,3652643583,FR
+3652643584,3652643647,ES
+3652643648,3652644199,FR
+3652644200,3652644215,ES
+3652644216,3652644247,FR
+3652644248,3652644255,ES
+3652644256,3652644351,FR
+3652644352,3652644383,FI
+3652644384,3652645119,FR
+3652645120,3652645503,GB
+3652645504,3652645663,FR
+3652645664,3652645695,FI
+3652645696,3652646015,FR
+3652646016,3652646079,ES
+3652646080,3652646655,FR
+3652646656,3652646719,ES
+3652646720,3652648959,FR
3652648960,3652714495,IE
3652714496,3653238783,DE
3653238784,3653369855,CH
@@ -143769,7 +146964,9 @@
3715653632,3715655679,BD
3715655680,3715657727,IN
3715657728,3715661823,SG
-3715661824,3715672063,AU
+3715661824,3715665919,AU
+3715665920,3715666175,GB
+3715666176,3715672063,AU
3715672064,3715674111,JP
3715674112,3715678207,HK
3715678208,3715694591,PK
diff --git a/src/config/geoip6 b/src/config/geoip6
index 70c6f965c6..529dc8f8f3 100644
--- a/src/config/geoip6
+++ b/src/config/geoip6
@@ -1,4 +1,4 @@
-# Last updated based on February 8 2017 Maxmind GeoLite2 Country
+# Last updated based on May 2 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
@@ -177,15 +177,25 @@
2001:470:1f0b:11d3::,2001:470:1f14:ffff:ffff:ffff:ffff:ffff,US
2001:470:1f15::,2001:470:1f15:b3:ffff:ffff:ffff:ffff,RU
2001:470:1f15:b4::,2001:470:1f15:b4:ffff:ffff:ffff:ffff,NL
-2001:470:1f15:b5::,2001:470:1f15:44f:ffff:ffff:ffff:ffff,RU
+2001:470:1f15:b5::,2001:470:1f15:16b:ffff:ffff:ffff:ffff,RU
+2001:470:1f15:16c::,2001:470:1f15:16c:ffff:ffff:ffff:ffff,NL
+2001:470:1f15:16d::,2001:470:1f15:44f:ffff:ffff:ffff:ffff,RU
2001:470:1f15:450::,2001:470:1f15:450:ffff:ffff:ffff:ffff,NL
-2001:470:1f15:451::,2001:470:1f15:5ab:ffff:ffff:ffff:ffff,RU
+2001:470:1f15:451::,2001:470:1f15:500:ffff:ffff:ffff:ffff,RU
+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,RU
+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,RU
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,RU
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,RU
2001:470:1f15:a5f::,2001:470:1f15:a60:ffff:ffff:ffff:ffff,NL
-2001:470:1f15:a61::,2001:470:1f15:110b:ffff:ffff:ffff:ffff,RU
+2001:470:1f15:a61::,2001:470:1f15:b25:ffff:ffff:ffff:ffff,RU
+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,RU
+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,RU
2001:470:1f15:110c::,2001:470:1f15:110c:ffff:ffff:ffff:ffff,BE
2001:470:1f15:110d::,2001:470:1f15:7fff:ffff:ffff:ffff:ffff,RU
2001:470:1f15:8000::,2001:470:1f1c:ffff:ffff:ffff:ffff:ffff,US
@@ -252,15 +262,21 @@
2001:470:785a::,2001:470:785a:ffff:ffff:ffff:ffff:ffff,AT
2001:470:785b::,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:7ba6:ffff:ffff:ffff:ffff:ffff,US
+2001:470:7a9b::,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: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:7baf:ffff:ffff:ffff:ffff:ffff,US
2001:470:7bb0::,2001:470:7bb0:7fff:ffff:ffff:ffff:ffff,BE
2001:470:7bb0: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:7e38:ffff:ffff:ffff:ffff:ffff,US
+2001:470:7bc1::,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: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:8091:ffff:ffff:ffff:ffff:ffff,US
+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:8091:ffff:ffff:ffff:ffff:ffff,US
2001:470:8092::,2001:470:8092:7fff:ffff:ffff:ffff:ffff,CN
2001:470:8092:8000::,2001:470:80b6:ffff:ffff:ffff:ffff:ffff,US
2001:470:80b7::,2001:470:80b7:7fff:ffff:ffff:ffff:ffff,CN
@@ -294,7 +310,9 @@
2001:470:cd93:8000::,2001:470:cd93:ffff:ffff:ffff:ffff:ffff,FR
2001:470:cd94::,2001:470:d6b8:ffff:ffff:ffff:ffff:ffff,US
2001:470:d6b9::,2001:470:d6b9:7fff:ffff:ffff:ffff:ffff,RU
-2001:470:d6b9:8000::,2001:470:da01:ffff:ffff:ffff:ffff:ffff,US
+2001:470:d6b9:8000::,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: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:dc5c:ffff:ffff:ffff:ffff:ffff,US
2001:470:dc5d::,2001:470:dc5d:7fff:ffff:ffff:ffff:ffff,SE
@@ -459,6 +477,7 @@
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: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
@@ -491,7 +510,9 @@
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:36ff:ffff:ffff:ffff:ffff:ffff,US
+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
@@ -573,6 +594,7 @@
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
@@ -750,6 +772,48 @@
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:433:ffff:ffff:ffff:ffff:ffff,GB
+2001:678:440::,2001:678:440:ffff:ffff:ffff:ffff:ffff,SE
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
@@ -773,7 +837,7 @@
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,ES
+2001:67c:64::,2001:67c:64:ffff:ffff:ffff:ffff:ffff,HU
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
@@ -814,7 +878,6 @@
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,NL
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
@@ -990,6 +1053,7 @@
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
@@ -1022,9 +1086,10 @@
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,NL
+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
@@ -1100,7 +1165,6 @@
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,NO
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
@@ -1179,6 +1243,7 @@
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
@@ -1192,6 +1257,7 @@
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
@@ -1231,7 +1297,6 @@
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,RU
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
@@ -1359,12 +1424,15 @@
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,GB
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,US
@@ -1407,13 +1475,16 @@
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
@@ -1635,6 +1706,7 @@
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
@@ -1680,7 +1752,6 @@
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,UA
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
@@ -1807,7 +1878,6 @@
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
@@ -1858,6 +1928,7 @@
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
@@ -1904,6 +1975,7 @@
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
@@ -1950,6 +2022,7 @@
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
@@ -1975,7 +2048,6 @@
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,BE
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
@@ -2294,7 +2366,6 @@
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:2778::,2001:67c:2778:ffff:ffff:ffff:ffff:ffff,RU
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
@@ -2386,6 +2457,7 @@
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
@@ -2487,6 +2559,7 @@
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
@@ -2503,6 +2576,7 @@
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:2b68::,2001:67c:2b68:ffff:ffff:ffff:ffff:ffff,RO
@@ -2510,6 +2584,7 @@
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
@@ -2526,7 +2601,6 @@
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,UA
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
@@ -2534,6 +2608,7 @@
2001:67c:2bd8::,2001:67c:2bd8:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:2be0::,2001:67c:2be0:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:2be4::,2001:67c:2be4: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
@@ -2656,6 +2731,7 @@
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
@@ -2721,7 +2797,6 @@
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,UA
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
@@ -2732,6 +2807,7 @@
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
@@ -2812,7 +2888,7 @@
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:720:ffff:ffff:ffff:ffff:ffff:ffff,ES
+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:737:ffff:ffff:ffff:ffff:ffff:ffff,AT
2001:738::,2001:738:ffff:ffff:ffff:ffff:ffff:ffff,HU
@@ -2999,11 +3075,16 @@
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: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
@@ -3021,7 +3102,6 @@
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,DE
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
@@ -3094,7 +3174,9 @@
2001:978:2300::,2001:978:2300:7fff:ffff:ffff:ffff:ffff,GB
2001:978:2300:8000::,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:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:978:2a01::,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: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
@@ -3115,7 +3197,7 @@
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:a38:ffff:ffff:ffff:ffff:ffff:ffff,DE
+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
@@ -3162,7 +3244,7 @@
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:b58:ffff:ffff:ffff:ffff:ffff:ffff,SE
+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
@@ -3177,7 +3259,7 @@
2001:bc8::,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:be8:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2001:be8::,2001:bef:ffff:ffff:ffff:ffff:ffff:ffff,SE
2001:bf0::,2001:bf7:130f:ffff:ffff:ffff:ffff:ffff,DE
2001:bf7:1310::,2001:bf7:1310:7fff:ffff:ffff:ffff:ffff,NL
2001:bf7:1310:8000::,2001:bf7:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -3327,7 +3409,6 @@
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:20::,2001:df0:3f:ffff:ffff:ffff:ffff:ffff,AU
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
@@ -3511,7 +3592,6 @@
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:262::,2001:df0:262:ffff:ffff:ffff:ffff:ffff,AU
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
@@ -3549,7 +3629,6 @@
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:2a2::,2001:df0:2a2:ffff:ffff:ffff:ffff:ffff,HK
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
@@ -3606,8 +3685,7 @@
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:311:ffff:ffff:ffff:ffff:ffff,SG
-2001:df0:314::,2001:df0:317:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:300::,2001:df0:317: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
@@ -3697,7 +3775,7 @@
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:1e00:ffff:ffff:ffff:ffff:ffff,AU
+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
@@ -3710,7 +3788,6 @@
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:2b00::,2001:df0:2b00:ffff:ffff:ffff:ffff:ffff,BD
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
@@ -3729,98 +3806,196 @@
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:4000::,2001:df0:4000:ffff:ffff:ffff:ffff:ffff,HK
+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:4600::,2001:df0:4601:ffff:ffff:ffff:ffff:ffff,US
+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:4a00::,2001:df0:4a00:ffff:ffff:ffff:ffff:ffff,PK
+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:5600::,2001:df0:5600:ffff:ffff:ffff:ffff:ffff,MY
+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:5d00: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:c700::,2001:df0:c700:ffff:ffff:ffff:ffff:ffff,SG
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:e00::,2001:df1:e00:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:1200::,2001:df1:1200:ffff:ffff:ffff:ffff:ffff,ID
@@ -3832,9 +4007,8 @@
2001:df1:1e00::,2001:df1:1e00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:2000::,2001:df1:2000:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:2200::,2001:df1:2200:ffff:ffff:ffff:ffff:ffff,ID
-2001:df1:2400::,2001:df1:2400:ffff:ffff:ffff:ffff:ffff,PH
+2001:df1:2400::,2001:df1:2401:ffff:ffff:ffff:ffff:ffff,PH
2001:df1:2600::,2001:df1:2600:ffff:ffff:ffff:ffff:ffff,ID
-2001:df1:2800::,2001:df1:2800:ffff:ffff:ffff:ffff:ffff,SG
2001:df1:2a00::,2001:df1:2a00:ffff:ffff:ffff:ffff:ffff,MY
2001:df1:2c00::,2001:df1:2c00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:2e00::,2001:df1:2e00:ffff:ffff:ffff:ffff:ffff,IN
@@ -3899,7 +4073,6 @@
2001:df1:a800::,2001:df1:a800:ffff:ffff:ffff:ffff:ffff,SG
2001:df1:aa00::,2001:df1:aa00:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:ac00::,2001:df1:ac00:ffff:ffff:ffff:ffff:ffff,HK
-2001:df1:ae00::,2001:df1:ae01:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:b000::,2001:df1:b000:ffff:ffff:ffff:ffff:ffff,TH
2001:df1:b200::,2001:df1:b200:ffff:ffff:ffff:ffff:ffff,HK
2001:df1:b400::,2001:df1:b400:ffff:ffff:ffff:ffff:ffff,AU
@@ -4090,7 +4263,6 @@
2001:df3:3800::,2001:df3:3800:ffff:ffff:ffff:ffff:ffff,ID
2001:df3:3a00::,2001:df3:3a00:ffff:ffff:ffff:ffff:ffff,PH
2001:df3:3c00::,2001:df3:3c00:ffff:ffff:ffff:ffff:ffff,IN
-2001:df3:3e00::,2001:df3:3e00:ffff:ffff:ffff:ffff:ffff,SG
2001:df3:4000::,2001:df3:4000:ffff:ffff:ffff:ffff:ffff,NZ
2001:df3:4200::,2001:df3:4200:ffff:ffff:ffff:ffff:ffff,HK
2001:df3:4400::,2001:df3:4400:ffff:ffff:ffff:ffff:ffff,IN
@@ -4273,7 +4445,7 @@
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:ba00:ffff:ffff:ffff:ffff:ffff,PH
+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
@@ -4368,6 +4540,7 @@
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
@@ -4519,7 +4692,6 @@
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:ba00::,2001:df6:ba00:ffff:ffff:ffff:ffff:ffff,AU
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
@@ -4566,7 +4738,6 @@
2001:df7:1600::,2001:df7:1600:ffff:ffff:ffff:ffff:ffff,HK
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:1e00::,2001:df7:1e00:ffff:ffff:ffff:ffff:ffff,AU
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
@@ -4596,7 +4767,6 @@
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:5c00::,2001:df7:5c00:ffff:ffff:ffff:ffff:ffff,HK
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
@@ -4956,7 +5126,16 @@
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:5:1::1c5,US
+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
@@ -5009,7 +5188,7 @@
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:1a18:ffff:ffff:ffff:ffff:ffff:ffff,CY
+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
@@ -5044,9 +5223,9 @@
2001:1b20::,2001:1b20: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:1b38:ffff:ffff:ffff:ffff:ffff:ffff,FR
+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:1b48:ffff:ffff:ffff:ffff:ffff:ffff,FR
+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
@@ -5310,6 +5489,7 @@
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:d0::,2001:43f8:d0:ffff:ffff:ffff:ffff:ffff,MU
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,MU
@@ -5443,6 +5623,13 @@
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:e00::,2001:43f8:eff:ffff:ffff:ffff:ffff:ffff,MU
2001:4400::,2001:4403:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2001:4408::,2001:4408:ffff:ffff:ffff:ffff:ffff:ffff,IN
@@ -5705,7 +5892,7 @@
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:4b9f:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2001:4ba0::,2001:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+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
@@ -5742,16 +5929,14 @@
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:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4ca8::,2001:4ca8: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:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4ce8::,2001:4cf8: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
@@ -5775,7 +5960,9 @@
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:ffff:ffff:ffff:ffff:ffff:ffff,NL
+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:8000::,2001:8fff:ffff:ffff:ffff:ffff:ffff:ffff,AU
@@ -6024,8 +6211,8 @@
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:6180:100::,2400:6180:1ff:ffff:ffff:ffff:ffff:ffff,IN
+2400:6180:200::,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
@@ -6046,8 +6233,8 @@
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:71ff:ffff:ffff:ffff:ffff,CN
-2400:6500:100:7200::,2400:6500:ffff:ffff: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
@@ -6201,7 +6388,7 @@
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:8a80:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2400:8a80::,2400:8a81:ffff:ffff:ffff:ffff:ffff:ffff,PH
2400:8ac0::,2400:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,BD
2400:8b00::,2400:8b00:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:8b40::,2400:8b40:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -6280,6 +6467,7 @@
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:a000::,2400:a000:ffff:ffff:ffff:ffff:ffff:ffff,IN
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
@@ -6304,70 +6492,142 @@
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: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
@@ -6381,8 +6641,7 @@
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:32:ffff:ffff:ffff:ffff:ffff,SE
-2400:cb00:33::,2400:cb00:33:ffff:ffff:ffff:ffff:ffff,US
+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
@@ -6391,7 +6650,7 @@
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,BR
+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
@@ -6435,151 +6694,304 @@
2400:cb00:81::,2400:cb00:81:ffff:ffff:ffff:ffff:ffff,US
2400:cb00:82::,2400:cb00:82:ffff:ffff:ffff:ffff:ffff,UA
2400:cb00:83::,2400:cb00:83:ffff:ffff:ffff:ffff:ffff,NO
-2400:cb00:84::,2400:cb00:84:ffff:ffff:ffff:ffff:ffff,AU
-2400:cb00:85::,2400:cb00:85:ffff:ffff:ffff:ffff:ffff,US
+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:95:ffff:ffff:ffff:ffff:ffff,US
+2400:cb00:91::,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:103:ffff:ffff:ffff:ffff:ffff,US
+2400:cb00:98::,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: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:113:ffff:ffff:ffff:ffff:ffff,US
+2400:cb00:108::,2400:cb00:110:ffff:ffff:ffff:ffff:ffff,US
+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:ffff:ffff:ffff:ffff:ffff:ffff,US
+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: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,US
+2400:cb00:128::,2400:cb00:128:ffff:ffff:ffff:ffff:ffff,SE
+2400:cb00:129::,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:d000::,2400:d000:ffff:ffff:ffff:ffff:ffff:ffff,PH
+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:d900::,2400:d900:ffff:ffff:ffff:ffff:ffff:ffff,LK
+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,SG
+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,HK
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:a80::,2401:a80:ffff:ffff:ffff:ffff:ffff:ffff,AU
+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:1000::,2401:1000:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:1100::,2401:1100:ffff:ffff:ffff:ffff:ffff:ffff,HK
@@ -6588,7 +7000,6 @@
2401:1300::,2401:1300:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:1380::,2401:1380:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:1400::,2401:1400:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2401:1480::,2401:1480:ffff:ffff:ffff:ffff:ffff:ffff,KH
2401:1500::,2401:1500:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:1580::,2401:1580:ffff:ffff:ffff:ffff:ffff:ffff,SG
2401:1600::,2401:1600:ffff:ffff:ffff:ffff:ffff:ffff,PH
@@ -6687,6 +7098,7 @@
2401:4400::,2401:4400:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:4480::,2401:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:4580::,2401:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:4600::,2401:4600:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:4680::,2401:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:4700::,2401:4700:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:4780::,2401:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -7009,7 +7421,6 @@
2401:f580::,2401:f580:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:f680::,2401:f680:ffff:ffff:ffff:ffff:ffff:ffff,PG
2401:f700::,2401:f700:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2401:f780::,2401:f780:ffff:ffff:ffff:ffff:ffff:ffff,NP
2401:f800::,2401:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:f880::,2401:f880:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:f900::,2401:f900:ffff:ffff:ffff:ffff:ffff:ffff,SG
@@ -7017,7 +7428,9 @@
2401:fa00::,2401:fa00::7fff:ffff:ffff:ffff:ffff,AU
2401:fa00:0:8000::,2401:fa00::ffff:ffff:ffff:ffff:ffff,IN
2401:fa00:1::,2401:fa00:1:7fff:ffff:ffff:ffff:ffff,TW
-2401:fa00:1:8000::,2401:fa00:3:ffff:ffff:ffff:ffff:ffff,IN
+2401:fa00:1:8000::,2401:fa00:3:fcff:ffff:ffff:ffff:ffff,IN
+2401:fa00:3:fd00::,2401:fa00:3:fd00:ffff:ffff:ffff:ffff,SG
+2401:fa00:3:fd01::,2401:fa00:3:ffff:ffff:ffff:ffff:ffff,IN
2401:fa00:4::,2401:fa00:4:ffff:ffff:ffff:ffff:ffff,JP
2401:fa00:5::,2401:fa00:6:7fff:ffff:ffff:ffff:ffff,IN
2401:fa00:6:8000::,2401:fa00:6:ffff:ffff:ffff:ffff:ffff,AU
@@ -7032,9 +7445,12 @@
2401:fa00:11:8000::,2401:fa00:11:ffff:ffff:ffff:ffff:ffff,IN
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:17:ffff:ffff:ffff:ffff:ffff,IN
+2401:fa00:14::,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:7fff:ffff:ffff:ffff:ffff,PH
-2401:fa00:18:8000::,2401:fa00:1b:ffff:ffff:ffff:ffff:ffff,IN
+2401:fa00:18:8000::,2401:fa00:18:ffff:ffff:ffff:ffff:ffff,IN
+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
@@ -7098,7 +7514,6 @@
2402:1200::,2402:1200:ffff:ffff:ffff:ffff:ffff:ffff,ID
2402:1280::,2402:1280:ffff:ffff:ffff:ffff:ffff:ffff,AU
2402:1300::,2402:1300:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2402:1380::,2402:1380:ffff:ffff:ffff:ffff:ffff:ffff,BD
2402:1400::,2402:1400:ffff:ffff:ffff:ffff:ffff:ffff,JP
2402:1500::,2402:1500:ffff:ffff:ffff:ffff:ffff:ffff,HK
2402:1580::,2402:1580:ffff:ffff:ffff:ffff:ffff:ffff,JP
@@ -7234,7 +7649,6 @@
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:5a80::,2402:5a80:ffff:ffff:ffff:ffff:ffff:ffff,PG
2402:5b00::,2402:5b00:ffff:ffff:ffff:ffff:ffff:ffff,IN
2402:5b80::,2402:5b80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2402:5c00::,2402:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU
@@ -7284,7 +7698,6 @@
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:7380:1000::,2402:7380:ffff:ffff:ffff:ffff:ffff:ffff,CN
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
@@ -7321,7 +7734,6 @@
2402:8400::,2402:8400:ffff:ffff:ffff:ffff:ffff:ffff,IN
2402:8480::,2402:8480:ffff:ffff:ffff:ffff:ffff:ffff,AU
2402:8500::,2402:8500:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2402:8580::,2402:8580:ffff:ffff:ffff:ffff:ffff:ffff,HK
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
@@ -7370,7 +7782,9 @@
2402:9e80::,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:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2402:9e80:16::,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
@@ -7446,7 +7860,7 @@
2402:c400::,2402:c400:ffff:ffff:ffff:ffff:ffff:ffff,JP
2402:c480::,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,HK
+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
@@ -8156,7 +8570,6 @@
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:1a80::,2404:1a80:ffff:ffff:ffff:ffff:ffff:ffff,NZ
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
@@ -8190,7 +8603,6 @@
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:2b80::,2404:2b80:ffff:ffff:ffff:ffff:ffff:ffff,BD
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
@@ -8254,7 +8666,6 @@
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:4e80::,2404:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CN
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
@@ -8281,10 +8692,11 @@
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:5c00::,2404:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU
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:ffff:ffff:ffff:ffff:ffff:ffff,JP
+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: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:5f00::,2404:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AU
@@ -8309,7 +8721,9 @@
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:ffff:ffff:ffff:ffff:ffff:ffff,AU
+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
@@ -8334,7 +8748,6 @@
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:7580::,2404:7587:ffff:ffff:ffff:ffff:ffff:ffff,PK
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
@@ -8346,7 +8759,6 @@
2404:7a00::,2404:7a00:ffff:ffff:ffff:ffff:ffff:ffff,JP
2404:7a80::,2404:7a87:ffff:ffff:ffff:ffff:ffff:ffff,JP
2404:7b00::,2404:7b00:ffff:ffff:ffff:ffff:ffff:ffff,IN
-2404:7b80::,2404:7b80:ffff:ffff:ffff:ffff:ffff:ffff,PK
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
@@ -8356,7 +8768,6 @@
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:8080::,2404:8081:ffff:ffff:ffff:ffff:ffff:ffff,US
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
@@ -8624,7 +9035,9 @@
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:207:ffff:ffff:ffff:ffff:ffff:ffff,IN
+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
@@ -8706,7 +9119,9 @@
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:ffc7:ffff:ffff:ffff:ffff:ffff,IN
+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
@@ -8959,7 +9374,6 @@
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:9c80::,2405:9c83:ffff:ffff:ffff:ffff:ffff:ffff,IN
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
@@ -9156,7 +9570,6 @@
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:580::,2406:580:ffff:ffff:ffff:ffff:ffff:ffff,AU
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
@@ -9636,7 +10049,17 @@
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:daff:ffff:ffff:ffff:ffff:ffff:ffff,US
+2406:dafc: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
@@ -10203,6 +10626,7 @@
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
@@ -10264,7 +10688,11 @@
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:200f:ffff:ffff:ffff:ffff:ffff:ffff,US
+2600:1ffc: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
@@ -10294,7 +10722,7 @@
2600:7000::,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,VC
+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:880f:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -10313,6 +10741,28 @@
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: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:fefa:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fefb::,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
@@ -10344,8 +10794,7 @@
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:ff2a:fff:ffff:ffff:ffff:ffff:ffff,US
-2602:ff2b::,2602:ff2b: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
@@ -10408,7 +10857,6 @@
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:ff6a::,2602:ff6a: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
@@ -10458,7 +10906,6 @@
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:ffa1::,2602:ffa1:fff:ffff:ffff:ffff:ffff:ffff,US
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
@@ -10553,9 +11000,11 @@
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::ffff:ffff:ffff:ffff:ffff,AU
-2603:1010:1::,2603:1010:ff:ffff:ffff:ffff:ffff:ffff,US
-2603:1010:100::,2603:1010:1ff:ffff:ffff:ffff:ffff:ffff,AU
-2603:1010:200::,2603:1015:ffff:ffff:ffff:ffff:ffff:ffff,US
+2603:1010:1::,2603:1010:1:ffff:ffff:ffff:ffff:ffff,US
+2603:1010:2::,2603:1010:2:ffff:ffff:ffff:ffff:ffff,AU
+2603:1010:3::,2603:1010:ff:ffff:ffff:ffff:ffff:ffff,US
+2603:1010:100::,2603:1010:200:ffff:ffff:ffff:ffff:ffff,AU
+2603:1010:201::,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:1f:ffff:ffff:ffff:ffff:ffff,US
2603:1016:20::,2603:1016:2f:ffff:ffff:ffff:ffff:ffff,AU
@@ -10567,7 +11016,7 @@
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,US
+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,US
@@ -10594,8 +11043,10 @@
2603:1026:700::,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:1fff:ffff:ffff:ffff:ffff:ffff,IE
-2603:1026:2000::,2603:1027::1: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
@@ -10631,12 +11082,18 @@
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:1039:dff:ffff:ffff:ffff:ffff:ffff,US
+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:1040:1ff:ffff:ffff:ffff:ffff:ffff,US
+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
@@ -10648,7 +11105,9 @@
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:1045:ffff:ffff:ffff:ffff:ffff:ffff,US
+2603:1040:d00::,2603:1040:dff:ffff:ffff:ffff:ffff:ffff,US
+2603:1040:e00::,2603:1040:eff:ffff:ffff:ffff:ffff:ffff,KR
+2603:1040:f00::,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
@@ -10681,7 +11140,10 @@
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::3f:ffff:ffff:ffff:ffff,US
+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::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
@@ -10699,7 +11161,10 @@
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::bf:ffff:ffff:ffff:ffff,US
+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::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
@@ -10728,7 +11193,9 @@
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:20f:ffff:ffff:ffff:ffff:ffff,US
+2603:1049:1100::,2603:1050::ffff:ffff:ffff:ffff:ffff,US
+2603:1050:1::,2603:1050:1:ffff:ffff:ffff:ffff:ffff,BR
+2603:1050:2::,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:1055:ffff:ffff:ffff:ffff:ffff:ffff,US
2603:1056::,2603:1056:2:3f:ffff:ffff:ffff:ffff,BR
@@ -10744,7 +11211,9 @@
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:1058:ffff:ffff:ffff:ffff:ffff:ffff,US
+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
@@ -10758,6 +11227,8 @@
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
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
@@ -10831,89 +11302,169 @@
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,CA
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: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: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:3b00::,2604:3b00:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:3b80::,2604:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:3c00::,2604:3c00:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:3c80::,2604:3c80:ffff:ffff:ffff:ffff:ffff:ffff,US
-2604:3d00::,2604:3d00:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:3d00::,2604:3d0f:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:3d80::,2604:3d80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:3e00::,2604:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:3e80::,2604:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -11078,7 +11629,6 @@
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:9400::,2604:9400:ffff:ffff:ffff:ffff:ffff:ffff,US
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
@@ -11097,7 +11647,7 @@
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:9e01: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
@@ -11117,8 +11667,8 @@
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:ffff:ffff:ffff:ffff:ffff,CA
-2604:a880:cae::,2604:a880:ffff: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
@@ -11305,7 +11855,6 @@
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
@@ -11369,9 +11918,7 @@
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:2d80::,2605:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:2e00::,2605:2e00:fff:ffff:ffff:ffff:ffff:ffff,CA
-2605:2e80::,2605:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US
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
@@ -11622,7 +12169,6 @@
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:b300::,2605:b300: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
@@ -11713,7 +12259,6 @@
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:e280::,2605:e280:ffff:ffff:ffff:ffff:ffff:ffff,US
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
@@ -11788,7 +12333,6 @@
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::,2606::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
@@ -12014,7 +12558,6 @@
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:5900::,2606:5900: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
@@ -12116,7 +12659,6 @@
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:8d80::,2606:8d80: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
@@ -12643,7 +13185,6 @@
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:9780::,2607:9780: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
@@ -12714,7 +13255,6 @@
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:bc00::,2607:bc00: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
@@ -12907,6 +13447,7 @@
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
@@ -13340,7 +13881,6 @@
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:f8::,2610:f8: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
@@ -13488,7 +14028,7 @@
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,HK
+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
@@ -13507,8 +14047,7 @@
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::e50:ffff:ffff:ffff:ffff:ffff,US
-2620:0:e60::,2620::e60: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
@@ -13772,7 +14311,6 @@
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
@@ -13785,39 +14323,75 @@
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:1d::,2620:1d:f:ffff:ffff:ffff:ffff:ffff,US
2620:1d:4000::,2620:1d:4000:ffff:ffff:ffff:ffff:ffff,US
@@ -13961,7 +14535,6 @@
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:4000::,2620:41:4000: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
@@ -14012,7 +14585,6 @@
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:4e:c000::,2620:4e:c000: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
@@ -14289,7 +14861,6 @@
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:4000::,2620:97:4000: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
@@ -14300,7 +14871,6 @@
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:4000::,2620:9a:4000:ffff:ffff:ffff:ffff:ffff,US
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
@@ -14340,7 +14910,7 @@
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:2050: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
@@ -14663,7 +15233,7 @@
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:4000:ffff:ffff:ffff:ffff:ffff,US
+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
@@ -14792,7 +15362,6 @@
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:d000::,2620:105:d0ff: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
@@ -15084,7 +15653,6 @@
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:117:f000::,2620:117:f00f:ffff:ffff:ffff:ffff:ffff,US
2620:118::,2620:118:f: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
@@ -15435,6 +16003,32 @@
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: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
@@ -15464,8 +16058,7 @@
2620:15c::,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:fff:ffff:ffff:ffff:ffff:ffff,US
-2620:15d::,2620:15e:fff:ffff:ffff:ffff:ffff:ffff,US
-2620:15f::,2620:15f: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
@@ -15494,6 +16087,8 @@
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:190::,2620:190:ffff: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
@@ -15765,7 +16360,6 @@
2801:0:1b0::,2801::1b0: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:1e0::,2801::1e0:ffff:ffff:ffff:ffff:ffff,CO
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
@@ -15806,13 +16400,13 @@
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:4f0::,2801::4f0:ffff:ffff:ffff:ffff:ffff,CO
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
@@ -15832,6 +16426,7 @@
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: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
@@ -15842,6 +16437,7 @@
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: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
@@ -15853,11 +16449,12 @@
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:4000::,2801:14:4000:ffff:ffff:ffff:ffff:ffff,CO
+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
@@ -15876,6 +16473,7 @@
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
@@ -15888,6 +16486,7 @@
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
@@ -15898,10 +16497,12 @@
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
@@ -15920,17 +16521,16 @@
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:2000::,2801:1a:2000:ffff:ffff:ffff:ffff:ffff,SR
-2801:1a:4000::,2801:1a:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:1a:5000::,2801:1a:5000:ffff:ffff:ffff:ffff:ffff,AR
-2801:1a:6000::,2801:1a:6000:ffff:ffff:ffff:ffff:ffff,CR
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: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
@@ -15942,10 +16542,12 @@
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,PE
+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
@@ -15964,6 +16566,7 @@
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
@@ -15974,17 +16577,18 @@
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: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:4000::,2801:1f:4000:ffff:ffff:ffff:ffff:ffff,CR
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
@@ -16321,6 +16925,16 @@
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: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
@@ -16379,6 +16993,7 @@
2801:110::,2801:110:1fff: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
@@ -16401,6 +17016,7 @@
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
@@ -16429,6 +17045,7 @@
2803:100::,2803:100:ffff:ffff:ffff:ffff:ffff:ffff,HN
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:240::,2803:240:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:280::,2803:280:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -16443,6 +17060,7 @@
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:640::,2803:640:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:680::,2803:680:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -16457,6 +17075,7 @@
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:a40::,2803:a40:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:a80::,2803:a80:ffff:ffff:ffff:ffff:ffff:ffff,CO
@@ -16474,6 +17093,7 @@
2803:e00::,2803:e00:ffff:ffff:ffff:ffff:ffff:ffff,CL
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:4a9:ffff:ffff:ffff:ffff:ffff,PE
@@ -16488,6 +17108,7 @@
2803:1100::,2803:1100:ffff:ffff:ffff:ffff:ffff:ffff,CW
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:1240::,2803:1240:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:1280::,2803:1280:ffff:ffff:ffff:ffff:ffff:ffff,PE
@@ -16504,6 +17125,7 @@
2803:1600::,2803:1600:ffff:ffff:ffff:ffff:ffff:ffff,BQ
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
@@ -16511,7 +17133,7 @@
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:1980::,2803:1980:ffff:ffff:ffff:ffff:ffff:ffff,CO
+2803:19c0::,2803:19c0:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:1a00::,2803:1a00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:1a40::,2803:1a40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1a80::,2803:1a80:ffff:ffff:ffff:ffff:ffff:ffff,CR
@@ -16528,6 +17150,7 @@
2803:1e00::,2803:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NI
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
@@ -16537,6 +17160,7 @@
2803:20c0::,2803:20c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
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:2240::,2803:2240:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2280::,2803:2280:ffff:ffff:ffff:ffff:ffff:ffff,BZ
@@ -16554,6 +17178,7 @@
2803:2600::,2803:2600:ffff:ffff:ffff:ffff:ffff:ffff,AR
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
@@ -16564,6 +17189,7 @@
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:2a40::,2803:2a40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2a80::,2803:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CO
@@ -16581,6 +17207,7 @@
2803:2e00::,2803:2e00:ffff:ffff:ffff:ffff:ffff:ffff,EC
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
@@ -16590,6 +17217,7 @@
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:3240::,2803:3240:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:3280::,2803:3280:ffff:ffff:ffff:ffff:ffff:ffff,GT
@@ -16607,6 +17235,7 @@
2803:3600::,2803:3600:ffff:ffff:ffff:ffff:ffff:ffff,CR
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
@@ -16617,6 +17246,7 @@
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:3a40::,2803:3a40:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:3a80::,2803:3a80:ffff:ffff:ffff:ffff:ffff:ffff,HN
@@ -16634,6 +17264,7 @@
2803:3e00::,2803:3e00:ffff:ffff:ffff:ffff:ffff:ffff,AR
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
@@ -16644,6 +17275,7 @@
2803:4100::,2803:4100:ffff:ffff:ffff:ffff:ffff:ffff,AR
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:4240::,2803:4240:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:4280::,2803:4280:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -16658,9 +17290,11 @@
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: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:4700: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
@@ -16671,6 +17305,7 @@
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: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
@@ -16687,6 +17322,7 @@
2803:4e00::,2803:4e00:ffff:ffff:ffff:ffff:ffff:ffff,UY
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
@@ -16697,6 +17333,7 @@
2803:5100::,2803:5100:ffff:ffff:ffff:ffff:ffff:ffff,GT
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:5240::,2803:5240:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5280::,2803:5280:ffff:ffff:ffff:ffff:ffff:ffff,DO
@@ -16714,6 +17351,7 @@
2803:5600::,2803:5600:ffff:ffff:ffff:ffff:ffff:ffff,HN
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
@@ -16723,6 +17361,7 @@
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:5a40::,2803:5a40:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:5a80::,2803:5a80:ffff:ffff:ffff:ffff:ffff:ffff,DO
@@ -16740,6 +17379,7 @@
2803:5e00::,2803:5e00:ffff:ffff:ffff:ffff:ffff:ffff,BO
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:6000::,2803:6000:ffff:ffff:ffff:ffff:ffff:ffff,CR
@@ -16749,6 +17389,7 @@
2803:6100::,2803:6100:ffff:ffff:ffff:ffff:ffff:ffff,AR
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:6240::,2803:6240:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:6280::,2803:6280:ffff:ffff:ffff:ffff:ffff:ffff,PA
@@ -16765,6 +17406,7 @@
2803:6580::,2803:6580:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:6600::,2803:6600:ffff:ffff:ffff:ffff:ffff:ffff,AR
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
@@ -16775,6 +17417,7 @@
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:6a40::,2803:6a40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6a80::,2803:6a80:ffff:ffff:ffff:ffff:ffff:ffff,NI
@@ -16792,6 +17435,7 @@
2803:6e00::,2803:6e00:ffff:ffff:ffff:ffff:ffff:ffff,SR
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
@@ -16802,6 +17446,7 @@
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:7240::,2803:7240:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7280::,2803:7280:ffff:ffff:ffff:ffff:ffff:ffff,PA
@@ -16819,6 +17464,7 @@
2803:7600::,2803:7600: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
@@ -16829,6 +17475,7 @@
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:7a40::,2803:7a40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7a80::,2803:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CR
@@ -16846,6 +17493,7 @@
2803:7e00::,2803:7e00: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
@@ -16856,6 +17504,7 @@
2803:8100::,2803:8100:ffff:ffff:ffff:ffff:ffff:ffff,VE
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:8240::,2803:8240:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:8280::,2803:8280:ffff:ffff:ffff:ffff:ffff:ffff,VE
@@ -16870,9 +17519,11 @@
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: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
@@ -16883,6 +17534,7 @@
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: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
@@ -16899,6 +17551,7 @@
2803:8e00::,2803:8e00:ffff:ffff:ffff:ffff:ffff:ffff,CL
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
@@ -16909,6 +17562,7 @@
2803:9100::,2803:9100: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:9240::,2803:9240:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9280::,2803:9280:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -16926,6 +17580,7 @@
2803:9600::,2803:9600:ffff:ffff:ffff:ffff:ffff:ffff,CW
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:9800::,2803:9800:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -16935,6 +17590,7 @@
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:9a40::,2803:9a40:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:9a80::,2803:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CO
@@ -16952,6 +17608,7 @@
2803:9e00::,2803:9e00: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
@@ -16962,6 +17619,7 @@
2803:a100::,2803:a100:ffff:ffff:ffff:ffff:ffff:ffff,CL
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:a240::,2803:a240:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:a280::,2803:a280:ffff:ffff:ffff:ffff:ffff:ffff,DO
@@ -16978,6 +17636,7 @@
2803:a600::,2803:a600: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
@@ -16988,6 +17647,7 @@
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:aa40::,2803:aa40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:aa80::,2803:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CR
@@ -17005,6 +17665,7 @@
2803:ae00::,2803:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AR
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
@@ -17014,6 +17675,7 @@
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:b240::,2803:b240:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:b280::,2803:b280:ffff:ffff:ffff:ffff:ffff:ffff,CL
@@ -17031,6 +17693,7 @@
2803:b600::,2803:b600: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
@@ -17040,6 +17703,7 @@
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:ba40::,2803:ba40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ba80::,2803:ba80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17057,6 +17721,7 @@
2803:be00::,2803:be00: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
@@ -17067,6 +17732,7 @@
2803:c100::,2803:c100:ffff:ffff:ffff:ffff:ffff:ffff,PY
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:c240::,2803:c240:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:c280::,2803:c280:ffff:ffff:ffff:ffff:ffff:ffff,EC
@@ -17081,9 +17747,11 @@
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: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
@@ -17094,6 +17762,7 @@
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:ca40::,2803:ca40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ca80::,2803:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CL
@@ -17111,6 +17780,7 @@
2803:ce00::,2803:ce00:ffff:ffff:ffff:ffff:ffff:ffff,HN
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
@@ -17123,6 +17793,7 @@
2803:d100::,2803:d100:ffff:ffff:ffff:ffff:ffff:ffff,GT
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:d240::,2803:d240:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d280::,2803:d280:ffff:ffff:ffff:ffff:ffff:ffff,PY
@@ -17134,11 +17805,12 @@
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,VE
+2803:d540::,2803:d540:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:d580::,2803:d580:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:d600::,2803:d600:ffff:ffff:ffff:ffff:ffff:ffff,UY
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
@@ -17149,6 +17821,7 @@
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:da40::,2803:da40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:da80::,2803:da80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17166,6 +17839,7 @@
2803:de00::,2803:de00: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
@@ -17176,6 +17850,7 @@
2803:e100::,2803:e100:ffff:ffff:ffff:ffff:ffff:ffff,AR
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:e240::,2803:e240:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:e280::,2803:e280:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17193,6 +17868,7 @@
2803:e600::,2803:e600:ffff:ffff:ffff:ffff:ffff:ffff,PA
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
@@ -17202,6 +17878,7 @@
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:ea40::,2803:ea40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ea80::,2803:ea80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17220,6 +17897,7 @@
2803:ee00::,2803:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AR
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
@@ -17230,6 +17908,7 @@
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:f240::,2803:f240:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f280::,2803:f280:ffff:ffff:ffff:ffff:ffff:ffff,DO
@@ -17247,6 +17926,7 @@
2803:f600::,2803:f600:ffff:ffff:ffff:ffff:ffff:ffff,CR
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
@@ -17256,6 +17936,7 @@
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:fa40::,2803:fa40:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:fa80::,2803:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17273,6 +17954,7 @@
2803:fe00::,2803:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CO
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
2804::,2804::ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -19213,6 +19895,7 @@
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: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
@@ -20837,6 +21520,219 @@
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
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
@@ -20847,14 +21743,13 @@
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:287:ffff:ffff:ffff:ffff:ffff:ffff,MX
-2806:289::,2806:289:ffff:ffff:ffff:ffff:ffff:ffff,MX
-2806:290::,2806:290: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:2e0:ffff:ffff:ffff:ffff:ffff:ffff,MX
+2806:2e0::,2806:2e2:ffff:ffff:ffff:ffff:ffff:ffff,MX
+2806:2e4::,2806:2e4:ffff:ffff:ffff:ffff:ffff:ffff,MX
2806:2f0::,2806:2f0: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
@@ -21180,7 +22075,7 @@
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:1618:ffff:ffff:ffff:ffff:ffff:ffff,AT
+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
@@ -21206,7 +22101,6 @@
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:1710::,2a00:1710:ffff:ffff:ffff:ffff:ffff:ffff,LB
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:1728:ffff:ffff:ffff:ffff:ffff:ffff,BG
@@ -21297,7 +22191,7 @@
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:1a18:ffff:ffff:ffff:ffff:ffff:ffff,DE
+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:23ff:ffff:ffff:ffff:ffff:ffff,SE
2a00:1a28:2400::,2a00:1a28:24ff:ffff:ffff:ffff:ffff:ffff,FI
@@ -21346,7 +22240,7 @@
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:1b80:ffff:ffff:ffff:ffff:ffff:ffff,BA
+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
@@ -21359,7 +22253,7 @@
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:1be8:ffff:ffff:ffff:ffff:ffff:ffff,NO
+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
@@ -21375,9 +22269,9 @@
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,FI
+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:1c78: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
@@ -21468,7 +22362,7 @@
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:1f60:ffff:ffff:ffff:ffff:ffff:ffff,FR
+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
@@ -21753,7 +22647,7 @@
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:6180:ffff:ffff:ffff:ffff:ffff:ffff,UA
+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
@@ -21961,7 +22855,9 @@
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:ffe2:4ff:ffff:ffff:ffff:ffff,CH
+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: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
@@ -22062,7 +22958,6 @@
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:8660::,2a00:8660:ffff:ffff:ffff:ffff:ffff:ffff,RU
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
@@ -22153,7 +23048,7 @@
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:9240:ffff:ffff:ffff:ffff:ffff:ffff,NL
+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
@@ -22204,7 +23099,7 @@
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:9801:ffff:ffff:ffff:ffff:ffff:ffff,RU
+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
@@ -22400,7 +23295,6 @@
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:b100::,2a00:b100:ffff:ffff:ffff:ffff:ffff:ffff,RU
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
@@ -22538,6 +23432,7 @@
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
@@ -22578,7 +23473,6 @@
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:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a00:c7e0::,2a00:c7e0:ffff:ffff:ffff:ffff:ffff:ffff,AZ
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
@@ -22764,7 +23658,7 @@
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:df00:ffff:ffff:ffff:ffff:ffff:ffff,GB
+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
@@ -22814,7 +23708,7 @@
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:e580:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+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
@@ -23001,7 +23895,7 @@
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:fd40:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a00:fd40:8::,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
@@ -23068,46 +23962,15 @@
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:2004:3:ffff:ffff:ffff:ffff,GB
-2a01:111:2004:4::,2a01:111:2004:7:ffff:ffff:ffff:ffff,US
-2a01:111:2004:8::,2a01:111:2004:8:ffff:ffff:ffff:ffff,GB
-2a01:111:2004:9::,2a01:111:2004:9:ffff:ffff:ffff:ffff,US
-2a01:111:2004:a::,2a01:111:2004:b:ffff:ffff:ffff:ffff,GB
-2a01:111:2004:c::,2a01:111:2004:d:ffff:ffff:ffff:ffff,US
-2a01:111:2004:e::,2a01:111:2005:2:ffff:ffff:ffff:ffff,GB
-2a01:111:2005:3::,2a01:111:2005:5:ffff:ffff:ffff:ffff,US
-2a01:111:2005:6::,2a01:111:2006::ffff:ffff:ffff:ffff,GB
-2a01:111:2006:1::,2a01:111:2006:1:ffff:ffff:ffff:ffff,US
-2a01:111:2006:2::,2a01:111:2006:7:ffff:ffff:ffff:ffff,GB
-2a01:111:2006:8::,2a01:111:2006:e:ffff:ffff:ffff:ffff,US
-2a01:111:2006:f::,2a01:111:2006:ffff:ffff:ffff:ffff:ffff,GB
+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:200b::ffff:ffff:ffff:ffff,GB
-2a01:111:200b:1::,2a01:111:200b:9:ffff:ffff:ffff:ffff,US
-2a01:111:200b:a::,2a01:111:200c:3:ffff:ffff:ffff:ffff,GB
-2a01:111:200c:4::,2a01:111:200c:6:ffff:ffff:ffff:ffff,US
-2a01:111:200c:7::,2a01:111:200c:ffff:ffff:ffff:ffff:ffff,GB
-2a01:111:200d::,2a01:111:200d::ffff:ffff:ffff:ffff,US
-2a01:111:200d:1::,2a01:111:200e:1:ffff:ffff:ffff:ffff,GB
-2a01:111:200e:2::,2a01:111:200e:2:ffff:ffff:ffff:ffff,US
-2a01:111:200e:3::,2a01:111:200f:2:ffff:ffff:ffff:ffff,GB
-2a01:111:200f:3::,2a01:111:200f:3:ffff:ffff:ffff:ffff,US
-2a01:111:200f:4::,2a01:111:200f:4:ffff:ffff:ffff:ffff,GB
-2a01:111:200f:5::,2a01:111:200f:5:ffff:ffff:ffff:ffff,US
-2a01:111:200f:6::,2a01:111:200f:11:ffff:ffff:ffff:ffff,GB
-2a01:111:200f:12::,2a01:111:200f:13:ffff:ffff:ffff:ffff,US
-2a01:111:200f:14::,2a01:111:2010:3:ffff:ffff:ffff:ffff,GB
-2a01:111:2010:4::,2a01:111:2010:5:ffff:ffff:ffff:ffff,US
-2a01:111:2010:6::,2a01:111:2011:ffff:ffff:ffff:ffff:ffff,GB
-2a01:111:2012::,2a01:111:2012:1:ffff:ffff:ffff:ffff,US
-2a01:111:2012:2::,2a01:111:2013::ffff:ffff:ffff:ffff,GB
-2a01:111:2013:1::,2a01:111:2013:2:ffff:ffff:ffff:ffff,US
-2a01:111:2013:3::,2a01:111:2013:4:ffff:ffff:ffff:ffff,GB
-2a01:111:2013:5::,2a01:111:2013:7:ffff:ffff:ffff:ffff,US
-2a01:111:2013:8::,2a01:111:2013:8:ffff:ffff:ffff:ffff,GB
-2a01:111:2013:9::,2a01:111:2013:a:ffff:ffff:ffff:ffff,US
-2a01:111:2013:b::,2a01:111:2015:ffff:ffff:ffff:ffff:ffff,GB
+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
@@ -23116,7 +23979,8 @@
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:2022:ffff:ffff:ffff:ffff:ffff,GB
+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
@@ -23127,19 +23991,15 @@
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,GB
-2a01:111:2032::,2a01:111:2032:1:ffff:ffff:ffff:ffff,HK
-2a01:111:2032:2::,2a01:111:2032:2:ffff:ffff:ffff:ffff,GB
-2a01:111:2032:3::,2a01:111:2032:3:ffff:ffff:ffff:ffff,HK
-2a01:111:2032:4::,2a01:111:2032:ffff:ffff:ffff:ffff:ffff,GB
+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,AU
-2a01:111:2039:1::,2a01:111:2039:ffff:ffff:ffff:ffff:ffff,GB
+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
@@ -23147,9 +24007,9 @@
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:2044:5:ffff:ffff:ffff:ffff,GB
-2a01:111:2044:6::,2a01:111:2044:8:ffff:ffff:ffff:ffff,IE
-2a01:111:2044:9::,2a01:111:2045:ffff:ffff:ffff:ffff:ffff,GB
+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
@@ -23157,26 +24017,12 @@
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:fff:ffff:ffff:ffff:ffff,US
-2a01:111:f100:1000::,2a01:111:f100:1004:ffff:ffff:ffff:ffff,GB
-2a01:111:f100:1005::,2a01:111:f100:1006:ffff:ffff:ffff:ffff,US
-2a01:111:f100:1007::,2a01:111:f100:1007:ffff:ffff:ffff:ffff,GB
-2a01:111:f100:1008::,2a01:111:f100:1008:ffff:ffff:ffff:ffff,US
-2a01:111:f100:1009::,2a01:111:f100:2000:ffff:ffff:ffff:ffff,GB
-2a01:111:f100:2001::,2a01:111:f100:2001:ffff:ffff:ffff:ffff,US
-2a01:111:f100:2002::,2a01:111:f100:4002:ffff:ffff:ffff:ffff,GB
-2a01:111:f100:4003::,2a01:111:f100:4003:ffff:ffff:ffff:ffff,US
-2a01:111:f100:4004::,2a01:111:f100:6000:ffff:ffff:ffff:ffff,GB
-2a01:111:f100:6001::,2a01:111:f100:6002:ffff:ffff:ffff:ffff,HK
-2a01:111:f100:6003::,2a01:111:f100:7000:ffff:ffff:ffff:ffff,GB
-2a01:111:f100:7001::,2a01:111:f100:7001:ffff:ffff:ffff:ffff,SG
-2a01:111:f100:7002::,2a01:111:f100:8000:ffff:ffff:ffff:ffff,GB
-2a01:111:f100:8001::,2a01:111:f100:8002:ffff:ffff:ffff:ffff,NL
-2a01:111:f100:8003::,2a01:111:f100:8fff:ffff:ffff:ffff:ffff,GB
-2a01:111:f100:9000::,2a01:111:f100:9fff:ffff:ffff:ffff:ffff,NL
-2a01:111:f100:a000::,2a01:111:f100:a001:ffff:ffff:ffff:ffff,GB
-2a01:111:f100:a002::,2a01:111:f100:a003:ffff:ffff:ffff:ffff,IE
-2a01:111:f100:a004::,2a01:111:f100:afff: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
@@ -23209,7 +24055,9 @@
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:5c:ffff:ffff:ffff:ffff,US
+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
@@ -23218,7 +24066,9 @@
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:2491:ffff:ffff:ffff:ffff,US
+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
@@ -23261,7 +24111,9 @@
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:50a9:ffff:ffff:ffff:ffff,FI
+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
@@ -23271,14 +24123,18 @@
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:514b:ffff:ffff:ffff:ffff,IE
+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:5199:ffff:ffff:ffff:ffff,US
+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
@@ -23355,7 +24211,7 @@
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,US
+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
@@ -23375,7 +24231,9 @@
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:70d1:ffff:ffff:ffff:ffff,HK
+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
@@ -23396,7 +24254,13 @@
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:7e40:ffff:ffff:ffff:ffff,GB
+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
@@ -23668,7 +24532,13 @@
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:ffff:ffff:ffff:ffff:ffff,GB
+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
@@ -23698,8 +24568,8 @@
2a01:111:f402:5c00::,2a01:111:f402:5fff:ffff:ffff:ffff:ffff,AU
2a01:111:f402:6000::,2a01:111:f402:6fff:ffff:ffff:ffff:ffff,GB
2a01:111:f402:7000::,2a01:111:f402:73ff:ffff:ffff:ffff:ffff,AU
-2a01:111:f402:7400::,2a01:111:f402:87ff:ffff:ffff:ffff:ffff,GB
-2a01:111:f402:8800::,2a01:111:f402:8bff:ffff:ffff:ffff:ffff,NL
+2a01:111:f402:7400::,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:93ff:ffff:ffff:ffff:ffff,GB
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,GB
@@ -23765,7 +24635,7 @@
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:120:ffff:ffff:ffff:ffff:ffff:ffff,DE
+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
@@ -23851,6 +24721,7 @@
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
@@ -23867,7 +24738,9 @@
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:ff24::,2a01:3e0:ff24:ffff:ffff:ffff:ffff:ffff,DE
+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
@@ -23997,7 +24870,7 @@
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:7e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+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
@@ -24274,7 +25147,7 @@
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:6240:ffff:ffff:ffff:ffff:ffff:ffff,GB
+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
@@ -24652,7 +25525,7 @@
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:90c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+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
@@ -24665,7 +25538,7 @@
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,TR
+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
@@ -24697,7 +25570,7 @@
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:9680:ffff:ffff:ffff:ffff:ffff:ffff,FR
+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
@@ -24793,7 +25666,7 @@
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:a280:ffff:ffff:ffff:ffff:ffff:ffff,RU
+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
@@ -24959,7 +25832,7 @@
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:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CH
+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
@@ -25093,7 +25966,7 @@
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:200:ffff:ffff:ffff:ffff:ffff:ffff,CH
+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
@@ -25172,7 +26045,7 @@
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:490:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:498::,2a02:498:ffff:ffff:ffff:ffff:ffff:ffff,NL
+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
@@ -25242,7 +26115,7 @@
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,SE
+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
@@ -25332,8 +26205,8 @@
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:9c0:ffff:ffff:ffff:ffff:ffff:ffff,JO
-2a02:9c8::,2a02:9c8:ffff:ffff:ffff:ffff:ffff:ffff,NO
+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
@@ -25343,7 +26216,8 @@
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,NL
+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
@@ -25449,7 +26323,7 @@
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:d90:ffff:ffff:ffff:ffff:ffff:ffff,SI
+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
@@ -25500,7 +26374,7 @@
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:f48:ffff:ffff:ffff:ffff:ffff:ffff,IS
+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:f58:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:f60::,2a02:f60:ffff:ffff:ffff:ffff:ffff:ffff,IT
@@ -25555,7 +26429,7 @@
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:13f8:ffff:ffff:ffff:ffff:ffff:ffff,DE
+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
@@ -25647,7 +26521,7 @@
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:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2a02:20d0::,2a02:20d0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:20d0::,2a02:20d7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:20d8::,2a02:20d8: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
@@ -25790,7 +26664,7 @@
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:2588:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+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
@@ -25810,7 +26684,7 @@
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:2630:ffff:ffff:ffff:ffff:ffff:ffff,LT
+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
@@ -25877,7 +26751,9 @@
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:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+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
@@ -25927,7 +26803,11 @@
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:29b0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+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
@@ -25972,7 +26852,9 @@
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:ffff:ffff:ffff:ffff:ffff:ffff,UA
+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
@@ -26182,7 +27064,7 @@
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:54e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
+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
@@ -26292,7 +27174,6 @@
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:62e0::,2a02:62e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
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
@@ -26453,7 +27334,7 @@
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:7720:ffff:ffff:ffff:ffff:ffff:ffff,SE
+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
@@ -26671,7 +27552,7 @@
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:d6a3:ffff:ffff:ffff:ffff:ffff:ffff,DE
+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
@@ -26818,7 +27699,6 @@
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
@@ -27374,6 +28254,7 @@
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:4140::,2a03:4140:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:4160::,2a03:4160:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:4180::,2a03:4180:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -27400,7 +28281,6 @@
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:44e0::,2a03:44e0:ffff:ffff:ffff:ffff:ffff:ffff,ES
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
@@ -27421,7 +28301,7 @@
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:4780:ffff:ffff:ffff:ffff:ffff:ffff,KW
+2a03:4780::,2a03:4787:ffff:ffff:ffff:ffff:ffff:ffff,KW
2a03:47a0::,2a03:47a0: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
@@ -27469,6 +28349,7 @@
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
@@ -27545,7 +28426,7 @@
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:5440:ffff:ffff:ffff:ffff:ffff:ffff,DK
+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
@@ -27640,7 +28521,7 @@
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:60c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+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
@@ -27654,7 +28535,7 @@
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:6280:ffff:ffff:ffff:ffff:ffff:ffff,ES
+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
@@ -27819,7 +28700,7 @@
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:7780:ffff:ffff:ffff:ffff:ffff:ffff,FR
+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
@@ -27984,7 +28865,7 @@
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,GB
+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
@@ -28027,7 +28908,25 @@
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:ffff:ffff:ffff:ffff:ffff:ffff,AT
+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: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
@@ -28311,7 +29210,7 @@
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:ad80:ffff:ffff:ffff:ffff:ffff:ffff,ES
+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
@@ -28354,6 +29253,7 @@
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
@@ -28362,7 +29262,7 @@
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:ffff,GB
+2a03:b600::,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
@@ -28427,7 +29327,7 @@
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:c680:ffff:ffff:ffff:ffff:ffff:ffff,AT
+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
@@ -28533,7 +29433,6 @@
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:e100::,2a03:e100:ffff:ffff:ffff:ffff:ffff:ffff,GB
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
@@ -28592,7 +29491,13 @@
2a03:ef00::,2a03:ef00:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:ef40::,2a03:ef47:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a03:ef80::,2a03:ef80:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a03:efc0::,2a03:efc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:efc0::,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:f000: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
@@ -28872,7 +29777,9 @@
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:3547:ffff:ffff:ffff:ffff:ffff:ffff,FI
+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
@@ -29089,7 +29996,7 @@
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,UA
+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
@@ -29414,7 +30321,6 @@
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:bb00::,2a04:bb07:ffff:ffff:ffff:ffff:ffff:ffff,AT
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
@@ -29488,7 +30394,6 @@
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:ca80::,2a04:ca87:ffff:ffff:ffff:ffff:ffff:ffff,FR
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
@@ -30547,11 +31452,19 @@
2a05:d050:c080::,2a05:d050:c08f:ffff:ffff:ffff:ffff:ffff,GB
2a05:d050:c090::,2a05:d050:c0bf:ffff:ffff:ffff:ffff:ffff,IE
2a05:d050:c0c0::,2a05:d050:c0cf:ffff:ffff:ffff:ffff:ffff,GB
-2a05:d050:c0d0::,2a05:d07c:3fff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:d050:c0d0::,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:d07f:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:d07c: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
@@ -30601,7 +31514,9 @@
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:7:ffff:ffff:ffff:ffff:ffff,GB
+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:8:ffff:ffff:ffff:ffff:ffff,GB
2a05:dfc7:9::,2a05:dfc7:9:7fff:ffff:ffff:ffff:ffff,SG
@@ -30614,7 +31529,14 @@
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:ffff:ffff:ffff:ffff:ffff:ffff,GB
+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
@@ -30650,7 +31572,6 @@
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:e900::,2a05:e907:ffff:ffff:ffff:ffff:ffff:ffff,UA
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
@@ -31708,7 +32629,13 @@
2a06:e881:200::,2a06:e881:2ff:ffff:ffff:ffff:ffff:ffff,AT
2a06:e881:300::,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:e887:ffff:ffff:ffff:ffff:ffff:ffff,CH
+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: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
@@ -31919,7 +32846,13 @@
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:1c47:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a07:1c40::,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:6ff:ffff:ffff:ffff:ffff:ffff,AT
+2a07:1c44:700::,2a07:1c44:70f:ffff:ffff:ffff:ffff:ffff,US
+2a07:1c44:710::,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
@@ -32105,8 +33038,8 @@
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,BG
-2a07:4c80::,2a07:4c87:ffff:ffff:ffff:ffff:ffff:ffff,BG
+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
@@ -32183,7 +33116,7 @@
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,CZ
+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
@@ -32217,7 +33150,7 @@
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,CZ
+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
@@ -32245,7 +33178,7 @@
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,DE
+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
@@ -32275,7 +33208,7 @@
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,DE
+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
@@ -32435,7 +33368,7 @@
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,FI
+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
@@ -32608,7 +33541,7 @@
2a07:c740::,2a07:c747:ffff:ffff:ffff:ffff:ffff:ffff,NL
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,UA
+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
@@ -32622,408 +33555,794 @@
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: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:2300::,2a0a:2307:ffff:ffff:ffff:ffff:ffff:ffff,GB
+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:2780::,2a0a:2787:ffff:ffff:ffff:ffff:ffff:ffff,NO
+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,US
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:3b80::,2a0a:3b80:ffff:ffff:ffff:ffff:ffff:ffff,SE
+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: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:80c0::,2a0a:80c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0a:8100::,2a0a:8107:ffff:ffff:ffff:ffff:ffff:ffff,IR
+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: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: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: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:aa40: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:b700::,2a0a:b707:ffff:ffff:ffff:ffff:ffff:ffff,GE
+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:c000::,2a0a:c007:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0a:c080::,2a0a:c087:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -33163,7 +34482,7 @@
2a0b:380::,2a0b:387:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a0b:400::,2a0b:407:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:480::,2a0b:487:ffff:ffff:ffff:ffff:ffff:ffff,UA
-2a0b:500::,2a0b:507:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:500::,2a0b:507:ffff:ffff:ffff:ffff:ffff:ffff,US
2a0b:580::,2a0b:580:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:600::,2a0b:600:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a0b:680::,2a0b:687:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -33255,7 +34574,7 @@
2a0b:3180::,2a0b:3187:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:3200::,2a0b:3207:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:3280::,2a0b:3280:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a0b:3300::,2a0b:3307:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:3300::,2a0b:3307:ffff:ffff:ffff:ffff:ffff:ffff,US
2a0b:3380::,2a0b:3387:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:3400::,2a0b:3407:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:3480::,2a0b:3487:ffff:ffff:ffff:ffff:ffff:ffff,FI
@@ -33263,7 +34582,7 @@
2a0b:3580::,2a0b:3587:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:3600::,2a0b:3607:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:3680::,2a0b:3687:ffff:ffff:ffff:ffff:ffff:ffff,BG
-2a0b:3700::,2a0b:3707:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:3700::,2a0b:3707:ffff:ffff:ffff:ffff:ffff:ffff,US
2a0b:3780::,2a0b:3780:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:3800::,2a0b:3807:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:3880::,2a0b:3880:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -33368,7 +34687,8 @@
2a0b:6a00::,2a0b:6a07:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:6a80::,2a0b:6a87:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:6b00::,2a0b:6b07:ffff:ffff:ffff:ffff:ffff:ffff,IR
-2a0b:6b80::,2a0b:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:6b80::,2a0b:6b83:ffff:ffff:ffff:ffff:ffff:ffff,US
+2a0b:6b84::,2a0b:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:6c00::,2a0b:6c07:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a0b:6c80::,2a0b:6c87:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:6d00::,2a0b:6d07:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -33423,7 +34743,7 @@
2a0b:8580::,2a0b:8587:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:8600::,2a0b:8607:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a0b:8680::,2a0b:8687:ffff:ffff:ffff:ffff:ffff:ffff,BY
-2a0b:8700::,2a0b:8707:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:8700::,2a0b:8707:ffff:ffff:ffff:ffff:ffff:ffff,US
2a0b:8780::,2a0b:8787:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a0b:8800::,2a0b:8807:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a0b:8880::,2a0b:8887:ffff:ffff:ffff:ffff:ffff:ffff,FI
@@ -33546,7 +34866,7 @@
2a0b:c300::,2a0b:c307:ffff:ffff:ffff:ffff:ffff:ffff,SI
2a0b:c380::,2a0b:c387:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:c400::,2a0b:c407:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2a0b:c480::,2a0b:c480:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:c480::,2a0b:c487:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:c500::,2a0b:c500:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:c580::,2a0b:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:c600::,2a0b:c607:ffff:ffff:ffff:ffff:ffff:ffff,IT
@@ -33568,57 +34888,120 @@
2a0b:ce00::,2a0b:ce07:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:ce80::,2a0b:ce87:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:cf00::,2a0b:cf07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:cf80::,2a0b:cf87:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:d000::,2a0b:d007:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:d080::,2a0b:d080:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:d100::,2a0b:d107:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:d180::,2a0b:d180:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a0b:d200::,2a0b:d207:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2a0b:d280::,2a0b:d287:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:d300::,2a0b:d307:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:d380::,2a0b:d387:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:d400::,2a0b:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a0b:d480::,2a0b:d487:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:d500::,2a0b:d507:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:d580::,2a0b:d580:ffff:ffff:ffff:ffff:ffff:ffff,OM
2a0b:d600::,2a0b:d607:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:d680::,2a0b:d680:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:d700::,2a0b:d707:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:d780::,2a0b:d787:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:d800::,2a0b:d807:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:d880::,2a0b:d887:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:d900::,2a0b:d907:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2a0b:d980::,2a0b:d987:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:da00::,2a0b:da07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:da80::,2a0b:da87:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:db00::,2a0b:db07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:db80::,2a0b:db87:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:dc00::,2a0b:dc07:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:dc80::,2a0b:dc87:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a0b:dd00::,2a0b:dd07:ffff:ffff:ffff:ffff:ffff:ffff,MD
+2a0b:dd80::,2a0b:dd87:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:de00::,2a0b:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:de80::,2a0b:de87:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:df00::,2a0b:df00:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:df80::,2a0b:df87:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a0b:e000::,2a0b:e007:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:e080::,2a0b:e081:ffff:ffff:ffff:ffff:ffff:ffff,LB
2a0b:e100::,2a0b:e107:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:e180::,2a0b:e187:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:e200::,2a0b:e207:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:e280::,2a0b:e287:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:e300::,2a0b:e300:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a0b:e380::,2a0b:e387:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:e400::,2a0b:e407:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:e480::,2a0b:e487:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:e500::,2a0b:e501:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:e580::,2a0b:e587:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:e600::,2a0b:e607:ffff:ffff:ffff:ffff:ffff:ffff,HR
+2a0b:e680::,2a0b:e687:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:e700::,2a0b:e707:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:e780::,2a0b:e787:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:e800::,2a0b:e807:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:e880::,2a0b:e887:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:e900::,2a0b:e907:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:e980::,2a0b:e987:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:ea00::,2a0b:ea00:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:ea80::,2a0b:ea80:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:eb00::,2a0b:eb07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:eb80::,2a0b:eb87:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:ec00::,2a0b:ec07:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:ec80::,2a0b:ec87:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:ed00::,2a0b:ed07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:ed80::,2a0b:ed87:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:ee00::,2a0b:ee07:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a0b:ee80::,2a0b:ee87:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:ef00::,2a0b:ef07:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:ef80::,2a0b:ef87:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:f000::,2a0b:f000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2a0b:f080::,2a0b:f080:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:f100::,2a0b:f107:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a0b:f180::,2a0b:f180:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:f200::,2a0b:f200:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a0b:f280::,2a0b:f287:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:f300::,2a0b:f307:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:f380::,2a0b:f387:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:f400::,2a0b:f400:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:f480::,2a0b:f480:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a0b:f500::,2a0b:f507:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:f580::,2a0b:f587:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a0b:f600::,2a0b:f607:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:f680::,2a0b:f687:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a0b:f700::,2a0b:f707:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a0b:f780::,2a0b:f787:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:f800::,2a0b:f800:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a0b:f880::,2a0b:f887:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:f900::,2a0b:f907:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a0b:f980::,2a0b:f987:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:fa00::,2a0b:fa07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:fa80::,2a0b:fa87:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:fb00::,2a0b:fb07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:fb80::,2a0b:fb87:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:fc00::,2a0b:fc07:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2a0b:fc80::,2a0b:fc87:ffff:ffff:ffff:ffff:ffff:ffff,LB
2a0b:fd00::,2a0b:fd00:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:fd80::,2a0b:fd87:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a0b:fe00::,2a0b:fe07:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:fe80::,2a0b:fe87:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:ff00::,2a0b:ff07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:ff80::,2a0b:ff87:ffff:ffff:ffff:ffff:ffff:ffff,RU
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
+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: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
@@ -33682,6 +35065,7 @@
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
diff --git a/src/ext/byteorder.h b/src/ext/byteorder.h
new file mode 100644
index 0000000000..c8ba52184b
--- /dev/null
+++ b/src/ext/byteorder.h
@@ -0,0 +1,67 @@
+/* <MIT License>
+ Copyright (c) 2013-2014 Marek Majkowski <marek@popcount.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
+ 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.
+ </MIT License>
+
+ 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 <libkern/OSByteOrder.h>
+# define _le64toh(x) OSSwapLittleToHostInt64(x)
+#elif defined(sun) || defined(__sun)
+# include <sys/byteorder.h>
+# define _le64toh(x) LE_64(x)
+
+#else
+
+/* See: http://sourceforge.net/p/predef/wiki/Endianness/ */
+# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD)
+# include <sys/endian.h>
+# else
+# include <endian.h>
+# 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/ext/csiphash.c b/src/ext/csiphash.c
index 8348c66048..1029bbbad3 100644
--- a/src/ext/csiphash.c
+++ b/src/ext/csiphash.c
@@ -35,41 +35,7 @@
#include "util.h"
/* for memcpy */
#include <string.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 <libkern/OSByteOrder.h>
-# define _le64toh(x) OSSwapLittleToHostInt64(x)
-#elif defined(sun) || defined(__sun)
-# include <sys/byteorder.h>
-# define _le64toh(x) LE_64(x)
-
-#else
-
-/* See: http://sourceforge.net/p/predef/wiki/Endianness/ */
-# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD)
-# include <sys/endian.h>
-# else
-# include <endian.h>
-# 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
+#include "byteorder.h"
#define ROTATE(x, b) (uint64_t)( ((x) << (b)) | ( (x) >> (64 - (b))) )
diff --git a/src/ext/ed25519/donna/ed25519-hash-custom.h b/src/ext/ed25519/donna/ed25519-hash-custom.h
index 7dc249129d..609451abd5 100644
--- a/src/ext/ed25519/donna/ed25519-hash-custom.h
+++ b/src/ext/ed25519/donna/ed25519-hash-custom.h
@@ -9,3 +9,34 @@
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/ext/ed25519/ref10/crypto_hash_sha512.h b/src/ext/ed25519/ref10/crypto_hash_sha512.h
index 0278571522..5dad935c79 100644
--- a/src/ext/ed25519/ref10/crypto_hash_sha512.h
+++ b/src/ext/ed25519/ref10/crypto_hash_sha512.h
@@ -1,30 +1,32 @@
/* Added for Tor. */
-#include <openssl/sha.h>
+#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) \
- SHA512((inp), (len), (out))
+ 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 { \
- SHA512_CTX sha_ctx_; \
- SHA512_Init(&sha_ctx_); \
- SHA512_Update(&sha_ctx_, (inp1), (len1)); \
- SHA512_Update(&sha_ctx_, (inp2), (len2)); \
- SHA512_Final((out), &sha_ctx_); \
- } while(0)
+ 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 { \
- SHA512_CTX sha_ctx_; \
- SHA512_Init(&sha_ctx_); \
- SHA512_Update(&sha_ctx_, (inp1), (len1)); \
- SHA512_Update(&sha_ctx_, (inp2), (len2)); \
- SHA512_Update(&sha_ctx_, (inp3), (len3)); \
- SHA512_Final((out), &sha_ctx_); \
+ 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/ext/ht.h b/src/ext/ht.h
index a441d0b685..caa420e9b5 100644
--- a/src/ext/ht.h
+++ b/src/ext/ht.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2002, Christopher Clark.
* Copyright (c) 2005-2006, Nick Mathewson.
- * Copyright (c) 2007-2015, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See license at end. */
/* Based on ideas by Christopher Clark and interfaces from Niels Provos. */
diff --git a/src/ext/include.am b/src/ext/include.am
index f00f3e031e..7ec2e43312 100644
--- a/src/ext/include.am
+++ b/src/ext/include.am
@@ -5,6 +5,7 @@ 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 \
@@ -100,6 +101,7 @@ 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= \
diff --git a/src/ext/keccak-tiny/keccak-tiny-unrolled.c b/src/ext/keccak-tiny/keccak-tiny-unrolled.c
index d1342c3601..d8d7fe335a 100644
--- a/src/ext/keccak-tiny/keccak-tiny-unrolled.c
+++ b/src/ext/keccak-tiny/keccak-tiny-unrolled.c
@@ -10,28 +10,21 @@
#include <string.h>
#include "crypto.h"
+#include "byteorder.h"
/******** Endianness conversion helpers ********/
static inline uint64_t
loadu64le(const unsigned char *x) {
- uint64_t r = 0;
- size_t i;
-
- for (i = 0; i < 8; ++i) {
- r |= (uint64_t)x[i] << 8 * i;
- }
- return r;
+ uint64_t r;
+ memcpy(&r, x, sizeof(r));
+ return _le64toh(r);
}
static inline void
storeu64le(uint8_t *x, uint64_t u) {
- size_t i;
-
- for(i=0; i<8; ++i) {
- x[i] = u;
- u >>= 8;
- }
+ uint64_t val = _le64toh(u);
+ memcpy(x, &val, sizeof(u));
}
/******** The Keccak-f[1600] permutation ********/
diff --git a/src/ext/trunnel/trunnel-impl.h b/src/ext/trunnel/trunnel-impl.h
index bc805851b1..85c847b3fd 100644
--- a/src/ext/trunnel/trunnel-impl.h
+++ b/src/ext/trunnel/trunnel-impl.h
@@ -5,7 +5,7 @@
/* trunnel-impl.h -- Implementation helpers for trunnel, included by
* generated trunnel files
*
- * Copyright 2014-2015, The Tor Project, Inc.
+ * Copyright 2014-2017, The Tor Project, Inc.
* See license at the end of this file for copying information.
*/
diff --git a/src/ext/trunnel/trunnel.c b/src/ext/trunnel/trunnel.c
index 8f72351277..6a42417241 100644
--- a/src/ext/trunnel/trunnel.c
+++ b/src/ext/trunnel/trunnel.c
@@ -4,7 +4,7 @@
*/
/* trunnel.c -- Helper functions to implement trunnel.
*
- * Copyright 2014-2015, The Tor Project, Inc.
+ * 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.
@@ -31,7 +31,7 @@
# define IS_LITTLE_ENDIAN
# endif
#else
-# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD)
+# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
# include <sys/endian.h>
# else
# include <endian.h>
diff --git a/src/ext/trunnel/trunnel.h b/src/ext/trunnel/trunnel.h
index 85bbcc5451..dd78553c77 100644
--- a/src/ext/trunnel/trunnel.h
+++ b/src/ext/trunnel/trunnel.h
@@ -5,7 +5,7 @@
/* trunnel.h -- Public declarations for trunnel, to be included
* in trunnel header files.
- * Copyright 2014-2015, The Tor Project, Inc.
+ * Copyright 2014-2017, The Tor Project, Inc.
* See license at the end of this file for copying information.
*/
diff --git a/src/include.am b/src/include.am
index d12684e187..f78853f50f 100644
--- a/src/include.am
+++ b/src/include.am
@@ -7,3 +7,4 @@ 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/or/addressmap.c b/src/or/addressmap.c
index 85a6434f4a..c92af38254 100644
--- a/src/or/addressmap.c
+++ b/src/or/addressmap.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/addressmap.h b/src/or/addressmap.h
index 67648d0518..80f453b4c1 100644
--- a/src/or/addressmap.h
+++ b/src/or/addressmap.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_ADDRESSMAP_H
diff --git a/src/or/bridges.c b/src/or/bridges.c
index 8b37f412ea..ef0638c0a7 100644
--- a/src/or/bridges.c
+++ b/src/or/bridges.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -199,6 +199,33 @@ get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr,
return NULL;
}
+/**
+ * As get_configured_bridge_by_addr_port, but require that the
+ * address match <b>addr</b>:<b>port</b>, and that the ID digest match
+ * <b>digest</b>. (The other function will ignore the address if the
+ * digest matches.)
+ */
+bridge_info_t *
+get_configured_bridge_by_exact_addr_port_digest(const tor_addr_t *addr,
+ uint16_t port,
+ const char *digest)
+{
+ if (!bridge_list)
+ return NULL;
+ SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) {
+ if (!tor_addr_compare(&bridge->addr, addr, CMP_EXACT) &&
+ bridge->port == port) {
+
+ if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN))
+ return bridge;
+ else if (!digest || tor_digest_is_zero(bridge->identity))
+ return bridge;
+ }
+
+ } SMARTLIST_FOREACH_END(bridge);
+ return NULL;
+}
+
/** If we have a bridge configured whose digest matches <b>digest</b>, or a
* bridge with no known digest whose address matches <b>addr</b>:<b>port</b>,
* return 1. Else return 0. If <b>digest</b> is NULL, check for
@@ -270,7 +297,7 @@ learned_router_identity(const tor_addr_t *addr, uint16_t port,
(void)ed_id;
int learned = 0;
bridge_info_t *bridge =
- get_configured_bridge_by_addr_port_digest(addr, port, digest);
+ get_configured_bridge_by_exact_addr_port_digest(addr, port, digest);
if (bridge && tor_digest_is_zero(bridge->identity)) {
memcpy(bridge->identity, digest, DIGEST_LEN);
learned = 1;
@@ -543,12 +570,18 @@ launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge)
return;
}
- directory_initiate_command(&bridge->addr, bridge->port,
- NULL, 0, /*no dirport*/
- bridge->identity,
- DIR_PURPOSE_FETCH_SERVERDESC,
- ROUTER_PURPOSE_BRIDGE,
- DIRIND_ONEHOP, "authority.z", NULL, 0, 0);
+ tor_addr_port_t bridge_addrport;
+ memcpy(&bridge_addrport.addr, &bridge->addr, sizeof(tor_addr_t));
+ bridge_addrport.port = bridge->port;
+
+ directory_request_t *req =
+ directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC);
+ directory_request_set_or_addr_port(req, &bridge_addrport);
+ directory_request_set_directory_id_digest(req, bridge->identity);
+ directory_request_set_router_purpose(req, ROUTER_PURPOSE_BRIDGE);
+ directory_request_set_resource(req, "authority.z");
+ directory_initiate_request(req);
+ directory_request_free(req);
}
/** Fetching the bridge descriptor from the bridge authority returned a
diff --git a/src/or/bridges.h b/src/or/bridges.h
index de23fe6eeb..3bfc782f9a 100644
--- a/src/or/bridges.h
+++ b/src/or/bridges.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -27,6 +27,10 @@ bridge_info_t *get_configured_bridge_by_addr_port_digest(
const tor_addr_t *addr,
uint16_t port,
const char *digest);
+bridge_info_t *get_configured_bridge_by_exact_addr_port_digest(
+ const tor_addr_t *addr,
+ uint16_t port,
+ const char *digest);
int addr_is_a_configured_bridge(const tor_addr_t *addr, uint16_t port,
const char *digest);
diff --git a/src/or/buffers.c b/src/or/buffers.c
index 6111820701..4f22935d26 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -83,7 +83,11 @@ static int parse_socks_client(const uint8_t *data, size_t datalen,
#define CHUNK_HEADER_LEN STRUCT_OFFSET(chunk_t, mem[0])
/* We leave this many NUL bytes at the end of the buffer. */
+#ifdef DISABLE_MEMORY_SENTINELS
+#define SENTINEL_LEN 0
+#else
#define SENTINEL_LEN 4
+#endif
/* Header size plus NUL bytes at the end */
#define CHUNK_OVERHEAD (CHUNK_HEADER_LEN + SENTINEL_LEN)
@@ -97,18 +101,22 @@ static int parse_socks_client(const uint8_t *data, size_t datalen,
#define DEBUG_SENTINEL
-#ifdef DEBUG_SENTINEL
+#if defined(DEBUG_SENTINEL) && !defined(DISABLE_MEMORY_SENTINELS)
#define DBG_S(s) s
#else
#define DBG_S(s) (void)0
#endif
+#ifdef DISABLE_MEMORY_SENTINELS
+#define CHUNK_SET_SENTINEL(chunk, alloclen) STMT_NIL
+#else
#define CHUNK_SET_SENTINEL(chunk, alloclen) do { \
uint8_t *a = (uint8_t*) &(chunk)->mem[(chunk)->memlen]; \
DBG_S(uint8_t *b = &((uint8_t*)(chunk))[(alloclen)-SENTINEL_LEN]); \
DBG_S(tor_assert(a == b)); \
memset(a,0,SENTINEL_LEN); \
} while (0)
+#endif
/** Return the next character in <b>chunk</b> onto which data can be appended.
* If the chunk is full, this might be off the end of chunk->mem. */
@@ -610,6 +618,11 @@ read_to_buf(tor_socket_t s, size_t at_most, buf_t *buf, int *reached_eof,
tor_assert(reached_eof);
tor_assert(SOCKET_OK(s));
+ if (BUG(buf->datalen >= INT_MAX))
+ return -1;
+ if (BUG(buf->datalen >= INT_MAX - at_most))
+ return -1;
+
while (at_most > total_read) {
size_t readlen = at_most - total_read;
chunk_t *chunk;
@@ -667,6 +680,11 @@ read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf)
check();
+ if (BUG(buf->datalen >= INT_MAX))
+ return -1;
+ if (BUG(buf->datalen >= INT_MAX - at_most))
+ return -1;
+
while (at_most > total_read) {
size_t readlen = at_most - total_read;
chunk_t *chunk;
@@ -861,6 +879,11 @@ write_to_buf(const char *string, size_t string_len, buf_t *buf)
return (int)buf->datalen;
check();
+ if (BUG(buf->datalen >= INT_MAX))
+ return -1;
+ if (BUG(buf->datalen >= INT_MAX - string_len))
+ return -1;
+
while (string_len) {
size_t copy;
if (!buf->tail || !CHUNK_REMAINING_CAPACITY(buf->tail))
@@ -1010,6 +1033,12 @@ move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen)
/* We can do way better here, but this doesn't turn up in any profiles. */
char b[4096];
size_t cp, len;
+
+ if (BUG(buf_out->datalen >= INT_MAX))
+ return -1;
+ if (BUG(buf_out->datalen >= INT_MAX - *buf_flushlen))
+ return -1;
+
len = *buf_flushlen;
if (len > buf_in->datalen)
len = buf_in->datalen;
@@ -2059,13 +2088,13 @@ fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len)
}
/** Compress on uncompress the <b>data_len</b> bytes in <b>data</b> using the
- * zlib state <b>state</b>, appending the result to <b>buf</b>. If
+ * compression state <b>state</b>, appending the result to <b>buf</b>. If
* <b>done</b> is true, flush the data in the state and finish the
* compression/uncompression. Return -1 on failure, 0 on success. */
int
-write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state,
- const char *data, size_t data_len,
- int done)
+write_to_buf_compress(buf_t *buf, tor_compress_state_t *state,
+ const char *data, size_t data_len,
+ int done)
{
char *next;
size_t old_avail, avail;
@@ -2079,20 +2108,22 @@ write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state,
}
next = CHUNK_WRITE_PTR(buf->tail);
avail = old_avail = CHUNK_REMAINING_CAPACITY(buf->tail);
- switch (tor_zlib_process(state, &next, &avail, &data, &data_len, done)) {
- case TOR_ZLIB_DONE:
+ switch (tor_compress_process(state, &next, &avail,
+ &data, &data_len, done)) {
+ case TOR_COMPRESS_DONE:
over = 1;
break;
- case TOR_ZLIB_ERR:
+ case TOR_COMPRESS_ERROR:
return -1;
- case TOR_ZLIB_OK:
+ case TOR_COMPRESS_OK:
if (data_len == 0)
over = 1;
break;
- case TOR_ZLIB_BUF_FULL:
+ case TOR_COMPRESS_BUFFER_FULL:
if (avail) {
- /* Zlib says we need more room (ZLIB_BUF_FULL). Start a new chunk
- * automatically, whether were going to or not. */
+ /* The compression module says we need more room
+ * (TOR_COMPRESS_BUFFER_FULL). Start a new chunk automatically,
+ * whether were going to or not. */
need_new_chunk = 1;
}
break;
diff --git a/src/or/buffers.h b/src/or/buffers.h
index bb53b3bbff..23b58a571a 100644
--- a/src/or/buffers.h
+++ b/src/or/buffers.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -36,8 +36,8 @@ int flush_buf(tor_socket_t s, buf_t *buf, size_t sz, size_t *buf_flushlen);
int flush_buf_tls(tor_tls_t *tls, buf_t *buf, size_t sz, size_t *buf_flushlen);
int write_to_buf(const char *string, size_t string_len, buf_t *buf);
-int write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state,
- const char *data, size_t data_len, int done);
+int write_to_buf_compress(buf_t *buf, tor_compress_state_t *state,
+ const char *data, size_t data_len, int done);
int move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen);
int fetch_from_buf(char *string, size_t string_len, buf_t *buf);
int fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto);
diff --git a/src/or/channel.c b/src/or/channel.c
index a806c4c93b..599b00aa6b 100644
--- a/src/or/channel.c
+++ b/src/or/channel.c
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/channel.h b/src/or/channel.h
index f03fabb7c2..bfcdafb276 100644
--- a/src/or/channel.h
+++ b/src/or/channel.h
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -300,8 +300,8 @@ struct channel_s {
unsigned int is_bad_for_new_circs:1;
/** True iff we have decided that the other end of this connection
- * is a client. Channels with this flag set should never be used
- * to satisfy an EXTEND request. */
+ * is a client or bridge relay. Connections with this flag set should never
+ * be used to satisfy an EXTEND request. */
unsigned int is_client:1;
/** Set if the channel was initiated remotely (came from a listener) */
diff --git a/src/or/channeltls.c b/src/or/channeltls.c
index 7f5667b918..4cdd554174 100644
--- a/src/or/channeltls.c
+++ b/src/or/channeltls.c
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -1720,6 +1720,10 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan)
tor_assert(tor_mem_is_zero(
(const char*)(chan->conn->handshake_state->
authenticated_ed25519_peer_id.pubkey), 32));
+ /* If the client never authenticated, it's a tor client or bridge
+ * relay, and we must not use it for EXTEND requests (nor could we, as
+ * there are no authenticated peer IDs) */
+ channel_mark_client(TLS_CHAN_TO_BASE(chan));
channel_set_circid_type(TLS_CHAN_TO_BASE(chan), NULL,
chan->conn->link_proto < MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS);
diff --git a/src/or/channeltls.h b/src/or/channeltls.h
index 729e595615..1f9a39d8a4 100644
--- a/src/or/channeltls.h
+++ b/src/or/channeltls.h
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circpathbias.c b/src/or/circpathbias.c
index cdcb6deae4..4c0bd9e455 100644
--- a/src/or/circpathbias.c
+++ b/src/or/circpathbias.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circpathbias.h b/src/or/circpathbias.h
index ce76689d5f..2a4c316807 100644
--- a/src/or/circpathbias.h
+++ b/src/or/circpathbias.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 24b7c7f4d9..08827c053b 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -73,7 +73,6 @@ static int circuit_deliver_create_cell(circuit_t *circ,
static int onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit);
static crypt_path_t *onion_next_hop_in_cpath(crypt_path_t *cpath);
static int onion_extend_cpath(origin_circuit_t *circ);
-static int count_acceptable_nodes(smartlist_t *routers);
static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice);
/** This function tries to get a channel to the specified endpoint,
@@ -819,7 +818,7 @@ should_use_create_fast_for_circuit(origin_circuit_t *circ)
}
if (options->FastFirstHopPK == -1) {
/* option is "auto", so look at the consensus. */
- return networkstatus_get_param(NULL, "usecreatefast", 1, 0, 1);
+ return networkstatus_get_param(NULL, "usecreatefast", 0, 0, 1);
}
return options->FastFirstHopPK;
@@ -892,6 +891,27 @@ circuit_pick_extend_handshake(uint8_t *cell_type_out,
}
}
+/**
+ * Return true iff <b>purpose</b> is a purpose for a circuit which is
+ * allowed to have no guard configured, even if the circuit is multihop
+ * and guards are enabled.
+ */
+static int
+circuit_purpose_may_omit_guard(int purpose)
+{
+ switch (purpose) {
+ case CIRCUIT_PURPOSE_TESTING:
+ case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT:
+ /* Testing circuits may omit guards because they're measuring
+ * liveness or performance, and don't want guards to interfere. */
+ return 1;
+ default:
+ /* All other multihop circuits should use guards if guards are
+ * enabled. */
+ return 0;
+ }
+}
+
/** This is the backbone function for building circuits.
*
* If circ's first hop is closed, then we need to build a create
@@ -978,7 +998,7 @@ circuit_send_next_onion_skin(origin_circuit_t *circ)
guard_usable_t r;
if (! circ->guard_state) {
if (circuit_get_cpath_len(circ) != 1 &&
- circ->base_.purpose != CIRCUIT_PURPOSE_TESTING &&
+ ! circuit_purpose_may_omit_guard(circ->base_.purpose) &&
get_options()->UseEntryGuards) {
log_warn(LD_BUG, "%d-hop circuit %p with purpose %d has no "
"guard state",
@@ -1534,13 +1554,98 @@ onionskin_answer(or_circuit_t *circ,
return 0;
}
-/** Choose a length for a circuit of purpose <b>purpose</b>: three + the
- * number of endpoints that would give something away about our destination.
+/** Helper for new_route_len(). Choose a circuit length for purpose
+ * <b>purpose</b>: DEFAULT_ROUTE_LEN (+ 1 if someone else chose the
+ * exit). If someone else chose the exit, they could be colluding
+ * with the exit, so add a randomly selected node to preserve
+ * anonymity.
+ *
+ * Here, "exit node" sometimes means an OR acting as an internal
+ * endpoint, rather than as a relay to an external endpoint. This
+ * means there need to be at least DEFAULT_ROUTE_LEN routers between
+ * us and the internal endpoint to preserve the same anonymity
+ * properties that we would get when connecting to an external
+ * endpoint. These internal endpoints can include:
+ *
+ * - Connections to a directory of hidden services
+ * (CIRCUIT_PURPOSE_C_GENERAL)
+ *
+ * - A client connecting to an introduction point, which the hidden
+ * service picked (CIRCUIT_PURPOSE_C_INTRODUCING, via
+ * circuit_get_open_circ_or_launch() which rewrites it from
+ * CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT)
+ *
+ * - A hidden service connecting to a rendezvous point, which the
+ * client picked (CIRCUIT_PURPOSE_S_CONNECT_REND, via
+ * rend_service_receive_introduction() and
+ * rend_service_relaunch_rendezvous)
+ *
+ * There are currently two situations where we picked the exit node
+ * ourselves, making DEFAULT_ROUTE_LEN a safe circuit length:
+ *
+ * - We are a hidden service connecting to an introduction point
+ * (CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, via
+ * rend_service_launch_establish_intro())
+ *
+ * - We are a router testing its own reachabiity
+ * (CIRCUIT_PURPOSE_TESTING, via consider_testing_reachability())
+ *
+ * onion_pick_cpath_exit() bypasses us (by not calling
+ * new_route_len()) in the one-hop tunnel case, so we don't need to
+ * handle that.
+ */
+static int
+route_len_for_purpose(uint8_t purpose, extend_info_t *exit_ei)
+{
+ int routelen = DEFAULT_ROUTE_LEN;
+ int known_purpose = 0;
+
+ if (!exit_ei)
+ return routelen;
+
+ switch (purpose) {
+ /* These two purposes connect to a router that we chose, so
+ * DEFAULT_ROUTE_LEN is safe. */
+ case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO:
+ /* hidden service connecting to introduction point */
+ case CIRCUIT_PURPOSE_TESTING:
+ /* router reachability testing */
+ known_purpose = 1;
+ break;
+
+ /* These three purposes connect to a router that someone else
+ * might have chosen, so add an extra hop to protect anonymity. */
+ case CIRCUIT_PURPOSE_C_GENERAL:
+ /* connecting to hidden service directory */
+ case CIRCUIT_PURPOSE_C_INTRODUCING:
+ /* client connecting to introduction point */
+ case CIRCUIT_PURPOSE_S_CONNECT_REND:
+ /* hidden service connecting to rendezvous point */
+ known_purpose = 1;
+ routelen++;
+ break;
+
+ default:
+ /* Got a purpose not listed above along with a chosen exit.
+ * Increase the circuit length by one anyway for safety. */
+ routelen++;
+ break;
+ }
+
+ if (BUG(exit_ei && !known_purpose)) {
+ log_warn(LD_BUG, "Unhandled purpose %d with a chosen exit; "
+ "assuming routelen %d.", purpose, routelen);
+ }
+ return routelen;
+}
+
+/** Choose a length for a circuit of purpose <b>purpose</b> and check
+ * if enough routers are available.
*
* If the routerlist <b>nodes</b> doesn't have enough routers
* to handle the desired path length, return -1.
*/
-static int
+STATIC int
new_route_len(uint8_t purpose, extend_info_t *exit_ei, smartlist_t *nodes)
{
int num_acceptable_routers;
@@ -1548,11 +1653,7 @@ new_route_len(uint8_t purpose, extend_info_t *exit_ei, smartlist_t *nodes)
tor_assert(nodes);
- routelen = DEFAULT_ROUTE_LEN;
- if (exit_ei &&
- purpose != CIRCUIT_PURPOSE_TESTING &&
- purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO)
- routelen++;
+ routelen = route_len_for_purpose(purpose, exit_ei);
num_acceptable_routers = count_acceptable_nodes(nodes);
@@ -2176,8 +2277,8 @@ circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei)
/** Return the number of routers in <b>routers</b> that are currently up
* and available for building circuits through.
*/
-static int
-count_acceptable_nodes(smartlist_t *nodes)
+MOCK_IMPL(STATIC int,
+count_acceptable_nodes, (smartlist_t *nodes))
{
int num=0;
diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h
index ddb070b427..45d9b2fb75 100644
--- a/src/or/circuitbuild.h
+++ b/src/or/circuitbuild.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -77,6 +77,9 @@ void circuit_upgrade_circuits_from_guard_wait(void);
#ifdef CIRCUITBUILD_PRIVATE
STATIC circid_t get_unique_circ_id_by_chan(channel_t *chan);
+STATIC int new_route_len(uint8_t purpose, extend_info_t *exit_ei,
+ smartlist_t *nodes);
+MOCK_DECL(STATIC int, count_acceptable_nodes, (smartlist_t *nodes));
#if defined(ENABLE_TOR2WEB_MODE) || defined(TOR_UNIT_TESTS)
STATIC const node_t *pick_tor2web_rendezvous_node(router_crn_flags_t flags,
const or_options_t *options);
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index 1a3b7bb288..5761890924 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -1,7 +1,7 @@
/* Copyright 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -984,10 +984,6 @@ circuit_free(circuit_t *circ)
crypto_cipher_free(ocirc->n_crypto);
crypto_digest_free(ocirc->n_digest);
- if (ocirc->hs_token) {
- hs_circuitmap_remove_circuit(ocirc);
- }
-
if (ocirc->rend_splice) {
or_circuit_t *other = ocirc->rend_splice;
tor_assert(other->base_.magic == OR_CIRCUIT_MAGIC);
@@ -1019,6 +1015,11 @@ circuit_free(circuit_t *circ)
/* Remove from map. */
circuit_set_n_circid_chan(circ, 0, NULL);
+ /* Clear HS circuitmap token from this circ (if any) */
+ if (circ->hs_token) {
+ hs_circuitmap_remove_circuit(circ);
+ }
+
/* Clear cell queue _after_ removing it from the map. Otherwise our
* "active" checks will be violated. */
cell_queue_clear(&circ->n_chan_cells);
@@ -2030,10 +2031,10 @@ single_conn_free_bytes(connection_t *conn)
}
if (conn->type == CONN_TYPE_DIR) {
dir_connection_t *dir_conn = TO_DIR_CONN(conn);
- if (dir_conn->zlib_state) {
- result += tor_zlib_state_size(dir_conn->zlib_state);
- tor_zlib_free(dir_conn->zlib_state);
- dir_conn->zlib_state = NULL;
+ if (dir_conn->compress_state) {
+ result += tor_compress_state_size(dir_conn->compress_state);
+ tor_compress_free(dir_conn->compress_state);
+ dir_conn->compress_state = NULL;
}
}
return result;
diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h
index 6abee37dc4..d647062f46 100644
--- a/src/or/circuitlist.h
+++ b/src/or/circuitlist.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuitmux.c b/src/or/circuitmux.c
index 96a3647aab..ee0d5c718b 100644
--- a/src/or/circuitmux.c
+++ b/src/or/circuitmux.c
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuitmux.h b/src/or/circuitmux.h
index 00745ac4a1..42a46aaa47 100644
--- a/src/or/circuitmux.h
+++ b/src/or/circuitmux.h
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuitmux_ewma.c b/src/or/circuitmux_ewma.c
index 0219459cdb..c2440b13f0 100644
--- a/src/or/circuitmux_ewma.c
+++ b/src/or/circuitmux_ewma.c
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuitmux_ewma.h b/src/or/circuitmux_ewma.h
index a7b8961ac6..1f04408789 100644
--- a/src/or/circuitmux_ewma.h
+++ b/src/or/circuitmux_ewma.h
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c
index 48cb89dc37..fe6f723bd5 100644
--- a/src/or/circuitstats.c
+++ b/src/or/circuitstats.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuitstats.h b/src/or/circuitstats.h
index 23910276ae..4977b26c0d 100644
--- a/src/or/circuitstats.h
+++ b/src/or/circuitstats.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index d0bc7d3586..03b28c6ebd 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -1240,8 +1240,8 @@ circuit_predict_and_launch_new(void)
/** Build a new test circuit every 5 minutes */
#define TESTING_CIRCUIT_INTERVAL 300
-/** This function is called once a second, if router_have_min_dir_info() is
- * true. Its job is to make sure all services we offer have enough circuits
+/** This function is called once a second, if router_have_minimum_dir_info()
+ * is true. Its job is to make sure all services we offer have enough circuits
* available. Some services just want enough circuits for current tasks,
* whereas others want a minimum set of idle circuits hanging around.
*/
diff --git a/src/or/circuituse.h b/src/or/circuituse.h
index e5f8700ea2..ad4c214a3b 100644
--- a/src/or/circuituse.h
+++ b/src/or/circuituse.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/command.c b/src/or/command.c
index 5f3b667ad9..c667cbbe52 100644
--- a/src/or/command.c
+++ b/src/or/command.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -353,6 +353,16 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
int len;
created_cell_t created_cell;
+ /* If the client used CREATE_FAST, it's probably a tor client or bridge
+ * relay, and we must not use it for EXTEND requests (in most cases, we
+ * won't have an authenticated peer ID for the extend).
+ * Public relays on 0.2.9 and later will use CREATE_FAST if they have no
+ * ntor onion key for this relay, but that should be a rare occurrence.
+ * Clients on 0.3.1 and later avoid using CREATE_FAST as much as they can,
+ * even during bootstrap, so the CREATE_FAST check is most accurate for
+ * earlier tor client versions. */
+ channel_mark_client(chan);
+
memset(&created_cell, 0, sizeof(created_cell));
len = onion_skin_server_handshake(ONION_HANDSHAKE_TYPE_FAST,
create_cell->onionskin,
diff --git a/src/or/command.h b/src/or/command.h
index 12cda6a463..5079d42e75 100644
--- a/src/or/command.h
+++ b/src/or/command.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/config.c b/src/or/config.c
index dcf671798e..92808682e8 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -69,10 +69,12 @@
#include "circuitmux.h"
#include "circuitmux_ewma.h"
#include "circuitstats.h"
+#include "compress.h"
#include "config.h"
#include "connection.h"
#include "connection_edge.h"
#include "connection_or.h"
+#include "consdiffmgr.h"
#include "control.h"
#include "confparse.h"
#include "cpuworker.h"
@@ -99,7 +101,6 @@
#include "statefile.h"
#include "transports.h"
#include "ext_orport.h"
-#include "torgzip.h"
#ifdef _WIN32
#include <shlobj.h>
#endif
@@ -1819,6 +1820,15 @@ options_act(const or_options_t *old_options)
return -1;
}
+ if (server_mode(options)) {
+ static int cdm_initialized = 0;
+ if (cdm_initialized == 0) {
+ cdm_initialized = 1;
+ consdiffmgr_configure(NULL);
+ consdiffmgr_validate();
+ }
+ }
+
if (init_control_cookie_authentication(options->CookieAuthentication) < 0) {
log_warn(LD_CONFIG,"Error creating control cookie authentication file.");
return -1;
@@ -2351,7 +2361,7 @@ print_usage(void)
printf(
"Copyright (c) 2001-2004, Roger Dingledine\n"
"Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson\n"
-"Copyright (c) 2007-2016, The Tor Project, Inc.\n\n"
+"Copyright (c) 2007-2017, The Tor Project, Inc.\n\n"
"tor -f <torrc> [args]\n"
"See man page for options, or https://www.torproject.org/ for "
"documentation.\n");
@@ -2819,7 +2829,7 @@ compute_publishserverdescriptor(or_options_t *options)
#define MAX_CIRCS_AVAILABLE_TIME (24*60*60)
/** Highest allowable value for RendPostPeriod. */
-#define MAX_DIR_PERIOD (MIN_ONION_KEY_LIFETIME/2)
+#define MAX_DIR_PERIOD ((7*24*60*60)/2)
/** Lowest allowable value for MaxCircuitDirtiness; if this is too low, Tor
* will generate too many circuits and potentially overload the network. */
@@ -3522,6 +3532,20 @@ options_validate(or_options_t *old_options, or_options_t *options,
return -1;
}
+ /* Inform the hidden service operator that pinning EntryNodes can possibly
+ * be harmful for the service anonymity. */
+ if (options->EntryNodes &&
+ routerset_is_list(options->EntryNodes) &&
+ (options->RendConfigLines != NULL)) {
+ log_warn(LD_CONFIG,
+ "EntryNodes is set with multiple entries and at least one "
+ "hidden service is configured. Pinning entry nodes can possibly "
+ "be harmful to the service anonymity. Because of this, we "
+ "recommend you either don't do that or make sure you know what "
+ "you are doing. For more details, please look at "
+ "https://trac.torproject.org/projects/tor/ticket/21155.");
+ }
+
/* Single Onion Services: non-anonymous hidden services */
if (rend_service_non_anonymous_mode_enabled(options)) {
log_warn(LD_CONFIG,
@@ -4947,9 +4971,21 @@ options_init_from_torrc(int argc, char **argv)
printf("OpenSSL \t\t%-15s\t\t%s\n",
crypto_openssl_get_header_version_str(),
crypto_openssl_get_version_str());
- printf("Zlib \t\t%-15s\t\t%s\n",
- tor_zlib_get_header_version_str(),
- tor_zlib_get_version_str());
+ if (tor_compress_supports_method(ZLIB_METHOD)) {
+ printf("Zlib \t\t%-15s\t\t%s\n",
+ tor_compress_version_str(ZLIB_METHOD),
+ tor_compress_header_version_str(ZLIB_METHOD));
+ }
+ if (tor_compress_supports_method(LZMA_METHOD)) {
+ printf("Liblzma \t\t%-15s\t\t%s\n",
+ tor_compress_version_str(LZMA_METHOD),
+ tor_compress_header_version_str(LZMA_METHOD));
+ }
+ if (tor_compress_supports_method(ZSTD_METHOD)) {
+ printf("Libzstd \t\t%-15s\t\t%s\n",
+ tor_compress_version_str(ZSTD_METHOD),
+ tor_compress_header_version_str(ZSTD_METHOD));
+ }
//TODO: Hex versions?
exit(0);
}
diff --git a/src/or/config.h b/src/or/config.h
index 6645532514..bb7802c990 100644
--- a/src/or/config.h
+++ b/src/or/config.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/confparse.c b/src/or/confparse.c
index 9e352aca27..abae7e33dc 100644
--- a/src/or/confparse.c
+++ b/src/or/confparse.c
@@ -2,7 +2,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -31,8 +31,6 @@ static int config_parse_msec_interval(const char *s, int *ok);
static int config_parse_interval(const char *s, int *ok);
static void config_reset(const config_format_t *fmt, void *options,
const config_var_t *var, int use_defaults);
-static config_line_t *config_lines_dup_and_filter(const config_line_t *inp,
- const char *key);
/** Allocate an empty configuration object of a given format type. */
void *
@@ -80,120 +78,6 @@ config_expand_abbrev(const config_format_t *fmt, const char *option,
return option;
}
-/** Helper: allocate a new configuration option mapping 'key' to 'val',
- * append it to *<b>lst</b>. */
-void
-config_line_append(config_line_t **lst,
- const char *key,
- const char *val)
-{
- config_line_t *newline;
-
- newline = tor_malloc_zero(sizeof(config_line_t));
- newline->key = tor_strdup(key);
- newline->value = tor_strdup(val);
- newline->next = NULL;
- while (*lst)
- lst = &((*lst)->next);
-
- (*lst) = newline;
-}
-
-/** Return the line in <b>lines</b> whose key is exactly <b>key</b>, or NULL
- * if no such key exists. For handling commandline-only options only; other
- * options should be looked up in the appropriate data structure. */
-const config_line_t *
-config_line_find(const config_line_t *lines,
- const char *key)
-{
- const config_line_t *cl;
- for (cl = lines; cl; cl = cl->next) {
- if (!strcmp(cl->key, key))
- return cl;
- }
- return NULL;
-}
-
-/** Helper: parse the config string and strdup into key/value
- * strings. Set *result to the list, or NULL if parsing the string
- * failed. Return 0 on success, -1 on failure. Warn and ignore any
- * misformatted lines.
- *
- * If <b>extended</b> is set, then treat keys beginning with / and with + as
- * indicating "clear" and "append" respectively. */
-int
-config_get_lines(const char *string, config_line_t **result, int extended)
-{
- config_line_t *list = NULL, **next;
- char *k, *v;
- const char *parse_err;
-
- next = &list;
- do {
- k = v = NULL;
- string = parse_config_line_from_str_verbose(string, &k, &v, &parse_err);
- if (!string) {
- log_warn(LD_CONFIG, "Error while parsing configuration: %s",
- parse_err?parse_err:"<unknown>");
- config_free_lines(list);
- tor_free(k);
- tor_free(v);
- return -1;
- }
- if (k && v) {
- unsigned command = CONFIG_LINE_NORMAL;
- if (extended) {
- if (k[0] == '+') {
- char *k_new = tor_strdup(k+1);
- tor_free(k);
- k = k_new;
- command = CONFIG_LINE_APPEND;
- } else if (k[0] == '/') {
- char *k_new = tor_strdup(k+1);
- tor_free(k);
- k = k_new;
- tor_free(v);
- v = tor_strdup("");
- command = CONFIG_LINE_CLEAR;
- }
- }
- /* This list can get long, so we keep a pointer to the end of it
- * rather than using config_line_append over and over and getting
- * n^2 performance. */
- *next = tor_malloc_zero(sizeof(config_line_t));
- (*next)->key = k;
- (*next)->value = v;
- (*next)->next = NULL;
- (*next)->command = command;
- next = &((*next)->next);
- } else {
- tor_free(k);
- tor_free(v);
- }
- } while (*string);
-
- *result = list;
- return 0;
-}
-
-/**
- * Free all the configuration lines on the linked list <b>front</b>.
- */
-void
-config_free_lines(config_line_t *front)
-{
- config_line_t *tmp;
-
- while (front) {
- tmp = front;
- front = tmp->next;
-
- tor_free(tmp->key);
- tor_free(tmp->value);
- tor_free(tmp);
- }
-}
-
/** If <b>key</b> is a deprecated configuration option, return the message
* explaining why it is deprecated (which may be an empty string). Return NULL
* if it is not deprecated. The <b>key</b> field must be fully expanded. */
@@ -633,36 +517,6 @@ config_value_needs_escape(const char *value)
return 0;
}
-/** Return a newly allocated deep copy of the lines in <b>inp</b>. */
-config_line_t *
-config_lines_dup(const config_line_t *inp)
-{
- return config_lines_dup_and_filter(inp, NULL);
-}
-
-/** Return a newly allocated deep copy of the lines in <b>inp</b>,
- * but only the ones that match <b>key</b>. */
-static config_line_t *
-config_lines_dup_and_filter(const config_line_t *inp,
- const char *key)
-{
- config_line_t *result = NULL;
- config_line_t **next_out = &result;
- while (inp) {
- if (key && strcasecmpstart(inp->key, key)) {
- inp = inp->next;
- continue;
- }
- *next_out = tor_malloc_zero(sizeof(config_line_t));
- (*next_out)->key = tor_strdup(inp->key);
- (*next_out)->value = tor_strdup(inp->value);
- inp = inp->next;
- next_out = &((*next_out)->next);
- }
- (*next_out) = NULL;
- return result;
-}
-
/** Return newly allocated line or lines corresponding to <b>key</b> in the
* configuration <b>options</b>. If <b>escape_val</b> is true and a
* value needs to be quoted before it's put in a config file, quote and
@@ -779,6 +633,7 @@ config_get_assigned_option(const config_format_t *fmt, const void *options,
tor_free(result);
return NULL;
case CONFIG_TYPE_LINELIST_S:
+ tor_free(result->key);
tor_free(result);
result = config_lines_dup_and_filter(*(const config_line_t **)value,
key);
@@ -1027,36 +882,6 @@ config_free(const config_format_t *fmt, void *options)
tor_free(options);
}
-/** Return true iff a and b contain identical keys and values in identical
- * order. */
-int
-config_lines_eq(config_line_t *a, config_line_t *b)
-{
- while (a && b) {
- if (strcasecmp(a->key, b->key) || strcmp(a->value, b->value))
- return 0;
- a = a->next;
- b = b->next;
- }
- if (a || b)
- return 0;
- return 1;
-}
-
-/** Return the number of lines in <b>a</b> whose key is <b>key</b>. */
-int
-config_count_key(const config_line_t *a, const char *key)
-{
- int n = 0;
- while (a) {
- if (!strcasecmp(a->key, key)) {
- ++n;
- }
- a = a->next;
- }
- return n;
-}
-
/** Return true iff the option <b>name</b> has the same value in <b>o1</b>
* and <b>o2</b>. Must not be called for LINELIST_S or OBSOLETE options.
*/
@@ -1365,8 +1190,6 @@ config_parse_msec_interval(const char *s, int *ok)
{
uint64_t r;
r = config_parse_units(s, time_msec_units, ok);
- if (!ok)
- return -1;
if (r > INT_MAX) {
log_warn(LD_CONFIG, "Msec interval '%s' is too long", s);
*ok = 0;
@@ -1384,8 +1207,6 @@ config_parse_interval(const char *s, int *ok)
{
uint64_t r;
r = config_parse_units(s, time_units, ok);
- if (!ok)
- return -1;
if (r > INT_MAX) {
log_warn(LD_CONFIG, "Interval '%s' is too long", s);
*ok = 0;
diff --git a/src/or/confparse.h b/src/or/confparse.h
index 8d915d266b..6f5c681ba8 100644
--- a/src/or/confparse.h
+++ b/src/or/confparse.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CONFPARSE_H
@@ -103,14 +103,7 @@ typedef struct config_format_t {
#define CAL_WARN_DEPRECATIONS (1u<<2)
void *config_new(const config_format_t *fmt);
-void config_line_append(config_line_t **lst,
- const char *key, const char *val);
-config_line_t *config_lines_dup(const config_line_t *inp);
-const config_line_t *config_line_find(const config_line_t *lines,
- const char *key);
void config_free(const config_format_t *fmt, void *options);
-int config_lines_eq(config_line_t *a, config_line_t *b);
-int config_count_key(const config_line_t *a, const char *key);
config_line_t *config_get_assigned_option(const config_format_t *fmt,
const void *options, const char *key,
int escape_val);
@@ -132,8 +125,6 @@ const char *config_find_deprecation(const config_format_t *fmt,
const config_var_t *config_find_option(const config_format_t *fmt,
const char *key);
-int config_get_lines(const char *string, config_line_t **result, int extended);
-void config_free_lines(config_line_t *front);
const char *config_expand_abbrev(const config_format_t *fmt,
const char *option,
int command_line, int warn_obsolete);
diff --git a/src/or/connection.c b/src/or/connection.c
index 188276026f..5fb2c53677 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -628,13 +628,13 @@ connection_free_(connection_t *conn)
dir_connection_t *dir_conn = TO_DIR_CONN(conn);
tor_free(dir_conn->requested_resource);
- tor_zlib_free(dir_conn->zlib_state);
- if (dir_conn->fingerprint_stack) {
- SMARTLIST_FOREACH(dir_conn->fingerprint_stack, char *, cp, tor_free(cp));
- smartlist_free(dir_conn->fingerprint_stack);
+ tor_compress_free(dir_conn->compress_state);
+ if (dir_conn->spool) {
+ SMARTLIST_FOREACH(dir_conn->spool, spooled_resource_t *, spooled,
+ spooled_resource_free(spooled));
+ smartlist_free(dir_conn->spool);
}
- cached_dir_decref(dir_conn->cached_dir);
rend_data_free(dir_conn->rend_data);
if (dir_conn->guard_state) {
/* Cancel before freeing, if it's still there. */
@@ -4060,9 +4060,9 @@ connection_write_to_buf_impl_,(const char *string, size_t len,
if (zlib) {
dir_connection_t *dir_conn = TO_DIR_CONN(conn);
int done = zlib < 0;
- CONN_LOG_PROTECT(conn, r = write_to_buf_zlib(conn->outbuf,
- dir_conn->zlib_state,
- string, len, done));
+ CONN_LOG_PROTECT(conn, r = write_to_buf_compress(conn->outbuf,
+ dir_conn->compress_state,
+ string, len, done));
} else {
CONN_LOG_PROTECT(conn, r = write_to_buf(string, len, conn->outbuf));
}
diff --git a/src/or/connection.h b/src/or/connection.h
index d25e002fa4..36e45aef38 100644
--- a/src/or/connection.h
+++ b/src/or/connection.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -141,17 +141,17 @@ MOCK_DECL(void, connection_write_to_buf_impl_,
/* DOCDOC connection_write_to_buf */
static void connection_write_to_buf(const char *string, size_t len,
connection_t *conn);
-/* DOCDOC connection_write_to_buf_zlib */
-static void connection_write_to_buf_zlib(const char *string, size_t len,
- dir_connection_t *conn, int done);
+/* DOCDOC connection_write_to_buf_compress */
+static void connection_write_to_buf_compress(const char *string, size_t len,
+ dir_connection_t *conn, int done);
static inline void
connection_write_to_buf(const char *string, size_t len, connection_t *conn)
{
connection_write_to_buf_impl_(string, len, conn, 0);
}
static inline void
-connection_write_to_buf_zlib(const char *string, size_t len,
- dir_connection_t *conn, int done)
+connection_write_to_buf_compress(const char *string, size_t len,
+ dir_connection_t *conn, int done)
{
connection_write_to_buf_impl_(string, len, TO_CONN(conn), done ? -1 : 1);
}
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index ef551048b8..d1728eca6d 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -29,7 +29,7 @@
* <li>DNS lookup streams, created on the exit side in response to
* a RELAY_RESOLVE cell from a client.
* <li>Tunneled directory streams, created on the directory cache side
- * in response to a RELAY_BEGINDIR cell. These streams attach directly
+ * in response to a RELAY_BEGIN_DIR cell. These streams attach directly
* to a dir_connection_t object without ever using TCP.
* </ul>
*
@@ -1762,7 +1762,7 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
conn->entry_cfg.ipv6_traffic = 0;
/* Still handling CONNECT. Now, check for exit enclaves. (Which we
- * don't do on BEGINDIR, or when there is a chosen exit.)
+ * don't do on BEGIN_DIR, or when there is a chosen exit.)
*
* TODO: Should we remove this? Exit enclaves are nutty and don't
* work very well
@@ -2514,14 +2514,20 @@ connection_ap_handshake_send_begin(entry_connection_t *ap_conn)
} else if (begin_type == RELAY_COMMAND_BEGIN_DIR) {
/* This connection is a begindir directory connection.
* Look at the linked directory connection to access the directory purpose.
- * (This must be non-NULL, because we're doing begindir.) */
- tor_assert(base_conn->linked);
+ * If a BEGINDIR connection is ever not linked, that's a bug. */
+ if (BUG(!base_conn->linked)) {
+ return -1;
+ }
connection_t *linked_dir_conn_base = base_conn->linked_conn;
- tor_assert(linked_dir_conn_base);
+ /* If the linked connection has been unlinked by other code, we can't send
+ * a begin cell on it. */
+ if (!linked_dir_conn_base) {
+ return -1;
+ }
/* Sensitive directory connections must have an anonymous path length.
* Otherwise, directory connections are typically one-hop.
* This matches the earlier check for directory connection path anonymity
- * in directory_initiate_command_rend(). */
+ * in directory_initiate_request(). */
if (purpose_needs_anonymity(linked_dir_conn_base->purpose,
TO_DIR_CONN(linked_dir_conn_base)->router_purpose,
TO_DIR_CONN(linked_dir_conn_base)->requested_resource)) {
@@ -2995,7 +3001,7 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply,
return;
}
-/** Read a RELAY_BEGIN or RELAY_BEGINDIR cell from <b>cell</b>, decode it, and
+/** Read a RELAY_BEGIN or RELAY_BEGIN_DIR cell from <b>cell</b>, decode it, and
* place the result in <b>bcell</b>. On success return 0; on failure return
* <0 and set *<b>end_reason_out</b> to the end reason we should send back to
* the client.
diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h
index 61b5752aed..e4780b3c7d 100644
--- a/src/or/connection_edge.h
+++ b/src/or/connection_edge.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/connection_or.c b/src/or/connection_or.c
index 0ee3fce618..280f8f70ad 100644
--- a/src/or/connection_or.c
+++ b/src/or/connection_or.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/connection_or.h b/src/or/connection_or.h
index 5d089e6789..4261658932 100644
--- a/src/or/connection_or.h
+++ b/src/or/connection_or.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/conscache.c b/src/or/conscache.c
new file mode 100644
index 0000000000..5ffa129bbe
--- /dev/null
+++ b/src/or/conscache.c
@@ -0,0 +1,541 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "or.h"
+
+#include "config.h"
+#include "conscache.h"
+#include "storagedir.h"
+
+#define CCE_MAGIC 0x17162253
+
+/**
+ * A consensus_cache_entry_t is a reference-counted handle to an
+ * item in a consensus_cache_t. It can be mmapped into RAM, or not,
+ * depending whether it's currently in use.
+ */
+struct consensus_cache_entry_t {
+ uint32_t magic; /**< Must be set to CCE_MAGIC */
+ HANDLE_ENTRY(consensus_cache_entry, consensus_cache_entry_t);
+ int32_t refcnt; /**< Reference count. */
+ unsigned can_remove : 1; /**< If true, we want to delete this file. */
+ /** If true, we intend to unmap this file as soon as we're done with it. */
+ unsigned release_aggressively : 1;
+
+ /** Filename for this object within the storage_dir_t */
+ char *fname;
+ /** Labels associated with this object. Immutable once the object
+ * is created. */
+ config_line_t *labels;
+ /** Pointer to the cache that includes this entry (if any). */
+ consensus_cache_t *in_cache;
+
+ /** Since what time has this object been mapped into RAM, but with the cache
+ * being the only having a reference to it? */
+ time_t unused_since;
+ /** mmaped contents of the underlying file. May be NULL */
+ tor_mmap_t *map;
+ /** Length of the body within <b>map</b>. */
+ size_t bodylen;
+ /** Pointer to the body within <b>map</b>. */
+ const uint8_t *body;
+};
+
+/**
+ * A consensus_cache_t holds a directory full of labeled items.
+ */
+struct consensus_cache_t {
+ /** Underling storage_dir_t to handle persistence */
+ storage_dir_t *dir;
+ /** List of all the entries in the directory. */
+ smartlist_t *entries;
+};
+
+static void consensus_cache_clear(consensus_cache_t *cache);
+static void consensus_cache_rescan(consensus_cache_t *);
+static void consensus_cache_entry_map(consensus_cache_t *,
+ consensus_cache_entry_t *);
+static void consensus_cache_entry_unmap(consensus_cache_entry_t *ent);
+
+/**
+ * Helper: Open a consensus cache in subdirectory <b>subdir</b> of the
+ * data directory, to hold up to <b>max_entries</b> of data.
+ */
+consensus_cache_t *
+consensus_cache_open(const char *subdir, int max_entries)
+{
+ consensus_cache_t *cache = tor_malloc_zero(sizeof(consensus_cache_t));
+ char *directory = get_datadir_fname(subdir);
+ cache->dir = storage_dir_new(directory, max_entries);
+ tor_free(directory);
+ if (!cache->dir) {
+ tor_free(cache);
+ return NULL;
+ }
+
+ consensus_cache_rescan(cache);
+ return cache;
+}
+
+/**
+ * Tell the sandbox (if any) configured by <b>cfg</b> to allow the
+ * operations that <b>cache</b> will need.
+ */
+int
+consensus_cache_register_with_sandbox(consensus_cache_t *cache,
+ struct sandbox_cfg_elem **cfg)
+{
+ return storage_dir_register_with_sandbox(cache->dir, cfg);
+}
+
+/**
+ * Helper: clear all entries from <b>cache</b> (but do not delete
+ * any that aren't marked for removal
+ */
+static void
+consensus_cache_clear(consensus_cache_t *cache)
+{
+ consensus_cache_delete_pending(cache, 0);
+
+ SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) {
+ ent->in_cache = NULL;
+ consensus_cache_entry_decref(ent);
+ } SMARTLIST_FOREACH_END(ent);
+ smartlist_free(cache->entries);
+ cache->entries = NULL;
+}
+
+/**
+ * Drop all storage held by <b>cache</b>.
+ */
+void
+consensus_cache_free(consensus_cache_t *cache)
+{
+ if (! cache)
+ return;
+
+ if (cache->entries) {
+ consensus_cache_clear(cache);
+ }
+ storage_dir_free(cache->dir);
+ tor_free(cache);
+}
+
+/**
+ * Write <b>datalen</b> bytes of data at <b>data</b> into the <b>cache</b>,
+ * labeling that data with <b>labels</b>. On failure, return NULL. On
+ * success, return a newly created consensus_cache_entry_t.
+ *
+ * The returned value will be owned by the cache, and you will have a
+ * reference to it. Call consensus_cache_entry_decref() when you are
+ * done with it.
+ *
+ * The provided <b>labels</b> MUST have distinct keys: if they don't,
+ * this API does not specify which values (if any) for the duplicate keys
+ * will be considered.
+ */
+consensus_cache_entry_t *
+consensus_cache_add(consensus_cache_t *cache,
+ const config_line_t *labels,
+ const uint8_t *data,
+ size_t datalen)
+{
+ char *fname = NULL;
+ int r = storage_dir_save_labeled_to_file(cache->dir,
+ labels, data, datalen, &fname);
+ if (r < 0 || fname == NULL) {
+ return NULL;
+ }
+ consensus_cache_entry_t *ent =
+ tor_malloc_zero(sizeof(consensus_cache_entry_t));
+ ent->magic = CCE_MAGIC;
+ ent->fname = fname;
+ ent->labels = config_lines_dup(labels);
+ ent->in_cache = cache;
+ ent->unused_since = TIME_MAX;
+ smartlist_add(cache->entries, ent);
+ /* Start the reference count at 2: the caller owns one copy, and the
+ * cache owns another.
+ */
+ ent->refcnt = 2;
+
+ return ent;
+}
+
+/**
+ * Given a <b>cache</b>, return some entry for which <b>key</b>=<b>value</b>.
+ * Return NULL if no such entry exists.
+ *
+ * Does not adjust reference counts.
+ */
+consensus_cache_entry_t *
+consensus_cache_find_first(consensus_cache_t *cache,
+ const char *key,
+ const char *value)
+{
+ smartlist_t *tmp = smartlist_new();
+ consensus_cache_find_all(tmp, cache, key, value);
+ consensus_cache_entry_t *ent = NULL;
+ if (smartlist_len(tmp))
+ ent = smartlist_get(tmp, 0);
+ smartlist_free(tmp);
+ return ent;
+}
+
+/**
+ * Given a <b>cache</b>, add every entry to <b>out<b> for which
+ * <b>key</b>=<b>value</b>. If <b>key</b> is NULL, add every entry.
+ *
+ * Do not add any entry that has been marked for removal.
+ *
+ * Does not adjust reference counts.
+ */
+void
+consensus_cache_find_all(smartlist_t *out,
+ consensus_cache_t *cache,
+ const char *key,
+ const char *value)
+{
+ SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) {
+ if (ent->can_remove == 1) {
+ /* We want to delete this; pretend it isn't there. */
+ continue;
+ }
+ if (! key) {
+ smartlist_add(out, ent);
+ continue;
+ }
+ const char *found_val = consensus_cache_entry_get_value(ent, key);
+ if (found_val && !strcmp(value, found_val)) {
+ smartlist_add(out, ent);
+ }
+ } SMARTLIST_FOREACH_END(ent);
+}
+
+/**
+ * Given a list of consensus_cache_entry_t, remove all those entries
+ * that do not have <b>key</b>=<b>value</b> in their labels.
+ *
+ * Does not adjust reference counts.
+ */
+void
+consensus_cache_filter_list(smartlist_t *lst,
+ const char *key,
+ const char *value)
+{
+ if (BUG(lst == NULL))
+ return; // LCOV_EXCL_LINE
+ if (key == NULL)
+ return;
+ SMARTLIST_FOREACH_BEGIN(lst, consensus_cache_entry_t *, ent) {
+ const char *found_val = consensus_cache_entry_get_value(ent, key);
+ if (! found_val || strcmp(value, found_val)) {
+ SMARTLIST_DEL_CURRENT(lst, ent);
+ }
+ } SMARTLIST_FOREACH_END(ent);
+}
+
+/**
+ * If <b>ent</b> has a label with the given <b>key</b>, return its
+ * value. Otherwise return NULL.
+ *
+ * The return value is only guaranteed to be valid for as long as you
+ * hold a reference to <b>ent</b>.
+ */
+const char *
+consensus_cache_entry_get_value(const consensus_cache_entry_t *ent,
+ const char *key)
+{
+ const config_line_t *match = config_line_find(ent->labels, key);
+ if (match)
+ return match->value;
+ else
+ return NULL;
+}
+
+/**
+ * Return a pointer to the labels in <b>ent</b>.
+ *
+ * This pointer is only guaranteed to be valid for as long as you
+ * hold a reference to <b>ent</b>.
+ */
+const config_line_t *
+consensus_cache_entry_get_labels(const consensus_cache_entry_t *ent)
+{
+ return ent->labels;
+}
+
+/**
+ * Increase the reference count of <b>ent</b>.
+ */
+void
+consensus_cache_entry_incref(consensus_cache_entry_t *ent)
+{
+ if (BUG(ent->magic != CCE_MAGIC))
+ return; // LCOV_EXCL_LINE
+ ++ent->refcnt;
+ ent->unused_since = TIME_MAX;
+}
+
+/**
+ * Release a reference held to <b>ent</b>.
+ *
+ * If it was the last reference, ent will be freed. Therefore, you must not
+ * use <b>ent</b> after calling this function.
+ */
+void
+consensus_cache_entry_decref(consensus_cache_entry_t *ent)
+{
+ if (! ent)
+ return;
+ if (BUG(ent->refcnt <= 0))
+ return; // LCOV_EXCL_LINE
+ if (BUG(ent->magic != CCE_MAGIC))
+ return; // LCOV_EXCL_LINE
+
+ --ent->refcnt;
+
+ if (ent->refcnt == 1 && ent->in_cache) {
+ /* Only the cache has a reference: we don't need to keep the file
+ * mapped */
+ if (ent->map) {
+ if (ent->release_aggressively) {
+ consensus_cache_entry_unmap(ent);
+ } else {
+ ent->unused_since = approx_time();
+ }
+ }
+ return;
+ }
+
+ if (ent->refcnt > 0)
+ return;
+
+ /* Refcount is zero; we can free it. */
+ if (ent->map) {
+ consensus_cache_entry_unmap(ent);
+ }
+ tor_free(ent->fname);
+ config_free_lines(ent->labels);
+ consensus_cache_entry_handles_clear(ent);
+ memwipe(ent, 0, sizeof(consensus_cache_entry_t));
+ tor_free(ent);
+}
+
+/**
+ * Mark <b>ent</b> for deletion from the cache. Deletion will not occur
+ * until the cache is the only place that holds a reference to <b>ent</b>.
+ */
+void
+consensus_cache_entry_mark_for_removal(consensus_cache_entry_t *ent)
+{
+ ent->can_remove = 1;
+}
+
+/**
+ * Mark <b>ent</b> as the kind of entry that we don't need to keep mmap'd for
+ * any longer than we're actually using it.
+ */
+void
+consensus_cache_entry_mark_for_aggressive_release(consensus_cache_entry_t *ent)
+{
+ ent->release_aggressively = 1;
+}
+
+/**
+ * Try to read the body of <b>ent</b> into memory if it isn't already
+ * loaded. On success, set *<b>body_out</b> to the body, *<b>sz_out</b>
+ * to its size, and return 0. On failure return -1.
+ *
+ * The resulting body pointer will only be valid for as long as you
+ * hold a reference to <b>ent</b>.
+ */
+int
+consensus_cache_entry_get_body(const consensus_cache_entry_t *ent,
+ const uint8_t **body_out,
+ size_t *sz_out)
+{
+ if (BUG(ent->magic != CCE_MAGIC))
+ return -1; // LCOV_EXCL_LINE
+
+ if (! ent->map) {
+ if (! ent->in_cache)
+ return -1;
+
+ consensus_cache_entry_map((consensus_cache_t *)ent->in_cache,
+ (consensus_cache_entry_t *)ent);
+ if (! ent->map) {
+ return -1;
+ }
+ }
+
+ *body_out = ent->body;
+ *sz_out = ent->bodylen;
+ return 0;
+}
+
+/**
+ * Unmap every mmap'd element of <b>cache</b> that has been unused
+ * since <b>cutoff</b>.
+ */
+void
+consensus_cache_unmap_lazy(consensus_cache_t *cache, time_t cutoff)
+{
+ SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) {
+ tor_assert_nonfatal(ent->in_cache == cache);
+ if (ent->refcnt > 1 || BUG(ent->in_cache == NULL)) {
+ /* Somebody is using this entry right now */
+ continue;
+ }
+ if (ent->unused_since > cutoff) {
+ /* Has been unused only for a little while */
+ continue;
+ }
+ if (ent->map == NULL) {
+ /* Not actually mapped. */
+ continue;
+ }
+ consensus_cache_entry_unmap(ent);
+ } SMARTLIST_FOREACH_END(ent);
+}
+
+/**
+ * Return the number of currently unused filenames available in this cache.
+ */
+int
+consensus_cache_get_n_filenames_available(consensus_cache_t *cache)
+{
+ tor_assert(cache);
+ int max = storage_dir_get_max_files(cache->dir);
+ int used = smartlist_len(storage_dir_list(cache->dir));
+ tor_assert_nonfatal(max >= used);
+ return max - used;
+}
+
+/**
+ * Delete every element of <b>cache</b> has been marked with
+ * consensus_cache_entry_mark_for_removal. If <b>force</b> is false,
+ * retain those entries which are not in use except by the cache.
+ */
+void
+consensus_cache_delete_pending(consensus_cache_t *cache, int force)
+{
+ SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) {
+ tor_assert_nonfatal(ent->in_cache == cache);
+ if (! force) {
+ if (ent->refcnt > 1 || BUG(ent->in_cache == NULL)) {
+ /* Somebody is using this entry right now */
+ continue;
+ }
+ }
+ if (ent->can_remove == 0) {
+ /* Don't want to delete this. */
+ continue;
+ }
+ if (BUG(ent->refcnt <= 0)) {
+ continue; // LCOV_EXCL_LINE
+ }
+
+ SMARTLIST_DEL_CURRENT(cache->entries, ent);
+ ent->in_cache = NULL;
+ char *fname = tor_strdup(ent->fname); /* save a copy */
+ consensus_cache_entry_decref(ent);
+ storage_dir_remove_file(cache->dir, fname);
+ tor_free(fname);
+ } SMARTLIST_FOREACH_END(ent);
+}
+
+/**
+ * Internal helper: rescan <b>cache</b> and rebuild its list of entries.
+ */
+static void
+consensus_cache_rescan(consensus_cache_t *cache)
+{
+ if (cache->entries) {
+ consensus_cache_clear(cache);
+ }
+
+ cache->entries = smartlist_new();
+ const smartlist_t *fnames = storage_dir_list(cache->dir);
+ SMARTLIST_FOREACH_BEGIN(fnames, const char *, fname) {
+ tor_mmap_t *map = NULL;
+ config_line_t *labels = NULL;
+ const uint8_t *body;
+ size_t bodylen;
+ map = storage_dir_map_labeled(cache->dir, fname,
+ &labels, &body, &bodylen);
+ if (! map) {
+ /* Can't load this; continue */
+ log_warn(LD_FS, "Unable to map file %s from consensus cache: %s",
+ escaped(fname), strerror(errno));
+ continue;
+ }
+ consensus_cache_entry_t *ent =
+ tor_malloc_zero(sizeof(consensus_cache_entry_t));
+ ent->magic = CCE_MAGIC;
+ ent->fname = tor_strdup(fname);
+ ent->labels = labels;
+ ent->refcnt = 1;
+ ent->in_cache = cache;
+ ent->unused_since = TIME_MAX;
+ smartlist_add(cache->entries, ent);
+ tor_munmap_file(map); /* don't actually need to keep this around */
+ } SMARTLIST_FOREACH_END(fname);
+}
+
+/**
+ * Make sure that <b>ent</b> is mapped into RAM.
+ */
+static void
+consensus_cache_entry_map(consensus_cache_t *cache,
+ consensus_cache_entry_t *ent)
+{
+ if (ent->map)
+ return;
+
+ ent->map = storage_dir_map_labeled(cache->dir, ent->fname,
+ NULL, &ent->body, &ent->bodylen);
+ ent->unused_since = TIME_MAX;
+}
+
+/**
+ * Unmap <b>ent</b> from RAM.
+ *
+ * Do not call this if something other than the cache is holding a reference
+ * to <b>ent</b>
+ */
+static void
+consensus_cache_entry_unmap(consensus_cache_entry_t *ent)
+{
+ ent->unused_since = TIME_MAX;
+ if (!ent->map)
+ return;
+
+ tor_munmap_file(ent->map);
+ ent->map = NULL;
+ ent->body = NULL;
+ ent->bodylen = 0;
+ ent->unused_since = TIME_MAX;
+}
+
+HANDLE_IMPL(consensus_cache_entry, consensus_cache_entry_t, )
+
+#ifdef TOR_UNIT_TESTS
+/**
+ * Testing only: Return true iff <b>ent</b> is mapped into memory.
+ *
+ * (In normal operation, this information is not exposed.)
+ */
+int
+consensus_cache_entry_is_mapped(consensus_cache_entry_t *ent)
+{
+ if (ent->map) {
+ tor_assert(ent->body);
+ return 1;
+ } else {
+ tor_assert(!ent->body);
+ return 0;
+ }
+}
+#endif
+
diff --git a/src/or/conscache.h b/src/or/conscache.h
new file mode 100644
index 0000000000..aef54201f0
--- /dev/null
+++ b/src/or/conscache.h
@@ -0,0 +1,61 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_CONSCACHE_H
+#define TOR_CONSCACHE_H
+
+#include "handles.h"
+
+typedef struct consensus_cache_entry_t consensus_cache_entry_t;
+typedef struct consensus_cache_t consensus_cache_t;
+
+HANDLE_DECL(consensus_cache_entry, consensus_cache_entry_t, )
+
+consensus_cache_t *consensus_cache_open(const char *subdir, int max_entries);
+void consensus_cache_free(consensus_cache_t *cache);
+struct sandbox_cfg_elem;
+int consensus_cache_register_with_sandbox(consensus_cache_t *cache,
+ struct sandbox_cfg_elem **cfg);
+void consensus_cache_unmap_lazy(consensus_cache_t *cache, time_t cutoff);
+void consensus_cache_delete_pending(consensus_cache_t *cache,
+ int force);
+int consensus_cache_get_n_filenames_available(consensus_cache_t *cache);
+consensus_cache_entry_t *consensus_cache_add(consensus_cache_t *cache,
+ const config_line_t *labels,
+ const uint8_t *data,
+ size_t datalen);
+
+consensus_cache_entry_t *consensus_cache_find_first(
+ consensus_cache_t *cache,
+ const char *key,
+ const char *value);
+
+void consensus_cache_find_all(smartlist_t *out,
+ consensus_cache_t *cache,
+ const char *key,
+ const char *value);
+void consensus_cache_filter_list(smartlist_t *lst,
+ const char *key,
+ const char *value);
+
+const char *consensus_cache_entry_get_value(const consensus_cache_entry_t *ent,
+ const char *key);
+const config_line_t *consensus_cache_entry_get_labels(
+ const consensus_cache_entry_t *ent);
+
+void consensus_cache_entry_incref(consensus_cache_entry_t *ent);
+void consensus_cache_entry_decref(consensus_cache_entry_t *ent);
+
+void consensus_cache_entry_mark_for_removal(consensus_cache_entry_t *ent);
+void consensus_cache_entry_mark_for_aggressive_release(
+ consensus_cache_entry_t *ent);
+int consensus_cache_entry_get_body(const consensus_cache_entry_t *ent,
+ const uint8_t **body_out,
+ size_t *sz_out);
+
+#ifdef TOR_UNIT_TESTS
+int consensus_cache_entry_is_mapped(consensus_cache_entry_t *ent);
+#endif
+
+#endif
+
diff --git a/src/or/consdiff.c b/src/or/consdiff.c
new file mode 100644
index 0000000000..1baa11897c
--- /dev/null
+++ b/src/or/consdiff.c
@@ -0,0 +1,1412 @@
+/* Copyright (c) 2014, Daniel Martí
+ * Copyright (c) 2014, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file consdiff.c
+ * \brief Consensus diff implementation, including both the generation and the
+ * application of diffs in a minimal ed format.
+ *
+ * The consensus diff application is done in consdiff_apply_diff, which relies
+ * on apply_ed_diff for the main ed diff part and on some digest helper
+ * functions to check the digest hashes found in the consensus diff header.
+ *
+ * The consensus diff generation is more complex. consdiff_gen_diff generates
+ * it, relying on gen_ed_diff to generate the ed diff and some digest helper
+ * functions to generate the digest hashes.
+ *
+ * gen_ed_diff is the tricky bit. In it simplest form, it will take quadratic
+ * time and linear space to generate an ed diff given two smartlists. As shown
+ * in its comment section, calling calc_changes on the entire two consensuses
+ * will calculate what is to be added and what is to be deleted in the diff.
+ * Its comment section briefly explains how it works.
+ *
+ * In our case specific to consensuses, we take advantage of the fact that
+ * consensuses list routers sorted by their identities. We use that
+ * information to avoid running calc_changes on the whole smartlists.
+ * gen_ed_diff will navigate through the two consensuses identity by identity
+ * and will send small couples of slices to calc_changes, keeping the running
+ * time near-linear. This is explained in more detail in the gen_ed_diff
+ * comments.
+ *
+ * The allocation strategy tries to save time and memory by avoiding needless
+ * copies. Instead of actually splitting the inputs into separate strings, we
+ * allocate cdline_t objects, each of which represents a line in the original
+ * object or in the output. We use memarea_t allocators to manage the
+ * temporary memory we use when generating or applying diffs.
+ **/
+
+#define CONSDIFF_PRIVATE
+
+#include "or.h"
+#include "consdiff.h"
+#include "memarea.h"
+#include "routerparse.h"
+
+static const char* ns_diff_version = "network-status-diff-version 1";
+static const char* hash_token = "hash";
+
+static char *consensus_join_lines(const smartlist_t *inp);
+
+/** Return true iff a and b have the same contents. */
+STATIC int
+lines_eq(const cdline_t *a, const cdline_t *b)
+{
+ return a->len == b->len && fast_memeq(a->s, b->s, a->len);
+}
+
+/** Return true iff a has the same contents as the nul-terminated string b. */
+STATIC int
+line_str_eq(const cdline_t *a, const char *b)
+{
+ const size_t len = strlen(b);
+ tor_assert(len <= UINT32_MAX);
+ cdline_t bline = { b, (uint32_t)len };
+ return lines_eq(a, &bline);
+}
+
+/** Return true iff a begins with the same contents as the nul-terminated
+ * string b. */
+static int
+line_starts_with_str(const cdline_t *a, const char *b)
+{
+ const size_t len = strlen(b);
+ tor_assert(len <= UINT32_MAX);
+ return a->len >= len && fast_memeq(a->s, b, len);
+}
+
+/** Return a new cdline_t holding as its contents the nul-terminated
+ * string s. Use the provided memory area for storage. */
+static cdline_t *
+cdline_linecpy(memarea_t *area, const char *s)
+{
+ size_t len = strlen(s);
+ const char *ss = memarea_memdup(area, s, len);
+ cdline_t *line = memarea_alloc(area, sizeof(cdline_t));
+ line->s = ss;
+ line->len = (uint32_t)len;
+ return line;
+}
+
+/** Add a cdline_t to <b>lst</b> holding as its contents the nul-terminated
+ * string s. Use the provided memory area for storage. */
+STATIC void
+smartlist_add_linecpy(smartlist_t *lst, memarea_t *area, const char *s)
+{
+ smartlist_add(lst, cdline_linecpy(area, s));
+}
+
+/** Compute the digest of <b>cons</b>, and store the result in
+ * <b>digest_out</b>. Return 0 on success, -1 on failure. */
+/* This is a separate, mockable function so that we can override it when
+ * fuzzing. */
+MOCK_IMPL(STATIC int,
+consensus_compute_digest,(const char *cons,
+ consensus_digest_t *digest_out))
+{
+ int r = crypto_digest256((char*)digest_out->sha3_256,
+ cons, strlen(cons), DIGEST_SHA3_256);
+ return r;
+}
+
+/** Compute the digest-as-signed of <b>cons</b>, and store the result in
+ * <b>digest_out</b>. Return 0 on success, -1 on failure. */
+/* This is a separate, mockable function so that we can override it when
+ * fuzzing. */
+MOCK_IMPL(STATIC int,
+consensus_compute_digest_as_signed,(const char *cons,
+ consensus_digest_t *digest_out))
+{
+ return router_get_networkstatus_v3_sha3_as_signed(digest_out->sha3_256,
+ cons);
+}
+
+/** Return true iff <b>d1</b> and <b>d2</b> contain the same digest */
+/* This is a separate, mockable function so that we can override it when
+ * fuzzing. */
+MOCK_IMPL(STATIC int,
+consensus_digest_eq,(const uint8_t *d1,
+ const uint8_t *d2))
+{
+ return fast_memeq(d1, d2, DIGEST256_LEN);
+}
+
+/** Create (allocate) a new slice from a smartlist. Assumes that the start
+ * and the end indexes are within the bounds of the initial smartlist. The end
+ * element is not part of the resulting slice. If end is -1, the slice is to
+ * reach the end of the smartlist.
+ */
+STATIC smartlist_slice_t *
+smartlist_slice(const smartlist_t *list, int start, int end)
+{
+ int list_len = smartlist_len(list);
+ tor_assert(start >= 0);
+ tor_assert(start <= list_len);
+ if (end == -1) {
+ end = list_len;
+ }
+ tor_assert(start <= end);
+
+ smartlist_slice_t *slice = tor_malloc(sizeof(smartlist_slice_t));
+ slice->list = list;
+ slice->offset = start;
+ slice->len = end - start;
+ return slice;
+}
+
+/** Helper: Compute the longest common subsequence lengths for the two slices.
+ * Used as part of the diff generation to find the column at which to split
+ * slice2 while still having the optimal solution.
+ * If direction is -1, the navigation is reversed. Otherwise it must be 1.
+ * The length of the resulting integer array is that of the second slice plus
+ * one.
+ */
+STATIC int *
+lcs_lengths(const smartlist_slice_t *slice1, const smartlist_slice_t *slice2,
+ int direction)
+{
+ size_t a_size = sizeof(int) * (slice2->len+1);
+
+ /* Resulting lcs lengths. */
+ int *result = tor_malloc_zero(a_size);
+ /* Copy of the lcs lengths from the last iteration. */
+ int *prev = tor_malloc(a_size);
+
+ tor_assert(direction == 1 || direction == -1);
+
+ int si = slice1->offset;
+ if (direction == -1) {
+ si += (slice1->len-1);
+ }
+
+ for (int i = 0; i < slice1->len; ++i, si+=direction) {
+
+ const cdline_t *line1 = smartlist_get(slice1->list, si);
+ /* Store the last results. */
+ memcpy(prev, result, a_size);
+
+ int sj = slice2->offset;
+ if (direction == -1) {
+ sj += (slice2->len-1);
+ }
+
+ for (int j = 0; j < slice2->len; ++j, sj+=direction) {
+
+ const cdline_t *line2 = smartlist_get(slice2->list, sj);
+ if (lines_eq(line1, line2)) {
+ /* If the lines are equal, the lcs is one line longer. */
+ result[j + 1] = prev[j] + 1;
+ } else {
+ /* If not, see what lcs parent path is longer. */
+ result[j + 1] = MAX(result[j], prev[j + 1]);
+ }
+ }
+ }
+ tor_free(prev);
+ return result;
+}
+
+/** Helper: Trim any number of lines that are equally at the start or the end
+ * of both slices.
+ */
+STATIC void
+trim_slices(smartlist_slice_t *slice1, smartlist_slice_t *slice2)
+{
+ while (slice1->len>0 && slice2->len>0) {
+ const cdline_t *line1 = smartlist_get(slice1->list, slice1->offset);
+ const cdline_t *line2 = smartlist_get(slice2->list, slice2->offset);
+ if (!lines_eq(line1, line2)) {
+ break;
+ }
+ slice1->offset++; slice1->len--;
+ slice2->offset++; slice2->len--;
+ }
+
+ int i1 = (slice1->offset+slice1->len)-1;
+ int i2 = (slice2->offset+slice2->len)-1;
+
+ while (slice1->len>0 && slice2->len>0) {
+ const cdline_t *line1 = smartlist_get(slice1->list, i1);
+ const cdline_t *line2 = smartlist_get(slice2->list, i2);
+ if (!lines_eq(line1, line2)) {
+ break;
+ }
+ i1--;
+ slice1->len--;
+ i2--;
+ slice2->len--;
+ }
+}
+
+/** Like smartlist_string_pos, but uses a cdline_t, and is restricted to the
+ * bounds of the slice.
+ */
+STATIC int
+smartlist_slice_string_pos(const smartlist_slice_t *slice,
+ const cdline_t *string)
+{
+ int end = slice->offset + slice->len;
+ for (int i = slice->offset; i < end; ++i) {
+ const cdline_t *el = smartlist_get(slice->list, i);
+ if (lines_eq(el, string)) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/** Helper: Set all the appropriate changed booleans to true. The first slice
+ * must be of length 0 or 1. All the lines of slice1 and slice2 which are not
+ * present in the other slice will be set to changed in their bool array.
+ * The two changed bool arrays are passed in the same order as the slices.
+ */
+STATIC void
+set_changed(bitarray_t *changed1, bitarray_t *changed2,
+ const smartlist_slice_t *slice1, const smartlist_slice_t *slice2)
+{
+ int toskip = -1;
+ tor_assert(slice1->len == 0 || slice1->len == 1);
+
+ if (slice1->len == 1) {
+ const cdline_t *line_common = smartlist_get(slice1->list, slice1->offset);
+ toskip = smartlist_slice_string_pos(slice2, line_common);
+ if (toskip == -1) {
+ bitarray_set(changed1, slice1->offset);
+ }
+ }
+ int end = slice2->offset + slice2->len;
+ for (int i = slice2->offset; i < end; ++i) {
+ if (i != toskip) {
+ bitarray_set(changed2, i);
+ }
+ }
+}
+
+/*
+ * Helper: Given that slice1 has been split by half into top and bot, we want
+ * to fetch the column at which to split slice2 so that we are still on track
+ * to the optimal diff solution, i.e. the shortest one. We use lcs_lengths
+ * since the shortest diff is just another way to say the longest common
+ * subsequence.
+ */
+static int
+optimal_column_to_split(const smartlist_slice_t *top,
+ const smartlist_slice_t *bot,
+ const smartlist_slice_t *slice2)
+{
+ int *lens_top = lcs_lengths(top, slice2, 1);
+ int *lens_bot = lcs_lengths(bot, slice2, -1);
+ int column=0, max_sum=-1;
+
+ for (int i = 0; i < slice2->len+1; ++i) {
+ int sum = lens_top[i] + lens_bot[slice2->len-i];
+ if (sum > max_sum) {
+ column = i;
+ max_sum = sum;
+ }
+ }
+ tor_free(lens_top);
+ tor_free(lens_bot);
+
+ return column;
+}
+
+/**
+ * Helper: Figure out what elements are new or gone on the second smartlist
+ * relative to the first smartlist, and store the booleans in the bitarrays.
+ * True on the first bitarray means the element is gone, true on the second
+ * bitarray means it's new.
+ *
+ * In its base case, either of the smartlists is of length <= 1 and we can
+ * quickly see what elements are new or are gone. In the other case, we will
+ * split one smartlist by half and we'll use optimal_column_to_split to find
+ * the optimal column at which to split the second smartlist so that we are
+ * finding the smallest diff possible.
+ */
+STATIC void
+calc_changes(smartlist_slice_t *slice1,
+ smartlist_slice_t *slice2,
+ bitarray_t *changed1, bitarray_t *changed2)
+{
+ trim_slices(slice1, slice2);
+
+ if (slice1->len <= 1) {
+ set_changed(changed1, changed2, slice1, slice2);
+
+ } else if (slice2->len <= 1) {
+ set_changed(changed2, changed1, slice2, slice1);
+
+ /* Keep on splitting the slices in two. */
+ } else {
+ smartlist_slice_t *top, *bot, *left, *right;
+
+ /* Split the first slice in half. */
+ int mid = slice1->len/2;
+ top = smartlist_slice(slice1->list, slice1->offset, slice1->offset+mid);
+ bot = smartlist_slice(slice1->list, slice1->offset+mid,
+ slice1->offset+slice1->len);
+
+ /* Split the second slice by the optimal column. */
+ int mid2 = optimal_column_to_split(top, bot, slice2);
+ left = smartlist_slice(slice2->list, slice2->offset, slice2->offset+mid2);
+ right = smartlist_slice(slice2->list, slice2->offset+mid2,
+ slice2->offset+slice2->len);
+
+ calc_changes(top, left, changed1, changed2);
+ calc_changes(bot, right, changed1, changed2);
+ tor_free(top);
+ tor_free(bot);
+ tor_free(left);
+ tor_free(right);
+ }
+}
+
+/* This table is from crypto.c. The SP and PAD defines are different. */
+#define NOT_VALID_BASE64 255
+#define X NOT_VALID_BASE64
+#define SP NOT_VALID_BASE64
+#define PAD NOT_VALID_BASE64
+static const uint8_t base64_compare_table[256] = {
+ X, X, X, X, X, X, X, X, X, SP, SP, SP, X, SP, X, X,
+ X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,
+ SP, X, X, X, X, X, X, X, X, X, X, 62, X, X, X, 63,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, X, X, X, PAD, X, X,
+ X, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, X, X, X, X, X,
+ X, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, X, X, X, X, X,
+ X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,
+ X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,
+ X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,
+ X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,
+ X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,
+ X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,
+ X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,
+ X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,
+};
+
+/** Helper: Get the identity hash from a router line, assuming that the line
+ * at least appears to be a router line and thus starts with "r ".
+ *
+ * If an identity hash is found, store it (without decoding it) in
+ * <b>hash_out</b>, and return 0. On failure, return -1.
+ */
+STATIC int
+get_id_hash(const cdline_t *line, cdline_t *hash_out)
+{
+ if (line->len < 2)
+ return -1;
+
+ /* Skip the router name. */
+ const char *hash = memchr(line->s + 2, ' ', line->len - 2);
+ if (!hash) {
+ return -1;
+ }
+
+ hash++;
+ const char *hash_end = hash;
+ /* Stop when the first non-base64 character is found. Use unsigned chars to
+ * avoid negative indexes causing crashes.
+ */
+ while (base64_compare_table[*((unsigned char*)hash_end)]
+ != NOT_VALID_BASE64 &&
+ hash_end < line->s + line->len) {
+ hash_end++;
+ }
+
+ /* Empty hash. */
+ if (hash_end == hash) {
+ return -1;
+ }
+
+ hash_out->s = hash;
+ /* Always true because lines are limited to this length */
+ tor_assert(hash_end >= hash);
+ tor_assert((size_t)(hash_end - hash) <= UINT32_MAX);
+ hash_out->len = (uint32_t)(hash_end - hash);
+
+ return 0;
+}
+
+/** Helper: Check that a line is a valid router entry. We must at least be
+ * able to fetch a proper identity hash from it for it to be valid.
+ */
+STATIC int
+is_valid_router_entry(const cdline_t *line)
+{
+ if (line->len < 2 || fast_memneq(line->s, "r ", 2))
+ return 0;
+ cdline_t tmp;
+ return (get_id_hash(line, &tmp) == 0);
+}
+
+/** Helper: Find the next router line starting at the current position.
+ * Assumes that cur is lower than the length of the smartlist, i.e. it is a
+ * line within the bounds of the consensus. The only exception is when we
+ * don't want to skip the first line, in which case cur will be -1.
+ */
+STATIC int
+next_router(const smartlist_t *cons, int cur)
+{
+ int len = smartlist_len(cons);
+ tor_assert(cur >= -1 && cur < len);
+
+ if (++cur >= len) {
+ return len;
+ }
+
+ const cdline_t *line = smartlist_get(cons, cur);
+ while (!is_valid_router_entry(line)) {
+ if (++cur >= len) {
+ return len;
+ }
+ line = smartlist_get(cons, cur);
+ }
+ return cur;
+}
+
+/** Helper: compare two base64-encoded identity hashes, which may be of
+ * different lengths. Comparison ends when the first non-base64 char is found.
+ */
+STATIC int
+base64cmp(const cdline_t *hash1, const cdline_t *hash2)
+{
+ /* NULL is always lower, useful for last_hash which starts at NULL. */
+ if (!hash1->s && !hash2->s) {
+ return 0;
+ }
+ if (!hash1->s) {
+ return -1;
+ }
+ if (!hash2->s) {
+ return 1;
+ }
+
+ /* Don't index with a char; char may be signed. */
+ const unsigned char *a = (unsigned char*)hash1->s;
+ const unsigned char *b = (unsigned char*)hash2->s;
+ const unsigned char *a_end = a + hash1->len;
+ const unsigned char *b_end = b + hash2->len;
+ while (1) {
+ uint8_t av = base64_compare_table[*a];
+ uint8_t bv = base64_compare_table[*b];
+ if (av == NOT_VALID_BASE64) {
+ if (bv == NOT_VALID_BASE64) {
+ /* Both ended with exactly the same characters. */
+ return 0;
+ } else {
+ /* hash2 goes on longer than hash1 and thus hash1 is lower. */
+ return -1;
+ }
+ } else if (bv == NOT_VALID_BASE64) {
+ /* hash1 goes on longer than hash2 and thus hash1 is greater. */
+ return 1;
+ } else if (av < bv) {
+ /* The first difference shows that hash1 is lower. */
+ return -1;
+ } else if (av > bv) {
+ /* The first difference shows that hash1 is greater. */
+ return 1;
+ } else {
+ a++;
+ b++;
+ if (a == a_end) {
+ if (b == b_end) {
+ return 0;
+ } else {
+ return -1;
+ }
+ } else if (b == b_end) {
+ return 1;
+ }
+ }
+ }
+}
+
+/** Structure used to remember the previous and current identity hash of
+ * the "r " lines in a consensus, to enforce well-ordering. */
+typedef struct router_id_iterator_t {
+ cdline_t last_hash;
+ cdline_t hash;
+} router_id_iterator_t;
+
+/**
+ * Initializer for a router_id_iterator_t.
+ */
+#define ROUTER_ID_ITERATOR_INIT { { NULL, 0 }, { NULL, 0 } }
+
+/** Given an index *<b>idxp</b> into the consensus at <b>cons</b>, advance
+ * the index to the next router line ("r ...") in the consensus, or to
+ * an index one after the end of the list if there is no such line.
+ *
+ * Use <b>iter</b> to record the hash of the found router line, if any,
+ * and to enforce ordering on the hashes. If the hashes are mis-ordered,
+ * return -1. Else, return 0.
+ **/
+static int
+find_next_router_line(const smartlist_t *cons,
+ const char *consname,
+ int *idxp,
+ router_id_iterator_t *iter)
+{
+ *idxp = next_router(cons, *idxp);
+ if (*idxp < smartlist_len(cons)) {
+ memcpy(&iter->last_hash, &iter->hash, sizeof(cdline_t));
+ if (get_id_hash(smartlist_get(cons, *idxp), &iter->hash) < 0 ||
+ base64cmp(&iter->hash, &iter->last_hash) <= 0) {
+ log_warn(LD_CONSDIFF, "Refusing to generate consensus diff because "
+ "the %s consensus doesn't have its router entries sorted "
+ "properly.", consname);
+ return -1;
+ }
+ }
+ return 0;
+}
+
+/** Line-prefix indicating the beginning of the signatures section that we
+ * intend to delete. */
+#define START_OF_SIGNATURES_SECTION "directory-signature "
+
+/** Pre-process a consensus in <b>cons</b> (represented as a list of cdline_t)
+ * to remove the signatures from it. If the footer is removed, return a
+ * cdline_t containing a delete command to delete the footer, allocated in
+ * <b>area</>. If no footer is removed, return NULL.
+ *
+ * We remove the signatures here because they are not themselves signed, and
+ * as such there might be different encodings for them.
+ */
+static cdline_t *
+preprocess_consensus(memarea_t *area,
+ smartlist_t *cons)
+{
+ int idx;
+ int dirsig_idx = -1;
+ for (idx = 0; idx < smartlist_len(cons); ++idx) {
+ cdline_t *line = smartlist_get(cons, idx);
+ if (line_starts_with_str(line, START_OF_SIGNATURES_SECTION)) {
+ dirsig_idx = idx;
+ break;
+ }
+ }
+ if (dirsig_idx >= 0) {
+ char buf[64];
+ while (smartlist_len(cons) > dirsig_idx)
+ smartlist_del(cons, dirsig_idx);
+ tor_snprintf(buf, sizeof(buf), "%d,$d", dirsig_idx+1);
+ return cdline_linecpy(area, buf);
+ } else {
+ return NULL;
+ }
+}
+
+/** Generate an ed diff as a smartlist from two consensuses, also given as
+ * smartlists. Will return NULL if the diff could not be generated, which can
+ * happen if any lines the script had to add matched "." or if the routers
+ * were not properly ordered.
+ *
+ * All cdline_t objects in the resulting object are either references to lines
+ * in one of the inputs, or are newly allocated lines in the provided memarea.
+ *
+ * This implementation is consensus-specific. To generate an ed diff for any
+ * given input in quadratic time, you can replace all the code until the
+ * navigation in reverse order with the following:
+ *
+ * int len1 = smartlist_len(cons1);
+ * int len2 = smartlist_len(cons2);
+ * bitarray_t *changed1 = bitarray_init_zero(len1);
+ * bitarray_t *changed2 = bitarray_init_zero(len2);
+ * cons1_sl = smartlist_slice(cons1, 0, -1);
+ * cons2_sl = smartlist_slice(cons2, 0, -1);
+ * calc_changes(cons1_sl, cons2_sl, changed1, changed2);
+ */
+STATIC smartlist_t *
+gen_ed_diff(const smartlist_t *cons1_orig, const smartlist_t *cons2,
+ memarea_t *area)
+{
+ smartlist_t *cons1 = smartlist_new();
+ smartlist_add_all(cons1, cons1_orig);
+ cdline_t *remove_trailer = preprocess_consensus(area, cons1);
+
+ int len1 = smartlist_len(cons1);
+ int len2 = smartlist_len(cons2);
+ smartlist_t *result = smartlist_new();
+
+ if (remove_trailer) {
+ /* There's a delete-the-trailer line at the end, so add it here. */
+ smartlist_add(result, remove_trailer);
+ }
+
+ /* Initialize the changed bitarrays to zero, so that calc_changes only needs
+ * to set the ones that matter and leave the rest untouched.
+ */
+ bitarray_t *changed1 = bitarray_init_zero(len1);
+ bitarray_t *changed2 = bitarray_init_zero(len2);
+ int i1=-1, i2=-1;
+ int start1=0, start2=0;
+
+ /* To check that hashes are ordered properly */
+ router_id_iterator_t iter1 = ROUTER_ID_ITERATOR_INIT;
+ router_id_iterator_t iter2 = ROUTER_ID_ITERATOR_INIT;
+
+ /* i1 and i2 are initialized at the first line of each consensus. They never
+ * reach past len1 and len2 respectively, since next_router doesn't let that
+ * happen. i1 and i2 are advanced by at least one line at each iteration as
+ * long as they have not yet reached len1 and len2, so the loop is
+ * guaranteed to end, and each pair of (i1,i2) will be inspected at most
+ * once.
+ */
+ while (i1 < len1 || i2 < len2) {
+
+ /* Advance each of the two navigation positions by one router entry if not
+ * yet at the end.
+ */
+ if (i1 < len1) {
+ if (find_next_router_line(cons1, "base", &i1, &iter1) < 0) {
+ goto error_cleanup;
+ }
+ }
+
+ if (i2 < len2) {
+ if (find_next_router_line(cons2, "target", &i2, &iter2) < 0) {
+ goto error_cleanup;
+ }
+ }
+
+ /* If we have reached the end of both consensuses, there is no need to
+ * compare hashes anymore, since this is the last iteration.
+ */
+ if (i1 < len1 || i2 < len2) {
+
+ /* Keep on advancing the lower (by identity hash sorting) position until
+ * we have two matching positions. The only other possible outcome is
+ * that a lower position reaches the end of the consensus before it can
+ * reach a hash that is no longer the lower one. Since there will always
+ * be a lower hash for as long as the loop runs, one of the two indexes
+ * will always be incremented, thus assuring that the loop must end
+ * after a finite number of iterations. If that cannot be because said
+ * consensus has already reached the end, both are extended to their
+ * respecting ends since we are done.
+ */
+ int cmp = base64cmp(&iter1.hash, &iter2.hash);
+ while (cmp != 0) {
+ if (i1 < len1 && cmp < 0) {
+ if (find_next_router_line(cons1, "base", &i1, &iter1) < 0) {
+ goto error_cleanup;
+ }
+ if (i1 == len1) {
+ /* We finished the first consensus, so grab all the remaining
+ * lines of the second consensus and finish up.
+ */
+ i2 = len2;
+ break;
+ }
+ } else if (i2 < len2 && cmp > 0) {
+ if (find_next_router_line(cons2, "target", &i2, &iter2) < 0) {
+ goto error_cleanup;
+ }
+ if (i2 == len2) {
+ /* We finished the second consensus, so grab all the remaining
+ * lines of the first consensus and finish up.
+ */
+ i1 = len1;
+ break;
+ }
+ } else {
+ i1 = len1;
+ i2 = len2;
+ break;
+ }
+ cmp = base64cmp(&iter1.hash, &iter2.hash);
+ }
+ }
+
+ /* Make slices out of these chunks (up to the common router entry) and
+ * calculate the changes for them.
+ * Error if any of the two slices are longer than 10K lines. That should
+ * never happen with any pair of real consensuses. Feeding more than 10K
+ * lines to calc_changes would be very slow anyway.
+ */
+#define MAX_LINE_COUNT (10000)
+ if (i1-start1 > MAX_LINE_COUNT || i2-start2 > MAX_LINE_COUNT) {
+ log_warn(LD_CONSDIFF, "Refusing to generate consensus diff because "
+ "we found too few common router ids.");
+ goto error_cleanup;
+ }
+
+ smartlist_slice_t *cons1_sl = smartlist_slice(cons1, start1, i1);
+ smartlist_slice_t *cons2_sl = smartlist_slice(cons2, start2, i2);
+ calc_changes(cons1_sl, cons2_sl, changed1, changed2);
+ tor_free(cons1_sl);
+ tor_free(cons2_sl);
+ start1 = i1, start2 = i2;
+ }
+
+ /* Navigate the changes in reverse order and generate one ed command for
+ * each chunk of changes.
+ */
+ i1=len1-1, i2=len2-1;
+ char buf[128];
+ while (i1 >= 0 || i2 >= 0) {
+
+ int start1x, start2x, end1, end2, added, deleted;
+
+ /* We are at a point were no changed bools are true, so just keep going. */
+ if (!(i1 >= 0 && bitarray_is_set(changed1, i1)) &&
+ !(i2 >= 0 && bitarray_is_set(changed2, i2))) {
+ if (i1 >= 0) {
+ i1--;
+ }
+ if (i2 >= 0) {
+ i2--;
+ }
+ continue;
+ }
+
+ end1 = i1, end2 = i2;
+
+ /* Grab all contiguous changed lines */
+ while (i1 >= 0 && bitarray_is_set(changed1, i1)) {
+ i1--;
+ }
+ while (i2 >= 0 && bitarray_is_set(changed2, i2)) {
+ i2--;
+ }
+
+ start1x = i1+1, start2x = i2+1;
+ added = end2-i2, deleted = end1-i1;
+
+ if (added == 0) {
+ if (deleted == 1) {
+ tor_snprintf(buf, sizeof(buf), "%id", start1x+1);
+ smartlist_add_linecpy(result, area, buf);
+ } else {
+ tor_snprintf(buf, sizeof(buf), "%i,%id", start1x+1, start1x+deleted);
+ smartlist_add_linecpy(result, area, buf);
+ }
+ } else {
+ int i;
+ if (deleted == 0) {
+ tor_snprintf(buf, sizeof(buf), "%ia", start1x);
+ smartlist_add_linecpy(result, area, buf);
+ } else if (deleted == 1) {
+ tor_snprintf(buf, sizeof(buf), "%ic", start1x+1);
+ smartlist_add_linecpy(result, area, buf);
+ } else {
+ tor_snprintf(buf, sizeof(buf), "%i,%ic", start1x+1, start1x+deleted);
+ smartlist_add_linecpy(result, area, buf);
+ }
+
+ for (i = start2x; i <= end2; ++i) {
+ cdline_t *line = smartlist_get(cons2, i);
+ if (line_str_eq(line, ".")) {
+ log_warn(LD_CONSDIFF, "Cannot generate consensus diff because "
+ "one of the lines to be added is \".\".");
+ goto error_cleanup;
+ }
+ smartlist_add(result, line);
+ }
+ smartlist_add_linecpy(result, area, ".");
+ }
+ }
+
+ smartlist_free(cons1);
+ bitarray_free(changed1);
+ bitarray_free(changed2);
+
+ return result;
+
+ error_cleanup:
+
+ smartlist_free(cons1);
+ bitarray_free(changed1);
+ bitarray_free(changed2);
+
+ smartlist_free(result);
+
+ return NULL;
+}
+
+/* Helper: Read a base-10 number between 0 and INT32_MAX from <b>s</b> and
+ * store it in <b>num_out</b>. Advance <b>s</b> to the characer immediately
+ * after the number. Return 0 on success, -1 on failure. */
+static int
+get_linenum(const char **s, int *num_out)
+{
+ int ok;
+ char *next;
+ if (!TOR_ISDIGIT(**s)) {
+ return -1;
+ }
+ *num_out = (int) tor_parse_long(*s, 10, 0, INT32_MAX, &ok, &next);
+ if (ok && next) {
+ *s = next;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+/** Apply the ed diff, starting at <b>diff_starting_line</b>, to the consensus
+ * and return a new consensus, also as a line-based smartlist. Will return
+ * NULL if the ed diff is not properly formatted.
+ *
+ * All cdline_t objects in the resulting object are references to lines
+ * in one of the inputs; nothing is copied.
+ */
+STATIC smartlist_t *
+apply_ed_diff(const smartlist_t *cons1, const smartlist_t *diff,
+ int diff_starting_line)
+{
+ int diff_len = smartlist_len(diff);
+ int j = smartlist_len(cons1);
+ smartlist_t *cons2 = smartlist_new();
+
+ for (int i=diff_starting_line; i<diff_len; ++i) {
+ const cdline_t *diff_cdline = smartlist_get(diff, i);
+ char diff_line[128];
+
+ if (diff_cdline->len > sizeof(diff_line) - 1) {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "an ed command was far too long");
+ goto error_cleanup;
+ }
+ /* Copy the line to make it nul-terminated. */
+ memcpy(diff_line, diff_cdline->s, diff_cdline->len);
+ diff_line[diff_cdline->len] = 0;
+ const char *ptr = diff_line;
+ int start = 0, end = 0;
+ int had_range = 0;
+ int end_was_eof = 0;
+ if (get_linenum(&ptr, &start) < 0) {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "an ed command was missing a line number.");
+ goto error_cleanup;
+ }
+ if (*ptr == ',') {
+ /* Two-item range */
+ had_range = 1;
+ ++ptr;
+ if (*ptr == '$') {
+ end_was_eof = 1;
+ end = smartlist_len(cons1);
+ ++ptr;
+ } else if (get_linenum(&ptr, &end) < 0) {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "an ed command was missing a range end line number.");
+ goto error_cleanup;
+ }
+ /* Incoherent range. */
+ if (end <= start) {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "an invalid range was found in an ed command.");
+ goto error_cleanup;
+ }
+ } else {
+ /* We'll take <n1> as <n1>,<n1> for simplicity. */
+ end = start;
+ }
+
+ if (end > j) {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "its commands are not properly sorted in reverse order.");
+ goto error_cleanup;
+ }
+
+ if (*ptr == '\0') {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "a line with no ed command was found");
+ goto error_cleanup;
+ }
+
+ if (*(ptr+1) != '\0') {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "an ed command longer than one char was found.");
+ goto error_cleanup;
+ }
+
+ char action = *ptr;
+
+ switch (action) {
+ case 'a':
+ case 'c':
+ case 'd':
+ break;
+ default:
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "an unrecognised ed command was found.");
+ goto error_cleanup;
+ }
+
+ /** $ is not allowed with non-d actions. */
+ if (end_was_eof && action != 'd') {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "it wanted to use $ with a command other than delete");
+ goto error_cleanup;
+ }
+
+ /* 'a' commands are not allowed to have ranges. */
+ if (had_range && action == 'a') {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "it wanted to add lines after a range.");
+ goto error_cleanup;
+ }
+
+ /* Add unchanged lines. */
+ for (; j && j > end; --j) {
+ cdline_t *cons_line = smartlist_get(cons1, j-1);
+ smartlist_add(cons2, cons_line);
+ }
+
+ /* Ignore removed lines. */
+ if (action == 'c' || action == 'd') {
+ while (--j >= start) {
+ /* Skip line */
+ }
+ }
+
+ /* Add new lines in reverse order, since it will all be reversed at the
+ * end.
+ */
+ if (action == 'a' || action == 'c') {
+ int added_end = i;
+
+ i++; /* Skip the line with the range and command. */
+ while (i < diff_len) {
+ if (line_str_eq(smartlist_get(diff, i), ".")) {
+ break;
+ }
+ if (++i == diff_len) {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "it has lines to be inserted that don't end with a \".\".");
+ goto error_cleanup;
+ }
+ }
+
+ int added_i = i-1;
+
+ /* It would make no sense to add zero new lines. */
+ if (added_i == added_end) {
+ log_warn(LD_CONSDIFF, "Could not apply consensus diff because "
+ "it has an ed command that tries to insert zero lines.");
+ goto error_cleanup;
+ }
+
+ while (added_i > added_end) {
+ cdline_t *added_line = smartlist_get(diff, added_i--);
+ smartlist_add(cons2, added_line);
+ }
+ }
+ }
+
+ /* Add remaining unchanged lines. */
+ for (; j > 0; --j) {
+ cdline_t *cons_line = smartlist_get(cons1, j-1);
+ smartlist_add(cons2, cons_line);
+ }
+
+ /* Reverse the whole thing since we did it from the end. */
+ smartlist_reverse(cons2);
+ return cons2;
+
+ error_cleanup:
+
+ smartlist_free(cons2);
+
+ return NULL;
+}
+
+/** Generate a consensus diff as a smartlist from two given consensuses, also
+ * as smartlists. Will return NULL if the consensus diff could not be
+ * generated. Neither of the two consensuses are modified in any way, so it's
+ * up to the caller to free their resources.
+ */
+smartlist_t *
+consdiff_gen_diff(const smartlist_t *cons1,
+ const smartlist_t *cons2,
+ const consensus_digest_t *digests1,
+ const consensus_digest_t *digests2,
+ memarea_t *area)
+{
+ smartlist_t *ed_diff = gen_ed_diff(cons1, cons2, area);
+ /* ed diff could not be generated - reason already logged by gen_ed_diff. */
+ if (!ed_diff) {
+ goto error_cleanup;
+ }
+
+ /* See that the script actually produces what we want. */
+ smartlist_t *ed_cons2 = apply_ed_diff(cons1, ed_diff, 0);
+ if (!ed_cons2) {
+ /* LCOV_EXCL_START -- impossible if diff generation is correct */
+ log_warn(LD_BUG|LD_CONSDIFF, "Refusing to generate consensus diff because "
+ "the generated ed diff could not be tested to successfully generate "
+ "the target consensus.");
+ goto error_cleanup;
+ /* LCOV_EXCL_STOP */
+ }
+
+ int cons2_eq = 1;
+ if (smartlist_len(cons2) == smartlist_len(ed_cons2)) {
+ SMARTLIST_FOREACH_BEGIN(cons2, const cdline_t *, line1) {
+ const cdline_t *line2 = smartlist_get(ed_cons2, line1_sl_idx);
+ if (! lines_eq(line1, line2) ) {
+ cons2_eq = 0;
+ break;
+ }
+ } SMARTLIST_FOREACH_END(line1);
+ } else {
+ cons2_eq = 0;
+ }
+ smartlist_free(ed_cons2);
+ if (!cons2_eq) {
+ /* LCOV_EXCL_START -- impossible if diff generation is correct. */
+ log_warn(LD_BUG|LD_CONSDIFF, "Refusing to generate consensus diff because "
+ "the generated ed diff did not generate the target consensus "
+ "successfully when tested.");
+ goto error_cleanup;
+ /* LCOV_EXCL_STOP */
+ }
+
+ char cons1_hash_hex[HEX_DIGEST256_LEN+1];
+ char cons2_hash_hex[HEX_DIGEST256_LEN+1];
+ base16_encode(cons1_hash_hex, HEX_DIGEST256_LEN+1,
+ (const char*)digests1->sha3_256, DIGEST256_LEN);
+ base16_encode(cons2_hash_hex, HEX_DIGEST256_LEN+1,
+ (const char*)digests2->sha3_256, DIGEST256_LEN);
+
+ /* Create the resulting consensus diff. */
+ char buf[160];
+ smartlist_t *result = smartlist_new();
+ tor_snprintf(buf, sizeof(buf), "%s", ns_diff_version);
+ smartlist_add_linecpy(result, area, buf);
+ tor_snprintf(buf, sizeof(buf), "%s %s %s", hash_token,
+ cons1_hash_hex, cons2_hash_hex);
+ smartlist_add_linecpy(result, area, buf);
+ smartlist_add_all(result, ed_diff);
+ smartlist_free(ed_diff);
+ return result;
+
+ error_cleanup:
+
+ if (ed_diff) {
+ /* LCOV_EXCL_START -- ed_diff is NULL except in unreachable cases above */
+ smartlist_free(ed_diff);
+ /* LCOV_EXCL_STOP */
+ }
+
+ return NULL;
+}
+
+/** Fetch the digest of the base consensus in the consensus diff, encoded in
+ * base16 as found in the diff itself. digest1_out and digest2_out must be of
+ * length DIGEST256_LEN or larger if not NULL.
+ */
+int
+consdiff_get_digests(const smartlist_t *diff,
+ char *digest1_out,
+ char *digest2_out)
+{
+ smartlist_t *hash_words = NULL;
+ const cdline_t *format;
+ char cons1_hash[DIGEST256_LEN], cons2_hash[DIGEST256_LEN];
+ char *cons1_hash_hex, *cons2_hash_hex;
+ if (smartlist_len(diff) < 2) {
+ log_info(LD_CONSDIFF, "The provided consensus diff is too short.");
+ goto error_cleanup;
+ }
+
+ /* Check that it's the format and version we know. */
+ format = smartlist_get(diff, 0);
+ if (!line_str_eq(format, ns_diff_version)) {
+ log_warn(LD_CONSDIFF, "The provided consensus diff format is not known.");
+ goto error_cleanup;
+ }
+
+ /* Grab the base16 digests. */
+ hash_words = smartlist_new();
+ {
+ const cdline_t *line2 = smartlist_get(diff, 1);
+ char *h = tor_memdup_nulterm(line2->s, line2->len);
+ smartlist_split_string(hash_words, h, " ", 0, 0);
+ tor_free(h);
+ }
+
+ /* There have to be three words, the first of which must be hash_token. */
+ if (smartlist_len(hash_words) != 3 ||
+ strcmp(smartlist_get(hash_words, 0), hash_token)) {
+ log_info(LD_CONSDIFF, "The provided consensus diff does not include "
+ "the necessary digests.");
+ goto error_cleanup;
+ }
+
+ /* Expected hashes as found in the consensus diff header. They must be of
+ * length HEX_DIGEST256_LEN, normally 64 hexadecimal characters.
+ * If any of the decodings fail, error to make sure that the hashes are
+ * proper base16-encoded digests.
+ */
+ cons1_hash_hex = smartlist_get(hash_words, 1);
+ cons2_hash_hex = smartlist_get(hash_words, 2);
+ if (strlen(cons1_hash_hex) != HEX_DIGEST256_LEN ||
+ strlen(cons2_hash_hex) != HEX_DIGEST256_LEN) {
+ log_info(LD_CONSDIFF, "The provided consensus diff includes "
+ "base16-encoded digests of incorrect size.");
+ goto error_cleanup;
+ }
+
+ if (base16_decode(cons1_hash, DIGEST256_LEN,
+ cons1_hash_hex, HEX_DIGEST256_LEN) != DIGEST256_LEN ||
+ base16_decode(cons2_hash, DIGEST256_LEN,
+ cons2_hash_hex, HEX_DIGEST256_LEN) != DIGEST256_LEN) {
+ log_info(LD_CONSDIFF, "The provided consensus diff includes "
+ "malformed digests.");
+ goto error_cleanup;
+ }
+
+ if (digest1_out) {
+ memcpy(digest1_out, cons1_hash, DIGEST256_LEN);
+ }
+ if (digest2_out) {
+ memcpy(digest2_out, cons2_hash, DIGEST256_LEN);
+ }
+
+ SMARTLIST_FOREACH(hash_words, char *, cp, tor_free(cp));
+ smartlist_free(hash_words);
+ return 0;
+
+ error_cleanup:
+
+ if (hash_words) {
+ SMARTLIST_FOREACH(hash_words, char *, cp, tor_free(cp));
+ smartlist_free(hash_words);
+ }
+ return 1;
+}
+
+/** Apply the consensus diff to the given consensus and return a new
+ * consensus, also as a line-based smartlist. Will return NULL if the diff
+ * could not be applied. Neither the consensus nor the diff are modified in
+ * any way, so it's up to the caller to free their resources.
+ */
+char *
+consdiff_apply_diff(const smartlist_t *cons1,
+ const smartlist_t *diff,
+ const consensus_digest_t *digests1)
+{
+ smartlist_t *cons2 = NULL;
+ char *cons2_str = NULL;
+ char e_cons1_hash[DIGEST256_LEN];
+ char e_cons2_hash[DIGEST256_LEN];
+
+ if (consdiff_get_digests(diff, e_cons1_hash, e_cons2_hash) != 0) {
+ goto error_cleanup;
+ }
+
+ /* See that the consensus that was given to us matches its hash. */
+ if (!consensus_digest_eq(digests1->sha3_256,
+ (const uint8_t*)e_cons1_hash)) {
+ char hex_digest1[HEX_DIGEST256_LEN+1];
+ char e_hex_digest1[HEX_DIGEST256_LEN+1];
+ log_warn(LD_CONSDIFF, "Refusing to apply consensus diff because "
+ "the base consensus doesn't match the digest as found in "
+ "the consensus diff header.");
+ base16_encode(hex_digest1, HEX_DIGEST256_LEN+1,
+ (const char *)digests1->sha3_256, DIGEST256_LEN);
+ base16_encode(e_hex_digest1, HEX_DIGEST256_LEN+1,
+ e_cons1_hash, DIGEST256_LEN);
+ log_warn(LD_CONSDIFF, "Expected: %s; found: %s",
+ hex_digest1, e_hex_digest1);
+ goto error_cleanup;
+ }
+
+ /* Grab the ed diff and calculate the resulting consensus. */
+ /* Skip the first two lines. */
+ cons2 = apply_ed_diff(cons1, diff, 2);
+
+ /* ed diff could not be applied - reason already logged by apply_ed_diff. */
+ if (!cons2) {
+ goto error_cleanup;
+ }
+
+ cons2_str = consensus_join_lines(cons2);
+
+ consensus_digest_t cons2_digests;
+ if (consensus_compute_digest(cons2_str, &cons2_digests) < 0) {
+ /* LCOV_EXCL_START -- digest can't fail */
+ log_warn(LD_CONSDIFF, "Could not compute digests of the consensus "
+ "resulting from applying a consensus diff.");
+ goto error_cleanup;
+ /* LCOV_EXCL_STOP */
+ }
+
+ /* See that the resulting consensus matches its hash. */
+ if (!consensus_digest_eq(cons2_digests.sha3_256,
+ (const uint8_t*)e_cons2_hash)) {
+ log_warn(LD_CONSDIFF, "Refusing to apply consensus diff because "
+ "the resulting consensus doesn't match the digest as found in "
+ "the consensus diff header.");
+ char hex_digest2[HEX_DIGEST256_LEN+1];
+ char e_hex_digest2[HEX_DIGEST256_LEN+1];
+ base16_encode(hex_digest2, HEX_DIGEST256_LEN+1,
+ (const char *)cons2_digests.sha3_256, DIGEST256_LEN);
+ base16_encode(e_hex_digest2, HEX_DIGEST256_LEN+1,
+ e_cons2_hash, DIGEST256_LEN);
+ log_warn(LD_CONSDIFF, "Expected: %s; found: %s",
+ hex_digest2, e_hex_digest2);
+ goto error_cleanup;
+ }
+
+ goto done;
+
+ error_cleanup:
+ tor_free(cons2_str); /* Sets it to NULL */
+
+ done:
+ if (cons2) {
+ smartlist_free(cons2);
+ }
+
+ return cons2_str;
+}
+
+/** Any consensus line longer than this means that the input is invalid. */
+#define CONSENSUS_LINE_MAX_LEN (1<<20)
+
+/**
+ * Helper: For every NL-terminated line in <b>s</b>, add a cdline referring to
+ * that line (without trailing newline) to <b>out</b>. Return -1 if there are
+ * any non-NL terminated lines; 0 otherwise.
+ *
+ * Unlike tor_split_lines, this function avoids ambiguity on its
+ * handling of a final line that isn't NL-terminated.
+ *
+ * All cdline_t objects are allocated in the provided memarea. Strings
+ * are not copied: if <b>s</b> changes or becomes invalid, then all
+ * generated cdlines will become invalid.
+ */
+STATIC int
+consensus_split_lines(smartlist_t *out, const char *s, memarea_t *area)
+{
+ while (*s) {
+ const char *eol = strchr(s, '\n');
+ if (!eol) {
+ /* File doesn't end with newline. */
+ return -1;
+ }
+ if (eol - s > CONSENSUS_LINE_MAX_LEN) {
+ /* Line is far too long. */
+ return -1;
+ }
+ cdline_t *line = memarea_alloc(area, sizeof(cdline_t));
+ line->s = s;
+ line->len = (uint32_t)(eol - s);
+ smartlist_add(out, line);
+ s = eol+1;
+ }
+ return 0;
+}
+
+/** Given a list of cdline_t, return a newly allocated string containing
+ * all of the lines, terminated with NL, concatenated.
+ *
+ * Unlike smartlist_join_strings(), avoids lossy operations on empty
+ * lists. */
+static char *
+consensus_join_lines(const smartlist_t *inp)
+{
+ size_t n = 0;
+ SMARTLIST_FOREACH(inp, const cdline_t *, cdline, n += cdline->len + 1);
+ n += 1;
+ char *result = tor_malloc(n);
+ char *out = result;
+ SMARTLIST_FOREACH_BEGIN(inp, const cdline_t *, cdline) {
+ memcpy(out, cdline->s, cdline->len);
+ out += cdline->len;
+ *out++ = '\n';
+ } SMARTLIST_FOREACH_END(cdline);
+ *out++ = '\0';
+ tor_assert(out == result+n);
+ return result;
+}
+
+/** Given two consensus documents, try to compute a diff between them. On
+ * success, retun a newly allocated string containing that diff. On failure,
+ * return NULL. */
+char *
+consensus_diff_generate(const char *cons1,
+ const char *cons2)
+{
+ consensus_digest_t d1, d2;
+ smartlist_t *lines1 = NULL, *lines2 = NULL, *result_lines = NULL;
+ int r1, r2;
+ char *result = NULL;
+
+ r1 = consensus_compute_digest_as_signed(cons1, &d1);
+ r2 = consensus_compute_digest(cons2, &d2);
+ if (BUG(r1 < 0 || r2 < 0))
+ return NULL; // LCOV_EXCL_LINE
+
+ memarea_t *area = memarea_new();
+ lines1 = smartlist_new();
+ lines2 = smartlist_new();
+ if (consensus_split_lines(lines1, cons1, area) < 0)
+ goto done;
+ if (consensus_split_lines(lines2, cons2, area) < 0)
+ goto done;
+
+ result_lines = consdiff_gen_diff(lines1, lines2, &d1, &d2, area);
+
+ done:
+ if (result_lines) {
+ result = consensus_join_lines(result_lines);
+ smartlist_free(result_lines);
+ }
+
+ memarea_drop_all(area);
+ smartlist_free(lines1);
+ smartlist_free(lines2);
+
+ return result;
+}
+
+/** Given a consensus document and a diff, try to apply the diff to the
+ * consensus. On success return a newly allocated string containing the new
+ * consensus. On failure, return NULL. */
+char *
+consensus_diff_apply(const char *consensus,
+ const char *diff)
+{
+ consensus_digest_t d1;
+ smartlist_t *lines1 = NULL, *lines2 = NULL;
+ int r1;
+ char *result = NULL;
+ memarea_t *area = memarea_new();
+
+ r1 = consensus_compute_digest_as_signed(consensus, &d1);
+ if (BUG(r1 < 0))
+ return NULL; // LCOV_EXCL_LINE
+
+ lines1 = smartlist_new();
+ lines2 = smartlist_new();
+ if (consensus_split_lines(lines1, consensus, area) < 0)
+ goto done;
+ if (consensus_split_lines(lines2, diff, area) < 0)
+ goto done;
+
+ result = consdiff_apply_diff(lines1, lines2, &d1);
+
+ done:
+ smartlist_free(lines1);
+ smartlist_free(lines2);
+ memarea_drop_all(area);
+
+ return result;
+}
+
+/** Return true iff, based on its header, <b>document</b> is likely
+ * to be a consensus diff. */
+int
+looks_like_a_consensus_diff(const char *document, size_t len)
+{
+ return (len >= strlen(ns_diff_version) &&
+ fast_memeq(document, ns_diff_version, strlen(ns_diff_version)));
+}
+
diff --git a/src/or/consdiff.h b/src/or/consdiff.h
new file mode 100644
index 0000000000..d05df74b75
--- /dev/null
+++ b/src/or/consdiff.h
@@ -0,0 +1,98 @@
+/* Copyright (c) 2014, Daniel Martí
+ * Copyright (c) 2014, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_CONSDIFF_H
+#define TOR_CONSDIFF_H
+
+#include "or.h"
+
+char *consensus_diff_generate(const char *cons1,
+ const char *cons2);
+char *consensus_diff_apply(const char *consensus,
+ const char *diff);
+
+int looks_like_a_consensus_diff(const char *document, size_t len);
+
+#ifdef CONSDIFF_PRIVATE
+struct memarea_t;
+
+/** Line type used for constructing consensus diffs. Each of these lines
+ * refers to a chunk of memory allocated elsewhere, and is not necessarily
+ * NUL-terminated: this helps us avoid copies and save memory. */
+typedef struct cdline_t {
+ const char *s;
+ uint32_t len;
+} cdline_t;
+
+typedef struct consensus_digest_t {
+ uint8_t sha3_256[DIGEST256_LEN];
+} consensus_digest_t;
+
+STATIC smartlist_t *consdiff_gen_diff(const smartlist_t *cons1,
+ const smartlist_t *cons2,
+ const consensus_digest_t *digests1,
+ const consensus_digest_t *digests2,
+ struct memarea_t *area);
+STATIC char *consdiff_apply_diff(const smartlist_t *cons1,
+ const smartlist_t *diff,
+ const consensus_digest_t *digests1);
+STATIC int consdiff_get_digests(const smartlist_t *diff,
+ char *digest1_out,
+ char *digest2_out);
+
+/** Data structure to define a slice of a smarltist. */
+typedef struct smartlist_slice_t {
+ /**
+ * Smartlist that this slice is made from.
+ * References the whole original smartlist that the slice was made out of.
+ * */
+ const smartlist_t *list;
+ /** Starting position of the slice in the smartlist. */
+ int offset;
+ /** Length of the slice, i.e. the number of elements it holds. */
+ int len;
+} smartlist_slice_t;
+STATIC smartlist_t *gen_ed_diff(const smartlist_t *cons1,
+ const smartlist_t *cons2,
+ struct memarea_t *area);
+STATIC smartlist_t *apply_ed_diff(const smartlist_t *cons1,
+ const smartlist_t *diff,
+ int start_line);
+STATIC void calc_changes(smartlist_slice_t *slice1, smartlist_slice_t *slice2,
+ bitarray_t *changed1, bitarray_t *changed2);
+STATIC smartlist_slice_t *smartlist_slice(const smartlist_t *list,
+ int start, int end);
+STATIC int next_router(const smartlist_t *cons, int cur);
+STATIC int *lcs_lengths(const smartlist_slice_t *slice1,
+ const smartlist_slice_t *slice2,
+ int direction);
+STATIC void trim_slices(smartlist_slice_t *slice1, smartlist_slice_t *slice2);
+STATIC int base64cmp(const cdline_t *hash1, const cdline_t *hash2);
+STATIC int get_id_hash(const cdline_t *line, cdline_t *hash_out);
+STATIC int is_valid_router_entry(const cdline_t *line);
+STATIC int smartlist_slice_string_pos(const smartlist_slice_t *slice,
+ const cdline_t *string);
+STATIC void set_changed(bitarray_t *changed1, bitarray_t *changed2,
+ const smartlist_slice_t *slice1,
+ const smartlist_slice_t *slice2);
+STATIC int consensus_split_lines(smartlist_t *out, const char *s,
+ struct memarea_t *area);
+STATIC void smartlist_add_linecpy(smartlist_t *lst, struct memarea_t *area,
+ const char *s);
+STATIC int lines_eq(const cdline_t *a, const cdline_t *b);
+STATIC int line_str_eq(const cdline_t *a, const char *b);
+
+MOCK_DECL(STATIC int,
+ consensus_compute_digest,(const char *cons,
+ consensus_digest_t *digest_out));
+MOCK_DECL(STATIC int,
+ consensus_compute_digest_as_signed,(const char *cons,
+ consensus_digest_t *digest_out));
+MOCK_DECL(STATIC int,
+ consensus_digest_eq,(const uint8_t *d1,
+ const uint8_t *d2));
+#endif
+
+#endif
+
diff --git a/src/or/consdiffmgr.c b/src/or/consdiffmgr.c
new file mode 100644
index 0000000000..d478101c6b
--- /dev/null
+++ b/src/or/consdiffmgr.c
@@ -0,0 +1,1410 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file consdiffmsr.c
+ *
+ * \brief consensus diff manager functions
+ *
+ * This module is run by directory authorities and caches in order
+ * to remember a number of past consensus documents, and to generate
+ * and serve the diffs from those documents to the latest consensus.
+ */
+
+#define CONSDIFFMGR_PRIVATE
+
+#include "or.h"
+#include "conscache.h"
+#include "consdiff.h"
+#include "consdiffmgr.h"
+#include "cpuworker.h"
+#include "networkstatus.h"
+#include "routerparse.h"
+#include "workqueue.h"
+
+/**
+ * Labels to apply to items in the conscache object.
+ *
+ * @{
+ */
+/* One of DOCTYPE_CONSENSUS or DOCTYPE_CONSENSUS_DIFF */
+#define LABEL_DOCTYPE "document-type"
+/* The valid-after time for a consensus (or for the target consensus of a
+ * diff), encoded as ISO UTC. */
+#define LABEL_VALID_AFTER "consensus-valid-after"
+/* A hex encoded SHA3 digest of the object, as compressed (if any) */
+#define LABEL_SHA3_DIGEST "sha3-digest"
+/* A hex encoded SHA3 digest of the object before compression. */
+#define LABEL_SHA3_DIGEST_UNCOMPRESSED "sha3-digest-uncompressed"
+/* A hex encoded SHA3 digest-as-signed of a consensus */
+#define LABEL_SHA3_DIGEST_AS_SIGNED "sha3-digest-as-signed"
+/* The flavor of the consensus or consensuses diff */
+#define LABEL_FLAVOR "consensus-flavor"
+/* Diff only: the SHA3 digest-as-signed of the source consensus. */
+#define LABEL_FROM_SHA3_DIGEST "from-sha3-digest"
+/* Diff only: the SHA3 digest-in-full of the target consensus. */
+#define LABEL_TARGET_SHA3_DIGEST "target-sha3-digest"
+/* Diff only: the valid-after date of the source consensus. */
+#define LABEL_FROM_VALID_AFTER "from-valid-after"
+/* What kind of compression was used? */
+#define LABEL_COMPRESSION_TYPE "compression"
+/** @} */
+
+#define DOCTYPE_CONSENSUS "consensus"
+#define DOCTYPE_CONSENSUS_DIFF "consensus-diff"
+
+/**
+ * Underlying directory that stores consensuses and consensus diffs. Don't
+ * use this directly: use cdm_cache_get() instead.
+ */
+static consensus_cache_t *cons_diff_cache = NULL;
+/**
+ * If true, we have learned at least one new consensus since the
+ * consensus cache was last up-to-date.
+ */
+static int cdm_cache_dirty = 0;
+/**
+ * If true, we have scanned the cache to update our hashtable of diffs.
+ */
+static int cdm_cache_loaded = 0;
+
+/**
+ * Possible status values for cdm_diff_t.cdm_diff_status
+ **/
+typedef enum cdm_diff_status_t {
+ CDM_DIFF_PRESENT=1,
+ CDM_DIFF_IN_PROGRESS=2,
+ CDM_DIFF_ERROR=3,
+} cdm_diff_status_t;
+
+/** Which methods do we use for precompressing diffs? */
+static const compress_method_t compress_diffs_with[] = {
+ NO_METHOD,
+ GZIP_METHOD,
+#ifdef HAVE_LZMA
+ LZMA_METHOD,
+#endif
+#ifdef HAVE_ZSTD
+ ZSTD_METHOD,
+#endif
+};
+
+/** How many different methods will we try to use for diff compression? */
+STATIC unsigned
+n_diff_compression_methods(void)
+{
+ return ARRAY_LENGTH(compress_diffs_with);
+}
+
+/** Hashtable node used to remember the current status of the diff
+ * from a given sha3 digest to the current consensus. */
+typedef struct cdm_diff_t {
+ HT_ENTRY(cdm_diff_t) node;
+
+ /** Consensus flavor for this diff (part of ht key) */
+ consensus_flavor_t flavor;
+ /** SHA3-256 digest of the consensus that this diff is _from_. (part of the
+ * ht key) */
+ uint8_t from_sha3[DIGEST256_LEN];
+ /** Method by which the diff is compressed. (part of the ht key */
+ compress_method_t compress_method;
+
+ /** One of the CDM_DIFF_* values, depending on whether this diff
+ * is available, in progress, or impossible to compute. */
+ cdm_diff_status_t cdm_diff_status;
+ /** SHA3-256 digest of the consensus that this diff is _to. */
+ uint8_t target_sha3[DIGEST256_LEN];
+
+ /** Handle to the cache entry for this diff, if any. We use a handle here
+ * to avoid thinking too hard about cache entry lifetime issues. */
+ consensus_cache_entry_handle_t *entry;
+} cdm_diff_t;
+
+/** Hashtable mapping flavor and source consensus digest to status. */
+static HT_HEAD(cdm_diff_ht, cdm_diff_t) cdm_diff_ht = HT_INITIALIZER();
+
+/**
+ * Configuration for this module
+ */
+static consdiff_cfg_t consdiff_cfg = {
+ /* .cache_max_age_hours = */ 24 * 90,
+ // XXXX I'd like to make this number bigger, but it interferes with the
+ // XXXX seccomp2 syscall filter, which tops out at BPF_MAXINS (4096)
+ // XXXX rules.
+ /* .cache_max_num = */ 128
+};
+
+static int consdiffmgr_ensure_space_for_files(int n);
+static int consensus_diff_queue_diff_work(consensus_cache_entry_t *diff_from,
+ consensus_cache_entry_t *diff_to);
+static void consdiffmgr_set_cache_flags(void);
+
+/* Just gzip consensuses for now. */
+#define COMPRESS_CONSENSUS_WITH GZIP_METHOD
+
+/* =====
+ * Hashtable setup
+ * ===== */
+
+/** Helper: hash the key of a cdm_diff_t. */
+static unsigned
+cdm_diff_hash(const cdm_diff_t *diff)
+{
+ uint8_t tmp[DIGEST256_LEN + 2];
+ memcpy(tmp, diff->from_sha3, DIGEST256_LEN);
+ tmp[DIGEST256_LEN] = (uint8_t) diff->flavor;
+ tmp[DIGEST256_LEN+1] = (uint8_t) diff->compress_method;
+ return (unsigned) siphash24g(tmp, sizeof(tmp));
+}
+/** Helper: compare two cdm_diff_t objects for key equality */
+static int
+cdm_diff_eq(const cdm_diff_t *diff1, const cdm_diff_t *diff2)
+{
+ return fast_memeq(diff1->from_sha3, diff2->from_sha3, DIGEST256_LEN) &&
+ diff1->flavor == diff2->flavor &&
+ diff1->compress_method == diff2->compress_method;
+}
+
+HT_PROTOTYPE(cdm_diff_ht, cdm_diff_t, node, cdm_diff_hash, cdm_diff_eq)
+HT_GENERATE2(cdm_diff_ht, cdm_diff_t, node, cdm_diff_hash, cdm_diff_eq,
+ 0.6, tor_reallocarray, tor_free_)
+
+/** Release all storage held in <b>diff</b>. */
+static void
+cdm_diff_free(cdm_diff_t *diff)
+{
+ if (!diff)
+ return;
+ consensus_cache_entry_handle_free(diff->entry);
+ tor_free(diff);
+}
+
+/** Create and return a new cdm_diff_t with the given values. Does not
+ * add it to the hashtable. */
+static cdm_diff_t *
+cdm_diff_new(consensus_flavor_t flav,
+ const uint8_t *from_sha3,
+ const uint8_t *target_sha3,
+ compress_method_t method)
+{
+ cdm_diff_t *ent;
+ ent = tor_malloc_zero(sizeof(cdm_diff_t));
+ ent->flavor = flav;
+ memcpy(ent->from_sha3, from_sha3, DIGEST256_LEN);
+ memcpy(ent->target_sha3, target_sha3, DIGEST256_LEN);
+ ent->compress_method = method;
+ return ent;
+}
+
+/**
+ * Examine the diff hashtable to see whether we know anything about computing
+ * a diff of type <b>flav</b> between consensuses with the two provided
+ * SHA3-256 digests. If a computation is in progress, or if the computation
+ * has already been tried and failed, return 1. Otherwise, note the
+ * computation as "in progress" so that we don't reattempt it later, and
+ * return 0.
+ */
+static int
+cdm_diff_ht_check_and_note_pending(consensus_flavor_t flav,
+ const uint8_t *from_sha3,
+ const uint8_t *target_sha3)
+{
+ struct cdm_diff_t search, *ent;
+ unsigned u;
+ int result = 0;
+ for (u = 0; u < n_diff_compression_methods(); ++u) {
+ compress_method_t method = compress_diffs_with[u];
+ memset(&search, 0, sizeof(cdm_diff_t));
+ search.flavor = flav;
+ search.compress_method = method;
+ memcpy(search.from_sha3, from_sha3, DIGEST256_LEN);
+ ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search);
+ if (ent) {
+ tor_assert_nonfatal(ent->cdm_diff_status != CDM_DIFF_PRESENT);
+ result = 1;
+ continue;
+ }
+ ent = cdm_diff_new(flav, from_sha3, target_sha3, method);
+ ent->cdm_diff_status = CDM_DIFF_IN_PROGRESS;
+ HT_INSERT(cdm_diff_ht, &cdm_diff_ht, ent);
+ }
+ return result;
+}
+
+/**
+ * Update the status of the diff of type <b>flav</b> between consensuses with
+ * the two provided SHA3-256 digests, so that its status becomes
+ * <b>status</b>, and its value becomes the <b>handle</b>. If <b>handle</b>
+ * is NULL, then the old handle (if any) is freed, and replaced with NULL.
+ */
+static void
+cdm_diff_ht_set_status(consensus_flavor_t flav,
+ const uint8_t *from_sha3,
+ const uint8_t *to_sha3,
+ compress_method_t method,
+ int status,
+ consensus_cache_entry_handle_t *handle)
+{
+ struct cdm_diff_t search, *ent;
+ memset(&search, 0, sizeof(cdm_diff_t));
+ search.flavor = flav;
+ search.compress_method = method,
+ memcpy(search.from_sha3, from_sha3, DIGEST256_LEN);
+ ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search);
+ if (!ent) {
+ ent = cdm_diff_new(flav, from_sha3, to_sha3, method);
+ ent->cdm_diff_status = CDM_DIFF_IN_PROGRESS;
+ HT_INSERT(cdm_diff_ht, &cdm_diff_ht, ent);
+ } else if (fast_memneq(ent->target_sha3, to_sha3, DIGEST256_LEN)) {
+ // This can happen under certain really pathological conditions
+ // if we decide we don't care about a diff before it is actually
+ // done computing.
+ return;
+ }
+
+ tor_assert_nonfatal(ent->cdm_diff_status == CDM_DIFF_IN_PROGRESS);
+
+ ent->cdm_diff_status = status;
+ consensus_cache_entry_handle_free(ent->entry);
+ ent->entry = handle;
+}
+
+/**
+ * Helper: Remove from the hash table every present (actually computed) diff
+ * of type <b>flav</b> whose target digest does not match
+ * <b>unless_target_sha3_matches</b>.
+ *
+ * This function is used for the hash table to throw away references to diffs
+ * that do not lead to the most given consensus of a given flavor.
+ */
+static void
+cdm_diff_ht_purge(consensus_flavor_t flav,
+ const uint8_t *unless_target_sha3_matches)
+{
+ cdm_diff_t **diff, **next;
+ for (diff = HT_START(cdm_diff_ht, &cdm_diff_ht); diff; diff = next) {
+ cdm_diff_t *this = *diff;
+
+ if ((*diff)->cdm_diff_status == CDM_DIFF_PRESENT &&
+ flav == (*diff)->flavor) {
+
+ if (consensus_cache_entry_handle_get((*diff)->entry) == NULL) {
+ /* the underlying entry has gone away; drop this. */
+ next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff);
+ cdm_diff_free(this);
+ continue;
+ }
+
+ if (unless_target_sha3_matches &&
+ fast_memneq(unless_target_sha3_matches, (*diff)->target_sha3,
+ DIGEST256_LEN)) {
+ /* target hash doesn't match; drop this. */
+ next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff);
+ cdm_diff_free(this);
+ continue;
+ }
+ }
+ next = HT_NEXT(cdm_diff_ht, &cdm_diff_ht, diff);
+ }
+}
+
+/**
+ * Helper: initialize <b>cons_diff_cache</b>.
+ */
+static void
+cdm_cache_init(void)
+{
+ unsigned n_entries = consdiff_cfg.cache_max_num * 2;
+
+ tor_assert(cons_diff_cache == NULL);
+ cons_diff_cache = consensus_cache_open("diff-cache", n_entries);
+ if (cons_diff_cache == NULL) {
+ // LCOV_EXCL_START
+ log_err(LD_FS, "Error: Couldn't open storage for consensus diffs.");
+ tor_assert_unreached();
+ // LCOV_EXCL_STOP
+ } else {
+ consdiffmgr_set_cache_flags();
+ }
+ cdm_cache_dirty = 1;
+ cdm_cache_loaded = 0;
+}
+
+/**
+ * Helper: return the consensus_cache_t * that backs this manager,
+ * initializing it if needed.
+ */
+STATIC consensus_cache_t *
+cdm_cache_get(void)
+{
+ if (PREDICT_UNLIKELY(cons_diff_cache == NULL)) {
+ cdm_cache_init();
+ }
+ return cons_diff_cache;
+}
+
+/**
+ * Helper: given a list of labels, prepend the hex-encoded SHA3 digest
+ * of the <b>bodylen</b>-byte object at <b>body</b> to those labels,
+ * with <b>label</b> as its label.
+ */
+static void
+cdm_labels_prepend_sha3(config_line_t **labels,
+ const char *label,
+ const uint8_t *body,
+ size_t bodylen)
+{
+ uint8_t sha3_digest[DIGEST256_LEN];
+ char hexdigest[HEX_DIGEST256_LEN+1];
+ crypto_digest256((char *)sha3_digest,
+ (const char *)body, bodylen, DIGEST_SHA3_256);
+ base16_encode(hexdigest, sizeof(hexdigest),
+ (const char *)sha3_digest, sizeof(sha3_digest));
+
+ config_line_prepend(labels, label, hexdigest);
+}
+
+/** Helper: if there is a sha3-256 hex-encoded digest in <b>ent</b> with the
+ * given label, set <b>digest_out</b> to that value (decoded), and return 0.
+ *
+ * Return -1 if there is no such label, and -2 if it is badly formatted. */
+STATIC int
+cdm_entry_get_sha3_value(uint8_t *digest_out,
+ consensus_cache_entry_t *ent,
+ const char *label)
+{
+ if (ent == NULL)
+ return -1;
+
+ const char *hex = consensus_cache_entry_get_value(ent, label);
+ if (hex == NULL)
+ return -1;
+
+ int n = base16_decode((char*)digest_out, DIGEST256_LEN, hex, strlen(hex));
+ if (n != DIGEST256_LEN)
+ return -2;
+ else
+ return 0;
+}
+
+/**
+ * Helper: look for a consensus with the given <b>flavor</b> and
+ * <b>valid_after</b> time in the cache. Return that consensus if it's
+ * present, or NULL if it's missing.
+ */
+STATIC consensus_cache_entry_t *
+cdm_cache_lookup_consensus(consensus_flavor_t flavor, time_t valid_after)
+{
+ char formatted_time[ISO_TIME_LEN+1];
+ format_iso_time_nospace(formatted_time, valid_after);
+ const char *flavname = networkstatus_get_flavor_name(flavor);
+
+ /* We'll filter by valid-after time first, since that should
+ * match the fewest documents. */
+ /* We could add an extra hashtable here, but since we only do this scan
+ * when adding a new consensus, it probably doesn't matter much. */
+ smartlist_t *matches = smartlist_new();
+ consensus_cache_find_all(matches, cdm_cache_get(),
+ LABEL_VALID_AFTER, formatted_time);
+ consensus_cache_filter_list(matches, LABEL_FLAVOR, flavname);
+ consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS);
+
+ consensus_cache_entry_t *result = NULL;
+ if (smartlist_len(matches) > 1) {
+ log_warn(LD_BUG, "How odd; there appear to be two matching consensuses "
+ "with flavor %s published at %s.",
+ flavname, formatted_time);
+ }
+ if (smartlist_len(matches)) {
+ result = smartlist_get(matches, 0);
+ }
+ smartlist_free(matches);
+
+ return result;
+}
+
+/**
+ * Given a string containing a networkstatus consensus, and the results of
+ * having parsed that consensus, add that consensus to the cache if it is not
+ * already present and not too old. Create new consensus diffs from or to
+ * that consensus as appropriate.
+ *
+ * Return 0 on success and -1 on failure.
+ */
+int
+consdiffmgr_add_consensus(const char *consensus,
+ const networkstatus_t *as_parsed)
+{
+ if (BUG(consensus == NULL) || BUG(as_parsed == NULL))
+ return -1; // LCOV_EXCL_LINE
+ if (BUG(as_parsed->type != NS_TYPE_CONSENSUS))
+ return -1; // LCOV_EXCL_LINE
+
+ const consensus_flavor_t flavor = as_parsed->flavor;
+ const time_t valid_after = as_parsed->valid_after;
+
+ if (valid_after < approx_time() - 3600 * consdiff_cfg.cache_max_age_hours) {
+ log_info(LD_DIRSERV, "We don't care about this consensus document; it's "
+ "too old.");
+ return -1;
+ }
+
+ /* Do we already have this one? */
+ consensus_cache_entry_t *entry =
+ cdm_cache_lookup_consensus(flavor, valid_after);
+ if (entry) {
+ log_info(LD_DIRSERV, "We already have a copy of that consensus");
+ return -1;
+ }
+
+ /* We don't have it. Add it to the cache. */
+ consdiffmgr_ensure_space_for_files(1);
+
+ {
+ size_t bodylen = strlen(consensus);
+ config_line_t *labels = NULL;
+ char formatted_time[ISO_TIME_LEN+1];
+ format_iso_time_nospace(formatted_time, valid_after);
+ const char *flavname = networkstatus_get_flavor_name(flavor);
+
+ cdm_labels_prepend_sha3(&labels, LABEL_SHA3_DIGEST_UNCOMPRESSED,
+ (const uint8_t *)consensus, bodylen);
+ {
+ const char *start, *end;
+ if (router_get_networkstatus_v3_signed_boundaries(consensus,
+ &start, &end) < 0) {
+ start = consensus;
+ end = consensus+bodylen;
+ }
+ cdm_labels_prepend_sha3(&labels, LABEL_SHA3_DIGEST_AS_SIGNED,
+ (const uint8_t *)start,
+ end - start);
+ }
+
+ char *body_compressed = NULL;
+ size_t size_compressed = 0;
+ if (tor_compress(&body_compressed, &size_compressed,
+ consensus, bodylen, COMPRESS_CONSENSUS_WITH) < 0) {
+ config_free_lines(labels);
+ return -1;
+ }
+ cdm_labels_prepend_sha3(&labels, LABEL_SHA3_DIGEST,
+ (const uint8_t *)body_compressed, size_compressed);
+ config_line_prepend(&labels, LABEL_COMPRESSION_TYPE,
+ compression_method_get_name(COMPRESS_CONSENSUS_WITH));
+ config_line_prepend(&labels, LABEL_FLAVOR, flavname);
+ config_line_prepend(&labels, LABEL_VALID_AFTER, formatted_time);
+ config_line_prepend(&labels, LABEL_DOCTYPE, DOCTYPE_CONSENSUS);
+
+ entry = consensus_cache_add(cdm_cache_get(),
+ labels,
+ (const uint8_t *)body_compressed,
+ size_compressed);
+ tor_free(body_compressed);
+ config_free_lines(labels);
+ }
+
+ if (entry) {
+ consensus_cache_entry_mark_for_aggressive_release(entry);
+ consensus_cache_entry_decref(entry);
+ }
+
+ cdm_cache_dirty = 1;
+ return entry ? 0 : -1;
+}
+
+/**
+ * Helper: used to sort two smartlists of consensus_cache_entry_t by their
+ * LABEL_VALID_AFTER labels.
+ */
+static int
+compare_by_valid_after_(const void **a, const void **b)
+{
+ const consensus_cache_entry_t *e1 = *a;
+ const consensus_cache_entry_t *e2 = *b;
+ /* We're in luck here: sorting UTC iso-encoded values lexically will work
+ * fine (until 9999). */
+ return strcmp_opt(consensus_cache_entry_get_value(e1, LABEL_VALID_AFTER),
+ consensus_cache_entry_get_value(e2, LABEL_VALID_AFTER));
+}
+
+/**
+ * Helper: Sort <b>lst</b> by LABEL_VALID_AFTER and return the most recent
+ * entry.
+ */
+static consensus_cache_entry_t *
+sort_and_find_most_recent(smartlist_t *lst)
+{
+ smartlist_sort(lst, compare_by_valid_after_);
+ if (smartlist_len(lst)) {
+ return smartlist_get(lst, smartlist_len(lst) - 1);
+ } else {
+ return NULL;
+ }
+}
+
+/**
+ * Look up consensus_cache_entry_t for the consensus of type <b>flavor</b>,
+ * from the source consensus with the specified digest (which must be SHA3).
+ *
+ * If the diff is present, store it into *<b>entry_out</b> and return
+ * CONSDIFF_AVAILABLE. Otherwise return CONSDIFF_NOT_FOUND or
+ * CONSDIFF_IN_PROGRESS.
+ */
+consdiff_status_t
+consdiffmgr_find_diff_from(consensus_cache_entry_t **entry_out,
+ consensus_flavor_t flavor,
+ int digest_type,
+ const uint8_t *digest,
+ size_t digestlen,
+ compress_method_t method)
+{
+ if (BUG(digest_type != DIGEST_SHA3_256) ||
+ BUG(digestlen != DIGEST256_LEN)) {
+ return CONSDIFF_NOT_FOUND; // LCOV_EXCL_LINE
+ }
+
+ // Try to look up the entry in the hashtable.
+ cdm_diff_t search, *ent;
+ memset(&search, 0, sizeof(search));
+ search.flavor = flavor;
+ search.compress_method = method;
+ memcpy(search.from_sha3, digest, DIGEST256_LEN);
+ ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search);
+
+ if (ent == NULL ||
+ ent->cdm_diff_status == CDM_DIFF_ERROR) {
+ return CONSDIFF_NOT_FOUND;
+ } else if (ent->cdm_diff_status == CDM_DIFF_IN_PROGRESS) {
+ return CONSDIFF_IN_PROGRESS;
+ } else if (BUG(ent->cdm_diff_status != CDM_DIFF_PRESENT)) {
+ return CONSDIFF_IN_PROGRESS;
+ }
+
+ *entry_out = consensus_cache_entry_handle_get(ent->entry);
+ return (*entry_out) ? CONSDIFF_AVAILABLE : CONSDIFF_NOT_FOUND;
+
+#if 0
+ // XXXX Remove this. I'm keeping it around for now in case we need to
+ // XXXX debug issues in the hashtable.
+ char hex[HEX_DIGEST256_LEN+1];
+ base16_encode(hex, sizeof(hex), (const char *)digest, digestlen);
+ const char *flavname = networkstatus_get_flavor_name(flavor);
+
+ smartlist_t *matches = smartlist_new();
+ consensus_cache_find_all(matches, cdm_cache_get(),
+ LABEL_FROM_SHA3_DIGEST, hex);
+ consensus_cache_filter_list(matches, LABEL_FLAVOR, flavname);
+ consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF);
+
+ *entry_out = sort_and_find_most_recent(matches);
+ consdiff_status_t result =
+ (*entry_out) ? CONSDIFF_AVAILABLE : CONSDIFF_NOT_FOUND;
+ smartlist_free(matches);
+
+ return result;
+#endif
+}
+
+/**
+ * Perform periodic cleanup tasks on the consensus diff cache. Return
+ * the number of objects marked for deletion.
+ */
+int
+consdiffmgr_cleanup(void)
+{
+ smartlist_t *objects = smartlist_new();
+ smartlist_t *consensuses = smartlist_new();
+ smartlist_t *diffs = smartlist_new();
+ int n_to_delete = 0;
+
+ log_debug(LD_DIRSERV, "Looking for consdiffmgr entries to remove");
+
+ // 1. Delete any consensus or diff or anything whose valid_after is too old.
+ const time_t valid_after_cutoff =
+ approx_time() - 3600 * consdiff_cfg.cache_max_age_hours;
+
+ consensus_cache_find_all(objects, cdm_cache_get(),
+ NULL, NULL);
+ SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) {
+ const char *lv_valid_after =
+ consensus_cache_entry_get_value(ent, LABEL_VALID_AFTER);
+ if (! lv_valid_after) {
+ log_debug(LD_DIRSERV, "Ignoring entry because it had no %s label",
+ LABEL_VALID_AFTER);
+ continue;
+ }
+ time_t valid_after = 0;
+ if (parse_iso_time_nospace(lv_valid_after, &valid_after) < 0) {
+ log_debug(LD_DIRSERV, "Ignoring entry because its %s value (%s) was "
+ "unparseable", LABEL_VALID_AFTER, escaped(lv_valid_after));
+ continue;
+ }
+ if (valid_after < valid_after_cutoff) {
+ log_debug(LD_DIRSERV, "Deleting entry because its %s value (%s) was "
+ "too old", LABEL_VALID_AFTER, lv_valid_after);
+ consensus_cache_entry_mark_for_removal(ent);
+ ++n_to_delete;
+ }
+ } SMARTLIST_FOREACH_END(ent);
+
+ // 2. Delete all diffs that lead to a consensus whose valid-after is not the
+ // latest.
+ for (int flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) {
+ const char *flavname = networkstatus_get_flavor_name(flav);
+ /* Determine the most recent consensus of this flavor */
+ consensus_cache_find_all(consensuses, cdm_cache_get(),
+ LABEL_DOCTYPE, DOCTYPE_CONSENSUS);
+ consensus_cache_filter_list(consensuses, LABEL_FLAVOR, flavname);
+ consensus_cache_entry_t *most_recent =
+ sort_and_find_most_recent(consensuses);
+ if (most_recent == NULL)
+ continue;
+ const char *most_recent_sha3 =
+ consensus_cache_entry_get_value(most_recent,
+ LABEL_SHA3_DIGEST_UNCOMPRESSED);
+ if (BUG(most_recent_sha3 == NULL))
+ continue; // LCOV_EXCL_LINE
+
+ /* consider all such-flavored diffs, and look to see if they match. */
+ consensus_cache_find_all(diffs, cdm_cache_get(),
+ LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF);
+ consensus_cache_filter_list(diffs, LABEL_FLAVOR, flavname);
+ SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) {
+ const char *this_diff_target_sha3 =
+ consensus_cache_entry_get_value(diff, LABEL_TARGET_SHA3_DIGEST);
+ if (!this_diff_target_sha3)
+ continue;
+ if (strcmp(this_diff_target_sha3, most_recent_sha3)) {
+ consensus_cache_entry_mark_for_removal(diff);
+ ++n_to_delete;
+ }
+ } SMARTLIST_FOREACH_END(diff);
+ smartlist_clear(consensuses);
+ smartlist_clear(diffs);
+ }
+
+ smartlist_free(objects);
+ smartlist_free(consensuses);
+ smartlist_free(diffs);
+
+ // Actually remove files, if they're not used.
+ consensus_cache_delete_pending(cdm_cache_get(), 0);
+ return n_to_delete;
+}
+
+/**
+ * Initialize the consensus diff manager and its cache, and configure
+ * its parameters based on the latest torrc and networkstatus parameters.
+ */
+void
+consdiffmgr_configure(const consdiff_cfg_t *cfg)
+{
+ if (cfg)
+ memcpy(&consdiff_cfg, cfg, sizeof(consdiff_cfg));
+
+ (void) cdm_cache_get();
+}
+
+/**
+ * Tell the sandbox (if any) configured by <b>cfg</b> to allow the
+ * operations that the consensus diff manager will need.
+ */
+int
+consdiffmgr_register_with_sandbox(struct sandbox_cfg_elem **cfg)
+{
+ return consensus_cache_register_with_sandbox(cdm_cache_get(), cfg);
+}
+
+/**
+ * Scan the consensus diff manager's cache for any grossly malformed entries,
+ * and mark them as deletable. Return 0 if no problems were found; 1
+ * if problems were found and fixed.
+ */
+int
+consdiffmgr_validate(void)
+{
+ /* Right now, we only check for entries that have bad sha3 values */
+ int problems = 0;
+
+ smartlist_t *objects = smartlist_new();
+ consensus_cache_find_all(objects, cdm_cache_get(),
+ NULL, NULL);
+ SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, obj) {
+ uint8_t sha3_expected[DIGEST256_LEN];
+ uint8_t sha3_received[DIGEST256_LEN];
+ int r = cdm_entry_get_sha3_value(sha3_expected, obj, LABEL_SHA3_DIGEST);
+ if (r == -1) {
+ /* digest isn't there; that's allowed */
+ continue;
+ } else if (r == -2) {
+ /* digest is malformed; that's not allowed */
+ problems = 1;
+ consensus_cache_entry_mark_for_removal(obj);
+ continue;
+ }
+ const uint8_t *body;
+ size_t bodylen;
+ consensus_cache_entry_incref(obj);
+ r = consensus_cache_entry_get_body(obj, &body, &bodylen);
+ if (r == 0) {
+ crypto_digest256((char *)sha3_received, (const char *)body, bodylen,
+ DIGEST_SHA3_256);
+ }
+ consensus_cache_entry_decref(obj);
+ if (r < 0)
+ continue;
+
+ // Deconfuse coverity about the possibility of sha3_received being
+ // uninitialized
+ tor_assert(r <= 0);
+
+ if (fast_memneq(sha3_received, sha3_expected, DIGEST256_LEN)) {
+ problems = 1;
+ consensus_cache_entry_mark_for_removal(obj);
+ continue;
+ }
+
+ } SMARTLIST_FOREACH_END(obj);
+ smartlist_free(objects);
+ return problems;
+}
+
+/**
+ * Helper: build new diffs of <b>flavor</b> as needed
+ */
+static void
+consdiffmgr_rescan_flavor_(consensus_flavor_t flavor)
+{
+ smartlist_t *matches = NULL;
+ smartlist_t *diffs = NULL;
+ smartlist_t *compute_diffs_from = NULL;
+ strmap_t *have_diff_from = NULL;
+
+ // look for the most recent consensus, and for all previous in-range
+ // consensuses. Do they all have diffs to it?
+ const char *flavname = networkstatus_get_flavor_name(flavor);
+
+ // 1. find the most recent consensus, and the ones that we might want
+ // to diff to it.
+ matches = smartlist_new();
+ consensus_cache_find_all(matches, cdm_cache_get(),
+ LABEL_FLAVOR, flavname);
+ consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS);
+ consensus_cache_entry_t *most_recent = sort_and_find_most_recent(matches);
+ if (!most_recent) {
+ log_info(LD_DIRSERV, "No 'most recent' %s consensus found; "
+ "not making diffs", flavname);
+ goto done;
+ }
+ tor_assert(smartlist_len(matches));
+ smartlist_del(matches, smartlist_len(matches) - 1);
+
+ const char *most_recent_valid_after =
+ consensus_cache_entry_get_value(most_recent, LABEL_VALID_AFTER);
+ if (BUG(most_recent_valid_after == NULL))
+ goto done; //LCOV_EXCL_LINE
+ uint8_t most_recent_sha3[DIGEST256_LEN];
+ if (BUG(cdm_entry_get_sha3_value(most_recent_sha3, most_recent,
+ LABEL_SHA3_DIGEST_UNCOMPRESSED) < 0))
+ goto done; //LCOV_EXCL_LINE
+
+ // 2. Find all the relevant diffs _to_ this consensus. These are ones
+ // that we don't need to compute.
+ diffs = smartlist_new();
+ consensus_cache_find_all(diffs, cdm_cache_get(),
+ LABEL_VALID_AFTER, most_recent_valid_after);
+ consensus_cache_filter_list(diffs, LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF);
+ consensus_cache_filter_list(diffs, LABEL_FLAVOR, flavname);
+ have_diff_from = strmap_new();
+ SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) {
+ const char *va = consensus_cache_entry_get_value(diff,
+ LABEL_FROM_VALID_AFTER);
+ if (BUG(va == NULL))
+ continue; // LCOV_EXCL_LINE
+ strmap_set(have_diff_from, va, diff);
+ } SMARTLIST_FOREACH_END(diff);
+
+ // 3. See which consensuses in 'matches' don't have diffs yet.
+ smartlist_reverse(matches); // from newest to oldest.
+ compute_diffs_from = smartlist_new();
+ SMARTLIST_FOREACH_BEGIN(matches, consensus_cache_entry_t *, ent) {
+ const char *va = consensus_cache_entry_get_value(ent, LABEL_VALID_AFTER);
+ if (BUG(va == NULL))
+ continue; // LCOV_EXCL_LINE
+ if (strmap_get(have_diff_from, va) != NULL)
+ continue; /* we already have this one. */
+ smartlist_add(compute_diffs_from, ent);
+ } SMARTLIST_FOREACH_END(ent);
+
+ log_info(LD_DIRSERV,
+ "The most recent %s consensus is valid-after %s. We have diffs to "
+ "this consensus for %d/%d older %s consensuses. Generating diffs "
+ "for the other %d.",
+ flavname,
+ most_recent_valid_after,
+ smartlist_len(matches) - smartlist_len(compute_diffs_from),
+ smartlist_len(matches),
+ flavname,
+ smartlist_len(compute_diffs_from));
+
+ // 4. Update the hashtable; remove entries in this flavor to other
+ // target consensuses.
+ cdm_diff_ht_purge(flavor, most_recent_sha3);
+
+ // 5. Actually launch the requests.
+ SMARTLIST_FOREACH_BEGIN(compute_diffs_from, consensus_cache_entry_t *, c) {
+ if (BUG(c == most_recent))
+ continue; // LCOV_EXCL_LINE
+
+ uint8_t this_sha3[DIGEST256_LEN];
+ if (cdm_entry_get_sha3_value(this_sha3, c,
+ LABEL_SHA3_DIGEST_AS_SIGNED)<0) {
+ // Not actually a bug, since we might be running with a directory
+ // with stale files from before the #22143 fixes.
+ continue;
+ }
+ if (cdm_diff_ht_check_and_note_pending(flavor,
+ this_sha3, most_recent_sha3)) {
+ // This is already pending, or we encountered an error.
+ continue;
+ }
+ consensus_diff_queue_diff_work(c, most_recent);
+ } SMARTLIST_FOREACH_END(c);
+
+ done:
+ smartlist_free(matches);
+ smartlist_free(diffs);
+ smartlist_free(compute_diffs_from);
+ strmap_free(have_diff_from, NULL);
+}
+
+/**
+ * Scan the cache for diffs, and add them to the hashtable.
+ */
+static void
+consdiffmgr_diffs_load(void)
+{
+ smartlist_t *diffs = smartlist_new();
+ consensus_cache_find_all(diffs, cdm_cache_get(),
+ LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF);
+ SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) {
+ const char *lv_flavor =
+ consensus_cache_entry_get_value(diff, LABEL_FLAVOR);
+ if (!lv_flavor)
+ continue;
+ int flavor = networkstatus_parse_flavor_name(lv_flavor);
+ if (flavor < 0)
+ continue;
+ const char *lv_compression =
+ consensus_cache_entry_get_value(diff, LABEL_COMPRESSION_TYPE);
+ compress_method_t method = NO_METHOD;
+ if (lv_compression) {
+ method = compression_method_get_by_name(lv_compression);
+ if (method == UNKNOWN_METHOD) {
+ continue;
+ }
+ }
+
+ uint8_t from_sha3[DIGEST256_LEN];
+ uint8_t to_sha3[DIGEST256_LEN];
+ if (cdm_entry_get_sha3_value(from_sha3, diff, LABEL_FROM_SHA3_DIGEST)<0)
+ continue;
+ if (cdm_entry_get_sha3_value(to_sha3, diff, LABEL_TARGET_SHA3_DIGEST)<0)
+ continue;
+
+ cdm_diff_ht_set_status(flavor, from_sha3, to_sha3,
+ method,
+ CDM_DIFF_PRESENT,
+ consensus_cache_entry_handle_new(diff));
+ } SMARTLIST_FOREACH_END(diff);
+ smartlist_free(diffs);
+}
+
+/**
+ * Build new diffs as needed.
+ */
+void
+consdiffmgr_rescan(void)
+{
+ if (cdm_cache_dirty == 0)
+ return;
+
+ // Clean up here to make room for new diffs, and to ensure that older
+ // consensuses do not have any entries.
+ consdiffmgr_cleanup();
+
+ if (cdm_cache_loaded == 0) {
+ consdiffmgr_diffs_load();
+ cdm_cache_loaded = 1;
+ }
+
+ for (int flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) {
+ consdiffmgr_rescan_flavor_((consensus_flavor_t) flav);
+ }
+
+ cdm_cache_dirty = 0;
+}
+
+/**
+ * Helper: compare two files by their from-valid-after and valid-after labels,
+ * trying to sort in ascending order by from-valid-after (when present) and
+ * valid-after (when not). Place everything that has neither label first in
+ * the list.
+ */
+static int
+compare_by_staleness_(const void **a, const void **b)
+{
+ const consensus_cache_entry_t *e1 = *a;
+ const consensus_cache_entry_t *e2 = *b;
+ const char *va1, *fva1, *va2, *fva2;
+ va1 = consensus_cache_entry_get_value(e1, LABEL_VALID_AFTER);
+ va2 = consensus_cache_entry_get_value(e2, LABEL_VALID_AFTER);
+ fva1 = consensus_cache_entry_get_value(e1, LABEL_FROM_VALID_AFTER);
+ fva2 = consensus_cache_entry_get_value(e2, LABEL_FROM_VALID_AFTER);
+
+ if (fva1)
+ va1 = fva1;
+ if (fva2)
+ va2 = fva2;
+
+ /* See note about iso-encoded values in compare_by_valid_after_. Also note
+ * that missing dates will get placed first. */
+ return strcmp_opt(va1, va2);
+}
+
+/** If there are not enough unused filenames to store <b>n</b> files, then
+ * delete old consensuses until there are. (We have to keep track of the
+ * number of filenames because of the way that the seccomp2 cache works.)
+ *
+ * Return 0 on success, -1 on failure.
+ **/
+static int
+consdiffmgr_ensure_space_for_files(int n)
+{
+ consensus_cache_t *cache = cdm_cache_get();
+ if (consensus_cache_get_n_filenames_available(cache) >= n) {
+ // there are already enough unused filenames.
+ return 0;
+ }
+ // Try a cheap deletion of stuff that's waiting to get deleted.
+ consensus_cache_delete_pending(cache, 0);
+ if (consensus_cache_get_n_filenames_available(cache) >= n) {
+ // okay, _that_ made enough filenames available.
+ return 0;
+ }
+ // Let's get more assertive: clean out unused stuff, and force-remove
+ // the files.
+ consdiffmgr_cleanup();
+ consensus_cache_delete_pending(cache, 1);
+ const int n_to_remove = n - consensus_cache_get_n_filenames_available(cache);
+ if (n_to_remove <= 0) {
+ // okay, finally!
+ return 0;
+ }
+
+ // At this point, we're going to have to throw out objects that will be
+ // missed. Too bad!
+ smartlist_t *objects = smartlist_new();
+ consensus_cache_find_all(objects, cache, NULL, NULL);
+ smartlist_sort(objects, compare_by_staleness_);
+ int n_marked = 0;
+ SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) {
+ consensus_cache_entry_mark_for_removal(ent);
+ if (++n_marked >= n_to_remove)
+ break;
+ } SMARTLIST_FOREACH_END(ent);
+
+ consensus_cache_delete_pending(cache, 1);
+ if (BUG(n_marked < n_to_remove))
+ return -1;
+ else
+ return 0;
+}
+
+/**
+ * Set consensus cache flags on the objects in this consdiffmgr.
+ */
+static void
+consdiffmgr_set_cache_flags(void)
+{
+ /* Right now, we just mark the consensus objects for aggressive release,
+ * so that they get mmapped for as little time as possible. */
+ smartlist_t *objects = smartlist_new();
+ consensus_cache_find_all(objects, cdm_cache_get(), LABEL_DOCTYPE,
+ DOCTYPE_CONSENSUS);
+ SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) {
+ consensus_cache_entry_mark_for_aggressive_release(ent);
+ } SMARTLIST_FOREACH_END(ent);
+ smartlist_free(objects);
+}
+
+/**
+ * Called before shutdown: drop all storage held by the consdiffmgr.c module.
+ */
+void
+consdiffmgr_free_all(void)
+{
+ cdm_diff_t **diff, **next;
+ for (diff = HT_START(cdm_diff_ht, &cdm_diff_ht); diff; diff = next) {
+ cdm_diff_t *this = *diff;
+ next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff);
+ cdm_diff_free(this);
+ }
+ consensus_cache_free(cons_diff_cache);
+ cons_diff_cache = NULL;
+}
+
+/* =====
+ Thread workers
+ =====*/
+
+typedef struct compressed_result_t {
+ config_line_t *labels;
+ /**
+ * Output: Body of the diff, as compressed.
+ */
+ uint8_t *body;
+ /**
+ * Output: length of body_out
+ */
+ size_t bodylen;
+} compressed_result_t;
+
+/**
+ * An object passed to a worker thread that will try to produce a consensus
+ * diff.
+ */
+typedef struct consensus_diff_worker_job_t {
+ /**
+ * Input: The consensus to compute the diff from. Holds a reference to the
+ * cache entry, which must not be released until the job is passed back to
+ * the main thread. The body must be mapped into memory in the main thread.
+ */
+ consensus_cache_entry_t *diff_from;
+ /**
+ * Input: The consensus to compute the diff to. Holds a reference to the
+ * cache entry, which must not be released until the job is passed back to
+ * the main thread. The body must be mapped into memory in the main thread.
+ */
+ consensus_cache_entry_t *diff_to;
+
+ /** Output: labels and bodies */
+ compressed_result_t out[ARRAY_LENGTH(compress_diffs_with)];
+} consensus_diff_worker_job_t;
+
+/** Given a consensus_cache_entry_t, check whether it has a label claiming
+ * that it was compressed. If so, uncompress its contents into <b>out</b> and
+ * set <b>outlen</b> to hold their size. If not, just copy the body into
+ * <b>out</b> and set <b>outlen</b> to its length. Return 0 on success,
+ * -1 on failure.
+ *
+ * In all cases, the output is nul-terminated. */
+STATIC int
+uncompress_or_copy(char **out, size_t *outlen,
+ consensus_cache_entry_t *ent)
+{
+ const uint8_t *body;
+ size_t bodylen;
+
+ if (consensus_cache_entry_get_body(ent, &body, &bodylen) < 0)
+ return -1;
+
+ const char *lv_compression =
+ consensus_cache_entry_get_value(ent, LABEL_COMPRESSION_TYPE);
+ compress_method_t method = NO_METHOD;
+
+ if (lv_compression)
+ method = compression_method_get_by_name(lv_compression);
+
+ return tor_uncompress(out, outlen, (const char *)body, bodylen,
+ method, 1, LOG_WARN);
+}
+
+/**
+ * Worker function. This function runs inside a worker thread and receives
+ * a consensus_diff_worker_job_t as its input.
+ */
+static workqueue_reply_t
+consensus_diff_worker_threadfn(void *state_, void *work_)
+{
+ (void)state_;
+ consensus_diff_worker_job_t *job = work_;
+ const uint8_t *diff_from, *diff_to;
+ size_t len_from, len_to;
+ int r;
+ /* We need to have the body already mapped into RAM here.
+ */
+ r = consensus_cache_entry_get_body(job->diff_from, &diff_from, &len_from);
+ if (BUG(r < 0))
+ return WQ_RPL_REPLY; // LCOV_EXCL_LINE
+ r = consensus_cache_entry_get_body(job->diff_to, &diff_to, &len_to);
+ if (BUG(r < 0))
+ return WQ_RPL_REPLY; // LCOV_EXCL_LINE
+
+ const char *lv_to_valid_after =
+ consensus_cache_entry_get_value(job->diff_to, LABEL_VALID_AFTER);
+ const char *lv_from_valid_after =
+ consensus_cache_entry_get_value(job->diff_from, LABEL_VALID_AFTER);
+ const char *lv_from_digest =
+ consensus_cache_entry_get_value(job->diff_from,
+ LABEL_SHA3_DIGEST_AS_SIGNED);
+ const char *lv_from_flavor =
+ consensus_cache_entry_get_value(job->diff_from, LABEL_FLAVOR);
+ const char *lv_to_flavor =
+ consensus_cache_entry_get_value(job->diff_to, LABEL_FLAVOR);
+ const char *lv_to_digest =
+ consensus_cache_entry_get_value(job->diff_to,
+ LABEL_SHA3_DIGEST_UNCOMPRESSED);
+
+ if (! lv_from_digest) {
+ /* This isn't a bug right now, since it can happen if you're migrating
+ * from an older version of master to a newer one. The older ones didn't
+ * annotate their stored consensus objects with sha3-digest-as-signed.
+ */
+ return WQ_RPL_REPLY; // LCOV_EXCL_LINE
+ }
+
+ /* All these values are mandatory on the input */
+ if (BUG(!lv_to_valid_after) ||
+ BUG(!lv_from_valid_after) ||
+ BUG(!lv_from_flavor) ||
+ BUG(!lv_to_flavor)) {
+ return WQ_RPL_REPLY; // LCOV_EXCL_LINE
+ }
+ /* The flavors need to match */
+ if (BUG(strcmp(lv_from_flavor, lv_to_flavor))) {
+ return WQ_RPL_REPLY; // LCOV_EXCL_LINE
+ }
+
+ char *consensus_diff;
+ {
+ char *diff_from_nt = NULL, *diff_to_nt = NULL;
+ size_t diff_from_nt_len, diff_to_nt_len;
+
+ if (uncompress_or_copy(&diff_from_nt, &diff_from_nt_len,
+ job->diff_from) < 0) {
+ return WQ_RPL_REPLY;
+ }
+ if (uncompress_or_copy(&diff_to_nt, &diff_to_nt_len,
+ job->diff_to) < 0) {
+ tor_free(diff_from_nt);
+ return WQ_RPL_REPLY;
+ }
+ tor_assert(diff_from_nt);
+ tor_assert(diff_to_nt);
+
+ // XXXX ugh; this is going to calculate the SHA3 of both its
+ // XXXX inputs again, even though we already have that. Maybe it's time
+ // XXXX to change the API here?
+ consensus_diff = consensus_diff_generate(diff_from_nt, diff_to_nt);
+ tor_free(diff_from_nt);
+ tor_free(diff_to_nt);
+ }
+ if (!consensus_diff) {
+ /* Couldn't generate consensus; we'll leave the reply blank. */
+ return WQ_RPL_REPLY;
+ }
+
+ /* Compress the results and send the reply */
+ tor_assert(compress_diffs_with[0] == NO_METHOD);
+ size_t difflen = strlen(consensus_diff);
+ job->out[0].body = (uint8_t *) consensus_diff;
+ job->out[0].bodylen = difflen;
+
+ config_line_t *common_labels = NULL;
+ cdm_labels_prepend_sha3(&common_labels,
+ LABEL_SHA3_DIGEST_UNCOMPRESSED,
+ job->out[0].body,
+ job->out[0].bodylen);
+ config_line_prepend(&common_labels, LABEL_FROM_VALID_AFTER,
+ lv_from_valid_after);
+ config_line_prepend(&common_labels, LABEL_VALID_AFTER,
+ lv_to_valid_after);
+ config_line_prepend(&common_labels, LABEL_FLAVOR, lv_from_flavor);
+ config_line_prepend(&common_labels, LABEL_FROM_SHA3_DIGEST,
+ lv_from_digest);
+ config_line_prepend(&common_labels, LABEL_TARGET_SHA3_DIGEST,
+ lv_to_digest);
+ config_line_prepend(&common_labels, LABEL_DOCTYPE,
+ DOCTYPE_CONSENSUS_DIFF);
+
+ job->out[0].labels = config_lines_dup(common_labels);
+ cdm_labels_prepend_sha3(&job->out[0].labels,
+ LABEL_SHA3_DIGEST,
+ job->out[0].body,
+ job->out[0].bodylen);
+
+ unsigned u;
+ for (u = 1; u < n_diff_compression_methods(); ++u) {
+ compress_method_t method = compress_diffs_with[u];
+ const char *methodname = compression_method_get_name(method);
+ char *result;
+ size_t sz;
+ if (0 == tor_compress(&result, &sz, consensus_diff, difflen, method)) {
+ job->out[u].body = (uint8_t*)result;
+ job->out[u].bodylen = sz;
+ job->out[u].labels = config_lines_dup(common_labels);
+ cdm_labels_prepend_sha3(&job->out[u].labels, LABEL_SHA3_DIGEST,
+ job->out[u].body,
+ job->out[u].bodylen);
+ config_line_prepend(&job->out[u].labels,
+ LABEL_COMPRESSION_TYPE,
+ methodname);
+ }
+ }
+
+ config_free_lines(common_labels);
+ return WQ_RPL_REPLY;
+}
+
+/**
+ * Helper: release all storage held in <b>job</b>.
+ */
+static void
+consensus_diff_worker_job_free(consensus_diff_worker_job_t *job)
+{
+ if (!job)
+ return;
+ unsigned u;
+ for (u = 0; u < n_diff_compression_methods(); ++u) {
+ config_free_lines(job->out[u].labels);
+ tor_free(job->out[u].body);
+ }
+ consensus_cache_entry_decref(job->diff_from);
+ consensus_cache_entry_decref(job->diff_to);
+ tor_free(job);
+}
+
+/**
+ * Worker function: This function runs in the main thread, and receives
+ * a consensus_diff_worker_job_t that the worker thread has already
+ * processed.
+ */
+static void
+consensus_diff_worker_replyfn(void *work_)
+{
+ tor_assert(in_main_thread());
+ tor_assert(work_);
+
+ consensus_diff_worker_job_t *job = work_;
+
+ const char *lv_from_digest =
+ consensus_cache_entry_get_value(job->diff_from,
+ LABEL_SHA3_DIGEST_AS_SIGNED);
+ const char *lv_to_digest =
+ consensus_cache_entry_get_value(job->diff_to,
+ LABEL_SHA3_DIGEST_UNCOMPRESSED);
+ const char *lv_flavor =
+ consensus_cache_entry_get_value(job->diff_to, LABEL_FLAVOR);
+ if (BUG(lv_from_digest == NULL))
+ lv_from_digest = "???"; // LCOV_EXCL_LINE
+ if (BUG(lv_to_digest == NULL))
+ lv_to_digest = "???"; // LCOV_EXCL_LINE
+
+ uint8_t from_sha3[DIGEST256_LEN];
+ uint8_t to_sha3[DIGEST256_LEN];
+ int flav = -1;
+ int cache = 1;
+ if (BUG(cdm_entry_get_sha3_value(from_sha3, job->diff_from,
+ LABEL_SHA3_DIGEST_AS_SIGNED) < 0))
+ cache = 0;
+ if (BUG(cdm_entry_get_sha3_value(to_sha3, job->diff_to,
+ LABEL_SHA3_DIGEST_UNCOMPRESSED) < 0))
+ cache = 0;
+ if (BUG(lv_flavor == NULL)) {
+ cache = 0;
+ } else if ((flav = networkstatus_parse_flavor_name(lv_flavor)) < 0) {
+ cache = 0;
+ }
+
+ int status = CDM_DIFF_ERROR;
+ consensus_cache_entry_handle_t *handles[ARRAY_LENGTH(compress_diffs_with)];
+ memset(handles, 0, sizeof(handles));
+
+ consdiffmgr_ensure_space_for_files(n_diff_compression_methods());
+
+ unsigned u;
+ for (u = 0; u < n_diff_compression_methods(); ++u) {
+ compress_method_t method = compress_diffs_with[u];
+ uint8_t *body_out = job->out[u].body;
+ size_t bodylen_out = job->out[u].bodylen;
+ config_line_t *labels = job->out[u].labels;
+ const char *methodname = compression_method_get_name(method);
+ if (body_out && bodylen_out && labels) {
+ /* Success! Store the results */
+ log_info(LD_DIRSERV, "Adding consensus diff from %s to %s, "
+ "compressed with %s",
+ lv_from_digest, lv_to_digest, methodname);
+
+ consensus_cache_entry_t *ent =
+ consensus_cache_add(cdm_cache_get(),
+ labels,
+ body_out,
+ bodylen_out);
+
+ status = CDM_DIFF_PRESENT;
+ handles[u] = consensus_cache_entry_handle_new(ent);
+ consensus_cache_entry_decref(ent);
+ }
+ }
+ if (status != CDM_DIFF_PRESENT) {
+ /* Failure! Nothing to do but complain */
+ log_warn(LD_DIRSERV,
+ "Worker was unable to compute consensus diff "
+ "from %s to %s", lv_from_digest, lv_to_digest);
+ /* Cache this error so we don't try to compute this one again. */
+ status = CDM_DIFF_ERROR;
+ }
+
+ for (u = 0; u < ARRAY_LENGTH(handles); ++u) {
+ compress_method_t method = compress_diffs_with[u];
+ if (cache) {
+ cdm_diff_ht_set_status(flav, from_sha3, to_sha3, method, status,
+ handles[u]);
+ } else {
+ consensus_cache_entry_handle_free(handles[u]);
+ }
+ }
+
+ consensus_diff_worker_job_free(job);
+}
+
+/**
+ * Queue the job of computing the diff from <b>diff_from</b> to <b>diff_to</b>
+ * in a worker thread.
+ */
+static int
+consensus_diff_queue_diff_work(consensus_cache_entry_t *diff_from,
+ consensus_cache_entry_t *diff_to)
+{
+ tor_assert(in_main_thread());
+
+ consensus_cache_entry_incref(diff_from);
+ consensus_cache_entry_incref(diff_to);
+
+ consensus_diff_worker_job_t *job = tor_malloc_zero(sizeof(*job));
+ job->diff_from = diff_from;
+ job->diff_to = diff_to;
+
+ /* Make sure body is mapped. */
+ const uint8_t *body;
+ size_t bodylen;
+ int r1 = consensus_cache_entry_get_body(diff_from, &body, &bodylen);
+ int r2 = consensus_cache_entry_get_body(diff_to, &body, &bodylen);
+ if (r1 < 0 || r2 < 0)
+ goto err;
+
+ workqueue_entry_t *work;
+ work = cpuworker_queue_work(consensus_diff_worker_threadfn,
+ consensus_diff_worker_replyfn,
+ job);
+ if (!work)
+ goto err;
+
+ return 0;
+ err:
+ consensus_diff_worker_job_free(job); // includes decrefs.
+ return -1;
+}
+
diff --git a/src/or/consdiffmgr.h b/src/or/consdiffmgr.h
new file mode 100644
index 0000000000..048dae432c
--- /dev/null
+++ b/src/or/consdiffmgr.h
@@ -0,0 +1,54 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_CONSDIFFMGR_H
+#define TOR_CONSDIFFMGR_H
+
+/**
+ * Possible outcomes from trying to look up a given consensus diff.
+ */
+typedef enum consdiff_status_t {
+ CONSDIFF_AVAILABLE,
+ CONSDIFF_NOT_FOUND,
+ CONSDIFF_IN_PROGRESS,
+} consdiff_status_t;
+
+typedef struct consdiff_cfg_t {
+ int32_t cache_max_age_hours;
+ int32_t cache_max_num;
+} consdiff_cfg_t;
+
+struct consensus_cache_entry_t; // from conscache.h
+
+int consdiffmgr_add_consensus(const char *consensus,
+ const networkstatus_t *as_parsed);
+
+consdiff_status_t consdiffmgr_find_diff_from(
+ struct consensus_cache_entry_t **entry_out,
+ consensus_flavor_t flavor,
+ int digest_type,
+ const uint8_t *digest,
+ size_t digestlen,
+ compress_method_t method);
+void consdiffmgr_rescan(void);
+int consdiffmgr_cleanup(void);
+void consdiffmgr_configure(const consdiff_cfg_t *cfg);
+struct sandbox_cfg_elem;
+int consdiffmgr_register_with_sandbox(struct sandbox_cfg_elem **cfg);
+void consdiffmgr_free_all(void);
+int consdiffmgr_validate(void);
+
+#ifdef CONSDIFFMGR_PRIVATE
+STATIC unsigned n_diff_compression_methods(void);
+STATIC consensus_cache_t *cdm_cache_get(void);
+STATIC consensus_cache_entry_t *cdm_cache_lookup_consensus(
+ consensus_flavor_t flavor, time_t valid_after);
+STATIC int cdm_entry_get_sha3_value(uint8_t *digest_out,
+ consensus_cache_entry_t *ent,
+ const char *label);
+STATIC int uncompress_or_copy(char **out, size_t *outlen,
+ consensus_cache_entry_t *ent);
+#endif
+
+#endif
+
diff --git a/src/or/control.c b/src/or/control.c
index 8ab31f18f7..65d29259ea 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -1873,7 +1873,7 @@ getinfo_helper_listeners(control_connection_t *control_conn,
/** Implementation helper for GETINFO: knows the answers for questions about
* directory information. */
-static int
+STATIC int
getinfo_helper_dir(control_connection_t *control_conn,
const char *question, char **answer,
const char **errmsg)
@@ -2047,6 +2047,12 @@ getinfo_helper_dir(control_connection_t *control_conn,
}
}
} else if (!strcmp(question, "network-status")) { /* v1 */
+ static int network_status_warned = 0;
+ if (!network_status_warned) {
+ log_warn(LD_CONTROL, "GETINFO network-status is deprecated; it will "
+ "go away in a future version of Tor.");
+ network_status_warned = 1;
+ }
routerlist_t *routerlist = router_get_routerlist();
if (!routerlist || !routerlist->routers ||
list_server_status_v1(routerlist->routers, answer, 1) < 0) {
@@ -2058,7 +2064,7 @@ getinfo_helper_dir(control_connection_t *control_conn,
char d[DIGEST_LEN];
signed_descriptor_t *sd = NULL;
if (base16_decode(d, sizeof(d), question, strlen(question))
- != sizeof(d)) {
+ == sizeof(d)) {
/* XXXX this test should move into extrainfo_get_by_descriptor_digest,
* but I don't want to risk affecting other parts of the code,
* especially since the rules for using our own extrainfo (including
@@ -6918,6 +6924,11 @@ get_desc_id_from_query(const rend_data_t *rend_data, const char *hsdir_fp)
goto end;
}
+ /* Without a directory fingerprint at this stage, we can't do much. */
+ if (hsdir_fp == NULL) {
+ goto end;
+ }
+
/* OK, we have an onion address so now let's find which descriptor ID
* is the one associated with the HSDir fingerprint. */
for (replica = 0; replica < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS;
@@ -7007,10 +7018,9 @@ control_event_hs_descriptor_receive_end(const char *action,
char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
const char *desc_id = NULL;
- if (!action || !id_digest || !rend_data || !onion_address) {
- log_warn(LD_BUG, "Called with action==%p, id_digest==%p, "
- "rend_data==%p, onion_address==%p", action, id_digest,
- rend_data, onion_address);
+ if (!action || !rend_data || !onion_address) {
+ log_warn(LD_BUG, "Called with action==%p, rend_data==%p, "
+ "onion_address==%p", action, rend_data, onion_address);
return;
}
@@ -7033,7 +7043,8 @@ control_event_hs_descriptor_receive_end(const char *action,
rend_hsaddress_str_or_unknown(onion_address),
rend_auth_type_to_string(
TO_REND_DATA_V2(rend_data)->auth_type),
- node_describe_longname_by_id(id_digest),
+ id_digest ?
+ node_describe_longname_by_id(id_digest) : "UNKNOWN",
desc_id_field ? desc_id_field : "",
reason_field ? reason_field : "");
@@ -7113,19 +7124,18 @@ control_event_hs_descriptor_uploaded(const char *id_digest,
id_digest, NULL);
}
-/** Send HS_DESC event to inform controller that query <b>rend_query</b>
- * failed to retrieve hidden service descriptor identified by
- * <b>id_digest</b>. If <b>reason</b> is not NULL, add it to REASON=
- * field.
+/** Send HS_DESC event to inform controller that query <b>rend_data</b>
+ * failed to retrieve hidden service descriptor from directory identified by
+ * <b>id_digest</b>. If NULL, "UNKNOWN" is used. If <b>reason</b> is not NULL,
+ * add it to REASON= field.
*/
void
control_event_hs_descriptor_failed(const rend_data_t *rend_data,
const char *id_digest,
const char *reason)
{
- if (!rend_data || !id_digest) {
- log_warn(LD_BUG, "Called with rend_data==%p, id_digest==%p",
- rend_data, id_digest);
+ if (!rend_data) {
+ log_warn(LD_BUG, "Called with rend_data==%p", rend_data);
return;
}
control_event_hs_descriptor_receive_end("FAILED",
@@ -7133,8 +7143,11 @@ control_event_hs_descriptor_failed(const rend_data_t *rend_data,
rend_data, id_digest, reason);
}
-/** send HS_DESC_CONTENT event after completion of a successful fetch from
- * hs directory. */
+/** Send HS_DESC_CONTENT event after completion of a successful fetch from hs
+ * directory. If <b>hsdir_id_digest</b> is NULL, it is replaced by "UNKNOWN".
+ * If <b>content</b> is NULL, it is replaced by an empty string. The
+ * <b>onion_address</b> or <b>desc_id</b> set to NULL will no trigger the
+ * control event. */
void
control_event_hs_descriptor_content(const char *onion_address,
const char *desc_id,
@@ -7144,9 +7157,9 @@ control_event_hs_descriptor_content(const char *onion_address,
static const char *event_name = "HS_DESC_CONTENT";
char *esc_content = NULL;
- if (!onion_address || !desc_id || !hsdir_id_digest) {
- log_warn(LD_BUG, "Called with onion_address==%p, desc_id==%p, "
- "hsdir_id_digest==%p", onion_address, desc_id, hsdir_id_digest);
+ if (!onion_address || !desc_id) {
+ log_warn(LD_BUG, "Called with onion_address==%p, desc_id==%p, ",
+ onion_address, desc_id);
return;
}
@@ -7161,7 +7174,9 @@ control_event_hs_descriptor_content(const char *onion_address,
event_name,
rend_hsaddress_str_or_unknown(onion_address),
desc_id,
- node_describe_longname_by_id(hsdir_id_digest),
+ hsdir_id_digest ?
+ node_describe_longname_by_id(hsdir_id_digest) :
+ "UNKNOWN",
esc_content);
tor_free(esc_content);
}
diff --git a/src/or/control.h b/src/or/control.h
index 16ba1ed8f0..41a194bfcb 100644
--- a/src/or/control.h
+++ b/src/or/control.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -290,6 +290,10 @@ STATIC int getinfo_helper_downloads(
control_connection_t *control_conn,
const char *question, char **answer,
const char **errmsg);
+STATIC int getinfo_helper_dir(
+ control_connection_t *control_conn,
+ const char *question, char **answer,
+ const char **errmsg);
#endif
diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c
index fd6de6ea7c..af79fafaa6 100644
--- a/src/or/cpuworker.c
+++ b/src/or/cpuworker.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -479,6 +479,20 @@ queue_pending_tasks(void)
}
}
+/** DOCDOC */
+MOCK_IMPL(workqueue_entry_t *,
+cpuworker_queue_work,(workqueue_reply_t (*fn)(void *, void *),
+ void (*reply_fn)(void *),
+ void *arg))
+{
+ tor_assert(threadpool);
+
+ return threadpool_queue_work(threadpool,
+ fn,
+ reply_fn,
+ arg);
+}
+
/** Try to tell a cpuworker to perform the public key operations necessary to
* respond to <b>onionskin</b> for the circuit <b>circ</b>.
*
diff --git a/src/or/cpuworker.h b/src/or/cpuworker.h
index 62cf0eb164..aedf2fae32 100644
--- a/src/or/cpuworker.h
+++ b/src/or/cpuworker.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -14,6 +14,12 @@
void cpu_init(void);
void cpuworkers_rotate_keyinfo(void);
+struct workqueue_entry_s;
+enum workqueue_reply_t;
+MOCK_DECL(struct workqueue_entry_s *, cpuworker_queue_work, (
+ enum workqueue_reply_t (*fn)(void *, void *),
+ void (*reply_fn)(void *),
+ void *arg));
struct create_cell_t;
int assign_onionskin_to_cpuworker(or_circuit_t *circ,
diff --git a/src/or/dircollate.c b/src/or/dircollate.c
index 033a7afe0f..172364c5f5 100644
--- a/src/or/dircollate.c
+++ b/src/or/dircollate.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/dircollate.h b/src/or/dircollate.h
index 358c730cbb..52214282b9 100644
--- a/src/or/dircollate.h
+++ b/src/or/dircollate.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/directory.c b/src/or/directory.c
index 80d3c30c63..67c28e1f3e 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define DIRECTORY_PRIVATE
@@ -13,7 +13,10 @@
#include "config.h"
#include "connection.h"
#include "connection_edge.h"
+#include "consdiff.h"
+#include "consdiffmgr.h"
#include "control.h"
+#include "compat.h"
#define DIRECTORY_PRIVATE
#include "directory.h"
#include "dirserv.h"
@@ -62,7 +65,7 @@
* multi-hop circuits for anonymity.
*
* Directory requests are launched by calling
- * directory_initiate_command_rend() or one of its numerous variants. This
+ * directory_initiate_request(). This
* launch the connection, will construct an HTTP request with
* directory_send_command(), send the and wait for a response. The client
* later handles the response with connection_dir_client_reached_eof(),
@@ -97,9 +100,8 @@
* connection_finished_connecting() in connection.c
*/
static void directory_send_command(dir_connection_t *conn,
- int purpose, int direct, const char *resource,
- const char *payload, size_t payload_len,
- time_t if_modified_since);
+ int direct,
+ const directory_request_t *request);
static int body_is_plausible(const char *body, size_t body_len, int purpose);
static char *http_get_header(const char *headers, const char *which);
static void http_set_address_origin(const char *headers, connection_t *conn);
@@ -117,22 +119,10 @@ static void dir_microdesc_download_failed(smartlist_t *failed,
int status_code);
static int client_likes_consensus(networkstatus_t *v, const char *want_url);
-static void directory_initiate_command_rend(
- const tor_addr_port_t *or_addr_port,
- const tor_addr_port_t *dir_addr_port,
- const char *digest,
- uint8_t dir_purpose,
- uint8_t router_purpose,
- dir_indirection_t indirection,
- const char *resource,
- const char *payload,
- size_t payload_len,
- time_t if_modified_since,
- const rend_data_t *rend_query,
- circuit_guard_state_t *guard_state);
-
static void connection_dir_close_consensus_fetches(
dir_connection_t *except_this_one, const char *resource);
+static void directory_request_set_guard_state(directory_request_t *req,
+ struct circuit_guard_state_t *state);
/********* START VARIABLES **********/
@@ -141,6 +131,7 @@ static void connection_dir_close_consensus_fetches(
#define ALLOW_DIRECTORY_TIME_SKEW (30*60)
#define X_ADDRESS_HEADER "X-Your-Address-Is: "
+#define X_OR_DIFF_FROM_CONSENSUS_HEADER "X-Or-Diff-From-Consensus: "
/** HTTP cache control: how long do we tell proxies they can cache each
* kind of document we serve? */
@@ -420,11 +411,14 @@ directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
} else {
indirection = DIRIND_DIRECT_CONN;
}
- directory_initiate_command_routerstatus(rs, dir_purpose,
- router_purpose,
- indirection,
- NULL, payload, upload_len, 0,
- NULL);
+
+ directory_request_t *req = directory_request_new(dir_purpose);
+ directory_request_set_routerstatus(req, rs);
+ directory_request_set_router_purpose(req, router_purpose);
+ directory_request_set_indirection(req, indirection);
+ directory_request_set_payload(req, payload, upload_len);
+ directory_initiate_request(req);
+ directory_request_free(req);
} SMARTLIST_FOREACH_END(ds);
if (!found) {
char *s = authdir_type_to_string(type);
@@ -485,6 +479,70 @@ directory_pick_generic_dirserver(dirinfo_type_t type, int pds_flags,
return rs;
}
+/**
+ * Set the extra fields in <b>req</b> that are used when requesting a
+ * consensus of type <b>resource</b>.
+ *
+ * Right now, these fields are if-modified-since and x-or-diff-from-consensus.
+ */
+static void
+dir_consensus_request_set_additional_headers(directory_request_t *req,
+ const char *resource)
+{
+ time_t if_modified_since = 0;
+ uint8_t or_diff_from[DIGEST256_LEN];
+ int or_diff_from_is_set = 0;
+
+ /* DEFAULT_IF_MODIFIED_SINCE_DELAY is 1/20 of the default consensus
+ * period of 1 hour.
+ */
+ const int DEFAULT_IF_MODIFIED_SINCE_DELAY = 180;
+
+ int flav = FLAV_NS;
+ if (resource)
+ flav = networkstatus_parse_flavor_name(resource);
+
+ if (flav != -1) {
+ /* IF we have a parsed consensus of this type, we can do an
+ * if-modified-time based on it. */
+ networkstatus_t *v;
+ v = networkstatus_get_latest_consensus_by_flavor(flav);
+ if (v) {
+ /* In networks with particularly short V3AuthVotingIntervals,
+ * ask for the consensus if it's been modified since half the
+ * V3AuthVotingInterval of the most recent consensus. */
+ time_t ims_delay = DEFAULT_IF_MODIFIED_SINCE_DELAY;
+ if (v->fresh_until > v->valid_after
+ && ims_delay > (v->fresh_until - v->valid_after)/2) {
+ ims_delay = (v->fresh_until - v->valid_after)/2;
+ }
+ if_modified_since = v->valid_after + ims_delay;
+ memcpy(or_diff_from, v->digest_sha3_as_signed, DIGEST256_LEN);
+ or_diff_from_is_set = 1;
+ }
+ } else {
+ /* Otherwise it might be a consensus we don't parse, but which we
+ * do cache. Look at the cached copy, perhaps. */
+ cached_dir_t *cd = dirserv_get_consensus(resource);
+ /* We have no method of determining the voting interval from an
+ * unparsed consensus, so we use the default. */
+ if (cd) {
+ if_modified_since = cd->published + DEFAULT_IF_MODIFIED_SINCE_DELAY;
+ memcpy(or_diff_from, cd->digest_sha3_as_signed, DIGEST256_LEN);
+ or_diff_from_is_set = 1;
+ }
+ }
+
+ if (if_modified_since > 0)
+ directory_request_set_if_modified_since(req, if_modified_since);
+ if (or_diff_from_is_set) {
+ char hex[HEX_DIGEST256_LEN + 1];
+ base16_encode(hex, sizeof(hex),
+ (const char*)or_diff_from, sizeof(or_diff_from));
+ directory_request_add_header(req, X_OR_DIFF_FROM_CONSENSUS_HEADER, hex);
+ }
+}
+
/** Start a connection to a random running directory server, using
* connection purpose <b>dir_purpose</b>, intending to fetch descriptors
* of purpose <b>router_purpose</b>, and requesting <b>resource</b>.
@@ -506,47 +564,10 @@ MOCK_IMPL(void, directory_get_from_dirserver, (
int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose,
resource);
dirinfo_type_t type = dir_fetch_type(dir_purpose, router_purpose, resource);
- time_t if_modified_since = 0;
if (type == NO_DIRINFO)
return;
- if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) {
- int flav = FLAV_NS;
- networkstatus_t *v;
- if (resource)
- flav = networkstatus_parse_flavor_name(resource);
-
- /* DEFAULT_IF_MODIFIED_SINCE_DELAY is 1/20 of the default consensus
- * period of 1 hour.
- */
-#define DEFAULT_IF_MODIFIED_SINCE_DELAY (180)
- if (flav != -1) {
- /* IF we have a parsed consensus of this type, we can do an
- * if-modified-time based on it. */
- v = networkstatus_get_latest_consensus_by_flavor(flav);
- if (v) {
- /* In networks with particularly short V3AuthVotingIntervals,
- * ask for the consensus if it's been modified since half the
- * V3AuthVotingInterval of the most recent consensus. */
- time_t ims_delay = DEFAULT_IF_MODIFIED_SINCE_DELAY;
- if (v->fresh_until > v->valid_after
- && ims_delay > (v->fresh_until - v->valid_after)/2) {
- ims_delay = (v->fresh_until - v->valid_after)/2;
- }
- if_modified_since = v->valid_after + ims_delay;
- }
- } else {
- /* Otherwise it might be a consensus we don't parse, but which we
- * do cache. Look at the cached copy, perhaps. */
- cached_dir_t *cd = dirserv_get_consensus(resource);
- /* We have no method of determining the voting interval from an
- * unparsed consensus, so we use the default. */
- if (cd)
- if_modified_since = cd->published + DEFAULT_IF_MODIFIED_SINCE_DELAY;
- }
- }
-
if (!options->FetchServerDescriptors)
return;
@@ -565,20 +586,20 @@ MOCK_IMPL(void, directory_get_from_dirserver, (
routerinfo_t *ri = node->ri;
/* clients always make OR connections to bridges */
tor_addr_port_t or_ap;
- tor_addr_port_t nil_dir_ap;
+ directory_request_t *req = directory_request_new(dir_purpose);
/* we are willing to use a non-preferred address if we need to */
fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0,
&or_ap);
- tor_addr_make_null(&nil_dir_ap.addr, AF_INET);
- nil_dir_ap.port = 0;
- directory_initiate_command_rend(&or_ap,
- &nil_dir_ap,
- ri->cache_info.identity_digest,
- dir_purpose,
- router_purpose,
- DIRIND_ONEHOP,
- resource, NULL, 0, if_modified_since,
- NULL, guard_state);
+ directory_request_set_or_addr_port(req, &or_ap);
+ directory_request_set_directory_id_digest(req,
+ ri->cache_info.identity_digest);
+ directory_request_set_router_purpose(req, router_purpose);
+ directory_request_set_resource(req, resource);
+ if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS)
+ dir_consensus_request_set_additional_headers(req, resource);
+ directory_request_set_guard_state(req, guard_state);
+ directory_initiate_request(req);
+ directory_request_free(req);
} else {
if (guard_state) {
entry_guard_cancel(&guard_state);
@@ -638,12 +659,17 @@ MOCK_IMPL(void, directory_get_from_dirserver, (
if (rs) {
const dir_indirection_t indirection =
get_via_tor ? DIRIND_ANONYMOUS : DIRIND_ONEHOP;
- directory_initiate_command_routerstatus(rs, dir_purpose,
- router_purpose,
- indirection,
- resource, NULL, 0,
- if_modified_since,
- guard_state);
+ directory_request_t *req = directory_request_new(dir_purpose);
+ directory_request_set_routerstatus(req, rs);
+ directory_request_set_router_purpose(req, router_purpose);
+ directory_request_set_indirection(req, indirection);
+ directory_request_set_resource(req, resource);
+ if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS)
+ dir_consensus_request_set_additional_headers(req, resource);
+ if (guard_state)
+ directory_request_set_guard_state(req, guard_state);
+ directory_initiate_request(req);
+ directory_request_free(req);
} else {
log_notice(LD_DIR,
"While fetching directory info, "
@@ -669,15 +695,17 @@ directory_get_from_all_authorities(uint8_t dir_purpose,
SMARTLIST_FOREACH_BEGIN(router_get_trusted_dir_servers(),
dir_server_t *, ds) {
- routerstatus_t *rs;
if (router_digest_is_me(ds->digest))
continue;
if (!(ds->type & V3_DIRINFO))
continue;
- rs = &ds->fake_status;
- directory_initiate_command_routerstatus(rs, dir_purpose, router_purpose,
- DIRIND_ONEHOP, resource, NULL,
- 0, 0, NULL);
+ const routerstatus_t *rs = &ds->fake_status;
+ directory_request_t *req = directory_request_new(dir_purpose);
+ directory_request_set_routerstatus(req, rs);
+ directory_request_set_router_purpose(req, router_purpose);
+ directory_request_set_resource(req, resource);
+ directory_initiate_request(req);
+ directory_request_free(req);
} SMARTLIST_FOREACH_END(ds);
}
@@ -777,110 +805,6 @@ directory_choose_address_routerstatus(const routerstatus_t *status,
return 0;
}
-/** Same as directory_initiate_command_routerstatus(), but accepts
- * rendezvous data to fetch a hidden service descriptor. */
-void
-directory_initiate_command_routerstatus_rend(const routerstatus_t *status,
- uint8_t dir_purpose,
- uint8_t router_purpose,
- dir_indirection_t indirection,
- const char *resource,
- const char *payload,
- size_t payload_len,
- time_t if_modified_since,
- const rend_data_t *rend_query,
- circuit_guard_state_t *guard_state)
-{
- const or_options_t *options = get_options();
- const node_t *node;
- tor_addr_port_t use_or_ap, use_dir_ap;
- const int anonymized_connection = dirind_is_anon(indirection);
-
- tor_assert(status != NULL);
-
- node = node_get_by_id(status->identity_digest);
-
- /* XXX The below check is wrong: !node means it's not in the consensus,
- * but we haven't checked if we have a descriptor for it -- and also,
- * we only care about the descriptor if it's a begindir-style anonymized
- * connection. */
- if (!node && anonymized_connection) {
- log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we "
- "don't have its router descriptor.",
- routerstatus_describe(status));
- return;
- }
-
- if (options->ExcludeNodes && options->StrictNodes &&
- routerset_contains_routerstatus(options->ExcludeNodes, status, -1)) {
- log_warn(LD_DIR, "Wanted to contact directory mirror %s for %s, but "
- "it's in our ExcludedNodes list and StrictNodes is set. "
- "Skipping. This choice might make your Tor not work.",
- routerstatus_describe(status),
- dir_conn_purpose_to_string(dir_purpose));
- return;
- }
-
- /* At this point, if we are a client making a direct connection to a
- * directory server, we have selected a server that has at least one address
- * allowed by ClientUseIPv4/6 and Reachable{"",OR,Dir}Addresses. This
- * selection uses the preference in ClientPreferIPv6{OR,Dir}Port, if
- * possible. (If UseBridges is set, clients always use IPv6, and prefer it
- * by default.)
- *
- * Now choose an address that we can use to connect to the directory server.
- */
- if (directory_choose_address_routerstatus(status, indirection, &use_or_ap,
- &use_dir_ap) < 0) {
- return;
- }
-
- /* We don't retry the alternate OR/Dir address for the same directory if
- * the address we choose fails (#6772).
- * Instead, we'll retry another directory on failure. */
-
- directory_initiate_command_rend(&use_or_ap, &use_dir_ap,
- status->identity_digest,
- dir_purpose, router_purpose,
- indirection, resource,
- payload, payload_len, if_modified_since,
- rend_query,
- guard_state);
-}
-
-/** Launch a new connection to the directory server <b>status</b> to
- * upload or download a server or rendezvous
- * descriptor. <b>dir_purpose</b> determines what
- * kind of directory connection we're launching, and must be one of
- * DIR_PURPOSE_{FETCH|UPLOAD}_{DIR|RENDDESC_V2}. <b>router_purpose</b>
- * specifies the descriptor purposes we have in mind (currently only
- * used for FETCH_DIR).
- *
- * When uploading, <b>payload</b> and <b>payload_len</b> determine the content
- * of the HTTP post. Otherwise, <b>payload</b> should be NULL.
- *
- * When fetching a rendezvous descriptor, <b>resource</b> is the service ID we
- * want to fetch.
- */
-MOCK_IMPL(void, directory_initiate_command_routerstatus,
- (const routerstatus_t *status,
- uint8_t dir_purpose,
- uint8_t router_purpose,
- dir_indirection_t indirection,
- const char *resource,
- const char *payload,
- size_t payload_len,
- time_t if_modified_since,
- circuit_guard_state_t *guard_state))
-{
- directory_initiate_command_routerstatus_rend(status, dir_purpose,
- router_purpose,
- indirection, resource,
- payload, payload_len,
- if_modified_since, NULL,
- guard_state);
-}
-
/** Return true iff <b>conn</b> is the client side of a directory connection
* we launched to ourself in order to determine the reachability of our
* dir_port. */
@@ -1064,8 +988,50 @@ directory_must_use_begindir(const or_options_t *options)
return !public_server_mode(options);
}
+struct directory_request_t {
+ /**
+ * These fields specify which directory we're contacting. Routerstatus,
+ * if present, overrides the other fields.
+ *
+ * @{ */
+ tor_addr_port_t or_addr_port;
+ tor_addr_port_t dir_addr_port;
+ char digest[DIGEST_LEN];
+
+ const routerstatus_t *routerstatus;
+ /** @} */
+ /** One of DIR_PURPOSE_* other than DIR_PURPOSE_SERVER. Describes what
+ * kind of operation we'll be doing (upload/download), and of what kind
+ * of document. */
+ uint8_t dir_purpose;
+ /** One of ROUTER_PURPOSE_*; used for uploads and downloads of routerinfo
+ * and extrainfo docs. */
+ uint8_t router_purpose;
+ /** Enum: determines whether to anonymize, and whether to use dirport or
+ * orport. */
+ dir_indirection_t indirection;
+ /** Alias to the variable part of the URL for this request */
+ const char *resource;
+ /** Alias to the payload to upload (if any) */
+ const char *payload;
+ /** Number of bytes to upload from payload</b> */
+ size_t payload_len;
+ /** Value to send in an if-modified-since header, or 0 for none. */
+ time_t if_modified_since;
+ /** Hidden-service-specific information */
+ const rend_data_t *rend_query;
+ /** Extra headers to append to the request */
+ config_line_t *additional_headers;
+ /** */
+ /** Used internally to directory.c: gets informed when the attempt to
+ * connect to the directory succeeds or fails, if that attempt bears on the
+ * directory's usability as a directory guard. */
+ circuit_guard_state_t *guard_state;
+};
+
/** Evaluate the situation and decide if we should use an encrypted
* "begindir-style" connection for this directory request.
+ * 0) If there is no DirPort, yes.
* 1) If or_port is 0, or it's a direct conn and or_port is firewalled
* or we're a dir mirror, no.
* 2) If we prefer to avoid begindir conns, and we're not fetching or
@@ -1076,15 +1042,24 @@ directory_must_use_begindir(const or_options_t *options)
*/
static int
directory_command_should_use_begindir(const or_options_t *options,
- const tor_addr_t *addr,
- int or_port, uint8_t router_purpose,
- dir_indirection_t indirection,
+ const directory_request_t *req,
const char **reason)
{
- (void) router_purpose;
+ const tor_addr_t *or_addr = &req->or_addr_port.addr;
+ //const tor_addr_t *dir_addr = &req->dir_addr_port.addr;
+ const int or_port = req->or_addr_port.port;
+ const int dir_port = req->dir_addr_port.port;
+
+ const dir_indirection_t indirection = req->indirection;
+
tor_assert(reason);
*reason = NULL;
+ /* Reasons why we must use begindir */
+ if (!dir_port) {
+ *reason = "(using begindir - directory with no DirPort)";
+ return 1; /* We don't know a DirPort -- must begindir. */
+ }
/* Reasons why we can't possibly use begindir */
if (!or_port) {
*reason = "directory with unknown ORPort";
@@ -1097,7 +1072,7 @@ directory_command_should_use_begindir(const or_options_t *options,
}
if (indirection == DIRIND_ONEHOP) {
/* We're firewalled and want a direct OR connection */
- if (!fascist_firewall_allows_address_addr(addr, or_port,
+ if (!fascist_firewall_allows_address_addr(or_addr, or_port,
FIREWALL_OR_CONNECTION, 0, 0)) {
*reason = "ORPort not reachable";
return 0;
@@ -1116,68 +1091,290 @@ directory_command_should_use_begindir(const or_options_t *options,
return 1;
}
-/** Helper for directory_initiate_command_rend: send the
- * command to a server whose OR address/port is <b>or_addr</b>/<b>or_port</b>,
- * whose directory address/port is <b>dir_addr</b>/<b>dir_port</b>, whose
- * identity key digest is <b>digest</b>, with purposes <b>dir_purpose</b> and
- * <b>router_purpose</b>, making an (in)direct connection as specified in
- * <b>indirection</b>, with command <b>resource</b>, <b>payload</b> of
- * <b>payload_len</b>, and asking for a result only <b>if_modified_since</b>.
+/**
+ * Create and return a new directory_request_t with purpose
+ * <b>dir_purpose</b>.
+ */
+directory_request_t *
+directory_request_new(uint8_t dir_purpose)
+{
+ tor_assert(dir_purpose >= DIR_PURPOSE_MIN_);
+ tor_assert(dir_purpose <= DIR_PURPOSE_MAX_);
+ tor_assert(dir_purpose != DIR_PURPOSE_SERVER);
+ tor_assert(dir_purpose != DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2);
+
+ directory_request_t *result = tor_malloc_zero(sizeof(*result));
+ tor_addr_make_null(&result->or_addr_port.addr, AF_INET);
+ result->or_addr_port.port = 0;
+ tor_addr_make_null(&result->dir_addr_port.addr, AF_INET);
+ result->dir_addr_port.port = 0;
+ result->dir_purpose = dir_purpose;
+ result->router_purpose = ROUTER_PURPOSE_GENERAL;
+ result->indirection = DIRIND_ONEHOP;
+ return result;
+}
+/**
+ * Release all resources held by <b>req</b>.
+ */
+void
+directory_request_free(directory_request_t *req)
+{
+ if (req == NULL)
+ return;
+ config_free_lines(req->additional_headers);
+ tor_free(req);
+}
+/**
+ * Set the address and OR port to use for this directory request. If there is
+ * no OR port, we'll have to connect over the dirport. (If there are both,
+ * the indirection setting determins which to use.)
+ */
+void
+directory_request_set_or_addr_port(directory_request_t *req,
+ const tor_addr_port_t *p)
+{
+ memcpy(&req->or_addr_port, p, sizeof(*p));
+}
+/**
+ * Set the address and dirport to use for this directory request. If there
+ * is no dirport, we'll have to connect over the OR port. (If there are both,
+ * the indirection setting determins which to use.)
+ */
+void
+directory_request_set_dir_addr_port(directory_request_t *req,
+ const tor_addr_port_t *p)
+{
+ memcpy(&req->dir_addr_port, p, sizeof(*p));
+}
+/**
+ * Set the RSA identity digest of the directory to use for this directory
+ * request.
*/
void
-directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port,
- const tor_addr_t *dir_addr, uint16_t dir_port,
- const char *digest,
- uint8_t dir_purpose, uint8_t router_purpose,
- dir_indirection_t indirection, const char *resource,
- const char *payload, size_t payload_len,
- time_t if_modified_since)
+directory_request_set_directory_id_digest(directory_request_t *req,
+ const char *digest)
{
- tor_addr_port_t or_ap, dir_ap;
+ memcpy(req->digest, digest, DIGEST_LEN);
+}
+/**
+ * Set the router purpose associated with uploaded and downloaded router
+ * descriptors and extrainfo documents in this directory request. The purpose
+ * must be one of ROUTER_PURPOSE_GENERAL (the default) or
+ * ROUTER_PURPOSE_BRIDGE.
+ */
+void
+directory_request_set_router_purpose(directory_request_t *req,
+ uint8_t router_purpose)
+{
+ tor_assert(router_purpose == ROUTER_PURPOSE_GENERAL ||
+ router_purpose == ROUTER_PURPOSE_BRIDGE);
+ // assert that it actually makes sense to set this purpose, given
+ // the dir_purpose.
+ req->router_purpose = router_purpose;
+}
+/**
+ * Set the indirection to be used for the directory request. The indirection
+ * parameter configures whether to connect to a DirPort or ORPort, and whether
+ * to anonymize the connection. DIRIND_ONEHOP (use ORPort, don't anonymize)
+ * is the default. See dir_indirection_t for more information.
+ */
+void
+directory_request_set_indirection(directory_request_t *req,
+ dir_indirection_t indirection)
+{
+ req->indirection = indirection;
+}
- /* Use the null tor_addr and 0 port if the address or port isn't valid. */
- if (tor_addr_port_is_valid(or_addr, or_port, 0)) {
- tor_addr_copy(&or_ap.addr, or_addr);
- or_ap.port = or_port;
- } else {
- /* the family doesn't matter here, so make it IPv4 */
- tor_addr_make_null(&or_ap.addr, AF_INET);
- or_ap.port = or_port = 0;
+/**
+ * Set a pointer to the resource to request from a directory. Different
+ * request types use resources to indicate different components of their URL.
+ * Note that only an alias to <b>resource</b> is stored, so the
+ * <b>resource</b> must outlive the request.
+ */
+void
+directory_request_set_resource(directory_request_t *req,
+ const char *resource)
+{
+ req->resource = resource;
+}
+/**
+ * Set a pointer to the payload to include with this directory request, along
+ * with its length. Note that only an alias to <b>payload</b> is stored, so
+ * the <b>payload</b> must outlive the request.
+ */
+void
+directory_request_set_payload(directory_request_t *req,
+ const char *payload,
+ size_t payload_len)
+{
+ tor_assert(DIR_PURPOSE_IS_UPLOAD(req->dir_purpose));
+
+ req->payload = payload;
+ req->payload_len = payload_len;
+}
+/**
+ * Set an if-modified-since date to send along with the request. The
+ * default is 0 (meaning, send no if-modified-since header).
+ */
+void
+directory_request_set_if_modified_since(directory_request_t *req,
+ time_t if_modified_since)
+{
+ req->if_modified_since = if_modified_since;
+}
+
+/** Include a header of name <b>key</b> with content <b>val</b> in the
+ * request. Neither may include newlines or other odd characters. Their
+ * ordering is not currently guaranteed.
+ *
+ * Note that, as elsewhere in this module, header keys include a trailing
+ * colon and space.
+ */
+void
+directory_request_add_header(directory_request_t *req,
+ const char *key,
+ const char *val)
+{
+ config_line_prepend(&req->additional_headers, key, val);
+}
+/**
+ * Set an object containing HS data to be associated with this request. Note
+ * that only an alias to <b>query</b> is stored, so the <b>query</b> object
+ * must outlive the request.
+ */
+void
+directory_request_set_rend_query(directory_request_t *req,
+ const rend_data_t *query)
+{
+ if (query) {
+ tor_assert(req->dir_purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 ||
+ req->dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2);
}
+ req->rend_query = query;
+}
+/** Set a static circuit_guard_state_t object to affliate with the request in
+ * <b>req</b>. This object will receive notification when the attempt to
+ * connect to the guard either succeeds or fails. */
+static void
+directory_request_set_guard_state(directory_request_t *req,
+ circuit_guard_state_t *state)
+{
+ req->guard_state = state;
+}
- if (tor_addr_port_is_valid(dir_addr, dir_port, 0)) {
- tor_addr_copy(&dir_ap.addr, dir_addr);
- dir_ap.port = dir_port;
- } else {
- /* the family doesn't matter here, so make it IPv4 */
- tor_addr_make_null(&dir_ap.addr, AF_INET);
- dir_ap.port = dir_port = 0;
+/**
+ * Internal: Return true if any information for contacting the directory in
+ * <b>req</b> has been set, other than by the routerstatus. */
+static int
+directory_request_dir_contact_info_specified(const directory_request_t *req)
+{
+ /* We only check for ports here, since we don't use an addr unless the port
+ * is set */
+ return (req->or_addr_port.port ||
+ req->dir_addr_port.port ||
+ ! tor_digest_is_zero(req->digest));
+}
+
+/**
+ * Set the routerstatus to use for the directory associated with this
+ * request. If this option is set, then no other function to set the
+ * directory's address or identity should be called.
+ */
+void
+directory_request_set_routerstatus(directory_request_t *req,
+ const routerstatus_t *status)
+{
+ req->routerstatus = status;
+}
+/**
+ * Helper: update the addresses, ports, and identities in <b>req</b>
+ * from the routerstatus object in <b>req</b>. Return 0 on success.
+ * On failure, warn and return -1.
+ */
+static int
+directory_request_set_dir_from_routerstatus(directory_request_t *req)
+
+{
+ const routerstatus_t *status = req->routerstatus;
+ if (BUG(status == NULL))
+ return -1;
+ const or_options_t *options = get_options();
+ const node_t *node;
+ tor_addr_port_t use_or_ap, use_dir_ap;
+ const int anonymized_connection = dirind_is_anon(req->indirection);
+
+ tor_assert(status != NULL);
+
+ node = node_get_by_id(status->identity_digest);
+
+ /* XXX The below check is wrong: !node means it's not in the consensus,
+ * but we haven't checked if we have a descriptor for it -- and also,
+ * we only care about the descriptor if it's a begindir-style anonymized
+ * connection. */
+ if (!node && anonymized_connection) {
+ log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we "
+ "don't have its router descriptor.",
+ routerstatus_describe(status));
+ return -1;
}
- directory_initiate_command_rend(&or_ap, &dir_ap,
- digest, dir_purpose,
- router_purpose, indirection,
- resource, payload, payload_len,
- if_modified_since, NULL, NULL);
+ if (options->ExcludeNodes && options->StrictNodes &&
+ routerset_contains_routerstatus(options->ExcludeNodes, status, -1)) {
+ log_warn(LD_DIR, "Wanted to contact directory mirror %s for %s, but "
+ "it's in our ExcludedNodes list and StrictNodes is set. "
+ "Skipping. This choice might make your Tor not work.",
+ routerstatus_describe(status),
+ dir_conn_purpose_to_string(req->dir_purpose));
+ return -1;
+ }
+
+ /* At this point, if we are a client making a direct connection to a
+ * directory server, we have selected a server that has at least one address
+ * allowed by ClientUseIPv4/6 and Reachable{"",OR,Dir}Addresses. This
+ * selection uses the preference in ClientPreferIPv6{OR,Dir}Port, if
+ * possible. (If UseBridges is set, clients always use IPv6, and prefer it
+ * by default.)
+ *
+ * Now choose an address that we can use to connect to the directory server.
+ */
+ if (directory_choose_address_routerstatus(status,
+ req->indirection, &use_or_ap,
+ &use_dir_ap) < 0) {
+ return -1;
+ }
+
+ directory_request_set_or_addr_port(req, &use_or_ap);
+ directory_request_set_dir_addr_port(req, &use_dir_ap);
+ directory_request_set_directory_id_digest(req, status->identity_digest);
+ return 0;
}
-/** Same as directory_initiate_command(), but accepts rendezvous data to
- * fetch a hidden service descriptor, and takes its address & port arguments
- * as tor_addr_port_t. */
-static void
-directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
- const tor_addr_port_t *dir_addr_port,
- const char *digest,
- uint8_t dir_purpose, uint8_t router_purpose,
- dir_indirection_t indirection,
- const char *resource,
- const char *payload, size_t payload_len,
- time_t if_modified_since,
- const rend_data_t *rend_query,
- circuit_guard_state_t *guard_state)
+/**
+ * Launch the provided directory request, configured in <b>request</b>.
+ * After this function is called, you can free <b>request</b>.
+ */
+MOCK_IMPL(void,
+directory_initiate_request,(directory_request_t *request))
{
- tor_assert(or_addr_port);
- tor_assert(dir_addr_port);
+ tor_assert(request);
+ if (request->routerstatus) {
+ tor_assert_nonfatal(
+ ! directory_request_dir_contact_info_specified(request));
+ if (directory_request_set_dir_from_routerstatus(request) < 0) {
+ return;
+ }
+ }
+
+ const tor_addr_port_t *or_addr_port = &request->or_addr_port;
+ const tor_addr_port_t *dir_addr_port = &request->dir_addr_port;
+ const char *digest = request->digest;
+ const uint8_t dir_purpose = request->dir_purpose;
+ const uint8_t router_purpose = request->router_purpose;
+ const dir_indirection_t indirection = request->indirection;
+ const char *resource = request->resource;
+ const rend_data_t *rend_query = request->rend_query;
+ circuit_guard_state_t *guard_state = request->guard_state;
+
tor_assert(or_addr_port->port || dir_addr_port->port);
tor_assert(digest);
@@ -1187,10 +1384,9 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
const char *begindir_reason = NULL;
/* Should the connection be to a relay's OR port (and inside that we will
* send our directory request)? */
- const int use_begindir = directory_command_should_use_begindir(options,
- &or_addr_port->addr, or_addr_port->port,
- router_purpose, indirection,
- &begindir_reason);
+ const int use_begindir =
+ directory_command_should_use_begindir(options, request, &begindir_reason);
+
/* Will the connection go via a three-hop Tor circuit? Note that this
* is separate from whether it will use_begindir. */
const int anonymized_connection = dirind_is_anon(indirection);
@@ -1235,9 +1431,9 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
if (!port || tor_addr_is_null(&addr)) {
static int logged_backtrace = 0;
log_warn(LD_DIR,
- "Cannot make an outgoing %sconnection without %sPort.",
+ "Cannot make an outgoing %sconnection without a remote %sPort.",
use_begindir ? "begindir " : "",
- use_begindir ? "an OR" : "a Dir");
+ use_begindir ? "OR" : "Dir");
if (!logged_backtrace) {
log_backtrace(LOG_INFO, LD_BUG, "Address came from");
logged_backtrace = 1;
@@ -1291,9 +1487,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
/* fall through */
case 0:
/* queue the command on the outbuf */
- directory_send_command(conn, dir_purpose, 1, resource,
- payload, payload_len,
- if_modified_since);
+ directory_send_command(conn, 1, request);
connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT);
/* writable indicates finish, readable indicates broken link,
error indicates broken link in windowsland. */
@@ -1347,9 +1541,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
}
conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING;
/* queue the command on the outbuf */
- directory_send_command(conn, dir_purpose, 0, resource,
- payload, payload_len,
- if_modified_since);
+ directory_send_command(conn, 0, request);
connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT);
connection_start_reading(ENTRY_TO_CONN(linked_conn));
@@ -1359,7 +1551,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
/** Return true iff anything we say on <b>conn</b> is being encrypted before
* we send it to the client/server. */
int
-connection_dir_is_encrypted(dir_connection_t *conn)
+connection_dir_is_encrypted(const dir_connection_t *conn)
{
/* Right now it's sufficient to see if conn is or has been linked, since
* the only thing it could be linked to is an edge connection on a
@@ -1452,15 +1644,22 @@ copy_ipv6_address(char* destination, const char* source, size_t len,
}
}
-/** Queue an appropriate HTTP command on conn-\>outbuf. The other args
- * are as in directory_initiate_command().
+/** Queue an appropriate HTTP command for <b>request</b> on
+ * <b>conn</b>-\>outbuf. If <b>direct</b> is true, we're making a
+ * non-anonymized connection to the dirport.
*/
static void
directory_send_command(dir_connection_t *conn,
- int purpose, int direct, const char *resource,
- const char *payload, size_t payload_len,
- time_t if_modified_since)
+ const int direct,
+ const directory_request_t *req)
{
+ tor_assert(req);
+ const int purpose = req->dir_purpose;
+ const char *resource = req->resource;
+ const char *payload = req->payload;
+ const size_t payload_len = req->payload_len;
+ const time_t if_modified_since = req->if_modified_since;
+
char proxystring[256];
char hoststring[128];
/* NEEDS to be the same size hoststring.
@@ -1468,7 +1667,9 @@ directory_send_command(dir_connection_t *conn,
char decorated_address[128];
smartlist_t *headers = smartlist_new();
char *url;
+ size_t url_len;
char request[8192];
+ size_t request_len, total_request_len = 0;
const char *httpcommand = NULL;
tor_assert(conn);
@@ -1522,6 +1723,14 @@ directory_send_command(dir_connection_t *conn,
proxystring[0] = 0;
}
+ /* Add additional headers, if any */
+ {
+ config_line_t *h;
+ for (h = req->additional_headers; h; h = h->next) {
+ smartlist_add_asprintf(headers, "%s%s\r\n", h->key, h->value);
+ }
+ }
+
switch (purpose) {
case DIR_PURPOSE_FETCH_CONSENSUS:
/* resource is optional. If present, it's a flavor name */
@@ -1614,8 +1823,14 @@ directory_send_command(dir_connection_t *conn,
}
tor_snprintf(request, sizeof(request), "%s %s", httpcommand, proxystring);
- connection_write_to_buf(request, strlen(request), TO_CONN(conn));
- connection_write_to_buf(url, strlen(url), TO_CONN(conn));
+
+ request_len = strlen(request);
+ total_request_len += request_len;
+ connection_write_to_buf(request, request_len, TO_CONN(conn));
+
+ url_len = strlen(url);
+ total_request_len += url_len;
+ connection_write_to_buf(url, url_len, TO_CONN(conn));
tor_free(url);
if (!strcmp(httpcommand, "POST") || payload) {
@@ -1630,15 +1845,27 @@ directory_send_command(dir_connection_t *conn,
tor_free(header);
}
- connection_write_to_buf(request, strlen(request), TO_CONN(conn));
+ request_len = strlen(request);
+ total_request_len += request_len;
+ connection_write_to_buf(request, request_len, TO_CONN(conn));
if (payload) {
/* then send the payload afterwards too */
connection_write_to_buf(payload, payload_len, TO_CONN(conn));
+ total_request_len += payload_len;
}
SMARTLIST_FOREACH(headers, char *, h, tor_free(h));
smartlist_free(headers);
+
+ log_debug(LD_DIR,
+ "Sent request to directory server '%s:%d': "
+ "(purpose: %d, request size: " U64_FORMAT ", "
+ "payload size: " U64_FORMAT ")",
+ conn->base_.address, conn->base_.port,
+ conn->base_.purpose,
+ U64_PRINTF_ARG(total_request_len),
+ U64_PRINTF_ARG(payload ? payload_len : 0));
}
/** Parse an HTTP request string <b>headers</b> of the form
@@ -1905,6 +2132,39 @@ load_downloaded_routers(const char *body, smartlist_t *which,
return added;
}
+/** A structure to hold arguments passed into each directory response
+ * handler */
+typedef struct response_handler_args_t {
+ int status_code;
+ const char *reason;
+ const char *body;
+ size_t body_len;
+ const char *headers;
+} response_handler_args_t;
+
+static int handle_response_fetch_consensus(dir_connection_t *,
+ const response_handler_args_t *);
+static int handle_response_fetch_certificate(dir_connection_t *,
+ const response_handler_args_t *);
+static int handle_response_fetch_status_vote(dir_connection_t *,
+ const response_handler_args_t *);
+static int handle_response_fetch_detached_signatures(dir_connection_t *,
+ const response_handler_args_t *);
+static int handle_response_fetch_desc(dir_connection_t *,
+ const response_handler_args_t *);
+static int handle_response_fetch_microdesc(dir_connection_t *,
+ const response_handler_args_t *);
+static int handle_response_upload_dir(dir_connection_t *,
+ const response_handler_args_t *);
+static int handle_response_upload_vote(dir_connection_t *,
+ const response_handler_args_t *);
+static int handle_response_upload_signatures(dir_connection_t *,
+ const response_handler_args_t *);
+static int handle_response_fetch_renddesc_v2(dir_connection_t *,
+ const response_handler_args_t *);
+static int handle_response_upload_renddesc_v2(dir_connection_t *,
+ const response_handler_args_t *);
+
/** We are a client, and we've finished reading the server's
* response. Parse it and act appropriately.
*
@@ -1930,8 +2190,9 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
int allow_partial = (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC ||
conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO ||
conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC);
- time_t now = time(NULL);
- int src_code;
+ size_t received_bytes;
+
+ received_bytes = connection_get_inbuf_len(TO_CONN(conn));
switch (connection_fetch_from_buf_http(TO_CONN(conn),
&headers, MAX_HEADERS_SIZE,
@@ -1958,12 +2219,20 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
}
if (!reason) reason = tor_strdup("[no reason given]");
- log_debug(LD_DIR,
+ tor_log(LOG_DEBUG, LD_DIR,
"Received response from directory server '%s:%d': %d %s "
- "(purpose: %d)",
+ "(purpose: %d, response size: " U64_FORMAT
+#ifdef MEASUREMENTS_21206
+ ", data cells received: %d, data cells sent: %d"
+#endif
+ ", compression: %d)",
conn->base_.address, conn->base_.port, status_code,
- escaped(reason),
- conn->base_.purpose);
+ escaped(reason), conn->base_.purpose,
+ U64_PRINTF_ARG(received_bytes),
+#ifdef MEASUREMENTS_21206
+ conn->data_cells_received, conn->data_cells_sent,
+#endif
+ compression);
if (conn->guard_state) {
/* we count the connection as successful once we can read from it. We do
@@ -2014,6 +2283,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
"'%s:%d'. I'll try again soon.",
status_code, escaped(reason), conn->base_.address,
conn->base_.port);
+ time_t now = approx_time();
if ((rs = router_get_mutable_consensus_status_by_id(id_digest)))
rs->last_dir_503_at = now;
if ((ds = router_get_fallback_dirserver_by_digest(id_digest)))
@@ -2056,15 +2326,15 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
}
/* Try declared compression first if we can. */
if (compression == GZIP_METHOD || compression == ZLIB_METHOD)
- tor_gzip_uncompress(&new_body, &new_len, body, body_len, compression,
- !allow_partial, LOG_PROTOCOL_WARN);
+ tor_uncompress(&new_body, &new_len, body, body_len, compression,
+ !allow_partial, LOG_PROTOCOL_WARN);
/* Okay, if that didn't work, and we think that it was compressed
* differently, try that. */
if (!new_body &&
(guessed == GZIP_METHOD || guessed == ZLIB_METHOD) &&
compression != guessed)
- tor_gzip_uncompress(&new_body, &new_len, body, body_len, guessed,
- !allow_partial, LOG_PROTOCOL_WARN);
+ tor_uncompress(&new_body, &new_len, body, body_len, guessed,
+ !allow_partial, LOG_PROTOCOL_WARN);
/* If we're pretty sure that we have a compressed directory, and
* we didn't manage to uncompress it, then warn and bail. */
if (!plausible && !new_body) {
@@ -2081,473 +2351,735 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
}
}
- if (conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS) {
- int r;
- const char *flavname = conn->requested_resource;
- if (status_code != 200) {
- int severity = (status_code == 304) ? LOG_INFO : LOG_WARN;
- tor_log(severity, LD_DIR,
- "Received http status code %d (%s) from server "
- "'%s:%d' while fetching consensus directory.",
- status_code, escaped(reason), conn->base_.address,
- conn->base_.port);
- tor_free(body); tor_free(headers); tor_free(reason);
- networkstatus_consensus_download_failed(status_code, flavname);
- return -1;
+ int rv;
+ response_handler_args_t args;
+ memset(&args, 0, sizeof(args));
+ args.status_code = status_code;
+ args.reason = reason;
+ args.body = body;
+ args.body_len = body_len;
+ args.headers = headers;
+
+ switch (conn->base_.purpose) {
+ case DIR_PURPOSE_FETCH_CONSENSUS:
+ rv = handle_response_fetch_consensus(conn, &args);
+ break;
+ case DIR_PURPOSE_FETCH_CERTIFICATE:
+ rv = handle_response_fetch_certificate(conn, &args);
+ break;
+ case DIR_PURPOSE_FETCH_STATUS_VOTE:
+ rv = handle_response_fetch_status_vote(conn, &args);
+ break;
+ case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES:
+ rv = handle_response_fetch_detached_signatures(conn, &args);
+ break;
+ case DIR_PURPOSE_FETCH_SERVERDESC:
+ case DIR_PURPOSE_FETCH_EXTRAINFO:
+ rv = handle_response_fetch_desc(conn, &args);
+ break;
+ case DIR_PURPOSE_FETCH_MICRODESC:
+ rv = handle_response_fetch_microdesc(conn, &args);
+ break;
+ case DIR_PURPOSE_FETCH_RENDDESC_V2:
+ rv = handle_response_fetch_renddesc_v2(conn, &args);
+ break;
+ case DIR_PURPOSE_UPLOAD_DIR:
+ rv = handle_response_upload_dir(conn, &args);
+ break;
+ case DIR_PURPOSE_UPLOAD_SIGNATURES:
+ rv = handle_response_upload_signatures(conn, &args);
+ break;
+ case DIR_PURPOSE_UPLOAD_VOTE:
+ rv = handle_response_upload_vote(conn, &args);
+ break;
+ case DIR_PURPOSE_UPLOAD_RENDDESC_V2:
+ rv = handle_response_upload_renddesc_v2(conn, &args);
+ break;
+ default:
+ tor_assert_nonfatal_unreached();
+ rv = -1;
+ break;
+ }
+ tor_free(body);
+ tor_free(headers);
+ tor_free(reason);
+ return rv;
+}
+
+/**
+ * Handler function: processes a response to a request for a networkstatus
+ * consensus document by checking the consensus, storing it, and marking
+ * router requests as reachable.
+ **/
+static int
+handle_response_fetch_consensus(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS);
+ const int status_code = args->status_code;
+ const char *body = args->body;
+ const size_t body_len = args->body_len;
+ const char *reason = args->reason;
+ const time_t now = approx_time();
+
+ const char *consensus;
+ char *new_consensus = NULL;
+ const char *sourcename;
+
+ int r;
+ const char *flavname = conn->requested_resource;
+ if (status_code != 200) {
+ int severity = (status_code == 304) ? LOG_INFO : LOG_WARN;
+ tor_log(severity, LD_DIR,
+ "Received http status code %d (%s) from server "
+ "'%s:%d' while fetching consensus directory.",
+ status_code, escaped(reason), conn->base_.address,
+ conn->base_.port);
+ networkstatus_consensus_download_failed(status_code, flavname);
+ return -1;
+ }
+
+ if (looks_like_a_consensus_diff(body, body_len)) {
+ /* First find our previous consensus. Maybe it's in ram, maybe not. */
+ cached_dir_t *cd = dirserv_get_consensus(flavname);
+ const char *consensus_body;
+ char *owned_consensus = NULL;
+ if (cd) {
+ consensus_body = cd->dir;
+ } else {
+ owned_consensus = networkstatus_read_cached_consensus(flavname);
+ consensus_body = owned_consensus;
}
- log_info(LD_DIR,"Received consensus directory (size %d) from server "
- "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port);
- if ((r=networkstatus_set_current_consensus(body, flavname, 0,
- conn->identity_digest))<0) {
- log_fn(r<-1?LOG_WARN:LOG_INFO, LD_DIR,
- "Unable to load %s consensus directory downloaded from "
- "server '%s:%d'. I'll try again soon.",
- flavname, conn->base_.address, conn->base_.port);
- tor_free(body); tor_free(headers); tor_free(reason);
+ if (!consensus_body) {
+ log_warn(LD_DIR, "Received a consensus diff, but we can't find "
+ "any %s-flavored consensus in our current cache.",flavname);
networkstatus_consensus_download_failed(0, flavname);
+ // XXXX if this happens too much, see below
return -1;
}
- /* If we launched other fetches for this consensus, cancel them. */
- connection_dir_close_consensus_fetches(conn, flavname);
-
- /* launches router downloads as needed */
- routers_update_all_from_networkstatus(now, 3);
- update_microdescs_from_networkstatus(now);
- update_microdesc_downloads(now);
- directory_info_has_arrived(now, 0, 0);
- if (authdir_mode_v3(get_options())) {
- sr_act_post_consensus(
- networkstatus_get_latest_consensus_by_flavor(FLAV_NS));
- }
- log_info(LD_DIR, "Successfully loaded consensus.");
- }
-
- if (conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE) {
- if (status_code != 200) {
- log_warn(LD_DIR,
- "Received http status code %d (%s) from server "
- "'%s:%d' while fetching \"/tor/keys/%s\".",
- status_code, escaped(reason), conn->base_.address,
- conn->base_.port, conn->requested_resource);
- connection_dir_download_cert_failed(conn, status_code);
- tor_free(body); tor_free(headers); tor_free(reason);
+ new_consensus = consensus_diff_apply(consensus_body, body);
+ tor_free(owned_consensus);
+ if (new_consensus == NULL) {
+ log_warn(LD_DIR, "Could not apply consensus diff received from server "
+ "'%s:%d'", conn->base_.address, conn->base_.port);
+ // XXXX If this happens too many times, we should maybe not use
+ // XXXX this directory for diffs any more?
+ networkstatus_consensus_download_failed(0, flavname);
return -1;
}
- log_info(LD_DIR,"Received authority certificates (size %d) from server "
+ log_info(LD_DIR, "Applied consensus diff (size %d) from server "
+ "'%s:%d', resulting in a new consensus document (size %d).",
+ (int)body_len, conn->base_.address, conn->base_.port,
+ (int)strlen(new_consensus));
+ consensus = new_consensus;
+ sourcename = "generated based on a diff";
+ } else {
+ log_info(LD_DIR,"Received consensus directory (body size %d) from server "
"'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port);
+ consensus = body;
+ sourcename = "downloaded";
+ }
+
+ if ((r=networkstatus_set_current_consensus(consensus, flavname, 0,
+ conn->identity_digest))<0) {
+ log_fn(r<-1?LOG_WARN:LOG_INFO, LD_DIR,
+ "Unable to load %s consensus directory %s from "
+ "server '%s:%d'. I'll try again soon.",
+ flavname, sourcename, conn->base_.address, conn->base_.port);
+ networkstatus_consensus_download_failed(0, flavname);
+ tor_free(new_consensus);
+ return -1;
+ }
- /*
- * Tell trusted_dirs_load_certs_from_string() whether it was by fp
- * or fp-sk pair.
- */
- src_code = -1;
- if (!strcmpstart(conn->requested_resource, "fp/")) {
- src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST;
- } else if (!strcmpstart(conn->requested_resource, "fp-sk/")) {
- src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_SK_DIGEST;
- }
+ /* If we launched other fetches for this consensus, cancel them. */
+ connection_dir_close_consensus_fetches(conn, flavname);
- if (src_code != -1) {
- if (trusted_dirs_load_certs_from_string(body, src_code, 1,
- conn->identity_digest)<0) {
- log_warn(LD_DIR, "Unable to parse fetched certificates");
- /* if we fetched more than one and only some failed, the successful
- * ones got flushed to disk so it's safe to call this on them */
- connection_dir_download_cert_failed(conn, status_code);
- } else {
- directory_info_has_arrived(now, 0, 0);
- log_info(LD_DIR, "Successfully loaded certificates from fetch.");
- }
- } else {
- log_warn(LD_DIR,
- "Couldn't figure out what to do with fetched certificates for "
- "unknown resource %s",
- conn->requested_resource);
+ /* launches router downloads as needed */
+ routers_update_all_from_networkstatus(now, 3);
+ update_microdescs_from_networkstatus(now);
+ update_microdesc_downloads(now);
+ directory_info_has_arrived(now, 0, 0);
+ if (authdir_mode_v3(get_options())) {
+ sr_act_post_consensus(
+ networkstatus_get_latest_consensus_by_flavor(FLAV_NS));
+ }
+ log_info(LD_DIR, "Successfully loaded consensus.");
+
+ tor_free(new_consensus);
+ return 0;
+}
+
+/**
+ * Handler function: processes a response to a request for one or more
+ * authority certificates
+ **/
+static int
+handle_response_fetch_certificate(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE);
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+ const char *body = args->body;
+ const size_t body_len = args->body_len;
+
+ if (status_code != 200) {
+ log_warn(LD_DIR,
+ "Received http status code %d (%s) from server "
+ "'%s:%d' while fetching \"/tor/keys/%s\".",
+ status_code, escaped(reason), conn->base_.address,
+ conn->base_.port, conn->requested_resource);
+ connection_dir_download_cert_failed(conn, status_code);
+ return -1;
+ }
+ log_info(LD_DIR,"Received authority certificates (body size %d) from "
+ "server '%s:%d'",
+ (int)body_len, conn->base_.address, conn->base_.port);
+
+ /*
+ * Tell trusted_dirs_load_certs_from_string() whether it was by fp
+ * or fp-sk pair.
+ */
+ int src_code = -1;
+ if (!strcmpstart(conn->requested_resource, "fp/")) {
+ src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST;
+ } else if (!strcmpstart(conn->requested_resource, "fp-sk/")) {
+ src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_SK_DIGEST;
+ }
+
+ if (src_code != -1) {
+ if (trusted_dirs_load_certs_from_string(body, src_code, 1,
+ conn->identity_digest)<0) {
+ log_warn(LD_DIR, "Unable to parse fetched certificates");
+ /* if we fetched more than one and only some failed, the successful
+ * ones got flushed to disk so it's safe to call this on them */
connection_dir_download_cert_failed(conn, status_code);
+ } else {
+ time_t now = approx_time();
+ directory_info_has_arrived(now, 0, 0);
+ log_info(LD_DIR, "Successfully loaded certificates from fetch.");
}
+ } else {
+ log_warn(LD_DIR,
+ "Couldn't figure out what to do with fetched certificates for "
+ "unknown resource %s",
+ conn->requested_resource);
+ connection_dir_download_cert_failed(conn, status_code);
}
- if (conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) {
- const char *msg;
- int st;
- log_info(LD_DIR,"Got votes (size %d) from server %s:%d",
- (int)body_len, conn->base_.address, conn->base_.port);
- if (status_code != 200) {
- log_warn(LD_DIR,
+ return 0;
+}
+
+/**
+ * Handler function: processes a response to a request for an authority's
+ * current networkstatus vote.
+ **/
+static int
+handle_response_fetch_status_vote(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE);
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+ const char *body = args->body;
+ const size_t body_len = args->body_len;
+
+ const char *msg;
+ int st;
+ log_info(LD_DIR,"Got votes (body size %d) from server %s:%d",
+ (int)body_len, conn->base_.address, conn->base_.port);
+ if (status_code != 200) {
+ log_warn(LD_DIR,
"Received http status code %d (%s) from server "
"'%s:%d' while fetching \"/tor/status-vote/next/%s.z\".",
status_code, escaped(reason), conn->base_.address,
conn->base_.port, conn->requested_resource);
- tor_free(body); tor_free(headers); tor_free(reason);
- return -1;
- }
- dirvote_add_vote(body, &msg, &st);
- if (st > 299) {
- log_warn(LD_DIR, "Error adding retrieved vote: %s", msg);
- } else {
- log_info(LD_DIR, "Added vote(s) successfully [msg: %s]", msg);
- }
+ return -1;
}
- if (conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES) {
- const char *msg = NULL;
- log_info(LD_DIR,"Got detached signatures (size %d) from server %s:%d",
- (int)body_len, conn->base_.address, conn->base_.port);
- if (status_code != 200) {
- log_warn(LD_DIR,
+ dirvote_add_vote(body, &msg, &st);
+ if (st > 299) {
+ log_warn(LD_DIR, "Error adding retrieved vote: %s", msg);
+ } else {
+ log_info(LD_DIR, "Added vote(s) successfully [msg: %s]", msg);
+ }
+
+ return 0;
+}
+
+/**
+ * Handler function: processes a response to a request for the signatures
+ * that an authority knows about on a given consensus.
+ **/
+static int
+handle_response_fetch_detached_signatures(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES);
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+ const char *body = args->body;
+ const size_t body_len = args->body_len;
+
+ const char *msg = NULL;
+ log_info(LD_DIR,"Got detached signatures (body size %d) from server %s:%d",
+ (int)body_len, conn->base_.address, conn->base_.port);
+ if (status_code != 200) {
+ log_warn(LD_DIR,
"Received http status code %d (%s) from server '%s:%d' while fetching "
"\"/tor/status-vote/next/consensus-signatures.z\".",
- status_code, escaped(reason), conn->base_.address,
- conn->base_.port);
- tor_free(body); tor_free(headers); tor_free(reason);
- return -1;
- }
- if (dirvote_add_signatures(body, conn->base_.address, &msg)<0) {
- log_warn(LD_DIR, "Problem adding detached signatures from %s:%d: %s",
- conn->base_.address, conn->base_.port, msg?msg:"???");
- }
+ status_code, escaped(reason), conn->base_.address,
+ conn->base_.port);
+ return -1;
+ }
+ if (dirvote_add_signatures(body, conn->base_.address, &msg)<0) {
+ log_warn(LD_DIR, "Problem adding detached signatures from %s:%d: %s",
+ conn->base_.address, conn->base_.port, msg?msg:"???");
}
- if (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC ||
- conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO) {
- int was_ei = conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO;
- smartlist_t *which = NULL;
- int n_asked_for = 0;
- int descriptor_digests = conn->requested_resource &&
- !strcmpstart(conn->requested_resource,"d/");
- log_info(LD_DIR,"Received %s (size %d) from server '%s:%d'",
- was_ei ? "extra server info" : "server info",
- (int)body_len, conn->base_.address, conn->base_.port);
- if (conn->requested_resource &&
- (!strcmpstart(conn->requested_resource,"d/") ||
- !strcmpstart(conn->requested_resource,"fp/"))) {
- which = smartlist_new();
- dir_split_resource_into_fingerprints(conn->requested_resource +
- (descriptor_digests ? 2 : 3),
- which, NULL, 0);
- n_asked_for = smartlist_len(which);
- }
- if (status_code != 200) {
- int dir_okay = status_code == 404 ||
- (status_code == 400 && !strcmp(reason, "Servers unavailable."));
- /* 404 means that it didn't have them; no big deal.
- * Older (pre-0.1.1.8) servers said 400 Servers unavailable instead. */
- log_fn(dir_okay ? LOG_INFO : LOG_WARN, LD_DIR,
- "Received http status code %d (%s) from server '%s:%d' "
- "while fetching \"/tor/server/%s\". I'll try again soon.",
- status_code, escaped(reason), conn->base_.address,
- conn->base_.port, conn->requested_resource);
- if (!which) {
- connection_dir_download_routerdesc_failed(conn);
- } else {
- dir_routerdesc_download_failed(which, status_code,
- conn->router_purpose,
- was_ei, descriptor_digests);
- SMARTLIST_FOREACH(which, char *, cp, tor_free(cp));
- smartlist_free(which);
- }
- tor_free(body); tor_free(headers); tor_free(reason);
- return dir_okay ? 0 : -1;
- }
- /* Learn the routers, assuming we requested by fingerprint or "all"
- * or "authority".
- *
- * We use "authority" to fetch our own descriptor for
- * testing, and to fetch bridge descriptors for bootstrapping. Ignore
- * the output of "authority" requests unless we are using bridges,
- * since otherwise they'll be the response from reachability tests,
- * and we don't really want to add that to our routerlist. */
- if (which || (conn->requested_resource &&
- (!strcmpstart(conn->requested_resource, "all") ||
- (!strcmpstart(conn->requested_resource, "authority") &&
- get_options()->UseBridges)))) {
- /* as we learn from them, we remove them from 'which' */
- if (was_ei) {
- router_load_extrainfo_from_string(body, NULL, SAVED_NOWHERE, which,
- descriptor_digests);
- } else {
- //router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which,
- // descriptor_digests, conn->router_purpose);
- if (load_downloaded_routers(body, which, descriptor_digests,
- conn->router_purpose,
- conn->base_.address))
- directory_info_has_arrived(now, 0, 0);
- }
- }
- if (which) { /* mark remaining ones as failed */
- log_info(LD_DIR, "Received %d/%d %s requested from %s:%d",
- n_asked_for-smartlist_len(which), n_asked_for,
- was_ei ? "extra-info documents" : "router descriptors",
- conn->base_.address, (int)conn->base_.port);
- if (smartlist_len(which)) {
- dir_routerdesc_download_failed(which, status_code,
- conn->router_purpose,
- was_ei, descriptor_digests);
- }
- SMARTLIST_FOREACH(which, char *, cp, tor_free(cp));
- smartlist_free(which);
- }
- if (directory_conn_is_self_reachability_test(conn))
- router_dirport_found_reachable();
- }
- if (conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC) {
- smartlist_t *which = NULL;
- log_info(LD_DIR,"Received answer to microdescriptor request (status %d, "
- "size %d) from server '%s:%d'",
- status_code, (int)body_len, conn->base_.address,
- conn->base_.port);
- tor_assert(conn->requested_resource &&
- !strcmpstart(conn->requested_resource, "d/"));
+ return 0;
+}
+
+/**
+ * Handler function: processes a response to a request for a group of server
+ * descriptors or an extrainfo documents.
+ **/
+static int
+handle_response_fetch_desc(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC ||
+ conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO);
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+ const char *body = args->body;
+ const size_t body_len = args->body_len;
+
+ int was_ei = conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO;
+ smartlist_t *which = NULL;
+ int n_asked_for = 0;
+ int descriptor_digests = conn->requested_resource &&
+ !strcmpstart(conn->requested_resource,"d/");
+ log_info(LD_DIR,"Received %s (body size %d) from server '%s:%d'",
+ was_ei ? "extra server info" : "server info",
+ (int)body_len, conn->base_.address, conn->base_.port);
+ if (conn->requested_resource &&
+ (!strcmpstart(conn->requested_resource,"d/") ||
+ !strcmpstart(conn->requested_resource,"fp/"))) {
which = smartlist_new();
- dir_split_resource_into_fingerprints(conn->requested_resource+2,
- which, NULL,
- DSR_DIGEST256|DSR_BASE64);
- if (status_code != 200) {
- log_info(LD_DIR, "Received status code %d (%s) from server "
- "'%s:%d' while fetching \"/tor/micro/%s\". I'll try again "
- "soon.",
- status_code, escaped(reason), conn->base_.address,
- (int)conn->base_.port, conn->requested_resource);
- dir_microdesc_download_failed(which, status_code);
+ dir_split_resource_into_fingerprints(conn->requested_resource +
+ (descriptor_digests ? 2 : 3),
+ which, NULL, 0);
+ n_asked_for = smartlist_len(which);
+ }
+ if (status_code != 200) {
+ int dir_okay = status_code == 404 ||
+ (status_code == 400 && !strcmp(reason, "Servers unavailable."));
+ /* 404 means that it didn't have them; no big deal.
+ * Older (pre-0.1.1.8) servers said 400 Servers unavailable instead. */
+ log_fn(dir_okay ? LOG_INFO : LOG_WARN, LD_DIR,
+ "Received http status code %d (%s) from server '%s:%d' "
+ "while fetching \"/tor/server/%s\". I'll try again soon.",
+ status_code, escaped(reason), conn->base_.address,
+ conn->base_.port, conn->requested_resource);
+ if (!which) {
+ connection_dir_download_routerdesc_failed(conn);
+ } else {
+ dir_routerdesc_download_failed(which, status_code,
+ conn->router_purpose,
+ was_ei, descriptor_digests);
SMARTLIST_FOREACH(which, char *, cp, tor_free(cp));
smartlist_free(which);
- tor_free(body); tor_free(headers); tor_free(reason);
- return 0;
+ }
+ return dir_okay ? 0 : -1;
+ }
+ /* Learn the routers, assuming we requested by fingerprint or "all"
+ * or "authority".
+ *
+ * We use "authority" to fetch our own descriptor for
+ * testing, and to fetch bridge descriptors for bootstrapping. Ignore
+ * the output of "authority" requests unless we are using bridges,
+ * since otherwise they'll be the response from reachability tests,
+ * and we don't really want to add that to our routerlist. */
+ if (which || (conn->requested_resource &&
+ (!strcmpstart(conn->requested_resource, "all") ||
+ (!strcmpstart(conn->requested_resource, "authority") &&
+ get_options()->UseBridges)))) {
+ /* as we learn from them, we remove them from 'which' */
+ if (was_ei) {
+ router_load_extrainfo_from_string(body, NULL, SAVED_NOWHERE, which,
+ descriptor_digests);
} else {
- smartlist_t *mds;
- mds = microdescs_add_to_cache(get_microdesc_cache(),
- body, body+body_len, SAVED_NOWHERE, 0,
- now, which);
- if (smartlist_len(which)) {
- /* Mark remaining ones as failed. */
- dir_microdesc_download_failed(which, status_code);
- }
- if (mds && smartlist_len(mds)) {
- control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS,
- count_loading_descriptors_progress());
- directory_info_has_arrived(now, 0, 1);
+ //router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which,
+ // descriptor_digests, conn->router_purpose);
+ if (load_downloaded_routers(body, which, descriptor_digests,
+ conn->router_purpose,
+ conn->base_.address)) {
+ time_t now = approx_time();
+ directory_info_has_arrived(now, 0, 0);
}
- SMARTLIST_FOREACH(which, char *, cp, tor_free(cp));
- smartlist_free(which);
- smartlist_free(mds);
}
}
+ if (which) { /* mark remaining ones as failed */
+ log_info(LD_DIR, "Received %d/%d %s requested from %s:%d",
+ n_asked_for-smartlist_len(which), n_asked_for,
+ was_ei ? "extra-info documents" : "router descriptors",
+ conn->base_.address, (int)conn->base_.port);
+ if (smartlist_len(which)) {
+ dir_routerdesc_download_failed(which, status_code,
+ conn->router_purpose,
+ was_ei, descriptor_digests);
+ }
+ SMARTLIST_FOREACH(which, char *, cp, tor_free(cp));
+ smartlist_free(which);
+ }
+ if (directory_conn_is_self_reachability_test(conn))
+ router_dirport_found_reachable();
- if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_DIR) {
- switch (status_code) {
- case 200: {
- dir_server_t *ds =
- router_get_trusteddirserver_by_digest(conn->identity_digest);
- char *rejected_hdr = http_get_header(headers,
- "X-Descriptor-Not-New: ");
- if (rejected_hdr) {
- if (!strcmp(rejected_hdr, "Yes")) {
- log_info(LD_GENERAL,
- "Authority '%s' declined our descriptor (not new)",
- ds->nickname);
- /* XXXX use this information; be sure to upload next one
- * sooner. -NM */
- /* XXXX++ On further thought, the task above implies that we're
- * basing our regenerate-descriptor time on when we uploaded the
- * last descriptor, not on the published time of the last
- * descriptor. If those are different, that's a bad thing to
- * do. -NM */
- }
- tor_free(rejected_hdr);
- }
- log_info(LD_GENERAL,"eof (status 200) after uploading server "
- "descriptor: finished.");
- control_event_server_status(
- LOG_NOTICE, "ACCEPTED_SERVER_DESCRIPTOR DIRAUTH=%s:%d",
- conn->base_.address, conn->base_.port);
-
- ds->has_accepted_serverdesc = 1;
- if (directories_have_accepted_server_descriptor())
- control_event_server_status(LOG_NOTICE, "GOOD_SERVER_DESCRIPTOR");
- }
- break;
- case 400:
- log_warn(LD_GENERAL,"http status 400 (%s) response from "
- "dirserver '%s:%d'. Please correct.",
- escaped(reason), conn->base_.address, conn->base_.port);
- control_event_server_status(LOG_WARN,
- "BAD_SERVER_DESCRIPTOR DIRAUTH=%s:%d REASON=\"%s\"",
- conn->base_.address, conn->base_.port, escaped(reason));
- break;
- default:
- log_warn(LD_GENERAL,
+ return 0;
+}
+
+/**
+ * Handler function: processes a response to a request for a group of
+ * microdescriptors
+ **/
+static int
+handle_response_fetch_microdesc(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC);
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+ const char *body = args->body;
+ const size_t body_len = args->body_len;
+
+ smartlist_t *which = NULL;
+ log_info(LD_DIR,"Received answer to microdescriptor request (status %d, "
+ "body size %d) from server '%s:%d'",
+ status_code, (int)body_len, conn->base_.address,
+ conn->base_.port);
+ tor_assert(conn->requested_resource &&
+ !strcmpstart(conn->requested_resource, "d/"));
+ which = smartlist_new();
+ dir_split_resource_into_fingerprints(conn->requested_resource+2,
+ which, NULL,
+ DSR_DIGEST256|DSR_BASE64);
+ if (status_code != 200) {
+ log_info(LD_DIR, "Received status code %d (%s) from server "
+ "'%s:%d' while fetching \"/tor/micro/%s\". I'll try again "
+ "soon.",
+ status_code, escaped(reason), conn->base_.address,
+ (int)conn->base_.port, conn->requested_resource);
+ dir_microdesc_download_failed(which, status_code);
+ SMARTLIST_FOREACH(which, char *, cp, tor_free(cp));
+ smartlist_free(which);
+ return 0;
+ } else {
+ smartlist_t *mds;
+ time_t now = approx_time();
+ mds = microdescs_add_to_cache(get_microdesc_cache(),
+ body, body+body_len, SAVED_NOWHERE, 0,
+ now, which);
+ if (smartlist_len(which)) {
+ /* Mark remaining ones as failed. */
+ dir_microdesc_download_failed(which, status_code);
+ }
+ if (mds && smartlist_len(mds)) {
+ control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS,
+ count_loading_descriptors_progress());
+ directory_info_has_arrived(now, 0, 1);
+ }
+ SMARTLIST_FOREACH(which, char *, cp, tor_free(cp));
+ smartlist_free(which);
+ smartlist_free(mds);
+ }
+
+ return 0;
+}
+
+/**
+ * Handler function: processes a response to a POST request to upload our
+ * router descriptor.
+ **/
+static int
+handle_response_upload_dir(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_DIR);
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+ const char *headers = args->headers;
+
+ switch (status_code) {
+ case 200: {
+ dir_server_t *ds =
+ router_get_trusteddirserver_by_digest(conn->identity_digest);
+ char *rejected_hdr = http_get_header(headers,
+ "X-Descriptor-Not-New: ");
+ if (rejected_hdr) {
+ if (!strcmp(rejected_hdr, "Yes")) {
+ log_info(LD_GENERAL,
+ "Authority '%s' declined our descriptor (not new)",
+ ds->nickname);
+ /* XXXX use this information; be sure to upload next one
+ * sooner. -NM */
+ /* XXXX++ On further thought, the task above implies that we're
+ * basing our regenerate-descriptor time on when we uploaded the
+ * last descriptor, not on the published time of the last
+ * descriptor. If those are different, that's a bad thing to
+ * do. -NM */
+ }
+ tor_free(rejected_hdr);
+ }
+ log_info(LD_GENERAL,"eof (status 200) after uploading server "
+ "descriptor: finished.");
+ control_event_server_status(
+ LOG_NOTICE, "ACCEPTED_SERVER_DESCRIPTOR DIRAUTH=%s:%d",
+ conn->base_.address, conn->base_.port);
+
+ ds->has_accepted_serverdesc = 1;
+ if (directories_have_accepted_server_descriptor())
+ control_event_server_status(LOG_NOTICE, "GOOD_SERVER_DESCRIPTOR");
+ }
+ break;
+ case 400:
+ log_warn(LD_GENERAL,"http status 400 (%s) response from "
+ "dirserver '%s:%d'. Please correct.",
+ escaped(reason), conn->base_.address, conn->base_.port);
+ control_event_server_status(LOG_WARN,
+ "BAD_SERVER_DESCRIPTOR DIRAUTH=%s:%d REASON=\"%s\"",
+ conn->base_.address, conn->base_.port, escaped(reason));
+ break;
+ default:
+ log_warn(LD_GENERAL,
"http status %d (%s) reason unexpected while uploading "
"descriptor to server '%s:%d').",
status_code, escaped(reason), conn->base_.address,
conn->base_.port);
- break;
- }
- /* return 0 in all cases, since we don't want to mark any
- * dirservers down just because they don't like us. */
+ break;
}
+ /* return 0 in all cases, since we don't want to mark any
+ * dirservers down just because they don't like us. */
- if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_VOTE) {
- switch (status_code) {
- case 200: {
- log_notice(LD_DIR,"Uploaded a vote to dirserver %s:%d",
- conn->base_.address, conn->base_.port);
- }
- break;
- case 400:
- log_warn(LD_DIR,"http status 400 (%s) response after uploading "
- "vote to dirserver '%s:%d'. Please correct.",
- escaped(reason), conn->base_.address, conn->base_.port);
- break;
- default:
- log_warn(LD_GENERAL,
+ return 0;
+}
+
+/**
+ * Handler function: processes a response to POST request to upload our
+ * own networkstatus vote.
+ **/
+static int
+handle_response_upload_vote(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_VOTE);
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+
+ switch (status_code) {
+ case 200: {
+ log_notice(LD_DIR,"Uploaded a vote to dirserver %s:%d",
+ conn->base_.address, conn->base_.port);
+ }
+ break;
+ case 400:
+ log_warn(LD_DIR,"http status 400 (%s) response after uploading "
+ "vote to dirserver '%s:%d'. Please correct.",
+ escaped(reason), conn->base_.address, conn->base_.port);
+ break;
+ default:
+ log_warn(LD_GENERAL,
"http status %d (%s) reason unexpected while uploading "
"vote to server '%s:%d').",
status_code, escaped(reason), conn->base_.address,
conn->base_.port);
- break;
- }
- /* return 0 in all cases, since we don't want to mark any
- * dirservers down just because they don't like us. */
+ break;
}
+ /* return 0 in all cases, since we don't want to mark any
+ * dirservers down just because they don't like us. */
+ return 0;
+}
- if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_SIGNATURES) {
- switch (status_code) {
- case 200: {
- log_notice(LD_DIR,"Uploaded signature(s) to dirserver %s:%d",
- conn->base_.address, conn->base_.port);
- }
- break;
- case 400:
- log_warn(LD_DIR,"http status 400 (%s) response after uploading "
- "signatures to dirserver '%s:%d'. Please correct.",
- escaped(reason), conn->base_.address, conn->base_.port);
- break;
- default:
- log_warn(LD_GENERAL,
+/**
+ * Handler function: processes a response to POST request to upload our
+ * view of the signatures on the current consensus.
+ **/
+static int
+handle_response_upload_signatures(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_SIGNATURES);
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+
+ switch (status_code) {
+ case 200: {
+ log_notice(LD_DIR,"Uploaded signature(s) to dirserver %s:%d",
+ conn->base_.address, conn->base_.port);
+ }
+ break;
+ case 400:
+ log_warn(LD_DIR,"http status 400 (%s) response after uploading "
+ "signatures to dirserver '%s:%d'. Please correct.",
+ escaped(reason), conn->base_.address, conn->base_.port);
+ break;
+ default:
+ log_warn(LD_GENERAL,
"http status %d (%s) reason unexpected while uploading "
"signatures to server '%s:%d').",
status_code, escaped(reason), conn->base_.address,
conn->base_.port);
- break;
- }
- /* return 0 in all cases, since we don't want to mark any
- * dirservers down just because they don't like us. */
- }
-
- if (conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) {
- #define SEND_HS_DESC_FAILED_EVENT(reason) ( \
- control_event_hs_descriptor_failed(conn->rend_data, \
- conn->identity_digest, \
- reason) )
- #define SEND_HS_DESC_FAILED_CONTENT() ( \
- control_event_hs_descriptor_content(rend_data_get_address(conn->rend_data), \
- conn->requested_resource, \
+ break;
+ }
+ /* return 0 in all cases, since we don't want to mark any
+ * dirservers down just because they don't like us. */
+
+ return 0;
+}
+
+/**
+ * Handler function: processes a response to a request for a v2 hidden service
+ * descriptor.
+ **/
+static int
+handle_response_fetch_renddesc_v2(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2);
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+ const char *body = args->body;
+ const size_t body_len = args->body_len;
+
+#define SEND_HS_DESC_FAILED_EVENT(reason) \
+ (control_event_hs_descriptor_failed(conn->rend_data, \
conn->identity_digest, \
- NULL) )
- tor_assert(conn->rend_data);
- log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d "
- "(%s))",
- (int)body_len, status_code, escaped(reason));
- switch (status_code) {
- case 200:
- {
- rend_cache_entry_t *entry = NULL;
-
- if (rend_cache_store_v2_desc_as_client(body,
- conn->requested_resource, conn->rend_data, &entry) < 0) {
- log_warn(LD_REND,"Fetching v2 rendezvous descriptor failed. "
- "Retrying at another directory.");
- /* We'll retry when connection_about_to_close_connection()
- * cleans this dir conn up. */
- SEND_HS_DESC_FAILED_EVENT("BAD_DESC");
- SEND_HS_DESC_FAILED_CONTENT();
- } else {
- char service_id[REND_SERVICE_ID_LEN_BASE32 + 1];
- /* Should never be NULL here if we found the descriptor. */
- tor_assert(entry);
- rend_get_service_id(entry->parsed->pk, service_id);
-
- /* success. notify pending connections about this. */
- log_info(LD_REND, "Successfully fetched v2 rendezvous "
- "descriptor.");
- control_event_hs_descriptor_received(service_id,
- conn->rend_data,
- conn->identity_digest);
- control_event_hs_descriptor_content(service_id,
- conn->requested_resource,
- conn->identity_digest,
- body);
- conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2;
- rend_client_desc_trynow(service_id);
- memwipe(service_id, 0, sizeof(service_id));
- }
- break;
- }
- case 404:
- /* Not there. We'll retry when
- * connection_about_to_close_connection() cleans this conn up. */
- log_info(LD_REND,"Fetching v2 rendezvous descriptor failed: "
- "Retrying at another directory.");
- SEND_HS_DESC_FAILED_EVENT("NOT_FOUND");
- SEND_HS_DESC_FAILED_CONTENT();
- break;
- case 400:
- log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: "
- "http status 400 (%s). Dirserver didn't like our "
- "v2 rendezvous query? Retrying at another directory.",
- escaped(reason));
- SEND_HS_DESC_FAILED_EVENT("QUERY_REJECTED");
- SEND_HS_DESC_FAILED_CONTENT();
- break;
- default:
- log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: "
- "http status %d (%s) response unexpected while "
- "fetching v2 hidden service descriptor (server '%s:%d'). "
- "Retrying at another directory.",
- status_code, escaped(reason), conn->base_.address,
- conn->base_.port);
- SEND_HS_DESC_FAILED_EVENT("UNEXPECTED");
+ reason))
+#define SEND_HS_DESC_FAILED_CONTENT() \
+ (control_event_hs_descriptor_content( \
+ rend_data_get_address(conn->rend_data), \
+ conn->requested_resource, \
+ conn->identity_digest, \
+ NULL))
+
+ tor_assert(conn->rend_data);
+ log_info(LD_REND,"Received rendezvous descriptor (body size %d, status %d "
+ "(%s))",
+ (int)body_len, status_code, escaped(reason));
+ switch (status_code) {
+ case 200:
+ {
+ rend_cache_entry_t *entry = NULL;
+
+ if (rend_cache_store_v2_desc_as_client(body,
+ conn->requested_resource,
+ conn->rend_data, &entry) < 0) {
+ log_warn(LD_REND,"Fetching v2 rendezvous descriptor failed. "
+ "Retrying at another directory.");
+ /* We'll retry when connection_about_to_close_connection()
+ * cleans this dir conn up. */
+ SEND_HS_DESC_FAILED_EVENT("BAD_DESC");
SEND_HS_DESC_FAILED_CONTENT();
- break;
+ } else {
+ char service_id[REND_SERVICE_ID_LEN_BASE32 + 1];
+ /* Should never be NULL here if we found the descriptor. */
+ tor_assert(entry);
+ rend_get_service_id(entry->parsed->pk, service_id);
+
+ /* success. notify pending connections about this. */
+ log_info(LD_REND, "Successfully fetched v2 rendezvous "
+ "descriptor.");
+ control_event_hs_descriptor_received(service_id,
+ conn->rend_data,
+ conn->identity_digest);
+ control_event_hs_descriptor_content(service_id,
+ conn->requested_resource,
+ conn->identity_digest,
+ body);
+ conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2;
+ rend_client_desc_trynow(service_id);
+ memwipe(service_id, 0, sizeof(service_id));
+ }
+ break;
}
+ case 404:
+ /* Not there. We'll retry when
+ * connection_about_to_close_connection() cleans this conn up. */
+ log_info(LD_REND,"Fetching v2 rendezvous descriptor failed: "
+ "Retrying at another directory.");
+ SEND_HS_DESC_FAILED_EVENT("NOT_FOUND");
+ SEND_HS_DESC_FAILED_CONTENT();
+ break;
+ case 400:
+ log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: "
+ "http status 400 (%s). Dirserver didn't like our "
+ "v2 rendezvous query? Retrying at another directory.",
+ escaped(reason));
+ SEND_HS_DESC_FAILED_EVENT("QUERY_REJECTED");
+ SEND_HS_DESC_FAILED_CONTENT();
+ break;
+ default:
+ log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: "
+ "http status %d (%s) response unexpected while "
+ "fetching v2 hidden service descriptor (server '%s:%d'). "
+ "Retrying at another directory.",
+ status_code, escaped(reason), conn->base_.address,
+ conn->base_.port);
+ SEND_HS_DESC_FAILED_EVENT("UNEXPECTED");
+ SEND_HS_DESC_FAILED_CONTENT();
+ break;
}
- if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2) {
- #define SEND_HS_DESC_UPLOAD_FAILED_EVENT(reason) ( \
- control_event_hs_descriptor_upload_failed( \
- conn->identity_digest, \
- rend_data_get_address(conn->rend_data), \
- reason) )
- log_info(LD_REND,"Uploaded rendezvous descriptor (status %d "
- "(%s))",
- status_code, escaped(reason));
- /* Without the rend data, we'll have a problem identifying what has been
- * uploaded for which service. */
- tor_assert(conn->rend_data);
- switch (status_code) {
- case 200:
- log_info(LD_REND,
- "Uploading rendezvous descriptor: finished with status "
- "200 (%s)", escaped(reason));
- control_event_hs_descriptor_uploaded(conn->identity_digest,
- rend_data_get_address(conn->rend_data));
- rend_service_desc_has_uploaded(conn->rend_data);
- break;
- case 400:
- log_warn(LD_REND,"http status 400 (%s) response from dirserver "
- "'%s:%d'. Malformed rendezvous descriptor?",
- escaped(reason), conn->base_.address, conn->base_.port);
- SEND_HS_DESC_UPLOAD_FAILED_EVENT("UPLOAD_REJECTED");
- break;
- default:
- log_warn(LD_REND,"http status %d (%s) response unexpected (server "
- "'%s:%d').",
- status_code, escaped(reason), conn->base_.address,
- conn->base_.port);
- SEND_HS_DESC_UPLOAD_FAILED_EVENT("UNEXPECTED");
- break;
- }
+ return 0;
+}
+
+/**
+ * Handler function: processes a response to a POST request to upload a v2
+ * hidden service descriptor.
+ **/
+static int
+handle_response_upload_renddesc_v2(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2);
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+
+#define SEND_HS_DESC_UPLOAD_FAILED_EVENT(reason) \
+ (control_event_hs_descriptor_upload_failed( \
+ conn->identity_digest, \
+ rend_data_get_address(conn->rend_data), \
+ reason))
+
+ log_info(LD_REND,"Uploaded rendezvous descriptor (status %d "
+ "(%s))",
+ status_code, escaped(reason));
+ /* Without the rend data, we'll have a problem identifying what has been
+ * uploaded for which service. */
+ tor_assert(conn->rend_data);
+ switch (status_code) {
+ case 200:
+ log_info(LD_REND,
+ "Uploading rendezvous descriptor: finished with status "
+ "200 (%s)", escaped(reason));
+ control_event_hs_descriptor_uploaded(conn->identity_digest,
+ rend_data_get_address(conn->rend_data));
+ rend_service_desc_has_uploaded(conn->rend_data);
+ break;
+ case 400:
+ log_warn(LD_REND,"http status 400 (%s) response from dirserver "
+ "'%s:%d'. Malformed rendezvous descriptor?",
+ escaped(reason), conn->base_.address, conn->base_.port);
+ SEND_HS_DESC_UPLOAD_FAILED_EVENT("UPLOAD_REJECTED");
+ break;
+ default:
+ log_warn(LD_REND,"http status %d (%s) response unexpected (server "
+ "'%s:%d').",
+ status_code, escaped(reason), conn->base_.address,
+ conn->base_.port);
+ SEND_HS_DESC_UPLOAD_FAILED_EVENT("UNEXPECTED");
+ break;
}
- tor_free(body); tor_free(headers); tor_free(reason);
+
return 0;
}
@@ -2739,13 +3271,54 @@ write_http_response_header_impl(dir_connection_t *conn, ssize_t length,
* based on whether the response will be <b>compressed</b> or not. */
static void
write_http_response_header(dir_connection_t *conn, ssize_t length,
- int compressed, long cache_lifetime)
+ compress_method_t method, long cache_lifetime)
{
+ const char *methodname = compression_method_get_name(method);
+ const char *doctype;
+ if (method == NO_METHOD)
+ doctype = "text/plain";
+ else
+ doctype = "application/octet-stream";
write_http_response_header_impl(conn, length,
- compressed?"application/octet-stream":"text/plain",
- compressed?"deflate":"identity",
- NULL,
- cache_lifetime);
+ doctype,
+ methodname,
+ NULL,
+ cache_lifetime);
+}
+
+/** Array of compression methods to use (if supported) for serving
+ * precompressed data, ordered from best to worst. */
+static compress_method_t srv_meth_pref_precompressed[] = {
+ LZMA_METHOD,
+ ZSTD_METHOD,
+ ZLIB_METHOD,
+ GZIP_METHOD,
+ NO_METHOD
+};
+
+/** Parse the compression methods listed in an Accept-Encoding header <b>h</b>,
+ * and convert them to a bitfield where compression method x is supported if
+ * and only if 1 &lt;&lt; x is set in the bitfield. */
+STATIC unsigned
+parse_accept_encoding_header(const char *h)
+{
+ unsigned result = (1u << NO_METHOD);
+ smartlist_t *methods = smartlist_new();
+ smartlist_split_string(methods, h, ",",
+ SPLIT_SKIP_SPACE|SPLIT_STRIP_SPACE|SPLIT_IGNORE_BLANK, 0);
+
+ SMARTLIST_FOREACH_BEGIN(methods, const char *, m) {
+ compress_method_t method = compression_method_get_by_name(m);
+ if (method != UNKNOWN_METHOD) {
+ tor_assert(((unsigned)method) < 8*sizeof(unsigned));
+ result |= (1u << method);
+ }
+ } SMARTLIST_FOREACH_END(m);
+ SMARTLIST_FOREACH_BEGIN(methods, char *, m) {
+ tor_free(m);
+ } SMARTLIST_FOREACH_END(m);
+ smartlist_free(methods);
+ return result;
}
/** Decide whether a client would accept the consensus we have.
@@ -2804,7 +3377,7 @@ client_likes_consensus(networkstatus_t *v, const char *want_url)
/** Return the compression level we should use for sending a compressed
* response of size <b>n_bytes</b>. */
-STATIC zlib_compression_level_t
+STATIC compression_level_t
choose_compression_level(ssize_t n_bytes)
{
if (! have_been_under_memory_pressure()) {
@@ -2822,8 +3395,9 @@ choose_compression_level(ssize_t n_bytes)
/** Information passed to handle a GET request. */
typedef struct get_handler_args_t {
- /** True if the client asked for compressed data. */
- int compressed;
+ /** Bitmask of compression methods that the client said (or implied) it
+ * supported. */
+ unsigned compression_supported;
/** If nonzero, the time included an if-modified-since header with this
* value. */
time_t if_modified_since;
@@ -2897,8 +3471,9 @@ directory_handle_command_get,(dir_connection_t *conn, const char *headers,
{
char *url, *url_mem, *header;
time_t if_modified_since = 0;
- int compressed;
+ int zlib_compressed_in_url;
size_t url_len;
+ unsigned compression_methods_supported;
/* We ignore the body of a GET request. */
(void)req_body;
@@ -2929,17 +3504,30 @@ directory_handle_command_get,(dir_connection_t *conn, const char *headers,
url_mem = url;
url_len = strlen(url);
- compressed = url_len > 2 && !strcmp(url+url_len-2, ".z");
- if (compressed) {
+
+ zlib_compressed_in_url = url_len > 2 && !strcmp(url+url_len-2, ".z");
+ if (zlib_compressed_in_url) {
url[url_len-2] = '\0';
url_len -= 2;
}
+ if ((header = http_get_header(headers, "Accept-Encoding: "))) {
+ compression_methods_supported = parse_accept_encoding_header(header);
+ tor_free(header);
+ } else {
+ compression_methods_supported = (1u << NO_METHOD);
+ if (zlib_compressed_in_url)
+ compression_methods_supported |= (1u << ZLIB_METHOD);
+ }
+
+ /* Remove all methods that we don't both support. */
+ compression_methods_supported &= tor_compress_get_supported_method_bitmask();
+
get_handler_args_t args;
args.url = url;
args.headers = headers;
args.if_modified_since = if_modified_since;
- args.compressed = compressed;
+ args.compression_supported = compression_methods_supported;
int i, result = -1;
for (i = 0; url_table[i].string; ++i) {
@@ -3011,6 +3599,70 @@ warn_consensus_is_too_old(networkstatus_t *v, const char *flavor, time_t now)
}
}
+/** If there is an X-Or-Diff-From-Consensus header included in <b>headers</b>,
+ * set <b>digest_out<b> to a new smartlist containing every 256-bit
+ * hex-encoded digest listed in that header and return 0. Otherwise return
+ * -1. */
+static int
+parse_or_diff_from_header(smartlist_t **digests_out, const char *headers)
+{
+ char *hdr = http_get_header(headers, X_OR_DIFF_FROM_CONSENSUS_HEADER);
+ if (hdr == NULL) {
+ return -1;
+ }
+ smartlist_t *hex_digests = smartlist_new();
+ *digests_out = smartlist_new();
+ smartlist_split_string(hex_digests, hdr, " ",
+ SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
+ SMARTLIST_FOREACH_BEGIN(hex_digests, const char *, hex) {
+ uint8_t digest[DIGEST256_LEN];
+ if (base16_decode((char*)digest, sizeof(digest), hex, strlen(hex)) ==
+ DIGEST256_LEN) {
+ smartlist_add(*digests_out, tor_memdup(digest, sizeof(digest)));
+ } else {
+ log_fn(LOG_PROTOCOL_WARN, LD_DIR,
+ "X-Or-Diff-From-Consensus header contained bogus digest %s; "
+ "ignoring.", escaped(hex));
+ }
+ } SMARTLIST_FOREACH_END(hex);
+ SMARTLIST_FOREACH(hex_digests, char *, cp, tor_free(cp));
+ smartlist_free(hex_digests);
+ tor_free(hdr);
+ return 0;
+}
+
+/**
+ * Try to find the best consensus diff possible in order to serve a client
+ * request for a diff from one of the consensuses in <b>digests</b> to the
+ * current consensus of flavor <b>flav</b>. The client supports the
+ * compression methods listed in the <b>compression_methods</b> bitfield:
+ * place the method chosen (if any) into <b>compression_used_out</b>.
+ */
+static struct consensus_cache_entry_t *
+find_best_diff(const smartlist_t *digests, int flav,
+ unsigned compression_methods,
+ compress_method_t *compression_used_out)
+{
+ struct consensus_cache_entry_t *result = NULL;
+
+ SMARTLIST_FOREACH_BEGIN(digests, const uint8_t *, diff_from) {
+ unsigned u;
+ for (u = 0; u < ARRAY_LENGTH(srv_meth_pref_precompressed); ++u) {
+ compress_method_t method = srv_meth_pref_precompressed[u];
+ if (0 == (compression_methods & (1u<<method)))
+ continue; // client doesn't like this one, or we don't have it.
+ if (consdiffmgr_find_diff_from(&result, flav, DIGEST_SHA3_256,
+ diff_from, DIGEST256_LEN,
+ method) == CONSDIFF_AVAILABLE) {
+ tor_assert_nonfatal(result);
+ *compression_used_out = method;
+ return result;
+ }
+ }
+ } SMARTLIST_FOREACH_END(diff_from);
+ return NULL;
+}
+
/** Helper function for GET /tor/status-vote/current/consensus
*/
static int
@@ -3018,132 +3670,154 @@ handle_get_current_consensus(dir_connection_t *conn,
const get_handler_args_t *args)
{
const char *url = args->url;
- const int compressed = args->compressed;
+ const int compressed = args->compression_supported & (1u << ZLIB_METHOD);
const time_t if_modified_since = args->if_modified_since;
+ int clear_spool = 0;
- {
- /* v3 network status fetch. */
- smartlist_t *dir_fps = smartlist_new();
- long lifetime = NETWORKSTATUS_CACHE_LIFETIME;
+ /* v3 network status fetch. */
+ long lifetime = NETWORKSTATUS_CACHE_LIFETIME;
- networkstatus_t *v;
- time_t now = time(NULL);
- const char *want_fps = NULL;
- char *flavor = NULL;
- int flav = FLAV_NS;
+ networkstatus_t *v;
+ time_t now = time(NULL);
+ const char *want_fps = NULL;
+ char *flavor = NULL;
+ int flav = FLAV_NS;
#define CONSENSUS_URL_PREFIX "/tor/status-vote/current/consensus/"
#define CONSENSUS_FLAVORED_PREFIX "/tor/status-vote/current/consensus-"
- /* figure out the flavor if any, and who we wanted to sign the thing */
- if (!strcmpstart(url, CONSENSUS_FLAVORED_PREFIX)) {
- const char *f, *cp;
- f = url + strlen(CONSENSUS_FLAVORED_PREFIX);
- cp = strchr(f, '/');
- if (cp) {
- want_fps = cp+1;
- flavor = tor_strndup(f, cp-f);
- } else {
- flavor = tor_strdup(f);
- }
- flav = networkstatus_parse_flavor_name(flavor);
- if (flav < 0)
- flav = FLAV_NS;
+ /* figure out the flavor if any, and who we wanted to sign the thing */
+ if (!strcmpstart(url, CONSENSUS_FLAVORED_PREFIX)) {
+ const char *f, *cp;
+ f = url + strlen(CONSENSUS_FLAVORED_PREFIX);
+ cp = strchr(f, '/');
+ if (cp) {
+ want_fps = cp+1;
+ flavor = tor_strndup(f, cp-f);
} else {
- if (!strcmpstart(url, CONSENSUS_URL_PREFIX))
- want_fps = url+strlen(CONSENSUS_URL_PREFIX);
+ flavor = tor_strdup(f);
}
+ flav = networkstatus_parse_flavor_name(flavor);
+ if (flav < 0)
+ flav = FLAV_NS;
+ } else {
+ if (!strcmpstart(url, CONSENSUS_URL_PREFIX))
+ want_fps = url+strlen(CONSENSUS_URL_PREFIX);
+ }
- v = networkstatus_get_latest_consensus_by_flavor(flav);
-
- if (v && !networkstatus_consensus_reasonably_live(v, now)) {
- write_http_status_line(conn, 404, "Consensus is too old");
- warn_consensus_is_too_old(v, flavor, now);
- smartlist_free(dir_fps);
- geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND);
- tor_free(flavor);
- goto done;
- }
+ v = networkstatus_get_latest_consensus_by_flavor(flav);
- if (v && want_fps &&
- !client_likes_consensus(v, want_fps)) {
- write_http_status_line(conn, 404, "Consensus not signed by sufficient "
- "number of requested authorities");
- smartlist_free(dir_fps);
- geoip_note_ns_response(GEOIP_REJECT_NOT_ENOUGH_SIGS);
- tor_free(flavor);
- goto done;
- }
+ if (v && !networkstatus_consensus_reasonably_live(v, now)) {
+ write_http_status_line(conn, 404, "Consensus is too old");
+ warn_consensus_is_too_old(v, flavor, now);
+ geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND);
+ tor_free(flavor);
+ goto done;
+ }
- {
- char *fp = tor_malloc_zero(DIGEST_LEN);
- if (flavor)
- strlcpy(fp, flavor, DIGEST_LEN);
- tor_free(flavor);
- smartlist_add(dir_fps, fp);
- }
- lifetime = (v && v->fresh_until > now) ? v->fresh_until - now : 0;
+ if (v && want_fps &&
+ !client_likes_consensus(v, want_fps)) {
+ write_http_status_line(conn, 404, "Consensus not signed by sufficient "
+ "number of requested authorities");
+ geoip_note_ns_response(GEOIP_REJECT_NOT_ENOUGH_SIGS);
+ tor_free(flavor);
+ goto done;
+ }
- if (!smartlist_len(dir_fps)) { /* we failed to create/cache cp */
- write_http_status_line(conn, 503, "Network status object unavailable");
- smartlist_free(dir_fps);
- geoip_note_ns_response(GEOIP_REJECT_UNAVAILABLE);
- goto done;
- }
+ struct consensus_cache_entry_t *cached_diff = NULL;
+ smartlist_t *diff_from_digests = NULL;
+ compress_method_t compression_used = NO_METHOD;
+ if (!parse_or_diff_from_header(&diff_from_digests, args->headers)) {
+ tor_assert(diff_from_digests);
+ cached_diff = find_best_diff(diff_from_digests, flav,
+ args->compression_supported,
+ &compression_used);
+ SMARTLIST_FOREACH(diff_from_digests, uint8_t *, d, tor_free(d));
+ smartlist_free(diff_from_digests);
+ }
- if (!dirserv_remove_old_statuses(dir_fps, if_modified_since)) {
- write_http_status_line(conn, 404, "Not found");
- SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp));
- smartlist_free(dir_fps);
- geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND);
- goto done;
- } else if (!smartlist_len(dir_fps)) {
- write_http_status_line(conn, 304, "Not modified");
- SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp));
- smartlist_free(dir_fps);
- geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED);
- goto done;
+ conn->spool = smartlist_new();
+ clear_spool = 1;
+ {
+ spooled_resource_t *spooled;
+ if (cached_diff) {
+ spooled = spooled_resource_new_from_cache_entry(cached_diff);
+ } else if (flavor) {
+ spooled = spooled_resource_new(DIR_SPOOL_NETWORKSTATUS,
+ (uint8_t*)flavor, strlen(flavor));
+ compression_used = compressed ? ZLIB_METHOD : NO_METHOD;
+ } else {
+ spooled = spooled_resource_new(DIR_SPOOL_NETWORKSTATUS,
+ NULL, 0);
+ compression_used = compressed ? ZLIB_METHOD : NO_METHOD;
}
+ tor_free(flavor);
+ smartlist_add(conn->spool, spooled);
+ }
+ lifetime = (v && v->fresh_until > now) ? v->fresh_until - now : 0;
- size_t dlen = dirserv_estimate_data_size(dir_fps, 0, compressed);
- if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) {
- log_debug(LD_DIRSERV,
- "Client asked for network status lists, but we've been "
- "writing too many bytes lately. Sending 503 Dir busy.");
- write_http_status_line(conn, 503, "Directory busy, try again later");
- SMARTLIST_FOREACH(dir_fps, char *, fp, tor_free(fp));
- smartlist_free(dir_fps);
-
- geoip_note_ns_response(GEOIP_REJECT_BUSY);
- goto done;
- }
+ if (!smartlist_len(conn->spool)) { /* we failed to create/cache cp */
+ write_http_status_line(conn, 503, "Network status object unavailable");
+ geoip_note_ns_response(GEOIP_REJECT_UNAVAILABLE);
+ goto done;
+ }
- tor_addr_t addr;
- if (tor_addr_parse(&addr, (TO_CONN(conn))->address) >= 0) {
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS,
- &addr, NULL,
- time(NULL));
- geoip_note_ns_response(GEOIP_SUCCESS);
- /* Note that a request for a network status has started, so that we
- * can measure the download time later on. */
- if (conn->dirreq_id)
- geoip_start_dirreq(conn->dirreq_id, dlen, DIRREQ_TUNNELED);
- else
- geoip_start_dirreq(TO_CONN(conn)->global_identifier, dlen,
- DIRREQ_DIRECT);
- }
+ size_t size_guess = 0;
+ int n_expired = 0;
+ dirserv_spool_remove_missing_and_guess_size(conn, if_modified_since,
+ compressed,
+ &size_guess,
+ &n_expired);
- write_http_response_header(conn, -1, compressed,
- smartlist_len(dir_fps) == 1 ? lifetime : 0);
- conn->fingerprint_stack = dir_fps;
- if (! compressed)
- conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION);
+ if (!smartlist_len(conn->spool) && !n_expired) {
+ write_http_status_line(conn, 404, "Not found");
+ geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND);
+ goto done;
+ } else if (!smartlist_len(conn->spool)) {
+ write_http_status_line(conn, 304, "Not modified");
+ geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED);
+ goto done;
+ }
- /* Prime the connection with some data. */
- conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS;
- connection_dirserv_flushed_some(conn);
+ if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) {
+ log_debug(LD_DIRSERV,
+ "Client asked for network status lists, but we've been "
+ "writing too many bytes lately. Sending 503 Dir busy.");
+ write_http_status_line(conn, 503, "Directory busy, try again later");
+ geoip_note_ns_response(GEOIP_REJECT_BUSY);
goto done;
}
+ tor_addr_t addr;
+ if (tor_addr_parse(&addr, (TO_CONN(conn))->address) >= 0) {
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS,
+ &addr, NULL,
+ time(NULL));
+ geoip_note_ns_response(GEOIP_SUCCESS);
+ /* Note that a request for a network status has started, so that we
+ * can measure the download time later on. */
+ if (conn->dirreq_id)
+ geoip_start_dirreq(conn->dirreq_id, size_guess, DIRREQ_TUNNELED);
+ else
+ geoip_start_dirreq(TO_CONN(conn)->global_identifier, size_guess,
+ DIRREQ_DIRECT);
+ }
+
+ clear_spool = 0;
+ write_http_response_header(conn, -1,
+ compression_used,
+ smartlist_len(conn->spool) == 1 ? lifetime : 0);
+ if (! compressed)
+ conn->compress_state = tor_compress_new(0, ZLIB_METHOD,
+ HIGH_COMPRESSION);
+
+ /* Prime the connection with some data. */
+ const int initial_flush_result = connection_dirserv_flushed_some(conn);
+ tor_assert_nonfatal(initial_flush_result == 0);
+ goto done;
+
done:
+ if (clear_spool) {
+ dir_conn_clear_spool(conn);
+ }
return 0;
}
@@ -3153,7 +3827,7 @@ static int
handle_get_status_vote(dir_connection_t *conn, const get_handler_args_t *args)
{
const char *url = args->url;
- const int compressed = args->compressed;
+ const int compressed = args->compression_supported & (1u << ZLIB_METHOD);
{
int current;
ssize_t body_len = 0;
@@ -3225,16 +3899,17 @@ handle_get_status_vote(dir_connection_t *conn, const get_handler_args_t *args)
write_http_status_line(conn, 503, "Directory busy, try again later");
goto vote_done;
}
- write_http_response_header(conn, body_len ? body_len : -1, compressed,
+ write_http_response_header(conn, body_len ? body_len : -1,
+ compressed ? ZLIB_METHOD : NO_METHOD,
lifetime);
if (smartlist_len(items)) {
if (compressed) {
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
- choose_compression_level(estimated_len));
+ conn->compress_state = tor_compress_new(1, ZLIB_METHOD,
+ choose_compression_level(estimated_len));
SMARTLIST_FOREACH(items, const char *, c,
- connection_write_to_buf_zlib(c, strlen(c), conn, 0));
- connection_write_to_buf_zlib("", 0, conn, 1);
+ connection_write_to_buf_compress(c, strlen(c), conn, 0));
+ connection_write_to_buf_compress("", 0, conn, 1);
} else {
SMARTLIST_FOREACH(items, const char *, c,
connection_write_to_buf(c, strlen(c), TO_CONN(conn)));
@@ -3260,44 +3935,49 @@ static int
handle_get_microdesc(dir_connection_t *conn, const get_handler_args_t *args)
{
const char *url = args->url;
- const int compressed = args->compressed;
+ const int compressed = args->compression_supported & (1u << ZLIB_METHOD);
+ int clear_spool = 1;
{
- smartlist_t *fps = smartlist_new();
+ conn->spool = smartlist_new();
- dir_split_resource_into_fingerprints(url+strlen("/tor/micro/d/"),
- fps, NULL,
+ dir_split_resource_into_spoolable(url+strlen("/tor/micro/d/"),
+ DIR_SPOOL_MICRODESC,
+ conn->spool, NULL,
DSR_DIGEST256|DSR_BASE64|DSR_SORT_UNIQ);
- if (!dirserv_have_any_microdesc(fps)) {
+ size_t size_guess = 0;
+ dirserv_spool_remove_missing_and_guess_size(conn, 0, compressed,
+ &size_guess, NULL);
+ if (smartlist_len(conn->spool) == 0) {
write_http_status_line(conn, 404, "Not found");
- SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp));
- smartlist_free(fps);
goto done;
}
- size_t dlen = dirserv_estimate_microdesc_size(fps, compressed);
- if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) {
+ if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) {
log_info(LD_DIRSERV,
"Client asked for server descriptors, but we've been "
"writing too many bytes lately. Sending 503 Dir busy.");
write_http_status_line(conn, 503, "Directory busy, try again later");
- SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp));
- smartlist_free(fps);
goto done;
}
- write_http_response_header(conn, -1, compressed, MICRODESC_CACHE_LIFETIME);
- conn->dir_spool_src = DIR_SPOOL_MICRODESC;
- conn->fingerprint_stack = fps;
+ clear_spool = 0;
+ write_http_response_header(conn, -1,
+ compressed ? ZLIB_METHOD : NO_METHOD,
+ MICRODESC_CACHE_LIFETIME);
if (compressed)
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
- choose_compression_level(dlen));
+ conn->compress_state = tor_compress_new(1, ZLIB_METHOD,
+ choose_compression_level(size_guess));
- connection_dirserv_flushed_some(conn);
+ const int initial_flush_result = connection_dirserv_flushed_some(conn);
+ tor_assert_nonfatal(initial_flush_result == 0);
goto done;
}
done:
+ if (clear_spool) {
+ dir_conn_clear_spool(conn);
+ }
return 0;
}
@@ -3307,71 +3987,93 @@ static int
handle_get_descriptor(dir_connection_t *conn, const get_handler_args_t *args)
{
const char *url = args->url;
- const int compressed = args->compressed;
+ const int compressed = args->compression_supported & (1u << ZLIB_METHOD);
const or_options_t *options = get_options();
+ int clear_spool = 1;
if (!strcmpstart(url,"/tor/server/") ||
(!options->BridgeAuthoritativeDir &&
!options->BridgeRelay && !strcmpstart(url,"/tor/extra/"))) {
- size_t dlen;
int res;
- const char *msg;
+ const char *msg = NULL;
int cache_lifetime = 0;
int is_extra = !strcmpstart(url,"/tor/extra/");
url += is_extra ? strlen("/tor/extra/") : strlen("/tor/server/");
- conn->fingerprint_stack = smartlist_new();
- res = dirserv_get_routerdesc_fingerprints(conn->fingerprint_stack, url,
- &msg,
- !connection_dir_is_encrypted(conn),
- is_extra);
-
- if (!strcmpstart(url, "fp/")) {
- if (smartlist_len(conn->fingerprint_stack) == 1)
- cache_lifetime = ROUTERDESC_CACHE_LIFETIME;
- } else if (!strcmpstart(url, "authority")) {
- cache_lifetime = ROUTERDESC_CACHE_LIFETIME;
- } else if (!strcmpstart(url, "all")) {
- cache_lifetime = FULL_DIR_CACHE_LIFETIME;
- } else if (!strcmpstart(url, "d/")) {
- if (smartlist_len(conn->fingerprint_stack) == 1)
- cache_lifetime = ROUTERDESC_BY_DIGEST_CACHE_LIFETIME;
- }
- if (!strcmpstart(url, "d/"))
- conn->dir_spool_src =
+ dir_spool_source_t source;
+ time_t publish_cutoff = 0;
+ if (!strcmpstart(url, "d/")) {
+ source =
is_extra ? DIR_SPOOL_EXTRA_BY_DIGEST : DIR_SPOOL_SERVER_BY_DIGEST;
- else
- conn->dir_spool_src =
+ } else {
+ source =
is_extra ? DIR_SPOOL_EXTRA_BY_FP : DIR_SPOOL_SERVER_BY_FP;
+ /* We only want to apply a publish cutoff when we're requesting
+ * resources by fingerprint. */
+ publish_cutoff = time(NULL) - ROUTER_MAX_AGE_TO_PUBLISH;
+ }
+
+ conn->spool = smartlist_new();
+ res = dirserv_get_routerdesc_spool(conn->spool, url,
+ source,
+ connection_dir_is_encrypted(conn),
+ &msg);
- if (!dirserv_have_any_serverdesc(conn->fingerprint_stack,
- conn->dir_spool_src)) {
- res = -1;
- msg = "Not found";
+ if (!strcmpstart(url, "all")) {
+ cache_lifetime = FULL_DIR_CACHE_LIFETIME;
+ } else if (smartlist_len(conn->spool) == 1) {
+ cache_lifetime = ROUTERDESC_BY_DIGEST_CACHE_LIFETIME;
+ }
+
+ size_t size_guess = 0;
+ int n_expired = 0;
+ dirserv_spool_remove_missing_and_guess_size(conn, publish_cutoff,
+ compressed, &size_guess,
+ &n_expired);
+
+ /* If we are the bridge authority and the descriptor is a bridge
+ * descriptor, remember that we served this descriptor for desc stats. */
+ /* XXXX it's a bit of a kludge to have this here. */
+ if (get_options()->BridgeAuthoritativeDir &&
+ source == DIR_SPOOL_SERVER_BY_FP) {
+ SMARTLIST_FOREACH_BEGIN(conn->spool, spooled_resource_t *, spooled) {
+ const routerinfo_t *router =
+ router_get_by_id_digest((const char *)spooled->digest);
+ /* router can be NULL here when the bridge auth is asked for its own
+ * descriptor. */
+ if (router && router->purpose == ROUTER_PURPOSE_BRIDGE)
+ rep_hist_note_desc_served(router->cache_info.identity_digest);
+ } SMARTLIST_FOREACH_END(spooled);
}
- if (res < 0)
+ if (res < 0 || size_guess == 0 || smartlist_len(conn->spool) == 0) {
+ if (msg == NULL)
+ msg = "Not found";
write_http_status_line(conn, 404, msg);
- else {
- dlen = dirserv_estimate_data_size(conn->fingerprint_stack,
- 1, compressed);
- if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) {
+ } else {
+ if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) {
log_info(LD_DIRSERV,
"Client asked for server descriptors, but we've been "
"writing too many bytes lately. Sending 503 Dir busy.");
write_http_status_line(conn, 503, "Directory busy, try again later");
- conn->dir_spool_src = DIR_SPOOL_NONE;
+ dir_conn_clear_spool(conn);
goto done;
}
- write_http_response_header(conn, -1, compressed, cache_lifetime);
+ write_http_response_header(conn, -1,
+ compressed ? ZLIB_METHOD : NO_METHOD,
+ cache_lifetime);
if (compressed)
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
- choose_compression_level(dlen));
+ conn->compress_state = tor_compress_new(1, ZLIB_METHOD,
+ choose_compression_level(size_guess));
+ clear_spool = 0;
/* Prime the connection with some data. */
- connection_dirserv_flushed_some(conn);
+ int initial_flush_result = connection_dirserv_flushed_some(conn);
+ tor_assert_nonfatal(initial_flush_result == 0);
}
goto done;
}
done:
- return 0;
+ if (clear_spool)
+ dir_conn_clear_spool(conn);
+ return 0;
}
/** Helper function for GET /tor/keys/...
@@ -3380,7 +4082,7 @@ static int
handle_get_keys(dir_connection_t *conn, const get_handler_args_t *args)
{
const char *url = args->url;
- const int compressed = args->compressed;
+ const int compressed = args->compression_supported & (1u << ZLIB_METHOD);
const time_t if_modified_since = args->if_modified_since;
{
smartlist_t *certs = smartlist_new();
@@ -3448,15 +4150,18 @@ handle_get_keys(dir_connection_t *conn, const get_handler_args_t *args)
goto keys_done;
}
- write_http_response_header(conn, compressed?-1:len, compressed, 60*60);
+ write_http_response_header(conn, compressed?-1:len,
+ compressed ? ZLIB_METHOD : NO_METHOD,
+ 60*60);
if (compressed) {
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
- choose_compression_level(len));
+ conn->compress_state = tor_compress_new(1, ZLIB_METHOD,
+ choose_compression_level(len));
SMARTLIST_FOREACH(certs, authority_cert_t *, c,
- connection_write_to_buf_zlib(c->cache_info.signed_descriptor_body,
- c->cache_info.signed_descriptor_len,
- conn, 0));
- connection_write_to_buf_zlib("", 0, conn, 1);
+ connection_write_to_buf_compress(
+ c->cache_info.signed_descriptor_body,
+ c->cache_info.signed_descriptor_len,
+ conn, 0));
+ connection_write_to_buf_compress("", 0, conn, 1);
} else {
SMARTLIST_FOREACH(certs, authority_cert_t *, c,
connection_write_to_buf(c->cache_info.signed_descriptor_body,
@@ -3487,7 +4192,7 @@ handle_get_hs_descriptor_v2(dir_connection_t *conn,
safe_str(escaped(query)));
switch (rend_cache_lookup_v2_desc_as_dir(query, &descp)) {
case 1: /* valid */
- write_http_response_header(conn, strlen(descp), 0, 0);
+ write_http_response_header(conn, strlen(descp), NO_METHOD, 0);
connection_write_to_buf(descp, strlen(descp), TO_CONN(conn));
break;
case 0: /* well-formed but not present */
@@ -3539,7 +4244,7 @@ handle_get_hs_descriptor_v3(dir_connection_t *conn,
}
/* Found requested descriptor! Pass it to this nice client. */
- write_http_response_header(conn, strlen(desc_str), 0, 0);
+ write_http_response_header(conn, strlen(desc_str), NO_METHOD, 0);
connection_write_to_buf(desc_str, strlen(desc_str), TO_CONN(conn));
done:
@@ -3578,7 +4283,7 @@ handle_get_networkstatus_bridges(dir_connection_t *conn,
/* all happy now. send an answer. */
status = networkstatus_getinfo_by_purpose("bridge", time(NULL));
size_t dlen = strlen(status);
- write_http_response_header(conn, dlen, 0, 0);
+ write_http_response_header(conn, dlen, NO_METHOD, 0);
connection_write_to_buf(status, dlen, TO_CONN(conn));
tor_free(status);
goto done;
@@ -3595,7 +4300,7 @@ handle_get_robots(dir_connection_t *conn, const get_handler_args_t *args)
{
const char robots[] = "User-agent: *\r\nDisallow: /\r\n";
size_t len = strlen(robots);
- write_http_response_header(conn, len, 0, ROBOTS_CACHE_LIFETIME);
+ write_http_response_header(conn, len, NO_METHOD, ROBOTS_CACHE_LIFETIME);
connection_write_to_buf(robots, len, TO_CONN(conn));
}
return 0;
@@ -3718,7 +4423,7 @@ directory_handle_command_post,(dir_connection_t *conn, const char *headers,
if (connection_dir_is_encrypted(conn) &&
!strcmpstart(url,"/tor/rendezvous2/publish")) {
if (rend_cache_store_v2_desc_as_dir(body) < 0) {
- log_warn(LD_REND, "Rejected v2 rend descriptor (length %d) from %s.",
+ log_warn(LD_REND, "Rejected v2 rend descriptor (body size %d) from %s.",
(int)body_len, conn->base_.address);
write_http_status_line(conn, 400,
"Invalid v2 service descriptor rejected");
@@ -3895,7 +4600,7 @@ connection_dir_finished_flushing(dir_connection_t *conn)
conn->base_.state = DIR_CONN_STATE_CLIENT_READING;
return 0;
case DIR_CONN_STATE_SERVER_WRITING:
- if (conn->dir_spool_src != DIR_SPOOL_NONE) {
+ if (conn->spool) {
log_warn(LD_BUG, "Emptied a dirserv buffer, but it's still spooling!");
connection_mark_for_close(TO_CONN(conn));
} else {
@@ -4578,3 +5283,34 @@ dir_split_resource_into_fingerprints(const char *resource,
return 0;
}
+/** As dir_split_resource_into_fingerprints, but instead fills
+ * <b>spool_out</b> with a list of spoolable_resource_t for the resource
+ * identified through <b>source</b>. */
+int
+dir_split_resource_into_spoolable(const char *resource,
+ dir_spool_source_t source,
+ smartlist_t *spool_out,
+ int *compressed_out,
+ int flags)
+{
+ smartlist_t *fingerprints = smartlist_new();
+
+ tor_assert(flags & (DSR_HEX|DSR_BASE64));
+ const size_t digest_len =
+ (flags & DSR_DIGEST256) ? DIGEST256_LEN : DIGEST_LEN;
+
+ int r = dir_split_resource_into_fingerprints(resource, fingerprints,
+ compressed_out, flags);
+ /* This is not a very efficient implementation XXXX */
+ SMARTLIST_FOREACH_BEGIN(fingerprints, uint8_t *, digest) {
+ spooled_resource_t *spooled =
+ spooled_resource_new(source, digest, digest_len);
+ if (spooled)
+ smartlist_add(spool_out, spooled);
+ tor_free(digest);
+ } SMARTLIST_FOREACH_END(digest);
+
+ smartlist_free(fingerprints);
+ return r;
+}
+
diff --git a/src/or/directory.h b/src/or/directory.h
index 8be1f8e76e..125333da37 100644
--- a/src/or/directory.h
+++ b/src/or/directory.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -41,45 +41,51 @@ typedef enum {
int directory_must_use_begindir(const or_options_t *options);
-MOCK_DECL(void, directory_initiate_command_routerstatus,
- (const routerstatus_t *status,
- uint8_t dir_purpose,
- uint8_t router_purpose,
- dir_indirection_t indirection,
- const char *resource,
- const char *payload,
- size_t payload_len,
- time_t if_modified_since,
- struct circuit_guard_state_t *guard_state));
-
-void directory_initiate_command_routerstatus_rend(const routerstatus_t *status,
- uint8_t dir_purpose,
- uint8_t router_purpose,
- dir_indirection_t indirection,
- const char *resource,
- const char *payload,
- size_t payload_len,
- time_t if_modified_since,
- const rend_data_t *rend_query,
- struct circuit_guard_state_t *guard_state);
+/**
+ * A directory_request_t describes the information about a directory request
+ * at the client side. It describes what we're going to ask for, which
+ * directory we're going to ask for it, how we're going to contact that
+ * directory, and (in some cases) what to do with it when we're done.
+ */
+typedef struct directory_request_t directory_request_t;
+directory_request_t *directory_request_new(uint8_t dir_purpose);
+void directory_request_free(directory_request_t *req);
+void directory_request_set_or_addr_port(directory_request_t *req,
+ const tor_addr_port_t *p);
+void directory_request_set_dir_addr_port(directory_request_t *req,
+ const tor_addr_port_t *p);
+void directory_request_set_directory_id_digest(directory_request_t *req,
+ const char *digest);
+void directory_request_set_router_purpose(directory_request_t *req,
+ uint8_t router_purpose);
+void directory_request_set_indirection(directory_request_t *req,
+ dir_indirection_t indirection);
+void directory_request_set_resource(directory_request_t *req,
+ const char *resource);
+void directory_request_set_payload(directory_request_t *req,
+ const char *payload,
+ size_t payload_len);
+void directory_request_set_if_modified_since(directory_request_t *req,
+ time_t if_modified_since);
+void directory_request_set_rend_query(directory_request_t *req,
+ const rend_data_t *query);
+
+void directory_request_set_routerstatus(directory_request_t *req,
+ const routerstatus_t *rs);
+void directory_request_add_header(directory_request_t *req,
+ const char *key,
+ const char *val);
+MOCK_DECL(void, directory_initiate_request, (directory_request_t *request));
int parse_http_response(const char *headers, int *code, time_t *date,
compress_method_t *compression, char **response);
-int connection_dir_is_encrypted(dir_connection_t *conn);
+int connection_dir_is_encrypted(const dir_connection_t *conn);
int connection_dir_reached_eof(dir_connection_t *conn);
int connection_dir_process_inbuf(dir_connection_t *conn);
int connection_dir_finished_flushing(dir_connection_t *conn);
int connection_dir_finished_connecting(dir_connection_t *conn);
void connection_dir_about_to_close(dir_connection_t *dir_conn);
-void directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port,
- const tor_addr_t *dir_addr, uint16_t dir_port,
- const char *digest,
- uint8_t dir_purpose, uint8_t router_purpose,
- dir_indirection_t indirection,
- const char *resource,
- const char *payload, size_t payload_len,
- time_t if_modified_since);
#define DSR_HEX (1<<0)
#define DSR_BASE64 (1<<1)
@@ -88,7 +94,12 @@ void directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port,
int dir_split_resource_into_fingerprints(const char *resource,
smartlist_t *fp_out, int *compressed_out,
int flags);
-
+enum dir_spool_source_t;
+int dir_split_resource_into_spoolable(const char *resource,
+ enum dir_spool_source_t source,
+ smartlist_t *spool_out,
+ int *compressed_out,
+ int flags);
int dir_split_resource_into_fingerprint_pairs(const char *res,
smartlist_t *pairs_out);
char *directory_dump_request_log(void);
@@ -176,7 +187,7 @@ STATIC int handle_post_hs_descriptor(const char *url, const char *body);
STATIC char* authdir_type_to_string(dirinfo_type_t auth);
STATIC const char * dir_conn_purpose_to_string(int purpose);
STATIC int should_use_directory_guards(const or_options_t *options);
-STATIC zlib_compression_level_t choose_compression_level(ssize_t n_bytes);
+STATIC compression_level_t choose_compression_level(ssize_t n_bytes);
STATIC const smartlist_t *find_dl_schedule(download_status_t *dls,
const or_options_t *options);
STATIC void find_dl_min_and_max_delay(download_status_t *dls,
@@ -187,6 +198,7 @@ STATIC int next_random_exponential_delay(int delay, int max_delay);
STATIC int parse_hs_version_from_post(const char *url, const char *prefix,
const char **end_pos);
+STATIC unsigned parse_accept_encoding_header(const char *h);
#endif
#endif
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index af01f8c283..7de72df9eb 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define DIRSERV_PRIVATE
@@ -13,6 +13,7 @@
#include "command.h"
#include "connection.h"
#include "connection_or.h"
+#include "conscache.h"
#include "control.h"
#include "directory.h"
#include "dirserv.h"
@@ -81,14 +82,23 @@ dirserv_get_status_impl(const char *fp, const char *nickname,
int severity);
static void clear_cached_dir(cached_dir_t *d);
static const signed_descriptor_t *get_signed_descriptor_by_fp(
- const char *fp,
- int extrainfo,
- time_t publish_cutoff);
+ const uint8_t *fp,
+ int extrainfo);
static was_router_added_t dirserv_add_extrainfo(extrainfo_t *ei,
const char **msg);
static uint32_t dirserv_get_bandwidth_for_router_kb(const routerinfo_t *ri);
static uint32_t dirserv_get_credible_bandwidth_kb(const routerinfo_t *ri);
+static int spooled_resource_lookup_body(const spooled_resource_t *spooled,
+ int conn_is_encrypted,
+ const uint8_t **body_out,
+ size_t *size_out,
+ time_t *published_out);
+static cached_dir_t *spooled_resource_lookup_cached_dir(
+ const spooled_resource_t *spooled,
+ time_t *published_out);
+static cached_dir_t *lookup_cached_dir_by_fp(const uint8_t *fp);
+
/************** Fingerprint handling code ************/
/* 1 Historically used to indicate Named */
@@ -814,6 +824,9 @@ directory_remove_invalid(void)
* Allocate and return a description of the status of the server <b>desc</b>,
* for use in a v1-style router-status line. The server is listed
* as running iff <b>is_live</b> is true.
+ *
+ * This is deprecated: it's only used for controllers that want outputs in
+ * the old format.
*/
static char *
list_single_server_status(const routerinfo_t *desc, int is_live)
@@ -926,6 +939,9 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now)
* *<b>router_status_out</b>. Return 0 on success, -1 on failure.
*
* If for_controller is true, include the routers with very old descriptors.
+ *
+ * This is deprecated: it's only used for controllers that want outputs in
+ * the old format.
*/
int
list_server_status_v1(smartlist_t *routers, char **router_status_out,
@@ -1161,8 +1177,8 @@ new_cached_dir(char *s, time_t published)
d->dir = s;
d->dir_len = strlen(s);
d->published = published;
- if (tor_gzip_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len,
- ZLIB_METHOD)) {
+ if (tor_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len,
+ ZLIB_METHOD)) {
log_warn(LD_BUG, "Error compressing directory");
}
return d;
@@ -1196,6 +1212,7 @@ void
dirserv_set_cached_consensus_networkstatus(const char *networkstatus,
const char *flavor_name,
const common_digests_t *digests,
+ const uint8_t *sha3_as_signed,
time_t published)
{
cached_dir_t *new_networkstatus;
@@ -1205,6 +1222,8 @@ dirserv_set_cached_consensus_networkstatus(const char *networkstatus,
new_networkstatus = new_cached_dir(tor_strdup(networkstatus), published);
memcpy(&new_networkstatus->digests, digests, sizeof(common_digests_t));
+ memcpy(&new_networkstatus->digest_sha3_as_signed, sha3_as_signed,
+ DIGEST256_LEN);
old_networkstatus = strmap_set(cached_consensuses, flavor_name,
new_networkstatus);
if (old_networkstatus)
@@ -3037,58 +3056,61 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
* requests, adds identity digests.
*/
int
-dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key,
- const char **msg, int for_unencrypted_conn,
- int is_extrainfo)
+dirserv_get_routerdesc_spool(smartlist_t *spool_out,
+ const char *key,
+ dir_spool_source_t source,
+ int conn_is_encrypted,
+ const char **msg_out)
{
- int by_id = 1;
- *msg = NULL;
+ *msg_out = NULL;
if (!strcmp(key, "all")) {
- routerlist_t *rl = router_get_routerlist();
- SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r,
- smartlist_add(fps_out,
- tor_memdup(r->cache_info.identity_digest, DIGEST_LEN)));
- /* Treat "all" requests as if they were unencrypted */
- for_unencrypted_conn = 1;
+ const routerlist_t *rl = router_get_routerlist();
+ SMARTLIST_FOREACH_BEGIN(rl->routers, const routerinfo_t *, r) {
+ spooled_resource_t *spooled;
+ spooled = spooled_resource_new(source,
+ (const uint8_t *)r->cache_info.identity_digest,
+ DIGEST_LEN);
+ /* Treat "all" requests as if they were unencrypted */
+ conn_is_encrypted = 0;
+ smartlist_add(spool_out, spooled);
+ } SMARTLIST_FOREACH_END(r);
} else if (!strcmp(key, "authority")) {
const routerinfo_t *ri = router_get_my_routerinfo();
if (ri)
- smartlist_add(fps_out,
- tor_memdup(ri->cache_info.identity_digest, DIGEST_LEN));
+ smartlist_add(spool_out,
+ spooled_resource_new(source,
+ (const uint8_t *)ri->cache_info.identity_digest,
+ DIGEST_LEN));
} else if (!strcmpstart(key, "d/")) {
- by_id = 0;
key += strlen("d/");
- dir_split_resource_into_fingerprints(key, fps_out, NULL,
- DSR_HEX|DSR_SORT_UNIQ);
+ dir_split_resource_into_spoolable(key, source, spool_out, NULL,
+ DSR_HEX|DSR_SORT_UNIQ);
} else if (!strcmpstart(key, "fp/")) {
key += strlen("fp/");
- dir_split_resource_into_fingerprints(key, fps_out, NULL,
- DSR_HEX|DSR_SORT_UNIQ);
+ dir_split_resource_into_spoolable(key, source, spool_out, NULL,
+ DSR_HEX|DSR_SORT_UNIQ);
} else {
- *msg = "Key not recognized";
+ *msg_out = "Not found";
return -1;
}
- if (for_unencrypted_conn) {
+ if (! conn_is_encrypted) {
/* Remove anything that insists it not be sent unencrypted. */
- SMARTLIST_FOREACH_BEGIN(fps_out, char *, cp) {
- const signed_descriptor_t *sd;
- if (by_id)
- sd = get_signed_descriptor_by_fp(cp,is_extrainfo,0);
- else if (is_extrainfo)
- sd = extrainfo_get_by_descriptor_digest(cp);
- else
- sd = router_get_by_descriptor_digest(cp);
- if (sd && !sd->send_unencrypted) {
- tor_free(cp);
- SMARTLIST_DEL_CURRENT(fps_out, cp);
- }
- } SMARTLIST_FOREACH_END(cp);
+ SMARTLIST_FOREACH_BEGIN(spool_out, spooled_resource_t *, spooled) {
+ const uint8_t *body = NULL;
+ size_t bodylen = 0;
+ int r = spooled_resource_lookup_body(spooled, conn_is_encrypted,
+ &body, &bodylen, NULL);
+ if (r < 0 || body == NULL || bodylen == 0) {
+ SMARTLIST_DEL_CURRENT(spool_out, spooled);
+ spooled_resource_free(spooled);
+ }
+ } SMARTLIST_FOREACH_END(spooled);
}
- if (!smartlist_len(fps_out)) {
- *msg = "Servers unavailable";
+ if (!smartlist_len(spool_out)) {
+ *msg_out = "Servers unavailable";
return -1;
}
return 0;
@@ -3352,410 +3374,497 @@ dirserv_test_reachability(time_t now)
ctr = (ctr + 1) % REACHABILITY_MODULO_PER_TEST; /* increment ctr */
}
-/** Given a fingerprint <b>fp</b> which is either set if we're looking for a
- * v2 status, or zeroes if we're looking for a v3 status, or a NUL-padded
- * flavor name if we want a flavored v3 status, return a pointer to the
- * appropriate cached dir object, or NULL if there isn't one available. */
-static cached_dir_t *
-lookup_cached_dir_by_fp(const char *fp)
+/* ==========
+ * Spooling code.
+ * ========== */
+
+spooled_resource_t *
+spooled_resource_new(dir_spool_source_t source,
+ const uint8_t *digest, size_t digestlen)
{
- cached_dir_t *d = NULL;
- if (tor_digest_is_zero(fp) && cached_consensuses) {
- d = strmap_get(cached_consensuses, "ns");
- } else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses &&
- (d = strmap_get(cached_consensuses, fp))) {
- /* this here interface is a nasty hack XXXX */;
+ spooled_resource_t *spooled = tor_malloc_zero(sizeof(spooled_resource_t));
+ spooled->spool_source = source;
+ switch (source) {
+ case DIR_SPOOL_NETWORKSTATUS:
+ spooled->spool_eagerly = 0;
+ break;
+ case DIR_SPOOL_SERVER_BY_DIGEST:
+ case DIR_SPOOL_SERVER_BY_FP:
+ case DIR_SPOOL_EXTRA_BY_DIGEST:
+ case DIR_SPOOL_EXTRA_BY_FP:
+ case DIR_SPOOL_MICRODESC:
+ default:
+ spooled->spool_eagerly = 1;
+ break;
+ case DIR_SPOOL_CONSENSUS_CACHE_ENTRY:
+ tor_assert_unreached();
+ break;
}
- return d;
+ tor_assert(digestlen <= sizeof(spooled->digest));
+ if (digest)
+ memcpy(spooled->digest, digest, digestlen);
+ return spooled;
}
-/** Remove from <b>fps</b> every networkstatus key where both
- * a) we have a networkstatus document and
- * b) it is not newer than <b>cutoff</b>.
+/**
+ * Create a new spooled_resource_t to spool the contents of <b>entry</b> to
+ * the user. Return the spooled object on success, or NULL on failure (which
+ * is probably caused by a failure to map the body of the item from disk).
*
- * Return 1 if any items were present at all; else return 0.
+ * Adds a reference to entry's reference counter.
*/
-int
-dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff)
-{
- int found_any = 0;
- SMARTLIST_FOREACH_BEGIN(fps, char *, digest) {
- cached_dir_t *d = lookup_cached_dir_by_fp(digest);
- if (!d)
- continue;
- found_any = 1;
- if (d->published <= cutoff) {
- tor_free(digest);
- SMARTLIST_DEL_CURRENT(fps, digest);
- }
- } SMARTLIST_FOREACH_END(digest);
-
- return found_any;
+spooled_resource_t *
+spooled_resource_new_from_cache_entry(consensus_cache_entry_t *entry)
+{
+ spooled_resource_t *spooled = tor_malloc_zero(sizeof(spooled_resource_t));
+ spooled->spool_source = DIR_SPOOL_CONSENSUS_CACHE_ENTRY;
+ spooled->spool_eagerly = 0;
+ consensus_cache_entry_incref(entry);
+ spooled->consensus_cache_entry = entry;
+
+ int r = consensus_cache_entry_get_body(entry,
+ &spooled->cce_body,
+ &spooled->cce_len);
+ if (r == 0) {
+ return spooled;
+ } else {
+ spooled_resource_free(spooled);
+ return NULL;
+ }
}
-/** Return the cache-info for identity fingerprint <b>fp</b>, or
- * its extra-info document if <b>extrainfo</b> is true. Return
- * NULL if not found or if the descriptor is older than
- * <b>publish_cutoff</b>. */
-static const signed_descriptor_t *
-get_signed_descriptor_by_fp(const char *fp, int extrainfo,
- time_t publish_cutoff)
+/** Release all storage held by <b>spooled</b>. */
+void
+spooled_resource_free(spooled_resource_t *spooled)
{
- if (router_digest_is_me(fp)) {
- if (extrainfo)
- return &(router_get_my_extrainfo()->cache_info);
- else
- return &(router_get_my_routerinfo()->cache_info);
- } else {
- const routerinfo_t *ri = router_get_by_id_digest(fp);
- if (ri &&
- ri->cache_info.published_on > publish_cutoff) {
- if (extrainfo)
- return extrainfo_get_by_descriptor_digest(
- ri->cache_info.extra_info_digest);
- else
- return &ri->cache_info;
- }
+ if (spooled == NULL)
+ return;
+
+ if (spooled->cached_dir_ref) {
+ cached_dir_decref(spooled->cached_dir_ref);
}
- return NULL;
-}
-/** Return true iff we have any of the documents (extrainfo or routerdesc)
- * specified by the fingerprints in <b>fps</b> and <b>spool_src</b>. Used to
- * decide whether to send a 404. */
-int
-dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src)
-{
- time_t publish_cutoff = time(NULL)-ROUTER_MAX_AGE_TO_PUBLISH;
- SMARTLIST_FOREACH_BEGIN(fps, const char *, fp) {
- switch (spool_src)
- {
- case DIR_SPOOL_EXTRA_BY_DIGEST:
- if (extrainfo_get_by_descriptor_digest(fp)) return 1;
- break;
- case DIR_SPOOL_SERVER_BY_DIGEST:
- if (router_get_by_descriptor_digest(fp)) return 1;
- break;
- case DIR_SPOOL_EXTRA_BY_FP:
- case DIR_SPOOL_SERVER_BY_FP:
- if (get_signed_descriptor_by_fp(fp,
- spool_src == DIR_SPOOL_EXTRA_BY_FP, publish_cutoff))
- return 1;
- break;
- }
- } SMARTLIST_FOREACH_END(fp);
- return 0;
+ if (spooled->consensus_cache_entry) {
+ consensus_cache_entry_decref(spooled->consensus_cache_entry);
+ }
+
+ tor_free(spooled);
}
-/** Return true iff any of the 256-bit elements in <b>fps</b> is the digest of
- * a microdescriptor we have. */
-int
-dirserv_have_any_microdesc(const smartlist_t *fps)
+/** When spooling data from a cached_dir_t object, we always add
+ * at least this much. */
+#define DIRSERV_CACHED_DIR_CHUNK_SIZE 8192
+
+/** Return an compression ratio for compressing objects from <b>source</b>.
+ */
+static double
+estimate_compression_ratio(dir_spool_source_t source)
{
- microdesc_cache_t *cache = get_microdesc_cache();
- SMARTLIST_FOREACH(fps, const char *, fp,
- if (microdesc_cache_lookup_by_digest256(cache, fp))
- return 1);
- return 0;
+ /* We should put in better estimates here, depending on the number of
+ objects and their type */
+ (void) source;
+ return 0.5;
}
-/** Return an approximate estimate of the number of bytes that will
- * be needed to transmit the server descriptors (if is_serverdescs --
- * they can be either d/ or fp/ queries) or networkstatus objects (if
- * !is_serverdescs) listed in <b>fps</b>. If <b>compressed</b> is set,
- * we guess how large the data will be after compression.
+/** Return an estimated number of bytes needed for transmitting the
+ * resource in <b>spooled</b> on <b>conn</b>
*
- * The return value is an estimate; it might be larger or smaller.
- **/
-size_t
-dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs,
- int compressed)
-{
- size_t result;
- tor_assert(fps);
- if (is_serverdescs) {
- int n = smartlist_len(fps);
- const routerinfo_t *me = router_get_my_routerinfo();
- result = (me?me->cache_info.signed_descriptor_len:2048) * n;
- if (compressed)
- result /= 2; /* observed compressibility is between 35 and 55%. */
+ * As a convenient side-effect, set *<b>published_out</b> to the resource's
+ * publication time.
+ */
+static size_t
+spooled_resource_estimate_size(const spooled_resource_t *spooled,
+ dir_connection_t *conn,
+ int compressed,
+ time_t *published_out)
+{
+ if (spooled->spool_eagerly) {
+ const uint8_t *body = NULL;
+ size_t bodylen = 0;
+ int r = spooled_resource_lookup_body(spooled,
+ connection_dir_is_encrypted(conn),
+ &body, &bodylen,
+ published_out);
+ if (r == -1 || body == NULL || bodylen == 0)
+ return 0;
+ if (compressed) {
+ double ratio = estimate_compression_ratio(spooled->spool_source);
+ bodylen = (size_t)(bodylen * ratio);
+ }
+ return bodylen;
} else {
- result = 0;
- SMARTLIST_FOREACH(fps, const char *, digest, {
- cached_dir_t *dir = lookup_cached_dir_by_fp(digest);
- if (dir)
- result += compressed ? dir->dir_z_len : dir->dir_len;
- });
+ cached_dir_t *cached;
+ if (spooled->consensus_cache_entry) {
+ return spooled->cce_len;
+ }
+ if (spooled->cached_dir_ref) {
+ cached = spooled->cached_dir_ref;
+ } else {
+ cached = spooled_resource_lookup_cached_dir(spooled,
+ published_out);
+ }
+ if (cached == NULL) {
+ return 0;
+ }
+ size_t result = compressed ? cached->dir_z_len : cached->dir_len;
+ return result;
}
- return result;
}
-/** Given a list of microdescriptor hashes, guess how many bytes will be
- * needed to transmit them, and return the guess. */
-size_t
-dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed)
-{
- size_t result = smartlist_len(fps) * microdesc_average_size(NULL);
- if (compressed)
- result /= 2;
- return result;
-}
+/** Return code for spooled_resource_flush_some */
+typedef enum {
+ SRFS_ERR = -1,
+ SRFS_MORE = 0,
+ SRFS_DONE
+} spooled_resource_flush_status_t;
-/** When we're spooling data onto our outbuf, add more whenever we dip
- * below this threshold. */
-#define DIRSERV_BUFFER_MIN 16384
+/** Flush some or all of the bytes from <b>spooled</b> onto <b>conn</b>.
+ * Return SRFS_ERR on error, SRFS_MORE if there are more bytes to flush from
+ * this spooled resource, or SRFS_DONE if we are done flushing this spooled
+ * resource.
+ */
+static spooled_resource_flush_status_t
+spooled_resource_flush_some(spooled_resource_t *spooled,
+ dir_connection_t *conn)
+{
+ if (spooled->spool_eagerly) {
+ /* Spool_eagerly resources are sent all-at-once. */
+ const uint8_t *body = NULL;
+ size_t bodylen = 0;
+ int r = spooled_resource_lookup_body(spooled,
+ connection_dir_is_encrypted(conn),
+ &body, &bodylen, NULL);
+ if (r == -1 || body == NULL || bodylen == 0) {
+ /* Absent objects count as "done". */
+ return SRFS_DONE;
+ }
+ if (conn->compress_state) {
+ connection_write_to_buf_compress((const char*)body, bodylen, conn, 0);
+ } else {
+ connection_write_to_buf((const char*)body, bodylen, TO_CONN(conn));
+ }
+ return SRFS_DONE;
+ } else {
+ cached_dir_t *cached = spooled->cached_dir_ref;
+ consensus_cache_entry_t *cce = spooled->consensus_cache_entry;
+ if (cached == NULL && cce == NULL) {
+ /* The cached_dir_t hasn't been materialized yet. So let's look it up. */
+ cached = spooled->cached_dir_ref =
+ spooled_resource_lookup_cached_dir(spooled, NULL);
+ if (!cached) {
+ /* Absent objects count as done. */
+ return SRFS_DONE;
+ }
+ ++cached->refcnt;
+ tor_assert_nonfatal(spooled->cached_dir_offset == 0);
+ }
-/** Spooling helper: called when we have no more data to spool to <b>conn</b>.
- * Flushes any remaining data to be (un)compressed, and changes the spool
- * source to NONE. Returns 0 on success, negative on failure. */
-static int
-connection_dirserv_finish_spooling(dir_connection_t *conn)
-{
- if (conn->zlib_state) {
- connection_write_to_buf_zlib("", 0, conn, 1);
- tor_zlib_free(conn->zlib_state);
- conn->zlib_state = NULL;
+ if (BUG(!cached && !cce))
+ return SRFS_DONE;
+
+ int64_t total_len;
+ const char *ptr;
+ if (cached) {
+ total_len = cached->dir_z_len;
+ ptr = cached->dir_z;
+ } else {
+ total_len = spooled->cce_len;
+ ptr = (const char *)spooled->cce_body;
+ }
+ /* How many bytes left to flush? */
+ int64_t remaining;
+ remaining = total_len - spooled->cached_dir_offset;
+ if (BUG(remaining < 0))
+ return SRFS_ERR;
+ ssize_t bytes = (ssize_t) MIN(DIRSERV_CACHED_DIR_CHUNK_SIZE, remaining);
+ if (conn->compress_state) {
+ connection_write_to_buf_compress(
+ ptr + spooled->cached_dir_offset,
+ bytes, conn, 0);
+ } else {
+ connection_write_to_buf(ptr + spooled->cached_dir_offset,
+ bytes, TO_CONN(conn));
+ }
+ spooled->cached_dir_offset += bytes;
+ if (spooled->cached_dir_offset >= (off_t)total_len) {
+ return SRFS_DONE;
+ } else {
+ return SRFS_MORE;
+ }
}
- conn->dir_spool_src = DIR_SPOOL_NONE;
- return 0;
}
-/** Spooling helper: called when we're sending a bunch of server descriptors,
- * and the outbuf has become too empty. Pulls some entries from
- * fingerprint_stack, and writes the corresponding servers onto outbuf. If we
- * run out of entries, flushes the zlib state and sets the spool source to
- * NONE. Returns 0 on success, negative on failure.
+/** Helper: find the cached_dir_t for a spooled_resource_t, for
+ * sending it to <b>conn</b>. Set *<b>published_out</b>, if provided,
+ * to the published time of the cached_dir_t.
+ *
+ * DOES NOT increase the reference count on the result. Callers must do that
+ * themselves if they mean to hang on to it.
*/
+static cached_dir_t *
+spooled_resource_lookup_cached_dir(const spooled_resource_t *spooled,
+ time_t *published_out)
+{
+ tor_assert(spooled->spool_eagerly == 0);
+ cached_dir_t *d = lookup_cached_dir_by_fp(spooled->digest);
+ if (d != NULL) {
+ if (published_out)
+ *published_out = d->published;
+ }
+ return d;
+}
+
+/** Helper: Look up the body for an eagerly-served spooled_resource. If
+ * <b>conn_is_encrypted</b> is false, don't look up any resource that
+ * shouldn't be sent over an unencrypted connection. On success, set
+ * <b>body_out</b>, <b>size_out</b>, and <b>published_out</b> to refer
+ * to the resource's body, size, and publication date, and return 0.
+ * On failure return -1. */
static int
-connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn)
+spooled_resource_lookup_body(const spooled_resource_t *spooled,
+ int conn_is_encrypted,
+ const uint8_t **body_out,
+ size_t *size_out,
+ time_t *published_out)
{
- int by_fp = (conn->dir_spool_src == DIR_SPOOL_SERVER_BY_FP ||
- conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_FP);
- int extra = (conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_FP ||
- conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_DIGEST);
- time_t publish_cutoff = time(NULL)-ROUTER_MAX_AGE_TO_PUBLISH;
+ tor_assert(spooled->spool_eagerly == 1);
- const or_options_t *options = get_options();
+ const signed_descriptor_t *sd = NULL;
- while (smartlist_len(conn->fingerprint_stack) &&
- connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) {
- const char *body;
- char *fp = smartlist_pop_last(conn->fingerprint_stack);
- const signed_descriptor_t *sd = NULL;
- if (by_fp) {
- sd = get_signed_descriptor_by_fp(fp, extra, publish_cutoff);
- } else {
- sd = extra ? extrainfo_get_by_descriptor_digest(fp)
- : router_get_by_descriptor_digest(fp);
+ switch (spooled->spool_source) {
+ case DIR_SPOOL_EXTRA_BY_FP: {
+ sd = get_signed_descriptor_by_fp(spooled->digest, 1);
+ break;
}
- tor_free(fp);
- if (!sd)
- continue;
- if (!connection_dir_is_encrypted(conn) && !sd->send_unencrypted) {
- /* we did this check once before (so we could have an accurate size
- * estimate and maybe send a 404 if somebody asked for only bridges on a
- * connection), but we need to do it again in case a previously
- * unknown bridge descriptor has shown up between then and now. */
- continue;
+ case DIR_SPOOL_SERVER_BY_FP: {
+ sd = get_signed_descriptor_by_fp(spooled->digest, 0);
+ break;
}
-
- /** If we are the bridge authority and the descriptor is a bridge
- * descriptor, remember that we served this descriptor for desc stats. */
- if (options->BridgeAuthoritativeDir && by_fp) {
- const routerinfo_t *router =
- router_get_by_id_digest(sd->identity_digest);
- /* router can be NULL here when the bridge auth is asked for its own
- * descriptor. */
- if (router && router->purpose == ROUTER_PURPOSE_BRIDGE)
- rep_hist_note_desc_served(sd->identity_digest);
+ case DIR_SPOOL_SERVER_BY_DIGEST: {
+ sd = router_get_by_descriptor_digest((const char *)spooled->digest);
+ break;
+ }
+ case DIR_SPOOL_EXTRA_BY_DIGEST: {
+ sd = extrainfo_get_by_descriptor_digest((const char *)spooled->digest);
+ break;
}
- body = signed_descriptor_get_body(sd);
- if (conn->zlib_state) {
- int last = ! smartlist_len(conn->fingerprint_stack);
- connection_write_to_buf_zlib(body, sd->signed_descriptor_len, conn,
- last);
- if (last) {
- tor_zlib_free(conn->zlib_state);
- conn->zlib_state = NULL;
+ case DIR_SPOOL_MICRODESC: {
+ microdesc_t *md = microdesc_cache_lookup_by_digest256(
+ get_microdesc_cache(),
+ (const char *)spooled->digest);
+ if (! md || ! md->body) {
+ return -1;
}
- } else {
- connection_write_to_buf(body,
- sd->signed_descriptor_len,
- TO_CONN(conn));
+ *body_out = (const uint8_t *)md->body;
+ *size_out = md->bodylen;
+ if (published_out)
+ *published_out = TIME_MAX;
+ return 0;
}
+ case DIR_SPOOL_NETWORKSTATUS:
+ case DIR_SPOOL_CONSENSUS_CACHE_ENTRY:
+ default:
+ /* LCOV_EXCL_START */
+ tor_assert_nonfatal_unreached();
+ return -1;
+ /* LCOV_EXCL_STOP */
}
- if (!smartlist_len(conn->fingerprint_stack)) {
- /* We just wrote the last one; finish up. */
- if (conn->zlib_state) {
- connection_write_to_buf_zlib("", 0, conn, 1);
- tor_zlib_free(conn->zlib_state);
- conn->zlib_state = NULL;
- }
- conn->dir_spool_src = DIR_SPOOL_NONE;
- smartlist_free(conn->fingerprint_stack);
- conn->fingerprint_stack = NULL;
+ /* If we get here, then we tried to set "sd" to a signed_descriptor_t. */
+
+ if (sd == NULL) {
+ return -1;
+ }
+ if (sd->send_unencrypted == 0 && ! conn_is_encrypted) {
+ /* we did this check once before (so we could have an accurate size
+ * estimate and maybe send a 404 if somebody asked for only bridges on
+ * a connection), but we need to do it again in case a previously
+ * unknown bridge descriptor has shown up between then and now. */
+ return -1;
}
+ *body_out = (const uint8_t *) signed_descriptor_get_body(sd);
+ *size_out = sd->signed_descriptor_len;
+ if (published_out)
+ *published_out = sd->published_on;
return 0;
}
-/** Spooling helper: called when we're sending a bunch of microdescriptors,
- * and the outbuf has become too empty. Pulls some entries from
- * fingerprint_stack, and writes the corresponding microdescs onto outbuf. If
- * we run out of entries, flushes the zlib state and sets the spool source to
- * NONE. Returns 0 on success, negative on failure.
- */
-static int
-connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn)
-{
- microdesc_cache_t *cache = get_microdesc_cache();
- while (smartlist_len(conn->fingerprint_stack) &&
- connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) {
- char *fp256 = smartlist_pop_last(conn->fingerprint_stack);
- microdesc_t *md = microdesc_cache_lookup_by_digest256(cache, fp256);
- tor_free(fp256);
- if (!md || !md->body)
- continue;
- if (conn->zlib_state) {
- int last = !smartlist_len(conn->fingerprint_stack);
- connection_write_to_buf_zlib(md->body, md->bodylen, conn, last);
- if (last) {
- tor_zlib_free(conn->zlib_state);
- conn->zlib_state = NULL;
- }
- } else {
- connection_write_to_buf(md->body, md->bodylen, TO_CONN(conn));
- }
- }
- if (!smartlist_len(conn->fingerprint_stack)) {
- if (conn->zlib_state) {
- connection_write_to_buf_zlib("", 0, conn, 1);
- tor_zlib_free(conn->zlib_state);
- conn->zlib_state = NULL;
- }
- conn->dir_spool_src = DIR_SPOOL_NONE;
- smartlist_free(conn->fingerprint_stack);
- conn->fingerprint_stack = NULL;
+/** Given a fingerprint <b>fp</b> which is either set if we're looking for a
+ * v2 status, or zeroes if we're looking for a v3 status, or a NUL-padded
+ * flavor name if we want a flavored v3 status, return a pointer to the
+ * appropriate cached dir object, or NULL if there isn't one available. */
+static cached_dir_t *
+lookup_cached_dir_by_fp(const uint8_t *fp)
+{
+ cached_dir_t *d = NULL;
+ if (tor_digest_is_zero((const char *)fp) && cached_consensuses) {
+ d = strmap_get(cached_consensuses, "ns");
+ } else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses) {
+ /* this here interface is a nasty hack: we're shoving a flavor into
+ * a digest field. */
+ d = strmap_get(cached_consensuses, (const char *)fp);
}
- return 0;
+ return d;
}
-/** Spooling helper: Called when we're sending a directory or networkstatus,
- * and the outbuf has become too empty. Pulls some bytes from
- * <b>conn</b>-\>cached_dir-\>dir_z, uncompresses them if appropriate, and
- * puts them on the outbuf. If we run out of entries, flushes the zlib state
- * and sets the spool source to NONE. Returns 0 on success, negative on
- * failure. */
-static int
-connection_dirserv_add_dir_bytes_to_outbuf(dir_connection_t *conn)
-{
- ssize_t bytes;
- int64_t remaining;
-
- bytes = DIRSERV_BUFFER_MIN - connection_get_outbuf_len(TO_CONN(conn));
- tor_assert(bytes > 0);
- tor_assert(conn->cached_dir);
- if (bytes < 8192)
- bytes = 8192;
- remaining = conn->cached_dir->dir_z_len - conn->cached_dir_offset;
- if (bytes > remaining)
- bytes = (ssize_t) remaining;
-
- if (conn->zlib_state) {
- connection_write_to_buf_zlib(
- conn->cached_dir->dir_z + conn->cached_dir_offset,
- bytes, conn, bytes == remaining);
- } else {
- connection_write_to_buf(conn->cached_dir->dir_z + conn->cached_dir_offset,
- bytes, TO_CONN(conn));
+/** Try to guess the number of bytes that will be needed to send the
+ * spooled objects for <b>conn</b>'s outgoing spool. In the process,
+ * remove every element of the spool that refers to an absent object, or
+ * which was published earlier than <b>cutoff</b>. Set *<b>size_out</b>
+ * to the number of bytes, and *<b>n_expired_out</b> to the number of
+ * objects removed for being too old. */
+void
+dirserv_spool_remove_missing_and_guess_size(dir_connection_t *conn,
+ time_t cutoff,
+ int compression,
+ size_t *size_out,
+ int *n_expired_out)
+{
+ if (BUG(!conn))
+ return;
+
+ smartlist_t *spool = conn->spool;
+ if (!spool) {
+ if (size_out)
+ *size_out = 0;
+ if (n_expired_out)
+ *n_expired_out = 0;
+ return;
}
- conn->cached_dir_offset += bytes;
- if (conn->cached_dir_offset == (int)conn->cached_dir->dir_z_len) {
- /* We just wrote the last one; finish up. */
- connection_dirserv_finish_spooling(conn);
- cached_dir_decref(conn->cached_dir);
- conn->cached_dir = NULL;
+ int n_expired = 0;
+ uint64_t total = 0;
+ SMARTLIST_FOREACH_BEGIN(spool, spooled_resource_t *, spooled) {
+ time_t published = TIME_MAX;
+ size_t sz = spooled_resource_estimate_size(spooled, conn,
+ compression, &published);
+ if (published < cutoff) {
+ ++n_expired;
+ SMARTLIST_DEL_CURRENT(spool, spooled);
+ spooled_resource_free(spooled);
+ } else if (sz == 0) {
+ SMARTLIST_DEL_CURRENT(spool, spooled);
+ spooled_resource_free(spooled);
+ } else {
+ total += sz;
+ }
+ } SMARTLIST_FOREACH_END(spooled);
+
+ if (size_out) {
+ *size_out = (total > SIZE_MAX) ? SIZE_MAX : (size_t)total;
}
- return 0;
+ if (n_expired_out)
+ *n_expired_out = n_expired;
}
-/** Spooling helper: Called when we're spooling networkstatus objects on
- * <b>conn</b>, and the outbuf has become too empty. If the current
- * networkstatus object (in <b>conn</b>-\>cached_dir) has more data, pull data
- * from there. Otherwise, pop the next fingerprint from fingerprint_stack,
- * and start spooling the next networkstatus. (A digest of all 0 bytes is
- * treated as a request for the current consensus.) If we run out of entries,
- * flushes the zlib state and sets the spool source to NONE. Returns 0 on
- * success, negative on failure. */
+/** Helper: used to sort a connection's spool. */
static int
-connection_dirserv_add_networkstatus_bytes_to_outbuf(dir_connection_t *conn)
-{
-
- while (connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) {
- if (conn->cached_dir) {
- int uncompressing = (conn->zlib_state != NULL);
- int r = connection_dirserv_add_dir_bytes_to_outbuf(conn);
- if (conn->dir_spool_src == DIR_SPOOL_NONE) {
- /* add_dir_bytes thinks we're done with the cached_dir. But we
- * may have more cached_dirs! */
- conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS;
- /* This bit is tricky. If we were uncompressing the last
- * networkstatus, we may need to make a new zlib object to
- * uncompress the next one. */
- if (uncompressing && ! conn->zlib_state &&
- conn->fingerprint_stack &&
- smartlist_len(conn->fingerprint_stack)) {
- conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION);
- }
- }
- if (r) return r;
- } else if (conn->fingerprint_stack &&
- smartlist_len(conn->fingerprint_stack)) {
- /* Add another networkstatus; start serving it. */
- char *fp = smartlist_pop_last(conn->fingerprint_stack);
- cached_dir_t *d = lookup_cached_dir_by_fp(fp);
- tor_free(fp);
- if (d) {
- ++d->refcnt;
- conn->cached_dir = d;
- conn->cached_dir_offset = 0;
- }
- } else {
- connection_dirserv_finish_spooling(conn);
- smartlist_free(conn->fingerprint_stack);
- conn->fingerprint_stack = NULL;
- return 0;
+dirserv_spool_sort_comparison_(const void **a_, const void **b_)
+{
+ const spooled_resource_t *a = *a_;
+ const spooled_resource_t *b = *b_;
+ return fast_memcmp(a->digest, b->digest, sizeof(a->digest));
+}
+
+/** Sort all the entries in <b>conn</b> by digest. */
+void
+dirserv_spool_sort(dir_connection_t *conn)
+{
+ if (conn->spool == NULL)
+ return;
+ smartlist_sort(conn->spool, dirserv_spool_sort_comparison_);
+}
+
+/** Return the cache-info for identity fingerprint <b>fp</b>, or
+ * its extra-info document if <b>extrainfo</b> is true. Return
+ * NULL if not found or if the descriptor is older than
+ * <b>publish_cutoff</b>. */
+static const signed_descriptor_t *
+get_signed_descriptor_by_fp(const uint8_t *fp, int extrainfo)
+{
+ if (router_digest_is_me((const char *)fp)) {
+ if (extrainfo)
+ return &(router_get_my_extrainfo()->cache_info);
+ else
+ return &(router_get_my_routerinfo()->cache_info);
+ } else {
+ const routerinfo_t *ri = router_get_by_id_digest((const char *)fp);
+ if (ri) {
+ if (extrainfo)
+ return extrainfo_get_by_descriptor_digest(
+ ri->cache_info.extra_info_digest);
+ else
+ return &ri->cache_info;
}
}
- return 0;
+ return NULL;
}
-/** Called whenever we have flushed some directory data in state
- * SERVER_WRITING. */
+/** When we're spooling data onto our outbuf, add more whenever we dip
+ * below this threshold. */
+#define DIRSERV_BUFFER_MIN 16384
+
+/**
+ * Called whenever we have flushed some directory data in state
+ * SERVER_WRITING, or whenever we want to fill the buffer with initial
+ * directory data (so that subsequent writes will occur, and trigger this
+ * function again.)
+ *
+ * Return 0 on success, and -1 on failure.
+ */
int
connection_dirserv_flushed_some(dir_connection_t *conn)
{
tor_assert(conn->base_.state == DIR_CONN_STATE_SERVER_WRITING);
-
- if (connection_get_outbuf_len(TO_CONN(conn)) >= DIRSERV_BUFFER_MIN)
+ if (conn->spool == NULL)
return 0;
- switch (conn->dir_spool_src) {
- case DIR_SPOOL_EXTRA_BY_DIGEST:
- case DIR_SPOOL_EXTRA_BY_FP:
- case DIR_SPOOL_SERVER_BY_DIGEST:
- case DIR_SPOOL_SERVER_BY_FP:
- return connection_dirserv_add_servers_to_outbuf(conn);
- case DIR_SPOOL_MICRODESC:
- return connection_dirserv_add_microdescs_to_outbuf(conn);
- case DIR_SPOOL_CACHED_DIR:
- return connection_dirserv_add_dir_bytes_to_outbuf(conn);
- case DIR_SPOOL_NETWORKSTATUS:
- return connection_dirserv_add_networkstatus_bytes_to_outbuf(conn);
- case DIR_SPOOL_NONE:
- default:
+ while (connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN &&
+ smartlist_len(conn->spool)) {
+ spooled_resource_t *spooled =
+ smartlist_get(conn->spool, smartlist_len(conn->spool)-1);
+ spooled_resource_flush_status_t status;
+ status = spooled_resource_flush_some(spooled, conn);
+ if (status == SRFS_ERR) {
+ return -1;
+ } else if (status == SRFS_MORE) {
return 0;
+ }
+ tor_assert(status == SRFS_DONE);
+
+ /* If we're here, we're done flushing this resource. */
+ tor_assert(smartlist_pop_last(conn->spool) == spooled);
+ spooled_resource_free(spooled);
+ }
+
+ if (smartlist_len(conn->spool) > 0) {
+ /* We're still spooling something. */
+ return 0;
+ }
+
+ /* If we get here, we're done. */
+ smartlist_free(conn->spool);
+ conn->spool = NULL;
+ if (conn->compress_state) {
+ /* Flush the compression state: there could be more bytes pending in there,
+ * and we don't want to omit bytes. */
+ connection_write_to_buf_compress("", 0, conn, 1);
+ tor_compress_free(conn->compress_state);
+ conn->compress_state = NULL;
}
+ return 0;
+}
+
+/** Remove every element from <b>conn</b>'s outgoing spool, and delete
+ * the spool. */
+void
+dir_conn_clear_spool(dir_connection_t *conn)
+{
+ if (!conn || ! conn->spool)
+ return;
+ SMARTLIST_FOREACH(conn->spool, spooled_resource_t *, s,
+ spooled_resource_free(s));
+ smartlist_free(conn->spool);
+ conn->spool = NULL;
}
/** Return true iff <b>line</b> is a valid RecommendedPackages line.
diff --git a/src/or/dirserv.h b/src/or/dirserv.h
index e83da5e5ac..480174d5bb 100644
--- a/src/or/dirserv.h
+++ b/src/or/dirserv.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -32,6 +32,61 @@
/** Maximum allowable length of a version line in a networkstatus. */
#define MAX_V_LINE_LEN 128
+/** Ways to convert a spoolable_resource_t to a bunch of bytes. */
+typedef enum dir_spool_source_t {
+ DIR_SPOOL_SERVER_BY_DIGEST=1, DIR_SPOOL_SERVER_BY_FP,
+ DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP,
+ DIR_SPOOL_MICRODESC,
+ DIR_SPOOL_NETWORKSTATUS,
+ DIR_SPOOL_CONSENSUS_CACHE_ENTRY,
+} dir_spool_source_t;
+#define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t)
+
+/** Object to remember the identity of an object that we are spooling,
+ * or about to spool, in response to a directory request.
+ *
+ * (Why do we spool? Because some directory responses are very large,
+ * and we don't want to just shove the complete answer into the output
+ * buffer: that would take a ridiculous amount of RAM.)
+ *
+ * If the spooled resource is relatively small (like microdescriptors,
+ * descriptors, etc), we look them up by ID as needed, and add the whole
+ * thing onto the output buffer at once. If the spooled reseource is
+ * big (like networkstatus documents), we reference-count it, and add it
+ * a few K at a time.
+ */
+typedef struct spooled_resource_t {
+ /**
+ * If true, we add the entire object to the outbuf. If false,
+ * we spool the object a few K at a time.
+ */
+ unsigned spool_eagerly : 1;
+ /**
+ * Tells us what kind of object to get, and how to look it up.
+ */
+ dir_spool_source_bitfield_t spool_source : 7;
+ /**
+ * Tells us the specific object to spool.
+ */
+ uint8_t digest[DIGEST256_LEN];
+ /**
+ * A large object that we're spooling. Holds a reference count. Only
+ * used when spool_eagerly is false.
+ */
+ struct cached_dir_t *cached_dir_ref;
+ /**
+ * A different kind of large object that we might be spooling. Also
+ * reference-counted. Also only used when spool_eagerly is false.
+ */
+ struct consensus_cache_entry_t *consensus_cache_entry;
+ const uint8_t *cce_body;
+ size_t cce_len;
+ /**
+ * The current offset into cached_dir or cce_body. Only used when
+ * spool_eagerly is false */
+ off_t cached_dir_offset;
+} spooled_resource_t;
+
int connection_dirserv_flushed_some(dir_connection_t *conn);
int dirserv_add_own_fingerprint(crypto_pk_t *pk);
@@ -63,12 +118,13 @@ cached_dir_t *dirserv_get_consensus(const char *flavor_name);
void dirserv_set_cached_consensus_networkstatus(const char *consensus,
const char *flavor_name,
const common_digests_t *digests,
+ const uint8_t *sha3_as_signed,
time_t published);
void dirserv_clear_old_networkstatuses(time_t cutoff);
-int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key,
- const char **msg,
- int for_unencrypted_conn,
- int is_extrainfo);
+int dirserv_get_routerdesc_spool(smartlist_t *spools_out, const char *key,
+ dir_spool_source_t source,
+ int conn_is_encrytped,
+ const char **msg_out);
int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
const char **msg);
void dirserv_orconn_tls_done(const tor_addr_t *addr,
@@ -89,13 +145,6 @@ void dirserv_set_node_flags_from_authoritative_status(node_t *node,
uint32_t authstatus);
int dirserv_would_reject_router(const routerstatus_t *rs);
-int dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff);
-int dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src);
-int dirserv_have_any_microdesc(const smartlist_t *fps);
-size_t dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs,
- int compressed);
-size_t dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed);
-
char *routerstatus_format_entry(
const routerstatus_t *rs,
const char *version,
@@ -141,5 +190,19 @@ int dirserv_read_measured_bandwidths(const char *from_file,
int dirserv_read_guardfraction_file(const char *fname,
smartlist_t *vote_routerstatuses);
+spooled_resource_t *spooled_resource_new(dir_spool_source_t source,
+ const uint8_t *digest,
+ size_t digestlen);
+spooled_resource_t *spooled_resource_new_from_cache_entry(
+ struct consensus_cache_entry_t *entry);
+void spooled_resource_free(spooled_resource_t *spooled);
+void dirserv_spool_remove_missing_and_guess_size(dir_connection_t *conn,
+ time_t cutoff,
+ int compression,
+ size_t *size_out,
+ int *n_expired_out);
+void dirserv_spool_sort(dir_connection_t *conn);
+void dir_conn_clear_spool(dir_connection_t *conn);
+
#endif
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index e92d3b49dc..f5e29eb786 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define DIRVOTE_PRIVATE
diff --git a/src/or/dirvote.h b/src/or/dirvote.h
index ac7db69db2..e342dc78ea 100644
--- a/src/or/dirvote.h
+++ b/src/or/dirvote.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/dns.c b/src/or/dns.c
index 7651501ec3..cd84a64758 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/dns.h b/src/or/dns.h
index 951a2a3467..a81cbd20da 100644
--- a/src/or/dns.h
+++ b/src/or/dns.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/dns_structs.h b/src/or/dns_structs.h
index bc6067213d..dc00e9f7b9 100644
--- a/src/or/dns_structs.h
+++ b/src/or/dns_structs.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/dnsserv.c b/src/or/dnsserv.c
index 8768b2a1d1..54a22a5150 100644
--- a/src/or/dnsserv.c
+++ b/src/or/dnsserv.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2016, The Tor Project, Inc. */
+/* Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/dnsserv.h b/src/or/dnsserv.h
index ad0e248c83..6c0643b8dc 100644
--- a/src/or/dnsserv.h
+++ b/src/or/dnsserv.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index 3bb5169355..7a27cd0f44 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -768,11 +768,6 @@ get_sampled_guard_for_bridge(guard_selection_t *gs,
const uint8_t *id = bridge_get_rsa_id_digest(bridge);
const tor_addr_port_t *addrport = bridge_get_addr_port(bridge);
entry_guard_t *guard;
- if (id) {
- guard = get_sampled_guard_with_id(gs, id);
- if (guard)
- return guard;
- }
if (BUG(!addrport))
return NULL; // LCOV_EXCL_LINE
guard = get_sampled_guard_by_bridge_addr(gs, addrport);
@@ -787,16 +782,17 @@ get_sampled_guard_for_bridge(guard_selection_t *gs,
static bridge_info_t *
get_bridge_info_for_guard(const entry_guard_t *guard)
{
+ const uint8_t *identity = NULL;
if (! tor_digest_is_zero(guard->identity)) {
- bridge_info_t *bridge = find_bridge_by_digest(guard->identity);
- if (bridge)
- return bridge;
+ identity = (const uint8_t *)guard->identity;
}
if (BUG(guard->bridge_addr == NULL))
return NULL;
- return get_configured_bridge_by_addr_port_digest(&guard->bridge_addr->addr,
- guard->bridge_addr->port,
- NULL);
+
+ return get_configured_bridge_by_exact_addr_port_digest(
+ &guard->bridge_addr->addr,
+ guard->bridge_addr->port,
+ (const char*)identity);
}
/**
@@ -820,6 +816,10 @@ entry_guard_add_to_sample(guard_selection_t *gs,
log_info(LD_GUARD, "Adding %s as to the entry guard sample set.",
node_describe(node));
+ /* make sure that the guard is not already sampled. */
+ if (BUG(have_sampled_guard_with_id(gs, (const uint8_t*)node->identity)))
+ return NULL; // LCOV_EXCL_LINE
+
return entry_guard_add_to_sample_impl(gs,
(const uint8_t*)node->identity,
node_get_nickname(node),
@@ -843,9 +843,6 @@ entry_guard_add_to_sample_impl(guard_selection_t *gs,
// XXXX #20827 take ed25519 identity here too.
- /* make sure that the guard is not already sampled. */
- if (rsa_id_digest && BUG(have_sampled_guard_with_id(gs, rsa_id_digest)))
- return NULL; // LCOV_EXCL_LINE
/* Make sure we can actually identify the guard. */
if (BUG(!rsa_id_digest && !bridge_addrport))
return NULL; // LCOV_EXCL_LINE
@@ -890,6 +887,10 @@ entry_guard_add_bridge_to_sample(guard_selection_t *gs,
tor_assert(addrport);
+ /* make sure that the guard is not already sampled. */
+ if (BUG(get_sampled_guard_for_bridge(gs, bridge)))
+ return NULL; // LCOV_EXCL_LINE
+
return entry_guard_add_to_sample_impl(gs, id_digest, NULL, addrport);
}
@@ -988,9 +989,11 @@ get_max_sample_size(guard_selection_t *gs,
const int using_bridges = (gs->type == GS_TYPE_BRIDGE);
const int min_sample = get_min_filtered_sample_size();
- /* With bridges, max_sample is "all of them" */
+ /* If we are in bridge mode, expand our sample set as needed without worrying
+ * about max size. We should respect the user's wishes to use many bridges if
+ * that's what they have specified in their configuration file. */
if (using_bridges)
- return n_guards;
+ return INT_MAX;
const int max_sample_by_pct = (int)(n_guards * get_max_sample_threshold());
const int max_sample_absolute = get_max_sample_size_absolute();
@@ -1842,7 +1845,7 @@ select_entry_guard_for_circuit(guard_selection_t *gs,
if (! entry_guard_obeys_restriction(guard, rst))
continue;
if (guard->is_reachable != GUARD_REACHABLE_NO) {
- if (need_descriptor && BUG(!guard_has_descriptor(guard))) {
+ if (need_descriptor && !guard_has_descriptor(guard)) {
continue;
}
*state_out = GUARD_CIRC_STATE_USABLE_ON_COMPLETION;
@@ -2901,13 +2904,7 @@ entry_guard_t *
entry_guard_get_by_id_digest_for_guard_selection(guard_selection_t *gs,
const char *digest)
{
- tor_assert(gs != NULL);
-
- SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, entry,
- if (tor_memeq(digest, entry->identity, DIGEST_LEN))
- return entry;
- );
- return NULL;
+ return get_sampled_guard_with_id(gs, (const uint8_t*)digest);
}
/** Return the node_t associated with a single entry_guard_t. May
@@ -3362,9 +3359,15 @@ guard_selection_have_enough_dir_info_to_build_circuits(guard_selection_t *gs)
if (!gs->primary_guards_up_to_date)
entry_guards_update_primary(gs);
- const int num_primary = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC);
int n_missing_descriptors = 0;
int n_considered = 0;
+ int num_primary_to_check;
+
+ /* We want to check for the descriptor of at least the first two primary
+ * guards in our list, since these are the guards that we typically use for
+ * circuits. */
+ num_primary_to_check = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC);
+ num_primary_to_check++;
SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) {
entry_guard_consider_retry(guard);
@@ -3373,7 +3376,7 @@ guard_selection_have_enough_dir_info_to_build_circuits(guard_selection_t *gs)
n_considered++;
if (!guard_has_descriptor(guard))
n_missing_descriptors++;
- if (n_considered >= num_primary)
+ if (n_considered >= num_primary_to_check)
break;
} SMARTLIST_FOREACH_END(guard);
diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h
index f02901f5d7..400a84269d 100644
--- a/src/or/entrynodes.h
+++ b/src/or/entrynodes.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/ext_orport.c b/src/or/ext_orport.c
index 676adfd8bf..b60d2e55c8 100644
--- a/src/or/ext_orport.c
+++ b/src/or/ext_orport.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/ext_orport.h b/src/or/ext_orport.h
index 33d954e8d0..b2cd05db8f 100644
--- a/src/or/ext_orport.h
+++ b/src/or/ext_orport.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef EXT_ORPORT_H
diff --git a/src/or/fp_pair.c b/src/or/fp_pair.c
index eeeb0f1de3..f730106d06 100644
--- a/src/or/fp_pair.c
+++ b/src/or/fp_pair.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/fp_pair.h b/src/or/fp_pair.h
index b1466581d2..4cea3eda6d 100644
--- a/src/or/fp_pair.h
+++ b/src/or/fp_pair.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/geoip.c b/src/or/geoip.c
index 74811ea643..c76071a152 100644
--- a/src/or/geoip.c
+++ b/src/or/geoip.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2016, The Tor Project, Inc. */
+/* Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/geoip.h b/src/or/geoip.h
index 070296dd07..55ca8ca28c 100644
--- a/src/or/geoip.h
+++ b/src/or/geoip.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/hibernate.c b/src/or/hibernate.c
index c2b3bbb839..f2a4c71764 100644
--- a/src/or/hibernate.c
+++ b/src/or/hibernate.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/hibernate.h b/src/or/hibernate.h
index fa9da6de39..8bdb65a927 100644
--- a/src/or/hibernate.h
+++ b/src/or/hibernate.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/hs_cache.c b/src/or/hs_cache.c
index 43cd8c3258..29681b42b5 100644
--- a/src/or/hs_cache.c
+++ b/src/or/hs_cache.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/hs_cache.h b/src/or/hs_cache.h
index ba95e73338..ed00424234 100644
--- a/src/or/hs_cache.h
+++ b/src/or/hs_cache.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/hs_circuitmap.c b/src/or/hs_circuitmap.c
index 5003b4b593..ea66fb5194 100644
--- a/src/or/hs_circuitmap.c
+++ b/src/or/hs_circuitmap.c
@@ -1,11 +1,12 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
* \file hs_circuitmap.c
*
- * \brief Manage the hidden service circuitmap: A hash table that maps binary
- * tokens to introduction and rendezvous circuits.
+ * \brief Hidden service circuitmap: A hash table that maps binary tokens to
+ * introduction and rendezvous circuits; it's used both by relays acting as
+ * intro points and rendezvous points, and also by hidden services themselves.
**/
#define HS_CIRCUITMAP_PRIVATE
@@ -25,8 +26,8 @@ static struct hs_circuitmap_ht *the_hs_circuitmap = NULL;
/* This is a helper function used by the hash table code (HT_). It returns 1 if
* two circuits have the same HS token. */
static int
-hs_circuits_have_same_token(const or_circuit_t *first_circuit,
- const or_circuit_t *second_circuit)
+hs_circuits_have_same_token(const circuit_t *first_circuit,
+ const circuit_t *second_circuit)
{
const hs_token_t *first_token;
const hs_token_t *second_token;
@@ -57,7 +58,7 @@ hs_circuits_have_same_token(const or_circuit_t *first_circuit,
/* This is a helper function for the hash table code (HT_). It hashes a circuit
* HS token into an unsigned int for use as a key by the hash table routines.*/
static inline unsigned int
-hs_circuit_hash_token(const or_circuit_t *circuit)
+hs_circuit_hash_token(const circuit_t *circuit)
{
tor_assert(circuit->hs_token);
@@ -67,11 +68,11 @@ hs_circuit_hash_token(const or_circuit_t *circuit)
/* Register the circuitmap hash table */
HT_PROTOTYPE(hs_circuitmap_ht, // The name of the hashtable struct
- or_circuit_t, // The name of the element struct,
+ circuit_t, // The name of the element struct,
hs_circuitmap_node, // The name of HT_ENTRY member
hs_circuit_hash_token, hs_circuits_have_same_token)
-HT_GENERATE2(hs_circuitmap_ht, or_circuit_t, hs_circuitmap_node,
+HT_GENERATE2(hs_circuitmap_ht, circuit_t, hs_circuitmap_node,
hs_circuit_hash_token, hs_circuits_have_same_token,
0.6, tor_reallocarray, tor_free_)
@@ -116,13 +117,13 @@ hs_token_free(hs_token_t *hs_token)
}
/** Return the circuit from the circuitmap with token <b>search_token</b>. */
-static or_circuit_t *
+static circuit_t *
get_circuit_with_token(hs_token_t *search_token)
{
tor_assert(the_hs_circuitmap);
/* We use a dummy circuit object for the hash table search routine. */
- or_circuit_t search_circ;
+ circuit_t search_circ;
search_circ.hs_token = search_token;
return HT_FIND(hs_circuitmap_ht, the_hs_circuitmap, &search_circ);
}
@@ -130,7 +131,7 @@ get_circuit_with_token(hs_token_t *search_token)
/* Helper function that registers <b>circ</b> with <b>token</b> on the HS
circuitmap. This function steals reference of <b>token</b>. */
static void
-hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token)
+hs_circuitmap_register_impl(circuit_t *circ, hs_token_t *token)
{
tor_assert(circ);
tor_assert(token);
@@ -145,13 +146,12 @@ hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token)
take precedence over old ones, so that HSes and clients and reestablish
killed circuits without changing the HS token. */
{
- or_circuit_t *found_circ;
+ circuit_t *found_circ;
found_circ = get_circuit_with_token(token);
if (found_circ) {
hs_circuitmap_remove_circuit(found_circ);
- if (!found_circ->base_.marked_for_close) {
- circuit_mark_for_close(TO_CIRCUIT(found_circ),
- END_CIRC_REASON_FINISHED);
+ if (!found_circ->marked_for_close) {
+ circuit_mark_for_close(found_circ, END_CIRC_REASON_FINISHED);
}
}
}
@@ -165,7 +165,7 @@ hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token)
* circuitmap. Use the HS <b>token</b> as the key to the hash table. If
* <b>token</b> is not set, clear the circuit of any HS tokens. */
static void
-hs_circuitmap_register_circuit(or_circuit_t *circ,
+hs_circuitmap_register_circuit(circuit_t *circ,
hs_token_type_t type, size_t token_len,
const uint8_t *token)
{
@@ -178,17 +178,19 @@ hs_circuitmap_register_circuit(or_circuit_t *circ,
hs_circuitmap_register_impl(circ, hs_token);
}
-/* Query circuitmap for circuit with <b>token</b> of size <b>token_len</b>.
- * Only returns a circuit with purpose equal to the <b>wanted_circ_purpose</b>
- * parameter and if it is NOT marked for close. Return NULL if no such circuit
- * is found. */
-static or_circuit_t *
-hs_circuitmap_get_circuit(hs_token_type_t type,
- size_t token_len,
- const uint8_t *token,
- uint8_t wanted_circ_purpose)
+/* Helper function for hs_circuitmap_get_origin_circuit() and
+ * hs_circuitmap_get_or_circuit(). Because only circuit_t are indexed in the
+ * circuitmap, this function returns object type so the specialized functions
+ * using this helper can upcast it to the right type.
+ *
+ * Return NULL if not such circuit is found. */
+static circuit_t *
+hs_circuitmap_get_circuit_impl(hs_token_type_t type,
+ size_t token_len,
+ const uint8_t *token,
+ uint8_t wanted_circ_purpose)
{
- or_circuit_t *found_circ = NULL;
+ circuit_t *found_circ = NULL;
tor_assert(the_hs_circuitmap);
@@ -202,87 +204,247 @@ hs_circuitmap_get_circuit(hs_token_type_t type,
/* Check that the circuit is useful to us */
if (!found_circ ||
- found_circ->base_.purpose != wanted_circ_purpose ||
- found_circ->base_.marked_for_close) {
+ found_circ->purpose != wanted_circ_purpose ||
+ found_circ->marked_for_close) {
return NULL;
}
return found_circ;
}
-/************** Public circuitmap API ****************************************/
+/* Helper function: Query circuitmap for origin circuit with <b>token</b> of
+ * size <b>token_len</b> and <b>type</b>. Only returns a circuit with purpose
+ * equal to the <b>wanted_circ_purpose</b> parameter and if it is NOT marked
+ * for close. Return NULL if no such circuit is found. */
+static origin_circuit_t *
+hs_circuitmap_get_origin_circuit(hs_token_type_t type,
+ size_t token_len,
+ const uint8_t *token,
+ uint8_t wanted_circ_purpose)
+{
+ circuit_t *circ;
+ tor_assert(token);
+ tor_assert(CIRCUIT_PURPOSE_IS_ORIGIN(wanted_circ_purpose));
-/* Public function: Return v3 introduction circuit with <b>auth_key</b>. Return
- * NULL if no such circuit is found in the circuitmap. */
-or_circuit_t *
-hs_circuitmap_get_intro_circ_v3(const ed25519_public_key_t *auth_key)
+ circ = hs_circuitmap_get_circuit_impl(type, token_len, token,
+ wanted_circ_purpose);
+ if (!circ) {
+ return NULL;
+ }
+
+ tor_assert(CIRCUIT_IS_ORIGIN(circ));
+ return TO_ORIGIN_CIRCUIT(circ);
+}
+
+/* Helper function: Query circuitmap for OR circuit with <b>token</b> of size
+ * <b>token_len</b> and <b>type</b>. Only returns a circuit with purpose equal
+ * to the <b>wanted_circ_purpose</b> parameter and if it is NOT marked for
+ * close. Return NULL if no such circuit is found. */
+static or_circuit_t *
+hs_circuitmap_get_or_circuit(hs_token_type_t type,
+ size_t token_len,
+ const uint8_t *token,
+ uint8_t wanted_circ_purpose)
{
- tor_assert(auth_key);
+ circuit_t *circ;
+ tor_assert(token);
+ tor_assert(!CIRCUIT_PURPOSE_IS_ORIGIN(wanted_circ_purpose));
+
+ circ = hs_circuitmap_get_circuit_impl(type, token_len, token,
+ wanted_circ_purpose);
+ if (!circ) {
+ return NULL;
+ }
- return hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V3,
- ED25519_PUBKEY_LEN, auth_key->pubkey,
- CIRCUIT_PURPOSE_INTRO_POINT);
+ tor_assert(CIRCUIT_IS_ORCIRC(circ));
+ return TO_OR_CIRCUIT(circ);
}
-/* Public function: Return v2 introduction circuit with <b>digest</b>. Return
- * NULL if no such circuit is found in the circuitmap. */
+/************** Public circuitmap API ****************************************/
+
+/**** Public relay-side getters: */
+
+/* Public function: Return a v3 introduction circuit to this relay with
+ * <b>auth_key</b>. Return NULL if no such circuit is found in the
+ * circuitmap. */
or_circuit_t *
-hs_circuitmap_get_intro_circ_v2(const uint8_t *digest)
+hs_circuitmap_get_intro_circ_v3_relay_side(
+ const ed25519_public_key_t *auth_key)
{
- tor_assert(digest);
+ return hs_circuitmap_get_or_circuit(HS_TOKEN_INTRO_V3_RELAY_SIDE,
+ ED25519_PUBKEY_LEN, auth_key->pubkey,
+ CIRCUIT_PURPOSE_INTRO_POINT);
+}
- return hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V2,
- REND_TOKEN_LEN, digest,
- CIRCUIT_PURPOSE_INTRO_POINT);
+/* Public function: Return v2 introduction circuit to this relay with
+ * <b>digest</b>. Return NULL if no such circuit is found in the circuitmap. */
+or_circuit_t *
+hs_circuitmap_get_intro_circ_v2_relay_side(const uint8_t *digest)
+{
+ return hs_circuitmap_get_or_circuit(HS_TOKEN_INTRO_V2_RELAY_SIDE,
+ REND_TOKEN_LEN, digest,
+ CIRCUIT_PURPOSE_INTRO_POINT);
}
-/* Public function: Return rendezvous circuit with rendezvous
+/* Public function: Return rendezvous circuit to this relay with rendezvous
* <b>cookie</b>. Return NULL if no such circuit is found in the circuitmap. */
or_circuit_t *
-hs_circuitmap_get_rend_circ(const uint8_t *cookie)
+hs_circuitmap_get_rend_circ_relay_side(const uint8_t *cookie)
{
- tor_assert(cookie);
-
- return hs_circuitmap_get_circuit(HS_TOKEN_REND,
- REND_TOKEN_LEN, cookie,
- CIRCUIT_PURPOSE_REND_POINT_WAITING);
+ return hs_circuitmap_get_or_circuit(HS_TOKEN_REND_RELAY_SIDE,
+ REND_TOKEN_LEN, cookie,
+ CIRCUIT_PURPOSE_REND_POINT_WAITING);
}
+/** Public relay-side setters: */
+
/* Public function: Register rendezvous circuit with key <b>cookie</b> to the
* circuitmap. */
void
-hs_circuitmap_register_rend_circ(or_circuit_t *circ, const uint8_t *cookie)
+hs_circuitmap_register_rend_circ_relay_side(or_circuit_t *circ,
+ const uint8_t *cookie)
{
- hs_circuitmap_register_circuit(circ,
- HS_TOKEN_REND,
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
+ HS_TOKEN_REND_RELAY_SIDE,
REND_TOKEN_LEN, cookie);
}
+/* Public function: Register v2 intro circuit with key <b>digest</b> to the
+ * circuitmap. */
+void
+hs_circuitmap_register_intro_circ_v2_relay_side(or_circuit_t *circ,
+ const uint8_t *digest)
+{
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
+ HS_TOKEN_INTRO_V2_RELAY_SIDE,
+ REND_TOKEN_LEN, digest);
+}
+
+/* Public function: Register v3 intro circuit with key <b>auth_key</b> to the
+ * circuitmap. */
+void
+hs_circuitmap_register_intro_circ_v3_relay_side(or_circuit_t *circ,
+ const ed25519_public_key_t *auth_key)
+{
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
+ HS_TOKEN_INTRO_V3_RELAY_SIDE,
+ ED25519_PUBKEY_LEN, auth_key->pubkey);
+}
+
+/**** Public servide-side getters: */
+
+/* Public function: Return v3 introduction circuit with <b>auth_key</b>
+ * originating from this hidden service. Return NULL if no such circuit is
+ * found in the circuitmap. */
+origin_circuit_t *
+hs_circuitmap_get_intro_circ_v3_service_side(const
+ ed25519_public_key_t *auth_key)
+{
+ origin_circuit_t *circ = NULL;
+
+ /* Check first for established intro circuits */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V3_SERVICE_SIDE,
+ ED25519_PUBKEY_LEN, auth_key->pubkey,
+ CIRCUIT_PURPOSE_S_INTRO);
+ if (circ) {
+ return circ;
+ }
+
+ /* ...if nothing found, check for pending intro circs */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V3_SERVICE_SIDE,
+ ED25519_PUBKEY_LEN, auth_key->pubkey,
+ CIRCUIT_PURPOSE_S_ESTABLISH_INTRO);
+
+ return circ;
+}
+
+/* Public function: Return v2 introduction circuit originating from this hidden
+ * service with <b>digest</b>. Return NULL if no such circuit is found in the
+ * circuitmap. */
+origin_circuit_t *
+hs_circuitmap_get_intro_circ_v2_service_side(const uint8_t *digest)
+{
+ origin_circuit_t *circ = NULL;
+
+ /* Check first for established intro circuits */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V2_SERVICE_SIDE,
+ REND_TOKEN_LEN, digest,
+ CIRCUIT_PURPOSE_S_INTRO);
+ if (circ) {
+ return circ;
+ }
+
+ /* ...if nothing found, check for pending intro circs */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V2_SERVICE_SIDE,
+ REND_TOKEN_LEN, digest,
+ CIRCUIT_PURPOSE_S_ESTABLISH_INTRO);
+
+ return circ;
+}
+
+/* Public function: Return rendezvous circuit originating from this hidden
+ * service with rendezvous <b>cookie</b>. Return NULL if no such circuit is
+ * found in the circuitmap. */
+origin_circuit_t *
+hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie)
+{
+ origin_circuit_t *circ = NULL;
+
+ /* Try to check if we have a connecting circuit. */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_SERVICE_SIDE,
+ REND_TOKEN_LEN, cookie,
+ CIRCUIT_PURPOSE_S_CONNECT_REND);
+ if (circ) {
+ return circ;
+ }
+
+ /* Then try for connected circuit. */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_SERVICE_SIDE,
+ REND_TOKEN_LEN, cookie,
+ CIRCUIT_PURPOSE_S_REND_JOINED);
+ return circ;
+}
+
+/**** Public servide-side setters: */
/* Public function: Register v2 intro circuit with key <b>digest</b> to the
* circuitmap. */
void
-hs_circuitmap_register_intro_circ_v2(or_circuit_t *circ, const uint8_t *digest)
+hs_circuitmap_register_intro_circ_v2_service_side(origin_circuit_t *circ,
+ const uint8_t *digest)
{
- hs_circuitmap_register_circuit(circ,
- HS_TOKEN_INTRO_V2,
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
+ HS_TOKEN_INTRO_V2_SERVICE_SIDE,
REND_TOKEN_LEN, digest);
}
/* Public function: Register v3 intro circuit with key <b>auth_key</b> to the
* circuitmap. */
void
-hs_circuitmap_register_intro_circ_v3(or_circuit_t *circ,
- const ed25519_public_key_t *auth_key)
+hs_circuitmap_register_intro_circ_v3_service_side(origin_circuit_t *circ,
+ const ed25519_public_key_t *auth_key)
{
- hs_circuitmap_register_circuit(circ,
- HS_TOKEN_INTRO_V3,
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
+ HS_TOKEN_INTRO_V3_SERVICE_SIDE,
ED25519_PUBKEY_LEN, auth_key->pubkey);
}
-/** Remove this circuit from the HS circuitmap. Clear its HS token, and remove
- * it from the hashtable. */
+/* Public function: Register rendezvous circuit with key <b>cookie</b> to the
+ * circuitmap. */
+void
+hs_circuitmap_register_rend_circ_service_side(origin_circuit_t *circ,
+ const uint8_t *cookie)
+{
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
+ HS_TOKEN_REND_SERVICE_SIDE,
+ REND_TOKEN_LEN, cookie);
+}
+
+/**** Misc public functions: */
+
+/** Public function: Remove this circuit from the HS circuitmap. Clear its HS
+ * token, and remove it from the hashtable. */
void
-hs_circuitmap_remove_circuit(or_circuit_t *circ)
+hs_circuitmap_remove_circuit(circuit_t *circ)
{
tor_assert(the_hs_circuitmap);
@@ -291,14 +453,14 @@ hs_circuitmap_remove_circuit(or_circuit_t *circ)
}
/* Remove circ from circuitmap */
- or_circuit_t *tmp;
+ circuit_t *tmp;
tmp = HT_REMOVE(hs_circuitmap_ht, the_hs_circuitmap, circ);
/* ... and ensure the removal was successful. */
if (tmp) {
tor_assert(tmp == circ);
} else {
log_warn(LD_BUG, "Could not find circuit (%u) in circuitmap.",
- circ->p_circ_id);
+ circ->n_circ_id);
}
/* Clear token from circ */
@@ -306,7 +468,7 @@ hs_circuitmap_remove_circuit(or_circuit_t *circ)
circ->hs_token = NULL;
}
-/* Initialize the global HS circuitmap. */
+/* Public function: Initialize the global HS circuitmap. */
void
hs_circuitmap_init(void)
{
@@ -316,7 +478,7 @@ hs_circuitmap_init(void)
HT_INIT(hs_circuitmap_ht, the_hs_circuitmap);
}
-/* Free all memory allocated by the global HS circuitmap. */
+/* Public function: Free all memory allocated by the global HS circuitmap. */
void
hs_circuitmap_free_all(void)
{
diff --git a/src/or/hs_circuitmap.h b/src/or/hs_circuitmap.h
index b587039310..33d5b64117 100644
--- a/src/or/hs_circuitmap.h
+++ b/src/or/hs_circuitmap.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -9,26 +9,52 @@
#ifndef TOR_HS_CIRCUITMAP_H
#define TOR_HS_CIRCUITMAP_H
-typedef HT_HEAD(hs_circuitmap_ht, or_circuit_t) hs_circuitmap_ht;
+typedef HT_HEAD(hs_circuitmap_ht, circuit_t) hs_circuitmap_ht;
typedef struct hs_token_s hs_token_t;
struct or_circuit_t;
+struct origin_circuit_t;
/** Public HS circuitmap API: */
-struct or_circuit_t *hs_circuitmap_get_rend_circ(const uint8_t *cookie);
-struct or_circuit_t *hs_circuitmap_get_intro_circ_v3(
- const ed25519_public_key_t *auth_key);
-struct or_circuit_t *hs_circuitmap_get_intro_circ_v2(const uint8_t *digest);
-
-void hs_circuitmap_register_rend_circ(struct or_circuit_t *circ,
- const uint8_t *cookie);
-void hs_circuitmap_register_intro_circ_v2(struct or_circuit_t *circ,
- const uint8_t *digest);
-void hs_circuitmap_register_intro_circ_v3(struct or_circuit_t *circ,
+/** Public relay-side API: */
+
+struct or_circuit_t *
+hs_circuitmap_get_intro_circ_v3_relay_side(const
+ ed25519_public_key_t *auth_key);
+struct or_circuit_t *
+hs_circuitmap_get_intro_circ_v2_relay_side(const uint8_t *digest);
+struct or_circuit_t *
+hs_circuitmap_get_rend_circ_relay_side(const uint8_t *cookie);
+
+void hs_circuitmap_register_rend_circ_relay_side(struct or_circuit_t *circ,
+ const uint8_t *cookie);
+void hs_circuitmap_register_intro_circ_v2_relay_side(struct or_circuit_t *circ,
+ const uint8_t *digest);
+void hs_circuitmap_register_intro_circ_v3_relay_side(struct or_circuit_t *circ,
const ed25519_public_key_t *auth_key);
-void hs_circuitmap_remove_circuit(struct or_circuit_t *circ);
+/** Public service-side API: */
+
+struct origin_circuit_t *
+hs_circuitmap_get_intro_circ_v3_service_side(const
+ ed25519_public_key_t *auth_key);
+struct origin_circuit_t *
+hs_circuitmap_get_intro_circ_v2_service_side(const uint8_t *digest);
+struct origin_circuit_t *
+hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie);
+
+void hs_circuitmap_register_intro_circ_v2_service_side(
+ struct origin_circuit_t *circ,
+ const uint8_t *digest);
+void hs_circuitmap_register_intro_circ_v3_service_side(
+ struct origin_circuit_t *circ,
+ const ed25519_public_key_t *auth_key);
+void hs_circuitmap_register_rend_circ_service_side(
+ struct origin_circuit_t *circ,
+ const uint8_t *cookie);
+
+void hs_circuitmap_remove_circuit(struct circuit_t *circ);
void hs_circuitmap_init(void);
void hs_circuitmap_free_all(void);
@@ -37,12 +63,19 @@ void hs_circuitmap_free_all(void);
/** Represents the type of HS token. */
typedef enum {
- /** A rendezvous cookie (128bit)*/
- HS_TOKEN_REND,
- /** A v2 introduction point pubkey (160bit) */
- HS_TOKEN_INTRO_V2,
- /** A v3 introduction point pubkey (256bit) */
- HS_TOKEN_INTRO_V3,
+ /** A rendezvous cookie on a relay (128bit)*/
+ HS_TOKEN_REND_RELAY_SIDE,
+ /** A v2 introduction point pubkey on a relay (160bit) */
+ HS_TOKEN_INTRO_V2_RELAY_SIDE,
+ /** A v3 introduction point pubkey on a relay (256bit) */
+ HS_TOKEN_INTRO_V3_RELAY_SIDE,
+
+ /** A rendezvous cookie on a hidden service (128bit)*/
+ HS_TOKEN_REND_SERVICE_SIDE,
+ /** A v2 introduction point pubkey on a hidden service (160bit) */
+ HS_TOKEN_INTRO_V2_SERVICE_SIDE,
+ /** A v3 introduction point pubkey on a hidden service (256bit) */
+ HS_TOKEN_INTRO_V3_SERVICE_SIDE,
} hs_token_type_t;
/** Represents a token used in the HS protocol. Each such token maps to a
diff --git a/src/or/hs_common.c b/src/or/hs_common.c
index de96946ab5..42508126f8 100644
--- a/src/or/hs_common.c
+++ b/src/or/hs_common.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -9,6 +9,8 @@
* protocol.
**/
+#define HS_COMMON_PRIVATE
+
#include "or.h"
#include "config.h"
@@ -16,6 +18,80 @@
#include "hs_common.h"
#include "rendcommon.h"
+/* Make sure that the directory for <b>service</b> is private, using the config
+ * <b>username</b>.
+ * If <b>create</b> is true:
+ * - if the directory exists, change permissions if needed,
+ * - if the directory does not exist, create it with the correct permissions.
+ * If <b>create</b> is false:
+ * - if the directory exists, check permissions,
+ * - if the directory does not exist, check if we think we can create it.
+ * Return 0 on success, -1 on failure. */
+int
+hs_check_service_private_dir(const char *username, const char *path,
+ unsigned int dir_group_readable,
+ unsigned int create)
+{
+ cpd_check_t check_opts = CPD_NONE;
+
+ tor_assert(path);
+
+ if (create) {
+ check_opts |= CPD_CREATE;
+ } else {
+ check_opts |= CPD_CHECK_MODE_ONLY;
+ check_opts |= CPD_CHECK;
+ }
+ if (dir_group_readable) {
+ check_opts |= CPD_GROUP_READ;
+ }
+ /* Check/create directory */
+ if (check_private_dir(path, check_opts, username) < 0) {
+ return -1;
+ }
+ return 0;
+}
+
+/** Get the default HS time period length in minutes from the consensus. */
+STATIC uint64_t
+get_time_period_length(void)
+{
+ int32_t time_period_length = networkstatus_get_param(NULL, "hsdir-interval",
+ HS_TIME_PERIOD_LENGTH_DEFAULT,
+ HS_TIME_PERIOD_LENGTH_MIN,
+ HS_TIME_PERIOD_LENGTH_MAX);
+ /* Make sure it's a positive value. */
+ tor_assert(time_period_length >= 0);
+ /* uint64_t will always be able to contain a int32_t */
+ return (uint64_t) time_period_length;
+}
+
+/** Get the HS time period number at time <b>now</b> */
+STATIC uint64_t
+get_time_period_num(time_t now)
+{
+ uint64_t time_period_num;
+ uint64_t time_period_length = get_time_period_length();
+ uint64_t minutes_since_epoch = now / 60;
+
+ /* Now subtract half a day to fit the prop224 time period schedule (see
+ * section [TIME-PERIODS]). */
+ tor_assert(minutes_since_epoch > HS_TIME_PERIOD_ROTATION_OFFSET);
+ minutes_since_epoch -= HS_TIME_PERIOD_ROTATION_OFFSET;
+
+ /* Calculate the time period */
+ time_period_num = minutes_since_epoch / time_period_length;
+ return time_period_num;
+}
+
+/** Get the number of the _upcoming_ HS time period, given that the current
+ * time is <b>now</b>. */
+uint64_t
+hs_get_next_time_period_num(time_t now)
+{
+ return get_time_period_num(now) + 1;
+}
+
/* Create a new rend_data_t for a specific given <b>version</b>.
* Return a pointer to the newly allocated data structure. */
static rend_data_t *
diff --git a/src/or/hs_common.h b/src/or/hs_common.h
index e0ab510ea4..a8fded652a 100644
--- a/src/or/hs_common.h
+++ b/src/or/hs_common.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -17,12 +17,42 @@
/* Version 3 of the protocol (prop224). */
#define HS_VERSION_THREE 3
-/* Denotes ed25519 authentication key on ESTABLISH_INTRO cell. */
-#define AUTH_KEY_ED25519 0x02
+/** Try to maintain this many intro points per service by default. */
+#define NUM_INTRO_POINTS_DEFAULT 3
+/** Maximum number of intro points per service. */
+#define NUM_INTRO_POINTS_MAX 10
+/** Number of extra intro points we launch if our set of intro nodes is empty.
+ * See proposal 155, section 4. */
+#define NUM_INTRO_POINTS_EXTRA 2
+
+/** If we can't build our intro circuits, don't retry for this long. */
+#define INTRO_CIRC_RETRY_PERIOD (60*5)
+/** Don't try to build more than this many circuits before giving up for a
+ * while.*/
+#define MAX_INTRO_CIRCS_PER_PERIOD 10
+/** How many times will a hidden service operator attempt to connect to a
+ * requested rendezvous point before giving up? */
+#define MAX_REND_FAILURES 1
+/** How many seconds should we spend trying to connect to a requested
+ * rendezvous point before giving up? */
+#define MAX_REND_TIMEOUT 30
/* String prefix for the signature of ESTABLISH_INTRO */
#define ESTABLISH_INTRO_SIG_PREFIX "Tor establish-intro cell v1"
+/* The default HS time period length */
+#define HS_TIME_PERIOD_LENGTH_DEFAULT 1440 /* 1440 minutes == one day */
+/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */
+#define HS_TIME_PERIOD_LENGTH_MIN 30 /* minutes */
+/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */
+#define HS_TIME_PERIOD_LENGTH_MAX (60 * 24 * 10) /* 10 days or 14400 minutes */
+/* The time period rotation offset as seen in prop224 section [TIME-PERIODS] */
+#define HS_TIME_PERIOD_ROTATION_OFFSET (12 * 60) /* minutes */
+
+int hs_check_service_private_dir(const char *username, const char *path,
+ unsigned int dir_group_readable,
+ unsigned int create);
+
void rend_data_free(rend_data_t *data);
rend_data_t *rend_data_dup(const rend_data_t *data);
rend_data_t *rend_data_client_create(const char *onion_address,
@@ -39,5 +69,18 @@ const char *rend_data_get_desc_id(const rend_data_t *rend_data,
const uint8_t *rend_data_get_pk_digest(const rend_data_t *rend_data,
size_t *len_out);
+uint64_t hs_get_next_time_period_num(time_t now);
+
+#ifdef HS_COMMON_PRIVATE
+
+#ifdef TOR_UNIT_TESTS
+
+STATIC uint64_t get_time_period_length(void);
+STATIC uint64_t get_time_period_num(time_t now);
+
+#endif /* TOR_UNIT_TESTS */
+
+#endif /* HS_COMMON_PRIVATE */
+
#endif /* TOR_HS_COMMON_H */
diff --git a/src/or/hs_descriptor.c b/src/or/hs_descriptor.c
index f16a2fdc14..0480f63308 100644
--- a/src/or/hs_descriptor.c
+++ b/src/or/hs_descriptor.c
@@ -1,9 +1,55 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
* \file hs_descriptor.c
* \brief Handle hidden service descriptor encoding/decoding.
+ *
+ * \details
+ * Here is a graphical depiction of an HS descriptor and its layers:
+ *
+ * +------------------------------------------------------+
+ * |DESCRIPTOR HEADER: |
+ * | hs-descriptor 3 |
+ * | descriptor-lifetime 180 |
+ * | ... |
+ * | superencrypted |
+ * |+---------------------------------------------------+ |
+ * ||SUPERENCRYPTED LAYER (aka OUTER ENCRYPTED LAYER): | |
+ * || desc-auth-type x25519 | |
+ * || desc-auth-ephemeral-key | |
+ * || auth-client | |
+ * || auth-client | |
+ * || ... | |
+ * || encrypted | |
+ * ||+-------------------------------------------------+| |
+ * |||ENCRYPTED LAYER (aka INNER ENCRYPTED LAYER): || |
+ * ||| create2-formats || |
+ * ||| intro-auth-required || |
+ * ||| introduction-point || |
+ * ||| introduction-point || |
+ * ||| ... || |
+ * ||+-------------------------------------------------+| |
+ * |+---------------------------------------------------+ |
+ * +------------------------------------------------------+
+ *
+ * The DESCRIPTOR HEADER section is completely unencrypted and contains generic
+ * descriptor metadata.
+ *
+ * The SUPERENCRYPTED LAYER section is the first layer of encryption, and it's
+ * encrypted using the blinded public key of the hidden service to protect
+ * against entities who don't know its onion address. The clients of the hidden
+ * service know its onion address and blinded public key, whereas third-parties
+ * (like HSDirs) don't know it (except if it's a public hidden service).
+ *
+ * The ENCRYPTED LAYER section is the second layer of encryption, and it's
+ * encrypted using the client authorization key material (if those exist). When
+ * client authorization is enabled, this second layer of encryption protects
+ * the descriptor content from unauthorized entities. If client authorization
+ * is disabled, this second layer of encryption does not provide any extra
+ * security but is still present. The plaintext of this layer contains all the
+ * information required to connect to the hidden service like its list of
+ * introduction points.
**/
/* For unit tests.*/
@@ -23,11 +69,12 @@
#define str_desc_cert "descriptor-signing-key-cert"
#define str_rev_counter "revision-counter"
#define str_superencrypted "superencrypted"
+#define str_encrypted "encrypted"
#define str_signature "signature"
#define str_lifetime "descriptor-lifetime"
/* Constant string value for the encrypted part of the descriptor. */
#define str_create2_formats "create2-formats"
-#define str_auth_required "authentication-required"
+#define str_intro_auth_required "intro-auth-required"
#define str_single_onion "single-onion-service"
#define str_intro_point "introduction-point"
#define str_ip_auth_key "auth-key"
@@ -36,16 +83,20 @@
#define str_intro_point_start "\n" str_intro_point " "
/* Constant string value for the construction to encrypt the encrypted data
* section. */
-#define str_enc_hsdir_data "hsdir-superencrypted-data"
+#define str_enc_const_superencryption "hsdir-superencrypted-data"
+#define str_enc_const_encryption "hsdir-encrypted-data"
/* Prefix required to compute/verify HS desc signatures */
#define str_desc_sig_prefix "Tor onion service descriptor sig v3"
+#define str_desc_auth_type "desc-auth-type"
+#define str_desc_auth_key "desc-auth-ephemeral-key"
+#define str_desc_auth_client "auth-client"
+#define str_encrypted "encrypted"
/* Authentication supported types. */
static const struct {
hs_desc_auth_type_t type;
const char *identifier;
-} auth_types[] = {
- { HS_DESC_AUTH_PASSWORD, "password" },
+} intro_auth_types[] = {
{ HS_DESC_AUTH_ED25519, "ed25519" },
/* Indicate end of array. */
{ 0, NULL }
@@ -62,10 +113,19 @@ static token_rule_t hs_desc_v3_token_table[] = {
END_OF_TABLE
};
+/* Descriptor ruleset for the superencrypted section. */
+static token_rule_t hs_desc_superencrypted_v3_token_table[] = {
+ T1_START(str_desc_auth_type, R3_DESC_AUTH_TYPE, GE(1), NO_OBJ),
+ T1(str_desc_auth_key, R3_DESC_AUTH_KEY, GE(1), NO_OBJ),
+ T1N(str_desc_auth_client, R3_DESC_AUTH_CLIENT, GE(3), NO_OBJ),
+ T1(str_encrypted, R3_ENCRYPTED, NO_ARGS, NEED_OBJ),
+ END_OF_TABLE
+};
+
/* Descriptor ruleset for the encrypted section. */
static token_rule_t hs_desc_encrypted_v3_token_table[] = {
T1_START(str_create2_formats, R3_CREATE2_FORMATS, CONCAT_ARGS, NO_OBJ),
- T01(str_auth_required, R3_AUTHENTICATION_REQUIRED, ARGS, NO_OBJ),
+ T01(str_intro_auth_required, R3_INTRO_AUTH_REQUIRED, ARGS, NO_OBJ),
T01(str_single_onion, R3_SINGLE_ONION_SERVICE, ARGS, NO_OBJ),
END_OF_TABLE
};
@@ -107,8 +167,8 @@ desc_plaintext_data_free_contents(hs_desc_plaintext_data_t *desc)
return;
}
- if (desc->encrypted_blob) {
- tor_free(desc->encrypted_blob);
+ if (desc->superencrypted_blob) {
+ tor_free(desc->superencrypted_blob);
}
tor_cert_free(desc->signing_key_cert);
@@ -123,9 +183,9 @@ desc_encrypted_data_free_contents(hs_desc_encrypted_data_t *desc)
return;
}
- if (desc->auth_types) {
- SMARTLIST_FOREACH(desc->auth_types, char *, a, tor_free(a));
- smartlist_free(desc->auth_types);
+ if (desc->intro_auth_types) {
+ SMARTLIST_FOREACH(desc->intro_auth_types, char *, a, tor_free(a));
+ smartlist_free(desc->intro_auth_types);
}
if (desc->intro_points) {
SMARTLIST_FOREACH(desc->intro_points, hs_desc_intro_point_t *, ip,
@@ -135,6 +195,135 @@ desc_encrypted_data_free_contents(hs_desc_encrypted_data_t *desc)
memwipe(desc, 0, sizeof(*desc));
}
+/* Using a key, salt and encrypted payload, build a MAC and put it in mac_out.
+ * We use SHA3-256 for the MAC computation.
+ * This function can't fail. */
+static void
+build_mac(const uint8_t *mac_key, size_t mac_key_len,
+ const uint8_t *salt, size_t salt_len,
+ const uint8_t *encrypted, size_t encrypted_len,
+ uint8_t *mac_out, size_t mac_len)
+{
+ crypto_digest_t *digest;
+
+ const uint64_t mac_len_netorder = tor_htonll(mac_key_len);
+ const uint64_t salt_len_netorder = tor_htonll(salt_len);
+
+ tor_assert(mac_key);
+ tor_assert(salt);
+ tor_assert(encrypted);
+ tor_assert(mac_out);
+
+ digest = crypto_digest256_new(DIGEST_SHA3_256);
+ /* As specified in section 2.5 of proposal 224, first add the mac key
+ * then add the salt first and then the encrypted section. */
+
+ crypto_digest_add_bytes(digest, (const char *) &mac_len_netorder, 8);
+ crypto_digest_add_bytes(digest, (const char *) mac_key, mac_key_len);
+ crypto_digest_add_bytes(digest, (const char *) &salt_len_netorder, 8);
+ crypto_digest_add_bytes(digest, (const char *) salt, salt_len);
+ crypto_digest_add_bytes(digest, (const char *) encrypted, encrypted_len);
+ crypto_digest_get_digest(digest, (char *) mac_out, mac_len);
+ crypto_digest_free(digest);
+}
+
+/* Using a given decriptor object, build the secret input needed for the
+ * KDF and put it in the dst pointer which is an already allocated buffer
+ * of size dstlen. */
+static void
+build_secret_input(const hs_descriptor_t *desc, uint8_t *dst, size_t dstlen)
+{
+ size_t offset = 0;
+
+ tor_assert(desc);
+ tor_assert(dst);
+ tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN <= dstlen);
+
+ /* XXX use the destination length as the memcpy length */
+ /* Copy blinded public key. */
+ memcpy(dst, desc->plaintext_data.blinded_pubkey.pubkey,
+ sizeof(desc->plaintext_data.blinded_pubkey.pubkey));
+ offset += sizeof(desc->plaintext_data.blinded_pubkey.pubkey);
+ /* Copy subcredential. */
+ memcpy(dst + offset, desc->subcredential, sizeof(desc->subcredential));
+ offset += sizeof(desc->subcredential);
+ /* Copy revision counter value. */
+ set_uint64(dst + offset, tor_ntohll(desc->plaintext_data.revision_counter));
+ offset += sizeof(uint64_t);
+ tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN == offset);
+}
+
+/* Do the KDF construction and put the resulting data in key_out which is of
+ * key_out_len length. It uses SHAKE-256 as specified in the spec. */
+static void
+build_kdf_key(const hs_descriptor_t *desc,
+ const uint8_t *salt, size_t salt_len,
+ uint8_t *key_out, size_t key_out_len,
+ int is_superencrypted_layer)
+{
+ uint8_t secret_input[HS_DESC_ENCRYPTED_SECRET_INPUT_LEN];
+ crypto_xof_t *xof;
+
+ tor_assert(desc);
+ tor_assert(salt);
+ tor_assert(key_out);
+
+ /* Build the secret input for the KDF computation. */
+ build_secret_input(desc, secret_input, sizeof(secret_input));
+
+ xof = crypto_xof_new();
+ /* Feed our KDF. [SHAKE it like a polaroid picture --Yawning]. */
+ crypto_xof_add_bytes(xof, secret_input, sizeof(secret_input));
+ crypto_xof_add_bytes(xof, salt, salt_len);
+
+ /* Feed in the right string constant based on the desc layer */
+ if (is_superencrypted_layer) {
+ crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_const_superencryption,
+ strlen(str_enc_const_superencryption));
+ } else {
+ crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_const_encryption,
+ strlen(str_enc_const_encryption));
+ }
+
+ /* Eat from our KDF. */
+ crypto_xof_squeeze_bytes(xof, key_out, key_out_len);
+ crypto_xof_free(xof);
+ memwipe(secret_input, 0, sizeof(secret_input));
+}
+
+/* Using the given descriptor and salt, run it through our KDF function and
+ * then extract a secret key in key_out, the IV in iv_out and MAC in mac_out.
+ * This function can't fail. */
+static void
+build_secret_key_iv_mac(const hs_descriptor_t *desc,
+ const uint8_t *salt, size_t salt_len,
+ uint8_t *key_out, size_t key_len,
+ uint8_t *iv_out, size_t iv_len,
+ uint8_t *mac_out, size_t mac_len,
+ int is_superencrypted_layer)
+{
+ size_t offset = 0;
+ uint8_t kdf_key[HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN];
+
+ tor_assert(desc);
+ tor_assert(salt);
+ tor_assert(key_out);
+ tor_assert(iv_out);
+ tor_assert(mac_out);
+
+ build_kdf_key(desc, salt, salt_len, kdf_key, sizeof(kdf_key),
+ is_superencrypted_layer);
+ /* Copy the bytes we need for both the secret key and IV. */
+ memcpy(key_out, kdf_key, key_len);
+ offset += key_len;
+ memcpy(iv_out, kdf_key + offset, iv_len);
+ offset += iv_len;
+ memcpy(mac_out, kdf_key + offset, mac_len);
+ /* Extra precaution to make sure we are not out of bound. */
+ tor_assert((offset + mac_len) == sizeof(kdf_key));
+ memwipe(kdf_key, 0, sizeof(kdf_key));
+}
+
/* === ENCODING === */
/* Encode the given link specifier objects into a newly allocated string.
@@ -363,142 +552,23 @@ encode_intro_point(const ed25519_public_key_t *sig_key,
return encoded_ip;
}
-/* Using a given decriptor object, build the secret input needed for the
- * KDF and put it in the dst pointer which is an already allocated buffer
- * of size dstlen. */
-static void
-build_secret_input(const hs_descriptor_t *desc, uint8_t *dst, size_t dstlen)
-{
- size_t offset = 0;
-
- tor_assert(desc);
- tor_assert(dst);
- tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN <= dstlen);
-
- /* XXX use the destination length as the memcpy length */
- /* Copy blinded public key. */
- memcpy(dst, desc->plaintext_data.blinded_pubkey.pubkey,
- sizeof(desc->plaintext_data.blinded_pubkey.pubkey));
- offset += sizeof(desc->plaintext_data.blinded_pubkey.pubkey);
- /* Copy subcredential. */
- memcpy(dst + offset, desc->subcredential, sizeof(desc->subcredential));
- offset += sizeof(desc->subcredential);
- /* Copy revision counter value. */
- set_uint64(dst + offset, tor_ntohll(desc->plaintext_data.revision_counter));
- offset += sizeof(uint64_t);
- tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN == offset);
-}
-
-/* Do the KDF construction and put the resulting data in key_out which is of
- * key_out_len length. It uses SHAKE-256 as specified in the spec. */
-static void
-build_kdf_key(const hs_descriptor_t *desc,
- const uint8_t *salt, size_t salt_len,
- uint8_t *key_out, size_t key_out_len)
-{
- uint8_t secret_input[HS_DESC_ENCRYPTED_SECRET_INPUT_LEN];
- crypto_xof_t *xof;
-
- tor_assert(desc);
- tor_assert(salt);
- tor_assert(key_out);
-
- /* Build the secret input for the KDF computation. */
- build_secret_input(desc, secret_input, sizeof(secret_input));
-
- xof = crypto_xof_new();
- /* Feed our KDF. [SHAKE it like a polaroid picture --Yawning]. */
- crypto_xof_add_bytes(xof, secret_input, sizeof(secret_input));
- crypto_xof_add_bytes(xof, salt, salt_len);
- crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_hsdir_data,
- strlen(str_enc_hsdir_data));
- /* Eat from our KDF. */
- crypto_xof_squeeze_bytes(xof, key_out, key_out_len);
- crypto_xof_free(xof);
- memwipe(secret_input, 0, sizeof(secret_input));
-}
-
-/* Using the given descriptor and salt, run it through our KDF function and
- * then extract a secret key in key_out, the IV in iv_out and MAC in mac_out.
- * This function can't fail. */
-static void
-build_secret_key_iv_mac(const hs_descriptor_t *desc,
- const uint8_t *salt, size_t salt_len,
- uint8_t *key_out, size_t key_len,
- uint8_t *iv_out, size_t iv_len,
- uint8_t *mac_out, size_t mac_len)
-{
- size_t offset = 0;
- uint8_t kdf_key[HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN];
-
- tor_assert(desc);
- tor_assert(salt);
- tor_assert(key_out);
- tor_assert(iv_out);
- tor_assert(mac_out);
-
- build_kdf_key(desc, salt, salt_len, kdf_key, sizeof(kdf_key));
- /* Copy the bytes we need for both the secret key and IV. */
- memcpy(key_out, kdf_key, key_len);
- offset += key_len;
- memcpy(iv_out, kdf_key + offset, iv_len);
- offset += iv_len;
- memcpy(mac_out, kdf_key + offset, mac_len);
- /* Extra precaution to make sure we are not out of bound. */
- tor_assert((offset + mac_len) == sizeof(kdf_key));
- memwipe(kdf_key, 0, sizeof(kdf_key));
-}
-
-/* Using a key, salt and encrypted payload, build a MAC and put it in mac_out.
- * We use SHA3-256 for the MAC computation.
- * This function can't fail. */
-static void
-build_mac(const uint8_t *mac_key, size_t mac_key_len,
- const uint8_t *salt, size_t salt_len,
- const uint8_t *encrypted, size_t encrypted_len,
- uint8_t *mac_out, size_t mac_len)
-{
- crypto_digest_t *digest;
-
- const uint64_t mac_len_netorder = tor_htonll(mac_key_len);
- const uint64_t salt_len_netorder = tor_htonll(salt_len);
-
- tor_assert(mac_key);
- tor_assert(salt);
- tor_assert(encrypted);
- tor_assert(mac_out);
-
- digest = crypto_digest256_new(DIGEST_SHA3_256);
- /* As specified in section 2.5 of proposal 224, first add the mac key
- * then add the salt first and then the encrypted section. */
-
- crypto_digest_add_bytes(digest, (const char *) &mac_len_netorder, 8);
- crypto_digest_add_bytes(digest, (const char *) mac_key, mac_key_len);
- crypto_digest_add_bytes(digest, (const char *) &salt_len_netorder, 8);
- crypto_digest_add_bytes(digest, (const char *) salt, salt_len);
- crypto_digest_add_bytes(digest, (const char *) encrypted, encrypted_len);
- crypto_digest_get_digest(digest, (char *) mac_out, mac_len);
- crypto_digest_free(digest);
-}
-
/* Given a source length, return the new size including padding for the
* plaintext encryption. */
static size_t
compute_padded_plaintext_length(size_t plaintext_len)
{
size_t plaintext_padded_len;
+ const int padding_block_length = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE;
/* Make sure we won't overflow. */
- tor_assert(plaintext_len <=
- (SIZE_T_CEILING - HS_DESC_PLAINTEXT_PADDING_MULTIPLE));
-
- /* Get the extra length we need to add. For example, if srclen is 234 bytes,
- * this will expand to (2 * 128) == 256 thus an extra 22 bytes. */
- plaintext_padded_len = CEIL_DIV(plaintext_len,
- HS_DESC_PLAINTEXT_PADDING_MULTIPLE) *
- HS_DESC_PLAINTEXT_PADDING_MULTIPLE;
+ tor_assert(plaintext_len <= (SIZE_T_CEILING - padding_block_length));
+
+ /* Get the extra length we need to add. For example, if srclen is 10200
+ * bytes, this will expand to (2 * 10k) == 20k thus an extra 9800 bytes. */
+ plaintext_padded_len = CEIL_DIV(plaintext_len, padding_block_length) *
+ padding_block_length;
/* Can never be extra careful. Make sure we are _really_ padded. */
- tor_assert(!(plaintext_padded_len % HS_DESC_PLAINTEXT_PADDING_MULTIPLE));
+ tor_assert(!(plaintext_padded_len % padding_block_length));
return plaintext_padded_len;
}
@@ -530,7 +600,8 @@ build_plaintext_padding(const char *plaintext, size_t plaintext_len,
* data. Return size of the encrypted data buffer. */
static size_t
build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext,
- size_t plaintext_len, uint8_t **encrypted_out)
+ size_t plaintext_len, uint8_t **encrypted_out,
+ int is_superencrypted_layer)
{
size_t encrypted_len;
uint8_t *padded_plaintext, *encrypted;
@@ -541,15 +612,21 @@ build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext,
tor_assert(plaintext);
tor_assert(encrypted_out);
+ /* If we are encrypting the middle layer of the descriptor, we need to first
+ pad the plaintext */
+ if (is_superencrypted_layer) {
+ encrypted_len = build_plaintext_padding(plaintext, plaintext_len,
+ &padded_plaintext);
+ /* Extra precautions that we have a valid padding length. */
+ tor_assert(!(encrypted_len % HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE));
+ } else { /* No padding required for inner layers */
+ padded_plaintext = tor_memdup(plaintext, plaintext_len);
+ encrypted_len = plaintext_len;
+ }
+
/* This creates a cipher for AES. It can't fail. */
cipher = crypto_cipher_new_with_iv_and_bits(key, iv,
HS_DESC_ENCRYPTED_BIT_SIZE);
- /* This can't fail. */
- encrypted_len = build_plaintext_padding(plaintext, plaintext_len,
- &padded_plaintext);
- /* Extra precautions that we have a valie padding length. */
- tor_assert(encrypted_len <= HS_DESC_PADDED_PLAINTEXT_MAX_LEN);
- tor_assert(!(encrypted_len % HS_DESC_PLAINTEXT_PADDING_MULTIPLE));
/* We use a stream cipher so the encrypted length will be the same as the
* plaintext padded length. */
encrypted = tor_malloc_zero(encrypted_len);
@@ -563,12 +640,13 @@ build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext,
return encrypted_len;
}
-/* Encrypt the given plaintext buffer and using the descriptor to get the
+/* Encrypt the given <b>plaintext</b> buffer using <b>desc</b> to get the
* keys. Set encrypted_out with the encrypted data and return the length of
- * it. */
+ * it. <b>is_superencrypted_layer</b> is set if this is the outer encrypted
+ * layer of the descriptor. */
static size_t
encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext,
- char **encrypted_out)
+ char **encrypted_out, int is_superencrypted_layer)
{
char *final_blob;
size_t encrypted_len, final_blob_len, offset = 0;
@@ -589,11 +667,13 @@ encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext,
build_secret_key_iv_mac(desc, salt, sizeof(salt),
secret_key, sizeof(secret_key),
secret_iv, sizeof(secret_iv),
- mac_key, sizeof(mac_key));
+ mac_key, sizeof(mac_key),
+ is_superencrypted_layer);
/* Build the encrypted part that is do the actual encryption. */
encrypted_len = build_encrypted(secret_key, secret_iv, plaintext,
- strlen(plaintext), &encrypted);
+ strlen(plaintext), &encrypted,
+ is_superencrypted_layer);
memwipe(secret_key, 0, sizeof(secret_key));
memwipe(secret_iv, 0, sizeof(secret_iv));
/* This construction is specified in section 2.5 of proposal 224. */
@@ -625,20 +705,89 @@ encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext,
return final_blob_len;
}
-/* Take care of encoding the encrypted data section and then encrypting it
- * with the descriptor's key. A newly allocated NUL terminated string pointer
- * containing the encrypted encoded blob is put in encrypted_blob_out. Return
- * 0 on success else a negative value. */
-static int
-encode_encrypted_data(const hs_descriptor_t *desc,
- char **encrypted_blob_out)
+/* Create and return a string containing a fake client-auth entry. It's the
+ * responsibility of the caller to free the returned string. This function will
+ * never fail. */
+static char *
+get_fake_auth_client_str(void)
{
- int ret = -1;
- char *encoded_str, *encrypted_blob;
- smartlist_t *lines = smartlist_new();
+ char *auth_client_str = NULL;
+ /* We are gonna fill these arrays with fake base64 data. They are all double
+ * the size of their binary representation to fit the base64 overhead. */
+ char client_id_b64[8*2];
+ char iv_b64[16*2];
+ char encrypted_cookie_b64[16*2];
+ int retval;
+
+ /* This is a macro to fill a field with random data and then base64 it. */
+#define FILL_WITH_FAKE_DATA_AND_BASE64(field) STMT_BEGIN \
+ crypto_rand((char *)field, sizeof(field)); \
+ retval = base64_encode_nopad(field##_b64, sizeof(field##_b64), \
+ field, sizeof(field)); \
+ tor_assert(retval > 0); \
+ STMT_END
+
+ { /* Get those fakes! */
+ uint8_t client_id[8]; /* fake client-id */
+ uint8_t iv[16]; /* fake IV (initialization vector) */
+ uint8_t encrypted_cookie[16]; /* fake encrypted cookie */
+
+ FILL_WITH_FAKE_DATA_AND_BASE64(client_id);
+ FILL_WITH_FAKE_DATA_AND_BASE64(iv);
+ FILL_WITH_FAKE_DATA_AND_BASE64(encrypted_cookie);
+ }
+
+ /* Build the final string */
+ tor_asprintf(&auth_client_str, "%s %s %s %s", str_desc_auth_client,
+ client_id_b64, iv_b64, encrypted_cookie_b64);
+
+#undef FILL_WITH_FAKE_DATA_AND_BASE64
+
+ return auth_client_str;
+}
- tor_assert(desc);
- tor_assert(encrypted_blob_out);
+/** How many lines of "client-auth" we want in our descriptors; fake or not. */
+#define CLIENT_AUTH_ENTRIES_BLOCK_SIZE 16
+
+/** Create the "client-auth" part of the descriptor and return a
+ * newly-allocated string with it. It's the responsibility of the caller to
+ * free the returned string. */
+static char *
+get_fake_auth_client_lines(void)
+{
+ /* XXX: Client authorization is still not implemented, so all this function
+ does is make fake clients */
+ int i = 0;
+ smartlist_t *auth_client_lines = smartlist_new();
+ char *auth_client_lines_str = NULL;
+
+ /* Make a line for each fake client */
+ const int num_fake_clients = CLIENT_AUTH_ENTRIES_BLOCK_SIZE;
+ for (i = 0; i < num_fake_clients; i++) {
+ char *auth_client_str = get_fake_auth_client_str();
+ tor_assert(auth_client_str);
+ smartlist_add(auth_client_lines, auth_client_str);
+ }
+
+ /* Join all lines together to form final string */
+ auth_client_lines_str = smartlist_join_strings(auth_client_lines,
+ "\n", 1, NULL);
+ /* Cleanup the mess */
+ SMARTLIST_FOREACH(auth_client_lines, char *, a, tor_free(a));
+ smartlist_free(auth_client_lines);
+
+ return auth_client_lines_str;
+}
+
+/* Create the inner layer of the descriptor (which includes the intro points,
+ * etc.). Return a newly-allocated string with the layer plaintext, or NULL if
+ * an error occured. It's the responsibility of the caller to free the returned
+ * string. */
+static char *
+get_inner_encrypted_layer_plaintext(const hs_descriptor_t *desc)
+{
+ char *encoded_str = NULL;
+ smartlist_t *lines = smartlist_new();
/* Build the start of the section prior to the introduction points. */
{
@@ -649,12 +798,12 @@ encode_encrypted_data(const hs_descriptor_t *desc,
smartlist_add_asprintf(lines, "%s %d\n", str_create2_formats,
ONION_HANDSHAKE_TYPE_NTOR);
- if (desc->encrypted_data.auth_types &&
- smartlist_len(desc->encrypted_data.auth_types)) {
+ if (desc->encrypted_data.intro_auth_types &&
+ smartlist_len(desc->encrypted_data.intro_auth_types)) {
/* Put the authentication-required line. */
- char *buf = smartlist_join_strings(desc->encrypted_data.auth_types, " ",
- 0, NULL);
- smartlist_add_asprintf(lines, "%s %s\n", str_auth_required, buf);
+ char *buf = smartlist_join_strings(desc->encrypted_data.intro_auth_types,
+ " ", 0, NULL);
+ smartlist_add_asprintf(lines, "%s %s\n", str_intro_auth_required, buf);
tor_free(buf);
}
@@ -679,31 +828,159 @@ encode_encrypted_data(const hs_descriptor_t *desc,
* then encrypt it. */
encoded_str = smartlist_join_strings(lines, "", 0, NULL);
- /* Encrypt the section into an encrypted blob that we'll base64 encode
- * before returning it. */
+ err:
+ SMARTLIST_FOREACH(lines, char *, l, tor_free(l));
+ smartlist_free(lines);
+
+ return encoded_str;
+}
+
+/* Create the middle layer of the descriptor, which includes the client auth
+ * data and the encrypted inner layer (provided as a base64 string at
+ * <b>layer2_b64_ciphertext</b>). Return a newly-allocated string with the
+ * layer plaintext, or NULL if an error occured. It's the responsibility of the
+ * caller to free the returned string. */
+static char *
+get_outer_encrypted_layer_plaintext(const hs_descriptor_t *desc,
+ const char *layer2_b64_ciphertext)
+{
+ char *layer1_str = NULL;
+ smartlist_t *lines = smartlist_new();
+
+ /* XXX: Disclaimer: This function generates only _fake_ client auth
+ * data. Real client auth is not yet implemented, but client auth data MUST
+ * always be present in descriptors. In the future this function will be
+ * refactored to use real client auth data if they exist (#20700). */
+ (void) *desc;
+
+ /* Specify auth type */
+ smartlist_add_asprintf(lines, "%s %s\n", str_desc_auth_type, "x25519");
+
+ { /* Create fake ephemeral x25519 key */
+ char fake_key_base64[CURVE25519_BASE64_PADDED_LEN + 1];
+ curve25519_keypair_t fake_x25519_keypair;
+ if (curve25519_keypair_generate(&fake_x25519_keypair, 0) < 0) {
+ goto done;
+ }
+ if (curve25519_public_to_base64(fake_key_base64,
+ &fake_x25519_keypair.pubkey) < 0) {
+ goto done;
+ }
+ smartlist_add_asprintf(lines, "%s %s\n",
+ str_desc_auth_key, fake_key_base64);
+ /* No need to memwipe any of these fake keys. They will go unused. */
+ }
+
+ { /* Create fake auth-client lines. */
+ char *auth_client_lines = get_fake_auth_client_lines();
+ tor_assert(auth_client_lines);
+ smartlist_add(lines, auth_client_lines);
+ }
+
+ /* create encrypted section */
{
- char *enc_b64;
- ssize_t enc_b64_len, ret_len, enc_len;
+ smartlist_add_asprintf(lines,
+ "%s\n"
+ "-----BEGIN MESSAGE-----\n"
+ "%s"
+ "-----END MESSAGE-----",
+ str_encrypted, layer2_b64_ciphertext);
+ }
- enc_len = encrypt_descriptor_data(desc, encoded_str, &encrypted_blob);
- tor_free(encoded_str);
- /* Get the encoded size plus a NUL terminating byte. */
- enc_b64_len = base64_encode_size(enc_len, BASE64_ENCODE_MULTILINE) + 1;
- enc_b64 = tor_malloc_zero(enc_b64_len);
- /* Base64 the encrypted blob before returning it. */
- ret_len = base64_encode(enc_b64, enc_b64_len, encrypted_blob, enc_len,
- BASE64_ENCODE_MULTILINE);
- /* Return length doesn't count the NUL byte. */
- tor_assert(ret_len == (enc_b64_len - 1));
- tor_free(encrypted_blob);
- *encrypted_blob_out = enc_b64;
+ layer1_str = smartlist_join_strings(lines, "", 0, NULL);
+
+ done:
+ SMARTLIST_FOREACH(lines, char *, a, tor_free(a));
+ smartlist_free(lines);
+
+ return layer1_str;
+}
+
+/* Encrypt <b>encoded_str</b> into an encrypted blob and then base64 it before
+ * returning it. <b>desc</b> is provided to derive the encryption
+ * keys. <b>is_superencrypted_layer</b> is set if <b>encoded_str</b> is the
+ * middle (superencrypted) layer of the descriptor. It's the responsibility of
+ * the caller to free the returned string. */
+static char *
+encrypt_desc_data_and_base64(const hs_descriptor_t *desc,
+ const char *encoded_str,
+ int is_superencrypted_layer)
+{
+ char *enc_b64;
+ ssize_t enc_b64_len, ret_len, enc_len;
+ char *encrypted_blob = NULL;
+
+ enc_len = encrypt_descriptor_data(desc, encoded_str, &encrypted_blob,
+ is_superencrypted_layer);
+ /* Get the encoded size plus a NUL terminating byte. */
+ enc_b64_len = base64_encode_size(enc_len, BASE64_ENCODE_MULTILINE) + 1;
+ enc_b64 = tor_malloc_zero(enc_b64_len);
+ /* Base64 the encrypted blob before returning it. */
+ ret_len = base64_encode(enc_b64, enc_b64_len, encrypted_blob, enc_len,
+ BASE64_ENCODE_MULTILINE);
+ /* Return length doesn't count the NUL byte. */
+ tor_assert(ret_len == (enc_b64_len - 1));
+ tor_free(encrypted_blob);
+
+ return enc_b64;
+}
+
+/* Generate and encode the superencrypted portion of <b>desc</b>. This also
+ * involves generating the encrypted portion of the descriptor, and performing
+ * the superencryption. A newly allocated NUL-terminated string pointer
+ * containing the encrypted encoded blob is put in encrypted_blob_out. Return 0
+ * on success else a negative value. */
+static int
+encode_superencrypted_data(const hs_descriptor_t *desc,
+ char **encrypted_blob_out)
+{
+ int ret = -1;
+ char *layer2_str = NULL;
+ char *layer2_b64_ciphertext = NULL;
+ char *layer1_str = NULL;
+ char *layer1_b64_ciphertext = NULL;
+
+ tor_assert(desc);
+ tor_assert(encrypted_blob_out);
+
+ /* Func logic: We first create the inner layer of the descriptor (layer2).
+ * We then encrypt it and use it to create the middle layer of the descriptor
+ * (layer1). Finally we superencrypt the middle layer and return it to our
+ * caller. */
+
+ /* Create inner descriptor layer */
+ layer2_str = get_inner_encrypted_layer_plaintext(desc);
+ if (!layer2_str) {
+ goto err;
+ }
+
+ /* Encrypt and b64 the inner layer */
+ layer2_b64_ciphertext = encrypt_desc_data_and_base64(desc, layer2_str, 0);
+ if (!layer2_b64_ciphertext) {
+ goto err;
+ }
+
+ /* Now create middle descriptor layer given the inner layer */
+ layer1_str = get_outer_encrypted_layer_plaintext(desc,layer2_b64_ciphertext);
+ if (!layer1_str) {
+ goto err;
}
+
+ /* Encrypt and base64 the middle layer */
+ layer1_b64_ciphertext = encrypt_desc_data_and_base64(desc, layer1_str, 1);
+ if (!layer1_b64_ciphertext) {
+ goto err;
+ }
+
/* Success! */
ret = 0;
err:
- SMARTLIST_FOREACH(lines, char *, l, tor_free(l));
- smartlist_free(lines);
+ tor_free(layer1_str);
+ tor_free(layer2_str);
+ tor_free(layer2_b64_ciphertext);
+
+ *encrypted_blob_out = layer1_b64_ciphertext;
return ret;
}
@@ -756,7 +1033,7 @@ desc_encode_v3(const hs_descriptor_t *desc,
/* Build the superencrypted data section. */
{
char *enc_b64_blob=NULL;
- if (encode_encrypted_data(desc, &enc_b64_blob) < 0) {
+ if (encode_superencrypted_data(desc, &enc_b64_blob) < 0) {
goto err;
}
smartlist_add_asprintf(lines,
@@ -796,6 +1073,13 @@ desc_encode_v3(const hs_descriptor_t *desc,
encoded_str = smartlist_join_strings(lines, "\n", 1, NULL);
*encoded_out = encoded_str;
+ if (strlen(encoded_str) >= hs_cache_get_max_descriptor_size()) {
+ log_warn(LD_GENERAL, "We just made an HS descriptor that's too big (%d)."
+ "Failing.", (int)strlen(encoded_str));
+ tor_free(encoded_str);
+ goto err;
+ }
+
/* XXX: Trigger a control port event. */
/* Success! */
@@ -894,14 +1178,14 @@ decode_auth_type(hs_desc_encrypted_data_t *desc, const char *list)
tor_assert(desc);
tor_assert(list);
- desc->auth_types = smartlist_new();
- smartlist_split_string(desc->auth_types, list, " ", 0, 0);
+ desc->intro_auth_types = smartlist_new();
+ smartlist_split_string(desc->intro_auth_types, list, " ", 0, 0);
/* Validate the types that we at least know about one. */
- SMARTLIST_FOREACH_BEGIN(desc->auth_types, const char *, auth) {
- for (int idx = 0; auth_types[idx].identifier; idx++) {
- if (!strncmp(auth, auth_types[idx].identifier,
- strlen(auth_types[idx].identifier))) {
+ SMARTLIST_FOREACH_BEGIN(desc->intro_auth_types, const char *, auth) {
+ for (int idx = 0; intro_auth_types[idx].identifier; idx++) {
+ if (!strncmp(auth, intro_auth_types[idx].identifier,
+ strlen(intro_auth_types[idx].identifier))) {
match = 1;
break;
}
@@ -1023,41 +1307,31 @@ cert_parse_and_validate(tor_cert_t **cert_out, const char *data,
STATIC int
encrypted_data_length_is_valid(size_t len)
{
- /* Check for the minimum length possible. */
- if (len < HS_DESC_ENCRYPTED_MIN_LEN) {
+ /* Make sure there is enough data for the salt and the mac. The equality is
+ there to ensure that there is at least one byte of encrypted data. */
+ if (len <= HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN) {
log_warn(LD_REND, "Length of descriptor's encrypted data is too small. "
"Got %lu but minimum value is %d",
- (unsigned long)len, HS_DESC_ENCRYPTED_MIN_LEN);
+ (unsigned long)len, HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN);
goto err;
}
- /* Encrypted data has the salt and MAC concatenated to it so remove those
- * from the validation calculation. */
- len -= HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN;
-
- /* Check that it's aligned on the block size of the crypto algorithm. */
- if (len % HS_DESC_PLAINTEXT_PADDING_MULTIPLE) {
- log_warn(LD_REND, "Length of descriptor's encrypted data is invalid. "
- "Got %lu which is not a multiple of %d.",
- (unsigned long) len, HS_DESC_PLAINTEXT_PADDING_MULTIPLE);
- goto err;
- }
-
- /* XXX: Check maximum size. Will strongly depends on the maximum intro point
- * allowed we decide on and probably if they will all have to use the legacy
- * key which is bigger than the ed25519 key. */
-
return 1;
err:
return 0;
}
-/* Decrypt the encrypted section of the descriptor using the given descriptor
- * object desc. A newly allocated NUL terminated string is put in
- * decrypted_out. Return the length of decrypted_out on success else 0 is
- * returned and decrypted_out is set to NULL. */
+/** Decrypt an encrypted descriptor layer at <b>encrypted_blob</b> of size
+ * <b>encrypted_blob_size</b>. Use the descriptor object <b>desc</b> to
+ * generate the right decryption keys; set <b>decrypted_out</b> to the
+ * plaintext. If <b>is_superencrypted_layer</b> is set, this is the outter
+ * encrypted layer of the descriptor. */
static size_t
-desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out)
+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)
{
uint8_t *decrypted = NULL;
uint8_t secret_key[HS_DESC_ENCRYPTED_KEY_LEN], secret_iv[CIPHER_IV_LEN];
@@ -1067,41 +1341,33 @@ desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out)
tor_assert(decrypted_out);
tor_assert(desc);
- tor_assert(desc->plaintext_data.encrypted_blob);
+ tor_assert(encrypted_blob);
- /* Construction is as follow: SALT | ENCRYPTED_DATA | MAC */
- if (!encrypted_data_length_is_valid(
- desc->plaintext_data.encrypted_blob_size)) {
+ /* Construction is as follow: SALT | ENCRYPTED_DATA | MAC .
+ * Make sure we have enough space for all these things. */
+ if (!encrypted_data_length_is_valid(encrypted_blob_size)) {
goto err;
}
/* Start of the blob thus the salt. */
- salt = desc->plaintext_data.encrypted_blob;
+ salt = encrypted_blob;
+
/* Next is the encrypted data. */
- encrypted = desc->plaintext_data.encrypted_blob +
- HS_DESC_ENCRYPTED_SALT_LEN;
- encrypted_len = desc->plaintext_data.encrypted_blob_size -
+ encrypted = encrypted_blob + HS_DESC_ENCRYPTED_SALT_LEN;
+ encrypted_len = encrypted_blob_size -
(HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN);
+ tor_assert(encrypted_len > 0); /* guaranteed by the check above */
- /* At the very end is the MAC. Make sure it's of the right size. */
- {
- desc_mac = encrypted + encrypted_len;
- size_t desc_mac_size = desc->plaintext_data.encrypted_blob_size -
- (desc_mac - desc->plaintext_data.encrypted_blob);
- if (desc_mac_size != DIGEST256_LEN) {
- log_warn(LD_REND, "Service descriptor MAC length of encrypted data "
- "is invalid (%lu, expected %u)",
- (unsigned long) desc_mac_size, DIGEST256_LEN);
- goto err;
- }
- }
+ /* And last comes the MAC. */
+ desc_mac = encrypted_blob + encrypted_blob_size - DIGEST256_LEN;
/* KDF construction resulting in a key from which the secret key, IV and MAC
* key are extracted which is what we need for the decryption. */
build_secret_key_iv_mac(desc, salt, HS_DESC_ENCRYPTED_SALT_LEN,
secret_key, sizeof(secret_key),
secret_iv, sizeof(secret_iv),
- mac_key, sizeof(mac_key));
+ mac_key, sizeof(mac_key),
+ is_superencrypted_layer);
/* Build MAC. */
build_mac(mac_key, sizeof(mac_key), salt, HS_DESC_ENCRYPTED_SALT_LEN,
@@ -1131,7 +1397,7 @@ desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out)
}
{
- /* Adjust length to remove NULL padding bytes */
+ /* Adjust length to remove NUL padding bytes */
uint8_t *end = memchr(decrypted, 0, encrypted_len);
result_len = encrypted_len;
if (end) {
@@ -1157,6 +1423,164 @@ desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out)
return result_len;
}
+/* Basic validation that the superencrypted client auth portion of the
+ * descriptor is well-formed and recognized. Return True if so, otherwise
+ * return False. */
+static int
+superencrypted_auth_data_is_valid(smartlist_t *tokens)
+{
+ /* XXX: This is just basic validation for now. When we implement client auth,
+ we can refactor this function so that it actually parses and saves the
+ data. */
+
+ { /* verify desc auth type */
+ const directory_token_t *tok;
+ tok = find_by_keyword(tokens, R3_DESC_AUTH_TYPE);
+ tor_assert(tok->n_args >= 1);
+ if (strcmp(tok->args[0], "x25519")) {
+ log_warn(LD_DIR, "Unrecognized desc auth type");
+ return 0;
+ }
+ }
+
+ { /* verify desc auth key */
+ const directory_token_t *tok;
+ curve25519_public_key_t k;
+ tok = find_by_keyword(tokens, R3_DESC_AUTH_KEY);
+ tor_assert(tok->n_args >= 1);
+ if (curve25519_public_from_base64(&k, tok->args[0]) < 0) {
+ log_warn(LD_DIR, "Bogus desc auth key in HS desc");
+ return 0;
+ }
+ }
+
+ /* verify desc auth client items */
+ SMARTLIST_FOREACH_BEGIN(tokens, const directory_token_t *, tok) {
+ if (tok->tp == R3_DESC_AUTH_CLIENT) {
+ tor_assert(tok->n_args >= 3);
+ }
+ } SMARTLIST_FOREACH_END(tok);
+
+ return 1;
+}
+
+/* Parse <b>message</b>, the plaintext of the superencrypted portion of an HS
+ * descriptor. Set <b>encrypted_out</b> to the encrypted blob, and return its
+ * size */
+STATIC size_t
+decode_superencrypted(const char *message, size_t message_len,
+ uint8_t **encrypted_out)
+{
+ int retval = 0;
+ memarea_t *area = NULL;
+ smartlist_t *tokens = NULL;
+
+ area = memarea_new();
+ tokens = smartlist_new();
+ if (tokenize_string(area, message, message + message_len, tokens,
+ hs_desc_superencrypted_v3_token_table, 0) < 0) {
+ log_warn(LD_REND, "Superencrypted portion is not parseable");
+ goto err;
+ }
+
+ /* Do some rudimentary validation of the authentication data */
+ if (!superencrypted_auth_data_is_valid(tokens)) {
+ log_warn(LD_REND, "Invalid auth data");
+ goto err;
+ }
+
+ /* Extract the encrypted data section. */
+ {
+ const directory_token_t *tok;
+ tok = find_by_keyword(tokens, R3_ENCRYPTED);
+ tor_assert(tok->object_body);
+ if (strcmp(tok->object_type, "MESSAGE") != 0) {
+ log_warn(LD_REND, "Desc superencrypted data section is invalid");
+ goto err;
+ }
+ /* Make sure the length of the encrypted blob is valid. */
+ if (!encrypted_data_length_is_valid(tok->object_size)) {
+ goto err;
+ }
+
+ /* Copy the encrypted blob to the descriptor object so we can handle it
+ * latter if needed. */
+ tor_assert(tok->object_size <= INT_MAX);
+ *encrypted_out = tor_memdup(tok->object_body, tok->object_size);
+ retval = (int) tok->object_size;
+ }
+
+ err:
+ SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t));
+ smartlist_free(tokens);
+ if (area) {
+ memarea_drop_all(area);
+ }
+
+ return retval;
+}
+
+/* Decrypt both the superencrypted and the encrypted section of the descriptor
+ * using the given descriptor object <b>desc</b>. A newly allocated NUL
+ * terminated string is put in decrypted_out which contains the inner encrypted
+ * layer of the descriptor. Return the length of decrypted_out on success else
+ * 0 is returned and decrypted_out is set to NULL. */
+static size_t
+desc_decrypt_all(const hs_descriptor_t *desc, char **decrypted_out)
+{
+ size_t decrypted_len = 0;
+ size_t encrypted_len = 0;
+ size_t superencrypted_len = 0;
+ char *superencrypted_plaintext = NULL;
+ uint8_t *encrypted_blob = NULL;
+
+ /** Function logic: This function takes us from the descriptor header to the
+ * inner encrypted layer, by decrypting and decoding the middle descriptor
+ * layer. In the end we return the contents of the inner encrypted layer to
+ * our caller. */
+
+ /* 1. Decrypt middle layer of descriptor */
+ superencrypted_len = decrypt_desc_layer(desc,
+ desc->plaintext_data.superencrypted_blob,
+ desc->plaintext_data.superencrypted_blob_size,
+ 1,
+ &superencrypted_plaintext);
+ if (!superencrypted_len) {
+ log_warn(LD_REND, "Decrypting superencrypted desc failed.");
+ goto err;
+ }
+ tor_assert(superencrypted_plaintext);
+
+ /* 2. Parse "superencrypted" */
+ encrypted_len = decode_superencrypted(superencrypted_plaintext,
+ superencrypted_len,
+ &encrypted_blob);
+ if (!encrypted_len) {
+ log_warn(LD_REND, "Decrypting encrypted desc failed.");
+ goto err;
+ }
+ tor_assert(encrypted_blob);
+
+ /* 3. Decrypt "encrypted" and set decrypted_out */
+ char *decrypted_desc;
+ decrypted_len = decrypt_desc_layer(desc,
+ encrypted_blob, encrypted_len,
+ 0, &decrypted_desc);
+ if (!decrypted_len) {
+ log_warn(LD_REND, "Decrypting encrypted desc failed.");
+ goto err;
+ }
+ tor_assert(decrypted_desc);
+
+ *decrypted_out = decrypted_desc;
+
+ err:
+ tor_free(superencrypted_plaintext);
+ tor_free(encrypted_blob);
+
+ return decrypted_len;
+}
+
/* Given the start of a section and the end of it, decode a single
* introduction point from that section. Return a newly allocated introduction
* point object containing the decoded data. Return NULL if the section can't
@@ -1289,7 +1713,9 @@ decode_introduction_point(const hs_descriptor_t *desc, const char *start)
tor_cert_free(cross_cert);
SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t));
smartlist_free(tokens);
- memarea_drop_all(area);
+ if (area) {
+ memarea_drop_all(area);
+ }
return ip;
}
@@ -1508,8 +1934,8 @@ desc_decode_plaintext_v3(smartlist_t *tokens,
/* Copy the encrypted blob to the descriptor object so we can handle it
* latter if needed. */
- desc->encrypted_blob = tor_memdup(tok->object_body, tok->object_size);
- desc->encrypted_blob_size = tok->object_size;
+ desc->superencrypted_blob = tor_memdup(tok->object_body, tok->object_size);
+ desc->superencrypted_blob_size = tok->object_size;
/* Extract signature and verify it. */
tok = find_by_keyword(tokens, R3_SIGNATURE);
@@ -1543,10 +1969,9 @@ desc_decode_encrypted_v3(const hs_descriptor_t *desc,
tor_assert(desc);
tor_assert(desc_encrypted_out);
- /* Decrypt the encrypted data that is located in the plaintext section in
- * the descriptor as a blob of bytes. The following functions will use the
- * keys found in the same section. */
- message_len = desc_decrypt_data_v3(desc, &message);
+ /* Decrypt the superencrypted data that is located in the plaintext section
+ * in the descriptor as a blob of bytes. */
+ message_len = desc_decrypt_all(desc, &message);
if (!message_len) {
log_warn(LD_REND, "Service descriptor decryption failed.");
goto err;
@@ -1572,7 +1997,7 @@ desc_decode_encrypted_v3(const hs_descriptor_t *desc,
}
/* Authentication type. It's optional but only once. */
- tok = find_opt_by_keyword(tokens, R3_AUTHENTICATION_REQUIRED);
+ tok = find_opt_by_keyword(tokens, R3_INTRO_AUTH_REQUIRED);
if (tok) {
if (!decode_auth_type(desc_encrypted_out, tok->args[0])) {
log_warn(LD_REND, "Service descriptor authentication type has "
@@ -1654,7 +2079,7 @@ hs_desc_decode_encrypted(const hs_descriptor_t *desc,
/* Calling this function without an encrypted blob to parse is a code flow
* error. The plaintext parsing should never succeed in the first place
* without an encrypted section. */
- tor_assert(desc->plaintext_data.encrypted_blob);
+ tor_assert(desc->plaintext_data.superencrypted_blob);
/* Let's make sure we have a supported version as well. By correctly parsing
* the plaintext, this should not fail. */
if (BUG(!hs_desc_is_supported_version(version))) {
@@ -1906,6 +2331,6 @@ hs_desc_plaintext_obj_size(const hs_desc_plaintext_data_t *data)
{
tor_assert(data);
return (sizeof(*data) + sizeof(*data->signing_key_cert) +
- data->encrypted_blob_size);
+ data->superencrypted_blob_size);
}
diff --git a/src/or/hs_descriptor.h b/src/or/hs_descriptor.h
index b520d24471..b7d512c06b 100644
--- a/src/or/hs_descriptor.h
+++ b/src/or/hs_descriptor.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -41,24 +41,11 @@
* the secret IV and MAC key length which is the length of H() output. */
#define HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN \
CIPHER256_KEY_LEN + CIPHER_IV_LEN + DIGEST256_LEN
-/* We need to pad the plaintext version of the encrypted data section before
- * encryption and it has to be a multiple of this value. */
-#define HS_DESC_PLAINTEXT_PADDING_MULTIPLE 128
-/* XXX: Let's make sure this makes sense as an upper limit for the padded
- * plaintext section. Then we should enforce it as now only an assert will be
- * triggered if we are above it. */
-/* Once padded, this is the maximum length in bytes for the plaintext. */
-#define HS_DESC_PADDED_PLAINTEXT_MAX_LEN 8192
-/* Minimum length in bytes of the encrypted portion of the descriptor. */
-#define HS_DESC_ENCRYPTED_MIN_LEN \
- HS_DESC_ENCRYPTED_SALT_LEN + \
- HS_DESC_PLAINTEXT_PADDING_MULTIPLE + DIGEST256_LEN
+/* Pad plaintext of superencrypted data section before encryption so that its
+ * length is a multiple of this value. */
+#define HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE 10000
/* Maximum length in bytes of a full hidden service descriptor. */
#define HS_DESC_MAX_LEN 50000 /* 50kb max size */
-/* The minimum amount of fields a descriptor should contain. The parsing of
- * the fields are version specific so the only required field, as a generic
- * view of a descriptor, is 1 that is the version field. */
-#define HS_DESC_PLAINTEXT_MIN_FIELDS 1
/* Key length for the descriptor symmetric encryption. As specified in the
* protocol, we use AES-256 for the encrypted section of the descriptor. The
@@ -68,8 +55,7 @@
/* Type of authentication in the descriptor. */
typedef enum {
- HS_DESC_AUTH_PASSWORD = 1,
- HS_DESC_AUTH_ED25519 = 2,
+ HS_DESC_AUTH_ED25519 = 1
} hs_desc_auth_type_t;
/* Type of encryption key in the descriptor. */
@@ -132,7 +118,7 @@ typedef struct hs_desc_encrypted_data_t {
/* A list of authentication types that a client must at least support one
* in order to contact the service. Contains NULL terminated strings. */
- smartlist_t *auth_types;
+ smartlist_t *intro_auth_types;
/* Is this descriptor a single onion service? */
unsigned int single_onion_service : 1;
@@ -167,11 +153,11 @@ typedef struct hs_desc_plaintext_data_t {
* has changed. Spec specifies this as a 8 bytes positive integer. */
uint64_t revision_counter;
- /* Decoding only: The base64-decoded encrypted blob from the descriptor */
- uint8_t *encrypted_blob;
+ /* Decoding only: The b64-decoded superencrypted blob from the descriptor */
+ uint8_t *superencrypted_blob;
- /* Decoding only: Size of the encrypted_blob */
- size_t encrypted_blob_size;
+ /* Decoding only: Size of the superencrypted_blob */
+ size_t superencrypted_blob_size;
} hs_desc_plaintext_data_t;
/* Service descriptor in its decoded form. */
@@ -242,6 +228,8 @@ STATIC int desc_sig_is_valid(const char *b64_sig,
const ed25519_public_key_t *signing_pubkey,
const char *encoded_desc, size_t encoded_len);
STATIC void desc_intro_point_free(hs_desc_intro_point_t *ip);
+STATIC size_t decode_superencrypted(const char *message, size_t message_len,
+ uint8_t **encrypted_out);
#endif /* HS_DESCRIPTOR_PRIVATE */
#endif /* TOR_HS_DESCRIPTOR_H */
diff --git a/src/or/hs_intropoint.c b/src/or/hs_intropoint.c
index db4ba7982a..2abbfcd6c3 100644
--- a/src/or/hs_intropoint.c
+++ b/src/or/hs_intropoint.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -43,16 +43,16 @@ get_auth_key_from_cell(ed25519_public_key_t *auth_key_out,
switch (cell_type) {
case RELAY_COMMAND_ESTABLISH_INTRO:
{
- const hs_cell_establish_intro_t *c_cell = cell;
- key_array = hs_cell_establish_intro_getconstarray_auth_key(c_cell);
- auth_key_len = hs_cell_establish_intro_getlen_auth_key(c_cell);
+ const trn_cell_establish_intro_t *c_cell = cell;
+ key_array = trn_cell_establish_intro_getconstarray_auth_key(c_cell);
+ auth_key_len = trn_cell_establish_intro_getlen_auth_key(c_cell);
break;
}
case RELAY_COMMAND_INTRODUCE1:
{
- const hs_cell_introduce1_t *c_cell = cell;
- key_array = hs_cell_introduce1_getconstarray_auth_key(cell);
- auth_key_len = hs_cell_introduce1_getlen_auth_key(c_cell);
+ const trn_cell_introduce1_t *c_cell = cell;
+ key_array = trn_cell_introduce1_getconstarray_auth_key(cell);
+ auth_key_len = trn_cell_introduce1_getlen_auth_key(c_cell);
break;
}
default:
@@ -68,22 +68,22 @@ get_auth_key_from_cell(ed25519_public_key_t *auth_key_out,
/** We received an ESTABLISH_INTRO <b>cell</b>. Verify its signature and MAC,
* given <b>circuit_key_material</b>. Return 0 on success else -1 on error. */
STATIC int
-verify_establish_intro_cell(const hs_cell_establish_intro_t *cell,
+verify_establish_intro_cell(const trn_cell_establish_intro_t *cell,
const uint8_t *circuit_key_material,
size_t circuit_key_material_len)
{
/* We only reach this function if the first byte of the cell is 0x02 which
- * means that auth_key_type is AUTH_KEY_ED25519, hence this check should
+ * means that auth_key_type is of ed25519 type, hence this check should
* always pass. See hs_intro_received_establish_intro(). */
- if (BUG(cell->auth_key_type != AUTH_KEY_ED25519)) {
+ if (BUG(cell->auth_key_type != HS_INTRO_AUTH_KEY_TYPE_ED25519)) {
return -1;
}
/* Make sure the auth key length is of the right size for this type. For
* EXTRA safety, we check both the size of the array and the length which
* must be the same. Safety first!*/
- if (hs_cell_establish_intro_getlen_auth_key(cell) != ED25519_PUBKEY_LEN ||
- hs_cell_establish_intro_get_auth_key_len(cell) != ED25519_PUBKEY_LEN) {
+ if (trn_cell_establish_intro_getlen_auth_key(cell) != ED25519_PUBKEY_LEN ||
+ trn_cell_establish_intro_get_auth_key_len(cell) != ED25519_PUBKEY_LEN) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"ESTABLISH_INTRO auth key length is invalid");
return -1;
@@ -94,13 +94,14 @@ verify_establish_intro_cell(const hs_cell_establish_intro_t *cell,
/* Verify the sig */
{
ed25519_signature_t sig_struct;
- const uint8_t *sig_array = hs_cell_establish_intro_getconstarray_sig(cell);
+ const uint8_t *sig_array =
+ trn_cell_establish_intro_getconstarray_sig(cell);
/* Make sure the signature length is of the right size. For EXTRA safety,
* we check both the size of the array and the length which must be the
* same. Safety first!*/
- if (hs_cell_establish_intro_getlen_sig(cell) != sizeof(sig_struct.sig) ||
- hs_cell_establish_intro_get_sig_len(cell) != sizeof(sig_struct.sig)) {
+ if (trn_cell_establish_intro_getlen_sig(cell) != sizeof(sig_struct.sig) ||
+ trn_cell_establish_intro_get_sig_len(cell) != sizeof(sig_struct.sig)) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"ESTABLISH_INTRO sig len is invalid");
return -1;
@@ -147,21 +148,21 @@ hs_intro_send_intro_established_cell,(or_circuit_t *circ))
int ret;
uint8_t *encoded_cell = NULL;
ssize_t encoded_len, result_len;
- hs_cell_intro_established_t *cell;
- cell_extension_t *ext;
+ trn_cell_intro_established_t *cell;
+ trn_cell_extension_t *ext;
tor_assert(circ);
/* Build the cell payload. */
- cell = hs_cell_intro_established_new();
- ext = cell_extension_new();
- cell_extension_set_num(ext, 0);
- hs_cell_intro_established_set_extensions(cell, ext);
+ cell = trn_cell_intro_established_new();
+ ext = trn_cell_extension_new();
+ trn_cell_extension_set_num(ext, 0);
+ trn_cell_intro_established_set_extensions(cell, ext);
/* Encode the cell to binary format. */
- encoded_len = hs_cell_intro_established_encoded_len(cell);
+ encoded_len = trn_cell_intro_established_encoded_len(cell);
tor_assert(encoded_len > 0);
encoded_cell = tor_malloc_zero(encoded_len);
- result_len = hs_cell_intro_established_encode(encoded_cell, encoded_len,
+ result_len = trn_cell_intro_established_encode(encoded_cell, encoded_len,
cell);
tor_assert(encoded_len == result_len);
@@ -170,7 +171,7 @@ hs_intro_send_intro_established_cell,(or_circuit_t *circ))
(char *) encoded_cell, encoded_len,
NULL);
/* On failure, the above function will close the circuit. */
- hs_cell_intro_established_free(cell);
+ trn_cell_intro_established_free(cell);
tor_free(encoded_cell);
return ret;
}
@@ -180,7 +181,7 @@ hs_intro_send_intro_established_cell,(or_circuit_t *circ))
* establish an intro point. */
static int
handle_verified_establish_intro_cell(or_circuit_t *circ,
- const hs_cell_establish_intro_t *parsed_cell)
+ const trn_cell_establish_intro_t *parsed_cell)
{
/* Get the auth key of this intro point */
ed25519_public_key_t auth_key;
@@ -195,7 +196,7 @@ handle_verified_establish_intro_cell(or_circuit_t *circ,
}
/* Associate intro point auth key with this circuit. */
- hs_circuitmap_register_intro_circ_v3(circ, &auth_key);
+ hs_circuitmap_register_intro_circ_v3_relay_side(circ, &auth_key);
/* Repurpose this circuit into an intro circuit. */
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT);
@@ -210,7 +211,7 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request,
size_t request_len)
{
int cell_ok, retval = -1;
- hs_cell_establish_intro_t *parsed_cell = NULL;
+ trn_cell_establish_intro_t *parsed_cell = NULL;
tor_assert(circ);
tor_assert(request);
@@ -224,7 +225,7 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request,
}
/* Parse the cell */
- ssize_t parsing_result = hs_cell_establish_intro_parse(&parsed_cell,
+ ssize_t parsing_result = trn_cell_establish_intro_parse(&parsed_cell,
request, request_len);
if (parsing_result < 0) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
@@ -259,7 +260,7 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request,
circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
done:
- hs_cell_establish_intro_free(parsed_cell);
+ trn_cell_establish_intro_free(parsed_cell);
return retval;
}
@@ -339,28 +340,28 @@ send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status)
int ret = -1;
uint8_t *encoded_cell = NULL;
ssize_t encoded_len, result_len;
- hs_cell_introduce_ack_t *cell;
- cell_extension_t *ext;
+ trn_cell_introduce_ack_t *cell;
+ trn_cell_extension_t *ext;
tor_assert(circ);
/* Setup the INTRODUCE_ACK cell. We have no extensions so the N_EXTENSIONS
* field is set to 0 by default with a new object. */
- cell = hs_cell_introduce_ack_new();
- ret = hs_cell_introduce_ack_set_status(cell, status);
+ cell = trn_cell_introduce_ack_new();
+ ret = trn_cell_introduce_ack_set_status(cell, status);
/* We have no cell extensions in an INTRODUCE_ACK cell. */
- ext = cell_extension_new();
- cell_extension_set_num(ext, 0);
- hs_cell_introduce_ack_set_extensions(cell, ext);
+ ext = trn_cell_extension_new();
+ trn_cell_extension_set_num(ext, 0);
+ trn_cell_introduce_ack_set_extensions(cell, ext);
/* A wrong status is a very bad code flow error as this value is controlled
* by the code in this file and not an external input. This means we use a
* code that is not known by the trunnel ABI. */
tor_assert(ret == 0);
/* Encode the payload. We should never fail to get the encoded length. */
- encoded_len = hs_cell_introduce_ack_encoded_len(cell);
+ encoded_len = trn_cell_introduce_ack_encoded_len(cell);
tor_assert(encoded_len > 0);
encoded_cell = tor_malloc_zero(encoded_len);
- result_len = hs_cell_introduce_ack_encode(encoded_cell, encoded_len, cell);
+ result_len = trn_cell_introduce_ack_encode(encoded_cell, encoded_len, cell);
tor_assert(encoded_len == result_len);
ret = relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ),
@@ -368,7 +369,7 @@ send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status)
(char *) encoded_cell, encoded_len,
NULL);
/* On failure, the above function will close the circuit. */
- hs_cell_introduce_ack_free(cell);
+ trn_cell_introduce_ack_free(cell);
tor_free(encoded_cell);
return ret;
}
@@ -376,7 +377,7 @@ send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status)
/* Validate a parsed INTRODUCE1 <b>cell</b>. Return 0 if valid or else a
* negative value for an invalid cell that should be NACKed. */
STATIC int
-validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell)
+validate_introduce1_parsed_cell(const trn_cell_introduce1_t *cell)
{
size_t legacy_key_id_len;
const uint8_t *legacy_key_id;
@@ -385,29 +386,29 @@ validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell)
/* This code path SHOULD NEVER be reached if the cell is a legacy type so
* safety net here. The legacy ID must be zeroes in this case. */
- legacy_key_id_len = hs_cell_introduce1_getlen_legacy_key_id(cell);
- legacy_key_id = hs_cell_introduce1_getconstarray_legacy_key_id(cell);
+ legacy_key_id_len = trn_cell_introduce1_getlen_legacy_key_id(cell);
+ legacy_key_id = trn_cell_introduce1_getconstarray_legacy_key_id(cell);
if (BUG(!tor_mem_is_zero((char *) legacy_key_id, legacy_key_id_len))) {
goto invalid;
}
/* The auth key of an INTRODUCE1 should be of type ed25519 thus leading to a
* known fixed length as well. */
- if (hs_cell_introduce1_get_auth_key_type(cell) !=
+ if (trn_cell_introduce1_get_auth_key_type(cell) !=
HS_INTRO_AUTH_KEY_TYPE_ED25519) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"Rejecting invalid INTRODUCE1 cell auth key type. "
"Responding with NACK.");
goto invalid;
}
- if (hs_cell_introduce1_get_auth_key_len(cell) != ED25519_PUBKEY_LEN ||
- hs_cell_introduce1_getlen_auth_key(cell) != ED25519_PUBKEY_LEN) {
+ if (trn_cell_introduce1_get_auth_key_len(cell) != ED25519_PUBKEY_LEN ||
+ trn_cell_introduce1_getlen_auth_key(cell) != ED25519_PUBKEY_LEN) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"Rejecting invalid INTRODUCE1 cell auth key length. "
"Responding with NACK.");
goto invalid;
}
- if (hs_cell_introduce1_getlen_encrypted(cell) == 0) {
+ if (trn_cell_introduce1_getlen_encrypted(cell) == 0) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"Rejecting invalid INTRODUCE1 cell encrypted length. "
"Responding with NACK.");
@@ -430,7 +431,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request,
{
int ret = -1;
or_circuit_t *service_circ;
- hs_cell_introduce1_t *parsed_cell;
+ trn_cell_introduce1_t *parsed_cell;
hs_intro_ack_status_t status = HS_INTRO_ACK_STATUS_SUCCESS;
tor_assert(client_circ);
@@ -439,7 +440,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request,
/* Parse cell. Note that we can only parse the non encrypted section for
* which we'll use the authentication key to find the service introduction
* circuit and relay the cell on it. */
- ssize_t cell_size = hs_cell_introduce1_parse(&parsed_cell, request,
+ ssize_t cell_size = trn_cell_introduce1_parse(&parsed_cell, request,
request_len);
if (cell_size < 0) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
@@ -461,7 +462,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request,
{
ed25519_public_key_t auth_key;
get_auth_key_from_cell(&auth_key, RELAY_COMMAND_INTRODUCE1, parsed_cell);
- service_circ = hs_circuitmap_get_intro_circ_v3(&auth_key);
+ service_circ = hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key);
if (service_circ == NULL) {
char b64_key[ED25519_BASE64_LEN + 1];
ed25519_public_to_base64(b64_key, &auth_key);
@@ -505,7 +506,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request,
circuit_mark_for_close(TO_CIRCUIT(client_circ), END_CIRC_REASON_INTERNAL);
}
done:
- hs_cell_introduce1_free(parsed_cell);
+ trn_cell_introduce1_free(parsed_cell);
return ret;
}
diff --git a/src/or/hs_intropoint.h b/src/or/hs_intropoint.h
index e6024a858f..163ed810e7 100644
--- a/src/or/hs_intropoint.h
+++ b/src/or/hs_intropoint.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -41,7 +41,7 @@ int hs_intro_circuit_is_suitable_for_establish_intro(const or_circuit_t *circ);
#include "hs/cell_introduce1.h"
STATIC int
-verify_establish_intro_cell(const hs_cell_establish_intro_t *out,
+verify_establish_intro_cell(const trn_cell_establish_intro_t *out,
const uint8_t *circuit_key_material,
size_t circuit_key_material_len);
@@ -52,7 +52,7 @@ get_auth_key_from_cell(ed25519_public_key_t *auth_key_out,
STATIC int introduce1_cell_is_legacy(const uint8_t *request);
STATIC int handle_introduce1(or_circuit_t *client_circ,
const uint8_t *request, size_t request_len);
-STATIC int validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell);
+STATIC int validate_introduce1_parsed_cell(const trn_cell_introduce1_t *cell);
STATIC int circuit_is_suitable_for_introduce1(const or_circuit_t *circ);
#endif /* HS_INTROPOINT_PRIVATE */
diff --git a/src/or/hs_ntor.c b/src/or/hs_ntor.c
new file mode 100644
index 0000000000..119899817e
--- /dev/null
+++ b/src/or/hs_ntor.c
@@ -0,0 +1,626 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/** \file hs_ntor.c
+ * \brief Implements the ntor variant used in Tor hidden services.
+ *
+ * \details
+ * This module handles the variant of the ntor handshake that is documented in
+ * section [NTOR-WITH-EXTRA-DATA] of rend-spec-ng.txt .
+ *
+ * The functions in this file provide an API that should be used when sending
+ * or receiving INTRODUCE1/RENDEZVOUS1 cells to generate the various key
+ * material required to create and handle those cells.
+ *
+ * In the case of INTRODUCE1 it provides encryption and MAC keys to
+ * encode/decode the encrypted blob (see hs_ntor_intro_cell_keys_t). The
+ * relevant pub functions are hs_ntor_{client,service}_get_introduce1_keys().
+ *
+ * In the case of RENDEZVOUS1 it calculates the MAC required to authenticate
+ * the cell, and also provides the key seed that is used to derive the crypto
+ * material for rendezvous encryption (see hs_ntor_rend_cell_keys_t). The
+ * relevant pub functions are hs_ntor_{client,service}_get_rendezvous1_keys().
+ * It also provides a function (hs_ntor_circuit_key_expansion()) that does the
+ * rendezvous key expansion to setup end-to-end rend circuit keys.
+ */
+
+#include "or.h"
+#include "hs_ntor.h"
+
+/* String constants used by the ntor HS protocol */
+#define PROTOID "tor-hs-ntor-curve25519-sha3-256-1"
+#define PROTOID_LEN (sizeof(PROTOID) - 1)
+#define SERVER_STR "Server"
+#define SERVER_STR_LEN (sizeof(SERVER_STR) - 1)
+
+/* Protocol-specific tweaks to our crypto inputs */
+#define T_HSENC PROTOID ":hs_key_extract"
+#define T_HSENC_LEN (sizeof(T_HSENC) - 1)
+#define T_HSVERIFY PROTOID ":hs_verify"
+#define T_HSMAC PROTOID ":hs_mac"
+#define M_HSEXPAND PROTOID ":hs_key_expand"
+#define M_HSEXPAND_LEN (sizeof(M_HSEXPAND) - 1)
+
+/************************* Helper functions: *******************************/
+
+/** Helper macro: copy <b>len</b> bytes from <b>inp</b> to <b>ptr</b> and
+ *advance <b>ptr</b> by the number of bytes copied. Stolen from onion_ntor.c */
+#define APPEND(ptr, inp, len) \
+ STMT_BEGIN { \
+ memcpy(ptr, (inp), (len)); \
+ ptr += len; \
+ } STMT_END
+
+/* Length of EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID */
+#define REND_SECRET_HS_INPUT_LEN (CURVE25519_OUTPUT_LEN * 2 + \
+ ED25519_PUBKEY_LEN + CURVE25519_PUBKEY_LEN * 3 + PROTOID_LEN)
+/* Length of auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" */
+#define REND_AUTH_INPUT_LEN (DIGEST256_LEN + ED25519_PUBKEY_LEN + \
+ CURVE25519_PUBKEY_LEN * 3 + PROTOID_LEN + SERVER_STR_LEN)
+
+/** Helper function: Compute the last part of the HS ntor handshake which
+ * derives key material necessary to create and handle RENDEZVOUS1
+ * cells. Function used by both client and service. The actual calculations is
+ * as follows:
+ *
+ * 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)
+ *
+ * where in the above, AUTH_KEY is <b>intro_auth_pubkey</b>, B is
+ * <b>intro_enc_pubkey</b>, Y is <b>service_ephemeral_rend_pubkey</b>, and X
+ * is <b>client_ephemeral_enc_pubkey</b>. The provided
+ * <b>rend_secret_hs_input</b> is of size REND_SECRET_HS_INPUT_LEN.
+ *
+ * The final results of NTOR_KEY_SEED and auth_input_mac are placed in
+ * <b>hs_ntor_rend_cell_keys_out</b>. Return 0 if everything went fine. */
+static int
+get_rendezvous1_key_material(const uint8_t *rend_secret_hs_input,
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_public_key_t *intro_enc_pubkey,
+ const curve25519_public_key_t *service_ephemeral_rend_pubkey,
+ const curve25519_public_key_t *client_ephemeral_enc_pubkey,
+ hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out)
+{
+ int bad = 0;
+ uint8_t ntor_key_seed[DIGEST256_LEN];
+ uint8_t ntor_verify[DIGEST256_LEN];
+ uint8_t rend_auth_input[REND_AUTH_INPUT_LEN];
+ uint8_t rend_cell_auth[DIGEST256_LEN];
+ uint8_t *ptr;
+
+ /* Let's build NTOR_KEY_SEED */
+ crypto_mac_sha3_256(ntor_key_seed, sizeof(ntor_key_seed),
+ rend_secret_hs_input, REND_SECRET_HS_INPUT_LEN,
+ (const uint8_t *)T_HSENC, strlen(T_HSENC));
+ bad |= safe_mem_is_zero(ntor_key_seed, DIGEST256_LEN);
+
+ /* Let's build ntor_verify */
+ crypto_mac_sha3_256(ntor_verify, sizeof(ntor_verify),
+ rend_secret_hs_input, REND_SECRET_HS_INPUT_LEN,
+ (const uint8_t *)T_HSVERIFY, strlen(T_HSVERIFY));
+ bad |= safe_mem_is_zero(ntor_verify, DIGEST256_LEN);
+
+ /* Let's build auth_input: */
+ ptr = rend_auth_input;
+ /* Append ntor_verify */
+ APPEND(ptr, ntor_verify, sizeof(ntor_verify));
+ /* Append AUTH_KEY */
+ APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN);
+ /* Append B */
+ APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN);
+ /* Append Y */
+ APPEND(ptr,
+ service_ephemeral_rend_pubkey->public_key, CURVE25519_PUBKEY_LEN);
+ /* Append X */
+ APPEND(ptr,
+ client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN);
+ /* Append PROTOID */
+ APPEND(ptr, PROTOID, strlen(PROTOID));
+ /* Append "Server" */
+ APPEND(ptr, SERVER_STR, strlen(SERVER_STR));
+ tor_assert(ptr == rend_auth_input + sizeof(rend_auth_input));
+
+ /* Let's build auth_input_mac that goes in RENDEZVOUS1 cell */
+ crypto_mac_sha3_256(rend_cell_auth, sizeof(rend_cell_auth),
+ rend_auth_input, sizeof(rend_auth_input),
+ (const uint8_t *)T_HSMAC, strlen(T_HSMAC));
+ bad |= safe_mem_is_zero(ntor_verify, DIGEST256_LEN);
+
+ { /* Get the computed RENDEZVOUS1 material! */
+ memcpy(&hs_ntor_rend_cell_keys_out->rend_cell_auth_mac,
+ rend_cell_auth, DIGEST256_LEN);
+ memcpy(&hs_ntor_rend_cell_keys_out->ntor_key_seed,
+ ntor_key_seed, DIGEST256_LEN);
+ }
+
+ memwipe(rend_cell_auth, 0, sizeof(rend_cell_auth));
+ memwipe(rend_auth_input, 0, sizeof(rend_auth_input));
+ memwipe(ntor_key_seed, 0, sizeof(ntor_key_seed));
+
+ return bad;
+}
+
+/** Length of secret_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID */
+#define INTRO_SECRET_HS_INPUT_LEN (CURVE25519_OUTPUT_LEN +ED25519_PUBKEY_LEN +\
+ CURVE25519_PUBKEY_LEN + CURVE25519_PUBKEY_LEN + PROTOID_LEN)
+/* Length of info = m_hsexpand | subcredential */
+#define INFO_BLOB_LEN (M_HSEXPAND_LEN + DIGEST256_LEN)
+/* Length of KDF input = intro_secret_hs_input | t_hsenc | info */
+#define KDF_INPUT_LEN (INTRO_SECRET_HS_INPUT_LEN + T_HSENC_LEN + INFO_BLOB_LEN)
+
+/** Helper function: Compute the part of the HS ntor handshake that generates
+ * key material for creating and handling INTRODUCE1 cells. Function used
+ * by both client and service. Specifically, calculate the following:
+ *
+ * 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]
+ *
+ * where intro_secret_hs_input is <b>secret_input</b> (of size
+ * INTRO_SECRET_HS_INPUT_LEN), and <b>subcredential</b> is of size
+ * DIGEST256_LEN.
+ *
+ * If everything went well, fill <b>hs_ntor_intro_cell_keys_out</b> with the
+ * necessary key material, and return 0. */
+static void
+get_introduce1_key_material(const uint8_t *secret_input,
+ const uint8_t *subcredential,
+ hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out)
+{
+ uint8_t keystream[CIPHER256_KEY_LEN + DIGEST256_LEN];
+ uint8_t info_blob[INFO_BLOB_LEN];
+ uint8_t kdf_input[KDF_INPUT_LEN];
+ crypto_xof_t *xof;
+ uint8_t *ptr;
+
+ /* Let's build info */
+ ptr = info_blob;
+ APPEND(ptr, M_HSEXPAND, strlen(M_HSEXPAND));
+ APPEND(ptr, subcredential, DIGEST256_LEN);
+ tor_assert(ptr == info_blob + sizeof(info_blob));
+
+ /* Let's build the input to the KDF */
+ ptr = kdf_input;
+ APPEND(ptr, secret_input, INTRO_SECRET_HS_INPUT_LEN);
+ APPEND(ptr, T_HSENC, strlen(T_HSENC));
+ APPEND(ptr, info_blob, sizeof(info_blob));
+ tor_assert(ptr == kdf_input + sizeof(kdf_input));
+
+ /* Now we need to run kdf_input over SHAKE-256 */
+ xof = crypto_xof_new();
+ crypto_xof_add_bytes(xof, kdf_input, sizeof(kdf_input));
+ crypto_xof_squeeze_bytes(xof, keystream, sizeof(keystream)) ;
+ crypto_xof_free(xof);
+
+ { /* Get the keys */
+ memcpy(&hs_ntor_intro_cell_keys_out->enc_key, keystream,CIPHER256_KEY_LEN);
+ memcpy(&hs_ntor_intro_cell_keys_out->mac_key,
+ keystream+CIPHER256_KEY_LEN, DIGEST256_LEN);
+ }
+
+ memwipe(keystream, 0, sizeof(keystream));
+ memwipe(kdf_input, 0, sizeof(kdf_input));
+}
+
+/** Helper function: Calculate the 'intro_secret_hs_input' element used by the
+ * HS ntor handshake and place it in <b>secret_input_out</b>. This function is
+ * used by both client and service code.
+ *
+ * For the client-side it looks like this:
+ *
+ * intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID
+ *
+ * whereas for the service-side it looks like this:
+ *
+ * intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID
+ *
+ * In this function, <b>dh_result</b> carries the EXP() result (and has size
+ * CURVE25519_OUTPUT_LEN) <b>intro_auth_pubkey</b> is AUTH_KEY,
+ * <b>client_ephemeral_enc_pubkey</b> is X, and <b>intro_enc_pubkey</b> is B.
+ */
+static void
+get_intro_secret_hs_input(const uint8_t *dh_result,
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_public_key_t *client_ephemeral_enc_pubkey,
+ const curve25519_public_key_t *intro_enc_pubkey,
+ uint8_t *secret_input_out)
+{
+ uint8_t *ptr;
+
+ /* Append EXP() */
+ ptr = secret_input_out;
+ APPEND(ptr, dh_result, CURVE25519_OUTPUT_LEN);
+ /* Append AUTH_KEY */
+ APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN);
+ /* Append X */
+ APPEND(ptr, client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN);
+ /* Append B */
+ APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN);
+ /* Append PROTOID */
+ APPEND(ptr, PROTOID, strlen(PROTOID));
+ tor_assert(ptr == secret_input_out + INTRO_SECRET_HS_INPUT_LEN);
+}
+
+/** Calculate the 'rend_secret_hs_input' element used by the HS ntor handshake
+ * and place it in <b>rend_secret_hs_input_out</b>. This function is used by
+ * both client and service code.
+ *
+ * The computation on the client side is:
+ * rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID
+ * whereas on the service side it is:
+ * rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID
+ *
+ * where:
+ * <b>dh_result1</b> and <b>dh_result2</b> carry the two EXP() results (of size
+ * CURVE25519_OUTPUT_LEN)
+ * <b>intro_auth_pubkey</b> is AUTH_KEY,
+ * <b>intro_enc_pubkey</b> is B,
+ * <b>client_ephemeral_enc_pubkey</b> is X, and
+ * <b>service_ephemeral_rend_pubkey</b> is Y.
+ */
+static void
+get_rend_secret_hs_input(const uint8_t *dh_result1, const uint8_t *dh_result2,
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_public_key_t *intro_enc_pubkey,
+ const curve25519_public_key_t *client_ephemeral_enc_pubkey,
+ const curve25519_public_key_t *service_ephemeral_rend_pubkey,
+ uint8_t *rend_secret_hs_input_out)
+{
+ uint8_t *ptr;
+
+ ptr = rend_secret_hs_input_out;
+ /* Append the first EXP() */
+ APPEND(ptr, dh_result1, CURVE25519_OUTPUT_LEN);
+ /* Append the other EXP() */
+ APPEND(ptr, dh_result2, CURVE25519_OUTPUT_LEN);
+ /* Append AUTH_KEY */
+ APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN);
+ /* Append B */
+ APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN);
+ /* Append X */
+ APPEND(ptr,
+ client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN);
+ /* Append Y */
+ APPEND(ptr,
+ service_ephemeral_rend_pubkey->public_key, CURVE25519_PUBKEY_LEN);
+ /* Append PROTOID */
+ APPEND(ptr, PROTOID, strlen(PROTOID));
+ tor_assert(ptr == rend_secret_hs_input_out + REND_SECRET_HS_INPUT_LEN);
+}
+
+/************************* Public functions: *******************************/
+
+/* Public function: Do the appropriate ntor calculations and derive the keys
+ * needed to encrypt and authenticate INTRODUCE1 cells. Return 0 and place the
+ * final key material in <b>hs_ntor_intro_cell_keys_out</b> if everything went
+ * well, otherwise return -1;
+ *
+ * The relevant calculations are 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]
+ *
+ * where:
+ * <b>intro_auth_pubkey</b> is AUTH_KEY (found in HS descriptor),
+ * <b>intro_enc_pubkey</b> is B (also found in HS descriptor),
+ * <b>client_ephemeral_enc_keypair</b> is freshly generated keypair (x,X)
+ * <b>subcredential</b> is the hidden service subcredential (of size
+ * DIGEST256_LEN). */
+int
+hs_ntor_client_get_introduce1_keys(
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_public_key_t *intro_enc_pubkey,
+ const curve25519_keypair_t *client_ephemeral_enc_keypair,
+ const uint8_t *subcredential,
+ hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out)
+{
+ int bad = 0;
+ uint8_t secret_input[INTRO_SECRET_HS_INPUT_LEN];
+ uint8_t dh_result[CURVE25519_OUTPUT_LEN];
+
+ tor_assert(intro_auth_pubkey);
+ tor_assert(intro_enc_pubkey);
+ tor_assert(client_ephemeral_enc_keypair);
+ tor_assert(subcredential);
+ tor_assert(hs_ntor_intro_cell_keys_out);
+
+ /* Calculate EXP(B,x) */
+ curve25519_handshake(dh_result,
+ &client_ephemeral_enc_keypair->seckey,
+ intro_enc_pubkey);
+ bad |= safe_mem_is_zero(dh_result, CURVE25519_OUTPUT_LEN);
+
+ /* Get intro_secret_hs_input */
+ get_intro_secret_hs_input(dh_result, intro_auth_pubkey,
+ &client_ephemeral_enc_keypair->pubkey,
+ intro_enc_pubkey, secret_input);
+ bad |= safe_mem_is_zero(secret_input, CURVE25519_OUTPUT_LEN);
+
+ /* Get ENC_KEY and MAC_KEY! */
+ get_introduce1_key_material(secret_input, subcredential,
+ hs_ntor_intro_cell_keys_out);
+
+ /* Cleanup */
+ memwipe(secret_input, 0, sizeof(secret_input));
+ if (bad) {
+ memwipe(hs_ntor_intro_cell_keys_out, 0, sizeof(hs_ntor_intro_cell_keys_t));
+ }
+
+ return bad ? -1 : 0;
+}
+
+/* Public function: Do the appropriate ntor calculations and derive the keys
+ * needed to verify RENDEZVOUS1 cells and encrypt further rendezvous
+ * traffic. Return 0 and place the final key material in
+ * <b>hs_ntor_rend_cell_keys_out</b> if everything went well, else return -1.
+ *
+ * The relevant calculations are as follows:
+ *
+ * rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | 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)
+ *
+ * where:
+ * <b>intro_auth_pubkey</b> is AUTH_KEY (found in HS descriptor),
+ * <b>client_ephemeral_enc_keypair</b> is freshly generated keypair (x,X)
+ * <b>intro_enc_pubkey</b> is B (also found in HS descriptor),
+ * <b>service_ephemeral_rend_pubkey</b> is Y (SERVER_PK in RENDEZVOUS1 cell) */
+int
+hs_ntor_client_get_rendezvous1_keys(
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_keypair_t *client_ephemeral_enc_keypair,
+ const curve25519_public_key_t *intro_enc_pubkey,
+ const curve25519_public_key_t *service_ephemeral_rend_pubkey,
+ hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out)
+{
+ int bad = 0;
+ uint8_t rend_secret_hs_input[REND_SECRET_HS_INPUT_LEN];
+ uint8_t dh_result1[CURVE25519_OUTPUT_LEN];
+ uint8_t dh_result2[CURVE25519_OUTPUT_LEN];
+
+ tor_assert(intro_auth_pubkey);
+ tor_assert(client_ephemeral_enc_keypair);
+ tor_assert(intro_enc_pubkey);
+ tor_assert(service_ephemeral_rend_pubkey);
+ tor_assert(hs_ntor_rend_cell_keys_out);
+
+ /* Compute EXP(Y, x) */
+ curve25519_handshake(dh_result1,
+ &client_ephemeral_enc_keypair->seckey,
+ service_ephemeral_rend_pubkey);
+ bad |= safe_mem_is_zero(dh_result1, CURVE25519_OUTPUT_LEN);
+
+ /* Compute EXP(B, x) */
+ curve25519_handshake(dh_result2,
+ &client_ephemeral_enc_keypair->seckey,
+ intro_enc_pubkey);
+ bad |= safe_mem_is_zero(dh_result2, CURVE25519_OUTPUT_LEN);
+
+ /* Get rend_secret_hs_input */
+ get_rend_secret_hs_input(dh_result1, dh_result2,
+ intro_auth_pubkey, intro_enc_pubkey,
+ &client_ephemeral_enc_keypair->pubkey,
+ service_ephemeral_rend_pubkey,
+ rend_secret_hs_input);
+
+ /* Get NTOR_KEY_SEED and the auth_input MAC */
+ bad |= get_rendezvous1_key_material(rend_secret_hs_input,
+ intro_auth_pubkey,
+ intro_enc_pubkey,
+ service_ephemeral_rend_pubkey,
+ &client_ephemeral_enc_keypair->pubkey,
+ hs_ntor_rend_cell_keys_out);
+
+ memwipe(rend_secret_hs_input, 0, sizeof(rend_secret_hs_input));
+ if (bad) {
+ memwipe(hs_ntor_rend_cell_keys_out, 0, sizeof(hs_ntor_rend_cell_keys_t));
+ }
+
+ return bad ? -1 : 0;
+}
+
+/* Public function: Do the appropriate ntor calculations and derive the keys
+ * needed to decrypt and verify INTRODUCE1 cells. Return 0 and place the final
+ * key material in <b>hs_ntor_intro_cell_keys_out</b> if everything went well,
+ * otherwise return -1;
+ *
+ * The relevant calculations are 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]
+ *
+ * where:
+ * <b>intro_auth_pubkey</b> is AUTH_KEY (introduction point auth key),
+ * <b>intro_enc_keypair</b> is (b,B) (introduction point encryption keypair),
+ * <b>client_ephemeral_enc_pubkey</b> is X (CLIENT_PK in INTRODUCE2 cell),
+ * <b>subcredential</b> is the HS subcredential (of size DIGEST256_LEN) */
+int
+hs_ntor_service_get_introduce1_keys(
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_keypair_t *intro_enc_keypair,
+ const curve25519_public_key_t *client_ephemeral_enc_pubkey,
+ const uint8_t *subcredential,
+ hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out)
+{
+ int bad = 0;
+ uint8_t secret_input[INTRO_SECRET_HS_INPUT_LEN];
+ uint8_t dh_result[CURVE25519_OUTPUT_LEN];
+
+ tor_assert(intro_auth_pubkey);
+ tor_assert(intro_enc_keypair);
+ tor_assert(client_ephemeral_enc_pubkey);
+ tor_assert(subcredential);
+ tor_assert(hs_ntor_intro_cell_keys_out);
+
+ /* Compute EXP(X, b) */
+ curve25519_handshake(dh_result,
+ &intro_enc_keypair->seckey,
+ client_ephemeral_enc_pubkey);
+ bad |= safe_mem_is_zero(dh_result, CURVE25519_OUTPUT_LEN);
+
+ /* Get intro_secret_hs_input */
+ get_intro_secret_hs_input(dh_result, intro_auth_pubkey,
+ client_ephemeral_enc_pubkey,
+ &intro_enc_keypair->pubkey,
+ secret_input);
+ bad |= safe_mem_is_zero(secret_input, CURVE25519_OUTPUT_LEN);
+
+ /* Get ENC_KEY and MAC_KEY! */
+ get_introduce1_key_material(secret_input, subcredential,
+ hs_ntor_intro_cell_keys_out);
+
+ memwipe(secret_input, 0, sizeof(secret_input));
+ if (bad) {
+ memwipe(hs_ntor_intro_cell_keys_out, 0, sizeof(hs_ntor_intro_cell_keys_t));
+ }
+
+ return bad ? -1 : 0;
+}
+
+/* Public function: Do the appropriate ntor calculations and derive the keys
+ * needed to create and authenticate RENDEZVOUS1 cells. Return 0 and place the
+ * final key material in <b>hs_ntor_rend_cell_keys_out</b> if all went fine,
+ * return -1 if error happened.
+ *
+ * The relevant calculations are as follows:
+ *
+ * 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)
+ *
+ * where:
+ * <b>intro_auth_pubkey</b> is AUTH_KEY (intro point auth key),
+ * <b>intro_enc_keypair</b> is (b,B) (intro point enc keypair)
+ * <b>service_ephemeral_rend_keypair</b> is a fresh (y,Y) keypair
+ * <b>client_ephemeral_enc_pubkey</b> is X (CLIENT_PK in INTRODUCE2 cell) */
+int
+hs_ntor_service_get_rendezvous1_keys(
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_keypair_t *intro_enc_keypair,
+ const curve25519_keypair_t *service_ephemeral_rend_keypair,
+ const curve25519_public_key_t *client_ephemeral_enc_pubkey,
+ hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out)
+{
+ int bad = 0;
+ uint8_t rend_secret_hs_input[REND_SECRET_HS_INPUT_LEN];
+ uint8_t dh_result1[CURVE25519_OUTPUT_LEN];
+ uint8_t dh_result2[CURVE25519_OUTPUT_LEN];
+
+ tor_assert(intro_auth_pubkey);
+ tor_assert(intro_enc_keypair);
+ tor_assert(service_ephemeral_rend_keypair);
+ tor_assert(client_ephemeral_enc_pubkey);
+ tor_assert(hs_ntor_rend_cell_keys_out);
+
+ /* Compute EXP(X, y) */
+ curve25519_handshake(dh_result1,
+ &service_ephemeral_rend_keypair->seckey,
+ client_ephemeral_enc_pubkey);
+ bad |= safe_mem_is_zero(dh_result1, CURVE25519_OUTPUT_LEN);
+
+ /* Compute EXP(X, b) */
+ curve25519_handshake(dh_result2,
+ &intro_enc_keypair->seckey,
+ client_ephemeral_enc_pubkey);
+ bad |= safe_mem_is_zero(dh_result2, CURVE25519_OUTPUT_LEN);
+
+ /* Get rend_secret_hs_input */
+ get_rend_secret_hs_input(dh_result1, dh_result2,
+ intro_auth_pubkey,
+ &intro_enc_keypair->pubkey,
+ client_ephemeral_enc_pubkey,
+ &service_ephemeral_rend_keypair->pubkey,
+ rend_secret_hs_input);
+
+ /* Get NTOR_KEY_SEED and AUTH_INPUT_MAC! */
+ bad |= get_rendezvous1_key_material(rend_secret_hs_input,
+ intro_auth_pubkey,
+ &intro_enc_keypair->pubkey,
+ &service_ephemeral_rend_keypair->pubkey,
+ client_ephemeral_enc_pubkey,
+ hs_ntor_rend_cell_keys_out);
+
+ memwipe(rend_secret_hs_input, 0, sizeof(rend_secret_hs_input));
+ if (bad) {
+ memwipe(hs_ntor_rend_cell_keys_out, 0, sizeof(hs_ntor_rend_cell_keys_t));
+ }
+
+ return bad ? -1 : 0;
+}
+
+/** Given a received RENDEZVOUS2 MAC in <b>mac</b> (of length DIGEST256_LEN),
+ * and the RENDEZVOUS1 key material in <b>hs_ntor_rend_cell_keys</b>, return 1
+ * if the MAC is good, otherwise return 0. */
+int
+hs_ntor_client_rendezvous2_mac_is_good(
+ const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys,
+ const uint8_t *rcvd_mac)
+{
+ tor_assert(rcvd_mac);
+ tor_assert(hs_ntor_rend_cell_keys);
+
+ return tor_memeq(hs_ntor_rend_cell_keys->rend_cell_auth_mac,
+ rcvd_mac, DIGEST256_LEN);
+}
+
+/* Input length to KDF for key expansion */
+#define NTOR_KEY_EXPANSION_KDF_INPUT_LEN (DIGEST256_LEN + M_HSEXPAND_LEN)
+/* Output length of KDF for key expansion */
+#define NTOR_KEY_EXPANSION_KDF_OUTPUT_LEN (DIGEST256_LEN*3+CIPHER256_KEY_LEN*2)
+
+/** Given the rendezvous key material in <b>hs_ntor_rend_cell_keys</b>, do the
+ * circuit key expansion as specified by section '4.2.1. Key expansion' and
+ * return a hs_ntor_rend_circuit_keys_t structure with the computed keys. */
+hs_ntor_rend_circuit_keys_t *
+hs_ntor_circuit_key_expansion(
+ const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys)
+{
+ uint8_t *ptr;
+ uint8_t kdf_input[NTOR_KEY_EXPANSION_KDF_INPUT_LEN];
+ uint8_t keys[NTOR_KEY_EXPANSION_KDF_OUTPUT_LEN];
+ crypto_xof_t *xof;
+ hs_ntor_rend_circuit_keys_t *rend_circuit_keys = NULL;
+
+ /* Let's build the input to the KDF */
+ ptr = kdf_input;
+ APPEND(ptr, hs_ntor_rend_cell_keys->ntor_key_seed, DIGEST256_LEN);
+ APPEND(ptr, M_HSEXPAND, strlen(M_HSEXPAND));
+ tor_assert(ptr == kdf_input + sizeof(kdf_input));
+
+ /* Generate the keys */
+ xof = crypto_xof_new();
+ crypto_xof_add_bytes(xof, kdf_input, sizeof(kdf_input));
+ crypto_xof_squeeze_bytes(xof, keys, sizeof(keys));
+ crypto_xof_free(xof);
+
+ /* Generate keys structure and assign keys to it */
+ rend_circuit_keys = tor_malloc_zero(sizeof(hs_ntor_rend_circuit_keys_t));
+ ptr = keys;
+ memcpy(rend_circuit_keys->KH, ptr, DIGEST256_LEN);
+ ptr += DIGEST256_LEN;;
+ memcpy(rend_circuit_keys->Df, ptr, DIGEST256_LEN);
+ ptr += DIGEST256_LEN;
+ memcpy(rend_circuit_keys->Db, ptr, DIGEST256_LEN);
+ ptr += DIGEST256_LEN;
+ memcpy(rend_circuit_keys->Kf, ptr, CIPHER256_KEY_LEN);
+ ptr += CIPHER256_KEY_LEN;
+ memcpy(rend_circuit_keys->Kb, ptr, CIPHER256_KEY_LEN);
+ ptr += CIPHER256_KEY_LEN;
+ tor_assert(ptr == keys + sizeof(keys));
+
+ return rend_circuit_keys;
+}
+
diff --git a/src/or/hs_ntor.h b/src/or/hs_ntor.h
new file mode 100644
index 0000000000..cd75f46a4c
--- /dev/null
+++ b/src/or/hs_ntor.h
@@ -0,0 +1,77 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_HS_NTOR_H
+#define TOR_HS_NTOR_H
+
+#include "or.h"
+
+/* Key material needed to encode/decode INTRODUCE1 cells */
+typedef struct {
+ /* Key used for encryption of encrypted INTRODUCE1 blob */
+ uint8_t enc_key[CIPHER256_KEY_LEN];
+ /* MAC key used to protect encrypted INTRODUCE1 blob */
+ uint8_t mac_key[DIGEST256_LEN];
+} hs_ntor_intro_cell_keys_t;
+
+/* Key material needed to encode/decode RENDEZVOUS1 cells */
+typedef struct {
+ /* This is the MAC of the HANDSHAKE_INFO field */
+ uint8_t rend_cell_auth_mac[DIGEST256_LEN];
+ /* This is the key seed used to derive further rendezvous crypto keys as
+ * detailed in section 4.2.1 of rend-spec-ng.txt. */
+ uint8_t ntor_key_seed[DIGEST256_LEN];
+} hs_ntor_rend_cell_keys_t;
+
+/* Key material resulting from key expansion as detailed in section "4.2.1. Key
+ * expansion" of rend-spec-ng.txt. */
+typedef struct {
+ /* Per-circuit key material used in ESTABLISH_INTRO cell */
+ uint8_t KH[DIGEST256_LEN];
+ /* Authentication key for outgoing RELAY cells */
+ uint8_t Df[DIGEST256_LEN];
+ /* Authentication key for incoming RELAY cells */
+ uint8_t Db[DIGEST256_LEN];
+ /* Encryption key for outgoing RELAY cells */
+ uint8_t Kf[CIPHER256_KEY_LEN];
+ /* Decryption key for incoming RELAY cells */
+ uint8_t Kb[CIPHER256_KEY_LEN];
+} hs_ntor_rend_circuit_keys_t;
+
+int hs_ntor_client_get_introduce1_keys(
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_public_key_t *intro_enc_pubkey,
+ const curve25519_keypair_t *client_ephemeral_enc_keypair,
+ const uint8_t *subcredential,
+ hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out);
+
+int hs_ntor_client_get_rendezvous1_keys(
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_keypair_t *client_ephemeral_enc_keypair,
+ const curve25519_public_key_t *intro_enc_pubkey,
+ const curve25519_public_key_t *service_ephemeral_rend_pubkey,
+ hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out);
+
+int hs_ntor_service_get_introduce1_keys(
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_keypair_t *intro_enc_keypair,
+ const curve25519_public_key_t *client_ephemeral_enc_pubkey,
+ const uint8_t *subcredential,
+ hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out);
+
+int hs_ntor_service_get_rendezvous1_keys(
+ const ed25519_public_key_t *intro_auth_pubkey,
+ const curve25519_keypair_t *intro_enc_keypair,
+ const curve25519_keypair_t *service_ephemeral_rend_keypair,
+ const curve25519_public_key_t *client_ephemeral_enc_pubkey,
+ hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out);
+
+hs_ntor_rend_circuit_keys_t *hs_ntor_circuit_key_expansion(
+ const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys);
+
+int hs_ntor_client_rendezvous2_mac_is_good(
+ const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys,
+ const uint8_t *rcvd_mac);
+
+#endif
+
diff --git a/src/or/hs_service.c b/src/or/hs_service.c
index 7b12b63065..205ef11c92 100644
--- a/src/or/hs_service.c
+++ b/src/or/hs_service.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -6,14 +6,13 @@
* \brief Implement next generation hidden service functionality
**/
-#define HS_SERVICE_PRIVATE
-
#include "or.h"
#include "relay.h"
#include "rendservice.h"
#include "circuitlist.h"
#include "circpathbias.h"
+#include "hs_intropoint.h"
#include "hs_service.h"
#include "hs_common.h"
@@ -22,16 +21,14 @@
/* XXX We don't currently use these functions, apart from generating unittest
data. When we start implementing the service-side support for prop224 we
- should revisit these functions and use them. For now we mark them as
- unittest-only code: */
-#ifdef TOR_UNIT_TESTS
+ should revisit these functions and use them. */
/** Given an ESTABLISH_INTRO <b>cell</b>, encode it and place its payload in
* <b>buf_out</b> which has size <b>buf_out_len</b>. Return the number of
* bytes written, or a negative integer if there was an error. */
-STATIC ssize_t
+ssize_t
get_establish_intro_payload(uint8_t *buf_out, size_t buf_out_len,
- const hs_cell_establish_intro_t *cell)
+ const trn_cell_establish_intro_t *cell)
{
ssize_t bytes_used = 0;
@@ -39,31 +36,31 @@ get_establish_intro_payload(uint8_t *buf_out, size_t buf_out_len,
return -1;
}
- bytes_used = hs_cell_establish_intro_encode(buf_out, buf_out_len,
+ bytes_used = trn_cell_establish_intro_encode(buf_out, buf_out_len,
cell);
return bytes_used;
}
/* Set the cell extensions of <b>cell</b>. */
static void
-set_cell_extensions(hs_cell_establish_intro_t *cell)
+set_trn_cell_extensions(trn_cell_establish_intro_t *cell)
{
- cell_extension_t *cell_extensions = cell_extension_new();
+ trn_cell_extension_t *trn_cell_extensions = trn_cell_extension_new();
/* For now, we don't use extensions at all. */
- cell_extensions->num = 0; /* It's already zeroed, but be explicit. */
- hs_cell_establish_intro_set_extensions(cell, cell_extensions);
+ trn_cell_extensions->num = 0; /* It's already zeroed, but be explicit. */
+ trn_cell_establish_intro_set_extensions(cell, trn_cell_extensions);
}
/** Given the circuit handshake info in <b>circuit_key_material</b>, create and
* return an ESTABLISH_INTRO cell. Return NULL if something went wrong. The
* returned cell is allocated on the heap and it's the responsibility of the
* caller to free it. */
-STATIC hs_cell_establish_intro_t *
+trn_cell_establish_intro_t *
generate_establish_intro_cell(const uint8_t *circuit_key_material,
size_t circuit_key_material_len)
{
- hs_cell_establish_intro_t *cell = NULL;
+ trn_cell_establish_intro_t *cell = NULL;
ssize_t encoded_len;
log_warn(LD_GENERAL,
@@ -76,31 +73,32 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material,
goto err;
}
- cell = hs_cell_establish_intro_new();
+ cell = trn_cell_establish_intro_new();
/* Set AUTH_KEY_TYPE: 2 means ed25519 */
- hs_cell_establish_intro_set_auth_key_type(cell, AUTH_KEY_ED25519);
+ trn_cell_establish_intro_set_auth_key_type(cell,
+ HS_INTRO_AUTH_KEY_TYPE_ED25519);
/* Set AUTH_KEY_LEN field */
/* Must also set byte-length of AUTH_KEY to match */
int auth_key_len = ED25519_PUBKEY_LEN;
- hs_cell_establish_intro_set_auth_key_len(cell, auth_key_len);
- hs_cell_establish_intro_setlen_auth_key(cell, auth_key_len);
+ trn_cell_establish_intro_set_auth_key_len(cell, auth_key_len);
+ trn_cell_establish_intro_setlen_auth_key(cell, auth_key_len);
/* Set AUTH_KEY field */
- uint8_t *auth_key_ptr = hs_cell_establish_intro_getarray_auth_key(cell);
+ uint8_t *auth_key_ptr = trn_cell_establish_intro_getarray_auth_key(cell);
memcpy(auth_key_ptr, key_struct.pubkey.pubkey, auth_key_len);
/* No cell extensions needed */
- set_cell_extensions(cell);
+ set_trn_cell_extensions(cell);
/* Set signature size.
We need to do this up here, because _encode() needs it and we need to call
_encode() to calculate the MAC and signature.
*/
int sig_len = ED25519_SIG_LEN;
- hs_cell_establish_intro_set_sig_len(cell, sig_len);
- hs_cell_establish_intro_setlen_sig(cell, sig_len);
+ trn_cell_establish_intro_set_sig_len(cell, sig_len);
+ trn_cell_establish_intro_setlen_sig(cell, sig_len);
/* XXX How to make this process easier and nicer? */
@@ -111,7 +109,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material,
uint8_t cell_bytes_tmp[RELAY_PAYLOAD_SIZE] = {0};
uint8_t mac[TRUNNEL_SHA3_256_LEN];
- encoded_len = hs_cell_establish_intro_encode(cell_bytes_tmp,
+ encoded_len = trn_cell_establish_intro_encode(cell_bytes_tmp,
sizeof(cell_bytes_tmp),
cell);
if (encoded_len < 0) {
@@ -130,7 +128,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material,
(ED25519_SIG_LEN + 2 + TRUNNEL_SHA3_256_LEN));
/* Write the MAC to the cell */
uint8_t *handshake_ptr =
- hs_cell_establish_intro_getarray_handshake_mac(cell);
+ trn_cell_establish_intro_getarray_handshake_mac(cell);
memcpy(handshake_ptr, mac, sizeof(mac));
}
@@ -141,7 +139,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material,
uint8_t cell_bytes_tmp[RELAY_PAYLOAD_SIZE] = {0};
ed25519_signature_t sig;
- encoded_len = hs_cell_establish_intro_encode(cell_bytes_tmp,
+ encoded_len = trn_cell_establish_intro_encode(cell_bytes_tmp,
sizeof(cell_bytes_tmp),
cell);
if (encoded_len < 0) {
@@ -162,7 +160,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material,
}
/* And write the signature to the cell */
- uint8_t *sig_ptr = hs_cell_establish_intro_getarray_sig(cell);
+ uint8_t *sig_ptr = trn_cell_establish_intro_getarray_sig(cell);
memcpy(sig_ptr, sig.sig, sig_len);
}
@@ -170,9 +168,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material,
return cell;
err:
- hs_cell_establish_intro_free(cell);
+ trn_cell_establish_intro_free(cell);
return NULL;
}
-#endif /* TOR_UNIT_TESTS */
-
diff --git a/src/or/hs_service.h b/src/or/hs_service.h
index 994521fc50..3302592762 100644
--- a/src/or/hs_service.h
+++ b/src/or/hs_service.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -12,21 +12,16 @@
#include "or.h"
#include "hs/cell_establish_intro.h"
-#ifdef HS_SERVICE_PRIVATE
+/* These functions are only used by unit tests and we need to expose them else
+ * hs_service.o ends up with no symbols in libor.a which makes clang throw a
+ * warning at compile time. See #21825. */
-#ifdef TOR_UNIT_TESTS
-
-STATIC hs_cell_establish_intro_t *
+trn_cell_establish_intro_t *
generate_establish_intro_cell(const uint8_t *circuit_key_material,
size_t circuit_key_material_len);
-
-STATIC ssize_t
+ssize_t
get_establish_intro_payload(uint8_t *buf, size_t buf_len,
- const hs_cell_establish_intro_t *cell);
-
-#endif /* TOR_UNIT_TESTS */
-
-#endif /* HS_SERVICE_PRIVATE */
+ const trn_cell_establish_intro_t *cell);
#endif /* TOR_HS_SERVICE_H */
diff --git a/src/or/include.am b/src/or/include.am
index c52fdf1fb0..7b031f737b 100644
--- a/src/or/include.am
+++ b/src/or/include.am
@@ -37,6 +37,9 @@ LIBTOR_A_SOURCES = \
src/or/connection.c \
src/or/connection_edge.c \
src/or/connection_or.c \
+ src/or/conscache.c \
+ src/or/consdiff.c \
+ src/or/consdiffmgr.c \
src/or/control.c \
src/or/cpuworker.c \
src/or/dircollate.c \
@@ -49,6 +52,7 @@ LIBTOR_A_SOURCES = \
src/or/geoip.c \
src/or/hs_intropoint.c \
src/or/hs_circuitmap.c \
+ src/or/hs_ntor.c \
src/or/hs_service.c \
src/or/entrynodes.c \
src/or/ext_orport.c \
@@ -117,8 +121,10 @@ src_or_tor_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libev
src_or_tor_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 \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
- @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \
+ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@
if COVERAGE_ENABLED
src_or_tor_cov_SOURCES = src/or/tor_main.c
@@ -130,7 +136,8 @@ src_or_tor_cov_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \
src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \
src/common/libor-event-testing.a src/trunnel/libor-trunnel-testing.a \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
- @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \
+ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@
endif
ORHEADERS = \
@@ -153,6 +160,9 @@ ORHEADERS = \
src/or/connection.h \
src/or/connection_edge.h \
src/or/connection_or.h \
+ src/or/conscache.h \
+ src/or/consdiff.h \
+ src/or/consdiffmgr.h \
src/or/control.h \
src/or/cpuworker.h \
src/or/dircollate.h \
@@ -173,6 +183,7 @@ ORHEADERS = \
src/or/hs_descriptor.h \
src/or/hs_intropoint.h \
src/or/hs_circuitmap.h \
+ src/or/hs_ntor.h \
src/or/hs_service.h \
src/or/keypin.h \
src/or/main.h \
diff --git a/src/or/keypin.c b/src/or/keypin.c
index 2d4c4e92d2..1698dc184f 100644
--- a/src/or/keypin.c
+++ b/src/or/keypin.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/keypin.h b/src/or/keypin.h
index 673f24d9e3..2564f5befb 100644
--- a/src/or/keypin.h
+++ b/src/or/keypin.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_KEYPIN_H
diff --git a/src/or/main.c b/src/or/main.c
index b729e0b378..fe63ddb091 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -59,11 +59,13 @@
#include "circuitlist.h"
#include "circuituse.h"
#include "command.h"
+#include "compress.h"
#include "config.h"
#include "confparse.h"
#include "connection.h"
#include "connection_edge.h"
#include "connection_or.h"
+#include "consdiffmgr.h"
#include "control.h"
#include "cpuworker.h"
#include "crypto_s2k.h"
@@ -105,7 +107,6 @@
#include "ext_orport.h"
#ifdef USE_DMALLOC
#include <dmalloc.h>
-#include <openssl/crypto.h>
#endif
#include "memarea.h"
#include "sandbox.h"
@@ -1165,6 +1166,7 @@ static int periodic_events_initialized = 0;
#define CALLBACK(name) \
static int name ## _callback(time_t, const or_options_t *)
CALLBACK(rotate_onion_key);
+CALLBACK(check_onion_keys_expiry_time);
CALLBACK(check_ed_keys);
CALLBACK(launch_descriptor_fetches);
CALLBACK(rotate_x509_certificate);
@@ -1188,6 +1190,7 @@ CALLBACK(check_dns_honesty);
CALLBACK(write_bridge_ns);
CALLBACK(check_fw_helper_app);
CALLBACK(heartbeat);
+CALLBACK(clean_consdiffmgr);
CALLBACK(reset_padding_counts);
CALLBACK(check_canonical_channels);
@@ -1198,6 +1201,7 @@ CALLBACK(check_canonical_channels);
static periodic_event_item_t periodic_events[] = {
CALLBACK(rotate_onion_key),
+ CALLBACK(check_onion_keys_expiry_time),
CALLBACK(check_ed_keys),
CALLBACK(launch_descriptor_fetches),
CALLBACK(rotate_x509_certificate),
@@ -1221,6 +1225,7 @@ static periodic_event_item_t periodic_events[] = {
CALLBACK(write_bridge_ns),
CALLBACK(check_fw_helper_app),
CALLBACK(heartbeat),
+ CALLBACK(clean_consdiffmgr),
CALLBACK(reset_padding_counts),
CALLBACK(check_canonical_channels),
END_OF_PERIODIC_EVENTS
@@ -1478,19 +1483,26 @@ run_scheduled_events(time_t now)
/* 11b. check pending unconfigured managed proxies */
if (!net_is_disabled() && pt_proxies_configuration_pending())
pt_configure_remaining_proxies();
+
+ /* 12. launch diff computations. (This is free if there are none to
+ * launch.) */
+ if (server_mode(options)) {
+ consdiffmgr_rescan();
+ }
}
-/* Periodic callback: Every MIN_ONION_KEY_LIFETIME seconds, rotate the onion
- * keys, shut down and restart all cpuworkers, and update our descriptor if
- * necessary.
+/* Periodic callback: rotate the onion keys after the period defined by the
+ * "onion-key-rotation-days" consensus parameter, shut down and restart all
+ * cpuworkers, and update our descriptor if necessary.
*/
static int
rotate_onion_key_callback(time_t now, const or_options_t *options)
{
if (server_mode(options)) {
- time_t rotation_time = get_onion_key_set_at()+MIN_ONION_KEY_LIFETIME;
+ int onion_key_lifetime = get_onion_key_lifetime();
+ time_t rotation_time = get_onion_key_set_at()+onion_key_lifetime;
if (rotation_time > now) {
- return safe_timer_diff(now, rotation_time);
+ return ONION_KEY_CONSENSUS_CHECK_INTERVAL;
}
log_info(LD_GENERAL,"Rotating onion key.");
@@ -1501,8 +1513,32 @@ rotate_onion_key_callback(time_t now, const or_options_t *options)
}
if (advertised_server_mode() && !options->DisableNetwork)
router_upload_dir_desc_to_dirservers(0);
- return MIN_ONION_KEY_LIFETIME;
+ return ONION_KEY_CONSENSUS_CHECK_INTERVAL;
+ }
+ return PERIODIC_EVENT_NO_UPDATE;
+}
+
+/* Period callback: Check if our old onion keys are still valid after the
+ * period of time defined by the consensus parameter
+ * "onion-key-grace-period-days", otherwise expire them by setting them to
+ * NULL.
+ */
+static int
+check_onion_keys_expiry_time_callback(time_t now, const or_options_t *options)
+{
+ if (server_mode(options)) {
+ int onion_key_grace_period = get_onion_key_grace_period();
+ time_t expiry_time = get_onion_key_set_at()+onion_key_grace_period;
+ if (expiry_time > now) {
+ return ONION_KEY_CONSENSUS_CHECK_INTERVAL;
+ }
+
+ log_info(LD_GENERAL, "Expiring old onion keys.");
+ expire_old_onion_keys();
+ cpuworkers_rotate_keyinfo();
+ return ONION_KEY_CONSENSUS_CHECK_INTERVAL;
}
+
return PERIODIC_EVENT_NO_UPDATE;
}
@@ -2038,6 +2074,17 @@ heartbeat_callback(time_t now, const or_options_t *options)
return options->HeartbeatPeriod;
}
+#define CDM_CLEAN_CALLBACK_INTERVAL 600
+static int
+clean_consdiffmgr_callback(time_t now, const or_options_t *options)
+{
+ (void)now;
+ if (server_mode(options)) {
+ consdiffmgr_cleanup();
+ }
+ return CDM_CLEAN_CALLBACK_INTERVAL;
+}
+
/** Timer: used to invoke second_elapsed_callback() once per second. */
static periodic_timer_t *second_timer = NULL;
/** Number of libevent errors in the last second: we die if we get too many. */
@@ -2437,7 +2484,7 @@ do_main_loop(void)
}
/* Setup shared random protocol subsystem. */
- if (authdir_mode_publishes_statuses(get_options())) {
+ if (authdir_mode_v3(get_options())) {
if (sr_init(1) < 0) {
return -1;
}
@@ -3004,11 +3051,16 @@ tor_init(int argc, char *argv[])
const char *version = get_version();
log_notice(LD_GENERAL, "Tor %s running on %s with Libevent %s, "
- "OpenSSL %s and Zlib %s.", version,
+ "OpenSSL %s, Zlib %s, Liblzma %s, and Libzstd %s.", version,
get_uname(),
tor_libevent_get_version_str(),
crypto_openssl_get_version_str(),
- tor_zlib_get_version_str());
+ tor_compress_supports_method(ZLIB_METHOD) ?
+ tor_compress_version_str(ZLIB_METHOD) : "N/A",
+ tor_compress_supports_method(LZMA_METHOD) ?
+ tor_compress_version_str(LZMA_METHOD) : "N/A",
+ tor_compress_supports_method(ZSTD_METHOD) ?
+ tor_compress_version_str(ZSTD_METHOD) : "N/A");
log_notice(LD_GENERAL, "Tor can't help you if you use it wrong! "
"Learn how to be safe at "
@@ -3169,6 +3221,7 @@ tor_free_all(int postfork)
sandbox_free_getaddrinfo_cache();
protover_free_all();
bridges_free_all();
+ consdiffmgr_free_all();
if (!postfork) {
config_free_all();
or_state_free_all();
@@ -3198,6 +3251,7 @@ tor_free_all(int postfork)
if (!postfork) {
escaped(NULL);
esc_router_info(NULL);
+ clean_up_backtrace_handler();
logs_free_all(); /* free log strings. do this last so logs keep working. */
}
}
@@ -3593,6 +3647,8 @@ sandbox_init_filter(void)
OPEN_DATADIR("stats");
STAT_DATADIR("stats");
STAT_DATADIR2("stats", "dirreq-stats");
+
+ consdiffmgr_register_with_sandbox(&cfg);
}
init_addrinfo();
@@ -3625,14 +3681,15 @@ tor_main(int argc, char *argv[])
update_approx_time(time(NULL));
tor_threads_init();
+ tor_compress_init();
init_logging(0);
monotime_init();
#ifdef USE_DMALLOC
{
/* Instruct OpenSSL to use our internal wrappers for malloc,
realloc and free. */
- int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_);
- tor_assert(r);
+ int r = crypto_use_tor_alloc_functions();
+ tor_assert(r == 0);
}
#endif
#ifdef NT_SERVICE
diff --git a/src/or/main.h b/src/or/main.h
index 07b22598b1..915d82b7ba 100644
--- a/src/or/main.h
+++ b/src/or/main.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/microdesc.c b/src/or/microdesc.c
index 140117f683..a4e6b409c4 100644
--- a/src/or/microdesc.c
+++ b/src/or/microdesc.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2016, The Tor Project, Inc. */
+/* Copyright (c) 2009-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -804,18 +804,6 @@ microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, const char *d)
return md;
}
-/** Return the mean size of decriptors added to <b>cache</b> since it was last
- * cleared. Used to estimate the size of large downloads. */
-size_t
-microdesc_average_size(microdesc_cache_t *cache)
-{
- if (!cache)
- cache = get_microdesc_cache();
- if (!cache->n_seen)
- return 512;
- return (size_t)(cache->total_len_seen / cache->n_seen);
-}
-
/** Return a smartlist of all the sha256 digest of the microdescriptors that
* are listed in <b>ns</b> but not present in <b>cache</b>. Returns pointers
* to internals of <b>ns</b>; you should not free the members of the resulting
diff --git a/src/or/microdesc.h b/src/or/microdesc.h
index 40c83139e9..943873066e 100644
--- a/src/or/microdesc.h
+++ b/src/or/microdesc.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -32,8 +32,6 @@ void microdesc_cache_clear(microdesc_cache_t *cache);
microdesc_t *microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache,
const char *d);
-size_t microdesc_average_size(microdesc_cache_t *cache);
-
smartlist_t *microdesc_list_missing_digest256(networkstatus_t *ns,
microdesc_cache_t *cache,
int downloadable_only,
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c
index 4107542f56..ac5c5c526c 100644
--- a/src/or/networkstatus.c
+++ b/src/or/networkstatus.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -46,6 +46,7 @@
#include "config.h"
#include "connection.h"
#include "connection_or.h"
+#include "consdiffmgr.h"
#include "control.h"
#include "directory.h"
#include "dirserv.h"
@@ -179,53 +180,74 @@ networkstatus_reset_download_failures(void)
download_status_reset(&consensus_bootstrap_dl_status[i]);
}
+/**
+ * Read and and return the cached consensus of type <b>flavorname</b>. If
+ * <b>unverified</b> is false, get the one we haven't verified. Return NULL if
+ * the file isn't there. */
+static char *
+networkstatus_read_cached_consensus_impl(int flav,
+ const char *flavorname,
+ int unverified_consensus)
+{
+ char buf[128];
+ const char *prefix;
+ if (unverified_consensus) {
+ prefix = "unverified";
+ } else {
+ prefix = "cached";
+ }
+ if (flav == FLAV_NS) {
+ tor_snprintf(buf, sizeof(buf), "%s-consensus", prefix);
+ } else {
+ tor_snprintf(buf, sizeof(buf), "%s-%s-consensus", prefix, flavorname);
+ }
+
+ char *filename = get_datadir_fname(buf);
+ char *result = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL);
+ tor_free(filename);
+ return result;
+}
+
+/** Return a new string containing the current cached consensus of flavor
+ * <b>flavorname</b>. */
+char *
+networkstatus_read_cached_consensus(const char *flavorname)
+ {
+ int flav = networkstatus_parse_flavor_name(flavorname);
+ if (flav < 0)
+ return NULL;
+ return networkstatus_read_cached_consensus_impl(flav, flavorname, 0);
+}
+
/** Read every cached v3 consensus networkstatus from the disk. */
int
router_reload_consensus_networkstatus(void)
{
- char *filename;
- char *s;
const unsigned int flags = NSSET_FROM_CACHE | NSSET_DONT_DOWNLOAD_CERTS;
int flav;
/* FFFF Suppress warnings if cached consensus is bad? */
for (flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) {
- char buf[128];
const char *flavor = networkstatus_get_flavor_name(flav);
- if (flav == FLAV_NS) {
- filename = get_datadir_fname("cached-consensus");
- } else {
- tor_snprintf(buf, sizeof(buf), "cached-%s-consensus", flavor);
- filename = get_datadir_fname(buf);
- }
- s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL);
+ char *s = networkstatus_read_cached_consensus_impl(flav, flavor, 0);
if (s) {
if (networkstatus_set_current_consensus(s, flavor, flags, NULL) < -1) {
- log_warn(LD_FS, "Couldn't load consensus %s networkstatus from \"%s\"",
- flavor, filename);
+ log_warn(LD_FS, "Couldn't load consensus %s networkstatus from cache",
+ flavor);
}
tor_free(s);
}
- tor_free(filename);
- if (flav == FLAV_NS) {
- filename = get_datadir_fname("unverified-consensus");
- } else {
- tor_snprintf(buf, sizeof(buf), "unverified-%s-consensus", flavor);
- filename = get_datadir_fname(buf);
- }
-
- s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL);
+ s = networkstatus_read_cached_consensus_impl(flav, flavor, 1);
if (s) {
if (networkstatus_set_current_consensus(s, flavor,
flags|NSSET_WAS_WAITING_FOR_CERTS,
NULL)) {
- log_info(LD_FS, "Couldn't load consensus %s networkstatus from \"%s\"",
- flavor, filename);
- }
+ log_info(LD_FS, "Couldn't load unverified consensus %s networkstatus "
+ "from cache", flavor);
+ }
tor_free(s);
}
- tor_free(filename);
}
if (!networkstatus_get_latest_consensus()) {
@@ -1982,7 +2004,11 @@ networkstatus_set_current_consensus(const char *consensus,
dirserv_set_cached_consensus_networkstatus(consensus,
flavor,
&c->digests,
+ c->digest_sha3_as_signed,
c->valid_after);
+ if (server_mode(get_options())) {
+ consdiffmgr_add_consensus(consensus, c);
+ }
}
if (!from_cache) {
diff --git a/src/or/networkstatus.h b/src/or/networkstatus.h
index 66cd84c88e..6a90d706c5 100644
--- a/src/or/networkstatus.h
+++ b/src/or/networkstatus.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -16,6 +16,7 @@
void networkstatus_reset_warnings(void);
void networkstatus_reset_download_failures(void);
+char *networkstatus_read_cached_consensus(const char *flavorname);
int router_reload_consensus_networkstatus(void);
void routerstatus_free(routerstatus_t *rs);
void networkstatus_vote_free(networkstatus_t *ns);
diff --git a/src/or/nodelist.c b/src/or/nodelist.c
index 96e95baf5a..dc4d9a63e3 100644
--- a/src/or/nodelist.c
+++ b/src/or/nodelist.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/nodelist.h b/src/or/nodelist.h
index 8456d21c6c..b94a066913 100644
--- a/src/or/nodelist.h
+++ b/src/or/nodelist.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/ntmain.c b/src/or/ntmain.c
index 4c65805b32..e087bd6937 100644
--- a/src/or/ntmain.c
+++ b/src/or/ntmain.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/ntmain.h b/src/or/ntmain.h
index 31bf38c62c..4b771b1828 100644
--- a/src/or/ntmain.h
+++ b/src/or/ntmain.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/onion.c b/src/or/onion.c
index 42b9ca4b18..a98b97cb1d 100644
--- a/src/or/onion.c
+++ b/src/or/onion.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -238,7 +238,9 @@ onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin)
onion_queue_entry_remove(head);
log_info(LD_CIRC,
"Circuit create request is too old; canceling due to overload.");
- circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT);
+ if (! TO_CIRCUIT(circ)->marked_for_close) {
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT);
+ }
}
return 0;
}
diff --git a/src/or/onion.h b/src/or/onion.h
index 19e4a7c381..37a7b08cb6 100644
--- a/src/or/onion.h
+++ b/src/or/onion.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/onion_fast.c b/src/or/onion_fast.c
index 8dcbfe22d8..146943a273 100644
--- a/src/or/onion_fast.c
+++ b/src/or/onion_fast.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/onion_fast.h b/src/or/onion_fast.h
index b9626002c3..b31f8e9492 100644
--- a/src/or/onion_fast.h
+++ b/src/or/onion_fast.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/onion_ntor.c b/src/or/onion_ntor.c
index ded97ee73d..902260b54b 100644
--- a/src/or/onion_ntor.c
+++ b/src/or/onion_ntor.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/onion_ntor.h b/src/or/onion_ntor.h
index f637b437fd..158c499de4 100644
--- a/src/or/onion_ntor.h
+++ b/src/or/onion_ntor.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_ONION_NTOR_H
diff --git a/src/or/onion_tap.c b/src/or/onion_tap.c
index 2769300945..294fc0df6d 100644
--- a/src/or/onion_tap.c
+++ b/src/or/onion_tap.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -159,7 +159,7 @@ onion_skin_TAP_server_handshake(
* big. That should be impossible. */
log_info(LD_GENERAL, "crypto_dh_get_public failed.");
goto err;
- /* LCOV_EXCP_STOP */
+ /* LCOV_EXCL_STOP */
}
key_material_len = DIGEST_LEN+key_out_len;
diff --git a/src/or/onion_tap.h b/src/or/onion_tap.h
index a2880f6e98..bd625231f4 100644
--- a/src/or/onion_tap.h
+++ b/src/or/onion_tap.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/or.h b/src/or/or.h
index cd00fbb815..4d6ac93548 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -71,10 +71,11 @@
#include "tortls.h"
#include "torlog.h"
#include "container.h"
-#include "torgzip.h"
+#include "compress.h"
#include "address.h"
#include "compat_libevent.h"
#include "ht.h"
+#include "confline.h"
#include "replaycache.h"
#include "crypto_curve25519.h"
#include "crypto_ed25519.h"
@@ -147,8 +148,27 @@
/** Maximum size of a single extrainfo document, as above. */
#define MAX_EXTRAINFO_UPLOAD_SIZE 50000
-/** How often do we rotate onion keys? */
-#define MIN_ONION_KEY_LIFETIME (7*24*60*60)
+/** Minimum lifetime for an onion key in days. */
+#define MIN_ONION_KEY_LIFETIME_DAYS (1)
+
+/** Maximum lifetime for an onion key in days. */
+#define MAX_ONION_KEY_LIFETIME_DAYS (90)
+
+/** Default lifetime for an onion key in days. */
+#define DEFAULT_ONION_KEY_LIFETIME_DAYS (28)
+
+/** Minimum grace period for acceptance of an onion key in days.
+ * The maximum value is defined in proposal #274 as being the current network
+ * consensus parameter for "onion-key-rotation-days". */
+#define MIN_ONION_KEY_GRACE_PERIOD_DAYS (1)
+
+/** Default grace period for acceptance of an onion key in days. */
+#define DEFAULT_ONION_KEY_GRACE_PERIOD_DAYS (7)
+
+/** How often we should check the network consensus if it is time to rotate or
+ * expire onion keys. */
+#define ONION_KEY_CONSENSUS_CHECK_INTERVAL (60*60)
+
/** How often do we rotate TLS contexts? */
#define MAX_SSL_KEY_LIFETIME_INTERNAL (2*60*60)
@@ -403,12 +423,13 @@ typedef enum {
#define DIR_PURPOSE_FETCH_MICRODESC 19
#define DIR_PURPOSE_MAX_ 19
-/** True iff <b>p</b> is a purpose corresponding to uploading data to a
- * directory server. */
+/** True iff <b>p</b> is a purpose corresponding to uploading
+ * data to a directory server. */
#define DIR_PURPOSE_IS_UPLOAD(p) \
((p)==DIR_PURPOSE_UPLOAD_DIR || \
(p)==DIR_PURPOSE_UPLOAD_VOTE || \
- (p)==DIR_PURPOSE_UPLOAD_SIGNATURES)
+ (p)==DIR_PURPOSE_UPLOAD_SIGNATURES || \
+ (p)==DIR_PURPOSE_UPLOAD_RENDDESC_V2)
#define EXIT_PURPOSE_MIN_ 1
/** This exit stream wants to do an ordinary connect. */
@@ -1544,10 +1565,6 @@ typedef struct or_connection_t {
* NETINFO cell listed the address we're connected to as recognized. */
unsigned int is_canonical:1;
- /** True iff we have decided that the other end of this connection
- * is a client. Connections with this flag set should never be used
- * to satisfy an EXTEND request. */
- unsigned int is_connection_with_client:1;
/** True iff this is an outgoing connection. */
unsigned int is_outgoing:1;
unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */
@@ -1733,14 +1750,6 @@ typedef struct entry_connection_t {
unsigned int is_socks_socket:1;
} entry_connection_t;
-typedef enum {
- DIR_SPOOL_NONE=0, DIR_SPOOL_SERVER_BY_DIGEST, DIR_SPOOL_SERVER_BY_FP,
- DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP,
- DIR_SPOOL_CACHED_DIR, DIR_SPOOL_NETWORKSTATUS,
- DIR_SPOOL_MICRODESC, /* NOTE: if we add another entry, add another bit. */
-} dir_spool_source_t;
-#define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t)
-
/** Subtype of connection_t for an "directory connection" -- that is, an HTTP
* connection to retrieve or serve directory material. */
typedef struct dir_connection_t {
@@ -1755,23 +1764,15 @@ typedef struct dir_connection_t {
char *requested_resource;
unsigned int dirconn_direct:1; /**< Is this dirconn direct, or via Tor? */
- /* Used only for server sides of some dir connections, to implement
- * "spooling" of directory material to the outbuf. Otherwise, we'd have
- * to append everything to the outbuf in one enormous chunk. */
- /** What exactly are we spooling right now? */
- dir_spool_source_bitfield_t dir_spool_src : 3;
-
/** If we're fetching descriptors, what router purpose shall we assign
* to them? */
uint8_t router_purpose;
- /** List of fingerprints for networkstatuses or descriptors to be spooled. */
- smartlist_t *fingerprint_stack;
- /** A cached_dir_t object that we're currently spooling out */
- struct cached_dir_t *cached_dir;
- /** The current offset into cached_dir. */
- off_t cached_dir_offset;
- /** The zlib object doing on-the-fly compression for spooled data. */
- tor_zlib_state_t *zlib_state;
+
+ /** List of spooled_resource_t for objects that we're spooling. We use
+ * it from back to front. */
+ smartlist_t *spool;
+ /** The compression object doing on-the-fly compression for spooled data. */
+ tor_compress_state_t *compress_state;
/** What rendezvous service are we querying for? */
rend_data_t *rend_data;
@@ -1787,6 +1788,14 @@ typedef struct dir_connection_t {
* that's going away and being used on channels instead. The dirserver still
* needs this for the incoming side, so it's moved here. */
uint64_t dirreq_id;
+
+#ifdef MEASUREMENTS_21206
+ /** Number of RELAY_DATA cells received. */
+ uint32_t data_cells_received;
+
+ /** Number of RELAY_DATA cells sent. */
+ uint32_t data_cells_sent;
+#endif
} dir_connection_t;
/** Subtype of connection_t for an connection to a controller. */
@@ -1930,6 +1939,8 @@ typedef struct cached_dir_t {
size_t dir_z_len; /**< Length of <b>dir_z</b>. */
time_t published; /**< When was this object published. */
common_digests_t digests; /**< Digests of this object (networkstatus only) */
+ /** Sha3 digest (also ns only) */
+ uint8_t digest_sha3_as_signed[DIGEST256_LEN];
int refcnt; /**< Reference count for this cached_dir_t. */
} cached_dir_t;
@@ -2267,6 +2278,16 @@ typedef struct routerstatus_t {
* ed25519 identity keys on a link handshake. */
unsigned int supports_ed25519_link_handshake:1;
+ /** True iff this router has a protocol list that allows it to be an
+ * introduction point supporting ed25519 authentication key which is part of
+ * the v3 protocol detailed in proposal 224. This requires HSIntro=4. */
+ unsigned int supports_ed25519_hs_intro : 1;
+
+ /** True iff this router has a protocol list that allows it to be an hidden
+ * service directory supporting version 3 as seen in proposal 224. This
+ * requires HSDir=2. */
+ unsigned int supports_v3_hsdir : 1;
+
unsigned int has_bandwidth:1; /**< The vote/consensus had bw info */
unsigned int has_exitsummary:1; /**< The vote/consensus had exit summaries */
unsigned int bw_is_unmeasured:1; /**< This is a consensus entry, with
@@ -2620,6 +2641,9 @@ typedef struct networkstatus_t {
/** Digests of this document, as signed. */
common_digests_t digests;
+ /** A SHA3-256 digest of the document, not including signatures: used for
+ * consensus diffs */
+ uint8_t digest_sha3_as_signed[DIGEST256_LEN];
/** List of router statuses, sorted by identity digest. For a vote,
* the elements are vote_routerstatus_t; for a consensus, the elements
@@ -3053,6 +3077,13 @@ typedef struct circuit_t {
* circuit's queues; used only if CELL_STATS events are enabled and
* cleared after being sent to control port. */
smartlist_t *testing_cell_stats;
+
+ /** If set, points to an HS token that this circuit might be carrying.
+ * Used by the HS circuitmap. */
+ hs_token_t *hs_token;
+ /** Hashtable node: used to look up the circuit by its HS token using the HS
+ circuitmap. */
+ HT_ENTRY(circuit_t) hs_circuitmap_node;
} circuit_t;
/** Largest number of relay_early cells that we can send on a given
@@ -3369,13 +3400,6 @@ typedef struct or_circuit_t {
* is not marked for close. */
struct or_circuit_t *rend_splice;
- /** If set, points to an HS token that this circuit might be carrying.
- * Used by the HS circuitmap. */
- hs_token_t *hs_token;
- /** Hashtable node: used to look up the circuit by its HS token using the HS
- circuitmap. */
- HT_ENTRY(or_circuit_t) hs_circuitmap_node;
-
/** Stores KH for the handshake. */
char rend_circ_nonce[DIGEST_LEN];/* KH in tor-spec.txt */
@@ -3526,27 +3550,6 @@ typedef struct port_cfg_t {
char unix_addr[FLEXIBLE_ARRAY_MEMBER];
} port_cfg_t;
-/** Ordinary configuration line. */
-#define CONFIG_LINE_NORMAL 0
-/** Appends to previous configuration for the same option, even if we
- * would ordinary replace it. */
-#define CONFIG_LINE_APPEND 1
-/* Removes all previous configuration for an option. */
-#define CONFIG_LINE_CLEAR 2
-
-/** A linked list of lines in a config file. */
-typedef struct config_line_t {
- char *key;
- char *value;
- struct config_line_t *next;
- /** What special treatment (if any) does this line require? */
- unsigned int command:2;
- /** If true, subsequent assignments to this linelist should replace
- * it, not extend it. Set only on the first item in a linelist in an
- * or_options_t. */
- unsigned int fragile:1;
-} config_line_t;
-
typedef struct routerset_t routerset_t;
/** A magic value for the (Socks|OR|...)Port options below, telling Tor
@@ -5324,7 +5327,8 @@ typedef struct dir_server_t {
* address information from published? */
routerstatus_t fake_status; /**< Used when we need to pass this trusted
- * dir_server_t to directory_initiate_command_*
+ * dir_server_t to
+ * directory_request_set_routerstatus.
* as a routerstatus_t. Not updated by the
* router-status management code!
**/
diff --git a/src/or/parsecommon.c b/src/or/parsecommon.c
index ec2cec69f7..7959867875 100644
--- a/src/or/parsecommon.c
+++ b/src/or/parsecommon.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/parsecommon.h b/src/or/parsecommon.h
index 15e9f7ae85..f4974a9683 100644
--- a/src/or/parsecommon.h
+++ b/src/or/parsecommon.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -157,12 +157,16 @@ typedef enum {
R3_SUPERENCRYPTED,
R3_SIGNATURE,
R3_CREATE2_FORMATS,
- R3_AUTHENTICATION_REQUIRED,
+ R3_INTRO_AUTH_REQUIRED,
R3_SINGLE_ONION_SERVICE,
R3_INTRODUCTION_POINT,
R3_INTRO_AUTH_KEY,
R3_INTRO_ENC_KEY,
R3_INTRO_ENC_KEY_CERTIFICATION,
+ R3_DESC_AUTH_TYPE,
+ R3_DESC_AUTH_KEY,
+ R3_DESC_AUTH_CLIENT,
+ R3_ENCRYPTED,
R_IPO_IDENTIFIER,
R_IPO_IP_ADDRESS,
diff --git a/src/or/periodic.c b/src/or/periodic.c
index d02d4a7bbb..6896b41c86 100644
--- a/src/or/periodic.c
+++ b/src/or/periodic.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Tor Project, Inc. */
+/* Copyright (c) 2015-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/periodic.h b/src/or/periodic.h
index 021bb4ef5c..88d00cc7e9 100644
--- a/src/or/periodic.h
+++ b/src/or/periodic.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Tor Project, Inc. */
+/* Copyright (c) 2015-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_PERIODIC_H
diff --git a/src/or/policies.c b/src/or/policies.c
index 2aa6373f3e..3d49a6110c 100644
--- a/src/or/policies.c
+++ b/src/or/policies.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/policies.h b/src/or/policies.h
index f73f850c21..ce08d497e9 100644
--- a/src/or/policies.h
+++ b/src/or/policies.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/protover.c b/src/or/protover.c
index 88d549ab35..ee58927fc5 100644
--- a/src/or/protover.c
+++ b/src/or/protover.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/protover.h b/src/or/protover.h
index 5c658931ea..22667bed79 100644
--- a/src/or/protover.h
+++ b/src/or/protover.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/reasons.c b/src/or/reasons.c
index a1566e2299..e6c325f1b3 100644
--- a/src/or/reasons.c
+++ b/src/or/reasons.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/reasons.h b/src/or/reasons.h
index 2e12c93728..1cadf4e89e 100644
--- a/src/or/reasons.h
+++ b/src/or/reasons.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/relay.c b/src/or/relay.c
index 886ddad071..7082002f84 100644
--- a/src/or/relay.c
+++ b/src/or/relay.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -54,6 +54,7 @@
#include "circuitbuild.h"
#include "circuitlist.h"
#include "circuituse.h"
+#include "compress.h"
#include "config.h"
#include "connection.h"
#include "connection_edge.h"
@@ -302,7 +303,8 @@ circuit_receive_relay_cell(cell_t *cell, circuit_t *circ,
return 0;
if (relay_crypt(circ, cell, cell_direction, &layer_hint, &recognized) < 0) {
- log_warn(LD_BUG,"relay crypt failed. Dropping connection.");
+ log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
+ "relay crypt failed. Dropping connection.");
return -END_CIRC_REASON_INTERNAL;
}
@@ -336,8 +338,13 @@ circuit_receive_relay_cell(cell_t *cell, circuit_t *circ,
log_debug(LD_OR,"Sending to origin.");
if ((reason = connection_edge_process_relay_cell(cell, circ, conn,
layer_hint)) < 0) {
- log_warn(LD_OR,
- "connection_edge_process_relay_cell (at origin) failed.");
+ /* If a client is trying to connect to unknown hidden service port,
+ * END_CIRC_AT_ORIGIN is sent back so we can then close the circuit.
+ * Do not log warn as this is an expected behavior for a service. */
+ if (reason != END_CIRC_AT_ORIGIN) {
+ log_warn(LD_OR,
+ "connection_edge_process_relay_cell (at origin) failed.");
+ }
return reason;
}
}
@@ -814,6 +821,16 @@ connection_edge_send_command(edge_connection_t *fromconn,
return -1;
}
+#ifdef MEASUREMENTS_21206
+ /* Keep track of the number of RELAY_DATA cells sent for directory
+ * connections. */
+ connection_t *linked_conn = TO_CONN(fromconn)->linked_conn;
+
+ if (linked_conn && linked_conn->type == CONN_TYPE_DIR) {
+ ++(TO_DIR_CONN(linked_conn)->data_cells_sent);
+ }
+#endif
+
return relay_send_command_from_edge(fromconn->stream_id, circ,
relay_command, payload,
payload_len, cpath_layer);
@@ -1668,6 +1685,16 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
connection_write_to_buf((char*)(cell->payload + RELAY_HEADER_SIZE),
rh.length, TO_CONN(conn));
+#ifdef MEASUREMENTS_21206
+ /* Count number of RELAY_DATA cells received on a linked directory
+ * connection. */
+ connection_t *linked_conn = TO_CONN(conn)->linked_conn;
+
+ if (linked_conn && linked_conn->type == CONN_TYPE_DIR) {
+ ++(TO_DIR_CONN(linked_conn)->data_cells_received);
+ }
+#endif
+
if (!optimistic_data) {
/* Only send a SENDME if we're not getting optimistic data; otherwise
* a SENDME could arrive before the CONNECTED.
@@ -2511,7 +2538,7 @@ cell_queues_check_size(void)
{
size_t alloc = cell_queues_get_total_allocation();
alloc += buf_get_total_allocation();
- alloc += tor_zlib_get_total_allocation();
+ alloc += tor_compress_get_total_allocation();
const size_t rend_cache_total = rend_cache_get_total_allocation();
alloc += rend_cache_total;
if (alloc >= get_options()->MaxMemInQueues_low_threshold) {
diff --git a/src/or/relay.h b/src/or/relay.h
index 3acf3ee0e3..a160cd5551 100644
--- a/src/or/relay.h
+++ b/src/or/relay.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/rendcache.c b/src/or/rendcache.c
index 12c23ea87c..11b60b36a1 100644
--- a/src/or/rendcache.c
+++ b/src/or/rendcache.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Tor Project, Inc. */
+/* Copyright (c) 2015-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/rendcache.h b/src/or/rendcache.h
index 746f142fcc..1bd3be2243 100644
--- a/src/or/rendcache.h
+++ b/src/or/rendcache.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Tor Project, Inc. */
+/* Copyright (c) 2015-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/rendclient.c b/src/or/rendclient.c
index 06744ad795..9bc2d6289d 100644
--- a/src/or/rendclient.c
+++ b/src/or/rendclient.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -724,6 +724,9 @@ directory_get_from_hs_dir(const char *desc_id,
hs_dir = pick_hsdir(desc_id, desc_id_base32);
if (!hs_dir) {
/* No suitable hs dir can be found, stop right now. */
+ control_event_hs_descriptor_failed(rend_query, NULL, "QUERY_NO_HSDIR");
+ control_event_hs_descriptor_content(rend_data_get_address(rend_query),
+ desc_id_base32, NULL, NULL);
return 0;
}
}
@@ -744,6 +747,9 @@ directory_get_from_hs_dir(const char *desc_id,
REND_DESC_COOKIE_LEN,
0)<0) {
log_warn(LD_BUG, "Could not base64-encode descriptor cookie.");
+ control_event_hs_descriptor_failed(rend_query, hsdir_fp, "BAD_DESC");
+ control_event_hs_descriptor_content(rend_data_get_address(rend_query),
+ desc_id_base32, hsdir_fp, NULL);
return 0;
}
/* Remove == signs. */
@@ -756,13 +762,15 @@ directory_get_from_hs_dir(const char *desc_id,
/* Send fetch request. (Pass query and possibly descriptor cookie so that
* they can be written to the directory connection and be referred to when
* the response arrives. */
- directory_initiate_command_routerstatus_rend(hs_dir,
- DIR_PURPOSE_FETCH_RENDDESC_V2,
- ROUTER_PURPOSE_GENERAL,
- how_to_fetch,
- desc_id_base32,
- NULL, 0, 0,
- rend_query, NULL);
+ directory_request_t *req =
+ directory_request_new(DIR_PURPOSE_FETCH_RENDDESC_V2);
+ directory_request_set_routerstatus(req, hs_dir);
+ directory_request_set_indirection(req, how_to_fetch);
+ directory_request_set_resource(req, desc_id_base32);
+ directory_request_set_rend_query(req, rend_query);
+ directory_initiate_request(req);
+ directory_request_free(req);
+
log_info(LD_REND, "Sending fetch request for v2 descriptor for "
"service '%s' with descriptor ID '%s', auth type %d, "
"and descriptor cookie '%s' to hidden service "
diff --git a/src/or/rendclient.h b/src/or/rendclient.h
index 164305a773..ff0f4084fd 100644
--- a/src/or/rendclient.h
+++ b/src/or/rendclient.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c
index bc53762fb6..e1236bdd0f 100644
--- a/src/or/rendcommon.c
+++ b/src/or/rendcommon.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/rendcommon.h b/src/or/rendcommon.h
index 942ace5761..94c2480d86 100644
--- a/src/or/rendcommon.h
+++ b/src/or/rendcommon.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/rendmid.c b/src/or/rendmid.c
index 57c8cfac92..23c3deddaa 100644
--- a/src/or/rendmid.c
+++ b/src/or/rendmid.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -96,7 +96,8 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request,
/* Close any other intro circuits with the same pk. */
c = NULL;
- while ((c = hs_circuitmap_get_intro_circ_v2((const uint8_t *)pk_digest))) {
+ while ((c = hs_circuitmap_get_intro_circ_v2_relay_side(
+ (const uint8_t *)pk_digest))) {
log_info(LD_REND, "Replacing old circuit for service %s",
safe_str(serviceid));
circuit_mark_for_close(TO_CIRCUIT(c), END_CIRC_REASON_FINISHED);
@@ -111,7 +112,7 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request,
/* Now, set up this circuit. */
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT);
- hs_circuitmap_register_intro_circ_v2(circ, (uint8_t *)pk_digest);
+ hs_circuitmap_register_intro_circ_v2_relay_side(circ, (uint8_t *)pk_digest);
log_info(LD_REND,
"Established introduction point on circuit %u for service %s",
@@ -165,7 +166,8 @@ rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request,
/* The first 20 bytes are all we look at: they have a hash of the service's
* PK. */
- intro_circ = hs_circuitmap_get_intro_circ_v2((const uint8_t*)request);
+ intro_circ = hs_circuitmap_get_intro_circ_v2_relay_side(
+ (const uint8_t*)request);
if (!intro_circ) {
log_info(LD_REND,
"No intro circ found for INTRODUCE1 cell (%s) from circuit %u; "
@@ -242,7 +244,7 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request,
goto err;
}
- if (hs_circuitmap_get_rend_circ(request)) {
+ if (hs_circuitmap_get_rend_circ_relay_side(request)) {
log_warn(LD_PROTOCOL,
"Duplicate rendezvous cookie in ESTABLISH_RENDEZVOUS.");
goto err;
@@ -258,7 +260,7 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request,
}
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_POINT_WAITING);
- hs_circuitmap_register_rend_circ(circ, request);
+ hs_circuitmap_register_rend_circ_relay_side(circ, request);
base16_encode(hexid,9,(char*)request,4);
@@ -307,7 +309,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request,
"Got request for rendezvous from circuit %u to cookie %s.",
(unsigned)circ->p_circ_id, hexid);
- rend_circ = hs_circuitmap_get_rend_circ(request);
+ rend_circ = hs_circuitmap_get_rend_circ_relay_side(request);
if (!rend_circ) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"Rejecting RENDEZVOUS1 cell with unrecognized rendezvous cookie %s.",
@@ -342,7 +344,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request,
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_ESTABLISHED);
circuit_change_purpose(TO_CIRCUIT(rend_circ),
CIRCUIT_PURPOSE_REND_ESTABLISHED);
- hs_circuitmap_remove_circuit(circ);
+ hs_circuitmap_remove_circuit(TO_CIRCUIT(circ));
rend_circ->rend_splice = circ;
circ->rend_splice = rend_circ;
diff --git a/src/or/rendmid.h b/src/or/rendmid.h
index 347d745853..daf9e2885e 100644
--- a/src/or/rendmid.h
+++ b/src/or/rendmid.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index 1d6fc0f96d..4024ea17de 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -76,13 +76,11 @@ static ssize_t rend_service_parse_intro_for_v3(
static int rend_service_check_private_dir(const or_options_t *options,
const rend_service_t *s,
int create);
-static int rend_service_check_private_dir_impl(const or_options_t *options,
- const rend_service_t *s,
- int create);
static const smartlist_t* rend_get_service_list(
const smartlist_t* substitute_service_list);
static smartlist_t* rend_get_service_list_mutable(
smartlist_t* substitute_service_list);
+static int rend_max_intro_circs_per_period(unsigned int n_intro_points_wanted);
/** Represents the mapping from a virtual port of a rendezvous service to
* a real port on some IP.
@@ -100,26 +98,6 @@ struct rend_service_port_config_s {
char unix_addr[FLEXIBLE_ARRAY_MEMBER];
};
-/** Try to maintain this many intro points per service by default. */
-#define NUM_INTRO_POINTS_DEFAULT 3
-/** Maximum number of intro points per service. */
-#define NUM_INTRO_POINTS_MAX 10
-/** Number of extra intro points we launch if our set of intro nodes is
- * empty. See proposal 155, section 4. */
-#define NUM_INTRO_POINTS_EXTRA 2
-
-/** If we can't build our intro circuits, don't retry for this long. */
-#define INTRO_CIRC_RETRY_PERIOD (60*5)
-/** Don't try to build more than this many circuits before giving up
- * for a while.*/
-#define MAX_INTRO_CIRCS_PER_PERIOD 10
-/** How many times will a hidden service operator attempt to connect to
- * a requested rendezvous point before giving up? */
-#define MAX_REND_FAILURES 1
-/** How many seconds should we spend trying to connect to a requested
- * rendezvous point before giving up? */
-#define MAX_REND_TIMEOUT 30
-
/* Hidden service directory file names:
* new file names should be added to rend_service_add_filenames_to_list()
* for sandboxing purposes. */
@@ -128,9 +106,12 @@ static const char *hostname_fname = "hostname";
static const char *client_keys_fname = "client_keys";
static const char *sos_poison_fname = "onion_service_non_anonymous";
-/** A list of rend_service_t's for services run on this OP.
- */
+/** A list of rend_service_t's for services run on this OP. */
static smartlist_t *rend_service_list = NULL;
+/** A list of rend_service_t's for services run on this OP which is used as a
+ * staging area before they are put in the main list in order to prune dying
+ * service on config reload. */
+static smartlist_t *rend_service_staging_list = NULL;
/* Like rend_get_service_list_mutable, but returns a read-only list. */
static const smartlist_t*
@@ -264,35 +245,23 @@ rend_service_free_all(void)
rend_service_list = NULL;
}
-/** Validate <b>service</b> and add it to <b>service_list</b>, or to
- * the global rend_service_list if <b>service_list</b> is NULL.
- * Return 0 on success. On failure, free <b>service</b> and return -1.
- * Takes ownership of <b>service</b>.
- */
+/* Validate a <b>service</b>. Use the <b>service_list</b> to make sure there
+ * is no duplicate entry for the given service object. Return 0 if valid else
+ * -1 if not.*/
static int
-rend_add_service(smartlist_t *service_list, rend_service_t *service)
+rend_validate_service(const smartlist_t *service_list,
+ const rend_service_t *service)
{
- int i;
- rend_service_port_config_t *p;
+ int dupe = 0;
+ tor_assert(service_list);
tor_assert(service);
- smartlist_t *s_list = rend_get_service_list_mutable(service_list);
- /* We must have a service list, even if it's a temporary one, so we can
- * check for duplicate services */
- if (BUG(!s_list)) {
- return -1;
- }
-
- service->intro_nodes = smartlist_new();
- service->expiring_nodes = smartlist_new();
-
if (service->max_streams_per_circuit < 0) {
log_warn(LD_CONFIG, "Hidden service (%s) configured with negative max "
"streams per circuit.",
rend_service_escaped_dir(service));
- rend_service_free(service);
- return -1;
+ goto invalid;
}
if (service->max_streams_close_circuit < 0 ||
@@ -300,87 +269,107 @@ rend_add_service(smartlist_t *service_list, rend_service_t *service)
log_warn(LD_CONFIG, "Hidden service (%s) configured with invalid "
"max streams handling.",
rend_service_escaped_dir(service));
- rend_service_free(service);
- return -1;
+ goto invalid;
}
if (service->auth_type != REND_NO_AUTH &&
- (!service->clients ||
- smartlist_len(service->clients) == 0)) {
- log_warn(LD_CONFIG, "Hidden service (%s) with client authorization but no "
- "clients.",
+ (!service->clients || smartlist_len(service->clients) == 0)) {
+ log_warn(LD_CONFIG, "Hidden service (%s) with client authorization but "
+ "no clients.",
rend_service_escaped_dir(service));
- rend_service_free(service);
- return -1;
+ goto invalid;
}
if (!service->ports || !smartlist_len(service->ports)) {
log_warn(LD_CONFIG, "Hidden service (%s) with no ports configured.",
rend_service_escaped_dir(service));
- rend_service_free(service);
- return -1;
- } else {
- int dupe = 0;
- /* XXX This duplicate check has two problems:
- *
- * a) It's O(n^2), but the same comment from the bottom of
- * rend_config_services() should apply.
- *
- * b) We only compare directory paths as strings, so we can't
- * detect two distinct paths that specify the same directory
- * (which can arise from symlinks, case-insensitivity, bind
- * mounts, etc.).
- *
- * It also can't detect that two separate Tor instances are trying
- * to use the same HiddenServiceDir; for that, we would need a
- * lock file. But this is enough to detect a simple mistake that
- * at least one person has actually made.
- */
- tor_assert(s_list);
- if (!rend_service_is_ephemeral(service)) {
- /* Skip dupe for ephemeral services. */
- SMARTLIST_FOREACH(s_list, rend_service_t*, ptr,
- dupe = dupe ||
- !strcmp(ptr->directory, service->directory));
- if (dupe) {
- log_warn(LD_REND, "Another hidden service is already configured for "
- "directory %s.",
- rend_service_escaped_dir(service));
- rend_service_free(service);
- return -1;
- }
+ goto invalid;
+ }
+
+ /* XXX This duplicate check has two problems:
+ *
+ * a) It's O(n^2), but the same comment from the bottom of
+ * rend_config_services() should apply.
+ *
+ * b) We only compare directory paths as strings, so we can't
+ * detect two distinct paths that specify the same directory
+ * (which can arise from symlinks, case-insensitivity, bind
+ * mounts, etc.).
+ *
+ * It also can't detect that two separate Tor instances are trying
+ * to use the same HiddenServiceDir; for that, we would need a
+ * lock file. But this is enough to detect a simple mistake that
+ * at least one person has actually made.
+ */
+ if (!rend_service_is_ephemeral(service)) {
+ /* Skip dupe for ephemeral services. */
+ SMARTLIST_FOREACH(service_list, rend_service_t *, ptr,
+ dupe = dupe ||
+ !strcmp(ptr->directory, service->directory));
+ if (dupe) {
+ log_warn(LD_REND, "Another hidden service is already configured for "
+ "directory %s.",
+ rend_service_escaped_dir(service));
+ goto invalid;
}
- log_debug(LD_REND,"Configuring service with directory %s",
- rend_service_escaped_dir(service));
- for (i = 0; i < smartlist_len(service->ports); ++i) {
- p = smartlist_get(service->ports, i);
- if (!(p->is_unix_addr)) {
- log_debug(LD_REND,
- "Service maps port %d to %s",
- p->virtual_port,
- fmt_addrport(&p->real_addr, p->real_port));
- } else {
+ }
+
+ /* Valid. */
+ return 0;
+ invalid:
+ return -1;
+}
+
+/** Add it to <b>service_list</b>, or to the global rend_service_list if
+ * <b>service_list</b> is NULL. Return 0 on success. On failure, free
+ * <b>service</b> and return -1. Takes ownership of <b>service</b>. */
+static int
+rend_add_service(smartlist_t *service_list, rend_service_t *service)
+{
+ int i;
+ rend_service_port_config_t *p;
+
+ tor_assert(service);
+
+ smartlist_t *s_list = rend_get_service_list_mutable(service_list);
+ /* We must have a service list, even if it's a temporary one, so we can
+ * check for duplicate services */
+ if (BUG(!s_list)) {
+ return -1;
+ }
+
+ service->intro_nodes = smartlist_new();
+ service->expiring_nodes = smartlist_new();
+
+ log_debug(LD_REND,"Configuring service with directory %s",
+ rend_service_escaped_dir(service));
+ for (i = 0; i < smartlist_len(service->ports); ++i) {
+ p = smartlist_get(service->ports, i);
+ if (!(p->is_unix_addr)) {
+ log_debug(LD_REND,
+ "Service maps port %d to %s",
+ p->virtual_port,
+ fmt_addrport(&p->real_addr, p->real_port));
+ } else {
#ifdef HAVE_SYS_UN_H
- log_debug(LD_REND,
- "Service maps port %d to socket at \"%s\"",
- p->virtual_port, p->unix_addr);
+ log_debug(LD_REND,
+ "Service maps port %d to socket at \"%s\"",
+ p->virtual_port, p->unix_addr);
#else
- log_warn(LD_BUG,
- "Service maps port %d to an AF_UNIX socket, but we "
- "have no AF_UNIX support on this platform. This is "
- "probably a bug.",
- p->virtual_port);
- rend_service_free(service);
- return -1;
+ log_warn(LD_BUG,
+ "Service maps port %d to an AF_UNIX socket, but we "
+ "have no AF_UNIX support on this platform. This is "
+ "probably a bug.",
+ p->virtual_port);
+ rend_service_free(service);
+ return -1;
#endif /* defined(HAVE_SYS_UN_H) */
- }
}
- /* The service passed all the checks */
- tor_assert(s_list);
- smartlist_add(s_list, service);
- return 0;
}
- /* NOTREACHED */
+ /* The service passed all the checks */
+ tor_assert(s_list);
+ smartlist_add(s_list, service);
+ return 0;
}
/** Return a new rend_service_port_config_t with its path set to
@@ -542,18 +531,34 @@ rend_service_check_dir_and_add(smartlist_t *service_list,
return rend_add_service(s_list, service);
}
-/* If this is a reload and there were hidden services configured before,
- * keep the introduction points that are still needed and close the
- * other ones. */
+/* Helper: Actual implementation of the pruning on reload which we've
+ * decoupled in order to make the unit test workeable without ugly hacks.
+ * Furthermore, this function does NOT free any memory but will nullify the
+ * temporary list pointer whatever happens. */
STATIC void
-prune_services_on_reload(smartlist_t *old_service_list,
- smartlist_t *new_service_list)
+rend_service_prune_list_impl_(void)
{
origin_circuit_t *ocirc = NULL;
- smartlist_t *surviving_services = NULL;
+ smartlist_t *surviving_services, *old_service_list, *new_service_list;
+
+ /* When pruning our current service list, we must have a staging list that
+ * contains what we want to check else it's a code flow error. */
+ tor_assert(rend_service_staging_list);
- tor_assert(old_service_list);
- tor_assert(new_service_list);
+ /* We are about to prune the current list of its dead service so set the
+ * semantic for that list to be the "old" one. */
+ old_service_list = rend_service_list;
+ /* The staging list is now the "new" list so set this semantic. */
+ new_service_list = rend_service_staging_list;
+ /* After this, whatever happens, we'll use our new list. */
+ rend_service_list = new_service_list;
+ /* Finally, nullify the staging list pointer as we don't need it anymore
+ * and it needs to be NULL before the next reload. */
+ rend_service_staging_list = NULL;
+ /* Nothing to prune if we have no service list so stop right away. */
+ if (!old_service_list) {
+ return;
+ }
/* This contains all _existing_ services that survives the relaod that is
* that haven't been removed from the configuration. The difference between
@@ -631,6 +636,27 @@ prune_services_on_reload(smartlist_t *old_service_list,
smartlist_free(surviving_services);
}
+/* Try to prune our main service list using the temporary one that we just
+ * loaded and parsed successfully. The pruning process decides which onion
+ * services to keep and which to discard after a reload. */
+void
+rend_service_prune_list(void)
+{
+ smartlist_t *old_service_list = rend_service_list;
+ /* Don't try to prune anything if we have no staging list. */
+ if (!rend_service_staging_list) {
+ return;
+ }
+ rend_service_prune_list_impl_();
+ if (old_service_list) {
+ /* Every remaining service in the old list have been removed from the
+ * configuration so clean them up safely. */
+ SMARTLIST_FOREACH(old_service_list, rend_service_t *, s,
+ rend_service_free(s));
+ smartlist_free(old_service_list);
+ }
+}
+
/** Set up rend_service_list, based on the values of HiddenServiceDir and
* HiddenServicePort in <b>options</b>. Return 0 on success and -1 on
* failure. (If <b>validate_only</b> is set, parse, warn and return as
@@ -642,24 +668,30 @@ rend_config_services(const or_options_t *options, int validate_only)
config_line_t *line;
rend_service_t *service = NULL;
rend_service_port_config_t *portcfg;
- smartlist_t *old_service_list = NULL;
- smartlist_t *temp_service_list = NULL;
int ok = 0;
int rv = -1;
- /* Use a temporary service list, so that we can check the new services'
- * consistency with each other */
- temp_service_list = smartlist_new();
+ /* Use the staging service list so that we can check then do the pruning
+ * process using the main list at the end. */
+ if (rend_service_staging_list == NULL) {
+ rend_service_staging_list = smartlist_new();
+ }
for (line = options->RendConfigLines; line; line = line->next) {
if (!strcasecmp(line->key, "HiddenServiceDir")) {
- /* register the service we just finished parsing
- * this code registers every service except the last one parsed,
- * which is registered below the loop */
- if (rend_service_check_dir_and_add(temp_service_list, options, service,
- validate_only) < 0) {
- service = NULL;
- goto free_and_return;
+ if (service) {
+ /* Validate and register the service we just finished parsing this
+ * code registers every service except the last one parsed, which is
+ * validated and registered below the loop. */
+ if (rend_validate_service(rend_service_staging_list, service) < 0) {
+ goto free_and_return;
+ }
+ if (rend_service_check_dir_and_add(rend_service_staging_list, options,
+ service, validate_only) < 0) {
+ /* The above frees the service on error so nullify the pointer. */
+ service = NULL;
+ goto free_and_return;
+ }
}
service = tor_malloc_zero(sizeof(rend_service_t));
service->directory = tor_strdup(line->value);
@@ -854,14 +886,23 @@ rend_config_services(const or_options_t *options, int validate_only)
}
}
}
+ /* Validate the last service that we just parsed. */
+ if (service &&
+ rend_validate_service(rend_service_staging_list, service) < 0) {
+ goto free_and_return;
+ }
/* register the final service after we have finished parsing all services
* this code only registers the last service, other services are registered
* within the loop. It is ok for this service to be NULL, it is ignored. */
- if (rend_service_check_dir_and_add(temp_service_list, options, service,
- validate_only) < 0) {
+ if (rend_service_check_dir_and_add(rend_service_staging_list, options,
+ service, validate_only) < 0) {
+ /* Service object is freed on error so nullify pointer. */
service = NULL;
goto free_and_return;
}
+ /* The service is in the staging list so nullify pointer to avoid double
+ * free of this object in case of error because we lost ownership of it at
+ * this point. */
service = NULL;
/* Free the newly added services if validating */
@@ -870,31 +911,19 @@ rend_config_services(const or_options_t *options, int validate_only)
goto free_and_return;
}
- /* Otherwise, use the newly added services as the new service list
- * Since we have now replaced the global service list, from this point on we
- * must succeed, or die trying. */
- old_service_list = rend_service_list;
- rend_service_list = temp_service_list;
- temp_service_list = NULL;
-
- /* If this is a reload and there were hidden services configured before,
- * keep the introduction points that are still needed and close the
- * other ones. */
- if (old_service_list && !validate_only) {
- prune_services_on_reload(old_service_list, rend_service_list);
- /* Every remaining service in the old list have been removed from the
- * configuration so clean them up safely. */
- SMARTLIST_FOREACH(old_service_list, rend_service_t *, s,
- rend_service_free(s));
- smartlist_free(old_service_list);
- }
+ /* This could be a reload of configuration so try to prune the main list
+ * using the staging one. And we know we are not in validate mode here.
+ * After this, the main and staging list will point to the right place and
+ * be in a quiescent usable state. */
+ rend_service_prune_list();
return 0;
free_and_return:
rend_service_free(service);
- SMARTLIST_FOREACH(temp_service_list, rend_service_t *, ptr,
+ SMARTLIST_FOREACH(rend_service_staging_list, rend_service_t *, ptr,
rend_service_free(ptr));
- smartlist_free(temp_service_list);
+ smartlist_free(rend_service_staging_list);
+ rend_service_staging_list = NULL;
return rv;
}
@@ -1028,6 +1057,38 @@ rend_service_del_ephemeral(const char *service_id)
return 0;
}
+/* There can be 1 second's delay due to second_elapsed_callback, and perhaps
+ * another few seconds due to blocking calls. */
+#define INTRO_CIRC_RETRY_PERIOD_SLOP 10
+
+/** Log information about the intro point creation rate and current intro
+ * points for service, upgrading the log level from min_severity to warn if
+ * we have stopped launching new intro point circuits. */
+static void
+rend_log_intro_limit(const rend_service_t *service, int min_severity)
+{
+ int exceeded_limit = (service->n_intro_circuits_launched >=
+ rend_max_intro_circs_per_period(
+ service->n_intro_points_wanted));
+ int severity = min_severity;
+ /* We stopped creating circuits */
+ if (exceeded_limit) {
+ severity = LOG_WARN;
+ }
+ time_t intro_period_elapsed = time(NULL) - service->intro_period_started;
+ tor_assert_nonfatal(intro_period_elapsed >= 0);
+ log_fn(severity, LD_REND, "Hidden service %s %s %d intro points in the last "
+ "%d seconds. Intro circuit launches are limited to %d per %d "
+ "seconds.",
+ service->service_id,
+ exceeded_limit ? "exceeded launch limit with" : "launched",
+ service->n_intro_circuits_launched,
+ (int)intro_period_elapsed,
+ rend_max_intro_circs_per_period(service->n_intro_points_wanted),
+ INTRO_CIRC_RETRY_PERIOD);
+ rend_service_dump_stats(severity);
+}
+
/** Replace the old value of <b>service</b>-\>desc with one that reflects
* the other fields in service.
*/
@@ -1035,7 +1096,6 @@ static void
rend_service_update_descriptor(rend_service_t *service)
{
rend_service_descriptor_t *d;
- origin_circuit_t *circ;
int i;
rend_service_descriptor_free(service->desc);
@@ -1056,9 +1116,10 @@ rend_service_update_descriptor(rend_service_t *service)
/* This intro point won't be listed in the descriptor... */
intro_svc->listed_in_last_desc = 0;
- circ = find_intro_circuit(intro_svc, service->pk_digest);
- if (!circ || circ->base_.purpose != CIRCUIT_PURPOSE_S_INTRO) {
- /* This intro point's circuit isn't finished yet. Don't list it. */
+ /* circuit_established is set in rend_service_intro_established(), and
+ * checked every second in rend_consider_services_intro_points(), so it's
+ * safe to use it here */
+ if (!intro_svc->circuit_established) {
continue;
}
@@ -1080,6 +1141,26 @@ rend_service_update_descriptor(rend_service_t *service)
intro_svc->time_published = time(NULL);
}
}
+
+ /* Check that we have the right number of intro points */
+ unsigned int have_intro = (unsigned int)smartlist_len(d->intro_nodes);
+ if (have_intro != service->n_intro_points_wanted) {
+ int severity;
+ /* Getting less than we wanted or more than we're allowed is serious */
+ if (have_intro < service->n_intro_points_wanted ||
+ have_intro > NUM_INTRO_POINTS_MAX) {
+ severity = LOG_WARN;
+ } else {
+ /* Getting more than we wanted is weird, but less of a problem */
+ severity = LOG_NOTICE;
+ }
+ log_fn(severity, LD_REND, "Hidden service %s wanted %d intro points, but "
+ "descriptor was updated with %d instead.",
+ service->service_id,
+ service->n_intro_points_wanted, have_intro);
+ /* Now log an informative message about how we might have got here. */
+ rend_log_intro_limit(service, severity);
+ }
}
/* Allocate and return a string containing the path to file_name in
@@ -1237,7 +1318,8 @@ poison_new_single_onion_hidden_service_dir_impl(const rend_service_t *service,
}
/* Make sure the directory was created before calling this function. */
- if (BUG(rend_service_check_private_dir_impl(options, service, 0) < 0))
+ if (BUG(hs_check_service_private_dir(options->User, service->directory,
+ service->dir_group_readable, 0) < 0))
return -1;
poison_fname = rend_service_sos_poison_path(service);
@@ -1387,32 +1469,6 @@ rend_service_derive_key_digests(struct rend_service_t *s)
return 0;
}
-/* Implements the directory check from rend_service_check_private_dir,
- * without doing the single onion poison checks. */
-static int
-rend_service_check_private_dir_impl(const or_options_t *options,
- const rend_service_t *s,
- int create)
-{
- cpd_check_t check_opts = CPD_NONE;
- if (create) {
- check_opts |= CPD_CREATE;
- } else {
- check_opts |= CPD_CHECK_MODE_ONLY;
- check_opts |= CPD_CHECK;
- }
- if (s->dir_group_readable) {
- check_opts |= CPD_GROUP_READ;
- }
- /* Check/create directory */
- if (check_private_dir(s->directory, check_opts, options->User) < 0) {
- log_warn(LD_REND, "Checking service directory %s failed.", s->directory);
- return -1;
- }
-
- return 0;
-}
-
/** Make sure that the directory for <b>s</b> is private, using the config in
* <b>options</b>.
* If <b>create</b> is true:
@@ -1433,7 +1489,8 @@ rend_service_check_private_dir(const or_options_t *options,
}
/* Check/create directory */
- if (rend_service_check_private_dir_impl(options, s, create) < 0) {
+ if (hs_check_service_private_dir(options->User, s->directory,
+ s->dir_group_readable, create) < 0) {
return -1;
}
@@ -3174,8 +3231,9 @@ count_intro_point_circuits(const rend_service_t *service)
of bytes written. On fail, return -1.
*/
STATIC ssize_t
-encode_establish_intro_cell_legacy(char *cell_body_out, crypto_pk_t *intro_key,
- char *rend_circ_nonce)
+encode_establish_intro_cell_legacy(char *cell_body_out,
+ size_t cell_body_out_len,
+ crypto_pk_t *intro_key, char *rend_circ_nonce)
{
int retval = -1;
int r;
@@ -3202,7 +3260,7 @@ encode_establish_intro_cell_legacy(char *cell_body_out, crypto_pk_t *intro_key,
len += 20;
note_crypto_pk_op(REND_SERVER);
r = crypto_pk_private_sign_digest(intro_key, cell_body_out+len,
- sizeof(cell_body_out)-len,
+ cell_body_out_len - len,
cell_body_out, len);
if (r<0) {
log_warn(LD_BUG, "Internal error: couldn't sign introduction request.");
@@ -3313,8 +3371,9 @@ rend_service_intro_has_opened(origin_circuit_t *circuit)
/* Send the ESTABLISH_INTRO cell */
{
ssize_t len;
- len = encode_establish_intro_cell_legacy(buf, circuit->intro_key,
- circuit->cpath->prev->rend_circ_nonce);
+ len = encode_establish_intro_cell_legacy(buf, sizeof(buf),
+ circuit->intro_key,
+ circuit->cpath->prev->rend_circ_nonce);
if (len < 0) {
reason = END_CIRC_REASON_INTERNAL;
goto err;
@@ -3669,13 +3728,16 @@ directory_post_to_hs_dir(rend_service_descriptor_t *renddesc,
* request. Lookup is made in rend_service_desc_has_uploaded(). */
rend_data = rend_data_client_create(service_id, desc->desc_id, NULL,
REND_NO_AUTH);
- directory_initiate_command_routerstatus_rend(hs_dir,
- DIR_PURPOSE_UPLOAD_RENDDESC_V2,
- ROUTER_PURPOSE_GENERAL,
- DIRIND_ANONYMOUS, NULL,
- desc->desc_str,
- strlen(desc->desc_str),
- 0, rend_data, NULL);
+ directory_request_t *req =
+ directory_request_new(DIR_PURPOSE_UPLOAD_RENDDESC_V2);
+ directory_request_set_routerstatus(req, hs_dir);
+ directory_request_set_indirection(req, DIRIND_ANONYMOUS);
+ directory_request_set_payload(req,
+ desc->desc_str, strlen(desc->desc_str));
+ directory_request_set_rend_query(req, rend_data);
+ directory_initiate_request(req);
+ directory_request_free(req);
+
rend_data_free(rend_data);
base32_encode(desc_id_base32, sizeof(desc_id_base32),
desc->desc_id, DIGEST_LEN);
@@ -4015,6 +4077,18 @@ rend_service_desc_has_uploaded(const rend_data_t *rend_data)
} SMARTLIST_FOREACH_END(intro);
}
+/** Don't try to build more than this many circuits before giving up
+ * for a while. Dynamically calculated based on the configured number of
+ * introduction points for the service, n_intro_points_wanted. */
+static int
+rend_max_intro_circs_per_period(unsigned int n_intro_points_wanted)
+{
+ /* Allow all but one of the initial connections to fail and be
+ * retried. (If all fail, we *want* to wait, because something is broken.) */
+ tor_assert(n_intro_points_wanted <= NUM_INTRO_POINTS_MAX);
+ return (int)(2*n_intro_points_wanted + NUM_INTRO_POINTS_EXTRA);
+}
+
/** For every service, check how many intro points it currently has, and:
* - Invalidate introdution points based on specific criteria, see
* remove_invalid_intro_points comments.
@@ -4059,23 +4133,29 @@ rend_consider_services_intro_points(void)
smartlist_clear(exclude_nodes);
smartlist_clear(retry_nodes);
+ /* Cleanup the invalid intro points and save the node objects, if any,
+ * in the exclude_nodes and retry_nodes lists. */
+ remove_invalid_intro_points(service, exclude_nodes, retry_nodes, now);
+
/* This retry period is important here so we don't stress circuit
* creation. */
+
if (now > service->intro_period_started + INTRO_CIRC_RETRY_PERIOD) {
- /* One period has elapsed; we can try building circuits again. */
+ /* One period has elapsed:
+ * - if we stopped, we can try building circuits again,
+ * - if we haven't, we reset the circuit creation counts. */
+ rend_log_intro_limit(service, LOG_INFO);
service->intro_period_started = now;
service->n_intro_circuits_launched = 0;
} else if (service->n_intro_circuits_launched >=
- MAX_INTRO_CIRCS_PER_PERIOD) {
+ rend_max_intro_circs_per_period(
+ service->n_intro_points_wanted)) {
/* We have failed too many times in this period; wait for the next
- * one before we try again. */
+ * one before we try to initiate any more connections. */
+ rend_log_intro_limit(service, LOG_WARN);
continue;
}
- /* Cleanup the invalid intro points and save the node objects, if apply,
- * in the exclude_nodes and retry_nodes list. */
- remove_invalid_intro_points(service, exclude_nodes, retry_nodes, now);
-
/* Let's try to rebuild circuit on the nodes we want to retry on. */
SMARTLIST_FOREACH_BEGIN(retry_nodes, rend_intro_point_t *, intro) {
r = rend_service_launch_establish_intro(service, intro);
@@ -4518,3 +4598,19 @@ rend_service_non_anonymous_mode_enabled(const or_options_t *options)
return options->HiddenServiceNonAnonymousMode ? 1 : 0;
}
+#ifdef TOR_UNIT_TESTS
+
+STATIC void
+set_rend_service_list(smartlist_t *new_list)
+{
+ rend_service_list = new_list;
+}
+
+STATIC void
+set_rend_rend_service_staging_list(smartlist_t *new_list)
+{
+ rend_service_staging_list = new_list;
+}
+
+#endif /* TOR_UNIT_TESTS */
+
diff --git a/src/or/rendservice.h b/src/or/rendservice.h
index 3bfac0bece..1583a6010b 100644
--- a/src/or/rendservice.h
+++ b/src/or/rendservice.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -130,15 +130,22 @@ STATIC int rend_service_poison_new_single_onion_dir(
const rend_service_t *s,
const or_options_t* options);
STATIC ssize_t encode_establish_intro_cell_legacy(char *cell_body_out,
+ size_t cell_body_out_len,
crypto_pk_t *intro_key,
char *rend_circ_nonce);
-STATIC void prune_services_on_reload(smartlist_t *old_service_list,
- smartlist_t *new_service_list);
+#ifdef TOR_UNIT_TESTS
-#endif
+STATIC void set_rend_service_list(smartlist_t *new_list);
+STATIC void set_rend_rend_service_staging_list(smartlist_t *new_list);
+STATIC void rend_service_prune_list_impl_(void);
+
+#endif /* TOR_UNIT_TESTS */
+
+#endif /* RENDSERVICE_PRIVATE */
int num_rend_services(void);
int rend_config_services(const or_options_t *options, int validate_only);
+void rend_service_prune_list(void);
int rend_service_load_all_keys(const smartlist_t *service_list);
void rend_services_add_filenames_to_lists(smartlist_t *open_lst,
smartlist_t *stat_lst);
diff --git a/src/or/rephist.c b/src/or/rephist.c
index aade1a0f9e..96087f92e7 100644
--- a/src/or/rephist.c
+++ b/src/or/rephist.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/rephist.h b/src/or/rephist.h
index 5a1ad82663..2b1c2e7ec7 100644
--- a/src/or/rephist.h
+++ b/src/or/rephist.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/replaycache.c b/src/or/replaycache.c
index 8290fa6964..3d42deb90a 100644
--- a/src/or/replaycache.c
+++ b/src/or/replaycache.c
@@ -1,4 +1,4 @@
- /* Copyright (c) 2012-2016, The Tor Project, Inc. */
+ /* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/replaycache.h b/src/or/replaycache.h
index 64a6caf5f5..0d637939a4 100644
--- a/src/or/replaycache.h
+++ b/src/or/replaycache.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/router.c b/src/or/router.c
index 82f963a3f7..6318f78549 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ROUTER_PRIVATE
@@ -148,6 +148,51 @@ dup_onion_keys(crypto_pk_t **key, crypto_pk_t **last)
tor_mutex_release(key_lock);
}
+/** Expire our old set of onion keys. This is done by setting
+ * last_curve25519_onion_key and lastonionkey to all zero's and NULL
+ * respectively.
+ *
+ * This function does not perform any grace period checks for the old onion
+ * keys.
+ */
+void
+expire_old_onion_keys(void)
+{
+ char *fname = NULL;
+
+ tor_mutex_acquire(key_lock);
+
+ /* Free lastonionkey and set it to NULL. */
+ if (lastonionkey) {
+ crypto_pk_free(lastonionkey);
+ lastonionkey = NULL;
+ }
+
+ /* We zero out the keypair. See the tor_mem_is_zero() check made in
+ * construct_ntor_key_map() below. */
+ memset(&last_curve25519_onion_key, 0, sizeof(last_curve25519_onion_key));
+
+ tor_mutex_release(key_lock);
+
+ fname = get_datadir_fname2("keys", "secret_onion_key.old");
+ if (file_status(fname) == FN_FILE) {
+ if (tor_unlink(fname) != 0) {
+ log_warn(LD_FS, "Couldn't unlink old onion key file %s: %s",
+ fname, strerror(errno));
+ }
+ }
+ tor_free(fname);
+
+ fname = get_datadir_fname2("keys", "secret_onion_key_ntor.old");
+ if (file_status(fname) == FN_FILE) {
+ if (tor_unlink(fname) != 0) {
+ log_warn(LD_FS, "Couldn't unlink old ntor onion key file %s: %s",
+ fname, strerror(errno));
+ }
+ }
+ tor_free(fname);
+}
+
/** Return the current secret onion key for the ntor handshake. Must only
* be called from the main thread. */
static const curve25519_keypair_t *
@@ -683,6 +728,47 @@ v3_authority_check_key_expiry(void)
last_warned = now;
}
+/** Get the lifetime of an onion key in days. This value is defined by the
+ * network consesus parameter "onion-key-rotation-days". Always returns a value
+ * between <b>MIN_ONION_KEY_LIFETIME_DAYS</b> and
+ * <b>MAX_ONION_KEY_LIFETIME_DAYS</b>.
+ */
+static int
+get_onion_key_rotation_days_(void)
+{
+ return networkstatus_get_param(NULL,
+ "onion-key-rotation-days",
+ DEFAULT_ONION_KEY_LIFETIME_DAYS,
+ MIN_ONION_KEY_LIFETIME_DAYS,
+ MAX_ONION_KEY_LIFETIME_DAYS);
+}
+
+/** Get the current lifetime of an onion key in seconds. This value is defined
+ * by the network consesus parameter "onion-key-rotation-days", but the value
+ * is converted to seconds.
+ */
+int
+get_onion_key_lifetime(void)
+{
+ return get_onion_key_rotation_days_()*24*60*60;
+}
+
+/** Get the grace period of an onion key in seconds. This value is defined by
+ * the network consesus parameter "onion-key-grace-period-days", but the value
+ * is converted to seconds.
+ */
+int
+get_onion_key_grace_period(void)
+{
+ int grace_period;
+ grace_period = networkstatus_get_param(NULL,
+ "onion-key-grace-period-days",
+ DEFAULT_ONION_KEY_GRACE_PERIOD_DAYS,
+ MIN_ONION_KEY_GRACE_PERIOD_DAYS,
+ get_onion_key_rotation_days_());
+ return grace_period*24*60*60;
+}
+
/** Set up Tor's TLS contexts, based on our configuration and keys. Return 0
* on success, and -1 on failure. */
int
@@ -928,7 +1014,7 @@ init_keys(void)
/* We have no LastRotatedOnionKey set; either we just created the key
* or it's a holdover from 0.1.2.4-alpha-dev or earlier. In either case,
* start the clock ticking now so that we will eventually rotate it even
- * if we don't stay up for a full MIN_ONION_KEY_LIFETIME. */
+ * if we don't stay up for the full lifetime of an onion key. */
state->LastRotatedOnionKey = onionkey_set_at = now;
or_state_mark_dirty(state, options->AvoidDiskWrites ?
time(NULL)+3600 : 0);
@@ -1384,13 +1470,23 @@ consider_testing_reachability(int test_or, int test_dir)
!connection_get_by_type_addr_port_purpose(
CONN_TYPE_DIR, &addr, me->dir_port,
DIR_PURPOSE_FETCH_SERVERDESC)) {
+ tor_addr_port_t my_orport, my_dirport;
+ memcpy(&my_orport.addr, &addr, sizeof(addr));
+ memcpy(&my_dirport.addr, &addr, sizeof(addr));
+ my_orport.port = me->or_port;
+ my_dirport.port = me->dir_port;
/* ask myself, via tor, for my server descriptor. */
- directory_initiate_command(&addr, me->or_port,
- &addr, me->dir_port,
- me->cache_info.identity_digest,
- DIR_PURPOSE_FETCH_SERVERDESC,
- ROUTER_PURPOSE_GENERAL,
- DIRIND_ANON_DIRPORT, "authority.z", NULL, 0, 0);
+ directory_request_t *req =
+ directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC);
+ directory_request_set_or_addr_port(req, &my_orport);
+ directory_request_set_dir_addr_port(req, &my_dirport);
+ directory_request_set_directory_id_digest(req,
+ me->cache_info.identity_digest);
+ // ask via an anon circuit, connecting to our dirport.
+ directory_request_set_indirection(req, DIRIND_ANON_DIRPORT);
+ directory_request_set_resource(req, "authority.z");
+ directory_initiate_request(req);
+ directory_request_free(req);
}
}
@@ -2760,7 +2856,7 @@ router_dump_router_to_string(routerinfo_t *router,
make_ntor_onion_key_crosscert(ntor_keypair,
&router->cache_info.signing_key_cert->signing_key,
router->cache_info.published_on,
- MIN_ONION_KEY_LIFETIME, &sign);
+ get_onion_key_lifetime(), &sign);
if (!cert) {
log_warn(LD_BUG,"make_ntor_onion_key_crosscert failed!");
goto err;
diff --git a/src/or/router.h b/src/or/router.h
index c30a0301b7..9c5def5218 100644
--- a/src/or/router.h
+++ b/src/or/router.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -27,10 +27,13 @@ crypto_pk_t *get_my_v3_authority_signing_key(void);
authority_cert_t *get_my_v3_legacy_cert(void);
crypto_pk_t *get_my_v3_legacy_signing_key(void);
void dup_onion_keys(crypto_pk_t **key, crypto_pk_t **last);
+void expire_old_onion_keys(void);
void rotate_onion_key(void);
crypto_pk_t *init_key_from_file(const char *fname, int generate,
int severity, int log_greeting);
void v3_authority_check_key_expiry(void);
+int get_onion_key_lifetime(void);
+int get_onion_key_grace_period(void);
di_digest256_map_t *construct_ntor_key_map(void);
void ntor_key_map_free(di_digest256_map_t *map);
diff --git a/src/or/routerkeys.c b/src/or/routerkeys.c
index 6259e3f5a0..01f5e98bd1 100644
--- a/src/or/routerkeys.c
+++ b/src/or/routerkeys.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/routerkeys.h b/src/or/routerkeys.h
index d2027f4bbe..6453c785b5 100644
--- a/src/or/routerkeys.h
+++ b/src/or/routerkeys.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_ROUTERKEYS_H
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 45b3838792..8927786fe8 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -947,6 +947,7 @@ authority_certs_fetch_resource_impl(const char *resource,
const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS
: DIRIND_ONEHOP;
+ directory_request_t *req = NULL;
/* If we've just downloaded a consensus from a bridge, re-use that
* bridge */
if (options->UseBridges && node && node->ri && !get_via_tor) {
@@ -955,23 +956,25 @@ authority_certs_fetch_resource_impl(const char *resource,
/* we are willing to use a non-preferred address if we need to */
fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0,
&or_ap);
- directory_initiate_command(&or_ap.addr, or_ap.port,
- NULL, 0, /*no dirport*/
- dir_hint,
- DIR_PURPOSE_FETCH_CERTIFICATE,
- 0,
- indirection,
- resource, NULL, 0, 0);
- return;
- }
- if (rs) {
- /* If we've just downloaded a consensus from a directory, re-use that
+ req = directory_request_new(DIR_PURPOSE_FETCH_CERTIFICATE);
+ directory_request_set_or_addr_port(req, &or_ap);
+ if (dir_hint)
+ directory_request_set_directory_id_digest(req, dir_hint);
+ } else if (rs) {
+ /* And if we've just downloaded a consensus from a directory, re-use that
* directory */
- directory_initiate_command_routerstatus(rs,
- DIR_PURPOSE_FETCH_CERTIFICATE,
- 0, indirection, resource, NULL,
- 0, 0, NULL);
+ req = directory_request_new(DIR_PURPOSE_FETCH_CERTIFICATE);
+ directory_request_set_routerstatus(req, rs);
+ }
+
+ if (req) {
+ /* We've set up a request object -- fill in the other request fields, and
+ * send the request. */
+ directory_request_set_indirection(req, indirection);
+ directory_request_set_resource(req, resource);
+ directory_initiate_request(req);
+ directory_request_free(req);
return;
}
@@ -3045,8 +3048,8 @@ router_get_by_extrainfo_digest,(const char *digest))
/** Return the signed descriptor for the extrainfo_t in our routerlist whose
* extra-info-digest is <b>digest</b>. Return NULL if no such extra-info
* document is known. */
-signed_descriptor_t *
-extrainfo_get_by_descriptor_digest(const char *digest)
+MOCK_IMPL(signed_descriptor_t *,
+extrainfo_get_by_descriptor_digest,(const char *digest))
{
extrainfo_t *ei;
tor_assert(digest);
@@ -4932,10 +4935,11 @@ MOCK_IMPL(STATIC void, initiate_descriptor_downloads,
if (source) {
/* We know which authority or directory mirror we want. */
- directory_initiate_command_routerstatus(source, purpose,
- ROUTER_PURPOSE_GENERAL,
- DIRIND_ONEHOP,
- resource, NULL, 0, 0, NULL);
+ directory_request_t *req = directory_request_new(purpose);
+ directory_request_set_routerstatus(req, source);
+ directory_request_set_resource(req, resource);
+ directory_initiate_request(req);
+ directory_request_free(req);
} else {
directory_get_from_dirserver(purpose, ROUTER_PURPOSE_GENERAL, resource,
pds_flags, DL_WANT_ANY_DIRSERVER);
diff --git a/src/or/routerlist.h b/src/or/routerlist.h
index 8b68d69f28..5c1f76c8e7 100644
--- a/src/or/routerlist.h
+++ b/src/or/routerlist.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -92,7 +92,8 @@ routerinfo_t *router_get_mutable_by_digest(const char *digest);
signed_descriptor_t *router_get_by_descriptor_digest(const char *digest);
MOCK_DECL(signed_descriptor_t *,router_get_by_extrainfo_digest,
(const char *digest));
-signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest);
+MOCK_DECL(signed_descriptor_t *,extrainfo_get_by_descriptor_digest,
+ (const char *digest));
const char *signed_descriptor_get_body(const signed_descriptor_t *desc);
const char *signed_descriptor_get_annotations(const signed_descriptor_t *desc);
routerlist_t *router_get_routerlist(void);
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index 98167d44f8..fa79cf7132 100644
--- a/src/or/routerparse.c
+++ b/src/or/routerparse.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -359,6 +359,7 @@ static addr_policy_t *router_parse_addr_policy_private(directory_token_t *tok);
static int router_get_hash_impl_helper(const char *s, size_t s_len,
const char *start_str,
const char *end_str, char end_c,
+ int log_severity,
const char **start_out, const char **end_out);
static int router_get_hash_impl(const char *s, size_t s_len, char *digest,
const char *start_str, const char *end_str,
@@ -988,6 +989,41 @@ router_get_router_hash(const char *s, size_t s_len, char *digest)
DIGEST_SHA1);
}
+/** Try to find the start and end of the signed portion of a networkstatus
+ * document in <b>s</b>. On success, set <b>start_out</b> to the first
+ * character of the document, and <b>end_out</b> to a position one after the
+ * final character of the signed document, and return 0. On failure, return
+ * -1. */
+int
+router_get_networkstatus_v3_signed_boundaries(const char *s,
+ const char **start_out,
+ const char **end_out)
+{
+ return router_get_hash_impl_helper(s, strlen(s),
+ "network-status-version",
+ "\ndirectory-signature",
+ ' ', LOG_INFO,
+ start_out, end_out);
+}
+
+/** Set <b>digest_out</b> to the SHA3-256 digest of the signed portion of the
+ * networkstatus vote in <b>s</b> -- or of the entirety of <b>s</b> if no
+ * signed portion can be identified. Return 0 on success, -1 on failure. */
+int
+router_get_networkstatus_v3_sha3_as_signed(uint8_t *digest_out,
+ const char *s)
+{
+ const char *start, *end;
+ if (router_get_networkstatus_v3_signed_boundaries(s, &start, &end) < 0) {
+ start = s;
+ end = s + strlen(s);
+ }
+ tor_assert(start);
+ tor_assert(end);
+ return crypto_digest256((char*)digest_out, start, end-start,
+ DIGEST_SHA3_256);
+}
+
/** Set <b>digests</b> to all the digests of the consensus document in
* <b>s</b> */
int
@@ -1787,7 +1823,8 @@ router_parse_entry_from_string(const char *s, const char *end,
if (router_get_hash_impl_helper(s, end-s, "router ",
"\nrouter-sig-ed25519",
- ' ', &signed_start, &signed_end) < 0) {
+ ' ', LOG_WARN,
+ &signed_start, &signed_end) < 0) {
log_warn(LD_DIR, "Can't find ed25519-signed portion of descriptor");
goto err;
}
@@ -2030,6 +2067,9 @@ extrainfo_parse_entry_from_string(const char *s, const char *end,
* parse that's covered by the hash. */
int can_dl_again = 0;
+ if (BUG(s == NULL))
+ return NULL;
+
if (!end) {
end = s + strlen(s);
}
@@ -2137,7 +2177,8 @@ extrainfo_parse_entry_from_string(const char *s, const char *end,
if (router_get_hash_impl_helper(s, end-s, "extra-info ",
"\nrouter-sig-ed25519",
- ' ', &signed_start, &signed_end) < 0) {
+ ' ', LOG_WARN,
+ &signed_start, &signed_end) < 0) {
log_warn(LD_DIR, "Can't find ed25519-signed portion of extrainfo");
goto err;
}
@@ -2664,6 +2705,10 @@ routerstatus_parse_entry_from_string(memarea_t *area,
protocol_list_supports_protocol(tok->args[0], PRT_RELAY, 2);
rs->supports_ed25519_link_handshake =
protocol_list_supports_protocol(tok->args[0], PRT_LINKAUTH, 3);
+ rs->supports_ed25519_hs_intro =
+ protocol_list_supports_protocol(tok->args[0], PRT_HSINTRO, 4);
+ rs->supports_v3_hsdir =
+ protocol_list_supports_protocol(tok->args[0], PRT_HSDIR, 2);
}
if ((tok = find_opt_by_keyword(tokens, K_V))) {
tor_assert(tok->n_args == 1);
@@ -3339,6 +3384,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out,
networkstatus_voter_info_t *voter = NULL;
networkstatus_t *ns = NULL;
common_digests_t ns_digests;
+ uint8_t sha3_as_signed[DIGEST256_LEN];
const char *cert, *end_of_header, *end_of_footer, *s_dup = s;
directory_token_t *tok;
struct in_addr in;
@@ -3352,7 +3398,8 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out,
if (eos_out)
*eos_out = NULL;
- if (router_get_networkstatus_v3_hashes(s, &ns_digests)) {
+ if (router_get_networkstatus_v3_hashes(s, &ns_digests) ||
+ router_get_networkstatus_v3_sha3_as_signed(sha3_as_signed, s)<0) {
log_warn(LD_DIR, "Unable to compute digest of network-status");
goto err;
}
@@ -3369,6 +3416,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out,
ns = tor_malloc_zero(sizeof(networkstatus_t));
memcpy(&ns->digests, &ns_digests, sizeof(ns_digests));
+ memcpy(&ns->digest_sha3_as_signed, sha3_as_signed, sizeof(sha3_as_signed));
tok = find_by_keyword(tokens, K_NETWORK_STATUS_VERSION);
tor_assert(tok);
@@ -4464,16 +4512,18 @@ static int
router_get_hash_impl_helper(const char *s, size_t s_len,
const char *start_str,
const char *end_str, char end_c,
+ int log_severity,
const char **start_out, const char **end_out)
{
const char *start, *end;
start = tor_memstr(s, s_len, start_str);
if (!start) {
- log_warn(LD_DIR,"couldn't find start of hashed material \"%s\"",start_str);
+ log_fn(log_severity,LD_DIR,
+ "couldn't find start of hashed material \"%s\"",start_str);
return -1;
}
if (start != s && *(start-1) != '\n') {
- log_warn(LD_DIR,
+ log_fn(log_severity,LD_DIR,
"first occurrence of \"%s\" is not at the start of a line",
start_str);
return -1;
@@ -4481,12 +4531,14 @@ router_get_hash_impl_helper(const char *s, size_t s_len,
end = tor_memstr(start+strlen(start_str),
s_len - (start-s) - strlen(start_str), end_str);
if (!end) {
- log_warn(LD_DIR,"couldn't find end of hashed material \"%s\"",end_str);
+ log_fn(log_severity,LD_DIR,
+ "couldn't find end of hashed material \"%s\"",end_str);
return -1;
}
end = memchr(end+strlen(end_str), end_c, s_len - (end-s) - strlen(end_str));
if (!end) {
- log_warn(LD_DIR,"couldn't find EOL");
+ log_fn(log_severity,LD_DIR,
+ "couldn't find EOL");
return -1;
}
++end;
@@ -4510,7 +4562,7 @@ router_get_hash_impl(const char *s, size_t s_len, char *digest,
digest_algorithm_t alg)
{
const char *start=NULL, *end=NULL;
- if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c,
+ if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c,LOG_WARN,
&start,&end)<0)
return -1;
@@ -4547,7 +4599,7 @@ router_get_hashes_impl(const char *s, size_t s_len, common_digests_t *digests,
const char *end_str, char end_c)
{
const char *start=NULL, *end=NULL;
- if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c,
+ if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c,LOG_WARN,
&start,&end)<0)
return -1;
@@ -4894,6 +4946,8 @@ tor_version_parse(const char *s, tor_version_t *out)
#define NUMBER(m) \
do { \
+ if (!cp || *cp < '0' || *cp > '9') \
+ return -1; \
out->m = (int)tor_parse_uint64(cp, 10, 0, INT32_MAX, &ok, &eos); \
if (!ok) \
return -1; \
diff --git a/src/or/routerparse.h b/src/or/routerparse.h
index 648f29b0d3..088f773c5e 100644
--- a/src/or/routerparse.h
+++ b/src/or/routerparse.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -16,6 +16,11 @@ int router_get_router_hash(const char *s, size_t s_len, char *digest);
int router_get_dir_hash(const char *s, char *digest);
int router_get_networkstatus_v3_hashes(const char *s,
common_digests_t *digests);
+int router_get_networkstatus_v3_signed_boundaries(const char *s,
+ const char **start_out,
+ const char **end_out);
+int router_get_networkstatus_v3_sha3_as_signed(uint8_t *digest_out,
+ const char *s);
int router_get_extrainfo_hash(const char *s, size_t s_len, char *digest);
#define DIROBJ_MAX_SIG_LEN 256
char *router_get_dirobj_signature(const char *digest,
diff --git a/src/or/routerset.c b/src/or/routerset.c
index d0df0a74e6..4906c6a51d 100644
--- a/src/or/routerset.c
+++ b/src/or/routerset.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/routerset.h b/src/or/routerset.h
index 2e3b4b0fe0..a63677b471 100644
--- a/src/or/routerset.h
+++ b/src/or/routerset.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/scheduler.c b/src/or/scheduler.c
index 033e6d119c..fac545fba7 100644
--- a/src/or/scheduler.c
+++ b/src/or/scheduler.c
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* * Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/or/scheduler.h b/src/or/scheduler.h
index 3dcfd2faca..e29c13de7e 100644
--- a/src/or/scheduler.h
+++ b/src/or/scheduler.h
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* * Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/shared_random.c b/src/or/shared_random.c
index f798a51a9f..25ca0611cd 100644
--- a/src/or/shared_random.c
+++ b/src/or/shared_random.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -230,9 +230,7 @@ commit_decode(const char *encoded, sr_commit_t *commit)
{
int decoded_len = 0;
size_t offset = 0;
- /* XXX: Needs two extra bytes for the base64 decode calculation matches
- * the binary length once decoded. #17868. */
- char b64_decoded[SR_COMMIT_LEN + 2];
+ char b64_decoded[SR_COMMIT_LEN];
tor_assert(encoded);
tor_assert(commit);
@@ -284,9 +282,7 @@ STATIC int
reveal_decode(const char *encoded, sr_commit_t *commit)
{
int decoded_len = 0;
- /* XXX: Needs two extra bytes for the base64 decode calculation matches
- * the binary length once decoded. #17868. */
- char b64_decoded[SR_REVEAL_LEN + 2];
+ char b64_decoded[SR_REVEAL_LEN];
tor_assert(encoded);
tor_assert(commit);
diff --git a/src/or/shared_random.h b/src/or/shared_random.h
index dbb8effeaa..1f027c70e0 100644
--- a/src/or/shared_random.h
+++ b/src/or/shared_random.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_SHARED_RANDOM_H
@@ -36,17 +36,14 @@
/* Length of base64 encoded commit NOT including the NUL terminated byte.
* Formula is taken from base64_encode_size. This adds up to 56 bytes. */
-#define SR_COMMIT_BASE64_LEN \
- (((SR_COMMIT_LEN - 1) / 3) * 4 + 4)
+#define SR_COMMIT_BASE64_LEN (BASE64_LEN(SR_COMMIT_LEN))
/* Length of base64 encoded reveal NOT including the NUL terminated byte.
* Formula is taken from base64_encode_size. This adds up to 56 bytes. */
-#define SR_REVEAL_BASE64_LEN \
- (((SR_REVEAL_LEN - 1) / 3) * 4 + 4)
+#define SR_REVEAL_BASE64_LEN (BASE64_LEN(SR_REVEAL_LEN))
/* Length of base64 encoded shared random value. It's 32 bytes long so 44
* bytes from the base64_encode_size formula. That includes the '='
* character at the end. */
-#define SR_SRV_VALUE_BASE64_LEN \
- (((DIGEST256_LEN - 1) / 3) * 4 + 4)
+#define SR_SRV_VALUE_BASE64_LEN (BASE64_LEN(DIGEST256_LEN))
/* Assert if commit valid flag is not set. */
#define ASSERT_COMMIT_VALID(c) tor_assert((c)->valid)
diff --git a/src/or/shared_random_state.c b/src/or/shared_random_state.c
index 87db9031ee..89d2e8d7f6 100644
--- a/src/or/shared_random_state.c
+++ b/src/or/shared_random_state.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/shared_random_state.h b/src/or/shared_random_state.h
index 43a7f1d284..3526ad47d3 100644
--- a/src/or/shared_random_state.h
+++ b/src/or/shared_random_state.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_SHARED_RANDOM_STATE_H
diff --git a/src/or/statefile.c b/src/or/statefile.c
index a95ba8533c..d0606b3012 100644
--- a/src/or/statefile.c
+++ b/src/or/statefile.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/statefile.h b/src/or/statefile.h
index b13743481d..10c09324bc 100644
--- a/src/or/statefile.h
+++ b/src/or/statefile.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_STATEFILE_H
diff --git a/src/or/status.c b/src/or/status.c
index fce6a10157..f7be41e412 100644
--- a/src/or/status.c
+++ b/src/or/status.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2016, The Tor Project, Inc. */
+/* Copyright (c) 2010-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/status.h b/src/or/status.h
index b97e835037..c1a0033ce0 100644
--- a/src/or/status.h
+++ b/src/or/status.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2016, The Tor Project, Inc. */
+/* Copyright (c) 2010-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_STATUS_H
diff --git a/src/or/tor_main.c b/src/or/tor_main.c
index d67eda2ac9..a3a8838602 100644
--- a/src/or/tor_main.c
+++ b/src/or/tor_main.c
@@ -1,6 +1,6 @@
/* Copyright 2001-2004 Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
extern const char tor_git_revision[];
diff --git a/src/or/torcert.c b/src/or/torcert.c
index c58f3da2d3..ef9e78bfe7 100644
--- a/src/or/torcert.c
+++ b/src/or/torcert.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/torcert.h b/src/or/torcert.h
index 090f6b5811..51f7665f1e 100644
--- a/src/or/torcert.h
+++ b/src/or/torcert.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TORCERT_H_INCLUDED
diff --git a/src/or/transports.c b/src/or/transports.c
index 535393b1a1..31849a8d15 100644
--- a/src/or/transports.c
+++ b/src/or/transports.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2016, The Tor Project, Inc. */
+/* Copyright (c) 2011-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/transports.h b/src/or/transports.h
index 7de90dcbec..44a9626e50 100644
--- a/src/or/transports.h
+++ b/src/or/transports.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/test/Makefile.nmake b/src/test/Makefile.nmake
index 69a06eec4d..605f1a92c3 100644
--- a/src/test/Makefile.nmake
+++ b/src/test/Makefile.nmake
@@ -12,7 +12,7 @@ LIBS = ..\..\..\build-alpha\lib\libevent.lib \
crypt32.lib gdi32.lib user32.lib
TEST_OBJECTS = test.obj test_addr.obj test_channel.obj test_channeltls.obj \
- test_containers.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 \
diff --git a/src/test/bench.c b/src/test/bench.c
index 99bc686f30..a44dc94a61 100644
--- a/src/test/bench.c
+++ b/src/test/bench.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
extern const char tor_git_revision[];
@@ -28,6 +28,7 @@ const char tor_git_revision[] = "";
#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;
@@ -673,6 +674,28 @@ main(int argc, const char **argv)
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")) {
diff --git a/src/test/bt_test.py b/src/test/bt_test.py
index 30591453b9..4cb3326042 100755
--- a/src/test/bt_test.py
+++ b/src/test/bt_test.py
@@ -1,4 +1,4 @@
-# Copyright 2013-2015, The Tor Project, Inc
+# Copyright 2013-2017, The Tor Project, Inc
# See LICENSE for licensing information
"""
diff --git a/src/test/ed25519_exts_ref.py b/src/test/ed25519_exts_ref.py
index d5a3a79910..af5010415e 100644
--- a/src/test/ed25519_exts_ref.py
+++ b/src/test/ed25519_exts_ref.py
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright 2014-2015, The Tor Project, Inc
+# Copyright 2014-2017, The Tor Project, Inc
# See LICENSE for licensing information
"""
diff --git a/src/test/fakechans.h b/src/test/fakechans.h
index fa0e37dbe6..c0de430e3d 100644
--- a/src/test/fakechans.h
+++ b/src/test/fakechans.h
@@ -1,4 +1,4 @@
- /* Copyright (c) 2014-2016, The Tor Project, Inc. */
+ /* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_FAKECHANS_H
diff --git a/src/test/fuzz/dict/http b/src/test/fuzz/dict/http
index 1a7b61e8d4..3b0531579d 100644
--- a/src/test/fuzz/dict/http
+++ b/src/test/fuzz/dict/http
@@ -4,7 +4,7 @@
#
# Extracted from directory_handle_command() in the tor source code
#
-# Copyright (c) 2016, The Tor Project, Inc.
+# Copyright (c) 2016-2017, The Tor Project, Inc.
# See LICENSE for licensing information
#
# Usage:
diff --git a/src/test/fuzz/fuzz_consensus.c b/src/test/fuzz/fuzz_consensus.c
index f5d22f69ae..6610ade7ad 100644
--- a/src/test/fuzz/fuzz_consensus.c
+++ b/src/test/fuzz/fuzz_consensus.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ROUTERPARSE_PRIVATE
#include "or.h"
diff --git a/src/test/fuzz/fuzz_descriptor.c b/src/test/fuzz/fuzz_descriptor.c
index d19386d77f..1a50beae17 100644
--- a/src/test/fuzz/fuzz_descriptor.c
+++ b/src/test/fuzz/fuzz_descriptor.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ROUTERPARSE_PRIVATE
#include "or.h"
diff --git a/src/test/fuzz/fuzz_diff.c b/src/test/fuzz/fuzz_diff.c
new file mode 100644
index 0000000000..642380b512
--- /dev/null
+++ b/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/test/fuzz/fuzz_diff_apply.c b/src/test/fuzz/fuzz_diff_apply.c
new file mode 100644
index 0000000000..8d7bf751bf
--- /dev/null
+++ b/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/test/fuzz/fuzz_extrainfo.c b/src/test/fuzz/fuzz_extrainfo.c
index 6251e606d0..2a3de7ecf7 100644
--- a/src/test/fuzz/fuzz_extrainfo.c
+++ b/src/test/fuzz/fuzz_extrainfo.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ROUTERPARSE_PRIVATE
#include "or.h"
diff --git a/src/test/fuzz/fuzz_hsdescv2.c b/src/test/fuzz/fuzz_hsdescv2.c
index 53b7cbe2f7..19db265716 100644
--- a/src/test/fuzz/fuzz_hsdescv2.c
+++ b/src/test/fuzz/fuzz_hsdescv2.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ROUTERPARSE_PRIVATE
#include "or.h"
diff --git a/src/test/fuzz/fuzz_http.c b/src/test/fuzz/fuzz_http.c
index 01c3815f18..2ffeb60244 100644
--- a/src/test/fuzz/fuzz_http.c
+++ b/src/test/fuzz/fuzz_http.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -18,10 +18,10 @@
static void
mock_connection_write_to_buf_impl_(const char *string, size_t len,
- connection_t *conn, int zlib)
+ connection_t *conn, int compressed)
{
log_debug(LD_GENERAL, "%sResponse:\n%u\nConnection: %p\n%s\n",
- zlib ? "Compressed " : "", (unsigned)len, conn, string);
+ compressed ? "Compressed " : "", (unsigned)len, conn, string);
}
static int
diff --git a/src/test/fuzz/fuzz_iptsv2.c b/src/test/fuzz/fuzz_iptsv2.c
index 341d4880bd..4abde0c16d 100644
--- a/src/test/fuzz/fuzz_iptsv2.c
+++ b/src/test/fuzz/fuzz_iptsv2.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ROUTERPARSE_PRIVATE
#include "or.h"
diff --git a/src/test/fuzz/fuzz_microdesc.c b/src/test/fuzz/fuzz_microdesc.c
index bb89546191..396115026e 100644
--- a/src/test/fuzz/fuzz_microdesc.c
+++ b/src/test/fuzz/fuzz_microdesc.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ROUTERPARSE_PRIVATE
#include "or.h"
diff --git a/src/test/fuzz/fuzz_vrs.c b/src/test/fuzz/fuzz_vrs.c
index 9301a9bcc8..baf0610a0b 100644
--- a/src/test/fuzz/fuzz_vrs.c
+++ b/src/test/fuzz/fuzz_vrs.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ROUTERPARSE_PRIVATE
#define NETWORKSTATUS_PRIVATE
diff --git a/src/test/fuzz/fuzzing.h b/src/test/fuzz/fuzzing.h
index 4295743458..aecdbb4e52 100644
--- a/src/test/fuzz/fuzzing.h
+++ b/src/test/fuzz/fuzzing.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef FUZZING_H
#define FUZZING_H
diff --git a/src/test/fuzz/fuzzing_common.c b/src/test/fuzz/fuzzing_common.c
index e4920d3ee7..7aee92df63 100644
--- a/src/test/fuzz/fuzzing_common.c
+++ b/src/test/fuzz/fuzzing_common.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CRYPTO_ED25519_PRIVATE
#include "orconfig.h"
@@ -96,6 +96,7 @@ static void
global_init(void)
{
tor_threads_init();
+ tor_compress_init();
{
struct sipkey sipkey = { 1337, 7331 };
siphash_set_global_key(&sipkey);
diff --git a/src/test/fuzz/include.am b/src/test/fuzz/include.am
index 806710879b..500377f6d7 100644
--- a/src/test/fuzz/include.am
+++ b/src/test/fuzz/include.am
@@ -1,4 +1,5 @@
-
+# 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 = \
@@ -17,7 +18,9 @@ FUZZING_LIBS = \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \
@TOR_LIBEVENT_LIBS@ \
@TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
- @TOR_SYSTEMD_LIBS@
+ @TOR_SYSTEMD_LIBS@ \
+ @TOR_LZMA_LIBS@ \
+ @TOR_ZSTD_LIBS@
oss-fuzz-prereqs: \
src/or/libtor-testing.a \
@@ -32,6 +35,16 @@ oss-fuzz-prereqs: \
noinst_HEADERS += \
src/test/fuzz/fuzzing.h
+LIBFUZZER = /home/nickm/build/libfuzz/libFuzzer.a
+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
@@ -48,13 +61,29 @@ 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_http_SOURCES = \
+src_test_fuzz_fuzz_diff_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_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 \
@@ -64,6 +93,14 @@ 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_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_iptsv2_SOURCES = \
src/test/fuzz/fuzzing_common.c \
src/test/fuzz/fuzz_iptsv2.c
@@ -72,14 +109,6 @@ 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_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_microdesc_SOURCES = \
src/test/fuzz/fuzzing_common.c \
src/test/fuzz/fuzz_microdesc.c
@@ -99,19 +128,16 @@ 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-http \
src/test/fuzz/fuzz-hsdescv2 \
+ src/test/fuzz/fuzz-http \
src/test/fuzz/fuzz-iptsv2 \
src/test/fuzz/fuzz-microdesc \
src/test/fuzz/fuzz-vrs
-
-LIBFUZZER = /home/nickm/build/libfuzz/libFuzzer.a
-LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ
-LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS)
-LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG)
-LIBFUZZER_LIBS = $(FUZZING_LIBS) $(LIBFUZZER) -lstdc++
+# ===== libfuzzer
if LIBFUZZER_ENABLED
src_test_fuzz_lf_fuzz_consensus_SOURCES = \
@@ -128,6 +154,20 @@ 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)
@@ -135,13 +175,6 @@ 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_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_hsdescv2_SOURCES = \
$(src_test_fuzz_fuzz_hsdescv2_SOURCES)
src_test_fuzz_lf_fuzz_hsdescv2_CPPFLAGS = $(LIBFUZZER_CPPFLAGS)
@@ -149,6 +182,13 @@ 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_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_iptsv2_SOURCES = \
$(src_test_fuzz_fuzz_iptsv2_SOURCES)
src_test_fuzz_lf_fuzz_iptsv2_CPPFLAGS = $(LIBFUZZER_CPPFLAGS)
@@ -173,9 +213,11 @@ 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-http \
src/test/fuzz/lf-fuzz-hsdescv2 \
+ src/test/fuzz/lf-fuzz-http \
src/test/fuzz/lf-fuzz-iptsv2 \
src/test/fuzz/lf-fuzz-microdesc \
src/test/fuzz/lf-fuzz-vrs
@@ -184,10 +226,9 @@ else
LIBFUZZER_FUZZERS =
endif
-if OSS_FUZZ_ENABLED
-LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ
-LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS)
+# ===== 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)
@@ -198,21 +239,31 @@ src_test_fuzz_liboss_fuzz_descriptor_a_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_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_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_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_iptsv2_a_SOURCES = \
$(src_test_fuzz_fuzz_iptsv2_SOURCES)
src_test_fuzz_liboss_fuzz_iptsv2_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS)
@@ -231,12 +282,15 @@ 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-http.a \
src/test/fuzz/liboss-fuzz-hsdescv2.a \
+ src/test/fuzz/liboss-fuzz-http.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
diff --git a/src/test/fuzz_static_testcases.sh b/src/test/fuzz_static_testcases.sh
index bfe1677573..3cb45ad5e6 100755
--- a/src/test/fuzz_static_testcases.sh
+++ b/src/test/fuzz_static_testcases.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-# Copyright (c) 2016, The Tor Project, Inc.
+# Copyright (c) 2016-2017, The Tor Project, Inc.
# See LICENSE for licensing information
set -e
diff --git a/src/test/hs_ntor_ref.py b/src/test/hs_ntor_ref.py
new file mode 100644
index 0000000000..813e797828
--- /dev/null
+++ b/src/test/hs_ntor_ref.py
@@ -0,0 +1,408 @@
+#!/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
+
+try:
+ import sha3
+except ImportError:
+ # 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 = "tor-hs-ntor-curve25519-sha3-256-1"
+T_HSENC = PROTOID + ":hs_key_extract"
+T_HSVERIFY = PROTOID + ":hs_verify"
+T_HSMAC = PROTOID + ":hs_mac"
+M_HSEXPAND = PROTOID + ":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.SHA3256()
+ 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 = sha3.SHAKE256()
+ kdf.update(secret + T_HSENC + info)
+ key_material = kdf.squeeze(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 = sha3.SHAKE256()
+ kdf.update(secret + T_HSENC + info)
+ key_material = kdf.squeeze(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 + "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 + "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/test/include.am b/src/test/include.am
index bcc2b56c18..ee14d0651b 100644
--- a/src/test/include.am
+++ b/src/test/include.am
@@ -20,7 +20,7 @@ TESTSCRIPTS = \
src/test/test_switch_id.sh
if USEPYTHON
-TESTSCRIPTS += src/test/test_ntor.sh src/test/test_bt.sh
+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 \
@@ -83,14 +83,19 @@ src_test_test_SOURCES = \
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_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 \
@@ -130,6 +135,7 @@ src_test_test_SOURCES = \
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 \
@@ -175,7 +181,8 @@ 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 \
- @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@
+ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \
+ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@
src_test_test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
@TOR_LDFLAGS_libevent@
@@ -187,9 +194,10 @@ src_test_test_LDADD = src/or/libtor-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 \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
@TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
- @TOR_SYSTEMD_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)
@@ -210,9 +218,10 @@ 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 \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
@TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
- @TOR_SYSTEMD_LIBS@
+ @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@
src_test_test_workqueue_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
@TOR_LDFLAGS_libevent@
@@ -221,8 +230,10 @@ src_test_test_workqueue_LDADD = src/or/libtor-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 \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
- @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
+ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @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)
@@ -232,7 +243,8 @@ src_test_test_timers_LDADD = \
src/common/libor-event-testing.a \
src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
- @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
+ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
+ @TOR_LZMA_LIBS@
src_test_test_timers_LDFLAGS = $(src_test_test_LDFLAGS)
noinst_HEADERS+= \
@@ -250,20 +262,35 @@ noinst_HEADERS+= \
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 \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \
- @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
+ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @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 \
@TOR_LIB_MATH@ \
@TOR_LIB_WS32@ @TOR_LIB_GDI@
src_test_test_bt_cl_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
@@ -272,12 +299,13 @@ 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/fuzz_static_testcases.sh \
src/test/slownacl_curve25519.py \
src/test/zero_length_keys.sh \
src/test/test_keygen.sh \
src/test/test_zero_length_keys.sh \
- src/test/test_ntor.sh src/test/test_bt.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_switch_id.sh \
src/test/test_workqueue_cancel.sh \
diff --git a/src/test/log_test_helpers.c b/src/test/log_test_helpers.c
index c788a33c17..d5a39cfeee 100644
--- a/src/test/log_test_helpers.c
+++ b/src/test/log_test_helpers.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Tor Project, Inc. */
+/* Copyright (c) 2015-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define LOG_PRIVATE
#include "torlog.h"
diff --git a/src/test/log_test_helpers.h b/src/test/log_test_helpers.h
index 922c68b42f..f7798c0249 100644
--- a/src/test/log_test_helpers.h
+++ b/src/test/log_test_helpers.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
@@ -71,14 +71,14 @@ void mock_dump_saved_logs(void);
\
assert_log_predicate(mock_saved_log_has_message_containing(str) && \
mock_saved_log_n_entries() == 1, \
- "expected log to contain exactly 1 message: " # str); \
+ "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); \
+ "expected log to contain 1 message, containing " # str); \
} while (0);
#define expect_no_log_msg(str) \
diff --git a/src/test/ntor_ref.py b/src/test/ntor_ref.py
index df065853f3..c753588f97 100755
--- a/src/test/ntor_ref.py
+++ b/src/test/ntor_ref.py
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright 2012-2015, The Tor Project, Inc
+# Copyright 2012-2017, The Tor Project, Inc
# See LICENSE for licensing information
"""
diff --git a/src/test/rend_test_helpers.c b/src/test/rend_test_helpers.c
index 377337bcb9..f7880046fb 100644
--- a/src/test/rend_test_helpers.c
+++ b/src/test/rend_test_helpers.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/test/rend_test_helpers.h b/src/test/rend_test_helpers.h
index 180a4e8fde..486adba436 100644
--- a/src/test/rend_test_helpers.h
+++ b/src/test/rend_test_helpers.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/test/test-child.c b/src/test/test-child.c
index fdf3ccec0a..f0bdb3ea26 100644
--- a/src/test/test-child.c
+++ b/src/test/test-child.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2016, The Tor Project, Inc. */
+/* Copyright (c) 2011-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test-network.sh b/src/test/test-network.sh
index 4d9776822b..6e0f286573 100755
--- a/src/test/test-network.sh
+++ b/src/test/test-network.sh
@@ -1,103 +1,45 @@
-#! /bin/sh
+#!/bin/sh
-# Please do not modify this script, it has been moved to chutney/tools
+# This script calls the equivalent script in chutney/tools
-ECHO_N="/bin/echo -n"
+# 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)
-# We need to find CHUTNEY_PATH, so that we can call the version of this script
-# in chutney/tools. And we want to pass any arguments to that script as well.
-# So we source this script, which processes its arguments to find CHUTNEY_PATH.
-
-# Avoid recursively sourcing this script, and don't call the chutney version
-# while recursing, either
-if [ "$TEST_NETWORK_RECURSING" != true ]; then
- # Process the arguments into environmental variables with this script
- # to make sure $CHUTNEY_PATH is set
- # When we switch to using test-network.sh in chutney/tools, --dry-run
- # can be removed, because this script will find chutney, then pass all
- # arguments to chutney's test-network.sh
- echo "$myname: Parsing command-line arguments to find \$CHUTNEY_PATH"
- export TEST_NETWORK_RECURSING=true
- . "$0" --dry-run "$@"
-
- # Call the chutney version of this script, if it exists, and we can find it
- if [ -d "$CHUTNEY_PATH" -a -x "$CHUTNEY_PATH/tools/test-network.sh" ]; then
- unset NETWORK_DRY_RUN
- echo "$myname: Calling newer chutney script \
-$CHUTNEY_PATH/tools/test-network.sh"
- "$CHUTNEY_PATH/tools/test-network.sh" "$@"
- exit $?
- else
- echo "$myname: This script has moved to chutney/tools."
- echo "$myname: Please update your chutney using 'git pull'."
- # When we switch to using test-network.sh in chutney/tools, we should
- # exit with a very loud failure here
- echo "$myname: Falling back to the old tor version of the script."
- fi
-fi
+# 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)
- export CHUTNEY_PATH="$2"
+ CHUTNEY_PATH="$2"
shift
;;
--tor-path)
- export TOR_DIR="$2"
- shift
- ;;
- # When we switch to using test-network.sh in chutney/tools, only the
- # --chutney-path and --tor-path arguments need to be processed by this
- # script, everything else can be handled by chutney's test-network.sh
- --flavor|--flavour|--network-flavor|--network-flavour)
- export NETWORK_FLAVOUR="$2"
- shift
- ;;
- --delay|--sleep|--bootstrap-time|--time)
- export BOOTSTRAP_TIME="$2"
- shift
- ;;
- # Environmental variables used by chutney verify performance tests
- # Send this many bytes per client connection (10 KBytes)
- --data|--data-bytes|--data-byte|--bytes|--byte)
- export CHUTNEY_DATA_BYTES="$2"
+ TOR_DIR="$2"
shift
;;
- # Make this many connections per client (1)
- # Note: If you create 7 or more connections to a hidden service from
- # a single Tor 0.2.7 client, you'll likely get a verification failure due
- # to #15937. This is fixed in 0.2.8.
- --connections|--connection|--connection-count|--count)
- export CHUTNEY_CONNECTIONS="$2"
- shift
+ --quiet)
+ ECHO=true
;;
- # Make each client connect to each HS (0)
- # 0 means a single client connects to each HS
- # 1 means every client connects to every HS
- --hs-multi-client|--hs-multi-clients|--hs-client|--hs-clients)
- export CHUTNEY_HS_MULTI_CLIENT="$2"
- shift
- ;;
- --coverage)
- export USE_COVERAGE_BINARY=true
- ;;
- --dry-run)
- # process arguments, but don't call any other scripts
- export NETWORK_DRY_RUN=true
- ;;
*)
- echo "$myname: Sorry, I don't know what to do with '$1'."
- echo "$myname: Maybe chutney's test-network.sh understands '$1'."
- echo "$myname: Please update your chutney using 'git pull', and set \
-\$CHUTNEY_PATH"
- # continue processing arguments during a dry run
- if [ "$NETWORK_DRY_RUN" != true ]; then
- exit 2
- fi
+ # maybe chutney's test-network.sh can handle it
;;
esac
shift
@@ -106,22 +48,22 @@ 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 ro $BUILDDIR, or
+# - 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"
- export TOR_DIR="$BUILDDIR"
+ $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"
- export TOR_DIR="$PWD"
+ $ECHO "$myname: \$TOR_DIR not set, trying \$PWD"
+ TOR_DIR="$PWD"
else
- echo "$myname: no \$TOR_DIR, chutney will use \$PATH for tor binaries"
+ $ECHO "$myname: no \$TOR_DIR, chutney will use \$PATH for tor binaries"
unset TOR_DIR
fi
fi
@@ -133,63 +75,34 @@ fi
# - 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"
- export CHUTNEY_PATH="$PWD"
+ $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"
- export CHUTNEY_PATH="$TOR_DIR/../chutney"
+ $ECHO "$myname: \$CHUTNEY_PATH not valid, trying \$TOR_DIR/../chutney"
+ CHUTNEY_PATH="$TOR_DIR/../chutney"
else
- # TODO: work out how to package and install chutney,
- # so users can find it in $PATH
- echo "$myname: missing 'chutney' in \$CHUTNEY_PATH ($CHUTNEY_PATH)"
- echo "$myname: Get chutney: git clone https://git.torproject.org/\
+ $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 \
+ $ECHO "$myname: Set \$CHUTNEY_PATH to a non-standard location: export \
CHUTNEY_PATH=\`pwd\`/chutney"
unset CHUTNEY_PATH
exit 1
fi
fi
-# When we switch to using test-network.sh in chutney/tools, this comment and
-# everything below it can be removed
-
-# For picking up the right tor binaries.
-# If these varibles aren't set, chutney looks for tor binaries in $PATH
-if [ -d "$TOR_DIR" ]; then
- tor_name=tor
- tor_gencert_name=tor-gencert
- if [ "$USE_COVERAGE_BINARY" = true ]; then
- tor_name=tor-cov
- fi
- export CHUTNEY_TOR="${TOR_DIR}/src/or/${tor_name}"
- export CHUTNEY_TOR_GENCERT="${TOR_DIR}/src/tools/${tor_gencert_name}"
-fi
-
-# Set the variables for the chutney network flavour
-export NETWORK_FLAVOUR=${NETWORK_FLAVOUR:-"bridges+hs"}
-export CHUTNEY_NETWORK=networks/$NETWORK_FLAVOUR
-
-# And finish up if we're doing a dry run
-if [ "$NETWORK_DRY_RUN" = true ]; then
- # we can't exit here, it breaks argument processing
- return
+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
-
-cd "$CHUTNEY_PATH"
-./tools/bootstrap-network.sh $NETWORK_FLAVOUR || exit 2
-
-# Sleep some, waiting for the network to bootstrap.
-# TODO: Add chutney command 'bootstrap-status' and use that instead.
-BOOTSTRAP_TIME=${BOOTSTRAP_TIME:-35}
-$ECHO_N "$myname: sleeping for $BOOTSTRAP_TIME seconds"
-n=$BOOTSTRAP_TIME; while [ $n -gt 0 ]; do
- sleep 1; n=$(expr $n - 1); $ECHO_N .
-done; echo ""
-./chutney verify $CHUTNEY_NETWORK
-VERIFY_EXIT_STATUS=$?
-# work around a bug/feature in make -j2 (or more)
-# where make hangs if any child processes are still alive
-./chutney stop $CHUTNEY_NETWORK
-exit $VERIFY_EXIT_STATUS
diff --git a/src/test/test-timers.c b/src/test/test-timers.c
index b5fcade7f8..99715f4333 100644
--- a/src/test/test-timers.c
+++ b/src/test/test-timers.c
@@ -1,4 +1,4 @@
-/* Copyright 2016, The Tor Project, Inc. */
+/* Copyright 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test.c b/src/test/test.c
index 9a78859ef2..30944d805d 100644
--- a/src/test/test.c
+++ b/src/test/test.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -44,13 +44,13 @@ double fabs(double x);
#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 "torgzip.h"
#include "main.h"
#include "memarea.h"
#include "onion.h"
@@ -1189,16 +1189,21 @@ struct testgroup_t testgroups[] = {
{ "channelpadding/", channelpadding_tests },
{ "channeltls/", channeltls_tests },
{ "checkdir/", checkdir_tests },
+ { "circuitbuild/", circuitbuild_tests },
{ "circuitlist/", circuitlist_tests },
{ "circuitmux/", circuitmux_tests },
{ "circuituse/", circuituse_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 },
@@ -1233,6 +1238,7 @@ struct testgroup_t testgroups[] = {
{ "socks/", socks_tests },
{ "shared-random/", sr_tests },
{ "status/" , status_tests },
+ { "storagedir/", storagedir_tests },
{ "tortls/", tortls_tests },
{ "util/", util_tests },
{ "util/format/", util_format_tests },
diff --git a/src/test/test.h b/src/test/test.h
index 1f12a9d6c2..0ba91fb3f6 100644
--- a/src/test/test.h
+++ b/src/test/test.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2003, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_TEST_H
@@ -184,16 +184,21 @@ 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 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[];
@@ -228,6 +233,7 @@ 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[];
diff --git a/src/test/test_addr.c b/src/test/test_addr.c
index 49e248014f..b6d2445bad 100644
--- a/src/test/test_addr.c
+++ b/src/test/test_addr.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ADDRESSMAP_PRIVATE
diff --git a/src/test/test_address.c b/src/test/test_address.c
index 0d142ad483..50a0574522 100644
--- a/src/test/test_address.c
+++ b/src/test/test_address.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ADDRESS_PRIVATE
diff --git a/src/test/test_bt_cl.c b/src/test/test_bt_cl.c
index 709d599f52..ed588ecc5b 100644
--- a/src/test/test_bt_cl.c
+++ b/src/test/test_bt_cl.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_buffers.c b/src/test/test_buffers.c
index 9e7bdb8911..07114a8571 100644
--- a/src/test/test_buffers.c
+++ b/src/test/test_buffers.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define BUFFERS_PRIVATE
@@ -578,120 +578,150 @@ test_buffer_time_tracking(void *arg)
}
static void
-test_buffers_zlib_impl(int finalize_with_nil)
+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_zlib_state_t *zlib_state = NULL;
+ tor_compress_state_t *compress_state = NULL;
size_t out_len, in_len;
- int done;
+ size_t sz, headerjunk;
buf = buf_new_with_capacity(128); /* will round up */
- zlib_state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION);
+ sz = buf_get_default_chunk_size(buf);
+ msg = tor_malloc_zero(sz);
- msg = tor_malloc(512);
- crypto_rand(msg, 512);
- tt_int_op(write_to_buf_zlib(buf, zlib_state, msg, 128, 0), OP_EQ, 0);
- tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+128, 128, 0), OP_EQ, 0);
- tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+256, 256, 0), OP_EQ, 0);
- done = !finalize_with_nil;
- tt_int_op(write_to_buf_zlib(buf, zlib_state, "all done", 9, done), OP_EQ, 0);
- if (finalize_with_nil) {
- tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), OP_EQ, 0);
- }
+ write_to_buf(msg, 1, buf);
+ 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;
+ write_to_buf(msg, headerjunk-1, buf);
+ 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(write_to_buf_compress(buf, compress_state, "", 0, 1), OP_EQ, 0);
in_len = buf_datalen(buf);
contents = tor_malloc(in_len);
tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0);
- tt_int_op(0, OP_EQ, tor_gzip_uncompress(&expanded, &out_len,
- contents, in_len,
- ZLIB_METHOD, 1,
- LOG_WARN));
+ if (method == NO_METHOD) {
+ tt_uint_op(in_len, OP_EQ, headerjunk);
+ } else {
+ tt_uint_op(in_len, OP_GT, headerjunk);
+ }
- 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);
+ 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_zlib_free(zlib_state);
+ tor_compress_free(compress_state);
tor_free(contents);
tor_free(expanded);
tor_free(msg);
}
static void
-test_buffers_zlib(void *arg)
-{
- (void) arg;
- test_buffers_zlib_impl(0);
-}
-static void
-test_buffers_zlib_fin_with_nil(void *arg)
-{
- (void) arg;
- test_buffers_zlib_impl(1);
-}
-
-static void
-test_buffers_zlib_fin_at_chunk_end(void *arg)
+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_zlib_state_t *zlib_state = NULL;
+ tor_compress_state_t *compress_state = NULL;
size_t out_len, in_len;
- size_t sz, headerjunk;
- (void) arg;
+ int done;
buf = buf_new_with_capacity(128); /* will round up */
- sz = buf_get_default_chunk_size(buf);
- msg = tor_malloc_zero(sz);
-
- write_to_buf(msg, 1, buf);
- tt_assert(buf->head);
+ compress_state = tor_compress_new(1, method, level);
- /* Fill up the chunk so the zlib stuff won't fit in one chunk. */
- tt_uint_op(buf->head->memlen, OP_LT, sz);
- headerjunk = buf->head->memlen - 7;
- write_to_buf(msg, headerjunk-1, buf);
- 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. */
- zlib_state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION);
- tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), OP_EQ, 0);
+ msg = tor_malloc(512);
+ crypto_rand(msg, 512);
+ tt_int_op(write_to_buf_compress(buf, compress_state,
+ msg, 128, 0), OP_EQ, 0);
+ tt_int_op(write_to_buf_compress(buf, compress_state,
+ msg+128, 128, 0), OP_EQ, 0);
+ tt_int_op(write_to_buf_compress(buf, compress_state,
+ msg+256, 256, 0), OP_EQ, 0);
+ done = !finalize_with_nil;
+ tt_int_op(write_to_buf_compress(buf, compress_state,
+ "all done", 9, done), OP_EQ, 0);
+ if (finalize_with_nil) {
+ tt_int_op(write_to_buf_compress(buf, compress_state, "", 0, 1), OP_EQ, 0);
+ }
in_len = buf_datalen(buf);
contents = tor_malloc(in_len);
tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0);
- tt_uint_op(in_len, OP_GT, headerjunk);
-
- tt_int_op(0, OP_EQ, tor_gzip_uncompress(&expanded, &out_len,
- contents + headerjunk, in_len - headerjunk,
- ZLIB_METHOD, 1,
- LOG_WARN));
+ tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len,
+ contents, in_len,
+ method, 1,
+ LOG_WARN));
- tt_int_op(out_len, OP_EQ, 0);
- tt_assert(expanded);
+ 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_zlib_free(zlib_state);
+ 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];
@@ -816,14 +846,22 @@ struct testcase_t buffer_tests[] = {
{ "allocation_tracking", test_buffer_allocation_tracking, TT_FORK,
NULL, NULL },
{ "time_tracking", test_buffer_time_tracking, TT_FORK, NULL, NULL },
- { "zlib", test_buffers_zlib, TT_FORK, NULL, NULL },
- { "zlib_fin_with_nil", test_buffers_zlib_fin_with_nil, TT_FORK, NULL, NULL },
- { "zlib_fin_at_chunk_end", test_buffers_zlib_fin_at_chunk_end, 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/test/test_cell_formats.c b/src/test/test_cell_formats.c
index 22c34b6d6c..007f7e3d3e 100644
--- a/src/test/test_cell_formats.c
+++ b/src/test/test_cell_formats.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_cell_queue.c b/src/test/test_cell_queue.c
index 93ac9854d8..69e89b69b0 100644
--- a/src/test/test_cell_queue.c
+++ b/src/test/test_cell_queue.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CIRCUITLIST_PRIVATE
diff --git a/src/test/test_channel.c b/src/test/test_channel.c
index 862bd6dfa6..f5999b8e67 100644
--- a/src/test/test_channel.c
+++ b/src/test/test_channel.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define TOR_CHANNEL_INTERNAL_
diff --git a/src/test/test_channeltls.c b/src/test/test_channeltls.c
index fd98ee40fb..96c5eba9a5 100644
--- a/src/test/test_channeltls.c
+++ b/src/test/test_channeltls.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_checkdir.c b/src/test/test_checkdir.c
index fbb33f87f6..38f3360b61 100644
--- a/src/test/test_checkdir.c
+++ b/src/test/test_checkdir.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_circuitbuild.c b/src/test/test_circuitbuild.c
new file mode 100644
index 0000000000..a5282df69d
--- /dev/null
+++ b/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/test/test_circuitlist.c b/src/test/test_circuitlist.c
index 7eed5fe225..344ab27921 100644
--- a/src/test/test_circuitlist.c
+++ b/src/test/test_circuitlist.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define TOR_CHANNEL_INTERNAL_
@@ -201,68 +201,68 @@ test_rend_token_maps(void *arg)
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(tok1));
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok1));
+ 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(c1, tok1);
- hs_circuitmap_register_intro_circ_v2(c2, tok2);
+ 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(tok3));
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3));
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok2));
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok1));
+ 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(tok1));
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2));
+ 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(tok1));
- tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2));
+ 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(c3, tok2);
- tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2));
- tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ(tok2));
+ 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(tok1));
+ 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(tok2));
+ 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(tok2));
+ 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(c3, tok3);
+ hs_circuitmap_register_intro_circ_v2_relay_side(c3, tok3);
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok2));
- tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_intro_circ_v2(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(c4, tok3);
+ hs_circuitmap_register_intro_circ_v2_relay_side(c4, tok3);
- tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3));
+ tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3));
- tt_ptr_op(c3->hs_token, OP_EQ, NULL);
- tt_ptr_op(c4->hs_token, OP_NE, NULL);
- tt_mem_op(c4->hs_token->token, OP_EQ, tok3, REND_TOKEN_LEN);
+ 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(c4);
- tt_ptr_op(c4->hs_token, OP_EQ, NULL);
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3));
+ 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));
done:
if (c1)
@@ -370,10 +370,89 @@ test_pick_circid(void *arg)
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/test/test_circuitmux.c b/src/test/test_circuitmux.c
index 9e8fb54964..779783299d 100644
--- a/src/test/test_circuitmux.c
+++ b/src/test/test_circuitmux.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define TOR_CHANNEL_INTERNAL_
diff --git a/src/test/test_circuituse.c b/src/test/test_circuituse.c
index 27a87660ff..5cc9fe571e 100644
--- a/src/test/test_circuituse.c
+++ b/src/test/test_circuituse.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CIRCUITLIST_PRIVATE
diff --git a/src/test/test_compat_libevent.c b/src/test/test_compat_libevent.c
index 0443cc0b1c..7dd8e65194 100644
--- a/src/test/test_compat_libevent.c
+++ b/src/test/test_compat_libevent.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2016, The Tor Project, Inc. */
+/* Copyright (c) 2010-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define COMPAT_LIBEVENT_PRIVATE
diff --git a/src/test/test_config.c b/src/test/test_config.c
index 3b19cad036..f0874e0e0b 100644
--- a/src/test/test_config.c
+++ b/src/test/test_config.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_connection.c b/src/test/test_connection.c
index 5cda4f3175..7e5193b203 100644
--- a/src/test/test_connection.c
+++ b/src/test/test_connection.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Tor Project, Inc. */
+/* Copyright (c) 2015-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -265,7 +265,7 @@ test_conn_get_rend_setup(const struct testcase_t *tc)
rend_cache_init();
- /* TODO: use directory_initiate_command_rend() to do this - maybe? */
+ /* 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);
diff --git a/src/test/test_conscache.c b/src/test/test_conscache.c
new file mode 100644
index 0000000000..aee1ba8a06
--- /dev/null
+++ b/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 <utime.h>
+#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()->DataDirectory);
+ get_options_mutable()->DataDirectory = 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()->DataDirectory);
+ get_options_mutable()->DataDirectory = 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_assert(e_tmp == 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_assert(e_tmp == NULL); // so deleted.
+ e_tmp = consensus_cache_find_first(cache, "index", "14"); // refcnt == 2
+ tt_assert(e_tmp == 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()->DataDirectory);
+ get_options_mutable()->DataDirectory = 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/test/test_consdiff.c b/src/test/test_consdiff.c
new file mode 100644
index 0000000000..23948d6860
--- /dev/null
+++ b/src/test/test_consdiff.c
@@ -0,0 +1,1184 @@
+/* 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;
+
+ /* Create a regular smartlist. */
+ (void)arg;
+ smartlist_add(sl, (void*)1);
+ smartlist_add(sl, (void*)2);
+ smartlist_add(sl, (void*)3);
+ smartlist_add(sl, (void*)4);
+ smartlist_add(sl, (void*)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((void*)3, OP_EQ, smartlist_get(sls->list, sls->offset));
+ tt_ptr_op((void*)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((void*)3, OP_EQ, smartlist_get(sls->list, sls->offset));
+ tt_ptr_op((void*)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(-1, OP_EQ, strcmp("/foo", "Afoo"));
+ tt_int_op(1, OP_EQ, base64cmp_wrapper("/foo", "Afoo"));
+ tt_int_op(1, OP_EQ, strcmp("Afoo", "0foo"));
+ tt_int_op(-1, OP_EQ, base64cmp_wrapper("Afoo", "0foo"));
+
+ /* Comparisons that would return the same as with strcmp(). */
+ tt_int_op(1, OP_EQ, strcmp("afoo", "Afoo"));
+ tt_int_op(1, OP_EQ, base64cmp_wrapper("afoo", "Afoo"));
+
+ /* Different lengths */
+ tt_int_op(-1, OP_EQ, base64cmp_wrapper("afoo", "afooo"));
+ tt_int_op(1, OP_EQ, base64cmp_wrapper("afooo", "afoo"));
+
+ 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
+
+ /* 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/test/test_consdiffmgr.c b/src/test/test_consdiffmgr.c
new file mode 100644
index 0000000000..9d0c5b5b71
--- /dev/null
+++ b/src/test/test_consdiffmgr.c
@@ -0,0 +1,891 @@
+/* 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()->DataDirectory);
+ get_options_mutable()->DataDirectory = ddir_fname; // now owns the pointer.
+ check_private_dir(ddir_fname, CPD_CREATE, NULL);
+
+ consdiff_cfg_t consdiff_cfg = { 7200, 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(enum workqueue_reply_t (*fn)(void *, void *),
+ void (*reply_fn)(void *),
+ void *arg)
+{
+ 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()->DataDirectory);
+ get_options_mutable()->DataDirectory = 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
+
+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_assert(NULL == cdm_cache_lookup_consensus(FLAV_MICRODESC, now-60));
+ tt_assert(NULL == cdm_cache_lookup_consensus(FLAV_NS, now-61));
+
+ 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 */
+ tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[3], md_ns[3]));
+ tt_int_op(2 * n_diff_compression_methods(), 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/test/test_containers.c b/src/test/test_containers.c
index 41f3f873de..54484a2a91 100644
--- a/src/test/test_containers.c
+++ b/src/test/test_containers.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_controller.c b/src/test/test_controller.c
index 206315e289..592f91a988 100644
--- a/src/test/test_controller.c
+++ b/src/test/test_controller.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Tor Project, Inc. */
+/* Copyright (c) 2015-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CONTROL_PRIVATE
diff --git a/src/test/test_controller_events.c b/src/test/test_controller_events.c
index 11e1e3dc8f..901ad7ab3d 100644
--- a/src/test/test_controller_events.c
+++ b/src/test/test_controller_events.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CONNECTION_PRIVATE
diff --git a/src/test/test_crypto.c b/src/test/test_crypto.c
index d66ddccd4f..ec9d4e2709 100644
--- a/src/test/test_crypto.c
+++ b/src/test/test_crypto.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -15,9 +15,6 @@
#include "crypto_ed25519.h"
#include "ed25519_vectors.inc"
-#include <openssl/evp.h>
-#include <openssl/rand.h>
-
/** Run unit tests for Diffie-Hellman functionality. */
static void
test_crypto_dh(void *arg)
@@ -331,38 +328,6 @@ test_crypto_rng_strongest(void *arg)
#undef N
}
-/* 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, ==, 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, ==, crypto_force_rand_ssleay());
-#else
- tt_assert(RAND_get_rand_method() == &dummy_method);
- tt_int_op(1, ==, crypto_force_rand_ssleay());
-#endif
- 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:
- ;
-}
-
/** Run unit tests for our AES128 functionality */
static void
test_crypto_aes128(void *arg)
@@ -1477,28 +1442,6 @@ test_crypto_digest_names(void *arg)
;
}
-#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;
-}
-
/** Run unit tests for misc crypto formatting functionality (base64, base32,
* fingerprints, etc) */
static void
@@ -1527,7 +1470,7 @@ test_crypto_formats(void *arg)
tt_int_op(i, OP_GE, 0);
tt_int_op(i, OP_EQ, strlen(data2));
tt_assert(! strchr(data2, '='));
- j = base64_decode_nopad((uint8_t*)data3, 1024, data2, i);
+ j = base64_decode(data3, 1024, data2, i);
tt_int_op(j, OP_EQ, idx);
tt_mem_op(data3,OP_EQ, data1, idx);
}
@@ -1554,20 +1497,6 @@ test_crypto_formats(void *arg)
tt_assert(digest_from_base64(data3, "###") < 0);
- 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));
- }
-
/* Encoding SHA256 */
crypto_rand(data2, DIGEST256_LEN);
memset(data2, 100, 1024);
@@ -2941,7 +2870,6 @@ struct testcase_t crypto_tests[] = {
CRYPTO_LEGACY(formats),
CRYPTO_LEGACY(rng),
{ "rng_range", test_crypto_rng_range, 0, NULL, NULL },
- { "rng_engine", test_crypto_rng_engine, TT_FORK, 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" },
diff --git a/src/test/test_crypto_openssl.c b/src/test/test_crypto_openssl.c
new file mode 100644
index 0000000000..3d7d2b4639
--- /dev/null
+++ b/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 <openssl/evp.h>
+#include <openssl/rand.h>
+#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, ==, 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, ==, crypto_force_rand_ssleay());
+#else
+ tt_assert(RAND_get_rand_method() == &dummy_method);
+ tt_int_op(1, ==, crypto_force_rand_ssleay());
+#endif
+ 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/test/test_crypto_slow.c b/src/test/test_crypto_slow.c
index 0d7d65ac73..d6b0a43dd5 100644
--- a/src/test/test_crypto_slow.c
+++ b/src/test/test_crypto_slow.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -12,11 +12,8 @@
#if defined(HAVE_LIBSCRYPT_H) && defined(HAVE_LIBSCRYPT_SCRYPT)
#define HAVE_LIBSCRYPT
-#include <libscrypt.h>
#endif
-#include <openssl/evp.h>
-
/** Run unit tests for our secret-to-key passphrase hashing functionality. */
static void
test_crypto_s2k_rfc2440(void *arg)
diff --git a/src/test/test_data.c b/src/test/test_data.c
index 788489a097..ce6c3394f6 100644
--- a/src/test/test_data.c
+++ b/src/test/test_data.c
@@ -1,6 +1,6 @@
/* Copyright 2001-2004 Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "test.h"
diff --git a/src/test/test_dir.c b/src/test/test_dir.c
index 4e5876fa3c..a9d9cba7df 100644
--- a/src/test/test_dir.c
+++ b/src/test/test_dir.c
@@ -1,12 +1,13 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
#include <math.h>
#define CONFIG_PRIVATE
+#define CONTROL_PRIVATE
#define DIRSERV_PRIVATE
#define DIRVOTE_PRIVATE
#define ROUTER_PRIVATE
@@ -19,6 +20,7 @@
#include "or.h"
#include "confparse.h"
#include "config.h"
+#include "control.h"
#include "crypto_ed25519.h"
#include "directory.h"
#include "dirserv.h"
@@ -329,7 +331,7 @@ test_dir_formats(void *arg)
ntor_cc = make_ntor_onion_key_crosscert(&r2_onion_keypair,
&kp1.pubkey,
r2->cache_info.published_on,
- MIN_ONION_KEY_LIFETIME,
+ get_onion_key_lifetime(),
&ntor_cc_sign);
tt_assert(ntor_cc);
base64_encode(cert_buf, sizeof(cert_buf),
@@ -910,6 +912,23 @@ mock_get_by_ei_desc_digest(const char *d)
}
}
+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)
@@ -999,6 +1018,37 @@ test_dir_load_extrainfo(void *arg)
}
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;
@@ -1065,6 +1115,7 @@ test_dir_versions(void *arg)
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);
@@ -1079,6 +1130,60 @@ test_dir_versions(void *arg)
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, \
@@ -1098,6 +1203,7 @@ test_dir_versions(void *arg)
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");
@@ -1136,6 +1242,70 @@ test_dir_versions(void *arg)
"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));
@@ -1145,11 +1315,24 @@ test_dir_versions(void *arg)
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. */
@@ -4399,15 +4582,7 @@ test_dir_should_use_directory_guards(void *data)
}
NS_DECL(void,
-directory_initiate_command_routerstatus, (const routerstatus_t *status,
- uint8_t dir_purpose,
- uint8_t router_purpose,
- dir_indirection_t indirection,
- const char *resource,
- const char *payload,
- size_t payload_len,
- time_t if_modified_since,
- circuit_guard_state_t *guardstate));
+directory_initiate_request, (directory_request_t *req));
static void
test_dir_should_not_init_request_to_ourselves(void *data)
@@ -4417,7 +4592,7 @@ test_dir_should_not_init_request_to_ourselves(void *data)
crypto_pk_t *key = pk_generate(2);
(void) data;
- NS_MOCK(directory_initiate_command_routerstatus);
+ NS_MOCK(directory_initiate_request);
clear_dir_servers();
routerlist_free_all();
@@ -4432,15 +4607,15 @@ test_dir_should_not_init_request_to_ourselves(void *data)
dir_server_add(ourself);
directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL);
- tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 0);
+ 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_command_routerstatus), OP_EQ, 0);
+ tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0);
done:
- NS_UNMOCK(directory_initiate_command_routerstatus);
+ NS_UNMOCK(directory_initiate_request);
clear_dir_servers();
routerlist_free_all();
crypto_pk_free(key);
@@ -4454,7 +4629,7 @@ test_dir_should_not_init_request_to_dir_auths_without_v3_info(void *data)
| MICRODESC_DIRINFO;
(void) data;
- NS_MOCK(directory_initiate_command_routerstatus);
+ NS_MOCK(directory_initiate_request);
clear_dir_servers();
routerlist_free_all();
@@ -4465,14 +4640,14 @@ test_dir_should_not_init_request_to_dir_auths_without_v3_info(void *data)
dir_server_add(ds);
directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL);
- tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 0);
+ 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_command_routerstatus), OP_EQ, 0);
+ tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0);
done:
- NS_UNMOCK(directory_initiate_command_routerstatus);
+ NS_UNMOCK(directory_initiate_request);
clear_dir_servers();
routerlist_free_all();
}
@@ -4483,7 +4658,7 @@ test_dir_should_init_request_to_dir_auths(void *data)
dir_server_t *ds = NULL;
(void) data;
- NS_MOCK(directory_initiate_command_routerstatus);
+ NS_MOCK(directory_initiate_request);
clear_dir_servers();
routerlist_free_all();
@@ -4494,39 +4669,23 @@ test_dir_should_init_request_to_dir_auths(void *data)
dir_server_add(ds);
directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL);
- tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 1);
+ 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_command_routerstatus), OP_EQ, 2);
+ tt_int_op(CALLED(directory_initiate_request), OP_EQ, 2);
done:
- NS_UNMOCK(directory_initiate_command_routerstatus);
+ NS_UNMOCK(directory_initiate_request);
clear_dir_servers();
routerlist_free_all();
}
void
-NS(directory_initiate_command_routerstatus)(const routerstatus_t *status,
- uint8_t dir_purpose,
- uint8_t router_purpose,
- dir_indirection_t indirection,
- const char *resource,
- const char *payload,
- size_t payload_len,
- time_t if_modified_since,
- circuit_guard_state_t *guardstate)
+NS(directory_initiate_request)(directory_request_t *req)
{
- (void)status;
- (void)dir_purpose;
- (void)router_purpose;
- (void)indirection;
- (void)resource;
- (void)payload;
- (void)payload_len;
- (void)if_modified_since;
- (void)guardstate;
- CALLED(directory_initiate_command_routerstatus)++;
+ (void)req;
+ CALLED(directory_initiate_request)++;
}
static void
@@ -5837,6 +5996,7 @@ struct testcase_t dir_tests[] = {
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),
diff --git a/src/test/test_dir_common.c b/src/test/test_dir_common.c
index ca43dd4c04..fca70249bd 100644
--- a/src/test/test_dir_common.c
+++ b/src/test/test_dir_common.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_dir_common.h b/src/test/test_dir_common.h
index 9682b0db49..65b9cf6436 100644
--- a/src/test/test_dir_common.h
+++ b/src/test/test_dir_common.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/test/test_dir_handle_get.c b/src/test/test_dir_handle_get.c
index a0868f9253..c98938b2db 100644
--- a/src/test/test_dir_handle_get.c
+++ b/src/test/test_dir_handle_get.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define RENDCOMMON_PRIVATE
@@ -14,6 +14,7 @@
#include "connection.h"
#include "directory.h"
#include "test.h"
+#include "compress.h"
#include "connection.h"
#include "rendcommon.h"
#include "rendcache.h"
@@ -28,7 +29,6 @@
#include "networkstatus.h"
#include "geoip.h"
#include "dirserv.h"
-#include "torgzip.h"
#include "dirvote.h"
#include "log_test_helpers.h"
@@ -743,7 +743,7 @@ test_dir_handle_get_server_descriptors_not_found(void* data)
NULL, NULL, 1, 0);
tt_str_op(NOT_FOUND, OP_EQ, header);
- tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_SERVER_BY_FP);
+ tt_ptr_op(conn->spool, OP_EQ, NULL);
done:
UNMOCK(connection_write_to_buf_impl_);
@@ -773,6 +773,7 @@ test_dir_handle_get_server_descriptors_all(void* data)
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;
@@ -787,7 +788,7 @@ test_dir_handle_get_server_descriptors_all(void* data)
//which is smaller than that by annotation_len bytes
fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE,
&body, &body_used,
- mock_routerinfo->cache_info.signed_descriptor_len+1, 0);
+ 1024*1024, 0);
tt_assert(header);
tt_assert(body);
@@ -803,7 +804,7 @@ test_dir_handle_get_server_descriptors_all(void* data)
tt_str_op(body, OP_EQ, mock_routerinfo->cache_info.signed_descriptor_body +
mock_routerinfo->cache_info.annotations_len);
- tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE);
+ tt_ptr_op(conn->spool, OP_EQ, NULL);
done:
NS_UNMOCK(router_get_my_routerinfo);
@@ -882,6 +883,7 @@ test_dir_handle_get_server_descriptors_authority(void* data)
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();
@@ -904,7 +906,7 @@ test_dir_handle_get_server_descriptors_authority(void* data)
tt_int_op(body_used, OP_EQ, strlen(body));
tt_str_op(body, OP_EQ, TEST_DESCRIPTOR + annotation_len);
- tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE);
+ tt_ptr_op(conn->spool, OP_EQ, NULL);
done:
NS_UNMOCK(router_get_my_routerinfo);
@@ -946,6 +948,7 @@ test_dir_handle_get_server_descriptors_fp(void* data)
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();
@@ -975,7 +978,7 @@ test_dir_handle_get_server_descriptors_fp(void* data)
tt_int_op(body_used, OP_EQ, strlen(body));
tt_str_op(body, OP_EQ, TEST_DESCRIPTOR + annotation_len);
- tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE);
+ tt_ptr_op(conn->spool, OP_EQ, NULL);
done:
NS_UNMOCK(router_get_my_routerinfo);
@@ -1041,7 +1044,7 @@ test_dir_handle_get_server_descriptors_d(void* data)
tt_str_op(body, OP_EQ, router->cache_info.signed_descriptor_body +
router->cache_info.annotations_len);
- tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE);
+ tt_ptr_op(conn->spool, OP_EQ, NULL);
done:
UNMOCK(connection_write_to_buf_impl_);
@@ -1096,7 +1099,7 @@ test_dir_handle_get_server_descriptors_busy(void* data)
tt_assert(header);
tt_str_op(SERVER_BUSY, OP_EQ, header);
- tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE);
+ tt_ptr_op(conn->spool, OP_EQ, NULL);
done:
UNMOCK(get_options);
@@ -1770,10 +1773,14 @@ status_vote_current_consensus_ns_test(char **header, char **body,
size_t *body_len)
{
common_digests_t digests;
+ uint8_t sha3[DIGEST256_LEN];
dir_connection_t *conn = NULL;
#define NETWORK_STATUS "some network status string"
+ memset(&digests, 0x60, sizeof(digests));
+ memset(sha3, 0x06, sizeof(sha3));
dirserv_set_cached_consensus_networkstatus(NETWORK_STATUS, "ns", &digests,
+ sha3,
time(NULL));
MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock);
@@ -1829,8 +1836,8 @@ test_dir_handle_get_status_vote_current_consensus_ns(void* data)
comp_body_used);
tt_int_op(ZLIB_METHOD, OP_EQ, compression);
- tor_gzip_uncompress(&body, &body_used, comp_body, comp_body_used,
- compression, 0, LOG_PROTOCOL_WARN);
+ 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);
@@ -2494,6 +2501,53 @@ test_dir_handle_get_status_vote_current_authority(void* data)
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 }
@@ -2552,6 +2606,7 @@ struct testcase_t dir_handle_get_tests[] = {
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/test/test_entryconn.c b/src/test/test_entryconn.c
index 50848cfec2..12a631630b 100644
--- a/src/test/test_entryconn.c
+++ b/src/test/test_entryconn.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_entrynodes.c b/src/test/test_entrynodes.c
index 249fd1f973..3db7e63ee3 100644
--- a/src/test/test_entrynodes.c
+++ b/src/test/test_entrynodes.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -584,6 +584,9 @@ test_entry_guard_parse_from_state_full(void *arg)
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;
diff --git a/src/test/test_extorport.c b/src/test/test_extorport.c
index 1f92780177..fc9f27a5ac 100644
--- a/src/test/test_extorport.c
+++ b/src/test/test_extorport.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CONNECTION_PRIVATE
@@ -72,9 +72,9 @@ test_ext_or_id_map(void *arg)
* writes to outbuf. */
static void
connection_write_to_buf_impl_replacement(const char *string, size_t len,
- connection_t *conn, int zlib)
+ connection_t *conn, int compressed)
{
- (void) zlib;
+ (void) compressed;
tor_assert(string);
tor_assert(conn);
diff --git a/src/test/test_guardfraction.c b/src/test/test_guardfraction.c
index 8173e44d47..56006f3cc3 100644
--- a/src/test/test_guardfraction.c
+++ b/src/test/test_guardfraction.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define DIRSERV_PRIVATE
diff --git a/src/test/test_handles.c b/src/test/test_handles.c
index 536a478689..7ddee6e376 100644
--- a/src/test/test_handles.c
+++ b/src/test/test_handles.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_helpers.c b/src/test/test_helpers.c
index 5b84366e6d..9fada5a675 100644
--- a/src/test/test_helpers.c
+++ b/src/test/test_helpers.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -98,9 +98,9 @@ helper_setup_fake_routerlist(void)
void
connection_write_to_buf_mock(const char *string, size_t len,
- connection_t *conn, int zlib)
+ connection_t *conn, int compressed)
{
- (void) zlib;
+ (void) compressed;
tor_assert(string);
tor_assert(conn);
diff --git a/src/test/test_helpers.h b/src/test/test_helpers.h
index c6d4d9c41f..4621631cc1 100644
--- a/src/test/test_helpers.h
+++ b/src/test/test_helpers.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_TEST_HELPERS_H
@@ -15,7 +15,7 @@ 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 zlib);
+ connection_t *conn, int compressed);
int mock_tor_addr_lookup__fail_on_bad_addrs(const char *name,
uint16_t family, tor_addr_t *out);
diff --git a/src/test/test_hs.c b/src/test/test_hs.c
index fbaabe91d8..b4817a21ea 100644
--- a/src/test/test_hs.c
+++ b/src/test/test_hs.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2016, The Tor Project, Inc. */
+/* Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -210,9 +210,30 @@ test_hs_desc_event(void *arg)
tt_str_op(received_msg,OP_EQ, expected_msg);
tor_free(received_msg);
- /* test valid content. */
+ /* test no HSDir fingerprint type */
+ rend_query.auth_type = REND_NO_AUTH;
+ control_event_hs_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);
tor_asprintf(&exp_msg, "650+HS_DESC_CONTENT " STR_HS_ADDR " "\
@@ -821,7 +842,9 @@ test_prune_services_on_reload(void *arg)
smartlist_add(old, e1);
/* Only put the non ephemeral in the new list. */
smartlist_add(new, s1);
- prune_services_on_reload(old, new);
+ 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);
@@ -840,7 +863,9 @@ test_prune_services_on_reload(void *arg)
* one. */
smartlist_add(old, s1);
smartlist_add(old, e1);
- prune_services_on_reload(old, new);
+ 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);
@@ -855,7 +880,9 @@ test_prune_services_on_reload(void *arg)
* list being completely different. */
smartlist_add(new, s1);
smartlist_add(new, e1);
- prune_services_on_reload(old, new);
+ 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);
@@ -871,7 +898,9 @@ test_prune_services_on_reload(void *arg)
/* Setup our list. */
smartlist_add(old, s1);
smartlist_add(new, s2);
- prune_services_on_reload(old, new);
+ 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);
@@ -892,7 +921,9 @@ test_prune_services_on_reload(void *arg)
/* Test two ephemeral services. */
smartlist_add(old, e1);
smartlist_add(old, e2);
- prune_services_on_reload(old, new);
+ 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);
diff --git a/src/test/test_hs_cache.c b/src/test/test_hs_cache.c
index 1943d0ffac..bc4bfabde9 100644
--- a/src/test/test_hs_cache.c
+++ b/src/test/test_hs_cache.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -93,8 +93,8 @@ helper_build_hs_desc(uint64_t revision_counter, uint32_t lifetime,
/* Setup encrypted data section. */
desc->encrypted_data.create2_ntor = 1;
- desc->encrypted_data.auth_types = smartlist_new();
- smartlist_add(desc->encrypted_data.auth_types, tor_strdup("ed25519"));
+ desc->encrypted_data.intro_auth_types = smartlist_new();
+ smartlist_add(desc->encrypted_data.intro_auth_types, tor_strdup("ed25519"));
desc->encrypted_data.intro_points = smartlist_new();
/* Add an intro point. */
smartlist_add(desc->encrypted_data.intro_points,
@@ -333,7 +333,7 @@ helper_fetch_desc_from_hsdir(const ed25519_public_key_t *blinded_key)
size_t body_used = 0;
fetch_from_buf_http(TO_CONN(conn)->outbuf, &headers, MAX_HEADERS_SIZE,
- &received_desc, &body_used, 10000, 0);
+ &received_desc, &body_used, HS_DESC_MAX_LEN, 0);
tor_free(headers);
}
diff --git a/src/test/test_hs_descriptor.c b/src/test/test_hs_descriptor.c
index 02a71aa473..a1a1f14fb8 100644
--- a/src/test/test_hs_descriptor.c
+++ b/src/test/test_hs_descriptor.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -15,6 +15,9 @@
#include "test.h"
#include "torcert.h"
+#include "test_helpers.h"
+#include "log_test_helpers.h"
+
static hs_desc_intro_point_t *
helper_build_intro_point(const ed25519_keypair_t *blinded_kp, time_t now,
const char *addr, int legacy)
@@ -105,9 +108,9 @@ helper_build_hs_desc(unsigned int no_ip, ed25519_public_key_t *signing_pubkey)
/* Setup encrypted data section. */
desc->encrypted_data.create2_ntor = 1;
- desc->encrypted_data.auth_types = smartlist_new();
+ desc->encrypted_data.intro_auth_types = smartlist_new();
desc->encrypted_data.single_onion_service = 1;
- smartlist_add(desc->encrypted_data.auth_types, tor_strdup("ed25519"));
+ 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. */
@@ -157,14 +160,17 @@ helper_compare_hs_desc(const hs_descriptor_t *desc1,
desc2->encrypted_data.create2_ntor);
/* Authentication type. */
- tt_int_op(!!desc1->encrypted_data.auth_types, ==,
- !!desc2->encrypted_data.auth_types);
- if (desc1->encrypted_data.auth_types && desc2->encrypted_data.auth_types) {
- tt_int_op(smartlist_len(desc1->encrypted_data.auth_types), ==,
- smartlist_len(desc2->encrypted_data.auth_types));
- for (int i = 0; i < smartlist_len(desc1->encrypted_data.auth_types); i++) {
- tt_str_op(smartlist_get(desc1->encrypted_data.auth_types, i), OP_EQ,
- smartlist_get(desc2->encrypted_data.auth_types, i));
+ 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));
}
}
@@ -311,13 +317,13 @@ test_descriptor_padding(void *arg)
/* 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_PLAINTEXT_PADDING_MULTIPLE) * \
- HS_DESC_PLAINTEXT_PADDING_MULTIPLE
+ 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_PLAINTEXT_PADDING_MULTIPLE;
+ plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE;
plaintext = tor_malloc(plaintext_len);
padded_len = build_plaintext_padding(plaintext, plaintext_len,
&padded_plaintext);
@@ -333,7 +339,7 @@ test_descriptor_padding(void *arg)
}
{ /* test #2: one byte padding? */
- plaintext_len = HS_DESC_PLAINTEXT_PADDING_MULTIPLE - 1;
+ 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,
@@ -350,7 +356,7 @@ test_descriptor_padding(void *arg)
}
{ /* test #3: Lots more bytes of padding? */
- plaintext_len = HS_DESC_PLAINTEXT_PADDING_MULTIPLE + 1;
+ 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,
@@ -587,19 +593,11 @@ test_encrypted_data_len(void *arg)
/* No length, error. */
ret = encrypted_data_length_is_valid(0);
tt_int_op(ret, OP_EQ, 0);
- /* Not a multiple of our encryption algorithm (thus no padding). It's
- * suppose to be aligned on HS_DESC_PLAINTEXT_PADDING_MULTIPLE. */
- value = HS_DESC_PLAINTEXT_PADDING_MULTIPLE * 10 - 1;
- ret = encrypted_data_length_is_valid(value);
- tt_int_op(ret, OP_EQ, 0);
/* Valid value. */
- value = HS_DESC_PADDED_PLAINTEXT_MAX_LEN + HS_DESC_ENCRYPTED_SALT_LEN +
- DIGEST256_LEN;
+ value = HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN + 1;
ret = encrypted_data_length_is_valid(value);
tt_int_op(ret, OP_EQ, 1);
- /* XXX: Test maximum possible size. */
-
done:
;
}
@@ -1006,6 +1004,103 @@ test_desc_signature(void *arg)
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, ==, 0);
+ tt_assert(!encrypted_out);
+ 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, ==, 0);
+ tt_assert(!encrypted_out);
+ 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, ==, 0);
+ tt_assert(!encrypted_out);
+ 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, ==, 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,
@@ -1035,6 +1130,9 @@ struct testcase_t hs_descriptor[] = {
{ "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/test/test_hs_intropoint.c b/src/test/test_hs_intropoint.c
index ea12aeb2da..ef5cb46567 100644
--- a/src/test/test_hs_intropoint.c
+++ b/src/test/test_hs_intropoint.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -69,10 +69,10 @@ helper_create_intro_circuit(void)
return circ;
}
-static hs_cell_introduce1_t *
+static trn_cell_introduce1_t *
helper_create_introduce1_cell(void)
{
- hs_cell_introduce1_t *cell = NULL;
+ trn_cell_introduce1_t *cell = NULL;
ed25519_keypair_t auth_key_kp;
/* Generate the auth_key of the cell. */
@@ -80,39 +80,39 @@ helper_create_introduce1_cell(void)
goto err;
}
- cell = hs_cell_introduce1_new();
+ cell = trn_cell_introduce1_new();
tt_assert(cell);
/* Set the auth key. */
{
size_t auth_key_len = sizeof(auth_key_kp.pubkey);
- hs_cell_introduce1_set_auth_key_type(cell,
+ trn_cell_introduce1_set_auth_key_type(cell,
HS_INTRO_AUTH_KEY_TYPE_ED25519);
- hs_cell_introduce1_set_auth_key_len(cell, auth_key_len);
- hs_cell_introduce1_setlen_auth_key(cell, auth_key_len);
- uint8_t *auth_key_ptr = hs_cell_introduce1_getarray_auth_key(cell);
+ 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. */
{
- cell_extension_t *ext = cell_extension_new();
- cell_extension_set_num(ext, 0);
- hs_cell_introduce1_set_extensions(cell, ext);
+ 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;
- hs_cell_introduce1_setlen_encrypted(cell, enc_len);
- uint8_t *enc_ptr = hs_cell_introduce1_getarray_encrypted(cell);
+ 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:
- hs_cell_introduce1_free(cell);
+ trn_cell_introduce1_free(cell);
return NULL;
}
@@ -122,7 +122,7 @@ static void
test_establish_intro_wrong_purpose(void *arg)
{
int retval;
- hs_cell_establish_intro_t *establish_intro_cell = NULL;
+ trn_cell_establish_intro_t *establish_intro_cell = NULL;
or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
@@ -154,7 +154,7 @@ test_establish_intro_wrong_purpose(void *arg)
tt_int_op(retval, ==, -1);
done:
- hs_cell_establish_intro_free(establish_intro_cell);
+ trn_cell_establish_intro_free(establish_intro_cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
@@ -198,7 +198,7 @@ static void
test_establish_intro_wrong_keytype2(void *arg)
{
int retval;
- hs_cell_establish_intro_t *establish_intro_cell = NULL;
+ trn_cell_establish_intro_t *establish_intro_cell = NULL;
or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
@@ -230,7 +230,7 @@ test_establish_intro_wrong_keytype2(void *arg)
tt_int_op(retval, ==, -1);
done:
- hs_cell_establish_intro_free(establish_intro_cell);
+ trn_cell_establish_intro_free(establish_intro_cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
@@ -239,7 +239,7 @@ static void
test_establish_intro_wrong_mac(void *arg)
{
int retval;
- hs_cell_establish_intro_t *establish_intro_cell = NULL;
+ trn_cell_establish_intro_t *establish_intro_cell = NULL;
or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
@@ -258,7 +258,7 @@ test_establish_intro_wrong_mac(void *arg)
tt_assert(establish_intro_cell);
/* Mangle one byte of the MAC. */
uint8_t *handshake_ptr =
- hs_cell_establish_intro_getarray_handshake_mac(establish_intro_cell);
+ trn_cell_establish_intro_getarray_handshake_mac(establish_intro_cell);
handshake_ptr[TRUNNEL_SHA3_256_LEN - 1]++;
/* We need to resign the payload with that change. */
{
@@ -269,7 +269,7 @@ test_establish_intro_wrong_mac(void *arg)
retval = ed25519_keypair_generate(&key_struct, 0);
tt_int_op(retval, OP_EQ, 0);
uint8_t *auth_key_ptr =
- hs_cell_establish_intro_getarray_auth_key(establish_intro_cell);
+ trn_cell_establish_intro_getarray_auth_key(establish_intro_cell);
memcpy(auth_key_ptr, key_struct.pubkey.pubkey, ED25519_PUBKEY_LEN);
/* Encode payload so we can sign it. */
cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body),
@@ -284,7 +284,7 @@ test_establish_intro_wrong_mac(void *arg)
tt_int_op(retval, OP_EQ, 0);
/* And write the signature to the cell */
uint8_t *sig_ptr =
- hs_cell_establish_intro_getarray_sig(establish_intro_cell);
+ trn_cell_establish_intro_getarray_sig(establish_intro_cell);
memcpy(sig_ptr, sig.sig, establish_intro_cell->sig_len);
/* Re-encode with the new signature. */
cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body),
@@ -299,7 +299,7 @@ test_establish_intro_wrong_mac(void *arg)
tt_int_op(retval, ==, -1);
done:
- hs_cell_establish_intro_free(establish_intro_cell);
+ trn_cell_establish_intro_free(establish_intro_cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
@@ -309,7 +309,7 @@ static void
test_establish_intro_wrong_auth_key_len(void *arg)
{
int retval;
- hs_cell_establish_intro_t *establish_intro_cell = NULL;
+ trn_cell_establish_intro_t *establish_intro_cell = NULL;
or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
@@ -328,9 +328,9 @@ test_establish_intro_wrong_auth_key_len(void *arg)
sizeof(circuit_key_material));
tt_assert(establish_intro_cell);
/* Mangle the auth key length. */
- hs_cell_establish_intro_set_auth_key_len(establish_intro_cell,
+ trn_cell_establish_intro_set_auth_key_len(establish_intro_cell,
bad_auth_key_len);
- hs_cell_establish_intro_setlen_auth_key(establish_intro_cell,
+ trn_cell_establish_intro_setlen_auth_key(establish_intro_cell,
bad_auth_key_len);
cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body),
establish_intro_cell);
@@ -344,7 +344,7 @@ test_establish_intro_wrong_auth_key_len(void *arg)
tt_int_op(retval, ==, -1);
done:
- hs_cell_establish_intro_free(establish_intro_cell);
+ trn_cell_establish_intro_free(establish_intro_cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
@@ -354,7 +354,7 @@ static void
test_establish_intro_wrong_sig_len(void *arg)
{
int retval;
- hs_cell_establish_intro_t *establish_intro_cell = NULL;
+ trn_cell_establish_intro_t *establish_intro_cell = NULL;
or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
@@ -373,8 +373,8 @@ test_establish_intro_wrong_sig_len(void *arg)
sizeof(circuit_key_material));
tt_assert(establish_intro_cell);
/* Mangle the signature length. */
- hs_cell_establish_intro_set_sig_len(establish_intro_cell, bad_sig_len);
- hs_cell_establish_intro_setlen_sig(establish_intro_cell, bad_sig_len);
+ trn_cell_establish_intro_set_sig_len(establish_intro_cell, bad_sig_len);
+ trn_cell_establish_intro_setlen_sig(establish_intro_cell, bad_sig_len);
cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body),
establish_intro_cell);
tt_int_op(cell_len, >, 0);
@@ -387,7 +387,7 @@ test_establish_intro_wrong_sig_len(void *arg)
tt_int_op(retval, ==, -1);
done:
- hs_cell_establish_intro_free(establish_intro_cell);
+ trn_cell_establish_intro_free(establish_intro_cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
@@ -397,7 +397,7 @@ static void
test_establish_intro_wrong_sig(void *arg)
{
int retval;
- hs_cell_establish_intro_t *establish_intro_cell = NULL;
+ trn_cell_establish_intro_t *establish_intro_cell = NULL;
or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
@@ -429,17 +429,17 @@ test_establish_intro_wrong_sig(void *arg)
tt_int_op(retval, ==, -1);
done:
- hs_cell_establish_intro_free(establish_intro_cell);
+ trn_cell_establish_intro_free(establish_intro_cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
/* Helper function: Send a well-formed v3 ESTABLISH_INTRO cell to
* <b>intro_circ</b>. Return the cell. */
-static hs_cell_establish_intro_t *
+static trn_cell_establish_intro_t *
helper_establish_intro_v3(or_circuit_t *intro_circ)
{
int retval;
- hs_cell_establish_intro_t *establish_intro_cell = NULL;
+ trn_cell_establish_intro_t *establish_intro_cell = NULL;
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
uint8_t circuit_key_material[DIGEST_LEN] = {0};
@@ -489,6 +489,7 @@ helper_establish_intro_v2(or_circuit_t *intro_circ)
/* Use old circuit_key_material why not */
cell_len = encode_establish_intro_cell_legacy((char*)cell_body,
+ sizeof(cell_body),
key1,
(char *) circuit_key_material);
tt_int_op(cell_len, >, 0);
@@ -511,7 +512,7 @@ test_intro_point_registration(void *arg)
hs_circuitmap_ht *the_hs_circuitmap = NULL;
or_circuit_t *intro_circ = NULL;
- hs_cell_establish_intro_t *establish_intro_cell = NULL;
+ trn_cell_establish_intro_t *establish_intro_cell = NULL;
ed25519_public_key_t auth_key;
crypto_pk_t *legacy_auth_key = NULL;
@@ -531,7 +532,7 @@ test_intro_point_registration(void *arg)
tt_assert(the_hs_circuitmap);
tt_int_op(0, ==, HT_SIZE(the_hs_circuitmap));
/* Do a circuitmap query in any case */
- returned_intro_circ = hs_circuitmap_get_intro_circ_v3(&auth_key);
+ returned_intro_circ =hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key);
tt_ptr_op(returned_intro_circ, ==, NULL);
}
@@ -547,7 +548,8 @@ test_intro_point_registration(void *arg)
tt_int_op(1, ==, 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(&auth_key);
+ returned_intro_circ =
+ hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key);
tt_ptr_op(intro_circ, ==, returned_intro_circ);
}
@@ -568,7 +570,8 @@ test_intro_point_registration(void *arg)
/* Check that the new element is our legacy intro circuit. */
retval = crypto_pk_get_digest(legacy_auth_key, key_digest);
tt_int_op(retval, ==, 0);
- returned_intro_circ= hs_circuitmap_get_intro_circ_v2((uint8_t*)key_digest);
+ returned_intro_circ =
+ hs_circuitmap_get_intro_circ_v2_relay_side((uint8_t*)key_digest);
tt_ptr_op(legacy_intro_circ, ==, returned_intro_circ);
}
@@ -579,7 +582,7 @@ test_intro_point_registration(void *arg)
crypto_pk_free(legacy_auth_key);
circuit_free(TO_CIRCUIT(intro_circ));
circuit_free(TO_CIRCUIT(legacy_intro_circ));
- hs_cell_establish_intro_free(establish_intro_cell);
+ trn_cell_establish_intro_free(establish_intro_cell);
{ /* Test circuitmap free_all function. */
the_hs_circuitmap = get_hs_circuitmap();
@@ -673,7 +676,7 @@ static void
test_introduce1_validation(void *arg)
{
int ret;
- hs_cell_introduce1_t *cell = NULL;
+ trn_cell_introduce1_t *cell = NULL;
(void) arg;
@@ -713,25 +716,25 @@ test_introduce1_validation(void *arg)
ret = validate_introduce1_parsed_cell(cell);
tt_int_op(ret, OP_EQ, 0);
/* Set an invalid size of the auth key buffer. */
- hs_cell_introduce1_setlen_auth_key(cell, 3);
+ 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. */
- hs_cell_introduce1_setlen_auth_key(cell, sizeof(ed25519_public_key_t));
+ 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. */
- hs_cell_introduce1_setlen_encrypted(cell, 0);
+ 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. */
- hs_cell_introduce1_setlen_encrypted(cell, 1);
+ trn_cell_introduce1_setlen_encrypted(cell, 1);
ret = validate_introduce1_parsed_cell(cell);
tt_int_op(ret, OP_EQ, 0);
done:
- hs_cell_introduce1_free(cell);
+ trn_cell_introduce1_free(cell);
}
static void
@@ -739,7 +742,7 @@ test_received_introduce1_handling(void *arg)
{
int ret;
uint8_t *request = NULL, buf[128];
- hs_cell_introduce1_t *cell = NULL;
+ trn_cell_introduce1_t *cell = NULL;
or_circuit_t *circ = NULL;
(void) arg;
@@ -773,12 +776,12 @@ test_received_introduce1_handling(void *arg)
/* Valid case. */
{
cell = helper_create_introduce1_cell();
- ssize_t request_len = hs_cell_introduce1_encoded_len(cell);
- tt_size_op(request_len, OP_GT, 0);
+ 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 =
- hs_cell_introduce1_encode(request, request_len, cell);
- tt_size_op(encoded_len, OP_GT, 0);
+ 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();
@@ -787,9 +790,9 @@ test_received_introduce1_handling(void *arg)
/* 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 =
- hs_cell_introduce1_getconstarray_auth_key(cell);
+ trn_cell_introduce1_getconstarray_auth_key(cell);
memcpy(auth_key.pubkey, cell_auth_key, ED25519_PUBKEY_LEN);
- hs_circuitmap_register_intro_circ_v3(service_circ, &auth_key);
+ 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));
@@ -799,17 +802,17 @@ test_received_introduce1_handling(void *arg)
/* Valid legacy cell. */
{
tor_free(request);
- hs_cell_introduce1_free(cell);
+ trn_cell_introduce1_free(cell);
cell = helper_create_introduce1_cell();
- uint8_t *legacy_key_id = hs_cell_introduce1_getarray_legacy_key_id(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 = hs_cell_introduce1_encoded_len(cell) + 256;
+ 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 =
- hs_cell_introduce1_encode(request, request_len, cell);
- tt_size_op(encoded_len, OP_GT, 0);
+ 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();
@@ -818,7 +821,7 @@ test_received_introduce1_handling(void *arg)
/* 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(service_circ, 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));
@@ -826,7 +829,7 @@ test_received_introduce1_handling(void *arg)
}
done:
- hs_cell_introduce1_free(cell);
+ trn_cell_introduce1_free(cell);
tor_free(request);
hs_circuitmap_free_all();
UNMOCK(relay_send_command_from_edge_);
diff --git a/src/test/test_hs_ntor.sh b/src/test/test_hs_ntor.sh
new file mode 100755
index 0000000000..8a0003d44a
--- /dev/null
+++ b/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/test/test_hs_ntor_cl.c b/src/test/test_hs_ntor_cl.c
new file mode 100644
index 0000000000..ed1eda58ea
--- /dev/null
+++ b/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 <stdio.h>
+#include <stdlib.h>
+
+#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/test/test_hs_service.c b/src/test/test_hs_service.c
index 039d727cea..fcfb3b992d 100644
--- a/src/test/test_hs_service.c
+++ b/src/test/test_hs_service.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -6,6 +6,7 @@
* \brief Test hidden service functionality.
*/
+#define HS_COMMON_PRIVATE
#define HS_SERVICE_PRIVATE
#define HS_INTROPOINT_PRIVATE
@@ -14,9 +15,12 @@
#include "crypto.h"
#include "hs/cell_establish_intro.h"
+#include "hs_common.h"
#include "hs_service.h"
#include "hs_intropoint.h"
+#include "hs_ntor.h"
+
/** We simulate the creation of an outgoing ESTABLISH_INTRO cell, and then we
* parse it from the receiver side. */
static void
@@ -26,8 +30,8 @@ test_gen_establish_intro_cell(void *arg)
ssize_t retval;
uint8_t circuit_key_material[DIGEST_LEN] = {0};
uint8_t buf[RELAY_PAYLOAD_SIZE];
- hs_cell_establish_intro_t *cell_out = NULL;
- hs_cell_establish_intro_t *cell_in = NULL;
+ trn_cell_establish_intro_t *cell_out = NULL;
+ trn_cell_establish_intro_t *cell_in = NULL;
crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
@@ -44,7 +48,7 @@ test_gen_establish_intro_cell(void *arg)
/* Parse it as the receiver */
{
- ssize_t parse_result = hs_cell_establish_intro_parse(&cell_in,
+ ssize_t parse_result = trn_cell_establish_intro_parse(&cell_in,
buf, sizeof(buf));
tt_int_op(parse_result, >=, 0);
@@ -55,8 +59,8 @@ test_gen_establish_intro_cell(void *arg)
}
done:
- hs_cell_establish_intro_free(cell_out);
- hs_cell_establish_intro_free(cell_in);
+ trn_cell_establish_intro_free(cell_out);
+ trn_cell_establish_intro_free(cell_in);
}
/* Mocked ed25519_sign_prefixed() function that always fails :) */
@@ -78,7 +82,7 @@ static void
test_gen_establish_intro_cell_bad(void *arg)
{
(void) arg;
- hs_cell_establish_intro_t *cell = NULL;
+ trn_cell_establish_intro_t *cell = NULL;
uint8_t circuit_key_material[DIGEST_LEN] = {0};
MOCK(ed25519_sign_prefixed, mock_ed25519_sign_prefixed);
@@ -96,15 +100,150 @@ test_gen_establish_intro_cell_bad(void *arg)
tt_assert(!cell);
done:
- hs_cell_establish_intro_free(cell);
+ trn_cell_establish_intro_free(cell);
UNMOCK(ed25519_sign_prefixed);
}
+/** 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, ==, 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, ==, 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, ==, 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, ==, 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:
+ ;
+}
+
+/** 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;
+
+ /* 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, ==, 0);
+
+ /* Check that the time period number is right */
+ tn = get_time_period_num(fake_time);
+ tt_u64_op(tn, ==, 16903);
+
+ /* Increase current time to 11:59:59 UTC and check that the time period
+ number is still the same */
+ fake_time += 3599;
+ tn = get_time_period_num(fake_time);
+ tt_u64_op(tn, ==, 16903);
+
+ /* Now take time to 12:00:00 UTC and check that the time period rotated */
+ fake_time += 1;
+ tn = get_time_period_num(fake_time);
+ tt_u64_op(tn, ==, 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, ==, 16905);
+
+ done:
+ ;
+}
+
struct testcase_t hs_service_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 },
+ { "hs_ntor", test_hs_ntor, TT_FORK,
+ NULL, NULL },
+ { "time_period", test_time_period, TT_FORK,
+ NULL, NULL },
END_OF_TESTCASES
};
diff --git a/src/test/test_introduce.c b/src/test/test_introduce.c
index 810b03c93d..cfb8d83b1d 100644
--- a/src/test/test_introduce.c
+++ b/src/test/test_introduce.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_keypin.c b/src/test/test_keypin.c
index 95657349c6..d2ec8e9ca7 100644
--- a/src/test/test_keypin.c
+++ b/src/test/test_keypin.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_link_handshake.c b/src/test/test_link_handshake.c
index 421f3aaedf..217088ee37 100644
--- a/src/test/test_link_handshake.c
+++ b/src/test/test_link_handshake.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -10,13 +10,6 @@
#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 <openssl/x509.h>
-#include <openssl/ssl.h>
-ENABLE_GCC_WARNING(redundant-decls)
-
#include "or.h"
#include "config.h"
#include "connection.h"
@@ -785,19 +778,14 @@ CERTS_FAIL(expired_rsa_id, /* both */
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);
- X509 *newc = X509_dup(idc->cert);
+ tor_x509_cert_t *newc;
time_t new_end = time(NULL) - 86400 * 10;
- X509_time_adj(X509_get_notAfter(newc), 0, &new_end);
- EVP_PKEY *pk = crypto_pk_get_evp_pkey_(d->key2, 1);
- tt_assert(X509_sign(newc, pk, EVP_sha1()));
- int len = i2d_X509(newc, NULL);
- certs_cell_cert_setlen_body(cert, len);
- uint8_t *body = certs_cell_cert_getarray_body(cert);
- int len2 = i2d_X509(newc, &body);
- tt_int_op(len, ==, len2);
+ 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();
- X509_free(newc);
- EVP_PKEY_free(pk);
+ tor_x509_cert_free(newc);
})
CERTS_FAIL(expired_ed_id, /* ed25519 */
{
diff --git a/src/test/test_logging.c b/src/test/test_logging.c
index 15471e46d0..94b3e4ea68 100644
--- a/src/test/test_logging.c
+++ b/src/test/test_logging.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_microdesc.c b/src/test/test_microdesc.c
index 2ae605b8db..c78fda3b69 100644
--- a/src/test/test_microdesc.c
+++ b/src/test/test_microdesc.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2016, The Tor Project, Inc. */
+/* Copyright (c) 2010-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -14,12 +14,6 @@
#include "test.h"
-DISABLE_GCC_WARNING(redundant-decls)
-#include <openssl/rsa.h>
-#include <openssl/bn.h>
-#include <openssl/pem.h>
-ENABLE_GCC_WARNING(redundant-decls)
-
#ifdef _WIN32
/* For mkdir() */
#include <direct.h>
diff --git a/src/test/test_nodelist.c b/src/test/test_nodelist.c
index d58f8a7fca..256354415c 100644
--- a/src/test/test_nodelist.c
+++ b/src/test/test_nodelist.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2016, The Tor Project, Inc. */
+/* Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/test/test_ntor_cl.c b/src/test/test_ntor_cl.c
index a560e5fc5e..d0eea85d6f 100644
--- a/src/test/test_ntor_cl.c
+++ b/src/test/test_ntor_cl.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_oom.c b/src/test/test_oom.c
index 0f97972032..f03a504d1d 100644
--- a/src/test/test_oom.c
+++ b/src/test/test_oom.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Unit tests for OOM handling logic */
diff --git a/src/test/test_oos.c b/src/test/test_oos.c
index db06625116..9fd6bce5ae 100644
--- a/src/test/test_oos.c
+++ b/src/test/test_oos.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Unit tests for OOS handler */
diff --git a/src/test/test_options.c b/src/test/test_options.c
index ecf311d217..e2fc034cc3 100644
--- a/src/test/test_options.c
+++ b/src/test/test_options.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CONFIG_PRIVATE
@@ -105,11 +105,71 @@ clear_log_messages(void)
"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)
+ const char *expect_log,
+ int phase)
{
or_options_t *opt=NULL;
or_options_t *dflt;
@@ -120,43 +180,33 @@ test_options_validate_impl(const char *configuration,
setup_options(opt, dflt);
r = config_get_lines(configuration, &cl, 1);
- tt_int_op(r, OP_EQ, 0);
+ if (phase == PH_GETLINES) {
+ if (test_options_checkmsgs(configuration, expect_errmsg,
+ expect_log_severity,
+ expect_log, msg))
+ goto done;
+ }
+ tt_int_op((r == 0), OP_EQ, (msg == NULL));
r = config_assign(&options_format, opt, cl, 0, &msg);
- tt_int_op(r, OP_EQ, 0);
-
- r = options_validate(NULL, opt, dflt, 0, &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 (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;
- if (expect_log) {
- int found = 0;
- 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) {
- tor_free(msg);
- msg = dump_logs();
- TT_DIE(("Expected log message [%s] %s from <%s>, but got <%s>.",
- log_level_to_string(expect_log_severity), expect_log,
- configuration, msg));
- }
+ 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);
@@ -168,14 +218,14 @@ test_options_validate_impl(const char *configuration,
clear_log_messages();
}
-#define WANT_ERR(config, msg) \
- test_options_validate_impl((config), (msg), 0, NULL)
-#define WANT_LOG(config, severity, msg) \
- test_options_validate_impl((config), NULL, (severity), (msg))
-#define WANT_ERR_LOG(config, msg, severity, logmsg) \
- test_options_validate_impl((config), (msg), (severity), (logmsg))
-#define OK(config) \
- test_options_validate_impl((config), NULL, 0, NULL)
+#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)
@@ -184,21 +234,32 @@ test_options_validate(void *arg)
setup_log_callback();
sandbox_disable_getaddrinfo_cache();
- WANT_ERR("ExtORPort 500000", "Invalid ExtORPort");
+ WANT_ERR("ExtORPort 500000", "Invalid ExtORPort", PH_VALIDATE);
WANT_ERR_LOG("ServerTransportOptions trebuchet",
"ServerTransportOptions did not parse",
- LOG_WARN, "Too few arguments");
- OK("ServerTransportOptions trebuchet sling=snappy");
- OK("ServerTransportOptions trebuchet sling=");
+ 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");
+ LOG_WARN, "\"slingsnappy\" is not a k=v", PH_VALIDATE);
WANT_ERR("DirPort 8080\nDirCache 0",
- "DirPort configured but DirCache disabled.");
+ "DirPort configured but DirCache disabled.", PH_VALIDATE);
WANT_ERR("BridgeRelay 1\nDirCache 0",
- "We're a bridge but DirCache is disabled.");
+ "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);
close_temp_logs();
clear_log_messages();
diff --git a/src/test/test_policy.c b/src/test/test_policy.c
index e86d0f0274..1b2fac4325 100644
--- a/src/test/test_policy.c
+++ b/src/test/test_policy.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2016, The Tor Project, Inc. */
+/* Copyright (c) 2013-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/test/test_procmon.c b/src/test/test_procmon.c
index 9e63fc006d..5c52af8693 100644
--- a/src/test/test_procmon.c
+++ b/src/test/test_procmon.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2016, The Tor Project, Inc. */
+/* Copyright (c) 2010-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define PROCMON_PRIVATE
diff --git a/src/test/test_protover.c b/src/test/test_protover.c
index f00955d1b4..5626816024 100644
--- a/src/test/test_protover.c
+++ b/src/test/test_protover.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define PROTOVER_PRIVATE
diff --git a/src/test/test_pt.c b/src/test/test_pt.c
index f93019f1c4..79b03171bc 100644
--- a/src/test/test_pt.c
+++ b/src/test/test_pt.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -284,13 +284,13 @@ test_pt_get_extrainfo_string(void *arg)
}
#ifdef _WIN32
-#define STDIN_HANDLE HANDLE
+#define STDIN_HANDLE HANDLE*
#else
-#define STDIN_HANDLE FILE
+#define STDIN_HANDLE int
#endif
static smartlist_t *
-tor_get_lines_from_handle_replacement(STDIN_HANDLE *handle,
+tor_get_lines_from_handle_replacement(STDIN_HANDLE handle,
enum stream_status *stream_status_out)
{
static int times_called = 0;
diff --git a/src/test/test_pubsub.c b/src/test/test_pubsub.c
index 547d6c6b32..2f047d9f2c 100644
--- a/src/test/test_pubsub.c
+++ b/src/test/test_pubsub.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Tor Project, Inc. */
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/test/test_relay.c b/src/test/test_relay.c
index 4713c79ea5..238d4c5baf 100644
--- a/src/test/test_relay.c
+++ b/src/test/test_relay.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/test/test_relaycell.c b/src/test/test_relaycell.c
index fb6748965a..eea1f5dc80 100644
--- a/src/test/test_relaycell.c
+++ b/src/test/test_relaycell.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Unit tests for handling different kinds of relay cell */
diff --git a/src/test/test_rendcache.c b/src/test/test_rendcache.c
index 0d53c78817..feba8f664e 100644
--- a/src/test/test_rendcache.c
+++ b/src/test/test_rendcache.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2016, The Tor Project, Inc. */
+/* Copyright (c) 2010-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -11,7 +11,6 @@
#include "routerlist.h"
#include "config.h"
#include "hs_common.h"
-#include <openssl/rsa.h>
#include "rend_test_helpers.h"
#include "log_test_helpers.h"
diff --git a/src/test/test_replay.c b/src/test/test_replay.c
index e882bc6164..80e7203716 100644
--- a/src/test/test_replay.c
+++ b/src/test/test_replay.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Tor Project, Inc. */
+/* Copyright (c) 2012-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define REPLAYCACHE_PRIVATE
diff --git a/src/test/test_routerkeys.c b/src/test/test_routerkeys.c
index 64692d28a0..263923f50f 100644
--- a/src/test/test_routerkeys.c
+++ b/src/test/test_routerkeys.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_routerlist.c b/src/test/test_routerlist.c
index 78f1cf16b7..0b4b6c5c44 100644
--- a/src/test/test_routerlist.c
+++ b/src/test/test_routerlist.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_scheduler.c b/src/test/test_scheduler.c
index 05ea8e86e8..4c536b0905 100644
--- a/src/test/test_scheduler.c
+++ b/src/test/test_scheduler.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Tor Project, Inc. */
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_slow.c b/src/test/test_slow.c
index 7c9f0b1cc2..e640702499 100644
--- a/src/test/test_slow.c
+++ b/src/test/test_slow.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/test/test_socks.c b/src/test/test_socks.c
index 62ff12fe15..bb1be11f2b 100644
--- a/src/test/test_socks.c
+++ b/src/test/test_socks.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/test/test_storagedir.c b/src/test/test_storagedir.c
new file mode 100644
index 0000000000..19e5de4ea3
--- /dev/null
+++ b/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 <utime.h>
+#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_assert(labels->next->next->next == 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/test/test_switch_id.c b/src/test/test_switch_id.c
index 322f5bdc7a..44e02e87b3 100644
--- a/src/test/test_switch_id.c
+++ b/src/test/test_switch_id.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Tor Project, Inc. */
+/* Copyright (c) 2015-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/test/test_threads.c b/src/test/test_threads.c
index ebbc95c7ca..18a9407ff7 100644
--- a/src/test/test_threads.c
+++ b/src/test/test_threads.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_tortls.c b/src/test/test_tortls.c
index 4bfcea211d..7aa3051464 100644
--- a/src/test/test_tortls.c
+++ b/src/test/test_tortls.c
@@ -1,7 +1,8 @@
-/* Copyright (c) 2010-2016, The Tor Project, Inc. */
+/* 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"
diff --git a/src/test/test_util.c b/src/test/test_util.c
index e80201737a..b3f8ecdf51 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -2242,114 +2242,160 @@ test_util_pow2(void *arg)
;
}
-/** Run unit tests for compression functions */
static void
-test_util_gzip(void *arg)
+test_util_compress_impl(compress_method_t method)
{
- char *buf1=NULL, *buf2=NULL, *buf3=NULL, *cp1, *cp2;
- const char *ccp2;
+ char *buf1=NULL, *buf2=NULL, *buf3=NULL;
size_t len1, len2;
- tor_zlib_state_t *state = NULL;
- (void)arg;
+ tt_assert(tor_compress_supports_method(method));
+
buf1 = tor_strdup("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ");
tt_assert(detect_compression_method(buf1, strlen(buf1)) == UNKNOWN_METHOD);
- tt_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1,
- GZIP_METHOD));
- tt_assert(buf2);
- tt_assert(len1 < strlen(buf1));
- tt_assert(detect_compression_method(buf2, len1) == GZIP_METHOD);
-
- tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1,
- GZIP_METHOD, 1, LOG_INFO));
- tt_assert(buf3);
- tt_int_op(strlen(buf1) + 1,OP_EQ, len2);
- tt_str_op(buf1,OP_EQ, buf3);
-
- tor_free(buf2);
- tor_free(buf3);
-
- tt_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1,
- ZLIB_METHOD));
- tt_assert(buf2);
- tt_assert(detect_compression_method(buf2, len1) == ZLIB_METHOD);
+ tt_assert(!tor_compress(&buf2, &len1, buf1, strlen(buf1)+1, method));
+ tt_assert(buf2 != 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_gzip_uncompress(&buf3, &len2, buf2, len1,
- ZLIB_METHOD, 1, LOG_INFO));
- tt_assert(buf3);
- tt_int_op(strlen(buf1) + 1,OP_EQ, len2);
- tt_str_op(buf1,OP_EQ, buf3);
+ tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1, method, 1, LOG_INFO));
+ tt_assert(buf3 != 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_gzip_uncompress(&buf3, &len2, buf2, len1*2,
- ZLIB_METHOD, 1, LOG_INFO));
- tt_int_op((strlen(buf1)+1)*2,OP_EQ, len2);
- tt_mem_op(buf3,OP_EQ,
+ 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);
- /* Check whether we can uncompress partial strings. */
- buf1 =
- tor_strdup("String with low redundancy that won't be compressed much.");
- tt_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1,
- ZLIB_METHOD));
- tt_assert(len1>16);
- /* when we allow an incomplete string, we should succeed.*/
- tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1-16,
- ZLIB_METHOD, 0, LOG_INFO));
- tt_assert(len2 > 5);
- buf3[len2]='\0';
- tt_assert(!strcmpstart(buf1, buf3));
-
- /* when we demand a complete string, this must fail. */
+ 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);
- tt_assert(tor_gzip_uncompress(&buf3, &len2, buf2, len1-16,
- ZLIB_METHOD, 1, LOG_INFO));
- tt_assert(!buf3);
+ if (method != NO_METHOD) {
+ tt_assert(tor_uncompress(&buf3, &len2, buf2, len1-16,
+ method, 1, LOG_INFO));
+ tt_assert(buf3 == NULL);
+ }
- /* Now, try streaming compression. */
+ done:
tor_free(buf1);
tor_free(buf2);
tor_free(buf3);
- state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION);
+}
+
+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_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 0)
- == TOR_ZLIB_OK);
- tt_int_op(0,OP_EQ, len2); /* Make sure we compressed it all. */
+ 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_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 1)
- == TOR_ZLIB_DONE);
- tt_int_op(0,OP_EQ, len2);
- tt_assert(cp1 > cp2); /* Make sure we really added something. */
+ 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_assert(!tor_gzip_uncompress(&buf3, &len2, buf1, 1024-len1,
- ZLIB_METHOD, 1, LOG_WARN));
+ 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);
+ tt_int_op(21, OP_EQ, len2);
done:
if (state)
- tor_zlib_free(state);
+ tor_compress_free(state);
+ tor_free(buf1);
tor_free(buf2);
tor_free(buf3);
- tor_free(buf1);
+}
+
+/** 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
@@ -2364,44 +2410,44 @@ test_util_gzip_compression_bomb(void *arg)
char *one_mb = tor_malloc_zero(one_million);
char *result = NULL;
size_t result_len = 0;
- tor_zlib_state_t *state = NULL;
+ 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_gzip_compress(&result, &result_len,
- one_mb, one_million,
- ZLIB_METHOD));
+ 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 zlib bomb.");
+ "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_gzip_uncompress(&result, &result_len,
- compression_bomb, 1039,
- ZLIB_METHOD, 0, LOG_WARN));
+ 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_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION);
- tor_zlib_output_t r;
+ 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_zlib_process(state, &outp, &outleft, &inp, &inlen, 0);
+ r = tor_compress_process(state, &outp, &outleft, &inp, &inlen, 0);
tt_int_op(inlen, OP_NE, 0);
- } while (r == TOR_ZLIB_BUF_FULL);
+ } while (r == TOR_COMPRESS_BUFFER_FULL);
- tt_int_op(r, OP_EQ, TOR_ZLIB_ERR);
+ tt_int_op(r, OP_EQ, TOR_COMPRESS_ERROR);
done:
tor_free(one_mb);
- tor_zlib_free(state);
+ tor_compress_free(state);
}
/** Run unit tests for mmap() wrapper functionality. */
@@ -3340,6 +3386,13 @@ test_util_memarea(void *arg)
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
+
(void)arg;
tt_assert(area);
@@ -3933,17 +3986,13 @@ test_util_exit_status(void *ptr)
#endif
#ifndef _WIN32
-/* Check that fgets with a non-blocking pipe returns partial lines and sets
- * EAGAIN, returns full lines and sets no error, and returns NULL on EOF and
- * sets no error */
static void
-test_util_fgets_eagain(void *ptr)
+test_util_string_from_pipe(void *ptr)
{
int test_pipe[2] = {-1, -1};
- int retval;
+ int retval = 0;
+ enum stream_status status = IO_STREAM_TERM;
ssize_t retlen;
- char *retptr;
- FILE *test_stream = NULL;
char buf[4] = { 0 };
(void)ptr;
@@ -3954,91 +4003,115 @@ test_util_fgets_eagain(void *ptr)
retval = pipe(test_pipe);
tt_int_op(retval, OP_EQ, 0);
- /* Set up the read-end to be non-blocking */
- retval = fcntl(test_pipe[0], F_SETFL, O_NONBLOCK);
- 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);
- /* Open it as a stdio stream */
- test_stream = fdopen(test_pipe[0], "r");
- tt_ptr_op(test_stream, OP_NE, NULL);
+ 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 partial line */
- retlen = write(test_pipe[1], "A", 1);
+ /* 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);
- retptr = fgets(buf, sizeof(buf), test_stream);
- tt_int_op(errno, OP_EQ, EAGAIN);
- tt_ptr_op(retptr, OP_EQ, buf);
- tt_str_op(buf, OP_EQ, "A");
+
+ 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 the rest */
- retlen = write(test_pipe[1], "B\n", 2);
- tt_int_op(retlen, OP_EQ, 2);
- retptr = fgets(buf, sizeof(buf), test_stream);
+ /* 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_ptr_op(retptr, OP_EQ, buf);
- tt_str_op(buf, OP_EQ, "B\n");
+ tt_int_op(status, OP_EQ, IO_STREAM_OKAY);
+ tt_str_op(buf, OP_EQ, "");
errno = 0;
- /* Send in a full line */
- retlen = write(test_pipe[1], "CD\n", 3);
+ /* 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);
- retptr = fgets(buf, sizeof(buf), test_stream);
+
+ status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1);
tt_int_op(errno, OP_EQ, 0);
- tt_ptr_op(retptr, OP_EQ, buf);
- tt_str_op(buf, OP_EQ, "CD\n");
+ 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;
- /* Send in a partial line */
- retlen = write(test_pipe[1], "E", 1);
+ retlen = write(test_pipe[1], "B", 1);
tt_int_op(retlen, OP_EQ, 1);
- retptr = fgets(buf, sizeof(buf), test_stream);
- tt_int_op(errno, OP_EQ, EAGAIN);
- tt_ptr_op(retptr, OP_EQ, buf);
- tt_str_op(buf, OP_EQ, "E");
+
+ 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 the rest */
- retlen = write(test_pipe[1], "F\n", 2);
- tt_int_op(retlen, OP_EQ, 2);
- retptr = fgets(buf, sizeof(buf), test_stream);
+ /* 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_ptr_op(retptr, OP_EQ, buf);
- tt_str_op(buf, OP_EQ, "F\n");
+ tt_int_op(status, OP_EQ, IO_STREAM_OKAY);
+ tt_str_op(buf, OP_EQ, "A\nB");
errno = 0;
- /* Send in a full line and close */
- retlen = write(test_pipe[1], "GH", 2);
+ /* 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;
- retptr = fgets(buf, sizeof(buf), test_stream);
+
+ status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1);
tt_int_op(errno, OP_EQ, 0);
- tt_ptr_op(retptr, OP_EQ, buf);
- tt_str_op(buf, OP_EQ, "GH");
+ tt_int_op(status, OP_EQ, IO_STREAM_OKAY);
+ tt_str_op(buf, OP_EQ, "AB");
errno = 0;
/* Check for EOF */
- retptr = fgets(buf, sizeof(buf), test_stream);
+ status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1);
tt_int_op(errno, OP_EQ, 0);
- tt_ptr_op(retptr, OP_EQ, NULL);
- retval = feof(test_stream);
- tt_int_op(retval, OP_NE, 0);
+ tt_int_op(status, OP_EQ, IO_STREAM_CLOSED);
errno = 0;
- /* Check that buf is unchanged according to C99 and C11 */
- tt_str_op(buf, OP_EQ, "GH");
-
done:
- if (test_stream != NULL)
- fclose(test_stream);
if (test_pipe[0] != -1)
close(test_pipe[0]);
if (test_pipe[1] != -1)
close(test_pipe[1]);
}
-#endif
+
+#endif // _WIN32
/**
* Test for format_hex_number_sigsafe()
@@ -5664,6 +5737,10 @@ test_util_htonll(void *arg)
#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) }
+
#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))
@@ -5688,7 +5765,11 @@ struct testcase_t util_tests[] = {
UTIL_LEGACY(strmisc),
UTIL_TEST(parse_integer, 0),
UTIL_LEGACY(pow2),
- UTIL_LEGACY(gzip),
+ COMPRESS(zlib, "deflate"),
+ COMPRESS(gzip, "gzip"),
+ COMPRESS(lzma, "x-tor-lzma"),
+ COMPRESS(zstd, "x-zstd"),
+ COMPRESS(none, "identity"),
UTIL_TEST(gzip_compression_bomb, TT_FORK),
UTIL_LEGACY(datadir),
UTIL_LEGACY(memarea),
@@ -5712,7 +5793,7 @@ struct testcase_t util_tests[] = {
UTIL_TEST(num_cpus, 0),
UTIL_TEST_WIN_ONLY(load_win_lib, 0),
UTIL_TEST_NO_WIN(exit_status, 0),
- UTIL_TEST_NO_WIN(fgets_eagain, 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),
diff --git a/src/test/test_util_format.c b/src/test/test_util_format.c
index 21a6923c6d..ea0a86499f 100644
--- a/src/test/test_util_format.c
+++ b/src/test/test_util_format.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2016, The Tor Project, Inc. */
+/* Copyright (c) 2010-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -133,48 +133,54 @@ test_util_format_base64_encode(void *ignored)
}
static void
-test_util_format_base64_decode_nopad(void *ignored)
+test_util_format_base64_decode_oddsize(void *ignored)
{
(void)ignored;
int res;
int i;
char *src;
- uint8_t *dst, *real_dst;
- uint8_t expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65};
+ 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);
- real_dst = tor_malloc_zero(10);
for (i=0;i<256;i++) {
src[i] = (char)i;
}
- res = base64_decode_nopad(dst, 1, src, SIZE_T_CEILING);
- tt_int_op(res, OP_EQ, -1);
-
- res = base64_decode_nopad(dst, 1, src, 5);
+ res = base64_decode(dst, 1, src, 5);
tt_int_op(res, OP_EQ, -1);
const char *s = "SGVsbG8gd29ybGQ";
- res = base64_decode_nopad(dst, 1000, s, strlen(s));
+ 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_nopad(dst, 9, s, strlen(s));
+ 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_nopad(real_dst, 10, real_src, 10);
+ 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);
- tor_free(real_dst);
}
static void
@@ -196,13 +202,10 @@ test_util_format_base64_decode(void *ignored)
src[i] = (char)i;
}
- res = base64_decode(dst, 1, src, SIZE_T_CEILING);
+ res = base64_decode(dst, 1, src, 100);
tt_int_op(res, OP_EQ, -1);
- res = base64_decode(dst, SIZE_T_CEILING+1, src, 10);
- tt_int_op(res, OP_EQ, -1);
-
- res = base64_decode(dst, 1, real_src, SIZE_MAX/3+1);
+ res = base64_decode(dst, 1, real_src, 10);
tt_int_op(res, OP_EQ, -1);
const char *s = "T3BhIG11bmRv";
@@ -370,11 +373,39 @@ test_util_format_base32_decode(void *arg)
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_nopad", test_util_format_base64_decode_nopad, 0,
+ { "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 },
@@ -382,6 +413,7 @@ struct testcase_t util_format_tests[] = {
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/test/test_util_process.c b/src/test/test_util_process.c
index 4e75b97f3d..70292f2287 100644
--- a/src/test/test_util_process.c
+++ b/src/test/test_util_process.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2016, The Tor Project, Inc. */
+/* Copyright (c) 2010-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define UTIL_PROCESS_PRIVATE
diff --git a/src/test/test_util_slow.c b/src/test/test_util_slow.c
index 1e7160598c..3e5d78948d 100644
--- a/src/test/test_util_slow.c
+++ b/src/test/test_util_slow.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -242,7 +242,7 @@ test_util_spawn_background_partial_read_impl(int exit_early)
#else
/* Check that we didn't read the end of file last time */
tt_assert(!eof);
- pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf,
+ pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf,
sizeof(stdout_buf) - 1, NULL, &eof);
#endif
log_info(LD_GENERAL, "tor_read_all_handle() returned %d", (int)pos);
@@ -273,7 +273,7 @@ test_util_spawn_background_partial_read_impl(int exit_early)
#else
if (!eof) {
/* We should have got all the data, but maybe not the EOF flag */
- pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf,
+ 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);
diff --git a/src/test/test_workqueue.c b/src/test/test_workqueue.c
index ccb8d0c8ca..10714457f7 100644
--- a/src/test/test_workqueue.c
+++ b/src/test/test_workqueue.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/test/testing_common.c b/src/test/testing_common.c
index 07fd9e0afd..d7e36edbc0 100644
--- a/src/test/testing_common.c
+++ b/src/test/testing_common.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
extern const char tor_git_revision[];
@@ -39,7 +39,6 @@ const char tor_git_revision[] = "";
#ifdef USE_DMALLOC
#include <dmalloc.h>
-#include <openssl/crypto.h>
#include "main.h"
#endif
@@ -239,14 +238,15 @@ main(int c, const char **v)
#ifdef USE_DMALLOC
{
- int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_);
- tor_assert(r);
+ int r = crypto_use_tor_alloc_functions();
+ tor_assert(r == 0);
}
#endif
update_approx_time(time(NULL));
options = options_new();
tor_threads_init();
+ tor_compress_init();
network_init();
diff --git a/src/test/testing_rsakeys.c b/src/test/testing_rsakeys.c
index 134770bb0d..5dff233a69 100644
--- a/src/test/testing_rsakeys.c
+++ b/src/test/testing_rsakeys.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2016, The Tor Project, Inc. */
+ * Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/tools/include.am b/src/tools/include.am
index d0185b5887..5eadb03a05 100644
--- a/src/tools/include.am
+++ b/src/tools/include.am
@@ -1,5 +1,4 @@
bin_PROGRAMS+= src/tools/tor-resolve src/tools/tor-gencert
-noinst_PROGRAMS+= src/tools/tor-checkkey
if COVERAGE_ENABLED
noinst_PROGRAMS+= src/tools/tor-cov-resolve src/tools/tor-cov-gencert
@@ -43,14 +42,4 @@ src_tools_tor_cov_gencert_LDADD = src/common/libor-testing.a \
@TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
endif
-src_tools_tor_checkkey_SOURCES = src/tools/tor-checkkey.c
-src_tools_tor_checkkey_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@
-src_tools_tor_checkkey_LDADD = src/common/libor.a \
- src/common/libor-ctime.a \
- src/common/libor-crypto.a \
- $(LIBKECCAK_TINY) \
- $(LIBDONNA) \
- @TOR_LIB_MATH@ @TOR_ZLIB_LIBS@ @TOR_OPENSSL_LIBS@ \
- @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
-
EXTRA_DIST += src/tools/tor-fw-helper/README
diff --git a/src/tools/tor-checkkey.c b/src/tools/tor-checkkey.c
deleted file mode 100644
index 3e16fd0336..0000000000
--- a/src/tools/tor-checkkey.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Copyright (c) 2008-2015, The Tor Project, Inc. */
-/* See LICENSE for licensing information */
-
-#include "orconfig.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "crypto.h"
-#include "torlog.h"
-#include "util.h"
-#include "compat.h"
-#include "compat_openssl.h"
-#include <openssl/bn.h>
-#include <openssl/rsa.h>
-
-int
-main(int c, char **v)
-{
- crypto_pk_t *env;
- char *str;
- RSA *rsa;
- int wantdigest=0;
- int fname_idx;
- char *fname=NULL;
- init_logging(1);
-
- if (c < 2) {
- fprintf(stderr, "Hi. I'm tor-checkkey. Tell me a filename that "
- "has a PEM-encoded RSA public key (like in a cert) and I'll "
- "dump the modulus. Use the --digest option too and I'll "
- "dump the digest.\n");
- return 1;
- }
-
- if (crypto_global_init(0, NULL, NULL)) {
- fprintf(stderr, "Couldn't initialize crypto library.\n");
- return 1;
- }
-
- if (!strcmp(v[1], "--digest")) {
- wantdigest = 1;
- fname_idx = 2;
- if (c<3) {
- fprintf(stderr, "too few arguments");
- return 1;
- }
- } else {
- wantdigest = 0;
- fname_idx = 1;
- }
-
- fname = expand_filename(v[fname_idx]);
- str = read_file_to_str(fname, 0, NULL);
- tor_free(fname);
- if (!str) {
- fprintf(stderr, "Couldn't read %s\n", v[fname_idx]);
- return 1;
- }
-
- env = crypto_pk_new();
- if (crypto_pk_read_public_key_from_string(env, str, strlen(str))<0) {
- fprintf(stderr, "Couldn't parse key.\n");
- return 1;
- }
- tor_free(str);
-
- if (wantdigest) {
- char digest[HEX_DIGEST_LEN+1];
- if (crypto_pk_get_fingerprint(env, digest, 0)<0)
- return 1;
- printf("%s\n",digest);
- } else {
- rsa = crypto_pk_get_rsa_(env);
-
- const BIGNUM *rsa_n;
-#ifdef OPENSSL_1_1_API
- const BIGNUM *rsa_e, *rsa_d;
- RSA_get0_key(rsa, &rsa_n, &rsa_e, &rsa_d);
-#else
- rsa_n = rsa->n;
-#endif
- str = BN_bn2hex(rsa_n);
-
- printf("%s\n", str);
- }
-
- return 0;
-}
-
diff --git a/src/tools/tor-gencert.c b/src/tools/tor-gencert.c
index db308485e6..395535697f 100644
--- a/src/tools/tor-gencert.c
+++ b/src/tools/tor-gencert.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* Copyright (c) 2007-2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/tools/tor-resolve.c b/src/tools/tor-resolve.c
index 6ac866d3c0..1e2409a131 100644
--- a/src/tools/tor-resolve.c
+++ b/src/tools/tor-resolve.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
- * Copyright (c) 2007-2015, The Tor Project, Inc.
+ * Copyright (c) 2007-2017, The Tor Project, Inc.
*/
/* See LICENSE for licensing information */
diff --git a/src/trace/debug.h b/src/trace/debug.h
new file mode 100644
index 0000000000..3a1652543a
--- /dev/null
+++ b/src/trace/debug.h
@@ -0,0 +1,25 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_TRACE_LOG_DEBUG_H
+#define TOR_TRACE_LOG_DEBUG_H
+
+#include "torlog.h"
+
+/* Stringify pre-processor trick. */
+#define XSTR(d) STR(d)
+#define STR(s) #s
+
+/* Send every event to a debug log level. This is useful to debug new trace
+ * events without implementing them for a specific event tracing framework.
+ * Note that the arguments are ignored since at this step we do not know the
+ * types and amount there is. */
+
+/* Example on how to map a tracepoint to log_debug(). */
+#undef tor_trace
+#define tor_trace(subsystem, name, args...) \
+ log_debug(LD_GENERAL, "Trace event \"" XSTR(name) "\" from " \
+ "\"" XSTR(subsystem) "\" hit. " \
+ "(line "XSTR(__LINE__) ")")
+
+#endif /* TOR_TRACE_LOG_DEBUG_H */
diff --git a/src/trace/events.h b/src/trace/events.h
new file mode 100644
index 0000000000..1be1fd596e
--- /dev/null
+++ b/src/trace/events.h
@@ -0,0 +1,45 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file events.h
+ * \brief Header file for Tor event tracing.
+ **/
+
+#ifndef TOR_TRACE_EVENTS_H
+#define TOR_TRACE_EVENTS_H
+
+/*
+ * The following defines a generic event tracing function name that has to be
+ * used to trace events in the code base.
+ *
+ * That generic function is then defined by a event tracing framework. For
+ * instance, the "log debug" framework sends all trace events to log_debug()
+ * which is defined in src/trace/debug.h which can only be enabled at compile
+ * time (--enable-event-tracing-debug).
+ *
+ * By default, every trace events in the code base are replaced by a NOP. See
+ * doc/HACKING/Tracing.md for more information on how to use event tracing or
+ * add events.
+ */
+
+#ifdef TOR_EVENT_TRACING_ENABLED
+/* Map every trace event to a per subsystem macro. */
+#define tor_trace(subsystem, name, ...) \
+ tor_trace_##subsystem(name, __VA_ARGS__)
+
+/* Enable event tracing for the debug framework where all trace events are
+ * mapped to a log_debug(). */
+#ifdef USE_EVENT_TRACING_DEBUG
+#include "trace/debug.h"
+#endif
+
+#else /* TOR_EVENT_TRACING_ENABLED */
+
+/* Reaching this point, we NOP every event declaration because event tracing
+ * is not been enabled at compile time. */
+#define tor_trace(subsystem, name, args...)
+
+#endif /* TOR_EVENT_TRACING_ENABLED */
+
+#endif /* TOR_TRACE_EVENTS_H */
diff --git a/src/trace/include.am b/src/trace/include.am
new file mode 100644
index 0000000000..3285b04de6
--- /dev/null
+++ b/src/trace/include.am
@@ -0,0 +1,22 @@
+# Include the src/ so we can use the trace/events.h statement when including
+# any file in that directory.
+AM_CPPFLAGS += -I$(srcdir)/src
+
+noinst_LIBRARIES += \
+ src/trace/libor-trace.a
+LIBOR_TRACE_A_SOURCES = \
+ src/trace/trace.c
+
+TRACEHEADERS = \
+ src/trace/trace.h \
+ src/trace/events.h
+
+if USE_EVENT_TRACING_DEBUG
+TRACEHEADERS += \
+ src/trace/debug.h
+endif
+
+# Library source files.
+src_trace_libor_trace_a_SOURCES = $(LIBOR_TRACE_A_SOURCES)
+
+noinst_HEADERS+= $(TRACEHEADERS)
diff --git a/src/trace/trace.c b/src/trace/trace.c
new file mode 100644
index 0000000000..fcdb80091f
--- /dev/null
+++ b/src/trace/trace.c
@@ -0,0 +1,11 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "trace.h"
+
+/** Initialize the tracing library. */
+void
+tor_trace_init(void)
+{
+}
+
diff --git a/src/trace/trace.h b/src/trace/trace.h
new file mode 100644
index 0000000000..28fcd8eea8
--- /dev/null
+++ b/src/trace/trace.h
@@ -0,0 +1,10 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_TRACE_TRACE_H
+#define TOR_TRACE_TRACE_H
+
+void tor_trace_init(void);
+
+#endif // TOR_TRACE_TRACE_H
+
diff --git a/src/trunnel/hs/cell_common.c b/src/trunnel/hs/cell_common.c
index 830f2260ee..b7f19ffc60 100644
--- a/src/trunnel/hs/cell_common.c
+++ b/src/trunnel/hs/cell_common.c
@@ -28,10 +28,10 @@ int cellcommon_deadcode_dummy__ = 0;
} \
} while (0)
-cell_extension_fields_t *
-cell_extension_fields_new(void)
+trn_cell_extension_fields_t *
+trn_cell_extension_fields_new(void)
{
- cell_extension_fields_t *val = trunnel_calloc(1, sizeof(cell_extension_fields_t));
+ trn_cell_extension_fields_t *val = trunnel_calloc(1, sizeof(trn_cell_extension_fields_t));
if (NULL == val)
return NULL;
return val;
@@ -40,7 +40,7 @@ cell_extension_fields_new(void)
/** Release all storage held inside 'obj', but do not free 'obj'.
*/
static void
-cell_extension_fields_clear(cell_extension_fields_t *obj)
+trn_cell_extension_fields_clear(trn_cell_extension_fields_t *obj)
{
(void) obj;
TRUNNEL_DYNARRAY_WIPE(&obj->field);
@@ -48,62 +48,62 @@ cell_extension_fields_clear(cell_extension_fields_t *obj)
}
void
-cell_extension_fields_free(cell_extension_fields_t *obj)
+trn_cell_extension_fields_free(trn_cell_extension_fields_t *obj)
{
if (obj == NULL)
return;
- cell_extension_fields_clear(obj);
- trunnel_memwipe(obj, sizeof(cell_extension_fields_t));
+ trn_cell_extension_fields_clear(obj);
+ trunnel_memwipe(obj, sizeof(trn_cell_extension_fields_t));
trunnel_free_(obj);
}
uint8_t
-cell_extension_fields_get_field_type(const cell_extension_fields_t *inp)
+trn_cell_extension_fields_get_field_type(const trn_cell_extension_fields_t *inp)
{
return inp->field_type;
}
int
-cell_extension_fields_set_field_type(cell_extension_fields_t *inp, uint8_t val)
+trn_cell_extension_fields_set_field_type(trn_cell_extension_fields_t *inp, uint8_t val)
{
inp->field_type = val;
return 0;
}
uint8_t
-cell_extension_fields_get_field_len(const cell_extension_fields_t *inp)
+trn_cell_extension_fields_get_field_len(const trn_cell_extension_fields_t *inp)
{
return inp->field_len;
}
int
-cell_extension_fields_set_field_len(cell_extension_fields_t *inp, uint8_t val)
+trn_cell_extension_fields_set_field_len(trn_cell_extension_fields_t *inp, uint8_t val)
{
inp->field_len = val;
return 0;
}
size_t
-cell_extension_fields_getlen_field(const cell_extension_fields_t *inp)
+trn_cell_extension_fields_getlen_field(const trn_cell_extension_fields_t *inp)
{
return TRUNNEL_DYNARRAY_LEN(&inp->field);
}
uint8_t
-cell_extension_fields_get_field(cell_extension_fields_t *inp, size_t idx)
+trn_cell_extension_fields_get_field(trn_cell_extension_fields_t *inp, size_t idx)
{
return TRUNNEL_DYNARRAY_GET(&inp->field, idx);
}
uint8_t
-cell_extension_fields_getconst_field(const cell_extension_fields_t *inp, size_t idx)
+trn_cell_extension_fields_getconst_field(const trn_cell_extension_fields_t *inp, size_t idx)
{
- return cell_extension_fields_get_field((cell_extension_fields_t*)inp, idx);
+ return trn_cell_extension_fields_get_field((trn_cell_extension_fields_t*)inp, idx);
}
int
-cell_extension_fields_set_field(cell_extension_fields_t *inp, size_t idx, uint8_t elt)
+trn_cell_extension_fields_set_field(trn_cell_extension_fields_t *inp, size_t idx, uint8_t elt)
{
TRUNNEL_DYNARRAY_SET(&inp->field, idx, elt);
return 0;
}
int
-cell_extension_fields_add_field(cell_extension_fields_t *inp, uint8_t elt)
+trn_cell_extension_fields_add_field(trn_cell_extension_fields_t *inp, uint8_t elt)
{
#if SIZE_MAX >= UINT8_MAX
if (inp->field.n_ == UINT8_MAX)
@@ -117,17 +117,17 @@ cell_extension_fields_add_field(cell_extension_fields_t *inp, uint8_t elt)
}
uint8_t *
-cell_extension_fields_getarray_field(cell_extension_fields_t *inp)
+trn_cell_extension_fields_getarray_field(trn_cell_extension_fields_t *inp)
{
return inp->field.elts_;
}
const uint8_t *
-cell_extension_fields_getconstarray_field(const cell_extension_fields_t *inp)
+trn_cell_extension_fields_getconstarray_field(const trn_cell_extension_fields_t *inp)
{
- return (const uint8_t *)cell_extension_fields_getarray_field((cell_extension_fields_t*)inp);
+ return (const uint8_t *)trn_cell_extension_fields_getarray_field((trn_cell_extension_fields_t*)inp);
}
int
-cell_extension_fields_setlen_field(cell_extension_fields_t *inp, size_t newlen)
+trn_cell_extension_fields_setlen_field(trn_cell_extension_fields_t *inp, size_t newlen)
{
uint8_t *newptr;
#if UINT8_MAX < SIZE_MAX
@@ -147,7 +147,7 @@ cell_extension_fields_setlen_field(cell_extension_fields_t *inp, size_t newlen)
return -1;
}
const char *
-cell_extension_fields_check(const cell_extension_fields_t *obj)
+trn_cell_extension_fields_check(const trn_cell_extension_fields_t *obj)
{
if (obj == NULL)
return "Object was NULL";
@@ -159,11 +159,11 @@ cell_extension_fields_check(const cell_extension_fields_t *obj)
}
ssize_t
-cell_extension_fields_encoded_len(const cell_extension_fields_t *obj)
+trn_cell_extension_fields_encoded_len(const trn_cell_extension_fields_t *obj)
{
ssize_t result = 0;
- if (NULL != cell_extension_fields_check(obj))
+ if (NULL != trn_cell_extension_fields_check(obj))
return -1;
@@ -178,24 +178,24 @@ cell_extension_fields_encoded_len(const cell_extension_fields_t *obj)
return result;
}
int
-cell_extension_fields_clear_errors(cell_extension_fields_t *obj)
+trn_cell_extension_fields_clear_errors(trn_cell_extension_fields_t *obj)
{
int r = obj->trunnel_error_code_;
obj->trunnel_error_code_ = 0;
return r;
}
ssize_t
-cell_extension_fields_encode(uint8_t *output, const size_t avail, const cell_extension_fields_t *obj)
+trn_cell_extension_fields_encode(uint8_t *output, const size_t avail, const trn_cell_extension_fields_t *obj)
{
ssize_t result = 0;
size_t written = 0;
uint8_t *ptr = output;
const char *msg;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
- const ssize_t encoded_len = cell_extension_fields_encoded_len(obj);
+ const ssize_t encoded_len = trn_cell_extension_fields_encoded_len(obj);
#endif
- if (NULL != (msg = cell_extension_fields_check(obj)))
+ if (NULL != (msg = trn_cell_extension_fields_check(obj)))
goto check_failed;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
@@ -252,11 +252,11 @@ cell_extension_fields_encode(uint8_t *output, const size_t avail, const cell_ext
return result;
}
-/** As cell_extension_fields_parse(), but do not allocate the output
- * object.
+/** As trn_cell_extension_fields_parse(), but do not allocate the
+ * output object.
*/
static ssize_t
-cell_extension_fields_parse_into(cell_extension_fields_t *obj, const uint8_t *input, const size_t len_in)
+trn_cell_extension_fields_parse_into(trn_cell_extension_fields_t *obj, const uint8_t *input, const size_t len_in)
{
const uint8_t *ptr = input;
size_t remaining = len_in;
@@ -290,23 +290,23 @@ cell_extension_fields_parse_into(cell_extension_fields_t *obj, const uint8_t *in
}
ssize_t
-cell_extension_fields_parse(cell_extension_fields_t **output, const uint8_t *input, const size_t len_in)
+trn_cell_extension_fields_parse(trn_cell_extension_fields_t **output, const uint8_t *input, const size_t len_in)
{
ssize_t result;
- *output = cell_extension_fields_new();
+ *output = trn_cell_extension_fields_new();
if (NULL == *output)
return -1;
- result = cell_extension_fields_parse_into(*output, input, len_in);
+ result = trn_cell_extension_fields_parse_into(*output, input, len_in);
if (result < 0) {
- cell_extension_fields_free(*output);
+ trn_cell_extension_fields_free(*output);
*output = NULL;
}
return result;
}
-cell_extension_t *
-cell_extension_new(void)
+trn_cell_extension_t *
+trn_cell_extension_new(void)
{
- cell_extension_t *val = trunnel_calloc(1, sizeof(cell_extension_t));
+ trn_cell_extension_t *val = trunnel_calloc(1, sizeof(trn_cell_extension_t));
if (NULL == val)
return NULL;
return val;
@@ -315,14 +315,14 @@ cell_extension_new(void)
/** Release all storage held inside 'obj', but do not free 'obj'.
*/
static void
-cell_extension_clear(cell_extension_t *obj)
+trn_cell_extension_clear(trn_cell_extension_t *obj)
{
(void) obj;
{
unsigned idx;
for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) {
- cell_extension_fields_free(TRUNNEL_DYNARRAY_GET(&obj->fields, idx));
+ trn_cell_extension_fields_free(TRUNNEL_DYNARRAY_GET(&obj->fields, idx));
}
}
TRUNNEL_DYNARRAY_WIPE(&obj->fields);
@@ -330,92 +330,92 @@ cell_extension_clear(cell_extension_t *obj)
}
void
-cell_extension_free(cell_extension_t *obj)
+trn_cell_extension_free(trn_cell_extension_t *obj)
{
if (obj == NULL)
return;
- cell_extension_clear(obj);
- trunnel_memwipe(obj, sizeof(cell_extension_t));
+ trn_cell_extension_clear(obj);
+ trunnel_memwipe(obj, sizeof(trn_cell_extension_t));
trunnel_free_(obj);
}
uint8_t
-cell_extension_get_num(const cell_extension_t *inp)
+trn_cell_extension_get_num(const trn_cell_extension_t *inp)
{
return inp->num;
}
int
-cell_extension_set_num(cell_extension_t *inp, uint8_t val)
+trn_cell_extension_set_num(trn_cell_extension_t *inp, uint8_t val)
{
inp->num = val;
return 0;
}
size_t
-cell_extension_getlen_fields(const cell_extension_t *inp)
+trn_cell_extension_getlen_fields(const trn_cell_extension_t *inp)
{
return TRUNNEL_DYNARRAY_LEN(&inp->fields);
}
-struct cell_extension_fields_st *
-cell_extension_get_fields(cell_extension_t *inp, size_t idx)
+struct trn_cell_extension_fields_st *
+trn_cell_extension_get_fields(trn_cell_extension_t *inp, size_t idx)
{
return TRUNNEL_DYNARRAY_GET(&inp->fields, idx);
}
- const struct cell_extension_fields_st *
-cell_extension_getconst_fields(const cell_extension_t *inp, size_t idx)
+ const struct trn_cell_extension_fields_st *
+trn_cell_extension_getconst_fields(const trn_cell_extension_t *inp, size_t idx)
{
- return cell_extension_get_fields((cell_extension_t*)inp, idx);
+ return trn_cell_extension_get_fields((trn_cell_extension_t*)inp, idx);
}
int
-cell_extension_set_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt)
+trn_cell_extension_set_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt)
{
- cell_extension_fields_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->fields, idx);
+ trn_cell_extension_fields_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->fields, idx);
if (oldval && oldval != elt)
- cell_extension_fields_free(oldval);
- return cell_extension_set0_fields(inp, idx, elt);
+ trn_cell_extension_fields_free(oldval);
+ return trn_cell_extension_set0_fields(inp, idx, elt);
}
int
-cell_extension_set0_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt)
+trn_cell_extension_set0_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt)
{
TRUNNEL_DYNARRAY_SET(&inp->fields, idx, elt);
return 0;
}
int
-cell_extension_add_fields(cell_extension_t *inp, struct cell_extension_fields_st * elt)
+trn_cell_extension_add_fields(trn_cell_extension_t *inp, struct trn_cell_extension_fields_st * elt)
{
#if SIZE_MAX >= UINT8_MAX
if (inp->fields.n_ == UINT8_MAX)
goto trunnel_alloc_failed;
#endif
- TRUNNEL_DYNARRAY_ADD(struct cell_extension_fields_st *, &inp->fields, elt, {});
+ TRUNNEL_DYNARRAY_ADD(struct trn_cell_extension_fields_st *, &inp->fields, elt, {});
return 0;
trunnel_alloc_failed:
TRUNNEL_SET_ERROR_CODE(inp);
return -1;
}
-struct cell_extension_fields_st * *
-cell_extension_getarray_fields(cell_extension_t *inp)
+struct trn_cell_extension_fields_st * *
+trn_cell_extension_getarray_fields(trn_cell_extension_t *inp)
{
return inp->fields.elts_;
}
-const struct cell_extension_fields_st * const *
-cell_extension_getconstarray_fields(const cell_extension_t *inp)
+const struct trn_cell_extension_fields_st * const *
+trn_cell_extension_getconstarray_fields(const trn_cell_extension_t *inp)
{
- return (const struct cell_extension_fields_st * const *)cell_extension_getarray_fields((cell_extension_t*)inp);
+ return (const struct trn_cell_extension_fields_st * const *)trn_cell_extension_getarray_fields((trn_cell_extension_t*)inp);
}
int
-cell_extension_setlen_fields(cell_extension_t *inp, size_t newlen)
+trn_cell_extension_setlen_fields(trn_cell_extension_t *inp, size_t newlen)
{
- struct cell_extension_fields_st * *newptr;
+ struct trn_cell_extension_fields_st * *newptr;
#if UINT8_MAX < SIZE_MAX
if (newlen > UINT8_MAX)
goto trunnel_alloc_failed;
#endif
newptr = trunnel_dynarray_setlen(&inp->fields.allocated_,
&inp->fields.n_, inp->fields.elts_, newlen,
- sizeof(inp->fields.elts_[0]), (trunnel_free_fn_t) cell_extension_fields_free,
+ sizeof(inp->fields.elts_[0]), (trunnel_free_fn_t) trn_cell_extension_fields_free,
&inp->trunnel_error_code_);
if (newlen != 0 && newptr == NULL)
goto trunnel_alloc_failed;
@@ -426,7 +426,7 @@ cell_extension_setlen_fields(cell_extension_t *inp, size_t newlen)
return -1;
}
const char *
-cell_extension_check(const cell_extension_t *obj)
+trn_cell_extension_check(const trn_cell_extension_t *obj)
{
if (obj == NULL)
return "Object was NULL";
@@ -437,7 +437,7 @@ cell_extension_check(const cell_extension_t *obj)
unsigned idx;
for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) {
- if (NULL != (msg = cell_extension_fields_check(TRUNNEL_DYNARRAY_GET(&obj->fields, idx))))
+ if (NULL != (msg = trn_cell_extension_fields_check(TRUNNEL_DYNARRAY_GET(&obj->fields, idx))))
return msg;
}
}
@@ -447,46 +447,46 @@ cell_extension_check(const cell_extension_t *obj)
}
ssize_t
-cell_extension_encoded_len(const cell_extension_t *obj)
+trn_cell_extension_encoded_len(const trn_cell_extension_t *obj)
{
ssize_t result = 0;
- if (NULL != cell_extension_check(obj))
+ if (NULL != trn_cell_extension_check(obj))
return -1;
/* Length of u8 num */
result += 1;
- /* Length of struct cell_extension_fields fields[num] */
+ /* Length of struct trn_cell_extension_fields fields[num] */
{
unsigned idx;
for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) {
- result += cell_extension_fields_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->fields, idx));
+ result += trn_cell_extension_fields_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->fields, idx));
}
}
return result;
}
int
-cell_extension_clear_errors(cell_extension_t *obj)
+trn_cell_extension_clear_errors(trn_cell_extension_t *obj)
{
int r = obj->trunnel_error_code_;
obj->trunnel_error_code_ = 0;
return r;
}
ssize_t
-cell_extension_encode(uint8_t *output, const size_t avail, const cell_extension_t *obj)
+trn_cell_extension_encode(uint8_t *output, const size_t avail, const trn_cell_extension_t *obj)
{
ssize_t result = 0;
size_t written = 0;
uint8_t *ptr = output;
const char *msg;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
- const ssize_t encoded_len = cell_extension_encoded_len(obj);
+ const ssize_t encoded_len = trn_cell_extension_encoded_len(obj);
#endif
- if (NULL != (msg = cell_extension_check(obj)))
+ if (NULL != (msg = trn_cell_extension_check(obj)))
goto check_failed;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
@@ -500,13 +500,13 @@ cell_extension_encode(uint8_t *output, const size_t avail, const cell_extension_
trunnel_set_uint8(ptr, (obj->num));
written += 1; ptr += 1;
- /* Encode struct cell_extension_fields fields[num] */
+ /* Encode struct trn_cell_extension_fields fields[num] */
{
unsigned idx;
for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) {
trunnel_assert(written <= avail);
- result = cell_extension_fields_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->fields, idx));
+ result = trn_cell_extension_fields_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->fields, idx));
if (result < 0)
goto fail; /* XXXXXXX !*/
written += result; ptr += result;
@@ -537,10 +537,11 @@ cell_extension_encode(uint8_t *output, const size_t avail, const cell_extension_
return result;
}
-/** As cell_extension_parse(), but do not allocate the output object.
+/** As trn_cell_extension_parse(), but do not allocate the output
+ * object.
*/
static ssize_t
-cell_extension_parse_into(cell_extension_t *obj, const uint8_t *input, const size_t len_in)
+trn_cell_extension_parse_into(trn_cell_extension_t *obj, const uint8_t *input, const size_t len_in)
{
const uint8_t *ptr = input;
size_t remaining = len_in;
@@ -552,18 +553,18 @@ cell_extension_parse_into(cell_extension_t *obj, const uint8_t *input, const siz
obj->num = (trunnel_get_uint8(ptr));
remaining -= 1; ptr += 1;
- /* Parse struct cell_extension_fields fields[num] */
- TRUNNEL_DYNARRAY_EXPAND(cell_extension_fields_t *, &obj->fields, obj->num, {});
+ /* Parse struct trn_cell_extension_fields fields[num] */
+ TRUNNEL_DYNARRAY_EXPAND(trn_cell_extension_fields_t *, &obj->fields, obj->num, {});
{
- cell_extension_fields_t * elt;
+ trn_cell_extension_fields_t * elt;
unsigned idx;
for (idx = 0; idx < obj->num; ++idx) {
- result = cell_extension_fields_parse(&elt, ptr, remaining);
+ result = trn_cell_extension_fields_parse(&elt, ptr, remaining);
if (result < 0)
goto relay_fail;
trunnel_assert((size_t)result <= remaining);
remaining -= result; ptr += result;
- TRUNNEL_DYNARRAY_ADD(cell_extension_fields_t *, &obj->fields, elt, {cell_extension_fields_free(elt);});
+ TRUNNEL_DYNARRAY_ADD(trn_cell_extension_fields_t *, &obj->fields, elt, {trn_cell_extension_fields_free(elt);});
}
}
trunnel_assert(ptr + remaining == input + len_in);
@@ -579,15 +580,15 @@ cell_extension_parse_into(cell_extension_t *obj, const uint8_t *input, const siz
}
ssize_t
-cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in)
+trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in)
{
ssize_t result;
- *output = cell_extension_new();
+ *output = trn_cell_extension_new();
if (NULL == *output)
return -1;
- result = cell_extension_parse_into(*output, input, len_in);
+ result = trn_cell_extension_parse_into(*output, input, len_in);
if (result < 0) {
- cell_extension_free(*output);
+ trn_cell_extension_free(*output);
*output = NULL;
}
return result;
diff --git a/src/trunnel/hs/cell_common.h b/src/trunnel/hs/cell_common.h
index 8999f7da40..4d98a54cf4 100644
--- a/src/trunnel/hs/cell_common.h
+++ b/src/trunnel/hs/cell_common.h
@@ -8,191 +8,196 @@
#include <stdint.h>
#include "trunnel.h"
-#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CELL_EXTENSION_FIELDS)
-struct cell_extension_fields_st {
+#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_EXTENSION_FIELDS)
+struct trn_cell_extension_fields_st {
uint8_t field_type;
uint8_t field_len;
TRUNNEL_DYNARRAY_HEAD(, uint8_t) field;
uint8_t trunnel_error_code_;
};
#endif
-typedef struct cell_extension_fields_st cell_extension_fields_t;
-#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CELL_EXTENSION)
-struct cell_extension_st {
+typedef struct trn_cell_extension_fields_st trn_cell_extension_fields_t;
+#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_EXTENSION)
+struct trn_cell_extension_st {
uint8_t num;
- TRUNNEL_DYNARRAY_HEAD(, struct cell_extension_fields_st *) fields;
+ TRUNNEL_DYNARRAY_HEAD(, struct trn_cell_extension_fields_st *) fields;
uint8_t trunnel_error_code_;
};
#endif
-typedef struct cell_extension_st cell_extension_t;
-/** Return a newly allocated cell_extension_fields with all elements
- * set to zero.
- */
-cell_extension_fields_t *cell_extension_fields_new(void);
-/** Release all storage held by the cell_extension_fields in 'victim'.
- * (Do nothing if 'victim' is NULL.)
- */
-void cell_extension_fields_free(cell_extension_fields_t *victim);
-/** Try to parse a cell_extension_fields from the buffer in 'input',
- * using up to 'len_in' bytes from the input buffer. On success,
- * return the number of bytes consumed and set *output to the newly
- * allocated cell_extension_fields_t. On failure, return -2 if the
- * input appears truncated, and -1 if the input is otherwise invalid.
- */
-ssize_t cell_extension_fields_parse(cell_extension_fields_t **output, const uint8_t *input, const size_t len_in);
+typedef struct trn_cell_extension_st trn_cell_extension_t;
+/** Return a newly allocated trn_cell_extension_fields with all
+ * elements set to zero.
+ */
+trn_cell_extension_fields_t *trn_cell_extension_fields_new(void);
+/** Release all storage held by the trn_cell_extension_fields in
+ * 'victim'. (Do nothing if 'victim' is NULL.)
+ */
+void trn_cell_extension_fields_free(trn_cell_extension_fields_t *victim);
+/** Try to parse a trn_cell_extension_fields from the buffer in
+ * 'input', using up to 'len_in' bytes from the input buffer. On
+ * success, return the number of bytes consumed and set *output to the
+ * newly allocated trn_cell_extension_fields_t. On failure, return -2
+ * if the input appears truncated, and -1 if the input is otherwise
+ * invalid.
+ */
+ssize_t trn_cell_extension_fields_parse(trn_cell_extension_fields_t **output, const uint8_t *input, const size_t len_in);
/** Return the number of bytes we expect to need to encode the
- * cell_extension_fields in 'obj'. On failure, return a negative
+ * trn_cell_extension_fields in 'obj'. On failure, return a negative
* value. Note that this value may be an overestimate, and can even be
* an underestimate for certain unencodeable objects.
*/
-ssize_t cell_extension_fields_encoded_len(const cell_extension_fields_t *obj);
-/** Try to encode the cell_extension_fields from 'input' into the
+ssize_t trn_cell_extension_fields_encoded_len(const trn_cell_extension_fields_t *obj);
+/** Try to encode the trn_cell_extension_fields from 'input' into the
* buffer at 'output', using up to 'avail' bytes of the output buffer.
* On success, return the number of bytes used. On failure, return -2
* if the buffer was not long enough, and -1 if the input was invalid.
*/
-ssize_t cell_extension_fields_encode(uint8_t *output, size_t avail, const cell_extension_fields_t *input);
-/** Check whether the internal state of the cell_extension_fields in
- * 'obj' is consistent. Return NULL if it is, and a short message if
- * it is not.
+ssize_t trn_cell_extension_fields_encode(uint8_t *output, size_t avail, const trn_cell_extension_fields_t *input);
+/** Check whether the internal state of the trn_cell_extension_fields
+ * in 'obj' is consistent. Return NULL if it is, and a short message
+ * if it is not.
*/
-const char *cell_extension_fields_check(const cell_extension_fields_t *obj);
+const char *trn_cell_extension_fields_check(const trn_cell_extension_fields_t *obj);
/** Clear any errors that were set on the object 'obj' by its setter
* functions. Return true iff errors were cleared.
*/
-int cell_extension_fields_clear_errors(cell_extension_fields_t *obj);
+int trn_cell_extension_fields_clear_errors(trn_cell_extension_fields_t *obj);
/** Return the value of the field_type field of the
- * cell_extension_fields_t in 'inp'
+ * trn_cell_extension_fields_t in 'inp'
*/
-uint8_t cell_extension_fields_get_field_type(const cell_extension_fields_t *inp);
+uint8_t trn_cell_extension_fields_get_field_type(const trn_cell_extension_fields_t *inp);
/** Set the value of the field_type field of the
- * cell_extension_fields_t in 'inp' to 'val'. Return 0 on success;
+ * trn_cell_extension_fields_t in 'inp' to 'val'. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
*/
-int cell_extension_fields_set_field_type(cell_extension_fields_t *inp, uint8_t val);
+int trn_cell_extension_fields_set_field_type(trn_cell_extension_fields_t *inp, uint8_t val);
/** Return the value of the field_len field of the
- * cell_extension_fields_t in 'inp'
+ * trn_cell_extension_fields_t in 'inp'
*/
-uint8_t cell_extension_fields_get_field_len(const cell_extension_fields_t *inp);
+uint8_t trn_cell_extension_fields_get_field_len(const trn_cell_extension_fields_t *inp);
/** Set the value of the field_len field of the
- * cell_extension_fields_t in 'inp' to 'val'. Return 0 on success;
+ * trn_cell_extension_fields_t in 'inp' to 'val'. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
*/
-int cell_extension_fields_set_field_len(cell_extension_fields_t *inp, uint8_t val);
+int trn_cell_extension_fields_set_field_len(trn_cell_extension_fields_t *inp, uint8_t val);
/** Return the length of the dynamic array holding the field field of
- * the cell_extension_fields_t in 'inp'.
+ * the trn_cell_extension_fields_t in 'inp'.
*/
-size_t cell_extension_fields_getlen_field(const cell_extension_fields_t *inp);
+size_t trn_cell_extension_fields_getlen_field(const trn_cell_extension_fields_t *inp);
/** Return the element at position 'idx' of the dynamic array field
- * field of the cell_extension_fields_t in 'inp'.
+ * field of the trn_cell_extension_fields_t in 'inp'.
*/
-uint8_t cell_extension_fields_get_field(cell_extension_fields_t *inp, size_t idx);
-/** As cell_extension_fields_get_field, but take and return a const
- * pointer
+uint8_t trn_cell_extension_fields_get_field(trn_cell_extension_fields_t *inp, size_t idx);
+/** As trn_cell_extension_fields_get_field, but take and return a
+ * const pointer
*/
-uint8_t cell_extension_fields_getconst_field(const cell_extension_fields_t *inp, size_t idx);
+uint8_t trn_cell_extension_fields_getconst_field(const trn_cell_extension_fields_t *inp, size_t idx);
/** Change the element at position 'idx' of the dynamic array field
- * field of the cell_extension_fields_t in 'inp', so that it will hold
- * the value 'elt'.
+ * field of the trn_cell_extension_fields_t in 'inp', so that it will
+ * hold the value 'elt'.
*/
-int cell_extension_fields_set_field(cell_extension_fields_t *inp, size_t idx, uint8_t elt);
+int trn_cell_extension_fields_set_field(trn_cell_extension_fields_t *inp, size_t idx, uint8_t elt);
/** Append a new element 'elt' to the dynamic array field field of the
- * cell_extension_fields_t in 'inp'.
+ * trn_cell_extension_fields_t in 'inp'.
*/
-int cell_extension_fields_add_field(cell_extension_fields_t *inp, uint8_t elt);
+int trn_cell_extension_fields_add_field(trn_cell_extension_fields_t *inp, uint8_t elt);
/** Return a pointer to the variable-length array field field of
* 'inp'.
*/
-uint8_t * cell_extension_fields_getarray_field(cell_extension_fields_t *inp);
-/** As cell_extension_fields_get_field, but take and return a const
- * pointer
+uint8_t * trn_cell_extension_fields_getarray_field(trn_cell_extension_fields_t *inp);
+/** As trn_cell_extension_fields_get_field, but take and return a
+ * const pointer
*/
-const uint8_t * cell_extension_fields_getconstarray_field(const cell_extension_fields_t *inp);
+const uint8_t * trn_cell_extension_fields_getconstarray_field(const trn_cell_extension_fields_t *inp);
/** Change the length of the variable-length array field field of
* 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
*/
-int cell_extension_fields_setlen_field(cell_extension_fields_t *inp, size_t newlen);
-/** Return a newly allocated cell_extension with all elements set to
- * zero.
+int trn_cell_extension_fields_setlen_field(trn_cell_extension_fields_t *inp, size_t newlen);
+/** Return a newly allocated trn_cell_extension with all elements set
+ * to zero.
*/
-cell_extension_t *cell_extension_new(void);
-/** Release all storage held by the cell_extension in 'victim'. (Do
- * nothing if 'victim' is NULL.)
+trn_cell_extension_t *trn_cell_extension_new(void);
+/** Release all storage held by the trn_cell_extension in 'victim'.
+ * (Do nothing if 'victim' is NULL.)
*/
-void cell_extension_free(cell_extension_t *victim);
-/** Try to parse a cell_extension from the buffer in 'input', using up
- * to 'len_in' bytes from the input buffer. On success, return the
- * number of bytes consumed and set *output to the newly allocated
- * cell_extension_t. On failure, return -2 if the input appears
- * truncated, and -1 if the input is otherwise invalid.
+void trn_cell_extension_free(trn_cell_extension_t *victim);
+/** Try to parse a trn_cell_extension from the buffer in 'input',
+ * using up to 'len_in' bytes from the input buffer. On success,
+ * return the number of bytes consumed and set *output to the newly
+ * allocated trn_cell_extension_t. On failure, return -2 if the input
+ * appears truncated, and -1 if the input is otherwise invalid.
*/
-ssize_t cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in);
+ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in);
/** Return the number of bytes we expect to need to encode the
- * cell_extension in 'obj'. On failure, return a negative value. Note
- * that this value may be an overestimate, and can even be an
+ * trn_cell_extension in 'obj'. On failure, return a negative value.
+ * Note that this value may be an overestimate, and can even be an
* underestimate for certain unencodeable objects.
*/
-ssize_t cell_extension_encoded_len(const cell_extension_t *obj);
-/** Try to encode the cell_extension from 'input' into the buffer at
- * 'output', using up to 'avail' bytes of the output buffer. On
+ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj);
+/** Try to encode the trn_cell_extension from 'input' into the buffer
+ * at 'output', using up to 'avail' bytes of the output buffer. On
* success, return the number of bytes used. On failure, return -2 if
* the buffer was not long enough, and -1 if the input was invalid.
*/
-ssize_t cell_extension_encode(uint8_t *output, size_t avail, const cell_extension_t *input);
-/** Check whether the internal state of the cell_extension in 'obj' is
- * consistent. Return NULL if it is, and a short message if it is not.
+ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input);
+/** Check whether the internal state of the trn_cell_extension in
+ * 'obj' is consistent. Return NULL if it is, and a short message if
+ * it is not.
*/
-const char *cell_extension_check(const cell_extension_t *obj);
+const char *trn_cell_extension_check(const trn_cell_extension_t *obj);
/** Clear any errors that were set on the object 'obj' by its setter
* functions. Return true iff errors were cleared.
*/
-int cell_extension_clear_errors(cell_extension_t *obj);
-/** Return the value of the num field of the cell_extension_t in 'inp'
+int trn_cell_extension_clear_errors(trn_cell_extension_t *obj);
+/** Return the value of the num field of the trn_cell_extension_t in
+ * 'inp'
*/
-uint8_t cell_extension_get_num(const cell_extension_t *inp);
-/** Set the value of the num field of the cell_extension_t in 'inp' to
- * 'val'. Return 0 on success; return -1 and set the error code on
- * 'inp' on failure.
+uint8_t trn_cell_extension_get_num(const trn_cell_extension_t *inp);
+/** Set the value of the num field of the trn_cell_extension_t in
+ * 'inp' to 'val'. Return 0 on success; return -1 and set the error
+ * code on 'inp' on failure.
*/
-int cell_extension_set_num(cell_extension_t *inp, uint8_t val);
+int trn_cell_extension_set_num(trn_cell_extension_t *inp, uint8_t val);
/** Return the length of the dynamic array holding the fields field of
- * the cell_extension_t in 'inp'.
+ * the trn_cell_extension_t in 'inp'.
*/
-size_t cell_extension_getlen_fields(const cell_extension_t *inp);
+size_t trn_cell_extension_getlen_fields(const trn_cell_extension_t *inp);
/** Return the element at position 'idx' of the dynamic array field
- * fields of the cell_extension_t in 'inp'.
+ * fields of the trn_cell_extension_t in 'inp'.
*/
-struct cell_extension_fields_st * cell_extension_get_fields(cell_extension_t *inp, size_t idx);
-/** As cell_extension_get_fields, but take and return a const pointer
+struct trn_cell_extension_fields_st * trn_cell_extension_get_fields(trn_cell_extension_t *inp, size_t idx);
+/** As trn_cell_extension_get_fields, but take and return a const
+ * pointer
*/
- const struct cell_extension_fields_st * cell_extension_getconst_fields(const cell_extension_t *inp, size_t idx);
+ const struct trn_cell_extension_fields_st * trn_cell_extension_getconst_fields(const trn_cell_extension_t *inp, size_t idx);
/** Change the element at position 'idx' of the dynamic array field
- * fields of the cell_extension_t in 'inp', so that it will hold the
- * value 'elt'. Free the previous value, if any.
+ * fields of the trn_cell_extension_t in 'inp', so that it will hold
+ * the value 'elt'. Free the previous value, if any.
*/
-int cell_extension_set_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt);
-/** As cell_extension_set_fields, but does not free the previous
+int trn_cell_extension_set_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt);
+/** As trn_cell_extension_set_fields, but does not free the previous
* value.
*/
-int cell_extension_set0_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt);
+int trn_cell_extension_set0_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt);
/** Append a new element 'elt' to the dynamic array field fields of
- * the cell_extension_t in 'inp'.
+ * the trn_cell_extension_t in 'inp'.
*/
-int cell_extension_add_fields(cell_extension_t *inp, struct cell_extension_fields_st * elt);
+int trn_cell_extension_add_fields(trn_cell_extension_t *inp, struct trn_cell_extension_fields_st * elt);
/** Return a pointer to the variable-length array field fields of
* 'inp'.
*/
-struct cell_extension_fields_st * * cell_extension_getarray_fields(cell_extension_t *inp);
-/** As cell_extension_get_fields, but take and return a const pointer
+struct trn_cell_extension_fields_st * * trn_cell_extension_getarray_fields(trn_cell_extension_t *inp);
+/** As trn_cell_extension_get_fields, but take and return a const
+ * pointer
*/
-const struct cell_extension_fields_st * const * cell_extension_getconstarray_fields(const cell_extension_t *inp);
+const struct trn_cell_extension_fields_st * const * trn_cell_extension_getconstarray_fields(const trn_cell_extension_t *inp);
/** Change the length of the variable-length array field fields of
* 'inp' to 'newlen'.Fill extra elements with NULL; free removed
* elements. Return 0 on success; return -1 and set the error code on
* 'inp' on failure.
*/
-int cell_extension_setlen_fields(cell_extension_t *inp, size_t newlen);
+int trn_cell_extension_setlen_fields(trn_cell_extension_t *inp, size_t newlen);
#endif
diff --git a/src/trunnel/hs/cell_common.trunnel b/src/trunnel/hs/cell_common.trunnel
index 1bbec5a1fe..1aa6999de7 100644
--- a/src/trunnel/hs/cell_common.trunnel
+++ b/src/trunnel/hs/cell_common.trunnel
@@ -1,12 +1,12 @@
/* This file contains common data structure that cells use. */
-struct cell_extension_fields {
+struct trn_cell_extension_fields {
u8 field_type;
u8 field_len;
u8 field[field_len];
};
-struct cell_extension {
+struct trn_cell_extension {
u8 num;
- struct cell_extension_fields fields[num];
+ struct trn_cell_extension_fields fields[num];
};
diff --git a/src/trunnel/hs/cell_establish_intro.c b/src/trunnel/hs/cell_establish_intro.c
index 633bd7c214..22e198c369 100644
--- a/src/trunnel/hs/cell_establish_intro.c
+++ b/src/trunnel/hs/cell_establish_intro.c
@@ -28,18 +28,18 @@ int cellestablishintro_deadcode_dummy__ = 0;
} \
} while (0)
-typedef struct cell_extension_st cell_extension_t;
-cell_extension_t *cell_extension_new(void);
-void cell_extension_free(cell_extension_t *victim);
-ssize_t cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in);
-ssize_t cell_extension_encoded_len(const cell_extension_t *obj);
-ssize_t cell_extension_encode(uint8_t *output, size_t avail, const cell_extension_t *input);
-const char *cell_extension_check(const cell_extension_t *obj);
-int cell_extension_clear_errors(cell_extension_t *obj);
-hs_cell_establish_intro_t *
-hs_cell_establish_intro_new(void)
-{
- hs_cell_establish_intro_t *val = trunnel_calloc(1, sizeof(hs_cell_establish_intro_t));
+typedef struct trn_cell_extension_st trn_cell_extension_t;
+trn_cell_extension_t *trn_cell_extension_new(void);
+void trn_cell_extension_free(trn_cell_extension_t *victim);
+ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in);
+ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj);
+ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input);
+const char *trn_cell_extension_check(const trn_cell_extension_t *obj);
+int trn_cell_extension_clear_errors(trn_cell_extension_t *obj);
+trn_cell_establish_intro_t *
+trn_cell_establish_intro_new(void)
+{
+ trn_cell_establish_intro_t *val = trunnel_calloc(1, sizeof(trn_cell_establish_intro_t));
if (NULL == val)
return NULL;
return val;
@@ -48,39 +48,39 @@ hs_cell_establish_intro_new(void)
/** Release all storage held inside 'obj', but do not free 'obj'.
*/
static void
-hs_cell_establish_intro_clear(hs_cell_establish_intro_t *obj)
+trn_cell_establish_intro_clear(trn_cell_establish_intro_t *obj)
{
(void) obj;
TRUNNEL_DYNARRAY_WIPE(&obj->auth_key);
TRUNNEL_DYNARRAY_CLEAR(&obj->auth_key);
- cell_extension_free(obj->extensions);
+ trn_cell_extension_free(obj->extensions);
obj->extensions = NULL;
TRUNNEL_DYNARRAY_WIPE(&obj->sig);
TRUNNEL_DYNARRAY_CLEAR(&obj->sig);
}
void
-hs_cell_establish_intro_free(hs_cell_establish_intro_t *obj)
+trn_cell_establish_intro_free(trn_cell_establish_intro_t *obj)
{
if (obj == NULL)
return;
- hs_cell_establish_intro_clear(obj);
- trunnel_memwipe(obj, sizeof(hs_cell_establish_intro_t));
+ trn_cell_establish_intro_clear(obj);
+ trunnel_memwipe(obj, sizeof(trn_cell_establish_intro_t));
trunnel_free_(obj);
}
const uint8_t *
-hs_cell_establish_intro_get_start_cell(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_get_start_cell(const trn_cell_establish_intro_t *inp)
{
return inp->start_cell;
}
uint8_t
-hs_cell_establish_intro_get_auth_key_type(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_get_auth_key_type(const trn_cell_establish_intro_t *inp)
{
return inp->auth_key_type;
}
int
-hs_cell_establish_intro_set_auth_key_type(hs_cell_establish_intro_t *inp, uint8_t val)
+trn_cell_establish_intro_set_auth_key_type(trn_cell_establish_intro_t *inp, uint8_t val)
{
if (! ((val == 0 || val == 1 || val == 2))) {
TRUNNEL_SET_ERROR_CODE(inp);
@@ -90,41 +90,41 @@ hs_cell_establish_intro_set_auth_key_type(hs_cell_establish_intro_t *inp, uint8_
return 0;
}
uint16_t
-hs_cell_establish_intro_get_auth_key_len(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_get_auth_key_len(const trn_cell_establish_intro_t *inp)
{
return inp->auth_key_len;
}
int
-hs_cell_establish_intro_set_auth_key_len(hs_cell_establish_intro_t *inp, uint16_t val)
+trn_cell_establish_intro_set_auth_key_len(trn_cell_establish_intro_t *inp, uint16_t val)
{
inp->auth_key_len = val;
return 0;
}
size_t
-hs_cell_establish_intro_getlen_auth_key(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_getlen_auth_key(const trn_cell_establish_intro_t *inp)
{
return TRUNNEL_DYNARRAY_LEN(&inp->auth_key);
}
uint8_t
-hs_cell_establish_intro_get_auth_key(hs_cell_establish_intro_t *inp, size_t idx)
+trn_cell_establish_intro_get_auth_key(trn_cell_establish_intro_t *inp, size_t idx)
{
return TRUNNEL_DYNARRAY_GET(&inp->auth_key, idx);
}
uint8_t
-hs_cell_establish_intro_getconst_auth_key(const hs_cell_establish_intro_t *inp, size_t idx)
+trn_cell_establish_intro_getconst_auth_key(const trn_cell_establish_intro_t *inp, size_t idx)
{
- return hs_cell_establish_intro_get_auth_key((hs_cell_establish_intro_t*)inp, idx);
+ return trn_cell_establish_intro_get_auth_key((trn_cell_establish_intro_t*)inp, idx);
}
int
-hs_cell_establish_intro_set_auth_key(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt)
+trn_cell_establish_intro_set_auth_key(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt)
{
TRUNNEL_DYNARRAY_SET(&inp->auth_key, idx, elt);
return 0;
}
int
-hs_cell_establish_intro_add_auth_key(hs_cell_establish_intro_t *inp, uint8_t elt)
+trn_cell_establish_intro_add_auth_key(trn_cell_establish_intro_t *inp, uint8_t elt)
{
#if SIZE_MAX >= UINT16_MAX
if (inp->auth_key.n_ == UINT16_MAX)
@@ -138,17 +138,17 @@ hs_cell_establish_intro_add_auth_key(hs_cell_establish_intro_t *inp, uint8_t elt
}
uint8_t *
-hs_cell_establish_intro_getarray_auth_key(hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_getarray_auth_key(trn_cell_establish_intro_t *inp)
{
return inp->auth_key.elts_;
}
const uint8_t *
-hs_cell_establish_intro_getconstarray_auth_key(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_getconstarray_auth_key(const trn_cell_establish_intro_t *inp)
{
- return (const uint8_t *)hs_cell_establish_intro_getarray_auth_key((hs_cell_establish_intro_t*)inp);
+ return (const uint8_t *)trn_cell_establish_intro_getarray_auth_key((trn_cell_establish_intro_t*)inp);
}
int
-hs_cell_establish_intro_setlen_auth_key(hs_cell_establish_intro_t *inp, size_t newlen)
+trn_cell_establish_intro_setlen_auth_key(trn_cell_establish_intro_t *inp, size_t newlen)
{
uint8_t *newptr;
#if UINT16_MAX < SIZE_MAX
@@ -167,54 +167,54 @@ hs_cell_establish_intro_setlen_auth_key(hs_cell_establish_intro_t *inp, size_t n
TRUNNEL_SET_ERROR_CODE(inp);
return -1;
}
-struct cell_extension_st *
-hs_cell_establish_intro_get_extensions(hs_cell_establish_intro_t *inp)
+struct trn_cell_extension_st *
+trn_cell_establish_intro_get_extensions(trn_cell_establish_intro_t *inp)
{
return inp->extensions;
}
-const struct cell_extension_st *
-hs_cell_establish_intro_getconst_extensions(const hs_cell_establish_intro_t *inp)
+const struct trn_cell_extension_st *
+trn_cell_establish_intro_getconst_extensions(const trn_cell_establish_intro_t *inp)
{
- return hs_cell_establish_intro_get_extensions((hs_cell_establish_intro_t*) inp);
+ return trn_cell_establish_intro_get_extensions((trn_cell_establish_intro_t*) inp);
}
int
-hs_cell_establish_intro_set_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val)
+trn_cell_establish_intro_set_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val)
{
if (inp->extensions && inp->extensions != val)
- cell_extension_free(inp->extensions);
- return hs_cell_establish_intro_set0_extensions(inp, val);
+ trn_cell_extension_free(inp->extensions);
+ return trn_cell_establish_intro_set0_extensions(inp, val);
}
int
-hs_cell_establish_intro_set0_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val)
+trn_cell_establish_intro_set0_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val)
{
inp->extensions = val;
return 0;
}
const uint8_t *
-hs_cell_establish_intro_get_end_mac_fields(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_get_end_mac_fields(const trn_cell_establish_intro_t *inp)
{
return inp->end_mac_fields;
}
size_t
-hs_cell_establish_intro_getlen_handshake_mac(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_getlen_handshake_mac(const trn_cell_establish_intro_t *inp)
{
(void)inp; return TRUNNEL_SHA3_256_LEN;
}
uint8_t
-hs_cell_establish_intro_get_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx)
+trn_cell_establish_intro_get_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx)
{
trunnel_assert(idx < TRUNNEL_SHA3_256_LEN);
return inp->handshake_mac[idx];
}
uint8_t
-hs_cell_establish_intro_getconst_handshake_mac(const hs_cell_establish_intro_t *inp, size_t idx)
+trn_cell_establish_intro_getconst_handshake_mac(const trn_cell_establish_intro_t *inp, size_t idx)
{
- return hs_cell_establish_intro_get_handshake_mac((hs_cell_establish_intro_t*)inp, idx);
+ return trn_cell_establish_intro_get_handshake_mac((trn_cell_establish_intro_t*)inp, idx);
}
int
-hs_cell_establish_intro_set_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt)
+trn_cell_establish_intro_set_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt)
{
trunnel_assert(idx < TRUNNEL_SHA3_256_LEN);
inp->handshake_mac[idx] = elt;
@@ -222,56 +222,56 @@ hs_cell_establish_intro_set_handshake_mac(hs_cell_establish_intro_t *inp, size_t
}
uint8_t *
-hs_cell_establish_intro_getarray_handshake_mac(hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_getarray_handshake_mac(trn_cell_establish_intro_t *inp)
{
return inp->handshake_mac;
}
const uint8_t *
-hs_cell_establish_intro_getconstarray_handshake_mac(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_getconstarray_handshake_mac(const trn_cell_establish_intro_t *inp)
{
- return (const uint8_t *)hs_cell_establish_intro_getarray_handshake_mac((hs_cell_establish_intro_t*)inp);
+ return (const uint8_t *)trn_cell_establish_intro_getarray_handshake_mac((trn_cell_establish_intro_t*)inp);
}
const uint8_t *
-hs_cell_establish_intro_get_end_sig_fields(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_get_end_sig_fields(const trn_cell_establish_intro_t *inp)
{
return inp->end_sig_fields;
}
uint16_t
-hs_cell_establish_intro_get_sig_len(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_get_sig_len(const trn_cell_establish_intro_t *inp)
{
return inp->sig_len;
}
int
-hs_cell_establish_intro_set_sig_len(hs_cell_establish_intro_t *inp, uint16_t val)
+trn_cell_establish_intro_set_sig_len(trn_cell_establish_intro_t *inp, uint16_t val)
{
inp->sig_len = val;
return 0;
}
size_t
-hs_cell_establish_intro_getlen_sig(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_getlen_sig(const trn_cell_establish_intro_t *inp)
{
return TRUNNEL_DYNARRAY_LEN(&inp->sig);
}
uint8_t
-hs_cell_establish_intro_get_sig(hs_cell_establish_intro_t *inp, size_t idx)
+trn_cell_establish_intro_get_sig(trn_cell_establish_intro_t *inp, size_t idx)
{
return TRUNNEL_DYNARRAY_GET(&inp->sig, idx);
}
uint8_t
-hs_cell_establish_intro_getconst_sig(const hs_cell_establish_intro_t *inp, size_t idx)
+trn_cell_establish_intro_getconst_sig(const trn_cell_establish_intro_t *inp, size_t idx)
{
- return hs_cell_establish_intro_get_sig((hs_cell_establish_intro_t*)inp, idx);
+ return trn_cell_establish_intro_get_sig((trn_cell_establish_intro_t*)inp, idx);
}
int
-hs_cell_establish_intro_set_sig(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt)
+trn_cell_establish_intro_set_sig(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt)
{
TRUNNEL_DYNARRAY_SET(&inp->sig, idx, elt);
return 0;
}
int
-hs_cell_establish_intro_add_sig(hs_cell_establish_intro_t *inp, uint8_t elt)
+trn_cell_establish_intro_add_sig(trn_cell_establish_intro_t *inp, uint8_t elt)
{
#if SIZE_MAX >= UINT16_MAX
if (inp->sig.n_ == UINT16_MAX)
@@ -285,17 +285,17 @@ hs_cell_establish_intro_add_sig(hs_cell_establish_intro_t *inp, uint8_t elt)
}
uint8_t *
-hs_cell_establish_intro_getarray_sig(hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_getarray_sig(trn_cell_establish_intro_t *inp)
{
return inp->sig.elts_;
}
const uint8_t *
-hs_cell_establish_intro_getconstarray_sig(const hs_cell_establish_intro_t *inp)
+trn_cell_establish_intro_getconstarray_sig(const trn_cell_establish_intro_t *inp)
{
- return (const uint8_t *)hs_cell_establish_intro_getarray_sig((hs_cell_establish_intro_t*)inp);
+ return (const uint8_t *)trn_cell_establish_intro_getarray_sig((trn_cell_establish_intro_t*)inp);
}
int
-hs_cell_establish_intro_setlen_sig(hs_cell_establish_intro_t *inp, size_t newlen)
+trn_cell_establish_intro_setlen_sig(trn_cell_establish_intro_t *inp, size_t newlen)
{
uint8_t *newptr;
#if UINT16_MAX < SIZE_MAX
@@ -315,7 +315,7 @@ hs_cell_establish_intro_setlen_sig(hs_cell_establish_intro_t *inp, size_t newlen
return -1;
}
const char *
-hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj)
+trn_cell_establish_intro_check(const trn_cell_establish_intro_t *obj)
{
if (obj == NULL)
return "Object was NULL";
@@ -327,7 +327,7 @@ hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj)
return "Length mismatch for auth_key";
{
const char *msg;
- if (NULL != (msg = cell_extension_check(obj->extensions)))
+ if (NULL != (msg = trn_cell_extension_check(obj->extensions)))
return msg;
}
if (TRUNNEL_DYNARRAY_LEN(&obj->sig) != obj->sig_len)
@@ -336,11 +336,11 @@ hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj)
}
ssize_t
-hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj)
+trn_cell_establish_intro_encoded_len(const trn_cell_establish_intro_t *obj)
{
ssize_t result = 0;
- if (NULL != hs_cell_establish_intro_check(obj))
+ if (NULL != trn_cell_establish_intro_check(obj))
return -1;
@@ -353,8 +353,8 @@ hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj)
/* Length of u8 auth_key[auth_key_len] */
result += TRUNNEL_DYNARRAY_LEN(&obj->auth_key);
- /* Length of struct cell_extension extensions */
- result += cell_extension_encoded_len(obj->extensions);
+ /* Length of struct trn_cell_extension extensions */
+ result += trn_cell_extension_encoded_len(obj->extensions);
/* Length of u8 handshake_mac[TRUNNEL_SHA3_256_LEN] */
result += TRUNNEL_SHA3_256_LEN;
@@ -367,24 +367,24 @@ hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj)
return result;
}
int
-hs_cell_establish_intro_clear_errors(hs_cell_establish_intro_t *obj)
+trn_cell_establish_intro_clear_errors(trn_cell_establish_intro_t *obj)
{
int r = obj->trunnel_error_code_;
obj->trunnel_error_code_ = 0;
return r;
}
ssize_t
-hs_cell_establish_intro_encode(uint8_t *output, const size_t avail, const hs_cell_establish_intro_t *obj)
+trn_cell_establish_intro_encode(uint8_t *output, const size_t avail, const trn_cell_establish_intro_t *obj)
{
ssize_t result = 0;
size_t written = 0;
uint8_t *ptr = output;
const char *msg;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
- const ssize_t encoded_len = hs_cell_establish_intro_encoded_len(obj);
+ const ssize_t encoded_len = trn_cell_establish_intro_encoded_len(obj);
#endif
- if (NULL != (msg = hs_cell_establish_intro_check(obj)))
+ if (NULL != (msg = trn_cell_establish_intro_check(obj)))
goto check_failed;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
@@ -417,9 +417,9 @@ hs_cell_establish_intro_encode(uint8_t *output, const size_t avail, const hs_cel
written += elt_len; ptr += elt_len;
}
- /* Encode struct cell_extension extensions */
+ /* Encode struct trn_cell_extension extensions */
trunnel_assert(written <= avail);
- result = cell_extension_encode(ptr, avail - written, obj->extensions);
+ result = trn_cell_extension_encode(ptr, avail - written, obj->extensions);
if (result < 0)
goto fail; /* XXXXXXX !*/
written += result; ptr += result;
@@ -474,11 +474,11 @@ hs_cell_establish_intro_encode(uint8_t *output, const size_t avail, const hs_cel
return result;
}
-/** As hs_cell_establish_intro_parse(), but do not allocate the output
- * object.
+/** As trn_cell_establish_intro_parse(), but do not allocate the
+ * output object.
*/
static ssize_t
-hs_cell_establish_intro_parse_into(hs_cell_establish_intro_t *obj, const uint8_t *input, const size_t len_in)
+trn_cell_establish_intro_parse_into(trn_cell_establish_intro_t *obj, const uint8_t *input, const size_t len_in)
{
const uint8_t *ptr = input;
size_t remaining = len_in;
@@ -506,8 +506,8 @@ hs_cell_establish_intro_parse_into(hs_cell_establish_intro_t *obj, const uint8_t
memcpy(obj->auth_key.elts_, ptr, obj->auth_key_len);
ptr += obj->auth_key_len; remaining -= obj->auth_key_len;
- /* Parse struct cell_extension extensions */
- result = cell_extension_parse(&obj->extensions, ptr, remaining);
+ /* Parse struct trn_cell_extension extensions */
+ result = trn_cell_extension_parse(&obj->extensions, ptr, remaining);
if (result < 0)
goto relay_fail;
trunnel_assert((size_t)result <= remaining);
@@ -548,23 +548,23 @@ hs_cell_establish_intro_parse_into(hs_cell_establish_intro_t *obj, const uint8_t
}
ssize_t
-hs_cell_establish_intro_parse(hs_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in)
+trn_cell_establish_intro_parse(trn_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in)
{
ssize_t result;
- *output = hs_cell_establish_intro_new();
+ *output = trn_cell_establish_intro_new();
if (NULL == *output)
return -1;
- result = hs_cell_establish_intro_parse_into(*output, input, len_in);
+ result = trn_cell_establish_intro_parse_into(*output, input, len_in);
if (result < 0) {
- hs_cell_establish_intro_free(*output);
+ trn_cell_establish_intro_free(*output);
*output = NULL;
}
return result;
}
-hs_cell_intro_established_t *
-hs_cell_intro_established_new(void)
+trn_cell_intro_established_t *
+trn_cell_intro_established_new(void)
{
- hs_cell_intro_established_t *val = trunnel_calloc(1, sizeof(hs_cell_intro_established_t));
+ trn_cell_intro_established_t *val = trunnel_calloc(1, sizeof(trn_cell_intro_established_t));
if (NULL == val)
return NULL;
return val;
@@ -573,48 +573,48 @@ hs_cell_intro_established_new(void)
/** Release all storage held inside 'obj', but do not free 'obj'.
*/
static void
-hs_cell_intro_established_clear(hs_cell_intro_established_t *obj)
+trn_cell_intro_established_clear(trn_cell_intro_established_t *obj)
{
(void) obj;
- cell_extension_free(obj->extensions);
+ trn_cell_extension_free(obj->extensions);
obj->extensions = NULL;
}
void
-hs_cell_intro_established_free(hs_cell_intro_established_t *obj)
+trn_cell_intro_established_free(trn_cell_intro_established_t *obj)
{
if (obj == NULL)
return;
- hs_cell_intro_established_clear(obj);
- trunnel_memwipe(obj, sizeof(hs_cell_intro_established_t));
+ trn_cell_intro_established_clear(obj);
+ trunnel_memwipe(obj, sizeof(trn_cell_intro_established_t));
trunnel_free_(obj);
}
-struct cell_extension_st *
-hs_cell_intro_established_get_extensions(hs_cell_intro_established_t *inp)
+struct trn_cell_extension_st *
+trn_cell_intro_established_get_extensions(trn_cell_intro_established_t *inp)
{
return inp->extensions;
}
-const struct cell_extension_st *
-hs_cell_intro_established_getconst_extensions(const hs_cell_intro_established_t *inp)
+const struct trn_cell_extension_st *
+trn_cell_intro_established_getconst_extensions(const trn_cell_intro_established_t *inp)
{
- return hs_cell_intro_established_get_extensions((hs_cell_intro_established_t*) inp);
+ return trn_cell_intro_established_get_extensions((trn_cell_intro_established_t*) inp);
}
int
-hs_cell_intro_established_set_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val)
+trn_cell_intro_established_set_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val)
{
if (inp->extensions && inp->extensions != val)
- cell_extension_free(inp->extensions);
- return hs_cell_intro_established_set0_extensions(inp, val);
+ trn_cell_extension_free(inp->extensions);
+ return trn_cell_intro_established_set0_extensions(inp, val);
}
int
-hs_cell_intro_established_set0_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val)
+trn_cell_intro_established_set0_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val)
{
inp->extensions = val;
return 0;
}
const char *
-hs_cell_intro_established_check(const hs_cell_intro_established_t *obj)
+trn_cell_intro_established_check(const trn_cell_intro_established_t *obj)
{
if (obj == NULL)
return "Object was NULL";
@@ -622,53 +622,53 @@ hs_cell_intro_established_check(const hs_cell_intro_established_t *obj)
return "A set function failed on this object";
{
const char *msg;
- if (NULL != (msg = cell_extension_check(obj->extensions)))
+ if (NULL != (msg = trn_cell_extension_check(obj->extensions)))
return msg;
}
return NULL;
}
ssize_t
-hs_cell_intro_established_encoded_len(const hs_cell_intro_established_t *obj)
+trn_cell_intro_established_encoded_len(const trn_cell_intro_established_t *obj)
{
ssize_t result = 0;
- if (NULL != hs_cell_intro_established_check(obj))
+ if (NULL != trn_cell_intro_established_check(obj))
return -1;
- /* Length of struct cell_extension extensions */
- result += cell_extension_encoded_len(obj->extensions);
+ /* Length of struct trn_cell_extension extensions */
+ result += trn_cell_extension_encoded_len(obj->extensions);
return result;
}
int
-hs_cell_intro_established_clear_errors(hs_cell_intro_established_t *obj)
+trn_cell_intro_established_clear_errors(trn_cell_intro_established_t *obj)
{
int r = obj->trunnel_error_code_;
obj->trunnel_error_code_ = 0;
return r;
}
ssize_t
-hs_cell_intro_established_encode(uint8_t *output, const size_t avail, const hs_cell_intro_established_t *obj)
+trn_cell_intro_established_encode(uint8_t *output, const size_t avail, const trn_cell_intro_established_t *obj)
{
ssize_t result = 0;
size_t written = 0;
uint8_t *ptr = output;
const char *msg;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
- const ssize_t encoded_len = hs_cell_intro_established_encoded_len(obj);
+ const ssize_t encoded_len = trn_cell_intro_established_encoded_len(obj);
#endif
- if (NULL != (msg = hs_cell_intro_established_check(obj)))
+ if (NULL != (msg = trn_cell_intro_established_check(obj)))
goto check_failed;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
trunnel_assert(encoded_len >= 0);
#endif
- /* Encode struct cell_extension extensions */
+ /* Encode struct trn_cell_extension extensions */
trunnel_assert(written <= avail);
- result = cell_extension_encode(ptr, avail - written, obj->extensions);
+ result = trn_cell_extension_encode(ptr, avail - written, obj->extensions);
if (result < 0)
goto fail; /* XXXXXXX !*/
written += result; ptr += result;
@@ -694,19 +694,19 @@ hs_cell_intro_established_encode(uint8_t *output, const size_t avail, const hs_c
return result;
}
-/** As hs_cell_intro_established_parse(), but do not allocate the
+/** As trn_cell_intro_established_parse(), but do not allocate the
* output object.
*/
static ssize_t
-hs_cell_intro_established_parse_into(hs_cell_intro_established_t *obj, const uint8_t *input, const size_t len_in)
+trn_cell_intro_established_parse_into(trn_cell_intro_established_t *obj, const uint8_t *input, const size_t len_in)
{
const uint8_t *ptr = input;
size_t remaining = len_in;
ssize_t result = 0;
(void)result;
- /* Parse struct cell_extension extensions */
- result = cell_extension_parse(&obj->extensions, ptr, remaining);
+ /* Parse struct trn_cell_extension extensions */
+ result = trn_cell_extension_parse(&obj->extensions, ptr, remaining);
if (result < 0)
goto relay_fail;
trunnel_assert((size_t)result <= remaining);
@@ -720,15 +720,15 @@ hs_cell_intro_established_parse_into(hs_cell_intro_established_t *obj, const uin
}
ssize_t
-hs_cell_intro_established_parse(hs_cell_intro_established_t **output, const uint8_t *input, const size_t len_in)
+trn_cell_intro_established_parse(trn_cell_intro_established_t **output, const uint8_t *input, const size_t len_in)
{
ssize_t result;
- *output = hs_cell_intro_established_new();
+ *output = trn_cell_intro_established_new();
if (NULL == *output)
return -1;
- result = hs_cell_intro_established_parse_into(*output, input, len_in);
+ result = trn_cell_intro_established_parse_into(*output, input, len_in);
if (result < 0) {
- hs_cell_intro_established_free(*output);
+ trn_cell_intro_established_free(*output);
*output = NULL;
}
return result;
diff --git a/src/trunnel/hs/cell_establish_intro.h b/src/trunnel/hs/cell_establish_intro.h
index 725d47cd85..2f0d893659 100644
--- a/src/trunnel/hs/cell_establish_intro.h
+++ b/src/trunnel/hs/cell_establish_intro.h
@@ -8,15 +8,15 @@
#include <stdint.h>
#include "trunnel.h"
-struct cell_extension_st;
+struct trn_cell_extension_st;
#define TRUNNEL_SHA3_256_LEN 32
-#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_ESTABLISH_INTRO)
-struct hs_cell_establish_intro_st {
+#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_ESTABLISH_INTRO)
+struct trn_cell_establish_intro_st {
const uint8_t *start_cell;
uint8_t auth_key_type;
uint16_t auth_key_len;
TRUNNEL_DYNARRAY_HEAD(, uint8_t) auth_key;
- struct cell_extension_st *extensions;
+ struct trn_cell_extension_st *extensions;
const uint8_t *end_mac_fields;
uint8_t handshake_mac[TRUNNEL_SHA3_256_LEN];
const uint8_t *end_sig_fields;
@@ -25,251 +25,252 @@ struct hs_cell_establish_intro_st {
uint8_t trunnel_error_code_;
};
#endif
-typedef struct hs_cell_establish_intro_st hs_cell_establish_intro_t;
-#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRO_ESTABLISHED)
-struct hs_cell_intro_established_st {
- struct cell_extension_st *extensions;
+typedef struct trn_cell_establish_intro_st trn_cell_establish_intro_t;
+#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRO_ESTABLISHED)
+struct trn_cell_intro_established_st {
+ struct trn_cell_extension_st *extensions;
uint8_t trunnel_error_code_;
};
#endif
-typedef struct hs_cell_intro_established_st hs_cell_intro_established_t;
-/** Return a newly allocated hs_cell_establish_intro with all elements
- * set to zero.
+typedef struct trn_cell_intro_established_st trn_cell_intro_established_t;
+/** Return a newly allocated trn_cell_establish_intro with all
+ * elements set to zero.
*/
-hs_cell_establish_intro_t *hs_cell_establish_intro_new(void);
-/** Release all storage held by the hs_cell_establish_intro in
+trn_cell_establish_intro_t *trn_cell_establish_intro_new(void);
+/** Release all storage held by the trn_cell_establish_intro in
* 'victim'. (Do nothing if 'victim' is NULL.)
*/
-void hs_cell_establish_intro_free(hs_cell_establish_intro_t *victim);
-/** Try to parse a hs_cell_establish_intro from the buffer in 'input',
- * using up to 'len_in' bytes from the input buffer. On success,
- * return the number of bytes consumed and set *output to the newly
- * allocated hs_cell_establish_intro_t. On failure, return -2 if the
- * input appears truncated, and -1 if the input is otherwise invalid.
+void trn_cell_establish_intro_free(trn_cell_establish_intro_t *victim);
+/** Try to parse a trn_cell_establish_intro from the buffer in
+ * 'input', using up to 'len_in' bytes from the input buffer. On
+ * success, return the number of bytes consumed and set *output to the
+ * newly allocated trn_cell_establish_intro_t. On failure, return -2
+ * if the input appears truncated, and -1 if the input is otherwise
+ * invalid.
*/
-ssize_t hs_cell_establish_intro_parse(hs_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in);
+ssize_t trn_cell_establish_intro_parse(trn_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in);
/** Return the number of bytes we expect to need to encode the
- * hs_cell_establish_intro in 'obj'. On failure, return a negative
+ * trn_cell_establish_intro in 'obj'. On failure, return a negative
* value. Note that this value may be an overestimate, and can even be
* an underestimate for certain unencodeable objects.
*/
-ssize_t hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj);
-/** Try to encode the hs_cell_establish_intro from 'input' into the
+ssize_t trn_cell_establish_intro_encoded_len(const trn_cell_establish_intro_t *obj);
+/** Try to encode the trn_cell_establish_intro from 'input' into the
* buffer at 'output', using up to 'avail' bytes of the output buffer.
* On success, return the number of bytes used. On failure, return -2
* if the buffer was not long enough, and -1 if the input was invalid.
*/
-ssize_t hs_cell_establish_intro_encode(uint8_t *output, size_t avail, const hs_cell_establish_intro_t *input);
-/** Check whether the internal state of the hs_cell_establish_intro in
- * 'obj' is consistent. Return NULL if it is, and a short message if
- * it is not.
+ssize_t trn_cell_establish_intro_encode(uint8_t *output, size_t avail, const trn_cell_establish_intro_t *input);
+/** Check whether the internal state of the trn_cell_establish_intro
+ * in 'obj' is consistent. Return NULL if it is, and a short message
+ * if it is not.
*/
-const char *hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj);
+const char *trn_cell_establish_intro_check(const trn_cell_establish_intro_t *obj);
/** Clear any errors that were set on the object 'obj' by its setter
* functions. Return true iff errors were cleared.
*/
-int hs_cell_establish_intro_clear_errors(hs_cell_establish_intro_t *obj);
+int trn_cell_establish_intro_clear_errors(trn_cell_establish_intro_t *obj);
/** Return the position for start_cell when we parsed this object
*/
-const uint8_t * hs_cell_establish_intro_get_start_cell(const hs_cell_establish_intro_t *inp);
+const uint8_t * trn_cell_establish_intro_get_start_cell(const trn_cell_establish_intro_t *inp);
/** Return the value of the auth_key_type field of the
- * hs_cell_establish_intro_t in 'inp'
+ * trn_cell_establish_intro_t in 'inp'
*/
-uint8_t hs_cell_establish_intro_get_auth_key_type(const hs_cell_establish_intro_t *inp);
+uint8_t trn_cell_establish_intro_get_auth_key_type(const trn_cell_establish_intro_t *inp);
/** Set the value of the auth_key_type field of the
- * hs_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success;
+ * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_establish_intro_set_auth_key_type(hs_cell_establish_intro_t *inp, uint8_t val);
+int trn_cell_establish_intro_set_auth_key_type(trn_cell_establish_intro_t *inp, uint8_t val);
/** Return the value of the auth_key_len field of the
- * hs_cell_establish_intro_t in 'inp'
+ * trn_cell_establish_intro_t in 'inp'
*/
-uint16_t hs_cell_establish_intro_get_auth_key_len(const hs_cell_establish_intro_t *inp);
+uint16_t trn_cell_establish_intro_get_auth_key_len(const trn_cell_establish_intro_t *inp);
/** Set the value of the auth_key_len field of the
- * hs_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success;
+ * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_establish_intro_set_auth_key_len(hs_cell_establish_intro_t *inp, uint16_t val);
+int trn_cell_establish_intro_set_auth_key_len(trn_cell_establish_intro_t *inp, uint16_t val);
/** Return the length of the dynamic array holding the auth_key field
- * of the hs_cell_establish_intro_t in 'inp'.
+ * of the trn_cell_establish_intro_t in 'inp'.
*/
-size_t hs_cell_establish_intro_getlen_auth_key(const hs_cell_establish_intro_t *inp);
+size_t trn_cell_establish_intro_getlen_auth_key(const trn_cell_establish_intro_t *inp);
/** Return the element at position 'idx' of the dynamic array field
- * auth_key of the hs_cell_establish_intro_t in 'inp'.
+ * auth_key of the trn_cell_establish_intro_t in 'inp'.
*/
-uint8_t hs_cell_establish_intro_get_auth_key(hs_cell_establish_intro_t *inp, size_t idx);
-/** As hs_cell_establish_intro_get_auth_key, but take and return a
+uint8_t trn_cell_establish_intro_get_auth_key(trn_cell_establish_intro_t *inp, size_t idx);
+/** As trn_cell_establish_intro_get_auth_key, but take and return a
* const pointer
*/
-uint8_t hs_cell_establish_intro_getconst_auth_key(const hs_cell_establish_intro_t *inp, size_t idx);
+uint8_t trn_cell_establish_intro_getconst_auth_key(const trn_cell_establish_intro_t *inp, size_t idx);
/** Change the element at position 'idx' of the dynamic array field
- * auth_key of the hs_cell_establish_intro_t in 'inp', so that it will
- * hold the value 'elt'.
+ * auth_key of the trn_cell_establish_intro_t in 'inp', so that it
+ * will hold the value 'elt'.
*/
-int hs_cell_establish_intro_set_auth_key(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt);
+int trn_cell_establish_intro_set_auth_key(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt);
/** Append a new element 'elt' to the dynamic array field auth_key of
- * the hs_cell_establish_intro_t in 'inp'.
+ * the trn_cell_establish_intro_t in 'inp'.
*/
-int hs_cell_establish_intro_add_auth_key(hs_cell_establish_intro_t *inp, uint8_t elt);
+int trn_cell_establish_intro_add_auth_key(trn_cell_establish_intro_t *inp, uint8_t elt);
/** Return a pointer to the variable-length array field auth_key of
* 'inp'.
*/
-uint8_t * hs_cell_establish_intro_getarray_auth_key(hs_cell_establish_intro_t *inp);
-/** As hs_cell_establish_intro_get_auth_key, but take and return a
+uint8_t * trn_cell_establish_intro_getarray_auth_key(trn_cell_establish_intro_t *inp);
+/** As trn_cell_establish_intro_get_auth_key, but take and return a
* const pointer
*/
-const uint8_t * hs_cell_establish_intro_getconstarray_auth_key(const hs_cell_establish_intro_t *inp);
+const uint8_t * trn_cell_establish_intro_getconstarray_auth_key(const trn_cell_establish_intro_t *inp);
/** Change the length of the variable-length array field auth_key of
* 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_establish_intro_setlen_auth_key(hs_cell_establish_intro_t *inp, size_t newlen);
+int trn_cell_establish_intro_setlen_auth_key(trn_cell_establish_intro_t *inp, size_t newlen);
/** Return the value of the extensions field of the
- * hs_cell_establish_intro_t in 'inp'
+ * trn_cell_establish_intro_t in 'inp'
*/
-struct cell_extension_st * hs_cell_establish_intro_get_extensions(hs_cell_establish_intro_t *inp);
-/** As hs_cell_establish_intro_get_extensions, but take and return a
+struct trn_cell_extension_st * trn_cell_establish_intro_get_extensions(trn_cell_establish_intro_t *inp);
+/** As trn_cell_establish_intro_get_extensions, but take and return a
* const pointer
*/
-const struct cell_extension_st * hs_cell_establish_intro_getconst_extensions(const hs_cell_establish_intro_t *inp);
+const struct trn_cell_extension_st * trn_cell_establish_intro_getconst_extensions(const trn_cell_establish_intro_t *inp);
/** Set the value of the extensions field of the
- * hs_cell_establish_intro_t in 'inp' to 'val'. Free the old value if
+ * trn_cell_establish_intro_t in 'inp' to 'val'. Free the old value if
* any. Steals the referenceto 'val'.Return 0 on success; return -1
* and set the error code on 'inp' on failure.
*/
-int hs_cell_establish_intro_set_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val);
-/** As hs_cell_establish_intro_set_extensions, but does not free the
+int trn_cell_establish_intro_set_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val);
+/** As trn_cell_establish_intro_set_extensions, but does not free the
* previous value.
*/
-int hs_cell_establish_intro_set0_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val);
+int trn_cell_establish_intro_set0_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val);
/** Return the position for end_mac_fields when we parsed this object
*/
-const uint8_t * hs_cell_establish_intro_get_end_mac_fields(const hs_cell_establish_intro_t *inp);
+const uint8_t * trn_cell_establish_intro_get_end_mac_fields(const trn_cell_establish_intro_t *inp);
/** Return the (constant) length of the array holding the
- * handshake_mac field of the hs_cell_establish_intro_t in 'inp'.
+ * handshake_mac field of the trn_cell_establish_intro_t in 'inp'.
*/
-size_t hs_cell_establish_intro_getlen_handshake_mac(const hs_cell_establish_intro_t *inp);
+size_t trn_cell_establish_intro_getlen_handshake_mac(const trn_cell_establish_intro_t *inp);
/** Return the element at position 'idx' of the fixed array field
- * handshake_mac of the hs_cell_establish_intro_t in 'inp'.
+ * handshake_mac of the trn_cell_establish_intro_t in 'inp'.
*/
-uint8_t hs_cell_establish_intro_get_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx);
-/** As hs_cell_establish_intro_get_handshake_mac, but take and return
+uint8_t trn_cell_establish_intro_get_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx);
+/** As trn_cell_establish_intro_get_handshake_mac, but take and return
* a const pointer
*/
-uint8_t hs_cell_establish_intro_getconst_handshake_mac(const hs_cell_establish_intro_t *inp, size_t idx);
+uint8_t trn_cell_establish_intro_getconst_handshake_mac(const trn_cell_establish_intro_t *inp, size_t idx);
/** Change the element at position 'idx' of the fixed array field
- * handshake_mac of the hs_cell_establish_intro_t in 'inp', so that it
- * will hold the value 'elt'.
+ * handshake_mac of the trn_cell_establish_intro_t in 'inp', so that
+ * it will hold the value 'elt'.
*/
-int hs_cell_establish_intro_set_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt);
+int trn_cell_establish_intro_set_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt);
/** Return a pointer to the TRUNNEL_SHA3_256_LEN-element array field
* handshake_mac of 'inp'.
*/
-uint8_t * hs_cell_establish_intro_getarray_handshake_mac(hs_cell_establish_intro_t *inp);
-/** As hs_cell_establish_intro_get_handshake_mac, but take and return
+uint8_t * trn_cell_establish_intro_getarray_handshake_mac(trn_cell_establish_intro_t *inp);
+/** As trn_cell_establish_intro_get_handshake_mac, but take and return
* a const pointer
*/
-const uint8_t * hs_cell_establish_intro_getconstarray_handshake_mac(const hs_cell_establish_intro_t *inp);
+const uint8_t * trn_cell_establish_intro_getconstarray_handshake_mac(const trn_cell_establish_intro_t *inp);
/** Return the position for end_sig_fields when we parsed this object
*/
-const uint8_t * hs_cell_establish_intro_get_end_sig_fields(const hs_cell_establish_intro_t *inp);
+const uint8_t * trn_cell_establish_intro_get_end_sig_fields(const trn_cell_establish_intro_t *inp);
/** Return the value of the sig_len field of the
- * hs_cell_establish_intro_t in 'inp'
+ * trn_cell_establish_intro_t in 'inp'
*/
-uint16_t hs_cell_establish_intro_get_sig_len(const hs_cell_establish_intro_t *inp);
+uint16_t trn_cell_establish_intro_get_sig_len(const trn_cell_establish_intro_t *inp);
/** Set the value of the sig_len field of the
- * hs_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success;
+ * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_establish_intro_set_sig_len(hs_cell_establish_intro_t *inp, uint16_t val);
+int trn_cell_establish_intro_set_sig_len(trn_cell_establish_intro_t *inp, uint16_t val);
/** Return the length of the dynamic array holding the sig field of
- * the hs_cell_establish_intro_t in 'inp'.
+ * the trn_cell_establish_intro_t in 'inp'.
*/
-size_t hs_cell_establish_intro_getlen_sig(const hs_cell_establish_intro_t *inp);
+size_t trn_cell_establish_intro_getlen_sig(const trn_cell_establish_intro_t *inp);
/** Return the element at position 'idx' of the dynamic array field
- * sig of the hs_cell_establish_intro_t in 'inp'.
+ * sig of the trn_cell_establish_intro_t in 'inp'.
*/
-uint8_t hs_cell_establish_intro_get_sig(hs_cell_establish_intro_t *inp, size_t idx);
-/** As hs_cell_establish_intro_get_sig, but take and return a const
+uint8_t trn_cell_establish_intro_get_sig(trn_cell_establish_intro_t *inp, size_t idx);
+/** As trn_cell_establish_intro_get_sig, but take and return a const
* pointer
*/
-uint8_t hs_cell_establish_intro_getconst_sig(const hs_cell_establish_intro_t *inp, size_t idx);
+uint8_t trn_cell_establish_intro_getconst_sig(const trn_cell_establish_intro_t *inp, size_t idx);
/** Change the element at position 'idx' of the dynamic array field
- * sig of the hs_cell_establish_intro_t in 'inp', so that it will hold
- * the value 'elt'.
+ * sig of the trn_cell_establish_intro_t in 'inp', so that it will
+ * hold the value 'elt'.
*/
-int hs_cell_establish_intro_set_sig(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt);
+int trn_cell_establish_intro_set_sig(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt);
/** Append a new element 'elt' to the dynamic array field sig of the
- * hs_cell_establish_intro_t in 'inp'.
+ * trn_cell_establish_intro_t in 'inp'.
*/
-int hs_cell_establish_intro_add_sig(hs_cell_establish_intro_t *inp, uint8_t elt);
+int trn_cell_establish_intro_add_sig(trn_cell_establish_intro_t *inp, uint8_t elt);
/** Return a pointer to the variable-length array field sig of 'inp'.
*/
-uint8_t * hs_cell_establish_intro_getarray_sig(hs_cell_establish_intro_t *inp);
-/** As hs_cell_establish_intro_get_sig, but take and return a const
+uint8_t * trn_cell_establish_intro_getarray_sig(trn_cell_establish_intro_t *inp);
+/** As trn_cell_establish_intro_get_sig, but take and return a const
* pointer
*/
-const uint8_t * hs_cell_establish_intro_getconstarray_sig(const hs_cell_establish_intro_t *inp);
+const uint8_t * trn_cell_establish_intro_getconstarray_sig(const trn_cell_establish_intro_t *inp);
/** Change the length of the variable-length array field sig of 'inp'
* to 'newlen'.Fill extra elements with 0. Return 0 on success; return
* -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_establish_intro_setlen_sig(hs_cell_establish_intro_t *inp, size_t newlen);
-/** Return a newly allocated hs_cell_intro_established with all
+int trn_cell_establish_intro_setlen_sig(trn_cell_establish_intro_t *inp, size_t newlen);
+/** Return a newly allocated trn_cell_intro_established with all
* elements set to zero.
*/
-hs_cell_intro_established_t *hs_cell_intro_established_new(void);
-/** Release all storage held by the hs_cell_intro_established in
+trn_cell_intro_established_t *trn_cell_intro_established_new(void);
+/** Release all storage held by the trn_cell_intro_established in
* 'victim'. (Do nothing if 'victim' is NULL.)
*/
-void hs_cell_intro_established_free(hs_cell_intro_established_t *victim);
-/** Try to parse a hs_cell_intro_established from the buffer in
+void trn_cell_intro_established_free(trn_cell_intro_established_t *victim);
+/** Try to parse a trn_cell_intro_established from the buffer in
* 'input', using up to 'len_in' bytes from the input buffer. On
* success, return the number of bytes consumed and set *output to the
- * newly allocated hs_cell_intro_established_t. On failure, return -2
+ * newly allocated trn_cell_intro_established_t. On failure, return -2
* if the input appears truncated, and -1 if the input is otherwise
* invalid.
*/
-ssize_t hs_cell_intro_established_parse(hs_cell_intro_established_t **output, const uint8_t *input, const size_t len_in);
+ssize_t trn_cell_intro_established_parse(trn_cell_intro_established_t **output, const uint8_t *input, const size_t len_in);
/** Return the number of bytes we expect to need to encode the
- * hs_cell_intro_established in 'obj'. On failure, return a negative
+ * trn_cell_intro_established in 'obj'. On failure, return a negative
* value. Note that this value may be an overestimate, and can even be
* an underestimate for certain unencodeable objects.
*/
-ssize_t hs_cell_intro_established_encoded_len(const hs_cell_intro_established_t *obj);
-/** Try to encode the hs_cell_intro_established from 'input' into the
+ssize_t trn_cell_intro_established_encoded_len(const trn_cell_intro_established_t *obj);
+/** Try to encode the trn_cell_intro_established from 'input' into the
* buffer at 'output', using up to 'avail' bytes of the output buffer.
* On success, return the number of bytes used. On failure, return -2
* if the buffer was not long enough, and -1 if the input was invalid.
*/
-ssize_t hs_cell_intro_established_encode(uint8_t *output, size_t avail, const hs_cell_intro_established_t *input);
-/** Check whether the internal state of the hs_cell_intro_established
+ssize_t trn_cell_intro_established_encode(uint8_t *output, size_t avail, const trn_cell_intro_established_t *input);
+/** Check whether the internal state of the trn_cell_intro_established
* in 'obj' is consistent. Return NULL if it is, and a short message
* if it is not.
*/
-const char *hs_cell_intro_established_check(const hs_cell_intro_established_t *obj);
+const char *trn_cell_intro_established_check(const trn_cell_intro_established_t *obj);
/** Clear any errors that were set on the object 'obj' by its setter
* functions. Return true iff errors were cleared.
*/
-int hs_cell_intro_established_clear_errors(hs_cell_intro_established_t *obj);
+int trn_cell_intro_established_clear_errors(trn_cell_intro_established_t *obj);
/** Return the value of the extensions field of the
- * hs_cell_intro_established_t in 'inp'
+ * trn_cell_intro_established_t in 'inp'
*/
-struct cell_extension_st * hs_cell_intro_established_get_extensions(hs_cell_intro_established_t *inp);
-/** As hs_cell_intro_established_get_extensions, but take and return a
- * const pointer
+struct trn_cell_extension_st * trn_cell_intro_established_get_extensions(trn_cell_intro_established_t *inp);
+/** As trn_cell_intro_established_get_extensions, but take and return
+ * a const pointer
*/
-const struct cell_extension_st * hs_cell_intro_established_getconst_extensions(const hs_cell_intro_established_t *inp);
+const struct trn_cell_extension_st * trn_cell_intro_established_getconst_extensions(const trn_cell_intro_established_t *inp);
/** Set the value of the extensions field of the
- * hs_cell_intro_established_t in 'inp' to 'val'. Free the old value
+ * trn_cell_intro_established_t in 'inp' to 'val'. Free the old value
* if any. Steals the referenceto 'val'.Return 0 on success; return -1
* and set the error code on 'inp' on failure.
*/
-int hs_cell_intro_established_set_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val);
-/** As hs_cell_intro_established_set_extensions, but does not free the
- * previous value.
+int trn_cell_intro_established_set_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val);
+/** As trn_cell_intro_established_set_extensions, but does not free
+ * the previous value.
*/
-int hs_cell_intro_established_set0_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val);
+int trn_cell_intro_established_set0_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val);
#endif
diff --git a/src/trunnel/hs/cell_establish_intro.trunnel b/src/trunnel/hs/cell_establish_intro.trunnel
index 33a133bf67..011ee62a15 100644
--- a/src/trunnel/hs/cell_establish_intro.trunnel
+++ b/src/trunnel/hs/cell_establish_intro.trunnel
@@ -4,12 +4,12 @@
* specified in proposal 224 section 3.1.
*/
-extern struct cell_extension;
+extern struct trn_cell_extension;
const TRUNNEL_SHA3_256_LEN = 32;
/* ESTABLISH_INTRO payload. See details in section 3.1.1 */
-struct hs_cell_establish_intro {
+struct trn_cell_establish_intro {
/* Indicate the start of the handshake authentication data. */
@ptr start_cell;
@@ -19,7 +19,7 @@ struct hs_cell_establish_intro {
u8 auth_key[auth_key_len];
/* Extension(s). Reserved fields. */
- struct cell_extension extensions;
+ struct trn_cell_extension extensions;
@ptr end_mac_fields;
/* Handshake MAC. */
@@ -35,7 +35,7 @@ struct hs_cell_establish_intro {
/* INTRO_ESTABLISHED payload which is an acknowledge of the ESTABLISH_INTRO
* cell. For legacy node, this payload is empty so the following only applies
* to version >= 3. */
-struct hs_cell_intro_established {
+struct trn_cell_intro_established {
/* Extension(s). Reserved fields. */
- struct cell_extension extensions;
+ struct trn_cell_extension extensions;
};
diff --git a/src/trunnel/hs/cell_introduce1.c b/src/trunnel/hs/cell_introduce1.c
index 5922a086dc..7501f6f196 100644
--- a/src/trunnel/hs/cell_introduce1.c
+++ b/src/trunnel/hs/cell_introduce1.c
@@ -28,14 +28,14 @@ int cellintroduce_deadcode_dummy__ = 0;
} \
} while (0)
-typedef struct cell_extension_st cell_extension_t;
-cell_extension_t *cell_extension_new(void);
-void cell_extension_free(cell_extension_t *victim);
-ssize_t cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in);
-ssize_t cell_extension_encoded_len(const cell_extension_t *obj);
-ssize_t cell_extension_encode(uint8_t *output, size_t avail, const cell_extension_t *input);
-const char *cell_extension_check(const cell_extension_t *obj);
-int cell_extension_clear_errors(cell_extension_t *obj);
+typedef struct trn_cell_extension_st trn_cell_extension_t;
+trn_cell_extension_t *trn_cell_extension_new(void);
+void trn_cell_extension_free(trn_cell_extension_t *victim);
+ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in);
+ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj);
+ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input);
+const char *trn_cell_extension_check(const trn_cell_extension_t *obj);
+int trn_cell_extension_clear_errors(trn_cell_extension_t *obj);
typedef struct link_specifier_st link_specifier_t;
link_specifier_t *link_specifier_new(void);
void link_specifier_free(link_specifier_t *victim);
@@ -44,10 +44,10 @@ ssize_t link_specifier_encoded_len(const link_specifier_t *obj);
ssize_t link_specifier_encode(uint8_t *output, size_t avail, const link_specifier_t *input);
const char *link_specifier_check(const link_specifier_t *obj);
int link_specifier_clear_errors(link_specifier_t *obj);
-hs_cell_introduce1_t *
-hs_cell_introduce1_new(void)
+trn_cell_introduce1_t *
+trn_cell_introduce1_new(void)
{
- hs_cell_introduce1_t *val = trunnel_calloc(1, sizeof(hs_cell_introduce1_t));
+ trn_cell_introduce1_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce1_t));
if (NULL == val)
return NULL;
return val;
@@ -56,47 +56,47 @@ hs_cell_introduce1_new(void)
/** Release all storage held inside 'obj', but do not free 'obj'.
*/
static void
-hs_cell_introduce1_clear(hs_cell_introduce1_t *obj)
+trn_cell_introduce1_clear(trn_cell_introduce1_t *obj)
{
(void) obj;
TRUNNEL_DYNARRAY_WIPE(&obj->auth_key);
TRUNNEL_DYNARRAY_CLEAR(&obj->auth_key);
- cell_extension_free(obj->extensions);
+ trn_cell_extension_free(obj->extensions);
obj->extensions = NULL;
TRUNNEL_DYNARRAY_WIPE(&obj->encrypted);
TRUNNEL_DYNARRAY_CLEAR(&obj->encrypted);
}
void
-hs_cell_introduce1_free(hs_cell_introduce1_t *obj)
+trn_cell_introduce1_free(trn_cell_introduce1_t *obj)
{
if (obj == NULL)
return;
- hs_cell_introduce1_clear(obj);
- trunnel_memwipe(obj, sizeof(hs_cell_introduce1_t));
+ trn_cell_introduce1_clear(obj);
+ trunnel_memwipe(obj, sizeof(trn_cell_introduce1_t));
trunnel_free_(obj);
}
size_t
-hs_cell_introduce1_getlen_legacy_key_id(const hs_cell_introduce1_t *inp)
+trn_cell_introduce1_getlen_legacy_key_id(const trn_cell_introduce1_t *inp)
{
(void)inp; return TRUNNEL_SHA1_LEN;
}
uint8_t
-hs_cell_introduce1_get_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx)
+trn_cell_introduce1_get_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx)
{
trunnel_assert(idx < TRUNNEL_SHA1_LEN);
return inp->legacy_key_id[idx];
}
uint8_t
-hs_cell_introduce1_getconst_legacy_key_id(const hs_cell_introduce1_t *inp, size_t idx)
+trn_cell_introduce1_getconst_legacy_key_id(const trn_cell_introduce1_t *inp, size_t idx)
{
- return hs_cell_introduce1_get_legacy_key_id((hs_cell_introduce1_t*)inp, idx);
+ return trn_cell_introduce1_get_legacy_key_id((trn_cell_introduce1_t*)inp, idx);
}
int
-hs_cell_introduce1_set_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt)
+trn_cell_introduce1_set_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt)
{
trunnel_assert(idx < TRUNNEL_SHA1_LEN);
inp->legacy_key_id[idx] = elt;
@@ -104,22 +104,22 @@ hs_cell_introduce1_set_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx, uint
}
uint8_t *
-hs_cell_introduce1_getarray_legacy_key_id(hs_cell_introduce1_t *inp)
+trn_cell_introduce1_getarray_legacy_key_id(trn_cell_introduce1_t *inp)
{
return inp->legacy_key_id;
}
const uint8_t *
-hs_cell_introduce1_getconstarray_legacy_key_id(const hs_cell_introduce1_t *inp)
+trn_cell_introduce1_getconstarray_legacy_key_id(const trn_cell_introduce1_t *inp)
{
- return (const uint8_t *)hs_cell_introduce1_getarray_legacy_key_id((hs_cell_introduce1_t*)inp);
+ return (const uint8_t *)trn_cell_introduce1_getarray_legacy_key_id((trn_cell_introduce1_t*)inp);
}
uint8_t
-hs_cell_introduce1_get_auth_key_type(const hs_cell_introduce1_t *inp)
+trn_cell_introduce1_get_auth_key_type(const trn_cell_introduce1_t *inp)
{
return inp->auth_key_type;
}
int
-hs_cell_introduce1_set_auth_key_type(hs_cell_introduce1_t *inp, uint8_t val)
+trn_cell_introduce1_set_auth_key_type(trn_cell_introduce1_t *inp, uint8_t val)
{
if (! ((val == 0 || val == 1 || val == 2))) {
TRUNNEL_SET_ERROR_CODE(inp);
@@ -129,41 +129,41 @@ hs_cell_introduce1_set_auth_key_type(hs_cell_introduce1_t *inp, uint8_t val)
return 0;
}
uint16_t
-hs_cell_introduce1_get_auth_key_len(const hs_cell_introduce1_t *inp)
+trn_cell_introduce1_get_auth_key_len(const trn_cell_introduce1_t *inp)
{
return inp->auth_key_len;
}
int
-hs_cell_introduce1_set_auth_key_len(hs_cell_introduce1_t *inp, uint16_t val)
+trn_cell_introduce1_set_auth_key_len(trn_cell_introduce1_t *inp, uint16_t val)
{
inp->auth_key_len = val;
return 0;
}
size_t
-hs_cell_introduce1_getlen_auth_key(const hs_cell_introduce1_t *inp)
+trn_cell_introduce1_getlen_auth_key(const trn_cell_introduce1_t *inp)
{
return TRUNNEL_DYNARRAY_LEN(&inp->auth_key);
}
uint8_t
-hs_cell_introduce1_get_auth_key(hs_cell_introduce1_t *inp, size_t idx)
+trn_cell_introduce1_get_auth_key(trn_cell_introduce1_t *inp, size_t idx)
{
return TRUNNEL_DYNARRAY_GET(&inp->auth_key, idx);
}
uint8_t
-hs_cell_introduce1_getconst_auth_key(const hs_cell_introduce1_t *inp, size_t idx)
+trn_cell_introduce1_getconst_auth_key(const trn_cell_introduce1_t *inp, size_t idx)
{
- return hs_cell_introduce1_get_auth_key((hs_cell_introduce1_t*)inp, idx);
+ return trn_cell_introduce1_get_auth_key((trn_cell_introduce1_t*)inp, idx);
}
int
-hs_cell_introduce1_set_auth_key(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt)
+trn_cell_introduce1_set_auth_key(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt)
{
TRUNNEL_DYNARRAY_SET(&inp->auth_key, idx, elt);
return 0;
}
int
-hs_cell_introduce1_add_auth_key(hs_cell_introduce1_t *inp, uint8_t elt)
+trn_cell_introduce1_add_auth_key(trn_cell_introduce1_t *inp, uint8_t elt)
{
#if SIZE_MAX >= UINT16_MAX
if (inp->auth_key.n_ == UINT16_MAX)
@@ -177,17 +177,17 @@ hs_cell_introduce1_add_auth_key(hs_cell_introduce1_t *inp, uint8_t elt)
}
uint8_t *
-hs_cell_introduce1_getarray_auth_key(hs_cell_introduce1_t *inp)
+trn_cell_introduce1_getarray_auth_key(trn_cell_introduce1_t *inp)
{
return inp->auth_key.elts_;
}
const uint8_t *
-hs_cell_introduce1_getconstarray_auth_key(const hs_cell_introduce1_t *inp)
+trn_cell_introduce1_getconstarray_auth_key(const trn_cell_introduce1_t *inp)
{
- return (const uint8_t *)hs_cell_introduce1_getarray_auth_key((hs_cell_introduce1_t*)inp);
+ return (const uint8_t *)trn_cell_introduce1_getarray_auth_key((trn_cell_introduce1_t*)inp);
}
int
-hs_cell_introduce1_setlen_auth_key(hs_cell_introduce1_t *inp, size_t newlen)
+trn_cell_introduce1_setlen_auth_key(trn_cell_introduce1_t *inp, size_t newlen)
{
uint8_t *newptr;
#if UINT16_MAX < SIZE_MAX
@@ -206,54 +206,54 @@ hs_cell_introduce1_setlen_auth_key(hs_cell_introduce1_t *inp, size_t newlen)
TRUNNEL_SET_ERROR_CODE(inp);
return -1;
}
-struct cell_extension_st *
-hs_cell_introduce1_get_extensions(hs_cell_introduce1_t *inp)
+struct trn_cell_extension_st *
+trn_cell_introduce1_get_extensions(trn_cell_introduce1_t *inp)
{
return inp->extensions;
}
-const struct cell_extension_st *
-hs_cell_introduce1_getconst_extensions(const hs_cell_introduce1_t *inp)
+const struct trn_cell_extension_st *
+trn_cell_introduce1_getconst_extensions(const trn_cell_introduce1_t *inp)
{
- return hs_cell_introduce1_get_extensions((hs_cell_introduce1_t*) inp);
+ return trn_cell_introduce1_get_extensions((trn_cell_introduce1_t*) inp);
}
int
-hs_cell_introduce1_set_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val)
+trn_cell_introduce1_set_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val)
{
if (inp->extensions && inp->extensions != val)
- cell_extension_free(inp->extensions);
- return hs_cell_introduce1_set0_extensions(inp, val);
+ trn_cell_extension_free(inp->extensions);
+ return trn_cell_introduce1_set0_extensions(inp, val);
}
int
-hs_cell_introduce1_set0_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val)
+trn_cell_introduce1_set0_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val)
{
inp->extensions = val;
return 0;
}
size_t
-hs_cell_introduce1_getlen_encrypted(const hs_cell_introduce1_t *inp)
+trn_cell_introduce1_getlen_encrypted(const trn_cell_introduce1_t *inp)
{
return TRUNNEL_DYNARRAY_LEN(&inp->encrypted);
}
uint8_t
-hs_cell_introduce1_get_encrypted(hs_cell_introduce1_t *inp, size_t idx)
+trn_cell_introduce1_get_encrypted(trn_cell_introduce1_t *inp, size_t idx)
{
return TRUNNEL_DYNARRAY_GET(&inp->encrypted, idx);
}
uint8_t
-hs_cell_introduce1_getconst_encrypted(const hs_cell_introduce1_t *inp, size_t idx)
+trn_cell_introduce1_getconst_encrypted(const trn_cell_introduce1_t *inp, size_t idx)
{
- return hs_cell_introduce1_get_encrypted((hs_cell_introduce1_t*)inp, idx);
+ return trn_cell_introduce1_get_encrypted((trn_cell_introduce1_t*)inp, idx);
}
int
-hs_cell_introduce1_set_encrypted(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt)
+trn_cell_introduce1_set_encrypted(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt)
{
TRUNNEL_DYNARRAY_SET(&inp->encrypted, idx, elt);
return 0;
}
int
-hs_cell_introduce1_add_encrypted(hs_cell_introduce1_t *inp, uint8_t elt)
+trn_cell_introduce1_add_encrypted(trn_cell_introduce1_t *inp, uint8_t elt)
{
TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->encrypted, elt, {});
return 0;
@@ -263,17 +263,17 @@ hs_cell_introduce1_add_encrypted(hs_cell_introduce1_t *inp, uint8_t elt)
}
uint8_t *
-hs_cell_introduce1_getarray_encrypted(hs_cell_introduce1_t *inp)
+trn_cell_introduce1_getarray_encrypted(trn_cell_introduce1_t *inp)
{
return inp->encrypted.elts_;
}
const uint8_t *
-hs_cell_introduce1_getconstarray_encrypted(const hs_cell_introduce1_t *inp)
+trn_cell_introduce1_getconstarray_encrypted(const trn_cell_introduce1_t *inp)
{
- return (const uint8_t *)hs_cell_introduce1_getarray_encrypted((hs_cell_introduce1_t*)inp);
+ return (const uint8_t *)trn_cell_introduce1_getarray_encrypted((trn_cell_introduce1_t*)inp);
}
int
-hs_cell_introduce1_setlen_encrypted(hs_cell_introduce1_t *inp, size_t newlen)
+trn_cell_introduce1_setlen_encrypted(trn_cell_introduce1_t *inp, size_t newlen)
{
uint8_t *newptr;
newptr = trunnel_dynarray_setlen(&inp->encrypted.allocated_,
@@ -289,7 +289,7 @@ hs_cell_introduce1_setlen_encrypted(hs_cell_introduce1_t *inp, size_t newlen)
return -1;
}
const char *
-hs_cell_introduce1_check(const hs_cell_introduce1_t *obj)
+trn_cell_introduce1_check(const trn_cell_introduce1_t *obj)
{
if (obj == NULL)
return "Object was NULL";
@@ -301,18 +301,18 @@ hs_cell_introduce1_check(const hs_cell_introduce1_t *obj)
return "Length mismatch for auth_key";
{
const char *msg;
- if (NULL != (msg = cell_extension_check(obj->extensions)))
+ if (NULL != (msg = trn_cell_extension_check(obj->extensions)))
return msg;
}
return NULL;
}
ssize_t
-hs_cell_introduce1_encoded_len(const hs_cell_introduce1_t *obj)
+trn_cell_introduce1_encoded_len(const trn_cell_introduce1_t *obj)
{
ssize_t result = 0;
- if (NULL != hs_cell_introduce1_check(obj))
+ if (NULL != trn_cell_introduce1_check(obj))
return -1;
@@ -328,32 +328,32 @@ hs_cell_introduce1_encoded_len(const hs_cell_introduce1_t *obj)
/* Length of u8 auth_key[auth_key_len] */
result += TRUNNEL_DYNARRAY_LEN(&obj->auth_key);
- /* Length of struct cell_extension extensions */
- result += cell_extension_encoded_len(obj->extensions);
+ /* Length of struct trn_cell_extension extensions */
+ result += trn_cell_extension_encoded_len(obj->extensions);
/* Length of u8 encrypted[] */
result += TRUNNEL_DYNARRAY_LEN(&obj->encrypted);
return result;
}
int
-hs_cell_introduce1_clear_errors(hs_cell_introduce1_t *obj)
+trn_cell_introduce1_clear_errors(trn_cell_introduce1_t *obj)
{
int r = obj->trunnel_error_code_;
obj->trunnel_error_code_ = 0;
return r;
}
ssize_t
-hs_cell_introduce1_encode(uint8_t *output, const size_t avail, const hs_cell_introduce1_t *obj)
+trn_cell_introduce1_encode(uint8_t *output, const size_t avail, const trn_cell_introduce1_t *obj)
{
ssize_t result = 0;
size_t written = 0;
uint8_t *ptr = output;
const char *msg;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
- const ssize_t encoded_len = hs_cell_introduce1_encoded_len(obj);
+ const ssize_t encoded_len = trn_cell_introduce1_encoded_len(obj);
#endif
- if (NULL != (msg = hs_cell_introduce1_check(obj)))
+ if (NULL != (msg = trn_cell_introduce1_check(obj)))
goto check_failed;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
@@ -393,9 +393,9 @@ hs_cell_introduce1_encode(uint8_t *output, const size_t avail, const hs_cell_int
written += elt_len; ptr += elt_len;
}
- /* Encode struct cell_extension extensions */
+ /* Encode struct trn_cell_extension extensions */
trunnel_assert(written <= avail);
- result = cell_extension_encode(ptr, avail - written, obj->extensions);
+ result = trn_cell_extension_encode(ptr, avail - written, obj->extensions);
if (result < 0)
goto fail; /* XXXXXXX !*/
written += result; ptr += result;
@@ -435,11 +435,11 @@ hs_cell_introduce1_encode(uint8_t *output, const size_t avail, const hs_cell_int
return result;
}
-/** As hs_cell_introduce1_parse(), but do not allocate the output
+/** As trn_cell_introduce1_parse(), but do not allocate the output
* object.
*/
static ssize_t
-hs_cell_introduce1_parse_into(hs_cell_introduce1_t *obj, const uint8_t *input, const size_t len_in)
+trn_cell_introduce1_parse_into(trn_cell_introduce1_t *obj, const uint8_t *input, const size_t len_in)
{
const uint8_t *ptr = input;
size_t remaining = len_in;
@@ -471,8 +471,8 @@ hs_cell_introduce1_parse_into(hs_cell_introduce1_t *obj, const uint8_t *input, c
memcpy(obj->auth_key.elts_, ptr, obj->auth_key_len);
ptr += obj->auth_key_len; remaining -= obj->auth_key_len;
- /* Parse struct cell_extension extensions */
- result = cell_extension_parse(&obj->extensions, ptr, remaining);
+ /* Parse struct trn_cell_extension extensions */
+ result = trn_cell_extension_parse(&obj->extensions, ptr, remaining);
if (result < 0)
goto relay_fail;
trunnel_assert((size_t)result <= remaining);
@@ -500,23 +500,23 @@ hs_cell_introduce1_parse_into(hs_cell_introduce1_t *obj, const uint8_t *input, c
}
ssize_t
-hs_cell_introduce1_parse(hs_cell_introduce1_t **output, const uint8_t *input, const size_t len_in)
+trn_cell_introduce1_parse(trn_cell_introduce1_t **output, const uint8_t *input, const size_t len_in)
{
ssize_t result;
- *output = hs_cell_introduce1_new();
+ *output = trn_cell_introduce1_new();
if (NULL == *output)
return -1;
- result = hs_cell_introduce1_parse_into(*output, input, len_in);
+ result = trn_cell_introduce1_parse_into(*output, input, len_in);
if (result < 0) {
- hs_cell_introduce1_free(*output);
+ trn_cell_introduce1_free(*output);
*output = NULL;
}
return result;
}
-hs_cell_introduce_ack_t *
-hs_cell_introduce_ack_new(void)
+trn_cell_introduce_ack_t *
+trn_cell_introduce_ack_new(void)
{
- hs_cell_introduce_ack_t *val = trunnel_calloc(1, sizeof(hs_cell_introduce_ack_t));
+ trn_cell_introduce_ack_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce_ack_t));
if (NULL == val)
return NULL;
return val;
@@ -525,30 +525,30 @@ hs_cell_introduce_ack_new(void)
/** Release all storage held inside 'obj', but do not free 'obj'.
*/
static void
-hs_cell_introduce_ack_clear(hs_cell_introduce_ack_t *obj)
+trn_cell_introduce_ack_clear(trn_cell_introduce_ack_t *obj)
{
(void) obj;
- cell_extension_free(obj->extensions);
+ trn_cell_extension_free(obj->extensions);
obj->extensions = NULL;
}
void
-hs_cell_introduce_ack_free(hs_cell_introduce_ack_t *obj)
+trn_cell_introduce_ack_free(trn_cell_introduce_ack_t *obj)
{
if (obj == NULL)
return;
- hs_cell_introduce_ack_clear(obj);
- trunnel_memwipe(obj, sizeof(hs_cell_introduce_ack_t));
+ trn_cell_introduce_ack_clear(obj);
+ trunnel_memwipe(obj, sizeof(trn_cell_introduce_ack_t));
trunnel_free_(obj);
}
uint16_t
-hs_cell_introduce_ack_get_status(const hs_cell_introduce_ack_t *inp)
+trn_cell_introduce_ack_get_status(const trn_cell_introduce_ack_t *inp)
{
return inp->status;
}
int
-hs_cell_introduce_ack_set_status(hs_cell_introduce_ack_t *inp, uint16_t val)
+trn_cell_introduce_ack_set_status(trn_cell_introduce_ack_t *inp, uint16_t val)
{
if (! ((val == 0 || val == 1 || val == 2))) {
TRUNNEL_SET_ERROR_CODE(inp);
@@ -557,31 +557,31 @@ hs_cell_introduce_ack_set_status(hs_cell_introduce_ack_t *inp, uint16_t val)
inp->status = val;
return 0;
}
-struct cell_extension_st *
-hs_cell_introduce_ack_get_extensions(hs_cell_introduce_ack_t *inp)
+struct trn_cell_extension_st *
+trn_cell_introduce_ack_get_extensions(trn_cell_introduce_ack_t *inp)
{
return inp->extensions;
}
-const struct cell_extension_st *
-hs_cell_introduce_ack_getconst_extensions(const hs_cell_introduce_ack_t *inp)
+const struct trn_cell_extension_st *
+trn_cell_introduce_ack_getconst_extensions(const trn_cell_introduce_ack_t *inp)
{
- return hs_cell_introduce_ack_get_extensions((hs_cell_introduce_ack_t*) inp);
+ return trn_cell_introduce_ack_get_extensions((trn_cell_introduce_ack_t*) inp);
}
int
-hs_cell_introduce_ack_set_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val)
+trn_cell_introduce_ack_set_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val)
{
if (inp->extensions && inp->extensions != val)
- cell_extension_free(inp->extensions);
- return hs_cell_introduce_ack_set0_extensions(inp, val);
+ trn_cell_extension_free(inp->extensions);
+ return trn_cell_introduce_ack_set0_extensions(inp, val);
}
int
-hs_cell_introduce_ack_set0_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val)
+trn_cell_introduce_ack_set0_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val)
{
inp->extensions = val;
return 0;
}
const char *
-hs_cell_introduce_ack_check(const hs_cell_introduce_ack_t *obj)
+trn_cell_introduce_ack_check(const trn_cell_introduce_ack_t *obj)
{
if (obj == NULL)
return "Object was NULL";
@@ -591,47 +591,47 @@ hs_cell_introduce_ack_check(const hs_cell_introduce_ack_t *obj)
return "Integer out of bounds";
{
const char *msg;
- if (NULL != (msg = cell_extension_check(obj->extensions)))
+ if (NULL != (msg = trn_cell_extension_check(obj->extensions)))
return msg;
}
return NULL;
}
ssize_t
-hs_cell_introduce_ack_encoded_len(const hs_cell_introduce_ack_t *obj)
+trn_cell_introduce_ack_encoded_len(const trn_cell_introduce_ack_t *obj)
{
ssize_t result = 0;
- if (NULL != hs_cell_introduce_ack_check(obj))
+ if (NULL != trn_cell_introduce_ack_check(obj))
return -1;
/* Length of u16 status IN [0, 1, 2] */
result += 2;
- /* Length of struct cell_extension extensions */
- result += cell_extension_encoded_len(obj->extensions);
+ /* Length of struct trn_cell_extension extensions */
+ result += trn_cell_extension_encoded_len(obj->extensions);
return result;
}
int
-hs_cell_introduce_ack_clear_errors(hs_cell_introduce_ack_t *obj)
+trn_cell_introduce_ack_clear_errors(trn_cell_introduce_ack_t *obj)
{
int r = obj->trunnel_error_code_;
obj->trunnel_error_code_ = 0;
return r;
}
ssize_t
-hs_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const hs_cell_introduce_ack_t *obj)
+trn_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const trn_cell_introduce_ack_t *obj)
{
ssize_t result = 0;
size_t written = 0;
uint8_t *ptr = output;
const char *msg;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
- const ssize_t encoded_len = hs_cell_introduce_ack_encoded_len(obj);
+ const ssize_t encoded_len = trn_cell_introduce_ack_encoded_len(obj);
#endif
- if (NULL != (msg = hs_cell_introduce_ack_check(obj)))
+ if (NULL != (msg = trn_cell_introduce_ack_check(obj)))
goto check_failed;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
@@ -645,9 +645,9 @@ hs_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const hs_cell_
trunnel_set_uint16(ptr, trunnel_htons(obj->status));
written += 2; ptr += 2;
- /* Encode struct cell_extension extensions */
+ /* Encode struct trn_cell_extension extensions */
trunnel_assert(written <= avail);
- result = cell_extension_encode(ptr, avail - written, obj->extensions);
+ result = trn_cell_extension_encode(ptr, avail - written, obj->extensions);
if (result < 0)
goto fail; /* XXXXXXX !*/
written += result; ptr += result;
@@ -676,11 +676,11 @@ hs_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const hs_cell_
return result;
}
-/** As hs_cell_introduce_ack_parse(), but do not allocate the output
+/** As trn_cell_introduce_ack_parse(), but do not allocate the output
* object.
*/
static ssize_t
-hs_cell_introduce_ack_parse_into(hs_cell_introduce_ack_t *obj, const uint8_t *input, const size_t len_in)
+trn_cell_introduce_ack_parse_into(trn_cell_introduce_ack_t *obj, const uint8_t *input, const size_t len_in)
{
const uint8_t *ptr = input;
size_t remaining = len_in;
@@ -694,8 +694,8 @@ hs_cell_introduce_ack_parse_into(hs_cell_introduce_ack_t *obj, const uint8_t *in
if (! (obj->status == 0 || obj->status == 1 || obj->status == 2))
goto fail;
- /* Parse struct cell_extension extensions */
- result = cell_extension_parse(&obj->extensions, ptr, remaining);
+ /* Parse struct trn_cell_extension extensions */
+ result = trn_cell_extension_parse(&obj->extensions, ptr, remaining);
if (result < 0)
goto relay_fail;
trunnel_assert((size_t)result <= remaining);
@@ -714,23 +714,23 @@ hs_cell_introduce_ack_parse_into(hs_cell_introduce_ack_t *obj, const uint8_t *in
}
ssize_t
-hs_cell_introduce_ack_parse(hs_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in)
+trn_cell_introduce_ack_parse(trn_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in)
{
ssize_t result;
- *output = hs_cell_introduce_ack_new();
+ *output = trn_cell_introduce_ack_new();
if (NULL == *output)
return -1;
- result = hs_cell_introduce_ack_parse_into(*output, input, len_in);
+ result = trn_cell_introduce_ack_parse_into(*output, input, len_in);
if (result < 0) {
- hs_cell_introduce_ack_free(*output);
+ trn_cell_introduce_ack_free(*output);
*output = NULL;
}
return result;
}
-hs_cell_introduce_encrypted_t *
-hs_cell_introduce_encrypted_new(void)
+trn_cell_introduce_encrypted_t *
+trn_cell_introduce_encrypted_new(void)
{
- hs_cell_introduce_encrypted_t *val = trunnel_calloc(1, sizeof(hs_cell_introduce_encrypted_t));
+ trn_cell_introduce_encrypted_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce_encrypted_t));
if (NULL == val)
return NULL;
val->onion_key_type = 1;
@@ -740,10 +740,10 @@ hs_cell_introduce_encrypted_new(void)
/** Release all storage held inside 'obj', but do not free 'obj'.
*/
static void
-hs_cell_introduce_encrypted_clear(hs_cell_introduce_encrypted_t *obj)
+trn_cell_introduce_encrypted_clear(trn_cell_introduce_encrypted_t *obj)
{
(void) obj;
- cell_extension_free(obj->extensions);
+ trn_cell_extension_free(obj->extensions);
obj->extensions = NULL;
TRUNNEL_DYNARRAY_WIPE(&obj->onion_key);
TRUNNEL_DYNARRAY_CLEAR(&obj->onion_key);
@@ -761,35 +761,35 @@ hs_cell_introduce_encrypted_clear(hs_cell_introduce_encrypted_t *obj)
}
void
-hs_cell_introduce_encrypted_free(hs_cell_introduce_encrypted_t *obj)
+trn_cell_introduce_encrypted_free(trn_cell_introduce_encrypted_t *obj)
{
if (obj == NULL)
return;
- hs_cell_introduce_encrypted_clear(obj);
- trunnel_memwipe(obj, sizeof(hs_cell_introduce_encrypted_t));
+ trn_cell_introduce_encrypted_clear(obj);
+ trunnel_memwipe(obj, sizeof(trn_cell_introduce_encrypted_t));
trunnel_free_(obj);
}
size_t
-hs_cell_introduce_encrypted_getlen_rend_cookie(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getlen_rend_cookie(const trn_cell_introduce_encrypted_t *inp)
{
(void)inp; return TRUNNEL_REND_COOKIE_LEN;
}
uint8_t
-hs_cell_introduce_encrypted_get_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx)
+trn_cell_introduce_encrypted_get_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx)
{
trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN);
return inp->rend_cookie[idx];
}
uint8_t
-hs_cell_introduce_encrypted_getconst_rend_cookie(const hs_cell_introduce_encrypted_t *inp, size_t idx)
+trn_cell_introduce_encrypted_getconst_rend_cookie(const trn_cell_introduce_encrypted_t *inp, size_t idx)
{
- return hs_cell_introduce_encrypted_get_rend_cookie((hs_cell_introduce_encrypted_t*)inp, idx);
+ return trn_cell_introduce_encrypted_get_rend_cookie((trn_cell_introduce_encrypted_t*)inp, idx);
}
int
-hs_cell_introduce_encrypted_set_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt)
+trn_cell_introduce_encrypted_set_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt)
{
trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN);
inp->rend_cookie[idx] = elt;
@@ -797,45 +797,45 @@ hs_cell_introduce_encrypted_set_rend_cookie(hs_cell_introduce_encrypted_t *inp,
}
uint8_t *
-hs_cell_introduce_encrypted_getarray_rend_cookie(hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getarray_rend_cookie(trn_cell_introduce_encrypted_t *inp)
{
return inp->rend_cookie;
}
const uint8_t *
-hs_cell_introduce_encrypted_getconstarray_rend_cookie(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getconstarray_rend_cookie(const trn_cell_introduce_encrypted_t *inp)
{
- return (const uint8_t *)hs_cell_introduce_encrypted_getarray_rend_cookie((hs_cell_introduce_encrypted_t*)inp);
+ return (const uint8_t *)trn_cell_introduce_encrypted_getarray_rend_cookie((trn_cell_introduce_encrypted_t*)inp);
}
-struct cell_extension_st *
-hs_cell_introduce_encrypted_get_extensions(hs_cell_introduce_encrypted_t *inp)
+struct trn_cell_extension_st *
+trn_cell_introduce_encrypted_get_extensions(trn_cell_introduce_encrypted_t *inp)
{
return inp->extensions;
}
-const struct cell_extension_st *
-hs_cell_introduce_encrypted_getconst_extensions(const hs_cell_introduce_encrypted_t *inp)
+const struct trn_cell_extension_st *
+trn_cell_introduce_encrypted_getconst_extensions(const trn_cell_introduce_encrypted_t *inp)
{
- return hs_cell_introduce_encrypted_get_extensions((hs_cell_introduce_encrypted_t*) inp);
+ return trn_cell_introduce_encrypted_get_extensions((trn_cell_introduce_encrypted_t*) inp);
}
int
-hs_cell_introduce_encrypted_set_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val)
+trn_cell_introduce_encrypted_set_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val)
{
if (inp->extensions && inp->extensions != val)
- cell_extension_free(inp->extensions);
- return hs_cell_introduce_encrypted_set0_extensions(inp, val);
+ trn_cell_extension_free(inp->extensions);
+ return trn_cell_introduce_encrypted_set0_extensions(inp, val);
}
int
-hs_cell_introduce_encrypted_set0_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val)
+trn_cell_introduce_encrypted_set0_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val)
{
inp->extensions = val;
return 0;
}
uint8_t
-hs_cell_introduce_encrypted_get_onion_key_type(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_get_onion_key_type(const trn_cell_introduce_encrypted_t *inp)
{
return inp->onion_key_type;
}
int
-hs_cell_introduce_encrypted_set_onion_key_type(hs_cell_introduce_encrypted_t *inp, uint8_t val)
+trn_cell_introduce_encrypted_set_onion_key_type(trn_cell_introduce_encrypted_t *inp, uint8_t val)
{
if (! ((val == 1))) {
TRUNNEL_SET_ERROR_CODE(inp);
@@ -845,41 +845,41 @@ hs_cell_introduce_encrypted_set_onion_key_type(hs_cell_introduce_encrypted_t *in
return 0;
}
uint16_t
-hs_cell_introduce_encrypted_get_onion_key_len(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_get_onion_key_len(const trn_cell_introduce_encrypted_t *inp)
{
return inp->onion_key_len;
}
int
-hs_cell_introduce_encrypted_set_onion_key_len(hs_cell_introduce_encrypted_t *inp, uint16_t val)
+trn_cell_introduce_encrypted_set_onion_key_len(trn_cell_introduce_encrypted_t *inp, uint16_t val)
{
inp->onion_key_len = val;
return 0;
}
size_t
-hs_cell_introduce_encrypted_getlen_onion_key(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getlen_onion_key(const trn_cell_introduce_encrypted_t *inp)
{
return TRUNNEL_DYNARRAY_LEN(&inp->onion_key);
}
uint8_t
-hs_cell_introduce_encrypted_get_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx)
+trn_cell_introduce_encrypted_get_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx)
{
return TRUNNEL_DYNARRAY_GET(&inp->onion_key, idx);
}
uint8_t
-hs_cell_introduce_encrypted_getconst_onion_key(const hs_cell_introduce_encrypted_t *inp, size_t idx)
+trn_cell_introduce_encrypted_getconst_onion_key(const trn_cell_introduce_encrypted_t *inp, size_t idx)
{
- return hs_cell_introduce_encrypted_get_onion_key((hs_cell_introduce_encrypted_t*)inp, idx);
+ return trn_cell_introduce_encrypted_get_onion_key((trn_cell_introduce_encrypted_t*)inp, idx);
}
int
-hs_cell_introduce_encrypted_set_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt)
+trn_cell_introduce_encrypted_set_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt)
{
TRUNNEL_DYNARRAY_SET(&inp->onion_key, idx, elt);
return 0;
}
int
-hs_cell_introduce_encrypted_add_onion_key(hs_cell_introduce_encrypted_t *inp, uint8_t elt)
+trn_cell_introduce_encrypted_add_onion_key(trn_cell_introduce_encrypted_t *inp, uint8_t elt)
{
#if SIZE_MAX >= UINT16_MAX
if (inp->onion_key.n_ == UINT16_MAX)
@@ -893,17 +893,17 @@ hs_cell_introduce_encrypted_add_onion_key(hs_cell_introduce_encrypted_t *inp, ui
}
uint8_t *
-hs_cell_introduce_encrypted_getarray_onion_key(hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getarray_onion_key(trn_cell_introduce_encrypted_t *inp)
{
return inp->onion_key.elts_;
}
const uint8_t *
-hs_cell_introduce_encrypted_getconstarray_onion_key(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getconstarray_onion_key(const trn_cell_introduce_encrypted_t *inp)
{
- return (const uint8_t *)hs_cell_introduce_encrypted_getarray_onion_key((hs_cell_introduce_encrypted_t*)inp);
+ return (const uint8_t *)trn_cell_introduce_encrypted_getarray_onion_key((trn_cell_introduce_encrypted_t*)inp);
}
int
-hs_cell_introduce_encrypted_setlen_onion_key(hs_cell_introduce_encrypted_t *inp, size_t newlen)
+trn_cell_introduce_encrypted_setlen_onion_key(trn_cell_introduce_encrypted_t *inp, size_t newlen)
{
uint8_t *newptr;
#if UINT16_MAX < SIZE_MAX
@@ -923,49 +923,49 @@ hs_cell_introduce_encrypted_setlen_onion_key(hs_cell_introduce_encrypted_t *inp,
return -1;
}
uint8_t
-hs_cell_introduce_encrypted_get_nspec(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_get_nspec(const trn_cell_introduce_encrypted_t *inp)
{
return inp->nspec;
}
int
-hs_cell_introduce_encrypted_set_nspec(hs_cell_introduce_encrypted_t *inp, uint8_t val)
+trn_cell_introduce_encrypted_set_nspec(trn_cell_introduce_encrypted_t *inp, uint8_t val)
{
inp->nspec = val;
return 0;
}
size_t
-hs_cell_introduce_encrypted_getlen_nspecs(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getlen_nspecs(const trn_cell_introduce_encrypted_t *inp)
{
return TRUNNEL_DYNARRAY_LEN(&inp->nspecs);
}
struct link_specifier_st *
-hs_cell_introduce_encrypted_get_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx)
+trn_cell_introduce_encrypted_get_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx)
{
return TRUNNEL_DYNARRAY_GET(&inp->nspecs, idx);
}
const struct link_specifier_st *
-hs_cell_introduce_encrypted_getconst_nspecs(const hs_cell_introduce_encrypted_t *inp, size_t idx)
+trn_cell_introduce_encrypted_getconst_nspecs(const trn_cell_introduce_encrypted_t *inp, size_t idx)
{
- return hs_cell_introduce_encrypted_get_nspecs((hs_cell_introduce_encrypted_t*)inp, idx);
+ return trn_cell_introduce_encrypted_get_nspecs((trn_cell_introduce_encrypted_t*)inp, idx);
}
int
-hs_cell_introduce_encrypted_set_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt)
+trn_cell_introduce_encrypted_set_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt)
{
link_specifier_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->nspecs, idx);
if (oldval && oldval != elt)
link_specifier_free(oldval);
- return hs_cell_introduce_encrypted_set0_nspecs(inp, idx, elt);
+ return trn_cell_introduce_encrypted_set0_nspecs(inp, idx, elt);
}
int
-hs_cell_introduce_encrypted_set0_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt)
+trn_cell_introduce_encrypted_set0_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt)
{
TRUNNEL_DYNARRAY_SET(&inp->nspecs, idx, elt);
return 0;
}
int
-hs_cell_introduce_encrypted_add_nspecs(hs_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt)
+trn_cell_introduce_encrypted_add_nspecs(trn_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt)
{
#if SIZE_MAX >= UINT8_MAX
if (inp->nspecs.n_ == UINT8_MAX)
@@ -979,17 +979,17 @@ hs_cell_introduce_encrypted_add_nspecs(hs_cell_introduce_encrypted_t *inp, struc
}
struct link_specifier_st * *
-hs_cell_introduce_encrypted_getarray_nspecs(hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getarray_nspecs(trn_cell_introduce_encrypted_t *inp)
{
return inp->nspecs.elts_;
}
const struct link_specifier_st * const *
-hs_cell_introduce_encrypted_getconstarray_nspecs(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getconstarray_nspecs(const trn_cell_introduce_encrypted_t *inp)
{
- return (const struct link_specifier_st * const *)hs_cell_introduce_encrypted_getarray_nspecs((hs_cell_introduce_encrypted_t*)inp);
+ return (const struct link_specifier_st * const *)trn_cell_introduce_encrypted_getarray_nspecs((trn_cell_introduce_encrypted_t*)inp);
}
int
-hs_cell_introduce_encrypted_setlen_nspecs(hs_cell_introduce_encrypted_t *inp, size_t newlen)
+trn_cell_introduce_encrypted_setlen_nspecs(trn_cell_introduce_encrypted_t *inp, size_t newlen)
{
struct link_specifier_st * *newptr;
#if UINT8_MAX < SIZE_MAX
@@ -1009,30 +1009,30 @@ hs_cell_introduce_encrypted_setlen_nspecs(hs_cell_introduce_encrypted_t *inp, si
return -1;
}
size_t
-hs_cell_introduce_encrypted_getlen_pad(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getlen_pad(const trn_cell_introduce_encrypted_t *inp)
{
return TRUNNEL_DYNARRAY_LEN(&inp->pad);
}
uint8_t
-hs_cell_introduce_encrypted_get_pad(hs_cell_introduce_encrypted_t *inp, size_t idx)
+trn_cell_introduce_encrypted_get_pad(trn_cell_introduce_encrypted_t *inp, size_t idx)
{
return TRUNNEL_DYNARRAY_GET(&inp->pad, idx);
}
uint8_t
-hs_cell_introduce_encrypted_getconst_pad(const hs_cell_introduce_encrypted_t *inp, size_t idx)
+trn_cell_introduce_encrypted_getconst_pad(const trn_cell_introduce_encrypted_t *inp, size_t idx)
{
- return hs_cell_introduce_encrypted_get_pad((hs_cell_introduce_encrypted_t*)inp, idx);
+ return trn_cell_introduce_encrypted_get_pad((trn_cell_introduce_encrypted_t*)inp, idx);
}
int
-hs_cell_introduce_encrypted_set_pad(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt)
+trn_cell_introduce_encrypted_set_pad(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt)
{
TRUNNEL_DYNARRAY_SET(&inp->pad, idx, elt);
return 0;
}
int
-hs_cell_introduce_encrypted_add_pad(hs_cell_introduce_encrypted_t *inp, uint8_t elt)
+trn_cell_introduce_encrypted_add_pad(trn_cell_introduce_encrypted_t *inp, uint8_t elt)
{
TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->pad, elt, {});
return 0;
@@ -1042,17 +1042,17 @@ hs_cell_introduce_encrypted_add_pad(hs_cell_introduce_encrypted_t *inp, uint8_t
}
uint8_t *
-hs_cell_introduce_encrypted_getarray_pad(hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getarray_pad(trn_cell_introduce_encrypted_t *inp)
{
return inp->pad.elts_;
}
const uint8_t *
-hs_cell_introduce_encrypted_getconstarray_pad(const hs_cell_introduce_encrypted_t *inp)
+trn_cell_introduce_encrypted_getconstarray_pad(const trn_cell_introduce_encrypted_t *inp)
{
- return (const uint8_t *)hs_cell_introduce_encrypted_getarray_pad((hs_cell_introduce_encrypted_t*)inp);
+ return (const uint8_t *)trn_cell_introduce_encrypted_getarray_pad((trn_cell_introduce_encrypted_t*)inp);
}
int
-hs_cell_introduce_encrypted_setlen_pad(hs_cell_introduce_encrypted_t *inp, size_t newlen)
+trn_cell_introduce_encrypted_setlen_pad(trn_cell_introduce_encrypted_t *inp, size_t newlen)
{
uint8_t *newptr;
newptr = trunnel_dynarray_setlen(&inp->pad.allocated_,
@@ -1068,7 +1068,7 @@ hs_cell_introduce_encrypted_setlen_pad(hs_cell_introduce_encrypted_t *inp, size_
return -1;
}
const char *
-hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj)
+trn_cell_introduce_encrypted_check(const trn_cell_introduce_encrypted_t *obj)
{
if (obj == NULL)
return "Object was NULL";
@@ -1076,7 +1076,7 @@ hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj)
return "A set function failed on this object";
{
const char *msg;
- if (NULL != (msg = cell_extension_check(obj->extensions)))
+ if (NULL != (msg = trn_cell_extension_check(obj->extensions)))
return msg;
}
if (! (obj->onion_key_type == 1))
@@ -1098,19 +1098,19 @@ hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj)
}
ssize_t
-hs_cell_introduce_encrypted_encoded_len(const hs_cell_introduce_encrypted_t *obj)
+trn_cell_introduce_encrypted_encoded_len(const trn_cell_introduce_encrypted_t *obj)
{
ssize_t result = 0;
- if (NULL != hs_cell_introduce_encrypted_check(obj))
+ if (NULL != trn_cell_introduce_encrypted_check(obj))
return -1;
/* Length of u8 rend_cookie[TRUNNEL_REND_COOKIE_LEN] */
result += TRUNNEL_REND_COOKIE_LEN;
- /* Length of struct cell_extension extensions */
- result += cell_extension_encoded_len(obj->extensions);
+ /* Length of struct trn_cell_extension extensions */
+ result += trn_cell_extension_encoded_len(obj->extensions);
/* Length of u8 onion_key_type IN [1] */
result += 1;
@@ -1138,24 +1138,24 @@ hs_cell_introduce_encrypted_encoded_len(const hs_cell_introduce_encrypted_t *obj
return result;
}
int
-hs_cell_introduce_encrypted_clear_errors(hs_cell_introduce_encrypted_t *obj)
+trn_cell_introduce_encrypted_clear_errors(trn_cell_introduce_encrypted_t *obj)
{
int r = obj->trunnel_error_code_;
obj->trunnel_error_code_ = 0;
return r;
}
ssize_t
-hs_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const hs_cell_introduce_encrypted_t *obj)
+trn_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const trn_cell_introduce_encrypted_t *obj)
{
ssize_t result = 0;
size_t written = 0;
uint8_t *ptr = output;
const char *msg;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
- const ssize_t encoded_len = hs_cell_introduce_encrypted_encoded_len(obj);
+ const ssize_t encoded_len = trn_cell_introduce_encrypted_encoded_len(obj);
#endif
- if (NULL != (msg = hs_cell_introduce_encrypted_check(obj)))
+ if (NULL != (msg = trn_cell_introduce_encrypted_check(obj)))
goto check_failed;
#ifdef TRUNNEL_CHECK_ENCODED_LEN
@@ -1169,9 +1169,9 @@ hs_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const hs
memcpy(ptr, obj->rend_cookie, TRUNNEL_REND_COOKIE_LEN);
written += TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN;
- /* Encode struct cell_extension extensions */
+ /* Encode struct trn_cell_extension extensions */
trunnel_assert(written <= avail);
- result = cell_extension_encode(ptr, avail - written, obj->extensions);
+ result = trn_cell_extension_encode(ptr, avail - written, obj->extensions);
if (result < 0)
goto fail; /* XXXXXXX !*/
written += result; ptr += result;
@@ -1257,11 +1257,11 @@ hs_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const hs
return result;
}
-/** As hs_cell_introduce_encrypted_parse(), but do not allocate the
+/** As trn_cell_introduce_encrypted_parse(), but do not allocate the
* output object.
*/
static ssize_t
-hs_cell_introduce_encrypted_parse_into(hs_cell_introduce_encrypted_t *obj, const uint8_t *input, const size_t len_in)
+trn_cell_introduce_encrypted_parse_into(trn_cell_introduce_encrypted_t *obj, const uint8_t *input, const size_t len_in)
{
const uint8_t *ptr = input;
size_t remaining = len_in;
@@ -1273,8 +1273,8 @@ hs_cell_introduce_encrypted_parse_into(hs_cell_introduce_encrypted_t *obj, const
memcpy(obj->rend_cookie, ptr, TRUNNEL_REND_COOKIE_LEN);
remaining -= TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN;
- /* Parse struct cell_extension extensions */
- result = cell_extension_parse(&obj->extensions, ptr, remaining);
+ /* Parse struct trn_cell_extension extensions */
+ result = trn_cell_extension_parse(&obj->extensions, ptr, remaining);
if (result < 0)
goto relay_fail;
trunnel_assert((size_t)result <= remaining);
@@ -1342,15 +1342,15 @@ hs_cell_introduce_encrypted_parse_into(hs_cell_introduce_encrypted_t *obj, const
}
ssize_t
-hs_cell_introduce_encrypted_parse(hs_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in)
+trn_cell_introduce_encrypted_parse(trn_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in)
{
ssize_t result;
- *output = hs_cell_introduce_encrypted_new();
+ *output = trn_cell_introduce_encrypted_new();
if (NULL == *output)
return -1;
- result = hs_cell_introduce_encrypted_parse_into(*output, input, len_in);
+ result = trn_cell_introduce_encrypted_parse_into(*output, input, len_in);
if (result < 0) {
- hs_cell_introduce_encrypted_free(*output);
+ trn_cell_introduce_encrypted_free(*output);
*output = NULL;
}
return result;
diff --git a/src/trunnel/hs/cell_introduce1.h b/src/trunnel/hs/cell_introduce1.h
index ccd2cda904..cca825a431 100644
--- a/src/trunnel/hs/cell_introduce1.h
+++ b/src/trunnel/hs/cell_introduce1.h
@@ -8,34 +8,34 @@
#include <stdint.h>
#include "trunnel.h"
-struct cell_extension_st;
+struct trn_cell_extension_st;
struct link_specifier_st;
#define TRUNNEL_SHA1_LEN 20
#define TRUNNEL_REND_COOKIE_LEN 20
-#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRODUCE1)
-struct hs_cell_introduce1_st {
+#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE1)
+struct trn_cell_introduce1_st {
uint8_t legacy_key_id[TRUNNEL_SHA1_LEN];
uint8_t auth_key_type;
uint16_t auth_key_len;
TRUNNEL_DYNARRAY_HEAD(, uint8_t) auth_key;
- struct cell_extension_st *extensions;
+ struct trn_cell_extension_st *extensions;
TRUNNEL_DYNARRAY_HEAD(, uint8_t) encrypted;
uint8_t trunnel_error_code_;
};
#endif
-typedef struct hs_cell_introduce1_st hs_cell_introduce1_t;
-#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRODUCE_ACK)
-struct hs_cell_introduce_ack_st {
+typedef struct trn_cell_introduce1_st trn_cell_introduce1_t;
+#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE_ACK)
+struct trn_cell_introduce_ack_st {
uint16_t status;
- struct cell_extension_st *extensions;
+ struct trn_cell_extension_st *extensions;
uint8_t trunnel_error_code_;
};
#endif
-typedef struct hs_cell_introduce_ack_st hs_cell_introduce_ack_t;
-#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRODUCE_ENCRYPTED)
-struct hs_cell_introduce_encrypted_st {
+typedef struct trn_cell_introduce_ack_st trn_cell_introduce_ack_t;
+#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE_ENCRYPTED)
+struct trn_cell_introduce_encrypted_st {
uint8_t rend_cookie[TRUNNEL_REND_COOKIE_LEN];
- struct cell_extension_st *extensions;
+ struct trn_cell_extension_st *extensions;
uint8_t onion_key_type;
uint16_t onion_key_len;
TRUNNEL_DYNARRAY_HEAD(, uint8_t) onion_key;
@@ -45,449 +45,449 @@ struct hs_cell_introduce_encrypted_st {
uint8_t trunnel_error_code_;
};
#endif
-typedef struct hs_cell_introduce_encrypted_st hs_cell_introduce_encrypted_t;
-/** Return a newly allocated hs_cell_introduce1 with all elements set
+typedef struct trn_cell_introduce_encrypted_st trn_cell_introduce_encrypted_t;
+/** Return a newly allocated trn_cell_introduce1 with all elements set
* to zero.
*/
-hs_cell_introduce1_t *hs_cell_introduce1_new(void);
-/** Release all storage held by the hs_cell_introduce1 in 'victim'.
+trn_cell_introduce1_t *trn_cell_introduce1_new(void);
+/** Release all storage held by the trn_cell_introduce1 in 'victim'.
* (Do nothing if 'victim' is NULL.)
*/
-void hs_cell_introduce1_free(hs_cell_introduce1_t *victim);
-/** Try to parse a hs_cell_introduce1 from the buffer in 'input',
+void trn_cell_introduce1_free(trn_cell_introduce1_t *victim);
+/** Try to parse a trn_cell_introduce1 from the buffer in 'input',
* using up to 'len_in' bytes from the input buffer. On success,
* return the number of bytes consumed and set *output to the newly
- * allocated hs_cell_introduce1_t. On failure, return -2 if the input
+ * allocated trn_cell_introduce1_t. On failure, return -2 if the input
* appears truncated, and -1 if the input is otherwise invalid.
*/
-ssize_t hs_cell_introduce1_parse(hs_cell_introduce1_t **output, const uint8_t *input, const size_t len_in);
+ssize_t trn_cell_introduce1_parse(trn_cell_introduce1_t **output, const uint8_t *input, const size_t len_in);
/** Return the number of bytes we expect to need to encode the
- * hs_cell_introduce1 in 'obj'. On failure, return a negative value.
+ * trn_cell_introduce1 in 'obj'. On failure, return a negative value.
* Note that this value may be an overestimate, and can even be an
* underestimate for certain unencodeable objects.
*/
-ssize_t hs_cell_introduce1_encoded_len(const hs_cell_introduce1_t *obj);
-/** Try to encode the hs_cell_introduce1 from 'input' into the buffer
+ssize_t trn_cell_introduce1_encoded_len(const trn_cell_introduce1_t *obj);
+/** Try to encode the trn_cell_introduce1 from 'input' into the buffer
* at 'output', using up to 'avail' bytes of the output buffer. On
* success, return the number of bytes used. On failure, return -2 if
* the buffer was not long enough, and -1 if the input was invalid.
*/
-ssize_t hs_cell_introduce1_encode(uint8_t *output, size_t avail, const hs_cell_introduce1_t *input);
-/** Check whether the internal state of the hs_cell_introduce1 in
+ssize_t trn_cell_introduce1_encode(uint8_t *output, size_t avail, const trn_cell_introduce1_t *input);
+/** Check whether the internal state of the trn_cell_introduce1 in
* 'obj' is consistent. Return NULL if it is, and a short message if
* it is not.
*/
-const char *hs_cell_introduce1_check(const hs_cell_introduce1_t *obj);
+const char *trn_cell_introduce1_check(const trn_cell_introduce1_t *obj);
/** Clear any errors that were set on the object 'obj' by its setter
* functions. Return true iff errors were cleared.
*/
-int hs_cell_introduce1_clear_errors(hs_cell_introduce1_t *obj);
+int trn_cell_introduce1_clear_errors(trn_cell_introduce1_t *obj);
/** Return the (constant) length of the array holding the
- * legacy_key_id field of the hs_cell_introduce1_t in 'inp'.
+ * legacy_key_id field of the trn_cell_introduce1_t in 'inp'.
*/
-size_t hs_cell_introduce1_getlen_legacy_key_id(const hs_cell_introduce1_t *inp);
+size_t trn_cell_introduce1_getlen_legacy_key_id(const trn_cell_introduce1_t *inp);
/** Return the element at position 'idx' of the fixed array field
- * legacy_key_id of the hs_cell_introduce1_t in 'inp'.
+ * legacy_key_id of the trn_cell_introduce1_t in 'inp'.
*/
-uint8_t hs_cell_introduce1_get_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx);
-/** As hs_cell_introduce1_get_legacy_key_id, but take and return a
+uint8_t trn_cell_introduce1_get_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx);
+/** As trn_cell_introduce1_get_legacy_key_id, but take and return a
* const pointer
*/
-uint8_t hs_cell_introduce1_getconst_legacy_key_id(const hs_cell_introduce1_t *inp, size_t idx);
+uint8_t trn_cell_introduce1_getconst_legacy_key_id(const trn_cell_introduce1_t *inp, size_t idx);
/** Change the element at position 'idx' of the fixed array field
- * legacy_key_id of the hs_cell_introduce1_t in 'inp', so that it will
- * hold the value 'elt'.
+ * legacy_key_id of the trn_cell_introduce1_t in 'inp', so that it
+ * will hold the value 'elt'.
*/
-int hs_cell_introduce1_set_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt);
+int trn_cell_introduce1_set_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt);
/** Return a pointer to the TRUNNEL_SHA1_LEN-element array field
* legacy_key_id of 'inp'.
*/
-uint8_t * hs_cell_introduce1_getarray_legacy_key_id(hs_cell_introduce1_t *inp);
-/** As hs_cell_introduce1_get_legacy_key_id, but take and return a
+uint8_t * trn_cell_introduce1_getarray_legacy_key_id(trn_cell_introduce1_t *inp);
+/** As trn_cell_introduce1_get_legacy_key_id, but take and return a
* const pointer
*/
-const uint8_t * hs_cell_introduce1_getconstarray_legacy_key_id(const hs_cell_introduce1_t *inp);
+const uint8_t * trn_cell_introduce1_getconstarray_legacy_key_id(const trn_cell_introduce1_t *inp);
/** Return the value of the auth_key_type field of the
- * hs_cell_introduce1_t in 'inp'
+ * trn_cell_introduce1_t in 'inp'
*/
-uint8_t hs_cell_introduce1_get_auth_key_type(const hs_cell_introduce1_t *inp);
+uint8_t trn_cell_introduce1_get_auth_key_type(const trn_cell_introduce1_t *inp);
/** Set the value of the auth_key_type field of the
- * hs_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; return
- * -1 and set the error code on 'inp' on failure.
+ * trn_cell_introduce1_t in 'inp' to 'val'. Return 0 on success;
+ * return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce1_set_auth_key_type(hs_cell_introduce1_t *inp, uint8_t val);
+int trn_cell_introduce1_set_auth_key_type(trn_cell_introduce1_t *inp, uint8_t val);
/** Return the value of the auth_key_len field of the
- * hs_cell_introduce1_t in 'inp'
+ * trn_cell_introduce1_t in 'inp'
*/
-uint16_t hs_cell_introduce1_get_auth_key_len(const hs_cell_introduce1_t *inp);
+uint16_t trn_cell_introduce1_get_auth_key_len(const trn_cell_introduce1_t *inp);
/** Set the value of the auth_key_len field of the
- * hs_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; return
- * -1 and set the error code on 'inp' on failure.
+ * trn_cell_introduce1_t in 'inp' to 'val'. Return 0 on success;
+ * return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce1_set_auth_key_len(hs_cell_introduce1_t *inp, uint16_t val);
+int trn_cell_introduce1_set_auth_key_len(trn_cell_introduce1_t *inp, uint16_t val);
/** Return the length of the dynamic array holding the auth_key field
- * of the hs_cell_introduce1_t in 'inp'.
+ * of the trn_cell_introduce1_t in 'inp'.
*/
-size_t hs_cell_introduce1_getlen_auth_key(const hs_cell_introduce1_t *inp);
+size_t trn_cell_introduce1_getlen_auth_key(const trn_cell_introduce1_t *inp);
/** Return the element at position 'idx' of the dynamic array field
- * auth_key of the hs_cell_introduce1_t in 'inp'.
+ * auth_key of the trn_cell_introduce1_t in 'inp'.
*/
-uint8_t hs_cell_introduce1_get_auth_key(hs_cell_introduce1_t *inp, size_t idx);
-/** As hs_cell_introduce1_get_auth_key, but take and return a const
+uint8_t trn_cell_introduce1_get_auth_key(trn_cell_introduce1_t *inp, size_t idx);
+/** As trn_cell_introduce1_get_auth_key, but take and return a const
* pointer
*/
-uint8_t hs_cell_introduce1_getconst_auth_key(const hs_cell_introduce1_t *inp, size_t idx);
+uint8_t trn_cell_introduce1_getconst_auth_key(const trn_cell_introduce1_t *inp, size_t idx);
/** Change the element at position 'idx' of the dynamic array field
- * auth_key of the hs_cell_introduce1_t in 'inp', so that it will hold
- * the value 'elt'.
+ * auth_key of the trn_cell_introduce1_t in 'inp', so that it will
+ * hold the value 'elt'.
*/
-int hs_cell_introduce1_set_auth_key(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt);
+int trn_cell_introduce1_set_auth_key(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt);
/** Append a new element 'elt' to the dynamic array field auth_key of
- * the hs_cell_introduce1_t in 'inp'.
+ * the trn_cell_introduce1_t in 'inp'.
*/
-int hs_cell_introduce1_add_auth_key(hs_cell_introduce1_t *inp, uint8_t elt);
+int trn_cell_introduce1_add_auth_key(trn_cell_introduce1_t *inp, uint8_t elt);
/** Return a pointer to the variable-length array field auth_key of
* 'inp'.
*/
-uint8_t * hs_cell_introduce1_getarray_auth_key(hs_cell_introduce1_t *inp);
-/** As hs_cell_introduce1_get_auth_key, but take and return a const
+uint8_t * trn_cell_introduce1_getarray_auth_key(trn_cell_introduce1_t *inp);
+/** As trn_cell_introduce1_get_auth_key, but take and return a const
* pointer
*/
-const uint8_t * hs_cell_introduce1_getconstarray_auth_key(const hs_cell_introduce1_t *inp);
+const uint8_t * trn_cell_introduce1_getconstarray_auth_key(const trn_cell_introduce1_t *inp);
/** Change the length of the variable-length array field auth_key of
* 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce1_setlen_auth_key(hs_cell_introduce1_t *inp, size_t newlen);
+int trn_cell_introduce1_setlen_auth_key(trn_cell_introduce1_t *inp, size_t newlen);
/** Return the value of the extensions field of the
- * hs_cell_introduce1_t in 'inp'
+ * trn_cell_introduce1_t in 'inp'
*/
-struct cell_extension_st * hs_cell_introduce1_get_extensions(hs_cell_introduce1_t *inp);
-/** As hs_cell_introduce1_get_extensions, but take and return a const
+struct trn_cell_extension_st * trn_cell_introduce1_get_extensions(trn_cell_introduce1_t *inp);
+/** As trn_cell_introduce1_get_extensions, but take and return a const
* pointer
*/
-const struct cell_extension_st * hs_cell_introduce1_getconst_extensions(const hs_cell_introduce1_t *inp);
-/** Set the value of the extensions field of the hs_cell_introduce1_t
+const struct trn_cell_extension_st * trn_cell_introduce1_getconst_extensions(const trn_cell_introduce1_t *inp);
+/** Set the value of the extensions field of the trn_cell_introduce1_t
* in 'inp' to 'val'. Free the old value if any. Steals the
* referenceto 'val'.Return 0 on success; return -1 and set the error
* code on 'inp' on failure.
*/
-int hs_cell_introduce1_set_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val);
-/** As hs_cell_introduce1_set_extensions, but does not free the
+int trn_cell_introduce1_set_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val);
+/** As trn_cell_introduce1_set_extensions, but does not free the
* previous value.
*/
-int hs_cell_introduce1_set0_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val);
+int trn_cell_introduce1_set0_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val);
/** Return the length of the dynamic array holding the encrypted field
- * of the hs_cell_introduce1_t in 'inp'.
+ * of the trn_cell_introduce1_t in 'inp'.
*/
-size_t hs_cell_introduce1_getlen_encrypted(const hs_cell_introduce1_t *inp);
+size_t trn_cell_introduce1_getlen_encrypted(const trn_cell_introduce1_t *inp);
/** Return the element at position 'idx' of the dynamic array field
- * encrypted of the hs_cell_introduce1_t in 'inp'.
+ * encrypted of the trn_cell_introduce1_t in 'inp'.
*/
-uint8_t hs_cell_introduce1_get_encrypted(hs_cell_introduce1_t *inp, size_t idx);
-/** As hs_cell_introduce1_get_encrypted, but take and return a const
+uint8_t trn_cell_introduce1_get_encrypted(trn_cell_introduce1_t *inp, size_t idx);
+/** As trn_cell_introduce1_get_encrypted, but take and return a const
* pointer
*/
-uint8_t hs_cell_introduce1_getconst_encrypted(const hs_cell_introduce1_t *inp, size_t idx);
+uint8_t trn_cell_introduce1_getconst_encrypted(const trn_cell_introduce1_t *inp, size_t idx);
/** Change the element at position 'idx' of the dynamic array field
- * encrypted of the hs_cell_introduce1_t in 'inp', so that it will
+ * encrypted of the trn_cell_introduce1_t in 'inp', so that it will
* hold the value 'elt'.
*/
-int hs_cell_introduce1_set_encrypted(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt);
+int trn_cell_introduce1_set_encrypted(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt);
/** Append a new element 'elt' to the dynamic array field encrypted of
- * the hs_cell_introduce1_t in 'inp'.
+ * the trn_cell_introduce1_t in 'inp'.
*/
-int hs_cell_introduce1_add_encrypted(hs_cell_introduce1_t *inp, uint8_t elt);
+int trn_cell_introduce1_add_encrypted(trn_cell_introduce1_t *inp, uint8_t elt);
/** Return a pointer to the variable-length array field encrypted of
* 'inp'.
*/
-uint8_t * hs_cell_introduce1_getarray_encrypted(hs_cell_introduce1_t *inp);
-/** As hs_cell_introduce1_get_encrypted, but take and return a const
+uint8_t * trn_cell_introduce1_getarray_encrypted(trn_cell_introduce1_t *inp);
+/** As trn_cell_introduce1_get_encrypted, but take and return a const
* pointer
*/
-const uint8_t * hs_cell_introduce1_getconstarray_encrypted(const hs_cell_introduce1_t *inp);
+const uint8_t * trn_cell_introduce1_getconstarray_encrypted(const trn_cell_introduce1_t *inp);
/** Change the length of the variable-length array field encrypted of
* 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce1_setlen_encrypted(hs_cell_introduce1_t *inp, size_t newlen);
-/** Return a newly allocated hs_cell_introduce_ack with all elements
+int trn_cell_introduce1_setlen_encrypted(trn_cell_introduce1_t *inp, size_t newlen);
+/** Return a newly allocated trn_cell_introduce_ack with all elements
* set to zero.
*/
-hs_cell_introduce_ack_t *hs_cell_introduce_ack_new(void);
-/** Release all storage held by the hs_cell_introduce_ack in 'victim'.
- * (Do nothing if 'victim' is NULL.)
+trn_cell_introduce_ack_t *trn_cell_introduce_ack_new(void);
+/** Release all storage held by the trn_cell_introduce_ack in
+ * 'victim'. (Do nothing if 'victim' is NULL.)
*/
-void hs_cell_introduce_ack_free(hs_cell_introduce_ack_t *victim);
-/** Try to parse a hs_cell_introduce_ack from the buffer in 'input',
+void trn_cell_introduce_ack_free(trn_cell_introduce_ack_t *victim);
+/** Try to parse a trn_cell_introduce_ack from the buffer in 'input',
* using up to 'len_in' bytes from the input buffer. On success,
* return the number of bytes consumed and set *output to the newly
- * allocated hs_cell_introduce_ack_t. On failure, return -2 if the
+ * allocated trn_cell_introduce_ack_t. On failure, return -2 if the
* input appears truncated, and -1 if the input is otherwise invalid.
*/
-ssize_t hs_cell_introduce_ack_parse(hs_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in);
+ssize_t trn_cell_introduce_ack_parse(trn_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in);
/** Return the number of bytes we expect to need to encode the
- * hs_cell_introduce_ack in 'obj'. On failure, return a negative
+ * trn_cell_introduce_ack in 'obj'. On failure, return a negative
* value. Note that this value may be an overestimate, and can even be
* an underestimate for certain unencodeable objects.
*/
-ssize_t hs_cell_introduce_ack_encoded_len(const hs_cell_introduce_ack_t *obj);
-/** Try to encode the hs_cell_introduce_ack from 'input' into the
+ssize_t trn_cell_introduce_ack_encoded_len(const trn_cell_introduce_ack_t *obj);
+/** Try to encode the trn_cell_introduce_ack from 'input' into the
* buffer at 'output', using up to 'avail' bytes of the output buffer.
* On success, return the number of bytes used. On failure, return -2
* if the buffer was not long enough, and -1 if the input was invalid.
*/
-ssize_t hs_cell_introduce_ack_encode(uint8_t *output, size_t avail, const hs_cell_introduce_ack_t *input);
-/** Check whether the internal state of the hs_cell_introduce_ack in
+ssize_t trn_cell_introduce_ack_encode(uint8_t *output, size_t avail, const trn_cell_introduce_ack_t *input);
+/** Check whether the internal state of the trn_cell_introduce_ack in
* 'obj' is consistent. Return NULL if it is, and a short message if
* it is not.
*/
-const char *hs_cell_introduce_ack_check(const hs_cell_introduce_ack_t *obj);
+const char *trn_cell_introduce_ack_check(const trn_cell_introduce_ack_t *obj);
/** Clear any errors that were set on the object 'obj' by its setter
* functions. Return true iff errors were cleared.
*/
-int hs_cell_introduce_ack_clear_errors(hs_cell_introduce_ack_t *obj);
+int trn_cell_introduce_ack_clear_errors(trn_cell_introduce_ack_t *obj);
/** Return the value of the status field of the
- * hs_cell_introduce_ack_t in 'inp'
+ * trn_cell_introduce_ack_t in 'inp'
*/
-uint16_t hs_cell_introduce_ack_get_status(const hs_cell_introduce_ack_t *inp);
-/** Set the value of the status field of the hs_cell_introduce_ack_t
+uint16_t trn_cell_introduce_ack_get_status(const trn_cell_introduce_ack_t *inp);
+/** Set the value of the status field of the trn_cell_introduce_ack_t
* in 'inp' to 'val'. Return 0 on success; return -1 and set the error
* code on 'inp' on failure.
*/
-int hs_cell_introduce_ack_set_status(hs_cell_introduce_ack_t *inp, uint16_t val);
+int trn_cell_introduce_ack_set_status(trn_cell_introduce_ack_t *inp, uint16_t val);
/** Return the value of the extensions field of the
- * hs_cell_introduce_ack_t in 'inp'
+ * trn_cell_introduce_ack_t in 'inp'
*/
-struct cell_extension_st * hs_cell_introduce_ack_get_extensions(hs_cell_introduce_ack_t *inp);
-/** As hs_cell_introduce_ack_get_extensions, but take and return a
+struct trn_cell_extension_st * trn_cell_introduce_ack_get_extensions(trn_cell_introduce_ack_t *inp);
+/** As trn_cell_introduce_ack_get_extensions, but take and return a
* const pointer
*/
-const struct cell_extension_st * hs_cell_introduce_ack_getconst_extensions(const hs_cell_introduce_ack_t *inp);
+const struct trn_cell_extension_st * trn_cell_introduce_ack_getconst_extensions(const trn_cell_introduce_ack_t *inp);
/** Set the value of the extensions field of the
- * hs_cell_introduce_ack_t in 'inp' to 'val'. Free the old value if
+ * trn_cell_introduce_ack_t in 'inp' to 'val'. Free the old value if
* any. Steals the referenceto 'val'.Return 0 on success; return -1
* and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce_ack_set_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val);
-/** As hs_cell_introduce_ack_set_extensions, but does not free the
+int trn_cell_introduce_ack_set_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val);
+/** As trn_cell_introduce_ack_set_extensions, but does not free the
* previous value.
*/
-int hs_cell_introduce_ack_set0_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val);
-/** Return a newly allocated hs_cell_introduce_encrypted with all
+int trn_cell_introduce_ack_set0_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val);
+/** Return a newly allocated trn_cell_introduce_encrypted with all
* elements set to zero.
*/
-hs_cell_introduce_encrypted_t *hs_cell_introduce_encrypted_new(void);
-/** Release all storage held by the hs_cell_introduce_encrypted in
+trn_cell_introduce_encrypted_t *trn_cell_introduce_encrypted_new(void);
+/** Release all storage held by the trn_cell_introduce_encrypted in
* 'victim'. (Do nothing if 'victim' is NULL.)
*/
-void hs_cell_introduce_encrypted_free(hs_cell_introduce_encrypted_t *victim);
-/** Try to parse a hs_cell_introduce_encrypted from the buffer in
+void trn_cell_introduce_encrypted_free(trn_cell_introduce_encrypted_t *victim);
+/** Try to parse a trn_cell_introduce_encrypted from the buffer in
* 'input', using up to 'len_in' bytes from the input buffer. On
* success, return the number of bytes consumed and set *output to the
- * newly allocated hs_cell_introduce_encrypted_t. On failure, return
+ * newly allocated trn_cell_introduce_encrypted_t. On failure, return
* -2 if the input appears truncated, and -1 if the input is otherwise
* invalid.
*/
-ssize_t hs_cell_introduce_encrypted_parse(hs_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in);
+ssize_t trn_cell_introduce_encrypted_parse(trn_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in);
/** Return the number of bytes we expect to need to encode the
- * hs_cell_introduce_encrypted in 'obj'. On failure, return a negative
- * value. Note that this value may be an overestimate, and can even be
- * an underestimate for certain unencodeable objects.
+ * trn_cell_introduce_encrypted in 'obj'. On failure, return a
+ * negative value. Note that this value may be an overestimate, and
+ * can even be an underestimate for certain unencodeable objects.
*/
-ssize_t hs_cell_introduce_encrypted_encoded_len(const hs_cell_introduce_encrypted_t *obj);
-/** Try to encode the hs_cell_introduce_encrypted from 'input' into
+ssize_t trn_cell_introduce_encrypted_encoded_len(const trn_cell_introduce_encrypted_t *obj);
+/** Try to encode the trn_cell_introduce_encrypted from 'input' into
* the buffer at 'output', using up to 'avail' bytes of the output
* buffer. On success, return the number of bytes used. On failure,
* return -2 if the buffer was not long enough, and -1 if the input
* was invalid.
*/
-ssize_t hs_cell_introduce_encrypted_encode(uint8_t *output, size_t avail, const hs_cell_introduce_encrypted_t *input);
+ssize_t trn_cell_introduce_encrypted_encode(uint8_t *output, size_t avail, const trn_cell_introduce_encrypted_t *input);
/** Check whether the internal state of the
- * hs_cell_introduce_encrypted in 'obj' is consistent. Return NULL if
+ * trn_cell_introduce_encrypted in 'obj' is consistent. Return NULL if
* it is, and a short message if it is not.
*/
-const char *hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj);
+const char *trn_cell_introduce_encrypted_check(const trn_cell_introduce_encrypted_t *obj);
/** Clear any errors that were set on the object 'obj' by its setter
* functions. Return true iff errors were cleared.
*/
-int hs_cell_introduce_encrypted_clear_errors(hs_cell_introduce_encrypted_t *obj);
+int trn_cell_introduce_encrypted_clear_errors(trn_cell_introduce_encrypted_t *obj);
/** Return the (constant) length of the array holding the rend_cookie
- * field of the hs_cell_introduce_encrypted_t in 'inp'.
+ * field of the trn_cell_introduce_encrypted_t in 'inp'.
*/
-size_t hs_cell_introduce_encrypted_getlen_rend_cookie(const hs_cell_introduce_encrypted_t *inp);
+size_t trn_cell_introduce_encrypted_getlen_rend_cookie(const trn_cell_introduce_encrypted_t *inp);
/** Return the element at position 'idx' of the fixed array field
- * rend_cookie of the hs_cell_introduce_encrypted_t in 'inp'.
+ * rend_cookie of the trn_cell_introduce_encrypted_t in 'inp'.
*/
-uint8_t hs_cell_introduce_encrypted_get_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx);
-/** As hs_cell_introduce_encrypted_get_rend_cookie, but take and
+uint8_t trn_cell_introduce_encrypted_get_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx);
+/** As trn_cell_introduce_encrypted_get_rend_cookie, but take and
* return a const pointer
*/
-uint8_t hs_cell_introduce_encrypted_getconst_rend_cookie(const hs_cell_introduce_encrypted_t *inp, size_t idx);
+uint8_t trn_cell_introduce_encrypted_getconst_rend_cookie(const trn_cell_introduce_encrypted_t *inp, size_t idx);
/** Change the element at position 'idx' of the fixed array field
- * rend_cookie of the hs_cell_introduce_encrypted_t in 'inp', so that
+ * rend_cookie of the trn_cell_introduce_encrypted_t in 'inp', so that
* it will hold the value 'elt'.
*/
-int hs_cell_introduce_encrypted_set_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt);
+int trn_cell_introduce_encrypted_set_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt);
/** Return a pointer to the TRUNNEL_REND_COOKIE_LEN-element array
* field rend_cookie of 'inp'.
*/
-uint8_t * hs_cell_introduce_encrypted_getarray_rend_cookie(hs_cell_introduce_encrypted_t *inp);
-/** As hs_cell_introduce_encrypted_get_rend_cookie, but take and
+uint8_t * trn_cell_introduce_encrypted_getarray_rend_cookie(trn_cell_introduce_encrypted_t *inp);
+/** As trn_cell_introduce_encrypted_get_rend_cookie, but take and
* return a const pointer
*/
-const uint8_t * hs_cell_introduce_encrypted_getconstarray_rend_cookie(const hs_cell_introduce_encrypted_t *inp);
+const uint8_t * trn_cell_introduce_encrypted_getconstarray_rend_cookie(const trn_cell_introduce_encrypted_t *inp);
/** Return the value of the extensions field of the
- * hs_cell_introduce_encrypted_t in 'inp'
+ * trn_cell_introduce_encrypted_t in 'inp'
*/
-struct cell_extension_st * hs_cell_introduce_encrypted_get_extensions(hs_cell_introduce_encrypted_t *inp);
-/** As hs_cell_introduce_encrypted_get_extensions, but take and return
- * a const pointer
+struct trn_cell_extension_st * trn_cell_introduce_encrypted_get_extensions(trn_cell_introduce_encrypted_t *inp);
+/** As trn_cell_introduce_encrypted_get_extensions, but take and
+ * return a const pointer
*/
-const struct cell_extension_st * hs_cell_introduce_encrypted_getconst_extensions(const hs_cell_introduce_encrypted_t *inp);
+const struct trn_cell_extension_st * trn_cell_introduce_encrypted_getconst_extensions(const trn_cell_introduce_encrypted_t *inp);
/** Set the value of the extensions field of the
- * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Free the old value
- * if any. Steals the referenceto 'val'.Return 0 on success; return -1
- * and set the error code on 'inp' on failure.
+ * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Free the old
+ * value if any. Steals the referenceto 'val'.Return 0 on success;
+ * return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce_encrypted_set_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val);
-/** As hs_cell_introduce_encrypted_set_extensions, but does not free
+int trn_cell_introduce_encrypted_set_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val);
+/** As trn_cell_introduce_encrypted_set_extensions, but does not free
* the previous value.
*/
-int hs_cell_introduce_encrypted_set0_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val);
+int trn_cell_introduce_encrypted_set0_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val);
/** Return the value of the onion_key_type field of the
- * hs_cell_introduce_encrypted_t in 'inp'
+ * trn_cell_introduce_encrypted_t in 'inp'
*/
-uint8_t hs_cell_introduce_encrypted_get_onion_key_type(const hs_cell_introduce_encrypted_t *inp);
+uint8_t trn_cell_introduce_encrypted_get_onion_key_type(const trn_cell_introduce_encrypted_t *inp);
/** Set the value of the onion_key_type field of the
- * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on
+ * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on
* success; return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce_encrypted_set_onion_key_type(hs_cell_introduce_encrypted_t *inp, uint8_t val);
+int trn_cell_introduce_encrypted_set_onion_key_type(trn_cell_introduce_encrypted_t *inp, uint8_t val);
/** Return the value of the onion_key_len field of the
- * hs_cell_introduce_encrypted_t in 'inp'
+ * trn_cell_introduce_encrypted_t in 'inp'
*/
-uint16_t hs_cell_introduce_encrypted_get_onion_key_len(const hs_cell_introduce_encrypted_t *inp);
+uint16_t trn_cell_introduce_encrypted_get_onion_key_len(const trn_cell_introduce_encrypted_t *inp);
/** Set the value of the onion_key_len field of the
- * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on
+ * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on
* success; return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce_encrypted_set_onion_key_len(hs_cell_introduce_encrypted_t *inp, uint16_t val);
+int trn_cell_introduce_encrypted_set_onion_key_len(trn_cell_introduce_encrypted_t *inp, uint16_t val);
/** Return the length of the dynamic array holding the onion_key field
- * of the hs_cell_introduce_encrypted_t in 'inp'.
+ * of the trn_cell_introduce_encrypted_t in 'inp'.
*/
-size_t hs_cell_introduce_encrypted_getlen_onion_key(const hs_cell_introduce_encrypted_t *inp);
+size_t trn_cell_introduce_encrypted_getlen_onion_key(const trn_cell_introduce_encrypted_t *inp);
/** Return the element at position 'idx' of the dynamic array field
- * onion_key of the hs_cell_introduce_encrypted_t in 'inp'.
+ * onion_key of the trn_cell_introduce_encrypted_t in 'inp'.
*/
-uint8_t hs_cell_introduce_encrypted_get_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx);
-/** As hs_cell_introduce_encrypted_get_onion_key, but take and return
+uint8_t trn_cell_introduce_encrypted_get_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx);
+/** As trn_cell_introduce_encrypted_get_onion_key, but take and return
* a const pointer
*/
-uint8_t hs_cell_introduce_encrypted_getconst_onion_key(const hs_cell_introduce_encrypted_t *inp, size_t idx);
+uint8_t trn_cell_introduce_encrypted_getconst_onion_key(const trn_cell_introduce_encrypted_t *inp, size_t idx);
/** Change the element at position 'idx' of the dynamic array field
- * onion_key of the hs_cell_introduce_encrypted_t in 'inp', so that it
- * will hold the value 'elt'.
+ * onion_key of the trn_cell_introduce_encrypted_t in 'inp', so that
+ * it will hold the value 'elt'.
*/
-int hs_cell_introduce_encrypted_set_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt);
+int trn_cell_introduce_encrypted_set_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt);
/** Append a new element 'elt' to the dynamic array field onion_key of
- * the hs_cell_introduce_encrypted_t in 'inp'.
+ * the trn_cell_introduce_encrypted_t in 'inp'.
*/
-int hs_cell_introduce_encrypted_add_onion_key(hs_cell_introduce_encrypted_t *inp, uint8_t elt);
+int trn_cell_introduce_encrypted_add_onion_key(trn_cell_introduce_encrypted_t *inp, uint8_t elt);
/** Return a pointer to the variable-length array field onion_key of
* 'inp'.
*/
-uint8_t * hs_cell_introduce_encrypted_getarray_onion_key(hs_cell_introduce_encrypted_t *inp);
-/** As hs_cell_introduce_encrypted_get_onion_key, but take and return
+uint8_t * trn_cell_introduce_encrypted_getarray_onion_key(trn_cell_introduce_encrypted_t *inp);
+/** As trn_cell_introduce_encrypted_get_onion_key, but take and return
* a const pointer
*/
-const uint8_t * hs_cell_introduce_encrypted_getconstarray_onion_key(const hs_cell_introduce_encrypted_t *inp);
+const uint8_t * trn_cell_introduce_encrypted_getconstarray_onion_key(const trn_cell_introduce_encrypted_t *inp);
/** Change the length of the variable-length array field onion_key of
* 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce_encrypted_setlen_onion_key(hs_cell_introduce_encrypted_t *inp, size_t newlen);
+int trn_cell_introduce_encrypted_setlen_onion_key(trn_cell_introduce_encrypted_t *inp, size_t newlen);
/** Return the value of the nspec field of the
- * hs_cell_introduce_encrypted_t in 'inp'
+ * trn_cell_introduce_encrypted_t in 'inp'
*/
-uint8_t hs_cell_introduce_encrypted_get_nspec(const hs_cell_introduce_encrypted_t *inp);
+uint8_t trn_cell_introduce_encrypted_get_nspec(const trn_cell_introduce_encrypted_t *inp);
/** Set the value of the nspec field of the
- * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on
+ * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on
* success; return -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce_encrypted_set_nspec(hs_cell_introduce_encrypted_t *inp, uint8_t val);
+int trn_cell_introduce_encrypted_set_nspec(trn_cell_introduce_encrypted_t *inp, uint8_t val);
/** Return the length of the dynamic array holding the nspecs field of
- * the hs_cell_introduce_encrypted_t in 'inp'.
+ * the trn_cell_introduce_encrypted_t in 'inp'.
*/
-size_t hs_cell_introduce_encrypted_getlen_nspecs(const hs_cell_introduce_encrypted_t *inp);
+size_t trn_cell_introduce_encrypted_getlen_nspecs(const trn_cell_introduce_encrypted_t *inp);
/** Return the element at position 'idx' of the dynamic array field
- * nspecs of the hs_cell_introduce_encrypted_t in 'inp'.
+ * nspecs of the trn_cell_introduce_encrypted_t in 'inp'.
*/
-struct link_specifier_st * hs_cell_introduce_encrypted_get_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx);
-/** As hs_cell_introduce_encrypted_get_nspecs, but take and return a
+struct link_specifier_st * trn_cell_introduce_encrypted_get_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx);
+/** As trn_cell_introduce_encrypted_get_nspecs, but take and return a
* const pointer
*/
- const struct link_specifier_st * hs_cell_introduce_encrypted_getconst_nspecs(const hs_cell_introduce_encrypted_t *inp, size_t idx);
+ const struct link_specifier_st * trn_cell_introduce_encrypted_getconst_nspecs(const trn_cell_introduce_encrypted_t *inp, size_t idx);
/** Change the element at position 'idx' of the dynamic array field
- * nspecs of the hs_cell_introduce_encrypted_t in 'inp', so that it
+ * nspecs of the trn_cell_introduce_encrypted_t in 'inp', so that it
* will hold the value 'elt'. Free the previous value, if any.
*/
-int hs_cell_introduce_encrypted_set_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt);
-/** As hs_cell_introduce_encrypted_set_nspecs, but does not free the
+int trn_cell_introduce_encrypted_set_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt);
+/** As trn_cell_introduce_encrypted_set_nspecs, but does not free the
* previous value.
*/
-int hs_cell_introduce_encrypted_set0_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt);
+int trn_cell_introduce_encrypted_set0_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt);
/** Append a new element 'elt' to the dynamic array field nspecs of
- * the hs_cell_introduce_encrypted_t in 'inp'.
+ * the trn_cell_introduce_encrypted_t in 'inp'.
*/
-int hs_cell_introduce_encrypted_add_nspecs(hs_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt);
+int trn_cell_introduce_encrypted_add_nspecs(trn_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt);
/** Return a pointer to the variable-length array field nspecs of
* 'inp'.
*/
-struct link_specifier_st * * hs_cell_introduce_encrypted_getarray_nspecs(hs_cell_introduce_encrypted_t *inp);
-/** As hs_cell_introduce_encrypted_get_nspecs, but take and return a
+struct link_specifier_st * * trn_cell_introduce_encrypted_getarray_nspecs(trn_cell_introduce_encrypted_t *inp);
+/** As trn_cell_introduce_encrypted_get_nspecs, but take and return a
* const pointer
*/
-const struct link_specifier_st * const * hs_cell_introduce_encrypted_getconstarray_nspecs(const hs_cell_introduce_encrypted_t *inp);
+const struct link_specifier_st * const * trn_cell_introduce_encrypted_getconstarray_nspecs(const trn_cell_introduce_encrypted_t *inp);
/** Change the length of the variable-length array field nspecs of
* 'inp' to 'newlen'.Fill extra elements with NULL; free removed
* elements. Return 0 on success; return -1 and set the error code on
* 'inp' on failure.
*/
-int hs_cell_introduce_encrypted_setlen_nspecs(hs_cell_introduce_encrypted_t *inp, size_t newlen);
+int trn_cell_introduce_encrypted_setlen_nspecs(trn_cell_introduce_encrypted_t *inp, size_t newlen);
/** Return the length of the dynamic array holding the pad field of
- * the hs_cell_introduce_encrypted_t in 'inp'.
+ * the trn_cell_introduce_encrypted_t in 'inp'.
*/
-size_t hs_cell_introduce_encrypted_getlen_pad(const hs_cell_introduce_encrypted_t *inp);
+size_t trn_cell_introduce_encrypted_getlen_pad(const trn_cell_introduce_encrypted_t *inp);
/** Return the element at position 'idx' of the dynamic array field
- * pad of the hs_cell_introduce_encrypted_t in 'inp'.
+ * pad of the trn_cell_introduce_encrypted_t in 'inp'.
*/
-uint8_t hs_cell_introduce_encrypted_get_pad(hs_cell_introduce_encrypted_t *inp, size_t idx);
-/** As hs_cell_introduce_encrypted_get_pad, but take and return a
+uint8_t trn_cell_introduce_encrypted_get_pad(trn_cell_introduce_encrypted_t *inp, size_t idx);
+/** As trn_cell_introduce_encrypted_get_pad, but take and return a
* const pointer
*/
-uint8_t hs_cell_introduce_encrypted_getconst_pad(const hs_cell_introduce_encrypted_t *inp, size_t idx);
+uint8_t trn_cell_introduce_encrypted_getconst_pad(const trn_cell_introduce_encrypted_t *inp, size_t idx);
/** Change the element at position 'idx' of the dynamic array field
- * pad of the hs_cell_introduce_encrypted_t in 'inp', so that it will
+ * pad of the trn_cell_introduce_encrypted_t in 'inp', so that it will
* hold the value 'elt'.
*/
-int hs_cell_introduce_encrypted_set_pad(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt);
+int trn_cell_introduce_encrypted_set_pad(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt);
/** Append a new element 'elt' to the dynamic array field pad of the
- * hs_cell_introduce_encrypted_t in 'inp'.
+ * trn_cell_introduce_encrypted_t in 'inp'.
*/
-int hs_cell_introduce_encrypted_add_pad(hs_cell_introduce_encrypted_t *inp, uint8_t elt);
+int trn_cell_introduce_encrypted_add_pad(trn_cell_introduce_encrypted_t *inp, uint8_t elt);
/** Return a pointer to the variable-length array field pad of 'inp'.
*/
-uint8_t * hs_cell_introduce_encrypted_getarray_pad(hs_cell_introduce_encrypted_t *inp);
-/** As hs_cell_introduce_encrypted_get_pad, but take and return a
+uint8_t * trn_cell_introduce_encrypted_getarray_pad(trn_cell_introduce_encrypted_t *inp);
+/** As trn_cell_introduce_encrypted_get_pad, but take and return a
* const pointer
*/
-const uint8_t * hs_cell_introduce_encrypted_getconstarray_pad(const hs_cell_introduce_encrypted_t *inp);
+const uint8_t * trn_cell_introduce_encrypted_getconstarray_pad(const trn_cell_introduce_encrypted_t *inp);
/** Change the length of the variable-length array field pad of 'inp'
* to 'newlen'.Fill extra elements with 0. Return 0 on success; return
* -1 and set the error code on 'inp' on failure.
*/
-int hs_cell_introduce_encrypted_setlen_pad(hs_cell_introduce_encrypted_t *inp, size_t newlen);
+int trn_cell_introduce_encrypted_setlen_pad(trn_cell_introduce_encrypted_t *inp, size_t newlen);
#endif
diff --git a/src/trunnel/hs/cell_introduce1.trunnel b/src/trunnel/hs/cell_introduce1.trunnel
index f7776879cd..7577c1526f 100644
--- a/src/trunnel/hs/cell_introduce1.trunnel
+++ b/src/trunnel/hs/cell_introduce1.trunnel
@@ -5,7 +5,7 @@
*/
/* From cell_common.trunnel. */
-extern struct cell_extension;
+extern struct trn_cell_extension;
/* From ed25519_cert.trunnel. */
extern struct link_specifier;
@@ -13,7 +13,7 @@ const TRUNNEL_SHA1_LEN = 20;
const TRUNNEL_REND_COOKIE_LEN = 20;
/* INTRODUCE1 payload. See details in section 3.2.1. */
-struct hs_cell_introduce1 {
+struct trn_cell_introduce1 {
/* Always zeroed. MUST be checked explicitely by the caller. */
u8 legacy_key_id[TRUNNEL_SHA1_LEN];
@@ -23,28 +23,28 @@ struct hs_cell_introduce1 {
u8 auth_key[auth_key_len];
/* Extension(s). Reserved fields. */
- struct cell_extension extensions;
+ struct trn_cell_extension extensions;
/* Variable length, up to the end of cell. */
u8 encrypted[];
};
/* INTRODUCE_ACK payload. See details in section 3.2.2. */
-struct hs_cell_introduce_ack {
+struct trn_cell_introduce_ack {
/* Status of introduction. */
u16 status IN [0x0000, 0x0001, 0x0002];
/* Extension(s). Reserved fields. */
- struct cell_extension extensions;
+ struct trn_cell_extension extensions;
};
/* Encrypted section of the INTRODUCE1/INTRODUCE2 cell. */
-struct hs_cell_introduce_encrypted {
+struct trn_cell_introduce_encrypted {
/* Rendezvous cookie. */
u8 rend_cookie[TRUNNEL_REND_COOKIE_LEN];
/* Extension(s). Reserved fields. */
- struct cell_extension extensions;
+ struct trn_cell_extension extensions;
/* Onion key material. */
u8 onion_key_type IN [0x01];