diff -Nru tor-0.2.0.34/acinclude.m4 tor-0.2.2.16-alpha/acinclude.m4 --- tor-0.2.0.34/acinclude.m4 2008-08-22 18:38:14.000000000 +0000 +++ tor-0.2.2.16-alpha/acinclude.m4 2010-01-26 18:03:11.000000000 +0000 @@ -1,4 +1,3 @@ -dnl $Id$ dnl Helper macros for Tor configure.in dnl Copyright (c) 2001-2004, Roger Dingledine dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson @@ -27,8 +26,10 @@ else if test -d "$1/lib"; then TOR_LDFLAGS_$2="-L$1/lib" + TOR_LIBDIR_$2="$1/lib" else TOR_LDFLAGS_$2="-L$1" + TOR_LIBDIR_$2="$1" fi if test -d "$1/include"; then TOR_CPPFLAGS_$2="-I$1/include" diff -Nru tor-0.2.0.34/aclocal.m4 tor-0.2.2.16-alpha/aclocal.m4 --- tor-0.2.0.34/aclocal.m4 2009-02-09 03:30:55.000000000 +0000 +++ tor-0.2.2.16-alpha/aclocal.m4 2010-09-17 06:08:36.000000000 +0000 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.10 -*- Autoconf -*- +# generated automatically by aclocal 1.10.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006 Free Software Foundation, Inc. +# 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,12 +11,15 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. -m4_if(m4_PACKAGE_VERSION, [2.61],, -[m4_fatal([this file was generated for autoconf 2.61. -You have another version of autoconf. If you want to use that, -you should regenerate the build system entirely.], [63])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(AC_AUTOCONF_VERSION, [2.61],, +[m4_warning([this file was generated for autoconf 2.61. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) -# Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -31,7 +34,7 @@ [am__api_version='1.10' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.10], [], +m4_if([$1], [1.10.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -47,8 +50,10 @@ # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.10])dnl -_AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)]) +[AM_AUTOMAKE_VERSION([1.10.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- @@ -320,7 +325,7 @@ # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. - if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue @@ -380,13 +385,13 @@ # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006 Free Software Foundation, Inc. +# 2005, 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 12 +# serial 13 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. @@ -491,16 +496,17 @@ # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. +_am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in - $1 | $1:* ) + $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # @@ -772,7 +778,7 @@ # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- -# Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in. +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) diff -Nru tor-0.2.0.34/AUTHORS tor-0.2.2.16-alpha/AUTHORS --- tor-0.2.0.34/AUTHORS 2008-02-26 19:56:33.000000000 +0000 +++ tor-0.2.2.16-alpha/AUTHORS 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ - This file lists the authors for Tor, - a free software project to provide anonymity on the Internet. - - For more information about Tor, see https://www.torproject.org/. - - If you got this file as a part of a larger bundle, - there are probably other authors that you should be aware of. - -Main authors: -------------- - -Roger Dingledine overhauled all of the code, did -a bunch of new design work, etc. - -Nick Mathewson wrote lots of stuff too, in -particular the router and descriptor parsing, and the crypto and tls -wrappers. - -Matej Pfajfar wrote the first version of the code -(called OR) in 2001-2002. - -Contributors: -------------- - -John Bashinski contributed the initial rpm spec file. - -Christian Grothoff contributed better daemonizing -behavior. - -Steven Hazel made 'make install' do the right -thing. - -Jason Holt contributed patches to the instructions -and the man page. - -Peter Palfrader maintains everything that's -debian-specific, and has written other useful features. - -Aaron Turner contributed the first version of -the tor.sh initscripts shell script. - diff -Nru tor-0.2.0.34/ChangeLog tor-0.2.2.16-alpha/ChangeLog --- tor-0.2.0.34/ChangeLog 2009-02-09 03:17:39.000000000 +0000 +++ tor-0.2.2.16-alpha/ChangeLog 2010-09-17 06:08:30.000000000 +0000 @@ -1,4 +1,1673 @@ +Changes in version 0.2.2.16-alpha - 2010-09-17 + o Major bugfixes (stream-level fairness): + - When receiving a circuit-level SENDME for a blocked circuit, try + to package cells fairly from all the streams that had previously + been blocked on that circuit. Previously, we had started with the + oldest stream, and allowed each stream to potentially exhaust + the circuit's package window. This gave older streams on any + given circuit priority over newer ones. Fixes bug 1937. Detected + originally by Camilo Viecco. This bug was introduced before the + first Tor release, in svn commit r152: it is the new winner of + the longest-lived bug prize. + - When the exit relay got a circuit-level sendme cell, it started + reading on the exit streams, even if had 500 cells queued in the + circuit queue already, so the circuit queue just grew and grew in + some cases. We fix this by not re-enabling reading on receipt of a + sendme cell when the cell queue is blocked. Fixes bug 1653. Bugfix + on 0.2.0.1-alpha. Detected by Mashael AlSabah. Original patch by + "yetonetime". + - Newly created streams were allowed to read cells onto circuits, + even if the circuit's cell queue was blocked and waiting to drain. + This created potential unfairness, as older streams would be + blocked, but newer streams would gladly fill the queue completely. + We add code to detect this situation and prevent any stream from + getting more than one free cell. Bugfix on 0.2.0.1-alpha. Partially + fixes bug 1298. + + o Minor features: + - Update to the September 1 2010 Maxmind GeoLite Country database. + - Warn when CookieAuthFileGroupReadable is set but CookieAuthFile is + not. This would lead to a cookie that is still not group readable. + Closes bug 1843. Suggested by katmagic. + - When logging a rate-limited warning, we now mention how many messages + got suppressed since the last warning. + - Add new "perconnbwrate" and "perconnbwburst" consensus params to + do individual connection-level rate limiting of clients. The torrc + config options with the same names trump the consensus params, if + both are present. Replaces the old "bwconnrate" and "bwconnburst" + consensus params which were broken from 0.2.2.7-alpha through + 0.2.2.14-alpha. Closes bug 1947. + - When a router changes IP address or port, authorities now launch + a new reachability test for it. Implements ticket 1899. + - Make the formerly ugly "2 unknown, 7 missing key, 0 good, 0 bad, + 2 no signature, 4 required" messages about consensus signatures + easier to read, and make sure they get logged at the same severity + as the messages explaining which keys are which. Fixes bug 1290. + - Don't warn when we have a consensus that we can't verify because + of missing certificates, unless those certificates are ones + that we have been trying and failing to download. Fixes bug 1145. + - If you configure your bridge with a known identity fingerprint, + and the bridge authority is unreachable (as it is in at least + one country now), fall back to directly requesting the descriptor + from the bridge. Finishes the feature started in 0.2.0.10-alpha; + closes bug 1138. + - When building with --enable-gcc-warnings on OpenBSD, disable + warnings in system headers. This makes --enable-gcc-warnings + pass on OpenBSD 4.8. + + o Minor bugfixes (on 0.2.1.x and earlier): + - Authorities will now attempt to download consensuses if their + own efforts to make a live consensus have failed. This change + means authorities that restart will fetch a valid consensus, and + it means authorities that didn't agree with the current consensus + will still fetch and serve it if it has enough signatures. Bugfix + on 0.2.0.9-alpha; fixes bug 1300. + - Ensure DNS requests launched by "RESOLVE" commands from the + controller respect the __LeaveStreamsUnattached setconf options. The + same goes for requests launched via DNSPort or transparent + proxying. Bugfix on 0.2.0.1-alpha; fixes bug 1525. + - Allow handshaking OR connections to take a full KeepalivePeriod + seconds to handshake. Previously, we would close them after + IDLE_OR_CONN_TIMEOUT (180) seconds, the same timeout as if they + were open. Bugfix on 0.2.1.26; fixes bug 1840. Thanks to mingw-san + for analysis help. + - Rate-limit "Failed to hand off onionskin" warnings. + - Never relay a cell for a circuit we have already destroyed. + Between marking a circuit as closeable and finally closing it, + it may have been possible for a few queued cells to get relayed, + even though they would have been immediately dropped by the next + OR in the circuit. Fixes bug 1184; bugfix on 0.2.0.1-alpha. + - Never queue a cell for a circuit that's already been marked + for close. + - Never vote for a server as "Running" if we have a descriptor for + it claiming to be hibernating, and that descriptor was published + more recently than our last contact with the server. Bugfix on + 0.2.0.3-alpha; fixes bug 911. + - Squash a compile warning on OpenBSD. Reported by Tas; fixes + bug 1848. + + o Minor bugfixes (on 0.2.2.x): + - Fix a regression introduced in 0.2.2.7-alpha that marked relays + down if a directory fetch fails and you've configured either + bridges or EntryNodes. The intent was to mark the relay as down + _unless_ you're using bridges or EntryNodes, since if you are + then you could quickly run out of entry points. + - Fix the Windows directory-listing code. A bug introduced in + 0.2.2.14-alpha could make Windows directory servers forget to load + some of their cached v2 networkstatus files. + - Really allow clients to use relays as bridges. Fixes bug 1776; + bugfix on 0.2.2.15-alpha. + - Demote a warn to info that happens when the CellStatistics option + was just enabled. Bugfix on 0.2.2.15-alpha; fixes bug 1921. + Reported by Moritz Bartl. + - On Windows, build correctly either with or without Unicode support. + This is necessary so that Tor can support fringe platforms like + Windows 98 (which has no Unicode), or Windows CE (which has no + non-Unicode). Bugfix on 0.2.2.14-alpha; fixes bug 1797. + + o Testing + - Add a unit test for cross-platform directory-listing code. + + +Changes in version 0.2.2.15-alpha - 2010-08-18 + o Major bugfixes: + - Stop assigning the HSDir flag to relays that disable their + DirPort (and thus will refuse to answer directory requests). This + fix should dramatically improve the reachability of hidden services: + hidden services and hidden service clients pick six HSDir relays + to store and retrieve the hidden service descriptor, and currently + about half of the HSDir relays will refuse to work. Bugfix on + 0.2.0.10-alpha; fixes part of bug 1693. + - The PerConnBWRate and Burst config options, along with the + bwconnrate and bwconnburst consensus params, initialized each conn's + token bucket values only when the connection is established. Now we + update them if the config options change, and update them every time + we get a new consensus. Otherwise we can encounter an ugly edge + case where we initialize an OR conn to client-level bandwidth, + but then later the relay joins the consensus and we leave it + throttled. Bugfix on 0.2.2.7-alpha; fixes bug 1830. + - Fix a regression that caused Tor to rebind its ports if it receives + SIGHUP while hibernating. Bugfix in 0.1.1.6-alpha; closes bug 919. + + o Major features: + - Lower the maximum weighted-fractional-uptime cutoff to 98%. This + should give us approximately 40-50% more Guard-flagged nodes, + improving the anonymity the Tor network can provide and also + decreasing the dropoff in throughput that relays experience when + they first get the Guard flag. + - Allow enabling or disabling the *Statistics config options while + Tor is running. + + o Minor features: + - Update to the August 1 2010 Maxmind GeoLite Country database. + - Have the controller interface give a more useful message than + "Internal Error" in response to failed GETINFO requests. + - Warn when the same option is provided more than once in a torrc + file, on the command line, or in a single SETCONF statement, and + the option is one that only accepts a single line. Closes bug 1384. + - Build correctly on mingw with more recent versions of OpenSSL 0.9.8. + Patch from mingw-san. + - Add support for the country code "{??}" in torrc options like + ExcludeNodes, to indicate all routers of unknown country. Closes + bug 1094. + - Relays report the number of bytes spent on answering directory + requests in extra-info descriptors similar to {read,write}-history. + Implements enhancement 1790. + + o Minor bugfixes (on 0.2.1.x and earlier): + - Complain if PublishServerDescriptor is given multiple arguments that + include 0 or 1. This configuration will be rejected in the future. + Bugfix on 0.2.0.1-alpha; closes bug 1107. + - Disallow BridgeRelay 1 and ORPort 0 at once in the configuration. + Bugfix on 0.2.0.13-alpha; closes bug 928. + - Change "Application request when we're believed to be offline." + notice to "Application request when we haven't used client + functionality lately.", to clarify that it's not an error. Bugfix + on 0.0.9.3; fixes bug 1222. + - Fix a bug in the controller interface where "GETINFO ns/asdaskljkl" + would return "551 Internal error" rather than "552 Unrecognized key + ns/asdaskljkl". Bugfix on 0.1.2.3-alpha. + - Users can't configure a regular relay to be their bridge. It didn't + work because when Tor fetched the bridge descriptor, it found + that it already had it, and didn't realize that the purpose of the + descriptor had changed. Now we replace routers with a purpose other + than bridge with bridge descriptors when fetching them. Bugfix on + 0.1.1.9-alpha. Bug 1776 not yet fixed because now we immediately + refetch the descriptor with router purpose 'general', disabling + it as a bridge. + - Fix a rare bug in rend_fn unit tests: we would fail a test when + a randomly generated port is 0. Diagnosed by Matt Edman. Bugfix + on 0.2.0.10-alpha; fixes bug 1808. + - Exit nodes didn't recognize EHOSTUNREACH as a plausible error code, + and so sent back END_STREAM_REASON_MISC. Clients now recognize a new + stream ending reason for this case: END_STREAM_REASON_NOROUTE. + Servers can start sending this code when enough clients recognize + it. Also update the spec to reflect this new reason. Bugfix on + 0.1.0.1-rc; fixes part of bug 1793. + - Delay geoip stats collection by bridges for 6 hours, not 2 hours, + when we switch from being a public relay to a bridge. Otherwise + there will still be clients that see the relay in their consensus, + and the stats will end up wrong. Bugfix on 0.2.1.15-rc; fixes bug + 932 even more. + - Instead of giving an assertion failure on an internal mismatch + on estimated freelist size, just log a BUG warning and try later. + Mitigates but does not fix bug 1125. + - Fix an assertion failure that could occur in caches or bridge users + when using a very short voting interval on a testing network. + Diagnosed by Robert Hogan. Fixes bug 1141; bugfix on 0.2.0.8-alpha. + + o Minor bugfixes (on 0.2.2.x): + - Alter directory authorities to always consider Exit-flagged nodes + as potential Guard nodes in their votes. The actual decision to + use Exits as Guards is done in the consensus bandwidth weights. + Fixes bug 1294; bugfix on 0.2.2.10-alpha. + - When the controller is reporting the purpose of circuits that + didn't finish building before the circuit build timeout, it was + printing UNKNOWN_13. Now print EXPIRED. Bugfix on 0.2.2.14-alpha. + - Our libevent version parsing code couldn't handle versions like + 1.4.14b-stable and incorrectly warned the user about using an + old and broken version of libevent. Treat 1.4.14b-stable like + 1.4.14-stable when parsing the version. Fixes bug 1731; bugfix + on 0.2.2.1-alpha. + - Don't use substitution references like $(VAR:MOD) when + $(asciidoc_files) is empty -- make(1) on NetBSD transforms + '$(:x)' to 'x' rather than the empty string. This bites us in + doc/ when configured with --disable-asciidoc. Bugfix on + 0.2.2.9-alpha; fixes bug 1773. + - Remove a spurious hidden service server-side log notice about + "Ancient non-dirty circuits". Bugfix on 0.2.2.14-alpha; fixes + bug 1741. + - Fix compilation with --with-dmalloc set. Bugfix on 0.2.2.6-alpha; + fixes bug 1832. + - Correctly report written bytes on linked connections. Found while + implementing 1790. Bugfix on 0.2.2.4-alpha. + - Fix three memory leaks: one in circuit_build_times_parse_state(), + one in dirvote_add_signatures_to_pending_consensus(), and one every + time we parse a v3 network consensus. Bugfixes on 0.2.2.14-alpha, + 0.2.2.6-alpha, and 0.2.2.10-alpha respectively; fixes bug 1831. + + o Code simplifications and refactoring: + - Take a first step towards making or.h smaller by splitting out + function definitions for all source files in src/or/. Leave + structures and defines in or.h for now. + - Remove a bunch of unused function declarations as well as a block of + #if 0'd code from the unit tests. Closes bug 1824. + - New unit tests for exit-port history statistics; refactored exit + statistics code to be more easily tested. + - Remove the old debian/ directory from the main Tor distribution. + The official Tor-for-debian git repository lives at the URL + https://git.torproject.org/debian/tor.git + + +Changes in version 0.2.2.14-alpha - 2010-07-12 + Tor 0.2.2.14-alpha greatly improves client-side handling of + circuit build timeouts, which are used to estimate speed and improve + performance. We also move to a much better GeoIP database, port Tor to + Windows CE, introduce new compile flags that improve code security, + add an eighth v3 directory authority, and address a lot of more + minor issues. + + o Major bugfixes: + - Tor directory authorities no longer crash when started with a + cached-microdesc-consensus file in their data directory. Bugfix + on 0.2.2.6-alpha; fixes bug 1532. + - Treat an unset $HOME like an empty $HOME rather than triggering an + assert. Bugfix on 0.0.8pre1; fixes bug 1522. + - Ignore negative and large circuit build timeout values that can + happen during a suspend or hibernate. These values caused various + asserts to fire. Bugfix on 0.2.2.2-alpha; fixes bug 1245. + - Alter calculation of Pareto distribution parameter 'Xm' for + Circuit Build Timeout learning to use the weighted average of the + top N=3 modes (because we have three entry guards). Considering + multiple modes should improve the timeout calculation in some cases, + and prevent extremely high timeout values. Bugfix on 0.2.2.2-alpha; + fixes bug 1335. + - Alter calculation of Pareto distribution parameter 'Alpha' to use a + right censored distribution model. This approach improves over the + synthetic timeout generation approach that was producing insanely + high timeout values. Now we calculate build timeouts using truncated + times. Bugfix on 0.2.2.2-alpha; fixes bugs 1245 and 1335. + - Do not close circuits that are under construction when they reach + the circuit build timeout. Instead, leave them building (but do not + use them) for up until the time corresponding to the 95th percentile + on the Pareto CDF or 60 seconds, whichever is greater. This is done + to provide better data for the new Pareto model. This percentile + can be controlled by the consensus. + + o Major features: + - Move to the June 2010 Maxmind GeoLite country db (rather than the + June 2009 ip-to-country GeoIP db) for our statistics that count + how many users relays are seeing from each country. Now we have + more accurate data for many African countries. + - Port Tor to build and run correctly on Windows CE systems, using + the wcecompat library. Contributed by Valerio Lupi. + - New "--enable-gcc-hardening" ./configure flag (off by default) + to turn on gcc compile time hardening options. It ensures + that signed ints have defined behavior (-fwrapv), enables + -D_FORTIFY_SOURCE=2 (requiring -O2), adds stack smashing protection + with canaries (-fstack-protector-all), turns on ASLR protection if + supported by the kernel (-fPIE, -pie), and adds additional security + related warnings. Verified to work on Mac OS X and Debian Lenny. + - New "--enable-linker-hardening" ./configure flag (off by default) + to turn on ELF specific hardening features (relro, now). This does + not work with Mac OS X or any other non-ELF binary format. + + o New directory authorities: + - Set up maatuska (run by Linus Nordberg) as the eighth v3 directory + authority. + + o Minor features: + - New config option "WarnUnsafeSocks 0" disables the warning that + occurs whenever Tor receives only an IP address instead of a + hostname. Setups that do DNS locally over Tor are fine, and we + shouldn't spam the logs in that case. + - Convert the HACKING file to asciidoc, and add a few new sections + to it, explaining how we use Git, how we make changelogs, and + what should go in a patch. + - Add a TIMEOUT_RATE keyword to the BUILDTIMEOUT_SET control port + event, to give information on the current rate of circuit timeouts + over our stored history. + - Add ability to disable circuit build time learning via consensus + parameter and via a LearnCircuitBuildTimeout config option. Also + automatically disable circuit build time calculation if we are + either a AuthoritativeDirectory, or if we fail to write our state + file. Fixes bug 1296. + - More gracefully handle corrupt state files, removing asserts + in favor of saving a backup and resetting state. + - Rename the "log.h" header to "torlog.h" so as to conflict with fewer + system headers. + + o Minor bugfixes: + - Build correctly on OSX with zlib 1.2.4 and higher with all warnings + enabled. + - When a2x fails, mention that the user could disable manpages instead + of trying to fix their asciidoc installation. + - Where available, use Libevent 2.0's periodic timers so that our + once-per-second cleanup code gets called even more closely to + once per second than it would otherwise. Fixes bug 943. + - If you run a bridge that listens on multiple IP addresses, and + some user configures a bridge address that uses a different IP + address than your bridge writes in its router descriptor, and the + user doesn't specify an identity key, their Tor would discard the + descriptor because "it isn't one of our configured bridges", and + fail to bootstrap. Now believe the descriptor and bootstrap anyway. + Bugfix on 0.2.0.3-alpha. + - If OpenSSL fails to make a duplicate of a private or public key, log + an error message and try to exit cleanly. May help with debugging + if bug 1209 ever remanifests. + - Save a couple bytes in memory allocation every time we escape + certain characters in a string. Patch from Florian Zumbiehl. + - Make it explicit that we don't cannibalize one-hop circuits. This + happens in the wild, but doesn't turn out to be a problem because + we fortunately don't use those circuits. Many thanks to outofwords + for the initial analysis and to swissknife who confirmed that + two-hop circuits are actually created. + - Make directory mirrors report non-zero dirreq-v[23]-shares again. + Fixes bug 1564; bugfix on 0.2.2.9-alpha. + - Eliminate a case where a circuit build time warning was displayed + after network connectivity resumed. Bugfix on 0.2.2.2-alpha. + + +Changes in version 0.2.1.26 - 2010-05-02 + Tor 0.2.1.26 addresses the recent connection and memory overload + problems we've been seeing on relays, especially relays with their + DirPort open. If your relay has been crashing, or you turned it off + because it used too many resources, give this release a try. + + This release also fixes yet another instance of broken OpenSSL libraries + that was causing some relays to drop out of the consensus. + + o Major bugfixes: + - Teach relays to defend themselves from connection overload. Relays + now close idle circuits early if it looks like they were intended + for directory fetches. Relays are also more aggressive about closing + TLS connections that have no circuits on them. Such circuits are + unlikely to be re-used, and tens of thousands of them were piling + up at the fast relays, causing the relays to run out of sockets + and memory. Bugfix on 0.2.0.22-rc (where clients started tunneling + their directory fetches over TLS). + - Fix SSL renegotiation behavior on OpenSSL versions like on Centos + that claim to be earlier than 0.9.8m, but which have in reality + backported huge swaths of 0.9.8m or 0.9.8n renegotiation + behavior. Possible fix for some cases of bug 1346. + - Directory mirrors were fetching relay descriptors only from v2 + directory authorities, rather than v3 authorities like they should. + Only 2 v2 authorities remain (compared to 7 v3 authorities), leading + to a serious bottleneck. Bugfix on 0.2.0.9-alpha. Fixes bug 1324. + + o Minor bugfixes: + - Finally get rid of the deprecated and now harmful notion of "clique + mode", where directory authorities maintain TLS connections to + every other relay. + + o Testsuite fixes: + - In the util/threads test, no longer free the test_mutex before all + worker threads have finished. Bugfix on 0.2.1.6-alpha. + - The master thread could starve the worker threads quite badly on + certain systems, causing them to run only partially in the allowed + window. This resulted in test failures. Now the master thread sleeps + occasionally for a few microseconds while the two worker-threads + compete for the mutex. Bugfix on 0.2.0.1-alpha. + + +Changes in version 0.2.2.13-alpha - 2010-04-24 + Tor 0.2.2.13-alpha addresses the recent connection and memory overload + problems we've been seeing on relays, especially relays with their + DirPort open. If your relay has been crashing, or you turned it off + because it used too many resources, give this release a try. + + o Major bugfixes: + - Teach relays to defend themselves from connection overload. Relays + now close idle circuits early if it looks like they were intended + for directory fetches. Relays are also more aggressive about closing + TLS connections that have no circuits on them. Such circuits are + unlikely to be re-used, and tens of thousands of them were piling + up at the fast relays, causing the relays to run out of sockets + and memory. Bugfix on 0.2.0.22-rc (where clients started tunneling + their directory fetches over TLS). + + o Minor features: + - Finally get rid of the deprecated and now harmful notion of "clique + mode", where directory authorities maintain TLS connections to + every other relay. + - Directory authorities now do an immediate reachability check as soon + as they hear about a new relay. This change should slightly reduce + the time between setting up a relay and getting listed as running + in the consensus. It should also improve the time between setting + up a bridge and seeing use by bridge users. + - Directory authorities no longer launch a TLS connection to every + relay as they startup. Now that we have 2k+ descriptors cached, + the resulting network hiccup is becoming a burden. Besides, + authorities already avoid voting about Running for the first half + hour of their uptime. + + +Changes in version 0.2.2.12-alpha - 2010-04-20 + Tor 0.2.2.12-alpha fixes a critical bug in how directory authorities + handle and vote on descriptors. It was causing relays to drop out of + the consensus. + + o Major bugfixes: + - Many relays have been falling out of the consensus lately because + not enough authorities know about their descriptor for them to get + a majority of votes. When we deprecated the v2 directory protocol, + we got rid of the only way that v3 authorities can hear from each + other about other descriptors. Now authorities examine every v3 + vote for new descriptors, and fetch them from that authority. Bugfix + on 0.2.1.23. + - Fix two typos in tor_vasprintf() that broke the compile on Windows, + and a warning in or.h related to bandwidth_weight_rule_t that + prevented clean compile on OS X. Fixes bug 1363; bugfix on + 0.2.2.11-alpha. + - Fix a segfault on relays when DirReqStatistics is enabled + and 24 hours pass. Bug found by keb. Fixes bug 1365; bugfix on + 0.2.2.11-alpha. + + o Minor bugfixes: + - Demote a confusing TLS warning that relay operators might get when + someone tries to talk to their OrPort. It is neither the operator's + fault nor can they do anything about it. Fixes bug 1364; bugfix + on 0.2.0.14-alpha. + + +Changes in version 0.2.2.11-alpha - 2010-04-15 + Tor 0.2.2.11-alpha fixes yet another instance of broken OpenSSL + libraries that was causing some relays to drop out of the consensus. + + o Major bugfixes: + - Directory mirrors were fetching relay descriptors only from v2 + directory authorities, rather than v3 authorities like they should. + Only 2 v2 authorities remain (compared to 7 v3 authorities), leading + to a serious bottleneck. Bugfix on 0.2.0.9-alpha. Fixes bug 1324. + - Fix a parsing error that made every possible value of + CircPriorityHalflifeMsec get treated as "1 msec". Bugfix + on 0.2.2.7-alpha. Rename CircPriorityHalflifeMsec to + CircuitPriorityHalflifeMsec, so authorities can tell newer relays + about the option without breaking older ones. + - Fix SSL renegotiation behavior on OpenSSL versions like on Centos + that claim to be earlier than 0.9.8m, but which have in reality + backported huge swaths of 0.9.8m or 0.9.8n renegotiation + behavior. Possible fix for some cases of bug 1346. + + o Minor features: + - Experiment with a more aggressive approach to preventing clients + from making one-hop exit streams. Exit relays who want to try it + out can set "RefuseUnknownExits 1" in their torrc, and then look + for "Attempt by %s to open a stream" log messages. Let us know + how it goes! + - Add support for statically linking zlib by specifying + --enable-static-zlib, to go with our support for statically linking + openssl and libevent. Resolves bug 1358. + + o Minor bugfixes: + - Fix a segfault that happens whenever a Tor client that is using + libevent2's bufferevents gets a hup signal. Bugfix on 0.2.2.5-alpha; + fixes bug 1341. + - When we cleaned up the contrib/tor-exit-notice.html file, we left + out the first line. Fixes bug 1295. + - When building the manpage from a tarball, we required asciidoc, but + the asciidoc -> roff/html conversion was already done for the + tarball. Make 'make' complain only when we need asciidoc (either + because we're compiling directly from git, or because we altered + the asciidoc manpage in the tarball). Bugfix on 0.2.2.9-alpha. + - When none of the directory authorities vote on any params, Tor + segfaulted when trying to make the consensus from the votes. We + didn't trigger the bug in practice, because authorities do include + params in their votes. Bugfix on 0.2.2.10-alpha; fixes bug 1322. + + o Testsuite fixes: + - In the util/threads test, no longer free the test_mutex before all + worker threads have finished. Bugfix on 0.2.1.6-alpha. + - The master thread could starve the worker threads quite badly on + certain systems, causing them to run only partially in the allowed + window. This resulted in test failures. Now the master thread sleeps + occasionally for a few microseconds while the two worker-threads + compete for the mutex. Bugfix on 0.2.0.1-alpha. + + +Changes in version 0.2.2.10-alpha - 2010-03-07 + Tor 0.2.2.10-alpha fixes a regression introduced in 0.2.2.9-alpha that + could prevent relays from guessing their IP address correctly. It also + starts the groundwork for another client-side performance boost, since + currently we're not making efficient use of relays that have both the + Guard flag and the Exit flag. + + o Major bugfixes: + - Fix a regression from our patch for bug 1244 that caused relays + to guess their IP address incorrectly if they didn't set Address + in their torrc and/or their address fails to resolve. Bugfix on + 0.2.2.9-alpha; fixes bug 1269. + + o Major features (performance): + - Directory authorities now compute consensus weightings that instruct + clients how to weight relays flagged as Guard, Exit, Guard+Exit, + and no flag. Clients that use these weightings will distribute + network load more evenly across these different relay types. The + weightings are in the consensus so we can change them globally in + the future. Extra thanks to "outofwords" for finding some nasty + security bugs in the first implementation of this feature. + + o Minor features (performance): + - Always perform router selections using weighted relay bandwidth, + even if we don't need a high capacity circuit at the time. Non-fast + circuits now only differ from fast ones in that they can use relays + not marked with the Fast flag. This "feature" could turn out to + be a horrible bug; we should investigate more before it goes into + a stable release. + + o Minor features: + - Allow disabling building of the manpages. Skipping the manpage + speeds up the build considerably. + + o Minor bugfixes (on 0.2.2.x): + - Fix a memleak in the EXTENDCIRCUIT logic. Spotted by coverity. + Bugfix on 0.2.2.9-alpha. + - Disallow values larger than INT32_MAX for PerConnBWRate|Burst + config option. Bugfix on 0.2.2.7-alpha. + - Ship the asciidoc-helper file in the tarball, so that people can + build from source if they want to, and touching the .1.txt files + doesn't break the build. Bugfix on 0.2.2.9-alpha. + + o Minor bugfixes (on 0.2.1.x or earlier): + - Fix a dereference-then-NULL-check sequence when publishing + descriptors. Bugfix on 0.2.1.5-alpha. Discovered by ekir; fixes + bug 1255. + - Fix another dereference-then-NULL-check sequence. Bugfix on + 0.2.1.14-rc. Discovered by ekir; fixes bug 1256. + - Make sure we treat potentially not NUL-terminated strings correctly. + Bugfix on 0.1.1.13-alpha. Discovered by rieo; fixes bug 1257. + + o Code simplifications and refactoring: + - Fix some urls in the exit notice file and make it XHTML1.1 strict + compliant. Based on a patch from Christian Kujau. + - Don't use sed in asciidoc-helper anymore. + - Make the build process fail if asciidoc cannot be found and + building with asciidoc isn't disabled. + + +Changes in version 0.2.2.9-alpha - 2010-02-22 + Tor 0.2.2.9-alpha makes Tor work again on the latest OS X, updates the + location of a directory authority, and cleans up a bunch of small bugs. + + o Directory authority changes: + - Change IP address for dannenberg (v3 directory authority), and + remove moria2 (obsolete v1, v2 directory authority and v0 hidden + service directory authority) from the list. + + o Major bugfixes: + - Make Tor work again on the latest OS X: when deciding whether to + use strange flags to turn TLS renegotiation on, detect the OpenSSL + version at run-time, not compile time. We need to do this because + Apple doesn't update its dev-tools headers when it updates its + libraries in a security patch. + - Fix a potential buffer overflow in lookup_last_hid_serv_request() + that could happen on 32-bit platforms with 64-bit time_t. Also fix + a memory leak when requesting a hidden service descriptor we've + requested before. Fixes bug 1242, bugfix on 0.2.0.18-alpha. Found + by aakova. + - Authorities could be tricked into giving out the Exit flag to relays + that didn't allow exiting to any ports. This bug could screw + with load balancing and stats. Bugfix on 0.1.1.6-alpha; fixes bug + 1238. Bug discovered by Martin Kowalczyk. + - When freeing a session key, zero it out completely. We only zeroed + the first ptrsize bytes. Bugfix on 0.0.2pre8. Discovered and + patched by ekir. Fixes bug 1254. + + o Minor bugfixes: + - Fix static compilation by listing the openssl libraries in the right + order. Bugfix on Tor 0.2.2.8-alpha; fixes bug 1237. + - Resume handling .exit hostnames in a special way: originally we + stripped the .exit part and used the requested exit relay. In + 0.2.2.1-alpha we stopped treating them in any special way, meaning + if you use a .exit address then Tor will pass it on to the exit + relay. Now we reject the .exit stream outright, since that behavior + might be more expected by the user. Found and diagnosed by Scott + Bennett and Downie on or-talk. + - Don't spam the controller with events when we have no file + descriptors available. Bugfix on 0.2.1.5-alpha. (Rate-limiting + for log messages was already solved from bug 748.) + - Avoid a bogus overlapped memcpy in tor_addr_copy(). Reported by + "memcpyfail". + - Make the DNSPort option work with libevent 2.x. Don't alter the + behaviour for libevent 1.x. Fixes bug 1143. Found by SwissTorExit. + - Emit a GUARD DROPPED controller event for a case we missed. + - Make more fields in the controller protocol case-insensitive, since + control-spec.txt said they were. + - Refactor resolve_my_address() to not use gethostbyname() anymore. + Fixes bug 1244; bugfix on 0.0.2pre25. Reported by Mike Mestnik. + - Fix a spec conformance issue: the network-status-version token + must be the first token in a v3 consensus or vote. Discovered by + parakeep. Bugfix on 0.2.0.3-alpha. + + o Code simplifications and refactoring: + - Generate our manpage and HTML documentation using Asciidoc. This + change should make it easier to maintain the documentation, and + produce nicer HTML. + - Remove the --enable-iphone option. According to reports from Marco + Bonetti, Tor builds fine without any special tweaking on recent + iPhone SDK versions. + - Removed some unnecessary files from the source distribution. The + AUTHORS file has now been merged into the people page on the + website. The roadmaps and design doc can now be found in the + projects directory in svn. + - Enabled various circuit build timeout constants to be controlled + by consensus parameters. Also set better defaults for these + parameters based on experimentation on broadband and simulated + high latency links. + + o Minor features: + - The 'EXTENDCIRCUIT' control port command can now be used with + a circ id of 0 and no path. This feature will cause Tor to build + a new 'fast' general purpose circuit using its own path selection + algorithms. + - Added a BUILDTIMEOUT_SET controller event to describe changes + to the circuit build timeout. + - Future-proof the controller protocol a bit by ignoring keyword + arguments we do not recognize. + - Expand homedirs passed to tor-checkkey. This should silence a + coverity complaint about passing a user-supplied string into + open() without checking it. + + +Changes in version 0.2.1.25 - 2010-03-16 + Tor 0.2.1.25 fixes a regression introduced in 0.2.1.23 that could + prevent relays from guessing their IP address correctly. It also fixes + several minor potential security bugs. + + o Major bugfixes: + - Fix a regression from our patch for bug 1244 that caused relays + to guess their IP address incorrectly if they didn't set Address + in their torrc and/or their address fails to resolve. Bugfix on + 0.2.1.23; fixes bug 1269. + - When freeing a session key, zero it out completely. We only zeroed + the first ptrsize bytes. Bugfix on 0.0.2pre8. Discovered and + patched by ekir. Fixes bug 1254. + + o Minor bugfixes: + - Fix a dereference-then-NULL-check sequence when publishing + descriptors. Bugfix on 0.2.1.5-alpha. Discovered by ekir; fixes + bug 1255. + - Fix another dereference-then-NULL-check sequence. Bugfix on + 0.2.1.14-rc. Discovered by ekir; fixes bug 1256. + - Make sure we treat potentially not NUL-terminated strings correctly. + Bugfix on 0.1.1.13-alpha. Discovered by rieo; fixes bug 1257. + + + +Changes in version 0.2.1.24 - 2010-02-21 + Tor 0.2.1.24 makes Tor work again on the latest OS X -- this time + for sure! + + o Minor bugfixes: + - Work correctly out-of-the-box with even more vendor-patched versions + of OpenSSL. In particular, make it so Debian and OS X don't need + customized patches to run/build. + + +Changes in version 0.2.1.23 - 2010-02-13 + Tor 0.2.1.23 fixes a huge client-side performance bug, makes Tor work + again on the latest OS X, and updates the location of a directory + authority. + + o Major bugfixes (performance): + - We were selecting our guards uniformly at random, and then weighting + which of our guards we'd use uniformly at random. This imbalance + meant that Tor clients were severely limited on throughput (and + probably latency too) by the first hop in their circuit. Now we + select guards weighted by currently advertised bandwidth. We also + automatically discard guards picked using the old algorithm. Fixes + bug 1217; bugfix on 0.2.1.3-alpha. Found by Mike Perry. + + o Major bugfixes: + - Make Tor work again on the latest OS X: when deciding whether to + use strange flags to turn TLS renegotiation on, detect the OpenSSL + version at run-time, not compile time. We need to do this because + Apple doesn't update its dev-tools headers when it updates its + libraries in a security patch. + - Fix a potential buffer overflow in lookup_last_hid_serv_request() + that could happen on 32-bit platforms with 64-bit time_t. Also fix + a memory leak when requesting a hidden service descriptor we've + requested before. Fixes bug 1242, bugfix on 0.2.0.18-alpha. Found + by aakova. + + o Directory authority changes: + - Change IP address for dannenberg (v3 directory authority), and + remove moria2 (obsolete v1, v2 directory authority and v0 hidden + service directory authority) from the list. + + o Minor bugfixes: + - Refactor resolve_my_address() to not use gethostbyname() anymore. + Fixes bug 1244; bugfix on 0.0.2pre25. Reported by Mike Mestnik. + + o Minor features: + - Avoid a mad rush at the beginning of each month when each client + rotates half of its guards. Instead we spread the rotation out + throughout the month, but we still avoid leaving a precise timestamp + in the state file about when we first picked the guard. Improves + over the behavior introduced in 0.1.2.17. + + +Changes in version 0.2.2.8-alpha - 2010-01-26 + Tor 0.2.2.8-alpha fixes a crash bug in 0.2.2.7-alpha that has been + causing bridge relays to disappear. If you're running a bridge, + please upgrade. + + o Major bugfixes: + - Fix a memory corruption bug on bridges that occured during the + inclusion of stats data in extra-info descriptors. Also fix the + interface for geoip_get_bridge_stats* to prevent similar bugs in + the future. Diagnosis by Tas, patch by Karsten and Sebastian. + Fixes bug 1208; bugfix on 0.2.2.7-alpha. + + o Minor bugfixes: + - Ignore OutboundBindAddress when connecting to localhost. + Connections to localhost need to come _from_ localhost, or else + local servers (like DNS and outgoing HTTP/SOCKS proxies) will often + refuse to listen. + + +Changes in version 0.2.2.7-alpha - 2010-01-19 + Tor 0.2.2.7-alpha fixes a huge client-side performance bug, as well + as laying the groundwork for further relay-side performance fixes. It + also starts cleaning up client behavior with respect to the EntryNodes, + ExitNodes, and StrictNodes config options. + + This release also rotates two directory authority keys, due to a + security breach of some of the Torproject servers. + + o Directory authority changes: + - Rotate keys (both v3 identity and relay identity) for moria1 + and gabelmoo. + + o Major features (performance): + - We were selecting our guards uniformly at random, and then weighting + which of our guards we'd use uniformly at random. This imbalance + meant that Tor clients were severely limited on throughput (and + probably latency too) by the first hop in their circuit. Now we + select guards weighted by currently advertised bandwidth. We also + automatically discard guards picked using the old algorithm. Fixes + bug 1217; bugfix on 0.2.1.3-alpha. Found by Mike Perry. + - When choosing which cells to relay first, relays can now favor + circuits that have been quiet recently, to provide lower latency + for low-volume circuits. By default, relays enable or disable this + feature based on a setting in the consensus. You can override + this default by using the new "CircuitPriorityHalflife" config + option. Design and code by Ian Goldberg, Can Tang, and Chris + Alexander. + - Add separate per-conn write limiting to go with the per-conn read + limiting. We added a global write limit in Tor 0.1.2.5-alpha, + but never per-conn write limits. + - New consensus params "bwconnrate" and "bwconnburst" to let us + rate-limit client connections as they enter the network. It's + controlled in the consensus so we can turn it on and off for + experiments. It's starting out off. Based on proposal 163. + + o Major features (relay selection options): + - Switch to a StrictNodes config option, rather than the previous + "StrictEntryNodes" / "StrictExitNodes" separation that was missing a + "StrictExcludeNodes" option. + - If EntryNodes, ExitNodes, ExcludeNodes, or ExcludeExitNodes + change during a config reload, mark and discard all our origin + circuits. This fix should address edge cases where we change the + config options and but then choose a circuit that we created before + the change. + - If EntryNodes or ExitNodes are set, be more willing to use an + unsuitable (e.g. slow or unstable) circuit. The user asked for it, + they get it. + - Make EntryNodes config option much more aggressive even when + StrictNodes is not set. Before it would prepend your requested + entrynodes to your list of guard nodes, but feel free to use others + after that. Now it chooses only from your EntryNodes if any of + those are available, and only falls back to others if a) they're + all down and b) StrictNodes is not set. + - Now we refresh your entry guards from EntryNodes at each consensus + fetch -- rather than just at startup and then they slowly rot as + the network changes. + + o Major bugfixes: + - Stop bridge directory authorities from answering dbg-stability.txt + directory queries, which would let people fetch a list of all + bridge identities they track. Bugfix on 0.2.1.6-alpha. + + o Minor features: + - Log a notice when we get a new control connection. Now it's easier + for security-conscious users to recognize when a local application + is knocking on their controller door. Suggested by bug 1196. + - New config option "CircuitStreamTimeout" to override our internal + timeout schedule for how many seconds until we detach a stream from + a circuit and try a new circuit. If your network is particularly + slow, you might want to set this to a number like 60. + - New controller command "getinfo config-text". It returns the + contents that Tor would write if you send it a SAVECONF command, + so the controller can write the file to disk itself. + - New options for SafeLogging to allow scrubbing only log messages + generated while acting as a relay. + - Ship the bridges spec file in the tarball too. + - Avoid a mad rush at the beginning of each month when each client + rotates half of its guards. Instead we spread the rotation out + throughout the month, but we still avoid leaving a precise timestamp + in the state file about when we first picked the guard. Improves + over the behavior introduced in 0.1.2.17. + + o Minor bugfixes (compiling): + - Fix compilation on OS X 10.3, which has a stub mlockall() but + hides it. Bugfix on 0.2.2.6-alpha. + - Fix compilation on Solaris by removing support for the + DisableAllSwap config option. Solaris doesn't have an rlimit for + mlockall, so we cannot use it safely. Fixes bug 1198; bugfix on + 0.2.2.6-alpha. + + o Minor bugfixes (crashes): + - Do not segfault when writing buffer stats when we haven't observed + a single circuit to report about. Found by Fabian Lanze. Bugfix on + 0.2.2.1-alpha. + - If we're in the pathological case where there's no exit bandwidth + but there is non-exit bandwidth, or no guard bandwidth but there + is non-guard bandwidth, don't crash during path selection. Bugfix + on 0.2.0.3-alpha. + - Fix an impossible-to-actually-trigger buffer overflow in relay + descriptor generation. Bugfix on 0.1.0.15. + + o Minor bugfixes (privacy): + - Fix an instance where a Tor directory mirror might accidentally + log the IP address of a misbehaving Tor client. Bugfix on + 0.1.0.1-rc. + - Don't list Windows capabilities in relay descriptors. We never made + use of them, and maybe it's a bad idea to publish them. Bugfix + on 0.1.1.8-alpha. + + o Minor bugfixes (other): + - Resolve an edge case in path weighting that could make us misweight + our relay selection. Fixes bug 1203; bugfix on 0.0.8rc1. + - Fix statistics on client numbers by country as seen by bridges that + were broken in 0.2.2.1-alpha. Also switch to reporting full 24-hour + intervals instead of variable 12-to-48-hour intervals. + - After we free an internal connection structure, overwrite it + with a different memory value than we use for overwriting a freed + internal circuit structure. Should help with debugging. Suggested + by bug 1055. + - Update our OpenSSL 0.9.8l fix so that it works with OpenSSL 0.9.8m + too. + + o Removed features: + - Remove the HSAuthorityRecordStats option that version 0 hidden + service authorities could have used to track statistics of overall + hidden service usage. + + +Changes in version 0.2.1.22 - 2010-01-19 + Tor 0.2.1.22 fixes a critical privacy problem in bridge directory + authorities -- it would tell you its whole history of bridge descriptors + if you make the right directory request. This stable update also + rotates two of the seven v3 directory authority keys and locations. + + o Directory authority changes: + - Rotate keys (both v3 identity and relay identity) for moria1 + and gabelmoo. + + o Major bugfixes: + - Stop bridge directory authorities from answering dbg-stability.txt + directory queries, which would let people fetch a list of all + bridge identities they track. Bugfix on 0.2.1.6-alpha. + + +Changes in version 0.2.1.21 - 2009-12-21 + Tor 0.2.1.21 fixes an incompatibility with the most recent OpenSSL + library. If you use Tor on Linux / Unix and you're getting SSL + renegotiation errors, upgrading should help. We also recommend an + upgrade if you're an exit relay. + + o Major bugfixes: + - Work around a security feature in OpenSSL 0.9.8l that prevents our + handshake from working unless we explicitly tell OpenSSL that we + are using SSL renegotiation safely. We are, of course, but OpenSSL + 0.9.8l won't work unless we say we are. + - Avoid crashing if the client is trying to upload many bytes and the + circuit gets torn down at the same time, or if the flip side + happens on the exit relay. Bugfix on 0.2.0.1-alpha; fixes bug 1150. + + o Minor bugfixes: + - Do not refuse to learn about authority certs and v2 networkstatus + documents that are older than the latest consensus. This bug might + have degraded client bootstrapping. Bugfix on 0.2.0.10-alpha. + Spotted and fixed by xmux. + - Fix a couple of very-hard-to-trigger memory leaks, and one hard-to- + trigger platform-specific option misparsing case found by Coverity + Scan. + - Fix a compilation warning on Fedora 12 by removing an impossible-to- + trigger assert. Fixes bug 1173. + + +Changes in version 0.2.2.6-alpha - 2009-11-19 + Tor 0.2.2.6-alpha lays the groundwork for many upcoming features: + support for the new lower-footprint "microdescriptor" directory design, + future-proofing our consensus format against new hash functions or + other changes, and an Android port. It also makes Tor compatible with + the upcoming OpenSSL 0.9.8l release, and fixes a variety of bugs. + + o Major features: + - Directory authorities can now create, vote on, and serve multiple + parallel formats of directory data as part of their voting process. + Partially implements Proposal 162: "Publish the consensus in + multiple flavors". + - Directory authorities can now agree on and publish small summaries + of router information that clients can use in place of regular + server descriptors. This transition will eventually allow clients + to use far less bandwidth for downloading information about the + network. Begins the implementation of Proposal 158: "Clients + download consensus + microdescriptors". + - The directory voting system is now extensible to use multiple hash + algorithms for signatures and resource selection. Newer formats + are signed with SHA256, with a possibility for moving to a better + hash algorithm in the future. + - New DisableAllSwap option. If set to 1, Tor will attempt to lock all + current and future memory pages via mlockall(). On supported + platforms (modern Linux and probably BSD but not Windows or OS X), + this should effectively disable any and all attempts to page out + memory. This option requires that you start your Tor as root -- + if you use DisableAllSwap, please consider using the User option + to properly reduce the privileges of your Tor. + - Numerous changes, bugfixes, and workarounds from Nathan Freitas + to help Tor build correctly for Android phones. + + o Major bugfixes: + - Work around a security feature in OpenSSL 0.9.8l that prevents our + handshake from working unless we explicitly tell OpenSSL that we + are using SSL renegotiation safely. We are, but OpenSSL 0.9.8l + won't work unless we say we are. + + o Minor bugfixes: + - Fix a crash bug when trying to initialize the evdns module in + Libevent 2. Bugfix on 0.2.1.16-rc. + - Stop logging at severity 'warn' when some other Tor client tries + to establish a circuit with us using weak DH keys. It's a protocol + violation, but that doesn't mean ordinary users need to hear about + it. Fixes the bug part of bug 1114. Bugfix on 0.1.0.13. + - Do not refuse to learn about authority certs and v2 networkstatus + documents that are older than the latest consensus. This bug might + have degraded client bootstrapping. Bugfix on 0.2.0.10-alpha. + Spotted and fixed by xmux. + - Fix numerous small code-flaws found by Coverity Scan Rung 3. + - If all authorities restart at once right before a consensus vote, + nobody will vote about "Running", and clients will get a consensus + with no usable relays. Instead, authorities refuse to build a + consensus if this happens. Bugfix on 0.2.0.10-alpha; fixes bug 1066. + - If your relay can't keep up with the number of incoming create + cells, it would log one warning per failure into your logs. Limit + warnings to 1 per minute. Bugfix on 0.0.2pre10; fixes bug 1042. + - Bridges now use "reject *:*" as their default exit policy. Bugfix + on 0.2.0.3-alpha; fixes bug 1113. + - Fix a memory leak on directory authorities during voting that was + introduced in 0.2.2.1-alpha. Found via valgrind. + + +Changes in version 0.2.1.20 - 2009-10-15 + Tor 0.2.1.20 fixes a crash bug when you're accessing many hidden + services at once, prepares for more performance improvements, and + fixes a bunch of smaller bugs. + + The Windows and OS X bundles also include a more recent Vidalia, + and switch from Privoxy to Polipo. + + The OS X installers are now drag and drop. It's best to un-install + Tor/Vidalia and then install this new bundle, rather than upgrade. If + you want to upgrade, you'll need to update the paths for Tor and Polipo + in the Vidalia Settings window. + + o Major bugfixes: + - Send circuit or stream sendme cells when our window has decreased + by 100 cells, not when it has decreased by 101 cells. Bug uncovered + by Karsten when testing the "reduce circuit window" performance + patch. Bugfix on the 54th commit on Tor -- from July 2002, + before the release of Tor 0.0.0. This is the new winner of the + oldest-bug prize. + - Fix a remotely triggerable memory leak when a consensus document + contains more than one signature from the same voter. Bugfix on + 0.2.0.3-alpha. + - Avoid segfault in rare cases when finishing an introduction circuit + as a client and finding out that we don't have an introduction key + for it. Fixes bug 1073. Reported by Aaron Swartz. + + o Major features: + - Tor now reads the "circwindow" parameter out of the consensus, + and uses that value for its circuit package window rather than the + default of 1000 cells. Begins the implementation of proposal 168. + + o New directory authorities: + - Set up urras (run by Jacob Appelbaum) as the seventh v3 directory + authority. + - Move moria1 and tonga to alternate IP addresses. + + o Minor bugfixes: + - Fix a signed/unsigned compile warning in 0.2.1.19. + - Fix possible segmentation fault on directory authorities. Bugfix on + 0.2.1.14-rc. + - Fix an extremely rare infinite recursion bug that could occur if + we tried to log a message after shutting down the log subsystem. + Found by Matt Edman. Bugfix on 0.2.0.16-alpha. + - Fix an obscure bug where hidden services on 64-bit big-endian + systems might mis-read the timestamp in v3 introduce cells, and + refuse to connect back to the client. Discovered by "rotor". + Bugfix on 0.2.1.6-alpha. + - We were triggering a CLOCK_SKEW controller status event whenever + we connect via the v2 connection protocol to any relay that has + a wrong clock. Instead, we should only inform the controller when + it's a trusted authority that claims our clock is wrong. Bugfix + on 0.2.0.20-rc; starts to fix bug 1074. Reported by SwissTorExit. + - We were telling the controller about CHECKING_REACHABILITY and + REACHABILITY_FAILED status events whenever we launch a testing + circuit or notice that one has failed. Instead, only tell the + controller when we want to inform the user of overall success or + overall failure. Bugfix on 0.1.2.6-alpha. Fixes bug 1075. Reported + by SwissTorExit. + - Don't warn when we're using a circuit that ends with a node + excluded in ExcludeExitNodes, but the circuit is not used to access + the outside world. This should help fix bug 1090. Bugfix on + 0.2.1.6-alpha. + - Work around a small memory leak in some versions of OpenSSL that + stopped the memory used by the hostname TLS extension from being + freed. + + o Minor features: + - Add a "getinfo status/accepted-server-descriptor" controller + command, which is the recommended way for controllers to learn + whether our server descriptor has been successfully received by at + least on directory authority. Un-recommend good-server-descriptor + getinfo and status events until we have a better design for them. + + +Changes in version 0.2.2.5-alpha - 2009-10-11 + Tor 0.2.2.5-alpha fixes a few compile problems in 0.2.2.4-alpha. + + o Major bugfixes: + - Make the tarball compile again. Oops. Bugfix on 0.2.2.4-alpha. + + o New directory authorities: + - Move dizum to an alternate IP address. + + +Changes in version 0.2.2.4-alpha - 2009-10-10 + Tor 0.2.2.4-alpha fixes more crash bugs in 0.2.2.2-alpha. It also + introduces a new unit test framework, shifts directry authority + addresses around to reduce the impact from recent blocking events, + and fixes a few smaller bugs. + + o Major bugfixes: + - Fix several more asserts in the circuit_build_times code, for + example one that causes Tor to fail to start once we have + accumulated 5000 build times in the state file. Bugfixes on + 0.2.2.2-alpha; fixes bug 1108. + + o New directory authorities: + - Move moria1 and Tonga to alternate IP addresses. + + o Minor features: + - Log SSL state transitions at debug level during handshake, and + include SSL states in error messages. This may help debug future + SSL handshake issues. + - Add a new "Handshake" log domain for activities that happen + during the TLS handshake. + - Revert to the "June 3 2009" ip-to-country file. The September one + seems to have removed most US IP addresses. + - Directory authorities now reject Tor relays with versions less than + 0.1.2.14. This step cuts out four relays from the current network, + none of which are very big. + + o Minor bugfixes: + - Fix a couple of smaller issues with gathering statistics. Bugfixes + on 0.2.2.1-alpha. + - Fix two memory leaks in the error case of + circuit_build_times_parse_state(). Bugfix on 0.2.2.2-alpha. + - Don't count one-hop circuits when we're estimating how long it + takes circuits to build on average. Otherwise we'll set our circuit + build timeout lower than we should. Bugfix on 0.2.2.2-alpha. + - Directory authorities no longer change their opinion of, or vote on, + whether a router is Running, unless they have themselves been + online long enough to have some idea. Bugfix on 0.2.0.6-alpha. + Fixes bug 1023. + + o Code simplifications and refactoring: + - Revise our unit tests to use the "tinytest" framework, so we + can run tests in their own processes, have smarter setup/teardown + code, and so on. The unit test code has moved to its own + subdirectory, and has been split into multiple modules. + + +Changes in version 0.2.2.3-alpha - 2009-09-23 + Tor 0.2.2.3-alpha fixes a few crash bugs in 0.2.2.2-alpha. + + o Major bugfixes: + - Fix an overzealous assert in our new circuit build timeout code. + Bugfix on 0.2.2.2-alpha; fixes bug 1103. + + o Minor bugfixes: + - If the networkstatus consensus tells us that we should use a + negative circuit package window, ignore it. Otherwise we'll + believe it and then trigger an assert. Bugfix on 0.2.2.2-alpha. + + +Changes in version 0.2.2.2-alpha - 2009-09-21 + Tor 0.2.2.2-alpha introduces our latest performance improvement for + clients: Tor tracks the average time it takes to build a circuit, and + avoids using circuits that take too long to build. For fast connections, + this feature can cut your expected latency in half. For slow or flaky + connections, it could ruin your Tor experience. Let us know if it does! + + o Major features: + - Tor now tracks how long it takes to build client-side circuits + over time, and adapts its timeout to local network performance. + Since a circuit that takes a long time to build will also provide + bad performance, we get significant latency improvements by + discarding the slowest 20% of circuits. Specifically, Tor creates + circuits more aggressively than usual until it has enough data + points for a good timeout estimate. Implements proposal 151. + We are especially looking for reports (good and bad) from users with + both EDGE and broadband connections that can move from broadband + to EDGE and find out if the build-time data in the .tor/state gets + reset without loss of Tor usability. You should also see a notice + log message telling you that Tor has reset its timeout. + - Directory authorities can now vote on arbitary integer values as + part of the consensus process. This is designed to help set + network-wide parameters. Implements proposal 167. + - Tor now reads the "circwindow" parameter out of the consensus, + and uses that value for its circuit package window rather than the + default of 1000 cells. Begins the implementation of proposal 168. + + o Major bugfixes: + - Fix a remotely triggerable memory leak when a consensus document + contains more than one signature from the same voter. Bugfix on + 0.2.0.3-alpha. + + o Minor bugfixes: + - Fix an extremely rare infinite recursion bug that could occur if + we tried to log a message after shutting down the log subsystem. + Found by Matt Edman. Bugfix on 0.2.0.16-alpha. + - Fix parsing for memory or time units given without a space between + the number and the unit. Bugfix on 0.2.2.1-alpha; fixes bug 1076. + - A networkstatus vote must contain exactly one signature. Spec + conformance issue. Bugfix on 0.2.0.3-alpha. + - Fix an obscure bug where hidden services on 64-bit big-endian + systems might mis-read the timestamp in v3 introduce cells, and + refuse to connect back to the client. Discovered by "rotor". + Bugfix on 0.2.1.6-alpha. + - We were triggering a CLOCK_SKEW controller status event whenever + we connect via the v2 connection protocol to any relay that has + a wrong clock. Instead, we should only inform the controller when + it's a trusted authority that claims our clock is wrong. Bugfix + on 0.2.0.20-rc; starts to fix bug 1074. Reported by SwissTorExit. + - We were telling the controller about CHECKING_REACHABILITY and + REACHABILITY_FAILED status events whenever we launch a testing + circuit or notice that one has failed. Instead, only tell the + controller when we want to inform the user of overall success or + overall failure. Bugfix on 0.1.2.6-alpha. Fixes bug 1075. Reported + by SwissTorExit. + - Don't warn when we're using a circuit that ends with a node + excluded in ExcludeExitNodes, but the circuit is not used to access + the outside world. This should help fix bug 1090, but more problems + remain. Bugfix on 0.2.1.6-alpha. + - Work around a small memory leak in some versions of OpenSSL that + stopped the memory used by the hostname TLS extension from being + freed. + - Make our 'torify' script more portable; if we have only one of + 'torsocks' or 'tsocks' installed, don't complain to the user; + and explain our warning about tsocks better. + + o Minor features: + - Add a "getinfo status/accepted-server-descriptor" controller + command, which is the recommended way for controllers to learn + whether our server descriptor has been successfully received by at + least on directory authority. Un-recommend good-server-descriptor + getinfo and status events until we have a better design for them. + - Update to the "September 4 2009" ip-to-country file. + + +Changes in version 0.2.2.1-alpha - 2009-08-26 + Tor 0.2.2.1-alpha disables ".exit" address notation by default, allows + Tor clients to bootstrap on networks where only port 80 is reachable, + makes it more straightforward to support hardware crypto accelerators, + and starts the groundwork for gathering stats safely at relays. + + o Security fixes: + - Start the process of disabling ".exit" address notation, since it + can be used for a variety of esoteric application-level attacks + on users. To reenable it, set "AllowDotExit 1" in your torrc. Fix + on 0.0.9rc5. + + o New directory authorities: + - Set up urras (run by Jacob Appelbaum) as the seventh v3 directory + authority. + + o Major features: + - New AccelName and AccelDir options add support for dynamic OpenSSL + hardware crypto acceleration engines. + - Tor now supports tunneling all of its outgoing connections over + a SOCKS proxy, using the SOCKS4Proxy and/or SOCKS5Proxy + configuration options. Code by Christopher Davis. + + o Major bugfixes: + - Send circuit or stream sendme cells when our window has decreased + by 100 cells, not when it has decreased by 101 cells. Bug uncovered + by Karsten when testing the "reduce circuit window" performance + patch. Bugfix on the 54th commit on Tor -- from July 2002, + before the release of Tor 0.0.0. This is the new winner of the + oldest-bug prize. + + o New options for gathering stats safely: + - Directories that set "DirReqStatistics 1" write statistics on + directory request to disk every 24 hours. As compared to the + --enable-geoip-stats flag in 0.2.1.x, there are a few improvements: + 1) stats are written to disk exactly every 24 hours; 2) estimated + shares of v2 and v3 requests are determined as mean values, not at + the end of a measurement period; 3) unresolved requests are listed + with country code '??'; 4) directories also measure download times. + - Exit nodes that set "ExitPortStatistics 1" write statistics on the + number of exit streams and transferred bytes per port to disk every + 24 hours. + - Relays that set "CellStatistics 1" write statistics on how long + cells spend in their circuit queues to disk every 24 hours. + - Entry nodes that set "EntryStatistics 1" write statistics on the + rough number and origins of connecting clients to disk every 24 + hours. + - Relays that write any of the above statistics to disk and set + "ExtraInfoStatistics 1" include the past 24 hours of statistics in + their extra-info documents. + + o Minor features: + - New --digests command-line switch to output the digests of the + source files Tor was built with. + - The "torify" script now uses torsocks where available. + - The memarea code now uses a sentinel value at the end of each area + to make sure nothing writes beyond the end of an area. This might + help debug some conceivable causes of bug 930. + - Time and memory units in the configuration file can now be set to + fractional units. For example, "2.5 GB" is now a valid value for + AccountingMax. + - Certain Tor clients (such as those behind check.torproject.org) may + want to fetch the consensus in an extra early manner. To enable this + a user may now set FetchDirInfoExtraEarly to 1. This also depends on + setting FetchDirInfoEarly to 1. Previous behavior will stay the same + as only certain clients who must have this information sooner should + set this option. + - Instead of adding the svn revision to the Tor version string, report + the git commit (when we're building from a git checkout). + + o Minor bugfixes: + - If any the v3 certs we download are unparseable, we should actually + notice the failure so we don't retry indefinitely. Bugfix on + 0.2.0.x; reported by "rotator". + - If the cached cert file is unparseable, warn but don't exit. + - Fix possible segmentation fault on directory authorities. Bugfix on + 0.2.1.14-rc. + - When Tor fails to parse a descriptor of any kind, dump it to disk. + Might help diagnosing bug 1051. + + o Deprecated and removed features: + - The controller no longer accepts the old obsolete "addr-mappings/" + or "unregistered-servers-" GETINFO values. + - Hidden services no longer publish version 0 descriptors, and clients + do not request or use version 0 descriptors. However, the old hidden + service authorities still accept and serve version 0 descriptors + when contacted by older hidden services/clients. + - The EXTENDED_EVENTS and VERBOSE_NAMES controller features are now + always on; using them is necessary for correct forward-compatible + controllers. + - Remove support for .noconnect style addresses. Nobody was using + them, and they provided another avenue for detecting Tor users + via application-level web tricks. + + o Packaging changes: + - Upgrade Vidalia from 0.1.15 to 0.2.3 in the Windows and OS X + installer bundles. See + https://trac.vidalia-project.net/browser/vidalia/tags/vidalia-0.2.3/CHANGELOG + for details of what's new in Vidalia 0.2.3. + - Windows Vidalia Bundle: update Privoxy from 3.0.6 to 3.0.14-beta. + - OS X Vidalia Bundle: move to Polipo 1.0.4 with Tor specific + configuration file, rather than the old Privoxy. + - OS X Vidalia Bundle: Vidalia, Tor, and Polipo are compiled as + x86-only for better compatibility with OS X 10.6, aka Snow Leopard. + - OS X Tor Expert Bundle: Tor is compiled as x86-only for + better compatibility with OS X 10.6, aka Snow Leopard. + - OS X Vidalia Bundle: The multi-package installer is now replaced + by a simple drag and drop to the /Applications folder. This change + occurred with the upgrade to Vidalia 0.2.3. + + +Changes in version 0.2.1.19 - 2009-07-28 + Tor 0.2.1.19 fixes a major bug with accessing and providing hidden + services on Tor 0.2.1.3-alpha through 0.2.1.18. + + o Major bugfixes: + - Make accessing hidden services on 0.2.1.x work right again. + Bugfix on 0.2.1.3-alpha; workaround for bug 1038. Diagnosis and + part of patch provided by "optimist". + + o Minor features: + - When a relay/bridge is writing out its identity key fingerprint to + the "fingerprint" file and to its logs, write it without spaces. Now + it will look like the fingerprints in our bridges documentation, + and confuse fewer users. + + o Minor bugfixes: + - Relays no longer publish a new server descriptor if they change + their MaxAdvertisedBandwidth config option but it doesn't end up + changing their advertised bandwidth numbers. Bugfix on 0.2.0.28-rc; + fixes bug 1026. Patch from Sebastian. + - Avoid leaking memory every time we get a create cell but we have + so many already queued that we refuse it. Bugfix on 0.2.0.19-alpha; + fixes bug 1034. Reported by BarkerJr. + + +Changes in version 0.2.1.18 - 2009-07-24 + Tor 0.2.1.18 lays the foundations for performance improvements, + adds status events to help users diagnose bootstrap problems, adds + optional authentication/authorization for hidden services, fixes a + variety of potential anonymity problems, and includes a huge pile of + other features and bug fixes. + + o Build fixes: + - Add LIBS=-lrt to Makefile.am so the Tor RPMs use a static libevent. + + +Changes in version 0.2.1.17-rc - 2009-07-07 + Tor 0.2.1.17-rc marks the fourth -- and hopefully last -- release + candidate for the 0.2.1.x series. It lays the groundwork for further + client performance improvements, and also fixes a big bug with directory + authorities that were causing them to assign Guard and Stable flags + poorly. + + The Windows bundles also finally include the geoip database that we + thought we'd been shipping since 0.2.0.x (oops), and the OS X bundles + should actually install Torbutton rather than giving you a cryptic + failure message (oops). + + o Major features: + - Clients now use the bandwidth values in the consensus, rather than + the bandwidth values in each relay descriptor. This approach opens + the door to more accurate bandwidth estimates once the directory + authorities start doing active measurements. Implements more of + proposal 141. + + o Major bugfixes: + - When Tor clients restart after 1-5 days, they discard all their + cached descriptors as too old, but they still use the cached + consensus document. This approach is good for robustness, but + bad for performance: since they don't know any bandwidths, they + end up choosing at random rather than weighting their choice by + speed. Fixed by the above feature of putting bandwidths in the + consensus. Bugfix on 0.2.0.x. + - Directory authorities were neglecting to mark relays down in their + internal histories if the relays fall off the routerlist without + ever being found unreachable. So there were relays in the histories + that haven't been seen for eight months, and are listed as being + up for eight months. This wreaked havoc on the "median wfu" + and "median mtbf" calculations, in turn making Guard and Stable + flags very wrong, hurting network performance. Fixes bugs 696 and + 969. Bugfix on 0.2.0.6-alpha. + + o Minor bugfixes: + - Serve the DirPortFrontPage page even when we have been approaching + our quotas recently. Fixes bug 1013; bugfix on 0.2.1.8-alpha. + - The control port would close the connection before flushing long + replies, such as the network consensus, if a QUIT command was issued + before the reply had completed. Now, the control port flushes all + pending replies before closing the connection. Also fixed a spurious + warning when a QUIT command is issued after a malformed or rejected + AUTHENTICATE command, but before the connection was closed. Patch + by Marcus Griep. Bugfix on 0.2.0.x; fixes bugs 1015 and 1016. + - When we can't find an intro key for a v2 hidden service descriptor, + fall back to the v0 hidden service descriptor and log a bug message. + Workaround for bug 1024. + - Fix a log message that did not respect the SafeLogging option. + Resolves bug 1027. + + o Minor features: + - If we're a relay and we change our IP address, be more verbose + about the reason that made us change. Should help track down + further bugs for relays on dynamic IP addresses. + + +Changes in version 0.2.0.35 - 2009-06-24 + o Security fix: + - Avoid crashing in the presence of certain malformed descriptors. + Found by lark, and by automated fuzzing. + - Fix an edge case where a malicious exit relay could convince a + controller that the client's DNS question resolves to an internal IP + address. Bug found and fixed by "optimist"; bugfix on 0.1.2.8-beta. + + o Major bugfixes: + - Finally fix the bug where dynamic-IP relays disappear when their + IP address changes: directory mirrors were mistakenly telling + them their old address if they asked via begin_dir, so they + never got an accurate answer about their new address, so they + just vanished after a day. For belt-and-suspenders, relays that + don't set Address in their config now avoid using begin_dir for + all direct connections. Should fix bugs 827, 883, and 900. + - Fix a timing-dependent, allocator-dependent, DNS-related crash bug + that would occur on some exit nodes when DNS failures and timeouts + occurred in certain patterns. Fix for bug 957. + + o Minor bugfixes: + - When starting with a cache over a few days old, do not leak + memory for the obsolete router descriptors in it. Bugfix on + 0.2.0.33; fixes bug 672. + - Hidden service clients didn't use a cached service descriptor that + was older than 15 minutes, but wouldn't fetch a new one either, + because there was already one in the cache. Now, fetch a v2 + descriptor unless the same descriptor was added to the cache within + the last 15 minutes. Fixes bug 997; reported by Marcus Griep. + + +Changes in version 0.2.1.16-rc - 2009-06-20 + Tor 0.2.1.16-rc speeds up performance for fast exit relays, and fixes + a bunch of minor bugs. + + o Security fixes: + - Fix an edge case where a malicious exit relay could convince a + controller that the client's DNS question resolves to an internal IP + address. Bug found and fixed by "optimist"; bugfix on 0.1.2.8-beta. + + o Major performance improvements (on 0.2.0.x): + - Disable and refactor some debugging checks that forced a linear scan + over the whole server-side DNS cache. These accounted for over 50% + of CPU time on a relatively busy exit node's gprof profile. Found + by Jacob. + - Disable some debugging checks that appeared in exit node profile + data. + + o Minor features: + - Update to the "June 3 2009" ip-to-country file. + - Do not have tor-resolve automatically refuse all .onion addresses; + if AutomapHostsOnResolve is set in your torrc, this will work fine. + + o Minor bugfixes (on 0.2.0.x): + - Log correct error messages for DNS-related network errors on + Windows. + - Fix a race condition that could cause crashes or memory corruption + when running as a server with a controller listening for log + messages. + - Avoid crashing when we have a policy specified in a DirPolicy or + SocksPolicy or ReachableAddresses option with ports set on it, + and we re-load the policy. May fix bug 996. + - Hidden service clients didn't use a cached service descriptor that + was older than 15 minutes, but wouldn't fetch a new one either, + because there was already one in the cache. Now, fetch a v2 + descriptor unless the same descriptor was added to the cache within + the last 15 minutes. Fixes bug 997; reported by Marcus Griep. + + o Minor bugfixes (on 0.2.1.x): + - Don't warn users about low port and hibernation mix when they + provide a *ListenAddress directive to fix that. Bugfix on + 0.2.1.15-rc. + - When switching back and forth between bridge mode, do not start + gathering GeoIP data until two hours have passed. + - Do not complain that the user has requested an excluded node as + an exit when the node is not really an exit. This could happen + because the circuit was for testing, or an introduction point. + Fix for bug 984. + + +Changes in version 0.2.1.15-rc - 2009-05-25 + Tor 0.2.1.15-rc marks the second release candidate for the 0.2.1.x + series. It fixes a major bug on fast exit relays, as well as a variety + of more minor bugs. + + o Major bugfixes (on 0.2.0.x): + - Fix a timing-dependent, allocator-dependent, DNS-related crash bug + that would occur on some exit nodes when DNS failures and timeouts + occurred in certain patterns. Fix for bug 957. + + o Minor bugfixes (on 0.2.0.x): + - Actually return -1 in the error case for read_bandwidth_usage(). + Harmless bug, since we currently don't care about the return value + anywhere. Bugfix on 0.2.0.9-alpha. + - Provide a more useful log message if bug 977 (related to buffer + freelists) ever reappears, and do not crash right away. + - Fix an assertion failure on 64-bit platforms when we allocated + memory right up to the end of a memarea, then realigned the memory + one step beyond the end. Fixes a possible cause of bug 930. + - Protect the count of open sockets with a mutex, so we can't + corrupt it when two threads are closing or opening sockets at once. + Fix for bug 939. Bugfix on 0.2.0.1-alpha. + - Don't allow a bridge to publish its router descriptor to a + non-bridge directory authority. Fixes part of bug 932. + - When we change to or from being a bridge, reset our counts of + client usage by country. Fixes bug 932. + - Fix a bug that made stream bandwidth get misreported to the + controller. + - Stop using malloc_usable_size() to use more area than we had + actually allocated: it was safe, but made valgrind really unhappy. + - Fix a memory leak when v3 directory authorities load their keys + and cert from disk. Bugfix on 0.2.0.1-alpha. + + o Minor bugfixes (on 0.2.1.x): + - Fix use of freed memory when deciding to mark a non-addable + descriptor as never-downloadable. Bugfix on 0.2.1.9-alpha. + + +Changes in version 0.2.1.14-rc - 2009-04-12 + Tor 0.2.1.14-rc marks the first release candidate for the 0.2.1.x + series. It begins fixing some major performance problems, and also + finally addresses the bug that was causing relays on dynamic IP + addresses to fall out of the directory. + + o Major features: + - Clients replace entry guards that were chosen more than a few months + ago. This change should significantly improve client performance, + especially once more people upgrade, since relays that have been + a guard for a long time are currently overloaded. + + o Major bugfixes (on 0.2.0): + - Finally fix the bug where dynamic-IP relays disappear when their + IP address changes: directory mirrors were mistakenly telling + them their old address if they asked via begin_dir, so they + never got an accurate answer about their new address, so they + just vanished after a day. For belt-and-suspenders, relays that + don't set Address in their config now avoid using begin_dir for + all direct connections. Should fix bugs 827, 883, and 900. + - Relays were falling out of the networkstatus consensus for + part of a day if they changed their local config but the + authorities discarded their new descriptor as "not sufficiently + different". Now directory authorities accept a descriptor as changed + if bandwidthrate or bandwidthburst changed. Partial fix for bug 962; + patch by Sebastian. + - Avoid crashing in the presence of certain malformed descriptors. + Found by lark, and by automated fuzzing. + + o Minor features: + - When generating circuit events with verbose nicknames for + controllers, try harder to look up nicknames for routers on a + circuit. (Previously, we would look in the router descriptors we had + for nicknames, but not in the consensus.) Partial fix for bug 941. + - If the bridge config line doesn't specify a port, assume 443. + This makes bridge lines a bit smaller and easier for users to + understand. + - Raise the minimum bandwidth to be a relay from 20000 bytes to 20480 + bytes (aka 20KB/s), to match our documentation. Also update + directory authorities so they always assign the Fast flag to relays + with 20KB/s of capacity. Now people running relays won't suddenly + find themselves not seeing any use, if the network gets faster + on average. + - Update to the "April 3 2009" ip-to-country file. + + o Minor bugfixes: + - Avoid trying to print raw memory to the logs when we decide to + give up on downloading a given relay descriptor. Bugfix on + 0.2.1.9-alpha. + - In tor-resolve, when the Tor client to use is specified by + :, actually use the specified port rather than + defaulting to 9050. Bugfix on 0.2.1.6-alpha. + - Make directory usage recording work again. Bugfix on 0.2.1.6-alpha. + - When starting with a cache over a few days old, do not leak + memory for the obsolete router descriptors in it. Bugfix on + 0.2.0.33. + - Avoid double-free on list of successfully uploaded hidden + service discriptors. Fix for bug 948. Bugfix on 0.2.1.6-alpha. + - Change memarea_strndup() implementation to work even when + duplicating a string at the end of a page. This bug was + harmless for now, but could have meant crashes later. Fix by + lark. Bugfix on 0.2.1.1-alpha. + - Limit uploaded directory documents to be 16M rather than 500K. + The directory authorities were refusing v3 consensus votes from + other authorities, since the votes are now 504K. Fixes bug 959; + bugfix on 0.0.2pre17 (where we raised it from 50K to 500K ;). + - Directory authorities should never send a 503 "busy" response to + requests for votes or keys. Bugfix on 0.2.0.8-alpha; exposed by + bug 959. + + +Changes in version 0.2.1.13-alpha - 2009-03-09 + Tor 0.2.1.13-alpha includes another big pile of minor bugfixes and + cleanups. We're finally getting close to a release candidate. + + o Major bugfixes: + - Correctly update the list of which countries we exclude as + exits, when the GeoIP file is loaded or reloaded. Diagnosed by + lark. Bugfix on 0.2.1.6-alpha. + + o Minor bugfixes (on 0.2.0.x and earlier): + - Automatically detect MacOSX versions earlier than 10.4.0, and + disable kqueue from inside Tor when running with these versions. + We previously did this from the startup script, but that was no + help to people who didn't use the startup script. Resolves bug 863. + - When we had picked an exit node for a connection, but marked it as + "optional", and it turned out we had no onion key for the exit, + stop wanting that exit and try again. This situation may not + be possible now, but will probably become feasible with proposal + 158. Spotted by rovv. Fixes another case of bug 752. + - Clients no longer cache certificates for authorities they do not + recognize. Bugfix on 0.2.0.9-alpha. + - When we can't transmit a DNS request due to a network error, retry + it after a while, and eventually transmit a failing response to + the RESOLVED cell. Bugfix on 0.1.2.5-alpha. + - If the controller claimed responsibility for a stream, but that + stream never finished making its connection, it would live + forever in circuit_wait state. Now we close it after SocksTimeout + seconds. Bugfix on 0.1.2.7-alpha; reported by Mike Perry. + - Drop begin cells to a hidden service if they come from the middle + of a circuit. Patch from lark. + - When we erroneously receive two EXTEND cells for the same circuit + ID on the same connection, drop the second. Patch from lark. + - Fix a crash that occurs on exit nodes when a nameserver request + timed out. Bugfix on 0.1.2.1-alpha; our CLEAR debugging code had + been suppressing the bug since 0.1.2.10-alpha. Partial fix for + bug 929. + - Do not assume that a stack-allocated character array will be + 64-bit aligned on platforms that demand that uint64_t access is + aligned. Possible fix for bug 604. + - Parse dates and IPv4 addresses in a locale- and libc-independent + manner, to avoid platform-dependent behavior on malformed input. + - Build correctly when configured to build outside the main source + path. Patch from Michael Gold. + - We were already rejecting relay begin cells with destination port + of 0. Now also reject extend cells with destination port or address + of 0. Suggested by lark. + + o Minor bugfixes (on 0.2.1.x): + - Don't re-extend introduction circuits if we ran out of RELAY_EARLY + cells. Bugfix on 0.2.1.3-alpha. Fixes more of bug 878. + - If we're an exit node, scrub the IP address to which we are exiting + in the logs. Bugfix on 0.2.1.8-alpha. + + o Minor features: + - On Linux, use the prctl call to re-enable core dumps when the user + is option is set. + - New controller event NEWCONSENSUS that lists the networkstatus + lines for every recommended relay. Now controllers like Torflow + can keep up-to-date on which relays they should be using. + - Update to the "February 26 2009" ip-to-country file. + + Changes in version 0.2.0.34 - 2009-02-08 + Tor 0.2.0.34 features several more security-related fixes. You should + upgrade, especially if you run an exit relay (remote crash) or a + directory authority (remote infinite loop), or you're on an older + (pre-XP) or not-recently-patched Windows (remote exploit). + + This release marks end-of-life for Tor 0.1.2.x. Those Tor versions + have many known flaws, and nobody should be using them. You should + upgrade. If you're using a Linux or BSD and its packages are obsolete, + stop using those packages and upgrade anyway. + o Security fixes: - Fix an infinite-loop bug on handling corrupt votes under certain circumstances. Bugfix on 0.2.0.8-alpha. @@ -16,6 +1685,64 @@ bug 893. Bugfix on 0.0.2pre20. +Changes in version 0.2.1.12-alpha - 2009-02-08 + Tor 0.2.1.12-alpha features several more security-related fixes. You + should upgrade, especially if you run an exit relay (remote crash) or + a directory authority (remote infinite loop), or you're on an older + (pre-XP) or not-recently-patched Windows (remote exploit). It also + includes a big pile of minor bugfixes and cleanups. + + o Security fixes: + - Fix an infinite-loop bug on handling corrupt votes under certain + circumstances. Bugfix on 0.2.0.8-alpha. + - Fix a temporary DoS vulnerability that could be performed by + a directory mirror. Bugfix on 0.2.0.9-alpha; reported by lark. + - Avoid a potential crash on exit nodes when processing malformed + input. Remote DoS opportunity. Bugfix on 0.2.1.7-alpha. + + o Minor bugfixes: + - Let controllers actually ask for the "clients_seen" event for + getting usage summaries on bridge relays. Bugfix on 0.2.1.10-alpha; + reported by Matt Edman. + - Fix a compile warning on OSX Panther. Fixes bug 913; bugfix against + 0.2.1.11-alpha. + - Fix a bug in address parsing that was preventing bridges or hidden + service targets from being at IPv6 addresses. + - Solve a bug that kept hardware crypto acceleration from getting + enabled when accounting was turned on. Fixes bug 907. Bugfix on + 0.0.9pre6. + - Remove a bash-ism from configure.in to build properly on non-Linux + platforms. Bugfix on 0.2.1.1-alpha. + - Fix code so authorities _actually_ send back X-Descriptor-Not-New + headers. Bugfix on 0.2.0.10-alpha. + - Don't consider expiring already-closed client connections. Fixes + bug 893. Bugfix on 0.0.2pre20. + - Fix another interesting corner-case of bug 891 spotted by rovv: + Previously, if two hosts had different amounts of clock drift, and + one of them created a new connection with just the wrong timing, + the other might decide to deprecate the new connection erroneously. + Bugfix on 0.1.1.13-alpha. + - Resolve a very rare crash bug that could occur when the user forced + a nameserver reconfiguration during the middle of a nameserver + probe. Fixes bug 526. Bugfix on 0.1.2.1-alpha. + - Support changing value of ServerDNSRandomizeCase during SIGHUP. + Bugfix on 0.2.1.7-alpha. + - If we're using bridges and our network goes away, be more willing + to forgive our bridges and try again when we get an application + request. Bugfix on 0.2.0.x. + + o Minor features: + - Support platforms where time_t is 64 bits long. (Congratulations, + NetBSD!) Patch from Matthias Drochner. + - Add a 'getinfo status/clients-seen' controller command, in case + controllers want to hear clients_seen events but connect late. + + o Build changes: + - Disable GCC's strict alias optimization by default, to avoid the + likelihood of its introducing subtle bugs whenever our code violates + the letter of C99's alias rules. + + Changes in version 0.2.0.33 - 2009-01-21 Tor 0.2.0.33 fixes a variety of bugs that were making relays less useful to users. It also finally fixes a bug where a relay or client @@ -91,50 +1818,370 @@ - Clip the CircuitBuildTimeout to a minimum of 30 seconds. Warn the user if lower values are given in the configuration. Bugfix on 0.1.1.17-rc. Patch by Sebastian. - - Fix a memory leak when we decline to add a v2 rendezvous descriptor to - the cache because we already had a v0 descriptor with the same ID. - Bugfix on 0.2.0.18-alpha. + - Fix a memory leak when we decline to add a v2 rendezvous descriptor to + the cache because we already had a v0 descriptor with the same ID. + Bugfix on 0.2.0.18-alpha. + - Fix a race condition when freeing keys shared between main thread + and CPU workers that could result in a memory leak. Bugfix on + 0.1.0.1-rc. Fixes bug 889. + - Send a valid END cell back when a client tries to connect to a + nonexistent hidden service port. Bugfix on 0.1.2.15. Fixes bug + 840. Patch from rovv. + - Check which hops rendezvous stream cells are associated with to + prevent possible guess-the-streamid injection attacks from + intermediate hops. Fixes another case of bug 446. Based on patch + from rovv. + - If a broken client asks a non-exit router to connect somewhere, + do not even do the DNS lookup before rejecting the connection. + Fixes another case of bug 619. Patch from rovv. + - When a relay gets a create cell it can't decrypt (e.g. because it's + using the wrong onion key), we were dropping it and letting the + client time out. Now actually answer with a destroy cell. Fixes + bug 904. Bugfix on 0.0.2pre8. + + o Minor bugfixes (hidden services): + - Do not throw away existing introduction points on SIGHUP. Bugfix on + 0.0.6pre1. Patch by Karsten. Fixes bug 874. + + o Minor features: + - Report the case where all signatures in a detached set are rejected + differently than the case where there is an error handling the + detached set. + - When we realize that another process has modified our cached + descriptors, print out a more useful error message rather than + triggering an assertion. Fixes bug 885. Patch from Karsten. + - Implement the 0x20 hack to better resist DNS poisoning: set the + case on outgoing DNS requests randomly, and reject responses that do + not match the case correctly. This logic can be disabled with the + ServerDNSRamdomizeCase setting, if you are using one of the 0.3% + of servers that do not reliably preserve case in replies. See + "Increased DNS Forgery Resistance through 0x20-Bit Encoding" + for more info. + - Check DNS replies for more matching fields to better resist DNS + poisoning. + - Never use OpenSSL compression: it wastes RAM and CPU trying to + compress cells, which are basically all encrypted, compressed, or + both. + + +Changes in version 0.2.1.11-alpha - 2009-01-20 + Tor 0.2.1.11-alpha finishes fixing the "if your Tor is off for a + week it will take a long time to bootstrap again" bug. It also fixes + an important security-related bug reported by Ilja van Sprundel. You + should upgrade. (We'll send out more details about the bug once people + have had some time to upgrade.) + + o Security fixes: + - Fix a heap-corruption bug that may be remotely triggerable on + some platforms. Reported by Ilja van Sprundel. + + o Major bugfixes: + - Discard router descriptors as we load them if they are more than + five days old. Otherwise if Tor is off for a long time and then + starts with cached descriptors, it will try to use the onion + keys in those obsolete descriptors when building circuits. Bugfix + on 0.2.0.x. Fixes bug 887. + + o Minor features: + - Try to make sure that the version of Libevent we're running with + is binary-compatible with the one we built with. May address bug + 897 and others. + - Make setting ServerDNSRandomizeCase to 0 actually work. Bugfix + for bug 905. Bugfix on 0.2.1.7-alpha. + - Add a new --enable-local-appdata configuration switch to change + the default location of the datadir on win32 from APPDATA to + LOCAL_APPDATA. In the future, we should migrate to LOCAL_APPDATA + entirely. Patch from coderman. + + o Minor bugfixes: + - Make outbound DNS packets respect the OutboundBindAddress setting. + Fixes the bug part of bug 798. Bugfix on 0.1.2.2-alpha. + - When our circuit fails at the first hop (e.g. we get a destroy + cell back), avoid using that OR connection anymore, and also + tell all the one-hop directory requests waiting for it that they + should fail. Bugfix on 0.2.1.3-alpha. + - In the torify(1) manpage, mention that tsocks will leak your + DNS requests. + + +Changes in version 0.2.1.10-alpha - 2009-01-06 + Tor 0.2.1.10-alpha fixes two major bugs in bridge relays (one that + would make the bridge relay not so useful if it had DirPort set to 0, + and one that could let an attacker learn a little bit of information + about the bridge's users), and a bug that would cause your Tor relay + to ignore a circuit create request it can't decrypt (rather than reply + with an error). It also fixes a wide variety of other bugs. + + o Major bugfixes: + - If the cached networkstatus consensus is more than five days old, + discard it rather than trying to use it. In theory it could + be useful because it lists alternate directory mirrors, but in + practice it just means we spend many minutes trying directory + mirrors that are long gone from the network. Helps bug 887 a bit; + bugfix on 0.2.0.x. + - Bridge relays that had DirPort set to 0 would stop fetching + descriptors shortly after startup, and then briefly resume + after a new bandwidth test and/or after publishing a new bridge + descriptor. Bridge users that try to bootstrap from them would + get a recent networkstatus but would get descriptors from up to + 18 hours earlier, meaning most of the descriptors were obsolete + already. Reported by Tas; bugfix on 0.2.0.13-alpha. + - Prevent bridge relays from serving their 'extrainfo' document + to anybody who asks, now that extrainfo docs include potentially + sensitive aggregated client geoip summaries. Bugfix on + 0.2.0.13-alpha. + + o Minor features: + - New controller event "clients_seen" to report a geoip-based summary + of which countries we've seen clients from recently. Now controllers + like Vidalia can show bridge operators that they're actually making + a difference. + - Build correctly against versions of OpenSSL 0.9.8 or later built + without support for deprecated functions. + - Update to the "December 19 2008" ip-to-country file. + + o Minor bugfixes (on 0.2.0.x): + - Authorities now vote for the Stable flag for any router whose + weighted MTBF is at least 5 days, regardless of the mean MTBF. + - Do not remove routers as too old if we do not have any consensus + document. Bugfix on 0.2.0.7-alpha. + - Do not accept incomplete ipv4 addresses (like 192.168.0) as valid. + Spec conformance issue. Bugfix on Tor 0.0.2pre27. + - When an exit relay resolves a stream address to a local IP address, + do not just keep retrying that same exit relay over and + over. Instead, just close the stream. Addresses bug 872. Bugfix + on 0.2.0.32. Patch from rovv. + - If a hidden service sends us an END cell, do not consider + retrying the connection; just close it. Patch from rovv. + - When we made bridge authorities stop serving bridge descriptors over + unencrypted links, we also broke DirPort reachability testing for + bridges. So bridges with a non-zero DirPort were printing spurious + warns to their logs. Bugfix on 0.2.0.16-alpha. Fixes bug 709. + - When a relay gets a create cell it can't decrypt (e.g. because it's + using the wrong onion key), we were dropping it and letting the + client time out. Now actually answer with a destroy cell. Fixes + bug 904. Bugfix on 0.0.2pre8. + - Squeeze 2-5% out of client performance (according to oprofile) by + improving the implementation of some policy-manipulation functions. + + o Minor bugfixes (on 0.2.1.x): + - Make get_interface_address() function work properly again; stop + guessing the wrong parts of our address as our address. + - Do not cannibalize a circuit if we're out of RELAY_EARLY cells to + send on that circuit. Otherwise we might violate the proposal-110 + limit. Bugfix on 0.2.1.3-alpha. Partial fix for bug 878. Diagnosis + thanks to Karsten. + - When we're sending non-EXTEND cells to the first hop in a circuit, + for example to use an encrypted directory connection, we don't need + to use RELAY_EARLY cells: the first hop knows what kind of cell + it is, and nobody else can even see the cell type. Conserving + RELAY_EARLY cells makes it easier to cannibalize circuits like + this later. + - Stop logging nameserver addresses in reverse order. + - If we are retrying a directory download slowly over and over, do + not automatically give up after the 254th failure. Bugfix on + 0.2.1.9-alpha. + - Resume reporting accurate "stream end" reasons to the local control + port. They were lost in the changes for Proposal 148. Bugfix on + 0.2.1.9-alpha. + + o Deprecated and removed features: + - The old "tor --version --version" command, which would print out + the subversion "Id" of most of the source files, is now removed. It + turned out to be less useful than we'd expected, and harder to + maintain. + + o Code simplifications and refactoring: + - Change our header file guard macros to be less likely to conflict + with system headers. Adam Langley noticed that we were conflicting + with log.h on Android. + - Tool-assisted documentation cleanup. Nearly every function or + static variable in Tor should have its own documentation now. + + +Changes in version 0.2.1.9-alpha - 2008-12-25 + Tor 0.2.1.9-alpha fixes many more bugs, some of them security-related. + + o New directory authorities: + - gabelmoo (the authority run by Karsten Loesing) now has a new + IP address. + + o Security fixes: + - Never use a connection with a mismatched address to extend a + circuit, unless that connection is canonical. A canonical + connection is one whose address is authenticated by the router's + identity key, either in a NETINFO cell or in a router descriptor. + - Avoid a possible memory corruption bug when receiving hidden service + descriptors. Bugfix on 0.2.1.6-alpha. + + o Major bugfixes: + - Fix a logic error that would automatically reject all but the first + configured DNS server. Bugfix on 0.2.1.5-alpha. Possible fix for + part of bug 813/868. Bug spotted by coderman. + - When a stream at an exit relay is in state "resolving" or + "connecting" and it receives an "end" relay cell, the exit relay + would silently ignore the end cell and not close the stream. If + the client never closes the circuit, then the exit relay never + closes the TCP connection. Bug introduced in 0.1.2.1-alpha; + reported by "wood". + - When we can't initialize DNS because the network is down, do not + automatically stop Tor from starting. Instead, retry failed + dns_init() every 10 minutes, and change the exit policy to reject + *:* until one succeeds. Fixes bug 691. + + o Minor features: + - Give a better error message when an overzealous init script says + "sudo -u username tor --user username". Makes Bug 882 easier for + users to diagnose. + - When a directory authority gives us a new guess for our IP address, + log which authority we used. Hopefully this will help us debug + the recent complaints about bad IP address guesses. + - Detect svn revision properly when we're using git-svn. + - Try not to open more than one descriptor-downloading connection + to an authority at once. This should reduce load on directory + authorities. Fixes bug 366. + - Add cross-certification to newly generated certificates, so that + a signing key is enough information to look up a certificate. + Partial implementation of proposal 157. + - Start serving certificates by + pairs. Partial implementation of proposal 157. + - Clients now never report any stream end reason except 'MISC'. + Implements proposal 148. + - On platforms with a maximum syslog string length, truncate syslog + messages to that length ourselves, rather than relying on the + system to do it for us. + - Optimize out calls to time(NULL) that occur for every IO operation, + or for every cell. On systems where time() is a slow syscall, + this fix will be slightly helpful. + - Exit servers can now answer resolve requests for ip6.arpa addresses. + - When we download a descriptor that we then immediately (as + a directory authority) reject, do not retry downloading it right + away. Should save some bandwidth on authorities. Fix for bug + 888. Patch by Sebastian Hahn. + - When a download gets us zero good descriptors, do not notify + Tor that new directory information has arrived. + - Avoid some nasty corner cases in the logic for marking connections + as too old or obsolete or noncanonical for circuits. Partial + bugfix on bug 891. + + o Minor features (controller): + - New CONSENSUS_ARRIVED event to note when a new consensus has + been fetched and validated. + - When we realize that another process has modified our cached + descriptors file, print out a more useful error message rather + than triggering an assertion. Fixes bug 885. Patch from Karsten. + - Add an internal-use-only __ReloadTorrcOnSIGHUP option for + controllers to prevent SIGHUP from reloading the + configuration. Fixes bug 856. + + o Minor bugfixes: + - Resume using the correct "REASON=" stream when telling the + controller why we closed a stream. Bugfix in 0.2.1.1-alpha. + - When a canonical connection appears later in our internal list + than a noncanonical one for a given OR ID, always use the + canonical one. Bugfix on 0.2.0.12-alpha. Fixes bug 805. + Spotted by rovv. + - Clip the MaxCircuitDirtiness config option to a minimum of 10 + seconds. Warn the user if lower values are given in the + configuration. Bugfix on 0.1.0.1-rc. Patch by Sebastian. + - Clip the CircuitBuildTimeout to a minimum of 30 seconds. Warn the + user if lower values are given in the configuration. Bugfix on + 0.1.1.17-rc. Patch by Sebastian. - Fix a race condition when freeing keys shared between main thread and CPU workers that could result in a memory leak. Bugfix on 0.1.0.1-rc. Fixes bug 889. - - Send a valid END cell back when a client tries to connect to a - nonexistent hidden service port. Bugfix on 0.1.2.15. Fixes bug - 840. Patch from rovv. - - Check which hops rendezvous stream cells are associated with to - prevent possible guess-the-streamid injection attacks from - intermediate hops. Fixes another case of bug 446. Based on patch - from rovv. - - If a broken client asks a non-exit router to connect somewhere, - do not even do the DNS lookup before rejecting the connection. - Fixes another case of bug 619. Patch from rovv. - - When a relay gets a create cell it can't decrypt (e.g. because it's - using the wrong onion key), we were dropping it and letting the - client time out. Now actually answer with a destroy cell. Fixes - bug 904. Bugfix on 0.0.2pre8. o Minor bugfixes (hidden services): - - Do not throw away existing introduction points on SIGHUP. Bugfix on - 0.0.6pre1. Patch by Karsten. Fixes bug 874. + - Do not throw away existing introduction points on SIGHUP (bugfix on + 0.0.6pre1); also, do not stall hidden services because we're + throwing away introduction points; bugfix on 0.2.1.7-alpha. Spotted + by John Brooks. Patch by Karsten. Fixes bug 874. + - Fix a memory leak when we decline to add a v2 rendezvous + descriptor to the cache because we already had a v0 descriptor + with the same ID. Bugfix on 0.2.0.18-alpha. + + o Deprecated and removed features: + - RedirectExits has been removed. It was deprecated since + 0.2.0.3-alpha. + - Finally remove deprecated "EXTENDED_FORMAT" controller feature. It + has been called EXTENDED_EVENTS since 0.1.2.4-alpha. + - Cell pools are now always enabled; --disable-cell-pools is ignored. + + o Code simplifications and refactoring: + - Rename the confusing or_is_obsolete field to the more appropriate + is_bad_for_new_circs, and move it to or_connection_t where it + belongs. + - Move edge-only flags from connection_t to edge_connection_t: not + only is this better coding, but on machines of plausible alignment, + it should save 4-8 bytes per connection_t. "Every little bit helps." + - Rename ServerDNSAllowBrokenResolvConf to ServerDNSAllowBrokenConfig + for consistency; keep old option working for backward compatibility. + - Simplify the code for finding connections to use for a circuit. + + +Changes in version 0.2.1.8-alpha - 2008-12-08 + Tor 0.2.1.8-alpha fixes some crash bugs in earlier alpha releases, + builds better on unusual platforms like Solaris and old OS X, and + fixes a variety of other issues. + + o Major features: + - New DirPortFrontPage option that takes an html file and publishes + it as "/" on the DirPort. Now relay operators can provide a + disclaimer without needing to set up a separate webserver. There's + a sample disclaimer in contrib/tor-exit-notice.html. + + o Security fixes: + - When the client is choosing entry guards, now it selects at most + one guard from a given relay family. Otherwise we could end up with + all of our entry points into the network run by the same operator. + Suggested by Camilo Viecco. Fix on 0.1.1.11-alpha. + + o Major bugfixes: + - Fix a DOS opportunity during the voting signature collection process + at directory authorities. Spotted by rovv. Bugfix on 0.2.0.x. + - Fix a possible segfault when establishing an exit connection. Bugfix + on 0.2.1.5-alpha. + + o Minor bugfixes: + - Get file locking working on win32. Bugfix on 0.2.1.6-alpha. Fixes + bug 859. + - Made Tor a little less aggressive about deleting expired + certificates. Partial fix for bug 854. + - Stop doing unaligned memory access that generated bus errors on + sparc64. Bugfix on 0.2.0.10-alpha. Fix for bug 862. + - Fix a crash bug when changing EntryNodes from the controller. Bugfix + on 0.2.1.6-alpha. Fix for bug 867. Patched by Sebastian. + - Make USR2 log-level switch take effect immediately. Bugfix on + 0.1.2.8-beta. + - If one win32 nameserver fails to get added, continue adding the + rest, and don't automatically fail. + - Use fcntl() for locking when flock() is not available. Should fix + compilation on Solaris. Should fix Bug 873. Bugfix on 0.2.1.6-alpha. + - Do not mark smartlist_bsearch_idx() function as ATTR_PURE. This bug + could make gcc generate non-functional binary search code. Bugfix + on 0.2.0.10-alpha. + - Build correctly on platforms without socklen_t. + - Avoid potential crash on internal error during signature collection. + Fixes bug 864. Patch from rovv. + - Do not use C's stdio library for writing to log files. This will + improve logging performance by a minute amount, and will stop + leaking fds when our disk is full. Fixes bug 861. + - Stop erroneous use of O_APPEND in cases where we did not in fact + want to re-seek to the end of a file before every last write(). + - Correct handling of possible malformed authority signing key + certificates with internal signature types. Fixes bug 880. Bugfix + on 0.2.0.3-alpha. + - Fix a hard-to-trigger resource leak when logging credential status. + CID 349. o Minor features: - - Report the case where all signatures in a detached set are rejected - differently than the case where there is an error handling the - detached set. - - When we realize that another process has modified our cached - descriptors, print out a more useful error message rather than - triggering an assertion. Fixes bug 885. Patch from Karsten. - - Implement the 0x20 hack to better resist DNS poisoning: set the - case on outgoing DNS requests randomly, and reject responses that do - not match the case correctly. This logic can be disabled with the - ServerDNSRamdomizeCase setting, if you are using one of the 0.3% - of servers that do not reliably preserve case in replies. See - "Increased DNS Forgery Resistance through 0x20-Bit Encoding" - for more info. - - Check DNS replies for more matching fields to better resist DNS - poisoning. - - Never use OpenSSL compression: it wastes RAM and CPU trying to - compress cells, which are basically all encrypted, compressed, or - both. + - Directory mirrors no longer fetch the v1 directory or + running-routers files. They are obsolete, and nobody asks for them + anymore. This is the first step to making v1 authorities obsolete. + + o Minor features (controller): + - Return circuit purposes in response to GETINFO circuit-status. Fixes + bug 858. Changes in version 0.2.0.32 - 2008-11-20 @@ -208,6 +2255,218 @@ 0.1.2.5-alpha. Fix by Robert Hogan. Resolves bug 807. +Changes in version 0.2.1.7-alpha - 2008-11-08 + Tor 0.2.1.7-alpha fixes a major security problem in Debian and Ubuntu + packages (and maybe other packages) noticed by Theo de Raadt, fixes + a smaller security flaw that might allow an attacker to access local + services, adds better defense against DNS poisoning attacks on exit + relays, further improves hidden service performance, and fixes a + variety of other issues. + + o Security fixes: + - The "ClientDNSRejectInternalAddresses" config option wasn't being + consistently obeyed: if an exit relay refuses a stream because its + exit policy doesn't allow it, we would remember what IP address + the relay said the destination address resolves to, even if it's + an internal IP address. Bugfix on 0.2.0.7-alpha; patch by rovv. + - The "User" and "Group" config options did not clear the + supplementary group entries for the Tor process. The "User" option + is now more robust, and we now set the groups to the specified + user's primary group. The "Group" option is now ignored. For more + detailed logging on credential switching, set CREDENTIAL_LOG_LEVEL + in common/compat.c to LOG_NOTICE or higher. Patch by Jacob Appelbaum + and Steven Murdoch. Bugfix on 0.0.2pre14. Fixes bug 848. + - Do not use or believe expired v3 authority certificates. Patch + from Karsten. Bugfix in 0.2.0.x. Fixes bug 851. + + o Minor features: + - Now NodeFamily and MyFamily config options allow spaces in + identity fingerprints, so it's easier to paste them in. + Suggested by Lucky Green. + - Implement the 0x20 hack to better resist DNS poisoning: set the + case on outgoing DNS requests randomly, and reject responses that do + not match the case correctly. This logic can be disabled with the + ServerDNSRandomizeCase setting, if you are using one of the 0.3% + of servers that do not reliably preserve case in replies. See + "Increased DNS Forgery Resistance through 0x20-Bit Encoding" + for more info. + - Preserve case in replies to DNSPort requests in order to support + the 0x20 hack for resisting DNS poisoning attacks. + + o Hidden service performance improvements: + - When the client launches an introduction circuit, retry with a + new circuit after 30 seconds rather than 60 seconds. + - Launch a second client-side introduction circuit in parallel + after a delay of 15 seconds (based on work by Christian Wilms). + - Hidden services start out building five intro circuits rather + than three, and when the first three finish they publish a service + descriptor using those. Now we publish our service descriptor much + faster after restart. + + o Minor bugfixes: + - Minor fix in the warning messages when you're having problems + bootstrapping; also, be more forgiving of bootstrap problems when + we're still making incremental progress on a given bootstrap phase. + - When we're choosing an exit node for a circuit, and we have + no pending streams, choose a good general exit rather than one that + supports "all the pending streams". Bugfix on 0.1.1.x. Fix by rovv. + - Send a valid END cell back when a client tries to connect to a + nonexistent hidden service port. Bugfix on 0.1.2.15. Fixes bug + 840. Patch from rovv. + - If a broken client asks a non-exit router to connect somewhere, + do not even do the DNS lookup before rejecting the connection. + Fixes another case of bug 619. Patch from rovv. + - Fix another case of assuming, when a specific exit is requested, + that we know more than the user about what hosts it allows. + Fixes another case of bug 752. Patch from rovv. + - Check which hops rendezvous stream cells are associated with to + prevent possible guess-the-streamid injection attacks from + intermediate hops. Fixes another case of bug 446. Based on patch + from rovv. + - Avoid using a negative right-shift when comparing 32-bit + addresses. Possible fix for bug 845 and bug 811. + - Make the assert_circuit_ok() function work correctly on circuits that + have already been marked for close. + - Fix read-off-the-end-of-string error in unit tests when decoding + introduction points. + - Fix uninitialized size field for memory area allocation: may improve + memory performance during directory parsing. + - Treat duplicate certificate fetches as failures, so that we do + not try to re-fetch an expired certificate over and over and over. + - Do not say we're fetching a certificate when we'll in fact skip it + because of a pending download. + + +Changes in version 0.2.1.6-alpha - 2008-09-30 + Tor 0.2.1.6-alpha further improves performance and robustness of + hidden services, starts work on supporting per-country relay selection, + and fixes a variety of smaller issues. + + o Major features: + - Implement proposal 121: make it possible to build hidden services + that only certain clients are allowed to connect to. This is + enforced at several points, so that unauthorized clients are unable + to send INTRODUCE cells to the service, or even (depending on the + type of authentication) to learn introduction points. This feature + raises the bar for certain kinds of active attacks against hidden + services. Code by Karsten Loesing. + - Relays now store and serve v2 hidden service descriptors by default, + i.e., the new default value for HidServDirectoryV2 is 1. This is + the last step in proposal 114, which aims to make hidden service + lookups more reliable. + - Start work to allow node restrictions to include country codes. The + syntax to exclude nodes in a country with country code XX is + "ExcludeNodes {XX}". Patch from Robert Hogan. It still needs some + refinement to decide what config options should take priority if + you ask to both use a particular node and exclude it. + - Allow ExitNodes list to include IP ranges and country codes, just + like the Exclude*Nodes lists. Patch from Robert Hogan. + + o Major bugfixes: + - Fix a bug when parsing ports in tor_addr_port_parse() that caused + Tor to fail to start if you had it configured to use a bridge + relay. Fixes bug 809. Bugfix on 0.2.1.5-alpha. + - When extending a circuit to a hidden service directory to upload a + rendezvous descriptor using a BEGIN_DIR cell, almost 1/6 of all + requests failed, because the router descriptor had not been + downloaded yet. In these cases, we now wait until the router + descriptor is downloaded, and then retry. Likewise, clients + now skip over a hidden service directory if they don't yet have + its router descriptor, rather than futilely requesting it and + putting mysterious complaints in the logs. Fixes bug 767. Bugfix + on 0.2.0.10-alpha. + - When fetching v0 and v2 rendezvous service descriptors in parallel, + we were failing the whole hidden service request when the v0 + descriptor fetch fails, even if the v2 fetch is still pending and + might succeed. Similarly, if the last v2 fetch fails, we were + failing the whole hidden service request even if a v0 fetch is + still pending. Fixes bug 814. Bugfix on 0.2.0.10-alpha. + - DNS replies need to have names matching their requests, but + these names should be in the questions section, not necessarily + in the answers section. Fixes bug 823. Bugfix on 0.2.1.5-alpha. + + o Minor features: + - Update to the "September 1 2008" ip-to-country file. + - Allow ports 465 and 587 in the default exit policy again. We had + rejected them in 0.1.0.15, because back in 2005 they were commonly + misconfigured and ended up as spam targets. We hear they are better + locked down these days. + - Use a lockfile to make sure that two Tor processes are not + simultaneously running with the same datadir. + - Serve the latest v3 networkstatus consensus via the control + port. Use "getinfo dir/status-vote/current/consensus" to fetch it. + - Better logging about stability/reliability calculations on directory + servers. + - Drop the requirement to have an open dir port for storing and + serving v2 hidden service descriptors. + - Directory authorities now serve a /tor/dbg-stability.txt URL to + help debug WFU and MTBF calculations. + - Implement most of Proposal 152: allow specialized servers to permit + single-hop circuits, and clients to use those servers to build + single-hop circuits when using a specialized controller. Patch + from Josh Albrecht. Resolves feature request 768. + - Add a -p option to tor-resolve for specifying the SOCKS port: some + people find host:port too confusing. + - Make TrackHostExit mappings expire a while after their last use, not + after their creation. Patch from Robert Hogan. + - Provide circuit purposes along with circuit events to the controller. + + o Minor bugfixes: + - Fix compile on OpenBSD 4.4-current. Bugfix on 0.2.1.5-alpha. + Reported by Tas. + - Fixed some memory leaks -- some quite frequent, some almost + impossible to trigger -- based on results from Coverity. + - When testing for libevent functions, set the LDFLAGS variable + correctly. Found by Riastradh. + - Fix an assertion bug in parsing policy-related options; possible fix + for bug 811. + - Catch and report a few more bootstrapping failure cases when Tor + fails to establish a TCP connection. Cleanup on 0.2.1.x. + - Avoid a bug where the FastFirstHopPK 0 option would keep Tor from + bootstrapping with tunneled directory connections. Bugfix on + 0.1.2.5-alpha. Fixes bug 797. Found by Erwin Lam. + - When asked to connect to A.B.exit:80, if we don't know the IP for A + and we know that server B rejects most-but-not all connections to + port 80, we would previously reject the connection. Now, we assume + the user knows what they were asking for. Fixes bug 752. Bugfix + on 0.0.9rc5. Diagnosed by BarkerJr. + - If we are not using BEGIN_DIR cells, don't attempt to contact hidden + service directories if they have no advertised dir port. Bugfix + on 0.2.0.10-alpha. + - If we overrun our per-second write limits a little, count this as + having used up our write allocation for the second, and choke + outgoing directory writes. Previously, we had only counted this when + we had met our limits precisely. Fixes bug 824. Patch by rovv. + Bugfix on 0.2.0.x (??). + - Avoid a "0 divided by 0" calculation when calculating router uptime + at directory authorities. Bugfix on 0.2.0.8-alpha. + - Make DNS resolved controller events into "CLOSED", not + "FAILED". Bugfix on 0.1.2.5-alpha. Fix by Robert Hogan. Resolves + bug 807. + - Fix a bug where an unreachable relay would establish enough + reachability testing circuits to do a bandwidth test -- if + we already have a connection to the middle hop of the testing + circuit, then it could establish the last hop by using the existing + connection. Bugfix on 0.1.2.2-alpha, exposed when we made testing + circuits no longer use entry guards in 0.2.1.3-alpha. + - If we have correct permissions on $datadir, we complain to stdout + and fail to start. But dangerous permissions on + $datadir/cached-status/ would cause us to open a log and complain + there. Now complain to stdout and fail to start in both cases. Fixes + bug 820, reported by seeess. + - Remove the old v2 directory authority 'lefkada' from the default + list. It has been gone for many months. + + o Code simplifications and refactoring: + - Revise the connection_new functions so that a more typesafe variant + exists. This will work better with Coverity, and let us find any + actual mistakes we're making here. + - Refactor unit testing logic so that dmalloc can be used sensibly + with unit tests to check for memory leaks. + - Move all hidden-service related fields from connection and circuit + structure to substructures: this way they won't eat so much memory. + + Changes in version 0.2.0.31 - 2008-09-03 Tor 0.2.0.31 addresses two potential anonymity issues, starts to fix a big bug we're seeing where in rare cases traffic from one Tor stream @@ -237,11 +2496,6 @@ option as an alias for the actually-working --with-openssl-dir option. Fix the help documentation to recommend --with-openssl-dir. Based on a patch by "Dave". Bugfix on 0.2.0.1-alpha. - - Disallow session resumption attempts during the renegotiation - stage of the v2 handshake protocol. Clients should never be trying - session resumption at this point, but apparently some did, in - ways that caused the handshake to fail. Bug found by Geoff Goodell. - Bugfix on 0.2.0.20-rc. - When using the TransPort option on OpenBSD, and using the User option to change UID and drop privileges, make sure to open /dev/pf before dropping privileges. Fixes bug 782. Patch from @@ -255,6 +2509,170 @@ 0.1.2.x. Anonymous patch. +Changes in version 0.2.1.5-alpha - 2008-08-31 + Tor 0.2.1.5-alpha moves us closer to handling IPv6 destinations, puts + in a lot of the infrastructure for adding authorization to hidden + services, lays the groundwork for having clients read their load + balancing information out of the networkstatus consensus rather than + the individual router descriptors, addresses two potential anonymity + issues, and fixes a variety of smaller issues. + + o Major features: + - Convert many internal address representations to optionally hold + IPv6 addresses. + - Generate and accept IPv6 addresses in many protocol elements. + - Make resolver code handle nameservers located at ipv6 addresses. + - Begin implementation of proposal 121 ("Client authorization for + hidden services"): configure hidden services with client + authorization, publish descriptors for them, and configure + authorization data for hidden services at clients. The next + step is to actually access hidden services that perform client + authorization. + - More progress toward proposal 141: Network status consensus + documents and votes now contain bandwidth information for each + router and a summary of that router's exit policy. Eventually this + will be used by clients so that they do not have to download every + known descriptor before building circuits. + + o Major bugfixes (on 0.2.0.x and before): + - When sending CREATED cells back for a given circuit, use a 64-bit + connection ID to find the right connection, rather than an addr:port + combination. Now that we can have multiple OR connections between + the same ORs, it is no longer possible to use addr:port to uniquely + identify a connection. + - Relays now reject risky extend cells: if the extend cell includes + a digest of all zeroes, or asks to extend back to the relay that + sent the extend cell, tear down the circuit. Ideas suggested + by rovv. + - If not enough of our entry guards are available so we add a new + one, we might use the new one even if it overlapped with the + current circuit's exit relay (or its family). Anonymity bugfix + pointed out by rovv. + + o Minor bugfixes: + - Recover 3-7 bytes that were wasted per memory chunk. Fixes bug + 794; bug spotted by rovv. Bugfix on 0.2.0.1-alpha. + - When using the TransPort option on OpenBSD, and using the User + option to change UID and drop privileges, make sure to open /dev/pf + before dropping privileges. Fixes bug 782. Patch from Christopher + Davis. Bugfix on 0.1.2.1-alpha. + - Correctly detect the presence of the linux/netfilter_ipv4.h header + when building against recent kernels. Bugfix on 0.1.2.1-alpha. + - Add a missing safe_str() call for a debug log message. + - Use 64 bits instead of 32 bits for connection identifiers used with + the controller protocol, to greatly reduce risk of identifier reuse. + - Make the autoconf script accept the obsolete --with-ssl-dir + option as an alias for the actually-working --with-openssl-dir + option. Fix the help documentation to recommend --with-openssl-dir. + Based on a patch by "Dave". Bugfix on 0.2.0.1-alpha. + + o Minor features: + - Rate-limit too-many-sockets messages: when they happen, they happen + a lot. Resolves bug 748. + - Resist DNS poisoning a little better by making sure that names in + answer sections match. + - Print the SOCKS5 error message string as well as the error code + when a tor-resolve request fails. Patch from Jacob. + + +Changes in version 0.2.1.4-alpha - 2008-08-04 + Tor 0.2.1.4-alpha fixes a pair of crash bugs in 0.2.1.3-alpha. + + o Major bugfixes: + - The address part of exit policies was not correctly written + to router descriptors. This generated router descriptors that failed + their self-checks. Noticed by phobos, fixed by Karsten. Bugfix + on 0.2.1.3-alpha. + - Tor triggered a false assert when extending a circuit to a relay + but we already have a connection open to that relay. Noticed by + phobos, fixed by Karsten. Bugfix on 0.2.1.3-alpha. + + o Minor bugfixes: + - Fix a hidden service logging bug: in some edge cases, the router + descriptor of a previously picked introduction point becomes + obsolete and we need to give up on it rather than continually + complaining that it has become obsolete. Observed by xiando. Bugfix + on 0.2.1.3-alpha. + + o Removed features: + - Take out the TestVia config option, since it was a workaround for + a bug that was fixed in Tor 0.1.1.21. + + +Changes in version 0.2.1.3-alpha - 2008-08-03 + Tor 0.2.1.3-alpha implements most of the pieces to prevent + infinite-length circuit attacks (see proposal 110); fixes a bug that + might cause exit relays to corrupt streams they send back; allows + address patterns (e.g. 255.128.0.0/16) to appear in ExcludeNodes and + ExcludeExitNodes config options; and fixes a big pile of bugs. + + o Bootstrapping bugfixes (on 0.2.1.x-alpha): + - Send a bootstrap problem "warn" event on the first problem if the + reason is NO_ROUTE (that is, our network is down). + + o Major features: + - Implement most of proposal 110: The first K cells to be sent + along a circuit are marked as special "early" cells; only K "early" + cells will be allowed. Once this code is universal, we can block + certain kinds of DOS attack by requiring that EXTEND commands must + be sent using an "early" cell. + + o Major bugfixes: + - Try to attach connections immediately upon receiving a RENDEZVOUS2 + or RENDEZVOUS_ESTABLISHED cell. This can save a second or two + on the client side when connecting to a hidden service. Bugfix + on 0.0.6pre1. Found and fixed by Christian Wilms; resolves bug 743. + - Ensure that two circuits can never exist on the same connection + with the same circuit ID, even if one is marked for close. This + is conceivably a bugfix for bug 779; fixes a bug on 0.1.0.4-rc. + + o Minor features: + - When relays do their initial bandwidth measurement, don't limit + to just our entry guards for the test circuits. Otherwise we tend + to have multiple test circuits going through a single entry guard, + which makes our bandwidth test less accurate. Fixes part of bug 654; + patch contributed by Josh Albrecht. + - Add an ExcludeExitNodes option so users can list a set of nodes + that should be be excluded from the exit node position, but + allowed elsewhere. Implements proposal 151. + - Allow address patterns (e.g., 255.128.0.0/16) to appear in + ExcludeNodes and ExcludeExitNodes lists. + - Change the implementation of ExcludeNodes and ExcludeExitNodes to + be more efficient. Formerly it was quadratic in the number of + servers; now it should be linear. Fixes bug 509. + - Save 16-22 bytes per open circuit by moving the n_addr, n_port, + and n_conn_id_digest fields into a separate structure that's + only needed when the circuit has not yet attached to an n_conn. + + o Minor bugfixes: + - Change the contrib/tor.logrotate script so it makes the new + logs as "_tor:_tor" rather than the default, which is generally + "root:wheel". Fixes bug 676, reported by Serge Koksharov. + - Stop using __attribute__((nonnull)) with GCC: it can give us useful + warnings (occasionally), but it can also cause the compiler to + eliminate error-checking code. Suggested by Peter Gutmann. + - When a hidden service is giving up on an introduction point candidate + that was not included in the last published rendezvous descriptor, + don't reschedule publication of the next descriptor. Fixes bug 763. + Bugfix on 0.0.9.3. + - Mark RendNodes, RendExcludeNodes, HiddenServiceNodes, and + HiddenServiceExcludeNodes as obsolete: they never worked properly, + and nobody claims to be using them. Fixes bug 754. Bugfix on + 0.1.0.1-rc. Patch from Christian Wilms. + - Fix a small alignment and memory-wasting bug on buffer chunks. + Spotted by rovv. + + o Minor bugfixes (controller): + - When closing an application-side connection because its circuit + is getting torn down, generate the stream event correctly. + Bugfix on 0.1.2.x. Anonymous patch. + + o Removed features: + - Remove all backward-compatibility code to support relays running + versions of Tor so old that they no longer work at all on the + Tor network. + + Changes in version 0.2.0.30 - 2008-07-15 o Minor bugfixes: - Stop using __attribute__((nonnull)) with GCC: it can give us useful @@ -292,9 +2710,9 @@ address. Fixes bug 737; bugfix on 0.2.0.22-rc. Reported by goldy. o Minor bugfixes: - - Fix a macro/CPP interactions that was confusing some compilers: + - Fix a macro/CPP interaction that was confusing some compilers: some GCCs don't like #if/#endif pairs inside macro arguments. - Fix for bug 707. + Fixes bug 707. - Fix macro collision between OpenSSL 0.9.8h and Windows headers. Fixes bug 704; fix from Steven Murdoch. - When opening /dev/null in finish_daemonize(), do not pass the @@ -303,9 +2721,178 @@ - Correctly detect transparent proxy support on Linux hosts that require in.h to be included before netfilter_ipv4.h. Patch from coderman. + - Disallow session resumption attempts during the renegotiation + stage of the v2 handshake protocol. Clients should never be trying + session resumption at this point, but apparently some did, in + ways that caused the handshake to fail. Bugfix on 0.2.0.20-rc. Bug + found by Geoff Goodell. + + +Changes in version 0.2.1.2-alpha - 2008-06-20 + Tor 0.2.1.2-alpha includes a new "TestingTorNetwork" config option to + make it easier to set up your own private Tor network; fixes several + big bugs with using more than one bridge relay; fixes a big bug with + offering hidden services quickly after Tor starts; and uses a better + API for reporting potential bootstrapping problems to the controller. + + o Major features: + - New TestingTorNetwork config option to allow adjustment of + previously constant values that, while reasonable, could slow + bootstrapping. Implements proposal 135. Patch from Karsten. + + o Major bugfixes: + - If you have more than one bridge but don't know their digests, + you would only learn a request for the descriptor of the first one + on your list. (Tor considered launching requests for the others, but + found that it already had a connection on the way for $0000...0000 + so it didn't open another.) Bugfix on 0.2.0.x. + - If you have more than one bridge but don't know their digests, + and the connection to one of the bridges failed, you would cancel + all pending bridge connections. (After all, they all have the + same digest.) Bugfix on 0.2.0.x. + - When establishing a hidden service, introduction points that + originate from cannibalized circuits are completely ignored and not + included in rendezvous service descriptors. This might be another + reason for delay in making a hidden service available. Bugfix + from long ago (0.0.9.x?) + + o Minor features: + - Allow OpenSSL to use dynamic locks if it wants. + - When building a consensus, do not include routers that are down. + This will cut down 30% to 40% on consensus size. Implements + proposal 138. + - In directory authorities' approved-routers files, allow + fingerprints with or without space. + - Add a "GETINFO /status/bootstrap-phase" controller option, so the + controller can query our current bootstrap state in case it attaches + partway through and wants to catch up. + - Send an initial "Starting" bootstrap status event, so we have a + state to start out in. + + o Minor bugfixes: + - Asking for a conditional consensus at .../consensus/ + would crash a dirserver if it did not already have a + consensus. Bugfix on 0.2.1.1-alpha. + - Clean up some macro/CPP interactions: some GCC versions don't like + #if/#endif pairs inside macro arguments. Fixes bug 707. Bugfix on + 0.2.0.x. + + o Bootstrapping bugfixes (on 0.2.1.1-alpha): + - Directory authorities shouldn't complain about bootstrapping + problems just because they do a lot of reachability testing and + some of the connection attempts fail. + - Start sending "count" and "recommendation" key/value pairs in + bootstrap problem status events, so the controller can hear about + problems even before Tor decides they're worth reporting for sure. + - If you're using bridges, generate "bootstrap problem" warnings + as soon as you run out of working bridges, rather than waiting + for ten failures -- which will never happen if you have less than + ten bridges. + - If we close our OR connection because there's been a circuit + pending on it for too long, we were telling our bootstrap status + events "REASON=NONE". Now tell them "REASON=TIMEOUT". + + +Changes in version 0.2.1.1-alpha - 2008-06-13 + Tor 0.2.1.1-alpha fixes a lot of memory fragmentation problems that + were making the Tor process bloat especially on Linux; makes our TLS + handshake blend in better; sends "bootstrap phase" status events to + the controller, so it can keep the user informed of progress (and + problems) fetching directory information and establishing circuits; + and adds a variety of smaller features. + + o Major features: + - More work on making our TLS handshake blend in: modify the list + of ciphers advertised by OpenSSL in client mode to even more + closely resemble a common web browser. We cheat a little so that + we can advertise ciphers that the locally installed OpenSSL doesn't + know about. + - Start sending "bootstrap phase" status events to the controller, + so it can keep the user informed of progress fetching directory + information and establishing circuits. Also inform the controller + if we think we're stuck at a particular bootstrap phase. Implements + proposal 137. + - Resume using OpenSSL's RAND_poll() for better (and more portable) + cross-platform entropy collection again. We used to use it, then + stopped using it because of a bug that could crash systems that + called RAND_poll when they had a lot of fds open. It looks like the + bug got fixed in late 2006. Our new behavior is to call RAND_poll() + at startup, and to call RAND_poll() when we reseed later only if + we have a non-buggy OpenSSL version. + + o Major bugfixes: + - When we choose to abandon a new entry guard because we think our + older ones might be better, close any circuits pending on that + new entry guard connection. This fix should make us recover much + faster when our network is down and then comes back. Bugfix on + 0.1.2.8-beta; found by lodger. + + o Memory fixes and improvements: + - Add a malloc_good_size implementation to OpenBSD_malloc_linux.c, + to avoid unused RAM in buffer chunks and memory pools. + - Speed up parsing and cut down on memory fragmentation by using + stack-style allocations for parsing directory objects. Previously, + this accounted for over 40% of allocations from within Tor's code + on a typical directory cache. + - Use a Bloom filter rather than a digest-based set to track which + descriptors we need to keep around when we're cleaning out old + router descriptors. This speeds up the computation significantly, + and may reduce fragmentation. + - Reduce the default smartlist size from 32 to 16; it turns out that + most smartlists hold around 8-12 elements tops. + - Make dumpstats() log the fullness and size of openssl-internal + buffers. + - If the user has applied the experimental SSL_MODE_RELEASE_BUFFERS + patch to their OpenSSL, turn it on to save memory on servers. This + patch will (with any luck) get included in a mainline distribution + before too long. + - Never use OpenSSL compression: it wastes RAM and CPU trying to + compress cells, which are basically all encrypted, compressed, + or both. + + o Minor bugfixes: + - Stop reloading the router list from disk for no reason when we + run out of reachable directory mirrors. Once upon a time reloading + it would set the 'is_running' flag back to 1 for them. It hasn't + done that for a long time. + - In very rare situations new hidden service descriptors were + published earlier than 30 seconds after the last change to the + service. (We currently think that a hidden service descriptor + that's been stable for 30 seconds is worth publishing.) + + o Minor features: + - Allow separate log levels to be configured for different logging + domains. For example, this allows one to log all notices, warnings, + or errors, plus all memory management messages of level debug or + higher, with: Log [MM] debug-err [*] notice-err file /var/log/tor. + - Add a couple of extra warnings to --enable-gcc-warnings for GCC 4.3, + and stop using a warning that had become unfixably verbose under + GCC 4.3. + - New --hush command-line option similar to --quiet. While --quiet + disables all logging to the console on startup, --hush limits the + output to messages of warning and error severity. + - Servers support a new URL scheme for consensus downloads that + allows the client to specify which authorities are trusted. + The server then only sends the consensus if the client will trust + it. Otherwise a 404 error is sent back. Clients use this + new scheme when the server supports it (meaning it's running + 0.2.1.1-alpha or later). Implements proposal 134. + - New configure/torrc options (--enable-geoip-stats, + DirRecordUsageByCountry) to record how many IPs we've served + directory info to in each country code, how many status documents + total we've sent to each country code, and what share of the total + directory requests we should expect to see. + - Use the TLS1 hostname extension to more closely resemble browser + behavior. + - Lots of new unit tests. + - Add a macro to implement the common pattern of iterating through + two parallel lists in lockstep. Changes in version 0.2.0.28-rc - 2008-06-13 + Tor 0.2.0.28-rc fixes an anonymity-related bug, fixes a hidden-service + performance bug, and fixes a bunch of smaller bugs. + o Anonymity fixes: - Fix a bug where, when we were choosing the 'end stream reason' to put in our relay end cell that we send to the exit relay, Tor @@ -330,15 +2917,18 @@ - When we're checking if we have enough dir info for each relay to begin establishing circuits, make sure that we actually have the descriptor listed in the consensus, not just any descriptor. + Bugfix on 0.1.2.x. - Bridge relays no longer print "xx=0" in their extrainfo document - for every single country code in the geoip db. + for every single country code in the geoip db. Bugfix on + 0.2.0.27-rc. - Only warn when we fail to load the geoip file if we were planning to - include geoip stats in our extrainfo document. + include geoip stats in our extrainfo document. Bugfix on 0.2.0.27-rc. - If we change our MaxAdvertisedBandwidth and then reload torrc, Tor won't realize it should publish a new relay descriptor. Fixes - bug 688, reported by mfr. + bug 688, reported by mfr. Bugfix on 0.1.2.x. - When we haven't had any application requests lately, don't bother - logging that we have expired a bunch of descriptors. + logging that we have expired a bunch of descriptors. Bugfix + on 0.1.2.x. - Make relay cells written on a connection count as non-padding when tracking how long a connection has been in use. Bugfix on 0.2.0.1-alpha. Spotted by lodger. @@ -347,6 +2937,13 @@ Changes in version 0.2.0.27-rc - 2008-06-03 + Tor 0.2.0.27-rc adds a few features we left out of the earlier + release candidates. In particular, we now include an IP-to-country + GeoIP database, so controllers can easily look up what country a + given relay is in, and so bridge relays can give us some sanitized + summaries about which countries are making use of bridges. (See proposal + 126-geoip-fetching.txt for details.) + o Major features: - Include an IP-to-country GeoIP file in the tarball, so bridge relays can report sanitized summaries of the usage they're seeing. @@ -562,9 +3159,9 @@ Bugfix on 0.2.0.16-alpha. Reported by lodger. o Minor bugfixes: - - Fix compilation with OpenSSL 0.9.8 and 0.9.8a. All other supported - OpenSSL versions should have been working fine. Diagnosis and patch - from lodger, Karsten Loesing and Sebastian Hahn. Fixes bug 616. + - Fix compilation with OpenSSL 0.9.8 and 0.9.8a. All other supported + OpenSSL versions should have been working fine. Diagnosis and patch + from lodger, Karsten Loesing, and Sebastian Hahn. Fixes bug 616. Bugfix on 0.2.0.20-rc. @@ -1389,7 +3986,7 @@ - Stop leaking memory every time we parse a v3 certificate. Bugfix on 0.2.0.1-alpha. - Stop leaking memory every time we load a v3 certificate. Bugfix - on 0.2.0.1-alpha. Fixes Bug 536. + on 0.2.0.1-alpha. Fixes bug 536. - Stop leaking a cached networkstatus on exit. Bugfix on 0.2.0.3-alpha. - Stop leaking voter information every time we free a consensus. @@ -1459,7 +4056,7 @@ - Fix a user-triggerable segfault in expand_filename(). (There isn't a way to trigger this remotely.) - When sending a status event to the controller telling it that an - OR address is readable, set the port correctly. (Previously we + OR address is reachable, set the port correctly. (Previously we were reporting the dir port.) - Fix a minor memory leak whenever a controller sends the PROTOCOLINFO command. Bugfix on 0.1.2.17. @@ -1498,7 +4095,7 @@ "Unnamed". Now we can list servers that happen to pick the same nickname as a server that registered two years ago and then disappeared. Partially implements proposal 122. - - If the consensus list a router as "Unnamed", the name is assigned + - If the consensus lists a router as "Unnamed", the name is assigned to a different router: do not identify the router by that name. Partially implements proposal 122. - Authorities can now come to a consensus on which method to use to @@ -2144,7 +4741,7 @@ the bugs that this was supposed to detect a long time ago, and now its only effect is to change our buffer sizes from nice powers of two (which platform mallocs tend to like) to values - siightly over powers of two (which make some platform mallocs sad). + slightly over powers of two (which make some platform mallocs sad). - Log malloc statistics from mallinfo() on platforms where it exists. @@ -6793,6 +9390,7 @@ - Usage info on -h or --help - If you set User and Group config vars, it'll setu/gid to them. + Changes in version 0.0.2pre13 - 2003-10-19 o General stability: - SSL_write no longer fails when it returns WANTWRITE and the number diff -Nru tor-0.2.0.34/configure tor-0.2.2.16-alpha/configure --- tor-0.2.0.34/configure 2009-02-09 03:31:04.000000000 +0000 +++ tor-0.2.2.16-alpha/configure 2010-09-17 06:08:42.000000000 +0000 @@ -699,6 +699,13 @@ am__fastdepCC_FALSE CPP RANLIB +SED +ASCIIDOC +A2X +USE_ASCIIDOC_TRUE +USE_ASCIIDOC_FALSE +SHA1SUM +OPENSSL TORUSER TORGROUP BUILD_NT_SERVICES_TRUE @@ -709,10 +716,15 @@ TOR_LIB_GDI TOR_CPPFLAGS_libevent TOR_LDFLAGS_libevent +USE_EXTERNAL_EVDNS_TRUE +USE_EXTERNAL_EVDNS_FALSE +TOR_LIBEVENT_LIBS TOR_CPPFLAGS_openssl TOR_LDFLAGS_openssl +TOR_OPENSSL_LIBS TOR_CPPFLAGS_zlib TOR_LDFLAGS_zlib +TOR_ZLIB_LIBS LOGFACILITY CONFDIR BINDIR @@ -1306,14 +1318,28 @@ Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-debug compile with debugging info - --enable-iphone compile with iPhone support - --disable-cell-pool disable pool allocator for cells --disable-buf-freelists disable freelists for buffer RAM --enable-openbsd-malloc Use malloc code from openbsd. Linux only + --enable-instrument-downloads + Instrument downloads of directory resources etc. + --enable-static-openssl Link against a static openssl library. Requires + --with-openssl-dir + --enable-static-libevent + Link against a static libevent library. Requires + --with-libevent-dir + --enable-static-zlib Link against a static zlib library. Requires + --with-zlib-dir --disable-transparent disable transparent proxy support + --disable-asciidoc don't use asciidoc (disables building of manpages) --disable-threads disable multi-threading support --enable-gcc-warnings enable verbose warnings + --enable-gcc-warnings-advisory + enable verbose warnings, excluding -Werror + --enable-gcc-hardening enable compiler security checks + --enable-linker-hardening + enable linker security fixups + --enable-local-appdata default to host local application data paths on + Windows --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-largefile omit support for large files @@ -2100,7 +2126,7 @@ # Define the identity of the package. PACKAGE=tor - VERSION=0.2.0.34 + VERSION=0.2.2.16-alpha cat >>confdefs.h <<_ACEOF @@ -2341,33 +2367,9 @@ # Not a no-op; we want to make sure that CPPFLAGS is set before we use # the += operator on it in src/or/Makefile.am -CPPFLAGS="$CPPFLAGS -I../common" - -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then - enableval=$enable_debug; if test x$enableval = xyes; then - CFLAGS="$CFLAGS -g" -fi -fi - - -#XXXX ideally, we should make this into a no-op, and detect whether we're -#compiling for the iphone by using $target. -# Check whether --enable-iphone was given. -if test "${enable_iphone+set}" = set; then - enableval=$enable_iphone; if test x$enableval = xyes ; then - tor_cv_iphone=true - CFLAGS="$CFLAGS -D__DARWIN_UNIX03 -DIPHONE" - fi -fi - +CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common" #XXXX020 We should make these enabled or not, before 0.2.0.x-final -# Check whether --enable-cell-pool was given. -if test "${enable_cell_pool+set}" = set; then - enableval=$enable_cell_pool; -fi - # Check whether --enable-buf-freelists was given. if test "${enable_buf_freelists+set}" = set; then enableval=$enable_buf_freelists; @@ -2378,15 +2380,27 @@ enableval=$enable_openbsd_malloc; fi +# Check whether --enable-instrument-downloads was given. +if test "${enable_instrument_downloads+set}" = set; then + enableval=$enable_instrument_downloads; +fi +# Check whether --enable-static-openssl was given. +if test "${enable_static_openssl+set}" = set; then + enableval=$enable_static_openssl; +fi -if test x$enable_cell_pool != xno; then - -cat >>confdefs.h <<\_ACEOF -#define ENABLE_CELL_POOL 1 -_ACEOF +# Check whether --enable-static-libevent was given. +if test "${enable_static_libevent+set}" = set; then + enableval=$enable_static_libevent; +fi +# Check whether --enable-static-zlib was given. +if test "${enable_static_zlib+set}" = set; then + enableval=$enable_static_zlib; fi + + if test x$enable_buf_freelists != xno; then cat >>confdefs.h <<\_ACEOF @@ -2402,6 +2416,13 @@ USE_OPENBSD_MALLOC_FALSE= fi +if test x$enable_instrument_downloads = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define INSTRUMENT_DOWNLOADS 1 +_ACEOF + +fi # Check whether --enable-transparent was given. if test "${enable_transparent+set}" = set; then @@ -2417,6 +2438,21 @@ fi +# Check whether --enable-asciidoc was given. +if test "${enable_asciidoc+set}" = set; then + enableval=$enable_asciidoc; case "${enableval}" in + yes) asciidoc=true ;; + no) asciidoc=false ;; + *) { { echo "$as_me:$LINENO: error: bad value for --disable-asciidoc" >&5 +echo "$as_me: error: bad value for --disable-asciidoc" >&2;} + { (exit 1); exit 1; }; } ;; + esac +else + asciidoc=true +fi + + + # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then enableval=$enable_threads; @@ -2460,6 +2496,43 @@ enableval=$enable_gcc_warnings; fi +# Check whether --enable-gcc-warnings-advisory was given. +if test "${enable_gcc_warnings_advisory+set}" = set; then + enableval=$enable_gcc_warnings_advisory; +fi + + +# Check whether --enable-gcc-hardening was given. +if test "${enable_gcc_hardening+set}" = set; then + enableval=$enable_gcc_hardening; if test x$enableval = xyes; then + CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2 -fstack-protector-all" + CFLAGS="$CFLAGS -fwrapv -fPIE -Wstack-protector -Wformat -Wformat-security" + CFLAGS="$CFLAGS -Wpointer-sign" + LDFLAGS="$LDFLAGS -pie" +fi +fi + + +# Check whether --enable-linker-hardening was given. +if test "${enable_linker_hardening+set}" = set; then + enableval=$enable_linker_hardening; if test x$enableval = xyes; then + LDFLAGS="$LDFLAGS -z relro -z now" +fi +fi + + +# Check whether --enable-local-appdata was given. +if test "${enable_local_appdata+set}" = set; then + enableval=$enable_local_appdata; +fi + +if test "$enable_local_appdata" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define ENABLE_LOCAL_APPDATA 1 +_ACEOF + +fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -3907,6 +3980,220 @@ fi +# Extract the first word of "sed", so it can be a program name with args. +set dummy sed; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_SED+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$SED"; then + ac_cv_prog_SED="$SED" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_SED="sed" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_SED" && ac_cv_prog_SED="/bin/false" +fi +fi +SED=$ac_cv_prog_SED +if test -n "$SED"; then + { echo "$as_me:$LINENO: result: $SED" >&5 +echo "${ECHO_T}$SED" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + +# Extract the first word of "asciidoc", so it can be a program name with args. +set dummy asciidoc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_path_ASCIIDOC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $ASCIIDOC in + [\\/]* | ?:[\\/]*) + ac_cv_path_ASCIIDOC="$ASCIIDOC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ASCIIDOC="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_path_ASCIIDOC" && ac_cv_path_ASCIIDOC="none" + ;; +esac +fi +ASCIIDOC=$ac_cv_path_ASCIIDOC +if test -n "$ASCIIDOC"; then + { echo "$as_me:$LINENO: result: $ASCIIDOC" >&5 +echo "${ECHO_T}$ASCIIDOC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +# Extract the first word of "a2x", so it can be a program name with args. +set dummy a2x; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_path_A2X+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $A2X in + [\\/]* | ?:[\\/]*) + ac_cv_path_A2X="$A2X" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_A2X="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_path_A2X" && ac_cv_path_A2X="none" + ;; +esac +fi +A2X=$ac_cv_path_A2X +if test -n "$A2X"; then + { echo "$as_me:$LINENO: result: $A2X" >&5 +echo "${ECHO_T}$A2X" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + + if test x$asciidoc = xtrue; then + USE_ASCIIDOC_TRUE= + USE_ASCIIDOC_FALSE='#' +else + USE_ASCIIDOC_TRUE='#' + USE_ASCIIDOC_FALSE= +fi + + +# Extract the first word of "sha1sum", so it can be a program name with args. +set dummy sha1sum; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_path_SHA1SUM+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $SHA1SUM in + [\\/]* | ?:[\\/]*) + ac_cv_path_SHA1SUM="$SHA1SUM" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_SHA1SUM="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_path_SHA1SUM" && ac_cv_path_SHA1SUM="none" + ;; +esac +fi +SHA1SUM=$ac_cv_path_SHA1SUM +if test -n "$SHA1SUM"; then + { echo "$as_me:$LINENO: result: $SHA1SUM" >&5 +echo "${ECHO_T}$SHA1SUM" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +# Extract the first word of "openssl", so it can be a program name with args. +set dummy openssl; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_path_OPENSSL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $OPENSSL in + [\\/]* | ?:[\\/]*) + ac_cv_path_OPENSSL="$OPENSSL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_OPENSSL="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_path_OPENSSL" && ac_cv_path_OPENSSL="none" + ;; +esac +fi +OPENSSL=$ac_cv_path_OPENSSL +if test -n "$OPENSSL"; then + { echo "$as_me:$LINENO: result: $OPENSSL" >&5 +echo "${ECHO_T}$OPENSSL" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + TORUSER=_tor # Check whether --with-tor-user was given. @@ -5268,7 +5555,9 @@ -for ac_func in gettimeofday ftime socketpair uname inet_aton strptime getrlimit strlcat strlcpy strtoull ftello getaddrinfo localtime_r gmtime_r memmem strtok_r inet_pton inet_ntop + + +for ac_func in gettimeofday ftime socketpair uname inet_aton strptime getrlimit strlcat strlcpy strtoull getaddrinfo localtime_r gmtime_r memmem strtok_r writev readv flock prctl vasprintf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 @@ -5364,6 +5653,11 @@ using_custom_malloc=no if test x$enable_openbsd_malloc = xyes ; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MALLOC_GOOD_SIZE 1 +_ACEOF + using_custom_malloc=yes fi if test x$tcmalloc = xyes ; then @@ -6403,8 +6697,10 @@ else if test -d "$tor_cv_library_libevent_dir/lib"; then TOR_LDFLAGS_libevent="-L$tor_cv_library_libevent_dir/lib" + TOR_LIBDIR_libevent="$tor_cv_library_libevent_dir/lib" else TOR_LDFLAGS_libevent="-L$tor_cv_library_libevent_dir" + TOR_LIBDIR_libevent="$tor_cv_library_libevent_dir" fi if test -d "$tor_cv_library_libevent_dir/include"; then TOR_CPPFLAGS_libevent="-I$tor_cv_library_libevent_dir/include" @@ -6538,7 +6834,10 @@ -for ac_func in event_get_version event_get_method event_set_log_callback + + + +for ac_func in event_get_version event_get_version_number event_get_method event_set_log_callback evdns_set_outgoing_bind_address event_base_loopexit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 @@ -6631,60 +6930,333 @@ fi done -LIBS="$save_LIBS" -LDFLAGS="$save_LDFLAGS" -CPPFLAGS="$save_CPPFLAGS" - - -tor_openssl_pkg_redhat="openssl" -tor_openssl_pkg_debian="libssl" -tor_openssl_devpkg_redhat="openssl-devel" -tor_openssl_devpkg_debian="libssl-dev" - -ALT_openssl_WITHVAL="" - -# Check whether --with-ssl-dir was given. -if test "${with_ssl_dir+set}" = set; then - withval=$with_ssl_dir; - if test "x$withval" != xno && test "x$withval" != "x" ; then - ALT_openssl_WITHVAL="$withval" - fi - -fi - - - -tryopenssldir="" - -# Check whether --with-openssl-dir was given. -if test "${with_openssl_dir+set}" = set; then - withval=$with_openssl_dir; - if test x$withval != xno ; then - tryopenssldir="$withval" - fi - -fi - -if test "x$tryopenssldir" = x && test "x$ALT_openssl_WITHVAL" != x ; then - tryopenssldir="$ALT_openssl_WITHVAL" -fi - -tor_saved_LIBS="$LIBS" -tor_saved_LDFLAGS="$LDFLAGS" -tor_saved_CPPFLAGS="$CPPFLAGS" -{ echo "$as_me:$LINENO: checking for openssl directory" >&5 -echo $ECHO_N "checking for openssl directory... $ECHO_C" >&6; } -if test "${tor_cv_library_openssl_dir+set}" = set; then +{ echo "$as_me:$LINENO: checking for struct event.min_heap_idx" >&5 +echo $ECHO_N "checking for struct event.min_heap_idx... $ECHO_C" >&6; } +if test "${ac_cv_member_struct_event_min_heap_idx+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include - tor_openssl_dir_found=no - tor_openssl_any_linkable=no - for tor_trydir in "$tryopenssldir" "(system)" "$prefix" /usr/local /usr/pkg /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl; do - LDFLAGS="$tor_saved_LDFLAGS" - LIBS="$tor_saved_LIBS -lssl -lcrypto $TOR_LIB_GDI" - CPPFLAGS="$tor_saved_CPPFLAGS" +int +main () +{ +static struct event ac_aggr; +if (ac_aggr.min_heap_idx) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member_struct_event_min_heap_idx=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + + +int +main () +{ +static struct event ac_aggr; +if (sizeof ac_aggr.min_heap_idx) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member_struct_event_min_heap_idx=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_member_struct_event_min_heap_idx=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_event_min_heap_idx" >&5 +echo "${ECHO_T}$ac_cv_member_struct_event_min_heap_idx" >&6; } +if test $ac_cv_member_struct_event_min_heap_idx = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_EVENT_MIN_HEAP_IDX 1 +_ACEOF + + +fi + + + + +for ac_header in event2/event.h event2/dns.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +LIBS="$save_LIBS" +LDFLAGS="$save_LDFLAGS" +CPPFLAGS="$save_CPPFLAGS" + + + if test x$ac_cv_header_event2_dns_h = xyes; then + USE_EXTERNAL_EVDNS_TRUE= + USE_EXTERNAL_EVDNS_FALSE='#' +else + USE_EXTERNAL_EVDNS_TRUE='#' + USE_EXTERNAL_EVDNS_FALSE= +fi + + +if test "$enable_static_libevent" = "yes"; then + if test "$tor_cv_library_libevent_dir" = "(system)"; then + { { echo "$as_me:$LINENO: error: \"You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent\"" >&5 +echo "$as_me: error: \"You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent\"" >&2;} + { (exit 1); exit 1; }; } + else + TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a" + fi +else + TOR_LIBEVENT_LIBS="-levent" +fi + + + + +tor_openssl_pkg_redhat="openssl" +tor_openssl_pkg_debian="libssl" +tor_openssl_devpkg_redhat="openssl-devel" +tor_openssl_devpkg_debian="libssl-dev" + +ALT_openssl_WITHVAL="" + +# Check whether --with-ssl-dir was given. +if test "${with_ssl_dir+set}" = set; then + withval=$with_ssl_dir; + if test "x$withval" != xno && test "x$withval" != "x" ; then + ALT_openssl_WITHVAL="$withval" + fi + +fi + + + +tryopenssldir="" + +# Check whether --with-openssl-dir was given. +if test "${with_openssl_dir+set}" = set; then + withval=$with_openssl_dir; + if test x$withval != xno ; then + tryopenssldir="$withval" + fi + +fi + +if test "x$tryopenssldir" = x && test "x$ALT_openssl_WITHVAL" != x ; then + tryopenssldir="$ALT_openssl_WITHVAL" +fi + +tor_saved_LIBS="$LIBS" +tor_saved_LDFLAGS="$LDFLAGS" +tor_saved_CPPFLAGS="$CPPFLAGS" +{ echo "$as_me:$LINENO: checking for openssl directory" >&5 +echo $ECHO_N "checking for openssl directory... $ECHO_C" >&6; } +if test "${tor_cv_library_openssl_dir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + tor_openssl_dir_found=no + tor_openssl_any_linkable=no + + for tor_trydir in "$tryopenssldir" "(system)" "$prefix" /usr/local /usr/pkg /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl; do + LDFLAGS="$tor_saved_LDFLAGS" + LIBS="$tor_saved_LIBS -lssl -lcrypto $TOR_LIB_GDI" + CPPFLAGS="$tor_saved_CPPFLAGS" if test -z "$tor_trydir" ; then continue; @@ -6918,8 +7490,10 @@ else if test -d "$tor_cv_library_openssl_dir/lib"; then TOR_LDFLAGS_openssl="-L$tor_cv_library_openssl_dir/lib" + TOR_LIBDIR_openssl="$tor_cv_library_openssl_dir/lib" else TOR_LDFLAGS_openssl="-L$tor_cv_library_openssl_dir" + TOR_LIBDIR_openssl="$tor_cv_library_openssl_dir" fi if test -d "$tor_cv_library_openssl_dir/include"; then TOR_CPPFLAGS_openssl="-I$tor_cv_library_openssl_dir/include" @@ -7036,6 +7610,20 @@ +echo "tor_cv_library_openssl_dir is $tor_cv_library_openssl_dir" +if test "$enable_static_openssl" = "yes"; then + if test "$tor_cv_library_openssl_dir" = "(system)"; then + { { echo "$as_me:$LINENO: error: \"You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl\"" >&5 +echo "$as_me: error: \"You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl\"" >&2;} + { (exit 1); exit 1; }; } + else + TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a" + fi +else + TOR_OPENSSL_LIBS="-lssl -lcrypto" +fi + + tor_openssl_pkg_redhat="zlib" tor_openssl_pkg_debian="zlib1g" @@ -7307,8 +7895,10 @@ else if test -d "$tor_cv_library_zlib_dir/lib"; then TOR_LDFLAGS_zlib="-L$tor_cv_library_zlib_dir/lib" + TOR_LIBDIR_zlib="$tor_cv_library_zlib_dir/lib" else TOR_LDFLAGS_zlib="-L$tor_cv_library_zlib_dir" + TOR_LIBDIR_zlib="$tor_cv_library_zlib_dir" fi if test -d "$tor_cv_library_zlib_dir/include"; then TOR_CPPFLAGS_zlib="-I$tor_cv_library_zlib_dir/include" @@ -7424,6 +8014,22 @@ +if test "$enable_static_zlib" = "yes"; then + if test "$tor_cv_library_zlib_dir" = "(system)"; then + { { echo "$as_me:$LINENO: error: \"You must specify an explicit --with-zlib-dir=x option when + using --enable-static-zlib\"" >&5 +echo "$as_me: error: \"You must specify an explicit --with-zlib-dir=x option when + using --enable-static-zlib\"" >&2;} + { (exit 1); exit 1; }; } + else + TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a" + echo "$TOR_LIBDIR_zlib/libz.a" + fi +else + TOR_ZLIB_LIBS="-lz" +fi + + # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then @@ -7938,7 +8544,8 @@ -for ac_header in netdb.h sys/ioctl.h sys/socket.h arpa/inet.h netinet/in.h pwd.h grp.h sys/un.h + +for ac_header in netdb.h sys/ioctl.h sys/socket.h arpa/inet.h netinet/in.h pwd.h grp.h sys/un.h sys/uio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then @@ -8101,7 +8708,10 @@ -for ac_header in stdint.h sys/types.h inttypes.h sys/param.h sys/wait.h limits.h sys/limits.h netinet/in.h arpa/inet.h machine/limits.h syslog.h sys/time.h sys/resource.h inttypes.h utime.h sys/utime.h sys/mman.h netinet/in6.h malloc.h sys/syslimits.h malloc/malloc.h linux/types.h + + + +for ac_header in stdint.h sys/types.h inttypes.h sys/param.h sys/wait.h limits.h sys/limits.h netinet/in.h arpa/inet.h machine/limits.h syslog.h sys/time.h sys/resource.h inttypes.h utime.h sys/utime.h sys/mman.h netinet/in6.h malloc.h sys/syslimits.h malloc/malloc.h linux/types.h sys/file.h malloc_np.h sys/prctl.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then @@ -8529,147 +9139,22 @@ cat >>confdefs.h <<\_ACEOF #define USE_TRANSPARENT 1 -_ACEOF - - case $host in - *-*-openbsd*) - -cat >>confdefs.h <<\_ACEOF -#define OPENBSD 1 -_ACEOF - ;; - esac - else - { echo "$as_me:$LINENO: Transparent proxy support enabled, but missing headers." >&5 -echo "$as_me: Transparent proxy support enabled, but missing headers." >&6;} - fi -fi - -{ echo "$as_me:$LINENO: checking for _LARGEFILE_SOURCE value needed for large files" >&5 -echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6; } -if test "${ac_cv_sys_largefile_source+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include /* for off_t */ - #include -int -main () -{ -int (*fp) (FILE *, off_t, int) = fseeko; - return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_sys_largefile_source=no; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#define _LARGEFILE_SOURCE 1 -#include /* for off_t */ - #include -int -main () -{ -int (*fp) (FILE *, off_t, int) = fseeko; - return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_sys_largefile_source=1; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - ac_cv_sys_largefile_source=unknown - break -done -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_source" >&5 -echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6; } -case $ac_cv_sys_largefile_source in #( - no | unknown) ;; - *) -cat >>confdefs.h <<_ACEOF -#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source -_ACEOF -;; -esac -rm -f conftest* +_ACEOF -# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug -# in glibc 2.1.3, but that breaks too many other things. -# If you want fseeko and ftello with glibc, upgrade to a fixed glibc. -if test $ac_cv_sys_largefile_source != unknown; then + case $host in + *-*-openbsd*) cat >>confdefs.h <<\_ACEOF -#define HAVE_FSEEKO 1 +#define OPENBSD 1 _ACEOF - + ;; + esac + else + { echo "$as_me:$LINENO: Transparent proxy support enabled, but missing headers." >&5 +echo "$as_me: Transparent proxy support enabled, but missing headers." >&6;} + fi fi - { echo "$as_me:$LINENO: checking for struct timeval.tv_sec" >&5 echo $ECHO_N "checking for struct timeval.tv_sec... $ECHO_C" >&6; } if test "${ac_cv_member_struct_timeval_tv_sec+set}" = set; then @@ -16839,9 +17324,9 @@ fi -{ echo "$as_me:$LINENO: checking for struct sockaddr_storage" >&5 -echo $ECHO_N "checking for struct sockaddr_storage... $ECHO_C" >&6; } -if test "${ac_cv_type_struct_sockaddr_storage+set}" = set; then +{ echo "$as_me:$LINENO: checking for sa_family_t" >&5 +echo $ECHO_N "checking for sa_family_t... $ECHO_C" >&6; } +if test "${ac_cv_type_sa_family_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -16875,7 +17360,7 @@ #endif -typedef struct sockaddr_storage ac__type_new_; +typedef sa_family_t ac__type_new_; int main () { @@ -16904,29 +17389,30 @@ test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_type_struct_sockaddr_storage=yes + ac_cv_type_sa_family_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_type_struct_sockaddr_storage=no + ac_cv_type_sa_family_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_struct_sockaddr_storage" >&5 -echo "${ECHO_T}$ac_cv_type_struct_sockaddr_storage" >&6; } -if test $ac_cv_type_struct_sockaddr_storage = yes; then +{ echo "$as_me:$LINENO: result: $ac_cv_type_sa_family_t" >&5 +echo "${ECHO_T}$ac_cv_type_sa_family_t" >&6; } +if test $ac_cv_type_sa_family_t = yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_SOCKADDR_STORAGE 1 +#define HAVE_SA_FAMILY_T 1 _ACEOF fi -{ echo "$as_me:$LINENO: checking for sa_family_t" >&5 -echo $ECHO_N "checking for sa_family_t... $ECHO_C" >&6; } -if test "${ac_cv_type_sa_family_t+set}" = set; then + +{ echo "$as_me:$LINENO: checking for struct in6_addr.s6_addr32" >&5 +echo $ECHO_N "checking for struct in6_addr.s6_addr32... $ECHO_C" >&6; } +if test "${ac_cv_member_struct_in6_addr_s6_addr32+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -16960,14 +17446,224 @@ #endif -typedef sa_family_t ac__type_new_; int main () { -if ((ac__type_new_ *) 0) +static struct in6_addr ac_aggr; +if (ac_aggr.s6_addr32) +return 0; + ; return 0; -if (sizeof (ac__type_new_)) +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member_struct_in6_addr_s6_addr32=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN6_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef MS_WINDOWS +#define WIN32_WINNT 0x400 +#define _WIN32_WINNT 0x400 +#define WIN32_LEAN_AND_MEAN +#if defined(_MSC_VER) && (_MSC_VER < 1300) +#include +#else +#include +#include +#endif +#endif + + +int +main () +{ +static struct in6_addr ac_aggr; +if (sizeof ac_aggr.s6_addr32) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member_struct_in6_addr_s6_addr32=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_member_struct_in6_addr_s6_addr32=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_in6_addr_s6_addr32" >&5 +echo "${ECHO_T}$ac_cv_member_struct_in6_addr_s6_addr32" >&6; } +if test $ac_cv_member_struct_in6_addr_s6_addr32 = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_IN6_ADDR_S6_ADDR32 1 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking for struct in6_addr.s6_addr16" >&5 +echo $ECHO_N "checking for struct in6_addr.s6_addr16... $ECHO_C" >&6; } +if test "${ac_cv_member_struct_in6_addr_s6_addr16+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN6_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef MS_WINDOWS +#define WIN32_WINNT 0x400 +#define _WIN32_WINNT 0x400 +#define WIN32_LEAN_AND_MEAN +#if defined(_MSC_VER) && (_MSC_VER < 1300) +#include +#else +#include +#include +#endif +#endif + + +int +main () +{ +static struct in6_addr ac_aggr; +if (ac_aggr.s6_addr16) +return 0; + ; return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member_struct_in6_addr_s6_addr16=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN6_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef MS_WINDOWS +#define WIN32_WINNT 0x400 +#define _WIN32_WINNT 0x400 +#define WIN32_LEAN_AND_MEAN +#if defined(_MSC_VER) && (_MSC_VER < 1300) +#include +#else +#include +#include +#endif +#endif + + +int +main () +{ +static struct in6_addr ac_aggr; +if (sizeof ac_aggr.s6_addr16) +return 0; ; return 0; } @@ -16989,30 +17685,32 @@ test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_type_sa_family_t=yes + ac_cv_member_struct_in6_addr_s6_addr16=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_type_sa_family_t=no + ac_cv_member_struct_in6_addr_s6_addr16=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_sa_family_t" >&5 -echo "${ECHO_T}$ac_cv_type_sa_family_t" >&6; } -if test $ac_cv_type_sa_family_t = yes; then + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_in6_addr_s6_addr16" >&5 +echo "${ECHO_T}$ac_cv_member_struct_in6_addr_s6_addr16" >&6; } +if test $ac_cv_member_struct_in6_addr_s6_addr16 = yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_SA_FAMILY_T 1 +#define HAVE_STRUCT_IN6_ADDR_S6_ADDR16 1 _ACEOF fi - -{ echo "$as_me:$LINENO: checking for struct in6_addr.s6_addr32" >&5 -echo $ECHO_N "checking for struct in6_addr.s6_addr32... $ECHO_C" >&6; } -if test "${ac_cv_member_struct_in6_addr_s6_addr32+set}" = set; then +{ echo "$as_me:$LINENO: checking for struct sockaddr_in.sin_len" >&5 +echo $ECHO_N "checking for struct sockaddr_in.sin_len... $ECHO_C" >&6; } +if test "${ac_cv_member_struct_sockaddr_in_sin_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -17049,8 +17747,8 @@ int main () { -static struct in6_addr ac_aggr; -if (ac_aggr.s6_addr32) +static struct sockaddr_in ac_aggr; +if (ac_aggr.sin_len) return 0; ; return 0; @@ -17073,7 +17771,7 @@ test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_member_struct_in6_addr_s6_addr32=yes + ac_cv_member_struct_sockaddr_in_sin_len=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 @@ -17112,8 +17810,8 @@ int main () { -static struct in6_addr ac_aggr; -if (sizeof ac_aggr.s6_addr32) +static struct sockaddr_in ac_aggr; +if (sizeof ac_aggr.sin_len) return 0; ; return 0; @@ -17136,12 +17834,12 @@ test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_member_struct_in6_addr_s6_addr32=yes + ac_cv_member_struct_sockaddr_in_sin_len=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_member_struct_in6_addr_s6_addr32=no + ac_cv_member_struct_sockaddr_in_sin_len=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext @@ -17149,19 +17847,19 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_in6_addr_s6_addr32" >&5 -echo "${ECHO_T}$ac_cv_member_struct_in6_addr_s6_addr32" >&6; } -if test $ac_cv_member_struct_in6_addr_s6_addr32 = yes; then +{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_sockaddr_in_sin_len" >&5 +echo "${ECHO_T}$ac_cv_member_struct_sockaddr_in_sin_len" >&6; } +if test $ac_cv_member_struct_sockaddr_in_sin_len = yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_IN6_ADDR_S6_ADDR32 1 +#define HAVE_STRUCT_SOCKADDR_IN_SIN_LEN 1 _ACEOF fi -{ echo "$as_me:$LINENO: checking for struct in6_addr.s6_addr16" >&5 -echo $ECHO_N "checking for struct in6_addr.s6_addr16... $ECHO_C" >&6; } -if test "${ac_cv_member_struct_in6_addr_s6_addr16+set}" = set; then +{ echo "$as_me:$LINENO: checking for struct sockaddr_in6.sin6_len" >&5 +echo $ECHO_N "checking for struct sockaddr_in6.sin6_len... $ECHO_C" >&6; } +if test "${ac_cv_member_struct_sockaddr_in6_sin6_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -17198,8 +17896,8 @@ int main () { -static struct in6_addr ac_aggr; -if (ac_aggr.s6_addr16) +static struct sockaddr_in6 ac_aggr; +if (ac_aggr.sin6_len) return 0; ; return 0; @@ -17222,7 +17920,7 @@ test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_member_struct_in6_addr_s6_addr16=yes + ac_cv_member_struct_sockaddr_in6_sin6_len=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 @@ -17261,8 +17959,8 @@ int main () { -static struct in6_addr ac_aggr; -if (sizeof ac_aggr.s6_addr16) +static struct sockaddr_in6 ac_aggr; +if (sizeof ac_aggr.sin6_len) return 0; ; return 0; @@ -17285,12 +17983,12 @@ test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_member_struct_in6_addr_s6_addr16=yes + ac_cv_member_struct_sockaddr_in6_sin6_len=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_member_struct_in6_addr_s6_addr16=no + ac_cv_member_struct_sockaddr_in6_sin6_len=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext @@ -17298,12 +17996,12 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_in6_addr_s6_addr16" >&5 -echo "${ECHO_T}$ac_cv_member_struct_in6_addr_s6_addr16" >&6; } -if test $ac_cv_member_struct_in6_addr_s6_addr16 = yes; then +{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_sockaddr_in6_sin6_len" >&5 +echo "${ECHO_T}$ac_cv_member_struct_sockaddr_in6_sin6_len" >&6; } +if test $ac_cv_member_struct_sockaddr_in6_sin6_len = yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_IN6_ADDR_S6_ADDR16 1 +#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN 1 _ACEOF @@ -18902,6 +19600,177 @@ LDFLAGS="-ltcmalloc $LDFLAGS" fi +# By default, we're going to assume we don't have mlockall() +# bionic and other platforms have various broken mlockall subsystems. +# Some systems don't have a working mlockall, some aren't linkable, +# and some have it but don't declare it. + +for ac_func in mlockall +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +{ echo "$as_me:$LINENO: checking whether mlockall is declared" >&5 +echo $ECHO_N "checking whether mlockall is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_mlockall+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_MMAN_H +#include +#endif + +int +main () +{ +#ifndef mlockall + (void) mlockall; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_mlockall=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_mlockall=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_mlockall" >&5 +echo "${ECHO_T}$ac_cv_have_decl_mlockall" >&6; } +if test $ac_cv_have_decl_mlockall = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MLOCKALL 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MLOCKALL 0 +_ACEOF + + +fi + + + # Allow user to specify an alternate syslog facility # Check whether --with-syslog-facility was given. @@ -19471,16 +20340,20 @@ # Set CFLAGS _after_ all the above checks, since our warnings are stricter # than autoconf's macros like. -if test "$ac_cv_c_compiler_gnu" = yes; then +if test "$GCC" = yes; then CFLAGS="$CFLAGS -Wall -g -O2" + # Disable GCC's strict aliasing checks. They are an hours-to-debug + # accident waiting to happen. + CFLAGS="$CFLAGS -fno-strict-aliasing" else CFLAGS="$CFLAGS -g -O" enable_gcc_warnings=no + enable_gcc_warnings_advisory=no fi # Add some more warnings which we use in development but not in the # released versions. (Some relevant gcc versions can't handle these.) -if test x$enable_gcc_warnings = xyes; then +if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -19572,6 +20445,51 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + +#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) +#error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + have_gcc43=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + have_gcc43=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wshorten-64-to-32" cat >conftest.$ac_ext <<_ACEOF @@ -19617,7 +20535,20 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" - CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2 -Wwrite-strings -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wbad-function-cast -Wswitch-enum -Werror" + case $host in + *-*-openbsd*) + # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default. + # That's fine, except that the headers don't pass -Wredundant-decls. + # Therefore, let's disable -Wsystem-headers when we're building + # with maximal warnings on OpenBSD. + CFLAGS="$CFLAGS -Wno-system-headers" ;; + esac + + CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2 -Wwrite-strings -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wbad-function-cast -Wswitch-enum" + if test x$enable_gcc_warnings = xyes; then + CFLAGS="$CFLAGS -Werror" + fi + # Disabled, so we can use mallinfo(): -Waggregate-return if test x$have_gcc4 = xyes ; then @@ -19629,10 +20560,16 @@ # These warnings break gcc 4.0.2 and work on gcc 4.2 # XXXX020 Use -fstack-protector. # XXXX020 See if any of these work with earlier versions. - CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wnormalized=id -Woverride-init -Wstrict-overflow=1" + CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wnormalized=id -Woverride-init -Wstrict-overflow=1 --param ssp-buffer-size=1" # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3. fi + if test x$have_gcc43 = xyes ; then + # These warnings break gcc 4.2 and work on gcc 4.3 + # XXXX020 See if any of these work with earlier versions. + CFLAGS="$CFLAGS -Wextra -Warray-bounds" + fi + if test x$have_shorten64_flag = xyes ; then CFLAGS="$CFLAGS -Wshorten-64-to-32" fi @@ -19645,7 +20582,7 @@ CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib" -ac_config_files="$ac_config_files Makefile tor.spec Doxyfile contrib/tor.sh contrib/torctl contrib/torify contrib/tor.logrotate contrib/Makefile contrib/osx/Makefile contrib/osx/TorBundleDesc.plist contrib/osx/TorBundleInfo.plist contrib/osx/TorDesc.plist contrib/osx/TorInfo.plist contrib/osx/TorStartupDesc.plist src/config/torrc.sample doc/tor.1 src/Makefile doc/Makefile doc/design-paper/Makefile doc/spec/Makefile src/config/Makefile src/common/Makefile src/or/Makefile src/win32/Makefile src/tools/Makefile contrib/suse/Makefile contrib/suse/tor.sh" +ac_config_files="$ac_config_files Makefile tor.spec Doxyfile contrib/tor.sh contrib/torctl contrib/torify contrib/tor.logrotate contrib/Makefile contrib/osx/Makefile contrib/osx/TorBundleDesc.plist contrib/osx/TorBundleInfo.plist contrib/osx/TorDesc.plist contrib/osx/TorInfo.plist contrib/osx/TorStartupDesc.plist src/config/torrc.sample src/Makefile doc/Makefile doc/spec/Makefile src/config/Makefile src/common/Makefile src/or/Makefile src/test/Makefile src/win32/Makefile src/tools/Makefile contrib/suse/Makefile contrib/suse/tor.sh" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -19764,6 +20701,13 @@ Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi +if test -z "${USE_ASCIIDOC_TRUE}" && test -z "${USE_ASCIIDOC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"USE_ASCIIDOC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"USE_ASCIIDOC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi if test -z "${BUILD_NT_SERVICES_TRUE}" && test -z "${BUILD_NT_SERVICES_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"BUILD_NT_SERVICES\" was never defined. Usually this means the macro was only invoked conditionally." >&5 @@ -19771,6 +20715,13 @@ Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi +if test -z "${USE_EXTERNAL_EVDNS_TRUE}" && test -z "${USE_EXTERNAL_EVDNS_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"USE_EXTERNAL_EVDNS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"USE_EXTERNAL_EVDNS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files @@ -20255,14 +21206,13 @@ "contrib/osx/TorInfo.plist") CONFIG_FILES="$CONFIG_FILES contrib/osx/TorInfo.plist" ;; "contrib/osx/TorStartupDesc.plist") CONFIG_FILES="$CONFIG_FILES contrib/osx/TorStartupDesc.plist" ;; "src/config/torrc.sample") CONFIG_FILES="$CONFIG_FILES src/config/torrc.sample" ;; - "doc/tor.1") CONFIG_FILES="$CONFIG_FILES doc/tor.1" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; - "doc/design-paper/Makefile") CONFIG_FILES="$CONFIG_FILES doc/design-paper/Makefile" ;; "doc/spec/Makefile") CONFIG_FILES="$CONFIG_FILES doc/spec/Makefile" ;; "src/config/Makefile") CONFIG_FILES="$CONFIG_FILES src/config/Makefile" ;; "src/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/common/Makefile" ;; "src/or/Makefile") CONFIG_FILES="$CONFIG_FILES src/or/Makefile" ;; + "src/test/Makefile") CONFIG_FILES="$CONFIG_FILES src/test/Makefile" ;; "src/win32/Makefile") CONFIG_FILES="$CONFIG_FILES src/win32/Makefile" ;; "src/tools/Makefile") CONFIG_FILES="$CONFIG_FILES src/tools/Makefile" ;; "contrib/suse/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/suse/Makefile" ;; @@ -20416,16 +21366,16 @@ am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim CPP!$CPP$ac_delim RANLIB!$RANLIB$ac_delim +SED!$SED$ac_delim +ASCIIDOC!$ASCIIDOC$ac_delim +A2X!$A2X$ac_delim +USE_ASCIIDOC_TRUE!$USE_ASCIIDOC_TRUE$ac_delim +USE_ASCIIDOC_FALSE!$USE_ASCIIDOC_FALSE$ac_delim +SHA1SUM!$SHA1SUM$ac_delim +OPENSSL!$OPENSSL$ac_delim TORUSER!$TORUSER$ac_delim TORGROUP!$TORGROUP$ac_delim BUILD_NT_SERVICES_TRUE!$BUILD_NT_SERVICES_TRUE$ac_delim -BUILD_NT_SERVICES_FALSE!$BUILD_NT_SERVICES_FALSE$ac_delim -GREP!$GREP$ac_delim -EGREP!$EGREP$ac_delim -TOR_LIB_WS32!$TOR_LIB_WS32$ac_delim -TOR_LIB_GDI!$TOR_LIB_GDI$ac_delim -TOR_CPPFLAGS_libevent!$TOR_CPPFLAGS_libevent$ac_delim -TOR_LDFLAGS_libevent!$TOR_LDFLAGS_libevent$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then @@ -20467,10 +21417,22 @@ ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF +BUILD_NT_SERVICES_FALSE!$BUILD_NT_SERVICES_FALSE$ac_delim +GREP!$GREP$ac_delim +EGREP!$EGREP$ac_delim +TOR_LIB_WS32!$TOR_LIB_WS32$ac_delim +TOR_LIB_GDI!$TOR_LIB_GDI$ac_delim +TOR_CPPFLAGS_libevent!$TOR_CPPFLAGS_libevent$ac_delim +TOR_LDFLAGS_libevent!$TOR_LDFLAGS_libevent$ac_delim +USE_EXTERNAL_EVDNS_TRUE!$USE_EXTERNAL_EVDNS_TRUE$ac_delim +USE_EXTERNAL_EVDNS_FALSE!$USE_EXTERNAL_EVDNS_FALSE$ac_delim +TOR_LIBEVENT_LIBS!$TOR_LIBEVENT_LIBS$ac_delim TOR_CPPFLAGS_openssl!$TOR_CPPFLAGS_openssl$ac_delim TOR_LDFLAGS_openssl!$TOR_LDFLAGS_openssl$ac_delim +TOR_OPENSSL_LIBS!$TOR_OPENSSL_LIBS$ac_delim TOR_CPPFLAGS_zlib!$TOR_CPPFLAGS_zlib$ac_delim TOR_LDFLAGS_zlib!$TOR_LDFLAGS_zlib$ac_delim +TOR_ZLIB_LIBS!$TOR_ZLIB_LIBS$ac_delim LOGFACILITY!$LOGFACILITY$ac_delim CONFDIR!$CONFDIR$ac_delim BINDIR!$BINDIR$ac_delim @@ -20479,7 +21441,7 @@ LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 10; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 22; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 @@ -20880,21 +21842,22 @@ fi rm -f "$tmp/out12" # Compute $ac_file's index in $config_headers. +_am_arg=$ac_file _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in - $ac_file | $ac_file:* ) + $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $ac_file" >`$as_dirname -- $ac_file || -$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X$ac_file : 'X\(//\)[^/]' \| \ - X$ac_file : 'X\(//\)$' \| \ - X$ac_file : 'X\(/\)' \| . 2>/dev/null || -echo X$ac_file | +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -20931,7 +21894,7 @@ # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. - if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ diff -Nru tor-0.2.0.34/configure.in tor-0.2.2.16-alpha/configure.in --- tor-0.2.0.34/configure.in 2009-02-09 03:29:15.000000000 +0000 +++ tor-0.2.2.16-alpha/configure.in 2010-09-17 06:08:30.000000000 +0000 @@ -1,11 +1,10 @@ -dnl $Id: configure.in 18430 2009-02-09 03:29:14Z arma $ dnl Copyright (c) 2001-2004, Roger Dingledine dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson dnl Copyright (c) 2007-2008, The Tor Project, Inc. dnl See LICENSE for licensing information AC_INIT -AM_INIT_AUTOMAKE(tor, 0.2.0.34) +AM_INIT_AUTOMAKE(tor, 0.2.2.16-alpha) AM_CONFIG_HEADER(orconfig.h) AC_CANONICAL_HOST @@ -18,41 +17,31 @@ # Not a no-op; we want to make sure that CPPFLAGS is set before we use # the += operator on it in src/or/Makefile.am -CPPFLAGS="$CPPFLAGS -I../common" - -AC_ARG_ENABLE(debug, - AS_HELP_STRING(--enable-debug, compile with debugging info), -[if test x$enableval = xyes; then - CFLAGS="$CFLAGS -g" -fi]) - -#XXXX ideally, we should make this into a no-op, and detect whether we're -#compiling for the iphone by using $target. -AC_ARG_ENABLE(iphone, - AS_HELP_STRING(--enable-iphone, compile with iPhone support), - [if test x$enableval = xyes ; then - tor_cv_iphone=true - CFLAGS="$CFLAGS -D__DARWIN_UNIX03 -DIPHONE" - fi]) +CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common" #XXXX020 We should make these enabled or not, before 0.2.0.x-final -AC_ARG_ENABLE(cell-pool, - AS_HELP_STRING(--disable-cell-pool, disable pool allocator for cells)) AC_ARG_ENABLE(buf-freelists, AS_HELP_STRING(--disable-buf-freelists, disable freelists for buffer RAM)) AC_ARG_ENABLE(openbsd-malloc, AS_HELP_STRING(--enable-openbsd-malloc, Use malloc code from openbsd. Linux only)) +AC_ARG_ENABLE(instrument-downloads, + AS_HELP_STRING(--enable-instrument-downloads, Instrument downloads of directory resources etc.)) +AC_ARG_ENABLE(static-openssl, + AS_HELP_STRING(--enable-static-openssl, Link against a static openssl library. Requires --with-openssl-dir)) +AC_ARG_ENABLE(static-libevent, + AS_HELP_STRING(--enable-static-libevent, Link against a static libevent library. Requires --with-libevent-dir)) +AC_ARG_ENABLE(static-zlib, + AS_HELP_STRING(--enable-static-zlib, Link against a static zlib library. Requires --with-zlib-dir)) - -if test x$enable_cell_pool != xno; then - AC_DEFINE(ENABLE_CELL_POOL, 1, - [Defined if we try to use the pool allocator for queued cells]) -fi if test x$enable_buf_freelists != xno; then AC_DEFINE(ENABLE_BUF_FREELISTS, 1, [Defined if we try to use freelists for buffer RAM chunks]) fi AM_CONDITIONAL(USE_OPENBSD_MALLOC, test x$enable_openbsd_malloc = xyes) +if test x$enable_instrument_downloads = xyes; then + AC_DEFINE(INSTRUMENT_DOWNLOADS, 1, + [Defined if we want to keep track of how much of each kind of resource we download.]) +fi AC_ARG_ENABLE(transparent, AS_HELP_STRING(--disable-transparent, disable transparent proxy support), @@ -62,6 +51,15 @@ *) AC_MSG_ERROR(bad value for --enable-transparent) ;; esac], [transparent=true]) +AC_ARG_ENABLE(asciidoc, + AS_HELP_STRING(--disable-asciidoc, don't use asciidoc (disables building of manpages)), + [case "${enableval}" in + yes) asciidoc=true ;; + no) asciidoc=false ;; + *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;; + esac], [asciidoc=true]) + + AC_ARG_ENABLE(threads, AS_HELP_STRING(--disable-threads, disable multi-threading support)) @@ -89,12 +87,54 @@ AC_ARG_ENABLE(gcc-warnings, AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings)) +AC_ARG_ENABLE(gcc-warnings-advisory, + AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror])) + +dnl Adam shostack suggests the following for Windows: +dnl -D_FORTIFY_SOURCE=2 -fstack-protector-all +dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows +dnl This requires that we use gcc and that we add -O2 to the CFLAGS. +AC_ARG_ENABLE(gcc-hardening, + AS_HELP_STRING(--enable-gcc-hardening, enable compiler security checks), +[if test x$enableval = xyes; then + CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2 -fstack-protector-all" + CFLAGS="$CFLAGS -fwrapv -fPIE -Wstack-protector -Wformat -Wformat-security" + CFLAGS="$CFLAGS -Wpointer-sign" + LDFLAGS="$LDFLAGS -pie" +fi]) + +dnl Linker hardening options +dnl Currently these options are ELF specific - you can't use this with MacOSX +AC_ARG_ENABLE(linker-hardening, + AS_HELP_STRING(--enable-linker-hardening, enable linker security fixups), +[if test x$enableval = xyes; then + LDFLAGS="$LDFLAGS -z relro -z now" +fi]) + +AC_ARG_ENABLE(local-appdata, + AS_HELP_STRING(--enable-local-appdata, default to host local application data paths on Windows)) +if test "$enable_local_appdata" = "yes"; then + AC_DEFINE(ENABLE_LOCAL_APPDATA, 1, + [Defined if we default to host local appdata paths on Windows]) +fi AC_PROG_CC AC_PROG_CPP AC_PROG_MAKE_SET AC_PROG_RANLIB +dnl autoconf 2.59 appears not to support AC_PROG_SED +AC_CHECK_PROG([SED],[sed],[sed],[/bin/false]) + +dnl check for asciidoc and a2x +AC_PATH_PROG([ASCIIDOC], [asciidoc], none) +AC_PATH_PROG([A2X], [a2x], none) + +AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue) + +AC_PATH_PROG([SHA1SUM], [sha1sum], none) +AC_PATH_PROG([OPENSSL], [openssl], none) + TORUSER=_tor AC_ARG_WITH(tor-user, [ --with-tor-user=NAME Specify username for tor daemon ], @@ -183,15 +223,16 @@ dnl Check for functions before libevent, since libevent-1.2 apparently dnl exports strlcpy without defining it in a header. -AC_CHECK_FUNCS(gettimeofday ftime socketpair uname inet_aton strptime getrlimit strlcat strlcpy strtoull ftello getaddrinfo localtime_r gmtime_r memmem strtok_r inet_pton inet_ntop) +AC_CHECK_FUNCS(gettimeofday ftime socketpair uname inet_aton strptime getrlimit strlcat strlcpy strtoull getaddrinfo localtime_r gmtime_r memmem strtok_r writev readv flock prctl vasprintf) using_custom_malloc=no if test x$enable_openbsd_malloc = xyes ; then + AC_DEFINE(HAVE_MALLOC_GOOD_SIZE, 1, [Defined if we have the malloc_good_size function]) using_custom_malloc=yes fi if test x$tcmalloc = xyes ; then using_custom_malloc=yes -fi +fi if test $using_custom_malloc = no ; then AC_CHECK_FUNCS(mallinfo malloc_good_size malloc_usable_size) fi @@ -256,11 +297,32 @@ LIBS="-levent $TOR_LIB_WS32 $LIBS" LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS" CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS" -AC_CHECK_FUNCS(event_get_version event_get_method event_set_log_callback) +AC_CHECK_FUNCS(event_get_version event_get_version_number event_get_method event_set_log_callback evdns_set_outgoing_bind_address event_base_loopexit) +AC_CHECK_MEMBERS([struct event.min_heap_idx], , , +[#include +]) + +AC_CHECK_HEADERS(event2/event.h event2/dns.h) + LIBS="$save_LIBS" LDFLAGS="$save_LDFLAGS" CPPFLAGS="$save_CPPFLAGS" + +AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes) + +if test "$enable_static_libevent" = "yes"; then + if test "$tor_cv_library_libevent_dir" = "(system)"; then + AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent") + else + TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a" + fi +else + TOR_LIBEVENT_LIBS="-levent" +fi +AC_SUBST(TOR_LIBEVENT_LIBS) + + dnl ------------------------------------------------------ dnl Where do you live, openssl? And how do we call you? @@ -286,6 +348,18 @@ dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay() +echo "tor_cv_library_openssl_dir is $tor_cv_library_openssl_dir" +if test "$enable_static_openssl" = "yes"; then + if test "$tor_cv_library_openssl_dir" = "(system)"; then + AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl") + else + TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a" + fi +else + TOR_OPENSSL_LIBS="-lssl -lcrypto" +fi +AC_SUBST(TOR_OPENSSL_LIBS) + dnl ------------------------------------------------------ dnl Where do you live, zlib? And how do we call you? @@ -300,17 +374,30 @@ [zlibVersion(); exit(0);], [--with-zlib-dir], [/opt/zlib]) +if test "$enable_static_zlib" = "yes"; then + if test "$tor_cv_library_zlib_dir" = "(system)"; then + AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when + using --enable-static-zlib") + else + TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a" + echo "$TOR_LIBDIR_zlib/libz.a" + fi +else + TOR_ZLIB_LIBS="-lz" +fi +AC_SUBST(TOR_ZLIB_LIBS) + dnl Make sure to enable support for large off_t if available. AC_SYS_LARGEFILE AC_CHECK_HEADERS(unistd.h string.h signal.h sys/stat.h sys/types.h fcntl.h sys/fcntl.h sys/time.h errno.h assert.h time.h, , AC_MSG_WARN(Some headers were not found, compilation may fail. If compilation succeeds, please send your orconfig.h to the developers so we can fix this warning.)) -AC_CHECK_HEADERS(netdb.h sys/ioctl.h sys/socket.h arpa/inet.h netinet/in.h pwd.h grp.h sys/un.h) +AC_CHECK_HEADERS(netdb.h sys/ioctl.h sys/socket.h arpa/inet.h netinet/in.h pwd.h grp.h sys/un.h sys/uio.h) dnl These headers are not essential -AC_CHECK_HEADERS(stdint.h sys/types.h inttypes.h sys/param.h sys/wait.h limits.h sys/limits.h netinet/in.h arpa/inet.h machine/limits.h syslog.h sys/time.h sys/resource.h inttypes.h utime.h sys/utime.h sys/mman.h netinet/in6.h malloc.h sys/syslimits.h malloc/malloc.h linux/types.h) +AC_CHECK_HEADERS(stdint.h sys/types.h inttypes.h sys/param.h sys/wait.h limits.h sys/limits.h netinet/in.h arpa/inet.h machine/limits.h syslog.h sys/time.h sys/resource.h inttypes.h utime.h sys/utime.h sys/mman.h netinet/in6.h malloc.h sys/syslimits.h malloc/malloc.h linux/types.h sys/file.h malloc_np.h sys/prctl.h) TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE, [#ifdef HAVE_MALLOC_H @@ -377,8 +464,6 @@ fi fi -AC_FUNC_FSEEKO - AC_CHECK_MEMBERS([struct timeval.tv_sec], , , [#ifdef HAVE_SYS_TYPES_H #include @@ -415,7 +500,8 @@ AC_CHECK_TYPES([uint, u_char, ssize_t]) -AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, struct sockaddr_storage, sa_family_t], , , +dnl used to include sockaddr_storage, but everybody has that. +AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , , [#ifdef HAVE_SYS_TYPES_H #include #endif @@ -440,7 +526,7 @@ #endif #endif ]) -AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16], , , +AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , , [#ifdef HAVE_SYS_TYPES_H #include #endif @@ -609,6 +695,16 @@ LDFLAGS="-ltcmalloc $LDFLAGS" fi +# By default, we're going to assume we don't have mlockall() +# bionic and other platforms have various broken mlockall subsystems. +# Some systems don't have a working mlockall, some aren't linkable, +# and some have it but don't declare it. +AC_CHECK_FUNCS(mlockall) +AC_CHECK_DECLS([mlockall], , , [ +#ifdef HAVE_SYS_MMAN_H +#include +#endif]) + # Allow user to specify an alternate syslog facility AC_ARG_WITH(syslog-facility, [ --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)], @@ -737,16 +833,20 @@ # Set CFLAGS _after_ all the above checks, since our warnings are stricter # than autoconf's macros like. -if test "$ac_cv_c_compiler_gnu" = yes; then +if test "$GCC" = yes; then CFLAGS="$CFLAGS -Wall -g -O2" + # Disable GCC's strict aliasing checks. They are an hours-to-debug + # accident waiting to happen. + CFLAGS="$CFLAGS -fno-strict-aliasing" else CFLAGS="$CFLAGS -g -O" enable_gcc_warnings=no + enable_gcc_warnings_advisory=no fi # Add some more warnings which we use in development but not in the # released versions. (Some relevant gcc versions can't handle these.) -if test x$enable_gcc_warnings = xyes; then +if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [ #if !defined(__GNUC__) || (__GNUC__ < 4) @@ -758,16 +858,34 @@ #error #endif]), have_gcc42=yes, have_gcc42=no) + AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [ +#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) +#error +#endif]), have_gcc43=yes, have_gcc43=no) + save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wshorten-64-to-32" AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], []), have_shorten64_flag=yes, have_shorten64_flag=no) CFLAGS="$save_CFLAGS" - CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2 -Wwrite-strings -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wbad-function-cast -Wswitch-enum -Werror" + case $host in + *-*-openbsd*) + # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default. + # That's fine, except that the headers don't pass -Wredundant-decls. + # Therefore, let's disable -Wsystem-headers when we're building + # with maximal warnings on OpenBSD. + CFLAGS="$CFLAGS -Wno-system-headers" ;; + esac + + CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2 -Wwrite-strings -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wbad-function-cast -Wswitch-enum" + if test x$enable_gcc_warnings = xyes; then + CFLAGS="$CFLAGS -Werror" + fi + # Disabled, so we can use mallinfo(): -Waggregate-return - if test x$have_gcc4 = xyes ; then + if test x$have_gcc4 = xyes ; then # These warnings break gcc 3.3.5 and work on gcc 4.0.2 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition" fi @@ -776,10 +894,16 @@ # These warnings break gcc 4.0.2 and work on gcc 4.2 # XXXX020 Use -fstack-protector. # XXXX020 See if any of these work with earlier versions. - CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wnormalized=id -Woverride-init -Wstrict-overflow=1" + CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wnormalized=id -Woverride-init -Wstrict-overflow=1 --param ssp-buffer-size=1" # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3. fi + if test x$have_gcc43 = xyes ; then + # These warnings break gcc 4.2 and work on gcc 4.3 + # XXXX020 See if any of these work with earlier versions. + CFLAGS="$CFLAGS -Wextra -Warray-bounds" + fi + if test x$have_shorten64_flag = xyes ; then CFLAGS="$CFLAGS -Wshorten-64-to-32" fi @@ -792,7 +916,7 @@ CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib" -AC_CONFIG_FILES([Makefile tor.spec Doxyfile contrib/tor.sh contrib/torctl contrib/torify contrib/tor.logrotate contrib/Makefile contrib/osx/Makefile contrib/osx/TorBundleDesc.plist contrib/osx/TorBundleInfo.plist contrib/osx/TorDesc.plist contrib/osx/TorInfo.plist contrib/osx/TorStartupDesc.plist src/config/torrc.sample doc/tor.1 src/Makefile doc/Makefile doc/design-paper/Makefile doc/spec/Makefile src/config/Makefile src/common/Makefile src/or/Makefile src/win32/Makefile src/tools/Makefile contrib/suse/Makefile contrib/suse/tor.sh]) +AC_CONFIG_FILES([Makefile tor.spec Doxyfile contrib/tor.sh contrib/torctl contrib/torify contrib/tor.logrotate contrib/Makefile contrib/osx/Makefile contrib/osx/TorBundleDesc.plist contrib/osx/TorBundleInfo.plist contrib/osx/TorDesc.plist contrib/osx/TorInfo.plist contrib/osx/TorStartupDesc.plist src/config/torrc.sample src/Makefile doc/Makefile doc/spec/Makefile src/config/Makefile src/common/Makefile src/or/Makefile src/test/Makefile src/win32/Makefile src/tools/Makefile contrib/suse/Makefile contrib/suse/tor.sh]) AC_OUTPUT if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then diff -Nru tor-0.2.0.34/contrib/cross.sh tor-0.2.2.16-alpha/contrib/cross.sh --- tor-0.2.0.34/contrib/cross.sh 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/cross.sh 2009-11-17 20:37:01.000000000 +0000 @@ -1,5 +1,4 @@ #!/bin/bash -# $Id: cross.sh 8980 2006-11-21 23:50:31Z nickm $ # Copyright 2006 Michael Mohr with modifications by Roger Dingledine # See LICENSE for licensing information. @@ -186,7 +185,7 @@ then ${HOST_TRIPLET}strip \ src/or/tor \ - src/or/test \ + src/test/test \ src/tools/tor-resolve fi diff -Nru tor-0.2.0.34/contrib/linux-tor-prio.sh tor-0.2.2.16-alpha/contrib/linux-tor-prio.sh --- tor-0.2.0.34/contrib/linux-tor-prio.sh 2008-11-12 10:47:38.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/linux-tor-prio.sh 2009-05-18 23:47:00.000000000 +0000 @@ -8,41 +8,52 @@ # This script provides prioritization of Tor traffic below other # traffic on a Linux server. It has two modes of operation: UID based -# and IP based. The UID based method requires that Tor be launched from +# and IP based. + +# UID BASED PRIORITIZATION +# +# The UID based method requires that Tor be launched from # a specific user ID. The "User" Tor config setting is # insufficient, as it sets the UID after the socket is created. -# Here is a three line C wrapper you can use to execute Tor and drop -# privs to UID 501 before it creates any sockets. Change the UID -# to the UID for your tor server user, and compile with -# 'gcc tor_wrap.c -o tor_wrap': - +# Here is a C wrapper you can use to execute Tor and drop privs before +# it creates any sockets. +# +# Compile with: +# gcc -DUID=`id -u tor` -DGID=`id -g tor` tor_wrap.c -o tor_wrap +# # #include # int main(int argc, char **argv) { -# if(setresuid(501, 501, 501) == -1) { perror("setresuid"); return 1; } +# if(initgroups("tor", GID) == -1) { perror("initgroups"); return 1; } +# if(setresgid(GID, GID, GID) == -1) { perror("setresgid"); return 1; } +# if(setresuid(UID, UID, UID) == -1) { perror("setresuid"); return 1; } # execl("/bin/tor", "/bin/tor", "-f", "/etc/tor/torrc", NULL); # perror("execl"); return 1; # } +# IP BASED PRIORITIZATION +# # The IP setting requires that a separate IP address be dedicated to Tor. # Your Torrc should be set to bind to this IP for "OutboundBindAddress", # "ListenAddress", and "Address". +# GENERAL USAGE +# # You should also tune the individual connection rate parameters below # to your individual connection. In particular, you should leave *some* # minimum amount of bandwidth for Tor, so that Tor users are not # completely choked out when you use your server's bandwidth. 30% is -# probably a polite choice. - +# probably a reasonable choice. More is better of course. +# # To start the shaping, run it as: # ./linux-tor-prio.sh - +# # To get status information (useful to verify packets are getting marked # and prioritized), run: # ./linux-tor-prio.sh status - +# # And to stop prioritization: # ./linux-tor-prio.sh stop - +# ######################################################################## # BEGIN USER TUNABLE PARAMETERS @@ -50,31 +61,34 @@ DEV=eth0 # NOTE! You must START Tor under this UID. Using the Tor User -# config setting is NOT sufficient. +# config setting is NOT sufficient. See above. TOR_UID=$(id -u tor) # If the UID mechanism doesn't work for you, you can set this parameter # instead. If set, it will take precedence over the UID setting. Note that -# you need multiple IPs for this to work. +# you need multiple IPs with one specifically devoted to Tor for this to +# work. #TOR_IP="42.42.42.42" # Average ping to most places on the net, milliseconds RTT_LATENCY=40 -# RATE_UP must be less than your connection's upload capacity. If it is -# larger, then the bottleneck will be at your router's queue, which you -# do not control. This will cause congestion and a revert to normal TCP -# fairness no matter what the queing priority is. +# RATE_UP must be less than your connection's upload capacity in +# kbits/sec. If it is larger, then the bottleneck will be at your +# router's queue, which you do not control. This will cause congestion +# and a revert to normal TCP fairness no matter what the queing +# priority is. RATE_UP=5000 -# RATE_UP_TOR is the minimum speed your Tor connections will have. -# They will have at least this much bandwidth for upload. In general, -# you probably shouldn't set this too low, or else Tor users who use -# your node will be completely choked out whenever your machine -# does any other network activity. That is not very fun. +# RATE_UP_TOR is the minimum speed your Tor connections will have in +# kbits/sec. They will have at least this much bandwidth for upload. +# In general, you probably shouldn't set this too low, or else Tor +# users who use your node will be completely choked out whenever your +# machine does any other network activity. That is not very fun. RATE_UP_TOR=1500 -# RATE_UP_TOR_CEIL is the maximum rate allowed for all Tor trafic +# RATE_UP_TOR_CEIL is the maximum rate allowed for all Tor trafic in +# kbits/sec. RATE_UP_TOR_CEIL=5000 CHAIN=OUTPUT @@ -86,6 +100,8 @@ # END USER TUNABLE PARAMETERS + + # The queue size should be no larger than your bandwidth-delay # product. This is RT latency*bandwidth/MTU/2 diff -Nru tor-0.2.0.34/contrib/Makefile.am tor-0.2.2.16-alpha/contrib/Makefile.am --- tor-0.2.0.34/contrib/Makefile.am 2008-05-15 07:20:50.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/Makefile.am 2010-02-02 21:40:22.000000000 +0000 @@ -3,10 +3,8 @@ confdir = $(sysconfdir)/tor -EXTRA_DIST = exitlist tor-tsocks.conf torify.1 tor.nsi.in tor.sh torctl rc.subr cross.sh tor-mingw.nsi.in package_nsis-mingw.sh tor.ico tor-ctrl.sh linux-tor-prio.sh tor-exit-notice.html +EXTRA_DIST = exitlist tor-tsocks.conf tor.nsi.in tor.sh torctl rc.subr cross.sh tor-mingw.nsi.in package_nsis-mingw.sh tor.ico tor-ctrl.sh linux-tor-prio.sh tor-exit-notice.html conf_DATA = tor-tsocks.conf bin_SCRIPTS = torify - -man_MANS = torify.1 diff -Nru tor-0.2.0.34/contrib/Makefile.in tor-0.2.2.16-alpha/contrib/Makefile.in --- tor-0.2.0.34/contrib/Makefile.in 2009-02-09 03:31:01.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/Makefile.in 2010-09-17 06:08:40.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -45,8 +45,7 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/orconfig.h CONFIG_CLEAN_FILES = tor.sh torctl torify tor.logrotate -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ - "$(DESTDIR)$(confdir)" +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(confdir)" binSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(bin_SCRIPTS) SOURCES = @@ -58,9 +57,6 @@ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive -man1dir = $(mandir)/man1 -NROFF = nroff -MANS = $(man_MANS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -74,8 +70,10 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -110,6 +108,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -118,7 +117,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -129,8 +130,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -184,10 +188,9 @@ SUBDIRS = osx suse DIST_SUBDIRS = osx suse confdir = $(sysconfdir)/tor -EXTRA_DIST = exitlist tor-tsocks.conf torify.1 tor.nsi.in tor.sh torctl rc.subr cross.sh tor-mingw.nsi.in package_nsis-mingw.sh tor.ico tor-ctrl.sh linux-tor-prio.sh tor-exit-notice.html +EXTRA_DIST = exitlist tor-tsocks.conf tor.nsi.in tor.sh torctl rc.subr cross.sh tor-mingw.nsi.in package_nsis-mingw.sh tor.ico tor-ctrl.sh linux-tor-prio.sh tor-exit-notice.html conf_DATA = tor-tsocks.conf bin_SCRIPTS = torify -man_MANS = torify.1 all: all-recursive .SUFFIXES: @@ -247,51 +250,6 @@ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done -install-man1: $(man1_MANS) $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ - done -uninstall-man1: - @$(NORMAL_UNINSTALL) - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ - done install-confDATA: $(conf_DATA) @$(NORMAL_INSTALL) test -z "$(confdir)" || $(MKDIR_P) "$(DESTDIR)$(confdir)" @@ -385,8 +343,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS @@ -411,8 +369,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ @@ -422,13 +380,12 @@ CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique @@ -486,10 +443,10 @@ done check-am: all-am check: check-recursive -all-am: Makefile $(SCRIPTS) $(MANS) $(DATA) +all-am: Makefile $(SCRIPTS) $(DATA) installdirs: installdirs-recursive installdirs-am: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(confdir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(confdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive @@ -534,7 +491,7 @@ info-am: -install-data-am: install-confDATA install-man +install-data-am: install-confDATA install-dvi: install-dvi-recursive @@ -544,7 +501,7 @@ install-info: install-info-recursive -install-man: install-man1 +install-man: install-pdf: install-pdf-recursive @@ -568,9 +525,7 @@ ps-am: -uninstall-am: uninstall-binSCRIPTS uninstall-confDATA uninstall-man - -uninstall-man: uninstall-man1 +uninstall-am: uninstall-binSCRIPTS uninstall-confDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip @@ -582,13 +537,12 @@ install-am install-binSCRIPTS install-confDATA install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-man1 install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-binSCRIPTS uninstall-confDATA \ - uninstall-man uninstall-man1 + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-binSCRIPTS uninstall-confDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff -Nru tor-0.2.0.34/contrib/osx/Makefile.am tor-0.2.2.16-alpha/contrib/osx/Makefile.am --- tor-0.2.0.34/contrib/osx/Makefile.am 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/Makefile.am 2009-05-18 23:47:00.000000000 +0000 @@ -2,11 +2,8 @@ # one from the top-level configure? -RD confdir = $(sysconfdir)/Tor -EXTRA_DIST = PrivoxyConfDesc.plist PrivoxyConfInfo.plist \ - ReadMe.rtf StartupParameters.plist Tor TorBundleDesc.plist.in \ +EXTRA_DIST = ReadMe.rtf StartupParameters.plist Tor TorBundleDesc.plist.in \ TorBundleInfo.plist.in TorBundleWelcome.rtf TorDesc.plist.in \ TorInfo.plist.in TorStartupDesc.plist.in TorStartupInfo.plist \ - package.sh privoxy.config TorPostflight addsysuser \ - Tor_Uninstaller.applescript uninstall_tor_bundle.sh \ - TorbuttonInfo.plist TorbuttonDesc.plist \ - package_list.txt tor_logo.gif TorPreFlight + package.sh TorPostflight addsysuser Tor_Uninstaller.applescript \ + uninstall_tor_bundle.sh package_list.txt tor_logo.gif TorPreFlight diff -Nru tor-0.2.0.34/contrib/osx/Makefile.in tor-0.2.2.16-alpha/contrib/osx/Makefile.in --- tor-0.2.0.34/contrib/osx/Makefile.in 2009-02-09 03:31:01.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/Makefile.in 2010-09-17 06:08:40.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -48,8 +48,10 @@ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -84,6 +86,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -92,7 +95,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -103,8 +108,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -159,14 +167,11 @@ # XXX Is this define necessary, or is it redundant with the # one from the top-level configure? -RD confdir = $(sysconfdir)/Tor -EXTRA_DIST = PrivoxyConfDesc.plist PrivoxyConfInfo.plist \ - ReadMe.rtf StartupParameters.plist Tor TorBundleDesc.plist.in \ +EXTRA_DIST = ReadMe.rtf StartupParameters.plist Tor TorBundleDesc.plist.in \ TorBundleInfo.plist.in TorBundleWelcome.rtf TorDesc.plist.in \ TorInfo.plist.in TorStartupDesc.plist.in TorStartupInfo.plist \ - package.sh privoxy.config TorPostflight addsysuser \ - Tor_Uninstaller.applescript uninstall_tor_bundle.sh \ - TorbuttonInfo.plist TorbuttonDesc.plist \ - package_list.txt tor_logo.gif TorPreFlight + package.sh TorPostflight addsysuser Tor_Uninstaller.applescript \ + uninstall_tor_bundle.sh package_list.txt tor_logo.gif TorPreFlight all: all-am diff -Nru tor-0.2.0.34/contrib/osx/package_list.txt tor-0.2.2.16-alpha/contrib/osx/package_list.txt --- tor-0.2.0.34/contrib/osx/package_list.txt 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/package_list.txt 2009-05-18 23:47:00.000000000 +0000 @@ -1,6 +1,2 @@ Tor -Privoxy torstartup -privoxyconf -Vidalia -torbutton diff -Nru tor-0.2.0.34/contrib/osx/package.sh tor-0.2.2.16-alpha/contrib/osx/package.sh --- tor-0.2.0.34/contrib/osx/package.sh 2008-12-02 22:41:46.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/package.sh 2009-11-17 20:37:01.000000000 +0000 @@ -1,13 +1,12 @@ #!/bin/sh -# $Id: package.sh 17361 2008-11-22 05:43:57Z phobos $ # Copyright 2004-2005 Nick Mathewson. # Copyright 2005-2007 Andrew Lewman -# Copyright 2008 The Tor Project +# Copyright 2008 The Tor Project, Inc. # See LICENSE in Tor distribution for licensing information. # This script builds a Macintosh OS X metapackage containing 2 packages: # - One for Tor. -# - One for Startup scripts for Tor. +# - One for Startup script for Tor. # # This script expects to be run from the toplevel makefile, with VERSION # set to the latest Tor version, and Tor already built. @@ -35,9 +34,9 @@ # the OS version OSVER=`/usr/bin/sw_vers | grep ProductVersion | cut -f2 | cut -d"." -f1,2` case "$OSVER" in - "10.6") ARCH="universal";; - "10.5") ARCH="universal";; - "10.4") ARCH="universal";; + "10.6") ARCH="i386";; + "10.5") ARCH="i386";; + "10.4") ARCH="i386";; "10.3") ARCH="ppc";; "10.2") ARCH="ppc";; "10.1") ARCH="ppc";; @@ -94,15 +93,7 @@ groff doc/tor.1.in -T ps -m man | pstopdf -i -o $DOC/tor-reference.pdf groff doc/tor-resolve.1 -T ps -m man | pstopdf -i -o $DOC/tor-resolve.pdf mkdir $DOC/Advanced -cp doc/spec/tor-spec.txt \ - doc/spec/rend-spec.txt \ - doc/spec/control-spec.txt \ - doc/spec/socks-extensions.txt \ - doc/spec/version-spec.txt \ - doc/spec/address-spec.txt \ - doc/spec/path-spec.txt \ - $DOC/Advanced - +cp doc/spec/*.txt $DOC/Advanced cp doc/HACKING $DOC/Advanced/HACKING.txt cp ChangeLog $DOC/Advanced/ChangeLog.txt diff -Nru tor-0.2.0.34/contrib/osx/PrivoxyConfDesc.plist tor-0.2.2.16-alpha/contrib/osx/PrivoxyConfDesc.plist --- tor-0.2.0.34/contrib/osx/PrivoxyConfDesc.plist 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/PrivoxyConfDesc.plist 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ - - - - - IFPkgDescriptionTitle - Privoxy configuration for Tor - IFPkgDescriptionVersion - 0.1 - - diff -Nru tor-0.2.0.34/contrib/osx/privoxy.config tor-0.2.2.16-alpha/contrib/osx/privoxy.config --- tor-0.2.0.34/contrib/osx/privoxy.config 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/privoxy.config 1970-01-01 00:00:00.000000000 +0000 @@ -1,1179 +0,0 @@ -# Sample Configuration File for Privoxy v3.0.6 -# -# $Id: privoxy.config 12134 2007-10-23 16:29:45Z phobos $ -# -# Copyright (C) 2001-2006 Privoxy Developers http://privoxy.org -# -#################################################################### -# # -# Table of Contents # -# # -# I. INTRODUCTION # -# II. FORMAT OF THE CONFIGURATION FILE # -# # -# 1. LOCAL SET-UP DOCUMENTATION # -# 2. CONFIGURATION AND LOG FILE LOCATIONS # -# 3. DEBUGGING # -# 4. ACCESS CONTROL AND SECURITY # -# 5. FORWARDING # -# 6. WINDOWS GUI OPTIONS # -# # -#################################################################### -# -# -# I. INTRODUCTION -# =============== -# -# This file holds the Privoxy configuration. If you modify this file, -# you will need to send a couple of requests (of any kind) to the -# proxy before any changes take effect. -# -# When starting Privoxy on Unix systems, give the name of this file as -# an argument. On Windows systems, Privoxy will look for this file -# with the name 'config.txt' in the same directory where Privoxy -# is installed. -# -# -# II. FORMAT OF THE CONFIGURATION FILE -# ==================================== -# -# Configuration lines consist of an initial keyword followed by a -# list of values, all separated by whitespace (any number of spaces -# or tabs). For example, -# -# actionsfile default.action -# -# Indicates that the actionsfile is named 'default.action'. -# -# The '#' indicates a comment. Any part of a line following a '#' -# is ignored, except if the '#' is preceded by a '\'. -# -# Thus, by placing a # at the start of an existing configuration line, -# you can make it a comment and it will be treated as if it weren't -# there. This is called "commenting out" an option and can be useful. -# -# Note that commenting out and option and leaving it at its default -# are two completely different things! Most options behave very -# differently when unset. See the the "Effect if unset" explanation -# in each option's description for details. -# -# Long lines can be continued on the next line by using a `\' as the -# last character. -# - -# -# 1. LOCAL SET-UP DOCUMENTATION -# ============================= -# -# If you intend to operate Privoxy for more users than just yourself, -# it might be a good idea to let them know how to reach you, what -# you block and why you do that, your policies, etc. -# - -# -# 1.1. user-manual -# ================ -# -# Specifies: -# -# Location of the Privoxy User Manual. -# -# Type of value: -# -# A fully qualified URI -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# http://www.privoxy.org/version/user-manual/ will be used, -# where version is the Privoxy version. -# -# Notes: -# -# The User Manual URI is the single best source of information on -# Privoxy, and is used for help links from some of the internal -# CGI pages. The manual itself is normally packaged with the -# binary distributions, so you probably want to set this to -# a locally installed copy. For multi-user setups, you could -# provide a copy on a local webserver for all your users and use -# the corresponding URL here. -# -# Examples: -# -# The best all purpose solution is simply to put the full local -# PATH to where the User Manual is located: -# -# user-manual /usr/share/doc/privoxy/user-manual -# -# The User Manual is then available to anyone with -# access to the proxy, by following the built-in URL: -# http://config.privoxy.org/user-manual/ (or the shortcut: -# http://p.p/user-manual/). -# -# If the documentation is not on the local system, it can be -# accessed from a remote server, as: -# -# user-manual http://example.com/privoxy/user-manual/ -# -# WARNING!!! -# -# If set, this option should be the first option in the config -# file, because it is used while the config file is being read. -# -#user-manual http://www.privoxy.org/user-manual/ - -# -# 1.2. trust-info-url -# =================== -# -# Specifies: -# -# A URL to be displayed in the error page that users will see if -# access to an untrusted page is denied. -# -# Type of value: -# -# URL -# -# Default value: -# -# Two example URL are provided -# -# Effect if unset: -# -# No links are displayed on the "untrusted" error page. -# -# Notes: -# -# The value of this option only matters if the experimental trust -# mechanism has been activated. (See trustfile above.) -# -# If you use the trust mechanism, it is a good idea to write -# up some on-line documentation about your trust policy and to -# specify the URL(s) here. Use multiple times for multiple URLs. -# -# The URL(s) should be added to the trustfile as well, so users -# don't end up locked out from the information on why they were -# locked out in the first place! -# -trust-info-url http://www.example.com/why_we_block.html -trust-info-url http://www.example.com/what_we_allow.html - -# -# 1.3. admin-address -# ================== -# -# Specifies: -# -# An email address to reach the proxy administrator. -# -# Type of value: -# -# Email address -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# No email address is displayed on error pages and the CGI user -# interface. -# -# Notes: -# -# If both admin-address and proxy-info-url are unset, the whole -# "Local Privoxy Support" box on all generated pages will not -# be shown. -# -#admin-address privoxy-admin@example.com - -# -# 1.4. proxy-info-url -# =================== -# -# Specifies: -# -# A URL to documentation about the local Privoxy setup, -# configuration or policies. -# -# Type of value: -# -# URL -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# No link to local documentation is displayed on error pages and -# the CGI user interface. -# -# Notes: -# -# If both admin-address and proxy-info-url are unset, the whole -# "Local Privoxy Support" box on all generated pages will not -# be shown. -# -# This URL shouldn't be blocked ;-) -# -#proxy-info-url http://www.example.com/proxy-service.html - -# -# 2. CONFIGURATION AND LOG FILE LOCATIONS -# ======================================= -# -# Privoxy can (and normally does) use a number of other files for -# additional configuration, help and logging. This section of the -# configuration file tells Privoxy where to find those other files. -# -# The user running Privoxy, must have read permission for all -# configuration files, and write permission to any files that would -# be modified, such as log files and actions files. -# - -# -# 2.1. confdir -# ============ -# -# Specifies: -# -# The directory where the other configuration files are located -# -# Type of value: -# -# Path name -# -# Default value: -# -# /etc/privoxy (Unix) or Privoxy installation dir (Windows) -# -# Effect if unset: -# -# Mandatory -# -# Notes: -# -# No trailing "/", please -# -# When development goes modular and multi-user, the blocker, -# filter, and per-user config will be stored in subdirectories of -# "confdir". For now, the configuration directory structure is -# flat, except for confdir/templates, where the HTML templates -# for CGI output reside (e.g. Privoxy's 404 error page). -# -confdir . - -# -# 2.2. logdir -# =========== -# -# Specifies: -# -# The directory where all logging takes place (i.e. where logfile -# and jarfile are located) -# -# Type of value: -# -# Path name -# -# Default value: -# -# /var/log/privoxy (Unix) or Privoxy installation dir (Windows) -# -# Effect if unset: -# -# Mandatory -# -# Notes: -# -# No trailing "/", please -# -logdir . - -# -# 2.3. actionsfile -# ================ -# -# Specifies: -# -# The actions file(s) to use -# -# Type of value: -# -# File name, relative to confdir, without the .action suffix -# -# Default values: -# -# standard # Internal purposes, no editing recommended -# -# default # Main actions file -# -# user # User customizations -# -# Effect if unset: -# -# No actions are taken at all. Simple neutral proxying. -# -# Notes: -# -# Multiple actionsfile lines are permitted, and are in fact -# recommended! -# -# The default values include standard.action, which is used -# for internal purposes and should be loaded, default.action, -# which is the "main" actions file maintained by the developers, -# and user.action, where you can make your personal additions. -# -# Actions files are where all the per site and per URL -# configuration is done for ad blocking, cookie management, -# privacy considerations, etc. There is no point in using Privoxy -# without at least one actions file. -# -actionsfile standard # Internal purpose, recommended -actionsfile default # Main actions file -actionsfile user # User customizations - -# -# 2.4. filterfile -# =============== -# -# Specifies: -# -# The filter file(s) to use -# -# Type of value: -# -# File name, relative to confdir -# -# Default value: -# -# default.filter (Unix) or default.filter.txt (Windows) -# -# Effect if unset: -# -# No textual content filtering takes place, i.e. all +filter{name} -# actions in the actions files are turned neutral. -# -# Notes: -# -# Multiple filterfile lines are permitted. -# -# The filter files contain content modification rules that use -# regular expressions. These rules permit powerful changes on -# the content of Web pages, and optionally the headers as well, -# e.g., you could disable your favorite JavaScript annoyances, -# re-write the actual displayed text, or just have some fun -# playing buzzword bingo with web pages. -# -# The +filter{name} actions rely on the relevant filter (name) -# to be defined in a filter file! -# -# A pre-defined filter file called default.filter that contains a -# number of useful filters for common problems is included in the -# distribution. See the section on the filter action for a list. -# -# It is recommended to place any locally adapted filters into a -# separate file, such as user.filter. -# -filterfile default.filter -#filterfile user.filter # User customizations - -# -# 2.5. logfile -# ============ -# -# Specifies: -# -# The log file to use -# -# Type of value: -# -# File name, relative to logdir -# -# Default value: -# -# logfile (Unix) or privoxy.log (Windows) -# -# Effect if unset: -# -# No log file is used, all log messages go to the console (STDERR). -# -# Notes: -# -# The logfile is where all logging and error messages are -# written. The level of detail and number of messages are set with -# the debug option (see below). The logfile can be useful for -# tracking down a problem with Privoxy (e.g., it's not blocking -# an ad you think it should block) but in most cases you probably -# will never look at it. -# -# Your logfile will grow indefinitely, and you will probably -# want to periodically remove it. On Unix systems, you can do -# this with a cron job (see "man cron"). For Red Hat, a logrotate -# script has been included. -# -# On SuSE Linux systems, you can place a line like -# "/var/log/privoxy.* +1024k 644 nobody.nogroup" in /etc/logfiles, -# with the effect that cron.daily will automatically archive, -# gzip, and empty the log, when it exceeds 1M size. -# -# Any log files must be writable by whatever user Privoxy is -# being run as (default on UNIX, user id is "privoxy"). -# -#logfile privoxy.log - -# -# 2.6. jarfile -# ============ -# -# Specifies: -# -# The file to store intercepted cookies in -# -# Type of value: -# -# File name, relative to logdir -# -# Default value: -# -# Unset (commented out). When activated: jarfile (Unix) or -# privoxy.jar (Windows) -# -# Effect if unset: -# -# Intercepted cookies are not stored in a dedicated log file. -# -# Notes: -# -# The jarfile may grow to ridiculous sizes over time. -# -# If debug 8 (show header parsing) is enabled, cookies are written -# to the logfile with the rest of the headers. -# -#jarfile jar.log - -# -# 2.7. trustfile -# ============== -# -# Specifies: -# -# The trust file to use -# -# Type of value: -# -# File name, relative to confdir -# -# Default value: -# -# Unset (commented out). When activated: trust (Unix) or trust.txt -# (Windows) -# -# Effect if unset: -# -# The entire trust mechanism is turned off. -# -# Notes: -# -# The trust mechanism is an experimental feature for building -# white-lists and should be used with care. It is NOT recommended -# for the casual user. -# -# If you specify a trust file, Privoxy will only allow access to -# sites that are specified in the trustfile. Sites can be listed -# in one of two ways: -# -# Prepending a ~ character limits access to this site only (and -# any sub-paths within this site), e.g. ~www.example.com. -# -# Or, you can designate sites as trusted referrers, by prepending -# the name with a + character. The effect is that access to -# untrusted sites will be granted -- but only if a link from this -# trusted referrer was used. The link target will then be added -# to the "trustfile" so that future, direct accesses will be -# granted. Sites added via this mechanism do not become trusted -# referrers themselves (i.e. they are added with a ~ designation). -# -# If you use the + operator in the trust file, it may grow -# considerably over time. -# -# It is recommended that Privoxy be compiled with the -# --disable-force, --disable-toggle and --disable-editor options, -# if this feature is to be used. -# -# Possible applications include limiting Internet access for -# children. -# -#trustfile trust - -# -# 3. DEBUGGING -# ============ -# -# These options are mainly useful when tracing a problem. Note that -# you might also want to invoke Privoxy with the --no-daemon command -# line option when debugging. -# - -# -# 3.1. debug -# ========== -# -# Specifies: -# -# Key values that determine what information gets logged to -# the logfile. -# -# Type of value: -# -# Integer values -# -# Default value: -# -# 12289 (i.e.: URLs plus informational and warning messages) -# -# Effect if unset: -# -# Nothing gets logged. -# -# Notes: -# -# The available debug levels are: -# -# debug 1 # show each GET/POST/CONNECT request -# debug 2 # show each connection status -# debug 4 # show I/O status -# debug 8 # show header parsing -# debug 16 # log all data into the logfile -# debug 32 # debug force feature -# debug 64 # debug regular expression filter -# debug 128 # debug fast redirects -# debug 256 # debug GIF de-animation -# debug 512 # Common Log Format -# debug 1024 # debug kill pop-ups -# debug 2048 # CGI user interface -# debug 4096 # Startup banner and warnings. -# debug 8192 # Non-fatal errors -# -# To select multiple debug levels, you can either add them or -# use multiple debug lines. -# -# A debug level of 1 is informative because it will show you each -# request as it happens. 1, 4096 and 8192 are highly recommended -# so that you will notice when things go wrong. The other levels -# are probably only of interest if you are hunting down a specific -# problem. They can produce a hell of an output (especially 16). -# -# The reporting of fatal errors (i.e. ones which crash Privoxy) -# is always on and cannot be disabled. -# -# If you want to use CLF (Common Log Format), you should set -# "debug 512" ONLY and not enable anything else. -# -#debug 1 # show each GET/POST/CONNECT request -debug 4096 # Startup banner and warnings -debug 8192 # Errors - *we highly recommended enabling this* - -# -# 3.2. single-threaded -# ==================== -# -# Specifies: -# -# Whether to run only one server thread -# -# Type of value: -# -# None -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Multi-threaded (or, where unavailable: forked) operation, -# i.e. the ability to serve multiple requests simultaneously. -# -# Notes: -# -# This option is only there for debug purposes and you should -# never need to use it. It will drastically reduce performance. -# -#single-threaded - -# -# 4. ACCESS CONTROL AND SECURITY -# ============================== -# -# This section of the config file controls the security-relevant -# aspects of Privoxy's configuration. -# - -# -# 4.1. listen-address -# =================== -# -# Specifies: -# -# The IP address and TCP port on which Privoxy will listen for -# client requests. -# -# Type of value: -# -# [IP-Address]:Port -# -# Default value: -# -# 127.0.0.1:8118 -# -# Effect if unset: -# -# Bind to 127.0.0.1 (localhost), port 8118. This is suitable and -# recommended for home users who run Privoxy on the same machine -# as their browser. -# -# Notes: -# -# You will need to configure your browser(s) to this proxy address -# and port. -# -# If you already have another service running on port 8118, or -# if you want to serve requests from other machines (e.g. on your -# local network) as well, you will need to override the default. -# -# If you leave out the IP address, Privoxy will bind to all -# interfaces (addresses) on your machine and may become reachable -# from the Internet. In that case, consider using access control -# lists (ACL's, see below), and/or a firewall. -# -# If you open Privoxy to untrusted users, you will also want -# to turn off the enable-edit-actions and enable-remote-toggle -# options! -# -# Example: -# -# Suppose you are running Privoxy on a machine which has the -# address 192.168.0.1 on your local private network (192.168.0.0) -# and has another outside connection with a different address. You -# want it to serve requests from inside only: -# -# listen-address 192.168.0.1:8118 -# -listen-address 127.0.0.1:8118 - -# -# 4.2. toggle -# =========== -# -# Specifies: -# -# Initial state of "toggle" status -# -# Type of value: -# -# 1 or 0 -# -# Default value: -# -# 1 -# -# Effect if unset: -# -# Act as if toggled on -# -# Notes: -# -# If set to 0, Privoxy will start in "toggled off" mode, -# i.e. behave like a normal, content-neutral proxy where all ad -# blocking, filtering, etc are disabled. See enable-remote-toggle -# below. This is not really useful anymore, since toggling is -# much easier via the web interface than via editing the conf file. -# -# The windows version will only display the toggle icon in the -# system tray if this option is present. -# -toggle 1 - -# -# 4.3. enable-remote-toggle -# ========================= -# -# Specifies: -# -# Whether or not the web-based toggle feature may be used -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 1 -# -# Effect if unset: -# -# The web-based toggle feature is disabled. -# -# Notes: -# -# When toggled off, Privoxy acts like a normal, content-neutral -# proxy, i.e. it acts as if none of the actions applied to -# any URL. -# -# For the time being, access to the toggle feature can not be -# controlled separately by "ACLs" or HTTP authentication, so that -# everybody who can access Privoxy (see "ACLs" and listen-address -# above) can toggle it for all users. So this option is not -# recommended for multi-user environments with untrusted users. -# -# Note that you must have compiled Privoxy with support for this -# feature, otherwise this option has no effect. -# -enable-remote-toggle 0 - -# -# 4.4. enable-remote-http-toggle -# ============================== -# -# Specifies: -# -# Whether or not Privoxy recognizes special HTTP headers to change -# its behaviour. -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 1 -# -# Effect if unset: -# -# Privoxy ignores special HTTP headers. -# -# Notes: -# -# When toggled on, the client can change Privoxy's behaviour by -# setting special HTTP headers. Currently the only supported -# special header is "X-Filter: No", to disable filtering for -# the ongoing request, even if it is enabled in one of the -# action files. -# -# If you are using Privoxy in a multi-user environment or with -# untrustworthy clients and want to enforce filtering, you will -# have to disable this option, otherwise you can ignore it. -# -enable-remote-http-toggle 0 - -# -# 4.5. enable-edit-actions -# ======================== -# -# Specifies: -# -# Whether or not the web-based actions file editor may be used -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 1 -# -# Effect if unset: -# -# The web-based actions file editor is disabled. -# -# Notes: -# -# For the time being, access to the editor can not be controlled -# separately by "ACLs" or HTTP authentication, so that everybody -# who can access Privoxy (see "ACLs" and listen-address above) -# can modify its configuration for all users. So this option is -# not recommended for multi-user environments with untrusted users. -# -# Note that you must have compiled Privoxy with support for this -# feature, otherwise this option has no effect. -# -enable-edit-actions 0 - -# -# 4.6. ACLs: permit-access and deny-access -# ======================================== -# -# Specifies: -# -# Who can access what. -# -# Type of value: -# -# src_addr[/src_masklen] [dst_addr[/dst_masklen]] -# -# Where src_addr and dst_addr are IP addresses in dotted decimal -# notation or valid DNS names, and src_masklen and dst_masklen are -# subnet masks in CIDR notation, i.e. integer values from 2 to 30 -# representing the length (in bits) of the network address. The -# masks and the whole destination part are optional. -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Don't restrict access further than implied by listen-address -# -# Notes: -# -# Access controls are included at the request of ISPs and systems -# administrators, and are not usually needed by individual -# users. For a typical home user, it will normally suffice to -# ensure that Privoxy only listens on the localhost (127.0.0.1) -# or internal (home) network address by means of the listen-address -# option. -# -# Please see the warnings in the FAQ that this proxy is not -# intended to be a substitute for a firewall or to encourage -# anyone to defer addressing basic security weaknesses. -# -# Multiple ACL lines are OK. If any ACLs are specified, then -# the Privoxy talks only to IP addresses that match at least one -# permit-access line and don't match any subsequent deny-access -# line. In other words, the last match wins, with the default -# being deny-access. -# -# If Privoxy is using a forwarder (see forward below) for a -# particular destination URL, the dst_addr that is examined is -# the address of the forwarder and NOT the address of the ultimate -# target. This is necessary because it may be impossible for the -# local Privoxy to determine the IP address of the ultimate target -# (that's often what gateways are used for). -# -# You should prefer using IP addresses over DNS names, because -# the address lookups take time. All DNS names must resolve! You -# can not use domain patterns like "*.org" or partial domain -# names. If a DNS name resolves to multiple IP addresses, only -# the first one is used. -# -# Denying access to particular sites by ACL may have undesired -# side effects if the site in question is hosted on a machine -# which also hosts other sites. -# -# Examples: -# -# Explicitly define the default behavior if no ACL and -# listen-address are set: "localhost" is OK. The absence of a -# dst_addr implies that all destination addresses are OK: -# -# permit-access localhost -# -# Allow any host on the same class C subnet as www.privoxy.org -# access to nothing but www.example.com: -# -# permit-access www.privoxy.org/24 www.example.com/32 -# -# Allow access from any host on the 26-bit subnet 192.168.45.64 -# to anywhere, with the exception that 192.168.45.73 may not -# access www.dirty-stuff.example.com: -# -# permit-access 192.168.45.64/26 -# deny-access 192.168.45.73 www.dirty-stuff.example.com -# - -# -# 4.7. buffer-limit -# ================= -# -# Specifies: -# -# Maximum size of the buffer for content filtering. -# -# Type of value: -# -# Size in Kbytes -# -# Default value: -# -# 4096 -# -# Effect if unset: -# -# Use a 4MB (4096 KB) limit. -# -# Notes: -# -# For content filtering, i.e. the +filter and +deanimate-gif -# actions, it is necessary that Privoxy buffers the entire document -# body. This can be potentially dangerous, since a server could -# just keep sending data indefinitely and wait for your RAM to -# exhaust -- with nasty consequences. Hence this option. -# -# When a document buffer size reaches the buffer-limit, it is -# flushed to the client unfiltered and no further attempt to filter -# the rest of the document is made. Remember that there may be -# multiple threads running, which might require up to buffer-limit -# Kbytes each, unless you have enabled "single-threaded" above. -# -buffer-limit 4096 - -# -# 5. FORWARDING -# ============= -# -# This feature allows routing of HTTP requests through a chain -# of multiple proxies. It can be used to better protect privacy -# and confidentiality when accessing specific domains by routing -# requests to those domains through an anonymous public proxy. -# Or to use a caching proxy to speed up browsing. Or chaining to -# a parent proxy may be necessary because the machine that Privoxy -# runs on has no direct Internet access. -# -# Also specified here are SOCKS proxies. Privoxy supports the SOCKS -# 4 and SOCKS 4A protocols. -# - -# -# 5.1. forward -# ============ -# -# Specifies: -# -# To which parent HTTP proxy specific requests should be routed. -# -# Type of value: -# -# target_pattern http_parent[:port] -# -# where target_pattern is a URL pattern that specifies to which -# requests (i.e. URLs) this forward rule shall apply. Use / -# to denote "all URLs". http_parent[:port] is the DNS name or -# IP address of the parent HTTP proxy through which the requests -# should be forwarded, optionally followed by its listening port -# (default: 8080). Use a single dot (.) to denote "no forwarding". -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Don't use parent HTTP proxies. -# -# Notes: -# -# If http_parent is ".", then requests are not forwarded to -# another HTTP proxy but are made directly to the web servers. -# -# Multiple lines are OK, they are checked in sequence, and the -# last match wins. -# -# Examples: -# -# Everything goes to an example anonymizing proxy, except SSL on -# port 443 (which it doesn't handle): -# -# forward / anon-proxy.example.org:8080 -# forward :443 . -# -# Everything goes to our example ISP's caching proxy, except for -# requests to that ISP's sites: -# -# forward / caching-proxy.example-isp.net:8000 -# forward .example-isp.net . -# - -# -# 5.2. forward-socks4 and forward-socks4a -# ======================================= -# -# Specifies: -# -# Through which SOCKS proxy (and to which parent HTTP proxy) -# specific requests should be routed. -# -# Type of value: -# -# target_pattern socks_proxy[:port] http_parent[:port] -# -# where target_pattern is a URL pattern that specifies to which -# requests (i.e. URLs) this forward rule shall apply. Use / to -# denote "all URLs". http_parent and socks_proxy are IP addresses -# in dotted decimal notation or valid DNS names (http_parent may -# be "." to denote "no HTTP forwarding"), and the optional port -# parameters are TCP ports, i.e. integer values from 1 to 64535 -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Don't use SOCKS proxies. -# -# Notes: -# -# Multiple lines are OK, they are checked in sequence, and the -# last match wins. -# -# The difference between forward-socks4 and forward-socks4a -# is that in the SOCKS 4A protocol, the DNS resolution of the -# target hostname happens on the SOCKS server, while in SOCKS 4 -# it happens locally. -# -# If http_parent is ".", then requests are not forwarded to another -# HTTP proxy but are made (HTTP-wise) directly to the web servers, -# albeit through a SOCKS proxy. -# -# Examples: -# -# From the company example.com, direct connections are made to all -# "internal" domains, but everything outbound goes through their -# ISP's proxy by way of example.com's corporate SOCKS 4A gateway -# to the Internet. -# -# forward-socks4a / socks-gw.example.com:1080 www-cache.example-isp.net:8080 -# forward .example.com . -# -# A rule that uses a SOCKS 4 gateway for all destinations but no -# HTTP parent looks like this: -# -# forward-socks4 / socks-gw.example.com:1080 . -# -# To chain Privoxy and Tor, both running on the same system, -# you should use the rule: -# -forward-socks4a / 127.0.0.1:9050 . - -# -# The public Tor network can't be used to reach your local network, -# therefore it's a good idea to make some exceptions: -# -# forward 192.168.*.*/ . -# forward 10.*.*.*/ . -# forward 127.*.*.*/ . -# -# Unencrypted connections to systems in these address ranges will -# be as (un)secure as the local network is, but the alternative is -# that you can't reach the network at all. -# -# If you also want to be able to reach servers in your local -# network by using their names, you will need additional -# exceptions that look like this: -# -# forward localhost/ . -# - -# -# 5.3. forwarded-connect-retries -# ============================== -# -# Specifies: -# -# How often Privoxy retries if a forwarded connection request -# fails. -# -# Type of value: -# -# Number of retries. -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Forwarded connections are treated like direct connections and -# no retry attempts are made. -# -# Notes: -# -# forwarded-connect-retries is mainly interesting for socks4a -# connections, where Privoxy can't detect why the connections -# failed. The connection might have failed because of a DNS timeout -# in which case a retry makes sense, but it might also have failed -# because the server doesn't exist or isn't reachable. In this -# case the retry will just delay the appearance of Privoxy's -# error message. -# -# Only use this option, if you are getting many forwarding related -# error messages, that go away when you try again manually. Start -# with a small value and check Privoxy's logfile from time to time, -# to see how many retries are usually needed. -# -# Examples: -# -# forwarded-connect-retries 1 -# -forwarded-connect-retries 0 - -# -# 6. WINDOWS GUI OPTIONS -# ====================== -# -# Privoxy has a number of options specific to the Windows GUI -# interface: -# - -# If "activity-animation" is set to 1, the Privoxy icon will animate -# when "Privoxy" is active. To turn off, set to 0. -# -#activity-animation 1 - -# If "log-messages" is set to 1, Privoxy will log messages to the -# console window: -# -log-messages 0 - -# If "log-buffer-size" is set to 1, the size of the log buffer, -# i.e. the amount of memory used for the log messages displayed in -# the console window, will be limited to "log-max-lines" (see below). -# -# Warning: Setting this to 0 will result in the buffer to grow -# infinitely and eat up all your memory! -# -#log-buffer-size 1 - -# log-max-lines is the maximum number of lines held in the log -# buffer. See above. -# -#log-max-lines 200 - -# If "log-highlight-messages" is set to 1, Privoxy will highlight -# portions of the log messages with a bold-faced font: -# -#log-highlight-messages 1 - -# The font used in the console window: -# -#log-font-name Comic Sans MS - -# Font size used in the console window: -# -#log-font-size 8 - -# "show-on-task-bar" controls whether or not Privoxy will appear as -# a button on the Task bar when minimized: -# -#show-on-task-bar 0 - -# If "close-button-minimizes" is set to 1, the Windows close button -# will minimize Privoxy instead of closing the program (close with -# the exit option on the File menu). -# -#close-button-minimizes 1 - -# The "hide-console" option is specific to the MS-Win console version -# of Privoxy. If this option is used, Privoxy will disconnect from -# and hide the command console. -# -#hide-console - -# diff -Nru tor-0.2.0.34/contrib/osx/PrivoxyConfInfo.plist tor-0.2.2.16-alpha/contrib/osx/PrivoxyConfInfo.plist --- tor-0.2.0.34/contrib/osx/PrivoxyConfInfo.plist 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/PrivoxyConfInfo.plist 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ - - - - - CFBundleIdentifier - Privoxy configuration for Tor - CFBundleGetInfoString - Privoxy configuration for Tor - CFBundleName - Privoxy configuration for Tor - CFBundleSortVersionString - 0.1 - IFPkgFlagAuthorizationAction - RootAuthorization - IFPkgFlagRestartAction - RecommendedRestart - IFPkgFlagFollowLinks - - IFPkgFlagIsRequired - - - diff -Nru tor-0.2.0.34/contrib/osx/Tor tor-0.2.2.16-alpha/contrib/osx/Tor --- tor-0.2.0.34/contrib/osx/Tor 2008-08-31 06:34:52.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/Tor 2009-11-17 20:37:01.000000000 +0000 @@ -25,9 +25,9 @@ # the OS version OSVER=`/usr/bin/sw_vers | grep ProductVersion | cut -f2 | cut -d"." -f1,2` case "$OSVER" in - "10.6") ARCH="universal";; - "10.5") ARCH="universal";; - "10.4") ARCH="universal";; + "10.6") ARCH="i386";; + "10.5") ARCH="i386";; + "10.4") ARCH="i386";; "10.3") ARCH="ppc";; "10.2") ARCH="ppc";; "10.1") ARCH="ppc";; @@ -37,7 +37,7 @@ ARCH="unknown" fi -if [ $ARCH != "universal" ]; then +if [ $ARCH != "i386" ]; then export EVENT_NOKQUEUE=1 fi diff -Nru tor-0.2.0.34/contrib/osx/TorBundleDesc.plist.in tor-0.2.2.16-alpha/contrib/osx/TorBundleDesc.plist.in --- tor-0.2.0.34/contrib/osx/TorBundleDesc.plist.in 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/TorBundleDesc.plist.in 2009-05-18 23:47:00.000000000 +0000 @@ -5,9 +5,9 @@ IFPkgDescriptionDeleteWarning IFPkgDescriptionDescription - Bundled package of Tor @VERSION@, Privoxy 3.0.6, and Torbutton. + Bundled package of Tor @VERSION@. IFPkgDescriptionTitle - Tor - Privoxy - Torbutton Bundle + Tor Expert Bundle IFPkgDescriptionVersion @VERSION@ diff -Nru tor-0.2.0.34/contrib/osx/TorBundleInfo.plist.in tor-0.2.2.16-alpha/contrib/osx/TorBundleInfo.plist.in --- tor-0.2.0.34/contrib/osx/TorBundleInfo.plist.in 2008-12-14 19:51:17.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/TorBundleInfo.plist.in 2009-05-18 23:47:00.000000000 +0000 @@ -7,7 +7,7 @@ CFBundleGetInfoString Tor Bundle @VERSION@ CFBundleIdentifier - net.freehaven.torbundle + org.torproject.torbundle CFBundleShortVersionString @VERSION@ IFPkgFlagComponentDirectory diff -Nru tor-0.2.0.34/contrib/osx/TorBundleWelcome.rtf tor-0.2.2.16-alpha/contrib/osx/TorBundleWelcome.rtf --- tor-0.2.0.34/contrib/osx/TorBundleWelcome.rtf 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/TorBundleWelcome.rtf 2009-05-18 23:47:00.000000000 +0000 @@ -5,14 +5,10 @@ \paperw11900\paperh16840\margl1440\margr1440\vieww9000\viewh9000\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural -\f0\fs24 \cf0 Welcome to Tor - Privoxy - Torbutton Bundle installer.\ -This will install Tor, Privoxy, and Torbutton in your computer.\ +\f0\fs24 \cf0 Welcome to the Tor Expert installer.\ +This will install Tor in your computer.\ \ -\f1\i Tor, Privoxy, and Torbutton are separate products.\ -They are packaged together for your convenience. -\f2\i0\b \ - \f0\b0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural @@ -22,17 +18,3 @@ \ For more information, please visit https://www.torproject.org/\ \ - -\f2\b Privoxy -\f0\b0 stands between your web browser and Tor to make your web surfing experience safer.\ -\ - For more information, please visit http://www.privoxy.org/\ -\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural - -\f2\b \cf0 Torbutton -\f0\b0 is a 1-click way for Firefox users to enable or disable the browser's use of Tor. -\f1\i Torbutton will not install if you do not have Firefox installed. -\f0\i0 \ -\ - For more information, please visit https://torbutton.torproject.org/} diff -Nru tor-0.2.0.34/contrib/osx/TorbuttonDesc.plist tor-0.2.2.16-alpha/contrib/osx/TorbuttonDesc.plist --- tor-0.2.0.34/contrib/osx/TorbuttonDesc.plist 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/TorbuttonDesc.plist 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ - - - - - IFPkgDescriptionTitle - Torbutton Extension for Firefox - IFPkgDescriptionVersion - 0.1 - - diff -Nru tor-0.2.0.34/contrib/osx/TorbuttonInfo.plist tor-0.2.2.16-alpha/contrib/osx/TorbuttonInfo.plist --- tor-0.2.0.34/contrib/osx/TorbuttonInfo.plist 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/TorbuttonInfo.plist 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ - - - - - CFBundleIdentifier - Torbutton Extension for Firefox - CFBundleGetInfoString - Torbutton configuration for Tor - CFBundleName - Torbutton configuration for Tor - CFBundleSortVersionString - 0.1 - IFPkgFlagAuthorizationAction - RootAuthorization - IFPkgFlagRestartAction - RecommendedRestart - IFPkgFlagFollowLinks - - IFPkgFlagIsRequired - - - diff -Nru tor-0.2.0.34/contrib/osx/TorPostflight tor-0.2.2.16-alpha/contrib/osx/TorPostflight --- tor-0.2.0.34/contrib/osx/TorPostflight 2008-11-11 21:25:02.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/TorPostflight 2009-05-18 23:47:00.000000000 +0000 @@ -3,6 +3,7 @@ # TorPostFlight is distributed under this license # # Copyright (c) 2006 Andrew Lewman +# Copyright (c) 2008 The Tor Project # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are @@ -46,7 +47,6 @@ TARGET=$2/Library/Tor TORDIR=$TARGET/var/lib/tor LOGFILE=/var/log/tor.log -TORBUTTON_VERSION="1.2.0-fx" # Check defaults for TARGET if [ "$TARGET" == "//Library/Tor" ]; then @@ -97,10 +97,6 @@ MAN1=$TARGET/share/man/man1 #ln -sf $MAN1/*.1 . -if [ -d /Library/StartupItems/Privoxy ]; then - find /Library/StartupItems/Privoxy -print0 | xargs -0 chown root:wheel -fi - # Copy Documentation if [ -d $PACKAGE_PATH/Contents/Resources/documents ];then cp -r $PACKAGE_PATH/Contents/Resources/documents $TARGET/documents @@ -125,12 +121,3 @@ rm -f /Library/StartupItems/Tor/Tor.loc echo "$TARGET" > /Library/StartupItems/Tor/Tor.loc fi - -# This only works if the user installing us is an Admin user. -# Otherwise, this will silently fail to install torbutton in firefox. -if [ -f /Applications/Firefox.app/Contents/MacOS/firefox ]; then - if [ -f /Library/Torbutton/torbutton-$TORBUTTON_VERSION.xpi ]; then -# Open firefox with a prompt to install the torbutton xpi - su $USER open -a /Applications/Firefox.app /Library/Torbutton/torbutton-$TORBUTTON_VERSION.xpi - fi -fi diff -Nru tor-0.2.0.34/contrib/osx/TorPreFlight tor-0.2.2.16-alpha/contrib/osx/TorPreFlight --- tor-0.2.0.34/contrib/osx/TorPreFlight 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/TorPreFlight 2009-05-18 23:47:00.000000000 +0000 @@ -5,6 +5,7 @@ # TorPreFlight is distributed under this license: # # Copyright (c) 2006 Andrew Lewman +# Copyright (c) 2008 The Tor Project, Inc. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are @@ -44,16 +45,7 @@ TORPATH="/Library/Tor/" fi -if [ -f /Library/StartupItems/Privoxy/Privoxy.loc ]; then - PRIVOXYPATH=`cat /Library/StartupItems/Privoxy/Privoxy.loc` -else - PRIVOXYPATH="/Library/Privoxy/" -fi - # Backup all of Tor, just in case if [ -d $TORPATH ]; then cp $TORPATH/torrc $TORPATH/torrc.installer-saved - cp $PRIVOXYPATH/config $PRIVOXYPATH/config.installer-saved - cp $PRIVOXYPATH/user.action $PRIVOXYPATH/user.action.installer-saved fi - diff -Nru tor-0.2.0.34/contrib/osx/uninstall_tor_bundle.sh tor-0.2.2.16-alpha/contrib/osx/uninstall_tor_bundle.sh --- tor-0.2.0.34/contrib/osx/uninstall_tor_bundle.sh 2008-12-14 19:51:16.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/osx/uninstall_tor_bundle.sh 2009-10-10 19:34:24.000000000 +0000 @@ -134,7 +134,7 @@ ## clean up echo ". Cleaning up" rm -rf $TEMP_BOM_CONTENTS -rm -rf /Library/Privoxy/ /Library/StartupItems/Privoxy/ /Library/Tor/ /Library/StartupItems/Tor/ /Library/Torbutton/ +rm -rf /Library/Privoxy/ /Library/StartupItems/Privoxy/ /Library/Tor/ /Library/StartupItems/Tor/ /Library/Torbutton/ /Library/Receipts/Privoxy.pkg /Library/Receipts/torbutton.pkg /Library/Receipts/Tor.pkg /Library/Receipts/Vidalia.pkg /Library/Receipts/TorStartup.pkg echo ". Finished" diff -Nru tor-0.2.0.34/contrib/package_nsis-mingw.sh tor-0.2.2.16-alpha/contrib/package_nsis-mingw.sh --- tor-0.2.0.34/contrib/package_nsis-mingw.sh 2008-06-03 19:33:25.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/package_nsis-mingw.sh 2010-04-24 00:30:51.000000000 +0000 @@ -58,6 +58,7 @@ cp src/tools/tor-resolve.exe win_tmp/bin/ cp contrib/tor.ico win_tmp/bin/ cp src/config/geoip win_tmp/bin/ +strip win_tmp/bin/*.exe # There is no man2html in mingw. # Maybe we should add this into make dist instead. @@ -73,17 +74,15 @@ perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg; s{\@LOCALSTATEDIR\@/(lib|log)/tor/}{C:\\Documents and Settings\\Application Data\\Tor\\}' $1 >$2 } -for fn in address-spec.txt control-spec.txt control-spec-v0.txt dir-spec.txt dir-spec-v1.txt path-spec.txt rend-spec.txt socks-extensions.txt tor-spec.txt version-spec.txt; do +for fn in address-spec.txt bridges-spec.txt control-spec.txt dir-spec.txt path-spec.txt rend-spec.txt socks-extensions.txt tor-spec.txt version-spec.txt; do clean_newlines doc/spec/$fn win_tmp/doc/spec/$fn done -cp doc/design-paper/tor-design.pdf win_tmp/doc/design-paper/tor-design.pdf - -for fn in HACKING tor-reference.html tor-resolve.html; do +for fn in HACKING tor-gencert.html tor.html torify.html tor-resolve.html; do clean_newlines doc/$fn win_tmp/doc/$fn done -for fn in README AUTHORS ChangeLog LICENSE; do +for fn in README ChangeLog LICENSE; do clean_newlines $fn win_tmp/$fn done diff -Nru tor-0.2.0.34/contrib/rc.subr tor-0.2.2.16-alpha/contrib/rc.subr --- tor-0.2.0.34/contrib/rc.subr 2008-11-12 10:47:38.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/rc.subr 2009-11-17 20:37:01.000000000 +0000 @@ -1,5 +1,4 @@ #!/bin/sh -# $Id: rc.subr 17255 2008-11-12 01:10:21Z sjm217 $ # $FreeBSD: ports/security/tor-devel/files/tor.in,v 1.1 2006/02/17 22:21:25 mnag Exp $ # # (rc.subr written by Peter Thoenen for Net/FreeBSD) diff -Nru tor-0.2.0.34/contrib/suse/Makefile.in tor-0.2.2.16-alpha/contrib/suse/Makefile.in --- tor-0.2.0.34/contrib/suse/Makefile.in 2009-02-09 03:31:01.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/suse/Makefile.in 2010-09-17 06:08:40.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -45,8 +45,10 @@ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -81,6 +83,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -89,7 +92,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -100,8 +105,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ diff -Nru tor-0.2.0.34/contrib/tor-exit-notice.html tor-0.2.2.16-alpha/contrib/tor-exit-notice.html --- tor-0.2.0.34/contrib/tor-exit-notice.html 2008-05-15 07:32:13.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/tor-exit-notice.html 2010-03-09 02:59:36.000000000 +0000 @@ -1,5 +1,9 @@ - + + + + This is a Tor Exit Router - + -

This is a Tor Exit Router

+

This is a +Tor Exit Router

-

Most likely you are accessing this website because you had some issue with +

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

+ + + + +

+ +How Tor works +

+ +

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

- -While Tor is not designed for malicious computer users, it is inevitable that -some may use the network for malicious ends. In the mind of this operator, -the social need for easily accessible censorship-resistant anonymous -communication trumps the risk. Tor sees use by many important segments of the -population, including whistle blowers, journalists, Chinese dissidents -skirting the Great Firewall and oppressive censorship, abuse victims, -stalker targets, the US military, and law enforcement, just to name a few. - -

- - -

-
- -

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

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

+seize this router will accomplish nothing.

- + +

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

+machine.

+ fact reported DMCA harassment... --> +

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

-

For more information, please consult the following documentation: +

For more information, please consult the following documentation:

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

+

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

-

You also have the option of blocking this IP address and others on +

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

- diff -Nru tor-0.2.0.34/contrib/torify.1 tor-0.2.2.16-alpha/contrib/torify.1 --- tor-0.2.0.34/contrib/torify.1 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/torify.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -.TH torify 1 "" Feb-2004 "" -.\" manual page by Peter Palfrader -.SH NAME -.LP -torify \- wrapper for tsocks and tor - -.SH SYNOPSIS -\fBtorify\fP\ \fIapplication\fP\ [\fIapplication's\ arguments\fP] - -.SH DESCRIPTION -\fBtorify\fR is a simple wrapper that calls tsocks with a tor specific -configuration file. - -tsocks itself is a wrapper between the tsocks library and the application -that you would like to run socksified. - -Please note that since tsocks uses LD_PRELOAD, torify cannot be applied -to suid binaries. - -.SH SEE ALSO -.BR tor (1), -.BR tsocks (1), -.BR tsocks.conf (5). diff -Nru tor-0.2.0.34/contrib/torify.in tor-0.2.2.16-alpha/contrib/torify.in --- tor-0.2.0.34/contrib/torify.in 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/torify.in 2009-11-17 20:37:01.000000000 +0000 @@ -3,43 +3,69 @@ # Wrapper script for use of the tsocks(8) transparent socksification library # See the tsocks(1) and torify(1) manpages. -# Copyright (c) 2004, 2006 Peter Palfrader +# Copyright (c) 2004, 2006, 2009 Peter Palfrader # Modified by Jacob Appelbaum April 16th 2006 # May be distributed under the same terms as Tor itself +# taken from Debian's Developer's Reference, 6.4 +pathfind() { + OLDIFS="$IFS" + IFS=: + for p in $PATH; do + if [ -x "$p/$*" ]; then + IFS="$OLDIFS" + return 0 + fi + done + IFS="$OLDIFS" + return 1 +} -# Define and ensure we have tsocks -# XXX: what if we don't have which? -TSOCKS="`which tsocks`" -if [ ! -x "$TSOCKS" ] -then - echo "$0: Can't find tsocks in PATH. Perhaps you haven't installed it?" >&2 - exit 1 +# Check for any argument list +if [ "$#" = 0 ]; then + echo "Usage: $0 [-hv] [...]" >&2 + exit 1 fi -# Check for any argument list -if [ "$#" = 0 ] -then - echo "Usage: $0 [...]" >&2 - exit 1 +if [ "$#" = 1 ] && ( [ "$1" = "-h" ] || [ "$1" = "--help" ] ); then + echo "Usage: $0 [-hv] [...]" + exit 0 fi -if [ "$#" = 1 ] && ( [ "$1" = "-h" ] || [ "$1" = "--help" ] ) -then - echo "Usage: $0 [...]" - exit 0 + +if [ "$1" = "-v" ] || [ "$1" = "--verbose" ]; then + verbose=1 + shift 1 +else + verbose=0 fi -# Define our tsocks config file -TSOCKS_CONF_FILE="@CONFDIR@/tor-tsocks.conf" -export TSOCKS_CONF_FILE - -# Check that we've got a tsocks config file -if [ -r "$TSOCKS_CONF_FILE" ] -then - exec tsocks "$@" - echo "$0: Failed to exec tsocks $@" >&2 +if pathfind torsocks; then + ! [ "$verbose" -ge 1 ] || echo "Using torsocks as socksifier." >&2 + + exec torsocks "$@" + echo "$0: Failed to exec torsocks $@" >&2 exit 1 + +elif pathfind tsocks; then + ! [ "$verbose" -ge 1 ] || echo "Using tsocks as socksifier." >&2 + + # Define our tsocks config file + TSOCKS_CONF_FILE="/etc/tor/tor-tsocks.conf" + export TSOCKS_CONF_FILE + + # Check that we've got a tsocks config file + if [ -r "$TSOCKS_CONF_FILE" ] + then + echo "WARNING: tsocks is known to leak DNS and UDP data. If you had torsocks we would use that." >&2 + exec tsocks "$@" + echo "$0: Failed to exec tsocks $@" >&2 + exit 1 + else + echo "$0: Missing tsocks configuration file \"$TSOCKS_CONF_FILE\"." >&2 + exit 1 + fi + else - echo "$0: Missing tsocks configuration file \"$TSOCKS_CONF_FILE\"." >&2 + echo "$0: Can't find either tsocks or torsocks in your PATH. Perhaps you haven't installed either?" >&2 exit 1 fi diff -Nru tor-0.2.0.34/contrib/tor.logrotate.in tor-0.2.2.16-alpha/contrib/tor.logrotate.in --- tor-0.2.0.34/contrib/tor.logrotate.in 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/tor.logrotate.in 2009-05-18 23:47:00.000000000 +0000 @@ -5,6 +5,8 @@ delaycompress missingok notifempty + # you may need to change the username/groupname below + create 0640 _tor _tor sharedscripts postrotate /etc/init.d/tor reload > /dev/null diff -Nru tor-0.2.0.34/contrib/tor-mingw.nsi.in tor-0.2.2.16-alpha/contrib/tor-mingw.nsi.in --- tor-0.2.0.34/contrib/tor-mingw.nsi.in 2009-02-09 03:27:00.000000000 +0000 +++ tor-0.2.2.16-alpha/contrib/tor-mingw.nsi.in 2010-09-17 06:08:30.000000000 +0000 @@ -8,8 +8,7 @@ !include "LogicLib.nsh" !include "FileFunc.nsh" !insertmacro GetParameters - -!define VERSION "0.2.0.34" +!define VERSION "0.2.2.16-alpha" !define INSTALLER "tor-${VERSION}-win32.exe" !define WEBSITE "https://www.torproject.org/" !define LICENSE "LICENSE" @@ -30,7 +29,7 @@ VIAddVersionKey "ProductName" "The Onion Router: Tor" VIAddVersionKey "Comments" "${WEBSITE}" VIAddVersionKey "LegalTrademarks" "Three line BSD" -VIAddVersionKey "LegalCopyright" "©2004-2008, Roger Dingledine, Nick Mathewson" +VIAddVersionKey "LegalCopyright" "©2004-2008, Roger Dingledine, Nick Mathewson. ©2009 The Tor Project, Inc. " VIAddVersionKey "FileDescription" "Tor is an implementation of Onion Routing. You can read more at ${WEBSITE}" VIAddVersionKey "FileVersion" "${VERSION}" @@ -171,10 +170,9 @@ Function ExtractSpecs File "..\doc\HACKING" File "..\doc\spec\address-spec.txt" + File "..\doc\spec\bridges-spec.txt" File "..\doc\spec\control-spec.txt" - File "..\doc\spec\control-spec-v0.txt" File "..\doc\spec\dir-spec.txt" - File "..\doc\spec\dir-spec-v1.txt" File "..\doc\spec\path-spec.txt" File "..\doc\spec\rend-spec.txt" File "..\doc\spec\socks-extensions.txt" @@ -183,17 +181,14 @@ FunctionEnd Function ExtractHTML + File "..\doc\tor.html" + File "..\doc\torify.html" File "..\doc\tor-resolve.html" - File "..\doc\tor-reference.html" -FunctionEnd - -Function ExtractDesignDocs - File "..\doc\design-paper\tor-design.pdf" + File "..\doc\tor-gencert.html" FunctionEnd Function ExtractReleaseDocs File "..\README" - File "..\AUTHORS" File "..\ChangeLog" File "..\LICENSE" FunctionEnd @@ -202,7 +197,6 @@ SetOutPath "$INSTDIR\Documents" Call ExtractSpecs Call ExtractHTML - Call ExtractDesignDocs Call ExtractReleaseDocs FunctionEnd @@ -216,6 +210,7 @@ Delete "$INSTDIR\tor.ico" Delete "$SMSTARTUP\Tor.lnk" Delete "$INSTDIR\Uninstall.exe" + Delete "$INSTDIR\geoip" FunctionEnd Function un.InstallDirectories @@ -248,9 +243,16 @@ Function CreateDocLinks CreateDirectory "$SMPROGRAMS\Tor\Documents" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Manual.lnk" "$INSTDIR\Documents\tor-reference.html" CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Documentation.lnk" "$INSTDIR\Documents" CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Specification.lnk" "$INSTDIR\Documents\tor-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Address Specification.lnk" "$INSTDIR\Documents\address-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Bridges Specification.lnk" "$INSTDIR\Documents\bridges-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Control Specification.lnk" "$INSTDIR\Documents\control-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Directory Specification.lnk" "$INSTDIR\Documents\dir-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Path Specification.lnk" "$INSTDIR\Documents\path-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Rend Specification.lnk" "$INSTDIR\Documents\rend-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Version Specification.lnk" "$INSTDIR\Documents\version-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor SOCKS Extensions.lnk" "$INSTDIR\Documents\socks-extensions.txt" FunctionEnd Function ParseCmdLine diff -Nru tor-0.2.0.34/debian/changelog tor-0.2.2.16-alpha/debian/changelog --- tor-0.2.0.34/debian/changelog 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/changelog 2010-09-25 18:36:42.000000000 +0000 @@ -1,65 +1,375 @@ -tor (0.2.0.34-1ubuntu1) jaunty; urgency=low +tor (0.2.2.16-alpha-1~ppa1~hardy1) lucid; urgency=low - * Merge from Debian unstable, remaining Ubuntu change: - - debian/rules: invoke "dh_shlibdeps -- -xglibc-private" to avoid unmet - dependency with glibc-private if linked with glibc >= 2.8 + * Backport to Hardybleed ppa. - -- Devid Antonio Filoni Thu, 12 Feb 2009 15:09:46 +0100 + -- Nicola Ferralis Sat, 25 Sep 2010 20:33:32 +0200 -tor (0.2.0.34-1) unstable; urgency=high +tor (0.2.2.16-alpha-1~hardy+1) experimental-hardy-backport; urgency=low - * New upstream version: + * Build for hardy. + * Conflict with libssl0.9.8 (<< 0.9.8g-4ubuntu3.1) on hardy + * Replace hardening-includes use with hardening-wrapper. + + -- Peter Palfrader Sat, 18 Sep 2010 19:54:15 +0200 + +tor (0.2.2.16-alpha-1) experimental; urgency=low + + * New upstream version. + * Downgrade torsocks/tsocks dependency to a recommends. That tool + is not needed if you only run a relay, or if you access Tor only + using polipo or privoxy. The torify(1) wrapper that makes use + of torsocks or tsocks already handles their absense and emmits a + proper message telling the user what they are missing (closes: #595898). + * Remove suggests of mixminion which is no longer in the archive + (closes: #594207), and also of anon-proxy which appears to not + have been updated in at least two years. + * Add xul-ext-torbutton to suggests. + + -- Peter Palfrader Sat, 18 Sep 2010 19:49:23 +0200 + +tor (0.2.2.15-alpha-1) experimental; urgency=low + + * New upstream version. + * Forward port 06_add_compile_time_defaults. + + -- Peter Palfrader Sat, 21 Aug 2010 10:39:41 +0200 + +tor (0.2.2.14-alpha-1) experimental; urgency=low + + * New upstream version. + Among many other things: + - New config option "WarnUnsafeSocks 0" disables the warning that + occurs whenever Tor receives only an IP address instead of a + hostname. Setups that do DNS locally over Tor are fine, and we + shouldn't spam the logs in that case. (Closes: #497466) + + -- Peter Palfrader Thu, 15 Jul 2010 14:41:10 +0200 + +tor (0.2.2.13-alpha-1) experimental; urgency=low + + * New upstream version. + + -- Peter Palfrader Sat, 24 Apr 2010 12:12:11 +0200 + +tor (0.2.2.12-alpha-1) experimental; urgency=low + + * New upstream version. + + -- Peter Palfrader Tue, 20 Apr 2010 12:23:00 +0200 + +tor (0.2.2.11-alpha-1) experimental; urgency=low + + * New upstream version. + + -- Peter Palfrader Sat, 17 Apr 2010 21:49:19 +0200 + +tor (0.2.2.10-alpha-2) experimental; urgency=low + + * In /etc/default/tor also source /etc/default/tor.vidalia if it exists + and if vidalia is installed. We do this so that the vidalia package + can override some of our settings: People who have vidalia installed might + not want to run Tor as a system service. The vidalia .deb can ask them + that and then set run-daemon to no. + + -- Peter Palfrader Sat, 03 Apr 2010 15:24:11 +0200 + +tor (0.2.2.10-alpha-1) experimental; urgency=low + + * New upstream version. + * debian/rules: + - make manpage building properly depend on patch-stamp, + - Fix building in the absence of a debian/micro-revision.i file. + + -- Peter Palfrader Tue, 09 Mar 2010 14:06:48 +0100 + +tor (0.2.2.9-alpha-1) experimental; urgency=low + + * New upstream version. + - We no longer need to build-depend on a recent libssl-dev because + Tor now detects whether we need to explicitly turn on + autonegotiation at run-time rather than compile time. Good. + (This also means we no longer need to conflict with newer + libssls when we built against an old one on backports.) + - The manpages are now built with asciidoc. While the upstream + tarball already ships with the output of asciidoc, we instead + build the manpages during package build time so we can patch them. + + Therefore build-depend on asciidoc (>= 8.2), docbook-xml, + docbook-xsl, and xmlto. + + update 03_tor_manpage_in_section_8 to patch the .txt files now. + + Remove tor.1.in torify.1.in tor-gencert.1.in tor-resolve.1.in in + the doc directory during clean. + + And try to work around missing (and if it wasn't, broken) + build-system for the manpages. + + The torify.1 manpage gets installed by upstream, no longer need + to do it manually in debian/rules. + - The original design paper is no longer shipped with Tor. + + Remove debian/hexdump-*.pdf (which we used to work around + fig2dev bugs). + + No longer build the paper in debian/rules, and remove it from + debian/tor.docs. + + No longer build-depend on texlive-base-bin, texlive-latex-base, + texlive-fonts-recommended, transfig and ghostscript. + - Upstream tarballs no longer ship an AUTHORS file, or the website, + Removed these from debian/tor.docs. No longer shipping parts of + the website also closes: #443560. + - Also no longer distribute doc/TODO and doc/HACKING in the debian + package. + * Move from comm to section net, where it might fit slightly better + (closes: #482801). + * Ship contrib/tor-exit-notice.html in the tor package (put it into + usr/share/doc/tor; closes: #568934). + * Add stark README.polipo with the instructions from Juliusz Chroboczek. + (closes: #413730) + * 0.2.2.4-alpha failed to ship test.h so we had included it in the + debian diff. The upstream bug has long since been fixed so we should + probably stop shipping our own copy of test.h. + * Finally apply Peter Eisentraut's patch for tor's init script to support + status as an argument (closes: #526371). + + -- Peter Palfrader Sun, 28 Feb 2010 10:58:10 +0100 + +tor (0.2.2.8-alpha-1) experimental; urgency=low + + * New upstream version. + + -- Peter Palfrader Fri, 29 Jan 2010 23:22:35 +0100 + +tor (0.2.2.7-alpha-2) experimental; urgency=low + + * debian/rules: Minor cleanup (use a single variable for making up our + configure flags, not two). + * debian/rules: Remove logic that ignores the result of unit tests if + localhost does not resolve (or not to 127.0.0.1). This should no + longer be necessary as our build chroots have gotten a lot better. + * Depend on and enable hardening-includes for building. + + -- Peter Palfrader Sun, 24 Jan 2010 13:22:26 +0100 + +tor (0.2.2.7-alpha-1) experimental; urgency=medium + + * New upstream version. + - Rotate keys (both v3 identity and relay identity) for moria1 + and gabelmoo. + [and more] + + -- Peter Palfrader Wed, 20 Jan 2010 19:29:08 +0100 + +tor (0.2.2.6-alpha-1) experimental; urgency=low + + * New upstream version. + - Drop debian/patches/0a58567c-work-with-reneg-ssl.dpatch + (part of upstream). + + -- Peter Palfrader Mon, 23 Nov 2009 18:52:04 +0100 + +tor (0.2.2.5-alpha-1) experimental; urgency=low + + * New upstream version. + * Pick 0a58567ce3418f410cf1dd0143dd3e56b4a4bd1f from master git tree: + - work with libssl that has renegotiation disabled by default. + (debian/patches/0a58567c-work-with-reneg-ssl.dpatch) + * Therefore build-depend on libssl-dev >= 0.9.8k-6. If we build against + earlier versions we will not work once libssl gets upgraded to a version + that disabled renegotiations. + * Change order of recommends from privoxy | polipo to polipo | privoxy. + * Allegedly echo -e is a bashism. Remove it from debian/rules, we don't + need it anyways (closes: #478631). + * Change the dependency on tsocks to torsocks | tsocks (see: #554717). + + -- Peter Palfrader Sun, 15 Nov 2009 11:04:02 +0100 + +tor (0.2.2.4-alpha-1) experimental; urgency=low + + * New upstream version. + * The testsuite moved from src/or/test to src/test/test, + but let's call it using "make check" now. + * Upstream failed to ship src/test/test.h. Ship it in debian/ and + manually copy it in place during configure and clean up in clean. + Let's not use the patch system as this will most likely be rectified + by next release. + + -- Peter Palfrader Sun, 11 Oct 2009 10:38:55 +0200 + +tor (0.2.2.3-alpha-1) experimental; urgency=low + + * New upstream version. + + -- Peter Palfrader Wed, 23 Sep 2009 10:27:40 +0200 + +tor (0.2.2.2-alpha-1) experimental; urgency=low + + * New upstream version. + * The files src/common/common_sha1.i src/or/or_sha1.i get changed + during the build - they contain the checksums of the individual + files that end up in the binary. Of couse changes only end up + in the debian diff.gz after building a second time in the same + directory. So, remove those files in clean to get both a cleaner + diff.gz and idempotent builds. + * If we have a debian/micro-revision.i, replace the one in src/or + with our copy so that this will be the revision that ends up in + the binary. This is an informational only version string, but + it'd be kinda nice if it was (more) accurate nonetheless. + . + Of course this won't help if people manually patch around but + it's still preferable to claiming we are exactly upstream's source. + . + If we are building directly out of a git tree, update + debian/micro-revision.i in the clean target. + + -- Peter Palfrader Mon, 21 Sep 2009 14:51:20 +0200 + +tor (0.2.2.1-alpha-1) experimental; urgency=low + + * New upstream version. + * Forward port patches/03_tor_manpage_in_section_8.dpatch. + * Forward port patches/06_add_compile_time_defaults.dpatch. + + -- Peter Palfrader Thu, 03 Sep 2009 15:10:26 +0200 + +tor (0.2.1.19-1) unstable; urgency=low + + * New upstream version. + - Make accessing hidden services on 0.2.1.x work right (closes: #538960). + [More items are in the upstream changelog.] + + -- Peter Palfrader Wed, 29 Jul 2009 12:49:03 +0200 + +tor (0.2.1.18-1) unstable; urgency=low + + * New upstream version. + + -- Peter Palfrader Sat, 25 Jul 2009 11:15:11 +0200 + +tor (0.2.1.17-rc-1) experimental; urgency=low + + * New upstream version. + * Update upstream URL in debian/copyright. + + -- Peter Palfrader Mon, 13 Jul 2009 23:37:37 +0200 + +tor (0.2.1.16-rc-1) experimental; urgency=low + + * New upstream version. + * No longer inform the user if/when we re-create the /var/run/tor + directory in the init script. With /var/run on tmpfs this is + completely normal now so our message was just noise. + * Stop shipping /var/run/tor in the package. + * Only clean up permissions of /var/run/tor in postinst if the + directory actually exists. + * Update Standards-Version from 3.8.0 to 3.8.1. No real changes + required, we already support nocheck in DEB_BUILD_OPTIONS since + August 2004, and we already create our var/run directory in the + init script (tho we now no longer ship it either - see above). + * Change debhelper compatibility version from 4 to 5: + - Change dh_strip call from --dbg-package=tor + to --dbg-package=tor-dbg. + - Update versioned build time dependency on debhelper. + * Forward port 06_add_compile_time_defaults. + + -- Peter Palfrader Sat, 20 Jun 2009 13:16:02 +0200 + +tor (0.2.1.15-rc-1) experimental; urgency=low + + * New upstream version. + * Change build time dependency on gs to ghostscript. + + -- Peter Palfrader Sat, 30 May 2009 21:10:03 +0200 + +tor (0.2.1.14-rc-1) experimental; urgency=low + + * New upstream version. + * Change Section of tor-dbg to debug. + + -- Peter Palfrader Thu, 16 Apr 2009 19:54:19 +0200 + +tor (0.2.1.13-alpha-1) experimental; urgency=low + + * New upstream version. + + -- Peter Palfrader Sun, 15 Mar 2009 00:58:07 +0100 + +tor (0.2.1.12-alpha-1) experimental; urgency=low + + * New upstream version, fixing several security relevant bugs: - Avoid a potential crash on exit nodes when processing malformed input. Remote DoS opportunity (closes: #514579). - Fix a temporary DoS vulnerability that could be performed by a directory mirror (closes: #514580). + * patches/06_add_compile_time_defaults: Only set the User option in + the config if we run as root. Do not set it when run as debian-tor + as Tor then always insists on changing users which will fail. (If + we run as any other user we don't set our debian defaults anyway.) - -- Peter Palfrader Mon, 09 Feb 2009 09:53:48 +0100 + -- Peter Palfrader Tue, 10 Feb 2009 00:19:53 +0100 -tor (0.2.0.33-1ubuntu1) jaunty; urgency=low +tor (0.2.1.11-alpha-1) experimental; urgency=high + + * New upstream version: + - Fixes a possible remote heap buffer overflow bug. + - torify(1) manpage mentions DNS leaks now (closes: #495829). + * README.Debian: No longer claim we change the default 'Group' setting + when run as debian-user. That setting no longer exists. + * Forward port 03_tor_manpage_in_section_8.dpatch. - * debian/rules: invoke "dh_shlibdeps -- -xglibc-private" to avoid - unmet dependency with glibc-private if linked with glibc >= 2.8. + -- Peter Palfrader Wed, 21 Jan 2009 01:00:15 +0100 - -- Luca Falavigna Mon, 02 Feb 2009 08:14:21 +0000 +tor (0.2.1.10-alpha-1) experimental; urgency=low -tor (0.2.0.33-1) unstable; urgency=high + * New alpha release. + * Forward port 03_tor_manpage_in_section_8.dpatch. - * New upstream version: - - Fixes a possible remote heap buffer overflow bug (closes: #512728) - (Secunia Advisory [SA33635]). - - better resist DNS poisoning. - - and more - see upstream changelog. + -- Peter Palfrader Sun, 11 Jan 2009 12:06:28 +0100 - -- Peter Palfrader Fri, 23 Jan 2009 12:05:06 +0100 +tor (0.2.1.9-alpha-1) experimental; urgency=low -tor (0.2.0.32-1) unstable; urgency=high + * New alpha release. + + -- Peter Palfrader Fri, 26 Dec 2008 20:51:53 +0100 + +tor (0.2.1.8-alpha-1) experimental; urgency=low + + * New alpha release. + + -- Peter Palfrader Mon, 15 Dec 2008 23:00:32 +0100 + +tor (0.2.1.7-alpha-2) experimental; urgency=low - * New upstream version. - - Properly drops privileges when being configured to do - so (closes: #505178). * No longer set now obsolete Group setting in built-in debian config. - -- Peter Palfrader Fri, 21 Nov 2008 23:33:15 +0100 + -- Peter Palfrader Mon, 10 Nov 2008 16:28:31 +0100 -tor (0.2.0.31-1) unstable; urgency=low +tor (0.2.1.7-alpha-1) experimental; urgency=low - * New upstream version. - * Tweak a few error messages in the init script to use the proper variables - (not that it should matter, the Right One has the same value, but still) - and to list more possible error reasons. + * New alpha release. + + -- Peter Palfrader Mon, 10 Nov 2008 09:39:30 +0100 + +tor (0.2.1.6-alpha-1) experimental; urgency=low + + * New alpha release. + * Forward port 14_fix_geoip_warning.dpatch. + + -- Peter Palfrader Tue, 30 Sep 2008 14:37:26 +0200 + +tor (0.2.1.5-alpha-1) experimental; urgency=low + + * New alpha release. + + -- Peter Palfrader Tue, 02 Sep 2008 00:18:55 +0200 + +tor (0.2.1.4-alpha-1) experimental; urgency=low + + * New alpha release. + * Do not build with openbsd's malloc unless enable-openbsd-malloc is in + DEB_BUILD_OPTIONS. - -- Peter Palfrader Tue, 09 Sep 2008 09:56:54 +0200 + -- Peter Palfrader Tue, 05 Aug 2008 12:33:23 +0200 -tor (0.2.0.30-2) unstable; urgency=low +tor (0.2.1.2-alpha-1) experimental; urgency=low - * Stop requiring that the binary in /usr/sbin/tor is still the same as the - one that actually is the running tor when we try to stop or reload the - daemon using the init script. If the process is called tor, running as - debian-tor, and the pid file agrees too then it probably is the Tor you - want to stop (closes: #491246). + * New alpha release. - -- Peter Palfrader Fri, 18 Jul 2008 01:50:37 +0200 + -- Peter Palfrader Wed, 16 Jul 2008 13:05:45 +0200 tor (0.2.0.30-1) unstable; urgency=low diff -Nru tor-0.2.0.34/debian/compat tor-0.2.2.16-alpha/debian/compat --- tor-0.2.0.34/debian/compat 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/compat 2010-09-25 18:36:42.000000000 +0000 @@ -1 +1 @@ -4 +5 diff -Nru tor-0.2.0.34/debian/control tor-0.2.2.16-alpha/debian/control --- tor-0.2.0.34/debian/control 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/control 2010-09-25 18:36:42.000000000 +0000 @@ -1,18 +1,17 @@ Source: tor -Section: comm +Section: net Priority: optional -Maintainer: Ubuntu MOTU Developers -XSBC-Original-Maintainer: Peter Palfrader -Build-Depends: debhelper (>= 4.1.65), libssl-dev, dpatch, zlib1g-dev, libevent-dev (>= 1.1), texlive-base-bin, texlive-latex-base, texlive-fonts-recommended, transfig, gs, binutils (>= 2.14.90.0.7) -Standards-Version: 3.8.0 +Maintainer: Peter Palfrader +Build-Depends: debhelper (>= 5), libssl-dev, dpatch, zlib1g-dev, libevent-dev (>= 1.1), binutils (>= 2.14.90.0.7), asciidoc (>= 8.2), docbook-xml, docbook-xsl, xmlto, hardening-wrapper +Standards-Version: 3.8.1 Homepage: https://www.torproject.org/ Package: tor Architecture: any -Depends: ${shlibs:Depends}, adduser, tsocks -Conflicts: libssl0.9.8 (<< 0.9.8g-9) -Recommends: privoxy | polipo (>= 1), socat, logrotate, tor-geoipdb -Suggests: mixmaster, mixminion, anon-proxy +Depends: ${shlibs:Depends}, adduser +Conflicts: libssl0.9.8 (<< 0.9.8g-4ubuntu3.1) +Recommends: polipo (>= 1) | privoxy, socat, logrotate, tor-geoipdb, torsocks | tsocks +Suggests: mixmaster, xul-ext-torbutton Description: anonymizing overlay network for TCP Tor is a connection-based low-latency anonymous communication system which addresses many flaws in the original onion routing design. @@ -55,6 +54,7 @@ Depends: tor (= ${binary:Version}) Suggests: gdb Priority: extra +Section: debug Description: debugging symbols for Tor This package provides the debugging symbols for Tor, The Onion Router. Those symbols allow your debugger to assign names to your backtraces, which diff -Nru tor-0.2.0.34/debian/copyright tor-0.2.2.16-alpha/debian/copyright --- tor-0.2.0.34/debian/copyright 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/copyright 2010-09-25 18:36:42.000000000 +0000 @@ -1,7 +1,7 @@ This package was debianized by Peter Palfrader on Sat, 10 Jan 2004 11:20:06 +0100. -It was downloaded from http://tor.eff.org/ +It was downloaded from https://www.torproject.org/ Upstream Authors: Roger Dingledine Nick Mathewson diff -Nru tor-0.2.0.34/debian/hexdump-cell-struct.pdf tor-0.2.2.16-alpha/debian/hexdump-cell-struct.pdf --- tor-0.2.0.34/debian/hexdump-cell-struct.pdf 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/hexdump-cell-struct.pdf 1970-01-01 00:00:00.000000000 +0000 @@ -1,155 +0,0 @@ -255044462d312e330a25c7ec8fa20a362030206f626a0a3c3c2f4c656e6774682037203020522f46 -696c746572202f466c6174654465636f64653e3e0a73747265616d0a789c5d90cd4ec3300cc7ef79 -0adf188795384ddae638560e48e3c09617d84a988a56a47e48686f4f9cafc114b5b17ffedbb13d02 -2f10389d7877031bd9d35ec27966b250f0c3107a5656356053c3e0ad1a2eecc0aa46444656601413 -4a7017e030594748afb488991245ce0d94ac4443fc7f3e629d9ef66678075599299991d698299991 -ea265332031d01fdd8e9ea0678366e70245234603e595808822a84ffccc056db7eea5edb47f3c5b0 -74db4127fc602b41400807d691ecede578255aa2a3dcb3c332d9e310b2a5ceb8edcf765eeeb43bfb -4da42a9368633604d6024924b9fb11bff5535651ba7d6b8352dc35f8a73cfa097893fb4df57d92d9 -51c64318312962599d4afa1214ccbd28aee1745dec1c22e8f791a35eef3d7e6b4926aff2b579f4a4 -6ec87f31f0cee8fc02f62c8fb3656e6473747265616d0a656e646f626a0a372030206f626a0a3330 -350a656e646f626a0a352030206f626a0a3c3c2f547970652f506167652f4d65646961426f78205b -302030203235342037345d0a2f506172656e742033203020520a2f5265736f75726365733c3c2f50 -726f635365745b2f504446202f546578745d0a2f457874475374617465203132203020520a2f466f -6e74203133203020520a3e3e0a2f436f6e74656e74732036203020520a3e3e0a656e646f626a0a33 -2030206f626a0a3c3c202f54797065202f5061676573202f4b696473205b0a35203020520a5d202f -436f756e7420310a3e3e0a656e646f626a0a312030206f626a0a3c3c2f54797065202f436174616c -6f67202f50616765732033203020520a3e3e0a656e646f626a0a342030206f626a0a3c3c2f547970 -652f4578744753746174652f4e616d652f52342f54522f4964656e746974792f4f504d20312f534d -20302e30323e3e0a656e646f626a0a392030206f626a0a3c3c2f547970652f466f6e744465736372 -6970746f722f466f6e744e616d652f524a464b46552b54696d65732d526f6d616e2f466f6e744242 -6f785b2d313638202d3238312031303331203932345d2f466c6167732033340a2f417363656e7420 -3932340a2f436170486569676874203637360a2f44657363656e74202d3238310a2f4974616c6963 -416e676c6520300a2f5374656d56203131310a2f4d697373696e675769647468203235300a2f5848 -6569676874203436310a2f43686172536574282f73706163652f7a65726f2f6f6e652f74776f2f66 -6f75722f666976652f7369782f65696768742f6e696e652f412f432f442f492f4c2f4d2f522f532f -542f612f622f632f652f672f692f6c2f6d2f6e2f722f732f742f79290a2f466f6e7446696c653320 -38203020523e3e0a656e646f626a0a382030206f626a0a3c3c2f537562747970652f547970653143 -2f46696c7465722f466c6174654465636f64652f4c656e677468203131203020523e3e7374726561 -6d0a789c6556695453e7bade31247b3b715a737304ac496aadf6d409ad56a8536570442b838c2a83 -040886843109210904c2f83287210408934c822032aa200e60716aab56056d0fdada5b3b1ee939eb -7e9b7efcb83b9c75effd71d7cada2b6befef7bbeef7ddfe77d9e9745d82c20582c16cfebd0bec3fb -8eaff391c488133678c9634265d6d76be9152cfa9d05f44a36de89cfff59fda7236725e151cb5e5a -ff8eedc0325af8367af11734fa16c166b17aee7eeb2a8f4d8e974446258a3e38eee5f7b775ebd6ff -df9bcdcececea2b0e4fff922721327482265a235cc1f85582a8f8d11cb1277885c99d552a9e4b428 -529a1c1b95200a0d0f17875bb7f9864ac56744fb2452496cac5c21fac0f56fa22d8e8e9b37308f2d -3b44479362c4f1f2f522892c42229324268b4265e1a2cf62c491a1a298d070b115c02d4692189f2c -daea2891fdefeea39298b0a404d17cb4a2a372679187c84b1c99240d8dffff5f0882107aec4d969d -3ee22a768b8f4cf04a9478fb1c9486c6846ddeb275dbc74ece224782d840ac220289cf08376223b1 -9ad847bc4f781307081fe223e2387188d84a6c233e248e102ec451c2955846f0083ef1576239614f -38102ce26d42c45482b06100aeb076b0ce2fe02c885bf033fb20fba6cd2a0ec1a9e2aee62ab97748 -093940bea13650f7176a174e2d122c4a5cd4bef8ddc5c54b784b3296642df91115dad2082caa8bf4 -1bcbb2ef6696f362e907c885af166b1335eaa8709f6427a00e705d74255d423a8684875555cf8a29 -0bee52918f334d5a70a7e68e91bc0be0aed5b864512a92d9dec5bd825c38b6b3116041017df4bb75 -ac595f0bff54a1be3cea312ea0efd929b9387c2ef5305e939a12946baf4281163248696aad2cac2a -36092fa1851c64e6f6adab8c2d8d03ad3dc4ab337cf328153292733a54ce47246a45146ee5d8d239 -5836435f31b36839edcbc72b34dc8eeaf494ecbccc1c83f043dc8649549259956d820a7ba835970e -1450661ca6259bb36bd28c6ac4c579768519e698d680ea48d0d88326d1431da38d4b52692113d20b -f4c5aa5275911aa844a53221ba23beff8b2b37d1eaeb42b4915e6feaa8286f2ab467ce0733ed7083 -75771ab94db3abe955fc92c2f2fc0aa05acb3481429c4f82579ad63f9bd2a02833e95fa4a9846e0a -9d27af0c3554760235dc243d28c462123c74ea00eba2703319589c5a09c3144a267f0abeb9f7a454 -7d78bfe0196928084c96a4f9a430271ed33fa2396d2c9864d3ab90233fc89da115508e879f23f28f -1b0fbfe936a545940b4b928cf2dae47ab06f6eb034de74bfbc3dd05f1919260c0896ef879d14feeb -b38d883dd45b7dae5bd0d2646969bf45d9feb9142cb33616d6af8374ed0c7bf663fa017f2e8004a7 -54dd4ea6a6a8d342ba146babe021451f631860323d2e61181044e2b8b9029c42177070a08afb6d96 -29155ca8b90f4958ad55396532fb522de4ee227523bca1e8b5242a9abbcc70d2767693769076aa47 -cebd2c40147b96606a978e141c0537539192aa8474d0146a4a02ab038c27c0199ca4477cdc8f8837 -025e001bdbb75df5fafcd08fe2df0171e0f74b13df50c9b57bdd0ec63881bd0778d785f4f80c4b7f -00c4a6d0c1d768217a7f6c5471ba57d071c62cb71ca2acc9fb0ac93a10d9cda2d723277ed09e10d9 -61f0829036d958728fa13377824213dc8c7bfab6f88e98ee93f57e10002792c5921361b16ee04c61 -c1a36d88fcf9c92d44f40bf0145acfaf983a7f610226a0496eda4acdd35d75817e71416559f6fd0c -cd45ace5bc9a7f22161f5c53757be65b438a2e701105ffeabc7df3dead0bafe057f82166cae7c6fe -af30ab1baf048a57831b55dc6786b274d84bcd74f279d27315c6be97f75224570453c7fbb6012600 -2f0adbfec9097f9967ea56a04ea79675086dd14b30a37ffcc67a38cd2ea51df8558565f995409d2d -4b0916e24212020c86c3a90cbf0c66727fa1da0c63144a223b06465a4acab2f415826a6d45a609a8 -26734d6ba7a24e122a4b740b14fe486615f82645ea8ea9ece7db6c0cdd398ba22f16b72e8307b2bf -23f7c99696e53c4c47d376fc8bbb49255332656992d12eb63cb6388e89036ddcebeae8d122be1f2d -542527ab33b3a2653a2528415199daa7a478d8cd2f363ac2c1772af8e72753cdfda3829e73351dd0 -03b74ff4ef2dc4fc123bdf82f832a886baceae1663595e695e2158724d792570017acde75a3a5bcd -5d30026d598dda0e0a1be61cf89d86e799c340fd67a72ed2734f38e67ce4d936d8586aea1f11f250 -317acdbfd5da75e95cb33aa65a501b557912c2296f59d4c9cf42effd22b0a5edf50d29f5f4e63a5d -c332b88d9c1f3055435fa22ff8bcf5d9e81d4e1a373737dd9097970df699a02f482b668a644c4a2a -8a5bb1d3cbdfd5bbe3f48b20e1787497b22601a4f6c167e4fe12a9a94125509c4d6fd48d51295c9e -07763491a5e5450595500655b98d990c40666b4b76ed8ac9bbe30f46123a3feb1662e2aebc5a7316 -5aec7bcfb55e1a6b976c6914307d0216fa0f2b9b5ecc209d954d43b36b2d7c71a1b25c761e87a112 -bb2f4ced959d2d1dcd967eb80c03ba0b716d146fb24fecd4bc61056f08b7a9b84f32cad3c08d9a73 -675a599ffaa9b525db99962cd699e0118502c89b05281d4f70d036ee5c10fd92cf9b6cad30f6a2b7 -c7433604284223558293715199eb72295b744e3f4a2fe9608d4db3919169d73588e296e715660a0c -e999e906bdd8272428253bcd9069802cc8c9cf2dcca5aee1ebdceded21b7867b9a463b05ba0a45bc -5a9f04f6119a963b4274f10dc94032da796786f58c8174a543f878930f47431af32b0b4cf96560df -344f5e0d09aefab47d5671d49bc983c519e5d67b23d21f29f8b18989727943626b5b63435b6b62a3 -4c684b5fd3d52bbae823f5685ddfb2b69748fb66396f98f69e75e22bb8d98969696ad00323e9c688 -aa08e31908816075b42c4a9a1c0a7eb063d01bd91c7b241e0d3b2b2ed3152b2081e2690e049c74d9 -e27103d9060812b9bce1761cc569e0e65b2aabcc500135d916438fa637a3172844be7af6c7b73ef7 -b0dd43e1aaf1d041b84edde8efb93dd4af8aec129c3b5315577d8c3acb9d3759fab77e16d2cfb051 -e92cc19fcb21e1e3b43427abc20e5948e722ad09bea668e3751271a121b9112fa09ab8996837676e -829b8977739ab84d88d568413640595bfedf82cd6091568df95497ba3d87011a61800a53aaac408c -547f5d659a2e62a47a4445bec8aa4c6354653ef1d6ac5b66d9fc126e457e65be11a88e72ed09e15c -1c09c7b53a8f2c26dd6966d2a328b51c6e50f44f6476819f5aacdfa79ef79f71daae69197cbfef7b -f4de37cb79afe9a3f7f96a6d6a9686714a43d5a010f991309ad5a6694aea0eb11c63a46072c3de40 -8fc43a6563537d5d43515e715ea930b72ccf08a5544b4743ef708becb8e02889371e5167848829de -eb24a55612ede031183c31d8573f3a2128f6ab55f4c179a8afeceaa1f0a6bff3419a95ae484dd0ca -d3154045c9cf0f088b48b8d5d78d960e321a6c6158b57294f5601a79587f6c0b63caa642a3d5949b -cb528284b8c41aa3c63b8f8931de4cfa16682ae02285ba4828309697969e6d1ca8e9026ab021ca5d -889961c73b2dcdcbcabe4433e995afa981db142a26db073a6b2f0135561beb24c4918cc96764781a -9845723319571053a0ab858bf6288c448bc23fdfede91fe7795c903c2669390ec120d73a79504f18 -3ff757317eaeb14aabbe835e7c87757f1a29bf67a30db3bbf85905a19ad88c133a7b590627852cc9 -2f8252a07acbd2438573d5a4f445f47364378316a0f7d05ff6fcb4f6a86764a052e06b73f172f7e8 -d4c82e6c8bd941879dfd4e359e15cc4f27ac99976c34c874003ee0c8d19295c515454505b5a53545 -e540d59769ce08ad2e1f9d919892ae49d7e6845ab3d2662677e6a794c3158afe95b4823ca51b1fb3 -d0c44b362d472bf9bae2082f5dfa29b0c7195cb413b9bd7a7df1294cd9ffe393c9f77cfc924e4708 -ce483467d46ef55976bdbf75777c05d4f498d7f65d27376edf22c4fbb0272795769847ad476beed2 -bbea58e83c33ca48510aff7dda33988bbf98f3e41c46e7f18e49b46386c407eef2b1818b0ce817eb -b4473f7fc642530fd8e820fd9c8ffcb9d550545058daf3ca2ebd54a3d06729984b89b99885f579b9 -9007b9f6594539c68e5e83ae4f80c8886b47e0036addd14f7729d5a50d3182338d89e50c8164dad4 -78f1e58427d38f5aae8e082f0dd58fc15378a4ba1430123ce8d58817d53363438eb695b6b9c482d7 -a8e80736ed35fb291f73f59e2a177f4cec3e86b9801d606bcb4703013dc1d7136e3372f0d6cb9f91 -00fd87cb37980c5618c41ec216b40ed920026d6ea67018bec87f39e28adfc60bc28fba7f74fc27b4 -e9aab1b5ce2cacaf3e57c6506ffeb8595bc6679fba3f46f2af7c9e2ee7bd420334c9a8f3efd7bafa -bf74f8d6f5f3b598f5c901c74316d9bf360978af30e19c24ddeff0e1b3fd8883964cdeff6352328c -97fe20485ecdffdaaf2912bca943a74e1ddae33ffedddd86fef1cb82e149066bcb78e4a59b0ee343 -7d77be1c08dee7253fe5251664e50064e758af80f403b44d2b0b7e44865fd9b792f8c8c674c3f2e5 -f03f9f4ea0b700ada090f326b410f3f1e22d6bf00a6cfbe81344dce8afeebb2608c3db315b84d7c7 -51e8169ae583323b3d2d5d9e10a18b046a4fd013b478acfaf3fa66614dddd98a36a0be1bda867732 -f34ba135eae6d965cd2cf805997eb1caa313df0742d511519ede624c025e0898d589175ef6be107c -35611caec2404d77d7f88d1e669a424b2914ea88dec5cb053971fce921ccc1622c0e166ddb16fc5f -281c450d21f64ba1adb28ef6ad433e75dcf6452f16b71b972c7951bb642941fc37bd8f00ed0a656e -6473747265616d0a656e646f626a0a31312030206f626a0a333531350a656e646f626a0a31322030 -206f626a0a3c3c2f52340a34203020523e3e0a656e646f626a0a31332030206f626a0a3c3c2f5231 -300a3130203020523e3e0a656e646f626a0a31302030206f626a0a3c3c2f537562747970652f5479 -7065312f42617365466f6e742f524a464b46552b54696d65732d526f6d616e2f547970652f466f6e -742f4e616d652f5231302f466f6e7444657363726970746f722039203020522f4669727374436861 -722033322f4c61737443686172203235312f5769647468735b0a3235302033333320343038203530 -30203530302038333320373738203333332033333320333333203530302035363420323530203333 -3320323530203237380a353030203530302035303020353030203530302035303020353030203530 -3020353030203530302032373820323738203536342035363420353634203434340a393231203732 -32203636372036363720373232203631312035353620373232203732322033333320333839203732 -32203631312038383920373232203732320a35353620373232203636372035353620363131203732 -32203732322039343420373232203732322036313120333333203237382033333320343639203530 -300a3333332034343420353030203434342035303020343434203333332035303020353030203237 -382032373820353030203237382037373820353030203530300a3530302035303020333333203338 -39203237382035303020353030203732322035303020353030203434342034383020323030203438 -3020353431203235300a323530203235302032353020323530203235302032353020323530203235 -3020323530203235302032353020323530203235302032353020323530203235300a323530203235 -30203235302032353020323530203235302032353020323530203235302032353020323530203235 -30203235302032353020323530203235300a32353020333333203530302035303020313637203530 -30203530302035303020353030203138302034343420353030203333332033333320353536203535 -360a3235302035303020353030203530302032353020323530203435332033353020333333203434 -3420343434203530302031303030203130303020323530203434340a323530203333332033333320 -33333320333333203333332033333320333333203333332032353020333333203333332032353020 -33333320333333203333330a31303030203235302032353020323530203235302032353020323530 -2032353020323530203235302032353020323530203235302032353020323530203235300a323530 -20383839203235302032373620323530203235302032353020323530203631312037323220383839 -20333130203235302032353020323530203235300a32353020363637203235302032353020323530 -203237382032353020323530203237382035303020373232203530305d0a3e3e0a656e646f626a0a -322030206f626a0a3c3c2f50726f6475636572284553502047686f737473637269707420372e3037 -293e3e656e646f626a0a787265660a302031340a303030303030303030302036353533352066200a -30303030303030363138203030303030206e200a30303030303035373630203030303030206e200a -30303030303030353539203030303030206e200a30303030303030363636203030303030206e200a -30303030303030343039203030303030206e200a30303030303030303135203030303030206e200a -30303030303030333930203030303030206e200a30303030303031303535203030303030206e200a -30303030303030373335203030303030206e200a30303030303034373338203030303030206e200a -30303030303034363535203030303030206e200a30303030303034363736203030303030206e200a -30303030303034373036203030303030206e200a747261696c65720a3c3c202f53697a6520313420 -2f526f6f74203120302052202f496e666f2032203020520a3e3e0a7374617274787265660a353831 -300a2525454f460a diff -Nru tor-0.2.0.34/debian/hexdump-interaction.pdf tor-0.2.2.16-alpha/debian/hexdump-interaction.pdf --- tor-0.2.0.34/debian/hexdump-interaction.pdf 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/hexdump-interaction.pdf 1970-01-01 00:00:00.000000000 +0000 @@ -1,1031 +0,0 @@ -255044462d312e330a25c7ec8fa20a362030206f626a0a3c3c2f4c656e6774682037203020522f46 -696c746572202f466c6174654465636f64653e3e0a73747265616d0a789ca5596d6f143710febebf -c2e24b938a5dfcbe36aa2af11295aaa84072522b71454a2f4792723920490508e5bfd7f6d83e7b77 -0eb15b4e22f67ae699f1e3f18cd7fb91d08e11ea7ff1efeaaaf9d83c3896e4fca6b1e453c3c865c3 -6d6f09e7cc902b6833d1514a39d93427cd2b274f09179aba518fb069a46245230c6d9a8b8649d977 -8670aa9513654ac6f626b61965be1da5d09e62362018518c01c645f3c78f64dbc84e45afad05416f -4ad8a4040efbf1a13b1874ed04187afb63323213e0621a6b96769c30cb9993b4145a9bd032269007 -02588799a04ac56e04b44764058a82e495272eea1464955e60b8957930b2236a86b227c9c79fcd91 -67ff67dcb19ee6b80bed4d6acb628df01eac2debb928c7e8beb80b8231eea2d228eeb23b2874ed04 -c5e26e3240a214b603900a2ecea2951b13c07510e5d6c4f626b5adf6ed2485f5ac0aaeebde946311 -1f8d502f9a9210a8ed881d3a8482d76e045399d8b9001337b41621ce15d3b00014da9bd896c6cb25 -29b4a754d843d29a620c3046bc01575e34ad36a8150139700803afdd0053bb809c09302b11ca3e25 -42df82442845913fb00ee41ca98a9c03da7bc2cc4b42c6019d5122042f50dcca7c8f25c249ca9ea4 -d7c46dd89efce5ff3b6bfc860d9b578a5e427b5e42649ce684e8db292132a58be481f662d261c294 -631cddb99e462f98e20f94c60931b98342d74ef06adfce0598167f69cfd35ee57ce7db29dfb97f45 -66407b31a3502b8a31c0d813885e34e53b501be7bbe410065ebb01a646f96e2ac034dea4abe84ed7 -4a2f29b943f7cd4d6cf67e599208d2e15afa8e32c5880460417bbf4fbc60a088461d6806a12432ee -706bfdf603e00229afc46b22b4db71d46db84132f53a7e264646f5dd920c5c424c549ef4551a9da3 -ec976240304258c5ab4c7b6786daac4a674c2e74be19eb9c514541c03a50468c2eaa08a8e325ce0b -c60c033aa30297fc40702bf3062b6e9394e7143623635d333296354377c5006987f261f8ae7a8022 -9e480c8f05cd0c4fa3857104b2342b915af6fd8a13398144ad4cae50cae402a55991cbb10e540065 -8b0200ea586d52bba3911a9e8c6a2fc6a895713031ac4a93946755242572415222d723d517891beb -40ba57aac8f6a08e479052b912298516a2e407825b991758119aa43cab00499b0b906fc602a47891 -e4b00e2446458bc408ea781af282b13880ce8ea6811f63dcca3c18c934cd519e4653ac2b42e672ea -9bb19c0a56941ea413cb95e045b902f5114d811b2f18a30974463534f981e056e62556432729cfa3 -89b24c136589261e2e78a208d2891ef170475420eda3899bbce9f8e0fa6ae0c718b7320f4646344d -519e451357399ab8cad1c479b108482779248a8503f53d34891c4d5ca0d194fc40702bf30a8ba649 -cab38e48b010e15c24e24da748d11445b00e9c4660e10aa47db98917b7a1c3cbd0da8f316e657e10 -4d739467d1c459a689b34c13eb0b74ac132f246ce911db4f13b3bbcb3b8bd294fc18e356e6c1c890 -a649caf36852f9c0cd553e7043ac2611a413174e1467db3d9b2eefb4144dc337fada0f04b732afb0 -03f724e539076e58079b42c9e640b2c55a946d562c98fd4610e5c88957e9d8813b06c108b2343b0c -9f898ab36ed7b48e976b5a474e04ddd918b7e31d96d93dd768c4c46bb5748f2f0dc2091847204bb3 -5a8f39f97ec5599ce42f2fe9c38b51e9be3cbee0ecef834fe5b78e6f7d7fc99f5ff0af2fe5f79302 -72689ea15f5f2629a74f05505de1534168979f0a18396f0453fe3a520b621d314a5272bd2eea2736 -7ae2483f6f3e9240394d7f5657e4f1a27970ccfc1377825dbc6de08324734b4a3bef85ee04595c35 -072f8e0961878b7f9a9609ebec50b2386b0e1e6d2e576bffd4559efcd08b72ffd0013b2702aa212d -73af147ef8deb3c5e225f9e568d175ddbd806878c7b8b4a455324874c4fdfc48692a3f6c4b5bf929 -577dd7bbb4e416d23f5f1e2c9ebc2417a7dbb39b8bd377ebe561f46737d1decd4c5b47ae3bc27b8d -4febbf6f2e6fd7b5dfadd19d62dab9d6f320f5f5cfbbb67d747442d6dbd5f5970fb797efb7c127da -e9de4a6dfc5aa92079b43cf8bc3c6cdbe393470361de7752c28735107dbe3e5f6fcf1e0620c178c7 -8d2652c5796c2eb7efc8e50d593c3f6923cefa0ce6d372d159ed3c6ba58d50c7ebcde917b2625f8f -3edf3accfbe4c531bf4f9c2fe76f3ef3e5e19d5773c9dd093f2f84bf3e5e9f5f6ec94f91839f1f1a -7a7777f843e3b892ccbdfc0986c3af9d81f3375f9c8567cb83df123e136e626e0aadd0a512c7ac84 -69584fb2ea49cbfbdacad727efb7dbf5ca4df80e9015efb424b2f6861762400ba53ea010bca7a7b7 -a7f749158111593af1112e260ec1d6b9ed19f25bb77f9dd23279afa96431629707ff6e07ebe85e2b -29736f45adcb0b00b7fabd6d4fc9eaf27af5eb539892b51dd5cced2286cf697970bdbef9f07e7be3 -621da624a4cb324cedc2ac14819dec5e5b852b61fb265e6186998478f0e92a2a3cb95e9fba693895 -4120047ca93baa84db62a6100eb23920c10f47be4b37aa9262498a459222585ba19d0541679a81e9 -287cb420af1afffb0fd8e4d476656e6473747265616d0a656e646f626a0a372030206f626a0a3138 -36350a656e646f626a0a352030206f626a0a3c3c2f547970652f506167652f4d65646961426f7820 -5b30203020343531203233365d0a2f506172656e742033203020520a2f5265736f75726365733c3c -2f50726f635365745b2f504446202f546578745d0a2f457874475374617465203136203020520a2f -466f6e74203137203020520a3e3e0a2f436f6e74656e74732036203020520a3e3e0a656e646f626a -0a332030206f626a0a3c3c202f54797065202f5061676573202f4b696473205b0a35203020520a5d -202f436f756e7420310a3e3e0a656e646f626a0a312030206f626a0a3c3c2f54797065202f436174 -616c6f67202f50616765732033203020520a3e3e0a656e646f626a0a342030206f626a0a3c3c2f54 -7970652f4578744753746174652f4e616d652f52342f54522f4964656e746974792f4f504d20312f -534d20302e30323e3e0a656e646f626a0a31322030206f626a0a3c3c2f547970652f466f6e744465 -7363726970746f722f466f6e744e616d652f54696d65732d526f6d616e2f466f6e7442426f785b2d -313638202d3238312031303331203932345d2f466c6167732033340a2f417363656e74203932340a -2f436170486569676874203637360a2f44657363656e74202d3238310a2f4974616c6963416e676c -6520300a2f5374656d56203131310a2f4d697373696e675769647468203235300a2f584865696768 -74203436310a2f466f6e7446696c6533203131203020523e3e0a656e646f626a0a31312030206f62 -6a0a3c3c2f537562747970652f5479706531432f46696c7465722f466c6174654465636f64652f4c -656e677468203134203020523e3e73747265616d0a789cac7b07581457d7ff99597667c0c424928d -a0c9aed1c4ae4114053b0856ac805244447aefb02cbbc0d2e1d23b0b2cbdf7deedbdf796821a5335 -c5b4bb64c8fbfe6759497cdfe47b9efff73c9f8fccecccdc7bceb9e7fc4ebbb34b800607088278cd -d2c3c72568c93e3f1f475fd5f562e54c42f92ea97c8fc3ac655a7e2ffe5d8ffb1e9897725e2f7f0f -08c19569ef6aaf7debdda937de7877eaea37094b1208e8804bf0293c862fe17bf815c6092e319598 -41cc26961006c41ac298d842ec242c081bc281f020020811212352881ca288a8249a884e6288384e -5c20ee101f134f8967c42fc41f248f7c8de49333c90fc825e472722db991dc4e5a90074917d29714 -93b1642a994d1693d5640bd9450e92a7c8cbe41df233f22bf267729cc3e54ce1bccd1172e6735670 -5671367276702c39f61c578e1f278413c949e464738a39d59c464e076790739a7385739733caf99a -f382f387064f434b435be35d8dd91a8b345668acd3d8ae61a17150c345c35f2342234e234b43ae51 -aed1a0d1a931a4715ae392c66d8d4f353ed778aef1abc63897cb9dca9dce9dc55dc0d5e7aee19a72 -b7732db8365c3bae33d78b1bca8de22671b3b8726e15b799dbcf3dc1bdc4bdc17dc8fd92fb03f757 -eebf7814ef4d9e2e6f366f2eef239e016f2dcf8cb79b67cd73e279f00279125e222f9d57c4abe235 -f0da7843bca3bc8bbc3bbcc7bc67bc1f799822299a7a8dd2a67429213597d2a756526ba92dd43eca -8172a23c287f2a8c9252b15426554429a86aaa9d1aa64e5157a9dbd428f525f59c5252bfd340f3e8 -69b42e2da417d01fd106f4467a33bd93b6a4ede823b407ed4f87d191743c9d4ae7d072ba82aea7db -e85e7a843e4d5fa26fd20fe847f457f4f7f4aff4b82647534bf32d4d1d4da1e65ccd259a2b34d768 -9a686ed3dca37940f390a68ba6b76690a65853a699a499a199af59aa59add9a4d9a939a0795cf39c -e655cd3b9a9f687eaef9ade60b4da5e6bfb5785aaf6bbdad35536bb6d6022d3dad555aebb5ccb4cc -b52cb46cb51cb5dcb5fcb442b5a45a715a482b5bab48ab5cab4eab55ab476b58eb94d645ad1b5af7 -b546b5bed4fa4eeb172d660a394573ca9b53a64f114cf970cae229cba7ac9e623c65eb263ffff040 -0f37f7e059f3adf61d58b068d1e2bfee2c3332329a75247cf2c92c5397200f37df5973d90fa12ede -7efe3e2ebec16b666d62477b7b7b38cd72f30ef7770f9ae5e8ecece2ac9ab6dfd1dbc56bd6660f6f -0f7f7fbfd059f3372d98a5afa7b76c097bd05f336b57888f4ba0dfe2591ebeae1ebe1ec1e1b31c7d -9d67edf67171739ce5e3e8eca22260eae3111c183e6b859e87ef9fb37779f81c09099a35e198b376 -f919cd329fb5cfc52dc4db31f0ef4fcc4202fd4c5dbc831d7dfd825d02421cbdbdfdc42ebe6e2e81 -8ece1e4eec954b50d0c4eda0101f1fc7600f3f5fb74017c76097c0899b9372f93b06067b387a3b7b -b8ba0639b938b34b75dce4e81412ece23471dce4e418e8e7eb3471dc722490558cf1c4d16de2b8cd -d92fd8d1c989d593c5cbb9c63e8e4eec5047570f8f657a7a06862f3fac58f5f2c3f295fb26e8bebc -d437507f58a6b77c9b9f9b9faf8bd7cb0746fa56811ebe6e2faf0c975938f9b18b50f3329b90e6e5 -a3557ac6ff31d1c06892e524efe5abf6bd3a417fe5ae572458a6b76292e372ab600f6fe749c90cf5 -2d8f38069afdb9c04976cb5e7e58a937c96792e172c37daf08f992bcd1f249b6ab76bd22c5323d83 -49b693fc0d975b4e0c30fb0f0daed29fe437c9d86092f1f249c6fa86bbfece586fe5cba7cb566d7b -755d4606079c3c029d427c5cbd5d4493ac5758beaade3fd5be6af9a6bf8d5d392990c1a4402b2605 -d237da3d818a4909266dbecc70fbdfc8184d8a6768603531c9ec3facb86ac5a6ffd6bcc124e31593 -8c97eb4d729a34f532a31d7fd3849ed1aaadac2527d94df25d6560fa2a2a0c26edb46292cdf265bb -dd4358550486f8783b86fca9d63f953eb96a23439bbf56b7f5efba5d65f577327aab569ab246769c -bc5c398906834934ac989467b9feee5701b16cd99fda5e66feaa27194d0a666868f59f089a34c3ca -c9a51b4c725bf1929be18ac947cb5fb25db662728cbebef97fe056cf7682ebb6ed93ec8cacd496db -f2b7a5af9a34cbca49110c26f9fc497ef9e482f5979bff038897d9fe09836daf604bcf486fcbdf0d -bdcac8e2558dac9c646f30c9feaf65feb9ba15e62a062fb9e93baaa3da7fe8cf68d996ff86a2a19e -c55f8b357b55ae9546e23f07bbfd35c6454d31e8af3b4e7f0ef39d90d97b42c96eaf2c8a8de441af -5cfa3afafb050507faf9bbb363ffbaedf6279d1055bc7451dbe2d5791384bdd9611eea672113d120 -442db55a2edf57c6bbb3bee237f1d0fd2f69c3fefa18f22a9a83d9c1816a9dbf24ae26183cc13470 -e2e8f7dff05fb96cb981be37bbd8208f0951825fe11ef8ca673f352dcfbf787b4cc815fe8a306aae -2e13f75f5db587a7cb0473e789a3179bf85c7cbdd90cece1e4a1a62a9e90dae54fed394fb863903a -f3fdc5c07be24688af079b4e4cd52733f569f3c4c9485f7d5aae3ead9838e9e9a94ecb8d8dd457ea -79067aead34b2a9b264ea6c613a74d26132713f54d93651327e3956a9aea679bd537cdd4374dd537 -37bd9ca0a669a296c578957a9efad966f54d33f54dd3976cd5b298a89762a216ded8903d6d5eb949 -bd062335cdcdea676686ea9b06eae9ea67a66a914cd49a3051cf9b58344b453dd248cd61b3fa9999 -5a21462fd7a07e66aa1670d34b91d4f38c8dd5545eaa40cd61f34b9a6a2a666ad599aa9f99aae5dc -f45224f53c63133515f5da8dd51c36ab9762a6d6a099faa6a95ac04d6a594c5e4ed8a49eae9e60ac -26bdf92577b5228dd423cdd4cf4cd5026e52cb62f2729e5a59c613a497ad7c690ef54da397b2a86f -9aaaa57e690013352363b5968c97aba7bf3487faa699faca542dc4cb659aa8f562acd68bf14bcdab -afccd457a66ab62f1766f2127c6a4d18bf54b29aca66f54d330300c833370ef775b2de6922f673b6 -d9b5c9dfc576b76980eb1eb340b7bd9b83dcf76d09f6b0d81ae269b92dd4cb6a7b98b7e3fe1d229f -2307baeb23d62e9bdbdb2059a73fafaf51ba7ef9fcfea6c80d2b160c34576c345838d85269b772d1 -506bd5c1558bdf1f6eabb6375c327ba4a3e690d1d239b38e75d63aacfee883135d7587d7e87d78f2 -f7eba798c7a73f3ff3f5d96fce7d7bfed9c517977ebda2bc3a760d6009cc065bd80da660044b610e -d8c11e3083d5f0117c007b6133ac013df810f6c116580673c102b6823ecc034bd806cb613e58c176 -58010b603fec0003580807c01c56c222b0869d6002ab6031d8c02ed8048610086e7010de83694041 -10b8833d08401b6808060f380442781b3421043cc10166011fb42014bce030bc0fefc01408036f70 -84b5301d5e0311f8c01158073af03a90100ebee004eb4117a60207c4e007ceb00166c01ba0c136d9 -11e00f2eb01166c29bc0050904802b18c3bbf016f0400ab9900c91900729100508a2211564900631 -900eb19001719009f1900509900d89900349d00837a0148eb2ad7b2194c15db6811f821ec8679bf8 -5b701e86a11314f019dc860b700cbaa0186a6114eec01518816ea882727804757011ea61005aa100 -9ec03db80ca7a1179aa0062ae163b80a27a00f9aa1023e87fb70134e423fb443093c806b700ae4d0 -02d5f0095c873330086dd0000fe153784aa440119c85e3708e40442a9146a4131944269145641339 -442e9147e4130544215144c88962a2842825144419514e5410954415514dd410b5441d514f34108d -4413d14cb410ad441bd14e74109d4417d14df410bd441fd14f0c1083c410314c8c10478963c471e2 -04719238459c26ce10678973c479e2027191b8445c26ae1057896bc475e2067193b845dc26ee1077 -897bc47de201f190f898f884f894f88c18251e118f8927c4e7c453e20be24be22be26be21be25be2 -19f19cf88ef89ef881f8917841fc44fc4cfc42fc4afc466042498c11bf130c314efc41fc8bf83709 -2441922487d420b9248fa4489ad424b5c829e46be4ebe454f20df24df22d721aa94dbe4df2c977c8 -e9a40ea94bce206792ef92ef91025248ce22df27679373c80fc80fc9b9e43c723eb9805c482e2217 -934bc8a5e447a41eb98cd42797932b48037225b98a34248dc8d5e41a722db98e5c4f6e203792c6a4 -09b9893425cdc8cde416722bb98ddc4eee20cdc99de42e7237b987dc4bee232d484bd28adc4f1e20 -ad491bd296b4230f92f6e421d2813c4c3a92474827d29974215d4937d29df4203d492fd29bf4217d -493fd29f0c2003c92032980c2143c9305244869362328294905232928c22a349191943c69271643c -9940269249643299422232954c23d3c90c3293cc22b3c91c3297cc23f3c902b2902c22e564315942 -96920ab28c2c272bc84ab28aac266bc85ab28eac271bc846b2896c265bc856b28d6c273bc84eb28b -ec267bc85eb28fec2707c84172881c2647c8a3e431f23879823c499e224f9367c8b3e439f23c7981 -bc485e222f9357c8abe435f23a7983bc49de226f9377c8bbe43df23ef9807c48aee400eb93ac63b2 -f186751d620d102d407281ac038e3670fa81c380c616d0380d5c43e0d6024f08bc32e0fd0ba8ad40 -9d067a3dd003a0a90d9a29a0351db442618a254cf91a5e3b00affd08afbbc2eb2f606a024c7d006f -2c86372ec19bc6f0662bbc351dde7286b714f0d61f302d17b43540db1cb41fc1dbefc1db23c0e703 -bf0ade5902ef7c0ad38d60fa6998fe29e858814e3be85c02dd3741f732cc3086190e3023086664c1 -8caf60a60ecc5c06330b61e6cff0ee9bf06e21bcfb00ded382f7dae0bd672070024121081e807003 -08734078176615c3fbdaf0fecf30db0666d7c39c2530e700cc390b739ec107f1f0a10e7cf80dcc25 -61ee5298eb0073cb61ee73981707f38a61de6998bf05e61f80f979b0200b1694c3c285b0d01c160e -c3c2dbb0c8041699c1a20158bc1316635842c39275b0c412967c0b4ba7c0d271f8e821e8bd067ab6 -a03704cb2a60d949d077007d5fd0cf80e502583e0a2bde8715ddb0e234182c05834360f02518fc1b -569e8295bfc0aa55b02a000c4dc030010c4f80e1bfc0683718c5c26a02560b61f57158b307d65c80 -b58eb08e0febd260dd6d58bf08d67f0d1ba261e322d8e80a1b5f80f15630e182891c3699c1a66360 -ba1d4c2bc1ec106c9e099b4fc096c3b02500b6fc0e5b3d61db7e368bc0f653b0c31776a480f94230 -6f829d52d8d908bb48d8150dbb8a60f74ad8fd0dec39017b77c3de5ad8c7a6a41760e1091637c1d2 -162cbf06abb560d50b563fc0fe723840c38138b07e1dac6560331b6c76834d1fd8ae00db5b60e704 -76bfc1c16d70f02ed8ef05fb2770a8041cf4c1a1120ecf86c3b7c1510f1cbf862399e064084edf81 -f32e70f606e73a70be0dce2fc045175c9cc1250d5cf780eb5d70ab03f7f5e0de0d1e9bc0a31b3c03 -c193016f1abc1dc0673df834816f10f8fe047e1bc0ef2bf00f017f09f83f87000b08f80d020f40d0 -2208ba0ac14b20781042fc20743e849642d80608eb06d146106d03d143103d857067083f06620f10 -8f41441448a6822403a4bb407a0a220f43e453887c0651db20aa02a2b910ad00991fc4cc81982088 -e5436c1dc49943dc1f10af01f1d1107f1fe29f40c27c48a883447d48ec86c4a39074109230243b40 -f20348fe1c528a002d01b4125037a4ae80d4f590fa3ba479425a30a47d0ee9b6907e16327643c62f -90d9075926907511b21590b31272ce41ae19e49e843c43c87b0ef9b990ff2514e841c16a28b80885 -9650f82f284a06b92ec807407e1c8a3743f14928d90e25bf42a9184abf07453628fe05656228fb1a -ca3da1bc1a2af4a122132a5e40a51b54fa42e538541d86aaf350bd05aa87a0c60a6a1ca0e633a83d -04b537a12e1aea30d413509f06f53f40831534f443a3013411d0140acdcba15904cd51d0fc3bb404 -41eb01683d0cadeed0a60f6d61d0f66f68d784762b683f04edeed0fe05749842873974f441c771e8 -380f9d07a0f31c747d0add2ed0b30c7a8e41ef52e85d09bd9f409f37f429a07f21f4c7c3000f06de -80011d18380d835e30f80b0cfe01433c187a1386fa60980fc35930721046eec0516b387a038e59c1 -717338ae80e3757062099c380a27df8193517032094e66c1a97970ea2338350ea7dbe1cc7c38f310 -ce7ac0d94e38a70de7d2e0fc4c387f13ce3f840bcbe1c2105cdc011747e1d27ab8940b97d7c2e5cd -70f9295c09852b3fc1d538b8a609d72ae1fa1cb89e02d7ff0d373ae1e64eb8f92fb8550fb70de176 -27dc790bee1c83bb5e70ef35b83708f757c3837df0e0203c38050f6de0e14df858081f0fc127c1f0 -c9cff069267c9609a3d630da078f0ce151263ce6c3e30e7872109e74c0e7e5f0d4099efac0d33af8 -623e7c711fbe3c025ffe0e5f55c2d7def0cd7bf0cd1df8b61e9e75c3f315f0fc247cb700bebb0cdf -b7c20f2be0877cf841013fcae18536bcf080176df0d326f87919fcfc047e3901bfbe01bf4e875f2f -c16f36f05b33e0a5800740690c631a30160f6319f0fb06f8fd22fc7e03985dc0dc83716b187f007f -1c863fbe827f39c0bfcec1bfade0df8f098827e0194184116ce9417a12e418c129203436121adfe2 -f4a94a8c14a24ee58f8a694f5e4cd7f657dec0267cb18b3458227677b60c3744f4569e496456ab50 -e943a19b45450f336905d32aa2eec4174a91193dbe87d26e4766528949022da2d8e9adbc216cc29d -3ae68a14d8a65bf97e1931b65fc13f942ecb73bfc3a4292feb84f118e7f1a81dccdca808bb645d11 -b655507661857505e9459985c201acc9c5725ef7a202ffec0024d54581e2d8fd29b408e750e39138 -8f8f295c8769a68e3b5599c4f8be500ec909a59f723f9f9929e13515c74424a6c427c5091732f50c -85b3e28b120b51be2e2a9567f7a6d172e68894aa492c89ce11631e93a2931e2bf7a9b3297643125d -24093617fb4803424452148f62d26499a26c718618d1c16161419e4d813d57874ee10f4e08f152e5 -e2c2a6fcbcaa745d963f922b679c242e8d62d3514eb172363f2b3d2f351fd175b9125b21934aa17d -d152eb445a82dde5947586a400b5d1b8851aeaaf286846f47095f73621e34221f348b18d6a90b39c -b2cd8c2a40c3340ea7be7138656cef2ddeb145f0908a4bb30df788b68c6039ee91dd5272eb09749f -a39c8df5f876666e41fb10adb7e3634cfd74f2e6276d85d1ae79c2ac901cbfd2f072a45b53a1a83c -6536b8cad63acced88d0c6c16f0b5a4b33ef3c5c8a39fd5dc58d6d82da2a456dc3597ac254a2f231 -52314dbb7ccc7c6c219f8911f14e2417c7a16024890ef77563b88c40c7f1ecae4741bda8421795c9 -739a53eb527514cc49117539a954f21d23c404b3428759c658e9bf9f90689dc89a55aaa0f66684e7 -a04a249757b70fe02978beceb7ccac66db520f56e3da87517884cc2385d62e4f44d129512a138f28 -a8fd5992bcc367184b5cab83e7e2ed971f94155ccad09dfafbeb4831a6a1209ef7294b5f70c6562a -6ff0c76d28641815b996451d6e56502699d222749356ee61315a5878278bc5a81dc5048ca73111ca -342e632be27d9a5018854ce8f18514fa402a328c67e74529a8f519e24af423ad9c47e18cf1416e11 -6fead847ac36da714f172e681729a63d7b81135eacc6d474edd6125635226a34a1201a19ab708f8c -23230d9354a877c14f780fd0cdf2f696b6a6b27e3484fac2bbbceb7d6afd0bb6171f2b2ccfab2aa7 -b55bab2be4eddd33b086fe19c65860c43ce53f4703096d125adbe57450ad93f90c6415eaec14ec15 -7e24761ba26da5b94d42dcadc182417b657976ae5cd0c7c3d4793bfd75fb1d96085928a006e58c06 -42b912cfe48767c86ce22322c5ba52b1478c35a219010f57281770e5cc0f5412a3c52de5e5de96cb -cf211a0b788c627c0157a27c9d62f12bab53ead711e80b5cf40507a72b0ff39977f416310266e6d7 -73f1343cedd9af5880a77ff42df3b630d28f3f7a7611f31ec33db465a3b36b5557a8d0ef58c40d56 -e1df0e5eb82950d13aa69cc1d27a8cc34639f8b98c8fe71de31653e129c92809d16eb1f90342e525 -2a21cd4eec2edb21d68da07252b3500ea2db736547848c1ee5d2e49fefc44a4e2d65b1369b79fbee -0a4c9eea281b6c11eea030a181e2e2a264d1e16181325f441b5a7e8cdfc0dce13bf78e0f1fdc2f9c -80af0a1c78808586850abe7e22deb194925814846409513112660e13aac3ccc781d1c5f12513f1a0 -28b7292d03e5a1fc541627cd226a28b948fa03f33e9ece58ea3026145a2193e925b20039aba0f4d3 -a405e81e8df753783e0e3dff794dc551169063aed1e53215d7692c2497f74dd7ee572aa3f9ca4a0a -9dcb6b571416e515657464b0b4a34454475251a23ca64c9aeb8676d2cc17d4385f29e2321b44bc5e -5414db75901edf49698bfe0992ef522cd55d2c2859484afb9486e5d8a88b4098e68c011bf0627028 -3794171f1a1115866290245d92655b6c937310192143ef9d96663b5d962286444b1b0c8eee3bb7fd -2b97ef11e6a2ef07ce7f4287971a9b6ef33144bae6c8a2ec7087e5b0f717087368bced6bac893f3c -7d2cd4a94bd0e425f7536ca75531d6a7445c8af73629a79e9b766314873c9eae2dc955bec7cf4dcd -46b9886ec9961d148ebb53dac3e84074f49e785a4c694b7042296f636a643eba48e36554ab6795ac -87c59ed65758037f88df347bbad0c221d0ca41789f8a4fb30a758fb414ebe2851bf90da7da06ee0c -6f60688663bb71d3c17d6d0d0255c4bb8e7d9b30d54628176343bedd86c3be3bd03e74b8def77478 -475c73f2791a9fe7c55e96d50736f9b4d9971f4036e860b88bc7c123fea6c88875845b0698faf6ee -590c3d02e6015ecccf7fd0d27e1e9d47557e852b6855e6eb507ed641286f6253bed842161a161214 -e82065632a93c7539a2a7fe5cac72ba9306603b786973b9c5356525e59df5f74855d4c006f7cdbf8 -afac239da7aab0a92adb49db94ff6a63cdc353aec73c0efe63cc90cf5830ef321f30f64b9af44eec -159e317feafc393bd506bf8b6761fbef7d1f599e139a5f5fd5b68875108d013410dee675c2b67109 -62a6a03d919bc30ec4048a038383dddd0f85ef47f6e850a97be38101cf1f595ba11775cf7b06e9ce -dee18a93e865f86e573e5245abcf5f28799898ae5df23326f8685354e48689acec8ddb799846bf34 -5f3875f96cfb53f41c7de1f3c0f2e496eb0cd1c6bc8768ed12a652c47b18971bc346b617cd7c6def -c6fc9ceec797233c86040facba0d100388d13ab26af5416bdfbd512b10ed14c58627353cf0bef3ca -69754165d358e78f189daefd091e57aee36b3fafb5f7c9759ec9bcb588d1609530ed8afe37674ed6 -0cf5091936705a844b4c1368318e2ea22c0b6273500fadfd89f2db68ca84f98c8f82122365b12122 -cf286fe48dfcf3c2cabcea432fa32bb4f673ac75fccea30b8d9e5b0553f16336fbce6b223e63c3cd -0555fe7f03d3bc338ac68ef222996fa9a038a0405682e84a4569659b43cdee9dfbfded0384010eb1 -6e296b6823af4f99ab3c64121db54995780be594517a743eba4be3ab782a1b178fb3854b45171e51 -e973f4058e50e9f3393e84fbf835c9252935e8013a91d75b75aea9ed3cba827aa41dfef54e7d2bea -96b05afc842911f1eec4e6c9d0267adc8c42ab62651be2d4f9696dbaa408dda695a11aac66b2b36b -f1cc0b073f58b8c786a1c2a4a969c1027515d68e7bbbef9661830e91ba18132bbfc1ebf87e3c1b06 -0e07317310edcfb3458e9971d909e9c9f9a884c6082fa53e45f2c84243ba124b827971471225d1d2 -48b15fec4116c44b7120af2e2bab568067f258f7af90942ca3ab79dabd49780e77bc8e15f5cf12ee -af024eac6ce74d6817fff01d71739493ad9cc12f4acf4d2d4074756e84839049a7904d5cdc8e2856 -7571726a4bba588e4ed338846aea1da9cdca4d90e50b8aa5f9f18588ae9297d43587967938fa069b -da0abf62a3fffe10b7c83d22dd89d2ed34be588d3d3b33eba6a11bbe9f61b3fbb5b5d3b519a5a752 -87dfb99e0a63235a5876488e8e7f9e7f6600ab5abcd478939e79adcb154fa1283c5c1c9fe0e91b19 -86c2506841547718adcd981ef0f7749db1ff81c3b7771fd4f41c1374349634a10e74e1608f713ac3 -cfd2d99f16988b8a5159736b6d4e6e4a764a3a522417a664a176d4256fac6dae93b7a211549f5029 -6da299b8f119fce6b88fe38711fd6573a4dbde0dce0c77f9defabecaecc29e11a136cec45ff3cfd6 -b50e34d6887d8a05a5ee05f6c899b6f075b7dfed78f99980f547c6ac74acebaf6030b69759ce6778 -e96bfa56ff72adb0ad64a0ebce958e2f2782ae3df32efe808d13ea48e1b0a0c1e8ec0e41a76353d8 -cda0414b9d6b6bf1eb87f1722467432d9baab278cc176367f8bd6840d4ea7dc2ae691162b868beef -874ef6ae470e045b223be450e2d6b47fd0eb078435d1b3faefba07bafb06cbcfb0316202d4e7ff03 -5bbf288370049f050d15b5265cb28685cb872ab864aae0f2eeab7079fedf7061916d183d115954c8 -5e9fc1565eb768ec8b3fa43e41259282d52c3b5d594544b972595964c53474011bdd602312be86af -f2b51727e277b9d1bce4e498b8949444a41b8f6469d1996c00ca0909c90898b9769ff5268b26a747 -76c2339ead612541c85bd7c1cbcfdac3bbb0422408ad8ea98c3c4d47f0b4cd19bd422a3b2f23ad80 -d54c5172653c4b20beae36b174e6fd4b676e8c0435ef6e133270c9af58528d6a75bb1aeb064e3778 -e8570ad445fbcc13aaa27d171b3996e167fc9e8186924e448f54bb9909195b0a6d9145ee8d5757ed -5679f139e83a8deda85f1c4facdee318b4db5e804f5309e91e5181b11611bafeb1dc082a23351d65 -22ba3727f6b070dc8bf5a4f898bdb1ec7c6f39b5374b56c0ce9f2829953fa9e2c9a3173852154ffa -c7e629f82ee96179be2dcc119ca573b5b0a1a0b9b6a946d18306516f647b403dad7dbfdbc5b066c9 -4ced7ea65ec4bb1b9b178d4cd5ba97456d54950a0dacee33230b55bab7a14ea5e118e63c171bf0c6 -ed948ff9daf7ebf273baf05b670e2fb10975741309ec03dce31725ab9285b40b5f2cc59c72bcb06b -02a1b39e73c66cf06f7c26279cd79b549054102b8fc90a4687696625e5b5cb7f13b36a1ee6e15ddf -d47dd9372ce81bbe507b0d9d42c3a24eb706bf62ffea5d74252f16bb714378f1a270692892a188f4 -f0ec4372fb9c432ca20eb2a5d73ce6f082da8da7f608af6e7ee68249f418e1b75abb5a69ec40a1b3 -05856732e9a9b8912d1f5f6b224eb326c96183f95c3696e7a5a4c70be262e263e2642e9687ed2212 -a3e3e2e350024a4a4d4e4fa68f332778ab1a0e9f1deea83ad62c88cc0f0d14cb4290aeaba4f6a210 -77fe48b12459435f7c413c64496e5295b61f5972256cd5599056989a8b74ab26429984429b64d19b -55594026a7b665c6e6a99489296b1ccaf70f0ef6f3ab08aeabafaca8af0baef465b3ddf1c8f2d056 -e5ce72bca87b5afd632cfd71baf6b0d2824df4a1bcc4e0e86831bb78b669cc712d72cdf142879183 -d8d3d7dd3bdc111d406bfa2cb0c69e5b2ec78e54bbe4466686a2205a5bb2d5c6de44dffc249e6a23 -08e6690f3730eedc0a5eaaa2a0488ed8d89ea888eb9074c576b11503f5f4e14f9f5a5e66746e0a67 -9f71ec4327e8933d1d17fa7b446ead8246afa280e23dac9baa1beee13edcae203e7f814fbde06017 -ccf0d9ba15ddcacfbf9fcd16a38d22ea7e5c7ef464729245ad53b970a382da98c5c2e8268d8fe053 -cc817f7aa26aabfe4e85d93fd1459c51f24ba445d32e8ce2cda3aa423868849fc0b38f664b7efc8c -d2becfe88b7917920a64c88666a228e497209546fb877847f920dad9aba547a8dd8f1f3273a5d450 -529104d9d34c26b576c8fa767b67716dada0b7976b4865248f94b5e51f2dd2658daa7cf082c05b58 -9b5a29edf909e97b825d22f784b3ed4466aa3c4d9e9a87742b73c5ac1bbe41a10d4981d161f13269 -ac1449902c5b5c1e5e29cd8d603bfa7071885757f0094c9ebd87670badc736fc93a9d964acfcae87 -c032568dd963c01f4fa2d0cae86843955afa15945186b45095cd734e5098872ac22b1992aee2c5e3 -f5dcf1f3bc78663db78a5785894a05d660632f9b4cd5cd2b4b8b5295651b23a35625a9fb5da3f488 -89b280d5efeda2c25155cb3022a21ea95b4c56b9ca2d724219a0aa6f84125e53925c864448962c4b -94cd670a743ec4b9f14549452897ed68f2b35bd36939632da13a92b365031fe0d7982e9db4f8f4b8 -f4d8acf0acd82c9485b20be5edf86d7c47a7fe5a5676433aad0e864645c45d36cb8f71f8ac63b01a -a49bf322ed84e3a1143a9094b44995e523e55458aa531a5bbfb4ea62730acf6276a727a625a525a5 -27e9e6c8d2e351021d13131f251049b0af9ce790eead703cca2cc1fb75ea6b6f5eb930509fa32bcf -284a63abb11c397358caeb4cc94f4452141b239546b11de5541da5219598e612e51bbb3742d72776 -a296ee538e29882f5ee03ffa384aac2ce0a31705c59fe6b1ca9188a807f1c521681ecdb0bdd69638 -97081f7fbb1dde1b9129b2adf21f0c6f8a6b57751db727e0fab10aae6d22ea613c0b57139ab94c31 -c69f18e1f598b8db7aad5350d5933b80eeab9295b443f96fb67f5ccd1aa85139c247b7f3f33f51ed -207489a84fd573c79da84351a101d2f89cea3881ac35a298ad49fc4382fd1dbb7dce60387f0bbfa5 -ea4327ac758db596846a89cb8b436224890f8af65fc604eaacc2c1e2018450a12eaac8cf1ecc666d -e520a1da130ba2cbacb245d9a2ac703dc64e673e2e4acc4bce4379baa8bc20a725831db555425526 -e7c82aacf14ce65b9d029f1c69169b6e720a0b6ad8762a4ee74b26bac835233e0be966a3ccdce22e -b665ff5ea7b4273db38c65a10e83aa18a860ed9bc5cb4f2d48659beea63c29dbb40550c84a1a699e -c05a385a4e996744e5a193b4f21bd61607c42eb2cde289fda6334a9daa69e8f3cd9fe3399f4cd7fe -5ab9eb0a5f2c8d4a90b07e1457d427c46cb43896502fa90a693bacd8c39669f79718db9a07978555 -5695975564a464a6640b9373537250365ddb54d1355ceb6b25d845314b778a630fbbd0da5f878449 -3d3c6798f7399cefeb2e3f765e9079a034b41bb5b08b6feda0998fd866c03b2126342a48ea17138a -6877bf965e61069b35badbf0eb7df444133ef6ba8218dba96afa1d45bc9349a5d1c80f45c4f947f9 -30f3c6393acc22fca5e7edd84a24d7458aa23c55d39f9f5aa46afa15226a986dfa7bf571caf8808e -9c870395679a1fe6e70fa5ebfeb9a1f0c50b8e72d9d8747e414a1eca400dc905b16cc11912ec6369 -cd9831063ad891fa1329ed2a5c16444e66e868f5be54ab825aa7dad3bb4de3dd544df9afb3ef6d3c -618a827491541ae7979280a2d1c4bed719057520559aa7f79c91e2741dbc0fefb976b938e75aa6ae -8291536a2f359413b8f11d6c2fe779a3b062ef3ee66d6cadf3197e4d51db50dc94aa2b67f4255443 -725e3ceb5851512181de09f151e19161d2321dbf9ef01654888a0ab31b525934394972a906541cd9 -78f01be6031d86c718f91c91c57926e94af08772ca2f2ab3302b5b5e58267c88dff8929995119f16 -8fe27551785ca2a7aa7650b092bc778cb8318acd55ff390ae56c7e617a8e6ad3b32637c24ec864a9 -3025b14861311528a7f6a749f251278d5b29949693979d5d5dd95bd28ae8be0a77b6d2f261bbc0e8 -e87daadc1b2ca7f6a54a4ad0051a67520dbdcda503883e5dea6f2864dc28b42f36766f1c3bc84f4e -05a4f9a44596a24e5d7c84c25acee7d6efb50ed86b25083fed516b851c909fd4d09cbe4bc5a5598b -3ca22d25aa3643d6a49c7291b8328ac33ee7e02563ebf809698e12ffd88391babeaad22d2b350365 -23ba2b37c651385e4c793ff2fc18ebbcc0249e83dfd8f0cdbc5d7bdd6cc304fb353a07db8e3d1859 -c74c6538763b8c0e1caaac164cfddd548dbddf0d55d8b315f18e26b0d8f347a1f101323fe62de62b -1d46077f939c19539192ae1b531eaf60737a5565de0915f6ca44d4e994bc989635cd463ab39856e6 -03e56b71a589133b531545d947d3d921c922ea68823cbc7d09b61a6f51c173a9720d5e31be862be7 -3dc245797598c0838a63f9b9c7f3d8fc928edfc217f93e8101debed581f58d35d5f58d01353eaaf6 -1c5397f0c94bc4e96b78f01a2704037fc4e6d9773d7e9d9103487710751676d67db740676864d1b3 -fafebc1634a48b8665cdbebdcfbed3b11b5ab0c8b9d6a5c00ee9da224fd921df45cf746cecbe5be0 -eb14e582ec74d1c102d77a471a9be106fec3cb5b8c566edfbada68dbb5cf46af5c1d65f9063fbac3 -c13f31ebf99b4b431a548df55a0a7d26aad9a8b85ba6a8419f4d5cdfad68b85e4ae753db5202e27d -c37dc325ce681fcd6c66ebe7f0e0ad6157434b83d0669a619dc9a2f8485d785d786dfc951436569f -5736cbf8b7a871436ca164ffb8ecc74c46ccdda6f613e2c5630eee536dbd6cd5e34aa982ccfc8c8c -b4d2ec920c36af95e74abc84aa5d63cfd8e08818498c34c95185d37a39b53635220f0dd1cae7140b -f1c8634ab21cfb3611e8ab6b0ff1b2e39c313be57a3ee31dca1b492892211f74d8df6ac74a8beb5e -471d1e5f6baa2ea96b2caf2c6c45cdf44d8b91b5065bb618b8e478d56e14b884bcbfcbda14add25d -7c79dfaf9f9cabbe72577071fb70c01974099dee69b829c9d7f1720a89744316e840a3fdf9beb3d5 -ed8d276a0674aabacb0a46b2e8f119f97c9f8bb20ed44f0f35b60c0cb4b8d95ab81f3672106c36e1 -9f6378ad96a7cdf61c74624b4bda6ccfa5fb971a7b9f9c62d56ec32cad18631b25c534740f6b5d39 -7345b5191333f636ffcc1fad7869056f4356d44431f7956abb6eb29c2ba698793b2d99775657ee1b -f4123607d5c55e4ca699d3935560085e4a6d535af10d72bd8e223c0ddd2ceaaf2fa7b53f292d2cc9 -ea626b08bcf547e5267e7657f1bddc73a85eb742541a1c240a0f8e902f285926988a0f4acbc7de2b -23d015ce5529ffcad8e66d3cd684f8b52b78c61542d9a87c873f9eba4d99ca636668a83fa8ac784f -597987c0e71f73947ef83d7e64a6ebbec89843489789e5e1b5d8f4e9d79df7d003dd1f56df9f6379 -20c4c955e0e521f1129b9627e8747dd7d6741dd1a3a7f7ad5a67bf7495be90d9ccece5462967b069 -f0f1af4a33fed5e6fef3e81c3de2de79c83d28d8c3ab52d496959d9a9a25c84e432895ad4fb2e263 -3dfddcac5c8553f14fd844e9cadfb867b7f18673bbefde397ffed6fd3de7d64f6cbc63e1d758c8c1 -1fb130dbea796817da4d5bb7baf4b75655b634052bdce2d9be966d5c92114a41746c7c564e735ddb -8976210e52fc2f46b32ef425eb42ef8c2de35f0faff0411b69867599558ac0bba28d61a200643871 -bd31c46773381d4d5d49adc9aa2fad2f9577aa76625817ba515a79b57c6b597825bac1fa28854e45 -74fb95fa9506646d4d55b9509d8cafccc462ee15d677d8d3264a69c8588cb37faa976acaf173d370 -fd43975bd3b58fe325f833fe5954995c15436b975f08e9dcb779c6aa7ddb8dfdc3b2ab5c053ea5e2 -6cd52b328934d4bd37e4c6fd8735dd83c2c1ee9a33e82a3a1a31e8db1856212a7050d0dac7af0f56 -b79f98f1c98e531fd93888bddc043efe928090ddf2449deedbfdcd17117db9dfc1dc4de2161828f4 -f1f1936c099aa899594f1e62556c6ce713e06a6fbac27d1e623411a3ddbee0f30fbbed6a428e7915 -14ebacb9e8d7ea7f37e86af43df403faa5f0d3da0b75171ada6e9d5111f89579ffffcbe25e7eae2a -8b2b937a7020bfd1ffd6ce6e97d316ba190969296c579f9991915978e4ecfae7c2a48c14149f5bd9 -282f6defab6fabee428574664266427c6878a8589018efefef1b10131717171b9794ac93c0fe8b4f -a4b1f69eff5b8253951d4a4b7c8a1fe02c8ef246a12834539cab3fc8b6dbc81e7987daef38e1a553 -d35952d088ca51794249ccd383a571fd680035960f5c62e7ee89fd4dd9d740a0a7b5bf357ec5c149 -d8909f7fb5a4ab7d70e0144245e54dc3856da81b7544b60557bab7eea9b442f447663b0d9d4a421a -ab4a4aaa8ae20b2425c2a8a2845c9443370d340c9f1bdabfd53ed232c852e0b743642bb34d71d0cd -dbcef7090ef2f2ad086968aaac686808ac56f55249a81ccfbda45c5746e096fb1ca5378ee07fa8dc -ebc063ae8eefe5eec02dcc9afb78cd0b8ad97a89cfc4f1701c7ec665cd87d73fe6743066fc3b430d -35ed03379fb44e6c6ae1b75d9f2f7f716428a0e240535484cec7e6b5ee751babb6e66f40f3d09c48 -43ff5d7ee63e6e9bf6d27ff9e9ad7f804185a8fd7f80018e17fd2f46b3625efcbf068d6ae9fffa8d -c01fe056fea171ed94a8944814a57b40e1d7d25cd630d4127b33eaa620ae3f7e20713006834e3cde -cdf70a09f5f1aa0c6a68a8aa6ea80f52b5afbf2f9176e229bdca438d041ac5afdf54bedec51933bd -cd5fe76e1db915d1cc7a662a7e139b7cddf6cde9b3c2e1e1abb5b7118d97e17798379805f3cc176e -0b88943766a766a666092fe36cee669ecc25a45b92ef8e740f23f7080f8ffdfbbd37b03d9179a7ed -70df606d7f8b20cba1dd7708d1df3fc21cccc746cc1cfc36b393716056321f3107184bbc82998f9d -6e8c14f63d1732eb9446fcba647950b273b29d784fc041919b6f883fa25d839b8f9d281d69e910d6 -35b59655254f34bf1f3f24f0831b1cbc4df9311f5bf38a51465a7a76c7539d986c49a82c2194cd09 -2e3c86606429c96cf84cd64dc848ca69ea8a8bec1660caf5f84e349f5eb46be3ba307176858fc0ab -32388f6d217ca551812e834177476fd51e1d110ef4979f46f7d02dd180cd8843dfbe4a46ab5cc517 -6f5470703c9bf452c569a1f1be911eba71e18962144d87158b15e5a58af2aca4c2844241646b5c07 -5bde6653d9491531e5e1b59ebad5de2551a56ca55124afa891e43b640b9db3bc0a028a63337586eb -14d97dd91d5985f9a89aae9414874ac4917e4182409fc09090a8b8449d1a0a5565d5e5376629328a -513e5d1e511c1626918445658467850af23c33bd913f1d49b9948b8a3ddbc2aaa27222102d924484 -059549876284ed710d3245647e9cce91c08878fb9843b1e22814488714455614e7662a4a04f5cd99 -9939d979b9d999ad15af78c6e97f4889ff879e812b59d7d87e363e83057ca66e525a7c666c764cae -ae4f8d6f5d72a6b83cb4341ed12acc47561fa97717de5d9a181f1fb771f1e19d2cda133212b332d2 -52333304a74f75b5dfbea8324acc6d25d930f1d58779ca7b7c779e03f366504664aa9405c19b8bde -67665a9558d53b094b03e591eda1d6cc429d16de301654c5c9934b906e076a2faaab6a6d50d4b6dc -88ccd139b0d12d700f52bd6208cafd11f7e9943acb23ab115d5daaa869f56fb05308197de67bbe6d -bfa81fdda25f9cb8f6694941725ca9ea9d13a3573d965b4da07b1c7c8c99ce37e0794694b40ac756 -508d85854d822faa19b73fce6237551523ad536a0c10e86b9cf10547b96f6c239fe1c9f68a4cac19 -58bf87e12166065a51bbbcd7a6c3e144d005d6f9de7cfc2ddbb9bf6df209433984c6b9980b6bf122 -b6bf07bcac86668e309dfcc7239bd8ae8274de65b6dcea1bfcd1d19cba32b9b0bcb831b755b5bb7f -9e0db1765708ec778583d370279ff1db86fd18ff2bd89fbdc5f8617f55dd95a43cf47f6711c6a0f6 -ffceb8c7d9be726e3376ae26ae8de2dda39c46a501ff1a738f877644475a24b345babf9cb2c8882c -422769fce963ea5966d27e2153a2daff89d999f0f271667421ba446339852a5065daf1c4741d8738 -df24d5770a96f5f2505f7a636649516f67433faa438ac82a0f857fa1ea0561b9bca4a2c7a66efd86 -bd01b66e429f23d1aef16be8cd2a65c5d6f98f96b461db7e5c5f3b0dd53c7a84177f3e5d3b0a3f57 -6af299b778b1d7929a511bfd79ebd173eda562f75441eafe1c6903a2ebcb2b1a8f5b7419335336e8 -317382d2449901c2598730f0ca98796962148ee252e29362451951a912445bb9fad80bb58fb9d406 -75b756ca07bb04da5107af354b7b670ea1fef2a6f6f2aa8a3e5442a727a72526c42644cbd852d75d -628f6c917bcef6da2a3c353513b5a6d4e9d4e2d729268789e457d5cb6263e3a3a223599a6269547c -d8cc20b1bca2aab4b099f5c74675251ec3965458f4c766ee351e133eb65955f1c5962b6fdd219456 -6c233bcee3ed61e695c4f65e2b2d3c8974b10f8fb11dff9a7b9987ddc766b35939fdb3ff5d51851f -c7b0a96c2f36e5f72bb5530b52f35191ee31519d876798cfc1e05ca3fc4d82dcdd59aa57730ce864 -af53150fde3e93c5435035dbc2fe2e416c4e0954ff71f0ea1ffedee6e2c7effc7fdd53c36c5e133e -524b5c1fc57b46394dca95fcebcc151e3a141f288d91c5c9927d935f6e4764490bd0008dbfc27b98 -2714b295441c506d5478c929ab0c591e3aa6ea1513d26253a213a3e2754531d28418948064e9924c -bf7cdfac207410d907f939fb1c9639272ea74d79f89b77983dc7783f978ff45514c4fa970a147e85 -3195289b4d6799aab71f6bd4a6c1a3ac6dec79e336ac7586797f451b3cf31ea7858d3681d86dec2c -e316f8986a2e16bb0bff5841794b23bd0513c1666c6a1ddbf499ddc17ed72def4dd77e8a7b95145f -fbfef7c75b7baecdf874d3b9790cb17aabde7685ef2f1f09b49f326014e2bd65c6c2875b3017bf76 -ffca4ff73d8699d7bf10847fc0bf7da08a6d4ae9ed870e6ddf607de6c9a58a9e338382e1fb2c2dfd -336e03a7669ce9efbe78add761f33ebf43fb5c0409490825264dd42cfb2f129d388f6f8e532eb2bd -f862f468f4111b24ffe7de9099ffceffd435fe2e11d50694e3637589b5585cc3f69c786fd5a95b78 -5fe57dd561bab6c323e5a5b1fd7c07deb2e511317b91130ace756bf0af88ca6213fc877af318eeba -a37baeb6d415d6d70b0706ea6fb1ed48514a415269537469520d3a8e1a8bda7bc7057fccd519e49d -1ffb885f125e185314572ecb8843be3443ed9c6be6115cd7f3a4eff9b17a41667a7e564e06adddf6 -087fc9dce22f5a3a67d6bae3bbaf3d7ec002f2f53beebdbb84057efcd61a57ebd9dbe66ef10a6ae8 -bcdaf279dfa0b0b0a82c97ad03f04f75aa29efaf3dbefbfae8c33fa7e4fbf1dbabdd0ebc9cd27da2 -f16973b7b0bcb6aca0124d541ff6c3044ed7b055260d4f6c6a28f0aaae2fba709f82c089ac4af7e1 -edfc9daaafbe49b6aade212429a81d6911a56ca3771b1b7731c6f7a8ec222e5eddc5cce57d85cddb -af37d41ecdd75530074445544379944896208e110b190dc69fd1c201b1c509c5aa1de9b2d29c41d5 -c654a2881a482a893839ff5bc65887f9c009afe1654bb91b18132756128fb177ca88aff0081fcfc1 -3d780ed3a30a21db940477377b1a27549104cb7a951a7504fa0ac73de79c0de1638dc2938a6bc33f -df3b8fdf4478268d8d3ec29a0c9f99a23f9799c94cbdb51ac3c99ee2eee38223cc2a86338b591c40 -e3b3788c8fc21263a263fc825c23dd10bdc1ee2e9e72baf85c798db0a4ac3abf1ed14ffa0d98b5c2 -897daf7f8807ea86e3c0493ce324de5e4628bd70157f1eaf0ccfe0fe727221af011fe2eee5f93087 -b88c2eaf71e2c25b75a16589495e283383cbd096bff13c196fee195e33f6e6e219ec73d545a3ea82 -e03102bc971fa61a378357ced29caafa02ed1ec6b74139f01bbbf0a6df6a9e72f0413cc897ae0e77 -3737b6de196485ac914ba15b6570abfbd9e01388feeac685cfbac415de8111e2206956945c2c2c90 -66c6a058daeba08fdd6ebbe357070a4f569d14d45d520ce58da4f6e9c660933f4bfcfaeac9129fcd -e6f39f10787b050717330bf8f80d0ae129855fd4def06d883c8dbe6b4d9227f54494c529120a115d -515c5a5d2d5684448527c486098f882312dd52d089cc2ac5488e22b304e5d155c1154141c12141b2 -4c71b64850669d1994b2df23559c71a4242c273c339aedf1c5e1017ec592ba82bcf4dc2a6197bc24 -a3253d757ea4a58f77f59652e635a447336fa8c0caecad527634e2b87a027d8a6f8c7294a6ca457c -661a8f1dde989a9f7551714951969f5f94558ce8829c04b6eb49488a1726c424c5a0783abc34a2ac -babcacbac3a5e1a0e3e1609700818b85d82e620e3d8b276355cfe1254ba2b7a624c65b24ecd79530 -1b650cedbff710d28d8ac9ca4e4fcbc8c81666e5a767a35cba425a14e22f12053835fb0e9eec6cbe -d52c68bc51f27115de995a98733a9bad205e53a577e6ad114275e48f8c27d9a8de9344b3fe998a39 -047e57e9f07750318cc6df8136995371976a2b88cda7136995259e73e7e716cc7bc851ae5326f131 -87f2a83b2c5f95475ff430a7cce3fc623c033cfcc39cd06174b0d8bdcbb5deaf4272d389665aa925 -a9fb07837ea125cc3bbc73ae3dd1a349f48a9627d49d82c682b6fae63a45371a422db16d516581dd -fe65cceb37689c428dcafa1d4b56d2ccb6a57cc35361d56cb37fb2a5e57a11ddca3ce77fbdb7dc1f -ed44dbdc5cd749264274823283cfccc3f3c34b633225483734324a14912f298d12e2a50b55eedbf4 -0477b098da56cec145ca837c7422a3aa6c24fb2544422a028342fe82484610622112ce4244f4cf10 -29ce684d4f5d1175c0c7b9debfc026658147ba24ddb1382c3b6c6270843820a024bc32bf34334721 -ec2e29cd684945fb1303c36ce244096224a3832a42aaaa2b2aaaf2124ae21482b091c46a74bc2d45 -9ed82356c49626e423bab2a4b4ba36a224382a2c214e24748c90247924a1eff27a1a5b7ddaa30752 -bf6d492a4eea661da02ca1e03f1d801d2c96b00e30f1e5c6f9e538b31ccb2a707af934745cf462d1 -29cc7d6e7f2aead874ed5fa2f145fc165ffba78dd786466e1cf73eb17748c8bc87b96125d27a54ad -dbd3527fb4a54e1a9e9494949020d0fe1922a26411113302cbc26b9b1465cda72c7b4c0c2d6c3659 -95f97cbc4d204b65018e686d65f4365beb2d26c33bf0d455c24b0ed55ec8993ee8e1b3dfd583d540 -4666769680655b5c945d5834a32ab4d4df3b38d8dbe29cc38327a78fde3b2a6ad878593017e7f31b -d171af017b96d8c6160f8567c00c772f6f571797ca73bb051e2d5195a881eeacafeb54352b38ecef -3b948dc165ffe39e236e8c671b8e14d6077e63abbceb2dbde7feacf2423c3cffe75eaf43f9e01fa3 -b0b4666c5a0d819ee1c267aa97e8867c4be4287675df6be1c250137b794433a33968d1ee7034e80c -3a8a7a4bda5acf9cecc034c2afd3d8510fbfcf4c172405f047fb192ee3c2b838cc323070f80d3b63 -f77ecc792c9c3a7627b23cb60117b4143761f7eaaa86f832d5b67760f5e57b38a066ba76f8a3b165 -6c0dc47067319acc5beb86ac6ff5b717b7b60a8f9f68fe043da0afb9746e17647bf13b9adc1cf605 -6e713928f472f215b3e9c62db0a6e378dda7edc784b55d75a58dacd5d63c72c45ff09d7956d64ee2 -9daa6a233ba88cd61e7954111099e93d93e1cd62a630da66c7f75deeed2f6b6d161e3bdef410dd46 -45c90509a5a571a549f5a80fd5647755323fffc1d319e2fda81ce36785a54b909466b8460cb5da3d -a8baada7ec5aed88a0fe44474b23ca446929590945910509f5b1136eabcbba2d5efabcbc30b71015 -eb96451684486212c2c305cc3c66beea6db9ac061735e037d998fb05676c0dfe907f70877b901d72 -45ee65e10d010331ed894f689ccd4b3a1f5b1fdce8d769576983ac907bd8110b9b534e653b910d3a -2cf6f0b677f035461b6846f7d162fcfab5eeda6b1d82862d6dfe17d00334dc7d0c033dee88fbf9b7 -bb0d9905cc6beee65bd61e798cd71d2b3a51562e64dd549595f13ee64d7eea67b5ddc7113dd07cc4 -42e84fb195dc6435f3bb6458b50d3f369b0d97775571e82dbc86bb93c7bcc9ace1b6f0f0eb3fe1a9 -1fa862504c7d987c8c5f3bedfc28367b72f09be9daa2dba37cb43f3a6ae247121f2a07a8cb2d3dc7 -4eb71c58b1c6e7c8f6384168726c228a41d1b9099529b476f7e7497d9b99993356861c7214c5e654 -240b922b922bc34b42906e8028d4ff7097cfe91f1e3ec6c4a99011a716a1579d6ffeae025a5bf4db -7043f3ad195f6d3b37678b7580b5af20d435e61032a3553f3be8c0819d0dedf7cbf0aab6b0b269ca -d9df4fd7fe7decb4b294affd1b7e7ffc7c187539b93a0685a0f8a4e8f86826795ca4e3b92b2afab0 -eafb59768a14ea7046603e92a38aaa335d0fea8eeb605366310f6d8b92ee8e1327eb8894d9541f5e -cb0de2ed6548ef3006d86287b73d317d448863f0875407aa951586e7476448328fd0e538329497e8 -9a2891492242dd63ccd9be9683c53ceddf2b72721482273c3c17554a0bf5e8f1a34c201f2fc7b7b8 -cc2d95c2f1c9b1697cb14b645430922051962837a84027b820302b84b5bb9b9b643b5dcfcb6f2c91 -57a2025494288fab8cd6e90e93b3d1f624aa6f28bfc7e2af5e2918c44e6c7771d1fae2c39bd3b5bf -c695ca5d7cb6d14c94213a3a39ab5e8829ea927b939940fbfe4e7b3f677191b4b4585e509886d253 -d285299929992883ceaf2ca8a82c94f80b7c283dcfc838ff605afbebc8e898b0b0194e0d7edd0d75 -450dcd822caf82a85ab6792fcaaeaca4198d113e8a4d8a8b8d13c7462545223a545c5655532ebf51 -ad6a2a957d27887ce5777c2b7ce904f55fbf5f6aff1e3fe0afb0e1da524f46b8cc1aeaef3f4d0ae4 -fdd3af9b700e853f7aca1da6988ff4b978dd3ffdd449c539e3dc7d16c18d638bf97e1b0243f7a21d -c8a3417a95f6e5a55a670729fcaaddbb448368140d1c2df895fedbb7c2c7e68e05f26d799b66ed68 -3b54b80de93296ccbbcc1cc6c15cbebdc64658ea5e1cd6e3b29811ea0cf31e62fa82eb40e455b607 -df8f67e2d9d8e1b2e4b2ff8830bc555c76a4833ebc83dfb2bdd002e9d38cc56a36bee9ec3da2183c -2c086ce57b5c8a3a893ea7b1c5a7780a9e7eb24764df37910b568f91fcc0e0e000bff290dabaca8a -dadae04a3fa11ae07ded0fcaf0ca369fb669086be09e1fa66bff36f69045381b801f52a1685b5a78 -2aadfd7dba5d1292ce3444260196b63b2c5ce7215510878655e7f68cd85cf3bf838a50796a656a57 -dab9b47255e7c35303db7ab19bb77932f366b28e434a541e6aa771321650d7515958ee5a35a6935c -1324d11249a89b6c27a2e7e0689ef66fe5b9e9a7044779783aaa8e28d0a7c7df1e9fc137f5f53565 -a66efd19ef13687f8fadafabbaa9eb0d5e2613df04fffe87ef3957fe6981d8ee9dbf2f1a5f540ad8 -d2be9940b7f1e2db1cbc9c4d4d7a3bf7ae5c737ecfe8932b97461fee3eb95218e3c91f6ab6da6811 -e86d1f282aa8881246d4c774a14ebabfaebe57c55399db82a7b7104875e4b0dab5e35b1d3a6465d1 -eb70ea647fdfc99387fa2d85a91efcd6061f37371f5f5777df86b6b686fa36366b7d241bc2b1aa70 -1d54350d3dd9fe046b7f325dfbe118e0a57c3b3367ff7de808722d133784762634a57c4f63394ffb -4bcc8fb63b3177a63df28b3ee4416bdf6d76f129b09da9b7d97ea76f89a8b6ae58519f224c29e1e6 -ffbfeaae032c8a736b4b9099b9299a3819054d58936bd424c668349658628d2576c5062aa834a94a -91b2f4267c8834294befbd89820a2288057b8d2d2a96989868884673cfe047eefdbfd942d16559ac -f91ff33c1a5876879973def39ef39df31e1a21c1e9fc33735377a03494e81dee16210eb50cb20f9c -a5fdb5a916fb5bdf5546abe7f69e59b1f2e49e82f8da93ba054b4a1cf7a3dd687b5c515e665a6256 -e641063fdecb21d330931893e020c20f8218e79916262656db2a0e65a5c13be5ba576ab8d05be945 -fb510d4a35d93c5cf0096c5108c38953f43eaff9fb402edc3f222432380ae99448bcd6db3aba983b -ba8644da88dc2cb33d5203f290cec58abcbd6516197a5e7e41815ea2f4635a6654739752e73b3505 -d3d653151f31d3b3fdd8a9f8dcdfe1bfdc383dad55f4a51a2decaaac2f0acae98bd55ae5f4f8c55a -20696991720da35bf75409376374ed4f491aa856139c277196eb9dbc1c11e3e01a9f9a1a939c9b2e -5a41195bb9da220bc6306fddf6ed05a9d5c5ba4fcc61f133f80ac23516600db318bbd0750423b821 -9fe10f5644af483616c5d9c6880b6c27e1bedac5d431e85ee89aea5f481082bdfb0844156e157625 -22d734f768cb14c6622e97bd286a15fa9ec1ccaaef2698db47e76cd075cce36cf77b1c40a7985f77 -1f3e939be2b53e53b73924378ee0cc29dcad1f7ee74f2d730a84b07c98ead618ecb603b492e061d2 -831d1a68dfbd8b7cbf7d9a7c1620ce6ab6b9dd5cc40c5b728c7862d73d477e3a5264352f52147f9a -42e1fee1de21e6b16b23d69120a5fdd537f86d4c5df916ded97f293e2644147f410b7fcd4fe4f052 -3c087f2e3d1e1a8407c142f2e73318048b6021fe1cbec4b34541461cf9ff9eb82f1e8947e39e5817 -0fc143712fd0855130167ac107f0b5a8d580d091068d0a01075ec29c109e09c7d5c416699fbda814 -2a4b40335143363da209bb841ea19c0e4643f6d29981094169f2f1928379e4f38f33a039e0341eae -3b860afa796bccd57066089ec9658487a7836edd8a36e323af7100e9c265155965e397023c7cd36a -7c0d8ccf6bc24fee5c6450388a10a6d2fed875e88a7382b66c2aade3a1b4544abdd1373ce33fb827 -8cb133f94abb73982478e461be1b49277e99760b16dfeac55ee427f18bb961f81665b7668dfd0ac4 -2cb128dc2f8283c39afad2c821d0c96b21e133be6bfc5739f65e15bf3e3b57925195e59fe5be57d7 -7d4fe0d680e29ca545f6558451edc82a3dbc7976aa4d052a41a9b1f9654c046defe8e12b2608e195 -b88b7c6e9d1771a6b78e93c8ada9411e93a6269f0bb6dcf1a6e019348442e5d35956d330a5650982 -6a7f3e0b9a16ed51551ff86777836e051f5566f8fadc63dd6515d9db3f69ea0b7fdbb846c52d846a -484dd3a8be2294c976732b423cc35106037769b710fce6222d7bba3806a130c4846df67310e1ad34 -b2f7f233dcc4d8c1c2573b248027f316aa7e8b67a61a93f6a87a8eff6ce7f8943887aa12c26b730e -1872b9bd52c03fc933f28867a8b87fde6ec9bec9a7f643f734f86f528fea2bfc37a77bb1ee8dab61 -00b708a20c28bc0a276a2d87e9434fdfde47e3f7f673987c7e1f98a6550e7f722b28b64a7ee6b71d -eafec18e25218ea59a4b37b2844a6a3e8b7301b3a73d3b9079162c4e6a71ae471d3ad7bd4e39d7a3 -e772ae9f85c8a3f4dae58e75b2f6b5b8d60760f23c959f7f92030e152293f25b2cf8de31304aab3c -022152df5bf70bf13dfe9ef42cbdd9b3ce76d2b3f8643c9b7309d762dd0523b7ed83dfa16e5caf3b -94ba1d55ea1c595c366e8d9987bdbdaea3939793eb8a7437ed948acc9462c494e69b1b59592e5ea6 -27fab4af963d84d142b3b3add0e9aca0712d1e0b86490aa7ad7cc269af74e8b495ea3aedd7423054 -7ae3a40392a10d3d5083b8debba1177bfda0d202cab09e6cdd535f35c4239e746ff6540789badc8f -cfd67aed6b71e4231d3af2c14e39f291e772e4333cc5b1378d5d88cbf4697619f64cb43d719a3eec -cd66b761cfe44611c7e9d3ec38eccd8ddb89ebf451b88edcef0f36087e7f8c64a5475eadeb0f80c5 -eae6ab4f38f9b906e2e6abc815f7625d27bc145f2f9fa0cad9c9879270fb47e3798efdaa5abd5fa1 -39fad21570a4b6074cbeb0e80ad49000ecac7e00de258789c1bc35971a12bd39dd37ce5b871d9329 -8edd60d97bb5aded6a27cf2d710ebaceb11ec2e9e546b1aba345aef35ed0bc76e0d25eeb92f9a922 -765c796e7c6a56ef5dfac57367afb59d66aa9bee9c579e18538c740a529cac4cd73b4cb5133d390e -01d93328d0ed2afdbb0518c823385c3f893c0203020dbb9e80864b1d42c32eb5e3f903fe1ac7462a -bbc96cb8124b692953496e6b422a7f963b383775b564e2d2ddb631fae479bffd653fdc1bebfc3a00 -deadde9950582cdab7b7e05774179d763d6b79c461a773dad2ca9f2bb4d7e50c5ab634c72c6a4698 -8e91fd5eef02b7ddeb74f03bdfe75b69dd1ec75d3f3888b807bd6adab76b4dd2b63b886caa5d4fa3 -d3cc9d8a23a775150072a4410a1f531a802600f2678700f29b3a00c2fedc0c217f3e1784e06fe03f -1cfbb39ace5707ee102654c29655e8c3520203cbc8bf2af032e15fb0549ffc8bfc215fd7d7d77af6 -296260e11b9599f1cbd569f3e257ab2a2ad4c139121f671ed7e4cda00b71895c610e6826f5bad5dd -70d45955d99e4cfaed6cedab137fe329b07b2e3627f39ec3c27985d4811c847f991317e23d3bf4a1 -479e9d8ac2bce773f9d00c7e19c73eeca2e679caab1d16c743796355d5856775d204e2a3aa12f497 -eba3f85de2a42a3e5e38057857020312616ca25802d48e1e681f4c3e0a5d4fc0907dbdd83faac186 -dfcc55fa23845631d88f4686082d170e504608764dbe5ac63454d0c50bb7f8466dcc5a9a66138f98 -a311945d925d86cdb60597b5f7266716a20aa67665d1545d3c9562a11ab49cb8edd4ee34db250b36 -58ac121952957057e04e83f01758aff9c4601e7c0183602e2cc79fc2177891c8a82b7c05efe30ff1 -b77838d6c6ba7870f381c13720fc3d54265925d733d390ea9969460aa3f1ad0681ff5e444bb5ccfc -1967f04fa0550a992d5a65a7b7520455b47f883ea13ddf39e9c067f8807229b31727b777ebbcca32 -2db628e441508984bee735c1d18bbb125ebd73ef23b748ed760523ad135c52904efad382916308f5 -3c3eecbebbf110254574979048db768be8afda31a38863aaa84ec81df361a7a3e71a217ab693ddbf -5caf3c26444ee535917e7cef02b02ed040db60ed364d302099c59859b3c68c3df2fda52b470fff78 -65d6913122f3aeb515cbe6cd35583e7fa1c19e830777efd92f6a8eaae71a34fe941e96bd9ee07a04 -e6aa9b9fbc38afd9785e75fdf6250a0dfac172d56713afd2532608114c794940e624e784a240e003 -d420c8de09cec23e6aed2eec3dc161cef56ee52f34fb88b80cc5de139c6662efe550407e46cdecad -d9894ed7be1c37dac3df7e2ee254878e83a56cb62aa7271f7cbc2998021b2894cf580d3f0ec35bcf -5849cd151627bd088b8571e7db2f8abe4473c514b15795c70582bd120cb9fd208da0c8b65701ef37 -f88b6a42864c0e1372cb21b1b52266e14338c9e1d5748b28a66347a29885ad4431f1e251ab68a82f -e7707fd848b18eb95b234a7f3aaa5a1f13bca03fddcac2eb1a3460a100bb2f87c4e9f13fa8db0155 -0da9c720f78806ccfa45132a01389770b183b7bf2dd279e642a7ccf2494af4220cff5358fd9cc98e -dc3d044f7c091e725e00f47649c12b1623c6772fa8f456b952f155a1f22a572bce7c2eb5629376d4 -8a33a56ac59f363ee0d8114f565107cbaba8235aaaa8839faca28e78b28aaa709c1dd25e3bf09236 -dbbd14e7f9bcb1bf9a0d7cc47724b242e3a40b7a247dbe7e87187a4bcdf0d4933543a758cff66a86 -d7cb9a6b8673d6da4e33d34d77ce294b8a2d403a4529ce96a6eb1dbeb36b664042d9ebb633010fa7 -dbbdd83f9fcbbb86c1028ebda3b4eef7931206d622e5094b927a44cbd43c13656a9e83db51f34cec -949ae79ca7d53c13d551f3dc034dca9ad6e4dae86098f41cf2e8eb9537c4f19bdc72c169fb91ed75 -c93029d329a9c7e93bbdd8c7f029df9b0bad89d8bd352fe352c5cefda812559966e9c5da44ae0b5b -c5c453ec7f5cc14ecb99f2b3f475f7409b905f880fb9498f53cd4ca3cdfbe07fa14f31638fc73006 -94ed6aadd3549017f2217fdc9057b0fb9eb7ff6d287cf53c958187fd3200de42e7d0a9a26d079802 -da7cde1ce37968309a71cb0dfa32d083cad8ae85bfa482e2c94ddc2248c40527919f862554e676ad -6e8fcd202a89ef92a4011f9e81900c38754613bc1b7b727ba84294e014bb9c49ba857f1f9644c554 -26261621a6121fa1903e42cbfc988df06d12bd2c8c24f1150cffedb75c140583e19816f6a4914590 -b75f806f404090650079d9f8e69711ef42db6262ca4298a47e3449c50fe3c170580bbfb391ca09ca -708ab162f0661ae97b7918f9931feb95441b867a450b3f66472be093505058d3e0fe204ae0a0af08 -469bc6c342b569eb3f5b0bd48c1fa3d4785f94dc39eed3b85ce907f0a84a23ac27df40e18246f2b2 -90bfdfe3c09c5f09f39b566ab5083fc15f708e8319c7f1406af79d7939b371772d5c38033653d384 -b9ca193360206530f8a0d561e8ae0585c7f166f2c6de2859038c7b1ea26019ff269ecfbfa1358bc2 -4bf1ffb460033ecbe161701646c141188a0f93cfd9c5779dc9c1578fcd1646e2ee7f6fc573f877f0 -c8b1694b7fdbad25a5f31a7cfe03a51a627c28bece1d6f0a9d410c7105ee0e5d1b4db66bc094467d -0e92a953a8d433d94ee21ce110b99cc9a0bc60b456d35d0adc9a4cb17fd320ad469aaa0113adf5d4 -bad156ae9826f7f40a052be091fc23b31eb4a7b9842775e543c98752dd1a4757973b154144995b51 -0f94ce9fcbecc55a421964720e339d8dc52ef6b6ebddad912dda10ed90ee90ee998db63317ab761d -dd5f6c3b2d57f7c07c2efd585c61780cc3c657a6e72695f5c94739e24cab4ceb5873b48219327fe1 -b70b0d53eeadd45df92bc75a5e37308d5fdcc718ad73b5b6b4b17433464bd1328949ae45ae45b16b -393a89ca724b2fe62c4d5b17ef46dece3e33cb23a7cf765492905f5c501c5f866ad1019732b342b3 -22a384e5681532f3dee0b4c1c9c1da519f302f6faf5c68d809bb776ba09b90784df33f044777a7e5 -446c43ccdd439fe1211681b6fefaa2eff798c62d450668ad8b99998181ed4c348bc16f5c1bf1d7f9 -5365a70b75cbaea503256dff5c88ff059fe3814696be8ef375a1ba6928e78475dcf4d72eb0b73073 -3447cc22f3aaabf0d6f15faf16e4b95ae688420310da22c824e9084da7e35b4950df3fef49a2d609 -58ee45008c3d7efee8c153edc71509c546b613d88e772ab065b60e6c3181697e319bc282a203d70e -ee6c47eaeb5a0081bd204575d5e4652ca4c1ab486057c1685fd3cd18c74f574e37a437419af3bfd8 -fbe0c6a7296dca6f2de15d76e81f22e28d3df962f566a214ac7ee7a19753f0c9e0ffa7ce85b45942 -b0fbd0c5a4d68b08fe5bddee2682bfab55af22f86ff52bdc45f077b5ea6504600257d5b9192da5bf -7b0f0612d275bf7355f22aa1e2f7744a41681201e21fa1bb49915932afaf204b1f9d8f2774a9c813 -f2ddb8480aa85b3f3ee890d23880b9d6b350abb6c42ac9f3696695e199ea9f15603a8c60b2167bd2 -3324222238ba4f47671cbe4181dead8b97d76b5ed2c99c1f5f2d1f737cbcc21de84f84d2d69e52d8 -542ea87c42aa611958de95ad28995fcd8f4de49c68f66b92a152bfa29b59a5e599d9b12568073a6e -5a3737cf304d6feb38c47c07d328744e127b3944a8db2eab6e2aa0d8add52d9aeeab6934cafd6bcb -efc4ebdcbcac83cd82230a5610a397545b6cb4b658bdcf7d9708b8e0527027fecf909f8634b06cf2 -a7c987cbf54261d65e0e62e8d4cdb1c149025d3db8ec33113ba4badf6c03dcc7d6373c53b75be387 -6ee55052feb314c0797fc01cae5d05fba9800196df2c5d6168bc70e32c340acdc89978c6d959bbee -9b86150254a35f4a0e1dabda9f7303dd41f086f19da98767ef1b953b9a5088653ecb5dc57ee24dde -c4035da3fd921947ca1b3b6aa55289c724597979a5a57b93f72310a19f7197703c8e79b1d2eeff9c -c50e77f9b75505ea50b71ad85b743319bed8b62ea907fcf1d797f0b650475853ca7d8e0c4f9b5e36 -f7d04e9f9842e8d668f2d4169f07e627f8d7e422bd6811fbe8507449e5d5ded003337b3063bcc1df -c342d7d5471c28481a6c421e510c7b273044cb85dc1b0372d7d947d033b1b0bca1cfc923cbbfc15a -639d678816991ea0d83f7f3e366f00d6fcdc7aa17440053dca930dcb81866c8bd603ff5a61b6f864 -22c7de7fea7ca115d208dd620a540aa6d93b6b2dc51bd6f56e19a7db18271bbad371708d4f49dc9a -9890288a8a0c090915844fe391449c0f4645202a768deb01c3eb61c4ed5e6c1968f664ad612405ef -91f87beffe805cdc43b4fe20b527a0ea846e1caea503f07b5a09145b762e522239d4e700be4aa125 -1bdd0c37313000ecb89fced98e11b12693a66d986a1f9492a2ab288f4b3b2d346e3f382ffc7df355 -94c85d1b87aa59c3e2639184ffb8582ce971a41e96d4f7622f42233f94c3279476a46ca7d99da832 -3aba32949134b98ae93d01312e02610f55f66af256d7851d4ab83f74496b8dfa55202a23a85fffcc -49725b24dffb3490336cbdb88464c97dd44b92b1fbdfe24e09c4fe83faa1873c7eb31d2afa32d7a5 -359ac81c567ee8cd5fab7d31c558437aad85d80ead6394bb716a7ae6b69450d113eb3f1f9b491fc7 -ae7248110e79a0561e06abe451d05ddd20d87aa1c9345c0bd3da5998c256295b99b21e6ab109ad2a -f8b9b78a7d8f172876b4904bfe042ef23d81eac536c13138c9850ccb1959b5e8c0ac53f29660a675 -4bf0f7459f233c13e1aeb897079ec3600d584c7562af0bcd0f834bdc2e94d15e43f1066943f10625 -0dc5d9b21d73861ed09dcf4ed4f8e9a166e324a11e17d8b22234d4c3d908b3b84a9b848f6cbbfd28 -b6ed92d06dc292d00ce7fdb8377c8641db6c96abb935629cfc24b129ae69c61badc42bd716daedbd -5b9c0f6fed15c177fc17bb6fc685085b3fff39d1154af852a5a9d82ad9698f7ce1ce4a30e1e0aefa -0b778a69a885fd5af89afa3b77d6d2af76f7244e6ab45639f563610f8160d0adb18b22b80e8f93c5 -9511b77791c8b291ff0a3ee6a44155970455b65c1e564d5ce913014b97898452b02c9a8a69766373 -1416e1d0bbd2d0aa88ab22a84ae1d822e5f149119df0dae6e844ee12e8c1f4ebb0f4f52fb1248103 -76d440949c740e823aee019e4729619da0ff9f9abe10a506f5acc1519f50cadbf76b85e67dcf97d3 -bcefa9b279df5368de478de795288db419d4dff3b206f5a7ab3da8dfd848b0a54b39e8491f8ad47b -7938cfed2c3a904ef0aebe6efa1811666934d9d373bcafcc2dc7877b4609a0d183061a6b5ec4a2b9 -8b6ccdd7e842b83a4fab6993b2c7ddad718c02e1885969803b611417e349f882af69f086bada402d -bc8c5c84bbfb787f19724d1036ca5d63f8a902273bb335ea7c8490c55dc4d9d41768d47ae3d5ebad -dd4d0461b944a3bcf5f9b6391e27dcf16a1ca66d6dbed1cb7813c3ebf327381c447fbed92c6c4586 -69a2e30eb487f9f54019bc571ae56343a8ab2d4a3cb383efb7e354a220e268fe00cc7fd18493b739 -6484d67db645560818e4bfa9106d67a0174cda01fa6084a794604e847604e7de0b9051f5df4383d6 -a1d50c49eca6186323ac0f938ca0976847d761f8bd22180963e0fd82eba2074dfd38be1f7d1dde37 -c763f048fc9ee930a1ce29f0c69266d43f04a24201f7afa981fb0d72dcbff62cb8dfa01cf76ffedd -b5733b04080816f31f4bf16f32413f27b853cce1c9709d5202518440938728073482c3b0944a300f -fc1c21a6944208dd8d2b60d89da02fa13a003a590caa3df44aa3d01af85bbd6adf2b8c55e31e73ca -82b4906efe95d78d1fdf12a164f1894481b6d1e9e9d8248404457412ab884e2f6d37fb8b2c57402c -24b6732ed8268adcab91e636ae2f2784a88c20248034f56fac9197bc1a8722091867c1c7c737487a -409e3451b5ee09ee12aa6521dd503a01856d89b7f9031b6883aeb07f2e60b35591de0f7e7f8c9230 -ec9d848a78e89593e1b73eb74f4a4a7446895d9ce91cb19e9e58e4a6bf6ec96ac478432f0a154a62 -4b3713e69814ac25c1ee623a29a83450e286cc74702f6f7a355ab7d7ad82bc558d585c33a78fa99d -abf1fa148f945cbf0c9421ca41f1b85785f328b1df00bd8956a60181ab88a9802efd0718c4678505 -24201d3c94466662b735811b83b4a50543fee4a50d893d6e931b7caaf163fe3e17bc7765f42ab418 -cd7735c3daf6c3664e9b88180b984fb1c5ea6f17b3caa36b5082f18e19f021dea00da312a925c10e -bedf01350c3ed1b629b74f370ecb8fd8772ce936c39e3a1c1b9d109725313fda2709a5c70615304d -0c7451553baa26d7fc4091f09ee24b1bbb7221e4196ea05c863a88b11662d862dcd8c17658de8166 -4f4977cbcafaf3921bdf48ecc12637ce125209ef9654c2d3d9da146b615d6da38373aedb95b54d24 -f609894482f8772c020d3c5c1b0fc57a5f7de41fb03480649a6e89f4fc2dce1128154924e9c5bbe0 -2d18a8fd1bee9bbf3cc11c89755843e4ecea651ec4b0c901c83348ba758d84b2c561e2ad8607f022 -c8d486fe30f3d8a5a46869def15d9ba7c4d793a754611db76ab1a12bd636d3b51fb6eca53da3d2d6 -cf482c3ca3b4940ca1d02cc4c5cc6628055d10812e81d36bcf05a755edc0e93519f5cfc1a99d897e -8d2bbd0f2e93888b6066114c8feb8160c1eaedd0bf1ec6fdd68b8df3e4fdf8c55cd347624a11fd7a -d3b39cff6d6aeb931164abcb26786e08f2d9e8d0dba2d03bb7e674354cd565f53d6111f46f5593a2 -d9319ee49e5f4255b1c5a9452949db511ecaf14e734a744a5c9fb820dc6eb3e366e2d0fa9765303e -0b5b7257d196c078bfdd2e8966c81459b938ae7771741307cc40cc86e0c41469f91e1dcb539c7dec -a9d5002d02b21a9d1a0f980709cfd5a9b8c0bb10c617837ea60618083d5d6f2ff97ea17d8a534672 -42425684282c656b71587611d2a9479523a330cde09126308ac25d56cc1eabb7aca4d25ad7c63947 -af72d905a4037daf3c847fc3bf46fe85b545dd1e4f817d6074139674e30da4b53e0df8b25e931f2d -3c839e94aca229ef7aaac6849dcc720f7e32adba5e4d1f22113372129320840839317b41a1e8c87f -753a655af2ae4a4222bedaa9c91f4de1a6abb3e13549d8f0ca473f9b7728f78d6ef03faf02589d0e -93939cb27a80d3d959577bb1e7604a1a37139914ba9cb2f7d7de3a3b658a34dc6a979d3e7d7979ba -498488bdb83d2223bfb6f78d6f0bc6ae7708f071d0f5f4f70af443012810f94430ecf5c0cd5a9ee4 -b17ca025a1d88bb76272b24ff4d9556ab168bc9ec74a91c9866d147bee70f99a691316d81b0b2419 -4681d109f26c1bdd6555993d87341a2d9e28caf8ba3baec65fa82ecae40454e381ad8a324ec85f12 -141b98e291aa1fcc6cd8205eb9b6cc6eefdd92ea862a11180b75990ca12e83fdc1512dee1789fb17 -40d744fe8d7d305d9666f90043f22c623a35d4b3e64c604a2756efaadb7fd2494f1727d168bc8f85 -ab557b56b0c7be1cba365cfd4b0439f42ff8adece1d3f5cd0dcd75a59cd9a99cbf2bad1c16119077 -e2037b12929239464a527c60ad2cdbd3e1bfa251fdd6e84ba132fa7bde2f468af061b888f757fa9d -7902a797678d84c02c909ed9f17785e33ad8580d73c86719348e17566dc43a518ab2e332e1cc6d90 -e2cc8d61f383cd220a56f4697de4b607962358c58033cc11cedb2c955375d6404ed685f2c76230ba -0ccbbb352e4602284f2f861971b2bc448ac855bcab30fb63d20cc89f923c85519661282ff4431f98 -8cffd50a9cdd5f2c36eb0a9c94af1778c7dd071007742f369eaf146e5cb11355df721834d1dd7dd4 -26813b5ac24df2f967928b0b8af2927e4015a8dce7ac51c9ec7d8b2423d152f4bd8f870f0313e9a7 -f7dbe3dff1c75c4244fe96045483b2bd333df7db654e44b3909ee3b435f616ceab7dc8352d778bcc -135a6153c1e807c1ef06135ebaa218664a348ed4f3ec2f9afc487e0af74b01fe00bf33c262f2942f -cde10378e77aded93322ac477ed750dcf3c2e7d09d40428f2bd236ddf1bfe1f7f13b9347e2ee9ea2 -19c0b4931d2abdebf4eb1e8d9655d68cae13d32251417a20f0c4b10838d4f662f778f2953d77c238 -ad179d40fca8ac0635c5cd4d9641908f35a38443c1f68f13f20a8a73c8c34c93add5251e6154af09 -23e0430ec46a98ff9230ef18b41b8cc0411baf69e7bcacf5bbd4056e364436c251318c84f92740ff -49420d2b08e120fcf869cb648b9ffc4ddb726bf694c0aecff60ee3ff50d52e351f25826539df455a -a62e14f6c2f3e33960956e74ef4163faf678101dda975950aa8ba7746219bc39bdd274fe86458819 -b9e6c48f8481d0cd213be18166e308fe34272c5f1de52123c6e4f2278592d440f6766762627e1048 -b43e8dd7376dc6aefc662d61a7ee55ff180f61f9f6674a83f1001ab6109a1a4bd8c94ef22cfbd4e4 -d56840d77a9843884e1fa8e6f0721a4df3729fef279bc2d7dbea17814e31a04f3f32aaf9669e91dd -dc15bac0005d431ca637ed1f62eeb1c167a1ab8eadb018784b70080a454c59848fa1c81677d583ae -4dbd499aeae73ddf87bc99a5849e2fd4e1c89bf9d13b76e5c46f43cc9e74d3a9c4a8fe9666d23b4a -21ba58065cfe0fbe11a0ab309a209713ad0cb78c5be3d64e01b79c4b2db3ad326da367c6ed8d49de -9a96ccb085e92992e2edbda1eb5707f044ddd1f827ee1edae55f2466586382566b66f52668b5b62d -5ac1f6aee04cb32392c32325bae514d075fa5f8d5bbcea0b453251225f717d0c44ff802dd783fe3b -b95385b6001407d3854c432ce971e1328cab176615cb6029b77b2cb56ccbd2e9baae6012474fdf52 -b547049b69f60ada9b145b16c24868f61e9e4f8d43669e26f6a60e1b57210b64156947a294d356a7 -fdbe98c1fdb42dd70507902cde15bad3c435c5dc6814b0d925cc20dea91015a19cf8e48cf8e458c9 -96e388490f727290f7005596ff5a031f0873ff42056e2bbf8cbb876f504a8fe2a0162f517a4877ef -5ecd67bb9479d60a5cabfceb9fd1b05c8f83fd5fe05aaa5be332d929c7bcc373f2f86e7536593dd0 -0d58510f4b6ef4629778c2097e26679c101cba9600eb7b5fe3aeb89f884df3c43d6a87fe7aa030b3 -a25c57b8aae6d30ff2034f1c7f6c911d7f5c951d7fccbdfdd942bbf57aab4450dd72fee14ab7394f -99da15d905b87bf930ec004f2707770fcb3e96c865ebc6248b6cc76382b2ed9b653f5c3f1cb56eba -6e7d30c7f6f1cc292adaf5c336e9c9c9da09930d4ca42727328c2e3df4aa503a024ad4ed6124e4e4 -7aebf9c2f88742ded83c5c68d9d170617cabe1c207f91c6b991b15b1fdc6b10e260a8f36562a3d87 -fcb2554f157940980b87713f431710a1fd68af63e99a4e6ae776dc28bb7497e595803f18d85f4e75 -7b6cd88a4d3b0bff0995d5c9e51c76e6fda9765872a582253f9ed07cb6c24f55c6a95931e1db4e74 -101f42beb9e59200182ddf945279d9917a4bfd1b73b058fdfa77fb3ed94ea45b4cbf4ec9cc132af4 -6455aa9df3a1adaaa9e7eb8576ab493ccb3d55fd3ceb11b2092d61f03602089b364df6207ee32ea1 -db565c33b6c4dbc07b4f945c2d3b28b9baeb9b0b25576b6a2b44a92a38e6abe047ccd3fc28a2237e -d48d1fd1d2ef2414f4dee387725be03d2d67ca7b92583c575ac14c68a94c296f6c3a25343611eebb -148c7e1272009327ec8e0f6b34503e148a33f05f2fdd22a59a4484cf426e4f5821a12c11e1bce5f8 -7d58aa7d0dde4ecccc89cb0bd691e0afc4744ee0563fe4863c3c1c3658fafb7938bb6f744bd2b6d9 -e15c8062506c4c784e3041c435e2483a07c5b9e71afc4a2222a6f068abd55ebeeb36e988e113096d -e3111a13162e8949125d86ee3fe3be5bfc36fb213f1de4ec1bb02e9079e5ca1fdfab52fef87fe211 -ffb8a9f57fb8a0b19044a16b79dd1eaf56127a1a133b57cb692fb6906f39b75fe6a96c55e6797dd1 -40f1d9d76a5ec7a7e32f61a2620b8fbc2a71485890f39a7465de22745d1dfa361c95f367a425b951 -d5b09a98cc4ef83709320efa010e5f07f9e0b5dae954fceddc1f891131102c049cbca76c695c330e -3715b46d9eb7c35d371a3227677208190724edce3e99700f3d12fa62636175939502d49fd85a64cb -9f86499cb2bd44bc95b255448201163fbdda085fe677a88aac3bb155017cdf2a579e4548f523de90 -9b878cec56cc659ec8877d17ba3c6b3e2c93b8fb4b9d2afd41a14a0f47e85f0df64d249cdf4fd143 -5127eba1d8c93b4ab8655bdce385c04042f39198f83d5b64acbdd23fda032d6758277c1d4f8613ca -be87a5ddcbcb3d3c043d32a1c9e217ea342a182e3bd59047aa7b35af2a5635717cadc25f7c84d332 -192b814fabe01df2abe6c32d591b366bd94e23b6417323f6bb2da94f6f9acd6f394b130ed2900323 -3d49fb5138498345cdf21ca0fb835c9f231bb6714178edafc3a08750966c510f1839dbe2d3d5a2f0 -bd210f6b6af2f3cbd36a8399bdd45f286e474a25634f79b8382023c47c4639a2e9e275162346db61 -8d203c9081b5d05fa5e8401b69bc4e1db1756b5c2e0d8da74bc17187e0b35e7f802b680a8dfbd243 -a8084171d86ba28fe007d610dfd2f45b216dfa3da368fa5d8f5c82d6073230825674fe367d4bcbce -1cc85b69a409a70e7d6070d32e0ef25bb5f0cefd4cc49af49bbd40d1c24b026311d079607d4a633b -b9871517cab28f9224abcc3a7b418271f8bacd73185c4745ccdc6a9d6e9163bacb712fda83762794 -14ecde9e79065d654077f20d4c0f9a300f7731d2854b7810e739cedc640e9a83ecb2dc6fcab219d9 -698194540a1dafdf377ec6fdfd6df3618172c6c85ee4c3a0b6c9bf1dce485ca0f95ca055c0947dc0 -829e2d0998ac16773e4c16ed2ef96ff54023897f35f9e35a3e4cd9f79aa6b63ef020fe9547955a05 -e02f10626a2984026168518614ecd0a93c05e665409775d23af16410f5620d9e01fae25ba0cf4001 -7d4b205a51426207a92c22adb33195169106b7ce0a8af96e42ccfa9f1a6900bcd972328ae360b6ea -fd1e2f68e4fe125faaaac83bd30dbae12ef2591a48161e2c7f89dfc335d7ee4a9de8ab326c6a5a43 -aff4705cefe61791eeabeb55e81ab71e31b60ef6b646dbad0e4097bab3f09ea8c97222c73aa9efa2 -bc4f73317d328928c3219c035a599966201d34bcde6227da890e2665e63023d528cd281ec73bb48b -fdcaf56b83cd82d7640597c9a7117e53641a8b6a418b00789d6ce99683b030302e2537216b47a1e8 -d2b1c47204dd1888a55f18b64fb8320ac616646f09cfd735b371b54596d2c3861df9a9d52542870b -1882d1192149a4e4f7a510feaad7e4170816c6e19f706ff8490b8f556a6ac35aeec3399ac051d7cd -7e21be213e3a61ce613e61280c85c7488ae1135e431befebe0e611d43744f27e8c61c2c413793a23 -afcdbb45b20a09b910650dd8c6b08602ee46f2fd8bb3f2466e15b1238e6cdd9778a9778d59059ea8 -6b8cc55c15c51a5fab369efffd2a8781864149292298d21574697684242c4ca29b415d43059641cb -828c2c4dc7a0e6a9d23d2d82728f0e35ee55af4397bd873ffb7b41a7b5e7ba35de55448bcd893d64 -0bb8ee116fa86aecde99a0d334038fe05a850a4150e4826f84970cf15a028e7bc701079febfa4440 -698e2604832a5122a494c21e21e9935dad50c95e0ee55c46607c50867c1bd8a1bca23a741ced702b -b1cd5e533e3ceb0b926e5dc1f11d6c14e31dbbb2f732c3c333a1cf618336dbc27820e1def4141834 -377628a868a100c995cf00c9575a20b95201c9b79af43b55d59fe775160617c377d91a9007965c31 -9e4a073dda77ee2a2a42319e5b4dc21cb465ed938c9aed93cd92a763d0dc3af73b8c028ecf356840 -7083e6f383f2cec6fe4a7add15667f484a76d21b1bd5484af0a2bf833bc389e6b462c9fd85ff8492 -6bef62ae1d167c9d3ce576f971a5821f370e91d0aa99b6184b8b60d2e9be16110221f5844f40045d -5fbb0c41539fa6bf3b65735b5a1de5c36ce9194318d7c94688d9ad1a213a0c649fd2ff70f5206c0f -91aa28cdb3d2a647f439245926ef27d341e8873ce951f813604dec1856f2ba1c0c6b077c85c28b02 -7ec52ae097f90e5f7892cab742ded7a522d2edf17402f9874ac0516830e53f17463ee0b2f474f88a -9c5fccf7a02722ab93f6b718f60e689b19c62deeb3cada557f7d9a43d2517101ca12c5a168e7d8d9 -49434b67e6fb18fbd96fb059350c7fa2fd1da61cc2970847ada368f81036ec381e58528374a2b115 -852679c8b282d6fda8d1740d0a54a31f35f67074421cca4262f3a38811fa515b7a6145f6c3ac845e -580fa117f6a2826b0a2b99c1f1c205982e7dce245b52941365321b8a92e2e30e4b8affe95449f1f1 -73951477f37d3ba19471afa6f35ad2ff86184563bb9e32f8aeeb791265ca4a136ce526982c83629d -f6a1b85d50570feea5c719ab60fe19a129e5c5092d13affe038cae09bda702cd303a25740a495031 -ffb6b4d6c156c107d24efed9c59c18f96c89cd8d4cce3e83ce3330093ec03be9591e8e4b75f1bbb0 -9243b3ec67b85bb8acb1f2591db409cfd7165a56b36f9e25bebc9afa0165cbeed426984fee538870 -9f525b0faa8b5a2664e4828042d4ef4fa2fe336b02e2ef952ed1e6375df3fd53f86d9b47dc6ed6bc -14595e4fd8a9281ee9e4fb12db133eb3cabe41faf8a41b295edd3e0a58f18baab1d0fbe472f64017 -61d362a2a0af4fb55e93dcb45ed98a65fed796bdca608557ab15c515a97c6b2d9f7ce82295f2c902 -d156a998cfdfed8bf9e00ec47cfe7e95623eb823319fbefc27dcf4752be7a0b9ccb2c2b53b0bd352 -0bf2ec134dfd7c8382fc747d03110a428c8f5f58447e56514db1e809a3e0c7f6148aacca1ea60bdd -796b51bfb42bc8b111be98d54a8e4daa217a42a6211ad58ed4da8967975a9369889e504743140f6c -faa5537cf137d93d45d74f49efea05c276c34be32e441e42d93a294e09f6764ecef6ae924fe387ea -1e287fd94ed80d72a5d99be459fdece27f07756ebef1aafd9fb26021db55255b2773b8de5ff8db55 -5865e7f9e42e3bcf8e97d979aabdb2caa57124c7c6a9b91a869f8747d7362804316071edb38f1c33 -c992cde1a9bac656e2f5f2e5edb2528facafd441e82b8d4bcd8849d9512eaa3d98921757ce2891cf -801bf02e2ee8ec3c293136415aeed52d1aea0dd14a870487934469166812533b0b9a9a70188e3cbd -8f1a97c1f14e1ba160c5421bb1843ff2a0c7c55a3de939fc347e051710d2d10ed15e347b5fa50250 -717e7e89285f42b177845584677b2fe52f71b6f6f6363629f659d9a929d959f6a9d6c27dbe644188 -ba201570d197fc63b982afdeacf9a72e1dc5b670a3e5e4550a0232a88f0351f2ab61000bff9ed529 -63fec734e912be069ac243deb4092c1f4a7b7960a12fbc25f0a957b95077a5aa85ba2a1b5720d76b -2f98d440d73c8d13f59aa7e120375def04ee438dcc313c585992b6375fd73dca71838b804c26e2cc -232278fbaf9a8fa0ebfdbcfec0d05b8342085bf0f6f3f6f5325e64a8ef1ae0e9ebe78bfcd1a6e0c0 -9040a69a12521c09fcf1bbc6997acd70be37171b12191c8d9874a9f385d06899afeff7420b8caf84 -9e16e22241fb1970a0f3caf6648645fa7b45e9c6b945f9c520264d129f95ef98646e646d3f65b9e8 -17da7ff3620753f7794e3ad0e3be4a495101b45b5a4fe85a9b277c8ffd4da9f73d9fef85ac0b13c7 -898dad5c6de5f8fe0496d88be333b2e252d24245dbc3a3c2887fb27f76dca2a2b0a57b35af60d36b -d3fbfc61392008d6c1bf9d076f1202bebf5e13a6f38bb9f5c0501d3c785cd3befd6cbb9f6742ef2d -c9a942156a1172b9090991eb2559d14948562ed0fec2f2d852150b83547ae7e339e2fff44bf6da03 -543e58e64357d05c9fd80346964341f9f57330e85c2f76f4f546f2063bf7e09d141b77bd89e5790e -8f77a2da4e259e26901d681ae012e0eae3e3817c917ba8f356d748f11677c4d8d83bd958a659ef4b -4f0d8b4e1625474b1223332333432b84dec19334bbe23ad435e568c5f31e14da159c1d1a131a1319 -168dc251b47f9c679cb724201631b9c929597956d9cbcd6dbc9d1d458eceeef6fe36feb681fae83b -061bd150081bb821b3e78f185337affee6f1a3f597e7ee1b21f25ec755e4eb4d58b8c172c506a7e8 -140f916bb67729dac6ecccca2e939ef04bf801791ad788c9cd7dc8f1abe90309b925c9b15ed609ba -71eba3bde211939a98905ab42a63eeecc5b62bd68bd6aff2310d1ac32cb1d88b4f506892a7c76421 -f2c448e8d1219e51e83c614cb996161048e2b28ce76609562db5e80862d1fd9fd7a2693cecefb99d -8960704316685f1e365efcbb7363103263bf59f322cc1d7f0ce39a0104a691bbac4738987fc83c7b -63f779ce3aae7468b064b324782bd2498d7431143575573b017cc09338dfa34d636c37c5126a0b5f -f28085507cc917de91066019fe2b62f0f05a63829b5764b8c95e6e46cedf3a44ce2b2a91f363dac5 -decf15392a1f128b4b4d4bc8c9481125c5c786e5840b15a403bef7a59729a75aa36335ced7c78248 -339c645d849b92dbc2e46f75d7173539b6d3233a8b86be786e48c0e64d9b37856cd289f00af143fe -8cb7b79f87ae9318ac859e51cb44a32afc052cd6cece3c73fcf0aeec081dc996d8cdc46d2224d8d0 -8dda16141580dc908fb79b9b07798addb4f95184441b7b58fbcc77d5b1f2d102834e66737d89bf9e -7840083d30e4694f166ca703bedd66a5f752707c9a4bc316bce18518cdd2c66f9531f597bed987d7 -501a56ee9190da3b0bba90908a6ec0c6fa22f2ece19e170703f66ac5d1ce41816813624c7d8875f2 -47893febbb98797d2f8cc444048721920a15477aad16e121b4719e6dd41ac4607a30d6c21fe3f7cf -0f87376a4b92761788bea741a32bf2f5f5f0f274deb8c1cb1a31a316fd08dd41abf2870bd595068b -4530e07ee74a624ff5367ff3427b9b37fc3c3e9561efc4feb0053e48ca8876c8ed93425297e094e0 -7c9b64533407d97b397cea65be6486acbf59ba6e3e9b707fcd673135bc04fa116caa13b21d5931f7 -3956bb600b7e8b5aab008f3468c0c0972254365a994e9900e782919d2890999826dce1d338fc864a -a3d9b24989050ebd50f02dbcdd9e197ae077cc6978a7691ca7cadc5a2ffe5154ece26515bb41ed54 -ece23b55b19bf574c52e5ead8add5ba0a7f2f1edf56d20814430b8672d8bddfc51d50704cb9b6a4a -6a6e497b6a84697a771801d61dccb457c0544ebf645fcd226ae7e6b23a99ce54dd66c395a2057afb -f15a8aad6ae9c35163965e7a76aaa47564257f8b6beef958e76be3e6a03be2fa5ae3eb236c5c8cbd -f591ce46e4166cbf99b904f59c1a2d24309396f5a11c46bbc34a24b7876a6f2b197b79774166353a -a0d3a61f45c9665d1806375b141157f8ac115bea0efa6dadf1fdfeceae0ede1b908ea08f281a099b -b926b3e6e143653b770b51fed6ec04e9870fbf59be2bf314baacd3a2c1a87bb1bd1944d9a8f55b35 -3045314d741156f03739f68e9261eb8b4f0c5b7f3c5bef30ce542666042530a0060fa0a57345b0be -06ba2b4ec32f261062da7cf03467b95e25fe50694de5cb4b35e36802c9dd5bf712b21703e03d6260 -a7b17501cc4ae47bee3b08ff3696cfd45792b7bf2bbd7ac5b5b30f5bae5e76ed14fb4b4b4f8e521d -26f0a10b4bd213f720780b9dc49f04e19e41d870a181dd4a550a1a5f9f073df80a068c8669f8d360 -d1746465b76491d04c039384d33dbd6e8daee80abfbf48231b28fe73a034d3e10b2e0c7fa105e994 -170c589eb02ed7a55cc765a77725aa46e713ebb6edde5651997a10ed4315f6db576e5f193f0b8d40 -98331e3fd2d61d0fd0263f15065f68d95141a662d33904f77a53a165f05ed185df11f4d141d76c4f -ccab9e57fd6dd66034088db399b760de42ab69682c9a9c3cb7cca0cc60b7759557b0a136ee452d42 -0ee99b7633cde231f2f140e357238fa76ae3ebcbd569ce8715aa3e3bb2b9557381b4db650c072bd5 -ef76c9a16181d0f9344ffd86171f3a8e7c888a2b923581ec2905bae68f162873879504a35a6b2937 -0b298b78c7ae4f35878c6266ea1d6b7a57c051e5ed794f88402bfac1df3c59338deed668e8550313 -76c3e53fb793a83fa3a1a14113c21acf29e9555cfe74af62d3274dfdb8cb409d29fb0bdd41670c2b -bece5918b52c6408d3b4858af92cde70bb7ea5de05cb1be82aba9479b8ea525df95fd27ed4352494 -bd8fe7e321f8dd61f8ebef74f93cbc9173c6ff5ab86800ea8fd6ee70809ef27d29cdf20dc29ce16f -3d1f2652ea6a31cc39f1a34885d60368b6883d8c95cb9dfae031d20198cc6dc2008c7067fe84cbbb -61428d46633f08e1c6626a8ae14768309a52a67fc3aad673cfa69f197e0be57ecfa56c75c5f29a6f -73bf46a3d138dbd94bc7cd59f511c2dd18bc06dec2efc37c1802efde82af4fe936e5c1462e01fe55 -bbef0f741f6d334ac13da5e163a90496d7f05d241ab0a45e931f028d5cf6c9b0f09c10624d22319d -b749e2859c9057a05780d7401cadfd0944fac56e8a45913a28212abc5078d552315d1218eeb5abdf -43bc591b6be98116ee412989f5c001558329badbe32024c02c7cd5dc712fc5d906fe31ff1e071368 -f69ae2c6fdfd6d0730417ea8dd0efc178aba4ff2fa8bfc905aae73745c99e661a7f2806cea104a37 -93f75f749765043a2d23600d1a575ee376f1eb3049ed55c1d2d9b95d0d4203e35172c9475fedf85c -7f98a1ee1ef4e6a993d2068daadffff84313baf377b9f50ee485490e595929e4850e3274b2b3235f -4b71c8c84a235fb3235fc305f8f88b9e53514c1b9328329cf82addb3a10399da8f68177bab96eefd -3f94bd6664f37040b9301c30501e6236e1eed2d69ff4c2438879f93b0e9ad5290df974e91ce95a29 -c3f285cf1687b945181ed011f4225bc94526626f27fa59f52bb5d864998425f30c1296246aad2460 -e0b10fbac877794cae878552fc1a0b0e1cf413f04bd10f65dad1e28e06b80e93db5901d295deb12b -3caa0c5d4731ff0e1e138cbfb259b6d14e15787d788cdca1bef08611b09fcc71709ca72f6aa37d5a -5023507147be0b07f385a62df545340b70ef1a7239892e7136a9261dab9d5e7c52edb48ddaaacbcc -357acbed18e8a18745f46bd971807f7c66350759ed77cf8bdc0b3cb5137b815bb7b11e6ae801871b -821e0435f4622fb7dfccfadbffa366d6cbcdcdac78130ce3d8634aefcb6165314510de3b2608efbd -2ae2248362fecb5a0e7f0c16eac83d586f77297c41720fe207b4322ef0dadaabf97e04128fc07b26 -8a9cbc0efe27d090fb141bd3110466c3f53f69b6ae95ec695bb29552235458d6f3df71ec15f57953 -380a0f8e0862b056cd311adec053b49eaea2de5349dbfc1ceccd6d1d98eb7a7d1da0172d676eaf5b -0610db3febf1a8c0baa0b806f28b343ac9b5c0ac89e202f53ce63baf789a61e99759dcf67fc0f0e3 -6ab8a6b154e8ed8c6b253b643c4b46d02a57e67c13fa6f72dfcca4e515216e26359b89346cde85d1 -57b81711eb601ebc49b30f9bed4828ebe0ff51ec2fed19207b5730c1cade6d14cf05549dd010511f -4150b5be93bae77f7446f7bc5ea5eef91fcfaf7b1ec7ffac3ecf157a3f4a0ffd53fbae8ef23a6a2d -177db92cf5b1be748afb9c6c1efe01ffc9036155345fcef1e7da882fb3066db475d97cc59c7b4d53 -04d532b56dc03fa45a98ae0f8ce94031857e79eb0ea4ac2605fafda0010f6f6be64010e78607fe85 -bb3c255350e987d689a65aad3dac864c81de92491fff32d7d4c66cc2a6790cac8139aae717a44cd5 -a1a648a1007f47c6543fb852f30dcd5e142a026dc8ea546682def9a677a9e714e6bfa392aaca1703 -b452f324f070eb810f617e3ee4121b5f89a867292fe2d8474a99d09f4a8fb3b260660d7c97a5a19a -97424f1cc321f234a64e085e8b4cd21c4b9df3ddb7fb9633105ac3e1a8644a782c676ba6f48dd5ed -f6b8a4f5f4d40ce1e93c0e4ee29604af0b9d735f7653dda437f5402bb247ee29527a4fa7350bf95f -549283e0f91684bb4e6b1ec49a2f7057b4d22378499079ba5b123a8a24055948c15f0f48f9ab7bbb -fc3542e0af7978f59376922ad8c96ac14e221576528f6a65aed86a71e7b024a7bcdd0d3dae9307ae -2fdbded930016c84f59d7abb373c30f7d1960cc9fbb76c7be79156db3b1b3cdbaeef5cf7f4faceff -7469bdbfb3c1137a269655090b3c17b65ee0d93041b6c173a4f542d1b78d294af19cfda58b5242ac -07f38f81c1f34880984ae7a5640344e3eb21ba5ec0bb127e2877926a393e3110e26cd370b9bc3d9b -2f5bd87952d0b76f1680b1e4e7b4d4aed878c258554f5959e2eb389a161613591436bea9e0b3107e -5e137e77e3cc46746e917bf2de87a1b777eebfa0d30946db29cdc6fdb3af9bfc1ac008f356d9d6cd -1357dba503669630f9e989abfe4a26ae18365e317435585a79c9d97b8884d959e0426e5dce92e65b -37b865f0aa5973801dd42422df6c357c25a3d0476bd21405cb4732067d4fc13ace786cd9849631b3 -f48e6077ea999a101ea955f53c7abc66460cd54c9feda5691341d123f55389534dab17f26775942b -ca9f45b9a255edcb01a0137936af235da1cd9a2683793a4c174ee3c1e0bcf9f105177ab1dbba8085 -37174cb1a73c1f85151c3dde1b5519d5e88732ec0f5db222cb0a6a7b9f9d51a574df404c97d60b07 -7ee8f2536a4ec1fe3ebb8a562f5a6e6024df3870cab37ad712bd09cb5c8c1718969cd617b9796bb1 -dbbba4ae2a1af9b3aff150e9b6ec335d422288f1f751cbf65bf1fea2060df84ea810bf06fe8f8ff3 -4bd424a3f03faf625825ac7a704fa96ae8b1955cf118e9be872b9e30255358f890d7eec287ab5de4 -1b1fc62adff870afcd13b8dae5564c4ee1893ebbca8c5bed7cb8e2295bfab0d1583492bfac1c714f -28415c05896e9092e8c50df7ae8c2329c49f1df2e8df3ac5a3ff7cbef985814203c2d3f62efc4e37 -3aa8361d928d4d5f69bfd274efff51a5e94a73a5c902acd4551f6e7b22d8ba4edd8abd8f7b716783 -2d9c51e0fe04917810c83f7c4ae2a0973797b3a5242e27e309d18d4e650308bf7b76c84319b07426 -a23ec72e6bc2e59b5c2976a75a1bad1bef280c505f9e74096b5f145b709e8ff9ffa40ef397b2d463 -4f4b979d53a4746d946f4858ab7f70a1a1163466361c2197ba77c2cbd1bff198f07c0238f06ea3b7 -72601b5fad2aa3286dd0382b0d202f2ab1c04ef0bbba358a6ab7727eaaa0dda1c1bf775f132272b8 -516846cec433ceceda75df34ac90ca46d2bfde80f74f9801f59108fa408556d347940336d74aa722 -0e44e72464a714a527ee242f1b40910baf8381286a4af0509de04f469b1320eef6f81d84c021af6d -3548904e90eec0bbd6c95a5043676a41d754d6821a9ebf16044e8d6ae92cb43d6184fff56c5d6556 -70f6d4177cd4286822b4d9b898aa1c593d3bb9f3957e416bb81a87290cc24010f422a99080425305 -bcab7fb6fedd9fd4a2ce5708f4c897631ea7e5e9d539597a25dbfc5c042b659b9fa57c3aa8a1f2b7 -550dc1e4e21c932113523979cf225bd657e996cd96c647f2fa312d9d8f55d2cec70245e72383bb5a -705791b3acc772a5b4c7d252e8b10c6feeb1946e89ceefab3e37df02511cfb495fa510d4cf504936 -fb618bd2fe2e4263074b1b1dfc0173b87615eca70206587eb37485a1f1c28db3d093a8d0807e2939 -74ac6a7fce0d7407c11bc677a61e9ebd6f54ee68648096f92c7715fb893779a38dc835da2f9971a4 -bcb123c9c7138f49b2f2f24a4bf726ef4720423fe32ee1781c83b7f1abd5ed71086fbd43f384d008 -dee820e11456202656f043ac1f31019481881120654660d461d708634d30c2e8b85701c3def9ddc1 -7e2bc10864e318bc2ed821d92305e5a2e8940c9484fcf0073fb88db7170f698313400b409121058a -8f3bb262ba6df789d0a55ccc7f90ab01211734614126b7001996e89f76f3d64e36d8fed50382b0ef -961cbd546574505f7406d66ae11439e34efd29356e3f627ea6a6e3f95a3bb3853cc741ba5a8d00af -5f5e9bb36aa8bf25080447c1650e4cd0ad31c1b87f3036d5f3b0325431c420820111bf8126823508 -46e00fcfe01ea9391905d592131d1d49b78ef69d391717b45c82131bdf48729636327135f03609fb -95602c6840ca081e7be5098a87f01bf727404f5fe25735c0d0bb23b6a7e66532edd607d94ae574d2 -ccc6c8d1d08781cff4f0607a42b8de5161748b7792e3dd7802de250d1c9c3849b7390f69aed3c8f1 -ef642bfcbb4f2b017b258afb8fe17dae1d96bb18d73e87e2fe435a19ec0b62791685305d080f0203 -7438df8bbd0fa53d570f6ce6acec1db5586bfa312de89948b1f785a576e77aabb532f18978b2c03b -13be131647ee6dd0d829a5429dd91f693875ac9edeb65a635d178f82c5e50b84fd91efde6bd91f39 -163e559b0c619b42de77ffaf522d33387c5e7c63ecfd5e2c0f47dc39f6cf479117cedfeb8d4eacbe -f64d06c33e3a95977bf4586fb4d7798759eebaec55f186c80299f898b8b9f8b804782117e4191590 -4a904f4694e20ec666e4e61516ed1088d2e11dc68bf4fcf15bf863d1b2051514fb27e8a47e3d64c1 -b7faf346cdc8393351e4ec7c60dcaf2bff13a063fc55cbb3e0d5ac4bc816681faa79a50bb4f12190 -2806f85b649204d2d35d5628034b61fc1c16803d071f66ef1b8c308bf097d6562e6e2a71e76d9f2b -37104c6480c3d4d5cf75d98b9ded08dca9fec936b9de20093f2cc94d48bef6d708ad93576034afc5 -11a8689f736d217f428399893537e9c488f8e818492bfaa53460b357dad23b4fb18b8ba33773546f -1a6d1561931e5c44389e7499eb4f79b27263b39edf6442b6baa9cf1c9f7305a230a6ea50c83f1266 -548b7ed084efbcb9d2b0bcb4ec9dee51dab2d953a6799a5a8d417c5c43a16fd38d2a7c560fd00e23 -46bd5518a32b892326ede062be516ed2591e6982495f78c2a4e5ad4cc4a65f61335393187414262d -eb32279fff2afbcc7128ac575c40f3016ce9a197d3647f5fbd5a0d9e5a02a227e256249ce49ab43b -5461e6735e4c68a3657ca64b3958b6ba044f0eb3b4e20c5878bd5c031c7a104686352f62d1dc45b6 -e66b74614a3b1b3094fdac39bdb3e840fa3ec4d4d74d1f23923575f34db28e6ea83acb010525b2a6 -6e9d676bea9eae6c76abdb634b1935182e9f97916b9b9fe71f0bf3325be4f3323f3f3d2f73e24531 -8656df69e983ae794dbd394d3d8153280dca835b0379f09b094d087965f12d0c0ea99ba234cf5e68 -54f1535ed62085f054a47d3fada303dc59c9a93b91cc6bbda098d1b2aca94e56dcb80033b801b4e2 -905278b55c85b79e0ebe39326f255a89566db4b5621ada917454f2937fd1f124e3d8165418546a13 -64282f1adbd4c0c3440dd845fcdf495a3adf1b14ef83ec9097bf87b718ff1b3b6ae381b0c133ce2f -5e6a99b191799bb7a0ad282a585600ac088c75fb037f04bdf022ed40dc450fbae0376934dccb6b88 -d0be7c3091fe6ab35b34ba40a8c7fd9afe51340c04c7ba5b1929555b741289210e9406e6b32d2d57 -c2728ff3fc3c7e28f73bf1cda79aa54ebca0b0dcfa3b8769f67c4278688cd0e38139f874637396d7 -8bcde6e7403ad7ba32db61fb404baab6b413a95a9bc2309bdd7cd82f864f656d0c3a2df1bba1c74f -0fbd89dbf6621fbdb228fe1d08a7b36ad2ffc89653d445e43a174b4f515f4db05f06899d3847dd98 -c42f4e82454954ce9bd7dfca8978fbedeb096fbfd3a5cbff0127fb5d850a656e6473747265616d0a -656e646f626a0a31342030206f626a0a33333936380a656e646f626a0a392030206f626a0a3c3c2f -547970652f466f6e7444657363726970746f722f466f6e744e616d652f5851414a4b482b54696d65 -732d426f6c642f466f6e7442426f785b2d313638202d3334312031303933203936305d2f466c6167 -732033340a2f417363656e74203936300a2f436170486569676874203639320a2f44657363656e74 -202d3334310a2f4974616c6963416e676c6520300a2f5374656d56203136390a2f4d697373696e67 -5769647468203235300a2f58486569676874203437330a2f43686172536574282f73706163652f6f -6e652f74776f2f412f4f2f522f622f632f652f692f6c2f732f742f77290a2f466f6e7446696c6533 -2038203020523e3e0a656e646f626a0a382030206f626a0a3c3c2f537562747970652f5479706531 -432f46696c7465722f466c6174654465636f64652f4c656e677468203135203020523e3e73747265 -616d0a789c65537b4c536714bf97c2bddf7c54a5b991466cefcc9412a6e2632ad9d04dc407883a82 -8a3a94d21628145a5b6879bf5ff209147988a0146da10a550ba8f89c3ae3127173eae26346b36c8b -9b664bf670f1dcfaf1c76eb72cfb63f9929393737ee79773cef73b34151840d1341d9cfcf14771f1 -eb2392f4393acbfcd54683d61f0d1366d1426880305b423e202fdf7cf326296836b5f148d0d463a1 -ccb260189e01edd3a0663a25a1e98256678cd15468d66764e6f1aaad89dbc32322defd2fb2282a2a -8a4f2bfc37c3afd159f419b9fc3cd1b1ea0c46538e2e37ef7d3e46441b0c7a0d9f612834655a78b5 -56abd3facbb6a90dba6c7eaddea037998c565e1513ce2f8e8c5c345f348b37e973d2f22d7ca23147 -9dcb6f3246f11bf9049d569f9ff3ff044551d28f34bacd96c43cbdcd90b668314f5173a835d45a2a -924aa296505ba9382a994aa062a8604a46d1d43471375420554adda517d10d015cc040c07349a4e4 -ace445605c604be09f8100cd525f3a7699dd103d22ac7504cbbcbe581757cf687171df0e98442cc2 -b1102343cc13e7750bca4b7655c9652633ec61655e17bba525af13f7e3ae3657dff5ee9110c8674e -461fccc0f94866c2d6b2cacc7d48e6adc3658da5a263328b25f0989968800aee25d4ff46ea83a4c2 -96d23b82fc048de16d0886e9122112682e5dbdb7340da3a549df43e81f43e3577bbaab2b5a95f62a -8cb17affce23795e8ccef63b476eadbfb4848486bd4dde218ae72a98fef8c6e0839b4a3fe5d7b0d9 -0b4b0769611ecce0343b0d85a9588b738f584f150e557beaef22b033b5df965ccc1ece1a49712461 -44662c57917964deb30898fef4f2d08b2f94a41b5671cd30e5c8e865ecc6bdc56d067b4193b12919 -95b0525f6f81c717e2117b8e85d7102b1166fbd6714447c2898a688906c2481868c417062ad1a692 -70882029cac62c0e026e93a922449d4002084bd8040880dd601807046f897dcbcbfaac1e618527df -11dcf42b287e9e29f3c00b78c2c942616e3e5b5b525b578e6b716553b11dc90c9d59792df9b32237 -242cdf7026e5b754e557396e33ce46da9cbdbb6353ce7f6f551819998744b9d8cebed603edd88edb -f675d40f945fab7063f4e3f8ade7f7b5e7546795eb8e1b5df824f2b85dc3fd0315d6a38a3e5b6761 -f71ef4b720e0cc105c39697605ff00cb201e56cd943df5ed717185b8acb5b28ba4c070c8e7bdae2e -b7ebf840cf283e8f64bf00ab1a27f10ad953f2d0cc3ca83b548263d0c42616afaeac8cae4266f8d1 -c546775476e2fb08920758d0902f8340cd4cc40bbf70b8b5a5bbb955e4e868edb1bb66fde44d9d13 -5fa2cdb62af716e96b563522297c577e1fde8cd1574129819b829a9b0fd16666d37b9add7149c874 -953c66e3ce69eede193df1ec8cc2dc69d315975ab1dc5871785409d75fb25218c47dc20ac7435848 -5ff333684506926461c6aadaab701a2217599c56539d52812c50ed6433ede587f0308a155e73a999 -99eadd9eacb1b1939eb173fa53a94a7135a57dc26a27eddbeee7986561bcf59dd5380f9797a51b3e -28d1565bcbf595671a0e5a1fd8eed6b8713beee9b00f37232729b3b023f5fb1b7b37b41684ac23ab -2cb7abfa6a7aeb0ec98df72a867097086b73b78830b385edaf6ba91dd800aa8949214e0666c0f8ef -643ce818030b85b93ddeb6b67ebbdc3f8fd3879cf4a7fe61d27c2b389268614e35f414e274347180 -c5e945367dc33fc364ed2feec5a3482a5c13f53528ccbd0ef18ee0cf4009cb216ca6ec3264f8abb7 -59980bfe5568d0c4ab83ec931b17d24e175fc17290bf7805e1a058f93391ec4a2fd2a62b13030f9f -73f47830ba35b89ecc54ca4a8822272e5e6d1abca4900a0d6253210e1aa6824a02f77c6b38622774 -d05eb6bdb9adb9b969a0c375a00b235767fe27ca098ec551b6225523b208939d6c645351377e8c84 -3bac9f04e4420230349c86508960860ccec2e4c694d7ce150f358211b5b8e0c9c35377f023f9eb95 -8f08b563972d2353a1d5daf4c60f919b19bce5755fc763d8537034e3a0b5cd287ecc9e82a4ec9dc9 -d1996af1c423519eb0549443b3d4e610d40ed8ee603c93809fecf14c9902fcb1295329ea2fd8bde9 -1d0a656e6473747265616d0a656e646f626a0a31352030206f626a0a313531380a656e646f626a0a -31362030206f626a0a3c3c2f52340a34203020523e3e0a656e646f626a0a31372030206f626a0a3c -3c2f5231300a3130203020522f5231330a3133203020523e3e0a656e646f626a0a31302030206f62 -6a0a3c3c2f537562747970652f54797065312f42617365466f6e742f5851414a4b482b54696d6573 -2d426f6c642f547970652f466f6e742f4e616d652f5231302f466f6e7444657363726970746f7220 -39203020522f4669727374436861722033322f4c61737443686172203235352f5769647468735b0a -32353020333333203535352035303020353030203130303020383333203333332033333320333333 -2035303020353730203235302035373020323530203237380a353030203530302035303020353030 -20353030203530302035303020353030203530302035303020333333203333332035373020353730 -20353730203530300a39333020373232203636372037323220373232203636372036313120373738 -20373738203338392035303020373738203636372039343420373232203737380a36313120373738 -20373232203535362036363720373232203732322031303030203732322037323220363637203333 -33203237382033333320353831203530300a33333320353030203535362034343420353536203434 -34203333332035303020353536203237382033333320353536203237382038333320353536203530 -300a3535362035353620343434203338392033333320353536203530302037323220353030203530 -302034343420333934203232302033393420353230203235300a3333332033333320333333203333 -33203333332033333320333333203333332033333320333333203333332033333320333333203235 -3020323530203235300a323738203235302032353020323530203235302032353020323530203235 -302037323220313030302032353020323530203235302032353020323530203235300a3235302033 -33332035303020353030203530302035303020323230203530302033333320373437203330302035 -3030203537302033333320373437203333330a343030203537302033303020333030203333332035 -35362035343020323530203333332033303020333330203530302037353020373530203735302035 -30300a37323220373232203732322037323220373232203732322031303030203732322036363720 -3636372036363720363637203338392033383920333839203338390a373232203732322037373820 -37373820373738203737382037373820353730203737382037323220373232203732322037323220 -37323220363131203535360a35303020353030203530302035303020353030203530302037323220 -34343420343434203434342034343420343434203237382032373820323738203237380a35303020 -35353620353030203530302035303020353030203530302035373020353030203535362035353620 -353536203535362035303020353536203530305d0a3e3e0a656e646f626a0a31332030206f626a0a -3c3c2f537562747970652f54797065312f42617365466f6e742f54696d65732d526f6d616e2f5479 -70652f466f6e742f4e616d652f5231332f466f6e7444657363726970746f72203132203020522f46 -69727374436861722033322f4c61737443686172203235352f5769647468735b0a32353020333333 -20343038203530302035303020383333203737382033333320333333203333332035303020353634 -203235302035363420323530203237380a3530302035303020353030203530302035303020353030 -20353030203530302035303020353030203237382032373820353634203536342035363420343434 -0a393231203732322036363720363637203732322036313120353536203732322037323220333333 -2033383920373232203631312038383920373232203732320a353536203732322036363720353536 -20363131203732322037323220393434203732322037323220363131203333332032373820333333 -20343639203530300a33333320343434203530302034343420353030203434342033333320353030 -20353030203237382032373820353030203237382037373820353030203530300a35303020353030 -20333333203338392032373820353030203530302037323220353030203530302034343420343830 -203230302034383020353431203235300a3333332033333320333333203333332033333320333333 -20333333203333332033333320333333203333332033333320333333203235302032353020323530 -0a323738203235302032353020323530203235302032353020323530203235302037323220383839 -2032353020323530203235302032353020323530203235300a323530203333332035303020353030 -20353030203530302032303020353030203333332037363020323736203530302035363420333333 -20373630203333330a34303020353634203330302033303020333333203530302034353320323530 -20333333203330302033313020353030203735302037353020373530203434340a37323220373232 -20373232203732322037323220373232203838392036363720363131203631312036313120363131 -203333332033333320333333203333330a3732322037323220373232203732322037323220373232 -20373232203536342037323220373232203732322037323220373232203732322035353620353030 -0a343434203434342034343420343434203434342034343420363637203434342034343420343434 -2034343420343434203237382032373820323738203237380a353030203530302035303020353030 -20353030203530302035303020353634203530302035303020353030203530302035303020353030 -20353030203530305d0a2f456e636f64696e67203138203020523e3e0a656e646f626a0a31382030 -206f626a0a3c3c2f547970652f456e636f64696e672f446966666572656e6365735b0a34352f6d69 -6e75735d3e3e0a656e646f626a0a322030206f626a0a3c3c2f50726f647563657228455350204768 -6f737473637269707420372e3037293e3e656e646f626a0a787265660a302031390a303030303030 -303030302036353533352066200a30303030303032313830203030303030206e200a303030303034 -30363934203030303030206e200a30303030303032313231203030303030206e200a303030303030 -32323238203030303030206e200a30303030303031393730203030303030206e200a303030303030 -30303135203030303030206e200a30303030303031393530203030303030206e200a303030303033 -36383536203030303030206e200a30303030303336353839203030303030206e200a303030303033 -38353533203030303030206e200a30303030303032353133203030303030206e200a303030303030 -32323937203030303030206e200a30303030303339353931203030303030206e200a303030303033 -36353637203030303030206e200a30303030303338343539203030303030206e200a303030303033 -38343830203030303030206e200a30303030303338353130203030303030206e200a303030303034 -30363336203030303030206e200a747261696c65720a3c3c202f53697a65203139202f526f6f7420 -3120302052202f496e666f2032203020520a3e3e0a7374617274787265660a34303734340a252545 -4f460a diff -Nru tor-0.2.0.34/debian/micro-revision.i tor-0.2.2.16-alpha/debian/micro-revision.i --- tor-0.2.0.34/debian/micro-revision.i 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/micro-revision.i 2010-09-25 18:36:42.000000000 +0000 @@ -0,0 +1 @@ +"04ed53b25b260ea7" diff -Nru tor-0.2.0.34/debian/patches/03_tor_manpage_in_section_8.dpatch tor-0.2.2.16-alpha/debian/patches/03_tor_manpage_in_section_8.dpatch --- tor-0.2.0.34/debian/patches/03_tor_manpage_in_section_8.dpatch 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/patches/03_tor_manpage_in_section_8.dpatch 2010-09-25 18:36:42.000000000 +0000 @@ -23,23 +23,54 @@ exit 0 @DPATCH@ -diff -urNad tor-0.1.1.5/contrib/torify.1 /tmp/dpep.fOA3Mm/tor-0.1.1.5/contrib/torify.1 ---- tor-0.1.1.5/contrib/torify.1 -+++ /tmp/dpep.fOA3Mm/tor-0.1.1.5/contrib/torify.1 -@@ -18,6 +18,6 @@ - to suid binaries. - - .SH SEE ALSO --.BR tor (1), -+.BR tor (8), - .BR tsocks (1), - .BR tsocks.conf (5). -diff -urNad tor-0.1.1.5/doc/tor.1.in /tmp/dpep.fOA3Mm/tor-0.1.1.5/doc/tor.1.in ---- tor-0.1.1.5/doc/tor.1.in -+++ /tmp/dpep.fOA3Mm/tor-0.1.1.5/doc/tor.1.in -@@ -1,4 +1,4 @@ --.TH TOR 1 "February 2008" "TOR" -+.TH TOR 8 "February 2008" "TOR" - .SH NAME - tor \- The second-generation onion router - .SH SYNOPSIS +diff -ur tor-0.2.2.9-alpha/doc/tor-gencert.1.txt tor-0.2.2.9-alpha.new/doc/tor-gencert.1.txt +--- tor-0.2.2.9-alpha/doc/tor-gencert.1.txt 2010-02-02 22:40:22.000000000 +0100 ++++ tor-0.2.2.9-alpha.new/doc/tor-gencert.1.txt 2010-02-27 13:47:29.655735605 +0100 +@@ -81,7 +81,7 @@ + + SEE ALSO + -------- +-**tor**(1) + ++**tor**(8) + + + See also the "dir-spec.txt" file, distributed with Tor. + +diff -ur tor-0.2.2.9-alpha/doc/tor-resolve.1.txt tor-0.2.2.9-alpha.new/doc/tor-resolve.1.txt +--- tor-0.2.2.9-alpha/doc/tor-resolve.1.txt 2010-02-02 22:40:22.000000000 +0100 ++++ tor-0.2.2.9-alpha.new/doc/tor-resolve.1.txt 2010-02-27 13:47:37.643234209 +0100 +@@ -36,10 +36,10 @@ + + SEE ALSO + -------- +-**tor**(1), **torify**(1). + ++**tor**(8), **torify**(1). + + + See doc/socks-extensions.txt in the Tor package for protocol details. + + AUTHORS + ------- +-Roger Dingledine , Nick Mathewson . +\ No newline at end of file ++Roger Dingledine , Nick Mathewson . +diff -ur tor-0.2.2.9-alpha/doc/tor.1.txt tor-0.2.2.9-alpha.new/doc/tor.1.txt +--- tor-0.2.2.9-alpha/doc/tor.1.txt 2010-02-22 22:22:33.000000000 +0100 ++++ tor-0.2.2.9-alpha.new/doc/tor.1.txt 2010-02-27 13:47:18.531233093 +0100 +@@ -2,7 +2,7 @@ + // See LICENSE for licensing information + // This is an asciidoc file used to generate the manpage/html reference. + // Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html +-TOR(1) ++TOR(8) + ====== + + NAME +diff -ur tor-0.2.2.9-alpha/doc/torify.1.txt tor-0.2.2.9-alpha.new/doc/torify.1.txt +--- tor-0.2.2.9-alpha/doc/torify.1.txt 2010-02-02 22:40:22.000000000 +0100 ++++ tor-0.2.2.9-alpha.new/doc/torify.1.txt 2010-02-27 13:47:52.619234342 +0100 +@@ -46,5 +46,5 @@ + + SEE ALSO + -------- +-**tor**(1), **tor-resolve**(1), **torsocks**(1), **tsocks**(1), ++**tor**(8), **tor-resolve**(1), **torsocks**(1), **tsocks**(1), + **tsocks.conf**(5). diff -Nru tor-0.2.0.34/debian/patches/06_add_compile_time_defaults.dpatch tor-0.2.2.16-alpha/debian/patches/06_add_compile_time_defaults.dpatch --- tor-0.2.0.34/debian/patches/06_add_compile_time_defaults.dpatch 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/patches/06_add_compile_time_defaults.dpatch 2010-09-25 18:36:42.000000000 +0000 @@ -23,61 +23,43 @@ exit 0 @DPATCH@ -diff -urNad trunk~/src/or/config.c trunk/src/or/config.c ---- trunk~/src/or/config.c 2008-02-23 11:08:40.000000000 +0100 -+++ trunk/src/or/config.c 2008-02-23 13:43:05.000000000 +0100 -@@ -15,6 +15,7 @@ +diff -urNad tor~/src/or/config.c tor/src/or/config.c +--- tor~/src/or/config.c 2009-09-03 15:05:41.000000000 +0200 ++++ tor/src/or/config.c 2009-09-03 15:09:37.662104166 +0200 +@@ -12,6 +12,7 @@ #define CONFIG_PRIVATE #include "or.h" +#include - #ifdef MS_WINDOWS - #include - #endif -@@ -660,6 +661,8 @@ - #if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD) - static void check_libevent_version(const char *m, int server); - #endif + #include "circuitbuild.h" + #include "circuitlist.h" + #include "config.h" +@@ -717,6 +718,9 @@ + static void init_libevent(void); + static int opt_streq(const char *s1, const char *s2); + +static int debian_running_as_debiantor(); +static int debian_config_fix_defaults(); - ++ /** Magic value for or_options_t. */ #define OR_OPTIONS_MAGIC 9090909 -@@ -3522,7 +3525,7 @@ - int - options_init_from_torrc(int argc, char **argv) - { -- or_options_t *oldoptions, *newoptions; -+ or_options_t *oldoptions, *newoptions = NULL; - config_line_t *cl; - char *cf=NULL, *fname=NULL, *errmsg=NULL; - int i, retval; -@@ -3531,6 +3534,9 @@ - static char **backup_argv; - static int backup_argc; + +@@ -4086,6 +4090,9 @@ + char *command_arg = NULL; + char *errmsg=NULL; + if (debian_config_fix_defaults() < 0) + goto err; + - if (argv) { /* first time we're called. save commandline args */ + if (argv) { /* first time we're called. save command line args */ backup_argv = argv; backup_argc = argc; -@@ -3666,7 +3672,8 @@ - err: - tor_free(fname); - torrc_fname = NULL; -- config_free(&options_format, newoptions); -+ if (newoptions) -+ config_free(&options_format, newoptions); - if (errmsg) { - log(LOG_WARN,LD_CONFIG,"Failed to parse/validate config: %s", errmsg); - tor_free(errmsg); -@@ -5011,3 +5018,60 @@ - puts(routerparse_c_id); +@@ -5304,3 +5311,62 @@ + return 0; } +/* Checks whether we are running as the debian-tor user. -+ * Returns -1 on error, 1 if we are debian-tor, 0 if not */ ++ * Returns -1 on error, 2 if we are root, 1 if we are debian-tor, 0 if we are any normal user */ +static int +debian_running_as_debiantor() +{ @@ -87,7 +69,7 @@ + uid = getuid(); + /* If we run as root we also apply our debian defaults. */ + if (uid == 0) -+ return 1; ++ return 2; + + pw = getpwuid(uid); + if (!pw) { @@ -127,9 +109,11 @@ + tor_assert(var); + var->initvalue = tor_strdup("1"); + -+ var = config_find_option(&options_format, "User"); -+ tor_assert(var); -+ var->initvalue = tor_strdup("debian-tor"); ++ if (running_as_debian == 2) { ++ var = config_find_option(&options_format, "User"); ++ tor_assert(var); ++ var->initvalue = tor_strdup("debian-tor"); ++ }; + + return 0; +} diff -Nru tor-0.2.0.34/debian/patches/14_fix_geoip_warning.dpatch tor-0.2.2.16-alpha/debian/patches/14_fix_geoip_warning.dpatch --- tor-0.2.0.34/debian/patches/14_fix_geoip_warning.dpatch 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/patches/14_fix_geoip_warning.dpatch 2010-09-25 18:36:42.000000000 +0000 @@ -26,12 +26,13 @@ diff -urNad git-stable~/src/or/geoip.c git-stable/src/or/geoip.c --- git-stable~/src/or/geoip.c 2008-06-06 01:00:41.000000000 +0200 +++ git-stable/src/or/geoip.c 2008-06-11 12:54:17.605150644 +0200 -@@ -147,7 +147,7 @@ - int severity = should_record_bridge_info(options) ? LOG_WARN : LOG_INFO; +@@ -182,7 +182,8 @@ + int severity = options_need_geoip_info(options, &msg) ? LOG_WARN : LOG_INFO; clear_geoip_db(); if (!(f = fopen(filename, "r"))) { -- log_fn(severity, LD_GENERAL, "Failed to open GEOIP file %s.", filename); -+ log_fn(severity, LD_GENERAL, "Failed to open GEOIP file %s. Do you have the tor-geoipdb package installed?", filename); +- log_fn(severity, LD_GENERAL, "Failed to open GEOIP file %s. %s", ++ log_fn(severity, LD_GENERAL, "Failed to open GEOIP file %s. %s" ++ " Do you have the tor-geoipdb package installed?", + filename, msg); return -1; } - geoip_countries = smartlist_create(); diff -Nru tor-0.2.0.34/debian/README.Debian tor-0.2.2.16-alpha/debian/README.Debian --- tor-0.2.0.34/debian/README.Debian 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/README.Debian 2010-09-25 18:36:42.000000000 +0000 @@ -7,7 +7,7 @@ - PidFile is set to /var/run/tor/tor.pid (No default upstream), - default logging goes to /var/log/tor/log (instead of stdout), - DataDirectory is set to /var/lib/tor (uses $HOME/.tor upstream), -- User and Group are set to "debian-tor". +- User is set to "debian-tor". If Tor is started as any other user it behaves just like upstream's. diff -Nru tor-0.2.0.34/debian/README.polipo tor-0.2.2.16-alpha/debian/README.polipo --- tor-0.2.0.34/debian/README.polipo 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/README.polipo 2010-09-25 18:36:42.000000000 +0000 @@ -0,0 +1,9 @@ +Polipo is a http proxy that makes it easer to use Tor with a browser. + +In order to make polipo use Tor, add the following to /etc/polipo/config: + socksParentProxy = localhost:9050 +You should then point your browser at localhost:8123 . + +If you are concerned about cached data remaining on your disk, you +should also add + diskCacheRoot= diff -Nru tor-0.2.0.34/debian/rules tor-0.2.2.16-alpha/debian/rules --- tor-0.2.0.34/debian/rules 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/rules 2010-09-25 18:36:42.000000000 +0000 @@ -9,6 +9,12 @@ export PACKAGE=tor include /usr/share/dpatch/dpatch.make +# enable hardning options +export DEB_BUILD_HARDENING=1 +export DEB_BUILD_HARDENING_DEBUG=1 +CFLAGS += $(HARDENING_CFLAGS) +LDFLAGS += $(HARDENING_LDFLAGS) + # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) # @@ -26,8 +32,6 @@ CFLAGS ?= -Wall -g -LOCALHOST_IP ?= $(shell getent hosts localhost | awk '{print $$1}') - # Do not optimize the build with "noopt" ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 @@ -54,84 +58,80 @@ MAKEFLAGS += -j$(NUMJOBS) endif -CONF_OPTIONS = -# build against libdmalloc4 - it better be installed +# allow building against libdmalloc4 - it better be installed ifneq (,$(findstring with-dmalloc,$(DEB_BUILD_OPTIONS))) - CONF_OPTIONS += --with-dmalloc + confflags += --with-dmalloc endif -# inhibit building with --enable-openbsd-malloc -ifeq (,$(findstring no-enable-openbsd-malloc,$(DEB_BUILD_OPTIONS))) - CONF_OPTIONS += --enable-openbsd-malloc +# allow building with --enable-openbsd-malloc +ifneq (,$(findstring enable-openbsd-malloc,$(DEB_BUILD_OPTIONS))) + confflags += --enable-openbsd-malloc endif +export LDFLAGS +export CFLAGS + +MANPAGE_INS=doc/tor.1.in doc/torify.1.in doc/tor-gencert.1.in doc/tor-resolve.1.in + configure: patch-stamp config.status: configure - @if [ "$(LOCALHOST_IP)" != "127.0.0.1" ]; then echo; echo; echo; echo; echo; echo "######################################################################"; echo "WARNING: This system does not think localhost is 127.0.0.1. Will ignore result of testsuite. Please fix your system/chroot."; echo "######################################################################"; echo; echo; echo; echo; echo "Note: 'getent hosts localhost' should return '127.0.0.1 localhost'"; echo; fi dh_testdir - CFLAGS="$(CFLAGS)" ./configure \ + ./configure \ $(confflags) \ --prefix=/usr \ --mandir=\$${prefix}/share/man \ --infodir=\$${prefix}/share/info \ --localstatedir=/var \ - --sysconfdir=/etc \ - $(CONF_OPTIONS) + --sysconfdir=/etc build: build-stamp -build-stamp: config.status + +# create the manpages here because the build-system shipped in the tarball is +# incomplete. moving foo.8 to foo.1.in is intended. +doc/%.1.in: doc/%.1.txt patch-stamp + target="$@"; base="$${target%%.1.in}"; \ + a2x -f manpage "$$base".1.txt && \ + if [ -e "$$base".1 ]; then mv "$$base".1 "$$base".1.in; \ + elif [ -e "$$base".8 ]; then mv "$$base".8 "$$base".1.in; \ + else echo >&2 "No output produced by a2px?" && exit 1; fi + +build-stamp: config.status $(MANPAGE_INS) dh_testdir + ! [ -e debian/micro-revision.i ] || cp debian/micro-revision.i src/or/micro-revision.i + # Also touch all the .html files or else the build system will + # try to re-create them and fail badly + for file in $(MANPAGE_INS); do touch $${file%%.1.in}.html.in || exit 1; done $(MAKE) @echo @echo # Running unit tests @if [ "$(RUN_TEST)" != "no" ]; then \ - if [ "$(LOCALHOST_IP)" != "127.0.0.1" ]; then \ - echo; echo; echo "######################################################################"; echo "WARNING: This system does not think localhost is 127.0.0.1. Will ignore result of testsuite. Please fix your system/chroot."; echo "######################################################################"; echo; echo; \ - echo "src/or/test || true"; \ - src/or/test || true; \ - else \ - echo "src/or/test"; \ - src/or/test; \ - fi; \ + make check; \ else \ - echo -e "\n\nSkipping unittests\n\n"; \ + echo; echo; echo "Skipping unittests"; echo; \ fi @echo - - # XXX - # So, gs-gpl on s390 is broken (#457568) and fails to properly build - # .pdf files from .fig files using fig2dev. Therefore we ship them - # until this bug is fixed. - # - # of course we can always give it a try - # - # the hexdumps were built using something like - # perl -e 'while (<>) { print unpack ("H*", $_); }' interaction.pdf | fold > hexdump-interaction.pdf - # - # And it fails on a bunch of other archs too. - cd doc/design-paper; \ - fig2dev -L pdf cell-struct.fig cell-struct.pdf || \ - ( echo "** Using shipped pdf file because fig2dev failed"; \ - perl -e 'while (<>) { chomp; print pack ("H*", $$_); }' ../../debian/hexdump-cell-struct.pdf > cell-struct.pdf ); \ - fig2dev -L pdf interaction.fig interaction.pdf || \ - ( echo "** Using shipped pdf file because fig2dev failed"; \ - perl -e 'while (<>) { chomp; print pack ("H*", $$_); }' ../../debian/hexdump-interaction.pdf > interaction.pdf ); \ - # XXX ends - - make -C doc/design-paper tor-design.ps tor-design.pdf - touch build-stamp clean: unpatch dh_testdir dh_testroot rm -f build-stamp + rm -f src/common/common_sha1.i src/or/or_sha1.i + rm -f src/or/micro-revision.i [ ! -f Makefile ] || $(MAKE) distclean + # Normally the .deb wouldn't ship with a ../.git + if [ -d .git ] && which git >/dev/null; then \ + echo "\"`git rev-parse --short=16 HEAD`\"" > "debian/micro-revision.i" ; \ + fi + + # these get autobuilt from the .txt files, some of which we also patch + rm -f $(MANPAGE_INS) + dh_clean install: build @@ -148,7 +148,6 @@ mv $(CURDIR)/debian/tor/usr/share/man/man1/tor.1 $(CURDIR)/debian/tor/usr/share/man/man8/tor.8 install -m 755 contrib/torify $(CURDIR)/debian/tor/usr/bin - install -m 644 contrib/torify.1 $(CURDIR)/debian/tor/usr/share/man/man1 install -m 644 contrib/tor-tsocks.conf $(CURDIR)/debian/tor/etc/tor install -m 644 debian/tor.lintian-override $(CURDIR)/debian/tor/usr/share/lintian/overrides/tor @@ -189,12 +188,11 @@ dh_installinit dh_installman dh_link - # Change this for debhelper compatibility level 5 or later! - dh_strip --dbg-package=tor + dh_strip --dbg-package=tor-dbg dh_compress dh_fixperms dh_installdeb - dh_shlibdeps -- -xglibc-private + dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb @@ -206,7 +204,6 @@ # Build architecture dependant packages using the common target. binary-arch: install $(MAKE) -f debian/rules DH_OPTIONS=-s binary-common - @if [ "$(LOCALHOST_IP)" != "127.0.0.1" ]; then echo; echo; echo; echo; echo; echo "######################################################################"; echo "WARNING: This system does not think localhost is 127.0.0.1. Result of testsuite has been ignored. Please fix your system/chroot."; echo "######################################################################"; echo; echo; echo; echo; echo "Note: 'getent hosts localhost' should return '127.0.0.1 localhost'"; echo; fi binary: binary-indep binary-arch .PHONY: build clean binary-common binary-indep binary-arch binary install diff -Nru tor-0.2.0.34/debian/tor.default tor-0.2.2.16-alpha/debian/tor.default --- tor-0.2.0.34/debian/tor.default 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/tor.default 2010-09-25 18:36:42.000000000 +0000 @@ -34,6 +34,13 @@ # ARGS="" # -# Uncomment this if you want to get coredumps +# Comment this out if you do not want to get coredumps # ulimit -c unlimited + +# Let the vidalia package override some of our settings. +# People who have vidalia installed might not want to run Tor as a system +# service. The vidalia .deb can ask them that and then set run-daemon to no. +if [ -e /etc/default/tor.vidalia ] && [ -x /usr/bin/vidalia ]; then + . /etc/default/tor.vidalia +fi diff -Nru tor-0.2.0.34/debian/tor.dirs tor-0.2.2.16-alpha/debian/tor.dirs --- tor-0.2.0.34/debian/tor.dirs 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/tor.dirs 2010-09-25 18:36:42.000000000 +0000 @@ -1,7 +1,6 @@ etc/tor var/lib/tor var/log/tor -var/run/tor usr/share/lintian/overrides usr/bin usr/sbin diff -Nru tor-0.2.0.34/debian/tor.docs tor-0.2.2.16-alpha/debian/tor.docs --- tor-0.2.0.34/debian/tor.docs 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/tor.docs 2010-09-25 18:36:42.000000000 +0000 @@ -1,9 +1,4 @@ -AUTHORS debian/README.Debian +debian/README.polipo debian/README.privoxy -doc/HACKING -doc/TODO -doc/design-paper/tor-design.pdf -doc/design-paper/tor-design.ps -doc/website/stylesheet.css -doc/website/tor-* +contrib/tor-exit-notice.html diff -Nru tor-0.2.0.34/debian/tor.init tor-0.2.2.16-alpha/debian/tor.init --- tor-0.2.0.34/debian/tor.init 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/tor.init 2010-09-25 18:36:42.000000000 +0000 @@ -22,8 +22,6 @@ DESC="tor daemon" TORPIDDIR=/var/run/tor TORPID=$TORPIDDIR/tor.pid -DAEMON_USER=debian-tor -DAEMON_NAME=tor DEFAULTSFILE=/etc/default/$NAME WAITFORDAEMON=60 ARGS="" @@ -90,7 +88,7 @@ check_torpiddir () { if test ! -d $TORPIDDIR; then - echo "There is no $TORPIDDIR directory. Creating one for you." + #echo "There is no $TORPIDDIR directory. Creating one for you." mkdir -m 02700 "$TORPIDDIR" chown debian-tor:debian-tor "$TORPIDDIR" fi @@ -146,14 +144,14 @@ exit 0 fi - if start-stop-daemon --stop --signal INT --quiet --pidfile $TORPID --name $DAEMON_NAME --user $DAEMON_USER; then + if start-stop-daemon --stop --signal INT --quiet --pidfile $TORPID --exec $DAEMON; then wait_for_deaddaemon $pid echo "$NAME." elif kill -0 $pid 2>/dev/null then - echo "FAILED (Is $pid not $DAEMON_NAME or not running as $DAEMON_USER?)." + echo "FAILED (Is $pid not $NAME? Is $DAEMON a different binary now?)." else - echo "FAILED ($DAEMON_NAME died: process $pid not running; or permission denied)." + echo "FAILED ($DAEMON died: process $pid not running; or permission denied)." fi ;; reload|force-reload) @@ -167,14 +165,14 @@ check_config - if start-stop-daemon --stop --signal 1 --quiet --pidfile $TORPID --name $DAEMON_NAME --user $DAEMON_USER + if start-stop-daemon --stop --signal 1 --quiet --pidfile $TORPID --exec $DAEMON then echo "$NAME." elif kill -0 $pid 2>/dev/null then - echo "FAILED (Is $pid not $DAEMON_NAME or not running as $DAEMON_USER?)." + echo "FAILED (Is $pid not $NAME? Is $DAEMON a different binary now?)." else - echo "FAILED ($DAEMON_NAME died: process $pid not running; or permission denied)." + echo "FAILED ($DAEMON died: process $pid not running; or permission denied)." fi ;; restart) @@ -184,8 +182,26 @@ sleep 1 $0 start ;; + status) + if test ! -r $(dirname $TORPID); then + echo "cannot read tor PID file" + exit 4 + fi + pid=`cat $TORPID 2>/dev/null` || true + if test ! -f $TORPID -o -z "$pid"; then + echo "tor is not running" + exit 3 + fi + if ps "$pid" >/dev/null 2>&1; then + echo "tor is running" + exit 0 + else + echo "tor is not running" + exit 1 + fi + ;; *) - echo "Usage: $0 {start|stop|restart|reload|force-reload}" >&2 + echo "Usage: $0 {start|stop|restart|reload|force-reload|status}" >&2 exit 1 ;; esac diff -Nru tor-0.2.0.34/debian/tor.postinst tor-0.2.2.16-alpha/debian/tor.postinst --- tor-0.2.0.34/debian/tor.postinst 2010-09-25 18:36:42.000000000 +0000 +++ tor-0.2.2.16-alpha/debian/tor.postinst 2010-09-25 18:36:42.000000000 +0000 @@ -43,9 +43,11 @@ find /var/lib/tor -type d -print0 | xargs -0 --no-run-if-empty chmod 02700 find /var/lib/tor -type f -print0 | xargs -0 --no-run-if-empty chmod 00600 -find /var/run/tor \( \( ! -user debian-tor \) -o \( ! -group debian-tor \) \) -print0 | xargs -0 --no-run-if-empty chown debian-tor:debian-tor -find /var/run/tor -type d -print0 | xargs -0 --no-run-if-empty chmod 02750 -find /var/run/tor -type f -print0 | xargs -0 --no-run-if-empty chmod 00600 +if [ -e /var/run/tor ]; then + find /var/run/tor \( \( ! -user debian-tor \) -o \( ! -group debian-tor \) \) -print0 | xargs -0 --no-run-if-empty chown debian-tor:debian-tor + find /var/run/tor -type d -print0 | xargs -0 --no-run-if-empty chmod 02750 + find /var/run/tor -type f -print0 | xargs -0 --no-run-if-empty chmod 00600 +fi find /var/log/tor \( \( ! -user debian-tor \) -o \( ! -group adm \) \) -print0 | xargs -0 --no-run-if-empty chown debian-tor:adm find /var/log/tor -type d -print0 | xargs -0 --no-run-if-empty chmod 02750 diff -Nru tor-0.2.0.34/doc/asciidoc-helper.sh tor-0.2.2.16-alpha/doc/asciidoc-helper.sh --- tor-0.2.0.34/doc/asciidoc-helper.sh 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/asciidoc-helper.sh 2010-07-13 01:37:00.000000000 +0000 @@ -0,0 +1,65 @@ +#!/bin/sh + +# Copyright (c) The Tor Project, Inc. +# See LICENSE for licensing information +# Run this to generate .html.in or .1.in files from asciidoc files. +# Arguments: +# html|man asciidocpath outputfile + +set -e + +if [ $# != 3 ]; then + exit 1; +fi + +output=$3 + +if [ "$1" = "html" ]; then + input=${output%%.html.in}.1.txt + base=${output%%.html.in} + if [ "$2" != none ]; then + "$2" -d manpage -o $output $input; + else + echo "=================================="; + echo; + echo "You need asciidoc installed to be able to build the manpage."; + echo "To build without manpages, use the --disable-asciidoc argument"; + echo "when calling configure."; + echo; + echo "=================================="; + exit 1; + fi +elif [ "$1" = "man" ]; then + input=${output%%.1.in}.1.txt + base=${output%%.1.in} + + if test "$2" = none; then + echo "=================================="; + echo; + echo "You need asciidoc installed to be able to build the manpage."; + echo "To build without manpages, use the --disable-asciidoc argument"; + echo "when calling configure."; + echo; + echo "=================================="; + exit 1; + fi + if "$2" -f manpage $input; then + mv $base.1 $output; + else + cat<:80}}\001 -4 2 0 50 0 0 10 0.0000 4 135 2190 3525 1500 Relay c1{Extended, g^y2, H(K2)}\001 -4 0 0 50 0 0 10 0.0000 4 135 1845 3675 2100 Relay c2{Begin :80}\001 -4 2 0 50 0 0 10 0.0000 4 135 1410 3525 2550 Relay c1{{Connected}}\001 -4 2 0 50 0 0 10 0.0000 4 135 1290 5925 2475 Relay c2{Connected}\001 -4 0 0 50 0 0 10 0.0000 4 135 2085 1275 2925 Relay c1{{Data, "HTTP GET..."}}\001 -4 0 0 50 0 0 10 0.0000 4 135 1965 3675 3000 Relay c2{Data, "HTTP GET..."}\001 -4 1 0 50 0 0 10 0.0000 4 135 1365 4800 225 (link is TLS-encryped)\001 -4 1 0 50 0 0 10 0.0000 4 135 870 7050 225 (unencrypted)\001 -4 1 0 50 0 0 10 0.0000 4 105 780 7125 1650 cN--a circID\001 -4 2 0 50 0 0 10 0.0000 4 135 1860 3525 3600 Relay c1{{Data, (response)}}\001 -4 2 0 50 0 0 10 0.0000 4 135 645 8100 3375 (response)\001 -4 2 0 50 0 0 10 0.0000 4 135 1650 5925 3450 Relay c2{Data, (response)}\001 -4 2 0 50 0 0 10 0.0000 4 135 1545 5925 1425 Created c2, g^y2, H(K2)\001 -4 0 0 50 0 0 10 0.0000 4 135 1170 3675 1125 Create c2, E(g^x2)\001 -4 0 0 50 0 0 10 0.0000 4 135 1170 1275 450 Create c1, E(g^x1)\001 -4 2 0 50 0 0 10 0.0000 4 135 1545 3525 750 Created c1, g^y1, H(K1)\001 diff -Nru tor-0.2.0.34/doc/design-paper/latex8.bst tor-0.2.2.16-alpha/doc/design-paper/latex8.bst --- tor-0.2.0.34/doc/design-paper/latex8.bst 2008-02-26 19:56:32.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/design-paper/latex8.bst 1970-01-01 00:00:00.000000000 +0000 @@ -1,1124 +0,0 @@ - -% --------------------------------------------------------------- -% -% $Id: latex8.bst 2163 2004-08-06 19:54:29Z weasel $ -% -% by Paolo.Ienne@di.epfl.ch -% - -% --------------------------------------------------------------- -% -% no guarantee is given that the format corresponds perfectly to -% IEEE 8.5" x 11" Proceedings, but most features should be ok. -% -% --------------------------------------------------------------- -% -% `latex8' from BibTeX standard bibliography style `abbrv' -% version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09. -% Copyright (C) 1985, all rights reserved. -% Copying of this file is authorized only if either -% (1) you make absolutely no changes to your copy, including name, or -% (2) if you do make changes, you name it something other than -% btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst. -% This restriction helps ensure that all standard styles are identical. -% The file btxbst.doc has the documentation for this style. - -ENTRY - { address - author - booktitle - chapter - edition - editor - howpublished - institution - journal - key - month - note - number - organization - pages - publisher - school - series - title - type - volume - year - } - {} - { label } - -INTEGERS { output.state before.all mid.sentence after.sentence after.block } - -FUNCTION {init.state.consts} -{ #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := -} - -STRINGS { s t } - -FUNCTION {output.nonnull} -{ 's := - output.state mid.sentence = - { ", " * write$ } - { output.state after.block = - { add.period$ write$ - newline$ - "\newblock " write$ - } - { output.state before.all = - 'write$ - { add.period$ " " * write$ } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION {output} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull - if$ -} - -FUNCTION {output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} - -FUNCTION {output.bibitem} -{ newline$ - "\bibitem{" write$ - cite$ write$ - "}" write$ - newline$ - "" - before.all 'output.state := -} - -FUNCTION {fin.entry} -{ add.period$ - write$ - newline$ -} - -FUNCTION {new.block} -{ output.state before.all = - 'skip$ - { after.block 'output.state := } - if$ -} - -FUNCTION {new.sentence} -{ output.state after.block = - 'skip$ - { output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} - -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} - -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} - -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} - -FUNCTION {new.block.checka} -{ empty$ - 'skip$ - 'new.block - if$ -} - -FUNCTION {new.block.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.block - if$ -} - -FUNCTION {new.sentence.checka} -{ empty$ - 'skip$ - 'new.sentence - if$ -} - -FUNCTION {new.sentence.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.sentence - if$ -} - -FUNCTION {field.or.null} -{ duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ -} - -FUNCTION {emphasize} -{ duplicate$ empty$ - { pop$ "" } - { "{\em " swap$ * "}" * } - if$ -} - -INTEGERS { nameptr namesleft numnames } - -FUNCTION {format.names} -{ 's := - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := - nameptr #1 > - { namesleft #1 > - { ", " * t * } - { numnames #2 > - { "," * } - 'skip$ - if$ - t "others" = - { " et~al." * } - { " and " * t * } - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := - - namesleft #1 - 'namesleft := - } - while$ -} - -FUNCTION {format.authors} -{ author empty$ - { "" } - { author format.names } - if$ -} - -FUNCTION {format.editors} -{ editor empty$ - { "" } - { editor format.names - editor num.names$ #1 > - { ", editors" * } - { ", editor" * } - if$ - } - if$ -} - -FUNCTION {format.title} -{ title empty$ - { "" } - { title "t" change.case$ } - if$ -} - -FUNCTION {n.dashify} -{ 't := - "" - { t empty$ not } - { t #1 #1 substring$ "-" = - { t #1 #2 substring$ "--" = not - { "--" * - t #2 global.max$ substring$ 't := - } - { { t #1 #1 substring$ "-" = } - { "-" * - t #2 global.max$ substring$ 't := - } - while$ - } - if$ - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - -FUNCTION {format.date} -{ year empty$ - { month empty$ - { "" } - { "there's a month but no year in " cite$ * warning$ - month - } - if$ - } - { month empty$ - 'year - { month " " * year * } - if$ - } - if$ -} - -FUNCTION {format.btitle} -{ title emphasize -} - -FUNCTION {tie.or.space.connect} -{ duplicate$ text.length$ #3 < - { "~" } - { " " } - if$ - swap$ * * -} - -FUNCTION {either.or.check} -{ empty$ - 'pop$ - { "can't use both " swap$ * " fields in " * cite$ * warning$ } - if$ -} - -FUNCTION {format.bvolume} -{ volume empty$ - { "" } - { "volume" volume tie.or.space.connect - series empty$ - 'skip$ - { " of " * series emphasize * } - if$ - "volume and number" number either.or.check - } - if$ -} - -FUNCTION {format.number.series} -{ volume empty$ - { number empty$ - { series field.or.null } - { output.state mid.sentence = - { "number" } - { "Number" } - if$ - number tie.or.space.connect - series empty$ - { "there's a number but no series in " cite$ * warning$ } - { " in " * series * } - if$ - } - if$ - } - { "" } - if$ -} - -FUNCTION {format.edition} -{ edition empty$ - { "" } - { output.state mid.sentence = - { edition "l" change.case$ " edition" * } - { edition "t" change.case$ " edition" * } - if$ - } - if$ -} - -INTEGERS { multiresult } - -FUNCTION {multi.page.check} -{ 't := - #0 'multiresult := - { multiresult not - t empty$ not - and - } - { t #1 #1 substring$ - duplicate$ "-" = - swap$ duplicate$ "," = - swap$ "+" = - or or - { #1 'multiresult := } - { t #2 global.max$ substring$ 't := } - if$ - } - while$ - multiresult -} - -FUNCTION {format.pages} -{ pages empty$ - { "" } - { pages multi.page.check - { "pages" pages n.dashify tie.or.space.connect } - { "page" pages tie.or.space.connect } - if$ - } - if$ -} - -FUNCTION {format.vol.num.pages} -{ volume field.or.null - number empty$ - 'skip$ - { "(" number * ")" * * - volume empty$ - { "there's a number but no volume in " cite$ * warning$ } - 'skip$ - if$ - } - if$ - pages empty$ - 'skip$ - { duplicate$ empty$ - { pop$ format.pages } - { ":" * pages n.dashify * } - if$ - } - if$ -} - -FUNCTION {format.chapter.pages} -{ chapter empty$ - 'format.pages - { type empty$ - { "chapter" } - { type "l" change.case$ } - if$ - chapter tie.or.space.connect - pages empty$ - 'skip$ - { ", " * format.pages * } - if$ - } - if$ -} - -FUNCTION {format.in.ed.booktitle} -{ booktitle empty$ - { "" } - { editor empty$ - { "In " booktitle emphasize * } - { "In " format.editors * ", " * booktitle emphasize * } - if$ - } - if$ -} - -FUNCTION {empty.misc.check} - -{ author empty$ title empty$ howpublished empty$ - month empty$ year empty$ note empty$ - and and and and and - key empty$ not and - { "all relevant fields are empty in " cite$ * warning$ } - 'skip$ - if$ -} - -FUNCTION {format.thesis.type} -{ type empty$ - 'skip$ - { pop$ - type "t" change.case$ - } - if$ -} - -FUNCTION {format.tr.number} -{ type empty$ - { "Technical Report" } - 'type - if$ - number empty$ - { "t" change.case$ } - { number tie.or.space.connect } - if$ -} - -FUNCTION {format.article.crossref} -{ key empty$ - { journal empty$ - { "need key or journal for " cite$ * " to crossref " * crossref * - warning$ - "" - } - { "In {\em " journal * "\/}" * } - if$ - } - { "In " key * } - if$ - " \cite{" * crossref * "}" * -} - -FUNCTION {format.crossref.editor} -{ editor #1 "{vv~}{ll}" format.name$ - editor num.names$ duplicate$ - #2 > - { pop$ " et~al." * } - { #2 < - 'skip$ - { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { " et~al." * } - { " and " * editor #2 "{vv~}{ll}" format.name$ * } - if$ - } - if$ - } - if$ -} - -FUNCTION {format.book.crossref} -{ volume empty$ - { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ - "In " - } - { "Volume" volume tie.or.space.connect - " of " * - } - if$ - editor empty$ - editor field.or.null author field.or.null = - or - { key empty$ - { series empty$ - { "need editor, key, or series for " cite$ * " to crossref " * - crossref * warning$ - "" * - } - { "{\em " * series * "\/}" * } - if$ - } - { key * } - if$ - } - { format.crossref.editor * } - if$ - " \cite{" * crossref * "}" * -} - -FUNCTION {format.incoll.inproc.crossref} -{ editor empty$ - editor field.or.null author field.or.null = - or - { key empty$ - { booktitle empty$ - { "need editor, key, or booktitle for " cite$ * " to crossref " * - crossref * warning$ - "" - } - { "In {\em " booktitle * "\/}" * } - if$ - } - { "In " key * } - if$ - } - { "In " format.crossref.editor * } - if$ - " \cite{" * crossref * "}" * -} - -FUNCTION {article} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - crossref missing$ - { journal emphasize "journal" output.check - format.vol.num.pages output - format.date "year" output.check - } - { format.article.crossref output.nonnull - format.pages output - } - if$ - new.block - note output - fin.entry -} - -FUNCTION {book} -{ output.bibitem - author empty$ - { format.editors "author and editor" output.check } - { format.authors output.nonnull - crossref missing$ - { "author and editor" editor either.or.check } - 'skip$ - if$ - } - if$ - new.block - format.btitle "title" output.check - crossref missing$ - { format.bvolume output - new.block - format.number.series output - new.sentence - publisher "publisher" output.check - address output - } - { new.block - format.book.crossref output.nonnull - } - if$ - format.edition output - format.date "year" output.check - new.block - note output - fin.entry -} - -FUNCTION {booklet} -{ output.bibitem - format.authors output - new.block - format.title "title" output.check - howpublished address new.block.checkb - howpublished output - address output - format.date output - new.block - note output - fin.entry -} - -FUNCTION {inbook} -{ output.bibitem - author empty$ - { format.editors "author and editor" output.check } - { format.authors output.nonnull - - crossref missing$ - { "author and editor" editor either.or.check } - 'skip$ - if$ - } - if$ - new.block - format.btitle "title" output.check - crossref missing$ - { format.bvolume output - format.chapter.pages "chapter and pages" output.check - new.block - format.number.series output - new.sentence - publisher "publisher" output.check - address output - } - { format.chapter.pages "chapter and pages" output.check - new.block - format.book.crossref output.nonnull - } - if$ - format.edition output - format.date "year" output.check - new.block - note output - fin.entry -} - -FUNCTION {incollection} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - crossref missing$ - { format.in.ed.booktitle "booktitle" output.check - format.bvolume output - format.number.series output - format.chapter.pages output - new.sentence - publisher "publisher" output.check - address output - format.edition output - format.date "year" output.check - } - { format.incoll.inproc.crossref output.nonnull - format.chapter.pages output - } - if$ - new.block - note output - fin.entry -} - -FUNCTION {inproceedings} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - crossref missing$ - { format.in.ed.booktitle "booktitle" output.check - format.bvolume output - format.number.series output - format.pages output - address empty$ - { organization publisher new.sentence.checkb - organization output - publisher output - format.date "year" output.check - } - { address output.nonnull - format.date "year" output.check - new.sentence - organization output - publisher output - } - if$ - } - { format.incoll.inproc.crossref output.nonnull - format.pages output - } - if$ - new.block - note output - fin.entry -} - -FUNCTION {conference} { inproceedings } - -FUNCTION {manual} -{ output.bibitem - author empty$ - { organization empty$ - 'skip$ - { organization output.nonnull - address output - } - if$ - } - { format.authors output.nonnull } - if$ - new.block - format.btitle "title" output.check - author empty$ - { organization empty$ - { address new.block.checka - address output - } - 'skip$ - if$ - } - { organization address new.block.checkb - organization output - address output - } - if$ - format.edition output - format.date output - new.block - note output - fin.entry -} - -FUNCTION {mastersthesis} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - "Master's thesis" format.thesis.type output.nonnull - school "school" output.check - address output - format.date "year" output.check - new.block - note output - fin.entry -} - -FUNCTION {misc} -{ output.bibitem - format.authors output - title howpublished new.block.checkb - format.title output - howpublished new.block.checka - howpublished output - format.date output - new.block - note output - fin.entry - empty.misc.check -} - -FUNCTION {phdthesis} -{ output.bibitem - format.authors "author" output.check - new.block - format.btitle "title" output.check - new.block - "PhD thesis" format.thesis.type output.nonnull - school "school" output.check - address output - format.date "year" output.check - new.block - note output - fin.entry -} - -FUNCTION {proceedings} -{ output.bibitem - editor empty$ - { organization output } - { format.editors output.nonnull } - - if$ - new.block - format.btitle "title" output.check - format.bvolume output - format.number.series output - address empty$ - { editor empty$ - { publisher new.sentence.checka } - { organization publisher new.sentence.checkb - organization output - } - if$ - publisher output - format.date "year" output.check - } - { address output.nonnull - format.date "year" output.check - new.sentence - editor empty$ - 'skip$ - { organization output } - if$ - publisher output - } - if$ - new.block - note output - fin.entry -} - -FUNCTION {techreport} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - format.tr.number output.nonnull - institution "institution" output.check - address output - format.date "year" output.check - new.block - note output - fin.entry -} - -FUNCTION {unpublished} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - note "note" output.check - format.date output - fin.entry -} - -FUNCTION {default.type} { misc } - -MACRO {jan} {"Jan."} - -MACRO {feb} {"Feb."} - -MACRO {mar} {"Mar."} - -MACRO {apr} {"Apr."} - -MACRO {may} {"May"} - -MACRO {jun} {"June"} - -MACRO {jul} {"July"} - -MACRO {aug} {"Aug."} - -MACRO {sep} {"Sept."} - -MACRO {oct} {"Oct."} - -MACRO {nov} {"Nov."} - -MACRO {dec} {"Dec."} - -MACRO {acmcs} {"ACM Comput. Surv."} - -MACRO {acta} {"Acta Inf."} - -MACRO {cacm} {"Commun. ACM"} - -MACRO {ibmjrd} {"IBM J. Res. Dev."} - -MACRO {ibmsj} {"IBM Syst.~J."} - -MACRO {ieeese} {"IEEE Trans. Softw. Eng."} - -MACRO {ieeetc} {"IEEE Trans. Comput."} - -MACRO {ieeetcad} - {"IEEE Trans. Comput.-Aided Design Integrated Circuits"} - -MACRO {ipl} {"Inf. Process. Lett."} - -MACRO {jacm} {"J.~ACM"} - -MACRO {jcss} {"J.~Comput. Syst. Sci."} - -MACRO {scp} {"Sci. Comput. Programming"} - -MACRO {sicomp} {"SIAM J. Comput."} - -MACRO {tocs} {"ACM Trans. Comput. Syst."} - -MACRO {tods} {"ACM Trans. Database Syst."} - -MACRO {tog} {"ACM Trans. Gr."} - -MACRO {toms} {"ACM Trans. Math. Softw."} - -MACRO {toois} {"ACM Trans. Office Inf. Syst."} - -MACRO {toplas} {"ACM Trans. Prog. Lang. Syst."} - -MACRO {tcs} {"Theoretical Comput. Sci."} - -READ - -FUNCTION {sortify} -{ purify$ - "l" change.case$ -} - -INTEGERS { len } - -FUNCTION {chop.word} -{ 's := - 'len := - s #1 len substring$ = - { s len #1 + global.max$ substring$ } - 's - if$ -} - -FUNCTION {sort.format.names} -{ 's := - #1 'nameptr := - "" - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { nameptr #1 > - { " " * } - 'skip$ - if$ - s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := - nameptr numnames = t "others" = and - { "et al" * } - { t sortify * } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ -} - -FUNCTION {sort.format.title} -{ 't := - "A " #2 - "An " #3 - "The " #4 t chop.word - chop.word - chop.word - sortify - #1 global.max$ substring$ -} - -FUNCTION {author.sort} -{ author empty$ - { key empty$ - { "to sort, need author or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {author.editor.sort} -{ author empty$ - { editor empty$ - { key empty$ - { "to sort, need author, editor, or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { editor sort.format.names } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {author.organization.sort} -{ author empty$ - - { organization empty$ - { key empty$ - { "to sort, need author, organization, or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { "The " #4 organization chop.word sortify } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {editor.organization.sort} -{ editor empty$ - { organization empty$ - { key empty$ - { "to sort, need editor, organization, or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { "The " #4 organization chop.word sortify } - if$ - } - { editor sort.format.names } - if$ -} - -FUNCTION {presort} -{ type$ "book" = - type$ "inbook" = - or - 'author.editor.sort - { type$ "proceedings" = - 'editor.organization.sort - { type$ "manual" = - 'author.organization.sort - 'author.sort - if$ - } - if$ - } - if$ - " " - * - year field.or.null sortify - * - " " - * - title field.or.null - sort.format.title - * - #1 entry.max$ substring$ - 'sort.key$ := -} - -ITERATE {presort} - -SORT - -STRINGS { longest.label } - -INTEGERS { number.label longest.label.width } - -FUNCTION {initialize.longest.label} -{ "" 'longest.label := - #1 'number.label := - #0 'longest.label.width := -} - -FUNCTION {longest.label.pass} -{ number.label int.to.str$ 'label := - number.label #1 + 'number.label := - label width$ longest.label.width > - { label 'longest.label := - label width$ 'longest.label.width := - } - 'skip$ - if$ -} - -EXECUTE {initialize.longest.label} - -ITERATE {longest.label.pass} - -FUNCTION {begin.bib} -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - "\begin{thebibliography}{" longest.label * - "}\setlength{\itemsep}{-1ex}\small" * write$ newline$ -} - -EXECUTE {begin.bib} - -EXECUTE {init.state.consts} - -ITERATE {call.type$} - -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} - -EXECUTE {end.bib} - -% end of file latex8.bst -% --------------------------------------------------------------- - - - diff -Nru tor-0.2.0.34/doc/design-paper/Makefile.am tor-0.2.2.16-alpha/doc/design-paper/Makefile.am --- tor-0.2.0.34/doc/design-paper/Makefile.am 2008-02-26 19:56:32.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/design-paper/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ - -cell-struct.eps: cell-struct.fig - fig2dev -L eps $< $@ -interaction.eps: interaction.fig - fig2dev -L eps $< $@ -cell-struct.pdf: cell-struct.fig - fig2dev -L pdf $< $@ -interaction.pdf: interaction.fig - fig2dev -L pdf $< $@ - -tor-design.ps: cell-struct.eps interaction.eps tor-design.bib tor-design.tex usenix.sty latex8.bst - latex tor-design.tex - bibtex tor-design - latex tor-design.tex - latex tor-design.tex - dvips -o $@ tor-design.dvi - -tor-design.pdf: cell-struct.pdf interaction.pdf tor-design.bib tor-design.tex usenix.sty latex8.bst - pdflatex tor-design.tex - bibtex tor-design - pdflatex tor-design.tex - pdflatex tor-design.tex - -EXTRA_DIST = cell-struct.fig interaction.fig tor-design.bib usenix.sty latex8.bst tor-design.tex - -DISTCLEANFILES = cell-struct.eps interaction.eps cell-struct.pdf interaction.pdf tor-design.aux tor-design.bbl tor-design.blg tor-design.log tor-design.dvi tor-design.ps tor-design.pdf diff -Nru tor-0.2.0.34/doc/design-paper/Makefile.in tor-0.2.2.16-alpha/doc/design-paper/Makefile.in --- tor-0.2.0.34/doc/design-paper/Makefile.in 2009-02-09 03:31:01.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/design-paper/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,340 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = doc/design-paper -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/orconfig.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINDIR = @BINDIR@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONFDIR = @CONFDIR@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LOCALSTATEDIR = @LOCALSTATEDIR@ -LOGFACILITY = @LOGFACILITY@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TORGROUP = @TORGROUP@ -TORUSER = @TORUSER@ -TOR_CPPFLAGS_libevent = @TOR_CPPFLAGS_libevent@ -TOR_CPPFLAGS_openssl = @TOR_CPPFLAGS_openssl@ -TOR_CPPFLAGS_zlib = @TOR_CPPFLAGS_zlib@ -TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ -TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ -TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ -TOR_LIB_GDI = @TOR_LIB_GDI@ -TOR_LIB_WS32 = @TOR_LIB_WS32@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -EXTRA_DIST = cell-struct.fig interaction.fig tor-design.bib usenix.sty latex8.bst tor-design.tex -DISTCLEANFILES = cell-struct.eps interaction.eps cell-struct.pdf interaction.pdf tor-design.aux tor-design.bbl tor-design.blg tor-design.log tor-design.dvi tor-design.ps tor-design.pdf -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/design-paper/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign doc/design-paper/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-exec-am: - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am - - -cell-struct.eps: cell-struct.fig - fig2dev -L eps $< $@ -interaction.eps: interaction.fig - fig2dev -L eps $< $@ -cell-struct.pdf: cell-struct.fig - fig2dev -L pdf $< $@ -interaction.pdf: interaction.fig - fig2dev -L pdf $< $@ - -tor-design.ps: cell-struct.eps interaction.eps tor-design.bib tor-design.tex usenix.sty latex8.bst - latex tor-design.tex - bibtex tor-design - latex tor-design.tex - latex tor-design.tex - dvips -o $@ tor-design.dvi - -tor-design.pdf: cell-struct.pdf interaction.pdf tor-design.bib tor-design.tex usenix.sty latex8.bst - pdflatex tor-design.tex - bibtex tor-design - pdflatex tor-design.tex - pdflatex tor-design.tex -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff -Nru tor-0.2.0.34/doc/design-paper/tor-design.bib tor-0.2.2.16-alpha/doc/design-paper/tor-design.bib --- tor-0.2.0.34/doc/design-paper/tor-design.bib 2008-02-26 19:56:32.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/design-paper/tor-design.bib 1970-01-01 00:00:00.000000000 +0000 @@ -1,1449 +0,0 @@ -% hs-attack -@inproceedings{hs-attack, - title = {Locating Hidden Servers}, - author = {Lasse {\O}verlier and Paul Syverson}, - booktitle = {Proceedings of the 2006 IEEE Symposium on Security and Privacy}, - year = {2006}, - month = {May}, - publisher = {IEEE CS}, -} - - -@TechReport{bauer:tr2007, - author = {Kevin Bauer and Damon McCoy and Dirk Grunwald and Tadayoshi Kohno and Douglas Sicker}, - title = {Low-Resource Routing Attacks Against Anonymous Systems}, - institution = {University of Colorado at Boulder}, - year = 2007, - number = {CU-CS-1025-07} -} - -% fix me -@misc{tannenbaum96, - author = "Andrew Tannenbaum", - title = "Computer Networks", - year = "1996", - publisher = "Prentice Hall, 3rd edition", -} - -@article{ meadows96, - author = "Catherine Meadows", - title = "The {NRL} Protocol Analyzer: An Overview", - journal = "Journal of Logic Programming", - volume = "26", - number = "2", - pages = "113--131", - year = "1996", -} -@inproceedings{kesdogan:pet2002, - title = {Unobservable Surfing on the World Wide Web: Is Private Information Retrieval an - alternative to the MIX based Approach?}, - author = {Dogan Kesdogan and Mark Borning and Michael Schmeink}, - booktitle = {Privacy Enhancing Technologies (PET 2002)}, - year = {2002}, - month = {April}, - editor = {Roger Dingledine and Paul Syverson}, - publisher = {Springer-Verlag, LNCS 2482}, -} - -@inproceedings{statistical-disclosure, - title = {Statistical Disclosure Attacks}, - author = {George Danezis}, - booktitle = {Security and Privacy in the Age of Uncertainty ({SEC2003})}, - organization = {{IFIP TC11}}, - year = {2003}, - month = {May}, - address = {Athens}, - pages = {421--426}, - publisher = {Kluwer}, -} - -@inproceedings{limits-open, - title = {Limits of Anonymity in Open Environments}, - author = {Dogan Kesdogan and Dakshi Agrawal and Stefan Penz}, - booktitle = {Information Hiding Workshop (IH 2002)}, - year = {2002}, - month = {October}, - editor = {Fabien Petitcolas}, - publisher = {Springer-Verlag, LNCS 2578}, -} - -@inproceedings{isdn-mixes, - title = {{ISDN-mixes: Untraceable communication with very small bandwidth overhead}}, - author = {Andreas Pfitzmann and Birgit Pfitzmann and Michael Waidner}, - booktitle = {GI/ITG Conference on Communication in Distributed Systems}, - year = {1991}, - month = {February}, - pages = {451-463}, -} - - -@Article{jerichow-jsac98, - author = {Anja Jerichow and Jan M\"{u}ller and Andreas - Pfitzmann and Birgit Pfitzmann and Michael Waidner}, - title = {Real-Time Mixes: A Bandwidth-Efficient Anonymity Protocol}, - journal = {IEEE Journal on Selected Areas in Communications}, - year = 1998, - volume = 16, - number = 4, - pages = {495--509}, - month = {May} -} - -@inproceedings{tarzan:ccs02, - title = {Tarzan: A Peer-to-Peer Anonymizing Network Layer}, - author = {Michael J. Freedman and Robert Morris}, - booktitle = {9th {ACM} {C}onference on {C}omputer and {C}ommunications - {S}ecurity ({CCS 2002})}, - year = {2002}, - month = {November}, - address = {Washington, DC}, -} - -@inproceedings{cebolla, - title = {{Cebolla: Pragmatic IP Anonymity}}, - author = {Zach Brown}, - booktitle = {Ottawa Linux Symposium}, - year = {2002}, - month = {June}, -} - -@inproceedings{eax, - author = "M. Bellare and P. Rogaway and D. Wagner", - title = {The {EAX} Mode of Operation: A Two-Pass Authenticated-Encryption Scheme Optimized for Simplicity and Efficiency}, - booktitle = {Fast Software Encryption 2004}, - month = {February}, - year = {2004}, -} - -@misc{darkside, - title = {{The Dark Side of the Web: An Open Proxy's View}}, - author = {Vivek S. Pai and Limin Wang and KyoungSoo Park and Ruoming Pang and Larry Peterson}, - note = {\newline \url{http://codeen.cs.princeton.edu/}}, -} -% note = {Submitted to HotNets-II. \url{http://codeen.cs.princeton.edu/}}, - -@Misc{anonymizer, - key = {anonymizer}, - title = {The {Anonymizer}}, - note = {\url{http://anonymizer.com/}} -} - -@Misc{privoxy, - key = {privoxy}, - title = {{Privoxy}}, - note = {\url{http://www.privoxy.org/}} -} - -@Misc{i2p, - key = {i2p}, - title = {{I2P}}, - note = {\url{http://www.i2p.net/}} -} - -@Misc{nym, - author = {Jason Holt}, - title = {nym: practical pseudonymity for anonymous networks}, - note = {Paper and source code at \url{http://www.lunkwill.org/src/nym/}} -} - -@InProceedings{nymble, - author = {Peter C. Johnson and Apu Kapadia and Patrick P. Tsang and Sean W. Smith}, - title = {Nymble: Anonymous IP-address Blocking}, - booktitle = {Privacy Enhancing Technologies (PET 2007)}, - year = 2007, - publisher = {Springer-Verlag, LNCS (forthcoming)} -} - -@inproceedings{anonnet, - title = {{Analysis of an Anonymity Network for Web Browsing}}, - author = {Marc Rennhard and Sandro Rafaeli and Laurent Mathy and Bernhard Plattner and - David Hutchison}, - booktitle = {{IEEE 7th Intl. Workshop on Enterprise Security (WET ICE - 2002)}}, - year = {2002}, - month = {June}, - address = {Pittsburgh, USA}, -} -% pages = {49--54}, - -@inproceedings{econymics, - title = {On the Economics of Anonymity}, - author = {Alessandro Acquisti and Roger Dingledine and Paul Syverson}, - booktitle = {Financial Cryptography}, - year = {2003}, - editor = {Rebecca N. Wright}, - publisher = {Springer-Verlag, LNCS 2742}, -} - -@inproceedings{defensive-dropping, - title = {Timing Analysis in Low-Latency Mix-Based Systems}, - author = {Brian N. Levine and Michael K. Reiter and Chenxi Wang and Matthew Wright}, - booktitle = {Financial Cryptography}, - year = {2004}, - editor = {Ari Juels}, - publisher = {Springer-Verlag, LNCS (forthcoming)}, -} - -@inproceedings{morphmix:fc04, - title = {Practical Anonymity for the Masses with MorphMix}, - author = {Marc Rennhard and Bernhard Plattner}, - booktitle = {Financial Cryptography}, - year = {2004}, - editor = {Ari Juels}, - publisher = {Springer-Verlag, LNCS (forthcoming)}, -} - -@inproceedings{eternity, - title = {The Eternity Service}, - author = {Ross Anderson}, - booktitle = {Pragocrypt '96}, - year = {1996}, -} - %note = {\url{http://www.cl.cam.ac.uk/users/rja14/eternity/eternity.html}}, - - -@inproceedings{minion-design, - title = {Mixminion: Design of a Type {III} Anonymous Remailer Protocol}, - author = {George Danezis and Roger Dingledine and Nick Mathewson}, - booktitle = {2003 IEEE Symposium on Security and Privacy}, - year = {2003}, - month = {May}, - publisher = {IEEE CS}, - pages = {2--15}, -} - %note = {\url{http://mixminion.net/minion-design.pdf}}, - -@inproceedings{ rao-pseudonymity, - author = "Josyula R. Rao and Pankaj Rohatgi", - title = "Can Pseudonymity Really Guarantee Privacy?", - booktitle = "Proceedings of the Ninth USENIX Security Symposium", - year = {2000}, - month = Aug, - publisher = {USENIX}, - pages = "85--96", -} - %note = {\url{http://www.usenix.org/publications/library/proceedings/sec2000/ -%full_papers/rao/rao.pdf}}, - -@InProceedings{pfitzmann90how, - author = "Birgit Pfitzmann and Andreas Pfitzmann", - title = "How to Break the Direct {RSA}-Implementation of {MIXes}", - booktitle = {Eurocrypt 89}, - publisher = {Springer-Verlag, LNCS 434}, - year = {1990}, - note = {\url{http://citeseer.nj.nec.com/pfitzmann90how.html}}, -} - -@Misc{tor-spec, - author = {Roger Dingledine and Nick Mathewson}, - title = {Tor Protocol Specifications}, - note = {\url{https://www.torproject.org/svn/trunk/doc/tor-spec.txt}}, -} - -@Misc{incentives-txt, - author = {Roger Dingledine and Nick Mathewson}, - title = {Tor Incentives Design Brainstorms}, - note = {\url{https://www.torproject.org/svn/trunk/doc/incentives.txt}}, -} - -@InProceedings{BM:mixencrypt, - author = {M{\"o}ller, Bodo}, - title = {Provably Secure Public-Key Encryption for Length-Preserving Chaumian Mixes}, - booktitle = {{CT-RSA} 2003}, - publisher = {Springer-Verlag, LNCS 2612}, - year = 2003, -} - -@InProceedings{back01, - author = {Adam Back and Ulf M\"oller and Anton Stiglic}, - title = {Traffic Analysis Attacks and Trade-Offs in Anonymity Providing Systems}, - booktitle = {Information Hiding (IH 2001)}, - pages = {245--257}, - year = 2001, - editor = {Ira S. Moskowitz}, - publisher = {Springer-Verlag, LNCS 2137}, -} - %note = {\newline \url{http://www.cypherspace.org/adam/pubs/traffic.pdf}}, - -@InProceedings{rackoff93cryptographic, - author = {Charles Rackoff and Daniel R. Simon}, - title = {Cryptographic Defense Against Traffic Analysis}, - booktitle = {{ACM} Symposium on Theory of Computing}, - pages = {672--681}, - year = {1993}, -} - %note = {\url{http://research.microsoft.com/crypto/dansimon/me.htm}}, - -@InProceedings{freehaven-berk, - author = {Roger Dingledine and Michael J. Freedman and David Molnar}, - title = {The Free Haven Project: Distributed Anonymous Storage Service}, - booktitle = {Designing Privacy Enhancing Technologies: Workshop - on Design Issue in Anonymity and Unobservability}, - year = 2000, - month = {July}, - editor = {H. Federrath}, - publisher = {Springer-Verlag, LNCS 2009}, -} - - @InProceedings{move-ndss05, - author = {Angelos Stavrou and Angelos D. Keromytis and Jason Nieh and Vishal Misra and Dan Rubenstein}, - title = {MOVE: An End-to-End Solution To Network Denial of Service}, - booktitle = {{ISOC Network and Distributed System Security Symposium (NDSS05)}}, - year = 2005, - month = {February}, - publisher = {Internet Society} -} - -%note = {\url{http://freehaven.net/papers.html}}, - - - - -@InProceedings{raymond00, - author = {J. F. Raymond}, - title = {{Traffic Analysis: Protocols, Attacks, Design Issues, - and Open Problems}}, - booktitle = {Designing Privacy Enhancing Technologies: Workshop - on Design Issue in Anonymity and Unobservability}, - year = 2000, - month = {July}, - pages = {10-29}, - editor = {H. Federrath}, - publisher = {Springer-Verlag, LNCS 2009}, -} - -@InProceedings{sybil, - author = "John Douceur", - title = {{The Sybil Attack}}, - booktitle = "Proceedings of the 1st International Peer To Peer Systems Workshop (IPTPS)", - month = Mar, - year = 2002, -} - - -@InCollection{price-privacy, - author = {Paul Syverson and Adam Shostack}, - editor = {L. Jean Camp and Stephen Lewis}, - title = {What Price Privacy? (and why identity theft is about neither identity nor theft)}, - booktitle = {Economics of Information Security}, - chapter = 10, - publisher = {Kluwer}, - year = 2004, - pages = {129--142} -} - - -@InProceedings{trickle02, - author = {Andrei Serjantov and Roger Dingledine and Paul Syverson}, - title = {From a Trickle to a Flood: Active Attacks on Several - Mix Types}, - booktitle = {Information Hiding (IH 2002)}, - year = {2002}, - editor = {Fabien Petitcolas}, - publisher = {Springer-Verlag, LNCS 2578}, -} - -@InProceedings{langos02, - author = {Oliver Berthold and Heinrich Langos}, - title = {Dummy Traffic Against Long Term Intersection Attacks}, - booktitle = {Privacy Enhancing Technologies (PET 2002)}, - year = {2002}, - editor = {Roger Dingledine and Paul Syverson}, - publisher = {Springer-Verlag, LNCS 2482} -} - - -@InProceedings{hintz-pet02, - author = {Andrew Hintz}, - title = {Fingerprinting Websites Using Traffic Analysis}, - booktitle = {Privacy Enhancing Technologies (PET 2002)}, - pages = {171--178}, - year = 2002, - editor = {Roger Dingledine and Paul Syverson}, - publisher = {Springer-Verlag, LNCS 2482} -} - -@InProceedings{or-discex00, - author = {Paul Syverson and Michael Reed and David Goldschlag}, - title = {{O}nion {R}outing Access Configurations}, - booktitle = {DARPA Information Survivability Conference and - Exposition (DISCEX 2000)}, - year = {2000}, - publisher = {IEEE CS Press}, - pages = {34--40}, - volume = {1}, -} - %note = {\newline \url{http://www.onion-router.net/Publications.html}}, - -@Inproceedings{or-pet00, - title = {{Towards an Analysis of Onion Routing Security}}, - author = {Paul Syverson and Gene Tsudik and Michael Reed and - Carl Landwehr}, - booktitle = {Designing Privacy Enhancing Technologies: Workshop - on Design Issue in Anonymity and Unobservability}, - year = 2000, - month = {July}, - pages = {96--114}, - editor = {H. Federrath}, - publisher = {Springer-Verlag, LNCS 2009}, -} - %note = {\url{http://www.onion-router.net/Publications/WDIAU-2000.ps.gz}}, - -@Inproceedings{freenet-pets00, - title = {Freenet: A Distributed Anonymous Information Storage - and Retrieval System}, - author = {Ian Clarke and Oskar Sandberg and Brandon Wiley and - Theodore W. Hong}, - booktitle = {Designing Privacy Enhancing Technologies: Workshop - on Design Issue in Anonymity and Unobservability}, - year = 2000, - month = {July}, - pages = {46--66}, - editor = {H. Federrath}, - publisher = {Springer-Verlag, LNCS 2009}, -} - %note = {\url{http://citeseer.nj.nec.com/clarke00freenet.html}}, - -@InProceedings{or-ih96, - author = {David M. Goldschlag and Michael G. Reed and Paul - F. Syverson}, - title = {Hiding Routing Information}, - booktitle = {Information Hiding, First International Workshop}, - pages = {137--150}, - year = 1996, - editor = {R. Anderson}, - month = {May}, - publisher = {Springer-Verlag, LNCS 1174}, -} - -@InProceedings{federrath-ih96, - author = {Hannes Federrath and Anja Jerichow and Andreas Pfitzmann}, - title = {{MIXes} in Mobile Communication Systems: Location - Management with Privacy}, - booktitle = {Information Hiding, First International Workshop}, - pages = {121--135}, - year = 1996, - editor = {R. Anderson}, - month = {May}, - publisher = {Springer-Verlag, LNCS 1174}, -} - - -@InProceedings{reed-protocols97, - author = {Michael G. Reed and Paul F. Syverson and David - M. Goldschlag}, - title = {Protocols Using Anonymous Connections: Mobile Applications}, - booktitle = {Security Protocols: 5th International Workshop}, - pages = {13--23}, - year = 1997, - editor = {Bruce Christianson and Bruno Crispo and Mark Lomas - and Michael Roe}, - month = {April}, - publisher = {Springer-Verlag, LNCS 1361} -} - - - -@Article{or-jsac98, - author = {Michael G. Reed and Paul F. Syverson and David - M. Goldschlag}, - title = {Anonymous Connections and Onion Routing}, - journal = {IEEE Journal on Selected Areas in Communications}, - year = 1998, - volume = 16, - number = 4, - pages = {482--494}, - month = {May}, -} - %note = {\url{http://www.onion-router.net/Publications/JSAC-1998.ps.gz}} - -@Misc{TLS, - author = {T. Dierks and C. Allen}, - title = {The {TLS} {P}rotocol --- {V}ersion 1.0}, - howpublished = {IETF RFC 2246}, - month = {January}, - year = {1999}, -} -%note = {\url{http://www.rfc-editor.org/rfc/rfc2246.txt}}, - -@Misc{SMTP, - author = {J. Postel}, - title = {Simple {M}ail {T}ransfer {P}rotocol}, - howpublished = {IETF RFC 2821 (also STD0010)}, - month = {April}, - year = {2001}, - note = {\url{http://www.rfc-editor.org/rfc/rfc2821.txt}}, -} - -@Misc{IMAP, - author = {M. Crispin}, - title = {Internet {M}essage {A}ccess {P}rotocol --- {V}ersion 4rev1}, - howpublished = {IETF RFC 2060}, - month = {December}, - year = {1996}, - note = {\url{http://www.rfc-editor.org/rfc/rfc2060.txt}}, -} - -@misc{pipenet, - title = {PipeNet 1.1}, - author = {Wei Dai}, - year = 1996, - month = {August}, - howpublished = {Usenet post}, - note = {\url{http://www.eskimo.com/~weidai/pipenet.txt} First mentioned - in a post to the cypherpunks list, Feb.\ 1995.}, -} - - -@Misc{POP3, - author = {J. Myers and M. Rose}, - title = {Post {O}ffice {P}rotocol --- {V}ersion 3}, - howpublished = {IETF RFC 1939 (also STD0053)}, - month = {May}, - year = {1996}, - note = {\url{http://www.rfc-editor.org/rfc/rfc1939.txt}}, -} - - -@InProceedings{shuffle, - author = {C. Andrew Neff}, - title = {A Verifiable Secret Shuffle and its Application to E-Voting}, - booktitle = {8th ACM Conference on Computer and Communications - Security (CCS-8)}, - pages = {116--125}, - year = 2001, - editor = {P. Samarati}, - month = {November}, - publisher = {ACM Press}, -} - %note = {\url{http://www.votehere.net/ada_compliant/ourtechnology/ - % technicaldocs/shuffle.pdf}}, - -@InProceedings{dolev91, - author = {Danny Dolev and Cynthia Dwork and Moni Naor}, - title = {Non-Malleable Cryptography}, - booktitle = {23rd ACM Symposium on the Theory of Computing (STOC)}, - pages = {542--552}, - year = 1991, - note = {Updated version at - \url{http://citeseer.nj.nec.com/dolev00nonmalleable.html}}, -} - -@TechReport{rsw96, - author = {Ronald L. Rivest and Adi Shamir and David A. Wagner}, - title = {Time-lock puzzles and timed-release Crypto}, - year = 1996, - type = {MIT LCS technical memo}, - number = {MIT/LCS/TR-684}, - month = {February}, - note = {\newline \url{http://citeseer.nj.nec.com/rivest96timelock.html}}, -} - -@InProceedings{web-mix, - author = {Oliver Berthold and Hannes Federrath and Stefan K\"opsell}, - title = {Web {MIX}es: A system for anonymous and unobservable - {I}nternet access}, - booktitle = {Designing Privacy Enhancing Technologies: Workshop - on Design Issue in Anonymity and Unobservability}, - editor = {H. Federrath}, - publisher = {Springer-Verlag, LNCS 2009}, - year = {2000}, -} -% pages = {115--129}, - -@InProceedings{disad-free-routes, - author = {Oliver Berthold and Andreas Pfitzmann and Ronny Standtke}, - title = {The disadvantages of free {MIX} routes and how to overcome - them}, - booktitle = {Designing Privacy Enhancing Technologies: Workshop - on Design Issue in Anonymity and Unobservability}, - pages = {30--45}, - year = 2000, - editor = {H. Federrath}, - publisher = {Springer-Verlag, LNCS 2009}, -} - %note = {\url{http://www.tik.ee.ethz.ch/~weiler/lehre/netsec/Unterlagen/anon/ - % disadvantages_berthold.pdf}}, - -@InProceedings{boneh00, - author = {Dan Boneh and Moni Naor}, - title = {Timed Commitments}, - booktitle = {Advances in Cryptology -- {CRYPTO} 2000}, - pages = {236--254}, - year = 2000, - publisher = {Springer-Verlag, LNCS 1880}, - note = {\newline \url{http://crypto.stanford.edu/~dabo/abstracts/timedcommit.html}}, -} - -@InProceedings{goldschlag98, - author = {David M. Goldschlag and Stuart G. Stubblebine}, - title = {Publicly Verifiable Lotteries: Applications of - Delaying Functions}, - booktitle = {Financial Cryptography}, - pages = {214--226}, - year = 1998, - publisher = {Springer-Verlag, LNCS 1465}, - note = {\newline \url{http://citeseer.nj.nec.com/goldschlag98publicly.html}}, -} - -@InProceedings{syverson98, - author = {Paul Syverson}, - title = {Weakly Secret Bit Commitment: Applications to - Lotteries and Fair Exchange}, - booktitle = {Computer Security Foundations Workshop (CSFW11)}, - pages = {2--13}, - year = 1998, - address = {Rockport Massachusetts}, - month = {June}, - publisher = {IEEE CS Press}, - note = {\newline \url{http://chacs.nrl.navy.mil/publications/CHACS/1998/}}, -} - -@Misc{shoup-iso, - author = {Victor Shoup}, - title = {A Proposal for an {ISO} {S}tandard for Public Key Encryption (version 2.1)}, - note = {Revised December 20, 2001. \url{http://www.shoup.net/papers/}}, -} - -@Misc{shoup-oaep, - author = {Victor Shoup}, - title = {{OAEP} Reconsidered}, - howpublished = {{IACR} e-print 2000/060}, - note = {\newline \url{http://eprint.iacr.org/2000/060/}}, -} - -@Misc{oaep-still-alive, - author = {E. Fujisaki and D. Pointcheval and T. Okamoto and J. Stern}, - title = {{RSA}-{OAEP} is Still Alive!}, - howpublished = {{IACR} e-print 2000/061}, - note = {\newline \url{http://eprint.iacr.org/2000/061/}}, -} - -@misc{echolot, - author = {Peter Palfrader}, - title = {Echolot: a pinger for anonymous remailers}, - note = {\url{http://www.palfrader.org/echolot/}}, -} - -@Misc{mixmaster-attacks, - author = {Lance Cottrell}, - title = {Mixmaster and Remailer Attacks}, - note = {\url{http://www.obscura.com/~loki/remailer/remailer-essay.html}}, -} - -@Misc{mixmaster-spec, - author = {Ulf M{\"o}ller and Lance Cottrell and Peter - Palfrader and Len Sassaman}, - title = {Mixmaster {P}rotocol --- {V}ersion 2}, - year = {2003}, - month = {July}, - howpublished = {Draft}, - note = {\url{http://www.abditum.com/mixmaster-spec.txt}}, -} - -@InProceedings{puzzles-tls, - author = "Drew Dean and Adam Stubblefield", - title = {{Using Client Puzzles to Protect TLS}}, - booktitle = "Proceedings of the 10th USENIX Security Symposium", - year = {2001}, - month = Aug, - publisher = {USENIX}, -} - -@InProceedings{breadpudding, - author = {Markus Jakobsson and Ari Juels}, - title = {Proofs of Work and Bread Pudding Protocols}, - booktitle = {Proceedings of the IFIP TC6 and TC11 Joint Working - Conference on Communications and Multimedia Security - (CMS '99)}, - year = 1999, - month = {September}, - publisher = {Kluwer} -} - -@Misc{hashcash, - author = {Adam Back}, - title = {Hash cash}, - note = {\newline \url{http://www.cypherspace.org/~adam/hashcash/}}, -} - -@InProceedings{oreilly-acc, - author = {Roger Dingledine and Michael J. Freedman and David Molnar}, - title = {Accountability}, - booktitle = {Peer-to-peer: Harnessing the Benefits of a Disruptive - Technology}, - year = {2001}, - publisher = {O'Reilly and Associates}, -} - - -@InProceedings{han, - author = {Yongfei Han}, - title = {Investigation of non-repudiation protocols}, - booktitle = {ACISP '96}, - year = 1996, - publisher = {Springer-Verlag}, -} - - -@Misc{socks5, - key = {socks5}, - title = {{SOCKS} {P}rotocol {V}ersion 5}, - howpublished= {IETF RFC 1928}, - month = {March}, - year = 1996, - note = {\url{http://www.ietf.org/rfc/rfc1928.txt}} -} - -@InProceedings{abe, - author = {Masayuki Abe}, - title = {Universally Verifiable {MIX} With Verification Work Independent of - The Number of {MIX} Servers}, - booktitle = {{EUROCRYPT} 1998}, - year = {1998}, - publisher = {Springer-Verlag, LNCS 1403}, -} - -@InProceedings{desmedt, - author = {Yvo Desmedt and Kaoru Kurosawa}, - title = {How To Break a Practical {MIX} and Design a New One}, - booktitle = {{EUROCRYPT} 2000}, - year = {2000}, - publisher = {Springer-Verlag, LNCS 1803}, - note = {\url{http://citeseer.nj.nec.com/447709.html}}, -} - -@InProceedings{mitkuro, - author = {M. Mitomo and K. Kurosawa}, - title = {{Attack for Flash MIX}}, - booktitle = {{ASIACRYPT} 2000}, - year = {2000}, - publisher = {Springer-Verlag, LNCS 1976}, - note = {\newline \url{http://citeseer.nj.nec.com/450148.html}}, -} - -@InProceedings{hybrid-mix, - author = {M. Ohkubo and M. Abe}, - title = {A {L}ength-{I}nvariant {H}ybrid {MIX}}, - booktitle = {Advances in Cryptology - {ASIACRYPT} 2000}, - year = {2000}, - publisher = {Springer-Verlag, LNCS 1976}, -} - -@InProceedings{PShuffle, - author = {Jun Furukawa and Kazue Sako}, - title = {An Efficient Scheme for Proving a Shuffle}, - editor = {Joe Kilian}, - booktitle = {CRYPTO 2001}, - year = {2001}, - publisher = {Springer-Verlag, LNCS 2139}, -} - - -@InProceedings{jakobsson-optimally, - author = "Markus Jakobsson and Ari Juels", - title = "An Optimally Robust Hybrid Mix Network (Extended Abstract)", - booktitle = {Principles of Distributed Computing - {PODC} '01}, - year = "2001", - publisher = {ACM Press}, - note = {\url{http://citeseer.nj.nec.com/492015.html}}, -} - -@InProceedings{kesdogan, - author = {D. Kesdogan and M. Egner and T. B\"uschkes}, - title = {Stop-and-Go {MIX}es Providing Probabilistic Anonymity in an Open - System}, - booktitle = {Information Hiding (IH 1998)}, - year = {1998}, - publisher = {Springer-Verlag, LNCS 1525}, -} - %note = {\url{http://www.cl.cam.ac.uk/~fapp2/ihw98/ihw98-sgmix.pdf}}, - -@InProceedings{socks4, - author = {David Koblas and Michelle R. Koblas}, - title = {{SOCKS}}, - booktitle = {UNIX Security III Symposium (1992 USENIX Security - Symposium)}, - pages = {77--83}, - year = 1992, - publisher = {USENIX}, -} - -@InProceedings{flash-mix, - author = {Markus Jakobsson}, - title = {Flash {M}ixing}, - booktitle = {Principles of Distributed Computing - {PODC} '99}, - year = {1999}, - publisher = {ACM Press}, - note = {\newline \url{http://citeseer.nj.nec.com/jakobsson99flash.html}}, -} - -@InProceedings{SK, - author = {Joe Kilian and Kazue Sako}, - title = {Receipt-Free {MIX}-Type Voting Scheme - A Practical Solution to - the Implementation of a Voting Booth}, - booktitle = {EUROCRYPT '95}, - year = {1995}, - publisher = {Springer-Verlag}, -} - -@InProceedings{OAEP, - author = {M. Bellare and P. Rogaway}, - year = {1994}, - booktitle = {EUROCRYPT '94}, - title = {Optimal {A}symmetric {E}ncryption {P}adding : How To Encrypt With - {RSA}}, - publisher = {Springer-Verlag}, - note = {\newline \url{http://www-cse.ucsd.edu/users/mihir/papers/oaep.html}}, -} -@inproceedings{babel, - title = {Mixing {E}-mail With {B}abel}, - author = {Ceki G\"ulc\"u and Gene Tsudik}, - booktitle = {{Network and Distributed Security Symposium (NDSS 96)}}, - year = 1996, - month = {February}, - pages = {2--16}, - publisher = {IEEE}, -} - %note = {\url{http://citeseer.nj.nec.com/2254.html}}, - -@Misc{rprocess, - author = {RProcess}, - title = {Selective Denial of Service Attacks}, - note = {\newline \url{http://www.eff.org/pub/Privacy/Anonymity/1999\_09\_DoS\_remail\_vuln.html}}, -} - -@Article{remailer-history, - author = {Sameer Parekh}, - title = {Prospects for Remailers}, - journal = {First Monday}, - volume = {1}, - number = {2}, - month = {August}, - year = {1996}, - note = {\url{http://www.firstmonday.dk/issues/issue2/remailers/}}, -} - -@Article{chaum-mix, - author = {David Chaum}, - title = {Untraceable electronic mail, return addresses, and digital pseudo-nyms}, - journal = {Communications of the ACM}, - year = {1981}, - volume = {4}, - number = {2}, - month = {February}, -} - %note = {\url{http://www.eskimo.com/~weidai/mix-net.txt}}, - -@InProceedings{nym-alias-net, - author = {David Mazi\`{e}res and M. Frans Kaashoek}, - title = {{The Design, Implementation and Operation of an Email - Pseudonym Server}}, - booktitle = {$5^{th}$ ACM Conference on Computer and - Communications Security (CCS'98)}, - year = 1998, - publisher = {ACM Press}, -} - %note = {\newline \url{http://www.scs.cs.nyu.edu/~dm/}}, - -@InProceedings{tangler, - author = {Marc Waldman and David Mazi\`{e}res}, - title = {Tangler: A Censorship-Resistant Publishing System - Based on Document Entanglements}, - booktitle = {$8^{th}$ ACM Conference on Computer and - Communications Security (CCS-8)}, - pages = {86--135}, - year = 2001, - publisher = {ACM Press}, -} - %note = {\url{http://www.scs.cs.nyu.edu/~dm/}} - -@misc{neochaum, - author = {Tim May}, - title = {Payment mixes for anonymity}, - howpublished = {E-mail archived at - \url{http://\newline www.inet-one.com/cypherpunks/dir.2000.02.28-2000.03.05/msg00334.html}}, -} - -@misc{helsingius, - author = {J. Helsingius}, - title = {{\tt anon.penet.fi} press release}, - note = {\newline \url{http://www.penet.fi/press-english.html}}, -} - -@InProceedings{garay97secure, - author = {J. Garay and R. Gennaro and C. Jutla and T. Rabin}, - title = {Secure distributed storage and retrieval}, - booktitle = {11th International Workshop, WDAG '97}, - pages = {275--289}, - year = {1997}, - publisher = {Springer-Verlag, LNCS 1320}, - note = {\newline \url{http://citeseer.nj.nec.com/garay97secure.html}}, -} - -@InProceedings{PIK, - author = {C. Park and K. Itoh and K. Kurosawa}, - title = {Efficient anonymous channel and all/nothing election scheme}, - booktitle = {Advances in Cryptology -- {EUROCRYPT} '93}, - pages = {248--259}, - publisher = {Springer-Verlag, LNCS 765}, -} - -@Misc{pgpfaq, - key = {PGP}, - title = {{PGP} {FAQ}}, - note = {\newline \url{http://www.faqs.org/faqs/pgp-faq/}}, -} - -@Article{riordan-schneier, - author = {James Riordan and Bruce Schneier}, - title = {A Certified E-mail Protocol with No Trusted Third Party}, - journal = {13th Annual Computer Security Applications Conference}, - month = {December}, - year = {1998}, - note = {\newline \url{http://www.counterpane.com/certified-email.html}}, -} - - -@Article{crowds-tissec, - author = {Michael K. Reiter and Aviel D. Rubin}, - title = {Crowds: Anonymity for Web Transactions}, - journal = {ACM TISSEC}, - year = 1998, - volume = 1, - number = 1, - pages = {66--92}, - month = {June}, -} - %note = {\url{http://citeseer.nj.nec.com/284739.html}} - -@Article{crowds-dimacs, - author = {Michael K. Reiter and Aviel D. Rubin}, - title = {Crowds: Anonymity for Web Transactions}, - journal = {{DIMACS} Technical Report (Revised)}, - volume = {97}, - number = {15}, - month = {August}, - year = {1997}, -} - -@Misc{advogato, - author = {Raph Levien}, - title = {Advogato's Trust Metric}, - note = {\newline \url{http://www.advogato.org/trust-metric.html}}, -} - -@InProceedings{publius, - author = {Marc Waldman and Aviel Rubin and Lorrie Cranor}, - title = {Publius: {A} robust, tamper-evident, censorship-resistant and - source-anonymous web publishing system}, - booktitle = {Proc. 9th USENIX Security Symposium}, - pages = {59--72}, - year = {2000}, - month = {August}, -} - %note = {\newline \url{http://citeseer.nj.nec.com/waldman00publius.html}}, - -@Misc{freedom-nyms, - author = {Russell Samuels}, - title = {Untraceable Nym Creation on the {F}reedom {N}etwork}, - year = {1999}, - month = {November}, - day = {21}, - note = {\newline \url{http://www.freedom.net/products/whitepapers/white11.html}}, -} - -@techreport{freedom2-arch, - title = {Freedom Systems 2.0 Architecture}, - author = {Philippe Boucher and Adam Shostack and Ian Goldberg}, - institution = {Zero Knowledge Systems, {Inc.}}, - year = {2000}, - month = {December}, - type = {White Paper}, - day = {18}, -} - -@techreport{freedom21-security, - title = {Freedom Systems 2.1 Security Issues and Analysis}, - author = {Adam Back and Ian Goldberg and Adam Shostack}, - institution = {Zero Knowledge Systems, {Inc.}}, - year = {2001}, - month = {May}, - type = {White Paper}, -} - -@inproceedings{cfs:sosp01, - title = {Wide-area cooperative storage with {CFS}}, - author = {Frank Dabek and M. Frans Kaashoek and David Karger and Robert Morris and Ion Stoica}, - booktitle = {18th {ACM} {S}ymposium on {O}perating {S}ystems {P}rinciples ({SOSP} '01)}, - year = {2001}, - month = {October}, - address = {Chateau Lake Louise, Banff, Canada}, -} - -@inproceedings{SS03, - title = {Passive Attack Analysis for Connection-Based Anonymity Systems}, - author = {Andrei Serjantov and Peter Sewell}, - booktitle = {Computer Security -- ESORICS 2003}, - publisher = {Springer-Verlag, LNCS 2808}, - year = {2003}, - month = {October}, -} - %note = {\url{http://www.cl.cam.ac.uk/users/aas23/papers_aas/conn_sys.ps}}, - -@Misc{pk-relations, - author = {M. Bellare and A. Desai and D. Pointcheval and P. Rogaway}, - title = {Relations Among Notions of Security for Public-Key Encryption - Schemes}, - howpublished = { - Extended abstract in {\em Advances in Cryptology - CRYPTO '98}, LNCS Vol. 1462. - Springer-Verlag, 1998. - Full version available from \newline \url{http://www-cse.ucsd.edu/users/mihir/}}, -} - - -@InProceedings{mix-acc, - author = {Roger Dingledine and Michael J. Freedman and David - Hopwood and David Molnar}, - title = {{A Reputation System to Increase MIX-net - Reliability}}, - booktitle = {Information Hiding (IH 2001)}, - pages = {126--141}, - year = 2001, - editor = {Ira S. Moskowitz}, - publisher = {Springer-Verlag, LNCS 2137}, -} - %note = {\url{http://www.freehaven.net/papers.html}}, - -@InProceedings{casc-rep, - author = {Roger Dingledine and Paul Syverson}, - title = {{Reliable MIX Cascade Networks through Reputation}}, - booktitle = {Financial Cryptography}, - year = 2002, - editor = {Matt Blaze}, - publisher = {Springer-Verlag, LNCS 2357}, -} - %note = {\newline \url{http://www.freehaven.net/papers.html}}, - -@InProceedings{zhou96certified, - author = {Zhou and Gollmann}, - title = {Certified Electronic Mail}, - booktitle = {{ESORICS: European Symposium on Research in Computer - Security}}, - publisher = {Springer-Verlag, LNCS 1146}, - year = {1996}, - note = {\newline \url{http://citeseer.nj.nec.com/zhou96certified.html}}, -} - -@Misc{realtime-mix, - author = {Anja Jerichow and Jan M\"uller and Andreas Pfitzmann and - Birgit Pfitzmann and Michael Waidner}, - title = {{Real-Time MIXes: A Bandwidth-Efficient Anonymity Protocol}}, - howpublished = {IEEE Journal on Selected Areas in Communications, 1998.}, - note = {\url{http://www.zurich.ibm.com/security/publications/1998.html}}, -} - -@InProceedings{danezis:pet2003, - author = {George Danezis}, - title = {Mix-networks with Restricted Routes}, - booktitle = {Privacy Enhancing Technologies (PET 2003)}, - year = 2003, - editor = {Roger Dingledine}, - publisher = {Springer-Verlag LNCS 2760} -} - -@InProceedings{gap-pets03, - author = {Krista Bennett and Christian Grothoff}, - title = {{GAP} -- practical anonymous networking}, - booktitle = {Privacy Enhancing Technologies (PET 2003)}, - year = 2003, - editor = {Roger Dingledine}, - publisher = {Springer-Verlag LNCS 2760} -} - -@Article{hordes-jcs, - author = {Brian Neal Levine and Clay Shields}, - title = {Hordes: A Multicast-Based Protocol for Anonymity}, - journal = {Journal of Computer Security}, - year = 2002, - volume = 10, - number = 3, - pages = {213--240} -} - -@TechReport{herbivore, - author = {Sharad Goel and Mark Robson and Milo Polte and Emin G\"{u}n Sirer}, - title = {Herbivore: A Scalable and Efficient Protocol for Anonymous Communication}, - institution = {Cornell University Computing and Information Science}, - year = 2003, - type = {Technical Report}, - number = {TR2003-1890}, - month = {February} -} - -@InProceedings{p5, - author = {Rob Sherwood and Bobby Bhattacharjee and Aravind Srinivasan}, - title = {$P^5$: A Protocol for Scalable Anonymous Communication}, - booktitle = {IEEE Symposium on Security and Privacy}, - pages = {58--70}, - year = 2002, - publisher = {IEEE CS} -} - -@phdthesis{ian-thesis, - title = {A Pseudonymous Communications Infrastructure for the Internet}, - author = {Ian Goldberg}, - school = {UC Berkeley}, - year = {2000}, - month = {Dec}, -} - -@Article{taz, - author = {Ian Goldberg and David Wagner}, - title = {TAZ Servers and the Rewebber Network: Enabling - Anonymous Publishing on the World Wide Web}, - journal = {First Monday}, - year = 1998, - volume = 3, - number = 4, - month = {August}, - note = {\url{http://www.firstmonday.dk/issues/issue3_4/goldberg/}} -} - -@Misc{tcp-over-tcp-is-bad, - key = {tcp-over-tcp-is-bad}, - title = {Why {TCP} Over {TCP} Is A Bad Idea}, - author = {Olaf Titz}, - note = {\url{http://sites.inka.de/sites/bigred/devel/tcp-tcp.html}} -} - -@inproceedings{wright02, - title = {An Analysis of the Degradation of Anonymous Protocols}, - author = {Matthew Wright and Micah Adler and Brian Neil Levine and Clay Shields}, - booktitle = {{Network and Distributed Security Symposium (NDSS 02)}}, - year = {2002}, - month = {February}, - publisher = {IEEE}, -} - -@inproceedings{wright03, - title = {Defending Anonymous Communication Against Passive Logging Attacks}, - author = {Matthew Wright and Micah Adler and Brian Neil Levine and Clay Shields}, - booktitle = {IEEE Symposium on Security and Privacy}, - pages= {28--41}, - year = {2003}, - month = {May}, - publisher = {IEEE CS}, -} - - -@InProceedings{attack-tor-oak05, - author = {Steven J. Murdoch and George Danezis}, - title = {Low-cost Traffic Analysis of Tor}, - booktitle = {IEEE Symposium on Security and Privacy}, - year = 2005, - month = {May}, - publisher = {IEEE CS} -} - -@Misc{jap-backdoor, - author={{The AN.ON Project}}, - howpublished={Press release}, - year={2003}, - month={September}, - title={German Police proceeds against anonymity service}, - note={\url{http://www.datenschutzzentrum.de/material/themen/presse/anon-bka_e.htm}} -} - -@article{shsm03, - title = {Using Caching for Browsing Anonymity}, - author = {Anna Shubina and Sean Smith}, - journal = {ACM SIGEcom Exchanges}, - volume = {4}, - number = {2}, - year = {2003}, - month = {Sept}, - note = {\url{http://www.acm.org/sigs/sigecom/exchanges/volume_4_(03)/4.2-Shubina.pdf}}, -} - -@inproceedings{tor-design, - title = {Tor: The Second-Generation Onion Router}, - author = {Roger Dingledine and Nick Mathewson and Paul Syverson}, - booktitle = {Proceedings of the 13th USENIX Security Symposium}, - year = {2004}, - month = {August}, - note = {\url{https://www.torproject.org/tor-design.pdf}} -} - -@inproceedings{flow-correlation04, - title = {On Flow Correlation Attacks and Countermeasures in Mix Networks}, - author = {Ye Zhu and Xinwen Fu and Bryan Graham and Riccardo Bettati and Wei Zhao}, - booktitle = {Proceedings of Privacy Enhancing Technologies workshop (PET 2004)}, - year = {2004}, - month = {May}, - series = {LNCS}, - note = {\url{http://students.cs.tamu.edu/xinwenfu/paper/PET04.pdf}}, -} - -@InProceedings{danezis:pet2004, - author = "George Danezis", - title = "The Traffic Analysis of Continuous-Time Mixes", - booktitle= {Privacy Enhancing Technologies (PET 2004)}, - editor = {David Martin and Andrei Serjantov}, - month = {May}, - year = {2004}, - series = {LNCS}, - note = {\url{http://www.cl.cam.ac.uk/users/gd216/cmm2.pdf}}, -} - -@inproceedings{feamster:wpes2004, - title = {Location Diversity in Anonymity Networks}, - author = {Nick Feamster and Roger Dingledine}, - booktitle = {{Proceedings of the Workshop on Privacy in the Electronic Society (WPES 2004)}}, - year = {2004}, - month = {October}, - address = {Washington, DC, USA}, - note = {\url{http://freehaven.net/doc/routing-zones/routing-zones.ps}}, -} - -@inproceedings{koepsell:wpes2004, - title = {How to Achieve Blocking Resistance for Existing Systems Enabling Anonymous Web Surfing}, - author = {Stefan K\"opsell and Ulf Hilling}, - booktitle = {{Proceedings of the Workshop on Privacy in the Electronic Society (WPES 2004)}}, - year = {2004}, - month = {October}, - address = {Washington, DC, USA}, - note = {\url{http://freehaven.net/anonbib/papers/p103-koepsell.pdf}}, -} - -@inproceedings{sync-batching, - title = {Synchronous Batching: From Cascades to Free Routes}, - author = {Roger Dingledine and Vitaly Shmatikov and Paul Syverson}, - booktitle = {Proceedings of Privacy Enhancing Technologies workshop (PET 2004)}, - editor = {David Martin and Andrei Serjantov}, - year = {2004}, - month = {May}, - series = {LNCS}, - note = {\url{http://freehaven.net/doc/sync-batching/sync-batching.pdf}}, -} - -@InProceedings{e2e-traffic, - author = "Nick Mathewson and Roger Dingledine", - title = "Practical Traffic Analysis: Extending and Resisting Statistical Disclosure", - booktitle= {Privacy Enhancing Technologies (PET 2004)}, - editor = {David Martin and Andrei Serjantov}, - month = {May}, - year = {2004}, - series = {LNCS}, - note = {\url{http://freehaven.net/doc/e2e-traffic/e2e-traffic.pdf}}, -} - -@Misc{dtls, - author = {E. Rescorla and N. Modadugu}, - title = {{Datagram Transport Layer Security}}, - howpublished = {IETF Draft}, - month = {December}, - year = {2003}, - note = {\url{http://www.ietf.org/internet-drafts/draft-rescorla-dtls-02.txt}}, -} - -@InProceedings{usability-network-effect, - author={Roger Dingledine and Nick Mathewson}, - title={Anonymity Loves Company: Usability and the Network Effect}, - booktitle = {Designing Security Systems That People Can Use}, - year = {2005}, - publisher = {O'Reilly Media}, -} - -@inproceedings{usability:weis2006, - title = {Anonymity Loves Company: Usability and the Network Effect}, - author = {Roger Dingledine and Nick Mathewson}, - booktitle = {Proceedings of the Fifth Workshop on the Economics of Information Security - (WEIS 2006)}, - year = {2006}, - month = {June}, - address = {Cambridge, UK}, - bookurl = {http://weis2006.econinfosec.org/}, - note = {\url{http://freehaven.net/doc/wupss04/usability.pdf}}, -} - -@Misc{six-four, - key = {six-four}, - title = {{The Six/Four System}}, - note = {\url{http://sourceforge.net/projects/sixfour/}} -} - -@inproceedings{clayton:pet2006, - title = {Ignoring the Great Firewall of China}, - author = {Richard Clayton and Steven J. Murdoch and Robert N. M. Watson}, - booktitle = {Proceedings of the Sixth Workshop on Privacy Enhancing Technologies (PET 2006)}, - year = {2006}, - month = {June}, - address = {Cambridge, UK}, - publisher = {Springer}, - bookurl = {http://petworkshop.org/2006/}, - note = {\url{http://www.cl.cam.ac.uk/~rnc1/ignoring.pdf}}, -} - -@Misc{zuckerman-threatmodels, - key = {zuckerman-threatmodels}, - title = {We've got to adjust some of our threat models}, - author = {Ethan Zuckerman}, - note = {\url{http://www.ethanzuckerman.com/blog/?p=1019}} -} - -@Misc{cgiproxy, - key = {cgiproxy}, - title = {{CGIProxy: HTTP/FTP Proxy in a CGI Script}}, - author = {James Marshall}, - note = {\url{http://www.jmarshall.com/tools/cgiproxy/}} -} - -@Misc{circumventor, - key = {circumventor}, - title = {{How to install the Circumventor program}}, - author = {Bennett Haselton}, - note = {\url{http://www.peacefire.org/circumventor/simple-circumventor-instructions.html}} -} - -@Misc{psiphon, - key = {psiphon}, - title = {Psiphon}, - author = {Ronald Deibert et al}, - note = {\url{http://psiphon.civisec.org/}} -} - -@InProceedings{tcpstego, author = {Steven J. Murdoch and Stephen Lewis}, - title = {Embedding Covert Channels into {TCP/IP}}, - booktitle = {Information Hiding: 7th International Workshop}, - pages = {247--261}, - year = {2005}, - editor = {Mauro Barni and Jordi Herrera-Joancomart\'{\i} and -Stefan Katzenbeisser and Fernando P\'{e}rez-Gonz\'{a}lez}, - volume = {3727}, - series = {LNCS}, - address = {Barcelona, Catalonia (Spain)}, - month = {June}, - publisher = {Springer-Verlag}, - url = {http://www.cl.cam.ac.uk/~sjm217/papers/ih05coverttcp.pdf} -} - -@phdthesis{blossom-thesis, - title = {Perspective Access Networks}, - author = {Geoffrey Goodell}, - school = {Harvard University}, - year = {2006}, - month = {July}, - note = {\url{http://afs.eecs.harvard.edu/~goodell/thesis.pdf}}, -} - -@inproceedings{tap:pet2006, - title = {On the Security of the Tor Authentication Protocol}, - author = {Ian Goldberg}, - booktitle = {Proceedings of the Sixth Workshop on Privacy Enhancing Technologies (PET 2006)}, - year = {2006}, - month = {June}, - address = {Cambridge, UK}, - publisher = {Springer}, - bookurl = {http://petworkshop.org/2006/}, - note = {\url{http://www.cypherpunks.ca/~iang/pubs/torsec.pdf}}, -} - -@inproceedings{rep-anon, - title = {{Reputation in P2P Anonymity Systems}}, - author = {Roger Dingledine and Nick Mathewson and Paul Syverson}, - booktitle = {Proceedings of Workshop on Economics of Peer-to-Peer Systems}, - year = {2003}, - month = {June}, - note = {\url{http://freehaven.net/doc/econp2p03/econp2p03.pdf}}, -} - -@misc{tor-challenges, - author = {Roger Dingledine and Nick Mathewson and Paul Syverson}, - title = {Challenges in deploying low-latency anonymity}, - year = {2005}, - note = {Manuscript} -} - -@InProceedings{chaum-blind, - author = {David Chaum}, - title = {Blind Signatures for Untraceable Payments}, - booktitle = {Advances in Cryptology: Proceedings of Crypto 82}, - pages = {199--203}, - year = 1983, - editor = {D. Chaum and R.L. Rivest and A.T. Sherman}, - publisher = {Plenum Press} -} - -@Article{netauth, - author = {Geoffrey Goodell and Paul Syverson}, - title = {The Right Place at the Right Time: Examining the use of network location in authentication and abuse prevention}, - journal = {Communications of the ACM}, - year = 2007, - volume = 50, - number = 5, - pages = {113--117}, - month = {May} -} - -@misc{ip-to-country, - key = {ip-to-country}, - title = {IP-to-country database}, - note = {\url{http://ip-to-country.webhosting.info/}}, -} - -@misc{mackinnon-personal, - author = {Rebecca MacKinnon}, - title = {Private communication}, - year = {2006}, -} - -@inproceedings{pet05-bissias, - title = {Privacy Vulnerabilities in Encrypted HTTP Streams}, - author = {George Dean Bissias and Marc Liberatore and Brian Neil Levine}, - booktitle = {Proceedings of Privacy Enhancing Technologies workshop (PET 2005)}, - year = {2005}, - month = {May}, - note = {\url{http://prisms.cs.umass.edu/brian/pubs/bissias.liberatore.pet.2005.pdf}}, -} - -@InProceedings{infranet, - author = {Nick Feamster and Magdalena Balazinska and Greg Harfst and Hari Balakrishnan and David Karger}, - title = {Infranet: Circumventing Web Censorship and Surveillance}, - booktitle = {Proceedings of the 11th USENIX Security Symposium}, - year = {2002}, - month = {August}, - note = {\url{http://nms.lcs.mit.edu/~feamster/papers/usenixsec2002.pdf}}, -} - -@techreport{ ptacek98insertion, - author = "Thomas H. Ptacek and Timothy N. Newsham", - title = "Insertion, Evasion, and Denial of Service: Eluding Network Intrusion Detection", - institution = "Secure Networks, Inc.", - address = "Suite 330, 1201 5th Street S.W, Calgary, Alberta, Canada, T2R-0Y6", - year = "1998", - url = "citeseer.ist.psu.edu/ptacek98insertion.html", -} - -@inproceedings{active-wardens, - author = "Gina Fisk and Mike Fisk and Christos Papadopoulos and Joshua Neil", - title = "Eliminating Steganography in Internet Traffic with Active Wardens", - booktitle = {Information Hiding Workshop (IH 2002)}, - year = {2002}, - month = {October}, - editor = {Fabien Petitcolas}, - publisher = {Springer-Verlag, LNCS 2578}, -} - -@inproceedings{clog-the-queue, - title = {Don't Clog the Queue: Circuit Clogging and Mitigation in {P2P} anonymity schemes}, - author = {Jon McLachlan and Nicholas Hopper}, - booktitle = {Proceedings of Financial Cryptography (FC '08)}, - year = {2008}, - month = {January}, -} - -%%% Local Variables: -%%% mode: latex -%%% TeX-master: "tor-design" -%%% End: diff -Nru tor-0.2.0.34/doc/design-paper/tor-design.tex tor-0.2.2.16-alpha/doc/design-paper/tor-design.tex --- tor-0.2.0.34/doc/design-paper/tor-design.tex 2008-02-26 19:56:32.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/design-paper/tor-design.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,1988 +0,0 @@ -\documentclass[twocolumn]{article} -\usepackage{usenix} - -%\documentclass[times,10pt,twocolumn]{article} -%\usepackage{latex8} -%\usepackage{times} -\usepackage{url} -\usepackage{graphics} -\usepackage{amsmath} -\usepackage{epsfig} - -\pagestyle{empty} - -\renewcommand\url{\begingroup \def\UrlLeft{<}\def\UrlRight{>}\urlstyle{tt}\Url} -\newcommand\emailaddr{\begingroup \def\UrlLeft{<}\def\UrlRight{>}\urlstyle{tt}\Url} - -\newcommand{\workingnote}[1]{} % The version that hides the note. -%\newcommand{\workingnote}[1]{(**#1)} % The version that makes the note visible. - -% If an URL ends up with '%'s in it, that's because the line *in the .bib/.tex -% file* is too long, so break it there (it doesn't matter if the next line is -% indented with spaces). -DH - -%\newif\ifpdf -%\ifx\pdfoutput\undefined -% \pdffalse -%\else -% \pdfoutput=1 -% \pdftrue -%\fi - -\newenvironment{tightlist}{\begin{list}{$\bullet$}{ - \setlength{\itemsep}{0mm} - \setlength{\parsep}{0mm} - % \setlength{\labelsep}{0mm} - % \setlength{\labelwidth}{0mm} - % \setlength{\topsep}{0mm} - }}{\end{list}} - -% Cut down on whitespace above and below figures displayed at head/foot of -% page. -\setlength{\textfloatsep}{3mm} -% Cut down on whitespace above and below figures displayed in middle of page -\setlength{\intextsep}{3mm} - -\begin{document} - -%% Use dvipdfm instead. --DH -%\ifpdf -% \pdfcompresslevel=9 -% \pdfpagewidth=\the\paperwidth -% \pdfpageheight=\the\paperheight -%\fi - -\title{Tor: The Second-Generation Onion Router} %\\DRAFT VERSION} -% Putting the 'Private' back in 'Virtual Private Network' - -\author{Roger Dingledine \\ The Free Haven Project \\ arma@freehaven.net \and -Nick Mathewson \\ The Free Haven Project \\ nickm@freehaven.net \and -Paul Syverson \\ Naval Research Lab \\ syverson@itd.nrl.navy.mil} - -\maketitle -\thispagestyle{empty} - -\begin{abstract} -We present Tor, a circuit-based low-latency anonymous communication -service. This second-generation Onion Routing system addresses limitations -in the original design by adding perfect forward secrecy, congestion -control, directory servers, integrity checking, configurable exit policies, -and a practical design for location-hidden services via rendezvous -points. Tor works on the real-world -Internet, requires no special privileges or kernel modifications, requires -little synchronization or coordination between nodes, and provides a -reasonable tradeoff between anonymity, usability, and efficiency. -We briefly describe our experiences with an international network of -more than 30 nodes. % that has been running for several months. -We close with a list of open problems in anonymous communication. -\end{abstract} - -%\begin{center} -%\textbf{Keywords:} anonymity, peer-to-peer, remailer, nymserver, reply block -%\end{center} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\section{Overview} -\label{sec:intro} - -Onion Routing is a distributed overlay network designed to anonymize -TCP-based applications like web browsing, secure shell, -and instant messaging. Clients choose a path through the network and -build a \emph{circuit}, in which each node (or ``onion router'' or ``OR'') -in the path knows its predecessor and successor, but no other nodes in -the circuit. Traffic flows down the circuit in fixed-size -\emph{cells}, which are unwrapped by a symmetric key at each node -(like the layers of an onion) and relayed downstream. The -Onion Routing project published several design and analysis -papers \cite{or-ih96,or-jsac98,or-discex00,or-pet00}. While a wide area Onion -Routing network was deployed briefly, the only long-running -public implementation was a fragile -proof-of-concept that ran on a single machine. Even this simple deployment -processed connections from over sixty thousand distinct IP addresses from -all over the world at a rate of about fifty thousand per day. -But many critical design and deployment issues were never -resolved, and the design has not been updated in years. Here -we describe Tor, a protocol for asynchronous, loosely federated onion -routers that provides the following improvements over the old Onion -Routing design: - -\textbf{Perfect forward secrecy:} In the original Onion Routing design, -a single hostile node could record traffic and -later compromise successive nodes in the circuit and force them -to decrypt it. Rather than using a single multiply encrypted data -structure (an \emph{onion}) to lay each circuit, -Tor now uses an incremental or \emph{telescoping} path-building design, -where the initiator negotiates session keys with each successive hop in -the circuit. Once these keys are deleted, subsequently compromised nodes -cannot decrypt old traffic. As a side benefit, onion replay detection -is no longer necessary, and the process of building circuits is more -reliable, since the initiator knows when a hop fails and can then try -extending to a new node. - -\textbf{Separation of ``protocol cleaning'' from anonymity:} -Onion Routing originally required a separate ``application -proxy'' for each supported application protocol---most of which were -never written, so many applications were never supported. Tor uses the -standard and near-ubiquitous SOCKS~\cite{socks4} proxy interface, allowing -us to support most TCP-based programs without modification. Tor now -relies on the filtering features of privacy-enhancing -application-level proxies such as Privoxy~\cite{privoxy}, without trying -to duplicate those features itself. - -\textbf{No mixing, padding, or traffic shaping (yet):} Onion -Routing originally called for batching and reordering cells as they arrived, -assumed padding between ORs, and in -later designs added padding between onion proxies (users) and -ORs~\cite{or-ih96,or-jsac98}. Tradeoffs between padding protection -and cost were discussed, and \emph{traffic shaping} algorithms were -theorized~\cite{or-pet00} to provide good security without expensive -padding, but no concrete padding scheme was suggested. -Recent research~\cite{econymics} -and deployment experience~\cite{freedom21-security} suggest that this -level of resource use is not practical or economical; and even full -link padding is still vulnerable~\cite{defensive-dropping}. Thus, -until we have a proven and convenient design for traffic shaping or -low-latency mixing that improves anonymity against a realistic -adversary, we leave these strategies out. - -\textbf{Many TCP streams can share one circuit:} Onion Routing originally -built a separate circuit for each -application-level request, but this required -multiple public key operations for every request, and also presented -a threat to anonymity from building so many circuits; see -Section~\ref{sec:maintaining-anonymity}. Tor multiplexes multiple TCP -streams along each circuit to improve efficiency and anonymity. - -\textbf{Leaky-pipe circuit topology:} Through in-band signaling -within the circuit, Tor initiators can direct traffic to nodes partway -down the circuit. This novel approach -allows traffic to exit the circuit from the middle---possibly -frustrating traffic shape and volume attacks based on observing the end -of the circuit. (It also allows for long-range padding if -future research shows this to be worthwhile.) - -\textbf{Congestion control:} Earlier anonymity designs do not -address traffic bottlenecks. Unfortunately, typical approaches to -load balancing and flow control in overlay networks involve inter-node -control communication and global views of traffic. Tor's decentralized -congestion control uses end-to-end acks to maintain anonymity -while allowing nodes at the edges of the network to detect congestion -or flooding and send less data until the congestion subsides. - -\textbf{Directory servers:} The earlier Onion Routing design -planned to flood state information through the network---an approach -that can be unreliable and complex. % open to partitioning attacks. -Tor takes a simplified view toward distributing this -information. Certain more trusted nodes act as \emph{directory -servers}: they provide signed directories describing known -routers and their current state. Users periodically download them -via HTTP. - -\textbf{Variable exit policies:} Tor provides a consistent mechanism -for each node to advertise a policy describing the hosts -and ports to which it will connect. These exit policies are critical -in a volunteer-based distributed infrastructure, because each operator -is comfortable with allowing different types of traffic to exit -from his node. - -\textbf{End-to-end integrity checking:} The original Onion Routing -design did no integrity checking on data. Any node on the -circuit could change the contents of data cells as they passed by---for -example, to alter a connection request so it would connect -to a different webserver, or to `tag' encrypted traffic and look for -corresponding corrupted traffic at the network edges~\cite{minion-design}. -Tor hampers these attacks by verifying data integrity before it leaves -the network. - -%\textbf{Improved robustness to failed nodes:} A failed node -%in the old design meant that circuit building failed, but thanks to -%Tor's step-by-step circuit building, users notice failed nodes -%while building circuits and route around them. Additionally, liveness -%information from directories allows users to avoid unreliable nodes in -%the first place. -%% Can't really claim this, now that we've found so many variants of -%% attack on partial-circuit-building. -RD - -\textbf{Rendezvous points and hidden services:} -Tor provides an integrated mechanism for responder anonymity via -location-protected servers. Previous Onion Routing designs included -long-lived ``reply onions'' that could be used to build circuits -to a hidden server, but these reply onions did not provide forward -security, and became useless if any node in the path went down -or rotated its keys. In Tor, clients negotiate {\it rendezvous points} -to connect with hidden servers; reply onions are no longer required. - -Unlike Freedom~\cite{freedom2-arch}, Tor does not require OS kernel -patches or network stack support. This prevents us from anonymizing -non-TCP protocols, but has greatly helped our portability and -deployability. - -%Unlike Freedom~\cite{freedom2-arch}, Tor only anonymizes -%TCP-based protocols---not requiring patches (or built-in support) in an -%operating system's network stack has been valuable to Tor's -%portability and deployability. - -We have implemented all of the above features, including rendezvous -points. Our source code is -available under a free license, and Tor -%, as far as we know, is unencumbered by patents. -is not covered by the patent that affected distribution and use of -earlier versions of Onion Routing. -We have deployed a wide-area alpha network -to test the design, to get more experience with usability -and users, and to provide a research platform for experimentation. -As of this writing, the network stands at 32 nodes %in thirteen -%distinct administrative domains -spread over two continents. - -We review previous work in Section~\ref{sec:related-work}, describe -our goals and assumptions in Section~\ref{sec:assumptions}, -and then address the above list of improvements in -Sections~\ref{sec:design},~\ref{sec:rendezvous}, and~\ref{sec:other-design}. -We summarize -in Section~\ref{sec:attacks} how our design stands up to -known attacks, and talk about our early deployment experiences in -Section~\ref{sec:in-the-wild}. We conclude with a list of open problems in -Section~\ref{sec:maintaining-anonymity} and future work for the Onion -Routing project in Section~\ref{sec:conclusion}. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\section{Related work} -\label{sec:related-work} - -Modern anonymity systems date to Chaum's {\bf Mix-Net} -design~\cite{chaum-mix}. Chaum -proposed hiding the correspondence between sender and recipient by -wrapping messages in layers of public-key cryptography, and relaying them -through a path composed of ``mixes.'' Each mix in turn -decrypts, delays, and re-orders messages before relaying them -onward. -%toward their destinations. - -Subsequent relay-based anonymity designs have diverged in two -main directions. Systems like {\bf Babel}~\cite{babel}, -{\bf Mixmaster}~\cite{mixmaster-spec}, -and {\bf Mixminion}~\cite{minion-design} have tried -to maximize anonymity at the cost of introducing comparatively large and -variable latencies. Because of this decision, these \emph{high-latency} -networks resist strong global adversaries, -but introduce too much lag for interactive tasks like web browsing, -Internet chat, or SSH connections. - -Tor belongs to the second category: \emph{low-latency} designs that -try to anonymize interactive network traffic. These systems handle -a variety of bidirectional protocols. They also provide more convenient -mail delivery than the high-latency anonymous email -networks, because the remote mail server provides explicit and timely -delivery confirmation. But because these designs typically -involve many packets that must be delivered quickly, it is -difficult for them to prevent an attacker who can eavesdrop both ends of the -communication from correlating the timing and volume -of traffic entering the anonymity network with traffic leaving it~\cite{SS03}. -These -protocols are similarly vulnerable to an active adversary who introduces -timing patterns into traffic entering the network and looks -for correlated patterns among exiting traffic. -Although some work has been done to frustrate these attacks, most designs -protect primarily against traffic analysis rather than traffic -confirmation (see Section~\ref{subsec:threat-model}). - -The simplest low-latency designs are single-hop proxies such as the -{\bf Anonymizer}~\cite{anonymizer}: a single trusted server strips the -data's origin before relaying it. These designs are easy to -analyze, but users must trust the anonymizing proxy. -Concentrating the traffic to this single point increases the anonymity set -(the people a given user is hiding among), but it is vulnerable if the -adversary can observe all traffic entering and leaving the proxy. - -More complex are distributed-trust, circuit-based anonymizing systems. -In these designs, a user establishes one or more medium-term bidirectional -end-to-end circuits, and tunnels data in fixed-size cells. -Establishing circuits is computationally expensive and typically -requires public-key -cryptography, whereas relaying cells is comparatively inexpensive and -typically requires only symmetric encryption. -Because a circuit crosses several servers, and each server only knows -the adjacent servers in the circuit, no single server can link a -user to her communication partners. - -The {\bf Java Anon Proxy} (also known as JAP or Web MIXes) uses fixed shared -routes known as \emph{cascades}. As with a single-hop proxy, this -approach aggregates users into larger anonymity sets, but again an -attacker only needs to observe both ends of the cascade to bridge all -the system's traffic. The Java Anon Proxy's design -calls for padding between end users and the head of the -cascade~\cite{web-mix}. However, it is not demonstrated whether the current -implementation's padding policy improves anonymity. - -{\bf PipeNet}~\cite{back01, pipenet}, another low-latency design proposed -around the same time as Onion Routing, gave -stronger anonymity but allowed a single user to shut -down the network by not sending. Systems like {\bf ISDN -mixes}~\cite{isdn-mixes} were designed for other environments with -different assumptions. -%XXX please can we fix this sentence to something less demeaning - -In P2P designs like {\bf Tarzan}~\cite{tarzan:ccs02} and -{\bf MorphMix}~\cite{morphmix:fc04}, all participants both generate -traffic and relay traffic for others. These systems aim to conceal -whether a given peer originated a request -or just relayed it from another peer. While Tarzan and MorphMix use -layered encryption as above, {\bf Crowds}~\cite{crowds-tissec} simply assumes -an adversary who cannot observe the initiator: it uses no public-key -encryption, so any node on a circuit can read users' traffic. - -{\bf Hordes}~\cite{hordes-jcs} is based on Crowds but also uses multicast -responses to hide the initiator. {\bf Herbivore}~\cite{herbivore} and -$\mbox{\bf P}^{\mathbf 5}$~\cite{p5} go even further, requiring broadcast. -These systems are designed primarily for communication among peers, -although Herbivore users can make external connections by -requesting a peer to serve as a proxy. - -Systems like {\bf Freedom} and the original Onion Routing build circuits -all at once, using a layered ``onion'' of public-key encrypted messages, -each layer of which provides session keys and the address of the -next server in the circuit. Tor as described herein, Tarzan, MorphMix, -{\bf Cebolla}~\cite{cebolla}, and Rennhard's {\bf Anonymity Network}~\cite{anonnet} -build circuits -in stages, extending them one hop at a time. -Section~\ref{subsubsec:constructing-a-circuit} describes how this -approach enables perfect forward secrecy. - -Circuit-based designs must choose which protocol layer -to anonymize. They may intercept IP packets directly, and -relay them whole (stripping the source address) along the -circuit~\cite{freedom2-arch,tarzan:ccs02}. Like -Tor, they may accept TCP streams and relay the data in those streams, -ignoring the breakdown of that data into TCP -segments~\cite{morphmix:fc04,anonnet}. Finally, like Crowds, they may accept -application-level protocols such as HTTP and relay the application -requests themselves. -Making this protocol-layer decision requires a compromise between flexibility -and anonymity. For example, a system that understands HTTP -can strip -identifying information from requests, can take advantage of caching -to limit the number of requests that leave the network, and can batch -or encode requests to minimize the number of connections. -On the other hand, an IP-level anonymizer can handle nearly any protocol, -even ones unforeseen by its designers (though these systems require -kernel-level modifications to some operating systems, and so are more -complex and less portable). TCP-level anonymity networks like Tor present -a middle approach: they are application neutral (so long as the -application supports, or can be tunneled across, TCP), but by treating -application connections as data streams rather than raw TCP packets, -they avoid the inefficiencies of tunneling TCP over -TCP. - -Distributed-trust anonymizing systems need to prevent attackers from -adding too many servers and thus compromising user paths. -Tor relies on a small set of well-known directory servers, run by -independent parties, to decide which nodes can -join. Tarzan and MorphMix allow unknown users to run servers, and use -a limited resource (like IP addresses) to prevent an attacker from -controlling too much of the network. Crowds suggests requiring -written, notarized requests from potential crowd members. - -Anonymous communication is essential for censorship-resistant -systems like Eternity~\cite{eternity}, Free~Haven~\cite{freehaven-berk}, -Publius~\cite{publius}, and Tangler~\cite{tangler}. Tor's rendezvous -points enable connections between mutually anonymous entities; they -are a building block for location-hidden servers, which are needed by -Eternity and Free~Haven. - -% didn't include rewebbers. No clear place to put them, so I'll leave -% them out for now. -RD - -\section{Design goals and assumptions} -\label{sec:assumptions} - -\noindent{\large\bf Goals}\\ -Like other low-latency anonymity designs, Tor seeks to frustrate -attackers from linking communication partners, or from linking -multiple communications to or from a single user. Within this -main goal, however, several considerations have directed -Tor's evolution. - -\textbf{Deployability:} The design must be deployed and used in the -real world. Thus it -must not be expensive to run (for example, by requiring more bandwidth -than volunteers are willing to provide); must not place a heavy -liability burden on operators (for example, by allowing attackers to -implicate onion routers in illegal activities); and must not be -difficult or expensive to implement (for example, by requiring kernel -patches, or separate proxies for every protocol). We also cannot -require non-anonymous parties (such as websites) -to run our software. (Our rendezvous point design does not meet -this goal for non-anonymous users talking to hidden servers, -however; see Section~\ref{sec:rendezvous}.) - -\textbf{Usability:} A hard-to-use system has fewer users---and because -anonymity systems hide users among users, a system with fewer users -provides less anonymity. Usability is thus not only a convenience: -it is a security requirement~\cite{econymics,back01}. Tor should -therefore not -require modifying familiar applications; should not introduce prohibitive -delays; -and should require as few configuration decisions -as possible. Finally, Tor should be easily implementable on all common -platforms; we cannot require users to change their operating system -to be anonymous. (Tor currently runs on Win32, Linux, -Solaris, BSD-style Unix, MacOS X, and probably others.) - -\textbf{Flexibility:} The protocol must be flexible and well-specified, -so Tor can serve as a test-bed for future research. -Many of the open problems in low-latency anonymity -networks, such as generating dummy traffic or preventing Sybil -attacks~\cite{sybil}, may be solvable independently from the issues -solved by -Tor. Hopefully future systems will not need to reinvent Tor's design. -%(But note that while a flexible design benefits researchers, -%there is a danger that differing choices of extensions will make users -%distinguishable. Experiments should be run on a separate network.) - -\textbf{Simple design:} The protocol's design and security -parameters must be well-understood. Additional features impose implementation -and complexity costs; adding unproven techniques to the design threatens -deployability, readability, and ease of security analysis. Tor aims to -deploy a simple and stable system that integrates the best accepted -approaches to protecting anonymity.\\ - -\noindent{\large\bf Non-goals}\label{subsec:non-goals}\\ -In favoring simple, deployable designs, we have explicitly deferred -several possible goals, either because they are solved elsewhere, or because -they are not yet solved. - -\textbf{Not peer-to-peer:} Tarzan and MorphMix aim to scale to completely -decentralized peer-to-peer environments with thousands of short-lived -servers, many of which may be controlled by an adversary. This approach -is appealing, but still has many open -problems~\cite{tarzan:ccs02,morphmix:fc04}. - -\textbf{Not secure against end-to-end attacks:} Tor does not claim -to completely solve end-to-end timing or intersection -attacks. Some approaches, such as having users run their own onion routers, -may help; -see Section~\ref{sec:maintaining-anonymity} for more discussion. - -\textbf{No protocol normalization:} Tor does not provide \emph{protocol -normalization} like Privoxy or the Anonymizer. If senders want anonymity from -responders while using complex and variable -protocols like HTTP, Tor must be layered with a filtering proxy such -as Privoxy to hide differences between clients, and expunge protocol -features that leak identity. -Note that by this separation Tor can also provide services that -are anonymous to the network yet authenticated to the responder, like -SSH. Similarly, Tor does not integrate -tunneling for non-stream-based protocols like UDP; this must be -provided by an external service if appropriate. - -\textbf{Not steganographic:} Tor does not try to conceal who is connected -to the network. - -\subsection{Threat Model} -\label{subsec:threat-model} - -A global passive adversary is the most commonly assumed threat when -analyzing theoretical anonymity designs. But like all practical -low-latency systems, Tor does not protect against such a strong -adversary. Instead, we assume an adversary who can observe some fraction -of network traffic; who can generate, modify, delete, or delay -traffic; who can operate onion routers of his own; and who can -compromise some fraction of the onion routers. - -In low-latency anonymity systems that use layered encryption, the -adversary's typical goal is to observe both the initiator and the -responder. By observing both ends, passive attackers can confirm a -suspicion that Alice is -talking to Bob if the timing and volume patterns of the traffic on the -connection are distinct enough; active attackers can induce timing -signatures on the traffic to force distinct patterns. Rather -than focusing on these \emph{traffic confirmation} attacks, -we aim to prevent \emph{traffic -analysis} attacks, where the adversary uses traffic patterns to learn -which points in the network he should attack. - -Our adversary might try to link an initiator Alice with her -communication partners, or try to build a profile of Alice's -behavior. He might mount passive attacks by observing the network edges -and correlating traffic entering and leaving the network---by -relationships in packet timing, volume, or externally visible -user-selected -options. The adversary can also mount active attacks by compromising -routers or keys; by replaying traffic; by selectively denying service -to trustworthy routers to move users to -compromised routers, or denying service to users to see if traffic -elsewhere in the -network stops; or by introducing patterns into traffic that can later be -detected. The adversary might subvert the directory servers to give users -differing views of network state. Additionally, he can try to decrease -the network's reliability by attacking nodes or by performing antisocial -activities from reliable nodes and trying to get them taken down---making -the network unreliable flushes users to other less anonymous -systems, where they may be easier to attack. We summarize -in Section~\ref{sec:attacks} how well the Tor design defends against -each of these attacks. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\section{The Tor Design} -\label{sec:design} - -The Tor network is an overlay network; each onion router (OR) -runs as a normal -user-level process without any special privileges. -Each onion router maintains a TLS~\cite{TLS} -connection to every other onion router. -%(We discuss alternatives to this clique-topology assumption in -%Section~\ref{sec:maintaining-anonymity}.) -% A subset of the ORs also act as -%directory servers, tracking which routers are in the network; -%see Section~\ref{subsec:dirservers} for directory server details. -Each user -runs local software called an onion proxy (OP) to fetch directories, -establish circuits across the network, -and handle connections from user applications. These onion proxies accept -TCP streams and multiplex them across the circuits. The onion -router on the other side -of the circuit connects to the requested destinations -and relays data. - -Each onion router maintains a long-term identity key and a short-term -onion key. The identity -key is used to sign TLS certificates, to sign the OR's \emph{router -descriptor} (a summary of its keys, address, bandwidth, exit policy, -and so on), and (by directory servers) to sign directories. %Changing -%the identity key of a router is considered equivalent to creating a -%new router. -The onion key is used to decrypt requests -from users to set up a circuit and negotiate ephemeral keys. -The TLS protocol also establishes a short-term link key when communicating -between ORs. Short-term keys are rotated periodically and -independently, to limit the impact of key compromise. - -Section~\ref{subsec:cells} presents the fixed-size -\emph{cells} that are the unit of communication in Tor. We describe -in Section~\ref{subsec:circuits} how circuits are -built, extended, truncated, and destroyed. Section~\ref{subsec:tcp} -describes how TCP streams are routed through the network. We address -integrity checking in Section~\ref{subsec:integrity-checking}, -and resource limiting in Section~\ref{subsec:rate-limit}. -Finally, -Section~\ref{subsec:congestion} talks about congestion control and -fairness issues. - -\subsection{Cells} -\label{subsec:cells} - -Onion routers communicate with one another, and with users' OPs, via -TLS connections with ephemeral keys. Using TLS conceals the data on -the connection with perfect forward secrecy, and prevents an attacker -from modifying data on the wire or impersonating an OR. - -Traffic passes along these connections in fixed-size cells. Each cell -is 512 bytes, %(but see Section~\ref{sec:conclusion} for a discussion of -%allowing large cells and small cells on the same network), -and consists of a header and a payload. The header includes a circuit -identifier (circID) that specifies which circuit the cell refers to -(many circuits can be multiplexed over the single TLS connection), and -a command to describe what to do with the cell's payload. (Circuit -identifiers are connection-specific: each circuit has a different -circID on each OP/OR or OR/OR connection it traverses.) -Based on their command, cells are either \emph{control} cells, which are -always interpreted by the node that receives them, or \emph{relay} cells, -which carry end-to-end stream data. The control cell commands are: -\emph{padding} (currently used for keepalive, but also usable for link -padding); \emph{create} or \emph{created} (used to set up a new circuit); -and \emph{destroy} (to tear down a circuit). - -Relay cells have an additional header (the relay header) at the front -of the payload, containing a streamID (stream identifier: many streams can -be multiplexed over a circuit); an end-to-end checksum for integrity -checking; the length of the relay payload; and a relay command. -The entire contents of the relay header and the relay cell payload -are encrypted or decrypted together as the relay cell moves along the -circuit, using the 128-bit AES cipher in counter mode to generate a -cipher stream. The relay commands are: \emph{relay -data} (for data flowing down the stream), \emph{relay begin} (to open a -stream), \emph{relay end} (to close a stream cleanly), \emph{relay -teardown} (to close a broken stream), \emph{relay connected} -(to notify the OP that a relay begin has succeeded), \emph{relay -extend} and \emph{relay extended} (to extend the circuit by a hop, -and to acknowledge), \emph{relay truncate} and \emph{relay truncated} -(to tear down only part of the circuit, and to acknowledge), \emph{relay -sendme} (used for congestion control), and \emph{relay drop} (used to -implement long-range dummies). -We give a visual overview of cell structure plus the details of relay -cell structure, and then describe each of these cell types and commands -in more detail below. - -%\begin{figure}[h] -%\unitlength=1cm -%\centering -%\begin{picture}(8.0,1.5) -%\put(4,.5){\makebox(0,0)[c]{\epsfig{file=cell-struct,width=7cm}}} -%\end{picture} -%\end{figure} - -\begin{figure}[h] -\centering -\mbox{\epsfig{figure=cell-struct,width=7cm}} -\end{figure} - -\subsection{Circuits and streams} -\label{subsec:circuits} - -Onion Routing originally built one circuit for each -TCP stream. Because building a circuit can take several tenths of a -second (due to public-key cryptography and network latency), -this design imposed high costs on applications like web browsing that -open many TCP streams. - -In Tor, each circuit can be shared by many TCP streams. To avoid -delays, users construct circuits preemptively. To limit linkability -among their streams, users' OPs build a new circuit -periodically if the previous ones have been used, -and expire old used circuits that no longer have any open streams. -OPs consider rotating to a new circuit once a minute: thus -even heavy users spend negligible time -building circuits, but a limited number of requests can be linked -to each other through a given exit node. Also, because circuits are built -in the background, OPs can recover from failed circuit creation -without harming user experience.\\ - -\begin{figure}[h] -\centering -\mbox{\epsfig{figure=interaction,width=8.75cm}} -\caption{Alice builds a two-hop circuit and begins fetching a web page.} -\label{fig:interaction} -\end{figure} - -\noindent{\large\bf Constructing a circuit}\label{subsubsec:constructing-a-circuit}\\ -%\subsubsection{Constructing a circuit} -A user's OP constructs circuits incrementally, negotiating a -symmetric key with each OR on the circuit, one hop at a time. To begin -creating a new circuit, the OP (call her Alice) sends a -\emph{create} cell to the first node in her chosen path (call him Bob). -(She chooses a new -circID $C_{AB}$ not currently used on the connection from her to Bob.) -The \emph{create} cell's -payload contains the first half of the Diffie-Hellman handshake -($g^x$), encrypted to the onion key of Bob. Bob -responds with a \emph{created} cell containing $g^y$ -along with a hash of the negotiated key $K=g^{xy}$. - -Once the circuit has been established, Alice and Bob can send one -another relay cells encrypted with the negotiated -key.\footnote{Actually, the negotiated key is used to derive two - symmetric keys: one for each direction.} More detail is given in -the next section. - -To extend the circuit further, Alice sends a \emph{relay extend} cell -to Bob, specifying the address of the next OR (call her Carol), and -an encrypted $g^{x_2}$ for her. Bob copies the half-handshake into a -\emph{create} cell, and passes it to Carol to extend the circuit. -(Bob chooses a new circID $C_{BC}$ not currently used on the connection -between him and Carol. Alice never needs to know this circID; only Bob -associates $C_{AB}$ on his connection with Alice to $C_{BC}$ on -his connection with Carol.) -When Carol responds with a \emph{created} cell, Bob wraps the payload -into a \emph{relay extended} cell and passes it back to Alice. Now -the circuit is extended to Carol, and Alice and Carol share a common key -$K_2 = g^{x_2 y_2}$. - -To extend the circuit to a third node or beyond, Alice -proceeds as above, always telling the last node in the circuit to -extend one hop further. - -This circuit-level handshake protocol achieves unilateral entity -authentication (Alice knows she's handshaking with the OR, but -the OR doesn't care who is opening the circuit---Alice uses no public key -and remains anonymous) and unilateral key authentication -(Alice and the OR agree on a key, and Alice knows only the OR learns -it). It also achieves forward -secrecy and key freshness. More formally, the protocol is as follows -(where $E_{PK_{Bob}}(\cdot)$ is encryption with Bob's public key, -$H$ is a secure hash function, and $|$ is concatenation): -\begin{equation*} -\begin{aligned} -\mathrm{Alice} \rightarrow \mathrm{Bob}&: E_{PK_{Bob}}(g^x) \\ -\mathrm{Bob} \rightarrow \mathrm{Alice}&: g^y, H(K | \mathrm{``handshake"}) \\ -\end{aligned} -\end{equation*} - -\noindent In the second step, Bob proves that it was he who received $g^x$, -and who chose $y$. We use PK encryption in the first step -(rather than, say, using the first two steps of STS, which has a -signature in the second step) because a single cell is too small to -hold both a public key and a signature. Preliminary analysis with the -NRL protocol analyzer~\cite{meadows96} shows this protocol to be -secure (including perfect forward secrecy) under the -traditional Dolev-Yao model.\\ - -\noindent{\large\bf Relay cells}\\ -%\subsubsection{Relay cells} -% -Once Alice has established the circuit (so she shares keys with each -OR on the circuit), she can send relay cells. -%Recall that every relay cell has a streamID that indicates to which -%stream the cell belongs. %This streamID allows a relay cell to be -%addressed to any OR on the circuit. -Upon receiving a relay -cell, an OR looks up the corresponding circuit, and decrypts the relay -header and payload with the session key for that circuit. -If the cell is headed away from Alice the OR then checks whether the -decrypted cell has a valid digest (as an optimization, the first -two bytes of the integrity check are zero, so in most cases we can avoid -computing the hash). -%is recognized---either because it -%corresponds to an open stream at this OR for the given circuit, or because -%it is the control streamID (zero). -If valid, it accepts the relay cell and processes it as described -below. Otherwise, -the OR looks up the circID and OR for the -next step in the circuit, replaces the circID as appropriate, and -sends the decrypted relay cell to the next OR. (If the OR at the end -of the circuit receives an unrecognized relay cell, an error has -occurred, and the circuit is torn down.) - -OPs treat incoming relay cells similarly: they iteratively unwrap the -relay header and payload with the session keys shared with each -OR on the circuit, from the closest to farthest. -If at any stage the digest is valid, the cell must have -originated at the OR whose encryption has just been removed. - -To construct a relay cell addressed to a given OR, Alice assigns the -digest, and then iteratively -encrypts the cell payload (that is, the relay header and payload) with -the symmetric key of each hop up to that OR. Because the digest is -encrypted to a different value at each step, only at the targeted OR -will it have a meaningful value.\footnote{ - % Should we just say that 2^56 is itself negligible? - % Assuming 4-hop circuits with 10 streams per hop, there are 33 - % possible bad streamIDs before the last circuit. This still - % gives an error only once every 2 million terabytes (approx). -With 48 bits of digest per cell, the probability of an accidental -collision is far lower than the chance of hardware failure.} -This \emph{leaky pipe} circuit topology -allows Alice's streams to exit at different ORs on a single circuit. -Alice may choose different exit points because of their exit policies, -or to keep the ORs from knowing that two streams -originate from the same person. - -When an OR later replies to Alice with a relay cell, it -encrypts the cell's relay header and payload with the single key it -shares with Alice, and sends the cell back toward Alice along the -circuit. Subsequent ORs add further layers of encryption as they -relay the cell back to Alice. - -To tear down a circuit, Alice sends a \emph{destroy} control -cell. Each OR in the circuit receives the \emph{destroy} cell, closes -all streams on that circuit, and passes a new \emph{destroy} cell -forward. But just as circuits are built incrementally, they can also -be torn down incrementally: Alice can send a \emph{relay -truncate} cell to a single OR on a circuit. That OR then sends a -\emph{destroy} cell forward, and acknowledges with a -\emph{relay truncated} cell. Alice can then extend the circuit to -different nodes, without signaling to the intermediate nodes (or -a limited observer) that she has changed her circuit. -Similarly, if a node on the circuit goes down, the adjacent -node can send a \emph{relay truncated} cell back to Alice. Thus the -``break a node and see which circuits go down'' -attack~\cite{freedom21-security} is weakened. - -\subsection{Opening and closing streams} -\label{subsec:tcp} - -When Alice's application wants a TCP connection to a given -address and port, it asks the OP (via SOCKS) to make the -connection. The OP chooses the newest open circuit (or creates one if -needed), and chooses a suitable OR on that circuit to be the -exit node (usually the last node, but maybe others due to exit policy -conflicts; see Section~\ref{subsec:exitpolicies}.) The OP then opens -the stream by sending a \emph{relay begin} cell to the exit node, -using a new random streamID. Once the -exit node connects to the remote host, it responds -with a \emph{relay connected} cell. Upon receipt, the OP sends a -SOCKS reply to notify the application of its success. The OP -now accepts data from the application's TCP stream, packaging it into -\emph{relay data} cells and sending those cells along the circuit to -the chosen OR. - -There's a catch to using SOCKS, however---some applications pass the -alphanumeric hostname to the Tor client, while others resolve it into -an IP address first and then pass the IP address to the Tor client. If -the application does DNS resolution first, Alice thereby reveals her -destination to the remote DNS server, rather than sending the hostname -through the Tor network to be resolved at the far end. Common applications -like Mozilla and SSH have this flaw. - -With Mozilla, the flaw is easy to address: the filtering HTTP -proxy called Privoxy gives a hostname to the Tor client, so Alice's -computer never does DNS resolution. -But a portable general solution, such as is needed for -SSH, is -an open problem. Modifying or replacing the local nameserver -can be invasive, brittle, and unportable. Forcing the resolver -library to prefer TCP rather than UDP is hard, and also has -portability problems. Dynamically intercepting system calls to the -resolver library seems a promising direction. We could also provide -a tool similar to \emph{dig} to perform a private lookup through the -Tor network. Currently, we encourage the use of privacy-aware proxies -like Privoxy wherever possible. - -Closing a Tor stream is analogous to closing a TCP stream: it uses a -two-step handshake for normal operation, or a one-step handshake for -errors. If the stream closes abnormally, the adjacent node simply sends a -\emph{relay teardown} cell. If the stream closes normally, the node sends -a \emph{relay end} cell down the circuit, and the other side responds with -its own \emph{relay end} cell. Because -all relay cells use layered encryption, only the destination OR knows -that a given relay cell is a request to close a stream. This two-step -handshake allows Tor to support TCP-based applications that use half-closed -connections. -% such as broken HTTP clients that close their side of the -%stream after writing but are still willing to read. - -\subsection{Integrity checking on streams} -\label{subsec:integrity-checking} - -Because the old Onion Routing design used a stream cipher without integrity -checking, traffic was -vulnerable to a malleability attack: though the attacker could not -decrypt cells, any changes to encrypted data -would create corresponding changes to the data leaving the network. -This weakness allowed an adversary who could guess the encrypted content -to change a padding cell to a destroy -cell; change the destination address in a \emph{relay begin} cell to the -adversary's webserver; or change an FTP command from -{\tt dir} to {\tt rm~*}. (Even an external -adversary could do this, because the link encryption similarly used a -stream cipher.) - -Because Tor uses TLS on its links, external adversaries cannot modify -data. Addressing the insider malleability attack, however, is -more complex. - -We could do integrity checking of the relay cells at each hop, either -by including hashes or by using an authenticating cipher mode like -EAX~\cite{eax}, but there are some problems. First, these approaches -impose a message-expansion overhead at each hop, and so we would have to -either leak the path length or waste bytes by padding to a maximum -path length. Second, these solutions can only verify traffic coming -from Alice: ORs would not be able to produce suitable hashes for -the intermediate hops, since the ORs on a circuit do not know the -other ORs' session keys. Third, we have already accepted that our design -is vulnerable to end-to-end timing attacks; so tagging attacks performed -within the circuit provide no additional information to the attacker. - -Thus, we check integrity only at the edges of each stream. (Remember that -in our leaky-pipe circuit topology, a stream's edge could be any hop -in the circuit.) When Alice -negotiates a key with a new hop, they each initialize a SHA-1 -digest with a derivative of that key, -thus beginning with randomness that only the two of them know. -Then they each incrementally add to the SHA-1 digest the contents of -all relay cells they create, and include with each relay cell the -first four bytes of the current digest. Each also keeps a SHA-1 -digest of data received, to verify that the received hashes are correct. - -To be sure of removing or modifying a cell, the attacker must be able -to deduce the current digest state (which depends on all -traffic between Alice and Bob, starting with their negotiated key). -Attacks on SHA-1 where the adversary can incrementally add to a hash -to produce a new valid hash don't work, because all hashes are -end-to-end encrypted across the circuit. The computational overhead -of computing the digests is minimal compared to doing the AES -encryption performed at each hop of the circuit. We use only four -bytes per cell to minimize overhead; the chance that an adversary will -correctly guess a valid hash -%, plus the payload the current cell, -is -acceptably low, given that the OP or OR tear down the circuit if they -receive a bad hash. - -\subsection{Rate limiting and fairness} -\label{subsec:rate-limit} - -Volunteers are more willing to run services that can limit -their bandwidth usage. To accommodate them, Tor servers use a -token bucket approach~\cite{tannenbaum96} to -enforce a long-term average rate of incoming bytes, while still -permitting short-term bursts above the allowed bandwidth. -% Current bucket sizes are set to ten seconds' worth of traffic. - -%Further, we want to avoid starving any Tor streams. Entire circuits -%could starve if we read greedily from connections and one connection -%uses all the remaining bandwidth. We solve this by dividing the number -%of tokens in the bucket by the number of connections that want to read, -%and reading at most that number of bytes from each connection. We iterate -%this procedure until the number of tokens in the bucket is under some -%threshold (currently 10KB), at which point we greedily read from connections. - -Because the Tor protocol outputs about the same number of bytes as it -takes in, it is sufficient in practice to limit only incoming bytes. -With TCP streams, however, the correspondence is not one-to-one: -relaying a single incoming byte can require an entire 512-byte cell. -(We can't just wait for more bytes, because the local application may -be awaiting a reply.) Therefore, we treat this case as if the entire -cell size had been read, regardless of the cell's fullness. - -Further, inspired by Rennhard et al's design in~\cite{anonnet}, a -circuit's edges can heuristically distinguish interactive streams from bulk -streams by comparing the frequency with which they supply cells. We can -provide good latency for interactive streams by giving them preferential -service, while still giving good overall throughput to the bulk -streams. Such preferential treatment presents a possible end-to-end -attack, but an adversary observing both -ends of the stream can already learn this information through timing -attacks. - -\subsection{Congestion control} -\label{subsec:congestion} - -Even with bandwidth rate limiting, we still need to worry about -congestion, either accidental or intentional. If enough users choose the -same OR-to-OR connection for their circuits, that connection can become -saturated. For example, an attacker could send a large file -through the Tor network to a webserver he runs, and then -refuse to read any of the bytes at the webserver end of the -circuit. Without some congestion control mechanism, these bottlenecks -can propagate back through the entire network. We don't need to -reimplement full TCP windows (with sequence numbers, -the ability to drop cells when we're full and retransmit later, and so -on), -because TCP already guarantees in-order delivery of each -cell. -%But we need to investigate further the effects of the current -%parameters on throughput and latency, while also keeping privacy in mind; -%see Section~\ref{sec:maintaining-anonymity} for more discussion. -We describe our response below. - -\textbf{Circuit-level throttling:} -To control a circuit's bandwidth usage, each OR keeps track of two -windows. The \emph{packaging window} tracks how many relay data cells the OR is -allowed to package (from incoming TCP streams) for transmission back to the OP, -and the \emph{delivery window} tracks how many relay data cells it is willing -to deliver to TCP streams outside the network. Each window is initialized -(say, to 1000 data cells). When a data cell is packaged or delivered, -the appropriate window is decremented. When an OR has received enough -data cells (currently 100), it sends a \emph{relay sendme} cell towards the OP, -with streamID zero. When an OR receives a \emph{relay sendme} cell with -streamID zero, it increments its packaging window. Either of these cells -increments the corresponding window by 100. If the packaging window -reaches 0, the OR stops reading from TCP connections for all streams -on the corresponding circuit, and sends no more relay data cells until -receiving a \emph{relay sendme} cell. - -The OP behaves identically, except that it must track a packaging window -and a delivery window for every OR in the circuit. If a packaging window -reaches 0, it stops reading from streams destined for that OR. - -\textbf{Stream-level throttling}: -The stream-level congestion control mechanism is similar to the -circuit-level mechanism. ORs and OPs use \emph{relay sendme} cells -to implement end-to-end flow control for individual streams across -circuits. Each stream begins with a packaging window (currently 500 cells), -and increments the window by a fixed value (50) upon receiving a \emph{relay -sendme} cell. Rather than always returning a \emph{relay sendme} cell as soon -as enough cells have arrived, the stream-level congestion control also -has to check whether data has been successfully flushed onto the TCP -stream; it sends the \emph{relay sendme} cell only when the number of bytes pending -to be flushed is under some threshold (currently 10 cells' worth). - -%% Maybe omit this next paragraph. -NM -%Currently, non-data relay cells do not affect the windows. Thus we -%avoid potential deadlock issues, for example, arising because a stream -%can't send a \emph{relay sendme} cell when its packaging window is empty. - -These arbitrarily chosen parameters seem to give tolerable throughput -and delay; see Section~\ref{sec:in-the-wild}. - -\section{Rendezvous Points and hidden services} -\label{sec:rendezvous} - -Rendezvous points are a building block for \emph{location-hidden -services} (also known as \emph{responder anonymity}) in the Tor -network. Location-hidden services allow Bob to offer a TCP -service, such as a webserver, without revealing his IP address. -This type of anonymity protects against distributed DoS attacks: -attackers are forced to attack the onion routing network -because they do not know Bob's IP address. - -Our design for location-hidden servers has the following goals. -\textbf{Access-control:} Bob needs a way to filter incoming requests, -so an attacker cannot flood Bob simply by making many connections to him. -\textbf{Robustness:} Bob should be able to maintain a long-term pseudonymous -identity even in the presence of router failure. Bob's service must -not be tied to a single OR, and Bob must be able to migrate his service -across ORs. \textbf{Smear-resistance:} -A social attacker -should not be able to ``frame'' a rendezvous router by -offering an illegal or disreputable location-hidden service and -making observers believe the router created that service. -\textbf{Application-transparency:} Although we require users -to run special software to access location-hidden servers, we must not -require them to modify their applications. - -We provide location-hiding for Bob by allowing him to advertise -several onion routers (his \emph{introduction points}) as contact -points. He may do this on any robust efficient -key-value lookup system with authenticated updates, such as a -distributed hash table (DHT) like CFS~\cite{cfs:sosp01}.\footnote{ -Rather than rely on an external infrastructure, the Onion Routing network -can run the lookup service itself. Our current implementation provides a -simple lookup system on the -directory servers.} Alice, the client, chooses an OR as her -\emph{rendezvous point}. She connects to one of Bob's introduction -points, informs him of her rendezvous point, and then waits for him -to connect to the rendezvous point. This extra level of indirection -helps Bob's introduction points avoid problems associated with serving -unpopular files directly (for example, if Bob serves -material that the introduction point's community finds objectionable, -or if Bob's service tends to get attacked by network vandals). -The extra level of indirection also allows Bob to respond to some requests -and ignore others. - -\subsection{Rendezvous points in Tor} - -The following steps are -%We give an overview of the steps of a rendezvous. These are -performed on behalf of Alice and Bob by their local OPs; -application integration is described more fully below. - -\begin{tightlist} -\item Bob generates a long-term public key pair to identify his service. -\item Bob chooses some introduction points, and advertises them on - the lookup service, signing the advertisement with his public key. He - can add more later. -\item Bob builds a circuit to each of his introduction points, and tells - them to wait for requests. -\item Alice learns about Bob's service out of band (perhaps Bob told her, - or she found it on a website). She retrieves the details of Bob's - service from the lookup service. If Alice wants to access Bob's - service anonymously, she must connect to the lookup service via Tor. -\item Alice chooses an OR as the rendezvous point (RP) for her connection to - Bob's service. She builds a circuit to the RP, and gives it a - randomly chosen ``rendezvous cookie'' to recognize Bob. -\item Alice opens an anonymous stream to one of Bob's introduction - points, and gives it a message (encrypted with Bob's public key) - telling it about herself, - her RP and rendezvous cookie, and the - start of a DH - handshake. The introduction point sends the message to Bob. -\item If Bob wants to talk to Alice, he builds a circuit to Alice's - RP and sends the rendezvous cookie, the second half of the DH - handshake, and a hash of the session - key they now share. By the same argument as in - Section~\ref{subsubsec:constructing-a-circuit}, Alice knows she - shares the key only with Bob. -\item The RP connects Alice's circuit to Bob's. Note that RP can't - recognize Alice, Bob, or the data they transmit. -\item Alice sends a \emph{relay begin} cell along the circuit. It - arrives at Bob's OP, which connects to Bob's - webserver. -\item An anonymous stream has been established, and Alice and Bob - communicate as normal. -\end{tightlist} - -When establishing an introduction point, Bob provides the onion router -with the public key identifying his service. Bob signs his -messages, so others cannot usurp his introduction point -in the future. He uses the same public key to establish the other -introduction points for his service, and periodically refreshes his -entry in the lookup service. - -The message that Alice gives -the introduction point includes a hash of Bob's public key % to identify -%the service, along with -and an optional initial authorization token (the -introduction point can do prescreening, for example to block replays). Her -message to Bob may include an end-to-end authorization token so Bob -can choose whether to respond. -The authorization tokens can be used to provide selective access: -important users can get uninterrupted access. -%important users get tokens to ensure uninterrupted access. %to the -%service. -During normal situations, Bob's service might simply be offered -directly from mirrors, while Bob gives out tokens to high-priority users. If -the mirrors are knocked down, -%by distributed DoS attacks or even -%physical attack, -those users can switch to accessing Bob's service via -the Tor rendezvous system. - -Bob's introduction points are themselves subject to DoS---he must -open many introduction points or risk such an attack. -He can provide selected users with a current list or future schedule of -unadvertised introduction points; -this is most practical -if there is a stable and large group of introduction points -available. Bob could also give secret public keys -for consulting the lookup service. All of these approaches -limit exposure even when -some selected users collude in the DoS\@. - -\subsection{Integration with user applications} - -Bob configures his onion proxy to know the local IP address and port of his -service, a strategy for authorizing clients, and his public key. The onion -proxy anonymously publishes a signed statement of Bob's -public key, an expiration time, and -the current introduction points for his service onto the lookup service, -indexed -by the hash of his public key. Bob's webserver is unmodified, -and doesn't even know that it's hidden behind the Tor network. - -Alice's applications also work unchanged---her client interface -remains a SOCKS proxy. We encode all of the necessary information -into the fully qualified domain name (FQDN) Alice uses when establishing her -connection. Location-hidden services use a virtual top level domain -called {\tt .onion}: thus hostnames take the form {\tt x.y.onion} where -{\tt x} is the authorization cookie and {\tt y} encodes the hash of -the public key. Alice's onion proxy -examines addresses; if they're destined for a hidden server, it decodes -the key and starts the rendezvous as described above. - -\subsection{Previous rendezvous work} -%XXXX Should this get integrated into the earlier related work section? -NM - -Rendezvous points in low-latency anonymity systems were first -described for use in ISDN telephony~\cite{jerichow-jsac98,isdn-mixes}. -Later low-latency designs used rendezvous points for hiding location -of mobile phones and low-power location -trackers~\cite{federrath-ih96,reed-protocols97}. Rendezvous for -anonymizing low-latency -Internet connections was suggested in early Onion Routing -work~\cite{or-ih96}, but the first published design was by Ian -Goldberg~\cite{ian-thesis}. His design differs from -ours in three ways. First, Goldberg suggests that Alice should manually -hunt down a current location of the service via Gnutella; our approach -makes lookup transparent to the user, as well as faster and more robust. -Second, in Tor the client and server negotiate session keys -with Diffie-Hellman, so plaintext is not exposed even at the rendezvous -point. Third, -our design minimizes the exposure from running the -service, to encourage volunteers to offer introduction and rendezvous -services. Tor's introduction points do not output any bytes to the -clients; the rendezvous points don't know the client or the server, -and can't read the data being transmitted. The indirection scheme is -also designed to include authentication/authorization---if Alice doesn't -include the right cookie with her request for service, Bob need not even -acknowledge his existence. - -\section{Other design decisions} -\label{sec:other-design} - -\subsection{Denial of service} -\label{subsec:dos} - -Providing Tor as a public service creates many opportunities for -denial-of-service attacks against the network. While -flow control and rate limiting (discussed in -Section~\ref{subsec:congestion}) prevent users from consuming more -bandwidth than routers are willing to provide, opportunities remain for -users to -consume more network resources than their fair share, or to render the -network unusable for others. - -First of all, there are several CPU-consuming denial-of-service -attacks wherein an attacker can force an OR to perform expensive -cryptographic operations. For example, an attacker can -%\emph{create} cell full of junk bytes can force an OR to perform an RSA -%decrypt. -%Similarly, an attacker can -fake the start of a TLS handshake, forcing the OR to carry out its -(comparatively expensive) half of the handshake at no real computational -cost to the attacker. - -We have not yet implemented any defenses for these attacks, but several -approaches are possible. First, ORs can -require clients to solve a puzzle~\cite{puzzles-tls} while beginning new -TLS handshakes or accepting \emph{create} cells. So long as these -tokens are easy to verify and computationally expensive to produce, this -approach limits the attack multiplier. Additionally, ORs can limit -the rate at which they accept \emph{create} cells and TLS connections, -so that -the computational work of processing them does not drown out the -symmetric cryptography operations that keep cells -flowing. This rate limiting could, however, allow an attacker -to slow down other users when they build new circuits. - -% What about link-to-link rate limiting? - -Adversaries can also attack the Tor network's hosts and network -links. Disrupting a single circuit or link breaks all streams passing -along that part of the circuit. Users similarly lose service -when a router crashes or its operator restarts it. The current -Tor design treats such attacks as intermittent network failures, and -depends on users and applications to respond or recover as appropriate. A -future design could use an end-to-end TCP-like acknowledgment protocol, -so no streams are lost unless the entry or exit point is -disrupted. This solution would require more buffering at the network -edges, however, and the performance and anonymity implications from this -extra complexity still require investigation. - -\subsection{Exit policies and abuse} -\label{subsec:exitpolicies} - -% originally, we planned to put the "users only know the hostname, -% not the IP, but exit policies are by IP" problem here too. Not -% worth putting in the submission, but worth thinking about putting -% in sometime somehow. -RD - -Exit abuse is a serious barrier to wide-scale Tor deployment. Anonymity -presents would-be vandals and abusers with an opportunity to hide -the origins of their activities. Attackers can harm the Tor network by -implicating exit servers for their abuse. Also, applications that commonly -use IP-based authentication (such as institutional mail or webservers) -can be fooled by the fact that anonymous connections appear to originate -at the exit OR. - -We stress that Tor does not enable any new class of abuse. Spammers -and other attackers already have access to thousands of misconfigured -systems worldwide, and the Tor network is far from the easiest way -to launch attacks. -%Indeed, because of its limited -%anonymity, Tor is probably not a good way to commit crimes. -But because the -onion routers can be mistaken for the originators of the abuse, -and the volunteers who run them may not want to deal with the hassle of -explaining anonymity networks to irate administrators, we must block or limit -abuse through the Tor network. - -To mitigate abuse issues, each onion router's \emph{exit policy} -describes to which external addresses and ports the router will -connect. On one end of the spectrum are \emph{open exit} -nodes that will connect anywhere. On the other end are \emph{middleman} -nodes that only relay traffic to other Tor nodes, and \emph{private exit} -nodes that only connect to a local host or network. A private -exit can allow a client to connect to a given host or -network more securely---an external adversary cannot eavesdrop traffic -between the private exit and the final destination, and so is less sure of -Alice's destination and activities. Most onion routers in the current -network function as -\emph{restricted exits} that permit connections to the world at large, -but prevent access to certain abuse-prone addresses and services such -as SMTP. -The OR might also be able to authenticate clients to -prevent exit abuse without harming anonymity~\cite{or-discex00}. - -%The abuse issues on closed (e.g. military) networks are different -%from the abuse on open networks like the Internet. While these IP-based -%access controls are still commonplace on the Internet, on closed networks, -%nearly all participants will be honest, and end-to-end authentication -%can be assumed for important traffic. - -Many administrators use port restrictions to support only a -limited set of services, such as HTTP, SSH, or AIM. -This is not a complete solution, of course, since abuse opportunities for these -protocols are still well known. - -We have not yet encountered any abuse in the deployed network, but if -we do we should consider using proxies to clean traffic for certain -protocols as it leaves the network. For example, much abusive HTTP -behavior (such as exploiting buffer overflows or well-known script -vulnerabilities) can be detected in a straightforward manner. -Similarly, one could run automatic spam filtering software (such as -SpamAssassin) on email exiting the OR network. - -ORs may also rewrite exiting traffic to append -headers or other information indicating that the traffic has passed -through an anonymity service. This approach is commonly used -by email-only anonymity systems. ORs can also -run on servers with hostnames like {\tt anonymous} to further -alert abuse targets to the nature of the anonymous traffic. - -A mixture of open and restricted exit nodes allows the most -flexibility for volunteers running servers. But while having many -middleman nodes provides a large and robust network, -having only a few exit nodes reduces the number of points -an adversary needs to monitor for traffic analysis, and places a -greater burden on the exit nodes. This tension can be seen in the -Java Anon Proxy -cascade model, wherein only one node in each cascade needs to handle -abuse complaints---but an adversary only needs to observe the entry -and exit of a cascade to perform traffic analysis on all that -cascade's users. The hydra model (many entries, few exits) presents a -different compromise: only a few exit nodes are needed, but an -adversary needs to work harder to watch all the clients; see -Section~\ref{sec:conclusion}. - -Finally, we note that exit abuse must not be dismissed as a peripheral -issue: when a system's public image suffers, it can reduce the number -and diversity of that system's users, and thereby reduce the anonymity -of the system itself. Like usability, public perception is a -security parameter. Sadly, preventing abuse of open exit nodes is an -unsolved problem, and will probably remain an arms race for the -foreseeable future. The abuse problems faced by Princeton's CoDeeN -project~\cite{darkside} give us a glimpse of likely issues. - -\subsection{Directory Servers} -\label{subsec:dirservers} - -First-generation Onion Routing designs~\cite{freedom2-arch,or-jsac98} used -in-band network status updates: each router flooded a signed statement -to its neighbors, which propagated it onward. But anonymizing networks -have different security goals than typical link-state routing protocols. -For example, delays (accidental or intentional) -that can cause different parts of the network to have different views -of link-state and topology are not only inconvenient: they give -attackers an opportunity to exploit differences in client knowledge. -We also worry about attacks to deceive a -client about the router membership list, topology, or current network -state. Such \emph{partitioning attacks} on client knowledge help an -adversary to efficiently deploy resources -against a target~\cite{minion-design}. - -Tor uses a small group of redundant, well-known onion routers to -track changes in network topology and node state, including keys and -exit policies. Each such \emph{directory server} acts as an HTTP -server, so clients can fetch current network state -and router lists, and so other ORs can upload -state information. Onion routers periodically publish signed -statements of their state to each directory server. The directory servers -combine this information with their own views of network liveness, -and generate a signed description (a \emph{directory}) of the entire -network state. Client software is -pre-loaded with a list of the directory servers and their keys, -to bootstrap each client's view of the network. -% XXX this means that clients will be forced to upgrade as the -% XXX dirservers change or get compromised. argue that this is ok. - -When a directory server receives a signed statement for an OR, it -checks whether the OR's identity key is recognized. Directory -servers do not advertise unrecognized ORs---if they did, -an adversary could take over the network by creating many -servers~\cite{sybil}. Instead, new nodes must be approved by the -directory -server administrator before they are included. Mechanisms for automated -node approval are an area of active research, and are discussed more -in Section~\ref{sec:maintaining-anonymity}. - -Of course, a variety of attacks remain. An adversary who controls -a directory server can track clients by providing them different -information---perhaps by listing only nodes under its control, or by -informing only certain clients about a given node. Even an external -adversary can exploit differences in client knowledge: clients who use -a node listed on one directory server but not the others are vulnerable. - -Thus these directory servers must be synchronized and redundant, so -that they can agree on a common directory. Clients should only trust -this directory if it is signed by a threshold of the directory -servers. - -The directory servers in Tor are modeled after those in -Mixminion~\cite{minion-design}, but our situation is easier. First, -we make the -simplifying assumption that all participants agree on the set of -directory servers. Second, while Mixminion needs to predict node -behavior, Tor only needs a threshold consensus of the current -state of the network. Third, we assume that we can fall back to the -human administrators to discover and resolve problems when a consensus -directory cannot be reached. Since there are relatively few directory -servers (currently 3, but we expect as many as 9 as the network scales), -we can afford operations like broadcast to simplify the consensus-building -protocol. - -To avoid attacks where a router connects to all the directory servers -but refuses to relay traffic from other routers, the directory servers -must also build circuits and use them to anonymously test router -reliability~\cite{mix-acc}. Unfortunately, this defense is not yet -designed or -implemented. - -Using directory servers is simpler and more flexible than flooding. -Flooding is expensive, and complicates the analysis when we -start experimenting with non-clique network topologies. Signed -directories can be cached by other -onion routers, -so directory servers are not a performance -bottleneck when we have many users, and do not aid traffic analysis by -forcing clients to announce their existence to any -central point. - -\section{Attacks and Defenses} -\label{sec:attacks} - -Below we summarize a variety of attacks, and discuss how well our -design withstands them.\\ - -\noindent{\large\bf Passive attacks}\\ -\emph{Observing user traffic patterns.} Observing a user's connection -will not reveal her destination or data, but it will -reveal traffic patterns (both sent and received). Profiling via user -connection patterns requires further processing, because multiple -application streams may be operating simultaneously or in series over -a single circuit. - -\emph{Observing user content.} While content at the user end is encrypted, -connections to responders may not be (indeed, the responding website -itself may be hostile). While filtering content is not a primary goal -of Onion Routing, Tor can directly use Privoxy and related -filtering services to anonymize application data streams. - -\emph{Option distinguishability.} We allow clients to choose -configuration options. For example, clients concerned about request -linkability should rotate circuits more often than those concerned -about traceability. Allowing choice may attract users with different -%There is economic incentive to attract users by -%allowing this choice; -needs; but clients who are -in the minority may lose more anonymity by appearing distinct than they -gain by optimizing their behavior~\cite{econymics}. - -\emph{End-to-end timing correlation.} Tor only minimally hides -such correlations. An attacker watching patterns of -traffic at the initiator and the responder will be -able to confirm the correspondence with high probability. The -greatest protection currently available against such confirmation is to hide -the connection between the onion proxy and the first Tor node, -by running the OP on the Tor node or behind a firewall. This approach -requires an observer to separate traffic originating at the onion -router from traffic passing through it: a global observer can do this, -but it might be beyond a limited observer's capabilities. - -\emph{End-to-end size correlation.} Simple packet counting -will also be effective in confirming -endpoints of a stream. However, even without padding, we may have some -limited protection: the leaky pipe topology means different numbers -of packets may enter one end of a circuit than exit at the other. - -\emph{Website fingerprinting.} All the effective passive -attacks above are traffic confirmation attacks, -which puts them outside our design goals. There is also -a passive traffic analysis attack that is potentially effective. -Rather than searching exit connections for timing and volume -correlations, the adversary may build up a database of -``fingerprints'' containing file sizes and access patterns for -targeted websites. He can later confirm a user's connection to a given -site simply by consulting the database. This attack has -been shown to be effective against SafeWeb~\cite{hintz-pet02}. -It may be less effective against Tor, since -streams are multiplexed within the same circuit, and -fingerprinting will be limited to -the granularity of cells (currently 512 bytes). Additional -defenses could include -larger cell sizes, padding schemes to group websites -into large sets, and link -padding or long-range dummies.\footnote{Note that this fingerprinting -attack should not be confused with the much more complicated latency -attacks of~\cite{back01}, which require a fingerprint of the latencies -of all circuits through the network, combined with those from the -network edges to the target user and the responder website.}\\ - -\noindent{\large\bf Active attacks}\\ -\emph{Compromise keys.} An attacker who learns the TLS session key can -see control cells and encrypted relay cells on every circuit on that -connection; learning a circuit -session key lets him unwrap one layer of the encryption. An attacker -who learns an OR's TLS private key can impersonate that OR for the TLS -key's lifetime, but he must -also learn the onion key to decrypt \emph{create} cells (and because of -perfect forward secrecy, he cannot hijack already established circuits -without also compromising their session keys). Periodic key rotation -limits the window of opportunity for these attacks. On the other hand, -an attacker who learns a node's identity key can replace that node -indefinitely by sending new forged descriptors to the directory servers. - -\emph{Iterated compromise.} A roving adversary who can -compromise ORs (by system intrusion, legal coercion, or extralegal -coercion) could march down the circuit compromising the -nodes until he reaches the end. Unless the adversary can complete -this attack within the lifetime of the circuit, however, the ORs -will have discarded the necessary information before the attack can -be completed. (Thanks to the perfect forward secrecy of session -keys, the attacker cannot force nodes to decrypt recorded -traffic once the circuits have been closed.) Additionally, building -circuits that cross jurisdictions can make legal coercion -harder---this phenomenon is commonly called ``jurisdictional -arbitrage.'' The Java Anon Proxy project recently experienced the -need for this approach, when -a German court forced them to add a backdoor to -their nodes~\cite{jap-backdoor}. - -\emph{Run a recipient.} An adversary running a webserver -trivially learns the timing patterns of users connecting to it, and -can introduce arbitrary patterns in its responses. -End-to-end attacks become easier: if the adversary can induce -users to connect to his webserver (perhaps by advertising -content targeted to those users), he now holds one end of their -connection. There is also a danger that application -protocols and associated programs can be induced to reveal information -about the initiator. Tor depends on Privoxy and similar protocol cleaners -to solve this latter problem. - -\emph{Run an onion proxy.} It is expected that end users will -nearly always run their own local onion proxy. However, in some -settings, it may be necessary for the proxy to run -remotely---typically, in institutions that want -to monitor the activity of those connecting to the proxy. -Compromising an onion proxy compromises all future connections -through it. - -\emph{DoS non-observed nodes.} An observer who can only watch some -of the Tor network can increase the value of this traffic -by attacking non-observed nodes to shut them down, reduce -their reliability, or persuade users that they are not trustworthy. -The best defense here is robustness. - -\emph{Run a hostile OR.} In addition to being a local observer, -an isolated hostile node can create circuits through itself, or alter -traffic patterns to affect traffic at other nodes. Nonetheless, a hostile -node must be immediately adjacent to both endpoints to compromise the -anonymity of a circuit. If an adversary can -run multiple ORs, and can persuade the directory servers -that those ORs are trustworthy and independent, then occasionally -some user will choose one of those ORs for the start and another -as the end of a circuit. If an adversary -controls $m>1$ of $N$ nodes, he can correlate at most -$\left(\frac{m}{N}\right)^2$ of the traffic---although an -adversary -could still attract a disproportionately large amount of traffic -by running an OR with a permissive exit policy, or by -degrading the reliability of other routers. - -\emph{Introduce timing into messages.} This is simply a stronger -version of passive timing attacks already discussed earlier. - -\emph{Tagging attacks.} A hostile node could ``tag'' a -cell by altering it. If the -stream were, for example, an unencrypted request to a Web site, -the garbled content coming out at the appropriate time would confirm -the association. However, integrity checks on cells prevent -this attack. - -\emph{Replace contents of unauthenticated protocols.} When -relaying an unauthenticated protocol like HTTP, a hostile exit node -can impersonate the target server. Clients -should prefer protocols with end-to-end authentication. - -\emph{Replay attacks.} Some anonymity protocols are vulnerable -to replay attacks. Tor is not; replaying one side of a handshake -will result in a different negotiated session key, and so the rest -of the recorded session can't be used. - -\emph{Smear attacks.} An attacker could use the Tor network for -socially disapproved acts, to bring the -network into disrepute and get its operators to shut it down. -Exit policies reduce the possibilities for abuse, but -ultimately the network requires volunteers who can tolerate -some political heat. - -\emph{Distribute hostile code.} An attacker could trick users -into running subverted Tor software that did not, in fact, anonymize -their connections---or worse, could trick ORs into running weakened -software that provided users with less anonymity. We address this -problem (but do not solve it completely) by signing all Tor releases -with an official public key, and including an entry in the directory -that lists which versions are currently believed to be secure. To -prevent an attacker from subverting the official release itself -(through threats, bribery, or insider attacks), we provide all -releases in source code form, encourage source audits, and -frequently warn our users never to trust any software (even from -us) that comes without source.\\ - -\noindent{\large\bf Directory attacks}\\ -\emph{Destroy directory servers.} If a few directory -servers disappear, the others still decide on a valid -directory. So long as any directory servers remain in operation, -they will still broadcast their views of the network and generate a -consensus directory. (If more than half are destroyed, this -directory will not, however, have enough signatures for clients to -use it automatically; human intervention will be necessary for -clients to decide whether to trust the resulting directory.) - -\emph{Subvert a directory server.} By taking over a directory server, -an attacker can partially influence the final directory. Since ORs -are included or excluded by majority vote, the corrupt directory can -at worst cast a tie-breaking vote to decide whether to include -marginal ORs. It remains to be seen how often such marginal cases -occur in practice. - -\emph{Subvert a majority of directory servers.} An adversary who controls -more than half the directory servers can include as many compromised -ORs in the final directory as he wishes. We must ensure that directory -server operators are independent and attack-resistant. - -\emph{Encourage directory server dissent.} The directory -agreement protocol assumes that directory server operators agree on -the set of directory servers. An adversary who can persuade some -of the directory server operators to distrust one another could -split the quorum into mutually hostile camps, thus partitioning -users based on which directory they use. Tor does not address -this attack. - -\emph{Trick the directory servers into listing a hostile OR.} -Our threat model explicitly assumes directory server operators will -be able to filter out most hostile ORs. -% If this is not true, an -% attacker can flood the directory with compromised servers. - -\emph{Convince the directories that a malfunctioning OR is -working.} In the current Tor implementation, directory servers -assume that an OR is running correctly if they can start a TLS -connection to it. A hostile OR could easily subvert this test by -accepting TLS connections from ORs but ignoring all cells. Directory -servers must actively test ORs by building circuits and streams as -appropriate. The tradeoffs of a similar approach are discussed -in~\cite{mix-acc}.\\ - -\noindent{\large\bf Attacks against rendezvous points}\\ -\emph{Make many introduction requests.} An attacker could -try to deny Bob service by flooding his introduction points with -requests. Because the introduction points can block requests that -lack authorization tokens, however, Bob can restrict the volume of -requests he receives, or require a certain amount of computation for -every request he receives. - -\emph{Attack an introduction point.} An attacker could -disrupt a location-hidden service by disabling its introduction -points. But because a service's identity is attached to its public -key, the service can simply re-advertise -itself at a different introduction point. Advertisements can also be -done secretly so that only high-priority clients know the address of -Bob's introduction points or so that different clients know of different -introduction points. This forces the attacker to disable all possible -introduction points. - -\emph{Compromise an introduction point.} An attacker who controls -Bob's introduction point can flood Bob with -introduction requests, or prevent valid introduction requests from -reaching him. Bob can notice a flood, and close the circuit. To notice -blocking of valid requests, however, he should periodically test the -introduction point by sending rendezvous requests and making -sure he receives them. - -\emph{Compromise a rendezvous point.} A rendezvous -point is no more sensitive than any other OR on -a circuit, since all data passing through the rendezvous is encrypted -with a session key shared by Alice and Bob. - -\section{Early experiences: Tor in the Wild} -\label{sec:in-the-wild} - -As of mid-May 2004, the Tor network consists of 32 nodes -(24 in the US, 8 in Europe), and more are joining each week as the code -matures. (For comparison, the current remailer network -has about 40 nodes.) % We haven't asked PlanetLab to provide -%Tor nodes, since their AUP wouldn't allow exit nodes (see -%also~\cite{darkside}) and because we aim to build a long-term community of -%node operators and developers.} -Each node has at least a 768Kb/768Kb connection, and -many have 10Mb. The number of users varies (and of course, it's hard to -tell for sure), but we sometimes have several hundred users---administrators at -several companies have begun sending their entire departments' web -traffic through Tor, to block other divisions of -their company from reading their traffic. Tor users have reported using -the network for web browsing, FTP, IRC, AIM, Kazaa, SSH, and -recipient-anonymous email via rendezvous points. One user has anonymously -set up a Wiki as a hidden service, where other users anonymously publish -the addresses of their hidden services. - -Each Tor node currently processes roughly 800,000 relay -cells (a bit under half a gigabyte) per week. On average, about 80\% -of each 498-byte payload is full for cells going back to the client, -whereas about 40\% is full for cells coming from the client. (The difference -arises because most of the network's traffic is web browsing.) Interactive -traffic like SSH brings down the average a lot---once we have more -experience, and assuming we can resolve the anonymity issues, we may -partition traffic into two relay cell sizes: one to handle -bulk traffic and one for interactive traffic. - -Based in part on our restrictive default exit policy (we -reject SMTP requests) and our low profile, we have had no abuse -issues since the network was deployed in October -2003. Our slow growth rate gives us time to add features, -resolve bugs, and get a feel for what users actually want from an -anonymity system. Even though having more users would bolster our -anonymity sets, we are not eager to attract the Kazaa or warez -communities---we feel that we must build a reputation for privacy, human -rights, research, and other socially laudable activities. - -As for performance, profiling shows that Tor spends almost -all its CPU time in AES, which is fast. Current latency is attributable -to two factors. First, network latency is critical: we are -intentionally bouncing traffic around the world several times. Second, -our end-to-end congestion control algorithm focuses on protecting -volunteer servers from accidental DoS rather than on optimizing -performance. % Right now the first $500 \times 500\mbox{B}=250\mbox{KB}$ -%of the stream arrives -%quickly, and after that throughput depends on the rate that \emph{relay -%sendme} acknowledgments arrive. -To quantify these effects, we did some informal tests using a network of 4 -nodes on the same machine (a heavily loaded 1GHz Athlon). We downloaded a 60 -megabyte file from {\tt debian.org} every 30 minutes for 54 hours (108 sample -points). It arrived in about 300 seconds on average, compared to 210s for a -direct download. We ran a similar test on the production Tor network, -fetching the front page of {\tt cnn.com} (55 kilobytes): -% every 20 seconds for 8952 data points -while a direct -download consistently took about 0.3s, the performance through Tor varied. -Some downloads were as fast as 0.4s, with a median at 2.8s, and -90\% finishing within 5.3s. It seems that as the network expands, the chance -of building a slow circuit (one that includes a slow or heavily loaded node -or link) is increasing. On the other hand, as our users remain satisfied -with this increased latency, we can address our performance incrementally as we -proceed with development. %\footnote{For example, we have just begun pushing -%a pipelining patch to the production network that seems to decrease -%latency for medium-to-large files; we will present revised benchmarks -%as they become available.} - -%With the current network's topology and load, users can typically get 1-2 -%megabits sustained transfer rate, which is good enough for now. -%Indeed, the Tor -%design aims foremost to provide a security research platform; performance -%only needs to be sufficient to retain users~\cite{econymics,back01}. -%We can tweak the congestion control -%parameters to provide faster throughput at the cost of -%larger buffers at each node; adding the heuristics mentioned in -%Section~\ref{subsec:rate-limit} to favor low-volume -%streams may also help. More research remains to find the -%right balance. -% We should say _HOW MUCH_ latency there is in these cases. -NM - -%performs badly on lossy networks. may need airhook or something else as -%transport alternative? - -Although Tor's clique topology and full-visibility directories present -scaling problems, we still expect the network to support a few hundred -nodes and maybe 10,000 users before we're forced to become -more distributed. With luck, the experience we gain running the current -topology will help us choose among alternatives when the time comes. - -\section{Open Questions in Low-latency Anonymity} -\label{sec:maintaining-anonymity} - -In addition to the non-goals in -Section~\ref{subsec:non-goals}, many questions must be solved -before we can be confident of Tor's security. - -Many of these open issues are questions of balance. For example, -how often should users rotate to fresh circuits? Frequent rotation -is inefficient, expensive, and may lead to intersection attacks and -predecessor attacks~\cite{wright03}, but infrequent rotation makes the -user's traffic linkable. Besides opening fresh circuits, clients can -also exit from the middle of the circuit, -or truncate and re-extend the circuit. More analysis is -needed to determine the proper tradeoff. - -%% Duplicated by 'Better directory distribution' in section 9. -% -%A similar question surrounds timing of directory operations: how often -%should directories be updated? Clients that update infrequently receive -%an inaccurate picture of the network, but frequent updates can overload -%the directory servers. More generally, we must find more -%decentralized yet practical ways to distribute up-to-date snapshots of -%network status without introducing new attacks. - -How should we choose path lengths? If Alice always uses two hops, -then both ORs can be certain that by colluding they will learn about -Alice and Bob. In our current approach, Alice always chooses at least -three nodes unrelated to herself and her destination. -%% This point is subtle, but not IMO necessary. Anybody who thinks -%% about it will see that it's implied by the above sentence; anybody -%% who doesn't think about it is safe in his ignorance. -% -%Thus normally she chooses -%three nodes, but if she is running an OR and her destination is on an OR, -%she uses five. -Should Alice choose a random path length (e.g.~from a geometric -distribution) to foil an attacker who -uses timing to learn that he is the fifth hop and thus concludes that -both Alice and the responder are running ORs? - -Throughout this paper, we have assumed that end-to-end traffic -confirmation will immediately and automatically defeat a low-latency -anonymity system. Even high-latency anonymity systems can be -vulnerable to end-to-end traffic confirmation, if the traffic volumes -are high enough, and if users' habits are sufficiently -distinct~\cite{statistical-disclosure,limits-open}. Can anything be -done to -make low-latency systems resist these attacks as well as high-latency -systems? Tor already makes some effort to conceal the starts and ends of -streams by wrapping long-range control commands in identical-looking -relay cells. Link padding could frustrate passive observers who count -packets; long-range padding could work against observers who own the -first hop in a circuit. But more research remains to find an efficient -and practical approach. Volunteers prefer not to run constant-bandwidth -padding; but no convincing traffic shaping approach has been -specified. Recent work on long-range padding~\cite{defensive-dropping} -shows promise. One could also try to reduce correlation in packet timing -by batching and re-ordering packets, but it is unclear whether this could -improve anonymity without introducing so much latency as to render the -network unusable. - -A cascade topology may better defend against traffic confirmation by -aggregating users, and making padding and -mixing more affordable. Does the hydra topology (many input nodes, -few output nodes) work better against some adversaries? Are we going -to get a hydra anyway because most nodes will be middleman nodes? - -Common wisdom suggests that Alice should run her own OR for best -anonymity, because traffic coming from her node could plausibly have -come from elsewhere. How much mixing does this approach need? Is it -immediately beneficial because of real-world adversaries that can't -observe Alice's router, but can run routers of their own? - -To scale to many users, and to prevent an attacker from observing the -whole network, it may be necessary -to support far more servers than Tor currently anticipates. -This introduces several issues. First, if approval by a central set -of directory servers is no longer feasible, what mechanism should be used -to prevent adversaries from signing up many colluding servers? Second, -if clients can no longer have a complete picture of the network, -how can they perform discovery while preventing attackers from -manipulating or exploiting gaps in their knowledge? Third, if there -are too many servers for every server to constantly communicate with -every other, which non-clique topology should the network use? -(Restricted-route topologies promise comparable anonymity with better -scalability~\cite{danezis:pet2003}, but whatever topology we choose, we -need some way to keep attackers from manipulating their position within -it~\cite{casc-rep}.) Fourth, if no central authority is tracking -server reliability, how do we stop unreliable servers from making -the network unusable? Fifth, do clients receive so much anonymity -from running their own ORs that we should expect them all to do -so~\cite{econymics}, or do we need another incentive structure to -motivate them? Tarzan and MorphMix present possible solutions. - -% advogato, captcha - -When a Tor node goes down, all its circuits (and thus streams) must break. -Will users abandon the system because of this brittleness? How well -does the method in Section~\ref{subsec:dos} allow streams to survive -node failure? If affected users rebuild circuits immediately, how much -anonymity is lost? It seems the problem is even worse in a peer-to-peer -environment---such systems don't yet provide an incentive for peers to -stay connected when they're done retrieving content, so we would expect -a higher churn rate. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\section{Future Directions} -\label{sec:conclusion} - -Tor brings together many innovations into a unified deployable system. The -next immediate steps include: - -\emph{Scalability:} Tor's emphasis on deployability and design simplicity -has led us to adopt a clique topology, semi-centralized -directories, and a full-network-visibility model for client -knowledge. These properties will not scale past a few hundred servers. -Section~\ref{sec:maintaining-anonymity} describes some promising -approaches, but more deployment experience will be helpful in learning -the relative importance of these bottlenecks. - -\emph{Bandwidth classes:} This paper assumes that all ORs have -good bandwidth and latency. We should instead adopt the MorphMix model, -where nodes advertise their bandwidth level (DSL, T1, T3), and -Alice avoids bottlenecks by choosing nodes that match or -exceed her bandwidth. In this way DSL users can usefully join the Tor -network. - -\emph{Incentives:} Volunteers who run nodes are rewarded with publicity -and possibly better anonymity~\cite{econymics}. More nodes means increased -scalability, and more users can mean more anonymity. We need to continue -examining the incentive structures for participating in Tor. Further, -we need to explore more approaches to limiting abuse, and understand -why most people don't bother using privacy systems. - -\emph{Cover traffic:} Currently Tor omits cover traffic---its costs -in performance and bandwidth are clear but its security benefits are -not well understood. We must pursue more research on link-level cover -traffic and long-range cover traffic to determine whether some simple padding -method offers provable protection against our chosen adversary. - -%%\emph{Offer two relay cell sizes:} Traffic on the Internet tends to be -%%large for bulk transfers and small for interactive traffic. One cell -%%size cannot be optimal for both types of traffic. -% This should go in the spec and todo, but not the paper yet. -RD - -\emph{Caching at exit nodes:} Perhaps each exit node should run a -caching web proxy~\cite{shsm03}, to improve anonymity for cached pages -(Alice's request never -leaves the Tor network), to improve speed, and to reduce bandwidth cost. -On the other hand, forward security is weakened because caches -constitute a record of retrieved files. We must find the right -balance between usability and security. - -\emph{Better directory distribution:} -Clients currently download a description of -the entire network every 15 minutes. As the state grows larger -and clients more numerous, we may need a solution in which -clients receive incremental updates to directory state. -More generally, we must find more -scalable yet practical ways to distribute up-to-date snapshots of -network status without introducing new attacks. - -\emph{Further specification review:} Our public -byte-level specification~\cite{tor-spec} needs -external review. We hope that as Tor -is deployed, more people will examine its -specification. - -\emph{Multisystem interoperability:} We are currently working with the -designer of MorphMix to unify the specification and implementation of -the common elements of our two systems. So far, this seems -to be relatively straightforward. Interoperability will allow testing -and direct comparison of the two designs for trust and scalability. - -\emph{Wider-scale deployment:} The original goal of Tor was to -gain experience in deploying an anonymizing overlay network, and -learn from having actual users. We are now at a point in design -and development where we can start deploying a wider network. Once -we have many actual users, we will doubtlessly be better -able to evaluate some of our design decisions, including our -robustness/latency tradeoffs, our performance tradeoffs (including -cell size), our abuse-prevention mechanisms, and -our overall usability. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% commented out for anonymous submission -\section*{Acknowledgments} - We thank Peter Palfrader, Geoff Goodell, Adam Shostack, Joseph Sokol-Margolis, - John Bashinski, and Zack Brown - for editing and comments; - Matej Pfajfar, Andrei Serjantov, Marc Rennhard for design discussions; - Bram Cohen for congestion control discussions; - Adam Back for suggesting telescoping circuits; and - Cathy Meadows for formal analysis of the \emph{extend} protocol. - This work has been supported by ONR and DARPA. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\bibliographystyle{latex8} -\bibliography{tor-design} - -\end{document} - -% Style guide: -% U.S. spelling -% avoid contractions (it's, can't, etc.) -% prefer ``for example'' or ``such as'' to e.g. -% prefer ``that is'' to i.e. -% 'mix', 'mixes' (as noun) -% 'mix-net' -% 'mix', 'mixing' (as verb) -% 'middleman' [Not with a hyphen; the hyphen has been optional -% since Middle English.] -% 'nymserver' -% 'Cypherpunk', 'Cypherpunks', 'Cypherpunk remailer' -% 'Onion Routing design', 'onion router' [note capitalization] -% 'SOCKS' -% Try not to use \cite as a noun. -% 'Authorizating' sounds great, but it isn't a word. -% 'First, second, third', not 'Firstly, secondly, thirdly'. -% 'circuit', not 'channel' -% Typography: no space on either side of an em dash---ever. -% Hyphens are for multi-part words; en dashs imply movement or -% opposition (The Alice--Bob connection); and em dashes are -% for punctuation---like that. -% A relay cell; a control cell; a \emph{create} cell; a -% \emph{relay truncated} cell. Never ``a \emph{relay truncated}.'' -% -% 'Substitute ``Damn'' every time you're inclined to write ``very;'' your -% editor will delete it and the writing will be just as it should be.' -% -- Mark Twain diff -Nru tor-0.2.0.34/doc/design-paper/usenix.sty tor-0.2.2.16-alpha/doc/design-paper/usenix.sty --- tor-0.2.0.34/doc/design-paper/usenix.sty 2008-02-26 19:56:32.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/design-paper/usenix.sty 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ -% usenix-2e.sty - to be used with latex2e (the new one) for USENIX. -% To use this style file, do this: -% -% \documentclass[twocolumn]{article} -% \usepackage{usenix-2e} -% and put {\rm ....} around the author names. -% -% $Id: usenix.sty 2163 2004-08-06 19:54:29Z weasel $ -% -% The following definitions are modifications of standard article.sty -% definitions, arranged to do a better job of matching the USENIX -% guidelines. -% It will automatically select two-column mode and the Times-Roman -% font. - -% -% USENIX papers are two-column. -% Times-Roman font is nice if you can get it (requires NFSS, -% which is in latex2e. - -\if@twocolumn\else\input twocolumn.sty\fi -\usepackage{times} - -% -% USENIX wants margins of: 7/8" side, 1" bottom, and 3/4" top. -% 0.25" gutter between columns. -% Gives active areas of 6.75" x 9.25" -% -\setlength{\textheight}{9.0in} -\setlength{\columnsep}{0.25in} -%%\setlength{\textwidth}{6.75in} -\setlength{\textwidth}{7.00in} -%\setlength{\footheight}{0.0in} -\setlength{\topmargin}{-0.25in} -\setlength{\headheight}{0.0in} -\setlength{\headsep}{0.0in} -\setlength{\evensidemargin}{-0.125in} -\setlength{\oddsidemargin}{-0.125in} - -% -% Usenix wants no page numbers for submitted papers, so that they can -% number them themselves. -% -\pagestyle{empty} - -% -% Usenix titles are in 14-point bold type, with no date, and with no -% change in the empty page headers. The whol author section is 12 point -% italic--- you must use {\rm } around the actual author names to get -% them in roman. -% -\def\maketitle{\par - \begingroup - \renewcommand\thefootnote{\fnsymbol{footnote}}% - \def\@makefnmark{\hbox to\z@{$\m@th^{\@thefnmark}$\hss}}% - \long\def\@makefntext##1{\parindent 1em\noindent - \hbox to1.8em{\hss$\m@th^{\@thefnmark}$}##1}% - \if@twocolumn - \twocolumn[\@maketitle]% - \else \newpage - \global\@topnum\z@ - \@maketitle \fi\@thanks - \endgroup - \setcounter{footnote}{0}% - \let\maketitle\relax - \let\@maketitle\relax - \gdef\@thanks{}\gdef\@author{}\gdef\@title{}\let\thanks\relax} - -\def\@maketitle{\newpage - \vbox to 2.5in{ - \vspace*{\fill} - \vskip 2em - \begin{center}% - {\Large\bf \@title \par}% - \vskip 0.375in minus 0.300in - {\large\it - \lineskip .5em - \begin{tabular}[t]{c}\@author - \end{tabular}\par}% - \end{center}% - \par - \vspace*{\fill} -% \vskip 1.5em - } -} - -% -% The abstract is preceded by a 12-pt bold centered heading -\def\abstract{\begin{center}% -{\large\bf \abstractname\vspace{-.5em}\vspace{\z@}}% -\end{center}} -\def\endabstract{} - -% -% Main section titles are 12-pt bold. Others can be same or smaller. -% -\def\section{\@startsection {section}{1}{\z@}{-3.5ex plus-1ex minus - -.2ex}{2.3ex plus.2ex}{\reset@font\large\bf}} diff -Nru tor-0.2.0.34/doc/HACKING tor-0.2.2.16-alpha/doc/HACKING --- tor-0.2.0.34/doc/HACKING 2008-02-26 19:56:32.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/HACKING 2010-09-17 01:30:36.000000000 +0000 @@ -1,104 +1,333 @@ +Hacking Tor: An Incomplete Guide +================================ -0. The buildbot. +Getting started +--------------- - http://tor-buildbot.freehaven.net:8010/ +For full information on how Tor is supposed to work, look at the files in +doc/spec/ . -0.1. Useful command-lines that are non-trivial to reproduce but can -help with tracking bugs or leaks. +For an explanation of how to change Tor's design to work differently, look at +doc/spec/proposals/001-process.txt . -dmalloc -l ~/dmalloc.log -(run the commands it tells you) -./configure --with-dmalloc +For the latest version of the code, get a copy of git, and -valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor + git clone git://git.torproject.org/git/tor . -1. Coding conventions +We talk about Tor on the or-talk mailing list. Design proposals and +discussion belong on the or-dev mailing list. We hang around on +irc.oftc.net, with general discussion happening on #tor and development +happening on #tor-dev. -1.0. Whitespace and C conformance +How we use Git branches +----------------------- - Invoke "make check-spaces" from time to time, so it can tell you about - deviations from our C whitespace style. Generally, we use: - - Unix-style line endings - - K&R-style indentation - - No space before newlines - - A blank line at the end of each file - - Never more than one blank line in a row - - Always spaces, never tabs - - No more than 79-columns per line. - - Two spaces per indent. - - A space between control keywords and their corresponding paren - "if (x)", "while (x)", and "switch (x)", never "if(x)", "while(x)", or - "switch(x)". - - A space between anything and an open brace. - - No space between a function name and an opening paren. "puts(x)", not - "puts (x)". - - Function declarations at the start of the line. +Each main development series (like 0.2.1, 0.2.2, etc) has its main work +applied to a single branch. At most one series can be the development series +at a time; all other series are maintenance series that get bug-fixes only. +The development series is built in a git branch called "master"; the +maintenance series are built in branches called "maint-0.2.0", "maint-0.2.1", +and so on. We regularly merge the active maint branches forward. - We try hard to build without warnings everywhere. In particular, if you're - using gcc, you should invoke the configure script with the option - "--enable-gcc-warnings". This will give a bunch of extra warning flags to - the compiler, and help us find divergences from our preferred C style. +For all series except the development series, we also have a "release" branch +(as in "release-0.2.1"). The release series is based on the corresponding +maintenance series, except that it deliberately lags the maint series for +most of its patches, so that bugfix patches are not typically included in a +maintenance release until they've been tested for a while in a development +release. Occasionally, we'll merge an urgent bugfix into the release branch +before it gets merged into maint, but that's rare. -1.1. Details +If you're working on a bugfix for a bug that occurs in a particular version, +base your bugfix branch on the "maint" branch for the first _actively +developed_ series that has that bug. (Right now, that's 0.2.1.) If you're +working on a new feature, base it on the master branch. - Use tor_malloc, tor_free, tor_strdup, and tor_gettimeofday instead of their - generic equivalents. (They always succeed or exit.) - You can get a full list of the compatibility functions that Tor provides - by looking through src/common/util.h and src/common/compat.h. +How we log changes +------------------ - Use 'INLINE' instead of 'inline', so that we work properly on Windows. +When you do a commit that needs a ChangeLog entry, add a new file to +the "changes" toplevel subdirectory. It should have the format of a +one-entry changelog section from the current ChangeLog file, as in -1.2. Calling and naming conventions + o Major bugfixes: + - Fix a potential buffer overflow. Fixes bug 9999; bugfix on + 0.3.1.4-beta. - Whenever possible, functions should return -1 on error and 0 on success. +To write a changes file, first categorize the change. Some common categories +are: Minor bugfixes, Major bugfixes, Minor features, Major features, Code +simplifications and refactoring. Then say what the change does. If +it's a bugfix, mention what bug it fixes and when the bug was +introduced. To find out which Git tag the change was introduced in, +you can use "git describe --contains ". - For multi-word identifiers, use lowercase words combined with - underscores. (e.g., "multi_word_identifier"). Use ALL_CAPS for macros and - constants. +If at all possible, try to create this file in the same commit where +you are making the change. Please give it a distinctive name that no +other branch will use for the lifetime of your change. - Typenames should end with "_t". +When Roger goes to make a release, he will concatenate all the entries +in changes to make a draft changelog, and clear the directory. He'll +then edit the draft changelog into a nice readable format. - Function names should be prefixed with a module name or object name. (In - general, code to manipulate an object should be a module with the same - name as the object, so it's hard to tell which convention is used.) +What needs a changes file?:: + A not-exhaustive list: Anything that might change user-visible + behavior. Anything that changes internals, documentation, or the build + system enough that somebody could notice. Big or interesting code + rewrites. Anything about which somebody might plausibly wonder "when + did that happen, and/or why did we do that" 6 months down the line. - Functions that do things should have imperative-verb names - (e.g. buffer_clear, buffer_resize); functions that return booleans should - have predicate names (e.g. buffer_is_empty, buffer_needs_resizing). +Why use changes files instead of Git commit messages?:: + Git commit messages are written for developers, not users, and they + are nigh-impossible to revise after the fact. -1.3. What To Optimize +Why use changes files instead of entries in the ChangeLog?:: + Having every single commit touch the ChangeLog file tended to create + zillions of merge conflicts. - Don't optimize anything if it's not in the critical path. Right now, - the critical path seems to be AES, logging, and the network itself. - Feel free to do your own profiling to determine otherwise. +Useful tools +------------ -1.4. Log conventions +These aren't strictly necessary for hacking on Tor, but they can help track +down bugs. - http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#LogLevels +The buildbot +~~~~~~~~~~~~ - No error or warning messages should be expected during normal OR or OP - operation. +https://buildbot.vidalia-project.net/one_line_per_build - If a library function is currently called such that failure always - means ERR, then the library function should log WARN and let the caller - log ERR. +Dmalloc +~~~~~~~ - [XXX Proposed convention: every message of severity INFO or higher should - either (A) be intelligible to end-users who don't know the Tor source; or - (B) somehow inform the end-users that they aren't expected to understand - the message (perhaps with a string like "internal error"). Option (A) is - to be preferred to option (B). -NM] +The dmalloc library will keep track of memory allocation, so you can find out +if we're leaking memory, doing any double-frees, or so on. -1.5. Doxygen + dmalloc -l ~/dmalloc.log + (run the commands it tells you) + ./configure --with-dmalloc - We use the 'doxygen' utility to generate documentation from our - source code. Here's how to use it: +Valgrind +~~~~~~~~ + +valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor + +(Note that if you get a zillion openssl warnings, you will also need to +pass --undef-value-errors=no to valgrind, or rebuild your openssl +with -DPURIFY.) + +Running gcov for unit test coverage +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +----- + make clean + make CFLAGS='-g -fprofile-arcs -ftest-coverage' + ./src/test/test + cd src/common; gcov *.[ch] + cd ../or; gcov *.[ch] +----- + +Then, look at the .gcov files. '-' before a line means that the +compiler generated no code for that line. '######' means that the +line was never reached. Lines with numbers were called that number +of times. + +Profiling Tor with oprofile +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The oprofile tool runs (on Linux only!) to tell you what functions Tor is +spending its CPU time in, so we can identify berformance pottlenecks. + +Here are some basic instructions + + - Build tor with debugging symbols (you probably already have, unless + you messed with CFLAGS during the build process). + - Build all the libraries you care about with debugging symbols + (probably you only care about libssl, maybe zlib and Libevent). + - Copy this tor to a new directory + - Copy all the libraries it uses to that dir too (ldd ./tor will + tell you) + - Set LD_LIBRARY_PATH to include that dir. ldd ./tor should now + show you it's using the libs in that dir + - Run that tor + - Reset oprofiles counters/start it + * "opcontrol --reset; opcontrol --start", if Nick remembers right. + - After a while, have it dump the stats on tor and all the libs + in that dir you created. + * "opcontrol --dump;" + * "opreport -l that_dir/*" + - Profit + + +Coding conventions +------------------ + +Patch checklist +~~~~~~~~~~~~~~~ + +If possible, send your patch as one of these (in descending order of +preference) + + - A git branch we can pull from + - Patches generated by git format-patch + - A unified diff + +Did you remember... + + - To build your code while configured with --enable-gcc-warnings? + - To run "make check-spaces" on your code? + - To write unit tests, as possible? + - To base your code on the appropriate branch? + - To include a file in the "changes" directory as appropriate? + +Whitespace and C conformance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Invoke "make check-spaces" from time to time, so it can tell you about +deviations from our C whitespace style. Generally, we use: + + - Unix-style line endings + - K&R-style indentation + - No space before newlines + - A blank line at the end of each file + - Never more than one blank line in a row + - Always spaces, never tabs + - No more than 79-columns per line. + - Two spaces per indent. + - A space between control keywords and their corresponding paren + "if (x)", "while (x)", and "switch (x)", never "if(x)", "while(x)", or + "switch(x)". + - A space between anything and an open brace. + - No space between a function name and an opening paren. "puts(x)", not + "puts (x)". + - Function declarations at the start of the line. + +We try hard to build without warnings everywhere. In particular, if you're +using gcc, you should invoke the configure script with the option +"--enable-gcc-warnings". This will give a bunch of extra warning flags to +the compiler, and help us find divergences from our preferred C style. + +Getting emacs to edit Tor source properly +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Nick likes to put the following snippet in his .emacs file: + +----- + (add-hook 'c-mode-hook + (lambda () + (font-lock-mode 1) + (set-variable 'show-trailing-whitespace t) + + (let ((fname (expand-file-name (buffer-file-name)))) + (cond + ((string-match "^/home/nickm/src/libevent" fname) + (set-variable 'indent-tabs-mode t) + (set-variable 'c-basic-offset 4) + (set-variable 'tab-width 4)) + ((string-match "^/home/nickm/src/tor" fname) + (set-variable 'indent-tabs-mode nil) + (set-variable 'c-basic-offset 2)) + ((string-match "^/home/nickm/src/openssl" fname) + (set-variable 'indent-tabs-mode t) + (set-variable 'c-basic-offset 8) + (set-variable 'tab-width 8)) + )))) +----- + +You'll note that it defaults to showing all trailing whitespace. The "cond" +test detects whether the file is one of a few C free software projects that I +often edit, and sets up the indentation level and tab preferences to match +what they want. + +If you want to try this out, you'll need to change the filename regex +patterns to match where you keep your Tor files. + +If you use emacs for editing Tor and nothing else, you could always just say: + +----- + (add-hook 'c-mode-hook + (lambda () + (font-lock-mode 1) + (set-variable 'show-trailing-whitespace t) + (set-variable 'indent-tabs-mode nil) + (set-variable 'c-basic-offset 2))) +----- + +There is probably a better way to do this. No, we are probably not going +to clutter the files with emacs stuff. + + +Functions to use +~~~~~~~~~~~~~~~~ + +We have some wrapper functions like tor_malloc, tor_free, tor_strdup, and +tor_gettimeofday; use them instead of their generic equivalents. (They +always succeed or exit.) + +You can get a full list of the compatibility functions that Tor provides by +looking through src/common/util.h and src/common/compat.h. You can see the +available containers in src/common/containers.h. You should probably +familiarize yourself with these modules before you write too much code, or +else you'll wind up reinventing the wheel. + +Use 'INLINE' instead of 'inline', so that we work properly on Windows. + +Calling and naming conventions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Whenever possible, functions should return -1 on error and 0 on success. + +For multi-word identifiers, use lowercase words combined with +underscores. (e.g., "multi_word_identifier"). Use ALL_CAPS for macros and +constants. + +Typenames should end with "_t". + +Function names should be prefixed with a module name or object name. (In +general, code to manipulate an object should be a module with the same name +as the object, so it's hard to tell which convention is used.) + +Functions that do things should have imperative-verb names +(e.g. buffer_clear, buffer_resize); functions that return booleans should +have predicate names (e.g. buffer_is_empty, buffer_needs_resizing). + +If you find that you have four or more possible return code values, it's +probably time to create an enum. If you find that you are passing three or +more flags to a function, it's probably time to create a flags argument that +takes a bitfield. + +What To Optimize +~~~~~~~~~~~~~~~~ + +Don't optimize anything if it's not in the critical path. Right now, the +critical path seems to be AES, logging, and the network itself. Feel free to +do your own profiling to determine otherwise. + +Log conventions +~~~~~~~~~~~~~~~ + +https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ#LogLevels + +No error or warning messages should be expected during normal OR or OP +operation. + +If a library function is currently called such that failure always means ERR, +then the library function should log WARN and let the caller log ERR. + +[XXX Proposed convention: every message of severity INFO or higher should +either (A) be intelligible to end-users who don't know the Tor source; or (B) +somehow inform the end-users that they aren't expected to understand the +message (perhaps with a string like "internal error"). Option (A) is to be +preferred to option (B). -NM] + +Doxygen +~~~~~~~~ + +We use the 'doxygen' utility to generate documentation from our +source code. Here's how to use it: 1. Begin every file that should be documented with /** * \file filename.c - * \brief Short desccription of the file. + * \brief Short description of the file. **/ (Doxygen will recognize any comment beginning with /** as special.) @@ -144,3 +373,36 @@ 6. See the Doxygen manual for more information; this summary just scratches the surface. +Doxygen comment conventions +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Say what functions do as a series of one or more imperative sentences, as +though you were telling somebody how to be the function. In other words, DO +NOT say: + + /** The strtol function parses a number. + * + * nptr -- the string to parse. It can include whitespace. + * endptr -- a string pointer to hold the first thing that is not part + * of the number, if present. + * base -- the numeric base. + * returns: the resulting number. + */ + long strtol(const char *nptr, char **nptr, int base); + +Instead, please DO say: + + /** Parse a number in radix base from the string nptr, + * and return the result. Skip all leading whitespace. If + * endptr is not NULL, set *endptr to the first character + * after the number parsed. + **/ + long strtol(const char *nptr, char **nptr, int base); + +Doxygen comments are the contract in our abstraction-by-contract world: if +the functions that call your function rely on it doing something, then your +function should mention that it does that something in the documentation. If +you rely on a function doing something beyond what is in its documentation, +then you should watch out, or it might do something else later. + + diff -Nru tor-0.2.0.34/doc/Makefile.am tor-0.2.2.16-alpha/doc/Makefile.am --- tor-0.2.0.34/doc/Makefile.am 2008-02-26 19:56:33.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/Makefile.am 2010-08-13 22:11:20.000000000 +0000 @@ -1,31 +1,83 @@ -EXTRA_DIST = website img HACKING \ - tor-resolve.1 tor-gencert.1 \ +# We use a two-step process to generate documentation from asciidoc files. +# +# First, we use asciidoc/a2x to process the asciidoc files into .1.in and +# .html.in files (see the asciidoc-helper.sh script). These are the same as +# the regular .1 and .html files, except that they still have some autoconf +# variables set in them. +# +# Second, we use config.status to turn .1.in files into .1 files and +# .html.in files into .html files. +# +# We do the steps in this order so that we can ship the .*.in files as +# part of the source distribution, so that people without asciidoc can +# just use the .1 and .html files. + +if USE_ASCIIDOC +asciidoc_files = tor tor-gencert tor-resolve torify +html_in = $(asciidoc_files:=.html.in) +man_in = $(asciidoc_files:=.1.in) +txt_in = $(asciidoc_files:=.1.txt) +nodist_man_MANS = $(asciidoc_files:=.1) +doc_DATA = $(asciidoc_files:=.html) +else +asciidoc_files = +html_in = +man_in = +txt_in = +nodist_man_MANS = +doc_DATA = +endif + +EXTRA_DIST = HACKING asciidoc-helper.sh \ + $(html_in) $(man_in) $(txt_in) \ tor-osx-dmg-creation.txt tor-rpm-creation.txt \ tor-win32-mingw-creation.txt -man_MANS = tor.1 tor-resolve.1 tor-gencert.1 +docdir = @docdir@ -SUBDIRS = design-paper spec +asciidoc_product = $(nodist_man_MANS) $(doc_DATA) -DIST_SUBDIRS = design-paper spec +SUBDIRS = spec -website: ../../website/docs/ - rm -rf website - mkdir website - if test -d $(srcdir)/../../website ; then \ - cd $(srcdir)/../../website && $(MAKE); \ - fi - if test -d $(srcdir)/../../website ; then \ - cp $(srcdir)/../../website/docs/tor-*.html.* \ - $(srcdir)/../../website/stylesheet.css website; \ +DIST_SUBDIRS = spec + +# Generate the html documentation from asciidoc, but don't do +# machine-specific replacements yet +$(html_in) : + $(top_srcdir)/doc/asciidoc-helper.sh html @ASCIIDOC@ $(top_srcdir)/doc/$@ + +tor.html.in : tor.1.txt +torify.html.in : torify.1.txt +tor-gencert.html.in : tor-gencert.1.txt +tor-resolve.html.in : tor-resolve.1.txt + +# Generate the manpage from asciidoc, but don't do +# machine-specific replacements yet +$(man_in) : + $(top_srcdir)/doc/asciidoc-helper.sh man @A2X@ $(top_srcdir)/doc/$@ + +tor.1.in : tor.1.txt +torify.1.in : torify.1.txt +tor-gencert.1.in : tor-gencert.1.txt +tor-resolve.1.in : tor-resolve.1.txt + +# use ../config.status to swap all machine-specific magic strings +# in the asciidoc with their replacements. +$(asciidoc_product) : + if test -e $(top_srcdir)/doc/$@.in && ! test -e ./$@.in ; then \ + cp $(top_srcdir)/doc/$@.in .; \ fi -img: ../../website/img/ - rm -rf img - mkdir img -# if test -d $(srcdir)/../../website/img; then \ -# cp $(srcdir)/../../website/img/*.png \ -# $(srcdir)/../../website/img/*.jpg img; \ -# fi + ../config.status --file=$@; + +tor.1 : tor.1.in +torify.1 : torify.1.in +tor-gencert.1 : tor-gencert.1.in +tor-resolve.1 : tor-resolve.1.in +tor.html : tor.html.in +torify.html : torify.html.in +tor-gencert.html : tor-gencert.html.in +tor-resolve.html : tor-resolve.html.in -.PHONY: website img +CLEANFILES = $(asciidoc_product) config.log +DISTCLEANFILES = $(html_in) $(man_in) diff -Nru tor-0.2.0.34/doc/Makefile.in tor-0.2.2.16-alpha/doc/Makefile.in --- tor-0.2.0.34/doc/Makefile.in 2009-02-09 03:31:01.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/Makefile.in 2010-09-17 06:08:40.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,6 +13,21 @@ # PARTICULAR PURPOSE. @SET_MAKE@ + +# We use a two-step process to generate documentation from asciidoc files. +# +# First, we use asciidoc/a2x to process the asciidoc files into .1.in and +# .html.in files (see the asciidoc-helper.sh script). These are the same as +# the regular .1 and .html files, except that they still have some autoconf +# variables set in them. +# +# Second, we use config.status to turn .1.in files into .1 files and +# .html.in files into .html files. +# +# We do the steps in this order so that we can ship the .*.in files as +# part of the source distribution, so that people without asciidoc can +# just use the .1 and .html files. + VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -32,8 +47,7 @@ build_triplet = @build@ host_triplet = @host@ subdir = doc -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/tor.1.in TODO +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in @@ -41,7 +55,7 @@ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/orconfig.h -CONFIG_CLEAN_FILES = tor.1 +CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ @@ -52,16 +66,26 @@ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive man1dir = $(mandir)/man1 -am__installdirs = "$(DESTDIR)$(man1dir)" +am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)" NROFF = nroff -MANS = $(man_MANS) +MANS = $(nodist_man_MANS) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +docDATA_INSTALL = $(INSTALL_DATA) +DATA = $(doc_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -96,6 +120,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -104,7 +129,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -115,8 +142,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -167,14 +197,28 @@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -EXTRA_DIST = website img HACKING \ - tor-resolve.1 tor-gencert.1 \ +@USE_ASCIIDOC_FALSE@asciidoc_files = +@USE_ASCIIDOC_TRUE@asciidoc_files = tor tor-gencert tor-resolve torify +@USE_ASCIIDOC_FALSE@html_in = +@USE_ASCIIDOC_TRUE@html_in = $(asciidoc_files:=.html.in) +@USE_ASCIIDOC_FALSE@man_in = +@USE_ASCIIDOC_TRUE@man_in = $(asciidoc_files:=.1.in) +@USE_ASCIIDOC_FALSE@txt_in = +@USE_ASCIIDOC_TRUE@txt_in = $(asciidoc_files:=.1.txt) +@USE_ASCIIDOC_FALSE@nodist_man_MANS = +@USE_ASCIIDOC_TRUE@nodist_man_MANS = $(asciidoc_files:=.1) +@USE_ASCIIDOC_FALSE@doc_DATA = +@USE_ASCIIDOC_TRUE@doc_DATA = $(asciidoc_files:=.html) +EXTRA_DIST = HACKING asciidoc-helper.sh \ + $(html_in) $(man_in) $(txt_in) \ tor-osx-dmg-creation.txt tor-rpm-creation.txt \ tor-win32-mingw-creation.txt -man_MANS = tor.1 tor-resolve.1 tor-gencert.1 -SUBDIRS = design-paper spec -DIST_SUBDIRS = design-paper spec +asciidoc_product = $(nodist_man_MANS) $(doc_DATA) +SUBDIRS = spec +DIST_SUBDIRS = spec +CLEANFILES = $(asciidoc_product) config.log +DISTCLEANFILES = $(html_in) $(man_in) all: all-recursive .SUFFIXES: @@ -207,8 +251,6 @@ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -tor.1: $(top_builddir)/config.status $(srcdir)/tor.1.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @@ -254,6 +296,23 @@ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done +install-docDATA: $(doc_DATA) + @$(NORMAL_INSTALL) + test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)" + @list='$(doc_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(docDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docdir)/$$f'"; \ + $(docDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docdir)/$$f"; \ + done + +uninstall-docDATA: + @$(NORMAL_UNINSTALL) + @list='$(doc_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(docdir)/$$f'"; \ + rm -f "$(DESTDIR)$(docdir)/$$f"; \ + done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. @@ -330,8 +389,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS @@ -356,8 +415,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ @@ -367,13 +426,12 @@ CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique @@ -431,10 +489,10 @@ done check-am: all-am check: check-recursive -all-am: Makefile $(MANS) +all-am: Makefile $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: - for dir in "$(DESTDIR)$(man1dir)"; do \ + for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive @@ -454,9 +512,11 @@ mostlyclean-generic: clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -479,7 +539,7 @@ info-am: -install-data-am: install-man +install-data-am: install-docDATA install-man install-dvi: install-dvi-recursive @@ -513,7 +573,7 @@ ps-am: -uninstall-am: uninstall-man +uninstall-am: uninstall-docDATA uninstall-man uninstall-man: uninstall-man1 @@ -524,36 +584,53 @@ all all-am check check-am clean clean-generic ctags \ ctags-recursive distclean distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ - install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-man1 install-pdf install-pdf-am install-ps \ + install-am install-data install-data-am install-docDATA \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ - uninstall-man uninstall-man1 + uninstall-docDATA uninstall-man uninstall-man1 -website: ../../website/docs/ - rm -rf website - mkdir website - if test -d $(srcdir)/../../website ; then \ - cd $(srcdir)/../../website && $(MAKE); \ - fi - if test -d $(srcdir)/../../website ; then \ - cp $(srcdir)/../../website/docs/tor-*.html.* \ - $(srcdir)/../../website/stylesheet.css website; \ +# Generate the html documentation from asciidoc, but don't do +# machine-specific replacements yet +$(html_in) : + $(top_srcdir)/doc/asciidoc-helper.sh html @ASCIIDOC@ $(top_srcdir)/doc/$@ + +tor.html.in : tor.1.txt +torify.html.in : torify.1.txt +tor-gencert.html.in : tor-gencert.1.txt +tor-resolve.html.in : tor-resolve.1.txt + +# Generate the manpage from asciidoc, but don't do +# machine-specific replacements yet +$(man_in) : + $(top_srcdir)/doc/asciidoc-helper.sh man @A2X@ $(top_srcdir)/doc/$@ + +tor.1.in : tor.1.txt +torify.1.in : torify.1.txt +tor-gencert.1.in : tor-gencert.1.txt +tor-resolve.1.in : tor-resolve.1.txt + +# use ../config.status to swap all machine-specific magic strings +# in the asciidoc with their replacements. +$(asciidoc_product) : + if test -e $(top_srcdir)/doc/$@.in && ! test -e ./$@.in ; then \ + cp $(top_srcdir)/doc/$@.in .; \ fi -img: ../../website/img/ - rm -rf img - mkdir img -# if test -d $(srcdir)/../../website/img; then \ -# cp $(srcdir)/../../website/img/*.png \ -# $(srcdir)/../../website/img/*.jpg img; \ -# fi + ../config.status --file=$@; -.PHONY: website img +tor.1 : tor.1.in +torify.1 : torify.1.in +tor-gencert.1 : tor-gencert.1.in +tor-resolve.1 : tor-resolve.1.in +tor.html : tor.html.in +torify.html : torify.html.in +tor-gencert.html : tor-gencert.html.in +tor-resolve.html : tor-resolve.html.in # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff -Nru tor-0.2.0.34/doc/spec/address-spec.txt tor-0.2.2.16-alpha/doc/spec/address-spec.txt --- tor-0.2.0.34/doc/spec/address-spec.txt 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/spec/address-spec.txt 2009-11-17 20:37:02.000000000 +0000 @@ -1,14 +1,14 @@ -$Id: address-spec.txt 12267 2007-10-29 01:08:22Z phobos $ Special Hostnames in Tor Nick Mathewson 1. Overview - Most of the time, Tor treats user-specified hostnames as opaque: When the - user connects to www.torproject.org, Tor picks an exit node and uses that node to - connect to "www.torproject.org". Some hostnames, however, can be used to override - Tor's default behavior and circuit-building rules. + Most of the time, Tor treats user-specified hostnames as opaque: When + the user connects to www.torproject.org, Tor picks an exit node and uses + that node to connect to "www.torproject.org". Some hostnames, however, + can be used to override Tor's default behavior and circuit-building + rules. These hostnames can be passed to Tor as the address part of a SOCKS4a or SOCKS5 request. If the application is connected to Tor using an IP-only @@ -33,10 +33,13 @@ "www.google.com.foo.exit=64.233.161.99.foo.exit" to speed subsequent lookups. + The .exit notation is disabled by default as of Tor 0.2.2.1-alpha, due + to potential application-level attacks. + EXAMPLES: www.example.com.exampletornode.exit - Connect to www.example.com from the node called "exampletornode." + Connect to www.example.com from the node called "exampletornode". exampletornode.exit @@ -53,15 +56,3 @@ When Tor sees an address in this format, it tries to look up and connect to the specified hidden service. See rend-spec.txt for full details. -4. .noconnect - - SYNTAX: [string].noconnect - - When Tor sees an address in this format, it immediately closes the - connection without attaching it to any circuit. This is useful for - controllers that want to test whether a given application is indeed using - the same instance of Tor that they're controlling. - -5. [XXX Is there a ".virtual" address that we expose too, or is that -just intended to be internal? -RD] - diff -Nru tor-0.2.0.34/doc/spec/bridges-spec.txt tor-0.2.2.16-alpha/doc/spec/bridges-spec.txt --- tor-0.2.0.34/doc/spec/bridges-spec.txt 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/spec/bridges-spec.txt 2009-11-17 20:37:02.000000000 +0000 @@ -0,0 +1,249 @@ + + Tor bridges specification + +0. Preface + + This document describes the design decisions around support for bridge + users, bridge relays, and bridge authorities. It acts as an overview + of the bridge design and deployment for developers, and it also tries + to point out limitations in the current design and implementation. + + For more details on what all of these mean, look at blocking.tex in + /doc/design-paper/ + +1. Bridge relays + + Bridge relays are just like normal Tor relays except they don't publish + their server descriptors to the main directory authorities. + +1.1. PublishServerDescriptor + + To configure your relay to be a bridge relay, just add + BridgeRelay 1 + PublishServerDescriptor bridge + to your torrc. This will cause your relay to publish its descriptor + to the bridge authorities rather than to the default authorities. + + Alternatively, you can say + BridgeRelay 1 + PublishServerDescriptor 0 + which will cause your relay to not publish anywhere. This could be + useful for private bridges. + +1.2. Recommendations. + + Bridge relays should use an exit policy of "reject *:*". This is + because they only need to relay traffic between the bridge users + and the rest of the Tor network, so there's no need to let people + exit directly from them. + + We invented the RelayBandwidth* options for this situation: Tor clients + who want to allow relaying too. See proposal 111 for details. Relay + operators should feel free to rate-limit their relayed traffic. + +1.3. Implementation note. + + Vidalia 0.0.15 has turned its "Relay" settings page into a tri-state + "Don't relay" / "Relay for the Tor network" / "Help censored users". + + If you click the third choice, it forces your exit policy to reject *:*. + + If all the bridges end up on port 9001, that's not so good. On the + other hand, putting the bridges on a low-numbered port in the Unix + world requires jumping through extra hoops. The current compromise is + that Vidalia makes the ORPort default to 443 on Windows, and 9001 on + other platforms. + + At the bottom of the relay config settings window, Vidalia displays + the bridge identifier to the operator (see Section 3.1) so he can pass + it on to bridge users. + +2. Bridge authorities. + + Bridge authorities are like normal v3 directory authorities, except + they don't create their own network-status documents or votes. So if + you ask a bridge authority for a network-status document or consensus, + they behave like a directory mirror: they give you one from one of + the main authorities. But if you ask the bridge authority for the + descriptor corresponding to a particular identity fingerprint, it will + happily give you the latest descriptor for that fingerprint. + + To become a bridge authority, add these lines to your torrc: + AuthoritativeDirectory 1 + BridgeAuthoritativeDir 1 + + Right now there's one bridge authority, running on the Tonga relay. + +2.1. Exporting bridge-purpose descriptors + + We've added a new purpose for server descriptors: the "bridge" + purpose. With the new router-descriptors file format that includes + annotations, it's easy to look through it and find the bridge-purpose + descriptors. + + Currently we export the bridge descriptors from Tonga to the + BridgeDB server, so it can give them out according to the policies + in blocking.pdf. + +2.2. Reachability/uptime testing + + Right now the bridge authorities do active reachability testing of + bridges, so we know which ones to recommend for users. + + But in the design document, we suggested that bridges should publish + anonymously (i.e. via Tor) to the bridge authority, so somebody watching + the bridge authority can't just enumerate all the bridges. But if we're + doing active measurement, the game is up. Perhaps we should back off on + this goal, or perhaps we should do our active measurement anonymously? + + Answering this issue is scheduled for 0.2.1.x. + +2.3. Future work: migrating to multiple bridge authorities + + Having only one bridge authority is both a trust bottleneck (if you + break into one place you learn about every single bridge we've got) + and a robustness bottleneck (when it's down, bridge users become sad). + + Right now if we put up a second bridge authority, all the bridges would + publish to it, and (assuming the code works) bridge users would query + a random bridge authority. This resolves the robustness bottleneck, + but makes the trust bottleneck even worse. + + In 0.2.2.x and later we should think about better ways to have multiple + bridge authorities. + +3. Bridge users. + + Bridge users are like ordinary Tor users except they use encrypted + directory connections by default, and they use bridge relays as both + entry guards (their first hop) and directory guards (the source of + all their directory information). + + To become a bridge user, add the following line to your torrc: + UseBridges 1 + + and then add at least one "Bridge" line to your torrc based on the + format below. + +3.1. Format of the bridge identifier. + + The canonical format for a bridge identifier contains an IP address, + an ORPort, and an identity fingerprint: + bridge 128.31.0.34:9009 4C17 FB53 2E20 B2A8 AC19 9441 ECD2 B017 7B39 E4B1 + + However, the identity fingerprint can be left out, in which case the + bridge user will connect to that relay and use it as a bridge regardless + of what identity key it presents: + bridge 128.31.0.34:9009 + This might be useful for cases where only short bridge identifiers + can be communicated to bridge users. + + In a future version we may also support bridge identifiers that are + only a key fingerprint: + bridge 4C17 FB53 2E20 B2A8 AC19 9441 ECD2 B017 7B39 E4B1 + and the bridge user can fetch the latest descriptor from the bridge + authority (see Section 3.4). + +3.2. Bridges as entry guards + + For now, bridge users add their bridge relays to their list of "entry + guards" (see path-spec.txt for background on entry guards). They are + managed by the entry guard algorithms exactly as if they were a normal + entry guard -- their keys and timing get cached in the "state" file, + etc. This means that when the Tor user starts up with "UseBridges" + disabled, he will skip past the bridge entries since they won't be + listed as up and usable in his networkstatus consensus. But to be clear, + the "entry_guards" list doesn't currently distinguish guards by purpose. + + Internally, each bridge user keeps a smartlist of "bridge_info_t" + that reflects the "bridge" lines from his torrc along with a download + schedule (see Section 3.5 below). When he starts Tor, he attempts + to fetch a descriptor for each configured bridge (see Section 3.4 + below). When he succeeds at getting a descriptor for one of the bridges + in his list, he adds it directly to the entry guard list using the + normal add_an_entry_guard() interface. Once a bridge descriptor has + been added, should_delay_dir_fetches() will stop delaying further + directory fetches, and the user begins to bootstrap his directory + information from that bridge (see Section 3.3). + + Currently bridge users cache their bridge descriptors to the + "cached-descriptors" file (annotated with purpose "bridge"), but + they don't make any attempt to reuse descriptors they find in this + file. The theory is that either the bridge is available now, in which + case you can get a fresh descriptor, or it's not, in which case an + old descriptor won't do you much good. + + We could disable writing out the bridge lines to the state file, if + we think this is a problem. + + As an exception, if we get an application request when we have one + or more bridge descriptors but we believe none of them are running, + we mark them all as running again. This is similar to the exception + already in place to help long-idle Tor clients realize they should + fetch fresh directory information rather than just refuse requests. + +3.3. Bridges as directory guards + + In addition to using bridges as the first hop in their circuits, bridge + users also use them to fetch directory updates. Other than initial + bootstrapping to find a working bridge descriptor (see Section 3.4 + below), all further non-anonymized directory fetches will be redirected + to the bridge. + + This means that bridge relays need to have cached answers for all + questions the bridge user might ask. This makes the upgrade path + tricky --- for example, if we migrate to a v4 directory design, the + bridge user would need to keep using v3 so long as his bridge relays + only knew how to answer v3 queries. + + In a future design, for cases where the user has enough information + to build circuits yet the chosen bridge doesn't know how to answer a + given query, we might teach bridge users to make an anonymized request + to a more suitable directory server. + +3.4. How bridge users get their bridge descriptor + + Bridge users can fetch bridge descriptors in two ways: by going directly + to the bridge and asking for "/tor/server/authority", or by going to + the bridge authority and asking for "/tor/server/fp/ID". By default, + they will only try the direct queries. If the user sets + UpdateBridgesFromAuthority 1 + in his config file, then he will try querying the bridge authority + first for bridges where he knows a digest (if he only knows an IP + address and ORPort, then his only option is a direct query). + + If the user has at least one working bridge, then he will do further + queries to the bridge authority through a full three-hop Tor circuit. + But when bootstrapping, he will make a direct begin_dir-style connection + to the bridge authority. + + As of Tor 0.2.0.10-alpha, if the user attempts to fetch a descriptor + from the bridge authority and it returns a 404 not found, the user + will automatically fall back to trying a direct query. Therefore it is + recommended that bridge users always set UpdateBridgesFromAuthority, + since at worst it will delay their fetches a little bit and notify + the bridge authority of the identity fingerprint (but not location) + of their intended bridges. + +3.5. Bridge descriptor retry schedule + + Bridge users try to fetch a descriptor for each bridge (using the + steps in Section 3.4 above) on startup. Whenever they receive a + bridge descriptor, they reschedule a new descriptor download for 1 + hour from then. + + If on the other hand it fails, they try again after 15 minutes for the + first attempt, after 15 minutes for the second attempt, and after 60 + minutes for subsequent attempts. + + In 0.2.2.x we should come up with some smarter retry schedules. + +3.6. Implementation note. + + Vidalia 0.1.0 has a new checkbox in its Network config window called + "My ISP blocks connections to the Tor network." Users who click that + box change their configuration to: + UseBridges 1 + UpdateBridgesFromAuthority 1 + and should add at least one bridge identifier. + diff -Nru tor-0.2.0.34/doc/spec/control-spec.txt tor-0.2.2.16-alpha/doc/spec/control-spec.txt --- tor-0.2.0.34/doc/spec/control-spec.txt 2008-05-28 04:46:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/spec/control-spec.txt 2010-08-18 23:04:46.000000000 +0000 @@ -1,4 +1,3 @@ -$Id: control-spec.txt 14755 2008-05-27 21:02:49Z nickm $ TC: A Tor control protocol (Version 1) @@ -16,6 +15,11 @@ versions 0.1.0.x; the protocol in this document only works with Tor versions in the 0.1.1.x series and later.) + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL + NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + RFC 2119. + 1. Protocol outline TC is a bidirectional message-based protocol. It assumes an underlying @@ -88,6 +92,10 @@ 2.4. General-use tokens + ; CRLF means, "the ASCII Carriage Return character (decimal value 13) + ; followed by the ASCII Linefeed character (decimal value 10)." + CRLF = CR LF + ; Identifiers for servers. ServerID = Nickname / Fingerprint @@ -96,7 +104,8 @@ Fingerprint = "$" 40*HEXDIG ; A "=" indicates that the given nickname is canonical; a "~" indicates - ; that the given nickname is not canonical. + ; that the given nickname is not canonical. If no nickname is given at + ; all, Tor does not even have a guess for what this router calls itself. LongName = Fingerprint [ ( "=" / "~" ) Nickname ] ; How a controller tells Tor about a particular OR. There are four @@ -161,7 +170,7 @@ SETCONF command arrives containing a single ORBindAddress value, the new command's value replaces the two old values. - Somtimes it is not possible to change configuration options solely by + Sometimes it is not possible to change configuration options solely by issuing a series of SETCONF commands, because the value of one of the configuration options depends on the value of another which has not yet been set. Such situations can be overcome by setting multiple configuration @@ -218,7 +227,8 @@ EventCode = "CIRC" / "STREAM" / "ORCONN" / "BW" / "DEBUG" / "INFO" / "NOTICE" / "WARN" / "ERR" / "NEWDESC" / "ADDRMAP" / "AUTHDIR_NEWDESCS" / "DESCCHANGED" / "STATUS_GENERAL" / - "STATUS_CLIENT" / "STATUS_SERVER" / "GUARD" / "NS" / "STREAM_BW" + "STATUS_CLIENT" / "STATUS_SERVER" / "GUARD" / "NS" / "STREAM_BW" / + "CLIENTS_SEEN" / "NEWCONSENSUS" / "BUILDTIMEOUT_SET" Any events *not* listed in the SETEVENTS line are turned off; thus, sending SETEVENTS with an empty body turns off all event reporting. @@ -253,6 +263,10 @@ command, or sends PROTOCOLINFO more than once, Tor sends an error reply and closes the connection. + To prevent some cross-protocol attacks, the AUTHENTICATE command is still + required even if all authentication methods in Tor are disabled. In this + case, the controller should just send "AUTHENTICATE" CRLF. + (Versions of Tor before 0.1.2.16 and 0.2.0.4-alpha did not close the connection after an authentication failure.) @@ -265,6 +279,9 @@ returns "250 OK" if successful, or "551 Unable to write configuration to disk" if it can't write the file or some other error occurs. + See also the "getinfo config-text" command, if the controller wants + to write the torrc file itself. + 3.7. SIGNAL Sent from the client to the server. The syntax is: @@ -373,6 +390,10 @@ "config-file" -- The location of Tor's configuration file ("torrc"). + "config-text" -- The contents that Tor would write if you send it + a SAVECONF command, so the controller can write the file to + disk itself. [First implemented in 0.2.2.7-alpha.] + ["exit-policy/prepend" -- The default exit policy lines that Tor will *prepend* to the ExitPolicy config option. -- Never implemented. Useful?] @@ -497,7 +518,7 @@ start and the rest of the interval respectively. The 'interval-start' and 'interval-end' fields are the borders of the current interval; the 'interval-wake' field is the time within the current interval (if any) - where we plan[ned] to start being active. + where we plan[ned] to start being active. The times are GMT. "config/names" A series of lines listing the available configuration options. Each is @@ -524,9 +545,14 @@ A space-separated list of all the events supported by this version of Tor's USEFEATURE. + "ip-to-country/*" + Maps IP addresses to 2-letter country codes. For example, + "GETINFO ip-to-country/18.0.0.1" should give "US". + "next-circuit/IP:port" XXX todo. + "dir/status-vote/current/consensus" [added in Tor 0.2.1.6-alpha] "dir/status/authority" "dir/status/fp/" "dir/status/fp/++" @@ -547,23 +573,36 @@ "status/circuit-established" "status/enough-dir-info" "status/good-server-descriptor" + "status/accepted-server-descriptor" "status/..." These provide the current internal Tor values for various Tor states. See Section 4.1.10 for explanations. (Only a few of the status events are available as getinfo's currently. Let us know if you want more exposed.) - "status/reachability/or" + "status/reachability-succeeded/or" 0 or 1, depending on whether we've found our ORPort reachable. - "status/reachability/dir" + "status/reachability-succeeded/dir" 0 or 1, depending on whether we've found our DirPort reachable. - "status/reachability" + "status/reachability-succeeded" "OR=" ("0"/"1") SP "DIR=" ("0"/"1") - Combines status/reachability/*; controllers MUST ignore unrecognized - elements in this entry. - - "status/version/recommended" -- List of currently recommended versions - "status/version/current" -- Status of the current version. One of: - new, old, unrecommended, recommended, new in series, obsolete. + Combines status/reachability-succeeded/*; controllers MUST ignore + unrecognized elements in this entry. + "status/bootstrap-phase" + Returns the most recent bootstrap phase status event + sent. Specifically, it returns a string starting with either + "NOTICE BOOTSTRAP ..." or "WARN BOOTSTRAP ...". Controllers should + use this getinfo when they connect or attach to Tor to learn its + current bootstrap state. + "status/version/recommended" + List of currently recommended versions. + "status/version/current" + Status of the current version. One of: new, old, unrecommended, + recommended, new in series, obsolete, unknown. + "status/clients-seen" + A summary of which countries we've seen clients from recently, + formatted the same as the CLIENTS_SEEN status event described in + Section 4.1.14. This GETINFO option is currently available only + for bridge relays. Examples: C: GETINFO version desc/name/moria1 @@ -576,15 +615,20 @@ 3.10. EXTENDCIRCUIT Sent from the client to the server. The format is: - "EXTENDCIRCUIT" SP CircuitID SP - ServerSpec *("," ServerSpec) - [SP "purpose=" Purpose] CRLF + "EXTENDCIRCUIT" SP CircuitID + [SP ServerSpec *("," ServerSpec) + SP "purpose=" Purpose] CRLF This request takes one of two forms: either the CircuitID is zero, in - which case it is a request for the server to build a new circuit according - to the specified path, or the CircuitID is nonzero, in which case it is a - request for the server to extend an existing circuit with that ID according - to the specified path. + which case it is a request for the server to build a new circuit, + or the CircuitID is nonzero, in which case it is a request for the + server to extend an existing circuit with that ID according to the + specified path. + + If the CircuitID is 0, the controller has the option of providing + a path for Tor to use to build the circuit. If it does not provide + a path, Tor will select one automatically from high capacity nodes + according to path-spec.txt. If CircuitID is 0 and "purpose=" is specified, then the circuit's purpose is set. Two choices are recognized: "general" and @@ -659,7 +703,7 @@ This message informs the server about a new descriptor. If Purpose is specified, it must be either "general", "controller", or "bridge", - else we return a 552 error. + else we return a 552 error. The default is "general". If Cache is specified, it must be either "no" or "yes", else we return a 552 error. If Cache is not specified, Tor will decide for @@ -669,11 +713,11 @@ The descriptor, when parsed, must contain a number of well-specified fields, including fields for its nickname and identity. - If there is an error in parsing the descriptor, the server must send a "554 - Invalid descriptor" reply. If the descriptor is well-formed but the server - chooses not to add it, it must reply with a 251 message whose body explains - why the server was not added. If the descriptor is added, Tor replies with - "250 OK". + If there is an error in parsing the descriptor, the server must send a + "554 Invalid descriptor" reply. If the descriptor is well-formed but + the server chooses not to add it, it must reply with a 251 message + whose body explains why the server was not added. If the descriptor + is added, Tor replies with "250 OK". 3.15. REDIRECTSTREAM @@ -751,9 +795,8 @@ Same as passing 'EXTENDED' to SETEVENTS; this is the preferred way to request the extended event syntax. - This will not be always-enabled until at least two stable releases - after 0.1.2.3-alpha, the release where it was first used for - anything. + This feature was first used in 0.1.2.3-alpha. It is always-on in + Tor 0.2.2.1-alpha and later. VERBOSE_NAMES @@ -764,8 +807,9 @@ LongName format includes a Fingerprint, an indication of Named status, and a Nickname (if one is known). - This will not be always-enabled until at least two stable releases - after 0.1.2.2-alpha, the release where it was first available. + This will not be always-enabled until at least two stable + releases after 0.1.2.2-alpha, the release where it was first + available. It is always-on in Tor 0.2.2.1-alpha and later. 3.20. RESOLVE @@ -1005,7 +1049,7 @@ Reason = "MISC" / "RESOLVEFAILED" / "CONNECTREFUSED" / "EXITPOLICY" / "DESTROY" / "DONE" / "TIMEOUT" / - "HIBERNATING" / "INTERNAL"/ "RESOURCELIMIT" / + "NOROUTE" / "HIBERNATING" / "INTERNAL"/ "RESOURCELIMIT" / "CONNRESET" / "TORPROTOCOL" / "NOTDIRECTORY" / "END" The "REASON" field is provided only for FAILED, CLOSED, and DETACHED @@ -1013,9 +1057,9 @@ accept reasons not listed above. Reasons are as given in tor-spec.txt, except for: - END (We received a RELAY_END cell from the other side of thise + END (We received a RELAY_END cell from the other side of this stream.) - [XXXX document more.] + [XXXX document more. -NM] The "REMOTE_REASON" field is provided only when we receive a RELAY_END cell, and only if extended events are enabled. It contains the actual @@ -1064,7 +1108,7 @@ Reason = "MISC" / "DONE" / "CONNECTREFUSED" / "IDENTITY" / "CONNECTRESET" / "TIMEOUT" / "NOROUTE" / - "IOERROR" + "IOERROR" / "RESOURCELIMIT" NumCircuits counts both established and pending circuits. @@ -1077,9 +1121,9 @@ Type = "DIR" / "OR" / "EXIT" / "APP" / ... Num = 1*DIGIT - BytesRead and BytesWritten are the totals. In Tor 0.1.x.y-alpha - and later, we also include a breakdown of the connection types - that used bandwidth this second (not implemented yet). + BytesRead and BytesWritten are the totals. [In a future Tor version, + we may also include a breakdown of the connection types that used + bandwidth this second (not implemented yet).] 4.1.5. Log messages @@ -1168,6 +1212,10 @@ controllers. These recommendations are suggestions only; no controller is required to implement them. + Compatibility note: versions of Tor before 0.2.0.22-rc incorrectly + generated "STATUS_SERVER" as "STATUS_SEVER". To be compatible with those + versions, tools should accept both. + Actions for STATUS_GENERAL events can be as follows: CLOCK_JUMPED @@ -1228,20 +1276,26 @@ CLOCK_SKEW SKEW="+" / "-" SECONDS MIN_SKEW="+" / "-" SECONDS. - SOURCE="DIRSERV:IP:Port" / "NETWORKSTATUS:IP:PORT" / "CONSENSUS" + SOURCE="DIRSERV:" IP ":" Port / + "NETWORKSTATUS:" IP ":" Port / + "OR:" IP ":" Port / + "CONSENSUS" If "SKEW" is present, it's an estimate of how far we are from the time declared in the source. (In other words, if we're an hour in the past, the value is -3600.) "MIN_SKEW" is present, it's a lower bound. If the source is a DIRSERV, we got the current time from a connection to a dirserver. If the source is a NETWORKSTATUS, we decided we're skewed because we got a v2 networkstatus from far in - the future. If the source is CONSENSUS, we decided we're skewed - because we got a networkstatus consensus from the future. - - {Controllers may want to warn the user if the skew is high, or if - multiple skew messages appear at severity WARN. Controllers - shouldn't blindly adjust the clock, since the more accurate source - of skew info (DIRSERV) is currently unauthenticated.} + the future. If the source is OR, the skew comes from a NETINFO + cell from a connection to another relay. If the source is + CONSENSUS, we decided we're skewed because we got a networkstatus + consensus from the future. + + {Tor should send this message to controllers when it thinks the + skew is so high that it will interfere with proper Tor operation. + Controllers shouldn't blindly adjust the clock, since the more + accurate source of skew info (DIRSERV) is currently + unauthenticated.} BAD_LIBEVENT "METHOD=" libevent method @@ -1268,8 +1322,67 @@ {Controllers may want to warn the user if this event occurs; further action is generally not possible.} + CONSENSUS_ARRIVED + Tor has received and validated a new consensus networkstatus. + (This event can be delayed a little while after the consensus + is received, if Tor needs to fetch certificates.) + Actions for STATUS_CLIENT events can be as follows: + BOOTSTRAP + "PROGRESS=" num + "TAG=" Keyword + "SUMMARY=" String + ["WARNING=" String + "REASON=" Keyword + "COUNT=" num + "RECOMMENDATION=" Keyword + ] + + Tor has made some progress at establishing a connection to the + Tor network, fetching directory information, or making its first + circuit; or it has encountered a problem while bootstrapping. This + status event is especially useful for users with slow connections + or with connectivity problems. + + "Progress" gives a number between 0 and 100 for how far through + the bootstrapping process we are. "Summary" is a string that can + be displayed to the user to describe the *next* task that Tor + will tackle, i.e., the task it is working on after sending the + status event. "Tag" is a string that controllers can use to + recognize bootstrap phases, if they want to do something smarter + than just blindly displaying the summary string; see Section 5 + for the current tags that Tor issues. + + The StatusSeverity describes whether this is a normal bootstrap + phase (severity notice) or an indication of a bootstrapping + problem (severity warn). + + For bootstrap problems, we include the same progress, tag, and + summary values as we would for a normal bootstrap event, but we + also include "warning", "reason", "count", and "recommendation" + key/value combos. The "count" number tells how many bootstrap + problems there have been so far at this phase. The "reason" + string lists one of the reasons allowed in the ORCONN event. The + "warning" argument string with any hints Tor has to offer about + why it's having troubles bootstrapping. + + The "reason" values are long-term-stable controller-facing tags to + identify particular issues in a bootstrapping step. The warning + strings, on the other hand, are human-readable. Controllers + SHOULD NOT rely on the format of any warning string. Currently + the possible values for "recommendation" are either "ignore" or + "warn" -- if ignore, the controller can accumulate the string in + a pile of problems to show the user if the user asks; if warn, + the controller should alert the user that Tor is pretty sure + there's a bootstrapping problem. + + Currently Tor uses recommendation=ignore for the first + nine bootstrap problem reports for a given phase, and then + uses recommendation=warn for subsequent problems at that + phase. Hopefully this is a good balance between tolerating + occasional errors and reporting serious problems quickly. + ENOUGH_DIR_INFO Tor now knows enough network-status documents and enough server descriptors that it's going to start trying to build circuits now. @@ -1396,18 +1509,39 @@ We successfully uploaded our server descriptor to at least one of the directory authorities, with no complaints. - {This event could affect the controller's idea of server status, but - the controller should not interrupt the user to tell them so.} + {Originally, the goal of this event was to declare "every authority + has accepted the descriptor, so there will be no complaints + about it." But since some authorities might be offline, it's + harder to get certainty than we had thought. As such, this event + is equivalent to ACCEPTED_SERVER_DESCRIPTOR below. Controllers + should just look at ACCEPTED_SERVER_DESCRIPTOR and should ignore + this event for now.} + + SERVER_DESCRIPTOR_STATUS + "STATUS=" "LISTED" / "UNLISTED" + We just got a new networkstatus consensus, and whether we're in + it or not in it has changed. Specifically, status is "listed" + if we're listed in it but previous to this point we didn't know + we were listed in a consensus; and status is "unlisted" if we + thought we should have been listed in it (e.g. we were listed in + the last one), but we're not. + + {Moving from listed to unlisted is not necessarily cause for + alarm. The relay might have failed a few reachability tests, + or the Internet might have had some routing problems. So this + feature is mainly to let relay operators know when their relay + has successfully been listed in the consensus.} + + [Not implemented yet. We should do this in 0.2.2.x. -RD] NAMESERVER_STATUS "NS=addr" "STATUS=" "UP" / "DOWN" "ERR=" message One of our nameservers has changed status. - // actually notice - {This event could affect the controller's idea of server status, but - the controller should not interrupt the user to tell them so.} + {This event could affect the controller's idea of server status, but + the controller should not interrupt the user to tell them so.} NAMESERVER_ALL_DOWN All of our nameservers have gone down. @@ -1471,30 +1605,115 @@ 4.1.12. Network status has changed Syntax: - "650" "+" "NS" CRLF 1*NetworkStatus "." CRLF "650" SP "OK" CRLF + "650" "+" "NS" CRLF 1*NetworkStatus "." CRLF "650" SP "OK" CRLF + + The event is used whenever our local view of a relay status changes. + This happens when we get a new v3 consensus (in which case the entries + we see are a duplicate of what we see in the NEWCONSENSUS event, + below), but it also happens when we decide to mark a relay as up or + down in our local status, for example based on connection attempts. [First added in 0.1.2.3-alpha] 4.1.13. Bandwidth used on an application stream The syntax is: - "650" SP "STREAM_BW" SP StreamID SP BytesRead SP BytesWritten CRLF - BytesRead = 1*DIGIT + "650" SP "STREAM_BW" SP StreamID SP BytesWritten SP BytesRead CRLF BytesWritten = 1*DIGIT + BytesRead = 1*DIGIT + + BytesWritten and BytesRead are the number of bytes written and read + by the application since the last STREAM_BW event on this stream. + + Note that from Tor's perspective, *reading* a byte on a stream means + that the application *wrote* the byte. That's why the order of "written" + vs "read" is opposite for stream_bw events compared to bw events. + + These events are generated about once per second per stream; no events + are generated for streams that have not written or read. These events + apply only to streams entering Tor (such as on a SOCKSPort, TransPort, + or so on). They are not generated for exiting streams. + +4.1.14. Per-country client stats + + The syntax is: + "650" SP "CLIENTS_SEEN" SP TimeStarted SP CountrySummary CRLF + + We just generated a new summary of which countries we've seen clients + from recently. The controller could display this for the user, e.g. + in their "relay" configuration window, to give them a sense that they + are actually being useful. + + Currently only bridge relays will receive this event, but once we figure + out how to sufficiently aggregate and sanitize the client counts on + main relays, we might start sending these events in other cases too. + + TimeStarted is a quoted string indicating when the reported summary + counts from (in GMT). + + The CountrySummary keyword has as its argument a comma-separated, + possibly empty set of "countrycode=count" pairs. For example (without + linebreak), + 650-CLIENTS_SEEN TimeStarted="2008-12-25 23:50:43" + CountrySummary=us=16,de=8,uk=8 + +4.1.15. New consensus networkstatus has arrived. - BytesRead and BytesWritten are the number of bytes read and written since - the last STREAM_BW event on this stream. These events are generated about - once per second per stream; no events are generated for streams that have - not read or written. + The syntax is: + "650" "+" "NEWCONSENSUS" CRLF 1*NetworkStatus "." CRLF "650" SP + "OK" CRLF + + A new consensus networkstatus has arrived. We include NS-style lines for + every relay in the consensus. NEWCONSENSUS is a separate event from the + NS event, because the list here represents every usable relay: so any + relay *not* mentioned in this list is implicitly no longer recommended. + + [First added in 0.2.1.13-alpha] - These events apply only to streams entering Tor (such as on a SOCKSPort, - TransPort, or so on). They are not generated for exiting streams. +4.1.16. New circuit buildtime has been set. + + The syntax is: + "650" SP "BUILDTIMEOUT_SET" SP Type SP "TOTAL_TIMES=" Total SP + "TIMEOUT_MS=" Timeout SP "XM=" Xm SP "ALPHA=" Alpha SP + "CUTOFF_QUANTILE=" Quantile SP "TIMEOUT_RATE=" TimeoutRate SP + "CLOSE_MS=" CloseTimeout SP "CLOSE_RATE=" CloseRate + CRLF + Type = "COMPUTED" / "RESET" / "SUSPENDED" / "DISCARD" / "RESUME" + Total = Integer count of timeouts stored + Timeout = Integer timeout in milliseconds + Xm = Estimated integer Pareto parameter Xm in milliseconds + Alpha = Estimated floating point Paredo paremter alpha + Quantile = Floating point CDF quantile cutoff point for this timeout + TimeoutRate = Floating point ratio of circuits that timeout + CloseTimeout = How long to keep measurement circs in milliseconds + CloseRate = Floating point ratio of measurement circuits that are closed + + A new circuit build timeout time has been set. If Type is "COMPUTED", + Tor has computed the value based on historical data. If Type is "RESET", + initialization or drastic network changes have caused Tor to reset + the timeout back to the default, to relearn again. If Type is + "SUSPENDED", Tor has detected a loss of network connectivity and has + temporarily changed the timeout value to the default until the network + recovers. If type is "DISCARD", Tor has decided to discard timeout + values that likely happened while the network was down. If type is + "RESUME", Tor has decided to resume timeout calculation. + + The Total value is the count of circuit build times Tor used in + computing this value. It is capped internally at the maximum number + of build times Tor stores (NCIRCUITS_TO_OBSERVE). + + The Timeout itself is provided in milliseconds. Internally, Tor rounds + this value to the nearest second before using it. + + [First added in 0.2.2.7-alpha] 5. Implementation notes 5.1. Authentication - By default, the current Tor implementation trusts all local users. + If the control port is open and no authentication operation is enabled, Tor + trusts any local user that connects to the control port. This is generally + a poor idea. If the 'CookieAuthentication' option is true, Tor writes a "magic cookie" file named "control_auth_cookie" into its data directory. To authenticate, @@ -1513,7 +1732,8 @@ 'tor --hash-password ' or by using the example code in the Python and Java controller libraries. To authenticate under this scheme, the controller sends Tor the original - secret that was used to generate the password. + secret that was used to generate the password, either as a quoted string + or encoded in hexadecimal. 5.2. Don't let the buffer get too big. @@ -1522,9 +1742,9 @@ 5.3. Backward compatibility with v0 control protocol. - The 'version 0' control protocol was replaced in Tor 0.1.1.x. Support was - removed in Tor 0.2.0.x. Every non-obsolete version of Tor now supports the - version 1 control protocol. + The 'version 0' control protocol was replaced in Tor 0.1.1.x. Support + was removed in Tor 0.2.0.x. Every non-obsolete version of Tor now + supports the version 1 control protocol. For backward compatibility with the "version 0" control protocol, Tor used to check whether the third octet of the first command is zero. @@ -1532,7 +1752,7 @@ This compatibility was removed in Tor 0.1.2.16 and 0.2.0.4-alpha. -5.4. Options for use by controllers +5.4. Tor config options for use by controllers Tor provides a few special configuration options for use by controllers. These options can be set and examined by the SETCONF and GETCONF commands, @@ -1554,7 +1774,7 @@ __DisablePredictedCircuits - If true, Tor will not launch preemptive "general purpose" circuits for + If true, Tor will not launch preemptive "general-purpose" circuits for streams to attach to. (It will still launch circuits for testing and for hidden services.) @@ -1572,4 +1792,141 @@ As HashedControlPassword, but is not saved to the torrc file by SAVECONF. Added in Tor 0.2.0.20-rc. - + + __ReloadTorrcOnSIGHUP + + If this option is true (the default), we reload the torrc from disk + every time we get a SIGHUP (from the controller or via a signal). + Otherwise, we don't. This option exists so that controllers can keep + their options from getting overwritten when a user sends Tor a HUP for + some other reason (for example, to rotate the logs). + + (Boolean. Default: "1") + +5.5. Phases from the Bootstrap status event. + + This section describes the various bootstrap phases currently reported + by Tor. Controllers should not assume that the percentages and tags + listed here will continue to match up, or even that the tags will stay + in the same order. Some phases might also be skipped (not reported) + if the associated bootstrap step is already complete, or if the phase + no longer is necessary. Only "starting" and "done" are guaranteed to + exist in all future versions. + + Current Tor versions enter these phases in order, monotonically. + Future Tors MAY revisit earlier stages. + + Phase 0: + tag=starting summary="Starting" + + Tor starts out in this phase. + + Phase 5: + tag=conn_dir summary="Connecting to directory mirror" + + Tor sends this event as soon as Tor has chosen a directory mirror -- + e.g. one of the authorities if bootstrapping for the first time or + after a long downtime, or one of the relays listed in its cached + directory information otherwise. + + Tor will stay at this phase until it has successfully established + a TCP connection with some directory mirror. Problems in this phase + generally happen because Tor doesn't have a network connection, or + because the local firewall is dropping SYN packets. + + Phase 10: + tag=handshake_dir summary="Finishing handshake with directory mirror" + + This event occurs when Tor establishes a TCP connection with a relay used + as a directory mirror (or its https proxy if it's using one). Tor remains + in this phase until the TLS handshake with the relay is finished. + + Problems in this phase generally happen because Tor's firewall is + doing more sophisticated MITM attacks on it, or doing packet-level + keyword recognition of Tor's handshake. + + Phase 15: + tag=onehop_create summary="Establishing one-hop circuit for dir info" + + Once TLS is finished with a relay, Tor will send a CREATE_FAST cell + to establish a one-hop circuit for retrieving directory information. + It will remain in this phase until it receives the CREATED_FAST cell + back, indicating that the circuit is ready. + + Phase 20: + tag=requesting_status summary="Asking for networkstatus consensus" + + Once we've finished our one-hop circuit, we will start a new stream + for fetching the networkstatus consensus. We'll stay in this phase + until we get the 'connected' relay cell back, indicating that we've + established a directory connection. + + Phase 25: + tag=loading_status summary="Loading networkstatus consensus" + + Once we've established a directory connection, we will start fetching + the networkstatus consensus document. This could take a while; this + phase is a good opportunity for using the "progress" keyword to indicate + partial progress. + + This phase could stall if the directory mirror we picked doesn't + have a copy of the networkstatus consensus so we have to ask another, + or it does give us a copy but we don't find it valid. + + Phase 40: + tag=loading_keys summary="Loading authority key certs" + + Sometimes when we've finished loading the networkstatus consensus, + we find that we don't have all the authority key certificates for the + keys that signed the consensus. At that point we put the consensus we + fetched on hold and fetch the keys so we can verify the signatures. + + Phase 45 + tag=requesting_descriptors summary="Asking for relay descriptors" + + Once we have a valid networkstatus consensus and we've checked all + its signatures, we start asking for relay descriptors. We stay in this + phase until we have received a 'connected' relay cell in response to + a request for descriptors. + + Phase 50: + tag=loading_descriptors summary="Loading relay descriptors" + + We will ask for relay descriptors from several different locations, + so this step will probably make up the bulk of the bootstrapping, + especially for users with slow connections. We stay in this phase until + we have descriptors for at least 1/4 of the usable relays listed in + the networkstatus consensus. This phase is also a good opportunity to + use the "progress" keyword to indicate partial steps. + + Phase 80: + tag=conn_or summary="Connecting to entry guard" + + Once we have a valid consensus and enough relay descriptors, we choose + some entry guards and start trying to build some circuits. This step + is similar to the "conn_dir" phase above; the only difference is + the context. + + If a Tor starts with enough recent cached directory information, + its first bootstrap status event will be for the conn_or phase. + + Phase 85: + tag=handshake_or summary="Finishing handshake with entry guard" + + This phase is similar to the "handshake_dir" phase, but it gets reached + if we finish a TCP connection to a Tor relay and we have already reached + the "conn_or" phase. We'll stay in this phase until we complete a TLS + handshake with a Tor relay. + + Phase 90: + tag=circuit_create summary="Establishing circuits" + + Once we've finished our TLS handshake with an entry guard, we will + set about trying to make some 3-hop circuits in case we need them soon. + + Phase 100: + tag=done summary="Done" + + A full 3-hop exit circuit has been established. Tor is ready to handle + application connections now. + diff -Nru tor-0.2.0.34/doc/spec/dir-spec.txt tor-0.2.2.16-alpha/doc/spec/dir-spec.txt --- tor-0.2.0.34/doc/spec/dir-spec.txt 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/spec/dir-spec.txt 2010-09-17 01:30:36.000000000 +0000 @@ -1,4 +1,3 @@ -$Id: dir-spec.txt 13393 2008-02-05 23:20:44Z nickm $ Tor directory protocol, version 3 @@ -11,7 +10,7 @@ Caches and authorities must still support older versions of the directory protocols, until the versions of Tor that require them are - finally out of commission. See Section XXXX on backward compatibility. + finally out of commission. This document merges and supersedes the following proposals: @@ -19,13 +18,15 @@ 103 Splitting identity key from regularly used signing key 104 Long and Short Router Descriptors - AS OF 14 JUNE 2007, THIS SPECIFICATION HAS NOT YET BEEN COMPLETELY - IMPLEMENTED, OR COMPLETELY COMPLETED. - XXX when to download certificates. XXX timeline XXX fill in XXXXs + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL + NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + RFC 2119. + 0.1. History The earliest versions of Onion Routing shipped with a list of known @@ -183,7 +184,8 @@ All directory information is uploaded and downloaded with HTTP. [Authorities also generate and caches also cache documents produced and - used by earlier versions of this protocol; see section XXX for notes.] + used by earlier versions of this protocol; see dir-spec-v1.txt and + dir-spec-v2.txt for notes on those versions.] 1.1. What's different from version 2? @@ -213,6 +215,7 @@ More formally: + NL = The ascii LF character (hex value 0x0a). Document ::= (Item | NL)+ Item ::= KeywordLine Object* KeywordLine ::= Keyword NL | Keyword WS ArgumentChar+ NL @@ -466,11 +469,12 @@ [Any number] - These lines describe an "exit policy": the rules that an OR follows when - deciding whether to allow a new stream to a given address. The - 'exitpattern' syntax is described below. The rules are considered in - order; if no rule matches, the address will be accepted. For clarity, - the last such entry SHOULD be accept *:* or reject *:*. + These lines describe an "exit policy": the rules that an OR follows + when deciding whether to allow a new stream to a given address. The + 'exitpattern' syntax is described below. There MUST be at least one + such entry. The rules are considered in order; if no rule matches, + the address will be accepted. For clarity, the last such entry SHOULD + be accept *:* or reject *:*. "router-signature" NL Signature NL @@ -572,6 +576,34 @@ supports those descriptor versions. If none are specified, it defaults to version 2 descriptors. + [Versions of Tor before 0.1.2.5-alpha rejected router descriptors + with unrecognized items; the protocols line should be preceded with + an "opt" until these Tors are obsolete.] + + "protocols" SP "Link" SP LINK-VERSION-LIST SP "Circuit" SP + CIRCUIT-VERSION-LIST NL + + [At most once.] + + Both lists are space-separated sequences of numbers, to indicate which + protocols the server supports. As of 30 Mar 2008, specified + protocols are "Link 1 2 Circuit 1". See section 4.1 of tor-spec.txt + for more information about link protocol versions. + + [Versions of Tor before 0.1.2.5-alpha rejected router descriptors + with unrecognized items; the protocols line should be preceded with + an "opt" until these Tors are obsolete.] + + "allow-single-hop-exits" NL + + [At most once.] + + Present only if the router allows single-hop circuits to make exit + connections. Most Tor servers do not support this: this is + included for specialized controllers designed to support perspective + access and such. + + 2.2. Extra-info documents Extra-info documents consist of the following items: @@ -583,7 +615,7 @@ Fingerprint is encoded in hex (using upper-case letters), with no spaces. - "published" + "published" YYYY-MM-DD HH:MM:SS NL [Exactly once.] @@ -598,6 +630,252 @@ As documented in 2.1 above. See migration notes in section 2.2.1. + ("geoip-start" YYYY-MM-DD HH:MM:SS NL) + ("geoip-client-origins" CC=N,CC=N,... NL) + + Only generated by bridge routers (see blocking.pdf), and only + when they have been configured with a geoip database. + Non-bridges SHOULD NOT generate these fields. Contains a list + of mappings from two-letter country codes (CC) to the number + of clients that have connected to that bridge from that + country (approximate, and rounded up to the nearest multiple of 8 + in order to hamper traffic analysis). A country is included + only if it has at least one address. The time in + "geoip-start" is the time at which we began collecting geoip + statistics. + + "geoip-start" and "geoip-client-origins" have been replaced by + "bridge-stats-end" and "bridge-stats-ips" in 0.2.2.4-alpha. The + reason is that the measurement interval with "geoip-stats" as + determined by subtracting "geoip-start" from "published" could + have had a variable length, whereas the measurement interval in + 0.2.2.4-alpha and later is set to be exactly 24 hours long. In + order to clearly distinguish the new measurement intervals from + the old ones, the new keywords have been introduced. + + "bridge-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL + [At most once.] + + YYYY-MM-DD HH:MM:SS defines the end of the included measurement + interval of length NSEC seconds (86400 seconds by default). + + A "bridge-stats-end" line, as well as any other "bridge-*" line, + is only added when the relay has been running as a bridge for at + least 24 hours. + + "bridge-ips" CC=N,CC=N,... NL + [At most once.] + + List of mappings from two-letter country codes to the number of + unique IP addresses that have connected from that country to the + bridge and which are no known relays, rounded up to the nearest + multiple of 8. + + "dirreq-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL + [At most once.] + + YYYY-MM-DD HH:MM:SS defines the end of the included measurement + interval of length NSEC seconds (86400 seconds by default). + + A "dirreq-stats-end" line, as well as any other "dirreq-*" line, + is only added when the relay has opened its Dir port and after 24 + hours of measuring directory requests. + + "dirreq-v2-ips" CC=N,CC=N,... NL + [At most once.] + "dirreq-v3-ips" CC=N,CC=N,... NL + [At most once.] + + List of mappings from two-letter country codes to the number of + unique IP addresses that have connected from that country to + request a v2/v3 network status, rounded up to the nearest multiple + of 8. Only those IP addresses are counted that the directory can + answer with a 200 OK status code. + + "dirreq-v2-reqs" CC=N,CC=N,... NL + [At most once.] + "dirreq-v3-reqs" CC=N,CC=N,... NL + [At most once.] + + List of mappings from two-letter country codes to the number of + requests for v2/v3 network statuses from that country, rounded up + to the nearest multiple of 8. Only those requests are counted that + the directory can answer with a 200 OK status code. + + "dirreq-v2-share" num% NL + [At most once.] + "dirreq-v3-share" num% NL + [At most once.] + + The share of v2/v3 network status requests that the directory + expects to receive from clients based on its advertised bandwidth + compared to the overall network bandwidth capacity. Shares are + formatted in percent with two decimal places. Shares are + calculated as means over the whole 24-hour interval. + + "dirreq-v2-resp" status=num,... NL + [At most once.] + "dirreq-v3-resp" status=nul,... NL + [At most once.] + + List of mappings from response statuses to the number of requests + for v2/v3 network statuses that were answered with that response + status, rounded up to the nearest multiple of 4. Only response + statuses with at least 1 response are reported. New response + statuses can be added at any time. The current list of response + statuses is as follows: + + "ok": a network status request is answered; this number + corresponds to the sum of all requests as reported in + "dirreq-v2-reqs" or "dirreq-v3-reqs", respectively, before + rounding up. + "not-enough-sigs: a version 3 network status is not signed by a + sufficient number of requested authorities. + "unavailable": a requested network status object is unavailable. + "not-found": a requested network status is not found. + "not-modified": a network status has not been modified since the + If-Modified-Since time that is included in the request. + "busy": the directory is busy. + + "dirreq-v2-direct-dl" key=val,... NL + [At most once.] + "dirreq-v3-direct-dl" key=val,... NL + [At most once.] + "dirreq-v2-tunneled-dl" key=val,... NL + [At most once.] + "dirreq-v3-tunneled-dl" key=val,... NL + [At most once.] + + List of statistics about possible failures in the download process + of v2/v3 network statuses. Requests are either "direct" + HTTP-encoded requests over the relay's directory port, or + "tunneled" requests using a BEGIN_DIR cell over the relay's OR + port. The list of possible statistics can change, and statistics + can be left out from reporting. The current list of statistics is + as follows: + + Successful downloads and failures: + + "complete": a client has finished the download successfully. + "timeout": a download did not finish within 10 minutes after + starting to send the response. + "running": a download is still running at the end of the + measurement period for less than 10 minutes after starting to + send the response. + + Download times: + + "min", "max": smallest and largest measured bandwidth in B/s. + "d[1-4,6-9]": 1st to 4th and 6th to 9th decile of measured + bandwidth in B/s. For a given decile i, i/10 of all downloads + had a smaller bandwidth than di, and (10-i)/10 of all downloads + had a larger bandwidth than di. + "q[1,3]": 1st and 3rd quartile of measured bandwidth in B/s. One + fourth of all downloads had a smaller bandwidth than q1, one + fourth of all downloads had a larger bandwidth than q3, and the + remaining half of all downloads had a bandwidth between q1 and + q3. + "md": median of measured bandwidth in B/s. Half of the downloads + had a smaller bandwidth than md, the other half had a larger + bandwidth than md. + + "dirreq-read-history" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM... NL + [At most once] + "dirreq-write-history" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM... NL + [At most once] + + Declare how much bandwidth the OR has spent on answering directory + requests. Usage is divided into intervals of NSEC seconds. The + YYYY-MM-DD HH:MM:SS field defines the end of the most recent + interval. The numbers are the number of bytes used in the most + recent intervals, ordered from oldest to newest. + + "entry-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL + [At most once.] + + YYYY-MM-DD HH:MM:SS defines the end of the included measurement + interval of length NSEC seconds (86400 seconds by default). + + An "entry-stats-end" line, as well as any other "entry-*" + line, is first added after the relay has been running for at least + 24 hours. + + "entry-ips" CC=N,CC=N,... NL + [At most once.] + + List of mappings from two-letter country codes to the number of + unique IP addresses that have connected from that country to the + relay and which are no known other relays, rounded up to the + nearest multiple of 8. + + "cell-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL + [At most once.] + + YYYY-MM-DD HH:MM:SS defines the end of the included measurement + interval of length NSEC seconds (86400 seconds by default). + + A "cell-stats-end" line, as well as any other "cell-*" line, + is first added after the relay has been running for at least 24 + hours. + + "cell-processed-cells" num,...,num NL + [At most once.] + + Mean number of processed cells per circuit, subdivided into + deciles of circuits by the number of cells they have processed in + descending order from loudest to quietest circuits. + + "cell-queued-cells" num,...,num NL + [At most once.] + + Mean number of cells contained in queues by circuit decile. These + means are calculated by 1) determining the mean number of cells in + a single circuit between its creation and its termination and 2) + calculating the mean for all circuits in a given decile as + determined in "cell-processed-cells". Numbers have a precision of + two decimal places. + + "cell-time-in-queue" num,...,num NL + [At most once.] + + Mean time cells spend in circuit queues in milliseconds. Times are + calculated by 1) determining the mean time cells spend in the + queue of a single circuit and 2) calculating the mean for all + circuits in a given decile as determined in + "cell-processed-cells". + + "cell-circuits-per-decile" num NL + [At most once.] + + Mean number of circuits that are included in any of the deciles, + rounded up to the next integer. + + "exit-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL + [At most once.] + + YYYY-MM-DD HH:MM:SS defines the end of the included measurement + interval of length NSEC seconds (86400 seconds by default). + + An "exit-stats-end" line, as well as any other "exit-*" line, is + first added after the relay has been running for at least 24 hours + and only if the relay permits exiting (where exiting to a single + port and IP address is sufficient). + + "exit-kibibytes-written" port=N,port=N,... NL + [At most once.] + "exit-kibibytes-read" port=N,port=N,... NL + [At most once.] + + List of mappings from ports to the number of kibibytes that the + relay has written to or read from exit connections to that port, + rounded up to the next full kibibyte. + + "exit-streams-opened" port=N,port=N,... NL + [At most once.] + + List of mappings from ports to the number of opened exit streams + to that port, rounded up to the nearest multiple of 4. + "router-signature" NL Signature NL [At end, exactly once.] @@ -612,16 +890,19 @@ tools SHOULD accept history values from both sources; if they appear in both documents, the values in the extra-info documents are authoritative. - At some future time, to save space, new versions of Tor will no longer - generate router descriptors containing read-history or write-history. - Tools should continue to accept read-history and write-history values - in router descriptors produced by older versions of Tor. + New versions of Tor no longer generate router descriptors + containing read-history or write-history. Tools should continue to + accept read-history and write-history values in router descriptors + produced by older versions of Tor until all Tor versions earlier + than 0.2.0.x are obsolete. 2.3. Nonterminals in router descriptors - nickname ::= between 1 and 19 alphanumeric characters, case-insensitive. - hexdigest ::= a '$', followed by 20 hexadecimal characters. - [Represents a server by the digest of its identity key.] + nickname ::= between 1 and 19 alphanumeric characters ([A-Za-z0-9]), + case-insensitive. + hexdigest ::= a '$', followed by 40 hexadecimal characters + ([A-Fa-f0-9]). [Represents a server by the digest of its identity + key.] exitpattern ::= addrspec ":" portspec portspec ::= "*" | port | port "-" port @@ -671,8 +952,8 @@ the protocol described in this document. Implementations MUST reject formats they don't understand. - "dir-address" IP NL - [Once or more] + "dir-address" IPPort NL + [At most once] An IP:Port for this authority's directory port. @@ -711,6 +992,25 @@ The directory server's public signing key. This key MUST be at least 1024 bits, and MAY be longer. + "dir-key-crosscert" NL CrossSignature NL + + [At most once.] + + NOTE: Authorities MUST include this field in all newly generated + certificates. A future version of this specification will make + the field required. + + CrossSignature is a signature, made using the certificate's signing + key, of the digest of the PKCS1-padded hash of the certificate's + identity key. For backward compatibility with broken versions of the + parser, we wrap the base64-encoded signature in -----BEGIN ID + SIGNATURE---- and -----END ID SIGNATURE----- tags. Implementations + MUST allow the "ID " portion to be omitted, however. + + When encountering a certificate with a dir-key-crosscert entry, + implementations MUST verify that the signature is a correct signature + of the hash of the identity key using the signing key. + "dir-key-certification" NL Signature NL [At end, exactly once.] @@ -729,10 +1029,10 @@ generate exactly the same consensus given the same set of votes. The procedure for deciding when to generate vote and consensus status - documents are described in section XXX below. + documents are described in section 1.4 on the voting timeline. Status documents contain a preamble, an authority section, a list of - router status entries, and one more footers signature, in that order. + router status entries, and one or more footer signature, in that order. Unlike other formats described above, a SP in these documents must be a single space character (hex 20). @@ -839,6 +1139,47 @@ enough votes were counted for the consensus for an authoritative opinion to have been formed about their status. + "params" SP [Parameters] NL + + [At most once] + + Parameter ::= Keyword '=' Int32 + Int32 ::= A decimal integer between -2147483648 and 2147483647. + Parameters ::= Parameter | Parameters SP Parameter + + The parameters list, if present, contains a space-separated list of + case-sensitive key-value pairs, sorted in lexical order by + their keyword. Each parameter has its own meaning. + + (Only included when the vote is generated with consensus-method 7 or + later.) + + Commonly used "param" arguments at this point include: + + "circwindow" -- the default package window that circuits should + be established with. It started out at 1000 cells, but some + research indicates that a lower value would mean fewer cells in + transit in the network at any given time. Obeyed by Tor 0.2.1.20 + and later. + + "CircuitPriorityHalflifeMsec" -- the halflife parameter used when + weighting which circuit will send the next cell. Obeyed by Tor + 0.2.2.10-alpha and later. (Versions of Tor between 0.2.2.7-alpha + and 0.2.2.10-alpha recognized a "CircPriorityHalflifeMsec" parameter, + but mishandled it badly.) + + "perconnbwrate" and "perconnbwburst" -- if set, each relay sets + up a separate token bucket for every client OR connection, + and rate limits that connection indepedently. Typically left + unset, except when used for performance experiments around trac + entry 1750. Only honored by relays running Tor 0.2.2.16-alpha + and later. (Note that relays running 0.2.2.7-alpha through + 0.2.2.14-alpha looked for bwconnrate and bwconnburst, but then + did the wrong thing with them; see bug 1830 for details.) + + See also "2.4.5. Consensus parameters governing behavior" + in path-spec.txt for a series of circuit build time related + consensus params. The authority section of a vote contains the following items, followed in turn by the authority's current key certificate: @@ -862,6 +1203,18 @@ server's administrator. Administrators should include at least an email address and a PGP fingerprint. + "legacy-key" SP FINGERPRINT NL + + [At most once] + + Lists a fingerprint for an obsolete _identity_ key still used + by this authority to keep older clients working. This option + is used to keep key around for a little while in case the + authorities need to migrate many identity keys at once. + (Generally, this would only happen because of a security + vulnerability that affected multiple authorities, like the + Debian OpenSSL RNG bug of May 2008.) + The authority section of a consensus contains groups the following items, in the order given, with one group for each authority that contributed to the consensus, with groups sorted by authority identity digest: @@ -898,8 +1251,8 @@ "Nickname" is the OR's nickname. "Identity" is a hash of its identity key, encoded in base64, with trailing equals sign(s) removed. "Digest" is a hash of its most recent descriptor as - signed (that is, not including the signature), encoded in base64 as - "identity". "Publication" is the + signed (that is, not including the signature), encoded in base64. + "Publication" is the publication time of its most recent descriptor, in the form YYYY-MM-DD HH:MM:SS, in GMT. "IP" is its current IP address; ORPort is its current OR port, "DirPort" is it's current directory @@ -920,8 +1273,9 @@ directory cache (because its directory port isn't working, its bandwidth is always throttled, or for some similar reason). - "Exit" if the router is useful for building general-purpose exit - circuits. + "Exit" if the router is more useful for building + general-purpose exit circuits than for relay circuits. The + path building algorithm uses this flag; see path-spec.txt. "Fast" if the router is suitable for high-bandwidth circuits. "Guard" if the router is suitable for use as an entry guard. "HSDir" if the router is considered a v2 hidden service directory. @@ -929,6 +1283,8 @@ and this authority binds names. "Stable" if the router is suitable for long-lived circuits. "Running" if the router is currently usable. + "Unnamed" if another router has bound the name used by this + router, and this authority binds names. "Valid" if the router has been 'validated'. "V2Dir" if the router implements the v2 directory protocol. "V3Dir" if the router implements this protocol. @@ -949,8 +1305,85 @@ descriptors if they would cause "v" lines to be over 128 characters long. - The signature section contains the following item, which appears - Exactly Once for a vote, and At Least Once for a consensus. + "w" SP "Bandwidth=" INT [SP "Measured=" INT] NL + + [At most once.] + + An estimate of the bandwidth of this server, in an arbitrary + unit (currently kilobytes per second). Used to weight router + selection. + + Additionally, the Measured= keyword is present in votes by + participating bandwidth measurement authorities to indicate + a measured bandwidth currently produced by measuring stream + capacities. + + Other weighting keywords may be added later. + Clients MUST ignore keywords they do not recognize. + + "p" SP ("accept" / "reject") SP PortList NL + + [At most once.] + + PortList = PortOrRange + PortList = PortList "," PortOrRange + PortOrRange = INT "-" INT / INT + + A list of those ports that this router supports (if 'accept') + or does not support (if 'reject') for exit to "most + addresses". + + The footer section is delineated in all votes and consensuses supporting + consensus method 9 and above with the following: + + "directory-footer" NL + + It contains two subsections, a bandwidths-weights line and a + directory-signature. + + The bandwidths-weights line appears At Most Once for a consensus. It does + not appear in votes. + + "bandwidth-weights" SP + "Wbd=" INT SP "Wbe=" INT SP "Wbg=" INT SP "Wbm=" INT SP + "Wdb=" INT SP + "Web=" INT SP "Wed=" INT SP "Wee=" INT SP "Weg=" INT SP "Wem=" INT SP + "Wgb=" INT SP "Wgd=" INT SP "Wgg=" INT SP "Wgm=" INT SP + "Wmb=" INT SP "Wmd=" INT SP "Wme=" INT SP "Wmg=" INT SP "Wmm=" INT NL + + These values represent the weights to apply to router bandwidths during + path selection. They are sorted in alphabetical order in the list. The + integer values are divided by BW_WEIGHT_SCALE=10000 or the consensus + param "bwweightscale". They are: + + Wgg - Weight for Guard-flagged nodes in the guard position + Wgm - Weight for non-flagged nodes in the guard Position + Wgd - Weight for Guard+Exit-flagged nodes in the guard Position + + Wmg - Weight for Guard-flagged nodes in the middle Position + Wmm - Weight for non-flagged nodes in the middle Position + Wme - Weight for Exit-flagged nodes in the middle Position + Wmd - Weight for Guard+Exit flagged nodes in the middle Position + + Weg - Weight for Guard flagged nodes in the exit Position + Wem - Weight for non-flagged nodes in the exit Position + Wee - Weight for Exit-flagged nodes in the exit Position + Wed - Weight for Guard+Exit-flagged nodes in the exit Position + + Wgb - Weight for BEGIN_DIR-supporting Guard-flagged nodes + Wmb - Weight for BEGIN_DIR-supporting non-flagged nodes + Web - Weight for BEGIN_DIR-supporting Exit-flagged nodes + Wdb - Weight for BEGIN_DIR-supporting Guard+Exit-flagged nodes + + Wbg - Weight for Guard flagged nodes for BEGIN_DIR requests + Wbm - Weight for non-flagged nodes for BEGIN_DIR requests + Wbe - Weight for Exit-flagged nodes for BEGIN_DIR requests + Wbd - Weight for Guard+Exit-flagged nodes for BEGIN_DIR requests + + These values are calculated as specified in Section 3.4.3. + + The signature contains the following item, which appears Exactly Once + for a vote, and At Least Once for a consensus. "directory-signature" SP identity SP signing-key-digest NL Signature @@ -963,7 +1396,7 @@ the signing authority, and "signing-key-digest" is the hex-encoded digest of the current authority signing key of the signing authority. -3.3. Deciding how to vote. +3.3. Assigning flags in a vote (This section describes how directory authorities choose which status flags to apply to routers, as of Tor 0.2.0.0-alpha-dev. Later directory @@ -986,6 +1419,19 @@ binds X to some other Y'.) A router is called 'Named' if the router believes the given name should be bound to the given key. + Two strategies exist on the current network for deciding on + values for the Named flag. In the original version, server + operators were asked to send nickname-identity pairs to a + mailing list of Naming directory authorities operators. The + operators were then supposed to add the pairs to their + mapping files; in practice, they didn't get to this often. + + Newer Naming authorities run a script that registers routers + in their mapping files once the routers have been online at + least two weeks, no other router has that nickname, and no + other router has wanted the nickname for a month. If a router + has not been online for six months, the router is removed. + "Unnamed" -- Directory authorities that support naming should vote for a router to be 'Unnamed' if its given nickname is mapped to a different identity. @@ -1008,15 +1454,16 @@ [XXXX what happens when we have less than 4 days of MTBF info.] + "Exit" -- A router is called an 'Exit' iff it allows exits to at + least two of the ports 80, 443, and 6667 and allows exits to at + least one /8 address space. + "Fast" -- A router is 'Fast' if it is active, and its bandwidth is - either in the top 7/8ths for known active routers or at least 100KB/s. + either in the top 7/8ths for known active routers or at least 20KB/s. "Guard" -- A router is a possible 'Guard' if its Weighted Fractional Uptime is at least the median for "familiar" active routers, and if its bandwidth is at least median or at least 250KB/s. - If the total bandwidth of active non-BadExit Exit servers is less - than one third of the total bandwidth of all active servers, no Exit is - listed as a Guard. To calculate weighted fractional uptime, compute the fraction of time that the router is up in any given day, weighting so that @@ -1054,6 +1501,26 @@ Thus, the network-status vote includes all non-blacklisted, non-expired, non-superseded descriptors. + The bandwidth in a "w" line should be taken as the best estimate + of the router's actual capacity that the authority has. For now, + this should be the lesser of the observed bandwidth and bandwidth + rate limit from the router descriptor. It is given in kilobytes + per second, and capped at some arbitrary value (currently 10 MB/s). + + The Measured= keyword on a "w" line vote is currently computed + by multiplying the previous published consensus bandwidth by the + ratio of the measured average node stream capacity to the network + average. If 3 or more authorities provide a Measured= keyword for + a router, the authorities produce a consensus containing a "w" + Bandwidth= keyword equal to the median of the Measured= votes. + + The ports listed in a "p" line should be taken as those ports for + which the router's exit policy permits 'most' addresses, ignoring any + accept not for all addresses, ignoring all rejects for private + netblocks. "Most" addresses are permitted if no more than 2^25 + IPv4 addresses (two /8 networks) were blocked. The list is encoded + as described in 3.4.2. + 3.4. Computing a consensus from a set of votes Given a set of votes, authorities compute the contents of the consensus @@ -1067,6 +1534,10 @@ Known-flags is the union of all flags known by any voter. + Entries are given on the "params" line for every keyword on which any + authority voted. The values given are the low-median of all votes on + that keyword. + "client-versions" and "server-versions" are sorted in ascending order; A version is recommended in the consensus if it is recommended by more than half of the voting authorities that included a @@ -1075,7 +1546,12 @@ The authority item groups (dir-source, contact, fingerprint, vote-digest) are taken from the votes of the voting authorities. These groups are sorted by the digests of the - authorities identity keys, in ascending order. + authorities identity keys, in ascending order. If the consensus + method is 3 or later, a dir-source line must be included for + every vote with legacy-key entry, using the legacy-key's + fingerprint, the voter's ordinary nickname with the string + "-legacy" appended, and all other fields as from the original + vote's dir-source line. A router status entry: * is included in the result if some router status entry with the same @@ -1090,8 +1566,9 @@ * Two router entries are "the same" if they have the same tuple. We choose the tuple for a given router as whichever tuple appears - for that router in the most votes. We break ties in favor of - the more recently published. + for that router in the most votes. We break ties first in favor of + the more recently published, then in favor of smaller server + descriptor digest. * The Named flag appears if it is included for this routerstatus by _any_ authority, and if all authorities that list it list the same @@ -1109,6 +1586,28 @@ * The version is given as whichever version is listed by the most voters, with ties decided in favor of more recent versions. + * If consensus-method 4 or later is in use, then routers that + do not have the Running flag are not listed at all. + + * If consensus-method 5 or later is in use, then the "w" line + is generated using a low-median of the bandwidth values from + the votes that included "w" lines for this router. + + * If consensus-method 5 or later is in use, then the "p" line + is taken from the votes that have the same policy summary + for the descriptor we are listing. (They should all be the + same. If they are not, we pick the most commonly listed + one, breaking ties in favor of the lexicographically larger + vote.) The port list is encoded as specified in 3.4.2. + + * If consensus-method 6 or later is in use and if 3 or more + authorities provide a Measured= keyword in their votes for + a router, the authorities produce a consensus containing a + Bandwidth= keyword equal to the median of the Measured= votes. + + * If consensus-method 7 or later is in use, the params line is + included in the output. + The signatures at the end of a consensus document are sorted in ascending order by identity digest. @@ -1126,6 +1625,13 @@ higher numbers. Currently recognized methods: "1" -- The first implemented version. "2" -- Added support for the Unnamed flag. + "3" -- Added legacy ID key support to aid in authority ID key rollovers + "4" -- No longer list routers that are not running in the consensus + "5" -- adds support for "w" and "p" lines. + "6" -- Prefers measured bandwidth values rather than advertised + "7" -- Provides keyword=integer pairs of consensus parameters + "8" -- Provides microdescriptor summaries + "9" -- Provides weights for selecting flagged routers in paths Before generating a consensus, an authority must decide which consensus method to use. To do this, it looks for the highest version number @@ -1138,6 +1644,167 @@ making changes in the contents of consensus; not for making backward-incompatible changes in their format.) +3.4.2. Encoding port lists + + Whether the summary shows the list of accepted ports or the list of + rejected ports depends on which list is shorter (has a shorter string + representation). In case of ties we choose the list of accepted + ports. As an exception to this rule an allow-all policy is + represented as "accept 1-65535" instead of "reject " and a reject-all + policy is similarly given as "reject 1-65535". + + Summary items are compressed, that is instead of "80-88,89-100" there + only is a single item of "80-100", similarly instead of "20,21" a + summary will say "20-21". + + Port lists are sorted in ascending order. + + The maximum allowed length of a policy summary (including the "accept " + or "reject ") is 1000 characters. If a summary exceeds that length we + use an accept-style summary and list as much of the port list as is + possible within these 1000 bytes. [XXXX be more specific.] + +3.4.3. Computing Bandwidth Weights + + Let weight_scale = 10000 + + Let G be the total bandwidth for Guard-flagged nodes. + Let M be the total bandwidth for non-flagged nodes. + Let E be the total bandwidth for Exit-flagged nodes. + Let D be the total bandwidth for Guard+Exit-flagged nodes. + Let T = G+M+E+D + + Let Wgd be the weight for choosing a Guard+Exit for the guard position. + Let Wmd be the weight for choosing a Guard+Exit for the middle position. + Let Wed be the weight for choosing a Guard+Exit for the exit position. + + Let Wme be the weight for choosing an Exit for the middle position. + Let Wmg be the weight for choosing a Guard for the middle position. + + Let Wgg be the weight for choosing a Guard for the guard position. + Let Wee be the weight for choosing an Exit for the exit position. + + Balanced network conditions then arise from solutions to the following + system of equations: + + Wgg*G + Wgd*D == M + Wmd*D + Wme*E + Wmg*G (guard bw = middle bw) + Wgg*G + Wgd*D == Wee*E + Wed*D (guard bw = exit bw) + Wed*D + Wmd*D + Wgd*D == D (aka: Wed+Wmd+Wdg = 1) + Wmg*G + Wgg*G == G (aka: Wgg = 1-Wmg) + Wme*E + Wee*E == E (aka: Wee = 1-Wme) + + We are short 2 constraints with the above set. The remaining constraints + come from examining different cases of network load. + + Case 1: E >= T/3 && G >= T/3 (Neither Exit nor Guard Scarce) + + In this case, the additional two constraints are: Wme*E == Wmd*D and + Wgd == 0, which maximizes Exit-flagged bandwidth in the middle position. + + This leads to the solution: + + Wgg = (weight_scale*(D+E+G+M))/(3*G) + Wmd = (weight_scale*(2*D + 2*E - G - M))/(6*D) + Wme = (weight_scale*(2*D + 2*E - G - M))/(6*E) + Wee = (weight_scale*(-2*D + 4*E + G + M))/(6*E) + Wmg = weight_scale - Wgg + Wed = weight_scale - Wmd + Wgd = 0 + + Case 2: E < T/3 && G < T/3 (Both are scarce) + + Let R denote the more scarce class (Rare) between Guard vs Exit. + Let S denote the less scarce class. + + Subcase a: R+D < S + + In this subcase, we simply devote all of D bandwidth to the + scarce class. + + Wgg = Wee = weight_scale + Wmg = Wme = Wmd = 0; + if E < G: + Wed = weight_scale + Wgd = 0 + else: + Wed = 0 + Wgd = weight_scale + + Subcase b: R+D >= S + + In this case, if M <= T/3, we have enough bandwidth to try to achieve + a balancing condition, and add the constraints Wgg == 1 and + Wme*E == Wmd*D: + + Wgg = weight_scale + Wgd = (weight_scale*(D + E - 2*G + M))/(3*D) (T/3 >= G (Ok)) + Wmd = (weight_scale*(D + E + G - 2*M))/(6*D) (T/3 >= M) + Wme = (weight_scale*(D + E + G - 2*M))/(6*E) + Wee = (weight_scale*(-D + 5*E - G + 2*M))/(6*E) (2E+M >= T/3) + Wmg = 0; + Wed = weight_scale - Wgd - Wmd + + If M >= T/3, the above solution will not be valid (one of the weights + will be < 0 or > 1). In this case, we use: + + Wgg = weight_scale + Wee = weight_scale + Wmg = Wme = Wmd = 0 + Wgd = (weight_scale*(D+E-G))/(2*D) + Wed = weight_scale - Wgd + + Case 3: One of E < T/3 or G < T/3 + + Let S be the scarce class (of E or G). + + Subcase a: (S+D) < T/3: + if G=S: + Wgg = Wgd = weight_scale; + Wmd = Wed = Wmg = 0; + Wme = (weight_scale*(E-M))/(2*E); + Wee = weight_scale-Wme; + if E=S: + Wee = Wed = weight_scale; + Wmd = Wgd = Wmg = 0; + Wmg = (weight_scale*(G-M))/(2*G); + Wgg = weight_scale-Wmg; + + Subcase b: (S+D) >= T/3 + if G=S: + Add constraints Wmg = 0, Wme*E == Wmd*D to maximize exit bandwidth + in the middle position: + Wgd = (weight_scale*(D + E - 2*G + M))/(3*D); + Wmd = (weight_scale*(D + E + G - 2*M))/(6*D); + Wme = (weight_scale*(D + E + G - 2*M))/(6*E); + Wee = (weight_scale*(-D + 5*E - G + 2*M))/(6*E); + Wgg = weight_scale; + Wmg = 0; + Wed = weight_scale - Wgd - Wmd; + if E=S: + Add constraints Wgd = 0, Wme*E == Wmd*D: + Wgg = (weight_scale*(D + E + G + M))/(3*G); + Wmd = (weight_scale*(2*D + 2*E - G - M))/(6*D); + Wme = (weight_scale*(2*D + 2*E - G - M))/(6*E); + Wee = (weight_scale*(-2*D + 4*E + G + M))/(6*E); + Wgd = 0; + Wmg = weight_scale - Wgg; + Wed = weight_scale - Wmd; + + To ensure consensus, all calculations are performed using integer math + with a fixed precision determined by the bwweightscale consensus + parameter (defaults at 10000). + + For future balancing improvements, Tor clients support 11 additional weights + for directory requests and middle weighting. These weights are currently + set at weight_scale, with the exception of the following groups of + assignments: + + Directory requests use middle weights: + Wbd=Wmd, Wbg=Wmg, Wbe=Wme, Wbm=Wmm + + Handle bridges and strange exit policies: + Wgm=Wgg, Wem=Wee, Weg=Wed + 3.5. Detached signatures Assuming full connectivity, every authority should compute and sign the @@ -1281,9 +1948,15 @@ - The cache has no consensus document. - The cache's consensus document is no longer valid. Otherwise, the cache downloads a new consensus document at a randomly - chosen time after its current consensus stops being fresh. (This time is - chosen at random to avoid swarming the authorities at the start of each - period.) + chosen time in the first half-interval after its current consensus + stops being fresh. (This time is chosen at random to avoid swarming + the authorities at the start of each period. The interval size is + inferred from the difference between the valid-after time and the + fresh-until time on the consensus.) + + [For example, if a cache has a consensus that became valid at 1:00, + and is fresh until 2:00, that cache will fetch a new consensus at + a random time between 2:00 and 2:30.] 4.4. Downloading and storing router descriptors (authorities and caches) @@ -1342,6 +2015,23 @@ The most recent v3 consensus should be available at: http:///tor/status-vote/current/consensus.z + Starting with Tor version 0.2.1.1-alpha is also available at: + http:///tor/status-vote/current/consensus/++.z + + Where F1, F2, etc. are authority identity fingerprints the client trusts. + Servers will only return a consensus if more than half of the requested + authorities have signed the document, otherwise a 404 error will be sent + back. The fingerprints can be shortened to a length of any multiple of + two, using only the leftmost part of the encoded fingerprint. Tor uses + 3 bytes (6 hex characters) of the fingerprint. + + Clients SHOULD sort the fingerprints in ascending order. Server MUST + accept any order. + + Clients SHOULD use this format when requesting consensus documents from + directory authority servers and from caches running a version of Tor + that is known to support this URL format. + A concatenated set of all the current key certificates should be available at: http:///tor/keys/all.z @@ -1357,7 +2047,15 @@ The key certificate whose signing key fingerprint is should be available at: http:///tor/keys/sk/.z - [XXX020 cross-certify?] + + The key certificate whose identity key fingerprint is and whose signing + key fingerprint is should be available at: + + http:///tor/keys/fp-sk/-.z + + (As usual, clients may request multiple certificates using: + http:///tor/keys/fp-sk/-+-.z ) + [The above fp-sk format was not supported before Tor 0.2.1.9-alpha.] The most recent descriptor for a server whose identity key has a fingerprint of should be available at: @@ -1443,6 +2141,19 @@ from an authority, they should not need to go to the authority directly again.) + To avoid swarming the caches whenever a consensus expires, the + clients download new consensuses at a randomly chosen time after the + caches are expected to have a fresh consensus, but before their + consensus will expire. (This time is chosen uniformly at random from + the interval between the time 3/4 into the first interval after the + consensus is no longer fresh, and 7/8 of the time remaining after + that before the consensus is invalid.) + + [For example, if a cache has a consensus that became valid at 1:00, + and is fresh until 2:00, and expires at 4:00, that cache will fetch + a new consensus at a random time between 2:45 and 3:50, since 3/4 + of the one-hour interval is 45 minutes, and 7/8 of the remaining 75 + minutes is 65 minutes.] 5.2. Downloading and storing router descriptors @@ -1640,7 +2351,7 @@ -- the authority rejected a malformed posted document, or 404 -- the requested document was not found. - -- the user requested statuses or serverdescs, and none of the ones we + -- the user requested statuses or serverdescs, and none of the ones requested were found (0.2.0.5-alpha and later). 503 -- we are declining the request in order to save bandwidth @@ -1665,7 +2376,6 @@ A. Consensus-negotiation timeline. - Period begins: this is the Published time. Everybody sends votes Reconciliation: everybody tries to fetch missing votes. diff -Nru tor-0.2.0.34/doc/spec/Makefile.am tor-0.2.2.16-alpha/doc/spec/Makefile.am --- tor-0.2.0.34/doc/spec/Makefile.am 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/spec/Makefile.am 2010-01-19 23:01:11.000000000 +0000 @@ -1,5 +1,5 @@ EXTRA_DIST = tor-spec.txt rend-spec.txt control-spec.txt \ dir-spec.txt socks-extensions.txt path-spec.txt \ - version-spec.txt address-spec.txt + version-spec.txt address-spec.txt bridges-spec.txt diff -Nru tor-0.2.0.34/doc/spec/Makefile.in tor-0.2.2.16-alpha/doc/spec/Makefile.in --- tor-0.2.0.34/doc/spec/Makefile.in 2009-02-09 03:31:01.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/spec/Makefile.in 2010-09-17 06:08:40.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -44,8 +44,10 @@ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -80,6 +82,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -88,7 +91,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -99,8 +104,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -153,7 +161,7 @@ top_srcdir = @top_srcdir@ EXTRA_DIST = tor-spec.txt rend-spec.txt control-spec.txt \ dir-spec.txt socks-extensions.txt path-spec.txt \ - version-spec.txt address-spec.txt + version-spec.txt address-spec.txt bridges-spec.txt all: all-am diff -Nru tor-0.2.0.34/doc/spec/path-spec.txt tor-0.2.2.16-alpha/doc/spec/path-spec.txt --- tor-0.2.0.34/doc/spec/path-spec.txt 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/spec/path-spec.txt 2010-07-13 01:37:00.000000000 +0000 @@ -1,4 +1,3 @@ -$Id: path-spec.txt 13154 2008-01-17 05:47:44Z arma $ Tor Path Specification @@ -13,12 +12,17 @@ implementors should be aware of the anonymity and load-balancing implications of their choices. - THIS SPEC ISN'T DONE OR CORRECT YET. + THIS SPEC ISN'T DONE YET. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL + NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + RFC 2119. 1. General operation Tor begins building circuits as soon as it has enough directory - information to do so (see section 5.1 of dir-spec.txt). Some circuits are + information to do so (see section 5 of dir-spec.txt). Some circuits are built preemptively because we expect to need them later (for user traffic), and some are built because of immediate need (for user traffic that no current circuit can handle, for testing the network or our @@ -72,6 +76,24 @@ is unknown (usually its target IP), but we believe the path probably supports the request according to the rules given below. +1.1. A server's bandwidth + + Old versions of Tor did not report bandwidths in network status + documents, so clients had to learn them from the routers' advertised + server descriptors. + + For versions of Tor prior to 0.2.1.17-rc, everywhere below where we + refer to a server's "bandwidth", we mean its clipped advertised + bandwidth, computed by taking the smaller of the 'rate' and + 'observed' arguments to the "bandwidth" element in the server's + descriptor. If a router's advertised bandwidth is greater than + MAX_BELIEVABLE_BANDWIDTH (currently 10 MB/s), we clipped to that + value. + + For more recent versions of Tor, we take the bandwidth value declared + in the consensus, and fall back to the clipped advertised bandwidth + only if the consensus does not have bandwidths listed. + 2. Building circuits 2.1. When we build @@ -158,6 +180,7 @@ XXXX + 2.2. Path selection and constraints We choose the path for each new circuit before we build it. We choose the @@ -175,26 +198,41 @@ below) - XXXX Choosing the length - For circuits that do not need to be not "fast", when choosing among - multiple candidates for a path element, we choose randomly. + For "fast" circuits, we only choose nodes with the Fast flag. For + non-"fast" circuits, all nodes are eligible. - For "fast" circuits, we pick a given router as an exit with probability - proportional to its advertised bandwidth [the smaller of the 'rate' and - 'observed' arguments to the "bandwidth" element in its descriptor]. If a - router's advertised bandwidth is greater than MAX_BELIEVABLE_BANDWIDTH - (currently 10 MB/s), we clip to that value. - - For non-exit positions on "fast" circuits, we pick routers as above, but - we weight the clipped advertised bandwidth of Exit-flagged nodes depending - on the fraction of bandwidth available from non-Exit nodes. Call the - total clipped advertised bandwidth for Exit nodes under consideration E, - and the total clipped advertised bandwidth for all nodes under - consideration T. If EBob's OP: "Offer IP:Port as - public-key-name:Port". [configuration] + 1. Bob->Bob's OP: "Offer IP:Port as public-key-name:Port". [configuration] (We do not specify this step; it is left to the implementor of Bob's OP.) - 2. Bob's OP generates keypair and rendezvous service descriptor: - "Meet public-key X at introduction point A, B, or C." (signed) + 2. Bob's OP generates a long-term keypair. 3. Bob's OP->Introduction point via Tor: [introduction setup] - "This pk is me." + "This public key is (currently) associated to me." - 4. Bob's OP->directory service via Tor: publishes Bob's service - descriptor [advertisement] + 4. Bob's OP->directory service via Tor: publishes Bob's service descriptor + [advertisement] + "Meet public-key X at introduction point A, B, or C." (signed) - 5. Out of band, Alice receives a [x.y.]z.onion:port address. - She opens a SOCKS connection to her OP, and requests - x.y.z.onion:port. + 5. Out of band, Alice receives a z.onion:port address. + She opens a SOCKS connection to her OP, and requests z.onion:port. 6. Alice's OP retrieves Bob's descriptor via Tor. [descriptor lookup.] @@ -85,29 +86,31 @@ setup.] 8. Alice connects to the Introduction point via Tor, and tells it about - her rendezvous point and optional authentication/authorization - information. (Encrypted to Bob.) [Introduction 1] + her rendezvous point. (Encrypted to Bob.) [Introduction 1] 9. The Introduction point passes this on to Bob's OP via Tor, along the introduction circuit. [Introduction 2] 10. Bob's OP decides whether to connect to Alice, and if so, creates a circuit to Alice's RP via Tor. Establishes a shared circuit. - [Rendezvous.] + [Rendezvous 1] - 11. Alice's OP sends begin cells to Bob's OP. [Connection] + 11. The Rendezvous point forwards Bob's confirmation to Alice's OP. + [Rendezvous 2] + + 12. Alice's OP sends begin cells to Bob's OP. [Connection] 0.3. Constants and new cell types Relay cell types - 32 -- RELAY_ESTABLISH_INTRO - 33 -- RELAY_ESTABLISH_RENDEZVOUS - 34 -- RELAY_INTRODUCE1 - 35 -- RELAY_INTRODUCE2 - 36 -- RELAY_RENDEZVOUS1 - 37 -- RELAY_RENDEZVOUS2 - 38 -- RELAY_INTRO_ESTABLISHED - 39 -- RELAY_RENDEZVOUS_ESTABLISHED + 32 -- RELAY_COMMAND_ESTABLISH_INTRO + 33 -- RELAY_COMMAND_ESTABLISH_RENDEZVOUS + 34 -- RELAY_COMMAND_INTRODUCE1 + 35 -- RELAY_COMMAND_INTRODUCE2 + 36 -- RELAY_COMMAND_RENDEZVOUS1 + 37 -- RELAY_COMMAND_RENDEZVOUS2 + 38 -- RELAY_COMMAND_INTRO_ESTABLISHED + 39 -- RELAY_COMMAND_RENDEZVOUS_ESTABLISHED 40 -- RELAY_COMMAND_INTRODUCE_ACK 0.4. Version overview @@ -117,14 +120,14 @@ other parts remained the same. The following list of potentially versioned protocol parts should help reduce some confusion: - - Hidden service descriptor: the binary-based v0 was the default for - a long time, and an ascii-based v2 has been added by proposal - 114. See 1.2. + - Hidden service descriptor: the binary-based v0 was the default for a + long time, and an ASCII-based v2 has been added by proposal 114. The + v0 descriptor format has been deprecated in 0.2.2.1-alpha. See 1.3. - Hidden service descriptor propagation mechanism: currently related to the hidden service descriptor version -- v0 publishes to the original hs directory authorities, whereas v2 publishes to a rotating subset - of relays with the "hsdir" flag; see 1.4 and 1.6. + of relays with the "HSDir" flag; see 1.4 and 1.6. - Introduction protocol for how to generate an introduction cell: v0 specified a nickname for the rendezvous point and assumed the @@ -142,11 +145,56 @@ service. Bob provides a mapping from each of these virtual ports to a local IP:Port pair. -1.2. Bob's OP generates service descriptors. +1.2. Bob's OP establishes his introduction points. The first time the OP provides an advertised service, it generates - a public/private keypair (stored locally). Periodically, the OP - generates and publishes a descriptor of type "V0". + a public/private keypair (stored locally). + + The OP chooses a small number of Tor servers as introduction points. + The OP establishes a new introduction circuit to each introduction + point. These circuits MUST NOT be used for anything but hidden service + introduction. To establish the introduction, Bob sends a + RELAY_COMMAND_ESTABLISH_INTRO cell, containing: + + KL Key length [2 octets] + PK Bob's public key or service key [KL octets] + HS Hash of session info [20 octets] + SIG Signature of above information [variable] + + KL is the length of PK, in octets. + + To prevent replay attacks, the HS field contains a SHA-1 hash based on the + shared secret KH between Bob's OP and the introduction point, as + follows: + HS = H(KH | "INTRODUCE") + That is: + HS = H(KH | [49 4E 54 52 4F 44 55 43 45]) + (KH, as specified in tor-spec.txt, is H(g^xy | [00]) .) + + Upon receiving such a cell, the OR first checks that the signature is + correct with the included public key. If so, it checks whether HS is + correct given the shared state between Bob's OP and the OR. If either + check fails, the OP discards the cell; otherwise, it associates the + circuit with Bob's public key, and dissociates any other circuits + currently associated with PK. On success, the OR sends Bob a + RELAY_COMMAND_INTRO_ESTABLISHED cell with an empty payload. + + Bob's OP uses either Bob's public key or a freshly generated, single-use + service key in the RELAY_COMMAND_ESTABLISH_INTRO cell, depending on the + configured hidden service descriptor version. The public key is used for + v0 descriptors, the service key for v2 descriptors. In the latter case, the + service keys of all introduction points are included in the v2 hidden + service descriptor together with the other introduction point information. + The reason is that the introduction point does not need to and therefore + should not know for which hidden service it works, so as to prevent it from + tracking the hidden service's activity. If the hidden service is configured + to publish both v0 and v2 descriptors, two separate sets of introduction + points are established. + +1.3. Bob's OP generates service descriptors. + + For versions before 0.2.2.1-alpha, Bob's OP periodically generates and + publishes a descriptor of type "V0". The "V0" descriptor contains: @@ -157,7 +205,6 @@ Ipt A list of NUL-terminated ORs [variable] SIG Signature of above fields [variable] - KL is the length of PK, in octets. TS is the number of seconds elapsed since Jan 1, 1970. The members of Ipt may be either (a) nicknames, or (b) identity key @@ -170,8 +217,8 @@ and now he doesn't have any. -RD] Beginning with 0.2.0.10-alpha, Bob's OP encodes "V2" descriptors in - addition to "V0" descriptors. The format of a "V2" descriptor is as - follows: + addition to (or instead of) "V0" descriptors. The format of a "V2" + descriptor is as follows: "rendezvous-service-descriptor" descriptor-id NL @@ -179,11 +226,7 @@ Indicates the beginning of the descriptor. "descriptor-id" is a periodically changing identifier of 160 bits formatted as 32 base32 - chars that is calculated by the hidden service and its clients. If - the optional "descriptor-cookie" is used, this "descriptor-id" - cannot be computed by anyone else. (Everyone can verify that this - "descriptor-id" belongs to the rest of the descriptor, even without - knowing the optional "descriptor-cookie", as described below.) The + chars that is calculated by the hidden service and its clients. The "descriptor-id" is calculated by performing the following operation: descriptor-id = @@ -195,29 +238,20 @@ permanent-id = H(public-key)[:10] - "H(time-period | descriptor-cookie | replica)" is the (possibly - secret) id part that is - necessary to verify that the hidden service is the true originator - of this descriptor. It can only be created by the hidden service - and its clients, but the "signature" below can only be created by - the service. + Note: If Bob's OP has "stealth" authorization enabled (see Section 2.2), + it uses the client key in place of the public hidden service key. - "descriptor-cookie" is an optional secret password of 128 bits that - is shared between the hidden service provider and its clients. + "H(time-period | descriptor-cookie | replica)" is the (possibly + secret) id part that is necessary to verify that the hidden service is + the true originator of this descriptor and that is therefore contained + in the descriptor, too. The descriptor ID can only be created by the + hidden service and its clients, but the "signature" below can only be + created by the service. - "replica" denotes the number of the non-consecutive replica. + "time-period" changes periodically as a function of time and - (Each descriptor is replicated on a number of _consecutive_ nodes - in the identifier ring by making every storing node responsible - for the identifier intervals starting from its 3rd predecessor's - ID to its own ID. In addition to that, every service publishes - multiple descriptors with different descriptor IDs in order to - distribute them to different places on the ring. Therefore, - "replica" chooses one of the _non-consecutive_ replicas. -KL) - - The "time-period" changes periodically depending on the global time and - as a function of "permanent-id". The current value for "time-period" can - be calculated using the following formula: + "permanent-id". The current value for "time-period" can be calculated + using the following formula: time-period = (current-time + permanent-id-byte * 86400 / 256) / 86400 @@ -231,6 +265,15 @@ of the overall operation is a (network-ordered) 32-bit integer, e.g. 13753 or 0x000035B9 with the example values given above. + "descriptor-cookie" is an optional secret password of 128 bits that + is shared between the hidden service provider and its clients. If the + descriptor-cookie is left out, the input to the hash function is 128 + bits shorter. + + "replica" denotes the number of the replica. A service publishes + multiple descriptors with different descriptor IDs in order to + distribute them to different places on the ring. + "version" version-number NL [Exactly once] @@ -284,13 +327,16 @@ The unencrypted string may begin with: - ["service-authentication" auth-type NL auth-data ... reserved] + "service-authentication" auth-type auth-data NL - [At start, any number] + [Any number] The service-specific authentication data can be used to perform client authentication. This data is independent of the selected - introduction point as opposed to "intro-authentication" below. + introduction point as opposed to "intro-authentication" below. The + format of auth-data (base64-encoded or PEM format) depends on + auth-type. See section 2 of this document for details on auth + mechanisms. Subsequently, an arbitrary number of introduction point entries may follow, each containing the following data: @@ -329,17 +375,23 @@ The public key that can be used to encrypt messages to the hidden service. - ["intro-authentication" auth-type NL auth-data ... reserved] + "intro-authentication" auth-type auth-data NL [Any number] The introduction-point-specific authentication data can be used to perform client authentication. This data depends on the selected introduction point as opposed to "service-authentication" - above. + above. The format of auth-data (base64-encoded or PEM format) + depends on auth-type. See section 2 of this document for details + on auth mechanisms. (This ends the fields in the encrypted portion of the descriptor.) + [It's ok for Bob to advertise 0 introduction points. He might want + to do that if he previously advertised some introduction points, + and now he doesn't have any. -RD] + "signature" NL signature-string [At end, exactly once] @@ -347,7 +399,22 @@ A signature of all fields above with the private key of the hidden service. -1.2.1. Other descriptor formats we don't use. +1.3.1. Other descriptor formats we don't use. + + Support for the V0 descriptor format was dropped in 0.2.2.0-alpha-dev: + + KL Key length [2 octets] + PK Bob's public key [KL octets] + TS A timestamp [4 octets] + NI Number of introduction points [2 octets] + Ipt A list of NUL-terminated ORs [variable] + SIG Signature of above fields [variable] + + KL is the length of PK, in octets. + TS is the number of seconds elapsed since Jan 1, 1970. + + The members of Ipt may be either (a) nicknames, or (b) identity key + digests, encoded in hex, and prefixed with a '$'. The V1 descriptor format was understood and accepted from 0.1.1.5-alpha-cvs to 0.2.0.6-alpha-dev, but no Tors generated it and @@ -401,56 +468,17 @@ Currently only AUTHT of [00 00] is supported, with an AUTHL of 0. See section 2 of this document for details on auth mechanisms. -1.3. Bob's OP establishes his introduction points. - - The OP establishes a new introduction circuit to each introduction - point. These circuits MUST NOT be used for anything but hidden service - introduction. To establish the introduction, Bob sends a - RELAY_ESTABLISH_INTRO cell, containing: - - KL Key length [2 octets] - PK Bob's public key [KL octets] - HS Hash of session info [20 octets] - SIG Signature of above information [variable] - - [XXX011, need to add auth information here. -RD] - - To prevent replay attacks, the HS field contains a SHA-1 hash based on the - shared secret KH between Bob's OP and the introduction point, as - follows: - HS = H(KH | "INTRODUCE") - That is: - HS = H(KH | [49 4E 54 52 4F 44 55 43 45]) - (KH, as specified in tor-spec.txt, is H(g^xy | [00]) .) - - Upon receiving such a cell, the OR first checks that the signature is - correct with the included public key. If so, it checks whether HS is - correct given the shared state between Bob's OP and the OR. If either - check fails, the OP discards the cell; otherwise, it associates the - circuit with Bob's public key, and dissociates any other circuits - currently associated with PK. On success, the OR sends Bob a - RELAY_INTRO_ESTABLISHED cell with an empty payload. - - If a hidden service is configured to publish only v2 hidden service - descriptors, Bob's OP does not include its own public key in the - RELAY_ESTABLISH_INTRO cell, but the public key of a freshly generated - key pair. The OP also includes these fresh public keys in the v2 hidden - service descriptor together with the other introduction point - information. The reason is that the introduction point does not need to - and therefore should not know for which hidden service it works, so as - to prevent it from tracking the hidden service's activity. If the hidden - service is configured to publish both, v0 and v2 descriptors, two - separate sets of introduction points are established. - 1.4. Bob's OP advertises his service descriptor(s). - Bob's OP opens a stream to each directory server's directory port via Tor. - (He may re-use old circuits for this.) Over this stream, Bob's OP makes - an HTTP 'POST' request, to a URL "/tor/rendezvous/publish" relative to the - directory server's root, containing as its body Bob's service descriptor. - - Bob should upload a service descriptor for each version format that - is supported in the current Tor network. + Bob's OP advertises his service descriptor to a fixed set of v0 hidden + service directory servers and/or a changing subset of all v2 hidden service + directories. + + For versions before 0.2.2.1-alpha, Bob's OP opens a stream to each v0 + directory server's directory port via Tor. (He may re-use old circuits for + this.) Over this stream, Bob's OP makes an HTTP 'POST' request, to a URL + "/tor/rendezvous/publish" relative to the directory server's root, + containing as its body Bob's service descriptor. Upon receiving a descriptor, the directory server checks the signature, and discards the descriptor if the signature does not match the enclosed @@ -464,13 +492,12 @@ after its timestamp. At least every 18 hours, Bob's OP uploads a fresh descriptor. - If Bob's OP is configured to publish v2 descriptors instead of or in - addition to v0 descriptors, it does so to a changing subset of all v2 - hidden service directories instead of the authoritative directory - servers. Therefore, Bob's OP opens a stream via Tor to each - responsible hidden service directory. (He may re-use old circuits - for this.) Over this stream, Bob's OP makes an HTTP 'POST' request to a - URL "/tor/rendezvous2/publish" relative to the hidden service + If Bob's OP is configured to publish v2 descriptors, it does so to a + changing subset of all v2 hidden service directories instead of the + authoritative directory servers. Therefore, Bob's OP opens a stream via + Tor to each responsible hidden service directory. (He may re-use old + circuits for this.) Over this stream, Bob's OP makes an HTTP 'POST' + request to a URL "/tor/rendezvous2/publish" relative to the hidden service directory's root, containing as its body Bob's service descriptor. At any time, there are 6 hidden service directories responsible for @@ -487,45 +514,41 @@ Bob's OP publishes a new v2 descriptor once an hour or whenever its content changes. V2 descriptors can be found by clients within a given time period of 24 hours, after which they change their ID as described - under 1.2. If a published descriptor would be valid for less than 60 + under 1.3. If a published descriptor would be valid for less than 60 minutes (= 2 x 30 minutes to allow the server to be 30 minutes behind and the client 30 minutes ahead), Bob's OP publishes the descriptor under the ID of both, the current and the next publication period. -1.5. Alice receives a x.y.z.onion address. +1.5. Alice receives a z.onion address. When Alice receives a pointer to a location-hidden service, it is as a - hostname of the form "z.onion" or "y.z.onion" or "x.y.z.onion", where - z is a base-32 encoding of a 10-octet hash of Bob's service's public - key, computed as follows: + hostname of the form "z.onion", where z is a base-32 encoding of a + 10-octet hash of Bob's service's public key, computed as follows: 1. Let H = H(PK). 2. Let H' = the first 80 bits of H, considering each octet from most significant bit to least significant bit. - 2. Generate a 16-character encoding of H', using base32 as defined + 3. Generate a 16-character encoding of H', using base32 as defined in RFC 3548. (We only use 80 bits instead of the 160 bits from SHA1 because we don't need to worry about arbitrary collisions, and because it will make handling the url's more convenient.) - The string "x", if present, is the base-32 encoding of the - authentication/authorization required by the introduction point. - The string "y", if present, is the base-32 encoding of the - authentication/authorization required by the hidden service. - Omitting a string is taken to mean auth type [00 00]. - See section 2 of this document for details on auth mechanisms. - [Yes, numbers are allowed at the beginning. See RFC 1123. -NM] 1.6. Alice's OP retrieves a service descriptor. - Alice opens a stream to a directory server via Tor, and makes an HTTP GET - request for the document '/tor/rendezvous/', where '' is replaced - with the encoding of Bob's public key as described above. (She may re-use - old circuits for this.) The directory replies with a 404 HTTP response if - it does not recognize , and otherwise returns Bob's most recently - uploaded service descriptor. + Alice's OP fetches the service descriptor from the fixed set of v0 hidden + service directory servers and/or a changing subset of all v2 hidden service + directories. + + For versions before 0.2.2.1-alpha, Alice's OP opens a stream to a directory + server via Tor, and makes an HTTP GET request for the document + '/tor/rendezvous/', where '' is replaced with the encoding of Bob's + public key as described above. (She may re-use old circuits for this.) The + directory replies with a 404 HTTP response if it does not recognize , + and otherwise returns Bob's most recently uploaded service descriptor. If Alice's OP receives a 404 response, it tries the other directory servers, and only fails the lookup if none recognize the public key hash. @@ -541,13 +564,15 @@ [Caching may make her partitionable, but she fetched it anonymously, and we can't very well *not* cache it. -RD] - Alice's OP fetches v2 descriptors in parallel to v0 descriptors. Similarly - to the description in section 1.4, the OP fetches a v2 descriptor from a - randomly chosen hidden service directory out of the changing subset of - 6 nodes. If the request is unsuccessful, Alice retries the other - remaining responsible hidden service directories in a random order. - Alice relies on Bob to care about a potential clock skew between the two - by possibly storing two sets of descriptors (see end of section 1.4). + If Alice's OP is running 0.2.1.10-alpha or higher, it fetches v2 hidden + service descriptors. Versions before 0.2.2.1-alpha are fetching both v0 and + v2 descriptors in parallel. Similar to the description in section 1.4, + Alice's OP fetches a v2 descriptor from a randomly chosen hidden service + directory out of the changing subset of 6 nodes. If the request is + unsuccessful, Alice retries the other remaining responsible hidden service + directories in a random order. Alice relies on Bob to care about a potential + clock skew between the two by possibly storing two sets of descriptors (see + end of section 1.4). Alice's OP opens a stream via Tor to the chosen v2 hidden service directory. (She may re-use old circuits for this.) Over this stream, @@ -563,19 +588,18 @@ and Alice's OP does not have an established circuit to that service, the OP builds a rendezvous circuit. It does this by establishing a circuit to a randomly chosen OR, and sending a - RELAY_ESTABLISH_RENDEZVOUS cell to that OR. The body of that cell + RELAY_COMMAND_ESTABLISH_RENDEZVOUS cell to that OR. The body of that cell contains: RC Rendezvous cookie [20 octets] - [XXX011 this looks like an auth mechanism. should we generalize here? -RD] - The rendezvous cookie is an arbitrary 20-byte value, chosen randomly by - Alice's OP. + Alice's OP. Alice SHOULD choose a new rendezvous cookie for each new + connection attempt. - Upon receiving a RELAY_ESTABLISH_RENDEZVOUS cell, the OR associates the - RC with the circuit that sent it. It replies to Alice with an empty - RELAY_RENDEZVOUS_ESTABLISHED cell to indicate success. + Upon receiving a RELAY_COMMAND_ESTABLISH_RENDEZVOUS cell, the OR associates + the RC with the circuit that sent it. It replies to Alice with an empty + RELAY_COMMAND_RENDEZVOUS_ESTABLISHED cell to indicate success. Alice's OP MUST NOT use the circuit which sent the cell for any purpose other than rendezvous with the given location-hidden service. @@ -583,7 +607,7 @@ 1.8. Introduction: from Alice's OP to Introduction Point Alice builds a separate circuit to one of Bob's chosen introduction - points, and sends it a RELAY_INTRODUCE1 cell containing: + points, and sends it a RELAY_COMMAND_INTRODUCE1 cell containing: Cleartext PK_ID Identifier for Bob's PK [20 octets] @@ -605,15 +629,32 @@ KEY Rendezvous point onion key [KLEN octets] RC Rendezvous cookie [20 octets] g^x Diffie-Hellman data, part 1 [128 octets] + OR (in the v3 intro protocol) + VER Version byte: set to 3. [1 octet] + AUTHT The auth type that is used [1 octet] + AUTHL Length of auth data [2 octets] + AUTHD Auth data [variable] + TS A timestamp [4 octets] + IP Rendezvous point's address [4 octets] + PORT Rendezvous point's OR port [2 octets] + ID Rendezvous point identity ID [20 octets] + KLEN Length of onion key [2 octets] + KEY Rendezvous point onion key [KLEN octets] + RC Rendezvous cookie [20 octets] + g^x Diffie-Hellman data, part 1 [128 octets] - PK_ID is the hash of Bob's public key. RP is NUL-padded and - terminated. In version 0, it must contain a nickname. In version 1, - it must contain EITHER a nickname or an identity key digest that is - encoded in hex and prefixed with a '$'. + PK_ID is the hash of Bob's public key or the service key, depending on the + hidden service descriptor version. In case of a v0 descriptor, Alice's OP + uses Bob's public key. If Alice has downloaded a v2 descriptor, she uses + the contained public key ("service-key"). + + RP is NUL-padded and terminated. In version 0 of the intro protocol, RP + must contain a nickname. In version 1, it must contain EITHER a nickname or + an identity key digest that is encoded in hex and prefixed with a '$'. The hybrid encryption to Bob's PK works just like the hybrid encryption in CREATE cells (see tor-spec). Thus the payload of the - version 0 RELAY_INTRODUCE1 cell on the wire will contain + version 0 RELAY_COMMAND_INTRODUCE1 cell on the wire will contain 20+42+16+20+20+128=246 bytes, and the version 1 and version 2 introduction formats have other sizes. @@ -622,51 +663,31 @@ v1, and v2 since 0.1.1.x. As of Tor 0.2.0.7-alpha and 0.1.2.18, clients switched to using the v2 intro format. - If Alice has downloaded a v2 descriptor, she uses the contained public - key ("service-key") instead of Bob's public key to create the - RELAY_INTRODUCE1 cell as described above. - -1.8.1. Other introduction formats we don't use. - - We briefly speculated about using the following format for the - "encrypted to Bob's PK" part of the introduction, but no Tors have - ever generated these. - - VER Version byte: set to 3. [1 octet] - ATYPE An address type (typically 4) [1 octet] - ADDR Rendezvous point's IP address [4 or 16 octets] - PORT Rendezvous point's OR port [2 octets] - AUTHT The auth type that is supported [2 octets] - AUTHL Length of auth data [1 octet] - AUTHD Auth data [variable] - ID Rendezvous point identity ID [20 octets] - KLEN Length of onion key [2 octets] - KEY Rendezvous point onion key [KLEN octets] - RC Rendezvous cookie [20 octets] - g^x Diffie-Hellman data, part 1 [128 octets] - 1.9. Introduction: From the Introduction Point to Bob's OP If the Introduction Point recognizes PK_ID as a public key which has - established a circuit for introductions as in 1.3 above, it sends the body - of the cell in a new RELAY_INTRODUCE2 cell down the corresponding circuit. - (If the PK_ID is unrecognized, the RELAY_INTRODUCE1 cell is discarded.) - - After sending the RELAY_INTRODUCE2 cell, the OR replies to Alice with an - empty RELAY_COMMAND_INTRODUCE_ACK cell. If no RELAY_INTRODUCE2 cell can - be sent, the OR replies to Alice with a non-empty cell to indicate an - error. (The semantics of the cell body may be determined later; the - current implementation sends a single '1' byte on failure.) + established a circuit for introductions as in 1.2 above, it sends the body + of the cell in a new RELAY_COMMAND_INTRODUCE2 cell down the corresponding + circuit. (If the PK_ID is unrecognized, the RELAY_COMMAND_INTRODUCE1 cell is + discarded.) + + After sending the RELAY_COMMAND_INTRODUCE2 cell to Bob, the OR replies to + Alice with an empty RELAY_COMMAND_INTRODUCE_ACK cell. If no + RELAY_COMMAND_INTRODUCE2 cell can be sent, the OR replies to Alice with a + non-empty cell to indicate an error. (The semantics of the cell body may be + determined later; the current implementation sends a single '1' byte on + failure.) - When Bob's OP receives the RELAY_INTRODUCE2 cell, it decrypts it with - the private key for the corresponding hidden service, and extracts the + When Bob's OP receives the RELAY_COMMAND_INTRODUCE2 cell, it decrypts it + with the private key for the corresponding hidden service, and extracts the rendezvous point's nickname, the rendezvous cookie, and the value of g^x chosen by Alice. 1.10. Rendezvous Bob's OP builds a new Tor circuit ending at Alice's chosen rendezvous - point, and sends a RELAY_RENDEZVOUS1 cell along this circuit, containing: + point, and sends a RELAY_COMMAND_RENDEZVOUS1 cell along this circuit, + containing: RC Rendezvous cookie [20 octets] g^y Diffie-Hellman [128 octets] KH Handshake digest [20 octets] @@ -674,7 +695,7 @@ (Bob's OP MUST NOT use this circuit for any other purpose.) If the RP recognizes RC, it relays the rest of the cell down the - corresponding circuit in a RELAY_RENDEZVOUS2 cell, containing: + corresponding circuit in a RELAY_COMMAND_RENDEZVOUS2 cell, containing: g^y Diffie-Hellman [128 octets] KH Handshake digest [20 octets] @@ -682,10 +703,10 @@ (If the RP does not recognize the RC, it discards the cell and tears down the circuit.) - When Alice's OP receives a RELAY_RENDEZVOUS2 cell on a circuit which - has sent a RELAY_ESTABLISH_RENDEZVOUS cell but which has not yet received - a reply, it uses g^y and H(g^xy) to complete the handshake as in the Tor - circuit extend process: they establish a 60-octet string as + When Alice's OP receives a RELAY_COMMAND_RENDEZVOUS2 cell on a circuit which + has sent a RELAY_COMMAND_ESTABLISH_RENDEZVOUS cell but which has not yet + received a reply, it uses g^y and H(g^xy) to complete the handshake as in + the Tor circuit extend process: they establish a 60-octet string as K = SHA1(g^xy | [00]) | SHA1(g^xy | [01]) | SHA1(g^xy | [02]) and generate KH = K[0..15] @@ -704,7 +725,7 @@ 1.11. Creating streams To open TCP connections to Bob's location-hidden service, Alice's OP sends - a RELAY_BEGIN cell along the established circuit, using the special + a RELAY_COMMAND_BEGIN cell along the established circuit, using the special address "", and a chosen port. Bob's OP chooses a destination IP and port, based on the configuration of the service connected to the circuit, and opens a TCP stream. From then on, Bob's OP treats the stream as an @@ -712,13 +733,190 @@ [ Except he doesn't include addr in the connected cell or the end cell. -RD] - Alice MAY send multiple RELAY_BEGIN cells along the circuit, to open - multiple streams to Bob. Alice SHOULD NOT send RELAY_BEGIN cells for any - other address along her circuit to Bob; if she does, Bob MUST reject them. + Alice MAY send multiple RELAY_COMMAND_BEGIN cells along the circuit, to open + multiple streams to Bob. Alice SHOULD NOT send RELAY_COMMAND_BEGIN cells + for any other address along her circuit to Bob; if she does, Bob MUST reject + them. 2. Authentication and authorization. -Foo. + The rendezvous protocol as described in Section 1 provides a few options + for implementing client-side authorization. There are two steps in the + rendezvous protocol that can be used for performing client authorization: + when downloading and decrypting parts of the hidden service descriptor and + at Bob's Tor client before contacting the rendezvous point. A service + provider can restrict access to his service at these two points to + authorized clients only. + + There are currently two authorization protocols specified that are + described in more detail below: + + 1. The first protocol allows a service provider to restrict access + to clients with a previously received secret key only, but does not + attempt to hide service activity from others. + + 2. The second protocol, albeit being feasible for a limited set of about + 16 clients, performs client authorization and hides service activity + from everyone but the authorized clients. + +2.1. Service with large-scale client authorization + + The first client authorization protocol aims at performing access control + while consuming as few additional resources as possible. This is the "basic" + authorization protocol. A service provider should be able to permit access + to a large number of clients while denying access for everyone else. + However, the price for scalability is that the service won't be able to hide + its activity from unauthorized or formerly authorized clients. + + The main idea of this protocol is to encrypt the introduction-point part + in hidden service descriptors to authorized clients using symmetric keys. + This ensures that nobody else but authorized clients can learn which + introduction points a service currently uses, nor can someone send a + valid INTRODUCE1 message without knowing the introduction key. Therefore, + a subsequent authorization at the introduction point is not required. + + A service provider generates symmetric "descriptor cookies" for his + clients and distributes them outside of Tor. The suggested key size is + 128 bits, so that descriptor cookies can be encoded in 22 base64 chars + (which can hold up to 22 * 5 = 132 bits, leaving 4 bits to encode the + authorization type (here: "0") and allow a client to distinguish this + authorization protocol from others like the one proposed below). + Typically, the contact information for a hidden service using this + authorization protocol looks like this: + + v2cbb2l4lsnpio4q.onion Ll3X7Xgz9eHGKCCnlFH0uz + + When generating a hidden service descriptor, the service encrypts the + introduction-point part with a single randomly generated symmetric + 128-bit session key using AES-CTR as described for v2 hidden service + descriptors in rend-spec. Afterwards, the service encrypts the session + key to all descriptor cookies using AES. Authorized client should be able + to efficiently find the session key that is encrypted for him/her, so + that 4 octet long client ID are generated consisting of descriptor cookie + and initialization vector. Descriptors always contain a number of + encrypted session keys that is a multiple of 16 by adding fake entries. + Encrypted session keys are ordered by client IDs in order to conceal + addition or removal of authorized clients by the service provider. + + ATYPE Authorization type: set to 1. [1 octet] + ALEN Number of clients := 1 + ((clients - 1) div 16) [1 octet] + for each symmetric descriptor cookie: + ID Client ID: H(descriptor cookie | IV)[:4] [4 octets] + SKEY Session key encrypted with descriptor cookie [16 octets] + (end of client-specific part) + RND Random data [(15 - ((clients - 1) mod 16)) * 20 octets] + IV AES initialization vector [16 octets] + IPOS Intro points, encrypted with session key [remaining octets] + + An authorized client needs to configure Tor to use the descriptor cookie + when accessing the hidden service. Therefore, a user adds the contact + information that she received from the service provider to her torrc + file. Upon downloading a hidden service descriptor, Tor finds the + encrypted introduction-point part and attempts to decrypt it using the + configured descriptor cookie. (In the rare event of two or more client + IDs being equal a client tries to decrypt all of them.) + + Upon sending the introduction, the client includes her descriptor cookie + as auth type "1" in the INTRODUCE2 cell that she sends to the service. + The hidden service checks whether the included descriptor cookie is + authorized to access the service and either responds to the introduction + request, or not. + +2.2. Authorization for limited number of clients + + A second, more sophisticated client authorization protocol goes the extra + mile of hiding service activity from unauthorized clients. This is the + "stealth" authorization protocol. With all else being equal to the preceding + authorization protocol, the second protocol publishes hidden service + descriptors for each user separately and gets along with encrypting the + introduction-point part of descriptors to a single client. This allows the + service to stop publishing descriptors for removed clients. As long as a + removed client cannot link descriptors issued for other clients to the + service, it cannot derive service activity any more. The downside of this + approach is limited scalability. Even though the distributed storage of + descriptors (cf. proposal 114) tackles the problem of limited scalability to + a certain extent, this protocol should not be used for services with more + than 16 clients. (In fact, Tor should refuse to advertise services for more + than this number of clients.) + + A hidden service generates an asymmetric "client key" and a symmetric + "descriptor cookie" for each client. The client key is used as + replacement for the service's permanent key, so that the service uses a + different identity for each of his clients. The descriptor cookie is used + to store descriptors at changing directory nodes that are unpredictable + for anyone but service and client, to encrypt the introduction-point + part, and to be included in INTRODUCE2 cells. Once the service has + created client key and descriptor cookie, he tells them to the client + outside of Tor. The contact information string looks similar to the one + used by the preceding authorization protocol (with the only difference + that it has "1" encoded as auth-type in the remaining 4 of 132 bits + instead of "0" as before). + + When creating a hidden service descriptor for an authorized client, the + hidden service uses the client key and descriptor cookie to compute + secret ID part and descriptor ID: + + secret-id-part = H(time-period | descriptor-cookie | replica) + + descriptor-id = H(client-key[:10] | secret-id-part) + + The hidden service also replaces permanent-key in the descriptor with + client-key and encrypts introduction-points with the descriptor cookie. + + ATYPE Authorization type: set to 2. [1 octet] + IV AES initialization vector [16 octets] + IPOS Intro points, encr. with descriptor cookie [remaining octets] + + When uploading descriptors, the hidden service needs to make sure that + descriptors for different clients are not uploaded at the same time (cf. + Section 1.1) which is also a limiting factor for the number of clients. + + When a client is requested to establish a connection to a hidden service + it looks up whether it has any authorization data configured for that + service. If the user has configured authorization data for authorization + protocol "2", the descriptor ID is determined as described in the last + paragraph. Upon receiving a descriptor, the client decrypts the + introduction-point part using its descriptor cookie. Further, the client + includes its descriptor cookie as auth-type "2" in INTRODUCE2 cells that + it sends to the service. + +2.3. Hidden service configuration + + A hidden service that is meant to perform client authorization adds a + new option HiddenServiceAuthorizeClient to its hidden service + configuration. This option contains the authorization type which is + either "basic" for the protocol described in 2.1 or "stealth" for the + protocol in 2.2 and a comma-separated list of human-readable client + names, so that Tor can create authorization data for these clients: + + HiddenServiceAuthorizeClient auth-type client-name,client-name,... + + If this option is configured, HiddenServiceVersion is automatically + reconfigured to contain only version numbers of 2 or higher. There is + a maximum of 512 client names for basic auth and a maximum of 16 for + stealth auth. + + Tor stores all generated authorization data for the authorization + protocols described in Sections 2.1 and 2.2 in a new file using the + following file format: + + "client-name" human-readable client identifier NL + "descriptor-cookie" 128-bit key ^= 22 base64 chars NL + + If the authorization protocol of Section 2.2 is used, Tor also generates + and stores the following data: + + "client-key" NL a public key in PEM format + +2.4. Client configuration + + Clients need to make their authorization data known to Tor using another + configuration option that contains a service name (mainly for the sake of + convenience), the service address, and the descriptor cookie that is + required to access a hidden service (the authorization protocol number is + encoded in the descriptor cookie): + + HidServAuth service-name service-address descriptor-cookie 3. Hidden service directory operation @@ -743,9 +941,9 @@ Hidden service directory nodes accept publish requests for v2 hidden service descriptors and store them to their local memory. (It is not necessary to make descriptors persistent, because after restarting, the onion router - would not be accepted as storing node anyway, because it has not been + would not be accepted as a storing node anyway, because it has not been running for at least 24 hours.) All requests and replies are formatted as - HTTP messages. Requests are contained within BEGIN_DIR cells, directed to + HTTP messages. Requests are initiated via BEGIN_DIR cells directed to the router's directory port, and formatted as HTTP POST requests to the URL "/tor/rendezvous2/publish" relative to the hidden service directory's root, containing as its body a v2 service descriptor. @@ -762,7 +960,7 @@ determine if they are responsible for the passed ID, because it does no harm if they deliver a descriptor for which they are not (any more) responsible.) All requests and replies are formatted as HTTP messages. Requests are - contained within BEGIN_DIR cells, directed to the router's directory port, + initiated via BEGIN_DIR cells directed to the router's directory port, and formatted as HTTP GET requests for the document "/tor/rendezvous2/", where z is replaced with the encoding of the descriptor ID. diff -Nru tor-0.2.0.34/doc/spec/socks-extensions.txt tor-0.2.2.16-alpha/doc/spec/socks-extensions.txt --- tor-0.2.0.34/doc/spec/socks-extensions.txt 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/spec/socks-extensions.txt 2009-11-17 20:37:02.000000000 +0000 @@ -1,4 +1,3 @@ -$Id: socks-extensions.txt 12253 2007-10-28 18:29:29Z nickm $ Tor's extensions to the SOCKS protocol 1. Overview diff -Nru tor-0.2.0.34/doc/spec/tor-spec.txt tor-0.2.2.16-alpha/doc/spec/tor-spec.txt --- tor-0.2.0.34/doc/spec/tor-spec.txt 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/spec/tor-spec.txt 2010-09-17 01:30:36.000000000 +0000 @@ -1,13 +1,14 @@ -$Id: tor-spec.txt 12218 2007-10-26 22:50:40Z nickm $ Tor Protocol Specification Roger Dingledine Nick Mathewson -Note: This document aims to specify Tor as implemented in 0.1.2.x -and earlier. Future versions of Tor may implement improved protocols, and -compatibility is not guaranteed. +Note: This document aims to specify Tor as implemented in 0.2.1.x. Future +versions of Tor may implement improved protocols, and compatibility is not +guaranteed. Compatibility notes are given for versions 0.1.1.15-rc and +later; earlier versions are not compatible with the Tor network as of this +writing. This specification is not a design document; most design criteria are not examined. For more information on why Tor acts as it does, @@ -15,11 +16,16 @@ 0. Preliminaries + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL + NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + RFC 2119. + 0.1. Notation and encoding PK -- a public key. SK -- a private key. - K -- a key for a symmetric cypher. + K -- a key for a symmetric cipher. a|b -- concatenation of 'a' and 'b'. @@ -59,11 +65,9 @@ For a public-key cipher, we use RSA with 1024-bit keys and a fixed exponent of 65537. We use OAEP-MGF1 padding, with SHA-1 as its digest - function. We leave optional the "Label" parameter unset. (For OAEP + function. We leave the optional "Label" parameter unset. (For OAEP padding, see ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf) - [Nick, what does "we leave optional the Label parameter unset" mean? -RD] - For Diffie-Hellman, we use a generator (g) of 2. For the modulus (p), we use the 1024-bit safe prime from rfc2409 section 6.2 whose hex representation is: @@ -143,14 +147,73 @@ 2. Connections - Tor uses TLS/SSLv3 for link authentication and encryption. All + Connections between two Tor servers, or between a client and a server, + use TLS/SSLv3 for link authentication and encryption. All implementations MUST support the SSLv3 ciphersuite "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", and SHOULD support the TLS ciphersuite "TLS_DHE_RSA_WITH_AES_128_CBC_SHA" if it is available. - Implementations MAY support other TLS ciphersuites, but MUST NOT - support any suite that lacks ephemeral keys, or whose symmetric keys are - less then KEY_LEN bits, or whose digests are less than HASH_LEN bits. - Implementations SHOULD NOT allow other SSLv3 ciphersuites. + + There are three acceptable ways to perform a TLS handshake when + connecting to a Tor server: "certificates up-front", "renegotiation", and + "backwards-compatible renegotiation". ("Backwards-compatible + renegotiation" is, as the name implies, compatible with both other + handshake types.) + + Before Tor 0.2.0.21, only "certificates up-front" was supported. In Tor + 0.2.0.21 or later, "backwards-compatible renegotiation" is used. + + In "certificates up-front", the connection initiator always sends a + two-certificate chain, consisting of an X.509 certificate using a + short-term connection public key and a second, self- signed X.509 + certificate containing its identity key. The other party sends a similar + certificate chain. The initiator's ClientHello MUST NOT include any + ciphersuites other than: + TLS_DHE_RSA_WITH_AES_256_CBC_SHA + TLS_DHE_RSA_WITH_AES_128_CBC_SHA + SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA + SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA + + In "renegotiation", the connection initiator sends no certificates, and + the responder sends a single connection certificate. Once the TLS + handshake is complete, the initiator renegotiates the handshake, with each + party sending a two-certificate chain as in "certificates up-front". + The initiator's ClientHello MUST include at least one ciphersuite not in + the list above. The responder SHOULD NOT select any ciphersuite besides + those in the list above. + [The above "should not" is because some of the ciphers that + clients list may be fake.] + + In "backwards-compatible renegotiation", the connection initiator's + ClientHello MUST include at least one ciphersuite other than those listed + above. The connection responder examines the initiator's ciphersuite list + to see whether it includes any ciphers other than those included in the + list above. If extra ciphers are included, the responder proceeds as in + "renegotiation": it sends a single certificate and does not request + client certificates. Otherwise (in the case that no extra ciphersuites + are included in the ClientHello) the responder proceeds as in + "certificates up-front": it requests client certificates, and sends a + two-certificate chain. In either case, once the responder has sent its + certificate or certificates, the initiator counts them. If two + certificates have been sent, it proceeds as in "certificates up-front"; + otherwise, it proceeds as in "renegotiation". + + All new implementations of the Tor server protocol MUST support + "backwards-compatible renegotiation"; clients SHOULD do this too. If + this is not possible, new client implementations MUST support both + "renegotiation" and "certificates up-front" and use the router's + published link protocols list (see dir-spec.txt on the "protocols" entry) + to decide which to use. + + In all of the above handshake variants, certificates sent in the clear + SHOULD NOT include any strings to identify the host as a Tor server. In + the "renegotiation" and "backwards-compatible renegotiation" steps, the + initiator SHOULD choose a list of ciphersuites and TLS extensions + to mimic one used by a popular web browser. + + Responders MUST NOT select any TLS ciphersuite that lacks ephemeral keys, + or whose symmetric keys are less then KEY_LEN bits, or whose digests are + less than HASH_LEN bits. Responders SHOULD NOT select any SSLv3 + ciphersuite other than those listed above. Even though the connection protocol is identical, we will think of the initiator as either an onion router (OR) if it is willing to relay @@ -158,21 +221,9 @@ local requests. Onion proxies SHOULD NOT provide long-term-trackable identifiers in their handshakes. - During the TLS handshake, the connection initiator always sends a - two-certificate chain, consisting of an X.509 certificate using a - short-term connection public key and a second, self- signed X.509 - certificate containing its identity key. The commonName of the first - certificate is the OR's nickname, and the commonName of the second - certificate is the OR's nickname, followed by a space and the string - "". The other party sends a similar certificate chain. - - Implementations running Protocol 1 and earlier use an - organizationName of "Tor" or "TOR". Future implementations (which - support the version negotiation protocol in section 4.1) MUST NOT - have either of these values for their organizationName. - - All parties receiving certificates must confirm that the identity key is - as expected. (When initiating a connection, the expected identity key is + In all handshake variants, once all certificates are exchanged, all + parties receiving certificates must confirm that the identity key is as + expected. (When initiating a connection, the expected identity key is the one given in the directory; when creating a connection because of an EXTEND cell, the expected identity key is the one given in the cell.) If the key is not as expected, the party must close the connection. @@ -204,6 +255,11 @@ (As an exception, directory servers may try to stay connected to all of the ORs -- though this will be phased out for the Tor 0.1.2.x release.) + To avoid being trivially distinguished from servers, client-only Tor + instances are encouraged but not required to use a two-certificate chain + as well. Clients SHOULD NOT keep using the same certificates when + their IP address changes. Clients MAY send no certificates at all. + 3. Cell Packet format The basic unit of communication for onion routers and onion @@ -216,6 +272,14 @@ Command [1 byte] Payload (padded with 0 bytes) [PAYLOAD_LEN bytes] + On a version 2 connection, all cells are as in version 1 connections, + except for the initial VERSIONS cell, whose format is: + + Circuit [2 octets; set to 0] + Command [1 octet; set to 7 for VERSIONS] + Length [2 octets; big-endian integer] + Payload [Length bytes] + The CircID field determines which circuit, if any, the cell is associated with. @@ -227,6 +291,9 @@ 4 -- DESTROY (Stop using a circuit) (See Sec 5.4) 5 -- CREATE_FAST (Create a circuit, no PK) (See Sec 5.1) 6 -- CREATED_FAST (Circuit created, no PK) (See Sec 5.1) + 7 -- VERSIONS (Negotiate proto version) (See Sec 4) + 8 -- NETINFO (Time and address info) (See Sec 4) + 9 -- RELAY_EARLY (End-to-end data; limited)(See Sec 5.6) The interpretation of 'Payload' depends on the type of the cell. PADDING: Payload is unused. @@ -236,8 +303,8 @@ DESTROY: Payload contains a reason for closing the circuit. (see 5.4) Upon receiving any other value for the command field, an OR must - drop the cell. [XXXX Versions prior to 0.1.0.?? logged a warning - when dropping the cell; this is bad behavior. -NM] + drop the cell. Since more cell types may be added in the future, ORs + should generally not warn when encountering unrecognized commands. The payload is padded with 0 bytes. @@ -246,12 +313,64 @@ cell every few minutes. CREATE, CREATED, and DESTROY cells are used to manage circuits; - see section 4 below. + see section 5 below. RELAY cells are used to send commands and data along a circuit; see - section 5 below. + section 6 below. + + VERSIONS and NETINFO cells are used to set up connections. See section 4 + below. + +4. Negotiating and initializing connections + +4.1. Negotiating versions with VERSIONS cells + + There are multiple instances of the Tor link connection protocol. Any + connection negotiated using the "certificates up front" handshake (see + section 2 above) is "version 1". In any connection where both parties + have behaved as in the "renegotiation" handshake, the link protocol + version is 2 or higher. + + To determine the version, in any connection where the "renegotiation" + handshake was used (that is, where the server sent only one certificate + at first and where the client did not send any certificates until + renegotiation), both parties MUST send a VERSIONS cell immediately after + the renegotiation is finished, before any other cells are sent. Parties + MUST NOT send any other cells on a connection until they have received a + VERSIONS cell. + + The payload in a VERSIONS cell is a series of big-endian two-byte + integers. Both parties MUST select as the link protocol version the + highest number contained both in the VERSIONS cell they sent and in the + versions cell they received. If they have no such version in common, + they cannot communicate and MUST close the connection. + + Since the version 1 link protocol does not use the "renegotiation" + handshake, implementations MUST NOT list version 1 in their VERSIONS + cell. + +4.2. NETINFO cells + + If version 2 or higher is negotiated, each party sends the other a + NETINFO cell. The cell's payload is: + + Timestamp [4 bytes] + Other OR's address [variable] + Number of addresses [1 byte] + This OR's addresses [variable] + + The address format is a type/length/value sequence as given in section + 6.4 below. The timestamp is a big-endian unsigned integer number of + seconds since the Unix epoch. + + Implementations MAY use the timestamp value to help decide if their + clocks are skewed. Initiators MAY use "other OR's address" to help + learn which address their connections are originating from, if they do + not know it. Initiators SHOULD use "this OR's address" to make sure + that they have connected to another OR at its canonical address. + + [As of 0.2.0.23-rc, implementations use none of the above values.] -4. [This section deliberately left blank.] 5. Circuit management @@ -271,7 +390,7 @@ This value is hybrid-encrypted (see 0.3) to Bob's onion key, giving an onion-skin of: PK-encrypted: - Padding padding [PK_PAD_LEN bytes] + Padding [PK_PAD_LEN bytes] Symmetric key [KEY_LEN bytes] First part of g^x [PK_ENC_LEN-PK_PAD_LEN-KEY_LEN bytes] Symmetrically encrypted: @@ -284,12 +403,12 @@ Onion skin [DH_LEN+KEY_LEN+PK_PAD_LEN bytes] Identity fingerprint [HASH_LEN bytes] - The port and address field denote the IPV4 address and port of the next + The port and address field denote the IPv4 address and port of the next onion router in the circuit; the public key hash is the hash of the PKCS#1 ASN1 encoding of the next onion router's identity (signing) key. (See 0.3 - above.) (Including this hash allows the extending OR verify that it is + above.) Including this hash allows the extending OR verify that it is indeed connected to the correct target OR, and prevents certain - man-in-the-middle attacks.) + man-in-the-middle attacks. The payload for a CREATED cell, or the relay payload for an EXTENDED cell, contains: @@ -310,11 +429,6 @@ As usual with DH, x and y MUST be generated randomly. -[ - To implement backward-compatible version negotiation, parties MUST - drop CREATE cells with all-[00] onion-skins. -] - 5.1.1. CREATE_FAST/CREATED_FAST cells When initializing the first hop of a circuit, the OP has already @@ -336,9 +450,6 @@ The values of X and Y must be generated randomly. - [Versions of Tor before 0.1.0.6-rc did not support these cell types; - clients should not send CREATE_FAST cells to older Tor servers.] - If an OR sees a circuit created with CREATE_FAST, the OR is sure to be the first hop of a circuit. ORs SHOULD reject attempts to create streams with RELAY_BEGIN exiting the circuit at the first hop: letting Tor be used as a @@ -360,10 +471,6 @@ the server. Discarding other keys may allow attacks to learn bits of the private key.) - (The mainline Tor implementation, in the 0.1.1.x-alpha series, discarded - all g^x values less than 2^24, greater than p-2^24, or having more than - 1024-16 identical bits. This served no useful purpose, and we stopped.) - If CREATE or EXTEND is used to extend a circuit, the client and server base their key material on K0=g^xy, represented as a big-endian unsigned integer. @@ -426,10 +533,12 @@ When an onion router receives an EXTEND relay cell, it sends a CREATE cell to the next onion router, with the enclosed onion skin as its - payload. The initiating onion router chooses some circID not yet - used on the connection between the two onion routers. (But see - section 5.1. above, concerning choosing circIDs based on - lexicographic order of nicknames.) + payload. As special cases, if the extend cell includes a digest of + all zeroes, or asks to extend back to the relay that sent the extend + cell, the circuit will fail and be torn down. The initiating onion + router chooses some circID not yet used on the connection between the + two onion routers. (But see section 5.1. above, concerning choosing + circIDs based on lexicographic order of nicknames.) When an onion router receives a CREATE cell, if it already has a circuit on the given connection with the given circID, it drops the @@ -443,6 +552,26 @@ until a break in traffic allows time to do so without harming network latency too greatly.) +5.3.1. Canonical connections + + It is possible for an attacker to launch a man-in-the-middle attack + against a connection by telling OR Alice to extend to OR Bob at some + address X controlled by the attacker. The attacker cannot read the + encrypted traffic, but the attacker is now in a position to count all + bytes sent between Alice and Bob (assuming Alice was not already + connected to Bob.) + + To prevent this, when an OR we gets an extend request, it SHOULD use an + existing OR connection if the ID matches, and ANY of the following + conditions hold: + - The IP matches the requested IP. + - The OR knows that the IP of the connection it's using is canonical + because it was listed in the NETINFO cell. + - The OR knows that the IP of the connection it's using is canonical + because it was listed in the server descriptor. + + [This is not implemented in Tor 0.2.0.23-rc.] + 5.4. Tearing down circuits Circuits are torn down when an unrecoverable error occurs along @@ -468,6 +597,14 @@ cell to the next node in the circuit, and replies to the OP with a RELAY_TRUNCATED cell. + [Note: If an OR receives a TRUNCATE cell and it has any RELAY cells + still queued on the circuit for the next node it will drop them + without sending them. This is not considered conformant behavior, + but it probably won't get fixed until a later version of Tor. Thus, + clients SHOULD NOT send a TRUNCATE cell to a node running any current + version of Tor if a) they have sent relay cells through that node, + and b) they aren't sure whether those cells have been sent on yes.] + When an unrecoverable error occurs along one connection in a circuit, the nodes on either side of the connection should, if they are able, act as follows: the node closer to the OP should send a @@ -497,14 +634,11 @@ 11 -- DESTROYED (The circuit was destroyed w/o client TRUNCATE) 12 -- NOSUCHSERVICE (Request for unknown hidden service) - [Versions of Tor prior to 0.1.0.11 didn't send reasons; implementations - MUST accept empty TRUNCATED and DESTROY cells.] - 5.5. Routing relay cells - When an OR receives a RELAY cell, it checks the cell's circID and - determines whether it has a corresponding circuit along that - connection. If not, the OR drops the RELAY cell. + When an OR receives a RELAY or RELAY_EARLY cell, it checks the cell's + circID and determines whether it has a corresponding circuit along that + connection. If not, the OR drops the cell. Otherwise, if the OR is not at the OP edge of the circuit (that is, either an 'exit node' or a non-edge node), it de/encrypts the payload @@ -532,6 +666,27 @@ For more information, see section 6 below. +5.6. Handling relay_early cells + + A RELAY_EARLY cell is designed to limit the length any circuit can reach. + When an OR receives a RELAY_EARLY cell, and the next node in the circuit + is speaking v2 of the link protocol or later, the OR relays the cell as a + RELAY_EARLY cell. Otherwise, it relays it as a RELAY cell. + + If a node ever receives more than 8 RELAY_EARLY cells on a given + outbound circuit, it SHOULD close the circuit. (For historical reasons, + we don't limit the number of inbound RELAY_EARLY cells; they should + be harmless anyway because clients won't accept extend requests. See + bug 1038.) + + When speaking v2 of the link protocol or later, clients MUST only send + EXTEND cells inside RELAY_EARLY cells. Clients SHOULD send the first ~8 + RELAY cells that are not targeted at the first hop of any circuit as + RELAY_EARLY cells too, in order to partially conceal the circuit length. + + [In a future version of Tor, servers will reject any EXTEND cell not + received in a RELAY_EARLY cell. See proposal 110.] + 6. Application connections and stream management 6.1. Relay cells @@ -603,9 +758,7 @@ If the RELAY cell is recognized but the relay command is not understood, the cell must be dropped and ignored. Its contents - still count with respect to the digests, though. [Before - 0.1.1.10, Tor closed circuits when it received an unknown relay - command. Perhaps this will be more forward-compatible. -RD] + still count with respect to the digests, though. 6.2. Opening streams and transferring data @@ -637,10 +790,9 @@ An address type (6) [1 octet] The IPv6 address to which the connection was made [16 octets] A number of seconds (TTL) for which the address may be cached [4 octets] - [XXXX Versions of Tor before 0.1.1.6 ignore and do not generate the TTL - field. No version of Tor currently generates the IPv6 format. + [XXXX No version of Tor currently generates the IPv6 format.] - Tor servers before 0.1.2.0 set the TTL field to a fixed value. Later + [Tor servers before 0.1.2.0 set the TTL field to a fixed value. Later versions set the TTL to the last value seen from a DNS server, and expire their own cached entries after a fixed interval. This prevents certain attacks.] @@ -691,7 +843,8 @@ 6 -- REASON_DONE (Anonymized TCP connection was closed) 7 -- REASON_TIMEOUT (Connection timed out, or OR timed out while connecting) - 8 -- (unallocated) [**] + 8 -- REASON_NOROUTE (Routing error while attempting to + contact destination) 9 -- REASON_HIBERNATING (OR is temporarily hibernating) 10 -- REASON_INTERNAL (Internal error at the OR) 11 -- REASON_RESOURCELIMIT (OR has no resources to fulfill request) @@ -702,16 +855,17 @@ non-directory server.) (With REASON_EXITPOLICY, the 4-byte IPv4 address or 16-byte IPv6 address - forms the optional data; no other reason currently has extra data. - As of 0.1.1.6, the body also contains a 4-byte TTL.) + forms the optional data, along with a 4-byte TTL; no other reason + currently has extra data.) OPs and ORs MUST accept reasons not on the above list, since future versions of Tor may provide more fine-grained reasons. + Tors SHOULD NOT send any reason except REASON_MISC for a stream that they + have originated. + [*] Older versions of Tor also send this reason when connections are reset. - [**] Due to a bug in versions of Tor through 0095, error reason 8 must - remain allocated until that version is obsolete. --- [The rest of this section describes unimplemented functionality.] @@ -743,10 +897,11 @@ 6.4. Remote hostname lookup To find the address associated with a hostname, the OP sends a - RELAY_RESOLVE cell containing the hostname to be resolved. (For a reverse - lookup, the OP sends a RELAY_RESOLVE cell containing an in-addr.arpa - address.) The OR replies with a RELAY_RESOLVED cell containing a status - byte, and any number of answers. Each answer is of the form: + RELAY_RESOLVE cell containing the hostname to be resolved with a NUL + terminating byte. (For a reverse lookup, the OP sends a RELAY_RESOLVE + cell containing an in-addr.arpa address.) The OR replies with a + RELAY_RESOLVED cell containing a status byte, and any number of + answers. Each answer is of the form: Type (1 octet) Length (1 octet) Value (variable-width) @@ -769,12 +924,26 @@ 7.1. Link throttling - Each node should do appropriate bandwidth throttling to keep its - user happy. + Each client or relay should do appropriate bandwidth throttling to + keep its user happy. Communicants rely on TCP's default flow control to push back when they stop reading. + The mainline Tor implementation uses token buckets (one for reads, + one for writes) for the rate limiting. + + Since 0.2.0.x, Tor has let the user specify an additional pair of + token buckets for "relayed" traffic, so people can deploy a Tor relay + with strict rate limiting, but also use the same Tor as a client. To + avoid partitioning concerns we combine both classes of traffic over a + given OR connection, and keep track of the last time we read or wrote + a high-priority (non-relayed) cell. If it's been less than N seconds + (currently N=30), we give the whole connection high priority, else we + give the whole connection low priority. We also give low priority + to reads and writes for connections that are serving directory + information. See proposal 111 for details. + 7.2. Link padding Link padding can be created by sending PADDING cells along the @@ -826,7 +995,6 @@ cells when both a) the window is <= 450, and b) there are less than ten cell payloads remaining to be flushed at that edge. - A.1. Differences between spec and implementation - The current specification requires all ORs to have IPv4 addresses, but diff -Nru tor-0.2.0.34/doc/spec/version-spec.txt tor-0.2.2.16-alpha/doc/spec/version-spec.txt --- tor-0.2.0.34/doc/spec/version-spec.txt 2008-02-26 19:56:31.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/spec/version-spec.txt 2009-11-17 20:37:02.000000000 +0000 @@ -1,4 +1,3 @@ -$Id: version-spec.txt 9683 2007-02-28 18:08:58Z nickm $ HOW TOR VERSION NUMBERS WORK @@ -23,7 +22,7 @@ After 0.1.0, versions are of the format: MAJOR.MINOR.MICRO(.PATCHLEVEL)(-status_tag) - The stuff in parenthesis is optional. As before, MAJOR, MINOR, MICRO, + The stuff in parentheses is optional. As before, MAJOR, MINOR, MICRO, and PATCHLEVEL are numbers, with an absent number equivalent to 0. All versions should be distinguishable purely by those four numbers. The status tag is purely informational, and lets you know how @@ -36,7 +35,7 @@ Now, we start each development branch with (say) 0.1.1.1-alpha. The patchlevel increments consistently as the status tag changes, for - example, as in: 0.1.1.2-alpha, 0.1.1.3-alpha, 0.1.1.4-rc 0.1.1.5-rc, + example, as in: 0.1.1.2-alpha, 0.1.1.3-alpha, 0.1.1.4-rc, 0.1.1.5-rc. Eventually, we release 0.1.1.6. The next patch release is 0.1.1.7. Between these releases, CVS is versioned with a -cvs tag: after diff -Nru tor-0.2.0.34/doc/TODO tor-0.2.2.16-alpha/doc/TODO --- tor-0.2.0.34/doc/TODO 2008-05-27 18:57:36.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/TODO 2009-11-17 20:37:02.000000000 +0000 @@ -1,4 +1,11 @@ -This file is obsolete. Go look at the one in trunk, e.g. -https://www.torproject.org/svn/trunk/doc/TODO +We've split out our TODO into three files: + +TODO.02x is the list of items we're planning to get done in the next +stable release. + +TODO.external lives in svn under /projects/todo/. It's the list of +external constraints and deliverables that we all need to keep in mind. + +TODO.future is the list of other items we plan to get to in later releases. diff -Nru tor-0.2.0.34/doc/tor.1.in tor-0.2.2.16-alpha/doc/tor.1.in --- tor-0.2.0.34/doc/tor.1.in 2008-11-12 10:47:38.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor.1.in 2010-08-18 23:06:15.000000000 +0000 @@ -1,1423 +1,1337 @@ -.TH TOR 1 "February 2008" "TOR" -.SH NAME +.\" Title: tor +.\" Author: +.\" Generator: DocBook XSL Stylesheets v1.73.2 +.\" Date: 08/18/2010 +.\" Manual: +.\" Source: +.\" +.TH "TOR" "1" "08/18/2010" "" "" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "NAME" tor \- The second-generation onion router -.SH SYNOPSIS -.B tor -[\fIOPTION value\fR]... -.SH DESCRIPTION -.I tor -is a connection-oriented anonymizing communication -service. Users choose a source-routed path through a set of nodes, and -negotiate a "virtual circuit" through the network, in which each node -knows its predecessor and successor, but no others. Traffic flowing down -the circuit is unwrapped by a symmetric key at each node, which reveals -the downstream node. -.PP -Basically \fItor\fR provides a distributed network of servers ("onion -routers"). Users bounce their TCP streams -- web traffic, ftp, ssh, etc -- -around the routers, and recipients, observers, and even the routers -themselves have difficulty tracking the source of the stream. -.SH OPTIONS -\fB-h, -help\fP -Display a short help message and exit. -.LP -.TP -\fB-f \fR\fIFILE\fP -FILE contains further "option value" pairs. (Default: @CONFDIR@/torrc) -.LP -.TP -\fB--hash-password\fP -Generates a hashed password for control port access. -.LP -.TP -\fB--list-fingerprint\fP -Generate your keys and output your nickname and fingerprint. -.LP -.TP -\fB--verify-config\fP -Verify the configuration file is valid. -.LP -.TP -\fB--nt-service\fP -\fB--service [install|remove|start|stop]\fP -Manage the Tor Windows NT/2000/XP service. Current instructions can -be found at http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#WinNTService -.LP -.TP -\fB--list-torrc-options\fP -List all valid options. -.LP -.TP -\fB--version\fP -Display Tor version and exit. -.LP -.TP -\fB--quiet\fP -Do not start Tor with a console log unless explicitly requested to do -so. (By default, Tor starts out logging messages at level "notice" or -higher to the console, until it has parsed its configuration.) -.LP -.TP -Other options can be specified either on the command-line (\fI--option -value\fR), or in the configuration file (\fIoption value\fR or -\fIoption "value"\fR). Options are case-insensitive. C-style escaped -characters are allowed inside quoted values. -.LP -.TP -\fBBandwidthRate \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP -A token bucket limits the average incoming bandwidth usage on this node -to the specified number of bytes per second, and the average outgoing -bandwidth usage to that same value. (Default: 5 MB) -.LP -.TP -\fBBandwidthBurst \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP -Limit the maximum token bucket size (also known as the burst) to the -given number of bytes in each direction. (Default: 10 MB) -.LP -.TP -\fBMaxAdvertisedBandwidth \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP -If set, we will not advertise more than this amount of bandwidth for our -BandwidthRate. Server operators who want to reduce the number of clients -who ask to build circuits through them (since this is proportional to -advertised bandwidth rate) can thus reduce the CPU demands on their -server without impacting network performance. -.LP -.TP -\fBRelayBandwidthRate \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP -If defined, a separate token bucket limits the average incoming bandwidth -usage for _relayed traffic_ on this node to the specified number of -bytes per second, and the average outgoing bandwidth usage to that same -value. Relayed traffic currently is calculated to include answers to directory -requests, but that may change in future versions. (Default: 0) -.LP -.TP -\fBRelayBandwidthBurst \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP -Limit the maximum token bucket size (also known as the burst) for -_relayed traffic_ to the -given number of bytes in each direction. (Default: 0) -.LP -.TP -\fBConnLimit \fR\fINUM\fP -The minimum number of file descriptors that must be available to -the Tor process before it will start. Tor will ask the OS for as -many file descriptors as the OS will allow (you can find this -by "ulimit -H -n"). If this number is less than ConnLimit, then -Tor will refuse to start. - -You probably don't need to adjust this. It has no effect on -Windows since that platform lacks getrlimit(). (Default: 1000) -.LP -.TP -\fBConstrainedSockets \fR\fB0\fR|\fB1\fR\fP -If set, Tor will tell the kernel to attempt to shrink the buffers for all -sockets to the size specified in \fBConstrainedSockSize\fP. This is useful -for virtual servers and other environments where system level TCP -buffers may be limited. If you're on a virtual server, and you -encounter the "Error creating network -socket: No buffer space available" message, you are likely experiencing -this problem. - -The preferred solution is to have the admin increase the buffer pool for -the host itself via /proc/sys/net/ipv4/tcp_mem or equivalent facility; this -configuration option is a second-resort. +.SH "SYNOPSIS" +\fBtor\fR [\fIOPTION\fR \fIvalue\fR]\&... +.sp +.SH "DESCRIPTION" +\fItor\fR is a connection\-oriented anonymizing communication service\&. Users choose a source\-routed path through a set of nodes, and negotiate a "virtual circuit" through the network, in which each node knows its predecessor and successor, but no others\&. Traffic flowing down the circuit is unwrapped by a symmetric key at each node, which reveals the downstream node\&. +.sp +Basically \fItor\fR provides a distributed network of servers ("onion routers")\&. Users bounce their TCP streams \(em web traffic, ftp, ssh, etc \(em around the routers, and recipients, observers, and even the routers themselves have difficulty tracking the source of the stream\&. +.sp +.SH "OPTIONS" +.PP +\fB\-h\fR, \fB\-help\fR +.RS 4 +Display a short help message and exit\&. +.RE +.PP +\fB\-f\fR \fIFILE\fR +.RS 4 +FILE contains further "option value" paris\&. (Default: @CONFDIR@/torrc) +.RE +.PP +\fB\-\-hash\-password\fR +.RS 4 +Generates a hashed password for control port access\&. +.RE +.PP +\fB\-\-list\-fingerprint\fR +.RS 4 +Generate your keys and output your nickname and fingerprint\&. +.RE +.PP +\fB\-\-verify\-config\fR +.RS 4 +Verify the configuration file is valid\&. +.RE +.PP +\fB\-\-nt\-service\fR +.RS 4 -The DirPort option should also not be used if TCP buffers are scarce. The -cached directory requests consume additional sockets which exacerbates the -problem. +\fB\-\-service [install|remove|start|stop]\fR +Manage the Tor Windows NT/2000/XP service\&. Current instructions can be found at +https://wiki\&.torproject\&.org/noreply/TheOnionRouter/TorFAQ#WinNTService +.RE +.PP +\fB\-\-list\-torrc\-options\fR +.RS 4 +List all valid options\&. +.RE +.PP +\fB\-\-version\fR +.RS 4 +Display Tor version and exit\&. +.RE +.PP +\fB\-\-quiet\fR +.RS 4 +Do not start Tor with a console log unless explicitly requested to do so\&. (By default, Tor starts out logging messages at level "notice" or higher to the console, until it has parsed its configuration\&.) +.RE +Other options can be specified either on the command\-line (\-\-option value), or in the configuration file (option value or option "value")\&. Options are case\-insensitive\&. C\-style escaped characters are allowed inside quoted values\&. Options on the command line take precedence over options found in the configuration file\&. +.PP +\fBBandwidthRate\fR \fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR +.RS 4 +A token bucket limits the average incoming bandwidth usage on this node to the specified number of bytes per second, and the average outgoing bandwidth usage to that same value\&. If you want to run a relay in the public network, this needs to be +\fIat the very least\fR +20 KB (that is, 20480 bytes)\&. (Default: 5 MB) +.RE +.PP +\fBBandwidthBurst\fR \fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR +.RS 4 +Limit the maximum token bucket size (also known as the burst) to the given number of bytes in each direction\&. (Default: 10 MB) +.RE +.PP +\fBMaxAdvertisedBandwidth\fR \fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR +.RS 4 +If set, we will not advertise more than this amount of bandwidth for our BandwidthRate\&. Server operators who want to reduce the number of clients who ask to build circuits through them (since this is proportional to advertised bandwidth rate) can thus reduce the CPU demands on their server without impacting network performance\&. +.RE +.PP +\fBRelayBandwidthRate\fR \fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR +.RS 4 +If defined, a separate token bucket limits the average incoming bandwidth usage for _relayed traffic_ on this node to the specified number of bytes per second, and the average outgoing bandwidth usage to that same value\&. Relayed traffic currently is calculated to include answers to directory requests, but that may change in future versions\&. (Default: 0) +.RE +.PP +\fBRelayBandwidthBurst\fR \fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR +.RS 4 +Limit the maximum token bucket size (also known as the burst) for _relayed traffic_ to the given number of bytes in each direction\&. (Default: 0) +.RE +.PP +\fBPerConnBWRate\fR \fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR +.RS 4 +If set, do separate rate limiting for each connection from a non\-relay\&. You should never need to change this value, since a network\-wide value is published in the consensus and your relay will use that value\&. (Default: 0) +.RE +.PP +\fBPerConnBWBurst\fR \fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR +.RS 4 +If set, do separate rate limiting for each connection from a non\-relay\&. You should never need to change this value, since a network\-wide value is published in the consensus and your relay will use that value\&. (Default: 0) +.RE +.PP +\fBConLimit\fR \fINUM\fR +.RS 4 +The minimum number of file descriptors that must be available to the Tor process before it will start\&. Tor will ask the OS for as many file descriptors as the OS will allow (you can find this by "ulimit \-H \-n")\&. If this number is less than ConnLimit, then Tor will refuse to start\&. -You should \fBnot\fP enable this feature unless you encounter the "no buffer -space available" issue. Reducing the TCP buffers affects window size for -the TCP stream and will reduce throughput in proportion to round trip -time on long paths. (Default: 0.) -.LP -.TP -\fBConstrainedSockSize \fR\fIN\fR \fBbytes\fR|\fBKB\fP -When \fBConstrainedSockets\fP is enabled the receive and transmit buffers for -all sockets will be set to this limit. Must be a value between 2048 -and 262144, in 1024 byte increments. Default of 8192 is recommended. -.LP -.TP -\fBControlPort \fR\fIPort\fP -If set, Tor will accept connections on this port and allow those -connections to control the Tor process using the Tor Control Protocol -(described in control-spec.txt). Note: unless you also specify one of -\fBHashedControlPassword\fP or \fBCookieAuthentication\fP, setting -this option will cause Tor to allow any process on the local host to -control it. This option is required for many Tor controllers; most use -the value of 9051. -.LP -.TP -\fBControlListenAddress \fR\fIIP\fR[:\fIPORT\fR]\fP -Bind the controller listener to this address. If you specify a port, -bind to this port rather than the one specified in ControlPort. We -strongly recommend that you leave this alone unless you know what you're -doing, since giving attackers access to your control listener is really -dangerous. (Default: 127.0.0.1) -This directive can be specified multiple times to bind to multiple -addresses/ports. -.LP -.TP -\fBControlSocket \fR\fIPath\fP -Like ControlPort, but listens on a Unix domain socket, rather than a TCP -socket. (Unix and Unix-like systems only.) -.LP -.TP -\fBHashedControlPassword \fR\fIhashed_password\fP -Don't allow any connections on the control port except when the other process -knows the password whose one-way hash is \fIhashed_password\fP. You can -compute the hash of a password by running "tor --hash-password -\fIpassword\fP". You can provide several acceptable passwords by using -more than HashedControlPassword line. -.LP -.TP -\fBCookieAuthentication \fR\fB0\fR|\fB1\fP -If this option is set to 1, don't allow any connections on the control port -except when the connecting process knows the contents of a file named -"control_auth_cookie", which Tor will create in its data directory. This -authentication method should only be used on systems with good filesystem -security. (Default: 0) -.LP -.TP -\fBCookieAuthFile \fR\fIPath\fP -If set, this option overrides the default location and file name for Tor's -cookie file. (See CookieAuthentication above.) -.LP -.TP -\fBCookieAuthFileGroupReadable \fR\fB0\fR|\fB1\fR|\fIGroupName\fP -If this option is set to 0, don't allow the filesystem group to read -the cookie file. If the option is set to 1, make the cookie file -readable by the default GID. [Making the file readable by other -groups is not yet implemented; let us know if you need this for some -reason.] (Default: 0). -.LP -.TP -\fBDataDirectory \fR\fIDIR\fP +You probably don\'t need to adjust this\&. It has no effect on Windows since that platform lacks getrlimit()\&. (Default: 1000) +.RE +.PP +\fBConstrainedSockets\fR \fB0\fR|\fB1\fR +.RS 4 +If set, Tor will tell the kernel to attempt to shrink the buffers for all sockets to the size specified in +\fBConstrainedSockSize\fR\&. This is useful for virtual servers and other environments where system level TCP buffers may be limited\&. If you\'re on a virtual server, and you encounter the "Error creating network socket: No buffer space available" message, you are likely experiencing this problem\&. + +The preferred solution is to have the admin increase the buffer pool for the host itself via /proc/sys/net/ipv4/tcp_mem or equivalent facility; this configuration option is a second\-resort\&. + +The DirPort option should also not be used if TCP buffers are scarce\&. The cached directory requests consume additional sockets which exacerbates the problem\&. + +You should +\fBnot\fR +enable this feature unless you encounter the "no buffer space available" issue\&. Reducing the TCP buffers affects window size for the TCP stream and will reduce throughput in proportion to round trip time on long paths\&. (Default: 0\&.) +.RE +.PP +\fBConstrainedSockSize\fR \fIN\fR \fBbytes\fR|\fBKB\fR +.RS 4 +When +\fBConstrainedSockets\fR +is enabled the receive and transmit buffers for all sockets will be set to this limit\&. Must be a value between 2048 and 262144, in 1024 byte increments\&. Default of 8192 is recommended\&. +.RE +.PP +\fBControlPort\fR \fIPort\fR +.RS 4 +If set, Tor will accept connections on this port and allow those connections to control the Tor process using the Tor Control Protocol (described in control\-spec\&.txt)\&. Note: unless you also specify one of +\fBHashedControlPassword\fR +or +\fBCookieAuthentication\fR, setting this option will cause Tor to allow any process on the local host to control it\&. This option is required for many Tor controllers; most use the value of 9051\&. +.RE +.PP +\fBControlListenAddress\fR \fIIP\fR[:\fIPORT\fR] +.RS 4 +Bind the controller listener to this address\&. If you specify a port, bind to this port rather than the one specified in ControlPort\&. We strongly recommend that you leave this alone unless you know what you\'re doing, since giving attackers access to your control listener is really dangerous\&. (Default: 127\&.0\&.0\&.1) This directive can be specified multiple times to bind to multiple addresses/ports\&. +.RE +.PP +\fBControlSocket\fR \fIPath\fR +.RS 4 +Like ControlPort, but listens on a Unix domain socket, rather than a TCP socket\&. (Unix and Unix\-like systems only\&.) +.RE +.PP +\fBHashedControlPassword\fR \fIhashed_password\fR +.RS 4 +Don\'t allow any connections on the control port except when the other process knows the password whose one\-way hash is +\fIhashed_password\fR\&. You can compute the hash of a password by running "tor \-\-hash\-password +\fIpassword\fR"\&. You can provide several acceptable passwords by using more than one HashedControlPassword line\&. +.RE +.PP +\fBCookieAuthentication\fR \fB0\fR|\fB1\fR +.RS 4 +If this option is set to 1, don\'t allow any connections on the control port except when the connecting process knows the contents of a file named "control_auth_cookie", which Tor will create in its data directory\&. This authentication method should only be used on systems with good filesystem security\&. (Default: 0) +.RE +.PP +\fBCookieAuthFile\fR \fIPath\fR +.RS 4 +If set, this option overrides the default location and file name for Tor\'s cookie file\&. (See CookieAuthentication above\&.) +.RE +.PP +\fBCookieAuthFileGroupReadable\fR \fB0\fR|\fB1\fR|\fIGroupname\fR +.RS 4 +If this option is set to 0, don\'t allow the filesystem group to read the cookie file\&. If the option is set to 1, make the cookie file readable by the default GID\&. [Making the file readable by other groups is not yet implemented; let us know if you need this for some reason\&.] (Default: 0)\&. +.RE +.PP +\fBDataDirectory\fR \fIDIR\fR +.RS 4 Store working data in DIR (Default: @LOCALSTATEDIR@/lib/tor) -.LP -.TP -\fBDirServer \fR[\fInickname\fR] [\fBflags\fR] \fIaddress\fR\fB:\fIport fingerprint\fP -Use a nonstandard authoritative directory server at the provided -address and port, with the specified key fingerprint. This option can -be repeated many times, for multiple authoritative directory -servers. Flags are separated by spaces, and determine what kind of an -authority this directory is. By default, every authority is authoritative -for current ("v2")-style directories, unless the "no-v2" flag is given. If the "v1" flags is provided, Tor will use this server as an -authority for old-style (v1) directories as well. (Only directory mirrors -care about this.) Tor will use this server as an authority for hidden -service information if the "hs" flag is set, or if the "v1" flag is set and -the "no-hs" flag is \fBnot\fP set. Tor will use this authority as a bridge -authoritative directory if the "bridge" flag is set. If a flag -"orport=\fBport\fR" is given, Tor will use the given port when opening -encrypted tunnels to the dirserver. Lastly, if a flag "v3ident=\fBfp\fR" is -given, the dirserver is a v3 directory authority whose v3 long-term -signing key has the fingerprint \fBfp\fR. - -If no \fBdirserver\fP line is given, Tor will use the default -directory servers. NOTE: this option is intended -for setting up a private Tor network with its own directory authorities. If -you use it, you will be distinguishable from other users, because you won't -believe the same authorities they do. -.LP -.TP -\fBAlternateDirAuthority \fR[\fInickname\fR] [\fBflags\fR] \fIaddress\fR\fB:\fIport fingerprint\fP -\fBAlternateHSAuthority \fR[\fInickname\fR] [\fBflags\fR] \fIaddress\fR\fB:\fIport fingerprint\fP -\fBAlternateBridgeAuthority \fR[\fInickname\fR] [\fBflags\fR] \fIaddress\fR\fB:\fIport fingerprint\fP -As DirServer, but replaces less of the default directory authorities. -Using AlternateDirAuthority replaces the default Tor directory -authorities, but leaves the hidden service authorities and bridge -authorities in place. Similarly, Using AlternatieHSAuthority replaces -the default hidden service authorities, but not the directory or -bridge authorities. - -\fBFetchDirInfoEarly \fR\fB0\fR|\fB1\fR\fP -If set to 1, Tor will always fetch directory information like other -directory caches, even if you don't meet the normal criteria for -fetching early. Normal users should leave it off. -(Default: 0) -.LP -.TP -\fBFetchHidServDescriptors \fR\fB0\fR|\fB1\fR\fP -If set to 0, Tor will never fetch any hidden service descriptors from -the rendezvous directories. This option is only useful if you're using -a Tor controller that handles hidserv fetches for you. -(Default: 1) -.LP -.TP -\fBFetchServerDescriptors \fR\fB0\fR|\fB1\fR\fP -If set to 0, Tor will never fetch any network status summaries or server -descriptors from the directory servers. This option is only useful if -you're using a Tor controller that handles directory fetches for you. -(Default: 1) -.LP -.TP -\fBFetchUselessDescriptors \fR\fB0\fR|\fB1\fR\fP -If set to 1, Tor will fetch every non-obsolete descriptor from the -authorities that it hears about. Otherwise, it will avoid fetching -useless descriptors, for example for routers that are not running. -This option is useful if you're using the contributed "exitlist" -script to enumerate Tor nodes that exit to certain addresses. -(Default: 0) -.LP -.TP -\fBHttpProxy\fR \fIhost\fR[:\fIport\fR]\fP -Tor will make all its directory requests through this host:port -(or host:80 if port is not specified), -rather than connecting directly to any directory servers. -.LP -.TP -\fBHttpProxyAuthenticator\fR \fIusername:password\fP -If defined, Tor will use this username:password for Basic Http proxy -authentication, as in RFC 2617. This is currently the only form of -Http proxy authentication that Tor supports; feel free to submit a -patch if you want it to support others. -.LP -.TP -\fBHttpsProxy\fR \fIhost\fR[:\fIport\fR]\fP -Tor will make all its OR (SSL) connections through this host:port -(or host:443 if port is not specified), via HTTP CONNECT rather than -connecting directly to servers. You may want to set \fBFascistFirewall\fR -to restrict the set of ports you might try to connect to, if your Https -proxy only allows connecting to certain ports. -.LP -.TP -\fBHttpsProxyAuthenticator\fR \fIusername:password\fP -If defined, Tor will use this username:password for Basic Https proxy -authentication, as in RFC 2617. This is currently the only form of -Https proxy authentication that Tor supports; feel free to submit a -patch if you want it to support others. -.LP -.TP -\fBKeepalivePeriod \fR\fINUM\fP -To keep firewalls from expiring connections, send a padding keepalive -cell every NUM seconds on open connections that are in use. If the -connection has no open circuits, it will instead be closed after NUM -seconds of idleness. (Default: 5 minutes) -.LP -.TP -\fBLog \fR\fIminSeverity\fR[-\fImaxSeverity\fR] \fBstderr\fR|\fBstdout\fR|\fBsyslog\fR\fP -Send all messages between \fIminSeverity\fR and \fImaxSeverity\fR to -the standard output stream, the standard error stream, or to the system -log. (The "syslog" value is only supported on Unix.) Recognized -severity levels are debug, info, notice, warn, and err. We advise using -"notice" in most cases, since anything more verbose may provide sensitive -information to an attacker who obtains the logs. If only one -severity level is given, all messages of that level or higher will be -sent to the listed destination. -.LP -.TP -\fBLog \fR\fIminSeverity\fR[-\fImaxSeverity\fR] \fBfile\fR \fIFILENAME\fP -As above, but send log messages to the listed filename. The "Log" -option may appear more than once in a configuration file. Messages -are sent to all the logs that match their severity level. -.LP -.TP -\fBOutboundBindAddress \fR\fIIP\fP -Make all outbound connections originate from the IP address specified. This -is only useful when you have multiple network interfaces, and you want all -of Tor's outgoing connections to use a single one. -.LP -.TP -\fBPidFile \fR\fIFILE\fP -On startup, write our PID to FILE. On clean shutdown, remove FILE. -.LP -.TP -\fBProtocolWarnings \fR\fB0\fR|\fB1\fR\fP -If 1, Tor will log with severity 'warn' various cases of other parties -not following the Tor specification. Otherwise, they are logged with -severity 'info'. (Default: 0) -.LP -.TP -\fBRunAsDaemon \fR\fB0\fR|\fB1\fR\fP -If 1, Tor forks and daemonizes to the background. This option has -no effect on Windows; instead you should use the --service command-line -option. (Default: 0) -.LP -.TP -\fBSafeLogging \fR\fB0\fR|\fB1\fP -If 1, Tor replaces potentially sensitive strings in the logs -(e.g. addresses) with the string [scrubbed]. This way logs can still be -useful, but they don't leave behind personally identifying information -about what sites a user might have visited. (Default: 1) -.LP -.TP -\fBUser \fR\fIUID\fP -On startup, setuid to this user and setgid to their primary group. -.LP -.TP -\fBHardwareAccel \fR\fB0\fR|\fB1\fP -If non-zero, try to use crypto hardware acceleration when -available. This is untested and probably buggy. (Default: 0) -.LP -.TP -\fBAvoidDiskWrites \fR\fB0\fR|\fB1\fP -If non-zero, try to write to disk less frequently than we would otherwise. -This is useful when running on flash memory or other media that support only -a limited number of writes. (Default: 0) -.LP -.TP -\fBTunnelDirConns \fR\fB0\fR|\fB1\fP -If non-zero, when a directory server we contact supports it, we will -build a one-hop circuit and make an encrypted connection via its -ORPort. (Default: 0) -.LP -.TP -\fBPreferTunneledDirConns \fR\fB0\fR|\fB1\fP -If non-zero, we will avoid directory servers that don't support tunneled -directory connections, when possible. (Default: 0) - -.SH CLIENT OPTIONS +.RE +.PP +\fBDirServer\fR [\fInickname\fR] [\fBflags\fR] \fIaddress\fR:\fIport\fR \fIfingerprint\fR +.RS 4 +Use a nonstandard authoritative directory server at the provided address and port, with the specified key fingerprint\&. This option can be repeated many times, for multiple authoritative directory servers\&. Flags are separated by spaces, and determine what kind of an authority this directory is\&. By default, every authority is authoritative for current ("v2")\-style directories, unless the "no\-v2" flag is given\&. If the "v1" flags is provided, Tor will use this server as an authority for old\-style (v1) directories as well\&. (Only directory mirrors care about this\&.) Tor will use this server as an authority for hidden service information if the "hs" flag is set, or if the "v1" flag is set and the "no\-hs" flag is +\fBnot\fR +set\&. Tor will use this authority as a bridge authoritative directory if the "bridge" flag is set\&. If a flag "orport=\fBport\fR" is given, Tor will use the given port when opening encrypted tunnels to the dirserver\&. Lastly, if a flag "v3ident=\fBfp\fR" is given, the dirserver is a v3 directory authority whose v3 long\-term signing key has the fingerprint +\fBfp\fR\&. + +If no +\fBdirserver\fR +line is given, Tor will use the default directory servers\&. NOTE: this option is intended for setting up a private Tor network with its own directory authorities\&. If you use it, you will be distinguishable from other users, because you won\'t believe the same authorities they do\&. +.RE +\fBAlternateDirAuthority\fR [\fInickname\fR] [\fBflags\fR] \fIaddress\fR:\fIport\fR \fIfingerprint\fR +.sp +\fBAlternateHSAuthority\fR [\fInickname\fR] [\fBflags\fR] \fIaddress\fR:\fIport\fR \fIfingerprint\fR +.PP +\fBAlternateBridgeAuthority\fR [\fInickname\fR] [\fBflags\fR] \fIaddress\fR:\fIport\fR \fI fingerprint\fR +.RS 4 +As DirServer, but replaces less of the default directory authorities\&. Using AlternateDirAuthority replaces the default Tor directory authorities, but leaves the hidden service authorities and bridge authorities in place\&. Similarly, Using AlternateHSAuthority replaces the default hidden service authorities, but not the directory or bridge authorities\&. +.RE +.PP +\fBDisableAllSwap\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 1, Tor will attempt to lock all current and future memory pages, so that memory cannot be paged out\&. Windows, OS X and Solaris are currently not supported\&. We believe that this feature works on modern Gnu/Linux distributions, and that it should work on *BSD systems (untested)\&. This option requires that you start your Tor as root, and you should use the +\fBUser\fR +option to properly reduce Tor\'s privileges\&. (Default: 0) +.RE +.PP +\fBFetchDirInfoEarly\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 1, Tor will always fetch directory information like other directory caches, even if you don\'t meet the normal criteria for fetching early\&. Normal users should leave it off\&. (Default: 0) +.RE +.PP +\fBFetchDirInfoExtraEarly\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 1, Tor will fetch directory information before other directory caches\&. It will attempt to download directory information closer to the start of the consensus period\&. Normal users should leave it off\&. (Default: 0) +.RE +.PP +\fBFetchHidServDescriptors\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 0, Tor will never fetch any hidden service descriptors from the rendezvous directories\&. This option is only useful if you\'re using a Tor controller that handles hidden service fetches for you\&. (Default: 1) +.RE +.PP +\fBFetchServerDescriptors\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 0, Tor will never fetch any network status summaries or server descriptors from the directory servers\&. This option is only useful if you\'re using a Tor controller that handles directory fetches for you\&. (Default: 1) +.RE +.PP +\fBFetchUselessDescriptors\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 1, Tor will fetch every non\-obsolete descriptor from the authorities that it hears about\&. Otherwise, it will avoid fetching useless descriptors, for example for routers that are not running\&. This option is useful if you\'re using the contributed "exitlist" script to enumerate Tor nodes that exit to certain addresses\&. (Default: 0) +.RE +.PP +\fBHTTPProxy\fR \fIhost\fR[:\fIport\fR] +.RS 4 +Tor will make all its directory requests through this host:port (or host:80 if port is not specified), rather than connecting directly to any directory servers\&. +.RE +.PP +\fBHTTPProxyAuthenticator\fR \fIusername:password\fR +.RS 4 +If defined, Tor will use this username:password for Basic HTTP proxy authentication, as in RFC 2617\&. This is currently the only form of HTTP proxy authentication that Tor supports; feel free to submit a patch if you want it to support others\&. +.RE +.PP +\fBHTTPSProxy\fR \fIhost\fR[:\fIport\fR] +.RS 4 +Tor will make all its OR (SSL) connections through this host:port (or host:443 if port is not specified), via HTTP CONNECT rather than connecting directly to servers\&. You may want to set +\fBFascistFirewall\fR +to restrict the set of ports you might try to connect to, if your HTTPS proxy only allows connecting to certain ports\&. +.RE +.PP +\fBHTTPSProxyAuthenticator\fR \fIusername:password\fR +.RS 4 +If defined, Tor will use this username:password for Basic HTTPS proxy authentication, as in RFC 2617\&. This is currently the only form of HTTPS proxy authentication that Tor supports; feel free to submit a patch if you want it to support others\&. +.RE +.PP +\fBSocks4Proxy\fR \fIhost\fR[:\fIport\fR] +.RS 4 +Tor will make all OR connections through the SOCKS 4 proxy at host:port (or host:1080 if port is not specified)\&. +.RE +.PP +\fBSocks5Proxy\fR \fIhost\fR[:\fIport\fR] +.RS 4 +Tor will make all OR connections through the SOCKS 5 proxy at host:port (or host:1080 if port is not specified)\&. +.RE +\fBSocks5ProxyUsername\fR \fIusername\fR +.PP +\fBSocks5ProxyPassword\fR \fIpassword\fR +.RS 4 +If defined, authenticate to the SOCKS 5 server using username and password in accordance to RFC 1929\&. Both username and password must be between 1 and 255 characters\&. +.RE +.PP +\fBKeepalivePeriod\fR \fINUM\fR +.RS 4 +To keep firewalls from expiring connections, send a padding keepalive cell every NUM seconds on open connections that are in use\&. If the connection has no open circuits, it will instead be closed after NUM seconds of idleness\&. (Default: 5 minutes) +.RE +.PP +\fBLog\fR \fIminSeverity\fR[\-\fImaxSeverity\fR] \fBstderr\fR|\fBstdout\fR|\fBsyslog\fR +.RS 4 +Send all messages between +\fIminSeverity\fR +and +\fImaxSeverity\fR +to the standard output stream, the standard error stream, or to the system log\&. (The "syslog" value is only supported on Unix\&.) Recognized severity levels are debug, info, notice, warn, and err\&. We advise using "notice" in most cases, since anything more verbose may provide sensitive information to an attacker who obtains the logs\&. If only one severity level is given, all messages of that level or higher will be sent to the listed destination\&. +.RE +.PP +\fBLog\fR \fIminSeverity\fR[\-\fImaxSeverity\fR] \fBfile\fR \fIFILENAME\fR +.RS 4 +As above, but send log messages to the listed filename\&. The "Log" option may appear more than once in a configuration file\&. Messages are sent to all the logs that match their severity level\&. +.RE +.PP +\fBOutboundBindAddress\fR \fIIP\fR +.RS 4 +Make all outbound connections originate from the IP address specified\&. This is only useful when you have multiple network interfaces, and you want all of Tor\'s outgoing connections to use a single one\&. This setting will be ignored for connections to the loopback addresses (127\&.0\&.0\&.0/8 and ::1)\&. +.RE +.PP +\fBPidFile\fR \fIFILE\fR +.RS 4 +On startup, write our PID to FILE\&. On clean shutdown, remove FILE\&. +.RE +.PP +\fBProtocolWarnings\fR \fB0\fR|\fB1\fR +.RS 4 +If 1, Tor will log with severity \'warn\' various cases of other parties not following the Tor specification\&. Otherwise, they are logged with severity \'info\'\&. (Default: 0) +.RE .PP -The following options are useful only for clients (that is, if \fBSocksPort\fP is non-zero): -.LP -.TP -\fBAllowInvalidNodes\fR \fBentry\fR|\fBexit\fR|\fBmiddle\fR|\fBintroduction\fR|\fBrendezvous\fR|...\fP -If some Tor servers are obviously not working right, the directory -authorities can manually mark them as invalid, meaning that it's not -recommended you use them for entry or exit positions in your circuits. You -can opt to use them in some circuit positions, though. The default is -"middle,rendezvous", and other choices are not advised. -.LP -.TP -\fBBridge \fR\fIIP:ORPort\fR [fingerprint]\fP -When set along with UseBridges, instructs Tor to use the relay at -"IP:ORPort" as a "bridge" relaying into the Tor network. If "fingerprint" -is provided (using the same format as for DirServer), we will verify that -the relay running at that location has the right fingerprint. We also use -fingerprint to look up the bridge descriptor at the bridge authority, if -it's provided and if UpdateBridgesFromAuthority is set too. -.LP -.TP -\fBCircuitBuildTimeout \fR\fINUM\fP -Try for at most NUM seconds when building circuits. If the circuit -isn't open in that time, give up on it. -(Default: 1 minute.) -.LP -.TP -\fBCircuitIdleTimeout \fR\fINUM\fP -If we have kept a clean (never used) circuit around for NUM seconds, -then close it. This way when the Tor client is entirely idle, it can -expire all of its circuits, and then expire its TLS connections. Also, -if we end up making a circuit that is not useful for exiting any of -the requests we're receiving, it won't forever take up a slot in the -circuit list. -(Default: 1 hour.) -.LP -.TP -\fBClientOnly \fR\fB0\fR|\fB1\fR\fP -If set to 1, Tor will under no circumstances run as a server or serve -directory requests. The default -is to run as a client unless ORPort is configured. (Usually, -you don't need to set this; Tor is pretty smart at figuring out whether -you are reliable and high-bandwidth enough to be a useful server.) -(Default: 0) -.LP -.TP -\fBExcludeNodes \fR\fInode\fR,\fInode\fR,\fI...\fP -A list of identity fingerprints or nicknames of nodes to never use when -building a circuit. -.LP -.TP -\fBEntryNodes \fR\fInode\fR,\fInode\fR,\fI...\fP -A list of identity fingerprints or nicknames of preferred nodes to use for the -first hop in the circuit. -These are treated only as preferences unless StrictEntryNodes (see -below) is also set. -.LP -.TP -\fBExitNodes \fR\fInode\fR,\fInode\fR,\fI...\fP -A list of identity fingerprints or nicknames of preferred nodes to use for the -last hop in the circuit. -These are treated only as preferences unless StrictExitNodes (see -below) is also set. -.LP -.TP -\fBStrictEntryNodes \fR\fB0\fR|\fB1\fR\fP -If 1, Tor will never use any nodes besides those listed in "EntryNodes" for -the first hop of a circuit. -.LP -.TP -\fBStrictExitNodes \fR\fB0\fR|\fB1\fR\fP -If 1, Tor will never use any nodes besides those listed in "ExitNodes" for -the last hop of a circuit. -.LP -.TP -\fBFascistFirewall \fR\fB0\fR|\fB1\fR\fP -If 1, Tor will only create outgoing connections to ORs running on ports that -your firewall allows (defaults to 80 and 443; see \fBFirewallPorts\fR). This will -allow you to run Tor as a client behind a firewall with restrictive policies, -but will not allow you to run as a server behind such a firewall. -If you prefer more fine-grained control, use ReachableAddresses instead. -.LP -.TP -\fBFirewallPorts \fR\fIPORTS\fP -A list of ports that your firewall allows you to connect to. Only -used when \fBFascistFirewall\fR is set. This option is deprecated; use -ReachableAddresses instead. (Default: 80, 443) -.LP -.TP -\fBReachableAddresses \fR\fIADDR\fP[\fB/\fP\fIMASK\fP][:\fIPORT\fP]...\fP -A comma-separated list of IP addresses and ports that your firewall allows you -to connect to. The format is as -for the addresses in ExitPolicy, except that "accept" is understood -unless "reject" is explicitly provided. For example, 'ReachableAddresses -99.0.0.0/8, reject 18.0.0.0/8:80, accept *:80' means that your -firewall allows connections to everything inside net 99, rejects port -80 connections to net 18, and accepts connections to port 80 otherwise. -(Default: 'accept *:*'.) -.LP -.TP -\fBReachableDirAddresses \fR\fIADDR\fP[\fB/\fP\fIMASK\fP][:\fIPORT\fP]...\fP -Like \fBReachableAddresses\fP, a list of addresses and ports. Tor will obey -these restrictions when fetching directory information, using standard HTTP -GET requests. If not set explicitly then the value of \fBReachableAddresses\fP -is used. If \fBHttpProxy\fR is set then these connections will go through that -proxy. -.LP -.TP -\fBReachableORAddresses \fR\fIADDR\fP[\fB/\fP\fIMASK\fP][:\fIPORT\fP]...\fP -Like \fBReachableAddresses\fP, a list of addresses and ports. Tor will obey -these restrictions when connecting to Onion Routers, using TLS/SSL. If not set -explicitly then the value of \fBReachableAddresses\fP is used. If -\fBHttpsProxy\fR is set then these connections will go through that proxy. +\fBRunAsDaemon\fR \fB0\fR|\fB1\fR +.RS 4 +If 1, Tor forks and daemonizes to the background\&. This option has no effect on Windows; instead you should use the \-\-service command\-line option\&. (Default: 0) +.RE +.PP +\fBSafeLogging\fR \fB0\fR|\fB1\fR|\fBrelay\fR +.RS 4 +Tor can scrub potentially sensitive strings from log messages (e\&.g\&. addresses) by replacing them with the string [scrubbed]\&. This way logs can still be useful, but they don\'t leave behind personally identifying information about what sites a user might have visited\&. -The separation between \fBReachableORAddresses\fP and -\fBReachableDirAddresses\fP is only interesting when you are connecting through -proxies (see \fBHttpProxy\fR and \fBHttpsProxy\fR). Most proxies limit TLS -connections (which Tor uses to connect to Onion Routers) to port 443, and some -limit HTTP GET requests (which Tor uses for fetching directory information) to -port 80. -.LP -.TP -\fBLongLivedPorts \fR\fIPORTS\fP -A list of ports for services that tend to have long-running connections -(e.g. chat and interactive shells). Circuits for streams that use these -ports will contain only high-uptime nodes, to reduce the chance that a -node will go down before the stream is finished. -(Default: 21, 22, 706, 1863, 5050, 5190, 5222, 5223, 6667, 6697, 8300) -.LP -.TP +If this option is set to 0, Tor will not perform any scrubbing, if it is set to 1, all potentially sensitive strings are replaced\&. If it is set to relay, all log messages generated when acting as a relay are sanitized, but all messages generated when acting as a client are not\&. (Default: 1) +.RE +.PP +\fBUser\fR \fIUID\fR +.RS 4 +On startup, setuid to this user and setgid to their primary group\&. +.RE +.PP +\fBHardwareAccel\fR \fB0\fR|\fB1\fR +.RS 4 +If non\-zero, try to use built\-in (static) crypto hardware acceleration when available\&. (Default: 0) +.RE +.PP +\fBAccelName\fR \fINAME\fR +.RS 4 +When using OpenSSL hardware crypto acceleration attempt to load the dynamic engine of this name\&. This must be used for any dynamic hardware engine\&. Names can be verified with the openssl engine command\&. +.RE +.PP +\fBAccelDir\fR \fIDIR\fR +.RS 4 +Specify this option if using dynamic hardware acceleration and the engine implementation library resides somewhere other than the OpenSSL default\&. +.RE +.PP +\fBAvoidDiskWrites\fR \fB0\fR|\fB1\fR +.RS 4 +If non\-zero, try to write to disk less frequently than we would otherwise\&. This is useful when running on flash memory or other media that support only a limited number of writes\&. (Default: 0) +.RE +.PP +\fBTunnelDirConns\fR \fB0\fR|\fB1\fR +.RS 4 +If non\-zero, when a directory server we contact supports it, we will build a one\-hop circuit and make an encrypted connection via its ORPort\&. (Default: 1) +.RE +.PP +\fBPreferTunneledDirConns\fR \fB0\fR|\fB1\fR +.RS 4 +If non\-zero, we will avoid directory servers that don\'t support tunneled directory connections, when possible\&. (Default: 1) +.RE +.PP +\fBCircuitPriorityHalflife\fR \fINUM1\fR +.RS 4 +If this value is set, we override the default algorithm for choosing which circuit\'s cell to deliver or relay next\&. When the value is 0, we round\-robin between the active circuits on a connection, delivering one cell from each in turn\&. When the value is positive, we prefer delivering cells from whichever connection has the lowest weighted cell count, where cells are weighted exponentially according to the supplied CircuitPriorityHalflife value (in seconds)\&. If this option is not set at all, we use the behavior recommended in the current consensus networkstatus\&. This is an advanced option; you generally shouldn\'t have to mess with it\&. (Default: not set\&.) +.RE +.SH "CLIENT OPTIONS" +The following options are useful only for clients (that is, if \fBSocksPort\fR is non\-zero): +.PP +\fBAllowInvalidNodes\fR \fBentry\fR|\fBexit\fR|\fBmiddle\fR|\fBintroduction\fR|\fBrendezvous\fR|\fB\&...\fR +.RS 4 +If some Tor servers are obviously not working right, the directory authorities can manually mark them as invalid, meaning that it\'s not recommended you use them for entry or exit positions in your circuits\&. You can opt to use them in some circuit positions, though\&. The default is "middle,rendezvous", and other choices are not advised\&. +.RE +.PP +\fBExcludeSingleHopRelays\fR \fB0\fR|\fB1\fR +.RS 4 +This option controls whether circuits built by Tor will include relays with the AllowSingleHopExits flag set to true\&. If ExcludeSingleHopRelays is set to 0, these relays will be included\&. Note that these relays might be at higher risk of being seized or observed, so they are not normally included\&. (Default: 1) +.RE +.PP +\fBBridge\fR \fIIP\fR:\fIORPort\fR [fingerprint] +.RS 4 +When set along with UseBridges, instructs Tor to use the relay at "IP:ORPort" as a "bridge" relaying into the Tor network\&. If "fingerprint" is provided (using the same format as for DirServer), we will verify that the relay running at that location has the right fingerprint\&. We also use fingerprint to look up the bridge descriptor at the bridge authority, if it\'s provided and if UpdateBridgesFromAuthority is set too\&. +.RE +.PP +\fBLearnCircuitBuildTimeout\fR \fB0\fR|\fB1\fR +.RS 4 +If 0, CircuitBuildTimeout adaptive learning is disabled\&. (Default: 1) +.RE +.PP +\fBCircuitBuildTimeout\fR \fINUM\fR +.RS 4 +Try for at most NUM seconds when building circuits\&. If the circuit isn\'t open in that time, give up on it\&. If LearnCircuitBuildTimeout is 1, this value serves as the initial value to use before a timeout is learned\&. If LearnCircuitBuildTimeout is 0, this value is the only value used\&. (Default: 60 seconds\&.) +.RE +.PP +\fBCircuitIdleTimeout\fR \fINUM\fR +.RS 4 +If we have kept a clean (never used) circuit around for NUM seconds, then close it\&. This way when the Tor client is entirely idle, it can expire all of its circuits, and then expire its TLS connections\&. Also, if we end up making a circuit that is not useful for exiting any of the requests we\'re receiving, it won\'t forever take up a slot in the circuit list\&. (Default: 1 hour\&.) +.RE +.PP +\fBCircuitStreamTimeout\fR \fINUM\fR +.RS 4 +If non\-zero, this option overrides our internal timeout schedule for how many seconds until we detach a stream from a circuit and try a new circuit\&. If your network is particularly slow, you might want to set this to a number like 60\&. (Default: 0) +.RE +.PP +\fBClientOnly\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 1, Tor will under no circumstances run as a server or serve directory requests\&. The default is to run as a client unless ORPort is configured\&. (Usually, you don\'t need to set this; Tor is pretty smart at figuring out whether you are reliable and high\-bandwidth enough to be a useful server\&.) (Default: 0) +.RE +.PP +\fBExcludeNodes\fR \fInode\fR,\fInode\fR,\fI\&...\fR +.RS 4 +A list of identity fingerprints, nicknames, country codes and address patterns of nodes to never use when building a circuit\&. (Example: ExcludeNodes SlowServer, $ EFFFFFFFFFFFFFFF, {cc}, 255\&.254\&.0\&.0/8) +.RE +.PP +\fBExcludeExitNodes\fR \fInode\fR,\fInode\fR,\fI\&...\fR +.RS 4 +A list of identity fingerprints, nicknames, country codes and address patterns of nodes to never use when picking an exit node\&. Note that any node listed in ExcludeNodes is automatically considered to be part of this list\&. +.RE +.PP +\fBEntryNodes\fR \fInode\fR,\fInode\fR,\fI\&...\fR +.RS 4 +A list of identity fingerprints, nicknames, country codes and address patterns of nodes to use for the first hop in normal circuits\&. These are treated only as preferences unless StrictNodes (see below) is also set\&. +.RE +.PP +\fBExitNodes\fR \fInode\fR,\fInode\fR,\fI\&...\fR +.RS 4 +A list of identity fingerprints, nicknames, country codes and address patterns of nodes to use for the last hop in normal exit circuits\&. These are treated only as preferences unless StrictNodes (see below) is also set\&. +.RE +.PP +\fBStrictNodes\fR \fB0\fR|\fB1\fR +.RS 4 +If 1 and EntryNodes config option is set, Tor will never use any nodes besides those listed in EntryNodes for the first hop of a normal circuit\&. If 1 and ExitNodes config option is set, Tor will never use any nodes besides those listed in ExitNodes for the last hop of a normal exit circuit\&. Note that Tor might still use these nodes for non\-exit circuits such as one\-hop directory fetches or hidden service support circuits\&. +.RE +.PP +\fBFascistFirewall\fR \fB0\fR|\fB1\fR +.RS 4 +If 1, Tor will only create outgoing connections to ORs running on ports that your firewall allows (defaults to 80 and 443; see +\fBFirewallPorts\fR)\&. This will allow you to run Tor as a client behind a firewall with restrictive policies, but will not allow you to run as a server behind such a firewall\&. If you prefer more fine\-grained control, use ReachableAddresses instead\&. +.RE +.PP +\fBFirewallPorts\fR \fIPORTS\fR +.RS 4 +A list of ports that your firewall allows you to connect to\&. Only used when +\fBFascistFirewall\fR +is set\&. This option is deprecated; use ReachableAddresses instead\&. (Default: 80, 443) +.RE +.PP +\fBHidServAuth\fR \fIonion\-address\fR \fIauth\-cookie\fR [\fIservice\-name\fR] +.RS 4 +Client authorization for a hidden service\&. Valid onion addresses contain 16 characters in a\-z2\-7 plus "\&.onion", and valid auth cookies contain 22 characters in A\-Za\-z0\-9+/\&. The service name is only used for internal purposes, e\&.g\&., for Tor controllers\&. This option may be used multiple times for different hidden services\&. If a hidden service uses authorization and this option is not set, the hidden service is not accessible\&. Hidden services can be configured to require authorization using the +\fBHiddenServiceAuthorizeClient\fR +option\&. +.RE +.PP +\fBReachableAddresses\fR \fIADDR\fR[/\fIMASK\fR][:\fIPORT\fR]\&... +.RS 4 +A comma\-separated list of IP addresses and ports that your firewall allows you to connect to\&. The format is as for the addresses in ExitPolicy, except that "accept" is understood unless "reject" is explicitly provided\&. For example, \'ReachableAddresses 99\&.0\&.0\&.0/8, reject 18\&.0\&.0\&.0/8:80, accept *:80\' means that your firewall allows connections to everything inside net 99, rejects port 80 connections to net 18, and accepts connections to port 80 otherwise\&. (Default: \'accept *:*\'\&.) +.RE +.PP +\fBReachableDirAddresses\fR \fIADDR\fR[/\fIMASK\fR][:\fIPORT\fR]\&... +.RS 4 +Like +\fBReachableAddresses\fR, a list of addresses and ports\&. Tor will obey these restrictions when fetching directory information, using standard HTTP GET requests\&. If not set explicitly then the value of +\fBReachableAddresses\fR +is used\&. If +\fBHTTPProxy\fR +is set then these connections will go through that proxy\&. +.RE +.PP +\fBReachableORAddresses\fR \fIADDR\fR[/\fIMASK\fR][:\fIPORT\fR]\&... +.RS 4 +Like +\fBReachableAddresses\fR, a list of addresses and ports\&. Tor will obey these restrictions when connecting to Onion Routers, using TLS/SSL\&. If not set explicitly then the value of +\fBReachableAddresses\fR +is used\&. If +\fBHTTPSProxy\fR +is set then these connections will go through that proxy\&. + +The separation between +\fBReachableORAddresses\fR +and +\fBReachableDirAddresses\fR +is only interesting when you are connecting through proxies (see +\fBHTTPProxy\fR +and +\fBHTTPSProxy\fR)\&. Most proxies limit TLS connections (which Tor uses to connect to Onion Routers) to port 443, and some limit HTTP GET requests (which Tor uses for fetching directory information) to port 80\&. +.RE +.PP +\fBLongLivedPorts\fR \fIPORTS\fR +.RS 4 +A list of ports for services that tend to have long\-running connections (e\&.g\&. chat and interactive shells)\&. Circuits for streams that use these ports will contain only high\-uptime nodes, to reduce the chance that a node will go down before the stream is finished\&. (Default: 21, 22, 706, 1863, 5050, 5190, 5222, 5223, 6667, 6697, 8300) +.RE +.PP \fBMapAddress\fR \fIaddress\fR \fInewaddress\fR -When a request for address arrives to Tor, it will rewrite it to -newaddress before processing it. For example, if you always want -connections to www.indymedia.org to exit via \fItorserver\fR (where -\fItorserver\fR is the nickname of the server), -use "MapAddress www.indymedia.org www.indymedia.org.torserver.exit". -.LP -.TP -\fBNewCircuitPeriod \fR\fINUM\fP -Every NUM seconds consider whether to build a new circuit. (Default: 30 seconds) -.LP -.TP -\fBMaxCircuitDirtiness \fR\fINUM\fP -Feel free to reuse a circuit that was first used at most NUM seconds ago, -but never attach a new stream to a circuit that is too old. -(Default: 10 minutes) -.LP -.TP -\fBNodeFamily \fR\fInode\fR,\fInode\fR,\fI...\fP -The Tor servers, defined by their identity fingerprints or nicknames, -constitute a "family" of similar or co-administered -servers, so never use any two of them in the same circuit. Defining a -NodeFamily is only needed when a server doesn't list the family itself -(with MyFamily). This option can be used multiple times. -.LP -.TP -\fBEnforceDistinctSubnets \fR\fB0\fR|\fB1\fR\fP -If 1, Tor will not put two servers whose IP addresses are "too -close" on the same circuit. Currently, two addresses are -"too close" if they lie in the same /16 range. (Default: 1) - -.\" \fBPathlenCoinWeight \fR\fI0.0-1.0\fP -.\" Paths are 3 hops plus a geometric distribution centered around this coinweight. -.\" Must be >=0.0 and <1.0. (Default: 0.3) NOT USED CURRENTLY -.\" .TP -.LP -.TP -\fBRendNodes \fR\fInode\fR,\fInode\fR,\fI...\fP -A list of identity fingerprints or nicknames of preferred nodes to use for the -rendezvous point, if possible. -.LP -.TP -\fBRendExcludeNodes \fR\fInode\fR,\fInode\fR,\fI...\fP -A list of identity fingerprints or nicknames of nodes to never use when -choosing a rendezvous point. -.LP -.TP -\fBSocksPort \fR\fIPORT\fP -Advertise this port to listen for connections from Socks-speaking -applications. Set this to 0 if you don't want to allow application -connections. (Default: 9050) -.LP -.TP -\fBSocksListenAddress \fR\fIIP\fR[:\fIPORT\fR]\fP -Bind to this address to listen for connections from Socks-speaking -applications. (Default: 127.0.0.1) You can also specify a port -(e.g. 192.168.0.1:9100). -This directive can be specified multiple times to bind to multiple -addresses/ports. -.LP -.TP -\fBSocksPolicy \fR\fIpolicy\fR,\fIpolicy\fR,\fI...\fP -Set an entrance policy for this server, to limit who can connect to the -SocksPort and DNSPort ports. -The policies have the same form as exit policies below. -.LP -.TP -\fBSocksTimeout \fR\fINUM\fP -Let a socks connection wait NUM seconds handshaking, and NUM seconds -unattached waiting for an appropriate circuit, before we fail it. -(Default: 2 minutes.) -.LP -.TP -\fBTestVia \fR\fInode\fR,\fInode\fR,\fI...\fP -A list of identity fingerprints or nicknames of nodes to prefer for your middle -hop when building testing circuits. This option is mainly for debugging -reachability problems. -.LP -.TP -\fBTrackHostExits \fR\fIhost\fR,\fI.domain\fR,\fI...\fR\fP -For each value in the comma separated list, Tor will track recent connections -to hosts that match this value and attempt to -reuse the same exit node for each. If the value is prepended with a '.', it is -treated as matching an entire domain. If one of the values is just a '.', it -means match everything. This option is useful if you frequently connect to -sites that will expire all your authentication cookies (ie log you out) if -your IP address changes. Note that this option does have the disadvantage of -making it more clear that a given history is -associated with a single user. However, most people who would wish to observe -this will observe it through cookies or other protocol-specific means anyhow. -.LP -.TP -\fBTrackHostExitsExpire \fR\fINUM\fP -Since exit servers go up and down, it is desirable to expire the association -between host and exit server after NUM seconds. The default -is 1800 seconds (30 minutes). -.LP -.TP -\fBUpdateBridgesFromAuthority \fR\fB0\fR|\fB1\fR\fP -When set (along with UseBridges), Tor will try to fetch bridge descriptors -from the configured bridge authorities when feasible. It will fall back -to a direct request if the authority responds with a 404. (Default: 0) -.LP -.TP -\fBUseBridges \fR\fB0\fR|\fB1\fR\fP -When set, Tor will fetch descriptors for each bridge listed in the -"Bridge" config lines, and use these relays as both entry guards and -directory guards. (Default: 0) -.LP -.TP -\fBUseEntryGuards \fR\fB0\fR|\fB1\fR\fP -If this option is set to 1, we pick a few long-term entry servers, and -try to stick with them. This is desirable because -constantly changing servers increases the odds that an adversary who owns -some servers will observe a fraction of your paths. -(Defaults to 1.) -.LP -.TP -\fBNumEntryGuards \fR\fINUM\fP -If UseEntryGuards is set to 1, we will try to pick a total of NUM routers -as long-term entries for our circuits. -(Defaults to 3.) -.LP -.TP -\fBSafeSocks \fR\fB0\fR|\fB1\fR\fP -When this option is enabled, Tor will reject application connections that -use unsafe variants of the socks protocol -- ones that only provide an -IP address, meaning the application is doing a DNS resolve first. -Specifically, these are socks4 and socks5 when not doing remote DNS. -(Defaults to 0.) -.LP -.TP -\fBTestSocks \fR\fB0\fR|\fB1\fR\fP -When this option is enabled, Tor will make a notice-level log entry for -each connection to the Socks port indicating whether the request used -a safe socks protocol or an unsafe one (see above entry on SafeSocks). -This helps to determine whether an application using Tor is possibly -leaking DNS requests. -(Default: 0) -.LP -.TP -\fBVirtualAddrNetwork \fR\fIAddress\fB/\fIbits\fP -When a controller asks for a virtual (unused) address with the -MAPADDRESS command, Tor picks an unassigned address from this range. -(Default: 127.192.0.0/10) - -When providing proxy server service to a network of computers using a tool like -dns-proxy-tor, -change this address to "10.192.0.0/10" or "172.16.0.0/12". -The default \fBVirtualAddrNetwork\fP address range on a -properly configured machine will route to the loopback interface. -For local use, no change to the -default \fBVirtualAddrNetwork\fP setting is needed. -.LP -.TP -\fBAllowNonRFC953Hostnames \fR\fB0\fR|\fB1\fR\fP -When this option is disabled, Tor blocks hostnames containing illegal -characters (like @ and :) rather than sending them to an exit node to be -resolved. This helps trap accidental attempts to resolve URLs and so on. -(Default: 0) -.LP -.TP -\fBFastFirstHopPK \fR\fB0\fR|\fB1\fR\fP -When this option is disabled, Tor uses the public key step for the first -hop of creating circuits. Skipping it is generally safe since we have -already used TLS to authenticate the relay and to establish forward-secure -keys. Turning this option off makes circuit building slower. - -Note that Tor will always use the public key step for the first hop if -it's operating as a relay, and it will never use the public key step if -it doesn't yet know the onion key of the first hop. -(Default: 1) -.LP -.TP -\fBTransPort\fP \fR\fIPORT\fP -If non-zero, enables transparent proxy support on \fR\fIPORT\fP (by -convention, 9040). -.\" This is required to enable support for \fBdns-proxy-tor\fP. -.\" ControlPort must be set when using \fBTransPort\fP. -Requires OS support for transparent proxies, such as BSDs' pf or -Linux's IPTables. -If you're planning -to use Tor as a transparent proxy for a network, you'll want to examine -and change VirtualAddrNetwork from the default setting. You'll also want -to set the TransListenAddress option for the network you'd like to proxy. -(Default: 0). -.LP -.TP -\fBTransListenAddress\fP \fR\fIIP\fR[:\fIPORT\fR]\fP -Bind to this address to listen for transparent proxy connections. -(Default: 127.0.0.1). -This is useful for exporting a transparent proxy server -to an entire network. -.LP -.TP -\fBNATDPort\fP \fR\fIPORT\fP -Allow old versions of ipfw (as included in old versions of FreeBSD, -etc.) to send connections through Tor using the NATD protocol. -This option is only for people who cannot -use TransPort. -.LP -.TP -\fBNATDListenAddress\fP \fR\fIIP\fR[:\fIPORT\fR]\fP -Bind to this address to listen for NATD connections. -(Default: 127.0.0.1). -.LP -.TP -\fBAutomapHostsOnResolve\fP \fR\fB0\fR|\fB1\fR\fP -When this option is enabled, and we get a request to resolve an -address that ends with one of the suffixes in -\fBAutomapHostsSuffixes\fP, we map an unused virtual address to that -address, and return the new virtual address. This is handy for making -.onion addresses work with applications that resolve an address and -then connect to it. -(Default: 0). -.LP -.TP -\fBAutomapHostsSuffixes\fP \fR\fISUFFIX\fR,\fISUFFIX\fR,...\fP -A comma-separated list of suffixes to use with \fBAutomapHostsOnResolve\fP. -The "." suffix is equivalent to "all addresses." -(Default: .exit,.onion). -.LP -.TP -\fBDNSPort\fP \fR\fIPORT\fP -If non-zero, Tor listens for UDP DNS requests on this port and resolves them -anonymously. -(Default: 0). -.LP -.TP -\fBDNSListenAddress\fP \fR\fIIP\fR[:\fIPORT\fR]\fP -Bind to this address to listen for DNS connections. -(Default: 127.0.0.1). -.LP -.TP -\fBClientDNSRejectInternalAddresses\fP \fR\fB0\fR|\fB1\fR\fP -If true, Tor does not believe any anonymously retrieved DNS answer that tells -it that an address resolves to an internal address (like 127.0.0.1 or -192.168.0.1). This option prevents certain browser-based attacks; don't turn -it off unless you know what you're doing. (Default: 1). -.LP -.TP -\fBDownloadExtraInfo\fP \fR\fB0\fR|\fB1\fR\fP -If true, Tor downloads and caches "extra-info" documents. These -documents contain information about servers other than the information -in their regular router descriptors. Tor does not use this information for -anything itself; to save bandwidth, leave this option turned off. -(Default: 0). -.LP -.TP -\fBFallbackNetworkstatusFile\fP \fIFILENAME\fP -If Tor doesn't have a cached networkstatus file, it starts out using -this one instead. Even if this file is out of date, Tor can still use -it to learn about directory mirrors, so it doesn't need to put load on -the authorities. (Default: None). -.LP -.TP -\fBWarnPlaintextPorts\fP \fR\fIport\fR,\fIport\fR,\fI...\fP -Tells Tor to issue a warnings whenever the user tries to make an -anonymous connection to one of these ports. This option is designed -to alert users to services that risk sending passwords in the clear. -(Default: 23,109,110,143). -.LP -.TP -\fBRejectPlaintextPorts\fP \fR\fIport\fR,\fIport\fR,\fI...\fP -Like WarnPlaintextPorts, but instead of warning about risky port uses, -Tor will instead refuse to make the connection. -(Default: None). - -.LP -.TP -.SH SERVER OPTIONS -.PP -The following options are useful only for servers (that is, if \fBORPort\fP is non-zero): -.LP -.TP -\fBAddress \fR\fIaddress\fP -The IP address or fqdn of this server (e.g. moria.mit.edu). You can -leave this unset, and Tor will guess your IP address. -.LP -.TP -\fBAssumeReachable \fR\fB0\fR|\fB1\fR\fP -This option is used when bootstrapping a new Tor network. If set to 1, -don't do self-reachability testing; just upload your server descriptor -immediately. If \fBAuthoritativeDirectory\fP is also set, this option -instructs the dirserver to bypass remote reachability testing too and -list all connected servers as running. -.LP -.TP -\fBBridgeRelay \fR\fB0\fR|\fB1\fR\fP -Sets the relay to act as a "bridge" with respect to relaying connections -from bridge users to the Tor network. Mainly it influences how the relay -will cache and serve directory information. Usually used in combination -with PublishServerDescriptor. -.LP -.TP -\fBContactInfo \fR\fIemail_address\fP -Administrative contact information for server. This line might get -picked up by spam harvesters, so you may want to obscure the fact -that it's an email address. -.LP -.TP -\fBExitPolicy \fR\fIpolicy\fR,\fIpolicy\fR,\fI...\fP -Set an exit policy for this server. Each policy is of the form -"\fBaccept\fP|\fBreject\fP \fIADDR\fP[\fB/\fP\fIMASK\fP]\fB[:\fP\fIPORT\fP]". -If \fB/\fP\fIMASK\fP is omitted then this policy just applies to the host -given. Instead of giving a host or network you can also use "\fB*\fP" to -denote the universe (0.0.0.0/0). \fIPORT\fP can be a single port number, -an interval of ports "\fIFROM_PORT\fP\fB-\fP\fITO_PORT\fP", or "\fB*\fP". -If \fIPORT\fP is omitted, that means "\fB*\fP". - -For example, "accept 18.7.22.69:*,reject 18.0.0.0/8:*,accept *:*" would -reject any traffic destined for MIT except for web.mit.edu, and -accept anything else. - -To specify all internal and link-local networks (including 0.0.0.0/8, -169.254.0.0/16, 127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, and -172.16.0.0/12), you can use the "private" alias instead of an address. -These addresses are rejected by default (at the beginning of your -exit policy), along with your public IP address, unless you set the -ExitPolicyRejectPrivate config option -to 0. For example, once you've done that, you could allow HTTP to -127.0.0.1 and block all other connections to internal networks with -"accept 127.0.0.1:80,reject private:*", though that may also allow -connections to your own computer that are addressed to its public -(external) IP address. See RFC 1918 and RFC 3330 for more -details about internal and reserved IP address space. - -This directive can be specified multiple times so you don't have to put -it all on one line. - -Policies are considered first to last, and the first match wins. If -you want to _replace_ the default exit policy, end your exit policy with -either a reject *:* or an accept *:*. Otherwise, you're _augmenting_ -(prepending to) the default exit policy. The default exit policy is: -.PD 0 -.RS 12 -.IP "reject *:25" -.IP "reject *:119" -.IP "reject *:135-139" -.IP "reject *:445" -.IP "reject *:465" -.IP "reject *:563" -.IP "reject *:587" -.IP "reject *:1214" -.IP "reject *:4661-4666" -.IP "reject *:6346-6429" -.IP "reject *:6699" -.IP "reject *:6881-6999" -.IP "accept *:*" -.RE -.PD -.LP -.TP -\fBExitPolicyRejectPrivate \fR\fB0\fR|\fB1\fR\fP -Reject all private (local) networks, along with your own public IP -address, at the beginning of your exit -policy. See above entry on ExitPolicy. (Default: 1) -.LP -.TP -\fBMaxOnionsPending \fR\fINUM\fP -If you have more than this number of onionskins queued for decrypt, reject new ones. (Default: 100) -.LP -.TP -\fBMyFamily \fR\fInode\fR,\fInode\fR,\fI...\fP -Declare that this Tor server is controlled or administered by a group -or organization identical or similar to that of the other servers, defined by their identity fingerprints or nicknames. -When two servers both declare that they are in the same 'family', Tor clients -will not use them in the same circuit. (Each server only needs to list the -other servers in its family; it doesn't need to list itself, but it won't hurt.) -.LP -.TP -\fBNickname \fR\fIname\fP -Set the server's nickname to 'name'. Nicknames must be between 1 -and 19 characters inclusive, and must contain only the characters -[a-zA-Z0-9]. -.LP -.TP -\fBNumCPUs \fR\fInum\fP -How many processes to use at once for decrypting onionskins. (Default: 1) -.LP -.TP -\fBORPort \fR\fIPORT\fP -Advertise this port to listen for connections from Tor clients and servers. -.LP -.TP -\fBORListenAddress \fR\fIIP\fR[:\fIPORT\fR]\fP -Bind to this IP address to listen for connections from Tor clients and -servers. If you specify a port, bind to this port rather than the one -specified in ORPort. (Default: 0.0.0.0) -This directive can be specified multiple times to bind to multiple -addresses/ports. -.LP -.TP -\fBPublishServerDescriptor \fR\fB0\fR|\fB1\fR|\fBv1\fR|\fBv2\fR|\fBv3\fR|\fBbridge\fR|\fBhidserv\fR, ...\fP -This option is only considered if you have an ORPort defined. You can -choose multiple arguments, separated by commas. +.RS 4 +When a request for address arrives to Tor, it will rewrite it to newaddress before processing it\&. For example, if you always want connections to www\&.indymedia\&.org to exit via +\fItorserver\fR +(where +\fItorserver\fR +is the nickname of the server), use "MapAddress www\&.indymedia\&.org www\&.indymedia\&.org\&.torserver\&.exit"\&. +.RE +.PP +\fBNewCircuitPeriod\fR \fINUM\fR +.RS 4 +Every NUM seconds consider whether to build a new circuit\&. (Default: 30 seconds) +.RE +.PP +\fBMaxCircuitDirtiness\fR \fINUM\fR +.RS 4 +Feel free to reuse a circuit that was first used at most NUM seconds ago, but never attach a new stream to a circuit that is too old\&. (Default: 10 minutes) +.RE +.PP +\fBNodeFamily\fR \fInode\fR,\fInode\fR,\fI\&...\fR +.RS 4 +The Tor servers, defined by their identity fingerprints or nicknames, constitute a "family" of similar or co\-administered servers, so never use any two of them in the same circuit\&. Defining a NodeFamily is only needed when a server doesn\'t list the family itself (with MyFamily)\&. This option can be used multiple times\&. +.RE +.PP +\fBEnforceDistinctSubnets\fR \fB0\fR|\fB1\fR +.RS 4 +If 1, Tor will not put two servers whose IP addresses are "too close" on the same circuit\&. Currently, two addresses are "too close" if they lie in the same /16 range\&. (Default: 1) +.RE +.PP +\fBSocksPort\fR \fIPORT\fR +.RS 4 +Advertise this port to listen for connections from Socks\-speaking applications\&. Set this to 0 if you don\'t want to allow application connections\&. (Default: 9050) +.RE +.PP +\fBSocksListenAddress\fR \fIIP\fR[:\fIPORT\fR] +.RS 4 +Bind to this address to listen for connections from Socks\-speaking applications\&. (Default: 127\&.0\&.0\&.1) You can also specify a port (e\&.g\&. 192\&.168\&.0\&.1:9100)\&. This directive can be specified multiple times to bind to multiple addresses/ports\&. +.RE +.PP +\fBSocksPolicy\fR \fIpolicy\fR,\fIpolicy\fR,\fI\&...\fR +.RS 4 +Set an entrance policy for this server, to limit who can connect to the SocksPort and DNSPort ports\&. The policies have the same form as exit policies below\&. +.RE +.PP +\fBSocksTimeout\fR \fINUM\fR +.RS 4 +Let a socks connection wait NUM seconds handshaking, and NUM seconds unattached waiting for an appropriate circuit, before we fail it\&. (Default: 2 minutes\&.) +.RE +.PP +\fBTrackHostExits\fR \fIhost\fR,\fI\&.domain\fR,\fI\&...\fR +.RS 4 +For each value in the comma separated list, Tor will track recent connections to hosts that match this value and attempt to reuse the same exit node for each\&. If the value is prepended with a \'\&.\', it is treated as matching an entire domain\&. If one of the values is just a \'\&.\', it means match everything\&. This option is useful if you frequently connect to sites that will expire all your authentication cookies (i\&.e\&. log you out) if your IP address changes\&. Note that this option does have the disadvantage of making it more clear that a given history is associated with a single user\&. However, most people who would wish to observe this will observe it through cookies or other protocol\-specific means anyhow\&. +.RE +.PP +\fBTrackHostExitsExpire\fR \fINUM\fR +.RS 4 +Since exit servers go up and down, it is desirable to expire the association between host and exit server after NUM seconds\&. The default is 1800 seconds (30 minutes)\&. +.RE +.PP +\fBUpdateBridgesFromAuthority\fR \fB0\fR|\fB1\fR +.RS 4 +When set (along with UseBridges), Tor will try to fetch bridge descriptors from the configured bridge authorities when feasible\&. It will fall back to a direct request if the authority responds with a 404\&. (Default: 0) +.RE +.PP +\fBUseBridges\fR \fB0\fR|\fB1\fR +.RS 4 +When set, Tor will fetch descriptors for each bridge listed in the "Bridge" config lines, and use these relays as both entry guards and directory guards\&. (Default: 0) +.RE +.PP +\fBUseEntryGuards\fR \fB0\fR|\fB1\fR +.RS 4 +If this option is set to 1, we pick a few long\-term entry servers, and try to stick with them\&. This is desirable because constantly changing servers increases the odds that an adversary who owns some servers will observe a fraction of your paths\&. (Defaults to 1\&.) +.RE +.PP +\fBNumEntryGuards\fR \fINUM\fR +.RS 4 +If UseEntryGuards is set to 1, we will try to pick a total of NUM routers as long\-term entries for our circuits\&. (Defaults to 3\&.) +.RE +.PP +\fBSafeSocks\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is enabled, Tor will reject application connections that use unsafe variants of the socks protocol \(em ones that only provide an IP address, meaning the application is doing a DNS resolve first\&. Specifically, these are socks4 and socks5 when not doing remote DNS\&. (Defaults to 0\&.) +.RE +.PP +\fBTestSocks\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is enabled, Tor will make a notice\-level log entry for each connection to the Socks port indicating whether the request used a safe socks protocol or an unsafe one (see above entry on SafeSocks)\&. This helps to determine whether an application using Tor is possibly leaking DNS requests\&. (Default: 0) +.RE +.PP +\fBWarnUnsafeSocks\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is enabled, Tor will warn whenever a request is received that only contains an IP address instead of a hostname\&. Allowing applications to do DNS resolves themselves is usually a bad idea and can leak your location to attackers\&. (Default: 1) +.RE +.PP +\fBVirtualAddrNetwork\fR \fIAddress\fR/\fIbits\fR +.RS 4 +When a controller asks for a virtual (unused) address with the MAPADDRESS command, Tor picks an unassigned address from this range\&. (Default: 127\&.192\&.0\&.0/10) + +When providing proxy server service to a network of computers using a tool like dns\-proxy\-tor, change this address to "10\&.192\&.0\&.0/10" or "172\&.16\&.0\&.0/12"\&. The default +\fBVirtualAddrNetwork\fR +address range on a properly configured machine will route to the loopback interface\&. For local use, no change to the default VirtualAddrNetwork setting is needed\&. +.RE +.PP +\fBAllowNonRFC953Hostnames\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is disabled, Tor blocks hostnames containing illegal characters (like @ and :) rather than sending them to an exit node to be resolved\&. This helps trap accidental attempts to resolve URLs and so on\&. (Default: 0) +.RE +.PP +\fBAllowDotExit\fR \fB0\fR|\fB1\fR +.RS 4 +If enabled, we convert "www\&.google\&.com\&.foo\&.exit" addresses on the SocksPort/TransPort/NatdPort into "www\&.google\&.com" addresses that exit from the node "foo"\&. Disabled by default since attacking websites and exit relays can use it to manipulate your path selection\&. (Default: 0) +.RE +.PP +\fBFastFirstHopPK\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is disabled, Tor uses the public key step for the first hop of creating circuits\&. Skipping it is generally safe since we have already used TLS to authenticate the relay and to establish forward\-secure keys\&. Turning this option off makes circuit building slower\&. -If set to 0, Tor will act as a server but it will not publish its -descriptor to the directory authorities. (This is useful if you're -testing out your server, or if you're using a Tor controller that handles -directory publishing for you.) Otherwise, Tor will publish its descriptor -to all directory authorities of the type(s) specified. The value "1" is -treated as a synonym for the default, which is currently "v2,v3". -.LP -.TP -\fBRedirectExit \fR\fIpattern target\fP -THIS OPTION IS DEPRECATED. It will go away in a future version of Tor. -Whenever an outgoing connection tries to connect to one of a given set -of addresses, connect to \fItarget\fP (an \fIaddress:port\fP pair) instead. -The address -pattern is given in the same format as for an exit policy. The -address translation applies after exit policies are applied. Multiple -\fBRedirectExit\fP options can be used: once any one has matched -successfully, no subsequent rules are considered. You can specify that no -redirection is to be performed on a given set of addresses by using the -special target string "pass", which prevents subsequent rules from being -considered. -.LP -.TP -\fBShutdownWaitLength\fR \fINUM\fP -When we get a SIGINT and we're a server, we begin shutting down: we close -listeners and start refusing new circuits. After \fBNUM\fP seconds, -we exit. If we get a second SIGINT, we exit immediately. (Default: -30 seconds) -.LP -.TP -\fBAccountingMax \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP -Never send more than the specified number of bytes in a given -accounting period, or receive more than that number in the period. -For example, with AccountingMax set to 1 GB, a server could send 900 MB -and receive 800 MB and continue running. It will only hibernate once one -of the two reaches 1 GB. -When the number of bytes is exhausted, Tor will hibernate until some -time in the next accounting period. To prevent all servers from -waking at the same time, Tor will also wait until a random point in -each period before waking up. If you have bandwidth cost issues, -enabling hibernation is preferable to setting a low bandwidth, since it -provides users with a collection of fast servers that are up some of -the time, which is more useful than a set of slow servers that are -always "available". -.LP -.TP -\fBAccountingStart \fR\fBday\fR|\fBweek\fR|\fBmonth\fR [\fIday\fR] \fIHH:MM\fR\fP -Specify how long accounting periods last. If \fBmonth\fP is given, -each accounting period runs from the time \fIHH:MM\fR on the -\fIday\fRth day of one month to the same day and time of the next. -(The day must be between 1 and 28.) If \fBweek\fP is given, each -accounting period runs from the time \fIHH:MM\fR of the \fIday\fRth -day of one week to the same day and time of the next week, with Monday -as day 1 and Sunday as day 7. If \fBday\fR is given, each accounting -period runs from the time \fIHH:MM\fR each day to the same time on the -next day. All times are local, and given in 24-hour time. (Defaults to -"month 1 0:00".) -.LP -.TP -\fBServerDNSResolvConfFile \fR\fIfilename\fP +Note that Tor will always use the public key step for the first hop if it\'s operating as a relay, and it will never use the public key step if it doesn\'t yet know the onion key of the first hop\&. (Default: 1) +.RE +.PP +\fBTransPort\fR \fIPORT\fR +.RS 4 +If non\-zero, enables transparent proxy support on +\fIPORT\fR +(by convention, 9040)\&. Requires OS support for transparent proxies, such as BSDs\' pf or Linux\'s IPTables\&. If you\'re planning to use Tor as a transparent proxy for a network, you\'ll want to examine and change VirtualAddrNetwork from the default setting\&. You\'ll also want to set the TransListenAddress option for the network you\'d like to proxy\&. (Default: 0)\&. +.RE +.PP +\fBTransListenAddress\fR \fIIP\fR[:\fIPORT\fR] +.RS 4 +Bind to this address to listen for transparent proxy connections\&. (Default: 127\&.0\&.0\&.1)\&. This is useful for exporting a transparent proxy server to an entire network\&. +.RE +.PP +\fBNATDPort\fR \fIPORT\fR +.RS 4 +Allow old versions of ipfw (as included in old versions of FreeBSD, etc\&.) to send connections through Tor using the NATD protocol\&. This option is only for people who cannot use TransPort\&. +.RE +.PP +\fBNATDListenAddress\fR \fIIP\fR[:\fIPORT\fR] +.RS 4 +Bind to this address to listen for NATD connections\&. (Default: 127\&.0\&.0\&.1)\&. +.RE +.PP +\fBAutomapHostsOnResolve\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is enabled, and we get a request to resolve an address that ends with one of the suffixes in +\fBAutomapHostsSuffixes\fR, we map an unused virtual address to that address, and return the new virtual address\&. This is handy for making "\&.onion" addresses work with applications that resolve an address and then connect to it\&. (Default: 0)\&. +.RE +.PP +\fBAutomapHostsSuffixes\fR \fISUFFIX\fR,\fISUFFIX\fR,\fI\&...\fR +.RS 4 +A comma\-separated list of suffixes to use with +\fBAutomapHostsOnResolve\fR\&. The "\&." suffix is equivalent to "all addresses\&." (Default: \&.exit,\&.onion)\&. +.RE +.PP +\fBDNSPort\fR \fIPORT\fR +.RS 4 +If non\-zero, Tor listens for UDP DNS requests on this port and resolves them anonymously\&. (Default: 0)\&. +.RE +.PP +\fBDNSListenAddress\fR \fIIP\fR[:\fIPORT\fR] +.RS 4 +Bind to this address to listen for DNS connections\&. (Default: 127\&.0\&.0\&.1)\&. +.RE +.PP +\fBClientDNSRejectInternalAddresses\fR \fB0\fR|\fB1\fR +.RS 4 +If true, Tor does not believe any anonymously retrieved DNS answer that tells it that an address resolves to an internal address (like 127\&.0\&.0\&.1 or 192\&.168\&.0\&.1)\&. This option prevents certain browser\-based attacks; don\'t turn it off unless you know what you\'re doing\&. (Default: 1)\&. +.RE +.PP +\fBDownloadExtraInfo\fR \fB0\fR|\fB1\fR +.RS 4 +If true, Tor downloads and caches "extra\-info" documents\&. These documents contain information about servers other than the information in their regular router descriptors\&. Tor does not use this information for anything itself; to save bandwidth, leave this option turned off\&. (Default: 0)\&. +.RE +.PP +\fBFallbackNetworkstatusFile\fR \fIFILENAME\fR +.RS 4 +If Tor doesn\'t have a cached networkstatus file, it starts out using this one instead\&. Even if this file is out of date, Tor can still use it to learn about directory mirrors, so it doesn\'t need to put load on the authorities\&. (Default: None)\&. +.RE +.PP +\fBWarnPlaintextPorts\fR \fIport\fR,\fIport\fR,\fI\&...\fR +.RS 4 +Tells Tor to issue a warnings whenever the user tries to make an anonymous connection to one of these ports\&. This option is designed to alert users to services that risk sending passwords in the clear\&. (Default: 23,109,110,143)\&. +.RE +.PP +\fBRejectPlaintextPorts\fR \fIport\fR,\fIport\fR,\fI\&...\fR +.RS 4 +Like WarnPlaintextPorts, but instead of warning about risky port uses, Tor will instead refuse to make the connection\&. (Default: None)\&. +.RE +.SH "SERVER OPTIONS" +The following options are useful only for servers (that is, if ORPort is non\-zero): +.PP +\fBAddress\fR \fIaddress\fR +.RS 4 +The IP address or fully qualified domain name of this server (e\&.g\&. moria\&.mit\&.edu)\&. You can leave this unset, and Tor will guess your IP address\&. This IP address is the one used to tell clients and other servers where to find your Tor server; it doesn\'t affect the IP that your Tor client binds to\&. To bind to a different address, use the *ListenAddress and OutboundBindAddress options\&. +.RE +.PP +\fBAllowSingleHopExits\fR \fB0\fR|\fB1\fR +.RS 4 +This option controls whether clients can use this server as a single hop proxy\&. If set to 1, clients can use this server as an exit even if it is the only hop in the circuit\&. (Default: 0) +.RE +.PP +\fBAssumeReachable\fR \fB0\fR|\fB1\fR +.RS 4 +This option is used when bootstrapping a new Tor network\&. If set to 1, don\'t do self\-reachability testing; just upload your server descriptor immediately\&. If +\fBAuthoritativeDirectory\fR +is also set, this option instructs the dirserver to bypass remote reachability testing too and list all connected servers as running\&. +.RE +.PP +\fBBridgeRelay\fR \fB0\fR|\fB1\fR +.RS 4 +Sets the relay to act as a "bridge" with respect to relaying connections from bridge users to the Tor network\&. Mainly it influences how the relay will cache and serve directory information\&. Usually used in combination with PublishServerDescriptor\&. +.RE +.PP +\fBContactInfo\fR \fIemail_address\fR +.RS 4 +Administrative contact information for server\&. This line might get picked up by spam harvesters, so you may want to obscure the fact that it\'s an email address\&. +.RE +.PP +\fBExitPolicy\fR \fIpolicy\fR,\fIpolicy\fR,\fI\&...\fR +.RS 4 +Set an exit policy for this server\&. Each policy is of the form "\fBaccept\fR|\fBreject\fR +\fIADDR\fR[/\fIMASK\fR][:\fIPORT\fR]"\&. If /\fIMASK\fR +is omitted then this policy just applies to the host given\&. Instead of giving a host or network you can also use "*" to denote the universe (0\&.0\&.0\&.0/0)\&. +\fIPORT\fR +can be a single port number, an interval of ports "\fIFROM_PORT\fR\-\fITO_PORT\fR", or "*"\&. If +\fIPORT\fR +is omitted, that means "*"\&. + +For example, "accept 18\&.7\&.22\&.69:*,reject 18\&.0\&.0\&.0/8:*,accept *:*" would reject any traffic destined for MIT except for web\&.mit\&.edu, and accept anything else\&. + +To specify all internal and link\-local networks (including 0\&.0\&.0\&.0/8, 169\&.254\&.0\&.0/16, 127\&.0\&.0\&.0/8, 192\&.168\&.0\&.0/16, 10\&.0\&.0\&.0/8, and 172\&.16\&.0\&.0/12), you can use the "private" alias instead of an address\&. These addresses are rejected by default (at the beginning of your exit policy), along with your public IP address, unless you set the ExitPolicyRejectPrivate config option to 0\&. For example, once you\'ve done that, you could allow HTTP to 127\&.0\&.0\&.1 and block all other connections to internal networks with "accept 127\&.0\&.0\&.1:80,reject private:*", though that may also allow connections to your own computer that are addressed to its public (external) IP address\&. See RFC 1918 and RFC 3330 for more details about internal and reserved IP address space\&. + +This directive can be specified multiple times so you don\'t have to put it all on one line\&. + +Policies are considered first to last, and the first match wins\&. If you want to _replace_ the default exit policy, end your exit policy with either a reject *:* or an accept *:*\&. Otherwise, you\'re _augmenting_ (prepending to) the default exit policy\&. The default exit policy is: +.sp +.RS 4 +.nf +reject *:25 +reject *:119 +reject *:135\-139 +reject *:445 +reject *:563 +reject *:1214 +reject *:4661\-4666 +reject *:6346\-6429 +reject *:6699 +reject *:6881\-6999 +accept *:* +.fi +.RE +.RE +.PP +\fBExitPolicyRejectPrivate\fR \fB0\fR|\fB1\fR +.RS 4 +Reject all private (local) networks, along with your own public IP address, at the beginning of your exit policy\&. See above entry on ExitPolicy\&. (Default: 1) +.RE +.PP +\fBMaxOnionsPending\fR \fINUM\fR +.RS 4 +If you have more than this number of onionskins queued for decrypt, reject new ones\&. (Default: 100) +.RE +.PP +\fBMyFamily\fR \fInode\fR,\fInode\fR,\fI\&...\fR +.RS 4 +Declare that this Tor server is controlled or administered by a group or organization identical or similar to that of the other servers, defined by their identity fingerprints or nicknames\&. When two servers both declare that they are in the same \'family\', Tor clients will not use them in the same circuit\&. (Each server only needs to list the other servers in its family; it doesn\'t need to list itself, but it won\'t hurt\&.) +.RE +.PP +\fBNickname\fR \fIname\fR +.RS 4 +Set the server\'s nickname to \'name\'\&. Nicknames must be between 1 and 19 characters inclusive, and must contain only the characters [a\-zA\-Z0\-9]\&. +.RE +.PP +\fBNumCPUs\fR \fInum\fR +.RS 4 +How many processes to use at once for decrypting onionskins\&. (Default: 1) +.RE +.PP +\fBORPort\fR \fIPORT\fR +.RS 4 +Advertise this port to listen for connections from Tor clients and servers\&. +.RE +.PP +\fBORListenAddress\fR \fIIP\fR[:\fIPORT\fR] +.RS 4 +Bind to this IP address to listen for connections from Tor clients and servers\&. If you specify a port, bind to this port rather than the one specified in ORPort\&. (Default: 0\&.0\&.0\&.0) This directive can be specified multiple times to bind to multiple addresses/ports\&. +.RE +.PP +\fBPublishServerDescriptor\fR \fB0\fR|\fB1\fR|\fBv1\fR|\fBv2\fR|\fBv3\fR|\fBbridge\fR|\fBhidserv\fR,\fB\&...\fR +.RS 4 +This option is only considered if you have an ORPort defined\&. You can choose multiple arguments, separated by commas\&. If set to 0, Tor will act as a server but it will not publish its descriptor to the directory authorities\&. (This is useful if you\'re testing out your server, or if you\'re using a Tor controller that handles directory publishing for you\&.) Otherwise, Tor will publish its descriptor to all directory authorities of the type(s) specified\&. The value "1" is the default, which means "publish to the appropriate authorities"\&. +.RE +.PP +\fBShutdownWaitLength\fR \fINUM\fR +.RS 4 +When we get a SIGINT and we\'re a server, we begin shutting down: we close listeners and start refusing new circuits\&. After +\fBNUM\fR +seconds, we exit\&. If we get a second SIGINT, we exit immedi\- ately\&. (Default: 30 seconds) +.RE +.PP +\fBAccountingMax\fR \fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fR +.RS 4 +Never send more than the specified number of bytes in a given accounting period, or receive more than that number in the period\&. For example, with AccountingMax set to 1 GB, a server could send 900 MB and receive 800 MB and continue running\&. It will only hibernate once one of the two reaches 1 GB\&. When the number of bytes is exhausted, Tor will hibernate until some time in the next accounting period\&. To prevent all servers from waking at the same time, Tor will also wait until a random point in each period before waking up\&. If you have bandwidth cost issues, enabling hibernation is preferable to setting a low bandwidth, since it provides users with a collection of fast servers that are up some of the time, which is more useful than a set of slow servers that are always "available"\&. +.RE +.PP +\fBAccountingStart\fR \fBday\fR|\fBweek\fR|\fBmonth\fR [\fIday\fR] \fIHH:MM\fR +.RS 4 +Specify how long accounting periods last\&. If +\fBmonth\fR +is given, each accounting period runs from the time +\fIHH:MM\fR +on the +\fIdayth\fR +day of one month to the same day and time of the next\&. (The day must be between 1 and 28\&.) If +\fBweek\fR +is given, each accounting period runs from the time +\fIHH:MM\fR +of the +\fIdayth\fR +day of one week to the same day and time of the next week, with Monday as day 1 and Sunday as day 7\&. If +\fBday\fR +is given, each accounting period runs from the time +\fIHH:MM\fR +each day to the same time on the next day\&. All times are local, and given in 24\-hour time\&. (Defaults to "month 1 0:00"\&.) +.RE +.PP +\fBServerDNSResolvConfFile\fR \fIfilename\fR +.RS 4 Overrides the default DNS configuration with the configuration in -\fIfilename\fP. The file format is the same as the standard Unix -"\fBresolv.conf\fP" file (7). This option, like all other -ServerDNS options, only affects name lookups that your server does on -behalf of clients. Also, it only takes effect if Tor was built with -eventdns support. (Defaults to use the system DNS configuration.) -.LP -.TP -\fBServerDNSSearchDomains \fR\fB0\fR|\fB1\fR\fP -If set to \fB1\fP, then we will search for addresses in the local search -domain. For example, if this system is configured to believe it is in -"example.com", and a client tries to connect to "www", the client will be -connected to "www.example.com". -This option only affects name lookups that your server does on -behalf of clients, and only takes effect if Tor was built with -eventdns support. -(Defaults to "0".) -.LP -.TP -\fBServerDNSDetectHijacking \fR\fB0\fR|\fB1\fR\fP -When this option is set to 1, we will test periodically to determine whether -our local nameservers have been configured to hijack failing DNS requests -(usually to an advertising site). If they are, we will attempt to correct -this. -This option only affects name lookups that your server does on -behalf of clients, and only takes effect if Tor was built with -eventdns support. -(Defaults to "1".) -.LP -.TP -\fBServerDNSTestAddresses \fR\fIaddress\fR,\fIaddress\fR,\fI...\fP -When we're detecting DNS hijacking, make sure that these \fIvalid\fP -addresses aren't getting redirected. If they are, then our DNS is -completely useless, and we'll reset our exit policy to "reject *:*". -This option only affects name lookups that your server does on -behalf of clients, and only takes effect if Tor was built with -eventdns support. -(Defaults to "www.google.com, www.mit.edu, www.yahoo.com, -www.slashdot.org".) -.LP -.TP -\fBServerDNSAllowNonRFC953Hostnames \fR\fB0\fR|\fB1\fR\fP -When this option is disabled, Tor does not try to resolve hostnames -containing illegal characters (like @ and :) rather than sending them to an -exit node to be resolved. This helps trap accidental attempts to resolve -URLs and so on. -This option only affects name lookups that your server does on -behalf of clients, and only takes effect if Tor was built with -eventdns support. -(Default: 0) -.LP -.TP -\fBBridgeRecordUsageByCountry \fR\fB0\fR|\fB1\fR\fP -When this option is enabled and BridgeRelay is also enabled, and we -have GeoIP data, Tor keeps a keep a per-country count of how many -client addresses have contacted it so that it can help the bridge -authority guess which countries have blocked access to it. -.LP -.TP -\fBGeoIPFile \fR\fIfilename\fP -A filename containing GeoIP data, for use with BridgeRecordUsageByCountry. - -.SH DIRECTORY SERVER OPTIONS +\fIfilename\fR\&. The file format is the same as the standard Unix "\fBresolv\&.conf\fR" file (7)\&. This option, like all other ServerDNS options, only affects name lookups that your server does on behalf of clients\&. (Defaults to use the system DNS configuration\&.) +.RE .PP -The following options are useful only for directory servers (that is, if \fBDirPort\fP is non-zero): -.LP -.TP -\fBAuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP -When this option is set to 1, Tor operates as an authoritative -directory server. Instead of caching the directory, it generates its -own list of good servers, signs it, and sends that to the clients. -Unless the clients already have you listed as a trusted directory, you -probably do not want to set this option. Please coordinate with the other -admins at tor-ops@freehaven.net if you think you should be a directory. -.LP -.TP -\fBV1AuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP -When this option is set in addition to \fBAuthoritativeDirectory\fP, Tor -generates version 1 directory and running-routers documents (for legacy -Tor clients up to 0.1.0.x). -.LP -.TP -\fBV2AuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP -When this option is set in addition to \fBAuthoritativeDirectory\fP, Tor -generates version 2 network statuses and serves descriptors, etc as -described in doc/spec/dir-spec-v2.txt (for Tor clients and servers -running 0.1.1.x and 0.1.2.x). -.LP -.TP -\fBV3AuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP -When this option is set in addition to \fBAuthoritativeDirectory\fP, Tor -generates version 3 network statuses and serves descriptors, etc as -described in doc/spec/dir-spec.txt (for Tor clients and servers -running at least 0.2.0.x). -.LP -.TP -\fBVersioningAuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP -When this option is set to 1, Tor adds information on -which versions of Tor are still believed safe for use to -the published directory. Each version 1 authority is -automatically a versioning authority; version 2 authorities -provide this service optionally. See \fBRecommendedVersions\fP, -\fBRecommendedClientVersions\fP, and \fBRecommendedServerVersions\fP. -.LP -.TP -\fBNamingAuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP -When this option is set to 1, then the server advertises that it has -opinions about nickname-to-fingerprint bindings. It will include these -opinions in its published network-status pages, by listing servers with -the flag "Named" if a correct binding between that nickname and -fingerprint has been registered with the dirserver. Naming dirservers -will refuse to accept or publish descriptors that contradict a -registered binding. See \fBapproved-routers\fP in the \fBFILES\fP -section below. -.LP -.TP -\fBHSAuthoritativeDir \fR\fB0\fR|\fB1\fR\fP -When this option is set in addition to \fBAuthoritativeDirectory\fP, Tor also -accepts and serves hidden service descriptors. (Default: 0) -.LP -.TP -\fBHSAuthorityRecordStats \fR\fB0\fR|\fB1\fR\fP -When this option is set in addition to \fBHSAuthoritativeDir\fP, Tor -periodically (every 15 minutes) writes statistics about hidden service -usage to a file \fBhsusage\fP in its data directory. (Default: 0) -.LP -.TP -\fBHidServDirectoryV2 \fR\fB0\fR|\fB1\fR\fP -When this option is set, Tor accepts and serves v2 hidden service -descriptors. (Default: 0) -.LP -.TP -\fBBridgeAuthoritativeDir \fR\fB0\fR|\fB1\fR\fP -When this option is set in addition to \fBAuthoritativeDirectory\fP, Tor -accepts and serves router descriptors, but it caches and serves the main -networkstatus documents rather than generating its own. (Default: 0) -.LP -.TP -\fBMinUptimeHidServDirectoryV2 \fR\fIN\fR \fBseconds\fR|\fBminutes\fR|\fBhours\fR|\fBdays\fR|\fBweeks\fP -Minimum uptime of a v2 hidden service directory to be accepted as such by -authoritative directories. (Default: 24 hours) -.LP -.TP -\fBDirPort \fR\fIPORT\fP -Advertise the directory service on this port. -.LP -.TP -\fBDirListenAddress \fR\fIIP\fR[:\fIPORT\fR]\fP -Bind the directory service to this address. If you specify a port, bind -to this port rather than the one specified in DirPort. (Default: 0.0.0.0) -This directive can be specified multiple times to bind to multiple -addresses/ports. -.LP -.TP -\fBDirPolicy \fR\fIpolicy\fR,\fIpolicy\fR,\fI...\fP -Set an entrance policy for this server, to limit who can connect to the -directory ports. -The policies have the same form as exit policies above. -.LP -.TP - -.SH DIRECTORY AUTHORITY SERVER OPTIONS +\fBServerDNSAllowBrokenConfig\fR \fB0\fR|\fB1\fR +.RS 4 +If this option is false, Tor exits immediately if there are problems parsing the system DNS configuration or connecting to nameservers\&. Otherwise, Tor continues to periodically retry the system nameservers until it eventually succeeds\&. (Defaults to "1"\&.) +.RE .PP -\fBRecommendedVersions \fR\fISTRING\fP -STRING is a comma-separated list of Tor versions currently believed -to be safe. The list is included in each directory, and nodes which -pull down the directory learn whether they need to upgrade. This -option can appear multiple times: the values from multiple lines are -spliced together. -When this is set then -\fBVersioningAuthoritativeDirectory\fP should be set too. -.LP -.TP -\fBRecommendedClientVersions \fR\fISTRING\fP -STRING is a comma-separated list of Tor versions currently believed -to be safe for clients to use. This information is included in version 2 -directories. If this is not set then the value of \fBRecommendedVersions\fR -is used. -When this is set then -\fBVersioningAuthoritativeDirectory\fP should be set too. -.LP -.TP -\fBRecommendedServerVersions \fR\fISTRING\fP -STRING is a comma-separated list of Tor versions currently believed -to be safe for servers to use. This information is included in version 2 -directories. If this is not set then the value of \fBRecommendedVersions\fR -is used. -When this is set then -\fBVersioningAuthoritativeDirectory\fP should be set too. -.LP -.TP -\fBDirAllowPrivateAddresses \fR\fB0\fR|\fB1\fR\fP -If set to 1, Tor will accept router descriptors with arbitrary "Address" -elements. Otherwise, if the address is not an IP address or is a private -IP address, it will reject the router descriptor. Defaults to 0. -.LP -.TP -\fBAuthDirBadDir \fR\fIAddressPattern\fR...\fP -Authoritative directories only. A set of address patterns for servers that -will be listed as bad directories in any network status document this authority -publishes, if \fBAuthDirListBadDirs\fR is set. -.LP -.TP -\fBAuthDirBadExit \fR\fIAddressPattern\fR...\fP -Authoritative directories only. A set of address patterns for servers that -will be listed as bad exits in any network status document this authority -publishes, if \fBAuthDirListBadExits\fR is set. -.LP -.TP -\fBAuthDirInvalid \fR\fIAddressPattern\fR...\fP -Authoritative directories only. A set of address patterns for servers that -will never be listed as "valid" in any network status document that this -authority publishes. -.LP -.TP -\fBAuthDirReject \fR\fIAddressPattern\fR...\fP -Authoritative directories only. A set of address patterns for servers that -will never be listed at all in any network status document that this -authority publishes, or accepted as an OR address in any descriptor submitted -for publication by this authority. -.LP -.TP -\fBAuthDirListBadDirs \fR\fB0\fR|\fB1\fR\fP -Authoritative directories only. If set to 1, this directory has -some opinion about which nodes are unsuitable as directory caches. (Do not -set this to 1 unless you plan to list nonfunctioning directories as bad; -otherwise, you are effectively voting in favor of every declared directory.) -.LP -.TP -\fBAuthDirListBadExits \fR\fB0\fR|\fB1\fR\fP -Authoritative directories only. If set to 1, this directory has -some opinion about which nodes are unsuitable as exit nodes. (Do not -set this to 1 unless you plan to list nonfunctioning exits as bad; -otherwise, you are effectively voting in favor of every declared exit -as an exit.) -.LP -.TP -\fBAuthDirRejectUnlisted \fR\fB0\fR|\fB1\fR\fP -Authoritative directories only. If set to 1, the directory server -rejects all uploaded server descriptors that aren't explicitly listed -in the fingerprints file. This acts as a "panic button" if we get -Sybiled. (Default: 0) -.LP -.TP -\fBAuthDirMaxServersPerAddr\fR \fINUM\fP -Authoritative directories only. The maximum number of servers that we -will list as acceptable on a single IP address. Set this to "0" for -"no limit". (Default: 2) -.LP -.TP -\fBAuthDirMaxServersPerAuthAddr\fR \fINUM\fP -Authoritative directories only. Like AuthDirMaxServersPerAddr, but -applies to addresses shared with directory authorities. (Default: 5) -.LP -.TP -\fBV3AuthVotingInterval\fR \fR\fIN\fR \fBminutes\fR|\fBhours\fP -V3 authoritative directories only. Configures the server's preferred -voting interval. Note that voting will \fIactually\fP happen at an -interval chosen by consensus from all the authorities' preferred -intervals. This time SHOULD divide evenly into a day. (Default: 1 hour) -.LP -.TP -\fBV3AuthVoteDelay\fR \fINUM\fP -V3 authoritative directories only. Configures the server's preferred -delay between publishing its vote and assuming it has all the votes -from all the other authorities. Note that the actual time used is not -the server's preferred time, but the consensus of all preferences. -(Default: 5 minutes.) -.LP -.TP -\fBV3AuthDistDelay\fR \fINUM\fP -V3 authoritative directories only. Configures the server's preferred -delay between publishing its consensus and signature and assuming it -has all the signatures from all the other authorities. Note that the -actual time used is not the server's preferred time, but the consensus -of all preferences. (Default: 5 minutes.) -.LP -.TP -\fBV3AuthNIntervalsValid\fR \fINUM\fP -V3 authoritative directories only. Configures the number of -VotingIntervals for which each consensus should be valid for. -Choosing high numbers increases network partitioning risks; choosing -low numbers increases directory traffic. Note that the actual number -of intervals used is not the server's preferred number, but the -consensus of all preferences. Must be at least 2. (Default: 3.) - - -.SH HIDDEN SERVICE OPTIONS +\fBServerDNSSearchDomains\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 1, then we will search for addresses in the local search domain\&. For example, if this system is configured to believe it is in "example\&.com", and a client tries to connect to "www", the client will be connected to "www\&.example\&.com"\&. This option only affects name lookups that your server does on behalf of clients\&. (Defaults to "0"\&.) +.RE .PP -The following options are used to configure a hidden service. -.LP -.TP -\fBHiddenServiceDir \fR\fIDIRECTORY\fP -Store data files for a hidden service in DIRECTORY. Every hidden -service must have a separate directory. You may use this option multiple -times to specify multiple services. -.LP -.TP -\fBHiddenServicePort \fR\fIVIRTPORT \fR[\fITARGET\fR]\fP -Configure a virtual port VIRTPORT for a hidden service. You may use this -option multiple times; each time applies to the service using the most recent -hiddenservicedir. By default, this option maps the virtual port to the -same port on 127.0.0.1. You may override the target port, address, or both -by specifying a target of addr, port, or addr:port. You may also have -multiple lines with the same VIRTPORT: when a user connects to that VIRTPORT, -one of the TARGETs from those lines will be chosen at random. -.LP -.TP -\fBHiddenServiceNodes \fR\fInode\fR,\fInode\fR,\fI...\fP -If possible, use the specified nodes, defined by their identity fingerprints or -nicknames, as introduction points for the hidden service. If this is left -unset, Tor will be smart and pick some reasonable ones; most people can leave -this unset. -.LP -.TP -\fBHiddenServiceExcludeNodes \fR\fInode\fR,\fInode\fR,\fI...\fP -Do not use the specified nodes, defined by their identity fingerprints or -nicknames, as introduction points for the hidden service. In normal use there -is no reason to set this. -.LP -.TP -\fBPublishHidServDescriptors \fR\fB0\fR|\fB1\fR\fP -If set to 0, Tor will run any hidden services you configure, but it won't -advertise them to the rendezvous directory. This option is only useful -if you're using a Tor controller that handles hidserv publishing for you. -(Default: 1) -.LP -.TP -\fBHiddenServiceVersion \fR\fIversion\fR,\fIversion\fR,\fI...\fP -A list of rendezvous service descriptor versions to publish for the hidden -service. Possible version numbers are 0 and 2. (Default: 0, 2) -.LP -.TP -\fBRendPostPeriod \fR\fIN\fR \fBseconds\fR|\fBminutes\fR|\fBhours\fR|\fBdays\fR|\fBweeks\fP -Every time the specified period elapses, Tor uploads any rendezvous -service descriptors to the directory servers. This information is also -uploaded whenever it changes. (Default: 20 minutes) - -.\" UNDOCUMENTED -.\" ignoreversion - -.SH SIGNALS +\fBServerDNSDetectHijacking\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set to 1, we will test periodically to determine whether our local nameservers have been configured to hijack failing DNS requests (usually to an advertising site)\&. If they are, we will attempt to correct this\&. This option only affects name lookups that your server does on behalf of clients\&. (Defaults to "1"\&.) +.RE +.PP +\fBServerDNSTestAddresses\fR \fIaddress\fR,\fIaddress\fR,\fI\&...\fR +.RS 4 +When we\'re detecting DNS hijacking, make sure that these +\fIvalid\fR +addresses aren\'t getting redirected\&. If they are, then our DNS is completely useless, and we\'ll reset our exit policy to "reject +\fB:\fR"\&. This option only affects name lookups that your server does on behalf of clients\&. (Defaults to "www\&.google\&.com, www\&.mit\&.edu, www\&.yahoo\&.com, www\&.slashdot\&.org"\&.) +.RE +.PP +\fBServerDNSAllowNonRFC953Hostnames\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is disabled, Tor does not try to resolve hostnames containing illegal characters (like @ and :) rather than sending them to an exit node to be resolved\&. This helps trap accidental attempts to resolve URLs and so on\&. This option only affects name lookups that your server does on behalf of clients\&. (Default: 0) +.RE +.PP +\fBBridgeRecordUsageByCountry\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is enabled and BridgeRelay is also enabled, and we have GeoIP data, Tor keeps a keep a per\-country count of how many client addresses have contacted it so that it can help the bridge authority guess which countries have blocked access to it\&. (Default: 1) +.RE +.PP +\fBServerDNSRandomizeCase\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set, Tor sets the case of each character randomly in outgoing DNS requests, and makes sure that the case matches in DNS replies\&. This so\-called "0x20 hack" helps resist some types of DNS poisoning attack\&. For more information, see "Increased DNS Forgery Resistance through 0x20\-Bit Encoding"\&. This option only affects name lookups that your server does on behalf of clients\&. (Default: 1) +.RE +.PP +\fBGeoIPFile\fR \fIfilename\fR +.RS 4 +A filename containing GeoIP data, for use with BridgeRecordUsageByCountry\&. +.RE +.PP +\fBCellStatistics\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is enabled, Tor writes statistics on the mean time that cells spend in circuit queues to disk every 24 hours\&. (Default: 0) +.RE +.PP +\fBDirReqStatistics\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is enabled, Tor writes statistics on the number and response time of network status requests to disk every 24 hours\&. (Default: 0) +.RE +.PP +\fBEntryStatistics\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is enabled, Tor writes statistics on the number of directly connecting clients to disk every 24 hours\&. (Default: 0) +.RE +.PP +\fBExitPortStatistics\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is enabled, Tor writes statistics on the number of relayed bytes and opened stream per exit port to disk every 24 hours\&. (Default: 0) +.RE +.PP +\fBExtraInfoStatistics\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is enabled, Tor includes previously gathered statistics in its extra\-info documents that it uploads to the directory authorities\&. (Default: 0) +.RE +.SH "DIRECTORY SERVER OPTIONS" +The following options are useful only for directory servers (that is, if DirPort is non\-zero): +.PP +\fBAuthoritativeDirectory\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set to 1, Tor operates as an authoritative directory server\&. Instead of caching the directory, it generates its own list of good servers, signs it, and sends that to the clients\&. Unless the clients already have you listed as a trusted directory, you probably do not want to set this option\&. Please coordinate with the other admins at +tor\-ops@torproject\&.org +if you think you should be a directory\&. +.RE +.PP +\fBDirPortFrontPage\fR \fIFILENAME\fR +.RS 4 +When this option is set, it takes an HTML file and publishes it as "/" on the DirPort\&. Now relay operators can provide a disclaimer without needing to set up a separate webserver\&. There\'s a sample disclaimer in contrib/tor\-exit\-notice\&.html\&. +.RE +.PP +\fBV1AuthoritativeDirectory\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set in addition to +\fBAuthoritativeDirectory\fR, Tor generates version 1 directory and running\-routers documents (for legacy Tor clients up to 0\&.1\&.0\&.x)\&. +.RE +.PP +\fBV2AuthoritativeDirectory\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set in addition to +\fBAuthoritativeDirectory\fR, Tor generates version 2 network statuses and serves descriptors, etc as described in doc/spec/dir\-spec\-v2\&.txt (for Tor clients and servers running 0\&.1\&.1\&.x and 0\&.1\&.2\&.x)\&. +.RE +.PP +\fBV3AuthoritativeDirectory\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set in addition to +\fBAuthoritativeDirectory\fR, Tor generates version 3 network statuses and serves descriptors, etc as described in doc/spec/dir\-spec\&.txt (for Tor clients and servers running at least 0\&.2\&.0\&.x)\&. +.RE +.PP +\fBVersioningAuthoritativeDirectory\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set to 1, Tor adds information on which versions of Tor are still believed safe for use to the published directory\&. Each version 1 authority is automatically a versioning authority; version 2 authorities provide this service optionally\&. See +\fBRecommendedVersions\fR, +\fBRecommendedClientVersions\fR, and +\fBRecommendedServerVersions\fR\&. +.RE +.PP +\fBNamingAuthoritativeDirectory\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set to 1, then the server advertises that it has opinions about nickname\-to\-fingerprint bindings\&. It will include these opinions in its published network\-status pages, by listing servers with the flag "Named" if a correct binding between that nickname and fingerprint has been registered with the dirserver\&. Naming dirservers will refuse to accept or publish descriptors that contradict a registered binding\&. See +\fBapproved\-routers\fR +in the +\fBFILES\fR +section below\&. +.RE +.PP +\fBHSAuthoritativeDir\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set in addition to +\fBAuthoritativeDirectory\fR, Tor also accepts and serves hidden service descriptors\&. (Default: 0) +.RE +.PP +\fBHidServDirectoryV2\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set, Tor accepts and serves v2 hidden service descriptors\&. Setting DirPort is not required for this, because clients connect via the ORPort by default\&. (Default: 1) +.RE +.PP +\fBBridgeAuthoritativeDir\fR \fB0\fR|\fB1\fR +.RS 4 +When this option is set in addition to +\fBAuthoritativeDirectory\fR, Tor accepts and serves router descriptors, but it caches and serves the main networkstatus documents rather than generating its own\&. (Default: 0) +.RE +.PP +\fBMinUptimeHidServDirectoryV2\fR \fIN\fR \fBseconds\fR|\fBminutes\fR|\fBhours\fR|\fBdays\fR|\fBweeks\fR +.RS 4 +Minimum uptime of a v2 hidden service directory to be accepted as such by authoritative directories\&. (Default: 24 hours) +.RE +.PP +\fBDirPort\fR \fIPORT\fR +.RS 4 +Advertise the directory service on this port\&. +.RE +.PP +\fBDirListenAddress\fR \fIIP\fR[:\fIPORT\fR] +.RS 4 +Bind the directory service to this address\&. If you specify a port, bind to this port rather than the one specified in DirPort\&. (Default: 0\&.0\&.0\&.0) This directive can be specified multiple times to bind to multiple addresses/ports\&. +.RE +.PP +\fBDirPolicy\fR \fIpolicy\fR,\fIpolicy\fR,\fI\&...\fR +.RS 4 +Set an entrance policy for this server, to limit who can connect to the directory ports\&. The policies have the same form as exit policies above\&. +.RE +.SH "DIRECTORY AUTHORITY SERVER OPTIONS" +.PP +\fBRecommendedVersions\fR \fISTRING\fR +.RS 4 +STRING is a comma\-separated list of Tor versions currently believed to be safe\&. The list is included in each directory, and nodes which pull down the directory learn whether they need to upgrade\&. This option can appear multiple times: the values from multiple lines are spliced together\&. When this is set then +\fBVersioningAuthoritativeDirectory\fR +should be set too\&. +.RE +.PP +\fBRecommendedClientVersions\fR \fISTRING\fR +.RS 4 +STRING is a comma\-separated list of Tor versions currently believed to be safe for clients to use\&. This information is included in version 2 directories\&. If this is not set then the value of +\fBRecommendedVersions\fR +is used\&. When this is set then +\fBVersioningAuthoritativeDirectory\fR +should be set too\&. +.RE +.PP +\fBRecommendedServerVersions\fR \fISTRING\fR +.RS 4 +STRING is a comma\-separated list of Tor versions currently believed to be safe for servers to use\&. This information is included in version 2 directories\&. If this is not set then the value of +\fBRecommendedVersions\fR +is used\&. When this is set then +\fBVersioningAuthoritativeDirectory\fR +should be set too\&. +.RE +.PP +\fBConsensusParams\fR \fISTRING\fR +.RS 4 +STRING is a space\-separated list of key=value pairs that Tor will include in the "params" line of its networkstatus vote\&. +.RE +.PP +\fBDirAllowPrivateAddresses\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 1, Tor will accept router descriptors with arbitrary "Address" elements\&. Otherwise, if the address is not an IP address or is a private IP address, it will reject the router descriptor\&. Defaults to 0\&. +.RE +.PP +\fBAuthDirBadDir\fR \fIAddressPattern\&...\fR +.RS 4 +Authoritative directories only\&. A set of address patterns for servers that will be listed as bad directories in any network status document this authority publishes, if +\fBAuthDirListBadDirs\fR +is set\&. +.RE +.PP +\fBAuthDirBadExit\fR \fIAddressPattern\&...\fR +.RS 4 +Authoritative directories only\&. A set of address patterns for servers that will be listed as bad exits in any network status document this authority publishes, if +\fBAuthDirListBadExits\fR +is set\&. +.RE +.PP +\fBAuthDirInvalid\fR \fIAddressPattern\&...\fR +.RS 4 +Authoritative directories only\&. A set of address patterns for servers that will never be listed as "valid" in any network status document that this authority publishes\&. +.RE +.PP +\fBAuthDirReject\fR \fIAddressPattern\fR\&... +.RS 4 +Authoritative directories only\&. A set of address patterns for servers that will never be listed at all in any network status document that this authority publishes, or accepted as an OR address in any descriptor submitted for publication by this authority\&. +.RE +.PP +\fBAuthDirListBadDirs\fR \fB0\fR|\fB1\fR +.RS 4 +Authoritative directories only\&. If set to 1, this directory has some opinion about which nodes are unsuitable as directory caches\&. (Do not set this to 1 unless you plan to list non\-functioning directories as bad; otherwise, you are effectively voting in favor of every declared directory\&.) +.RE +.PP +\fBAuthDirListBadExits\fR \fB0\fR|\fB1\fR +.RS 4 +Authoritative directories only\&. If set to 1, this directory has some opinion about which nodes are unsuitable as exit nodes\&. (Do not set this to 1 unless you plan to list non\-functioning exits as bad; otherwise, you are effectively voting in favor of every declared exit as an exit\&.) +.RE +.PP +\fBAuthDirRejectUnlisted\fR \fB0\fR|\fB1\fR +.RS 4 +Authoritative directories only\&. If set to 1, the directory server rejects all uploaded server descriptors that aren\'t explicitly listed in the fingerprints file\&. This acts as a "panic button" if we get hit with a Sybil attack\&. (Default: 0) +.RE +.PP +\fBAuthDirMaxServersPerAddr\fR \fINUM\fR +.RS 4 +Authoritative directories only\&. The maximum number of servers that we will list as acceptable on a single IP address\&. Set this to "0" for "no limit"\&. (Default: 2) +.RE +.PP +\fBAuthDirMaxServersPerAuthAddr\fR \fINUM\fR +.RS 4 +Authoritative directories only\&. Like AuthDirMaxServersPerAddr, but applies to addresses shared with directory authorities\&. (Default: 5) +.RE +.PP +\fBV3AuthVotingInterval\fR \fIN\fR \fBminutes\fR|\fBhours\fR +.RS 4 +V3 authoritative directories only\&. Configures the server\'s preferred voting interval\&. Note that voting will +\fIactually\fR +happen at an interval chosen by consensus from all the authorities\' preferred intervals\&. This time SHOULD divide evenly into a day\&. (Default: 1 hour) +.RE +.PP +\fBV3AuthVoteDelay\fR \fIN\fR \fBminutes\fR|\fBhours\fR +.RS 4 +V3 authoritative directories only\&. Configures the server\'s preferred delay between publishing its vote and assuming it has all the votes from all the other authorities\&. Note that the actual time used is not the server\'s preferred time, but the consensus of all preferences\&. (Default: 5 minutes\&.) +.RE +.PP +\fBV3AuthDistDelay\fR \fIN\fR \fBminutes\fR|\fBhours\fR +.RS 4 +V3 authoritative directories only\&. Configures the server\'s preferred delay between publishing its consensus and signature and assuming it has all the signatures from all the other authorities\&. Note that the actual time used is not the server\'s preferred time, but the consensus of all preferences\&. (Default: 5 minutes\&.) +.RE +.PP +\fBV3AuthNIntervalsValid\fR \fINUM\fR +.RS 4 +V3 authoritative directories only\&. Configures the number of VotingIntervals for which each consensus should be valid for\&. Choosing high numbers increases network partitioning risks; choosing low numbers increases directory traffic\&. Note that the actual number of intervals used is not the server\'s preferred number, but the consensus of all preferences\&. Must be at least 2\&. (Default: 3\&.) +.RE +.SH "HIDDEN SERVICE OPTIONS" +The following options are used to configure a hidden service\&. +.PP +\fBHiddenServiceDir\fR \fIDIRECTORY\fR +.RS 4 +Store data files for a hidden service in DIRECTORY\&. Every hidden service must have a separate directory\&. You may use this option multiple times to specify multiple services\&. +.RE +.PP +\fBHiddenServicePort\fR \fIVIRTPORT\fR [\fITARGET\fR] +.RS 4 +Configure a virtual port VIRTPORT for a hidden service\&. You may use this option multiple times; each time applies to the service using the most recent hiddenservicedir\&. By default, this option maps the virtual port to the same port on 127\&.0\&.0\&.1\&. You may override the target port, address, or both by specifying a target of addr, port, or addr:port\&. You may also have multiple lines with the same VIRTPORT: when a user connects to that VIRTPORT, one of the TARGETs from those lines will be chosen at random\&. +.RE +.PP +\fBPublishHidServDescriptors\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 0, Tor will run any hidden services you configure, but it won\'t advertise them to the rendezvous directory\&. This option is only useful if you\'re using a Tor controller that handles hidserv publishing for you\&. (Default: 1) +.RE +.PP +\fBHiddenServiceVersion\fR \fIversion\fR,\fIversion\fR,\fI\&...\fR +.RS 4 +A list of rendezvous service descriptor versions to publish for the hidden service\&. Currently, only version 2 is supported\&. (Default: 2) +.RE +.PP +\fBHiddenServiceAuthorizeClient\fR \fIauth\-type\fR \fIclient\-name\fR,\fIclient\-name\fR,\fI\&...\fR +.RS 4 +If configured, the hidden service is accessible for authorized clients only\&. The auth\-type can either be \'basic\' for a general\-purpose authorization protocol or \'stealth\' for a less scalable protocol that also hides service activity from unauthorized clients\&. Only clients that are listed here are authorized to access the hidden service\&. Valid client names are 1 to 19 characters long and only use characters in A\-Za\-z0\-9+\-_ (no spaces)\&. If this option is set, the hidden service is not accessible for clients without authorization any more\&. Generated authorization data can be found in the hostname file\&. Clients need to put this authorization data in their configuration file using +\fBHidServAuth\fR\&. +.RE +.PP +\fBRendPostPeriod\fR \fIN\fR \fBseconds\fR|\fBminutes\fR|\fBhours\fR|\fBdays\fR|\fBweeks\fR +.RS 4 +Every time the specified period elapses, Tor uploads any rendezvous service descriptors to the directory servers\&. This information is also uploaded whenever it changes\&. (Default: 20 minutes) +.RE +.SH "TESTING NETWORK OPTIONS" +The following options are used for running a testing Tor network\&. +.PP +\fBTestingTorNetwork\fR \fB0\fR|\fB1\fR +.RS 4 +If set to 1, Tor adjusts default values of the configuration options below, so that it is easier to set up a testing Tor network\&. May only be set if non\-default set of DirServers is set\&. Cannot be unset while Tor is running\&. (Default: 0) +.sp +.RS 4 +.nf +ServerDNSAllowBrokenConfig 1 +DirAllowPrivateAddresses 1 +EnforceDistinctSubnets 0 +AssumeReachable 1 +AuthDirMaxServersPerAddr 0 +AuthDirMaxServersPerAuthAddr 0 +ClientDNSRejectInternalAddresses 0 +ExitPolicyRejectPrivate 0 +V3AuthVotingInterval 5 minutes +V3AuthVoteDelay 20 seconds +V3AuthDistDelay 20 seconds +TestingV3AuthInitialVotingInterval 5 minutes +TestingV3AuthInitialVoteDelay 20 seconds +TestingV3AuthInitialDistDelay 20 seconds +TestingAuthDirTimeToLearnReachability 0 minutes +TestingEstimatedDescriptorPropagationTime 0 minutes +.fi +.RE +.RE +.PP +\fBTestingV3AuthInitialVotingInterval\fR \fIN\fR \fBminutes\fR|\fBhours\fR +.RS 4 +Like V3AuthVotingInterval, but for initial voting interval before the first consensus has been created\&. Changing this requires that +\fBTestingTorNetwork\fR +is set\&. (Default: 30 minutes) +.RE +.PP +\fBTestingV3AuthInitialVoteDelay\fR \fIN\fR \fBminutes\fR|\fBhours\fR +.RS 4 +Like TestingV3AuthInitialVoteDelay, but for initial voting interval before the first consensus has been created\&. Changing this requires that +\fBTestingTorNetwork\fR +is set\&. (Default: 5 minutes) +.RE +.PP +\fBTestingV3AuthInitialDistDelay\fR \fIN\fR \fBminutes\fR|\fBhours\fR +.RS 4 +Like TestingV3AuthInitialDistDelay, but for initial voting interval before the first consensus has been created\&. Changing this requires that +\fBTestingTorNetwork\fR +is set\&. (Default: 5 minutes) +.RE +.PP +\fBTestingAuthDirTimeToLearnReachability\fR \fIN\fR \fBminutes\fR|\fBhours\fR +.RS 4 +After starting as an authority, do not make claims about whether routers are Running until this much time has passed\&. Changing this requires that +\fBTestingTorNetwork\fR +is set\&. (Default: 30 minutes) +.RE +.PP +\fBTestingEstimatedDescriptorPropagationTime\fR \fIN\fR \fBminutes\fR|\fBhours\fR +.RS 4 +Clients try downloading router descriptors from directory caches after this time\&. Changing this requires that +\fBTestingTorNetwork\fR +is set\&. (Default: 10 minutes) +.RE +.SH "SIGNALS" Tor catches the following signals: -.LP -.TP +.PP \fBSIGTERM\fR -Tor will catch this, clean up and sync to disk if necessary, and exit. -.LP -.TP +.RS 4 +Tor will catch this, clean up and sync to disk if necessary, and exit\&. +.RE +.PP \fBSIGINT\fR -Tor clients behave as with SIGTERM; but Tor servers will do a controlled -slow shutdown, closing listeners and waiting 30 seconds before exiting. -(The delay can be configured with the ShutdownWaitLength config option.) -.LP -.TP +.RS 4 +Tor clients behave as with SIGTERM; but Tor servers will do a controlled slow shutdown, closing listeners and waiting 30 seconds before exiting\&. (The delay can be configured with the ShutdownWaitLength config option\&.) +.RE +.PP \fBSIGHUP\fR -The signal instructs Tor to reload its configuration (including closing -and reopening logs), fetch a new directory, and kill and restart its -helper processes if applicable. -.LP -.TP +.RS 4 +The signal instructs Tor to reload its configuration (including closing and reopening logs), and kill and restart its helper processes if applicable\&. +.RE +.PP \fBSIGUSR1\fR -Log statistics about current connections, past connections, and -throughput. -.LP -.TP +.RS 4 +Log statistics about current connections, past connections, and throughput\&. +.RE +.PP \fBSIGUSR2\fR -Switch all logs to loglevel debug. You can go back to the old loglevels -by sending a SIGHUP. -.LP -.TP +.RS 4 +Switch all logs to loglevel debug\&. You can go back to the old loglevels by sending a SIGHUP\&. +.RE +.PP \fBSIGCHLD\fR -Tor receives this signal when one of its helper processes has exited, -so it can clean up. -.LP -.TP +.RS 4 +Tor receives this signal when one of its helper processes has exited, so it can clean up\&. +.RE +.PP \fBSIGPIPE\fR -Tor catches this signal and ignores it. -.LP -.TP +.RS 4 +Tor catches this signal and ignores it\&. +.RE +.PP \fBSIGXFSZ\fR -If this signal exists on your platform, Tor catches and ignores it. - -.SH FILES -.LP -.TP -.B @CONFDIR@/torrc -The configuration file, which contains "option value" pairs. -.LP -.TP -.B @LOCALSTATEDIR@/lib/tor/ -The tor process stores keys and other data here. -.LP -.TP -.B \fIDataDirectory\fP/cached-status/* -The most recently downloaded network status document for each authority. Each file holds one such document; the filenames are the hexadecimal identity key fingerprints of the directory authorities. -.LP -.TP -.B \fIDataDirectory\fB/cached-descriptors\fR and \fBcached-descriptors.new\fR -These files hold downloaded router statuses. Some routers may appear more than once; if so, the most recently published descriptor is used. Lines beginning with @-signs are annotations that contain more information about a given router. The ".new" file is an append-only journal; when it gets too large, all entries are merged into a new cached-routers file. -.LP -.TP -.B \fIDataDirectory\fB/cached-routers\fR and \fBcached-routers.new\fR -Obsolete versions of cached-descriptors and cached-descriptors.new. When Tor can't find the newer files, it looks here instead. -.LP -.TP -.B \fIDataDirectory\fP/state -A set of persistent key-value mappings. These are documented in the file. These include: -.PD 0 -.RS 5 -.IP "- The current entry guards and their status." -.IP "- The current bandwidth accounting values (unused so far; see below)." -.IP "- When the file was last written" -.IP "- What version of Tor generated the state file" -.IP "- A short history of bandwidth usage, as produced in the router descriptors." -.RE -.PD -.LP -.TP -.B \fIDataDirectory\fP/bw_accounting -Used to track bandwidth accounting values (when the current period starts and ends; how much has been read and written so far this period). This file is obsolete, and the data is now stored in the 'state' file as well. Only used when bandwidth accounting is enabled. -.LP -.TP -.B \fIDataDirectory\fP/hsusage -Used to track hidden service usage in terms of fetch and publish -requests to this hidden service authoritative directory. Only used when -recording of statistics is enabled. -.LP -.TP -.B \fIDataDirectory\fP/control_auth_cookie -Used for cookie authentication with the controller. Location can be -overridden by the CookieAuthFile config option. Regenerated on startup. -See control-spec.txt for details. Only used when cookie authentication -is enabled. -.LP -.TP -.B \fIDataDirectory\fP/keys/* -Only used by servers. Holds identity keys and onion keys. -.LP -.TP -.B \fIDataDirectory\fP/fingerprint -Only used by servers. Holds the fingerprint of the server's identity key. -.LP -.TP -.B \fIDataDirectory\fP/approved-routers -Only for naming authoritative directory servers (see \fBNamingAuthoritativeDirectory\fP). This file lists nickname to identity bindings. Each line lists a nickname and a fingerprint separated by whitespace. See your \fBfingerprint\fP file in the \fIDataDirectory\fP for an example line. If the nickname is \fB!reject\fP then descriptors from the given identity (fingerprint) are rejected by this server. If it is \fB!invalid\fP then descriptors are accepted but marked in the directory as not valid, that is, not recommended. -.LP -.TP -.B \fIDataDirectory\fP/router-stability -Only used by authoritative directory servers. Tracks measurements for router mean-time-between-failures so that authorities have a good idea of how to set their Stable flags. -.LP -.TP -.B \fIHiddenServiceDirectory\fP/hostname -The .onion domain name for this hidden service. -.LP -.TP -.B \fIHiddenServiceDirectory\fP/private_key -The private key for this hidden service. -.SH SEE ALSO -.BR privoxy (1), -.BR tsocks (1), -.BR torify (1) - -.BR https://www.torproject.org/ - -.SH BUGS -Plenty, probably. Tor is still in development. Please report them. -.SH AUTHORS -Roger Dingledine , Nick Mathewson . +.RS 4 +If this signal exists on your platform, Tor catches and ignores it\&. +.RE +.SH "FILES" +.PP +\fB@CONFDIR@/torrc\fR +.RS 4 +The configuration file, which contains "option value" pairs\&. +.RE +.PP +\fB@LOCALSTATEDIR@/lib/tor/\fR +.RS 4 +The tor process stores keys and other data here\&. +.RE +.PP +\fIDataDirectory\fR\fB/cached\-status/\fR +.RS 4 +The most recently downloaded network status document for each authority\&. Each file holds one such document; the filenames are the hexadecimal identity key fingerprints of the directory authorities\&. +.RE +.PP +\fIDataDirectory\fR\fB/cached\-descriptors\fR and \fBcached\-descriptors\&.new\fR +.RS 4 +These files hold downloaded router statuses\&. Some routers may appear more than once; if so, the most recently published descriptor is used\&. Lines beginning with @\-signs are annotations that contain more information about a given router\&. The "\&.new" file is an append\-only journal; when it gets too large, all entries are merged into a new cached\-descriptors file\&. +.RE +.PP +\fIDataDirectory\fR\fB/cached\-routers\fR and \fBcached\-routers\&.new\fR +.RS 4 +Obsolete versions of cached\-descriptors and cached\-descriptors\&.new\&. When Tor can\'t find the newer files, it looks here instead\&. +.RE +.PP +\fIDataDirectory\fR\fB/state\fR +.RS 4 +A set of persistent key\-value mappings\&. These are documented in the file\&. These include: +.sp +.RS 4 +\h'-04'\(bu\h'+03'The current entry guards and their status\&. +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'The current bandwidth accounting values (unused so far; see below)\&. +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'When the file was last written +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'What version of Tor generated the state file +.RE +.sp +.RS 4 +\h'-04'\(bu\h'+03'A short history of bandwidth usage, as produced in the router descriptors\&. +.RE +.RE +.PP +\fIDataDirectory\fR\fB/bw_accounting\fR +.RS 4 +Used to track bandwidth accounting values (when the current period starts and ends; how much has been read and written so far this period)\&. This file is obsolete, and the data is now stored in the \'state\' file as well\&. Only used when bandwidth accounting is enabled\&. +.RE +.PP +\fIDataDirectory\fR\fB/control_auth_cookie\fR +.RS 4 +Used for cookie authentication with the controller\&. Location can be overridden by the CookieAuthFile config option\&. Regenerated on startup\&. See control\-spec\&.txt for details\&. Only used when cookie authentication is enabled\&. +.RE +.PP +\fIDataDirectory\fR\fB/keys/\fR* +.RS 4 +Only used by servers\&. Holds identity keys and onion keys\&. +.RE +.PP +\fIDataDirectory\fR\fB/fingerprint\fR +.RS 4 +Only used by servers\&. Holds the fingerprint of the server\'s identity key\&. +.RE +.PP +\fIDataDirectory\fR\fB/approved\-routers\fR +.RS 4 +Only for naming authoritative directory servers (see +\fBNamingAuthoritativeDirectory\fR)\&. This file lists nickname to identity bindings\&. Each line lists a nickname and a fingerprint separated by whitespace\&. See your +\fBfingerprint\fR +file in the +\fIDataDirectory\fR +for an example line\&. If the nickname is +\fB!reject\fR +then descriptors from the given identity (fingerprint) are rejected by this server\&. If it is +\fB!invalid\fR +then descriptors are accepted but marked in the directory as not valid, that is, not recommended\&. +.RE +.PP +\fIDataDirectory\fR\fB/router\-stability\fR +.RS 4 +Only used by authoritative directory servers\&. Tracks measurements for router mean\-time\-between\-failures so that authorities have a good idea of how to set their Stable flags\&. +.RE +.PP +\fIHiddenServiceDirectory\fR\fB/hostname\fR +.RS 4 +The \&.onion domain name for this hidden service\&. If the hidden service is restricted to authorized clients only, this file also contains authorization data for all clients\&. +.RE +.PP +\fIHiddenServiceDirectory\fR\fB/private_key\fR +.RS 4 +The private key for this hidden service\&. +.RE +.PP +\fIHiddenServiceDirectory\fR\fB/client_keys\fR +.RS 4 +Authorization data for a hidden service that is only accessible by authorized clients\&. +.RE +.SH "SEE ALSO" +\fBprivoxy\fR(1), \fBtsocks\fR(1), \fBtorify\fR(1) +.sp +\fBhttps://www\&.torproject\&.org/\fR +.sp +.SH "BUGS" +Plenty, probably\&. Tor is still in development\&. Please report them\&. +.sp +.SH "AUTHORS" +Roger Dingledine [arma at mit\&.edu], Nick Mathewson [nickm at alum\&.mit\&.edu]\&. +.sp +.SH "NOTES" +.IP " 1." 4 +tor-ops@torproject.org +.RS 4 +\%mailto:tor-ops@torproject.org +.RE diff -Nru tor-0.2.0.34/doc/tor.1.txt tor-0.2.2.16-alpha/doc/tor.1.txt --- tor-0.2.0.34/doc/tor.1.txt 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor.1.txt 2010-08-18 23:04:46.000000000 +0000 @@ -0,0 +1,1410 @@ +// Copyright (c) The Tor Project, Inc. +// See LICENSE for licensing information +// This is an asciidoc file used to generate the manpage/html reference. +// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html +TOR(1) +====== + +NAME +---- +tor - The second-generation onion router + + +SYNOPSIS +-------- +**tor** [__OPTION__ __value__]... + +DESCRIPTION +----------- +__tor__ is a connection-oriented anonymizing communication +service. Users choose a source-routed path through a set of nodes, and +negotiate a "virtual circuit" through the network, in which each node +knows its predecessor and successor, but no others. Traffic flowing down +the circuit is unwrapped by a symmetric key at each node, which reveals +the downstream node. + + +Basically __tor__ provides a distributed network of servers ("onion routers"). +Users bounce their TCP streams -- web traffic, ftp, ssh, etc -- around the +routers, and recipients, observers, and even the routers themselves have +difficulty tracking the source of the stream. + +OPTIONS +------- +**-h**, **-help**:: + Display a short help message and exit. + +**-f** __FILE__:: + FILE contains further "option value" paris. (Default: @CONFDIR@/torrc) + +**--hash-password**:: + Generates a hashed password for control port access. + +**--list-fingerprint**:: + Generate your keys and output your nickname and fingerprint. + +**--verify-config**:: + Verify the configuration file is valid. + +**--nt-service**:: + **--service [install|remove|start|stop]** Manage the Tor Windows + NT/2000/XP service. Current instructions can be found at + https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ#WinNTService + +**--list-torrc-options**:: + List all valid options. + +**--version**:: + Display Tor version and exit. + +**--quiet**:: + Do not start Tor with a console log unless explicitly requested to do so. + (By default, Tor starts out logging messages at level "notice" or higher to + the console, until it has parsed its configuration.) + +Other options can be specified either on the command-line (--option + value), or in the configuration file (option value or option "value"). + Options are case-insensitive. C-style escaped characters are allowed inside + quoted values. Options on the command line take precedence over + options found in the configuration file. + +**BandwidthRate** __N__ **bytes**|**KB**|**MB**|**GB**:: + A token bucket limits the average incoming bandwidth usage on this node to + the specified number of bytes per second, and the average outgoing + bandwidth usage to that same value. If you want to run a relay in the + public network, this needs to be _at the very least_ 20 KB (that is, + 20480 bytes). (Default: 5 MB) + +**BandwidthBurst** __N__ **bytes**|**KB**|**MB**|**GB**:: + Limit the maximum token bucket size (also known as the burst) to the given + number of bytes in each direction. (Default: 10 MB) + +**MaxAdvertisedBandwidth** __N__ **bytes**|**KB**|**MB**|**GB**:: + If set, we will not advertise more than this amount of bandwidth for our + BandwidthRate. Server operators who want to reduce the number of clients + who ask to build circuits through them (since this is proportional to + advertised bandwidth rate) can thus reduce the CPU demands on their server + without impacting network performance. + +**RelayBandwidthRate** __N__ **bytes**|**KB**|**MB**|**GB**:: + If defined, a separate token bucket limits the average incoming bandwidth + usage for \_relayed traffic_ on this node to the specified number of bytes + per second, and the average outgoing bandwidth usage to that same value. + Relayed traffic currently is calculated to include answers to directory + requests, but that may change in future versions. (Default: 0) + +**RelayBandwidthBurst** __N__ **bytes**|**KB**|**MB**|**GB**:: + Limit the maximum token bucket size (also known as the burst) for + \_relayed traffic_ to the given number of bytes in each direction. + (Default: 0) + +**PerConnBWRate** __N__ **bytes**|**KB**|**MB**|**GB**:: + If set, do separate rate limiting for each connection from a non-relay. + You should never need to change this value, since a network-wide value is + published in the consensus and your relay will use that value. (Default: 0) + +**PerConnBWBurst** __N__ **bytes**|**KB**|**MB**|**GB**:: + If set, do separate rate limiting for each connection from a non-relay. + You should never need to change this value, since a network-wide value is + published in the consensus and your relay will use that value. (Default: 0) + +**ConLimit** __NUM__:: + The minimum number of file descriptors that must be available to the Tor + process before it will start. Tor will ask the OS for as many file + descriptors as the OS will allow (you can find this by "ulimit -H -n"). + If this number is less than ConnLimit, then Tor will refuse to start. + + + + You probably don't need to adjust this. It has no effect on Windows + since that platform lacks getrlimit(). (Default: 1000) + +**ConstrainedSockets** **0**|**1**:: + If set, Tor will tell the kernel to attempt to shrink the buffers for all + sockets to the size specified in **ConstrainedSockSize**. This is useful for + virtual servers and other environments where system level TCP buffers may + be limited. If you're on a virtual server, and you encounter the "Error + creating network socket: No buffer space available" message, you are + likely experiencing this problem. + + + + The preferred solution is to have the admin increase the buffer pool for + the host itself via /proc/sys/net/ipv4/tcp_mem or equivalent facility; + this configuration option is a second-resort. + + + + The DirPort option should also not be used if TCP buffers are scarce. The + cached directory requests consume additional sockets which exacerbates + the problem. + + + + You should **not** enable this feature unless you encounter the "no buffer + space available" issue. Reducing the TCP buffers affects window size for + the TCP stream and will reduce throughput in proportion to round trip + time on long paths. (Default: 0.) + +**ConstrainedSockSize** __N__ **bytes**|**KB**:: + When **ConstrainedSockets** is enabled the receive and transmit buffers for + all sockets will be set to this limit. Must be a value between 2048 and + 262144, in 1024 byte increments. Default of 8192 is recommended. + +**ControlPort** __Port__:: + If set, Tor will accept connections on this port and allow those + connections to control the Tor process using the Tor Control Protocol + (described in control-spec.txt). Note: unless you also specify one of + **HashedControlPassword** or **CookieAuthentication**, setting this option will + cause Tor to allow any process on the local host to control it. This + option is required for many Tor controllers; most use the value of 9051. + +**ControlListenAddress** __IP__[:__PORT__]:: + Bind the controller listener to this address. If you specify a port, bind + to this port rather than the one specified in ControlPort. We strongly + recommend that you leave this alone unless you know what you're doing, + since giving attackers access to your control listener is really + dangerous. (Default: 127.0.0.1) This directive can be specified multiple + times to bind to multiple addresses/ports. + +**ControlSocket** __Path__:: + Like ControlPort, but listens on a Unix domain socket, rather than a TCP + socket. (Unix and Unix-like systems only.) + +**HashedControlPassword** __hashed_password__:: + Don't allow any connections on the control port except when the other + process knows the password whose one-way hash is __hashed_password__. You + can compute the hash of a password by running "tor --hash-password + __password__". You can provide several acceptable passwords by using more + than one HashedControlPassword line. + +**CookieAuthentication** **0**|**1**:: + If this option is set to 1, don't allow any connections on the control port + except when the connecting process knows the contents of a file named + "control_auth_cookie", which Tor will create in its data directory. This + authentication method should only be used on systems with good filesystem + security. (Default: 0) + +**CookieAuthFile** __Path__:: + If set, this option overrides the default location and file name + for Tor's cookie file. (See CookieAuthentication above.) + +**CookieAuthFileGroupReadable** **0**|**1**|__Groupname__:: + If this option is set to 0, don't allow the filesystem group to read the + cookie file. If the option is set to 1, make the cookie file readable by + the default GID. [Making the file readable by other groups is not yet + implemented; let us know if you need this for some reason.] (Default: 0). + +**DataDirectory** __DIR__:: + Store working data in DIR (Default: @LOCALSTATEDIR@/lib/tor) + +**DirServer** [__nickname__] [**flags**] __address__:__port__ __fingerprint__:: + Use a nonstandard authoritative directory server at the provided address + and port, with the specified key fingerprint. This option can be repeated + many times, for multiple authoritative directory servers. Flags are + separated by spaces, and determine what kind of an authority this directory + is. By default, every authority is authoritative for current ("v2")-style + directories, unless the "no-v2" flag is given. If the "v1" flags is + provided, Tor will use this server as an authority for old-style (v1) + directories as well. (Only directory mirrors care about this.) Tor will + use this server as an authority for hidden service information if the "hs" + flag is set, or if the "v1" flag is set and the "no-hs" flag is **not** set. + Tor will use this authority as a bridge authoritative directory if the + "bridge" flag is set. If a flag "orport=**port**" is given, Tor will use the + given port when opening encrypted tunnels to the dirserver. Lastly, if a + flag "v3ident=**fp**" is given, the dirserver is a v3 directory authority + whose v3 long-term signing key has the fingerprint **fp**. + + + + If no **dirserver** line is given, Tor will use the default directory + servers. NOTE: this option is intended for setting up a private Tor + network with its own directory authorities. If you use it, you will be + distinguishable from other users, because you won't believe the same + authorities they do. + +**AlternateDirAuthority** [__nickname__] [**flags**] __address__:__port__ __fingerprint__ + + +**AlternateHSAuthority** [__nickname__] [**flags**] __address__:__port__ __fingerprint__ + + +**AlternateBridgeAuthority** [__nickname__] [**flags**] __address__:__port__ __ fingerprint__:: + As DirServer, but replaces less of the default directory authorities. Using + AlternateDirAuthority replaces the default Tor directory authorities, but + leaves the hidden service authorities and bridge authorities in place. + Similarly, Using AlternateHSAuthority replaces the default hidden service + authorities, but not the directory or bridge authorities. + +**DisableAllSwap** **0**|**1**:: + If set to 1, Tor will attempt to lock all current and future memory pages, + so that memory cannot be paged out. Windows, OS X and Solaris are currently + not supported. We believe that this feature works on modern Gnu/Linux + distributions, and that it should work on *BSD systems (untested). This + option requires that you start your Tor as root, and you should use the + **User** option to properly reduce Tor's privileges. (Default: 0) + +**FetchDirInfoEarly** **0**|**1**:: + If set to 1, Tor will always fetch directory information like other + directory caches, even if you don't meet the normal criteria for fetching + early. Normal users should leave it off. (Default: 0) + +**FetchDirInfoExtraEarly** **0**|**1**:: + If set to 1, Tor will fetch directory information before other directory + caches. It will attempt to download directory information closer to the + start of the consensus period. Normal users should leave it off. + (Default: 0) + +**FetchHidServDescriptors** **0**|**1**:: + If set to 0, Tor will never fetch any hidden service descriptors from the + rendezvous directories. This option is only useful if you're using a Tor + controller that handles hidden service fetches for you. (Default: 1) + +**FetchServerDescriptors** **0**|**1**:: + If set to 0, Tor will never fetch any network status summaries or server + descriptors from the directory servers. This option is only useful if + you're using a Tor controller that handles directory fetches for you. + (Default: 1) + +**FetchUselessDescriptors** **0**|**1**:: + If set to 1, Tor will fetch every non-obsolete descriptor from the + authorities that it hears about. Otherwise, it will avoid fetching useless + descriptors, for example for routers that are not running. This option is + useful if you're using the contributed "exitlist" script to enumerate Tor + nodes that exit to certain addresses. (Default: 0) + +**HTTPProxy** __host__[:__port__]:: + Tor will make all its directory requests through this host:port (or host:80 + if port is not specified), rather than connecting directly to any directory + servers. + +**HTTPProxyAuthenticator** __username:password__:: + If defined, Tor will use this username:password for Basic HTTP proxy + authentication, as in RFC 2617. This is currently the only form of HTTP + proxy authentication that Tor supports; feel free to submit a patch if you + want it to support others. + +**HTTPSProxy** __host__[:__port__]:: + Tor will make all its OR (SSL) connections through this host:port (or + host:443 if port is not specified), via HTTP CONNECT rather than connecting + directly to servers. You may want to set **FascistFirewall** to restrict + the set of ports you might try to connect to, if your HTTPS proxy only + allows connecting to certain ports. + +**HTTPSProxyAuthenticator** __username:password__:: + If defined, Tor will use this username:password for Basic HTTPS proxy + authentication, as in RFC 2617. This is currently the only form of HTTPS + proxy authentication that Tor supports; feel free to submit a patch if you + want it to support others. + +**Socks4Proxy** __host__[:__port__]:: + Tor will make all OR connections through the SOCKS 4 proxy at host:port + (or host:1080 if port is not specified). + +**Socks5Proxy** __host__[:__port__]:: + Tor will make all OR connections through the SOCKS 5 proxy at host:port + (or host:1080 if port is not specified). + +**Socks5ProxyUsername** __username__ + + +**Socks5ProxyPassword** __password__:: + If defined, authenticate to the SOCKS 5 server using username and password + in accordance to RFC 1929. Both username and password must be between 1 and + 255 characters. + +**KeepalivePeriod** __NUM__:: + To keep firewalls from expiring connections, send a padding keepalive cell + every NUM seconds on open connections that are in use. If the connection + has no open circuits, it will instead be closed after NUM seconds of + idleness. (Default: 5 minutes) + +**Log** __minSeverity__[-__maxSeverity__] **stderr**|**stdout**|**syslog**:: + Send all messages between __minSeverity__ and __maxSeverity__ to the standard + output stream, the standard error stream, or to the system log. (The + "syslog" value is only supported on Unix.) Recognized severity levels are + debug, info, notice, warn, and err. We advise using "notice" in most cases, + since anything more verbose may provide sensitive information to an + attacker who obtains the logs. If only one severity level is given, all + messages of that level or higher will be sent to the listed destination. + +**Log** __minSeverity__[-__maxSeverity__] **file** __FILENAME__:: + As above, but send log messages to the listed filename. The + "Log" option may appear more than once in a configuration file. + Messages are sent to all the logs that match their severity + level. + +**OutboundBindAddress** __IP__:: + Make all outbound connections originate from the IP address specified. This + is only useful when you have multiple network interfaces, and you want all + of Tor's outgoing connections to use a single one. This setting will be + ignored for connections to the loopback addresses (127.0.0.0/8 and ::1). + +**PidFile** __FILE__:: + On startup, write our PID to FILE. On clean shutdown, remove + FILE. + +**ProtocolWarnings** **0**|**1**:: + If 1, Tor will log with severity \'warn' various cases of other parties not + following the Tor specification. Otherwise, they are logged with severity + \'info'. (Default: 0) + +**RunAsDaemon** **0**|**1**:: + If 1, Tor forks and daemonizes to the background. This option has no effect + on Windows; instead you should use the --service command-line option. + (Default: 0) + + +**SafeLogging** **0**|**1**|**relay**:: + Tor can scrub potentially sensitive strings from log messages (e.g. + addresses) by replacing them with the string [scrubbed]. This way logs can + still be useful, but they don't leave behind personally identifying + information about what sites a user might have visited. + + + + If this option is set to 0, Tor will not perform any scrubbing, if it is + set to 1, all potentially sensitive strings are replaced. If it is set to + relay, all log messages generated when acting as a relay are sanitized, but + all messages generated when acting as a client are not. (Default: 1) + +**User** __UID__:: + On startup, setuid to this user and setgid to their primary group. + +**HardwareAccel** **0**|**1**:: + If non-zero, try to use built-in (static) crypto hardware acceleration when + available. (Default: 0) + +**AccelName** __NAME__:: + When using OpenSSL hardware crypto acceleration attempt to load the dynamic + engine of this name. This must be used for any dynamic hardware engine. + Names can be verified with the openssl engine command. + +**AccelDir** __DIR__:: + Specify this option if using dynamic hardware acceleration and the engine + implementation library resides somewhere other than the OpenSSL default. + +**AvoidDiskWrites** **0**|**1**:: + If non-zero, try to write to disk less frequently than we would otherwise. + This is useful when running on flash memory or other media that support + only a limited number of writes. (Default: 0) + +**TunnelDirConns** **0**|**1**:: + If non-zero, when a directory server we contact supports it, we will build + a one-hop circuit and make an encrypted connection via its ORPort. + (Default: 1) + +**PreferTunneledDirConns** **0**|**1**:: + If non-zero, we will avoid directory servers that don't support tunneled + directory connections, when possible. (Default: 1) + +**CircuitPriorityHalflife** __NUM1__:: + If this value is set, we override the default algorithm for choosing which + circuit's cell to deliver or relay next. When the value is 0, we + round-robin between the active circuits on a connection, delivering one + cell from each in turn. When the value is positive, we prefer delivering + cells from whichever connection has the lowest weighted cell count, where + cells are weighted exponentially according to the supplied + CircuitPriorityHalflife value (in seconds). If this option is not set at + all, we use the behavior recommended in the current consensus + networkstatus. This is an advanced option; you generally shouldn't have + to mess with it. (Default: not set.) + +CLIENT OPTIONS +-------------- + +The following options are useful only for clients (that is, if +**SocksPort** is non-zero): + +**AllowInvalidNodes** **entry**|**exit**|**middle**|**introduction**|**rendezvous**|**...**:: + If some Tor servers are obviously not working right, the directory + authorities can manually mark them as invalid, meaning that it's not + recommended you use them for entry or exit positions in your circuits. You + can opt to use them in some circuit positions, though. The default is + "middle,rendezvous", and other choices are not advised. + +**ExcludeSingleHopRelays** **0**|**1**:: + This option controls whether circuits built by Tor will include relays with + the AllowSingleHopExits flag set to true. If ExcludeSingleHopRelays is set + to 0, these relays will be included. Note that these relays might be at + higher risk of being seized or observed, so they are not normally included. + (Default: 1) + +**Bridge** __IP__:__ORPort__ [fingerprint]:: + When set along with UseBridges, instructs Tor to use the relay at + "IP:ORPort" as a "bridge" relaying into the Tor network. If "fingerprint" + is provided (using the same format as for DirServer), we will verify that + the relay running at that location has the right fingerprint. We also use + fingerprint to look up the bridge descriptor at the bridge authority, if + it's provided and if UpdateBridgesFromAuthority is set too. + +**LearnCircuitBuildTimeout** **0**|**1**:: + If 0, CircuitBuildTimeout adaptive learning is disabled. (Default: 1) + +**CircuitBuildTimeout** __NUM__:: + + Try for at most NUM seconds when building circuits. If the circuit isn't + open in that time, give up on it. If LearnCircuitBuildTimeout is 1, this + value serves as the initial value to use before a timeout is learned. If + LearnCircuitBuildTimeout is 0, this value is the only value used. + (Default: 60 seconds.) + +**CircuitIdleTimeout** __NUM__:: + If we have kept a clean (never used) circuit around for NUM seconds, then + close it. This way when the Tor client is entirely idle, it can expire all + of its circuits, and then expire its TLS connections. Also, if we end up + making a circuit that is not useful for exiting any of the requests we're + receiving, it won't forever take up a slot in the circuit list. (Default: 1 + hour.) + +**CircuitStreamTimeout** __NUM__:: + If non-zero, this option overrides our internal timeout schedule for how + many seconds until we detach a stream from a circuit and try a new circuit. + If your network is particularly slow, you might want to set this to a + number like 60. (Default: 0) + +**ClientOnly** **0**|**1**:: + If set to 1, Tor will under no circumstances run as a server or serve + directory requests. The default is to run as a client unless ORPort is + configured. (Usually, you don't need to set this; Tor is pretty smart at + figuring out whether you are reliable and high-bandwidth enough to be a + useful server.) (Default: 0) + +**ExcludeNodes** __node__,__node__,__...__:: + A list of identity fingerprints, nicknames, country codes and address + patterns of nodes to never use when building a circuit. (Example: + ExcludeNodes SlowServer, $ EFFFFFFFFFFFFFFF, \{cc}, 255.254.0.0/8) + +**ExcludeExitNodes** __node__,__node__,__...__:: + A list of identity fingerprints, nicknames, country codes and address + patterns of nodes to never use when picking an exit node. Note that any + node listed in ExcludeNodes is automatically considered to be part of this + list. + +**EntryNodes** __node__,__node__,__...__:: + A list of identity fingerprints, nicknames, country codes and address + patterns of nodes to use for the first hop in normal circuits. These are + treated only as preferences unless StrictNodes (see below) is also set. + +**ExitNodes** __node__,__node__,__...__:: + A list of identity fingerprints, nicknames, country codes and address + patterns of nodes to use for the last hop in normal exit circuits. These + are treated only as preferences unless StrictNodes (see below) is also set. + +**StrictNodes** **0**|**1**:: + If 1 and EntryNodes config option is set, Tor will never use any nodes + besides those listed in EntryNodes for the first hop of a normal circuit. + If 1 and ExitNodes config option is set, Tor will never use any nodes + besides those listed in ExitNodes for the last hop of a normal exit + circuit. Note that Tor might still use these nodes for non-exit circuits + such as one-hop directory fetches or hidden service support circuits. + +**FascistFirewall** **0**|**1**:: + If 1, Tor will only create outgoing connections to ORs running on ports + that your firewall allows (defaults to 80 and 443; see **FirewallPorts**). + This will allow you to run Tor as a client behind a firewall with + restrictive policies, but will not allow you to run as a server behind such + a firewall. If you prefer more fine-grained control, use + ReachableAddresses instead. + +**FirewallPorts** __PORTS__:: + A list of ports that your firewall allows you to connect to. Only used when + **FascistFirewall** is set. This option is deprecated; use ReachableAddresses + instead. (Default: 80, 443) + +**HidServAuth** __onion-address__ __auth-cookie__ [__service-name__]:: + Client authorization for a hidden service. Valid onion addresses contain 16 + characters in a-z2-7 plus ".onion", and valid auth cookies contain 22 + characters in A-Za-z0-9+/. The service name is only used for internal + purposes, e.g., for Tor controllers. This option may be used multiple times + for different hidden services. If a hidden service uses authorization and + this option is not set, the hidden service is not accessible. Hidden + services can be configured to require authorization using the + **HiddenServiceAuthorizeClient** option. + +**ReachableAddresses** __ADDR__[/__MASK__][:__PORT__]...:: + A comma-separated list of IP addresses and ports that your firewall allows + you to connect to. The format is as for the addresses in ExitPolicy, except + that "accept" is understood unless "reject" is explicitly provided. For + example, \'ReachableAddresses 99.0.0.0/8, reject 18.0.0.0/8:80, accept + \*:80' means that your firewall allows connections to everything inside net + 99, rejects port 80 connections to net 18, and accepts connections to port + 80 otherwise. (Default: \'accept \*:*'.) + +**ReachableDirAddresses** __ADDR__[/__MASK__][:__PORT__]...:: + Like **ReachableAddresses**, a list of addresses and ports. Tor will obey + these restrictions when fetching directory information, using standard HTTP + GET requests. If not set explicitly then the value of + **ReachableAddresses** is used. If **HTTPProxy** is set then these + connections will go through that proxy. + +**ReachableORAddresses** __ADDR__[/__MASK__][:__PORT__]...:: + Like **ReachableAddresses**, a list of addresses and ports. Tor will obey + these restrictions when connecting to Onion Routers, using TLS/SSL. If not + set explicitly then the value of **ReachableAddresses** is used. If + **HTTPSProxy** is set then these connections will go through that proxy. + + + + The separation between **ReachableORAddresses** and + **ReachableDirAddresses** is only interesting when you are connecting + through proxies (see **HTTPProxy** and **HTTPSProxy**). Most proxies limit + TLS connections (which Tor uses to connect to Onion Routers) to port 443, + and some limit HTTP GET requests (which Tor uses for fetching directory + information) to port 80. + +**LongLivedPorts** __PORTS__:: + A list of ports for services that tend to have long-running connections + (e.g. chat and interactive shells). Circuits for streams that use these + ports will contain only high-uptime nodes, to reduce the chance that a node + will go down before the stream is finished. (Default: 21, 22, 706, 1863, + 5050, 5190, 5222, 5223, 6667, 6697, 8300) + +**MapAddress** __address__ __newaddress__:: + When a request for address arrives to Tor, it will rewrite it to newaddress + before processing it. For example, if you always want connections to + www.indymedia.org to exit via __torserver__ (where __torserver__ is the + nickname of the server), use "MapAddress www.indymedia.org + www.indymedia.org.torserver.exit". + +**NewCircuitPeriod** __NUM__:: + Every NUM seconds consider whether to build a new circuit. (Default: 30 + seconds) + +**MaxCircuitDirtiness** __NUM__:: + Feel free to reuse a circuit that was first used at most NUM seconds ago, + but never attach a new stream to a circuit that is too old. (Default: 10 + minutes) + +**NodeFamily** __node__,__node__,__...__:: + The Tor servers, defined by their identity fingerprints or nicknames, + constitute a "family" of similar or co-administered servers, so never use + any two of them in the same circuit. Defining a NodeFamily is only needed + when a server doesn't list the family itself (with MyFamily). This option + can be used multiple times. + +**EnforceDistinctSubnets** **0**|**1**:: + If 1, Tor will not put two servers whose IP addresses are "too close" on + the same circuit. Currently, two addresses are "too close" if they lie in + the same /16 range. (Default: 1) + +**SocksPort** __PORT__:: + Advertise this port to listen for connections from Socks-speaking + applications. Set this to 0 if you don't want to allow application + connections. (Default: 9050) + +**SocksListenAddress** __IP__[:__PORT__]:: + Bind to this address to listen for connections from Socks-speaking + applications. (Default: 127.0.0.1) You can also specify a port (e.g. + 192.168.0.1:9100). This directive can be specified multiple times to bind + to multiple addresses/ports. + +**SocksPolicy** __policy__,__policy__,__...__:: + Set an entrance policy for this server, to limit who can connect to the + SocksPort and DNSPort ports. The policies have the same form as exit + policies below. + +**SocksTimeout** __NUM__:: + Let a socks connection wait NUM seconds handshaking, and NUM seconds + unattached waiting for an appropriate circuit, before we fail it. (Default: + 2 minutes.) + +**TrackHostExits** __host__,__.domain__,__...__:: + For each value in the comma separated list, Tor will track recent + connections to hosts that match this value and attempt to reuse the same + exit node for each. If the value is prepended with a \'.\', it is treated as + matching an entire domain. If one of the values is just a \'.', it means + match everything. This option is useful if you frequently connect to sites + that will expire all your authentication cookies (i.e. log you out) if + your IP address changes. Note that this option does have the disadvantage + of making it more clear that a given history is associated with a single + user. However, most people who would wish to observe this will observe it + through cookies or other protocol-specific means anyhow. + +**TrackHostExitsExpire** __NUM__:: + Since exit servers go up and down, it is desirable to expire the + association between host and exit server after NUM seconds. The default is + 1800 seconds (30 minutes). + +**UpdateBridgesFromAuthority** **0**|**1**:: + When set (along with UseBridges), Tor will try to fetch bridge descriptors + from the configured bridge authorities when feasible. It will fall back to + a direct request if the authority responds with a 404. (Default: 0) + +**UseBridges** **0**|**1**:: + When set, Tor will fetch descriptors for each bridge listed in the "Bridge" + config lines, and use these relays as both entry guards and directory + guards. (Default: 0) + +**UseEntryGuards** **0**|**1**:: + If this option is set to 1, we pick a few long-term entry servers, and try + to stick with them. This is desirable because constantly changing servers + increases the odds that an adversary who owns some servers will observe a + fraction of your paths. (Defaults to 1.) + +**NumEntryGuards** __NUM__:: + If UseEntryGuards is set to 1, we will try to pick a total of NUM routers + as long-term entries for our circuits. (Defaults to 3.) + +**SafeSocks** **0**|**1**:: + When this option is enabled, Tor will reject application connections that + use unsafe variants of the socks protocol -- ones that only provide an IP + address, meaning the application is doing a DNS resolve first. + Specifically, these are socks4 and socks5 when not doing remote DNS. + (Defaults to 0.) + +**TestSocks** **0**|**1**:: + When this option is enabled, Tor will make a notice-level log entry for + each connection to the Socks port indicating whether the request used a + safe socks protocol or an unsafe one (see above entry on SafeSocks). This + helps to determine whether an application using Tor is possibly leaking + DNS requests. (Default: 0) + +**WarnUnsafeSocks** **0**|**1**:: + When this option is enabled, Tor will warn whenever a request is + received that only contains an IP address instead of a hostname. Allowing + applications to do DNS resolves themselves is usually a bad idea and + can leak your location to attackers. (Default: 1) + +**VirtualAddrNetwork** __Address__/__bits__:: + When a controller asks for a virtual (unused) address with the MAPADDRESS + command, Tor picks an unassigned address from this range. (Default: + 127.192.0.0/10) + + + + When providing proxy server service to a network of computers using a tool + like dns-proxy-tor, change this address to "10.192.0.0/10" or + "172.16.0.0/12". The default **VirtualAddrNetwork** address range on a + properly configured machine will route to the loopback interface. For + local use, no change to the default VirtualAddrNetwork setting is needed. + +**AllowNonRFC953Hostnames** **0**|**1**:: + When this option is disabled, Tor blocks hostnames containing illegal + characters (like @ and :) rather than sending them to an exit node to be + resolved. This helps trap accidental attempts to resolve URLs and so on. + (Default: 0) + +**AllowDotExit** **0**|**1**:: + If enabled, we convert "www.google.com.foo.exit" addresses on the + SocksPort/TransPort/NatdPort into "www.google.com" addresses that exit from + the node "foo". Disabled by default since attacking websites and exit + relays can use it to manipulate your path selection. (Default: 0) + +**FastFirstHopPK** **0**|**1**:: + When this option is disabled, Tor uses the public key step for the first + hop of creating circuits. Skipping it is generally safe since we have + already used TLS to authenticate the relay and to establish forward-secure + keys. Turning this option off makes circuit building slower. + + + + Note that Tor will always use the public key step for the first hop if it's + operating as a relay, and it will never use the public key step if it + doesn't yet know the onion key of the first hop. (Default: 1) + +**TransPort** __PORT__:: + If non-zero, enables transparent proxy support on __PORT__ (by convention, + 9040). Requires OS support for transparent proxies, such as BSDs' pf or + Linux's IPTables. If you're planning to use Tor as a transparent proxy for + a network, you'll want to examine and change VirtualAddrNetwork from the + default setting. You'll also want to set the TransListenAddress option for + the network you'd like to proxy. (Default: 0). + +**TransListenAddress** __IP__[:__PORT__]:: + Bind to this address to listen for transparent proxy connections. (Default: + 127.0.0.1). This is useful for exporting a transparent proxy server to an + entire network. + +**NATDPort** __PORT__:: + Allow old versions of ipfw (as included in old versions of FreeBSD, etc.) + to send connections through Tor using the NATD protocol. This option is + only for people who cannot use TransPort. + +**NATDListenAddress** __IP__[:__PORT__]:: + Bind to this address to listen for NATD connections. (Default: 127.0.0.1). + +**AutomapHostsOnResolve** **0**|**1**:: + When this option is enabled, and we get a request to resolve an address + that ends with one of the suffixes in **AutomapHostsSuffixes**, we map an + unused virtual address to that address, and return the new virtual address. + This is handy for making ".onion" addresses work with applications that + resolve an address and then connect to it. (Default: 0). + +**AutomapHostsSuffixes** __SUFFIX__,__SUFFIX__,__...__:: + A comma-separated list of suffixes to use with **AutomapHostsOnResolve**. + The "." suffix is equivalent to "all addresses." (Default: .exit,.onion). + +**DNSPort** __PORT__:: + If non-zero, Tor listens for UDP DNS requests on this port and resolves + them anonymously. (Default: 0). + +**DNSListenAddress** __IP__[:__PORT__]:: + Bind to this address to listen for DNS connections. (Default: 127.0.0.1). + +**ClientDNSRejectInternalAddresses** **0**|**1**:: + If true, Tor does not believe any anonymously retrieved DNS answer that + tells it that an address resolves to an internal address (like 127.0.0.1 or + 192.168.0.1). This option prevents certain browser-based attacks; don't + turn it off unless you know what you're doing. (Default: 1). + +**DownloadExtraInfo** **0**|**1**:: + If true, Tor downloads and caches "extra-info" documents. These documents + contain information about servers other than the information in their + regular router descriptors. Tor does not use this information for anything + itself; to save bandwidth, leave this option turned off. (Default: 0). + +**FallbackNetworkstatusFile** __FILENAME__:: + If Tor doesn't have a cached networkstatus file, it starts out using this + one instead. Even if this file is out of date, Tor can still use it to + learn about directory mirrors, so it doesn't need to put load on the + authorities. (Default: None). + +**WarnPlaintextPorts** __port__,__port__,__...__:: + Tells Tor to issue a warnings whenever the user tries to make an anonymous + connection to one of these ports. This option is designed to alert users + to services that risk sending passwords in the clear. (Default: + 23,109,110,143). + +**RejectPlaintextPorts** __port__,__port__,__...__:: + Like WarnPlaintextPorts, but instead of warning about risky port uses, Tor + will instead refuse to make the connection. (Default: None). + +SERVER OPTIONS +-------------- + +The following options are useful only for servers (that is, if ORPort +is non-zero): + +**Address** __address__:: + The IP address or fully qualified domain name of this server (e.g. + moria.mit.edu). You can leave this unset, and Tor will guess your IP + address. This IP address is the one used to tell clients and other + servers where to find your Tor server; it doesn't affect the IP that your + Tor client binds to. To bind to a different address, use the + *ListenAddress and OutboundBindAddress options. + +**AllowSingleHopExits** **0**|**1**:: + This option controls whether clients can use this server as a single hop + proxy. If set to 1, clients can use this server as an exit even if it is + the only hop in the circuit. (Default: 0) + +**AssumeReachable** **0**|**1**:: + This option is used when bootstrapping a new Tor network. If set to 1, + don't do self-reachability testing; just upload your server descriptor + immediately. If **AuthoritativeDirectory** is also set, this option + instructs the dirserver to bypass remote reachability testing too and list + all connected servers as running. + +**BridgeRelay** **0**|**1**:: + Sets the relay to act as a "bridge" with respect to relaying connections + from bridge users to the Tor network. Mainly it influences how the relay + will cache and serve directory information. Usually used in combination + with PublishServerDescriptor. + +**ContactInfo** __email_address__:: + Administrative contact information for server. This line might get picked + up by spam harvesters, so you may want to obscure the fact that it's an + email address. + +**ExitPolicy** __policy__,__policy__,__...__:: + Set an exit policy for this server. Each policy is of the form + "**accept**|**reject** __ADDR__[/__MASK__][:__PORT__]". If /__MASK__ is + omitted then this policy just applies to the host given. Instead of giving + a host or network you can also use "\*" to denote the universe (0.0.0.0/0). + __PORT__ can be a single port number, an interval of ports + "__FROM_PORT__-__TO_PORT__", or "\*". If __PORT__ is omitted, that means + "\*". + + + + For example, "accept 18.7.22.69:\*,reject 18.0.0.0/8:\*,accept \*:\*" would + reject any traffic destined for MIT except for web.mit.edu, and accept + anything else. + + + + To specify all internal and link-local networks (including 0.0.0.0/8, + 169.254.0.0/16, 127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, and + 172.16.0.0/12), you can use the "private" alias instead of an address. + These addresses are rejected by default (at the beginning of your exit + policy), along with your public IP address, unless you set the + ExitPolicyRejectPrivate config option to 0. For example, once you've done + that, you could allow HTTP to 127.0.0.1 and block all other connections to + internal networks with "accept 127.0.0.1:80,reject private:\*", though that + may also allow connections to your own computer that are addressed to its + public (external) IP address. See RFC 1918 and RFC 3330 for more details + about internal and reserved IP address space. + + + + This directive can be specified multiple times so you don't have to put it + all on one line. + + + + Policies are considered first to last, and the first match wins. If you + want to \_replace_ the default exit policy, end your exit policy with + either a reject \*:* or an accept \*:*. Otherwise, you're \_augmenting_ + (prepending to) the default exit policy. The default exit policy is: + + + reject *:25 + reject *:119 + reject *:135-139 + reject *:445 + reject *:563 + reject *:1214 + reject *:4661-4666 + reject *:6346-6429 + reject *:6699 + reject *:6881-6999 + accept *:* + +**ExitPolicyRejectPrivate** **0**|**1**:: + Reject all private (local) networks, along with your own public IP address, + at the beginning of your exit policy. See above entry on ExitPolicy. + (Default: 1) + +**MaxOnionsPending** __NUM__:: + If you have more than this number of onionskins queued for decrypt, reject + new ones. (Default: 100) + +**MyFamily** __node__,__node__,__...__:: + Declare that this Tor server is controlled or administered by a group or + organization identical or similar to that of the other servers, defined by + their identity fingerprints or nicknames. When two servers both declare + that they are in the same \'family', Tor clients will not use them in the + same circuit. (Each server only needs to list the other servers in its + family; it doesn't need to list itself, but it won't hurt.) + +**Nickname** __name__:: + Set the server's nickname to \'name'. Nicknames must be between 1 and 19 + characters inclusive, and must contain only the characters [a-zA-Z0-9]. + +**NumCPUs** __num__:: + How many processes to use at once for decrypting onionskins. (Default: 1) + +**ORPort** __PORT__:: + Advertise this port to listen for connections from Tor clients and servers. + +**ORListenAddress** __IP__[:__PORT__]:: + Bind to this IP address to listen for connections from Tor clients and + servers. If you specify a port, bind to this port rather than the one + specified in ORPort. (Default: 0.0.0.0) This directive can be specified + multiple times to bind to multiple addresses/ports. + +**PublishServerDescriptor** **0**|**1**|**v1**|**v2**|**v3**|**bridge**|**hidserv**,**...**:: + This option is only considered if you have an ORPort defined. You can + choose multiple arguments, separated by commas. + + + If set to 0, Tor will act as a server but it will not publish its + descriptor to the directory authorities. (This is useful if you're testing + out your server, or if you're using a Tor controller that handles directory + publishing for you.) Otherwise, Tor will publish its descriptor to all + directory authorities of the type(s) specified. The value "1" is the + default, which means "publish to the appropriate authorities". + +**ShutdownWaitLength** __NUM__:: + When we get a SIGINT and we're a server, we begin shutting down: + we close listeners and start refusing new circuits. After **NUM** + seconds, we exit. If we get a second SIGINT, we exit immedi- + ately. (Default: 30 seconds) + + +**AccountingMax** __N__ **bytes**|**KB**|**MB**|**GB**|**TB**:: + Never send more than the specified number of bytes in a given accounting + period, or receive more than that number in the period. For example, with + AccountingMax set to 1 GB, a server could send 900 MB and receive 800 MB + and continue running. It will only hibernate once one of the two reaches 1 + GB. When the number of bytes is exhausted, Tor will hibernate until some + time in the next accounting period. To prevent all servers from waking at + the same time, Tor will also wait until a random point in each period + before waking up. If you have bandwidth cost issues, enabling hibernation + is preferable to setting a low bandwidth, since it provides users with a + collection of fast servers that are up some of the time, which is more + useful than a set of slow servers that are always "available". + +**AccountingStart** **day**|**week**|**month** [__day__] __HH:MM__:: + Specify how long accounting periods last. If **month** is given, each + accounting period runs from the time __HH:MM__ on the __dayth__ day of one + month to the same day and time of the next. (The day must be between 1 and + 28.) If **week** is given, each accounting period runs from the time __HH:MM__ + of the __dayth__ day of one week to the same day and time of the next week, + with Monday as day 1 and Sunday as day 7. If **day** is given, each + accounting period runs from the time __HH:MM__ each day to the same time on + the next day. All times are local, and given in 24-hour time. (Defaults to + "month 1 0:00".) + +**ServerDNSResolvConfFile** __filename__:: + Overrides the default DNS configuration with the configuration in + __filename__. The file format is the same as the standard Unix + "**resolv.conf**" file (7). This option, like all other ServerDNS options, + only affects name lookups that your server does on behalf of clients. + (Defaults to use the system DNS configuration.) + +**ServerDNSAllowBrokenConfig** **0**|**1**:: + If this option is false, Tor exits immediately if there are problems + parsing the system DNS configuration or connecting to nameservers. + Otherwise, Tor continues to periodically retry the system nameservers until + it eventually succeeds. (Defaults to "1".) + +**ServerDNSSearchDomains** **0**|**1**:: + If set to 1, then we will search for addresses in the local search domain. + For example, if this system is configured to believe it is in + "example.com", and a client tries to connect to "www", the client will be + connected to "www.example.com". This option only affects name lookups that + your server does on behalf of clients. (Defaults to "0".) + +**ServerDNSDetectHijacking** **0**|**1**:: + When this option is set to 1, we will test periodically to determine + whether our local nameservers have been configured to hijack failing DNS + requests (usually to an advertising site). If they are, we will attempt to + correct this. This option only affects name lookups that your server does + on behalf of clients. (Defaults to "1".) + +**ServerDNSTestAddresses** __address__,__address__,__...__:: + When we're detecting DNS hijacking, make sure that these __valid__ addresses + aren't getting redirected. If they are, then our DNS is completely useless, + and we'll reset our exit policy to "reject *:*". This option only affects + name lookups that your server does on behalf of clients. (Defaults to + "www.google.com, www.mit.edu, www.yahoo.com, www.slashdot.org".) + +**ServerDNSAllowNonRFC953Hostnames** **0**|**1**:: + When this option is disabled, Tor does not try to resolve hostnames + containing illegal characters (like @ and :) rather than sending them to an + exit node to be resolved. This helps trap accidental attempts to resolve + URLs and so on. This option only affects name lookups that your server does + on behalf of clients. (Default: 0) + +**BridgeRecordUsageByCountry** **0**|**1**:: + When this option is enabled and BridgeRelay is also enabled, and we have + GeoIP data, Tor keeps a keep a per-country count of how many client + addresses have contacted it so that it can help the bridge authority guess + which countries have blocked access to it. (Default: 1) + +**ServerDNSRandomizeCase** **0**|**1**:: + When this option is set, Tor sets the case of each character randomly in + outgoing DNS requests, and makes sure that the case matches in DNS replies. + This so-called "0x20 hack" helps resist some types of DNS poisoning attack. + For more information, see "Increased DNS Forgery Resistance through + 0x20-Bit Encoding". This option only affects name lookups that your server + does on behalf of clients. (Default: 1) + +**GeoIPFile** __filename__:: + A filename containing GeoIP data, for use with BridgeRecordUsageByCountry. + +**CellStatistics** **0**|**1**:: + When this option is enabled, Tor writes statistics on the mean time that + cells spend in circuit queues to disk every 24 hours. (Default: 0) + +**DirReqStatistics** **0**|**1**:: + When this option is enabled, Tor writes statistics on the number and + response time of network status requests to disk every 24 hours. + (Default: 0) + +**EntryStatistics** **0**|**1**:: + When this option is enabled, Tor writes statistics on the number of + directly connecting clients to disk every 24 hours. (Default: 0) + +**ExitPortStatistics** **0**|**1**:: + When this option is enabled, Tor writes statistics on the number of relayed + bytes and opened stream per exit port to disk every 24 hours. (Default: 0) + +**ExtraInfoStatistics** **0**|**1**:: + When this option is enabled, Tor includes previously gathered statistics in + its extra-info documents that it uploads to the directory authorities. + (Default: 0) + +DIRECTORY SERVER OPTIONS +------------------------ + +The following options are useful only for directory servers (that is, +if DirPort is non-zero): + +**AuthoritativeDirectory** **0**|**1**:: + When this option is set to 1, Tor operates as an authoritative directory + server. Instead of caching the directory, it generates its own list of + good servers, signs it, and sends that to the clients. Unless the clients + already have you listed as a trusted directory, you probably do not want + to set this option. Please coordinate with the other admins at + tor-ops@torproject.org if you think you should be a directory. + +**DirPortFrontPage** __FILENAME__:: + When this option is set, it takes an HTML file and publishes it as "/" on + the DirPort. Now relay operators can provide a disclaimer without needing + to set up a separate webserver. There's a sample disclaimer in + contrib/tor-exit-notice.html. + +**V1AuthoritativeDirectory** **0**|**1**:: + When this option is set in addition to **AuthoritativeDirectory**, Tor + generates version 1 directory and running-routers documents (for legacy + Tor clients up to 0.1.0.x). + +**V2AuthoritativeDirectory** **0**|**1**:: + When this option is set in addition to **AuthoritativeDirectory**, Tor + generates version 2 network statuses and serves descriptors, etc as + described in doc/spec/dir-spec-v2.txt (for Tor clients and servers running + 0.1.1.x and 0.1.2.x). + +**V3AuthoritativeDirectory** **0**|**1**:: + When this option is set in addition to **AuthoritativeDirectory**, Tor + generates version 3 network statuses and serves descriptors, etc as + described in doc/spec/dir-spec.txt (for Tor clients and servers running at + least 0.2.0.x). + +**VersioningAuthoritativeDirectory** **0**|**1**:: + When this option is set to 1, Tor adds information on which versions of + Tor are still believed safe for use to the published directory. Each + version 1 authority is automatically a versioning authority; version 2 + authorities provide this service optionally. See **RecommendedVersions**, + **RecommendedClientVersions**, and **RecommendedServerVersions**. + +**NamingAuthoritativeDirectory** **0**|**1**:: + When this option is set to 1, then the server advertises that it has + opinions about nickname-to-fingerprint bindings. It will include these + opinions in its published network-status pages, by listing servers with + the flag "Named" if a correct binding between that nickname and fingerprint + has been registered with the dirserver. Naming dirservers will refuse to + accept or publish descriptors that contradict a registered binding. See + **approved-routers** in the **FILES** section below. + +**HSAuthoritativeDir** **0**|**1**:: + When this option is set in addition to **AuthoritativeDirectory**, Tor also + accepts and serves hidden service descriptors. (Default: 0) + +**HidServDirectoryV2** **0**|**1**:: + When this option is set, Tor accepts and serves v2 hidden service + descriptors. Setting DirPort is not required for this, because clients + connect via the ORPort by default. (Default: 1) + +**BridgeAuthoritativeDir** **0**|**1**:: + When this option is set in addition to **AuthoritativeDirectory**, Tor + accepts and serves router descriptors, but it caches and serves the main + networkstatus documents rather than generating its own. (Default: 0) + +**MinUptimeHidServDirectoryV2** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**:: + Minimum uptime of a v2 hidden service directory to be accepted as such by + authoritative directories. (Default: 24 hours) + +**DirPort** __PORT__:: + Advertise the directory service on this port. + +**DirListenAddress** __IP__[:__PORT__]:: + Bind the directory service to this address. If you specify a port, bind to + this port rather than the one specified in DirPort. (Default: 0.0.0.0) + This directive can be specified multiple times to bind to multiple + addresses/ports. + +**DirPolicy** __policy__,__policy__,__...__:: + Set an entrance policy for this server, to limit who can connect to the + directory ports. The policies have the same form as exit policies above. + +DIRECTORY AUTHORITY SERVER OPTIONS +---------------------------------- + +**RecommendedVersions** __STRING__:: + STRING is a comma-separated list of Tor versions currently believed to be + safe. The list is included in each directory, and nodes which pull down the + directory learn whether they need to upgrade. This option can appear + multiple times: the values from multiple lines are spliced together. When + this is set then **VersioningAuthoritativeDirectory** should be set too. + +**RecommendedClientVersions** __STRING__:: + STRING is a comma-separated list of Tor versions currently believed to be + safe for clients to use. This information is included in version 2 + directories. If this is not set then the value of **RecommendedVersions** + is used. When this is set then **VersioningAuthoritativeDirectory** should + be set too. + +**RecommendedServerVersions** __STRING__:: + STRING is a comma-separated list of Tor versions currently believed to be + safe for servers to use. This information is included in version 2 + directories. If this is not set then the value of **RecommendedVersions** + is used. When this is set then **VersioningAuthoritativeDirectory** should + be set too. + +**ConsensusParams** __STRING__:: + STRING is a space-separated list of key=value pairs that Tor will include + in the "params" line of its networkstatus vote. + +**DirAllowPrivateAddresses** **0**|**1**:: + If set to 1, Tor will accept router descriptors with arbitrary "Address" + elements. Otherwise, if the address is not an IP address or is a private IP + address, it will reject the router descriptor. Defaults to 0. + +**AuthDirBadDir** __AddressPattern...__:: + Authoritative directories only. A set of address patterns for servers that + will be listed as bad directories in any network status document this + authority publishes, if **AuthDirListBadDirs** is set. + +**AuthDirBadExit** __AddressPattern...__:: + Authoritative directories only. A set of address patterns for servers that + will be listed as bad exits in any network status document this authority + publishes, if **AuthDirListBadExits** is set. + +**AuthDirInvalid** __AddressPattern...__:: + Authoritative directories only. A set of address patterns for servers that + will never be listed as "valid" in any network status document that this + authority publishes. + +**AuthDirReject** __AddressPattern__...:: + Authoritative directories only. A set of address patterns for servers that + will never be listed at all in any network status document that this + authority publishes, or accepted as an OR address in any descriptor + submitted for publication by this authority. + +**AuthDirListBadDirs** **0**|**1**:: + Authoritative directories only. If set to 1, this directory has some + opinion about which nodes are unsuitable as directory caches. (Do not set + this to 1 unless you plan to list non-functioning directories as bad; + otherwise, you are effectively voting in favor of every declared + directory.) + +**AuthDirListBadExits** **0**|**1**:: + Authoritative directories only. If set to 1, this directory has some + opinion about which nodes are unsuitable as exit nodes. (Do not set this to + 1 unless you plan to list non-functioning exits as bad; otherwise, you are + effectively voting in favor of every declared exit as an exit.) + +**AuthDirRejectUnlisted** **0**|**1**:: + Authoritative directories only. If set to 1, the directory server rejects + all uploaded server descriptors that aren't explicitly listed in the + fingerprints file. This acts as a "panic button" if we get hit with a Sybil + attack. (Default: 0) + +**AuthDirMaxServersPerAddr** __NUM__:: + Authoritative directories only. The maximum number of servers that we will + list as acceptable on a single IP address. Set this to "0" for "no limit". + (Default: 2) + +**AuthDirMaxServersPerAuthAddr** __NUM__:: + Authoritative directories only. Like AuthDirMaxServersPerAddr, but applies + to addresses shared with directory authorities. (Default: 5) + +**V3AuthVotingInterval** __N__ **minutes**|**hours**:: + V3 authoritative directories only. Configures the server's preferred voting + interval. Note that voting will __actually__ happen at an interval chosen + by consensus from all the authorities' preferred intervals. This time + SHOULD divide evenly into a day. (Default: 1 hour) + +**V3AuthVoteDelay** __N__ **minutes**|**hours**:: + V3 authoritative directories only. Configures the server's preferred delay + between publishing its vote and assuming it has all the votes from all the + other authorities. Note that the actual time used is not the server's + preferred time, but the consensus of all preferences. (Default: 5 minutes.) + +**V3AuthDistDelay** __N__ **minutes**|**hours**:: + V3 authoritative directories only. Configures the server's preferred delay + between publishing its consensus and signature and assuming it has all the + signatures from all the other authorities. Note that the actual time used + is not the server's preferred time, but the consensus of all preferences. + (Default: 5 minutes.) + +**V3AuthNIntervalsValid** __NUM__:: + V3 authoritative directories only. Configures the number of VotingIntervals + for which each consensus should be valid for. Choosing high numbers + increases network partitioning risks; choosing low numbers increases + directory traffic. Note that the actual number of intervals used is not the + server's preferred number, but the consensus of all preferences. Must be at + least 2. (Default: 3.) + +HIDDEN SERVICE OPTIONS +---------------------- + +The following options are used to configure a hidden service. + +**HiddenServiceDir** __DIRECTORY__:: + Store data files for a hidden service in DIRECTORY. Every hidden service + must have a separate directory. You may use this option multiple times to + specify multiple services. + +**HiddenServicePort** __VIRTPORT__ [__TARGET__]:: + Configure a virtual port VIRTPORT for a hidden service. You may use this + option multiple times; each time applies to the service using the most + recent hiddenservicedir. By default, this option maps the virtual port to + the same port on 127.0.0.1. You may override the target port, address, or + both by specifying a target of addr, port, or addr:port. You may also have + multiple lines with the same VIRTPORT: when a user connects to that + VIRTPORT, one of the TARGETs from those lines will be chosen at random. + +**PublishHidServDescriptors** **0**|**1**:: + If set to 0, Tor will run any hidden services you configure, but it won't + advertise them to the rendezvous directory. This option is only useful if + you're using a Tor controller that handles hidserv publishing for you. + (Default: 1) + +**HiddenServiceVersion** __version__,__version__,__...__:: + A list of rendezvous service descriptor versions to publish for the hidden + service. Currently, only version 2 is supported. (Default: 2) + +**HiddenServiceAuthorizeClient** __auth-type__ __client-name__,__client-name__,__...__:: + If configured, the hidden service is accessible for authorized clients + only. The auth-type can either be \'basic' for a general-purpose + authorization protocol or \'stealth' for a less scalable protocol that also + hides service activity from unauthorized clients. Only clients that are + listed here are authorized to access the hidden service. Valid client names + are 1 to 19 characters long and only use characters in A-Za-z0-9+-_ (no + spaces). If this option is set, the hidden service is not accessible for + clients without authorization any more. Generated authorization data can be + found in the hostname file. Clients need to put this authorization data in + their configuration file using **HidServAuth**. + +**RendPostPeriod** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**:: + Every time the specified period elapses, Tor uploads any rendezvous + service descriptors to the directory servers. This information is also + uploaded whenever it changes. (Default: 20 minutes) + +TESTING NETWORK OPTIONS +----------------------- + +The following options are used for running a testing Tor network. + +**TestingTorNetwork** **0**|**1**:: + If set to 1, Tor adjusts default values of the configuration options below, + so that it is easier to set up a testing Tor network. May only be set if + non-default set of DirServers is set. Cannot be unset while Tor is running. + (Default: 0) + + + ServerDNSAllowBrokenConfig 1 + DirAllowPrivateAddresses 1 + EnforceDistinctSubnets 0 + AssumeReachable 1 + AuthDirMaxServersPerAddr 0 + AuthDirMaxServersPerAuthAddr 0 + ClientDNSRejectInternalAddresses 0 + ExitPolicyRejectPrivate 0 + V3AuthVotingInterval 5 minutes + V3AuthVoteDelay 20 seconds + V3AuthDistDelay 20 seconds + TestingV3AuthInitialVotingInterval 5 minutes + TestingV3AuthInitialVoteDelay 20 seconds + TestingV3AuthInitialDistDelay 20 seconds + TestingAuthDirTimeToLearnReachability 0 minutes + TestingEstimatedDescriptorPropagationTime 0 minutes + +**TestingV3AuthInitialVotingInterval** __N__ **minutes**|**hours**:: + Like V3AuthVotingInterval, but for initial voting interval before the first + consensus has been created. Changing this requires that + **TestingTorNetwork** is set. (Default: 30 minutes) + +**TestingV3AuthInitialVoteDelay** __N__ **minutes**|**hours**:: + Like TestingV3AuthInitialVoteDelay, but for initial voting interval before + the first consensus has been created. Changing this requires that + **TestingTorNetwork** is set. (Default: 5 minutes) + +**TestingV3AuthInitialDistDelay** __N__ **minutes**|**hours**:: + Like TestingV3AuthInitialDistDelay, but for initial voting interval before + the first consensus has been created. Changing this requires that + **TestingTorNetwork** is set. (Default: 5 minutes) + +**TestingAuthDirTimeToLearnReachability** __N__ **minutes**|**hours**:: + After starting as an authority, do not make claims about whether routers + are Running until this much time has passed. Changing this requires + that **TestingTorNetwork** is set. (Default: 30 minutes) + +**TestingEstimatedDescriptorPropagationTime** __N__ **minutes**|**hours**:: + Clients try downloading router descriptors from directory caches after this + time. Changing this requires that **TestingTorNetwork** is set. (Default: + 10 minutes) + +SIGNALS +------- + +Tor catches the following signals: + +**SIGTERM**:: + Tor will catch this, clean up and sync to disk if necessary, and exit. + +**SIGINT**:: + Tor clients behave as with SIGTERM; but Tor servers will do a controlled + slow shutdown, closing listeners and waiting 30 seconds before exiting. + (The delay can be configured with the ShutdownWaitLength config option.) + +**SIGHUP**:: + The signal instructs Tor to reload its configuration (including closing and + reopening logs), and kill and restart its helper processes if applicable. + +**SIGUSR1**:: + Log statistics about current connections, past connections, and throughput. + +**SIGUSR2**:: + Switch all logs to loglevel debug. You can go back to the old loglevels by + sending a SIGHUP. + +**SIGCHLD**:: + Tor receives this signal when one of its helper processes has exited, so it + can clean up. + +**SIGPIPE**:: + Tor catches this signal and ignores it. + +**SIGXFSZ**:: + If this signal exists on your platform, Tor catches and ignores it. + +FILES +----- + +**@CONFDIR@/torrc**:: + The configuration file, which contains "option value" pairs. + +**@LOCALSTATEDIR@/lib/tor/**:: + The tor process stores keys and other data here. + +__DataDirectory__**/cached-status/**:: + The most recently downloaded network status document for each authority. + Each file holds one such document; the filenames are the hexadecimal + identity key fingerprints of the directory authorities. + +__DataDirectory__**/cached-descriptors** and **cached-descriptors.new**:: + These files hold downloaded router statuses. Some routers may appear more + than once; if so, the most recently published descriptor is used. Lines + beginning with @-signs are annotations that contain more information about + a given router. The ".new" file is an append-only journal; when it gets + too large, all entries are merged into a new cached-descriptors file. + +__DataDirectory__**/cached-routers** and **cached-routers.new**:: + Obsolete versions of cached-descriptors and cached-descriptors.new. When + Tor can't find the newer files, it looks here instead. + +__DataDirectory__**/state**:: + A set of persistent key-value mappings. These are documented in + the file. These include: + - The current entry guards and their status. + - The current bandwidth accounting values (unused so far; see + below). + - When the file was last written + - What version of Tor generated the state file + - A short history of bandwidth usage, as produced in the router + descriptors. + +__DataDirectory__**/bw_accounting**:: + Used to track bandwidth accounting values (when the current period starts + and ends; how much has been read and written so far this period). This file + is obsolete, and the data is now stored in the \'state' file as well. Only + used when bandwidth accounting is enabled. + +__DataDirectory__**/control_auth_cookie**:: + Used for cookie authentication with the controller. Location can be + overridden by the CookieAuthFile config option. Regenerated on startup. See + control-spec.txt for details. Only used when cookie authentication is + enabled. + +__DataDirectory__**/keys/***:: + Only used by servers. Holds identity keys and onion keys. + +__DataDirectory__**/fingerprint**:: + Only used by servers. Holds the fingerprint of the server's identity key. + +__DataDirectory__**/approved-routers**:: + Only for naming authoritative directory servers (see + **NamingAuthoritativeDirectory**). This file lists nickname to identity + bindings. Each line lists a nickname and a fingerprint separated by + whitespace. See your **fingerprint** file in the __DataDirectory__ for an + example line. If the nickname is **!reject** then descriptors from the + given identity (fingerprint) are rejected by this server. If it is + **!invalid** then descriptors are accepted but marked in the directory as + not valid, that is, not recommended. + +__DataDirectory__**/router-stability**:: + Only used by authoritative directory servers. Tracks measurements for + router mean-time-between-failures so that authorities have a good idea of + how to set their Stable flags. + +__HiddenServiceDirectory__**/hostname**:: + The .onion domain name for this hidden service. + If the hidden service is restricted to authorized clients only, this file + also contains authorization data for all clients. + +__HiddenServiceDirectory__**/private_key**:: + The private key for this hidden service. + +__HiddenServiceDirectory__**/client_keys**:: + Authorization data for a hidden service that is only accessible by + authorized clients. + +SEE ALSO +-------- +**privoxy**(1), **tsocks**(1), **torify**(1) + + +**https://www.torproject.org/** + + +BUGS +---- + +Plenty, probably. Tor is still in development. Please report them. + +AUTHORS +------- +Roger Dingledine [arma at mit.edu], Nick Mathewson [nickm at alum.mit.edu]. + diff -Nru tor-0.2.0.34/doc/tor-gencert.1 tor-0.2.2.16-alpha/doc/tor-gencert.1 --- tor-0.2.0.34/doc/tor-gencert.1 2008-02-26 19:56:32.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-gencert.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -.TH tor-gencert 1 "" Jan-2008 "" -.\" manual page by Nick Mathewson -.SH NAME -.LP -tor-gencert \- Generate certs and keys for Tor directory authorities - -.SH SYNOPSIS -\fBtor-gencert\fP\ [-h|--help] [-v] [-r|--reuse] [--create-identity-key] [-i \fIid_file\fP] [-c \fIcert_file\fP] [-m \fInum\fP] [-a \fIaddress\fP:\fIport\fP] - -.SH DESCRIPTION -\fBtor-gencert\fR generates certificates and private keys for use by Tor -directory authorities running the v3 Tor directory protocol, as used by Tor -0.2.0 and later. If you are not running a directory authority, you don't -need to use tor-gencert. -.PP -Every directory authority has a long term authority \fIidentity key\fP (which -is distinct from the identity key it uses as a Tor server); this key should -be kept offline in a secure location. It is used to certify shorter-lived -\fIsigning keys\fP, which are kept online and used by the directory authority -to sign votes and consensus documents. -.PP -After you use this program to generate a signing key and a certificate, copy -those files to the keys subdirectory of your Tor process, and send Tor a -SIGHUP signal. DO NOT COPY THE IDENTITY KEY. - -.SH OPTIONS -\fB-v\fP -Display verbose output. -.LP -.TP -\fB-h\fP or \fB--help\fP -Display help text and exit. -.LP -.TP -\fB-r\fP or \fB--reuse\fP -Generate a new certificate, but not a new signing key. This can be -used to change the address or lifetime associated with a given key. -.LP -.TP -\fB--create-identity-key\fP -Generate a new identity key. You should only use this option the first -time you run tor-gencert; in the future, you should use the identity -key that's already there. -.LP -.TP -\fB-i \fR\fIFILENAME\fP -Read the identity key from the specified file. If the file is not present -and --create-identity-key is provided, create the identity key in the -specified file. Default: "./authority_identity_key" -.LP -.TP -\fB-s \fR\fIFILENAME\fP -Write the signing key to the specified file. Default: -"./authority_signing_key" -.LP -.TP -\fB-c \fR\fIFILENAME\fP -Write the certificate to the specified file. -Default: "./authority_certificate" -.LP -.TP -\fB-m \fR\fINUM\fP -Number of months that the certificate should be valid. Default: 12. -.LP -.TP -\fB--passphrase-fd \fR\fIFILEDES\fP -Filedescriptor to read the file descriptor from. Ends at the first -NUL or newline. Default: read from the terminal. -.LP -.TP -\fB-a \fR\fIaddress\fR:\fIport\fP -If provided, advertise the address:port combination as this authority's -preferred directory port in its certificate. If the address is a hostname, -the hostname is resolved to an IP before it's published. - -.SH BUGS -This probably doesn't run on Windows. That's not a big issue, since we -don't really want authorities to be running on Windows anyway. - -.SH SEE ALSO -.BR tor (1) -.PP -See also the "dir-spec.txt" file, distributed with Tor. - -.SH AUTHORS -Roger Dingledine , Nick Mathewson . diff -Nru tor-0.2.0.34/doc/tor-gencert.1.in tor-0.2.2.16-alpha/doc/tor-gencert.1.in --- tor-0.2.0.34/doc/tor-gencert.1.in 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-gencert.1.in 2010-02-22 20:57:26.000000000 +0000 @@ -0,0 +1,90 @@ +.\" Title: tor-gencert +.\" Author: +.\" Generator: DocBook XSL Stylesheets v1.73.2 +.\" Date: 02/22/2010 +.\" Manual: +.\" Source: +.\" +.TH "TOR\-GENCERT" "1" "02/22/2010" "" "" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "NAME" +tor-gencert \- Generate certs and keys for Tor directory authorities +.SH "SYNOPSIS" +\fBtor\-gencert\fR [\-h|\-\-help] [\-v] [\-r|\-\-reuse] [\-\-create\-identity\-key] [\-i \fIid_file\fR] [\-c \fIcert_file\fR] [\-m \fInum\fR] [\-a \fIaddress\fR:\fIport\fR] +.sp +.SH "DESCRIPTION" +\fBtor\-gencert\fR generates certificates and private keys for use by Tor directory authorities running the v3 Tor directory protocol, as used by Tor 0\&.2\&.0 and later\&. If you are not running a directory authority, you don\'t need to use tor\-gencert\&. +.sp +Every directory authority has a long term authority \fIidentity\fR \fIkey\fR (which is distinct from the identity key it uses as a Tor server); this key should be kept offline in a secure location\&. It is used to certify shorter\-lived \fIsigning\fR \fIkeys\fR, which are kept online and used by the directory authority to sign votes and consensus documents\&. +.sp +After you use this program to generate a signing key and a certificate, copy those files to the keys subdirectory of your Tor process, and send Tor a SIGHUP signal\&. DO NOT COPY THE IDENTITY KEY\&. +.sp +.SH "OPTIONS" +.PP +\fB\-v\fR +.RS 4 +Display verbose output\&. +.RE +.PP +\fB\-h\fR or \fB\-\-help\fR +.RS 4 +Display help text and exit\&. +.RE +.PP +\fB\-r\fR or \fB\-\-reuse\fR +.RS 4 +Generate a new certificate, but not a new signing key\&. This can be used to change the address or lifetime associated with a given key\&. +.RE +.PP +\fB\-\-create\-identity\-key\fR +.RS 4 +Generate a new identity key\&. You should only use this option the first time you run tor\-gencert; in the future, you should use the identity key that\'s already there\&. +.RE +.PP +\fB\-i\fR \fIFILENAME\fR +.RS 4 +Read the identity key from the specified file\&. If the file is not present and \-\-create\-identity\-key is provided, create the identity key in the specified file\&. Default: "\&./authority_identity_key" +.RE +.PP +\fB\-s\fR \fIFILENAME\fR +.RS 4 +Write the signing key to the specified file\&. Default: "\&./authority_signing_key" +.RE +.PP +\fB\-c\fR \fIFILENAME\fR +.RS 4 +Write the certificate to the specified file\&. Default: "\&./authority_certificate" +.RE +.PP +\fB\-m\fR \fINUM\fR +.RS 4 +Number of months that the certificate should be valid\&. Default: 12\&. +.RE +.PP +\fB\-\-passphrase\-fd\fR \fIFILEDES\fR +.RS 4 +Filedescriptor to read the file descriptor from\&. Ends at the first NUL or newline\&. Default: read from the terminal\&. +.RE +.PP +\fB\-a\fR \fIaddress\fR:\fIport\fR +.RS 4 +If provided, advertise the address:port combination as this authority\'s preferred directory port in its certificate\&. If the address is a hostname, the hostname is resolved to an IP before it\'s published\&. +.RE +.SH "BUGS" +This probably doesn\'t run on Windows\&. That\'s not a big issue, since we don\'t really want authorities to be running on Windows anyway\&. +.sp +.SH "SEE ALSO" +\fBtor\fR(1) +.sp +See also the "dir\-spec\&.txt" file, distributed with Tor\&. +.sp +.SH "AUTHORS" +.sp +.RS 4 +.nf +Roger Dingledine , Nick Mathewson \&. +.fi +.RE diff -Nru tor-0.2.0.34/doc/tor-gencert.1.txt tor-0.2.2.16-alpha/doc/tor-gencert.1.txt --- tor-0.2.0.34/doc/tor-gencert.1.txt 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-gencert.1.txt 2010-02-02 21:40:22.000000000 +0000 @@ -0,0 +1,90 @@ +// Copyright (c) The Tor Project, Inc. +// See LICENSE for licensing information +// This is an asciidoc file used to generate the manpage/html reference. +// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html +tor-gencert(1) +============== +Nick Mathewson + +NAME +---- +tor-gencert - Generate certs and keys for Tor directory authorities + +SYNOPSIS +-------- +**tor-gencert** [-h|--help] [-v] [-r|--reuse] [--create-identity-key] [-i __id_file__] [-c +__cert_file__] [-m __num__] [-a __address__:__port__] + +DESCRIPTION +----------- +**tor-gencert** generates certificates and private keys for use by Tor +directory authorities running the v3 Tor directory protocol, as used by +Tor 0.2.0 and later. If you are not running a directory authority, you +don't need to use tor-gencert. + + +Every directory authority has a long term authority __identity__ __key__ (which +is distinct from the identity key it uses as a Tor server); this key +should be kept offline in a secure location. It is used to certify +shorter-lived __signing__ __keys__, which are kept online and used by the +directory authority to sign votes and consensus documents. + + +After you use this program to generate a signing key and a certificate, +copy those files to the keys subdirectory of your Tor process, and send +Tor a SIGHUP signal. DO NOT COPY THE IDENTITY KEY. + +OPTIONS +------- +**-v**:: + Display verbose output. + +**-h** or **--help**:: + Display help text and exit. + +**-r** or **--reuse**:: + Generate a new certificate, but not a new signing key. This can be used to + change the address or lifetime associated with a given key. + +**--create-identity-key**:: + Generate a new identity key. You should only use this option the first time + you run tor-gencert; in the future, you should use the identity key that's + already there. + +**-i** __FILENAME__:: + Read the identity key from the specified file. If the file is not present + and --create-identity-key is provided, create the identity key in the + specified file. Default: "./authority_identity_key" + +**-s** __FILENAME__:: + Write the signing key to the specified file. Default: + "./authority_signing_key" + +**-c** __FILENAME__:: + Write the certificate to the specified file. Default: + "./authority_certificate" + +**-m** __NUM__:: + Number of months that the certificate should be valid. Default: 12. + +**--passphrase-fd** __FILEDES__:: + Filedescriptor to read the file descriptor from. Ends at the first NUL or + newline. Default: read from the terminal. + +**-a** __address__:__port__:: + If provided, advertise the address:port combination as this authority's + preferred directory port in its certificate. If the address is a hostname, + the hostname is resolved to an IP before it's published. + +BUGS +---- +This probably doesn't run on Windows. That's not a big issue, since we don't +really want authorities to be running on Windows anyway. + +SEE ALSO +-------- +**tor**(1) + + +See also the "dir-spec.txt" file, distributed with Tor. + +AUTHORS +------- + Roger Dingledine , Nick Mathewson . diff -Nru tor-0.2.0.34/doc/tor-gencert.html.in tor-0.2.2.16-alpha/doc/tor-gencert.html.in --- tor-0.2.0.34/doc/tor-gencert.html.in 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-gencert.html.in 2010-02-22 20:57:38.000000000 +0000 @@ -0,0 +1,512 @@ + + + + + + +tor-gencert(1) + + + +

SYNOPSIS

+
+

tor-gencert [-h|--help] [-v] [-r|--reuse] [--create-identity-key] [-i id_file] [-c +cert_file] [-m num] [-a address:port]

+
+

DESCRIPTION

+
+

tor-gencert generates certificates and private keys for use by Tor +directory authorities running the v3 Tor directory protocol, as used by +Tor 0.2.0 and later. If you are not running a directory authority, you +don't need to use tor-gencert.

+

Every directory authority has a long term authority identity key (which +is distinct from the identity key it uses as a Tor server); this key +should be kept offline in a secure location. It is used to certify +shorter-lived signing keys, which are kept online and used by the +directory authority to sign votes and consensus documents.

+

After you use this program to generate a signing key and a certificate, +copy those files to the keys subdirectory of your Tor process, and send +Tor a SIGHUP signal. DO NOT COPY THE IDENTITY KEY.

+
+

OPTIONS

+
+
+
+-v +
+
+

+ Display verbose output. +

+
+
+-h or --help +
+
+

+ Display help text and exit. +

+
+
+-r or --reuse +
+
+

+ Generate a new certificate, but not a new signing key. This can be used to + change the address or lifetime associated with a given key. +

+
+
+--create-identity-key +
+
+

+ Generate a new identity key. You should only use this option the first time + you run tor-gencert; in the future, you should use the identity key that's + already there. +

+
+
+-i FILENAME +
+
+

+ Read the identity key from the specified file. If the file is not present + and --create-identity-key is provided, create the identity key in the + specified file. Default: "./authority_identity_key" +

+
+
+-s FILENAME +
+
+

+ Write the signing key to the specified file. Default: + "./authority_signing_key" +

+
+
+-c FILENAME +
+
+

+ Write the certificate to the specified file. Default: + "./authority_certificate" +

+
+
+-m NUM +
+
+

+ Number of months that the certificate should be valid. Default: 12. +

+
+
+--passphrase-fd FILEDES +
+
+

+ Filedescriptor to read the file descriptor from. Ends at the first NUL or + newline. Default: read from the terminal. +

+
+
+-a address:port +
+
+

+ If provided, advertise the address:port combination as this authority's + preferred directory port in its certificate. If the address is a hostname, + the hostname is resolved to an IP before it's published. +

+
+
+
+

BUGS

+
+

This probably doesn't run on Windows. That's not a big issue, since we don't +really want authorities to be running on Windows anyway.

+
+

SEE ALSO

+
+

tor(1)

+

See also the "dir-spec.txt" file, distributed with Tor.

+
+

AUTHORS

+
+
+
+
Roger Dingledine <arma@mit.edu>, Nick Mathewson <nickm@alum.mit.edu>.
+
+
+ + + diff -Nru tor-0.2.0.34/doc/tor.html.in tor-0.2.2.16-alpha/doc/tor.html.in --- tor-0.2.0.34/doc/tor.html.in 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor.html.in 2010-08-18 23:06:21.000000000 +0000 @@ -0,0 +1,2867 @@ + + + + + + +TOR(1) + + + +

SYNOPSIS

+
+

tor [OPTION value]…

+
+

DESCRIPTION

+
+

tor is a connection-oriented anonymizing communication +service. Users choose a source-routed path through a set of nodes, and +negotiate a "virtual circuit" through the network, in which each node +knows its predecessor and successor, but no others. Traffic flowing down +the circuit is unwrapped by a symmetric key at each node, which reveals +the downstream node.

+

Basically tor provides a distributed network of servers ("onion routers"). +Users bounce their TCP streams — web traffic, ftp, ssh, etc — around the +routers, and recipients, observers, and even the routers themselves have +difficulty tracking the source of the stream.

+
+

OPTIONS

+
+
+
+-h, -help +
+
+

+ Display a short help message and exit. +

+
+
+-f FILE +
+
+

+ FILE contains further "option value" paris. (Default: @CONFDIR@/torrc) +

+
+
+--hash-password +
+
+

+ Generates a hashed password for control port access. +

+
+
+--list-fingerprint +
+
+

+ Generate your keys and output your nickname and fingerprint. +

+
+
+--verify-config +
+
+

+ Verify the configuration file is valid. +

+
+
+--nt-service +
+
+

+ --service [install|remove|start|stop] Manage the Tor Windows + NT/2000/XP service. Current instructions can be found at + https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ#WinNTService +

+
+
+--list-torrc-options +
+
+

+ List all valid options. +

+
+
+--version +
+
+

+ Display Tor version and exit. +

+
+
+--quiet +
+
+

+ Do not start Tor with a console log unless explicitly requested to do so. + (By default, Tor starts out logging messages at level "notice" or higher to + the console, until it has parsed its configuration.) +

+
+
+

Other options can be specified either on the command-line (--option + value), or in the configuration file (option value or option "value"). + Options are case-insensitive. C-style escaped characters are allowed inside + quoted values. Options on the command line take precedence over + options found in the configuration file.

+
+
+BandwidthRate N bytes|KB|MB|GB +
+
+

+ A token bucket limits the average incoming bandwidth usage on this node to + the specified number of bytes per second, and the average outgoing + bandwidth usage to that same value. If you want to run a relay in the + public network, this needs to be at the very least 20 KB (that is, + 20480 bytes). (Default: 5 MB) +

+
+
+BandwidthBurst N bytes|KB|MB|GB +
+
+

+ Limit the maximum token bucket size (also known as the burst) to the given + number of bytes in each direction. (Default: 10 MB) +

+
+
+MaxAdvertisedBandwidth N bytes|KB|MB|GB +
+
+

+ If set, we will not advertise more than this amount of bandwidth for our + BandwidthRate. Server operators who want to reduce the number of clients + who ask to build circuits through them (since this is proportional to + advertised bandwidth rate) can thus reduce the CPU demands on their server + without impacting network performance. +

+
+
+RelayBandwidthRate N bytes|KB|MB|GB +
+
+

+ If defined, a separate token bucket limits the average incoming bandwidth + usage for _relayed traffic_ on this node to the specified number of bytes + per second, and the average outgoing bandwidth usage to that same value. + Relayed traffic currently is calculated to include answers to directory + requests, but that may change in future versions. (Default: 0) +

+
+
+RelayBandwidthBurst N bytes|KB|MB|GB +
+
+

+ Limit the maximum token bucket size (also known as the burst) for + _relayed traffic_ to the given number of bytes in each direction. + (Default: 0) +

+
+
+PerConnBWRate N bytes|KB|MB|GB +
+
+

+ If set, do separate rate limiting for each connection from a non-relay. + You should never need to change this value, since a network-wide value is + published in the consensus and your relay will use that value. (Default: 0) +

+
+
+PerConnBWBurst N bytes|KB|MB|GB +
+
+

+ If set, do separate rate limiting for each connection from a non-relay. + You should never need to change this value, since a network-wide value is + published in the consensus and your relay will use that value. (Default: 0) +

+
+
+ConLimit NUM +
+
+

+ The minimum number of file descriptors that must be available to the Tor + process before it will start. Tor will ask the OS for as many file + descriptors as the OS will allow (you can find this by "ulimit -H -n"). + If this number is less than ConnLimit, then Tor will refuse to start. + + You probably don't need to adjust this. It has no effect on Windows + since that platform lacks getrlimit(). (Default: 1000) +

+
+
+ConstrainedSockets 0|1 +
+
+

+ If set, Tor will tell the kernel to attempt to shrink the buffers for all + sockets to the size specified in ConstrainedSockSize. This is useful for + virtual servers and other environments where system level TCP buffers may + be limited. If you're on a virtual server, and you encounter the "Error + creating network socket: No buffer space available" message, you are + likely experiencing this problem. + + The preferred solution is to have the admin increase the buffer pool for + the host itself via /proc/sys/net/ipv4/tcp_mem or equivalent facility; + this configuration option is a second-resort. + + The DirPort option should also not be used if TCP buffers are scarce. The + cached directory requests consume additional sockets which exacerbates + the problem. + + You should not enable this feature unless you encounter the "no buffer + space available" issue. Reducing the TCP buffers affects window size for + the TCP stream and will reduce throughput in proportion to round trip + time on long paths. (Default: 0.) +

+
+
+ConstrainedSockSize N bytes|KB +
+
+

+ When ConstrainedSockets is enabled the receive and transmit buffers for + all sockets will be set to this limit. Must be a value between 2048 and + 262144, in 1024 byte increments. Default of 8192 is recommended. +

+
+
+ControlPort Port +
+
+

+ If set, Tor will accept connections on this port and allow those + connections to control the Tor process using the Tor Control Protocol + (described in control-spec.txt). Note: unless you also specify one of + HashedControlPassword or CookieAuthentication, setting this option will + cause Tor to allow any process on the local host to control it. This + option is required for many Tor controllers; most use the value of 9051. +

+
+
+ControlListenAddress IP[:PORT] +
+
+

+ Bind the controller listener to this address. If you specify a port, bind + to this port rather than the one specified in ControlPort. We strongly + recommend that you leave this alone unless you know what you're doing, + since giving attackers access to your control listener is really + dangerous. (Default: 127.0.0.1) This directive can be specified multiple + times to bind to multiple addresses/ports. +

+
+
+ControlSocket Path +
+
+

+ Like ControlPort, but listens on a Unix domain socket, rather than a TCP + socket. (Unix and Unix-like systems only.) +

+
+
+HashedControlPassword hashed_password +
+
+

+ Don't allow any connections on the control port except when the other + process knows the password whose one-way hash is hashed_password. You + can compute the hash of a password by running "tor --hash-password + password". You can provide several acceptable passwords by using more + than one HashedControlPassword line. +

+
+
+CookieAuthentication 0|1 +
+
+

+ If this option is set to 1, don't allow any connections on the control port + except when the connecting process knows the contents of a file named + "control_auth_cookie", which Tor will create in its data directory. This + authentication method should only be used on systems with good filesystem + security. (Default: 0) +

+
+
+CookieAuthFile Path +
+
+

+ If set, this option overrides the default location and file name + for Tor's cookie file. (See CookieAuthentication above.) +

+
+
+CookieAuthFileGroupReadable 0|1|Groupname +
+
+

+ If this option is set to 0, don't allow the filesystem group to read the + cookie file. If the option is set to 1, make the cookie file readable by + the default GID. [Making the file readable by other groups is not yet + implemented; let us know if you need this for some reason.] (Default: 0). +

+
+
+DataDirectory DIR +
+
+

+ Store working data in DIR (Default: @LOCALSTATEDIR@/lib/tor) +

+
+
+DirServer [nickname] [flags] address:port fingerprint +
+
+

+ Use a nonstandard authoritative directory server at the provided address + and port, with the specified key fingerprint. This option can be repeated + many times, for multiple authoritative directory servers. Flags are + separated by spaces, and determine what kind of an authority this directory + is. By default, every authority is authoritative for current ("v2")-style + directories, unless the "no-v2" flag is given. If the "v1" flags is + provided, Tor will use this server as an authority for old-style (v1) + directories as well. (Only directory mirrors care about this.) Tor will + use this server as an authority for hidden service information if the "hs" + flag is set, or if the "v1" flag is set and the "no-hs" flag is not set. + Tor will use this authority as a bridge authoritative directory if the + "bridge" flag is set. If a flag "orport=port" is given, Tor will use the + given port when opening encrypted tunnels to the dirserver. Lastly, if a + flag "v3ident=fp" is given, the dirserver is a v3 directory authority + whose v3 long-term signing key has the fingerprint fp. + + If no dirserver line is given, Tor will use the default directory + servers. NOTE: this option is intended for setting up a private Tor + network with its own directory authorities. If you use it, you will be + distinguishable from other users, because you won't believe the same + authorities they do. +

+
+
+

AlternateDirAuthority [nickname] [flags] address:port fingerprint

+

AlternateHSAuthority [nickname] [flags] address:port fingerprint

+
+
+AlternateBridgeAuthority [nickname] [flags] address:port fingerprint +
+
+

+ As DirServer, but replaces less of the default directory authorities. Using + AlternateDirAuthority replaces the default Tor directory authorities, but + leaves the hidden service authorities and bridge authorities in place. + Similarly, Using AlternateHSAuthority replaces the default hidden service + authorities, but not the directory or bridge authorities. +

+
+
+DisableAllSwap 0|1 +
+
+

+ If set to 1, Tor will attempt to lock all current and future memory pages, + so that memory cannot be paged out. Windows, OS X and Solaris are currently + not supported. We believe that this feature works on modern Gnu/Linux + distributions, and that it should work on *BSD systems (untested). This + option requires that you start your Tor as root, and you should use the + User option to properly reduce Tor's privileges. (Default: 0) +

+
+
+FetchDirInfoEarly 0|1 +
+
+

+ If set to 1, Tor will always fetch directory information like other + directory caches, even if you don't meet the normal criteria for fetching + early. Normal users should leave it off. (Default: 0) +

+
+
+FetchDirInfoExtraEarly 0|1 +
+
+

+ If set to 1, Tor will fetch directory information before other directory + caches. It will attempt to download directory information closer to the + start of the consensus period. Normal users should leave it off. + (Default: 0) +

+
+
+FetchHidServDescriptors 0|1 +
+
+

+ If set to 0, Tor will never fetch any hidden service descriptors from the + rendezvous directories. This option is only useful if you're using a Tor + controller that handles hidden service fetches for you. (Default: 1) +

+
+
+FetchServerDescriptors 0|1 +
+
+

+ If set to 0, Tor will never fetch any network status summaries or server + descriptors from the directory servers. This option is only useful if + you're using a Tor controller that handles directory fetches for you. + (Default: 1) +

+
+
+FetchUselessDescriptors 0|1 +
+
+

+ If set to 1, Tor will fetch every non-obsolete descriptor from the + authorities that it hears about. Otherwise, it will avoid fetching useless + descriptors, for example for routers that are not running. This option is + useful if you're using the contributed "exitlist" script to enumerate Tor + nodes that exit to certain addresses. (Default: 0) +

+
+
+HTTPProxy host[:port] +
+
+

+ Tor will make all its directory requests through this host:port (or host:80 + if port is not specified), rather than connecting directly to any directory + servers. +

+
+
+HTTPProxyAuthenticator username:password +
+
+

+ If defined, Tor will use this username:password for Basic HTTP proxy + authentication, as in RFC 2617. This is currently the only form of HTTP + proxy authentication that Tor supports; feel free to submit a patch if you + want it to support others. +

+
+
+HTTPSProxy host[:port] +
+
+

+ Tor will make all its OR (SSL) connections through this host:port (or + host:443 if port is not specified), via HTTP CONNECT rather than connecting + directly to servers. You may want to set FascistFirewall to restrict + the set of ports you might try to connect to, if your HTTPS proxy only + allows connecting to certain ports. +

+
+
+HTTPSProxyAuthenticator username:password +
+
+

+ If defined, Tor will use this username:password for Basic HTTPS proxy + authentication, as in RFC 2617. This is currently the only form of HTTPS + proxy authentication that Tor supports; feel free to submit a patch if you + want it to support others. +

+
+
+Socks4Proxy host[:port] +
+
+

+ Tor will make all OR connections through the SOCKS 4 proxy at host:port + (or host:1080 if port is not specified). +

+
+
+Socks5Proxy host[:port] +
+
+

+ Tor will make all OR connections through the SOCKS 5 proxy at host:port + (or host:1080 if port is not specified). +

+
+
+

Socks5ProxyUsername username

+
+
+Socks5ProxyPassword password +
+
+

+ If defined, authenticate to the SOCKS 5 server using username and password + in accordance to RFC 1929. Both username and password must be between 1 and + 255 characters. +

+
+
+KeepalivePeriod NUM +
+
+

+ To keep firewalls from expiring connections, send a padding keepalive cell + every NUM seconds on open connections that are in use. If the connection + has no open circuits, it will instead be closed after NUM seconds of + idleness. (Default: 5 minutes) +

+
+
+Log minSeverity[-maxSeverity] stderr|stdout|syslog +
+
+

+ Send all messages between minSeverity and maxSeverity to the standard + output stream, the standard error stream, or to the system log. (The + "syslog" value is only supported on Unix.) Recognized severity levels are + debug, info, notice, warn, and err. We advise using "notice" in most cases, + since anything more verbose may provide sensitive information to an + attacker who obtains the logs. If only one severity level is given, all + messages of that level or higher will be sent to the listed destination. +

+
+
+Log minSeverity[-maxSeverity] file FILENAME +
+
+

+ As above, but send log messages to the listed filename. The + "Log" option may appear more than once in a configuration file. + Messages are sent to all the logs that match their severity + level. +

+
+
+OutboundBindAddress IP +
+
+

+ Make all outbound connections originate from the IP address specified. This + is only useful when you have multiple network interfaces, and you want all + of Tor's outgoing connections to use a single one. This setting will be + ignored for connections to the loopback addresses (127.0.0.0/8 and ::1). +

+
+
+PidFile FILE +
+
+

+ On startup, write our PID to FILE. On clean shutdown, remove + FILE. +

+
+
+ProtocolWarnings 0|1 +
+
+

+ If 1, Tor will log with severity 'warn' various cases of other parties not + following the Tor specification. Otherwise, they are logged with severity + 'info'. (Default: 0) +

+
+
+RunAsDaemon 0|1 +
+
+

+ If 1, Tor forks and daemonizes to the background. This option has no effect + on Windows; instead you should use the --service command-line option. + (Default: 0) +

+
+
+SafeLogging 0|1|relay +
+
+

+ Tor can scrub potentially sensitive strings from log messages (e.g. + addresses) by replacing them with the string [scrubbed]. This way logs can + still be useful, but they don't leave behind personally identifying + information about what sites a user might have visited. + + If this option is set to 0, Tor will not perform any scrubbing, if it is + set to 1, all potentially sensitive strings are replaced. If it is set to + relay, all log messages generated when acting as a relay are sanitized, but + all messages generated when acting as a client are not. (Default: 1) +

+
+
+User UID +
+
+

+ On startup, setuid to this user and setgid to their primary group. +

+
+
+HardwareAccel 0|1 +
+
+

+ If non-zero, try to use built-in (static) crypto hardware acceleration when + available. (Default: 0) +

+
+
+AccelName NAME +
+
+

+ When using OpenSSL hardware crypto acceleration attempt to load the dynamic + engine of this name. This must be used for any dynamic hardware engine. + Names can be verified with the openssl engine command. +

+
+
+AccelDir DIR +
+
+

+ Specify this option if using dynamic hardware acceleration and the engine + implementation library resides somewhere other than the OpenSSL default. +

+
+
+AvoidDiskWrites 0|1 +
+
+

+ If non-zero, try to write to disk less frequently than we would otherwise. + This is useful when running on flash memory or other media that support + only a limited number of writes. (Default: 0) +

+
+
+TunnelDirConns 0|1 +
+
+

+ If non-zero, when a directory server we contact supports it, we will build + a one-hop circuit and make an encrypted connection via its ORPort. + (Default: 1) +

+
+
+PreferTunneledDirConns 0|1 +
+
+

+ If non-zero, we will avoid directory servers that don't support tunneled + directory connections, when possible. (Default: 1) +

+
+
+CircuitPriorityHalflife NUM1 +
+
+

+ If this value is set, we override the default algorithm for choosing which + circuit's cell to deliver or relay next. When the value is 0, we + round-robin between the active circuits on a connection, delivering one + cell from each in turn. When the value is positive, we prefer delivering + cells from whichever connection has the lowest weighted cell count, where + cells are weighted exponentially according to the supplied + CircuitPriorityHalflife value (in seconds). If this option is not set at + all, we use the behavior recommended in the current consensus + networkstatus. This is an advanced option; you generally shouldn't have + to mess with it. (Default: not set.) +

+
+
+
+

CLIENT OPTIONS

+
+

The following options are useful only for clients (that is, if +SocksPort is non-zero):

+
+
+AllowInvalidNodes entry|exit|middle|introduction|rendezvous| +
+
+

+ If some Tor servers are obviously not working right, the directory + authorities can manually mark them as invalid, meaning that it's not + recommended you use them for entry or exit positions in your circuits. You + can opt to use them in some circuit positions, though. The default is + "middle,rendezvous", and other choices are not advised. +

+
+
+ExcludeSingleHopRelays 0|1 +
+
+

+ This option controls whether circuits built by Tor will include relays with + the AllowSingleHopExits flag set to true. If ExcludeSingleHopRelays is set + to 0, these relays will be included. Note that these relays might be at + higher risk of being seized or observed, so they are not normally included. + (Default: 1) +

+
+
+Bridge IP:ORPort [fingerprint] +
+
+

+ When set along with UseBridges, instructs Tor to use the relay at + "IP:ORPort" as a "bridge" relaying into the Tor network. If "fingerprint" + is provided (using the same format as for DirServer), we will verify that + the relay running at that location has the right fingerprint. We also use + fingerprint to look up the bridge descriptor at the bridge authority, if + it's provided and if UpdateBridgesFromAuthority is set too. +

+
+
+LearnCircuitBuildTimeout 0|1 +
+
+

+ If 0, CircuitBuildTimeout adaptive learning is disabled. (Default: 1) +

+
+
+CircuitBuildTimeout NUM +
+
+

+ Try for at most NUM seconds when building circuits. If the circuit isn't + open in that time, give up on it. If LearnCircuitBuildTimeout is 1, this + value serves as the initial value to use before a timeout is learned. If + LearnCircuitBuildTimeout is 0, this value is the only value used. + (Default: 60 seconds.) +

+
+
+CircuitIdleTimeout NUM +
+
+

+ If we have kept a clean (never used) circuit around for NUM seconds, then + close it. This way when the Tor client is entirely idle, it can expire all + of its circuits, and then expire its TLS connections. Also, if we end up + making a circuit that is not useful for exiting any of the requests we're + receiving, it won't forever take up a slot in the circuit list. (Default: 1 + hour.) +

+
+
+CircuitStreamTimeout NUM +
+
+

+ If non-zero, this option overrides our internal timeout schedule for how + many seconds until we detach a stream from a circuit and try a new circuit. + If your network is particularly slow, you might want to set this to a + number like 60. (Default: 0) +

+
+
+ClientOnly 0|1 +
+
+

+ If set to 1, Tor will under no circumstances run as a server or serve + directory requests. The default is to run as a client unless ORPort is + configured. (Usually, you don't need to set this; Tor is pretty smart at + figuring out whether you are reliable and high-bandwidth enough to be a + useful server.) (Default: 0) +

+
+
+ExcludeNodes node,node, +
+
+

+ A list of identity fingerprints, nicknames, country codes and address + patterns of nodes to never use when building a circuit. (Example: + ExcludeNodes SlowServer, $ EFFFFFFFFFFFFFFF, {cc}, 255.254.0.0/8) +

+
+
+ExcludeExitNodes node,node, +
+
+

+ A list of identity fingerprints, nicknames, country codes and address + patterns of nodes to never use when picking an exit node. Note that any + node listed in ExcludeNodes is automatically considered to be part of this + list. +

+
+
+EntryNodes node,node, +
+
+

+ A list of identity fingerprints, nicknames, country codes and address + patterns of nodes to use for the first hop in normal circuits. These are + treated only as preferences unless StrictNodes (see below) is also set. +

+
+
+ExitNodes node,node, +
+
+

+ A list of identity fingerprints, nicknames, country codes and address + patterns of nodes to use for the last hop in normal exit circuits. These + are treated only as preferences unless StrictNodes (see below) is also set. +

+
+
+StrictNodes 0|1 +
+
+

+ If 1 and EntryNodes config option is set, Tor will never use any nodes + besides those listed in EntryNodes for the first hop of a normal circuit. + If 1 and ExitNodes config option is set, Tor will never use any nodes + besides those listed in ExitNodes for the last hop of a normal exit + circuit. Note that Tor might still use these nodes for non-exit circuits + such as one-hop directory fetches or hidden service support circuits. +

+
+
+FascistFirewall 0|1 +
+
+

+ If 1, Tor will only create outgoing connections to ORs running on ports + that your firewall allows (defaults to 80 and 443; see FirewallPorts). + This will allow you to run Tor as a client behind a firewall with + restrictive policies, but will not allow you to run as a server behind such + a firewall. If you prefer more fine-grained control, use + ReachableAddresses instead. +

+
+
+FirewallPorts PORTS +
+
+

+ A list of ports that your firewall allows you to connect to. Only used when + FascistFirewall is set. This option is deprecated; use ReachableAddresses + instead. (Default: 80, 443) +

+
+
+HidServAuth onion-address auth-cookie [service-name] +
+
+

+ Client authorization for a hidden service. Valid onion addresses contain 16 + characters in a-z2-7 plus ".onion", and valid auth cookies contain 22 + characters in A-Za-z0-9+/. The service name is only used for internal + purposes, e.g., for Tor controllers. This option may be used multiple times + for different hidden services. If a hidden service uses authorization and + this option is not set, the hidden service is not accessible. Hidden + services can be configured to require authorization using the + HiddenServiceAuthorizeClient option. +

+
+
+ReachableAddresses ADDR[/MASK][:PORT]… +
+
+

+ A comma-separated list of IP addresses and ports that your firewall allows + you to connect to. The format is as for the addresses in ExitPolicy, except + that "accept" is understood unless "reject" is explicitly provided. For + example, 'ReachableAddresses 99.0.0.0/8, reject 18.0.0.0/8:80, accept + *:80' means that your firewall allows connections to everything inside net + 99, rejects port 80 connections to net 18, and accepts connections to port + 80 otherwise. (Default: 'accept *:*'.) +

+
+
+ReachableDirAddresses ADDR[/MASK][:PORT]… +
+
+

+ Like ReachableAddresses, a list of addresses and ports. Tor will obey + these restrictions when fetching directory information, using standard HTTP + GET requests. If not set explicitly then the value of + ReachableAddresses is used. If HTTPProxy is set then these + connections will go through that proxy. +

+
+
+ReachableORAddresses ADDR[/MASK][:PORT]… +
+
+

+ Like ReachableAddresses, a list of addresses and ports. Tor will obey + these restrictions when connecting to Onion Routers, using TLS/SSL. If not + set explicitly then the value of ReachableAddresses is used. If + HTTPSProxy is set then these connections will go through that proxy. + + The separation between ReachableORAddresses and + ReachableDirAddresses is only interesting when you are connecting + through proxies (see HTTPProxy and HTTPSProxy). Most proxies limit + TLS connections (which Tor uses to connect to Onion Routers) to port 443, + and some limit HTTP GET requests (which Tor uses for fetching directory + information) to port 80. +

+
+
+LongLivedPorts PORTS +
+
+

+ A list of ports for services that tend to have long-running connections + (e.g. chat and interactive shells). Circuits for streams that use these + ports will contain only high-uptime nodes, to reduce the chance that a node + will go down before the stream is finished. (Default: 21, 22, 706, 1863, + 5050, 5190, 5222, 5223, 6667, 6697, 8300) +

+
+
+MapAddress address newaddress +
+
+

+ When a request for address arrives to Tor, it will rewrite it to newaddress + before processing it. For example, if you always want connections to + www.indymedia.org to exit via torserver (where torserver is the + nickname of the server), use "MapAddress www.indymedia.org + www.indymedia.org.torserver.exit". +

+
+
+NewCircuitPeriod NUM +
+
+

+ Every NUM seconds consider whether to build a new circuit. (Default: 30 + seconds) +

+
+
+MaxCircuitDirtiness NUM +
+
+

+ Feel free to reuse a circuit that was first used at most NUM seconds ago, + but never attach a new stream to a circuit that is too old. (Default: 10 + minutes) +

+
+
+NodeFamily node,node, +
+
+

+ The Tor servers, defined by their identity fingerprints or nicknames, + constitute a "family" of similar or co-administered servers, so never use + any two of them in the same circuit. Defining a NodeFamily is only needed + when a server doesn't list the family itself (with MyFamily). This option + can be used multiple times. +

+
+
+EnforceDistinctSubnets 0|1 +
+
+

+ If 1, Tor will not put two servers whose IP addresses are "too close" on + the same circuit. Currently, two addresses are "too close" if they lie in + the same /16 range. (Default: 1) +

+
+
+SocksPort PORT +
+
+

+ Advertise this port to listen for connections from Socks-speaking + applications. Set this to 0 if you don't want to allow application + connections. (Default: 9050) +

+
+
+SocksListenAddress IP[:PORT] +
+
+

+ Bind to this address to listen for connections from Socks-speaking + applications. (Default: 127.0.0.1) You can also specify a port (e.g. + 192.168.0.1:9100). This directive can be specified multiple times to bind + to multiple addresses/ports. +

+
+
+SocksPolicy policy,policy, +
+
+

+ Set an entrance policy for this server, to limit who can connect to the + SocksPort and DNSPort ports. The policies have the same form as exit + policies below. +

+
+
+SocksTimeout NUM +
+
+

+ Let a socks connection wait NUM seconds handshaking, and NUM seconds + unattached waiting for an appropriate circuit, before we fail it. (Default: + 2 minutes.) +

+
+
+TrackHostExits host,.domain, +
+
+

+ For each value in the comma separated list, Tor will track recent + connections to hosts that match this value and attempt to reuse the same + exit node for each. If the value is prepended with a '.', it is treated as + matching an entire domain. If one of the values is just a '.', it means + match everything. This option is useful if you frequently connect to sites + that will expire all your authentication cookies (i.e. log you out) if + your IP address changes. Note that this option does have the disadvantage + of making it more clear that a given history is associated with a single + user. However, most people who would wish to observe this will observe it + through cookies or other protocol-specific means anyhow. +

+
+
+TrackHostExitsExpire NUM +
+
+

+ Since exit servers go up and down, it is desirable to expire the + association between host and exit server after NUM seconds. The default is + 1800 seconds (30 minutes). +

+
+
+UpdateBridgesFromAuthority 0|1 +
+
+

+ When set (along with UseBridges), Tor will try to fetch bridge descriptors + from the configured bridge authorities when feasible. It will fall back to + a direct request if the authority responds with a 404. (Default: 0) +

+
+
+UseBridges 0|1 +
+
+

+ When set, Tor will fetch descriptors for each bridge listed in the "Bridge" + config lines, and use these relays as both entry guards and directory + guards. (Default: 0) +

+
+
+UseEntryGuards 0|1 +
+
+

+ If this option is set to 1, we pick a few long-term entry servers, and try + to stick with them. This is desirable because constantly changing servers + increases the odds that an adversary who owns some servers will observe a + fraction of your paths. (Defaults to 1.) +

+
+
+NumEntryGuards NUM +
+
+

+ If UseEntryGuards is set to 1, we will try to pick a total of NUM routers + as long-term entries for our circuits. (Defaults to 3.) +

+
+
+SafeSocks 0|1 +
+
+

+ When this option is enabled, Tor will reject application connections that + use unsafe variants of the socks protocol — ones that only provide an IP + address, meaning the application is doing a DNS resolve first. + Specifically, these are socks4 and socks5 when not doing remote DNS. + (Defaults to 0.) +

+
+
+TestSocks 0|1 +
+
+

+ When this option is enabled, Tor will make a notice-level log entry for + each connection to the Socks port indicating whether the request used a + safe socks protocol or an unsafe one (see above entry on SafeSocks). This + helps to determine whether an application using Tor is possibly leaking + DNS requests. (Default: 0) +

+
+
+WarnUnsafeSocks 0|1 +
+
+

+ When this option is enabled, Tor will warn whenever a request is + received that only contains an IP address instead of a hostname. Allowing + applications to do DNS resolves themselves is usually a bad idea and + can leak your location to attackers. (Default: 1) +

+
+
+VirtualAddrNetwork Address/bits +
+
+

+ When a controller asks for a virtual (unused) address with the MAPADDRESS + command, Tor picks an unassigned address from this range. (Default: + 127.192.0.0/10) + + When providing proxy server service to a network of computers using a tool + like dns-proxy-tor, change this address to "10.192.0.0/10" or + "172.16.0.0/12". The default VirtualAddrNetwork address range on a + properly configured machine will route to the loopback interface. For + local use, no change to the default VirtualAddrNetwork setting is needed. +

+
+
+AllowNonRFC953Hostnames 0|1 +
+
+

+ When this option is disabled, Tor blocks hostnames containing illegal + characters (like @ and :) rather than sending them to an exit node to be + resolved. This helps trap accidental attempts to resolve URLs and so on. + (Default: 0) +

+
+
+AllowDotExit 0|1 +
+
+

+ If enabled, we convert "www.google.com.foo.exit" addresses on the + SocksPort/TransPort/NatdPort into "www.google.com" addresses that exit from + the node "foo". Disabled by default since attacking websites and exit + relays can use it to manipulate your path selection. (Default: 0) +

+
+
+FastFirstHopPK 0|1 +
+
+

+ When this option is disabled, Tor uses the public key step for the first + hop of creating circuits. Skipping it is generally safe since we have + already used TLS to authenticate the relay and to establish forward-secure + keys. Turning this option off makes circuit building slower. + + Note that Tor will always use the public key step for the first hop if it's + operating as a relay, and it will never use the public key step if it + doesn't yet know the onion key of the first hop. (Default: 1) +

+
+
+TransPort PORT +
+
+

+ If non-zero, enables transparent proxy support on PORT (by convention, + 9040). Requires OS support for transparent proxies, such as BSDs' pf or + Linux's IPTables. If you're planning to use Tor as a transparent proxy for + a network, you'll want to examine and change VirtualAddrNetwork from the + default setting. You'll also want to set the TransListenAddress option for + the network you'd like to proxy. (Default: 0). +

+
+
+TransListenAddress IP[:PORT] +
+
+

+ Bind to this address to listen for transparent proxy connections. (Default: + 127.0.0.1). This is useful for exporting a transparent proxy server to an + entire network. +

+
+
+NATDPort PORT +
+
+

+ Allow old versions of ipfw (as included in old versions of FreeBSD, etc.) + to send connections through Tor using the NATD protocol. This option is + only for people who cannot use TransPort. +

+
+
+NATDListenAddress IP[:PORT] +
+
+

+ Bind to this address to listen for NATD connections. (Default: 127.0.0.1). +

+
+
+AutomapHostsOnResolve 0|1 +
+
+

+ When this option is enabled, and we get a request to resolve an address + that ends with one of the suffixes in AutomapHostsSuffixes, we map an + unused virtual address to that address, and return the new virtual address. + This is handy for making ".onion" addresses work with applications that + resolve an address and then connect to it. (Default: 0). +

+
+
+AutomapHostsSuffixes SUFFIX,SUFFIX, +
+
+

+ A comma-separated list of suffixes to use with AutomapHostsOnResolve. + The "." suffix is equivalent to "all addresses." (Default: .exit,.onion). +

+
+
+DNSPort PORT +
+
+

+ If non-zero, Tor listens for UDP DNS requests on this port and resolves + them anonymously. (Default: 0). +

+
+
+DNSListenAddress IP[:PORT] +
+
+

+ Bind to this address to listen for DNS connections. (Default: 127.0.0.1). +

+
+
+ClientDNSRejectInternalAddresses 0|1 +
+
+

+ If true, Tor does not believe any anonymously retrieved DNS answer that + tells it that an address resolves to an internal address (like 127.0.0.1 or + 192.168.0.1). This option prevents certain browser-based attacks; don't + turn it off unless you know what you're doing. (Default: 1). +

+
+
+DownloadExtraInfo 0|1 +
+
+

+ If true, Tor downloads and caches "extra-info" documents. These documents + contain information about servers other than the information in their + regular router descriptors. Tor does not use this information for anything + itself; to save bandwidth, leave this option turned off. (Default: 0). +

+
+
+FallbackNetworkstatusFile FILENAME +
+
+

+ If Tor doesn't have a cached networkstatus file, it starts out using this + one instead. Even if this file is out of date, Tor can still use it to + learn about directory mirrors, so it doesn't need to put load on the + authorities. (Default: None). +

+
+
+WarnPlaintextPorts port,port, +
+
+

+ Tells Tor to issue a warnings whenever the user tries to make an anonymous + connection to one of these ports. This option is designed to alert users + to services that risk sending passwords in the clear. (Default: + 23,109,110,143). +

+
+
+RejectPlaintextPorts port,port, +
+
+

+ Like WarnPlaintextPorts, but instead of warning about risky port uses, Tor + will instead refuse to make the connection. (Default: None). +

+
+
+
+

SERVER OPTIONS

+
+

The following options are useful only for servers (that is, if ORPort +is non-zero):

+
+
+Address address +
+
+

+ The IP address or fully qualified domain name of this server (e.g. + moria.mit.edu). You can leave this unset, and Tor will guess your IP + address. This IP address is the one used to tell clients and other + servers where to find your Tor server; it doesn't affect the IP that your + Tor client binds to. To bind to a different address, use the + *ListenAddress and OutboundBindAddress options. +

+
+
+AllowSingleHopExits 0|1 +
+
+

+ This option controls whether clients can use this server as a single hop + proxy. If set to 1, clients can use this server as an exit even if it is + the only hop in the circuit. (Default: 0) +

+
+
+AssumeReachable 0|1 +
+
+

+ This option is used when bootstrapping a new Tor network. If set to 1, + don't do self-reachability testing; just upload your server descriptor + immediately. If AuthoritativeDirectory is also set, this option + instructs the dirserver to bypass remote reachability testing too and list + all connected servers as running. +

+
+
+BridgeRelay 0|1 +
+
+

+ Sets the relay to act as a "bridge" with respect to relaying connections + from bridge users to the Tor network. Mainly it influences how the relay + will cache and serve directory information. Usually used in combination + with PublishServerDescriptor. +

+
+
+ContactInfo email_address +
+
+

+ Administrative contact information for server. This line might get picked + up by spam harvesters, so you may want to obscure the fact that it's an + email address. +

+
+
+ExitPolicy policy,policy, +
+
+

+ Set an exit policy for this server. Each policy is of the form + "accept|reject ADDR[/MASK][:PORT]". If /MASK is + omitted then this policy just applies to the host given. Instead of giving + a host or network you can also use "*" to denote the universe (0.0.0.0/0). + PORT can be a single port number, an interval of ports + "FROM_PORT-TO_PORT", or "*". If PORT is omitted, that means + "*". + + For example, "accept 18.7.22.69:*,reject 18.0.0.0/8:*,accept *:*" would + reject any traffic destined for MIT except for web.mit.edu, and accept + anything else. + + To specify all internal and link-local networks (including 0.0.0.0/8, + 169.254.0.0/16, 127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, and + 172.16.0.0/12), you can use the "private" alias instead of an address. + These addresses are rejected by default (at the beginning of your exit + policy), along with your public IP address, unless you set the + ExitPolicyRejectPrivate config option to 0. For example, once you've done + that, you could allow HTTP to 127.0.0.1 and block all other connections to + internal networks with "accept 127.0.0.1:80,reject private:*", though that + may also allow connections to your own computer that are addressed to its + public (external) IP address. See RFC 1918 and RFC 3330 for more details + about internal and reserved IP address space. + + This directive can be specified multiple times so you don't have to put it + all on one line. + + Policies are considered first to last, and the first match wins. If you + want to _replace_ the default exit policy, end your exit policy with + either a reject *:* or an accept *:*. Otherwise, you're _augmenting_ + (prepending to) the default exit policy. The default exit policy is:
+

+
+
+
reject *:25
+reject *:119
+reject *:135-139
+reject *:445
+reject *:563
+reject *:1214
+reject *:4661-4666
+reject *:6346-6429
+reject *:6699
+reject *:6881-6999
+accept *:*
+
+
+
+ExitPolicyRejectPrivate 0|1 +
+
+

+ Reject all private (local) networks, along with your own public IP address, + at the beginning of your exit policy. See above entry on ExitPolicy. + (Default: 1) +

+
+
+MaxOnionsPending NUM +
+
+

+ If you have more than this number of onionskins queued for decrypt, reject + new ones. (Default: 100) +

+
+
+MyFamily node,node, +
+
+

+ Declare that this Tor server is controlled or administered by a group or + organization identical or similar to that of the other servers, defined by + their identity fingerprints or nicknames. When two servers both declare + that they are in the same 'family', Tor clients will not use them in the + same circuit. (Each server only needs to list the other servers in its + family; it doesn't need to list itself, but it won't hurt.) +

+
+
+Nickname name +
+
+

+ Set the server's nickname to 'name'. Nicknames must be between 1 and 19 + characters inclusive, and must contain only the characters [a-zA-Z0-9]. +

+
+
+NumCPUs num +
+
+

+ How many processes to use at once for decrypting onionskins. (Default: 1) +

+
+
+ORPort PORT +
+
+

+ Advertise this port to listen for connections from Tor clients and servers. +

+
+
+ORListenAddress IP[:PORT] +
+
+

+ Bind to this IP address to listen for connections from Tor clients and + servers. If you specify a port, bind to this port rather than the one + specified in ORPort. (Default: 0.0.0.0) This directive can be specified + multiple times to bind to multiple addresses/ports. +

+
+
+PublishServerDescriptor 0|1|v1|v2|v3|bridge|hidserv, +
+
+

+ This option is only considered if you have an ORPort defined. You can + choose multiple arguments, separated by commas. +
+ If set to 0, Tor will act as a server but it will not publish its + descriptor to the directory authorities. (This is useful if you're testing + out your server, or if you're using a Tor controller that handles directory + publishing for you.) Otherwise, Tor will publish its descriptor to all + directory authorities of the type(s) specified. The value "1" is the + default, which means "publish to the appropriate authorities". +

+
+
+ShutdownWaitLength NUM +
+
+

+ When we get a SIGINT and we're a server, we begin shutting down: + we close listeners and start refusing new circuits. After NUM + seconds, we exit. If we get a second SIGINT, we exit immedi- + ately. (Default: 30 seconds) +

+
+
+AccountingMax N bytes|KB|MB|GB|TB +
+
+

+ Never send more than the specified number of bytes in a given accounting + period, or receive more than that number in the period. For example, with + AccountingMax set to 1 GB, a server could send 900 MB and receive 800 MB + and continue running. It will only hibernate once one of the two reaches 1 + GB. When the number of bytes is exhausted, Tor will hibernate until some + time in the next accounting period. To prevent all servers from waking at + the same time, Tor will also wait until a random point in each period + before waking up. If you have bandwidth cost issues, enabling hibernation + is preferable to setting a low bandwidth, since it provides users with a + collection of fast servers that are up some of the time, which is more + useful than a set of slow servers that are always "available". +

+
+
+AccountingStart day|week|month [day] HH:MM +
+
+

+ Specify how long accounting periods last. If month is given, each + accounting period runs from the time HH:MM on the dayth day of one + month to the same day and time of the next. (The day must be between 1 and + 28.) If week is given, each accounting period runs from the time HH:MM + of the dayth day of one week to the same day and time of the next week, + with Monday as day 1 and Sunday as day 7. If day is given, each + accounting period runs from the time HH:MM each day to the same time on + the next day. All times are local, and given in 24-hour time. (Defaults to + "month 1 0:00".) +

+
+
+ServerDNSResolvConfFile filename +
+
+

+ Overrides the default DNS configuration with the configuration in + filename. The file format is the same as the standard Unix + "resolv.conf" file (7). This option, like all other ServerDNS options, + only affects name lookups that your server does on behalf of clients. + (Defaults to use the system DNS configuration.) +

+
+
+ServerDNSAllowBrokenConfig 0|1 +
+
+

+ If this option is false, Tor exits immediately if there are problems + parsing the system DNS configuration or connecting to nameservers. + Otherwise, Tor continues to periodically retry the system nameservers until + it eventually succeeds. (Defaults to "1".) +

+
+
+ServerDNSSearchDomains 0|1 +
+
+

+ If set to 1, then we will search for addresses in the local search domain. + For example, if this system is configured to believe it is in + "example.com", and a client tries to connect to "www", the client will be + connected to "www.example.com". This option only affects name lookups that + your server does on behalf of clients. (Defaults to "0".) +

+
+
+ServerDNSDetectHijacking 0|1 +
+
+

+ When this option is set to 1, we will test periodically to determine + whether our local nameservers have been configured to hijack failing DNS + requests (usually to an advertising site). If they are, we will attempt to + correct this. This option only affects name lookups that your server does + on behalf of clients. (Defaults to "1".) +

+
+
+ServerDNSTestAddresses address,address, +
+
+

+ When we're detecting DNS hijacking, make sure that these valid addresses + aren't getting redirected. If they are, then our DNS is completely useless, + and we'll reset our exit policy to "reject :". This option only affects + name lookups that your server does on behalf of clients. (Defaults to + "www.google.com, www.mit.edu, www.yahoo.com, www.slashdot.org".) +

+
+
+ServerDNSAllowNonRFC953Hostnames 0|1 +
+
+

+ When this option is disabled, Tor does not try to resolve hostnames + containing illegal characters (like @ and :) rather than sending them to an + exit node to be resolved. This helps trap accidental attempts to resolve + URLs and so on. This option only affects name lookups that your server does + on behalf of clients. (Default: 0) +

+
+
+BridgeRecordUsageByCountry 0|1 +
+
+

+ When this option is enabled and BridgeRelay is also enabled, and we have + GeoIP data, Tor keeps a keep a per-country count of how many client + addresses have contacted it so that it can help the bridge authority guess + which countries have blocked access to it. (Default: 1) +

+
+
+ServerDNSRandomizeCase 0|1 +
+
+

+ When this option is set, Tor sets the case of each character randomly in + outgoing DNS requests, and makes sure that the case matches in DNS replies. + This so-called "0x20 hack" helps resist some types of DNS poisoning attack. + For more information, see "Increased DNS Forgery Resistance through + 0x20-Bit Encoding". This option only affects name lookups that your server + does on behalf of clients. (Default: 1) +

+
+
+GeoIPFile filename +
+
+

+ A filename containing GeoIP data, for use with BridgeRecordUsageByCountry. +

+
+
+CellStatistics 0|1 +
+
+

+ When this option is enabled, Tor writes statistics on the mean time that + cells spend in circuit queues to disk every 24 hours. (Default: 0) +

+
+
+DirReqStatistics 0|1 +
+
+

+ When this option is enabled, Tor writes statistics on the number and + response time of network status requests to disk every 24 hours. + (Default: 0) +

+
+
+EntryStatistics 0|1 +
+
+

+ When this option is enabled, Tor writes statistics on the number of + directly connecting clients to disk every 24 hours. (Default: 0) +

+
+
+ExitPortStatistics 0|1 +
+
+

+ When this option is enabled, Tor writes statistics on the number of relayed + bytes and opened stream per exit port to disk every 24 hours. (Default: 0) +

+
+
+ExtraInfoStatistics 0|1 +
+
+

+ When this option is enabled, Tor includes previously gathered statistics in + its extra-info documents that it uploads to the directory authorities. + (Default: 0) +

+
+
+
+

DIRECTORY SERVER OPTIONS

+
+

The following options are useful only for directory servers (that is, +if DirPort is non-zero):

+
+
+AuthoritativeDirectory 0|1 +
+
+

+ When this option is set to 1, Tor operates as an authoritative directory + server. Instead of caching the directory, it generates its own list of + good servers, signs it, and sends that to the clients. Unless the clients + already have you listed as a trusted directory, you probably do not want + to set this option. Please coordinate with the other admins at + tor-ops@torproject.org if you think you should be a directory. +

+
+
+DirPortFrontPage FILENAME +
+
+

+ When this option is set, it takes an HTML file and publishes it as "/" on + the DirPort. Now relay operators can provide a disclaimer without needing + to set up a separate webserver. There's a sample disclaimer in + contrib/tor-exit-notice.html. +

+
+
+V1AuthoritativeDirectory 0|1 +
+
+

+ When this option is set in addition to AuthoritativeDirectory, Tor + generates version 1 directory and running-routers documents (for legacy + Tor clients up to 0.1.0.x). +

+
+
+V2AuthoritativeDirectory 0|1 +
+
+

+ When this option is set in addition to AuthoritativeDirectory, Tor + generates version 2 network statuses and serves descriptors, etc as + described in doc/spec/dir-spec-v2.txt (for Tor clients and servers running + 0.1.1.x and 0.1.2.x). +

+
+
+V3AuthoritativeDirectory 0|1 +
+
+

+ When this option is set in addition to AuthoritativeDirectory, Tor + generates version 3 network statuses and serves descriptors, etc as + described in doc/spec/dir-spec.txt (for Tor clients and servers running at + least 0.2.0.x). +

+
+
+VersioningAuthoritativeDirectory 0|1 +
+
+

+ When this option is set to 1, Tor adds information on which versions of + Tor are still believed safe for use to the published directory. Each + version 1 authority is automatically a versioning authority; version 2 + authorities provide this service optionally. See RecommendedVersions, + RecommendedClientVersions, and RecommendedServerVersions. +

+
+
+NamingAuthoritativeDirectory 0|1 +
+
+

+ When this option is set to 1, then the server advertises that it has + opinions about nickname-to-fingerprint bindings. It will include these + opinions in its published network-status pages, by listing servers with + the flag "Named" if a correct binding between that nickname and fingerprint + has been registered with the dirserver. Naming dirservers will refuse to + accept or publish descriptors that contradict a registered binding. See + approved-routers in the FILES section below. +

+
+
+HSAuthoritativeDir 0|1 +
+
+

+ When this option is set in addition to AuthoritativeDirectory, Tor also + accepts and serves hidden service descriptors. (Default: 0) +

+
+
+HidServDirectoryV2 0|1 +
+
+

+ When this option is set, Tor accepts and serves v2 hidden service + descriptors. Setting DirPort is not required for this, because clients + connect via the ORPort by default. (Default: 1) +

+
+
+BridgeAuthoritativeDir 0|1 +
+
+

+ When this option is set in addition to AuthoritativeDirectory, Tor + accepts and serves router descriptors, but it caches and serves the main + networkstatus documents rather than generating its own. (Default: 0) +

+
+
+MinUptimeHidServDirectoryV2 N seconds|minutes|hours|days|weeks +
+
+

+ Minimum uptime of a v2 hidden service directory to be accepted as such by + authoritative directories. (Default: 24 hours) +

+
+
+DirPort PORT +
+
+

+ Advertise the directory service on this port. +

+
+
+DirListenAddress IP[:PORT] +
+
+

+ Bind the directory service to this address. If you specify a port, bind to + this port rather than the one specified in DirPort. (Default: 0.0.0.0) + This directive can be specified multiple times to bind to multiple + addresses/ports. +

+
+
+DirPolicy policy,policy, +
+
+

+ Set an entrance policy for this server, to limit who can connect to the + directory ports. The policies have the same form as exit policies above. +

+
+
+
+

DIRECTORY AUTHORITY SERVER OPTIONS

+
+
+
+RecommendedVersions STRING +
+
+

+ STRING is a comma-separated list of Tor versions currently believed to be + safe. The list is included in each directory, and nodes which pull down the + directory learn whether they need to upgrade. This option can appear + multiple times: the values from multiple lines are spliced together. When + this is set then VersioningAuthoritativeDirectory should be set too. +

+
+
+RecommendedClientVersions STRING +
+
+

+ STRING is a comma-separated list of Tor versions currently believed to be + safe for clients to use. This information is included in version 2 + directories. If this is not set then the value of RecommendedVersions + is used. When this is set then VersioningAuthoritativeDirectory should + be set too. +

+
+
+RecommendedServerVersions STRING +
+
+

+ STRING is a comma-separated list of Tor versions currently believed to be + safe for servers to use. This information is included in version 2 + directories. If this is not set then the value of RecommendedVersions + is used. When this is set then VersioningAuthoritativeDirectory should + be set too. +

+
+
+ConsensusParams STRING +
+
+

+ STRING is a space-separated list of key=value pairs that Tor will include + in the "params" line of its networkstatus vote. +

+
+
+DirAllowPrivateAddresses 0|1 +
+
+

+ If set to 1, Tor will accept router descriptors with arbitrary "Address" + elements. Otherwise, if the address is not an IP address or is a private IP + address, it will reject the router descriptor. Defaults to 0. +

+
+
+AuthDirBadDir AddressPattern… +
+
+

+ Authoritative directories only. A set of address patterns for servers that + will be listed as bad directories in any network status document this + authority publishes, if AuthDirListBadDirs is set. +

+
+
+AuthDirBadExit AddressPattern… +
+
+

+ Authoritative directories only. A set of address patterns for servers that + will be listed as bad exits in any network status document this authority + publishes, if AuthDirListBadExits is set. +

+
+
+AuthDirInvalid AddressPattern… +
+
+

+ Authoritative directories only. A set of address patterns for servers that + will never be listed as "valid" in any network status document that this + authority publishes. +

+
+
+AuthDirReject AddressPattern… +
+
+

+ Authoritative directories only. A set of address patterns for servers that + will never be listed at all in any network status document that this + authority publishes, or accepted as an OR address in any descriptor + submitted for publication by this authority. +

+
+
+AuthDirListBadDirs 0|1 +
+
+

+ Authoritative directories only. If set to 1, this directory has some + opinion about which nodes are unsuitable as directory caches. (Do not set + this to 1 unless you plan to list non-functioning directories as bad; + otherwise, you are effectively voting in favor of every declared + directory.) +

+
+
+AuthDirListBadExits 0|1 +
+
+

+ Authoritative directories only. If set to 1, this directory has some + opinion about which nodes are unsuitable as exit nodes. (Do not set this to + 1 unless you plan to list non-functioning exits as bad; otherwise, you are + effectively voting in favor of every declared exit as an exit.) +

+
+
+AuthDirRejectUnlisted 0|1 +
+
+

+ Authoritative directories only. If set to 1, the directory server rejects + all uploaded server descriptors that aren't explicitly listed in the + fingerprints file. This acts as a "panic button" if we get hit with a Sybil + attack. (Default: 0) +

+
+
+AuthDirMaxServersPerAddr NUM +
+
+

+ Authoritative directories only. The maximum number of servers that we will + list as acceptable on a single IP address. Set this to "0" for "no limit". + (Default: 2) +

+
+
+AuthDirMaxServersPerAuthAddr NUM +
+
+

+ Authoritative directories only. Like AuthDirMaxServersPerAddr, but applies + to addresses shared with directory authorities. (Default: 5) +

+
+
+V3AuthVotingInterval N minutes|hours +
+
+

+ V3 authoritative directories only. Configures the server's preferred voting + interval. Note that voting will actually happen at an interval chosen + by consensus from all the authorities' preferred intervals. This time + SHOULD divide evenly into a day. (Default: 1 hour) +

+
+
+V3AuthVoteDelay N minutes|hours +
+
+

+ V3 authoritative directories only. Configures the server's preferred delay + between publishing its vote and assuming it has all the votes from all the + other authorities. Note that the actual time used is not the server's + preferred time, but the consensus of all preferences. (Default: 5 minutes.) +

+
+
+V3AuthDistDelay N minutes|hours +
+
+

+ V3 authoritative directories only. Configures the server's preferred delay + between publishing its consensus and signature and assuming it has all the + signatures from all the other authorities. Note that the actual time used + is not the server's preferred time, but the consensus of all preferences. + (Default: 5 minutes.) +

+
+
+V3AuthNIntervalsValid NUM +
+
+

+ V3 authoritative directories only. Configures the number of VotingIntervals + for which each consensus should be valid for. Choosing high numbers + increases network partitioning risks; choosing low numbers increases + directory traffic. Note that the actual number of intervals used is not the + server's preferred number, but the consensus of all preferences. Must be at + least 2. (Default: 3.) +

+
+
+
+

HIDDEN SERVICE OPTIONS

+
+

The following options are used to configure a hidden service.

+
+
+HiddenServiceDir DIRECTORY +
+
+

+ Store data files for a hidden service in DIRECTORY. Every hidden service + must have a separate directory. You may use this option multiple times to + specify multiple services. +

+
+
+HiddenServicePort VIRTPORT [TARGET] +
+
+

+ Configure a virtual port VIRTPORT for a hidden service. You may use this + option multiple times; each time applies to the service using the most + recent hiddenservicedir. By default, this option maps the virtual port to + the same port on 127.0.0.1. You may override the target port, address, or + both by specifying a target of addr, port, or addr:port. You may also have + multiple lines with the same VIRTPORT: when a user connects to that + VIRTPORT, one of the TARGETs from those lines will be chosen at random. +

+
+
+PublishHidServDescriptors 0|1 +
+
+

+ If set to 0, Tor will run any hidden services you configure, but it won't + advertise them to the rendezvous directory. This option is only useful if + you're using a Tor controller that handles hidserv publishing for you. + (Default: 1) +

+
+
+HiddenServiceVersion version,version, +
+
+

+ A list of rendezvous service descriptor versions to publish for the hidden + service. Currently, only version 2 is supported. (Default: 2) +

+
+
+HiddenServiceAuthorizeClient auth-type client-name,client-name, +
+
+

+ If configured, the hidden service is accessible for authorized clients + only. The auth-type can either be 'basic' for a general-purpose + authorization protocol or 'stealth' for a less scalable protocol that also + hides service activity from unauthorized clients. Only clients that are + listed here are authorized to access the hidden service. Valid client names + are 1 to 19 characters long and only use characters in A-Za-z0-9+-_ (no + spaces). If this option is set, the hidden service is not accessible for + clients without authorization any more. Generated authorization data can be + found in the hostname file. Clients need to put this authorization data in + their configuration file using HidServAuth. +

+
+
+RendPostPeriod N seconds|minutes|hours|days|weeks +
+
+

+ Every time the specified period elapses, Tor uploads any rendezvous + service descriptors to the directory servers. This information is also + uploaded whenever it changes. (Default: 20 minutes) +

+
+
+
+

TESTING NETWORK OPTIONS

+
+

The following options are used for running a testing Tor network.

+
+
+TestingTorNetwork 0|1 +
+
+

+ If set to 1, Tor adjusts default values of the configuration options below, + so that it is easier to set up a testing Tor network. May only be set if + non-default set of DirServers is set. Cannot be unset while Tor is running. + (Default: 0)
+

+
+
+
ServerDNSAllowBrokenConfig 1
+DirAllowPrivateAddresses 1
+EnforceDistinctSubnets 0
+AssumeReachable 1
+AuthDirMaxServersPerAddr 0
+AuthDirMaxServersPerAuthAddr 0
+ClientDNSRejectInternalAddresses 0
+ExitPolicyRejectPrivate 0
+V3AuthVotingInterval 5 minutes
+V3AuthVoteDelay 20 seconds
+V3AuthDistDelay 20 seconds
+TestingV3AuthInitialVotingInterval 5 minutes
+TestingV3AuthInitialVoteDelay 20 seconds
+TestingV3AuthInitialDistDelay 20 seconds
+TestingAuthDirTimeToLearnReachability 0 minutes
+TestingEstimatedDescriptorPropagationTime 0 minutes
+
+
+
+TestingV3AuthInitialVotingInterval N minutes|hours +
+
+

+ Like V3AuthVotingInterval, but for initial voting interval before the first + consensus has been created. Changing this requires that + TestingTorNetwork is set. (Default: 30 minutes) +

+
+
+TestingV3AuthInitialVoteDelay N minutes|hours +
+
+

+ Like TestingV3AuthInitialVoteDelay, but for initial voting interval before + the first consensus has been created. Changing this requires that + TestingTorNetwork is set. (Default: 5 minutes) +

+
+
+TestingV3AuthInitialDistDelay N minutes|hours +
+
+

+ Like TestingV3AuthInitialDistDelay, but for initial voting interval before + the first consensus has been created. Changing this requires that + TestingTorNetwork is set. (Default: 5 minutes) +

+
+
+TestingAuthDirTimeToLearnReachability N minutes|hours +
+
+

+ After starting as an authority, do not make claims about whether routers + are Running until this much time has passed. Changing this requires + that TestingTorNetwork is set. (Default: 30 minutes) +

+
+
+TestingEstimatedDescriptorPropagationTime N minutes|hours +
+
+

+ Clients try downloading router descriptors from directory caches after this + time. Changing this requires that TestingTorNetwork is set. (Default: + 10 minutes) +

+
+
+
+

SIGNALS

+
+

Tor catches the following signals:

+
+
+SIGTERM +
+
+

+ Tor will catch this, clean up and sync to disk if necessary, and exit. +

+
+
+SIGINT +
+
+

+ Tor clients behave as with SIGTERM; but Tor servers will do a controlled + slow shutdown, closing listeners and waiting 30 seconds before exiting. + (The delay can be configured with the ShutdownWaitLength config option.) +

+
+
+SIGHUP +
+
+

+ The signal instructs Tor to reload its configuration (including closing and + reopening logs), and kill and restart its helper processes if applicable. +

+
+
+SIGUSR1 +
+
+

+ Log statistics about current connections, past connections, and throughput. +

+
+
+SIGUSR2 +
+
+

+ Switch all logs to loglevel debug. You can go back to the old loglevels by + sending a SIGHUP. +

+
+
+SIGCHLD +
+
+

+ Tor receives this signal when one of its helper processes has exited, so it + can clean up. +

+
+
+SIGPIPE +
+
+

+ Tor catches this signal and ignores it. +

+
+
+SIGXFSZ +
+
+

+ If this signal exists on your platform, Tor catches and ignores it. +

+
+
+
+

FILES

+
+
+
+@CONFDIR@/torrc +
+
+

+ The configuration file, which contains "option value" pairs. +

+
+
+@LOCALSTATEDIR@/lib/tor/ +
+
+

+ The tor process stores keys and other data here. +

+
+
+DataDirectory/cached-status/ +
+
+

+ The most recently downloaded network status document for each authority. + Each file holds one such document; the filenames are the hexadecimal + identity key fingerprints of the directory authorities. +

+
+
+DataDirectory/cached-descriptors and cached-descriptors.new +
+
+

+ These files hold downloaded router statuses. Some routers may appear more + than once; if so, the most recently published descriptor is used. Lines + beginning with @-signs are annotations that contain more information about + a given router. The ".new" file is an append-only journal; when it gets + too large, all entries are merged into a new cached-descriptors file. +

+
+
+DataDirectory/cached-routers and cached-routers.new +
+
+

+ Obsolete versions of cached-descriptors and cached-descriptors.new. When + Tor can't find the newer files, it looks here instead. +

+
+
+DataDirectory/state +
+
+

+ A set of persistent key-value mappings. These are documented in + the file. These include: +

+
    +
  • +

    +The current entry guards and their status. +

    +
  • +
  • +

    +The current bandwidth accounting values (unused so far; see + below). +

    +
  • +
  • +

    +When the file was last written +

    +
  • +
  • +

    +What version of Tor generated the state file +

    +
  • +
  • +

    +A short history of bandwidth usage, as produced in the router + descriptors. +

    +
  • +
+
+
+DataDirectory/bw_accounting +
+
+

+ Used to track bandwidth accounting values (when the current period starts + and ends; how much has been read and written so far this period). This file + is obsolete, and the data is now stored in the 'state' file as well. Only + used when bandwidth accounting is enabled. +

+
+
+DataDirectory/control_auth_cookie +
+
+

+ Used for cookie authentication with the controller. Location can be + overridden by the CookieAuthFile config option. Regenerated on startup. See + control-spec.txt for details. Only used when cookie authentication is + enabled. +

+
+
+DataDirectory/keys/* +
+
+

+ Only used by servers. Holds identity keys and onion keys. +

+
+
+DataDirectory/fingerprint +
+
+

+ Only used by servers. Holds the fingerprint of the server's identity key. +

+
+
+DataDirectory/approved-routers +
+
+

+ Only for naming authoritative directory servers (see + NamingAuthoritativeDirectory). This file lists nickname to identity + bindings. Each line lists a nickname and a fingerprint separated by + whitespace. See your fingerprint file in the DataDirectory for an + example line. If the nickname is !reject then descriptors from the + given identity (fingerprint) are rejected by this server. If it is + !invalid then descriptors are accepted but marked in the directory as + not valid, that is, not recommended. +

+
+
+DataDirectory/router-stability +
+
+

+ Only used by authoritative directory servers. Tracks measurements for + router mean-time-between-failures so that authorities have a good idea of + how to set their Stable flags. +

+
+
+HiddenServiceDirectory/hostname +
+
+

+ The <base32-encoded-fingerprint>.onion domain name for this hidden service. + If the hidden service is restricted to authorized clients only, this file + also contains authorization data for all clients. +

+
+
+HiddenServiceDirectory/private_key +
+
+

+ The private key for this hidden service. +

+
+
+HiddenServiceDirectory/client_keys +
+
+

+ Authorization data for a hidden service that is only accessible by + authorized clients. +

+
+
+
+

SEE ALSO

+
+

privoxy(1), tsocks(1), torify(1)

+

https://www.torproject.org/

+
+

BUGS

+
+

Plenty, probably. Tor is still in development. Please report them.

+
+

AUTHORS

+
+

Roger Dingledine [arma at mit.edu], Nick Mathewson [nickm at alum.mit.edu].

+
+ + + diff -Nru tor-0.2.0.34/doc/torify.1.in tor-0.2.2.16-alpha/doc/torify.1.in --- tor-0.2.0.34/doc/torify.1.in 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/torify.1.in 2010-02-22 20:57:32.000000000 +0000 @@ -0,0 +1,36 @@ +.\" Title: torify +.\" Author: +.\" Generator: DocBook XSL Stylesheets v1.73.2 +.\" Date: 02/22/2010 +.\" Manual: +.\" Source: +.\" +.TH "TORIFY" "1" "02/22/2010" "" "" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "NAME" +torify \- wrapper for torsocks or tsocks and tor +.SH "SYNOPSIS" +\fBtorify\fR \fIapplication\fR [\fIapplication\'s\fR \fIarguments\fR] +.sp +.SH "DESCRIPTION" +\fBtorify\fR is a simple wrapper that attempts to find the best underlying Tor wrapper available on a system\&. It calls torsocks or tsocks with a tor specific configuration file\&. +.sp +torsocks is an improved wrapper that explictly rejects UDP, safely resolves DNS lookups and properly socksifies your TCP connections\&. +.sp +tsocks itself is a wrapper between the tsocks library and the application that you would like to run socksified\&. +.sp +Please note that since both method use LD_PRELOAD, torify cannot be applied to suid binaries\&. +.sp +.SH "WARNING" +You should also be aware that the way tsocks currently works only TCP connections are socksified\&. Be aware that this will in most circumstances not include hostname lookups which would still be routed through your normal system resolver to your usual resolving nameservers\&. The \fBtor\-resolve\fR(1) tool can be useful as a workaround in some cases\&. The Tor FAQ at https://wiki\&.torproject\&.org/noreply/TheOnionRouter/TorFAQ might have further information on this subject\&. +.sp +When used with torsocks, torify should not leak DNS requests or UDP data\&. +.sp +Both will leak ICMP data\&. +.sp +.SH "SEE ALSO" +\fBtor\fR(1), \fBtor\-resolve\fR(1), \fBtorsocks\fR(1), \fBtsocks\fR(1), \fBtsocks\&.conf\fR(5)\&. +.sp diff -Nru tor-0.2.0.34/doc/torify.1.txt tor-0.2.2.16-alpha/doc/torify.1.txt --- tor-0.2.0.34/doc/torify.1.txt 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/torify.1.txt 2010-02-02 21:40:22.000000000 +0000 @@ -0,0 +1,50 @@ +// Copyright (c) The Tor Project, Inc. +// See LICENSE for licensing information +// This is an asciidoc file used to generate the manpage/html reference. +// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html +torify(1) +========= +Peter Palfrader +Jacob Appelbaum + +NAME +---- +torify - wrapper for torsocks or tsocks and tor + +SYNOPSIS +-------- +**torify** __application__ [__application's__ __arguments__] + +DESCRIPTION +----------- +**torify** is a simple wrapper that attempts to find the best underlying Tor +wrapper available on a system. It calls torsocks or tsocks with a tor specific +configuration file. + + +torsocks is an improved wrapper that explictly rejects UDP, safely resolves DNS +lookups and properly socksifies your TCP connections. + + +tsocks itself is a wrapper between the tsocks library and the application that +you would like to run socksified. + + +Please note that since both method use LD_PRELOAD, torify cannot be applied to +suid binaries. + +WARNING +------- +You should also be aware that the way tsocks currently works only TCP +connections are socksified. Be aware that this will in most circumstances not +include hostname lookups which would still be routed through your normal system +resolver to your usual resolving nameservers. The **tor-resolve**(1) tool can be +useful as a workaround in some cases. The Tor FAQ at +https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ might have further +information on this subject. + + +When used with torsocks, torify should not leak DNS requests or UDP data. + + +Both will leak ICMP data. + +SEE ALSO +-------- +**tor**(1), **tor-resolve**(1), **torsocks**(1), **tsocks**(1), +**tsocks.conf**(5). diff -Nru tor-0.2.0.34/doc/torify.html.in tor-0.2.2.16-alpha/doc/torify.html.in --- tor-0.2.0.34/doc/torify.html.in 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/torify.html.in 2010-02-22 20:57:40.000000000 +0000 @@ -0,0 +1,413 @@ + + + + + + +torify(1) + + + +

SYNOPSIS

+
+

torify application [application's arguments]

+
+

DESCRIPTION

+
+

torify is a simple wrapper that attempts to find the best underlying Tor +wrapper available on a system. It calls torsocks or tsocks with a tor specific +configuration file.

+

torsocks is an improved wrapper that explictly rejects UDP, safely resolves DNS +lookups and properly socksifies your TCP connections.

+

tsocks itself is a wrapper between the tsocks library and the application that +you would like to run socksified.

+

Please note that since both method use LD_PRELOAD, torify cannot be applied to +suid binaries.

+
+

WARNING

+
+

You should also be aware that the way tsocks currently works only TCP +connections are socksified. Be aware that this will in most circumstances not +include hostname lookups which would still be routed through your normal system +resolver to your usual resolving nameservers. The tor-resolve(1) tool can be +useful as a workaround in some cases. The Tor FAQ at +https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ might have further +information on this subject.

+

When used with torsocks, torify should not leak DNS requests or UDP data.

+

Both will leak ICMP data.

+
+

SEE ALSO

+
+

tor(1), tor-resolve(1), torsocks(1), tsocks(1), +tsocks.conf(5).

+
+ + + diff -Nru tor-0.2.0.34/doc/tor-osx-dmg-creation.txt tor-0.2.2.16-alpha/doc/tor-osx-dmg-creation.txt --- tor-0.2.0.34/doc/tor-osx-dmg-creation.txt 2008-09-01 21:42:22.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-osx-dmg-creation.txt 2010-02-22 20:12:02.000000000 +0000 @@ -1,94 +1,175 @@ ## Instructions for building the official dmgs for OSX. ## +## The loose table of contents: +## Single Architecture Binaries for PowerPc or i386 architecture, not both. +## Backwards compatible single-architecture binaries for OSX i386 10.4 from +## newer versions of OS X. +## Universal Binaries for OSX PPC and i386 +## Each section is delineated by ###. + +####################################### +# +# Section 1 +# +# Single Architecture Binaries for PPC or i386, not both. +# This method works in all versions of OSX 10.3 through 10.6 +####################################### -The following steps are the exact steps used to produce the "official" -OSX builds of tor. +## Compiling libevent ## -Summary: -1) Compile and install a static version of the latest release of -libevent. -2) Acquire and install your preferred version of tor. Extract. -3) "make dist-osx" -4) You now have a dmg from which you can install Tor. - -## Universal Binaries for OSX PPC and X86 -## This method works in OSX 10.4 (Tiger) and newer OSX versions. -## See far below if you don't care about cross compiling for PPC and X86. -## The single architecture process starts with "###" +1) Download the latest stable libevent from +http://www.monkey.org/~provos/libevent/ + +2) The first step of compiling libevent is to configure it as +follows: +./configure --enable-static --disable-shared + +3) Complete the "make" and "make install". You will need to be root, +or sudo -s, to complete the "make install". + +## Compiling Tor ## + +4) Get your preferred version of the tor source from +https://www.torproject.org/dist/ or +http://archive.torproject.org/tor-package-archive/. Extract the tarball. + +5) In the top level, this means /path/to/tor/, not tor/contrib/osx, +do a configure with these parameters: + +CONFDIR=/Library/Tor ./configure --prefix=/Library/Tor \ +--bindir=/Library/Tor --sysconfdir=/Library + +6) In same top level dir, do a "make dist-osx". There now exists a +.dmg file in the same directory. Install from this dmg. + +####################################### +# +# Section 2 +# Backwards compatible single-architecture binaries for OSX x86 10.4 from +# newer versions of OS X. +# +####################################### 1) Install the latest XCode updates available from http://developer.apple.com. -## Compiling libevent +## Compiling libevent ## -2) Download latest stable libevent from +2) Download latest stable libevent from http://www.monkey.org/~provos/libevent/ 3) The first step of compiling libevent is to configure it as follows: -CFLAGS="-O -g -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \ + +CFLAGS="-O -g -mmacosx-version-min=10.4 -isysroot \ +/Developer/SDKs/MacOSX10.4u.sdk -arch i386" \ LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" \ -./configure --enable-static --disable-shared --disable-dependency-tracking +./configure --enable-static --disable-shared --disable-dependency-tracking \ +CC="gcc-4.0" -4) Complete the "make" and "make install". You will need to be root, +4) Complete the "make" and "make install". You will need to be root, or sudo -s, to complete the "make install". 5) Check for a successful universal binary of libevent.a in, by default, /usr/local/lib by using the following command: + "file /usr/local/lib/libevent.a" Your output should be: -/usr/local/lib/libevent.a: Mach-O fat file with 2 architectures -/usr/local/lib/libevent.a (for architecture i386): current ar archive random library -/usr/local/lib/libevent.a (for architecture ppc): current ar archive -6) Get your preferred version of the tor source from https://www.torproject.org/download. +"/usr/local/lib/libevent.a (for architecture i386): +current ar archive random library" + +6) Get your preferred version of the tor source from +https://www.torproject.org/dist/ or +http://archive.torproject.org/tor-package-archive/. Extract the tarball. 7) In the top level, this means /path/to/tor/, not tor/contrib/osx, do a configure with these parameters: -CFLAGS="-O -g -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \ + +CFLAGS="-O -g -mmacosx-version-min=10.4 -isysroot \ +/Developer/SDKs/MacOSX10.4u.sdk -arch i386" \ LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" \ CONFDIR=/Library/Tor \ ./configure --prefix=/Library/Tor --bindir=/Library/Tor \ ---sysconfdir=/Library --disable-dependency-tracking +--sysconfdir=/Library --disable-dependency-tracking CC="gcc-4.0" 8) "make dist-osx" 9) Confirm you have created a universal binary by issuing the follow command: -"file src/or/tor". Its output should be as follows: -src/or/tor: Mach-O fat file with 2 architectures -src/or/tor (for architecture i386): Mach-O executable i386 -src/or/tor (for architecture ppc): Mach-O executable ppc +"file src/or/tor". Its output should be as follows: +src/or/tor (for architecture i386): Mach-O executable i386 10) There should exist in the top-level directory a -Tor-$VERSION-universal-Bundle.dmg +Tor-$VERSION-i386-Bundle.dmg -11) Congrats. You have a universal binary. You are now ready to install Tor. +11) Congrats. You have a backwards-compatible binary. +You are now ready to install Tor. -### Single Architecture Binaries for PPC or X86, not both. -### This method works in all versions of OSX 10.3 through 10.5 +#################################################################### +# +# Section 3 +# +# Universal Binaries for OSX PPC and X86 +# This method works in OSX 10.4 (Tiger) and newer OSX versions. +# +#################################################################### -### Compiling libevent +1) Install the latest XCode updates available from http://developer.apple.com. + +## Compiling libevent ## -1) Download the latest stable libevent from +2) Download latest stable libevent from http://www.monkey.org/~provos/libevent/ -2) The first step of compiling libevent is to configure it as +3) The first step of compiling libevent is to configure it as follows: - ./configure --enable-static --disable-shared +CFLAGS="-O -g -mmacosx-version-min=10.4 -isysroot \ +/Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \ +LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" \ +./configure --enable-static --disable-shared --disable-dependency-tracking \ +CC="gcc-4.0" -3) Complete the "make" and "make install". You will need to be root, +4) Complete the "make" and "make install". You will need to be root, or sudo -s, to complete the "make install". -### Compiling Tor +5) Check for a successful universal binary of libevent.a in, by default, +/usr/local/lib by using the following command: + "file /usr/local/lib/libevent.a" + + Your output should be: -4) Get your preferred version of the tor source from https://www.torproject.org. Extract the -tarball. +/usr/local/lib/libevent.a: Mach-O fat file with 2 architectures +/usr/local/lib/libevent.a (for architecture i386): +current ar archive random library +/usr/local/lib/libevent.a (for architecture ppc): +current ar archive + +6) Get your preferred version of the tor source from +https://www.torproject.org/dist/ or +http://archive.torproject.org/tor-package-archive/. +Extract the tarball. -5) In the top level, this means /path/to/tor/, not tor/contrib/osx, +7) In the top level, this means /path/to/tor/, not tor/contrib/osx, do a configure with these parameters: - CONFDIR=/Library/Tor ./configure --prefix=/Library/Tor \ - --bindir=/Library/Tor --sysconfdir=/Library -6) In same top level dir, do a "make dist-osx". There now exists a -.dmg file in the same directory. Install from this dmg. +CFLAGS="-O -g -mmacosx-version-min=10.4 -isysroot \ +/Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \ +LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" \ +CONFDIR=/Library/Tor \ +./configure --prefix=/Library/Tor --bindir=/Library/Tor \ +--sysconfdir=/Library --disable-dependency-tracking CC="gcc-4.0" + +8) "make dist-osx" + +9) Confirm you have created a universal binary by issuing the follow command: +"file src/or/tor". Its output should be as follows: + +src/or/tor: Mach-O fat file with 2 architectures +src/or/tor (for architecture i386): Mach-O executable i386 +src/or/tor (for architecture ppc): Mach-O executable ppc + +10) There should exist in the top-level directory a +Tor-$VERSION-universal-Bundle.dmg + +11) Congrats. You have a universal binary. You are now ready to install Tor. diff -Nru tor-0.2.0.34/doc/tor-resolve.1 tor-0.2.2.16-alpha/doc/tor-resolve.1 --- tor-0.2.0.34/doc/tor-resolve.1 2008-02-26 19:56:32.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-resolve.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -.TH tor-resolve 1 "" Aug-2004 "" -.\" manual page by Peter Palfrader -.SH NAME -.LP -tor-resolve \- resolve a hostname to an IP address via tor - -.SH SYNOPSIS -\fBtor-resolve\fP\ [-4|-5] [-v] [-x] \fIhostname\fP\ [\fIsockshost\fP[:\fIsocksport]\fP] - -.SH DESCRIPTION -\fBtor-resolve\fR is a simple script to connect to a SOCKS proxy that -knows about the SOCKS RESOLVE command, hand it a hostname, and return -an IP address. -.SH OPTIONS -\fB-v \fP -Display verbose output. -.LP -.TP -\fB-x\fP -Perform a reverse lookup: get the PTR record for an IPv4 address. -.LP -.TP -\fB-5\fP -Use the SOCKS5 protocol. (Default) -.LP -.TP -\fB-4\fP -Use the SOCKS4a protocol rather than the default SOCKS5 protocol. Doesn't -support reverse DNS. - -.SH SEE ALSO -.BR tor (1), -.BR torify (1). -.PP -See doc/socks-extensions.txt in the Tor package for protocol details. - -.SH AUTHORS -Roger Dingledine , Nick Mathewson . diff -Nru tor-0.2.0.34/doc/tor-resolve.1.in tor-0.2.2.16-alpha/doc/tor-resolve.1.in --- tor-0.2.0.34/doc/tor-resolve.1.in 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-resolve.1.in 2010-02-22 20:57:29.000000000 +0000 @@ -0,0 +1,60 @@ +.\" Title: tor-resolve +.\" Author: +.\" Generator: DocBook XSL Stylesheets v1.73.2 +.\" Date: 02/22/2010 +.\" Manual: +.\" Source: +.\" +.TH "TOR\-RESOLVE" "1" "02/22/2010" "" "" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "NAME" +tor-resolve \- resolve a hostname to an IP address via tor +.SH "SYNOPSIS" +\fBtor\-resolve\fR [\-4|\-5] [\-v] [\-x] \fIhostname\fR [\fIsockshost\fR[:\fIsocksport\fR]] +.sp +.SH "DESCRIPTION" +\fBtor\-resolve\fR is a simple script to connect to a SOCKS proxy that knows about the SOCKS RESOLVE command, hand it a hostname, and return an IP address\&. +.sp +.SH "OPTIONS" +.PP +\fB\-v\fR +.RS 4 +Display verbose output\&. +.RE +.PP +\fB\-x\fR +.RS 4 +Perform a reverse lookup: get the PTR record for an IPv4 address\&. +.RE +.PP +\fB\-5\fR +.RS 4 +Use the SOCKS5 protocol\&. (Default) +.RE +.PP +\fB\-4\fR +.RS 4 +Use the SOCKS4a protocol rather than the default SOCKS5 protocol\&. Doesn\'t support reverse DNS\&. +.RE +.SH "SEE ALSO" +\fBtor\fR(1), \fBtorify\fR(1)\&. +.sp +See doc/socks\-extensions\&.txt in the Tor package for protocol details\&. +.sp +.SH "AUTHORS" +Roger Dingledine , Nick Mathewson \&. +.sp +.SH "NOTES" +.IP " 1." 4 +arma@mit.edu +.RS 4 +\%mailto:arma@mit.edu +.RE +.IP " 2." 4 +nickm@alum.mit.edu +.RS 4 +\%mailto:nickm@alum.mit.edu +.RE diff -Nru tor-0.2.0.34/doc/tor-resolve.1.txt tor-0.2.2.16-alpha/doc/tor-resolve.1.txt --- tor-0.2.0.34/doc/tor-resolve.1.txt 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-resolve.1.txt 2010-02-02 21:40:22.000000000 +0000 @@ -0,0 +1,45 @@ +// Copyright (c) The Tor Project, Inc. +// See LICENSE for licensing information +// This is an asciidoc file used to generate the manpage/html reference. +// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html +tor-resolve(1) +============== +Peter Palfrader + +NAME +---- +tor-resolve - resolve a hostname to an IP address via tor + +SYNOPSIS +-------- +**tor-resolve** [-4|-5] [-v] [-x] __hostname__ [__sockshost__[:__socksport__]] + +DESCRIPTION +----------- +**tor-resolve** is a simple script to connect to a SOCKS proxy that knows about +the SOCKS RESOLVE command, hand it a hostname, and return an IP address. + +OPTIONS +------- +**-v**:: + Display verbose output. + +**-x**:: + Perform a reverse lookup: get the PTR record for an IPv4 address. + +**-5**:: + Use the SOCKS5 protocol. (Default) + +**-4**:: + Use the SOCKS4a protocol rather than the default SOCKS5 protocol. Doesn't + support reverse DNS. + +SEE ALSO +-------- +**tor**(1), **torify**(1). + + +See doc/socks-extensions.txt in the Tor package for protocol details. + +AUTHORS +------- +Roger Dingledine , Nick Mathewson . \ No newline at end of file diff -Nru tor-0.2.0.34/doc/tor-resolve.html.in tor-0.2.2.16-alpha/doc/tor-resolve.html.in --- tor-0.2.0.34/doc/tor-resolve.html.in 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-resolve.html.in 2010-02-22 20:57:39.000000000 +0000 @@ -0,0 +1,436 @@ + + + + + + +tor-resolve(1) + + + +

SYNOPSIS

+
+

tor-resolve [-4|-5] [-v] [-x] hostname [sockshost[:socksport]]

+
+

DESCRIPTION

+
+

tor-resolve is a simple script to connect to a SOCKS proxy that knows about +the SOCKS RESOLVE command, hand it a hostname, and return an IP address.

+
+

OPTIONS

+
+
+
+-v +
+
+

+ Display verbose output. +

+
+
+-x +
+
+

+ Perform a reverse lookup: get the PTR record for an IPv4 address. +

+
+
+-5 +
+
+

+ Use the SOCKS5 protocol. (Default) +

+
+
+-4 +
+
+

+ Use the SOCKS4a protocol rather than the default SOCKS5 protocol. Doesn't + support reverse DNS. +

+
+
+
+

SEE ALSO

+
+

tor(1), torify(1).

+

See doc/socks-extensions.txt in the Tor package for protocol details.

+
+

AUTHORS

+
+

Roger Dingledine <arma@mit.edu>, Nick Mathewson <nickm@alum.mit.edu>.

+
+ + + diff -Nru tor-0.2.0.34/doc/tor-rpm-creation.txt tor-0.2.2.16-alpha/doc/tor-rpm-creation.txt --- tor-0.2.0.34/doc/tor-rpm-creation.txt 2009-01-30 19:21:28.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-rpm-creation.txt 2009-10-10 19:34:25.000000000 +0000 @@ -2,60 +2,25 @@ ## The process used to create the official rpms is as follows: -Download and Extract the latest tor source code from https://www.torproject.org/. -In the resulting directory: -./configure -make dist-rpm +Download latest stable libevent from +http://www.monkey.org/~provos/libevent/ -You should have at least two, maybe three, rpms. There should be the binary -i386.rpm, a src.rpm, and on redhat/centos machines, a debuginfo.rpm. +The first step of compiling libevent is to configure it as follows: +./configure --enable-static --disable-shared -## Optional customization -## -If you wish to further tune Tor binaries in rpm format beyond this list, -see the GCC doc page for further options: -http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gcc/ - -The tor.spec.in file contains the basic info needed to tune the binaries -produced in rpm format. The key parameters to tune are located in the -third section of the tor.spec.in file. Locate the section similar to -this: - -## Target a specific arch and OS -# -# default is i386 linux -%define target gnu -%define target_cpu i386 -%define target_os linux - -The three parameters: target, target_cpu, and target_os are used -throughout the "make dist-rpm" process. They control the parameters -passed to "configure" and the final tuning of the binaries produced. -The default settings, as shown above, create binaries for the widest -range of Intel x86 or x86-compatible architectures. - -The parameters can be set as follows: - -The "target" parameter: -This should be "gnu", "redhat", or the short name of your linux distribution. -Other possibilities are "mandrake" or "suse". This is passed to -"configure" through the --host, --build, and --target parameters. -Therefore, this "target" parameter must be a valid OS for "configure" as -well. - -The "target_cpu" parameter: -This parameter controls the optimization and tuning of your binaries via -gcc and "configure". This parameter is passed to gcc via the -mtune= or --mcpu= options. The "configure" script will also receive this parameter -through the --host, --build, and --target parameters. Therefore, this -"target_cpu" parameter must be valid for both gcc and "configure". A -few common options for this parameter may be "athlon64, i686, pentium4" or -others. - -The "target_os" parameter: -This parameter controls the target operating system. Normally, this is -only "linux". If you wish to build rpms for a non-linux operating -system, you can replace "linux" with your operating system. +Complete the "make" and "make install". You will need to be root, +or sudo -s, to complete the "make install". +Check for a successful universal binary of libevent.a in, by default, +/usr/local/lib by using the following command: + "file /usr/local/lib/libevent.a" +Download and Extract the latest tor source code from +https://www.torproject.org/download +In the resulting directory: +LIBS=-lrt ./configure +make dist-rpm + +You should have at least two, maybe three, rpms. There should be the binary +i386.rpm, a src.rpm, and on redhat/centos machines, a debuginfo.rpm. diff -Nru tor-0.2.0.34/doc/tor-win32-mingw-creation.txt tor-0.2.2.16-alpha/doc/tor-win32-mingw-creation.txt --- tor-0.2.0.34/doc/tor-win32-mingw-creation.txt 2009-01-30 19:21:28.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/tor-win32-mingw-creation.txt 2010-02-19 01:27:01.000000000 +0000 @@ -1,3 +1,4 @@ +## ## Instructions for building Tor with MinGW (http://www.mingw.org/) ## @@ -5,21 +6,21 @@ --------------------------------------- Download mingw: -http://prdownloads.sf.net/mingw/MinGW-5.1.4.exe?download +http://prdownloads.sf.net/mingw/MinGW-5.1.6.exe?download Download msys: -http://prdownloads.sf.net/mingw/MSYS-1.0.10.exe?download +http://prdownloads.sf.net/ming/MSYS-1.0.11.exe?download + +Download msysDTK: +http://sourceforge.net/projects/mingw/files/MSYS%20Supplementary%20Tools/msysDTK-1.0.1/msysDTK-1.0.1.exe/download -Download the mingw developer tool kit: -http://prdownloads.sf.net/mingw/msysDTK-1.0.1.exe?download +Install MinGW, msysDTK, and MSYS in that order. -Download the mingw autoconf-2.59 update: -http://prdownloads.sf.net/mingw/msys-autoconf-2.59.tar.bz2?download +Make sure your PATH includes C:\MinGW\bin. You can verify this by right +clicking on "My Computer", choose "Properties", choose "Advanced", +choose "Environment Variables", select PATH. -Install mingw, msys and mingw-dtk. Extract msys-autoconf-2.59.tar.bz2 into -your mingw install location. For example, if you installed mingw into -/c/mingw/1.0/ you want to extract msys-autoconf-2.59.tar.bz2 into this -directory. +Start MSYS(rxvt). Create a directory called "tor-mingw". @@ -27,17 +28,17 @@ ---------------------------------------------- Download openssl: -http://www.openssl.org/source/openssl-0.9.8j.tar.gz +http://www.openssl.org/source/openssl-0.9.8l.tar.gz Extract openssl: Copy the openssl tarball into the "tor-mingw" directory. Type "cd tor-mingw/" -Type "tar zxf openssl-0.9.8j.tar.gz" +Type "tar zxf openssl-0.9.8l.tar.gz" (Note: There are many symlink errors because Windows doesn't support symlinks. You can ignore these errors.) Make openssl libraries: -Type "cd tor-mingw/openssl-0.9.8j/" +Type "cd tor-mingw/openssl-0.9.8l/" Type "./Configure -no-idea -no-rc5 -no-mdc2 mingw" Edit Makefile and remove the "test:" and "tests:" sections. Type "rm -rf ./test" @@ -47,16 +48,11 @@ Type "find ./ -name "*.h" -exec cp {} ../include/openssl/ \;" Type "cd .." Type "cp *.h include/openssl/" -Type "cp fips/fips.h include/openssl/" +Type "find ./fips -type f -name "*.h" -exec cp {} include/openssl/ \;" # The next steps can take up to 30 minutes to complete. Type "make" Type "make install" -Alternatively: -Download the pre-compiled openssl for win32 from -http://gnuwin32.sourceforge.net/packages/openssl.htm -Install and proceed. - Stage Three: Download, extract, compile zlib --------------------------------------------- @@ -77,13 +73,6 @@ Type "make" Type "make install" -OR - -Make zlib1.dll: -Type "cd tor-mingw/zlib-1.2.3/" -Type "./configure" -Type "make -f win32/Makefile.gcc" - Done. @@ -128,4 +117,3 @@ "./contrib/package_nsis-mingw.sh" The resulting Tor installer executable is in ./win_tmp/. - diff -Nru tor-0.2.0.34/doc/website/stylesheet.css tor-0.2.2.16-alpha/doc/website/stylesheet.css --- tor-0.2.0.34/doc/website/stylesheet.css 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/stylesheet.css 1970-01-01 00:00:00.000000000 +0000 @@ -1,383 +0,0 @@ -body { - background-color: #FFFFFF; - margin-top: 0px; - font-family: Arial, Helvetica, sans-serif; - font-size: 1em; - font-style: normal; - color: #000000; - padding-top: 0px; -} - -/* images */ - -img { - border: 0; -} - - -li { - margin: .2em .2em .2em 1em; - -} - -/* this centers the page */ - -.center { - text-align: center; - background-color: white; - margin: 0px auto 0 auto; - width: 85%; -} - -.center table { - margin-left: auto; - margin-right: auto; - text-align: left; -} - -/* for the shadow box */ - -table.shadowbox { - width: 788px; - border-collapse: collapse; - padding: 0; - margin-bottom: 2em; -} - -table.shadowbox td { - margin: 0; - padding: 0; -} - -/* spacer */ - -td.spacer { - width: 110px; -} - - - -div.banner { - text-align: center; - height: 79px; - margin-bottom: 10px; - width:100%; -} - -table.table-banner { - margin: 0 auto 0 auto; - background-image: url("images/tor_mast.gif"); - background-repeat: no-repeat; -} - - - - -div.bottom { - font-size: 0.8em; - margin-top: 2cm; - margin-left: 1em; - margin-right: 1em; - text-align: right; -} - -/* the sidebar */ - -div.sidebar { - float: right; - padding-top: 10px; - padding-right: 10px; - padding-bottom: 15px; - padding-left: 10px; - width: 260px; - text-align: center; -} - - -/* The main column (left text) */ - -div.main-column { - padding: 15px 0 10px 10px; - text-indent: 0pt; - font-size: 1em; - text-align: left; -} - -/* formatting styles */ - -h1 { - font-size: 1.6em; - margin-bottom: 0.5em; -} - -h2 { - font-size: 1.4em; - margin-bottom: 0em; - font-weight: bold; - margin-top: 0; -} - -h3 { - font-size: 1.2em; - margin-bottom: 0em; - font-weight: bold; - margin-top: 0; -} - -h4 { - font-size: 1.1em; - margin-bottom: 0em; - font-weight: bold; - margin-top: 0; -} - -h5 { - font-size: 1.0em; - margin-bottom: 0em; - font-weight: bold; - margin-top: 0; -} - -p { - margin-top: 0; - margin-bottom: 1em; -} - -a:link { - color: blue; - font-size: 1em; -} - -a:visited { - color: purple; - font-size: 1em; -} - - -a.anchor:link { - font-size: 1em; - color: black; - font-weight: bold; - text-decoration: none; -} - -a.anchor:visited { - font-size: 1em; - color: black; - font-weight: bold; - text-decoration: none; -} - -a.anchor { - font-size: 1em; - color: black; - font-weight: bold; - text-decoration: none; -} - -td { - vertical-align: top; -} - -a.smalllink { - font-size: 0.8em; -} - -/* the banner */ - -table.banner { - width: 100%; - height: 79px; - margin-left: auto; - margin-right: auto; -} - -td.banner-left { - /* This is done with an in the HTML so it can be clickable - background-image: url("images/top-left.png"); - background-repeat: no-repeat; */ - width: 193px; -} - -td.banner-middle { - background-color: #00802B; - background-image: url("images/top-middle.png"); - background-repeat: repeat-x; - vertical-align: bottom; - padding-bottom: 10px; - color: white; - font-weight: bold; - font-size: 1em; -} - -td.banner-middle a, td.banner-middle a:visited { - margin-right: 5px; - color: white; - font-weight: bold; - font-size: 1em; -} - -td.banner-middle a:hover { - color: #FF7F00; - font-weight: bold; - font-size: 1em; -} - -td.banner-right { - background-image: url("images/top-right.png"); - background-repeat: no-repeat; - width: 150px; - background-position: right; - padding-top: 8px; -} - -.banner-middle a.current { - text-decoration: none; - color: #FF7F00; - font-weight: bold; - font-size: 1em; - width: auto; - text-align: auto; - left: -50px; -} - -.donatebutton { - width: auto; - text-align: center; -} - -.donatebutton a { - margin: 10px 0 0 0; - font-weight: bold; - display: block; - padding: 6px; - background-color: #00802B; - border-top: 1px solid #00A838; - border-left: 1px solid #00A838; - border-bottom: 1px solid #00591E; - border-right: 1px solid #00591E; - color: #FFFFFF; -} - -.donatebutton a:hover { - color: orange; -} - -.donatebutton a:active { - color: orange; -} - -/* these styles are for the menu on the gui contest pages */ - -.guileft { - width: 25%; - float: left; - padding: 0; - margin: 0; -} - -.guimenu { - border: 1px solid #AAA6AB; - background-color: #E2DFE3; - margin: 0 15px 15px 0; - padding: 0; -} - -.guimenuinner a { - display: block; - text-decoration: none; - padding: 2px 0px 0px 12px; - margin: 0 0 0 0px; - color: #333333; -} - -.guimenuinner a:visited { - color: #333333; -} - -.guimenuinner a:hover { - background-image: url(gui/img/arrow.png); - background-repeat: no-repeat; - background-position: left; - color: #EF8012; -} - -.guimenuinner a.on { - background-image: url(gui/img/arrow.png); - background-repeat: no-repeat; - background-position: left; - color: #EF8012; -} - - -.guimenu h1 { - width: 85%; - font-size: 16px; - margin: 0 0 8px 0; - padding: 0; - border-bottom: 1px solid #AAA6AB; -} - -.curveleft { - background-image: url(gui/img/corner-topleft.png); - background-repeat: no-repeat; - background-position: top left; - margin: -1px; -} - -.curveright { - background-image: url(gui/img/corner-topright.png); - background-repeat: no-repeat; - background-position: top right; -} - -.guimenuinner { - - padding: 0 10px 0 10px; -} - -//.wiki { - padding: 5px 40px 0 0; - display: block; - text-align: right; -} - - -.curvebottomleft { - background-image: url(gui/img/corner-bottomleft.png); - background-repeat: no-repeat; - background-position: bottom left; - margin: -1px; -} - -.curvebottomright { - background-image: url(gui/img/corner-bottomright.png); - background-repeat: no-repeat; - background-position: bottom right; -} - - -table.mirrors { - margin: 0 auto; - border-width: 3px; - border-color: gray; - border-style: ridge; - border-collapse: collapse; -} -table.mirrors th { - border: 1px solid gray; - background-color: #DDDDDD; -} -table.mirrors td { - border: 1px solid gray; - padding: 4px; -} - -acronym { - border-bottom: none; -} - -dt { - font-weight: bolder; - font-style: italic; -} diff -Nru tor-0.2.0.34/doc/website/tor-doc-osx.html.en tor-0.2.2.16-alpha/doc/website/tor-doc-osx.html.en --- tor-0.2.0.34/doc/website/tor-doc-osx.html.en 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-osx.html.en 1970-01-01 00:00:00.000000000 +0000 @@ -1,242 +0,0 @@ - - - - Tor: Mac OS X Install Instructions - - - - - - -
- - - - - - - -
-
-

Running the Tor client on Mac OS X

-
-

-Note that these are the installation instructions for running a Tor client on - Mac OS X. If you want to relay traffic for others to help the network - grow (please do), read the Configuring a relay guide. -

-
- -

Step One: Download and Install Tor

-
-

-The latest stable and experimental releases of Tor for Macintosh -OS X bundle Tor, -Vidalia (a GUI for Tor), -and Privoxy (a filtering web proxy) -into one package, pre-configured to work together. -Download one from the download -page. -

-

Our Tor installer should make everything pretty simple. Below is a -screenshot of the setup page: -

-tor installer splash page -

When the installer is finished, you can start Vidalia by selecting its icon -from your Applications folder. A dark onion with a red X in your dock means -Tor is not currently running. You can start Tor by selecting Start from the -"Tor" menu at the top of your screen. -

-

When Tor is running, Vidalia's dock icon will look like the following: -

-vidalia running tor -

Privoxy is installed as part of the Tor bundle package -installer. Once it is installed, it will start automatically when your -computer is restarted. -You do not need to configure Privoxy to use Tor — a custom Privoxy -configuration for Tor has been installed as part of the installer package. -

-
- -

Step Two: Configure your applications to use Tor

-
-

After installing Tor and Privoxy, you need to configure your -applications to use them. The first step is to set up web browsing.

-

If you're using Firefox (we recommend it), simply install the Torbutton plugin, -restart your Firefox, click on the red "Tor Disabled" toggle button to -turn Tor on, and you're all set:

-Torbutton plugin for Firefox -
-

-(Learn more about -Torbutton here. -If you plan to run Firefox on a different computer than Tor, see the FAQ -entry for running Tor on a different computer. If you need to -use a browser other than Firefox, you'll have to configure its proxy settings yourself.) -

-

Apple Safari

-

If you want to use Tor with Safari, you need to change your -Network Settings. Select your Network Preferences from the Apple | -Location menu:

-Network settings -

Select the Network Interface on which you want to enable Tor. If you use -more than one Interface you must change the proxy settings for each -individually.

-Network preferences -

-

Select and enter 127.0.0.1 and port 8118 for both -Web Proxy (HTTP) and your Secure Web Proxy (HTTPS). -You should also do this for "FTP Proxy" and "Gopher Proxy"; see this -note about Tor and ftp proxies. Leave your Use Passive FTP Mode -(PASV) setting as is.

-Proxy settings -

Using privoxy is necessary because browsers -leak your -DNS requests when they use a SOCKS proxy directly, which is bad for -your anonymity. Privoxy also removes certain dangerous headers from your -web requests, and blocks obnoxious ad sites like Doubleclick.

-

To Torify other applications that support HTTP proxies, just -point them at Privoxy (that is, localhost port 8118). To use SOCKS -directly (for instant messaging, Jabber, IRC, etc), you can point -your application directly at Tor (localhost port 9050), but see this -FAQ entry for why this may be dangerous. For applications -that support neither SOCKS nor HTTP, take a look at connect or -socat.

-

For information on how to Torify other applications, check out the -Torify -HOWTO. -

-
- -

Step Three: Make sure it's working

-
-

-Next, you should try using your browser with Tor and make -sure that your IP address is being anonymized. Click on -the -Tor detector -and see whether it thinks you're using Tor or not. -(If that site is down, see this -FAQ entry for more suggestions on how to test your Tor.) -

-

If you have a personal firewall that limits your computer's -ability to connect to itself, be sure to allow connections from -your local applications to local port 8118 and port 9050. If -your firewall blocks outgoing connections, punch a hole so -it can connect to at least TCP ports 80 and 443, and then see this -FAQ entry. -

-

If it's still not working, look at this -FAQ entry for hints.

-
- - -

Step Four: Configure it as a relay

-
-

The Tor network relies on volunteers to donate bandwidth. The more -people who run relays, the faster the Tor network will be. If you have -at least 20 kilobytes/s each way, please help out Tor by configuring your -Tor to be a relay too. We have many features that make Tor relays easy -and convenient, including rate limiting for bandwidth, exit policies so -you can limit your exposure to abuse complaints, and support for dynamic -IP addresses.

-

Having relays in many different places on the Internet is what -makes Tor users secure. You -may also get stronger anonymity yourself, -since remote sites can't know whether connections originated at your -computer or were relayed from others.

-

Read more at our Configuring a relay -guide.

-
- -

How To Uninstall Tor and Privoxy

-
-

The Tor 0.1.0.x series and beyond have a command line or -Terminal-based uninstaller. If you want to remove Tor on OSX, here's how:

-

Change your application proxy settings back to their original values. - If you just want to stop using Tor, you can end at this point.

-

If you want to completely remove Tor, and your account has Admin -Privileges, then proceed as follows:

-
    -
  1. Open up a Terminal or x-term session.
  2. -
  3. cd /Library/Tor
  4. -
  5. sudo -s
  6. -
  7. ./uninstall_tor_bundle.sh
  8. -
-

Tor and Privoxy are now completely removed from your system.

-

If you're using a version of the Tor installer that doesn't come -with the uninstall_tor_bundle script, you will need to manually -delete the following:

-
    -
  • /Library/Tor
  • -
  • /Library/Privoxy
  • -
  • /usr/bin/tor
  • -
  • /usr/bin/tor_resolve
  • -
  • /var/log/tor
  • -
  • /usr/share/man/man1/tor.1
  • -
  • /usr/share/man/man1/tor-resolve.1
  • -
  • /usr/share/man/man1/torify.1
  • -
  • /Library/Receipts/Privoxy.pkg/
  • -
  • /Library/Receipts/privoxyconf.pkg/
  • -
  • /Library/Receipts/Tor.pkg/
  • -
  • /Library/Receipts/torstartup.pkg/
  • -
  • /Library/StartupItems/Tor
  • -
  • /Library/StartupItems/Privoxy
  • -
-
-

If you have suggestions for improving this document, please send them to us. Thanks!

-
-
-
-
-

- Webmaster - - Last modified: Sun Mar 2 17:31:17 2008 - - - Last compiled: Sun Mar 2 17:35:34 2008 -

-

"Tor" and the "Onion Logo" are trademarks of The Tor Project, Inc. -

-

- This page is also available in the following languages: - español, français, Italiano, polski.
- How to set the default document language. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-osx.html.es tor-0.2.2.16-alpha/doc/website/tor-doc-osx.html.es --- tor-0.2.0.34/doc/website/tor-doc-osx.html.es 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-osx.html.es 1970-01-01 00:00:00.000000000 +0000 @@ -1,250 +0,0 @@ - - - - Instrucciones de instalación para Mac OS X - - - - - - -
- - - - - - - -
-
-

Ejecutar el cliente Tor en Mac OS X

-
-

-Note que éstas son las instrucciones de instalación para ejecutar un cliente Tor -en Mac OS X. Si quiere retransmitir tráfico para otros para ayudar a crecer a la red -(por favor hágalo), lea la guía Configurar un repetidor. -

-
- -

Paso Uno: Descargar e Instalar Tor

-
-

-El paquete con las últimas versiones estables y experimentales de Tor para Macintosh -OS X con Tor, -Vidalia (una GUI para Tor), -y Privoxy (un proxy web con filtro) -preconfigurados para funcionar juntos. -Descarga uno de la página de descargas. -

-

Nuestro instalador Tor debería hacer que todo sea bastante simple. -Debajo hay una captura de pantalla de la página de configuración: -

-tor installer splash page -

Cuando termine el instalador, puede arrancar Vidalia seleccionando su icono -de la carpeta de Aplicaciones. Una cebolla oscura con una X roja en su Dock -significa que Tor no está ejecutándose en este momento. Puede iniciar Tor -seleccionando Start desde el menu "Tor" en la parte superior de su pantalla. -

-

Cuando Tor se está ejecutando, el icono de Vidalia es el siguiente: -

-vidalia running tor -

Privoxy se instala como parte del paquete instalador unificado de Tor. -Una vez que esté instalado, se iniciará automáticamente cuando se reinicie -su ordenador. -No cecesita configurar Privoxy para usar Tor — una configuración a -medida de Privoxy para Tor se instala como parte del paquete de instalación. -

-
- -

Paso Dos: Configurar sus aplicaciones para que usen Tor

-
-

Tras instalar Tor y Privoxy, necesita configurar sus aplicaciones -para que los usen. El primer paso es configurar la navegación web. -

-

Si usa Firefox (lo recomendamos), simplemente instale el plugin Torbutton, -reinicie Firefox, pulse en el botón rojo "Tor Disabled" para activar Tor, -y eso es todo: -

-Torbutton plugin for Firefox -
-

-(Aprenda más sobre -Torbutton aquí. -Si planea ejecutar Firefox en un ordenador distinto del de Tor, vea la entrada -de la FAQ sobre ejecutar Tor en un ordenador distinto. Si necesita -usar un navegador distinto de Firefox, tendrá que configurar su configuración de proxy por sí mismo.) -

-

Apple Safari

-

Si quiere usar Tor con Safari, necesita cambiar su Configuración de Red. -Seleccione sus Preferencias de Red desde el menú Apple | Ubicación :

-Network settings -

Seleccione el interfaz de red en el que quiera habilitar Tor. Si usa -más de un interfaz debe cambiar la configuración del proxy para cada uno -individualmente.

-Network preferences -

-

Seleccione y entre 127.0.0.1 y puerto 8118 tanto para -Proxy Web (HTTP) y Procy Web Seguro (HTTPS). -Debe hacer esto también para "Proxy FTP" y "Proxy Gopher"; vea esta -nota sobre Tor y proxies ftp. Deje su configuración de Usar modo FTP pasivo -(PASV) como está.

-Proxy settings -

Usar privoxy es necesario porque los navegadores -dejan escapar sus peticiones DNS cuando usan un proxy SOCKS directamente, -lo que es malo para su anonimato. Privoxy también elimina ciertas cabeceras -peligrosas de sus peticiones web, y bloquea sitios repugnantes de anuncios -como Doubleclick.

-

Para Torificar otras aplicaciones que soporten proxies HTTP, -simplemente apúntelas a Privoxy (eso significa localhost puerto 8118). -Para usar SOCKS directamente (para mensajería instantánea, -Jabber, IRC, etc), puede apuntar su aplicación directamente a Tor -(localhost puerto 9050), pero vea esta -entrada de la FAQ sobre por qué esto puede ser peligroso. Para aplicaciones -que no soporten ni SOCKS ni HTTP, mire connect o -socat.

-

Para información sobre cómo Torificar otras aplicaciones, compruebe el -Torify -HOWTO. -

-
- -

Paso Tres: Asegurarse de que esté funcionando

-
-

-A continuación, debería intentar usar su navegador con Tor y -asegurarse de que su dirección IP está siendo anonimizada. -Pulse en -el -detector de Tor -y vea si cree que está usando Tor o no. -(Si el sitio está caído, vea esta -entrada en la FAQ para más sugerencias sobre cómo comprobar su Tor.) -

-

Si tiene un cortafuegos personal que limite la capacidad de su ordenador -para conectarse a sí mismo, asegúrese de permitir conexiones de sus -aplicaciones locales al puerto local 8118 y al puerto 9050. Si -su cortafuegos bloquea las conexiones salientes, abra un agujero para -que pueda conectarse al menos a los puertos 80 y 443, y luego vea esta -entrada de la FAQ. -

-

Si aún no funciona, mire esta -entrada de la FAQ para sugerencias.

-
- - -

Paso Cuatro: configurarlo como un repetidor

-
-

La red Tor se apoya en voluntarios que donen ancho de banda. Cuanta -más gente ejecute repetidores, más rápida será la red Tor. Si tiene -al menos 20 kilobytes/s bidireccional, por favor ayude a Tor configurando -su Tor para que sea un repetidor también. Tenemos muchas características -que hacen los repetidores Tor fáciles y prácticos, incluyendo limitación -de velocidad para el ancho de banda, políticas de salida para que pueda -limitar su exposición a quejas de abuso, y soporte para direcciones IP -dinámicas.

-

Tener repetidores en muchos sitios diferentes de Internet es lo que -hace a los usuarios de Tor seguros. También -puede que obtenga más anonimato usted, -ya que los sitios remotos no pueden saber si las conexiones se originaron -en su ordenador o fueron reenviadas desde otros.

-

Lea más en nuestra guía Configurar un repetidor.

-
- -

Cómo desinstalar Tor y Privoxy

-
-

Las series Tor 0.1.0.x y en adelante tienen un desinstalador basado en -línea de órdenes o Terminal. Si quiere eliminar Tor en OSX, se hace así: -

-

Cambie la configuración proxy de su aplicación de vuelta a sus valores -originales. Si sólo planea dejar de usar Tor, puede detenerse en este punto. -

-

Si quiere eliminar Tor completamente, y su cuenta tiene privilegios -de administrador, proceda como sigue:

-
    -
  1. Abra una Terminal o sesión x-term.
  2. -
  3. cd /Library/Tor
  4. -
  5. sudo -s
  6. -
  7. ./uninstall_tor_bundle.sh
  8. -
-

Tor y Privoxy están ahora totalmente eliminados de su sistema.

-

Si está usando una versión del instalador Tor que no venga con -el script uninstall_tor_bundle, tendrá que borrar manualmente lo -siguiente:

-
    -
  • /Library/Tor
  • -
  • /Library/Privoxy
  • -
  • /usr/bin/tor
  • -
  • /usr/bin/tor_resolve
  • -
  • /var/log/tor
  • -
  • /usr/share/man/man1/tor.1
  • -
  • /usr/share/man/man1/tor-resolve.1
  • -
  • /usr/share/man/man1/torify.1
  • -
  • /Library/Receipts/Privoxy.pkg/
  • -
  • /Library/Receipts/privoxyconf.pkg/
  • -
  • /Library/Receipts/Tor.pkg/
  • -
  • /Library/Receipts/torstartup.pkg/
  • -
  • /Library/StartupItems/Tor
  • -
  • /Library/StartupItems/Privoxy
  • -
-
-

Si tiene sugerencias para mejorar este documento, por favor envíenoslas. ¡­Gracias!

-
-
-
-
-

- Webmaster - - Última modificación: Tue Feb 26 19:27:13 2008 - - - Última compilación: Sun Mar 2 17:35:39 2008 -

-

"Tor" y el "Logo de la Cebolla" son -marcas registradas de El Proyecto Tor, S.A. -

-

- Aviso: Esta traducción podría estar obsoleta. La revisión original en inglés es la - 13768 mientras que esta revisión está basada en la - 12809. -

-

- Esta página también está disponible en los siguientes idiomas: - English, français, Italiano, polski.
- Cómo establecer el idioma por defecto del documento. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-osx.html.fr tor-0.2.2.16-alpha/doc/website/tor-doc-osx.html.fr --- tor-0.2.0.34/doc/website/tor-doc-osx.html.fr 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-osx.html.fr 1970-01-01 00:00:00.000000000 +0000 @@ -1,250 +0,0 @@ - - - - Mac OS X : Installation - - - - - - -
- - - - - - - -
-
-

Utiliser le client Tor sous Mac OS X

-
-

-Notez que ce sont les instructions d'installation pour utiliser le client Tor sous -MacOSX. Si vous voulez installer un relais Tor pour aider à faire grandir le -réseau (n'hésitez pas), lisez la page Configurer un serveur. -

-
- -

Etape Un : Télécharger et installer Tor

-
-

-Les dernières versions stables et expérimentales de Tor pour Macintosh -OS X contiennent Tor, -Vidalia (une interface graphique pour Tor), -et Privoxy (un proxy web filtrant) -dans un seul paquet, préconfigurés pour fonctionner ensemble. -Télécharger un paquet sur la page de -téléchargement. -

-

Notre Installateur pour Tor devrait rendre les choses assez simples. Ci-dessous une -copie d'écran de la page de configuration :

-page de lancement de l'installateur de tor -

Une fois l'installation terminée, vous pouvez lancer Vidalia en sélectionnant son icône -depuis le répertoire "Applications". Un oignon noir avec une croix rouge signifie -que Tor n'est pas actif. Vous pouvez le démarrer en sélectionnant "Start" dans le -menu « Tor » en haut de votre écran. -

-

Losque Tor est lancé, l'icône Vidalia ressemble à ce qui suit : -

-vidalia utilisant tor -

Privoxy est installé avec le reste du paquet -Tor. Une fois qu'il est installé, il sera démarré automatiquement au prochain -redémarrage de votre machine. -Il n'est pas nécessaire de configurer Privoxy pour utiliser Tor — une version adaptée - pour Tor de Privoxy a été installée avec le reste du paquet. -

-
- -

Etape Deux : Configurer vos applications pour utiliser Tor

-
-

Après avoir installé Tor et Privoxy, vous devez configurer vos -applications pour les utiliser. La prochaine action consiste à configurer le navigateur web.

-

Si vous utilisez Firefox (ce que nous vous recommandons), installez simplement l'extension Torbutton, -redémarrez votre Firefox, cliquez sur le bouton rouge « Tor Disabled » -pour l'activer, et vous êtes prêt :

-Torbutton plugin for Firefox -
-

-(En savoir plus sur -Torbutton ici. -Si vous envisagez de faire tourner Firefox sur un ordinateur différent de Tor, jetez un œil à l'entrée FAQ -traitant de l'utilisation de Tor sur un ordinateur différent. Si vous avez besoin -d'utiliser un navigateur autre que Firefox, vous aurez à configurer son proxy vous même.) -

-

Apple Safari

-

Si vous souhaitez utiliser Tor avec Safari, vous aurez à changer -la configuration du réseau. Selectionnez « Préférences Réseau» depuis le menu Apple | -Réseau :

-Network settings -

Sélectionnez l'interface réseau pour laquelle vous souhaitez utiliser Tor. Si vous utilisez -plus d'une seule interface, vous devez changer les paramètres Proxy pour -chacune.

-Network preferences -

-

Sélectionnez et entrez 127.0.0.1 et le port 8118 pour -"Proxy Web (HTTP)" et "Proxy Web sécurisé (HTTPS)". -Vous devriez en faire de même pour "Proxy FTP" et "Proxy Gopher" ; regardez cette -note à propos de Tor et des mandataires ftp. Conservez votre paramètre "Utiliser le mode FTP passif (PASV)" -tel qu'il était.

-Proxy settings -

L'utilisation de privoxy est nécessaire parceque les navigateurs -laisse filtrer vos -requètes DNS quand ils utilisent le proxy socks directement, ce qui est domageable pour -votre anonymat. Privoxy retire également, certains entêtes dangereux de vos -requêtes web, et bloque certains sites pénibles comme Doubleclick.

-

Pour torréfier d'autres applications qui savent utiliser des proxys HTTP, il suffit -de leur indiquer de passer par Privoxy (c'est à dire "localhost" sur le port "8118"). Pour celles qui utilisent SOCKS -directement (messagerie instantanée, Jabber, IRC, etc), vous pouvez les faire passer -directement par Tor ("localhost", prot "9050"), mais regardez d'abord -cette entrée de la FAQ qui vous dira les risques que cela comporte. Pour les applications -qui n'utilisent ni SOCKS ni HTTP, jetez un oeil à connect ou -socat.

-

Pour davantage d'information sur comment torréfier d'autres applications, voyez le -Torréfaction -HOWTO. -

-
- -

Étape trois : s'assurer que ça fonctionne

-
-

-Ensuite, vous devriez essayez d'utiliser votre navigateur avec Tor et vous -assurer que votre adresse IP est bien anonymisée. Cliquez sur -le -détecteur Tor -et voyez s'il pense que vous passer par Tor ou non. -(si ce site est inaccessible, voyez cette entrée de la -FAQ pour davantage de suggestion sur comment tester votre Tor.) -

-

Si vous avez un pare-feu personnel qui limite la -capacité de votre ordinateur à se connecter à lui même, assurez vous de permettre les connexions à -vos applications locales aux ports 8118 et 9050. Si -votre pare-feu bloque les connexions sortantes, faites un trou pour -qu'il puisse au moins se connecter sur les ports 80 et 443, et lisez cette entrée de la -FAQ. -

-

Si ça ne marche toujours pas, regardez cette entrée de la -FAQ pour quelques astuces.

-
- - -

Étape quatre : configurer Tor comme relais

-
-

Le réseau Tor repose sur des contributeurs qui donnent de la bande passante. Plus il -y a de gens qui font tourner un relais, plus le réseau sera rapide. Si vous avez -au moins 20 kilo octets/s dans chaque sens, aidez Tor en le configurant -comme relais. Nous avons plusieurs options qui rendent Tor facile -et agréable, par exemple la limitation de bande passante consommée, les contrôles sur ports de sortie pour -que vous puissiez limiter votre expositions aux plaintes, et le support des -adresses dynamiques.

-

Avoir des relais dans plein de lieux différents sur Internet c'est -ce qui sécurise les utilisateurs. Vous -auriez également d'avantage d'anonymat, -puisque les sites distants ne pourraient pas savoir si une connexion vient de votre -ordinateur ou si elle est relayée d'un autre.

-

Lisez d'avantage sur le guide configurer un relais -

-
- -

Comment désinstaller Tor et Privoxy

-
-

La série des Tor 0.1.0.x et au delà ont une ligne de commande ou un désinstalleur -Terminal-centré. Si vous voulez supprimer Tor de votre OSX, voici comment faire :

-

Revenez aux paramétrages d'origine de votre proxy. - Si vous souhaitez simplement ne plus passer par Tor, vous pouvez vous arrêter là.

-

Si vous voulez supprimer Tor complètement, et que votre compte a des privilèges -d'administration, procédez comme suit :

-
    -
  1. Ouvrez un terminal ou une session x-term.
  2. -
  3. cd /Library/Tor
  4. -
  5. sudo -s
  6. -
  7. ./uninstall_tor_bundle.sh
  8. -
-

Tor et Privoxy sont maintenant complètement supprimés de votre système.

-

Si vous utilisez une version qui ne fourni pas -le script uninstall_tor_bundle, vous aurez à manuellement -détruire ce qui suit :

-
    -
  • /Library/Tor
  • -
  • /Library/Privoxy
  • -
  • /usr/bin/tor
  • -
  • /usr/bin/tor_resolve
  • -
  • /var/log/tor
  • -
  • /usr/share/man/man1/tor.1
  • -
  • /usr/share/man/man1/tor-resolve.1
  • -
  • /usr/share/man/man1/torify.1
  • -
  • /Library/Receipts/Privoxy.pkg/
  • -
  • /Library/Receipts/privoxyconf.pkg/
  • -
  • /Library/Receipts/Tor.pkg/
  • -
  • /Library/Receipts/torstartup.pkg/
  • -
  • /Library/StartupItems/Tor
  • -
  • /Library/StartupItems/Privoxy
  • -
-
-

Si vous avez des suggestions pour étoffer ce document, n'hésitez à nous les faire parvenir. Merci !

-
-
-
-
-

- Webmaster - - Dernière modification : Tue Feb 26 19:27:13 2008 - - - Dernière compilation : Sun Mar 2 17:35:49 2008 -

-

"Tor" et le Logo Onion sont des marques déposées du Projet Tor, Inc. -

-

- Attention: Cette traduction peut être obsolète. La version anglaise originale est la - 13768 alors que la version traduite est basée sur la - 12809. -

-

- Cette page est aussi disponible dans les langues suivantes : - English, español, Italiano, polski.
- Comment configurer la langue par défaut du document. -

-

Les développeurs de Tor n'ont pas revu cette traduction en ce qui concerne la - pertinence et l'exactitude. Elle peut être obsolète ou fausse. La version - officielle du site web Tor est la version anglaise, disponible sur https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-osx.html.it tor-0.2.2.16-alpha/doc/website/tor-doc-osx.html.it --- tor-0.2.0.34/doc/website/tor-doc-osx.html.it 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-osx.html.it 1970-01-01 00:00:00.000000000 +0000 @@ -1,246 +0,0 @@ - - - - Tor: istruzioni per installare Tor su Mac OS X - - - - - - -
- - - - - - - -
-
-

Usare il client Tor su Mac OS X

-
-

-Queste sono le istruzioni per installare e usare un client Tor -su Mac OS X. Se invece vuoi offrire banda e traffico per aiutare a fare crescere la rete Tor -(sì, grazie!), leggi la guida per configurare un relay. -

-
- -

Uno: scarica e installa Tor

-
-

-Le ultime versioni stabile e sperimentale di Tor for Mac -OS X comprendono Tor, -Vidalia (una GUI per Tor), -e Privoxy (un filtro proxy web) -in un unico pacchetto preconfigurato. -Scaricali dalla pagina -di download. -

-

L'installer di Tor dovrebbe rendere tutto semplicissimo. Qui sotto -ecco una schermata dell'installazione -

-tor installer splash page -

Dopo che il programma di installazione è terminato, puoi avviare Vidalia selezionandone l'icona -dalla cartella Applicazioni. Una cipolla di colore scuro con una X rossa nel dock significa -che Tor non è in esecuzione. Puoi eseguire Tor selezionando Start dal menu -"Tor" nella parte superiore dello schermo. -

-

Quando Tor 6egrave; in esecuzione, l'icona del dock di Vidalia ha questo aspetto: -

-vidalia running tor -

Privoxy viene installato insieme al pacchetto di installazione di Tor. -Una volta installato viene eseguito automaticamente quando -riavii il tuo computer. -Non occorre configurare Privoxy per usare Tor. Infatti col pacchetto di installazione -è stata installata anche una configurazione ad hoc di Privoxy per Tor. -

-
- -

Due: configura i tuoi programmi per usare Tor

-
-

Dopo avere installato Tor e Privoxy, occorre configuare i propri -programmi perché li usino. Per prima cosa configuriamo il browser web.

-

se usi Firefox (raccomandato), basta installare il plugin Torbutton -riavviare Firefox, far clic sulla scritta rossa "Tor disabled" per -avviare Tor, ed è tutto: -Torbutton plugin for Firefox -
-

-(Ulteriori informazioni su -Torbutton . -Se usi Firefox su un computer diverso da quello su cui gira Tor, leggi la FAQ -per usare Tor su un pc diverso. Se devi -usare un browser diverso da Firefox, dovrai configurare il proxy da te.) -

-

Apple Safari

-

Se vuoi usare Tor con Safari, devi modificare le -impostazioni di rete. Seleziona le Preferenze di Rete dal menu Apple | -Location :

-Network settings -

Seleziona l'interfaccia di rete su cui abilitare Tor. Se ne usi -più di una occorre definire i settaggi del proxy per ciascuna -di esse.

-Network preferences -

-

Seleziona e definisci 127.0.0.1 porta 8118 per -Web Proxy (HTTP) e per Secure Web Proxy (HTTPS). -Fai la stessa cosa per "FTP Proxy" e "Gopher Proxy"; vedi questa -nota a proposito di Tor e ftp proxy. Lascia inalterato il settaggio "Use Passive FTP Mode" -(PASV).

-Proxy settings -

È necessario usare privoxy perché i browser -rivelano -le richieste DNS se usano un SOCKS proxy direttamente, cosa che non -va bene per il tuo anonimato. Privoxy inoltre rimuove alcuni header pericolosi dalle tue -richieste web e blocca alcuni fastidiosi siti pubblicitari come Doubleclick.

-

Per usare Tor con altre applicazioni che supportano proxy HTTP, basta -puntarli a Privoxy (ovvero a localhost porta 8118). Per usare SOCKS -direttamente (per l'instant messaging, Jabber, IRC, etc), puoi puntare la tua applicazione -direttamente a Tor (localhost porta 9050), ma leggi anche questa -FAQ che spiega perché può essere pericoloso. Per le applicazioni -che non supportano né SOCKS né HTTP, dai un'occhiata a connect o a -socat.

-

Per informazioni su come torificare altri programmi, guarda il -Torify -HOWTO. -

-
- -

Tre: controlla che funzioni

-
-

-Ora devi provare Tor col tuo browser per controllare -che il tuo indirizzo IP sia anonimo. Fai clic sul -Tor -detector e controlla se rileva che stai usando Tor oppure no -(se questo sito è giù, vedi questa -FAQ per altri modi di testare il tuo Tor). -

-

Se hai un personal firewall che limita le connessioni del tuo pc -a se stesso, controlla che siano permesse le connessioni dalle -applicazioni locali alla porta locale 8118 e alla porta 9050. Se -il tuo firewall blocca le connessioni in uscita, permettigli di -collegarsi almeno alle porte TCP 80 e 443, poi leggi questa -FAQ. -

-

Se nemmeno ora funziona, guarda questa -FAQ per ulteriori indicazioni.

-
- - -

Quattro: configura Tor come relay

-
-

La rete Tor funziona grazie alla banda donata dai volontari. Più -persone aprono un relay, più veloce sarà la rete Tor. Se hai almeno -20 kilobyte/s in download e upload, aiuta Tor e configura la tua installazione -Tor come relay. Ci sono tante funzionalità che rendono un Tor relay facile -e pratico, come il controllo della banda, exit policy per -limitare il rischio di abusi e lamentele, e il supporto per indirizzi -IP dinamici.

-

La distribuzione di relay in tanti luoghi diversi della rete -rende più sicuri gli utenti di Tor. Puoi -ottenere un migliore anonimato tu stesso, -dato che non sarà possibile sapere se una connessione è partita dal tuo -computer o è stata trasportata da un altro nodo Tor.

-

Leggi la guida come configurare un relay -.

-
- -

Disinstallare Tor and Privoxy

-
-

Le versioni di Tor della serie 0.1.0.x hanno un disinstallatore a riga di comando o -da Terminale. Se vuoi rimuovere Tor da OSX, ecco come fare:

-

Riporta la configurazione proxy dei tuoi programmi ai valori originali. -Se ti interessa semplicemente smettere di usare Tor, puoi fermarti qui.

-

Se invece vuoi rimuovere completamente Tor, e il tuo account ha privilegi di -amministratore, fai così:

-
    -
  1. Apri una sessione del Terminale o di x-term.
  2. -
  3. cd /Library/Tor
  4. -
  5. sudo -s
  6. -
  7. ./uninstall_tor_bundle.sh
  8. -
-

Tor e Privoxy sono ora completamente rimossi dal tuo sistema.

-

Se usi una versione dell'installer Tor che non ha lo -script uninstall_tor_bundle, devi cancellare manualmente -i seguenti file e directory:

-
    -
  • /Library/Tor
  • -
  • /Library/Privoxy
  • -
  • /usr/bin/tor
  • -
  • /usr/bin/tor_resolve
  • -
  • /var/log/tor
  • -
  • /usr/share/man/man1/tor.1
  • -
  • /usr/share/man/man1/tor-resolve.1
  • -
  • /usr/share/man/man1/torify.1
  • -
  • /Library/Receipts/Privoxy.pkg/
  • -
  • /Library/Receipts/privoxyconf.pkg/
  • -
  • /Library/Receipts/Tor.pkg/
  • -
  • /Library/Receipts/torstartup.pkg/
  • -
  • /Library/StartupItems/Tor
  • -
  • /Library/StartupItems/Privoxy
  • -
-
-

Se hai delle proposte per migliorare questo documento, per favore -inviacele. Grazie!

-
-
-
-
-

- Webmaster - - Ultima modifica: Sun Mar 2 17:31:18 2008 - - - Ultima compilazione: Sun Mar 2 17:35:44 2008 -

-

"Tor" e l'"Onion Logo" sono marchi registrati di The Tor Project, Inc. -

-

- Questa pagina è disponibile anche nelle lingue seguenti: - English, español, français, polski.
- Come configurare la lingua predefinita per i documenti. -

-

Questa traduzione non è stata controllata dagli sviluppatori di - Tor. Può essere obsoleta o errata. Il sito - ufficiale di Tor è in inglese, all'indirizzo https://torproject.org/ -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-osx.html.pl tor-0.2.2.16-alpha/doc/website/tor-doc-osx.html.pl --- tor-0.2.0.34/doc/website/tor-doc-osx.html.pl 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-osx.html.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,240 +0,0 @@ - - - - Tor: Instrukcje instalacji dla Mac OS X - - - - - - -
- - - - - - - -
-
-

Uruchamianie klienta Tor na Mac OS X

-
-

-To są instrukcje do instalacji klienta Tora na systemie Mac OS X. Jeśli chcesz - przekazywać ruch innych, by wspomóc rozwój sieci (prosimy), przeczytaj poradnik o Konfigurowaniu przekaźnika sieci Tor. -

-
- -

Krok 1: Pobranie i instalacja Tora

-
-

Najnowsze stabilne i eksperymentalne wydania Tora dla Mac OS X zawierają - Tora, - Vidalia (GUI dla Tora), - i Privoxy (filtrujący serwer pośredniczący proxy) - w jednej paczce, prekonfigurowane do współpracy ze sobą. -Pobierz je ze strony pobierania. -

-

Nasz instalator Tora powinien ułatwić wszystko. Poniżej jest zdjęcie - strony instalacji: -

-Ekran instalacji Tora -

Gdy instalator zakończył pracę, możesz uruchomić program Vidalia poprzez - jego ikonę z twojego folderu Aplikacji. Ciemna cebula z czerwonym krzyżykiem na - pasku oznacza, że w tej chwili Tor nie jest uruchomiony. Możesz uruchomić Tora - wybierając Start z menu "Tor" u góry ekranu. -

-

Gdy Tor działa, ikonka programu Vidalia wygląda tak: -

-Vidalia z działającym Torem -

Privoxy jest instalowane jako część pakietu Tora. Po jego instalacji, - uruchomi siÄ™ automatycznie po restarcie komputera. - Nie musisz konfigurować Privoxy, by używaÅ‚o Tora — taka konfiguracja - Privoxy zostaÅ‚a zainstalowana jako część pakietu instalacyjnego. -

-
- -

Krok 2: Konfiguracja aplikacji, by używały Tora

-
-

Po instalacji Tora i Privoxy musisz skonfigurować swoje aplikacje, by ich używały. - Pierwszym krokiem jest ustawienie sposobu przeglądania sieci WWW.

-

Jeśli używasz przeglądarki Firefox (co zalecamy), po prostu zainstaluj rozszerzenie Torbutton, - ponownie uruchom Firefoksa, kliknij na czerwony przycisk "Tor Disabled" - ("Tor wyłączony"), by włączyć Tora i gotowe: -

-Rozszerzenie Torbutton dla Firefoksa -
-

-(Dowiedz się więcej o - rozszerzeniu Torbutton. - Jeśli masz zamiar używać Firefoksa na innym komputerze niż tam, gdzie jest Tor, spójrz na wpis w FAQ - na temat uruchamiania Tora na innym komputerze. Jeśli musisz używać innej - przeglądarki niż Firefox, musisz samodzielnie - skonfigurować jej ustawienia proxy.) -

-

Apple Safari

-

Jeśli chcesz używać Tora z przeglądarką Safari, musisz zmienić swoje - ustawienia sieci. Wybierz Ustawienia Sieci (Network Preferences) z menu Apple | - Location:

-Ustawienia sieci -

Wybierz interfejs sieciowy, na którym chcesz uruchomić Tora. Jeśli używasz - więcej niż jednego interfejsu, musisz zmienić ustawienia proxy dla każdego - z nich osobno.

-Ustawienia sieci -

-

Wpisz 127.0.0.1 i port 8118 zarówno do serwera proxy WWW (HTTP), jak i - do bezpiecznego WWW (HTTPS). Powinieneś to zrobić także dla serwerów - proxy dla FTP i protokołu Gopher, zobacz tę - informację na temat Tora i serwerów FTP proxy. Pozostaw ustawienie - trybu pasywnego FTP (PASV) bez zmian.

-Proxy settings -

Korzystanie z Privoxy jest konieczne, gdyż żądania DNS - z przeglądarek wyciekają, gdy przeglądarki używają bezpośrednio serwera pośredniczącego SOCKS, - co uniemożliwia zachowanie pełnej anonimowości. Privoxy usuwa również pewne - niebezpieczne nagłówki z żądań WWW i blokuje okropne serwisy z banerami, jak Doubleclick.

-

By "storyfikować" inne aplikacje, które używają proxy dla HTTP, po prostu - skieruj je na Privoxy (czyli localhost, port 8118). By aplikacje bezpośrednio używały - serwera SOCKS (do komunikatorów, Jabbera, IRC, itp.), skieruj je - bezpośrednio na Tora (localhost, port 9050), ale przeczytaj ten - wpis do FAQ, dlaczego to może być niebezpieczne. Jeśli aplikacja nie - obsługuje ani proxy dla HTTP, ani dla SOCKS, spójrz na connect lub - socat.

-

Po informacje, jak "storyfikować" inne aplikacje, spójrz na - Torify - HOWTO. -

-
- -

Krok 3: Upewnij się, że wszystko działa

-
-

Teraz powinieneś spróbować użyć swojej przeglądarki z Torem i - upewnić się, że Twój adres IP jest anonimizowany. Kliknij na - wykrywacz - Tora i sprawdź, cze jego zdaniem używasz Tora czy nie. - (Jeśli ta strona akurat nie działa, przeczytaj ten - wpis w FAQ, by poznać więcej sposobów na testowanie swojego Tora.) -

-

Jeśli masz zaporę ogniową, która ogranicza możliwości Twojego komputera co - do łączenia się z samym sobą, zezwól w niej na połączenia od programów - lokalnych na porty lokalne 8118 i 9050. Jeśli zapora blokuje połączenia - wychodzące, spraw, by można się było połączyć choć z portami 80 i 433, - po czym przeczytaj ten - wpis do FAQ. -

-

Jeśli dalej nie działa, spójrz na ten - wpis FAQ, by poszukać wskazówek.

-
- - -

Krok 4: Konfiguracja Tora jako przekaźnika sieci

-
-

Sieć Tora polega na ochotnikach oddających część swojego łącza. Im więcej - ludzi uruchomi przekaxnik sieci, tym szybsza będzie sieć Tora. Jeśli masz co najmniej - 20 kilobajtów/s w obie strony, pomóż Torowi, konfigurując swojego klienta tak, - by był także przekaźikiem sieci. Mamy wiele cech, które czynią przekaźniki Tora łatwymi i - wygodnymi, łącznie z ograniczeniem przepustowości, politykami wyjścia, byś mógł - zmniejszyć ryzyko skarg, oraz obsługą dynamicznych adresów IP.

-

Posiadanie przekaźników w wielu różnych miejscach w sieci sprawia, że - użytkownicy są bezpieczni. Ty - też możesz mieć lepszą anonimowość, gdyż serwery, do których się łączysz, - nie mogą stwierdzić, czy połączenie pochodzi z Twojego komputera, czy - zostało przekierowane z innych.

-

Przeczytaj szczegóły w naszym przewodniku Konfiguracji -przekaźnika sieci Tor.

-
- -

Jak odinstalować Tora i Privoxy

-
-

Gałąź Tora 0.1.0.x i dalsze mają program odinstalowujący uruchamiany z linii - poleceń (Terminala). Jeśli chcesz usunąć Tora z systemu OSX, oto jak to zrobić:

-

Przywróć ustawienia Proxy w aplikacjach do ich poprzednich wartości. Jeśli chcesz - tylko przestać używać Tora, możesz przerwać na tym kroku.

-

Jeśli chcesz całkowicie usunąć Tora, a twoje konto ma prawa - Administratora, wykonaj co następuje:

-
    -
  1. Otwórz Terminal lub sesję x-term.
  2. -
  3. cd /Library/Tor
  4. -
  5. sudo -s
  6. -
  7. ./uninstall_tor_bundle.sh
  8. -
-

Tor and Privoxy są teraz całkowicie usunięte z systemu.

-

Jeśli używasz instalatora Tora, który nie ma skryptu uninstall_tor_bundle, - musisz ręcznie usunąć następujące elementy:

-
    -
  • /Library/Tor
  • -
  • /Library/Privoxy
  • -
  • /usr/bin/tor
  • -
  • /usr/bin/tor_resolve
  • -
  • /var/log/tor
  • -
  • /usr/share/man/man1/tor.1
  • -
  • /usr/share/man/man1/tor-resolve.1
  • -
  • /usr/share/man/man1/torify.1
  • -
  • /Library/Receipts/Privoxy.pkg/
  • -
  • /Library/Receipts/privoxyconf.pkg/
  • -
  • /Library/Receipts/Tor.pkg/
  • -
  • /Library/Receipts/torstartup.pkg/
  • -
  • /Library/StartupItems/Tor
  • -
  • /Library/StartupItems/Privoxy
  • -
-
-

Jeśli masz pomysły na ulepszenie tej strony, prosimy je do nas wysłać. Dziękujemy!

-
-
-
-
-

- Webmaster - - Ostatnio zmodyfikowane: Sun Mar 2 17:31:17 2008 - - - Ostatnio wygenerowane: Sun Mar 2 17:35:55 2008 -

-

"Tor" i "Onion Logo" (logo cebuli) sÄ… znakami handlowymi The Tor Project, Inc. -

-

- Ta strona jest także dostÄ™pna w nastÄ™pujÄ…cych jÄ™zykach: - English, español, français, Italiano.
- Jak ustawić domyślny język dokumentu. -

-

- Deweloperzy Tora nie sprawdzili tłumaczenia tej strony pod względem dokładności - i poprawności. Tłumaczenie może być przestarzałe lub niepoprawne. Oficjalna strona Tora jest - po angielsku, pod adresem https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-relay.html.en tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.en --- tor-0.2.0.34/doc/website/tor-doc-relay.html.en 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.en 1970-01-01 00:00:00.000000000 +0000 @@ -1,306 +0,0 @@ - - - - Tor: Relay Configuration Instructions - - - - - - -
- - - - - - - -
-
-

Configuring a Tor relay

-
-

-The Tor network relies on volunteers to donate bandwidth. The more -people who run relays, the faster the Tor network will be. If you have -at least 20 kilobytes/s each way, please help out Tor by configuring your -Tor to be a relay too. We have many features that make Tor relays easy -and convenient, including rate limiting for bandwidth, exit policies so -you can limit your exposure to abuse complaints, and support for dynamic -IP addresses.

-

Having relays in many different places on the Internet is what -makes Tor users secure. You -may also get stronger anonymity yourself, -since remote sites can't know whether connections originated at your -computer or were relayed from others.

-

Setting up a Tor relay is easy and convenient: -

    -
  • Tor has built-in support for rate -limiting. Further, if you have a fast link -but want to limit the number of bytes per day -(or week or month) that you donate, check out the hibernation -feature. -
  • -
  • Each Tor relay has an exit -policy that specifies what sort of outbound connections are allowed -or refused from that relay. If you are uncomfortable allowing people -to exit from your relay, you can set it up to only allow connections -to other Tor relays. -
  • -
  • It's fine if the relay goes offline sometimes. The directories -notice this quickly and stop advertising the relay. Just try to make -sure it's not too often, since connections using the relay when it -disconnects will break. -
  • -
  • We can handle relays with dynamic IPs just fine — simply -leave the Address config option blank, and Tor will try to guess. -
  • -
  • If your relay is behind a NAT and it doesn't know its public -IP (e.g. it has an IP of 192.168.x.y), you'll need to set up port -forwarding. Forwarding TCP connections is system dependent but this -FAQ entry offers some examples on how to do this. -
  • -
  • Your relay will passively estimate and advertise its recent -bandwidth capacity, so high-bandwidth relays will attract more users than -low-bandwidth ones. Therefore having low-bandwidth relays is useful too. -
  • -
-

You can run a Tor relay on -pretty much any operating system, but see this -FAQ entry for advice about which ones work best and other problems -you might encounter.

-
- -

Step Zero: Download and Install Tor

-
-

Before you start, you need to make sure that Tor is up and running. -

-

For Windows users, this means at least step one -of the Windows Tor installation howto. Mac OS X users need to do at least -step one -of OS X Tor installation howto. Linux/BSD/Unix users should do at least -step one -of the Unix Tor installation howto. -

-

If it's convenient, you might also want to use it as a client for a -while to make sure it's actually working.

-
- -

Step One: Set it up as a relay

-
-

-1. Verify that your clock is set correctly. If possible, synchronize -your clock with public time servers. -

-

-2. Make sure name resolution works (that is, your computer can resolve -Internet addresses correctly). -

-

-3. Edit the bottom part of your torrc. (See this -FAQ entry for help.) -Make sure to define at least Nickname and ORPort. Create the DataDirectory -if necessary, and make sure it's owned by the user that will be running -tor. If you want to run more than one relay that's great, but -please set the -MyFamily option in all your relays' configuration files. -

-

-4. If you are using a firewall, open a hole in your firewall so -incoming connections can reach the ports you configured (ORPort, plus -DirPort if you enabled it). Make sure you allow all outgoing connections, -so your relay can reach the other Tor relays. -

-

-5. Restart your relay. If it logs -any warnings, address them. -

-

-6. Subscribe to the or-announce -mailing list. It is very low volume, and it will keep you informed -of new stable releases. You might also consider subscribing to or-talk (higher volume), -where new development releases are announced. -

-

-7. Have a look at the manual. -The manual for the -latest stable version provides a list of all the possible configuration -options for both clients and relays. -If you are running the development version of Tor, the manual is available -here. -

-
- -

Step Two: Make sure it's working

-
-

As soon as your relay manages to connect to the network, it will -try to determine whether the ports you configured are reachable from -the outside. This may take up to 20 minutes. Look for a -log -entry like -Self-testing indicates your ORPort is reachable from the outside. Excellent. -If you don't see this message, it means that your relay is not reachable -from the outside — you should re-check your firewalls, check that it's -testing the IP and port you think it should be testing, etc. -

-

When it decides that it's reachable, it will upload a "server -descriptor" to the directories. This will let clients know -what address, ports, keys, etc your relay is using. You can load one of -the network statuses manually and -look through it to find the nickname you configured, to make sure it's -there. You may need to wait a few seconds to give enough time for it to -make a fresh directory.

-
- -

Step Three: Once it's working

-
-

-We recommend the following steps as well: -

-

-8. Read -this document -to get ideas how you can increase the security of your relay. -

-

-9. Decide what exit policy you want. By default your relay allows -access to many popular services, but restricts some (such as port 25) -due to abuse potential. You might want an exit policy that is -less restrictive or more restrictive; edit your torrc appropriately. -Read the FAQ entry on issues you might -encounter if you use the default exit policy. -If you choose a particularly open exit policy, you should make -sure your ISP is ok with that choice. -If there are any resources that your computer can't reach (for example, -you are behind a restrictive firewall or content filter), please -explicitly reject them in your exit policy — otherwise Tor users -will be impacted too. -

-

-10. Decide about rate limiting. Cable modem, DSL, and other users -who have asymmetric bandwidth (e.g. more down than up) should -rate limit to their slower bandwidth, to avoid congestion. See the rate -limiting FAQ entry for details. -

-

-11. Back up your Tor relay's private key (stored in "keys/secret_id_key" -in your DataDirectory). This is your relay's "identity," and -you need to keep it safe so nobody can read the traffic that goes -through your relay. This is the critical file to keep if you need to move -or restore your Tor relay if something goes wrong. -

-

-12. If you control the name servers for your domain, consider setting -your hostname to 'anonymous' or 'proxy' or 'tor-proxy', so when other -people see the address in their web logs, they will more quickly -understand what's going on. -

-

-13. If your computer isn't running a webserver, please consider -changing your ORPort to 443 and your DirPort to 80. Many Tor -users are stuck behind firewalls that only let them browse the -web, and this change will let them reach your Tor relay. Win32 -relays can simply change their ORPort and DirPort directly -in their torrc and restart Tor. OS X or Unix relays can't bind -directly to these ports (since they don't run as root), so they will -need to set up some sort of -port forwarding so connections can reach their Tor relay. If you are -using ports 80 and 443 already but still want to help out, other useful -ports are 22, 110, and 143. -

-

-14. If your Tor relay provides other services on the same IP address -— such as a public webserver — make sure that connections to the -webserver are allowed from the local host too. You need to allow these -connections because Tor clients will detect that your Tor relay is the safest -way to reach that webserver, and always build a circuit that ends -at your relay. If you don't want to allow the connections, you must -explicitly reject them in your exit policy. -

-

-15. (Unix only). Make a separate user to run the relay. If you -installed the OS X package or the deb or the rpm, this is already -done. Otherwise, you can do it by hand. (The Tor relay doesn't need to -be run as root, so it's good practice to not run it as root. Running -as a 'tor' user avoids issues with identd and other services that -detect user name. If you're the paranoid sort, feel free to put Tor -into a chroot jail.) -

-

-16. (Unix only.) Your operating system probably limits the number -of open file descriptors per process to 1024 (or even less). If you -plan to be running a fast exit node, this is probably not enough. On -Linux, you should add a line like "toruser hard nofile 8192" to your -/etc/security/limits.conf file (where toruser is the user that runs the -Tor process), and then restart Tor if it's installed as a package (or log -out and log back in if you run it yourself). If that doesn't work, see this -FAQ entry for other suggested ways to run "ulimit -n 8192" before -you launch Tor. -

-

-17. If you installed Tor via some package or installer, it probably starts -Tor for you automatically on boot. But if you installed from source, -you may find the initscripts in contrib/tor.sh or contrib/torctl useful. -

-

-When you change your Tor configuration, remember to verify that your -relay still works correctly after the change. Be sure to set your -"ContactInfo" line in the torrc so we can contact you if you need to -upgrade or something goes wrong. If you have problems or questions, see -the Support section or -contact us on the tor-ops list. Thanks -for helping to make the Tor network grow! -

-
-

If you have suggestions for improving this document, please send them to us. Thanks!

-
-
-
-
-

- Webmaster - - Last modified: Sun Mar 2 17:31:17 2008 - - - Last compiled: Sun Mar 2 17:35:35 2008 -

-

"Tor" and the "Onion Logo" are trademarks of The Tor Project, Inc. -

-

- This page is also available in the following languages: - español, français, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- How to set the default document language. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-relay.html.es tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.es --- tor-0.2.0.34/doc/website/tor-doc-relay.html.es 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.es 1970-01-01 00:00:00.000000000 +0000 @@ -1,315 +0,0 @@ - - - - Instrucciones de Configuración del Repetidor - - - - - - -
- - - - - - - -
-
-

Configurar un repetidor Tor

-
-

-La red Tor se apoya en voluntarios que donen ancho de banda. Cuanta -más gente ejecute repetidores, más rápida será la red Tor. Si tiene -por lo menos 20 kilobytes/s en cada dirección, por favor ayuda a Tor -configurando su Tor para que también sea repetidor. Tenemos muchas -características que hacen a los repetidores Tor fáciles y convenientes, -incluyendo limitación de velocidad para el ancho de banda, políticas de -salida para que pueda limitar su exposición a quejas de abuso, y soporte -para direcciones IP dinámicas. -

-

Tener repetidores en muchos sitios diferentes de Internet es lo que hace -a los usuarios de Tor seguros. -También puede que usted consiga más anonimato, -ya que los sitios de destino no pueden saber si las conexiones se origiraron en -su ordenador o fueron reenviadas desde otros.

-

Configurar un repetidor Tor server es fácil y práctico: -

    -
  • Tor tiene soporte integrado de -limitación de velocidad. Además, si tiene un enlace rápido -pero quiere limitar el número de bytes por día (o semana o mes) que dona, -mire la característica -de hibernación. -
  • -
  • Cada repetidor Tor tiene una política -de salida que especifica qué clase de conexiones salientes se permiten -o se rechazan desde ese repetidor. Si le incomoda permitir a la gente -salir desde su repetidor, puede configurarlo para que sólo permita conexiones -a otros servidores Tor. -
  • -
  • No pasa nada si el repetidor se desconecta a veces. Los directorios -lo notan rápido y dejan de anunciar el servidor. Sólo asegúrese de -que no sea muy a menudo, ya que las conexiones que estén usando el servidor cuando -se desconecte se romperán. -
  • -
  • Podemos manejar repetidores con IPs dinámicas sin problemas — -simplemente deje la opción de configuración Address en blanco, y Tor -intentará adivinarla. -
  • -
  • Si tu repetidor está detrás de un NAT y no conoce su dirección IP pública -(e.g. tiene una IP de 192.168.x.y), tendrá que configurar el redireccionamiento -de puertos. Redireccionar conexiones TCP depende del sistema pero esta -entrada de la FAQ ofrece algunos ejemplos de cómo hacer esto. -
  • -
  • Su repetidor estimará y anunciará su capacidad de ancho de banda -reciente, así que los repetidores con gran ancho de banda atraerán más usuarios -que los de poco ancho de banda. Por tanto, tener repetidores con poco -ancho de banda también es útil. -
  • -
-

Se puede ejecutar un repetidor Tor en casi cualquier sistema operativo, -pero vea esta -entrada de la FAQ para sugerencias acerca de cuáles funcionan mejor y -otros problemas que pudiera encontrarse.

-
- -

Paso Cero: Descargar e Instalar Tor

-
-

Antes de empezar, debe asegurarse de que Tor está activo y ejecutándose. -

-

Para usuarios Windows, esto significa al menos el paso uno -del howto de instalación de Tor en Windows. Los usuarios de Mac OS X deben hacer al menos -el paso uno -del howto de instalación de Tor en OS X. Los usuarios de Linux/BSD/Unix deberían hacer al menos -el paso uno -del howto de instalación de Tor en Unix. -

-

Si es oportuno, también puede que quiera usarlo de cliente un tiempo -para asegurarse de que realmente funciona.

-
- -

Paso Uno: Configurarlo como repetidor

-
-

-1. Verifique que su reloj está en hora. Si es posible, sincronice su -reloj con servidores de tiempo públicos. -

-

-2. Asegúrese de que la resolución de nombres funciona (eso quiere decir -que su ordenador puede resolver direcciones de Internet correctamente). -

-

-3. Edite la parte de abajo de su torrc. (Vea esta -entrada en la FAQ para ayuda.) -Asegúrese de definir al menos Nickname y ORPort. Cree el DataDirectory -en caso necesario, y asegúrese de que el dueño es el usuario que ejecutará -tor. Si quiere ejecutar más de un repetidor estupendo, pero -por favor active la -opción MyFamily en todos los ficheros de configuración de sus repetidores. -

-

-4. Si usa un cortafuegos, abra un agujero en el cortafuegos para -que las conexiones entrantes puedan alcanzar los puertos que ha configurado en el paso 3 -(ORPort, más DirPort si lo ha activado). Asegúrese de permitir todas las conexiones -salientes, para que su repetidor pueda llegar a los otros repetidores Tor. -

-

-5. Rearranque su repetidor. Si en el log -aparecen advertencias, resuélvalas. -

-

-6. Subscríbase a la lista de correo or-announce. -Tiene muy poco tráfico, y le mantendrá informado de nuevas versiones -estables. También puede considerar subscribirse a or-talk (de más tráfico), -donde se anuncian las nuevas versiones de desarrollo. -

-

-7. Échele un vistazo al manual. -El manual de la -última versión estable da una lista de todas las posibles opciones de configuración -tanto para clientes como para repetidores. -Si ejecuta la versión de desarrollo de Tor, el manual está disponible -aquí. -

-
- -

Paso Dos: Asegurarse de que funciona

-
-

En cuanto su repetidor consiga conectarse a la red, intentará -determinar si los puertos que configuró son accesibles desde el exterior. -Esto puede tardar hasta 20 minutos. Busque una -entrada -en el log como -Self-testing indicates your ORPort is reachable from the outside. Excellent. -Si no ve este mensaje, significa que su repetidor no es accesible desde el exterior -— debería re-revisar sus cortafuegos, comprobar que esté -comprobando la IP y el puerto que usted crea que debería estar comprobando, etc. -

-

Cuando decida que es accesible, subirá un "descripor de servidor" -a los directorios. Esto permitirá a los clientes conocer qué dirección, -puertos, llaves, etc usa su servidor. Puede cargar uno de los -status de red manualmente y mirarlo entero para encontrar el nickname -que configuró, para asegurarse de que está allí. Puede que necesite esperar -unos segundos para darle suficiente tiempo para generar un directorio nuevo.

-
- -

Paso Tres: Una vez que funcione

-
-

-También recomendamos los siguientes pasos: -

-

-8. Lea -este documento -para coger ideas de cómo aumentar la seguridad de su repetidor. -

-

-9. Decida qué política de salida quiere. Por defecto su repetidor permite -acceso a muchos servicios populares, pero restringe algunos (como el -puerto 25) debido al potencial de abuso. Puede que quiera una política -de salida que sea menos restrictiva o más restrictiva; edite su torrc -apropiadamente. Lea la entrada de la FAQ acerca de cuestiones con las que podría -encontrarse si usa la política de salida por defecto. -Si elige una política de salida particulamente abierta, debería asegurarse -de que su ISP está de acuerdo con esa elección. -Si hay algunos recursos que su ordenador no pueda acceder (por ejemplo, -si está detrás de un cortafuegos restrictivo o un filtro de contenido), -por favor rechácelos explícitamente en su política de salida — -en caso contrario a los usuarios de Tor también les afectará. -

-

-10. Decida acerca de la limitación de velocidad. Los usuarios de cable, -DSL, y otros usuarios que tienen ancho de banda asimétrico (e.g. más -de descarga que de subida) deberían limitar la velocidad a su ancho de -banda más lento, para evitar congestión. Vea la entrada -de la FAQ sobre limitación de velocidad para detalles. -

-

-11. Haga una copia de seguridad de la llave privada de su servidor Tor -(almacenada en "keys/secret_id_key" en su DataDirectory). Esta es la -"identidad" de su repetidor, y necesitará mantenerla a salvo para que nadie -pueda leer el tráfico que va a través de su repetidor. Este es el fichero -crítico a guardar si necesita mover -o restaurar su repetidor Tor si algo va mal. -

-

-12. Si controla los servidores de nombres de su dominio, considere -llamar a su host 'anonymous' o 'proxy' o 'tor-proxy', para que cuando -otra gente vea la dirección en sus web logs, entiendan más rápido qué -está pasando. -

-

-13. Si su ordenador no ejecuta un servidor web, por favor -considere cambiar su ORPort a 443 y su DirPort a 80. Muchos usuarios -de Tor están atrapados detrás de cortafuegos que sólo les permiten ver -la web, y este cambio les permitirá acceder a su repetidor Tor. Los -repetidores en Win32 pueden simplemente cambiar su ORPort y DirPort directamente -en su torrc y reiniciar Tor. Los repetidores OS X y Unix servers no pueden escuchar -directamente en esos puertos (ya que no se ejecutan como root), así que -tendrán que configurar algun tipo de -redirección de puertos para que las conexiones puedan acceder a su servidor Tor. -Si ya usa los puertos 80 y 443 pero todavía quiere ayudar, otros puertos útiles son el -22, 110, y 143. -

-

-14. Si su repetidor Tor da otros servicios en la misma dirección IP -— como un servidor web público — asegúrese de que las conexiones al -servidor web se permiten desde el host local también. Necesitará permitir estas -conexiones porque los clientes Tor detectarán que su repetidor Tor es la forma -más segura de llegar a ese servidor web, y siempre construirán un circuito que termine -en su repetidor. Si no quiere permitir las conexiones, debe rechazarlas explícitamente en su -política de salida. -

-

-15. (Sólo Unix). Cree un usuario separado para ejecutar el repetidor. Si -instaló el paquete OS X o el deb o el rpm, ya está hecho. En caso contrario, -puede hacerlo a mano. (El repetidor Tor no necesita ejecutarse como root, -así que es buena práctica no ejecutarlo como root. Ejecutarlo como el -usuario 'tor' evita problemas con identd y otros servicios que detectan -el nombre de usuario. Si eres del tipo paranoico, siéntase libre de poner Tor -en una cárcel chroot.) -

-

-16. (Sólo Unix.) Su sistema operativo probablemente limita el número de -descriptores de fichero abiertos por proceso a 1024 (o incluso menos). -Si planea ejecutar un nodo de salida rápido, probablemente no sea suficiente. -En Linux, debería añadir una línea como "toruser hard nofile 8192" a su -fichero /etc/security/limits.conf (donde toruser es el usuario que ejecuta -el proceso Tor), y reiniciar Tor si se instaló como paquete (o salga de su -cuenta y vuelva a entrar si lo ejecuta directamente). Si eso no funciona, vea esta -entrada de la FAQ para otras sugerencias para ejecutar "ulimit -n 8192" antes de -ejecutar Tor. -

-

-17. Si instaló Tor usando algún paquete o instalador, probablemente ejecute Tor -automáticamente al arrancar. Pero si lo instaló desde las fuentes, -puede que encuentre los scripts de arranque en contrib/tor.sh o contrib/torctl útiles. -

-

-Cuando cambie su configuración Tor, recuerde verificar que su repetidor todavía funciona -correctamente tras el cambio. Asegúrese de rellenar su línea "ContactInfo" en el torrc -para que podamos contactar con usted si necesita actualizarse o algo va mal. Si tiene -problemas o preguntas, vea la sección de Soporte -or contáctenos en la lista tor-ops. ¡Gracias por ayudar a -hacer crecer la red Tor! -

-
-

Si tiene sugerencias para mejorar este documento, por favor envíenoslas. ¡Gracias!

-
-
-
-
-

- Webmaster - - Última modificación: Tue Feb 26 19:27:13 2008 - - - Última compilación: Sun Mar 2 17:35:40 2008 -

-

"Tor" y el "Logo de la Cebolla" son -marcas registradas de El Proyecto Tor, S.A. -

-

- Aviso: Esta traducción podría estar obsoleta. La revisión original en inglés es la - 13768 mientras que esta revisión está basada en la - 13194. -

-

- Esta página también está disponible en los siguientes idiomas: - English, français, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Cómo establecer el idioma por defecto del documento. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-relay.html.fr tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.fr --- tor-0.2.0.34/doc/website/tor-doc-relay.html.fr 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.fr 1970-01-01 00:00:00.000000000 +0000 @@ -1,316 +0,0 @@ - - - - Instruction de configuration d'un relais - - - - - - -
- - - - - - - -
-
-

Configurer un relais Tor

-
-

-Le réseau Tor repose sur des contributeurs qui offrent de leur bande passante. Plus -il y'aura de gens à faire tourner un relais, plus le réseau sera rapide. Si vous avez -au moins 20 kilo octets/s dans chaque sens, aidez Tor en le configurant -comme relais. Nous avons plusieurs options qui rendent Tor facile -et agréable, par exemple la limitation de bande passante consommée, les contrôles sur ports de sortie -pour que vous puissiez limiter votre expositions aux plaintes, et le support des -adresses dynamiques.

-

Avoir des relais dans plein de lieux différents sur Internet c'est -ce qui sécurise les utilisateurs. Vous -auriez également d'avantage d'anonymat, -puisque les sites distants ne pourraient pas savoir si une connexion vient de votre -ordinateur ou si elle est relayée d'un autre.

-

Paramétrer un relais Tor est facile et commode : -

    -
  • Tor a des fonctions intégrées pour la limitation -de bande passante. De plus, si vous avez une ligne rapide -mais souhaitez limiter le nombre d'octets échangés par jour -(ou semaine ou mois) que vous offrez, regardez la fonctionnalité d'hibernation -. -
  • -
  • Chaque relais Tor a une politique -de sortie qui spécifie quelles sortes de trafic sortant sont autorisées -ou refusées depuis ce relais. Si vous êtes géné à l'idée de laisser des gens -sortir par votre connexion, vous pouvez paramétrer Tor pour qu'il ne se connecte -qu'à d'autres relais Tor. -
  • -
  • Ce n'est pas grave que le relais soit coupé de temps en temps. Les annuaires -le note rapidement et stoppent la propagation du relais. Assurez vous simplement -que ça n'arrive pas trop souvent, puisque les connexions en cours dans le -relais seront coupées. -
  • -
  • Nous pouvons prendre en compte les relais avec une adresse IP dynamique — veillez -simplement à laisser l'option de configuration « Address » à vide, et Tor essayera de la deviner. -
  • -
  • Si votre relais est derrière un NAT et qu'il ne connait pas son adresse IP -publique (par exemple si l'IP est 192.168.x.y), vous aurez à paramétrer une -translation de port. La translation de port est dépendante du système mais cette entrée -de la FAQ offre quelques exemple sur comment le faire. -
  • -
  • Votre relais va de manière passive estimer et propager sa capacité récente -en terme de bande passante, ainsi les relais à fort débit attireront davantage d'utilisateurs que -ceux en ayant un faible. Bien qu'avoir un relais à petit débit soit tout de même utile. -
  • -
-

Vous pouvez faire tourner un relais Tor sur -pratiquement n'importe quel système, mais voyez cette -entrée de la FAQ pour vous documenter sur ceux qui fontionnent le mieux et les différents problèmes -que vous seriez suceptibles de rencontrer.

-
- -

Étape zéro : télécharger et installer Tor

-
-

Avant de commencer, vous devez vous assurer que Tor fonctionne correctement. -

-

Pour les utilisateurs Windows, ceci signifie qu'au moins l'étape une -du Guide d'installation de Tor sous Windows est faite. Les utilisateurs de Mac OS X doivent au moins avoir fait -l'étape une -du Guide d'installation de Tor sous OS X. Les utilisateurs Linux/BSD/Unix devraient au moins avoir fait -l'étape une -du guide d'installation de Tor sous Unix. -

-

Si ça vous dit, vous pouvez également l'utiliser comme client pendant -quelques temps pour savoir si ça fonctionne réellement.

-
- -

Étape une : le paramétrer comme relais

-
-

-1. Verifiez que votre horloge est à l'heure. Si possible, synchronisez là -sur un serveur de temps public. -

-

-2. Assurer vous que les résolutions de nom fonctionnent (c'est à dire que, votre ordinateur est -en mesure de résoudre les adresses Internet correctement). -

-

-3. Éditer la partie basse de votre fichier torrc. (Voyez cette entrée -de la FAQ pour l'aide.) -Assurez vous de définir au moins les options Nickname et ORPort. Créez un DataDirectory -si nécessaire, et prenez soin de lui attribuer les droits de l'utilisateur qui fera tourner -Tor. Si vous souhaitez faire tourner plus d'un relais, c'est possible, mais -prenez soin de positionner l'option -MyFamily sur l'ensemble de vos fichiers de configurations relais. -

-

-4. Si vous utilisez un pare-feu, ouvrez le port tel que les -connections entrantes puissent atteindre le port que vous avez configuré (ORPort, et -DirPort si vous l'avez activé). Assurez vous qu'il autorise toutes les connections sortantes -pour que votre relais puisse atteindre les autres relais Tor. -

-

-5. Relancer votre relais. S'il trace -n'importe quel dysfonctionnement, faites nous en part. -

-

-6. Inscrivez vous à la liste de diffusion or-announce. -Il y a relativement peu de messages, et vous tiendra informé -des nouvelles versions stables. Vous devriez aussi envisager de vous inscrire à or-talk (davantage de messages), -où les versions de développement sont annoncées. -

-

-7. Jetez un œil sur le manuel. -Le manuel pour la -dernière version stable contient une liste de toutes les options de configuration possible pour, -à la fois, les clients et les relais. -Si vous utilisez la version de développement de Tor, le manuel est disponible -ici. -

-
- -

Étape deux : assurez vous que ça fonctionne

-
-

Dès que votre relais va tenter de se connecter au réseau, il va -essayer de déterminer si le port que vous avez configuré est atteignable de -l'extérieur. Ceci peut prendre jusqu'à 20 minutes. Jetez un Å“il sur les -traces - du genre -Self-testing indicates your ORPort is reachable from the outside. Excellent. -Si vous ne voyez pas ce message, ça signifie que votre relais n'est pas atteignable -de l'extérieur — vous devriez revérifier vos pare-feux, vérifier qu'il -teste l'adresse IP et le port que vous penser qu'il devrait tester, etc. -

-

Quand votre relais est joignable, il envoie un « descripteur -de relais » aux annuaires. Ceci permettra aux clients de connaitre -quelle adresse, ports, clé, etc votre relais utilise. Vous pouvez charger l'un des états -du réseau et -voir si vous trouvez dedans le nickname que vous avez configuré, pour être certain qu'il -est là. Vous aurez probablement à attendre quelques secondes pour avoir un -rafraichissement du répertoire.

-
- -

Étape trois : une fois que ça marche

-
-

-Nous recommandons tout aussi bien les étapes suivantes : -

-

-8. Lisez -ce document -pour avoir des idées sur comment accroitre la sécurité de votre relais. -

-

-9. Décidez quelle politique de sortie vous souhaitez. Par défaut, votre relais autorise -l'accès à plusieurs services populaires, mais en restreint certains (comme le port 25) -en raison des abus potentiels. Vous pouvez préférer une politique de sortie qui soit -plus ou moins restrictive ; éditez votre fichier torrc de manière appropriée. -Lisez l'entrée de la FAQ sur les les problèmes que vous seriez suceptible -de rencontrer si vous utilisez la politique par défaut. -Si vous choisissez une politique de sortie particulièrement ouverte, assurez vous -que votre fournisseur d'accès est d'accord avec ce choix. -S'il y'a des ressources que votre ordinateur ne peux atteindre (par exemple, -vous êtes derrière un pare-feu restrictif ou un filtrage applicatif, prenez soin -de les rejeter explicitement dans votre politique de sortie — sinon les utilisateurs de Tor -seront également impactés. -

-

-10. Décidez de la limitation de débit. Le cable, les xDSL, et les utilisateurs -qui ont une bande passante asymétrique (par exemple : plus de débit en téléchargement qu'en envoi) devraient -limiter leur débit à la plus petite bande passante pour éviter les congestions. Voyez l'entrée FAQ sur -la limitation de débit pour plus de détails. -

-

-11. Sauvegardez la clé privée de votre relais Tor (stockée dans "keys/secret_id_key" -de votre DataDirectory). C'est l'« identité » de votre relais, et -prenez soin de la garder en sécurité pour que personne ne puisse lire le trafic qui passe -au travers de votre nœud. C'est un fichier critique à conserver si vous compter déplacer -ou restorer votre relais Tor si quelque chose se passe mal. -

-

-12. Si vous contrôlez le serveur de nom de votre domaine, n'hésitez pas à -paramétrer votre nom d'hôte avec 'anonymous' or 'proxy' or 'tor-proxy', pour que les -autres personnes voyant l'adresse dans les traces web puissent facilement comprendre -ce qui se passe. -

-

-13. Si votre ordinateur ne fait pas tourner un serveur web, envisagez de -changer l'option ORPort à 443 et votre DirPort à 80. Un certain nombre d'utilisateur - Tor sont cloitrés derrière des pare-feux qui ne leur permettent que d'aller sur le -web, et ce changement leur permettra d'atteindre votre relais Tor. Les relais -Windows peuvent simplement changer leurs options ORPort et DirPort directement -dans leur configuration torrc et relancer Tor. Les relais OS X ou Unix ne peuvent pas attacher -directement ces ports (puisqu'ils doivent être lancé en root), alors ils doivent -paramétrer une sorte de -translation de port pour que les connections puissent atteindre leur relais Tor. Si vos ports -80 et 443 sont déjà utilisés mais que vous souhaitez quand même aider, d'autres sont interessant comme -les ports 22, 110, et 143. -

-

-14. Si votre relais Tor apporte d'autres services sur la même adresse IP -— comme par exemple un site web — assurez vous que les connexions -au serveur web sont autorisées à partir de l'hôte local également. Vous devez faire ça -parceque les clients Tor détecteront que le relais Tor est le le chemin -le plus sûr pour atteindre le serveur web, et construira toujours un chemin qui finira -par votre relais. Si vous ne souhaitez pas autoriser les connexions, vous devrez -explicitement les rejeter dans votre politique de sortie. -

-

-15. (Unix uniquement). Créer un utilisateur séparé pour faire tourner le relais. Si vous -installez le paquet OS X ou deb ou rpm, ceci est déjà -fait. Sinon, vous devez le faire à la main. (Le relais Tor ne nécessite pas d'être -lancé sous root, c'est une bonne pratique de ne pas le faire. Le lancer -sous l'utilisateur 'tor' évite les problèmes avec identd et d'autres services qui -détectent le nom d'utilisateur. Si vous êtes dans le genre paranoïaque, sentez vous libre de mettre Tor -dans une prison chroot.) -

-

-16. (Unix uniquement.) Votre système d'exploitation limite probablement le nombre -de fichier ouvert par processus à 1024 (voir moins). Si vous -envisagez de faire tourner un nœud de sortie rapide, ceci ne sera sans doute pas suffisant. Sous -Linux, vous ajoutez une ligne genre "toruser hard nofile 8192" à votre fichier -/etc/security/limits.conf (ou toruser est l'utilisateur qui fait tourner le -processus Tor), et ensuite relancer Tor s'il est installé comme paquet (ou déconnectez vous -puis reconnectez vous si vous le lancez par vous même). Si ça ne fonctionne pas, voyez cette entrée de la -FAQ pour d'autre suggestions permettant de faire "ulimit -n 8192" avant -de lancer Tor. -

-

-17. Si vous installez Tor à partir d'une installation automatisée, il le lance probablement -automatiquement pour vous au démarrage du système. Mais si vous l'installez par les sources, -vous trouverez surement les scripts de demarrage situés dans contrib/tor.sh ou contrib/torctl utiles. -

-

-Quand vous changez la configuration de votre Tor, -assurez vous qu'il fonctionne encore après les modifications. -Assurez vous de bien positionner votre ligne « ContactInfo » dans le fichier torrc -pour que nous puissions vous contacter en cas de mise à jour ou si quelque chose se passait mal. -Si vous avez des problèmes ou des questions, voyez -la section d'aide ou -contactez nous sur la liste tor-ops. Merci -de nous aider à faire croitre le réseau Tor ! -

-
-

Si vous avez des commentaires pour étoffer ce document, n'hésitez pas à nous en faire part. Merci !

-
-
-
-
-

- Webmaster - - Dernière modification : Tue Feb 26 19:27:13 2008 - - - Dernière compilation : Sun Mar 2 17:35:49 2008 -

-

"Tor" et le Logo Onion sont des marques déposées du Projet Tor, Inc. -

-

- Attention: Cette traduction peut être obsolète. La version anglaise originale est la - 13768 alors que la version traduite est basée sur la - 13194. -

-

- Cette page est aussi disponible dans les langues suivantes : - English, español, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Comment configurer la langue par défaut du document. -

-

Les développeurs de Tor n'ont pas revu cette traduction en ce qui concerne la - pertinence et l'exactitude. Elle peut être obsolète ou fausse. La version - officielle du site web Tor est la version anglaise, disponible sur https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-relay.html.it tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.it --- tor-0.2.0.34/doc/website/tor-doc-relay.html.it 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.it 1970-01-01 00:00:00.000000000 +0000 @@ -1,311 +0,0 @@ - - - - Tor: struzioni per configurare un relay Tor - - - - - - -
- - - - - - - -
-
-

Configurare un relay Tor

-
-

-La rete Tor è formata da volontari che offrono la propria banda. Quante -più persone hanno un relay, tanto più veloce sarà la rete Tor. Se hai -almeno 20 kilobyte/s sia up che down, aiuta la rete configurando il tuo Tor -come relay. Gestire un relay Tor è semplice e ci sono funzionalità -molto comode, come il controllo della banda usata, exit policy che permettono -di ridurre il rischio di lamentele e abusi, ed il supporto per indirizzi IP -dinamici.

-

Con dei relay sparsi in molti luoghi diversi su Internet, gli utenti -Tor sono più sicuri. Puoi -avere tu stesso un anonimato maggiore, -dato che i siti remoti non potranno sapere se la connessione è partita dal tuo -computer o da un altro nodo precedente.

-

Realizzare un server Tor è semplice: -

    -
  • Tor ha un sistema nativo per il controllo -della banda. Se poi hai un collegamento veloce, -ma vuoi limitare i byte che metti a disposizione ogni giorno -(oppure ogni settimana o mese), leggi della funzionalità -di ibernazione. -
  • -
  • Ciascun relay Tor ha una exit -policy che stabilisce quali connessioni in uscita sono permesse -o bloccate. Se preferisci non consentire agli altri l'uscita dal tuo -relay, puoi definire l'exit policy per permettere solo collegamenti -verso altri relay Tor. -
  • -
  • Se il tuo relay qualche volta si scollega, non c'è problema. Le directory -infatti se ne accorgono presto e cessano di pubblicarlo. Cerca però di non -farlo cadere troppo di frequente, perché le connessioni che in quel momento stanno -usando il relay vengono interrotte. -
  • -
  • Si può realizzare un relay anche con un indirizzo IP dinamico — basta -lasciare vuota l'opzione Address config e Tor ricaverà da solo l'indirizzo. -
  • -
  • Se il tuo relay è in NAT e non conosce il suo IP -pubblico (es. ha un IP simile a 192.168.x.y), dovreai configurare il port -forwarding. Il forwarding delle connessioni TCP varia da sistema a sistema, ma in questa -FAQ ci sono vari esempi di come fare. -
  • -
  • Il tuo relay fa una stima passiva della banda recentemente disponibile -e la pubblicizza, e quindi i relay a larga banda attrarranno più utenti di -quelli con meno banda. Per questo anche i relay con poca banda sono molto utili. -
  • -
-

Puoi realizzare un relay Tor -su quasi tutti i sistemi operativi, ma leggi questa -FAQ per indicazioni sul sistema operativo più adatto e per i problemi -tecnici che potresti avere.

-
- -

Zero: scarica e installa Tor

-
-

Prima di iniziare, assicurati che Tor sia installato e funzioni. -

-

Gli utenti Windows devono seguire il passo uno -della guida di installazione Tor su Windows. Gli utenti di Mac OS X devono seguire il -passo uno -della guida di installazione Tor su OS X. Gli utenti Linux/BSD/Unix devono completare il -passo uno -della guida di installazione Tor su Unix. -

-

Per comodità potresti usarlo come client per un po', in -modo da assicurarti che funzioni correttamente.

-
- -

Uno: configura Tor come relay

-
-

-1. Controlla che l'orologio di sistema sia preciso. Se possibile sincronizzalo -con un time server pubbico. -

-

-2. Controlla che funzioni la risoluzione dei nomi (in altre parole, il tuo computer deve potere -risolvere correttamente gli indirizzi per mezzo del DNS). -

-

-3. Modifica la parte finale del file torrc. (Vedi questa -FAQ per un aiuto). -Definisci come minimo almeno Nickname e ORPort. Crea la DataDirectory -se necessario, e controlla che sia di proprietà dell'utente con cui girerà -tor. Se vuoi gestire più di un relay, per favore -definisci l'opzione -MyFamily nei file di configurazione di tutti i tuoi relay. -

-

-4. Se usi un firewall, aprilo in modo da permettere alle connessioni -in arrivo di raggiungerele porte che hai configurato (ORPort, anche -DirPort se l'hai abilitata). Controlla che siano permesse tutte le connessioni in uscita, -per permettere al tuo relay di raggiungere gli altri server Tor. -

-

-5. Riavvia il relay. Se segnala -dei messaggi di avviso, esaminali. -

-

-6. Iscriviti alla mailing list or-announce. -Ha un traffico molto basso e serve ad informarsi sulle -nuove versioni stabili. Potresti anche iscriverti a or-talk (traffico più alto), -in cui vengono annunciate le nuove versioni di sviluppo. -

-

-7. Leggi il manuale. -Il manuale dell' -ultima versione stabile ha una lista di tutte le opzioni di configurazione -possibili per client e relay. -Se usi la versione di sviluppo di Tor, il manuale è disponibile -qui. -

-
- -

Due: controlla che funzioni

-
-

Appena il relay si collega alla rete, cerca -di capire se le porte che hai configurato sono raggiungibili dall' -esterno. Ci vogliono fino a 20 minuti. Cerca -riga del -log così -Self-testing indicates your ORPort is reachable from the outside. Excellent. -Se non trovi questo messaggio, significa che il tuo relay non è raggiungibile -dall'esterno — ricontrolla il firewall, controlla che il relay usi -l'IP giusto, etc. -

-

Quando il relay stabilisce di essere raggiungibile, invia un "server -descriptor" alle directory. In questo modo i client sapranno -quale indirizzo, che porta, che chiave, etc usi il tuo server. Puoi caricare manualmente -uno dei network status e -scorrerlo per cercare il nickname che hai configurato, per essere certo che -sia lì. Potrebbe volerci qualche secondo per dare il tempo di -creare una directory aggiornata.

-
- -

Tre: quando funziona

-
-

-Raccomandiamo anche le seguenti operazioni: -

-

-8. Leggi -questo documento -su come aumentare la sicurezza del tuo relay. -

-

-9. Scegli una exit policy. Di default il tuo relay consente -l'accesso a molti servizi, ma ne limita alcuni (come la porta 25) -a causa dei potenziali abusi. Potresti applicare una exit policy più -o meno restrittiva; per farlo modifica il tuo file torrc. -Leggi la FAQ sui problemi che potresti -avere con la exit policy di default. -Se scegli di applicare una exit policy particolarmente aperta, assicurati -che per il tuo ISP non ci siano problemi. -Se il tuo computer non può raggiungere certe risorse (ad esempio, -se sei dietro un firewall restrittivo o dietro un content filter), per favore -rifiutali esplicitamente nella tua exit policy — altrimenti anche gli utenti Tor -ne verrebbero pregiudicati. -

-

-10. Decidi se applicare un rate limiting. Le ADSL, i modem via cavo e tutti -coloro che hanno banda asimmetrica (es. più down che up) dovrebbero -definire un rate limit alla banda più lenta, per evitare congestioni. vedi la rate -limiting FAQ per maggiori dettagli. -

-

-11. Fai un backup della chiave privata del tuo relay Tor (è in "keys/secret_id_key" -nella tua DataDirectory). Essa costituisce l'identità del tuo relay ed -è importante custodirla al sicuro in modo che nessuno possa leggere il traffico -che passa dal tuo relay. Questo è un file importante da conservare se dovessi spostare o -ripristinare il tuo server Tor in caso di prolemi. -

-

-12. Se controlli il name server del tuo dominio, potresti chiamare -il tuo host 'anonymous' o 'proxy' o 'tor-proxy', così quando qualcuno -vede il tuo indirizzo nei log del suo webserver, può facilmente -capire di cosa si tratta. -

-

-13. Se non hai un webserver sul tuo computer, potresti cambiare -la ORPort a 443 e la DirPort a 80. Molti utenti Tor -si trovano dietro dei firewall che consentono solo di navigare -sul web, e in questo modo potranno raggiungere comunque il tuo Tor relay. I relay Win32 -possono semplicemente cambiare la ORPort e la DirPort -nel file torrc e riavviare Tor. I server OS X o Unix non possono -collegare direttamente queste porte (perché non girano come root), e quindi -devono usare un apposito -port forwarding per permettere alle connessioni di raggiungere il Tor relay. Se usi già -le porte 80 e 443, ma vuoi aiutare comunque, altre porte -molto utili sono la 22, 110, e 143. -

-

-14. Se il tuo relay Tor fornisce altri servizi sul medesimo indirizzo IP -— ad esempio, un webserver — controlla che sia possibile collegarsi al -webserver anche da localhost. È necessario -perché i client Tor rileveranno che il tuo server è il modo -più sicuro per raggiungere il webserver, e creeranno sempre un circuito che termini -sul tuo relay Tor. Se non vuoi permettere queste connessioni, devi -rifiutarle esplicitamente nella tua exit policy. -

-

-15. (Solo per Unix). Crea un utente separato per il relay. Se hai -installato il pacchetto OS X, il deb o l'rpm, è già così. -Altrimenti puoi farlo a mano. (Il relay Tor non ha bisogno di girare -come root, anzi è buona prassi non eseguirlo come root. Girando -come utente 'tor' si evitano problemi con identd e altri serviziche -rilevano il nome dell'utente. Se sei una persona paranoica, puoi mettere Tor -in un chroot jail.) -

-

-16. (Solo per Unix). Il tuo sistema operativo probabilmente limita il numero -dei file descriptor aperti per ogni processo a 1024 (o meno). Se vuoi -gestire un exit node veloce, probabilmente non basta. Su -Linux, aggiungi una riga come "toruser hard nofile 8192" al file -/etc/security/limits.conf (dove toruser è l'utente del processo -Tor), poi riavvia Tor se è stato installato da pacchetto (o fai un -logout e login se lo avvii tu stesso). Se non dovesse funzionare, vedi questa -FAQ per altri metodi suggeriti per eseguire "ulimit -n 8192" prima -di lanciare Tor. -

-

-17. Se hai installato Tor da qualche pacchetto o installer, Tor si avvierà -automaticamente al boot del sistema. Se però l'hai installato dai sorgenti, -potrebbero esserti utili gli initscript in contrib/tor.sh o contrib/torctl. -

-

-Quando modifichi la configurazione di Tor, ricordati di controllare che -il tuo relay funzioni regolarmente dopo le modifiche. Completa la voce -"ContactInfo" nel file torrc in modo che possiamo contattarti se ci fosse bisogno -di aggiornare o ci fossero dei problemi. Se hai problemi o domande, vedi -la sezione Supporto o la pagina -contact us sulla lista tor-ops. Grazie -del tuo aiuto per far crescere la rete Tor! -

-
-

Se hai suggerimenti per migliorare questo documento, per favore segnalaceli. Grazie!

-
-
-
-
-

- Webmaster - - Ultima modifica: Sun Mar 2 17:31:18 2008 - - - Ultima compilazione: Sun Mar 2 17:35:44 2008 -

-

"Tor" e l'"Onion Logo" sono marchi registrati di The Tor Project, Inc. -

-

- Questa pagina è disponibile anche nelle lingue seguenti: - English, español, français, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Come configurare la lingua predefinita per i documenti. -

-

Questa traduzione non è stata controllata dagli sviluppatori di - Tor. Può essere obsoleta o errata. Il sito - ufficiale di Tor è in inglese, all'indirizzo https://torproject.org/ -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-relay.html.pl tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.pl --- tor-0.2.0.34/doc/website/tor-doc-relay.html.pl 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,303 +0,0 @@ - - - - Tor: Instrukcja konfiguracji przekaźnika sieci - - - - - - -
- - - - - - - -
-
-

Konfiguracja przekaźnika Tora

-
-

Sieć Tora polega na ochotnikach oddających część swojego łącza. Im więcej - ludzi uruchomi przekaźnik, tym szybsza będzie sieć Tora. Jeśli masz co najmniej - 20 kilobajtów/s w obie strony, pomóż Torowi, konfigurując swojego klienta tak, - by był także przekaźnikiem sieci. Mamy wiele cech, które czynią przekaźniki Tora łatwymi i - wygodnymi, łącznie z ograniczeniem przepustowości, politykami wyjścia, byś mógł - zmniejszyć ryzyko skarg, oraz obsługą dynamicznych adresów IP.

-

Posiadanie przekaźników w wielu różnych miejscach w sieci sprawia, że - użytkownicy są bezpieczni. Ty - też możesz mieć lepszą anonimowość, gdyż przekaźniki sieci, do których się łączysz, - nie mogą stwierdzić, czy połączenie pochodzi z Twojego komputera, czy - zostało przekierowane z innych.

-

Uruchomienie przekaxnika Tora jest Å‚atwe i wygodne: -

    -
  • Tor ma wbudowanÄ… obsÅ‚ugÄ™ ograniczania - przepustowoÅ›ci. Ponadto, jeÅ›li masz szybkie Å‚Ä…cze, ale chcesz ograniczyć liczbÄ™ - bajtów na dzieÅ„ (lub tydzieÅ„, lub miesiÄ…c) przeznaczonych dla Tora, spójrz na hibernacjÄ™. -
  • -
  • Każdy przekaźnik sieci Tora ma politykÄ™ - wyjÅ›cia, która okreÅ›la, jakiego typu poÅ‚Ä…czenia wychodzÄ…ce sÄ… dozwolone - lub zabronione na danym przekaźniku sieci. JeÅ›li nie podoba ci siÄ™ to, że poÅ‚Ä…czenia - innych mogÄ… wychodzić z twojego przekaźnika, możesz go ustawić tak, by pozwalaÅ‚ - na poÅ‚Ä…czenia wyÅ‚Ä…cznie do innych przekaźników sieci Tora. -
  • -
  • Twój przekaźnik może czasem być niedostÄ™pny - w porzÄ…dku. Katalogi przekaźników - szybko to odkryjÄ… i przestanÄ… ogÅ‚aszać go jako dostÄ™pny. Tylko niech - okresy wyÅ‚Ä…czenia nie zdarzajÄ… siÄ™ zbyt czÄ™sto, gdyż rozÅ‚Ä…czenie przekaźnika - przerywa wszystkie poÅ‚Ä…czenia, które go używaÅ‚y. -
  • -
  • Dobrze dziaÅ‚ajÄ… również przekaźniki z dynamicznym IP — po prostu pozostaw - pole Address w konfiguracji puste, a Tor spróbuje odgadnąć swój IP. -
  • -
  • JeÅ›li twój przekaźnik jest za NAT-em i nie zna swojego publicznego IP - (np. ma adres postaci 192.168.x.y), bÄ™dziesz musiaÅ‚ ustawić przekierowanie - portów. Przekierowanie portów jest zależne od systemu, ale ten - wpis FAQ podaje kilka przykÅ‚adów, jak to można zrobić. -
  • -
  • Twój przekaźnik pasywnie sam sprawdzi i ogÅ‚osi najnowszÄ… przepustowość - swojego Å‚Ä…cza, wiÄ™c przekaźniki o szerszym Å‚Ä…czu przyciÄ…gajÄ… wiÄ™cej użytkowników - niż te o wÄ…skim. Zatem posiadanie przekaźnika ze sÅ‚abym Å‚Ä…czem też jest przydatne. -
  • -
-

Możesz uruchomić przekaźnik sieci Tora na prawie każdym systemie operacyjnym, ale spójrz na ten - wpis FAQ, by dowiedzieć się, które działają najlepiej oraz o innych problemach, - na które możesz się natknąć.

-
- -

Krok 0: Pobranie i instalacja Tora

-
-

Zanim zaczniesz, upewnij się, że Tor jest uruchomiony i działa. -

-

Użytkownicy Windows muszą wykonać co najmniej krok 1 - w opisie instalacji Tora dla Windows, a użytkownicy MAC OS X muszą wykonać co najmniej krok 1 - w opisie instalacji Tora dla MAC OS X. Użytkownicy Linux/BSD/Unix powinni wykonać co najmniej krok 1 - w opisie instalacji Tora dla systemów Unix. -

-

Jeśli uznasz to za wygodne, możesz najpierw poużywać Tora jako klienta, by - upewnić się, czy rzeczywiście działa.

-
- -

Krok 1: Ustawienie Tora jako przekaźnika sieci

-
-

-1. Sprawdź, czy twój zegar jest dobrze ustawiony. Jeśli jest to możliwe, - zsynchronizuj swój zegar z publicznymi serwerami czasu. -

-

-2. Sprawdź, czy prawidłowo działa rozwiązywanie nazw (tzn. czy twój komputer - potrafi otrzymać prawidłowy adres IP dla podanej nazwy serwera). -

-

-3. Wyedytuj dolną część swojego pliku torrc. (Zajrzyj do tego - wpisu FAQ po pomoc.) - Upewnij się, że podałeś co najmniej Nickname i ORPort. Utwórz katalog podany w DataDirectory, - jeśli jest to potrzebne, i sprawdź, czy właścicielem tego katalogu jest - użytkownik, który będzie uruchamiał Tora. - Jeśli chcesz uruchomić więcej niż jeden przekaźnik, to świetnie, ale ustaw proszę - opcję - MyFamily w plikach konfiguracyjnych wszystkich przekaźników. -

-

-4. Jeśli używasz zapory ogniowej, otwórz w niej przejście, by połączenia - przychodzące mogły dostać sie do skonfigurowanych portów (ORPort, plus - DirPort, jeśli go włączyłeś). Upewnij się, że dozwolone są wszystkie - połączenia wychodzące, aby twój przekaźnik mógł dotrzeć do innych przekaźników Tora. -

-

-5. Uruchom ponownie swój przekaźnik. Jeśli wypisze jakieś ostrzeżenia, - zajmij się nimi. -

-

-6. Zapisz się na listę mailingową or-announce. - Ma ona mały ruch, dzięki niej będziesz informowany o nowych stabilnych wydaniach. - Możesz także zapisać się na or-talk (większy ruch), - gdzie ogłaszane są nowe wydania rozwijane (testowe). -

-

-7. Przejrzyj podręcznik. - Strona podręcznika najnowszej stabilnej wersji - zawiera listę wszystkich możliwych opcji konfiguracyjnych dla klienta i przekaźnika. - Jeśli używasz rozwojowej wersji Tora, - to podręcznik jest tutaj. -

-
- -

Krok 2: Sprawdzenie, czy wszystko działa

-
-

Jak tylko twój przekaźnik zdoÅ‚a poÅ‚Ä…czyć siÄ™ z sieciÄ…, spróbuje okreÅ›lić, - czy skonfigurowane porty sÄ… dostÄ™pne z zewnÄ…trz. To może potrwać do 20 minut. Szukaj - wpisów - do logów w postaci - Self-testing indicates your ORPort is reachable from the outside. Excellent. - JeÅ›li nie widzisz tej wiadomoÅ›ci, to znaczy, że twój przekaźnik nie jest osiÄ…galny z - zewnÄ…trz — powinieneÅ› ponownie sprawdzić ustawienia zapory ogniowej, zobaczyć, - czy sprawdza ten IP i port, który powinien sprawdzać etc. -

-

Gdy Tor stwierdzi, że jest osiągalny z zewnątrz, wyśle "deskryptor serwera" do - serwerów katalogowych. To pozwoli klientom dowiedzieć się, jakiego używasz - adresu, portów, kluczy etc. Możesz ręcznie otworzyć jedną ze stron - zawierających status sieci i poszukać w nim nazwy, którą skonfigurowałeś, by upewnić się, że - tam jest. Możliwe, że będziesz musiał poczekać parę sekund, by utworzony - został świeży katalog serwerów.

-
- -

Krok 3: Gdy już wszystko działa

-
-

-Polecamy też następujące kroki: -

-

-8. Przeczytaj - ten dokument, - by dowiedzieć sie, jak możesz podnieść bezpieczeństwo swojego przekaźnika. -

-

-9. Zdecyduj siÄ™ na politykÄ™ wyjÅ›cia. DomyÅ›lnie twój przekaźnik pozwala na dostÄ™p - do wielu popularnych usÅ‚ug, lecz ogranicza niektóre z nich (jak na przykÅ‚ad port 25) - ze wzglÄ™du na możliwoÅ›ci nadużyć. Być może bÄ™dziesz chciaÅ‚ takÄ… politykÄ™, która - bÄ™dzie mniej lub bardziej restrykcyjna; wtedy odpowiednio zmieÅ„ swój plik torrc. - Przeczytaj w FAQ o sprawach, na które możesz siÄ™ natknąć - podczas używania domyÅ›lnej polityki wyjÅ›cia. - JeÅ›li wybierzesz dość otwartÄ… politykÄ™ wyjÅ›cia, upewnij siÄ™, że twój dostawca internetu - nie ma nic przeciwko. JeÅ›li sÄ… jakiekolwiek zasoby, do których twój komputer nie - może siÄ™ dostać (na przykÅ‚ad, jesteÅ› za restrykcyjnÄ… zaporÄ… ogniowÄ… lub filtrem - zawartoÅ›ci), to jawnie wyÅ‚Ä…cz te zasoby ze swojej polityki wyjÅ›cia — w innym - przypadku dotknie to użytkowników Tora. -

-

-10. Pomyśl o ograniczaniu przepustowości łącza. Użytkownicy sieci kablowych, - DSL oraz inni z asymetrycznym łączem (np. większy download niż upload) powinni - ograniczyć przepustowość Tora do tej mniejszej wartości, by uniknąć zatorów. Przeczytaj wpis do FAQ - na temat ograniczania przepustowości. -

-

-11. Zrób kopię zapasową prywatnego klucza swojego przekaźnika (przechowywanego w - "keys/secret_id_key" w katalogu DataDirectory). To jest "tożsamość" twojego - przekaźnika i musisz trzymać ją w bezpiecznym miejscu, by nikt nie mógł - podsłuchać ruchu, który przechodzi przez twój przekaźnik. To jest najważniejszy plik - do zachowania w przypadku, gdy musisz przenieść - lub odbudować swój przekaźnik Tora jeśli coś pójdzie nie tak. -

-

-12. Jeśli kontrolujesz nazwy serwerów w swojej domenie, rozważ ustawienie - swojej nazwy hosta na 'anonymous' lub 'proxy' lub 'tor-proxy', aby inni - mogli szybciej zrozumieć co się dzieje, gdy zobaczą twój adres w swoich logach. -

-

-13. Jeśli na twoim komputerze nie ma serwera WWW, rozważ zmianę portu ORPort na - 443, a portu katalogowego DirPort na 80. Wielu z użytkowników Tora jest za - zaporami ogniowymi, które pozwalają tylko przeglądać sieć WWW, ta zmiana pozwoli - takim użytkownikom połączyć się z twoim przekaźnikiem. Operatorzy przekaźników pod Win32 - mogą po prostu bezpośrednio zmienić swój ORPort i DirPort w pliku torrc i - ponownie uruchomić Tora. Przekaźniki pod OS X i Unix nie mogą bezpośrednio - podłączyć się do tych portów (gdyż nie są uruchamiane jako root), więc dla nich - trzeba uruchomić jakieś przekierowanie - portów, by połączenia mogły do nich dotrzeć. Jeśli już - używasz portów 80 i 443, ale i tak chcesz pomóc, to innymi użytecznymi portami są - 22, 110 i 143. -

-

-14. JeÅ›li twój przekaźnik sieci Tora ma też inne usÅ‚ugi na tym samym adresie IP - — jak na przykÅ‚ad publiczny serwer WWW — upewnij siÄ™, że - poÅ‚Ä…czenia do tego serwera sÄ… dozwolone także z tego samego komputera. - Musisz zezwolić na te poÅ‚Ä…czenia, gdyż klienci Tora odkryjÄ…, że twój - przekaźnik Tora jest najbezpieczniejszÄ… - drogÄ… do poÅ‚Ä…czenia siÄ™ z tym serwerem, i zawsze zbudujÄ… obwód, który - bÄ™dzie koÅ„czyÅ‚ siÄ™ na twoim przekaźniku. JeÅ›li nie chcesz zezwalać na takie poÅ‚Ä…czenia, - musisz jawnie wykluczyć je w swojej polityce wyjÅ›cia. -

-

-15. (Tylko Unix). Utwórz osobnego użytkownika, na którego prawach będzie uruchamiany - przekaźnik. Jeśli zainstalowałeś paczkę OS X lub deb lub rpm, to wszystko już jest zrobione. - W innym przypadku musisz zrobić to ręcznie. (Przekaźnik Tora nie musi być uruchamiany - jako root, więc dobrze jest nie uruchamiać go jako root. Uruchamianie jako - użytkownik 'tor' unika problemów z indent i innymi usługami, które sprawdzają - nazwę użytkownika. Jeśli jesteś paranoikiem, możesz śmiało umieścić Tora w - chrootowanym środowisku.) -

-

-16. (Tylko Unix) Twój system operacyjny prawdopodobnie ogranicza liczbę - otwartych deskryptorów plików dla każdego procesu do 1024 (lub nawet mniej). Jeśli planujesz - uruchomienie szybkiego węzła wyjściowego, to ta ilość prawdopodobnie - nie wystarczy. W systemie Linux powinieneś dodać linię w stylu "toruser hard nofile 8192" - do swojego pliku /etc/security/limits.conf (toruser oznacza użytkownika, na - którego prawach uruchomiony jest Tor), po czym ponownie uruchomić Tora, jeśli - jest zainstalowany jako pakiet (lub wylogować się i zalogować ponownie, jeśli - uruchamiasz go sam). Jeśli to nie podziała, przeczytaj ten - wpis do FAQ po inne sposoby uruchomienia "ulimit -n 8192" przed startem Tora. -

-

-17. Jeśli zainstalowałeś Tora z jakiejś paczki lub instalatora, prawdopodobnie - uruchamia to Tora automatycznie w czasie ładowania systemu. Ale jeśli instalowałeś - ze źródeł, to mogą ci się przydać skrypty inicjalizacyjne contrib/tor.sh lub contrib/torctl. -

-

Gdy zmieniasz konfigurację Tora, pamiętaj sprawdzić, czy Twój przekaźnik dalej działa - po tych zmianach. Ustaw w pliku torrc opcję "ContactInfo", byśmy mogli się z Tobą - skontaktować, jeśli powinieneś zainstalować nowszą wersję lub coś działa nie tak. - Jeśli masz jakieś problemy lub pytania, przeczytaj sekcję - the Uzyskiwanie pomocy lub - skontaktuj się z nami na liście tor-ops. Dziękujemy, - że pomagasz rosnąć sieci Tora! -

-
-

Jeśli masz pomysły na ulepszenie tej strony, prosimy je do nas wysłać. Dziękujemy!

-
-
-
-
-

- Webmaster - - Ostatnio zmodyfikowane: Sun Mar 2 17:31:17 2008 - - - Ostatnio wygenerowane: Sun Mar 2 17:35:55 2008 -

-

"Tor" i "Onion Logo" (logo cebuli) sÄ… znakami handlowymi The Tor Project, Inc. -

-

- Ta strona jest także dostÄ™pna w nastÄ™pujÄ…cych jÄ™zykach: - English, español, français, Italiano, Русский (Russkij), 中文(简) (Simplified Chinese).
- Jak ustawić domyślny język dokumentu. -

-

- Deweloperzy Tora nie sprawdzili tłumaczenia tej strony pod względem dokładności - i poprawności. Tłumaczenie może być przestarzałe lub niepoprawne. Oficjalna strona Tora jest - po angielsku, pod adresem https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-relay.html.ru tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.ru --- tor-0.2.0.34/doc/website/tor-doc-relay.html.ru 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.ru 1970-01-01 00:00:00.000000000 +0000 @@ -1,314 +0,0 @@ - - - - Tor: ÐаÑтройка Ñервера - - - - - - -
- - - - - - - -
-
-

ÐаÑтройка Ñервера Tor

-
-

-Сеть Tor оÑновываетÑÑ Ð½Ð° добровольцах делÑщихÑÑ Ñвоим трафиком. Чем больше людей -запуÑкают Ñерверы, тем быÑтрее работает Ñеть Tor. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ по крайней мере -20 килобайт/Ñек в каждом направлении, пожалуйÑта помогите Ñети Tor наÑтроив Ñвой -Ñервер. Мы реализовали много чего чтобы Ñделать Ñерверы Tor лёгкими и удобными -в иÑпользовании, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ðµ трафика, Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð°(exit policies), -и поддержку динамичеÑких IP.

-

Размещение Ñерверов в разных уголках Интернета Ñто именно то, что -обеÑпечивает безопаÑноÑÑ‚ÑŒ пользователей Tor. -Ð’Ñ‹ также получаете -более Ñильную анонимноÑÑ‚ÑŒ Ñами, -так как третьи Ñтороны не могут знать кем инициированы ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ - вашим локальным компьютером -или другими узлами Ñети Tor.

-

УÑтановка Ñервера Tor проÑта и удобна: -

    -
  • Tor имеет вÑтроенную поддержку - -Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ°. Более того, еÑли у Ð²Ð°Ñ ÑкороÑтной канал, но вы хотите -ограничить трафик вашего Ñервера за день (или неделю или меÑÑц) то Ñто легко -реализуетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ автоматичеÑкого - -режима бездейÑÑ‚Ð²Ð¸Ñ (hibernation). -
  • -
  • У каждого Ñервера еÑÑ‚ÑŒ ÑÐ²Ð¾Ñ - -политика Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñет какие выходÑщие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ -разрешены или запрещены на Ñтом конкретном Ñервере. ЕÑли вы не хотите -разрешать выходы Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñервера, можно запретить вÑе ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ -кроме как Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ узлами Ñети Tor. -
  • -
  • Ðичего Ñтрашного еÑли Ñервер иногда недоÑтупен в Ñети. Серверы директорий -замечают Ñто довольно быÑтро и переÑтают предлагать недоÑтупный Ñервер. Только -поÑтарайтеÑÑŒ чтобы Ñто не ÑлучалоÑÑŒ чаÑто, Ñ‚.к. уже уÑтановленные Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡Ð°ÑŽÑ‰Ð¸Ð¼ÑÑ -Ñервером ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ñ€Ñ‹Ð²Ð°ÑŽÑ‚ÑÑ. -
  • -
  • Мы без проблем поддерживаем Ñерверы Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑким IP — проÑто оÑтавьте -в файле наÑтроек опцию Address Ñ Ð¿ÑƒÑтым значением, и Tor попытаетÑÑ ÑƒÐ³Ð°Ð´Ð°Ñ‚ÑŒ. -
  • -
  • ЕÑли ваш Ñервер находитÑÑ Ð·Ð° NAT и не знает Ñвой публичный IP -(например IP имеет вид 192.168.x.y), то придётÑÑ Ð½Ð°Ñтроить перенаправление -(port forwarding). Перенаправление TCP Ñоединений Ñто ÑиÑтемно-завиÑÐ¸Ð¼Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ, -но в -Ñтом разделе FAQ еÑÑ‚ÑŒ неÑколько примеров как Ñто делаетÑÑ. -
  • -
  • Ваш Ñервер будет ÑамоÑтоÑтельно оценивать и Ñообщать текущую пропуÑкную -ÑпоÑобноÑÑ‚ÑŒ, и таким образом "толÑтые" Ñервера привлекают больше пользователей. -Следовательно не очень ÑкороÑтные Ñервера тоже полезны. -
  • -
-

Сервер Tor ÑпоÑобен работать на большинÑтве операционных ÑиÑтем, но в - -Ñтом разделе FAQ даны Ñоветы какие ОС подходÑÑ‚ лучше и Ñ ÐºÐ°ÐºÐ¸Ð¼Ð¸ проблемами -можно ÑтолкнутьÑÑ.

-
- -

Шаг нулевой: Скачать и уÑтановить Tor

-
-

Перед тем как приÑтупить к Ñерверу, вы должны убедитьÑÑ Ñ‡Ñ‚Ð¾ Tor запущен и работает. -

-

Ð”Ð»Ñ Windows, Ñто означает по крайней мере -первый шаг -из инÑтрукций по уÑтановке Tor на Windows. -Ðа Mac OS X вы должны выполнить по крайней мере -первый шаг -из инÑтрукций по уÑтановке Tor на OS X. -Ðа Linux/BSD/Unix вы должны выполнить по крайней мере -первый шаг -из инÑтрукций по уÑтановке Tor на Unix. -

-

ЕÑли Ñто возможно, попробуйте иÑпользовать его в качеÑтве клиента -чтобы убедитьÑÑ Ñ‡Ñ‚Ð¾ вÑÑ‘ на Ñамом деле работает.

-
- -

Шаг первый: ÐаÑтройте Ñервер

-
-

-1. Проверьте что чаÑÑ‹ уÑтановлены точно. ЕÑли возможно - Ñинхронизируйте -чаÑÑ‹ Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ Ñерверами времени. -

-

-2. УбедитеÑÑŒ что работает разрешение имён (DNS) (то еÑÑ‚ÑŒ, ваш компьютер -может правильно делать name resolving). -

-

-3. Отредактируйте поÑледнюю чаÑÑ‚ÑŒ файла конфигурации torrc. (КонÑультируйтеÑÑŒ -Ñ Ñтим -разделом FAQ.) -Ð’Ñ‹ должны определить по крайней мере Nickname и ORPort. Создайте каталог DataDirectory -еÑли требуетÑÑ, и убедитеÑÑŒ что он принадлежит пользователю от которого будет запущен -Ñервер. ЕÑли вы хотите запуÑтить более одного Ñервера, Ñто замечательно, -но тогда пожалуйÑта обратите внимание на - -опцию MyFamily в файлах конфигурации Ð´Ð»Ñ Ð²Ñех Ñерверов. -

-

-4. ЕÑли вы иÑпользуете файерволл(брандмауÑÑ€), разрешите входÑщие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ -на порты которые вы указали в torrc (ORPort, и DirPort еÑли вы его включили). -Также разрешите выходÑщие ÑоединениÑ, чтобы ваш Ñервер мог доÑтать другие Ñервера Tor. -

-

-5. ПерезапуÑтите Ñервер. ЕÑли в - -логах поÑвилиÑÑŒ предупреждениÑ, иÑправьте причины их возникновениÑ. -

-

-6. ПодпишитеÑÑŒ на ÑпиÑок раÑÑылки or-announce. -Там очень мало Ñообщений, и вы будете проинформированы о новых Ñтабильных -релизах. Также можно подпиÑатьÑÑ Ð½Ð° ÑпиÑок раÑÑылки -or-talk (побольше Ñообщений будет), -где кроме вÑего прочего объÑвлÑÑŽÑ‚ÑÑ Ñ€ÐµÐ»Ð¸Ð·Ñ‹ в разработке. -

-

-7. Почитайте мануал. -Мануал Ð´Ð»Ñ Ð¿Ð¾Ñледней Ñтабильной верÑии -указывает вÑе возможные наÑтройки Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° и Ñервера. -Мануал Ð´Ð»Ñ Ð¿Ð¾Ñледней разрабатываемой верÑии доÑтупен -здеÑÑŒ. -РуÑÑкий перевод мануала (довольно уÑтаревший) доÑтупен -здеÑÑŒ -

-
- -

Шаг второй: УбедитеÑÑŒ что он работает

-
-

Как только ваш Ñервер Ñможет подÑоединитьÑÑ Ðº Ñети, он попытаетÑÑ -определить доÑтупноÑÑ‚ÑŒ Ñвоих портов Ñнаружи. Это может занÑÑ‚ÑŒ до 20 минут. -Ищите ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² логах -вида Self-testing indicates your ORPort is reachable from the outside. Excellent. -ЕÑли вы не видите подобных Ñообщений, Ñто значит что ваш Ñервер недоÑтупен из Сети -— тогда Ñледует перепроверить фаерволл, проверить что Ñервер пытаетÑÑ Ð´Ð¾ÑтучатьÑÑ -именно до того адреÑа/порта где он должен быть, итд. -

-

Как только Ñервер определит доÑтупноÑÑ‚ÑŒ, он загрузит на Ñервер директорий -Ñвой деÑкриптор (опиÑатель, descriptor). Это позволит клиентам -узнать адреÑ, порты, ключи и другую информацию о вашем Ñервере. -Ð’Ñ‹ можете вручную - -Ñкачать один из ÑтатуÑов Ñети -и найти там nickname Ñвоего Ñервера, чтобы убедитьÑÑ Ñ‡Ñ‚Ð¾ он будет иÑпользоватьÑÑ -клиентами. Может понадобитьÑÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ времени чтобы Ñта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ð»Ð°ÑÑŒ. -

-
- -

Шаг третий: ПоÑле уÑтановки Ñервера

-
-

-Мы рекомендуем предпринÑÑ‚ÑŒ Ñледующие шаги: -

-

-8. Прочитайте -Ñтот документ -чтобы узнать как улучшить безопаÑноÑÑ‚ÑŒ Ñервера. -

-

-9. Решите какую политику выхода применÑÑ‚ÑŒ. По умолчанию Ñервер -разрешает ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ð° многие популÑрные ÑервиÑÑ‹, но запрещает -некоторые (например порт 25) из-за возможных злоупотреблений. -Ð’Ñ‹ можете наÑтроить более жёÑткую или мÑгкую политику Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð°, -Ð´Ð»Ñ Ñтого ÑоответÑтвующим образом отредактируйте torrc. -Прочитайте раздел FAQ чтобы знать -Ñ ÐºÐ°ÐºÐ¸Ð¼Ð¸ проблемами -вы можете вÑтретитÑÑ Ð¿Ñ€Ð¸ иÑпользовании политики по умолчанию. -ЕÑли вы выбираете Ñвободную политику выхода, будьте уверены -что ваш провайдер не против. ЕÑли Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ компьютера невозможно доÑтичь -каких-либо реÑурÑов (например вы находитеÑÑŒ за ограничивающим файерволлом или -фильтром ÑодержаниÑ), пожалуйÑта Ñвно запретите Ñти реÑурÑÑ‹ в вашей политике -выхода — иначе Ñто будет мешать другим пользователÑм Tor. -

-

-10. ОпределитеÑÑŒ Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸ÐµÐ¼ ÑкороÑти. Пользователи кабельных -модемов, DSL, и других типов Ñоединений Ñ Ð°Ñимметричной пропуÑкной ÑпоÑобноÑтью -(например больше входа чем выхода) должны ограничитÑÑ Ð¼ÐµÐ½ÑŒÑˆÐµÐ¹ из двух величин, -дабы избежать перегрузок. Смотрите - -Ñтот раздел FAQ Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ñтей. -

-

-11. Сделайте резервную копию приватного ключа Ñервера (хранитÑÑ Ð² -"keys/secret_id_key" в DataDirectory). Этот ключ идентифицирует ваш Ñервер -и вы должны держать его в безопаÑноÑти, чтобы никто не мог раÑшифровать трафик -идущий через ваш Ñервер. Это критичеÑкий файл который вы должны Ñохранить -в Ñлучае еÑли вам понадобитÑÑ - -передвинуть или воÑÑтановить ваш Ñервер Tor еÑли что-то пойдёт не так. -

-

-12. ЕÑли вы контролируете Ñервера имён Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ домена, уÑтановите -Ð¸Ð¼Ñ Ñ…Ð¾Ñта в 'anonymous' или 'proxy' или 'tor-proxy', Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы -другие люди, увидев ваш домен в Ñвоих логах, быÑтрее могли разобратьÑÑ Ð² -чём дело. -

-

-13. ЕÑли на вашем компьютере нет вебÑервера, пожалуйÑта -уÑтановите ORPort в 443 и DirPort в 80. Много пользователей Tor -закрыты фаерволлами которые только позволÑÑŽÑ‚ им иÑпользовать http, -и Ñто изменение позволит им доÑтичь ваш Ñервер Tor. Серверы на Win32 -могут проÑто изменить Ñвой ORPort и DirPort напрÑмую в torrc -и перезапуÑтить Tor. Серверы OS X и Unix не могут напрÑмую вешатьÑÑ Ð½Ð° Ñтот порт -(так как Ñто требует привилегий ÑуперпользователÑ), поÑтому им понадобитÑÑ -иÑпользовать - -перенаправление портов. ЕÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ занÑÑ‚Ñ‹ порты 80 и 443, но вы хотите -помочь пользователÑм Ñ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ ограничениÑми, то полезно будет назначить порты 22, 110, -или 143. -

-

-14. ЕÑли ваш Ñервер предоÑтавлÑет другие ÑервиÑÑ‹ на Ñтом же IP -— такие как публичный вебÑервер — будьте уверены что ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº Ñерверу -разрешены Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ хоÑта. Ð’Ñ‹ должны разрешить Ñти ÑоединениÑ, так как -клиенты Tor определÑÑ‚ что ваш Ñервер Ñто наиболее - -безопаÑный ÑпоÑоб доÑтичь Ñтот вебÑервер, и будут Ñтроить цепочки которые вÑегда -будут заканчиватьÑÑ Ð½Ð° вашем Ñервере. ЕÑли вы не хотите разрешать Ñто Ñоединение, -вы должны Ñвно запретить его в политике выхода. -

-

-15. (Только Ð´Ð»Ñ Unix). Создайте отдельного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ -запуÑка Ñервера. ЕÑли вы уÑтанавливали из OS X пакета, или deb или rpm -то Ñто уже было Ñделано. Иначе вы можете Ñделать Ñто вручную. Сервер Tor -не требует привилегий root'а Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹, поÑтому правильно будет не -запуÑкать Tor от ÑуперпользователÑ. ЗапуÑк под пользователем 'tor' позволит -избежать проблем Ñ identd и другими ÑервиÑами который определÑÑŽÑ‚ Ð¸Ð¼Ñ -пользователÑ. (ЕÑли вы немного параноик, Ñпокойно запуÑкайте - -Tor в chroot.) -

-

-16. (Только Ð´Ð»Ñ Unix.) Скорее вÑего ваша Ð¾Ð¿ÐµÐ°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÑиÑтема ограничивает -количеÑтво деÑкрипторов открытых файлов на процеÑÑ Ð´Ð¾ 1024 (или даже меньше). -ЕÑли вы планируете иметь выходной узел Tor, то Ñтого может оказатьÑÑ Ð½ÐµÐ´Ð¾Ñтаточно. -Ð’ Linux вы должны добавить Ñтрочку вида "toruser hard nofile 8192" в файл -/etc/security/limits.conf (где toruser Ñто пользователь от которого запуÑкаетÑÑ -процеÑÑ Tor), и перезапуÑтите Tor. ЕÑли Ñто не Ñработало, Ñмотрите - -Ñтот раздел FAQ Ñдругими предложенными ÑпоÑобами выполнить "ulimit -n 8192" -перед запуÑком Tor. -

-

-17. ЕÑли вы уÑтанавливали Tor из пакета или Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ инÑталлÑтора, он наверное -автоматичеÑки Ñтартует при загрузке ÑиÑтемы. Ðо еÑли вы уÑтанавливали из -иÑходников, вам придётÑÑ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ Ñто наÑтраивать, и Ñкрипты contrib/tor.sh и/или -contrib/torctl могут вам пригодитÑÑ. -

-

-Когда вы изменÑете наÑтройки Tor, не забудьте проверить что ваш Ñервер -продолжает корректно работать поÑле изменений. ПожалуйÑта заполните -"ContactInfo" в torrc чтобы мы могли ÑвÑзатьÑÑ Ñ Ð²Ð°Ð¼Ð¸ еÑли вашему Ñерверу -надо будет обновитьÑÑ Ð¸Ð»Ð¸ ÑлучитÑÑ Ñ‡Ñ‚Ð¾-то непредвиденное. ЕÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ -проблемы или вопроÑÑ‹, Ñмотите раздел Помощь -или ÑвÑжитеÑÑŒ Ñ Ð½Ð°Ð¼Ð¸ через лиÑÑ‚ раÑÑылки tor-ops. СпаÑибо за -помощь в развитии Ñети Tor! -

-
-

ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ улучшению Ñтого документа, пожалуйÑта -приÑылайте их нам. СпаÑибо!

-
-
-
-
-

- Webmaster - - ПоÑледние изменениÑ: Sun Mar 2 17:31:17 2008 - - - ПоÑледнÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑциÑ: Sun Mar 2 17:36:01 2008 -

-

"Tor" и "Onion Logo" - торговые марки принадлежащие Tor Project, Inc. -

-

- Эта Ñтраница также переведена на Ñледующие Ñзыки: - English, español, français, Italiano, polski, 中文(简) (Simplified Chinese).
- Как уÑтановить Ñзык документов по умолчанию. -

-

Разработчики Tor не проверÑли Ñтот перевод на точноÑÑ‚ÑŒ и корректноÑÑ‚ÑŒ. - Перевод может быть уÑтаревшим или проÑто неправильным. Официальный веб-Ñайт - Tor на английÑком Ñзыке доÑтупен по адреÑу - https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-relay.html.zh-cn tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.zh-cn --- tor-0.2.0.34/doc/website/tor-doc-relay.html.zh-cn 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-relay.html.zh-cn 1970-01-01 00:00:00.000000000 +0000 @@ -1,257 +0,0 @@ - - - - 中继é…置指导 - - - - - - -
- - - - - - - -
-
-

é…ç½®ä¸€å° Tor 中继

-
-

Tor 网络ä¾é å¿—愿者们贡献带宽è¿è¡Œã€‚è¿è¡Œä¸­ç»§çš„人越多,Tor 网络的速度就越快。 -如果你的网络连接速度达到至少æ¯ç§’ 20KB,请è¿è¡Œä¸€å°ä¸­ç»§ä»¥å¸®åŠ© Tor。 -我们有许多特性使得 Tor 中继的è¿è¡Œç®€å•è€Œæ–¹ä¾¿ï¼ŒåŒ…括带宽的速率é™åˆ¶ï¼Œ -定制出å£ç­–略以é¿å…滥用,以åŠå¯¹äºŽåŠ¨æ€ IP 地å€çš„支æŒã€‚

-

在互è”网上的许多ä¸åŒåœ°æ–¹è¿è¡Œä¸­ç»§ä¿æŠ¤äº† Tor 用户的安全。你 -自身的匿å也能得到更好的ä¿æŠ¤ï¼Œå› ä¸ºç«™ç‚¹ä¸çŸ¥é“连接究竟æ¥è‡ªä½ çš„电脑还是为他人传递。 -

-

è®¾ç½®ä¸€å° Tor 中继既简å•åˆæ–¹ä¾¿ -

    -
  • Tor 内建å³æ”¯æŒé€ŸçŽ‡é™åˆ¶ã€‚ -更进一步地,如果你ä¸é™åˆ¶å¸¦å®½ä½†æ˜¯æƒ³é™åˆ¶æ¯å¤©ï¼ˆæˆ–æ¯æ˜ŸæœŸã€æˆ–æ¯æœˆï¼‰è´¡çŒ®çš„字节数,请查看休眠特性。 -
  • -
  • æ¯å° Tor 中继都有一套出å£ç­–略, -规定了这å°ä¸­ç»§éƒ½å…许或ç¦æ­¢å“ªäº›ç±»åž‹çš„外部连接。如果你对于让其他人从你的中继 -退出感到ä¸å®‰ï¼Œä½ å¯ä»¥å°†å®ƒè®¾ç½®æˆä»…å…许连接到其他 Tor 中继。 -
  • -
  • 如果中继时常下线也没有什么关系。目录æœåŠ¡å™¨ä¼šå¾ˆå¿«å‘现并åœæ­¢å…¬å¸ƒå®ƒã€‚ -但是请ä¸è¦è¿‡äºŽé¢‘ç¹åœ°ä¸‹çº¿ï¼Œå› ä¸ºå½“中继下线时,会破å正在使用这å°ä¸­ç»§çš„连接。 -
  • -
  • 我们能正确处ç†å…·æœ‰åŠ¨æ€ IP 的中继——把“Addressâ€é…置选项留空å³å¯ï¼ŒTor 会å°è¯•çŒœæµ‹ã€‚ -
  • -
  • 如果你的中继ä½äºŽ NAT åŽé¢è€Œä¸”ä¸çŸ¥é“它的公网 IP(例如它的 IP 类似 192.168.x.y), -你需è¦è®¾ç½®ç«¯å£è½¬å‘ã€‚è½¬å‘ TCP 连接的方法因系统而异,但是此 FAQ -æ¡ç›®æ供了如何实现这一目的的一些示例。 -
  • -
  • 你的中继将定期估计并公布它最近的带宽,高带宽的中继将因此å¸å¼•æ›´å¤šçš„用户。 -但是低带宽的中继åŒæ ·æ˜¯æœ‰ç”¨çš„。 -
  • -
-

你能在几乎所有的æ“作系统上è¿è¡Œ Tor 中继,但是请查看此 FAQ -æ¡ç›®ä»¥äº†è§£å“ªäº›æ“作系统更åˆé€‚以åŠä½ å¯èƒ½ä¼šç¢°åˆ°çš„其他问题。 -

-
- -

第零步:下载并安装 Tor

-
-

开始å‰ï¼Œä½ éœ€è¦ç¡®è®¤ Tor å·²ç»æ­£å¸¸è¿è¡Œã€‚

-

对于 Windows 用户,这æ„味ç€è‡³å°‘å®Œæˆ Windows çš„ Tor 安装指导的第一步。Mac OS X 用户需è¦è‡³å°‘å®Œæˆ -OS X çš„ Tor 安装指导的第一步。 -Linux/BSB/Unix 用户需è¦è‡³å°‘å®Œæˆ Unix çš„ Tor 安装指导的第一步。 -

-

如果å¯ä»¥çš„è¯ï¼Œä½ ä¹Ÿè®¸è¿˜åº”该将它作为客户端使用一段时间以确认 Tor 确实工作正常。 -

-
- -

第一步:将它设置æˆä¸­ç»§

-
-

-1ã€æ£€æŸ¥ä½ çš„时间是å¦æ­£ç¡®ã€‚å¯èƒ½çš„è¯ï¼Œä¸Žå…¬å…±çš„时间æœåŠ¡å™¨åŒæ­¥æ—¶é—´ã€‚ -

-

-2ã€ç¡®è®¤å字解æžå·¥ä½œæ­£å¸¸ï¼ˆæ„æ€æ˜¯ï¼Œä½ çš„æœºå™¨èƒ½å¤Ÿæ­£ç¡®è§£æž Internet 地å€ï¼‰ã€‚ -

-

-3ã€ä¿®æ”¹ torrc 的最åŽéƒ¨åˆ†ã€‚(如需帮助,请查看此 FAQ æ¡ç›®ã€‚) -请确认至少定义了 Nickname å’Œ ORPort 选项。需è¦çš„è¯åˆ›å»º DataDirectory 并确认 -这个目录的所有者是将è¦è¿è¡Œ Tor 的用户。如果你打算è¿è¡Œå¤šå°ä¸­ç»§â€”—这太棒了—— -但是请为所有中继的é…置文件加入 MyFamily -选项。 -

-

-4ã€å¦‚果你使用防ç«å¢™ï¼Œè¯·åœ¨é˜²ç«å¢™ä¸Šå¼€å‡ºä¸€ä¸ªæ´žå£ä»¥ä½¿å¾—进入的连接能够到达é…ç½®çš„ç«¯å£ -(ORPort,如果设置的è¯ï¼Œè¿˜æœ‰ DirPort)。请确认你å…许所有的外出连接,这样你的 -中继æ‰èƒ½ä¸Žå…¶ä»– Tor 中继通信。 - -

-

-5ã€é‡å¯ä¸­ç»§ã€‚如果日志中有任何警告信æ¯ï¼Œ -想办法解决它们。 -

-

-6ã€è®¢é˜… or-announce 邮件列表。 -该邮件列表æµé‡éžå¸¸å°ï¼Œå®ƒä¼šåœ¨æ–°çš„稳定版本å‘布时æ醒你。你也å¯ä»¥è€ƒè™‘订阅 or-talk(高æµé‡ï¼‰ï¼Œæ–°çš„å¼€å‘版本 -会在那儿公布。 -

-

-7ã€æ£€é˜…手册。最新稳定版本的手册æ供了一个 -客户端和中继所有å¯èƒ½é…置选项的列表。如果你è¿è¡Œçš„是 Tor çš„å¼€å‘版本, -它的手册在这里。 -

-
- -

第二步:确认它在工作

-
-

一旦你的中继连接上了网络,它就会å°è¯•æ£€æµ‹èƒ½å¦ä»Žå¤–部访问你所é…置的端å£ã€‚ -这一过程最长å¯æŒç»­ 20 分钟。请查看是å¦æœ‰â€œSelf-testing indicates your ORPort -is reachable from the outside. Excellent.â€è¿™æ ·çš„日志æ¡ç›®ã€‚ -如果你没有看到这æ¡æ¶ˆæ¯ï¼Œè¯´æ˜Žä»Žå¤–部ä¸èƒ½è®¿é—®ä½ çš„中继——你应该é‡æ–°æ£€æŸ¥é˜²ç«å¢™è®¾ç½®ï¼Œ -检查测试的 IP 和端å£æ˜¯å¦æ­£ç¡®ï¼Œç­‰ç­‰ã€‚ -

-

当确认能从外部访问中继时,它会å‘目录æœåŠ¡å™¨ä¸Šä¼ ä¸€ä¸ªâ€œæœåŠ¡å™¨æ述符(server -descriptor)â€ã€‚客户端因此知é“你的中继的地å€ã€ç«¯å£ã€å…¬é’¥ç­‰ã€‚为了确认中继 -正常工作,你å¯ä»¥æ‰‹åŠ¨ -下载一份网络状æ€ï¼Œä»Žä¸­æŸ¥æ‰¾ä½ æ‰€é…置的中继的å字。在获得最新的目录å‰ï¼Œ -你需è¦ç­‰å¾…几秒钟的时间。

-
- -

第三步:一旦它开始正常工作

-
-

-我们也推è以下的步骤: -

-

-8ã€é˜…读该文档, -了解如何增强中继的安全性。 -

-

-9ã€è€ƒè™‘你想è¦æ€Žæ ·çš„出å£ç­–略。默认情况下,中继å…许访问多ç§æµè¡Œçš„æœåŠ¡ï¼Œä½†é™åˆ¶ -一些å¯èƒ½æ‹›è‡´æ»¥ç”¨çš„æœåŠ¡ï¼ˆå¦‚ç«¯å£ 25)。你å¯èƒ½æƒ³è¦æ›´å®½æ¾çš„é™åˆ¶ï¼Œä¹Ÿå¯èƒ½æƒ³è¦æ›´ä¸¥æ ¼ -çš„é™åˆ¶ï¼Œè¯·æ ¹æ®éœ€è¦ä¿®æ”¹ torrc。 -请阅读使用默认的出å£ç­–ç•¥å¯èƒ½ä¼šé‡åˆ°çš„问题的 -FAQ æ¡ç›®ã€‚如果你选择了特别开放的出å£ç­–略,你还è¦ç¡®è®¤ä½ çš„ ISP 是å¦ä¼šåŒæ„你的选择。 -如果你的中继有无法访问的资æºï¼ˆä¾‹å¦‚在一个å—é™çš„防ç«å¢™æˆ–内容过滤系统åŽé¢ï¼‰ï¼Œè¯·åœ¨ -出å£ç­–略中明确地拒ç»å®ƒä»¬â€”—å¦åˆ™å…¶ä»– Tor 用户会å—到åŒæ ·çš„å½±å“。 -

-

-10ã€è€ƒè™‘速率é™åˆ¶ã€‚线缆调制解调器ã€DSL 和其他拥有éžå¯¹ç§°å¸¦å®½ï¼ˆå¦‚下行速率大于上行速率) -的用户应将速率é™åˆ¶ä¸ºè¾ƒä½Žçš„那个带宽,以é¿å…拥塞。请查看有关 -速率é™åˆ¶çš„ FAQ æ¡ç›®ã€‚ -

-

-11ã€å¤‡ä»½ Tor 中继的ç§é’¥ï¼ˆåœ¨ DataDirectory 目录里的“keys/secret_id_keyâ€æ–‡ä»¶ä¸­ï¼‰ã€‚ -这是你的中继的“身份è¯â€ï¼Œä½ éœ€è¦ä¿è¯å®ƒçš„安全,这样就没有人能读å–通过你的中继的æµé‡äº†ã€‚ -如果出于什么原因,你需è¦è½¬ç§»æˆ–还原 -Tor 中继,这是你需è¦ä¿å­˜çš„关键文件。 -

-

-12ã€å¦‚果你掌控你的域åçš„åå­—æœåŠ¡å™¨ï¼Œè¯·è€ƒè™‘将主机å设置æˆâ€œanonymousâ€æˆ–“proxyâ€æˆ–“tor-proxyâ€ï¼Œ -这样当他人在他们的 Web 日志中看到你的æœåŠ¡å™¨çš„地å€æ—¶ï¼Œä»–们将更快地知é“å‘生了什么。 -

-

-13ã€å¦‚果你的计算机ä¸åœ¨è¿è¡Œ Web æœåŠ¡å™¨ï¼Œè¯·è€ƒè™‘å°† ORPort æ”¹æˆ 443,将 DirPort -æ”¹æˆ 80。许多 Tor 用户由于防ç«å¢™çš„阻挡åªèƒ½æµè§ˆ Web,这ç§ä¿®æ”¹ä½¿ä»–们能够连接到你的 -Tor 中继。Win32 中继直接在 torrc 里修改 ORPort å’Œ DirPort,然åŽé‡å¯å³å¯ã€‚OS X -å’Œ Unix 中继无法直接绑定这些端å£ï¼ˆå› ä¸ºè¿è¡Œä¸­ç»§çš„用户ä¸æ˜¯ root),它们需è¦è®¾ç½®ç«¯å£ -转å‘以使得连接能够到达 Tor 中继。如果 80 端å£å’Œ 443 端å£å·²è¢«å ç”¨ï¼Œå…¶ä»–常用 -的端å£æ˜¯ 22ã€110 å’Œ 143。 -

-

-14ã€å¦‚果你的 Tor 中继在åŒä¸€ IP 地å€è¿è¡Œå…¶å®ƒæœåŠ¡â€”—例如公开的 Web æœåŠ¡å™¨â€”—请确认 -Web æœåŠ¡å™¨å…许æ¥è‡ªæœ¬åœ°ä¸»æœºçš„连接。这是因为(当用户访问你的网站时)Tor 客户端会 -å‘现你的 Tor 中继是访问 -ä½ çš„ Web æœåŠ¡å™¨çš„最安全的方å¼ï¼Œæ€»æ˜¯ä¼šå»ºç«‹ä¸€æ¡ç»ˆæ­¢äºŽä½ çš„中继的电路。 -如果你ä¸æƒ³å…许这ç§è¿žæŽ¥ï¼Œä½ å¿…须在出å£ç­–略中明确地拒ç»å®ƒä»¬ã€‚ -

-

-15ã€ï¼ˆä»…针对 Unix)。创建一个独立的用户è¿è¡Œä¸­ç»§ã€‚如果你安装的是 OS X 软件包ã€deb -软件包或者 rpm 软件包,这一步已ç»å®Œæˆã€‚在其他情况下,你å¯ä»¥è‡ªå·±åŠ¨æ‰‹å®Œæˆè¿™ä¸€æ­¥ã€‚ -(Tor 中继ä¸éœ€è¦ä»¥ root è¿è¡Œï¼Œå› æ­¤ä¸ä»¥ root è¿è¡Œæ˜¯ä¸€ä¸ªå¥½çš„实践。以一个“torâ€ç”¨æˆ·è¿è¡Œ -é¿å…了 identd 和其他检查用户åçš„æœåŠ¡ä¼šå¸¦æ¥çš„问题。如果你éžå¸¸è°¨å°æ…Žå¾®ï¼Œä½ è‡ªç„¶å¯ä»¥å°† Tor 置于 -chroot jail 中。) -

-

-16ã€ï¼ˆä»…针对 Unix)。你的æ“作系统å¯èƒ½å°†æ¯ä¸€è¿›ç¨‹èƒ½å¤Ÿæ‰“开的文件标识符的数目é™åˆ¶åœ¨ -1024(甚至更少)。如果你计划è¿è¡Œä¸€å°å¿«é€Ÿçš„出å£èŠ‚点,这一数目也许ä¸å¤Ÿã€‚Linux 中, -你应该在 /etc/security/limits.conf 文件中添加一行,如“toruser hard nofile 8192†-(toruser 是è¿è¡Œ Tor 进程的用户),然åŽé‡æ–°å¯åŠ¨ Tor(如果 Tor ä»¥è½¯ä»¶åŒ…çš„æ–¹å¼ -安装)或者登出å†ç™»é™†ï¼ˆå¦‚æžœè¿è¡Œ Tor 的用户就是你)。如果以上步骤无效,请查看此 -FAQ æ¡ç›®ï¼Œè¯¥ FAQ 有在å¯åŠ¨ Tor 之å‰å…ˆè¿è¡Œâ€œulimit -n 8192â€çš„其他建议方å¼ã€‚ -

-

-17ã€å¦‚果你是通过软件包或安装文件安装的 Tor,它å¯èƒ½ä¼šåœ¨ç³»ç»Ÿå¯åŠ¨æ—¶è‡ªåŠ¨å¯åŠ¨ Tor。 -如果你是自æºæ–‡ä»¶å®‰è£…çš„ Tor,contrib/tor.sh 或者 contrib/torctl 中的åˆå§‹è„šæœ¬ -也许对你有用。 -

-

-当你修改了 Tor çš„é…置,请记得检查中继在é…置修改以åŽä¾æ—§æ­£å¸¸å·¥ä½œã€‚ -请确认你在 torrc 中设置了“ContactInfoâ€ï¼Œè¿™æ ·å½“需è¦å‡çº§æˆ–者å‘生了什么问题时我们能与你å–å¾—è”系。 -如果你有疑问或者问题,请查看文档的获得支æŒéƒ¨åˆ† -或者从 tor-ops ä¿¡ç®±è”系我们。 -感谢你为 Tor 网络æˆé•¿åšå‡ºçš„è´¡çŒ®ï¼ -

-
-

如果你有改进本文档的建议,请告诉我们。 -谢谢ï¼

-
-
-
-
-

- Webmaster - - 最åŽä¿®æ”¹: Tue Feb 26 19:27:12 2008 - - - 最åŽç¼–译: Sun Mar 2 17:36:05 2008 -

-

"Tor" 和 "Onion Logo" 是 The Tor Project, Inc. 的商标。 -

-

- 警告: 本翻译的内容å¯èƒ½æ˜¯è¿‡æ—¶çš„。英文原文ä½äºŽç¬¬ 13768 次修订, - 但本翻译基于第 13194 次修订。 -

-

- 本页é¢è¿˜æœ‰å¦‚下语言的版本: - English, español, français, Italiano, polski, Русский (Russkij)。
- 如何设置默认语言。 -

-

- Tor çš„å¼€å‘者和 EFF å‡æœªå¯¹æœ¬ç¿»è¯‘的精确性和正确性作检查。 - 它å¯èƒ½æ˜¯è¿‡æ—¶çš„或者错误的。 - Tor 的官方网站的语言是英文,ä½äºŽ https://www.torproject.org/。 -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-server.html.de tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.de --- tor-0.2.0.34/doc/website/tor-doc-server.html.de 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.de 1970-01-01 00:00:00.000000000 +0000 @@ -1,269 +0,0 @@ - - - - - - - - - - -
- - - - - - - -
-
-

Torserver konfigurieren

-

Das Tornetzwerk beruht auf Freiwilligen, die Bandbreite zur - Verfügung stellen. Je mehr Leute einen Torserver betreiben, desto - schneller wird das Tornetzwerk. Wenn du wenigstens 20 kB/s in - eine Richtung hast, bitte hilf uns und konfiguriere Tor auch als - Server. Wir haben viele Merkmale, die den Betrieb eines Servers - einfach und bequem machen. Dazu gehören u.a. Bandbreitenlimitierung, - flexible Exitpolicies und Unterstützung für dynamische - IP-Adressen.

-

Server, die sich an verschiedenen Orten im Internet befinden, geben - den Benutzern Sicherheit. Du kannst dadurch auch bessere - Anonymität erlangen, da Betreiber von Webseiten nicht wissen - können, ob die Verbindung von deinem Computer stammt oder ob sie nur - durch andere dorthin weitergeleitet wurde.

-

Die Einrichtung eines Torservers ist einfach und bequem:

-
    -
  • Tor hat eine eingebaute Bandbreitenbegrenzung. Mehr - noch: Wenn du eine schnelle Verbindung hast, kannst du die - Anzahl der Bytes pro Tag (oder Woche oder Jahr), die du bereitstellen - willst, begrenzen. Schau dir den Punkt hibernation - in der Dokumentation an.
  • -
  • Jeder Torserver hat eine so genannte Exitpolicy. Diese - legt fest, welche Art abgehender Verbindungen von diesem Server - erlaubt oder gesperrt sind. Wenn du nicht möchtest, dass sich Leute - von deinem Server aus mit dem Internet verbinden, hast du die - Möglichkeit, nur Verbindungen zu anderen Torservern zuzulassen.
  • -
  • Es ist in Ordnung, wenn der Server manchmal offline ist. Die - Verzeichnisserver bemerken dies schnell und geben den Server nicht - mehr als online an. Du solltest versuchen, es in Grenzen zu halten. - Denn bestehende Verbindungen, welche über diesen Server laufen, sind dann - unterbrochen.
  • -
  • Wir können mit Servern, die dynamische IP-Adressen nutzen, gut - umgehen. Dazu ist es wichtig, dass die Server ihre eigene IP-Adresse - kennen. Schau dir diesen - Beitrag in der FAQ an.
  • -
  • Wenn dein Server hinter einem NAT-Router ist und seine - öffentliche IP-Adresse nicht kennt, (hat z.B. 192.168.x.y), - musst du Portforwarding aktivieren. Diese Eigenschaft ist - vom System abhängig. In dem FAQ-Eintrag - stehen ein paar Beispiele, wie man dies bewerkstelligen kann.
  • -
  • Dein Server wird passiv die freie Bandbreite berechnen und - verteilen. Je mehr Bandbreite zur Verfügung steht, desto mehr - Benutzer wird der Server aufnehmen können. Es ist also auch sinnvoll - Server mit kleinen Bandbreiten zu betreiben.
  • -
-

Du kannst einen Server auf so ziemlich jedem Betriebssystem -installieren. Der Eintrag in der FAQ zum Betriebssystem beschreibt, welche Betriebssysteme sich am besten -eignen und welche Probleme auftreten könnten.

-
-

Schritt Null: Tor herunterladen und installieren

-

Vergewissere dich bevor du beginnst, dass Tor installiert ist und -läuft.

-

Für Windowsnutzer bedeutet das, dass mindestens Schritt Eins der -Installationsanleitung für Tor auf Windows ausgeführt sein muss. Nutzer -von Mac OS X müssen mindestens Schritt Eins der Installationsanleitung -für Tor auf OS X erledigt haben. Benutzer von unixoiden Systemen -sollten mindestens Schritt Eins vom Howto erledigt -haben.

-

Wenn du willst, kannst du Tor auch erst eine Weile als Client -verwenden, um sicher zu gehen, dass es auch richtig funktioniert.

-
-

Schritt Eins: Richte Tor als Server ein

-
    -
  1. Stelle sicher, dass die Uhrzeit korrekt eingestellt ist. Falls - es möglich ist, synchronisiere sie mit einem Zeitserver (NTP) im Internet.
  2. -
  3. Stelle sicher, dass die Namensauflösung (DNS) korrekt funktioniert.
  4. -
  5. Editiere den unteren Teil deiner torrc (in diesem - FAQ-Beitrag kannst du Hilfe finden.). Stelle dabei sicher, dass - du mindestens Nickname und ORPort angegeben - hast. Erstelle, wenn nötig, ein Verzeichnis für Daten und stelle sicher, - dass es dem Nutzerkonto gehört, der Tor ausführen wird. Wenn du - mehrere Server betreiben willst, ist das wunderbar. Bitte setze dann - die - MyFamily-Option in den Konfigurationsdateien - aller Server.
  6. -
  7. Wenn du eine Firewall verwendest, öffne einen Port, damit - eingehende Verbindungen, die von dir konfigurierten Ports erreichen - können (ORPort plus DirPort, falls - gesetzt). Stelle sicher, dass alle abgehenden Verbindungen von der - Firewall zugelassen werden, damit die anderen Torserver erreicht - werden können.
  8. -
  9. Starte deinen Server neu: Wenn es Warnungen gibt, solltest du sie erst - beheben.
  10. -
  11. Trage dich in die Mailingliste or-announce ein. - Sie wird dich über neue stabile Pakete auf dem laufenden halten. Du - möchtest dich eventuell auch bei or-talk - einschreiben. Diese Liste informiert über neue - Entwicklerversionen.
  12. -
  13. Wirf einen Blick ins Handbuch der neusten stabilen Version. Es enthält - Informationen über die Installation und Verwendung von Tor, - inklusive der Konfiguration von Client und Server. Das Handbuch zur - Entwicklerversion findet sich hier.
  14. -
-
-

Schritt Zwei: Sicher gehen, dass es funktioniert

-

Sobald sich dein Server zum Netzwerk verbinden kann, wird er versuchen -herauszufinden, ob die Ports, die du konfiguriert hast, von außen erreichbar -sind. Dies kann bis zu 20 Minuten dauern. Halte nach Logeinträgen wie -self-testing indicates your orport is reachable from the outside. -excellent Ausschau. Wenn du diese Nachricht nicht siehst, bedeutet dies, -dass dein Server von außen nicht erreichbar ist. Stelle sicher, dass die -Angaben zu IP-Adresse und Port richtig sind.

-

Wenn er erreichbar ist, wird er einen "Serverdescriptor" in die -Verzeichnisse laden. Dies lässt die Clients wissen, welche Adresse, Ports, -Schlüssel etc. dein Server verwendet. Du kannst den Netzwerkstatus -manuell laden und ihn nach deinem Nickname durchsuchen. So kannst du sicher -gehen, dass er existiert. Dies dauert meist einige Sekunden.

-
-

Schritt Drei: Wenn es funktioniert

-

Wir empfehlen folgende Schritte zusätzlich auszuführen:

-

In diesem -Dokument gibt es Anweisungen, wie du die Sicherheit des Servers -erhöhen kannst.

-

Entscheide dich, welche Exitpolicy du willst. Standardmäßig -gewährt dein Server den Zugriff auf viele bekannte Dienste. Einige -(z.b. Port 25) werden jedoch eingeschränkt, aufgrund von vorhandenem -Missbrauchspotential. Vielleicht möchtest du eine restriktivere oder -weniger restriktive Exitpolicy wählen. Editiere dazu deine -torrc entsprechend. Lies die FAQ über Probleme, die bei der Verwendung der -standardmäßigen Exitpolicy auftreten können. Wenn du eine -liberale Exitpolicy wählst, stelle auch sicher, dass dein ISP damit -leben kann. Falls es Ressourcen gibt, die dein Computer nicht -erreichen kann, lehne diese bitte explizit in deiner Exitpolicy ab -— sonst werden Tornutzer auch hiervon betroffen sein.

-

Du solltest dir Gedanken über die Limitierung der Bandbreite -machen. Modem, DSL und andere Nutzer, die asymmetrische Verbindungen -haben (z.b. höhere Downloadbandbreite) sollten den Durchsatz auf die kleinere -Bandbreite limitieren, um so Blockaden zu vermeiden. Dieser FAQ-Eintrag -enthält weitere Details.

-
    -
  1. Mache ein Backup vom privaten Schlüssel deines Torservers -(gespeichert in keys/secret_id_key in deinem Datenverzeichnis). Dies -ist die „Identität“ deines Servers. Halte sie geheim, damit niemand -deinen Server abhören kann. Das ist die kritische Datei, um deinen Server zu -verschieben oder wiederherzustellen wenn etwas schief geht.
  2. -
  3. Wenn du die Nameserver für deine Domain kontrollierst, -überlege dir, ob du nicht deinen Hostnamen auf anonymous oder -proxy oder tor-proxy setzt. Wenn die Leute die Adresse -in ihren Logdateien sehen, wissen sie schneller was los ist.
  4. -
  5. Wenn dein Server nicht als Webserver fungiert, erwäge -doch deinen ORport auf 443 und deinen DirPort auf 80 zu ändern. -Viele Tor benutzer stecken hinter Firewalls fest, welche sie nur -surfen lassen. Diese Änderungen würden auch den -Benutzern Zugang zu deinem Torserver ermöglichen. Auf einem -Win32-Server kann einfach der ORPort und DirPort direkt in der -torrc -geändert und Tor neu gestartet werden. Auf OS X oder Unixservern -kann man nicht direkt diese Ports verwenden (weil Tor dort nicht -als root läuft). Deshalb muss man da irgendeine Form von -Portweiterleitung -einrichten, damit Verbindungen zum Tor-Server gemacht werden können. -Falls du die Ports 80 und 443 schon benutzt, aber trotzdem helfen willst, öffne -Port 22, 110, und 143.
  6. -
  7. Falls dein Torserver noch andere Dienste auf der selben Adresse -anbietet — wie z.b. einen Webserver — vergewissere dich, -dass Verbindungen zum Webserver auch vom localhost zugelassen werden. -Diese Verbindungen müssen klappen, da Torclients erkennen, dass -dein Torserver der sicherste -Weg ist, deinen Webserver zu erreichen. Daher bauen sie immer Verbindungen, die bei -deinem Server aufhören. Wenn du diese Verbindungen nicht erlauben willst, dann musst -die sie direkt in deiner Exitpolicy verbieten.
  8. -
  9. (nur Unix). Lege einen neuen Nutzer an, welcher das Programm -ausführt. Wenn du das OS X, deb oder rpm installiert hast, so -wurde dies bereits erledigt. Ansonsten kannst du dies per Hand -erledigen. (Der Torserver muss nicht als root laufen, es ist also -eine gute Idee das auch nicht zu tun. Ausführen als 'tor' -Benutzer erübrigt Probleme mit inetd und anderen Diensten, welche -auf Nutzernamen prüfen. wenn du ein paranoider Zeitgenosse bist -kannst du Tor -im jail ausführen.)
  10. -
  11. (nur Unix). Vermutlich limitiert dein Betriebssystem die Anzahl offener -Dateien pro Prozess auf 1024 (oder noch weniger). Wenn du vorhast, einen -schnellen Exitknoten zu betreiben, wird das vermutlich nicht reichen. Unter -Linux solltest du eine Zeile wie toruser hard nofile 8192 zu deiner -/etc/security/limits.conf -hinzufügen (toruser ist hier der Benutzer, unter dem der Prozess läuft). -Anschließend musst du Tor neu starten. Wenn das nicht funktioniert, -lies die bitte diesen -Eintrag in unserer FAQ durch. Er beschreibt andere Möglichkeiten, wie -man ulimit -n 8192 vor dem Starten von Tor ausführen kann.
  12. -
  13. Wenn du Tor über ein Paket oder ein Installationsprogramm installiert -hast, wird er vermutlich automatisch beim Booten gestartet. Wenn du -jedoch aus dem Quellcode installiert hast, findest du vielleicht die -Initscripte in contrib/tor.sh oder contrib/torctl -hilfreich.
  14. -
-

Bei Änderungen kann in -den meisten Fällen die Konfigurationsdatei neu geladen werden, ohne Tor neu -starten zu müssen. Stelle sicher, dass die Option ContactInfo -gesetzt ist, so dass wir dich bei Problemen kontaktieren können. Falls du -Probleme oder Fragen hast, schaue auf die Support-Seite oder kontaktiere uns auf der tor-ops-Mailingliste. Wir danken dir, dass -du das Netzwerk wachsen lässt!

-
-

Wenn du Vorschläge zur Verbesserung dieses Dokuments hast, schicke sie uns bitte. Danke!

-
-
-
-
-

- Webmaster - - Letzte Änderung: Tue Feb 26 19:27:13 2008 - - - Zuletzt kompiliert: Sun Mar 2 17:35:33 2008 -

-

"Tor" und das "Onion Logo" sind Warenzeichen der The Tor Project, Inc.

-

- Achtung: Diese Übersetzung ist möglicherweise veraltet. Das englische Original ist auf - Revision 12076 während diese Übersetzung auf - 11724 basiert. -

-

- Diese Seite gibt es auch in den folgenden Sprachen: - English, français, Italiano, polski, Русский (Russkij).
- Wie stellt man die Standardsprache ein. -

-

Die Tor-Entwickler haben diese Übersetzung nicht auf Korrektheit geprüft. - Sie könnte veraltet oder falsch sein. Die offizielle Version ist in - englischer Sprache, erhältlich unter https://www.torproject.org/.

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-server.html.en tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.en --- tor-0.2.0.34/doc/website/tor-doc-server.html.en 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.en 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ - - - - Redirecting - - - - - - - -
- - - - - - - -Redirecting to ../docs/tor-doc-relay. -
-
-

- Webmaster - - Last modified: Tue Feb 26 19:27:12 2008 - - - Last compiled: Sun Mar 2 17:35:36 2008 -

-

"Tor" and the "Onion Logo" are trademarks of The Tor Project, Inc. -

-

- This page is also available in the following languages: - Deutsch, français, Italiano, polski, Русский (Russkij).
- How to set the default document language. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-server.html.fr tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.fr --- tor-0.2.0.34/doc/website/tor-doc-server.html.fr 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.fr 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ - - - - Redirecting - - - - - - - - -
-

- Webmaster - - Dernière modification : Tue Feb 26 19:27:13 2008 - - - Dernière compilation : Sun Mar 2 17:35:50 2008 -

-

"Tor" et le Logo Onion sont des marques déposées du Projet Tor, Inc. -

-

- Cette page est aussi disponible dans les langues suivantes : - Deutsch, English, Italiano, polski, Русский (Russkij).
- Comment configurer la langue par défaut du document. -

-

Les développeurs de Tor n'ont pas revu cette traduction en ce qui concerne la - pertinence et l'exactitude. Elle peut être obsolète ou fausse. La version - officielle du site web Tor est la version anglaise, disponible sur https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-server.html.it tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.it --- tor-0.2.0.34/doc/website/tor-doc-server.html.it 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.it 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ - - - - Redirecting - - - - - - - -
- - - - - - - -Redirecting to ../docs/tor-doc-relay. -
-
-

- Webmaster - - Ultima modifica: Tue Feb 26 19:27:14 2008 - - - Ultima compilazione: Sun Mar 2 17:35:45 2008 -

-

"Tor" e l'"Onion Logo" sono marchi registrati di The Tor Project, Inc. -

-

- Questa pagina è disponibile anche nelle lingue seguenti: - Deutsch, English, français, polski, Русский (Russkij).
- Come configurare la lingua predefinita per i documenti. -

-

Questa traduzione non è stata controllata dagli sviluppatori di - Tor. Può essere obsoleta o errata. Il sito - ufficiale di Tor è in inglese, all'indirizzo https://torproject.org/ -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-server.html.pl tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.pl --- tor-0.2.0.34/doc/website/tor-doc-server.html.pl 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ - - - - Przekierowanie - - - - - - - - -
-

- Webmaster - - Ostatnio zmodyfikowane: Tue Feb 26 19:27:13 2008 - - - Ostatnio wygenerowane: Sun Mar 2 17:35:56 2008 -

-

"Tor" i "Onion Logo" (logo cebuli) sÄ… znakami handlowymi The Tor Project, Inc. -

-

- Ta strona jest także dostÄ™pna w nastÄ™pujÄ…cych jÄ™zykach: - Deutsch, English, français, Italiano, Русский (Russkij).
- Jak ustawić domyślny język dokumentu. -

-

- Deweloperzy Tora nie sprawdzili tłumaczenia tej strony pod względem dokładności - i poprawności. Tłumaczenie może być przestarzałe lub niepoprawne. Oficjalna strona Tora jest - po angielsku, pod adresem https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-server.html.ru tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.ru --- tor-0.2.0.34/doc/website/tor-doc-server.html.ru 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-server.html.ru 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ - - - - Перенаправление - - - - - - - -
-

- Webmaster - - ПоÑледние изменениÑ: Tue Feb 26 19:27:13 2008 - - - ПоÑледнÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑциÑ: Sun Mar 2 17:36:02 2008 -

-

"Tor" и "Onion Logo" - торговые марки принадлежащие Tor Project, Inc. -

-

- Эта Ñтраница также переведена на Ñледующие Ñзыки: - Deutsch, English, français, Italiano, polski.
- Как уÑтановить Ñзык документов по умолчанию. -

-

Разработчики Tor не проверÑли Ñтот перевод на точноÑÑ‚ÑŒ и корректноÑÑ‚ÑŒ. - Перевод может быть уÑтаревшим или проÑто неправильным. Официальный веб-Ñайт - Tor на английÑком Ñзыке доÑтупен по адреÑу - https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-unix.html.en tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.en --- tor-0.2.0.34/doc/website/tor-doc-unix.html.en 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.en 1970-01-01 00:00:00.000000000 +0000 @@ -1,218 +0,0 @@ - - - - Tor: Linux/BSD/Unix Install Instructions - - - - - - -
- - - - - - - -
-
-

Running the Tor client on Linux/BSD/Unix

-
-

-Note that these are the installation instructions for running a Tor -client. If you want to relay traffic for others to help the network grow -(please do), read the Configuring a relay guide. -

-
- -

Step One: Download and Install Tor

-
-

-The latest release of Tor can be found on the download page. We have packages for Debian, -Red Hat, Gentoo, *BSD, etc there too. -

-

If you're building from source, first install libevent, and -make sure you have openssl and zlib (including the -devel packages if -applicable). Then run:
-tar xzf tor-0.1.2.19.tar.gz; cd tor-0.1.2.19
-./configure && make

-Now you can run tor as src/or/tor, or you can run make install -(as root if necessary) to install it into /usr/local/, and then you can -start it just by running tor. -

-

Tor comes configured as a client by default. It uses a built-in -default configuration file, and most people won't need to change any of -the settings. Tor is now installed. -

-
- -

Step Two: Install Privoxy for Web Browsing

-
-

After installing Tor, you need to configure your applications to use it. -

-

-The first step is to set up web browsing. Start by installing Privoxy: click on 'recent releases' -and pick your favorite package or install from source. Privoxy is a -filtering web proxy that integrates well with Tor. -

-

Once you've installed Privoxy (either from package or from source), -you will need to configure Privoxy to use Tor. You may find -this -sample Privoxy configuration useful. Otherwise, you should configure -Privoxy by hand, using the directions that follow. -

-

-Open Privoxy's "config" file (look in /etc/privoxy/ or /usr/local/etc/) -and add the line
-forward-socks4a / 127.0.0.1:9050 .
-to the top of the config file. Don't forget to add the dot at the end. -

-

Privoxy keeps a log file of everything passed through it. In -order to stop this you will need to comment out three lines by inserting a -# before the line. The three lines are:
-logfile logfile
-and the line
-jarfile jarfile
-and (on some systems) the line
-debug 1 # show each GET/POST/CONNECT request
-

-

Depending on which default config file you have for Privoxy, -you may also need to turn off enable-remote-toggle, -enable-remote-http-toggle, and enable-edit-actions. -

-

You'll need to restart Privoxy for the changes to take effect.

-
- -

Step Three: Configure your applications to use Tor

-
-

After installing Tor and Privoxy, you need to configure your -applications to use them. The first step is to set up web browsing.

-

If you're using Firefox (we recommend it), simply install the Torbutton -plugin, restart your Firefox, and you're all set: -

-Torbutton plugin for Firefox -
-

-(Learn more about -Torbutton here. -If you plan to run Firefox on a different computer than Tor, see the -FAQ -entry for running Tor on a different computer. If you need to -use a browser other than Firefox, you'll have to configure its proxy settings yourself.) -

-

Using privoxy is necessary because browsers -leak your DNS requests when they use a SOCKS proxy directly, which -is bad for your anonymity. Privoxy also removes certain dangerous -headers from your web requests, and blocks obnoxious ad sites like -Doubleclick.

-

To Torify other applications that support HTTP proxies, just -point them at Privoxy (that is, localhost port 8118). To use SOCKS -directly (for instant messaging, Jabber, IRC, etc), you can point -your application directly at Tor (localhost port 9050), but see this -FAQ entry for why this may be dangerous. For applications -that support neither SOCKS nor HTTP, take a look at tsocks or socat. -

-

For information on how to Torify other applications, check out the -Torify -HOWTO. -

-
- -

Step Four: Make sure it's working

-
-

-Next, you should try using your browser with Tor and make -sure that your IP address is being anonymized. Click on -the -Tor detector -and see whether it thinks you're using Tor or not. -(If that site is down, see this -FAQ entry for more suggestions on how to test your Tor.) -

-

If you have a personal firewall that limits your computer's -ability to connect to itself (this includes something like SELinux on -Fedora Core 4), be sure to allow connections from -your local applications to Privoxy (local port 8118) and Tor (local port -9050). If -your firewall blocks outgoing connections, punch a hole so -it can connect to at least TCP ports 80 and 443, and then see this -FAQ entry. If your SELinux config is not allowing tor or privoxy to -run correctly, create a file named booleans.local in the directory -/etc/selinux/targeted. Edit this file in your favorite text editor and -insert "allow_ypbind=1". Restart your machine for this change to take -effect. -

-

If it's still not working, look at this -FAQ entry for hints.

-
- - -

Step Five: Configure it as a relay

-
-

The Tor network relies on volunteers to donate bandwidth. The more -people who run relays, the faster the Tor network will be. If you have -at least 20 kilobytes/s each way, please help out Tor by configuring your -Tor to be a relay too. We have many features that make Tor relays easy -and convenient, including rate limiting for bandwidth, exit policies so -you can limit your exposure to abuse complaints, and support for dynamic -IP addresses.

-

Having relays in many different places on the Internet is what -makes Tor users secure. You -may also get stronger anonymity yourself, -since remote sites can't know whether connections originated at your -computer or were relayed from others.

-

Read more at our Configuring a relay -guide.

-
-

If you have suggestions for improving this document, please send them to us. Thanks!

-
-
-
-
-

- Webmaster - - Last modified: Sun Mar 2 17:31:17 2008 - - - Last compiled: Sun Mar 2 17:35:36 2008 -

-

"Tor" and the "Onion Logo" are trademarks of The Tor Project, Inc. -

-

- This page is also available in the following languages: - español, français, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- How to set the default document language. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-unix.html.es tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.es --- tor-0.2.0.34/doc/website/tor-doc-unix.html.es 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.es 1970-01-01 00:00:00.000000000 +0000 @@ -1,208 +0,0 @@ - - - - Instrucciones de Instalación para Linux/BSD/Unix - - - - - - -
- - - - - - - -
-
-

Ejecutar el cliente Tor en Linux/BSD/Unix

-
-

Nótese que estas son las instrucciones de instalación para e -jecutar un cliente Tor. -Si quieres gestionar tráfico para otros y ayudar a crecer la red Tor, - (házlo por favor), lee la guía -Configurar un repetidor - -

-
- -

Paso Uno: Descarga e Instala Tor

-
-

-La última versión de Tor se encuentra en la página de descarga. También tenemos paquetes para Debian, -Red Hat, Gentoo, *BSD, etc allí. -

-

Si vas a compilar desde las fuentes, primero instala libevent, y -asegúrate de tener openssl y zlib (incluyendo los paquetes -devel si existen). -Entonces ejecuta:
-tar xzf tor-0.1.2.19.tar.gz; cd tor-0.1.2.19
-./configure && make

-Ahora se puede ejecutar tor como src/or/tor, o puedes ejecutar make install -(como root en caso necesario) para instalarlo en /usr/local/, tras lo cual se puede -arrancar simplemente ejecutando tor. -

-

Tor viene configurado como cliente por defecto. Usa un fichero de configuración -integrado, y la mayoría de la gente no nesitará cambiar ningún parámetro. Tor está ya -instalado. -

-
- -

Paso Dos: Instalar Privoxy para Navegar por la Web

-
-

Tras instalar Tor, necesita configurar sus aplicaciones para usarlo. -

-

-El primer paso es configurar la navegación web. Empiece instalando Privoxy: haga click en 'recent releases' -y elija su paquete favorito o instale desde las fuentes. Privoxy es un -proxy web que hace filtrado y que se integra bien con Tor. -

-

Una vez que haya instalado Privoxy (o bien desde paquete o desde fuentes), -necesitará configurar Privoxy para que use Tor. Puede que esta -muestra de configuración de Privoxy le sea útil. En caso contrario, debería -configurar Privoxy a mano, usando las indicaciones que siguen. -

-

-Abra el fichero "config" de Privoxy (busque en /etc/privoxy/ o /usr/local/etc/) -y añada la línea
-forward-socks4a / 127.0.0.1:9050 .
-al principio del fichero de configuración. No se olvide de añadir el punto al final. -

-

Privoxy mantiene un fichero de log de todo lo que pasa a su través. Para -evitar esto tendrá que comentar tres líneas insertando un -# antes de la línea. Las tres líneas son:
-logfile logfile
-y la línea
-jarfile jarfile
-y (en algunos sistemas) la línea
-debug 1 # show each GET/POST/CONNECT request
-

-

Dependiendo de qué fichero de configuración por defecto tenga para Privoxy, -puede que también tenga que desactivar enable-remote-toggle, -enable-remote-http-toggle, y enable-edit-actions. -

-

Tendrá que reiniciar Privoxy para que los cambios tengan efecto.

-
- -

Paso Tres: Configurar tus aplicaciones para que usen Tor

-
-

Tras instalar Tor y Privoxy, debes configurar tus aplicaciones para usarlos. -El primer paso es configurar tu navegador.

-

Si usa Firefox (lo recomendamos), simplemente instale el plugin Torbutton -, reinicie Firefox, y eso es todo: -

-Torbutton plugin for Firefox -
-

-(Aprenda más sobre -Torbutton aquí. -Si planea usar Firefox en un ordenador distinto del de Tor, vea la -entrada en la FAQ para ejecutar Tor en un ordenador distinto. Si necesita usar -un navegador distinto de Firefox, tendrá que configurar sus opciones de proxies usted mismo..) -

-

Usar Privoxy es necesario porque - -los exploradores fallan al hacer peticiones DNS cuando usan un proxy SOCKS directamente, -lo cual es malo para el anonimato. Privoxy también elimina ciertas cabeceras -peligrosas de tus peticiones web, y bloquea incómodos sitios como Doubleclick.

-

Para usar con TOR otras aplicaciones que soportan proxies HTTP, simplemente -dirigirlas a Privoxy (localhost, puerto 8118). Para usar SOCKS directamente (para -mensajería instantanea, Jabber, IRC, etc.) puedes dirigir tu aplicación directamente -a Tor (localhost, puerto 9050), pero visita esta FAQ -donde se explica por qué esto puede ser peligroso. Para aplicaciones que no soportan ni SOCKS ni HTTP, -visitar tsocks o socat. -

-

Para más información sobre como "TOR"ificar otras aplicaciones -visitar Torify -HOWTO. -

-
- -

Paso Cuatro: Asegurarse de que funciona

-
-

Después, deberías intentar usar tu explorador con Tor y asegurarte que tu dirección -IP esta siendo anonimizada. -Visite el detector de Tor -y compruebe si cree que usa Tor o no. -(Si este sitio no responde, visite -esta FAQ para más sugerencias sobre como testear su Tor.) -

-

Si usa un cortafuegos personal que limita la capacidad de conexión de su computadora -a sí misma (esto incluye también SELinux en Fedora Core 4), -asegúrese que permite conexiones de aplicaciones locales a Privoxy (puerto local 8118) y a Tor -(puerto local 9050). Si su cortafuegos bloquea conexiones salientes, configúrelo para que puedan -hacerse conexiones al menos a los puertos TCP 80 y 443 y visite -este apartado de la FAQ. Si su fichero de configuración SELinux no permite a tor o a privoxy ejecutarse -correctamente, cree un fichero llamado booleans.local en el directorio -/etc/selinux/targeted. Edite este fichero en su editor de textos favorito e inserte -"allow_ypbind=1". Reinicie su máquina para que este cambio tenga efecto. -

-

Si aún no funciona, visite -este apartado de la FAQ -para seguir consejos.

-
- - -

Paso Cinco: Configurarlo como repetidor

-
-

La red Tor se basa en voluntarios que donan su ancho de banda. -Cuantos más repetidores, más rápida será la red Tor. Si tienes al menos 20 Kbytes/s en ambos sentidos, -por favor ayuda a Tor configurándolo para que sea repetidor también. Tenemos varias características para que -hacer a Tor repetidor sea fácil y conveniente, incluyendo limitación del ancho de banda cedido, políticas de -conexiones de salida que pueden limitar tu exposición a casos de abuso, y soporte para IP dinámicas. -

Tener repetidores en varios y diferentes sitios en la Internet es lo que convierte a los usuarios de Tor en seguros. -Puedes reforzar tu propio anonimato, -haciendo que sitios remotos no puedan saber si las conexiones se originaron en -tu computadora o fueron iniciadas desde otras.

-

Lee más en nuestra guía Configurando un repetidor

-
-

Si tienes sugerencias para mejorar este documento, por favor envíanoslas. ¡Gracias!

-
-
-
-
-

- Webmaster - - Última modificación: Tue Feb 26 19:27:13 2008 - - - Última compilación: Sun Mar 2 17:35:41 2008 -

-

"Tor" y el "Logo de la Cebolla" son -marcas registradas de El Proyecto Tor, S.A. -

-

- Aviso: Esta traducción podría estar obsoleta. La revisión original en inglés es la - 13768 mientras que esta revisión está basada en la - 12809. -

-

- Esta página también está disponible en los siguientes idiomas: - English, français, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Cómo establecer el idioma por defecto del documento. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-unix.html.fr tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.fr --- tor-0.2.0.34/doc/website/tor-doc-unix.html.fr 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.fr 1970-01-01 00:00:00.000000000 +0000 @@ -1,217 +0,0 @@ - - - - Guide d'installation pour Linux/BSD/Unix - - - - - - -
- - - - - - - -
-
-

Installer un client Tor sur système Linux/BSD/Unix

-
-

-Ces instructions ne s'appliquent qu'à l'installation d'un client Tor. -Si vous voulez aider à la croissance du réseau Tor en relayant du trafic pour les autres -(ce qui est une très bonne idée), lisez le guide sur la configuration d'un relais. -

-
- -

Étape 1 : Télécharger et Installer Tor

-
-

-Vous pouvez trouver la dernière version de Tor sur la page de téléchargement. Nous avons ici des paquets pour Debian, -Red Hat, Gentoo, *BSD, etc. -

-

Si vous installez depuis le code source, installez d'abord libevent, et -assurez vous de bien d'avoir openssl et zlib (avec les paquets --devel). Tapez ensuite :
-tar xzf tor-0.1.2.19.tar.gz; cd tor-0.1.2.19
-./configure && make

-Vous pouvez maintenant lancer tor depuis src/or/tor, ou vous pouvez -l'installer dans /usr/local/ avec make install (en root si nécessaire), ce qui -vous permettra de le lancer en tapant simplement tor. -

-

Tor est préconfiguré par défaut en tant que client. Le fichier de -configuration qu'il utilise par défaut conviendra à la plupart des -utilisateurs. Tor est maintenant installé. -

-
- -

Étape 2 : Installer Privoxy pour la navigation web

-
-

Une fois Tor installé, vous devez configurer vos applications pour l'utiliser. -

-

-Il faut tout d'abord s'occuper de la navigation web. Commencez par installer Privoxy : sélectionnez « recent -releases », et choisissez votre paquet, ou installez depuis le code source. Privoxy -est un proxy web filtrant qui s'intègre très bien avec Tor. -

-

Une fois Privoxy installé (par un paquet, ou par les sources), -il vous faudra configurer Privoxy pour utiliser Tor. -Vous pouvez trouver cet -exemple de configuration de Privoxy intéressant. Sinon vous aurez à configurer -Privoxy à la main, en utilisant les pistes qui suivent. -

-

-Ouvrez le fichier de configuration de Privoxy (regardez dans /etc/privoxy/ ou dans -/usr/local/etc/), et ajoutez la ligne
-forward-socks4a / 127.0.0.1:9050 .
-au début de ce fichier. N'oubliez pas le point en fin de ligne. -

-

Privoxy garde dans un fichier de log des traces de tout ce qu'il retransmet. Afin de prévenir cela, vous -pouvez commenter (en insérant # en début de ligne) ces deux lignes : -
-logfile logfile
-et la ligne
-jarfile jarfile
-enfin (sur certains systèmes) la ligne
-debug 1 # affiche chaque requète GET/POST/CONNECT
-

-

Suivant la configuration par défaut que vous avez pour Privoxy, -vous pourrez avoir à couper enable-remote-toggle, -enable-remote-http-toggle, et enable-edit-actions. -

-

Vous devrez redémarrer Privoxy pour que les modifications prennent effet.

-
- -

Étape 3 : Configurer vos applications pour utiliser Tor

-
-

Une fois Tor installé, vous devez configurer vos applications pour l'utiliser.

-

Si vous utilisez Firefox (nous vous le conseillons), vous pouvez installer l'extension Torbutton, -puis redemarrez votre Firefox et c'est terminé : -

-Torbutton plugin for Firefox -
-

-(En savoir plus sur -Torbutton ici. -Si vous envisagez de faire tourner Firefox sur un ordinateur différent de Tor, jetez un œil à l'entrée FAQ -traitant de l'utilisation de Tor sur un ordinateur différent. Si vous avez besoin -d'utiliser un navigateur autre que Firefox, vous aurez à configurer son proxy vous même.) -

-

Il est nécessaire d'utiliser Privoxy car les -navigateurs ne cachent pas vos requêtes DNS lorsque vous utilisez SOCKS -directement, ce qui est mauvais pour votre anonymat. Privoxy supprime aussi -de vos requêtes web certains en-têtes dangereux, et bloque les infectes -publicités de sites comme Doubleclick.

-

Pour Torréfier d'autres applications qui gèrent les proxies HTTP, faites les -simplement utiliser Privoxy (c'est à dire, localhost port 8118). Pour utiliser SOCKS -directement (pour la messagerie instantanée, Jabber, IRC, etc), faites pointer votre -application directement sur Tor (localhost port 9050), mais consultez -cet article de -la FAQ pour comprendre en quoi cela peut être dangereux. Pour les applications qui ne -gèrent ni SOCKS, ni le HTTP, vous pouvez utiliser tsocks ou socat. -

-

Vous pouvez trouver des informations sur la Torréfaction d'autres applications -sur le HOWTO Torréfaction. -

-
- -

Étape 4 : Vérifier que ça fonctionne

-
-

Vous devriez ensuite essayer d'utiliser votre navigateur avec Tor, et vérifier que votre adresse -IP est anonyme. Rendez vous sur le -détecteur Tor, vous -verrez s'il pense que vous utilisez Tor ou non. (Si ce site ne marche pas, voyez cet -article de la FAQ pour des suggestions supplémentaires sur la manière de tester Tor.) -

-

Si vous avez un pare-feu personnel qui limite la possibilité de votre ordinateur à se -connecter en local (par exemple SELinux sur Fedora Core 4), assurez vous de permettre les -connexions de vos applications vers Privoxy (local port 8118) et tor (local port 9050). Si -votre pare-feu bloque les connexions sortantes, faites une brèche dedans pour pouvoir vous -connecter au moins sur les ports 80 et 443, et consultez ensuite cet -article de la FAQ. Si votre configuration de SELinux ne permet pas à tor ou privoxy de -fonctionner correctement, créez un fichier nommé booleans.local dans votre répertoire -/etc/selinux/targeted. Éditez le avec votre éditeur de texte favori, et écrivez -"allow_ypbind=1". Redémarrez votre machine pour que cette modification prenne effet. -

-

Si cela ne fonctionne toujours pas, consultez cet article de -la FAQ.

-
- - -

Étape 5 : Configurer Tor en tant que relais

-
-

Le réseau Tor se base sur des volontaires qui donnent de leur bande passante. -Plus il y a de monde qui fait tourner de relais, plus le réseau Tor sera rapide. Si vous -disposez d'au moins 20 Ko/s en upload et en download, vous pouvez aider Tor en configurant -Tor pour être un relais lui aussi. Nous avons beaucoup de fonctionnalités qui rendent les -relais Tor simples et pratiques, comme la gestion des adresses IP dynamiques, ou la -limitation de la bande passante maximale et les politiques de sortie afin que vous -puissiez limiter votre vulnérabilité aux possibles plaintes suite à des abus.

-

Tor est un système dont la sécurité dépend de la diversité des lieux géographiques où tournent -les relais. -Faire -tourner un relais renforce votre anonymat, car les sites distants ne peuvent pas -savoir si les connexions proviennent de votre ordinateur, ou si vous les avez juste -relayé depuis un autre endroit.

-

Pour en savoir plus, voir le guide de configuration -d'un relais.

-
-

Si vous avez des suggestions pour améliorer ce document, envoyez les nous s'il vous plaît. Merci !

-
-
-
-
-

- Webmaster - - Dernière modification : Tue Feb 26 19:27:13 2008 - - - Dernière compilation : Sun Mar 2 17:35:50 2008 -

-

"Tor" et le Logo Onion sont des marques déposées du Projet Tor, Inc. -

-

- Attention: Cette traduction peut être obsolète. La version anglaise originale est la - 13768 alors que la version traduite est basée sur la - 12809. -

-

- Cette page est aussi disponible dans les langues suivantes : - English, español, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Comment configurer la langue par défaut du document. -

-

Les développeurs de Tor n'ont pas revu cette traduction en ce qui concerne la - pertinence et l'exactitude. Elle peut être obsolète ou fausse. La version - officielle du site web Tor est la version anglaise, disponible sur https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-unix.html.it tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.it --- tor-0.2.0.34/doc/website/tor-doc-unix.html.it 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.it 1970-01-01 00:00:00.000000000 +0000 @@ -1,223 +0,0 @@ - - - - Tor: istruzioni per installare Tor su Linux/BSD/Unix - - - - - - -
- - - - - - - -
-
-

Usare il client Tor su Linux/BSD/Unix

-
-

-Queste sono le istruzioni per installare e usare un client Tor. -Se invece vuoi donare banda e traffico per aiutare a fare crescere -la rete Tor (sì per favore), leggi la guida Configurare un relay. -

-
- -

Uno: scarica e installa Tor

-
-

-L'ultima versione di Tor si trova sulla pagina scarica. Ci sono anche pacchetti per Debian, -Red Hat, Gentoo, *BSD, etc. -

-

Se compili dai sorgenti, installa prima libevent, e -controlla di avere openssl e zlib (inclui i pacchetti -devel se -necessario). Poi esegui
-tar xzf tor-0.1.2.19.tar.gz; cd tor-0.1.2.19
-./configure && make

-Ora puoi eseguire tor come src/or/tor, oppure puoi eseguire make install -(come root, se necessario) per installarlo in /usr/local/. Infine, puoi -avviare Tor eseguendo tor. -

-

In partenza, Tor è configurato sempre come client e usa un file di -configurazione di default, di cui la maggior parte delle persone non dovrà -modificare i valori. Dopo queste operazioni, Tor è installato. -

-
- -

Due: installa Privoxy per navigare sul web

-
-

Dopo avere installato Tor, occorre configurare i programmi affinché lo usino. -

-

-Per prima cosa va configurata la navigazione web. Inizia installando Privoxy: fai clic su 'recent releases' -e scegli il tuo pacchetto preferito, o installa dai sorgenti. Privoxy è -un filtro proxy web che si integra bene con Tor. -

-

Una volta installato Privoxy (da un pacchetto o dai sorgenti), -dovrai configurare Privoxy per usare Tor. Puoi prendere -questa -configurazione base di Privoxy come punto di partenza. Altrimenti devi configurare -Privoxy a mano seguendo le istruzioni qui sotto. -

-

-Apri il file 'config' di Privoxy (cerca in /etc/privoxy/ o /usr/local/etc/) -e aggiungi questa riga
-forward-socks4a / 127.0.0.1:9050 .
-in cima al file di configurazione. Non dimenticare il punto a fine riga. -

-

Privoxy conserva un file di log per tutto ciò che vi passa attraverso. Per -impedirlo occorre commentare via tre righe inserendo un -# a inizio linea. Le tre righe sono:
-logfile logfile
-e
-jarfile jarfile
-e (su alcuni sistemi) la riga
-debug 1 # show each GET/POST/CONNECT request
-

-

A seconda del tuo config file di default per Privoxy, -dovresti anche disabilitare enable-remote-toggle, -enable-remote-http-toggle, eenable-edit-actions. -

-

Dovrai riavviare Privoxy perché le modifiche abbiano effetto.

-
- -

Tre: configura i tuoi programmi per usare Tor

-
-

Dopo aver installato Tor e Privoxy, devi configurare i tuoi programmi per -usarli. Il primo passo è la configurazione della navigazione web.

-

Se usi Firefox (l consigliamo), basta installare il plugin Torbutton - e riavviare Firefox: -

-Torbutton plugin for Firefox -
-

-(Maggiori informazioni su -Torbutton. -Se vuoi usare Firefox su un computer diverso da quello su cui gira Tor, leggi la -FAQ -per usare Tor su un pc diversor. Se devi usare un -browser diverso da Firefox, dovrai configurare il proxy da te.) -

-

È necessario usare privoxy perché i browser -rivelano le tue richieste DNS se usano un SOCKS proxy direttamente, cosa -che riduce il tuo anonimato. Privoxy rimuove inoltre certi header -pericolosi dalle tue richieste web, e blocca certi fastidiosi siti -pubblicitari come Doubleclick.

-

Per torificare altri programmi che supportino un proxy HTTP, basta -farli puntare a Privoxy (ovvero, a localhost porta 8118). Per usare SOCKS -direttamente (per instant messaging, Jabber, IRC, etc), puoi puntare -l'applicazione direttamente a Tor (localhost porta 9050), ma leggi questa -FAQ per capire perché ciò può essere pericoloso. Per i programmi -che non supportano né SOCKS neé HTTP, dai un'occhiata a tsocks o a socat. -

-

Per informazioni su come torificare altre applicazioni, leggi il -Torify -HOWTO. -

-
- -

Quattro: controlla che tutto funzioni

-
-

-Ora prova ad usare il tuo browser con Tor e controlla -che il tuo indirizzo IP address venga anonimizzato. Fai clic sul - -Tor detector -e controlla se secondo lui stai usando Tor o no. -(Se questo sito non risponde, vedi questa -FAQ per conoscere altri modi di verificare il tuo Tor.) -

-

Se usi un personal firewall che limita le connessioni del tuo computer -verso se stesso (compreso ad esempio SELinux su -Fedora Core 4), devi consentire le connessioni dalla -tua applicazione locale a Privoxy (porta locale 8118) ed a Tor (porta locale -9050). Se -il tuo firewall blocca le connessioni in uscita, abilita almeno -le connessioni alle porte TCP 80 e 443, e poi vedi questa -FAQ. Se la tua configurazione di SELinux non permette a tor o privoxy di -girare correttamente, crea un file di nome booleans.local nella directory -/etc/selinux/targeted. Modifica questo file con un editor di testo e -inserisci "allow_ypbind=1". Riavvia la macchina perché questa modifica abbia -effetto. -

-

Se ancora non funziona, leggi questa -FAQ per altre indicazioni.

-
- - -

Cinque: configura Tor come relay

-
-

La rete Tor si fonda sulla banda donata da volontari. Più -persone aprono un relay, più veloce sarà la rete Tor. Se hai almeno -20 kilobyte/s sia up che down, per favore aiuta la rete Tor e configura -il tuo Tor relay. Ci sono molte funzionalità che facilitano la gestione -di un relay Tor, come la limitazione della banda, exit policy per -ridurre il rischio di abusi e lamentele, ed il supporto per indirizzi -IP dinamici.

-

Con molti relay sparsi in luoghi diversi di Internet gli utenti -Tor sono più sicuri. Puoi -anche avere un anonimato più forte tu stesso, -dato che i siti remoti non potranno sapere se le connessioni nascono -dal tuo computer o provengono da altrove.

-

Puoi approfondire leggendo la nostra guida Configurare un relay. -

-
-

Se hai dei suggerimenti per migliorare questo documento, per favore contattaci. Grazie!

-
-
-
-
-

- Webmaster - - Ultima modifica: Sun Mar 2 17:31:18 2008 - - - Ultima compilazione: Sun Mar 2 17:35:45 2008 -

-

"Tor" e l'"Onion Logo" sono marchi registrati di The Tor Project, Inc. -

-

- Questa pagina è disponibile anche nelle lingue seguenti: - English, español, français, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Come configurare la lingua predefinita per i documenti. -

-

Questa traduzione non è stata controllata dagli sviluppatori di - Tor. Può essere obsoleta o errata. Il sito - ufficiale di Tor è in inglese, all'indirizzo https://torproject.org/ -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-unix.html.pl tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.pl --- tor-0.2.0.34/doc/website/tor-doc-unix.html.pl 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,213 +0,0 @@ - - - - Tor: Instrukcje instalacji dla Linux/BSD/Unix - - - - - - -
- - - - - - - -
-
-

Uruchamianie klienta Tor na Linux/BSD/Unix

-
-

-To są instrukcje do instalacji klienta Tora. Jeśli chcesz - przekazywać ruch innych, by wspomóc rozwój sieci (prosimy), przeczytaj poradnik o Konfigurowaniu przekaźnika sieci Tor. -

-
- -

Krok 1: Pobranie i instalacja Tora

-
-

Najnowsze wydanie Tora można znaleźć na stronie pobierania. Mamy tam też pakiety dla systemów Debian, - Red Hat, Gentoo, *BSD, etc. -

-

Jeśli masz zamiar kompilować Tora, najpierw zainstaluj libevent, i upewnij się, że - masz OpenSSL i zlib (łącznie z pakietami -devel, jeśli są). Potem uruchom:
- tar xzf tor-0.1.2.19.tar.gz; cd tor-0.1.2.19
- ./configure && make

- Możesz teraz uruchomić Tora poprzez src/or/tor, lub możesz uruchomić make install - (jako root, jeśli potrzeba), by zainstalować Tora do /usr/local, wtedy możesz - go uruchamiać po prostu pisząc tor. -

-

Tor jest domyślnie skonfigurowany jako klient. Używa wbudowanego domyślnego - pliku konfiguracji, i większość użytkowników nie będzie musiała zmieniać - żadnych ustawień. Tor jest teraz zainstalowany. -

-
- -

Krok 2: Instalacja Privoxy do przeglÄ…dania sieci WWW

-
-

Po instalacji Tora musisz skonfigurować swoje aplikacje, by go używały. -

-

- Pierwszym krokiem jest ustawienie sposobu przeglądania sieci WWW. Zacznij od instalacji Privoxy: kliknij na 'ostatnie wydania' ('recent releases') i - wybierz swój ulubiony typ paczki lub instaluj ze źródeł. Privoxy jest filtrującym - serwerem pośredniczącym (proxy) do WWW, który dobrze integruje się z Torem. -

-

Po instalacji Privoxy (z paczki lub źródeł) - musisz skonfigurować Privoxy, by używało Tora. - Może ci się przydać -ten -przykładowy plik konfiguracyjny. Jeśli nie, powinieneś ręcznie skonfigurować Privoxy -według następujących instrukcji. -

-

- Otwórz plik "config" z konfiguracją Privoxy (poszukaj w /etc/privoxy/ lub /usr/local/etc/) - i dodaj linię
- forward-socks4a / 127.0.0.1:9050 .
- na górze tego pliku konfiguracyjnego. Nie zapomnij dodać kropki na końcu. -

-

Privoxy loguje wszystko, co przez niego przechodzi. Żeby temu zapobiec, musisz - zakomentować 3 linie poprzez wstawienie - # na ich początek. Owe trzy linie to:
-logfile logfile
- i linia
-jarfile jarfile
- i (na niektórych systemach) linia
-debug 1 # show each GET/POST/CONNECT request
-

-

W zależności od domyślnego pliku konfiguracji Provoxy, -być może będziesz musiał wyłączyć opcje enable-remote-toggle, -enable-remote-http-toggle i enable-edit-actions. -

-

Musisz ponownie uruchomić Privoxy, by zmiany odniosły efekt.

-
- -

Krok 3: Konfiguracja aplikacji, by używały Tora

-
-

Po instalacji Tora i Privoxy musisz skonfigurować swoje aplikacje, by ich używały. - Pierwszym krokiem jest ustawienie sposobu przeglądania sieci WWW.

-

Jeśli używasz przeglądarki Firefox (co zalecamy), po prostu zainstaluj rozszerzenie - Torbutton, ponownie uruchom Firefoksa i gotowe: -

-Rozszerzenie Torbutton dla Firefoksa -
-

-(Dowiedz się więcej o - rozszerzeniu Torbutton. - Jeśli masz zamiar używać Firefoksa na innym komputerze niż tam, gdzie jest Tor, spójrz na wpis w FAQ - na temat uruchamiania Tora na innym komputerze. Jeśli musisz używać innej - przeglądarki niż Firefox, musisz samodzielnie - skonfigurować jej ustawienia proxy.) -

-

Korzystanie z Privoxy jest konieczne, gdyż żądania DNS - z przeglądarek wyciekają, gdy przeglądarki używają bezpośrednio serwera pośredniczącego SOCKS, - co uniemożliwia zachowanie pełnej anonimowości. Privoxy usuwa również pewne - niebezpieczne nagłówki z żądań WWW i blokuje okropne serwisy z banerami, jak Doubleclick.

-

By "storyfikować" inne aplikacje, które używają proxy dla HTTP, po prostu - skieruj je na Privoxy (czyli localhost, port 8118). By aplikacje bezpośrednio używały - serwera SOCKS (do komunikatorów, Jabbera, IRC, itp.), skieruj je - bezpośrednio na Tora (localhost, port 9050), ale przeczytaj ten - wpis do FAQ, dlaczego to może być niebezpieczne. Jeśli aplikacja nie - obsługuje ani proxy dla HTTP, ani dla SOCKS, spójrz na tsocks lub - socat. -

-

Po informacje, jak "storyfikować" inne aplikacje, spójrz na - Torify - HOWTO. -

-
- -

Krok 4: Upewnij się, że wszystko działa

-
-

Teraz powinieneś spróbować użyć swojej przeglądarki z Torem i - upewnić się, że Twój adres IP jest anonimizowany. Kliknij na - wykrywacz - Tora i sprawdź, cze jego zdaniem używasz Tora czy nie. - (Jeśli ta strona akurat nie działa, przeczytaj ten - wpis w FAQ, by poznać więcej sposobów na testowanie swojego Tora.) -

-

Jeśli masz zaporę ogniową, która ogranicza możliwości Twojego komputera co - do łączenia się z samym sobą, zezwól w niej na połączenia od programów - lokalnych na porty lokalne 8118 i 9050. Jeśli zapora blokuje połączenia - wychodzące, spraw, by można się było połączyć choć z portami 80 i 433, - po czym przeczytaj ten - wpis do FAQ. Jeśli twoja konfiguracja SELinux'a nie pozwala na - prawidłowe działanie Tora lub Privoxy, utwórz plik o nazwie booleans.local - w katalogu /etc/selinux/targeted. Wyedytuj ten plik swoim ulubionym edytorem - i dopisz "allow_ypbind=1". Aby zmiany odniosły efekt, ponownie uruchom komputer. -

-

Jeśli dalej nie działa, spójrz na ten - wpis FAQ, by poszukać wskazówek.

-
- - -

Krok 5: Konfiguracja Tora jako przekaźnika sieci

-
-

Sieć Tora polega na ochotnikach oddających część swojego łącza. Im więcej - ludzi uruchomi przekaźnik sieci, tym szybsza będzie sieć Tora. Jeśli masz co najmniej - 20 kilobajtów/s w obie strony, pomóż Torowi, konfigurując swojego klienta tak, - by był także przekaźnikiem sieci Tor. Mamy wiele cech, które czynią przekaźniki Tora łatwymi i - wygodnymi, łącznie z ograniczeniem przepustowości, politykami wyjścia, byś mógł - zmniejszyć ryzyko skarg, oraz obsługą dynamicznych adresów IP.

-

Posiadanie przekaźników w wielu różnych miejscach w sieci sprawia, że - użytkownicy są bezpieczni. Ty - też możesz mieć lepszą anonimowość, gdyż serwery, do których się łączysz, - nie mogą stwierdzić, czy połączenie pochodzi z Twojego komputera, czy - zostało przekierowane z innych.

-

Przeczytaj szczegóły w naszym przewodniku Konfiguracji -przekaźnika sieci Tor.

-
-

Jeśli masz pomysły na ulepszenie tej strony, prosimy je do nas wysłać. Dziękujemy!

-
-
-
-
-

- Webmaster - - Ostatnio zmodyfikowane: Sun Mar 2 17:31:17 2008 - - - Ostatnio wygenerowane: Sun Mar 2 17:35:56 2008 -

-

"Tor" i "Onion Logo" (logo cebuli) sÄ… znakami handlowymi The Tor Project, Inc. -

-

- Ta strona jest także dostÄ™pna w nastÄ™pujÄ…cych jÄ™zykach: - English, español, français, Italiano, Русский (Russkij), 中文(简) (Simplified Chinese).
- Jak ustawić domyślny język dokumentu. -

-

- Deweloperzy Tora nie sprawdzili tłumaczenia tej strony pod względem dokładności - i poprawności. Tłumaczenie może być przestarzałe lub niepoprawne. Oficjalna strona Tora jest - po angielsku, pod adresem https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-unix.html.ru tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.ru --- tor-0.2.0.34/doc/website/tor-doc-unix.html.ru 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.ru 1970-01-01 00:00:00.000000000 +0000 @@ -1,212 +0,0 @@ - - - - Tor: УÑтановка на Linux/BSD/Unix - - - - - - -
- - - - - - - -
-
-

ЗапуÑкк клиента Tor на Linux/BSD/Unix

-
-

-Внимание: Ñто инÑтрукции по уÑтановке клиента Tor. -ЕÑли вы хотите передавать Ñерверный трафик чтобы помочь -увеличитьÑÑ Ñети Tor (пожалуйÑта делайте Ñто), прочитайте инÑтрукции по -наÑтройке Ñервера. -

-
- -

Шаг первый: Скачать и уÑтановить Tor

-
-

-Скачайте поÑледний релиз Tor Ñо Ñтраницы -download. Мы предоÑтавлÑем пакеты Ð´Ð»Ñ Debian, -Red Hat, Gentoo, *BSD, etc. -

-

ЕÑли вы Ñобираете из иÑходников, Ñначала уÑтановите -libevent, -и убедитеÑÑŒ что у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ openssl и zlib (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ -devel пакеты еÑли такие -ÑущеÑтвуют). Потом :
-tar xzf tor-0.1.2.19.tar.gz; cd tor-0.1.2.19
-./configure && make

-Теперь вы можете запуÑкать tor как src/or/tor, или Ñделав make install -(под root'ом еÑли требуетÑÑ) уÑтановите в /usr/local/, и тогда можно запуÑкать клиент -проÑто командой tor. -

-

По умолчанию Tor наÑтроен работать в качеÑтве клиента. ИÑпользуетÑÑ Ð²Ñтроенный -конфигурационный файл, и в большинÑтве Ñлучаев вам не требуетÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ какие-либо -наÑтройки. Ð’ÑÑ‘, Tor уÑтановлен. -

-
- -

Шаг второй: ÐаÑтроить Privoxy чтобы иÑпользовать Tor в браузере

-
-

ПоÑле уÑтановки Tor, надо научить другие Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ñпользовать его. -

-

-Первым делом займёмÑÑ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð¾Ð¼. Сначала уÑтановите -Privoxy: кликните 'recent releases' -и выберите подходÑщий пакет или иÑходники. Privoxy Ñто фильтрующий -веб-прокÑи который хорошо интегрируетÑÑ Ñ Tor'ом. -

-

ПоÑле уÑтановки Privoxy (из пакета или из иÑходников), -требуетÑÑ Ð½Ð°Ñтроить Privoxy иÑпользовать Tor. Ð’ качеÑтве примера можно иÑпользовать -Ñтот конфиг -Privoxy. Иначе вам придётÑÑ Ð½Ð°Ñтроить Privoxy вручную, ÑÐ»ÐµÐ´ÑƒÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñм ниже. -

-

-Откройте конфигурационный файл Privoxy (Ñм. в /etc/privoxy/ или /usr/local/etc/) -и добавьте Ñтроку
-forward-socks4a / 127.0.0.1:9050 .
-в начале файла. Ðе забудьте точку в конце Ñтроки. -

-

Privoxy запиÑывает в лог-файл вÑе проходÑщие запроÑÑ‹. Чтобы выключить Ñто поведение -закомментируйте три Ñтрочки в конфиге (вÑтавив Ñимвол -# в начале Ñтроки). Эти три Ñтроки выглÑдÑÑ‚ так:
-logfile logfile
-и
-jarfile jarfile
-и (на некоторых ÑиÑтемах)
-debug 1 # show each GET/POST/CONNECT request
-

-

Ð’ завиÑомоÑти от того какие у Ð²Ð°Ñ Ð¿Ð¾ умолчанию наÑтройки Privoxy, -вам может понадобитьÑÑ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ enable-remote-toggle, -enable-remote-http-toggle, и enable-edit-actions. -

-

ПерезапуÑтите Privoxy чтобы наÑтройки вÑтупили в Ñилу.

-
- -

Шаг третий: ÐаÑтроить Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Tor

-
-

ПоÑле уÑтановки, вы должны наÑтроить оÑтальные Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ -чтобы они иÑпользовали Tor и Privoxy. Ð”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° наÑтроим браузер.

-

ЕÑли вы иÑпользуете Firefox (мы рекомендуем), проÑто уÑтановите -плагин Torbutton, -перезапуÑтите браузер, и вÑÑ‘ готово: -

-Torbutton plugin for Firefox -
-

-(Подробнее про Torbutton. -ЕÑли вы ÑобираетеÑÑŒ запуÑкать Firefox и Tor на разных компьютерах, Ñмотрите - -Ñтот раздел FAQ. ЕÑли вы иÑпользуйте другой браузер (не Firefox), -вам придётÑÑ ÑамоÑтоÑтельно указать наÑтройки прокÑи.) -

-

ИÑпользование Privoxy обÑзательно так как браузеры -пропуÑкают ваши DNS запроÑÑ‹ еÑли иÑпользовать SOCKS прокÑи напрÑмую, что -безуÑловно раÑкрывает вашу анонимноÑÑ‚ÑŒ. Privoxy также удалÑет некоторые небезопаÑные -заголовки из http-запроÑов, и блокирует надоедливые рекламные Ñайты.

-

Чтобы торифицировать(Torify) другие Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ðµ поддерживают HTTP прокÑи, -проÑто укажите им на Privoxy (то еÑÑ‚ÑŒ, localhost порт 8118). Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SOCKS -напрÑмую (Ñлучай IM (ÑиÑтемы мгновенного обмена ÑообщениÑми), Jabber, IRC, итд), -укажите Ð°Ð´Ñ€ÐµÑ Ð¸ порт клиента Tor (localhost порт 9050), но ознакомьтеÑÑŒ -Ñ Ñтим -разделом FAQ опиÑывающим небезопаÑноÑÑ‚ÑŒ такого ÑпоÑоба. Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ -которые не поддерживают ни SOCKS ни HTTP, попробуйте -tsocks или -socat. -

-

Информацию о том как торифицировать другие Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ поиÑкать в -Torify -HOWTO. -

-
- -

Шаг четвёртый: УбедитеÑÑŒ что вÑÑ‘ работает

-
-

-Далее, попробуйте иÑпользовать браузер через Tor и убедитеÑÑŒ что -ваш IP Ð°Ð´Ñ€ÐµÑ Ð½Ðµ выдаётÑÑ. ПоÑетите -Tor детектор -и проверьте что он Ñкажет - иÑпользуете вы Tor или нет. -(ЕÑли Ñайт не работает, поÑмотрите -Ñтот -раздел FAQ и узнайте больше ÑпоÑобов протеÑтировать Tor.) -

-

ЕÑли уÑтановлен перÑональный файерволл который ограничивает ÑпоÑобноÑÑ‚ÑŒ вашего -компьютера коннектитÑÑ Ðº Ñамому Ñебе (например Ñто SELinux на Fedora Core 4), -разрешите ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ локальных приложений к Privoxy (локальный порт 8118) и -Tor (локальный порт 9050). ЕÑли ваш файерволл -блокирует иÑходÑщие ÑоединениÑ, откройте по крайней мере TCP порты -80 и 443, а потом ознакомьтеÑÑŒ Ñ - -Ñтим разделом FAQ. ЕÑли наÑтройки SELinux мешают корректной работе -tor или privoxy, Ñоздайте файл booleans.local в каталоге -/etc/selinux/targeted. Откройте Ñтот файл в любимом текÑтовом редакторе и -укажите "allow_ypbind=1". ПерезапуÑтите машину Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ð¸Ñ Ñтих наÑтроек. -

-

ЕÑли Ñто вÑÑ‘-таки не Ñработает, поищите подÑказки в FAQ.

-
- - -

Шаг пÑтый: ÐаÑтройте Ñервер

-
-

Сеть Tor оÑновываетÑÑ Ð½Ð° добровольцах делÑщихÑÑ Ñвоим трафиком. Чем больше людей -запуÑкают Ñерверы, тем быÑтрее работает Ñеть Tor. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ по крайней мере -20 килобайт/Ñек в каждом направлении, пожалуйÑта помогите Ñети Tor наÑтроив Ñвой -Ñервер. Мы реализовали много чего чтобы Ñделать Ñерверы Tor лёгкими и удобными -в иÑпользовании, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ðµ трафика, Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð°(exit policies), -и поддержку динамичеÑких IP.

-

БезопаÑноть пользователей Tor в первую очередь обеÑпечиваетÑÑ -именно размещением Ñамих Ñерверов Tor в разных уголках Интернета. -Ð’Ñ‹ также получаете -более Ñильную анонимноÑÑ‚ÑŒ Ñами, -так как третьи Ñтороны не могут знать кто инициировал ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ - ваш локальный компьютер -или другие узлы Ñети Tor.

-

Смотрите подробное опиÑание как наÑтроить Ñервер.

-
-

ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ Ð¿Ð¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð¿Ð¾ улучшению Ñтого документа, пожалуйÑта приÑылайте их нам. СпаÑибо!

-
-
-
-
-

- Webmaster - - ПоÑледние изменениÑ: Sun Mar 2 17:31:17 2008 - - - ПоÑледнÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑциÑ: Sun Mar 2 17:36:02 2008 -

-

"Tor" и "Onion Logo" - торговые марки принадлежащие Tor Project, Inc. -

-

- Эта Ñтраница также переведена на Ñледующие Ñзыки: - English, español, français, Italiano, polski, 中文(简) (Simplified Chinese).
- Как уÑтановить Ñзык документов по умолчанию. -

-

Разработчики Tor не проверÑли Ñтот перевод на точноÑÑ‚ÑŒ и корректноÑÑ‚ÑŒ. - Перевод может быть уÑтаревшим или проÑто неправильным. Официальный веб-Ñайт - Tor на английÑком Ñзыке доÑтупен по адреÑу - https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-unix.html.zh-cn tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.zh-cn --- tor-0.2.0.34/doc/website/tor-doc-unix.html.zh-cn 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-unix.html.zh-cn 1970-01-01 00:00:00.000000000 +0000 @@ -1,220 +0,0 @@ - - - - Linux/BSD/Unix 安装指导 - - - - - - -
- - - - - - - -
-
-

在 Linux/BSD/Unix 上è¿è¡Œ Tor 客户端

-
-

- -请注æ„此处æ供的是è¿è¡Œ Tor 客户端的安装指导。 -如果你想è¦è´¡çŒ®æµé‡å¸®åŠ©ç½‘络增长(请这么åšï¼‰ï¼Œ -请阅读é…置中继指导。 - -

-
- -

第一步:下载并安装 Tor

-
-

-Tor 最新å‘布版本å¯ä»¥åœ¨ä¸‹è½½é¡µé¢èŽ·å¾—。 -我们åŒæ ·æ供了 Debian,Red Hat,Gentoo,*BSD 等的软件包。 -

-

-如果你打算从æºæ–‡ä»¶ç¼–译,首先安装 libevent, -并确认已安装 openssl å’Œ zlib(包括 -devel 软件包)。 -然åŽæ‰§è¡Œï¼š
-tar xzf tor-0.1.2.19.tar.gz; cd tor-0.1.2.19
-./configure && make

-现在你å¯ä»¥é€šè¿‡ src/or/tor è¿è¡Œ Tor, -或者你å¯ä»¥æ‰§è¡Œ make installï¼ˆéœ€è¦ root æƒé™ï¼‰æŠŠå®ƒå®‰è£…到 /usr/local, -之åŽä½ å°±èƒ½é€šè¿‡ tor å¯åŠ¨ Tor。 -

-

-默认状æ€ä¸‹ï¼ŒTor 被é…置为客户端。它使用一个内置的默认é…置文件, -大多数人ä¸éœ€è¦ä¿®æ”¹å…¶ä¸­çš„任何设置。Tor 安装完毕。 -

-
- -

第二步:为 Web æµè§ˆå®‰è£… Privoxy

-
-

-Tor 安装结æŸåŽï¼Œä½ éœ€è¦é…置应用程åºæ¥ä½¿ç”¨å®ƒã€‚ -

-

-第一步是é…ç½® Web æµè§ˆã€‚ -首先安装 Privoxy: -点击“recent releasesâ€ç„¶åŽé€‰æ‹©ä½ éœ€è¦çš„软件包或者直接从æºæ–‡ä»¶å®‰è£…。 -Privoxy 是一个进行内容过滤的 Web 代ç†ï¼Œèƒ½ä¸Ž Tor 很好地结åˆã€‚ -

-

-Privoxy 安装完æˆåŽï¼ˆé€šè¿‡è½¯ä»¶åŒ…或æºæ–‡ä»¶ï¼‰ï¼Œä½ éœ€è¦é…ç½® Privoxy 使用 Tor。Privoxy -的这个示例é…置或许对你有用。å¦åˆ™ï¼Œä½ åº”该按照下é¢çš„指导æ¥æ‰‹å·¥é…ç½® Privoxy。 -

-

-打开 Privoxy 的“configâ€æ–‡ä»¶ï¼ˆä½äºŽ /etc/privoxy 或 /usr/local/etc), -在é…置文件的开始添加一行
-forward-socks4a / 127.0.0.1:9050 .
-别忘了最åŽé‚£ä¸ªç‚¹ã€‚ -

-

-Privoxy ä¿ç•™äº†ä¸€ä¸ªæ—¥å¿—文件记录所有通过它的东西。 -为了阻止这个你需è¦æ³¨é‡ŠæŽ‰ä¸‰è¡Œï¼ˆåœ¨è¡Œå‰æ·»åŠ ä¸€ä¸ª #)。 -这三行是:
-logfile logfile
-和
-jarfile jarfile
-和(在æŸäº›ç³»ç»Ÿä¸Šï¼‰
-debug 1 # show each GET/POST/CONNECT request
-

-

å–决于你所使用的是哪一个 Privoxy 默认é…置文件,你也许还需è¦å–消 -enable-remote-toggleã€enable-remote-http-toggle å’Œ -enable-edit-actions。 -

-

为了使修改生效,你需è¦é‡å¯ Privoxy。

-
- -

第三步:é…置应用程åºä½¿ç”¨ Tor

-
-

-当 Tor å’Œ Privoxy 安装结æŸåŽï¼Œä½ éœ€è¦é…置你的应用程åºæ¥ä½¿ç”¨å®ƒä»¬ã€‚ -第一步是é…ç½® Web æµè§ˆã€‚ -

-

-如果你使用 Firefox(这是我们所推è的),安装 -Torbutton æ’件, -然åŽé‡æ–°å¯åŠ¨ Firefox,就这么简å•ï¼š -

-Torbutton plugin for Firefox -
-

-(更多关于 Torbutton。 -如果你打算在没有安装 Tor 的计算机上使用 Firefox, -请阅读在å¦ä¸€å°è®¡ç®—机上è¿è¡Œ Tor çš„ FAQ æ¡ç›®ã€‚ -如果你需è¦ä½¿ç”¨é™¤ Firefox 以外的其他æµè§ˆå™¨ï¼Œ -你就得自己é…置代ç†è®¾ç½®ã€‚) -

-

-使用 Privoxy 是必è¦çš„, -因为当直接使用 SOCKS 代ç†æ—¶ï¼Œæµè§ˆå™¨ä¼šæ³„露你的 DNS 请求, -这于你的匿åä¸åˆ©ã€‚ -åŒæ—¶ï¼ŒPrivoxy 会删除 Web 请求中å±é™©çš„报头并且阻挡 Doubleclick 之类的令人厌æ¶çš„广告站点。 -

-

-è¦è®©å…¶ä»–æ”¯æŒ HTTP 代ç†çš„应用程åºä½¿ç”¨ Torï¼Œå°†å®ƒä»¬æŒ‡å‘ Provixy å³å¯ï¼ˆä¹Ÿå°±æ˜¯ localhost ç«¯å£ 8118)。 -直接使用 SOCKS(å³æ—¶é€šè®¯ã€Jabberã€IRC 等),å¯å°†ä½ çš„应用程åºç›´æŽ¥æŒ‡å‘ Tor(localhost ç«¯å£ 9050), -但是请阅读此 FAQ æ¡ç›®â€”—你得明白这么åšå¯èƒ½æ˜¯å±é™©çš„。 -对于既ä¸æ”¯æŒ SOCKS 也ä¸æ”¯æŒ HTTP 的应用程åºï¼Œè€ƒè™‘一下 -tsocks 或者 -socat。 -

-

-如何 Tor 化(Torify)其他应用程åºçš„ä¿¡æ¯è¯·æŸ¥çœ‹ -Torify -HOWTO。 -

-
- -

第四步:确定它在工作

-
-

-然åŽï¼Œä½ åº”该通过æµè§ˆå™¨æ¥éªŒè¯ä½ çš„ IP 地å€å·²ç»åŒ¿å化了。 -点击 Tor 探测器看看它是å¦è®¤ä¸ºä½ åœ¨ä½¿ç”¨ Tor。 -(如果这个站点下线了, -æ­¤ FAQ æ¡ç›®æœ‰å¦‚何测试 Tor 的更多建议。) -

-

-如果你的个人防ç«å¢™é™åˆ¶ä½ çš„计算机连接到它自己(包括 Fedora Core 4 上é¢çš„ SELinux 这样的东西), -一定è¦å…许从本地应用程åºåˆ° Privoxyï¼ˆæœ¬åœ°ç«¯å£ 8118)和 Torï¼ˆæœ¬åœ°ç«¯å£ 9050)的连接。 -如果你的防ç«å¢™é˜»æŒ¡å‘外的连接,那么至少让它能够连接 TCP ç«¯å£ 80 å’Œ 443, -然åŽé˜…读此 FAQ æ¡ç›®ã€‚ -如果 SELinux çš„é…置使得 Tor 或者 Privoxy 无法正常è¿è¡Œï¼Œ -在目录 /etc/selinux/targeted 下创建一个å为 booleans.local 的文件。 -用你喜爱的文本编辑器修改这个文件加入“allow_ypbind=1â€ã€‚ -然åŽé‡å¯æœºå™¨ä½¿ä¿®æ”¹ç”Ÿæ•ˆã€‚ -

-

-如果它还是罢工, -那就看看此 FAQ æ¡ç›®å¯»æ‰¾ä¸€äº›çº¿ç´¢ã€‚ -

-
- -

第五步:é…置中继

-
-

-Tor 网络ä¾é å¿—愿者们贡献带宽è¿è¡Œã€‚è¿è¡Œä¸­ç»§çš„人越多,Tor 网络的速度就越快。 -如果你的网络连接速度达到至少æ¯ç§’ 20KB,请è¿è¡Œä¸€å°ä¸­ç»§ä»¥å¸®åŠ© Tor。 -我们有许多特性使得 Tor 中继的è¿è¡Œç®€å•è€Œæ–¹ä¾¿ï¼ŒåŒ…括带宽的速率é™åˆ¶ï¼Œ -定制出å£ç­–略以é¿å…滥用,以åŠå¯¹äºŽåŠ¨æ€ IP 地å€çš„支æŒã€‚ -

-

-在互è”网上的许多ä¸åŒåœ°æ–¹è¿è¡Œä¸­ç»§ä¿æŠ¤äº† Tor 用户的安全。你自身的 -匿å也能得到更好的ä¿æŠ¤ï¼Œå› ä¸ºç«™ç‚¹ä¸çŸ¥é“连接究竟æ¥è‡ªä½ çš„电脑还是为他人传递。 -

-

-阅读更详细的é…置中继指导。 -

-
-

-如果你有改进本文档的建议,请告诉我们。 -è°¢è°¢ï¼ -

-
-
-
-
-

- Webmaster - - 最åŽä¿®æ”¹: Tue Feb 26 19:27:12 2008 - - - 最åŽç¼–译: Sun Mar 2 17:36:06 2008 -

-

"Tor" 和 "Onion Logo" 是 The Tor Project, Inc. 的商标。 -

-

- 警告: 本翻译的内容å¯èƒ½æ˜¯è¿‡æ—¶çš„。英文原文ä½äºŽç¬¬ 13768 次修订, - 但本翻译基于第 12809 次修订。 -

-

- 本页é¢è¿˜æœ‰å¦‚下语言的版本: - English, español, français, Italiano, polski, Русский (Russkij)。
- 如何设置默认语言。 -

-

- Tor çš„å¼€å‘者和 EFF å‡æœªå¯¹æœ¬ç¿»è¯‘的精确性和正确性作检查。 - 它å¯èƒ½æ˜¯è¿‡æ—¶çš„或者错误的。 - Tor 的官方网站的语言是英文,ä½äºŽ https://www.torproject.org/。 -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-web.html.en tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.en --- tor-0.2.0.34/doc/website/tor-doc-web.html.en 2009-02-09 03:32:41.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.en 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ - - - - Tor: Configuring your browser to use Tor - - - - - - -
- - - - - - - -
-
-

Configuring your browser to use Tor

-
-

If you're using Firefox (we recommend it), you don't need this page. -Simply install the Torbutton -plugin, restart your Firefox, and you're all set: -

-Torbutton plugin for Firefox -
-

Otherwise, you need to manually configure your browser's proxy -settings. -
In Mozilla and Firefox on Windows, this is in -Tools - Options - General - Connection Settings. -
In Firefox on OS X, it's Firefox - Preferences - General - Connection Settings. -
In Firefox on Linux, this is in -Edit - Preferences - Advanced - Proxies. -
In Opera it's Tools - Preferences(Advanced) - Network - Proxy servers. -
In IE, it's Tools - Internet Options - Connections - LAN Settings - Check Proxy -Server - Advanced.

-Proxy settings in Firefox -

-You should fill in "localhost" -and "8118" to point the top four protocols to Privoxy, as shown here. (Even -though Privoxy doesn't support FTP and Gopher, you -should set them up anyway.) You should also fill out the socks proxy entry to point directly to Tor ("localhost", "9050", and socks5) -to cover protocols besides the first four. Then click "OK".

-
-

If you have suggestions for improving this document, please send them to us. Thanks!

-
-
-
-
-

- Webmaster - - Last modified: Sun Mar 2 17:31:17 2008 - - - Last compiled: Sun Mar 2 17:35:37 2008 -

-

"Tor" and the "Onion Logo" are trademarks of The Tor Project, Inc. -

-

- This page is also available in the following languages: - español, français, Italiano, polski, Русский (Russkij).
- How to set the default document language. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-web.html.es tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.es --- tor-0.2.0.34/doc/website/tor-doc-web.html.es 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.es 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ - - - - Configurar su navegador para usar Tor - - - - - - -
- - - - - - - -
-
-

Configurar su navegador para usar Tor

-
-

Si está usando Firefox (lo recomendamos), no necesita esta página. -Simplemente instale el plugin Torbutton -, reinicie Firefox, y eso es todo: -

-Plugin Torbutton para Firefox -
-

En caso contrario, tiene que configurar manualmente los proxies del navegador. -
En Mozilla y Firefox en Windows, están en -Herramientas - Opciones - General - Opciones de Conexión. -
En Firefox en OS X, es Firefox - Preferencias - General - Opciones de Conexión. -
En Firefox en Linux, es -Editar - Preferencias - Advanzado - Proxies. -
En Opera es Herramientas - Preferencias (Advanzado) - Red - Servidores Proxy. -
En IE, es Herramientas - Opciones de Internet - Connexiones - Opciones LAN - Comprobar Servidor -Proxy - Advanzado.

-Configuración Proxy en Firefox -

-Debería rellenar "localhost" -y "8118" para que los primeros cuatro protocolos señalen a Privoxy, como se muestra aquí. (Aunque -Privoxy no soporta FTP ni Gopher, debería -ponerlos de todas formas.) Debería también rellenar la entrada del proxy socks -para apuntar directamente a Tor ("localhost", "9050", y socks5) -para cubrir protocolos además de los cuatro primeros. Luego pulse "OK".

-
-

Si tiene sugerencias para mejorar este documento, por favor envíenoslas. ¡Gracias!

-
-
-
-
-

- Webmaster - - Última modificación: Tue Feb 26 19:27:13 2008 - - - Última compilación: Sun Mar 2 17:35:41 2008 -

-

"Tor" y el "Logo de la Cebolla" son -marcas registradas de El Proyecto Tor, S.A. -

-

- Aviso: Esta traducción podría estar obsoleta. La revisión original en inglés es la - 13768 mientras que esta revisión está basada en la - 12809. -

-

- Esta página también está disponible en los siguientes idiomas: - English, français, Italiano, polski, Русский (Russkij).
- Cómo establecer el idioma por defecto del documento. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-web.html.fr tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.fr --- tor-0.2.0.34/doc/website/tor-doc-web.html.fr 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.fr 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ - - - - Configuration de votre navigateur pour utiliser Tor - - - - - - -
- - - - - - - -
-
-

Configurer votre navigateur pour l'utilisation de Tor

-
-

Si vous utilisez Firefox (ce que nous recommandons), vous n'avez pas besoin de cette page. -Installez simplement le Plugiciel -Torbutton, relancez Firefox, et c'est tout : -

-Plugiciel Torbutton pour Firefox -
-

Sinon, vous avez à configurer manuellement les paramètres du mandataire de -votre navigateur. -
Dans Mozilla et Firefox sous Windows, ceci est dans -Outils - Options - Général - Paramètres de connexion. -
Dans Firefox sous OS X, c'est - Firefox - Préférences - Général - Paramètres de connexion. -
Dans Firefox sous Linux, c'est dans Édition - Préférences - Avancées - Proxy. -
Dans Opera c'est Fichier - Préférences - Réseau - Serveurs proxy. -
Dans IE, c'est Outils - Options Internet - Connexions - Paramètres Réseau - cocher Serveur proxy -- Avancé.

-Paramètres Proxy dans Firefox -

-Vous devriez remplir "localhost" -et "8118" sur les quatres protocoles du haut pour pointer sur Privoxy, comme montré ici. (Même -si Privoxy ne supporte pas les protocoles FTP et Gopher, vous devriez -les mettre aussi tout de même.) Vous devriez également remplir le mandataire socks -Pour pointer direcrement sur Tor ("localhost", "9050", et socks5) -pour couvrir l'ensemble des protocoles au delà des quatres premiers. Puis cliquer sur "OK".

-
-

Si vous avez des commentaires pour améliorer ce document, n'hésitez pas à nous écrire. Merci !

-
-
-
-
-

- Webmaster - - Dernière modification : Tue Feb 26 19:27:13 2008 - - - Dernière compilation : Sun Mar 2 17:35:51 2008 -

-

"Tor" et le Logo Onion sont des marques déposées du Projet Tor, Inc. -

-

- Attention: Cette traduction peut être obsolète. La version anglaise originale est la - 13768 alors que la version traduite est basée sur la - 12809. -

-

- Cette page est aussi disponible dans les langues suivantes : - English, español, Italiano, polski, Русский (Russkij).
- Comment configurer la langue par défaut du document. -

-

Les développeurs de Tor n'ont pas revu cette traduction en ce qui concerne la - pertinence et l'exactitude. Elle peut être obsolète ou fausse. La version - officielle du site web Tor est la version anglaise, disponible sur https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-web.html.it tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.it --- tor-0.2.0.34/doc/website/tor-doc-web.html.it 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.it 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ - - - - Tor: come configurare il browser per usare Tor - - - - - - -
- - - - - - - -
-
-

Configurire il browser per usare Tor

-
-

Se usi Firefox (lo consigliamo), non hai bisogno di questa pagina. -Basta installare ilplugin Torbutton - e riavviare Firefox: -

-Torbutton plugin for Firefox -
-

Altrimenti devi configurare a mano il proxy del tuo -browser. -
In Mozilla e Firefox su Windows, vai a -Strumenti - Opzioni - Generale - Impostazioni Connessione. -
In Firefox su OS X, è Firefox - Preferenze - Generale - Impostazini Connessione. -
In Firefox su Linux, si trova in -Modifica - Preferenze - Avanzate - Proxies. -
In Opera è Strumenti - Preferenze(Avanzate) - Rete - Proxy servers. -
In IE, è Strumenti - Opzioni Internet - Connessioni - Impostazioni LAN - Proxy -Server - Avanzate.

-Proxy settings in Firefox -

-Devi scrivere "localhost" -e "8118" per puntare i primi 4 protocolli a Privoxy, come mostrato qui. (Anche -se Privoxy non supporta FTP e Gopher, devi -configurarlo lo stesso.) Devi anche compilare il socks -proxy perché punti direttamente a Tor ("localhost", "9050", e socks5) -per coprire gli altri protocolli dopo i primi 4. Poi fai clic su "OK".

-
-

Se hai proposte per migliorare questo documento, per favore scrivicele. Grazie!

-
-
-
-
-

- Webmaster - - Ultima modifica: Sun Mar 2 17:31:18 2008 - - - Ultima compilazione: Sun Mar 2 17:35:46 2008 -

-

"Tor" e l'"Onion Logo" sono marchi registrati di The Tor Project, Inc. -

-

- Questa pagina è disponibile anche nelle lingue seguenti: - English, español, français, polski, Русский (Russkij).
- Come configurare la lingua predefinita per i documenti. -

-

Questa traduzione non è stata controllata dagli sviluppatori di - Tor. Può essere obsoleta o errata. Il sito - ufficiale di Tor è in inglese, all'indirizzo https://torproject.org/ -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-web.html.pl tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.pl --- tor-0.2.0.34/doc/website/tor-doc-web.html.pl 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ - - - - Tor: Konfiguracja przeglądarki, by używała Tora - - - - - - -
- - - - - - - -
-
-

Konfiguracja przeglądarki, by używała Tora

-
-

Jeśli używasz przeglądarki Firefox (co zalecamy), nie musisz czytać tej strony. - Po prostu zainstaluj rozszerzenie - Torbutton, ponownie uruchom Firefoksa i gotowe: -

-Rozszerzenie Torbutton dla Firefoksa -
-

W innym przypadku, musisz ręcznie skonfigurować ustawienia proxy w swojej przeglądarce. -
W przeglądarkach Mozilla i Firefox pod Windows, znajdują się w - Narzędzia - Opcje - Ogólne - Ustawienia połączenia. -
W Firefoksie na OS X, są w Firefox - Preferencje - Ogólne - Ustawienia połączenia. -
W Firefoksie pod systemem Linux, znajdują się w - Edycja - Preferencje - Zaawansowane - Proxy [od tłum: - W Firefoksie 1.5: Edycja - Preferencje - Ogólne - Ustawienia połączenia; - w Firefoksie 2.0: Edycja - Preferencje - Zaawansowane - Sieć - Ustawienia ] -
W Operze są w Narzędzia - Preferencje(Zaawansowane) - Sieć - Serwery Proxy. -
W IE, są w Narzędzia - Opcje internetowe - Połączenia - Ustawienia sieci LAN - zaznacz Serwer Proxy -- Zaawansowane.

-Ustawienia proxy w Firefoksie -

Powinieneś wpisać "localhost" i "8118", by skierować górne cztery protokoły na - Privoxy, jak pokazano. (Nawet mimo tego, że Privoxy nie obsługuje FTP i Gophera, powinieneś - i tak je ustawić.) Powinieneś też wypełnić pole SOCKS Proxy, by wskazywało - bezpośrednio na Tora ("localhost", "9050" i socks5), by pokryć inne protokoły - poza pierwszymi czterema. Po wszystkim kliknij "OK".

-
-

Jeśli masz pomysły na ulepszenie tej strony, prosimy je do nas wysłać. Dziękujemy!

-
-
-
-
-

- Webmaster - - Ostatnio zmodyfikowane: Sun Mar 2 17:31:17 2008 - - - Ostatnio wygenerowane: Sun Mar 2 17:35:57 2008 -

-

"Tor" i "Onion Logo" (logo cebuli) sÄ… znakami handlowymi The Tor Project, Inc. -

-

- Ta strona jest także dostÄ™pna w nastÄ™pujÄ…cych jÄ™zykach: - English, español, français, Italiano, Русский (Russkij).
- Jak ustawić domyślny język dokumentu. -

-

- Deweloperzy Tora nie sprawdzili tłumaczenia tej strony pod względem dokładności - i poprawności. Tłumaczenie może być przestarzałe lub niepoprawne. Oficjalna strona Tora jest - po angielsku, pod adresem https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-web.html.ru tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.ru --- tor-0.2.0.34/doc/website/tor-doc-web.html.ru 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-web.html.ru 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ - - - - Tor: ÐаÑтройка браузера - - - - - - -
- - - - - - - -
-
-

ÐаÑтройка браузера Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Tor

-
-

ЕÑли вы иÑпользуете Firefox (мы рекомендуем), вам не нужна Ñта Ñтраница. -ПроÑто уÑтановите -плагин Torbutton, -перезапуÑтите браузер, и вÑÑ‘ готово: -

-Плагин Torbutton Ð´Ð»Ñ Firefox -
-

Ð’ противном Ñлучае вам придётÑÑ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ задать наÑтройки прокÑи в вашем -браузере. -
Ð”Ð»Ñ Mozilla и Firefox на Windows, Ñто Tools - Options - General - Connection Settings. -
Ð”Ð»Ñ Firefox на OS X, Ñто Firefox - Preferences - General - Connection Settings. -
Ð”Ð»Ñ Firefox на Linux, Ñто Edit - Preferences - Advanced - Proxies. -
Ð”Ð»Ñ Opera Ñто Tools - Preferences(Advanced) - Network - Proxy servers. -
Ð”Ð»Ñ IE, Ñто Tools - Internet Options - Connections - LAN Settings - Check Proxy Server - Advanced.

-ÐаÑтройки прокÑи в Firefox -

-Ð’Ñ‹ должны указать "localhost" и "8118" чтобы перенаправлÑÑ‚ÑŒ -четыре указанных протокола на Privoxy, как показано на риÑунке. (Даже -ÑƒÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ñ Ñ‡Ñ‚Ð¾ Privoxy не поддерживает FTP и Gopher, -вы -должны указать их в любом Ñлучае.) Также надо заполнить поле socks в наÑтройках -прокÑи чтобы перенаправлÑÑ‚ÑŒ прÑмо в Tor ("localhost", "9050", и socks5) -оÑтальные протоколы, кроме первых четырёх. Потом жмите "OK".

-
-

ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ улучшению Ñтого документа, пожалуйÑта -приÑылайте их нам. СпаÑибо!

-
-
-
-
-

- Webmaster - - ПоÑледние изменениÑ: Sun Mar 2 17:31:17 2008 - - - ПоÑледнÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑциÑ: Sun Mar 2 17:36:03 2008 -

-

"Tor" и "Onion Logo" - торговые марки принадлежащие Tor Project, Inc. -

-

- Эта Ñтраница также переведена на Ñледующие Ñзыки: - English, español, français, Italiano, polski.
- Как уÑтановить Ñзык документов по умолчанию. -

-

Разработчики Tor не проверÑли Ñтот перевод на точноÑÑ‚ÑŒ и корректноÑÑ‚ÑŒ. - Перевод может быть уÑтаревшим или проÑто неправильным. Официальный веб-Ñайт - Tor на английÑком Ñзыке доÑтупен по адреÑу - https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-win32.html.de tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.de --- tor-0.2.0.34/doc/website/tor-doc-win32.html.de 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.de 1970-01-01 00:00:00.000000000 +0000 @@ -1,197 +0,0 @@ - - - - Tor: MS Windows Installations-Anweisungen - - - - - - -
- - - - - - - -
-
-

Den Tor Dienst unter MS Windows benutzen

-
-

-Bitte beachten Sie, das diese Anleitung die Installation des Tor Dienstes -für MS Windows (98, 98SE, NT4, 2000, XP, Server) enthält. -Wenn Sie Netzverkehr für Andere weiterleiten und beim Ausbau des Tor-Netzwerks mithelfen wollen -(Sie sind herzlich eingeladen!), lesen Sie bitte die -Anleitung zum Einrichten eines Servers. -

-
- -

Schritt Eins: Download und Installation von Tor

-
-

-Das Installationspaket für MS Windows enthält -Tor, -Vidalia (eine Benutzeroberfläche für Tor), und Privoxy (ein lokaler Proxy zum Filtern der Webseiten). -Die drei Programme sind für die gemeinsame Arbeit vorkonfiguriert. - -Bitte laden Sie sich jetzt entweder das stabile oder das experimentelle Softwarepaket für MS Windows von der Download-Seite. -

-

Falls die kombinierten Installationspakete bei Ihnen nicht funktionieren, können -Sie nur die Tor-Software auch von der -Windows Download Seite beziehen, -und dann Privoxy installieren -und einrichten. -

-tor installer splash page -

Wenn Sie Tor, Vidalia oder Privoxy bereits zuvor installiert haben, können Sie mit dem unten dargestellten -Dialog wählen, welche Komponenten aus dem kombinierten Softwarepaket nicht installiert werden sollen. -

-select components to install -

Nach der erfolgreichen Installation werden alle ausgewählten Programme automatisch für Sie gestartet. -

- -
- -

Schritt Zwei: Programme für Tor-Nutzung einrichten

-
-

Nach der Installation von Tor und Privoxy, müssen Sie Ihre Programme einstellen, -das sie Tor und Privoxy auch nutzen. -Zuerst wird der Web-Browser angepasst.

-

Wenn Sie Firefox nutzen (den wir empfehlen), installieren Sie einfach das Torbutton -Plugin, beenden und starten den Firefox wieder - das war's: -

-Torbutton plugin for Firefox -
-

-(Mehr über das -Torbutton-Plugin hier. -Wenn sie vorhaben, Firefox auf einem anderen Computer zu benutzen als dem Computer mit dem aktiven Tor Dienst -lesen Sie den FAQ -Eintrag zum Betrieb von Tor auf einem anderen Computer. -Wenn Sie einen anderen Browser als Firefox benutzen, müssen Sie -die Proxy-Einstellung selbst einrichten.) -

-

Die Benutzung von Privoxy ist notwendig weil -die Browser Ihre DNS Anfragen unverschlüsselt senden wenn Sie einen SOCKS Proxy direkt benutzen. -Dies gefährdet Ihre Anonymität. -Privoxy entfernt auch verschiedene die Anonymität gefährdende Header aus den -Web-Anforderungen und blockiert unbeliebte Schnüffler-Seiten wie -Doubleclick.

-

Andere Programme, die HTTP Proxies unterstützen, können Tor nutzen, wenn sie Privoxy -als HTTP Proxy einrichten (einfach "localhost" und "port 8118" eingeben). -Bei Programmen die SOCKS direkt nutzen (z.B. Instant-Messaging, Jabber, IRC, usw.) -tragen Sie Tor als Proxy ein ("localhost" und "port 9050"). -Aber beachten Sie diesen this -FAQ Eintrag warum dies Ihre Anommität gefährdet. -Bei Programmen, die weder SOCKS noch HTTP Proxies nutzen können, könnte SocksCap oder -FreeCap helfen. -(FreeCap ist freie Software; SocksCap ist kommerziell.)

-

Weitere Informationen, um Programme mit Tor zu anonymisieren, finden Sie im -Torify -HOWTO. -

-
- -

Schritt Drei: Prüfen Sie, ob alles läuft

-
-

-Prüfen Sie, ob Privoxy und Vidalia in der Task-Leiste aktiv sind. -Das Icon von Privoxy ist ein blauer oder grüner Kreis mit einem "P" darin -und Vidalia zeigt eine kleine grüne Zwiebel, wenn Tor aktiv ist oder eine -dunkle Zwiebel mit einem roten Kreuz, wenn Tor inaktiv ist. -Sie können den Tor-Dienst starten oder anhalten, wenn sie das Vidalia-Icon in -der Task-Leiste mit der rechten Maustaste anklicken und "Start" oder "Stopp" -aus dem Menü (unten) auswählen. -

-Vidalia Tray Icon -

-Dann sollten Sie prüfen, ob Ihr Browser Tor benutzt und Ihre IP-Adresse anonymisiert. -Klicken Sie auf den Tordetektor -und schaue, ob er der Meinung ist, dass Tor genutzt wird. -(Wenn die Seite nicht erreichbar ist, finden Sie in diesem -FAQ Eintrag weitere Vorschläge, Tor zu testen.) -

-

-Wenn Ihre Personal Firewall auch Verbindungen Ihres Computers mit den eigenen Programmen -blockiert, erlauben Sie Ihrer Personal Firewall Verbindungen Ihrer Programme mit "localhost" -auf Port 8118 und Port 9050. -Wenn Ihre Personal Firewall ausgehende Verbindungen blockiert, erlauben Sie Verbindungen -auf den TCP-Ports 80 und 443 und lesen Sie diesen this -FAQ Eintrag. -

-

Wenn es immer noch nicht funktioniert, lesen Sie -diesen -FAQ Eintrag für weitere Hinweise.

-
- -

Schritt Vier: Tor als Server einrichten

-
-

-Das Tor-Netzwerk ist auf Freiwillige angewiesen, die Bandbreite spenden. -Je mehr Menschen Tor-Server betreiben, desto schneller wird das Tor-Netzwerk. -Wenn Sie über mindestens 20 KBytes/s im Up- und Downstream verfügen -helfen Sie bitte dem Tor-Netzwerk, indem Sie auch einen Tor-Server einrichten. -Tor-Server haben viele Eigenschaften, die ihren Betrieb einfach und bequem machen, -z.B. Bandbreiten-Limitierung, exit policies, durch die Sie sich weniger dem Risiko -von Mißbrauchs-Vorwürfen aussetzen und Unterstützung von dynamischen IP-Adressen. -

-

Viele Server an den unterschiedlichsten Stellen im Internet macht die Tor-Benutzer erst sicher. - -Sie erhalten selbst auch eine stärkere Anonymität, -weil fremde Web-Seiten nicht feststellen können, ob eine Verbindung von -Ihrem Computer ausgeht, oder ob sie für andere weitergeleitet wird. -

-

Lesen Sie mehr in unserer Anleitung einen Tor Server konfigurieren -.

-
-

Ihre Verbesserungs-Vorschläge dieses Dokumentes senden Sie bitte an -uns. Vielen Dank!

-
-
-
-
-

- Webmaster - - Letzte Änderung: Tue Feb 26 19:27:13 2008 - - - Zuletzt kompiliert: Sun Mar 2 17:35:34 2008 -

-

"Tor" und das "Onion Logo" sind Warenzeichen der The Tor Project, Inc.

-

- Achtung: Diese Übersetzung ist möglicherweise veraltet. Das englische Original ist auf - Revision 13195 während diese Übersetzung auf - 8988 basiert. -

-

- Diese Seite gibt es auch in den folgenden Sprachen: - English, español, français, Italiano, polski, Português, Русский (Russkij).
- Wie stellt man die Standardsprache ein. -

-

Die Tor-Entwickler haben diese Übersetzung nicht auf Korrektheit geprüft. - Sie könnte veraltet oder falsch sein. Die offizielle Version ist in - englischer Sprache, erhältlich unter https://www.torproject.org/.

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-win32.html.en tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.en --- tor-0.2.0.34/doc/website/tor-doc-win32.html.en 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.en 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ - - - - Redirecting - - - - - - - -
- - - - - - - -Redirecting to ../docs/tor-doc-windows. -
-
-

- Webmaster - - Last modified: Tue Feb 26 19:27:12 2008 - - - Last compiled: Sun Mar 2 17:35:37 2008 -

-

"Tor" and the "Onion Logo" are trademarks of The Tor Project, Inc. -

-

- This page is also available in the following languages: - Deutsch, español, français, Italiano, polski, Português, Русский (Russkij).
- How to set the default document language. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-win32.html.es tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.es --- tor-0.2.0.34/doc/website/tor-doc-win32.html.es 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.es 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ - - - - - - - - - - -
- - - - - - - -TITLE="Redirecting" -REDIRECT="docs/tor-doc-windows" diff -Nru tor-0.2.0.34/doc/website/tor-doc-win32.html.fr tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.fr --- tor-0.2.0.34/doc/website/tor-doc-win32.html.fr 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.fr 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ - - - - Redirection - - - - - - -
- - - - - - - -REDIRECT="docs/tor-doc-windows" -
-
-

- Webmaster - - Dernière modification : Tue Feb 26 19:27:13 2008 - - - Dernière compilation : Sun Mar 2 17:35:53 2008 -

-

"Tor" et le Logo Onion sont des marques déposées du Projet Tor, Inc. -

-

- Cette page est aussi disponible dans les langues suivantes : - Deutsch, English, español, Italiano, polski, Português, Русский (Russkij).
- Comment configurer la langue par défaut du document. -

-

Les développeurs de Tor n'ont pas revu cette traduction en ce qui concerne la - pertinence et l'exactitude. Elle peut être obsolète ou fausse. La version - officielle du site web Tor est la version anglaise, disponible sur https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-win32.html.it tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.it --- tor-0.2.0.34/doc/website/tor-doc-win32.html.it 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.it 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ - - - - Redirecting - - - - - - - -
- - - - - - - -Redirecting to ../docs/tor-doc-windows. diff -Nru tor-0.2.0.34/doc/website/tor-doc-win32.html.pl tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.pl --- tor-0.2.0.34/doc/website/tor-doc-win32.html.pl 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ - - - - Przekierowanie - - - - - - - - -
-

- Webmaster - - Ostatnio zmodyfikowane: Tue Feb 26 19:27:13 2008 - - - Ostatnio wygenerowane: Sun Mar 2 17:35:57 2008 -

-

"Tor" i "Onion Logo" (logo cebuli) sÄ… znakami handlowymi The Tor Project, Inc. -

-

- Ta strona jest także dostÄ™pna w nastÄ™pujÄ…cych jÄ™zykach: - Deutsch, English, español, français, Italiano, Português, Русский (Russkij).
- Jak ustawić domyślny język dokumentu. -

-

- Deweloperzy Tora nie sprawdzili tłumaczenia tej strony pod względem dokładności - i poprawności. Tłumaczenie może być przestarzałe lub niepoprawne. Oficjalna strona Tora jest - po angielsku, pod adresem https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-win32.html.pt tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.pt --- tor-0.2.0.34/doc/website/tor-doc-win32.html.pt 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.pt 1970-01-01 00:00:00.000000000 +0000 @@ -1,224 +0,0 @@ - - - - Instruções de Instalação para - Torp/ MS Windows - - - - - - -
- - - - - - - -
-
-

-[Note that this translation is very wrong at this point -- we -include it here to encourage people to update it. -RD] -

-

Usando o cliente Tor em MS Windows

-
- -

Passo 1: Download e Instalação do Tor

-

-Note que estas instruções são para a instalação do cliente Tor em MS Windows -(98, 98SE, NT4, 2000, XP, Server). Se você pretende rodar um servidor (todos os servidores -são bem-vindos), leia a seção "Configurando um servidor" em -tor-doc-server.html. -

-

-Este documento foi atualizado em 14/06/2005. -

-

-Você pode encontrar versões experimentais -aqui, se você estiver procurando -por novas facilidades e novos bugs. -

-

-Se você deseja rodar o Tor no SYSTRAY, ou como um serviço, consulte o -nosso FAQ. -Se você não se importa em rodar o programa em uma janela (de forma que você possa ver -os seus logs e mensagens de erro), então o Instalador do Tor deve lhe servir -de maneira bem simples. Abaixo vemos uma imagem do programa de instalação (provavelmente -a sua versão será mais nova do que a mostrada na imagem): -

-

-(NT: O Programa de instalação, por enquanto, está disponível apenas em inglês.) -

-tor installer splash page -

-Pof default, Tor não é configurado para ser executado na inicialização. - -Você pode ativar esta opção clicando no controle "Run at Startup" como -mostrado abaixo. -Certifique-se de manter os outros controles ligados. -

-select components to install -

-Assim que a instalação é terminada, o programa Tor será executado numa janela, -de forma que você possa ver seus logs e mensagens de erro.
-Atenção: Você pode minimizar esta janela, mas não fechá-la, ou o programa não -estará mais disponível. -

-tor window screenshot -

-O programa Tor vem pré-configurado como cliente, por default. Ele usa -um arquivo de configuração interno pré-definido, e na maioria das vezes não -será necessário alterar nenhum dos seus ajustes.
-Neste momento, o programa Tor já estará instalado e pronto para uso. -

- -

Passo 2: Instalar o Privoxy para Navegação Web

-

-Depois de instalar o programa Tor, você precisa configurar suas aplicações para -usá-lo. O primeiro passo é configurar a navegação web. Comece instalando o programa -Privoxy -(clique em 'recent releases' para baixar a versão mais atual, então role a janela para -selecionar os pacotes de instalação para MS Windows). -Privoxy é um proxy com filtros de navegação que permite boa integração com o -programa Tor. Assim que o Privoxy estiver instalado, ele aparecerá no seu SYSTRAY -como um "P" num círculo, como na figura abaixo: -

-privoxy icon in the system tray -

-Você deve configurar o Privoxy para usar o Tor. -Abra o arquivo de configuração principal do Privoxy selecionando-o em "Iniciar > Todos os Programas": -

-editing privoxy config -

-Adicione a linha
-forward-socks4a / 127.0.0.1:9050 .
-ao arquivo de configuração do Privoxy. Não esqueça de colocar o "." no final da linha. -A maneira mais fácil de fazer isso é copiar a linha acima e colar dentro do arquivo. -Não esqueça de salvar as alterações. -

-privoxy points to tor - -

Passo 3: Configurando suas aplicações para usar Tor

-

-Agora, mude a configuraçao de proxy HTTP do seu navegador para o endereço 'localhost', -porta 8118 (Essa é a porta onde o Privoxy trabalha). -No Firefox, o caminho é "Ferramentas > Opções > Geral > Conexão > Proxy". -No Mozilla, o caminho é "Editar > Preferências > Rede > Servidores Proxy". -No Internet Explorer, o caminho é "Ferramentas > Opções da Internet > Conexão > Servidores Proxy". -

-NT: Estes caminhos são para as versões em português dos navegadores, e podem variar -conforme a versão em uso. -

-Você também deve ajustar o seu proxy SSL (chamado pelo IE de "Seguro") para os mesmos -valores, para esconder seu tráfego SSL também. No Internet Explorer, essa configuração -fica parecida com isto: -

-LAN settings in IE -Proxy settings in IE -

-O uso do Privoxy é necessário pois - -os navegadores deixam vazar as suas requisições DNS quando eles -usam um proxy SOCKS diretamente, -o que é ruim para seu anonimato. -Privoxy também remove certos cabeçalhos problemáticos das suas requisições, e -bloqueia sites irritantes de anúncios tais como "DoubleClick". -

-

-Para testar o funcionamento, você deve conhecer o seu endereço IP normal, -de maneira que você possa comprovar que o endereço realmente mude quando Tor -está em uso. -Clique em "Iniciar > Executar" e em seguida digite cmd para abrir -uma janela de prompt de comando. Ao chegar ao prompt de comando, execute o -comando ipconfig. -Se você estiver trabalhando atrás de um Firewall com NAT (NT: Isso acontece -se você usa um modem ADSL em modo router, ou usa conexão de rádio sem IP registrado.), -você pode usar um dos sites listados abaixo para verificar qual o IP da sua conexão -internet.
-Quando souber o seu IP, inicie o Tor e o Privoxy e visite qualquer um desses sites -novamente. Se tudo estiver funcionando corretamente, o endereço IP mostrado terá mudado. -

-

-showmyip.com e -ipid.shat.net -são sites que mostram o seu endereço IP atual, de forma que você pode saber -qual o seu endereço e país de origem. -

-

-Se você usa um firewall pessoal que limita a capacidade de seu computador de -abrir conexões consigo mesmo, certifique-se de permitir conexões das suas aplicações locais -para as portas locais 8118 e 9050. Se o seu firewall barra conexões de saída, abra -uma passagem nele de forma que se possa conectar pelo menos as portas TCP 80, 443 e 9001-9033. -
-Para mais sugestões de resolução de problemas, visite o -FAQ. -

-

-Para "Torificar" outra aplicação que suporte HTTP, simplesmente ajuste ela para -usar o Privoxy como proxy HTTP (em localhost, porta 8118). -Para usar diretamente o proxy SOCKS (por exemplo, para programas de mensagens -instantâneas, Jabber, IRC, etc), ajuste sua aplicação para usar diretamente -o Tor (localhost, porta 9050). -

-

-Para aplicações que não suportem nem SOCKS nem HTTP, -tente -SocksCap, -FreeCap, -ou então o cliente SOCKS -Hummingbird. -
-(FreeCap é software livre; os outros são proprietários) -

-

-Para mais informações detalhadas sobre como "Torificar" outras aplicações,visite o -Torify HOWTO. -Se você tem mais sugestões sobre como melhorar este documento, por favor -envie-as para a gente. -

-

-Obrigado! -

-
-
-
-
-

- Webmaster - - Última modificação: Tue Feb 26 19:27:12 2008 - - - Compilado em: Sun Mar 2 17:35:59 2008 -

-

- Aviso: Esta tradução pode estar desactualizada. O original, em inglês encontra-se na versão - 13195 enquanto esta tradução é baseada na versão - unknown. -

-

- Esta página também está traduzida em: - Deutsch, English, español, français, Italiano, polski, Русский (Russkij).
- How to set the default document language. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-win32.html.ru tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.ru --- tor-0.2.0.34/doc/website/tor-doc-win32.html.ru 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-win32.html.ru 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ - - - - Перенаправление - - - - - - - - -
-

- Webmaster - - ПоÑледние изменениÑ: Tue Feb 26 19:27:13 2008 - - - ПоÑледнÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑциÑ: Sun Mar 2 17:36:03 2008 -

-

"Tor" и "Onion Logo" - торговые марки принадлежащие Tor Project, Inc. -

-

- Эта Ñтраница также переведена на Ñледующие Ñзыки: - Deutsch, English, español, français, Italiano, polski, Português.
- Как уÑтановить Ñзык документов по умолчанию. -

-

Разработчики Tor не проверÑли Ñтот перевод на точноÑÑ‚ÑŒ и корректноÑÑ‚ÑŒ. - Перевод может быть уÑтаревшим или проÑто неправильным. Официальный веб-Ñайт - Tor на английÑком Ñзыке доÑтупен по адреÑу - https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-windows.html.en tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.en --- tor-0.2.0.34/doc/website/tor-doc-windows.html.en 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.en 1970-01-01 00:00:00.000000000 +0000 @@ -1,194 +0,0 @@ - - - - Tor: MS Windows Install Instructions - - - - - - -
- - - - - - - -
-
-

Running the Tor client on MS Windows

-
-

-Note that these are the installation instructions for running a Tor -client on MS Windows (98, 98SE, NT4, 2000, XP, Vista, Server). -If you want to relay traffic for others to help the network grow (please -do), read the Configuring a relay -guide. -

-
- -

Step One: Download and Install Tor

-
-

-The install for MS Windows bundles Tor, -Vidalia (a GUI for Tor), and Privoxy (a filtering web proxy) into -one package, with the three applications pre-configured to work together. -Download either the stable or the experimental -version of the Windows bundle from the download page. -

-

If the bundles don't work for you, you can download Tor by itself -from the download page, -and then install -and configure Privoxy on your own. -

-tor installer splash page -

If you have previously installed Tor, Vidalia, or Privoxy -you can deselect whichever components you do not need to install -in the dialog shown below. -

-select components to install -

After you have completed the installer, the components -you selected will automatically be started for you. -

- -
- -

Step Two: Configure your applications to use Tor

-
-

After installing Tor and Privoxy, you need to configure your -applications to use them. The first step is to set up web browsing.

-

If you're using Firefox (we recommend it), the Vidalia bundle installs -the Torbutton -plugin for you. Restart your Firefox, and you're all set: -

-Torbutton plugin for Firefox -
-

-(Learn more about -Torbutton here. -If you plan to run Firefox on a different computer than Tor, see the FAQ -entry for running Tor on a different computer. If you need to -use a browser other than Firefox, you'll have to configure its proxy settings yourself.) -

-

Using Privoxy is necessary because browsers -leak your DNS requests when they use a SOCKS proxy directly, which -is bad for your anonymity. Privoxy also removes certain dangerous -headers from your web requests, and blocks obnoxious ad sites like -Doubleclick.

-

To Torify other applications that support HTTP proxies, just -point them at Privoxy (that is, localhost port 8118). To use SOCKS -directly (for instant messaging, Jabber, IRC, etc), you can point -your application directly at Tor (localhost port 9050), but see this -FAQ entry for why this may be dangerous. For applications -that support neither SOCKS nor HTTP, take a look at SocksCap or -FreeCap. -(FreeCap is free software; SocksCap is proprietary.)

-

For information on how to Torify other applications, check out the -Torify -HOWTO. -

-
- -

Step Three: Make sure it's working

-
-

-Check to see that Privoxy and Vidalia are running. Privoxy's icon is -a blue or green circle with a "P" in it, and Vidalia uses a small -green onion to indicate Tor is running or a dark onion with a red "X" -when Tor is not running. You can start or stop Tor by right-clicking -on Vidalia's icon in your system tray and selecting "Start" or "Stop" -from the menu as shown below: -

-Vidalia Tray Icon -

-Next, you should try using your browser with Tor and make -sure that your IP address is being anonymized. Click on -the -Tor detector -and see whether it thinks you're using Tor or not. -(If that site is down, see this -FAQ entry for more suggestions on how to test your Tor.) -

-

If you have a personal firewall that limits your computer's -ability to connect to itself, be sure to allow connections from -your local applications to local port 8118 and port 9050. If -your firewall blocks outgoing connections, punch a hole so -it can connect to at least TCP ports 80 and 443, and then see this -FAQ entry. -

-

If it's still not working, look at this -FAQ entry for hints.

-
- - -

Step Four: Configure it as a relay

-
-

The Tor network relies on volunteers to donate bandwidth. The more -people who run relays, the faster the Tor network will be. If you have -at least 20 kilobytes/s each way, please help out Tor by configuring your -Tor to be a relay too. We have many features that make Tor relays easy -and convenient, including rate limiting for bandwidth, exit policies so -you can limit your exposure to abuse complaints, and support for dynamic -IP addresses.

-

Having relays in many different places on the Internet is what -makes Tor users secure. You -may also get stronger anonymity yourself, -since remote sites can't know whether connections originated at your -computer or were relayed from others.

-

Read more at our Configuring a relay -guide.

-
-

If you have suggestions for improving this document, please send them to us. Thanks!

-
-
-
-
-

- Webmaster - - Last modified: Sun Mar 2 17:31:17 2008 - - - Last compiled: Sun Mar 2 17:35:38 2008 -

-

"Tor" and the "Onion Logo" are trademarks of The Tor Project, Inc. -

-

- This page is also available in the following languages: - español, français, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- How to set the default document language. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-windows.html.es tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.es --- tor-0.2.0.34/doc/website/tor-doc-windows.html.es 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.es 1970-01-01 00:00:00.000000000 +0000 @@ -1,180 +0,0 @@ - - - - Ejecutando el cliente Tor en MS Windows - - - - - - -
- - - - - - - -
-
-

Ejecutando el cliente Tor en MS Windows

-
-

N. del T.(TOR->The Onion Router, el enrutador "cebolla")

-

Nótese que estas son las instrucciones de instalación para ejecutar un cliente -en MS Windows (98, 98SE, NT4, 2000, XP, Vista, Server). -Si quieres gestionar tráfico para otros y ayudar a crecer la red Tor, - (házlo por favor), lee la guía -Configurar un repetidor - -

-
- -

Paso Uno: Descarga e Instala Tor

-
-

La instalacion del "paquete" para MS Windows incluye Tor, -Vidalia -(una GUI para Tor), y -Privoxy (un proxy con filtro web) en un solo paquete, -con las tres aplicaciones preconfiguradas para trabajar juntas. -Descarga la versión estable o la experimental del paquete Windows -de la página de descarga. -

-

Si el paquete no funciona para tus requisitos, puedes descargar Tor desde -la página de descargas, y luego -instalar y configurar Privoxy por ti mismo. -

-tor installer splash page -

Si ya has instalado Tor, Vidalia, o Privoxy previamente, puedes deseleccionar cualquier componente -que no necesites en el cuadro de diálogo mostrado abajo. -

-select components to install -

Tras completar la instalación, los componentes seleccionados se iniciarán automáticamente.

- -
- -

Paso Dos: Configurar tus aplicaciones para que usen Tor

-
-

Tras instalar Tor y Privoxy, debes configurar tus aplicaciones para usarlos. -El primer paso es configurar tu explorador.

-

Si usas Firefox (te lo recomendamos), el paquete Vidalia te instala -el plugin Torbutton -. Reinicia Firefox, y eso es todo: -

-Torbutton plugin for Firefox -
-

-(Aprenda más sobre -Torbutton aquí. -Si planea usar Firefox en un ordenador distinto del de Tor, vea la -entrada en la FAQ para ejecutar Tor en un ordenador distinto. Si necesita usar -un navegador distinto de Firefox, tendrá que configurar sus opciones de proxies usted mismo..) -

-

Usar Privoxy es necesario porque - -los exploradores fallan al hacer peticiones DNS cuando usan un proxy SOCKS directamente, -lo cual es malo para el anonimato. Privoxy también elimina ciertas cabeceras -peligrosas de tus peticiones web, y bloquea incómodos sitios como Doubleclick.

-

Para usar con TOR otras aplicaciones que soportan proxies HTTP, simplemente -dirigirlas a Privoxy (localhost, puerto 8118). Para usar SOCKS directamente (para -mensajería instantanea, Jabber, IRC, etc.) puedes dirigir tu aplicación directamente -a Tor (localhost, puerto 9050), pero visita esta FAQ -donde se explica por qué esto puede ser peligroso. Para aplicaciones que no soportan ni SOCKS ni HTTP, -visitar SocksCap o -FreeCap. -(FreeCap es free software; SocksCap es propietario)

-

Para más información sobre como "TOR"ificar otras aplicaciones -visitar Torify -HOWTO. -

-
- -

Paso Tres: Asegurarse de que funciona

-
-

Comprueba que Privoxy y Vidalia se están ejecutando. -El icono de Privoxy es un circulo azul o verde con una "P" dentro, y Vidalia usa una -pequeña cebolla verde para indicar que Tor se está ejecutando, o una cebolla -oscura con una "X" roja cuando no lo está. Puedes arrancar o detener Tor pinchando -con el botón derecho en el icono de Vidalia en la barra del sistema y seleccionando -"Start" o "Stop" del menú como se muestra abajo:

-Vidalia Tray Icon -

Después, deberías intentar usar tu explorador con Tor y asegurarte que tu dirección -IP esta siendo anonimizada. -Visite el detector de Tor -y compruebe si cree que usas Tor o no. -(Si este sitio no responde, visite -esta FAQ para más sugerencias sobre como testear su Tor.) -

-

Si usas un cortafuegos personal que limita la capacidad de conexión de tu computadora, -asegúrate que permite conexiones de aplicaciones locales al puerto local 8118 y al puerto 9050.

-

Si tu cortafuegos bloquea conexiones salientes, configúralo para que puedan hacerse conexiones -al menos por los puertos TCP 80 y 443 y visita -este apartado de la FAQ. -

-

Si aún no funciona, visita -este apartado de la FAQ -para seguir consejos.

-
- - -

Paso Cuatro: Configurarlo como repetidor

-
-

La red Tor se basa en voluntarios que donan su ancho de banda. -Cuantos más repetidores, más rapida será la red Tor. Si tienes al menos 20 Kbytes/s en ambos sentidos, -por favor ayuda a Tor configurándolo para que sea repetidor también. Tenemos varias características para que -hacer a Tor repetidor sea fácil y conveniente, incluyendo limitación del ancho de banda cedido, políticas de -conexiones de salida que pueden limitar tu exposición a casos de abuso, y soporte para IP dinámicas. -

Tener repetidores en varios y diferentes sitios en la Internet es lo que convierte a los usuarios de Tor en seguros. -Puedes reforzar tu propio anonimato, -haciendo que sitios remotos no puedan saber si las conexiones se originaron en -tu computadora o fueron iniciadas desde otras.

-

Lee más en nuestra guía Configurando un repetidor

-
-

Si tienes sugerencias para mejorar este documento, por favor envíanoslas. -¡Gracias!

-
-
-
-
-

- Webmaster - - Última modificación: Tue Feb 26 19:27:13 2008 - - - Última compilación: Sun Mar 2 17:35:42 2008 -

-

"Tor" y el "Logo de la Cebolla" son -marcas registradas de El Proyecto Tor, S.A. -

-

- Aviso: Esta traducción podría estar obsoleta. La revisión original en inglés es la - 13768 mientras que esta revisión está basada en la - 13192. -

-

- Esta página también está disponible en los siguientes idiomas: - English, français, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Cómo establecer el idioma por defecto del documento. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-windows.html.fr tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.fr --- tor-0.2.0.34/doc/website/tor-doc-windows.html.fr 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.fr 1970-01-01 00:00:00.000000000 +0000 @@ -1,165 +0,0 @@ - - - - Installation : MS Windows - - - - - - -
- - - - - - - -
-
-

Installer et utiliser le client Tor sous MS Windows

-
-

-Notez que ce sont les instructions d'installation pour utiliser le client Tor sous MS Windows -(98, 98SE, NT4, 2000, XP, Vista, Server). -Si vous voulez installer un relais Tor pour aider à faire grandir le réseau (n'hésitez pas !), lisez la page -Configurer un serveur -. -

-
- -

Etape Un : Télécharger et installer Tor

-
-

-L'installateur pour MS Windows contient Tor, -Vidalia (Une interface graphique pour Tor), et Privoxy (un proxy web filtrant) en un seul paquet, avec ces trois applications pré-configurées pour fonctionner ensemble. -Téléchargez soit la version stable, soit la version expérimentale depuis la page de téléchargement. -

-

Si le paquet précédent ne fonctionne pas, vous pouvez télécharger Tor seul, depuis la -page de téléchargement, puis installer -et configurer Privoxy vous-même. -

-tor installer splash page -

Si vous aviez précédemment installé Tor, Vidalia ou Privoxy, vous pouvez les désélectionner dans la phase de dialogue homme-machine présentée ci-dessous.

-select components to install -

Une fois que vous aurez terminé de répondre aux questions de l'installateur, les composants logiciels que vous avez sélectionnés seront automatiquement installés et et démarrés. -

-
- -

Etape Deux : Configurer vos applications pour utiliser Tor

-
-

Après avoir installé Tor et Privoxy, vous devez configurer vos applications pour les utiliser. La prochaine action consiste à configurer le navigateur web. -

-

Si vous utilisez Firefox (ce que nous vous recommandons), le paquet « tout en un » Vidalia installe le plugiciel Torbutton pour vous. Redemarrez votre Firefox et c'est tout : -

-Torbutton plugin for Firefox -
-

-(Quelques détails en plus à propos de -Torbutton ici. -Si vous envisagez de faire tourner Firefox sur un ordinateur différent de celui de Tor, voyez l'entrée de la FAQ -sur comment faire tourner Tor sur un ordinateur différent. Si vous avez besoin d'utiliser un -navigateur autre que Firefox, vous aurez à configurer ses options de proxy vous même.) -

-

L'utilisation de Privoxy est nécessaire car le navigateur laisse passer des informations lorsqu'il fait des requêtes DNS en utilisant le proxy SOCKS directement, -, ce qui est mauvais pour votre anonymat. De plus Privoxy enlève certains en-têtes dangereux de vos requêtes web, et bloque certains sites pénibles comme Doubleclick.

-

Pour torréfier d'autres application qui savent utiliser des proxys HTTP, il suffit de leur indiquer de passer par Privoxy (c'est à dire "localhost" sur le port "8118"). Pour celles qui utilisent SOCKS directement (messagerie instantannée, Jabber, IRC, etc.), vous pouvez les faire passer directement par Tor ("localhost", prot "9050"), mais regardez d'abord -cette entrée de la FAQ - qui vous dira les risques que cela comporte. Pour les applications qui n'utilisent ni SOCKS ni HTTP, jetez un oeil à SocksCap ou à -FreeCap. -(FreeCap est un logiciel libre; SocksCap est propriétaire.)

-

Pour davantage d'informations sur "comment torréfier d'autres applications", regardez le -Torréfaction -HOWTO. -

-
- -

Etape Trois: S'assurer que ça fonctionne

-
-

-Vérifiez que Privoxy et Vidalia fonctionnent. L'icone de Privoxy est un cercle bleu ou vert avec un "P" dedans, et Vidalia s'affiche comme un petit oignon vert lorsque Tor est en fonction, et un petit oignon noir avec une croix rouge lorsque ce n'est pas le cas. Vous pouvez lancer ou arrêter Tor en "cliquant-droit" sur l'icone de Vidalia dans votre barre des tâches et en sélectionnant "Start" ou "Stop" du menu présenté ci-dessous: -

-Icone Vidalia -

-À présent, vous devriez essayer votre navigateur web avec Tor activé pour vous assurer que votre adresse IP est anonymisée. Cliquez sur le -Tor -detector et voyez si vous utilisez bien Tor ou non. -(Si le site n'est pas disponible, regardez cette rubrique de la FAQ - pour trouver d'autres moyens de tester le fonctionnement de votre client Tor.) -

-

Si vous avez un pare-feu personnel qui empêche votre ordinateur de se connecter à lui-même, assurez-vous d'autoriser les connexions depuis vos applications locales vers les ports local "8118" et "9050". Si votre pare-feu bloque les connexions sortantes, ouvrez-le un peu, au moins pour les ports "TCP 80" et "TCP 443", et ensuite regardez - cette entrée de la FAQ. -

-

Si ça ne marche toujours pas, allez-voir cette entrée de la FAQ - pour trouver des indices.

-
- - -

Etape Quatre : Configurez Tor en mode relais

-
-

Le réseau Tor repose sur les personnes volontaires pour donner de la bande passante. Plus il y aura de personnes qui hébergent des relais Tor, plus le réseau Tor sera rapide. -Si vous avez au moins 20ko/s symétriques, aidez le réseau Tor en configurant votre Tor en mode relais également. Nous avons implanté de nombreuses options pour faire que ce ne soit pas une grosse contrainte, par exemple la possibilité de fixer la bande-passante utilisée, celle de définir les règles de sorties du réseau Tor de manière à limiter les risques d'être ennuyé-e par des plaintes, ainsi que la gestion des connexions à adresses IP dynamiques. -

-

C'est le fait d'avoir des relais partout sur internet qui sécurise son utilisation. -C'est aussi avantageux pour son propre anonymat d'héberger un noeud Tor -, -car les sites distants auxquels vous vous connectez personnellement ne pourront pas savoir si c'est vous qui vous connectez ou si vous ne faites que relayer les connexions d'autres.

-

Pour plus d'infos, lire le guide : Configurer un relais -

-
-

Si vous avez des suggestions à faire pour améliorer ce document, envoyez-nous un message !. Merci !

-
-
-
-
-

- Webmaster - - Dernière modification : Tue Feb 26 19:27:13 2008 - - - Dernière compilation : Sun Mar 2 17:35:53 2008 -

-

"Tor" et le Logo Onion sont des marques déposées du Projet Tor, Inc. -

-

- Attention: Cette traduction peut être obsolète. La version anglaise originale est la - 13768 alors que la version traduite est basée sur la - 13192. -

-

- Cette page est aussi disponible dans les langues suivantes : - English, español, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Comment configurer la langue par défaut du document. -

-

Les développeurs de Tor n'ont pas revu cette traduction en ce qui concerne la - pertinence et l'exactitude. Elle peut être obsolète ou fausse. La version - officielle du site web Tor est la version anglaise, disponible sur https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-windows.html.it tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.it --- tor-0.2.0.34/doc/website/tor-doc-windows.html.it 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.it 1970-01-01 00:00:00.000000000 +0000 @@ -1,198 +0,0 @@ - - - - Tor: istruzioni per installare Tor su MS Windows - - - - - - -
- - - - - - - -
-
-

Usare il client Tor su MS Windows

-
-

-Queste sono le istruzioni per installare e usare un client Tor -su MS Windows (98, 98SE, NT4, 2000, XP, Vista, Server). -Se invece vuoi offrire banda e traffico per aiutare a fare crescere la rete Tor (sì, -per favore!), leggi la guida per Configurare un relay. - -

-
- -

Uno: scarica e installa Tor

-
-

-L'installer per MS Windows comprende Tor, -Vidalia (una interfaccia grafica per Tor), e Privoxy (un filtro web proxy) in -un unico pacchetto che contiene le tre applicazioni già preconfigurate per funzionare insieme. -Scarica la versione stabile o quella -sperimentale dalla pagina dei download. -

-

Se non riesci a far funzionare i pacchetti, puoi scaricare Tor da solo -dalla pagina di download, -e poi installare -e configurare Privoxy a parte. -

-tor installer splash page -

Se avevi già installato in precedenza Tor, Vidalia, o Privoxy -puoi deselezionare i componenti di cui non hai bisogno -nella finestra di dialogo qui sotto. -

-select components to install -

Dopo aver terminato l'installazione, i componenti -che hai scelto verranno avviati automaticamente. -

- -
- -

Due: configura i tuoi programmi per usare Tor

-
-

Dopo l'installazione di Tor e di Privoxy, devi configurare i tuoi programmi affinché -li usino. Il primo passo è configurare il browser web.

-

Se usi Firefox (consigliato), il pacchetto Vidalia installa -il plugin Torbutton - e basta poi riavviare Firefox: -

-Torbutton plugin for Firefox -
-

-(Maggiori informazioni su -Torbutton. -Se vuoi usare Firefox su un computer diverso da dove gira To, leggi la FAQ -per usare Tor su un pc differente. Se devi usare un -browser diverso da Firefox, dovrai configurare il proxy.) -

-

È necessario usare Privoxy perché il browser -rivela le tue richieste DNS quando usa direttamente un SOCKS proxy, cosa che -riduce l'anonimato. Privoxy inoltre rimuove alcuni header -pericolosi dalle tue richieste web e blocca certi fastidiosi siti pubblicitari come -Doubleclick.

-

Per usare Tor con altre applicazioni che supportano un HTTP proxy, basta -puntarle a Privoxy (ossia, a localhost porta 8118). Per usare SOCKS -direttamente (con l'instant messaging, Jabber, IRC, etc), si può puntare -il programma direttamente a Tor (localhost porta 9050), ma leggi questa -FAQ che spiega perché è pericoloso. Per quei programmi -che non supportano né SOCKS né HTTP, vedi SocksCap o -FreeCap. -(FreeCap è software libero; SocksCap è proprietario.)

-

Per informazioni su come Torificare altri programmi, guarda il -Torify -HOWTO. -

-
- -

Tre: controlla che tutto funzioni

-
-

-Controlla che Privoxy e Vidalia siano attivi. L'icona di Privoxy è -un cerchio blu o verde con una "P" dentro, mentre per Vidalia è una piccola -cipolla verde per indicare che Tor è attivo, o una cipolla scura con una "X" rossa -quando Tor è spento. Puoi avviare o fermare Tor facendo clic col tasto destro del mouse -sulla icona di Vidalia nella barra di sistema e selezionando "Start" o "Stop" -dal menu come mostrato qui sotto: -

-Icona Vidalia nella barra -

-Ora devi provare Tor col tuo browser per controllare -che il tuo indirizzo IP sia anonimizzato. Fai clic sul - -Tor detector -e guarda se rileva se stai usando Tor o no. -(se questo sito è giù, vedi questa -FAQ per altri modi di testare il tuo Tor.) -

-

Se hai un personal firewall che limita le connessioni del tuo pc -a se stesso, controlla che siano permesse le connessioni dalle -applicazioni locali alla porta locale 8118 e alla porta 9050. Se -il tuo firewall blocca le connessioni in uscita, permettigli di -collegarsi almeno alle porte TCP 80 e 443, poi leggi questa -FAQ. -

-

Se nemmeno ora funziona, guarda questa -FAQ per ulteriori indicazioni.

-
- -

Quattro: configura Tor come relay

-
-

La rete Tor funziona grazie alla banda donata dai volontari. Più -persone aprono un relay, più veloce sarà la rete Tor. Se hai almeno -20 kilobyte/s in download e upload, aiutaci e configura la tua installazione -Tor come relayr. Ci sono tante funzionalità che rendono un Tor relay facile -e pratico, come il controllo della banda, exit policy per -limitare il rischio di abusi e lamentele, ed il supporto per indirizzi -IP dinamici.

-

La distribuzione di relay in tanti luoghi diversi della rete -rende più sicuri gli utenti di Tor. Puoi -ottenere un migliore anonimato tu stesso, -dato che non sarà possibile sapere se una connessione è partita dal tuo -computer o è stata trasportata da un altro nodo Tor.

-

Leggi la guida come configurare un relay -.

-
-

Se hai delle proposte per migliorare questo documento, per favore contattaci. Grazie!

-
-
-
-
-

- Webmaster - - Ultima modifica: Sun Mar 2 17:31:18 2008 - - - Ultima compilazione: Sun Mar 2 17:35:47 2008 -

-

"Tor" e l'"Onion Logo" sono marchi registrati di The Tor Project, Inc. -

-

- Questa pagina è disponibile anche nelle lingue seguenti: - English, español, français, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Come configurare la lingua predefinita per i documenti. -

-

Questa traduzione non è stata controllata dagli sviluppatori di - Tor. Può essere obsoleta o errata. Il sito - ufficiale di Tor è in inglese, all'indirizzo https://torproject.org/ -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-windows.html.pl tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.pl --- tor-0.2.0.34/doc/website/tor-doc-windows.html.pl 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,190 +0,0 @@ - - - - Tor: Instrukcje instalacji dla MS Windows - - - - - - -
- - - - - - - -
-
-

Uruchamianie klienta Tor na MS Windows

-
-

-To są instrukcje do instalacji klienta Tora na systemach - MS Windows (98, 98SE, NT4, 2000, XP, Vista, Server). Jeśli chcesz - przekazywać ruch innych, by wspomóc rozwój sieci (prosimy), przeczytaj poradnik o Konfigurowaniu przekaźnika sieci Tor. -

-
- -

Krok 1: Pobranie i instalacja Tora

-
-

Instalator dla MS Windows zawiera programy: Tor, - Vidalia (GUI dla Tora), i Privoxy (filtrujący serwer proxy do WWW) - w jednym pliku, wszystkie prekonfigurowane do współpracy ze sobą. - Pobierz stabilną lub eksperymentalną wersję dla Windows - ze strony pobierania. -

-

Jeśli paczka u ciebie nie działa, możesz ściągnąć samego Tora ze - strony pobierania, - po czym samodzielnie zainstalować - i skonfigurować Privoxy. -

-Ekran instalacji Tora -

Jeśli już wcześniej zainstalowałeś Tora, Vidalię lub Privoxy, możesz - odznaczyć elementy, których nie musisz instalować w oknie dialogowym - pokazanym niżej. -

-Wybór składników instalacji -

Po zakończeniu instalacji wybrane składniki zostaną automatycznie uruchomione. -

- -
- -

Krok 2: Konfiguracja aplikacji, by używały Tora

-
-

Po instalacji Tora i Privoxy musisz skonfigurować swoje aplikacje, by ich używały. - Pierwszym krokiem jest ustawienie sposobu przeglądania sieci WWW.

-

Jeśli używasz przeglądarki Firefox (co zalecamy), instalator programu Vidalia zainstaluje rozszerzenie - Torbutton za ciebie. Ponownie uruchom Firefoksa i gotowe: -

-Rozszerzenie Torbutton dla Firefoksa -
-

-(Dowiedz się więcej o - rozszerzeniu Torbutton. - Jeśli masz zamiar używać Firefoksa na innym komputerze niż tam, gdzie jest Tor, spójrz na wpis w FAQ - na temat uruchamiania Tora na innym komputerze. Jeśli musisz używać innej - przeglądarki niż Firefox, musisz samodzielnie skonfigurować jej ustawienia proxy.) -

-

Korzystanie z Privoxy jest konieczne, gdyż żądania DNS - z przeglądarek wyciekają, gdy przeglądarki używają bezpośrednio serwera pośredniczącego SOCKS, - co uniemożliwia zachowanie pełnej anonimowości. Privoxy usuwa również pewne - niebezpieczne nagłówki z żądań WWW i blokuje okropne serwisy z banerami, jak Doubleclick.

-

By "storyfikować" inne aplikacje, które używają proxy dla HTTP, po prostu - skieruj je na Privoxy (czyli localhost, port 8118). By aplikacje bezpośrednio używały - serwera SOCKS (do komunikatorów, Jabbera, IRC, itp.), skieruj je - bezpośrednio na Tora (localhost, port 9050), ale przeczytaj ten - wpis do FAQ, dlaczego to może być niebezpieczne. Jeśli aplikacja nie - obsługuje ani proxy dla HTTP, ani dla SOCKS, spójrz na SocksCap lub - FreeCap. - (FreeCap jest wolnym oprogramowaniem; SocksCap nie.)

-

Po informacje, jak "storyfikować" inne aplikacje, spójrz na - Torify - HOWTO. -

-
- -

Krok 3: Upewnij się, że wszystko działa

-
-

Sprawdź, czy Privoxy i Vidalia są uruchomione. Ikona Privoxy to niebieskie - lub zielone kółko z "P" w środku, Vidalia używa małej zielonej cebuli, gdy Tor - działa lub ciemnej cebuli z czerwonym "X", gdy Tor nie działa. Możesz zatrzymać - lub uruchomić Tora, klikając prawym klawiszem myszki na ikonę Vidalii w zasobniku - systemowym i wybierając "Start" lub "Stop" z menu, jak pokazano niżej: -

-Ikona Vidalii w zasobniku -

Teraz powinieneś spróbować użyć swojej przeglądarki z Torem i - upewnić się, że Twój adres IP jest anonimizowany. Kliknij na - wykrywacz - Tora i sprawdź, cze jego zdaniem używasz Tora czy nie. - (Jeśli ta strona akurat nie działa, przeczytaj ten - wpis w FAQ, by poznać więcej sposobów na testowanie swojego Tora.) -

-

Jeśli masz zaporę ogniową, która ogranicza możliwości Twojego komputera co - do łączenia się z samym sobą, zezwól w niej na połączenia od programów - lokalnych na porty lokalne 8118 i 9050. Jeśli zapora blokuje połączenia - wychodzące, spraw, by można się było połączyć choć z portami 80 i 433, - po czym przeczytaj ten - wpis do FAQ. -

-

Jeśli dalej nie działa, spójrz na ten - wpis FAQ, by poszukać wskazówek.

-
- - -

Krok 4: Konfiguracja Tora jako przekaźnika sieci

-
-

Sieć Tora polega na ochotnikach oddających część swojego łącza. Im więcej - ludzi uruchomi przekaźnik sieci, tym szybsza będzie sieć Tora. Jeśli masz co najmniej - 20 kilobajtów/s w obie strony, pomóż Torowi, konfigurując swojego klienta tak, - by był także przekaxnikiem. Mamy wiele cech, które czynią przekaźniki Tora łatwymi i - wygodnymi, łącznie z ograniczeniem przepustowości, politykami wyjścia, byś mógł - zmniejszyć ryzyko skarg, oraz obsługą dynamicznych adresów IP.

-

Posiadanie przekaźników w wielu różnych miejscach w sieci sprawia, że - użytkownicy są bezpieczni. Ty - też możesz mieć lepszą anonimowość, gdyż serwery, do których się łączysz, - nie mogą stwierdzić, czy połączenie pochodzi z Twojego komputera, czy - zostało przekierowane z innych.

-

Przeczytaj szczegóły w naszym przewodniku Konfiguracji -przekaźnika sieci Tor.

-
-

Jeśli masz pomysły na ulepszenie tej strony, prosimy je do nas wysłać. Dziękujemy!

-
-
-
-
-

- Webmaster - - Ostatnio zmodyfikowane: Sun Mar 2 17:31:17 2008 - - - Ostatnio wygenerowane: Sun Mar 2 17:35:58 2008 -

-

"Tor" i "Onion Logo" (logo cebuli) sÄ… znakami handlowymi The Tor Project, Inc. -

-

- Ta strona jest także dostÄ™pna w nastÄ™pujÄ…cych jÄ™zykach: - English, español, français, Italiano, Русский (Russkij), 中文(简) (Simplified Chinese).
- Jak ustawić domyślny język dokumentu. -

-

- Deweloperzy Tora nie sprawdzili tłumaczenia tej strony pod względem dokładności - i poprawności. Tłumaczenie może być przestarzałe lub niepoprawne. Oficjalna strona Tora jest - po angielsku, pod adresem https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-windows.html.ru tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.ru --- tor-0.2.0.34/doc/website/tor-doc-windows.html.ru 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.ru 1970-01-01 00:00:00.000000000 +0000 @@ -1,190 +0,0 @@ - - - - Tor: УÑтановка на MS Windows - - - - - - -
- - - - - - - -
-
-

ИÑпользование клиента Tor в ОС MS Windows

-
-

-Внимание: Ñто инÑтрукции по уÑтановке клиента Tor в MS Windows (98, 98SE, -NT4, 2000, XP, Vista, Server). ЕÑли вы хотите передавать Ñерверный трафик чтобы -ÑпоÑобÑтвовать увеличению Ñети Tor (пожалуйÑта делайте Ñто), прочитайте -инÑтрукции по наÑтройке Ñервера. -

-
- -

Шаг первый: Скачать и уÑтановить Tor

-
-

-ИнÑталлÑтор Ð´Ð»Ñ MS Windows - Tor, -Vidalia -(графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ Tor), и Privoxy (фильтрующий веб прокÑи) в -комплекте, вÑе три Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроены работать вмеÑте "из коробки". -Скачайте Ñтабильную или -ÑкÑпериментальную верÑию инÑталлÑтора Ð´Ð»Ñ Windows Ñо Ñтраницы Download. -

-

ЕÑли вы не хотите иÑпользовать комплект, вы можете Ñкачать Tor отдельно -Ñо Ñтраницы download, а затем -уÑтановить и наÑтроить -Privoxy ÑамоÑтоÑтельно. -

-tor installer splash page -

ЕÑли вы ранее уже уÑтановили Tor, Vidalia или Privoxy -вы можете выбрать только те компоненты, которые хотите обновить -в диалоге показанном ниже. -

-select components to install -

ПоÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑƒÑтановки, компоненты которые вы выбрали -будут запущены автоматичеÑки. -

- -
- -

Шаг второй: ÐаÑтроить Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Tor

-
-

ПоÑле уÑтановки, вы должны наÑтроить оÑтальные Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ -чтобы они иÑпользовали Tor и Privoxy. Ð”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° наÑтроим браузер.

-

ЕÑли вы иÑпользуете Firefox (мы рекомендуем), Vidalia bundle (полный комплект) уÑтановит -плагин Torbutton. -ПерезапуÑтите браузер, и вÑÑ‘ готово: -

-Torbutton plugin for Firefox -
-

-(Подробнее про Torbutton. -ЕÑли вы ÑобираетеÑÑŒ запуÑкать Firefox и Tor на разных компьютерах, Ñмотрите - -Ñтот раздел FAQ. ЕÑли вы иÑпользуйте другой браузер (не Firefox), -вам придётÑÑ ÑамоÑтоÑтельно указать наÑтройки прокÑи.) -

-

ИÑпользование Privoxy обÑзательно так как браузеры -пропуÑкают ваши DNS запроÑÑ‹ еÑли иÑпользовать SOCKS прокÑи напрÑмую, что -безуÑловно раÑкрывает вашу анонимноÑÑ‚ÑŒ. Privoxy также удалÑет некоторые небезопаÑные -заголовки из http-запроÑов, и блокирует надоедливые рекламные Ñайты.

-

Чтобы торифицировать(Torify) другие Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ðµ поддерживают HTTP прокÑи, -проÑто укажите им на Privoxy (то еÑÑ‚ÑŒ, localhost порт 8118). Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SOCKS -напрÑмую (Ñлучай IM (ÑиÑтемы мгновенного обмена ÑообщениÑми), Jabber, IRC, итд), -укажите Ð°Ð´Ñ€ÐµÑ Ð¸ порт клиента Tor (localhost порт 9050), но ознакомьтеÑÑŒ -Ñ Ñтим -разделом FAQ опиÑывающим небезопаÑноÑÑ‚ÑŒ такого ÑпоÑоба. Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ -которые не поддерживают ни SOCKS ни HTTP, попробуйте SocksCap или -FreeCap. -(FreeCap Ñто Ñвободное ПО; SocksCap проприетарное.)

-

Информацию о том как торифицировать другие Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ поиÑкать в -Torify -HOWTO. -

-
- -

Шаг третий: УбедитеÑÑŒ что вÑÑ‘ работает

-
-

-Проверьте что Privoxy и Vidalia запущены. -Иконка Privoxy выглÑдит как зелёный или Ñиний круг Ñ Ð±ÑƒÐºÐ²Ð¾Ð¹ "P" внутри, а -Vidalia показывает зелёную луковицу в Ñлучае еÑли Tor работает, или тёмную -Ñ ÐºÑ€Ð°Ñным креÑтиком еÑли Tor не запущен. Ð’Ñ‹ можете запуÑтить или оÑтановить Tor -кликнув правой кнопкой мыши на иконку Vidalia и выбрав в контекÑтном меню -Start или Stop ÑоответÑтвенно: -

-Vidalia Tray Icon -

-Далее, попробуйте иÑпользовать браузер через Tor и убедитеÑÑŒ что -ваш IP Ð°Ð´Ñ€ÐµÑ Ð½Ðµ выдаётÑÑ. ПоÑетите -Tor детектор -и проверьте что он Ñкажет - иÑпользуете вы Tor или нет. -(ЕÑли Ñайт не работает, поÑмотрите -Ñтот -раздел FAQ и узнайте больше ÑпоÑобов протеÑтировать Tor.) -

-

ЕÑли уÑтановлен перÑональный файерволл который ограничивает ÑпоÑобноÑÑ‚ÑŒ вашего -компьютера коннектитÑÑ Ðº Ñамому Ñебе, разрешите ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ локальных приложений -на локальные порты 8118 и 9050. ЕÑли ваш файерволл -блокирует иÑходÑщие ÑоединениÑ, откройте по крайней мере TCP порты -80 и 443, а потом ознакомьтеÑÑŒ Ñ - -Ñтим разделом FAQ. -

-

ЕÑли Ñто вÑÑ‘-таки не Ñработает, поищите подÑказки в FAQ.

-
- - -

Шаг четвёртый: ÐаÑтройте Ñервер

-
-

Сеть Tor оÑновываетÑÑ Ð½Ð° добровольцах делÑщихÑÑ Ñвоим трафиком. Чем больше людей -запуÑкают Ñерверы, тем быÑтрее работает Ñеть Tor. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ по крайней мере -20 килобайт/Ñек в каждом направлении, пожалуйÑта помогите Ñети Tor наÑтроив Ñвой -Ñервер. Мы реализовали много чего чтобы Ñделать Ñерверы Tor лёгкими и удобными -в иÑпользовании, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ðµ трафика, Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð°(exit policies), -и поддержку динамичеÑких IP.

-

БезопаÑноть пользователей Tor в первую очередь обеÑпечиваетÑÑ -именно размещением Ñамих Ñерверов Tor в разных уголках Интернета. -Ð’Ñ‹ также получаете -более Ñильную анонимноÑÑ‚ÑŒ Ñами, -так как третьи Ñтороны не могут знать кто инициировал ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ - ваш локальный компьютер -или другие узлы Ñети Tor.

-

Смотрите подробное опиÑание как наÑтроить Ñервер.

-
-

ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ Ð¿Ð¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð¿Ð¾ улучшению Ñтого документа, пожалуйÑта приÑылайте их нам. СпаÑибо!

-
-
-
-
-

- Webmaster - - ПоÑледние изменениÑ: Sun Mar 2 17:31:17 2008 - - - ПоÑледнÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑциÑ: Sun Mar 2 17:36:04 2008 -

-

"Tor" и "Onion Logo" - торговые марки принадлежащие Tor Project, Inc. -

-

- Эта Ñтраница также переведена на Ñледующие Ñзыки: - English, español, français, Italiano, polski, 中文(简) (Simplified Chinese).
- Как уÑтановить Ñзык документов по умолчанию. -

-

Разработчики Tor не проверÑли Ñтот перевод на точноÑÑ‚ÑŒ и корректноÑÑ‚ÑŒ. - Перевод может быть уÑтаревшим или проÑто неправильным. Официальный веб-Ñайт - Tor на английÑком Ñзыке доÑтупен по адреÑу - https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-doc-windows.html.zh-cn tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.zh-cn --- tor-0.2.0.34/doc/website/tor-doc-windows.html.zh-cn 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-doc-windows.html.zh-cn 1970-01-01 00:00:00.000000000 +0000 @@ -1,173 +0,0 @@ - - - - MS Windows 安装指导 - - - - - - -
- - - - - - - -
-
-

在 MS Windows 上è¿è¡Œ Tor 客户端

-
-

-请注æ„此处æ供的是在 MS Windows(98ã€98SEã€NT4ã€2000ã€XPã€Vistaã€Server)上è¿è¡Œ Tor -客户端的安装指导。如果你想è¦è´¡çŒ®æµé‡å¸®åŠ©ç½‘络增长(请这么åšï¼‰ï¼Œè¯·é˜…读é…置中继指导。 -

-
- -

第一步:下载并安装 Tor

-
-

MS Windows 的安装程åºå°† Torã€Vidalia(Tor 的一个图形用户界é¢ï¼‰å’Œ -Privoxyï¼ˆä¸€ç§ Web 代ç†ï¼‰æ†ç»‘在了一起, -并预先é…置好能够一åŒå·¥ä½œã€‚从下载页é¢ä¸‹è½½ç¨³å®šç‰ˆæˆ–测试版的 -Windows æ†ç»‘软件包。 -

-

如果æ†ç»‘包ä¸èƒ½æ­£å¸¸å·¥ä½œï¼Œä½ å¯ä»¥ä»Žä¸‹è½½é¡µé¢å•ç‹¬ä¸‹è½½ Tor, -然åŽè‡ªå·±å®‰è£…并é…ç½® Privoxy。 -

-tor installer splash page -

如果以å‰å®‰è£…过 Tor,Vidalia 或 Privoxy,你å¯ä»¥åœ¨å¦‚下所示的对è¯æ¡†ä¸­å–消你ä¸éœ€è¦å®‰è£…的软件。 -

-select components to install -

安装结æŸåŽï¼Œä½ é€‰æ‹©å®‰è£…的软件会自动è¿è¡Œã€‚ -

- -
- -

第二步:é…置应用程åºä½¿ç”¨ Tor

-
-

当 Tor å’Œ Privoxy 安装结æŸåŽï¼Œä½ éœ€è¦é…置你的应用程åºæ¥ä½¿ç”¨å®ƒä»¬ã€‚ -第一步是é…ç½® Web æµè§ˆã€‚ -

-

如果你使用 Firefox(这是我们所推è的),æ†ç»‘软件包已为你安装了 -Torbutton æ’件。 -åªéœ€é‡æ–°å¯åŠ¨ Firefox,就这么简å•ï¼š -

-Torbutton plugin for Firefox -
-

(更多关于 Torbutton。 -如果你打算在没有安装 Tor 的计算机上使用 Firefox,请阅读在 -å¦ä¸€å°è®¡ç®—机上è¿è¡Œ Tor çš„ FAQ æ¡ç›®ã€‚如果你需è¦ä½¿ç”¨é™¤ Firefox 以外的其他æµè§ˆå™¨ï¼Œ -你需è¦è‡ªå·±é…置代ç†è®¾ç½®ã€‚) -

-

使用 Privoxy 是必è¦çš„,因为当直接使用 -SOCKS 代ç†æ—¶ï¼Œæµè§ˆå™¨ä¼šæ³„露你的 DNS 请求,这于你的匿åä¸åˆ©ã€‚ -åŒæ—¶ï¼ŒPrivoxy 会删除 Web 请求中å±é™©çš„报头并且阻挡 Doubleclick 之类的令人厌æ¶çš„广告站点。 -

-

è¦è®©å…¶ä»–æ”¯æŒ HTTP 代ç†çš„应用程åºä½¿ç”¨ Torï¼Œå°†å®ƒä»¬æŒ‡å‘ Provixy å³å¯ï¼ˆä¹Ÿå°±æ˜¯ localhost ç«¯å£ 8118)。 -直接使用 SOCKS(å³æ—¶é€šè®¯ã€Jabberã€IRC 等),å¯å°†ä½ çš„应用程åºç›´æŽ¥æŒ‡å‘ Tor(localhost ç«¯å£ 9050), -但是请阅读此 -FAQ æ¡ç›®â€”—你得明白这么åšå¯èƒ½æ˜¯å±é™©çš„。对于既ä¸æ”¯æŒ SOCKS 也ä¸æ”¯æŒ HTTP 的应用程åºï¼Œè€ƒè™‘一下 -SocksCap 或者 -FreeCap。(FreeCap 是自由软件;SocksCap ä¸æ˜¯ã€‚) -

-

如何 Tor 化(Torify)其他应用程åºçš„ä¿¡æ¯è¯·æŸ¥çœ‹ Torify HOWTO。 -

-
- -

第三步:确定它在工作

-
-

检查 Privoxy å’Œ Vidalia 正在è¿è¡Œã€‚Privoxy 的图标是一个è“色或绿色的圈, -中间有一个字æ¯â€œPâ€ï¼ŒVidalia 用一个绿色洋葱的图标指示 Tor 正在è¿è¡Œï¼ŒTor ä¸è¿è¡Œæ—¶æ˜¯ -一个带有红色“Xâ€çš„ç°è‰²æ´‹è‘±å›¾æ ‡ã€‚ä½ å¯ä»¥é€šè¿‡å³é”®å•å‡»ç³»ç»Ÿæ‰˜ç›˜ä¸­ Vidalia 的图标, -从èœå•é€‰æ‹©â€œå¼€å§‹â€æˆ–者“åœæ­¢â€æ¥å¯åŠ¨æˆ–终止 Tor,如下所示: -

-Vidalia Tray Icon -

然åŽï¼Œä½ åº”该通过æµè§ˆå™¨æ¥éªŒè¯ä½ çš„ IP 地å€å·²ç»åŒ¿å化了。 -点击 Tor 探测器看看 -它是å¦è®¤ä¸ºä½ åœ¨ä½¿ç”¨ Tor。(如果这个站点下线了,此 FAQ -æ¡ç›®æœ‰å¦‚何测试 Tor 的更多建议。) -

-

如果你的个人防ç«å¢™é™åˆ¶ä½ çš„计算机连接到它自己,一定è¦å…许从本地应用程åºåˆ°æœ¬åœ°ç«¯å£ -8118 å’Œ 9050 的连接。如果你的防ç«å¢™é˜»æŒ¡å‘外的连接,那么至少让它能够连接 TCP ç«¯å£ 80 å’Œ 443, -然åŽé˜…读此 FAQ æ¡ç›®ã€‚ -

-

如果它还是罢工,那就看看此 FAQ -æ¡ç›®å¯»æ‰¾ä¸€äº›çº¿ç´¢ã€‚ -

-
- -

第四步:é…置中继

-
-

Tor 网络ä¾é å¿—愿者们贡献带宽è¿è¡Œã€‚è¿è¡Œä¸­ç»§çš„人越多,Tor 网络的速度就越快。 -如果你的网络连接速度达到至少æ¯ç§’ 20KB,请è¿è¡Œä¸€å°ä¸­ç»§ä»¥å¸®åŠ© Tor。 -我们有许多特性使得 Tor 中继的è¿è¡Œç®€å•è€Œæ–¹ä¾¿ï¼ŒåŒ…括带宽的速率é™åˆ¶ï¼Œ -定制出å£ç­–略以é¿å…滥用,以åŠå¯¹äºŽåŠ¨æ€ IP 地å€çš„支æŒã€‚ -

-

在互è”网上的许多ä¸åŒåœ°æ–¹è¿è¡Œä¸­ç»§ä¿æŠ¤äº† Tor 用户的安全。你自身的 -匿å也能得到更好的ä¿æŠ¤ï¼Œå› ä¸ºç«™ç‚¹ä¸çŸ¥é“连接究竟æ¥è‡ªä½ çš„电脑还是为他人传递。 -

-

阅读更详细的é…置中继指导。 -

-
-

å¦‚æžœä½ æœ‰æ”¹è¿›æœ¬æ–‡æ¡£çš„å»ºè®®ï¼Œè¯·å‘Šè¯‰æˆ‘ä»¬ã€‚è°¢è°¢ï¼ -

-
-
-
-
-

- Webmaster - - 最åŽä¿®æ”¹: Tue Feb 26 19:27:12 2008 - - - 最åŽç¼–译: Sun Mar 2 17:36:06 2008 -

-

"Tor" 和 "Onion Logo" 是 The Tor Project, Inc. 的商标。 -

-

- 警告: 本翻译的内容å¯èƒ½æ˜¯è¿‡æ—¶çš„。英文原文ä½äºŽç¬¬ 13768 次修订, - 但本翻译基于第 13192 次修订。 -

-

- 本页é¢è¿˜æœ‰å¦‚下语言的版本: - English, español, français, Italiano, polski, Русский (Russkij)。
- 如何设置默认语言。 -

-

- Tor çš„å¼€å‘者和 EFF å‡æœªå¯¹æœ¬ç¿»è¯‘的精确性和正确性作检查。 - 它å¯èƒ½æ˜¯è¿‡æ—¶çš„或者错误的。 - Tor 的官方网站的语言是英文,ä½äºŽ https://www.torproject.org/。 -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-hidden-service.html.en tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.en --- tor-0.2.0.34/doc/website/tor-hidden-service.html.en 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.en 1970-01-01 00:00:00.000000000 +0000 @@ -1,263 +0,0 @@ - - - - Tor: Hidden Service Configuration Instructions - - - - - - -
- - - - - - - -
-
-

Configuring Hidden Services for Tor

-
-

Tor allows clients and relays to offer hidden services. That is, -you can offer a web server, SSH server, etc., without revealing your -IP address to its users. In fact, because you don't use any public address, -you can run a hidden service from behind your firewall. -

-

If you have Tor and Privoxy installed, you can see hidden services -in action by visiting an -example hidden service. -

-

This howto describes the steps for setting up your own hidden service -website. -

-
- -

Step Zero: Get Tor and Privoxy working

-
-

Before you start, you need to make sure:

-
    -
  1. Tor is up and running,
  2. -
  3. Privoxy is up and running,
  4. -
  5. Privoxy is configured to point to Tor and
  6. -
  7. You actually set it up correctly.
  8. -
-

Windows users should follow the Windows -howto, OS X users should follow the OS -X howto, and Linux/BSD/Unix users should follow the Unix howto. -

-

Once you've got Tor and Privoxy installed and configured, -you can see hidden services in action by following this link to an example hidden service. -It will typically take 10-60 seconds to load -(or to decide that it is currently unreachable). If it fails -immediately and your browser pops up an alert saying that -"www.duskgytldkxiuqc6.onion could not be found, please check the name and -try again" then you haven't configured Tor and Privoxy correctly; see the -it-doesn't-work FAQ entry for some help. -

-
- -

Step One: Install a web server locally

-
-

First, you need to set up a web server locally. Setting up a web -server can be tricky, -so we're just going to go over a few basics here. If you get stuck -or want to do more, find a friend who can help you. We recommend you -install a new separate web server for your hidden service, since even -if you already have one installed, you may be using it (or want to use -it later) for an actual website. -

-

If you're on Unix or OS X and you're comfortable with -the command-line, by far the best way to go is to install thttpd. Just grab the -latest tarball, untar it (it will create its own directory), and run -./configure && make. Then mkdir hidserv; cd -hidserv, and run -../thttpd -p 5222 -h localhost. It will give you back your prompt, -and now you're running a webserver on port 5222. You can put files to -serve in the hidserv directory. -

-

If you're on Windows, you might pick Savant or Apache, and be sure to configure it -to bind only to localhost. You should also figure out what port you're -listening on, because you'll use it below. -

-

(The reason we bind the web server only to localhost is to make -sure it isn't publically accessible. If people could get to it directly, -they could confirm that your computer is the one offering the hidden -service.) -

-

Once you've got your web server set up, make sure it works: open your -browser and go to http://localhost:5222/, where 5222 is -the port that you picked above. Then try putting a file in the main html -directory, and make sure it shows up when you access the site. -

-
- -

Step Two: Configure your hidden service

-
-

Next, you need to configure your hidden service to point to your -local web server. -

-

First, open your torrc file in your favorite text editor. (See the -torrc FAQ entry to learn what this means.) Go to the middle section and -look for the line

-
-############### This section is just for location-hidden services ###
-
-

-This section of the file consists of groups of lines, each representing -one hidden service. Right now they are all commented out (the lines -start with #), so hidden services are disabled. Each group of lines -consists of one HiddenServiceDir line, and one or more -HiddenServicePort lines:

-
    -
  • HiddenServiceDir is a directory where Tor will store information -about that hidden service. In particular, Tor will create a file here named -hostname which will tell you the onion URL. You don't need to add any -files to this directory.
  • -
  • HiddenServicePort lets you specify a virtual port (that is, what -port people accessing the hidden service will think they're using) and an -IP address and port for redirecting connections to this virtual port.
  • -
-

Add the following lines to your torrc: -

-
-HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:5222
-
-

You're going to want to change the HiddenServiceDir line, so it points -to an actual directory that is readable/writeable by the user that will -be running Tor. The above line should work if you're using the OS X Tor -package. On Unix, try "/home/username/hidserv/" and fill in your own -username in place of "username". On Windows you might pick:

-
-HiddenServiceDir C:\Documents and Settings\username\Application Data\hidden_service\
-HiddenServicePort 80 127.0.0.1:5222
-
-

Now save the torrc, shut down -your Tor, and then start it again. -

-

If Tor starts up again, great. Otherwise, something is wrong. First look at -your logfiles for hints. It will print some warnings or error messages. That -should give you an idea what went wrong. Typically there are typos in the torrc -or wrong directory permissions (See the -logging FAQ entry if you don't know how to enable or find your -log file.) -

-

When Tor starts, it will automatically create the HiddenServiceDir -that you specified (if necessary), and it will create two files there.

-
-
private_key
-
First, Tor will generate a new public/private keypair for your hidden -service. It is written into a file called "private_key". Don't share this key -with others -- if you do they will be able to impersonate your hidden -service.
-
hostname
-
The other file Tor will create is called "hostname". This contains -a short summary of your public key -- it will look something like -duskgytldkxiuqc6.onion. This is the public name for your service, -and you can tell it to people, publish it on websites, put it on business -cards, etc.
-
-

If Tor runs as a different user than you, for example on -OS X, Debian, or Red Hat, then you may need to become root to be able -to view these files.

-

Now that you've restarted Tor, it is busy picking introduction points -in the Tor network, and generating a hidden service -descriptor. This is a signed list of introduction points along with -the service's full public key. It anonymously publishes this descriptor -to the directory servers, and other people anonymously fetch it from the -directory servers when they're trying to access your service. -

-

Try it now: paste the contents of the hostname file into your web -browser. If it works, you'll get the html page you set up in step one. -If it doesn't work, look in your logs for some hints, and keep playing -with it until it works. -

-
- -

Step Three: More advanced tips

-
-

If you plan to keep your service available for a long time, you might -want to make a backup copy of the private_key file somewhere. -

-

We avoided recommending Apache above, a) because many people might -already be running it for a public web server on their computer, and b) -because it's big -and has lots of places where it might reveal your IP address or other -identifying information, for example in 404 pages. For people who need -more functionality, though, Apache may be the right answer. Can -somebody make us a checklist of ways to lock down your Apache when you're -using it as a hidden service? Savant probably has these problems too. -

-

If you want to forward multiple virtual ports for a single hidden -service, just add more HiddenServicePort lines. -If you want to run multiple hidden services from the same Tor -client, just add another HiddenServiceDir line. All the following -HiddenServicePort lines refer to this HiddenServiceDir line, until -you add another HiddenServiceDir line: -

-
-HiddenServiceDir /usr/local/etc/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:8080
-
-HiddenServiceDir /usr/local/etc/tor/other_hidden_service/
-HiddenServicePort 6667 127.0.0.1:6667
-HiddenServicePort 22 127.0.0.1:22
-
-

There are some anonymity issues you should keep in mind too: -

-
    -
  • As mentioned above, be careful of letting your web server reveal -identifying information about you, your computer, or your location. -For example, readers can probably determine whether it's thttpd or -Apache, and learn something about your operating system.
  • -
  • If your computer isn't online all the time, your hidden service -won't be either. This leaks information to an observant adversary.
  • - -
-
-

If you have suggestions for improving this document, please send them to us. Thanks!

-
-
-
-
-

- Webmaster - - Last modified: Sun Mar 2 17:31:17 2008 - - - Last compiled: Sun Mar 2 17:35:38 2008 -

-

"Tor" and the "Onion Logo" are trademarks of The Tor Project, Inc. -

-

- This page is also available in the following languages: - español, français, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- How to set the default document language. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-hidden-service.html.es tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.es --- tor-0.2.0.34/doc/website/tor-hidden-service.html.es 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.es 1970-01-01 00:00:00.000000000 +0000 @@ -1,267 +0,0 @@ - - - - Instrucciones de Configuración de Servicios Ocultos - - - - - - -
- - - - - - - -
-
-

Configurar Servicios Ocultos para Tor

-
-

Tor permite a los clientes y a los repetidores que ofrezcan servicios ocultos. -Eso significa que puede ofrecer un servidor web, servidor SSH, etc., sin revelar -su dirección IP a sus usuarios. De hecho, como no se usa ninguna dirección pública, -puedes ejecutar un servicio oculto desde detrás de un cortafuegos. -

-

Si tiene Tor y Privoxy instalado, puede ver los servicios ocultos -en acción visitando un ejemplo de -servicio oculto. -

-

Este howto describe los pasos para configurar tu propio sitio web en -un servicio oculto. -

-
- -

Paso Cero: Hacer que Tor y Privoxy funcionen

-
-

Antes de empezar, necesitará asegurarse de que:

-
    -
  1. Tor está activo y ejecutándose,
  2. -
  3. Privoxy está activo y ejecutándose,
  4. -
  5. Privoxy está configurado para apuntar a Tor, y
  6. -
  7. Lo ha configurado correctamente.
  8. -
-

Los usuarios de Windows deberían seguir el howto para Windows -, Los usuarios de OS X deberían seguir el howto para OS -X, y los usuarios de Linux/BSD/Unix deberían seguir el howto para Unix. -

-

Una vez que tenga Tor y Privoxy instalados y configurados, -puede ver los servicios ocultos en acción siguiendo este enlace a un ejemplo de servicio oculto. -Tardará típicamente 10-60 segundos en cargarse -(o en decidir que no se puede acceder por el momento). Si falla -inmediatamente y tu navegador muestra una alerta diciendo que -"www.duskgytldkxiuqc6.onion no se encontró, compruebe por favor el nombre e -inténtelo de nuevo" no ha configurado Tor y Privoxy correctamente; vea la -entrada Tor-o-Privoxy-no-funcionan de la FAQ para ayuda. -

-
- -

Paso Uno: Instalar un servidor web localmente

-
-

Primero, necesitará configurar un servidor web localmente. Configurar un -servidor web puede ser complicado, -así que sólo explicaremos algunas cosas básicas. Si se atranca o -quiere hacer más, busque un amigo que pueda ayudarle. Recomendamos que -instale un nuevo servidor web separado para su servicio oculto, ya que -incluso si ya tiene uno instalado, puede estar usándolo (o querer usarlo -más tarde) para un sitio web real. -

-

Si está en Unix u OS X y está cómodo en la línea de órdenes, -la mejor forma con diferencia es instalar thttpd. Coja el último -fichero tar, descomprímalo (creará su propio directorio), y ejecute -./configure && make. Luego mkdir hidserv; cd -hidserv, y ejecute -../thttpd -p 5222 -h localhost. Volverá a la línea de órdenes, -y ya está usted ejecutando un servidor web en el puerto 5222. Puede poner -ficheros para servir en el directorio hidserv. -

-

Si está en Windows, podría elegir Savant o Apache, y asegúrese de configurarlo -para que escuche sólo a localhost. También debería averiguar en que -puerto está escuchando, porque lo usará más abajo. -

-

(La razón de que el servidor web sólo escuche a localhost es para -asegurarse de que no es accesible públicamente. Si la gente -pudiera conectarse a él directamente, podrían confirmar que su -ordenador es el que está ofreciendo el servicio oculto.) -

-

Una vez que tenga su servidor web configurado, asegúrese de que funciona: -abra su navegador y vaya a http://localhost:5222/, donde 5222 es -el puerto que eligió antes. Intente poner un fichero en el directorio html -principal, y asegúrese de que aparece cuando accede al sitio. -

-
- -

Paso Dos: Configure su servicio oculto

-
-

Para lo siguiente, necesita configurar su servicio oculto para que apunte -a su servidor web local. -

-

Primero, abra su fichero torrc en su editor de texto favorito. (Vea la -entrada de la FAQ torrc para aprender lo que esto significa.) -Vaya a la sección del medio y busque la línea

-
-############### This section is just for location-hidden services ###
-
-

-Esta sección del fichero consiste en grupos de líneas, cada una representando -un servicio oculto. Ahora mismo están todas comentadas (las líneas comienzan con -consiste en una línea HiddenServiceDir, y una o más líneas -HiddenServicePort:

-
    -
  • HiddenServiceDir es un directorio donde Tor almacenará información -acerca de ese servicio oculto. En particular, Tor creará un fichero aquí de -nombre hostname que le dirá la URL onion. No necesita añadir ningún -fichero a este directorio.
  • -
  • HiddenServicePort le permite especificar un puerto virtual (eso es, qué -puerto creerán que están usando la gente que acceda al servicio oculto) y una -dirección IP y puerto para redireccionar conexiones a este puerto virtual.
  • -
-

Añada las siguientes líneas a su torrc: -

-
-HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:5222
-
-

Querrá cambiar la línea HiddenServiceDir, para que apunte -a un directorio real que sea legible/escribible por el usuario que -ejecutará Tor. La línea anterior debería funcionar si está usando el -paquete Tor para OS X. En Unix, pruebe "/home/username/hidserv/" y complete su propio -nombre de usuario en lugar de "username". En Windows puede escoger:

-
-HiddenServiceDir C:\Documents and Settings\username\Application Data\hidden_service\
-HiddenServicePort 80 127.0.0.1:5222
-
-

Ahora grabe el torrc, apague su Tor, e inícielo de nuevo. -

-

Si tor reinicia, estupendo. En caso contrario, algo está mal. Primero -mire los logs de tor para consejos. Mostrará algunos mensajes con advertencias -o errores. Eso debería darle alguna idea de qué está mal. Lo típico es que haya -palabras mal escritas o permisos erróneos en los directorios. (Vea la -entrada FAQ sobre log si no está seguro de cómo activar o encontrar -su fichero de log.) -

-

Cuando Tor arranque, automáticamente creará el HiddenServiceDir -que especificó (en caso necesario), y creará dos ficheros allí.

-
-
private_key
-
-Primero, Tor generará una pareja de llaves pública/privada para su servicio -oculto. Se escribe en un fichero llamado "private_key". No comparta esta -clave con otros -- si lo hace podrán impersonar su servicio oculto. -
-
hostname
-
El otro fichero que Tor creará se llama "hostname". Contiene un pequeño -resumen de su llave pública -- parecerá algo como -duskgytldkxiuqc6.onion. Este es el nombre público de su servicio, -y puede decírselo a la gente, publicarlo en sitios web, ponerlo en tarjetas -de visita, etc.
-
-

Si Tor se ejecuta como un usuario diferente de usted, por -ejemplo en OS X, Debian, o Red Hat, puede que necesite hacerse root para -poder ver esos ficheros.

-

Ahora que ha reiniciado Tor, está ocupado eligiendo puntos de introducción en -la red Tor, y generando lo que se llama un descriptor de servicio oculto. -Esto es una lista firmada de puntos de introducción junto con la llave pública -completa del servicio. Publica anónimamente este descriptor a los servidores -de directorio, y otra gente lo obtiene anónimamente de los servidores de -directorio cuando intentan acceder a su servicio. -

-

Pruebe ahora: pegue el contenido del fichero hostname en tu navegador -web. Si funciona, obtendrá la página html que configuró en el paso uno. -Si no funciona, mire en sus logs buscando sugerencias, y siga jugando con -él hasta que funcione. -

-
- -

Paso Tres: Consejos más avanzados

-
-

Si planea mantener su servicio disponible durante largo tiempo, puede que -quiera hacer una copia de seguridad del fichero private_key en alguna parte. -

-

Hemos evitado recomendar Apache antes, a) porque mucha gente podría -estar ya ejecutándolo para su servidor web público en su ordenador, y b) -porque es grande y tiene muchos sitios donde podría revelar su dirección -IP u otra información identificadora, por ejemplo en páginas 404. Para -la gente que necesite más funcionalidad, sin embargo, Apache puede ser la -respuesta correcta. ¿Puede alguien hacernos una lista de formas de bloquear -el Apache cuando se usa como servicio oculto? Savant probablemente también -tenga esos problemas también. -

-

Si quiere redireccionar múltiples puertos virtuales para un mismo servicio -oculto, simplemente añada más líneas HiddenServicePort. -Si quiere ejecutar múltiples servicios ocultos desde el mismo cliente Tor, -simplemente añada otra línea HiddenServiceDir. Todas las líneas -HiddenServicePort subsiguientes se refieren a esta línea HiddenServiceDir, hasta -que añada otra línea HiddenServiceDir: -

-
-HiddenServiceDir /usr/local/etc/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:8080
-
-HiddenServiceDir /usr/local/etc/tor/other_hidden_service/
-HiddenServicePort 6667 127.0.0.1:6667
-HiddenServicePort 22 127.0.0.1:22
-
-

Hay algunas consideraciones de anonimato que debería tener en cuenta también: -

-
    -
  • Como se mencionó antes, tenga cuidado de dejar que su servidor web -revele información identificatiba sobre usted, su ordenador, o su posición. -Por ejemplo, los lectores pueden probablemente determinar si es thttpd o -Apache, y aprender algo acerca de su sistema operativo.
  • -
  • Si su ordenador no está online todo el tiempo, su servicio oculto -tampoco lo estará. Esto filtra información a un adversario observador.
  • - -
-
-

Si tiene sugerancias para mejorar este documento, por favor envíenoslas. ¡Gracias!

-
-
-
-
-

- Webmaster - - Última modificación: Tue Feb 26 19:27:13 2008 - - - Última compilación: Sun Mar 2 17:35:43 2008 -

-

"Tor" y el "Logo de la Cebolla" son -marcas registradas de El Proyecto Tor, S.A. -

-

- Aviso: Esta traducción podría estar obsoleta. La revisión original en inglés es la - 13768 mientras que esta revisión está basada en la - 13194. -

-

- Esta página también está disponible en los siguientes idiomas: - English, français, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Cómo establecer el idioma por defecto del documento. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-hidden-service.html.fr tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.fr --- tor-0.2.0.34/doc/website/tor-hidden-service.html.fr 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.fr 1970-01-01 00:00:00.000000000 +0000 @@ -1,269 +0,0 @@ - - - - Instructions pour la configuration des Services Cachés - - - - - - -
- - - - - - - -
-
-

Configurer des Services Cachés pour Tor

-
-

Tor permet aux clients et aux relais d'offrir des services cachés. Ainsi, -vous pouvez rendre disponible un serveur web, un serveur SSH, etc., sans avoir à révéler votre -adresse IP aux utilisateurs. Et même, du fait que vous n'utilisez pas d'adresse publique, -vous pouvez faire tourner un service caché derrière votre pare-feu. -

-

Si vous avez Tor et Privoxy d'installé, vous pouvez accèder aux services cachés -en direct en visitant un exemple -de service caché. -

-

Ce « howto » décrit les étapes pour paramétrer votre propre service web -caché -

-
- -

Étape zéro : s'assurer que Tor et Privoxy fonctionnent

-
-

Avant de commencer, il est nécessaire de s'assurer que :

-
    -
  1. Tor est lancé et fonctionne ;
  2. -
  3. privoxy est lancé et fonctionne ;
  4. -
  5. privoxy est configuré pour pointer sur Tor ;
  6. -
  7. que l'ensemble est bien paramétré.
  8. -
-

Les utilisateurs Windows devraient suivre le -howto Windows, les utilisateurs d'OS X devraient regarder le howto OS -X, et les utilisateurs Linux/BSD/Unix devraient suivre le howto Unix. -

-

Une fois que vous avez Tor et Privoxy installé et configuré, -vous pouvez voir les services cachés en action en suivant ce lien sur un exemple de service caché. -Ça prend généralement de 10 à 60 secondes pour charger -(ou décider de l'inaccessibilité). Si ça ne fonctionne pas -immédiatement et que votre navigateur envoie une alerte disant que -"www.duskgytldkxiuqc6.onion could not be found, please check the name and -try again" alors vous n'avez pas configuré Tor correctement ; voyez l'entrée « ça ne marche pas » -de la FAQ pour plus d'aide. -

-
- -

Première étape : installer un serveur Web localement

-
-

Premièrement, vous avez besoin de configurer un serveur web local. Paramétrer un serveur web -peut s'avérer délicat, -nous n'allons donc que survoler les bases ici. Si vous n'y arrivez pas -ou cherchez à en faire plus, demandez à un ami de vous aider. Nous vous recommandons -d'installer un serveur web séparé pour votre service caché, puisque même si -vous en avez déjà un d'installé, vous l'utilisez peut-être déjà (ou planifiez de l'utiliser -plus tard) pour un usage différent. -

-

Si vous êtes sous Unix ou OS X et que vous vous sentez à l'aise avec -la ligne de commande, le plus simple, et de loin, est d'installer thttpd. Rappatriez juste la -dernière archive, décompactez là (ça créer son propre répertoire), et lancez -./configure && make. Puis mkdir hidserv ; cd hidserv, et run -../thttpd -p 5222 -h localhost Vous devriez retrouver le prompt, -et à ce stade vous faites tourner un serveur web sur le port 5222. Vous pouvez mettre des fichiers dans -le répertoire hidserv. -

-

Si vous êtes sous Windows, vous devriez prendre Savant ou Apache, et vous assurer que vous l'avez -attaché seulement sur localhost. Vous devriez aussi connaître le port sur lequel -vous écoutez, parceque vous allez l'utiliser plus tard. -

-

(La raison pour laquelle nous connectons le serveur web seulement sur localhost est de -s'assurer qu'il ne sera pas accessible publiquement. Si des gens peuvent se connecter directement, -ils pourraient confirmer que votre ordinateur est bien celui qui offre le service -caché.) -

-

Une fois votre serveur web paramétré, assurez vous qu'il fonctionne : ouvrez votre -navigateur et allez sur http://localhost:5222/, où 5222 est -le port que vous avez choisi plus haut. Puis, essayez de mettre un fichier dans le repertoire html -principal, et assurez vous que vous pouvez y accéder. -

-
- -

Deuxième étape : configurer votre service caché

-
-

Ensuite, vous devez configurer votre service caché pour pointer sur votre -serveur web local. -

-

Premièrement, ouvrez votre fichier torrc dans votre éditeur de texte favoris. (Voyez la FAQ torrc - pour plus d'information.) Allez au milieu du fichier et -cherchez la ligne

-
-############### This section is just for location-hidden services ###
-
-

-Cette section du fichier consiste en un groupe de lignes, chacune représentant -un service caché. Actuellement elles sont toutes en commentaire (les lignes -commençant par #), ainsi les services cachés sont désactivés. Chaque groupe de lignes -consiste en une ligne HiddenServiceDir, et une ou plus HiddenServicePort : -

-
    -
  • HiddenServiceDir est un répertoire où Tor va stocker les informations -à propos du service caché. En particulier, Tor va créer un fichier dedans, nommé -hostname qui va vous donner le nom onion de l'URL. Vous n'avez pas à ajouter d'autre fichier -dans ce répertoire.
  • -
  • HiddenServicePort vous permet de spécifier un port virtuel (c'est celui -que les gens penseront utiliser en accédant à votre service) et une -adresse IP et un port pour les redirection vers ce port virtuel.
  • -
-

Ajoutez les lignes suivantes dans votre torrc : -

-
-HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:5222
-
-

Vous allez avoir à changer la ligne HiddenServiceDir, pour qu'elle pointe -vers le repertoire qui est accessible en lecture/écriture par l'utilisateur qui fait -tourner Tor. L'exemple du dessus devrait fonctionner si vous utilisez le paquet -Tor OS X. Sous Unix, essayez "/home/username/hidserv/" et remplacez par votre propre -nom de login à la place de "username". Sous Windows vous devriez mettre :

-
-HiddenServiceDir C:\Documents and Settings\username\Application Data\hidden_service\
-HiddenServicePort 80 127.0.0.1:5222
-
-

Maintenant sauvegardez votre torrc, coupez -votre Tor, et ensuite redémarrez le. -

-

Si Tor redémarre, génial. Sinon, quelque chose se passe mal. Premièrement regardez les logs -pour avoir des pistes. Il devrait y'avoir des « warnings » ou des erreurs. Ça devrait vous donner une idée -du pourquoi ça se passe mal. Souvent des erreurs de frappe dans le fichier torrc ou de droits d'accès aux répertoires. -(Voyez la FAQ sur les logs - si vous ne savez pas comment les activer ou bien où les trouver.) -

-

Quand Tor se lance, il doit automatiquement créer le HiddenServiceDir -que vous avez spécifié (si nécessaire), et il devrait y créer deux fichiers.

-
-
private_key
-
Premièrement, Tor va générer une nouvelle paire de clés -publique/privée pour votre service caché, et les écrire dans un -fichier appelé "private_key". Ne partagez pas cette clé avec d'autre ; si vous le faite -ils peuvent impersonnaliser votre service caché.
-
hostname
-
L'autre fichier qui va être créé s'appelle "hostname". Il contient -un court résumé de votre clé publique -- ça devrait ressembler à quelque chose comme -duskgytldkxiuqc6.onion. C'est le nom public pour votre service, -et vous pouvez l'annoncer à d'autre gens, le publier, le mettre sur votre carte de -visite, etc.
-
-

Si Tor tourne sous un utilisateur différent du votre, par exemple sous -OS X, Debian, or Red Hat, vous aurez à passer sous root pour être autorisé à -consulter ces fichiers.

-

Maintenant que vous avez redémarré Tor, il collecte des points d'introduction -dans le réseau Tor, et génére ce qui est appelé un descripteur de service -caché, qui est une liste de points d'introduction signée avec -la pleine clé publique. Il publie ce descripteur anonymement -aux serveurs d'annuaires, et d'autres utilisateurs peuvent anonymement le rappatrier -à partir des serveurs de repertoires lorsqu'ils souhaitent accéder à votre service. -

-

Essayez maintenant : coller le contenu du fichier hostname dans votre navigateur -web. Si ça marche, vous devriez avoir la page html que vous avez paramétré à la première étape. -Si ça ne marche pas, jetez un œil dans vos logs pour vous aider, et continuez d'essayer -jusqu'à ce que ça fonctionne. -

-
- -

Troisième étape : astuces plus avancées

-
-

Si vous envisagez de maintenir votre service pendant quelques temps, il est conseillé -de faire une copie de votre fichier private_key quelque part. -

-

Nous avons évité de recommander Apache au dessus, a) parceque beaucoup de personnes -le font déjà tourner pour un serveur public sur leur ordinateur et b) -parceque c'est gros -et est en mesure de révéler votre adresse IP ou des informations vous identifiant à un -grand nombre d'endroit, par exemple dans les pages 404. Pour les gens qui ont besoin -de d'avantage de fonctionnalités, Apache devrait-être la réponse juste. Est-ce -que quelqu'un pourrait faire une liste des points sensibles pour verrouiller Apache lorsque vous -l'utilisez comme service caché ? « Savant » doit aussi avoir ce genre de problème. -

-

Si vous souhaitez renvoyer plusieurs ports virtuels pour un seul service -caché, ajoutez simplement plus de lignes HiddenServicePort. -Si vous voulez faire tourner plusieurs service cachés à partir du même client -Tor, rajoutez simplement une autre ligne HiddenServiceDir. Toutes les lignes -suivant le HiddenServicePort se réfèrent a la ligne HiddenServiceDir jusqu'a ce que vous -ajoutiez une autre ligne HiddenServiceDir : -

-
-HiddenServiceDir /usr/local/etc/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:8080
-
-HiddenServiceDir /usr/local/etc/tor/other_hidden_service/
-HiddenServicePort 6667 127.0.0.1:6667
-HiddenServicePort 22 127.0.0.1:22
-
-

Il ya quelques problèmes d'anonymat que vous devriez également garder à l'esprit : -

-
    -
  • Comme dit au dessus, soyez vigilant sur ce votre serveur web révèle -à propos de vous, votre ordinateur, votre localisation géographique. -Par exemple, les lecteurs peuvent facilement déterminer s'il s'agit de thttpd ou -Apache, et apprendre quelque chose sur votre système d'exploitation.
  • -
  • Si votre ordinateur n'est pas en ligne en permanence, votre service caché ne le sera -pas non plus. Ceci apporte une information à un adversaire observateur.
  • - -
-
-

Si vous avez des suggestions pour améliorer ce document, n'hésitez pas à nous écrire. Merci !

-
-
-
-
-

- Webmaster - - Dernière modification : Tue Feb 26 19:27:13 2008 - - - Dernière compilation : Sun Mar 2 17:35:54 2008 -

-

"Tor" et le Logo Onion sont des marques déposées du Projet Tor, Inc. -

-

- Attention: Cette traduction peut être obsolète. La version anglaise originale est la - 13768 alors que la version traduite est basée sur la - 13194. -

-

- Cette page est aussi disponible dans les langues suivantes : - English, español, Italiano, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Comment configurer la langue par défaut du document. -

-

Les développeurs de Tor n'ont pas revu cette traduction en ce qui concerne la - pertinence et l'exactitude. Elle peut être obsolète ou fausse. La version - officielle du site web Tor est la version anglaise, disponible sur https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-hidden-service.html.it tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.it --- tor-0.2.0.34/doc/website/tor-hidden-service.html.it 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.it 1970-01-01 00:00:00.000000000 +0000 @@ -1,268 +0,0 @@ - - - - Tor: istruzioni per configurare un Hidden Service - - - - - - -
- - - - - - - -
-
-

Configurare i servizi nascosti (Hidden Service) per Tor

-
-

Tor permette a client e relay di offrire dei "servizi nascosti" (hidden service). In altre parole, -puoi realizzare un server web, un server SSH, etc., senza rivelare il tuo -indirizzo IP agli altri utenti. Di fatto, non usando un indirizzo IP pubblico, -puoi avere un hidden service anche da dietro un firewall. -

-

Se hai installato Tor e Privoxy, puoi vedere dei servizi nascoi -dal vivo visitando, un -esempio di hidden service. -

-

Questa guida spiega come realizzare il proprio sito web come hidden -service. -

-
- -

Zero: installa Tor e Privoxy

-
-

Prima di iniziare occorre che:

-
    -
  1. Tor sia attivo e funzioni correttamente,
  2. -
  3. Privoxy sia attivo e funzioni,
  4. -
  5. Privoxy sia configurato per puntare a Tor e che
  6. -
  7. l'installazione sia corretta e funzionante.
  8. -
-

Gli utenti Windows possono seguire il Windows -howto, gli utenti OS X possono seguire il OS -X howto, e infine gli utenti Linux/BSD/Unix possono seguire lo Unix howto. -

-

Una volta installati e configurati Tor e Privoxy, -puoi vedere i hidden service dal vivo seguendo questo link al hidden wiki. -Ci impiegerà di solito 10-60 secondi a caricare -(o a decidere che non è raggiungibile al momento). Se dà un errore -subito e il tuo browser mostra un messaggio che dice -"Impossibile trovare www.duskgytldkxiuqc6.onion , controlla l'indirizzo -e riprova", significa che Tor e Privoxy non sono configurati correttamente; leggi questa -FAQ per aiuto e suggerimenti. -

-
- -

Uno: installa localmente un web server

-
-

Per prima cosa devi installare un web server in locale. Può -essere una cosa delicata, -per cui qui descriveremo solo alcuni passaggi elementari.Se ti trovi in difficoltà -o se vuoi fare di più cerca un amico che ti aiuti. Ti consigliamo di -di installare un web server separato per il tuo hidden service, dato che -se ne hai già uno installato forse lo stai già usando (o vorrai -usarlo in futuro) per un altro sito web. -

-

Se usi Unix o OS X e sei a tuo agio con la linea di -comando, la cosa migliore è installare thttpd. Piglia la tarball -più recente, scompattala (creerà la sua directory), ed esegui -./configure && make. Poi mkdir hidserv; cd -hidserv, ed esegui -../thttpd -p 5222 -h localhost. Ti restituirà il prompt -e avrai un webserver sulla porta 5222. Puoi mettere dei file -nella directory hidserv. -

-

Su Windows, puoi usare Savant o Apache, e configurarlo per collegarsi -solo da localhost. Devi anche sapere su quale pota è in -ascolto, dato che servirà più sotto. -

-

(Il motivo per collegare il web server solo a localhost è per -assicurarsi che non sia accessibile pubblicamente. Se si potesse accedere direttamente, -si potrebbe avere la prova che è il tuo computer a offire l'hidden -service.) -

-

Una volta installato il web server, controlla che funzioni: apri un browser -e vai a http://localhost:5222/, dove 5222 è -la porta scelta poco più sopra. Prova poi a mettere unfile nella directory -html principale e controlla che sia visibile quando accedi al sito. -

-
- -

Due: Configura il tuo hidden service

-
-

Ora devi configurare l'hidden service perché punti al -web server locale -

-

Per prima cosa, apri il file torrc con un editor di testo. (Vedi la -torrc FAQ per maggiori informazioni.) Vai alla sezione di mezzo e -cerca la riga

-
-############### This section is just for location-hidden services ###
-
-

-Questa sezione del file contiene un gruppo di righe che rappresentano ciascuna -un hidden service. Per ora sono tutte commentate via (le linee -iniziano con #), infatti i hidden service sono disabilitati. Ogni gruppo di righe -consiste in una riga HiddenServiceDir e una o più -righe HiddenServicePort:

-
    -
  • HiddenServiceDir è una directory dove Tor metterà le informazioni -su quel hidden service. In particolare Tor vi creerà un file di nome -hostname che indica l'onion URL. Non occorre aggiungere -altri file a questa directory.
  • -
  • HiddenServicePort permette di specificare una porta virtuale (ovvero, la porta -che chi accede al servizio crederà di usare), e un -indirizzo IP e una porta per redirigere le connessioni verso questa porta virtuale.
  • -
-

Aggiungi le seguenti righe a torrc: -

-
-HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:5222
-
-

Sarà necessario modificare la riga HiddenServiceDir in modo che punti -a una directory vera che sia leggibile e scrivibile dall'utente con cui -gira Tor. L'esempio sopra dovrebbe funzionare con il pacchetto Tor -per OS X. In Unix, prova "/home/nomeutente/hidserv/" e metti il tuo nome -utente al posto di "nomeutente". Su Windows puoi provare:

-
-HiddenServiceDir C:\Documents and Settings\nomeutente\Dati applicazioni\hidden_service\
-HiddenServicePort 80 127.0.0.1:5222
-
-

Ora salva il file torrc, chiudi -Tor e riavvialo. -

-

Se Tor riparte, bene. Altrimenti c'è qualcosa che non va. Per prima cosa dai -un'occhiata ai file di log, che riportano avvisi o messaggi di errore. Ciò -dovrebbe darti indicazioni sui problemi incontrati. Spesso ci sono errori di battitura nel file torrc -o permessi di directory errati. (Vedi la logging -FAQ se non sai come abilitare o trovare -i file di log.) -

-

Quando Tor parte creerà automaticamente la HiddenServiceDir -che hai indicato (se serve), e vi creerà due file.

-
-
private_key
-
Anzitutto Tor creerà un nuovo paio di chiavi pubblica/privata per il tuo hidden -service. Esso viene scritto in un file detto "private_key". Non condividere questa chiave -co altri -- altrimenti un altro otrebbe impersonare il tuo hidden -service.
-
hostname
-
L'altro file creato da Tor è detto "hostname". Esso contiene -un breve sommario della tua chiave pubblica -- qualcosa di smile a -duskgytldkxiuqc6.onion. È il nome pubblico del tuo servizio -e puoi comunicarlo a tutti, pubblicarlo su siti web, scriverlo sul biglietto -da visita, etc. .
-
-

Se Tor gira con un diverso utente, ad esempio su -OS X, Debian, o Red Hat, forse devi diventare root per leggere -questi file.

-

Ora che hai riavviato Tor, lui cerca degli introduction point -nella rete Tor, generando un cosiddetto hidden service -descriptor. Esso è una lista firmata di introduction point e della chiave -pubblica del servizio. Tor pubblica anonimamente questa descrizione -ai directory server, così gli altri possono prelevarla anonimamente dai -directory server quando cercano di accedere al tuo servizio. -

-

Ora fai una prova: copia e incolla il contenuto del file hostname nel tuo -browser. Se funziona vedrai la pagina html che hai preparato al punto uno. -Se non funziona, guarda nei log e fai altre prove e modifiche finché non -funziona. -

-
- -

Tre: argomenti avanzati

-
-

Se pensi di rendere disponibile a lungo il tuo servizio, dovresti fare -una copia di backup del file private_key. -

-

Nell'esempio sopra abbiamo evitato di proposito Apache, a) perché molti -potrebbero già usarlo per un server web pubblico sul loro computer, e b) -perché è una grande applicazione -che ha molti posti in cui potrebbe rivelare il tuo vero indirizzo IP o altre -informazioni atte a identificarti, ad esempio nelle pagine 404. Per chi avesse bisogno -di più funzionalità, Apache potrebbe essere la soluzione giusta. Puoi -scrivere una lista di azioni per blindare Apache quando lo si usa come -hidden service? Anche Savant probabilmente ha problemi del genere. -

-

Se vuoi inoltrare più porte virtuali a un unico hidden -service, basta aggiungere altre righe HiddenServicePort. -Se vuoi gestire più hidden services dallo stesso client Tor, -aggiungi un'altra riga HiddenServiceDir. Tutte le seguenti righe -HiddenServicePort si riferiscono a questa riga HiddenServiceDir, fino -a quando non aggiungi un'altra riga HiddenServiceDir: -

-
-HiddenServiceDir /usr/local/etc/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:8080
-
-HiddenServiceDir /usr/local/etc/tor/other_hidden_service/
-HiddenServicePort 6667 127.0.0.1:6667
-HiddenServicePort 22 127.0.0.1:22
-
-

Alcuni problemi di anonimato da tenere a mente: -

-
    -
  • Come detto sopra, fai attenzione che il server web non riveli -informazioni che possano identificare te, il tuo computer, la tua posizione. -Ad esempio, un visitatore potrà probabilmente capire se si tratta di thttpd o -di Apache e che sistema operativo usi.
  • -
  • Se il tuo computer non è sempre online, non lo sarà nemmeno il tuo -hidden service. Questo rivela informazioni all'osservazione di un avversario.
  • - -
-
-

se hai suggerimenti per migliorare questo documento, per favore scrivici. Grazie!

-
-
-
-
-

- Webmaster - - Ultima modifica: Sun Mar 2 17:31:18 2008 - - - Ultima compilazione: Sun Mar 2 17:35:47 2008 -

-

"Tor" e l'"Onion Logo" sono marchi registrati di The Tor Project, Inc. -

-

- Questa pagina è disponibile anche nelle lingue seguenti: - English, español, français, polski, Русский (Russkij), 中文(简) (Simplified Chinese).
- Come configurare la lingua predefinita per i documenti. -

-

Questa traduzione non è stata controllata dagli sviluppatori di - Tor. Può essere obsoleta o errata. Il sito - ufficiale di Tor è in inglese, all'indirizzo https://torproject.org/ -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-hidden-service.html.pl tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.pl --- tor-0.2.0.34/doc/website/tor-hidden-service.html.pl 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,264 +0,0 @@ - - - - Tor: Instrukcja konfiguracji usług ukrytych - - - - - - -
- - - - - - - -
-
-

Konfiguracja usług ukrytych Tora

-
-

Tor umożliwia klientom i przekaźnikom sieci Tor oferowanie usług ukrytych. To znaczy, - że możesz mieć serwer WWW, SSH etc. bez podawania swojego IP użytkownikom. - Ponieważ nie używasz żadnego adresu publicznego, możesz prowadzić - usługę ukrytą zza zapory ogniowej. -

-

Jeśli masz zainstalowanego Tora i Privoxy, możesz zobaczyć usługi - ukryte w działaniu, odwiedzając przykładową - usługę ukrytą. -

-

Ten dokument opisuje kroki potrzebne do uruchomienia własnej ukrytej usługi WWW. -

-
- -

Krok 0: Uruchomienie Tora i Privoxy

-
-

Zanim zaczniesz sprawdź, czy:

-
    -
  1. Tor jest uruchomiony i działa,
  2. -
  3. Privoxy jest uruchomione i działa,
  4. -
  5. Privoxy jest skonfigurowane na Tora
  6. -
  7. rzeczywiście wszystko dobrze ustawiłeś.
  8. -
-

Użytkownicy Windows powinni przeczytać instrukcje dla - Windows, użytkownicy OS X powinni przeczytać instrukcje dla - OS X, a użytkownicy Linux/BSD/Unix powinni przeczytać instrukcje dla systemów Unix. -

-

Po instalacji i konfiguracji Tora i Privoxy możesz zobaczyć ukryte usługi - w działaniu, wchodząc na przykładową usługę ukrytą. - Zwykle trzeba poczekać 10-60 na załadowanie strony (lub stwierdzenie, że w - danej chwili jest niedostępna). Jeśli próba od razu kończy się błędem mówiącym, że - nie można znaleźć serwera "www.duskgytldkxiuqc6.onion", to znaczy, że nie skonfigurowałeś - Tora i Privoxy poprawnie; zajrzyj do wpisu - "to nie działa" w FAQ po pomoc. -

-
- -

Krok 1: Zainstaluj lokalnie serwer WWW

-
-

Teraz gdy już masz działające usługi ukryte w Torze, musisz uruchomić - lokalnie serwer WWW. Uruchamianie serwera WWW jest skomplikowane, - więc podamy tu tylko trochę podstawowych informacji. Jeśli utkniesz - lub będziesz chciał zrobić coś więcej, znajdź znajomego, który ci pomoże. - Zalecamy instalację nowego, oddzielnego serwera do usługi ukrytej, gdyż - nawet jeśli już masz jeden zainstalowany, możesz już go używać (lub - później będziesz chciał go używać) do normalnego serwisu WWW. -

-

Jeśli jesteś na systemie Unix lub OS X i nie przeszkadza ci używanie - linii poleceń, najlepszym sposobem jest instalacja thttpd. Po prostu - pobierz archiwum tar, rozpakuj je (utworzy się osobny katalog) i uruchom - ./configure && make. Potem wykonaj mkdir hidserv; cd hidserv, - i uruchom ../thttpd -p 5222 -h localhost. Powrócisz do wiersza poleceń, - a od tej pory masz uruchomiony serwer WWW na porcie 5222. Możesz umieścić - pliki dla serwera w katalogu hidserv. -

-

Jeśli używasz systemu Windows, możesz wybrać serwer WWW Savant lub Apache, - konfigurując go tak, by podłączał się tylko do komputera, na którym jest - zainstalowany (localhost). Powinieneś też jakoś sprawdzić na jakim porcie - nasłuchuje, gdyż ta informacja przyda się potem. -

-

(Powodem, dla którego serwer powinien działać tylko lokalnie jest upewnienie - się, że nie jest on dostępny z zewnątrz. Jeśli ktoś mógłby się do niego - połączyć bezpośrednio, mógłby potwierdzić, że to twój komputer oferuje - tą ukrytą usługę.) -

-

Po ustawieniu serwera WWW, sprawdź, czy działa: otwórz przeglądarkę i - przejdź pod adres http://localhost:5222/, gdzie 5222 jest numerem portu - wybranym wcześniej. Potem spróbuj - umieścić jakiś plik w głównym katalogu HTML serwera i sprawdź, czy pokazuje - się on, gdy łączysz się ze swoim serwerem WWW. -

-
- -

Krok 2: Konfiguracja twojej usługi ukrytej

-
-

Teraz musisz skonfigurować swoją usługę ukrytą, by wskazywała na twój lokalny - serwer WWW. -

-

Najpierw otwórz swój plik torrc swoim ulubionym edytorem. (Przeczytaj wpis - o torrc w FAQ, by dowiedzieć się, co to znaczy.) Przejdź do środkowej sekcji i - szukaj linii

-
-############### This section is just for location-hidden services ###
-
-

Ta sekcja pliku składa się z grup linii, z których każda reprezentuje - jedną usługę ukrytą. W tej chwili wszystkie są zakomentowane (linie zaczynają - się od krzyżyka #), więc usługi ukryte są wyłączone. Każda grupa linii - składa się z jednej linii HiddenServiceDir i jednej lub więcej linii - HiddenServicePort:

-
    -
  • HiddenServiceDir jest katalogiem, w którym Tor bÄ™dzie przechowywaÅ‚ - informacje o tej usÅ‚udze ukrytej. W szczególnoÅ›ci, Tor utworzy w tym katalogu - plik o nazwie hostname, z którego odczytasz "adres cebulowy" (onion URL). - Nie musisz dodawać żadnych plików do tego katalogu.
  • -
  • HiddenServicePort pozwala okreÅ›lić port wirtualny (tzn. użytkownikom - Å‚Ä…czÄ…cym siÄ™ z usÅ‚ugÄ… ukrytÄ… bÄ™dzie siÄ™ zdawaÅ‚o, że używajÄ… tego wÅ‚aÅ›nie portu) i - adres IP wraz z portem do przekierowywania poÅ‚Ä…czeÅ„ na ten wirtualny port.
  • -
-

Dodaj następujące linie do swojego pliku torrc: -

-
-HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:5222
-
-

Powinieneś zmienić linię HiddenServiceDir tak, by pokazywała na istniejący - katalog, który jest odczytywalny/zapisywalny przez użytkownika, który uruchamia - Tora. Powyższa linia powinna działać, gdy używasz paczki z Torem dla OS X. - Pod systemem Unix, sprobuj "/home/użytkownik/hidserv/", podając własną nazwę użytkownika - w miejsce "użytkownik". Pod systemem Windows mógłbyś wpisać:

-
-HiddenServiceDir C:\Documents and Settings\username\Application Data\hidden_service\
-HiddenServicePort 80 127.0.0.1:5222
-
-

Teraz zapisz zmiany w pliku torrc, zamknij Tora i uruchom go ponownie. -

-

Jeśli Tor ponownie się uruchomi, to świetnie. W innym przypadku coś musi być - źle. Najpierw przejrzyj plik z logami, by poszukać przyczyn. Będą w nim - ostrzeżenia i błędy. Powinny one wskazać, co poszło nie tak. Zazwyczaj chodzi o - literówki w pliku torrc lub złe uprawnienia do katalogów. (Przeczytaj wpis - o logach w FAQ, jeśli nie wiesz jak włączyć lub znaleźć plik z logami.) -

-

Gdy Tor się uruchomi, automatycznie utworzy podany katalog HiddenServiceDir - (jeśli trzeba), a w nim utworzy dwa pliki.

-
-
private_key
-
Po pierwsze, Tor wygeneruje nową - parę kluczy publiczny/prywatny do twojej usługi ukrytej. Zostaje ona zapisana w - pliku o nazwie "private_key". Nie dawaj tego klucza nikomu -- jeśli to zrobisz, - inni będą mogli podszyć się pod twoją usługę ukrytą. -
hostname
-
Drugim plikiem, który zostanie utworzony, jest plik o nazwie "hostname". - Zawiera on krótkie podsumowanie twojego klucza publicznego -- będzie wyglądać - podobnie do tego: duskgytldkxiuqc6.onion. To jest publiczna nazwa - twojej usługi i możesz podawać ją innym, rozgłaszać w internecie, - umieszczać na wizytówkach etc.
-
-

Jeśli Tor jest uruchomiony z prawami innego - użytkownika niż ty, np. na systemach OS X, Debian, Red Hat, możesz potrzebować - uprawnień roota, by zobaczyć te pliki. -

-

Po ponownym uruchomieniu, Tor zajmuje się pobieraniem punktów wstępu - w sieci Tora i generowaniem deskryptorem usługi ukrytej. - Jest to podpisana lista punktów wstępnych razem z pełnym publicznym kluczem - usługi. Tor anonimowo umieszcza ten deskryptor na serwerach katalogowych, a - inni ludzie anonimowo go pobierają z serwerów katalogowych, gdy próbują połączyć - się z twoją usługą. -

-

Wypróbuj to: wklej zawartość pliku "hostname" do swojej przeglądarki WWW. - Jeśli działa, zobaczysz stronę Google, ale adres w przeglądarce będzie - adresem twojej usługi. Jeśli nie działa, poszukaj wskazówek w logach i - zajmuj się tym do chwili, w której zadziała. -

-
- -

Krok 3: Wskazówki dla zaawansowanych

-
-

Jeśli planujesz udostępniać swoją usługę przez dłuższy czas, zrób kopię - zapasową pliku private_key. -

-

Wcześniej unikaliśmy polecania serwera Apache, a) gdyż wielu ludzi - może już go używać jako publicznego serwera na ich komputerach, i - b) gdyż jest duży i ma wiele miejsc, w których mógłby podać twój adres IP - lub inne informacje identyfikujące, np. na stronach 404. Jednak dla ludzi, - którzy chcą więcej funkcjonalności, Apache może być dobrym rozwiązaniem. - Czy ktoś mógłby napisać nam listę sposobów na zabezpieczenie Apache, gdy - jest używany jako usługa ukryta? Savant prawdopodobnie też ma takie problemy. -

-

Jeśli chcesz przekierować wiele portów wirtualnych w ramach pojedynczej - usługi ukrytej, po prostu dodaj więcej linii HiddenServicePort. - Jeśli chcesz uruchomić wiele usług ukrytych z tego samego klienta Tora, - po prostu dodaj kolejną linię HiddenServiceDir. Wszystkie następujące po - niej linie HiddenServicePort odnoszą się do aktualnej linii HiddenServiceDir, - dopóki nie dodasz kolejnej linii HiddenServiceDir: -

-
-HiddenServiceDir /usr/local/etc/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:8080
-
-HiddenServiceDir /usr/local/etc/tor/other_hidden_service/
-HiddenServicePort 6667 127.0.0.1:6667
-HiddenServicePort 22 127.0.0.1:22
-
-

Są też pewne sprawy dotyczące anonimowości, o których trzeba pamiętać: -

-
    -
  • Jak wspomniano wyżej, uważaj z pozwoleniem dla serwera o podawaniu - informacji identyfikujÄ…cych ciebie, twój komputer lub poÅ‚ożenie. - Na przykÅ‚ad, czytelnicy mogÄ… prawdopodobnie dowiedzieć siÄ™, czy - używasz Apache czy thttpd i dowiedzieć sie czegoÅ› o twoim systemie operacyjnym.
  • -
  • JeÅ›li twój komputer nie jest caÅ‚y czas on-line, twoja usÅ‚uga ukryta też - nie bÄ™dzie. Jest to wyciek informacji dla obserwujÄ…cego przeciwnika.
  • - -
-
-

Jeśli masz pomysły na ulepszenie tej strony, prosimy je do nas wysłać. Dziękujemy!

-
-
-
-
-

- Webmaster - - Ostatnio zmodyfikowane: Sun Mar 2 17:31:17 2008 - - - Ostatnio wygenerowane: Sun Mar 2 17:35:58 2008 -

-

"Tor" i "Onion Logo" (logo cebuli) sÄ… znakami handlowymi The Tor Project, Inc. -

-

- Ta strona jest także dostÄ™pna w nastÄ™pujÄ…cych jÄ™zykach: - English, español, français, Italiano, Русский (Russkij), 中文(简) (Simplified Chinese).
- Jak ustawić domyślny język dokumentu. -

-

- Deweloperzy Tora nie sprawdzili tłumaczenia tej strony pod względem dokładności - i poprawności. Tłumaczenie może być przestarzałe lub niepoprawne. Oficjalna strona Tora jest - po angielsku, pod adresem https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-hidden-service.html.ru tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.ru --- tor-0.2.0.34/doc/website/tor-hidden-service.html.ru 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.ru 1970-01-01 00:00:00.000000000 +0000 @@ -1,258 +0,0 @@ - - - - Tor: ÐаÑтройка Ñкрытых ÑервиÑов - - - - - - -
- - - - - - - -
-
-

ÐаÑтройка Ñкрытых ÑервиÑов Tor

-
-

Tor позволÑет клиентам и Ñерверам предоÑтавлÑÑ‚ÑŒ Ñкрытые ÑервиÑÑ‹. То еÑÑ‚ÑŒ, -вы можете предоÑтавлÑÑ‚ÑŒ веб Ñервер, SSH Ñервер, итд. не раÑÐºÑ€Ñ‹Ð²Ð°Ñ Ñвой IP Ð°Ð´Ñ€ÐµÑ -пользователÑм. И так как при Ñтом не иÑпользуетÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ публичный адреÑ, -вы можете запуÑтить Ñкрытый ÑÐµÑ€Ð²Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´ÑÑÑŒ за файерволлом. -

-

ЕÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ уÑтановлены Tor и Privoxy, вы можете поÑмотреть Ñкрытый ÑÐµÑ€Ð²Ð¸Ñ -вживую поÑетив демонÑтрационный Ñкрытый ÑервиÑ. -

-

Это руководÑтво опиÑывает шаги Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Ñвоего ÑобÑтвенного Ñкрытого -ÑервиÑа - вебÑайта. -

-
- -

Шаг нулевой: ЗапуÑтите Tor и Privoxy

-
-

Перед тем как приÑтупить к наÑтройке Ñкрытого ÑервиÑа убедитеÑÑŒ что

-
    -
  1. Tor запущен,
  2. -
  3. Privoxy запущен,
  4. -
  5. Privoxy перенаправлÑет запроÑÑ‹ в Tor,
  6. -
  7. вÑÑ‘ на Ñамом деле работает корректно.
  8. -
-

Пользователи Windows должны прочитать -инÑтрукции Ð´Ð»Ñ Windows, -пользователи OS X должны прочитать -инÑтрукции Ð´Ð»Ñ OS X, -а пользователи Linux/BSD/Unix должны прочитать -инÑтрукции Ð´Ð»Ñ Unix. -

-

Как только вы уÑтановили Tor и Privoxy, вы можете поÑмотреть Ñкрытый ÑÐµÑ€Ð²Ð¸Ñ -вживую поÑетив демонÑтрационный Ñкрытый ÑервиÑ. -Скорее вÑего загрузка займёт 10-60 Ñекунд -(или решит что реÑÑƒÑ€Ñ Ð½ÐµÐ´Ð¾Ñтупен). ЕÑли же попытка окажетÑÑ Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð¾Ð¹ моментально -и ваш браузер Ñкажет -"duskgytldkxiuqc6.onion could not be found, please check the name and -try again", то значит вы неверно наÑтроили Tor и Privoxy; ищите помощь в -"оно-не-работает"-FAQ. -

-
- -

Шаг первый: УÑтановить локальный веб Ñервер

-
-

Сначала надо уÑтановить локальный веб Ñервер. УÑтановка веб-Ñервера -требует некоторых навыков, поÑтому мы кратко опишем только оÑновные шаги. ЕÑли -вы запутаетеÑÑŒ или захотите большего, найдите друга который вам поможет. Мы -рекомендуем уÑтанавливать новый отдельный веб-Ñервер Ð´Ð»Ñ Ñкрытого ÑервиÑа, Ñ‚.к. -даже еÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ уÑтановлен веб-Ñервер, вы можете иÑпользовать его (или можете -захотеть иÑпользовать его в будущем) Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾ веб-Ñайта. -

-

ЕÑли вы на Unix или OS X и комфортно чувÑтвуете ÑÐµÐ±Ñ Ð² командной Ñтроке, -наверное лучшим выбором будет уÑтановить -thttpd. ПроÑто Ñкачайте -Ñамый Ñвежий tarball, раÑпакуйте его (будет Ñоздан новый каталог), и выполните -./configure && make. Потом mkdir hidserv; cd hidserv, -и ../thttpd -p 5222 -h localhost. ПроцеÑÑ Ð±ÑƒÐ´ÐµÑ‚ запущен в фоне, -и теперь у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ веб-Ñервер на порту 5222. Выкладывайте файлы в каталог hidserv. -

-

Ð”Ð»Ñ ÐžÐ¡ Windows можно выбрать -Savant или -Apache. ОбÑзательно наÑтройте Ñервер -принимать ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ от localhost. Ð’Ñ‹ также должны узнать на каком порту -виÑит ваш Ñервер, так как вам понадобитÑÑ Ñта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð·Ð¶Ðµ. -

-

(Причина по которой мы привÑзываем веб-Ñервер только к localhost в том, чтобы быть -уверенным что Ñервер не доÑтупен публично. ЕÑли бы пользователи могли напрÑмую ÑоединитьÑÑ -Ñ Ð²Ð°ÑˆÐ¸Ð¼ Ñервером, они Ñмогли бы определить, что ваш Ñервер предоÑтавлÑет Ñтот -Ñкрытый ÑервиÑ.) -

-

ПоÑле наÑтройки веб-Ñервера, убедитеÑÑŒ что он работает: откройте браузер -и введите -http://localhost:5222/, где 5222 Ñто -номер порта который вы выбрали выше. ПоÑле Ñтого положите файл в главный html каталог, -и убедитеÑÑŒ что он поÑвилÑÑ Ð½Ð° Ñайте. -

-
- -

Шаг второй: ÐаÑтройте Ñкрытый ÑервиÑ

-
-

Далее, надо указать вашему Ñкрытому ÑервиÑу на локальный веб-Ñервер. -

Во-первых, откройте файл torrc в вашем любимом текÑтовом редакторе. -(См. FAQ по torrc -еÑли вы не понимаете что Ñто значит.) Ð’ Ñредней Ñекции найдите Ñтроку

-
-############### This section is just for location-hidden services ###
-
-

-Эта ÑÐµÐºÑ†Ð¸Ñ ÑоÑтоит из групп Ñтрок, ÐºÐ°Ð¶Ð´Ð°Ñ Ð¸Ð· которых определÑет один Ñкрытый -ÑервиÑ. Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð¾Ð½Ð¸ вÑе закомментированы (Ñтроки начинаютÑÑ Ñ Ñимвола #), -то еÑÑ‚ÑŒ Ñкрытые ÑервиÑÑ‹ выключены. ÐšÐ°Ð¶Ð´Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° Ñтрок Ñодержит одну Ñтроку -HiddenServiceDir, и одну или более Ñтрок HiddenServicePort:

-
    -
  • HiddenServiceDir определÑет каталог где Tor будет хранить информацию -о Ñкрытом ÑервиÑе. Ð’ чаÑтноÑти, Tor ÑоздаÑÑ‚ файл -hostname в Ñтом каталоге который будет Ñодержать "onion" URL Ñтого ÑервиÑа. -Вам не Ñледует добавлÑÑ‚ÑŒ никаких файлов в Ñтот каталог.
  • -
  • HiddenServicePort определÑет виртуальный порт (Ñ‚.е. Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ -Ñкрытого ÑервиÑа будет выглÑдеть так, как будто они иÑпользуют Ñтот порт) -и IP Ð°Ð´Ñ€ÐµÑ Ð¸ порт Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñоединений Ñ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ порта.
  • -
-

Добавьте такие Ñтроки в torrc: -

-
-HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:5222
-
-

Вам Ñледует изменить Ñтроку HiddenServiceDir, так чтобы она указывала -на каталог доÑтупный по чтению и запиÑи Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾Ñ‚ имени которого -будет запущен Tor. Строка в примере подойдёт еÑли вы иÑпользуете пакет Tor Ð´Ð»Ñ OS X. -Под Unix, попробуйте "/home/username/hidserv/" и подÑтавьте ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð²Ð¼ÐµÑто -"username". Под Windows вы можете выбрать:

-
-HiddenServiceDir C:\Documents and Settings\username\Application Data\hidden_service\
-HiddenServicePort 80 127.0.0.1:5222
-
-

Теперь Ñохраните torrc и перезапуÑтите Tor. - -

-

ЕÑли поÑле Ñтого Tor запуÑтилÑÑ, отлично. Иначе, что-то не так. Сначала ищите -подÑказку в логах Tor. Должно быть какое-то Ñообщение об ошибке или -предупреждение. Обычно причина в опечатках в torrc или неверных правах доÑтупа на -файлы и каталоги (См. -раздел FAQ по логам Tor -еÑли вы не знаете как включить или где найти Ñти логи.) -

-

При Ñтарте, Tor автоматичеÑки ÑоздаÑÑ‚ каталог HiddenServiceDir -который вы указали (еÑли требуетÑÑ), и запишет туда два файла.

-
-
private_key
-
Во-первых, будет Ñгенерирована пара ключей (публичный и приватный) -Ð´Ð»Ñ Ñкрытого ÑервиÑа, и запиÑана в файл "private_key". Ðе передавайте Ñти ключи -никому больше -- еÑли вы Ñто Ñделаете третье лицо Ñможет подменить ваш ÑервиÑ.
-
hostname
-
Другой Ñозданный файл будет называтьÑÑ "hostname". -Ð’ нём ÑодержитÑÑ ÐºÑ€Ð°Ñ‚ÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾ вашему публичному ключу -- и будет -выглÑдеть как-то так : duskgytldkxiuqc6.onion. Это публичное Ð¸Ð¼Ñ -вашего ÑервиÑа, и вы можете передавать его другим людÑм, публиковать на вебÑайте, -печатать на визитке, etc.
-
-

ЕÑли Tor запущен под другим пользователем, -как например на OS X, Debian, или Red Hat, тогда вам может понадобитьÑÑ Ñтать -root'ом чтобы прочитать Ñти файлы.

-

Теперь, поÑле того как вы перезапуÑтили Tor, он занÑÑ‚ тем что выбирает -"точки знакомÑтва" ("introduction points") в Ñети Tor, и генерирует так называемый -деÑкриптор Ñкрытого ÑервиÑа. Ðа Ñамом деле Ñто проÑто ÑпиÑок точек -знакомÑтв и полный публичный ключ ÑервиÑа. Потом Tor анонимно публикует Ñтот -деÑкриптор на Ñерверах директорий, и другие пользователи анонимно запрашивают его -оттуда когда они пытаютÑÑ ÑоединитьÑÑ Ñ Ð²Ð°ÑˆÐ¸Ð¼ ÑервиÑом. -

-

Проверьте Ñто ÑейчаÑ: Ñкопируйте Ñодержимое файла hostname в адреÑную Ñтроку -браузера. ЕÑли вÑÑ‘ работает верно, то вы получите html Ñтраницу которую вы -наÑтроили на первом шаге. ЕÑли же результат будет отрицательный, Ñмотрите логи и -пробуйте до тех пор пока не заработает. -

-
- -

Шаг третий: Ñоветы

-
-

ЕÑли вы планируете поддерживать ваш Ñкрытый ÑÐµÑ€Ð²Ð¸Ñ Ð² течении длительного времени, -Ñделайте резервную копию файла private_key. -

-

Мы избегаем рекомендовать Apache выше, а) потому что у многих он уже -уÑтановлен Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ обычного веб-Ñайта на их компьютере, и б) -потому что он Ñлишком большой и может раÑкрыть ваш IP Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ -другую идентифицирующую информацию многими ÑпоÑобами, например Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -Ñтраниц ошибки 404. Впрочем, Ð´Ð»Ñ Ñ‚ÐµÑ… кому ÑущеÑтвенно требуетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾ÑÑ‚ÑŒ, -Apache может быть верным выбором. Может ли кто-нибудь ÑоÑтавить ÑпиÑок -дейÑтвий требуемых Ð´Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñного иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Apache как -Ñкрытого веб-ÑервиÑа? Ðаверное Ñти же проблемы еÑÑ‚ÑŒ и у Savant. -

-

ЕÑли вы хотите перенаправлÑÑ‚ÑŒ неÑколько портов на один Ñкрытый ÑервиÑ, -проÑто добавьте неÑколько Ñтрок HiddenServicePort. ЕÑли вы хотите -поддерживать неÑколько разных Ñкрытых ÑервиÑов на одном клиенте Tor, -проÑто добавьте ещё Ñтроки HiddenServiceDir. Ð’Ñе поÑледующие Ñтроки -HiddenServicePort отноÑÑÑ‚ÑÑ Ðº Ñтой Ñтроке HiddenServiceDir, до тех пор -пока вы не добавите ещё одну Ñтроку HiddenServiceDir: -

-
-HiddenServiceDir /usr/local/etc/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:8080
-
-HiddenServiceDir /usr/local/etc/tor/other_hidden_service/
-HiddenServicePort 6667 127.0.0.1:6667
-HiddenServicePort 22 127.0.0.1:22
-
-

ЕÑÑ‚ÑŒ неÑколько моментов ÑвÑзанных Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ñтью о которых Ñледует помнить: -

-
    -
  • Как уже говорилоÑÑŒ выше, будьте бдительны чтобы не дать вашему веб-Ñерверу -выдать идентифицирующую информацию о ваÑ, вашем компьютере, или вашем меÑтоположении. -Ðапример, поÑетители Ñмогут наверное определить иÑпользуетÑÑ Ð»Ð¸ thttpd или Apache, -и узнать что-нибудь о вашей операционной ÑиÑтеме.
  • -
  • ЕÑли ваш компьютер не доÑтупен онлайн Ñутки напролёт, то ваш Ñкрытый ÑÐµÑ€Ð²Ð¸Ñ Ñ‚Ð°ÐºÐ¶Ðµ. -Это Ð¾Ñ‡ÐµÐ²Ð¸Ð´Ð½Ð°Ñ ÑƒÑ‚ÐµÑ‡ÐºÐ° информации Ð´Ð»Ñ Ñтороннего наблюдателÑ.
  • - -
-
-

ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ Ð¿Ð¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð¿Ð¾ улучшению Ñтого документа, пожалуйÑта выÑылайте их нам. СпаÑибо!

-
-
-
-
-

- Webmaster - - ПоÑледние изменениÑ: Sun Mar 2 17:31:17 2008 - - - ПоÑледнÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑциÑ: Sun Mar 2 17:36:05 2008 -

-

"Tor" и "Onion Logo" - торговые марки принадлежащие Tor Project, Inc. -

-

- Эта Ñтраница также переведена на Ñледующие Ñзыки: - English, español, français, Italiano, polski, 中文(简) (Simplified Chinese).
- Как уÑтановить Ñзык документов по умолчанию. -

-

Разработчики Tor не проверÑли Ñтот перевод на точноÑÑ‚ÑŒ и корректноÑÑ‚ÑŒ. - Перевод может быть уÑтаревшим или проÑто неправильным. Официальный веб-Ñайт - Tor на английÑком Ñзыке доÑтупен по адреÑу - https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-hidden-service.html.zh-cn tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.zh-cn --- tor-0.2.0.34/doc/website/tor-hidden-service.html.zh-cn 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-hidden-service.html.zh-cn 1970-01-01 00:00:00.000000000 +0000 @@ -1,225 +0,0 @@ - - - - éšåŒ¿æœåŠ¡é…置指导 - - - - - - -
- - - - - - - -
-
-

é…ç½® Tor éšåŒ¿æœåŠ¡

-
-

Tor å…许客户端和中继æä¾›éšåŒ¿æœåŠ¡ã€‚å³ä½ èƒ½å¤Ÿåœ¨ä¸å‘用户泄露你的 IP 地å€çš„情况下 -æä¾› Web æœåŠ¡ã€SSH æœåŠ¡ç­‰ç­‰ã€‚事实上,因为你ä¸éœ€è¦ä»»ä½•å…¬å¼€çš„地å€ï¼Œä½ èƒ½åœ¨é˜²ç«å¢™åŽé¢ -è¿è¡ŒéšåŒ¿æœåŠ¡ã€‚ -

-

如果你已安装了 Tor å’Œ Privoxy,你能通过访问一个 -éšåŒ¿æœåŠ¡å®žä¾‹æ¥æ„Ÿå—éšåŒ¿æœåŠ¡æ˜¯å¦‚何è¿è¡Œçš„。 -

-

本指导æ述了设置你自己的éšåŒ¿æœåŠ¡ç½‘站的步骤。 -

-
- -

第零步:使 Tor 和 Privoxy 正常工作

-
-

开始å‰ï¼Œä½ éœ€è¦ç¡®è®¤ï¼š

-
    -
  1. Tor 正在è¿è¡Œï¼Œ
  2. -
  3. Privoxy 正在è¿è¡Œï¼Œ
  4. -
  5. Privoxy 被é…ç½®ä¸ºæŒ‡å‘ Tor,以åŠ
  6. -
  7. 你确实正确地设置了一切。
  8. -
-

Windows 用户应该éµç…§ Windows 指导,OS -X 用户应该éµç…§ OS X 指导,Linux/BSD/Unix -用户应该éµç…§ Unix 指导。 -

-

一旦 Tor å’Œ Privoxy 安装与é…置完æˆï¼Œä½ èƒ½é€šè¿‡è®¿é—®ä¸€ä¸ªéšåŒ¿æœåŠ¡å®žä¾‹æ¥æ„Ÿå—éšåŒ¿æœåŠ¡æ˜¯å¦‚何è¿è¡Œçš„。 -é€šå¸¸éœ€è¦ 10 到 60 秒的时间æ¥è½½å…¥é¡µé¢ï¼ˆæˆ–者确定当å‰æ— æ³•è®¿é—®ï¼‰ã€‚如果立刻失败并且 -æµè§ˆå™¨å¼¹å‡ºè­¦å‘Šè¯´â€œæ‰¾ä¸åˆ° www.duskgytldkxiuqc6.onion,请检查地å€é‡æ–°å°è¯•â€ï¼Œåˆ™è¯´æ˜Ž -你没能正确é…ç½® Tor å’Œ Privoxy。请查看此 -FAQ æ¡ç›®èŽ·å¾—帮助。 -

-
- -

第一步:在本地安装 Web æœåŠ¡å™¨

-
-

首先,你需è¦åœ¨æœ¬åœ°è®¾ç½®ä¸€å° Web æœåŠ¡å™¨ã€‚设置 Web æœåŠ¡å™¨æ˜¯ä¸€ä¸ªæ£˜æ‰‹çš„难题, -因此我们在这里将仅仅介ç»ä¸€äº›åŸºæœ¬æ­¥éª¤ã€‚如果你想知é“更多,去找一ä½èƒ½å¸®åŠ©ä½ çš„朋å‹ã€‚ -我们建议你为éšåŒ¿æœåŠ¡å®‰è£…一å°æ–°çš„ã€ç‹¬ç«‹çš„ Web æœåŠ¡å™¨ï¼Œè¿™æ˜¯å› ä¸ºå³ä½¿ä½ å·²ç»æœ‰äº†ä¸€å°ï¼Œ -你也许正在用它(或打算用它)è¿è¡Œä¸€ä¸ªçœŸå®žçš„网站。 -

-

如果你使用的是 Unix 或 OS X 并且对命令行ä¸é™Œç”Ÿï¼Œç›®å‰ä¸ºæ­¢æœ€å¥½çš„方法是安装 -thttpd。获å–最新的æºæ–‡ä»¶åŽ‹ç¼©åŒ…, -解压缩(它会创建自己的目录),è¿è¡Œ ./configure && make。 -ç„¶åŽ mkdir hidserv; cd hidserv,然åŽè¿è¡Œ ../thttpd -p 5222 -h -localhost。你将回到æç¤ºç¬¦ï¼ŒçŽ°åœ¨ä¸€å° Web æœåŠ¡å™¨å·²åœ¨ç«¯å£ 5222 è¿è¡Œã€‚ä½ å¯ä»¥åœ¨ -hidserv 目录放入(éšåŒ¿æœåŠ¡æ供的)文件。 -

-

如果你使用的是 Windows,你å¯ä»¥é€‰æ‹© Savant -或者 Apache,请é…置其仅绑定本地主机。 -你还应该知é“监å¬çš„端å£ï¼Œä¸‹é¢å°†ç”¨åˆ°ã€‚ -

-

(我们将 Web æœåŠ¡å™¨ä»…绑定本地主机的原因是为了ä¿è¯å®ƒæ— æ³•è¢«å…¬å¼€åœ°è®¿é—®ã€‚如果有人 -å¯ä»¥ç›´æŽ¥è®¿é—®å®ƒï¼Œä»–们将æ®æ­¤ç¡®è®¤ä½ çš„计算机正在æä¾›éšåŒ¿æœåŠ¡ã€‚) -

-

当 Web æœåŠ¡å™¨è®¾ç½®å®Œæˆæ—¶ï¼Œè¯·ç¡®è®¤å®ƒå·¥ä½œæ­£å¸¸ï¼šæ‰“å¼€æµè§ˆå™¨ï¼Œè®¿é—® http://localhost:5222/,其中 5222 是上é¢ä½ æ‰€ -选择的端å£ã€‚然åŽåœ¨ä¸»ç›®å½•ä¸­åŠ å…¥ä¸€ä¸ªæ–‡ä»¶ï¼Œçœ‹çœ‹å®ƒæ˜¯å¦å‡ºçŽ°åœ¨ä½ æ‰€è®¿é—®çš„站点中。 -

-
- -

第二步:é…置你的éšåŒ¿æœåŠ¡

-
-

接下æ¥ï¼Œä½ éœ€è¦å°†ä½ çš„éšåŒ¿æœåŠ¡æŒ‡å‘本地的 Web æœåŠ¡å™¨ã€‚ -

-

首先,在你的文本编辑器中打开 torrc 文件。(如果ä¸æ˜Žç™½è¿™å¥è¯çš„æ„æ€ï¼Œè¯·çœ‹å…³äºŽ torrc çš„ -FAQ æ¡ç›®ã€‚)在中间部分查找这样一行

-
-############### This section is just for location-hidden services ###
-
-

文件的这一部分包括了几组,æ¯ç»„由多行构æˆï¼Œæ¯ä¸€ç»„都代表了一项éšåŒ¿æœåŠ¡ã€‚现在 -它们都被注释掉了(以 # 开始的行),所以éšåŒ¿æœåŠ¡æ˜¯ç¦æ­¢çš„。æ¯ç»„都包括一行 -HiddenServiceDir,å¦æœ‰ä¸€è¡Œæˆ–多行 HiddenServicePort:

-
    -
  • HiddenServiceDir 是 Tor å°†è¦ä¿å­˜éšåŒ¿æœåŠ¡ä¿¡æ¯çš„目录。特别地,Tor -将创建一个å为 hostname 的文件记录 onion URL。你无需å‘此目录添加 -任何文件。
  • -
  • HiddenServicePort 让你指定虚拟端å£ï¼ˆå³å½“他人访问éšåŒ¿æœåŠ¡æ—¶è®¤ä¸ºä»–们 -在使用的端å£ï¼‰å’Œè™šæ‹Ÿç«¯å£çš„连接é‡å®šå‘到的 IP 地å€å’Œç«¯å£ã€‚
  • -
-

将以下两行加入 torrc: -

-
-HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:5222
-
-

你需è¦ä¿®æ”¹ HiddenServiceDir 这一行,使其指å‘一个è¿è¡Œ Tor 的用户能够 -读写的目录。如果你正在使用 OS X çš„ Tor 软件包,上é¢ä¸€è¡Œæ˜¯æœ‰æ•ˆçš„。在 Unix 上请 -å°è¯•â€œ/home/username/hidserv/â€ï¼Œâ€œusernameâ€å¯¹åº”你自己的用户å。在 Windows 上或许å¯ä»¥ -这样:

-
-HiddenServiceDir C:\Documents and Settings\username\Application Data\hidden_service\
-HiddenServicePort 80 127.0.0.1:5222
-
-

现在ä¿å­˜ torrc,关闭 Tor,然åŽå†æ¬¡å¯åŠ¨å®ƒã€‚ -

-

如果 Tor å†æ¬¡æˆåŠŸå¯åŠ¨ï¼Œå¾ˆå¥½ã€‚å¦åˆ™çš„è¯ï¼Œè¯´æ˜Žä»€ä¹ˆåœ°æ–¹å‘生了问题。首先查看日志文件 -寻找线索。它将记录一些警告或错误消æ¯ã€‚你应该能够由此明白错在哪里。典型的错误是 -torrc 中的笔误或ä¸æ­£ç¡®çš„目录æƒé™ã€‚(如果你ä¸çŸ¥é“如何激活日志或找ä¸åˆ°æ—¥å¿—文件, -请查看关于 -日志的 FAQ æ¡ç›®ã€‚) -

-

Tor 在å¯åŠ¨æ—¶ä¼šè‡ªåŠ¨åˆ›å»ºä½ æ‰€æŒ‡å®šçš„ HiddenServiceDir(如果需è¦çš„è¯ï¼‰ï¼Œ -它还将在那儿创建两个文件。

-
-
private_key
-
首先,Tor 将生æˆä¸€å¯¹æ–°çš„ä¾›éšåŒ¿æœåŠ¡ä½¿ç”¨çš„公钥/ç§é’¥å¯¹ã€‚它被写入一个 -å为“private_keyâ€çš„文件中。ä¸è¦ä¸Žä»–人分享这一秘钥——如果你这么åšï¼Œä»–们将能够冒充你的 -éšåŒ¿æœåŠ¡ã€‚
-
hostname
-
Tor 将创建的å¦ä¸€ä¸ªæ–‡ä»¶æ˜¯â€œhostnameâ€ã€‚其中包括了你的公钥的简短摘è¦â€”—它看起æ¥åƒ -duskgytldkxiuqc6.onion。这是你的æœåŠ¡çš„公开å字,你能够将它告诉别人, -把它å‘布在网站上,打å°åœ¨å•†åŠ¡å片上,等等。
-
-

如果è¿è¡Œ Tor çš„ä¸æ˜¯ä½ è€Œæ˜¯å…¶ä»–用户,例如在 OS Xã€Debian 或 Red Hat å¹³å°ä¸Šï¼Œ -则你需è¦æˆä¸º root æ¥æŸ¥çœ‹è¿™äº›æ–‡ä»¶ã€‚

-

现在你已ç»é‡å¯äº† Tor,它正忙于在 Tor 网络中选择介ç»èŠ‚点(introduction points), -以åŠç”Ÿæˆä¸€ä¸ªéšåŒ¿æœåŠ¡æ述符。éšåŒ¿æœåŠ¡æ述符是ç»è¿‡ç­¾å的介ç»èŠ‚点列表与æœåŠ¡ -的完整的公钥。它以匿åçš„æ–¹å¼å°†è¿™ä¸€æ述符å‘布到目录æœåŠ¡å™¨ï¼Œå½“其他用户å°è¯•è®¿é—®ä½ çš„ -æœåŠ¡æ—¶ï¼Œä»–们åŒæ ·ä»¥åŒ¿åçš„æ–¹å¼ä»Žç›®å½•æœåŠ¡å™¨èŽ·å–这一æ述符。 -

-

现在就æ¥è¯•è¯•ï¼šå°† hostname 文件中的内容粘贴到æµè§ˆå™¨ä¸­ã€‚如果一切正常,你将看到 -你在第一步时添加的 HTML 页é¢ã€‚如果工作ä¸æ­£å¸¸ï¼Œè¯·æŸ¥çœ‹æ—¥å¿—寻找线索,ä¸æ–­å°è¯•ç›´è‡³ -正常工作。 -

-
- -

第三步:更多高级技巧

-
-

如果你打算长期è¿è¡ŒæœåŠ¡ï¼Œä½ æˆ–许需è¦åœ¨ä»€ä¹ˆåœ°æ–¹å¤‡ä»½ private_key 文件。 -

-

在上é¢ï¼Œæˆ‘们é¿å…推è Apache,这是因为 a) 许多人å¯èƒ½å·²åœ¨ä»–ä»¬çš„è®¡ç®—æœºä¸Šç”¨å®ƒæ¥ -è¿è¡Œå…¬å¼€çš„ Web æœåŠ¡å™¨ï¼›b) 它很大,å¯èƒ½åœ¨è®¸å¤šåœ°æ–¹æ³„露你的 IP 地å€æˆ–其他信æ¯ï¼Œå¦‚ -404 页é¢ä¸­ã€‚但是对于需è¦æ›´å¤šåŠŸèƒ½çš„人æ¥è¯´ï¼ŒApache 也许是正确的选择。有è°èƒ½ä¸ºæˆ‘们 -制作一份清å•ï¼Œåˆ—举使用 Apache 作为éšåŒ¿æœåŠ¡æ—¶éœ€è¦æ³¨æ„的事项å—?Savant å¯èƒ½ä¹Ÿä¼šæœ‰ -这些问题。 -

-

如果你需è¦ä¸ºä¸€é¡¹éšåŒ¿æœåŠ¡è½¬å‘多个虚拟端å£ï¼Œæ·»åŠ å¤šè¡Œ HiddenServicePort -å³å¯ã€‚如果你需è¦ä»ŽåŒä¸€ä¸ª Tor 客户端è¿è¡Œå¤šé¡¹éšåŒ¿æœåŠ¡ï¼Œæ·»åŠ å¦ä¸€è¡Œ HiddenServiceDir -å³å¯ã€‚紧接ç€çš„所有 HiddenServicePort 行都与这一行 HiddenServiceDir -相关,直到你åˆæ·»åŠ å¦ä¸€è¡Œ HiddenServiceDir: -

-
-HiddenServiceDir /usr/local/etc/tor/hidden_service/
-HiddenServicePort 80 127.0.0.1:8080
-
-HiddenServiceDir /usr/local/etc/tor/other_hidden_service/
-HiddenServicePort 6667 127.0.0.1:6667
-HiddenServicePort 22 127.0.0.1:22
-
-

你还需è¦è®°ä½ä¸€äº›ä¸ŽåŒ¿å有关的问题: -

-
    -
  • 如å‰æ‰€è¿°ï¼Œå°å¿ƒä½ çš„ Web æœåŠ¡å™¨æ³„露你的身份信æ¯ã€ä½ çš„计算机或你的ä½ç½®ã€‚ -例如,访问者å¯èƒ½ä¼šçŸ¥é“它是 thttpd 还是 Apache,以åŠäº†è§£ä½ çš„æ“作系统的一些信æ¯ã€‚
  • -
  • 如果你的计算机ä¸æ˜¯ä¸€ç›´åœ¨çº¿çš„,你的éšåŒ¿æœåŠ¡ä¹Ÿä¸ä¼šä¸€ç›´åœ¨çº¿ã€‚这会å‘观察æ•é”的敌手 -泄露信æ¯ã€‚
  • - -
-
-

如果你有改进本文档的建议,请告诉我们。 -谢谢ï¼

-
-
-
-
-

- Webmaster - - 最åŽä¿®æ”¹: Tue Feb 26 19:27:12 2008 - - - 最åŽç¼–译: Sun Mar 2 17:36:07 2008 -

-

"Tor" 和 "Onion Logo" 是 The Tor Project, Inc. 的商标。 -

-

- 警告: 本翻译的内容å¯èƒ½æ˜¯è¿‡æ—¶çš„。英文原文ä½äºŽç¬¬ 13768 次修订, - 但本翻译基于第 13194 次修订。 -

-

- 本页é¢è¿˜æœ‰å¦‚下语言的版本: - English, español, français, Italiano, polski, Русский (Russkij)。
- 如何设置默认语言。 -

-

- Tor çš„å¼€å‘者和 EFF å‡æœªå¯¹æœ¬ç¿»è¯‘的精确性和正确性作检查。 - 它å¯èƒ½æ˜¯è¿‡æ—¶çš„或者错误的。 - Tor 的官方网站的语言是英文,ä½äºŽ https://www.torproject.org/。 -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-switchproxy.html.en tor-0.2.2.16-alpha/doc/website/tor-switchproxy.html.en --- tor-0.2.0.34/doc/website/tor-switchproxy.html.en 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-switchproxy.html.en 1970-01-01 00:00:00.000000000 +0000 @@ -1,169 +0,0 @@ - - - - Tor: SwitchProxy Install Instructions - - - - - - -
- - - - - - - -
-
-

Note: SwitchProxy is no longer the recommended plugin -for using Tor with Firefox. Instead, you should use the Torbutton -plugin. We will leave the SwitchProxy instructions in place -for those who prefer the old (harder) approach or who have more -complex needs, such as running Tor on a different computer than -Firefox.

-

Installing SwitchProxy for Tor

-
-

-SwitchProxy is a Firefox plugin that makes it easy for you to switch -between using a proxy and connecting to websites directly.

-

In this howto, you'll set up SwitchProxy to let you change -between using Tor and a direct connection. We assume you already -have Firefox installed and working.

-

The screenshots here are oriented towards Windows users, but -SwitchProxy works anywhere Firefox works. Hopefully everybody else can -follow along just fine.

-
- -

Step Zero: Download and Install Tor and Privoxy

-
-

Before you start, you need to make sure 1) Tor is up and running, -2) Privoxy is up and running, and 3) Privoxy is configured to point -to Tor.

-

Windows users need to do step one -of the Windows Tor installation howto, and Mac OS X users need to do step one -of OS X Tor installation howto, since our Win32 and OS X packages include -Privoxy and configure it already. Linux/BSD/Unix users should do step one -and step -two of the Unix Tor installation howto. -

-
- -

Step One: Download and Install SwitchProxy

-
-

SwitchProxy is a Firefox plugin, so you need to go through -the process of installing a new plugin. First, go to the -SwitchProxy web page. -Turn on JavaScript for now and click "Install Now":

-switchproxy web page -

It will pop up a window asking for permission to install the plugin. -Click on the "Install Now" button: -

-firefox plugin warning -

Once the installer is finished, you should close all of your Firefox -windows and restart Firefox.

-firefox plugin finished -
- -

Step Two: Configure SwitchProxy

-
-

When you restart Firefox, you'll notice there's a new toolbar -that lets you control your proxies. Now we're going to set up a proxy -configuration for Tor. Click on "Add" in the new Proxy toolbar:

-new toolbar -

It will ask you to select a proxy type. Choose -"Standard." (There's also an "anonymous" proxy type that -uses an ad hoc set of anonymous proxies out there. You -don't want this, because those other "anonymous" proxies give -you much weaker security than Tor.) -

-standard proxy -

Now it will show you the standard proxy config window for Firefox. -Give this configuration a proxy label of "tor". Then fill in "localhost" -and "8118" to point the top four protocols to Privoxy, as shown here. (Even -though Privoxy doesn't support FTP and Gopher, you -should set them up anyway.) You should also fill out the socks -proxy entry to point directly to Tor ("localhost", "9050", and socks5) -to cover protocols besides the first four. Then click "OK":

-proxy config -

Now you've created the "tor" proxy label, but you're not using it yet. -Click on the pull-down list and select tor, as shown here:

-switch to tor -

Almost done. Click "Apply" to make your change take effect:

-apply -

Done! Firefox will reload your current page. In -this example screenshot, it reloaded the page and happened -to get a German exit node:

-german google -
- -

Step Three: Check if it works

-
-

Now Firefox is using Privoxy as an HTTP proxy, Privoxy is using Tor as -a socks4a proxy, and Tor is making your connections to the Internet.

-

In the above example, it was clear that it worked because the web -page showed up in a different language. In other cases, though, -you'll want to verify that your setup is working. Do -step three -of the Windows Tor installation howto, or -step three -of the OS X Tor installation howto.

-

You should be aware of one anonymity gotcha: when you switch from -using Tor to a direct connection (or vice versa), by default the page -that's currently active will be reloaded through the new proxy setting. -So make sure you're on a page that isn't sensitive, before switching. -(You can also change this behavior in SwitchProxy's "Options | -Preferences" menu.)

-
-

If you have suggestions for improving this document, please send them to us. Thanks!

-
-
-
-
-

- Webmaster - - Last modified: Sun Mar 2 17:31:17 2008 - - - Last compiled: Sun Mar 2 17:35:39 2008 -

-

"Tor" and the "Onion Logo" are trademarks of The Tor Project, Inc. -

-

- This page is also available in the following languages: - español, Italiano, polski.
- How to set the default document language. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-switchproxy.html.es tor-0.2.2.16-alpha/doc/website/tor-switchproxy.html.es --- tor-0.2.0.34/doc/website/tor-switchproxy.html.es 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-switchproxy.html.es 1970-01-01 00:00:00.000000000 +0000 @@ -1,180 +0,0 @@ - - - - Instrucciones de Instalación de SwitchProxy - - - - - - -
- - - - - - - -
-
-

Nota: SwitchProxy ya no es el plugin recomendado para usar -Tor con Firefox. En su lugar, debería usar el plugin Torbutton. - Dejaremos las instrucciones para SwitchProxy en su sitio -para aquellos que prefieran el método viejo (más difícil) o que -tengan necesidades más complejas, como ejecutar Tor en un ordenador -distinto del de Firefox.

-

Instalar SwitchProxy para Tor

-
-

-SwitchProxy es un plugin de Firefox que hace más fácil cambiar entre -usar un proxy y conectarse a los sitios web directamente.

-

En este howto, configurará SwitchProxy para que le permita cambiar -entre usar Tor y una conexión directa. Suponemos que ya tiene Firefox -instalado y funcionando.

-

Las capturas de pantalla incluídas aquí están orientadas a -usuarios Windows, pero SwitchProxy funciona en cualquier ordenador en -que funcione Firefox. Esperamos que el resto de la gente pueda seguirnos -sin problemas.

-
- -

Paso Cero: Descargar e Instalar Tor y Privoxy

-
-

Antes de empezar, debe asegurarse de que 1) Tor está activo y ejecutándose, -2) Privoxy está activo y ejecutándose, y 3) Privoxy está configurado para -apuntar a Tor.

-

Los usuarios de Windows deben hacer el paso uno -del howto de instalación de Tor en Windows, y los usuarios de Mac OS X -deben hacer al menos el paso uno -del howto de instalación de Tor en OS X, ya que nuestros paquetes para -Win32 y OS X incluyen Privoxy y lo configuran. Los usuarios de -Linux/BSD/Unix deben hacer el paso uno -y el paso dos -del howto de instalación de Tor en Unix. -

-
- -

Paso Uno: Descargar e Instalar SwitchProxy

-
-

SwitchProxy es un plugin de Firefox, así que tendrá que hacer -el proceso de instalación de un plugin nuevo. Primero vaya a la -página web de SwitchProxy. -Active Javascript por ahora y pulse "Instalar ahora":

-página web de switchproxy -

Aparecerá una ventana pidiendo permiso para instalar el plugin. -Pulse en el botón "Instalar ahora": -

-Advertencia del plugin de firefox -

Una vez que el instalador haya finalizado, debería cerrar todas -sus ventanas de Firefox y reiniciar Firefox.

-Plugin de firefox terminado -
- -

Paso Dos: Configurar SwitchProxy

-
-

Cuando reinicie Firefox, notará que hay una nueva barra de herramientas -que le permite controlar sus proxies. Ahora prepararemos una configuración -de proxy para Tor. Pulse "Añadir" en la nueva barra de herramientas de Proxy: -

-nueva barra de herramientas -

Le pedirá que seleccione el tipo de proxy. Elija -"Standard." (Hay también un tipo de proxy "anónimo" que -usa un conjunto ad hoc de proxies de por ahí fuera. Usted no -quiere esto, porque esos otros proxies "anónimos" le -dan una seguridad mucho más débil que Tor.) -

-proxy estandar -

Ahora le mostrará la ventana de configuración de proxies estandar de -Firefox. Déle a esta configuración una etiqueta de proxy "tor". Entonces -rellene con "localhost" y "8118" para que los cuatro protocolos de arriba -apunten a Privoxy. (Aunque Privoxy no soporta FTP ni Gopher, debería -ponerlos igualmente.) Debe también rellenar la entrada de proxy socks -para que apunte directamente a Tor ("localhost", "9050", y socks5) -para cubrir protocolos aparte de los primeros cuatro. Entonces pulse -"OK":

-configuración de proxy -

Ya ha creado la etiqueta de proxy "tor", pero no la está usando aún. -Pulse en la lista desplegable y seleccione tor, como se ve aquí:

-cambiar a tor -

Ya está casi hecho. Pulse "Aplicar" para que su cambio tenga efecto:

-aplicar -

¡Hecho! Firefox recargará su página actual. En -esta captura de pantalla de ejemplo, recargó la página y -obtuvo un nodo de salida alemán:

-google en alemán -
- -

Paso Tres: Comprobar si funciona

-
-

Ahora Firefox está usando Privoxy como proxy HTTP, Privoxy está usando -Tor como proxy socks4a, y Tor hace sus conexiones a Internet.

-

En el ejemplo de arriba, estaba claro que funcionaba porque la -página web se mostró en un idioma diferente. En otros casos, sin -embargo, querrá verificar que su configuración está funcionando. -Haga el paso tres -del hosto de instalación de Tor en Windows, o -el paso tres -del howto de instalación de Tor en OS X.

-

Tiene que tener cuidado con lo siguiente: cuando cambie de usar -Tor a una conexión directa (o vice versa), por defecto la página -que está activa se recargará usando la nueva configuración de proxy. -Asegúresde de estar en una página que no sea sensible, antes de cambiar. -(Tambien puede cambiar este comportamiento en el menú "Opciones | Preferencias" -de SwitchProxy.) -

-
-

Si tiene sugerencias para mejorar este documento, por favor envíenoslas. ¡Gracias!

-
-
-
-
-

- Webmaster - - Última modificación: Tue Feb 26 19:27:13 2008 - - - Última compilación: Sun Mar 2 17:35:43 2008 -

-

"Tor" y el "Logo de la Cebolla" son -marcas registradas de El Proyecto Tor, S.A. -

-

- Aviso: Esta traducción podría estar obsoleta. La revisión original en inglés es la - 13768 mientras que esta revisión está basada en la - 13194. -

-

- Esta página también está disponible en los siguientes idiomas: - English, Italiano, polski.
- Cómo establecer el idioma por defecto del documento. -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-switchproxy.html.it tor-0.2.2.16-alpha/doc/website/tor-switchproxy.html.it --- tor-0.2.0.34/doc/website/tor-switchproxy.html.it 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-switchproxy.html.it 1970-01-01 00:00:00.000000000 +0000 @@ -1,174 +0,0 @@ - - - - Tor: istruzioni per installare SwitchProxy - - - - - - -
- - - - - - - -
-
-

Nota: SwitchProxy non è più il plugin raccomandato -per usare Tor con Firefox. Al suo posto, usa il plugin Torbutton -. Lasceremo nella pagina le istruzioni per SwitchProxy -per coloro che preferiscono il vecchio metodo (che è più difficile) o che hanno -esigenze più complesse, come usare Tor su un computer diverso da -quello su cui usi Firefox.

-

Installare SwitchProxy per Tor

-
-

-SwitchProxy è un plugin per Firefox che aiuta a passare dalla navigazione -con un proxy alla connessione diretta ai siti.

-

In questa guida imparerai a configurare SwitchProxy per passare -da Tor ad una connessione diretta. Si suppone che tu abbia già -installato Firefox e che esso funzioni.

-

Le immagini delle schermate sono pensate per utenti Windows, ma -SwitchProxy funziona ovunque giri Firefox. Tutti dovrebbero riuscire quindi a seguire -queste istruzioni senza grossi problemi.

-
- -

Zero: scarica e installa Tor e Privoxy

-
-

Prima di cominciare, occorre che 1) Tor sia installato e funzionante, -2) Privoxy sia installato e funzionante, e che 3) Privoxy sia configurato per -puntare a Tor.

-

Gli utenti Windows dovranno seguire il punto uno -della guida per installare Tor su Windows, e utenti Mac OS X dovranno seguire il passo uno -della guida di installazione Tor su OS X, installando i nostri pacchetti Win32 e OS X che contengono -Privoxy già configurato. Gli utenti Linux/BSD/Unix dovrebbero invece seguire il passo uno -ed il passo -due della guida per installare Tor su Unix. -

-
- -

Uno: scarica e installa SwitchProxy

-
-

SwitchProxy è un plugin per Firefox e va quindi installato -come tutti i nuovi plugin. Per prima cosa vai alla pagina web di -SwitchProxy. -Abilita i JavaScript temporaneamente e fai clic su "Install Now":

-switchproxy web page -

Comparirà una finestra di conferma del permesso per installare il plugin. -Fai clic sul pulsante "Install Now": -

-firefox plugin warning -

Quando il programa di installazione sarà terminato, chiudi tutte le finestre aperte di Firefox, -poi riavvia Firefox.

-firefox plugin finished -
- -

Due: configura SwitchProxy

-
-

Dop il riavvio di Firefox noterai una nuova barra di strumenti -per controllare i proxy. Ora occorre creare una nuova configurazione proxy -per Tor. Fai clic su "Add" nella nuova barra dei proxy:

-new toolbar -

Ti chiederà di indicare un tipo di proxy. Selezionare -"Standard." (C'è anche un tipo di proxy "anonimo" che -usa una serie di proxy ad hoc. Non sceglierlo, -perché questi altri proxy "anonimi" sono -molto più insicuri e deboli di Tor.) -

-standard proxy -

Ora mostrerà la normale finestra di configurazione del proxy in Firefox. -Chiama questa configurazione "tor". Inserisci "localhost" -e "8118" per puntare i primi quattro protocolli a Privoxy, come mostrato qui. (Anche -se Privoxy non supporta FTP e Gopher, configurali -lo stesso.) Compila anche il socks -proxy per puntarlo direttamente a Tor ("localhost", "9050", e socks5) -in modo da coprire gli altri protocolli dopo i primi quattro. Poi fai clic su "OK":

-proxy config -

Ora hai creato un proxy chiamato "tor", ma non lo stai ancora usando. -Fai clic sul menu di selezione e scegli tor, come mostrato qui:

-switch to tor -

Ce l'hai quasi fatta. fai clic su "Apply" perché il cambiamento abbia effetto:

-apply -

Ecco fatto! Firefox ricaricherà la pagina corrente. In -questa schermata di esempio, ricarica la pagina e ottiene -un exit node tedesco:

-german google -
- -

Tre: controlla che funzioni

-
-

Ora che Firefox usa Privoxy come proxy HTTP, Privoxy si appoggia a Tor come -proxy socks4a, e Tor esegue le connessioni dirette a Internet.

-

Nell'esempio qui sopra è evidente che funziona, perché la -pagina web è stata ricaricata in una lingua diversa, in base al nodo di uscita. In altri -casi però potresti volere verificare che la configurazione funzioni davvero. Segui il -passo tre -della guida di installazione Tor per Windows, oppure il -passo tre -della guida di installazione Tor per OS X.

-

Fai attenzione a un dettaglio del tuo anonimato: passando dall'uso di -Tor a una connessione diretta (o viceversa), di default la pagina -attiva viene ricaricata con il nuovo proxy. -Perciò assicurati di stare su una pagina non sensibile o importante prima di passare -da un proxy all'altro. (Puoi anche configurare appositamente SwitchProxy nel menu "Options | -Preferences".)

-
-

Se hai dei suggerimenti per migliorare questo documento, per favore scrivici. Grazie!

-
-
-
-
-

- Webmaster - - Ultima modifica: Sun Mar 2 17:31:18 2008 - - - Ultima compilazione: Sun Mar 2 17:35:48 2008 -

-

"Tor" e l'"Onion Logo" sono marchi registrati di The Tor Project, Inc. -

-

- Questa pagina è disponibile anche nelle lingue seguenti: - English, español, polski.
- Come configurare la lingua predefinita per i documenti. -

-

Questa traduzione non è stata controllata dagli sviluppatori di - Tor. Può essere obsoleta o errata. Il sito - ufficiale di Tor è in inglese, all'indirizzo https://torproject.org/ -

-
- - diff -Nru tor-0.2.0.34/doc/website/tor-switchproxy.html.pl tor-0.2.2.16-alpha/doc/website/tor-switchproxy.html.pl --- tor-0.2.0.34/doc/website/tor-switchproxy.html.pl 2009-02-09 03:32:42.000000000 +0000 +++ tor-0.2.2.16-alpha/doc/website/tor-switchproxy.html.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,172 +0,0 @@ - - - - Tor: Instrukcje do instalacji SwitchProxy - - - - - - -
- - - - - - - -
-
-

Uwaga: SwitchProxy już nie jest zalecanym rozszerzeniem do - używania Tora w Firefoksie. Zamiast tego, powinieneś używać rozszerzenia Torbutton. - Zostawimy instrukcje do SwitchProxy dla tych, którzy wolą starszy - (trudniejszy) sposób lub którzy mają bardziej złożone potrzeby, jak np. - uruchamianie Tora na innym komputerze niż Firefox.

-

Instalowanie SwitchProxy do współpracy z Torem

-
-

-SwitchProxy jest rozszerzeniem dla Firefoksa, które ułatwia przełączanie - się między używaniem serwera Proxy a bezpośrednim łączeniem się ze - stronami WWW.

-

Dzięki temu dokumentowi ustawisz SwitchProxy tak, by umożliwiało - przełączanie się między używaniem Tora a połączeniem bezpośrednim. - Zakładamy, że masz zainstalowanego i działającego Firefoksa.

-

Te zrzuty ekranu są dla użytkowników systemu Windows, ale - SwitchProxy działa wszędzie tam, gdzie działa Firefox. Mamy nadzieję, że - inni użytkownicy bez problemu będą nadążać.

-
- -

Krok 0: Pobierz i zainstaluj Tora i Privoxy

-
-

Zanim zaczniesz, musisz upewnić się, że 1) Tor jest uruchomiony i działa - 2) Privoxy jest uruchomione i działa, i 3) Privoxy jest skonfigurowane by - używać Tora.

-

Użytkownicy Windows muszą wykonać krok 1 - w opisie instalacji Tora dla Windows, a użytkownicy MAC OS X muszą wykonać krok 1 - w opisie instalacji Tora dla MAC OS X, gdyż nasze paczki dla Win32 i OS X - zawierają Privoxy i jest już ono skonfigurowane. Użytkownicy Linux/BSD/Unix powinni wykonać krok 1 - i krok - 2 w opisie instalacji Tora dla systemów Unix. -

-
- -

Krok 1: Pobranie i instalacja SwitchProxy

-
-

SwitchProxy jest rozszerzeniem do Firefoksa, więc musisz przejść przez - proces instalacji nowego rozszerzenia. Najpierw przejdź na stronę SwitchProxy. - Na chwilę włącz JavaScript i kliknij "Instaluj" ("Install Now"):

-Strona WWW SwitchProxy -

Pojawi się okno z prośbą o pozwolenie instalacji rozszerzenia. Kliknij - przycisk "Zainstaluj": -

-Ostrzeżenie przed instalacją rozszerzenia w Firefoksie -

Gdy instalator skończył pracę zamknij wszystkie okna Firefoksa i - ponownie go uruchom.

-Zakończenie instalacji rozszerzenia -
- -

Krok 2: Konfiguracja SwitchProxy

-
-

Po ponownym uruchomieniu Firefoksa zauważysz nowy pasek narzędzi, który - pozwala na kontrolę serwerów Proxy. Teraz ustawimy konfigurację Proxy dla - Tora. Kliknij "Dodaj" ("Add") na nowym pasku narzędzi Proxy:

-Nowy pasek narzędzi -

Zostaniesz zapytany o typ serwera proxy. Wybierz "Standardowy". - (Jest też typ "anonimowy", który używa istniejących anonimowych serwerów proxy. - Nie używaj tego typu, gdyż te inne "anonimowe" serwery proxy dają - o wiele gorsze zabezpieczenia niż Tor.) -

-Standardowe proxy -

Teraz zobaczysz standardowe okno konfiguracji serwerów proxy w Firefoksie. - Nadaj tej konfiguracji nazwę (etykietę) "tor". Potem wpisz "localhost" i - "8118" do czterech pierwszych protokołów, by skierować je na Privoxy, jak - pokazano. (Nawet mimo iż Privoxy nie obsługuje FTP i Gophera, i tak - powinieneś je ustawić.) Powinieneś też wypełnić pola serwera SOCKS tak, by - wskazywały bezpośrednio na Tora ("localhost", "9050" i socks5), by - pokryć inne protokoły niż te cztery. Po wszystkim kliknij "OK":

-Konfiguracja serwerów proxy -

Utworzyłeś etykietę "tor" dla serwera proxy, ale przeglądarka jeszcze jej nie używa. - Kliknij na listę rozwijaną i wybierz "tor", jak pokazano:

-Przełączanie się na Tora -

Prawie gotowe. Kliknij "Zastosuj", by zmiany odniosły skutek:

-Zastosuj -

Koniec. Firefox przeładuje bieżącą stronę. Na tym przykładowym zrzucie ekranu, - przeładował stronę i akurat - dostał niemiecki węzeł wyjściowy:

-Niemieckie google -
- -

Krok 3: Sprawdzenie, czy wszystko działa

-
-

Teraz Firefox korzysta z Privoxy jako serwera HTTP proxy, Privoxy używa - Tora jako serwer proxy SOCKS4a, a Tor wykonuje Twoje połączenia do internetu.

-

W powyższym przykładzie było jasne, że wszystko działa, gdyż strona WWW pokazała - się w innym języku. Jednak w innych przypadkach wolałbyś sprawdzić, że twoje - ustawienia działają. Wykonaj - krok 3 - w opisie instalacji Tora dla Windows lub - krok 3 - w opisie instalacji Tora dla OS X.

-

Powinieneś jednak zdawać sobie sprawę z haczyka dotyczącego anonimowości: - gdy przełączasz się z Tora na połączenie bezpośrednie (lub na odwrót), - bieżąca strona zostanie domyślnie przeładowana, korzystając z nowych - ustawień proxy. Dlatego przed przełączaniem się, upewnij się, że - jesteś na stronie nie zawierającej żadnych istotnych informacji. - (Możesz też zmienić to zachowanie w menu "Opcje | Preferencje" w SwitchProxy)

-
-

Jeśli masz pomysły na ulepszenie tej strony, prosimy je do nas wysłać. Dziękujemy!

-
-
-
-
-

- Webmaster - - Ostatnio zmodyfikowane: Sun Mar 2 17:31:17 2008 - - - Ostatnio wygenerowane: Sun Mar 2 17:35:59 2008 -

-

"Tor" i "Onion Logo" (logo cebuli) sÄ… znakami handlowymi The Tor Project, Inc. -

-

- Ta strona jest także dostÄ™pna w nastÄ™pujÄ…cych jÄ™zykach: - English, español, Italiano.
- Jak ustawić domyślny język dokumentu. -

-

- Deweloperzy Tora nie sprawdzili tłumaczenia tej strony pod względem dokładności - i poprawności. Tłumaczenie może być przestarzałe lub niepoprawne. Oficjalna strona Tora jest - po angielsku, pod adresem https://www.torproject.org/. -

-
- - diff -Nru tor-0.2.0.34/Doxyfile.in tor-0.2.2.16-alpha/Doxyfile.in --- tor-0.2.0.34/Doxyfile.in 2008-02-26 19:56:33.000000000 +0000 +++ tor-0.2.2.16-alpha/Doxyfile.in 2009-11-17 20:37:01.000000000 +0000 @@ -1,4 +1,3 @@ -# $Id: Doxyfile.in 11948 2007-10-15 19:05:20Z weasel $ # Doxyfile 1.5.1 # This file describes the settings to be used by the documentation system diff -Nru tor-0.2.0.34/LICENSE tor-0.2.2.16-alpha/LICENSE --- tor-0.2.0.34/LICENSE 2008-05-28 04:40:27.000000000 +0000 +++ tor-0.2.2.16-alpha/LICENSE 2010-05-25 04:57:59.000000000 +0000 @@ -8,13 +8,12 @@ If you got this file as a part of a larger bundle, there may be other license terms that you should be aware of. - =============================================================================== Tor is distributed under this license: Copyright (c) 2001-2004, Roger Dingledine Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson -Copyright (c) 2007-2008, The Tor Project, Inc. +Copyright (c) 2007-2010, The Tor Project, Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -73,13 +72,41 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. =============================================================================== +src/config/geoip is licensed under the following license: + +OPEN DATA LICENSE (GeoLite Country and GeoLite City databases) + +Copyright (c) 2008 MaxMind, Inc. All Rights Reserved. + +All advertising materials and documentation mentioning features or use of +this database must display the following acknowledgment: +"This product includes GeoLite data created by MaxMind, available from +http://maxmind.com/" + +Redistribution and use with or without modification, are permitted provided +that the following conditions are met: +1. Redistributions must retain the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or other +materials provided with the distribution. +2. All advertising materials and documentation mentioning features or use of +this database must display the following acknowledgement: +"This product includes GeoLite data created by MaxMind, available from +http://maxmind.com/" +3. "MaxMind" may not be used to endorse or promote products derived from this +database without specific prior written permission. + +THIS DATABASE IS PROVIDED BY MAXMIND, INC ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL MAXMIND BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +DATABASE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +=============================================================================== If you got Tor as a static binary with OpenSSL included, then you should know: "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/)" =============================================================================== -"This program uses the IP-to-Country Database provided by -WebHosting.Info (http://www.webhosting.info), available from -http://ip-to-country.webhosting.info." -See the src/config/geoip file in particular. -=============================================================================== - diff -Nru tor-0.2.0.34/Makefile.am tor-0.2.2.16-alpha/Makefile.am --- tor-0.2.0.34/Makefile.am 2008-06-04 21:22:46.000000000 +0000 +++ tor-0.2.2.16-alpha/Makefile.am 2010-08-11 03:14:15.000000000 +0000 @@ -1,7 +1,6 @@ -# $Id: Makefile.am 14953 2008-06-04 18:42:39Z nickm $ # Copyright (c) 2001-2004, Roger Dingledine # Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson -# Copyright (c) 2007-2008, The Tor Project, Inc. +# Copyright (c) 2007-2010, The Tor Project, Inc. # See LICENSE for licensing information AUTOMAKE_OPTIONS = foreign @@ -11,14 +10,14 @@ DIST_SUBDIRS = src doc contrib -EXTRA_DIST = INSTALL README AUTHORS LICENSE ChangeLog \ +EXTRA_DIST = INSTALL README LICENSE ChangeLog \ ReleaseNotes tor.spec tor.spec.in #install-data-local: # $(INSTALL) -m 755 -d $(LOCALSTATEDIR)/lib/tor # Assume a tarball is in .. for now. -dist-rpm: +dist-rpm: RPM_BUILD_DIR="/tmp/tor-rpm-build-$$$$"; \ rm -rf $$RPM_BUILD_DIR; \ mkdir $$RPM_BUILD_DIR || exit 1; \ @@ -26,15 +25,14 @@ mkdir $$RPM_BUILD_DIR/$$subdir; \ done; \ mkdir $$RPM_BUILD_DIR/SOURCES/tor-$(VERSION); \ - cp -R ./ $$RPM_BUILD_DIR/SOURCES/tor-$(VERSION)/; \ - pushd $$RPM_BUILD_DIR/SOURCES/; \ - tar zcf tor-$(VERSION).tar.gz ./; \ - popd; \ - rpmbuild -ba --define "_topdir $$RPM_BUILD_DIR" tor.spec; \ - mv $$RPM_BUILD_DIR/SRPMS/* .; \ - mv $$RPM_BUILD_DIR/RPMS/* .; \ - rm -rf $$RPM_BUILD_DIR - + cp -R ./ $$RPM_BUILD_DIR/SOURCES/tor-$(VERSION)/; \ + pushd $$RPM_BUILD_DIR/SOURCES/; \ + tar zcf tor-$(VERSION).tar.gz ./; \ + popd; \ + LIBS=-lrt rpmbuild -ba --define "_topdir $$RPM_BUILD_DIR" tor.spec; \ + mv $$RPM_BUILD_DIR/SRPMS/* .; \ + mv $$RPM_BUILD_DIR/RPMS/* .; \ + rm -rf $$RPM_BUILD_DIR dist-osx: @if [ "x$(prefix)" != 'x/Library/Tor' ]; then \ @@ -55,20 +53,22 @@ $(MAKE) all VERSION=$(VERSION) sh ./contrib/osx/package.sh +dist: check + doxygen: doxygen && cd doc/doxygen/latex && make -test: - ./src/or/test - -dist: check +test: all + ./src/test/test -# Avoid strlcpy.c, strlcat.c, tree.h +# Avoid strlcpy.c, strlcat.c, aes.c, OpenBSD_malloc_Linux.c, sha256.c, +# eventdns.[hc], tinytest*.[ch] check-spaces: ./contrib/checkSpace.pl -C \ src/common/*.h \ - src/common/[^asO]*.c \ - src/or/[^et]*.[ch] src/or/t*.c src/or/eventdns_tor.h + src/common/[^asO]*.c src/common/address.c \ + src/or/[^e]*.[ch] src/or/eventdns_tor.h \ + src/test/test*.[ch] src/tools/*.[ch] check-docs: ./contrib/checkOptionDocs.pl diff -Nru tor-0.2.0.34/Makefile.in tor-0.2.2.16-alpha/Makefile.in --- tor-0.2.0.34/Makefile.in 2009-02-09 03:31:03.000000000 +0000 +++ tor-0.2.2.16-alpha/Makefile.in 2010-09-17 06:08:41.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,10 +14,9 @@ @SET_MAKE@ -# $Id: Makefile.am 14953 2008-06-04 18:42:39Z nickm $ # Copyright (c) 2001-2004, Roger Dingledine # Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson -# Copyright (c) 2007-2008, The Tor Project, Inc. +# Copyright (c) 2007-2010, The Tor Project, Inc. # See LICENSE for licensing information VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ @@ -41,7 +40,7 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Doxyfile.in \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/orconfig.h.in $(srcdir)/tor.spec.in \ - $(top_srcdir)/configure AUTHORS ChangeLog INSTALL config.guess \ + $(top_srcdir)/configure ChangeLog INSTALL config.guess \ config.sub depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ @@ -77,8 +76,10 @@ GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -113,6 +114,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -121,7 +123,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -132,8 +136,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -187,7 +194,7 @@ AUTOMAKE_OPTIONS = foreign SUBDIRS = src doc contrib DIST_SUBDIRS = src doc contrib -EXTRA_DIST = INSTALL README AUTHORS LICENSE ChangeLog \ +EXTRA_DIST = INSTALL README LICENSE ChangeLog \ ReleaseNotes tor.spec tor.spec.in all: orconfig.h @@ -324,8 +331,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS @@ -350,8 +357,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ @@ -361,13 +368,12 @@ CTAGS: ctags-recursive $(HEADERS) $(SOURCES) orconfig.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) orconfig.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique @@ -438,6 +444,10 @@ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) @@ -464,6 +474,8 @@ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ @@ -614,7 +626,7 @@ .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ - dist-shar dist-tarZ dist-zip distcheck distclean \ + dist-lzma dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-hdr distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-data install-data-am \ @@ -632,7 +644,7 @@ # $(INSTALL) -m 755 -d $(LOCALSTATEDIR)/lib/tor # Assume a tarball is in .. for now. -dist-rpm: +dist-rpm: RPM_BUILD_DIR="/tmp/tor-rpm-build-$$$$"; \ rm -rf $$RPM_BUILD_DIR; \ mkdir $$RPM_BUILD_DIR || exit 1; \ @@ -640,14 +652,14 @@ mkdir $$RPM_BUILD_DIR/$$subdir; \ done; \ mkdir $$RPM_BUILD_DIR/SOURCES/tor-$(VERSION); \ - cp -R ./ $$RPM_BUILD_DIR/SOURCES/tor-$(VERSION)/; \ - pushd $$RPM_BUILD_DIR/SOURCES/; \ - tar zcf tor-$(VERSION).tar.gz ./; \ - popd; \ - rpmbuild -ba --define "_topdir $$RPM_BUILD_DIR" tor.spec; \ - mv $$RPM_BUILD_DIR/SRPMS/* .; \ - mv $$RPM_BUILD_DIR/RPMS/* .; \ - rm -rf $$RPM_BUILD_DIR + cp -R ./ $$RPM_BUILD_DIR/SOURCES/tor-$(VERSION)/; \ + pushd $$RPM_BUILD_DIR/SOURCES/; \ + tar zcf tor-$(VERSION).tar.gz ./; \ + popd; \ + LIBS=-lrt rpmbuild -ba --define "_topdir $$RPM_BUILD_DIR" tor.spec; \ + mv $$RPM_BUILD_DIR/SRPMS/* .; \ + mv $$RPM_BUILD_DIR/RPMS/* .; \ + rm -rf $$RPM_BUILD_DIR dist-osx: @if [ "x$(prefix)" != 'x/Library/Tor' ]; then \ @@ -668,20 +680,22 @@ $(MAKE) all VERSION=$(VERSION) sh ./contrib/osx/package.sh +dist: check + doxygen: doxygen && cd doc/doxygen/latex && make -test: - ./src/or/test - -dist: check +test: all + ./src/test/test -# Avoid strlcpy.c, strlcat.c, tree.h +# Avoid strlcpy.c, strlcat.c, aes.c, OpenBSD_malloc_Linux.c, sha256.c, +# eventdns.[hc], tinytest*.[ch] check-spaces: ./contrib/checkSpace.pl -C \ src/common/*.h \ - src/common/[^asO]*.c \ - src/or/[^et]*.[ch] src/or/t*.c src/or/eventdns_tor.h + src/common/[^asO]*.c src/common/address.c \ + src/or/[^e]*.[ch] src/or/eventdns_tor.h \ + src/test/test*.[ch] src/tools/*.[ch] check-docs: ./contrib/checkOptionDocs.pl diff -Nru tor-0.2.0.34/orconfig.h.in tor-0.2.2.16-alpha/orconfig.h.in --- tor-0.2.0.34/orconfig.h.in 2009-02-09 03:31:43.000000000 +0000 +++ tor-0.2.2.16-alpha/orconfig.h.in 2010-09-17 06:09:17.000000000 +0000 @@ -9,8 +9,8 @@ /* Defined if we try to use freelists for buffer RAM chunks */ #undef ENABLE_BUF_FREELISTS -/* Defined if we try to use the pool allocator for queued cells */ -#undef ENABLE_CELL_POOL +/* Defined if we default to host local appdata paths on Windows */ +#undef ENABLE_LOCAL_APPDATA /* Defined if we will try to use multithreading */ #undef ENABLE_THREADS @@ -21,6 +21,10 @@ /* Define to 1 if you have the header file. */ #undef HAVE_ASSERT_H +/* Define to 1 if you have the declaration of `mlockall', and to 0 if you + don't. */ +#undef HAVE_DECL_MLOCKALL + /* Define to 1 if you have the header file. */ #undef HAVE_DMALLOC_H @@ -33,23 +37,35 @@ /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H +/* Define to 1 if you have the `evdns_set_outgoing_bind_address' function. */ +#undef HAVE_EVDNS_SET_OUTGOING_BIND_ADDRESS + +/* Define to 1 if you have the header file. */ +#undef HAVE_EVENT2_DNS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_EVENT2_EVENT_H + +/* Define to 1 if you have the `event_base_loopexit' function. */ +#undef HAVE_EVENT_BASE_LOOPEXIT + /* Define to 1 if you have the `event_get_method' function. */ #undef HAVE_EVENT_GET_METHOD /* Define to 1 if you have the `event_get_version' function. */ #undef HAVE_EVENT_GET_VERSION +/* Define to 1 if you have the `event_get_version_number' function. */ +#undef HAVE_EVENT_GET_VERSION_NUMBER + /* Define to 1 if you have the `event_set_log_callback' function. */ #undef HAVE_EVENT_SET_LOG_CALLBACK /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H -/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ -#undef HAVE_FSEEKO - -/* Define to 1 if you have the `ftello' function. */ -#undef HAVE_FTELLO +/* Define to 1 if you have the `flock' function. */ +#undef HAVE_FLOCK /* Define to 1 if you have the `ftime' function. */ #undef HAVE_FTIME @@ -90,12 +106,6 @@ /* Define to 1 if you have the `inet_aton' function. */ #undef HAVE_INET_ATON -/* Define to 1 if you have the `inet_ntop' function. */ -#undef HAVE_INET_NTOP - -/* Define to 1 if you have the `inet_pton' function. */ -#undef HAVE_INET_PTON - /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H @@ -138,6 +148,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_MALLOC_H +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_NP_H + /* Define to 1 if you have the `malloc_usable_size' function. */ #undef HAVE_MALLOC_USABLE_SIZE @@ -147,6 +160,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H +/* Define to 1 if you have the `mlockall' function. */ +#undef HAVE_MLOCKALL + /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H @@ -162,6 +178,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_NET_PFVAR_H +/* Define to 1 if you have the `prctl' function. */ +#undef HAVE_PRCTL + /* Define to 1 if you have the `pthread_create' function. */ #undef HAVE_PTHREAD_CREATE @@ -171,6 +190,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H +/* Define to 1 if you have the `readv' function. */ +#undef HAVE_READV + /* Define to 1 if the system has the type `rlim_t'. */ #undef HAVE_RLIM_T @@ -213,6 +235,9 @@ /* Define to 1 if you have the `strtoull' function. */ #undef HAVE_STRTOULL +/* Define to 1 if `min_heap_idx' is member of `struct event'. */ +#undef HAVE_STRUCT_EVENT_MIN_HEAP_IDX + /* Define to 1 if the system has the type `struct in6_addr'. */ #undef HAVE_STRUCT_IN6_ADDR @@ -225,8 +250,11 @@ /* Define to 1 if the system has the type `struct sockaddr_in6'. */ #undef HAVE_STRUCT_SOCKADDR_IN6 -/* Define to 1 if the system has the type `struct sockaddr_storage'. */ -#undef HAVE_STRUCT_SOCKADDR_STORAGE +/* Define to 1 if `sin6_len' is member of `struct sockaddr_in6'. */ +#undef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN + +/* Define to 1 if `sin_len' is member of `struct sockaddr_in'. */ +#undef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN /* Define to 1 if `tv_sec' is member of `struct timeval'. */ #undef HAVE_STRUCT_TIMEVAL_TV_SEC @@ -237,6 +265,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FCNTL_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_FILE_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H @@ -249,6 +280,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PRCTL_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_RESOURCE_H @@ -267,6 +301,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UIO_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UN_H @@ -294,6 +331,16 @@ /* Define to 1 if the system has the type `u_char'. */ #undef HAVE_U_CHAR +/* Define to 1 if you have the `vasprintf' function. */ +#undef HAVE_VASPRINTF + +/* Define to 1 if you have the `writev' function. */ +#undef HAVE_WRITEV + +/* Defined if we want to keep track of how much of each kind of resource we + download. */ +#undef INSTRUMENT_DOWNLOADS + /* name of the syslog facility */ #undef LOGFACILITY @@ -415,9 +462,6 @@ /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS -/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ -#undef _LARGEFILE_SOURCE - /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES diff -Nru tor-0.2.0.34/README tor-0.2.2.16-alpha/README --- tor-0.2.0.34/README 2008-02-26 19:56:33.000000000 +0000 +++ tor-0.2.2.16-alpha/README 2010-02-22 05:42:12.000000000 +0000 @@ -1,10 +1,10 @@ Tor protects your privacy on the internet by hiding the connection -between your Internet address and the services you use. We believe -Tor is reasonably secure, but please ensure you read the -instructions and configure it properly. +between your Internet address and the services you use. We believe Tor +is reasonably secure, but please ensure you read the instructions and +configure it properly. To build Tor from source: - ./configure; make; make install + ./configure && make && make install Home page: https://www.torproject.org/ @@ -16,7 +16,9 @@ https://www.torproject.org/documentation.html Making applications work with Tor: - http://wiki.noreply.org/noreply/TheOnionRouter/TorifyHOWTO + https://wiki.torproject.org/noreply/TheOnionRouter/TorifyHOWTO Frequently Asked Questions: - http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ + https://www.torproject.org/faq.html + https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ + diff -Nru tor-0.2.0.34/ReleaseNotes tor-0.2.2.16-alpha/ReleaseNotes --- tor-0.2.0.34/ReleaseNotes 2009-02-02 10:54:42.000000000 +0000 +++ tor-0.2.2.16-alpha/ReleaseNotes 2010-05-25 04:57:59.000000000 +0000 @@ -3,6 +3,896 @@ of Tor. If you want to see more detailed descriptions of the changes in each development snapshot, see the ChangeLog file. +Changes in version 0.2.1.26 - 2010-05-02 + Tor 0.2.1.26 addresses the recent connection and memory overload + problems we've been seeing on relays, especially relays with their + DirPort open. If your relay has been crashing, or you turned it off + because it used too many resources, give this release a try. + + This release also fixes yet another instance of broken OpenSSL libraries + that was causing some relays to drop out of the consensus. + + o Major bugfixes: + - Teach relays to defend themselves from connection overload. Relays + now close idle circuits early if it looks like they were intended + for directory fetches. Relays are also more aggressive about closing + TLS connections that have no circuits on them. Such circuits are + unlikely to be re-used, and tens of thousands of them were piling + up at the fast relays, causing the relays to run out of sockets + and memory. Bugfix on 0.2.0.22-rc (where clients started tunneling + their directory fetches over TLS). + - Fix SSL renegotiation behavior on OpenSSL versions like on Centos + that claim to be earlier than 0.9.8m, but which have in reality + backported huge swaths of 0.9.8m or 0.9.8n renegotiation + behavior. Possible fix for some cases of bug 1346. + - Directory mirrors were fetching relay descriptors only from v2 + directory authorities, rather than v3 authorities like they should. + Only 2 v2 authorities remain (compared to 7 v3 authorities), leading + to a serious bottleneck. Bugfix on 0.2.0.9-alpha. Fixes bug 1324. + + o Minor bugfixes: + - Finally get rid of the deprecated and now harmful notion of "clique + mode", where directory authorities maintain TLS connections to + every other relay. + + o Testsuite fixes: + - In the util/threads test, no longer free the test_mutex before all + worker threads have finished. Bugfix on 0.2.1.6-alpha. + - The master thread could starve the worker threads quite badly on + certain systems, causing them to run only partially in the allowed + window. This resulted in test failures. Now the master thread sleeps + occasionally for a few microseconds while the two worker-threads + compete for the mutex. Bugfix on 0.2.0.1-alpha. + + +Changes in version 0.2.1.25 - 2010-03-16 + Tor 0.2.1.25 fixes a regression introduced in 0.2.1.23 that could + prevent relays from guessing their IP address correctly. It also fixes + several minor potential security bugs. + + o Major bugfixes: + - Fix a regression from our patch for bug 1244 that caused relays + to guess their IP address incorrectly if they didn't set Address + in their torrc and/or their address fails to resolve. Bugfix on + 0.2.1.23; fixes bug 1269. + - When freeing a session key, zero it out completely. We only zeroed + the first ptrsize bytes. Bugfix on 0.0.2pre8. Discovered and + patched by ekir. Fixes bug 1254. + + o Minor bugfixes: + - Fix a dereference-then-NULL-check sequence when publishing + descriptors. Bugfix on 0.2.1.5-alpha. Discovered by ekir; fixes + bug 1255. + - Fix another dereference-then-NULL-check sequence. Bugfix on + 0.2.1.14-rc. Discovered by ekir; fixes bug 1256. + - Make sure we treat potentially not NUL-terminated strings correctly. + Bugfix on 0.1.1.13-alpha. Discovered by rieo; fixes bug 1257. + + +Changes in version 0.2.1.24 - 2010-02-21 + Tor 0.2.1.24 makes Tor work again on the latest OS X -- this time + for sure! + + o Minor bugfixes: + - Work correctly out-of-the-box with even more vendor-patched versions + of OpenSSL. In particular, make it so Debian and OS X don't need + customized patches to run/build. + + +Changes in version 0.2.1.23 - 2010-02-13 + Tor 0.2.1.23 fixes a huge client-side performance bug, makes Tor work + again on the latest OS X, and updates the location of a directory + authority. + + o Major bugfixes (performance): + - We were selecting our guards uniformly at random, and then weighting + which of our guards we'd use uniformly at random. This imbalance + meant that Tor clients were severely limited on throughput (and + probably latency too) by the first hop in their circuit. Now we + select guards weighted by currently advertised bandwidth. We also + automatically discard guards picked using the old algorithm. Fixes + bug 1217; bugfix on 0.2.1.3-alpha. Found by Mike Perry. + + o Major bugfixes: + - Make Tor work again on the latest OS X: when deciding whether to + use strange flags to turn TLS renegotiation on, detect the OpenSSL + version at run-time, not compile time. We need to do this because + Apple doesn't update its dev-tools headers when it updates its + libraries in a security patch. + - Fix a potential buffer overflow in lookup_last_hid_serv_request() + that could happen on 32-bit platforms with 64-bit time_t. Also fix + a memory leak when requesting a hidden service descriptor we've + requested before. Fixes bug 1242, bugfix on 0.2.0.18-alpha. Found + by aakova. + + o Minor bugfixes: + - Refactor resolve_my_address() to not use gethostbyname() anymore. + Fixes bug 1244; bugfix on 0.0.2pre25. Reported by Mike Mestnik. + + o Minor features: + - Avoid a mad rush at the beginning of each month when each client + rotates half of its guards. Instead we spread the rotation out + throughout the month, but we still avoid leaving a precise timestamp + in the state file about when we first picked the guard. Improves + over the behavior introduced in 0.1.2.17. + + +Changes in version 0.2.1.22 - 2010-01-19 + Tor 0.2.1.22 fixes a critical privacy problem in bridge directory + authorities -- it would tell you its whole history of bridge descriptors + if you make the right directory request. This stable update also + rotates two of the seven v3 directory authority keys and locations. + + o Directory authority changes: + - Rotate keys (both v3 identity and relay identity) for moria1 + and gabelmoo. + + o Major bugfixes: + - Stop bridge directory authorities from answering dbg-stability.txt + directory queries, which would let people fetch a list of all + bridge identities they track. Bugfix on 0.2.1.6-alpha. + + +Changes in version 0.2.1.21 - 2009-12-21 + Tor 0.2.1.21 fixes an incompatibility with the most recent OpenSSL + library. If you use Tor on Linux / Unix and you're getting SSL + renegotiation errors, upgrading should help. We also recommend an + upgrade if you're an exit relay. + + o Major bugfixes: + - Work around a security feature in OpenSSL 0.9.8l that prevents our + handshake from working unless we explicitly tell OpenSSL that we + are using SSL renegotiation safely. We are, of course, but OpenSSL + 0.9.8l won't work unless we say we are. + - Avoid crashing if the client is trying to upload many bytes and the + circuit gets torn down at the same time, or if the flip side + happens on the exit relay. Bugfix on 0.2.0.1-alpha; fixes bug 1150. + + o Minor bugfixes: + - Do not refuse to learn about authority certs and v2 networkstatus + documents that are older than the latest consensus. This bug might + have degraded client bootstrapping. Bugfix on 0.2.0.10-alpha. + Spotted and fixed by xmux. + - Fix a couple of very-hard-to-trigger memory leaks, and one hard-to- + trigger platform-specific option misparsing case found by Coverity + Scan. + - Fix a compilation warning on Fedora 12 by removing an impossible-to- + trigger assert. Fixes bug 1173. + + +Changes in version 0.2.1.20 - 2009-10-15 + Tor 0.2.1.20 fixes a crash bug when you're accessing many hidden + services at once, prepares for more performance improvements, and + fixes a bunch of smaller bugs. + + The Windows and OS X bundles also include a more recent Vidalia, + and switch from Privoxy to Polipo. + + The OS X installers are now drag and drop. It's best to un-install + Tor/Vidalia and then install this new bundle, rather than upgrade. If + you want to upgrade, you'll need to update the paths for Tor and Polipo + in the Vidalia Settings window. + + o Major bugfixes: + - Send circuit or stream sendme cells when our window has decreased + by 100 cells, not when it has decreased by 101 cells. Bug uncovered + by Karsten when testing the "reduce circuit window" performance + patch. Bugfix on the 54th commit on Tor -- from July 2002, + before the release of Tor 0.0.0. This is the new winner of the + oldest-bug prize. + - Fix a remotely triggerable memory leak when a consensus document + contains more than one signature from the same voter. Bugfix on + 0.2.0.3-alpha. + - Avoid segfault in rare cases when finishing an introduction circuit + as a client and finding out that we don't have an introduction key + for it. Fixes bug 1073. Reported by Aaron Swartz. + + o Major features: + - Tor now reads the "circwindow" parameter out of the consensus, + and uses that value for its circuit package window rather than the + default of 1000 cells. Begins the implementation of proposal 168. + + o New directory authorities: + - Set up urras (run by Jacob Appelbaum) as the seventh v3 directory + authority. + - Move moria1 and tonga to alternate IP addresses. + + o Minor bugfixes: + - Fix a signed/unsigned compile warning in 0.2.1.19. + - Fix possible segmentation fault on directory authorities. Bugfix on + 0.2.1.14-rc. + - Fix an extremely rare infinite recursion bug that could occur if + we tried to log a message after shutting down the log subsystem. + Found by Matt Edman. Bugfix on 0.2.0.16-alpha. + - Fix an obscure bug where hidden services on 64-bit big-endian + systems might mis-read the timestamp in v3 introduce cells, and + refuse to connect back to the client. Discovered by "rotor". + Bugfix on 0.2.1.6-alpha. + - We were triggering a CLOCK_SKEW controller status event whenever + we connect via the v2 connection protocol to any relay that has + a wrong clock. Instead, we should only inform the controller when + it's a trusted authority that claims our clock is wrong. Bugfix + on 0.2.0.20-rc; starts to fix bug 1074. Reported by SwissTorExit. + - We were telling the controller about CHECKING_REACHABILITY and + REACHABILITY_FAILED status events whenever we launch a testing + circuit or notice that one has failed. Instead, only tell the + controller when we want to inform the user of overall success or + overall failure. Bugfix on 0.1.2.6-alpha. Fixes bug 1075. Reported + by SwissTorExit. + - Don't warn when we're using a circuit that ends with a node + excluded in ExcludeExitNodes, but the circuit is not used to access + the outside world. This should help fix bug 1090. Bugfix on + 0.2.1.6-alpha. + - Work around a small memory leak in some versions of OpenSSL that + stopped the memory used by the hostname TLS extension from being + freed. + + o Minor features: + - Add a "getinfo status/accepted-server-descriptor" controller + command, which is the recommended way for controllers to learn + whether our server descriptor has been successfully received by at + least on directory authority. Un-recommend good-server-descriptor + getinfo and status events until we have a better design for them. + + +Changes in version 0.2.1.19 - 2009-07-28 + Tor 0.2.1.19 fixes a major bug with accessing and providing hidden + services. + + o Major bugfixes: + - Make accessing hidden services on 0.2.1.x work right again. + Bugfix on 0.2.1.3-alpha; workaround for bug 1038. Diagnosis and + part of patch provided by "optimist". + + o Minor features: + - When a relay/bridge is writing out its identity key fingerprint to + the "fingerprint" file and to its logs, write it without spaces. Now + it will look like the fingerprints in our bridges documentation, + and confuse fewer users. + + o Minor bugfixes: + - Relays no longer publish a new server descriptor if they change + their MaxAdvertisedBandwidth config option but it doesn't end up + changing their advertised bandwidth numbers. Bugfix on 0.2.0.28-rc; + fixes bug 1026. Patch from Sebastian. + - Avoid leaking memory every time we get a create cell but we have + so many already queued that we refuse it. Bugfix on 0.2.0.19-alpha; + fixes bug 1034. Reported by BarkerJr. + + +Changes in version 0.2.1.18 - 2009-07-24 + Tor 0.2.1.18 lays the foundations for performance improvements, + adds status events to help users diagnose bootstrap problems, adds + optional authentication/authorization for hidden services, fixes a + variety of potential anonymity problems, and includes a huge pile of + other features and bug fixes. + + o Major features (clients): + - Start sending "bootstrap phase" status events to the controller, + so it can keep the user informed of progress fetching directory + information and establishing circuits. Also inform the controller + if we think we're stuck at a particular bootstrap phase. Implements + proposal 137. + - Clients replace entry guards that were chosen more than a few months + ago. This change should significantly improve client performance, + especially once more people upgrade, since relays that have been + a guard for a long time are currently overloaded. + - Network status consensus documents and votes now contain bandwidth + information for each relay. Clients use the bandwidth values + in the consensus, rather than the bandwidth values in each + relay descriptor. This approach opens the door to more accurate + bandwidth estimates once the directory authorities start doing + active measurements. Implements part of proposal 141. + + o Major features (relays): + - Disable and refactor some debugging checks that forced a linear scan + over the whole server-side DNS cache. These accounted for over 50% + of CPU time on a relatively busy exit node's gprof profile. Also, + disable some debugging checks that appeared in exit node profile + data. Found by Jacob. + - New DirPortFrontPage option that takes an html file and publishes + it as "/" on the DirPort. Now relay operators can provide a + disclaimer without needing to set up a separate webserver. There's + a sample disclaimer in contrib/tor-exit-notice.html. + + o Major features (hidden services): + - Make it possible to build hidden services that only certain clients + are allowed to connect to. This is enforced at several points, + so that unauthorized clients are unable to send INTRODUCE cells + to the service, or even (depending on the type of authentication) + to learn introduction points. This feature raises the bar for + certain kinds of active attacks against hidden services. Design + and code by Karsten Loesing. Implements proposal 121. + - Relays now store and serve v2 hidden service descriptors by default, + i.e., the new default value for HidServDirectoryV2 is 1. This is + the last step in proposal 114, which aims to make hidden service + lookups more reliable. + + o Major features (path selection): + - ExitNodes and Exclude*Nodes config options now allow you to restrict + by country code ("{US}") or IP address or address pattern + ("255.128.0.0/16"). Patch from Robert Hogan. It still needs some + refinement to decide what config options should take priority if + you ask to both use a particular node and exclude it. + + o Major features (misc): + - When building a consensus, do not include routers that are down. + This cuts down 30% to 40% on consensus size. Implements proposal + 138. + - New TestingTorNetwork config option to allow adjustment of + previously constant values that could slow bootstrapping. Implements + proposal 135. Patch from Karsten. + - Convert many internal address representations to optionally hold + IPv6 addresses. Generate and accept IPv6 addresses in many protocol + elements. Make resolver code handle nameservers located at IPv6 + addresses. + - More work on making our TLS handshake blend in: modify the list + of ciphers advertised by OpenSSL in client mode to even more + closely resemble a common web browser. We cheat a little so that + we can advertise ciphers that the locally installed OpenSSL doesn't + know about. + - Use the TLS1 hostname extension to more closely resemble browser + behavior. + + o Security fixes (anonymity/entropy): + - Never use a connection with a mismatched address to extend a + circuit, unless that connection is canonical. A canonical + connection is one whose address is authenticated by the router's + identity key, either in a NETINFO cell or in a router descriptor. + - Implement most of proposal 110: The first K cells to be sent + along a circuit are marked as special "early" cells; only K "early" + cells will be allowed. Once this code is universal, we can block + certain kinds of denial-of-service attack by requiring that EXTEND + commands must be sent using an "early" cell. + - Resume using OpenSSL's RAND_poll() for better (and more portable) + cross-platform entropy collection again. We used to use it, then + stopped using it because of a bug that could crash systems that + called RAND_poll when they had a lot of fds open. It looks like the + bug got fixed in late 2006. Our new behavior is to call RAND_poll() + at startup, and to call RAND_poll() when we reseed later only if + we have a non-buggy OpenSSL version. + - When the client is choosing entry guards, now it selects at most + one guard from a given relay family. Otherwise we could end up with + all of our entry points into the network run by the same operator. + Suggested by Camilo Viecco. Fix on 0.1.1.11-alpha. + - Do not use or believe expired v3 authority certificates. Patch + from Karsten. Bugfix in 0.2.0.x. Fixes bug 851. + - Drop begin cells to a hidden service if they come from the middle + of a circuit. Patch from lark. + - When we erroneously receive two EXTEND cells for the same circuit + ID on the same connection, drop the second. Patch from lark. + - Authorities now vote for the Stable flag for any router whose + weighted MTBF is at least 5 days, regardless of the mean MTBF. + - Clients now never report any stream end reason except 'MISC'. + Implements proposal 148. + + o Major bugfixes (crashes): + - Parse dates and IPv4 addresses in a locale- and libc-independent + manner, to avoid platform-dependent behavior on malformed input. + - Fix a crash that occurs on exit nodes when a nameserver request + timed out. Bugfix on 0.1.2.1-alpha; our CLEAR debugging code had + been suppressing the bug since 0.1.2.10-alpha. Partial fix for + bug 929. + - Do not assume that a stack-allocated character array will be + 64-bit aligned on platforms that demand that uint64_t access is + aligned. Possible fix for bug 604. + - Resolve a very rare crash bug that could occur when the user forced + a nameserver reconfiguration during the middle of a nameserver + probe. Fixes bug 526. Bugfix on 0.1.2.1-alpha. + - Avoid a "0 divided by 0" calculation when calculating router uptime + at directory authorities. Bugfix on 0.2.0.8-alpha. + - Fix an assertion bug in parsing policy-related options; possible fix + for bug 811. + - Rate-limit too-many-sockets messages: when they happen, they happen + a lot and end up filling up the disk. Resolves bug 748. + - Fix a race condition that could cause crashes or memory corruption + when running as a server with a controller listening for log + messages. + - Avoid crashing when we have a policy specified in a DirPolicy or + SocksPolicy or ReachableAddresses option with ports set on it, + and we re-load the policy. May fix bug 996. + - Fix an assertion failure on 64-bit platforms when we allocated + memory right up to the end of a memarea, then realigned the memory + one step beyond the end. Fixes a possible cause of bug 930. + - Protect the count of open sockets with a mutex, so we can't + corrupt it when two threads are closing or opening sockets at once. + Fix for bug 939. Bugfix on 0.2.0.1-alpha. + + o Major bugfixes (clients): + - Discard router descriptors as we load them if they are more than + five days old. Otherwise if Tor is off for a long time and then + starts with cached descriptors, it will try to use the onion keys + in those obsolete descriptors when building circuits. Fixes bug 887. + - When we choose to abandon a new entry guard because we think our + older ones might be better, close any circuits pending on that + new entry guard connection. This fix should make us recover much + faster when our network is down and then comes back. Bugfix on + 0.1.2.8-beta; found by lodger. + - When Tor clients restart after 1-5 days, they discard all their + cached descriptors as too old, but they still use the cached + consensus document. This approach is good for robustness, but + bad for performance: since they don't know any bandwidths, they + end up choosing at random rather than weighting their choice by + speed. Fixed by the above feature of putting bandwidths in the + consensus. + + o Major bugfixes (relays): + - Relays were falling out of the networkstatus consensus for + part of a day if they changed their local config but the + authorities discarded their new descriptor as "not sufficiently + different". Now directory authorities accept a descriptor as changed + if BandwidthRate or BandwidthBurst changed. Partial fix for bug 962; + patch by Sebastian. + - Ensure that two circuits can never exist on the same connection + with the same circuit ID, even if one is marked for close. This + is conceivably a bugfix for bug 779; fixes a bug on 0.1.0.4-rc. + - Directory authorities were neglecting to mark relays down in their + internal histories if the relays fall off the routerlist without + ever being found unreachable. So there were relays in the histories + that haven't been seen for eight months, and are listed as being + up for eight months. This wreaked havoc on the "median wfu" and + "median mtbf" calculations, in turn making Guard and Stable flags + wrong, hurting network performance. Fixes bugs 696 and 969. Bugfix + on 0.2.0.6-alpha. + + o Major bugfixes (hidden services): + - When establishing a hidden service, introduction points that + originate from cannibalized circuits were completely ignored + and not included in rendezvous service descriptors. This might + have been another reason for delay in making a hidden service + available. Bugfix from long ago (0.0.9.x?) + + o Major bugfixes (memory and resource management): + - Fixed some memory leaks -- some quite frequent, some almost + impossible to trigger -- based on results from Coverity. + - Speed up parsing and cut down on memory fragmentation by using + stack-style allocations for parsing directory objects. Previously, + this accounted for over 40% of allocations from within Tor's code + on a typical directory cache. + - Use a Bloom filter rather than a digest-based set to track which + descriptors we need to keep around when we're cleaning out old + router descriptors. This speeds up the computation significantly, + and may reduce fragmentation. + + o New/changed config options: + - Now NodeFamily and MyFamily config options allow spaces in + identity fingerprints, so it's easier to paste them in. + Suggested by Lucky Green. + - Allow ports 465 and 587 in the default exit policy again. We had + rejected them in 0.1.0.15, because back in 2005 they were commonly + misconfigured and ended up as spam targets. We hear they are better + locked down these days. + - Make TrackHostExit mappings expire a while after their last use, not + after their creation. Patch from Robert Hogan. + - Add an ExcludeExitNodes option so users can list a set of nodes + that should be be excluded from the exit node position, but + allowed elsewhere. Implements proposal 151. + - New --hush command-line option similar to --quiet. While --quiet + disables all logging to the console on startup, --hush limits the + output to messages of warning and error severity. + - New configure/torrc options (--enable-geoip-stats, + DirRecordUsageByCountry) to record how many IPs we've served + directory info to in each country code, how many status documents + total we've sent to each country code, and what share of the total + directory requests we should expect to see. + - Make outbound DNS packets respect the OutboundBindAddress setting. + Fixes the bug part of bug 798. Bugfix on 0.1.2.2-alpha. + - Allow separate log levels to be configured for different logging + domains. For example, this allows one to log all notices, warnings, + or errors, plus all memory management messages of level debug or + higher, with: Log [MM] debug-err [*] notice-err file /var/log/tor. + - Update to the "June 3 2009" ip-to-country file. + + o Minor features (relays): + - Raise the minimum rate limiting to be a relay from 20000 bytes + to 20480 bytes (aka 20KB/s), to match our documentation. Also + update directory authorities so they always assign the Fast flag + to relays with 20KB/s of capacity. Now people running relays won't + suddenly find themselves not seeing any use, if the network gets + faster on average. + - If we're a relay and we change our IP address, be more verbose + about the reason that made us change. Should help track down + further bugs for relays on dynamic IP addresses. + - Exit servers can now answer resolve requests for ip6.arpa addresses. + - Implement most of Proposal 152: allow specialized servers to permit + single-hop circuits, and clients to use those servers to build + single-hop circuits when using a specialized controller. Patch + from Josh Albrecht. Resolves feature request 768. + - When relays do their initial bandwidth measurement, don't limit + to just our entry guards for the test circuits. Otherwise we tend + to have multiple test circuits going through a single entry guard, + which makes our bandwidth test less accurate. Fixes part of bug 654; + patch contributed by Josh Albrecht. + + o Minor features (directory authorities): + - Try not to open more than one descriptor-downloading connection + to an authority at once. This should reduce load on directory + authorities. Fixes bug 366. + - Add cross-certification to newly generated certificates, so that + a signing key is enough information to look up a certificate. Start + serving certificates by + pairs. Implements proposal 157. + - When a directory authority downloads a descriptor that it then + immediately rejects, do not retry downloading it right away. Should + save some bandwidth on authorities. Fix for bug 888. Patch by + Sebastian Hahn. + - Directory authorities now serve a /tor/dbg-stability.txt URL to + help debug WFU and MTBF calculations. + - In directory authorities' approved-routers files, allow + fingerprints with or without space. + + o Minor features (directory mirrors): + - When a download gets us zero good descriptors, do not notify + Tor that new directory information has arrived. + - Servers support a new URL scheme for consensus downloads that + allows the client to specify which authorities are trusted. + The server then only sends the consensus if the client will trust + it. Otherwise a 404 error is sent back. Clients use this + new scheme when the server supports it (meaning it's running + 0.2.1.1-alpha or later). Implements proposal 134. + + o Minor features (bridges): + - If the bridge config line doesn't specify a port, assume 443. + This makes bridge lines a bit smaller and easier for users to + understand. + - If we're using bridges and our network goes away, be more willing + to forgive our bridges and try again when we get an application + request. + + o Minor features (hidden services): + - When the client launches an introduction circuit, retry with a + new circuit after 30 seconds rather than 60 seconds. + - Launch a second client-side introduction circuit in parallel + after a delay of 15 seconds (based on work by Christian Wilms). + - Hidden services start out building five intro circuits rather + than three, and when the first three finish they publish a service + descriptor using those. Now we publish our service descriptor much + faster after restart. + - Drop the requirement to have an open dir port for storing and + serving v2 hidden service descriptors. + + o Minor features (build and packaging): + - On Linux, use the prctl call to re-enable core dumps when the User + option is set. + - Try to make sure that the version of Libevent we're running with + is binary-compatible with the one we built with. May address bug + 897 and others. + - Add a new --enable-local-appdata configuration switch to change + the default location of the datadir on win32 from APPDATA to + LOCAL_APPDATA. In the future, we should migrate to LOCAL_APPDATA + entirely. Patch from coderman. + - Build correctly against versions of OpenSSL 0.9.8 or later that + are built without support for deprecated functions. + - On platforms with a maximum syslog string length, truncate syslog + messages to that length ourselves, rather than relying on the + system to do it for us. + - Automatically detect MacOSX versions earlier than 10.4.0, and + disable kqueue from inside Tor when running with these versions. + We previously did this from the startup script, but that was no + help to people who didn't use the startup script. Resolves bug 863. + - Build correctly when configured to build outside the main source + path. Patch from Michael Gold. + - Disable GCC's strict alias optimization by default, to avoid the + likelihood of its introducing subtle bugs whenever our code violates + the letter of C99's alias rules. + - Change the contrib/tor.logrotate script so it makes the new + logs as "_tor:_tor" rather than the default, which is generally + "root:wheel". Fixes bug 676, reported by Serge Koksharov. + - Change our header file guard macros to be less likely to conflict + with system headers. Adam Langley noticed that we were conflicting + with log.h on Android. + - Add a couple of extra warnings to --enable-gcc-warnings for GCC 4.3, + and stop using a warning that had become unfixably verbose under + GCC 4.3. + - Use a lockfile to make sure that two Tor processes are not + simultaneously running with the same datadir. + - Allow OpenSSL to use dynamic locks if it wants. + - Add LIBS=-lrt to Makefile.am so the Tor RPMs use a static libevent. + + o Minor features (controllers): + - When generating circuit events with verbose nicknames for + controllers, try harder to look up nicknames for routers on a + circuit. (Previously, we would look in the router descriptors we had + for nicknames, but not in the consensus.) Partial fix for bug 941. + - New controller event NEWCONSENSUS that lists the networkstatus + lines for every recommended relay. Now controllers like Torflow + can keep up-to-date on which relays they should be using. + - New controller event "clients_seen" to report a geoip-based summary + of which countries we've seen clients from recently. Now controllers + like Vidalia can show bridge operators that they're actually making + a difference. + - Add a 'getinfo status/clients-seen' controller command, in case + controllers want to hear clients_seen events but connect late. + - New CONSENSUS_ARRIVED event to note when a new consensus has + been fetched and validated. + - Add an internal-use-only __ReloadTorrcOnSIGHUP option for + controllers to prevent SIGHUP from reloading the configuration. + Fixes bug 856. + - Return circuit purposes in response to GETINFO circuit-status. + Fixes bug 858. + - Serve the latest v3 networkstatus consensus via the control + port. Use "getinfo dir/status-vote/current/consensus" to fetch it. + - Add a "GETINFO /status/bootstrap-phase" controller option, so the + controller can query our current bootstrap state in case it attaches + partway through and wants to catch up. + - Provide circuit purposes along with circuit events to the controller. + + o Minor features (tools): + - Do not have tor-resolve automatically refuse all .onion addresses; + if AutomapHostsOnResolve is set in your torrc, this will work fine. + - Add a -p option to tor-resolve for specifying the SOCKS port: some + people find host:port too confusing. + - Print the SOCKS5 error message string as well as the error code + when a tor-resolve request fails. Patch from Jacob. + + o Minor bugfixes (memory and resource management): + - Clients no longer cache certificates for authorities they do not + recognize. Bugfix on 0.2.0.9-alpha. + - Do not use C's stdio library for writing to log files. This will + improve logging performance by a minute amount, and will stop + leaking fds when our disk is full. Fixes bug 861. + - Stop erroneous use of O_APPEND in cases where we did not in fact + want to re-seek to the end of a file before every last write(). + - Fix a small alignment and memory-wasting bug on buffer chunks. + Spotted by rovv. + - Add a malloc_good_size implementation to OpenBSD_malloc_linux.c, + to avoid unused RAM in buffer chunks and memory pools. + - Reduce the default smartlist size from 32 to 16; it turns out that + most smartlists hold around 8-12 elements tops. + - Make dumpstats() log the fullness and size of openssl-internal + buffers. + - If the user has applied the experimental SSL_MODE_RELEASE_BUFFERS + patch to their OpenSSL, turn it on to save memory on servers. This + patch will (with any luck) get included in a mainline distribution + before too long. + - Fix a memory leak when v3 directory authorities load their keys + and cert from disk. Bugfix on 0.2.0.1-alpha. + - Stop using malloc_usable_size() to use more area than we had + actually allocated: it was safe, but made valgrind really unhappy. + - Make the assert_circuit_ok() function work correctly on circuits that + have already been marked for close. + - Fix uninitialized size field for memory area allocation: may improve + memory performance during directory parsing. + + o Minor bugfixes (clients): + - Stop reloading the router list from disk for no reason when we + run out of reachable directory mirrors. Once upon a time reloading + it would set the 'is_running' flag back to 1 for them. It hasn't + done that for a long time. + - When we had picked an exit node for a connection, but marked it as + "optional", and it turned out we had no onion key for the exit, + stop wanting that exit and try again. This situation may not + be possible now, but will probably become feasible with proposal + 158. Spotted by rovv. Fixes another case of bug 752. + - Fix a bug in address parsing that was preventing bridges or hidden + service targets from being at IPv6 addresses. + - Do not remove routers as too old if we do not have any consensus + document. Bugfix on 0.2.0.7-alpha. + - When an exit relay resolves a stream address to a local IP address, + do not just keep retrying that same exit relay over and + over. Instead, just close the stream. Addresses bug 872. Bugfix + on 0.2.0.32. Patch from rovv. + - Made Tor a little less aggressive about deleting expired + certificates. Partial fix for bug 854. + - Treat duplicate certificate fetches as failures, so that we do + not try to re-fetch an expired certificate over and over and over. + - Do not say we're fetching a certificate when we'll in fact skip it + because of a pending download. + - If we have correct permissions on $datadir, we complain to stdout + and fail to start. But dangerous permissions on + $datadir/cached-status/ would cause us to open a log and complain + there. Now complain to stdout and fail to start in both cases. Fixes + bug 820, reported by seeess. + + o Minor bugfixes (bridges): + - When we made bridge authorities stop serving bridge descriptors over + unencrypted links, we also broke DirPort reachability testing for + bridges. So bridges with a non-zero DirPort were printing spurious + warns to their logs. Bugfix on 0.2.0.16-alpha. Fixes bug 709. + - Don't allow a bridge to publish its router descriptor to a + non-bridge directory authority. Fixes part of bug 932. + - When we change to or from being a bridge, reset our counts of + client usage by country. Fixes bug 932. + + o Minor bugfixes (relays): + - Log correct error messages for DNS-related network errors on + Windows. + - Actually return -1 in the error case for read_bandwidth_usage(). + Harmless bug, since we currently don't care about the return value + anywhere. Bugfix on 0.2.0.9-alpha. + - Provide a more useful log message if bug 977 (related to buffer + freelists) ever reappears, and do not crash right away. + - We were already rejecting relay begin cells with destination port + of 0. Now also reject extend cells with destination port or address + of 0. Suggested by lark. + - When we can't transmit a DNS request due to a network error, retry + it after a while, and eventually transmit a failing response to + the RESOLVED cell. Bugfix on 0.1.2.5-alpha. + - Solve a bug that kept hardware crypto acceleration from getting + enabled when accounting was turned on. Fixes bug 907. Bugfix on + 0.0.9pre6. + - When a canonical connection appears later in our internal list + than a noncanonical one for a given OR ID, always use the + canonical one. Bugfix on 0.2.0.12-alpha. Fixes bug 805. + Spotted by rovv. + - Avoid some nasty corner cases in the logic for marking connections + as too old or obsolete or noncanonical for circuits. Partial + bugfix on bug 891. + - Fix another interesting corner-case of bug 891 spotted by rovv: + Previously, if two hosts had different amounts of clock drift, and + one of them created a new connection with just the wrong timing, + the other might decide to deprecate the new connection erroneously. + Bugfix on 0.1.1.13-alpha. + - If one win32 nameserver fails to get added, continue adding the + rest, and don't automatically fail. + - Fix a bug where an unreachable relay would establish enough + reachability testing circuits to do a bandwidth test -- if + we already have a connection to the middle hop of the testing + circuit, then it could establish the last hop by using the existing + connection. Bugfix on 0.1.2.2-alpha, exposed when we made testing + circuits no longer use entry guards in 0.2.1.3-alpha. + + o Minor bugfixes (directory authorities): + - Limit uploaded directory documents to be 16M rather than 500K. + The directory authorities were refusing v3 consensus votes from + other authorities, since the votes are now 504K. Fixes bug 959; + bugfix on 0.0.2pre17 (where we raised it from 50K to 500K ;). + - Directory authorities should never send a 503 "busy" response to + requests for votes or keys. Bugfix on 0.2.0.8-alpha; exposed by + bug 959. + - Fix code so authorities _actually_ send back X-Descriptor-Not-New + headers. Bugfix on 0.2.0.10-alpha. + + o Minor bugfixes (hidden services): + - When we can't find an intro key for a v2 hidden service descriptor, + fall back to the v0 hidden service descriptor and log a bug message. + Workaround for bug 1024. + - In very rare situations new hidden service descriptors were + published earlier than 30 seconds after the last change to the + service. (We currently think that a hidden service descriptor + that's been stable for 30 seconds is worth publishing.) + - If a hidden service sends us an END cell, do not consider + retrying the connection; just close it. Patch from rovv. + - If we are not using BEGIN_DIR cells, don't attempt to contact hidden + service directories if they have no advertised dir port. Bugfix + on 0.2.0.10-alpha. + + o Minor bugfixes (tools): + - In the torify(1) manpage, mention that tsocks will leak your + DNS requests. + + o Minor bugfixes (controllers): + - If the controller claimed responsibility for a stream, but that + stream never finished making its connection, it would live + forever in circuit_wait state. Now we close it after SocksTimeout + seconds. Bugfix on 0.1.2.7-alpha; reported by Mike Perry. + - Make DNS resolved controller events into "CLOSED", not + "FAILED". Bugfix on 0.1.2.5-alpha. Fix by Robert Hogan. Resolves + bug 807. + - The control port would close the connection before flushing long + replies, such as the network consensus, if a QUIT command was issued + before the reply had completed. Now, the control port flushes all + pending replies before closing the connection. Also fix a spurious + warning when a QUIT command is issued after a malformed or rejected + AUTHENTICATE command, but before the connection was closed. Patch + by Marcus Griep. Fixes bugs 1015 and 1016. + - Fix a bug that made stream bandwidth get misreported to the + controller. + + o Deprecated and removed features: + - The old "tor --version --version" command, which would print out + the subversion "Id" of most of the source files, is now removed. It + turned out to be less useful than we'd expected, and harder to + maintain. + - RedirectExits has been removed. It was deprecated since + 0.2.0.3-alpha. + - Finally remove deprecated "EXTENDED_FORMAT" controller feature. It + has been called EXTENDED_EVENTS since 0.1.2.4-alpha. + - Cell pools are now always enabled; --disable-cell-pools is ignored. + - Directory mirrors no longer fetch the v1 directory or + running-routers files. They are obsolete, and nobody asks for them + anymore. This is the first step to making v1 authorities obsolete. + - Take out the TestVia config option, since it was a workaround for + a bug that was fixed in Tor 0.1.1.21. + - Mark RendNodes, RendExcludeNodes, HiddenServiceNodes, and + HiddenServiceExcludeNodes as obsolete: they never worked properly, + and nobody seems to be using them. Fixes bug 754. Bugfix on + 0.1.0.1-rc. Patch from Christian Wilms. + - Remove all backward-compatibility code for relays running + versions of Tor so old that they no longer work at all on the + Tor network. + + o Code simplifications and refactoring: + - Tool-assisted documentation cleanup. Nearly every function or + static variable in Tor should have its own documentation now. + - Rename the confusing or_is_obsolete field to the more appropriate + is_bad_for_new_circs, and move it to or_connection_t where it + belongs. + - Move edge-only flags from connection_t to edge_connection_t: not + only is this better coding, but on machines of plausible alignment, + it should save 4-8 bytes per connection_t. "Every little bit helps." + - Rename ServerDNSAllowBrokenResolvConf to ServerDNSAllowBrokenConfig + for consistency; keep old option working for backward compatibility. + - Simplify the code for finding connections to use for a circuit. + - Revise the connection_new functions so that a more typesafe variant + exists. This will work better with Coverity, and let us find any + actual mistakes we're making here. + - Refactor unit testing logic so that dmalloc can be used sensibly + with unit tests to check for memory leaks. + - Move all hidden-service related fields from connection and circuit + structure to substructures: this way they won't eat so much memory. + - Squeeze 2-5% out of client performance (according to oprofile) by + improving the implementation of some policy-manipulation functions. + - Change the implementation of ExcludeNodes and ExcludeExitNodes to + be more efficient. Formerly it was quadratic in the number of + servers; now it should be linear. Fixes bug 509. + - Save 16-22 bytes per open circuit by moving the n_addr, n_port, + and n_conn_id_digest fields into a separate structure that's + only needed when the circuit has not yet attached to an n_conn. + - Optimize out calls to time(NULL) that occur for every IO operation, + or for every cell. On systems like Windows where time() is a + slow syscall, this fix will be slightly helpful. + + +Changes in version 0.2.0.35 - 2009-06-24 + o Security fix: + - Avoid crashing in the presence of certain malformed descriptors. + Found by lark, and by automated fuzzing. + - Fix an edge case where a malicious exit relay could convince a + controller that the client's DNS question resolves to an internal IP + address. Bug found and fixed by "optimist"; bugfix on 0.1.2.8-beta. + + o Major bugfixes: + - Finally fix the bug where dynamic-IP relays disappear when their + IP address changes: directory mirrors were mistakenly telling + them their old address if they asked via begin_dir, so they + never got an accurate answer about their new address, so they + just vanished after a day. For belt-and-suspenders, relays that + don't set Address in their config now avoid using begin_dir for + all direct connections. Should fix bugs 827, 883, and 900. + - Fix a timing-dependent, allocator-dependent, DNS-related crash bug + that would occur on some exit nodes when DNS failures and timeouts + occurred in certain patterns. Fix for bug 957. + + o Minor bugfixes: + - When starting with a cache over a few days old, do not leak + memory for the obsolete router descriptors in it. Bugfix on + 0.2.0.33; fixes bug 672. + - Hidden service clients didn't use a cached service descriptor that + was older than 15 minutes, but wouldn't fetch a new one either, + because there was already one in the cache. Now, fetch a v2 + descriptor unless the same descriptor was added to the cache within + the last 15 minutes. Fixes bug 997; reported by Marcus Griep. + + +Changes in version 0.2.0.34 - 2009-02-08 + Tor 0.2.0.34 features several more security-related fixes. You should + upgrade, especially if you run an exit relay (remote crash) or a + directory authority (remote infinite loop), or you're on an older + (pre-XP) or not-recently-patched Windows (remote exploit). + + This release marks end-of-life for Tor 0.1.2.x. Those Tor versions + have many known flaws, and nobody should be using them. You should + upgrade. If you're using a Linux or BSD and its packages are obsolete, + stop using those packages and upgrade anyway. + + o Security fixes: + - Fix an infinite-loop bug on handling corrupt votes under certain + circumstances. Bugfix on 0.2.0.8-alpha. + - Fix a temporary DoS vulnerability that could be performed by + a directory mirror. Bugfix on 0.2.0.9-alpha; reported by lark. + - Avoid a potential crash on exit nodes when processing malformed + input. Remote DoS opportunity. Bugfix on 0.2.0.33. + - Do not accept incomplete ipv4 addresses (like 192.168.0) as valid. + Spec conformance issue. Bugfix on Tor 0.0.2pre27. + + o Minor bugfixes: + - Fix compilation on systems where time_t is a 64-bit integer. + Patch from Matthias Drochner. + - Don't consider expiring already-closed client connections. Fixes + bug 893. Bugfix on 0.0.2pre20. + + Changes in version 0.2.0.33 - 2009-01-21 Tor 0.2.0.33 fixes a variety of bugs that were making relays less useful to users. It also finally fixes a bug where a relay or client @@ -123,6 +1013,7 @@ compress cells, which are basically all encrypted, compressed, or both. + Changes in version 0.2.0.32 - 2008-11-20 Tor 0.2.0.32 fixes a major security problem in Debian and Ubuntu packages (and maybe other packages) noticed by Theo de Raadt, fixes @@ -223,11 +1114,6 @@ option as an alias for the actually-working --with-openssl-dir option. Fix the help documentation to recommend --with-openssl-dir. Based on a patch by "Dave". Bugfix on 0.2.0.1-alpha. - - Disallow session resumption attempts during the renegotiation - stage of the v2 handshake protocol. Clients should never be trying - session resumption at this point, but apparently some did, in - ways that caused the handshake to fail. Bug found by Geoff Goodell. - Bugfix on 0.2.0.20-rc. - When using the TransPort option on OpenBSD, and using the User option to change UID and drop privileges, make sure to open /dev/pf before dropping privileges. Fixes bug 782. Patch from @@ -693,9 +1579,10 @@ now we expand "-f ~/.tor/torrc" correctly. Suggested by Matt Edman. o New config options: - - New configuration options to override default maximum number of - servers allowed on a single IP address. This is important for - running a test network on a single host. XXX + - New configuration options AuthDirMaxServersPerAddr and + AuthDirMaxServersperAuthAddr to override default maximum number + of servers allowed on a single IP address. This is important for + running a test network on a single host. - Three new config options (AlternateDirAuthority, AlternateBridgeAuthority, and AlternateHSAuthority) that let the user selectively replace the default directory authorities by type, @@ -719,7 +1606,7 @@ - When we have no consensus, check FallbackNetworkstatusFile (defaults to $PREFIX/share/tor/fallback-consensus) for a consensus. This way we can start out knowing some directory caches. We don't ship with - a fallback consensus by default though, because it wasn't making + a fallback consensus by default though, because it was making bootstrapping take too long while we tried many down relays. - Authorities send back an X-Descriptor-Not-New header in response to an accepted-but-discarded descriptor upload. Partially implements diff -Nru tor-0.2.0.34/src/common/address.c tor-0.2.2.16-alpha/src/common/address.c --- tor-0.2.0.34/src/common/address.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/address.c 2010-07-13 01:37:00.000000000 +0000 @@ -0,0 +1,1394 @@ +/* Copyright (c) 2003-2004, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file address.c + * \brief Functions to use and manipulate the tor_addr_t structure. + **/ + +#include "orconfig.h" +#include "compat.h" +#include "util.h" +#include "address.h" +#include "torlog.h" + +#ifdef MS_WINDOWS +#include +#include +#endif + +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include /* FreeBSD needs this to know what version it is */ +#endif +#include +#include +#include +#include +#include + +/** Convert the tor_addr_t in a, with port in port, into a + * socklen object in *sa_out of object size len. If not enough + * room is free, or on error, return -1. Else return the length of the + * sockaddr. */ +/* XXXX021 This returns socklen_t. socklen_t is sometimes unsigned. This + * function claims to return -1 sometimes. Problematic! */ +socklen_t +tor_addr_to_sockaddr(const tor_addr_t *a, + uint16_t port, + struct sockaddr *sa_out, + socklen_t len) +{ + sa_family_t family = tor_addr_family(a); + if (family == AF_INET) { + struct sockaddr_in *sin; + if (len < (int)sizeof(struct sockaddr_in)) + return -1; + sin = (struct sockaddr_in *)sa_out; + memset(sin, 0, sizeof(struct sockaddr_in)); +#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN + sin->sin_len = sizeof(struct sockaddr_in); +#endif + sin->sin_family = AF_INET; + sin->sin_port = htons(port); + sin->sin_addr.s_addr = tor_addr_to_ipv4n(a); + return sizeof(struct sockaddr_in); + } else if (family == AF_INET6) { + struct sockaddr_in6 *sin6; + if (len < (int)sizeof(struct sockaddr_in6)) + return -1; + sin6 = (struct sockaddr_in6 *)sa_out; + memset(sin6, 0, sizeof(struct sockaddr_in6)); +#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN + sin6->sin6_len = sizeof(struct sockaddr_in6); +#endif + sin6->sin6_family = AF_INET6; + sin6->sin6_port = htons(port); + memcpy(&sin6->sin6_addr, tor_addr_to_in6(a), sizeof(struct in6_addr)); + return sizeof(struct sockaddr_in6); + } else { + return -1; + } +} + +/** Set the tor_addr_t in a to contain the socket address contained in + * sa. */ +int +tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa, + uint16_t *port_out) +{ + tor_assert(a); + tor_assert(sa); + if (sa->sa_family == AF_INET) { + struct sockaddr_in *sin = (struct sockaddr_in *) sa; + tor_addr_from_ipv4n(a, sin->sin_addr.s_addr); + if (port_out) + *port_out = ntohs(sin->sin_port); + } else if (sa->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; + tor_addr_from_in6(a, &sin6->sin6_addr); + if (port_out) + *port_out = ntohs(sin6->sin6_port); + } else { + tor_addr_make_unspec(a); + return -1; + } + return 0; +} + +/** Set address a to the unspecified address. This address belongs to + * no family. */ +void +tor_addr_make_unspec(tor_addr_t *a) +{ + memset(a, 0, sizeof(*a)); + a->family = AF_UNSPEC; +} + +/** Similar behavior to Unix gethostbyname: resolve name, and set + * *addr to the proper IP address and family. The family + * argument (which must be AF_INET, AF_INET6, or AF_UNSPEC) declares a + * preferred family, though another one may be returned if only one + * family is implemented for this address. + * + * Return 0 on success, -1 on failure; 1 on transient failure. + */ +int +tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr) +{ + /* Perhaps eventually this should be replaced by a tor_getaddrinfo or + * something. + */ + struct in_addr iaddr; + struct in6_addr iaddr6; + tor_assert(name); + tor_assert(addr); + tor_assert(family == AF_INET || family == AF_INET6 || family == AF_UNSPEC); + if (!*name) { + /* Empty address is an error. */ + return -1; + } else if (tor_inet_pton(AF_INET, name, &iaddr)) { + /* It's an IPv4 IP. */ + if (family == AF_INET6) + return -1; + tor_addr_from_in(addr, &iaddr); + return 0; + } else if (tor_inet_pton(AF_INET6, name, &iaddr6)) { + if (family == AF_INET) + return -1; + tor_addr_from_in6(addr, &iaddr6); + return 0; + } else { +#ifdef HAVE_GETADDRINFO + int err; + struct addrinfo *res=NULL, *res_p; + struct addrinfo *best=NULL; + struct addrinfo hints; + int result = -1; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = family; + hints.ai_socktype = SOCK_STREAM; + err = getaddrinfo(name, NULL, &hints, &res); + if (!err) { + best = NULL; + for (res_p = res; res_p; res_p = res_p->ai_next) { + if (family == AF_UNSPEC) { + if (res_p->ai_family == AF_INET) { + best = res_p; + break; + } else if (res_p->ai_family == AF_INET6 && !best) { + best = res_p; + } + } else if (family == res_p->ai_family) { + best = res_p; + break; + } + } + if (!best) + best = res; + if (best->ai_family == AF_INET) { + tor_addr_from_in(addr, + &((struct sockaddr_in*)best->ai_addr)->sin_addr); + result = 0; + } else if (best->ai_family == AF_INET6) { + tor_addr_from_in6(addr, + &((struct sockaddr_in6*)best->ai_addr)->sin6_addr); + result = 0; + } + freeaddrinfo(res); + return result; + } + return (err == EAI_AGAIN) ? 1 : -1; +#else + struct hostent *ent; + int err; +#ifdef HAVE_GETHOSTBYNAME_R_6_ARG + char buf[2048]; + struct hostent hostent; + int r; + r = gethostbyname_r(name, &hostent, buf, sizeof(buf), &ent, &err); +#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG) + char buf[2048]; + struct hostent hostent; + ent = gethostbyname_r(name, &hostent, buf, sizeof(buf), &err); +#elif defined(HAVE_GETHOSTBYNAME_R_3_ARG) + struct hostent_data data; + struct hostent hent; + memset(&data, 0, sizeof(data)); + err = gethostbyname_r(name, &hent, &data); + ent = err ? NULL : &hent; +#else + ent = gethostbyname(name); +#ifdef MS_WINDOWS + err = WSAGetLastError(); +#else + err = h_errno; +#endif +#endif /* endif HAVE_GETHOSTBYNAME_R_6_ARG. */ + if (ent) { + if (ent->h_addrtype == AF_INET) { + tor_addr_from_in(addr, (struct in_addr*) ent->h_addr); + } else if (ent->h_addrtype == AF_INET6) { + tor_addr_from_in6(addr, (struct in6_addr*) ent->h_addr); + } else { + tor_assert(0); /* gethostbyname() returned a bizarre addrtype */ + } + return 0; + } +#ifdef MS_WINDOWS + return (err == WSATRY_AGAIN) ? 1 : -1; +#else + return (err == TRY_AGAIN) ? 1 : -1; +#endif +#endif + } +} + +/** Return true iff ip is an IP reserved to localhost or local networks + * in RFC1918 or RFC4193 or RFC4291. (fec0::/10, deprecated by RFC3879, is + * also treated as internal for now.) + */ +int +tor_addr_is_internal(const tor_addr_t *addr, int for_listening) +{ + uint32_t iph4 = 0; + uint32_t iph6[4]; + sa_family_t v_family; + v_family = tor_addr_family(addr); + + if (v_family == AF_INET) { + iph4 = tor_addr_to_ipv4h(addr); + } else if (v_family == AF_INET6) { + if (tor_addr_is_v4(addr)) { /* v4-mapped */ + v_family = AF_INET; + iph4 = ntohl(tor_addr_to_in6_addr32(addr)[3]); + } + } + + if (v_family == AF_INET6) { + const uint32_t *a32 = tor_addr_to_in6_addr32(addr); + iph6[0] = ntohl(a32[0]); + iph6[1] = ntohl(a32[1]); + iph6[2] = ntohl(a32[2]); + iph6[3] = ntohl(a32[3]); + if (for_listening && !iph6[0] && !iph6[1] && !iph6[2] && !iph6[3]) /* :: */ + return 0; + + if (((iph6[0] & 0xfe000000) == 0xfc000000) || /* fc00/7 - RFC4193 */ + ((iph6[0] & 0xffc00000) == 0xfe800000) || /* fe80/10 - RFC4291 */ + ((iph6[0] & 0xffc00000) == 0xfec00000)) /* fec0/10 D- RFC3879 */ + return 1; + + if (!iph6[0] && !iph6[1] && !iph6[2] && + ((iph6[3] & 0xfffffffe) == 0x00000000)) /* ::/127 */ + return 1; + + return 0; + } else if (v_family == AF_INET) { + if (for_listening && !iph4) /* special case for binding to 0.0.0.0 */ + return 0; + if (((iph4 & 0xff000000) == 0x0a000000) || /* 10/8 */ + ((iph4 & 0xff000000) == 0x00000000) || /* 0/8 */ + ((iph4 & 0xff000000) == 0x7f000000) || /* 127/8 */ + ((iph4 & 0xffff0000) == 0xa9fe0000) || /* 169.254/16 */ + ((iph4 & 0xfff00000) == 0xac100000) || /* 172.16/12 */ + ((iph4 & 0xffff0000) == 0xc0a80000)) /* 192.168/16 */ + return 1; + return 0; + } + + /* unknown address family... assume it's not safe for external use */ + /* rather than tor_assert(0) */ + log_warn(LD_BUG, "tor_addr_is_internal() called with a non-IP address."); + return 1; +} + +/** Convert a tor_addr_t addr into a string, and store it in + * dest of size len. Returns a pointer to dest on success, + * or NULL on failure. If decorate, surround IPv6 addresses with + * brackets. + */ +const char * +tor_addr_to_str(char *dest, const tor_addr_t *addr, int len, int decorate) +{ + const char *ptr; + tor_assert(addr && dest); + + switch (tor_addr_family(addr)) { + case AF_INET: + if (len<3) + return NULL; + ptr = tor_inet_ntop(AF_INET, &addr->addr.in_addr, dest, len); + break; + case AF_INET6: + if (decorate) + ptr = tor_inet_ntop(AF_INET6, &addr->addr.in6_addr, dest+1, len-2); + else + ptr = tor_inet_ntop(AF_INET6, &addr->addr.in6_addr, dest, len); + if (ptr && decorate) { + *dest = '['; + memcpy(dest+strlen(dest), "]", 2); + tor_assert(ptr == dest+1); + ptr = dest; + } + break; + default: + return NULL; + } + return ptr; +} + +/** Parse an .in-addr.arpa or .ip6.arpa address from address. Return 0 + * if this is not an .in-addr.arpa address or an .ip6.arpa address. Return -1 + * if this is an ill-formed .in-addr.arpa address or an .ip6.arpa address. + * Also return -1 if family is not AF_UNSPEC, and the parsed address + * family does not match family. On success, return 1, and store the + * result, if any, into result, if provided. + * + * If accept_regular is set and the address is in neither recognized + * reverse lookup hostname format, try parsing the address as a regular + * IPv4 or IPv6 address too. + */ +int +tor_addr_parse_reverse_lookup_name(tor_addr_t *result, const char *address, + int family, int accept_regular) +{ + if (!strcasecmpend(address, ".in-addr.arpa")) { + /* We have an in-addr.arpa address. */ + char buf[INET_NTOA_BUF_LEN]; + size_t len; + struct in_addr inaddr; + if (family == AF_INET6) + return -1; + + len = strlen(address) - strlen(".in-addr.arpa"); + if (len >= INET_NTOA_BUF_LEN) + return -1; /* Too long. */ + + memcpy(buf, address, len); + buf[len] = '\0'; + if (tor_inet_aton(buf, &inaddr) == 0) + return -1; /* malformed. */ + + /* reverse the bytes */ + inaddr.s_addr = (uint32_t) + (((inaddr.s_addr & 0x000000ff) << 24) + |((inaddr.s_addr & 0x0000ff00) << 8) + |((inaddr.s_addr & 0x00ff0000) >> 8) + |((inaddr.s_addr & 0xff000000) >> 24)); + + if (result) { + tor_addr_from_in(result, &inaddr); + } + return 1; + } + + if (!strcasecmpend(address, ".ip6.arpa")) { + const char *cp; + int i; + int n0, n1; + struct in6_addr in6; + + if (family == AF_INET) + return -1; + + cp = address; + for (i = 0; i < 16; ++i) { + n0 = hex_decode_digit(*cp++); /* The low-order nybble appears first. */ + if (*cp++ != '.') return -1; /* Then a dot. */ + n1 = hex_decode_digit(*cp++); /* The high-order nybble appears first. */ + if (*cp++ != '.') return -1; /* Then another dot. */ + if (n0<0 || n1 < 0) /* Both nybbles must be hex. */ + return -1; + + /* We don't check the length of the string in here. But that's okay, + * since we already know that the string ends with ".ip6.arpa", and + * there is no way to frameshift .ip6.arpa so it fits into the pattern + * of hexdigit, period, hexdigit, period that we enforce above. + */ + + /* Assign from low-byte to high-byte. */ + in6.s6_addr[15-i] = n0 | (n1 << 4); + } + if (strcasecmp(cp, "ip6.arpa")) + return -1; + + if (result) { + tor_addr_from_in6(result, &in6); + } + return 1; + } + + if (accept_regular) { + tor_addr_t tmp; + int r = tor_addr_from_str(&tmp, address); + if (r < 0) + return 0; + if (r != family && family != AF_UNSPEC) + return -1; + + if (result) + memcpy(result, &tmp, sizeof(tor_addr_t)); + + return 1; + } + + return 0; +} + +/** Convert addr to an in-addr.arpa name or a .ip6.arpa name, and store + * the result in the outlen-byte buffer at out. Return 0 on + * success, -1 on failure. */ +int +tor_addr_to_reverse_lookup_name(char *out, size_t outlen, + const tor_addr_t *addr) +{ + if (addr->family == AF_INET) { + uint32_t a = tor_addr_to_ipv4h(addr); + + return tor_snprintf(out, outlen, "%d.%d.%d.%d.in-addr.arpa", + (int)(uint8_t)((a )&0xff), + (int)(uint8_t)((a>>8 )&0xff), + (int)(uint8_t)((a>>16)&0xff), + (int)(uint8_t)((a>>24)&0xff)); + } else if (addr->family == AF_INET6) { + int i; + char *cp = out; + const uint8_t *bytes = tor_addr_to_in6_addr8(addr); + if (outlen < REVERSE_LOOKUP_NAME_BUF_LEN) + return -1; + for (i = 15; i >= 0; --i) { + uint8_t byte = bytes[i]; + *cp++ = "0123456789abcdef"[byte & 0x0f]; + *cp++ = '.'; + *cp++ = "0123456789abcdef"[byte >> 4]; + *cp++ = '.'; + } + memcpy(cp, "ip6.arpa", 9); /* 8 characters plus NUL */ + return 0; + } + return -1; +} + +/** Parse a string s containing an IPv4/IPv6 address, and possibly + * a mask and port or port range. Store the parsed address in + * addr_out, a mask (if any) in mask_out, and port(s) (if any) + * in port_min_out and port_max_out. + * + * The syntax is: + * Address OptMask OptPortRange + * Address ::= IPv4Address / "[" IPv6Address "]" / "*" + * OptMask ::= "/" Integer / + * OptPortRange ::= ":*" / ":" Integer / ":" Integer "-" Integer / + * + * - If mask, minport, or maxport are NULL, we do not want these + * options to be set; treat them as an error if present. + * - If the string has no mask, the mask is set to /32 (IPv4) or /128 (IPv6). + * - If the string has one port, it is placed in both min and max port + * variables. + * - If the string has no port(s), port_(min|max)_out are set to 1 and 65535. + * + * Return an address family on success, or -1 if an invalid address string is + * provided. + */ +int +tor_addr_parse_mask_ports(const char *s, tor_addr_t *addr_out, + maskbits_t *maskbits_out, + uint16_t *port_min_out, uint16_t *port_max_out) +{ + char *base = NULL, *address, *mask = NULL, *port = NULL, *rbracket = NULL; + char *endptr; + int any_flag=0, v4map=0; + sa_family_t family; + struct in6_addr in6_tmp; + struct in_addr in_tmp; + + tor_assert(s); + tor_assert(addr_out); + + /* IP, [], /mask, ports */ +#define MAX_ADDRESS_LENGTH (TOR_ADDR_BUF_LEN+2+(1+INET_NTOA_BUF_LEN)+12+1) + + if (strlen(s) > MAX_ADDRESS_LENGTH) { + log_warn(LD_GENERAL, "Impossibly long IP %s; rejecting", escaped(s)); + goto err; + } + base = tor_strdup(s); + + /* Break 'base' into separate strings. */ + address = base; + if (*address == '[') { /* Probably IPv6 */ + address++; + rbracket = strchr(address, ']'); + if (!rbracket) { + log_warn(LD_GENERAL, + "No closing IPv6 bracket in address pattern; rejecting."); + goto err; + } + } + mask = strchr((rbracket?rbracket:address),'/'); + port = strchr((mask?mask:(rbracket?rbracket:address)), ':'); + if (port) + *port++ = '\0'; + if (mask) + *mask++ = '\0'; + if (rbracket) + *rbracket = '\0'; + if (port && mask) + tor_assert(port > mask); + if (mask && rbracket) + tor_assert(mask > rbracket); + + /* Now "address" is the a.b.c.d|'*'|abcd::1 part... + * "mask" is the Mask|Maskbits part... + * and "port" is the *|port|min-max part. + */ + + /* Process the address portion */ + memset(addr_out, 0, sizeof(tor_addr_t)); + + if (!strcmp(address, "*")) { + family = AF_INET; /* AF_UNSPEC ???? XXXX_IP6 */ + tor_addr_from_ipv4h(addr_out, 0); + any_flag = 1; + } else if (tor_inet_pton(AF_INET6, address, &in6_tmp) > 0) { + family = AF_INET6; + tor_addr_from_in6(addr_out, &in6_tmp); + } else if (tor_inet_pton(AF_INET, address, &in_tmp) > 0) { + family = AF_INET; + tor_addr_from_in(addr_out, &in_tmp); + } else { + log_warn(LD_GENERAL, "Malformed IP %s in address pattern; rejecting.", + escaped(address)); + goto err; + } + + v4map = tor_addr_is_v4(addr_out); + + /* Parse mask */ + if (maskbits_out) { + int bits = 0; + struct in_addr v4mask; + + if (mask) { /* the caller (tried to) specify a mask */ + bits = (int) strtol(mask, &endptr, 10); + if (!*endptr) { /* strtol converted everything, so it was an integer */ + if ((bits<0 || bits>128) || + (family == AF_INET && bits > 32)) { + log_warn(LD_GENERAL, + "Bad number of mask bits (%d) on address range; rejecting.", + bits); + goto err; + } + } else { /* mask might still be an address-style mask */ + if (tor_inet_pton(AF_INET, mask, &v4mask) > 0) { + bits = addr_mask_get_bits(ntohl(v4mask.s_addr)); + if (bits < 0) { + log_warn(LD_GENERAL, + "IPv4-style mask %s is not a prefix address; rejecting.", + escaped(mask)); + goto err; + } + } else { /* Not IPv4; we don't do address-style IPv6 masks. */ + log_warn(LD_GENERAL, + "Malformed mask on address range %s; rejecting.", + escaped(s)); + goto err; + } + } + if (family == AF_INET6 && v4map) { + if (bits > 32 && bits < 96) { /* Crazy */ + log_warn(LD_GENERAL, + "Bad mask bits %i for V4-mapped V6 address; rejecting.", + bits); + goto err; + } + /* XXXX_IP6 is this really what we want? */ + bits = 96 + bits%32; /* map v4-mapped masks onto 96-128 bits */ + } + } else { /* pick an appropriate mask, as none was given */ + if (any_flag) + bits = 0; /* This is okay whether it's V6 or V4 (FIX V4-mapped V6!) */ + else if (tor_addr_family(addr_out) == AF_INET) + bits = 32; + else if (tor_addr_family(addr_out) == AF_INET6) + bits = 128; + } + *maskbits_out = (maskbits_t) bits; + } else { + if (mask) { + log_warn(LD_GENERAL, + "Unexpected mask in address %s; rejecting", escaped(s)); + goto err; + } + } + + /* Parse port(s) */ + if (port_min_out) { + uint16_t port2; + if (!port_max_out) /* caller specified one port; fake the second one */ + port_max_out = &port2; + + if (parse_port_range(port, port_min_out, port_max_out) < 0) { + goto err; + } else if ((*port_min_out != *port_max_out) && port_max_out == &port2) { + log_warn(LD_GENERAL, + "Wanted one port from address range, but there are two."); + + port_max_out = NULL; /* caller specified one port, so set this back */ + goto err; + } + } else { + if (port) { + log_warn(LD_GENERAL, + "Unexpected ports in address %s; rejecting", escaped(s)); + goto err; + } + } + + tor_free(base); + return tor_addr_family(addr_out); + err: + tor_free(base); + return -1; +} + +/** Determine whether an address is IPv4, either native or IPv4-mapped IPv6. + * Note that this is about representation only, as any decent stack will + * reject IPv4-mapped addresses received on the wire (and won't use them + * on the wire either). + */ +int +tor_addr_is_v4(const tor_addr_t *addr) +{ + tor_assert(addr); + + if (tor_addr_family(addr) == AF_INET) + return 1; + + if (tor_addr_family(addr) == AF_INET6) { + /* First two don't need to be ordered */ + uint32_t *a32 = tor_addr_to_in6_addr32(addr); + if (a32[0] == 0 && a32[1] == 0 && ntohl(a32[2]) == 0x0000ffffu) + return 1; + } + + return 0; /* Not IPv4 - unknown family or a full-blood IPv6 address */ +} + +/** Determine whether an address addr is null, either all zeroes or + * belonging to family AF_UNSPEC. + */ +int +tor_addr_is_null(const tor_addr_t *addr) +{ + tor_assert(addr); + + switch (tor_addr_family(addr)) { + case AF_INET6: { + uint32_t *a32 = tor_addr_to_in6_addr32(addr); + return (a32[0] == 0) && (a32[1] == 0) && (a32[2] == 0) && (a32[3] == 0); + } + case AF_INET: + return (tor_addr_to_ipv4n(addr) == 0); + case AF_UNSPEC: + return 1; + default: + log_warn(LD_BUG, "Called with unknown address family %d", + (int)tor_addr_family(addr)); + return 0; + } + //return 1; +} + +/** Return true iff addr is a loopback address */ +int +tor_addr_is_loopback(const tor_addr_t *addr) +{ + tor_assert(addr); + switch (tor_addr_family(addr)) { + case AF_INET6: { + /* ::1 */ + uint32_t *a32 = tor_addr_to_in6_addr32(addr); + return (a32[0] == 0) && (a32[1] == 0) && (a32[2] == 0) && (a32[3] == 1); + } + case AF_INET: + /* 127.0.0.1 */ + return (tor_addr_to_ipv4h(addr) & 0xff000000) == 0x7f000000; + case AF_UNSPEC: + return 0; + default: + tor_fragile_assert(); + return 0; + } +} + +/** Set dest to equal the IPv4 address in v4addr (given in + * network order). */ +void +tor_addr_from_ipv4n(tor_addr_t *dest, uint32_t v4addr) +{ + tor_assert(dest); + memset(dest, 0, sizeof(tor_addr_t)); + dest->family = AF_INET; + dest->addr.in_addr.s_addr = v4addr; +} + +/** Set dest to equal the IPv6 address in the 16 bytes at + * ipv6_bytes. */ +void +tor_addr_from_ipv6_bytes(tor_addr_t *dest, const char *ipv6_bytes) +{ + tor_assert(dest); + tor_assert(ipv6_bytes); + memset(dest, 0, sizeof(tor_addr_t)); + dest->family = AF_INET6; + memcpy(dest->addr.in6_addr.s6_addr, ipv6_bytes, 16); +} + +/** Set dest equal to the IPv6 address in the in6_addr in6. */ +void +tor_addr_from_in6(tor_addr_t *dest, const struct in6_addr *in6) +{ + tor_addr_from_ipv6_bytes(dest, (const char*)in6->s6_addr); +} + +/** Copy a tor_addr_t from src to dest. + */ +void +tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src) +{ + if (src == dest) + return; + tor_assert(src); + tor_assert(dest); + memcpy(dest, src, sizeof(tor_addr_t)); +} + +/** Given two addresses addr1 and addr2, return 0 if the two + * addresses are equivalent under the mask mbits, less than 0 if addr1 + * precedes addr2, and greater than 0 otherwise. + * + * Different address families (IPv4 vs IPv6) are always considered unequal if + * how is CMP_EXACT; otherwise, IPv6-mapped IPv4 addresses are + * considered equivalent to their IPv4 equivalents. + */ +int +tor_addr_compare(const tor_addr_t *addr1, const tor_addr_t *addr2, + tor_addr_comparison_t how) +{ + return tor_addr_compare_masked(addr1, addr2, 128, how); +} + +/** As tor_addr_compare(), but only looks at the first mask bits of + * the address. + * + * Reduce over-specific masks (>128 for ipv6, >32 for ipv4) to 128 or 32. + * + * The mask is interpreted relative to addr1, so that if a is + * ::ffff:1.2.3.4, and b is 3.4.5.6, + * tor_addr_compare_masked(a,b,100,CMP_SEMANTIC) is the same as + * -tor_addr_compare_masked(b,a,4,CMP_SEMANTIC). + * + * We guarantee that the ordering from tor_addr_compare_masked is a total + * order on addresses, but not that it is any particular order, or that it + * will be the same from one version to the next. + */ +int +tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2, + maskbits_t mbits, tor_addr_comparison_t how) +{ +#define TRISTATE(a,b) (((a)<(b))?-1: (((a)==(b))?0:1)) + sa_family_t family1, family2, v_family1, v_family2; + + tor_assert(addr1 && addr2); + + v_family1 = family1 = tor_addr_family(addr1); + v_family2 = family2 = tor_addr_family(addr2); + + if (family1==family2) { + /* When the families are the same, there's only one way to do the + * comparison: exactly. */ + int r; + switch (family1) { + case AF_UNSPEC: + return 0; /* All unspecified addresses are equal */ + case AF_INET: { + uint32_t a1 = tor_addr_to_ipv4h(addr1); + uint32_t a2 = tor_addr_to_ipv4h(addr2); + if (mbits <= 0) + return 0; + if (mbits > 32) + mbits = 32; + a1 >>= (32-mbits); + a2 >>= (32-mbits); + r = TRISTATE(a1, a2); + return r; + } + case AF_INET6: { + const uint8_t *a1 = tor_addr_to_in6_addr8(addr1); + const uint8_t *a2 = tor_addr_to_in6_addr8(addr2); + const int bytes = mbits >> 3; + const int leftover_bits = mbits & 7; + if (bytes && (r = memcmp(a1, a2, bytes))) { + return r; + } else if (leftover_bits) { + uint8_t b1 = a1[bytes] >> (8-leftover_bits); + uint8_t b2 = a2[bytes] >> (8-leftover_bits); + return TRISTATE(b1, b2); + } else { + return 0; + } + } + default: + tor_fragile_assert(); + return 0; + } + } else if (how == CMP_EXACT) { + /* Unequal families and an exact comparison? Stop now! */ + return TRISTATE(family1, family2); + } + + if (mbits == 0) + return 0; + + if (family1 == AF_INET6 && tor_addr_is_v4(addr1)) + v_family1 = AF_INET; + if (family2 == AF_INET6 && tor_addr_is_v4(addr2)) + v_family2 = AF_INET; + if (v_family1 == v_family2) { + /* One or both addresses are a mapped ipv4 address. */ + uint32_t a1, a2; + if (family1 == AF_INET6) { + a1 = tor_addr_to_mapped_ipv4h(addr1); + if (mbits <= 96) + return 0; + mbits -= 96; /* We just decided that the first 96 bits of a1 "match". */ + } else { + a1 = tor_addr_to_ipv4h(addr1); + } + if (family2 == AF_INET6) { + a2 = tor_addr_to_mapped_ipv4h(addr2); + } else { + a2 = tor_addr_to_ipv4h(addr2); + } + if (mbits <= 0) return 0; + if (mbits > 32) mbits = 32; + a1 >>= (32-mbits); + a2 >>= (32-mbits); + return TRISTATE(a1, a2); + } else { + /* Unequal families, and semantic comparison, and no semantic family + * matches. */ + return TRISTATE(family1, family2); + } +} + +/** Return a hash code based on the address addr */ +unsigned int +tor_addr_hash(const tor_addr_t *addr) +{ + switch (tor_addr_family(addr)) { + case AF_INET: + return tor_addr_to_ipv4h(addr); + case AF_UNSPEC: + return 0x4e4d5342; + case AF_INET6: { + const uint32_t *u = tor_addr_to_in6_addr32(addr); + return u[0] + u[1] + u[2] + u[3]; + } + default: + tor_fragile_assert(); + return 0; + } +} + +/** Return a newly allocated string with a representation of addr. */ +char * +tor_dup_addr(const tor_addr_t *addr) +{ + char buf[TOR_ADDR_BUF_LEN]; + tor_addr_to_str(buf, addr, sizeof(buf), 0); + return tor_strdup(buf); +} + +/** Return a string representing the address addr. This string is + * statically allocated, and must not be freed. Each call to + * fmt_addr invalidates the last result of the function. This + * function is not thread-safe. */ +const char * +fmt_addr(const tor_addr_t *addr) +{ + static char buf[TOR_ADDR_BUF_LEN]; + if (!addr) return ""; + tor_addr_to_str(buf, addr, sizeof(buf), 0); + return buf; +} + +/** Convert the string in src to a tor_addr_t addr. The string + * may be an IPv4 address, an IPv6 address, or an IPv6 address surrounded by + * square brackets. + * + * Return an address family on success, or -1 if an invalid address string is + * provided. */ +int +tor_addr_from_str(tor_addr_t *addr, const char *src) +{ + char *tmp = NULL; /* Holds substring if we got a dotted quad. */ + int result; + struct in_addr in_tmp; + struct in6_addr in6_tmp; + tor_assert(addr && src); + if (src[0] == '[' && src[1]) + src = tmp = tor_strndup(src+1, strlen(src)-2); + + if (tor_inet_pton(AF_INET6, src, &in6_tmp) > 0) { + result = AF_INET6; + tor_addr_from_in6(addr, &in6_tmp); + } else if (tor_inet_pton(AF_INET, src, &in_tmp) > 0) { + result = AF_INET; + tor_addr_from_in(addr, &in_tmp); + } else { + result = -1; + } + + tor_free(tmp); + return result; +} + +/** Parse an address or address-port combination from s, resolve the + * address as needed, and put the result in addr_out and (optionally) + * port_out. Return 0 on success, negative on failure. */ +int +tor_addr_port_parse(const char *s, tor_addr_t *addr_out, uint16_t *port_out) +{ + const char *port; + tor_addr_t addr; + uint16_t portval; + char *tmp = NULL; + + tor_assert(s); + tor_assert(addr_out); + + s = eat_whitespace(s); + + if (*s == '[') { + port = strstr(s, "]"); + if (!port) + goto err; + tmp = tor_strndup(s+1, port-(s+1)); + port = port+1; + if (*port == ':') + port++; + else + port = NULL; + } else { + port = strchr(s, ':'); + if (port) + tmp = tor_strndup(s, port-s); + else + tmp = tor_strdup(s); + if (port) + ++port; + } + + if (tor_addr_lookup(tmp, AF_UNSPEC, &addr) < 0) + goto err; + tor_free(tmp); + + if (port) { + portval = (int) tor_parse_long(port, 10, 1, 65535, NULL, NULL); + if (!portval) + goto err; + } else { + portval = 0; + } + + if (port_out) + *port_out = portval; + tor_addr_copy(addr_out, &addr); + + return 0; + err: + tor_free(tmp); + return -1; +} + +/** Set *addr to the IP address (if any) of whatever interface + * connects to the Internet. This address should only be used in checking + * whether our address has changed. Return 0 on success, -1 on failure. + */ +int +get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr) +{ + int sock=-1, r=-1; + struct sockaddr_storage my_addr, target_addr; + socklen_t my_addr_len; + + tor_assert(addr); + + memset(addr, 0, sizeof(tor_addr_t)); + memset(&target_addr, 0, sizeof(target_addr)); + my_addr_len = (socklen_t)sizeof(my_addr); + /* Use the "discard" service port */ + ((struct sockaddr_in*)&target_addr)->sin_port = 9; + /* Don't worry: no packets are sent. We just need to use a real address + * on the actual Internet. */ + if (family == AF_INET6) { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)&target_addr; + sock = tor_open_socket(PF_INET6,SOCK_DGRAM,IPPROTO_UDP); + my_addr_len = (socklen_t)sizeof(struct sockaddr_in6); + sin6->sin6_family = AF_INET6; + S6_ADDR16(sin6->sin6_addr)[0] = htons(0x2002); /* 2002:: */ + } else if (family == AF_INET) { + struct sockaddr_in *sin = (struct sockaddr_in*)&target_addr; + sock = tor_open_socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); + my_addr_len = (socklen_t)sizeof(struct sockaddr_in); + sin->sin_family = AF_INET; + sin->sin_addr.s_addr = htonl(0x12000001); /* 18.0.0.1 */ + } else { + return -1; + } + if (sock < 0) { + int e = tor_socket_errno(-1); + log_fn(severity, LD_NET, "unable to create socket: %s", + tor_socket_strerror(e)); + goto err; + } + + if (connect(sock,(struct sockaddr *)&target_addr, + (socklen_t)sizeof(target_addr))<0) { + int e = tor_socket_errno(sock); + log_fn(severity, LD_NET, "connect() failed: %s", tor_socket_strerror(e)); + goto err; + } + + if (getsockname(sock,(struct sockaddr*)&my_addr, &my_addr_len)) { + int e = tor_socket_errno(sock); + log_fn(severity, LD_NET, "getsockname() to determine interface failed: %s", + tor_socket_strerror(e)); + goto err; + } + + tor_addr_from_sockaddr(addr, (struct sockaddr*)&my_addr, NULL); + r=0; + err: + if (sock >= 0) + tor_close_socket(sock); + return r; +} + +/* ====== + * IPv4 helpers + * XXXX022 IPv6 deprecate some of these. + */ + +/** Return true iff ip (in host order) is an IP reserved to localhost, + * or reserved for local networks by RFC 1918. + */ +int +is_internal_IP(uint32_t ip, int for_listening) +{ + tor_addr_t myaddr; + myaddr.family = AF_INET; + myaddr.addr.in_addr.s_addr = htonl(ip); + + return tor_addr_is_internal(&myaddr, for_listening); +} + +/** Parse a string of the form "host[:port]" from addrport. If + * address is provided, set *address to a copy of the + * host portion of the string. If addr is provided, try to + * resolve the host portion of the string and store it into + * *addr (in host byte order). If port_out is provided, + * store the port number into *port_out, or 0 if no port is given. + * If port_out is NULL, then there must be no port number in + * addrport. + * Return 0 on success, -1 on failure. + */ +int +parse_addr_port(int severity, const char *addrport, char **address, + uint32_t *addr, uint16_t *port_out) +{ + const char *colon; + char *_address = NULL; + int _port; + int ok = 1; + + tor_assert(addrport); + + colon = strchr(addrport, ':'); + if (colon) { + _address = tor_strndup(addrport, colon-addrport); + _port = (int) tor_parse_long(colon+1,10,1,65535,NULL,NULL); + if (!_port) { + log_fn(severity, LD_GENERAL, "Port %s out of range", escaped(colon+1)); + ok = 0; + } + if (!port_out) { + char *esc_addrport = esc_for_log(addrport); + log_fn(severity, LD_GENERAL, + "Port %s given on %s when not required", + escaped(colon+1), esc_addrport); + tor_free(esc_addrport); + ok = 0; + } + } else { + _address = tor_strdup(addrport); + _port = 0; + } + + if (addr) { + /* There's an addr pointer, so we need to resolve the hostname. */ + if (tor_lookup_hostname(_address,addr)) { + log_fn(severity, LD_NET, "Couldn't look up %s", escaped(_address)); + ok = 0; + *addr = 0; + } + } + + if (address && ok) { + *address = _address; + } else { + if (address) + *address = NULL; + tor_free(_address); + } + if (port_out) + *port_out = ok ? ((uint16_t) _port) : 0; + + return ok ? 0 : -1; +} + +/** If mask is an address mask for a bit-prefix, return the number of + * bits. Otherwise, return -1. */ +int +addr_mask_get_bits(uint32_t mask) +{ + int i; + if (mask == 0) + return 0; + if (mask == 0xFFFFFFFFu) + return 32; + for (i=0; i<=32; ++i) { + if (mask == (uint32_t) ~((1u<<(32-i))-1)) { + return i; + } + } + return -1; +} + +/** Compare two addresses a1 and a2 for equality under a + * netmask of mbits bits. Return -1, 0, or 1. + * + * XXXX_IP6 Temporary function to allow masks as bitcounts everywhere. This + * will be replaced with an IPv6-aware version as soon as 32-bit addresses are + * no longer passed around. + */ +int +addr_mask_cmp_bits(uint32_t a1, uint32_t a2, maskbits_t bits) +{ + if (bits > 32) + bits = 32; + else if (bits == 0) + return 0; + + a1 >>= (32-bits); + a2 >>= (32-bits); + + if (a1 < a2) + return -1; + else if (a1 > a2) + return 1; + else + return 0; +} + +/** Parse a string s in the format of (*|port(-maxport)?)?, setting the + * various *out pointers as appropriate. Return 0 on success, -1 on failure. + */ +int +parse_port_range(const char *port, uint16_t *port_min_out, + uint16_t *port_max_out) +{ + int port_min, port_max, ok; + tor_assert(port_min_out); + tor_assert(port_max_out); + + if (!port || *port == '\0' || strcmp(port, "*") == 0) { + port_min = 1; + port_max = 65535; + } else { + char *endptr = NULL; + port_min = (int)tor_parse_long(port, 10, 0, 65535, &ok, &endptr); + if (!ok) { + log_warn(LD_GENERAL, + "Malformed port %s on address range; rejecting.", + escaped(port)); + return -1; + } else if (endptr && *endptr == '-') { + port = endptr+1; + endptr = NULL; + port_max = (int)tor_parse_long(port, 10, 1, 65536, &ok, &endptr); + if (!ok) { + log_warn(LD_GENERAL, + "Malformed port %s on address range; rejecting.", + escaped(port)); + return -1; + } + } else { + port_max = port_min; + } + if (port_min > port_max) { + log_warn(LD_GENERAL, "Insane port range on address policy; rejecting."); + return -1; + } + } + + if (port_min < 1) + port_min = 1; + if (port_max > 65535) + port_max = 65535; + + *port_min_out = (uint16_t) port_min; + *port_max_out = (uint16_t) port_max; + + return 0; +} + +/** Parse a string s in the format of + * (IP(/mask|/mask-bits)?|*)(:(*|port(-maxport))?)?, setting the various + * *out pointers as appropriate. Return 0 on success, -1 on failure. + */ +int +parse_addr_and_port_range(const char *s, uint32_t *addr_out, + maskbits_t *maskbits_out, uint16_t *port_min_out, + uint16_t *port_max_out) +{ + char *address; + char *mask, *port, *endptr; + struct in_addr in; + int bits; + + tor_assert(s); + tor_assert(addr_out); + tor_assert(maskbits_out); + tor_assert(port_min_out); + tor_assert(port_max_out); + + address = tor_strdup(s); + /* Break 'address' into separate strings. + */ + mask = strchr(address,'/'); + port = strchr(mask?mask:address,':'); + if (mask) + *mask++ = '\0'; + if (port) + *port++ = '\0'; + /* Now "address" is the IP|'*' part... + * "mask" is the Mask|Maskbits part... + * and "port" is the *|port|min-max part. + */ + + if (strcmp(address,"*")==0) { + *addr_out = 0; + } else if (tor_inet_aton(address, &in) != 0) { + *addr_out = ntohl(in.s_addr); + } else { + log_warn(LD_GENERAL, "Malformed IP %s in address pattern; rejecting.", + escaped(address)); + goto err; + } + + if (!mask) { + if (strcmp(address,"*")==0) + *maskbits_out = 0; + else + *maskbits_out = 32; + } else { + endptr = NULL; + bits = (int) strtol(mask, &endptr, 10); + if (!*endptr) { + /* strtol handled the whole mask. */ + if (bits < 0 || bits > 32) { + log_warn(LD_GENERAL, + "Bad number of mask bits on address range; rejecting."); + goto err; + } + *maskbits_out = bits; + } else if (tor_inet_aton(mask, &in) != 0) { + bits = addr_mask_get_bits(ntohl(in.s_addr)); + if (bits < 0) { + log_warn(LD_GENERAL, + "Mask %s on address range isn't a prefix; dropping", + escaped(mask)); + goto err; + } + *maskbits_out = bits; + } else { + log_warn(LD_GENERAL, + "Malformed mask %s on address range; rejecting.", + escaped(mask)); + goto err; + } + } + + if (parse_port_range(port, port_min_out, port_max_out)<0) + goto err; + + tor_free(address); + return 0; + err: + tor_free(address); + return -1; +} + +/** Given an IPv4 in_addr struct *in (in network order, as usual), + * write it as a string into the buf_len-byte buffer in + * buf. + */ +int +tor_inet_ntoa(const struct in_addr *in, char *buf, size_t buf_len) +{ + uint32_t a = ntohl(in->s_addr); + return tor_snprintf(buf, buf_len, "%d.%d.%d.%d", + (int)(uint8_t)((a>>24)&0xff), + (int)(uint8_t)((a>>16)&0xff), + (int)(uint8_t)((a>>8 )&0xff), + (int)(uint8_t)((a )&0xff)); +} + +/** Given a host-order addr, call tor_inet_ntop() on it + * and return a strdup of the resulting address. + */ +char * +tor_dup_ip(uint32_t addr) +{ + char buf[TOR_ADDR_BUF_LEN]; + struct in_addr in; + + in.s_addr = htonl(addr); + tor_inet_ntop(AF_INET, &in, buf, sizeof(buf)); + return tor_strdup(buf); +} + +/** + * Set *addr to the host-order IPv4 address (if any) of whatever + * interface connects to the Internet. This address should only be used in + * checking whether our address has changed. Return 0 on success, -1 on + * failure. + */ +int +get_interface_address(int severity, uint32_t *addr) +{ + tor_addr_t local_addr; + int r; + + r = get_interface_address6(severity, AF_INET, &local_addr); + if (r>=0) + *addr = tor_addr_to_ipv4h(&local_addr); + return r; +} + diff -Nru tor-0.2.0.34/src/common/address.h tor-0.2.2.16-alpha/src/common/address.h --- tor-0.2.0.34/src/common/address.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/address.h 2010-03-07 04:03:27.000000000 +0000 @@ -0,0 +1,181 @@ +/* Copyright (c) 2003-2004, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file address.h + * \brief Headers for address.h + **/ + +#ifndef _TOR_ADDRESS_H +#define _TOR_ADDRESS_H + +#include "orconfig.h" +#include "torint.h" +#include "compat.h" + +/** The number of bits from an address to consider while doing a masked + * comparison. */ +typedef uint8_t maskbits_t; + +struct in_addr; +/** Holds an IPv4 or IPv6 address. (Uses less memory than struct + * sockaddr_storage.) */ +typedef struct tor_addr_t +{ + sa_family_t family; + union { + struct in_addr in_addr; + struct in6_addr in6_addr; + } addr; +} tor_addr_t; + +static INLINE const struct in6_addr *tor_addr_to_in6(const tor_addr_t *a); +static INLINE uint32_t tor_addr_to_ipv4n(const tor_addr_t *a); +static INLINE uint32_t tor_addr_to_ipv4h(const tor_addr_t *a); +static INLINE uint32_t tor_addr_to_mapped_ipv4h(const tor_addr_t *a); +static INLINE sa_family_t tor_addr_family(const tor_addr_t *a); +static INLINE const struct in_addr *tor_addr_to_in(const tor_addr_t *a); +static INLINE int tor_addr_eq_ipv4h(const tor_addr_t *a, uint32_t u); + +socklen_t tor_addr_to_sockaddr(const tor_addr_t *a, uint16_t port, + struct sockaddr *sa_out, socklen_t len); +int tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa, + uint16_t *port_out); +void tor_addr_make_unspec(tor_addr_t *a); + +/** Return an in6_addr* equivalent to a, or NULL if a is not + * an IPv6 address. */ +static INLINE const struct in6_addr * +tor_addr_to_in6(const tor_addr_t *a) +{ + return a->family == AF_INET6 ? &a->addr.in6_addr : NULL; +} + +#define tor_addr_to_in6_addr8(x) tor_addr_to_in6(x)->s6_addr +#define tor_addr_to_in6_addr16(x) S6_ADDR16(*tor_addr_to_in6(x)) +#define tor_addr_to_in6_addr32(x) S6_ADDR32(*tor_addr_to_in6(x)) + +/** Return an IPv4 address in network order for a, or 0 if + * a is not an IPv4 address. */ +static INLINE uint32_t +tor_addr_to_ipv4n(const tor_addr_t *a) +{ + return a->family == AF_INET ? a->addr.in_addr.s_addr : 0; +} +/** Return an IPv4 address in host order for a, or 0 if + * a is not an IPv4 address. */ +static INLINE uint32_t +tor_addr_to_ipv4h(const tor_addr_t *a) +{ + return ntohl(tor_addr_to_ipv4n(a)); +} +/* Given an IPv6 address, return its mapped IPv4 address in host order, or + * 0 if a is not an IPv6 address. + * + * (Does not check whether the address is really a mapped address */ +static INLINE uint32_t +tor_addr_to_mapped_ipv4h(const tor_addr_t *a) +{ + return a->family == AF_INET6 ? ntohl(tor_addr_to_in6_addr32(a)[3]) : 0; +} +/** Return the address family of a. Possible values are: + * AF_INET6, AF_INET, AF_UNSPEC. */ +static INLINE sa_family_t +tor_addr_family(const tor_addr_t *a) +{ + return a->family; +} +/** Return an in_addr* equivalent to a, or NULL if a is not + * an IPv4 address. */ +static INLINE const struct in_addr * +tor_addr_to_in(const tor_addr_t *a) +{ + return a->family == AF_INET ? &a->addr.in_addr : NULL; +} +/** Return true iff a is an IPv4 address equal to the host-ordered + * address in u. */ +static INLINE int +tor_addr_eq_ipv4h(const tor_addr_t *a, uint32_t u) +{ + return a->family == AF_INET ? (tor_addr_to_ipv4h(a) == u) : 0; +} + +#define TOR_ADDR_BUF_LEN 48 /* [ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255] + */ + +int tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr_out); +char *tor_dup_addr(const tor_addr_t *addr) ATTR_MALLOC; +const char *fmt_addr(const tor_addr_t *addr); +int get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr); + +/** Flag to specify how to do a comparison between addresses. In an "exact" + * comparison, addresses are equivalent only if they are in the same family + * with the same value. In a "semantic" comparison, IPv4 addresses match all + * IPv6 encodings of those addresses. */ +typedef enum { + CMP_EXACT, + CMP_SEMANTIC, +} tor_addr_comparison_t; + +int tor_addr_compare(const tor_addr_t *addr1, const tor_addr_t *addr2, + tor_addr_comparison_t how); +int tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2, + maskbits_t mask, tor_addr_comparison_t how); +/** Return true iff a and b are the same address. The comparison is done + * "exactly". */ +#define tor_addr_eq(a,b) (0==tor_addr_compare((a),(b),CMP_EXACT)) + +unsigned int tor_addr_hash(const tor_addr_t *addr); +int tor_addr_is_v4(const tor_addr_t *addr); +int tor_addr_is_internal(const tor_addr_t *ip, int for_listening) ATTR_PURE; + +/** Longest length that can be required for a reverse lookup name. */ +/* 32 nybbles, 32 dots, 8 characters of "ip6.arpa", 1 NUL: 73 characters. */ +#define REVERSE_LOOKUP_NAME_BUF_LEN 73 +int tor_addr_to_reverse_lookup_name(char *out, size_t outlen, + const tor_addr_t *addr); +int tor_addr_parse_reverse_lookup_name(tor_addr_t *result, const char *address, + int family, int accept_regular); + +int tor_addr_port_parse(const char *s, tor_addr_t *addr_out, + uint16_t *port_out); +int tor_addr_parse_mask_ports(const char *s, + tor_addr_t *addr_out, maskbits_t *mask_out, + uint16_t *port_min_out, uint16_t *port_max_out); +const char * tor_addr_to_str(char *dest, const tor_addr_t *addr, int len, + int decorate); +int tor_addr_from_str(tor_addr_t *addr, const char *src); +void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src); +void tor_addr_from_ipv4n(tor_addr_t *dest, uint32_t v4addr); +/** Set dest to the IPv4 address encoded in v4addr in host + * order. */ +#define tor_addr_from_ipv4h(dest, v4addr) \ + tor_addr_from_ipv4n((dest), htonl(v4addr)) +void tor_addr_from_ipv6_bytes(tor_addr_t *dest, const char *bytes); +#define tor_addr_from_in(dest, in) \ + tor_addr_from_ipv4n((dest), (in)->s_addr); +void tor_addr_from_in6(tor_addr_t *dest, const struct in6_addr *in6); +int tor_addr_is_null(const tor_addr_t *addr); +int tor_addr_is_loopback(const tor_addr_t *addr); + +/* IPv4 helpers */ +int is_internal_IP(uint32_t ip, int for_listening) ATTR_PURE; +int parse_addr_port(int severity, const char *addrport, char **address, + uint32_t *addr, uint16_t *port_out); +int parse_port_range(const char *port, uint16_t *port_min_out, + uint16_t *port_max_out); +int parse_addr_and_port_range(const char *s, uint32_t *addr_out, + maskbits_t *maskbits_out, uint16_t *port_min_out, + uint16_t *port_max_out); +int addr_mask_get_bits(uint32_t mask); +int addr_mask_cmp_bits(uint32_t a1, uint32_t a2, maskbits_t bits); +/** Length of a buffer to allocate to hold the results of tor_inet_ntoa.*/ +#define INET_NTOA_BUF_LEN 16 +int tor_inet_ntoa(const struct in_addr *in, char *buf, size_t buf_len); +char *tor_dup_ip(uint32_t addr) ATTR_MALLOC; +int get_interface_address(int severity, uint32_t *addr); + +#endif + diff -Nru tor-0.2.0.34/src/common/aes.c tor-0.2.2.16-alpha/src/common/aes.c --- tor-0.2.0.34/src/common/aes.c 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/aes.c 2010-07-13 01:37:00.000000000 +0000 @@ -1,10 +1,8 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: aes.c 13649 2008-02-21 09:01:32Z arma $ */ -const char aes_c_id[] = "$Id: aes.c 13649 2008-02-21 09:01:32Z arma $"; /** * \file aes.c @@ -23,15 +21,15 @@ #include "compat.h" #include "aes.h" #include "util.h" -#include "log.h" +#include "torlog.h" /* We have 3 strategies for getting AES: Via OpenSSL's AES_encrypt function, * via OpenSSL's EVP_EncryptUpdate function, or via the built-in AES * implementation below. */ -/** Defined iff we're using openssl's AES functions for AES. */ +/** Defined iff we're using OpenSSL's AES functions for AES. */ #undef USE_OPENSSL_AES -/** Defined iff we're using openssl's EVP code for AES. */ +/** Defined iff we're using OpenSSL's EVP code for AES. */ #undef USE_OPENSSL_EVP /** Defined iff we're using Tor's internal AES implementation, defined * below. */ @@ -66,13 +64,13 @@ !defined(USE_OPENSSL_EVP)) /* OpenSSL 0.9.7 was the first to support AES. It was slower than our - * builtin implementation. + * built-in implementation. * OpenSSL 0.9.8 added assembly implementations for i386 and ia64. * Either the i386 stuff isn't used for x86-64, or it isn't faster. * OpenSSL 0.9.9 (not yet out) has added assembly implementations for * x86_64 (aka amd64), sparc9, and arm * - * Note: the "f" at the end of openssl version numbers below means + * Note: the "f" at the end of OpenSSL version numbers below means * "release". */ # if defined(CPU_IS_X86) || defined(CPU_IS_IA64) # if OPENSSL_VERSION_NUMBER >= 0x0090800fL @@ -86,7 +84,7 @@ # endif # endif -/* Otherwise, use the builtin implementation below. */ +/* Otherwise, use the built-in implementation below. */ # ifndef USE_OPENSSL_AES # define USE_BUILTIN_AES # endif @@ -265,11 +263,12 @@ void aes_free_cipher(aes_cnt_cipher_t *cipher) { - assert(cipher); + if (!cipher) + return; #ifdef USE_OPENSSL_EVP EVP_CIPHER_CTX_cleanup(&cipher->key); #endif - memset(cipher, 0, sizeof(cipher)); + memset(cipher, 0, sizeof(aes_cnt_cipher_t)); tor_free(cipher); } @@ -382,7 +381,7 @@ * * @version 3.0 (December 2000) * - * Optimised ANSI C code for the Rijndael cipher (now AES) + * Optimized ANSI C code for the Rijndael cipher (now AES) * * @author Vincent Rijmen * @author Antoon Bosselaers diff -Nru tor-0.2.0.34/src/common/aes.h tor-0.2.2.16-alpha/src/common/aes.h --- tor-0.2.0.34/src/common/aes.h 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/aes.h 2010-03-07 04:03:27.000000000 +0000 @@ -1,14 +1,12 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: aes.h 13414 2008-02-07 16:10:33Z nickm $ */ /* Implements a minimal interface to counter-mode AES. */ -#ifndef __AES_H -#define __AES_H -#define AES_H_ID "$Id: aes.h 13414 2008-02-07 16:10:33Z nickm $" +#ifndef _TOR_AES_H +#define _TOR_AES_H /** * \file aes.h diff -Nru tor-0.2.0.34/src/common/ciphers.inc tor-0.2.2.16-alpha/src/common/ciphers.inc --- tor-0.2.0.34/src/common/ciphers.inc 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/ciphers.inc 2009-05-18 23:47:00.000000000 +0000 @@ -0,0 +1,143 @@ +/* This is an include file used to define the list of ciphers clients should + * advertise. Before including it, you should define the CIPHER and XCIPHER + * macros. */ +#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA + CIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) +#else + XCIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA + CIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA) +#else + XCIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_SHA + CIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) +#else + XCIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) +#endif +#ifdef TLS1_TXT_DHE_DSS_WITH_AES_256_SHA + CIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA) +#else + XCIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA) +#endif +#ifdef TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA + CIPHER(0xc00f, TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA) +#else + XCIPHER(0xc00f, TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA + CIPHER(0xc005, TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA) +#else + XCIPHER(0xc005, TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_RSA_WITH_AES_256_SHA + CIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA) +#else + XCIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA + CIPHER(0xc007, TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA) +#else + XCIPHER(0xc007, TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA + CIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA) +#else + XCIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA + CIPHER(0xc011, TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA) +#else + XCIPHER(0xc011, TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA + CIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA) +#else + XCIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA) +#endif +#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_SHA + CIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) +#else + XCIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) +#endif +#ifdef TLS1_TXT_DHE_DSS_WITH_AES_128_SHA + CIPHER(0x0032, TLS1_TXT_DHE_DSS_WITH_AES_128_SHA) +#else + XCIPHER(0x0032, TLS1_TXT_DHE_DSS_WITH_AES_128_SHA) +#endif +#ifdef TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA + CIPHER(0xc00c, TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA) +#else + XCIPHER(0xc00c, TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA) +#endif +#ifdef TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA + CIPHER(0xc00e, TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA) +#else + XCIPHER(0xc00e, TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA) +#endif +#ifdef TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA + CIPHER(0xc002, TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA) +#else + XCIPHER(0xc002, TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA) +#endif +#ifdef TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA + CIPHER(0xc004, TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA) +#else + XCIPHER(0xc004, TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA) +#endif +#ifdef SSL3_TXT_RSA_RC4_128_MD5 + CIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5) +#else + XCIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5) +#endif +#ifdef SSL3_TXT_RSA_RC4_128_SHA + CIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA) +#else + XCIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA) +#endif +#ifdef TLS1_TXT_RSA_WITH_AES_128_SHA + CIPHER(0x002f, TLS1_TXT_RSA_WITH_AES_128_SHA) +#else + XCIPHER(0x002f, TLS1_TXT_RSA_WITH_AES_128_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA + CIPHER(0xc008, TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA) +#else + XCIPHER(0xc008, TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA + CIPHER(0xc012, TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA) +#else + XCIPHER(0xc012, TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA) +#endif +#ifdef SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA + CIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) +#else + XCIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) +#endif +#ifdef SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA + CIPHER(0x0013, SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA) +#else + XCIPHER(0x0013, SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA) +#endif +#ifdef TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA + CIPHER(0xc00d, TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA) +#else + XCIPHER(0xc00d, TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA) +#endif +#ifdef TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA + CIPHER(0xc003, TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA) +#else + XCIPHER(0xc003, TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA) +#endif +#ifdef SSL3_TXT_RSA_FIPS_WITH_3DES_EDE_CBC_SHA + CIPHER(0xfeff, SSL3_TXT_RSA_FIPS_WITH_3DES_EDE_CBC_SHA) +#else + XCIPHER(0xfeff, SSL3_TXT_RSA_FIPS_WITH_3DES_EDE_CBC_SHA) +#endif +#ifdef SSL3_TXT_RSA_DES_192_CBC3_SHA + CIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA) +#else + XCIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA) +#endif diff -Nru tor-0.2.0.34/src/common/common_sha1.i tor-0.2.2.16-alpha/src/common/common_sha1.i --- tor-0.2.0.34/src/common/common_sha1.i 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/common_sha1.i 2010-09-17 01:31:43.000000000 +0000 @@ -0,0 +1,22 @@ +"a49c92a58f33eb7454cb793d49051cdac6f20154 crypto.c\n" +"d2d3e2b5b53f5ac736fbe1a2e0a1245aa30a5a7c aes.c\n" +"f373f6279cae53726c9742ba2cf5c4c7c5647a61 tortls.c\n" +"056836b8800684e9596977643104a65ce6e186af torgzip.c\n" +"8a94a093eb91f4485fbb1f7c85e4b132d7fc1f71 address.h\n" +"6d9d4c437926c293d8e3b129c7c24ca68876bf81 torlog.h\n" +"354d74dbd1fef109c13cd596f76a0e6d5ad12537 crypto.h\n" +"b9cbfcf76b6745880c72ab5a0627296d48c88c5a util.h\n" +"a01f143ed713f9b97297d9ce2ac1414e69e2e5f3 compat.h\n" +"c6ce73a3cc5e1fcccb15631cf39c43424753505c aes.h\n" +"f9a21b0a671a30e774bf131f46207767ce5f8a05 torint.h\n" +"9ef9b8fe4c8ae943ece93011ff42e63c7fcab5dc tortls.h\n" +"7faeaf90301ad7d5d8db105590524a949a25dccf strlcpy.c\n" +"f009567cb0708b2bfdff242353c07a7da6f4869f strlcat.c\n" +"fac55ab16d2bf7491f8446a240fd5873ed183269 torgzip.h\n" +"c37927b994be7686f15aa5727a7c56c83ddd32c3 container.h\n" +"da69f5f780f2a7a7bb523a618e4131c0686be26f ht.h\n" +"abb79235368f2a5f7d7d2d41c3185f1be1ce7c85 mempool.h\n" +"0e45e43fbde95e06eec32ee3461fdf1ff52f8654 memarea.h\n" +"d5a23f5ce3f8d4dff5b41fe128b744a7ea34bbd2 ciphers.inc\n" +"00f119f72d297997486d1dd4cbbf5a907ef9f3ad compat_libevent.h\n" +"19788352502fddc7cd01c0942095f4bb91ed2930 tortls_states.h\n" diff -Nru tor-0.2.0.34/src/common/compat.c tor-0.2.2.16-alpha/src/common/compat.c --- tor-0.2.0.34/src/common/compat.c 2009-02-09 03:12:30.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/compat.c 2010-09-12 02:54:22.000000000 +0000 @@ -1,10 +1,7 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: compat.c 18419 2009-02-09 03:12:02Z nickm $ */ -const char compat_c_id[] = - "$Id: compat.c 18419 2009-02-09 03:12:02Z nickm $"; /** * \file compat.c @@ -20,20 +17,17 @@ */ #define _GNU_SOURCE -#include "orconfig.h" #include "compat.h" #ifdef MS_WINDOWS #include #include +#include #endif #ifdef HAVE_UNAME #include #endif -#ifdef HAVE_SYS_TIME_H -#include -#endif #ifdef HAVE_UNISTD_H #include #endif @@ -49,40 +43,28 @@ #ifdef HAVE_FCNTL_H #include #endif -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif #ifdef HAVE_ERRNO_H #include #endif -#ifdef HAVE_NETINET_IN_H -#include -#endif #ifdef HAVE_ARPA_INET_H #include #endif + #ifndef HAVE_GETTIMEOFDAY #ifdef HAVE_FTIME #include #endif #endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif + #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_SYS_PARAM_H #include /* FreeBSD needs this to know what version it is */ #endif -#include #include #include -#include #include -#ifdef HAVE_PTHREAD_H -#include -#endif #ifdef HAVE_SIGNAL_H #include #endif @@ -98,14 +80,18 @@ #ifdef HAVE_SYS_SYSLIMITS_H #include #endif - -#ifdef USE_BSOCKETS -#include +#ifdef HAVE_SYS_FILE_H +#include +#endif +#if defined(HAVE_SYS_PRCTL_H) && defined(__linux__) +/* Only use the linux prctl; the IRIX prctl is totally different */ +#include #endif -#include "log.h" +#include "torlog.h" #include "util.h" #include "container.h" +#include "address.h" /* Inline the strl functions if the platform doesn't have them. */ #ifndef HAVE_STRLCPY @@ -116,14 +102,6 @@ #endif #ifdef HAVE_SYS_MMAN_H -/** Implementation for tor_mmap_t: holds the regular tor_mmap_t, along - * with extra fields needed for mmap()-based memory mapping. */ -typedef struct tor_mmap_impl_t { - tor_mmap_t base; - size_t mapping_size; /**< Size of the actual mapping. (This is this file - * size, rounded up to the nearest page.) */ -} tor_mmap_impl_t; - /** Try to create a memory mapping for filename and return it. On * failure, return NULL. Sets errno properly, using ERANGE to mean * "empty file". */ @@ -133,7 +111,7 @@ int fd; /* router file */ char *string; int page_size; - tor_mmap_impl_t *res; + tor_mmap_t *res; size_t size, filesize; tor_assert(filename); @@ -173,38 +151,35 @@ return NULL; } - res = tor_malloc_zero(sizeof(tor_mmap_impl_t)); - res->base.data = string; - res->base.size = filesize; + res = tor_malloc_zero(sizeof(tor_mmap_t)); + res->data = string; + res->size = filesize; res->mapping_size = size; - return &(res->base); + return res; } /** Release storage held for a memory mapping. */ void tor_munmap_file(tor_mmap_t *handle) { - tor_mmap_impl_t *h = SUBTYPE_P(handle, tor_mmap_impl_t, base); - munmap((char*)h->base.data, h->mapping_size); - tor_free(h); + munmap((char*)handle->data, handle->mapping_size); + tor_free(handle); } #elif defined(MS_WINDOWS) -/** Implementation for tor_mmap_t: holds the regular tor_mmap_t, along - * with extra fields needed for WIN32 memory mapping. */ -typedef struct win_mmap_t { - tor_mmap_t base; - HANDLE file_handle; - HANDLE mmap_handle; -} win_mmap_t; tor_mmap_t * tor_mmap_file(const char *filename) { - win_mmap_t *res = tor_malloc_zero(sizeof(win_mmap_t)); + TCHAR tfilename[MAX_PATH]= {0}; + tor_mmap_t *res = tor_malloc_zero(sizeof(tor_mmap_t)); int empty = 0; res->file_handle = INVALID_HANDLE_VALUE; res->mmap_handle = NULL; - - res->file_handle = CreateFile(filename, +#ifdef UNICODE + mbstowcs(tfilename,filename,MAX_PATH); +#else + strlcpy(tfilename,filename,MAX_PATH); +#endif + res->file_handle = CreateFile(tfilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, @@ -214,9 +189,9 @@ if (res->file_handle == INVALID_HANDLE_VALUE) goto win_err; - res->base.size = GetFileSize(res->file_handle, NULL); + res->size = GetFileSize(res->file_handle, NULL); - if (res->base.size == 0) { + if (res->size == 0) { log_info(LD_FS,"File \"%s\" is empty. Ignoring.",filename); empty = 1; goto err; @@ -230,17 +205,17 @@ #else 0, #endif - (res->base.size & 0xfffffffful), + (res->size & 0xfffffffful), NULL); if (res->mmap_handle == NULL) goto win_err; - res->base.data = (char*) MapViewOfFile(res->mmap_handle, - FILE_MAP_READ, - 0, 0, 0); - if (!res->base.data) + res->data = (char*) MapViewOfFile(res->mmap_handle, + FILE_MAP_READ, + 0, 0, 0); + if (!res->data) goto win_err; - return &(res->base); + return res; win_err: { DWORD e = GetLastError(); int severity = (e == ERROR_FILE_NOT_FOUND || e == ERROR_PATH_NOT_FOUND) ? @@ -256,23 +231,22 @@ err: if (empty) errno = ERANGE; - tor_munmap_file(&res->base); + tor_munmap_file(res); return NULL; } void tor_munmap_file(tor_mmap_t *handle) { - win_mmap_t *h = SUBTYPE_P(handle, win_mmap_t, base); if (handle->data) /* This is an ugly cast, but without it, "data" in struct tor_mmap_t would have to be redefined as non-const. */ UnmapViewOfFile( (LPVOID) handle->data); - if (h->mmap_handle != NULL) - CloseHandle(h->mmap_handle); - if (h->file_handle != INVALID_HANDLE_VALUE) - CloseHandle(h->file_handle); - tor_free(h); + if (handle->mmap_handle != NULL) + CloseHandle(handle->mmap_handle); + if (handle->file_handle != INVALID_HANDLE_VALUE) + CloseHandle(handle->file_handle); + tor_free(handle); } #else tor_mmap_t * @@ -325,7 +299,7 @@ int r; if (size == 0) return -1; /* no place for the NUL */ - if (size > SIZE_T_CEILING) + if (size > SSIZE_T_MAX-16) return -1; #ifdef MS_WINDOWS r = _vsnprintf(str, size, format, args); @@ -333,11 +307,105 @@ r = vsnprintf(str, size, format, args); #endif str[size-1] = '\0'; - if (r < 0 || ((size_t)r) >= size) + if (r < 0 || r >= (ssize_t)size) return -1; return r; } +/** + * Portable asprintf implementation. Does a printf() into a newly malloc'd + * string. Sets *strp to this string, and returns its length (not + * including the terminating NUL character). + * + * You can treat this function as if its implementation were something like +
+     char buf[_INFINITY_];
+     tor_snprintf(buf, sizeof(buf), fmt, args);
+     *strp = tor_strdup(buf);
+     return strlen(*strp):
+   
+ * Where _INFINITY_ is an imaginary constant so big that any string can fit + * into it. + */ +int +tor_asprintf(char **strp, const char *fmt, ...) +{ + int r; + va_list args; + va_start(args, fmt); + r = tor_vasprintf(strp, fmt, args); + va_end(args); + if (!*strp || r < 0) { + log_err(LD_BUG, "Internal error in asprintf"); + tor_assert(0); + } + return r; +} + +/** + * Portable vasprintf implementation. Does a printf() into a newly malloc'd + * string. Differs from regular vasprintf in the same ways that + * tor_asprintf() differs from regular asprintf. + */ +int +tor_vasprintf(char **strp, const char *fmt, va_list args) +{ + /* use a temporary variable in case *strp is in args. */ + char *strp_tmp=NULL; +#ifdef HAVE_VASPRINTF + /* If the platform gives us one, use it. */ + int r = vasprintf(&strp_tmp, fmt, args); + if (r < 0) + *strp = NULL; + else + *strp = strp_tmp; + return r; +#elif defined(_MSC_VER) + /* On Windows, _vsnprintf won't tell us the length of the string if it + * overflows, so we need to use _vcsprintf to tell how much to allocate */ + int len, r; + char *res; + len = _vscprintf(fmt, args); + if (len < 0) { + *strp = NULL; + return -1; + } + strp_tmp = tor_malloc(len + 1); + r = _vsnprintf(strp_tmp, len+1, fmt, args); + if (r != len) { + tor_free(strp_tmp); + *strp = NULL; + return -1; + } + *strp = strp_tmp; + return len; +#else + /* Everywhere else, we have a decent vsnprintf that tells us how many + * characters we need. We give it a try on a short buffer first, since + * it might be nice to avoid the second vsnprintf call. + */ + char buf[128]; + int len, r; + va_list tmp_args; + va_copy(tmp_args, args); + len = vsnprintf(buf, sizeof(buf), fmt, tmp_args); + va_end(tmp_args); + if (len < (int)sizeof(buf)) { + *strp = tor_strdup(buf); + return len; + } + strp_tmp = tor_malloc(len+1); + r = vsnprintf(strp_tmp, len+1, fmt, args); + if (r != len) { + tor_free(strp_tmp); + *strp = NULL; + return -1; + } + *strp = strp_tmp; + return len; +#endif +} + /** Given hlen bytes at haystack and nlen bytes at * needle, return a pointer to the first occurrence of the needle * within the haystack, or NULL if there is no such occurrence. @@ -429,12 +497,43 @@ 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, }; +/** Implementation of strtok_r for platforms whose coders haven't figured out + * how to write one. Hey guys! You can use this code here for free! */ +char * +tor_strtok_r_impl(char *str, const char *sep, char **lasts) +{ + char *cp, *start; + if (str) + start = cp = *lasts = str; + else if (!*lasts) + return NULL; + else + start = cp = *lasts; + + tor_assert(*sep); + if (sep[1]) { + while (*cp && !strchr(sep, *cp)) + ++cp; + } else { + tor_assert(strlen(sep) == 1); + cp = strchr(cp, *sep); + } + + if (!cp || !*cp) { + *lasts = NULL; + } else { + *cp++ = '\0'; + *lasts = cp; + } + return start; +} + #ifdef MS_WINDOWS /** Take a filename and return a pointer to its final element. This * function is called on __FILE__ to fix a MSVC nit where __FILE__ * contains the full path to the file. This is bad, because it * confuses users to find the home directory of the person who - * compiled the binary in their warrning messages. + * compiled the binary in their warning messages. */ const char * tor_fix_source_file(const char *fname) @@ -480,8 +579,21 @@ return v; } /** + * Read a 64-bit value beginning at cp. Equivalent to + * *(uint64_t*)(cp), but will not cause segfaults on platforms that forbid + * unaligned memory access. + */ +uint64_t +get_uint64(const char *cp) +{ + uint64_t v; + memcpy(&v,cp,8); + return v; +} + +/** * Set a 16-bit value beginning at cp to v. Equivalent to - * *(uint16_t)(cp) = v, but will not cause segfaults on platforms that forbid + * *(uint16_t*)(cp) = v, but will not cause segfaults on platforms that forbid * unaligned memory access. */ void set_uint16(char *cp, uint16_t v) @@ -490,16 +602,25 @@ } /** * Set a 32-bit value beginning at cp to v. Equivalent to - * *(uint32_t)(cp) = v, but will not cause segfaults on platforms that forbid + * *(uint32_t*)(cp) = v, but will not cause segfaults on platforms that forbid * unaligned memory access. */ void set_uint32(char *cp, uint32_t v) { memcpy(cp,&v,4); } +/** + * Set a 64-bit value beginning at cp to v. Equivalent to + * *(uint64_t*)(cp) = v, but will not cause segfaults on platforms that forbid + * unaligned memory access. */ +void +set_uint64(char *cp, uint64_t v) +{ + memcpy(cp,&v,8); +} /** - * Rename the file from to the file to. On unix, this is + * Rename the file from to the file to. On Unix, this is * the same as rename(2). On windows, this removes to first if * it already exists. * Returns 0 on success. Returns -1 and sets errno on failure. @@ -536,6 +657,142 @@ return 0; } +/** Represents a lockfile on which we hold the lock. */ +struct tor_lockfile_t { + char *filename; + int fd; +}; + +/** Try to get a lock on the lockfile filename, creating it as + * necessary. If someone else has the lock and blocking is true, + * wait until the lock is available. Otherwise return immediately whether + * we succeeded or not. + * + * Set *locked_out to true if somebody else had the lock, and to false + * otherwise. + * + * Return a tor_lockfile_t on success, NULL on failure. + * + * (Implementation note: because we need to fall back to fcntl on some + * platforms, these locks are per-process, not per-thread. If you want + * to do in-process locking, use tor_mutex_t like a normal person.) + */ +tor_lockfile_t * +tor_lockfile_lock(const char *filename, int blocking, int *locked_out) +{ + tor_lockfile_t *result; + int fd; + *locked_out = 0; + + log_info(LD_FS, "Locking \"%s\"", filename); + fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0600); + if (fd < 0) { + log_warn(LD_FS,"Couldn't open \"%s\" for locking: %s", filename, + strerror(errno)); + return NULL; + } + +#ifdef WIN32 + _lseek(fd, 0, SEEK_SET); + if (_locking(fd, blocking ? _LK_LOCK : _LK_NBLCK, 1) < 0) { + if (errno != EDEADLOCK) + log_warn(LD_FS,"Couldn't lock \"%s\": %s", filename, strerror(errno)); + else + *locked_out = 1; + close(fd); + return NULL; + } +#elif defined(HAVE_FLOCK) + if (flock(fd, LOCK_EX|(blocking ? 0 : LOCK_NB)) < 0) { + if (errno != EWOULDBLOCK) + log_warn(LD_FS,"Couldn't lock \"%s\": %s", filename, strerror(errno)); + else + *locked_out = 1; + close(fd); + return NULL; + } +#else + { + struct flock lock; + memset(&lock, 0, sizeof(lock)); + lock.l_type = F_WRLCK; + lock.l_whence = SEEK_SET; + if (fcntl(fd, blocking ? F_SETLKW : F_SETLK, &lock) < 0) { + if (errno != EACCES && errno != EAGAIN) + log_warn(LD_FS, "Couldn't lock \"%s\": %s", filename, strerror(errno)); + else + *locked_out = 1; + close(fd); + return NULL; + } + } +#endif + + result = tor_malloc(sizeof(tor_lockfile_t)); + result->filename = tor_strdup(filename); + result->fd = fd; + return result; +} + +/** Release the lock held as lockfile. */ +void +tor_lockfile_unlock(tor_lockfile_t *lockfile) +{ + tor_assert(lockfile); + + log_info(LD_FS, "Unlocking \"%s\"", lockfile->filename); +#ifdef WIN32 + _lseek(lockfile->fd, 0, SEEK_SET); + if (_locking(lockfile->fd, _LK_UNLCK, 1) < 0) { + log_warn(LD_FS,"Error unlocking \"%s\": %s", lockfile->filename, + strerror(errno)); + } +#elif defined(HAVE_FLOCK) + if (flock(lockfile->fd, LOCK_UN) < 0) { + log_warn(LD_FS, "Error unlocking \"%s\": %s", lockfile->filename, + strerror(errno)); + } +#else + /* Closing the lockfile is sufficient. */ +#endif + + close(lockfile->fd); + lockfile->fd = -1; + tor_free(lockfile->filename); + tor_free(lockfile); +} + +/* Some old versions of Unix didn't define constants for these values, + * and instead expect you to say 0, 1, or 2. */ +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +/** Return the position of fd with respect to the start of the file. */ +off_t +tor_fd_getpos(int fd) +{ +#ifdef WIN32 + return (off_t) _lseek(fd, 0, SEEK_CUR); +#else + return (off_t) lseek(fd, 0, SEEK_CUR); +#endif +} + +/** Move fd to the end of the file. Return -1 on error, 0 on success. */ +int +tor_fd_seekend(int fd) +{ +#ifdef WIN32 + return _lseek(fd, 0, SEEK_END) < 0 ? -1 : 0; +#else + return lseek(fd, 0, SEEK_END) < 0 ? -1 : 0; +#endif +} + #undef DEBUG_SOCKET_COUNTING #ifdef DEBUG_SOCKET_COUNTING /** A bitarray of all fds that should be passed to tor_socket_close(). Only @@ -549,6 +806,23 @@ * eventdns and libevent.) */ static int n_sockets_open = 0; +/** Mutex to protect open_sockets, max_socket, and n_sockets_open. */ +static tor_mutex_t *socket_accounting_mutex = NULL; + +static INLINE void +socket_accounting_lock(void) +{ + if (PREDICT_UNLIKELY(!socket_accounting_mutex)) + socket_accounting_mutex = tor_mutex_new(); + tor_mutex_acquire(socket_accounting_mutex); +} + +static INLINE void +socket_accounting_unlock(void) +{ + tor_mutex_release(socket_accounting_mutex); +} + /** As close(), but guaranteed to work for sockets across platforms (including * Windows, where close()ing a socket doesn't work. Returns 0 on success, -1 * on failure. */ @@ -556,28 +830,29 @@ tor_close_socket(int s) { int r = 0; -#ifdef DEBUG_SOCKET_COUNTING - if (s > max_socket || ! bitarray_is_set(open_sockets, s)) { - log_warn(LD_BUG, "Closing a socket (%d) that wasn't returned by tor_open_" - "socket(), or that was already closed or something.", s); - } else { - tor_assert(open_sockets && s <= max_socket); - bitarray_clear(open_sockets, s); - } -#endif + /* On Windows, you have to call close() on fds returned by open(), * and closesocket() on fds returned by socket(). On Unix, everything * gets close()'d. We abstract this difference by always using * tor_close_socket to close sockets, and always using close() on * files. */ -#ifdef USE_BSOCKETS - r = bclose(s); -#elif defined(MS_WINDOWS) +#if defined(MS_WINDOWS) r = closesocket(s); #else r = close(s); #endif + + socket_accounting_lock(); +#ifdef DEBUG_SOCKET_COUNTING + if (s > max_socket || ! bitarray_is_set(open_sockets, s)) { + log_warn(LD_BUG, "Closing a socket (%d) that wasn't returned by tor_open_" + "socket(), or that was already closed or something.", s); + } else { + tor_assert(open_sockets && s <= max_socket); + bitarray_clear(open_sockets, s); + } +#endif if (r == 0) { --n_sockets_open; } else { @@ -592,9 +867,11 @@ #endif r = -1; } + if (n_sockets_open < 0) log_warn(LD_BUG, "Our socket count is below zero: %d. Please submit a " "bug report.", n_sockets_open); + socket_accounting_unlock(); return r; } @@ -629,8 +906,10 @@ { int s = socket(domain, type, protocol); if (s >= 0) { + socket_accounting_lock(); ++n_sockets_open; mark_socket_open(s); + socket_accounting_unlock(); } return s; } @@ -641,8 +920,10 @@ { int s = accept(sockfd, addr, len); if (s >= 0) { + socket_accounting_lock(); ++n_sockets_open; mark_socket_open(s); + socket_accounting_unlock(); } return s; } @@ -651,7 +932,11 @@ int get_n_open_sockets(void) { - return n_sockets_open; + int n; + socket_accounting_lock(); + n = n_sockets_open; + socket_accounting_unlock(); + return n; } /** Turn socket into a nonblocking socket. @@ -659,7 +944,7 @@ void set_socket_nonblocking(int socket) { -#if defined(MS_WINDOWS) && !defined(USE_BSOCKETS) +#if defined(MS_WINDOWS) unsigned long nonblocking = 1; ioctlsocket(socket, FIONBIO, (unsigned long*) &nonblocking); #else @@ -692,6 +977,7 @@ int r; r = socketpair(family, type, protocol, fd); if (r == 0) { + socket_accounting_lock(); if (fd[0] >= 0) { ++n_sockets_open; mark_socket_open(fd[0]); @@ -700,10 +986,9 @@ ++n_sockets_open; mark_socket_open(fd[1]); } + socket_accounting_unlock(); } return r < 0 ? -errno : r; -#elif defined(USE_BSOCKETS) - return bsocketpair(family, type, protocol, fd); #else /* This socketpair does not work when localhost is down. So * it's really not the same thing at all. But it's close enough @@ -814,47 +1099,33 @@ int set_max_file_descriptors(rlim_t limit, int *max_out) { -#define DEFAULT_MAX_CONNECTIONS 15000 -#define CYGWIN_MAX_CONNECTIONS 3200 -#define IPHONE_MAX_CONNECTIONS 9999 /* Define some maximum connections values for systems where we cannot * automatically determine a limit. Re Cygwin, see * http://archives.seul.org/or/talk/Aug-2006/msg00210.html * For an iPhone, 9999 should work. For Windows and all other unknown * systems we use 15000 as the default. */ #ifndef HAVE_GETRLIMIT +#if defined(CYGWIN) || defined(__CYGWIN__) + const char *platform = "Cygwin"; + const unsigned long MAX_CONNECTIONS = 3200; +#elif defined(MS_WINDOWS) + const char *platform = "Windows"; + const unsigned long MAX_CONNECTIONS = 15000; +#else + const char *platform = "unknown platforms with no getrlimit()"; + const unsigned long MAX_CONNECTIONS = 15000; +#endif log_fn(LOG_INFO, LD_NET, "This platform is missing getrlimit(). Proceeding."); -#ifdef MS_WINDOWS - if (limit > DEFAULT_MAX_CONNECTIONS) { + if (limit > MAX_CONNECTIONS) { log_warn(LD_CONFIG, "We do not support more than %lu file descriptors " - "on Windows. Tried to raise to %lu.", - (unsigned long)DEFAULT_MAX_CONNECTIONS, (unsigned long)limit); - return -1; - } - limit = DEFAULT_MAX_CONNECTIONS; -#elif defined(CYGWIN) || defined(__CYGWIN__) - if (limit > CYGWIN_MAX_CONNECTIONS) { - log_warn(LD_CONFIG, "We do not support more than %lu file descriptors " - "when using Cygwin. Tried to raise to %lu.", - (unsigned long)CYGWIN_MAX_CONNECTIONS, (unsigned long)limit); - return -1; - } - limit = CYGWIN_MAX_CONNECTIONS; -#elif defined(IPHONE) - if (limit > IPHONE_MAX_CONNECTIONS) { - log_warn(LD_CONFIG, "We do not support more than %lu file descriptors " - "on iPhone. Tried to raise to %lu.", - (unsigned long)IPHONE_MAX_CONNECTIONS, (unsigned long)limit); + "on %s. Tried to raise to %lu.", + (unsigned long)MAX_CONNECTIONS, platform, (unsigned long)limit); return -1; } - limit = IPHONE_MAX_CONNECTIONS; -#else - /* Unknown system without getrlimit support. Use the default value.*/ - limit = DEFAULT_MAX_CONNECTIONS; -#endif -#else + limit = MAX_CONNECTIONS; +#else /* HAVE_GETRLIMIT */ struct rlimit rlim; tor_assert(limit > 0); @@ -897,7 +1168,7 @@ bad = 0; } } -#endif +#endif /* OPEN_MAX */ if (bad) { log_warn(LD_CONFIG,"Couldn't set maximum number of file descriptors: %s", strerror(errno)); @@ -906,7 +1177,7 @@ } /* leave some overhead for logs, etc, */ limit = rlim.rlim_cur; -#endif +#endif /* HAVE_GETRLIMIT */ if (limit < ULIMIT_BUFFER) { log_warn(LD_CONFIG, @@ -920,6 +1191,7 @@ return 0; } +#ifndef MS_WINDOWS /** Log details of current user and group credentials. Return 0 on * success. Logs and return -1 on failure. */ @@ -927,7 +1199,6 @@ log_credential_status(void) { #define CREDENTIAL_LOG_LEVEL LOG_INFO -#ifndef MS_WINDOWS /* Real, effective and saved UIDs */ uid_t ruid, euid, suid; /* Read, effective and saved GIDs */ @@ -984,18 +1255,17 @@ strerror(errno)); return -1; } else { - int i; + int i, retval = 0; char *strgid; char *s = NULL; - int formatting_error = 0; smartlist_t *elts = smartlist_create(); for (i = 0; iuser and switch to their * primary group. Return 0 on success. On failure, log and return -1. @@ -1057,9 +1326,18 @@ /* Properly switch egid,gid,euid,uid here or bail out */ if (setgroups(1, &pw->pw_gid)) { - log_warn(LD_GENERAL, "Error setting groups to gid %d: \"%s\". " - "If you set the \"User\" option, you must start Tor as root.", + log_warn(LD_GENERAL, "Error setting groups to gid %d: \"%s\".", (int)pw->pw_gid, strerror(errno)); + if (old_uid == pw->pw_uid) { + log_warn(LD_GENERAL, "Tor is already running as %s. You do not need " + "the \"User\" option if you are already running as the user " + "you want to be. (If you did not set the User option in your " + "torrc, check whether it was specified on the command line " + "by a startup script.)", user); + } else { + log_warn(LD_GENERAL, "If you set the \"User\" option, you must start Tor" + " as root."); + } return -1; } @@ -1130,6 +1408,18 @@ } have_already_switched_id = 1; /* mark success so we never try again */ + +#if defined(__linux__) && defined(HAVE_SYS_PRCTL_H) && defined(HAVE_PRCTL) +#ifdef PR_SET_DUMPABLE + if (pw->pw_uid) { + /* Re-enable core dumps if we're not running as root. */ + log_info(LD_CONFIG, "Re-enabling coredumps"); + if (prctl(PR_SET_DUMPABLE, 1)) { + log_warn(LD_CONFIG, "Unable to re-enable coredumps: %s",strerror(errno)); + } + } +#endif +#endif return 0; #else @@ -1165,14 +1455,14 @@ int tor_inet_aton(const char *str, struct in_addr* addr) { - int a,b,c,d; + unsigned a,b,c,d; char more; - if (sscanf(str, "%d.%d.%d.%d%c", &a,&b,&c,&d,&more) != 4) + if (tor_sscanf(str, "%3u.%3u.%3u.%3u%c", &a,&b,&c,&d,&more) != 4) return 0; - if (a < 0 || a > 255) return 0; - if (b < 0 || b > 255) return 0; - if (c < 0 || c > 255) return 0; - if (d < 0 || d > 255) return 0; + if (a > 255) return 0; + if (b > 255) return 0; + if (c > 255) return 0; + if (d > 255) return 0; addr->s_addr = htonl((a<<24) | (b<<16) | (c<<8) | d); return 1; } @@ -1290,7 +1580,7 @@ else if (!dot) eow = src+strlen(src); else { - int byte1,byte2,byte3,byte4; + unsigned byte1,byte2,byte3,byte4; char more; for (eow = dot-1; eow >= src && TOR_ISDIGIT(*eow); --eow) ; @@ -1298,13 +1588,11 @@ /* We use "scanf" because some platform inet_aton()s are too lax * about IPv4 addresses of the form "1.2.3" */ - if (sscanf(eow, "%d.%d.%d.%d%c", &byte1,&byte2,&byte3,&byte4,&more) != 4) + if (tor_sscanf(eow, "%3u.%3u.%3u.%3u%c", + &byte1,&byte2,&byte3,&byte4,&more) != 4) return 0; - if (byte1 > 255 || byte1 < 0 || - byte2 > 255 || byte2 < 0 || - byte3 > 255 || byte3 < 0 || - byte4 > 255 || byte4 < 0) + if (byte1 > 255 || byte2 > 255 || byte3 > 255 || byte4 > 255) return 0; words[6] = (byte1<<8) | byte2; @@ -1383,137 +1671,14 @@ if ((ret = tor_addr_lookup(name, AF_INET, &myaddr))) return ret; - if (IN_FAMILY(&myaddr) == AF_INET) { - *addr = IPV4IPh(&myaddr); + if (tor_addr_family(&myaddr) == AF_INET) { + *addr = tor_addr_to_ipv4h(&myaddr); return ret; } return -1; } -/** Similar behavior to Unix gethostbyname: resolve name, and set - * *addr to the proper IP address and family. The family - * argument (which must be AF_INET, AF_INET6, or AF_UNSPEC) declares a - * preferred family, though another one may be returned if only one - * family is implemented for this address. - * - * Return 0 on success, -1 on failure; 1 on transient failure. - */ -int -tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr) -{ - /* Perhaps eventually this should be replaced by a tor_getaddrinfo or - * something. - */ - struct in_addr iaddr; - struct in6_addr iaddr6; - tor_assert(name); - tor_assert(addr); - tor_assert(family == AF_INET || family == AF_UNSPEC); - memset(addr, 0, sizeof(addr)); /* Clear the extraneous fields. */ - if (!*name) { - /* Empty address is an error. */ - return -1; - } else if (tor_inet_pton(AF_INET, name, &iaddr)) { - /* It's an IPv4 IP. */ - addr->family = AF_INET; - memcpy(&addr->addr.in_addr, &iaddr, sizeof(struct in_addr)); - return 0; - } else if (tor_inet_pton(AF_INET6, name, &iaddr6)) { - addr->family = AF_INET6; - memcpy(&addr->addr.in6_addr, &iaddr6, sizeof(struct in6_addr)); - return 0; - } else { -#ifdef HAVE_GETADDRINFO - int err; - struct addrinfo *res=NULL, *res_p; - struct addrinfo *best=NULL; - struct addrinfo hints; - int result = -1; - memset(&hints, 0, sizeof(hints)); - hints.ai_family = family; - hints.ai_socktype = SOCK_STREAM; - err = getaddrinfo(name, NULL, &hints, &res); - if (!err) { - best = NULL; - for (res_p = res; res_p; res_p = res_p->ai_next) { - if (family == AF_UNSPEC) { - if (res_p->ai_family == AF_INET) { - best = res_p; - break; - } else if (res_p->ai_family == AF_INET6 && !best) { - best = res_p; - } - } else if (family == res_p->ai_family) { - best = res_p; - break; - } - } - if (!best) - best = res; - if (best->ai_family == AF_INET) { - addr->family = AF_INET; - memcpy(&addr->addr.in_addr, - &((struct sockaddr_in*)best->ai_addr)->sin_addr, - sizeof(struct in_addr)); - result = 0; - } else if (best->ai_family == AF_INET6) { - addr->family = AF_INET6; - memcpy(&addr->addr.in6_addr, - &((struct sockaddr_in6*)best->ai_addr)->sin6_addr, - sizeof(struct in6_addr)); - result = 0; - } - freeaddrinfo(res); - return result; - } - return (err == EAI_AGAIN) ? 1 : -1; -#else - struct hostent *ent; - int err; -#ifdef HAVE_GETHOSTBYNAME_R_6_ARG - char buf[2048]; - struct hostent hostent; - int r; - r = gethostbyname_r(name, &hostent, buf, sizeof(buf), &ent, &err); -#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG) - char buf[2048]; - struct hostent hostent; - ent = gethostbyname_r(name, &hostent, buf, sizeof(buf), &err); -#elif defined(HAVE_GETHOSTBYNAME_R_3_ARG) - struct hostent_data data; - struct hostent hent; - memset(&data, 0, sizeof(data)); - err = gethostbyname_r(name, &hent, &data); - ent = err ? NULL : &hent; -#else - ent = gethostbyname(name); -#ifdef MS_WINDOWS - err = WSAGetLastError(); -#else - err = h_errno; -#endif -#endif /* endif HAVE_GETHOSTBYNAME_R_6_ARG. */ - if (ent) { - addr->family = ent->h_addrtype; - if (ent->h_addrtype == AF_INET) { - memcpy(&addr->addr.in_addr, ent->h_addr, sizeof(struct in_addr)); - } else if (ent->h_addrtype == AF_INET6) { - memcpy(&addr->addr.in6_addr, ent->h_addr, sizeof(struct in6_addr)); - } else { - tor_assert(0); /* gethostbyname() returned a bizarre addrtype */ - } - return 0; - } -#ifdef MS_WINDOWS - return (err == WSATRY_AGAIN) ? 1 : -1; -#else - return (err == TRY_AGAIN) ? 1 : -1; -#endif -#endif - } -} - /** Hold the result of our call to uname. */ static char uname_result[256]; /** True iff uname_result is set. */ @@ -1530,7 +1695,7 @@ if (!uname_result_is_set) { #ifdef HAVE_UNAME if (uname(&u) != -1) { - /* (linux says 0 is success, solaris says 1 is success) */ + /* (Linux says 0 is success, Solaris says 1 is success) */ tor_snprintf(uname_result, sizeof(uname_result), "%s %s", u.sysname, u.machine); } else @@ -1539,13 +1704,14 @@ #ifdef MS_WINDOWS OSVERSIONINFOEX info; int i; - unsigned int leftover_mask; const char *plat = NULL; const char *extra = NULL; + char acsd[MAX_PATH] = {0}; static struct { unsigned major; unsigned minor; const char *version; } win_version_table[] = { - { 6, 0, "Windows \"Longhorn\"" }, + { 6, 1, "Windows 7" }, + { 6, 0, "Windows Vista" }, { 5, 2, "Windows Server 2003" }, { 5, 1, "Windows XP" }, { 5, 0, "Windows 2000" }, @@ -1556,25 +1722,6 @@ { 3, 51, "Windows NT 3.51" }, { 0, 0, NULL } }; -#ifdef VER_SUITE_BACKOFFICE - static struct { - unsigned int mask; const char *str; - } win_mask_table[] = { - { VER_SUITE_BACKOFFICE, " {backoffice}" }, - { VER_SUITE_BLADE, " {\"blade\" (2003, web edition)}" }, - { VER_SUITE_DATACENTER, " {datacenter}" }, - { VER_SUITE_ENTERPRISE, " {enterprise}" }, - { VER_SUITE_EMBEDDEDNT, " {embedded}" }, - { VER_SUITE_PERSONAL, " {personal}" }, - { VER_SUITE_SINGLEUSERTS, - " {terminal services, single user}" }, - { VER_SUITE_SMALLBUSINESS, " {small business}" }, - { VER_SUITE_SMALLBUSINESS_RESTRICTED, - " {small business, restricted}" }, - { VER_SUITE_TERMINAL, " {terminal services}" }, - { 0, NULL }, - }; -#endif memset(&info, 0, sizeof(info)); info.dwOSVersionInfoSize = sizeof(info); if (! GetVersionEx((LPOSVERSIONINFO)&info)) { @@ -1583,14 +1730,19 @@ uname_result_is_set = 1; return uname_result; } +#ifdef UNICODE + wcstombs(acsd, info.szCSDVersion, MAX_PATH); +#else + strlcpy(acsd, info.szCSDVersion, sizeof(acsd)); +#endif if (info.dwMajorVersion == 4 && info.dwMinorVersion == 0) { if (info.dwPlatformId == VER_PLATFORM_WIN32_NT) plat = "Windows NT 4.0"; else plat = "Windows 95"; - if (info.szCSDVersion[1] == 'B') + if (acsd[1] == 'B') extra = "OSR2 (B)"; - else if (info.szCSDVersion[1] == 'C') + else if (acsd[1] == 'C') extra = "OSR2 (C)"; } else { for (i=0; win_version_table[i].major>0; ++i) { @@ -1602,29 +1754,30 @@ } } if (plat && !strcmp(plat, "Windows 98")) { - if (info.szCSDVersion[1] == 'A') + if (acsd[1] == 'A') extra = "SE (A)"; - else if (info.szCSDVersion[1] == 'B') + else if (acsd[1] == 'B') extra = "SE (B)"; } if (plat) { if (!extra) - extra = info.szCSDVersion; + extra = acsd; tor_snprintf(uname_result, sizeof(uname_result), "%s %s", plat, extra); } else { if (info.dwMajorVersion > 6 || - (info.dwMajorVersion==6 && info.dwMinorVersion>0)) + (info.dwMajorVersion==6 && info.dwMinorVersion>1)) tor_snprintf(uname_result, sizeof(uname_result), "Very recent version of Windows [major=%d,minor=%d] %s", (int)info.dwMajorVersion,(int)info.dwMinorVersion, - info.szCSDVersion); + acsd); else tor_snprintf(uname_result, sizeof(uname_result), "Unrecognized version of Windows [major=%d,minor=%d] %s", (int)info.dwMajorVersion,(int)info.dwMinorVersion, - info.szCSDVersion); + acsd); } +#if !defined (WINCE) #ifdef VER_SUITE_BACKOFFICE if (info.wProductType == VER_NT_DOMAIN_CONTROLLER) { strlcat(uname_result, " [domain controller]", sizeof(uname_result)); @@ -1633,18 +1786,7 @@ } else if (info.wProductType == VER_NT_WORKSTATION) { strlcat(uname_result, " [workstation]", sizeof(uname_result)); } - leftover_mask = info.wSuiteMask; - for (i = 0; win_mask_table[i].mask; ++i) { - if (info.wSuiteMask & win_mask_table[i].mask) { - strlcat(uname_result, win_mask_table[i].str, sizeof(uname_result)); - leftover_mask &= ~win_mask_table[i].mask; - } - } - if (leftover_mask) { - size_t len = strlen(uname_result); - tor_snprintf(uname_result+len, sizeof(uname_result)-len, - " {0x%x}", info.wSuiteMask); - } +#endif #endif #else strlcpy(uname_result, "Unknown platform", sizeof(uname_result)); @@ -1691,7 +1833,7 @@ #endif /** Minimalist interface to run a void function in the background. On - * unix calls fork, on win32 calls beginthread. Returns -1 on failure. + * Unix calls fork, on win32 calls beginthread. Returns -1 on failure. * func should not return, but rather should call spawn_exit. * * NOTE: if data is used, it should not be allocated on the stack, @@ -1754,7 +1896,6 @@ * call _exit, not exit, from child processes. */ _exit(0); #endif - } /** Set *timeval to the current time of day. On error, log and terminate. @@ -1765,7 +1906,7 @@ { #ifdef MS_WINDOWS /* Epoch bias copied from perl: number of units between windows epoch and - * unix epoch. */ + * Unix epoch. */ #define EPOCH_BIAS U64_LITERAL(116444736000000000) #define UNITS_PER_SEC U64_LITERAL(10000000) #define USEC_PER_SEC U64_LITERAL(1000000) @@ -1774,8 +1915,15 @@ uint64_t ft_64; FILETIME ft_ft; } ft; +#if defined (WINCE) + /* wince do not have GetSystemTimeAsFileTime */ + SYSTEMTIME stime; + GetSystemTime(&stime); + SystemTimeToFileTime(&stime,&ft.ft_ft); +#else /* number of 100-nsec units since Jan 1, 1601 */ GetSystemTimeAsFileTime(&ft.ft_ft); +#endif if (ft.ft_64 < EPOCH_BIAS) { log_err(LD_GENERAL,"System time is before 1970; failing."); exit(1); @@ -1863,73 +2011,16 @@ #endif #endif -#if defined(USE_WIN32_THREADS) && 0 -/** A generic lock structure for multithreaded builds. */ -struct tor_mutex_t { - HANDLE handle; -}; -tor_mutex_t * -tor_mutex_new(void) -{ - tor_mutex_t *m; - m = tor_malloc_zero(sizeof(tor_mutex_t)); - m->handle = CreateMutex(NULL, FALSE, NULL); - tor_assert(m->handle != NULL); - return m; -} -void -tor_mutex_free(tor_mutex_t *m) -{ - CloseHandle(m->handle); - tor_free(m); -} -void -tor_mutex_acquire(tor_mutex_t *m) -{ - DWORD r; - r = WaitForSingleObject(m->handle, INFINITE); - switch (r) { - case WAIT_ABANDONED: /* holding thread exited. */ - case WAIT_OBJECT_0: /* we got the mutex normally. */ - break; - case WAIT_TIMEOUT: /* Should never happen. */ - tor_assert(0); - break; - case WAIT_FAILED: - log_warn(LD_GENERAL, "Failed to acquire mutex: %d",(int) GetLastError()); - } -} +#if defined(USE_WIN32_THREADS) void -tor_mutex_release(tor_mutex_t *m) -{ - BOOL r; - r = ReleaseMutex(m->handle); - if (!r) { - log_warn(LD_GENERAL, "Failed to release mutex: %d", (int) GetLastError()); - } -} -unsigned long -tor_get_thread_id(void) -{ - return (unsigned long)GetCurrentThreadId(); -} -#elif defined(USE_WIN32_THREADS) -/** A generic lock structure for multithreaded builds. */ -struct tor_mutex_t { - CRITICAL_SECTION mutex; -}; -tor_mutex_t * -tor_mutex_new(void) +tor_mutex_init(tor_mutex_t *m) { - tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); InitializeCriticalSection(&m->mutex); - return m; } void -tor_mutex_free(tor_mutex_t *m) +tor_mutex_uninit(tor_mutex_t *m) { DeleteCriticalSection(&m->mutex); - tor_free(m); } void tor_mutex_acquire(tor_mutex_t *m) @@ -1948,18 +2039,18 @@ return (unsigned long)GetCurrentThreadId(); } #elif defined(USE_PTHREADS) -/** A generic lock structure for multithreaded builds. */ -struct tor_mutex_t { - pthread_mutex_t mutex; -}; +/** A mutex attribute that we're going to use to tell pthreads that we want + * "reentrant" mutexes (i.e., once we can re-lock if we're already holding + * them.) */ static pthread_mutexattr_t attr_reentrant; +/** True iff we've called tor_threads_init() */ static int threads_initialized = 0; -/** Allocate and return new lock. */ -tor_mutex_t * -tor_mutex_new(void) +/** Initialize mutex so it can be locked. Every mutex must be set + * up with tor_mutex_init() or tor_mutex_new(); not both. */ +void +tor_mutex_init(tor_mutex_t *mutex) { int err; - tor_mutex_t *mutex = tor_malloc_zero(sizeof(tor_mutex_t)); if (PREDICT_UNLIKELY(!threads_initialized)) tor_threads_init(); err = pthread_mutex_init(&mutex->mutex, &attr_reentrant); @@ -1967,7 +2058,6 @@ log_err(LD_GENERAL, "Error %d creating a mutex.", err); tor_fragile_assert(); } - return mutex; } /** Wait until m is free, then acquire it. */ void @@ -1993,9 +2083,11 @@ tor_fragile_assert(); } } -/** Free all storage held by the lock m. */ +/** Clean up the mutex m so that it no longer uses any system + * resources. Does not free m. This function must only be called on + * mutexes from tor_mutex_init(). */ void -tor_mutex_free(tor_mutex_t *m) +tor_mutex_uninit(tor_mutex_t *m) { int err; tor_assert(m); @@ -2004,7 +2096,6 @@ log_err(LD_GENERAL, "Error %d destroying a mutex.", err); tor_fragile_assert(); } - tor_free(m); } /** Return an integer representing this thread. */ unsigned long @@ -2017,11 +2108,26 @@ r.thr = pthread_self(); return r.id; } -#else -/** A generic lock structure for multithreaded builds. */ -struct tor_mutex_t { - int _unused; -}; +#endif + +#ifdef TOR_IS_MULTITHREADED +/** Return a newly allocated, ready-for-use mutex. */ +tor_mutex_t * +tor_mutex_new(void) +{ + tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); + tor_mutex_init(m); + return m; +} +/** Release all storage and system resources held by m. */ +void +tor_mutex_free(tor_mutex_t *m) +{ + if (!m) + return; + tor_mutex_uninit(m); + tor_free(m); +} #endif /* Conditions. */ @@ -2046,7 +2152,8 @@ void tor_cond_free(tor_cond_t *cond) { - tor_assert(cond); + if (!cond) + return; if (pthread_cond_destroy(&cond->cond)) { log_warn(LD_GENERAL,"Error freeing condition: %s", strerror(errno)); return; @@ -2082,6 +2189,7 @@ pthread_mutexattr_init(&attr_reentrant); pthread_mutexattr_settype(&attr_reentrant, PTHREAD_MUTEX_RECURSIVE); threads_initialized = 1; + set_main_thread(); } } #elif defined(USE_WIN32_THREADS) @@ -2102,7 +2210,8 @@ void tor_cond_free(tor_cond_t *cond) { - tor_assert(cond); + if (!cond) + return; DeleteCriticalSection(&cond->mutex); /* XXXX notify? */ smartlist_free(cond->events); @@ -2174,9 +2283,110 @@ #if 0 cond_event_tls_index = TlsAlloc(); #endif + set_main_thread(); } #endif +#if defined(HAVE_MLOCKALL) && HAVE_DECL_MLOCKALL && defined(RLIMIT_MEMLOCK) +/** Attempt to raise the current and max rlimit to infinity for our process. + * This only needs to be done once and can probably only be done when we have + * not already dropped privileges. + */ +static int +tor_set_max_memlock(void) +{ + /* Future consideration for Windows is probably SetProcessWorkingSetSize + * This is similar to setting the memory rlimit of RLIMIT_MEMLOCK + * http://msdn.microsoft.com/en-us/library/ms686234(VS.85).aspx + */ + + struct rlimit limit; + + /* RLIM_INFINITY is -1 on some platforms. */ + limit.rlim_cur = RLIM_INFINITY; + limit.rlim_max = RLIM_INFINITY; + + if (setrlimit(RLIMIT_MEMLOCK, &limit) == -1) { + if (errno == EPERM) { + log_warn(LD_GENERAL, "You appear to lack permissions to change memory " + "limits. Are you root?"); + } + log_warn(LD_GENERAL, "Unable to raise RLIMIT_MEMLOCK: %s", + strerror(errno)); + return -1; + } + + return 0; +} +#endif + +/** Attempt to lock all current and all future memory pages. + * This should only be called once and while we're privileged. + * Like mlockall() we return 0 when we're successful and -1 when we're not. + * Unlike mlockall() we return 1 if we've already attempted to lock memory. + */ +int +tor_mlockall(void) +{ + static int memory_lock_attempted = 0; + + if (memory_lock_attempted) { + return 1; + } + + memory_lock_attempted = 1; + + /* + * Future consideration for Windows may be VirtualLock + * VirtualLock appears to implement mlock() but not mlockall() + * + * http://msdn.microsoft.com/en-us/library/aa366895(VS.85).aspx + */ + +#if defined(HAVE_MLOCKALL) && HAVE_DECL_MLOCKALL && defined(RLIMIT_MEMLOCK) + if (tor_set_max_memlock() == 0) { + log_debug(LD_GENERAL, "RLIMIT_MEMLOCK is now set to RLIM_INFINITY."); + } + + if (mlockall(MCL_CURRENT|MCL_FUTURE) == 0) { + log_info(LD_GENERAL, "Insecure OS paging is effectively disabled."); + return 0; + } else { + if (errno == ENOSYS) { + /* Apple - it's 2009! I'm looking at you. Grrr. */ + log_notice(LD_GENERAL, "It appears that mlockall() is not available on " + "your platform."); + } else if (errno == EPERM) { + log_notice(LD_GENERAL, "It appears that you lack the permissions to " + "lock memory. Are you root?"); + } + log_notice(LD_GENERAL, "Unable to lock all current and future memory " + "pages: %s", strerror(errno)); + return -1; + } +#else + log_warn(LD_GENERAL, "Unable to lock memory pages. mlockall() unsupported?"); + return -1; +#endif +} + +/** Identity of the "main" thread */ +static unsigned long main_thread_id = -1; + +/** Start considering the current thread to be the 'main thread'. This has + * no effect on anything besides in_main_thread(). */ +void +set_main_thread(void) +{ + main_thread_id = tor_get_thread_id(); +} +/** Return true iff called from the main thread. */ +int +in_main_thread(void) +{ + return main_thread_id == tor_get_thread_id(); +} + /** * On Windows, WSAEWOULDBLOCK is not always correct: when you see it, * you need to ask the socket for its actual errno. Also, you need to @@ -2188,7 +2398,7 @@ * should call tor_socket_errno at most once on the failing * socket to get the error. */ -#if defined(MS_WINDOWS) && !defined(USE_BSOCKETS) +#if defined(MS_WINDOWS) int tor_socket_errno(int sock) { @@ -2204,7 +2414,7 @@ } #endif -#if defined(MS_WINDOWS) && !defined(USE_BSOCKETS) +#if defined(MS_WINDOWS) #define E(code, s) { code, (s " [" #code " ]") } struct { int code; const char *msg; } windows_socket_errors[] = { E(WSAEINTR, "Interrupted function call"), @@ -2265,7 +2475,7 @@ */ { -1, NULL }, }; -/** There does not seem to be a strerror equivalent for winsock errors. +/** There does not seem to be a strerror equivalent for Winsock errors. * Naturally, we have to roll our own. */ const char * @@ -2307,24 +2517,30 @@ /** Return a newly allocated string describing the windows system error code * err. Note that error codes are different from errno. Error codes * come from GetLastError() when a winapi call fails. errno is set only when - * ansi functions fail. Whee. */ + * ANSI functions fail. Whee. */ char * format_win32_error(DWORD err) { - LPVOID str = NULL; + TCHAR *str = NULL; char *result; /* Somebody once decided that this interface was better than strerror(). */ - FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &str, + (LPVOID)&str, 0, NULL); if (str) { - result = tor_strdup((char*)str); +#ifdef UNICODE + char abuf[1024] = {0}; + wcstombs(abuf,str,1024); + result = tor_strdup(abuf); +#else + result = tor_strdup(str); +#endif LocalFree(str); /* LocalFree != free() */ } else { result = tor_strdup(""); diff -Nru tor-0.2.0.34/src/common/compat.h tor-0.2.2.16-alpha/src/common/compat.h --- tor-0.2.0.34/src/common/compat.h 2009-01-21 04:12:12.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/compat.h 2010-05-25 04:57:59.000000000 +0000 @@ -1,12 +1,10 @@ -/* Copyright (c) 2003-2004, Roger Dingledinex +/* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: compat.h 18204 2009-01-21 03:57:51Z nickm $ */ -#ifndef __COMPAT_H -#define __COMPAT_H -#define COMPAT_H_ID "$Id: compat.h 18204 2009-01-21 03:57:51Z nickm $" +#ifndef _TOR_COMPAT_H +#define _TOR_COMPAT_H #include "orconfig.h" #include "torint.h" @@ -33,6 +31,9 @@ #ifdef HAVE_STRING_H #include #endif +#ifdef HAVE_PTHREAD_H +#include +#endif #include #ifdef HAVE_SYS_RESOURCE_H #include @@ -50,6 +51,22 @@ #include #endif +#if defined (WINCE) +#include +#include +#include +#include +#define snprintf _snprintf +/* this is not exported as W .... */ +#define SHGetPathFromIDListW SHGetPathFromIDList +/* wcecompat has vasprintf */ +#define HAVE_VASPRINTF +/* no service here */ +#ifdef NT_SERVICE +#undef NT_SERVICE +#endif +#endif // WINCE + #ifndef NULL_REP_IS_ZERO_BYTES #error "It seems your platform does not represent NULL as zero. We can't cope." #endif @@ -131,11 +148,21 @@ #define ATTR_NONNULL(x) /** Macro: Evaluates to exp and hints the compiler that the value - * of exp will probably be true. */ -#define PREDICT_LIKELY(exp) __builtin_expect((exp), 1) + * of exp will probably be true. + * + * In other words, "if (PREDICT_LIKELY(foo))" is the same as "if (foo)", + * except that it tells the compiler that the branch will be taken most of the + * time. This can generate slightly better code with some CPUs. + */ +#define PREDICT_LIKELY(exp) __builtin_expect(!!(exp), 1) /** Macro: Evaluates to exp and hints the compiler that the value - * of exp will probably be false. */ -#define PREDICT_UNLIKELY(exp) __builtin_expect((exp), 0) + * of exp will probably be false. + * + * In other words, "if (PREDICT_UNLIKELY(foo))" is the same as "if (foo)", + * except that it tells the compiler that the branch will usually not be + * taken. This can generate slightly better code with some CPUs. + */ +#define PREDICT_UNLIKELY(exp) __builtin_expect(!!(exp), 0) #else #define ATTR_NORETURN #define ATTR_PURE @@ -147,9 +174,12 @@ #define PREDICT_UNLIKELY(exp) (exp) #endif -/* Ways to declare macros. */ +/** Expands to a syntactically valid empty statement. */ #define STMT_NIL (void)0 + #ifdef __GNUC__ +/** STMT_BEGIN and STMT_END are used to wrap blocks inside macros so that + * the macro can be used as if it were a single C statement. */ #define STMT_BEGIN (void) ({ #define STMT_END }) #elif defined(sun) || defined(__sun__) @@ -163,8 +193,8 @@ /* ===== String compatibility */ #ifdef MS_WINDOWS /* Windows names string functions differently from most other platforms. */ -#define strncasecmp strnicmp -#define strcasecmp stricmp +#define strncasecmp _strnicmp +#define strcasecmp _stricmp #endif #ifndef HAVE_STRLCAT size_t strlcat(char *dst, const char *src, size_t siz) ATTR_NONNULL((1,2)); @@ -174,19 +204,34 @@ #endif #ifdef _MSC_VER +/** Casts the uint64_t value in a to the right type for an argument + * to printf. */ #define U64_PRINTF_ARG(a) (a) +/** Casts the uint64_t* value in a to the right type for an argument + * to scanf. */ #define U64_SCANF_ARG(a) (a) +/** Expands to a literal uint64_t-typed constant for the value n. */ #define U64_LITERAL(n) (n ## ui64) +#define I64_PRINTF_ARG(a) (a) +#define I64_SCANF_ARG(a) (a) +#define I64_LITERAL(n) (n ## i64) #else #define U64_PRINTF_ARG(a) ((long long unsigned int)(a)) #define U64_SCANF_ARG(a) ((long long unsigned int*)(a)) #define U64_LITERAL(n) (n ## llu) +#define I64_PRINTF_ARG(a) ((long long signed int)(a)) +#define I64_SCANF_ARG(a) ((long long signed int*)(a)) +#define I64_LITERAL(n) (n ## ll) #endif #if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) +/** The formatting string used to put a uint64_t value in a printf() or + * scanf() function. See also U64_PRINTF_ARG and U64_SCANF_ARG. */ #define U64_FORMAT "%I64u" +#define I64_FORMAT "%I64d" #else #define U64_FORMAT "%llu" +#define I64_FORMAT "%lld" #endif /** Represents an mmaped file. Allocated via tor_mmap_file; freed with @@ -194,6 +239,16 @@ typedef struct tor_mmap_t { const char *data; /**< Mapping of the file's contents. */ size_t size; /**< Size of the file. */ + + /* None of the fields below should be accessed from outside compat.c */ +#ifdef HAVE_SYS_MMAN_H + size_t mapping_size; /**< Size of the actual mapping. (This is this file + * size, rounded up to the nearest page.) */ +#elif defined MS_WINDOWS + HANDLE file_handle; + HANDLE mmap_handle; +#endif + } tor_mmap_t; tor_mmap_t *tor_mmap_file(const char *filename) ATTR_NONNULL((1)); @@ -204,6 +259,10 @@ int tor_vsnprintf(char *str, size_t size, const char *format, va_list args) ATTR_NONNULL((1,3)); +int tor_asprintf(char **strp, const char *fmt, ...) + CHECK_PRINTF(2,3); +int tor_vasprintf(char **strp, const char *fmt, va_list args); + const void *tor_memmem(const void *haystack, size_t hlen, const void *needle, size_t nlen) ATTR_PURE ATTR_NONNULL((1,3)); static const void *tor_memstr(const void *haystack, size_t hlen, @@ -236,6 +295,13 @@ #define TOR_TOLOWER(c) (TOR_TOLOWER_TABLE[(uint8_t)c]) #define TOR_TOUPPER(c) (TOR_TOUPPER_TABLE[(uint8_t)c]) +char *tor_strtok_r_impl(char *str, const char *sep, char **lasts); +#ifdef HAVE_STRTOK_R +#define tor_strtok_r(str, sep, lasts) strtok_r(str, sep, lasts) +#else +#define tor_strtok_r(str, sep, lasts) tor_strtok_r_impl(str, sep, lasts) +#endif + #ifdef MS_WINDOWS #define _SHORT_FILE_ (tor_fix_source_file(__FILE__)) const char *tor_fix_source_file(const char *fname); @@ -270,6 +336,14 @@ int replace_file(const char *from, const char *to); int touch_file(const char *fname); +typedef struct tor_lockfile_t tor_lockfile_t; +tor_lockfile_t *tor_lockfile_lock(const char *filename, int blocking, + int *locked_out); +void tor_lockfile_unlock(tor_lockfile_t *lockfile); + +off_t tor_fd_getpos(int fd); +int tor_fd_seekend(int fd); + #ifdef MS_WINDOWS #define PATH_SEPARATOR "\\" #else @@ -287,13 +361,8 @@ int tor_accept_socket(int sockfd, struct sockaddr *addr, socklen_t *len); int get_n_open_sockets(void); -#ifdef USE_BSOCKETS -#define tor_socket_send(s, buf, len, flags) bsend(s, buf, len, flags) -#define tor_socket_recv(s, buf, len, flags) brecv(s, buf, len, flags) -#else #define tor_socket_send(s, buf, len, flags) send(s, buf, len, flags) #define tor_socket_recv(s, buf, len, flags) recv(s, buf, len, flags) -#endif /* Define struct in6_addr on platforms that do not have it. Generally, * these platforms are ones without IPv6 support, but we want to have @@ -352,64 +421,6 @@ }; #endif -typedef uint8_t maskbits_t; -struct in_addr; -/** Holds an IPv4 or IPv6 address. (Uses less memory than struct - * sockaddr_storage.) */ -typedef struct tor_addr_t -{ - sa_family_t family; - union { - struct in_addr in_addr; - struct in6_addr in6_addr; - } addr; -} tor_addr_t; - -/* XXXX021 rename these. */ -static INLINE uint32_t IPV4IP(const tor_addr_t *a); -static INLINE uint32_t IPV4IPh(const tor_addr_t *a); -static INLINE uint32_t IPV4MAPh(const tor_addr_t *a); -static INLINE uint16_t IN_FAMILY(const tor_addr_t *a); -static INLINE const struct in_addr *IN4_ADDRESS(const tor_addr_t *a); -static INLINE const struct in6_addr *IN6_ADDRESS(const tor_addr_t *a); - -static INLINE const struct in6_addr * -IN6_ADDRESS(const tor_addr_t *a) -{ - return &a->addr.in6_addr; -} - -#define IN6_ADDRESS16(x) S6_ADDR16(*IN6_ADDRESS(x)) -#define IN6_ADDRESS32(x) S6_ADDR32(*IN6_ADDRESS(x)) - -static INLINE uint32_t -IPV4IP(const tor_addr_t *a) -{ - return a->addr.in_addr.s_addr; -} -static INLINE uint32_t IPV4IPh(const tor_addr_t *a) -{ - return ntohl(IPV4IP(a)); -} -static INLINE uint32_t -IPV4MAPh(const tor_addr_t *a) -{ - return ntohl(IN6_ADDRESS32(a)[3]); -} -static INLINE uint16_t -IN_FAMILY(const tor_addr_t *a) -{ - return a->family; -} -static INLINE const struct in_addr * -IN4_ADDRESS(const tor_addr_t *a) -{ - return &a->addr.in_addr; -} - -#define INET_NTOA_BUF_LEN 16 /* 255.255.255.255 */ -#define TOR_ADDR_BUF_LEN 46 /* ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255 */ - int tor_inet_aton(const char *cp, struct in_addr *addr) ATTR_NONNULL((1,2)); const char *tor_inet_ntop(int af, const void *src, char *dst, size_t len); int tor_inet_pton(int af, const char *src, void *dst); @@ -418,15 +429,13 @@ int tor_socketpair(int family, int type, int protocol, int fd[2]); int network_init(void); -int tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr_out); - /* For stupid historical reasons, windows sockets have an independent * set of errnos, and an independent way to get them. Also, you can't * always believe WSAEWOULDBLOCK. Use the macros below to compare * errnos against expected values, and use tor_socket_errno to find * the actual errno after a socket operation fails. */ -#if defined(MS_WINDOWS) && !defined(USE_BSOCKETS) +#if defined(MS_WINDOWS) /** Return true if e is EAGAIN or the local equivalent. */ #define ERRNO_IS_EAGAIN(e) ((e) == EAGAIN || (e) == WSAEWOULDBLOCK) /** Return true if e is EINPROGRESS or the local equivalent. */ @@ -458,13 +467,37 @@ #define tor_socket_strerror(e) strerror(e) #endif +/** Specified SOCKS5 status codes. */ +typedef enum { + SOCKS5_SUCCEEDED = 0x00, + SOCKS5_GENERAL_ERROR = 0x01, + SOCKS5_NOT_ALLOWED = 0x02, + SOCKS5_NET_UNREACHABLE = 0x03, + SOCKS5_HOST_UNREACHABLE = 0x04, + SOCKS5_CONNECTION_REFUSED = 0x05, + SOCKS5_TTL_EXPIRED = 0x06, + SOCKS5_COMMAND_NOT_SUPPORTED = 0x07, + SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED = 0x08, +} socks5_reply_status_t; + /* ===== OS compatibility */ const char *get_uname(void); uint16_t get_uint16(const char *cp) ATTR_PURE ATTR_NONNULL((1)); uint32_t get_uint32(const char *cp) ATTR_PURE ATTR_NONNULL((1)); +uint64_t get_uint64(const char *cp) ATTR_PURE ATTR_NONNULL((1)); void set_uint16(char *cp, uint16_t v) ATTR_NONNULL((1)); void set_uint32(char *cp, uint32_t v) ATTR_NONNULL((1)); +void set_uint64(char *cp, uint64_t v) ATTR_NONNULL((1)); + +/* These uint8 variants are defined to make the code more uniform. */ +#define get_uint8(cp) (*(const uint8_t*)(cp)) +static void set_uint8(char *cp, uint8_t v); +static INLINE void +set_uint8(char *cp, uint8_t v) +{ + *(uint8_t*)cp = v; +} #if !defined(HAVE_RLIM_T) typedef unsigned long rlim_t; @@ -493,23 +526,42 @@ * Linux, etc), we need locking for them. On platforms with poor thread * support or broken gethostbyname_r, these functions are no-ops. */ -typedef struct tor_mutex_t tor_mutex_t; +/** A generic lock structure for multithreaded builds. */ +typedef struct tor_mutex_t { +#if defined(USE_WIN32_THREADS) + CRITICAL_SECTION mutex; +#elif defined(USE_PTHREADS) + pthread_mutex_t mutex; +#else + int _unused; +#endif +} tor_mutex_t; + +int tor_mlockall(void); + #ifdef TOR_IS_MULTITHREADED tor_mutex_t *tor_mutex_new(void); +void tor_mutex_init(tor_mutex_t *m); void tor_mutex_acquire(tor_mutex_t *m); void tor_mutex_release(tor_mutex_t *m); void tor_mutex_free(tor_mutex_t *m); +void tor_mutex_uninit(tor_mutex_t *m); unsigned long tor_get_thread_id(void); void tor_threads_init(void); #else #define tor_mutex_new() ((tor_mutex_t*)tor_malloc(sizeof(int))) +#define tor_mutex_init(m) STMT_NIL #define tor_mutex_acquire(m) STMT_NIL #define tor_mutex_release(m) STMT_NIL #define tor_mutex_free(m) STMT_BEGIN tor_free(m); STMT_END +#define tor_mutex_uninit(m) STMT_NIL #define tor_get_thread_id() (1UL) #define tor_threads_init() STMT_NIL #endif +void set_main_thread(void); +int in_main_thread(void); + #ifdef TOR_IS_MULTITHREADED #if 0 typedef struct tor_cond_t tor_cond_t; @@ -521,6 +573,19 @@ #endif #endif +/** Macros for MIN/MAX. Never use these when the arguments could have + * side-effects. + * {With GCC extensions we could probably define a safer MIN/MAX. But + * depending on that safety would be dangerous, since not every platform + * has it.} + **/ +#ifndef MAX +#define MAX(a,b) ( ((a)<(b)) ? (b) : (a) ) +#endif +#ifndef MIN +#define MIN(a,b) ( ((a)>(b)) ? (b) : (a) ) +#endif + /* Platform-specific helpers. */ #ifdef MS_WINDOWS char *format_win32_error(DWORD err); diff -Nru tor-0.2.0.34/src/common/compat_libevent.c tor-0.2.2.16-alpha/src/common/compat_libevent.c --- tor-0.2.0.34/src/common/compat_libevent.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/compat_libevent.c 2010-08-11 03:14:15.000000000 +0000 @@ -0,0 +1,553 @@ +/* Copyright (c) 2009-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compat_libevent.c + * \brief Wrappers to handle porting between different versions of libevent. + * + * In an ideal world, we'd just use Libevent 2.0 from now on. But as of June + * 2009, Libevent 2.0 is still in alpha, and we will have old versions of + * Libevent for the forseeable future. + **/ + +#include "orconfig.h" +#include "compat.h" +#include "compat_libevent.h" + +#include "util.h" +#include "torlog.h" + +#ifdef HAVE_EVENT2_EVENT_H +#include +#else +#include +#endif + +/** A number representing a version of Libevent. + + This is a 4-byte number, with the first three bytes representing the + major, minor, and patchlevel respectively of the library. The fourth + byte is unused. + + This is equivalent to the format of LIBEVENT_VERSION_NUMBER on Libevent + 2.0.1 or later. For versions of Libevent before 1.4.0, which followed the + format of "1.0, 1.0a, 1.0b", we define 1.0 to be equivalent to 1.0.0, 1.0a + to be equivalent to 1.0.1, and so on. +*/ +typedef uint32_t le_version_t; + +/* Macros: returns the number of a libevent version. */ +#define V(major, minor, patch) \ + (((major) << 24) | ((minor) << 16) | ((patch) << 8)) +#define V_OLD(major, minor, patch) \ + V((major), (minor), (patch)-'a'+1) + +#define LE_OLD V(0,0,0) +#define LE_OTHER V(0,0,99) + +static le_version_t tor_get_libevent_version(const char **v_out); + +#ifdef HAVE_EVENT_SET_LOG_CALLBACK +/** A string which, if it appears in a libevent log, should be ignored. */ +static const char *suppress_msg = NULL; +/** Callback function passed to event_set_log() so we can intercept + * log messages from libevent. */ +static void +libevent_logging_callback(int severity, const char *msg) +{ + char buf[1024]; + size_t n; + if (suppress_msg && strstr(msg, suppress_msg)) + return; + n = strlcpy(buf, msg, sizeof(buf)); + if (n && n < sizeof(buf) && buf[n-1] == '\n') { + buf[n-1] = '\0'; + } + switch (severity) { + case _EVENT_LOG_DEBUG: + log(LOG_DEBUG, LD_NET, "Message from libevent: %s", buf); + break; + case _EVENT_LOG_MSG: + log(LOG_INFO, LD_NET, "Message from libevent: %s", buf); + break; + case _EVENT_LOG_WARN: + log(LOG_WARN, LD_GENERAL, "Warning from libevent: %s", buf); + break; + case _EVENT_LOG_ERR: + log(LOG_ERR, LD_GENERAL, "Error from libevent: %s", buf); + break; + default: + log(LOG_WARN, LD_GENERAL, "Message [%d] from libevent: %s", + severity, buf); + break; + } +} +/** Set hook to intercept log messages from libevent. */ +void +configure_libevent_logging(void) +{ + event_set_log_callback(libevent_logging_callback); +} +/** Ignore any libevent log message that contains msg. */ +void +suppress_libevent_log_msg(const char *msg) +{ + suppress_msg = msg; +} +#else +void +configure_libevent_logging(void) +{ +} +void +suppress_libevent_log_msg(const char *msg) +{ + (void)msg; +} +#endif + +#ifndef HAVE_EVENT2_EVENT_H +/** Work-alike replacement for event_new() on pre-Libevent-2.0 systems. */ +struct event * +tor_event_new(struct event_base *base, int sock, short what, + void (*cb)(int, short, void *), void *arg) +{ + struct event *e = tor_malloc_zero(sizeof(struct event)); + event_set(e, sock, what, cb, arg); + if (! base) + base = tor_libevent_get_base(); + event_base_set(base, e); + return e; +} +/** Work-alike replacement for evtimer_new() on pre-Libevent-2.0 systems. */ +struct event * +tor_evtimer_new(struct event_base *base, + void (*cb)(int, short, void *), void *arg) +{ + return tor_event_new(base, -1, 0, cb, arg); +} +/** Work-alike replacement for evsignal_new() on pre-Libevent-2.0 systems. */ +struct event * +tor_evsignal_new(struct event_base * base, int sig, + void (*cb)(int, short, void *), void *arg) +{ + return tor_event_new(base, sig, EV_SIGNAL|EV_PERSIST, cb, arg); +} +/** Work-alike replacement for event_free() on pre-Libevent-2.0 systems. */ +void +tor_event_free(struct event *ev) +{ + event_del(ev); + tor_free(ev); +} +#endif + +/** Global event base for use by the main thread. */ +struct event_base *the_event_base = NULL; + +/* This is what passes for version detection on OSX. We set + * MACOSX_KQUEUE_IS_BROKEN to true iff we're on a version of OSX before + * 10.4.0 (aka 1040). */ +#ifdef __APPLE__ +#ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ +#define MACOSX_KQUEUE_IS_BROKEN \ + (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1040) +#else +#define MACOSX_KQUEUE_IS_BROKEN 0 +#endif +#endif + +/** Initialize the Libevent library and set up the event base. */ +void +tor_libevent_initialize(void) +{ + tor_assert(the_event_base == NULL); + +#ifdef __APPLE__ + if (MACOSX_KQUEUE_IS_BROKEN || + tor_get_libevent_version(NULL) < V_OLD(1,1,'b')) { + setenv("EVENT_NOKQUEUE","1",1); + } +#endif + +#ifdef HAVE_EVENT2_EVENT_H + the_event_base = event_base_new(); +#else + the_event_base = event_init(); +#endif + +#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD) + /* Making this a NOTICE for now so we can link bugs to a libevent versions + * or methods better. */ + log(LOG_NOTICE, LD_GENERAL, + "Initialized libevent version %s using method %s. Good.", + event_get_version(), tor_libevent_get_method()); +#else + log(LOG_NOTICE, LD_GENERAL, + "Initialized old libevent (version 1.0b or earlier)."); + log(LOG_WARN, LD_GENERAL, + "You have a *VERY* old version of libevent. It is likely to be buggy; " + "please build Tor with a more recent version."); +#endif +} + +/** Return the current Libevent event base that we're set up to use. */ +struct event_base * +tor_libevent_get_base(void) +{ + return the_event_base; +} + +#ifndef HAVE_EVENT_BASE_LOOPEXIT +/* Replacement for event_base_loopexit on some very old versions of Libevent + that we are not yet brave enough to deprecate. */ +int +tor_event_base_loopexit(struct event_base *base, struct timeval *tv) +{ + tor_assert(base == the_event_base); + return event_loopexit(tv); +} +#endif + +/** Return the name of the Libevent backend we're using. */ +const char * +tor_libevent_get_method(void) +{ +#ifdef HAVE_EVENT2_EVENT_H + return event_base_get_method(the_event_base); +#elif defined(HAVE_EVENT_GET_METHOD) + return event_get_method(); +#else + return ""; +#endif +} + +/** Return the le_version_t for the current version of libevent. If the + * version is very new, return LE_OTHER. If the version is so old that it + * doesn't support event_get_version(), return LE_OLD. DOCDOC */ +static le_version_t +tor_decode_libevent_version(const char *v) +{ + unsigned major, minor, patchlevel; + char c, e, extra; + int fields; + + /* Try the new preferred "1.4.11-stable" format. + * Also accept "1.4.14b-stable". */ + fields = sscanf(v, "%u.%u.%u%c%c", &major, &minor, &patchlevel, &c, &e); + if (fields == 3 || + ((fields == 4 || fields == 5 ) && (c == '-' || c == '_')) || + (fields == 5 && TOR_ISALPHA(c) && (e == '-' || e == '_'))) { + return V(major,minor,patchlevel); + } + + /* Try the old "1.3e" format. */ + fields = sscanf(v, "%u.%u%c%c", &major, &minor, &c, &extra); + if (fields == 3 && TOR_ISALPHA(c)) { + return V_OLD(major, minor, c); + } else if (fields == 2) { + return V(major, minor, 0); + } + + return LE_OTHER; +} + +/** Return an integer representing the binary interface of a Libevent library. + * Two different versions with different numbers are sure not to be binary + * compatible. Two different versions with the same numbers have a decent + * chance of binary compatibility.*/ +static int +le_versions_compatibility(le_version_t v) +{ + if (v == LE_OTHER) + return 0; + if (v < V_OLD(1,0,'c')) + return 1; + else if (v < V(1,4,0)) + return 2; + else if (v < V(1,4,99)) + return 3; + else if (v < V(2,0,1)) + return 4; + else /* Everything 2.0 and later should be compatible. */ + return 5; +} + +/** Return the version number of the currently running version of Libevent. + See le_version_t for info on the format. + */ +static le_version_t +tor_get_libevent_version(const char **v_out) +{ + const char *v; + le_version_t r; +#if defined(HAVE_EVENT_GET_VERSION_NUMBER) + v = event_get_version(); + r = event_get_version_number(); +#elif defined (HAVE_EVENT_GET_VERSION) + v = event_get_version(); + r = tor_decode_libevent_version(v); +#else + v = "pre-1.0c"; + r = LE_OLD; +#endif + if (v_out) + *v_out = v; + return r; +} + +/** Return a string representation of the version of the currently running + * version of Libevent. */ +const char * +tor_libevent_get_version_str(void) +{ +#ifdef HAVE_EVENT_GET_VERSION + return event_get_version(); +#else + return "pre-1.0c"; +#endif +} + +/** + * Compare the current Libevent method and version to a list of versions + * which are known not to work. Warn the user as appropriate. + */ +void +tor_check_libevent_version(const char *m, int server, + const char **badness_out) +{ + int buggy = 0, iffy = 0, slow = 0, thread_unsafe = 0; + le_version_t version; + const char *v = NULL; + const char *badness = NULL; + const char *sad_os = ""; + + version = tor_get_libevent_version(&v); + + /* XXX Would it be worthwhile disabling the methods that we know + * are buggy, rather than just warning about them and then proceeding + * to use them? If so, we should probably not wrap this whole thing + * in HAVE_EVENT_GET_VERSION and HAVE_EVENT_GET_METHOD. -RD */ + /* XXXX The problem is that it's not trivial to get libevent to change it's + * method once it's initialized, and it's not trivial to tell what method it + * will use without initializing it. I guess we could preemptively disable + * buggy libevent modes based on the version _before_ initializing it, + * though, but then there's no good way (afaict) to warn "I would have used + * kqueue, but instead I'm using select." -NM */ + /* XXXX022 revist the above; it is fixable now. */ + if (!strcmp(m, "kqueue")) { + if (version < V_OLD(1,1,'b')) + buggy = 1; + } else if (!strcmp(m, "epoll")) { + if (version < V(1,1,0)) + iffy = 1; + } else if (!strcmp(m, "poll")) { + if (version < V_OLD(1,0,'e')) + buggy = 1; + if (version < V(1,1,0)) + slow = 1; + } else if (!strcmp(m, "select")) { + if (version < V(1,1,0)) + slow = 1; + } else if (!strcmp(m, "win32")) { + if (version < V_OLD(1,1,'b')) + buggy = 1; + } + + /* Libevent versions before 1.3b do very badly on operating systems with + * user-space threading implementations. */ +#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) + if (server && version < V_OLD(1,3,'b')) { + thread_unsafe = 1; + sad_os = "BSD variants"; + } +#elif defined(__APPLE__) || defined(__darwin__) + if (server && version < V_OLD(1,3,'b')) { + thread_unsafe = 1; + sad_os = "Mac OS X"; + } +#endif + + if (thread_unsafe) { + log(LOG_WARN, LD_GENERAL, + "Libevent version %s often crashes when running a Tor server with %s. " + "Please use the latest version of libevent (1.3b or later)",v,sad_os); + badness = "BROKEN"; + } else if (buggy) { + log(LOG_WARN, LD_GENERAL, + "There are serious bugs in using %s with libevent %s. " + "Please use the latest version of libevent.", m, v); + badness = "BROKEN"; + } else if (iffy) { + log(LOG_WARN, LD_GENERAL, + "There are minor bugs in using %s with libevent %s. " + "You may want to use the latest version of libevent.", m, v); + badness = "BUGGY"; + } else if (slow && server) { + log(LOG_WARN, LD_GENERAL, + "libevent %s can be very slow with %s. " + "When running a server, please use the latest version of libevent.", + v,m); + badness = "SLOW"; + } + + *badness_out = badness; +} + +#if defined(LIBEVENT_VERSION) +#define HEADER_VERSION LIBEVENT_VERSION +#elif defined(_EVENT_VERSION) +#define HEADER_VERSION _EVENT_VERSION +#endif + +/** See whether the headers we were built against differ from the library we + * linked against so much that we're likely to crash. If so, warn the + * user. */ +void +tor_check_libevent_header_compatibility(void) +{ + (void) le_versions_compatibility; + (void) tor_decode_libevent_version; + + /* In libevent versions before 2.0, it's hard to keep binary compatibility + * between upgrades, and unpleasant to detect when the version we compiled + * against is unlike the version we have linked against. Here's how. */ +#if defined(HEADER_VERSION) && defined(HAVE_EVENT_GET_VERSION) + /* We have a header-file version and a function-call version. Easy. */ + if (strcmp(HEADER_VERSION, event_get_version())) { + le_version_t v1, v2; + int compat1 = -1, compat2 = -1; + int verybad; + v1 = tor_decode_libevent_version(HEADER_VERSION); + v2 = tor_decode_libevent_version(event_get_version()); + compat1 = le_versions_compatibility(v1); + compat2 = le_versions_compatibility(v2); + + verybad = compat1 != compat2; + + log(verybad ? LOG_WARN : LOG_NOTICE, + LD_GENERAL, "We were compiled with headers from version %s " + "of Libevent, but we're using a Libevent library that says it's " + "version %s.", HEADER_VERSION, event_get_version()); + if (verybad) + log_warn(LD_GENERAL, "This will almost certainly make Tor crash."); + else + log_info(LD_GENERAL, "I think these versions are binary-compatible."); + } +#elif defined(HAVE_EVENT_GET_VERSION) + /* event_get_version but no _EVENT_VERSION. We might be in 1.4.0-beta or + earlier, where that's normal. To see whether we were compiled with an + earlier version, let's see whether the struct event defines MIN_HEAP_IDX. + */ +#ifdef HAVE_STRUCT_EVENT_MIN_HEAP_IDX + /* The header files are 1.4.0-beta or later. If the version is not + * 1.4.0-beta, we are incompatible. */ + { + if (strcmp(event_get_version(), "1.4.0-beta")) { + log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have " + "Libevent 1.4.0-beta header files, whereas you have linked " + "against Libevent %s. This will probably make Tor crash.", + event_get_version()); + } + } +#else + /* Our headers are 1.3e or earlier. If the library version is not 1.4.x or + later, we're probably fine. */ + { + const char *v = event_get_version(); + if ((v[0] == '1' && v[2] == '.' && v[3] > '3') || v[0] > '1') { + log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have " + "Libevent header file from 1.3e or earlier, whereas you have " + "linked against Libevent %s. This will probably make Tor " + "crash.", event_get_version()); + } + } +#endif + +#elif defined(HEADER_VERSION) +#warn "_EVENT_VERSION is defined but not get_event_version(): Libevent is odd." +#else + /* Your libevent is ancient. */ +#endif +} + +/* + If possible, we're going to try to use Libevent's periodic timer support, + since it does a pretty good job of making sure that periodic events get + called exactly M seconds apart, rather than starting each one exactly M + seconds after the time that the last one was run. + */ +#ifdef HAVE_EVENT2_EVENT_H +#define HAVE_PERIODIC +#define PERIODIC_FLAGS EV_PERSIST +#else +#define PERIODIC_FLAGS 0 +#endif + +/** Represents a timer that's run every N microseconds by Libevent. */ +struct periodic_timer_t { + /** Underlying event used to implement this periodic event. */ + struct event *ev; + /** The callback we'll be invoking whenever the event triggers */ + void (*cb)(struct periodic_timer_t *, void *); + /** User-supplied data for the callback */ + void *data; +#ifndef HAVE_PERIODIC + /** If Libevent doesn't know how to invoke events every N microseconds, + * we'll need to remember the timeout interval here. */ + struct timeval tv; +#endif +}; + +/** Libevent callback to implement a periodic event. */ +static void +periodic_timer_cb(evutil_socket_t fd, short what, void *arg) +{ + periodic_timer_t *timer = arg; + (void) what; + (void) fd; +#ifndef HAVE_PERIODIC + /** reschedule the event as needed. */ + event_add(timer->ev, &timer->tv); +#endif + timer->cb(timer, timer->data); +} + +/** Create and schedule a new timer that will run every tv in + * the event loop of base. When the timer fires, it will + * run the timer in cb with the user-supplied data in data. */ +periodic_timer_t * +periodic_timer_new(struct event_base *base, + const struct timeval *tv, + void (*cb)(periodic_timer_t *timer, void *data), + void *data) +{ + periodic_timer_t *timer; + tor_assert(base); + tor_assert(tv); + tor_assert(cb); + timer = tor_malloc_zero(sizeof(periodic_timer_t)); + if (!(timer->ev = tor_event_new(base, -1, PERIODIC_FLAGS, + periodic_timer_cb, timer))) { + tor_free(timer); + return NULL; + } + timer->cb = cb; + timer->data = data; +#ifndef HAVE_PERIODIC + memcpy(&timer->tv, tv, sizeof(struct timeval)); +#endif + event_add(timer->ev, (struct timeval *)tv); /*drop const for old libevent*/ + return timer; +} + +/** Stop and free a periodic timer */ +void +periodic_timer_free(periodic_timer_t *timer) +{ + if (!timer) + return; + tor_event_free(timer->ev); + tor_free(timer); +} + diff -Nru tor-0.2.0.34/src/common/compat_libevent.h tor-0.2.2.16-alpha/src/common/compat_libevent.h --- tor-0.2.0.34/src/common/compat_libevent.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/compat_libevent.h 2010-07-13 01:37:00.000000000 +0000 @@ -0,0 +1,65 @@ +/* Copyright (c) 2009, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef _TOR_COMPAT_LIBEVENT_H +#define _TOR_COMPAT_LIBEVENT_H + +#include "orconfig.h" + +struct event; +struct event_base; + +#ifdef HAVE_EVENT2_EVENT_H +#include +#else +#define evutil_socket_t int +#endif + +void configure_libevent_logging(void); +void suppress_libevent_log_msg(const char *msg); + +#ifdef HAVE_EVENT2_EVENT_H +#define tor_event_new event_new +#define tor_evtimer_new evtimer_new +#define tor_evsignal_new evsignal_new +#define tor_event_free event_free +#define tor_evdns_add_server_port(sock, tcp, cb, data) \ + evdns_add_server_port_with_base(tor_libevent_get_base(), \ + (sock),(tcp),(cb),(data)); + +#else +struct event *tor_event_new(struct event_base * base, evutil_socket_t sock, + short what, void (*cb)(evutil_socket_t, short, void *), void *arg); +struct event *tor_evtimer_new(struct event_base * base, + void (*cb)(evutil_socket_t, short, void *), void *arg); +struct event *tor_evsignal_new(struct event_base * base, int sig, + void (*cb)(evutil_socket_t, short, void *), void *arg); +void tor_event_free(struct event *ev); +#define tor_evdns_add_server_port evdns_add_server_port +#endif + +typedef struct periodic_timer_t periodic_timer_t; + +periodic_timer_t *periodic_timer_new(struct event_base *base, + const struct timeval *tv, + void (*cb)(periodic_timer_t *timer, void *data), + void *data); +void periodic_timer_free(periodic_timer_t *); + +#ifdef HAVE_EVENT_BASE_LOOPEXIT +#define tor_event_base_loopexit event_base_loopexit +#else +struct timeval; +int tor_event_base_loopexit(struct event_base *base, struct timeval *tv); +#endif + +void tor_libevent_initialize(void); +struct event_base *tor_libevent_get_base(void); +const char *tor_libevent_get_method(void); +void tor_check_libevent_version(const char *m, int server, + const char **badness_out); +void tor_check_libevent_header_compatibility(void); +const char *tor_libevent_get_version_str(void); + +#endif + diff -Nru tor-0.2.0.34/src/common/container.c tor-0.2.2.16-alpha/src/common/container.c --- tor-0.2.0.34/src/common/container.c 2009-01-20 23:02:47.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/container.c 2010-07-13 01:37:00.000000000 +0000 @@ -1,10 +1,7 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: container.c 18191 2009-01-20 23:02:46Z arma $ */ -const char container_c_id[] = - "$Id: container.c 18191 2009-01-20 23:02:46Z arma $"; /** * \file container.c @@ -16,7 +13,7 @@ #include "compat.h" #include "util.h" -#include "log.h" +#include "torlog.h" #include "container.h" #include "crypto.h" @@ -27,7 +24,7 @@ #include "ht.h" /** All newly allocated smartlists have this capacity. */ -#define SMARTLIST_DEFAULT_CAPACITY 32 +#define SMARTLIST_DEFAULT_CAPACITY 16 /** Allocate and return an empty smartlist. */ @@ -47,7 +44,8 @@ void smartlist_free(smartlist_t *sl) { - tor_assert(sl != NULL); + if (!sl) + return; tor_free(sl->list); tor_free(sl); } @@ -321,12 +319,17 @@ /** * Split a string str along all occurrences of sep, - * adding the split strings, in order, to sl. If - * flags&SPLIT_SKIP_SPACE is true, remove initial and - * trailing space from each entry. If - * flags&SPLIT_IGNORE_BLANK is true, remove any entries of - * length 0. If max>0, divide the string into no more than max - * pieces. If sep is NULL, split on any sequence of horizontal space. + * adding the split strings, in order, to sl. + * + * If flags&SPLIT_SKIP_SPACE is true, remove initial and + * trailing space from each entry. + * If flags&SPLIT_IGNORE_BLANK is true, remove any entries + * of length 0. + * If flags&SPLIT_STRIP_SPACE is true, strip spaces from each + * split string. + * + * If max>0, divide the string into no more than max pieces. If + * sep is NULL, split on any sequence of horizontal space. */ int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep, @@ -355,6 +358,8 @@ ; } + tor_assert(end); + if (!*end) { next = NULL; } else if (sep) { @@ -370,7 +375,10 @@ --end; } if (end != cp || !(flags&SPLIT_IGNORE_BLANK)) { - smartlist_add(sl, tor_strndup(cp, end-cp)); + char *string = tor_strndup(cp, end-cp); + if (flags&SPLIT_STRIP_SPACE) + tor_strstrip(string, " "); + smartlist_add(sl, string); ++n; } if (!next) @@ -452,6 +460,42 @@ (int (*)(const void *,const void*))compare); } +/** Given a smartlist sl sorted with the function compare, + * return the most frequent member in the list. Break ties in favor of + * later elements. If the list is empty, return NULL. + */ +void * +smartlist_get_most_frequent(const smartlist_t *sl, + int (*compare)(const void **a, const void **b)) +{ + const void *most_frequent = NULL; + int most_frequent_count = 0; + + const void *cur = NULL; + int i, count=0; + + if (!sl->num_used) + return NULL; + for (i = 0; i < sl->num_used; ++i) { + const void *item = sl->list[i]; + if (cur && 0 == compare(&cur, &item)) { + ++count; + } else { + if (cur && count >= most_frequent_count) { + most_frequent = cur; + most_frequent_count = count; + } + cur = item; + count = 1; + } + } + if (cur && count >= most_frequent_count) { + most_frequent = cur; + most_frequent_count = count; + } + return (void*)most_frequent; +} + /** Given a sorted smartlist sl and the comparison function used to * sort it, remove all duplicate members. If free_fn is provided, calls * free_fn on each duplicate. Otherwise, just removes them. Preserves order. @@ -543,6 +587,13 @@ smartlist_sort(sl, _compare_string_ptrs); } +/** Return the most frequent string in the sorted list sl */ +char * +smartlist_get_most_frequent_string(smartlist_t *sl) +{ + return smartlist_get_most_frequent(sl, _compare_string_ptrs); +} + /** Remove duplicate strings from a sorted list, and free them with tor_free(). */ void @@ -554,6 +605,38 @@ /* Heap-based priority queue implementation for O(lg N) insert and remove. * Recall that the heap property is that, for every index I, h[I] < * H[LEFT_CHILD[I]] and h[I] < H[RIGHT_CHILD[I]]. + * + * For us to remove items other than the topmost item, each item must store + * its own index within the heap. When calling the pqueue functions, tell + * them about the offset of the field that stores the index within the item. + * + * Example: + * + * typedef struct timer_t { + * struct timeval tv; + * int heap_index; + * } timer_t; + * + * static int compare(const void *p1, const void *p2) { + * const timer_t *t1 = p1, *t2 = p2; + * if (t1->tv.tv_sec < t2->tv.tv_sec) { + * return -1; + * } else if (t1->tv.tv_sec > t2->tv.tv_sec) { + * return 1; + * } else { + * return t1->tv.tv_usec - t2->tv_usec; + * } + * } + * + * void timer_heap_insert(smartlist_t *heap, timer_t *timer) { + * smartlist_pqueue_add(heap, compare, STRUCT_OFFSET(timer_t, heap_index), + * timer); + * } + * + * void timer_heap_pop(smartlist_t *heap) { + * return smartlist_pqueue_pop(heap, compare, + * STRUCT_OFFSET(timer_t, heap_index)); + * } */ /* For a 1-indexed array, we would use LEFT_CHILD[x] = 2*x and RIGHT_CHILD[x] @@ -565,12 +648,22 @@ #define RIGHT_CHILD(i) ( 2*(i) + 2 ) #define PARENT(i) ( ((i)-1) / 2 ) +#define IDXP(p) ((int*)STRUCT_VAR_P(p, idx_field_offset)) + +#define UPDATE_IDX(i) do { \ + void *updated = sl->list[i]; \ + *IDXP(updated) = i; \ + } while (0) + +#define IDX_OF_ITEM(p) (*IDXP(p)) + /** Helper. sl may have at most one violation of the heap property: * the item at idx may be greater than one or both of its children. * Restore the heap property. */ static INLINE void smartlist_heapify(smartlist_t *sl, int (*compare)(const void *a, const void *b), + int idx_field_offset, int idx) { while (1) { @@ -593,21 +686,28 @@ void *tmp = sl->list[idx]; sl->list[idx] = sl->list[best_idx]; sl->list[best_idx] = tmp; + UPDATE_IDX(idx); + UPDATE_IDX(best_idx); idx = best_idx; } } } -/** Insert item into the heap stored in sl, where order - * is determined by compare. */ +/** Insert item into the heap stored in sl, where order is + * determined by compare and the offset of the item in the heap is + * stored in an int-typed field at position idx_field_offset within + * item. + */ void smartlist_pqueue_add(smartlist_t *sl, int (*compare)(const void *a, const void *b), + int idx_field_offset, void *item) { int idx; smartlist_add(sl,item); + UPDATE_IDX(sl->num_used-1); for (idx = sl->num_used - 1; idx; ) { int parent = PARENT(idx); @@ -615,6 +715,8 @@ void *tmp = sl->list[parent]; sl->list[parent] = sl->list[idx]; sl->list[idx] = tmp; + UPDATE_IDX(parent); + UPDATE_IDX(idx); idx = parent; } else { return; @@ -623,32 +725,63 @@ } /** Remove and return the top-priority item from the heap stored in sl, - * where order is determined by compare. sl must not be - * empty. */ + * where order is determined by compare and the item's position is + * stored at position idx_field_offset within the item. sl must + * not be empty. */ void * smartlist_pqueue_pop(smartlist_t *sl, - int (*compare)(const void *a, const void *b)) + int (*compare)(const void *a, const void *b), + int idx_field_offset) { void *top; tor_assert(sl->num_used); top = sl->list[0]; + *IDXP(top)=-1; if (--sl->num_used) { sl->list[0] = sl->list[sl->num_used]; - smartlist_heapify(sl, compare, 0); + UPDATE_IDX(0); + smartlist_heapify(sl, compare, idx_field_offset, 0); } return top; } +/** Remove the item item from the heap stored in sl, + * where order is determined by compare and the item's position is + * stored at position idx_field_offset within the item. sl must + * not be empty. */ +void +smartlist_pqueue_remove(smartlist_t *sl, + int (*compare)(const void *a, const void *b), + int idx_field_offset, + void *item) +{ + int idx = IDX_OF_ITEM(item); + tor_assert(idx >= 0); + tor_assert(sl->list[idx] == item); + --sl->num_used; + *IDXP(item) = -1; + if (idx == sl->num_used) { + return; + } else { + sl->list[idx] = sl->list[sl->num_used]; + UPDATE_IDX(idx); + smartlist_heapify(sl, compare, idx_field_offset, idx); + } +} + /** Assert that the heap property is correctly maintained by the heap stored * in sl, where order is determined by compare. */ void smartlist_pqueue_assert_ok(smartlist_t *sl, - int (*compare)(const void *a, const void *b)) + int (*compare)(const void *a, const void *b), + int idx_field_offset) { int i; - for (i = sl->num_used - 1; i > 0; --i) { - tor_assert(compare(sl->list[PARENT(i)], sl->list[i]) <= 0); + for (i = sl->num_used - 1; i >= 0; --i) { + if (i>0) + tor_assert(compare(sl->list[PARENT(i)], sl->list[i]) <= 0); + tor_assert(IDX_OF_ITEM(sl->list[i]) == i); } } @@ -674,6 +807,41 @@ smartlist_uniq(sl, _compare_digests, _tor_free); } +/** Helper: compare two DIGEST256_LEN digests. */ +static int +_compare_digests256(const void **_a, const void **_b) +{ + return memcmp((const char*)*_a, (const char*)*_b, DIGEST256_LEN); +} + +/** Sort the list of DIGEST256_LEN-byte digests into ascending order. */ +void +smartlist_sort_digests256(smartlist_t *sl) +{ + smartlist_sort(sl, _compare_digests256); +} + +/** Return the most frequent member of the sorted list of DIGEST256_LEN + * digests in sl */ +char * +smartlist_get_most_frequent_digest256(smartlist_t *sl) +{ + return smartlist_get_most_frequent(sl, _compare_digests256); +} + +/** Remove duplicate 256-bit digests from a sorted list, and free them with + * tor_free(). + */ +void +smartlist_uniq_digests256(smartlist_t *sl) +{ + smartlist_uniq(sl, _compare_digests256, _tor_free); +} + +/** Helper: Declare an entry type and a map type to implement a mapping using + * ht.h. The map type will be called maptype. The key part of each + * entry is declared using the C declaration keydecl. All functions + * and types associated with the map get prefixed with prefix */ #define DEFINE_MAP_STRUCTS(maptype, keydecl, prefix) \ typedef struct prefix ## entry_t { \ HT_ENTRY(prefix ## entry_t) node; \ @@ -991,6 +1159,7 @@ return HT_START(strmap_impl, &map->head); } +/** Start iterating through map. See strmap_iter_init() for example. */ digestmap_iter_t * digestmap_iter_init(digestmap_t *map) { @@ -998,8 +1167,8 @@ return HT_START(digestmap_impl, &map->head); } -/** Advance the iterator iter for map a single step to the next entry. - */ +/** Advance the iterator iter for map a single step to the next + * entry, and return its new value. */ strmap_iter_t * strmap_iter_next(strmap_t *map, strmap_iter_t *iter) { @@ -1008,6 +1177,8 @@ return HT_NEXT(strmap_impl, &map->head, iter); } +/** Advance the iterator iter for map a single step to the next entry, + * and return its new value. */ digestmap_iter_t * digestmap_iter_next(digestmap_t *map, digestmap_iter_t *iter) { @@ -1017,7 +1188,7 @@ } /** Advance the iterator iter a single step to the next entry, removing - * the current entry. + * the current entry, and return its new value. */ strmap_iter_t * strmap_iter_next_rmv(strmap_t *map, strmap_iter_t *iter) @@ -1033,6 +1204,9 @@ return iter; } +/** Advance the iterator iter a single step to the next entry, removing + * the current entry, and return its new value. + */ digestmap_iter_t * digestmap_iter_next_rmv(digestmap_t *map, digestmap_iter_t *iter) { @@ -1046,8 +1220,8 @@ return iter; } -/** Set *keyp and *valp to the current entry pointed to by iter. - */ +/** Set *keyp and *valp to the current entry pointed to by + * iter. */ void strmap_iter_get(strmap_iter_t *iter, const char **keyp, void **valp) { @@ -1059,6 +1233,8 @@ *valp = (*iter)->val; } +/** Set *keyp and *valp to the current entry pointed to by + * iter. */ void digestmap_iter_get(digestmap_iter_t *iter, const char **keyp, void **valp) { @@ -1070,13 +1246,16 @@ *valp = (*iter)->val; } -/** Return true iff iter has advanced past the last entry of map. - */ +/** Return true iff iter has advanced past the last entry of + * map. */ int strmap_iter_done(strmap_iter_t *iter) { return iter == NULL; } + +/** Return true iff iter has advanced past the last entry of + * map. */ int digestmap_iter_done(digestmap_iter_t *iter) { @@ -1091,6 +1270,9 @@ strmap_free(strmap_t *map, void (*free_val)(void*)) { strmap_entry_t **ent, **next, *this; + if (!map) + return; + for (ent = HT_START(strmap_impl, &map->head); ent != NULL; ent = next) { this = *ent; next = HT_NEXT_RMV(strmap_impl, &map->head, ent); @@ -1103,10 +1285,17 @@ HT_CLEAR(strmap_impl, &map->head); tor_free(map); } + +/** Remove all entries from map, and deallocate storage for those + * entries. If free_val is provided, it is invoked on every value in + * map. + */ void digestmap_free(digestmap_t *map, void (*free_val)(void*)) { digestmap_entry_t **ent, **next, *this; + if (!map) + return; for (ent = HT_START(digestmap_impl, &map->head); ent != NULL; ent = next) { this = *ent; next = HT_NEXT_RMV(digestmap_impl, &map->head, ent); @@ -1119,11 +1308,15 @@ tor_free(map); } +/** Fail with an assertion error if anything has gone wrong with the internal + * representation of map. */ void strmap_assert_ok(const strmap_t *map) { tor_assert(!_strmap_impl_HT_REP_IS_BAD(&map->head)); } +/** Fail with an assertion error if anything has gone wrong with the internal + * representation of map. */ void digestmap_assert_ok(const digestmap_t *map) { @@ -1137,6 +1330,7 @@ return HT_EMPTY(&map->head); } +/** Return true iff map has no entries. */ int digestmap_isempty(const digestmap_t *map) { @@ -1150,6 +1344,7 @@ return HT_SIZE(&map->head); } +/** Return the number of items in map. */ int digestmap_size(const digestmap_t *map) { @@ -1160,7 +1355,7 @@ * function for an array of type elt_t*. * * NOTE: The implementation kind of sucks: It's O(n log n), whereas finding - * the nth element of a list can be done in O(n). Then again, this + * the kth element of an n-element list can be done in O(n). Then again, this * implementation is not in critical path, and it is obviously correct. */ #define IMPLEMENT_ORDER_FUNC(funcname, elt_t) \ static int \ @@ -1187,5 +1382,38 @@ IMPLEMENT_ORDER_FUNC(find_nth_time, time_t) IMPLEMENT_ORDER_FUNC(find_nth_double, double) IMPLEMENT_ORDER_FUNC(find_nth_uint32, uint32_t) +IMPLEMENT_ORDER_FUNC(find_nth_int32, int32_t) IMPLEMENT_ORDER_FUNC(find_nth_long, long) +/** Return a newly allocated digestset_t, optimized to hold a total of + * max_elements digests with a reasonably low false positive weight. */ +digestset_t * +digestset_new(int max_elements) +{ + /* The probability of false positives is about P=(1 - exp(-kn/m))^k, where k + * is the number of hash functions per entry, m is the bits in the array, + * and n is the number of elements inserted. For us, k==4, n<=max_elements, + * and m==n_bits= approximately max_elements*32. This gives + * P<(1-exp(-4*n/(32*n)))^4 == (1-exp(1/-8))^4 == .00019 + * + * It would be more optimal in space vs false positives to get this false + * positive rate by going for k==13, and m==18.5n, but we also want to + * conserve CPU, and k==13 is pretty big. + */ + int n_bits = 1u << (tor_log2(max_elements)+5); + digestset_t *r = tor_malloc(sizeof(digestset_t)); + r->mask = n_bits - 1; + r->ba = bitarray_init_zero(n_bits); + return r; +} + +/** Free all storage held in set. */ +void +digestset_free(digestset_t *set) +{ + if (!set) + return; + bitarray_free(set->ba); + tor_free(set); +} + diff -Nru tor-0.2.0.34/src/common/container.h tor-0.2.2.16-alpha/src/common/container.h --- tor-0.2.0.34/src/common/container.h 2008-12-02 22:41:45.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/container.h 2010-03-07 04:03:27.000000000 +0000 @@ -1,20 +1,17 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: container.h 17394 2008-11-26 17:02:02Z nickm $ */ -#ifndef __CONTAINER_H -#define __CONTAINER_H -#define CONTAINER_H_ID \ - "$Id: container.h 17394 2008-11-26 17:02:02Z nickm $" +#ifndef _TOR_CONTAINER_H +#define _TOR_CONTAINER_H #include "util.h" /** A resizeable list of pointers, with associated helpful functionality. * * The members of this struct are exposed only so that macros and inlines can - * use them; all access to smartlist internals should go throuch the functions + * use them; all access to smartlist internals should go through the functions * and macros defined here. **/ typedef struct smartlist_t { @@ -96,30 +93,47 @@ void smartlist_insert(smartlist_t *sl, int idx, void *val); void smartlist_sort(smartlist_t *sl, int (*compare)(const void **a, const void **b)); +void *smartlist_get_most_frequent(const smartlist_t *sl, + int (*compare)(const void **a, const void **b)); void smartlist_uniq(smartlist_t *sl, int (*compare)(const void **a, const void **b), void (*free_fn)(void *elt)); + void smartlist_sort_strings(smartlist_t *sl); void smartlist_sort_digests(smartlist_t *sl); +void smartlist_sort_digests256(smartlist_t *sl); + +char *smartlist_get_most_frequent_string(smartlist_t *sl); +char *smartlist_get_most_frequent_digest256(smartlist_t *sl); + void smartlist_uniq_strings(smartlist_t *sl); void smartlist_uniq_digests(smartlist_t *sl); +void smartlist_uniq_digests256(smartlist_t *sl); void *smartlist_bsearch(smartlist_t *sl, const void *key, int (*compare)(const void *key, const void **member)) - ATTR_PURE; + ATTR_PURE; int smartlist_bsearch_idx(const smartlist_t *sl, const void *key, int (*compare)(const void *key, const void **member), int *found_out); void smartlist_pqueue_add(smartlist_t *sl, int (*compare)(const void *a, const void *b), + int idx_field_offset, void *item); void *smartlist_pqueue_pop(smartlist_t *sl, - int (*compare)(const void *a, const void *b)); + int (*compare)(const void *a, const void *b), + int idx_field_offset); +void smartlist_pqueue_remove(smartlist_t *sl, + int (*compare)(const void *a, const void *b), + int idx_field_offset, + void *item); void smartlist_pqueue_assert_ok(smartlist_t *sl, - int (*compare)(const void *a, const void *b)); + int (*compare)(const void *a, const void *b), + int idx_field_offset); #define SPLIT_SKIP_SPACE 0x01 #define SPLIT_IGNORE_BLANK 0x02 +#define SPLIT_STRIP_SPACE 0x04 int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep, int flags, int max); char *smartlist_join_strings(smartlist_t *sl, const char *join, int terminate, @@ -154,23 +168,62 @@ * SMARTLIST_FOREACH(list, char *, cp, * { * if (!strcmp(cp, "junk")) { - * smartlist_del(list, cp_sl_idx); * tor_free(cp); - * --cp_sl_len; // decrement length of list so we don't run off the end - * --cp_sl_idx; // decrement idx so we consider the item that moved here + * SMARTLIST_DEL_CURRENT(list, cp); * } * }); * */ -#define SMARTLIST_FOREACH(sl, type, var, cmd) \ +/* Note: these macros use token pasting, and reach into smartlist internals. + * This can make them a little daunting. Here's the approximate unpacking of + * the above examples, for entertainment value: + * + *
+ * smartlist_t *list = smartlist_split("A:B:C", ":", 0, 0);
+ * {
+ *   int cp_sl_idx, cp_sl_len = smartlist_len(list);
+ *   char *cp;
+ *   for (cp_sl_idx = 0; cp_sl_idx < cp_sl_len; ++cp_sl_idx) {
+ *     cp = smartlist_get(list, cp_sl_idx);
+ *     printf("%d: %s\n", cp_sl_idx, cp);
+ *     tor_free(cp);
+ *   }
+ * }
+ * smartlist_free(list);
+ * 
+ * + *
+ * {
+ *   int cp_sl_idx, cp_sl_len = smartlist_len(list);
+ *   char *cp;
+ *   for (cp_sl_idx = 0; cp_sl_idx < cp_sl_len; ++cp_sl_idx) {
+ *     cp = smartlist_get(list, cp_sl_idx);
+ *     if (!strcmp(cp, "junk")) {
+ *       tor_free(cp);
+ *       smartlist_del(list, cp_sl_idx);
+ *       --cp_sl_idx;
+ *       --cp_sl_len;
+ *     }
+ *   }
+ * }
+ * 
+ */ +#define SMARTLIST_FOREACH_BEGIN(sl, type, var) \ STMT_BEGIN \ int var ## _sl_idx, var ## _sl_len=(sl)->num_used; \ type var; \ for (var ## _sl_idx = 0; var ## _sl_idx < var ## _sl_len; \ ++var ## _sl_idx) { \ - var = (sl)->list[var ## _sl_idx]; \ - cmd; \ - } STMT_END + var = (sl)->list[var ## _sl_idx]; + +#define SMARTLIST_FOREACH_END(var) \ + var = NULL; \ + } STMT_END + +#define SMARTLIST_FOREACH(sl, type, var, cmd) \ + SMARTLIST_FOREACH_BEGIN(sl,type,var) { \ + cmd; \ + } SMARTLIST_FOREACH_END(var) /** Helper: While in a SMARTLIST_FOREACH loop over the list sl indexed * with the variable var, remove the current element in a way that @@ -182,6 +235,89 @@ --var ## _sl_len; \ STMT_END +/** Helper: While in a SMARTLIST_FOREACH loop over the list sl indexed + * with the variable var, replace the current element with val. + * Does not deallocate the current value of var. + */ +#define SMARTLIST_REPLACE_CURRENT(sl, var, val) \ + STMT_BEGIN \ + smartlist_set(sl, var ## _sl_idx, val); \ + STMT_END + +/* Helper: Given two lists of items, possibly of different types, such that + * both lists are sorted on some common field (as determined by a comparison + * expression cmpexpr), and such that one list (sl1) has no + * duplicates on the common field, loop through the lists in lockstep, and + * execute unmatched_var2 on items in var2 that do not appear in + * var1. + * + * WARNING: It isn't safe to add remove elements from either list while the + * loop is in progress. + * + * Example use: + * SMARTLIST_FOREACH_JOIN(routerstatus_list, routerstatus_t *, rs, + * routerinfo_list, routerinfo_t *, ri, + * memcmp(rs->identity_digest, ri->identity_digest, 20), + * log_info(LD_GENERAL,"No match for %s", ri->nickname)) { + * log_info(LD_GENERAL, "%s matches routerstatus %p", ri->nickname, rs); + * } SMARTLIST_FOREACH_JOIN_END(rs, ri); + **/ +/* The example above unpacks (approximately) to: + * int rs_sl_idx = 0, rs_sl_len = smartlist_len(routerstatus_list); + * int ri_sl_idx, ri_sl_len = smartlist_len(routerinfo_list); + * int rs_ri_cmp; + * routerstatus_t *rs; + * routerinfo_t *ri; + * for (; ri_sl_idx < ri_sl_len; ++ri_sl_idx) { + * ri = smartlist_get(routerinfo_list, ri_sl_idx); + * while (rs_sl_idx < rs_sl_len) { + * rs = smartlist_get(routerstatus_list, rs_sl_idx); + * rs_ri_cmp = memcmp(rs->identity_digest, ri->identity_digest, 20); + * if (rs_ri_cmp > 0) { + * break; + * } else if (rs_ri_cmp == 0) { + * goto matched_ri; + * } else { + * ++rs_sl_idx; + * } + * } + * log_info(LD_GENERAL,"No match for %s", ri->nickname); + * continue; + * matched_ri: { + * log_info(LD_GENERAL,"%s matches with routerstatus %p",ri->nickname,rs); + * } + * } + */ +#define SMARTLIST_FOREACH_JOIN(sl1, type1, var1, sl2, type2, var2, \ + cmpexpr, unmatched_var2) \ + STMT_BEGIN \ + int var1 ## _sl_idx = 0, var1 ## _sl_len=(sl1)->num_used; \ + int var2 ## _sl_idx = 0, var2 ## _sl_len=(sl2)->num_used; \ + int var1 ## _ ## var2 ## _cmp; \ + type1 var1; \ + type2 var2; \ + for (; var2##_sl_idx < var2##_sl_len; ++var2##_sl_idx) { \ + var2 = (sl2)->list[var2##_sl_idx]; \ + while (var1##_sl_idx < var1##_sl_len) { \ + var1 = (sl1)->list[var1##_sl_idx]; \ + var1##_##var2##_cmp = (cmpexpr); \ + if (var1##_##var2##_cmp > 0) { \ + break; \ + } else if (var1##_##var2##_cmp == 0) { \ + goto matched_##var2; \ + } else { \ + ++var1##_sl_idx; \ + } \ + } \ + /* Ran out of v1, or no match for var2. */ \ + unmatched_var2; \ + continue; \ + matched_##var2: ; \ + +#define SMARTLIST_FOREACH_JOIN_END(var1, var2) \ + } \ + STMT_END + #define DECLARE_MAP_FNS(maptype, keytype, prefix) \ typedef struct maptype maptype; \ typedef struct prefix##entry_t *prefix##iter_t; \ @@ -216,6 +352,20 @@ * // use k and r * } MAP_FOREACH_END. */ +/* Unpacks to, approximately: + * { + * digestmap_iter_t *k_iter; + * for (k_iter = digestmap_iter_init(m); !digestmap_iter_done(k_iter); + * k_iter = digestmap_iter_next(m, k_iter)) { + * const char *k; + * void *r_voidp; + * routerinfo_t *r; + * digestmap_iter_get(k_iter, &k, &r_voidp); + * r = r_voidp; + * // use k and r + * } + * } + */ #define MAP_FOREACH(prefix, map, keytype, keyvar, valtype, valvar) \ STMT_BEGIN \ prefix##iter_t *keyvar##_iter; \ @@ -237,6 +387,25 @@ * MAP_DEL_CURRENT(k); * } MAP_FOREACH_END. **/ +/* Unpacks to, approximately: + * { + * digestmap_iter_t *k_iter; + * int k_del=0; + * for (k_iter = digestmap_iter_init(m); !digestmap_iter_done(k_iter); + * k_iter = k_del ? digestmap_iter_next(m, k_iter) + * : digestmap_iter_next_rmv(m, k_iter)) { + * const char *k; + * void *r_voidp; + * routerinfo_t *r; + * k_del=0; + * digestmap_iter_get(k_iter, &k, &r_voidp); + * r = r_voidp; + * if (is_very_old(r)) { + * k_del = 1; + * } + * } + * } + */ #define MAP_FOREACH_MODIFY(prefix, map, keytype, keyvar, valtype, valvar) \ STMT_BEGIN \ prefix##iter_t *keyvar##_iter; \ @@ -424,6 +593,49 @@ return b[bit >> BITARRAY_SHIFT] & (1u << (bit & BITARRAY_MASK)); } +/** A set of digests, implemented as a Bloom filter. */ +typedef struct { + int mask; /* One less than the number of bits in ba; always one less + * than a power of two. */ + bitarray_t *ba; /* A bit array to implement the Bloom filter. */ +} digestset_t; + +#define BIT(n) ((n) & set->mask) +/** Add the digest digest to set. */ +static INLINE void +digestset_add(digestset_t *set, const char *digest) +{ + const uint32_t *p = (const uint32_t *)digest; + const uint32_t d1 = p[0] + (p[1]>>16); + const uint32_t d2 = p[1] + (p[2]>>16); + const uint32_t d3 = p[2] + (p[3]>>16); + const uint32_t d4 = p[3] + (p[0]>>16); + bitarray_set(set->ba, BIT(d1)); + bitarray_set(set->ba, BIT(d2)); + bitarray_set(set->ba, BIT(d3)); + bitarray_set(set->ba, BIT(d4)); +} + +/** If digest is in set, return nonzero. Otherwise, + * probably return zero. */ +static INLINE int +digestset_isin(const digestset_t *set, const char *digest) +{ + const uint32_t *p = (const uint32_t *)digest; + const uint32_t d1 = p[0] + (p[1]>>16); + const uint32_t d2 = p[1] + (p[2]>>16); + const uint32_t d3 = p[2] + (p[3]>>16); + const uint32_t d4 = p[3] + (p[0]>>16); + return bitarray_is_set(set->ba, BIT(d1)) && + bitarray_is_set(set->ba, BIT(d2)) && + bitarray_is_set(set->ba, BIT(d3)) && + bitarray_is_set(set->ba, BIT(d4)); +} +#undef BIT + +digestset_t *digestset_new(int max_elements); +void digestset_free(digestset_t* set); + /* These functions, given an array of n_elements, return the * nth lowest element. nth=0 gives the lowest element; * n_elements-1 gives the highest; and (n_elements-1) / 2 gives @@ -431,6 +643,7 @@ int find_nth_int(int *array, int n_elements, int nth); time_t find_nth_time(time_t *array, int n_elements, int nth); double find_nth_double(double *array, int n_elements, int nth); +int32_t find_nth_int32(int32_t *array, int n_elements, int nth); uint32_t find_nth_uint32(uint32_t *array, int n_elements, int nth); long find_nth_long(long *array, int n_elements, int nth); static INLINE int @@ -453,6 +666,11 @@ { return find_nth_uint32(array, n_elements, (n_elements-1)/2); } +static INLINE int32_t +median_int32(int32_t *array, int n_elements) +{ + return find_nth_int32(array, n_elements, (n_elements-1)/2); +} static INLINE long median_long(long *array, int n_elements) { diff -Nru tor-0.2.0.34/src/common/crypto.c tor-0.2.2.16-alpha/src/common/crypto.c --- tor-0.2.0.34/src/common/crypto.c 2009-01-05 02:06:16.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/crypto.c 2010-07-13 01:37:00.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: crypto.c 17674 2008-12-18 05:47:28Z nickm $ */ -const char crypto_c_id[] = - "$Id: crypto.c 17674 2008-12-18 05:47:28Z nickm $"; /** * \file crypto.c @@ -21,7 +18,7 @@ #define WIN32_LEAN_AND_MEAN #include #include -/* Windows defines this; so does openssl 0.9.8h and later. We don't actually +/* Windows defines this; so does OpenSSL 0.9.8h and later. We don't actually * use either definition. */ #undef OCSP_RESPONSE #endif @@ -30,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -52,31 +50,58 @@ #define CRYPTO_PRIVATE #include "crypto.h" -#include "log.h" +#include "../common/torlog.h" #include "aes.h" -#include "util.h" +#include "../common/util.h" #include "container.h" #include "compat.h" #if OPENSSL_VERSION_NUMBER < 0x00907000l -#error "We require openssl >= 0.9.7" +#error "We require OpenSSL >= 0.9.7" #endif #include +#ifdef ANDROID +/* Android's OpenSSL seems to have removed all of its Engine support. */ +#define DISABLE_ENGINES +#endif + +#if OPENSSL_VERSION_NUMBER < 0x00908000l +/* On OpenSSL versions before 0.9.8, there is no working SHA256 + * implementation, so we use Tom St Denis's nice speedy one, slightly adapted + * to our needs */ +#define SHA256_CTX sha256_state +#define SHA256_Init sha256_init +#define SHA256_Update sha256_process +#define LTC_ARGCHK(x) tor_assert(x) +#include "sha256.c" +#define SHA256_Final(a,b) sha256_done(b,a) + +static unsigned char * +SHA256(const unsigned char *m, size_t len, unsigned char *d) +{ + SHA256_CTX ctx; + SHA256_Init(&ctx); + SHA256_Update(&ctx, m, len); + SHA256_Final(d, &ctx); + return d; +} +#endif + /** Macro: is k a valid RSA public or private key? */ #define PUBLIC_KEY_OK(k) ((k) && (k)->key && (k)->key->n) /** Macro: is k a valid RSA private key? */ #define PRIVATE_KEY_OK(k) ((k) && (k)->key && (k)->key->p) #ifdef TOR_IS_MULTITHREADED -/** A number of prealloced mutexes for use by openssl. */ +/** A number of preallocated mutexes for use by OpenSSL. */ static tor_mutex_t **_openssl_mutexes = NULL; -/** How many mutexes have we allocated for use by openssl? */ +/** How many mutexes have we allocated for use by OpenSSL? */ static int _n_openssl_mutexes = 0; #endif -/** A public key, or a public/private keypair. */ +/** A public key, or a public/private key-pair. */ struct crypto_pk_env_t { int refs; /* reference counting so we don't have to copy keys */ @@ -97,7 +122,7 @@ }; static int setup_openssl_threading(void); -static int tor_check_dh_key(BIGNUM *bn); +static int tor_check_dh_key(int severity, BIGNUM *bn); /** Return the number of bytes added by padding method padding. */ @@ -154,6 +179,7 @@ } } +#ifndef DISABLE_ENGINES /** Log any OpenSSL engines we're using at NOTICE. */ static void log_engine(const char *fn, ENGINE *e) @@ -168,38 +194,84 @@ log(LOG_INFO, LD_CRYPTO, "Using default implementation for %s", fn); } } +#endif + +#ifndef DISABLE_ENGINES +/** Try to load an engine in a shared library via fully qualified path. + */ +static ENGINE * +try_load_engine(const char *path, const char *engine) +{ + ENGINE *e = ENGINE_by_id("dynamic"); + if (e) { + if (!ENGINE_ctrl_cmd_string(e, "ID", engine, 0) || + !ENGINE_ctrl_cmd_string(e, "DIR_LOAD", "2", 0) || + !ENGINE_ctrl_cmd_string(e, "DIR_ADD", path, 0) || + !ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0)) { + ENGINE_free(e); + e = NULL; + } + } + return e; +} +#endif /** Initialize the crypto library. Return 0 on success, -1 on failure. */ int -crypto_global_init(int useAccel) +crypto_global_init(int useAccel, const char *accelName, const char *accelDir) { if (!_crypto_global_initialized) { ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); _crypto_global_initialized = 1; setup_openssl_threading(); - /* XXX the below is a bug, since we can't know if we're supposed - * to be using hardware acceleration or not. we should arrange - * for this function to be called before init_keys. But make it - * not complain loudly, at least until we make acceleration work. */ - if (useAccel < 0) { - log_info(LD_CRYPTO, "Initializing OpenSSL via tor_tls_init()."); - } if (useAccel > 0) { +#ifdef DISABLE_ENGINES + (void)accelName; + (void)accelDir; + log_warn(LD_CRYPTO, "No OpenSSL hardware acceleration support enabled."); +#else + ENGINE *e = NULL; + log_info(LD_CRYPTO, "Initializing OpenSSL engine support."); ENGINE_load_builtin_engines(); - if (!ENGINE_register_all_complete()) - return -1; + ENGINE_register_all_complete(); - /* XXXX make sure this isn't leaking. */ + if (accelName) { + if (accelDir) { + log_info(LD_CRYPTO, "Trying to load dynamic OpenSSL engine \"%s\"" + " via path \"%s\".", accelName, accelDir); + e = try_load_engine(accelName, accelDir); + } else { + log_info(LD_CRYPTO, "Initializing dynamic OpenSSL engine \"%s\"" + " acceleration support.", accelName); + e = ENGINE_by_id(accelName); + } + if (!e) { + log_warn(LD_CRYPTO, "Unable to load dynamic OpenSSL engine \"%s\".", + accelName); + } else { + log_info(LD_CRYPTO, "Loaded dynamic OpenSSL engine \"%s\".", + accelName); + } + } + if (e) { + log_info(LD_CRYPTO, "Loaded OpenSSL hardware acceleration engine," + " setting default ciphers."); + ENGINE_set_default(e, ENGINE_METHOD_ALL); + } log_engine("RSA", ENGINE_get_default_RSA()); log_engine("DH", ENGINE_get_default_DH()); log_engine("RAND", ENGINE_get_default_RAND()); log_engine("SHA1", ENGINE_get_digest_engine(NID_sha1)); log_engine("3DES", ENGINE_get_cipher_engine(NID_des_ede3_ecb)); log_engine("AES", ENGINE_get_cipher_engine(NID_aes_128_ecb)); +#endif + } else { + log_info(LD_CRYPTO, "NOT using OpenSSL engine support."); } + return crypto_seed_rng(1); } return 0; } @@ -219,7 +291,11 @@ EVP_cleanup(); ERR_remove_state(0); ERR_free_strings(); + +#ifndef DISABLE_ENGINES ENGINE_cleanup(); +#endif + CONF_modules_unload(1); CRYPTO_cleanup_all_ex_data(); #ifdef TOR_IS_MULTITHREADED @@ -261,6 +337,14 @@ return _crypto_new_pk_env_rsa(rsa); } +/** Helper, used by tor-checkkey.c and tor-gencert.c. Return the RSA from a + * crypto_pk_env_t. */ +RSA * +_crypto_pk_env_get_rsa(crypto_pk_env_t *env) +{ + return env->key; +} + /** used by tortls.c: get an equivalent EVP_PKEY* for a crypto_pk_env_t. Iff * private is set, include the private-key portion of the key. */ EVP_PKEY * @@ -316,7 +400,8 @@ void crypto_free_pk_env(crypto_pk_env_t *env) { - tor_assert(env); + if (!env) + return; if (--env->refs > 0) return; @@ -342,10 +427,7 @@ return NULL; } - if (crypto_cipher_set_key(crypto, key)) { - crypto_log_errors(LOG_WARN, "setting symmetric key"); - goto error; - } + crypto_cipher_set_key(crypto, key); if (encrypt_mode) r = crypto_cipher_encrypt_init_cipher(crypto); @@ -379,7 +461,8 @@ void crypto_free_cipher_env(crypto_cipher_env_t *env) { - tor_assert(env); + if (!env) + return; tor_assert(env->cipher); aes_free_cipher(env->cipher); @@ -389,17 +472,43 @@ /* public key crypto */ -/** Generate a new public/private keypair in env. Return 0 on - * success, -1 on failure. +/** Generate a bits-bit new public/private keypair in env. + * Return 0 on success, -1 on failure. */ int -crypto_pk_generate_key(crypto_pk_env_t *env) +crypto_pk_generate_key_with_bits(crypto_pk_env_t *env, int bits) { tor_assert(env); if (env->key) RSA_free(env->key); - env->key = RSA_generate_key(PK_BYTES*8,65537, NULL, NULL); +#if OPENSSL_VERSION_NUMBER < 0x00908000l + /* In OpenSSL 0.9.7, RSA_generate_key is all we have. */ + env->key = RSA_generate_key(bits, 65537, NULL, NULL); +#else + /* In OpenSSL 0.9.8, RSA_generate_key is deprecated. */ + { + BIGNUM *e = BN_new(); + RSA *r = NULL; + if (!e) + goto done; + if (! BN_set_word(e, 65537)) + goto done; + r = RSA_new(); + if (!r) + goto done; + if (RSA_generate_key_ex(r, bits, e, NULL) == -1) + goto done; + + env->key = r; + r = NULL; + done: + if (e) + BN_free(e); + if (r) + RSA_free(r); + } +#endif if (!env->key) { crypto_log_errors(LOG_WARN, "generating RSA key"); return -1; @@ -421,7 +530,7 @@ tor_assert(env); tor_assert(s); - /* Create a read-only memory BIO, backed by the nul-terminated string 's' */ + /* Create a read-only memory BIO, backed by the NUL-terminated string 's' */ b = BIO_new_mem_buf((char*)s, -1); if (env->key) @@ -468,17 +577,14 @@ return 0; } -/** PEM-encode the public key portion of env and write it to a - * newly allocated string. On success, set *dest to the new - * string, *len to the string's length, and return 0. On - * failure, return -1. - */ -int -crypto_pk_write_public_key_to_string(crypto_pk_env_t *env, char **dest, - size_t *len) +/** Helper function to implement crypto_pk_write_*_key_to_string. */ +static int +crypto_pk_write_key_to_string_impl(crypto_pk_env_t *env, char **dest, + size_t *len, int is_public) { BUF_MEM *buf; BIO *b; + int r; tor_assert(env); tor_assert(env->key); @@ -489,8 +595,13 @@ /* Now you can treat b as if it were a file. Just use the * PEM_*_bio_* functions instead of the non-bio variants. */ - if (!PEM_write_bio_RSAPublicKey(b, env->key)) { - crypto_log_errors(LOG_WARN, "writing public key to string"); + if (is_public) + r = PEM_write_bio_RSAPublicKey(b, env->key); + else + r = PEM_write_bio_RSAPrivateKey(b, env->key, NULL,NULL,0,NULL,NULL); + + if (!r) { + crypto_log_errors(LOG_WARN, "writing RSA key to string"); BIO_free(b); return -1; } @@ -499,7 +610,6 @@ (void)BIO_set_close(b, BIO_NOCLOSE); /* so BIO_free doesn't free buf */ BIO_free(b); - tor_assert(buf->length >= 0); *dest = tor_malloc(buf->length+1); memcpy(*dest, buf->data, buf->length); (*dest)[buf->length] = 0; /* nul terminate it */ @@ -509,6 +619,30 @@ return 0; } +/** PEM-encode the public key portion of env and write it to a + * newly allocated string. On success, set *dest to the new + * string, *len to the string's length, and return 0. On + * failure, return -1. + */ +int +crypto_pk_write_public_key_to_string(crypto_pk_env_t *env, char **dest, + size_t *len) +{ + return crypto_pk_write_key_to_string_impl(env, dest, len, 1); +} + +/** PEM-encode the private key portion of env and write it to a + * newly allocated string. On success, set *dest to the new + * string, *len to the string's length, and return 0. On + * failure, return -1. + */ +int +crypto_pk_write_private_key_to_string(crypto_pk_env_t *env, char **dest, + size_t *len) +{ + return crypto_pk_write_key_to_string_impl(env, dest, len, 0); +} + /** Read a PEM-encoded public key from the first len characters of * src, and store the result in env. Return 0 on success, -1 on * failure. @@ -587,6 +721,15 @@ return r; } +/** Return true iff key contains the private-key portion of the RSA + * key. */ +int +crypto_pk_key_is_private(const crypto_pk_env_t *key) +{ + tor_assert(key); + return PRIVATE_KEY_OK(key); +} + /** Compare the public-key components of a and b. Return -1 if a\b. */ @@ -636,14 +779,25 @@ crypto_pk_copy_full(crypto_pk_env_t *env) { RSA *new_key; + int privatekey = 0; tor_assert(env); tor_assert(env->key); if (PRIVATE_KEY_OK(env)) { new_key = RSAPrivateKey_dup(env->key); + privatekey = 1; } else { new_key = RSAPublicKey_dup(env->key); } + if (!new_key) { + log_err(LD_CRYPTO, "Unable to duplicate a %s key: openssl failed.", + privatekey?"private":"public"); + crypto_log_errors(LOG_ERR, + privatekey ? "Duplicating a private key" : + "Duplicating a public key"); + tor_fragile_assert(); + return NULL; + } return _crypto_new_pk_env_rsa(new_key); } @@ -988,7 +1142,7 @@ RSA *rsa; unsigned char *buf; /* This ifdef suppresses a type warning. Take out the first case once - * everybody is using openssl 0.9.7 or later. + * everybody is using OpenSSL 0.9.7 or later. */ const unsigned char *cp; cp = buf = tor_malloc(len); @@ -1107,19 +1261,14 @@ /** Set the symmetric key for the cipher in env to the first * CIPHER_KEY_LEN bytes of key. Does not initialize the cipher. - * Return 0 on success, -1 on failure. */ -int +void crypto_cipher_set_key(crypto_cipher_env_t *env, const char *key) { tor_assert(env); tor_assert(key); - if (!env->key) - return -1; - memcpy(env->key, key, CIPHER_KEY_LEN); - return 0; } /** Generate an initialization vector for our AES-CTR cipher; store it @@ -1293,9 +1442,69 @@ return (SHA1((const unsigned char*)m,len,(unsigned char*)digest) == NULL); } +int +crypto_digest256(char *digest, const char *m, size_t len, + digest_algorithm_t algorithm) +{ + tor_assert(m); + tor_assert(digest); + tor_assert(algorithm == DIGEST_SHA256); + return (SHA256((const unsigned char*)m,len,(unsigned char*)digest) == NULL); +} + +/** Set the digests_t in ds_out to contain every digest on the + * len bytes in m that we know how to compute. Return 0 on + * success, -1 on failure. */ +int +crypto_digest_all(digests_t *ds_out, const char *m, size_t len) +{ + digest_algorithm_t i; + tor_assert(ds_out); + memset(ds_out, 0, sizeof(*ds_out)); + if (crypto_digest(ds_out->d[DIGEST_SHA1], m, len) < 0) + return -1; + for (i = DIGEST_SHA256; i < N_DIGEST_ALGORITHMS; ++i) { + if (crypto_digest256(ds_out->d[i], m, len, i) < 0) + return -1; + } + return 0; +} + +/** Return the name of an algorithm, as used in directory documents. */ +const char * +crypto_digest_algorithm_get_name(digest_algorithm_t alg) +{ + switch (alg) { + case DIGEST_SHA1: + return "sha1"; + case DIGEST_SHA256: + return "sha256"; + default: + tor_fragile_assert(); + return "??unknown_digest??"; + } +} + +/** Given the name of a digest algorithm, return its integer value, or -1 if + * the name is not recognized. */ +int +crypto_digest_algorithm_parse_name(const char *name) +{ + if (!strcmp(name, "sha1")) + return DIGEST_SHA1; + else if (!strcmp(name, "sha256")) + return DIGEST_SHA256; + else + return -1; +} + /** Intermediate information about the digest of a stream of data. */ struct crypto_digest_env_t { - SHA_CTX d; + union { + SHA_CTX sha1; + SHA256_CTX sha2; + } d; + digest_algorithm_t algorithm : 8; }; /** Allocate and return a new digest object. @@ -1305,7 +1514,19 @@ { crypto_digest_env_t *r; r = tor_malloc(sizeof(crypto_digest_env_t)); - SHA1_Init(&r->d); + SHA1_Init(&r->d.sha1); + r->algorithm = DIGEST_SHA1; + return r; +} + +crypto_digest_env_t * +crypto_new_digest256_env(digest_algorithm_t algorithm) +{ + crypto_digest_env_t *r; + tor_assert(algorithm == DIGEST_SHA256); + r = tor_malloc(sizeof(crypto_digest_env_t)); + SHA256_Init(&r->d.sha2); + r->algorithm = algorithm; return r; } @@ -1314,6 +1535,8 @@ void crypto_free_digest_env(crypto_digest_env_t *digest) { + if (!digest) + return; memset(digest, 0, sizeof(crypto_digest_env_t)); tor_free(digest); } @@ -1326,30 +1549,51 @@ { tor_assert(digest); tor_assert(data); - /* Using the SHA1_*() calls directly means we don't support doing - * sha1 in hardware. But so far the delay of getting the question + /* Using the SHA*_*() calls directly means we don't support doing + * SHA in hardware. But so far the delay of getting the question * to the hardware, and hearing the answer, is likely higher than * just doing it ourselves. Hashes are fast. */ - SHA1_Update(&digest->d, (void*)data, len); + switch (digest->algorithm) { + case DIGEST_SHA1: + SHA1_Update(&digest->d.sha1, (void*)data, len); + break; + case DIGEST_SHA256: + SHA256_Update(&digest->d.sha2, (void*)data, len); + break; + default: + tor_fragile_assert(); + break; + } } /** Compute the hash of the data that has been passed to the digest * object; write the first out_len bytes of the result to out. - * out_len must be \<= DIGEST_LEN. + * out_len must be \<= DIGEST256_LEN. */ void crypto_digest_get_digest(crypto_digest_env_t *digest, char *out, size_t out_len) { - unsigned char r[DIGEST_LEN]; - SHA_CTX tmpctx; + unsigned char r[DIGEST256_LEN]; + crypto_digest_env_t tmpenv; tor_assert(digest); tor_assert(out); - tor_assert(out_len <= DIGEST_LEN); - /* memcpy into a temporary ctx, since SHA1_Final clears the context */ - memcpy(&tmpctx, &digest->d, sizeof(SHA_CTX)); - SHA1_Final(r, &tmpctx); + /* memcpy into a temporary ctx, since SHA*_Final clears the context */ + memcpy(&tmpenv, digest, sizeof(crypto_digest_env_t)); + switch (digest->algorithm) { + case DIGEST_SHA1: + tor_assert(out_len <= DIGEST_LEN); + SHA1_Final(r, &tmpenv.d.sha1); + break; + case DIGEST_SHA256: + tor_assert(out_len <= DIGEST256_LEN); + SHA256_Final(r, &tmpenv.d.sha2); + break; + default: + tor_fragile_assert(); + break; + } memcpy(out, r, out_len); memset(r, 0, sizeof(r)); } @@ -1441,13 +1685,11 @@ crypto_dh_env_t * crypto_dh_new(void) { - crypto_dh_env_t *res = NULL; + crypto_dh_env_t *res = tor_malloc_zero(sizeof(crypto_dh_env_t)); if (!dh_param_p) init_dh_param(); - res = tor_malloc_zero(sizeof(crypto_dh_env_t)); - if (!(res->dh = DH_new())) goto err; @@ -1462,8 +1704,8 @@ return res; err: crypto_log_errors(LOG_WARN, "creating DH object"); - if (res && res->dh) DH_free(res->dh); /* frees p and g too */ - if (res) tor_free(res); + if (res->dh) DH_free(res->dh); /* frees p and g too */ + tor_free(res); return NULL; } @@ -1487,10 +1729,10 @@ crypto_log_errors(LOG_WARN, "generating DH key"); return -1; } - if (tor_check_dh_key(dh->dh->pub_key)<0) { + if (tor_check_dh_key(LOG_WARN, dh->dh->pub_key)<0) { log_warn(LD_CRYPTO, "Weird! Our own DH key was invalid. I guess once-in-" "the-universe chances really do happen. Trying again."); - /* Free and clear the keys, so openssl will actually try again. */ + /* Free and clear the keys, so OpenSSL will actually try again. */ BN_free(dh->dh->pub_key); BN_free(dh->dh->priv_key); dh->dh->pub_key = dh->dh->priv_key = NULL; @@ -1529,12 +1771,12 @@ return 0; } -/** Check for bad diffie-hellman public keys (g^x). Return 0 if the key is +/** Check for bad Diffie-Hellman public keys (g^x). Return 0 if the key is * okay (in the subgroup [2,p-2]), or -1 if it's bad. * See http://www.cl.cam.ac.uk/ftp/users/rja14/psandqs.ps.gz for some tips. */ static int -tor_check_dh_key(BIGNUM *bn) +tor_check_dh_key(int severity, BIGNUM *bn) { BIGNUM *x; char *s; @@ -1545,13 +1787,13 @@ init_dh_param(); BN_set_word(x, 1); if (BN_cmp(bn,x)<=0) { - log_warn(LD_CRYPTO, "DH key must be at least 2."); + log_fn(severity, LD_CRYPTO, "DH key must be at least 2."); goto err; } BN_copy(x,dh_param_p); BN_sub_word(x, 1); if (BN_cmp(bn,x)>=0) { - log_warn(LD_CRYPTO, "DH key must be at most p-2."); + log_fn(severity, LD_CRYPTO, "DH key must be at most p-2."); goto err; } BN_free(x); @@ -1559,7 +1801,7 @@ err: BN_free(x); s = BN_bn2hex(bn); - log_warn(LD_CRYPTO, "Rejecting insecure DH key [%s]", s); + log_fn(severity, LD_CRYPTO, "Rejecting insecure DH key [%s]", s); OPENSSL_free(s); return -1; } @@ -1577,7 +1819,7 @@ * where || is concatenation.) */ ssize_t -crypto_dh_compute_secret(crypto_dh_env_t *dh, +crypto_dh_compute_secret(int severity, crypto_dh_env_t *dh, const char *pubkey, size_t pubkey_len, char *secret_out, size_t secret_bytes_out) { @@ -1592,9 +1834,9 @@ if (!(pubkey_bn = BN_bin2bn((const unsigned char*)pubkey, (int)pubkey_len, NULL))) goto error; - if (tor_check_dh_key(pubkey_bn)<0) { + if (tor_check_dh_key(severity, pubkey_bn)<0) { /* Check for invalid public keys. */ - log_warn(LD_CRYPTO,"Rejected invalid g^x"); + log_fn(severity, LD_CRYPTO,"Rejected invalid g^x"); goto error; } secret_tmp = tor_malloc(crypto_dh_get_bytes(dh)); @@ -1604,13 +1846,6 @@ goto error; } secret_len = result; - /* sometimes secret_len might be less than 128, e.g., 127. that's ok. -RD */ - /* Actually, http://www.faqs.org/rfcs/rfc2631.html says: - * Leading zeros MUST be preserved, so that ZZ occupies as many - * octets as p. For instance, if p is 1024 bits, ZZ should be 128 - * bytes long. - * XXX021 What are the security implications here? -NM - */ if (crypto_expand_key_material(secret_tmp, secret_len, secret_out, secret_bytes_out)<0) goto error; @@ -1673,7 +1908,8 @@ void crypto_dh_free(crypto_dh_env_t *dh) { - tor_assert(dh); + if (!dh) + return; tor_assert(dh->dh); DH_free(dh->dh); tor_free(dh); @@ -1685,21 +1921,28 @@ * work for us too. */ #define ADD_ENTROPY 32 -/* Use RAND_poll if openssl is 0.9.6 release or later. (The "f" means +/* Use RAND_poll if OpenSSL is 0.9.6 release or later. (The "f" means "release".) */ -//#define USE_RAND_POLL (OPENSSL_VERSION_NUMBER >= 0x0090600fl) -#define USE_RAND_POLL 0 -/* XXX Somehow setting USE_RAND_POLL on causes stack smashes. We're - * not sure where. This was the big bug with Tor 0.1.1.9-alpha. */ +#define HAVE_RAND_POLL (OPENSSL_VERSION_NUMBER >= 0x0090600fl) -/** Seed OpenSSL's random number generator with bytes from the - * operating system. Return 0 on success, -1 on failure. +/* Versions of OpenSSL prior to 0.9.7k and 0.9.8c had a bug where RAND_poll + * would allocate an fd_set on the stack, open a new file, and try to FD_SET + * that fd without checking whether it fit in the fd_set. Thus, if the + * system has not just been started up, it is unsafe to call */ +#define RAND_POLL_IS_SAFE \ + ((OPENSSL_VERSION_NUMBER >= 0x009070afl && \ + OPENSSL_VERSION_NUMBER <= 0x00907fffl) || \ + (OPENSSL_VERSION_NUMBER >= 0x0090803fl)) + +/** Seed OpenSSL's random number generator with bytes from the operating + * system. startup should be true iff we have just started Tor and + * have not yet allocated a bunch of fds. Return 0 on success, -1 on failure. */ int -crypto_seed_rng(void) +crypto_seed_rng(int startup) { char buf[ADD_ENTROPY]; - int rand_poll_status; + int rand_poll_status = 0; /* local variables */ #ifdef MS_WINDOWS @@ -1713,15 +1956,15 @@ size_t n; #endif -#if USE_RAND_POLL +#if HAVE_RAND_POLL /* OpenSSL 0.9.6 adds a RAND_poll function that knows about more kinds of * entropy than we do. We'll try calling that, *and* calling our own entropy * functions. If one succeeds, we'll accept the RNG as seeded. */ - rand_poll_status = RAND_poll(); - if (rand_poll_status == 0) - log_warn(LD_CRYPTO, "RAND_poll() failed."); -#else - rand_poll_status = 0; + if (startup || RAND_POLL_IS_SAFE) { + rand_poll_status = RAND_poll(); + if (rand_poll_status == 0) + log_warn(LD_CRYPTO, "RAND_poll() failed."); + } #endif #ifdef MS_WINDOWS @@ -1824,6 +2067,26 @@ } } +/** Return a pseudorandom double d, chosen uniformly from the range + * 0.0 <= d < 1.0. + */ +double +crypto_rand_double(void) +{ + /* We just use an unsigned int here; we don't really care about getting + * more than 32 bits of resolution */ + unsigned int uint; + crypto_rand((char*)&uint, sizeof(uint)); +#if SIZEOF_INT == 4 +#define UINT_MAX_AS_DOUBLE 4294967296.0 +#elif SIZEOF_INT == 8 +#define UINT_MAX_AS_DOUBLE 1.8446744073709552e+19 +#else +#error SIZEOF_INT is neither 4 nor 8 +#endif + return ((double)uint) / UINT_MAX_AS_DOUBLE; +} + /** Generate and return a new random hostname starting with prefix, * ending with suffix, and containing no less than * min_rand_len and no more than max_rand_len random base32 @@ -2044,7 +2307,7 @@ } #undef X #undef SP -#undef NIL +#undef PAD /** Base-64 encode DIGEST_LINE bytes from digest, remove the trailing = * and newline characters, and store the nul-terminated result in the first @@ -2084,6 +2347,44 @@ #endif } +/** Base-64 encode DIGEST256_LINE bytes from digest, remove the + * trailing = and newline characters, and store the nul-terminated result in + * the first BASE64_DIGEST256_LEN+1 bytes of d64. */ +int +digest256_to_base64(char *d64, const char *digest) +{ + char buf[256]; + base64_encode(buf, sizeof(buf), digest, DIGEST256_LEN); + buf[BASE64_DIGEST256_LEN] = '\0'; + memcpy(d64, buf, BASE64_DIGEST256_LEN+1); + return 0; +} + +/** Given a base-64 encoded, nul-terminated digest in d64 (without + * trailing newline or = characters), decode it and store the result in the + * first DIGEST256_LEN bytes at digest. */ +int +digest256_from_base64(char *digest, const char *d64) +{ +#ifdef USE_OPENSSL_BASE64 + char buf_in[BASE64_DIGEST256_LEN+3]; + char buf[256]; + if (strlen(d64) != BASE64_DIGEST256_LEN) + return -1; + memcpy(buf_in, d64, BASE64_DIGEST256_LEN); + memcpy(buf_in+BASE64_DIGEST256_LEN, "=\n\0", 3); + if (base64_decode(buf, sizeof(buf), buf_in, strlen(buf_in)) != DIGEST256_LEN) + return -1; + memcpy(digest, buf, DIGEST256_LEN); + return 0; +#else + if (base64_decode(digest, DIGEST256_LEN, d64, strlen(d64)) == DIGEST256_LEN) + return 0; + else + return -1; +#endif +} + /** Implements base32 encoding as in rfc3548. Limitation: Requires * that srclen*8 is a multiple of 5. */ @@ -2217,7 +2518,7 @@ } #ifdef TOR_IS_MULTITHREADED -/** Helper: openssl uses this callback to manipulate mutexes. */ +/** Helper: OpenSSL uses this callback to manipulate mutexes. */ static void _openssl_locking_cb(int mode, int n, const char *file, int line) { @@ -2234,6 +2535,51 @@ tor_mutex_release(_openssl_mutexes[n]); } +/** OpenSSL helper type: wraps a Tor mutex so that OpenSSL can use it + * as a lock. */ +struct CRYPTO_dynlock_value { + tor_mutex_t *lock; +}; + +/** OpenSSL callback function to allocate a lock: see CRYPTO_set_dynlock_* + * documentation in OpenSSL's docs for more info. */ +static struct CRYPTO_dynlock_value * +_openssl_dynlock_create_cb(const char *file, int line) +{ + struct CRYPTO_dynlock_value *v; + (void)file; + (void)line; + v = tor_malloc(sizeof(struct CRYPTO_dynlock_value)); + v->lock = tor_mutex_new(); + return v; +} + +/** OpenSSL callback function to acquire or release a lock: see + * CRYPTO_set_dynlock_* documentation in OpenSSL's docs for more info. */ +static void +_openssl_dynlock_lock_cb(int mode, struct CRYPTO_dynlock_value *v, + const char *file, int line) +{ + (void)file; + (void)line; + if (mode & CRYPTO_LOCK) + tor_mutex_acquire(v->lock); + else + tor_mutex_release(v->lock); +} + +/** OpenSSL callback function to free a lock: see CRYPTO_set_dynlock_* + * documentation in OpenSSL's docs for more info. */ +static void +_openssl_dynlock_destroy_cb(struct CRYPTO_dynlock_value *v, + const char *file, int line) +{ + (void)file; + (void)line; + tor_mutex_free(v->lock); + tor_free(v); +} + /** Helper: Construct mutexes, and set callbacks to help OpenSSL handle being * multithreaded. */ static int @@ -2247,6 +2593,9 @@ _openssl_mutexes[i] = tor_mutex_new(); CRYPTO_set_locking_callback(_openssl_locking_cb); CRYPTO_set_id_callback(tor_get_thread_id); + CRYPTO_set_dynlock_create_callback(_openssl_dynlock_create_cb); + CRYPTO_set_dynlock_lock_callback(_openssl_dynlock_lock_cb); + CRYPTO_set_dynlock_destroy_callback(_openssl_dynlock_destroy_cb); return 0; } #else diff -Nru tor-0.2.0.34/src/common/crypto.h tor-0.2.2.16-alpha/src/common/crypto.h --- tor-0.2.0.34/src/common/crypto.h 2009-01-05 02:06:16.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/crypto.h 2010-07-13 01:37:00.000000000 +0000 @@ -1,9 +1,8 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: crypto.h 17674 2008-12-18 05:47:28Z nickm $ */ /** * \file crypto.h @@ -11,15 +10,17 @@ * \brief Headers for crypto.c **/ -#ifndef __CRYPTO_H -#define __CRYPTO_H -#define CRYPTO_H_ID "$Id: crypto.h 17674 2008-12-18 05:47:28Z nickm $" +#ifndef _TOR_CRYPTO_H +#define _TOR_CRYPTO_H #include #include "torint.h" /** Length of the output of our message digest. */ #define DIGEST_LEN 20 +/** Length of the output of our second (improved) message digests. (For now + * this is just sha256, but any it can be any other 256-byte digest). */ +#define DIGEST256_LEN 32 /** Length of our symmetric cipher's keys. */ #define CIPHER_KEY_LEN 16 /** Length of our symmetric cipher's IV. */ @@ -29,9 +30,12 @@ /** Length of our DH keys. */ #define DH_BYTES (1024/8) -/** Length of a message digest when encoded in base64 with trailing = signs - * removed. */ +/** Length of a sha1 message digest when encoded in base64 with trailing = + * signs removed. */ #define BASE64_DIGEST_LEN 27 +/** Length of a sha256 message digest when encoded in base64 with trailing = + * signs removed. */ +#define BASE64_DIGEST256_LEN 43 /** Constants used to indicate no padding for public-key encryption */ #define PK_NO_PADDING 60000 @@ -50,6 +54,26 @@ #define FINGERPRINT_LEN 49 /** Length of hex encoding of SHA1 digest, not including final NUL. */ #define HEX_DIGEST_LEN 40 +/** Length of hex encoding of SHA256 digest, not including final NUL. */ +#define HEX_DIGEST256_LEN 64 + +typedef enum { + DIGEST_SHA1 = 0, + DIGEST_SHA256 = 1, +} digest_algorithm_t; +#define N_DIGEST_ALGORITHMS (DIGEST_SHA256+1) + +/** A set of all the digests we know how to compute, taken on a single + * string. Any digests that are shorter than 256 bits are right-padded + * with 0 bits. + * + * Note that this representation wastes 12 bytes for the SHA1 case, so + * don't use it for anything where we need to allocate a whole bunch at + * once. + **/ +typedef struct { + char d[N_DIGEST_ALGORITHMS][DIGEST256_LEN]; +} digests_t; typedef struct crypto_pk_env_t crypto_pk_env_t; typedef struct crypto_cipher_env_t crypto_cipher_env_t; @@ -57,7 +81,9 @@ typedef struct crypto_dh_env_t crypto_dh_env_t; /* global state */ -int crypto_global_init(int hardwareAccel); +int crypto_global_init(int hardwareAccel, + const char *accelName, + const char *accelPath); void crypto_thread_cleanup(void); int crypto_global_cleanup(void); @@ -73,14 +99,20 @@ void crypto_free_cipher_env(crypto_cipher_env_t *env); /* public key crypto */ -int crypto_pk_generate_key(crypto_pk_env_t *env); +int crypto_pk_generate_key_with_bits(crypto_pk_env_t *env, int bits); +#define crypto_pk_generate_key(env) \ + crypto_pk_generate_key_with_bits((env), (PK_BYTES*8)) int crypto_pk_read_private_key_from_filename(crypto_pk_env_t *env, const char *keyfile); int crypto_pk_write_public_key_to_string(crypto_pk_env_t *env, char **dest, size_t *len); +int crypto_pk_write_private_key_to_string(crypto_pk_env_t *env, + char **dest, size_t *len); int crypto_pk_read_public_key_from_string(crypto_pk_env_t *env, const char *src, size_t len); +int crypto_pk_read_private_key_from_string(crypto_pk_env_t *env, + const char *s); int crypto_pk_write_private_key_to_filename(crypto_pk_env_t *env, const char *fname); @@ -89,6 +121,7 @@ size_t crypto_pk_keysize(crypto_pk_env_t *env); crypto_pk_env_t *crypto_pk_dup_key(crypto_pk_env_t *orig); crypto_pk_env_t *crypto_pk_copy_full(crypto_pk_env_t *orig); +int crypto_pk_key_is_private(const crypto_pk_env_t *key); int crypto_pk_public_encrypt(crypto_pk_env_t *env, char *to, const char *from, size_t fromlen, int padding); @@ -118,7 +151,7 @@ /* symmetric crypto */ int crypto_cipher_generate_key(crypto_cipher_env_t *env); -int crypto_cipher_set_key(crypto_cipher_env_t *env, const char *key); +void crypto_cipher_set_key(crypto_cipher_env_t *env, const char *key); void crypto_cipher_generate_iv(char *iv_out); int crypto_cipher_set_iv(crypto_cipher_env_t *env, const char *iv); const char *crypto_cipher_get_key(crypto_cipher_env_t *env); @@ -138,9 +171,15 @@ char *to, size_t tolen, const char *from, size_t fromlen); -/* SHA-1 */ +/* SHA-1 and other digests. */ int crypto_digest(char *digest, const char *m, size_t len); +int crypto_digest256(char *digest, const char *m, size_t len, + digest_algorithm_t algorithm); +int crypto_digest_all(digests_t *ds_out, const char *m, size_t len); +const char *crypto_digest_algorithm_get_name(digest_algorithm_t alg); +int crypto_digest_algorithm_parse_name(const char *name); crypto_digest_env_t *crypto_new_digest_env(void); +crypto_digest_env_t *crypto_new_digest256_env(digest_algorithm_t algorithm); void crypto_free_digest_env(crypto_digest_env_t *digest); void crypto_digest_add_bytes(crypto_digest_env_t *digest, const char *data, size_t len); @@ -159,7 +198,7 @@ int crypto_dh_generate_public(crypto_dh_env_t *dh); int crypto_dh_get_public(crypto_dh_env_t *dh, char *pubkey_out, size_t pubkey_out_len); -ssize_t crypto_dh_compute_secret(crypto_dh_env_t *dh, +ssize_t crypto_dh_compute_secret(int severity, crypto_dh_env_t *dh, const char *pubkey, size_t pubkey_len, char *secret_out, size_t secret_out_len); void crypto_dh_free(crypto_dh_env_t *dh); @@ -167,10 +206,11 @@ char *key_out, size_t key_out_len); /* random numbers */ -int crypto_seed_rng(void); +int crypto_seed_rng(int startup); int crypto_rand(char *to, size_t n); int crypto_rand_int(unsigned int max); uint64_t crypto_rand_uint64(uint64_t max); +double crypto_rand_double(void); char *crypto_random_hostname(int min_rand_len, int max_rand_len, const char *prefix, const char *suffix); @@ -188,6 +228,8 @@ int digest_to_base64(char *d64, const char *digest); int digest_from_base64(char *digest, const char *d64); +int digest256_to_base64(char *d64, const char *digest); +int digest256_from_base64(char *digest, const char *d64); /** Length of RFC2440-style S2K specifier: the first 8 bytes are a salt, the * 9th describes how much iteration to do. */ @@ -200,14 +242,13 @@ struct rsa_st; struct evp_pkey_st; struct dh_st; +struct rsa_st *_crypto_pk_env_get_rsa(crypto_pk_env_t *env); crypto_pk_env_t *_crypto_new_pk_env_rsa(struct rsa_st *rsa); crypto_pk_env_t *_crypto_new_pk_env_evp_pkey(struct evp_pkey_st *pkey); struct evp_pkey_st *_crypto_pk_env_get_evp_pkey(crypto_pk_env_t *env, int private); struct dh_st *_crypto_dh_env_get_dh(crypto_dh_env_t *dh); /* Prototypes for private functions only used by crypto.c and test.c*/ -int crypto_pk_read_private_key_from_string(crypto_pk_env_t *env, - const char *s); void add_spaces_to_fp(char *out, size_t outlen, const char *in); #endif diff -Nru tor-0.2.0.34/src/common/ht.h tor-0.2.2.16-alpha/src/common/ht.h --- tor-0.2.0.34/src/common/ht.h 2009-01-14 19:58:15.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/ht.h 2010-03-07 04:03:27.000000000 +0000 @@ -1,13 +1,12 @@ -/* Copyright 2002 Christopher Clark */ -/* Copyright 2005 Nick Mathewson */ +/* Copyright (c) 2002, Christopher Clark. + * Copyright (c) 2005-2006, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See license at end. */ -/* $Id: ht.h 18067 2009-01-10 14:49:41Z nickm $ */ /* Based on ideas by Christopher Clark and interfaces from Niels Provos. */ -#ifndef __HT_H -#define __HT_H -#define HT_H_ID "$Id: ht.h 18067 2009-01-10 14:49:41Z nickm $" +#ifndef _TOR_HT_H +#define _TOR_HT_H #define HT_HEAD(name, type) \ struct name { \ @@ -43,6 +42,10 @@ #define HT_SIZE(head) \ ((head)->hth_n_entries) +/* Return memory usage for a hashtable (not counting the entries themselves) */ +#define HT_MEM_USAGE(head) \ + (sizeof(*head) + (head)->hth_table_length * sizeof(void*)) + #define HT_FIND(name, head, elm) name##_HT_FIND((head), (elm)) #define HT_INSERT(name, head, elm) name##_HT_INSERT((head), (elm)) #define HT_REPLACE(name, head, elm) name##_HT_REPLACE((head), (elm)) @@ -427,7 +430,7 @@ /* * Copyright 2005, Nick Mathewson. Implementation logic is adapted from code - * by Cristopher Clark, retrofit to allow drop-in memory management, and to + * by Christopher Clark, retrofit to allow drop-in memory management, and to * use the same interface as Niels Provos's HT_H. I'm not sure whether this * is a derived work any more, but whether it is or not, the license below * applies. diff -Nru tor-0.2.0.34/src/common/log.c tor-0.2.2.16-alpha/src/common/log.c --- tor-0.2.0.34/src/common/log.c 2008-11-20 22:14:26.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/log.c 2010-07-13 01:37:00.000000000 +0000 @@ -1,10 +1,8 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: log.c 17318 2008-11-17 20:00:04Z nickm $ */ -const char log_c_id[] = "$Id: log.c 17318 2008-11-17 20:00:04Z nickm $"; /** * \file log.c @@ -14,7 +12,7 @@ #include "orconfig.h" #include #include -#include +// #include #include #include #ifdef HAVE_SYS_TIME_H @@ -23,10 +21,20 @@ #ifdef HAVE_TIME_H #include #endif -#include "./util.h" -#include "./log.h" - -#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#include "compat.h" +#include "util.h" +#define LOG_PRIVATE +#include "torlog.h" +#include "container.h" #define TRUNCATED_STR "[...truncated]" #define TRUNCATED_STR_LEN 14 @@ -35,16 +43,18 @@ typedef struct logfile_t { struct logfile_t *next; /**< Next logfile_t in the linked list. */ char *filename; /**< Filename to open. */ - FILE *file; /**< Stream to receive log messages. */ + int fd; /**< fd to receive log messages, or -1 for none. */ int seems_dead; /**< Boolean: true if the stream seems to be kaput. */ int needs_close; /**< Boolean: true if the stream gets closed on shutdown. */ - int min_loglevel; /**< Lowest severity level to send to this stream. */ - int max_loglevel; /**< Highest severity level to send to this stream. */ int is_temporary; /**< Boolean: close after initializing logging subsystem.*/ int is_syslog; /**< Boolean: send messages to syslog. */ log_callback callback; /**< If not NULL, send messages to this function. */ + log_severity_list_t *severities; /**< Which severity of messages should we + * log for each log domain? */ } logfile_t; +static void log_free(logfile_t *victim); + /** Helper: map a log severity to descriptive string. */ static INLINE const char * sev_to_string(int severity) @@ -55,13 +65,15 @@ case LOG_NOTICE: return "notice"; case LOG_WARN: return "warn"; case LOG_ERR: return "err"; - default: assert(0); return "UNKNOWN"; + default: /* Call assert, not tor_assert, since tor_assert + * calls log on failure. */ + assert(0); return "UNKNOWN"; } } /** Helper: decide whether to include the function name in the log message. */ static INLINE int -should_log_function_name(uint32_t domain, int severity) +should_log_function_name(log_domain_mask_t domain, int severity) { switch (severity) { case LOG_DEBUG: @@ -74,33 +86,30 @@ /* We care about places where bugs occur. */ return (domain == LD_BUG); default: + /* Call assert, not tor_assert, since tor_assert calls log on failure. */ assert(0); return 0; } } -#define USE_LOG_MUTEX - -#ifdef USE_LOG_MUTEX /** A mutex to guard changes to logfiles and logging. */ -static tor_mutex_t *log_mutex = NULL; -#endif +static tor_mutex_t log_mutex; +static int log_mutex_initialized = 0; + /** Linked list of logfile_t. */ static logfile_t *logfiles = NULL; #ifdef HAVE_SYSLOG_H +/** The number of open syslog log handlers that we have. When this reaches 0, + * we can close our connection to the syslog facility. */ static int syslog_count = 0; #endif -#ifdef USE_LOG_MUTEX #define LOCK_LOGS() STMT_BEGIN \ - tor_mutex_acquire(log_mutex); \ + tor_mutex_acquire(&log_mutex); \ STMT_END -#define UNLOCK_LOGS() STMT_BEGIN tor_mutex_release(log_mutex); STMT_END -#else -#define LOCK_LOGS() STMT_NIL -#define UNLOCK_LOGS() STMT_NIL -#endif +#define UNLOCK_LOGS() STMT_BEGIN tor_mutex_release(&log_mutex); STMT_END -/* What's the lowest log level anybody cares about? */ +/** What's the lowest log level anybody cares about? Checking this lets us + * bail out early from log_debug if we aren't debugging. */ int _log_global_min_severity = LOG_NOTICE; static void delete_log(logfile_t *victim); @@ -138,8 +147,8 @@ t = (time_t)now.tv_sec; n = strftime(buf, buf_len, "%b %d %H:%M:%S", tor_localtime_r(&t, &tm)); - r = tor_snprintf(buf+n, buf_len-n, ".%.3ld [%s] ", - (long)now.tv_usec / 1000, sev_to_string(severity)); + r = tor_snprintf(buf+n, buf_len-n, ".%.3i [%s] ", + (int)now.tv_usec / 1000, sev_to_string(severity)); if (r<0) return buf_len-1; else @@ -164,11 +173,9 @@ if (lf->is_temporary) /* If it's temporary, it isn't really a file. */ return 0; -#ifdef HAVE_FTELLO - is_new = (ftello(lf->file) == 0); -#else - is_new = (ftell(lf->file) == 0); -#endif + + is_new = lf->fd >= 0 && tor_fd_getpos(lf->fd) == 0; + if (reset && !is_new) /* We are resetting, but we aren't at the start of the file; no * need to log again. */ @@ -181,8 +188,7 @@ tor_snprintf(buf+n, sizeof(buf)-n, "Tor %s opening %slog file.\n", VERSION, is_new?"new ":""); } - if (fputs(buf, lf->file) == EOF || - fflush(lf->file) == EOF) /* error */ + if (write_all(lf->fd, buf, strlen(buf), 0) < 0) /* error */ return -1; /* failed */ return 0; } @@ -194,14 +200,14 @@ */ static INLINE char * format_msg(char *buf, size_t buf_len, - uint32_t domain, int severity, const char *funcname, - const char *format, va_list ap) + log_domain_mask_t domain, int severity, const char *funcname, + const char *format, va_list ap, size_t *msg_len_out) { size_t n; int r; char *end_of_prefix; - tor_assert(buf_len >= 2); /* prevent integer underflow */ + assert(buf_len >= 2); /* prevent integer underflow */ buf_len -= 2; /* subtract 2 characters so we have room for \n\0 */ n = _log_prefix(buf, buf_len, severity); @@ -238,6 +244,7 @@ } buf[n]='\n'; buf[n+1]='\0'; + *msg_len_out = n+1; return end_of_prefix; } @@ -246,14 +253,16 @@ * message. The actual message is derived as from tor_snprintf(format,ap). */ static void -logv(int severity, uint32_t domain, const char *funcname, const char *format, - va_list ap) +logv(int severity, log_domain_mask_t domain, const char *funcname, + const char *format, va_list ap) { char buf[10024]; + size_t msg_len = 0; int formatted = 0; logfile_t *lf; char *end_of_prefix=NULL; + /* Call assert, not tor_assert, since tor_assert calls log on failure. */ assert(format); /* check that severity is sane. Overrunning the masks array leads to * interesting and hard to diagnose effects */ @@ -261,11 +270,11 @@ LOCK_LOGS(); lf = logfiles; while (lf) { - if (severity > lf->min_loglevel || severity < lf->max_loglevel) { + if (! (lf->severities->masks[SEVERITY_MASK_IDX(severity)] & domain)) { lf = lf->next; continue; } - if (! (lf->file || lf->is_syslog || lf->callback)) { + if (! (lf->fd >= 0 || lf->is_syslog || lf->callback)) { lf = lf->next; continue; } @@ -276,14 +285,29 @@ if (!formatted) { end_of_prefix = - format_msg(buf, sizeof(buf), domain, severity, funcname, format, ap); + format_msg(buf, sizeof(buf), domain, severity, funcname, format, ap, + &msg_len); formatted = 1; } if (lf->is_syslog) { #ifdef HAVE_SYSLOG_H - /* XXXX Some syslog implementations have scary limits on the length of - * what you can pass them. Can/should we detect this? */ - syslog(severity, "%s", end_of_prefix); + char *m = end_of_prefix; +#ifdef MAXLINE + /* Some syslog implementations have limits on the length of what you can + * pass them, and some very old ones do not detect overflow so well. + * Regrettably, they call their maximum line length MAXLINE. */ +#if MAXLINE < 64 +#warn "MAXLINE is a very low number; it might not be from syslog.h after all" +#endif + if (msg_len >= MAXLINE) + m = tor_strndup(end_of_prefix, MAXLINE-1); +#endif + syslog(severity, "%s", m); +#ifdef MAXLINE + if (m != end_of_prefix) { + tor_free(m); + } +#endif #endif lf = lf->next; continue; @@ -292,8 +316,7 @@ lf = lf->next; continue; } - if (fputs(buf, lf->file) == EOF || - fflush(lf->file) == EOF) { /* error */ + if (write_all(lf->fd, buf, msg_len, 0) < 0) { /* error */ /* don't log the error! mark this log entry to be blown away, and * continue. */ lf->seems_dead = 1; @@ -305,7 +328,7 @@ /** Output a message to the log. */ void -_log(int severity, uint32_t domain, const char *format, ...) +tor_log(int severity, log_domain_mask_t domain, const char *format, ...) { va_list ap; if (severity > _log_global_min_severity) @@ -318,7 +341,8 @@ /** Output a message to the log, prefixed with a function name fn. */ #ifdef __GNUC__ void -_log_fn(int severity, uint32_t domain, const char *fn, const char *format, ...) +_log_fn(int severity, log_domain_mask_t domain, const char *fn, + const char *format, ...) { va_list ap; if (severity > _log_global_min_severity) @@ -330,7 +354,7 @@ #else const char *_log_fn_function_name=NULL; void -_log_fn(int severity, uint32_t domain, const char *format, ...) +_log_fn(int severity, log_domain_mask_t domain, const char *format, ...) { va_list ap; if (severity > _log_global_min_severity) @@ -341,7 +365,7 @@ _log_fn_function_name = NULL; } void -_log_debug(uint32_t domain, const char *format, ...) +_log_debug(log_domain_mask_t domain, const char *format, ...) { va_list ap; /* For GCC we do this check in the macro. */ @@ -353,7 +377,7 @@ _log_fn_function_name = NULL; } void -_log_info(uint32_t domain, const char *format, ...) +_log_info(log_domain_mask_t domain, const char *format, ...) { va_list ap; if (LOG_INFO > _log_global_min_severity) @@ -364,7 +388,7 @@ _log_fn_function_name = NULL; } void -_log_notice(uint32_t domain, const char *format, ...) +_log_notice(log_domain_mask_t domain, const char *format, ...) { va_list ap; if (LOG_NOTICE > _log_global_min_severity) @@ -375,7 +399,7 @@ _log_fn_function_name = NULL; } void -_log_warn(uint32_t domain, const char *format, ...) +_log_warn(log_domain_mask_t domain, const char *format, ...) { va_list ap; if (LOG_WARN > _log_global_min_severity) @@ -386,7 +410,7 @@ _log_fn_function_name = NULL; } void -_log_err(uint32_t domain, const char *format, ...) +_log_err(log_domain_mask_t domain, const char *format, ...) { va_list ap; if (LOG_ERR > _log_global_min_severity) @@ -398,6 +422,17 @@ } #endif +/** Free all storage held by victim. */ +static void +log_free(logfile_t *victim) +{ + if (!victim) + return; + tor_free(victim->severities); + tor_free(victim->filename); + tor_free(victim); +} + /** Close all open log files, and free other static memory. */ void logs_free_all(void) @@ -411,10 +446,12 @@ victim = next; next = next->next; close_log(victim); - tor_free(victim->filename); - tor_free(victim); + log_free(victim); } tor_free(appname); + + /* We _could_ destroy the log mutex here, but that would screw up any logs + * that happened between here and the end of execution. */ } /** Remove and free the log entry victim from the linked-list @@ -439,8 +476,7 @@ return; tmpl->next = victim->next; } - tor_free(victim->filename); - tor_free(victim); + log_free(victim); } /** Helper: release system resources (but not memory) held by a single @@ -448,8 +484,9 @@ static void close_log(logfile_t *victim) { - if (victim->needs_close && victim->file) { - fclose(victim->file); + if (victim->needs_close && victim->fd >= 0) { + close(victim->fd); + victim->fd = -1; } else if (victim->is_syslog) { #ifdef HAVE_SYSLOG_H if (--syslog_count == 0) { @@ -460,33 +497,49 @@ } } -/** Add a log handler named name to send all messages of severity - * between loglevelMin and loglevelMax (inclusive) to - * stream. */ +/** Adjust a log severity configuration in severity_out to contain + * every domain between loglevelMin and loglevelMax, inclusive. + */ +void +set_log_severity_config(int loglevelMin, int loglevelMax, + log_severity_list_t *severity_out) +{ + int i; + tor_assert(loglevelMin >= loglevelMax); + tor_assert(loglevelMin >= LOG_ERR && loglevelMin <= LOG_DEBUG); + tor_assert(loglevelMax >= LOG_ERR && loglevelMax <= LOG_DEBUG); + memset(severity_out, 0, sizeof(log_severity_list_t)); + for (i = loglevelMin; i >= loglevelMax; --i) { + severity_out->masks[SEVERITY_MASK_IDX(i)] = ~0u; + } +} + +/** Add a log handler named name to send all messages in severity + * to fd. Copies severity. Helper: does no locking. */ static void -add_stream_log_impl(int loglevelMin, int loglevelMax, - const char *name, FILE *stream) +add_stream_log_impl(const log_severity_list_t *severity, + const char *name, int fd) { logfile_t *lf; lf = tor_malloc_zero(sizeof(logfile_t)); + lf->fd = fd; lf->filename = tor_strdup(name); - lf->min_loglevel = loglevelMin; - lf->max_loglevel = loglevelMax; - lf->file = stream; + lf->severities = tor_memdup(severity, sizeof(log_severity_list_t)); lf->next = logfiles; logfiles = lf; _log_global_min_severity = get_min_log_level(); } -/** Add a log handler to send all messages of severity loglevel - * or higher to stream. */ +/** Add a log handler named name to send all messages in severity + * to fd. Steals a reference to severity; the caller must + * not use it after calling this function. */ void -add_stream_log(int loglevelMin, int loglevelMax, - const char *name, FILE *stream) +add_stream_log(const log_severity_list_t *severity, + const char *name, int fd) { LOCK_LOGS(); - add_stream_log_impl(loglevelMin, loglevelMax, name, stream); + add_stream_log_impl(severity, name, fd); UNLOCK_LOGS(); } @@ -494,34 +547,38 @@ void init_logging(void) { - if (!log_mutex) - log_mutex = tor_mutex_new(); + if (!log_mutex_initialized) { + tor_mutex_init(&log_mutex); + log_mutex_initialized = 1; + } } /** Add a log handler to receive messages during startup (before the real * logs are initialized). */ void -add_temp_log(void) +add_temp_log(int min_severity) { + log_severity_list_t *s = tor_malloc_zero(sizeof(log_severity_list_t)); + set_log_severity_config(min_severity, LOG_ERR, s); LOCK_LOGS(); - add_stream_log_impl(LOG_NOTICE, LOG_ERR, "", stdout); + add_stream_log_impl(s, "", fileno(stdout)); + tor_free(s); logfiles->is_temporary = 1; UNLOCK_LOGS(); } /** - * Add a log handler to send messages of severity between - * logLevelmin and logLevelMax to the function - * cb. + * Add a log handler to send messages in severity + * to the function cb. */ int -add_callback_log(int loglevelMin, int loglevelMax, log_callback cb) +add_callback_log(const log_severity_list_t *severity, log_callback cb) { logfile_t *lf; lf = tor_malloc_zero(sizeof(logfile_t)); - lf->min_loglevel = loglevelMin; - lf->max_loglevel = loglevelMax; + lf->fd = -1; + lf->severities = tor_memdup(severity, sizeof(log_severity_list_t)); lf->filename = tor_strdup(""); lf->callback = cb; lf->next = logfiles; @@ -540,18 +597,20 @@ log_callback cb) { logfile_t *lf; + log_severity_list_t severities; + set_log_severity_config(loglevelMin, loglevelMax, &severities); LOCK_LOGS(); for (lf = logfiles; lf; lf = lf->next) { if (lf->callback == cb) { - lf->min_loglevel = loglevelMin; - lf->max_loglevel = loglevelMax; + memcpy(lf->severities, &severities, sizeof(severities)); } } _log_global_min_severity = get_min_log_level(); UNLOCK_LOGS(); } -/** Close any log handlers added by add_temp_log or marked by mark_logs_temp */ +/** Close any log handlers added by add_temp_log() or marked by + * mark_logs_temp(). */ void close_temp_logs(void) { @@ -564,8 +623,7 @@ /* we use *p here to handle the edge case of the head of the list */ *p = (*p)->next; close_log(lf); - tor_free(lf->filename); - tor_free(lf); + log_free(lf); } else { p = &((*p)->next); } @@ -588,7 +646,7 @@ close_temp_logs(); } -/** Configure all log handles to be closed by close_temp_logs */ +/** Configure all log handles to be closed by close_temp_logs(). */ void mark_logs_temp(void) { @@ -600,29 +658,31 @@ } /** - * Add a log handler to send messages to filename. If opening - * the logfile fails, -1 is returned and errno is set appropriately - * (by fopen). + * Add a log handler to send messages to filename. If opening the + * logfile fails, -1 is returned and errno is set appropriately (by open(2)). */ int -add_file_log(int loglevelMin, int loglevelMax, const char *filename) +add_file_log(const log_severity_list_t *severity, const char *filename) { - FILE *f; + int fd; logfile_t *lf; - f = fopen(filename, "a"); - if (!f) return -1; + + fd = open(filename, O_WRONLY|O_CREAT|O_APPEND, 0644); + if (fd<0) + return -1; + if (tor_fd_seekend(fd)<0) + return -1; + LOCK_LOGS(); - add_stream_log_impl(loglevelMin, loglevelMax, filename, f); + add_stream_log_impl(severity, filename, fd); logfiles->needs_close = 1; lf = logfiles; _log_global_min_severity = get_min_log_level(); - UNLOCK_LOGS(); if (log_tor_version(lf, 0) < 0) { - LOCK_LOGS(); delete_log(lf); - UNLOCK_LOGS(); } + UNLOCK_LOGS(); return 0; } @@ -632,7 +692,7 @@ * Add a log handler to send messages to they system log facility. */ int -add_syslog_log(int loglevelMin, int loglevelMax) +add_syslog_log(const log_severity_list_t *severity) { logfile_t *lf; if (syslog_count++ == 0) @@ -640,9 +700,10 @@ openlog("Tor", LOG_PID | LOG_NDELAY, LOGFACILITY); lf = tor_malloc_zero(sizeof(logfile_t)); - lf->min_loglevel = loglevelMin; + lf->fd = -1; + lf->severities = tor_memdup(severity, sizeof(log_severity_list_t)); lf->filename = tor_strdup(""); - lf->max_loglevel = loglevelMax; + lf->is_syslog = 1; LOCK_LOGS(); @@ -679,15 +740,170 @@ return sev_to_string(level); } +/** NULL-terminated array of names for log domains such that domain_list[dom] + * is a description of dom. */ +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", NULL +}; + +/** Return a bitmask for the log domain for which domain is the name, + * or 0 if there is no such name. */ +static log_domain_mask_t +parse_log_domain(const char *domain) +{ + int i; + for (i=0; domain_list[i]; ++i) { + if (!strcasecmp(domain, domain_list[i])) + return (1u<= N_LOGGING_DOMAINS) + return NULL; + return domain_list[bit]; +} +#endif + +/** Parse a log severity pattern in *cfg_ptr. Advance cfg_ptr after + * the end of the severityPattern. Set the value of severity_out to + * the parsed pattern. Return 0 on success, -1 on failure. + * + * The syntax for a SeverityPattern is: + *
+ *   SeverityPattern = *(DomainSeverity SP)* DomainSeverity
+ *   DomainSeverity = (DomainList SP)? SeverityRange
+ *   SeverityRange = MinSeverity ("-" MaxSeverity )?
+ *   DomainList = "[" (SP? DomainSpec SP? ",") SP? DomainSpec "]"
+ *   DomainSpec = "*" | Domain | "~" Domain
+ * 
+ * A missing MaxSeverity defaults to ERR. Severities and domains are + * case-insensitive. "~" indicates negation for a domain; negation happens + * last inside a DomainList. Only one SeverityRange without a DomainList is + * allowed per line. + */ +int +parse_log_severity_config(const char **cfg_ptr, + log_severity_list_t *severity_out) +{ + const char *cfg = *cfg_ptr; + int got_anything = 0; + int got_an_unqualified_range = 0; + memset(severity_out, 0, sizeof(*severity_out)); + + cfg = eat_whitespace(cfg); + while (*cfg) { + const char *dash, *space; + char *sev_lo, *sev_hi; + int low, high, i; + log_domain_mask_t domains = ~0u; + + if (*cfg == '[') { + int err = 0; + char *domains_str; + smartlist_t *domains_list; + log_domain_mask_t neg_domains = 0; + const char *closebracket = strchr(cfg, ']'); + if (!closebracket) + return -1; + domains = 0; + domains_str = tor_strndup(cfg+1, closebracket-cfg-1); + domains_list = smartlist_create(); + smartlist_split_string(domains_list, domains_str, ",", SPLIT_SKIP_SPACE, + -1); + tor_free(domains_str); + SMARTLIST_FOREACH(domains_list, const char *, domain, + { + if (!strcmp(domain, "*")) { + domains = ~0u; + } else { + int d; + int negate=0; + if (*domain == '~') { + negate = 1; + ++domain; + } + d = parse_log_domain(domain); + if (!d) { + log_warn(LD_CONFIG, "No such logging domain as %s", domain); + err = 1; + } else { + if (negate) + neg_domains |= d; + else + domains |= d; + } + } + }); + SMARTLIST_FOREACH(domains_list, char *, d, tor_free(d)); + smartlist_free(domains_list); + if (err) + return -1; + domains &= ~neg_domains; + cfg = eat_whitespace(closebracket+1); + } else { + ++got_an_unqualified_range; + } + if (!strcasecmpstart(cfg, "file") || + !strcasecmpstart(cfg, "stderr") || + !strcasecmpstart(cfg, "stdout") || + !strcasecmpstart(cfg, "syslog")) { + goto done; + } + if (got_an_unqualified_range > 1) + return -1; + + space = strchr(cfg, ' '); + dash = strchr(cfg, '-'); + if (!space) + space = strchr(cfg, '\0'); + if (dash && dash < space) { + sev_lo = tor_strndup(cfg, dash-cfg); + sev_hi = tor_strndup(dash+1, space-(dash+1)); + } else { + sev_lo = tor_strndup(cfg, space-cfg); + sev_hi = tor_strdup("ERR"); + } + low = parse_log_level(sev_lo); + high = parse_log_level(sev_hi); + tor_free(sev_lo); + tor_free(sev_hi); + if (low == -1) + return -1; + if (high == -1) + return -1; + + got_anything = 1; + for (i=low; i >= high; --i) + severity_out->masks[SEVERITY_MASK_IDX(i)] |= domains; + + cfg = eat_whitespace(space); + } + + done: + *cfg_ptr = cfg; + return got_anything ? 0 : -1; +} + /** Return the least severe log level that any current log is interested in. */ int get_min_log_level(void) { logfile_t *lf; + int i; int min = LOG_ERR; for (lf = logfiles; lf; lf = lf->next) { - if (lf->min_loglevel > min) - min = lf->min_loglevel; + for (i = LOG_DEBUG; i > min; --i) + if (lf->severities->masks[SEVERITY_MASK_IDX(i)]) + min = i; } return min; } @@ -697,73 +913,16 @@ switch_logs_debug(void) { logfile_t *lf; + int i; LOCK_LOGS(); for (lf = logfiles; lf; lf=lf->next) { - lf->min_loglevel = LOG_DEBUG; + for (i = LOG_DEBUG; i >= LOG_ERR; --i) + lf->severities->masks[SEVERITY_MASK_IDX(i)] = ~0u; } _log_global_min_severity = get_min_log_level(); UNLOCK_LOGS(); } -#ifdef HAVE_EVENT_SET_LOG_CALLBACK -/** A string which, if it appears in a libevent log, should be ignored. */ -static const char *suppress_msg = NULL; -/** Callback function passed to event_set_log() so we can intercept - * log messages from libevent. */ -static void -libevent_logging_callback(int severity, const char *msg) -{ - char buf[1024]; - size_t n; - if (suppress_msg && strstr(msg, suppress_msg)) - return; - n = strlcpy(buf, msg, sizeof(buf)); - if (n && n < sizeof(buf) && buf[n-1] == '\n') { - buf[n-1] = '\0'; - } - switch (severity) { - case _EVENT_LOG_DEBUG: - log(LOG_DEBUG, LD_NET, "Message from libevent: %s", buf); - break; - case _EVENT_LOG_MSG: - log(LOG_INFO, LD_NET, "Message from libevent: %s", buf); - break; - case _EVENT_LOG_WARN: - log(LOG_WARN, LD_GENERAL, "Warning from libevent: %s", buf); - break; - case _EVENT_LOG_ERR: - log(LOG_ERR, LD_GENERAL, "Error from libevent: %s", buf); - break; - default: - log(LOG_WARN, LD_GENERAL, "Message [%d] from libevent: %s", - severity, buf); - break; - } -} -/** Set hook to intercept log messages from libevent. */ -void -configure_libevent_logging(void) -{ - event_set_log_callback(libevent_logging_callback); -} -/** Ignore any libevent log message that contains msg. */ -void -suppress_libevent_log_msg(const char *msg) -{ - suppress_msg = msg; -} -#else -void -configure_libevent_logging(void) -{ -} -void -suppress_libevent_log_msg(const char *msg) -{ - (void)msg; -} -#endif - #if 0 static void dump_log_info(logfile_t *lf) diff -Nru tor-0.2.0.34/src/common/log.h tor-0.2.2.16-alpha/src/common/log.h --- tor-0.2.0.34/src/common/log.h 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/log.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,185 +0,0 @@ -/* Copyright (c) 2001, Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -/* $Id: log.h 13412 2008-02-07 05:31:47Z nickm $ */ - -/** - * \file log.h - * - * \brief Headers for log.c - **/ - -#ifndef __LOG_H -#define LOG_H_ID "$Id: log.h 13412 2008-02-07 05:31:47Z nickm $" - -#include "compat.h" - -#ifdef HAVE_SYSLOG_H -#include -#define LOG_WARN LOG_WARNING -#if LOG_DEBUG < LOG_ERR -#error "Your syslog.h thinks high numbers are more important. " \ - "We aren't prepared to deal with that." -#endif -#else -/* Note: Syslog's logging code refers to priorities, with 0 being the most - * important. Thus, all our comparisons needed to be reversed when we added - * syslog support. - * - * The upshot of this is that comments about log levels may be messed up: for - * "maximum severity" read "most severe" and "numerically *lowest* severity". - */ - -/** Debug-level severity: for hyper-verbose messages of no interest to - * anybody but developers. */ -#define LOG_DEBUG 7 -/** Info-level severity: for messages that appear frequently during normal - * operation. */ -#define LOG_INFO 6 -/** Notice-level severity: for messages that appear infrequently - * during normal operation; that the user will probably care about; - * and that are not errors. - */ -#define LOG_NOTICE 5 -/** Warn-level severity: for messages that only appear when something has gone - * wrong. */ -#define LOG_WARN 4 -/** Error-level severity: for messages that only appear when something has gone - * very wrong, and the Tor process can no longer proceed. */ -#define LOG_ERR 3 -#endif - -/* Logging domains */ - -/** Catch-all for miscellaneous events and fatal errors. */ -#define LD_GENERAL (1u<<0) -/** The cryptography subsytem. */ -#define LD_CRYPTO (1u<<1) -/** Networking. */ -#define LD_NET (1u<<2) -/** Parsing and acting on our configuration. */ -#define LD_CONFIG (1u<<3) -/** Reading and writing from the filesystem. */ -#define LD_FS (1u<<4) -/** Other servers' (non)compliance with the Tor protocol. */ -#define LD_PROTOCOL (1u<<5) -/** Memory management. */ -#define LD_MM (1u<<6) -/** HTTP implementation. */ -#define LD_HTTP (1u<<7) -/** Application (socks) requests. */ -#define LD_APP (1u<<8) -/** Communication via the controller protocol. */ -#define LD_CONTROL (1u<<9) -/** Building, using, and managing circuits. */ -#define LD_CIRC (1u<<10) -/** Hidden services. */ -#define LD_REND (1u<<11) -/** Internal errors in this Tor process. */ -#define LD_BUG (1u<<12) -/** Learning and using information about Tor servers. */ -#define LD_DIR (1u<<13) -/** Learning and using information about Tor servers. */ -#define LD_DIRSERV (1u<<14) -/** Onion routing protocol. */ -#define LD_OR (1u<<15) -/** Generic edge-connection functionality. */ -#define LD_EDGE (1u<<16) -#define LD_EXIT LD_EDGE -/** Bandwidth accounting. */ -#define LD_ACCT (1u<<17) - -/** Callback type used for add_callback_log. */ -typedef void (*log_callback)(int severity, uint32_t domain, const char *msg); - -void init_logging(void); -int parse_log_level(const char *level); -const char *log_level_to_string(int level); -void add_stream_log(int severityMin, int severityMax, const char *name, - FILE *stream); -int add_file_log(int severityMin, int severityMax, const char *filename); -#ifdef HAVE_SYSLOG_H -int add_syslog_log(int loglevelMin, int loglevelMax); -#endif -int add_callback_log(int loglevelMin, int loglevelMax, log_callback cb); -int get_min_log_level(void); -void switch_logs_debug(void); -void logs_free_all(void); -void add_temp_log(void); -void close_temp_logs(void); -void rollback_log_changes(void); -void mark_logs_temp(void); -void configure_libevent_logging(void); -void suppress_libevent_log_msg(const char *msg); -void change_callback_log_severity(int loglevelMin, int loglevelMax, - log_callback cb); -void log_set_application_name(const char *name); - -/* Outputs a message to stdout */ -void _log(int severity, uint32_t domain, const char *format, ...) - CHECK_PRINTF(3,4); -#define log _log /* hack it so we don't conflict with log() as much */ - -#ifdef __GNUC__ -extern int _log_global_min_severity; - -void _log_fn(int severity, uint32_t domain, - const char *funcname, const char *format, ...) - CHECK_PRINTF(4,5); -/** Log a message at level severity, using a pretty-printed version - * of the current function name. */ -#define log_fn(severity, domain, args...) \ - _log_fn(severity, domain, __PRETTY_FUNCTION__, args) -#define log_debug(domain, args...) \ - STMT_BEGIN \ - if (PREDICT_UNLIKELY(_log_global_min_severity == LOG_DEBUG)) \ - _log_fn(LOG_DEBUG, domain, __PRETTY_FUNCTION__, args); \ - STMT_END -#define log_info(domain, args...) \ - _log_fn(LOG_INFO, domain, __PRETTY_FUNCTION__, args) -#define log_notice(domain, args...) \ - _log_fn(LOG_NOTICE, domain, __PRETTY_FUNCTION__, args) -#define log_warn(domain, args...) \ - _log_fn(LOG_WARN, domain, __PRETTY_FUNCTION__, args) -#define log_err(domain, args...) \ - _log_fn(LOG_ERR, domain, __PRETTY_FUNCTION__, args) - -#else /* ! defined(__GNUC__) */ - -void _log_fn(int severity, uint32_t domain, const char *format, ...); -void _log_debug(uint32_t domain, const char *format, ...); -void _log_info(uint32_t domain, const char *format, ...); -void _log_notice(uint32_t domain, const char *format, ...); -void _log_warn(uint32_t domain, const char *format, ...); -void _log_err(uint32_t domain, const char *format, ...); - -#if defined(_MSC_VER) && _MSC_VER < 1300 -/* MSVC 6 and earlier don't have __func__, or even __LINE__. */ -#define log_fn _log_fn -#define log_debug _log_debug -#define log_info _log_info -#define log_notice _log_notice -#define log_warn _log_warn -#define log_err _log_err -#else -/* We don't have GCC's varargs macros, so use a global variable to pass the - * function name to log_fn */ -extern const char *_log_fn_function_name; -/* We abuse the comma operator here, since we can't use the standard - * do {...} while (0) trick to wrap this macro, since the macro can't take - * arguments. */ -#define log_fn (_log_fn_function_name=__func__),_log_fn -#define log_debug (_log_fn_function_name=__func__),_log_debug -#define log_info (_log_fn_function_name=__func__),_log_info -#define log_notice (_log_fn_function_name=__func__),_log_notice -#define log_warn (_log_fn_function_name=__func__),_log_warn -#define log_err (_log_fn_function_name=__func__),_log_err -#endif - -#endif /* !GNUC */ - -# define __LOG_H -#endif - diff -Nru tor-0.2.0.34/src/common/Makefile.am tor-0.2.2.16-alpha/src/common/Makefile.am --- tor-0.2.0.34/src/common/Makefile.am 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/Makefile.am 2010-07-13 01:37:00.000000000 +0000 @@ -1,5 +1,7 @@ -noinst_LIBRARIES = libor.a libor-crypto.a +noinst_LIBRARIES = libor.a libor-crypto.a libor-event.a + +EXTRA_DIST = common_sha1.i sha256.c #CFLAGS = -Wall -Wpointer-arith -O2 @@ -9,8 +11,22 @@ libor_extra_source= endif -libor_a_SOURCES = log.c util.c compat.c container.c mempool.c \ - $(libor_extra_source) +libor_a_SOURCES = address.c log.c util.c compat.c container.c mempool.c \ + memarea.c util_codedigest.c $(libor_extra_source) libor_crypto_a_SOURCES = crypto.c aes.c tortls.c torgzip.c +libor_event_a_SOURCES = compat_libevent.c + +noinst_HEADERS = address.h torlog.h crypto.h util.h compat.h aes.h torint.h tortls.h strlcpy.c strlcat.c torgzip.h container.h ht.h mempool.h memarea.h ciphers.inc compat_libevent.h tortls_states.h + +common_sha1.i: $(libor_SOURCES) $(libor_crypto_a_SOURCES) $(noinst_HEADERS) + if test "@SHA1SUM@" != none; then \ + @SHA1SUM@ $(libor_SOURCES) $(libor_crypto_a_SOURCES) $(noinst_HEADERS) | @SED@ -n 's/^\(.*\)$$/"\1\\n"/p' > common_sha1.i; \ + elif test "@OPENSSL@" != none; then \ + @OPENSSL@ sha1 $(libor_SOURCES) $(libor_crypto_a_SOURCES) $(noinst_HEADERS) | @SED@ -n 's/SHA1(\(.*\))= \(.*\)/"\2 \1\\n"/p' > common_sha1.i; \ + else \ + rm common_sha1.i; \ + touch common_sha1.i; \ + fi -noinst_HEADERS = log.h crypto.h test.h util.h compat.h aes.h torint.h tortls.h strlcpy.c strlcat.c torgzip.h container.h ht.h mempool.h +util_codedigest.o: common_sha1.i +crypto.o: sha256.c diff -Nru tor-0.2.0.34/src/common/Makefile.in tor-0.2.2.16-alpha/src/common/Makefile.in --- tor-0.2.0.34/src/common/Makefile.in 2009-02-09 03:31:02.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/Makefile.in 2010-09-17 06:08:41.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -52,30 +52,39 @@ am_libor_crypto_a_OBJECTS = crypto.$(OBJEXT) aes.$(OBJEXT) \ tortls.$(OBJEXT) torgzip.$(OBJEXT) libor_crypto_a_OBJECTS = $(am_libor_crypto_a_OBJECTS) +libor_event_a_AR = $(AR) $(ARFLAGS) +libor_event_a_LIBADD = +am_libor_event_a_OBJECTS = compat_libevent.$(OBJEXT) +libor_event_a_OBJECTS = $(am_libor_event_a_OBJECTS) libor_a_AR = $(AR) $(ARFLAGS) libor_a_LIBADD = -am__libor_a_SOURCES_DIST = log.c util.c compat.c container.c mempool.c \ - OpenBSD_malloc_Linux.c +am__libor_a_SOURCES_DIST = address.c log.c util.c compat.c container.c \ + mempool.c memarea.c util_codedigest.c OpenBSD_malloc_Linux.c @USE_OPENBSD_MALLOC_TRUE@am__objects_1 = \ @USE_OPENBSD_MALLOC_TRUE@ OpenBSD_malloc_Linux.$(OBJEXT) -am_libor_a_OBJECTS = log.$(OBJEXT) util.$(OBJEXT) compat.$(OBJEXT) \ - container.$(OBJEXT) mempool.$(OBJEXT) $(am__objects_1) +am_libor_a_OBJECTS = address.$(OBJEXT) log.$(OBJEXT) util.$(OBJEXT) \ + compat.$(OBJEXT) container.$(OBJEXT) mempool.$(OBJEXT) \ + memarea.$(OBJEXT) util_codedigest.$(OBJEXT) $(am__objects_1) libor_a_OBJECTS = $(am_libor_a_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libor_crypto_a_SOURCES) $(libor_a_SOURCES) -DIST_SOURCES = $(libor_crypto_a_SOURCES) $(am__libor_a_SOURCES_DIST) +SOURCES = $(libor_crypto_a_SOURCES) $(libor_event_a_SOURCES) \ + $(libor_a_SOURCES) +DIST_SOURCES = $(libor_crypto_a_SOURCES) $(libor_event_a_SOURCES) \ + $(am__libor_a_SOURCES_DIST) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -110,6 +119,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -118,7 +128,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -129,8 +141,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -181,16 +196,18 @@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -noinst_LIBRARIES = libor.a libor-crypto.a +noinst_LIBRARIES = libor.a libor-crypto.a libor-event.a +EXTRA_DIST = common_sha1.i sha256.c @USE_OPENBSD_MALLOC_FALSE@libor_extra_source = #CFLAGS = -Wall -Wpointer-arith -O2 @USE_OPENBSD_MALLOC_TRUE@libor_extra_source = OpenBSD_malloc_Linux.c -libor_a_SOURCES = log.c util.c compat.c container.c mempool.c \ - $(libor_extra_source) +libor_a_SOURCES = address.c log.c util.c compat.c container.c mempool.c \ + memarea.c util_codedigest.c $(libor_extra_source) libor_crypto_a_SOURCES = crypto.c aes.c tortls.c torgzip.c -noinst_HEADERS = log.h crypto.h test.h util.h compat.h aes.h torint.h tortls.h strlcpy.c strlcat.c torgzip.h container.h ht.h mempool.h +libor_event_a_SOURCES = compat_libevent.c +noinst_HEADERS = address.h torlog.h crypto.h util.h compat.h aes.h torint.h tortls.h strlcpy.c strlcat.c torgzip.h container.h ht.h mempool.h memarea.h ciphers.inc compat_libevent.h tortls_states.h all: all-am .SUFFIXES: @@ -231,6 +248,10 @@ -rm -f libor-crypto.a $(libor_crypto_a_AR) libor-crypto.a $(libor_crypto_a_OBJECTS) $(libor_crypto_a_LIBADD) $(RANLIB) libor-crypto.a +libor-event.a: $(libor_event_a_OBJECTS) $(libor_event_a_DEPENDENCIES) + -rm -f libor-event.a + $(libor_event_a_AR) libor-event.a $(libor_event_a_OBJECTS) $(libor_event_a_LIBADD) + $(RANLIB) libor-event.a libor.a: $(libor_a_OBJECTS) $(libor_a_DEPENDENCIES) -rm -f libor.a $(libor_a_AR) libor.a $(libor_a_OBJECTS) $(libor_a_LIBADD) @@ -243,15 +264,19 @@ -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OpenBSD_malloc_Linux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/address.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compat_libevent.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/container.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memarea.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mempool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/torgzip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tortls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util_codedigest.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -272,8 +297,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS @@ -285,8 +310,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ @@ -296,13 +321,12 @@ CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique @@ -441,6 +465,19 @@ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am + +common_sha1.i: $(libor_SOURCES) $(libor_crypto_a_SOURCES) $(noinst_HEADERS) + if test "@SHA1SUM@" != none; then \ + @SHA1SUM@ $(libor_SOURCES) $(libor_crypto_a_SOURCES) $(noinst_HEADERS) | @SED@ -n 's/^\(.*\)$$/"\1\\n"/p' > common_sha1.i; \ + elif test "@OPENSSL@" != none; then \ + @OPENSSL@ sha1 $(libor_SOURCES) $(libor_crypto_a_SOURCES) $(noinst_HEADERS) | @SED@ -n 's/SHA1(\(.*\))= \(.*\)/"\2 \1\\n"/p' > common_sha1.i; \ + else \ + rm common_sha1.i; \ + touch common_sha1.i; \ + fi + +util_codedigest.o: common_sha1.i +crypto.o: sha256.c # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff -Nru tor-0.2.0.34/src/common/memarea.c tor-0.2.2.16-alpha/src/common/memarea.c --- tor-0.2.0.34/src/common/memarea.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/memarea.c 2010-07-13 01:37:00.000000000 +0000 @@ -0,0 +1,313 @@ +/* Copyright (c) 2008-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** \file memarea.c + * \brief Implementation for memarea_t, an allocator for allocating lots of + * small objects that will be freed all at once. + */ + +#include "orconfig.h" +#include +#include "memarea.h" +#include "util.h" +#include "compat.h" +#include "torlog.h" + +/** If true, we try to detect any attempts to write beyond the length of a + * memarea. */ +#define USE_SENTINELS + +/** All returned pointers should be aligned to the nearest multiple of this + * value. */ +#define MEMAREA_ALIGN SIZEOF_VOID_P + +#if MEMAREA_ALIGN == 4 +#define MEMAREA_ALIGN_MASK 3lu +#elif MEMAREA_ALIGN == 8 +#define MEMAREA_ALIGN_MASK 7lu +#else +#error "void* is neither 4 nor 8 bytes long. I don't know how to align stuff." +#endif + +#ifdef USE_SENTINELS +#define SENTINEL_VAL 0x90806622u +#define SENTINEL_LEN sizeof(uint32_t) +#define SET_SENTINEL(chunk) \ + STMT_BEGIN \ + set_uint32( &(chunk)->u.mem[chunk->mem_size], SENTINEL_VAL ); \ + STMT_END +#define CHECK_SENTINEL(chunk) \ + STMT_BEGIN \ + uint32_t sent_val = get_uint32(&(chunk)->u.mem[chunk->mem_size]); \ + tor_assert(sent_val == SENTINEL_VAL); \ + STMT_END +#else +#define SENTINEL_LEN 0 +#define SET_SENTINEL(chunk) STMT_NIL +#define CHECK_SENTINEL(chunk) STMT_NIL +#endif + +/** Increment ptr until it is aligned to MEMAREA_ALIGN. */ +static INLINE void * +realign_pointer(void *ptr) +{ + uintptr_t x = (uintptr_t)ptr; + x = (x+MEMAREA_ALIGN_MASK) & ~MEMAREA_ALIGN_MASK; + tor_assert(((void*)x) >= ptr); // XXXX021 remove this once bug 930 is solved + return (void*)x; +} + +/** Implements part of a memarea. New memory is carved off from chunk->mem in + * increasing order until a request is too big, at which point a new chunk is + * allocated. */ +typedef struct memarea_chunk_t { + /** Next chunk in this area. Only kept around so we can free it. */ + struct memarea_chunk_t *next_chunk; + size_t mem_size; /**< How much RAM is available in u.mem, total? */ + char *next_mem; /**< Next position in u.mem to allocate data at. If it's + * greater than or equal to mem+mem_size, this chunk is + * full. */ + union { + char mem[1]; /**< Memory space in this chunk. */ + void *_void_for_alignment; /**< Dummy; used to make sure mem is aligned. */ + } u; +} memarea_chunk_t; + +#define CHUNK_HEADER_SIZE STRUCT_OFFSET(memarea_chunk_t, u) + +#define CHUNK_SIZE 4096 + +/** A memarea_t is an allocation region for a set of small memory requests + * that will all be freed at once. */ +struct memarea_t { + memarea_chunk_t *first; /**< Top of the chunk stack: never NULL. */ +}; + +/** How many chunks will we put into the freelist before freeing them? */ +#define MAX_FREELIST_LEN 4 +/** The number of memarea chunks currently in our freelist. */ +static int freelist_len=0; +/** A linked list of unused memory area chunks. Used to prevent us from + * spinning in malloc/free loops. */ +static memarea_chunk_t *freelist = NULL; + +/** Helper: allocate a new memarea chunk of around chunk_size bytes. */ +static memarea_chunk_t * +alloc_chunk(size_t sz, int freelist_ok) +{ + if (freelist && freelist_ok) { + memarea_chunk_t *res = freelist; + freelist = res->next_chunk; + res->next_chunk = NULL; + --freelist_len; + CHECK_SENTINEL(res); + return res; + } else { + size_t chunk_size = freelist_ok ? CHUNK_SIZE : sz; + memarea_chunk_t *res; + chunk_size += SENTINEL_LEN; + res = tor_malloc_roundup(&chunk_size); + res->next_chunk = NULL; + res->mem_size = chunk_size - CHUNK_HEADER_SIZE - SENTINEL_LEN; + res->next_mem = res->u.mem; + tor_assert(res->next_mem+res->mem_size+SENTINEL_LEN == + ((char*)res)+chunk_size); + tor_assert(realign_pointer(res->next_mem) == res->next_mem); + SET_SENTINEL(res); + return res; + } +} + +/** Release chunk from a memarea, either by adding it to the freelist + * or by freeing it if the freelist is already too big. */ +static void +chunk_free_unchecked(memarea_chunk_t *chunk) +{ + CHECK_SENTINEL(chunk); + if (freelist_len < MAX_FREELIST_LEN) { + ++freelist_len; + chunk->next_chunk = freelist; + freelist = chunk; + chunk->next_mem = chunk->u.mem; + } else { + tor_free(chunk); + } +} + +/** Allocate and return new memarea. */ +memarea_t * +memarea_new(void) +{ + memarea_t *head = tor_malloc(sizeof(memarea_t)); + head->first = alloc_chunk(CHUNK_SIZE, 1); + return head; +} + +/** Free area, invalidating all pointers returned from memarea_alloc() + * and friends for this area */ +void +memarea_drop_all(memarea_t *area) +{ + memarea_chunk_t *chunk, *next; + for (chunk = area->first; chunk; chunk = next) { + next = chunk->next_chunk; + chunk_free_unchecked(chunk); + } + area->first = NULL; /*fail fast on */ + tor_free(area); +} + +/** Forget about having allocated anything in area, and free some of + * the backing storage associated with it, as appropriate. Invalidates all + * pointers returned from memarea_alloc() for this area. */ +void +memarea_clear(memarea_t *area) +{ + memarea_chunk_t *chunk, *next; + if (area->first->next_chunk) { + for (chunk = area->first->next_chunk; chunk; chunk = next) { + next = chunk->next_chunk; + chunk_free_unchecked(chunk); + } + area->first->next_chunk = NULL; + } + area->first->next_mem = area->first->u.mem; +} + +/** Remove all unused memarea chunks from the internal freelist. */ +void +memarea_clear_freelist(void) +{ + memarea_chunk_t *chunk, *next; + freelist_len = 0; + for (chunk = freelist; chunk; chunk = next) { + next = chunk->next_chunk; + tor_free(chunk); + } + freelist = NULL; +} + +/** Return true iff p is in a range that has been returned by an + * allocation from area. */ +int +memarea_owns_ptr(const memarea_t *area, const void *p) +{ + memarea_chunk_t *chunk; + const char *ptr = p; + for (chunk = area->first; chunk; chunk = chunk->next_chunk) { + if (ptr >= chunk->u.mem && ptr < chunk->next_mem) + return 1; + } + return 0; +} + +/** Return a pointer to a chunk of memory in area of at least sz + * bytes. sz should be significantly smaller than the area's chunk + * size, though we can deal if it isn't. */ +void * +memarea_alloc(memarea_t *area, size_t sz) +{ + memarea_chunk_t *chunk = area->first; + char *result; + tor_assert(chunk); + CHECK_SENTINEL(chunk); + if (sz == 0) + sz = 1; + if (chunk->next_mem+sz > chunk->u.mem+chunk->mem_size) { + if (sz+CHUNK_HEADER_SIZE >= CHUNK_SIZE) { + /* This allocation is too big. Stick it in a special chunk, and put + * that chunk second in the list. */ + memarea_chunk_t *new_chunk = alloc_chunk(sz+CHUNK_HEADER_SIZE, 0); + new_chunk->next_chunk = chunk->next_chunk; + chunk->next_chunk = new_chunk; + chunk = new_chunk; + } else { + memarea_chunk_t *new_chunk = alloc_chunk(CHUNK_SIZE, 1); + new_chunk->next_chunk = chunk; + area->first = chunk = new_chunk; + } + tor_assert(chunk->mem_size >= sz); + } + result = chunk->next_mem; + chunk->next_mem = chunk->next_mem + sz; + // XXXX021 remove these once bug 930 is solved. + tor_assert(chunk->next_mem >= chunk->u.mem); + tor_assert(chunk->next_mem <= chunk->u.mem+chunk->mem_size); + chunk->next_mem = realign_pointer(chunk->next_mem); + return result; +} + +/** As memarea_alloc(), but clears the memory it returns. */ +void * +memarea_alloc_zero(memarea_t *area, size_t sz) +{ + void *result = memarea_alloc(area, sz); + memset(result, 0, sz); + return result; +} + +/** As memdup, but returns the memory from area. */ +void * +memarea_memdup(memarea_t *area, const void *s, size_t n) +{ + char *result = memarea_alloc(area, n); + memcpy(result, s, n); + return result; +} + +/** As strdup, but returns the memory from area. */ +char * +memarea_strdup(memarea_t *area, const char *s) +{ + return memarea_memdup(area, s, strlen(s)+1); +} + +/** As strndup, but returns the memory from area. */ +char * +memarea_strndup(memarea_t *area, const char *s, size_t n) +{ + size_t ln; + char *result; + const char *cp, *end = s+n; + for (cp = s; cp < end && *cp; ++cp) + ; + /* cp now points to s+n, or to the 0 in the string. */ + ln = cp-s; + result = memarea_alloc(area, ln+1); + memcpy(result, s, ln); + result[ln]='\0'; + return result; +} + +/** Set allocated_out to the number of bytes allocated in area, + * and used_out to the number of bytes currently used. */ +void +memarea_get_stats(memarea_t *area, size_t *allocated_out, size_t *used_out) +{ + size_t a = 0, u = 0; + memarea_chunk_t *chunk; + for (chunk = area->first; chunk; chunk = chunk->next_chunk) { + CHECK_SENTINEL(chunk); + a += CHUNK_HEADER_SIZE + chunk->mem_size; + tor_assert(chunk->next_mem >= chunk->u.mem); + u += CHUNK_HEADER_SIZE + (chunk->next_mem - chunk->u.mem); + } + *allocated_out = a; + *used_out = u; +} + +/** Assert that area is okay. */ +void +memarea_assert_ok(memarea_t *area) +{ + memarea_chunk_t *chunk; + tor_assert(area->first); + + for (chunk = area->first; chunk; chunk = chunk->next_chunk) { + CHECK_SENTINEL(chunk); + tor_assert(chunk->next_mem >= chunk->u.mem); + tor_assert(chunk->next_mem <= + (char*) realign_pointer(chunk->u.mem+chunk->mem_size)); + } +} + diff -Nru tor-0.2.0.34/src/common/memarea.h tor-0.2.2.16-alpha/src/common/memarea.h --- tor-0.2.0.34/src/common/memarea.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/memarea.h 2010-03-07 04:03:28.000000000 +0000 @@ -0,0 +1,25 @@ +/* Copyright (c) 2008-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +/* Tor dependencies */ + +#ifndef _TOR_MEMAREA_H +#define _TOR_MEMAREA_H + +typedef struct memarea_t memarea_t; + +memarea_t *memarea_new(void); +void memarea_drop_all(memarea_t *area); +void memarea_clear(memarea_t *area); +int memarea_owns_ptr(const memarea_t *area, const void *ptr); +void *memarea_alloc(memarea_t *area, size_t sz); +void *memarea_alloc_zero(memarea_t *area, size_t sz); +void *memarea_memdup(memarea_t *area, const void *s, size_t n); +char *memarea_strdup(memarea_t *area, const char *s); +char *memarea_strndup(memarea_t *area, const char *s, size_t n); +void memarea_get_stats(memarea_t *area, + size_t *allocated_out, size_t *used_out); +void memarea_clear_freelist(void); +void memarea_assert_ok(memarea_t *area); + +#endif + diff -Nru tor-0.2.0.34/src/common/mempool.c tor-0.2.2.16-alpha/src/common/mempool.c --- tor-0.2.0.34/src/common/mempool.c 2008-08-20 05:22:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/mempool.c 2010-07-13 01:37:00.000000000 +0000 @@ -1,6 +1,5 @@ -/* Copyright (c) 2007-2008, The Tor Project, Inc. */ +/* Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: mempool.c 16449 2008-08-06 16:22:35Z nickm $ */ #if 1 /* Tor dependencies */ #include "orconfig.h" @@ -12,8 +11,6 @@ #define MEMPOOL_PRIVATE #include "mempool.h" -#define LAZY_CHUNK_SORT - /* OVERVIEW: * * This is an implementation of memory pools for Tor cells. It may be @@ -57,7 +54,7 @@ * - One pointer overhead per allocated thing. (The alternative is * something like glib's use of an RB-tree to keep track of what * chunk any given piece of memory is in.) - * - Only aligns allocated things to void* level: redefign ALIGNMENT_TYPE + * - Only aligns allocated things to void* level: redefine ALIGNMENT_TYPE * if you need doubles. * - Could probably be optimized a bit; the representation contains * a bit more info than it really needs to have. @@ -68,7 +65,7 @@ #include "orconfig.h" #include "util.h" #include "compat.h" -#include "log.h" +#include "torlog.h" #define ALLOC(x) tor_malloc(x) #define FREE(x) tor_free(x) #define ASSERT(x) tor_assert(x) @@ -407,7 +404,6 @@ return pool; } -#ifdef LAZY_CHUNK_SORT /** Helper function for qsort: used to sort pointers to mp_chunk_t into * descending order of fullness. */ static int @@ -449,17 +445,8 @@ } chunks[n-1]->next = NULL; FREE(chunks); -#if 0 - inverted = 0; - for (chunk = pool->used_chunks; chunk; chunk = chunk->next) { - if (chunk->next) { - ASSERT(chunk->next->n_allocated <= chunk->n_allocated); - } - } -#endif mp_pool_assert_ok(pool); } -#endif /** If there are more than n empty chunks in pool, free the * excess ones that have been empty for the longest. If @@ -471,9 +458,7 @@ { mp_chunk_t *chunk, **first_to_free; -#ifdef LAZY_CHUNK_SORT mp_pool_sort_used_chunks(pool); -#endif ASSERT(n_to_keep >= 0); if (keep_recently_used) { diff -Nru tor-0.2.0.34/src/common/mempool.h tor-0.2.2.16-alpha/src/common/mempool.h --- tor-0.2.0.34/src/common/mempool.h 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/mempool.h 2010-03-07 04:03:28.000000000 +0000 @@ -1,14 +1,13 @@ -/* Copyright (c) 2007-2008, The Tor Project, Inc. */ +/* Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: mempool.h 13484 2008-02-12 20:20:52Z nickm $ */ /** * \file mempool.h * \brief Headers for mempool.c **/ -#ifndef MEMPOOL_H -#define MEMPOOL_H +#ifndef _TOR_MEMPOOL_H +#define _TOR_MEMPOOL_H /** A memory pool is a context in which a large number of fixed-sized * objects can be allocated efficiently. See mempool.c for implementation diff -Nru tor-0.2.0.34/src/common/OpenBSD_malloc_Linux.c tor-0.2.2.16-alpha/src/common/OpenBSD_malloc_Linux.c --- tor-0.2.0.34/src/common/OpenBSD_malloc_Linux.c 2008-03-17 19:06:33.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/OpenBSD_malloc_Linux.c 2009-05-18 23:47:00.000000000 +0000 @@ -54,6 +54,7 @@ #include #include #include +/* For SIZE_T_MAX */ #include "torint.h" //#include "thread_private.h" @@ -122,7 +123,7 @@ }; /* How many bits per u_long in the bitmap */ -#define MALLOC_BITS (NBBY * sizeof(u_long)) +#define MALLOC_BITS (int)((NBBY * sizeof(u_long))) /* * This structure describes a number of free pages. @@ -271,7 +272,7 @@ char *malloc_options; /* Name of the current public function. */ -static char *malloc_func; +static const char *malloc_func; #define MMAP(size) \ mmap((void *)0, (size), PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, \ @@ -438,20 +439,20 @@ extern char *__progname; static void -wrterror(char *p) +wrterror(const char *p) { - char *q = " error: "; + const char *q = " error: "; struct iovec iov[5]; iov[0].iov_base = __progname; iov[0].iov_len = strlen(__progname); - iov[1].iov_base = malloc_func; + iov[1].iov_base = (char*)malloc_func; iov[1].iov_len = strlen(malloc_func); - iov[2].iov_base = q; + iov[2].iov_base = (char*)q; iov[2].iov_len = strlen(q); - iov[3].iov_base = p; + iov[3].iov_base = (char*)p; iov[3].iov_len = strlen(p); - iov[4].iov_base = "\n"; + iov[4].iov_base = (char*)"\n"; iov[4].iov_len = 1; writev(STDERR_FILENO, iov, 5); @@ -466,9 +467,9 @@ } static void -wrtwarning(char *p) +wrtwarning(const char *p) { - char *q = " warning: "; + const char *q = " warning: "; struct iovec iov[5]; if (malloc_abort) @@ -478,13 +479,13 @@ iov[0].iov_base = __progname; iov[0].iov_len = strlen(__progname); - iov[1].iov_base = malloc_func; + iov[1].iov_base = (char*)malloc_func; iov[1].iov_len = strlen(malloc_func); - iov[2].iov_base = q; + iov[2].iov_base = (char*)q; iov[2].iov_len = strlen(q); - iov[3].iov_base = p; + iov[3].iov_base = (char*)p; iov[3].iov_len = strlen(p); - iov[4].iov_base = "\n"; + iov[4].iov_base = (char*)"\n"; iov[4].iov_len = 1; writev(STDERR_FILENO, iov, 5); @@ -513,16 +514,17 @@ static void *MMAP_A(size_t pages, size_t alignment) { - void *j; - if (pages%malloc_pagesize != 0) - pages = pages - pages%malloc_pagesize + malloc_pagesize; - size_t first_size = pages + alignment - malloc_pagesize; - void *p = MMAP(first_size); - size_t rest = ((size_t)p) % alignment; + void *j, *p; + size_t first_size, rest, begin, end; + if (pages%malloc_pagesize != 0) + pages = pages - pages%malloc_pagesize + malloc_pagesize; + first_size = pages + alignment - malloc_pagesize; + p = MMAP(first_size); + rest = ((size_t)p) % alignment; j = (rest == 0) ? p : (void*) ((size_t)p + alignment - rest); - size_t begin = (size_t)j - (size_t)p; + begin = (size_t)j - (size_t)p; if (begin != 0) munmap(p, begin); - size_t end = (size_t)p + first_size - ((size_t)j + pages); + end = (size_t)p + first_size - ((size_t)j + pages); if(end != 0) munmap( (void*) ((size_t)j + pages), end); return j; @@ -829,7 +831,7 @@ malloc_pages(size_t size) { void *p, *delay_free = NULL, *tp; - int i; + size_t i; struct pginfo **pd; struct pdinfo *pi; u_long pidx, index; @@ -961,6 +963,7 @@ } pd = pi->base; pd[PI_OFF(index)] = MALLOC_FIRST; + for (i = 1; i < size; i++) { if (!PI_OFF(index + i)) { pidx++; @@ -991,6 +994,7 @@ } pd[PI_OFF(index + i)] = MALLOC_FIRST; } + malloc_used += size << malloc_pageshift; malloc_guarded += malloc_guard; @@ -1706,6 +1710,7 @@ #endif /* MALLOC_EXTRA_SANITY */ void *vp; long i; + (void) index; /* Find the chunk number on the page */ i = ((u_long) ptr & malloc_pagemask) >> info->shift; @@ -2007,3 +2012,21 @@ posix_memalign(&r, malloc_pagesize, size); return r; } + +size_t malloc_good_size(size_t size) +{ + if (size == 0) { + return 1; + } else if (size <= malloc_maxsize) { + int i, j; + /* round up to the nearest power of 2, with same approach + * as malloc_bytes() uses. */ + j = 1; + i = size - 1; + while (i >>= 1) + j++; + return ((size_t)1) << j; + } else { + return pageround(size); + } +} diff -Nru tor-0.2.0.34/src/common/sha256.c tor-0.2.2.16-alpha/src/common/sha256.c --- tor-0.2.0.34/src/common/sha256.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/sha256.c 2010-03-07 04:03:28.000000000 +0000 @@ -0,0 +1,331 @@ +/* Copyright (c) 2009-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +/* This SHA256 implementation is adapted from the public domain one in + LibTomCrypt, version 1.6. Tor uses it on platforms where OpenSSL doesn't + have a SHA256. */ + + +typedef struct sha256_state { + uint64_t length; + uint32_t state[8], curlen; + unsigned char buf[64]; +} sha256_state; + +#define CRYPT_OK 0 +#define CRYPT_NOP -1 +#define CRYPT_INVALID_ARG -2 + +#define LOAD32H(x,y) STMT_BEGIN x = ntohl(get_uint32((const char*)y)); STMT_END +#define STORE32H(x,y) STMT_BEGIN set_uint32((char*)y, htonl(x)); STMT_END +#define STORE64H(x,y) STMT_BEGIN \ + set_uint32((char*)y, htonl((uint32_t)((x)>>32))); \ + set_uint32(((char*)y)+4, htonl((uint32_t)((x)&0xffffffff))); \ + STMT_END +#define RORc(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) +#ifndef MIN + #define MIN(x, y) ( ((x)<(y))?(x):(y) ) +#endif + + +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com + */ + +/** + @file sha256.c + SHA256 by Tom St Denis +*/ + + +#ifdef LTC_SMALL_CODE +/* the K array */ +static const uint32_t K[64] = { + 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, + 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, + 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, + 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, + 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL, + 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, + 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, + 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, + 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, + 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL, + 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, + 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, + 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL +}; +#endif + +/* Various logical functions */ +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S(x, n) RORc((x),(n)) +#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) +#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) + +/* compress 512-bits */ +#ifdef LTC_CLEAN_STACK +static int _sha256_compress(sha256_state * md, unsigned char *buf) +#else +static int sha256_compress(sha256_state * md, unsigned char *buf) +#endif +{ + uint32_t S[8], W[64], t0, t1; +#ifdef LTC_SMALL_CODE + uint32_t t; +#endif + int i; + + /* copy state into S */ + for (i = 0; i < 8; i++) { + S[i] = md->state[i]; + } + + /* copy the state into 512-bits into W[0..15] */ + for (i = 0; i < 16; i++) { + LOAD32H(W[i], buf + (4*i)); + } + + /* fill W[16..63] */ + for (i = 16; i < 64; i++) { + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; + } + + /* Compress */ +#ifdef LTC_SMALL_CODE +#define RND(a,b,c,d,e,f,g,h,i) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c); \ + d += t0; \ + h = t0 + t1; + + for (i = 0; i < 64; ++i) { + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i); + t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4]; + S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t; + } +#else +#define RND(a,b,c,d,e,f,g,h,i,ki) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c); \ + d += t0; \ + h = t0 + t1; + + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba5); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25b); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b01); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a7); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c1); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc6); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dc); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c8); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf3); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x14292967); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a85); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b2138); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d13); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a7354); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c85); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a1); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664b); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a3); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd6990624); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e3585); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa070); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c08); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774c); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4a); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc70208); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506ceb); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2); + +#undef RND + +#endif + + /* feedback */ + for (i = 0; i < 8; i++) { + md->state[i] = md->state[i] + S[i]; + } + return CRYPT_OK; +} + +#ifdef LTC_CLEAN_STACK +static int sha256_compress(sha256_state * md, unsigned char *buf) +{ + int err; + err = _sha256_compress(md, buf); + burn_stack(sizeof(uint32_t) * 74); + return err; +} +#endif + +/** + Initialize the hash state + @param md The hash state you wish to initialize + @return CRYPT_OK if successful +*/ +static int sha256_init(sha256_state * md) +{ + LTC_ARGCHK(md != NULL); + + md->curlen = 0; + md->length = 0; + md->state[0] = 0x6A09E667UL; + md->state[1] = 0xBB67AE85UL; + md->state[2] = 0x3C6EF372UL; + md->state[3] = 0xA54FF53AUL; + md->state[4] = 0x510E527FUL; + md->state[5] = 0x9B05688CUL; + md->state[6] = 0x1F83D9ABUL; + md->state[7] = 0x5BE0CD19UL; + return CRYPT_OK; +} + +/** + Process a block of memory though the hash + @param md The hash state + @param in The data to hash + @param inlen The length of the data (octets) + @return CRYPT_OK if successful +*/ +static int sha256_process (sha256_state * md, const unsigned char *in, unsigned long inlen) +{ + unsigned long n; + int err; + LTC_ARGCHK(md != NULL); + LTC_ARGCHK(in != NULL); + if (md->curlen > sizeof(md->buf)) { + return CRYPT_INVALID_ARG; + } + while (inlen > 0) { + if (md->curlen == 0 && inlen >= 64) { + if ((err = sha256_compress (md, (unsigned char *)in)) != CRYPT_OK) { + return err; + } + md->length += 64 * 8; + in += 64; + inlen -= 64; + } else { + n = MIN(inlen, (64 - md->curlen)); + memcpy(md->buf + md->curlen, in, (size_t)n); + md->curlen += n; + in += n; + inlen -= n; + if (md->curlen == 64) { + if ((err = sha256_compress (md, md->buf)) != CRYPT_OK) { + return err; + } + md->length += 8*64; + md->curlen = 0; + } + } + } + return CRYPT_OK; +} + +/** + Terminate the hash to get the digest + @param md The hash state + @param out [out] The destination of the hash (32 bytes) + @return CRYPT_OK if successful +*/ +static int sha256_done(sha256_state * md, unsigned char *out) +{ + int i; + + LTC_ARGCHK(md != NULL); + LTC_ARGCHK(out != NULL); + + if (md->curlen >= sizeof(md->buf)) { + return CRYPT_INVALID_ARG; + } + + + /* increase the length of the message */ + md->length += md->curlen * 8; + + /* append the '1' bit */ + md->buf[md->curlen++] = (unsigned char)0x80; + + /* if the length is currently above 56 bytes we append zeros + * then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (md->curlen > 56) { + while (md->curlen < 64) { + md->buf[md->curlen++] = (unsigned char)0; + } + sha256_compress(md, md->buf); + md->curlen = 0; + } + + /* pad upto 56 bytes of zeroes */ + while (md->curlen < 56) { + md->buf[md->curlen++] = (unsigned char)0; + } + + /* store length */ + STORE64H(md->length, md->buf+56); + sha256_compress(md, md->buf); + + /* copy output */ + for (i = 0; i < 8; i++) { + STORE32H(md->state[i], out+(4*i)); + } +#ifdef LTC_CLEAN_STACK + zeromem(md, sizeof(sha256_state)); +#endif + return CRYPT_OK; +} + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/sha2/sha256.c,v $ */ +/* $Revision: 1.9 $ */ +/* $Date: 2006/11/01 09:28:17 $ */ diff -Nru tor-0.2.0.34/src/common/strlcpy.c tor-0.2.2.16-alpha/src/common/strlcpy.c --- tor-0.2.0.34/src/common/strlcpy.c 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/strlcpy.c 2009-05-18 23:47:00.000000000 +0000 @@ -1,4 +1,3 @@ -/* $Id: strlcpy.c 8591 2006-10-03 19:00:07Z nickm $ */ /* $OpenBSD: strlcpy.c,v 1.2 1998/11/06 04:33:16 wvdputte Exp $ */ /* diff -Nru tor-0.2.0.34/src/common/test.h tor-0.2.2.16-alpha/src/common/test.h --- tor-0.2.0.34/src/common/test.h 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/test.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,155 +0,0 @@ -/* Copyright (c) 2001-2003, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -/* $Id: test.h 13425 2008-02-08 21:09:35Z nickm $ */ - -#ifndef __TEST_H -#define __TEST_H -#define TEST_H_ID "$Id: test.h 13425 2008-02-08 21:09:35Z nickm $" - -/** - * \file test.h - * \brief Macros used by unit tests. - */ - -#include "compat.h" - -#ifdef __GNUC__ -#define PRETTY_FUNCTION __PRETTY_FUNCTION__ -#else -#define PRETTY_FUNCTION "" -#endif - -extern int have_failed; - -#define test_fail_msg(msg) \ - STMT_BEGIN \ - have_failed = 1; \ - printf("\nFile %s: line %d (%s): %s", \ - _SHORT_FILE_, \ - __LINE__, \ - PRETTY_FUNCTION, \ - msg); \ - return; \ - STMT_END - -#define test_fail() test_fail_msg("Assertion failed.") - -#define test_assert(expr) \ - STMT_BEGIN \ - if (expr) { printf("."); fflush(stdout); } else { \ - have_failed = 1; \ - printf("\nFile %s: line %d (%s): assertion failed: (%s)\n", \ - _SHORT_FILE_, \ - __LINE__, \ - PRETTY_FUNCTION, \ - #expr); \ - return; \ - } STMT_END - -#define test_eq_type(tp, fmt, expr1, expr2) \ - STMT_BEGIN \ - tp _test_v1=(tp)(expr1); \ - tp _test_v2=(tp)(expr2); \ - if (_test_v1==_test_v2) { printf("."); fflush(stdout); } else { \ - have_failed = 1; \ - printf("\nFile %s: line %d (%s): Assertion failed: (%s==%s)\n" \ - " "fmt "!="fmt"\n", \ - _SHORT_FILE_, \ - __LINE__, \ - PRETTY_FUNCTION, \ - #expr1, #expr2, \ - _test_v1, _test_v2); \ - return; \ - } STMT_END - -#define test_eq(expr1, expr2) \ - test_eq_type(long, "%ld", expr1, expr2) - -#define test_eq_ptr(expr1, expr2) \ - test_eq_type(void*, "%p", expr1, expr2) - -#define test_neq_type(tp, fmt, expr1, expr2) \ - STMT_BEGIN \ - tp _test_v1=(tp)(expr1); \ - tp _test_v2=(tp)(expr2); \ - if (_test_v1!=_test_v2) { printf("."); fflush(stdout); } else { \ - have_failed = 1; \ - printf("\nFile %s: line %d (%s): Assertion failed: (%s!=%s)\n" \ - " ("fmt" == "fmt")\n", \ - _SHORT_FILE_, \ - __LINE__, \ - PRETTY_FUNCTION, \ - #expr1, #expr2, \ - _test_v1, _test_v2); \ - return; \ - } STMT_END - -#define test_neq(expr1, expr2) \ - test_neq_type(long, "%ld", expr1, expr2) - -#define test_neq_ptr(expr1, expr2) \ - test_neq_type(void *, "%p", expr1, expr2) - -#define test_streq(expr1, expr2) \ - STMT_BEGIN \ - const char *_test_v1=(expr1), *_test_v2=(expr2); \ - if (!strcmp(_test_v1,_test_v2)) { printf("."); fflush(stdout); } else { \ - have_failed = 1; \ - printf("\nFile %s: line %d (%s): Assertion failed: (%s==%s)\n"\ - " (\"%s\" != \"%s\")\n", \ - _SHORT_FILE_, \ - __LINE__, \ - PRETTY_FUNCTION, \ - #expr1, #expr2, \ - _test_v1, _test_v2); \ - return; \ - } STMT_END - -#define test_strneq(expr1, expr2) \ - STMT_BEGIN \ - const char *_test_v1=(expr1), *_test_v2=(expr2); \ - if (strcmp(_test_v1,_test_v2)) { printf("."); fflush(stdout); } else { \ - have_failed = 1; \ - printf("\nFile %s: line %d (%s): Assertion failed: (%s!=%s)\n"\ - " (\"%s\" == \"%s\")\n", \ - _SHORT_FILE_, \ - __LINE__, \ - PRETTY_FUNCTION, \ - #expr1, #expr2, \ - _test_v1, _test_v2); \ - return; \ - } STMT_END - -#define test_memeq(expr1, expr2, len) \ - STMT_BEGIN \ - const void *_test_v1=(expr1), *_test_v2=(expr2); \ - if (!memcmp(_test_v1,_test_v2,(len))) { \ - printf("."); fflush(stdout); } else { \ - have_failed = 1; \ - printf("\nFile %s: line %d (%s): Assertion failed: (%s==%s)\n", \ - _SHORT_FILE_, \ - __LINE__, \ - PRETTY_FUNCTION, \ - #expr1, #expr2); \ - return; \ - } STMT_END - -#define test_memneq(expr1, expr2, len) \ - STMT_BEGIN \ - void *_test_v1=(expr1), *_test_v2=(expr2); \ - if (memcmp(_test_v1,_test_v2,(len))) { \ - printf("."); fflush(stdout); \ - } else { \ - have_failed = 1; \ - printf("\nFile %s: line %d (%s): Assertion failed: (%s!=%s)\n", \ - _SHORT_FILE_, \ - __LINE__, \ - PRETTY_FUNCTION, \ - #expr1, #expr2); \ - return; \ - } STMT_END - -#endif - diff -Nru tor-0.2.0.34/src/common/torgzip.c tor-0.2.2.16-alpha/src/common/torgzip.c --- tor-0.2.0.34/src/common/torgzip.c 2009-01-05 18:54:57.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/torgzip.c 2010-07-13 01:37:00.000000000 +0000 @@ -1,10 +1,7 @@ /* Copyright (c) 2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: torgzip.c 17908 2009-01-05 08:12:33Z nickm $ */ -const char torgzip_c_id[] = - "$Id: torgzip.c 17908 2009-01-05 08:12:33Z nickm $"; /** * \file torgzip.c @@ -16,20 +13,42 @@ #include #include #include -#ifdef _MSC_VER -#include "..\..\contrib\zlib\zlib.h" -#else -#include -#endif #include #ifdef HAVE_NETINET_IN_H #include #endif +#include "torint.h" #include "util.h" -#include "log.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 + +#ifdef _MSC_VER +#include "..\..\contrib\zlib\zlib.h" +#else +#include +#endif + /** Set to 1 if zlib is a version that supports gzip; set to 0 if it doesn't; * set to -1 if we haven't checked yet. */ static int gzip_is_supported = -1; @@ -79,14 +98,14 @@ tor_assert(in); tor_assert(in_len < UINT_MAX); + *out = NULL; + if (method == GZIP_METHOD && !is_gzip_supported()) { /* Old zlib version don't support gzip in deflateInit2 */ log_warn(LD_BUG, "Gzip not supported with zlib %s", ZLIB_VERSION); - return -1; + goto err; } - *out = NULL; - stream = tor_malloc_zero(sizeof(struct z_stream_s)); stream->zalloc = Z_NULL; stream->zfree = Z_NULL; @@ -168,9 +187,7 @@ deflateEnd(stream); tor_free(stream); } - if (*out) { - tor_free(*out); - } + tor_free(*out); return -1; } @@ -368,7 +385,7 @@ return NULL; } -/** Compress/decommpress some bytes using state. Read up to +/** Compress/decompress some bytes using state. Read up to * *in_len bytes from *in, and write up to *out_len bytes * to *out, adjusting the values as we go. If finish is true, * we've reached the end of the input. @@ -426,7 +443,8 @@ void tor_zlib_free(tor_zlib_state_t *state) { - tor_assert(state); + if (!state) + return; if (state->compress) deflateEnd(&state->stream); diff -Nru tor-0.2.0.34/src/common/torgzip.h tor-0.2.2.16-alpha/src/common/torgzip.h --- tor-0.2.0.34/src/common/torgzip.h 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/torgzip.h 2010-03-07 04:03:28.000000000 +0000 @@ -1,17 +1,15 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: torgzip.h 13412 2008-02-07 05:31:47Z nickm $ */ /** * \file torgzip.h * \brief Headers for torgzip.h **/ -#ifndef __TORGZIP_H -#define __TORGZIP_H -#define TORGZIP_H_ID "$Id: torgzip.h 13412 2008-02-07 05:31:47Z nickm $" +#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; @@ -41,6 +39,7 @@ 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); diff -Nru tor-0.2.0.34/src/common/torint.h tor-0.2.2.16-alpha/src/common/torint.h --- tor-0.2.0.34/src/common/torint.h 2009-01-30 19:21:27.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/torint.h 2010-03-07 04:03:28.000000000 +0000 @@ -1,17 +1,15 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: torint.h 18236 2009-01-22 16:37:09Z nickm $ */ /** * \file torint.h * \brief Header file to define uint32_t and friends **/ -#ifndef __TORINT_H -#define __TORINT_H -#define TORINT_H_ID "$Id: torint.h 18236 2009-01-22 16:37:09Z nickm $" +#ifndef _TOR_TORINT_H +#define _TOR_TORINT_H #include "orconfig.h" @@ -119,6 +117,9 @@ #ifndef INT32_MAX #define INT32_MAX 0x7fffffffu #endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif #endif #if (SIZEOF_LONG == 4) @@ -318,6 +319,16 @@ #endif #endif +#ifndef SSIZE_T_MAX +#if (SIZEOF_SIZE_T == 4) +#define SSIZE_T_MAX INT32_MAX +#elif (SIZEOF_SIZE_T == 8) +#define SSIZE_T_MAX INT64_MAX +#else +#error "Can't define SSIZE_T_MAX" +#endif +#endif + /* Any size_t larger than this amount is likely to be an underflow. */ #define SIZE_T_CEILING (sizeof(char)<<(sizeof(size_t)*8 - 1)) diff -Nru tor-0.2.0.34/src/common/torlog.h tor-0.2.2.16-alpha/src/common/torlog.h --- tor-0.2.0.34/src/common/torlog.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/torlog.h 2010-07-13 01:37:00.000000000 +0000 @@ -0,0 +1,207 @@ +/* Copyright (c) 2001, Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file log.h + * + * \brief Headers for log.c + **/ + +#ifndef _TOR_LOG_H + +#include "compat.h" + +#ifdef HAVE_SYSLOG_H +#include +#define LOG_WARN LOG_WARNING +#if LOG_DEBUG < LOG_ERR +#error "Your syslog.h thinks high numbers are more important. " \ + "We aren't prepared to deal with that." +#endif +#else +/* Note: Syslog's logging code refers to priorities, with 0 being the most + * important. Thus, all our comparisons needed to be reversed when we added + * syslog support. + * + * The upshot of this is that comments about log levels may be messed up: for + * "maximum severity" read "most severe" and "numerically *lowest* severity". + */ + +/** Debug-level severity: for hyper-verbose messages of no interest to + * anybody but developers. */ +#define LOG_DEBUG 7 +/** Info-level severity: for messages that appear frequently during normal + * operation. */ +#define LOG_INFO 6 +/** Notice-level severity: for messages that appear infrequently + * during normal operation; that the user will probably care about; + * and that are not errors. + */ +#define LOG_NOTICE 5 +/** Warn-level severity: for messages that only appear when something has gone + * wrong. */ +#define LOG_WARN 4 +/** Error-level severity: for messages that only appear when something has gone + * very wrong, and the Tor process can no longer proceed. */ +#define LOG_ERR 3 +#endif + +/* Logging domains */ + +/** Catch-all for miscellaneous events and fatal errors. */ +#define LD_GENERAL (1u<<0) +/** The cryptography subsystem. */ +#define LD_CRYPTO (1u<<1) +/** Networking. */ +#define LD_NET (1u<<2) +/** Parsing and acting on our configuration. */ +#define LD_CONFIG (1u<<3) +/** Reading and writing from the filesystem. */ +#define LD_FS (1u<<4) +/** Other servers' (non)compliance with the Tor protocol. */ +#define LD_PROTOCOL (1u<<5) +/** Memory management. */ +#define LD_MM (1u<<6) +/** HTTP implementation. */ +#define LD_HTTP (1u<<7) +/** Application (socks) requests. */ +#define LD_APP (1u<<8) +/** Communication via the controller protocol. */ +#define LD_CONTROL (1u<<9) +/** Building, using, and managing circuits. */ +#define LD_CIRC (1u<<10) +/** Hidden services. */ +#define LD_REND (1u<<11) +/** Internal errors in this Tor process. */ +#define LD_BUG (1u<<12) +/** Learning and using information about Tor servers. */ +#define LD_DIR (1u<<13) +/** Learning and using information about Tor servers. */ +#define LD_DIRSERV (1u<<14) +/** Onion routing protocol. */ +#define LD_OR (1u<<15) +/** Generic edge-connection functionality. */ +#define LD_EDGE (1u<<16) +#define LD_EXIT LD_EDGE +/** Bandwidth accounting. */ +#define LD_ACCT (1u<<17) +/** Router history */ +#define LD_HIST (1u<<18) +/** OR handshaking */ +#define LD_HANDSHAKE (1u<<19) +/** Number of logging domains in the code. */ +#define N_LOGGING_DOMAINS 20 + +typedef uint32_t log_domain_mask_t; + +/** Configures which severities are logged for each logging domain for a given + * log target. */ +typedef struct log_severity_list_t { + /** For each log severity, a bitmask of which domains a given logger is + * logging. */ + log_domain_mask_t masks[LOG_DEBUG-LOG_ERR+1]; +} log_severity_list_t; + +#ifdef LOG_PRIVATE +/** Given a severity, yields an index into log_severity_list_t.masks to use + * for that severity. */ +#define SEVERITY_MASK_IDX(sev) ((sev) - LOG_ERR) +#endif + +/** Callback type used for add_callback_log. */ +typedef void (*log_callback)(int severity, uint32_t domain, const char *msg); + +void init_logging(void); +int parse_log_level(const char *level); +const char *log_level_to_string(int level); +int parse_log_severity_config(const char **cfg, + log_severity_list_t *severity_out); +void set_log_severity_config(int minSeverity, int maxSeverity, + log_severity_list_t *severity_out); +void add_stream_log(const log_severity_list_t *severity, const char *name, + int fd); +int add_file_log(const log_severity_list_t *severity, const char *filename); +#ifdef HAVE_SYSLOG_H +int add_syslog_log(const log_severity_list_t *severity); +#endif +int add_callback_log(const log_severity_list_t *severity, log_callback cb); +int get_min_log_level(void); +void switch_logs_debug(void); +void logs_free_all(void); +void add_temp_log(int min_severity); +void close_temp_logs(void); +void rollback_log_changes(void); +void mark_logs_temp(void); +void change_callback_log_severity(int loglevelMin, int loglevelMax, + log_callback cb); +void log_set_application_name(const char *name); + +/* Outputs a message to stdout */ +void tor_log(int severity, log_domain_mask_t domain, const char *format, ...) + CHECK_PRINTF(3,4); +#define log tor_log /* hack it so we don't conflict with log() as much */ + +#ifdef __GNUC__ +extern int _log_global_min_severity; + +void _log_fn(int severity, log_domain_mask_t domain, + const char *funcname, const char *format, ...) + CHECK_PRINTF(4,5); +/** Log a message at level severity, using a pretty-printed version + * of the current function name. */ +#define log_fn(severity, domain, args...) \ + _log_fn(severity, domain, __PRETTY_FUNCTION__, args) +#define log_debug(domain, args...) \ + STMT_BEGIN \ + if (PREDICT_UNLIKELY(_log_global_min_severity == LOG_DEBUG)) \ + _log_fn(LOG_DEBUG, domain, __PRETTY_FUNCTION__, args); \ + STMT_END +#define log_info(domain, args...) \ + _log_fn(LOG_INFO, domain, __PRETTY_FUNCTION__, args) +#define log_notice(domain, args...) \ + _log_fn(LOG_NOTICE, domain, __PRETTY_FUNCTION__, args) +#define log_warn(domain, args...) \ + _log_fn(LOG_WARN, domain, __PRETTY_FUNCTION__, args) +#define log_err(domain, args...) \ + _log_fn(LOG_ERR, domain, __PRETTY_FUNCTION__, args) + +#else /* ! defined(__GNUC__) */ + +void _log_fn(int severity, log_domain_mask_t domain, const char *format, ...); +void _log_debug(log_domain_mask_t domain, const char *format, ...); +void _log_info(log_domain_mask_t domain, const char *format, ...); +void _log_notice(log_domain_mask_t domain, const char *format, ...); +void _log_warn(log_domain_mask_t domain, const char *format, ...); +void _log_err(log_domain_mask_t domain, const char *format, ...); + +#if defined(_MSC_VER) && _MSC_VER < 1300 +/* MSVC 6 and earlier don't have __func__, or even __LINE__. */ +#define log_fn _log_fn +#define log_debug _log_debug +#define log_info _log_info +#define log_notice _log_notice +#define log_warn _log_warn +#define log_err _log_err +#else +/* We don't have GCC's varargs macros, so use a global variable to pass the + * function name to log_fn */ +extern const char *_log_fn_function_name; +/* We abuse the comma operator here, since we can't use the standard + * do {...} while (0) trick to wrap this macro, since the macro can't take + * arguments. */ +#define log_fn (_log_fn_function_name=__func__),_log_fn +#define log_debug (_log_fn_function_name=__func__),_log_debug +#define log_info (_log_fn_function_name=__func__),_log_info +#define log_notice (_log_fn_function_name=__func__),_log_notice +#define log_warn (_log_fn_function_name=__func__),_log_warn +#define log_err (_log_fn_function_name=__func__),_log_err +#endif + +#endif /* !GNUC */ + +# define _TOR_LOG_H +#endif + diff -Nru tor-0.2.0.34/src/common/tortls.c tor-0.2.2.16-alpha/src/common/tortls.c --- tor-0.2.0.34/src/common/tortls.c 2009-01-05 02:06:16.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/tortls.c 2010-08-11 03:14:15.000000000 +0000 @@ -1,10 +1,7 @@ /* Copyright (c) 2003, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: tortls.c 17882 2009-01-04 18:52:32Z nickm $ */ -const char tortls_c_id[] = - "$Id: tortls.c 17882 2009-01-04 18:52:32Z nickm $"; /** * \file tortls.c @@ -19,7 +16,22 @@ #include "orconfig.h" +#if defined (WINCE) +#include +#endif + #include +#ifdef MS_WINDOWS /*wrkard for dtls1.h >= 0.9.8m of "#include "*/ + #define WIN32_WINNT 0x400 + #define _WIN32_WINNT 0x400 + #define WIN32_LEAN_AND_MEAN + #if defined(_MSC_VER) && (_MSC_VER < 1300) + #include + #else + #include + #include + #endif +#endif #include #include #include @@ -29,7 +41,7 @@ #include #if OPENSSL_VERSION_NUMBER < 0x00907000l -#error "We require openssl >= 0.9.7" +#error "We require OpenSSL >= 0.9.7" #endif #define CRYPTO_PRIVATE /* to import prototypes from crypto.h */ @@ -37,7 +49,7 @@ #include "crypto.h" #include "tortls.h" #include "util.h" -#include "log.h" +#include "torlog.h" #include "container.h" #include "ht.h" #include @@ -56,6 +68,24 @@ #define ADDR(tls) (((tls) && (tls)->address) ? tls->address : "peer") +/* We redefine these so that we can run correctly even if the vendor gives us + * a version of OpenSSL that does not match its header files. (Apple: I am + * looking at you.) + */ +#ifndef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION +#define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x00040000L +#endif +#ifndef SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION +#define SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x0010 +#endif + +/** Does the run-time openssl version look like we need + * SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION? */ +static int use_unsafe_renegotiation_op = 0; +/** Does the run-time openssl version look like we need + * SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION? */ +static int use_unsafe_renegotiation_flag = 0; + /** Structure holding the TLS state for a single connection. */ typedef struct tor_tls_context_t { int refcnt; @@ -70,10 +100,10 @@ */ struct tor_tls_t { HT_ENTRY(tor_tls_t) node; - tor_tls_context_t *context; /** A link to the context object for this tls */ + tor_tls_context_t *context; /** A link to the context object for this tls. */ SSL *ssl; /**< An OpenSSL SSL object. */ int socket; /**< The underlying file descriptor for this TLS connection. */ - char *address; /**< An address to log when describing this connectinon. */ + char *address; /**< An address to log when describing this connection. */ enum { TOR_TLS_ST_HANDSHAKE, TOR_TLS_ST_OPEN, TOR_TLS_ST_GOTCLOSE, TOR_TLS_ST_SENTCLOSE, TOR_TLS_ST_CLOSED, TOR_TLS_ST_RENEGOTIATE, @@ -101,6 +131,16 @@ void *callback_arg; }; +#ifdef V2_HANDSHAKE_CLIENT +/** An array of fake SSL_CIPHER objects that we use in order to trick OpenSSL + * in client mode into advertising the ciphers we want. See + * rectify_client_ciphers() for details. */ +static SSL_CIPHER *CLIENT_CIPHER_DUMMIES = NULL; +/** A stack of SSL_CIPHER objects, some real, some fake. + * See rectify_client_ciphers() for details. */ +static STACK_OF(SSL_CIPHER) *CLIENT_CIPHER_STACK = NULL; +#endif + /** Helper: compare tor_tls_t objects by its SSL. */ static INLINE int tor_tls_entries_eq(const tor_tls_t *a, const tor_tls_t *b) @@ -147,6 +187,7 @@ const char *cname, const char *cname_sign, unsigned int lifetime); +static void tor_tls_unblock_renegotiation(tor_tls_t *tls); /** Global tls context. We keep it here because nobody else needs to * touch it. */ @@ -158,28 +199,51 @@ #define _TOR_TLS_SYSCALL (_MIN_TOR_TLS_ERROR_VAL - 2) #define _TOR_TLS_ZERORETURN (_MIN_TOR_TLS_ERROR_VAL - 1) +#include "tortls_states.h" + +/** Return the symbolic name of an OpenSSL state. */ +static const char * +ssl_state_to_string(int ssl_state) +{ + static char buf[40]; + int i; + for (i = 0; state_map[i].name; ++i) { + if (state_map[i].state == ssl_state) + return state_map[i].name; + } + tor_snprintf(buf, sizeof(buf), "Unknown state %d", ssl_state); + return buf; +} + /** Log all pending tls errors at level severity. Use * doing to describe our current activities. */ static void -tls_log_errors(tor_tls_t *tls, int severity, const char *doing) +tls_log_errors(tor_tls_t *tls, int severity, int domain, const char *doing) { + const char *state = NULL; + int st; unsigned long err; const char *msg, *lib, *func, *addr; addr = tls ? tls->address : NULL; + st = (tls && tls->ssl) ? tls->ssl->state : -1; while ((err = ERR_get_error()) != 0) { msg = (const char*)ERR_reason_error_string(err); lib = (const char*)ERR_lib_error_string(err); func = (const char*)ERR_func_error_string(err); + if (!state) + state = (st>=0)?ssl_state_to_string(st):"---"; if (!msg) msg = "(null)"; + if (!lib) lib = "(null)"; + if (!func) func = "(null)"; if (doing) { - log(severity, LD_NET, "TLS error while %s%s%s: %s (in %s:%s)", + log(severity, domain, "TLS error while %s%s%s: %s (in %s:%s:%s)", doing, addr?" with ":"", addr?addr:"", - msg, lib, func); + msg, lib, func, state); } else { - log(severity, LD_NET, "TLS error%s%s: %s (in %s:%s)", + log(severity, domain, "TLS error%s%s: %s (in %s:%s:%s)", addr?" with ":"", addr?addr:"", - msg, lib, func); + msg, lib, func, state); } } } @@ -189,7 +253,7 @@ static int tor_errno_to_tls_error(int e) { -#if defined(MS_WINDOWS) && !defined(USE_BSOCKETS) +#if defined(MS_WINDOWS) switch (e) { case WSAECONNRESET: // most common return TOR_TLS_ERROR_CONNRESET; @@ -255,7 +319,7 @@ */ static int tor_tls_get_error(tor_tls_t *tls, int r, int extra, - const char *doing, int severity) + const char *doing, int severity, int domain) { int err = SSL_get_error(tls->ssl, r); int tor_error = TOR_TLS_ERROR_MISC; @@ -270,25 +334,28 @@ if (extra&CATCH_SYSCALL) return _TOR_TLS_SYSCALL; if (r == 0) { - log(severity, LD_NET, "TLS error: unexpected close while %s", doing); + log(severity, LD_NET, "TLS error: unexpected close while %s (%s)", + doing, ssl_state_to_string(tls->ssl->state)); tor_error = TOR_TLS_ERROR_IO; } else { int e = tor_socket_errno(tls->socket); log(severity, LD_NET, - "TLS error: (errno=%d: %s)", - doing, e, tor_socket_strerror(e)); + "TLS error: (errno=%d: %s; state=%s)", + doing, e, tor_socket_strerror(e), + ssl_state_to_string(tls->ssl->state)); tor_error = tor_errno_to_tls_error(e); } - tls_log_errors(tls, severity, doing); + tls_log_errors(tls, severity, domain, doing); return tor_error; case SSL_ERROR_ZERO_RETURN: if (extra&CATCH_ZERO) return _TOR_TLS_ZERORETURN; - log(severity, LD_NET, "TLS connection closed while %s", doing); - tls_log_errors(tls, severity, doing); + log(severity, LD_NET, "TLS connection closed while %s in state %s", + doing, ssl_state_to_string(tls->ssl->state)); + tls_log_errors(tls, severity, domain, doing); return TOR_TLS_CLOSE; default: - tls_log_errors(tls, severity, doing); + tls_log_errors(tls, severity, domain, doing); return TOR_TLS_ERROR_MISC; } } @@ -299,9 +366,59 @@ tor_tls_init(void) { if (!tls_library_is_initialized) { + long version; SSL_library_init(); SSL_load_error_strings(); - crypto_global_init(-1); + + version = SSLeay(); + + /* OpenSSL 0.9.8l introduced SSL3_FLAGS_ALLOW_UNSAGE_LEGACY_RENEGOTIATION + * here, but without thinking too hard about it: it turns out that the + * flag in question needed to be set at the last minute, and that it + * conflicted with an existing flag number that had already been added + * in the OpenSSL 1.0.0 betas. OpenSSL 0.9.8m thoughtfully replaced + * the flag with an option and (it seems) broke anything that used + * SSL3_FLAGS_* for the purpose. So we need to know how to do both, + * and we mustn't use the SSL3_FLAGS option with anything besides + * OpenSSL 0.9.8l. + * + * No, we can't just set flag 0x0010 everywhere. It breaks Tor with + * OpenSSL 1.0.0beta3 and later. On the other hand, we might be able to + * set option 0x00040000L everywhere. + * + * No, we can't simply detect whether the flag or the option is present + * in the headers at build-time: some vendors (notably Apple) like to + * leave their headers out of sync with their libraries. + * + * Yes, it _is_ almost as if the OpenSSL developers decided that no + * program should be allowed to use renegotiation unless it first passed + * a test of intelligence and determination. + */ + if (version >= 0x009080c0L && version < 0x009080d0L) { + log_notice(LD_GENERAL, "OpenSSL %s looks like version 0.9.8l; " + "I will try SSL3_FLAGS to enable renegotation.", + SSLeay_version(SSLEAY_VERSION)); + use_unsafe_renegotiation_flag = 1; + use_unsafe_renegotiation_op = 1; + } else if (version >= 0x009080d0L) { + log_notice(LD_GENERAL, "OpenSSL %s looks like version 0.9.8m or later; " + "I will try SSL_OP to enable renegotiation", + SSLeay_version(SSLEAY_VERSION)); + use_unsafe_renegotiation_op = 1; + } else if (version < 0x009080c0L) { + log_notice(LD_GENERAL, "OpenSSL %s [%lx] looks like it's older than " + "0.9.8l, but some vendors have backported 0.9.8l's " + "renegotiation code to earlier versions, and some have " + "backported the code from 0.9.8m or 0.9.8n. I'll set both " + "SSL3_FLAGS and SSL_OP just to be safe.", + SSLeay_version(SSLEAY_VERSION), version); + use_unsafe_renegotiation_flag = 1; + use_unsafe_renegotiation_op = 1; + } else { + log_info(LD_GENERAL, "OpenSSL %s has version %lx", + SSLeay_version(SSLEAY_VERSION), version); + } + tls_library_is_initialized = 1; } } @@ -318,6 +435,12 @@ log_warn(LD_MM, "Still have entries in the tlsmap at shutdown."); } HT_CLEAR(tlsmap, &tlsmap_root); +#ifdef V2_HANDSHAKE_CLIENT + if (CLIENT_CIPHER_DUMMIES) + tor_free(CLIENT_CIPHER_DUMMIES); + if (CLIENT_CIPHER_STACK) + sk_SSL_CIPHER_free(CLIENT_CIPHER_STACK); +#endif } /** We need to give OpenSSL a callback to verify certificates. This is @@ -415,7 +538,7 @@ x509 = NULL; } done: - tls_log_errors(NULL, LOG_WARN, "generating certificate"); + tls_log_errors(NULL, LOG_WARN, LD_NET, "generating certificate"); if (sign_pkey) EVP_PKEY_free(sign_pkey); if (pkey) @@ -427,58 +550,42 @@ return x509; } -#define SERVER_CIPHER_LIST \ - (TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":" \ - TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":" \ +/** List of ciphers that servers should select from.*/ +#define SERVER_CIPHER_LIST \ + (TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":" \ + TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":" \ SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) /* Note: for setting up your own private testing network with link crypto * disabled, set the cipher lists to your cipher list to * SSL3_TXT_RSA_NULL_SHA. If you do this, you won't be able to communicate * with any of the "real" Tors, though. */ -#if OPENSSL_VERSION_NUMBER >= 0x00908020l -#define CLIENT_CIPHER_LIST \ - (TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA ":" \ - TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA ":" \ - TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":" \ - TLS1_TXT_DHE_DSS_WITH_AES_256_SHA ":" \ - TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA ":" \ - TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA ":" \ - TLS1_TXT_RSA_WITH_AES_256_SHA ":" \ - TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA ":" \ - TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA ":" \ - TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA ":" \ - TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA ":" \ - TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":" \ - TLS1_TXT_DHE_DSS_WITH_AES_128_SHA ":" \ - TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA":" \ - TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA":" \ - TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA ":" \ - TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA ":" \ - SSL3_TXT_RSA_RC4_128_MD5 ":" \ - SSL3_TXT_RSA_RC4_128_SHA ":" \ - TLS1_TXT_RSA_WITH_AES_128_SHA ":" \ - TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA ":" \ - TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA ":" \ - SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA ":" \ - SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA ":" \ - TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA ":" \ - TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA ":" \ - /*SSL3_TXT_RSA_FIPS_WITH_3DES_EDE_CBC_SHA ":"*/ \ - SSL3_TXT_RSA_DES_192_CBC3_SHA) -/* SSL3_TXT_RSA_FIPS_WITH_3DES_EDE_CBC_SHA is commented out because it doesn't - * really exist; if I understand correctly, it's a bit of silliness that - * netscape did on its own before any standard for what they wanted was - * formally approved. Nonetheless, Firefox still uses it, so we need to - * fake it at some point soon. XXXX021 -NM */ -#else -/* Ug. We don't have as many ciphers with openssl 0.9.7 as we'd like. Fix - * this list into something that sucks less. */ -#define CLIENT_CIPHER_LIST \ - (TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":" \ - TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":" \ - SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA ":" \ - SSL3_TXT_RSA_RC4_128_SHA) +#ifdef V2_HANDSHAKE_CLIENT +#define CIPHER(id, name) name ":" +#define XCIPHER(id, name) +/** List of ciphers that clients should advertise, omitting items that + * our OpenSSL doesn't know about. */ +static const char CLIENT_CIPHER_LIST[] = +#include "./ciphers.inc" + ; +#undef CIPHER +#undef XCIPHER + +/** Holds a cipher that we want to advertise, and its 2-byte ID. */ +typedef struct cipher_info_t { unsigned id; const char *name; } cipher_info_t; +/** A list of all the ciphers that clients should advertise, including items + * that OpenSSL might not know about. */ +static const cipher_info_t CLIENT_CIPHER_INFO_LIST[] = { +#define CIPHER(id, name) { id, name }, +#define XCIPHER(id, name) { id, #name }, +#include "./ciphers.inc" +#undef CIPHER +#undef XCIPHER +}; + +/** The length of CLIENT_CIPHER_INFO_LIST and CLIENT_CIPHER_DUMMIES. */ +static const int N_CLIENT_CIPHERS = + sizeof(CLIENT_CIPHER_INFO_LIST)/sizeof(CLIENT_CIPHER_INFO_LIST[0]); #endif #ifndef V2_HANDSHAKE_CLIENT @@ -521,7 +628,6 @@ tor_tls_context_new(crypto_pk_env_t *identity, unsigned int key_lifetime) { crypto_pk_env_t *rsa = NULL; - crypto_dh_env_t *dh = NULL; EVP_PKEY *pkey = NULL; tor_tls_context_t *result = NULL; X509 *cert = NULL, *idcert = NULL; @@ -564,14 +670,25 @@ SSL_CTX_set_options(result->ctx, SSL_OP_NO_SSLv2); #endif SSL_CTX_set_options(result->ctx, SSL_OP_SINGLE_DH_USE); - /* Don't actually allow compression; it uses RAM and time, but the data - * we transmit is all encrypted anyway. */ - result->ctx->comp_methods = NULL; #ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION SSL_CTX_set_options(result->ctx, SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); #endif + /* Yes, we know what we are doing here. No, we do not treat a renegotiation + * as authenticating any earlier-received data. + */ + if (use_unsafe_renegotiation_op) { + SSL_CTX_set_options(result->ctx, + SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION); + } + /* Don't actually allow compression; it uses ram and time, but the data + * we transmit is all encrypted anyway. */ + if (result->ctx->comp_methods) + result->ctx->comp_methods = NULL; +#ifdef SSL_MODE_RELEASE_BUFFERS + SSL_CTX_set_mode(result->ctx, SSL_MODE_RELEASE_BUFFERS); +#endif if (cert && !SSL_CTX_use_certificate(result->ctx,cert)) goto error; X509_free(cert); /* We just added a reference to cert. */ @@ -593,9 +710,11 @@ pkey = NULL; if (!SSL_CTX_check_private_key(result->ctx)) goto error; - dh = crypto_dh_new(); - SSL_CTX_set_tmp_dh(result->ctx, _crypto_dh_env_get_dh(dh)); - crypto_dh_free(dh); + { + crypto_dh_env_t *dh = crypto_dh_new(); + SSL_CTX_set_tmp_dh(result->ctx, _crypto_dh_env_get_dh(dh)); + crypto_dh_free(dh); + } SSL_CTX_set_verify(result->ctx, SSL_VERIFY_PEER, always_accept_verify_cb); /* let us realloc bufs that we're writing from */ @@ -614,15 +733,13 @@ return 0; error: - tls_log_errors(NULL, LOG_WARN, "creating TLS context"); + tls_log_errors(NULL, LOG_WARN, LD_NET, "creating TLS context"); tor_free(nickname); tor_free(nn2); if (pkey) EVP_PKEY_free(pkey); if (rsa) crypto_free_pk_env(rsa); - if (dh) - crypto_dh_free(dh); if (result) tor_tls_context_decref(result); if (cert) @@ -644,11 +761,11 @@ /* If we reached this point, we just got a client hello. See if there is * a cipher list. */ if (!(session = SSL_get_session((SSL *)ssl))) { - log_warn(LD_NET, "No session on TLS?"); + log_info(LD_NET, "No session on TLS?"); return 0; } if (!session->ciphers) { - log_warn(LD_NET, "No ciphers on session"); + log_info(LD_NET, "No ciphers on session"); return 0; } /* Now we need to see if there are any ciphers whose presence means we're @@ -660,8 +777,7 @@ strcmp(ciphername, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) && strcmp(ciphername, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) && strcmp(ciphername, "(NONE)")) { - /* XXXX should be ld_debug */ - log_info(LD_NET, "Got a non-version-1 cipher called '%s'", ciphername); + log_debug(LD_NET, "Got a non-version-1 cipher called '%s'", ciphername); // return 1; goto dump_list; } @@ -677,8 +793,8 @@ smartlist_add(elts, (char*)ciphername); } s = smartlist_join_strings(elts, ":", 0, NULL); - log_info(LD_NET, "Got a non-version-1 cipher list from %s. It is: '%s'", - address, s); + log_debug(LD_NET, "Got a non-version-1 cipher list from %s. It is: '%s'", + address, s); tor_free(s); smartlist_free(elts); } @@ -731,6 +847,76 @@ } #endif +/** Replace *ciphers with a new list of SSL ciphersuites: specifically, + * a list designed to mimic a common web browser. Some of the ciphers in the + * list won't actually be implemented by OpenSSL: that's okay so long as the + * server doesn't select them, and the server won't select anything besides + * what's in SERVER_CIPHER_LIST. + * + * [If the server does select a bogus cipher, we won't crash or + * anything; we'll just fail later when we try to look up the cipher in + * ssl->cipher_list_by_id.] + */ +static void +rectify_client_ciphers(STACK_OF(SSL_CIPHER) **ciphers) +{ +#ifdef V2_HANDSHAKE_CLIENT + if (PREDICT_UNLIKELY(!CLIENT_CIPHER_STACK)) { + /* We need to set CLIENT_CIPHER_STACK to an array of the ciphers + * we want.*/ + int i = 0, j = 0; + + /* First, create a dummy SSL_CIPHER for every cipher. */ + CLIENT_CIPHER_DUMMIES = + tor_malloc_zero(sizeof(SSL_CIPHER)*N_CLIENT_CIPHERS); + for (i=0; i < N_CLIENT_CIPHERS; ++i) { + CLIENT_CIPHER_DUMMIES[i].valid = 1; + CLIENT_CIPHER_DUMMIES[i].id = CLIENT_CIPHER_INFO_LIST[i].id | (3<<24); + CLIENT_CIPHER_DUMMIES[i].name = CLIENT_CIPHER_INFO_LIST[i].name; + } + + CLIENT_CIPHER_STACK = sk_SSL_CIPHER_new_null(); + tor_assert(CLIENT_CIPHER_STACK); + + log_debug(LD_NET, "List was: %s", CLIENT_CIPHER_LIST); + for (j = 0; j < sk_SSL_CIPHER_num(*ciphers); ++j) { + SSL_CIPHER *cipher = sk_SSL_CIPHER_value(*ciphers, j); + log_debug(LD_NET, "Cipher %d: %lx %s", j, cipher->id, cipher->name); + } + + /* Then copy as many ciphers as we can from the good list, inserting + * dummies as needed. */ + j=0; + for (i = 0; i < N_CLIENT_CIPHERS; ) { + SSL_CIPHER *cipher = NULL; + if (j < sk_SSL_CIPHER_num(*ciphers)) + cipher = sk_SSL_CIPHER_value(*ciphers, j); + if (cipher && ((cipher->id >> 24) & 0xff) != 3) { + log_debug(LD_NET, "Skipping v2 cipher %s", cipher->name); + ++j; + } else if (cipher && + (cipher->id & 0xffff) == CLIENT_CIPHER_INFO_LIST[i].id) { + log_debug(LD_NET, "Found cipher %s", cipher->name); + sk_SSL_CIPHER_push(CLIENT_CIPHER_STACK, cipher); + ++j; + ++i; + } else { + log_debug(LD_NET, "Inserting fake %s", CLIENT_CIPHER_DUMMIES[i].name); + sk_SSL_CIPHER_push(CLIENT_CIPHER_STACK, &CLIENT_CIPHER_DUMMIES[i]); + ++i; + } + } + } + + sk_SSL_CIPHER_free(*ciphers); + *ciphers = sk_SSL_CIPHER_dup(CLIENT_CIPHER_STACK); + tor_assert(*ciphers); + +#else + (void)ciphers; +#endif +} + /** Create a new TLS object from a file descriptor, and a flag to * determine whether it is functioning as a server. */ @@ -742,24 +928,39 @@ tor_assert(global_tls_context); /* make sure somebody made it first */ if (!(result->ssl = SSL_new(global_tls_context->ctx))) { - tls_log_errors(NULL, LOG_WARN, "generating TLS context"); + tls_log_errors(NULL, LOG_WARN, LD_NET, "generating TLS context"); tor_free(result); return NULL; } + +#ifdef SSL_set_tlsext_host_name + /* Browsers use the TLS hostname extension, so we should too. */ + { + char *fake_hostname = crypto_random_hostname(4,25, "www.",".com"); + SSL_set_tlsext_host_name(result->ssl, fake_hostname); + tor_free(fake_hostname); + } +#endif + if (!SSL_set_cipher_list(result->ssl, isServer ? SERVER_CIPHER_LIST : CLIENT_CIPHER_LIST)) { + tls_log_errors(NULL, LOG_WARN, LD_NET, "setting ciphers"); +#ifdef SSL_set_tlsext_host_name + SSL_set_tlsext_host_name(result->ssl, NULL); +#endif SSL_free(result->ssl); tor_free(result); return NULL; } + if (!isServer) + rectify_client_ciphers(&result->ssl->cipher_list); result->socket = sock; -#ifdef USE_BSOCKETS - bio = BIO_new_bsocket(sock, BIO_NOCLOSE); -#else bio = BIO_new_socket(sock, BIO_NOCLOSE); -#endif if (! bio) { - tls_log_errors(NULL, LOG_WARN, "opening BIO"); + tls_log_errors(NULL, LOG_WARN, LD_NET, "opening BIO"); +#ifdef SSL_set_tlsext_host_name + SSL_set_tlsext_host_name(result->ssl, NULL); +#endif SSL_free(result->ssl); tor_free(result); return NULL; @@ -782,8 +983,9 @@ SSL_set_info_callback(result->ssl, tor_tls_server_info_callback); } #endif + /* Not expected to get called. */ - tls_log_errors(NULL, LOG_WARN, "generating TLS context"); + tls_log_errors(NULL, LOG_WARN, LD_NET, "generating TLS context"); return result; } @@ -800,7 +1002,7 @@ /** Set cb to be called with argument arg whenever tls * next gets a client-side renegotiate in the middle of a read. Do not - * invoke this function untile after initial handshaking is done! + * invoke this function until after initial handshaking is done! */ void tor_tls_set_renegotiate_callback(tor_tls_t *tls, @@ -819,6 +1021,33 @@ #endif } +/** If this version of openssl requires it, turn on renegotiation on + * tls. + */ +static void +tor_tls_unblock_renegotiation(tor_tls_t *tls) +{ + /* Yes, we know what we are doing here. No, we do not treat a renegotiation + * as authenticating any earlier-received data. */ + if (use_unsafe_renegotiation_flag) { + tls->ssl->s3->flags |= SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; + } + if (use_unsafe_renegotiation_op) { + SSL_set_options(tls->ssl, + SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION); + } +} + +/** If this version of openssl supports it, turn off renegotiation on + * tls. (Our protocol never requires this for security, but it's nice + * to use belt-and-suspenders here.) + */ +void +tor_tls_block_renegotiation(tor_tls_t *tls) +{ + tls->ssl->s3->flags &= ~SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; +} + /** Return whether this tls initiated the connect (client) or * received it (server). */ int @@ -835,11 +1064,16 @@ tor_tls_free(tor_tls_t *tls) { tor_tls_t *removed; - tor_assert(tls && tls->ssl); + if (!tls) + return; + tor_assert(tls->ssl); removed = HT_REMOVE(tlsmap, &tlsmap_root, tls); if (!removed) { log_warn(LD_BUG, "Freeing a TLS that was not in the ssl->tls map."); } +#ifdef SSL_set_tlsext_host_name + SSL_set_tlsext_host_name(tls->ssl, NULL); +#endif SSL_free(tls->ssl); tls->ssl = NULL; tls->negotiated_callback = NULL; @@ -875,7 +1109,7 @@ #endif return r; } - err = tor_tls_get_error(tls, r, CATCH_ZERO, "reading", LOG_DEBUG); + err = tor_tls_get_error(tls, r, CATCH_ZERO, "reading", LOG_DEBUG, LD_NET); if (err == _TOR_TLS_ZERORETURN || err == TOR_TLS_CLOSE) { log_debug(LD_NET,"read returned r=%d; TLS is closed",r); tls->state = TOR_TLS_ST_CLOSED; @@ -911,7 +1145,7 @@ tls->wantwrite_n = 0; } r = SSL_write(tls->ssl, cp, (int)n); - err = tor_tls_get_error(tls, r, 0, "writing", LOG_INFO); + err = tor_tls_get_error(tls, r, 0, "writing", LOG_INFO, LD_NET); if (err == TOR_TLS_DONE) { return r; } @@ -929,18 +1163,30 @@ tor_tls_handshake(tor_tls_t *tls) { int r; + int oldstate; tor_assert(tls); tor_assert(tls->ssl); tor_assert(tls->state == TOR_TLS_ST_HANDSHAKE); check_no_tls_errors(); + oldstate = tls->ssl->state; if (tls->isServer) { + log_debug(LD_HANDSHAKE, "About to call SSL_accept on %p (%s)", tls, + ssl_state_to_string(tls->ssl->state)); r = SSL_accept(tls->ssl); } else { + log_debug(LD_HANDSHAKE, "About to call SSL_connect on %p (%s)", tls, + ssl_state_to_string(tls->ssl->state)); r = SSL_connect(tls->ssl); } - r = tor_tls_get_error(tls,r,0, "handshaking", LOG_INFO); + if (oldstate != tls->ssl->state) + log_debug(LD_HANDSHAKE, "After call, %p was in state %s", + tls, ssl_state_to_string(tls->ssl->state)); + /* We need to call this here and not earlier, since OpenSSL has a penchant + * for clearing its flags when you say accept or connect. */ + tor_tls_unblock_renegotiation(tls); + r = tor_tls_get_error(tls,r,0, "handshaking", LOG_INFO, LD_HANDSHAKE); if (ERR_peek_error() != 0) { - tls_log_errors(tls, tls->isServer ? LOG_INFO : LOG_WARN, + tls_log_errors(tls, tls->isServer ? LOG_INFO : LOG_WARN, LD_HANDSHAKE, "handshaking"); return TOR_TLS_ERROR_MISC; } @@ -961,7 +1207,8 @@ " get set. Fixing that."); } tls->wasV2Handshake = 1; - log_debug(LD_NET, "Completed V2 TLS handshake with client; waiting " + log_debug(LD_HANDSHAKE, + "Completed V2 TLS handshake with client; waiting " "for renegotiation."); } else { tls->wasV2Handshake = 0; @@ -973,17 +1220,23 @@ X509 *cert = SSL_get_peer_certificate(tls->ssl); STACK_OF(X509) *chain = SSL_get_peer_cert_chain(tls->ssl); int n_certs = sk_X509_num(chain); - if (n_certs > 1 || (n_certs == 1 && cert != sk_X509_value(chain, 0))) + if (n_certs > 1 || (n_certs == 1 && cert != sk_X509_value(chain, 0))) { + log_debug(LD_HANDSHAKE, "Server sent back multiple certificates; it " + "looks like a v1 handshake on %p", tls); tls->wasV2Handshake = 0; - else { - log_debug(LD_NET, "Server sent back a single certificate; looks like " + } else { + log_debug(LD_HANDSHAKE, + "Server sent back a single certificate; looks like " "a v2 handshake on %p.", tls); tls->wasV2Handshake = 1; } if (cert) X509_free(cert); #endif - SSL_set_cipher_list(tls->ssl, SERVER_CIPHER_LIST); + if (SSL_set_cipher_list(tls->ssl, SERVER_CIPHER_LIST) == 0) { + tls_log_errors(NULL, LOG_WARN, LD_HANDSHAKE, "re-setting ciphers"); + r = TOR_TLS_ERROR_MISC; + } } } return r; @@ -1004,7 +1257,8 @@ if (tls->state != TOR_TLS_ST_RENEGOTIATE) { int r = SSL_renegotiate(tls->ssl); if (r <= 0) { - return tor_tls_get_error(tls, r, 0, "renegotiating", LOG_WARN); + return tor_tls_get_error(tls, r, 0, "renegotiating", LOG_WARN, + LD_HANDSHAKE); } tls->state = TOR_TLS_ST_RENEGOTIATE; } @@ -1013,7 +1267,8 @@ tls->state = TOR_TLS_ST_OPEN; return TOR_TLS_DONE; } else - return tor_tls_get_error(tls, r, 0, "renegotiating handshake", LOG_INFO); + return tor_tls_get_error(tls, r, 0, "renegotiating handshake", LOG_INFO, + LD_HANDSHAKE); } /** Shut down an open tls connection tls. When finished, returns @@ -1037,7 +1292,7 @@ r = SSL_read(tls->ssl, buf, 128); } while (r>0); err = tor_tls_get_error(tls, r, CATCH_ZERO, "reading to shut down", - LOG_INFO); + LOG_INFO, LD_NET); if (err == _TOR_TLS_ZERORETURN) { tls->state = TOR_TLS_ST_GOTCLOSE; /* fall through... */ @@ -1053,7 +1308,7 @@ return TOR_TLS_DONE; } err = tor_tls_get_error(tls, r, CATCH_SYSCALL|CATCH_ZERO, "shutting down", - LOG_INFO); + LOG_INFO, LD_NET); if (err == _TOR_TLS_SYSCALL) { /* The underlying TCP connection closed while we were shutting down. */ tls->state = TOR_TLS_ST_CLOSED; @@ -1085,7 +1340,7 @@ { X509 *cert; cert = SSL_get_peer_certificate(tls->ssl); - tls_log_errors(tls, LOG_WARN, "getting peer certificate"); + tls_log_errors(tls, LOG_WARN, LD_HANDSHAKE, "getting peer certificate"); if (!cert) return 0; X509_free(cert); @@ -1112,7 +1367,7 @@ log_warn(LD_GENERAL, "Couldn't allocate BIO!"); goto end; } if (!(ASN1_TIME_print(bio, X509_get_notBefore(cert)))) { - tls_log_errors(NULL, LOG_WARN, "printing certificate lifetime"); + tls_log_errors(NULL, LOG_WARN, LD_NET, "printing certificate lifetime"); goto end; } BIO_get_mem_ptr(bio, &buf); @@ -1120,7 +1375,7 @@ (void)BIO_reset(bio); if (!(ASN1_TIME_print(bio, X509_get_notAfter(cert)))) { - tls_log_errors(NULL, LOG_WARN, "printing certificate lifetime"); + tls_log_errors(NULL, LOG_WARN, LD_NET, "printing certificate lifetime"); goto end; } BIO_get_mem_ptr(bio, &buf); @@ -1134,13 +1389,11 @@ end: /* Not expected to get invoked */ - tls_log_errors(NULL, LOG_WARN, "getting certificate lifetime"); + tls_log_errors(NULL, LOG_WARN, LD_NET, "getting certificate lifetime"); if (bio) BIO_free(bio); - if (s1) - tor_free(s1); - if (s2) - tor_free(s2); + tor_free(s1); + tor_free(s2); } /** Helper function: try to extract a link certificate and an identity @@ -1208,7 +1461,7 @@ if (!(id_pkey = X509_get_pubkey(id_cert)) || X509_verify(cert, id_pkey) <= 0) { log_fn(severity,LD_PROTOCOL,"X509_verify on cert and pkey returned <= 0"); - tls_log_errors(tls, severity,"verifying certificate"); + tls_log_errors(tls, severity, LD_HANDSHAKE, "verifying certificate"); goto done; } @@ -1227,7 +1480,7 @@ /* This should never get invoked, but let's make sure in case OpenSSL * acts unexpectedly. */ - tls_log_errors(tls, LOG_WARN, "finishing tor_tls_verify"); + tls_log_errors(tls, LOG_WARN, LD_HANDSHAKE, "finishing tor_tls_verify"); return r; } @@ -1266,7 +1519,7 @@ if (cert) X509_free(cert); /* Not expected to get invoked */ - tls_log_errors(tls, LOG_WARN, "checking certificate lifetime"); + tls_log_errors(tls, LOG_WARN, LD_NET, "checking certificate lifetime"); return r; } @@ -1289,7 +1542,7 @@ } /** Sets n_read and n_written to the number of bytes read and written, - * respectivey, on the raw socket used by tls since the last time this + * respectively, on the raw socket used by tls since the last time this * function was called on tls. */ void tor_tls_get_n_raw_bytes(tor_tls_t *tls, size_t *n_read, size_t *n_written) @@ -1334,7 +1587,7 @@ return; log(LOG_WARN, LD_CRYPTO, "Unhandled OpenSSL errors found at %s:%d: ", tor_fix_source_file(fname), line); - tls_log_errors(NULL, LOG_WARN, NULL); + tls_log_errors(NULL, LOG_WARN, LD_NET, NULL); } /** Return true iff the initial TLS connection at tls did not use a v2 @@ -1354,3 +1607,25 @@ return 1; } +/** Examine the amount of memory used and available for buffers in tls. + * Set *rbuf_capacity to the amount of storage allocated for the read + * buffer and *rbuf_bytes to the amount actually used. + * Set *wbuf_capacity to the amount of storage allocated for the write + * buffer and *wbuf_bytes to the amount actually used. */ +void +tor_tls_get_buffer_sizes(tor_tls_t *tls, + size_t *rbuf_capacity, size_t *rbuf_bytes, + size_t *wbuf_capacity, size_t *wbuf_bytes) +{ + if (tls->ssl->s3->rbuf.buf) + *rbuf_capacity = tls->ssl->s3->rbuf.len; + else + *rbuf_capacity = 0; + if (tls->ssl->s3->wbuf.buf) + *wbuf_capacity = tls->ssl->s3->wbuf.len; + else + *wbuf_capacity = 0; + *rbuf_bytes = tls->ssl->s3->rbuf.left; + *wbuf_bytes = tls->ssl->s3->wbuf.left; +} + diff -Nru tor-0.2.0.34/src/common/tortls.h tor-0.2.2.16-alpha/src/common/tortls.h --- tor-0.2.0.34/src/common/tortls.h 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/tortls.h 2010-03-07 04:03:28.000000000 +0000 @@ -1,12 +1,10 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: tortls.h 13657 2008-02-21 16:11:58Z nickm $ */ -#ifndef _TORTLS_H -#define _TORTLS_H -#define TORTLS_H_ID "$Id: tortls.h 13657 2008-02-21 16:11:58Z nickm $" +#ifndef _TOR_TORTLS_H +#define _TOR_TORTLS_H /** * \file tortls.h @@ -22,7 +20,7 @@ /* Possible return values for most tor_tls_* functions. */ #define _MIN_TOR_TLS_ERROR_VAL -9 #define TOR_TLS_ERROR_MISC -9 -/* Rename to unexpected close or something. XXXX021 */ +/* Rename to unexpected close or something. XXXX */ #define TOR_TLS_ERROR_IO -8 #define TOR_TLS_ERROR_CONNREFUSED -7 #define TOR_TLS_ERROR_CONNRESET -6 @@ -33,7 +31,8 @@ #define TOR_TLS_WANTWRITE -1 #define TOR_TLS_DONE 0 -/** DOCDOC XXXX021 also rename me. */ +/** Collection of case statements for all TLS errors that are not due to + * underlying IO failure. */ #define CASE_TOR_TLS_ERROR_ANY_NONIO \ case TOR_TLS_ERROR_MISC: \ case TOR_TLS_ERROR_CONNREFUSED: \ @@ -66,6 +65,7 @@ int tor_tls_write(tor_tls_t *tls, const char *cp, size_t n); int tor_tls_handshake(tor_tls_t *tls); int tor_tls_renegotiate(tor_tls_t *tls); +void tor_tls_block_renegotiation(tor_tls_t *tls); int tor_tls_shutdown(tor_tls_t *tls); int tor_tls_get_pending_bytes(tor_tls_t *tls); size_t tor_tls_get_forced_write_size(tor_tls_t *tls); @@ -73,6 +73,10 @@ void tor_tls_get_n_raw_bytes(tor_tls_t *tls, size_t *n_read, size_t *n_written); +void tor_tls_get_buffer_sizes(tor_tls_t *tls, + size_t *rbuf_capacity, size_t *rbuf_bytes, + size_t *wbuf_capacity, size_t *wbuf_bytes); + int tor_tls_used_v1_handshake(tor_tls_t *tls); /* Log and abort if there are unhandled TLS errors in OpenSSL's error stack. diff -Nru tor-0.2.0.34/src/common/tortls_states.h tor-0.2.2.16-alpha/src/common/tortls_states.h --- tor-0.2.0.34/src/common/tortls_states.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/tortls_states.h 2010-03-07 04:03:28.000000000 +0000 @@ -0,0 +1,414 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/* Helper file: included only in tortls.c */ + +#ifndef _TORTLS_STATES_H +#define _TORTLS_STATES_H + +/* The main body of this file was mechanically generated with this + perl script: + + my %keys = (); + for $fn (@ARGV) { + open(F, $fn); + while () { + next unless /^#define ((?:SSL|DTLS)\w*_ST_\w*)/; + $keys{$1} = 1; + } + close(F); + } + for $k (sort keys %keys) { + print "#ifdef $k\n S($k),\n#endif\n" + } +*/ + +/** Mapping from allowed value of SSL.state to the name of C macro for that + * state. Used for debugging an openssl connection. */ +static const struct { int state; const char *name; } state_map[] = { +#define S(state) { state, #state } +#ifdef DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A + S(DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A), +#endif +#ifdef DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B + S(DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B), +#endif +#ifdef DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A + S(DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A), +#endif +#ifdef DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B + S(DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B), +#endif +#ifdef SSL23_ST_CR_SRVR_HELLO_A + S(SSL23_ST_CR_SRVR_HELLO_A), +#endif +#ifdef SSL23_ST_CR_SRVR_HELLO_B + S(SSL23_ST_CR_SRVR_HELLO_B), +#endif +#ifdef SSL23_ST_CW_CLNT_HELLO_A + S(SSL23_ST_CW_CLNT_HELLO_A), +#endif +#ifdef SSL23_ST_CW_CLNT_HELLO_B + S(SSL23_ST_CW_CLNT_HELLO_B), +#endif +#ifdef SSL23_ST_SR_CLNT_HELLO_A + S(SSL23_ST_SR_CLNT_HELLO_A), +#endif +#ifdef SSL23_ST_SR_CLNT_HELLO_B + S(SSL23_ST_SR_CLNT_HELLO_B), +#endif +#ifdef SSL2_ST_CLIENT_START_ENCRYPTION + S(SSL2_ST_CLIENT_START_ENCRYPTION), +#endif +#ifdef SSL2_ST_GET_CLIENT_FINISHED_A + S(SSL2_ST_GET_CLIENT_FINISHED_A), +#endif +#ifdef SSL2_ST_GET_CLIENT_FINISHED_B + S(SSL2_ST_GET_CLIENT_FINISHED_B), +#endif +#ifdef SSL2_ST_GET_CLIENT_HELLO_A + S(SSL2_ST_GET_CLIENT_HELLO_A), +#endif +#ifdef SSL2_ST_GET_CLIENT_HELLO_B + S(SSL2_ST_GET_CLIENT_HELLO_B), +#endif +#ifdef SSL2_ST_GET_CLIENT_HELLO_C + S(SSL2_ST_GET_CLIENT_HELLO_C), +#endif +#ifdef SSL2_ST_GET_CLIENT_MASTER_KEY_A + S(SSL2_ST_GET_CLIENT_MASTER_KEY_A), +#endif +#ifdef SSL2_ST_GET_CLIENT_MASTER_KEY_B + S(SSL2_ST_GET_CLIENT_MASTER_KEY_B), +#endif +#ifdef SSL2_ST_GET_SERVER_FINISHED_A + S(SSL2_ST_GET_SERVER_FINISHED_A), +#endif +#ifdef SSL2_ST_GET_SERVER_FINISHED_B + S(SSL2_ST_GET_SERVER_FINISHED_B), +#endif +#ifdef SSL2_ST_GET_SERVER_HELLO_A + S(SSL2_ST_GET_SERVER_HELLO_A), +#endif +#ifdef SSL2_ST_GET_SERVER_HELLO_B + S(SSL2_ST_GET_SERVER_HELLO_B), +#endif +#ifdef SSL2_ST_GET_SERVER_VERIFY_A + S(SSL2_ST_GET_SERVER_VERIFY_A), +#endif +#ifdef SSL2_ST_GET_SERVER_VERIFY_B + S(SSL2_ST_GET_SERVER_VERIFY_B), +#endif +#ifdef SSL2_ST_SEND_CLIENT_CERTIFICATE_A + S(SSL2_ST_SEND_CLIENT_CERTIFICATE_A), +#endif +#ifdef SSL2_ST_SEND_CLIENT_CERTIFICATE_B + S(SSL2_ST_SEND_CLIENT_CERTIFICATE_B), +#endif +#ifdef SSL2_ST_SEND_CLIENT_CERTIFICATE_C + S(SSL2_ST_SEND_CLIENT_CERTIFICATE_C), +#endif +#ifdef SSL2_ST_SEND_CLIENT_CERTIFICATE_D + S(SSL2_ST_SEND_CLIENT_CERTIFICATE_D), +#endif +#ifdef SSL2_ST_SEND_CLIENT_FINISHED_A + S(SSL2_ST_SEND_CLIENT_FINISHED_A), +#endif +#ifdef SSL2_ST_SEND_CLIENT_FINISHED_B + S(SSL2_ST_SEND_CLIENT_FINISHED_B), +#endif +#ifdef SSL2_ST_SEND_CLIENT_HELLO_A + S(SSL2_ST_SEND_CLIENT_HELLO_A), +#endif +#ifdef SSL2_ST_SEND_CLIENT_HELLO_B + S(SSL2_ST_SEND_CLIENT_HELLO_B), +#endif +#ifdef SSL2_ST_SEND_CLIENT_MASTER_KEY_A + S(SSL2_ST_SEND_CLIENT_MASTER_KEY_A), +#endif +#ifdef SSL2_ST_SEND_CLIENT_MASTER_KEY_B + S(SSL2_ST_SEND_CLIENT_MASTER_KEY_B), +#endif +#ifdef SSL2_ST_SEND_REQUEST_CERTIFICATE_A + S(SSL2_ST_SEND_REQUEST_CERTIFICATE_A), +#endif +#ifdef SSL2_ST_SEND_REQUEST_CERTIFICATE_B + S(SSL2_ST_SEND_REQUEST_CERTIFICATE_B), +#endif +#ifdef SSL2_ST_SEND_REQUEST_CERTIFICATE_C + S(SSL2_ST_SEND_REQUEST_CERTIFICATE_C), +#endif +#ifdef SSL2_ST_SEND_REQUEST_CERTIFICATE_D + S(SSL2_ST_SEND_REQUEST_CERTIFICATE_D), +#endif +#ifdef SSL2_ST_SEND_SERVER_FINISHED_A + S(SSL2_ST_SEND_SERVER_FINISHED_A), +#endif +#ifdef SSL2_ST_SEND_SERVER_FINISHED_B + S(SSL2_ST_SEND_SERVER_FINISHED_B), +#endif +#ifdef SSL2_ST_SEND_SERVER_HELLO_A + S(SSL2_ST_SEND_SERVER_HELLO_A), +#endif +#ifdef SSL2_ST_SEND_SERVER_HELLO_B + S(SSL2_ST_SEND_SERVER_HELLO_B), +#endif +#ifdef SSL2_ST_SEND_SERVER_VERIFY_A + S(SSL2_ST_SEND_SERVER_VERIFY_A), +#endif +#ifdef SSL2_ST_SEND_SERVER_VERIFY_B + S(SSL2_ST_SEND_SERVER_VERIFY_B), +#endif +#ifdef SSL2_ST_SEND_SERVER_VERIFY_C + S(SSL2_ST_SEND_SERVER_VERIFY_C), +#endif +#ifdef SSL2_ST_SERVER_START_ENCRYPTION + S(SSL2_ST_SERVER_START_ENCRYPTION), +#endif +#ifdef SSL2_ST_X509_GET_CLIENT_CERTIFICATE + S(SSL2_ST_X509_GET_CLIENT_CERTIFICATE), +#endif +#ifdef SSL2_ST_X509_GET_SERVER_CERTIFICATE + S(SSL2_ST_X509_GET_SERVER_CERTIFICATE), +#endif +#ifdef SSL3_ST_CR_CERT_A + S(SSL3_ST_CR_CERT_A), +#endif +#ifdef SSL3_ST_CR_CERT_B + S(SSL3_ST_CR_CERT_B), +#endif +#ifdef SSL3_ST_CR_CERT_REQ_A + S(SSL3_ST_CR_CERT_REQ_A), +#endif +#ifdef SSL3_ST_CR_CERT_REQ_B + S(SSL3_ST_CR_CERT_REQ_B), +#endif +#ifdef SSL3_ST_CR_CERT_STATUS_A + S(SSL3_ST_CR_CERT_STATUS_A), +#endif +#ifdef SSL3_ST_CR_CERT_STATUS_B + S(SSL3_ST_CR_CERT_STATUS_B), +#endif +#ifdef SSL3_ST_CR_CHANGE_A + S(SSL3_ST_CR_CHANGE_A), +#endif +#ifdef SSL3_ST_CR_CHANGE_B + S(SSL3_ST_CR_CHANGE_B), +#endif +#ifdef SSL3_ST_CR_FINISHED_A + S(SSL3_ST_CR_FINISHED_A), +#endif +#ifdef SSL3_ST_CR_FINISHED_B + S(SSL3_ST_CR_FINISHED_B), +#endif +#ifdef SSL3_ST_CR_KEY_EXCH_A + S(SSL3_ST_CR_KEY_EXCH_A), +#endif +#ifdef SSL3_ST_CR_KEY_EXCH_B + S(SSL3_ST_CR_KEY_EXCH_B), +#endif +#ifdef SSL3_ST_CR_SESSION_TICKET_A + S(SSL3_ST_CR_SESSION_TICKET_A), +#endif +#ifdef SSL3_ST_CR_SESSION_TICKET_B + S(SSL3_ST_CR_SESSION_TICKET_B), +#endif +#ifdef SSL3_ST_CR_SRVR_DONE_A + S(SSL3_ST_CR_SRVR_DONE_A), +#endif +#ifdef SSL3_ST_CR_SRVR_DONE_B + S(SSL3_ST_CR_SRVR_DONE_B), +#endif +#ifdef SSL3_ST_CR_SRVR_HELLO_A + S(SSL3_ST_CR_SRVR_HELLO_A), +#endif +#ifdef SSL3_ST_CR_SRVR_HELLO_B + S(SSL3_ST_CR_SRVR_HELLO_B), +#endif +#ifdef SSL3_ST_CW_CERT_A + S(SSL3_ST_CW_CERT_A), +#endif +#ifdef SSL3_ST_CW_CERT_B + S(SSL3_ST_CW_CERT_B), +#endif +#ifdef SSL3_ST_CW_CERT_C + S(SSL3_ST_CW_CERT_C), +#endif +#ifdef SSL3_ST_CW_CERT_D + S(SSL3_ST_CW_CERT_D), +#endif +#ifdef SSL3_ST_CW_CERT_VRFY_A + S(SSL3_ST_CW_CERT_VRFY_A), +#endif +#ifdef SSL3_ST_CW_CERT_VRFY_B + S(SSL3_ST_CW_CERT_VRFY_B), +#endif +#ifdef SSL3_ST_CW_CHANGE_A + S(SSL3_ST_CW_CHANGE_A), +#endif +#ifdef SSL3_ST_CW_CHANGE_B + S(SSL3_ST_CW_CHANGE_B), +#endif +#ifdef SSL3_ST_CW_CLNT_HELLO_A + S(SSL3_ST_CW_CLNT_HELLO_A), +#endif +#ifdef SSL3_ST_CW_CLNT_HELLO_B + S(SSL3_ST_CW_CLNT_HELLO_B), +#endif +#ifdef SSL3_ST_CW_FINISHED_A + S(SSL3_ST_CW_FINISHED_A), +#endif +#ifdef SSL3_ST_CW_FINISHED_B + S(SSL3_ST_CW_FINISHED_B), +#endif +#ifdef SSL3_ST_CW_FLUSH + S(SSL3_ST_CW_FLUSH), +#endif +#ifdef SSL3_ST_CW_KEY_EXCH_A + S(SSL3_ST_CW_KEY_EXCH_A), +#endif +#ifdef SSL3_ST_CW_KEY_EXCH_B + S(SSL3_ST_CW_KEY_EXCH_B), +#endif +#ifdef SSL3_ST_SR_CERT_A + S(SSL3_ST_SR_CERT_A), +#endif +#ifdef SSL3_ST_SR_CERT_B + S(SSL3_ST_SR_CERT_B), +#endif +#ifdef SSL3_ST_SR_CERT_VRFY_A + S(SSL3_ST_SR_CERT_VRFY_A), +#endif +#ifdef SSL3_ST_SR_CERT_VRFY_B + S(SSL3_ST_SR_CERT_VRFY_B), +#endif +#ifdef SSL3_ST_SR_CHANGE_A + S(SSL3_ST_SR_CHANGE_A), +#endif +#ifdef SSL3_ST_SR_CHANGE_B + S(SSL3_ST_SR_CHANGE_B), +#endif +#ifdef SSL3_ST_SR_CLNT_HELLO_A + S(SSL3_ST_SR_CLNT_HELLO_A), +#endif +#ifdef SSL3_ST_SR_CLNT_HELLO_B + S(SSL3_ST_SR_CLNT_HELLO_B), +#endif +#ifdef SSL3_ST_SR_CLNT_HELLO_C + S(SSL3_ST_SR_CLNT_HELLO_C), +#endif +#ifdef SSL3_ST_SR_FINISHED_A + S(SSL3_ST_SR_FINISHED_A), +#endif +#ifdef SSL3_ST_SR_FINISHED_B + S(SSL3_ST_SR_FINISHED_B), +#endif +#ifdef SSL3_ST_SR_KEY_EXCH_A + S(SSL3_ST_SR_KEY_EXCH_A), +#endif +#ifdef SSL3_ST_SR_KEY_EXCH_B + S(SSL3_ST_SR_KEY_EXCH_B), +#endif +#ifdef SSL3_ST_SW_CERT_A + S(SSL3_ST_SW_CERT_A), +#endif +#ifdef SSL3_ST_SW_CERT_B + S(SSL3_ST_SW_CERT_B), +#endif +#ifdef SSL3_ST_SW_CERT_REQ_A + S(SSL3_ST_SW_CERT_REQ_A), +#endif +#ifdef SSL3_ST_SW_CERT_REQ_B + S(SSL3_ST_SW_CERT_REQ_B), +#endif +#ifdef SSL3_ST_SW_CERT_STATUS_A + S(SSL3_ST_SW_CERT_STATUS_A), +#endif +#ifdef SSL3_ST_SW_CERT_STATUS_B + S(SSL3_ST_SW_CERT_STATUS_B), +#endif +#ifdef SSL3_ST_SW_CHANGE_A + S(SSL3_ST_SW_CHANGE_A), +#endif +#ifdef SSL3_ST_SW_CHANGE_B + S(SSL3_ST_SW_CHANGE_B), +#endif +#ifdef SSL3_ST_SW_FINISHED_A + S(SSL3_ST_SW_FINISHED_A), +#endif +#ifdef SSL3_ST_SW_FINISHED_B + S(SSL3_ST_SW_FINISHED_B), +#endif +#ifdef SSL3_ST_SW_FLUSH + S(SSL3_ST_SW_FLUSH), +#endif +#ifdef SSL3_ST_SW_HELLO_REQ_A + S(SSL3_ST_SW_HELLO_REQ_A), +#endif +#ifdef SSL3_ST_SW_HELLO_REQ_B + S(SSL3_ST_SW_HELLO_REQ_B), +#endif +#ifdef SSL3_ST_SW_HELLO_REQ_C + S(SSL3_ST_SW_HELLO_REQ_C), +#endif +#ifdef SSL3_ST_SW_KEY_EXCH_A + S(SSL3_ST_SW_KEY_EXCH_A), +#endif +#ifdef SSL3_ST_SW_KEY_EXCH_B + S(SSL3_ST_SW_KEY_EXCH_B), +#endif +#ifdef SSL3_ST_SW_SESSION_TICKET_A + S(SSL3_ST_SW_SESSION_TICKET_A), +#endif +#ifdef SSL3_ST_SW_SESSION_TICKET_B + S(SSL3_ST_SW_SESSION_TICKET_B), +#endif +#ifdef SSL3_ST_SW_SRVR_DONE_A + S(SSL3_ST_SW_SRVR_DONE_A), +#endif +#ifdef SSL3_ST_SW_SRVR_DONE_B + S(SSL3_ST_SW_SRVR_DONE_B), +#endif +#ifdef SSL3_ST_SW_SRVR_HELLO_A + S(SSL3_ST_SW_SRVR_HELLO_A), +#endif +#ifdef SSL3_ST_SW_SRVR_HELLO_B + S(SSL3_ST_SW_SRVR_HELLO_B), +#endif +#ifdef SSL_ST_ACCEPT + S(SSL_ST_ACCEPT), +#endif +#ifdef SSL_ST_BEFORE + S(SSL_ST_BEFORE), +#endif +#ifdef SSL_ST_CONNECT + S(SSL_ST_CONNECT), +#endif +#ifdef SSL_ST_INIT + S(SSL_ST_INIT), +#endif +#ifdef SSL_ST_MASK + S(SSL_ST_MASK), +#endif +#ifdef SSL_ST_OK + S(SSL_ST_OK), +#endif +#ifdef SSL_ST_READ_BODY + S(SSL_ST_READ_BODY), +#endif +#ifdef SSL_ST_READ_DONE + S(SSL_ST_READ_DONE), +#endif +#ifdef SSL_ST_READ_HEADER + S(SSL_ST_READ_HEADER), +#endif +#ifdef SSL_ST_RENEGOTIATE + S(SSL_ST_RENEGOTIATE), +#endif + { 0, NULL } +}; + +#endif + diff -Nru tor-0.2.0.34/src/common/util.c tor-0.2.2.16-alpha/src/common/util.c --- tor-0.2.0.34/src/common/util.c 2009-01-30 19:21:27.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/util.c 2010-09-12 02:54:22.000000000 +0000 @@ -1,9 +1,7 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: util.c 18236 2009-01-22 16:37:09Z nickm $ */ -const char util_c_id[] = "$Id: util.c 18236 2009-01-22 16:37:09Z nickm $"; /** * \file util.c @@ -17,10 +15,12 @@ #include "orconfig.h" #include "util.h" -#include "log.h" +#include "torlog.h" +#undef log #include "crypto.h" #include "torint.h" #include "container.h" +#include "address.h" #ifdef MS_WINDOWS #include @@ -31,6 +31,11 @@ #include #endif +/* math.h needs this on Linux */ +#ifndef __USE_ISOC99 +#define __USE_ISOC99 1 +#endif +#include #include #include #include @@ -77,6 +82,9 @@ #include #endif #endif +#ifdef HAVE_MALLOC_NP_H +#include +#endif /* ===== * Memory management @@ -84,6 +92,7 @@ #ifdef USE_DMALLOC #undef strndup #include + /* Macro to pass the extra dmalloc args to another function. */ #define DMALLOC_FN_ARGS , file, line #if defined(HAVE_DMALLOC_STRDUP) @@ -96,15 +105,7 @@ #endif #else /* not using dmalloc */ - #define dmalloc_strdup(file, line, string, xalloc_b) strdup(string) - #define dmalloc_malloc(file, line, size, func_id, alignment, xalloc_b) \ - malloc(size) - #define DMALLOC_FUNC_MALLOC 0 - - #define dmalloc_realloc(file, line, old_pnt, new_size, func_id, xalloc_b) \ - realloc((old_pnt), (new_size)) - #define DMALLOC_FUNC_REALLOC 0 #define DMALLOC_FN_ARGS #endif @@ -121,12 +122,17 @@ void *result; #ifndef MALLOC_ZERO_WORKS - /* Some libcs don't do the right thing on size==0. Override them. */ + /* Some libc mallocs don't work when size==0. Override them. */ if (size==0) { size=1; } #endif + +#ifdef USE_DMALLOC result = dmalloc_malloc(file, line, size, DMALLOC_FUNC_MALLOC, 0, 0); +#else + result = malloc(size); +#endif if (PREDICT_UNLIKELY(result == NULL)) { log_err(LD_MM,"Out of memory on malloc(). Dying."); @@ -145,6 +151,12 @@ void * _tor_malloc_zero(size_t size DMALLOC_PARAMS) { + /* You may ask yourself, "wouldn't it be smart to use calloc instead of + * malloc+memset? Perhaps libc's calloc knows some nifty optimization trick + * we don't!" Indeed it does, but its optimizations are only a big win when + * we're allocating something very big (it knows if it just got the memory + * from the OS in a pre-zeroed state). We don't want to use tor_malloc_zero + * for big stuff, so we don't bother with calloc. */ void *result = _tor_malloc(size DMALLOC_FN_ARGS); memset(result, 0, size); return result; @@ -159,7 +171,12 @@ { void *result; +#ifdef USE_DMALLOC result = dmalloc_realloc(file, line, ptr, size, DMALLOC_FUNC_REALLOC, 0); +#else + result = realloc(ptr, size); +#endif + if (PREDICT_UNLIKELY(result == NULL)) { log_err(LD_MM,"Out of memory on realloc(). Dying."); exit(1); @@ -177,7 +194,11 @@ char *dup; tor_assert(s); +#ifdef USE_DMALLOC dup = dmalloc_strdup(file, line, s, 0); +#else + dup = strdup(s); +#endif if (PREDICT_UNLIKELY(dup == NULL)) { log_err(LD_MM,"Out of memory on strdup(). Dying."); exit(1); @@ -206,8 +227,8 @@ return dup; } -/** Allocate a chunk of len bytes, with the same contents starting at - * mem. */ +/** Allocate a chunk of len bytes, with the same contents as the + * len bytes starting at mem. */ void * _tor_memdup(const void *mem, size_t len DMALLOC_PARAMS) { @@ -234,7 +255,7 @@ extern size_t malloc_good_size(size_t size); #endif -/** Allocate and return a chunk of memory of size at least *size

, using +/** Allocate and return a chunk of memory of size at least *size, using * the same resources we would use to malloc *sizep. Set *sizep * to the number of usable bytes in the chunk of memory. */ void * @@ -243,7 +264,9 @@ #ifdef HAVE_MALLOC_GOOD_SIZE *sizep = malloc_good_size(*sizep); return _tor_malloc(*sizep DMALLOC_FN_ARGS); -#elif defined(HAVE_MALLOC_USABLE_SIZE) && !defined(USE_DMALLOC) +#elif 0 && defined(HAVE_MALLOC_USABLE_SIZE) && !defined(USE_DMALLOC) + /* Never use malloc_usable_size(); it makes valgrind really unhappy, + * and doesn't win much in terms of usable space where it exists. */ void *result = _tor_malloc(*sizep DMALLOC_FN_ARGS); *sizep = malloc_usable_size(result); return result; @@ -261,7 +284,7 @@ struct mallinfo mi; memset(&mi, 0, sizeof(mi)); mi = mallinfo(); - log(severity, LD_MM, + tor_log(severity, LD_MM, "mallinfo() said: arena=%d, ordblks=%d, smblks=%d, hblks=%d, " "hblkhd=%d, usmblks=%d, fsmblks=%d, uordblks=%d, fordblks=%d, " "keepcost=%d", @@ -284,6 +307,25 @@ * Math * ===== */ +/** + * Returns the natural logarithm of d base 2. We define this wrapper here so + * as to make it easier not to conflict with Tor's log() macro. + */ +double +tor_mathlog(double d) +{ + return log(d); +} + +/** Return the long integer closest to d. We define this wrapper here so + * that not all users of math.h need to use the right incancations to get + * the c99 functions. */ +long +tor_lround(double d) +{ + return lround(d); +} + /** Returns floor(log2(u64)). If u64 is 0, (incorrectly) returns 0. */ int tor_log2(uint64_t u64) @@ -328,6 +370,36 @@ return low; } +/** Return the lowest x such that x is at least number, and x modulo + * divisor == 0. */ +unsigned +round_to_next_multiple_of(unsigned number, unsigned divisor) +{ + number += divisor - 1; + number -= number % divisor; + return number; +} + +/** Return the lowest x such that x is at least number, and x modulo + * divisor == 0. */ +uint32_t +round_uint32_to_next_multiple_of(uint32_t number, uint32_t divisor) +{ + number += divisor - 1; + number -= number % divisor; + return number; +} + +/** Return the lowest x such that x is at least number, and x modulo + * divisor == 0. */ +uint64_t +round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor) +{ + number += divisor - 1; + number -= number % divisor; + return number; +} + /* ===== * String manipulation * ===== */ @@ -472,6 +544,22 @@ return strncasecmp(s1+(n1-n2), s2, n2); } +/** Compare the value of the string prefix with the start of the + * memlen-byte memory chunk at mem. Return as for strcmp. + * + * [As memcmp(mem, prefix, strlen(prefix)) but returns -1 if memlen is less + * than strlen(prefix).] + */ +int +memcmpstart(const void *mem, size_t memlen, + const char *prefix) +{ + size_t plen = strlen(prefix); + if (memlen < plen) + return -1; + return memcmp(mem, prefix, plen); +} + /** Return a pointer to the first char of s that is not whitespace and * not a comment, or to the terminating NUL if no such character exists. */ @@ -594,6 +682,29 @@ return s; } +/** Return the first occurrence of needle in haystack that + * occurs at the start of a line (that is, at the beginning of haystack + * or immediately after a newline). Return NULL if no such string is found. + */ +const char * +find_str_at_start_of_line(const char *haystack, const char *needle) +{ + size_t needle_len = strlen(needle); + + do { + if (!strncmp(haystack, needle, needle_len)) + return haystack; + + haystack = strchr(haystack, '\n'); + if (!haystack) + return NULL; + else + ++haystack; + } while (*haystack); + + return NULL; +} + /** Return true iff the 'len' bytes at 'mem' are all zero. */ int tor_mem_is_zero(const char *mem, size_t len) @@ -621,6 +732,13 @@ return tor_mem_is_zero(digest, DIGEST_LEN); } +/** Return true iff the DIGEST256_LEN bytes in digest are all zero. */ +int +tor_digest256_is_zero(const char *digest) +{ + return tor_mem_is_zero(digest, DIGEST256_LEN); +} + /* Helper: common code to check whether the result of a strtol or strtoul or * strtoll is correct. */ #define CHECK_STRTOX_RESULT() \ @@ -672,7 +790,18 @@ CHECK_STRTOX_RESULT(); } -/** As tor_parse_log, but return a unit64_t. Only base 10 is guaranteed to +/** As tor_parse_long(), but return a double. */ +double +tor_parse_double(const char *s, double min, double max, int *ok, char **next) +{ + char *endptr; + double r; + + r = strtod(s, &endptr); + CHECK_STRTOX_RESULT(); +} + +/** As tor_parse_long, but return a uint64_t. Only base 10 is guaranteed to * work for now. */ uint64_t tor_parse_uint64(const char *s, int base, uint64_t min, @@ -727,7 +856,7 @@ /** Helper: given a hex digit, return its value, or -1 if it isn't hex. */ static INLINE int -hex_decode_digit(char c) +_hex_decode_digit(char c) { switch (c) { case '0': return 0; @@ -751,6 +880,13 @@ } } +/** Helper: given a hex digit, return its value, or -1 if it isn't hex. */ +int +hex_decode_digit(char c) +{ + return _hex_decode_digit(c); +} + /** Given a hexadecimal string of srclen bytes in src, decode it * and store the result in the destlen-byte buffer at dest. * Return 0 on success, -1 on failure. */ @@ -766,8 +902,8 @@ return -1; end = src+srclen; while (srctv_sec; + conv += tv->tv_usec/1000000.0; + return conv; +} + +/** + * Converts timeval to milliseconds. + */ +int64_t +tv_to_msec(const struct timeval *tv) +{ + int64_t conv = ((int64_t)tv->tv_sec)*1000L; + /* Round ghetto-style */ + conv += ((int64_t)tv->tv_usec+500)/1000L; + return conv; +} + +/** + * Converts timeval to microseconds. + */ +int64_t +tv_to_usec(const struct timeval *tv) +{ + int64_t conv = ((int64_t)tv->tv_sec)*1000000L; + conv += tv->tv_usec; + return conv; +} + /** Return the number of microseconds elapsed between *start and *end. */ long @@ -962,7 +1136,8 @@ long secdiff = end->tv_sec - start->tv_sec; if (labs(secdiff+1) > LONG_MAX/1000000) { - log_warn(LD_GENERAL, "comparing times too far apart."); + log_warn(LD_GENERAL, "comparing times on microsecond detail too far " + "apart: %ld seconds", secdiff); return LONG_MAX; } @@ -970,6 +1145,26 @@ return udiff; } +/** Return the number of milliseconds elapsed between *start and *end. + */ +long +tv_mdiff(const struct timeval *start, const struct timeval *end) +{ + long mdiff; + long secdiff = end->tv_sec - start->tv_sec; + + if (labs(secdiff+1) > LONG_MAX/1000) { + log_warn(LD_GENERAL, "comparing times on millisecond detail too far " + "apart: %ld seconds", secdiff); + return LONG_MAX; + } + + /* Subtract and round */ + mdiff = secdiff*1000L + + ((long)end->tv_usec - (long)start->tv_usec + 500L) / 1000L; + return mdiff; +} + /** Yield true iff y is a leap-year. */ #define IS_LEAPYEAR(y) (!(y % 4) && ((y % 100) || !(y % 400))) /** Helper: Return the number of leap-days between Jan 1, y1 and Jan 1, y2. */ @@ -993,8 +1188,7 @@ /* This is a pretty ironclad timegm implementation, snarfed from Python2.2. * It's way more brute-force than fiddling with tzset(). */ - time_t ret; - unsigned long year, days, hours, minutes; + time_t year, days, hours, minutes, seconds; int i; year = tm->tm_year + 1900; if (year < 1970 || tm->tm_mon < 0 || tm->tm_mon > 11) { @@ -1011,13 +1205,16 @@ hours = days*24 + tm->tm_hour; minutes = hours*60 + tm->tm_min; - ret = ((time_t)minutes)*60 + tm->tm_sec; - return ret; + seconds = minutes*60 + tm->tm_sec; + return seconds; } /* strftime is locale-specific, so we need to replace those parts */ + +/** A c-locale array of 3-letter names of weekdays, starting with Sun. */ static const char *WEEKDAY_NAMES[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; +/** A c-locale array of 3-letter names of months, starting with Jan. */ static const char *MONTH_NAMES[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; @@ -1043,10 +1240,10 @@ memcpy(buf+8, MONTH_NAMES[tm.tm_mon], 3); } -/** Parse the the RFC1123 encoding of some time (in GMT) from buf, +/** Parse the RFC1123 encoding of some time (in GMT) from buf, * and store the result in *t. * - * Return 0 on succcess, -1 on failure. + * Return 0 on success, -1 on failure. */ int parse_rfc1123_time(const char *buf, time_t *t) @@ -1055,18 +1252,30 @@ char month[4]; char weekday[4]; int i, m; + unsigned tm_mday, tm_year, tm_hour, tm_min, tm_sec; if (strlen(buf) != RFC1123_TIME_LEN) return -1; memset(&tm, 0, sizeof(tm)); - if (sscanf(buf, "%3s, %d %3s %d %d:%d:%d GMT", weekday, - &tm.tm_mday, month, &tm.tm_year, &tm.tm_hour, - &tm.tm_min, &tm.tm_sec) < 7) { + if (tor_sscanf(buf, "%3s, %2u %3s %u %2u:%2u:%2u GMT", weekday, + &tm_mday, month, &tm_year, &tm_hour, + &tm_min, &tm_sec) < 7) { char *esc = esc_for_log(buf); log_warn(LD_GENERAL, "Got invalid RFC1123 time %s", esc); tor_free(esc); return -1; } + if (tm_mday > 31 || tm_hour > 23 || tm_min > 59 || tm_sec > 61) { + char *esc = esc_for_log(buf); + log_warn(LD_GENERAL, "Got invalid RFC1123 time %s", esc); + tor_free(esc); + return -1; + } + tm.tm_mday = (int)tm_mday; + tm.tm_year = (int)tm_year; + tm.tm_hour = (int)tm_hour; + tm.tm_min = (int)tm_min; + tm.tm_sec = (int)tm_sec; m = -1; for (i = 0; i < 12; ++i) { @@ -1126,19 +1335,20 @@ parse_iso_time(const char *cp, time_t *t) { struct tm st_tm; -#ifdef HAVE_STRPTIME - if (!strptime(cp, "%Y-%m-%d %H:%M:%S", &st_tm)) { - log_warn(LD_GENERAL, "ISO time was unparseable by strptime"); return -1; - } -#else unsigned int year=0, month=0, day=0, hour=100, minute=100, second=100; - if (sscanf(cp, "%u-%u-%u %u:%u:%u", &year, &month, + if (tor_sscanf(cp, "%u-%2u-%2u %2u:%2u:%2u", &year, &month, &day, &hour, &minute, &second) < 6) { - log_warn(LD_GENERAL, "ISO time was unparseable"); return -1; + char *esc = esc_for_log(cp); + log_warn(LD_GENERAL, "ISO time %s was unparseable", esc); + tor_free(esc); + return -1; } if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || second > 61) { - log_warn(LD_GENERAL, "ISO time was nonsensical"); return -1; + char *esc = esc_for_log(cp); + log_warn(LD_GENERAL, "ISO time %s was nonsensical", esc); + tor_free(esc); + return -1; } st_tm.tm_year = year-1900; st_tm.tm_mon = month-1; @@ -1146,7 +1356,7 @@ st_tm.tm_hour = hour; st_tm.tm_min = minute; st_tm.tm_sec = second; -#endif + if (st_tm.tm_year < 70) { char *esc = esc_for_log(cp); log_warn(LD_GENERAL, "Got invalid ISO time %s. (Before 1970)", esc); @@ -1166,6 +1376,7 @@ char month[4]; char wkday[4]; int i; + unsigned tm_mday, tm_year, tm_hour, tm_min, tm_sec; tor_assert(tm); memset(tm, 0, sizeof(*tm)); @@ -1173,28 +1384,33 @@ /* First, try RFC1123 or RFC850 format: skip the weekday. */ if ((cp = strchr(date, ','))) { ++cp; - if (sscanf(date, "%2d %3s %4d %2d:%2d:%2d GMT", - &tm->tm_mday, month, &tm->tm_year, - &tm->tm_hour, &tm->tm_min, &tm->tm_sec) == 6) { + if (tor_sscanf(date, "%2u %3s %4u %2u:%2u:%2u GMT", + &tm_mday, month, &tm_year, + &tm_hour, &tm_min, &tm_sec) == 6) { /* rfc1123-date */ - tm->tm_year -= 1900; - } else if (sscanf(date, "%2d-%3s-%2d %2d:%2d:%2d GMT", - &tm->tm_mday, month, &tm->tm_year, - &tm->tm_hour, &tm->tm_min, &tm->tm_sec) == 6) { + tm_year -= 1900; + } else if (tor_sscanf(date, "%2u-%3s-%2u %2u:%2u:%2u GMT", + &tm_mday, month, &tm_year, + &tm_hour, &tm_min, &tm_sec) == 6) { /* rfc850-date */ } else { return -1; } } else { /* No comma; possibly asctime() format. */ - if (sscanf(date, "%3s %3s %2d %2d:%2d:%2d %4d", - wkday, month, &tm->tm_mday, - &tm->tm_hour, &tm->tm_min, &tm->tm_sec, &tm->tm_year) == 7) { - tm->tm_year -= 1900; + if (tor_sscanf(date, "%3s %3s %2u %2u:%2u:%2u %4u", + wkday, month, &tm_mday, + &tm_hour, &tm_min, &tm_sec, &tm_year) == 7) { + tm_year -= 1900; } else { return -1; } } + tm->tm_mday = (int)tm_mday; + tm->tm_year = (int)tm_year; + tm->tm_hour = (int)tm_hour; + tm->tm_min = (int)tm_min; + tm->tm_sec = (int)tm_sec; month[3] = '\0'; /* Okay, now decode the month. */ @@ -1254,10 +1470,42 @@ } /* ===== + * Cached time + * ===== */ + +#ifndef TIME_IS_FAST +/** Cached estimate of the current time. Updated around once per second; + * may be a few seconds off if we are really busy. This is a hack to avoid + * calling time(NULL) (which not everybody has optimized) on critical paths. + */ +static time_t cached_approx_time = 0; + +/** Return a cached estimate of the current time from when + * update_approx_time() was last called. This is a hack to avoid calling + * time(NULL) on critical paths: please do not even think of calling it + * anywhere else. */ +time_t +approx_time(void) +{ + return cached_approx_time; +} + +/** Update the cached estimate of the current time. This function SHOULD be + * called once per second, and MUST be called before the first call to + * get_approx_time. */ +void +update_approx_time(time_t now) +{ + cached_approx_time = now; +} +#endif + +/* ===== * Fuzzy time + * XXXX022 Use this consistently or rip most of it out. * ===== */ -/* In a perfect world, everybody would run ntp, and ntp would be perfect, so +/* In a perfect world, everybody would run NTP, and NTP would be perfect, so * if we wanted to know "Is the current time before time X?" we could just say * "time(NULL) < X". * @@ -1269,14 +1517,21 @@ * have up to ftime_slop seconds of inaccuracy; IOW, our window of * estimate for the current time is now + ftime_skew +/- ftime_slop. */ +/** Our current estimate of our skew, such that we think the current time is + * closest to time(NULL)+ftime_skew. */ static int ftime_skew = 0; +/** Tolerance during time comparisons, in seconds. */ static int ftime_slop = 60; +/** Set the largest amount of sloppiness we'll allow in fuzzy time + * comparisons. */ void ftime_set_maximum_sloppiness(int seconds) { tor_assert(seconds >= 0); ftime_slop = seconds; } +/** Set the amount by which we believe our system clock to differ from + * real time. */ void ftime_set_estimated_skew(int seconds) { @@ -1290,18 +1545,21 @@ ft_out->latest = now + ftime_skew + ftime_slop; } #endif +/** Return true iff we think that now might be after when. */ int ftime_maybe_after(time_t now, time_t when) { /* It may be after when iff the latest possible current time is after when */ return (now + ftime_skew + ftime_slop) >= when; } +/** Return true iff we think that now might be before when. */ int ftime_maybe_before(time_t now, time_t when) { /* It may be before when iff the earliest possible current time is before */ return (now + ftime_skew - ftime_slop) < when; } +/** Return true if we think that now is definitely after when. */ int ftime_definitely_after(time_t now, time_t when) { @@ -1309,6 +1567,8 @@ * after when. */ return (now + ftime_skew - ftime_slop) >= when; } +/** Return true if we think that now is definitely before when. + */ int ftime_definitely_before(time_t now, time_t when) { @@ -1318,6 +1578,49 @@ } /* ===== + * Rate limiting + * ===== */ + +/** If the rate-limiter lim is ready at now, return the number + * of calls to rate_limit_is_ready (including this one!) since the last time + * rate_limit_is_ready returned nonzero. Otherwise return 0. */ +static int +rate_limit_is_ready(ratelim_t *lim, time_t now) +{ + if (lim->rate + lim->last_allowed <= now) { + int res = lim->n_calls_since_last_time + 1; + lim->last_allowed = now; + lim->n_calls_since_last_time = 0; + return res; + } else { + ++lim->n_calls_since_last_time; + return 0; + } +} + +/** If the rate-limiter lim is ready at now, return a newly + * allocated string indicating how many messages were suppressed, suitable to + * append to a log message. Otherwise return NULL. */ +char * +rate_limit_log(ratelim_t *lim, time_t now) +{ + int n; + if ((n = rate_limit_is_ready(lim, now))) { + if (n == 1) { + return tor_strdup(""); + } else { + char *cp=NULL; + tor_asprintf(&cp, + " [%d similar message(s) suppressed in last %d seconds]", + n-1, lim->rate); + return cp; + } + } else { + return NULL; + } +} + +/* ===== * File helpers * ===== */ @@ -1325,12 +1628,12 @@ * must be 1 if fd was returned by socket() or accept(), and 0 if fd * was returned by open(). Return the number of bytes written, or -1 * on error. Only use if fd is a blocking fd. */ -int +ssize_t write_all(int fd, const char *buf, size_t count, int isSocket) { size_t written = 0; ssize_t result; - tor_assert(count < INT_MAX); /*XXXX021 make returnval an ssize_t */ + tor_assert(count < SSIZE_T_MAX); while (written != count) { if (isSocket) @@ -1341,7 +1644,7 @@ return -1; written += result; } - return (int)count; + return (ssize_t)count; } /** Read from fd to buf, until we get count bytes @@ -1349,14 +1652,13 @@ * was returned by socket() or accept(), and 0 if fd was returned by * open(). Return the number of bytes read, or -1 on error. Only use * if fd is a blocking fd. */ -int +ssize_t read_all(int fd, char *buf, size_t count, int isSocket) { - /*XXXX021 return ssize_t. */ size_t numread = 0; ssize_t result; - if (count > SIZE_T_CEILING || count > INT_MAX) + if (count > SIZE_T_CEILING || count > SSIZE_T_MAX) return -1; while (numread != count) { @@ -1370,7 +1672,7 @@ break; numread += result; } - return (int)numread; + return (ssize_t)numread; } /* @@ -1399,7 +1701,7 @@ /** Return FN_ERROR if filename can't be read, FN_NOENT if it doesn't * exist, FN_FILE if it is a regular file, or FN_DIR if it's a - * directory. */ + * directory. On FN_ERROR, sets errno. */ file_status_t file_status(const char *fname) { @@ -1442,22 +1744,22 @@ tor_free(f); if (r) { if (errno != ENOENT) { - log(LOG_WARN, LD_FS, "Directory %s cannot be read: %s", dirname, - strerror(errno)); + log_warn(LD_FS, "Directory %s cannot be read: %s", dirname, + strerror(errno)); return -1; } if (check == CPD_NONE) { - log(LOG_WARN, LD_FS, "Directory %s does not exist.", dirname); + log_warn(LD_FS, "Directory %s does not exist.", dirname); return -1; } else if (check == CPD_CREATE) { log_info(LD_GENERAL, "Creating directory %s", dirname); -#ifdef MS_WINDOWS +#if defined (MS_WINDOWS) && !defined (WINCE) r = mkdir(dirname); #else r = mkdir(dirname, 0700); #endif if (r) { - log(LOG_WARN, LD_FS, "Error creating directory %s: %s", dirname, + log_warn(LD_FS, "Error creating directory %s: %s", dirname, strerror(errno)); return -1; } @@ -1467,7 +1769,7 @@ return 0; } if (!(st.st_mode & S_IFDIR)) { - log(LOG_WARN, LD_FS, "%s is not a directory", dirname); + log_warn(LD_FS, "%s is not a directory", dirname); return -1; } #ifndef MS_WINDOWS @@ -1480,7 +1782,7 @@ pw = getpwuid(st.st_uid); - log(LOG_WARN, LD_FS, "%s is not owned by this user (%s, %d) but by " + log_warn(LD_FS, "%s is not owned by this user (%s, %d) but by " "%s (%d). Perhaps you are running Tor as the wrong user?", dirname, process_ownername, (int)getuid(), pw ? pw->pw_name : "", (int)st.st_uid); @@ -1489,9 +1791,9 @@ return -1; } if (st.st_mode & 0077) { - log(LOG_WARN, LD_FS, "Fixing permissions on directory %s", dirname); + log_warn(LD_FS, "Fixing permissions on directory %s", dirname); if (chmod(dirname, 0700)) { - log(LOG_WARN, LD_FS, "Could not chmod directory %s: %s", dirname, + log_warn(LD_FS, "Could not chmod directory %s: %s", dirname, strerror(errno)); return -1; } else { @@ -1522,12 +1824,13 @@ } /** Represents a file that we're writing to, with support for atomic commit: - * we can write into a a temporary file, and either remove the file on + * we can write into a temporary file, and either remove the file on * failure, or replace the original file on success. */ struct open_file_t { char *tempname; /**< Name of the temporary file. */ char *filename; /**< Name of the original file. */ - int rename_on_close; /**< Are we using the temporary file or not? */ + unsigned rename_on_close:1; /**< Are we using the temporary file or not? */ + unsigned binary:1; /**< Did we open in binary mode? */ int fd; /**< fd for the open file. */ FILE *stdio_file; /**< stdio wrapper for fd. */ }; @@ -1546,6 +1849,9 @@ * * NOTE: When not appending, the flags O_CREAT and O_TRUNC are treated * as true and the flag O_EXCL is treated as false. + * + * NOTE: Ordinarily, O_APPEND means "seek to the end of the file before each + * write()". We don't do that. */ int start_writing_to_file(const char *fname, int open_flags, int mode, @@ -1554,22 +1860,25 @@ size_t tempname_len = strlen(fname)+16; open_file_t *new_file = tor_malloc_zero(sizeof(open_file_t)); const char *open_name; + int append = 0; + tor_assert(fname); tor_assert(data_out); #if (O_BINARY != 0 && O_TEXT != 0) tor_assert((open_flags & (O_BINARY|O_TEXT)) != 0); #endif new_file->fd = -1; - tempname_len = strlen(fname)+16; tor_assert(tempname_len > strlen(fname)); /*check for overflow*/ new_file->filename = tor_strdup(fname); if (open_flags & O_APPEND) { open_name = fname; new_file->rename_on_close = 0; + append = 1; + open_flags &= ~O_APPEND; } else { open_name = new_file->tempname = tor_malloc(tempname_len); if (tor_snprintf(new_file->tempname, tempname_len, "%s.tmp", fname)<0) { - log(LOG_WARN, LD_GENERAL, "Failed to generate filename"); + log_warn(LD_GENERAL, "Failed to generate filename"); goto err; } /* We always replace an existing temporary file if there is one. */ @@ -1577,18 +1886,30 @@ open_flags &= ~O_EXCL; new_file->rename_on_close = 1; } + if (open_flags & O_BINARY) + new_file->binary = 1; - if ((new_file->fd = open(open_name, open_flags, mode)) - < 0) { - log(LOG_WARN, LD_FS, "Couldn't open \"%s\" (%s) for writing: %s", + new_file->fd = open(open_name, open_flags, mode); + if (new_file->fd < 0) { + log_warn(LD_FS, "Couldn't open \"%s\" (%s) for writing: %s", open_name, fname, strerror(errno)); goto err; } + if (append) { + if (tor_fd_seekend(new_file->fd) < 0) { + log_warn(LD_FS, "Couldn't seek to end of file \"%s\": %s", open_name, + strerror(errno)); + goto err; + } + } *data_out = new_file; return new_file->fd; + err: + if (new_file->fd >= 0) + close(new_file->fd); *data_out = NULL; tor_free(new_file->filename); tor_free(new_file->tempname); @@ -1606,9 +1927,10 @@ if (file_data->stdio_file) return file_data->stdio_file; tor_assert(file_data->fd >= 0); - if (!(file_data->stdio_file = fdopen(file_data->fd, "a"))) { - log_warn(LD_FS, "Couldn't fdopen \"%s\": %s", file_data->filename, - strerror(errno)); + if (!(file_data->stdio_file = fdopen(file_data->fd, + file_data->binary?"ab":"a"))) { + log_warn(LD_FS, "Couldn't fdopen \"%s\" [%d]: %s", file_data->filename, + file_data->fd, strerror(errno)); } return file_data->stdio_file; } @@ -1622,8 +1944,10 @@ FILE *res; if (start_writing_to_file(fname, open_flags, mode, data_out)<0) return NULL; - if (!(res = fdopen_file(*data_out))) + if (!(res = fdopen_file(*data_out))) { abort_writing_to_file(*data_out); + *data_out = NULL; + } return res; } @@ -1695,18 +2019,20 @@ int open_flags) { open_file_t *file = NULL; - int fd, result; + int fd; + ssize_t result; fd = start_writing_to_file(fname, open_flags, 0600, &file); if (fd<0) return -1; SMARTLIST_FOREACH(chunks, sized_chunk_t *, chunk, { result = write_all(fd, chunk->bytes, chunk->len, 0); - if (result < 0 || (size_t)result != chunk->len) { - log(LOG_WARN, LD_FS, "Error writing to \"%s\": %s", fname, + if (result < 0) { + log_warn(LD_FS, "Error writing to \"%s\": %s", fname, strerror(errno)); goto err; } + tor_assert((size_t)result == chunk->len); }); return finish_writing_to_file(file); @@ -1779,7 +2105,7 @@ int fd; /* router file */ struct stat statbuf; char *string; - int r; + ssize_t r; int bin = flags & RFTS_BIN; tor_assert(filename); @@ -1838,7 +2164,7 @@ * match for size. */ int save_errno = errno; log_warn(LD_FS,"Could read only %d of %ld bytes of file \"%s\".", - r, (long)statbuf.st_size,filename); + (int)r, (long)statbuf.st_size,filename); tor_free(string); close(fd); errno = save_errno; @@ -1854,7 +2180,7 @@ #define TOR_ISODIGIT(c) ('0' <= (c) && (c) <= '7') -/* Given a c-style double-quoted escaped string in s, extract and +/** Given a c-style double-quoted escaped string in s, extract and * decode its contents into a newly allocated string. On success, assign this * string to *result, assign its length to size_out (if * provided), and return a pointer to the position in s immediately @@ -2033,19 +2359,22 @@ expand_filename(const char *filename) { tor_assert(filename); +#ifdef MS_WINDOWS + return tor_strdup(filename); +#else if (*filename == '~') { - size_t len; - char *home, *result; + char *home, *result=NULL; const char *rest; if (filename[1] == '/' || filename[1] == '\0') { home = getenv("HOME"); if (!home) { log_warn(LD_CONFIG, "Couldn't find $HOME environment variable while " - "expanding \"%s\"", filename); - return NULL; + "expanding \"%s\"; defaulting to \"\".", filename); + home = tor_strdup(""); + } else { + home = tor_strdup(home); } - home = tor_strdup(home); rest = strlen(filename)>=2?(filename+2):""; } else { #ifdef HAVE_PWD_H @@ -2072,16 +2401,163 @@ if (strlen(home)>1 && !strcmpend(home,PATH_SEPARATOR)) { home[strlen(home)-1] = '\0'; } - /* Plus one for /, plus one for NUL. - * Round up to 16 in case we can't do math. */ - len = strlen(home)+strlen(rest)+16; - result = tor_malloc(len); - tor_snprintf(result,len,"%s"PATH_SEPARATOR"%s",home,rest); + tor_asprintf(&result,"%s"PATH_SEPARATOR"%s",home,rest); tor_free(home); return result; } else { return tor_strdup(filename); } +#endif +} + +#define MAX_SCANF_WIDTH 9999 + +/** Helper: given an ASCII-encoded decimal digit, return its numeric value. + * NOTE: requires that its input be in-bounds. */ +static int +digit_to_num(char d) +{ + int num = ((int)d) - (int)'0'; + tor_assert(num <= 9 && num >= 0); + return num; +} + +/** Helper: Read an unsigned int from *bufp of up to width + * characters. (Handle arbitrary width if width is less than 0.) On + * success, store the result in out, advance bufp to the next + * character, and return 0. On failure, return -1. */ +static int +scan_unsigned(const char **bufp, unsigned *out, int width) +{ + unsigned result = 0; + int scanned_so_far = 0; + if (!bufp || !*bufp || !out) + return -1; + if (width<0) + width=MAX_SCANF_WIDTH; + + while (**bufp && TOR_ISDIGIT(**bufp) && scanned_so_far < width) { + int digit = digit_to_num(*(*bufp)++); + unsigned new_result = result * 10 + digit; + if (new_result > UINT32_MAX || new_result < result) + return -1; /* over/underflow. */ + result = new_result; + ++scanned_so_far; + } + + if (!scanned_so_far) /* No actual digits scanned */ + return -1; + + *out = result; + return 0; +} + +/** Helper: copy up to width non-space characters from bufp to + * out. Make sure out is nul-terminated. Advance bufp + * to the next non-space character or the EOS. */ +static int +scan_string(const char **bufp, char *out, int width) +{ + int scanned_so_far = 0; + if (!bufp || !out || width < 0) + return -1; + while (**bufp && ! TOR_ISSPACE(**bufp) && scanned_so_far < width) { + *out++ = *(*bufp)++; + ++scanned_so_far; + } + *out = '\0'; + return 0; +} + +/** Locale-independent, minimal, no-surprises scanf variant, accepting only a + * restricted pattern format. For more info on what it supports, see + * tor_sscanf() documentation. */ +int +tor_vsscanf(const char *buf, const char *pattern, va_list ap) +{ + int n_matched = 0; + + while (*pattern) { + if (*pattern != '%') { + if (*buf == *pattern) { + ++buf; + ++pattern; + continue; + } else { + return n_matched; + } + } else { + int width = -1; + ++pattern; + if (TOR_ISDIGIT(*pattern)) { + width = digit_to_num(*pattern++); + while (TOR_ISDIGIT(*pattern)) { + width *= 10; + width += digit_to_num(*pattern++); + if (width > MAX_SCANF_WIDTH) + return -1; + } + if (!width) /* No zero-width things. */ + return -1; + } + if (*pattern == 'u') { + unsigned *u = va_arg(ap, unsigned *); + if (!*buf) + return n_matched; + if (scan_unsigned(&buf, u, width)<0) + return n_matched; + ++pattern; + ++n_matched; + } else if (*pattern == 's') { + char *s = va_arg(ap, char *); + if (width < 0) + return -1; + if (scan_string(&buf, s, width)<0) + return n_matched; + ++pattern; + ++n_matched; + } else if (*pattern == 'c') { + char *ch = va_arg(ap, char *); + if (width != -1) + return -1; + if (!*buf) + return n_matched; + *ch = *buf++; + ++pattern; + ++n_matched; + } else if (*pattern == '%') { + if (*buf != '%') + return -1; + ++buf; + ++pattern; + } else { + return -1; /* Unrecognized pattern component. */ + } + } + } + + return n_matched; +} + +/** Minimal sscanf replacement: parse buf according to pattern + * and store the results in the corresponding argument fields. Differs from + * sscanf in that it: Only handles %u and %Ns. Does not handle arbitrarily + * long widths. %u does not consume any space. Is locale-independent. + * Returns -1 on malformed patterns. + * + * (As with other locale-independent functions, we need this to parse data that + * is in ASCII without worrying that the C library's locale-handling will make + * miscellaneous characters look like numbers, spaces, and so on.) + */ +int +tor_sscanf(const char *buf, const char *pattern, ...) +{ + int r; + va_list ap; + va_start(ap, pattern); + r = tor_vsscanf(buf, pattern, ap); + va_end(ap); + return r; } /** Return a new list containing the filenames in the directory dirname. @@ -2093,24 +2569,39 @@ smartlist_t *result; #ifdef MS_WINDOWS char *pattern; + TCHAR tpattern[MAX_PATH] = {0}; + char name[MAX_PATH] = {0}; HANDLE handle; WIN32_FIND_DATA findData; size_t pattern_len = strlen(dirname)+16; pattern = tor_malloc(pattern_len); tor_snprintf(pattern, pattern_len, "%s\\*", dirname); - if (INVALID_HANDLE_VALUE == (handle = FindFirstFile(pattern, &findData))) { +#ifdef UNICODE + mbstowcs(tpattern,pattern,MAX_PATH); +#else + strlcpy(tpattern, pattern, MAX_PATH); +#endif + if (INVALID_HANDLE_VALUE == (handle = FindFirstFile(tpattern, &findData))) { tor_free(pattern); return NULL; } result = smartlist_create(); while (1) { - if (strcmp(findData.cFileName, ".") && - strcmp(findData.cFileName, "..")) { - smartlist_add(result, tor_strdup(findData.cFileName)); +#ifdef UNICODE + wcstombs(name,findData.cFileName,MAX_PATH); +#else + strlcpy(name,findData.cFileName,sizeof(name)); +#endif + if (strcmp(name, ".") && + strcmp(name, "..")) { + smartlist_add(result, tor_strdup(name)); } if (!FindNextFile(handle, &findData)) { - if (GetLastError() != ERROR_NO_MORE_FILES) { - log_warn(LD_FS, "Error reading directory."); + DWORD err; + if ((err = GetLastError()) != ERROR_NO_MORE_FILES) { + char *errstr = format_win32_error(err); + log_warn(LD_FS, "Error reading directory '%s': %s", dirname, errstr); + tor_free(errstr); } break; } @@ -2153,856 +2644,6 @@ } /* ===== - * Net helpers - * ===== */ - -/** Return true iff ip (in host order) is an IP reserved to localhost, - * or reserved for local networks by RFC 1918. - */ -int -is_internal_IP(uint32_t ip, int for_listening) -{ - tor_addr_t myaddr; - myaddr.family = AF_INET; - myaddr.addr.in_addr.s_addr = htonl(ip); - - return tor_addr_is_internal(&myaddr, for_listening); -} - -/** Return true iff ip is an IP reserved to localhost or local networks - * in RFC1918 or RFC4193 or RFC4291. (fec0::/10, deprecated by RFC3879, is - * also treated as internal for now.) - */ -int -tor_addr_is_internal(const tor_addr_t *addr, int for_listening) -{ - uint32_t iph4 = 0; - uint32_t iph6[4]; - sa_family_t v_family; - v_family = IN_FAMILY(addr); - - if (v_family == AF_INET) { - iph4 = IPV4IPh(addr); - } else if (v_family == AF_INET6) { - if (tor_addr_is_v4(addr)) { /* v4-mapped */ - v_family = AF_INET; - iph4 = ntohl(IN6_ADDRESS32(addr)[3]); - } - } - - if (v_family == AF_INET6) { - iph6[0] = ntohl(IN6_ADDRESS32(addr)[0]); - iph6[1] = ntohl(IN6_ADDRESS32(addr)[1]); - iph6[2] = ntohl(IN6_ADDRESS32(addr)[2]); - iph6[3] = ntohl(IN6_ADDRESS32(addr)[3]); - if (for_listening && !iph6[0] && !iph6[1] && !iph6[2] && !iph6[3]) /* :: */ - return 0; - - if (((iph6[0] & 0xfe000000) == 0xfc000000) || /* fc00/7 - RFC4193 */ - ((iph6[0] & 0xffc00000) == 0xfe800000) || /* fe80/10 - RFC4291 */ - ((iph6[0] & 0xffc00000) == 0xfec00000)) /* fec0/10 D- RFC3879 */ - return 1; - - if (!iph6[0] && !iph6[1] && !iph6[2] && - ((iph6[3] & 0xfffffffe) == 0x00000000)) /* ::/127 */ - return 1; - - return 0; - } else if (v_family == AF_INET) { - if (for_listening && !iph4) /* special case for binding to 0.0.0.0 */ - return 0; - if (((iph4 & 0xff000000) == 0x0a000000) || /* 10/8 */ - ((iph4 & 0xff000000) == 0x00000000) || /* 0/8 */ - ((iph4 & 0xff000000) == 0x7f000000) || /* 127/8 */ - ((iph4 & 0xffff0000) == 0xa9fe0000) || /* 169.254/16 */ - ((iph4 & 0xfff00000) == 0xac100000) || /* 172.16/12 */ - ((iph4 & 0xffff0000) == 0xc0a80000)) /* 192.168/16 */ - return 1; - return 0; - } - - /* unknown address family... assume it's not safe for external use */ - /* rather than tor_assert(0) */ - log_warn(LD_BUG, "tor_addr_is_internal() called with a non-IP address."); - return 1; -} - -#if 0 -/** Convert a tor_addr_t addr into a string, and store it in - * dest of size len. Returns a pointer to dest on success, - * or NULL on failure. - */ -void -tor_addr_to_str(char *dest, const tor_addr_t *addr, int len) -{ - const char *ptr; - tor_assert(addr && dest); - - switch (IN_FAMILY(addr)) { - case AF_INET: - ptr = tor_inet_ntop(AF_INET, &addr->sa.sin_addr, dest, len); - break; - case AF_INET6: - ptr = tor_inet_ntop(AF_INET6, &addr->sa6.sin6_addr, dest, len); - break; - default: - return NULL; - } - return ptr; -} -#endif - -/** Parse a string of the form "host[:port]" from addrport. If - * address is provided, set *address to a copy of the - * host portion of the string. If addr is provided, try to - * resolve the host portion of the string and store it into - * *addr (in host byte order). If port_out is provided, - * store the port number into *port_out, or 0 if no port is given. - * If port_out is NULL, then there must be no port number in - * addrport. - * Return 0 on success, -1 on failure. - */ -int -parse_addr_port(int severity, const char *addrport, char **address, - uint32_t *addr, uint16_t *port_out) -{ - const char *colon; - char *_address = NULL; - int _port; - int ok = 1; - - tor_assert(addrport); - - colon = strchr(addrport, ':'); - if (colon) { - _address = tor_strndup(addrport, colon-addrport); - _port = (int) tor_parse_long(colon+1,10,1,65535,NULL,NULL); - if (!_port) { - log_fn(severity, LD_GENERAL, "Port %s out of range", escaped(colon+1)); - ok = 0; - } - if (!port_out) { - char *esc_addrport = esc_for_log(addrport); - log_fn(severity, LD_GENERAL, - "Port %s given on %s when not required", - escaped(colon+1), esc_addrport); - tor_free(esc_addrport); - ok = 0; - } - } else { - _address = tor_strdup(addrport); - _port = 0; - } - - if (addr) { - /* There's an addr pointer, so we need to resolve the hostname. */ - if (tor_lookup_hostname(_address,addr)) { - log_fn(severity, LD_NET, "Couldn't look up %s", escaped(_address)); - ok = 0; - *addr = 0; - } - } - - if (address && ok) { - *address = _address; - } else { - if (address) - *address = NULL; - tor_free(_address); - } - if (port_out) - *port_out = ok ? ((uint16_t) _port) : 0; - - return ok ? 0 : -1; -} - -/** If mask is an address mask for a bit-prefix, return the number of - * bits. Otherwise, return -1. */ -int -addr_mask_get_bits(uint32_t mask) -{ - int i; - if (mask == 0) - return 0; - if (mask == 0xFFFFFFFFu) - return 32; - for (i=0; i<=32; ++i) { - if (mask == (uint32_t) ~((1u<<(32-i))-1)) { - return i; - } - } - return -1; -} - -/** Compare two addresses a1 and a2 for equality under a - * etmask of mbits bits. Return -1, 0, or 1. - * - * XXXX_IP6 Temporary function to allow masks as bitcounts everywhere. This - * will be replaced with an IPv6-aware version as soon as 32-bit addresses are - * no longer passed around. - */ -int -addr_mask_cmp_bits(uint32_t a1, uint32_t a2, maskbits_t bits) -{ - if (bits > 32) - bits = 32; - else if (bits == 0) - return 0; - - a1 >>= (32-bits); - a2 >>= (32-bits); - - if (a1 < a2) - return -1; - else if (a1 > a2) - return 1; - else - return 0; -} - -/** Parse a string s in the format of (*|port(-maxport)?)?, setting the - * various *out pointers as appropriate. Return 0 on success, -1 on failure. - */ -int -parse_port_range(const char *port, uint16_t *port_min_out, - uint16_t *port_max_out) -{ - int port_min, port_max, ok; - tor_assert(port_min_out); - tor_assert(port_max_out); - - if (!port || *port == '\0' || strcmp(port, "*") == 0) { - port_min = 1; - port_max = 65535; - } else { - char *endptr = NULL; - port_min = (int)tor_parse_long(port, 10, 0, 65535, &ok, &endptr); - if (!ok) { - log_warn(LD_GENERAL, - "Malformed port %s on address range; rejecting.", - escaped(port)); - return -1; - } else if (endptr && *endptr == '-') { - port = endptr+1; - endptr = NULL; - port_max = (int)tor_parse_long(port, 10, 1, 65536, &ok, &endptr); - if (!ok) { - log_warn(LD_GENERAL, - "Malformed port %s on address range; rejecting.", - escaped(port)); - return -1; - } - } else { - port_max = port_min; - } - if (port_min > port_max) { - log_warn(LD_GENERAL, "Insane port range on address policy; rejecting."); - return -1; - } - } - - if (port_min < 1) - port_min = 1; - if (port_max > 65535) - port_max = 65535; - - *port_min_out = (uint16_t) port_min; - *port_max_out = (uint16_t) port_max; - - return 0; -} - -/** Parse a string s in the format of - * (IP(/mask|/mask-bits)?|*)(:(*|port(-maxport))?)?, setting the various - * *out pointers as appropriate. Return 0 on success, -1 on failure. - */ -int -parse_addr_and_port_range(const char *s, uint32_t *addr_out, - maskbits_t *maskbits_out, uint16_t *port_min_out, - uint16_t *port_max_out) -{ - char *address; - char *mask, *port, *endptr; - struct in_addr in; - int bits; - - tor_assert(s); - tor_assert(addr_out); - tor_assert(maskbits_out); - tor_assert(port_min_out); - tor_assert(port_max_out); - - address = tor_strdup(s); - /* Break 'address' into separate strings. - */ - mask = strchr(address,'/'); - port = strchr(mask?mask:address,':'); - if (mask) - *mask++ = '\0'; - if (port) - *port++ = '\0'; - /* Now "address" is the IP|'*' part... - * "mask" is the Mask|Maskbits part... - * and "port" is the *|port|min-max part. - */ - - if (strcmp(address,"*")==0) { - *addr_out = 0; - } else if (tor_inet_aton(address, &in) != 0) { - *addr_out = ntohl(in.s_addr); - } else { - log_warn(LD_GENERAL, "Malformed IP %s in address pattern; rejecting.", - escaped(address)); - goto err; - } - - if (!mask) { - if (strcmp(address,"*")==0) - *maskbits_out = 0; - else - *maskbits_out = 32; - } else { - endptr = NULL; - bits = (int) strtol(mask, &endptr, 10); - if (!*endptr) { - /* strtol handled the whole mask. */ - if (bits < 0 || bits > 32) { - log_warn(LD_GENERAL, - "Bad number of mask bits on address range; rejecting."); - goto err; - } - *maskbits_out = bits; - } else if (tor_inet_aton(mask, &in) != 0) { - bits = addr_mask_get_bits(ntohl(in.s_addr)); - if (bits < 0) { - log_warn(LD_GENERAL, - "Mask %s on address range isn't a prefix; dropping", - escaped(mask)); - goto err; - } - *maskbits_out = bits; - } else { - log_warn(LD_GENERAL, - "Malformed mask %s on address range; rejecting.", - escaped(mask)); - goto err; - } - } - - if (parse_port_range(port, port_min_out, port_max_out)<0) - goto err; - - tor_free(address); - return 0; - err: - tor_free(address); - return -1; -} - -/** Parse a string s containing an IPv4/IPv6 address, and possibly - * a mask and port or port range. Store the parsed address in - * addr_out, a mask (if any) in mask_out, and port(s) (if any) - * in port_min_out and port_max_out. - * - * The syntax is: - * Address OptMask OptPortRange - * Address ::= IPv4Address / "[" IPv6Address "]" / "*" - * OptMask ::= "/" Integer / - * OptPortRange ::= ":*" / ":" Integer / ":" Integer "-" Integer / - * - * - If mask, minport, or maxport are NULL, we do not want these - * options to be set; treat them as an error if present. - * - If the string has no mask, the mask is set to /32 (IPv4) or /128 (IPv6). - * - If the string has one port, it is placed in both min and max port - * variables. - * - If the string has no port(s), port_(min|max)_out are set to 1 and 65535. - * - * Return an address family on success, or -1 if an invalid address string is - * provided. - */ -int -tor_addr_parse_mask_ports(const char *s, tor_addr_t *addr_out, - maskbits_t *maskbits_out, - uint16_t *port_min_out, uint16_t *port_max_out) -{ - char *base = NULL, *address, *mask = NULL, *port = NULL, *rbracket = NULL; - char *endptr; - int any_flag=0, v4map=0; - - tor_assert(s); - tor_assert(addr_out); - - /* IP, [], /mask, ports */ -#define MAX_ADDRESS_LENGTH (TOR_ADDR_BUF_LEN+2+(1+INET_NTOA_BUF_LEN)+12+1) - - if (strlen(s) > MAX_ADDRESS_LENGTH) { - log_warn(LD_GENERAL, "Impossibly long IP %s; rejecting", escaped(s)); - goto err; - } - base = tor_strdup(s); - - /* Break 'base' into separate strings. */ - address = base; - if (*address == '[') { /* Probably IPv6 */ - address++; - rbracket = strchr(address, ']'); - if (!rbracket) { - log_warn(LD_GENERAL, - "No closing IPv6 bracket in address pattern; rejecting."); - goto err; - } - } - mask = strchr((rbracket?rbracket:address),'/'); - port = strchr((mask?mask:(rbracket?rbracket:address)), ':'); - if (port) - *port++ = '\0'; - if (mask) - *mask++ = '\0'; - if (rbracket) - *rbracket = '\0'; - if (port && mask) - tor_assert(port > mask); - if (mask && rbracket) - tor_assert(mask > rbracket); - - /* Now "address" is the a.b.c.d|'*'|abcd::1 part... - * "mask" is the Mask|Maskbits part... - * and "port" is the *|port|min-max part. - */ - - /* Process the address portion */ - memset(addr_out, 0, sizeof(tor_addr_t)); - - if (!strcmp(address, "*")) { - addr_out->family = AF_INET; /* AF_UNSPEC ???? XXXX_IP6 */ - any_flag = 1; - } else if (tor_inet_pton(AF_INET6, address, &addr_out->addr.in6_addr) > 0) { - addr_out->family = AF_INET6; - } else if (tor_inet_pton(AF_INET, address, &addr_out->addr.in_addr) > 0) { - addr_out->family = AF_INET; - } else { - log_warn(LD_GENERAL, "Malformed IP %s in address pattern; rejecting.", - escaped(address)); - goto err; - } - - v4map = tor_addr_is_v4(addr_out); - -/* -#ifdef ALWAYS_V6_MAP - if (v_family == AF_INET) { - v_family = AF_INET6; - IN_ADDR6(addr_out).s6_addr32[3] = IN6_ADDRESS(addr_out).s_addr; - memset(&IN6_ADDRESS(addr_out), 0, 10); - IN_ADDR6(addr_out).s6_addr16[5] = 0xffff; - } -#else - if (v_family == AF_INET6 && v4map) { - v_family = AF_INET; - IN4_ADDRESS((addr_out).s_addr = IN6_ADDRESS(addr_out).s6_addr32[3]; - } -#endif -*/ - - /* Parse mask */ - if (maskbits_out) { - int bits = 0; - struct in_addr v4mask; - - if (mask) { /* the caller (tried to) specify a mask */ - bits = (int) strtol(mask, &endptr, 10); - if (!*endptr) { /* strtol converted everything, so it was an integer */ - if ((bits<0 || bits>128) || - ((IN_FAMILY(addr_out) == AF_INET) && bits > 32)) { - log_warn(LD_GENERAL, - "Bad number of mask bits (%d) on address range; rejecting.", - bits); - goto err; - } - } else { /* mask might still be an address-style mask */ - if (tor_inet_pton(AF_INET, mask, &v4mask) > 0) { - bits = addr_mask_get_bits(ntohl(v4mask.s_addr)); - if (bits < 0) { - log_warn(LD_GENERAL, - "IPv4-style mask %s is not a prefix address; rejecting.", - escaped(mask)); - goto err; - } - } else { /* Not IPv4; we don't do address-style IPv6 masks. */ - log_warn(LD_GENERAL, - "Malformed mask on address range %s; rejecting.", - escaped(s)); - goto err; - } - } - if (IN_FAMILY(addr_out) == AF_INET6 && v4map) { - if (bits > 32 && bits < 96) { /* Crazy */ - log_warn(LD_GENERAL, - "Bad mask bits %i for V4-mapped V6 address; rejecting.", - bits); - goto err; - } - /* XXXX_IP6 is this really what we want? */ - bits = 96 + bits%32; /* map v4-mapped masks onto 96-128 bits */ - } - } else { /* pick an appropriate mask, as none was given */ - if (any_flag) - bits = 0; /* This is okay whether it's V6 or V4 (FIX V4-mapped V6!) */ - else if (IN_FAMILY(addr_out) == AF_INET) - bits = 32; - else if (IN_FAMILY(addr_out) == AF_INET6) - bits = 128; - } - *maskbits_out = (maskbits_t) bits; - } else { - if (mask) { - log_warn(LD_GENERAL, - "Unexpected mask in addrss %s; rejecting", escaped(s)); - goto err; - } - } - - /* Parse port(s) */ - if (port_min_out) { - uint16_t port2; - if (!port_max_out) /* caller specified one port; fake the second one */ - port_max_out = &port2; - - if (parse_port_range(port, port_min_out, port_max_out) < 0) { - goto err; - } else if ((*port_min_out != *port_max_out) && port_max_out == &port2) { - log_warn(LD_GENERAL, - "Wanted one port from address range, but there are two."); - - port_max_out = NULL; /* caller specified one port, so set this back */ - goto err; - } - } else { - if (port) { - log_warn(LD_GENERAL, - "Unexpected ports in addrss %s; rejecting", escaped(s)); - goto err; - } - } - - tor_free(base); - return IN_FAMILY(addr_out); - err: - tor_free(base); - return -1; -} - -/** Determine whether an address is IPv4, either native or ipv4-mapped ipv6. - * Note that this is about representation only, as any decent stack will - * reject ipv4-mapped addresses received on the wire (and won't use them - * on the wire either). - */ -int -tor_addr_is_v4(const tor_addr_t *addr) -{ - tor_assert(addr); - - if (IN_FAMILY(addr) == AF_INET) - return 1; - - if (IN_FAMILY(addr) == AF_INET6) { /* First two don't need to be ordered */ - if ((IN6_ADDRESS32(addr)[0] == 0) && - (IN6_ADDRESS32(addr)[1] == 0) && - (ntohl(IN6_ADDRESS32(addr)[2]) == 0x0000ffffu)) - return 1; - } - - return 0; /* Not IPv4 - unknown family or a full-blood IPv6 address */ -} - -/** Determine whether an address addr is null, either all zeroes or - * belonging to family AF_UNSPEC. - */ -int -tor_addr_is_null(const tor_addr_t *addr) -{ - tor_assert(addr); - - switch (IN_FAMILY(addr)) { - case AF_INET6: - return (!IN6_ADDRESS32(addr)[0] && - !IN6_ADDRESS32(addr)[1] && - !IN6_ADDRESS32(addr)[2] && - !IN6_ADDRESS32(addr)[3]); - case AF_INET: - return (!IN4_ADDRESS(addr)->s_addr); - default: - return 1; - } - //return 1; -} - -/** Given an IPv4 in_addr struct *in (in network order, as usual), - * write it as a string into the buf_len-byte buffer in - * buf. - */ -int -tor_inet_ntoa(const struct in_addr *in, char *buf, size_t buf_len) -{ - uint32_t a = ntohl(in->s_addr); - return tor_snprintf(buf, buf_len, "%d.%d.%d.%d", - (int)(uint8_t)((a>>24)&0xff), - (int)(uint8_t)((a>>16)&0xff), - (int)(uint8_t)((a>>8 )&0xff), - (int)(uint8_t)((a )&0xff)); -} - -/** Take a 32-bit host-order ipv4 address v4addr and store it in the - * tor_addr *dest. - * - * XXXX_IP6 Temporary, for use while 32-bit int addresses are still being - * passed around. - */ -void -tor_addr_from_ipv4(tor_addr_t *dest, uint32_t v4addr) -{ - tor_assert(dest); - memset(dest, 0, sizeof(dest)); - dest->family = AF_INET; - dest->addr.in_addr.s_addr = htonl(v4addr); -} - -/** Copy a tor_addr_t from src to dest. - */ -void -tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src) -{ - tor_assert(src && dest); - memcpy(dest, src, sizeof(tor_addr_t)); -} - -/** Given two addresses addr1 and addr2, return 0 if the two - * addresses are equivalent under the mask mbits, less than 0 if addr1 - * preceeds addr2, and greater than 0 otherwise. - * - * Different address families (IPv4 vs IPv6) are always considered unequal. - */ -int -tor_addr_compare(const tor_addr_t *addr1, const tor_addr_t *addr2) -{ - return tor_addr_compare_masked(addr1, addr2, 128); -} - -/** As tor_addr_compare(), but only looks at the first mask bits of - * the address. - * - * Reduce over-specific masks (>128 for ipv6, >32 for ipv4) to 128 or 32. - */ -int -tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2, - maskbits_t mbits) -{ - uint32_t ip4a=0, ip4b=0; - sa_family_t v_family[2]; - int idx; - uint32_t masked_a, masked_b; - - tor_assert(addr1 && addr2); - - /* XXXX_IP6 this code doesn't handle mask bits right it's using v4-mapped v6 - * addresses. If I ask whether ::ffff:1.2.3.4 and ::ffff:1.2.7.8 are the - * same in the first 16 bits, it will say "yes." That's not so intuitive. - */ - - v_family[0] = IN_FAMILY(addr1); - v_family[1] = IN_FAMILY(addr2); - - if (v_family[0] == AF_INET) { /* If this is native IPv4, note the address */ - ip4a = IPV4IPh(addr1); /* Later we risk overwriting a v4-mapped address */ - } else if ((v_family[0] == AF_INET6) && tor_addr_is_v4(addr1)) { - v_family[0] = AF_INET; - ip4a = IPV4MAPh(addr1); - } - - if (v_family[1] == AF_INET) { /* If this is native IPv4, note the address */ - ip4b = IPV4IPh(addr2); /* Later we risk overwriting a v4-mapped address */ - } else if ((v_family[1] == AF_INET6) && tor_addr_is_v4(addr2)) { - v_family[1] = AF_INET; - ip4b = IPV4MAPh(addr2); - } - - if (v_family[0] > v_family[1]) /* Comparison of virtual families */ - return 1; - else if (v_family[0] < v_family[1]) - return -1; - - if (mbits == 0) /* Under a complete wildcard mask, consider them equal */ - return 0; - - if (v_family[0] == AF_INET) { /* Real or mapped IPv4 */ - if (mbits >= 32) { - masked_a = ip4a; - masked_b = ip4b; - } else if (mbits == 0) { - return 0; - } else { - masked_a = ip4a >> (32-mbits); - masked_b = ip4b >> (32-mbits); - } - if (masked_a < masked_b) - return -1; - else if (masked_a > masked_b) - return 1; - return 0; - } else if (v_family[0] == AF_INET6) { /* Real IPv6 */ - const uint32_t *a1 = IN6_ADDRESS32(addr1); - const uint32_t *a2 = IN6_ADDRESS32(addr2); - for (idx = 0; idx < 4; ++idx) { - uint32_t masked_a = ntohl(a1[idx]); - uint32_t masked_b = ntohl(a2[idx]); - if (!mbits) { - return 0; /* Mask covers both addresses from here on */ - } else if (mbits < 32) { - masked_a >>= (32-mbits); - masked_b >>= (32-mbits); - } - - if (masked_a > masked_b) - return 1; - else if (masked_a < masked_b) - return -1; - - if (mbits < 32) - return 0; - mbits -= 32; - } - return 0; - } - - tor_assert(0); /* Unknown address family */ - return -1; /* unknown address family, return unequal? */ -} - -/** Given a host-order addr, call tor_inet_ntop() on it - * and return a strdup of the resulting address. - */ -char * -tor_dup_addr(uint32_t addr) -{ - char buf[TOR_ADDR_BUF_LEN]; - struct in_addr in; - - in.s_addr = htonl(addr); - tor_inet_ntop(AF_INET, &in, buf, sizeof(buf)); - return tor_strdup(buf); -} - -/** Convert the tor_addr_t *addr into string form and store it in - * dest, which can hold at least len bytes. Returns dest - * on success, NULL on failure. - */ -const char * -tor_addr_to_str(char *dest, const tor_addr_t *addr, int len) -{ - tor_assert(addr && dest); - - if (IN_FAMILY(addr) == AF_INET) { - return tor_inet_ntop(AF_INET, IN4_ADDRESS(addr), dest, len); - } else if (IN_FAMILY(addr) == AF_INET6) { - return tor_inet_ntop(AF_INET6, IN6_ADDRESS(addr), dest, len); - } else { - return NULL; - } -} - -/** Convert the string in src to a tor_addr_t addr. - * - * Return an address family on success, or -1 if an invalid address string is - * provided. */ -int -tor_addr_from_str(tor_addr_t *addr, const char *src) -{ - tor_assert(addr && src); - return tor_addr_parse_mask_ports(src, addr, NULL, NULL, NULL); -} - -/** Set *addr to the IP address (if any) of whatever interface - * connects to the internet. This address should only be used in checking - * whether our address has changed. Return 0 on success, -1 on failure. - */ -int -get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr) -{ - int sock=-1, r=-1; - struct sockaddr_storage my_addr, target_addr; - socklen_t my_addr_len; - - tor_assert(addr); - - memset(addr, 0, sizeof(tor_addr_t)); - memset(&target_addr, 0, sizeof(target_addr)); - my_addr_len = (socklen_t)sizeof(my_addr); - ((struct sockaddr_in*)&target_addr)->sin_port = 9; /* DISGARD port */ - /* Don't worry: no packets are sent. We just need to use a real address - * on the actual internet. */ - if (family == AF_INET6) { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)&target_addr; - sock = tor_open_socket(PF_INET6,SOCK_DGRAM,IPPROTO_UDP); - my_addr_len = (socklen_t)sizeof(struct sockaddr_in6); - sin6->sin6_family = AF_INET6; - S6_ADDR16(sin6->sin6_addr)[0] = htons(0x2002); /* 2002:: */ - } else if (family == AF_INET) { - struct sockaddr_in *sin = (struct sockaddr_in*)&target_addr; - sock = tor_open_socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); - my_addr_len = (socklen_t)sizeof(struct sockaddr_in); - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = htonl(0x12000001); /* 18.0.0.1 */ - } else { - return -1; - } - if (sock < 0) { - int e = tor_socket_errno(-1); - log_fn(severity, LD_NET, "unable to create socket: %s", - tor_socket_strerror(e)); - goto err; - } - - if (connect(sock,(struct sockaddr *)&target_addr, - (socklen_t)sizeof(target_addr))<0) { - int e = tor_socket_errno(sock); - log_fn(severity, LD_NET, "connect() failed: %s", tor_socket_strerror(e)); - goto err; - } - - if (getsockname(sock,(struct sockaddr*)&my_addr, &my_addr_len)) { - int e = tor_socket_errno(sock); - log_fn(severity, LD_NET, "getsockname() to determine interface failed: %s", - tor_socket_strerror(e)); - goto err; - } - - memcpy(addr, &my_addr, sizeof(tor_addr_t)); - r=0; - err: - if (sock >= 0) - tor_close_socket(sock); - return r; -} - -/** - * Set *addr to the host-order IPv4 address (if any) of whatever - * interface connects to the internet. This address should only be used in - * checking whether our address has changed. Return 0 on success, -1 on - * failure. - */ -int -get_interface_address(int severity, uint32_t *addr) -{ - tor_addr_t local_addr; - int r; - - r = get_interface_address6(severity, AF_INET, &local_addr); - if (r>=0) - *addr = IPV4IPh(&local_addr); - return r; -} - -/* ===== * Process helpers * ===== */ @@ -3066,6 +2707,8 @@ if (fork() != 0) { exit(0); } + set_main_thread(); /* We are now the main thread. */ + return; } } @@ -3094,7 +2737,7 @@ exit(1); } - nullfd = open("/dev/null", O_RDWR | O_APPEND); + nullfd = open("/dev/null", O_RDWR); if (nullfd < 0) { log_err(LD_GENERAL,"/dev/null can't be opened. Exiting."); exit(1); diff -Nru tor-0.2.0.34/src/common/util_codedigest.c tor-0.2.2.16-alpha/src/common/util_codedigest.c --- tor-0.2.0.34/src/common/util_codedigest.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/util_codedigest.c 2009-11-17 20:37:03.000000000 +0000 @@ -0,0 +1,11 @@ + +#include "util.h" + +const char * +libor_get_digests(void) +{ + return "" +#include "common_sha1.i" + ; +} + diff -Nru tor-0.2.0.34/src/common/util.h tor-0.2.2.16-alpha/src/common/util.h --- tor-0.2.0.34/src/common/util.h 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/common/util.h 2010-09-17 01:30:36.000000000 +0000 @@ -1,17 +1,15 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: util.h 13664 2008-02-21 21:57:42Z nickm $ */ /** * \file util.h * \brief Headers for util.c **/ -#ifndef __UTIL_H -#define __UTIL_H -#define UTIL_H_ID "$Id: util.h 13664 2008-02-21 21:57:42Z nickm $" +#ifndef _TOR_UTIL_H +#define _TOR_UTIL_H #include "orconfig.h" #include "torint.h" @@ -31,7 +29,7 @@ */ #ifdef NDEBUG /* Nobody should ever want to build with NDEBUG set. 99% of our asserts will - * be outside the critical path anyway, so it's silly to disable bugchecking + * be outside the critical path anyway, so it's silly to disable bug-checking * throughout the entire program just because a few asserts are slowing you * down. Profile, optimize the critical path, and keep debugging on. * @@ -39,24 +37,24 @@ * security-critical properties. */ #error "Sorry; we don't support building with NDEBUG." -#elif defined(__GNUC__) -/* Give an int-valued version of !x that won't confuse PREDICT_UNLIKELY. */ -#define IS_FALSE_AS_INT(x) ((x) == ((typeof(x)) 0)) -#else -#define IS_FALSE_AS_INT(x) !(x) #endif /** Like assert(3), but send assertion failures to the log as well as to * stderr. */ #define tor_assert(expr) STMT_BEGIN \ - if (PREDICT_UNLIKELY(IS_FALSE_AS_INT(expr))) { \ - log(LOG_ERR, LD_BUG, "%s:%d: %s: Assertion %s failed; aborting.", \ + if (PREDICT_UNLIKELY(!(expr))) { \ + log_err(LD_BUG, "%s:%d: %s: Assertion %s failed; aborting.", \ _SHORT_FILE_, __LINE__, __func__, #expr); \ fprintf(stderr,"%s:%d %s: Assertion %s failed; aborting.\n", \ _SHORT_FILE_, __LINE__, __func__, #expr); \ abort(); \ } STMT_END +/* If we're building with dmalloc, we want all of our memory allocation + * functions to take an extra file/line pair of arguments. If not, not. + * We define DMALLOC_PARAMS to the extra parameters to insert in the + * function prototypes, and DMALLOC_ARGS to the extra arguments to add + * to calls. */ #ifdef USE_DMALLOC #define DMALLOC_PARAMS , const char *file, const int line #define DMALLOC_ARGS , _SHORT_FILE_, __LINE__ @@ -91,6 +89,13 @@ } \ STMT_END #else +/** Release memory allocated by tor_malloc, tor_realloc, tor_strdup, etc. + * Unlike the free() function, tor_free() will still work on NULL pointers, + * and it sets the pointer value to NULL after freeing it. + * + * This is a macro. If you need a function pointer to release memory from + * tor_malloc(), use _tor_free(). + */ #define tor_free(p) STMT_BEGIN \ if (PREDICT_LIKELY((p)!=NULL)) { \ free(p); \ @@ -147,8 +152,18 @@ #define bool_neq(a,b) (!(a)!=!(b)) /* Math functions */ +double tor_mathlog(double d) ATTR_CONST; +long tor_lround(double d) ATTR_CONST; int tor_log2(uint64_t u64) ATTR_CONST; uint64_t round_to_power_of_2(uint64_t u64); +unsigned round_to_next_multiple_of(unsigned number, unsigned divisor); +uint32_t round_uint32_to_next_multiple_of(uint32_t number, uint32_t divisor); +uint64_t round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor); + +/* Compute the CEIL of a divided by b, for nonnegative a + * and positive b. Works on integer types only. Not defined if a+b can + * overflow. */ +#define CEIL_DIV(a,b) (((a)+(b)-1)/(b)) /* String manipulation */ @@ -166,11 +181,16 @@ int strcmpend(const char *s1, const char *s2) ATTR_PURE ATTR_NONNULL((1,2)); int strcasecmpend(const char *s1, const char *s2) ATTR_PURE ATTR_NONNULL((1,2)); +int memcmpstart(const void *mem, size_t memlen, + const char *prefix) ATTR_PURE; + void tor_strstrip(char *s, const char *strip) ATTR_NONNULL((1,2)); long tor_parse_long(const char *s, int base, long min, long max, int *ok, char **next); unsigned long tor_parse_ulong(const char *s, int base, unsigned long min, unsigned long max, int *ok, char **next); +double tor_parse_double(const char *s, double min, double max, int *ok, + char **next); uint64_t tor_parse_uint64(const char *s, int base, uint64_t min, uint64_t max, int *ok, char **next); const char *hex_str(const char *from, size_t fromlen) ATTR_NONNULL((1)); @@ -180,19 +200,33 @@ const char *eat_whitespace_eos_no_nl(const char *s, const char *eos) ATTR_PURE; const char *find_whitespace(const char *s) ATTR_PURE; const char *find_whitespace_eos(const char *s, const char *eos) ATTR_PURE; +const char *find_str_at_start_of_line(const char *haystack, const char *needle) + ATTR_PURE; int tor_mem_is_zero(const char *mem, size_t len) ATTR_PURE; int tor_digest_is_zero(const char *digest) ATTR_PURE; +int tor_digest256_is_zero(const char *digest) ATTR_PURE; char *esc_for_log(const char *string) ATTR_MALLOC; const char *escaped(const char *string); struct smartlist_t; void wrap_string(struct smartlist_t *out, const char *string, size_t width, const char *prefix0, const char *prefixRest); +int tor_vsscanf(const char *buf, const char *pattern, va_list ap); +int tor_sscanf(const char *buf, const char *pattern, ...) +#ifdef __GNUC__ + __attribute__((format(scanf, 2, 3))) +#endif + ; +int hex_decode_digit(char c); void base16_encode(char *dest, size_t destlen, const char *src, size_t srclen); int base16_decode(char *dest, size_t destlen, const char *src, size_t srclen); /* Time helpers */ +double tv_to_double(const struct timeval *tv); +int64_t tv_to_msec(const struct timeval *tv); +int64_t tv_to_usec(const struct timeval *tv); long tv_udiff(const struct timeval *start, const struct timeval *end); +long tv_mdiff(const struct timeval *start, const struct timeval *end); time_t tor_timegm(struct tm *tm); #define RFC1123_TIME_LEN 29 void format_rfc1123_time(char *buf, time_t t); @@ -203,6 +237,16 @@ int parse_iso_time(const char *buf, time_t *t); int parse_http_time(const char *buf, struct tm *tm); int format_time_interval(char *out, size_t out_len, long interval); + +/* Cached time */ +#ifdef TIME_IS_FAST +#define approx_time() time(NULL) +#define update_approx_time(t) STMT_NIL +#else +time_t approx_time(void); +void update_approx_time(time_t now); +#endif + /* Fuzzy time. */ void ftime_set_maximum_sloppiness(int seconds); void ftime_set_estimated_skew(int seconds); @@ -213,9 +257,36 @@ int ftime_definitely_after(time_t now, time_t when); int ftime_definitely_before(time_t now, time_t when); +/* Rate-limiter */ + +/** A ratelim_t remembers how often an event is occurring, and how often + * it's allowed to occur. Typical usage is something like: + * +
+    if (possibly_very_frequent_event()) {
+      const int INTERVAL = 300;
+      static ratelim_t warning_limit = RATELIM_INIT(INTERVAL);
+      char *m;
+      if ((m = rate_limit_log(&warning_limit, approx_time()))) {
+        log_warn(LD_GENERAL, "The event occurred!%s", m);
+        tor_free(m);
+      }
+    }
+   
+ */ +typedef struct ratelim_t { + int rate; + time_t last_allowed; + int n_calls_since_last_time; +} ratelim_t; + +#define RATELIM_INIT(r) { (r), 0, 0 } + +char *rate_limit_log(ratelim_t *lim, time_t now); + /* File helpers */ -int write_all(int fd, const char *buf, size_t count, int isSocket); -int read_all(int fd, char *buf, size_t count, int isSocket); +ssize_t write_all(int fd, const char *buf, size_t count, int isSocket); +ssize_t read_all(int fd, char *buf, size_t count, int isSocket); /** Return values from file_status(); see that function's documentation * for details. */ @@ -264,40 +335,12 @@ struct smartlist_t *tor_listdir(const char *dirname); int path_is_relative(const char *filename) ATTR_PURE; -/* Net helpers */ -int is_internal_IP(uint32_t ip, int for_listening) ATTR_PURE; -int parse_addr_port(int severity, const char *addrport, char **address, - uint32_t *addr, uint16_t *port_out); -int parse_port_range(const char *port, uint16_t *port_min_out, - uint16_t *port_max_out); -int parse_addr_and_port_range(const char *s, uint32_t *addr_out, - maskbits_t *maskbits_out, uint16_t *port_min_out, - uint16_t *port_max_out); -int addr_mask_get_bits(uint32_t mask); -int addr_mask_cmp_bits(uint32_t a1, uint32_t a2, maskbits_t bits); -int tor_inet_ntoa(const struct in_addr *in, char *buf, size_t buf_len); -char *tor_dup_addr(uint32_t addr) ATTR_MALLOC; -int get_interface_address(int severity, uint32_t *addr); - -int get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr); -int tor_addr_compare(const tor_addr_t *addr1, const tor_addr_t *addr2); -int tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2, - maskbits_t mask); -int tor_addr_is_v4(const tor_addr_t *addr); -int tor_addr_is_internal(const tor_addr_t *ip, int for_listening) ATTR_PURE; -int tor_addr_parse_mask_ports(const char *s, - tor_addr_t *addr_out, maskbits_t *mask_out, - uint16_t *port_min_out, uint16_t *port_max_out); -const char * tor_addr_to_str(char *dest, const tor_addr_t *addr, int len); -int tor_addr_from_str(tor_addr_t *addr, const char *src); -void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src); -void tor_addr_from_ipv4(tor_addr_t *dest, uint32_t v4addr); -int tor_addr_is_null(const tor_addr_t *addr); - /* Process helpers */ void start_daemon(void); void finish_daemon(const char *desired_cwd); void write_pidfile(char *filename); +const char *libor_get_digests(void); + #endif diff -Nru tor-0.2.0.34/src/config/geoip tor-0.2.2.16-alpha/src/config/geoip --- tor-0.2.0.34/src/config/geoip 2008-06-11 10:08:59.000000000 +0000 +++ tor-0.2.2.16-alpha/src/config/geoip 2010-09-12 02:54:22.000000000 +0000 @@ -1,157 +1,587 @@ -# Last updated based on June 9 2008 ip-to-country db. -# wget http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip -# cut -d, -f0-3 < ip-to-country.csv|sed 's/"//g' > geoip -33996344,33996351,GB -50331648,69956103,US +# Last updated based on September 1 2010 Maxmind GeoLite Country +# wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip +# cut -d, -f3-5 < GeoIPCountryWhois.csv|sed 's/"//g' > geoip +16777216,17301503,AU +17367040,17432575,MY +17435136,17435391,AU +17498112,17563647,KR +17563648,17825791,CN +17825792,18087935,KR +18153472,18219007,JP +18219008,18350079,IN +18350080,18874367,CN +18939904,19005439,JP +19005440,19136511,TW +19136512,19202047,HK +19267584,19398655,IN +19398656,19726335,AU +19726336,19791871,CN +19791872,19922943,TH +19922944,20185087,CN +20185088,20447231,VN +20447232,20971519,CN +20971520,21102591,HK +21102592,21233663,JP +21233664,21495807,CN +21495808,22020095,JP +22020096,23068671,CN +23068672,24117247,KR +24117248,24379391,JP +24379392,24641535,CN +24641536,27262975,AU +27262976,28311551,TW +28311552,28442623,KR +28442624,28573695,AU +28573696,28966911,CN +28966912,29032447,IN +29097984,29884415,CN +29949952,30015487,KR +30015488,30408703,CN +30408704,33554431,KR +33554432,34603007,FR +35651584,36700159,IT +36700160,36962303,AE +36962304,37224447,IL +37748736,38273023,SE +38273024,38797311,KZ +38797312,39059455,PT +39059456,39321599,GR +39321600,39583743,SA +39583744,39845887,RU +39845888,40370175,GB +40370176,40894463,DK +40894464,41418751,IT +41418752,41943039,GB +50331648,68257567,US +68257568,68257599,CA +68257600,68259583,US +68259584,68259599,CA +68259600,68296775,US +68296776,68296783,MX +68296784,68298887,US +68298888,68298895,CA +68298896,68305407,US +68305408,68305919,MX +68305920,68314143,US +68314144,68314151,CA +68314152,68395663,US +68395664,68395671,CA +68395672,68438287,US +68438288,68438303,CA +68438304,68649143,US +68649144,68649151,CA +68649152,69533951,US +69533952,69534207,CA +69534208,69915111,US +69915112,69915119,CA +69915120,69956103,US 69956104,69956111,BM -69956112,83886079,US -94585424,94585439,SE +69956112,72303007,US +72303008,72303039,CA +72303040,72348895,US +72348896,72348927,CA +72348928,72349055,US +72349056,72349119,BM +72349120,83886079,US 100663296,121195295,US 121195296,121195327,IT -121195328,152305663,US +121195328,134693119,US +134693120,134693375,CA +134693376,134730239,US +134730240,134730495,CA +134730496,135192575,US +135192576,135200767,MX +135200768,135603199,US +135603200,135604223,CA +135604224,135606783,US +135606784,135607039,CA +135607040,152305663,US 152305664,152338431,GB 152338432,167772159,US -184549376,201620303,US +184549376,201405503,US +201405504,201405511,PR +201405512,201620303,US 201620304,201620311,CA -201620312,201674095,US +201620312,201636503,US +201636504,201636511,PR +201636512,201674095,US 201674096,201674111,CA -201674112,201859071,US +201674112,201745663,US +201745664,201745671,PR +201745672,201859071,US 201859072,201859087,VI 201859088,201897983,US 201897984,201898239,PR -201898240,202385407,US +201898240,202276999,US +202277000,202277015,PR +202277016,202296847,US +202296848,202296855,PR +202296856,202385407,US 202385408,202385919,PR -202385920,202706431,US +202385920,202517983,US +202517984,202517991,PR +202517992,202621343,US +202621344,202621351,PR +202621352,202621431,US +202621432,202621439,PR +202621440,202621479,US +202621480,202621487,PR +202621488,202621495,US +202621496,202621503,PR +202621504,202621703,US +202621704,202621711,PR +202621712,202625287,US +202625288,202625295,PR +202625296,202696783,US +202696784,202696791,PR +202696792,202706431,US 202706432,202706943,PR -202706944,202934671,US +202706944,202713343,US +202713344,202713351,PR +202713352,202748735,US +202748736,202748743,PR +202748744,202783159,US +202783160,202783167,PR +202783168,202934671,US 202934672,202934687,VI -202934688,202938479,US +202934688,202935551,US +202935552,202935807,PR +202935808,202938479,US 202938480,202938495,VI -202938496,203197063,US +202938496,202960079,US +202960080,202960095,PR +202960096,202998063,US +202998064,202998071,PR +202998072,203197063,US 203197064,203197071,CA -203197072,203658415,US +203197072,203412087,US +203412088,203412095,PR +203412096,203500119,US +203500120,203500127,PR +203500128,203625391,US +203625392,203625399,PR +203625400,203654743,US +203654744,203654751,PR +203654752,203658271,US +203658272,203658287,PR +203658288,203658303,VI +203658304,203658383,PR +203658384,203658399,US +203658400,203658415,PR 203658416,203658423,VI -203658424,203658751,US +203658424,203658479,US +203658480,203658751,PR 203658752,203658831,VI 203658832,203658847,US -203658848,203658879,PR -203658880,203658927,US -203658928,203658943,PR -203658944,203659039,US +203658848,203658911,PR +203658912,203658927,VI +203658928,203658951,PR +203658952,203658967,US +203658968,203658991,VI +203658992,203659007,PR +203659008,203659039,US 203659040,203659095,VI -203659096,203850679,US +203659096,203659103,US +203659104,203659263,PR +203659264,203696487,US +203696488,203696495,PR +203696496,203747823,US +203747824,203747831,PR +203747832,203799607,US +203799608,203799615,PR +203799616,203805087,US +203805088,203805095,PR +203805096,203850679,US 203850680,203850687,CA -203850688,204047327,US -204047328,204047335,VI -204047336,204047463,US -204047464,204047471,VI -204047472,204047487,US -204047488,204047503,PR -204047504,204047535,VI -204047536,204047615,PR -204047616,204048063,US +203850688,204046335,US +204046336,204047103,PR +204047104,204047119,VI +204047120,204047231,PR +204047232,204047247,VI +204047248,204047255,US +204047256,204047263,PR +204047264,204047279,US +204047280,204047303,VI +204047304,204047311,PR +204047312,204047335,VI +204047336,204047359,US +204047360,204047375,PR +204047376,204047391,US +204047392,204047423,PR +204047424,204047431,US +204047432,204047455,VI +204047456,204047463,PR +204047464,204047479,VI +204047480,204047487,PR +204047488,204047535,VI +204047536,204047551,PR +204047552,204047559,VI +204047560,204047567,PR +204047568,204047591,VI +204047592,204047999,PR +204048000,204048007,VI +204048008,204048015,US +204048016,204048031,VI +204048032,204048055,PR +204048056,204048063,US 204048064,204048127,VI -204048128,204152831,US +204048128,204048383,PR +204048384,204089327,US +204089328,204089335,PR +204089336,204126151,US +204126152,204126159,PR +204126160,204152831,US 204152832,204153855,PR -204153856,204781023,US -204781024,204781039,PR -204781040,205500987,US +204153856,204409943,US +204409944,204409951,PR +204409952,204443703,US +204443704,204443711,PR +204443712,204443735,US +204443736,204443743,PR +204443744,204509375,US +204509376,204509383,PR +204509384,205500987,US 205500988,205500991,CA -205500992,210784255,US +205500992,205813063,US +205813064,205813071,PR +205813072,205953311,US +205953312,205953319,PR +205953320,205953327,US +205953328,205953351,PR +205953352,208290127,US +208290128,208290135,PR +208290136,208472175,US +208472176,208472183,PR +208472184,209831679,US +209831680,209831711,DE +209831712,209845143,US +209845144,209845151,DE +209845152,209854735,US +209854736,209854743,SE +209854744,209867103,US +209867104,209867111,CA +209867112,209868799,US +209868800,209869055,IR +209869056,209965359,US +209965360,209965367,PR +209965368,209988527,US +209988528,209988535,VI +209988536,210022479,US +210022480,210022487,PR +210022488,210784255,US 210784256,210784383,BO 210784384,210784767,US 210784768,210786303,BO -210786304,211595575,US +210786304,210970847,US +210970848,210970855,PR +210970856,211051199,US +211051200,211051207,PR +211051208,211126783,US +211126784,211126911,PR +211126912,211129607,US +211129608,211129615,PR +211129616,211313647,US +211313648,211313655,PR +211313656,211363751,US +211363752,211363759,PR +211363760,211368655,US +211368656,211368663,PR +211368664,211403527,US +211403528,211403535,MS +211403536,211410031,US +211410032,211410039,PR +211410040,211410119,US +211410120,211410135,PR +211410136,211536367,US +211536368,211536375,PR +211536376,211595575,US 211595576,211595583,VI 211595584,211595615,US 211595616,211595623,VI 211595624,211595639,PR -211595640,211596815,US -211596816,211596831,VI +211595640,211596823,US +211596824,211596831,VI 211596832,211597055,US 211597056,211597071,VI 211597072,211597375,US -211597376,211597503,VI -211597504,211597719,US -211597720,211597727,VI +211597376,211597439,VI +211597440,211597727,US 211597728,211597743,PR -211597744,211597751,US -211597752,211597775,PR +211597744,211597759,US +211597760,211597775,PR 211597776,211597791,VI 211597792,211598399,US 211598400,211598463,VI -211598464,211598623,US -211598624,211598631,VI -211598632,211598639,US -211598640,211598719,VI -211598720,212122039,US +211598464,211598639,US +211598640,211598655,VI +211598656,211654127,US +211654128,211654135,PR +211654136,211685151,US +211685152,211685159,PR +211685160,211739175,US +211739176,211739183,PR +211739184,211748207,US +211748208,211748223,PR +211748224,211793423,US +211793424,211793431,PR +211793432,211816087,US +211816088,211816095,PR +211816096,211953287,US +211953288,211953295,PR +211953296,212105495,US +212105496,212105503,VI +212105504,212107575,US +212107576,212107583,PR +212107584,212119767,US +212119768,212119775,PR +212119776,212122039,US 212122040,212122047,PR -212122048,212787199,US +212122048,212161487,US +212161488,212161511,VI +212161512,212161559,US +212161560,212161567,VI +212161568,212161575,US +212161576,212161583,VI +212161584,212417791,US +212417792,212417799,PR +212417800,212517199,US +212517200,212517215,VI +212517216,212520815,US +212520816,212520831,VI +212520832,212733527,US +212733528,212733535,PR +212733536,212787199,US 212787200,212788223,PR 212788224,212788479,US 212788480,212788607,VI -212788608,212788863,US -212788864,212788991,PR -212788992,212789055,US +212788608,212788631,US +212788632,212788647,VI +212788648,212788655,PR +212788656,212788663,VI +212788664,212788671,US +212788672,212788799,PR +212788800,212788807,US +212788808,212788815,VI +212788816,212788823,PR +212788824,212788863,US +212788864,212789007,PR +212789008,212789039,US +212789040,212789055,VI 212789056,212789063,PR -212789064,212789071,US -212789072,212789079,VI +212789064,212789079,VI 212789080,212789087,US 212789088,212789095,VI 212789096,212789111,US 212789112,212789119,PR -212789120,212789183,US -212789184,212789191,PR -212789192,212791295,US -212791296,212791423,VI -212791424,212791431,PR -212791432,212791447,VI +212789120,212789127,VI +212789128,212789135,US +212789136,212789143,PR +212789144,212789151,VI +212789152,212789159,PR +212789160,212789167,US +212789168,212789191,PR +212789192,212789199,US +212789200,212789223,VI +212789224,212789231,US +212789232,212789247,VI +212789248,212791295,US +212791296,212791447,VI 212791448,212791455,US -212791456,212791807,PR -212791808,212793199,US +212791456,212791479,VI +212791480,212791807,PR +212791808,212791815,US +212791816,212791839,VI +212791840,212792191,US +212792192,212792199,PR +212792200,212792239,VI +212792240,212792263,PR +212792264,212792271,US +212792272,212792279,VI +212792280,212792287,US +212792288,212792319,PR +212792320,212793103,US +212793104,212793111,VI +212793112,212793119,US +212793120,212793127,VI +212793128,212793135,PR +212793136,212793143,VI +212793144,212793167,US +212793168,212793175,VI +212793176,212793199,US 212793200,212793207,VI 212793208,212793215,PR -212793216,212794783,US +212793216,212793311,US +212793312,212793327,PR +212793328,212793343,US +212793344,212794367,VI +212794368,212794559,PR +212794560,212794575,US +212794576,212794583,VI +212794584,212794599,US +212794600,212794783,PR 212794784,212794791,VI 212794792,212794799,US -212794800,212794815,VI -212794816,213895679,US +212794800,212794831,VI +212794832,212794879,US +212794880,212794887,VI +212794888,212794895,US +212794896,212794911,VI +212794912,212794943,PR +212794944,212794959,US +212794960,212794983,VI +212794984,212794991,US +212794992,212795007,VI +212795008,212795135,PR +212795136,212822199,US +212822200,212822215,PR +212822216,212838527,US +212838528,212838535,PR +212838536,212890775,US +212890776,212890783,PR +212890784,212900583,US +212900584,212900591,PR +212900592,212954927,US +212954928,212954935,PR +212954936,212955087,US +212955088,212955095,PR +212955096,212977063,US +212977064,212977071,PR +212977072,213100183,US +213100184,213100191,PR +213100192,213135351,US +213135352,213135359,PR +213135360,213162607,US +213162608,213162615,PR +213162616,213268431,US +213268432,213268439,PR +213268440,213498031,US +213498032,213498039,PR +213498040,213575847,US +213575848,213575855,PR +213575856,213579471,US +213579472,213579479,PR +213579480,213608911,US +213608912,213608919,PR +213608920,213608927,US +213608928,213608951,PR +213608952,213779847,US +213779848,213779855,PR +213779856,213809159,US +213809160,213809167,PR +213809168,213895679,US 213895680,213895743,VI -213895744,213895775,PR -213895776,213923839,US +213895744,213896799,US +213896800,213896831,VI +213896832,213923839,US 213923840,213924863,PR -213924864,213925631,US +213924864,213925007,US +213925008,213925023,PR +213925024,213925055,VI +213925056,213925631,US 213925632,213925887,PR -213925888,214185983,US +213925888,213936791,US +213936792,213936799,PR +213936800,213936871,US +213936872,213936879,PR +213936880,213936895,US +213936896,213936903,PR +213936904,214184959,US +214184960,214185151,PR +214185152,214185183,VI +214185184,214185199,US +214185200,214185471,PR +214185472,214185983,US 214185984,214187007,PR -214187008,214187519,US -214187520,214187775,VI +214187008,214187775,VI 214187776,214187807,US 214187808,214187815,PR -214187816,214187895,US +214187816,214187823,US +214187824,214187831,PR +214187832,214187887,US +214187888,214187895,PR 214187896,214188031,VI -214188032,214858655,US +214188032,214237247,US +214237248,214237311,PR +214237312,214249471,US +214249472,214253567,VI +214253568,214448335,US +214448336,214448343,PR +214448344,214697983,US +214697984,214698007,VI +214698008,214698015,PR +214698016,214698023,US +214698024,214698031,PR +214698032,214698095,VI +214698096,214698103,PR +214698104,214698135,VI +214698136,214698143,PR +214698144,214698159,VI +214698160,214698167,PR +214698168,214698175,VI +214698176,214698239,PR +214698240,214698271,VI +214698272,214698279,US +214698280,214698319,VI +214698320,214698335,PR +214698336,214698343,US +214698344,214698351,VI +214698352,214698359,US +214698360,214698375,VI +214698376,214698383,US +214698384,214698639,PR +214698640,214698655,VI +214698656,214699231,PR +214699232,214699295,VI +214699296,214699303,US +214699304,214699311,VI +214699312,214699335,PR +214699336,214699367,VI +214699368,214699383,US +214699384,214699455,VI +214699456,214699471,US +214699472,214699487,VI +214699488,214699519,US +214699520,214699647,PR +214699648,214858655,US 214858656,214858671,NL -214858672,234881023,US -251658240,260227071,US -260227072,260231167,GB -260231168,260976639,US -260976640,260980735,GB -260980736,264482815,US -264482816,264486911,DE -264486912,264495103,US -264495104,264503295,CH -264503296,264617983,US -264617984,264667135,DE -264667136,264699903,US -264699904,264716287,CH -264716288,264798207,US -264798208,264802303,GB -264802304,265023487,US -265023488,265027583,GB -265027584,265277439,US -265277440,265289727,GB -265289728,289011535,US +214858672,216417663,US +216417664,216417727,PR +216417728,216627279,US +216627280,216627295,PR +216627296,216637639,US +216637640,216637647,PR +216637648,216820479,US +216820480,216820487,PR +216820488,216835615,US +216835616,216835623,PR +216835624,216881191,US +216881192,216881199,PR +216881200,216996407,US +216996408,216996415,PR +216996416,216996543,US +216996544,216996559,PR +216996560,217027999,US +217028000,217028007,PR +217028008,217046775,US +217046776,217046783,PR +217046784,234881023,US +234882304,234882559,AP +235012096,235077631,AU +235143168,235405311,KR +235405312,235929599,JP +236978176,241172479,KR +241172480,241434623,IN +241434624,241500159,SG +241500160,241565695,JP +241631232,242221055,CN +243269632,243269887,AP +243335168,243400703,KR +243400704,243531775,CN +245366784,247463935,VN +247529472,247595007,JP +247595008,247726079,IN +249561088,251658239,VN +251658240,289011535,US 289011536,289011543,IT 289011544,323243895,US 323243896,323243903,FR @@ -162,82 +592,64 @@ 355993896,368674047,US 368674048,368674303,ES 368674304,385875967,US -386665696,386665727,GB -386666240,386666367,GB -393849728,393849735,GB -402653184,404979711,US +402653184,405012479,US 405012480,405143551,CA -405143552,405147647,US -405151744,405155839,US -405157888,405164031,US -405168128,405180415,US +405143552,405180415,US 405180416,405184511,CA -405184512,405188607,US -405192704,405295103,US -405299200,405331967,US -405340160,405364735,US +405184512,405192703,US +405209088,405405695,US 405405696,405422079,PR -405422080,405438463,US -405471232,405800959,US -405801216,405801471,US -405805056,405811199,US -405813248,405819391,US -405823488,405831679,US -405852160,405856255,US -405861376,405862143,US -405863936,405868543,US -405909504,405911551,US -405913600,405921791,US -405941760,405954559,US -405961216,405962751,US -405967872,405968895,US -405979136,405991423,US -405999616,406003711,US -406011904,406015999,US -406020096,406021119,US -406021632,406021887,US -406026240,406028287,US -406035456,406035967,US -406056960,406061055,US -406090752,406091775,US -406114304,406118399,US -406122496,406126591,US -406134784,406142975,US -406175744,406179839,US -406196224,406198271,US -406215680,406216703,US -406257664,406274047,US -406294528,406298623,US -406310912,406315007,US -406319104,406388735,US +405422080,405798911,US +405831680,405843967,US +405843968,405848063,CA +405848064,405864447,PR +405864448,405917695,US +405921792,405929983,CA +405929984,405938175,US +405946368,405962751,CA +405962752,405970943,US +405979136,405995519,PR +406003712,406011903,US +406011904,406028287,BS +406044672,406052863,US +406061056,406126591,US +406142976,406147071,US +406147072,406151167,CA +406159360,406175743,US +406183936,406188031,CA +406192128,406208511,CA +406216704,406241279,US +406241280,406323199,PR +406323200,406388735,US 406388736,406454271,CA 406454272,406847487,US 406847488,407408639,CA -407408640,407609343,US -407613440,407617535,US -407617792,407618559,US -407625728,407625983,US -407626240,407626495,US -407626752,407627007,US -407627264,407627519,US -407627776,407633919,US +407408640,407633919,US 407633920,408420351,CA -408420352,408498175,US +408420352,408502271,US 408502272,408518655,CA 408518656,408535039,US 408535040,408551423,CA -408551424,409223167,US -409272320,409313279,US +408551424,408719359,US +408719360,408723455,VC +408723456,409337855,US 409337856,409354239,CA -409370624,409419775,US -409468928,409509887,US -409534464,409550847,US -409567232,409595903,US -409600000,409731071,US +409370624,409731071,US 409731072,409862143,CA -409862144,409993215,US -410058752,410124287,US -410124288,410189823,CA +409862144,410124287,US +410124288,410177751,CA +410177752,410177755,US +410177756,410185355,CA +410185356,410185359,US +410185360,410185407,CA +410185408,410185411,US +410185412,410187047,CA +410187048,410187055,US +410187056,410187175,CA +410187176,410187183,US +410187184,410187703,CA +410187704,410187707,US +410187708,410189823,CA 410189824,410648575,US 410648576,410714111,CA 410714112,411164671,US @@ -249,17 +661,15 @@ 411648000,411664383,CA 411664384,411680767,US 411680768,411688959,CA -411697152,411717631,CA -411721728,411725823,CA -411729920,411746303,CA +411697152,411746303,CA 411746304,411762687,PR 411762688,411770879,CA +411770880,411779071,US 411779072,411828223,PR -411828224,411885567,US -411893760,411959295,CA -411983872,411992063,US -412024832,412069887,US -412082176,412221439,US +411828224,411893759,US +411893760,411975679,CA +411975680,411992063,US +412024832,412221439,US 412221440,412229631,CA 412286976,412483583,US 412483584,412549119,CA @@ -267,39 +677,40 @@ 412614656,412647423,CL 412647424,412680191,US 412680192,412688383,CA -412696576,412893183,US +412688384,412704767,US +412704768,412708863,CA +412708864,412909567,US 412909568,412917759,CA 412942336,412946431,US -413007872,413900799,US +413007872,413908991,US 413908992,413925375,PR 413925376,415760383,US 415760384,416022527,CA -416022528,416059391,US -416088064,416161791,US -416169984,416219135,US +416022528,416153599,US +416153600,416161791,BS +416161792,416219135,US 416219136,416251903,CA 416251904,416546815,US -416546816,416571391,CA +416546816,416579583,CA 416612352,416628735,US -416628736,416635439,CA -416635440,416635455,US -416635456,416636927,CA +416628736,416636927,CA 416636928,416641023,US 416645120,416743423,US 416743424,416776191,CA 416776192,417202175,US 417202176,417267711,CA -417267712,417288191,US -417292288,417366015,US +417267712,417365151,US +417365152,417365159,NC +417365160,417366015,US 417366016,417398783,CA -417398784,417427455,US -417431552,417464319,US +417398784,417431551,US 417464320,417529855,CA -417529856,417619967,US -417660928,417775615,US -417775616,417783807,CA +417529856,417538047,PR +417538048,417775615,US +417775616,417796095,CA +417796096,417800191,US 417800192,417808383,BS -417808384,417820671,CA +417808384,417824767,CA 417824768,417857535,US 417857536,417923071,AR 417923072,418062335,US @@ -316,25 +727,229 @@ 418687744,418687998,DM 418687999,418693119,BS 418693120,418709503,CA -418709504,418729983,US -418734080,418738175,US -418742272,418766847,US -418824192,418832383,US -418840576,419430399,US +418709504,418766847,US +418766848,418770943,CA +418775040,419430399,US 419430400,436207615,GB 436207616,452984831,US -469762048,520093695,US -536870912,540679167,US -540679168,540679231,SE -540679232,540680895,US +452984832,452985855,JP +452985856,452986879,MY +452986880,452987903,SG +452987904,452988927,VN +452988928,452997119,JP +452997120,453001215,IN +453001216,453009407,AU +453017600,453050367,JP +453050368,453115903,KR +453115904,453246975,VN +453246976,453509119,IN +453509120,455081983,CN +455081984,455213055,AU +455213056,455245823,NP +455245824,455258111,JP +455258112,455262207,SG +455262208,455270399,JP +455270400,455272447,AU +455274496,455278591,IN +455278592,455344127,KR +455344128,456130559,CN +456130560,456261631,IN +456261632,456262655,PH +456262656,456263679,IN +456263680,456264703,NP +456264704,456265727,JP +456265728,456269823,ID +456269824,456271871,HK +456273920,456286207,AU +456294400,456327167,CN +456327168,456523775,TW +456523776,456540159,SG +456540160,456548351,AU +456548352,456553471,JP +456553472,456554495,MY +456554496,456555519,PK +456555520,456556543,JP +456556544,456560639,AU +456560640,456562687,IN +456564736,456572927,IN +456572928,456589311,CN +456589312,456654847,TH +456654848,457179135,IN +457179136,458227711,VN +458227712,459282431,JP +459282432,459284479,TK +459284480,459292671,JP +459292672,459293695,NZ +459294720,459297791,JP +459297792,459298815,IN +459298816,459299839,PK +459300864,459309055,SG +459309056,459325439,KR +459325440,459333631,AU +459341824,459407359,IN +459407360,459456511,JP +459456512,459460607,HK +459460608,459472895,CN +459472896,459505663,AU +459538432,459539455,AU +459540480,459541503,JP +459541504,459542527,IN +459542528,459544575,HK +459544576,459545599,AU +459546624,459547647,JP +459547648,459548671,CN +459548672,459550719,TH +459550720,459554815,JP +459554816,459571199,TW +459571200,459735039,KR +459735040,459800575,CN +459800576,459866111,SG +459866112,459931647,TW +459931648,459964415,IN +459964416,459980799,CN +459980800,459984895,AU +459984896,459986943,JP +459986944,459988991,PH +459988992,459997183,JP +459997184,460062719,IN +460062720,460128255,PH +460128256,460136447,IN +460144640,460152831,PH +460152832,460154879,JP +460154880,460155903,SG +460155904,460156927,AU +460156928,460158975,KH +460158976,460159999,JP +460160000,460161023,ID +460161024,460193791,MO +460193792,460210175,JP +460210176,460214271,HK +460214272,460218367,MY +460218368,460224511,JP +460224512,460226559,NZ +460226560,460259327,PH +460259328,460261375,AU +460261376,460262399,KH +460262400,460263423,NZ +460263424,460267519,NP +460267520,460275711,ID +460275712,460277759,AU +460277760,460278783,PG +460278784,460279807,JP +460279808,460283903,AU +460283904,460292095,KR +460292096,460300287,JP +460300288,460312575,HK +460312576,460320767,SG +460320768,460324863,AU +460324864,460341247,CN +460341248,460343295,ID +460343296,460344319,AU +460344320,460345343,ID +460345344,460349439,CN +460349440,460351487,AU +460351488,460353535,JP +460353536,460355583,TH +460355584,460356607,IN +460356608,460357631,JP +460357632,460423167,KR +460423168,460439551,CN +460439552,460451839,JP +460451840,460453887,AU +460453888,460454911,JP +460454912,460455935,IN +460455936,460488703,JP +460488704,460505087,MV +460505088,460521471,SG +460521472,460554239,CN +460554240,460587007,KR +460587008,460591103,JP +460591104,460593151,IN +460593152,460595199,JP +460595200,460596223,IN +460596224,460597247,AU +460597248,460598271,JP +460598272,460599295,CN +460599296,460600319,IN +460601344,460602367,AF +460602368,460603391,KH +460603392,460718079,KR +460718080,460722175,JP +460722176,460726271,VN +460726272,460734463,IN +460734464,460849151,KR +461373440,461504511,CN +461504512,461570047,TH +461570048,461572095,ID +461572096,461573119,JP +461573120,461574143,BD +461574144,461578239,JP +461578240,461586431,MY +461586432,461602815,AU +461602816,461619199,TH +461619200,461623295,JP +461623296,461625343,IN +461625344,461626367,AU +461626368,461627391,CN +461627392,461633535,JP +461633536,461635583,ID +461635584,462422015,JP +462422016,462487551,CN +462487552,462553087,TH +462553088,462618623,MY +462618624,462635007,TW +462635008,462651391,JP +462651392,462684159,BD +462684160,463470591,CN +463470592,465043455,KR +465043456,467927039,CN +467927040,468189183,JP +468189184,468713471,KR +468713472,469237759,TW +469237760,469499903,IN +469499904,469565439,NZ +469630976,469696511,TH +469696512,469712895,PK +469712896,469729279,KR +469729280,469762047,IN +469762048,539624567,US +539624568,539624575,IE +539624576,539624703,US +539624704,539624735,GB +539624736,539624743,NL +539624744,539624751,GB +539624752,539624767,NL +539624768,539624775,US +539624776,539624799,GB +539624800,539624831,US +539624832,539624959,IE +539624960,539625087,US +539625088,539625119,GB +539625120,539625135,US +539625136,539625151,NL +539625152,539625391,US +539625392,539625407,GB +539625408,539626495,US +539626496,539626543,GB +539626544,539627391,US +539627392,539627399,JP +539627400,539627407,IE +539627408,539627423,JP +539627424,539627503,US +539627504,539627519,NL +539627520,540680895,US 540680896,540680959,BE 540680960,540683775,US 540683776,540683783,DE 540683784,540685567,US 540685568,540685631,FR -540685632,540686079,US -540686080,540686143,FR -540686144,540687231,US +540685632,540686591,US +540686592,540686599,GB +540686600,540686847,US +540686848,540686863,GB +540686864,540687103,US +540687104,540687111,GB +540687112,540687231,US 540687232,540687359,CA 540687360,540694527,US 540694528,540694591,IT @@ -348,13 +963,55 @@ 540737536,540737791,BZ 540737792,540737919,BR 540737920,540750175,BZ -540750176,540750191,MX -540750192,540803071,BZ -540803072,540819455,US +540750176,540750207,MX +540750208,540750239,BZ +540750240,540750255,MX +540750256,540803071,BZ +540803072,540811791,US +540811792,540811799,JP +540811800,540811871,US +540811872,540811903,GB +540811904,540811935,US +540811936,540811967,DE +540811968,540811983,JP +540811984,540811991,US +540811992,540811999,DE +540812000,540812295,US +540812296,540812303,SG +540812304,540812319,DE +540812320,540812503,US +540812504,540812511,SG +540812512,540812719,US +540812720,540812727,SG +540812728,540812735,US +540812736,540812743,SG +540812744,540812751,NL +540812752,540812767,SG +540812768,540812775,US +540812776,540812783,NL +540812784,540813055,US +540813056,540813063,SG +540813064,540813071,US +540813072,540813103,NL +540813104,540813119,US +540813120,540813183,SG +540813184,540813247,NL +540813248,540813287,US +540813288,540813295,DE +540813296,540813311,US +540813312,540813567,NL +540813568,540813639,DE +540813640,540813671,TW +540813672,540813695,US +540813696,540814015,TW +540814016,540814079,US +540814080,540814271,TW +540814272,540814279,DE +540814280,540819455,US 540819456,540823551,CA 540823552,540826671,US -540826672,540826687,CA -540826688,540827135,US +540826672,540826719,CA +540826720,540827135,US 540827136,540827263,CA 540827264,540827295,US 540827296,540827311,CA @@ -362,30 +1019,732 @@ 540827360,540827375,CA 540827376,540827391,US 540827392,540827423,CA -540827424,540829695,US +540827424,540827471,US +540827472,540827487,CA +540827488,540827519,US +540827520,540827551,CA +540827552,540827583,US +540827584,540827647,CA +540827648,540829695,US 540829696,540829951,CA 540829952,540830511,US 540830512,540830527,CA -540830528,540830623,US +540830528,540830559,US +540830560,540830575,CA +540830576,540830623,US 540830624,540830735,CA 540830736,540830815,US 540830816,540830831,CA -540830832,543690751,US +540830832,540830847,US +540830848,540830895,CA +540830896,543690751,US 543690752,543691007,AR 543691008,543844351,US 543844352,543844607,CH 543844608,603979775,US -637534208,654311423,US +637534208,644067391,US +644067392,644067455,CA +644067456,644835071,US +644835072,644835327,CA +644835328,644839423,US +644839424,644840447,CA +644840448,645225471,US +645225472,645225503,CA +645225504,654311423,US 671088640,687865855,US -721420288,738197503,AU +687865856,689963007,ZA +689963008,691011583,EG +691011584,691666943,ZA +691666944,691732479,NG +691732480,691798015,TZ +691798016,691863551,ZM +691863552,691929087,ZA +691929088,691994623,SN +691994624,692011007,ZM +692043776,692060159,NA +692060160,692191231,EG +692191232,692207615,CI +692207616,692240383,ZA +692240384,692256767,GH +692256768,692273151,SD +692273152,692289535,EG +692289536,692305919,NG +692305920,692322303,CM +692322304,692453375,EG +692453376,692486143,MW +692486144,692518911,AO +692518912,692551679,ZA +692551680,692584447,NG +692584448,692600831,AO +692600832,692609023,EG +692609024,692617215,ZM +692617216,692625407,ZA +692625408,692641791,KE +692641792,692649983,GA +692649984,692658175,NG +692658176,692666367,ZA +692666368,692674559,TZ +692674560,692682751,ML +692682752,692690943,NG +692690944,692707327,TZ +692707328,692715519,NG +692715520,692719615,BJ +692719616,692723711,MG +692723712,692727807,TD +692727808,692731903,BW +692731904,692735999,LY +692736000,692740095,GH +692740096,692744191,ZA +692744192,692748287,TZ +692748288,692752383,CV +692752384,692756479,ZA +692756480,692760575,RW +692760576,692768767,ZA +692768768,692772863,MG +692830208,692834303,NG +692834304,692838399,TZ +692838400,692842495,ZA +692842496,692846591,ZM +692846592,692848639,MZ +692848640,692850687,GM +692850688,692852735,LS +692852736,692854783,GH +692854784,692856831,ZA +692856832,692858879,MU +692858880,692860927,MW +692860928,692862975,ZA +692862976,692869119,NG +692869120,692871167,TZ +692875264,692877311,ZA +692877312,692879359,GA +692879360,692881407,ZA +692881408,692883455,CG +692883456,692885503,MZ +692885504,692887551,NG +692887552,692889599,UG +692889600,692891647,KE +692891648,692893695,ZA +692893696,692895743,KE +692895744,692897791,NG +692897792,692903935,ZA +692969472,692971519,TZ +692973568,692975615,MZ +692975616,692977663,EG +692977664,692978687,TZ +692978688,692979711,ZA +692979712,692981759,NG +692981760,692982783,AO +692982784,692983807,EG +692983808,692984831,KE +692984832,692987903,ZA +692987904,692988927,GH +692989952,692990975,BF +692992000,692993023,MW +692993024,692994047,EG +692994048,692995071,TZ +692995072,692996095,SL +692996096,692997119,SO +692997120,692998143,ZW +692998144,692999167,NG +692999168,693000191,SL +693000192,693001215,NG +693001216,693002239,BW +693002240,693003263,GA +693003264,693004287,NG +693004288,693005311,CD +693005312,693006335,SD +693006336,693007359,ZM +693007360,693008383,NE +693008384,693009407,CF +693009408,693010431,GH +693010432,693011455,ZA +693011456,693012479,SZ +693012480,693013503,TG +693013504,693014527,ZA +693014528,693015551,GH +693015552,693016575,EG +693016576,693017599,GA +693017600,693018623,NG +693018624,693019647,UG +693101568,693102591,KE +693102592,693103615,CD +693103616,693104639,GN +693104640,693105663,ZA +693105664,693106687,MZ +693106688,693107711,TZ +693107712,693239807,KE +693239808,693370879,SN +693370880,693403647,ZA +693501952,693510143,LR +693510144,693518335,SC +693518336,693534719,ZA +693534720,693542911,NG +693542912,693551103,TZ +693551104,693559295,ZA +693559296,693567487,BJ +693567488,693575679,MW +693575680,693583871,KE +693583872,693592063,NG +693592064,693600255,MU +693624832,693633023,ZA +693633024,693698559,EG +693698560,693829631,KE +693829632,693895167,EG +693895168,693927935,MA +693927936,693960703,CM +693960704,693993471,TZ +693993472,694026239,GH +694026240,694091775,MZ +694091776,694157311,SD +694157312,695205887,DZ +695205888,696254463,ZA +696254464,696516607,EG +696516608,696778751,ZA +696778752,696844287,MU +696844288,696909823,MA +696909824,696918015,UG +696918016,696926207,NE +696926208,696928255,ZA +696928256,696930303,BW +696930304,696932351,RW +696932352,696933375,BJ +696933376,696934399,TZ +696934400,696942591,BF +696942592,696950783,MR +696950784,696958975,NG +696958976,696963071,TZ +696963072,696967167,UG +696967168,696971263,MZ +696971264,696975359,KE +696975360,696991743,GH +696991744,697008127,NG +697008128,697040895,KE +697040896,697303039,MA +697303040,697827327,ZA +697827328,697958399,EG +697958400,698023935,ZA +698023936,698056703,NG +698056704,698089471,EG +698089472,698220543,ZA +698220544,698351615,GA +698351616,699400191,ZA +699400192,699465727,EG +699465728,699531263,ZA +699531264,699662335,EG +699662336,699793407,ZA +699793408,699858943,NA +699858944,699924479,ZA +699924480,699990015,NG +699990016,700055551,ZA +700055552,700121087,RW +700121088,700186623,EG +700186624,700203007,MG +700203008,700219391,MR +700219392,700235775,TZ +700235776,700252159,ZA +700252160,700260351,NG +700260352,700268543,CI +700268544,700276735,ZA +700276736,700284927,CI +700284928,700293119,GH +700293120,700301311,EG +700301312,700309503,CD +700309504,700317695,DJ +700317696,700325887,NG +700325888,700334079,ZW +700334080,700335103,BJ +700335104,700336127,GH +700336128,700337151,CG +700338176,700339199,CD +700339200,700340223,NA +700340224,700341247,GH +700341248,700342271,MW +700342272,700350463,NA +700350464,700358655,UG +700358656,700366847,MZ +700366848,700375039,UG +700375040,700376063,CM +700376064,700377087,NE +700377088,700378111,KE +700378112,700379135,MG +700379136,700380159,NG +700380160,700381183,BW +700381184,700382207,EG +700382208,700383231,KE +700383232,700399615,EG +700399616,700400639,AO +700400640,700401663,CI +700401664,700402687,MZ +700402688,700403711,UG +700403712,700404735,EG +700404736,700405759,BJ +700405760,700406783,ZA +700406784,700407807,TZ +700407808,700408831,GH +700408832,700409855,CM +700409856,700410879,LR +700410880,700411903,NG +700411904,700412927,KE +700412928,700413951,ZM +700413952,700414975,SC +700414976,700432383,ZA +700432384,700434431,KE +700434432,700436479,LS +700436480,700438527,UG +700438528,700442623,KE +700442624,700444671,ZW +700444672,700446719,GH +700446720,700447743,SL +700447744,700448767,DZ +700448768,700579839,ZA +700579840,700580863,SC +700580864,700585727,A2 +700585728,700586503,TZ +700586504,700588031,A2 +700588032,700588286,KM +700588287,700589567,A2 +700589568,700589695,TZ +700589696,700592383,A2 +700592384,700592639,KE +700592640,700593151,A2 +700593152,700594175,NG +700594176,700645375,A2 +700645376,700710911,ZA +700710912,700776447,EG +700776448,700841983,RW +700841984,700895231,ZA +700895232,700899327,NG +700899328,700907519,ZA +700907520,700973055,EG +700973056,701104127,DZ +701104128,701112319,GH +701112320,701120511,ZA +701120512,701145087,CI +701145088,701153279,SD +701153280,701161471,CM +701161472,701169663,UG +701169664,701186047,ZA +701186048,701202431,NG +701202432,701210623,NE +701210624,701214719,ZA +701214720,701218815,LS +701218816,701222911,ML +701222912,701227007,KE +701227008,701231103,BF +701231104,701235199,SC +701235200,701243391,SZ +701243392,701251583,GH +701251584,701259775,CM +701259776,701267967,MG +701267968,701276159,TZ +701276160,701284351,KE +701284352,701292543,ZA +701292544,701300735,NG +701300736,701308927,CM +701308928,701317119,AO +701317120,701325311,CM +701325312,701333503,EG +701333504,701341695,NA +701341696,701349887,NG +701349888,701358079,MA +701358080,701366271,SL +701366272,701374463,NG +701374464,701382655,KE +701382656,701390847,CI +701390848,701399039,GA +701399040,701407231,EG +701407232,701415423,CA +701415424,701423615,ZA +701423616,701431807,NG +701431808,701439999,CI +701440000,701448191,MG +701448192,701464575,KE +701464576,701472767,MU +701472768,701480959,TG +701480960,701489151,CI +701489152,701513727,ZA +701513728,701530111,LY +701530112,701546495,SN +701546496,701562879,ZA +701562880,701579263,KE +701579264,701595647,SD +701595648,701612031,DZ +701612032,701628415,EG +701628416,701644799,GH +701644800,701661183,DZ +701661184,701677567,UG +701677568,701693951,AO +701693952,701702143,GH +701702144,701710335,SZ +701710336,701718527,MU +701718528,701726719,CM +701726720,701743103,GA +701743104,701759487,NG +701759488,701792255,KE +701792256,701825023,MU +701825024,701857791,ZA +701857792,701890559,RE +701890560,701923327,SN +701923328,701956095,MA +701956096,701992959,KE +701992960,701997055,SZ +701997056,702001151,GH +702001152,702005247,ZM +702005248,702009343,KE +702009344,702013439,CV +702013440,702015487,KE +702015488,702017535,ZA +702017536,702018559,EG +702018560,702019583,NG +702019584,702020607,RW +702020608,702021631,CD +702021632,702029823,ZM +702029824,702038015,BJ +702038016,702046207,ZM +702046208,702054399,RW +702054400,702058495,ZA +702058496,702062591,BF +702062592,702066687,NG +702066688,702070783,CM +702070784,702074879,ZA +702074880,702076927,BW +702076928,702078975,TZ +702078976,702079999,MA +702080000,702081023,MW +702081024,702082047,NG +702082048,702083071,AO +702087168,702119935,NG +702119936,702128127,CM +702128128,702136319,EG +702136320,702137343,ZA +702137344,702138367,MG +702138368,702139391,TZ +702139392,702140415,NG +702140416,702141439,MZ +702141440,702142463,MU +702142464,702143487,MW +702143488,702144511,KE +702144512,702146559,EG +702146560,702148607,UG +702148608,702150655,ZA +702150656,702152703,ZM +702152704,702169087,SD +702169088,702185471,NA +702185472,702201855,EG +702201856,702218239,GH +702218240,702234623,SN +702234624,702251007,NA +702251008,702283775,NG +702283776,702287871,UG +702287872,702291967,ZW +702291968,702296063,MZ +702296064,702300159,GH +702300160,702304255,NG +702304256,702308351,SL +702308352,702312447,SC +702312448,702316543,KE +702316544,702320639,TZ +702320640,702324735,DZ +702324736,702328831,MZ +702328832,702332927,TZ +702332928,702337023,MZ +702337024,702341119,UG +702341120,702345215,KE +702345216,702349311,TZ +702349312,702353407,ZA +702353408,702357503,DZ +702357504,702365695,TZ +702365696,702369791,MZ +702369792,702373887,UG +702373888,702377983,MW +702377984,702382079,NG +702382080,702386175,EG +702386176,702390271,ZW +702390272,702394367,NG +702394368,702398463,ML +702398464,702402559,CV +702402560,702406655,GH +702406656,702410751,ZA +702410752,702414847,AO +702414848,702416895,UG +702416896,702418943,KE +702418944,702420991,ZM +702420992,702423039,TZ +702423040,702425087,ZA +702425088,702427135,NG +702427136,702429183,ZA +702429184,702431231,TZ +702431232,702435327,NG +702435328,702437375,MZ +702437376,702439423,TZ +702439424,702441471,MU +702441472,702443519,ZA +702443520,702445567,GQ +702445568,702447615,KE +702447616,702449663,EG +702449664,702451711,ZA +702451712,702453759,NG +702453760,702455807,TZ +702455808,702457855,KE +702457856,702459903,EG +702459904,702461951,TZ +702461952,702463999,MW +702464000,702465023,BJ +702465024,702466047,CD +702467072,702468095,SC +702468096,702469119,NG +702469120,702470143,ZA +702470144,702471167,CD +702471168,702474239,ZA +702474240,702475263,GH +702475264,702476287,AO +702476288,702477311,ZM +702477312,702478335,RW +702478336,702481407,AO +702481408,702482431,TZ +702482432,702483455,ZA +702483456,702484479,BW +702484480,702485503,TZ +702485504,702486527,EG +702486528,702487551,NG +702487552,702488575,CM +702488576,702490623,ZA +702490624,702491647,AO +702491648,702492671,LR +702492672,702493695,KE +702493696,702494719,EG +702494720,702495743,KE +702495744,702496767,ZA +702496768,702497791,NG +702497792,702498815,ZA +702498816,702499839,BW +702499840,702500863,MU +702500864,702501887,NA +702501888,702502911,UG +702502912,702503935,SL +702503936,702505983,GA +702505984,702507007,AO +702507008,702508031,CD +702508032,702509055,KE +702509056,702510079,ZA +702510080,702511103,ZM +702511104,702512127,ZA +702512128,702513151,MZ +702513152,702514175,NG +702514176,702515199,SL +702515200,702516223,NG +702516224,702517247,BW +702517248,702518271,NG +702518272,702519295,KE +702519296,702520319,MZ +702520320,702521343,AO +702521344,702522367,SD +702522368,702523391,AO +702523392,702524415,NG +702524416,702525439,ZA +702525440,702526463,DZ +702526464,702527487,TZ +702527488,702528511,CF +702529536,702530559,NG +702530560,702531583,EG +702531584,702532607,SD +702532608,702533631,SC +702533632,702534655,CI +702534656,702535679,GM +702535680,702536703,SC +702536704,702537727,MU +702537728,702538751,RW +702538752,702539775,TZ +702539776,702540799,BF +702540800,702541823,MU +702541824,702542847,EG +702542848,702543871,ZA +702543872,702544895,BJ +702544896,702545919,MU +702545920,703070207,TN +703070208,703594495,EG +703594496,704118783,ZA +704118784,704380927,MA +704380928,704643071,LY +721420288,738197503,JP 738197504,771751935,US +771751936,771817471,RU +771817472,771948543,TR +771948544,772014079,RU +772014080,772079615,DE +773062656,773066751,TR +773066752,773070847,AT +773070848,773074943,DE +773324800,773586943,ES +773586944,773588991,IT +773588992,773591039,PL +773591040,773593087,RU +773593088,773595135,IT +773595136,773597183,DE +773597184,773599231,BE +773599232,773601279,GB +773601280,773603327,LV +773603328,773605375,UA +773605376,773607423,IR +773607424,773609471,DE +773609472,773611519,RU +773611520,773613567,BY +773613568,773615615,CZ +773615616,773617663,DE +773617664,773619711,IT +773619712,773621759,RU +773621760,773623807,PS +773623808,773625855,SE +773625856,773627903,IS +773627904,773629951,TR +773629952,773631999,FR +773632000,773634047,CY +773634048,773636095,DE +773636096,773638143,UA +773638144,773640191,GB +773640192,773642239,ES +773642240,773644287,HU +773644288,773646335,RU +773646336,773648383,TR +773648384,773650431,PL +773650432,773652479,GB +773652480,773654527,SK +773654528,773656575,RU +773656576,773658623,PL +773658624,773660671,DE +773660672,773660935,AT +773660936,773660943,IT +773660944,773662719,AT +773662720,773664767,DE +773664768,773666815,ES +773666816,773668863,GB +773668864,773670911,DE +773670912,773672959,RU +773672960,773675007,SA +773675008,773677055,GB +773677056,773679103,DE +773679104,773679135,IT +773679136,773681151,A2 +773681152,773683199,RU +773683200,773685247,FR +773685248,773687295,UA +773687296,773689343,HU +773689344,773691391,PL +773691392,773695487,RU +773695488,773697535,MK +773697536,773699583,LU +773699584,773701631,CZ +773701632,773703679,RU +773703680,773705727,IT +773705728,773707775,RU +773707776,773709823,NO +773709824,773711871,CZ +773711872,773713919,RU +773713920,773715967,NL +773715968,773716223,EE +773716224,773716479,SE +773716480,773716991,EE +773716992,773718015,US +773718016,773720063,DE +773720064,773722111,GB +773722112,773724159,ES +773724160,773726207,DE +773726208,773730303,RU +773730304,773732351,GB +773732352,773734399,DE +773734400,773736447,CZ +773736448,773740543,DE +773740544,773742591,CZ +773742592,773744639,GB +773744640,773746687,ES +773746688,773748735,DE +773748736,773750783,DK +773750784,773752831,FI +773849088,773857279,IR +773857280,773865471,DK +773865472,773873663,RU +773873664,773881855,JO +773881856,773890047,DK +773890048,773898239,AZ +773898240,773906431,PS +773906432,773922815,GB +773922816,773931007,UA +774373376,774389759,RS +774389760,774406143,BG +774406144,774422527,IT +774422528,774438911,OM +774438912,774455295,DE +774455296,774471679,RU +774471680,774488063,PL +774488064,774504447,RO +774504448,774520831,RU +774520832,774537215,BH +774537216,774553599,RU +774553600,774569983,RO +774569984,774586367,GB +774586368,774602751,PS +774602752,774619135,GB +774619136,774651903,RU +774651904,774668287,SA +774668288,774684671,NL +774897664,774963199,RU +774963200,774995967,GE +774995968,775028735,RO +775028736,775061503,PT +775061504,775094271,RU +775094272,775127039,RO +775127040,775159807,IE +775159808,775192575,SA +775192576,775225343,RU +775225344,775258111,SY +775258112,775290879,BY +775290880,775323647,MT +775946240,776077311,GB +776077312,776208383,NO +776208384,776339455,GB +776339456,776470527,AM +776470528,776601599,RU +776601600,776732671,AT +776732672,776863743,PL +776994816,778043391,DE +778043392,778108927,RU +778108928,778174463,RO +778174464,778239999,UA +778240000,778305535,AL +778305536,778371071,IR +778371072,778436607,RU +778436608,778502143,RO +778502144,778534911,GR +778534912,778567679,CY +778567680,778633215,TR +778698752,778764287,TR +778764288,778829823,HU +778829824,778895359,RO +778895360,778960895,LV +778960896,779026431,DE +779026432,779091967,RU +779091968,779223039,PL +779223040,779354111,DE +779354112,779485183,IL +779485184,779616255,UA +779616256,779747327,IL +779747328,779878399,SI +779878400,780009471,AT +780009472,780140543,CH 788529152,805306367,CA 805306368,822083583,US +838860800,838926335,US +838991872,838999039,US +838999040,838999295,CA +838999296,839010559,US +839010560,839010815,CA +839010816,839188479,US +839385088,839909375,US 855638016,872415231,GB 872415232,889192447,US 889192448,905969663,DE 905969664,956301311,US -956301312,973078527,FR +956301312,973078527,EU 973078528,973209599,JP 973209600,973275135,IN 973275136,973471743,JP @@ -421,7 +1780,6 @@ 978583552,978599935,JP 978599936,978640895,AU 978640896,978644991,NZ -978644992,978649087,AU 978649088,978714623,JP 978714624,978780159,TW 978780160,978784255,AU @@ -431,7 +1789,6 @@ 978812928,979369983,JP 979369984,979435519,AU 979435520,979468287,TH -979468288,979501055,AU 979501056,979566591,JP 979566592,979599359,TW 979599360,979763199,CN @@ -452,7 +1809,7 @@ 982614016,982622207,AU 982622208,982624255,JP 982624256,982626303,ID -982626304,982630399,BD +982628352,982630399,BD 982630400,982646783,SG 982646784,982671359,JP 982671360,982679551,IN @@ -461,7 +1818,7 @@ 982712320,982745087,TH 982745088,982753279,AF 982753280,982755327,JP -982755328,982759423,BD +982755328,982757375,BD 982759424,982761471,ID 982761472,982777855,JP 982777856,983039999,KR @@ -473,8 +1830,7 @@ 984743936,984875007,AU 984875008,984956927,KR 984956928,984965119,AU -984965120,984969215,PK -984969216,984973311,AU +984965120,984973311,PK 984973312,985006079,TH 985006080,985071615,SG 985071616,985137151,JP @@ -492,7 +1848,7 @@ 995540992,995557375,KR 995557376,995622911,JP 995622912,996409343,IN -996409344,996605951,AU +996409344,996573183,AU 996605952,996671487,PK 996671488,996802559,TW 996802560,996868095,JP @@ -504,7 +1860,7 @@ 999555072,999686143,HK 999686144,999751679,KR 999751680,999784447,CN -999784448,999800831,AU +999784448,999800831,AP 999800832,999817215,KR 999817216,999849983,BD 999849984,999866367,KR @@ -525,7 +1881,7 @@ 1002307584,1002373119,JP 1002373120,1002405887,CN 1002405888,1002422271,JP -1002422272,1002434559,AU +1002422272,1002432511,AU 1002434560,1008730111,CN 1008730112,1009778687,JP 1009778688,1010237439,MY @@ -541,20 +1897,24 @@ 1019740160,1021313023,CN 1021313024,1021837311,AU 1021837312,1021968383,CN -1021968384,1021986495,NZ +1021968384,1021981007,NZ +1021981008,1021981023,AU +1021981024,1021985303,NZ +1021985304,1021985311,AU +1021985312,1021986495,NZ 1021986496,1021986559,PA -1021986560,1022033919,NZ +1021986560,1021999743,NZ +1021999744,1021999775,AU +1021999776,1022033919,NZ 1022033920,1022099455,CN 1022099456,1022361599,JP 1022361600,1022558207,AU 1022558208,1022623743,IN 1022623744,1022722047,TW 1022722048,1022754815,CN -1022754816,1022820351,AU 1022820352,1022885887,CN 1022885888,1023148031,TW 1023148032,1023213567,CN -1023213568,1023238143,AU 1023238144,1023246335,ID 1023246336,1023279103,CN 1023279104,1023311871,IN @@ -563,7 +1923,6 @@ 1023344640,1023410175,CN 1023410176,1023672319,IN 1023672320,1023688703,HK -1023688704,1023692799,AU 1023692800,1023696895,CN 1023696896,1023705087,MY 1023705088,1023717375,JP @@ -572,7 +1931,6 @@ 1023737856,1023770623,ID 1023770624,1023778815,PK 1023778816,1023787007,KR -1023787008,1023791103,AU 1023791104,1023795199,NC 1023795200,1023803391,JP 1023803392,1023852543,MY @@ -634,7 +1992,9 @@ 1024335184,1024335199,CN 1024335200,1024335679,US 1024335680,1024335743,IN -1024335744,1024335807,US +1024335744,1024335751,US +1024335752,1024335759,AU +1024335760,1024335807,US 1024335808,1024335871,IN 1024335872,1024338311,US 1024338312,1024338319,PH @@ -647,106 +2007,125 @@ 1024340512,1024340519,TH 1024340520,1024344063,US 1024344064,1024352255,SG -1024352256,1024360479,AU -1024360480,1024360511,HK -1024360512,1024360575,AU -1024360576,1024360607,HK -1024360608,1024360623,AU -1024360624,1024360703,HK -1024360704,1024360719,AU -1024360720,1024360735,HK -1024360736,1024360751,AU -1024360752,1024360831,HK -1024360832,1024360895,AU -1024360896,1024361007,HK -1024361008,1024361023,AU -1024361024,1024361087,HK -1024361088,1024361103,AU -1024361104,1024361119,HK -1024361120,1024361151,AU -1024361152,1024361263,HK -1024361264,1024361279,AU -1024361280,1024361311,HK -1024361312,1024361343,AU -1024361344,1024361423,HK -1024361424,1024361431,AU -1024361432,1024361439,HK -1024361440,1024361471,AU +1024352256,1024360447,AU +1024360448,1024360535,HK +1024360536,1024360543,AP +1024360544,1024361007,HK +1024361008,1024361023,AP +1024361024,1024361095,HK +1024361096,1024361103,AP +1024361104,1024361471,HK 1024361472,1024361487,TW -1024361488,1024361503,AU -1024361504,1024361535,PH -1024361536,1024361727,AU -1024361728,1024361743,TW -1024361744,1024361759,AU +1024361488,1024361503,AP +1024361504,1024361567,PH +1024361568,1024361599,AP +1024361600,1024361727,PH +1024361728,1024361759,TW 1024361760,1024361775,PH -1024361776,1024361791,AU -1024361792,1024361799,PH -1024361800,1024361823,AU -1024361824,1024361839,PH -1024361840,1024361855,AU -1024361856,1024361983,TW -1024361984,1024362495,AU -1024362496,1024362575,MY -1024362576,1024362591,SG -1024362592,1024362671,AU -1024362672,1024362687,SG -1024362688,1024362703,AU +1024361776,1024361791,TW +1024361792,1024361807,PH +1024361808,1024362239,TW +1024362240,1024362287,MY +1024362288,1024362303,SG +1024362304,1024362335,MY +1024362336,1024362351,AP +1024362352,1024362399,SG +1024362400,1024362495,AP +1024362496,1024362599,MY +1024362600,1024362671,SG +1024362672,1024362687,MY +1024362688,1024362703,AP 1024362704,1024362719,MY -1024362720,1024362783,AU -1024362784,1024362815,SG -1024362816,1024362831,AU -1024362832,1024362880,SG -1024362881,1024362911,AU -1024362912,1024362975,SG -1024362976,1024363007,AU +1024362720,1024362735,SG +1024362736,1024362751,AP +1024362752,1024362759,SG +1024362760,1024362783,MY +1024362784,1024362976,SG +1024362977,1024363007,AP 1024363008,1024363015,SG -1024363016,1024363023,AU -1024363024,1024363055,SG -1024363056,1024363327,AU -1024363328,1024363391,SG -1024363392,1024363999,AU +1024363016,1024363023,AP +1024363024,1024363103,SG +1024363104,1024363111,MY +1024363112,1024363199,SG +1024363200,1024363215,MY +1024363216,1024363295,SG +1024363296,1024363319,MY +1024363320,1024363391,SG +1024363392,1024363423,MY +1024363424,1024363439,SG +1024363440,1024363447,MY +1024363448,1024363455,AP +1024363456,1024363519,SG +1024363520,1024363559,AU +1024363560,1024363567,AP +1024363568,1024363775,AU +1024363776,1024363807,AP +1024363808,1024363999,AU 1024364000,1024364015,NZ -1024364016,1024365567,AU +1024364016,1024364031,AU +1024364032,1024364063,AP +1024364064,1024364079,AU +1024364080,1024364095,AP +1024364096,1024364127,AU +1024364128,1024364287,AP +1024364288,1024364511,AU +1024364512,1024364799,AP +1024364800,1024364927,MY +1024364928,1024365567,AP 1024365568,1024365823,HK 1024365824,1024366335,PH -1024366336,1024367359,AU +1024366336,1024367359,AP 1024367360,1024367615,TW 1024367616,1024368127,JP 1024368128,1024368383,PH -1024368384,1024368639,AU +1024368384,1024368639,AP 1024368640,1024369407,MY -1024369408,1024369663,AU +1024369408,1024369663,AP 1024369664,1024369919,PH 1024369920,1024370175,TW -1024370176,1024370687,AU +1024370176,1024370431,AU +1024370432,1024370687,AP 1024370688,1024371455,PH 1024371456,1024371711,JP -1024371712,1024371967,AU +1024371712,1024371967,AP 1024371968,1024372223,JP 1024372224,1024372479,PH 1024372480,1024372735,HK -1024372736,1024373247,AU +1024372736,1024373247,AP 1024373248,1024373503,PH -1024373504,1024373823,AU +1024373504,1024373823,AP 1024373824,1024373887,TW 1024373888,1024374015,PH -1024374016,1024374847,AU -1024374848,1024374911,JP -1024374912,1024374935,AU -1024374936,1024375055,JP -1024375056,1024375167,AU +1024374016,1024374847,AP +1024374848,1024374879,JP +1024374880,1024374895,AP +1024374896,1024374911,JP +1024374912,1024374935,AP +1024374936,1024374951,JP +1024374952,1024374975,AP +1024374976,1024375055,JP +1024375056,1024375167,AP 1024375168,1024375295,JP -1024375296,1024375807,AU +1024375296,1024375303,AP +1024375304,1024375311,AU +1024375312,1024375375,AP +1024375376,1024375383,AU +1024375384,1024375391,AP +1024375392,1024375423,AU +1024375424,1024375439,AP +1024375440,1024375455,AU +1024375456,1024375487,AP +1024375488,1024375495,AU +1024375496,1024375679,AP +1024375680,1024375807,AU 1024375808,1024375935,TW -1024375936,1024376063,AU -1024376064,1024376127,TW -1024376128,1024376191,AU +1024375936,1024376191,AP 1024376192,1024376319,PH 1024376320,1024376447,TW -1024376448,1024376479,AU +1024376448,1024376479,AP 1024376480,1024376511,PH 1024376512,1024376703,TW -1024376704,1024376831,AU +1024376704,1024376831,AP 1024376832,1024393215,PH 1024393216,1024458751,HK 1024458752,1024491519,SG @@ -757,7 +2136,15 @@ 1024786432,1025245183,JP 1025245184,1025277951,CN 1025277952,1025294335,PH -1025294336,1025302527,AU +1025294336,1025294591,JP +1025294592,1025295103,AU +1025295104,1025295615,CN +1025295616,1025296127,AU +1025296128,1025296639,FR +1025296640,1025296895,MY +1025296896,1025297919,AU +1025297920,1025298175,NZ +1025298176,1025302527,AU 1025302528,1025310719,VN 1025310720,1025343487,AU 1025343488,1025376255,CN @@ -767,7 +2154,8 @@ 1026392064,1026408447,CN 1026408448,1026416639,JP 1026416640,1026420735,ID -1026420736,1026424831,AU +1026420736,1026422783,JP +1026422784,1026424831,AP 1026424832,1026490367,JP 1026490368,1026523135,TH 1026523136,1026539519,CN @@ -789,11 +2177,7 @@ 1029668864,1029701631,IN 1029701632,1030750207,KR 1030750208,1031798783,JP -1031798784,1033982787,CN -1033982788,1033982788,FR -1033982789,1034001207,CN -1034001208,1034001215,FR -1034001216,1035993087,CN +1031798784,1035993087,CN 1035993088,1037565951,JP 1037565952,1037591499,TW 1037591500,1037591503,CN @@ -803,21 +2187,23 @@ 1039138816,1039400959,CN 1039400960,1039466495,HK 1039466496,1039499263,JP -1039499264,1039515647,AU +1039499264,1039507455,AP +1039507456,1039511551,LK 1039515648,1039523839,JP 1039523840,1039532031,KR 1039532032,1039597567,IN 1039597568,1039613951,ID 1039613952,1039638527,KR 1039638528,1039642623,TW -1039642624,1039646719,AU 1039646720,1039654911,KR 1039654912,1039663103,IN 1039663104,1040187391,KR 1040187392,1040252927,IL 1040252928,1040318463,GR 1040318464,1040383999,CH -1040384000,1040392191,SA +1040384000,1040386559,SA +1040386560,1040391167,A2 +1040391168,1040392191,SA 1040392192,1040392447,GB 1040392448,1040399359,SA 1040399360,1040400127,GB @@ -830,61 +2216,64 @@ 1040449792,1040450047,DE 1040450048,1040457727,FR 1040457728,1040465919,ME -1040465920,1040466943,DE -1040466944,1040466959,CA -1040466960,1040467071,DE +1040465920,1040466687,DE +1040466688,1040466975,EU +1040466976,1040467007,DE +1040467008,1040467071,EU 1040467072,1040467087,FR 1040467088,1040467103,DE 1040467104,1040467135,FR -1040467136,1040467583,DE +1040467136,1040467151,DE +1040467152,1040467583,EU 1040467584,1040467647,FR -1040467648,1040467711,DE -1040467712,1040467743,FR -1040467744,1040467759,DE +1040467648,1040467759,EU 1040467760,1040467823,FR -1040467824,1040467935,DE +1040467824,1040467935,EU 1040467936,1040467951,FR -1040467952,1040467967,DE +1040467952,1040467967,EU 1040467968,1040468223,FR -1040468224,1040468231,DE +1040468224,1040468231,EU 1040468232,1040468255,FR -1040468256,1040468263,DE +1040468256,1040468263,EU 1040468264,1040468287,FR -1040468288,1040468415,DE +1040468288,1040468415,EU 1040468416,1040468479,FR -1040468480,1040468735,DE +1040468480,1040468607,EU +1040468608,1040468735,DE 1040468736,1040468767,NL -1040468768,1040468799,DE -1040468800,1040468847,NL -1040468848,1040468863,DE +1040468768,1040468799,EU +1040468800,1040468831,NL +1040468832,1040468863,EU 1040468864,1040468991,NL -1040468992,1040469055,DE +1040468992,1040469055,EU 1040469056,1040469071,FR -1040469072,1040469087,DE +1040469072,1040469087,EU 1040469088,1040469183,FR -1040469184,1040469215,DE +1040469184,1040469215,EU 1040469216,1040469279,FR -1040469280,1040469311,DE +1040469280,1040469311,EU 1040469312,1040469343,FR -1040469344,1040469375,DE +1040469344,1040469375,EU 1040469376,1040469567,FR -1040469568,1040469631,DE +1040469568,1040469631,EU 1040469632,1040469887,FR -1040469888,1040469903,DE +1040469888,1040469903,EU 1040469904,1040469919,FR -1040469920,1040469967,DE +1040469920,1040469967,EU 1040469968,1040469999,FR -1040470000,1040470783,DE +1040470000,1040470271,EU +1040470272,1040470335,DE +1040470336,1040470399,EU +1040470400,1040470431,DE +1040470432,1040470783,EU 1040470784,1040471295,NL -1040471296,1040471487,DE +1040471296,1040471487,EU 1040471488,1040471711,NL -1040471712,1040471743,DE +1040471712,1040471743,EU 1040471744,1040471775,NL -1040471776,1040472991,DE -1040472992,1040473343,NL -1040473344,1040473535,DE -1040473536,1040473599,NL -1040473600,1040473855,DE +1040471776,1040472991,EU +1040472992,1040473087,NL +1040473088,1040473855,EU 1040473856,1040474111,NL 1040474112,1040482303,CZ 1040482304,1040515071,BE @@ -893,45 +2282,29 @@ 1040580608,1040711679,GB 1040711680,1040719871,FR 1040719872,1040728063,DE +1040728064,1040736255,KE 1040736256,1040744447,GB 1040744448,1040777215,DE 1040777216,1040842751,IE -1040842752,1040843007,DE -1040843008,1040973823,IT +1040842752,1040973823,IT 1040973824,1040982015,NL -1040982016,1040982303,DK -1040982304,1040982335,NG -1040982336,1040982351,ZW -1040982352,1040982399,DK -1040982400,1040982407,CH -1040982408,1040982447,DK -1040982448,1040982463,SA -1040982464,1040982487,DK -1040982488,1040982495,IQ -1040982496,1040982527,DK -1040982528,1040982615,IQ -1040982616,1040982783,DK -1040982784,1040982815,NG -1040982816,1040983295,DK -1040983296,1040983487,IQ -1040983488,1040983551,DK -1040983552,1040983567,NG -1040983568,1040983575,AE -1040983576,1040983807,DK -1040983808,1040984063,IQ -1040984064,1040984071,NG -1040984072,1040984079,GH -1040984080,1040984095,GA -1040984096,1040984103,DK -1040984104,1040984159,NG -1040984160,1040984167,UG -1040984168,1040984175,DK +1040982016,1040982279,A2 +1040982280,1040982287,NG +1040982288,1040982583,A2 +1040982584,1040982607,DK +1040982608,1040982631,A2 +1040982632,1040982639,DE +1040982640,1040983807,A2 +1040983808,1040983815,NG +1040983816,1040984143,A2 +1040984144,1040984151,NG +1040984152,1040984175,A2 1040984176,1040984183,NG -1040984184,1040984191,SD -1040984192,1040990207,DK +1040984184,1040990207,A2 1040990208,1040994303,CY 1040994304,1040994815,RU 1040994816,1040998399,CY +1040998400,1041006591,EG 1041006592,1041039359,CH 1041039360,1041051647,SE 1041051648,1041051839,NO @@ -943,251 +2316,11 @@ 1041088512,1041096703,AT 1041096704,1041235967,ES 1041235968,1041244159,UA -1041244160,1041252351,RU -1041252352,1041252863,TJ -1041252864,1041253119,RU +1041244160,1041253119,RU 1041253120,1041253375,TJ 1041253376,1041268735,RU 1041268736,1041301503,NO -1041301504,1041301599,IE -1041301600,1041301615,GB -1041301616,1041301887,IE -1041301888,1041301919,GB -1041301920,1041302015,IE -1041302016,1041302271,GB -1041302272,1041302303,IE -1041302304,1041302319,GB -1041302320,1041305887,IE -1041305888,1041305903,GB -1041305904,1041305919,IE -1041305920,1041305983,GB -1041305984,1041306031,IE -1041306032,1041306063,GB -1041306064,1041306399,IE -1041306400,1041306495,GB -1041306496,1041306511,IE -1041306512,1041306527,GB -1041306528,1041306607,IE -1041306608,1041306671,GB -1041306672,1041306751,IE -1041306752,1041306815,GB -1041306816,1041307503,IE -1041307504,1041307519,GB -1041307520,1041307551,IE -1041307552,1041307583,GB -1041307584,1041308031,IE -1041308032,1041308063,GB -1041308064,1041308287,IE -1041308288,1041308303,GB -1041308304,1041308335,IE -1041308336,1041308343,GB -1041308344,1041308415,IE -1041308416,1041308671,GB -1041308672,1041310063,IE -1041310064,1041310079,GB -1041310080,1041310511,IE -1041310512,1041310527,GB -1041310528,1041334271,IE -1041334272,1041334527,GB -1041334528,1041334783,IE -1041334784,1041335039,GB -1041335040,1041335295,IE -1041335296,1041335327,GB -1041335328,1041335343,IE -1041335344,1041335391,GB -1041335392,1041335519,IE -1041335520,1041335535,GB -1041335536,1041335551,IE -1041335552,1041335807,GB -1041335808,1041335839,IE -1041335840,1041335871,GB -1041335872,1041335887,IE -1041335888,1041335895,GB -1041335896,1041335935,IE -1041335936,1041335967,GB -1041335968,1041336015,IE -1041336016,1041336031,GB -1041336032,1041336063,IE -1041336064,1041336127,GB -1041336128,1041336207,IE -1041336208,1041336223,GB -1041336224,1041336303,IE -1041336304,1041336319,GB -1041336320,1041337471,IE -1041337472,1041337487,GB -1041337488,1041337663,IE -1041337664,1041337695,GB -1041337696,1041337727,IE -1041337728,1041337791,GB -1041337792,1041337855,IE -1041337856,1041337887,GB -1041337888,1041337919,IE -1041337920,1041337935,GB -1041337936,1041337999,IE -1041338000,1041338015,GB -1041338016,1041338031,IE -1041338032,1041338111,GB -1041338112,1041338751,IE -1041338752,1041338815,GB -1041338816,1041338831,IE -1041338832,1041338847,GB -1041338848,1041338879,IE -1041338880,1041338895,GB -1041338896,1041338943,IE -1041338944,1041339007,GB -1041339008,1041339087,IE -1041339088,1041339119,GB -1041339120,1041339263,IE -1041339264,1041339327,GB -1041339328,1041339359,IE -1041339360,1041339391,GB -1041339392,1041339423,IE -1041339424,1041339439,GB -1041339440,1041339519,IE -1041339520,1041339535,GB -1041339536,1041339679,IE -1041339680,1041339711,GB -1041339712,1041339935,IE -1041339936,1041339967,GB -1041339968,1041339983,IE -1041339984,1041339999,GB -1041340000,1041340063,IE -1041340064,1041340079,GB -1041340080,1041340111,IE -1041340112,1041340127,GB -1041340128,1041340191,IE -1041340192,1041340223,GB -1041340224,1041340255,IE -1041340256,1041340271,GB -1041340272,1041340319,IE -1041340320,1041340335,GB -1041340336,1041340367,IE -1041340368,1041340383,GB -1041340384,1041340447,IE -1041340448,1041340463,GB -1041340464,1041340559,IE -1041340560,1041340607,GB -1041340608,1041340639,IE -1041340640,1041340671,GB -1041340672,1041340735,IE -1041340736,1041340751,GB -1041340752,1041340799,IE -1041340800,1041340863,GB -1041340864,1041340991,IE -1041340992,1041341007,GB -1041341008,1041341151,IE -1041341152,1041341183,GB -1041341184,1041341231,IE -1041341232,1041341247,GB -1041341248,1041341279,IE -1041341280,1041341343,GB -1041341344,1041341807,IE -1041341808,1041341823,GB -1041341824,1041341855,IE -1041341856,1041341887,GB -1041341888,1041341919,IE -1041341920,1041341935,GB -1041341936,1041342063,IE -1041342064,1041342079,GB -1041342080,1041342207,IE -1041342208,1041342223,GB -1041342224,1041342239,IE -1041342240,1041342255,GB -1041342256,1041342271,IE -1041342272,1041342287,GB -1041342288,1041342383,IE -1041342384,1041342415,GB -1041342416,1041342431,IE -1041342432,1041342463,GB -1041342464,1041342479,IE -1041342480,1041342511,GB -1041342512,1041342543,IE -1041342544,1041342575,GB -1041342576,1041342591,IE -1041342592,1041342607,GB -1041342608,1041342975,IE -1041342976,1041343023,GB -1041343024,1041343039,IE -1041343040,1041343167,GB -1041343168,1041343231,IE -1041343232,1041343743,GB -1041343744,1041344111,IE -1041344112,1041344159,GB -1041344160,1041344191,IE -1041344192,1041344207,GB -1041344208,1041344255,IE -1041344256,1041344511,GB -1041344512,1041344543,IE -1041344544,1041344575,GB -1041344576,1041344607,IE -1041344608,1041344639,GB -1041344640,1041344687,IE -1041344688,1041344719,GB -1041344720,1041344799,IE -1041344800,1041344847,GB -1041344848,1041344895,IE -1041344896,1041344927,GB -1041344928,1041345551,IE -1041345552,1041345583,GB -1041345584,1041345599,IE -1041345600,1041345631,GB -1041345632,1041345647,IE -1041345648,1041345663,GB -1041345664,1041345759,IE -1041345760,1041345767,GB -1041345768,1041345775,IE -1041345776,1041345791,GB -1041345792,1041346047,IE -1041346048,1041346079,GB -1041346080,1041346095,IE -1041346096,1041346119,GB -1041346120,1041346135,IE -1041346136,1041346143,GB -1041346144,1041346151,IE -1041346152,1041346159,GB -1041346160,1041346207,IE -1041346208,1041346215,GB -1041346216,1041346255,IE -1041346256,1041346263,GB -1041346264,1041347071,IE -1041347072,1041347391,GB -1041347392,1041358047,IE -1041358048,1041358079,GB -1041358080,1041362959,IE -1041362960,1041362975,GB -1041362976,1041363007,IE -1041363008,1041363023,GB -1041363024,1041363167,IE -1041363168,1041363455,GB -1041363456,1041363711,IE -1041363712,1041363751,GB -1041363752,1041363759,IE -1041363760,1041363775,GB -1041363776,1041363839,IE -1041363840,1041363871,GB -1041363872,1041364495,IE -1041364496,1041364575,GB -1041364576,1041364607,IE -1041364608,1041364735,GB -1041364736,1041365039,IE -1041365040,1041365055,GB -1041365056,1041365087,IE -1041365088,1041365103,GB -1041365104,1041365151,IE -1041365152,1041365167,GB -1041365168,1041365199,IE -1041365200,1041365247,GB -1041365248,1041365503,IE -1041365504,1041365743,GB -1041365744,1041366031,IE -1041366032,1041366079,GB -1041366080,1041366119,IE -1041366120,1041366127,GB -1041366128,1041366143,IE -1041366144,1041366207,GB -1041366208,1041366271,IE -1041366272,1041366527,GB -1041366528,1041367039,IE +1041301504,1041367039,IE 1041367040,1041498111,GB 1041498112,1041563647,SE 1041563648,1041596415,PL @@ -1195,269 +2328,194 @@ 1041629184,1041633103,ES 1041633104,1041633119,GB 1041633120,1041694719,ES -1041694720,1041694895,FR -1041694896,1041694911,GB -1041694912,1041694919,FR -1041694920,1041694975,GB -1041694976,1041695455,FR -1041695456,1041695487,GB -1041695488,1041695551,FR -1041695552,1041695567,GB -1041695568,1041695615,FR -1041695616,1041695703,GB -1041695704,1041695711,FR -1041695712,1041695743,GB -1041695744,1041695759,FR -1041695760,1041696023,GB -1041696024,1041696415,FR -1041696416,1041696431,GB -1041696432,1041697151,FR -1041697152,1041697159,GB -1041697160,1041697183,FR -1041697184,1041697199,GB -1041697200,1041697391,FR -1041697392,1041697407,GB -1041697408,1041697699,FR +1041694720,1041695151,FR +1041695152,1041695167,GB +1041695168,1041695647,FR +1041695648,1041695679,GB +1041695680,1041695695,CH +1041695696,1041695711,FR +1041695712,1041695719,GB +1041695720,1041695767,FR +1041695768,1041695775,GB +1041695776,1041695855,FR +1041695856,1041695887,GB +1041695888,1041695903,FR +1041695904,1041695999,GB +1041696000,1041696871,FR +1041696872,1041696879,GB +1041696880,1041697699,FR 1041697700,1041697703,GB -1041697704,1041697815,FR -1041697816,1041697823,GB -1041697824,1041697855,FR -1041697856,1041697863,GB -1041697864,1041697895,FR -1041697896,1041697903,GB -1041697904,1041697919,FR +1041697704,1041697919,FR 1041697920,1041697983,GB -1041697984,1041698127,FR -1041698128,1041698143,GB -1041698144,1041698247,FR +1041697984,1041698047,FR +1041698048,1041698077,GB +1041698078,1041698135,FR +1041698136,1041698143,GB +1041698144,1041698207,FR +1041698208,1041698223,GB +1041698224,1041698247,FR 1041698248,1041698255,GB 1041698256,1041698263,FR 1041698264,1041698271,GB -1041698272,1041698287,FR -1041698288,1041698303,GB -1041698304,1041698591,FR -1041698592,1041698607,GB -1041698608,1041698647,FR -1041698648,1041698663,GB -1041698664,1041698807,FR +1041698272,1041698711,FR +1041698712,1041698719,GB +1041698720,1041698807,FR 1041698808,1041698815,GB -1041698816,1041699263,FR -1041699264,1041699271,GB -1041699272,1041699287,FR +1041698816,1041699287,FR 1041699288,1041699295,GB -1041699296,1041699767,FR -1041699768,1041699775,GB -1041699776,1041700863,FR -1041700864,1041700895,GB -1041700896,1041700983,FR +1041699296,1041699583,FR +1041699584,1041699591,IT +1041699592,1041699599,FR +1041699600,1041699615,GB +1041699616,1041699623,FR +1041699624,1041699631,GB +1041699632,1041699679,FR +1041699680,1041699695,GB +1041699696,1041699767,FR +1041699768,1041699807,GB +1041699808,1041700539,FR +1041700540,1041700607,GB +1041700608,1041700983,FR 1041700984,1041700991,GB -1041700992,1041701119,FR -1041701120,1041701151,GB -1041701152,1041701175,FR -1041701176,1041701231,GB -1041701232,1041701239,FR -1041701240,1041701631,GB -1041701632,1041701639,FR -1041701640,1041701647,GB -1041701648,1041701831,FR -1041701832,1041701839,GB -1041701840,1041701863,FR -1041701864,1041701871,GB -1041701872,1041701887,FR -1041701888,1041701919,GB -1041701920,1041701935,FR -1041701936,1041701959,GB -1041701960,1041702111,FR -1041702112,1041702143,GB -1041702144,1041702183,FR -1041702184,1041702191,GB -1041702192,1041702303,FR +1041700992,1041701175,FR +1041701176,1041701183,GB +1041701184,1041701207,FR +1041701208,1041701222,GB +1041701223,1041701311,FR +1041701312,1041701551,GB +1041701552,1041701567,FR +1041701568,1041701631,GB +1041701632,1041702303,FR 1041702304,1041702311,GB -1041702312,1041702319,FR -1041702320,1041702335,GB +1041702312,1041702327,FR +1041702328,1041702335,GB 1041702336,1041702351,FR -1041702352,1041703143,GB -1041703144,1041703147,FR -1041703148,1041703167,GB -1041703168,1041703487,FR -1041703488,1041703503,GB -1041703504,1041703559,FR -1041703560,1041703583,GB -1041703584,1041703631,FR -1041703632,1041703639,GB -1041703640,1041703679,FR -1041703680,1041703695,GB -1041703696,1041703711,FR -1041703712,1041703807,GB -1041703808,1041703951,FR -1041703952,1041703967,GB -1041703968,1041703991,FR -1041703992,1041703999,GB -1041704000,1041704015,FR -1041704016,1041704039,GB -1041704040,1041704111,FR -1041704112,1041704143,GB -1041704144,1041704159,FR +1041702352,1041702399,GB +1041702400,1041702855,FR +1041702856,1041702863,GB +1041702864,1041703575,FR +1041703576,1041703583,GB +1041703584,1041704119,FR +1041704120,1041704127,GB +1041704128,1041704159,FR 1041704160,1041704175,GB -1041704176,1041704255,FR -1041704256,1041704271,GB -1041704272,1041704319,FR -1041704320,1041704335,GB -1041704336,1041704399,FR -1041704400,1041704431,GB -1041704432,1041704447,FR -1041704448,1041704455,GB -1041704456,1041704463,FR -1041704464,1041704487,GB -1041704488,1041704503,FR -1041704504,1041704559,GB -1041704560,1041704607,FR -1041704608,1041704623,GB -1041704624,1041704647,FR -1041704648,1041704655,GB -1041704656,1041704671,FR +1041704176,1041704319,FR +1041704320,1041704383,GB +1041704384,1041704407,FR +1041704408,1041704431,GB +1041704432,1041704439,FR +1041704440,1041704455,GB +1041704456,1041704479,FR +1041704480,1041704487,GB +1041704488,1041704551,FR +1041704552,1041704575,GB +1041704576,1041704671,FR 1041704672,1041704687,GB -1041704688,1041704703,FR -1041704704,1041704711,GB -1041704712,1041704743,FR -1041704744,1041704759,GB +1041704688,1041704751,FR +1041704752,1041704759,GB 1041704760,1041704775,FR 1041704776,1041704783,GB -1041704784,1041704807,FR -1041704808,1041704863,GB +1041704784,1041704815,FR +1041704816,1041704823,GB +1041704824,1041704847,FR +1041704848,1041704863,GB 1041704864,1041704879,FR 1041704880,1041704887,GB -1041704888,1041704911,FR -1041704912,1041704943,GB -1041704944,1041705247,FR -1041705248,1041705279,GB -1041705280,1041705303,FR -1041705304,1041705311,GB +1041704888,1041705231,FR +1041705232,1041705239,GB +1041705240,1041705255,FR +1041705256,1041705279,GB +1041705280,1041705295,FR +1041705296,1041705311,GB 1041705312,1041705343,FR 1041705344,1041705367,GB 1041705368,1041705391,FR 1041705392,1041705439,GB 1041705440,1041705447,FR -1041705448,1041705463,GB -1041705464,1041705471,FR -1041705472,1041705487,GB -1041705488,1041705511,FR -1041705512,1041705519,GB -1041705520,1041705527,FR -1041705528,1041705535,GB -1041705536,1041705599,FR -1041705600,1041705663,GB -1041705664,1041705727,FR -1041705728,1041705815,GB -1041705816,1041705871,FR -1041705872,1041705903,GB -1041705904,1041705911,FR -1041705912,1041705919,GB -1041705920,1041705935,FR -1041705936,1041705983,GB -1041705984,1041705999,FR -1041706000,1041706007,GB -1041706008,1041706047,FR -1041706048,1041706079,GB -1041706080,1041706087,FR +1041705448,1041705455,GB +1041705456,1041705471,FR +1041705472,1041705479,GB +1041705480,1041705487,FR +1041705488,1041705519,GB +1041705520,1041705631,FR +1041705632,1041705663,GB +1041705664,1041705695,FR +1041705696,1041705703,GB +1041705704,1041705743,FR +1041705744,1041705751,GB +1041705752,1041705767,FR +1041705768,1041705815,GB +1041705816,1041705831,FR +1041705832,1041705855,GB +1041705856,1041705871,FR +1041705872,1041705879,GB +1041705880,1041705887,FR +1041705888,1041705895,GB +1041705896,1041705903,FR +1041705904,1041705911,GB +1041705912,1041705935,FR +1041705936,1041705951,GB +1041705952,1041706087,FR 1041706088,1041706095,GB 1041706096,1041706111,FR 1041706112,1041706143,GB -1041706144,1041706207,FR -1041706208,1041706223,GB -1041706224,1041706239,FR -1041706240,1041706287,GB -1041706288,1041706319,FR -1041706320,1041706343,GB -1041706344,1041706359,FR +1041706144,1041706191,FR +1041706192,1041706239,GB +1041706240,1041706271,FR +1041706272,1041706287,GB +1041706288,1041706359,FR 1041706360,1041706367,GB -1041706368,1041706383,FR -1041706384,1041706399,GB -1041706400,1041706447,FR +1041706368,1041706447,FR 1041706448,1041706463,GB -1041706464,1041706471,FR -1041706472,1041706487,GB -1041706488,1041706495,FR -1041706496,1041706511,GB -1041706512,1041706535,FR -1041706536,1041706543,GB -1041706544,1041706559,FR -1041706560,1041706575,GB -1041706576,1041706583,FR -1041706584,1041706591,GB -1041706592,1041706623,FR -1041706624,1041706631,GB -1041706632,1041706767,FR -1041706768,1041706799,GB -1041706800,1041706815,FR -1041706816,1041706847,GB -1041706848,1041706871,FR -1041706872,1041706879,GB -1041706880,1041706951,FR +1041706464,1041706479,FR +1041706480,1041706487,GB +1041706488,1041706791,FR +1041706792,1041706799,GB +1041706800,1041706951,FR 1041706952,1041706975,GB -1041706976,1041706983,FR -1041706984,1041706991,GB -1041706992,1041706999,FR +1041706976,1041706999,FR 1041707000,1041707007,GB -1041707008,1041707271,FR -1041707272,1041707279,GB -1041707280,1041707311,FR -1041707312,1041707319,GB -1041707320,1041707359,FR -1041707360,1041707367,GB -1041707368,1041707391,FR -1041707392,1041707415,GB -1041707416,1041707439,FR -1041707440,1041707463,GB +1041707008,1041707303,FR +1041707304,1041707319,GB +1041707320,1041707407,FR +1041707408,1041707415,GB +1041707416,1041707455,FR +1041707456,1041707463,GB 1041707464,1041707487,FR 1041707488,1041707495,GB -1041707496,1041707575,FR -1041707576,1041707583,GB -1041707584,1041707615,FR -1041707616,1041707631,GB -1041707632,1041707647,FR -1041707648,1041707655,GB -1041707656,1041707687,FR -1041707688,1041707695,GB -1041707696,1041707711,FR -1041707712,1041707743,GB -1041707744,1041707831,FR -1041707832,1041707839,GB -1041707840,1041707871,FR -1041707872,1041707887,GB -1041707888,1041707895,FR +1041707496,1041707503,FR +1041707504,1041707519,GB +1041707520,1041707559,FR +1041707560,1041707583,GB +1041707584,1041707631,FR +1041707632,1041707639,GB +1041707640,1041707679,FR +1041707680,1041707687,GB +1041707688,1041707895,FR 1041707896,1041707903,GB 1041707904,1041707999,FR 1041708000,1041708007,GB -1041708008,1041708295,FR -1041708296,1041708303,GB -1041708304,1041708311,FR -1041708312,1041708319,GB -1041708320,1041708327,FR -1041708328,1041708351,GB -1041708352,1041708367,FR -1041708368,1041708383,GB +1041708008,1041708023,FR +1041708024,1041708031,GB +1041708032,1041708327,FR +1041708328,1041708335,GB +1041708336,1041708375,FR +1041708376,1041708383,GB 1041708384,1041708415,FR 1041708416,1041708431,GB -1041708432,1041708479,FR -1041708480,1041708487,GB +1041708432,1041708447,FR +1041708448,1041708487,GB 1041708488,1041708495,FR 1041708496,1041708511,GB -1041708512,1041708551,FR -1041708552,1041708559,GB -1041708560,1041708607,FR -1041708608,1041708615,GB -1041708616,1041708671,FR -1041708672,1041708687,GB -1041708688,1041708703,FR -1041708704,1041708735,GB -1041708736,1041708799,FR -1041708800,1041708815,GB -1041708816,1041708831,FR -1041708832,1041708839,GB -1041708840,1041708847,FR +1041708512,1041708687,FR +1041708688,1041708695,GB +1041708696,1041708807,FR +1041708808,1041708815,GB +1041708816,1041708847,FR 1041708848,1041708855,GB -1041708856,1041708903,FR +1041708856,1041708879,FR +1041708880,1041708895,GB +1041708896,1041708903,FR 1041708904,1041708911,GB 1041708912,1041708927,FR 1041708928,1041708943,GB @@ -1466,407 +2524,333 @@ 1041709000,1041709023,FR 1041709024,1041709055,GB 1041709056,1041709343,FR -1041709344,1041709359,GB -1041709360,1041709367,FR -1041709368,1041709375,GB +1041709344,1041709375,GB 1041709376,1041709463,FR 1041709464,1041709471,GB -1041709472,1041709767,FR +1041709472,1041709479,FR +1041709480,1041709487,GB +1041709488,1041709767,FR 1041709768,1041709775,GB -1041709776,1041709823,FR -1041709824,1041709831,GB -1041709832,1041709919,FR +1041709776,1041709783,FR +1041709784,1041709791,GB +1041709792,1041709903,FR +1041709904,1041709911,GB +1041709912,1041709919,FR 1041709920,1041709927,GB 1041709928,1041709935,FR 1041709936,1041709943,GB -1041709944,1041709951,FR -1041709952,1041709983,GB -1041709984,1041709991,FR +1041709944,1041709991,FR 1041709992,1041709999,GB 1041710000,1041710007,FR 1041710008,1041710015,GB 1041710016,1041710047,FR 1041710048,1041710055,GB -1041710056,1041710063,FR -1041710064,1041710079,GB -1041710080,1041710335,FR -1041710336,1041710359,GB -1041710360,1041710367,FR -1041710368,1041710383,GB -1041710384,1041710391,FR +1041710056,1041710351,FR +1041710352,1041710359,GB +1041710360,1041710391,FR 1041710392,1041710407,GB -1041710408,1041710423,FR -1041710424,1041710431,GB -1041710432,1041710439,FR -1041710440,1041710447,GB -1041710448,1041710479,FR -1041710480,1041710487,GB -1041710488,1041710503,FR -1041710504,1041710511,GB +1041710408,1041710439,FR +1041710440,1041710455,GB +1041710456,1041710471,FR +1041710472,1041710487,GB +1041710488,1041710495,FR +1041710496,1041710511,GB 1041710512,1041710535,FR 1041710536,1041710543,GB 1041710544,1041710559,FR -1041710560,1041710567,GB -1041710568,1041710599,FR -1041710600,1041710623,GB -1041710624,1041710663,FR -1041710664,1041710671,GB -1041710672,1041710687,FR -1041710688,1041710695,GB -1041710696,1041710703,FR -1041710704,1041710711,GB -1041710712,1041710735,FR +1041710560,1041710583,GB +1041710584,1041710719,FR +1041710720,1041710727,GB +1041710728,1041710735,FR 1041710736,1041710743,GB 1041710744,1041710775,FR -1041710776,1041710791,GB -1041710792,1041710807,FR -1041710808,1041710815,GB -1041710816,1041711367,FR -1041711368,1041711375,GB -1041711376,1041711423,FR -1041711424,1041711439,GB +1041710776,1041710783,GB +1041710784,1041711431,FR +1041711432,1041711439,GB 1041711440,1041711455,FR -1041711456,1041711463,GB -1041711464,1041711471,FR -1041711472,1041711519,GB -1041711520,1041711535,FR -1041711536,1041711567,GB -1041711568,1041711871,FR -1041711872,1041711903,GB -1041711904,1041711911,FR -1041711912,1041711927,GB -1041711928,1041711935,FR -1041711936,1041711951,GB -1041711952,1041711967,FR -1041711968,1041711983,GB -1041711984,1041712063,FR -1041712064,1041712095,GB -1041712096,1041712447,FR -1041712448,1041712463,GB -1041712464,1041712511,FR -1041712512,1041712527,GB -1041712528,1041712623,FR -1041712624,1041712631,GB -1041712632,1041712927,FR -1041712928,1041712943,GB -1041712944,1041712991,FR -1041712992,1041712999,GB -1041713000,1041713007,FR -1041713008,1041713015,GB -1041713016,1041713023,FR -1041713024,1041713031,GB -1041713032,1041713055,FR -1041713056,1041713063,GB -1041713064,1041713079,FR -1041713080,1041713087,GB -1041713088,1041713143,FR -1041713144,1041713151,GB -1041713152,1041713663,FR -1041713664,1041713695,GB -1041713696,1041713791,FR -1041713792,1041713799,GB -1041713800,1041713823,FR -1041713824,1041713831,GB -1041713832,1041713839,FR -1041713840,1041713855,GB -1041713856,1041713871,FR -1041713872,1041713887,GB -1041713888,1041713991,FR -1041713992,1041713999,GB -1041714000,1041714055,FR -1041714056,1041714063,GB -1041714064,1041714095,FR +1041711456,1041711519,GB +1041711520,1041711551,FR +1041711552,1041711567,GB +1041711568,1041711583,FR +1041711584,1041711599,GB +1041711600,1041711943,FR +1041711944,1041711951,GB +1041711952,1041712399,FR +1041712400,1041712415,GB +1041712416,1041712423,FR +1041712424,1041712431,GB +1041712432,1041713095,FR +1041713096,1041713103,GB +1041713104,1041713127,FR +1041713128,1041713135,GB +1041713136,1041713975,FR +1041713976,1041713983,GB +1041713984,1041713991,FR +1041713992,1041714007,GB +1041714008,1041714047,FR +1041714048,1041714055,GB +1041714056,1041714071,FR +1041714072,1041714079,GB +1041714080,1041714095,FR 1041714096,1041714103,GB -1041714104,1041714431,FR -1041714432,1041714439,GB -1041714440,1041714447,FR -1041714448,1041714455,GB -1041714456,1041714487,FR -1041714488,1041714495,GB -1041714496,1041714519,FR -1041714520,1041714527,GB -1041714528,1041714543,FR -1041714544,1041714551,GB -1041714552,1041714559,FR -1041714560,1041714591,GB -1041714592,1041714607,FR -1041714608,1041714615,GB -1041714616,1041714623,FR -1041714624,1041714687,GB -1041714688,1041714711,FR -1041714712,1041714727,GB -1041714728,1041714767,FR -1041714768,1041714783,GB -1041714784,1041714815,FR -1041714816,1041714879,GB +1041714104,1041714111,FR +1041714112,1041714175,GB +1041714176,1041714523,FR +1041714524,1041714527,GB +1041714528,1041714775,FR +1041714776,1041714783,GB +1041714784,1041714831,FR +1041714832,1041714847,GB +1041714848,1041714855,FR +1041714856,1041714879,GB 1041714880,1041714911,FR 1041714912,1041714919,GB -1041714920,1041714943,FR -1041714944,1041715039,GB -1041715040,1041715055,FR +1041714920,1041714997,FR +1041714998,1041715007,GB +1041715008,1041715055,FR 1041715056,1041715071,GB 1041715072,1041715079,FR 1041715080,1041715087,GB -1041715088,1041715103,FR -1041715104,1041715111,GB -1041715112,1041715119,FR +1041715088,1041715095,FR +1041715096,1041715103,GB +1041715104,1041715119,FR 1041715120,1041715143,GB 1041715144,1041715151,FR 1041715152,1041715167,GB 1041715168,1041715183,FR 1041715184,1041715199,GB -1041715200,1041715503,FR -1041715504,1041715535,GB -1041715536,1041715551,FR -1041715552,1041715567,GB -1041715568,1041715599,FR -1041715600,1041715615,GB +1041715200,1041715527,FR +1041715528,1041715535,GB +1041715536,1041715583,FR +1041715584,1041715615,GB 1041715616,1041715631,FR 1041715632,1041715647,GB -1041715648,1041715711,FR -1041715712,1041715727,GB -1041715728,1041715743,FR -1041715744,1041715775,GB -1041715776,1041715791,FR -1041715792,1041715823,GB +1041715648,1041715767,FR +1041715768,1041715791,GB +1041715792,1041715807,FR +1041715808,1041715823,GB 1041715824,1041715863,FR -1041715864,1041715911,GB +1041715864,1041715870,GB +1041715871,1041715903,FR +1041715904,1041715911,GB 1041715912,1041715943,FR 1041715944,1041715951,GB -1041715952,1041715967,FR -1041715968,1041716015,GB -1041716016,1041716039,FR -1041716040,1041716063,GB +1041715952,1041715999,FR +1041716000,1041716015,GB +1041716016,1041716047,FR +1041716048,1041716063,GB 1041716064,1041716111,FR 1041716112,1041716223,GB -1041716224,1041716239,FR -1041716240,1041716287,GB -1041716288,1041716303,FR -1041716304,1041716319,GB -1041716320,1041716335,FR -1041716336,1041716343,GB -1041716344,1041716383,FR -1041716384,1041716399,GB -1041716400,1041716407,FR -1041716408,1041716415,GB -1041716416,1041716487,FR -1041716488,1041716527,GB +1041716224,1041716311,FR +1041716312,1041716319,GB +1041716320,1041716439,FR +1041716440,1041716447,GB +1041716448,1041716503,FR +1041716504,1041716511,GB +1041716512,1041716519,FR +1041716520,1041716527,GB 1041716528,1041716559,FR -1041716560,1041716599,GB -1041716600,1041716671,FR +1041716560,1041716575,GB +1041716576,1041716671,FR 1041716672,1041716703,GB -1041716704,1041716991,FR -1041716992,1041717007,GB -1041717008,1041717055,FR -1041717056,1041717103,GB +1041716704,1041717071,FR +1041717072,1041717079,GB +1041717080,1041717087,FR +1041717088,1041717103,GB 1041717104,1041717111,FR 1041717112,1041717119,GB 1041717120,1041717167,FR 1041717168,1041717183,GB 1041717184,1041717199,FR 1041717200,1041717247,GB -1041717248,1041717519,FR -1041717520,1041717527,GB -1041717528,1041717559,FR -1041717560,1041717567,GB -1041717568,1041718023,FR -1041718024,1041718031,GB -1041718032,1041718055,FR -1041718056,1041718063,GB -1041718064,1041718079,FR -1041718080,1041718095,GB -1041718096,1041718103,FR -1041718104,1041718111,GB -1041718112,1041718143,FR -1041718144,1041718159,GB +1041717248,1041717687,FR +1041717688,1041717695,GB +1041717696,1041718112,FR +1041718113,1041718119,GB +1041718120,1041718127,FR +1041718128,1041718135,GB +1041718136,1041718151,FR +1041718152,1041718159,GB 1041718160,1041718191,FR 1041718192,1041718215,GB 1041718216,1041718231,FR 1041718232,1041718255,GB -1041718256,1041718271,FR -1041718272,1041718311,GB -1041718312,1041718319,FR -1041718320,1041718327,GB -1041718328,1041718335,FR -1041718336,1041718351,GB -1041718352,1041718407,FR -1041718408,1041718455,GB +1041718256,1041718343,FR +1041718344,1041718351,GB +1041718352,1041718447,FR +1041718448,1041718455,GB 1041718456,1041718463,FR 1041718464,1041718479,GB 1041718480,1041718495,FR 1041718496,1041718503,GB -1041718504,1041718591,FR -1041718592,1041718607,GB +1041718504,1041718599,FR +1041718600,1041718607,GB 1041718608,1041718623,FR 1041718624,1041718639,GB 1041718640,1041718663,FR 1041718664,1041718671,GB -1041718672,1041718687,FR -1041718688,1041718703,GB -1041718704,1041718783,FR -1041718784,1041718799,GB -1041718800,1041718815,FR -1041718816,1041718831,GB -1041718832,1041718879,FR -1041718880,1041718911,GB -1041718912,1041718935,FR +1041718672,1041718935,FR 1041718936,1041718943,GB -1041718944,1041718999,FR +1041718944,1041718975,FR +1041718976,1041718991,GB +1041718992,1041718999,FR 1041719000,1041719007,GB -1041719008,1041719203,FR +1041719008,1041719167,FR +1041719168,1041719175,GB +1041719176,1041719203,FR 1041719204,1041719207,GB -1041719208,1041719224,FR +1041719208,1041719215,FR +1041719216,1041719223,GB +1041719224,1041719224,FR 1041719225,1041719227,GB 1041719228,1041719228,FR 1041719229,1041719231,GB -1041719232,1041719272,FR -1041719273,1041719279,GB -1041719280,1041719375,FR -1041719376,1041719407,GB -1041719408,1041719439,FR -1041719440,1041719487,GB -1041719488,1041719551,FR -1041719552,1041719631,GB -1041719632,1041719647,FR -1041719648,1041719663,GB -1041719664,1041719679,FR -1041719680,1041719711,GB +1041719232,1041719247,FR +1041719248,1041719263,GB +1041719264,1041719683,FR +1041719684,1041719687,GB +1041719688,1041719703,FR +1041719704,1041719711,GB 1041719712,1041719743,FR 1041719744,1041719759,GB -1041719760,1041719775,FR -1041719776,1041719855,GB -1041719856,1041719879,FR -1041719880,1041719903,GB +1041719760,1041719887,FR +1041719888,1041719903,GB 1041719904,1041719919,FR 1041719920,1041719935,GB -1041719936,1041719951,FR -1041719952,1041719967,GB -1041719968,1041720015,FR +1041719936,1041720015,FR 1041720016,1041720031,GB -1041720032,1041720079,FR -1041720080,1041720087,GB -1041720088,1041720351,FR -1041720352,1041720367,GB -1041720368,1041720519,FR -1041720520,1041720527,GB -1041720528,1041720535,FR -1041720536,1041720543,GB -1041720544,1041720551,FR +1041720032,1041720551,FR 1041720552,1041720559,GB 1041720560,1041720567,FR 1041720568,1041720607,GB -1041720608,1041720615,FR -1041720616,1041720639,GB +1041720608,1041720631,FR +1041720632,1041720639,GB 1041720640,1041720687,FR 1041720688,1041720703,GB -1041720704,1041720719,FR -1041720720,1041720735,GB -1041720736,1041720751,FR -1041720752,1041720767,GB -1041720768,1041720831,FR -1041720832,1041720847,GB -1041720848,1041720895,FR -1041720896,1041720927,GB -1041720928,1041720959,FR -1041720960,1041721087,GB -1041721088,1041721727,FR -1041721728,1041721791,GB -1041721792,1041721807,FR -1041721808,1041721855,GB -1041721856,1041722119,FR -1041722120,1041722127,GB -1041722128,1041722135,FR -1041722136,1041722175,GB -1041722176,1041722183,FR -1041722184,1041722191,GB +1041720704,1041721039,FR +1041721040,1041721055,GB +1041721056,1041721391,FR +1041721392,1041721407,GB +1041721408,1041721519,FR +1041721520,1041721535,GB +1041721536,1041721775,FR +1041721776,1041721791,GB +1041721792,1041721815,FR +1041721816,1041721823,GB +1041721824,1041722175,FR +1041722176,1041722191,GB 1041722192,1041722223,FR -1041722224,1041722279,GB -1041722280,1041722287,FR -1041722288,1041722367,GB -1041722368,1041722375,FR -1041722376,1041722383,GB +1041722224,1041722239,GB +1041722240,1041722279,FR +1041722280,1041722383,GB 1041722384,1041722391,FR 1041722392,1041722399,GB -1041722400,1041722415,FR -1041722416,1041722431,GB -1041722432,1041722495,FR -1041722496,1041722511,GB -1041722512,1041722535,FR +1041722400,1041722423,FR +1041722424,1041722431,GB +1041722432,1041722479,FR +1041722480,1041722503,GB +1041722504,1041722535,FR 1041722536,1041722551,GB 1041722552,1041722567,FR 1041722568,1041722575,GB 1041722576,1041722583,FR 1041722584,1041722623,GB -1041722624,1041722855,FR -1041722856,1041722863,GB -1041722864,1041722879,FR -1041722880,1041722887,GB -1041722888,1041722927,FR -1041722928,1041722935,GB -1041722936,1041722943,FR -1041722944,1041723007,GB -1041723008,1041723031,FR -1041723032,1041723135,GB -1041723136,1041723167,FR -1041723168,1041723175,GB -1041723176,1041723191,FR -1041723192,1041723199,GB -1041723200,1041723207,FR -1041723208,1041723215,GB -1041723216,1041723295,FR -1041723296,1041723391,GB -1041723392,1041723711,FR -1041723712,1041723727,GB -1041723728,1041723743,FR -1041723744,1041723903,GB -1041723904,1041724591,FR -1041724592,1041724607,GB -1041724608,1041724671,FR +1041722624,1041722983,FR +1041722984,1041723007,GB +1041723008,1041723047,FR +1041723048,1041723135,GB +1041723136,1041723359,FR +1041723360,1041723391,GB +1041723392,1041723655,FR +1041723656,1041723775,GB +1041723776,1041723839,FR +1041723840,1041723871,GB +1041723872,1041723887,FR +1041723888,1041723903,GB +1041723904,1041724455,FR +1041724456,1041724463,GB +1041724464,1041724471,FR +1041724472,1041724479,GB +1041724480,1041724671,FR 1041724672,1041724927,GB -1041724928,1041725007,FR -1041725008,1041725023,GB -1041725024,1041725031,FR -1041725032,1041725039,GB -1041725040,1041725159,FR -1041725160,1041725167,GB -1041725168,1041725183,FR -1041725184,1041725215,GB -1041725216,1041725255,FR +1041724928,1041725119,FR +1041725120,1041725167,GB +1041725168,1041725175,FR +1041725176,1041725231,GB +1041725232,1041725255,FR 1041725256,1041725271,GB -1041725272,1041725983,FR -1041725984,1041725999,GB -1041726000,1041726127,FR +1041725272,1041725375,FR +1041725376,1041725407,GB +1041725408,1041725749,FR +1041725750,1041725751,GB +1041725752,1041725815,FR +1041725816,1041725823,GB +1041725824,1041726063,FR +1041726064,1041726079,GB +1041726080,1041726127,FR 1041726128,1041726151,GB 1041726152,1041726159,FR 1041726160,1041726167,GB -1041726168,1041726463,FR -1041726464,1041726471,GB -1041726472,1041726479,FR -1041726480,1041726511,GB -1041726512,1041726527,FR -1041726528,1041726543,GB -1041726544,1041726559,FR -1041726560,1041726591,GB -1041726592,1041726671,FR +1041726168,1041726511,FR +1041726512,1041726543,GB +1041726544,1041726639,FR +1041726640,1041726655,GB +1041726656,1041726671,FR 1041726672,1041726687,GB -1041726688,1041726895,FR -1041726896,1041726903,GB -1041726904,1041727743,FR -1041727744,1041727999,GB -1041728000,1041728063,FR +1041726688,1041726735,FR +1041726736,1041726751,GB +1041726752,1041726847,FR +1041726848,1041726855,GB +1041726856,1041726879,FR +1041726880,1041726903,GB +1041726904,1041726951,FR +1041726952,1041726959,GB +1041726960,1041726975,FR +1041726976,1041726979,GB +1041726980,1041726983,FR +1041726984,1041726987,GB +1041726988,1041726991,FR +1041726992,1041726992,GB +1041726993,1041726994,FR +1041726995,1041726995,GB +1041726996,1041727007,FR +1041727008,1041727028,GB +1041727029,1041727029,FR +1041727030,1041727036,GB +1041727037,1041727038,FR +1041727039,1041727042,GB +1041727043,1041727043,FR +1041727044,1041727049,GB +1041727050,1041727050,FR +1041727051,1041727055,GB +1041727056,1041727063,FR +1041727064,1041727070,GB +1041727071,1041727087,FR +1041727088,1041727089,GB +1041727090,1041727090,FR +1041727091,1041727091,GB +1041727092,1041727167,FR +1041727168,1041727231,GB +1041727232,1041727239,FR +1041727240,1041727247,GB +1041727248,1041727303,FR +1041727304,1041727311,GB +1041727312,1041727999,FR +1041728000,1041728047,GB +1041728048,1041728063,FR 1041728064,1041728095,GB 1041728096,1041728111,FR 1041728112,1041728127,GB -1041728128,1041728255,FR -1041728256,1041728511,GB -1041728512,1041728887,FR +1041728128,1041728887,FR 1041728888,1041728895,GB -1041728896,1041729279,FR -1041729280,1041729391,GB -1041729392,1041729431,FR -1041729432,1041729463,GB -1041729464,1041729503,FR -1041729504,1041729535,GB +1041728896,1041729383,FR +1041729384,1041729391,GB +1041729392,1041729447,FR +1041729448,1041729455,GB +1041729456,1041729503,FR +1041729504,1041729519,GB +1041729520,1041729527,FR +1041729528,1041729535,GB 1041729536,1041729561,FR 1041729562,1041729564,GB 1041729565,1041729566,FR @@ -1874,125 +2858,125 @@ 1041729568,1041729615,FR 1041729616,1041729623,GB 1041729624,1041729663,FR -1041729664,1041729839,GB -1041729840,1041729871,FR -1041729872,1041729887,GB -1041729888,1041729927,FR -1041729928,1041730047,GB -1041730048,1041730087,FR -1041730088,1041730095,GB -1041730096,1041730175,FR -1041730176,1041730183,GB -1041730184,1041730239,FR +1041729664,1041729791,GB +1041729792,1041730239,FR 1041730240,1041730247,GB -1041730248,1041731903,FR -1041731904,1041731935,GB -1041731936,1041731967,FR -1041731968,1041732031,GB +1041730248,1041730639,FR +1041730640,1041730655,GB +1041730656,1041731919,FR +1041731920,1041731935,GB +1041731936,1041731975,FR +1041731976,1041732031,GB 1041732032,1041732055,FR 1041732056,1041732063,GB 1041732064,1041732095,FR -1041732096,1041732103,GB -1041732104,1041732119,FR -1041732120,1041732191,GB +1041732096,1041732111,GB +1041732112,1041732127,FR +1041732128,1041732191,GB 1041732192,1041732255,FR 1041732256,1041732295,GB -1041732296,1041732351,FR -1041732352,1041732359,GB -1041732360,1041732463,FR -1041732464,1041732511,GB -1041732512,1041732863,FR +1041732296,1041732303,FR +1041732304,1041732311,GB +1041732312,1041732447,FR +1041732448,1041732455,GB +1041732456,1041732463,FR +1041732464,1041732479,GB +1041732480,1041732863,FR 1041732864,1041732871,GB 1041732872,1041732879,FR 1041732880,1041732927,GB 1041732928,1041732959,FR 1041732960,1041732967,GB 1041732968,1041732991,FR -1041732992,1041733111,GB -1041733112,1041733375,FR -1041733376,1041733535,GB -1041733536,1041733887,FR -1041733888,1041734143,GB -1041734144,1041734911,FR -1041734912,1041735007,GB -1041735008,1041735055,FR +1041732992,1041733103,GB +1041733104,1041733503,FR +1041733504,1041733535,GB +1041733536,1041733567,FR +1041733568,1041733631,GB +1041733632,1041734927,FR +1041734928,1041734943,GB +1041734944,1041734975,FR +1041734976,1041734991,GB +1041734992,1041734999,FR +1041735000,1041735039,GB +1041735040,1041735055,FR 1041735056,1041735087,GB 1041735088,1041735119,FR -1041735120,1041735135,GB -1041735136,1041735423,FR -1041735424,1041735503,GB -1041735504,1041735511,FR -1041735512,1041735559,GB -1041735560,1041735567,FR -1041735568,1041735575,GB -1041735576,1041735615,FR -1041735616,1041735679,GB -1041735680,1041736191,FR -1041736192,1041736199,GB -1041736200,1041736255,FR -1041736256,1041736263,GB -1041736264,1041736367,FR -1041736368,1041736391,GB -1041736392,1041736423,FR -1041736424,1041736431,GB -1041736432,1041736439,FR -1041736440,1041736463,GB -1041736464,1041736503,FR -1041736504,1041736511,GB -1041736512,1041736527,FR +1041735120,1041735167,GB +1041735168,1041735431,FR +1041735432,1041735495,GB +1041735496,1041735519,FR +1041735520,1041735551,GB +1041735552,1041735567,FR +1041735568,1041735583,GB +1041735584,1041735615,FR +1041735616,1041735663,GB +1041735664,1041736375,FR +1041736376,1041736383,GB +1041736384,1041736423,FR +1041736424,1041736447,GB +1041736448,1041736455,FR +1041736456,1041736463,GB +1041736464,1041736527,FR 1041736528,1041736535,GB 1041736536,1041736543,FR 1041736544,1041736551,GB -1041736552,1041736567,FR -1041736568,1041736599,GB +1041736552,1041736591,FR +1041736592,1041736599,GB 1041736600,1041736607,FR 1041736608,1041736631,GB -1041736632,1041736671,FR -1041736672,1041736703,GB -1041736704,1041737023,FR -1041737024,1041737031,GB +1041736632,1041736687,FR +1041736688,1041736695,GB +1041736696,1041737015,FR +1041737016,1041737031,GB 1041737032,1041737039,FR -1041737040,1041737047,GB -1041737048,1041737063,FR -1041737064,1041737119,GB +1041737040,1041737055,GB +1041737056,1041737071,FR +1041737072,1041737119,GB 1041737120,1041737127,FR -1041737128,1041737135,GB -1041737136,1041737143,FR -1041737144,1041737151,GB +1041737128,1041737151,GB 1041737152,1041737247,FR 1041737248,1041737279,GB 1041737280,1041737295,FR 1041737296,1041737303,GB -1041737304,1041737399,FR +1041737304,1041737375,FR +1041737376,1041737391,GB +1041737392,1041737399,FR 1041737400,1041737423,GB 1041737424,1041737455,FR -1041737456,1041737471,GB -1041737472,1041737503,FR -1041737504,1041737535,GB -1041737536,1041737583,FR +1041737456,1041737463,GB +1041737464,1041737479,FR +1041737480,1041737503,GB +1041737504,1041737583,FR 1041737584,1041737599,GB 1041737600,1041737607,FR 1041737608,1041737615,GB -1041737616,1041737623,FR -1041737624,1041737631,GB -1041737632,1041737647,FR +1041737616,1041737647,FR 1041737648,1041737663,GB 1041737664,1041737671,FR -1041737672,1041737679,GB -1041737680,1041737727,FR -1041737728,1041737759,GB -1041737760,1041737775,FR -1041737776,1041737839,GB -1041737840,1041737847,FR -1041737848,1041737863,GB -1041737864,1041737871,FR +1041737672,1041737695,GB +1041737696,1041737727,FR +1041737728,1041737743,GB +1041737744,1041737775,FR +1041737776,1041737823,GB +1041737824,1041737847,FR +1041737848,1041737855,GB +1041737856,1041737871,FR 1041737872,1041737879,GB -1041737880,1041737911,FR -1041737912,1041737935,GB -1041737936,1041738503,FR +1041737880,1041737903,FR +1041737904,1041737911,GB +1041737912,1041737919,FR +1041737920,1041737935,GB +1041737936,1041738159,FR +1041738160,1041738167,GB +1041738168,1041738215,FR +1041738216,1041738223,GB +1041738224,1041738503,FR 1041738504,1041738511,GB 1041738512,1041738519,FR -1041738520,1041738559,GB +1041738520,1041738543,GB +1041738544,1041738551,FR +1041738552,1041738559,GB 1041738560,1041738567,FR 1041738568,1041738575,GB 1041738576,1041738583,FR @@ -2001,23 +2985,22 @@ 1041738600,1041738607,GB 1041738608,1041738703,FR 1041738704,1041738711,GB -1041738712,1041738719,FR -1041738720,1041738743,GB -1041738744,1041739031,FR -1041739032,1041739047,GB -1041739048,1041739055,FR -1041739056,1041739063,GB -1041739064,1041739071,FR -1041739072,1041739095,GB -1041739096,1041739119,FR -1041739120,1041739175,GB +1041738712,1041738735,FR +1041738736,1041738743,GB +1041738744,1041739079,FR +1041739080,1041739087,GB +1041739088,1041739167,FR +1041739168,1041739175,GB 1041739176,1041739183,FR 1041739184,1041739207,GB 1041739208,1041739215,FR -1041739216,1041739239,GB -1041739240,1041739287,FR -1041739288,1041739303,GB -1041739304,1041739391,FR +1041739216,1041739231,GB +1041739232,1041739295,FR +1041739296,1041739299,BE +1041739300,1041739303,GB +1041739304,1041739375,FR +1041739376,1041739383,BE +1041739384,1041739391,FR 1041739392,1041739423,GB 1041739424,1041739463,FR 1041739464,1041739471,GB @@ -2029,258 +3012,283 @@ 1041739744,1041739751,GB 1041739752,1041740031,FR 1041740032,1041740039,GB -1041740040,1041740647,FR +1041740040,1041740135,FR +1041740136,1041740143,GB +1041740144,1041740263,FR +1041740264,1041740271,GB +1041740272,1041740567,FR +1041740568,1041740575,GB +1041740576,1041740591,FR +1041740592,1041740607,GB +1041740608,1041740647,FR 1041740648,1041740655,GB -1041740656,1041740679,FR -1041740680,1041740703,GB -1041740704,1041740711,FR -1041740712,1041740719,GB -1041740720,1041740727,FR -1041740728,1041740735,GB -1041740736,1041740759,FR -1041740760,1041740767,GB -1041740768,1041740839,FR -1041740840,1041740847,GB -1041740848,1041740863,FR -1041740864,1041740879,GB -1041740880,1041740991,FR -1041740992,1041741119,GB -1041741120,1041741135,FR -1041741136,1041741143,GB -1041741144,1041741231,FR -1041741232,1041741247,GB -1041741248,1041741255,FR -1041741256,1041741311,GB -1041741312,1041741607,FR +1041740656,1041740671,FR +1041740672,1041740687,GB +1041740688,1041740703,FR +1041740704,1041740719,GB +1041740720,1041741071,FR +1041741072,1041741087,GB +1041741088,1041741135,FR +1041741136,1041741151,GB +1041741152,1041741239,FR +1041741240,1041741263,GB +1041741264,1041741279,FR +1041741280,1041741295,GB +1041741296,1041741567,FR +1041741568,1041741575,GB +1041741576,1041741607,FR 1041741608,1041741615,GB 1041741616,1041741631,FR 1041741632,1041741647,GB 1041741648,1041741663,FR 1041741664,1041741679,GB -1041741680,1041741695,FR -1041741696,1041741823,GB +1041741680,1041741687,FR +1041741688,1041741823,GB 1041741824,1041742223,FR 1041742224,1041742239,GB -1041742240,1041742303,FR -1041742304,1041742343,GB -1041742344,1041742359,FR +1041742240,1041742263,FR +1041742264,1041742271,GB +1041742272,1041742279,FR +1041742280,1041742287,GB +1041742288,1041742303,FR +1041742304,1041742335,GB +1041742336,1041742359,FR 1041742360,1041742367,GB -1041742368,1041742375,FR -1041742376,1041742423,GB -1041742424,1041742471,FR +1041742368,1041742383,FR +1041742384,1041742391,GB +1041742392,1041742407,FR +1041742408,1041742415,GB +1041742416,1041742455,FR +1041742456,1041742463,GB +1041742464,1041742471,FR 1041742472,1041742479,GB 1041742480,1041742511,FR -1041742512,1041742591,GB -1041742592,1041743111,FR -1041743112,1041743119,GB -1041743120,1041743135,FR +1041742512,1041742527,GB +1041742528,1041743135,FR 1041743136,1041743143,GB -1041743144,1041743167,FR -1041743168,1041743223,GB -1041743224,1041743303,FR +1041743144,1041743175,FR +1041743176,1041743215,GB +1041743216,1041743303,FR 1041743304,1041743311,GB 1041743312,1041743615,FR -1041743616,1041743647,GB +1041743616,1041743623,GB +1041743624,1041743639,FR +1041743640,1041743647,GB 1041743648,1041743671,FR 1041743672,1041743679,GB -1041743680,1041743703,FR -1041743704,1041743711,GB -1041743712,1041743719,FR -1041743720,1041743727,GB -1041743728,1041743743,FR +1041743680,1041743743,FR 1041743744,1041743759,GB 1041743760,1041743767,FR 1041743768,1041743775,GB -1041743776,1041743807,FR +1041743776,1041743791,FR +1041743792,1041743799,GB +1041743800,1041743807,FR 1041743808,1041743823,GB 1041743824,1041743831,FR -1041743832,1041743855,GB -1041743856,1041743863,FR +1041743832,1041743847,GB +1041743848,1041743863,FR 1041743864,1041743871,GB -1041743872,1041744271,FR -1041744272,1041744287,GB -1041744288,1041744311,FR +1041743872,1041744287,FR +1041744288,1041744295,GB +1041744296,1041744311,FR 1041744312,1041744327,GB -1041744328,1041744599,FR +1041744328,1041744359,FR +1041744360,1041744367,GB +1041744368,1041744399,FR +1041744400,1041744407,GB +1041744408,1041744479,FR +1041744480,1041744543,GB +1041744544,1041744599,FR 1041744600,1041744607,GB 1041744608,1041744623,FR -1041744624,1041744895,GB -1041744896,1041744919,FR +1041744624,1041744639,GB +1041744640,1041744919,FR 1041744920,1041744927,GB 1041744928,1041744943,FR 1041744944,1041744951,GB -1041744952,1041744991,FR -1041744992,1041745031,GB -1041745032,1041745055,FR -1041745056,1041745063,GB -1041745064,1041745095,FR -1041745096,1041745119,GB -1041745120,1041745127,FR -1041745128,1041745135,GB -1041745136,1041745151,FR -1041745152,1041745159,GB -1041745160,1041745175,FR -1041745176,1041745191,GB -1041745192,1041745327,FR +1041744952,1041744975,FR +1041744976,1041744983,GB +1041744984,1041745007,FR +1041745008,1041745031,GB +1041745032,1041745063,FR +1041745064,1041745071,GB +1041745072,1041745127,FR +1041745128,1041745143,GB +1041745144,1041745167,FR +1041745168,1041745191,GB +1041745192,1041745247,FR +1041745248,1041745279,GB +1041745280,1041745327,FR 1041745328,1041745343,GB 1041745344,1041745359,FR -1041745360,1041745383,GB -1041745384,1041745415,FR +1041745360,1041745375,GB +1041745376,1041745415,FR 1041745416,1041745423,GB 1041745424,1041745447,FR 1041745448,1041745471,GB 1041745472,1041745479,FR 1041745480,1041745487,GB 1041745488,1041745495,FR -1041745496,1041745535,GB -1041745536,1041745543,FR +1041745496,1041745503,GB +1041745504,1041745543,FR 1041745544,1041745551,GB 1041745552,1041745567,FR 1041745568,1041745575,GB 1041745576,1041745599,FR 1041745600,1041745615,GB -1041745616,1041745623,FR -1041745624,1041745631,GB -1041745632,1041745639,FR +1041745616,1041745639,FR 1041745640,1041745647,GB 1041745648,1041745655,FR 1041745656,1041745663,GB -1041745664,1041745671,FR -1041745672,1041745687,GB -1041745688,1041745751,FR +1041745664,1041745751,FR 1041745752,1041745767,GB -1041745768,1041745823,FR -1041745824,1041745863,GB -1041745864,1041745903,FR -1041745904,1041745951,GB -1041745952,1041745967,FR -1041745968,1041746015,GB -1041746016,1041746031,FR -1041746032,1041746039,GB -1041746040,1041746079,FR -1041746080,1041746095,GB -1041746096,1041746111,FR -1041746112,1041746119,GB -1041746120,1041746127,FR -1041746128,1041746135,GB -1041746136,1041746687,FR -1041746688,1041746735,GB +1041745768,1041745855,FR +1041745856,1041745871,GB +1041745872,1041745887,FR +1041745888,1041745959,GB +1041745960,1041745999,FR +1041746000,1041746015,GB +1041746016,1041746023,FR +1041746024,1041746031,GB +1041746032,1041746039,FR +1041746040,1041746047,GB +1041746048,1041746063,FR +1041746064,1041746079,GB +1041746080,1041746111,FR +1041746112,1041746135,GB +1041746136,1041746703,FR +1041746704,1041746735,GB 1041746736,1041746743,FR 1041746744,1041746751,GB 1041746752,1041746799,FR -1041746800,1041746807,GB -1041746808,1041746815,FR -1041746816,1041746831,GB -1041746832,1041746863,FR -1041746864,1041746887,GB -1041746888,1041746903,FR -1041746904,1041746927,GB -1041746928,1041747071,FR -1041747072,1041747455,GB -1041747456,1041747463,FR +1041746800,1041746823,GB +1041746824,1041746831,FR +1041746832,1041746847,GB +1041746848,1041746863,FR +1041746864,1041746895,GB +1041746896,1041747463,FR 1041747464,1041747487,GB -1041747488,1041747503,FR -1041747504,1041747519,GB -1041747520,1041749503,FR -1041749504,1041749507,GB -1041749508,1041749511,FR -1041749512,1041749571,GB -1041749572,1041749575,FR -1041749576,1041749691,GB -1041749692,1041749695,FR -1041749696,1041749715,GB -1041749716,1041749719,FR -1041749720,1041749759,GB -1041749760,1041749807,FR +1041747488,1041749775,FR +1041749776,1041749783,GB +1041749784,1041749807,FR 1041749808,1041749815,GB -1041749816,1041750559,FR -1041750560,1041750591,GB -1041750592,1041750791,FR -1041750792,1041750807,GB -1041750808,1041750839,FR -1041750840,1041750847,GB -1041750848,1041750895,FR -1041750896,1041750919,GB -1041750920,1041750943,FR -1041750944,1041750967,GB -1041750968,1041750983,FR -1041750984,1041750991,GB -1041750992,1041751023,FR -1041751024,1041751039,GB -1041751040,1041751311,FR -1041751312,1041751327,GB -1041751328,1041751343,FR -1041751344,1041751359,GB -1041751360,1041751439,FR -1041751440,1041751447,GB -1041751448,1041751623,FR -1041751624,1041751631,GB -1041751632,1041751639,FR -1041751640,1041751647,GB -1041751648,1041751687,FR -1041751688,1041751719,GB -1041751720,1041751743,FR -1041751744,1041751751,GB -1041751752,1041751767,FR -1041751768,1041751775,GB -1041751776,1041753343,FR -1041753344,1041754111,GB -1041754112,1041754143,FR +1041749816,1041749847,FR +1041749848,1041749855,GB +1041749856,1041749967,FR +1041749968,1041749983,GB +1041749984,1041749999,FR +1041750000,1041750007,GB +1041750008,1041750527,FR +1041750528,1041750543,GB +1041750544,1041750663,FR +1041750664,1041750671,GB +1041750672,1041750743,FR +1041750744,1041750751,GB +1041750752,1041750775,FR +1041750776,1041750783,GB +1041750784,1041751695,FR +1041751696,1041751719,GB +1041751720,1041753319,FR +1041753320,1041753327,GB +1041753328,1041753407,FR +1041753408,1041753503,GB +1041753504,1041753599,FR +1041753600,1041753775,GB +1041753776,1041753831,FR +1041753832,1041753839,GB +1041753840,1041753983,FR +1041753984,1041754015,GB +1041754016,1041754143,FR 1041754144,1041754151,GB -1041754152,1041754239,FR +1041754152,1041754175,FR +1041754176,1041754191,GB +1041754192,1041754239,FR 1041754240,1041754247,GB -1041754248,1041754415,FR -1041754416,1041754423,GB -1041754424,1041754479,FR +1041754248,1041754455,FR +1041754456,1041754463,GB +1041754464,1041754479,FR 1041754480,1041754495,GB 1041754496,1041755231,FR 1041755232,1041755239,GB -1041755240,1041755295,FR -1041755296,1041755303,GB -1041755304,1041755311,FR -1041755312,1041755327,GB -1041755328,1041755391,FR -1041755392,1041755399,GB -1041755400,1041755631,FR -1041755632,1041755639,GB -1041755640,1041756463,FR +1041755240,1041755335,FR +1041755336,1041755343,GB +1041755344,1041755375,FR +1041755376,1041755391,GB +1041755392,1041755503,FR +1041755504,1041755519,GB +1041755520,1041755631,FR +1041755632,1041755647,GB +1041755648,1041756463,FR 1041756464,1041756471,GB -1041756472,1041756599,FR +1041756472,1041756559,FR +1041756560,1041756567,GB +1041756568,1041756599,FR 1041756600,1041756607,GB -1041756608,1041756719,FR -1041756720,1041756727,GB -1041756728,1041756895,FR -1041756896,1041756911,GB -1041756912,1041756919,FR +1041756608,1041756655,FR +1041756656,1041756663,GB +1041756664,1041756695,FR +1041756696,1041756703,DE +1041756704,1041756919,FR 1041756920,1041756927,GB 1041756928,1041757023,FR 1041757024,1041757039,GB 1041757040,1041757087,FR -1041757088,1041757111,GB -1041757112,1041757175,FR +1041757088,1041757095,GB +1041757096,1041757111,FR +1041757112,1041757127,GB +1041757128,1041757175,FR 1041757176,1041757179,GB 1041757180,1041757503,FR 1041757504,1041757519,GB -1041757520,1041757663,FR +1041757520,1041757583,FR +1041757584,1041757591,GB +1041757592,1041757631,FR +1041757632,1041757647,GB +1041757648,1041757663,FR 1041757664,1041757671,GB -1041757672,1041758207,FR -1041758208,1041760255,GB +1041757672,1041757687,FR +1041757688,1041757695,GB +1041757696,1041758031,FR +1041758032,1041758039,GB +1041758040,1041758095,FR +1041758096,1041758111,GB +1041758112,1041758255,FR +1041758256,1041758271,GB +1041758272,1041758319,FR +1041758320,1041758343,GB +1041758344,1041758351,FR +1041758352,1041758367,GB +1041758368,1041758391,FR +1041758392,1041758399,GB +1041758400,1041758407,FR +1041758408,1041758415,GB +1041758416,1041758423,FR +1041758424,1041758431,GB +1041758432,1041758679,FR +1041758680,1041758687,GB +1041758688,1041759231,FR +1041759232,1041760255,GB 1041760256,1041768447,DE -1041768448,1041776639,GB +1041768448,1041776639,NO 1041776640,1041784831,CZ +1041784832,1041793023,KE 1041793024,1041825791,GB 1041825792,1041842175,NL 1041842176,1041891327,GB 1041891328,1041921535,DE 1041921536,1041921727,US -1041921728,1041945087,DE +1041921728,1041940437,DE +1041940438,1041940438,A2 +1041940439,1041945087,DE 1041945088,1041945151,AT 1041945152,1041958463,DE 1041958464,1041958527,DK 1041958528,1041959423,DE 1041959424,1041959679,US 1041959680,1042022399,DE -1042022400,1042087935,PT +1042022400,1042045891,PT +1042045892,1042045895,A2 +1042045896,1042087935,PT 1042087936,1042120703,TR 1042120704,1042153471,PL 1042153472,1042284543,GB @@ -2289,7 +3297,8 @@ 1042288416,1042292735,CH 1042292736,1042293247,NL 1042293248,1042293503,GB -1042293504,1042293631,IR +1042293504,1042293535,NL +1042293536,1042293631,IR 1042293632,1042296063,GE 1042296064,1042296191,CY 1042296192,1042296575,GE @@ -2300,7 +3309,9 @@ 1042297328,1042297599,IR 1042297600,1042297855,GB 1042297856,1042298111,NL -1042298112,1042298239,IR +1042298112,1042298143,US +1042298144,1042298175,NL +1042298176,1042298239,IR 1042298240,1042298279,IQ 1042298280,1042298287,IR 1042298288,1042298303,GB @@ -2346,29 +3357,45 @@ 1042825216,1042833407,CZ 1042833408,1042841599,GB 1042841600,1042874367,AT -1042874368,1042882559,NL +1042874368,1042875399,NL +1042875400,1042875407,DE +1042875408,1042875903,NL +1042875904,1042876159,GB +1042876160,1042876415,NL +1042876416,1042876479,GB +1042876480,1042876671,NL +1042876672,1042876927,DE +1042876928,1042877183,NL +1042877184,1042877951,DE +1042877952,1042880639,NL +1042880640,1042880767,GB +1042880768,1042882559,NL 1042882560,1042882815,DE 1042882816,1042888703,NL 1042888704,1042888959,GB -1042888960,1042890751,NL -1042890752,1042890783,GB -1042890784,1042890815,NL +1042888960,1042889215,NL +1042889216,1042889471,US +1042889472,1042889983,NL +1042889984,1042890111,GB +1042890112,1042890815,NL 1042890816,1042890819,FR 1042890820,1042890847,NL 1042890848,1042890879,GB -1042890880,1042890959,NL +1042890880,1042890944,NL +1042890945,1042890950,GB +1042890951,1042890959,NL 1042890960,1042890991,GB 1042890992,1042891775,NL 1042891776,1042891839,GB -1042891840,1042892287,NL -1042892288,1042892319,SE -1042892320,1042892383,PT -1042892384,1042892447,IT -1042892448,1042892479,BE +1042891840,1042891871,BE +1042891872,1042892015,NL +1042892016,1042892031,DE +1042892032,1042892479,NL 1042892480,1042892543,PL -1042892544,1042892863,NL -1042892864,1042892927,GB -1042892928,1042892967,NL +1042892544,1042892879,NL +1042892880,1042892887,DE +1042892888,1042892959,NL +1042892960,1042892967,DE 1042892968,1042892975,PL 1042892976,1042892983,CH 1042892984,1042893055,NL @@ -2380,21 +3407,18 @@ 1042893312,1042894079,NL 1042894080,1042894143,DE 1042894144,1042894175,SE -1042894176,1042894335,NL -1042894336,1042894463,FR -1042894464,1042894559,NL +1042894176,1042894559,NL 1042894560,1042894591,DE 1042894592,1042894655,FR 1042894656,1042894783,NL 1042894784,1042894847,DE -1042894848,1042895359,NL -1042895360,1042895615,FR +1042894848,1042895231,NL +1042895232,1042895359,DE +1042895360,1042895615,NL 1042895616,1042895871,GB 1042895872,1042900479,NL 1042900480,1042900735,GB -1042900736,1042907135,NL -1042907136,1042915391,GB -1042915392,1042939903,NL +1042900736,1042939903,NL 1042939904,1043070975,ES 1043070976,1043079167,CZ 1043079168,1043087359,DE @@ -2406,27 +3430,228 @@ 1043202048,1043333119,AT 1043333120,1043341311,CH 1043341312,1043349503,IT -1043349504,1043350587,DE -1043350588,1043350591,AT -1043350592,1043357695,DE +1043349504,1043357695,DE 1043357696,1043365887,CH 1043365888,1043398655,PT 1043398656,1043464191,GB -1043464192,1043465215,NL -1043465216,1043472383,GB -1043472384,1043480575,DE +1043464192,1043464799,NL +1043464800,1043464807,GB +1043464808,1043464823,NL +1043464824,1043464831,GB +1043464832,1043464927,NL +1043464928,1043465055,GB +1043465056,1043465071,NL +1043465072,1043465087,GB +1043465088,1043465775,NL +1043465776,1043465783,GB +1043465784,1043465839,NL +1043465840,1043465855,GB +1043465856,1043465871,NL +1043465872,1043465919,GB +1043465920,1043465983,NL +1043465984,1043466247,GB +1043466248,1043466319,NL +1043466320,1043466327,GB +1043466328,1043466335,NL +1043466336,1043466351,GB +1043466352,1043466431,NL +1043466432,1043466447,GB +1043466448,1043466455,NL +1043466456,1043466463,GB +1043466464,1043466495,NL +1043466496,1043466503,GB +1043466504,1043466511,NL +1043466512,1043466519,GB +1043466520,1043466559,NL +1043466560,1043466575,GB +1043466576,1043466583,NL +1043466584,1043466607,GB +1043466608,1043466887,NL +1043466888,1043466895,GB +1043466896,1043466911,NL +1043466912,1043466927,GB +1043466928,1043466943,NL +1043466944,1043467039,GB +1043467040,1043467071,NL +1043467072,1043467087,GB +1043467088,1043467103,NL +1043467104,1043467199,GB +1043467200,1043467231,NL +1043467232,1043467519,GB +1043467520,1043467535,NL +1043467536,1043467583,GB +1043467584,1043467599,NL +1043467600,1043467615,GB +1043467616,1043467663,NL +1043467664,1043467679,GB +1043467680,1043467695,NL +1043467696,1043467759,GB +1043467760,1043467775,NL +1043467776,1043467815,GB +1043467816,1043467839,NL +1043467840,1043467871,GB +1043467872,1043467967,NL +1043467968,1043467983,GB +1043467984,1043467999,NL +1043468000,1043468063,GB +1043468064,1043468127,NL +1043468128,1043468159,GB +1043468160,1043468191,NL +1043468192,1043468543,GB +1043468544,1043468575,NL +1043468576,1043468655,GB +1043468656,1043468663,NL +1043468664,1043468671,GB +1043468672,1043468751,NL +1043468752,1043468767,GB +1043468768,1043468783,NL +1043468784,1043468791,GB +1043468792,1043468799,NL +1043468800,1043468831,GB +1043468832,1043468863,NL +1043468864,1043468895,GB +1043468896,1043468903,NL +1043468904,1043468911,GB +1043468912,1043468927,NL +1043468928,1043468935,GB +1043468936,1043468959,NL +1043468960,1043468967,GB +1043468968,1043469023,NL +1043469024,1043469055,GB +1043469056,1043469087,NL +1043469088,1043469143,GB +1043469144,1043469159,NL +1043469160,1043469183,GB +1043469184,1043469199,NL +1043469200,1043469207,GB +1043469208,1043469223,NL +1043469224,1043469231,GB +1043469232,1043469239,NL +1043469240,1043469247,GB +1043469248,1043469335,NL +1043469336,1043469343,GB +1043469344,1043469359,NL +1043469360,1043469375,GB +1043469376,1043469399,NL +1043469400,1043469415,GB +1043469416,1043469423,NL +1043469424,1043469439,GB +1043469440,1043469559,NL +1043469560,1043469663,GB +1043469664,1043469679,NL +1043469680,1043469695,GB +1043469696,1043469727,NL +1043469728,1043469823,GB +1043469824,1043469843,NL +1043469844,1043469847,GB +1043469848,1043469919,NL +1043469920,1043469939,GB +1043469940,1043469943,NL +1043469944,1043470127,GB +1043470128,1043470223,NL +1043470224,1043470271,GB +1043470272,1043470303,NL +1043470304,1043470335,GB +1043470336,1043470847,NL +1043470848,1043472415,GB +1043472416,1043472423,DE +1043472424,1043472431,GB +1043472432,1043472439,DE +1043472440,1043472487,GB +1043472488,1043472495,DE +1043472496,1043472503,GB +1043472504,1043472895,DE +1043472896,1043473151,GB +1043473152,1043473411,DE +1043473412,1043473415,GB +1043473416,1043473579,DE +1043473580,1043473583,GB +1043473584,1043474031,DE +1043474032,1043474047,GB +1043474048,1043474487,DE +1043474488,1043474495,GB +1043474496,1043475591,DE +1043475592,1043475711,GB +1043475712,1043475887,DE +1043475888,1043475919,GB +1043475920,1043475983,DE +1043475984,1043475991,GB +1043475992,1043476319,DE +1043476320,1043476351,GB +1043476352,1043476735,DE +1043476736,1043476767,GB +1043476768,1043476815,DE +1043476816,1043476991,GB +1043476992,1043477503,DE +1043477504,1043477759,GB +1043477760,1043478179,DE +1043478180,1043478271,GB +1043478272,1043478511,DE +1043478512,1043478527,GB +1043478528,1043478623,DE +1043478624,1043478639,GB +1043478640,1043478655,DE +1043478656,1043478671,GB +1043478672,1043478735,DE +1043478736,1043478751,GB +1043478752,1043478783,DE +1043478784,1043479295,GB +1043479296,1043479551,DE +1043479552,1043480063,GB +1043480064,1043480351,DE +1043480352,1043480359,GB +1043480360,1043480363,DE +1043480364,1043480575,GB 1043480576,1043488767,CH 1043488768,1043496959,DE -1043496960,1043505151,FR +1043496960,1043497055,FR +1043497056,1043497079,GB +1043497080,1043497215,FR +1043497216,1043497759,GB +1043497760,1043497767,FR +1043497768,1043497863,GB +1043497864,1043497871,FR +1043497872,1043497903,GB +1043497904,1043497911,FR +1043497912,1043497927,GB +1043497928,1043497935,FR +1043497936,1043497983,GB +1043497984,1043498015,FR +1043498016,1043498023,GB +1043498024,1043498031,FR +1043498032,1043498039,GB +1043498040,1043498071,FR +1043498072,1043498095,GB +1043498096,1043498111,FR +1043498112,1043498151,GB +1043498152,1043498183,FR +1043498184,1043498195,GB +1043498196,1043498207,FR +1043498208,1043498223,GB +1043498224,1043498239,FR +1043498240,1043498243,GB +1043498244,1043498247,FR +1043498248,1043498495,GB +1043498496,1043498535,FR +1043498536,1043498543,GB +1043498544,1043498639,FR +1043498640,1043498655,GB +1043498656,1043498671,FR +1043498672,1043498815,GB +1043498816,1043498911,FR +1043498912,1043499267,GB +1043499268,1043499519,FR +1043499520,1043505151,GB 1043505152,1043513343,NO 1043513344,1043529727,GB +1043529728,1043595263,NL 1043595264,1043600639,DE 1043600640,1043600895,FR -1043600896,1043602391,DE -1043602392,1043602399,FR -1043602400,1043607679,DE -1043607680,1043607715,FR -1043607716,1043609279,DE +1043600896,1043606255,DE +1043606256,1043606271,GB +1043606272,1043607679,DE +1043607680,1043607711,FR +1043607712,1043609279,DE 1043609280,1043609343,AT 1043609344,1043609463,DE 1043609464,1043609471,IE @@ -2438,1358 +3663,304 @@ 1043623216,1043623231,GB 1043623232,1043633663,DE 1043633664,1043633919,FR -1043633920,1043660799,DE -1043660800,1043660927,GB -1043660928,1043661775,DE -1043661776,1043661783,GB -1043661784,1043664383,DE -1043664384,1043664639,GB -1043664640,1043665151,DE -1043665152,1043665663,GB -1043665664,1043666687,DE -1043666688,1043666943,GB -1043666944,1043667583,DE -1043667584,1043667647,US -1043667648,1043667711,GB -1043667712,1043668479,DE -1043668480,1043668991,GB -1043668992,1043693055,DE +1043633920,1043693055,DE 1043693056,1043693127,GB 1043693128,1043693183,DE 1043693184,1043693567,GB 1043693568,1043718783,DE 1043718784,1043718815,FR -1043718816,1043727375,DE -1043727376,1043727383,IT -1043727384,1043826687,DE -1043826688,1043826943,GB -1043826944,1043827199,DE -1043827200,1043827455,GB -1043827456,1043830911,DE -1043830912,1043831039,GB -1043831040,1043857407,DE +1043718816,1043857407,DE 1043857408,1043890175,GB -1043890176,1043890495,IL +1043890176,1043890183,A2 +1043890184,1043890191,NG +1043890192,1043890207,A2 +1043890208,1043890239,NG +1043890240,1043890495,A2 1043890496,1043890591,NG -1043890592,1043891775,IL +1043890592,1043891775,A2 1043891776,1043891839,NG -1043891840,1043892223,IL +1043891840,1043892223,A2 1043892224,1043892239,MZ -1043892240,1043892255,IL +1043892240,1043892255,A2 1043892256,1043892287,MZ -1043892288,1043892479,IL -1043892480,1043892735,NG +1043892288,1043892479,A2 +1043892480,1043892735,CD 1043892736,1043892991,MZ -1043892992,1043893247,NG -1043893248,1043893311,IL -1043893312,1043893375,NG -1043893376,1043893567,IL +1043892992,1043893567,A2 1043893568,1043893583,NG -1043893584,1043893759,IL -1043893760,1043894015,NG -1043894016,1043894271,MZ -1043894272,1043894559,IL +1043893584,1043894559,A2 1043894560,1043894591,NG -1043894592,1043894751,IL +1043894592,1043894751,A2 1043894752,1043894783,NG -1043894784,1043894847,IL +1043894784,1043894847,A2 1043894848,1043894879,NG -1043894880,1043895039,IL +1043894880,1043895039,A2 1043895040,1043895167,NG -1043895168,1043895983,IL +1043895168,1043895983,A2 1043895984,1043895999,AO -1043896000,1043896063,IL +1043896000,1043896063,A2 1043896064,1043896319,NG -1043896320,1043896575,GH -1043896576,1043897343,IL +1043896320,1043897343,A2 1043897344,1043897855,KE -1043897856,1043898367,IL -1043898368,1043898879,CD -1043898880,1043899647,MG -1043899648,1043899903,IL -1043899904,1043900159,TZ -1043900160,1043900415,MG -1043900416,1043905023,IL -1043905024,1043905279,TG -1043905280,1043907071,IL -1043907072,1043907583,MZ -1043907584,1043910143,IL +1043897856,1043898623,A2 +1043898624,1043898751,TZ +1043898752,1043899391,A2 +1043899392,1043899647,CG +1043899648,1043910143,A2 1043910144,1043910399,TZ -1043910400,1043910655,KE -1043910656,1043912447,IL -1043912448,1043912703,KE +1043910400,1043912703,A2 1043912704,1043913215,ZM -1043913216,1043913471,TZ -1043913472,1043914751,IL +1043913216,1043914751,A2 1043914752,1043914879,NG -1043914880,1043916799,IL +1043914880,1043916799,A2 1043916800,1043917055,NG -1043917056,1043917311,IL -1043917312,1043917567,CM -1043917568,1043918847,IL -1043918848,1043919871,MG -1043919872,1043922943,IL +1043917056,1043921919,A2 +1043921920,1043922943,IL 1043922944,1043988479,ES -1043988480,1043988503,NL -1043988504,1043988519,BE -1043988520,1043988527,NL -1043988528,1043988551,BE -1043988552,1043988559,NL -1043988560,1043988575,BE -1043988576,1043988607,NL -1043988608,1043988639,BE -1043988640,1043988647,NL -1043988648,1043988655,BE -1043988656,1043988663,NL -1043988664,1043988679,BE -1043988680,1043988711,NL -1043988712,1043988719,BE -1043988720,1043988727,NL -1043988728,1043988735,BE -1043988736,1043988767,NL -1043988768,1043988775,BE -1043988776,1043988799,NL -1043988800,1043988823,BE -1043988824,1043988943,NL -1043988944,1043989055,BE -1043989056,1043989503,NL -1043989504,1043989535,BE -1043989536,1043989543,NL -1043989544,1043989567,BE -1043989568,1043989599,NL -1043989600,1043989639,BE -1043989640,1043989655,NL -1043989656,1043989663,BE -1043989664,1043989695,NL -1043989696,1043989751,BE -1043989752,1043989759,NL -1043989760,1043990271,BE -1043990272,1043990367,NL -1043990368,1043990527,BE -1043990528,1043990543,NL -1043990544,1043990559,BE -1043990560,1043990591,NL -1043990592,1043990615,BE -1043990616,1043990623,NL -1043990624,1043990631,BE -1043990632,1043991047,NL -1043991048,1043991055,BE -1043991056,1043991063,NL -1043991064,1043991071,BE -1043991072,1043991231,NL -1043991232,1043992063,BE -1043992064,1043992319,NL -1043992320,1043992575,BE -1043992576,1043992831,NL -1043992832,1043993599,BE -1043993600,1043993855,NL -1043993856,1043994627,BE -1043994628,1043994631,NL -1043994632,1043994643,BE -1043994644,1043994651,NL -1043994652,1043994655,BE -1043994656,1043994699,NL -1043994700,1043994703,BE -1043994704,1043994747,NL -1043994748,1043994755,BE -1043994756,1043994759,NL -1043994760,1043994775,BE -1043994776,1043994779,NL -1043994780,1043994791,BE -1043994792,1043994795,NL -1043994796,1043994811,BE -1043994812,1043994815,NL -1043994816,1043994823,BE -1043994824,1043994827,NL -1043994828,1043994851,BE -1043994852,1043994855,NL -1043994856,1043994863,BE -1043994864,1043994867,NL -1043994868,1043994871,BE -1043994872,1043994875,NL -1043994876,1043994879,BE -1043994880,1043994891,NL -1043994892,1043994907,BE -1043994908,1043994911,NL -1043994912,1043994931,BE -1043994932,1043994935,NL -1043994936,1043994943,BE -1043994944,1043994947,NL -1043994948,1043994975,BE -1043994976,1043994979,NL -1043994980,1043994987,BE -1043994988,1043994991,NL -1043994992,1043994995,BE -1043994996,1043995003,NL -1043995004,1043995023,BE -1043995024,1043995027,NL -1043995028,1043995035,BE -1043995036,1043995051,NL -1043995052,1043995059,BE -1043995060,1043995067,NL -1043995068,1043995103,BE -1043995104,1043995115,NL -1043995116,1043995123,BE -1043995124,1043995131,NL -1043995132,1043995135,BE -1043995136,1043995139,NL -1043995140,1043995151,BE -1043995152,1043995155,NL -1043995156,1043995171,BE -1043995172,1043995179,NL -1043995180,1043995183,BE -1043995184,1043995187,NL -1043995188,1043995215,BE -1043995216,1043995223,NL -1043995224,1043995235,BE -1043995236,1043995239,NL -1043995240,1043995259,BE -1043995260,1043995267,NL -1043995268,1043995279,BE -1043995280,1043995283,NL -1043995284,1043995291,BE -1043995292,1043995295,NL -1043995296,1043995303,BE -1043995304,1043995311,NL -1043995312,1043995663,BE -1043995664,1043995687,NL -1043995688,1043995695,BE -1043995696,1043995703,NL -1043995704,1043995719,BE -1043995720,1043995735,NL -1043995736,1043995743,BE -1043995744,1043995759,NL -1043995760,1043995767,BE -1043995768,1043995783,NL -1043995784,1043995807,BE -1043995808,1043995831,NL -1043995832,1043995863,BE -1043995864,1043995887,NL -1043995888,1043995903,BE -1043995904,1043995935,NL -1043995936,1043995943,BE -1043995944,1043995951,NL -1043995952,1043995975,BE -1043995976,1043995999,NL -1043996000,1043996015,BE -1043996016,1043996023,NL -1043996024,1043996095,BE -1043996096,1043996103,NL -1043996104,1043996143,BE -1043996144,1043996151,NL -1043996152,1043996159,BE -1043996160,1043996679,NL -1043996680,1043996703,BE -1043996704,1043996711,NL -1043996712,1043996735,BE -1043996736,1043996775,NL -1043996776,1043996783,BE -1043996784,1043996807,NL -1043996808,1043997183,BE -1043997184,1043997375,NL -1043997376,1043997463,BE -1043997464,1043997471,NL -1043997472,1043997519,BE -1043997520,1043997551,NL -1043997552,1043997559,BE -1043997560,1043997583,NL -1043997584,1043997639,BE -1043997640,1043997663,NL -1043997664,1043997687,BE -1043997688,1043997919,NL -1043997920,1043998079,BE -1043998080,1043998143,NL -1043998144,1043998151,BE -1043998152,1043998159,NL -1043998160,1043998167,BE -1043998168,1043998191,NL -1043998192,1043998195,BE -1043998196,1043998198,NL -1043998199,1043998199,BE -1043998200,1043998719,NL -1043998720,1043998735,BE -1043998736,1043998751,NL -1043998752,1043998759,BE -1043998760,1043998783,NL -1043998784,1043998799,BE -1043998800,1043998855,NL -1043998856,1043998863,BE -1043998864,1043998911,NL -1043998912,1043998975,BE -1043998976,1043998983,NL -1043998984,1043999007,BE -1043999008,1043999055,NL -1043999056,1043999071,BE -1043999072,1043999087,NL -1043999088,1043999103,BE -1043999104,1043999111,NL -1043999112,1043999119,BE -1043999120,1043999143,NL -1043999144,1043999151,BE -1043999152,1043999159,NL -1043999160,1043999207,BE -1043999208,1043999215,NL -1043999216,1043999223,BE -1043999224,1043999231,NL -1043999232,1043999751,BE -1043999752,1043999759,NL -1043999760,1043999775,BE -1043999776,1043999783,NL -1043999784,1043999791,BE -1043999792,1043999823,NL -1043999824,1043999831,BE -1043999832,1043999999,NL -1044000000,1044000031,BE -1044000032,1044000063,NL -1044000064,1044000095,BE -1044000096,1044000103,NL -1044000104,1044000111,BE -1044000112,1044000767,NL -1044000768,1044000831,BE -1044000832,1044000895,NL -1044000896,1044000975,BE -1044000976,1044000983,NL -1044000984,1044000999,BE -1044001000,1044001023,NL -1044001024,1044001279,BE -1044001280,1044001663,NL -1044001664,1044001791,BE -1044001792,1044001823,NL -1044001824,1044001831,BE -1044001832,1044001887,NL -1044001888,1044001895,BE -1044001896,1044001927,NL -1044001928,1044001935,BE -1044001936,1044002087,NL -1044002088,1044002095,BE -1044002096,1044002103,NL -1044002104,1044002135,BE -1044002136,1044002175,NL -1044002176,1044002239,BE -1044002240,1044002815,NL -1044002816,1044002855,BE -1044002856,1044002859,NL -1044002860,1044002879,BE -1044002880,1044002883,NL -1044002884,1044002891,BE -1044002892,1044002899,NL -1044002900,1044002911,BE -1044002912,1044002919,NL -1044002920,1044002927,BE -1044002928,1044002947,NL -1044002948,1044002959,BE -1044002960,1044002975,NL -1044002976,1044002983,BE -1044002984,1044002987,NL -1044002988,1044002999,BE -1044003000,1044003003,NL -1044003004,1044003019,BE -1044003020,1044003023,NL -1044003024,1044003027,BE -1044003028,1044003031,NL -1044003032,1044003071,BE -1044003072,1044003079,NL -1044003080,1044003099,BE -1044003100,1044003103,NL -1044003104,1044003115,BE -1044003116,1044003119,NL -1044003120,1044003123,BE -1044003124,1044003131,NL -1044003132,1044003147,BE -1044003148,1044003151,NL -1044003152,1044003155,BE -1044003156,1044003159,NL -1044003160,1044003167,BE -1044003168,1044003171,NL -1044003172,1044003175,BE -1044003176,1044003179,NL -1044003180,1044003183,BE -1044003184,1044003187,NL -1044003188,1044003211,BE -1044003212,1044003219,NL -1044003220,1044003223,BE -1044003224,1044003227,NL -1044003228,1044003231,BE -1044003232,1044003251,NL -1044003252,1044003279,BE -1044003280,1044003283,NL -1044003284,1044003291,BE -1044003292,1044003295,NL -1044003296,1044003299,BE -1044003300,1044003303,NL -1044003304,1044003311,BE -1044003312,1044003315,NL -1044003316,1044003319,BE -1044003320,1044003323,NL -1044003324,1044003331,BE -1044003332,1044003343,NL -1044003344,1044003359,BE -1044003360,1044003362,NL -1044003363,1044003363,BE -1044003364,1044003371,NL -1044003372,1044003379,BE -1044003380,1044003383,NL -1044003384,1044003399,BE -1044003400,1044003403,NL -1044003404,1044003407,BE -1044003408,1044003411,NL -1044003412,1044003423,BE -1044003424,1044003427,NL -1044003428,1044003459,BE -1044003460,1044003463,NL -1044003464,1044003467,BE -1044003468,1044003471,NL -1044003472,1044003475,BE -1044003476,1044003479,NL -1044003480,1044003483,BE -1044003484,1044003487,NL -1044003488,1044003507,BE -1044003508,1044003527,NL -1044003528,1044003539,BE -1044003540,1044003543,NL -1044003544,1044003551,BE -1044003552,1044003563,NL -1044003564,1044003567,BE -1044003568,1044003571,NL -1044003572,1044003575,BE -1044003576,1044003591,NL -1044003592,1044003595,BE -1044003596,1044003599,NL -1044003600,1044003607,BE -1044003608,1044003611,NL -1044003612,1044003615,BE -1044003616,1044003631,NL -1044003632,1044003635,BE -1044003636,1044003639,NL -1044003640,1044003647,BE -1044003648,1044003651,NL -1044003652,1044003655,BE -1044003656,1044003659,NL -1044003660,1044003663,BE -1044003664,1044003667,NL -1044003668,1044003675,BE -1044003676,1044003683,NL -1044003684,1044003687,BE -1044003688,1044003691,NL -1044003692,1044003695,BE -1044003696,1044003699,NL -1044003700,1044003707,BE -1044003708,1044003711,NL -1044003712,1044003723,BE -1044003724,1044003775,NL -1044003776,1044003783,BE -1044003784,1044003787,NL -1044003788,1044003795,BE -1044003796,1044003799,NL -1044003800,1044003807,BE -1044003808,1044003819,NL -1044003820,1044003823,BE -1044003824,1044003831,NL -1044003832,1044003855,BE -1044003856,1044003871,NL -1044003872,1044003879,BE -1044003880,1044003895,NL -1044003896,1044003911,BE -1044003912,1044003919,NL -1044003920,1044003927,BE -1044003928,1044003959,NL -1044003960,1044003967,BE -1044003968,1044003975,NL -1044003976,1044003983,BE -1044003984,1044003991,NL -1044003992,1044004007,BE -1044004008,1044004079,NL -1044004080,1044004095,BE -1044004096,1044004319,NL -1044004320,1044004351,BE -1044004352,1044004863,NL -1044004864,1044004903,BE -1044004904,1044004911,NL -1044004912,1044004927,BE -1044004928,1044005503,NL -1044005504,1044005631,BE -1044005632,1044005647,NL -1044005648,1044005663,BE -1044005664,1044005695,NL -1044005696,1044005775,BE -1044005776,1044005783,NL -1044005784,1044005799,BE -1044005800,1044005807,NL -1044005808,1044005823,BE -1044005824,1044005847,NL -1044005848,1044005887,BE -1044005888,1044006143,NL -1044006144,1044006399,BE -1044006400,1044006943,NL -1044006944,1044006967,BE -1044006968,1044006975,NL -1044006976,1044007007,BE -1044007008,1044007023,NL -1044007024,1044007031,BE -1044007032,1044007039,NL -1044007040,1044007047,BE -1044007048,1044007055,NL -1044007056,1044007063,BE -1044007064,1044007087,NL -1044007088,1044007119,BE -1044007120,1044007135,NL -1044007136,1044007159,BE -1044007160,1044007967,NL -1044007968,1044007983,BE -1044007984,1044007991,NL -1044007992,1044008007,BE -1044008008,1044008023,NL -1044008024,1044008031,BE -1044008032,1044008039,NL -1044008040,1044008047,BE -1044008048,1044008063,NL -1044008064,1044008095,BE -1044008096,1044008127,NL -1044008128,1044008183,BE -1044008184,1044008223,NL -1044008224,1044008239,BE -1044008240,1044008255,NL -1044008256,1044008279,BE -1044008280,1044008287,NL -1044008288,1044008319,BE -1044008320,1044008735,NL -1044008736,1044009055,BE -1044009056,1044009087,NL -1044009088,1044009215,BE -1044009216,1044009471,NL -1044009472,1044009487,BE -1044009488,1044009503,NL -1044009504,1044009535,BE -1044009536,1044009583,NL -1044009584,1044009599,BE -1044009600,1044011635,NL -1044011636,1044011639,BE -1044011640,1044011971,NL -1044011972,1044012031,BE -1044012032,1044012047,NL -1044012048,1044012063,BE -1044012064,1044012087,NL -1044012088,1044012095,BE -1044012096,1044012103,NL -1044012104,1044012111,BE -1044012112,1044012119,NL -1044012120,1044012135,BE -1044012136,1044012143,NL -1044012144,1044012151,BE -1044012152,1044012159,NL -1044012160,1044012167,BE -1044012168,1044012191,NL -1044012192,1044012207,BE -1044012208,1044012239,NL -1044012240,1044012255,BE -1044012256,1044013055,NL -1044013056,1044013111,BE -1044013112,1044013119,NL -1044013120,1044013135,BE -1044013136,1044013143,NL -1044013144,1044014111,BE -1044014112,1044014119,NL -1044014120,1044017359,BE -1044017360,1044017375,NL -1044017376,1044017663,BE -1044017664,1044017983,NL -1044017984,1044018039,BE -1044018040,1044018047,NL +1043988480,1044013059,NL +1044013060,1044013111,BE +1044013112,1044013143,NL +1044013144,1044013247,BE +1044013248,1044013263,NL +1044013264,1044013271,BE +1044013272,1044013287,NL +1044013288,1044013375,BE +1044013376,1044013567,NL +1044013568,1044013575,BE +1044013576,1044013583,NL +1044013584,1044013615,BE +1044013616,1044013623,NL +1044013624,1044013639,BE +1044013640,1044013647,NL +1044013648,1044013655,BE +1044013656,1044013663,NL +1044013664,1044013735,BE +1044013736,1044013743,NL +1044013744,1044013839,BE +1044013840,1044013847,NL +1044013848,1044013959,BE +1044013960,1044013967,NL +1044013968,1044014047,BE +1044014048,1044014055,NL +1044014056,1044014095,BE +1044014096,1044014135,NL +1044014136,1044014143,BE +1044014144,1044014207,NL +1044014208,1044014223,BE +1044014224,1044014231,NL +1044014232,1044014239,BE +1044014240,1044014247,NL +1044014248,1044014847,BE +1044014848,1044015487,NL +1044015488,1044015531,BE +1044015532,1044015543,NL +1044015544,1044015567,BE +1044015568,1044015583,NL +1044015584,1044015631,BE +1044015632,1044015647,NL +1044015648,1044015679,BE +1044015680,1044015703,NL +1044015704,1044015727,BE +1044015728,1044015743,NL +1044015744,1044015791,BE +1044015792,1044015823,NL +1044015824,1044016647,BE +1044016648,1044016655,NL +1044016656,1044016671,BE +1044016672,1044016703,NL +1044016704,1044016783,BE +1044016784,1044016799,NL +1044016800,1044017167,BE +1044017168,1044017279,NL +1044017280,1044017359,BE +1044017360,1044017383,NL +1044017384,1044017399,BE +1044017400,1044017983,NL +1044017984,1044017999,BE +1044018000,1044018007,NL +1044018008,1044018031,BE +1044018032,1044018047,NL 1044018048,1044018175,BE 1044018176,1044019199,NL -1044019200,1044019279,BE +1044019200,1044019231,BE +1044019232,1044019235,NL +1044019236,1044019279,BE 1044019280,1044019283,NL -1044019284,1044019319,BE -1044019320,1044019323,NL +1044019284,1044019291,BE +1044019292,1044019295,NL +1044019296,1044019315,BE +1044019316,1044019323,NL 1044019324,1044019347,BE 1044019348,1044019351,NL -1044019352,1044019383,BE -1044019384,1044019387,NL -1044019388,1044019695,BE -1044019696,1044019699,NL -1044019700,1044019995,BE -1044019996,1044019999,NL -1044020000,1044020147,BE +1044019352,1044019379,BE +1044019380,1044019399,NL +1044019400,1044019403,BE +1044019404,1044019407,NL +1044019408,1044019415,BE +1044019416,1044019439,NL +1044019440,1044019443,BE +1044019444,1044019475,NL +1044019476,1044019483,BE +1044019484,1044019487,NL +1044019488,1044019491,BE +1044019492,1044019495,NL +1044019496,1044019503,BE +1044019504,1044019507,NL +1044019508,1044019515,BE +1044019516,1044019527,NL +1044019528,1044019531,BE +1044019532,1044019539,NL +1044019540,1044019563,BE +1044019564,1044019567,NL +1044019568,1044019575,BE +1044019576,1044019583,NL +1044019584,1044019695,BE +1044019696,1044019711,NL +1044019712,1044019723,BE +1044019724,1044019731,NL +1044019732,1044019735,BE +1044019736,1044019739,NL +1044019740,1044019743,BE +1044019744,1044019747,NL +1044019748,1044019751,BE +1044019752,1044019755,NL +1044019756,1044019759,BE +1044019760,1044019771,NL +1044019772,1044019775,BE +1044019776,1044019779,NL +1044019780,1044019787,BE +1044019788,1044019799,NL +1044019800,1044019803,BE +1044019804,1044019807,NL +1044019808,1044019811,BE +1044019812,1044019827,NL +1044019828,1044019835,BE +1044019836,1044019843,NL +1044019844,1044019851,BE +1044019852,1044019859,NL +1044019860,1044019867,BE +1044019868,1044019871,NL +1044019872,1044019875,BE +1044019876,1044019887,NL +1044019888,1044019891,BE +1044019892,1044019903,NL +1044019904,1044019907,BE +1044019908,1044019911,NL +1044019912,1044019915,BE +1044019916,1044019919,NL +1044019920,1044019923,BE +1044019924,1044019931,NL +1044019932,1044019939,BE +1044019940,1044019955,NL +1044019956,1044019963,BE +1044019964,1044019979,NL +1044019980,1044019987,BE +1044019988,1044019991,NL +1044019992,1044019995,BE +1044019996,1044020003,NL +1044020004,1044020015,BE +1044020016,1044020019,NL +1044020020,1044020031,BE +1044020032,1044020035,NL +1044020036,1044020039,BE +1044020040,1044020047,NL +1044020048,1044020059,BE +1044020060,1044020071,NL +1044020072,1044020075,BE +1044020076,1044020083,NL +1044020084,1044020127,BE +1044020128,1044020131,NL +1044020132,1044020147,BE 1044020148,1044020151,NL -1044020152,1044020215,BE -1044020216,1044020219,NL -1044020220,1044020311,BE -1044020312,1044020319,NL -1044020320,1044020607,BE +1044020152,1044020155,BE +1044020156,1044020159,NL +1044020160,1044020163,BE +1044020164,1044020167,NL +1044020168,1044020187,BE +1044020188,1044020199,NL +1044020200,1044020203,BE +1044020204,1044020207,NL +1044020208,1044020211,BE +1044020212,1044020219,NL +1044020220,1044020255,BE +1044020256,1044020263,NL +1044020264,1044020303,BE +1044020304,1044020319,NL +1044020320,1044020351,BE +1044020352,1044020359,NL +1044020360,1044020511,BE +1044020512,1044020551,NL +1044020552,1044020567,BE +1044020568,1044020591,NL +1044020592,1044020607,BE 1044020608,1044020671,NL 1044020672,1044020735,BE -1044020736,1044021759,NL -1044021760,1044021887,BE -1044021888,1044022271,NL -1044022272,1044022287,BE -1044022288,1044022319,NL -1044022320,1044022335,BE -1044022336,1044022359,NL -1044022360,1044022399,BE -1044022400,1044022407,NL -1044022408,1044022415,BE -1044022416,1044024063,NL +1044020736,1044024063,NL 1044024064,1044024319,BE -1044024320,1044024447,NL -1044024448,1044024575,BE -1044024576,1044024835,NL -1044024836,1044024843,BE -1044024844,1044024847,NL -1044024848,1044024851,BE -1044024852,1044024855,NL -1044024856,1044024863,BE -1044024864,1044024867,NL -1044024868,1044024875,BE -1044024876,1044024883,NL -1044024884,1044024887,BE -1044024888,1044024891,NL -1044024892,1044024959,BE -1044024960,1044025351,NL -1044025352,1044025855,BE -1044025856,1044026895,NL -1044026896,1044027263,BE -1044027264,1044027423,NL -1044027424,1044027431,BE -1044027432,1044027447,NL -1044027448,1044027455,BE -1044027456,1044027487,NL -1044027488,1044027527,BE -1044027528,1044027543,NL -1044027544,1044027575,BE -1044027576,1044027583,NL -1044027584,1044027591,BE -1044027592,1044027679,NL -1044027680,1044027703,BE -1044027704,1044027727,NL -1044027728,1044027775,BE -1044027776,1044027903,NL -1044027904,1044028799,BE -1044028800,1044028927,NL -1044028928,1044028939,BE -1044028940,1044028947,NL -1044028948,1044028955,BE -1044028956,1044028963,NL -1044028964,1044028987,BE -1044028988,1044028995,NL -1044028996,1044029011,BE -1044029012,1044029015,NL -1044029016,1044029019,BE -1044029020,1044029023,NL -1044029024,1044029027,BE -1044029028,1044029031,NL -1044029032,1044029035,BE -1044029036,1044029051,NL -1044029052,1044029055,BE -1044029056,1044029059,NL -1044029060,1044029067,BE -1044029068,1044029079,NL -1044029080,1044029311,BE -1044029312,1044029441,NL -1044029442,1044029442,BE -1044029443,1044029445,NL -1044029446,1044029448,BE -1044029449,1044029451,NL -1044029452,1044029452,BE -1044029453,1044029453,NL -1044029454,1044029455,BE -1044029456,1044029463,NL -1044029464,1044029466,BE -1044029467,1044029467,NL -1044029468,1044029470,BE -1044029471,1044029479,NL -1044029480,1044029483,BE -1044029484,1044029485,NL -1044029486,1044029487,BE -1044029488,1044029488,NL -1044029489,1044029489,BE -1044029490,1044029492,NL -1044029493,1044029493,BE -1044029494,1044029494,NL -1044029495,1044029497,BE -1044029498,1044029498,NL -1044029499,1044029501,BE -1044029502,1044029502,NL -1044029503,1044029505,BE -1044029506,1044029509,NL -1044029510,1044029510,BE -1044029511,1044029511,NL -1044029512,1044029535,BE -1044029536,1044029536,NL -1044029537,1044029537,BE -1044029538,1044029538,NL -1044029539,1044029545,BE -1044029546,1044029546,NL -1044029547,1044029548,BE -1044029549,1044029549,NL -1044029550,1044029550,BE -1044029551,1044029551,NL -1044029552,1044029552,BE -1044029553,1044029553,NL -1044029554,1044029554,BE -1044029555,1044029556,NL -1044029557,1044029557,BE -1044029558,1044029558,NL -1044029559,1044029561,BE -1044029562,1044029567,NL -1044029568,1044029568,BE -1044029569,1044029569,NL -1044029570,1044029572,BE -1044029573,1044029575,NL -1044029576,1044029580,BE -1044029581,1044029581,NL -1044029582,1044029584,BE -1044029585,1044029585,NL -1044029586,1044029586,BE -1044029587,1044029587,NL -1044029588,1044029590,BE -1044029591,1044029595,NL -1044029596,1044029596,BE -1044029597,1044029598,NL -1044029599,1044029599,BE -1044029600,1044029600,NL -1044029601,1044029601,BE -1044029602,1044029603,NL -1044029604,1044029606,BE -1044029607,1044029608,NL -1044029609,1044029609,BE -1044029610,1044029610,NL -1044029611,1044029611,BE -1044029612,1044029612,NL -1044029613,1044029616,BE -1044029617,1044029618,NL -1044029619,1044029620,BE -1044029621,1044029622,NL -1044029623,1044029625,BE -1044029626,1044029628,NL -1044029629,1044029630,BE -1044029631,1044029631,NL -1044029632,1044029634,BE -1044029635,1044029635,NL -1044029636,1044029636,BE -1044029637,1044029638,NL -1044029639,1044029640,BE -1044029641,1044029641,NL -1044029642,1044029642,BE -1044029643,1044029647,NL -1044029648,1044029648,BE -1044029649,1044029651,NL -1044029652,1044029652,BE -1044029653,1044029659,NL -1044029660,1044029660,BE -1044029661,1044029663,NL -1044029664,1044029665,BE -1044029666,1044029667,NL -1044029668,1044029668,BE -1044029669,1044029669,NL -1044029670,1044029672,BE -1044029673,1044029676,NL -1044029677,1044029678,BE -1044029679,1044029680,NL -1044029681,1044029681,BE -1044029682,1044029682,NL -1044029683,1044029684,BE -1044029685,1044029686,NL -1044029687,1044029687,BE -1044029688,1044029693,NL -1044029694,1044029694,BE -1044029695,1044029719,NL -1044029720,1044029727,BE -1044029728,1044029743,NL -1044029744,1044029767,BE -1044029768,1044029775,NL -1044029776,1044029783,BE -1044029784,1044029831,NL -1044029832,1044029839,BE -1044029840,1044029895,NL -1044029896,1044029903,BE -1044029904,1044029951,NL -1044029952,1044029959,BE -1044029960,1044029967,NL -1044029968,1044029975,BE -1044029976,1044030015,NL -1044030016,1044030023,BE -1044030024,1044030047,NL -1044030048,1044030055,BE -1044030056,1044030111,NL -1044030112,1044030119,BE -1044030120,1044030127,NL -1044030128,1044030135,BE -1044030136,1044030207,NL -1044030208,1044030223,BE -1044030224,1044030279,NL -1044030280,1044030295,BE -1044030296,1044030303,NL -1044030304,1044030311,BE -1044030312,1044030375,NL -1044030376,1044030391,BE -1044030392,1044030399,NL -1044030400,1044030407,BE -1044030408,1044030607,NL -1044030608,1044030615,BE -1044030616,1044030639,NL -1044030640,1044030647,BE -1044030648,1044030727,NL -1044030728,1044030735,BE -1044030736,1044030759,NL -1044030760,1044030767,BE -1044030768,1044030815,NL -1044030816,1044030823,BE -1044030824,1044030879,NL -1044030880,1044030887,BE -1044030888,1044030911,NL -1044030912,1044030919,BE -1044030920,1044030927,NL -1044030928,1044030935,BE -1044030936,1044030999,NL -1044031000,1044031007,BE -1044031008,1044031119,NL -1044031120,1044031127,BE -1044031128,1044031159,NL -1044031160,1044031167,BE -1044031168,1044031271,NL -1044031272,1044031279,BE -1044031280,1044031319,NL -1044031320,1044031327,BE -1044031328,1044031343,NL -1044031344,1044031351,BE -1044031352,1044031359,NL -1044031360,1044031360,BE -1044031361,1044031363,NL -1044031364,1044031364,BE -1044031365,1044031367,NL -1044031368,1044031375,BE -1044031376,1044031399,NL -1044031400,1044031423,BE -1044031424,1044031439,NL -1044031440,1044031447,BE -1044031448,1044031489,NL -1044031490,1044031490,BE -1044031491,1044031494,NL -1044031495,1044031495,BE -1044031496,1044031496,NL -1044031497,1044031497,BE -1044031498,1044031507,NL -1044031508,1044031508,BE -1044031509,1044031509,NL -1044031510,1044031510,BE -1044031511,1044031519,NL -1044031520,1044031520,BE -1044031521,1044031523,NL -1044031524,1044031524,BE -1044031525,1044031531,NL -1044031532,1044031532,BE -1044031533,1044031533,NL -1044031534,1044031536,BE -1044031537,1044031550,NL -1044031551,1044031551,BE -1044031552,1044031552,NL -1044031553,1044031553,BE -1044031554,1044031556,NL -1044031557,1044031557,BE -1044031558,1044031558,NL -1044031559,1044031559,BE -1044031560,1044031562,NL -1044031563,1044031563,BE -1044031564,1044031566,NL -1044031567,1044031567,BE -1044031568,1044031568,NL -1044031569,1044031569,BE -1044031570,1044031571,NL -1044031572,1044031572,BE -1044031573,1044031573,NL -1044031574,1044031574,BE -1044031575,1044031579,NL -1044031580,1044031581,BE -1044031582,1044031582,NL -1044031583,1044031584,BE -1044031585,1044031592,NL -1044031593,1044031593,BE -1044031594,1044031597,NL -1044031598,1044031598,BE -1044031599,1044031599,NL -1044031600,1044031600,BE -1044031601,1044031627,NL -1044031628,1044031628,BE -1044031629,1044031629,NL -1044031630,1044031630,BE -1044031631,1044031635,NL -1044031636,1044031636,BE -1044031637,1044031640,NL -1044031641,1044031641,BE -1044031642,1044031643,NL -1044031644,1044031644,BE -1044031645,1044031651,NL -1044031652,1044031652,BE -1044031653,1044031654,NL -1044031655,1044031655,BE -1044031656,1044031656,NL -1044031657,1044031658,BE -1044031659,1044031666,NL -1044031667,1044031667,BE -1044031668,1044031668,NL -1044031669,1044031670,BE -1044031671,1044031673,NL -1044031674,1044031674,BE -1044031675,1044031675,NL -1044031676,1044031677,BE -1044031678,1044031683,NL -1044031684,1044031684,BE -1044031685,1044031687,NL -1044031688,1044031688,BE -1044031689,1044031690,NL -1044031691,1044031692,BE -1044031693,1044031698,NL -1044031699,1044031699,BE -1044031700,1044031702,NL -1044031703,1044031704,BE -1044031705,1044031709,NL -1044031710,1044031710,BE -1044031711,1044031711,NL -1044031712,1044031712,BE -1044031713,1044031714,NL -1044031715,1044031715,BE -1044031716,1044031717,NL -1044031718,1044031719,BE -1044031720,1044031721,NL -1044031722,1044031723,BE -1044031724,1044031726,NL -1044031727,1044031727,BE -1044031728,1044031799,NL -1044031800,1044031807,BE -1044031808,1044031815,NL -1044031816,1044031839,BE -1044031840,1044031847,NL -1044031848,1044031863,BE -1044031864,1044031879,NL -1044031880,1044031887,BE -1044031888,1044031927,NL -1044031928,1044031935,BE -1044031936,1044031983,NL -1044031984,1044031991,BE -1044031992,1044031999,NL -1044032000,1044032015,BE -1044032016,1044032023,NL -1044032024,1044032031,BE -1044032032,1044032047,NL -1044032048,1044032055,BE -1044032056,1044032071,NL -1044032072,1044032079,BE -1044032080,1044032103,NL -1044032104,1044032127,BE -1044032128,1044032151,NL -1044032152,1044032167,BE -1044032168,1044032191,NL -1044032192,1044032199,BE -1044032200,1044032223,NL -1044032224,1044032239,BE -1044032240,1044032271,NL -1044032272,1044032287,BE -1044032288,1044032303,NL -1044032304,1044032311,BE -1044032312,1044032319,NL -1044032320,1044032327,BE -1044032328,1044032399,NL -1044032400,1044032407,BE -1044032408,1044032527,NL -1044032528,1044032551,BE -1044032552,1044032591,NL -1044032592,1044032615,BE -1044032616,1044032639,NL -1044032640,1044032647,BE -1044032648,1044032695,NL -1044032696,1044032703,BE -1044032704,1044032775,NL -1044032776,1044032783,BE -1044032784,1044032791,NL -1044032792,1044032799,BE -1044032800,1044032815,NL -1044032816,1044032831,BE -1044032832,1044032855,NL -1044032856,1044032863,BE -1044032864,1044032887,NL -1044032888,1044032903,BE -1044032904,1044032991,NL -1044032992,1044032999,BE -1044033000,1044033039,NL -1044033040,1044033047,BE -1044033048,1044033119,NL -1044033120,1044033127,BE -1044033128,1044033151,NL -1044033152,1044033175,BE -1044033176,1044033183,NL -1044033184,1044033191,BE -1044033192,1044033335,NL -1044033336,1044033343,BE -1044033344,1044033351,NL -1044033352,1044033359,BE -1044033360,1044033375,NL -1044033376,1044033407,BE -1044033408,1044033439,NL -1044033440,1044033447,BE -1044033448,1044033527,NL -1044033528,1044033535,BE -1044033536,1044033543,NL -1044033544,1044033551,BE -1044033552,1044033575,NL -1044033576,1044033583,BE -1044033584,1044033623,NL -1044033624,1044033631,BE -1044033632,1044033671,NL -1044033672,1044033687,BE -1044033688,1044033719,NL -1044033720,1044033727,BE -1044033728,1044033895,NL -1044033896,1044033903,BE -1044033904,1044033927,NL -1044033928,1044033935,BE -1044033936,1044033991,NL -1044033992,1044033999,BE -1044034000,1044034015,NL -1044034016,1044034023,BE -1044034024,1044034095,NL -1044034096,1044034119,BE -1044034120,1044034127,NL -1044034128,1044034135,BE -1044034136,1044034207,NL -1044034208,1044034215,BE -1044034216,1044034231,NL -1044034232,1044034239,BE -1044034240,1044034263,NL -1044034264,1044034271,BE -1044034272,1044034279,NL -1044034280,1044034287,BE -1044034288,1044034327,NL -1044034328,1044034335,BE -1044034336,1044034375,NL -1044034376,1044034383,BE -1044034384,1044034487,NL -1044034488,1044034495,BE -1044034496,1044034511,NL -1044034512,1044034519,BE -1044034520,1044034615,NL -1044034616,1044034623,BE -1044034624,1044034735,NL -1044034736,1044034743,BE -1044034744,1044034751,NL -1044034752,1044034759,BE -1044034760,1044034783,NL -1044034784,1044034791,BE -1044034792,1044034847,NL -1044034848,1044034855,BE -1044034856,1044034975,NL -1044034976,1044034983,BE -1044034984,1044035047,NL -1044035048,1044035055,BE -1044035056,1044035063,NL -1044035064,1044035071,BE -1044035072,1044035143,NL -1044035144,1044035151,BE -1044035152,1044035295,NL -1044035296,1044035303,BE -1044035304,1044035327,NL -1044035328,1044035335,BE -1044035336,1044035455,NL -1044035456,1044035471,BE -1044035472,1044035511,NL -1044035512,1044035519,BE -1044035520,1044035583,NL -1044035584,1044035591,BE -1044035592,1044035607,NL -1044035608,1044035615,BE -1044035616,1044035655,NL -1044035656,1044035663,BE -1044035664,1044035711,NL -1044035712,1044035719,BE -1044035720,1044035791,NL -1044035792,1044035799,BE -1044035800,1044035855,NL -1044035856,1044035863,BE -1044035864,1044035943,NL -1044035944,1044035967,BE -1044035968,1044035999,NL -1044036000,1044036007,BE -1044036008,1044036039,NL -1044036040,1044036047,BE -1044036048,1044036079,NL -1044036080,1044036087,BE -1044036088,1044036095,NL -1044036096,1044036103,BE -1044036104,1044036127,NL -1044036128,1044036135,BE -1044036136,1044036183,NL -1044036184,1044036191,BE -1044036192,1044036255,NL -1044036256,1044036271,BE -1044036272,1044036327,NL -1044036328,1044036335,BE -1044036336,1044036471,NL -1044036472,1044036479,BE -1044036480,1044036575,NL -1044036576,1044036607,BE -1044036608,1044036679,NL -1044036680,1044036687,BE -1044036688,1044036775,NL -1044036776,1044036783,BE -1044036784,1044036807,NL -1044036808,1044036815,BE -1044036816,1044036863,NL -1044036864,1044036864,BE -1044036865,1044036865,NL -1044036866,1044036866,BE -1044036867,1044036890,NL -1044036891,1044036891,BE -1044036892,1044036899,NL -1044036900,1044036900,BE -1044036901,1044036907,NL -1044036908,1044036908,BE -1044036909,1044036909,NL -1044036910,1044036910,BE -1044036911,1044036927,NL -1044036928,1044036928,BE -1044036929,1044036942,NL -1044036943,1044036943,BE -1044036944,1044036948,NL -1044036949,1044036951,BE -1044036952,1044036957,NL -1044036958,1044036958,BE -1044036959,1044036967,NL -1044036968,1044036968,BE -1044036969,1044036970,NL -1044036971,1044036971,BE -1044036972,1044036976,NL -1044036977,1044036977,BE -1044036978,1044036984,NL -1044036985,1044036985,BE -1044036986,1044036990,NL -1044036991,1044036991,BE -1044036992,1044037007,NL -1044037008,1044037009,BE -1044037010,1044037014,NL -1044037015,1044037015,BE -1044037016,1044037021,NL -1044037022,1044037022,BE -1044037023,1044037023,NL -1044037024,1044037025,BE -1044037026,1044037026,NL -1044037027,1044037027,BE -1044037028,1044037037,NL -1044037038,1044037038,BE -1044037039,1044037042,NL -1044037043,1044037043,BE -1044037044,1044037047,NL -1044037048,1044037048,BE -1044037049,1044037049,NL -1044037050,1044037051,BE -1044037052,1044037056,NL -1044037057,1044037057,BE -1044037058,1044037061,NL -1044037062,1044037063,BE -1044037064,1044037065,NL -1044037066,1044037066,BE -1044037067,1044037070,NL -1044037071,1044037071,BE -1044037072,1044037074,NL -1044037075,1044037075,BE -1044037076,1044037091,NL -1044037092,1044037092,BE -1044037093,1044037098,NL -1044037099,1044037100,BE -1044037101,1044037101,NL -1044037102,1044037102,BE -1044037103,1044037106,NL -1044037107,1044037107,BE -1044037108,1044037109,NL -1044037110,1044037110,BE -1044037111,1044037159,NL -1044037160,1044037167,BE -1044037168,1044037191,NL -1044037192,1044037199,BE -1044037200,1044037287,NL -1044037288,1044037295,BE -1044037296,1044037647,NL -1044037648,1044037655,BE -1044037656,1044037663,NL -1044037664,1044037671,BE -1044037672,1044037703,NL -1044037704,1044037711,BE -1044037712,1044037735,NL -1044037736,1044037743,BE -1044037744,1044037767,NL -1044037768,1044037783,BE -1044037784,1044037791,NL -1044037792,1044037823,BE -1044037824,1044037831,NL -1044037832,1044037839,BE -1044037840,1044037855,NL -1044037856,1044037887,BE -1044037888,1044038143,NL -1044038144,1044038527,BE -1044038528,1044038535,NL -1044038536,1044038543,BE -1044038544,1044038559,NL -1044038560,1044038567,BE -1044038568,1044038591,NL -1044038592,1044038599,BE -1044038600,1044038783,NL -1044038784,1044038911,BE -1044038912,1044038919,NL -1044038920,1044038927,BE -1044038928,1044038935,NL -1044038936,1044038943,BE -1044038944,1044039751,NL -1044039752,1044039759,BE -1044039760,1044039775,NL -1044039776,1044039807,BE -1044039808,1044039839,NL -1044039840,1044039847,BE -1044039848,1044040071,NL -1044040072,1044040095,BE -1044040096,1044040231,NL -1044040232,1044040239,BE -1044040240,1044040255,NL -1044040256,1044040703,BE -1044040704,1044041727,NL -1044041728,1044043775,BE -1044043776,1044043783,NL -1044043784,1044043787,BE -1044043788,1044043791,NL -1044043792,1044043795,BE -1044043796,1044043799,NL -1044043800,1044043803,BE -1044043804,1044043807,NL -1044043808,1044043811,BE -1044043812,1044043823,NL -1044043824,1044043827,BE -1044043828,1044043835,NL -1044043836,1044043847,BE -1044043848,1044043851,NL -1044043852,1044043879,BE -1044043880,1044043883,NL -1044043884,1044043895,BE -1044043896,1044043903,NL -1044043904,1044043907,BE -1044043908,1044043919,NL -1044043920,1044043927,BE -1044043928,1044043931,NL -1044043932,1044043935,BE -1044043936,1044043943,NL -1044043944,1044043955,BE -1044043956,1044043971,NL -1044043972,1044043975,BE -1044043976,1044043987,NL -1044043988,1044043999,BE -1044044000,1044044003,NL -1044044004,1044044007,BE -1044044008,1044044011,NL -1044044012,1044044015,BE -1044044016,1044044019,NL -1044044020,1044044027,BE -1044044028,1044044035,NL -1044044036,1044044043,BE -1044044044,1044044051,NL -1044044052,1044044055,BE -1044044056,1044044059,NL -1044044060,1044044067,BE -1044044068,1044044083,NL -1044044084,1044044095,BE -1044044096,1044044119,NL -1044044120,1044044131,BE -1044044132,1044044135,NL -1044044136,1044044143,BE -1044044144,1044044171,NL -1044044172,1044044187,BE -1044044188,1044044215,NL -1044044216,1044044223,BE -1044044224,1044044243,NL -1044044244,1044044247,BE -1044044248,1044044251,NL -1044044252,1044045311,BE -1044045312,1044045695,NL -1044045696,1044046079,BE -1044046080,1044046223,NL -1044046224,1044046231,BE -1044046232,1044046239,NL +1044024320,1044045823,NL +1044045824,1044045855,BE +1044045856,1044045887,NL +1044045888,1044045911,BE +1044045912,1044045919,NL +1044045920,1044046079,BE +1044046080,1044046239,NL 1044046240,1044046319,BE 1044046320,1044046327,NL 1044046328,1044046847,BE -1044046848,1044051971,NL -1044051972,1044052031,BE +1044046848,1044051967,NL +1044051968,1044051987,BE +1044051988,1044051991,NL +1044051992,1044051995,BE +1044051996,1044051999,NL +1044052000,1044052011,BE +1044052012,1044052015,NL +1044052016,1044052031,BE 1044052032,1044052039,NL 1044052040,1044052063,BE 1044052064,1044052067,NL 1044052068,1044052107,BE 1044052108,1044052111,NL -1044052112,1044052255,BE +1044052112,1044052131,BE +1044052132,1044052135,NL +1044052136,1044052151,BE +1044052152,1044052155,NL +1044052156,1044052223,BE +1044052224,1044052227,NL +1044052228,1044052255,BE 1044052256,1044052259,NL 1044052260,1044052347,BE 1044052348,1044052359,NL 1044052360,1044052363,BE -1044052364,1044052371,NL -1044052372,1044053455,BE +1044052364,1044052971,NL +1044052972,1044052983,BE +1044052984,1044052999,NL +1044053000,1044053055,BE +1044053056,1044053071,NL +1044053072,1044053255,BE +1044053256,1044053263,NL +1044053264,1044053399,BE +1044053400,1044053415,NL +1044053416,1044053423,BE +1044053424,1044053431,NL +1044053432,1044053455,BE 1044053456,1044053463,NL 1044053464,1044053503,BE -1044053504,1044059263,NL -1044059264,1044059935,BE -1044059936,1044060031,NL -1044060032,1044060063,BE -1044060064,1044061391,NL -1044061392,1044061399,BE -1044061400,1044061767,NL -1044061768,1044061775,BE -1044061776,1044061887,NL -1044061888,1044061895,BE -1044061896,1044062015,NL -1044062016,1044062031,BE -1044062032,1044062039,NL -1044062040,1044062047,BE -1044062048,1044062103,NL -1044062104,1044062111,BE -1044062112,1044062175,NL -1044062176,1044062199,BE -1044062200,1044062223,NL -1044062224,1044062239,BE -1044062240,1044062375,NL -1044062376,1044062383,BE -1044062384,1044062407,NL -1044062408,1044062415,BE -1044062416,1044062463,NL -1044062464,1044062471,BE -1044062472,1044062503,NL -1044062504,1044062527,BE -1044062528,1044062535,NL -1044062536,1044062543,BE -1044062544,1044062575,NL -1044062576,1044062583,BE -1044062584,1044062647,NL -1044062648,1044062655,BE -1044062656,1044062663,NL -1044062664,1044062671,BE -1044062672,1044068351,NL -1044068352,1044068991,BE -1044068992,1044069631,NL -1044069632,1044070399,BE -1044070400,1044076607,NL -1044076608,1044076927,BE -1044076928,1044077823,NL -1044077824,1044078591,BE -1044078592,1044092927,NL -1044092928,1044093183,BE -1044093184,1044104543,NL -1044104544,1044104559,BE -1044104560,1044104831,NL -1044104832,1044104959,BE -1044104960,1044105151,NL -1044105152,1044106771,BE +1044053504,1044106239,NL +1044106240,1044106367,BE +1044106368,1044106495,NL +1044106496,1044106763,BE +1044106764,1044106767,NL +1044106768,1044106771,BE 1044106772,1044106775,NL 1044106776,1044106787,BE 1044106788,1044106795,NL -1044106796,1044106811,BE -1044106812,1044106815,NL -1044106816,1044107263,BE -1044107264,1044117503,NL -1044117504,1044117551,BE -1044117552,1044117567,NL -1044117568,1044118527,BE +1044106796,1044106807,BE +1044106808,1044117503,NL +1044117504,1044117543,BE +1044117544,1044117567,NL +1044117568,1044117847,BE +1044117848,1044117855,NL +1044117856,1044118527,BE 1044118528,1044119551,NL 1044119552,1044152319,GB 1044152320,1044185087,IR @@ -3798,37 +3969,54 @@ 1044201472,1044217855,FI 1044217856,1044226047,DK 1044226048,1044234239,OM +1044234240,1044250623,DZ 1044250624,1044251391,BE +1044251392,1044251647,EU 1044251648,1044252415,BE +1044252416,1044252927,EU 1044252928,1044253439,BE +1044253440,1044253695,EU 1044253696,1044254463,BE +1044254464,1044254975,EU 1044254976,1044255487,BE +1044255488,1044255999,EU 1044256000,1044256511,BE +1044256512,1044256767,EU 1044256768,1044257535,BE +1044257536,1044257791,EU 1044257792,1044258559,BE +1044258560,1044259071,EU 1044259072,1044259583,BE +1044259584,1044260095,EU 1044260096,1044261631,BE +1044261632,1044262143,EU 1044262144,1044262399,BE +1044262400,1044263167,EU 1044263168,1044263423,BE +1044263424,1044264191,EU 1044264192,1044264447,BE +1044264448,1044265215,EU 1044265216,1044265471,BE +1044265472,1044265983,EU 1044265984,1044266751,BE +1044266752,1044267519,EU 1044267520,1044269567,BE +1044269568,1044270079,EU 1044270080,1044271615,BE +1044271616,1044272127,EU 1044272128,1044272383,BE +1044272384,1044272895,EU 1044272896,1044273151,BE -1044273408,1044273663,BE -1044273920,1044274175,BE +1044273152,1044283391,EU 1044283392,1044316159,FR 1044316160,1044332543,NO 1044332544,1044348927,RU 1044348928,1044365311,LV 1044365312,1044381695,SE -1044381696,1044383999,RU -1044384000,1044384255,KZ -1044384256,1044384511,TJ +1044381696,1044384511,RU 1044384512,1044384767,KZ 1044384768,1044389887,RU +1044389888,1044398079,FR 1044398080,1044414463,UA 1044414464,1044447231,GB 1044447232,1044451583,SE @@ -3845,15 +4033,15 @@ 1044454512,1044454559,NO 1044454560,1044454583,SE 1044454584,1044454655,NO -1044454656,1044454911,SE -1044454912,1044455423,NO +1044454656,1044455423,SE 1044455424,1044463615,EE 1044463616,1044479999,SE 1044480000,1044488191,CH 1044488192,1044496383,SK 1044496384,1044512767,EE 1044512768,1044578303,DK -1044578304,1044586495,GB +1044578304,1044580607,DE +1044580608,1044586495,GB 1044586496,1044587007,DE 1044587008,1044587519,GB 1044587520,1044587775,DE @@ -3862,34 +4050,34 @@ 1044588288,1044588575,GB 1044588576,1044588607,DE 1044588608,1044588799,GB -1044588800,1044590335,DE -1044590336,1044590591,GB +1044588800,1044590463,DE +1044590464,1044590591,GB 1044590592,1044590671,DE 1044590672,1044590847,GB -1044590848,1044591359,DE -1044591360,1044591871,GB +1044590848,1044591615,DE +1044591616,1044591871,GB 1044591872,1044592127,DE 1044592128,1044592143,GB -1044592144,1044592175,DE -1044592176,1044592191,GB +1044592144,1044592159,DE +1044592160,1044592191,GB 1044592192,1044592255,DE 1044592256,1044592639,GB 1044592640,1044592655,DE 1044592656,1044592831,GB -1044592832,1044594175,DE -1044594176,1044625407,GB -1044625408,1044625455,DE -1044625456,1044627967,GB -1044627968,1044628479,DE -1044628480,1044628991,GB -1044628992,1044629055,DE -1044629056,1044629503,GB +1044592832,1044594431,DE +1044594432,1044625407,GB +1044625408,1044625463,DE +1044625464,1044625471,GB +1044625472,1044625535,DE +1044625536,1044625663,GB +1044625664,1044625679,DE +1044625680,1044627455,GB +1044627456,1044628479,DE +1044628480,1044629503,GB 1044629504,1044629759,DE -1044629760,1044630527,GB -1044630528,1044630783,DE -1044630784,1044631551,GB -1044631552,1044631935,DE -1044631936,1044631951,GB +1044629760,1044631551,GB +1044631552,1044631871,DE +1044631872,1044631951,GB 1044631952,1044631967,DE 1044631968,1044632063,GB 1044632064,1044633855,DE @@ -3904,37 +4092,57 @@ 1044636160,1044638207,DE 1044638208,1044638223,GB 1044638224,1044638239,DE -1044638240,1044638271,GB -1044638272,1044638335,DE -1044638336,1044638463,GB +1044638240,1044638463,GB 1044638464,1044638719,DE -1044638720,1044638975,GB -1044638976,1044639231,DE -1044639232,1044639743,GB -1044639744,1044643327,DE +1044638720,1044639743,GB +1044639744,1044642303,DE +1044642304,1044642815,GB +1044642816,1044643327,DE 1044643328,1044643839,GB 1044643840,1044652031,DE +1044652032,1044660223,LY 1044660224,1044664895,GR 1044664896,1044664959,IR -1044664960,1044668415,GR +1044664960,1044665535,GR +1044665536,1044665551,IQ +1044665552,1044668415,GR +1044668416,1044676607,BA 1044676608,1044684799,RU 1044684800,1044692991,HU -1044692992,1044701183,TR +1044692992,1044697087,AT +1044697088,1044697343,DE +1044697344,1044701183,AT +1044701184,1044709375,EG 1044709376,1044717567,RU 1044717568,1044742143,GB 1044742144,1044750335,KW -1044750336,1044758527,NL +1044750336,1044750351,US +1044750352,1044750355,HU +1044750356,1044750359,BE +1044750360,1044750363,GB +1044750364,1044750367,FI +1044750368,1044753151,NL +1044753152,1044753183,DE +1044753184,1044753215,HU +1044753216,1044758527,NL 1044758528,1044774911,PL -1044774912,1044775559,NO -1044775560,1044775567,GB -1044775568,1044776175,NO -1044776176,1044776191,GB -1044776192,1044840447,NO -1044840448,1044905983,FI -1044905984,1044908031,DE +1044774912,1044800383,NO +1044800384,1044800511,IT +1044800512,1044840447,NO +1044840448,1044842751,FI +1044842752,1044842815,AX +1044842816,1044905983,FI +1044905984,1044908031,GB 1044908032,1044909055,US -1044909056,1044914175,DE -1044914176,1044916735,GB +1044909056,1044910847,GB +1044910848,1044911103,DE +1044911104,1044913951,GB +1044913952,1044913967,DE +1044913968,1044913983,GB +1044913984,1044914015,DE +1044914016,1044914047,GB +1044914048,1044914111,DE +1044914112,1044916735,GB 1044916736,1044917247,DE 1044917248,1044917279,GB 1044917280,1044917295,US @@ -3952,126 +4160,287 @@ 1044920320,1044921343,GB 1044921344,1044922367,US 1044922368,1044930559,DE -1044930560,1044930823,BE +1044930560,1044930695,BE +1044930696,1044930703,GB +1044930704,1044930775,BE +1044930776,1044930783,GB +1044930784,1044930791,BE +1044930792,1044930795,GB +1044930796,1044930799,BE +1044930800,1044930807,GB +1044930808,1044930823,BE 1044930824,1044930831,GB 1044930832,1044930847,BE -1044930848,1044930879,GB -1044930880,1044930967,BE -1044930968,1044930975,GB -1044930976,1044931023,BE -1044931024,1044931027,GB -1044931028,1044931103,BE -1044931104,1044931107,GB -1044931108,1044931263,BE -1044931264,1044931295,GB -1044931296,1044932131,BE -1044932132,1044932191,GB -1044932192,1044932295,BE -1044932296,1044932303,GB -1044932304,1044932399,BE +1044930848,1044930879,FR +1044930880,1044930911,BE +1044930912,1044930927,DE +1044930928,1044930967,BE +1044930968,1044930975,FR +1044930976,1044930979,GB +1044930980,1044931375,BE +1044931376,1044931391,GB +1044931392,1044931407,BE +1044931408,1044931439,GB +1044931440,1044931487,BE +1044931488,1044931495,GB +1044931496,1044931535,BE +1044931536,1044931543,GB +1044931544,1044931551,BE +1044931552,1044931567,GB +1044931568,1044931583,BE +1044931584,1044931623,GB +1044931624,1044931663,BE +1044931664,1044931671,GB +1044931672,1044931759,BE +1044931760,1044931775,GB +1044931776,1044931831,BE +1044931832,1044931835,GB +1044931836,1044931855,BE +1044931856,1044931871,GB +1044931872,1044931903,BE +1044931904,1044931911,GB +1044931912,1044931915,BE +1044931916,1044931919,GB +1044931920,1044931935,BE +1044931936,1044931951,GB +1044931952,1044931975,BE +1044931976,1044931983,GB +1044931984,1044932063,BE +1044932064,1044932087,GB +1044932088,1044932383,BE +1044932384,1044932391,GB +1044932392,1044932399,BE 1044932400,1044932407,GB 1044932408,1044932503,BE 1044932504,1044932543,GB -1044932544,1044932675,BE -1044932676,1044932679,GB -1044932680,1044932703,BE +1044932544,1044932607,BE +1044932608,1044932671,LU +1044932672,1044932675,BE +1044932676,1044932687,GB +1044932688,1044932703,BE 1044932704,1044932707,GB -1044932708,1044932807,BE -1044932808,1044932815,GB -1044932816,1044932855,BE -1044932856,1044932863,GB -1044932864,1044932919,BE -1044932920,1044932927,GB -1044932928,1044932951,BE +1044932708,1044932719,BE +1044932720,1044932727,GB +1044932728,1044932735,BE +1044932736,1044932799,GB +1044932800,1044932831,BE +1044932832,1044932839,GB +1044932840,1044932847,BE +1044932848,1044932863,GB +1044932864,1044932939,BE +1044932940,1044932947,GB +1044932948,1044932951,BE 1044932952,1044932959,GB -1044932960,1044933055,BE +1044932960,1044933007,BE +1044933008,1044933015,GB +1044933016,1044933023,BE +1044933024,1044933039,GB +1044933040,1044933055,BE 1044933056,1044933071,GB -1044933072,1044933303,BE +1044933072,1044933215,BE +1044933216,1044933227,GB +1044933228,1044933303,BE 1044933304,1044933311,GB -1044933312,1044933823,BE +1044933312,1044933359,BE +1044933360,1044933375,GB +1044933376,1044933407,BE +1044933408,1044933411,GB +1044933412,1044933415,BE +1044933416,1044933439,GB +1044933440,1044933511,BE +1044933512,1044933519,GB +1044933520,1044933551,BE +1044933552,1044933555,GB +1044933556,1044933583,BE +1044933584,1044933599,GB +1044933600,1044933615,BE +1044933616,1044933623,GB +1044933624,1044933711,BE +1044933712,1044933719,GB +1044933720,1044933727,BE +1044933728,1044933735,GB +1044933736,1044933743,BE +1044933744,1044933759,GB +1044933760,1044933823,BE 1044933824,1044933831,GB 1044933832,1044933843,BE 1044933844,1044933847,GB -1044933848,1044934311,BE -1044934312,1044934319,GB -1044934320,1044934359,BE -1044934360,1044934367,GB -1044934368,1044934463,BE -1044934464,1044934495,GB -1044934496,1044934783,BE -1044934784,1044934823,GB -1044934824,1044934847,BE -1044934848,1044934911,GB +1044933848,1044933863,BE +1044933864,1044933871,GB +1044933872,1044934103,BE +1044934104,1044934111,GB +1044934112,1044934191,BE +1044934192,1044934199,GB +1044934200,1044934239,BE +1044934240,1044934247,GB +1044934248,1044934359,BE +1044934360,1044934503,GB +1044934504,1044934575,BE +1044934576,1044934583,GB +1044934584,1044934591,BE +1044934592,1044934599,GB +1044934600,1044934719,BE +1044934720,1044934783,GB +1044934784,1044934815,BE +1044934816,1044934819,GB +1044934820,1044934823,BE +1044934824,1044934911,GB 1044934912,1044935027,BE -1044935028,1044935039,GB -1044935040,1044935231,BE +1044935028,1044935031,GB +1044935032,1044935035,BE +1044935036,1044935039,GB +1044935040,1044935183,BE +1044935184,1044935199,GB +1044935200,1044935231,BE 1044935232,1044935247,GB -1044935248,1044935331,BE -1044935332,1044935335,GB -1044935336,1044935351,BE -1044935352,1044935359,GB -1044935360,1044935391,BE -1044935392,1044935431,GB -1044935432,1044935479,BE -1044935480,1044935487,GB -1044935488,1044935591,BE -1044935592,1044935623,GB -1044935624,1044935647,BE -1044935648,1044935671,GB -1044935672,1044936123,BE -1044936124,1044936135,GB -1044936136,1044936207,BE +1044935248,1044935263,BE +1044935264,1044935295,GB +1044935296,1044935331,BE +1044935332,1044935343,GB +1044935344,1044935355,BE +1044935356,1044935391,GB +1044935392,1044935407,BE +1044935408,1044935423,GB +1044935424,1044935431,BE +1044935432,1044935439,LU +1044935440,1044935551,BE +1044935552,1044935559,GB +1044935560,1044935595,BE +1044935596,1044935599,GB +1044935600,1044935623,BE +1044935624,1044935631,GB +1044935632,1044935743,BE +1044935744,1044935751,GB +1044935752,1044935839,BE +1044935840,1044935847,GB +1044935848,1044935879,BE +1044935880,1044935887,GB +1044935888,1044935903,BE +1044935904,1044936063,GB +1044936064,1044936103,BE +1044936104,1044936111,GB +1044936112,1044936123,BE +1044936124,1044936151,GB +1044936152,1044936207,BE 1044936208,1044936215,GB -1044936216,1044936447,BE -1044936448,1044936471,GB -1044936472,1044936479,BE -1044936480,1044936503,GB -1044936504,1044936831,BE -1044936832,1044936847,GB -1044936848,1044936991,BE -1044936992,1044937023,GB -1044937024,1044937183,BE +1044936216,1044936271,BE +1044936272,1044936287,GB +1044936288,1044936303,BE +1044936304,1044936311,GB +1044936312,1044936335,BE +1044936336,1044936351,GB +1044936352,1044936439,BE +1044936440,1044936447,GB +1044936448,1044936455,BE +1044936456,1044936463,GB +1044936464,1044936495,BE +1044936496,1044936503,GB +1044936504,1044936711,BE +1044936712,1044936719,GB +1044936720,1044937183,BE 1044937184,1044937187,GB 1044937188,1044937287,BE -1044937288,1044937295,GB -1044937296,1044937391,BE +1044937288,1044937311,GB +1044937312,1044937391,BE 1044937392,1044937399,GB -1044937400,1044937535,BE +1044937400,1044937487,BE +1044937488,1044937503,GB +1044937504,1044937527,BE +1044937528,1044937531,GB +1044937532,1044937535,BE 1044937536,1044937551,GB -1044937552,1044937591,BE +1044937552,1044937567,BE +1044937568,1044937583,GB +1044937584,1044937591,BE 1044937592,1044937599,GB -1044937600,1044937847,BE -1044937848,1044937855,GB -1044937856,1044937903,BE -1044937904,1044937911,GB -1044937912,1044938111,BE +1044937600,1044937615,BE +1044937616,1044937631,GB +1044937632,1044937679,BE +1044937680,1044937695,GB +1044937696,1044937703,BE +1044937704,1044937711,GB +1044937712,1044937747,BE +1044937748,1044937759,GB +1044937760,1044937847,BE +1044937848,1044937887,GB +1044937888,1044937903,BE +1044937904,1044937915,GB +1044937916,1044937971,BE +1044937972,1044937975,GB +1044937976,1044938047,BE +1044938048,1044938079,GB +1044938080,1044938103,BE +1044938104,1044938107,GB +1044938108,1044938111,BE 1044938112,1044938143,GB -1044938144,1044938495,BE -1044938496,1044938511,GB +1044938144,1044938235,BE +1044938236,1044938271,GB +1044938272,1044938367,BE +1044938368,1044938399,GB +1044938400,1044938407,BE +1044938408,1044938415,GB +1044938416,1044938423,BE +1044938424,1044938431,GB +1044938432,1044938487,BE +1044938488,1044938511,GB 1044938512,1044938519,BE -1044938520,1044938527,GB -1044938528,1044938631,BE -1044938632,1044938655,GB -1044938656,1044938687,BE -1044938688,1044946943,GB +1044938520,1044938523,GB +1044938524,1044938559,BE +1044938560,1044938623,LU +1044938624,1044938631,BE +1044938632,1044938639,GB +1044938640,1044938655,BE +1044938656,1044938695,GB +1044938696,1044938703,BE +1044938704,1044938719,GB +1044938720,1044938751,LU +1044938752,1044946943,GB 1044946944,1044955135,UA 1044955136,1044963327,NL 1044963328,1044971519,FI 1044971520,1044979711,FR 1044979712,1044987903,FI 1044987904,1045004287,BG -1045004288,1045004671,GB -1045004672,1045004751,IE -1045004752,1045018207,GB +1045004288,1045013231,GB +1045013232,1045013247,IE +1045013248,1045013455,GB +1045013456,1045013471,IE +1045013472,1045018207,GB 1045018208,1045018231,FI -1045018232,1045020671,GB +1045018232,1045018367,GB +1045018368,1045018423,ES +1045018424,1045018431,GB +1045018432,1045018559,ES +1045018560,1045018623,GB +1045018624,1045018751,ES +1045018752,1045020159,GB +1045020160,1045020255,ES +1045020256,1045020287,GB +1045020288,1045020519,ES +1045020520,1045020527,GB +1045020528,1045020543,ES +1045020544,1045020671,GB 1045020672,1045037055,NO 1045037056,1045119231,GR 1045119232,1045119743,AL 1045119744,1045135359,GR -1045135360,1045138431,DE -1045138432,1045138463,AT -1045138464,1045168127,DE +1045135360,1045141759,DE +1045141760,1045142015,PL +1045142016,1045154559,DE +1045154560,1045154591,NL +1045154592,1045154623,DE +1045154624,1045154655,GB +1045154656,1045154751,DE +1045154752,1045154783,SE +1045154784,1045155071,DE +1045155072,1045155327,CH +1045155328,1045160959,DE +1045160960,1045160991,TR +1045160992,1045161023,DE +1045161024,1045161055,AT +1045161056,1045161151,DE +1045161152,1045161183,PT +1045161184,1045168127,DE 1045168128,1045233663,RU 1045233664,1045241855,GB 1045241856,1045250047,IT @@ -4080,50 +4449,52 @@ 1045274624,1045282815,IE 1045282816,1045299199,HU 1045299200,1045302271,GB +1045302272,1045303295,EU 1045303296,1045305855,DE -1045307392,1045315583,GB +1045305856,1045307391,EU +1045307392,1045315583,RU 1045315584,1045319679,DE +1045319680,1045323775,RU 1045323776,1045364735,FI 1045364736,1045430271,DK -1045430272,1045430887,DE -1045430888,1045430895,CH -1045430896,1045436911,DE +1045430272,1045436911,DE 1045436912,1045436919,GB 1045436920,1045446655,DE 1045446656,1045446911,HU 1045446912,1045447167,SK 1045447168,1045447231,HU -1045447232,1045447239,CZ +1045447232,1045447239,SK 1045447240,1045447263,HU -1045447264,1045447279,CZ +1045447264,1045447279,SK 1045447280,1045447287,HU -1045447288,1045447295,CZ +1045447288,1045447295,SK 1045447296,1045447311,HU -1045447312,1045447423,CZ +1045447312,1045447423,SK 1045447424,1045447431,HU -1045447432,1045447439,CZ +1045447432,1045447439,SK 1045447440,1045447447,HU -1045447448,1045447471,CZ +1045447448,1045447471,SK 1045447472,1045447551,HU -1045447552,1045448031,CZ +1045447552,1045448031,SK 1045448032,1045448039,HU -1045448040,1045448055,CZ +1045448040,1045448055,SK 1045448056,1045448063,HU -1045448064,1045448159,CZ +1045448064,1045448159,SK 1045448160,1045448191,HU -1045448192,1045448239,CZ +1045448192,1045448239,SK 1045448240,1045448263,HU -1045448264,1045448543,CZ -1045448544,1045448559,SK -1045448560,1045448703,CZ +1045448264,1045448703,SK 1045448704,1045448767,HU -1045448768,1045449471,CZ -1045449472,1045449727,HU -1045449728,1045452543,CZ -1045452544,1045452799,SK -1045452800,1045454847,CZ -1045454848,1045460735,DE -1045460736,1045460991,NL +1045448768,1045450751,SK +1045450752,1045451263,CZ +1045451264,1045451775,SK +1045451776,1045452079,CZ +1045452080,1045452159,SK +1045452160,1045452287,CZ +1045452288,1045452799,SK +1045452800,1045453055,CZ +1045453056,1045454847,SK +1045454848,1045460991,DE 1045460992,1045461503,FR 1045461504,1045461631,DE 1045461632,1045461695,FR @@ -4134,7 +4505,9 @@ 1045461728,1045461735,ES 1045461736,1045461743,NL 1045461744,1045463039,DE -1045463040,1045471231,FI +1045463040,1045467487,FI +1045467488,1045467519,AX +1045467520,1045471231,FI 1045471232,1045479423,UA 1045479424,1045487615,SE 1045487616,1045495807,LT @@ -4145,27 +4518,25 @@ 1045716992,1045725183,RU 1045725184,1045733375,CZ 1045733376,1045741567,GB -1045741568,1045741839,SE -1045741840,1045741855,GB -1045741856,1045741887,SE -1045741888,1045742039,GB -1045742040,1045742047,SE -1045742048,1045742063,GB -1045742064,1045742127,SE -1045742128,1045742175,GB -1045742176,1045742199,SE -1045742200,1045742207,GB -1045742208,1045742239,SE +1045741568,1045741887,SE +1045741888,1045741951,GB +1045741952,1045742015,SE +1045742016,1045742023,GB +1045742024,1045742031,SE +1045742032,1045742039,GB +1045742040,1045742063,SE +1045742064,1045742111,GB +1045742112,1045742135,SE +1045742136,1045742143,NL +1045742144,1045742151,SE +1045742152,1045742159,DK +1045742160,1045742167,SE +1045742168,1045742175,DK +1045742176,1045742239,SE 1045742240,1045742247,GB -1045742248,1045742271,SE -1045742272,1045742335,GB -1045742336,1045742351,SE -1045742352,1045742367,GB -1045742368,1045742383,SE +1045742248,1045742383,SE 1045742384,1045742391,GB -1045742392,1045742399,SE -1045742400,1045742431,GB -1045742432,1045742495,SE +1045742392,1045742495,SE 1045742496,1045742535,GB 1045742536,1045742551,SE 1045742552,1045742559,GB @@ -4174,62 +4545,65 @@ 1045742768,1045742783,SE 1045742784,1045742831,GB 1045742832,1045742839,SE -1045742840,1045742975,GB -1045742976,1045743023,SE +1045742840,1045742847,GB +1045742848,1045743023,SE 1045743024,1045743031,GB 1045743032,1045743039,SE -1045743040,1045743063,GB +1045743040,1045743047,GB +1045743048,1045743063,NL 1045743064,1045743095,SE -1045743096,1045743183,GB -1045743184,1045743191,SE -1045743192,1045743199,GB -1045743200,1045743247,SE -1045743248,1045743263,GB -1045743264,1045743679,SE +1045743096,1045743099,GB +1045743100,1045743247,SE +1045743248,1045743251,GB +1045743252,1045743295,SE +1045743296,1045743299,GB +1045743300,1045743679,SE 1045743680,1045743743,GB -1045743744,1045743783,SE -1045743784,1045743791,GB -1045743792,1045743803,SE +1045743744,1045743803,SE 1045743804,1045743807,GB 1045743808,1045743999,SE -1045744000,1045744063,GB -1045744064,1045744383,SE -1045744384,1045745407,GB -1045745408,1045745599,SE -1045745600,1045745623,GB -1045745624,1045745639,SE -1045745640,1045745647,GB -1045745648,1045745655,SE +1045744000,1045744007,LU +1045744008,1045744015,GB +1045744016,1045744031,SE +1045744032,1045744063,GB +1045744064,1045744639,SE +1045744640,1045744671,BE +1045744672,1045744703,SE +1045744704,1045745407,GB +1045745408,1045745607,SE +1045745608,1045745615,FI +1045745616,1045745623,GB +1045745624,1045745655,SE 1045745656,1045745663,GB 1045745664,1045745695,SE 1045745696,1045745759,GB 1045745760,1045745768,SE -1045745769,1045745879,GB -1045745880,1045745919,SE -1045745920,1045745999,GB +1045745769,1045745791,GB +1045745792,1045745855,SE +1045745856,1045745879,GB +1045745880,1045745951,SE +1045745952,1045745999,GB 1045746000,1045746079,SE 1045746080,1045746095,GB -1045746096,1045746111,SE -1045746112,1045746143,GB -1045746144,1045746159,SE -1045746160,1045746175,GB +1045746096,1045746163,SE +1045746164,1045746175,GB 1045746176,1045746431,SE 1045746432,1045746447,GB 1045746448,1045746463,SE -1045746464,1045746543,GB +1045746464,1045746495,GB +1045746496,1045746527,SE +1045746528,1045746543,GB 1045746544,1045746559,SE -1045746560,1045746687,GB -1045746688,1045747071,SE +1045746560,1045746671,GB +1045746672,1045747071,SE 1045747072,1045747199,GB 1045747200,1045747455,SE 1045747456,1045747583,GB 1045747584,1045747615,SE 1045747616,1045747679,GB 1045747680,1045747711,SE -1045747712,1045747743,GB -1045747744,1045747751,SE -1045747752,1045747759,GB -1045747760,1045747775,SE +1045747712,1045747751,GB +1045747752,1045747775,SE 1045747776,1045747815,GB 1045747816,1045747823,SE 1045747824,1045747839,GB @@ -4244,13 +4618,17 @@ 1045748296,1045748303,SE 1045748304,1045748319,GB 1045748320,1045748351,SE -1045748352,1045748399,GB +1045748352,1045748391,GB +1045748392,1045748395,SE +1045748396,1045748399,GB 1045748400,1045748407,SE 1045748408,1045748463,GB -1045748464,1045748479,SE -1045748480,1045757951,GB +1045748464,1045748735,SE +1045748736,1045749503,GB +1045749504,1045749759,SE +1045749760,1045757951,GB 1045757952,1045790719,LV -1045790720,1045798911,TR +1045790720,1045798911,FR 1045798912,1045889023,IT 1045889024,1045921791,ES 1045921792,1045954559,PL @@ -4262,79 +4640,138 @@ 1046052864,1046061055,GB 1046061056,1046069247,DE 1046069248,1046085631,RU -1046085632,1046151167,IL +1046085632,1046150143,IL +1046150144,1046150399,LR +1046150400,1046151167,IL 1046151168,1046216703,DE -1046216704,1046220959,NO -1046220960,1046220975,SE -1046220976,1046229111,NO +1046216704,1046225647,NO +1046225648,1046225655,SE +1046225656,1046229111,NO 1046229112,1046229119,SE 1046229120,1046282239,NO -1046282240,1046290431,GB +1046282240,1046283007,DE +1046283008,1046283263,BZ +1046283264,1046283327,LU +1046283328,1046284287,DE +1046284288,1046285311,BZ +1046285312,1046286663,DE +1046286664,1046286671,BZ +1046286672,1046286927,DE +1046286928,1046286935,ES +1046286936,1046288383,DE +1046288384,1046288663,CZ +1046288664,1046288895,DE +1046288896,1046290431,AG 1046290432,1046298623,PL -1046298624,1046315007,AT +1046298624,1046299903,AT +1046299904,1046300159,MK +1046300160,1046300799,AT +1046300800,1046300927,MK +1046300928,1046302143,AT +1046302144,1046302207,MK +1046302208,1046302911,AT +1046302912,1046302975,MK +1046302976,1046305279,AT +1046305280,1046305407,MK +1046305408,1046305535,AT +1046305536,1046305663,MK +1046305664,1046305791,AT +1046305792,1046306815,MK +1046306816,1046308927,AT +1046308928,1046309503,MK +1046309504,1046309887,AT +1046309888,1046310143,MK +1046310144,1046310399,AT +1046310400,1046311935,MK +1046311936,1046315007,AT 1046315008,1046315519,FR 1046315520,1046316031,IT -1046316032,1046316543,BE +1046316032,1046316543,FR 1046316544,1046317055,DK 1046317056,1046317567,ES -1046317568,1046318079,SE -1046318080,1046318335,NL +1046317568,1046317823,GB +1046317824,1046318335,NL 1046318336,1046318591,GB -1046318592,1046319103,IL -1046319104,1046323199,GB +1046318592,1046320127,NL +1046320128,1046320639,GB +1046320640,1046323199,NL 1046323200,1046327151,ES 1046327152,1046327155,FR -1046327156,1046331383,ES -1046331384,1046331391,PT -1046331392,1046331903,DE +1046327156,1046331391,ES +1046331392,1046331455,DE +1046331456,1046331647,EU +1046331648,1046331679,DE +1046331680,1046331743,EU +1046331744,1046331775,DE +1046331776,1046331839,EU +1046331840,1046331871,DE +1046331872,1046331903,EU 1046331904,1046332159,NL 1046332160,1046332415,FR -1046332416,1046339839,DE +1046332416,1046333439,EU +1046333440,1046333695,DE +1046333696,1046334719,EU +1046334720,1046334975,DE +1046334976,1046336223,EU +1046336224,1046336255,DE +1046336256,1046336511,EU +1046336512,1046337023,DE +1046337024,1046337535,EU +1046337536,1046338047,DE +1046338048,1046339839,EU 1046339840,1046340095,FR -1046340096,1046341151,NL -1046341152,1046341631,DE -1046341632,1046342143,FR +1046340096,1046340607,EU +1046340608,1046341119,NL +1046341120,1046341631,EU +1046341632,1046341887,FR +1046341888,1046342143,EU 1046342144,1046342719,NL -1046342720,1046343423,DE +1046342720,1046343423,EU 1046343424,1046343935,NL -1046343936,1046347775,DE +1046343936,1046344959,EU +1046344960,1046345215,DE +1046345216,1046345327,EU +1046345328,1046345727,DE +1046345728,1046346111,EU +1046346112,1046346239,DE +1046346240,1046346303,EU +1046346304,1046346367,DE +1046346368,1046346511,EU +1046346512,1046346559,DE +1046346560,1046347775,EU 1046347776,1046349839,IT 1046349840,1046349847,FR 1046349848,1046352831,IT 1046352832,1046352847,SM 1046352848,1046366807,IT 1046366808,1046366815,PL -1046366816,1046413311,IT +1046366816,1046385103,IT +1046385104,1046385111,A2 +1046385112,1046413311,IT 1046413312,1046446079,SE -1046446080,1046479511,DE -1046479512,1046479550,GB -1046479551,1046479687,DE -1046479688,1046479743,GB -1046479744,1046479895,DE -1046479896,1046479903,GB -1046479904,1046479935,DE -1046479936,1046479951,GB -1046479952,1046480475,DE -1046480476,1046480479,GB -1046480480,1046480703,DE -1046480704,1046480895,GB -1046480896,1046481175,DE -1046481176,1046481183,GB -1046481184,1046481327,DE +1046446080,1046479535,DE +1046479536,1046479551,GB +1046479552,1046479687,DE +1046479688,1046479695,GB +1046479696,1046480047,DE +1046480048,1046480055,GB +1046480056,1046480471,DE +1046480472,1046480479,GB +1046480480,1046480719,DE +1046480720,1046480735,GB +1046480736,1046481327,DE 1046481328,1046481375,GB -1046481376,1046481471,DE -1046481472,1046481927,GB -1046481928,1046481963,DE -1046481964,1046481967,GB -1046481968,1046482207,DE -1046482208,1046482239,GB -1046482240,1046482335,DE -1046482336,1046482943,GB +1046481376,1046481535,DE +1046481536,1046481919,GB +1046481920,1046481959,DE +1046481960,1046481967,GB +1046481968,1046482751,DE +1046482752,1046482943,GB 1046482944,1046483231,DE 1046483232,1046483471,GB -1046483472,1046483871,DE -1046483872,1046483983,GB -1046483984,1046484351,DE +1046483472,1046483583,DE +1046483584,1046483967,GB +1046483968,1046484351,DE 1046484352,1046484479,GB 1046484480,1046484511,DE 1046484512,1046484607,GB @@ -4351,18 +4788,8 @@ 1046485288,1046485367,DE 1046485368,1046485375,GB 1046485376,1046485495,DE -1046485496,1046485543,GB -1046485544,1046485631,DE -1046485632,1046485639,GB -1046485640,1046485647,DE -1046485648,1046485663,GB -1046485664,1046485759,DE -1046485760,1046485791,GB -1046485792,1046485823,DE -1046485824,1046485855,GB -1046485856,1046485991,DE -1046485992,1046485999,GB -1046486000,1046486055,DE +1046485496,1046485503,GB +1046485504,1046486055,DE 1046486056,1046486063,GB 1046486064,1046486159,DE 1046486160,1046486175,GB @@ -4370,17 +4797,11 @@ 1046486184,1046486191,GB 1046486192,1046486375,DE 1046486376,1046486383,GB -1046486384,1046486487,DE -1046486488,1046486495,GB -1046486496,1046491391,DE +1046486384,1046491391,DE 1046491392,1046491399,GB 1046491400,1046491423,DE 1046491424,1046491431,GB -1046491432,1046491591,DE -1046491592,1046491599,GB -1046491600,1046491711,DE -1046491712,1046491727,GB -1046491728,1046491743,DE +1046491432,1046491743,DE 1046491744,1046491775,GB 1046491776,1046491839,DE 1046491840,1046492159,GB @@ -4394,20 +4815,16 @@ 1046492544,1046492551,GB 1046492552,1046492655,DE 1046492656,1046492663,GB -1046492664,1046492687,DE -1046492688,1046492695,GB -1046492696,1046492911,DE +1046492664,1046492911,DE 1046492912,1046492967,GB 1046492968,1046493071,DE 1046493072,1046493087,GB 1046493088,1046493095,DE 1046493096,1046493103,GB -1046493104,1046493175,DE -1046493176,1046493183,GB -1046493184,1046493391,DE +1046493104,1046493391,DE 1046493392,1046493471,GB -1046493472,1046493479,DE -1046493480,1046493511,GB +1046493472,1046493487,DE +1046493488,1046493511,GB 1046493512,1046493519,DE 1046493520,1046493535,GB 1046493536,1046493551,DE @@ -4424,35 +4841,15 @@ 1046494032,1046494039,GB 1046494040,1046494087,DE 1046494088,1046494095,GB -1046494096,1046494327,DE +1046494096,1046494303,DE +1046494304,1046494311,GB +1046494312,1046494327,DE 1046494328,1046494335,GB 1046494336,1046494607,DE 1046494608,1046494615,GB 1046494616,1046494623,DE -1046494624,1046494751,GB -1046494752,1046494759,DE -1046494760,1046494775,GB -1046494776,1046494799,DE -1046494800,1046494807,GB -1046494808,1046494815,DE -1046494816,1046494823,GB -1046494824,1046494831,DE -1046494832,1046494839,GB -1046494840,1046494975,DE -1046494976,1046495007,GB -1046495008,1046495015,DE -1046495016,1046495023,GB -1046495024,1046495039,DE -1046495040,1046495047,GB -1046495048,1046495063,DE -1046495064,1046495071,GB -1046495072,1046495079,DE -1046495080,1046495087,GB -1046495088,1046495103,DE -1046495104,1046495127,GB -1046495128,1046495223,DE -1046495224,1046495231,GB -1046495232,1046495351,DE +1046494624,1046494719,GB +1046494720,1046495351,DE 1046495352,1046495359,GB 1046495360,1046495407,DE 1046495408,1046495415,GB @@ -4468,9 +4865,7 @@ 1046495568,1046495575,GB 1046495576,1046495599,DE 1046495600,1046495607,GB -1046495608,1046495615,DE -1046495616,1046495623,GB -1046495624,1046495631,DE +1046495608,1046495631,DE 1046495632,1046495639,GB 1046495640,1046495647,DE 1046495648,1046495663,GB @@ -4479,34 +4874,28 @@ 1046495720,1046495879,DE 1046495880,1046495895,GB 1046495896,1046495999,DE -1046496000,1046496071,GB -1046496072,1046496127,DE +1046496000,1046496047,GB +1046496048,1046496127,DE 1046496128,1046496135,GB -1046496136,1046496151,DE -1046496152,1046496159,GB -1046496160,1046496191,DE +1046496136,1046496191,DE 1046496192,1046496215,GB 1046496216,1046496231,DE 1046496232,1046496239,GB -1046496240,1046496247,DE -1046496248,1046496287,GB -1046496288,1046496303,DE +1046496240,1046496303,DE 1046496304,1046496511,GB 1046496512,1046497463,DE -1046497464,1046497567,GB +1046497464,1046497471,GB +1046497472,1046497479,DE +1046497480,1046497567,GB 1046497568,1046497639,DE 1046497640,1046497647,GB 1046497648,1046497663,DE 1046497664,1046497671,GB -1046497672,1046497711,DE -1046497712,1046497727,GB +1046497672,1046497719,DE +1046497720,1046497727,GB 1046497728,1046497759,DE 1046497760,1046497775,GB -1046497776,1046497815,DE -1046497816,1046497823,GB -1046497824,1046497903,DE -1046497904,1046497911,GB -1046497912,1046497975,DE +1046497776,1046497975,DE 1046497976,1046497983,GB 1046497984,1046498047,DE 1046498048,1046498079,GB @@ -4528,9 +4917,7 @@ 1046498360,1046498367,GB 1046498368,1046498455,DE 1046498456,1046498591,GB -1046498592,1046498607,DE -1046498608,1046498615,GB -1046498616,1046498631,DE +1046498592,1046498631,DE 1046498632,1046498639,GB 1046498640,1046498655,DE 1046498656,1046498663,GB @@ -4542,280 +4929,24 @@ 1046498820,1046499327,GB 1046499328,1046502655,DE 1046502656,1046502719,GB -1046502720,1046502847,DE -1046502848,1046502855,GB -1046502856,1046502863,DE -1046502864,1046502951,GB -1046502952,1046502967,DE -1046502968,1046502975,GB -1046502976,1046503015,DE -1046503016,1046503023,GB -1046503024,1046503135,DE -1046503136,1046503143,GB -1046503144,1046503167,DE -1046503168,1046503207,GB -1046503208,1046503303,DE -1046503304,1046503319,GB -1046503320,1046503327,DE -1046503328,1046503351,GB -1046503352,1046503615,DE -1046503616,1046503679,GB -1046503680,1046503807,DE -1046503808,1046503935,GB -1046503936,1046504383,DE -1046504384,1046504487,GB -1046504488,1046504551,DE -1046504552,1046504559,GB -1046504560,1046504583,DE -1046504584,1046504615,GB -1046504616,1046504671,DE -1046504672,1046504679,GB -1046504680,1046504695,DE -1046504696,1046504735,GB -1046504736,1046504799,DE -1046504800,1046504807,GB -1046504808,1046504871,DE -1046504872,1046504879,GB -1046504880,1046504887,DE -1046504888,1046504911,GB -1046504912,1046504919,DE -1046504920,1046504927,GB -1046504928,1046504943,DE -1046504944,1046504951,GB -1046504952,1046504959,DE -1046504960,1046504999,GB -1046505000,1046505031,DE -1046505032,1046505039,GB -1046505040,1046505055,DE -1046505056,1046505063,GB -1046505064,1046505071,DE -1046505072,1046505087,GB -1046505088,1046505095,DE -1046505096,1046505103,GB -1046505104,1046505159,DE -1046505160,1046505167,GB -1046505168,1046505175,DE -1046505176,1046505191,GB -1046505192,1046505207,DE -1046505208,1046505247,GB -1046505248,1046505255,DE -1046505256,1046505271,GB -1046505272,1046505343,DE -1046505344,1046505359,GB -1046505360,1046505415,DE -1046505416,1046505423,GB -1046505424,1046505431,DE -1046505432,1046505439,GB -1046505440,1046505463,DE -1046505464,1046505511,GB -1046505512,1046505551,DE -1046505552,1046505559,GB -1046505560,1046505583,DE -1046505584,1046505591,GB -1046505592,1046505607,DE -1046505608,1046505631,GB -1046505632,1046505663,DE -1046505664,1046505671,GB -1046505672,1046505679,DE -1046505680,1046505687,GB -1046505688,1046505695,DE -1046505696,1046505703,GB -1046505704,1046505727,DE -1046505728,1046505759,GB -1046505760,1046505807,DE -1046505808,1046505823,GB -1046505824,1046505847,DE -1046505848,1046505887,GB -1046505888,1046505895,DE -1046505896,1046505903,GB -1046505904,1046505959,DE -1046505960,1046505967,GB -1046505968,1046505975,DE -1046505976,1046506015,GB -1046506016,1046506039,DE -1046506040,1046506055,GB -1046506056,1046506087,DE -1046506088,1046506095,GB -1046506096,1046506119,DE -1046506120,1046506135,GB -1046506136,1046506239,DE -1046506240,1046506271,GB -1046506272,1046506295,DE -1046506296,1046506303,GB -1046506304,1046506327,DE -1046506328,1046506351,GB -1046506352,1046506375,DE -1046506376,1046506383,GB -1046506384,1046506391,DE -1046506392,1046506407,GB -1046506408,1046506415,DE -1046506416,1046506423,GB -1046506424,1046506439,DE -1046506440,1046506447,GB -1046506448,1046506479,DE -1046506480,1046506487,GB -1046506488,1046506495,DE -1046506496,1046506535,GB -1046506536,1046506575,DE -1046506576,1046506591,GB -1046506592,1046506599,DE -1046506600,1046506607,GB -1046506608,1046506623,DE -1046506624,1046506639,GB -1046506640,1046506647,DE -1046506648,1046506655,GB -1046506656,1046506671,DE -1046506672,1046506679,GB -1046506680,1046506687,DE -1046506688,1046506703,GB -1046506704,1046506711,DE -1046506712,1046506743,GB -1046506744,1046506751,DE -1046506752,1046506783,GB -1046506784,1046506791,DE -1046506792,1046506807,GB -1046506808,1046506823,DE -1046506824,1046506839,GB -1046506840,1046506895,DE -1046506896,1046506903,GB -1046506904,1046506927,DE -1046506928,1046506935,GB -1046506936,1046506951,DE -1046506952,1046506959,GB -1046506960,1046506991,DE -1046506992,1046506999,GB -1046507000,1046507007,DE -1046507008,1046507039,GB -1046507040,1046507047,DE -1046507048,1046507055,GB -1046507056,1046507071,DE -1046507072,1046507111,GB -1046507112,1046507135,DE -1046507136,1046507151,GB -1046507152,1046507159,DE -1046507160,1046507175,GB -1046507176,1046507199,DE -1046507200,1046507207,GB -1046507208,1046507215,DE -1046507216,1046507519,GB -1046507520,1046511615,DE -1046511616,1046511647,GB -1046511648,1046511695,DE -1046511696,1046511719,GB -1046511720,1046511727,DE -1046511728,1046511815,GB -1046511816,1046511847,DE -1046511848,1046511863,GB -1046511864,1046511871,DE -1046511872,1046511903,GB -1046511904,1046511919,DE -1046511920,1046511927,GB -1046511928,1046511935,DE -1046511936,1046511967,GB -1046511968,1046511975,DE -1046511976,1046511991,GB -1046511992,1046512007,DE -1046512008,1046512055,GB -1046512056,1046512063,DE -1046512064,1046512167,GB -1046512168,1046512175,DE -1046512176,1046512199,GB -1046512200,1046512215,DE -1046512216,1046512287,GB -1046512288,1046512303,DE -1046512304,1046512311,GB -1046512312,1046512327,DE -1046512328,1046512335,GB -1046512336,1046512343,DE -1046512344,1046512351,GB -1046512352,1046512383,DE -1046512384,1046512431,GB -1046512432,1046512447,DE -1046512448,1046512455,GB -1046512456,1046512535,DE -1046512536,1046512543,GB -1046512544,1046512551,DE -1046512552,1046512567,GB -1046512568,1046512607,DE -1046512608,1046512623,GB -1046512624,1046512631,DE -1046512632,1046512679,GB -1046512680,1046512687,DE -1046512688,1046512735,GB -1046512736,1046512751,DE -1046512752,1046512759,GB -1046512760,1046512847,DE -1046512848,1046512879,GB -1046512880,1046512895,DE -1046512896,1046512927,GB -1046512928,1046512943,DE -1046512944,1046512967,GB -1046512968,1046512983,DE -1046512984,1046512991,GB -1046512992,1046512999,DE -1046513000,1046513007,GB -1046513008,1046513015,DE -1046513016,1046513031,GB -1046513032,1046513039,DE -1046513040,1046513047,GB -1046513048,1046513055,DE -1046513056,1046513063,GB -1046513064,1046513079,DE -1046513080,1046513111,GB -1046513112,1046513143,DE -1046513144,1046513263,GB -1046513264,1046513271,DE -1046513272,1046513287,GB -1046513288,1046513295,DE -1046513296,1046513303,GB -1046513304,1046513327,DE -1046513328,1046513343,GB -1046513344,1046513367,DE -1046513368,1046513375,GB -1046513376,1046513391,DE -1046513392,1046513439,GB -1046513440,1046513519,DE -1046513520,1046513527,GB -1046513528,1046513535,DE -1046513536,1046513543,GB -1046513544,1046513551,DE -1046513552,1046513559,GB -1046513560,1046513583,DE -1046513584,1046513759,GB -1046513760,1046513775,DE -1046513776,1046513783,GB -1046513784,1046513791,DE -1046513792,1046513799,GB -1046513800,1046513831,DE -1046513832,1046513847,GB -1046513848,1046513863,DE -1046513864,1046513871,GB -1046513872,1046513879,DE -1046513880,1046513895,GB -1046513896,1046513919,DE -1046513920,1046514207,GB -1046514208,1046514223,DE -1046514224,1046514239,GB -1046514240,1046514247,DE -1046514248,1046514255,GB -1046514256,1046514279,DE -1046514280,1046514287,GB -1046514288,1046514311,DE -1046514312,1046514319,GB -1046514320,1046514335,DE -1046514336,1046514351,GB -1046514352,1046514359,DE -1046514360,1046514367,GB -1046514368,1046514383,DE -1046514384,1046514415,GB -1046514416,1046514423,DE -1046514424,1046514719,GB -1046514720,1046514751,DE -1046514752,1046515711,GB -1046515712,1046515967,DE -1046515968,1046524159,GB +1046502720,1046502863,DE +1046502864,1046502911,GB +1046502912,1046504415,DE +1046504416,1046504447,GB +1046504448,1046516287,DE +1046516288,1046516735,GB +1046516736,1046516751,DE +1046516752,1046516991,GB +1046516992,1046517031,DE +1046517032,1046517039,GB +1046517040,1046517087,DE +1046517088,1046517759,GB +1046517760,1046518271,DE +1046518272,1046524159,GB 1046524160,1046524191,DE -1046524192,1046524287,GB +1046524192,1046524207,GB +1046524208,1046524215,DE +1046524216,1046524287,GB 1046524288,1046524355,DE 1046524356,1046524415,GB 1046524416,1046525183,DE @@ -4830,28 +4961,22 @@ 1046526600,1046526631,GB 1046526632,1046526635,DE 1046526636,1046526719,GB -1046526720,1046526991,DE -1046526992,1046526995,GB -1046526996,1046527487,DE +1046526720,1046527487,DE 1046527488,1046527743,GB 1046527744,1046527999,DE 1046528000,1046528255,GB -1046528256,1046528295,DE -1046528296,1046528319,GB +1046528256,1046528287,DE +1046528288,1046528319,GB 1046528320,1046528335,DE -1046528336,1046528351,GB -1046528352,1046528383,DE -1046528384,1046528391,GB +1046528336,1046528391,GB 1046528392,1046528399,DE -1046528400,1046528447,GB -1046528448,1046528455,DE -1046528456,1046528459,GB +1046528400,1046528459,GB 1046528460,1046528463,DE 1046528464,1046528471,GB -1046528472,1046528495,DE -1046528496,1046528499,GB -1046528500,1046528503,DE -1046528504,1046528519,GB +1046528472,1046528479,DE +1046528480,1046528487,GB +1046528488,1046528495,DE +1046528496,1046528519,GB 1046528520,1046528527,DE 1046528528,1046528543,GB 1046528544,1046528559,DE @@ -4862,15 +4987,11 @@ 1046528604,1046528607,GB 1046528608,1046528639,DE 1046528640,1046528671,GB -1046528672,1046528703,DE -1046528704,1046529279,GB +1046528672,1046528767,DE +1046528768,1046529279,GB 1046529280,1046529535,DE 1046529536,1046530047,GB -1046530048,1046530559,DE -1046530560,1046530591,GB -1046530592,1046530639,DE -1046530640,1046530655,GB -1046530656,1046530687,DE +1046530048,1046530687,DE 1046530688,1046530815,GB 1046530816,1046530879,DE 1046530880,1046530943,GB @@ -4878,20 +4999,18 @@ 1046530948,1046530967,GB 1046530968,1046530975,DE 1046530976,1046531007,GB -1046531008,1046531087,DE -1046531088,1046531095,GB -1046531096,1046531103,DE -1046531104,1046531111,GB -1046531112,1046531127,DE -1046531128,1046531167,GB -1046531168,1046531183,DE -1046531184,1046531839,GB +1046531008,1046531127,DE +1046531128,1046531839,GB 1046531840,1046532095,DE 1046532096,1046534015,GB 1046534016,1046534047,DE -1046534048,1046534143,GB -1046534144,1046534655,DE -1046534656,1046534911,GB +1046534048,1046534063,GB +1046534064,1046534071,DE +1046534072,1046534143,GB +1046534144,1046534743,DE +1046534744,1046534847,GB +1046534848,1046534895,DE +1046534896,1046534911,GB 1046534912,1046535311,DE 1046535312,1046535359,GB 1046535360,1046535423,DE @@ -4901,15 +5020,13 @@ 1046535620,1046535623,DE 1046535624,1046535631,GB 1046535632,1046535935,DE -1046535936,1046536007,GB -1046536008,1046536015,DE -1046536016,1046536023,GB +1046535936,1046536023,GB 1046536024,1046536039,DE 1046536040,1046536063,GB 1046536064,1046536151,DE 1046536152,1046536159,GB -1046536160,1046536175,DE -1046536176,1046536187,GB +1046536160,1046536167,DE +1046536168,1046536187,GB 1046536188,1046536199,DE 1046536200,1046536211,GB 1046536212,1046536215,DE @@ -4921,53 +5038,47 @@ 1046536288,1046536295,DE 1046536296,1046536319,GB 1046536320,1046536351,DE -1046536352,1046536391,GB -1046536392,1046536399,DE -1046536400,1046536423,GB -1046536424,1046536439,DE -1046536440,1046536607,GB +1046536352,1046536355,GB +1046536356,1046536359,DE +1046536360,1046536423,GB +1046536424,1046536431,DE +1046536432,1046536607,GB 1046536608,1046536667,DE -1046536668,1046536671,GB -1046536672,1046537023,DE +1046536668,1046536703,GB +1046536704,1046537023,DE 1046537024,1046537055,GB 1046537056,1046537071,DE 1046537072,1046537087,GB 1046537088,1046537151,DE 1046537152,1046537215,GB 1046537216,1046538239,DE -1046538240,1046538255,GB -1046538256,1046538303,DE -1046538304,1046538431,GB -1046538432,1046538455,DE -1046538456,1046538463,GB +1046538240,1046538431,GB +1046538432,1046538447,DE +1046538448,1046538463,GB 1046538464,1046538495,DE 1046538496,1046538751,GB -1046538752,1046539519,DE -1046539520,1046540031,GB +1046538752,1046539775,DE +1046539776,1046540031,GB 1046540032,1046540287,DE 1046540288,1046540543,GB -1046540544,1046541055,DE -1046541056,1046541311,GB -1046541312,1046541439,DE +1046540544,1046541439,DE 1046541440,1046541503,GB 1046541504,1046541567,DE 1046541568,1046541631,GB -1046541632,1046541711,DE -1046541712,1046541727,GB +1046541632,1046541695,DE +1046541696,1046541727,GB 1046541728,1046541759,DE 1046541760,1046541767,GB -1046541768,1046541787,DE -1046541788,1046541807,GB -1046541808,1046542591,DE -1046542592,1046542847,GB -1046542848,1046543103,DE +1046541768,1046541783,DE +1046541784,1046541807,GB +1046541808,1046543103,DE 1046543104,1046543263,GB 1046543264,1046543295,DE 1046543296,1046543327,GB 1046543328,1046543351,DE 1046543352,1046543359,GB -1046543360,1046543871,DE -1046543872,1046544127,GB +1046543360,1046543615,DE +1046543616,1046544127,GB 1046544128,1046544383,DE 1046544384,1046560767,IT 1046560768,1046585343,ES @@ -4979,58 +5090,99 @@ 1046757376,1046765567,IT 1046765568,1046773759,ES 1046773760,1046781951,FR -1046781952,1046790143,GB +1046781952,1046798335,GB 1046798336,1046806527,HU 1046806528,1046814719,IT 1046814720,1046822911,SE -1046822912,1046847487,IT +1046822912,1046839295,IT +1046839296,1046847487,BA 1046847488,1046855679,ES 1046855680,1046872063,NO 1046872064,1046872583,BE +1046872584,1046872607,EU 1046872608,1046872615,BE +1046872616,1046872655,EU 1046872656,1046872671,BE -1046872800,1046872815,BE +1046872672,1046872975,EU 1046872976,1046872999,BE +1046873000,1046873087,EU 1046873088,1046873279,BE +1046873280,1046873599,EU 1046873600,1046878463,BE -1046879248,1046879263,BE +1046878464,1046879255,EU +1046879256,1046879263,BE +1046879264,1046879271,EU 1046879272,1046879311,BE +1046879312,1046879327,EU 1046879328,1046879495,BE +1046879496,1046879503,EU 1046879504,1046879511,BE -1046879536,1046879551,BE +1046879512,1046879543,EU +1046879544,1046879551,BE +1046879552,1046879591,EU 1046879592,1046879623,BE +1046879624,1046879647,EU 1046879648,1046879655,BE +1046879656,1046879687,EU 1046879688,1046879711,BE +1046879712,1046879719,EU 1046879720,1046879735,BE +1046879736,1046879775,EU 1046879776,1046879791,BE +1046879792,1046879807,EU 1046879808,1046879831,BE +1046879832,1046879839,EU 1046879840,1046879847,BE +1046879848,1046879895,EU 1046879896,1046879911,BE +1046879912,1046879943,EU 1046879944,1046879959,BE +1046879960,1046879967,EU 1046879968,1046880127,BE +1046880128,1046880135,EU 1046880136,1046880143,BE +1046880144,1046880151,EU 1046880152,1046880191,BE +1046880192,1046880255,EU 1046880256,1046880511,BE +1046880512,1046880519,EU 1046880520,1046880527,BE -1046880552,1046880559,BE +1046880528,1046880559,EU 1046880560,1046880567,RO +1046880568,1046880591,EU 1046880592,1046880615,BE +1046880616,1046880639,EU 1046880640,1046880671,BE +1046880672,1046880735,EU 1046880736,1046880759,BE +1046880760,1046880903,EU 1046880904,1046880911,BE +1046880912,1046880919,EU 1046880920,1046880935,BE +1046880936,1046880983,EU 1046880984,1046881039,BE +1046881040,1046881055,EU 1046881056,1046881071,BE -1046881080,1046881103,BE +1046881072,1046881079,EU +1046881080,1046881087,BE +1046881088,1046881111,EU 1046881112,1046881127,BE +1046881128,1046881135,EU 1046881136,1046881239,BE -1046881248,1046881255,BE +1046881240,1046881279,EU 1046881280,1046882047,BE +1046882048,1046882303,EU 1046882304,1046884383,BE +1046884384,1046885375,EU 1046885376,1046888447,BE -1046888448,1046894591,GB -1046896640,1046897663,GB -1046899712,1046904831,BE +1046888448,1046895103,GB +1046895104,1046896383,EU +1046896384,1046897663,GB +1046897664,1046898431,BE +1046898432,1046898687,EU +1046898688,1046898943,BE +1046898944,1046899167,EU +1046899168,1046904831,BE 1046904832,1046937599,RU 1046937600,1047003135,GR 1047003136,1047068671,DE @@ -5045,37 +5197,16 @@ 1047166976,1047199743,FR 1047199744,1047265279,DK 1047265280,1047273471,NL -1047273472,1047281663,GB +1047273472,1047281663,DE 1047281664,1047289855,TR -1047289856,1047290239,CS -1047290240,1047290367,CS -1047290368,1047290495,CS -1047290496,1047290623,CS -1047290624,1047290879,CS -1047290880,1047291903,CS -1047291904,1047292927,CS -1047292928,1047293695,CS -1047293696,1047294207,CS -1047294208,1047294719,CS -1047294720,1047294735,CS -1047294736,1047295231,CS -1047295232,1047295239,CS -1047295240,1047295247,CS -1047295248,1047295263,CS -1047295264,1047295279,CS -1047295280,1047295295,CS -1047295296,1047295327,CS -1047295328,1047295343,CS -1047295344,1047295487,CS -1047295488,1047297023,CS -1047297024,1047297567,CS -1047297568,1047297599,CS -1047297600,1047298047,CS +1047289856,1047298047,RS 1047298048,1047300095,CH 1047300096,1047300415,GB 1047300416,1047300479,CH 1047300480,1047300495,FR -1047300496,1047302143,CH +1047300496,1047300607,CH +1047300608,1047300639,GB +1047300640,1047302143,CH 1047302144,1047302159,US 1047302160,1047302175,GB 1047302176,1047302191,AU @@ -5083,8 +5214,18 @@ 1047306240,1047314431,PL 1047314432,1047322623,SE 1047322624,1047330815,IT -1047339008,1047347199,SE +1047330816,1047339007,RU +1047339008,1047340279,SE +1047340280,1047340287,DK +1047340288,1047340431,SE +1047340432,1047340439,NO +1047340440,1047340799,SE +1047340800,1047341055,NO +1047341056,1047343871,SE +1047343872,1047344127,NO +1047344128,1047347199,SE 1047347200,1047363583,DE +1047363584,1047371775,CZ 1047371776,1047379967,RU 1047379968,1047396351,NL 1047396352,1047461887,IT @@ -5093,30 +5234,54 @@ 1047527424,1047535615,BE 1047535616,1047551999,DE 1047552000,1047560191,RU -1047560192,1047560763,DE -1047560764,1047560767,AT -1047560768,1047561747,DE +1047560192,1047561367,DE +1047561368,1047561371,CN +1047561372,1047561747,DE 1047561748,1047561751,ES 1047561752,1047561887,DE 1047561888,1047561891,US -1047561892,1047563407,DE -1047563408,1047563415,CH +1047561892,1047563227,DE +1047563228,1047563231,CH +1047563232,1047563287,DE +1047563288,1047563295,CH +1047563296,1047563303,DE +1047563304,1047563311,CH +1047563312,1047563319,DE +1047563320,1047563323,CH +1047563324,1047563347,DE +1047563348,1047563355,CH +1047563356,1047563363,DE +1047563364,1047563367,ES +1047563368,1047563403,DE +1047563404,1047563407,NL +1047563408,1047563411,CH +1047563412,1047563415,DE 1047563416,1047563419,BE -1047563420,1047563443,DE +1047563420,1047563431,DE +1047563432,1047563435,CH +1047563436,1047563443,DE 1047563444,1047563447,CH 1047563448,1047563451,DE 1047563452,1047563455,NL -1047563456,1047563463,DE -1047563464,1047563471,CH -1047563472,1047566363,DE +1047563456,1047563467,DE +1047563468,1047563471,CH +1047563472,1047563727,DE +1047563728,1047563731,AU +1047563732,1047566363,DE 1047566364,1047566367,CH -1047566368,1047566407,DE -1047566408,1047566415,CH -1047566416,1047566455,DE +1047566368,1047566403,DE +1047566404,1047566415,CH +1047566416,1047566443,DE +1047566444,1047566447,AT +1047566448,1047566455,DE 1047566456,1047566459,CH 1047566460,1047566475,DE 1047566476,1047566479,CH -1047566480,1047566535,DE +1047566480,1047566491,DE +1047566492,1047566499,CH +1047566500,1047566507,DE +1047566508,1047566511,CH +1047566512,1047566535,DE 1047566536,1047566539,CH 1047566540,1047566559,DE 1047566560,1047566563,CH @@ -5127,74 +5292,118 @@ 1047566872,1047566879,CH 1047566880,1047566891,DE 1047566892,1047566903,CH -1047566904,1047566995,DE +1047566904,1047566963,DE +1047566964,1047566967,AT +1047566968,1047566995,DE 1047566996,1047566999,CH -1047567000,1047567039,DE +1047567000,1047567031,DE +1047567032,1047567035,CH +1047567036,1047567039,DE 1047567040,1047567043,AT 1047567044,1047567047,CH -1047567048,1047567103,DE -1047567104,1047567111,NL -1047567112,1047567163,DE +1047567048,1047567063,DE +1047567064,1047567067,CH +1047567068,1047567071,BE +1047567072,1047567119,DE +1047567120,1047567127,CH +1047567128,1047567143,DE +1047567144,1047567147,CH +1047567148,1047567151,BE +1047567152,1047567163,DE 1047567164,1047567167,AT 1047567168,1047567211,DE -1047567212,1047567215,CH -1047567216,1047567223,DE -1047567224,1047567227,CH +1047567212,1047567227,CH 1047567228,1047567239,DE 1047567240,1047567243,CH 1047567244,1047567247,DE 1047567248,1047567255,CH -1047567256,1047567315,DE +1047567256,1047567279,DE +1047567280,1047567287,CH +1047567288,1047567315,DE 1047567316,1047567319,AT 1047567320,1047567359,DE 1047567360,1047567375,ES 1047567376,1047567435,DE 1047567436,1047567439,CH -1047567440,1047567451,DE +1047567440,1047567447,DE +1047567448,1047567451,CH 1047567452,1047567455,AT -1047567456,1047567463,DE +1047567456,1047567459,CH +1047567460,1047567463,DE 1047567464,1047567467,CH -1047567468,1047567551,DE +1047567468,1047567495,DE +1047567496,1047567499,CH +1047567500,1047567535,DE +1047567536,1047567539,CH +1047567540,1047567551,DE 1047567552,1047567555,CH -1047567556,1047567647,DE +1047567556,1047567567,DE +1047567568,1047567571,AT +1047567572,1047567647,DE 1047567648,1047567651,CH -1047567652,1047567727,DE +1047567652,1047567655,DE +1047567656,1047567659,CH +1047567660,1047567727,DE 1047567728,1047567731,BE -1047567732,1047567747,DE +1047567732,1047567735,DE +1047567736,1047567743,CH +1047567744,1047567747,DE 1047567748,1047567751,CH -1047567752,1047567755,DE +1047567752,1047567755,LU 1047567756,1047567759,CH 1047567760,1047567799,DE 1047567800,1047567803,CH 1047567804,1047567847,DE 1047567848,1047567851,CH -1047567852,1047567871,DE +1047567852,1047567855,BE +1047567856,1047567871,DE 1047567872,1047567875,CH 1047567876,1047567879,AT -1047567880,1047567935,DE +1047567880,1047567883,CH +1047567884,1047567935,DE 1047567936,1047567939,CH 1047567940,1047568047,DE -1047568048,1047568055,CH -1047568056,1047568083,DE +1047568048,1047568059,CH +1047568060,1047568083,DE 1047568084,1047568095,CH 1047568096,1047568159,DE 1047568160,1047568163,CH -1047568164,1047568167,DE -1047568168,1047568171,ES -1047568172,1047568247,DE +1047568164,1047568187,DE +1047568188,1047568191,CH +1047568192,1047568215,DE +1047568216,1047568219,CH +1047568220,1047568235,DE +1047568236,1047568239,CH +1047568240,1047568247,DE 1047568248,1047568251,CH -1047568252,1047568383,DE +1047568252,1047568363,DE +1047568364,1047568367,CH +1047568368,1047568383,DE 1047568384,1047576575,NL 1047576576,1047584767,HU 1047584768,1047592959,NL +1047592960,1047601151,BA 1047601152,1047625727,RU 1047625728,1047633919,NO 1047633920,1047642111,FI -1047642112,1047658495,CH +1047642112,1047658495,DE +1047658496,1047724031,EG +1047724032,1047728127,EU 1047728128,1047732223,SE -1047740672,1047740927,GB -1047782656,1047782687,GB +1047732224,1047740415,EU +1047740416,1047740431,US +1047740432,1047740543,EU +1047740544,1047740671,DE +1047740672,1047740927,A2 +1047740928,1047781663,EU +1047781664,1047781671,GB +1047781672,1047782695,EU 1047782696,1047782703,GB +1047782704,1047782719,EU +1047782720,1047782751,SE +1047782752,1047782783,NO +1047782784,1047782815,FI +1047782816,1047789567,EU 1047789568,1047806031,AT 1047806032,1047806047,IT 1047806048,1047822335,AT @@ -5204,6 +5413,7 @@ 1047838720,1047846911,DK 1047846912,1047855103,SE 1047855104,1047863295,DE +1047863296,1047871487,EG 1047871488,1047887871,RU 1047887872,1047920639,ES 1047920640,1047941119,RU @@ -5220,24 +5430,74 @@ 1048133632,1048158207,PL 1048158208,1048166399,DK 1048166400,1048182783,CH -1048182784,1048313855,IT +1048182784,1048184831,UA +1048184832,1048186879,FR +1048186880,1048188927,LV +1048188928,1048190975,BE +1048190976,1048193023,UA +1048193024,1048195071,RO +1048195072,1048197119,RU +1048197120,1048201215,UA +1048201216,1048203263,EU +1048203264,1048205311,DE +1048205312,1048209407,RU +1048209408,1048211455,UA +1048211456,1048215551,PL +1048215552,1048221695,RU +1048221696,1048223743,UA +1048223744,1048225791,DK +1048225792,1048227839,CZ +1048227840,1048233983,RU +1048233984,1048236031,UA +1048236032,1048240127,RU +1048240128,1048242175,IL +1048242176,1048244223,PL +1048244224,1048246271,RU +1048246272,1048248319,NO +1048248320,1048313855,IT 1048313856,1048510463,GB 1048510464,1048575999,SE 1048576000,1048584191,DE 1048584192,1048592383,IL 1048592384,1048600575,IT -1048600576,1048603135,EE -1048603136,1048603391,LV -1048603392,1048608767,EE +1048600576,1048602623,UA +1048602624,1048603135,EE +1048603136,1048604671,UA +1048604672,1048604687,EE +1048604688,1048604743,UA +1048604744,1048604759,EE +1048604760,1048604927,UA +1048604928,1048604965,LT +1048604966,1048604967,UA +1048604968,1048604971,LT +1048604972,1048604975,UA +1048604976,1048605063,LT +1048605064,1048607231,UA +1048607232,1048607247,EE +1048607248,1048607487,UA +1048607488,1048607519,EE +1048607520,1048607743,UA +1048607744,1048607759,EE +1048607760,1048607775,UA +1048607776,1048607839,EE +1048607840,1048608255,UA +1048608256,1048608287,RU +1048608288,1048608671,UA +1048608672,1048608703,EE +1048608704,1048608711,UA +1048608712,1048608727,EE +1048608728,1048608731,UA +1048608732,1048608767,EE 1048608768,1048611583,GB 1048611584,1048611839,FR -1048611840,1048616447,GB -1048616448,1048616959,DK +1048611840,1048615423,GB +1048615424,1048615487,US +1048615488,1048616959,GB 1048616960,1048621055,KE -1048621056,1048625151,DE +1048621056,1048625151,US 1048625152,1048633343,GB 1048633344,1048641535,NO -1048641536,1048649727,IT +1048641536,1048649727,FR 1048649728,1048657919,CZ 1048657920,1048674303,GB 1048674304,1048682495,NL @@ -5249,112 +5509,592 @@ 1048838176,1048838207,PL 1048838208,1048838239,NL 1048838240,1048839935,DE -1048839936,1048840263,NL -1048840264,1048840271,DE -1048840272,1048840703,NL -1048840704,1048841343,DE -1048841344,1048841359,CZ -1048841360,1048843263,DE -1048843264,1048843439,NL -1048843440,1048843447,DE -1048843448,1048843983,NL +1048839936,1048840703,NL +1048840704,1048843263,DE +1048843264,1048843311,NL +1048843312,1048843319,DE +1048843320,1048843599,NL +1048843600,1048843607,DE +1048843608,1048843951,NL +1048843952,1048843959,DE +1048843960,1048843983,NL 1048843984,1048843991,DE -1048843992,1048844287,NL -1048844288,1048844303,CH -1048844304,1048844319,DE +1048843992,1048844263,NL +1048844264,1048844271,DE +1048844272,1048844287,NL +1048844288,1048844319,DE 1048844320,1048844351,NL -1048844352,1048844383,AT -1048844384,1048845567,DE -1048845568,1048845823,NL -1048845824,1048845831,DE -1048845832,1048846703,NL -1048846704,1048846711,DE -1048846712,1048846847,NL +1048844352,1048845567,DE +1048845568,1048845703,NL +1048845704,1048845711,DE +1048845712,1048845759,NL +1048845760,1048845767,DE +1048845768,1048845855,NL +1048845856,1048845863,DE +1048845864,1048846575,NL +1048846576,1048846583,DE +1048846584,1048846647,NL +1048846648,1048846663,DE +1048846664,1048846687,NL +1048846688,1048846695,DE +1048846696,1048846847,NL 1048846848,1048847359,DE -1048847360,1048847599,NL -1048847600,1048847607,DE -1048847608,1048848895,NL +1048847360,1048847423,NL +1048847424,1048847431,DE +1048847432,1048847455,NL +1048847456,1048847463,DE +1048847464,1048848119,NL +1048848120,1048848127,DE +1048848128,1048848135,NL +1048848136,1048848143,DE +1048848144,1048848479,NL +1048848480,1048848487,DE +1048848488,1048848551,NL +1048848552,1048848559,DE +1048848560,1048848703,NL +1048848704,1048848711,DE +1048848712,1048848735,NL +1048848736,1048848743,DE +1048848744,1048848895,NL 1048848896,1048849407,DE -1048849408,1048850487,NL -1048850488,1048850495,DE -1048850496,1048850615,NL -1048850616,1048850623,DE -1048850624,1048850903,NL -1048850904,1048850919,DE -1048850920,1048852215,NL -1048852216,1048852223,DE -1048852224,1048854527,NL +1048849408,1048849559,NL +1048849560,1048849567,DE +1048849568,1048849599,NL +1048849600,1048849607,DE +1048849608,1048849863,NL +1048849864,1048849871,DE +1048849872,1048850959,NL +1048850960,1048850967,DE +1048850968,1048851031,NL +1048851032,1048851039,DE +1048851040,1048851151,NL +1048851152,1048851159,DE +1048851160,1048851223,NL +1048851224,1048851231,DE +1048851232,1048851591,NL +1048851592,1048851607,DE +1048851608,1048851655,NL +1048851656,1048851663,DE +1048851664,1048851679,NL +1048851680,1048851687,DE +1048851688,1048851703,NL +1048851704,1048851711,DE +1048851712,1048851743,NL +1048851744,1048851751,DE +1048851752,1048852039,NL +1048852040,1048852047,DE +1048852048,1048852335,NL +1048852336,1048852343,DE +1048852344,1048852807,NL +1048852808,1048852815,DE +1048852816,1048852871,NL +1048852872,1048852879,DE +1048852880,1048853127,NL +1048853128,1048853135,DE +1048853136,1048853143,NL +1048853144,1048853151,DE +1048853152,1048853191,NL +1048853192,1048853199,DE +1048853200,1048853327,NL +1048853328,1048853335,DE +1048853336,1048853575,NL +1048853576,1048853583,DE +1048853584,1048853655,NL +1048853656,1048853663,DE +1048853664,1048853863,NL +1048853864,1048853871,DE +1048853872,1048854055,NL +1048854056,1048854063,DE +1048854064,1048854391,NL +1048854392,1048854407,DE +1048854408,1048854527,NL 1048854528,1048855039,DE -1048855040,1048856815,NL -1048856816,1048856823,DE -1048856824,1048858111,NL +1048855040,1048855047,NL +1048855048,1048855055,DE +1048855056,1048855215,NL +1048855216,1048855223,DE +1048855224,1048855271,NL +1048855272,1048855279,DE +1048855280,1048855895,NL +1048855896,1048855903,DE +1048855904,1048856015,NL +1048856016,1048856031,DE +1048856032,1048856095,NL +1048856096,1048856103,DE +1048856104,1048856359,NL +1048856360,1048856367,DE +1048856368,1048856375,NL +1048856376,1048856383,DE +1048856384,1048856559,NL +1048856560,1048856567,DE +1048856568,1048856687,NL +1048856688,1048856695,DE +1048856696,1048856839,NL +1048856840,1048856847,DE +1048856848,1048856919,NL +1048856920,1048856927,DE +1048856928,1048856999,NL +1048857000,1048857007,DE +1048857008,1048857767,NL +1048857768,1048857775,DE +1048857776,1048858111,NL 1048858112,1048858623,DE -1048858624,1048858879,NL -1048858880,1048858887,DE -1048858888,1048859935,NL -1048859936,1048859943,DE -1048859944,1048861951,NL -1048861952,1048861959,DE -1048861960,1048862591,NL -1048862592,1048862599,DE -1048862600,1048862639,NL -1048862640,1048862647,DE -1048862648,1048863063,NL -1048863064,1048863071,DE -1048863072,1048864391,NL -1048864392,1048864399,DE -1048864400,1048864727,NL -1048864728,1048864735,DE -1048864736,1048865039,NL -1048865040,1048865047,DE -1048865048,1048865279,NL +1048858624,1048859095,NL +1048859096,1048859103,DE +1048859104,1048859903,NL +1048859904,1048859911,DE +1048859912,1048860311,NL +1048860312,1048860319,DE +1048860320,1048860407,NL +1048860408,1048860415,DE +1048860416,1048860455,NL +1048860456,1048860463,DE +1048860464,1048860511,NL +1048860512,1048860519,DE +1048860520,1048860607,NL +1048860608,1048860615,DE +1048860616,1048861383,NL +1048861384,1048861391,DE +1048861392,1048861431,NL +1048861432,1048861439,DE +1048861440,1048862247,NL +1048862248,1048862255,DE +1048862256,1048862287,NL +1048862288,1048862295,DE +1048862296,1048862511,NL +1048862512,1048862519,DE +1048862520,1048862623,NL +1048862624,1048862639,DE +1048862640,1048862671,NL +1048862672,1048862679,DE +1048862680,1048862711,NL +1048862712,1048862719,DE +1048862720,1048862919,NL +1048862920,1048862927,DE +1048862928,1048863111,NL +1048863112,1048863119,DE +1048863120,1048863271,NL +1048863272,1048863279,DE +1048863280,1048863319,NL +1048863320,1048863327,DE +1048863328,1048863343,NL +1048863344,1048863351,DE +1048863352,1048863391,NL +1048863392,1048863399,DE +1048863400,1048863575,NL +1048863576,1048863591,DE +1048863592,1048863631,NL +1048863632,1048863639,DE +1048863640,1048863743,NL +1048863744,1048863751,DE +1048863752,1048863791,NL +1048863792,1048863799,DE +1048863800,1048864071,NL +1048864072,1048864079,DE +1048864080,1048864167,NL +1048864168,1048864175,DE +1048864176,1048864471,NL +1048864472,1048864479,DE +1048864480,1048864775,NL +1048864776,1048864783,DE +1048864784,1048865279,NL 1048865280,1048865791,DE -1048865792,1048866239,NL -1048866240,1048866247,DE -1048866248,1048866751,NL -1048866752,1048866759,DE -1048866760,1048867327,NL +1048865792,1048865903,NL +1048865904,1048865911,DE +1048865912,1048865935,NL +1048865936,1048865943,DE +1048865944,1048866095,NL +1048866096,1048866103,DE +1048866104,1048867031,NL +1048867032,1048867039,DE +1048867040,1048867207,NL +1048867208,1048867215,DE +1048867216,1048867295,NL +1048867296,1048867303,DE +1048867304,1048867327,NL 1048867328,1048868351,DE -1048868352,1048868607,NL -1048868608,1048868615,DE -1048868616,1048870383,NL -1048870384,1048870391,DE -1048870392,1048870399,NL +1048868352,1048868655,NL +1048868656,1048868663,DE +1048868664,1048869183,NL +1048869184,1048869191,DE +1048869192,1048869263,NL +1048869264,1048869279,DE +1048869280,1048869367,NL +1048869368,1048869375,DE +1048869376,1048869479,NL +1048869480,1048869487,DE +1048869488,1048869543,NL +1048869544,1048869551,DE +1048869552,1048869575,NL +1048869576,1048869583,DE +1048869584,1048869615,NL +1048869616,1048869623,DE +1048869624,1048869687,NL +1048869688,1048869695,DE +1048869696,1048869759,NL +1048869760,1048869767,DE +1048869768,1048869847,NL +1048869848,1048869863,DE +1048869864,1048869951,NL +1048869952,1048869967,DE +1048869968,1048869975,NL +1048869976,1048869983,DE +1048869984,1048870015,NL +1048870016,1048870023,DE +1048870024,1048870087,NL +1048870088,1048870095,DE +1048870096,1048870103,NL +1048870104,1048870111,DE +1048870112,1048870127,NL +1048870128,1048870135,DE +1048870136,1048870279,NL +1048870280,1048870287,DE +1048870288,1048870399,NL 1048870400,1048870911,DE -1048870912,1048871935,NL +1048870912,1048871095,NL +1048871096,1048871103,DE +1048871104,1048871223,NL +1048871224,1048871231,DE +1048871232,1048871935,NL 1048871936,1048872703,DE -1048872704,1048873039,NL -1048873040,1048873047,DE -1048873048,1048874023,NL -1048874024,1048874031,DE -1048874032,1048875215,NL -1048875216,1048875223,DE -1048875224,1048877311,NL -1048877312,1048878079,DE -1048878080,1048880639,NL -1048880640,1048881151,DE -1048881152,1048882015,NL -1048882016,1048882023,DE -1048882024,1048884159,NL -1048884160,1048884167,DE -1048884168,1048885151,NL -1048885152,1048885159,DE -1048885160,1048887295,NL -1048887296,1048887423,DE -1048887424,1048888415,NL -1048888416,1048888447,DE -1048888448,1048888959,NL -1048888960,1048889087,DE -1048889088,1048889151,NL -1048889152,1048889183,DE -1048889184,1048889951,NL -1048889952,1048889983,DE -1048889984,1048890047,NL -1048890048,1048890079,DE -1048890080,1048890559,NL -1048890560,1048890623,DE -1048890624,1048891007,NL -1048891008,1048903679,DE +1048872704,1048872735,NL +1048872736,1048872743,DE +1048872744,1048873263,NL +1048873264,1048873271,DE +1048873272,1048873743,NL +1048873744,1048873751,DE +1048873752,1048873791,NL +1048873792,1048873799,DE +1048873800,1048873935,NL +1048873936,1048873951,DE +1048873952,1048874015,NL +1048874016,1048874023,DE +1048874024,1048874151,NL +1048874152,1048874159,DE +1048874160,1048874295,NL +1048874296,1048874303,DE +1048874304,1048874327,NL +1048874328,1048874335,DE +1048874336,1048874359,NL +1048874360,1048874367,DE +1048874368,1048874415,NL +1048874416,1048874423,DE +1048874424,1048874447,NL +1048874448,1048874455,DE +1048874456,1048874471,NL +1048874472,1048874479,DE +1048874480,1048874535,NL +1048874536,1048874543,DE +1048874544,1048874703,NL +1048874704,1048874711,DE +1048874712,1048875015,NL +1048875016,1048875023,DE +1048875024,1048875191,NL +1048875192,1048875199,DE +1048875200,1048875391,NL +1048875392,1048875399,DE +1048875400,1048875671,NL +1048875672,1048875679,DE +1048875680,1048875687,NL +1048875688,1048875695,DE +1048875696,1048875703,NL +1048875704,1048875711,DE +1048875712,1048875823,NL +1048875824,1048875839,DE +1048875840,1048876255,NL +1048876256,1048876263,DE +1048876264,1048876327,NL +1048876328,1048876335,DE +1048876336,1048876807,NL +1048876808,1048876815,DE +1048876816,1048876823,NL +1048876824,1048876831,DE +1048876832,1048876991,NL +1048876992,1048876999,DE +1048877000,1048877023,NL +1048877024,1048877031,DE +1048877032,1048877039,NL +1048877040,1048877055,DE +1048877056,1048877071,NL +1048877072,1048877079,DE +1048877080,1048877103,NL +1048877104,1048877111,DE +1048877112,1048877191,NL +1048877192,1048877199,DE +1048877200,1048877247,NL +1048877248,1048877263,DE +1048877264,1048877287,NL +1048877288,1048877295,DE +1048877296,1048877311,NL +1048877312,1048878087,DE +1048878088,1048878103,NL +1048878104,1048878111,DE +1048878112,1048878335,NL +1048878336,1048878343,DE +1048878344,1048878447,NL +1048878448,1048878455,DE +1048878456,1048878487,NL +1048878488,1048878495,DE +1048878496,1048878543,NL +1048878544,1048878551,DE +1048878552,1048878663,NL +1048878664,1048878671,DE +1048878672,1048878751,NL +1048878752,1048878759,DE +1048878760,1048878815,NL +1048878816,1048878823,DE +1048878824,1048878831,NL +1048878832,1048878839,DE +1048878840,1048878983,NL +1048878984,1048878991,DE +1048878992,1048879047,NL +1048879048,1048879055,DE +1048879056,1048879199,NL +1048879200,1048879207,DE +1048879208,1048879263,NL +1048879264,1048879271,DE +1048879272,1048879335,NL +1048879336,1048879343,DE +1048879344,1048879455,NL +1048879456,1048879463,DE +1048879464,1048879687,NL +1048879688,1048879695,DE +1048879696,1048880311,NL +1048880312,1048880327,DE +1048880328,1048880639,NL +1048880640,1048881159,DE +1048881160,1048881615,NL +1048881616,1048881631,DE +1048881632,1048882071,NL +1048882072,1048882079,DE +1048882080,1048882143,NL +1048882144,1048882151,DE +1048882152,1048882311,NL +1048882312,1048882319,DE +1048882320,1048882495,NL +1048882496,1048882503,DE +1048882504,1048882703,NL +1048882704,1048882711,DE +1048882712,1048882743,NL +1048882744,1048882751,DE +1048882752,1048882823,NL +1048882824,1048882831,DE +1048882832,1048882855,NL +1048882856,1048882863,DE +1048882864,1048882951,NL +1048882952,1048882959,DE +1048882960,1048883167,NL +1048883168,1048883175,DE +1048883176,1048883319,NL +1048883320,1048883327,DE +1048883328,1048883351,NL +1048883352,1048883359,DE +1048883360,1048883871,NL +1048883872,1048883879,DE +1048883880,1048884279,NL +1048884280,1048884295,DE +1048884296,1048884975,NL +1048884976,1048884983,DE +1048884984,1048884991,NL +1048884992,1048884999,DE +1048885000,1048885111,NL +1048885112,1048885119,DE +1048885120,1048885471,NL +1048885472,1048885479,DE +1048885480,1048885575,NL +1048885576,1048885583,DE +1048885584,1048885703,NL +1048885704,1048885711,DE +1048885712,1048885767,NL +1048885768,1048885775,DE +1048885776,1048885815,NL +1048885816,1048885823,DE +1048885824,1048885839,NL +1048885840,1048885847,DE +1048885848,1048886239,NL +1048886240,1048886247,DE +1048886248,1048886343,NL +1048886344,1048886351,DE +1048886352,1048886431,NL +1048886432,1048886439,DE +1048886440,1048886463,NL +1048886464,1048886471,DE +1048886472,1048886615,NL +1048886616,1048886623,DE +1048886624,1048886871,NL +1048886872,1048886879,DE +1048886880,1048886903,NL +1048886904,1048886911,DE +1048886912,1048887039,NL +1048887040,1048887047,DE +1048887048,1048887935,NL +1048887936,1048887999,DE +1048888000,1048891391,NL +1048891392,1048891399,DE +1048891400,1048891823,NL +1048891824,1048891831,DE +1048891832,1048891911,NL +1048891912,1048891919,DE +1048891920,1048892311,NL +1048892312,1048892319,DE +1048892320,1048892343,NL +1048892344,1048892351,DE +1048892352,1048892367,NL +1048892368,1048892375,DE +1048892376,1048892815,NL +1048892816,1048892823,DE +1048892824,1048892863,NL +1048892864,1048892871,DE +1048892872,1048892895,NL +1048892896,1048892903,DE +1048892904,1048893279,NL +1048893280,1048893287,DE +1048893288,1048893303,NL +1048893304,1048893311,DE +1048893312,1048893591,NL +1048893592,1048893599,DE +1048893600,1048893703,NL +1048893704,1048893711,DE +1048893712,1048893719,NL +1048893720,1048893727,DE +1048893728,1048893919,NL +1048893920,1048893927,DE +1048893928,1048893983,NL +1048893984,1048893991,DE +1048893992,1048894039,NL +1048894040,1048894047,DE +1048894048,1048894071,NL +1048894072,1048894079,DE +1048894080,1048894215,NL +1048894216,1048894223,DE +1048894224,1048894471,NL +1048894472,1048894479,DE +1048894480,1048894487,NL +1048894488,1048894495,DE +1048894496,1048894607,NL +1048894608,1048894615,DE +1048894616,1048894671,NL +1048894672,1048894679,DE +1048894680,1048894735,NL +1048894736,1048894743,DE +1048894744,1048894895,NL +1048894896,1048894903,DE +1048894904,1048895031,NL +1048895032,1048895039,DE +1048895040,1048895079,NL +1048895080,1048895087,DE +1048895088,1048895271,NL +1048895272,1048895279,DE +1048895280,1048895439,NL +1048895440,1048895447,DE +1048895448,1048895551,NL +1048895552,1048895559,DE +1048895560,1048895647,NL +1048895648,1048895655,DE +1048895656,1048895967,NL +1048895968,1048895975,DE +1048895976,1048896231,NL +1048896232,1048896239,DE +1048896240,1048896271,NL +1048896272,1048896279,DE +1048896280,1048896319,NL +1048896320,1048896327,DE +1048896328,1048896479,NL +1048896480,1048896487,DE +1048896488,1048896519,NL +1048896520,1048896535,DE +1048896536,1048896671,NL +1048896672,1048896679,DE +1048896680,1048896687,NL +1048896688,1048896695,DE +1048896696,1048896735,NL +1048896736,1048896743,DE +1048896744,1048896871,NL +1048896872,1048896879,DE +1048896880,1048896967,NL +1048896968,1048896975,DE +1048896976,1048897119,NL +1048897120,1048897135,DE +1048897136,1048897239,NL +1048897240,1048897247,DE +1048897248,1048897271,NL +1048897272,1048897279,DE +1048897280,1048897295,NL +1048897296,1048897311,DE +1048897312,1048897319,NL +1048897320,1048897327,DE +1048897328,1048897367,NL +1048897368,1048897375,DE +1048897376,1048897463,NL +1048897464,1048897471,DE +1048897472,1048897495,NL +1048897496,1048897503,DE +1048897504,1048897735,NL +1048897736,1048897743,DE +1048897744,1048898719,NL +1048898720,1048898727,DE +1048898728,1048898991,NL +1048898992,1048898999,DE +1048899000,1048899047,NL +1048899048,1048899055,DE +1048899056,1048899271,NL +1048899272,1048899279,DE +1048899280,1048899287,NL +1048899288,1048899295,DE +1048899296,1048899303,NL +1048899304,1048899311,DE +1048899312,1048899591,NL +1048899592,1048899599,DE +1048899600,1048900071,NL +1048900072,1048900079,DE +1048900080,1048900127,NL +1048900128,1048900135,DE +1048900136,1048900311,NL +1048900312,1048900319,DE +1048900320,1048900343,NL +1048900344,1048900351,DE +1048900352,1048900367,NL +1048900368,1048900375,DE +1048900376,1048900391,NL +1048900392,1048900399,DE +1048900400,1048900703,NL +1048900704,1048900711,DE +1048900712,1048900935,NL +1048900936,1048900951,DE +1048900952,1048901167,NL +1048901168,1048901175,DE +1048901176,1048901199,NL +1048901200,1048901207,DE +1048901208,1048901311,NL +1048901312,1048901319,DE +1048901320,1048901327,NL +1048901328,1048901335,DE +1048901336,1048901615,NL +1048901616,1048901623,DE +1048901624,1048901831,NL +1048901832,1048901839,DE +1048901840,1048901847,NL +1048901848,1048901863,DE +1048901864,1048902335,NL +1048902336,1048902343,DE +1048902344,1048902359,NL +1048902360,1048902367,DE +1048902368,1048902391,NL +1048902392,1048902399,DE +1048902400,1048902447,NL +1048902448,1048902455,DE +1048902456,1048902527,NL +1048902528,1048902535,DE +1048902536,1048902583,NL +1048902584,1048902591,DE +1048902592,1048902671,NL +1048902672,1048902679,DE +1048902680,1048903071,NL +1048903072,1048903079,DE +1048903080,1048903095,NL +1048903096,1048903103,DE +1048903104,1048903679,NL +1048903680,1048911871,GB 1048911872,1048920063,IT 1048920064,1048936447,NL 1048936448,1048944639,PL @@ -5364,42 +6104,109 @@ 1048953440,1048954967,NL 1048954968,1048954975,BE 1048954976,1048969215,NL -1048969216,1048973823,DE +1048969216,1048969855,EU +1048969856,1048969887,DE +1048969888,1048971063,EU +1048971064,1048971068,DE +1048971069,1048971327,EU +1048971328,1048971391,DE +1048971392,1048972719,EU +1048972720,1048972727,DE +1048972728,1048973439,EU +1048973440,1048973567,DE +1048973568,1048974335,EU 1048974336,1048975183,DE +1048975184,1048976287,EU 1048976288,1048976295,DE +1048976296,1048976296,EU 1048976297,1048976302,DE +1048976303,1048976303,EU 1048976304,1048976319,DE +1048976320,1048976383,EU 1048976384,1048976447,DE -1048976512,1048978943,DE +1048976448,1048976511,EU +1048976512,1048977407,DE +1048977408,1048978431,EU +1048978432,1048978943,DE +1048978944,1048979135,EU 1048979136,1048979295,DE -1048979328,1048980495,DE +1048979296,1048979455,EU +1048979456,1048980495,DE +1048980496,1048980511,EU 1048980512,1048980527,DE +1048980528,1048980559,EU 1048980560,1048980731,DE +1048980732,1048980735,EU 1048980736,1048980791,DE +1048980792,1048980803,EU 1048980804,1048980807,DE +1048980808,1048980815,EU 1048980816,1048980823,DE -1048980832,1048980847,DE +1048980824,1048980831,EU +1048980832,1048980959,DE +1048980960,1048980967,EU 1048980968,1048980975,DE +1048980976,1048981503,EU 1048981504,1048981759,DE +1048981760,1048981791,EU 1048981792,1048981823,DE -1048982016,1048983039,DE -1048983168,1048983679,DE -1048983808,1048984127,DE +1048981824,1048982015,EU +1048982016,1048982607,DE +1048982608,1048982624,EU +1048982625,1048982663,DE +1048982664,1048982687,EU +1048982688,1048982695,DE +1048982696,1048982720,EU +1048982721,1048982782,DE +1048982783,1048982823,EU +1048982824,1048982943,DE +1048982944,1048982959,EU +1048982960,1048983023,DE +1048983024,1048983167,EU +1048983168,1048983423,DE +1048983424,1048983487,EU +1048983488,1048983679,DE +1048983680,1048984831,EU 1048984832,1048985167,DE +1048985168,1048985183,EU 1048985184,1048985199,DE +1048985200,1048985215,EU 1048985216,1048985375,DE -1048985600,1049002015,DE +1048985376,1048986879,EU +1048986880,1048987135,DE +1048987136,1049001983,EU +1049001984,1049002015,DE +1049002016,1049002175,EU 1049002176,1049002239,DE -1049002368,1049002495,DE +1049002240,1049002623,EU 1049002624,1049002751,DE +1049002752,1049003263,EU 1049003264,1049004291,DE +1049004292,1049004351,EU 1049004352,1049004415,DE -1049004544,1049006463,DE -1049006504,1049006511,DE -1049006592,1049007111,DE -1049007120,1049007167,DE -1049007360,1049011711,DE -1049012224,1049012479,DE +1049004416,1049004543,EU +1049004544,1049006079,DE +1049006080,1049007103,EU +1049007104,1049007111,DE +1049007112,1049007119,EU +1049007120,1049007135,DE +1049007136,1049007359,EU +1049007360,1049009535,DE +1049009536,1049009559,EU +1049009560,1049009567,DE +1049009568,1049009583,EU +1049009584,1049009615,DE +1049009616,1049009623,EU +1049009624,1049009631,DE +1049009632,1049009647,EU +1049009648,1049009662,DE +1049009663,1049009663,EU +1049009664,1049011711,DE +1049011712,1049011967,EU +1049011968,1049012223,DE +1049012224,1049012224,EU +1049012225,1049012226,DE +1049012227,1049012735,EU 1049012736,1049016703,DE 1049016704,1049016711,FR 1049016712,1049016715,RU @@ -5407,31 +6214,46 @@ 1049016744,1049016751,MA 1049016752,1049016759,DE 1049016760,1049016767,FR -1049016768,1049016847,DE +1049016768,1049016815,DE +1049016816,1049016831,NL +1049016832,1049016847,DE 1049016848,1049016863,FR 1049016864,1049017983,DE 1049017984,1049018047,GE 1049018048,1049020127,DE 1049020128,1049020135,FR -1049020136,1049020463,DE -1049020464,1049020471,GE -1049020472,1049026559,DE -1049026816,1049031679,DE -1049031936,1049032143,DE -1049032160,1049032167,DE -1049032176,1049032699,DE +1049020136,1049020479,DE +1049020480,1049020543,GE +1049020544,1049026559,DE +1049026560,1049026815,EU +1049026816,1049032143,DE +1049032144,1049032167,EU +1049032168,1049032171,DE +1049032172,1049032175,EU +1049032176,1049032287,DE +1049032288,1049032295,EU +1049032296,1049032383,DE +1049032384,1049032399,EU +1049032400,1049032639,DE +1049032640,1049032647,EU +1049032648,1049032699,DE +1049032700,1049032703,EU 1049032704,1049034751,DE +1049034752,1049067519,EG 1049067520,1049100287,DK 1049100288,1049231359,GB 1049231360,1049296895,DE -1049362432,1049362575,DE -1049362576,1049362943,GB +1049296896,1049362431,EG +1049362432,1049362591,DE +1049362592,1049362943,GB 1049362944,1049362959,DE 1049362960,1049363071,GB 1049363072,1049363135,DE 1049363136,1049363967,GB 1049363968,1049364223,DE -1049364224,1049365711,GB +1049364224,1049364991,GB +1049364992,1049365247,DE +1049365248,1049365711,GB 1049365712,1049365719,DE 1049365720,1049365727,GB 1049365728,1049365751,DE @@ -5443,13 +6265,18 @@ 1049366336,1049366399,DE 1049366400,1049366527,GB 1049366528,1049368575,DE -1049368576,1049369599,GB +1049368576,1049368671,GB +1049368672,1049368687,DE +1049368688,1049369599,GB 1049369600,1049369935,DE 1049369936,1049369983,GB -1049369984,1049370255,DE +1049369984,1049370047,DE +1049370048,1049370175,GB +1049370176,1049370255,DE 1049370256,1049370367,GB 1049370368,1049370623,DE 1049370624,1049378815,AT +1049378816,1049395199,EG 1049395200,1049405055,NL 1049405056,1049405183,GB 1049405184,1049405247,LU @@ -5476,26 +6303,26 @@ 1049460736,1049468927,NO 1049468928,1049477119,DE 1049477120,1049493503,PL -1049493504,1049518079,FI +1049493504,1049512047,FI +1049512048,1049512055,AX +1049512056,1049518079,FI 1049518080,1049518095,GB -1049518096,1049547295,FI -1049547296,1049547327,AF -1049547328,1049559039,FI +1049518096,1049559039,FI 1049559040,1049653095,DE 1049653096,1049653103,US 1049653104,1049698303,DE -1049698304,1049707519,NL +1049698304,1049706495,NL +1049706496,1049707007,GB +1049707008,1049707519,NL 1049707520,1049707775,LB 1049707776,1049708031,DZ -1049708032,1049708543,IQ -1049708544,1049710079,DZ -1049710080,1049711103,NL -1049711104,1049711359,IR -1049711360,1049711615,NL -1049711616,1049712127,PK -1049712128,1049712383,SA -1049712384,1049712511,IR -1049712512,1049712639,LB +1049708032,1049709055,GB +1049709056,1049709311,NL +1049709312,1049709567,GB +1049709568,1049709823,A2 +1049709824,1049710079,US +1049710080,1049710591,NL +1049710592,1049712639,GB 1049712640,1049713055,IR 1049713056,1049713087,MA 1049713088,1049713151,IR @@ -5522,28 +6349,24 @@ 1049758064,1049758071,PL 1049758072,1049758095,DE 1049758096,1049758103,ES -1049758104,1049759983,DE +1049758104,1049758527,DE +1049758528,1049758559,DK +1049758560,1049759983,DE 1049759984,1049759999,AE -1049760000,1049760871,DE -1049760872,1049760879,ES -1049760880,1049760959,DE +1049760000,1049760639,DE +1049760640,1049760703,IT +1049760704,1049760927,DE +1049760928,1049760959,DK 1049760960,1049761023,PL 1049761024,1049761791,DE 1049761792,1049762047,PL -1049762048,1049762055,ES -1049762056,1049762831,DE -1049762832,1049762835,CH -1049762836,1049763055,DE -1049763056,1049763063,CH -1049763064,1049763871,DE -1049763872,1049763903,PL -1049763904,1049764431,DE -1049764432,1049764439,ES -1049764440,1049764447,DE +1049762048,1049762271,DE +1049762272,1049762303,DK +1049762304,1049763039,DE +1049763040,1049763055,CH +1049763056,1049764447,DE 1049764448,1049764463,AE -1049764464,1049764967,DE -1049764968,1049764975,CH -1049764976,1049765695,DE +1049764464,1049765695,DE 1049765696,1049765791,PL 1049765792,1049766415,DE 1049766416,1049766431,ES @@ -5551,9 +6374,9 @@ 1049766512,1049766527,AE 1049766528,1049767935,DE 1049767936,1049767951,AE -1049767952,1049768175,DE -1049768176,1049768191,AT -1049768192,1049768367,DE +1049767952,1049768063,DE +1049768064,1049768095,DK +1049768096,1049768367,DE 1049768368,1049768375,NL 1049768376,1049768383,GB 1049768384,1049768767,DE @@ -5562,48 +6385,40 @@ 1049769120,1049769151,AE 1049769152,1049770111,DE 1049770112,1049770127,AE -1049770128,1049770303,DE -1049770304,1049770311,ES -1049770312,1049771903,DE -1049771904,1049771967,AT -1049771968,1049772895,DE +1049770128,1049771391,DE +1049771392,1049771519,IT +1049771520,1049772895,DE 1049772896,1049772927,AE 1049772928,1049773055,ES 1049773056,1049773311,PL -1049773312,1049775047,DE -1049775048,1049775055,CH -1049775056,1049775087,DE +1049773312,1049774367,DE +1049774368,1049774399,IT +1049774400,1049775087,DE 1049775088,1049775103,AE 1049775104,1049775119,CH 1049775120,1049776447,DE 1049776448,1049776479,AE -1049776480,1049776695,DE -1049776696,1049776703,AT -1049776704,1049777023,DE +1049776480,1049777023,DE 1049777024,1049777039,CH -1049777040,1049777951,DE -1049777952,1049777959,IT -1049777960,1049778111,DE +1049777040,1049778111,DE 1049778112,1049778143,ES 1049778144,1049778335,DE 1049778336,1049778351,AE -1049778352,1049778495,DE -1049778496,1049778527,IT -1049778528,1049778535,DE +1049778352,1049778535,DE 1049778536,1049778543,AT -1049778544,1049778991,DE -1049778992,1049778999,CR -1049779000,1049779063,DE +1049778544,1049779063,DE 1049779064,1049779071,PL 1049779072,1049779135,DE 1049779136,1049779167,AE 1049779168,1049782303,DE 1049782304,1049782335,AE -1049782336,1049782543,DE -1049782544,1049782551,ES -1049782552,1049782743,DE +1049782336,1049782623,DE +1049782624,1049782639,ES +1049782640,1049782743,DE 1049782744,1049782751,IT -1049782752,1049783743,DE +1049782752,1049783071,DE +1049783072,1049783103,DK +1049783104,1049783743,DE 1049783744,1049783759,AE 1049783760,1049784575,DE 1049784576,1049784831,PL @@ -5611,14 +6426,9 @@ 1049785000,1049785007,AT 1049785008,1049787135,DE 1049787136,1049787391,PL -1049787392,1049787647,DE -1049787648,1049788159,PL -1049788160,1049788415,GB -1049788416,1049791047,DE -1049791048,1049791055,PL -1049791056,1049791679,DE -1049791680,1049791695,ES -1049791696,1049817151,DE +1049787392,1049790207,DE +1049790208,1049790463,LU +1049790464,1049817151,DE 1049817152,1049817159,PL 1049817160,1049817287,DE 1049817288,1049817295,AE @@ -5630,7 +6440,9 @@ 1049911296,1049919487,FI 1049919488,1049927679,RU 1049927680,1049935871,NL -1049935872,1049944063,FI +1049935872,1049937391,FI +1049937392,1049937399,AX +1049937400,1049944063,FI 1049944064,1049952255,RU 1049952256,1049960447,UA 1049960448,1049968639,GB @@ -5640,19 +6452,18 @@ 1050083328,1050148863,ES 1050148864,1050157055,CY 1050157056,1050173439,RU -1050173440,1050189823,IT +1050173440,1050174063,IT +1050174064,1050174079,FR +1050174080,1050181631,IT +1050181632,1050189823,PL 1050189824,1050198015,DE -1050198016,1050206207,CH +1050198016,1050206207,RU 1050206208,1050214399,SK -1050214400,1050238047,DE -1050238048,1050238055,DK -1050238056,1050244935,DE +1050214400,1050244935,DE 1050244936,1050244943,PL 1050244944,1050320231,DE 1050320232,1050320239,GB -1050320240,1050330023,DE -1050330024,1050330031,CZ -1050330032,1050340607,DE +1050320240,1050340607,DE 1050340608,1050340639,US 1050340640,1050450711,DE 1050450712,1050450719,NL @@ -5660,17 +6471,15 @@ 1050471392,1050471399,IT 1050471400,1050502559,DE 1050502560,1050502567,US -1050502568,1050505215,DE -1050505216,1050505247,CA -1050505248,1050515647,DE +1050502568,1050505247,DE +1050505248,1050505279,CA +1050505280,1050507503,DE +1050507504,1050507519,A2 +1050507520,1050515647,DE 1050515648,1050515663,DK 1050515664,1050522407,DE 1050522408,1050522415,CH -1050522416,1050522623,DE -1050522624,1050522879,US -1050522880,1050616655,DE -1050616656,1050616671,CN -1050616672,1050619503,DE +1050522416,1050619503,DE 1050619504,1050619511,CH 1050619512,1050621407,DE 1050621408,1050621439,BE @@ -5728,211 +6537,78 @@ 1050768559,1050804223,FR 1050804224,1050869759,MK 1050869760,1050935295,NL +1050935296,1050940927,EU +1050940928,1050941183,ES +1050941184,1050943231,EU +1050943232,1050943487,ES +1050943488,1050945535,EU +1050945536,1050945791,ES +1050945792,1050948607,EU +1050948608,1050948863,ES +1050948864,1050968063,EU 1050968064,1051000831,GB 1051000832,1051017215,RU 1051017216,1051033599,NL 1051033600,1051049983,FI 1051049984,1051066367,HU 1051066368,1051084287,NL -1051084288,1051084799,BE -1051084800,1051096831,NL -1051096832,1051097087,BE -1051097088,1051098111,NL -1051098112,1051099135,BE -1051099136,1051099647,NL -1051099648,1051099655,BE -1051099656,1051099703,NL -1051099704,1051099711,BE -1051099712,1051099727,NL -1051099728,1051099735,BE -1051099736,1051099743,NL -1051099744,1051099775,BE -1051099776,1051099791,NL -1051099792,1051099799,BE -1051099800,1051099807,NL -1051099808,1051099815,BE -1051099816,1051099823,NL -1051099824,1051099839,BE -1051099840,1051099863,NL -1051099864,1051099879,BE -1051099880,1051099887,NL -1051099888,1051099903,BE -1051099904,1051099919,NL -1051099920,1051099927,BE -1051099928,1051099999,NL -1051100000,1051100015,BE -1051100016,1051100023,NL -1051100024,1051100031,BE -1051100032,1051100039,NL -1051100040,1051100047,BE -1051100048,1051100055,NL -1051100056,1051100071,BE -1051100072,1051100111,NL -1051100112,1051100135,BE -1051100136,1051100159,NL -1051100160,1051100415,BE -1051100416,1051100423,NL -1051100424,1051100431,BE -1051100432,1051100447,NL -1051100448,1051100455,BE -1051100456,1051100471,NL -1051100472,1051100487,BE -1051100488,1051100503,NL -1051100504,1051100523,BE -1051100524,1051100527,NL -1051100528,1051100551,BE -1051100552,1051100559,NL -1051100560,1051100575,BE -1051100576,1051100583,NL -1051100584,1051100591,BE -1051100592,1051100607,NL -1051100608,1051100631,BE -1051100632,1051100671,NL -1051100672,1051100679,BE -1051100680,1051100687,NL -1051100688,1051100695,BE -1051100696,1051100703,NL -1051100704,1051100711,BE -1051100712,1051100735,NL -1051100736,1051100743,BE -1051100744,1051100751,NL -1051100752,1051100799,BE -1051100800,1051100807,NL -1051100808,1051100831,BE -1051100832,1051100847,NL -1051100848,1051100863,BE -1051100864,1051100919,NL -1051100920,1051100935,BE -1051100936,1051100979,NL -1051100980,1051100983,BE -1051100984,1051100991,NL -1051100992,1051101023,BE -1051101024,1051101035,NL -1051101036,1051101039,BE -1051101040,1051101055,NL -1051101056,1051101079,BE -1051101080,1051101111,NL -1051101112,1051101119,BE -1051101120,1051101151,NL -1051101152,1051101183,BE -1051101184,1051101239,NL -1051101240,1051101247,BE -1051101248,1051101279,NL -1051101280,1051101287,BE -1051101288,1051101407,NL -1051101408,1051101415,BE -1051101416,1051101431,NL -1051101432,1051101439,BE -1051101440,1051101599,NL -1051101600,1051101607,BE -1051101608,1051101639,NL -1051101640,1051101647,BE -1051101648,1051101679,NL -1051101680,1051101687,BE -1051101688,1051101719,NL -1051101720,1051101735,BE -1051101736,1051101783,NL -1051101784,1051101791,BE -1051101792,1051102143,NL -1051102144,1051102159,BE -1051102160,1051102207,NL -1051102208,1051102727,BE -1051102728,1051103233,NL -1051103234,1051103239,BE -1051103240,1051103439,NL -1051103440,1051103447,BE -1051103448,1051103543,NL -1051103544,1051103551,BE -1051103552,1051103639,NL -1051103640,1051103647,BE -1051103648,1051103695,NL -1051103696,1051103703,BE -1051103704,1051103767,NL -1051103768,1051103775,BE -1051103776,1051103919,NL -1051103920,1051103927,BE -1051103928,1051103967,NL -1051103968,1051103975,BE -1051103976,1051104111,NL -1051104112,1051104143,BE -1051104144,1051104167,NL -1051104168,1051104175,BE -1051104176,1051104231,NL -1051104232,1051104247,BE -1051104248,1051104383,NL -1051104384,1051104391,BE -1051104392,1051104615,NL -1051104616,1051104623,BE -1051104624,1051104951,NL -1051104952,1051104959,BE -1051104960,1051104991,NL -1051104992,1051104999,BE -1051105000,1051105047,NL -1051105048,1051105055,BE -1051105056,1051105111,NL -1051105112,1051105119,BE -1051105120,1051105143,NL -1051105144,1051105151,BE -1051105152,1051105271,NL -1051105272,1051105279,BE -1051105280,1051106031,NL -1051106032,1051106039,BE -1051106040,1051106047,NL -1051106048,1051106055,BE -1051106056,1051106111,NL -1051106112,1051106119,BE -1051106120,1051106167,NL -1051106168,1051106175,BE -1051106176,1051106183,NL -1051106184,1051106191,BE -1051106192,1051106247,NL -1051106248,1051106255,BE -1051106256,1051106303,NL -1051106304,1051106311,BE -1051106312,1051106335,NL -1051106336,1051106343,BE -1051106344,1051106391,NL -1051106392,1051106399,BE -1051106400,1051106543,NL -1051106544,1051106551,BE -1051106552,1051106591,NL -1051106592,1051106599,BE -1051106600,1051106663,NL -1051106664,1051106671,BE -1051106672,1051106759,NL -1051106760,1051106767,BE -1051106768,1051106823,NL -1051106824,1051106831,BE -1051106832,1051106847,NL -1051106848,1051106863,BE -1051106864,1051106943,NL -1051106944,1051106951,BE -1051106952,1051106959,NL -1051106960,1051106967,BE -1051106968,1051107071,NL -1051107072,1051107079,BE -1051107080,1051107103,NL -1051107104,1051107111,BE -1051107112,1051107159,NL -1051107160,1051107167,BE -1051107168,1051107183,NL -1051107184,1051107199,BE -1051107200,1051107207,NL -1051107208,1051107215,BE -1051107216,1051107295,NL -1051107296,1051107303,BE -1051107304,1051107329,NL -1051107330,1051107359,BE -1051107360,1051107391,NL -1051107392,1051107407,BE -1051107408,1051107519,NL -1051107520,1051107839,BE -1051107840,1051115519,NL +1051084288,1051084415,BE +1051084416,1051084423,NL +1051084424,1051084655,BE +1051084656,1051084663,NL +1051084664,1051084711,BE +1051084712,1051084719,NL +1051084720,1051084727,BE +1051084728,1051084735,NL +1051084736,1051084799,BE +1051084800,1051102207,NL +1051102208,1051102463,BE +1051102464,1051102471,NL +1051102472,1051102527,BE +1051102528,1051102535,NL +1051102536,1051102559,BE +1051102560,1051102567,NL +1051102568,1051102687,BE +1051102688,1051102703,NL +1051102704,1051102879,BE +1051102880,1051102887,NL +1051102888,1051103007,BE +1051103008,1051103015,NL +1051103016,1051103111,BE +1051103112,1051103119,NL +1051103120,1051103207,BE +1051103208,1051103215,NL +1051103216,1051103231,BE +1051103232,1051115519,NL 1051115520,1051121287,BE 1051121288,1051121295,NL 1051121296,1051123711,BE -1051123712,1051125247,NL -1051125248,1051125759,BE +1051123712,1051123839,NL +1051123840,1051123855,BE +1051123856,1051123911,NL +1051123912,1051123935,BE +1051123936,1051124479,NL +1051124480,1051124607,BE +1051124608,1051124767,NL +1051124768,1051124815,BE +1051124816,1051124895,NL +1051124896,1051124911,BE +1051124912,1051125247,NL +1051125248,1051125263,BE +1051125264,1051125279,NL +1051125280,1051125327,BE +1051125328,1051125335,NL +1051125336,1051125343,BE +1051125344,1051125351,NL +1051125352,1051125375,BE +1051125376,1051125391,NL +1051125392,1051125399,BE +1051125400,1051125407,NL +1051125408,1051125575,BE +1051125576,1051125583,NL +1051125584,1051125639,BE +1051125640,1051125655,NL +1051125656,1051125759,BE 1051125760,1051131903,NL 1051131904,1051197439,CH 1051197440,1051213823,CZ @@ -5949,26 +6625,17 @@ 1051312128,1051328511,GR 1051328512,1051460095,GB 1051460096,1051460351,ES -1051460352,1051460639,GB -1051460640,1051460647,ES -1051460648,1051525119,GB +1051460352,1051525119,GB 1051525120,1051533311,MT +1051533312,1051541503,NG 1051541504,1051557887,GB 1051557888,1051566079,RU 1051566080,1051574271,IT -1051574272,1051574543,GB -1051574544,1051574551,IT -1051574552,1051574623,GB +1051574272,1051574623,GB 1051574624,1051574655,GM -1051574656,1051575879,GB -1051575880,1051575887,US -1051575888,1051575999,GB +1051574656,1051575999,GB 1051576000,1051576015,IT -1051576016,1051576903,GB -1051576904,1051576911,US -1051576912,1051576943,GB -1051576944,1051576959,DE -1051576960,1051577503,GB +1051576016,1051577503,GB 1051577504,1051577519,NL 1051577520,1051577535,GB 1051577536,1051577567,NL @@ -5981,7 +6648,7 @@ 1051577856,1051578111,NL 1051578112,1051578143,GB 1051578144,1051578175,NL -1051578176,1051578239,BE +1051578176,1051578239,GB 1051578240,1051578263,FR 1051578264,1051578271,GB 1051578272,1051578279,ES @@ -6016,145 +6683,297 @@ 1051803648,1051820031,CZ 1051820032,1051852799,NL 1051852800,1051918335,AT -1051918336,1051941119,PL -1051941120,1051941631,AT -1051941632,1051941887,PL -1051941888,1051942143,AT -1051942144,1051942911,PL -1051942912,1051983871,AT -1051983872,1051991551,DE -1051991808,1051991951,DE -1051991968,1051991999,DE -1051992064,1051995135,DE +1051918336,1051919359,PL +1051919360,1051920383,AT +1051920384,1051922431,PL +1051922432,1051983871,AT +1051983872,1051986687,EU +1051986688,1051987199,DE +1051987200,1051991807,EU +1051991808,1051991935,DE +1051991936,1051992063,EU +1051992064,1051994639,DE +1051994640,1051994647,EU +1051994648,1051994671,DE +1051994672,1051994699,EU +1051994700,1051994703,BE +1051994704,1051994715,EU +1051994716,1051994719,DE +1051994720,1051994751,BE +1051994752,1051994791,EU +1051994792,1051994799,NL +1051994800,1051994831,DE +1051994832,1051994863,EU +1051994864,1051994871,DE +1051994872,1051994943,EU +1051994944,1051995039,DE +1051995040,1051995391,EU 1051995392,1051996159,DE +1051996160,1051996335,EU 1051996336,1051996351,DE +1051996352,1051996879,EU 1051996880,1051996927,DE +1051996928,1051997439,EU 1051997440,1051997695,DE +1051997696,1051997711,EU 1051997712,1051997727,DE +1051997728,1051997951,EU 1051997952,1051997983,DE +1051997984,1051998247,EU 1051998248,1051998255,DE +1051998256,1051998687,EU 1051998688,1051998695,DE +1051998696,1051999039,EU 1051999040,1051999043,DE +1051999044,1051999135,EU 1051999136,1051999151,DE +1051999152,1051999167,EU 1051999168,1051999359,DE +1051999360,1051999487,EU 1051999488,1051999743,DE +1051999744,1051999999,EU 1052000000,1052000063,DE -1052000096,1052000111,DE -1052000128,1052000159,DE +1052000064,1052000127,EU +1052000128,1052000143,DE +1052000144,1052000191,EU 1052000192,1052000511,DE +1052000512,1052000519,EU 1052000520,1052000527,DE +1052000528,1052000535,EU 1052000536,1052000539,DE -1052000576,1052000623,DE +1052000540,1052000583,EU +1052000584,1052000623,DE +1052000624,1052000631,EU 1052000632,1052002303,DE -1052002312,1052002335,DE -1052002352,1052002431,DE +1052002304,1052002319,EU +1052002320,1052002335,DE +1052002336,1052002367,EU +1052002368,1052002431,DE +1052002432,1052002439,EU 1052002440,1052002447,DE +1052002448,1052002463,EU 1052002464,1052002511,DE +1052002512,1052002519,EU 1052002520,1052002523,DE -1052002528,1052002543,DE +1052002524,1052002527,EU +1052002528,1052002535,DE +1052002536,1052003327,EU 1052003328,1052003359,DE -1052003384,1052003455,DE +1052003360,1052003399,EU +1052003400,1052003455,DE +1052003456,1052003479,EU 1052003480,1052003487,DE +1052003488,1052003551,EU 1052003552,1052003839,DE +1052003840,1052003967,EU 1052003968,1052003999,DE +1052004000,1052004671,EU 1052004672,1052004759,DE +1052004760,1052004767,EU 1052004768,1052004783,DE +1052004784,1052004815,EU 1052004816,1052004831,DE +1052004832,1052004895,EU 1052004896,1052004959,DE +1052004960,1052005119,EU 1052005120,1052005151,DE +1052005152,1052005247,EU 1052005248,1052005631,DE +1052005632,1052005887,EU 1052005888,1052005911,DE -1052006528,1052006559,DE +1052005912,1052006543,EU +1052006544,1052006559,DE +1052006560,1052006575,EU 1052006576,1052006607,DE -1052007072,1052007103,DE -1052007432,1052007439,DE +1052006608,1052007039,EU +1052007040,1052007103,DE +1052007104,1052007431,EU +1052007432,1052007435,DE +1052007436,1052007455,EU 1052007456,1052007471,DE +1052007472,1052007519,EU 1052007520,1052007535,DE +1052007536,1052007775,EU 1052007776,1052007791,DE +1052007792,1052007935,EU 1052007936,1052008223,DE +1052008224,1052008515,EU 1052008516,1052008527,DE +1052008528,1052008543,EU 1052008544,1052008583,DE +1052008584,1052008607,EU 1052008608,1052008623,DE -1052008640,1052008687,DE +1052008624,1052008671,EU +1052008672,1052008687,DE +1052008688,1052008703,EU 1052008704,1052009087,DE +1052009088,1052009471,EU 1052009472,1052009487,DE +1052009488,1052009503,EU 1052009504,1052009535,DE +1052009536,1052009599,EU 1052009600,1052009607,DE -1052009616,1052009623,DE +1052009608,1052010463,EU 1052010464,1052010519,DE +1052010520,1052010527,EU 1052010528,1052010559,DE -1052010608,1052010655,DE +1052010560,1052010623,EU +1052010624,1052010655,DE +1052010656,1052010751,EU 1052010752,1052011135,DE -1052011264,1052012335,DE -1052012376,1052012383,DE -1052012512,1052013055,DE -1052013060,1052013063,DE -1052013072,1052013103,DE +1052011136,1052011263,EU +1052011264,1052012287,DE +1052012288,1052012303,EU +1052012304,1052012335,DE +1052012336,1052012375,EU +1052012376,1052012399,DE +1052012400,1052012543,EU +1052012544,1052013055,DE +1052013056,1052013071,EU +1052013072,1052013087,DE +1052013088,1052013119,EU 1052013120,1052013127,DE +1052013128,1052013143,EU 1052013144,1052013151,DE +1052013152,1052013215,EU 1052013216,1052013263,DE +1052013264,1052013311,EU 1052013312,1052013567,DE +1052013568,1052013695,EU 1052013696,1052013823,DE -1052013832,1052013855,DE +1052013824,1052013847,EU +1052013848,1052013855,DE +1052013856,1052013887,EU 1052013888,1052013951,DE -1052013960,1052013966,DE -1052013968,1052013983,DE -1052014000,1052014007,DE -1052014016,1052014303,DE +1052013952,1052013959,EU +1052013960,1052013963,DE +1052013964,1052014015,EU +1052014016,1052014079,DE +1052014080,1052014111,EU +1052014112,1052014303,DE +1052014304,1052014591,EU 1052014592,1052014623,DE +1052014624,1052015367,EU 1052015368,1052015375,DE +1052015376,1052015423,EU 1052015424,1052015519,DE -1052015552,1052015615,DE +1052015520,1052015551,EU +1052015552,1052015583,DE +1052015584,1052015631,EU 1052015632,1052015647,DE -1052015664,1052015679,DE +1052015648,1052015695,EU 1052015696,1052015727,DE +1052015728,1052015999,EU 1052016000,1052016127,DE +1052016128,1052016207,EU 1052016208,1052016223,DE +1052016224,1052016239,EU 1052016240,1052016247,DE +1052016248,1052016255,EU 1052016256,1052016323,DE -1052016352,1052016407,DE +1052016324,1052016447,EU 1052016448,1052016463,DE +1052016464,1052016479,EU 1052016480,1052016511,DE -1052016640,1052016671,DE +1052016512,1052016679,EU 1052016680,1052016687,DE -1052016768,1052016783,DE +1052016688,1052016895,EU 1052016896,1052017151,DE +1052017152,1052017231,EU 1052017232,1052017247,DE -1052017272,1052017343,DE -1052017472,1052017567,DE +1052017248,1052017279,EU +1052017280,1052017343,DE +1052017344,1052017471,EU +1052017472,1052017503,DE +1052017504,1052017535,EU +1052017536,1052017567,DE +1052017568,1052017599,EU 1052017600,1052017663,DE +1052017664,1052018167,EU 1052018168,1052018431,DE +1052018432,1052018719,EU 1052018720,1052018767,DE +1052018768,1052019199,EU 1052019200,1052019455,DE +1052019456,1052019735,EU 1052019736,1052019775,DE -1052019872,1052020047,DE -1052020064,1052020095,DE +1052019776,1052019903,EU +1052019904,1052020047,DE +1052020048,1052020672,EU 1052020673,1052020702,DE -1052020704,1052041599,DE +1052020703,1052020703,EU +1052020704,1052020735,DE +1052020736,1052022527,EU +1052022528,1052022783,DE +1052022784,1052024831,EU +1052024832,1052041279,DE +1052041280,1052041295,EU +1052041296,1052041327,DE +1052041328,1052041335,EU +1052041336,1052041359,DE +1052041360,1052041375,EU +1052041376,1052041599,DE +1052041600,1052041727,EU 1052041728,1052041863,DE +1052041864,1052041983,EU 1052041984,1052042047,DE 1052042048,1052042087,NL -1052042088,1052042239,DE +1052042088,1052042095,DE +1052042096,1052042143,EU +1052042144,1052042183,DE +1052042184,1052042223,EU +1052042224,1052042239,DE +1052042240,1052042303,EU 1052042304,1052042311,DE +1052042312,1052042367,EU 1052042368,1052042431,DE -1052042480,1052042751,DE +1052042432,1052042479,EU +1052042480,1052042519,DE +1052042520,1052042559,EU +1052042560,1052042575,DE +1052042576,1052042583,EU +1052042584,1052042687,DE +1052042688,1052042703,EU +1052042704,1052042751,DE +1052042752,1052042815,EU 1052042816,1052042863,DE -1052043008,1052043263,DE +1052042864,1052043007,EU +1052043008,1052043103,DE +1052043104,1052043111,EU +1052043112,1052043127,DE +1052043128,1052043167,EU +1052043168,1052043263,DE +1052043264,1052043527,EU 1052043528,1052043535,DE +1052043536,1052043551,EU 1052043552,1052043575,DE +1052043576,1052043583,EU 1052043584,1052043651,DE +1052043652,1052043663,EU 1052043664,1052043679,DE +1052043680,1052043759,EU 1052043760,1052043775,DE +1052043776,1052044287,EU 1052044288,1052044351,DE +1052044352,1052044383,EU 1052044384,1052044399,DE +1052044400,1052044415,EU 1052044416,1052044447,DE +1052044448,1052044511,EU 1052044512,1052044527,DE +1052044528,1052044543,EU 1052044544,1052044927,DE -1052045024,1052046135,DE -1052046336,1052046719,DE +1052044928,1052045023,EU +1052045024,1052045055,DE +1052045056,1052045311,EU +1052045312,1052046135,DE +1052046136,1052046335,EU +1052046336,1052046591,DE +1052046592,1052046847,EU 1052046848,1052047139,DE -1052047360,1052047871,DE +1052047140,1052049151,EU 1052049152,1052049183,DE +1052049184,1052049407,EU 1052049408,1052057599,PL 1052057600,1052065791,RU 1052065792,1052082175,SE @@ -6165,26 +6984,29 @@ 1052119040,1052121087,RO 1052121088,1052129279,RU 1052129280,1052131327,BE -1052131328,1052135423,RU +1052133376,1052135423,RU 1052135424,1052137471,UA 1052137472,1052139519,RU 1052139520,1052141567,DE -1052141568,1052143615,RU 1052143616,1052145663,BG 1052145664,1052147711,UA -1052147712,1052153855,RU +1052147712,1052151807,RU +1052151808,1052153855,PL 1052153856,1052157951,UA 1052157952,1052159999,DK -1052160000,1052162047,BE +1052160000,1052162047,LU 1052162048,1052164095,CH -1052164096,1052170239,RU +1052164096,1052168191,RU +1052168192,1052170239,PL 1052170240,1052172287,SE 1052172288,1052174335,PL 1052174336,1052176383,CZ 1052176384,1052178431,NL 1052178432,1052180479,DK 1052180480,1052213247,RU -1052213248,1052246015,FI +1052213248,1052232807,FI +1052232808,1052232823,AX +1052232824,1052246015,FI 1052246016,1052247039,DE 1052247040,1052247295,FR 1052247296,1052247359,DE @@ -6267,21 +7089,27 @@ 1052278832,1052278847,AT 1052278848,1052278863,ZA 1052278864,1052278879,NL -1052278880,1052286975,GB +1052278880,1052284607,GB +1052284608,1052284671,EU +1052284672,1052286975,GB 1052286976,1052287487,CH 1052287488,1052288255,SE +1052288256,1052288287,EU 1052288288,1052288295,IL 1052288296,1052288303,BE 1052288304,1052288319,AT +1052288320,1052288383,EU 1052288384,1052288511,FR 1052288512,1052289023,AT 1052289024,1052289151,GB 1052289152,1052289183,CH 1052289184,1052289215,DE 1052289216,1052289279,GB +1052289280,1052289535,EU 1052289536,1052290047,GB 1052290048,1052290063,CH 1052290064,1052290303,GB +1052290304,1052290367,EU 1052290368,1052290399,CH 1052290400,1052290431,ZA 1052290432,1052290559,FR @@ -6300,6 +7128,7 @@ 1052291696,1052291711,CH 1052291712,1052292095,FR 1052292096,1052299263,GB +1052299264,1052299775,EU 1052299776,1052303359,GB 1052303360,1052307455,DE 1052307456,1052309247,CH @@ -6318,7 +7147,7 @@ 1052311968,1052311999,DE 1052312000,1052312063,CH 1052312064,1052312767,DE -1052312768,1052312831,NL +1052312768,1052312831,EU 1052312832,1052312895,DE 1052312896,1052312903,CH 1052312904,1052312911,ES @@ -6340,6 +7169,7 @@ 1052316336,1052316767,DE 1052316768,1052316799,IT 1052316800,1052316927,DE +1052316928,1052317183,EU 1052317184,1052317599,DE 1052317600,1052317607,BE 1052317608,1052317615,DE @@ -6349,7 +7179,9 @@ 1052318048,1052318079,ES 1052318080,1052318207,SE 1052318208,1052318719,DE +1052318720,1052319231,EU 1052319232,1052319743,DE +1052319744,1052319999,EU 1052320000,1052320079,GB 1052320080,1052320087,CZ 1052320088,1052320095,GB @@ -6394,6 +7226,7 @@ 1052333104,1052333119,CH 1052333120,1052333183,FR 1052333184,1052333311,ZA +1052333312,1052333567,EU 1052333568,1052334751,IT 1052334752,1052334759,NL 1052334760,1052334767,ZA @@ -6454,7 +7287,9 @@ 1052345152,1052345247,FR 1052345248,1052345279,IT 1052345280,1052345343,DE -1052345344,1052345503,NL +1052345344,1052345471,NL +1052345472,1052345487,EU +1052345488,1052345503,NL 1052345504,1052345535,ZA 1052345536,1052345551,AT 1052345552,1052345567,GB @@ -6485,6 +7320,7 @@ 1052349440,1052352559,GB 1052352560,1052352591,ZA 1052352592,1052352607,GB +1052352608,1052352639,EU 1052352640,1052352703,GB 1052352704,1052352767,DE 1052352768,1052352927,GB @@ -6493,6 +7329,7 @@ 1052352992,1052353023,BE 1052353024,1052353279,IT 1052353280,1052353407,DE +1052353408,1052353535,EU 1052353536,1052354111,DE 1052354112,1052354175,TR 1052354176,1052354559,DE @@ -6538,6 +7375,7 @@ 1052362784,1052362815,GB 1052362816,1052362879,CH 1052362880,1052363039,ES +1052363040,1052363071,EU 1052363072,1052363135,GB 1052363136,1052363263,ES 1052363264,1052364543,DE @@ -6561,6 +7399,7 @@ 1052369152,1052369407,IE 1052369408,1052369663,HU 1052369664,1052369855,CZ +1052369856,1052369887,EU 1052369888,1052369919,CZ 1052369920,1052370175,NO 1052370176,1052370431,DK @@ -6573,10 +7412,12 @@ 1052372288,1052372351,FI 1052372352,1052374015,GB 1052374016,1052375039,CH -1052375296,1052375551,DE +1052375040,1052375551,DE +1052375552,1052375679,EU 1052375680,1052375711,DE 1052375712,1052375807,FR 1052375808,1052376063,DE +1052376064,1052376319,EU 1052376320,1052376831,DE 1052376832,1052377087,ES 1052377088,1052377535,DE @@ -6587,6 +7428,7 @@ 1052377792,1052377855,GB 1052377856,1052377871,DE 1052377872,1052377887,CH +1052377888,1052377919,EU 1052377920,1052377951,DE 1052377952,1052377983,FR 1052377984,1052378047,GB @@ -6598,6 +7440,7 @@ 1052379032,1052379039,DE 1052379040,1052379103,GB 1052379104,1052379135,SE +1052379136,1052379391,EU 1052379392,1052379791,DE 1052379792,1052379799,GB 1052379800,1052379807,NL @@ -6607,7 +7450,9 @@ 1052380064,1052380127,DE 1052380128,1052380159,NL 1052380160,1052381183,DE +1052381184,1052381439,EU 1052381440,1052382623,DE +1052382624,1052382655,EU 1052382656,1052382719,ES 1052382720,1052382975,DE 1052382976,1052383999,GB @@ -6642,6 +7487,7 @@ 1052396800,1052396863,TR 1052396864,1052396927,RO 1052396928,1052397439,HU +1052397440,1052397567,EU 1052397568,1052399039,IT 1052399040,1052399103,NO 1052399104,1052399903,IT @@ -6705,14 +7551,18 @@ 1052409952,1052409983,BE 1052409984,1052410047,GB 1052410048,1052410111,BE +1052410112,1052411135,EU 1052411136,1052412327,NL +1052412328,1052412335,EU 1052412336,1052412343,NL 1052412344,1052412351,GB 1052412352,1052412415,CH -1052412416,1052412831,NL +1052412416,1052412671,EU +1052412672,1052412831,NL 1052412832,1052412863,DE 1052412864,1052413951,NL 1052413952,1052414335,CZ +1052414336,1052414463,EU 1052414464,1052414975,IE 1052414976,1052415999,BE 1052416000,1052416575,DE @@ -6727,10 +7577,12 @@ 1052417120,1052417151,IT 1052417152,1052417279,GB 1052417280,1052417359,NO +1052417360,1052417367,EU 1052417368,1052417535,NO 1052417536,1052418047,ZA 1052418048,1052419583,BE 1052419584,1052420031,IT +1052420032,1052420063,EU 1052420064,1052420095,IT 1052420096,1052420735,GB 1052420736,1052420767,DE @@ -6744,9 +7596,12 @@ 1052422880,1052423199,ZA 1052423200,1052423231,CH 1052423232,1052423295,ZA +1052423296,1052423303,EU 1052423304,1052423311,CH +1052423312,1052423359,EU 1052423360,1052423423,NL 1052423424,1052423967,ZA +1052423968,1052423999,EU 1052424000,1052424799,ZA 1052424800,1052424815,GB 1052424816,1052424823,ES @@ -6756,8 +7611,11 @@ 1052425152,1052425215,BE 1052425216,1052426239,ZA 1052426240,1052426319,PT +1052426320,1052426327,EU 1052426328,1052426495,PT +1052426496,1052426511,EU 1052426512,1052426527,FR +1052426528,1052427263,EU 1052427264,1052427839,CH 1052427840,1052427855,GB 1052427856,1052427871,IT @@ -6788,6 +7646,7 @@ 1052434752,1052434783,NO 1052434784,1052435455,GB 1052435456,1052435647,NL +1052435648,1052435679,EU 1052435680,1052436479,NL 1052436480,1052437023,DE 1052437024,1052437055,ZA @@ -6799,35 +7658,47 @@ 1052437248,1052437759,DE 1052437760,1052438015,CH 1052438016,1052438399,BE +1052438400,1052438527,EU 1052438528,1052439503,AT +1052439504,1052439519,EU 1052439520,1052439551,AT 1052439552,1052440575,FR 1052440576,1052441343,DE +1052441344,1052441599,EU 1052441600,1052442623,GB 1052442624,1052443647,DE +1052443648,1052446207,EU 1052446208,1052446719,DE 1052446720,1052447743,CZ 1052447744,1052447871,PL +1052447872,1052447999,EU 1052448000,1052448127,PL +1052448128,1052448255,EU 1052448256,1052450815,ZA 1052450816,1052451839,DE 1052451840,1052452159,NO +1052452160,1052452223,EU 1052452224,1052452351,NO 1052452352,1052452831,ES 1052452832,1052452847,GB 1052452848,1052452863,FR +1052452864,1052452991,EU 1052452992,1052452999,SK +1052453000,1052453119,EU 1052453120,1052453375,FR 1052453376,1052453887,AT 1052453888,1052454911,GB 1052454912,1052454943,FR 1052454944,1052454959,NL +1052454960,1052454975,EU 1052454976,1052455359,NL +1052455360,1052455423,EU 1052455424,1052455935,GB 1052455936,1052456447,NL 1052456448,1052456959,CH 1052456960,1052457983,NL 1052457984,1052458367,AT +1052458368,1052458431,EU 1052458432,1052458495,AT 1052458496,1052458847,NL 1052458848,1052458863,FR @@ -6835,36 +7706,50 @@ 1052458872,1052458879,FR 1052458880,1052460031,GB 1052460032,1052460127,NO +1052460128,1052460223,EU 1052460224,1052460287,FR +1052460288,1052460543,EU 1052460544,1052460799,NO 1052460800,1052461055,DE 1052461056,1052461295,FR 1052461296,1052461311,BE 1052461312,1052461951,FR +1052461952,1052461967,EU 1052461968,1052463103,FR 1052463104,1052463615,ES 1052463616,1052464639,GB 1052464640,1052464927,ES +1052464928,1052464959,EU 1052464960,1052465087,ES +1052465088,1052465151,EU 1052465152,1052465375,ZA +1052465376,1052465407,EU 1052465408,1052465663,ZA +1052465664,1052466431,EU 1052466432,1052468223,FR 1052468224,1052469247,GB 1052469248,1052470271,FR 1052470272,1052470783,ZA 1052470784,1052471007,FR +1052471008,1052471039,EU 1052471040,1052471295,BE 1052471296,1052472511,GB +1052472512,1052472575,EU 1052472576,1052475231,GB +1052475232,1052475239,EU 1052475240,1052475255,GB +1052475256,1052475263,EU 1052475264,1052475391,GB 1052475392,1052476383,FR +1052476384,1052476415,EU 1052476416,1052479487,FR 1052479488,1052479743,NL 1052479744,1052479999,DE 1052480000,1052483583,NL 1052483584,1052483999,IT +1052484000,1052484031,EU 1052484032,1052485279,IT +1052485280,1052485311,EU 1052485312,1052485631,IT 1052485632,1052486655,GB 1052486656,1052486911,CH @@ -6878,8 +7763,10 @@ 1052489728,1052490239,IE 1052490240,1052490751,SE 1052490752,1052491679,AT +1052491680,1052491687,EU 1052491688,1052491775,AT 1052491776,1052493567,BE +1052493568,1052493695,EU 1052493696,1052494335,BE 1052494336,1052494591,NL 1052494592,1052495439,BE @@ -6888,29 +7775,47 @@ 1052495552,1052495583,GB 1052495584,1052495871,BE 1052495872,1052495879,UA +1052495880,1052496127,EU 1052496128,1052497407,DE +1052497408,1052497663,EU 1052497664,1052497919,DE 1052497920,1052498431,ES 1052498432,1052498495,RO +1052498496,1052498943,EU 1052498944,1052499455,GB +1052499456,1052499967,EU 1052499968,1052500191,DK +1052500192,1052500207,EU 1052500208,1052500319,DK +1052500320,1052500479,EU 1052500480,1052500991,GB 1052500992,1052501023,FI +1052501024,1052501031,EU 1052501032,1052501039,FI +1052501040,1052501119,EU 1052501120,1052501247,FI +1052501248,1052501503,EU 1052501504,1052502015,CH 1052502016,1052502783,IE +1052502784,1052502815,EU 1052502816,1052502847,IE +1052502848,1052503039,EU 1052503040,1052504319,GB 1052504320,1052504351,BY +1052504352,1052504383,EU 1052504384,1052507583,GB +1052507584,1052507647,EU 1052507648,1052507775,GB -1052507904,1052602495,GB +1052507776,1052507903,EU +1052507904,1052596447,GB +1052596448,1052596463,IT +1052596464,1052602495,GB 1052602496,1052602623,ES 1052602624,1052621951,GB 1052621952,1052622015,IE -1052622016,1052644095,GB +1052622016,1052634943,GB +1052634944,1052634951,IE +1052634952,1052644095,GB 1052644096,1052644351,SE 1052644352,1052647167,GB 1052647168,1052647423,SE @@ -6921,66 +7826,26 @@ 1052665600,1052684575,GB 1052684576,1052684607,IT 1052684608,1052770303,GB -1052770304,1052778495,CH +1052770304,1052775711,CH +1052775712,1052775727,DE +1052775728,1052775759,CH +1052775760,1052775767,GB +1052775768,1052777503,CH +1052777504,1052777535,IT +1052777536,1052778495,CH 1052778496,1052786687,RU 1052786688,1052803071,NL -1052803072,1052806655,DE +1052803072,1052806655,A2 1052806656,1052807167,MW -1052807168,1052811263,DE +1052807168,1052811263,A2 1052811264,1052819455,RU 1052819456,1052827647,DE 1052827648,1052835839,RU 1052835840,1052844031,IR 1052844032,1052852223,FR -1052868608,1052871959,CS -1052871960,1052871975,RS -1052871976,1052871991,CS -1052871992,1052872000,CS -1052872001,1052872011,RS -1052872012,1052872019,CS -1052872020,1052872095,RS -1052872096,1052872127,CS -1052872128,1052872143,CS -1052872144,1052872159,CS -1052872160,1052872191,CS -1052872192,1052872207,CS -1052872208,1052872235,RS -1052872236,1052872243,CS -1052872244,1052872255,RS -1052872256,1052872271,CS -1052872272,1052872311,RS -1052872312,1052872323,CS -1052872324,1052872343,RS -1052872344,1052872355,CS -1052872356,1052872371,RS -1052872372,1052872375,CS -1052872376,1052872383,RS -1052872384,1052872403,CS -1052872404,1052872407,RS -1052872408,1052872411,CS -1052872412,1052872435,RS -1052872436,1052872451,CS -1052872452,1052872495,RS -1052872496,1052872503,CS -1052872504,1052872507,RS -1052872508,1052872511,CS -1052872512,1052872523,RS -1052872524,1052872527,CS -1052872528,1052872539,RS -1052872540,1052872543,CS -1052872544,1052872559,RS -1052872560,1052872571,CS -1052872572,1052872591,RS -1052872592,1052872615,CS -1052872616,1052872639,RS -1052872640,1052872643,CS -1052872644,1052872679,RS -1052872680,1052872687,CS -1052872688,1052872823,RS -1052872824,1052872831,CS -1052872832,1052872883,RS -1052872884,1052872895,CS -1052872896,1052876799,RS +1052852224,1052868607,EG +1052868608,1052876799,RS +1052876800,1052884991,NG 1052884992,1052901375,FR 1052901376,1053032447,NL 1053032448,1053097983,IT @@ -6991,140 +7856,270 @@ 1053138944,1053147135,FI 1053147136,1053163519,SK 1053163520,1053294591,DK +1053294592,1053294847,EU 1053294848,1053295103,AT -1053295392,1053295471,AT +1053295104,1053295391,EU +1053295392,1053295423,AT +1053295424,1053295455,EU +1053295456,1053295471,AT +1053295472,1053295615,EU 1053295616,1053296639,AT 1053296640,1053296927,IT -1053296944,1053296959,IT -1053296992,1053297031,IT +1053296928,1053296991,EU +1053296992,1053297023,IT +1053297024,1053297039,EU 1053297040,1053297055,IT -1053297088,1053297151,IT +1053297056,1053297071,EU +1053297072,1053297087,IT +1053297088,1053297111,EU +1053297112,1053297135,IT +1053297136,1053297143,EU +1053297144,1053297151,IT +1053297152,1053298175,EU 1053298176,1053299199,CH -1053299712,1053300103,GB -1053300112,1053300119,GB -1053300128,1053300143,GB -1053300160,1053300735,GB +1053299200,1053299711,EU +1053299712,1053300159,GB +1053300160,1053300223,EU +1053300224,1053300735,GB 1053300736,1053300991,CH 1053300992,1053301023,FR -1053301040,1053301087,FR -1053301120,1053301183,FR -1053301200,1053301207,FR -1053301216,1053301343,FR -1053301352,1053301359,FR +1053301024,1053301039,EU +1053301040,1053301063,FR +1053301064,1053301071,EU +1053301072,1053301135,FR +1053301136,1053301167,EU +1053301168,1053301183,FR +1053301184,1053301199,EU +1053301200,1053301295,FR +1053301296,1053301303,EU +1053301304,1053301359,FR +1053301360,1053301367,EU 1053301368,1053301503,FR -1053302016,1053302055,FR +1053301504,1053302031,EU +1053302032,1053302055,FR 1053302056,1053302063,DE 1053302064,1053302159,FR -1053302176,1053302183,FR -1053302200,1053302207,FR -1053302256,1053302271,FR -1053302320,1053302335,FR -1053302384,1053302703,FR +1053302160,1053302175,EU +1053302176,1053302191,FR +1053302192,1053302303,EU +1053302304,1053302335,FR +1053302336,1053302367,EU +1053302368,1053302375,FR +1053302376,1053302383,EU +1053302384,1053302687,FR +1053302688,1053302703,EU 1053302704,1053302711,GB -1053302720,1053302751,FR -1053302760,1053302783,FR +1053302712,1053302719,FR +1053302720,1053302727,EU +1053302728,1053302783,FR +1053302784,1053305087,EU 1053305088,1053305951,GR +1053305952,1053306111,EU 1053306112,1053306879,GR -1053307904,1053308543,GB -1053308672,1053308927,GB +1053306880,1053307903,EU +1053307904,1053307951,GB +1053307952,1053307959,EU +1053307960,1053308095,GB +1053308096,1053308159,EU +1053308160,1053308543,GB +1053308544,1053308671,EU +1053308672,1053308767,GB +1053308768,1053308799,EU +1053308800,1053308863,GB +1053308864,1053308927,EU 1053308928,1053308991,ZA -1053309024,1053309055,ZA +1053308992,1053309183,EU 1053309184,1053309951,ZA +1053309952,1053311231,EU 1053311232,1053311359,CZ -1053312000,1053312831,DK -1053312848,1053312911,DK -1053313024,1053313327,GB -1053313344,1053313479,GB -1053313488,1053314047,GB +1053311360,1053312255,EU +1053312256,1053312511,DK +1053312512,1053312767,EU +1053312768,1053312815,DK +1053312816,1053312847,EU +1053312848,1053312871,DK +1053312872,1053312879,EU +1053312880,1053312911,DK +1053312912,1053312927,EU +1053312928,1053312959,DK +1053312960,1053313023,EU +1053313024,1053313343,GB +1053313344,1053313439,EU +1053313440,1053313599,GB +1053313600,1053313663,EU +1053313664,1053313671,GB +1053313672,1053313679,EU +1053313680,1053313791,GB +1053313792,1053313919,EU +1053313920,1053314047,GB +1053314048,1053314063,EU 1053314064,1053314079,CZ -1053315072,1053316655,GB -1053316672,1053316679,GB -1053316688,1053316695,GB -1053316704,1053316711,GB -1053316720,1053316863,GB +1053314080,1053315071,EU +1053315072,1053317119,GB 1053317120,1053317295,ZA +1053317296,1053317375,EU 1053317376,1053317631,GB +1053317632,1053318143,EU 1053318144,1053318655,GB 1053318656,1053318911,FI +1053318912,1053318927,EU 1053318928,1053318951,FI 1053318952,1053318959,EE -1053318976,1053318991,FI -1053319024,1053319031,FI -1053319040,1053319167,FI -1053319424,1053320191,DE +1053318960,1053318975,EU +1053318976,1053319007,FI +1053319008,1053319167,EU +1053319168,1053320191,DE +1053320192,1053320223,EU 1053320224,1053320319,DE +1053320320,1053326335,EU 1053326336,1053326399,BE -1053326400,1053326447,GB -1053326448,1053326559,BE +1053326400,1053326431,EU +1053326432,1053326447,GB +1053326448,1053326463,BE +1053326464,1053326527,EU +1053326528,1053326543,BE +1053326544,1053326559,EU +1053326560,1053326567,BE +1053326568,1053326575,EU 1053326576,1053326847,BE 1053326848,1053327103,FI 1053327104,1053327359,DK +1053327360,1053327871,EU 1053327872,1053328383,ZA -1053328640,1053328831,ZA +1053328384,1053328639,EU +1053328640,1053328799,ZA +1053328800,1053328895,EU 1053328896,1053329087,ZA -1053329120,1053329279,ZA +1053329088,1053329119,EU +1053329120,1053329135,ZA +1053329136,1053329143,EU +1053329144,1053329151,ZA +1053329152,1053329183,EU +1053329184,1053329279,ZA +1053329280,1053329407,EU 1053329408,1053329439,ES -1053329472,1053329487,ES -1053329512,1053329535,ES -1053329600,1053329639,ES +1053329440,1053329503,EU +1053329504,1053329527,ES +1053329528,1053329631,EU +1053329632,1053329663,ES +1053329664,1053330431,EU 1053330432,1053330687,ES +1053330688,1053331455,EU 1053331456,1053331487,NL -1053331584,1053331599,NL -1053331616,1053331703,NL -1053331712,1053331935,NL +1053331488,1053331583,EU +1053331584,1053331663,NL +1053331664,1053331679,EU +1053331680,1053331703,NL +1053331704,1053331711,EU +1053331712,1053331887,NL +1053331888,1053331903,EU +1053331904,1053331927,NL +1053331928,1053332223,EU 1053332224,1053332271,NL +1053332272,1053332319,EU 1053332320,1053332415,NL +1053332416,1053332447,EU +1053332448,1053332479,NL +1053332480,1053332991,EU 1053332992,1053334015,BE -1053334016,1053334223,DK +1053334016,1053334079,EU +1053334080,1053334191,DK +1053334192,1053334199,EU +1053334200,1053334223,DK +1053334224,1053334239,EU 1053334240,1053334527,DK 1053334528,1053334783,SE +1053334784,1053335551,EU 1053335552,1053336831,ZA -1053337088,1053337183,ZA -1053337216,1053337279,ZA -1053337608,1053337631,CH +1053336832,1053337087,EU +1053337088,1053337119,ZA +1053337120,1053337127,EU +1053337128,1053337183,ZA +1053337184,1053337599,EU +1053337600,1053337631,CH +1053337632,1053338111,EU 1053338112,1053338623,FI -1053338624,1053338927,NO +1053338624,1053338943,NO +1053338944,1053338975,EU 1053338976,1053338983,NO -1053339000,1053339007,NO -1053339136,1053339519,NO +1053338984,1053339135,EU +1053339136,1053339423,NO +1053339424,1053339455,EU +1053339456,1053339519,NO +1053339520,1053339591,EU 1053339592,1053339599,NO -1053339616,1053339647,NO +1053339600,1053339615,EU +1053339616,1053339623,NO +1053339624,1053339631,EU +1053339632,1053339647,NO 1053339648,1053340159,AT 1053340160,1053340415,ZA -1053340416,1053340463,NL -1053340480,1053340495,NL -1053340512,1053340519,NL +1053340416,1053340479,EU +1053340480,1053340511,NL +1053340512,1053340671,EU 1053340672,1053341183,GB -1053341440,1053341695,GB +1053341184,1053341439,EU +1053341440,1053341567,GB +1053341568,1053341575,EU +1053341576,1053341599,GB +1053341600,1053341615,EU +1053341616,1053341695,GB +1053341696,1053343743,EU 1053343744,1053344255,FI +1053344256,1053344511,EU 1053344512,1053344767,BG +1053344768,1053345279,EU 1053345280,1053345375,PK +1053345376,1053345407,EU 1053345408,1053345471,PK -1053348608,1053348655,PT +1053345472,1053348639,EU +1053348640,1053348655,PT +1053348656,1053349119,EU 1053349120,1053349631,NL -1053349888,1053350015,IE -1053350144,1053350383,IE +1053349632,1053349887,EU +1053349888,1053349951,IE +1053349952,1053350143,EU +1053350144,1053350335,IE +1053350336,1053350351,EU +1053350352,1053350359,IE +1053350360,1053350367,EU +1053350368,1053350383,IE +1053350384,1053350399,EU 1053350400,1053350479,BE -1053350488,1053350495,BE +1053350480,1053350655,EU 1053350656,1053350911,BE -1053351936,1053352039,IL -1053352960,1053353031,IE -1053353088,1053353151,IE -1053353184,1053353215,IE +1053350912,1053351935,EU +1053351936,1053352191,IL +1053352192,1053353023,EU +1053353024,1053353031,IE +1053353032,1053353103,EU +1053353104,1053353111,IE +1053353112,1053353135,EU +1053353136,1053353215,IE 1053353216,1053353223,GB -1053353224,1053353279,IE -1053353344,1053353375,IE -1053353984,1053354655,IL +1053353224,1053353255,IE +1053353256,1053353263,EU +1053353264,1053353279,IE +1053353280,1053353983,EU +1053353984,1053354239,IL +1053354240,1053354495,EU +1053354496,1053354655,IL +1053354656,1053354687,EU 1053354688,1053354719,IL +1053354720,1053354751,EU 1053354752,1053354831,IL -1053354856,1053354871,IL +1053354832,1053354855,EU +1053354856,1053354863,IL +1053354864,1053354911,EU 1053354912,1053355007,IL -1053360128,1053368319,ES +1053355008,1053360127,EU +1053360128,1053364223,ES +1053364224,1053368319,CZ 1053368320,1053376511,SE 1053376512,1053392895,HU 1053392896,1053401087,FR 1053401088,1053409279,DE -1053409280,1053425663,IR +1053409280,1053425663,IQ 1053425664,1053556735,CH 1053556736,1053564927,FI 1053564928,1053573119,GB @@ -7143,81 +8138,139 @@ 1053687808,1053702635,DE 1053702636,1053702639,GB 1053702640,1053753343,DE -1053753344,1053818879,IT +1053753344,1053818879,RU 1053818880,1053819391,DE +1053819392,1053819423,EU 1053819424,1053819439,DE +1053819440,1053819519,EU 1053819520,1053819563,DE +1053819564,1053819583,EU 1053819584,1053819647,DE +1053819648,1053820159,EU 1053820160,1053820927,DE +1053820928,1053821439,EU 1053821440,1053821447,GB +1053821448,1053821567,EU 1053821568,1053821695,GB -1053824000,1053824023,DE +1053821696,1053824015,EU +1053824016,1053824023,DE +1053824024,1053824127,EU 1053824128,1053824255,NL +1053824256,1053825023,EU +1053825024,1053826047,ES +1053826048,1053826815,EU 1053826816,1053827327,DE 1053827328,1053827583,BE +1053827584,1053829887,EU 1053829888,1053830143,DE +1053830144,1053831167,EU 1053831168,1053831423,DE +1053831424,1053834943,EU 1053834944,1053834975,DE +1053834976,1053835263,EU 1053835264,1053835775,DE +1053835776,1053837311,EU 1053837312,1053837439,FK +1053837440,1053837567,EU 1053837568,1053837823,GB 1053837824,1053838335,FK 1053838336,1053838591,DE +1053838592,1053840399,EU 1053840400,1053840415,DE +1053840416,1053840447,EU 1053840448,1053840511,DE -1053843200,1053843207,DK +1053840512,1053843199,EU +1053843200,1053843231,DK +1053843232,1053843711,EU 1053843712,1053843967,DE 1053843968,1053844223,GB 1053844224,1053844479,DE +1053844480,1053844991,EU 1053844992,1053845503,DE +1053845504,1053845727,EU 1053845728,1053845735,DE +1053845736,1053846015,EU 1053846016,1053846527,DE -1053846784,1053848575,DE -1053848576,1053849599,GB +1053846528,1053846783,EU +1053846784,1053847551,DE +1053847552,1053849599,GB 1053849600,1053850367,DE +1053850368,1053851135,EU 1053851136,1053851647,DE +1053851648,1053851903,EU 1053851904,1053851919,FR +1053851920,1053852031,EU 1053852032,1053852047,IT +1053852048,1053852095,EU 1053852096,1053852103,DE +1053852104,1053852111,EU 1053852112,1053852127,GB 1053852128,1053852159,DE +1053852160,1053855743,EU 1053855744,1053859839,GB 1053859840,1053860863,DE +1053860864,1053862655,EU 1053862656,1053862783,DE +1053862784,1053862847,EU 1053862848,1053862879,DE +1053862880,1053863423,EU 1053863424,1053864959,DE +1053864960,1053865215,EU 1053865216,1053865727,DE 1053865728,1053865759,US +1053865760,1053865983,EU 1053865984,1053866239,DE 1053866240,1053866495,ES 1053866496,1053866799,DE +1053866800,1053866807,EU 1053866808,1053866823,DE +1053866824,1053866831,EU 1053866832,1053866847,DE -1053867008,1053867775,DE +1053866848,1053867519,EU +1053867520,1053867775,DE +1053867776,1053867975,EU 1053867976,1053867983,DE +1053867984,1053867991,EU 1053867992,1053867999,DE +1053868000,1053868007,EU 1053868008,1053868015,DE +1053868016,1053868031,EU 1053868032,1053868447,ES 1053868448,1053868455,GB +1053868456,1053868799,EU 1053868800,1053869567,DE +1053869568,1053870079,EU 1053870080,1053870335,DE 1053870336,1053870591,GB +1053870592,1053870847,EU 1053870848,1053871359,DE +1053871360,1053871615,EU 1053871616,1053871871,DE +1053871872,1053872383,EU 1053872384,1053872447,DE +1053872448,1053872895,EU 1053872896,1053873663,DE +1053873664,1053876223,EU 1053876224,1053876991,DE +1053876992,1053877247,EU 1053877248,1053878271,DE 1053878272,1053878783,GB 1053878784,1053879047,DE +1053879048,1053879055,EU 1053879056,1053879071,DE 1053879072,1053879167,GB +1053879168,1053879295,EU 1053879296,1053882111,DE +1053882112,1053882367,EU 1053882368,1053882879,DE 1053882880,1053883391,GB 1053883392,1053884415,DE 1053884416,1053892607,BH -1053892608,1053894495,DE +1053892608,1053892619,DE +1053892620,1053892623,GB +1053892624,1053892943,DE +1053892944,1053892959,GB +1053892960,1053894495,DE 1053894496,1053894527,GB 1053894528,1053894719,DE 1053894720,1053894735,FR @@ -7248,12 +8301,8 @@ 1053984896,1053985023,US 1053985024,1054015487,FR 1054015488,1054089215,IT -1054089216,1054097407,RU -1054097408,1054100575,NL -1054100576,1054100607,BE -1054100608,1054101343,NL -1054101344,1054101375,BE -1054101376,1054105599,NL +1054089216,1054097407,GE +1054097408,1054105599,NL 1054105600,1054113791,FR 1054113792,1054121983,NL 1054121984,1054130175,AT @@ -7263,17 +8312,21 @@ 1054179328,1054187519,GB 1054187520,1054195711,BG 1054195712,1054212095,BE -1054212096,1054213383,DE -1054213384,1054213391,ES -1054213392,1054277631,DE +1054212096,1054212519,DE +1054212520,1054212527,NL +1054212528,1054277631,DE 1054277632,1054343167,KW 1054343168,1054351359,NL -1054351360,1054359551,GR -1054359552,1054367743,GB +1054351360,1054359551,UA +1054359552,1054367743,RO 1054367744,1054375935,FI 1054375936,1054381055,GB -1054381056,1054381823,EG -1054381824,1054384127,GB +1054381056,1054381567,EG +1054381568,1054381583,SG +1054381584,1054381599,HK +1054381600,1054381615,GB +1054381616,1054381631,US +1054381632,1054384127,GB 1054384128,1054400511,DE 1054400512,1054408703,GB 1054408704,1054416895,FR @@ -7285,124 +8338,207 @@ 1054474240,1054539775,AT 1054539776,1054605311,IL 1054605312,1054613503,DE -1054613504,1054629887,IT +1054613504,1054621695,RU +1054621696,1054629887,IT 1054629888,1054638079,IR 1054638080,1054646271,CH 1054646272,1054654463,SE 1054654464,1054662655,MK 1054662656,1054670847,FI 1054670848,1054671103,GB +1054671104,1054671167,EU 1054671168,1054671231,IE +1054671232,1054671371,EU 1054671372,1054671375,IE +1054671376,1054671415,EU 1054671416,1054671423,IE +1054671424,1054671431,EU 1054671432,1054671439,IE +1054671440,1054672159,EU 1054672160,1054672175,IE +1054672176,1054672255,EU 1054672256,1054672287,IE +1054672288,1054672319,EU 1054672320,1054672335,US 1054672336,1054672367,IE +1054672368,1054672383,EU 1054672384,1054672447,IE +1054672448,1054672719,EU 1054672720,1054672727,IE +1054672728,1054672743,EU 1054672744,1054672767,IE +1054672768,1054672775,EU 1054672776,1054672783,IE +1054672784,1054672791,EU 1054672792,1054672807,IE +1054672808,1054673663,EU 1054673664,1054673727,IE +1054673728,1054673855,EU 1054673856,1054673919,IE +1054673920,1054673951,EU 1054673952,1054674047,IE +1054674048,1054674079,EU 1054674080,1054674111,IE +1054674112,1054674455,EU 1054674456,1054674471,IE +1054674472,1054674479,EU 1054674480,1054674495,IE +1054674496,1054674503,EU 1054674504,1054674511,IE +1054674512,1054674519,EU 1054674520,1054674527,GB +1054674528,1054674687,EU 1054674688,1054675199,IE +1054675200,1054675455,EU 1054675456,1054675711,IE +1054675712,1054675967,EU 1054675968,1054676223,US +1054676224,1054679039,EU 1054679040,1054687231,UA 1054687232,1054703615,MD +1054703616,1054711807,BG 1054711808,1054719999,IT 1054720000,1054867455,NL 1054867456,1054943231,DE 1054943232,1054943487,PL -1054943488,1054949519,DE -1054949520,1054949527,NL -1054949528,1054949807,DE +1054943488,1054949807,DE 1054949808,1054949815,ES 1054949816,1054963255,DE 1054963256,1054963263,ES 1054963264,1054969031,DE 1054969032,1054969039,AT -1054969040,1055129599,DE +1054969040,1054978815,DE +1054978816,1054979071,FR +1054979072,1055129599,DE +1055129600,1055186943,CY +1055186944,1055194623,GR +1055194624,1055195135,CY +1055195136,1055196159,EU 1055196160,1055197823,CH +1055197824,1055197919,EU 1055197920,1055198463,CH +1055198464,1055198975,EU 1055198976,1055199103,CH +1055199104,1055199359,EU 1055199360,1055199375,CH +1055199376,1055199463,EU 1055199464,1055199487,CH +1055199488,1055200415,EU 1055200416,1055200423,PT -1055201024,1055203327,US +1055200424,1055201023,EU +1055201024,1055201279,US +1055201280,1055203327,EU 1055203328,1055203359,CZ +1055203360,1055203839,EU 1055203840,1055204095,CZ +1055204096,1055204863,EU 1055204864,1055205375,CZ +1055205376,1055205631,EU 1055205632,1055205887,CZ +1055205888,1055206655,EU 1055206656,1055207423,CZ +1055207424,1055207679,EU 1055207680,1055209471,CZ +1055209472,1055209727,EU 1055209728,1055210239,CZ +1055210240,1055210495,EU 1055210496,1055210751,SK +1055210752,1055211263,EU 1055211264,1055211519,CZ +1055211520,1055212043,EU 1055212044,1055212179,PT +1055212180,1055212183,EU 1055212184,1055212247,PT +1055212248,1055212351,EU 1055212352,1055212415,PT +1055212416,1055212543,EU 1055212544,1055212799,PT -1055213056,1055213319,PT +1055212800,1055213055,EU +1055213056,1055213307,PT +1055213308,1055213311,EU +1055213312,1055213319,PT +1055213320,1055213327,EU 1055213328,1055213359,PT +1055213360,1055213367,EU 1055213368,1055213455,PT +1055213456,1055213471,EU 1055213472,1055213567,PT +1055213568,1055213823,EU 1055213824,1055214239,PT +1055214240,1055214271,EU 1055214272,1055214847,PT +1055214848,1055215359,EU 1055215360,1055215999,PT +1055216000,1055216031,EU 1055216032,1055216383,PT +1055216384,1055216895,EU 1055216896,1055217663,PT +1055217664,1055218207,EU 1055218208,1055218239,PT +1055218240,1055218271,EU 1055218272,1055218299,PT +1055218300,1055218351,EU 1055218352,1055218383,PT +1055218384,1055218391,EU 1055218392,1055218399,PT +1055218400,1055218431,EU 1055218432,1055218447,PT +1055218448,1055218463,EU 1055218464,1055218471,PT +1055218472,1055218479,EU 1055218480,1055219711,PT -1055219968,1055219975,NL +1055219712,1055220223,EU 1055220224,1055220287,NL +1055220288,1055220351,EU 1055220352,1055220399,NL -1055220736,1055221247,NL +1055220400,1055221503,EU 1055221504,1055221631,BE -1055221760,1055222015,NL -1055222528,1055223807,NL -1055223808,1055223839,LU -1055223872,1055223999,LU +1055221632,1055223039,EU +1055223040,1055223807,NL +1055223808,1055223903,EU +1055223904,1055223999,LU +1055224000,1055224063,EU 1055224064,1055224463,LU +1055224464,1055224575,EU 1055224576,1055224607,LU +1055224608,1055224831,EU 1055224832,1055224911,LU +1055224912,1055226111,EU 1055226112,1055226175,ES +1055226176,1055226191,EU 1055226192,1055226207,ES +1055226208,1055226239,EU 1055226240,1055226255,ES +1055226256,1055226263,EU 1055226264,1055226271,ES +1055226272,1055226367,EU 1055226368,1055226399,ES +1055226400,1055227639,EU 1055227640,1055227647,PT +1055227648,1055227903,EU 1055227904,1055228159,TR -1055228416,1055229183,TR +1055228160,1055228927,EU +1055228928,1055229183,TR +1055229184,1055231999,EU 1055232000,1055232255,NL -1055232512,1055233535,NL -1055233792,1055234047,NL +1055232256,1055232511,EU +1055232512,1055233023,NL +1055233024,1055234063,EU 1055234064,1055234079,NL 1055234080,1055234127,US -1055234560,1055235071,NL +1055234128,1055241983,EU 1055241984,1055242239,GR +1055242240,1055252735,EU 1055252736,1055252991,ES +1055252992,1055253055,EU 1055253056,1055253087,ES +1055253088,1055256447,EU 1055256448,1055256463,ES +1055256464,1055260671,EU 1055260672,1055326207,SE 1055326208,1055334399,RU 1055334400,1055342591,IE -1055342592,1055347455,RO -1055347456,1055347711,HU -1055347712,1055358975,RO +1055342592,1055358975,RO 1055358976,1055367167,GB 1055367168,1055375359,RU 1055375360,1055391743,OM @@ -7427,20 +8563,27 @@ 1055588352,1055653887,BE 1055653888,1055681055,FI 1055681056,1055681071,SE -1055681072,1055784959,FI +1055681072,1055709919,FI +1055709920,1055709935,AX +1055709936,1055784959,FI 1055784960,1055850495,NL 1055850496,1055916031,GB -1055916032,1055924223,CS +1055916032,1055924223,RS +1055924224,1055932415,LY 1055932416,1055940607,FI +1055940608,1055948799,EG 1055948800,1055956991,DE 1055956992,1055965183,CZ 1055965184,1055973375,CH 1055973376,1055981567,FR 1055981568,1055989759,IT -1055989760,1055995135,DE +1055989760,1055992310,DE +1055992311,1055992318,CH +1055992319,1055995135,DE 1055995136,1055995391,NL 1055995392,1055997951,DE 1055997952,1056014335,FR +1056014336,1056022527,EG 1056022528,1056030719,GB 1056030720,1056047103,FI 1056047104,1056178175,DK @@ -7449,8 +8592,14 @@ 1056210944,1056219135,PL 1056219136,1056227327,GB 1056227328,1056243711,TR -1056243712,1056251903,MC -1056251904,1056260095,GB +1056243712,1056244255,CH +1056244256,1056244287,FR +1056244288,1056244335,MC +1056244336,1056244351,FR +1056244352,1056244447,CH +1056244448,1056244479,MC +1056244480,1056251903,CH +1056251904,1056260095,RU 1056260096,1056276479,CZ 1056276480,1056374783,DE 1056374784,1056440319,SE @@ -7469,6 +8618,7 @@ 1056546816,1056555007,NO 1056555008,1056571391,GB 1056571392,1056669695,NL +1056669696,1056702463,MA 1056702464,1056874559,GB 1056874560,1056874567,IE 1056874568,1056874599,GB @@ -7500,122 +8650,240 @@ 1056876048,1056964607,GB 1056964608,1061227007,US 1061227008,1061227263,HT -1061227264,1061227519,BO -1061227520,1061478143,US +1061227264,1061227774,BO +1061227775,1061478143,US 1061478144,1061478399,BO -1061478400,1061588735,US +1061478400,1061518015,US +1061518016,1061518047,A2 +1061518048,1061558271,US +1061558272,1061559295,PK +1061559296,1061588735,US 1061588736,1061588991,GU -1061588992,1061748991,US -1061748992,1061749247,PR -1061749248,1062069247,US +1061588992,1061633567,US +1061633568,1061633575,CA +1061633576,1061749152,US +1061749153,1061749182,PR +1061749183,1061749183,US +1061749184,1061749191,PR +1061749192,1061749199,US +1061749200,1061749231,PR +1061749232,1061762047,US +1061762048,1061762303,FR +1061762304,1061776479,US +1061776480,1061776639,CA +1061776640,1061833855,US +1061833856,1061833983,PR +1061833984,1061847711,US +1061847712,1061847743,FR +1061847744,1061853695,US +1061853696,1061854207,GB +1061854208,1061939711,US +1061939712,1061940223,JM +1061940224,1062000319,US +1062000320,1062000383,PR +1062000384,1062069247,US 1062069248,1062070271,PR -1062070272,1062497791,US +1062070272,1062219519,US +1062219520,1062219775,IN +1062219776,1062222975,US +1062222976,1062223039,PH +1062223040,1062244311,US +1062244312,1062244319,PH +1062244320,1062250495,US +1062250496,1062251519,UM +1062251520,1062262783,US +1062262784,1062263039,PH +1062263040,1062378767,US +1062378768,1062378783,CA +1062378784,1062429695,US +1062429696,1062430207,PR +1062430208,1062475935,US +1062475936,1062475951,GB +1062475952,1062486271,US +1062486272,1062486527,MX +1062486528,1062497791,US 1062497792,1062498303,FM -1062498304,1062545919,US -1062545920,1062546431,CA -1062546432,1062871551,US -1062871552,1062872063,PR -1062872064,1063305727,US -1063305728,1063305983,CA -1063305984,1063334911,US -1063334912,1063335423,CO -1063335424,1063568895,US -1063568896,1063569151,TZ -1063569152,1063573679,US -1063573680,1063573695,VN -1063573696,1063727615,US +1062498304,1062530047,US +1062530048,1062531071,EC +1062531072,1062545919,US +1062545920,1062546431,BM +1062546432,1062597375,US +1062597376,1062597631,PR +1062597632,1062636287,US +1062636288,1062636351,GB +1062636352,1062725103,US +1062725104,1062725111,IL +1062725112,1062871551,US +1062871552,1062872319,PR +1062872320,1063335422,US +1063335423,1063335423,CO +1063335424,1063390207,US +1063390208,1063390463,PR +1063390464,1063497863,US +1063497864,1063497871,CA +1063497872,1063504191,US +1063504192,1063504255,MX +1063504256,1063560687,US +1063560688,1063560703,CA +1063560704,1063561231,US +1063561232,1063561247,CA +1063561248,1063567359,US +1063567360,1063575551,A2 +1063575552,1063579999,US +1063580000,1063580015,CA +1063580016,1063587631,US +1063587632,1063587647,CA +1063587648,1063598847,US +1063598848,1063598863,CA +1063598864,1063690239,US +1063690240,1063690495,PR +1063690496,1063727615,US 1063727616,1063728127,GU -1063728128,1063747839,US +1063728128,1063747583,US +1063747584,1063747839,A2 1063747840,1063748095,UG -1063748096,1063748607,US +1063748096,1063748607,A2 1063748608,1063749119,GH -1063749120,1063749631,US +1063749120,1063749375,A2 +1063749376,1063749631,US 1063749632,1063749887,LR 1063749888,1063750143,SA 1063750144,1063750399,NG -1063750400,1063750463,US +1063750400,1063750463,SA 1063750464,1063750527,NG -1063750528,1063750655,US +1063750528,1063750543,US +1063750544,1063750559,A2 +1063750560,1063750655,US 1063750656,1063751679,NG -1063751680,1063895039,US +1063751680,1063752959,US +1063752960,1063753215,A2 +1063753216,1063895039,US 1063895040,1063899135,KR -1063899136,1064124927,US +1063899136,1064064127,US +1064064128,1064064191,CA +1064064192,1064124927,US 1064124928,1064125695,EC -1064125696,1064126719,US +1064125696,1064125951,US +1064125952,1064126207,PE +1064126208,1064126719,US 1064126720,1064126975,EC 1064126976,1064127487,US 1064127488,1064127999,EC -1064128000,1064170799,US -1064170800,1064170807,LB -1064170808,1064170991,US -1064170992,1064170999,LB -1064171000,1064171007,US -1064171008,1064171135,LB -1064171136,1064171263,US -1064171264,1064171551,LB +1064128000,1064170751,US +1064170752,1064170799,A2 +1064170800,1064170807,NG +1064170808,1064170823,IN +1064170824,1064170831,A2 +1064170832,1064170871,IN +1064170872,1064170879,A2 +1064170880,1064170911,DE +1064170912,1064170919,A2 +1064170920,1064170927,NG +1064170928,1064170943,DE +1064170944,1064170991,A2 +1064170992,1064170999,NG +1064171000,1064171007,A2 +1064171008,1064171135,NG +1064171136,1064171263,IN +1064171264,1064171551,NG 1064171552,1064171559,TZ -1064171560,1064171575,US +1064171560,1064171575,A2 1064171576,1064171583,PK -1064171584,1064171607,US +1064171584,1064171607,A2 1064171608,1064171615,PK 1064171616,1064171631,GH -1064171632,1064171855,US +1064171632,1064171647,A2 +1064171648,1064171775,NG +1064171776,1064171799,A2 +1064171800,1064171815,IN +1064171816,1064171823,A2 +1064171824,1064171839,IN +1064171840,1064171855,A2 1064171856,1064171871,TZ -1064171872,1064171903,US -1064171904,1064171911,LB -1064171912,1064171919,US +1064171872,1064171903,A2 +1064171904,1064171911,NG +1064171912,1064171919,A2 1064171920,1064171927,PK -1064171928,1064171935,US -1064171936,1064171967,LB -1064171968,1064204287,US +1064171928,1064171935,A2 +1064171936,1064171967,NG +1064171968,1064172031,A2 +1064172032,1064204287,US 1064204288,1064205311,MX -1064205312,1064650751,US +1064205312,1064221951,US +1064221952,1064222207,MX +1064222208,1064231023,US +1064231024,1064231039,CA +1064231040,1064306087,US +1064306088,1064306095,AU +1064306096,1064402687,US +1064402688,1064402751,CA +1064402752,1064445183,US +1064445184,1064445439,PK +1064445440,1064650751,US 1064650752,1064651775,EC -1064651776,1065519359,US +1064651776,1064973055,US +1064973056,1064973183,AU +1064973184,1065049471,US +1065049472,1065049535,CA +1065049536,1065519359,US 1065519360,1065519487,CA -1065519488,1065594879,US -1065598976,1065611263,US -1065615360,1065734143,US -1065738240,1065811967,US +1065519488,1065520895,US +1065520896,1065520911,CA +1065520912,1065583423,US +1065583424,1065583439,HK +1065583440,1065611263,US +1065611264,1065615359,PR +1065615360,1065806947,US +1065806948,1065806957,TH +1065806958,1065811967,US 1065811968,1065820159,CA 1065820160,1065873407,US 1065873408,1065877503,PR 1065877504,1065906175,US 1065906176,1065908223,KY -1065908224,1066139647,US -1066401792,1066584063,US +1065908224,1065926815,US +1065926816,1065926831,CA +1065926832,1066139647,US +1066203904,1066204031,US +1066401792,1066404607,US +1066404608,1066404863,A2 +1066404864,1066475263,US +1066475264,1066475519,CA +1066475520,1066584063,US 1066584064,1066586111,PE -1066586112,1066627335,US +1066586112,1066604927,US +1066604928,1066604959,CA +1066604960,1066627335,US 1066627336,1066627343,CA 1066627344,1066718559,US 1066718560,1066718591,PR -1066718592,1066828063,US -1066828064,1066828127,HK +1066718592,1066736447,US +1066736448,1066736479,NO +1066736480,1066828095,US +1066828096,1066828127,HK 1066828128,1066828151,US 1066828152,1066828159,CN 1066828160,1066828255,US 1066828256,1066828287,HK 1066828288,1066829311,US 1066829312,1066829567,HK -1066829568,1066830207,US -1066830208,1066830271,SG -1066830272,1066830287,US -1066830288,1066830303,SG -1066830304,1066830311,US -1066830312,1066830591,SG -1066830592,1066830719,US -1066830720,1066830751,SG -1066830752,1066830783,US -1066830784,1066830807,SG +1066829568,1066830079,US +1066830080,1066830111,SI +1066830112,1066830207,US +1066830208,1066830239,SG +1066830240,1066830271,US +1066830272,1066830591,SG +1066830592,1066830799,US +1066830800,1066830807,SG 1066830808,1066830815,US 1066830816,1066830847,SG -1066830848,1066830983,US -1066830984,1066830999,JP -1066831000,1066831039,US -1066831040,1066831087,JP -1066831088,1066831199,US -1066831200,1066831231,JP -1066831232,1066898783,US +1066830848,1066831039,US +1066831040,1066831071,JP +1066831072,1066832527,US +1066832528,1066832543,CA +1066832544,1066834607,US +1066834608,1066834623,IS +1066834624,1066898783,US 1066898784,1066898815,CO 1066898816,1067473471,US 1067473472,1067473535,CA @@ -7631,25 +8899,41 @@ 1067532288,1067532799,HN 1067532800,1067537959,US 1067537960,1067537967,GB -1067537968,1067562495,US +1067537968,1067552511,US +1067552512,1067552767,PR +1067552768,1067562495,US 1067562496,1067562751,SL 1067562752,1067573247,US 1067573248,1067573255,SG 1067573256,1067575295,US 1067575296,1067577343,HN -1067577344,1067617791,US +1067577344,1067590111,US +1067590112,1067590143,CA +1067590144,1067593983,US +1067593984,1067594239,PR +1067594240,1067617791,US 1067617792,1067618047,CN -1067618048,1067625967,US +1067618048,1067618111,US +1067618112,1067618143,PR +1067618144,1067621375,US +1067621376,1067621631,PR +1067621632,1067625967,US 1067625968,1067625983,CH 1067625984,1067653255,US 1067653256,1067653263,PR 1067653264,1067693055,US 1067693056,1067693567,CO -1067693568,1067726847,US +1067693568,1067700735,US +1067700736,1067701247,AN +1067701248,1067726847,US 1067726848,1067727359,EC -1067727360,1067740159,US +1067727360,1067736831,US +1067736832,1067737087,PR +1067737088,1067740159,US 1067740160,1067741183,HN -1067741184,1067762815,US +1067741184,1067751871,US +1067751872,1067751887,PR +1067751888,1067762815,US 1067762816,1067762831,CA 1067762832,1067780607,US 1067780608,1067780863,GB @@ -7659,87 +8943,207 @@ 1067822864,1067822871,CA 1067822872,1067824895,US 1067824896,1067825151,PR -1067825152,1067826239,US -1067826240,1067826247,CA -1067826248,1067908295,US +1067825152,1067838463,US +1067838464,1067838591,IT +1067838592,1067856575,US +1067856576,1067856607,CO +1067856608,1067863807,US +1067863808,1067863935,CA +1067863936,1067894071,US +1067894072,1067894079,PR +1067894080,1067908295,US 1067908296,1067908303,CH 1067908304,1067909023,US 1067909024,1067909039,SG -1067909040,1067918879,US +1067909040,1067914655,US +1067914656,1067914751,CA +1067914752,1067918879,US 1067918880,1067918887,NL 1067918888,1067923231,US 1067923232,1067923239,CA -1067923240,1067977895,US +1067923240,1067934911,US +1067934912,1067934927,CN +1067934928,1067934935,PR +1067934936,1067977895,US 1067977896,1067977903,CA -1067977904,1067989247,US +1067977904,1067978751,US +1067978752,1067979007,PR +1067979008,1067989247,US 1067989248,1067989503,EC 1067989504,1067998463,US 1067998464,1067998719,CO -1067998720,1068119407,US +1067998720,1068004351,US +1068004352,1068004607,CA +1068004608,1068017663,US +1068017664,1068018175,YE +1068018176,1068070887,US +1068070888,1068070895,CA +1068070896,1068083455,US +1068083456,1068083711,PR +1068083712,1068096415,US +1068096416,1068096447,CA +1068096448,1068119407,US 1068119408,1068119423,DE -1068119424,1068167439,US -1068167440,1068167447,GB -1068167448,1068198879,US +1068119424,1068171951,US +1068171952,1068171967,PR +1068171968,1068175871,US +1068175872,1068176383,YE +1068176384,1068179487,US +1068179488,1068179503,PR +1068179504,1068198879,US 1068198880,1068198911,IN 1068198912,1068199935,US 1068199936,1068204031,CA 1068204032,1068230655,US 1068230656,1068230911,CO -1068230912,1068284735,US +1068230912,1068239935,US +1068239936,1068239999,PR +1068240000,1068284735,US 1068284736,1068284743,CA -1068284744,1068326911,US +1068284744,1068284751,US +1068284752,1068284759,DK +1068284760,1068326911,US 1068326912,1068327167,EC -1068327168,1068362863,US +1068327168,1068346367,US +1068346368,1068346879,YE +1068346880,1068362863,US 1068362864,1068362879,GB 1068362880,1068419071,US 1068419072,1068421119,CO 1068421120,1068425983,US 1068425984,1068426239,EC -1068426240,1068480159,US +1068426240,1068462079,US +1068462080,1068462335,PR +1068462336,1068478591,US +1068478592,1068478607,PR +1068478608,1068480159,US 1068480160,1068480191,IN -1068480192,1068491263,US +1068480192,1068480431,US +1068480432,1068480447,SE +1068480448,1068481023,US +1068481024,1068481535,PR +1068481536,1068491263,US 1068491264,1068491519,HN -1068491520,1071985631,US +1068491520,1070499559,US +1070499560,1070499567,PR +1070499568,1070729471,US +1070729472,1070729727,CA +1070729728,1070805559,US +1070805560,1070805567,VG +1070805568,1071100159,US +1071100160,1071100415,PR +1071100416,1071100927,US +1071100928,1071101951,PR +1071101952,1071170815,US +1071170816,1071171071,PH +1071171072,1071206527,US +1071206528,1071206559,HK +1071206560,1071206911,US +1071206912,1071207167,HK +1071207168,1071295871,US +1071295872,1071295887,GR +1071295888,1071309407,US +1071309408,1071309439,HK +1071309440,1071309471,US +1071309472,1071309503,HK +1071309504,1071309695,US +1071309696,1071309727,HK +1071309728,1071318783,US +1071318784,1071319039,IN +1071319040,1071362079,US +1071362080,1071362111,HK +1071362112,1071362207,US +1071362208,1071362239,HK +1071362240,1071472639,US +1071472640,1071480831,CA +1071480832,1071985631,US 1071985632,1071985663,ML -1071985664,1072680623,US +1071985664,1072440639,US +1072440640,1072440671,CA +1072440672,1072445631,US +1072445632,1072445663,AU +1072445664,1072512951,US +1072512952,1072512959,CA +1072512960,1072619023,US +1072619024,1072619039,CA +1072619040,1072680623,US 1072680624,1072680631,CA -1072680632,1072922623,US +1072680632,1072697639,US +1072697640,1072697647,IL +1072697648,1072707327,US +1072707328,1072707583,IN +1072707584,1072710327,US +1072710328,1072710335,DE +1072710336,1072711479,US +1072711480,1072711487,DE +1072711488,1072711519,US +1072711520,1072711535,DE +1072711536,1072712191,US +1072712192,1072712223,DE +1072712224,1072712479,US +1072712480,1072712495,IL +1072712496,1072714519,US +1072714520,1072714527,DE +1072714528,1072715943,US +1072715944,1072715951,IL +1072715952,1072716671,US +1072716672,1072716703,IL +1072716704,1072718031,US +1072718032,1072718039,DE +1072718040,1072725311,US +1072725312,1072725343,DE +1072725344,1072727039,US +1072727040,1072727047,JM +1072727048,1072727215,US +1072727216,1072727223,JM +1072727224,1072727551,US +1072727552,1072727567,DE +1072727568,1072777631,US +1072777632,1072777647,TW +1072777648,1072785415,US +1072785416,1072785423,DK +1072785424,1072785439,US +1072785440,1072785471,DK +1072785472,1072790015,US +1072790016,1072790031,JP +1072790032,1072922623,US 1072922624,1072922879,PH -1072922880,1072923135,PK +1072922880,1072923135,US 1072923136,1072923391,CA 1072923392,1072923903,US -1072923904,1072924927,CA -1072924928,1072925183,US -1072925184,1072926207,CA +1072923904,1072924159,CA +1072924160,1072924671,HT +1072924672,1072925183,US +1072925184,1072925695,GB +1072925696,1072926207,CA 1072926208,1072926471,US 1072926472,1072926527,CA 1072926528,1072926591,US -1072926592,1072926655,LC -1072926656,1072926719,CA +1072926592,1072926719,CA 1072926720,1072926975,PH 1072926976,1072927487,CA -1072927488,1072927999,US -1072928000,1072928031,AF -1072928032,1072928047,CA +1072927488,1072927743,US +1072927744,1072928047,CA 1072928048,1072928063,IE 1072928064,1072928095,US 1072928096,1072928127,CA 1072928128,1072928255,US 1072928256,1072928263,CA -1072928264,1072928287,AF -1072928288,1072928295,CA -1072928296,1072928303,US -1072928304,1072928319,CA +1072928264,1072928287,US +1072928288,1072928319,CA 1072928320,1072928447,US -1072928448,1072930047,CA -1072930048,1072930303,HK +1072928448,1072929535,CA +1072929536,1072929791,US +1072929792,1072930047,CA +1072930048,1072930303,US 1072930304,1072931071,CA 1072931072,1072931327,US -1072931328,1072932607,CA +1072931328,1072931583,CA +1072931584,1072931839,SY +1072931840,1072932607,CA 1072932608,1072932863,NG 1072932864,1072934399,CA -1072934400,1072934655,PH -1072934656,1072934783,US +1072934400,1072934783,US 1072934784,1072934847,AU 1072934848,1072934879,CA 1072934880,1072934911,TW @@ -7752,17 +9156,17 @@ 1072935680,1072935807,PH 1072935808,1072935871,CA 1072935872,1072935935,US -1072935936,1072936447,CA -1072936448,1072936959,PH -1072936960,1072937215,US +1072935936,1072936191,CA +1072936192,1072936447,US +1072936448,1072936703,PH +1072936704,1072937215,US 1072937216,1072937471,IR -1072937472,1072937727,CA -1072937728,1072937983,US -1072937984,1072938239,CA +1072937472,1072937727,US +1072937728,1072938239,CA 1072938240,1072938495,VG 1072938496,1072938751,CA -1072938752,1072939007,US -1072939008,1072955391,CA +1072938752,1072940031,US +1072940032,1072955391,CA 1072955392,1073022975,US 1073022976,1073025791,HN 1073025792,1073026047,NI @@ -7770,7 +9174,8 @@ 1073026304,1073026431,DO 1073026432,1073027071,US 1073027072,1073028351,NI -1073028352,1073029119,US +1073028352,1073028607,US +1073028608,1073029119,GD 1073029120,1073031167,PR 1073031168,1073031231,US 1073031232,1073031263,AN @@ -7778,26 +9183,158 @@ 1073031424,1073031935,AN 1073031936,1073033215,US 1073033216,1073035263,AN -1073035264,1073036543,US +1073035264,1073036032,GD +1073036033,1073036543,US 1073036544,1073037055,MX 1073037056,1073037311,AN 1073037312,1073037823,CO -1073037824,1073039359,US +1073037824,1073038335,GD +1073038336,1073039359,US 1073039360,1073041407,GT 1073041408,1073043455,CO -1073043456,1073045503,HN +1073043456,1073045503,US 1073045504,1073047551,CO 1073047552,1073049599,PR 1073049600,1073053695,BS -1073053696,1073094655,US -1073098752,1073217535,US -1073283072,1073373183,US +1073053696,1073090269,US +1073090270,1073090300,PE +1073090301,1073091397,US +1073091398,1073091407,CH +1073091408,1073092335,US +1073092336,1073092351,CA +1073092352,1073093646,US +1073093647,1073093654,PE +1073093655,1073094557,US +1073094558,1073094570,IT +1073094571,1073373183,US 1073373184,1073381375,CA -1073381376,1073381887,NL -1073381888,1074020351,US +1073381376,1073381399,US +1073381400,1073381463,NL +1073381464,1073381471,US +1073381472,1073381887,NL +1073381888,1073382687,US +1073382688,1073382695,CA +1073382696,1073382815,US +1073382816,1073382847,CR +1073382848,1073382855,US +1073382856,1073382863,BR +1073382864,1073382879,US +1073382880,1073382911,AR +1073382912,1073382959,US +1073382960,1073382975,CA +1073382976,1073383519,US +1073383520,1073383551,SV +1073383552,1073383727,US +1073383728,1073383735,CA +1073383736,1073383839,US +1073383840,1073383871,VE +1073383872,1073384191,US +1073384192,1073384223,BR +1073384224,1073384255,US +1073384256,1073384287,CA +1073384288,1073384295,BR +1073384296,1073384511,US +1073384512,1073384575,CA +1073384576,1073384607,US +1073384608,1073384639,BR +1073384640,1073384711,US +1073384712,1073384719,CL +1073384720,1073384775,US +1073384776,1073384783,CA +1073384784,1073384879,US +1073384880,1073384887,CA +1073384888,1073385087,US +1073385088,1073385095,CA +1073385096,1073385151,US +1073385152,1073385183,BR +1073385184,1073385279,US +1073385280,1073385311,BR +1073385312,1073389575,US +1073389576,1073389583,CA +1073389584,1073389599,US +1073389600,1073389631,GB +1073389632,1073389783,US +1073389784,1073389791,CL +1073389792,1073390207,US +1073390208,1073390215,CA +1073390216,1073390271,US +1073390272,1073390303,CA +1073390304,1073393887,US +1073393888,1073393895,CO +1073393896,1073393911,US +1073393912,1073393919,CO +1073393920,1073394191,US +1073394192,1073394207,MX +1073394208,1073394239,CA +1073394240,1073394247,MX +1073394248,1073394255,US +1073394256,1073394271,MX +1073394272,1073394279,US +1073394280,1073394287,MX +1073394288,1073394295,US +1073394296,1073394303,MX +1073394304,1073394311,AR +1073394312,1073394439,US +1073394440,1073394463,MX +1073394464,1073394495,US +1073394496,1073394503,MX +1073394504,1073394543,US +1073394544,1073394559,MX +1073394560,1073394591,US +1073394592,1073394623,AF +1073394624,1073394719,US +1073394720,1073394751,BR +1073394752,1073394767,AR +1073394768,1073394799,US +1073394800,1073394807,CA +1073394808,1073394967,US +1073394968,1073394975,AR +1073394976,1073395167,US +1073395168,1073395175,AR +1073395176,1073395183,US +1073395184,1073395191,AR +1073395192,1073395239,US +1073395240,1073395247,BR +1073395248,1073395391,US +1073395392,1073395399,AF +1073395400,1073395407,CA +1073395408,1073395423,PR +1073395424,1073395967,US +1073395968,1073395999,BR +1073396000,1073396191,US +1073396192,1073396207,CA +1073396208,1073396215,BR +1073396216,1073396751,US +1073396752,1073396831,BR +1073396832,1073396863,US +1073396864,1073396895,CA +1073396896,1073396911,US +1073396912,1073396919,CA +1073396920,1073396927,BR +1073396928,1073396935,VE +1073396936,1073396959,US +1073396960,1073396991,CA +1073396992,1073397063,US +1073397064,1073397071,BR +1073397072,1073425559,US +1073425560,1073425567,CA +1073425568,1073426559,US +1073426560,1073426623,AU +1073426624,1073434799,US +1073434800,1073434807,GB +1073434808,1073435583,US +1073435584,1073435647,CA +1073435648,1073438207,US +1073438208,1073438463,A2 +1073438464,1073442863,US +1073442864,1073442879,GB +1073442880,1073448927,US +1073448928,1073448959,IL +1073448960,1073450399,US +1073450400,1073450431,GB +1073450432,1074020351,US 1074020352,1074028543,CA -1074028544,1074085887,US -1074102272,1074118655,US +1074028544,1074118655,US 1074118656,1074120703,CA 1074120704,1074120719,US 1074120720,1074120959,CA @@ -7810,12 +9347,28 @@ 1074126848,1074127359,US 1074127360,1074128511,CA 1074128512,1074128575,US -1074128576,1074135039,CA +1074128576,1074130943,CA +1074130944,1074131199,US +1074131200,1074135039,CA 1074135040,1074184191,US 1074184192,1074188287,CA 1074188288,1074229247,US -1074233344,1074241535,CA -1074241536,1074672671,US +1074229248,1074241535,CA +1074241536,1074249791,US +1074249792,1074249807,BB +1074249808,1074397439,US +1074397440,1074399039,CA +1074399040,1074399231,US +1074399232,1074408319,CA +1074408320,1074408447,US +1074408448,1074462463,CA +1074462464,1074463743,US +1074463744,1074493695,CA +1074493696,1074493823,US +1074493824,1074494719,CA +1074494720,1074495743,US +1074495744,1074513407,CA +1074513408,1074672671,US 1074672672,1074672703,IN 1074672704,1074672943,US 1074672944,1074672959,DK @@ -7823,7 +9376,11 @@ 1074673664,1074673679,CY 1074673680,1074675311,US 1074675312,1074675327,NO -1074675328,1074680623,US +1074675328,1074675679,US +1074675680,1074675687,GB +1074675688,1074677759,US +1074677760,1074678271,BG +1074678272,1074680623,US 1074680624,1074680639,CA 1074680640,1074680703,US 1074680704,1074680719,IL @@ -7843,9 +9400,37 @@ 1074690944,1074691007,AR 1074691008,1074691135,US 1074691136,1074691199,AR -1074691200,1074696063,US -1074696064,1074696095,AU -1074696096,1074708991,US +1074691200,1074701583,US +1074701584,1074701591,CA +1074701592,1074701599,US +1074701600,1074701631,CA +1074701632,1074702783,US +1074702784,1074702847,CA +1074702848,1074703615,US +1074703616,1074703871,GB +1074703872,1074704383,US +1074704384,1074704639,GB +1074704640,1074704703,US +1074704704,1074704711,CH +1074704712,1074704767,US +1074704768,1074704831,CH +1074704832,1074705727,US +1074705728,1074705743,GB +1074705744,1074705791,US +1074705792,1074705799,IL +1074705800,1074705887,US +1074705888,1074705903,IL +1074705904,1074706175,US +1074706176,1074706303,IL +1074706304,1074706367,US +1074706368,1074706431,GB +1074706432,1074706679,US +1074706680,1074706687,GB +1074706688,1074707775,US +1074707776,1074707839,GB +1074707840,1074707967,US +1074707968,1074708223,GB +1074708224,1074708991,US 1074708992,1074709247,PH 1074709248,1074711039,US 1074711040,1074711055,IN @@ -7855,39 +9440,130 @@ 1074716720,1074716735,GB 1074716736,1074733055,US 1074733056,1074737151,AU -1074737152,1074741599,CA -1074741600,1074741631,US -1074741632,1074742111,CA -1074742112,1074742143,US -1074742144,1074743647,CA -1074743648,1074743679,US -1074743680,1074745343,CA +1074737152,1074745343,CA 1074745344,1074757631,US 1074757632,1074765823,CA 1074765824,1074777343,US 1074777344,1074777599,AU 1074777600,1074783167,US 1074783168,1074783199,CA -1074783200,1074860031,US -1074864128,1074937855,US +1074783200,1074783231,BM +1074783232,1074785823,US +1074785824,1074785855,AU +1074785856,1074871583,US +1074871584,1074871607,CA +1074871608,1074937855,US 1074937856,1074946047,CA -1074946048,1074960895,US -1074960896,1074961407,GB -1074961408,1074962431,US +1074946048,1074962431,US 1074962432,1074970623,CA -1074970624,1075036159,US -1075048448,1075066367,US -1075066368,1075068927,GB -1075068928,1075073023,US -1075073024,1075077119,CA -1075077120,1075421183,US +1074970624,1075117287,US +1075117288,1075117311,IN +1075117312,1075421183,US 1075421184,1075429375,CA -1075429376,1075441663,US -1075445760,1075478527,US -1075478528,1075494911,CA -1075494912,1075576831,US -1075576832,1075580927,GB -1075580928,1075585023,NO +1075429376,1075478527,US +1075478528,1075479103,CA +1075479104,1075479111,GB +1075479112,1075479135,CA +1075479136,1075479151,US +1075479152,1075479567,CA +1075479568,1075479583,US +1075479584,1075479607,CA +1075479608,1075479615,US +1075479616,1075480463,CA +1075480464,1075480479,US +1075480480,1075480975,CA +1075480976,1075480991,US +1075480992,1075484047,CA +1075484048,1075484063,US +1075484064,1075484263,CA +1075484264,1075484271,US +1075484272,1075484287,CA +1075484288,1075484415,US +1075484416,1075494911,CA +1075494912,1075513151,US +1075513152,1075513183,KW +1075513184,1075532663,US +1075532664,1075532673,IT +1075532674,1075558143,US +1075558144,1075558911,VI +1075558912,1075576831,US +1075576832,1075576871,NO +1075576872,1075576879,GB +1075576880,1075576967,NO +1075576968,1075576975,GB +1075576976,1075576991,NO +1075576992,1075577023,GB +1075577024,1075577067,NO +1075577068,1075577071,GB +1075577072,1075577087,NO +1075577088,1075577103,GB +1075577104,1075577271,NO +1075577272,1075577279,GB +1075577280,1075577311,NO +1075577312,1075577599,GB +1075577600,1075577775,NO +1075577776,1075577791,GB +1075577792,1075577855,NO +1075577856,1075578111,GB +1075578112,1075578623,NO +1075578624,1075578879,GB +1075578880,1075578927,NO +1075578928,1075578943,GB +1075578944,1075579007,NO +1075579008,1075579039,GB +1075579040,1075579047,NO +1075579048,1075579059,GB +1075579060,1075579747,NO +1075579748,1075579751,GB +1075579752,1075579935,NO +1075579936,1075579943,GB +1075579944,1075579967,NO +1075579968,1075579975,GB +1075579976,1075579983,NO +1075579984,1075579999,GB +1075580000,1075580055,NO +1075580056,1075580063,GB +1075580064,1075581271,NO +1075581272,1075581279,NL +1075581280,1075581295,NO +1075581296,1075581311,NL +1075581312,1075581447,NO +1075581448,1075581455,NL +1075581456,1075581471,NO +1075581472,1075581479,NL +1075581480,1075581495,NO +1075581496,1075581499,NL +1075581500,1075581695,NO +1075581696,1075581823,NL +1075581824,1075582503,NO +1075582504,1075582511,NL +1075582512,1075582615,NO +1075582616,1075582623,NL +1075582624,1075583119,NO +1075583120,1075583123,NL +1075583124,1075583127,NO +1075583128,1075583135,NL +1075583136,1075583147,NO +1075583148,1075583151,NL +1075583152,1075583503,NO +1075583504,1075583519,NL +1075583520,1075583551,NO +1075583552,1075583567,NL +1075583568,1075583583,NO +1075583584,1075583591,NL +1075583592,1075583743,NO +1075583744,1075583759,NL +1075583760,1075583783,NO +1075583784,1075583791,NL +1075583792,1075583903,NO +1075583904,1075583911,NL +1075583912,1075584071,NO +1075584072,1075584095,NL +1075584096,1075584355,NO +1075584356,1075584367,NL +1075584368,1075584695,NO +1075584696,1075584711,NL +1075584712,1075585023,NO 1075585024,1075593967,US 1075593968,1075593983,CA 1075593984,1075594975,US @@ -7915,77 +9591,745 @@ 1075599008,1075599039,CA 1075599040,1075599471,US 1075599472,1075599487,IL -1075599488,1075601279,US +1075599488,1075599967,US +1075599968,1075599983,IE +1075599984,1075601279,US 1075601280,1075601295,CA 1075601296,1075609599,US 1075609600,1075613695,TT 1075613696,1075744767,US +1075744768,1075748863,A2 1075748864,1075855359,US 1075855360,1075871743,DO 1075871744,1075970047,US 1075970048,1075972095,CA 1075972096,1075972351,GB -1075972352,1075976191,US -1075976192,1075976447,CA -1075976448,1075976703,US -1075976704,1075976959,CA -1075976960,1075977983,US -1075977984,1075978239,CA -1075978240,1075983359,US -1075983360,1075984383,CA -1075984384,1075985919,US +1075972352,1075973887,US +1075973888,1075974143,CA +1075974144,1075976191,US +1075976192,1075976511,CA +1075976512,1075976543,US +1075976544,1075976647,CA +1075976648,1075976655,US +1075976656,1075976687,CA +1075976688,1075976695,US +1075976696,1075976703,CA +1075976704,1075976959,US +1075976960,1075977023,CA +1075977024,1075977039,US +1075977040,1075977071,CA +1075977072,1075977087,US +1075977088,1075977199,CA +1075977200,1075977215,US +1075977216,1075978239,CA +1075978240,1075978687,US +1075978688,1075978719,CA +1075978720,1075979551,US +1075979552,1075979583,CA +1075979584,1075980575,US +1075980576,1075980591,GB +1075980592,1075982335,US +1075982336,1075982591,CA +1075982592,1075982599,US +1075982600,1075982607,NZ +1075982608,1075982655,CA +1075982656,1075982671,US +1075982672,1075982687,CA +1075982688,1075982703,US +1075982704,1075982751,CA +1075982752,1075982783,MX +1075982784,1075982815,US +1075982816,1075982831,CA +1075982832,1075982847,US +1075982848,1075983183,CA +1075983184,1075983191,US +1075983192,1075983199,CA +1075983200,1075983231,US +1075983232,1075984383,CA +1075984384,1075984823,US +1075984824,1075984831,CA +1075984832,1075985415,US +1075985416,1075985423,CR +1075985424,1075985919,US 1075985920,1075986431,CA -1075986432,1075987711,US -1075987712,1075987967,CA -1075987968,1075990271,US -1075990272,1075990527,CA -1075990528,1075995647,US -1075995648,1075996159,CA -1075996160,1075996991,US -1075996992,1075997071,CA -1075997072,1075997183,US -1075997184,1075997439,CA -1075997440,1075998399,US -1075998400,1075998431,CA -1075998432,1075999999,US +1075986432,1075986687,US +1075986688,1075986943,CA +1075986944,1075987199,US +1075987200,1075987455,CA +1075987456,1075987711,US +1075987712,1075987951,CA +1075987952,1075988223,US +1075988224,1075988287,CA +1075988288,1075988319,US +1075988320,1075988479,CA +1075988480,1075988735,US +1075988736,1075988991,CA +1075988992,1075989247,US +1075989248,1075989311,FI +1075989312,1075989359,CA +1075989360,1075989375,US +1075989376,1075989455,CA +1075989456,1075989471,US +1075989472,1075989791,CA +1075989792,1075989823,US +1075989824,1075990527,CA +1075990528,1075991551,US +1075991552,1075991583,CA +1075991584,1075991671,US +1075991672,1075991679,CA +1075991680,1075992319,US +1075992320,1075992447,GB +1075992448,1075993087,US +1075993088,1075993103,CA +1075993104,1075995007,US +1075995008,1075995023,VG +1075995024,1075995047,US +1075995048,1075995055,CA +1075995056,1075995103,US +1075995104,1075995263,CA +1075995264,1075995295,US +1075995296,1075995326,CA +1075995327,1075995343,US +1075995344,1075995479,CA +1075995480,1075995487,US +1075995488,1075995503,CA +1075995504,1075995519,MX +1075995520,1075995567,CA +1075995568,1075995583,CN +1075995584,1075995647,CA +1075995648,1075995903,US +1075995904,1075996671,CA +1075996672,1075996751,US +1075996752,1075996767,CA +1075996768,1075996799,BV +1075996800,1075997119,CA +1075997120,1075997183,MX +1075997184,1075997519,CA +1075997520,1075997535,US +1075997536,1075997695,CA +1075997696,1075997823,CR +1075997824,1075997919,US +1075997920,1075997935,CA +1075997936,1075997951,US +1075997952,1075998351,CA +1075998352,1075998431,US +1075998432,1075999231,CA +1075999232,1075999999,US 1076000000,1076000255,CA 1076000256,1076000767,US 1076000768,1076002047,CA -1076002048,1076003071,US +1076002048,1076002823,US +1076002824,1076002831,CA +1076002832,1076002879,US +1076002880,1076002975,CA +1076002976,1076003023,US +1076003024,1076003031,CA +1076003032,1076003039,US +1076003040,1076003055,CA +1076003056,1076003071,US 1076003072,1076003327,CA -1076003328,1076003519,US -1076003520,1076003535,CA -1076003536,1076003583,US -1076003584,1076004351,CA -1076004352,1076004863,US -1076004864,1076005119,CA -1076005120,1076005375,US -1076005376,1076005631,CA -1076005632,1076006399,US -1076006400,1076006655,CA -1076006656,1076006911,US +1076003328,1076003359,US +1076003360,1076003375,CA +1076003376,1076003519,US +1076003520,1076004383,CA +1076004384,1076004423,US +1076004424,1076004431,CA +1076004432,1076004471,US +1076004472,1076004479,CA +1076004480,1076004495,US +1076004496,1076004511,CA +1076004512,1076004559,US +1076004560,1076004591,CA +1076004592,1076004607,US +1076004608,1076004639,CA +1076004640,1076004703,US +1076004704,1076005119,CA +1076005120,1076005151,NZ +1076005152,1076005159,CA +1076005160,1076005167,US +1076005168,1076005191,CA +1076005192,1076005207,US +1076005208,1076005223,CA +1076005224,1076005239,US +1076005240,1076005247,CA +1076005248,1076005263,US +1076005264,1076005279,CA +1076005280,1076005311,US +1076005312,1076005319,CA +1076005320,1076005375,US +1076005376,1076005727,CA +1076005728,1076005759,US +1076005760,1076005887,CA +1076005888,1076006015,US +1076006016,1076006047,CA +1076006048,1076006079,US +1076006080,1076006111,CA +1076006112,1076006271,US +1076006272,1076006303,CA +1076006304,1076006367,US +1076006368,1076006719,CA +1076006720,1076006751,US +1076006752,1076006783,CA +1076006784,1076006911,US 1076006912,1076007167,CA -1076007168,1076007423,US -1076007424,1076008191,CA -1076008192,1076008447,US -1076008448,1076009215,CA -1076009216,1076009727,US -1076009728,1076010495,CA -1076010496,1076026367,US -1076026368,1076026879,CA -1076026880,1076028159,US -1076028160,1076028415,CA -1076028416,1076029439,US -1076029440,1076029951,CA -1076029952,1076030207,CN -1076030208,1076030975,US -1076030976,1076031487,CA +1076007168,1076007183,US +1076007184,1076007247,CA +1076007248,1076007263,US +1076007264,1076007679,CA +1076007680,1076007935,US +1076007936,1076007967,CA +1076007968,1076008191,US +1076008192,1076008383,CA +1076008384,1076008447,US +1076008448,1076009631,CA +1076009632,1076009639,US +1076009640,1076009643,CA +1076009644,1076009663,US +1076009664,1076009695,CA +1076009696,1076009711,US +1076009712,1076009887,CA +1076009888,1076009919,US +1076009920,1076010687,CA +1076010688,1076010695,US +1076010696,1076011007,CA +1076011008,1076026023,US +1076026024,1076026031,CA +1076026032,1076026367,US +1076026368,1076026495,CA +1076026496,1076026559,US +1076026560,1076026607,CA +1076026608,1076026623,SG +1076026624,1076026975,CA +1076026976,1076027031,US +1076027032,1076027263,CA +1076027264,1076027295,US +1076027296,1076027391,CA +1076027392,1076027399,US +1076027400,1076027407,CA +1076027408,1076027455,US +1076027456,1076027711,CA +1076027712,1076027727,US +1076027728,1076027775,CA +1076027776,1076027791,US +1076027792,1076027911,CA +1076027912,1076027919,US +1076027920,1076028143,CA +1076028144,1076028151,US +1076028152,1076028479,CA +1076028480,1076028543,GB +1076028544,1076028671,CA +1076028672,1076028927,US +1076028928,1076029183,BZ +1076029184,1076029215,CA +1076029216,1076029223,US +1076029224,1076029231,DM +1076029232,1076029239,CA +1076029240,1076029247,US +1076029248,1076029415,CA +1076029416,1076029422,US +1076029423,1076029430,CA +1076029431,1076029439,US +1076029440,1076030223,CA +1076030224,1076030231,US +1076030232,1076030319,CA +1076030320,1076030335,US +1076030336,1076030399,CA +1076030400,1076030463,US +1076030464,1076030623,CA +1076030624,1076030631,US +1076030632,1076031487,CA 1076031488,1076031743,US 1076031744,1076031999,CA -1076032000,1076252671,US -1076256768,1076281695,US +1076032000,1076032255,US +1076032256,1076032511,CA +1076032512,1076033647,US +1076033648,1076033663,EG +1076033664,1076033671,US +1076033672,1076033687,CA +1076033688,1076033855,US +1076033856,1076033871,CA +1076033872,1076033903,US +1076033904,1076033951,CA +1076033952,1076034047,US +1076034048,1076034063,CN +1076034064,1076034367,US +1076034368,1076034383,CA +1076034384,1076034423,US +1076034424,1076034431,AU +1076034432,1076034479,US +1076034480,1076034495,CA +1076034496,1076035295,US +1076035296,1076035327,EG +1076035328,1076035415,US +1076035416,1076035423,EG +1076035424,1076036247,US +1076036248,1076036255,IL +1076036256,1076036351,US +1076036352,1076036605,ES +1076036606,1076036735,US +1076036736,1076036751,CA +1076036752,1076036791,US +1076036792,1076036799,ZA +1076036800,1076037439,US +1076037440,1076037447,MX +1076037448,1076043775,US +1076043776,1076043839,CA +1076043840,1076043871,MX +1076043872,1076044095,US +1076044096,1076044127,IN +1076044128,1076044175,US +1076044176,1076044183,IE +1076044184,1076044191,FR +1076044192,1076044551,US +1076044552,1076044567,DE +1076044568,1076044703,US +1076044704,1076044735,AR +1076044736,1076047527,US +1076047528,1076047535,JP +1076047536,1076047551,US +1076047552,1076047583,CH +1076047584,1076047967,US +1076047968,1076047975,VE +1076047976,1076048639,US +1076048640,1076048671,MX +1076048672,1076048703,AR +1076048704,1076048735,US +1076048736,1076048767,CA +1076048768,1076048831,US +1076048832,1076048863,IL +1076048864,1076049151,US +1076049152,1076049407,DE +1076049408,1076049439,CA +1076049440,1076049471,US +1076049472,1076049503,PR +1076049504,1076049919,US +1076049920,1076050175,IL +1076050176,1076166655,US +1076183040,1076183071,IN +1076183072,1076183103,US +1076183104,1076183135,CA +1076183136,1076183263,US +1076183264,1076183295,CA +1076183296,1076183807,US +1076183808,1076184063,CA +1076184064,1076184127,US +1076184128,1076184159,VE +1076184160,1076184191,US +1076184192,1076184223,IN +1076184224,1076184255,US +1076184256,1076184287,BE +1076184288,1076184319,CA +1076184320,1076184575,US +1076184576,1076184703,SG +1076184704,1076184895,US +1076184896,1076184927,FR +1076184928,1076184959,US +1076184960,1076184991,VE +1076184992,1076185023,US +1076185024,1076185055,GB +1076185056,1076185215,US +1076185216,1076185343,CA +1076185344,1076185439,US +1076185440,1076185471,IT +1076185472,1076185503,US +1076185504,1076185535,DO +1076185536,1076185599,US +1076185600,1076185855,MY +1076185856,1076185983,US +1076185984,1076186015,PK +1076186016,1076186047,US +1076186048,1076186079,IN +1076186080,1076186303,US +1076186304,1076186335,CA +1076186336,1076186367,IT +1076186368,1076186623,CA +1076186624,1076186751,US +1076186752,1076186783,CA +1076186784,1076187391,US +1076187392,1076187647,CA +1076187648,1076187679,BE +1076187680,1076187775,US +1076187776,1076187807,AU +1076187808,1076187903,US +1076187904,1076188159,CA +1076188160,1076188287,US +1076188288,1076188415,BE +1076188416,1076188671,MY +1076188672,1076189183,US +1076189184,1076189215,VE +1076189216,1076189279,CA +1076189280,1076189311,US +1076189312,1076189343,CA +1076189344,1076189407,US +1076189408,1076189439,IN +1076189440,1076189695,US +1076189696,1076189951,CA +1076189952,1076190079,US +1076190080,1076190143,IN +1076190144,1076190175,BE +1076190176,1076190207,IN +1076190208,1076190463,CA +1076190464,1076190815,US +1076190816,1076190847,IN +1076190848,1076192255,US +1076192256,1076192383,BE +1076192384,1076192767,US +1076192768,1076192831,IN +1076192832,1076193023,US +1076193024,1076193055,GB +1076193056,1076193087,AU +1076193088,1076193151,US +1076193152,1076193183,TR +1076193184,1076193247,US +1076193248,1076193279,CA +1076193280,1076194367,US +1076194368,1076194399,IN +1076194400,1076194431,IL +1076194432,1076194495,US +1076194496,1076194527,BE +1076194528,1076194559,US +1076194560,1076194815,CA +1076194816,1076195071,US +1076195072,1076195327,IN +1076195328,1076195551,US +1076195552,1076195583,IN +1076195584,1076195871,US +1076195872,1076195903,BE +1076195904,1076195935,CA +1076195936,1076196095,US +1076196096,1076196383,CA +1076196384,1076196479,US +1076196480,1076196511,FR +1076196512,1076196543,AT +1076196544,1076196641,US +1076196642,1076196671,BE +1076196672,1076196703,US +1076196704,1076196735,FR +1076196736,1076197119,US +1076197120,1076197375,CA +1076197376,1076197631,US +1076197632,1076197663,BE +1076197664,1076198655,US +1076198656,1076198911,AE +1076198912,1076218015,US +1076218016,1076218023,GB +1076218024,1076219407,US +1076219408,1076219415,GB +1076219416,1076281631,US +1076281632,1076281663,AT +1076281664,1076281695,US 1076281696,1076281727,TH -1076281728,1076306511,US +1076281728,1076282111,US +1076282112,1076282143,AU +1076282144,1076282351,US +1076282352,1076282367,CA +1076282368,1076283903,US +1076283904,1076284159,NO +1076284160,1076284679,US +1076284680,1076284687,HU +1076284688,1076285439,US +1076285440,1076285455,DK +1076285456,1076291903,US +1076291904,1076291919,UA +1076291920,1076292559,US +1076292560,1076292567,NL +1076292568,1076294655,US +1076294656,1076294687,CY +1076294688,1076294703,US +1076294704,1076294719,NO +1076294720,1076295071,US +1076295072,1076295087,NL +1076295088,1076295167,US +1076295168,1076295199,CY +1076295200,1076298503,US +1076298504,1076298511,GB +1076298512,1076298591,US +1076298592,1076298607,BD +1076298608,1076298631,US +1076298632,1076298655,BD +1076298656,1076298695,US +1076298696,1076298703,MH +1076298704,1076298919,US +1076298920,1076298927,GB +1076298928,1076298975,US +1076298976,1076298983,IL +1076298984,1076298991,MX +1076298992,1076298999,US +1076299000,1076299007,MX +1076299008,1076299023,IN +1076299024,1076299095,US +1076299096,1076299103,AU +1076299104,1076299127,US +1076299128,1076299135,FR +1076299136,1076299159,US +1076299160,1076299167,CA +1076299168,1076299175,US +1076299176,1076299183,DE +1076299184,1076299271,US +1076299272,1076299279,AU +1076299280,1076299287,US +1076299288,1076299295,GB +1076299296,1076299303,US +1076299304,1076299311,IN +1076299312,1076299399,US +1076299400,1076299407,DK +1076299408,1076299415,PE +1076299416,1076299431,US +1076299432,1076299439,GB +1076299440,1076299471,US +1076299472,1076299479,ID +1076299480,1076299487,GB +1076299488,1076299503,IN +1076299504,1076299519,BH +1076299520,1076299551,US +1076299552,1076299583,IN +1076299584,1076299647,US +1076299648,1076299663,BD +1076299664,1076299679,US +1076299680,1076299687,VI +1076299688,1076299703,US +1076299704,1076299711,GB +1076299712,1076299727,US +1076299728,1076299735,AU +1076299736,1076299767,US +1076299768,1076299775,MX +1076299776,1076299823,US +1076299824,1076299831,GB +1076299832,1076299847,US +1076299848,1076299855,VI +1076299856,1076299863,GB +1076299864,1076299871,CA +1076299872,1076299943,US +1076299944,1076299951,IT +1076299952,1076299959,US +1076299960,1076299975,FR +1076299976,1076299983,AU +1076299984,1076300015,US +1076300016,1076300031,GB +1076300032,1076300047,US +1076300048,1076300055,BD +1076300056,1076300071,GB +1076300072,1076300079,CK +1076300080,1076300095,IL +1076300096,1076300111,BD +1076300112,1076300119,IN +1076300120,1076300207,US +1076300208,1076300223,RU +1076300224,1076300231,MX +1076300232,1076300255,US +1076300256,1076300271,SE +1076300272,1076300279,ID +1076300280,1076300287,AU +1076300288,1076300295,US +1076300296,1076300303,IN +1076300304,1076300311,US +1076300312,1076300319,GB +1076300320,1076300335,US +1076300336,1076300343,IN +1076300344,1076300383,US +1076300384,1076300391,GB +1076300392,1076300399,IN +1076300400,1076300447,US +1076300448,1076300455,MY +1076300456,1076300463,US +1076300464,1076300471,IN +1076300472,1076300479,US +1076300480,1076300487,IN +1076300488,1076300511,US +1076300512,1076300519,IN +1076300520,1076300527,GB +1076300528,1076300663,US +1076300664,1076300671,AU +1076300672,1076300799,US +1076300800,1076300807,IN +1076300808,1076300847,US +1076300848,1076300855,AU +1076300856,1076300903,US +1076300904,1076300911,IN +1076300912,1076300919,US +1076300920,1076300927,IN +1076300928,1076300991,US +1076300992,1076301007,NZ +1076301008,1076301015,US +1076301016,1076301023,GR +1076301024,1076301047,US +1076301048,1076301055,AU +1076301056,1076301087,US +1076301088,1076301095,CA +1076301096,1076301143,US +1076301144,1076301151,NL +1076301152,1076301159,US +1076301160,1076301167,GB +1076301168,1076301183,US +1076301184,1076301191,AU +1076301192,1076301199,US +1076301200,1076301207,AU +1076301208,1076301263,US +1076301264,1076301271,CA +1076301272,1076301279,IN +1076301280,1076301823,US +1076301824,1076301831,IN +1076301832,1076301871,US +1076301872,1076301879,SE +1076301880,1076301895,US +1076301896,1076301903,IL +1076301904,1076301927,US +1076301928,1076301935,AU +1076301936,1076301951,US +1076301952,1076302015,AT +1076302016,1076302359,US +1076302360,1076302367,GB +1076302368,1076302407,US +1076302408,1076302415,IN +1076302416,1076302439,US +1076302440,1076302447,CA +1076302448,1076302495,US +1076302496,1076302503,BD +1076302504,1076302511,GB +1076302512,1076302519,US +1076302520,1076302527,DE +1076302528,1076302639,US +1076302640,1076302655,FR +1076302656,1076302719,US +1076302720,1076302735,NZ +1076302736,1076302751,US +1076302752,1076302759,DK +1076302760,1076302783,US +1076302784,1076302799,IN +1076302800,1076302807,US +1076302808,1076302815,AU +1076302816,1076302839,US +1076302840,1076302847,GB +1076302848,1076302855,NZ +1076302856,1076302879,US +1076302880,1076302887,IN +1076302888,1076302911,US +1076302912,1076302919,IN +1076302920,1076302959,US +1076302960,1076302975,GB +1076302976,1076302983,US +1076302984,1076302991,AR +1076302992,1076303031,US +1076303032,1076303039,CA +1076303040,1076303079,US +1076303080,1076303087,RU +1076303088,1076303167,US +1076303168,1076303183,CA +1076303184,1076303215,US +1076303216,1076303223,IN +1076303224,1076303231,MX +1076303232,1076303271,US +1076303272,1076303287,AU +1076303288,1076303319,US +1076303320,1076303327,EG +1076303328,1076303335,AU +1076303336,1076303359,US +1076303360,1076303391,BH +1076303392,1076303439,US +1076303440,1076303455,KW +1076303456,1076303495,US +1076303496,1076303511,AU +1076303512,1076303519,CA +1076303520,1076303527,US +1076303528,1076303535,AU +1076303536,1076303551,US +1076303552,1076303559,AU +1076303560,1076303567,DE +1076303568,1076303599,US +1076303600,1076303615,AU +1076303616,1076303631,US +1076303632,1076303639,CH +1076303640,1076303647,US +1076303648,1076303655,AU +1076303656,1076303663,US +1076303664,1076303679,GI +1076303680,1076303695,US +1076303696,1076303703,GB +1076303704,1076303711,US +1076303712,1076303719,CA +1076303720,1076303727,US +1076303728,1076303735,SA +1076303736,1076303767,US +1076303768,1076303775,PY +1076303776,1076303791,AU +1076303792,1076303831,US +1076303832,1076303839,SE +1076303840,1076303983,US +1076303984,1076303991,AU +1076303992,1076303999,DE +1076304000,1076304031,US +1076304032,1076304039,CA +1076304040,1076304047,MX +1076304048,1076304079,US +1076304080,1076304087,CA +1076304088,1076304127,US +1076304128,1076304135,CA +1076304136,1076304151,US +1076304152,1076304159,CA +1076304160,1076304191,BH +1076304192,1076304215,US +1076304216,1076304223,GI +1076304224,1076304255,US +1076304256,1076304383,IT +1076304384,1076304391,CA +1076304392,1076304407,US +1076304408,1076304415,CA +1076304416,1076304439,US +1076304440,1076304447,CA +1076304448,1076304487,US +1076304488,1076304495,EG +1076304496,1076304567,US +1076304568,1076304575,IN +1076304576,1076304583,BM +1076304584,1076304591,CA +1076304592,1076304607,US +1076304608,1076304615,GB +1076304616,1076304623,US +1076304624,1076304631,GB +1076304632,1076304639,US +1076304640,1076304647,GB +1076304648,1076304655,JP +1076304656,1076304663,SE +1076304664,1076304687,US +1076304688,1076304695,IN +1076304696,1076304751,US +1076304752,1076304759,RU +1076304760,1076304823,US +1076304824,1076304831,SE +1076304832,1076304839,VE +1076304840,1076304895,US +1076304896,1076304911,AU +1076304912,1076304919,US +1076304920,1076304927,ES +1076304928,1076304943,US +1076304944,1076304951,MX +1076304952,1076304959,NZ +1076304960,1076304991,US +1076304992,1076304999,ID +1076305000,1076305007,US +1076305008,1076305015,AU +1076305016,1076305023,US +1076305024,1076305039,CA +1076305040,1076305055,RU +1076305056,1076305079,US +1076305080,1076305087,AT +1076305088,1076305111,GB +1076305112,1076305167,US +1076305168,1076305175,FR +1076305176,1076305191,US +1076305192,1076305207,CA +1076305208,1076305215,AR +1076305216,1076305231,DE +1076305232,1076305239,US +1076305240,1076305247,GB +1076305248,1076305255,VE +1076305256,1076305263,US +1076305264,1076305271,CA +1076305272,1076305303,US +1076305304,1076305311,RU +1076305312,1076306463,US +1076306464,1076306479,GB +1076306480,1076306511,US 1076306512,1076306527,AE 1076306528,1076307495,US 1076307496,1076307503,DE @@ -8021,8 +10365,14 @@ 1076310528,1076338687,US 1076338688,1076346879,CA 1076346880,1076387839,US -1076387840,1076396031,CA -1076396032,1076408319,US +1076387840,1076393727,CA +1076393728,1076394239,US +1076394240,1076396031,CA +1076396032,1076404223,US +1076404224,1076406015,A2 +1076406016,1076406271,US +1076406272,1076408063,A2 +1076408064,1076408319,US 1076408320,1076412415,CA 1076412416,1076424703,US 1076424704,1076428799,CA @@ -8030,45 +10380,612 @@ 1076493312,1076493375,IN 1076493376,1076543487,US 1076543488,1076559871,CA -1076559872,1076756479,US -1076756480,1076772863,CA -1076772864,1076781055,US -1076789248,1076850687,US +1076559872,1076628991,US +1076628992,1076629247,VI +1076629248,1076696655,US +1076696656,1076696663,CA +1076696664,1076697503,US +1076697504,1076697519,NZ +1076697520,1076697567,US +1076697568,1076697583,PE +1076697584,1076698565,US +1076698566,1076698580,AU +1076698581,1076704376,US +1076704377,1076704405,CO +1076704406,1076704743,US +1076704744,1076704751,GB +1076704752,1076705191,US +1076705192,1076705199,AE +1076705200,1076705215,US +1076705216,1076705247,CA +1076705248,1076705719,US +1076705720,1076705729,AU +1076705730,1076707087,US +1076707088,1076707103,AT +1076707104,1076707119,GB +1076707120,1076707311,US +1076707312,1076707319,AR +1076707320,1076756479,US +1076756480,1076764671,CA +1076764672,1076765183,A1 +1076765184,1076765439,CA +1076765440,1076765695,A1 +1076765696,1076766783,CA +1076766784,1076766847,A1 +1076766848,1076767231,CA +1076767232,1076767743,A1 +1076767744,1076768511,CA +1076768512,1076768767,A1 +1076768768,1076772863,CA +1076772864,1076850687,US 1076850688,1076850943,CA -1076850944,1077055487,US -1077067776,1077444607,US +1076850944,1076985855,US +1076985856,1077002239,A2 +1077002240,1077002255,US +1077002256,1077002271,GB +1077002272,1077002343,US +1077002344,1077002351,VE +1077002352,1077002359,US +1077002360,1077002367,AG +1077002368,1077002399,US +1077002400,1077002407,CA +1077002408,1077002495,US +1077002496,1077002503,CA +1077002504,1077002543,US +1077002544,1077002551,CY +1077002552,1077002559,CA +1077002560,1077002575,US +1077002576,1077002583,CA +1077002584,1077002591,AU +1077002592,1077002599,US +1077002600,1077002607,BH +1077002608,1077002823,US +1077002824,1077002831,IN +1077002832,1077002847,FR +1077002848,1077002855,NZ +1077002856,1077002863,AU +1077002864,1077002911,US +1077002912,1077002927,MX +1077002928,1077002935,IN +1077002936,1077002943,CA +1077002944,1077002991,US +1077002992,1077002999,BH +1077003000,1077003023,US +1077003024,1077003039,RU +1077003040,1077003047,AU +1077003048,1077003079,US +1077003080,1077003087,IN +1077003088,1077003119,US +1077003120,1077003127,GB +1077003128,1077003199,US +1077003200,1077003231,IN +1077003232,1077003431,US +1077003432,1077003439,IE +1077003440,1077003511,US +1077003512,1077003519,CA +1077003520,1077003687,US +1077003688,1077003695,PH +1077003696,1077003711,US +1077003712,1077003727,AU +1077003728,1077003735,DE +1077003736,1077003783,US +1077003784,1077003791,CA +1077003792,1077003807,US +1077003808,1077003815,AU +1077003816,1077003895,US +1077003896,1077003903,IN +1077003904,1077003919,US +1077003920,1077003927,JP +1077003928,1077003959,US +1077003960,1077003967,BH +1077003968,1077003991,US +1077003992,1077003999,AT +1077004000,1077004119,US +1077004120,1077004127,GB +1077004128,1077004143,US +1077004144,1077004159,FR +1077004160,1077004199,US +1077004200,1077004207,NZ +1077004208,1077004239,US +1077004240,1077004247,GB +1077004248,1077004255,US +1077004256,1077004263,AU +1077004264,1077004303,US +1077004304,1077004319,FR +1077004320,1077004327,AU +1077004328,1077004335,GB +1077004336,1077004343,TR +1077004344,1077004351,AT +1077004352,1077004367,US +1077004368,1077004375,ZA +1077004376,1077004431,US +1077004432,1077004439,CA +1077004440,1077004511,US +1077004512,1077004527,FR +1077004528,1077004543,US +1077004544,1077004559,CA +1077004560,1077004583,US +1077004584,1077004591,CA +1077004592,1077004687,US +1077004688,1077004695,GB +1077004696,1077004703,AE +1077004704,1077004735,FR +1077004736,1077004743,US +1077004744,1077004751,CA +1077004752,1077004759,BE +1077004760,1077004767,NZ +1077004768,1077004783,US +1077004784,1077004791,CA +1077004792,1077004799,GB +1077004800,1077004815,CA +1077004816,1077004847,US +1077004848,1077004863,CA +1077004864,1077004871,US +1077004872,1077004879,GB +1077004880,1077005119,US +1077005120,1077005151,AU +1077005152,1077005295,US +1077005296,1077005303,CN +1077005304,1077005487,US +1077005488,1077005503,CA +1077005504,1077005535,US +1077005536,1077005543,AU +1077005544,1077005551,US +1077005552,1077005559,CA +1077005560,1077005631,US +1077005632,1077005695,AU +1077005696,1077005823,US +1077005824,1077005839,AU +1077005840,1077005895,US +1077005896,1077005903,RU +1077005904,1077005911,VE +1077005912,1077005943,US +1077005944,1077005951,TR +1077005952,1077006023,US +1077006024,1077006031,IN +1077006032,1077006039,US +1077006040,1077006047,NZ +1077006048,1077006071,US +1077006072,1077006079,IN +1077006080,1077006159,US +1077006160,1077006167,AE +1077006168,1077006407,US +1077006408,1077006415,CA +1077006416,1077006463,US +1077006464,1077006471,AU +1077006472,1077006623,US +1077006624,1077006631,GB +1077006632,1077006639,ES +1077006640,1077006647,IE +1077006648,1077006719,US +1077006720,1077006735,AU +1077006736,1077006743,US +1077006744,1077006751,IL +1077006752,1077006847,US +1077006848,1077006863,CA +1077006864,1077006879,CR +1077006880,1077006887,US +1077006888,1077006895,IN +1077006896,1077006911,US +1077006912,1077006927,GB +1077006928,1077006935,CA +1077006936,1077006943,AR +1077006944,1077006959,US +1077006960,1077006967,MX +1077006968,1077006991,US +1077006992,1077006999,CA +1077007000,1077007007,HK +1077007008,1077007063,CA +1077007064,1077007071,US +1077007072,1077007087,CA +1077007088,1077007103,US +1077007104,1077007111,NL +1077007112,1077007119,CA +1077007120,1077007167,US +1077007168,1077007191,CA +1077007192,1077007199,KR +1077007200,1077007215,GB +1077007216,1077007247,US +1077007248,1077007255,BZ +1077007256,1077007287,US +1077007288,1077007295,CA +1077007296,1077007303,AU +1077007304,1077007311,IN +1077007312,1077007935,US +1077007936,1077007943,AU +1077007944,1077007967,US +1077007968,1077007983,NL +1077007984,1077008047,US +1077008048,1077008063,FR +1077008064,1077008127,US +1077008128,1077008223,CA +1077008224,1077008239,US +1077008240,1077008271,CA +1077008272,1077008295,US +1077008296,1077008335,CA +1077008336,1077008343,US +1077008344,1077008383,CA +1077008384,1077008735,US +1077008736,1077008751,BM +1077008752,1077008879,US +1077008880,1077008895,GB +1077008896,1077010431,US +1077010432,1077010439,HK +1077010440,1077010567,US +1077010568,1077010575,CA +1077010576,1077011247,US +1077011248,1077011255,CA +1077011256,1077011263,US +1077011264,1077011271,AR +1077011272,1077011287,US +1077011288,1077011295,AU +1077011296,1077011311,US +1077011312,1077011319,IN +1077011320,1077011327,TR +1077011328,1077011599,US +1077011600,1077011607,EG +1077011608,1077011615,NZ +1077011616,1077011767,US +1077011768,1077011775,MX +1077011776,1077011807,US +1077011808,1077011823,GR +1077011824,1077011831,AT +1077011832,1077012031,US +1077012032,1077012039,CO +1077012040,1077012063,US +1077012064,1077012079,AU +1077012080,1077012111,US +1077012112,1077012127,GB +1077012128,1077012143,US +1077012144,1077012159,EG +1077012160,1077012167,GB +1077012168,1077012295,US +1077012296,1077012303,HK +1077012304,1077012311,IN +1077012312,1077012383,US +1077012384,1077012415,PA +1077012416,1077012455,US +1077012456,1077012463,IN +1077012464,1077012495,US +1077012496,1077012511,IT +1077012512,1077012559,US +1077012560,1077012567,CA +1077012568,1077012575,US +1077012576,1077012583,ES +1077012584,1077013247,US +1077013248,1077013255,HK +1077013256,1077013263,US +1077013264,1077013279,MX +1077013280,1077013343,US +1077013344,1077013351,AU +1077013352,1077013359,US +1077013360,1077013375,NL +1077013376,1077013391,US +1077013392,1077013399,HK +1077013400,1077013407,US +1077013408,1077013415,NZ +1077013416,1077013431,US +1077013432,1077013439,NZ +1077013440,1077013511,US +1077013512,1077013519,NZ +1077013520,1077013551,US +1077013552,1077013559,IN +1077013560,1077013567,RU +1077013568,1077013647,US +1077013648,1077013663,DK +1077013664,1077013671,US +1077013672,1077013679,CA +1077013680,1077013695,US +1077013696,1077013703,CA +1077013704,1077013735,US +1077013736,1077013743,CR +1077013744,1077013759,IN +1077013760,1077014111,US +1077014112,1077014127,MX +1077014128,1077014151,US +1077014152,1077014159,AU +1077014160,1077014167,US +1077014168,1077014175,IN +1077014176,1077014303,US +1077014304,1077014311,BY +1077014312,1077014407,US +1077014408,1077014415,GB +1077014416,1077014527,US +1077014528,1077014535,CA +1077014536,1077014567,US +1077014568,1077014575,FR +1077014576,1077014607,US +1077014608,1077014623,BY +1077014624,1077014631,US +1077014632,1077014639,IN +1077014640,1077014647,US +1077014648,1077014703,HK +1077014704,1077014711,ZA +1077014712,1077014743,US +1077014744,1077014767,AE +1077014768,1077015551,US +1077015552,1077015559,GB +1077015560,1077015623,US +1077015624,1077015631,IN +1077015632,1077015647,US +1077015648,1077015679,PK +1077015680,1077015687,US +1077015688,1077015695,GB +1077015696,1077015759,US +1077015760,1077015775,RU +1077015776,1077015831,US +1077015832,1077015847,ZA +1077015848,1077015871,US +1077015872,1077015879,CA +1077015880,1077015919,US +1077015920,1077015935,GB +1077015936,1077017327,US +1077017328,1077017335,IN +1077017336,1077017343,US +1077017344,1077017351,ZA +1077017352,1077017359,GB +1077017360,1077017439,US +1077017440,1077017455,FR +1077017456,1077017631,US +1077017632,1077017647,VG +1077017648,1077018023,US +1077018024,1077018031,GB +1077018032,1077018079,US +1077018080,1077018111,BD +1077018112,1077055487,US +1077055488,1077059583,CA +1077059584,1077383167,US +1077383168,1077384191,A1 +1077384192,1077444607,US 1077444608,1077452799,CA 1077452800,1077460991,JP 1077460992,1077469183,US 1077469184,1077477375,CA -1077477376,1077489663,US -1077493760,1077506047,US -1077510144,1077530623,US -1077534720,1077561327,US +1077477376,1077506047,US +1077506048,1077510143,LS +1077510144,1077561327,US 1077561328,1077561343,AR 1077561344,1077565503,US 1077565504,1077565567,AR -1077565568,1077641215,US +1077565568,1077567487,US +1077567488,1077571583,A2 +1077571584,1077571839,US +1077571840,1077571967,CA +1077571968,1077626239,US +1077626240,1077626271,WS +1077626272,1077627167,US +1077627168,1077627199,EC +1077627200,1077628959,US +1077628960,1077628991,ES +1077628992,1077629071,US +1077629072,1077629087,CR +1077629088,1077629119,US +1077629120,1077629151,NL +1077629152,1077629183,CA +1077629184,1077629535,US +1077629536,1077629567,CA +1077629568,1077629903,US +1077629904,1077629919,AN +1077629920,1077630015,US +1077630016,1077630047,CA +1077630048,1077632159,US +1077632160,1077632191,GB +1077632192,1077632447,US +1077632448,1077632479,NL +1077632480,1077633823,US +1077633824,1077633855,AN +1077633856,1077640799,US +1077640800,1077640831,EC +1077640832,1077641215,US 1077641216,1077657599,CA -1077657600,1077936127,US -1078001664,1078124543,US +1077657600,1077839103,US +1077839104,1077839119,ES +1077839120,1077839543,US +1077839544,1077839551,ES +1077839552,1077841151,US +1077841152,1077841407,GB +1077841408,1077841671,US +1077841672,1077841679,ES +1077841680,1077843719,US +1077843720,1077843727,CN +1077843728,1077846271,US +1077846272,1077846527,JP +1077846528,1077848575,US +1077848576,1077848831,GR +1077848832,1077851375,US +1077851376,1077851383,FR +1077851384,1077851471,US +1077851472,1077851487,HK +1077851488,1077852671,US +1077852672,1077852927,CA +1077852928,1077853183,US +1077853184,1077853439,IT +1077853440,1077856015,US +1077856016,1077856031,IT +1077856032,1077856127,US +1077856128,1077856191,AU +1077856192,1077856223,IT +1077856224,1077857279,US +1077857280,1077857535,CA +1077857536,1077857567,US +1077857568,1077857575,IT +1077857576,1077858015,US +1077858016,1077858047,CN +1077858048,1077858911,US +1077858912,1077858943,LV +1077858944,1077858975,ZA +1077858976,1077859935,US +1077859936,1077859951,IT +1077859952,1077859967,US +1077859968,1077860095,IT +1077860096,1077861119,US +1077861120,1077861631,IT +1077861632,1077862911,US +1077862912,1077863167,IT +1077863168,1077863207,US +1077863208,1077863215,NG +1077863216,1077864703,US +1077864704,1077864719,IT +1077864720,1077865983,US +1077865984,1077866239,CA +1077866240,1077867655,US +1077867656,1077867663,CK +1077867664,1077867775,US +1077867776,1077868159,IT +1077868160,1077868831,US +1077868832,1077868847,AE +1077868848,1077869663,US +1077869664,1077869671,LV +1077869672,1077869759,US +1077869760,1077869823,GR +1077869824,1077870335,US +1077870336,1077870591,CN +1077870592,1077963775,US +1077963776,1077964031,CA +1077964032,1077977087,US +1077977088,1077985279,CA +1077985280,1077993471,US +1077993472,1078001663,CA +1078001664,1078067199,US +1078067200,1078071295,BS +1078071296,1078075391,CA +1078075392,1078124543,US 1078124544,1078128639,CA 1078128640,1078247423,US -1078251520,1078280639,US -1078280640,1078280671,CR -1078280672,1078282751,US -1078282752,1078283007,CA -1078283008,1078283423,US -1078283424,1078283439,CA -1078283440,1078283743,US -1078283744,1078283775,CA -1078283776,1078283999,US -1078284000,1078284031,CA -1078284032,1078284367,US +1078247424,1078251519,CA +1078251520,1078280191,US +1078280192,1078280575,CA +1078280576,1078280591,US +1078280592,1078280639,CA +1078280640,1078280655,CR +1078280656,1078280671,CA +1078280672,1078280695,US +1078280696,1078280943,CA +1078280944,1078281071,US +1078281072,1078281079,CA +1078281080,1078281087,US +1078281088,1078281279,CA +1078281280,1078281295,US +1078281296,1078281663,CA +1078281664,1078281679,US +1078281680,1078281711,CA +1078281712,1078281719,US +1078281720,1078281735,CA +1078281736,1078281743,US +1078281744,1078281759,CA +1078281760,1078281791,KN +1078281792,1078282119,CA +1078282120,1078282223,US +1078282224,1078282238,CA +1078282239,1078282239,US +1078282240,1078283015,CA +1078283016,1078283023,VG +1078283024,1078283103,CA +1078283104,1078283111,MX +1078283112,1078283119,CA +1078283120,1078283135,US +1078283136,1078283263,CA +1078283264,1078283264,US +1078283265,1078283375,CA +1078283376,1078283391,MX +1078283392,1078283407,CA +1078283408,1078283423,US +1078283424,1078283487,CA +1078283488,1078283495,US +1078283496,1078283551,CA +1078283552,1078283583,US +1078283584,1078283647,CA +1078283648,1078283663,US +1078283664,1078283671,CA +1078283672,1078283679,US +1078283680,1078283687,CA +1078283688,1078283695,US +1078283696,1078283751,CA +1078283752,1078283775,US +1078283776,1078284031,CA +1078284032,1078284159,BS +1078284160,1078284255,CA +1078284256,1078284287,US +1078284288,1078284319,CA +1078284320,1078284351,US +1078284352,1078284367,CA 1078284368,1078284383,BV -1078284384,1078287871,US -1078287872,1078288127,CA -1078288128,1078336447,US +1078284384,1078284399,US +1078284400,1078284687,CA +1078284688,1078284695,US +1078284696,1078284703,MX +1078284704,1078284991,CA +1078284992,1078285007,US +1078285008,1078285015,CA +1078285016,1078285023,US +1078285024,1078285031,CA +1078285032,1078285039,US +1078285040,1078285191,CA +1078285192,1078285215,US +1078285216,1078285231,CA +1078285232,1078285247,US +1078285248,1078285255,CA +1078285256,1078285263,US +1078285264,1078285279,CA +1078285280,1078285287,MX +1078285288,1078285295,US +1078285296,1078285303,CA +1078285304,1078285567,US +1078285568,1078285639,CA +1078285640,1078285647,US +1078285648,1078285695,CA +1078285696,1078285703,MX +1078285704,1078285711,US +1078285712,1078285919,CA +1078285920,1078285943,US +1078285944,1078286047,CA +1078286048,1078286079,US +1078286080,1078286111,CA +1078286112,1078286115,US +1078286116,1078286143,CA +1078286144,1078286207,US +1078286208,1078286335,CA +1078286336,1078286351,US +1078286352,1078286367,CA +1078286368,1078286399,US +1078286400,1078286431,CA +1078286432,1078286463,US +1078286464,1078286559,CA +1078286560,1078286575,TW +1078286576,1078286591,CA +1078286592,1078286655,US +1078286656,1078286687,CA +1078286688,1078286751,US +1078286752,1078286759,CA +1078286760,1078286783,US +1078286784,1078286791,MX +1078286792,1078286847,US +1078286848,1078286975,CA +1078286976,1078286991,US +1078286992,1078287031,CA +1078287032,1078287039,US +1078287040,1078287071,CA +1078287072,1078287103,US +1078287104,1078287183,CA +1078287184,1078287199,US +1078287200,1078287231,CA +1078287232,1078287247,US +1078287248,1078287295,CA +1078287296,1078287311,US +1078287312,1078287327,CA +1078287328,1078287343,US +1078287344,1078287759,CA +1078287760,1078287767,US +1078287768,1078287839,CA +1078287840,1078287863,US +1078287864,1078288383,CA +1078288384,1078309695,US +1078309696,1078309711,GB +1078309712,1078309967,US +1078309968,1078309999,GB +1078310000,1078312255,US +1078312256,1078312271,GB +1078312272,1078336447,US 1078336448,1078336455,HK 1078336456,1078336463,US 1078336464,1078336479,HK @@ -8076,22 +10993,111 @@ 1078341808,1078341823,PH 1078341824,1078349311,US 1078349312,1078349823,PH -1078349824,1078456319,US +1078349824,1078428031,US +1078428032,1078428159,AU +1078428160,1078428255,US +1078428256,1078428263,PH +1078428264,1078428999,US +1078429000,1078429007,MX +1078429008,1078429623,US +1078429624,1078429631,AU +1078429632,1078429695,US +1078429696,1078429951,GR +1078429952,1078430095,US +1078430096,1078430111,AE +1078430112,1078430159,US +1078430160,1078430167,FJ +1078430168,1078430847,US +1078430848,1078430855,JP +1078430856,1078430911,US +1078430912,1078430975,AU +1078430976,1078432095,US +1078432096,1078432103,JP +1078432104,1078432151,US +1078432152,1078432159,JP +1078432160,1078432223,US +1078432224,1078432239,AE +1078432240,1078432767,US +1078432768,1078432775,GB +1078432776,1078432879,US +1078432880,1078432887,GB +1078432888,1078433311,US +1078433312,1078433343,IT +1078433344,1078433631,US +1078433632,1078433663,CN +1078433664,1078434079,US +1078434080,1078434087,LV +1078434088,1078434271,US +1078434272,1078434303,GR +1078434304,1078434759,US +1078434760,1078434767,BE +1078434768,1078434775,US +1078434776,1078434783,JP +1078434784,1078434927,US +1078434928,1078434943,DE +1078434944,1078435423,US +1078435424,1078435455,HK +1078435456,1078435471,US +1078435472,1078435479,BM +1078435480,1078436719,US +1078436720,1078436727,JP +1078436728,1078436767,US +1078436768,1078436799,GB +1078436800,1078437471,US +1078437472,1078437479,JP +1078437480,1078437503,US +1078437504,1078437567,IT +1078437568,1078437599,HK +1078437600,1078438399,US +1078438400,1078438655,CA +1078438656,1078438911,US +1078438912,1078439167,CN +1078439168,1078439679,US +1078439680,1078439935,NL +1078439936,1078440127,US +1078440128,1078440159,MX +1078440160,1078452991,US +1078452992,1078453247,AZ +1078453248,1078453759,IN +1078453760,1078453887,US +1078453888,1078453903,AF +1078453904,1078453935,US +1078453936,1078453951,AT +1078453952,1078454559,US +1078454560,1078454567,GB +1078454568,1078454655,US +1078454656,1078454663,UY +1078454664,1078454703,US +1078454704,1078454719,AT +1078454720,1078455343,US +1078455344,1078455359,AT +1078455360,1078456319,US 1078456320,1078460415,CA 1078460416,1078517759,US 1078517760,1078525951,CA -1078525952,1078660799,US +1078525952,1078600639,US +1078600640,1078600647,GB +1078600648,1078615679,US +1078615680,1078615711,GB +1078615712,1078621695,US +1078621696,1078621951,IN +1078621952,1078651055,US +1078651056,1078651071,CA +1078651072,1078653695,US +1078653696,1078653727,CZ +1078653728,1078660799,US 1078660800,1078660831,CN 1078660832,1078661807,US 1078661808,1078661823,IN 1078661824,1078722559,US -1078722560,1078734847,AR +1078722560,1078730127,AR +1078730128,1078730135,CH +1078730136,1078734847,AR 1078734848,1078737919,CO 1078737920,1078738943,EC 1078738944,1078739455,VE 1078739456,1078739967,US -1078739968,1078740991,PE -1078740992,1078743039,US +1078739968,1078743039,PE 1078743040,1078746111,CO 1078746112,1078747135,PE 1078747136,1078749183,CL @@ -8101,7 +11107,9 @@ 1078751232,1078753279,CO 1078753280,1078755327,AR 1078755328,1078757375,PE -1078757376,1078767615,CL +1078757376,1078757423,CL +1078757424,1078757439,EC +1078757440,1078767615,CL 1078767616,1078768639,CO 1078768640,1078769663,CL 1078769664,1078771711,CO @@ -8109,88 +11117,279 @@ 1078773760,1078775807,PE 1078775808,1078777855,CO 1078777856,1078780927,EC -1078780928,1078904831,US -1078906880,1078952831,US -1078952832,1078952895,GB -1078952896,1078956799,US +1078780928,1078782463,US +1078782464,1078782719,PA +1078782720,1078791215,US +1078791216,1078791223,AU +1078791224,1078791255,US +1078791256,1078791263,CO +1078791264,1078791303,US +1078791304,1078791311,CA +1078791312,1078791319,US +1078791320,1078791343,AU +1078791344,1078791391,US +1078791392,1078791407,MX +1078791408,1078791439,US +1078791440,1078791447,PK +1078791448,1078791471,US +1078791472,1078791487,IL +1078791488,1078791503,US +1078791504,1078791519,MX +1078791520,1078791711,US +1078791712,1078791727,AU +1078791728,1078792015,US +1078792016,1078792031,AU +1078792032,1078792095,US +1078792096,1078792111,AU +1078792112,1078792127,IN +1078792128,1078792175,US +1078792176,1078792191,AU +1078792192,1078792511,US +1078792512,1078792543,SG +1078792544,1078793119,US +1078793120,1078793151,CA +1078793152,1078793535,US +1078793536,1078793599,ZA +1078793600,1078793663,US +1078793664,1078793727,ZA +1078793728,1078794495,US +1078794496,1078794559,ZA +1078794560,1078794591,US +1078794592,1078794623,AU +1078794624,1078795159,US +1078795160,1078795167,AE +1078795168,1078795255,US +1078795256,1078795263,MX +1078795264,1078795767,US +1078795768,1078795775,IN +1078795776,1078795783,CA +1078795784,1078795807,US +1078795808,1078795815,AU +1078795816,1078795823,US +1078795824,1078795831,CA +1078795832,1078795887,US +1078795888,1078795895,CA +1078795896,1078795903,US +1078795904,1078795911,ES +1078795912,1078797399,US +1078797400,1078797407,CA +1078797408,1078797591,US +1078797592,1078797599,IN +1078797600,1078797703,US +1078797704,1078797711,JP +1078797712,1078797791,US +1078797792,1078797815,IN +1078797816,1078797823,MX +1078797824,1078797991,US +1078797992,1078797999,CA +1078798000,1078798071,US +1078798072,1078798079,GB +1078798080,1078798111,US +1078798112,1078798119,CA +1078798120,1078798151,US +1078798152,1078798159,AU +1078798160,1078798183,US +1078798184,1078798191,FR +1078798192,1078798199,IN +1078798200,1078798207,US +1078798208,1078798215,IN +1078798216,1078798223,GB +1078798224,1078798231,GR +1078798232,1078798279,US +1078798280,1078798287,PK +1078798288,1078798447,US +1078798448,1078798455,AT +1078798456,1078798575,US +1078798576,1078798591,AR +1078798592,1078798687,US +1078798688,1078798703,AU +1078798704,1078798911,US +1078798912,1078798927,IT +1078798928,1078799039,US +1078799040,1078799055,IT +1078799056,1078799071,US +1078799072,1078799087,CA +1078799088,1078799263,US +1078799264,1078799295,MX +1078799296,1078799423,US +1078799424,1078799455,MX +1078799456,1078799551,US +1078799552,1078799583,ID +1078799584,1078799679,US +1078799680,1078799743,BR +1078799744,1078799999,US +1078800000,1078800031,AU +1078800032,1078800191,US +1078800192,1078800223,IN +1078800224,1078800287,US +1078800288,1078800319,MX +1078800320,1078800799,US +1078800800,1078800831,FR +1078800832,1078801327,US +1078801328,1078801343,CL +1078801344,1078808991,US +1078808992,1078809023,AU +1078809024,1078809647,US +1078809648,1078809663,CA +1078809664,1078814135,US +1078814136,1078814143,HK +1078814144,1078814399,US +1078814400,1078814415,CA +1078814416,1078956799,US 1078956800,1078957055,GB 1078957056,1079320575,US -1079320576,1079328767,CA +1079320576,1079320671,CA +1079320672,1079320703,US +1079320704,1079322191,CA +1079322192,1079322199,US +1079322200,1079322703,CA +1079322704,1079322719,US +1079322720,1079322815,CA +1079322816,1079322839,US +1079322840,1079322847,CA +1079322848,1079322863,US +1079322864,1079323231,CA +1079323232,1079323247,US +1079323248,1079323263,CA +1079323264,1079323279,US +1079323280,1079323311,CA +1079323312,1079323327,US +1079323328,1079323415,CA +1079323416,1079323423,US +1079323424,1079323583,CA +1079323584,1079323599,US +1079323600,1079323615,CA +1079323616,1079323647,US +1079323648,1079324455,CA +1079324456,1079324463,US +1079324464,1079324799,CA +1079324800,1079324831,US +1079324832,1079325455,CA +1079325456,1079325483,US +1079325484,1079325527,CA +1079325528,1079325535,US +1079325536,1079325547,CA +1079325548,1079325559,US +1079325560,1079325599,CA +1079325600,1079325607,US +1079325608,1079325695,CA +1079325696,1079325727,US +1079325728,1079325871,CA +1079325872,1079325887,US +1079325888,1079325991,CA +1079325992,1079325999,US +1079326000,1079328503,CA +1079328504,1079328511,US +1079328512,1079328767,CA 1079328768,1079329919,US 1079329920,1079329951,CA -1079329952,1079377919,US +1079329952,1079354127,US +1079354128,1079354143,TR +1079354144,1079354239,US +1079354240,1079354271,CA +1079354272,1079354703,US +1079354704,1079354711,CA +1079354712,1079355359,US +1079355360,1079355367,CA +1079355368,1079355903,US +1079355904,1079355939,CA +1079355940,1079355951,AU +1079355952,1079356415,CA +1079356416,1079356663,US +1079356664,1079356671,CA +1079356672,1079377919,US 1079377920,1079378943,CA -1079378944,1079379199,US -1079379200,1079379455,CA -1079379456,1079379711,US +1079378944,1079379711,US 1079379712,1079380927,CA 1079380928,1079381183,US 1079381184,1079381503,CA 1079381504,1079381599,US 1079381600,1079381631,WS 1079381632,1079382015,US -1079382016,1079382783,CA -1079382784,1079383039,US +1079382016,1079382527,CA +1079382528,1079383039,US 1079383040,1079383295,VG 1079383296,1079383807,US 1079383808,1079384063,MH -1079384064,1079384575,CA +1079384064,1079384319,LR +1079384320,1079384575,CA 1079384576,1079385087,ZW -1079385088,1079385855,CA +1079385088,1079385471,CA +1079385472,1079385599,US +1079385600,1079385855,CA 1079385856,1079386111,SZ 1079386112,1079386623,US 1079386624,1079386879,SG 1079386880,1079387135,EG -1079387136,1079387391,PK -1079387392,1079387647,NG -1079387648,1079387903,US +1079387136,1079387903,US 1079387904,1079388159,PH 1079388160,1079389439,CA -1079389440,1079389695,US -1079389696,1079389951,LC -1079389952,1079391231,CA -1079391232,1079391487,LC -1079391488,1079393279,CA -1079393280,1079393791,US -1079393792,1079394063,CA +1079389440,1079389951,US +1079389952,1079390719,CA +1079390720,1079391487,US +1079391488,1079391615,CA +1079391616,1079391679,US +1079391680,1079391743,CA +1079391744,1079392255,HT +1079392256,1079393279,CA +1079393280,1079394047,US +1079394048,1079394063,CA 1079394064,1079394071,SG 1079394072,1079394079,CA 1079394080,1079394111,US 1079394112,1079394143,AF -1079394144,1079394239,CA +1079394144,1079394175,CA +1079394176,1079394207,US +1079394208,1079394239,CA 1079394240,1079394303,US -1079394304,1079396095,CA -1079396096,1079396351,US -1079396352,1079397375,CA +1079394304,1079395327,EC +1079395328,1079395839,CA +1079395840,1079396095,US +1079396096,1079396351,CA +1079396352,1079397375,MP 1079397376,1079397631,MH -1079397632,1079397887,MY -1079397888,1079398399,US -1079398400,1079399935,CA +1079397632,1079398399,US +1079398400,1079399583,CA +1079399584,1079399599,US +1079399600,1079399935,CA 1079399936,1079400447,US 1079400448,1079400511,FR -1079400512,1079400703,CA -1079400704,1079400895,US -1079400896,1079401983,CA +1079400512,1079400575,CA +1079400576,1079400639,US +1079400640,1079400703,CA +1079400704,1079400831,US +1079400832,1079401215,CA +1079401216,1079401471,US +1079401472,1079401983,CA 1079401984,1079402495,US 1079402496,1079403007,CA 1079403008,1079403519,US 1079403520,1079403775,CA -1079403776,1079404927,US -1079404928,1079405023,CA -1079405024,1079405407,US +1079403776,1079403807,US +1079403808,1079403839,CA +1079403840,1079403935,US +1079403936,1079403999,CA +1079404000,1079404799,US +1079404800,1079405023,CA +1079405024,1079405247,US +1079405248,1079405407,CA 1079405408,1079405439,BD 1079405440,1079405567,US -1079405568,1079406079,CA -1079406080,1079406591,PH -1079406592,1079408383,CA -1079408384,1079408415,SA -1079408416,1079408431,CA -1079408432,1079408447,US -1079408448,1079408895,CA +1079405568,1079407103,CA +1079407104,1079407359,US +1079407360,1079407615,CA +1079407616,1079408127,US +1079408128,1079408383,CA +1079408384,1079408415,ZA +1079408416,1079408447,US +1079408448,1079408639,CA +1079408640,1079408895,US 1079408896,1079409407,PK -1079409408,1079409919,CA -1079409920,1079410175,US -1079410176,1079411455,CA +1079409408,1079409919,LR +1079409920,1079410687,CA +1079410688,1079410943,US +1079410944,1079411199,CA +1079411200,1079411455,US 1079411456,1079411711,PK 1079411712,1079412735,CA 1079412736,1079413247,US @@ -8198,154 +11397,827 @@ 1079413312,1079413343,US 1079413344,1079414271,CA 1079414272,1079415039,US -1079415040,1079415551,CA +1079415040,1079415295,HN +1079415296,1079415551,CA 1079415552,1079416319,US -1079416320,1079422223,CA -1079422224,1079422239,IN -1079422240,1079422463,CA +1079416320,1079419135,CA +1079419136,1079419903,US +1079419904,1079420159,CA +1079420160,1079420671,US +1079420672,1079421951,CA +1079421952,1079422207,US +1079422208,1079422463,CA 1079422464,1079423487,MZ 1079423488,1079423999,CA 1079424000,1079424767,MZ 1079424768,1079425279,US 1079425280,1079425535,CA -1079425536,1079425551,ZA -1079425552,1079430399,CA -1079430400,1079431167,US -1079431168,1079433215,CA +1079425536,1079425551,US +1079425552,1079427071,CA +1079427072,1079427327,US +1079427328,1079427583,CA +1079427584,1079428095,PW +1079428096,1079429375,CA +1079429376,1079429887,US +1079429888,1079431679,CA +1079431680,1079432191,ZM +1079432192,1079432703,CA +1079432704,1079432959,US +1079432960,1079433215,CA 1079433216,1079435263,CR -1079435264,1079443199,CA +1079435264,1079435775,CO +1079435776,1079436799,HT +1079436800,1079437311,CA +1079437312,1079439359,US +1079439360,1079442431,CA +1079442432,1079442687,US +1079442688,1079443199,CA 1079443200,1079443231,PW 1079443232,1079443327,CA 1079443328,1079443455,AU -1079443456,1079447551,US -1079476224,1079508991,CA -1079508992,1079547647,US -1079547648,1079547679,CA -1079547680,1079574527,US +1079443456,1079459839,US +1079459840,1079508991,CA +1079508992,1079566847,US +1079566848,1079567103,GB +1079567104,1079567359,US +1079567360,1079567615,AU +1079567616,1079574527,US +1079574528,1079576487,PR +1079576488,1079576495,US +1079576496,1079578623,PR 1079578624,1079585391,US 1079585392,1079585407,IN 1079585408,1079664639,US 1079664640,1079668735,CA -1079668736,1079861247,US +1079668736,1079827871,US +1079827872,1079827887,RU +1079827888,1079856639,US +1079856640,1079856895,IN +1079856896,1079857887,US +1079857888,1079857903,NZ +1079857904,1079861247,US 1079861248,1079865343,CA -1079865344,1080033279,US +1079865344,1079944295,US +1079944296,1079944303,IL +1079944304,1079944383,US +1079944384,1079944415,IL +1079944416,1079946143,US +1079946144,1079946151,FR +1079946152,1079946431,US +1079946432,1079946463,CA +1079946464,1079953567,US +1079953568,1079953599,GB +1079953600,1079994367,US +1079994368,1079996415,CA +1079996416,1080021999,US +1080022000,1080022007,CA +1080022008,1080033279,US 1080033280,1080295423,CA -1080295424,1080999935,US +1080295424,1080722827,US +1080722828,1080722837,IT +1080722838,1080722993,US +1080722994,1080723003,CA +1080723004,1080723113,US +1080723114,1080723123,BR +1080723124,1080723229,US +1080723230,1080723239,GB +1080723240,1080723259,US +1080723260,1080723269,GB +1080723270,1080723359,US +1080723360,1080723369,BR +1080723370,1080723565,US +1080723566,1080723575,AE +1080723576,1080724519,US +1080724520,1080724539,CA +1080724540,1080724875,US +1080724876,1080724885,SY +1080724886,1080725041,US +1080725042,1080725051,QA +1080725052,1080725081,US +1080725082,1080725091,QA +1080725092,1080725171,US +1080725172,1080725181,QA +1080725182,1080725277,US +1080725278,1080725287,CA +1080725288,1080725297,NZ +1080725298,1080725467,US +1080725468,1080725477,LB +1080725478,1080725563,US +1080725564,1080725573,IT +1080725574,1080725713,US +1080725714,1080725723,BE +1080725724,1080725929,US +1080725930,1080725939,BE +1080725940,1080726185,US +1080726186,1080726195,JO +1080726196,1080726607,US +1080726608,1080726617,CA +1080726618,1080727129,US +1080727130,1080727139,AU +1080727140,1080727159,US +1080727160,1080727169,CA +1080727170,1080727189,US +1080727190,1080727199,AU +1080727200,1080727741,US +1080727742,1080727761,BR +1080727762,1080727781,US +1080727782,1080727801,GB +1080727802,1080728625,US +1080728626,1080728655,NZ +1080728656,1080728775,US +1080728776,1080728805,SE +1080728806,1080728881,US +1080728882,1080728891,IN +1080728892,1080729127,US +1080729128,1080729137,UA +1080729138,1080729147,US +1080729148,1080729157,CA +1080729158,1080729177,US +1080729178,1080729187,KH +1080729188,1080729217,US +1080729218,1080729237,KH +1080729238,1080729287,US +1080729288,1080729297,IT +1080729298,1080729629,US +1080729630,1080729639,JP +1080729640,1080729649,CA +1080729650,1080732319,US +1080732320,1080732351,QA +1080732352,1080733193,US +1080733194,1080733203,NZ +1080733204,1080733213,LB +1080733214,1080733233,US +1080733234,1080733243,DK +1080733244,1080739007,US +1080739008,1080739023,JO +1080739024,1080739899,US +1080739900,1080739909,IN +1080739910,1080740235,US +1080740236,1080740255,UA +1080740256,1080740265,GA +1080740266,1080740305,US +1080740306,1080740315,LB +1080740316,1080740551,US +1080740552,1080740561,UA +1080740562,1080741189,US +1080741190,1080741199,GR +1080741200,1080741269,US +1080741270,1080741279,GR +1080741280,1080741289,GB +1080741290,1080741495,US +1080741496,1080741505,CA +1080741506,1080741605,US +1080741606,1080741615,SE +1080741616,1080741671,US +1080741672,1080741681,CA +1080741682,1080744211,US +1080744212,1080744221,CA +1080744222,1080744511,US +1080744512,1080744575,NO +1080744576,1080746691,US +1080746692,1080746723,QA +1080746724,1080747333,US +1080747334,1080747343,NZ +1080747344,1080747353,CA +1080747354,1080747503,US +1080747504,1080747513,CA +1080747514,1080747539,US +1080747540,1080747559,CA +1080747560,1080747875,US +1080747876,1080747885,ES +1080747886,1080747915,US +1080747916,1080747925,IL +1080747926,1080747955,US +1080747956,1080747965,ES +1080747966,1080747975,US +1080747976,1080748005,CA +1080748006,1080748063,US +1080748064,1080748095,QA +1080748096,1080749823,US +1080749824,1080749951,CA +1080749952,1080750601,US +1080750602,1080750611,GB +1080750612,1080820871,US +1080820872,1080820879,PR +1080820880,1080954879,US +1080955904,1080957183,US +1080957952,1080958207,A2 +1080958208,1080958463,BH +1080958464,1080958719,A2 +1080958720,1080958975,BH +1080958976,1080960255,A2 +1080960256,1080960511,BH +1080960512,1080963839,A2 +1080963840,1080967167,US +1080967168,1080968191,A2 +1080968192,1080968447,BH +1080968448,1080969471,A2 +1080969472,1080969727,BH +1080969728,1080972575,A2 +1080972576,1080972607,ID +1080972608,1080983551,A2 +1080983552,1080987647,US +1080987648,1080988671,A2 +1080988672,1080989951,US +1080989952,1080990207,A2 +1080990208,1080999935,US 1080999936,1081016319,CA -1081016320,1081212927,US +1081016320,1081037311,US +1081037312,1081037567,CA +1081037568,1081038335,US +1081038336,1081040895,CA +1081040896,1081085951,US +1081085952,1081086207,VI +1081086208,1081122559,US +1081122560,1081122815,VI +1081122816,1081212927,US 1081212928,1081278463,CA -1081278464,1081379327,US +1081278464,1081368607,US +1081368608,1081368615,CO +1081368616,1081368623,US +1081368624,1081368631,CO +1081368632,1081368743,US +1081368744,1081368767,CO +1081368768,1081369119,US +1081369120,1081369151,CO +1081369152,1081369599,US +1081369600,1081370111,CO +1081370112,1081377055,US +1081377056,1081377071,VE +1081377072,1081377079,US +1081377080,1081377087,VE +1081377088,1081377119,US +1081377120,1081377135,VE +1081377136,1081377183,US +1081377184,1081377199,VE +1081377200,1081377247,US +1081377248,1081377279,VE +1081377280,1081377663,US +1081377664,1081377791,VE +1081377792,1081377815,US +1081377816,1081377823,VE +1081377824,1081377887,US +1081377888,1081377919,VE +1081377920,1081377935,US +1081377936,1081377999,VE +1081378000,1081378015,US +1081378016,1081378047,VE +1081378048,1081378303,US +1081378304,1081378319,VE +1081378320,1081378375,US +1081378376,1081378399,VE +1081378400,1081378495,US +1081378496,1081378575,VE +1081378576,1081378607,US +1081378608,1081378655,VE +1081378656,1081378751,US +1081378752,1081378815,VE +1081378816,1081379327,US 1081379328,1081379839,VE 1081379840,1081385215,US -1081385216,1081385471,PA -1081385472,1081387519,US +1081385216,1081385535,PA +1081385536,1081385983,US +1081385984,1081385991,PA +1081385992,1081385999,US +1081386000,1081386015,PA +1081386016,1081386047,VE +1081386048,1081386623,US +1081386624,1081386687,PA +1081386688,1081387519,US 1081387520,1081388031,PA -1081388032,1081391103,US +1081388032,1081388127,US +1081388128,1081388143,PA +1081388144,1081388151,PR +1081388152,1081391103,US 1081391104,1081393151,PA -1081393152,1081394175,US -1081394176,1081397247,CL +1081393152,1081393407,US +1081393408,1081393751,CL +1081393752,1081393759,US +1081393760,1081393783,CL +1081393784,1081393799,US +1081393800,1081393807,CL +1081393808,1081393831,US +1081393832,1081393839,CL +1081393840,1081393887,US +1081393888,1081393903,CL +1081393904,1081393919,US +1081393920,1081397247,CL 1081397248,1081397759,US 1081397760,1081398783,CL 1081398784,1081399295,US 1081399296,1081401343,CL -1081401344,1081401855,US -1081401856,1081402367,AR -1081402368,1081409791,US +1081401344,1081401391,AR +1081401392,1081401415,US +1081401416,1081401535,AR +1081401536,1081401567,US +1081401568,1081401735,AR +1081401736,1081401743,US +1081401744,1081402367,AR +1081402368,1081402895,US +1081402896,1081403007,AR +1081403008,1081403055,US +1081403056,1081403103,AR +1081403104,1081403119,US +1081403120,1081403487,AR +1081403488,1081403519,US +1081403520,1081403551,AR +1081403552,1081403615,US +1081403616,1081403631,AR +1081403632,1081403711,US +1081403712,1081403775,AR +1081403776,1081403847,US +1081403848,1081403871,AR +1081403872,1081403903,US +1081403904,1081403967,AR +1081403968,1081404031,US +1081404032,1081404095,AR +1081404096,1081404991,US +1081404992,1081405119,AR +1081405120,1081409791,US 1081409792,1081410047,PR 1081410048,1081410559,US 1081410560,1081411583,PR -1081411584,1081416191,US +1081411584,1081413119,US +1081413120,1081413375,PR +1081413376,1081413423,US +1081413424,1081413447,PR +1081413448,1081413527,US +1081413528,1081413535,CA +1081413536,1081413567,US +1081413568,1081413575,CA +1081413576,1081413583,US +1081413584,1081413631,PR +1081413632,1081416191,US 1081416192,1081416447,PR -1081416448,1081418751,US -1081418752,1081419007,PR -1081419008,1081443327,US +1081416448,1081419199,US +1081419200,1081419231,PR +1081419232,1081419263,US +1081419264,1081419391,PR +1081419392,1081419423,US +1081419424,1081419431,PR +1081419432,1081419447,US +1081419448,1081419455,PR +1081419456,1081419487,US +1081419488,1081419519,PR +1081419520,1081419775,US +1081419776,1081420287,PR +1081420288,1081420319,US +1081420320,1081420351,PR +1081420352,1081420479,US +1081420480,1081420543,PR +1081420544,1081421183,US +1081421184,1081421215,PR +1081421216,1081442367,US +1081442368,1081442399,CL +1081442400,1081442463,US +1081442464,1081442495,CL +1081442496,1081442911,US +1081442912,1081442927,CL +1081442928,1081442959,US +1081442960,1081442967,CL +1081442968,1081443327,US 1081443328,1081444863,CL -1081444864,1081445375,US -1081445376,1081446399,CL -1081446400,1081460735,US +1081444864,1081445303,US +1081445304,1081445311,CL +1081445312,1081445375,US +1081445376,1081450495,CL +1081450496,1081460735,US 1081460736,1081462783,PA -1081462784,1081479167,US -1081479168,1081483263,CA +1081462784,1081462815,CO +1081462816,1081462911,BR +1081462912,1081462919,US +1081462920,1081462927,BR +1081462928,1081463231,US +1081463232,1081463247,BR +1081463248,1081463255,US +1081463256,1081463263,BR +1081463264,1081463271,US +1081463272,1081463279,BR +1081463280,1081463295,US +1081463296,1081463391,BR +1081463392,1081463423,US +1081463424,1081463487,BR +1081463488,1081479167,US +1081479168,1081483247,CA +1081483248,1081483255,US +1081483256,1081483263,CA 1081483264,1081487359,US +1081487360,1081491455,A2 1081491456,1081565183,US 1081565184,1081573375,CA -1081573376,1081589759,US +1081573376,1081581615,US +1081581616,1081581623,JP +1081581624,1081581671,US +1081581672,1081581687,GB +1081581688,1081581695,US +1081581696,1081581703,AE +1081581704,1081581743,US +1081581744,1081581759,MX +1081581760,1081581767,US +1081581768,1081581775,AR +1081581776,1081581823,US +1081581824,1081581975,GB +1081581976,1081581983,US +1081581984,1081582015,AR +1081582016,1081582079,GB +1081582080,1081582087,PH +1081582088,1081582151,US +1081582152,1081582159,AR +1081582160,1081582167,US +1081582168,1081582175,AE +1081582176,1081582183,US +1081582184,1081582199,ID +1081582200,1081582223,US +1081582224,1081582231,JP +1081582232,1081582335,US +1081582336,1081582343,MY +1081582344,1081582535,US +1081582536,1081582559,AR +1081582560,1081582567,US +1081582568,1081582591,MY +1081582592,1081582599,AR +1081582600,1081582679,US +1081582680,1081582687,AR +1081582688,1081582695,US +1081582696,1081582703,MY +1081582704,1081582711,US +1081582712,1081582719,AR +1081582720,1081582775,US +1081582776,1081582783,AR +1081582784,1081582903,US +1081582904,1081582911,AR +1081582912,1081582991,US +1081582992,1081582999,HK +1081583000,1081583007,AR +1081583008,1081583055,US +1081583056,1081583071,AR +1081583072,1081583103,MY +1081583104,1081583215,US +1081583216,1081583231,PH +1081583232,1081583551,US +1081583552,1081583567,MY +1081583568,1081583743,US +1081583744,1081583767,CA +1081583768,1081583807,US +1081583808,1081583815,AU +1081583816,1081583887,US +1081583888,1081583911,MY +1081583912,1081583919,JP +1081583920,1081583999,US +1081584000,1081584007,MY +1081584008,1081584079,US +1081584080,1081584087,MY +1081584088,1081584127,US +1081584128,1081584151,DE +1081584152,1081584167,US +1081584168,1081584191,PH +1081584192,1081584199,US +1081584200,1081584223,MY +1081584224,1081584271,AR +1081584272,1081584463,US +1081584464,1081584487,MY +1081584488,1081584511,US +1081584512,1081584519,AR +1081584520,1081584543,US +1081584544,1081584575,MY +1081584576,1081584599,US +1081584600,1081584639,AR +1081584640,1081585439,US +1081585440,1081585455,AE +1081585456,1081585503,US +1081585504,1081585519,LB +1081585520,1081586231,US +1081586232,1081586239,IT +1081586240,1081586247,AU +1081586248,1081587759,US +1081587760,1081587767,AU +1081587768,1081588351,US +1081588352,1081588359,GB +1081588360,1081588543,US +1081588544,1081588551,KH +1081588552,1081588751,US +1081588752,1081588767,AU +1081588768,1081589103,US +1081589104,1081589111,PH +1081589112,1081589759,US 1081589760,1081593855,BB -1081597952,1081606143,US -1081671680,1082085375,US -1082089472,1082314751,US -1082318848,1082322943,US -1082327040,1082434239,US +1081593856,1081597951,CA +1081597952,1081608703,US +1081608704,1081608959,CA +1081608960,1081609823,US +1081609824,1081609831,LK +1081609832,1081609887,US +1081609888,1081609919,IN +1081609920,1081616831,US +1081616832,1081616839,GB +1081616840,1081618951,US +1081618952,1081618959,GB +1081618960,1081803287,US +1081803288,1081803295,PR +1081803296,1081803895,US +1081803896,1081803903,PR +1081803904,1081832663,US +1081832664,1081832671,PR +1081832672,1081862639,US +1081862640,1081862647,PR +1081862648,1081872663,US +1081872664,1081872671,FI +1081872672,1081906751,US +1081906752,1081906815,IL +1081906816,1081911823,US +1081911824,1081911831,GB +1081911832,1081911935,US +1081911936,1081911951,GB +1081911952,1081912575,US +1081912576,1081912639,DE +1081912640,1081927135,US +1081927136,1081927143,GB +1081927144,1081955327,US +1081955328,1081955583,CA +1081955584,1081955839,US +1081955840,1081956095,CA +1081956096,1081966871,US +1081966872,1081966879,AS +1081966880,1082091263,US +1082091264,1082091271,CN +1082091272,1082091999,US +1082092000,1082092007,CA +1082092008,1082093679,US +1082093680,1082093695,AU +1082093696,1082097055,US +1082097056,1082097071,CA +1082097072,1082097143,US +1082097144,1082097151,AU +1082097152,1082138623,US +1082138624,1082140671,A2 +1082140672,1082314751,US +1082314752,1082315263,CA +1082315264,1082315471,US +1082315472,1082318847,CA +1082318848,1082344080,US +1082344081,1082344084,GB +1082344085,1082345733,US +1082345734,1082345737,CA +1082345738,1082348319,US +1082348320,1082348327,GB +1082348328,1082348335,US +1082348336,1082348351,GB +1082348352,1082348399,US +1082348400,1082348407,BE +1082348408,1082348415,US +1082348416,1082348423,GB +1082348424,1082348439,US +1082348440,1082348447,SE +1082348448,1082348471,US +1082348472,1082348479,GB +1082348480,1082348735,US +1082348736,1082348799,NL +1082348800,1082348831,CA +1082348832,1082349575,US +1082349576,1082349583,SA +1082349584,1082349591,CA +1082349592,1082349599,GB +1082349600,1082349615,US +1082349616,1082349623,IT +1082349624,1082349639,US +1082349640,1082349647,GB +1082349648,1082349735,US +1082349736,1082349743,MY +1082349744,1082349767,US +1082349768,1082349775,GR +1082349776,1082349783,IT +1082349784,1082349815,US +1082349816,1082349823,RU +1082349824,1082350623,US +1082350624,1082350639,IT +1082350640,1082350655,US +1082350656,1082350671,IT +1082350672,1082350911,US +1082350912,1082350943,RU +1082350944,1082419455,US +1082419456,1082419711,A2 +1082419712,1082434239,US 1082434240,1082434255,IN -1082434256,1082626047,US -1082630144,1082683391,US +1082434256,1082621987,US +1082621988,1082621991,ME +1082621992,1082683391,US 1082683392,1082687487,CA -1082687488,1082945535,US +1082687488,1082885311,US +1082885312,1082885343,CA +1082885344,1082885855,US +1082885856,1082885887,CA +1082885888,1082945535,US 1082945536,1082949631,CA -1082949632,1082982399,US +1082949632,1082952703,US +1082952704,1082952959,CA +1082952960,1082982399,US 1082982400,1083015167,CA -1083015168,1083260927,US -1083269120,1083437055,US +1083015168,1083396095,US +1083396096,1083400191,BM +1083400192,1083417727,US +1083417728,1083417791,CA +1083417792,1083421695,US +1083421696,1083421759,AU +1083421760,1083424511,US +1083424512,1083424767,AU +1083424768,1083437055,US 1083437056,1083441151,CA -1083441152,1083617279,US +1083441152,1083486911,US +1083486912,1083486943,IS +1083486944,1083621375,US 1083621376,1083637759,BS 1083637760,1083686911,US 1083686912,1083703295,CA -1083703296,1083738367,US -1083738368,1083738879,PR -1083738880,1084067583,US +1083703296,1083738111,US +1083738112,1083740159,PR +1083740160,1084067583,US 1084067584,1084067839,CA -1084067840,1085439999,US +1084067840,1084346871,US +1084346872,1084346879,PR +1084346880,1085439999,US 1085440000,1085448191,CA 1085448192,1085456383,US -1085456384,1085464575,PR -1085464576,1085534207,US +1085456384,1085457919,PR +1085457920,1085458175,US +1085458176,1085464575,PR +1085464576,1085526015,US +1085526016,1085530111,CA +1085530112,1085538303,US 1085538304,1085603839,CA -1085603840,1085849599,US +1085603840,1085669656,US +1085669657,1085669664,BZ +1085669665,1085669794,US +1085669795,1085669803,IS +1085669804,1085669838,US +1085669839,1085669847,FR +1085669848,1085670216,US +1085670217,1085670225,HK +1085670226,1085670279,US +1085670280,1085670288,CA +1085670289,1085670297,NL +1085670298,1085670342,US +1085670343,1085670351,IS +1085670352,1085670386,US +1085670387,1085670395,CZ +1085670396,1085670455,US +1085670456,1085670463,NL +1085670464,1085670628,US +1085670629,1085670636,GR +1085670637,1085670644,GE +1085670645,1085671328,US +1085671329,1085671336,IR +1085671337,1085671354,US +1085671355,1085671363,MX +1085671364,1085671380,US +1085671381,1085671389,IT +1085671390,1085671688,US +1085671689,1085671696,LB +1085671697,1085671712,US +1085671713,1085671720,AS +1085671721,1085672351,US +1085672352,1085672359,WS +1085672360,1085672391,US +1085672392,1085672399,WS +1085672400,1085672823,US +1085672824,1085672831,CI +1085672832,1085672840,US +1085672841,1085672848,CZ +1085672849,1085672873,US +1085672874,1085672881,NL +1085672882,1085672960,US +1085672961,1085672969,WS +1085672970,1085672978,CA +1085672979,1085677905,US +1085677906,1085677913,FR +1085677914,1085677921,CZ +1085677922,1085677939,US +1085677940,1085677947,IT +1085677948,1085678408,US +1085678409,1085678417,CA +1085678418,1085678865,US +1085678866,1085678994,GR +1085678995,1085679027,US +1085679028,1085679045,FR +1085679046,1085681695,US +1085681696,1085681711,AS +1085681712,1085681720,US +1085681721,1085681728,WS +1085681729,1085681738,US +1085681739,1085681756,MX +1085681757,1085681765,EG +1085681766,1085681906,US +1085681907,1085681915,CA +1085681916,1085681920,US +1085681921,1085682174,CA +1085682175,1085682258,US +1085682259,1085682267,FR +1085682268,1085682284,US +1085682285,1085682293,IT +1085682294,1085682331,US +1085682332,1085682339,CA +1085682340,1085682374,US +1085682375,1085682382,HK +1085682383,1085682863,US +1085682864,1085682872,AS +1085682873,1085682880,IT +1085682881,1085682906,US +1085682907,1085682922,WS +1085682923,1085683728,US +1085683729,1085683736,CA +1085683737,1085683744,WS +1085683745,1085683905,US +1085683906,1085683914,TC +1085683915,1085684480,US +1085684481,1085684734,AS +1085684735,1085685225,US +1085685226,1085685233,CA +1085685234,1085685304,US +1085685305,1085685312,SA +1085685313,1085685345,US +1085685346,1085685353,CA +1085685354,1085685574,US +1085685575,1085685584,EG +1085685585,1085685610,US +1085685611,1085685618,IT +1085685619,1085685627,AU +1085685628,1085685636,US +1085685637,1085685645,SN +1085685646,1085685661,US +1085685662,1085685669,FR +1085685670,1085685685,CA +1085685686,1085698199,US +1085698200,1085698207,AS +1085698208,1085849599,US 1085849600,1085857791,CA -1085857792,1085906943,US -1085915136,1085964287,US -1085972480,1085997055,US +1085857792,1085915135,US +1085915136,1085923327,PR +1085923328,1085997055,US 1085997056,1086013439,CA -1086013440,1086021951,US -1086021952,1086021983,CA -1086021984,1086022079,US +1086013440,1086022079,US 1086022080,1086022111,CA 1086022112,1086022175,US 1086022176,1086022207,CA 1086022208,1086022303,US -1086022304,1086022399,CA -1086022400,1086022463,US -1086022464,1086022495,CA -1086022496,1086022591,US +1086022304,1086022367,CA +1086022368,1086022591,US 1086022592,1086022655,CA -1086022656,1086025247,US -1086025248,1086025279,CA -1086025280,1086025799,US -1086025800,1086025807,RO -1086025808,1086026879,US -1086026880,1086027007,CA -1086027008,1086028719,US -1086028720,1086028727,CA -1086028728,1086029023,US -1086029024,1086029055,CA -1086029056,1086029663,US -1086029664,1086029695,CA -1086029696,1086062591,US -1086193664,1086358143,US +1086022656,1086023175,US +1086023176,1086023183,GB +1086023184,1086023215,US +1086023216,1086023223,CA +1086023224,1086023287,US +1086023288,1086023295,NZ +1086023296,1086023335,US +1086023336,1086023343,RO +1086023344,1086024031,US +1086024032,1086024047,CA +1086024048,1086027391,US +1086027392,1086027407,IT +1086027408,1086027423,US +1086027424,1086027455,VN +1086027456,1086028663,US +1086028664,1086028671,BR +1086028672,1086028751,US +1086028752,1086028759,BR +1086028760,1086029567,US +1086029568,1086029599,BO +1086029600,1086029703,US +1086029704,1086029719,GB +1086029720,1086029727,US +1086029728,1086029743,CA +1086029744,1086309887,US +1086309888,1086310143,AU +1086310144,1086358143,US 1086358144,1086358271,PA 1086358272,1086359231,US 1086359232,1086359295,IL -1086359296,1086421503,US +1086359296,1086359615,US +1086359616,1086359647,LB +1086359648,1086421503,US 1086421504,1086422015,MP -1086422016,1086922751,US -1086922752,1086930943,CA +1086422016,1086476543,US +1086476544,1086476607,BM +1086476608,1086910335,US +1086910336,1086910463,LB +1086910464,1086922751,US +1086922752,1086923343,CA +1086923344,1086923359,US +1086923360,1086930943,CA 1086930944,1086955519,US 1086955520,1086971903,CA -1086971904,1087016959,US +1086971904,1087008767,US +1087008768,1087009279,CY +1087009280,1087011327,US +1087011328,1087011583,GB +1087011584,1087016959,US 1087016960,1087021055,CA -1087021056,1087475711,US -1087479808,1087495519,US +1087021056,1087419903,US +1087419904,1087420159,CA +1087420160,1087440895,US +1087440896,1087442943,PR +1087442944,1087444223,US +1087444224,1087444479,CY +1087444480,1087495519,US 1087495520,1087495535,TW 1087495536,1087496703,US 1087496704,1087496959,CA @@ -8355,39 +12227,260 @@ 1087554752,1087554759,IL 1087554760,1087557631,US 1087557632,1087557887,NO -1087557888,1087715327,US +1087557888,1087686655,US +1087686656,1087686911,PR +1087686912,1087715327,US 1087715328,1087717375,PA 1087717376,1087758335,US 1087758336,1087766527,PR 1087766528,1087862783,US 1087862784,1087864831,PA -1087864832,1088684031,US +1087864832,1087898879,US +1087898880,1087898887,PR +1087898888,1087899391,US +1087899392,1087899399,PR +1087899400,1087910447,US +1087910448,1087910455,PR +1087910456,1087915079,US +1087915080,1087915087,PR +1087915088,1087915519,US +1087915520,1087915535,PR +1087915536,1087915583,US +1087915584,1087915591,PR +1087915592,1087915599,US +1087915600,1087915607,PR +1087915608,1087918423,US +1087918424,1087918431,PR +1087918432,1087918503,US +1087918504,1087918519,PR +1087918520,1087920295,US +1087920296,1087920327,PR +1087920328,1087920335,US +1087920336,1087920343,PR +1087920344,1087920431,US +1087920432,1087920439,PR +1087920440,1087933103,US +1087933104,1087933111,PR +1087933112,1087935103,US +1087935104,1087935111,PR +1087935112,1087935215,US +1087935216,1087935223,PR +1087935224,1087948391,US +1087948392,1087948399,PR +1087948400,1087948639,US +1087948640,1087948647,PR +1087948648,1087948839,US +1087948840,1087948847,PR +1087948848,1087949735,US +1087949736,1087949743,PR +1087949744,1087950063,US +1087950064,1087950071,PR +1087950072,1087950111,US +1087950112,1087950119,PR +1087950120,1087955767,US +1087955768,1087955775,PR +1087955776,1087964431,US +1087964432,1087964455,PR +1087964456,1087964463,US +1087964464,1087964471,PR +1087964472,1087964575,US +1087964576,1087964583,PR +1087964584,1087964599,US +1087964600,1087964615,PR +1087964616,1087980759,US +1087980760,1087980783,PR +1087980784,1087991175,US +1087991176,1087991183,PR +1087991184,1087991207,US +1087991208,1087991215,PR +1087991216,1088012447,US +1088012448,1088012455,PR +1088012456,1088012727,US +1088012728,1088012735,PR +1088012736,1088012759,US +1088012760,1088012775,PR +1088012776,1088014583,US +1088014584,1088014591,PR +1088014592,1088020031,US +1088020032,1088020039,PR +1088020040,1088020359,US +1088020360,1088020367,PR +1088020368,1088030663,US +1088030664,1088030671,PR +1088030672,1088031839,US +1088031840,1088031847,PR +1088031848,1088031943,US +1088031944,1088031951,PR +1088031952,1088091583,US +1088091584,1088091591,PR +1088091592,1088093727,US +1088093728,1088093735,PR +1088093736,1088100967,US +1088100968,1088100975,PR +1088100976,1088101023,US +1088101024,1088101031,PR +1088101032,1088108351,US +1088108352,1088108359,PR +1088108360,1088117199,US +1088117200,1088117207,PR +1088117208,1088120527,US +1088120528,1088120535,PR +1088120536,1088146151,US +1088146152,1088146159,PR +1088146160,1088147815,US +1088147816,1088147823,PR +1088147824,1088152215,US +1088152216,1088152223,PR +1088152224,1088424464,US +1088424465,1088424478,AU +1088424479,1088450704,US +1088450705,1088450718,ES +1088450719,1088451760,US +1088451761,1088451774,CA +1088451775,1088452112,US +1088452113,1088452126,CA +1088452127,1088452400,US +1088452401,1088452414,VE +1088452415,1088453024,US +1088453025,1088453038,JP +1088453039,1088453104,US +1088453105,1088453118,CL +1088453119,1088453488,US +1088453489,1088453502,IE +1088453503,1088453536,US +1088453537,1088453550,CL +1088453551,1088453808,US +1088453809,1088453822,AR +1088453823,1088453840,US +1088453841,1088453854,LB +1088453855,1088453856,US +1088453857,1088453870,CN +1088453871,1088454448,US +1088454449,1088454462,LB +1088454463,1088473375,US +1088473376,1088473391,ES +1088473392,1088473695,US +1088473696,1088473711,IE +1088473712,1088518415,US +1088518416,1088518431,HK +1088518432,1088518479,US +1088518480,1088518495,TH +1088518496,1088518927,US +1088518928,1088519007,UA +1088519008,1088522671,US +1088522672,1088522687,CA +1088522688,1088522735,US +1088522736,1088522751,TH +1088522752,1088523199,US +1088523200,1088523215,TH +1088523216,1088523439,US +1088523440,1088523487,JP +1088523488,1088523807,US +1088523808,1088523823,PR +1088523824,1088524271,US +1088524272,1088524286,IN +1088524287,1088684031,US 1088684032,1088946175,CA -1088946176,1089105919,US -1089110016,1089154915,US +1088946176,1088949919,US +1088949920,1088949935,CA +1088949936,1089154847,US +1089154848,1089154855,VE +1089154856,1089154876,US +1089154877,1089154884,AU +1089154885,1089154915,US 1089154916,1089154932,AU -1089154933,1089167359,US +1089154933,1089154968,US +1089154969,1089154977,IN +1089154978,1089155011,US +1089155012,1089155031,TR +1089155032,1089156607,US +1089156608,1089156863,CA +1089156864,1089167359,US 1089167360,1089171455,CA -1089171456,1089191935,US -1089191936,1089200127,CA -1089200128,1089306623,US +1089171456,1089171967,A2 +1089171968,1089172735,US +1089172736,1089172839,A2 +1089172840,1089172863,US +1089172864,1089172879,A2 +1089172880,1089172887,US +1089172888,1089172895,A2 +1089172896,1089172927,US +1089172928,1089172983,A2 +1089172984,1089172991,US +1089172992,1089173119,NL +1089173120,1089173247,A2 +1089173248,1089174015,US +1089174016,1089174159,A2 +1089174160,1089174167,US +1089174168,1089174175,A2 +1089174176,1089174199,US +1089174200,1089174207,A2 +1089174208,1089174215,US +1089174216,1089175551,A2 +1089175552,1089191935,US +1089191936,1089192591,CA +1089192592,1089192599,IT +1089192600,1089196623,CA +1089196624,1089196639,US +1089196640,1089197311,CA +1089197312,1089197567,AU +1089197568,1089200127,CA +1089200128,1089200751,US +1089200752,1089200783,CA +1089200784,1089203439,US +1089203440,1089203447,AU +1089203448,1089204575,US +1089204576,1089204607,CA +1089204608,1089210623,US +1089210624,1089210879,GB +1089210880,1089211391,BR +1089211392,1089219839,US +1089219840,1089220095,JP +1089220096,1089233919,US +1089233920,1089234175,JP +1089234176,1089235455,US +1089235456,1089235967,GB +1089235968,1089249279,US +1089249280,1089249535,IE +1089249536,1089263615,US +1089263616,1089263871,GB +1089263872,1089264127,US +1089264128,1089264639,FR +1089264640,1089265663,US +1089265664,1089265919,GB +1089265920,1089266431,US +1089266432,1089266943,GB +1089266944,1089306623,US 1089306624,1089339391,PR -1089339392,1089372159,US -1089380352,1089482927,US +1089339392,1089393295,US +1089393296,1089393407,CA +1089393408,1089466975,US +1089466976,1089466991,CA +1089466992,1089482927,US 1089482928,1089482935,CA -1089482936,1089488463,US +1089482936,1089486591,US +1089486592,1089486607,CA +1089486608,1089488463,US 1089488464,1089488479,JP -1089488480,1089493631,US +1089488480,1089492351,US +1089492352,1089492415,CA +1089492416,1089493631,US 1089493632,1089493647,CA 1089493648,1089503871,US 1089503872,1089503879,CA -1089503880,1089526783,US +1089503880,1089507159,US +1089507160,1089507167,CA +1089507168,1089526783,US 1089526784,1089527039,VE 1089527040,1089552383,US 1089552384,1089552391,AU 1089552392,1089557551,US 1089557552,1089557559,CA -1089557560,1089576623,US +1089557560,1089568351,US +1089568352,1089568359,CA +1089568360,1089574319,US +1089574320,1089574327,CA +1089574328,1089576623,US 1089576624,1089576631,CA 1089576632,1089579215,US 1089579216,1089579223,VI @@ -8401,33 +12494,73 @@ 1089588000,1089588015,IN 1089588016,1089593615,US 1089593616,1089593623,CA -1089593624,1089631055,US +1089593624,1089595279,US +1089595280,1089595287,CA +1089595288,1089596543,US +1089596544,1089596575,CA +1089596576,1089598975,US +1089598976,1089599231,HK +1089599232,1089626399,US +1089626400,1089626407,CA +1089626408,1089626415,US +1089626416,1089626431,CA +1089626432,1089631055,US 1089631056,1089631071,CA 1089631072,1089644815,US 1089644816,1089644831,GB -1089644832,1089672263,US -1089672264,1089672271,CA -1089672272,1089674367,US -1089674368,1089674383,CA -1089674384,1089721503,US +1089644832,1089696063,US +1089696064,1089696071,GB +1089696072,1089703455,US +1089703456,1089703487,CA +1089703488,1089720959,US +1089720960,1089720967,CA +1089720968,1089721023,US +1089721024,1089721087,CA +1089721088,1089721503,US 1089721504,1089721519,CA 1089721520,1089721727,US 1089721728,1089721791,CA 1089721792,1089723823,US 1089723824,1089723831,CA -1089723832,1089798143,US -1089798144,1089802239,ZA -1089802240,1089961983,US +1089723832,1089746999,US +1089747000,1089747007,MU +1089747008,1089881599,US +1089881600,1089882111,GB +1089882112,1089882623,US +1089882624,1089883135,GB +1089883136,1089887231,US +1089887232,1089887743,GB +1089887744,1089961983,US 1089961984,1089970175,CA 1089970176,1089974271,PR -1089978368,1090125823,US +1089974272,1090146303,US +1090146304,1090150399,CA +1090150400,1090154495,US 1090158592,1090207743,US -1090207744,1090220031,CA -1090220032,1090355199,US -1090355200,1090363391,CA +1090207744,1090215935,CA +1090215936,1090355199,US +1090355200,1090356327,CA +1090356328,1090356335,US +1090356336,1090357535,CA +1090357536,1090357567,US +1090357568,1090357663,CA +1090357664,1090357679,US +1090357680,1090357703,CA +1090357704,1090357711,US +1090357712,1090357727,CA +1090357728,1090357735,US +1090357736,1090363391,CA 1090363392,1090387967,US -1090387968,1090396159,CA -1090396160,1090424831,US +1090387968,1090391300,CA +1090391301,1090391302,US +1090391303,1090391359,CA +1090391360,1090391360,US +1090391361,1090396159,CA +1090396160,1090424095,US +1090424096,1090424111,FI +1090424112,1090424287,US +1090424288,1090424303,FI +1090424304,1090424831,US 1090424832,1090428927,CA 1090428928,1090445311,US 1090445312,1090447359,CA @@ -8435,109 +12568,967 @@ 1090447488,1090448127,CA 1090448128,1090448255,US 1090448256,1090453503,CA -1090453504,1090497903,US +1090453504,1090495487,US +1090495488,1090495743,NO +1090495744,1090497903,US 1090497904,1090497919,AU -1090497920,1091960831,US +1090497920,1090499583,US +1090499584,1090499839,NO +1090499840,1091444735,US +1091444736,1091445247,A2 +1091445248,1091683357,US +1091683358,1091683367,GB +1091683368,1091683387,US +1091683388,1091683397,LB +1091683398,1091683407,US +1091683408,1091683417,BE +1091683418,1091683437,US +1091683438,1091683447,QA +1091683448,1091683593,US +1091683594,1091683603,CA +1091683604,1091683613,US +1091683614,1091683653,CA +1091683654,1091683869,US +1091683870,1091683889,AU +1091683890,1091683909,US +1091683910,1091683919,CR +1091683920,1091684879,US +1091684880,1091684895,CA +1091684896,1091685695,US +1091685696,1091685711,QA +1091685712,1091685759,US +1091685760,1091685887,QA +1091685888,1091687167,US +1091687168,1091687183,CA +1091687184,1091687359,US +1091687360,1091687391,CA +1091687392,1091687711,US +1091687712,1091687727,ES +1091687728,1091687743,CO +1091687744,1091687807,US +1091687808,1091687839,CR +1091687840,1091687871,ES +1091687872,1091689255,US +1091689256,1091689265,GB +1091689266,1091689295,US +1091689296,1091689305,NZ +1091689306,1091689335,US +1091689336,1091689345,SI +1091689346,1091690495,US +1091690496,1091690511,CA +1091690512,1091690527,GB +1091690528,1091690751,US +1091690752,1091690815,GB +1091690816,1091691327,US +1091691328,1091691359,SA +1091691360,1091692347,US +1091692348,1091692357,SY +1091692358,1091692387,US +1091692388,1091692397,GB +1091692398,1091692407,NL +1091692408,1091692447,US +1091692448,1091692457,GB +1091692458,1091692573,US +1091692574,1091692583,BE +1091692584,1091692643,US +1091692644,1091692653,PH +1091692654,1091692703,US +1091692704,1091692713,SI +1091692714,1091692723,US +1091692724,1091692733,CA +1091692734,1091693095,US +1091693096,1091693135,NZ +1091693136,1091694447,US +1091694448,1091694463,BG +1091694464,1091694877,US +1091694878,1091694887,DE +1091694888,1091694997,US +1091694998,1091695007,CR +1091695008,1091695017,CA +1091695018,1091695057,US +1091695058,1091695067,CR +1091695068,1091695123,US +1091695124,1091695163,CA +1091695164,1091695213,US +1091695214,1091695223,CA +1091695224,1091695283,US +1091695284,1091695293,CA +1091695294,1091695487,US +1091695488,1091695551,SA +1091695552,1091797263,US +1091797264,1091797279,IT +1091797280,1091797855,US +1091797856,1091797871,IT +1091797872,1091797999,US +1091798000,1091798015,DE +1091798016,1091798639,US +1091798640,1091798647,CN +1091798648,1091798783,US +1091798784,1091799039,CN +1091799040,1091799719,US +1091799720,1091799727,SG +1091799728,1091800319,US +1091800320,1091800327,JP +1091800328,1091802111,US +1091802112,1091802367,CA +1091802368,1091803135,US +1091803136,1091803391,CN +1091803392,1091803711,US +1091803712,1091803775,TH +1091803776,1091803871,US +1091803872,1091803903,NL +1091803904,1091804263,US +1091804264,1091804271,BM +1091804272,1091806719,US +1091806720,1091806847,IT +1091806848,1091807087,US +1091807088,1091807095,MY +1091807096,1091807231,US +1091807232,1091807487,CA +1091807488,1091807999,US +1091808000,1091808511,CA +1091808512,1091809375,US +1091809376,1091809391,GB +1091809392,1091809407,US +1091809408,1091809439,JP +1091809440,1091811839,US +1091811840,1091812095,IT +1091812096,1091812351,US +1091812352,1091812607,CN +1091812608,1091960831,US 1091960832,1092026367,CA -1092026368,1092075519,US +1092026368,1092059424,US +1092059425,1092059456,DO +1092059457,1092066589,US +1092066590,1092066597,KN +1092066598,1092067042,US +1092067043,1092067050,KN +1092067051,1092075519,US 1092075520,1092091903,PR -1092091904,1092878335,US -1092911104,1093017599,US +1092091904,1092940607,US +1092940608,1092940639,AU +1092940640,1093017599,US 1093017600,1093021695,CA 1093021696,1093025791,US 1093025792,1093033983,CA -1093033984,1093058559,US -1093058560,1093059071,PR -1093059072,1093059583,US -1093059584,1093066751,PR +1093033984,1093052015,US +1093052016,1093052023,CA +1093052024,1093052111,US +1093052112,1093052127,AR +1093052128,1093052447,US +1093052448,1093052463,SA +1093052464,1093052479,GB +1093052480,1093052895,US +1093052896,1093052911,AR +1093052912,1093054079,US +1093054080,1093054095,GB +1093054096,1093054127,US +1093054128,1093054143,FR +1093054144,1093054175,US +1093054176,1093054191,CA +1093054192,1093055487,US +1093055488,1093055871,AR +1093055872,1093056095,US +1093056096,1093056127,SY +1093056128,1093056143,US +1093056144,1093056159,SY +1093056160,1093056167,US +1093056168,1093056175,RO +1093056176,1093056319,US +1093056320,1093056335,CA +1093056336,1093056447,US +1093056448,1093056463,FR +1093056464,1093056479,CA +1093056480,1093056511,US +1093056512,1093056519,GB +1093056520,1093056591,US +1093056592,1093056607,CA +1093056608,1093056959,US +1093056960,1093056975,SA +1093056976,1093057103,US +1093057104,1093057119,JP +1093057120,1093057263,US +1093057264,1093057279,IT +1093057280,1093057295,US +1093057296,1093057343,CY +1093057344,1093057391,US +1093057392,1093057407,RO +1093057408,1093057423,PH +1093057424,1093057487,US +1093057488,1093057503,CY +1093057504,1093058095,US +1093058096,1093058111,SY +1093058112,1093058271,US +1093058272,1093058287,SY +1093058288,1093058559,US +1093058560,1093063167,PR +1093063168,1093063679,DO +1093063680,1093066751,PR 1093066752,1093074943,US 1093074944,1093091327,CA -1093091328,1093107967,US -1093107968,1093108223,CA -1093108224,1093108735,US -1093108736,1093109247,CA -1093109248,1093109503,US -1093109504,1093109759,CA -1093109760,1093110015,US -1093110016,1093110271,CA -1093110272,1093111295,US -1093111296,1093111551,CA -1093111552,1093111959,US +1093091328,1093107711,US +1093107712,1093107823,CA +1093107824,1093107839,US +1093107840,1093109367,CA +1093109368,1093109375,US +1093109376,1093109879,CA +1093109880,1093109887,US +1093109888,1093109967,CA +1093109968,1093109983,US +1093109984,1093110271,CA +1093110272,1093110527,US +1093110528,1093110783,CA +1093110784,1093110815,US +1093110816,1093110831,CA +1093110832,1093110911,US +1093110912,1093110927,CA +1093110928,1093110935,US +1093110936,1093111711,CA +1093111712,1093111727,US +1093111728,1093111743,CA +1093111744,1093111759,US +1093111760,1093111871,CA +1093111872,1093111903,US +1093111904,1093111935,CA +1093111936,1093111951,US +1093111952,1093111959,CA 1093111960,1093111967,BV -1093111968,1093114687,US -1093114688,1093114703,CA -1093114704,1093114719,US -1093114720,1093114751,CA -1093114752,1093114879,US -1093114880,1093115135,CA -1093115136,1093115391,US -1093115392,1093115647,CA -1093115648,1093115903,US -1093115904,1093116415,CA -1093116416,1093116735,US -1093116736,1093116767,CA -1093116768,1093117631,US -1093117632,1093117647,BV -1093117648,1093117951,US -1093117952,1093118207,CA -1093118208,1093119999,US -1093120000,1093120255,CA -1093120256,1093120511,US +1093111968,1093112383,CA +1093112384,1093112415,US +1093112416,1093112431,CA +1093112432,1093112479,US +1093112480,1093112527,CA +1093112528,1093114623,US +1093114624,1093114679,CA +1093114680,1093114703,US +1093114704,1093114711,CA +1093114712,1093114719,VG +1093114720,1093114823,CA +1093114824,1093114843,US +1093114844,1093114847,CA +1093114848,1093114863,US +1093114864,1093115839,CA +1093115840,1093115903,US +1093115904,1093116927,CA +1093116928,1093117439,US +1093117440,1093117455,CA +1093117456,1093117503,US +1093117504,1093117519,CA +1093117520,1093117527,US +1093117528,1093117567,CA +1093117568,1093117599,US +1093117600,1093117607,CA +1093117608,1093117615,US +1093117616,1093117631,CA +1093117632,1093117647,VG +1093117648,1093118207,CA +1093118208,1093118479,US +1093118480,1093118495,CA +1093118496,1093118527,US +1093118528,1093118531,CA +1093118532,1093118591,US +1093118592,1093118687,CA +1093118688,1093118983,US +1093118984,1093118991,CA +1093118992,1093118993,US +1093118994,1093119006,CA +1093119007,1093119015,US +1093119016,1093119023,CA +1093119024,1093119039,US +1093119040,1093119135,CA +1093119136,1093119167,US +1093119168,1093119311,CA +1093119312,1093119359,US +1093119360,1093119663,CA +1093119664,1093119679,US +1093119680,1093119695,CA +1093119696,1093119743,US +1093119744,1093119807,CA +1093119808,1093119823,US +1093119824,1093119831,CA +1093119832,1093119839,US +1093119840,1093119935,CA +1093119936,1093119999,US +1093120000,1093120383,CA +1093120384,1093120399,US +1093120400,1093120415,BV +1093120416,1093120511,CA 1093120512,1093120767,GB -1093120768,1093123071,US -1093123072,1093123583,CA -1093123584,1093124607,US -1093124608,1093124863,CA -1093124864,1093126143,US +1093120768,1093120911,US +1093120912,1093120943,CA +1093120944,1093120959,US +1093120960,1093122047,CA +1093122048,1093122303,US +1093122304,1093122447,CA +1093122448,1093122463,US +1093122464,1093122495,CA +1093122496,1093122535,US +1093122536,1093122543,CA +1093122544,1093122551,US +1093122552,1093122559,CA +1093122560,1093122591,US +1093122592,1093122655,CA +1093122656,1093122671,US +1093122672,1093122687,CA +1093122688,1093122727,US +1093122728,1093122767,CA +1093122768,1093122783,US +1093122784,1093122791,CA +1093122792,1093122799,US +1093122800,1093122807,CA +1093122808,1093122815,US +1093122816,1093123839,CA +1093123840,1093123903,US +1093123904,1093123935,AN +1093123936,1093123943,US +1093123944,1093123967,CA +1093123968,1093123983,US +1093123984,1093123999,VG +1093124000,1093124095,US +1093124096,1093124287,CA +1093124288,1093124351,US +1093124352,1093124559,CA +1093124560,1093124575,US +1093124576,1093125695,CA +1093125696,1093125719,US +1093125720,1093125735,CA +1093125736,1093125743,US +1093125744,1093125775,CA +1093125776,1093125871,US +1093125872,1093126015,CA +1093126016,1093126047,US +1093126048,1093126111,CA +1093126112,1093126134,US +1093126135,1093126142,CA +1093126143,1093126143,US 1093126144,1093126399,CA -1093126400,1093126911,US +1093126400,1093126431,VG +1093126432,1093126527,CA +1093126528,1093126543,US +1093126544,1093126591,CA +1093126592,1093126607,US +1093126608,1093126639,CA +1093126640,1093126801,US +1093126802,1093126809,CA +1093126810,1093126823,US +1093126824,1093126831,CA +1093126832,1093126911,US 1093126912,1093127167,CA -1093127168,1093128959,US -1093128960,1093129215,CA -1093129216,1093130751,US -1093130752,1093131007,CA -1093131008,1093131231,US -1093131232,1093131247,BV -1093131248,1093132543,US -1093132544,1093132799,CA -1093132800,1093133695,US -1093133696,1093133823,CA -1093133824,1093135359,US +1093127168,1093127191,US +1093127192,1093127199,CA +1093127200,1093127423,US +1093127424,1093127455,CA +1093127456,1093127551,US +1093127552,1093127615,CA +1093127616,1093127647,US +1093127648,1093127663,CA +1093127664,1093127775,US +1093127776,1093127791,CA +1093127792,1093128191,US +1093128192,1093128415,CA +1093128416,1093128447,US +1093128448,1093129215,CA +1093129216,1093130367,US +1093130368,1093130415,CA +1093130416,1093130495,US +1093130496,1093130623,CA +1093130624,1093130687,US +1093130688,1093131215,CA +1093131216,1093131231,US +1093131232,1093131247,VG +1093131248,1093131263,CA +1093131264,1093131391,US +1093131392,1093131487,CA +1093131488,1093131775,US +1093131776,1093132287,CA +1093132288,1093132351,US +1093132352,1093132799,CA +1093132800,1093133055,US +1093133056,1093133311,CA +1093133312,1093133407,US +1093133408,1093133439,CA +1093133440,1093133567,US +1093133568,1093134239,CA +1093134240,1093134255,US +1093134256,1093134263,CA +1093134264,1093134271,US +1093134272,1093134335,CA +1093134336,1093135359,US 1093135360,1093135615,CA -1093135616,1093139663,US -1093139664,1093139679,CA -1093139680,1093139711,US -1093139712,1093140223,CA -1093140224,1093693439,US +1093135616,1093135631,US +1093135632,1093135639,CA +1093135640,1093135647,US +1093135648,1093135871,CA +1093135872,1093136127,US +1093136128,1093136383,CA +1093136384,1093136895,US +1093136896,1093138431,CA +1093138432,1093138559,US +1093138560,1093138623,CA +1093138624,1093139455,US +1093139456,1093139583,CA +1093139584,1093139647,US +1093139648,1093139679,CA +1093139680,1093139695,US +1093139696,1093140223,CA +1093140224,1093338895,US +1093338896,1093338903,PR +1093338904,1093671591,US +1093671592,1093671599,UY +1093671600,1093697535,US 1093697536,1093699071,BB 1093699072,1093700607,GD 1093700608,1093701631,VC -1093701632,1093713919,BB +1093701632,1093708287,BB +1093708288,1093709311,LC +1093709312,1093716479,BB +1093716480,1093717759,GD +1093717760,1093719807,BB +1093719808,1093720319,LC +1093720320,1093721343,VG +1093721344,1093723391,BB +1093723392,1093723647,VC +1093723648,1093724415,BB +1093724416,1093725183,VC +1093725184,1093730303,BB 1093730304,1093730559,US 1093730560,1093730815,HK -1093730816,1093746687,US -1093763072,1093779455,US -1093795840,1093828607,US -1093861376,1093894143,US -1093926912,1094451199,US -1094467584,1094565887,US -1094565888,1094582271,CA -1094582272,1095408887,US +1093730816,1093737247,US +1093737248,1093737263,AE +1093737264,1093737423,US +1093737424,1093737431,GB +1093737432,1093740095,US +1093740096,1093740159,JP +1093740160,1093740167,US +1093740168,1093740191,CN +1093740192,1093740335,US +1093740336,1093740351,SG +1093740352,1093740415,JP +1093740416,1093741599,US +1093741600,1093741607,ES +1093741608,1093743103,US +1093743104,1093743359,HK +1093743360,1093743391,US +1093743392,1093743423,PH +1093743424,1093743487,JP +1093743488,1093743743,US +1093743744,1093743807,CA +1093743808,1093744639,US +1093744640,1093744895,CA +1093744896,1093746879,US +1093746880,1093746943,DE +1093746944,1093748799,US +1093748800,1093748863,CN +1093748864,1094319583,US +1094319584,1094319599,CA +1094319600,1094549687,US +1094549688,1094549695,CA +1094549696,1094549783,US +1094549784,1094549791,AU +1094549792,1094549799,US +1094549800,1094549807,CA +1094549808,1094549815,UZ +1094549816,1094549863,US +1094549864,1094549871,BD +1094549872,1094549935,US +1094549936,1094549943,CA +1094549944,1094549951,CY +1094549952,1094550215,US +1094550216,1094550223,MX +1094550224,1094550239,AU +1094550240,1094550247,BD +1094550248,1094550487,US +1094550488,1094550495,RO +1094550496,1094550607,US +1094550608,1094550615,BD +1094550616,1094550679,US +1094550680,1094550695,VE +1094550696,1094550799,US +1094550800,1094550807,NL +1094550808,1094550823,US +1094550824,1094550831,CA +1094550832,1094550847,US +1094550848,1094550855,IN +1094550856,1094550879,US +1094550880,1094550887,NZ +1094550888,1094550895,JP +1094550896,1094550911,UA +1094550912,1094550919,JM +1094550920,1094550967,US +1094550968,1094550975,JM +1094550976,1094550991,US +1094550992,1094550999,NL +1094551000,1094551207,US +1094551208,1094551215,GB +1094551216,1094551231,AU +1094551232,1094551455,US +1094551456,1094551471,SE +1094551472,1094551487,US +1094551488,1094551495,GB +1094551496,1094551535,US +1094551536,1094551551,AU +1094551552,1094551839,US +1094551840,1094551855,GB +1094551856,1094552191,US +1094552192,1094552199,GB +1094552200,1094552239,US +1094552240,1094552247,IN +1094552248,1094552287,US +1094552288,1094552311,NZ +1094552312,1094552319,US +1094552320,1094552335,IN +1094552336,1094552375,US +1094552376,1094552383,AE +1094552384,1094552527,US +1094552528,1094552543,CY +1094552544,1094552551,US +1094552552,1094552559,NL +1094552560,1094553855,US +1094553856,1094553863,GB +1094553864,1094553927,US +1094553928,1094553935,IN +1094553936,1094553975,US +1094553976,1094553983,NZ +1094553984,1094554879,US +1094554880,1094554887,LK +1094554888,1094554967,US +1094554968,1094554975,UZ +1094554976,1094556191,US +1094556192,1094556207,IN +1094556208,1094556703,US +1094556704,1094556719,CA +1094556720,1094556783,US +1094556784,1094556799,NZ +1094556800,1094557183,US +1094557184,1094557199,AU +1094557200,1094557271,US +1094557272,1094557279,CA +1094557280,1094557751,US +1094557752,1094557759,GB +1094557760,1094558463,US +1094558464,1094558471,JP +1094558472,1094558751,US +1094558752,1094558783,CA +1094558784,1094558975,US +1094558976,1094558991,BD +1094558992,1094559535,US +1094559536,1094559551,GB +1094559552,1094559623,US +1094559624,1094559631,CA +1094559632,1094559743,US +1094559744,1094559775,AU +1094559776,1094559807,US +1094559808,1094559903,AU +1094559904,1094559919,US +1094559920,1094559935,AU +1094559936,1094560063,US +1094560064,1094560103,FR +1094560104,1094560255,US +1094560256,1094560263,IN +1094560264,1094560279,US +1094560280,1094560287,GB +1094560288,1094560319,US +1094560320,1094560335,IN +1094560336,1094560447,US +1094560448,1094560455,AU +1094560456,1094560831,US +1094560832,1094560863,BD +1094560864,1094560895,US +1094560896,1094561023,CA +1094561024,1094561047,US +1094561048,1094561055,CA +1094561056,1094561311,US +1094561312,1094561319,ES +1094561320,1094561327,CA +1094561328,1094561399,US +1094561400,1094561407,IL +1094561408,1094561535,US +1094561536,1094561639,HK +1094561640,1094561831,US +1094561832,1094561839,AU +1094561840,1094561855,US +1094561856,1094561919,AU +1094561920,1094562431,US +1094562432,1094562455,TH +1094562456,1094562687,US +1094562688,1094562719,CR +1094562720,1094562799,US +1094562800,1094562807,CA +1094562808,1094562879,US +1094562880,1094562895,MX +1094562896,1094562911,US +1094562912,1094562927,DK +1094562928,1094563743,US +1094563744,1094563775,BD +1094563776,1094563887,US +1094563888,1094563895,MX +1094563896,1094564671,US +1094564672,1094564703,BD +1094564704,1094565119,US +1094565120,1094565375,CA +1094565376,1094565695,US +1094565696,1094565727,BD +1094565728,1094565743,US +1094565744,1094565759,CY +1094565760,1094565807,US +1094565808,1094565815,RU +1094565816,1094565887,US +1094565888,1094568046,CA +1094568047,1094568061,MO +1094568062,1094582271,CA +1094582272,1094723103,US +1094723104,1094723111,PR +1094723112,1094727431,US +1094727432,1094727439,PR +1094727440,1094727639,US +1094727640,1094727647,PR +1094727648,1094749503,US +1094749504,1094749511,PR +1094749512,1094759607,US +1094759608,1094759615,PR +1094759616,1094764519,US +1094764520,1094764527,PR +1094764528,1094797743,US +1094797744,1094797751,PR +1094797752,1094797815,US +1094797816,1094797823,PR +1094797824,1094801975,US +1094801976,1094801983,PR +1094801984,1094802127,US +1094802128,1094802135,PR +1094802136,1094807487,US +1094807488,1094807495,PR +1094807496,1094810135,US +1094810136,1094810143,PR +1094810144,1094811023,US +1094811024,1094811031,PR +1094811032,1094811071,US +1094811072,1094811079,PR +1094811080,1094822247,US +1094822248,1094822255,PR +1094822256,1094822327,US +1094822328,1094822335,PR +1094822336,1094822559,US +1094822560,1094822567,PR +1094822568,1094831479,US +1094831480,1094831487,PR +1094831488,1094833975,US +1094833976,1094833983,PR +1094833984,1094839783,US +1094839784,1094839791,PR +1094839792,1094839863,US +1094839864,1094839871,PR +1094839872,1094841111,US +1094841112,1094841119,PR +1094841120,1094841191,US +1094841192,1094841199,PR +1094841200,1094843271,US +1094843272,1094843279,PR +1094843280,1094846063,US +1094846064,1094846071,PR +1094846072,1094850735,US +1094850736,1094850743,PR +1094850744,1094857095,US +1094857096,1094857103,PR +1094857104,1094861183,US +1094861184,1094861191,PR +1094861192,1094861791,US +1094861792,1094861799,PR +1094861800,1094869095,US +1094869096,1094869103,PR +1094869104,1094874215,US +1094874216,1094874223,PR +1094874224,1094878639,US +1094878640,1094878647,PR +1094878648,1094879959,US +1094879960,1094879967,PR +1094879968,1094880455,US +1094880456,1094880463,PR +1094880464,1094881287,US +1094881288,1094881295,PR +1094881296,1094881303,US +1094881304,1094881311,PR +1094881312,1094886191,US +1094886192,1094886199,PR +1094886200,1094886303,US +1094886304,1094886311,PR +1094886312,1094889087,US +1094889088,1094889095,PR +1094889096,1094892255,US +1094892256,1094892263,PR +1094892264,1094893127,US +1094893128,1094893135,PR +1094893136,1094893287,US +1094893288,1094893295,PR +1094893296,1094898847,US +1094898848,1094898855,PR +1094898856,1094901983,US +1094901984,1094901999,PR +1094902000,1094902007,US +1094902008,1094902015,PR +1094902016,1094904679,US +1094904680,1094904687,PR +1094904688,1094909871,US +1094909872,1094909879,PR +1094909880,1094909983,US +1094909984,1094909991,PR +1094909992,1094911023,US +1094911024,1094911031,PR +1094911032,1094912143,US +1094912144,1094912151,PR +1094912152,1094912239,US +1094912240,1094912247,PR +1094912248,1094912775,US +1094912776,1094912783,PR +1094912784,1094913039,US +1094913040,1094913047,PR +1094913048,1094913159,US +1094913160,1094913167,PR +1094913168,1094917439,US +1094917440,1094917447,PR +1094917448,1094917671,US +1094917672,1094917687,PR +1094917688,1094918327,US +1094918328,1094918335,PR +1094918336,1094919783,US +1094919784,1094919791,PR +1094919792,1094919831,US +1094919832,1094919839,PR +1094919840,1094921751,US +1094921752,1094921759,PR +1094921760,1094921799,US +1094921800,1094921807,PR +1094921808,1094924183,US +1094924184,1094924191,PR +1094924192,1094926399,US +1094926400,1094926407,PR +1094926408,1094926527,US +1094926528,1094926535,PR +1094926536,1094926743,US +1094926744,1094926751,PR +1094926752,1094928727,US +1094928728,1094928735,PR +1094928736,1094933199,US +1094933200,1094933207,PR +1094933208,1094933447,US +1094933448,1094933455,PR +1094933456,1094934639,US +1094934640,1094934647,PR +1094934648,1094934703,US +1094934704,1094934711,PR +1094934712,1094934975,US +1094934976,1094934991,PR +1094934992,1094935063,US +1094935064,1094935071,PR +1094935072,1094935127,US +1094935128,1094935135,PR +1094935136,1094935359,US +1094935360,1094935367,PR +1094935368,1094935495,US +1094935496,1094935503,PR +1094935504,1094936735,US +1094936736,1094936743,PR +1094936744,1094936847,US +1094936848,1094936855,PR +1094936856,1094949487,US +1094949488,1094949495,PR +1094949496,1094950927,US +1094950928,1094950935,PR +1094950936,1094950959,US +1094950960,1094950967,PR +1094950968,1094950975,US +1094950976,1094950983,PR +1094950984,1094951151,US +1094951152,1094951159,PR +1094951160,1094960239,US +1094960240,1094960247,PR +1094960248,1094978159,US +1094978160,1094978167,PR +1094978168,1094984271,US +1094984272,1094984279,PR +1094984280,1094984359,US +1094984360,1094984367,PR +1094984368,1094984487,US +1094984488,1094984503,PR +1094984504,1094985167,US +1094985168,1094985175,PR +1094985176,1094985423,US +1094985424,1094985431,PR +1094985432,1094985655,US +1094985656,1094985663,PR +1094985664,1094985927,US +1094985928,1094985935,PR +1094985936,1095007263,US +1095007264,1095007295,PR +1095007296,1095017535,US +1095017536,1095017543,PR +1095017544,1095017807,US +1095017808,1095017815,PR +1095017816,1095018311,US +1095018312,1095018319,PR +1095018320,1095018463,US +1095018464,1095018471,PR +1095018472,1095035271,US +1095035272,1095035279,PR +1095035280,1095038071,US +1095038072,1095038079,PR +1095038080,1095038199,US +1095038200,1095038207,PR +1095038208,1095038495,US +1095038496,1095038503,PR +1095038504,1095044999,US +1095045000,1095045007,PR +1095045008,1095045727,US +1095045728,1095045735,PR +1095045736,1095045935,US +1095045936,1095045943,PR +1095045944,1095045951,US +1095045952,1095045959,PR +1095045960,1095046887,US +1095046888,1095046895,PR +1095046896,1095048463,US +1095048464,1095048471,PR +1095048472,1095056655,US +1095056656,1095056663,PR +1095056664,1095057375,US +1095057376,1095057383,PR +1095057384,1095067695,US +1095067696,1095067703,PR +1095067704,1095068351,US +1095068352,1095068359,PR +1095068360,1095068439,US +1095068440,1095068447,PR +1095068448,1095068455,US +1095068456,1095068463,PR +1095068464,1095069311,US +1095069312,1095069319,PR +1095069320,1095069591,US +1095069592,1095069599,PR +1095069600,1095072767,US +1095072768,1095072775,PR +1095072776,1095073047,US +1095073048,1095073055,PR +1095073056,1095075551,US +1095075552,1095075559,PR +1095075560,1095078703,US +1095078704,1095078711,PR +1095078712,1095080975,US +1095080976,1095080983,PR +1095080984,1095081295,US +1095081296,1095081303,PR +1095081304,1095081439,US +1095081440,1095081447,PR +1095081448,1095084535,US +1095084536,1095084543,PR +1095084544,1095085047,US +1095085048,1095085055,PR +1095085056,1095087215,US +1095087216,1095087223,PR +1095087224,1095087287,US +1095087288,1095087295,PR +1095087296,1095087703,US +1095087704,1095087711,PR +1095087712,1095087743,US +1095087744,1095087751,PR +1095087752,1095088367,US +1095088368,1095088375,PR +1095088376,1095088399,US +1095088400,1095088407,PR +1095088408,1095089615,US +1095089616,1095089623,PR +1095089624,1095089839,US +1095089840,1095089847,PR +1095089848,1095090407,US +1095090408,1095090415,PR +1095090416,1095092879,US +1095092880,1095092887,PR +1095092888,1095093151,US +1095093152,1095093159,PR +1095093160,1095102879,US +1095102880,1095102887,PR +1095102888,1095103207,US +1095103208,1095103215,PR +1095103216,1095103327,US +1095103328,1095103335,PR +1095103336,1095105823,US +1095105824,1095105831,PR +1095105832,1095106183,US +1095106184,1095106191,PR +1095106192,1095106199,US +1095106200,1095106207,PR +1095106208,1095106575,US +1095106576,1095106583,PR +1095106584,1095107079,US +1095107080,1095107087,PR +1095107088,1095117535,US +1095117536,1095117543,PR +1095117544,1095122431,US +1095122432,1095122439,PR +1095122440,1095122527,US +1095122528,1095122535,PR +1095122536,1095125071,US +1095125072,1095125079,PR +1095125080,1095125383,US +1095125384,1095125391,PR +1095125392,1095127447,US +1095127448,1095127455,PR +1095127456,1095127967,US +1095127968,1095127983,PR +1095127984,1095129807,US +1095129808,1095129815,PR +1095129816,1095138607,US +1095138608,1095138615,PR +1095138616,1095139927,US +1095139928,1095139935,PR +1095139936,1095142143,US +1095142144,1095142151,PR +1095142152,1095156607,US +1095156608,1095156615,PR +1095156616,1095160239,US +1095160240,1095160247,PR +1095160248,1095160927,US +1095160928,1095160935,PR +1095160936,1095187919,US +1095187920,1095187927,PR +1095187928,1095188359,US +1095188360,1095188367,PR +1095188368,1095190823,US +1095190824,1095190831,PR +1095190832,1095197495,US +1095197496,1095197503,PR +1095197504,1095207935,US +1095207936,1095207951,PR +1095207952,1095221455,US +1095221456,1095221463,PR +1095221464,1095222223,US +1095222224,1095222231,PR +1095222232,1095236551,US +1095236552,1095236559,PR +1095236560,1095408887,US 1095408888,1095408895,SE 1095408896,1095450623,US 1095450624,1095467007,BS -1095467008,1095495679,US -1095499776,1095627775,US +1095467008,1095627775,US 1095627776,1095628287,CA -1095628288,1096278015,US +1095628288,1096224919,US +1096224920,1096224927,CO +1096224928,1096278015,US 1096278016,1096286207,CA -1096286208,1096548351,US +1096286208,1096290879,US +1096290880,1096290943,A2 +1096290944,1096351231,US +1096351232,1096351743,A2 +1096351744,1096548351,US 1096548352,1096810495,CA 1096810496,1096884223,US 1096884224,1096888319,CA -1096892416,1096925183,US +1096888320,1096925183,US 1096925184,1096941567,CA -1096941568,1096952455,US +1096941568,1096942679,US +1096942680,1096942687,IE +1096942688,1096950551,US +1096950552,1096950559,CA +1096950560,1096952455,US 1096952456,1096952463,GB 1096952464,1096952519,US 1096952520,1096952527,GB @@ -8545,7 +13536,13 @@ 1096956464,1096956471,GB 1096956472,1096956631,US 1096956632,1096956639,GB -1096956640,1096959599,US +1096956640,1096957247,US +1096957248,1096957255,CA +1096957256,1096957775,US +1096957776,1096957791,IE +1096957792,1096958791,US +1096958792,1096958799,IN +1096958800,1096959599,US 1096959600,1096959607,GB 1096959608,1096960767,US 1096960768,1096960895,GB @@ -8553,48 +13550,108 @@ 1096961024,1096961151,GB 1096961152,1096964119,US 1096964120,1096964127,GB -1096964128,1096968191,US +1096964128,1096964263,US +1096964264,1096964271,IN +1096964272,1096968127,US +1096968128,1096968159,CA +1096968160,1096968191,US 1096968192,1096968319,GB 1096968320,1096968447,US 1096968448,1096968575,GB -1096968576,1097058303,US +1096968576,1097057623,US +1097057624,1097057631,IT +1097057632,1097057655,US +1097057656,1097057663,NZ +1097057664,1097057727,US +1097057728,1097057735,NZ +1097057736,1097057743,IT +1097057744,1097058303,US 1097058304,1097058367,IT -1097058368,1097063663,US +1097058368,1097059391,US +1097059392,1097059399,PR +1097059400,1097060351,US +1097060352,1097060359,IT +1097060360,1097060367,AU +1097060368,1097060383,US +1097060384,1097060399,IT +1097060400,1097060463,US +1097060464,1097060471,IT +1097060472,1097063663,US 1097063664,1097063679,IT -1097063680,1097067519,US +1097063680,1097065151,US +1097065152,1097065167,CA +1097065168,1097067519,US 1097067520,1097068031,GB 1097068032,1097069055,US 1097069056,1097069311,CA 1097069312,1097727999,US -1097728000,1097736191,CA +1097728000,1097729151,CA +1097729152,1097729167,US +1097729168,1097730847,CA +1097730848,1097730855,US +1097730856,1097730919,CA +1097730920,1097730927,US +1097730928,1097731447,CA +1097731448,1097731455,GB +1097731456,1097736191,CA 1097736192,1097768959,US 1097768960,1097777151,CA 1097777152,1097798495,US 1097798496,1097798527,CA 1097798528,1097799167,US -1097799168,1097799423,CA -1097799424,1097830399,US +1097799168,1097799199,CA +1097799200,1097799231,US +1097799232,1097799423,CA +1097799424,1097799679,US +1097799680,1097799711,CA +1097799712,1097799775,US +1097799776,1097799871,CA +1097799872,1097800959,US +1097800960,1097800991,CY +1097800992,1097801183,US +1097801184,1097801215,DE +1097801216,1097830399,US 1097830400,1097834495,CA 1097834496,1097896191,US -1097896192,1097897215,VI +1097896192,1097896711,VI +1097896712,1097896719,US +1097896720,1097897215,VI 1097897216,1097947135,US -1097947136,1097949183,VI +1097947136,1097947615,VI +1097947616,1097947623,US +1097947624,1097948279,VI +1097948280,1097948287,US +1097948288,1097949183,VI 1097949184,1097951231,US 1097951232,1097953279,VI -1097953280,1098188047,US +1097953280,1098057375,US +1098057376,1098057407,CA +1098057408,1098188047,US 1098188048,1098188055,CA 1098188056,1098353967,US 1098353968,1098353983,CA -1098353984,1098891575,US -1098891576,1098891615,AU -1098891616,1098891623,US -1098891624,1098891639,AU -1098891640,1098891647,US -1098891648,1098891775,AU +1098353984,1098382143,US +1098382144,1098382175,CA +1098382176,1098397695,US +1098397696,1098399743,A2 +1098399744,1098891575,US +1098891576,1098891607,AU +1098891608,1098891623,US +1098891624,1098891631,AU +1098891632,1098891647,US +1098891648,1098891679,AU +1098891680,1098891695,US +1098891696,1098891711,AU +1098891712,1098891743,US +1098891744,1098891775,AU 1098891776,1098891871,US 1098891872,1098891887,AU 1098891888,1098891903,US -1098891904,1098892031,AU +1098891904,1098891935,AU +1098891936,1098891951,US +1098891952,1098891999,AU +1098892000,1098892015,US +1098892016,1098892031,AU 1098892032,1101041279,US 1101041280,1101041407,IN 1101041408,1101078455,US @@ -8605,37 +13662,57 @@ 1101118240,1101118271,GB 1101118272,1101121535,US 1101121536,1101121791,EC -1101121792,1101190655,US +1101121792,1101139967,US +1101139968,1101140223,PR +1101140224,1101177479,US +1101177480,1101177487,FR +1101177488,1101182975,US +1101182976,1101183487,YE +1101183488,1101190655,US 1101190656,1101191167,EC 1101191168,1101224959,US 1101224960,1101225215,EC -1101225216,1101267711,US +1101225216,1101263103,US +1101263104,1101263359,AN +1101263360,1101267711,US 1101267712,1101267967,CA -1101267968,1101304063,US +1101267968,1101289983,US +1101289984,1101290239,AN +1101290240,1101304063,US 1101304064,1101304319,EC 1101304320,1101304831,US 1101304832,1101305855,HN -1101305856,1101339887,US +1101305856,1101306047,US +1101306048,1101306079,PR +1101306080,1101339887,US 1101339888,1101339903,CA 1101339904,1101352959,US 1101352960,1101355007,HN 1101355008,1101357215,US 1101357216,1101357223,SE -1101357224,1101384415,US -1101384416,1101384447,CA -1101384448,1101385855,US +1101357224,1101385855,US 1101385856,1101385919,DK -1101385920,1101425919,US +1101385920,1101402031,US +1101402032,1101402047,PR +1101402048,1101425919,US 1101425920,1101426175,EC -1101426176,1101431679,US -1101431680,1101431807,AU -1101431808,1101445775,US +1101426176,1101440295,US +1101440296,1101440303,CA +1101440304,1101445775,US 1101445776,1101445791,CA 1101445792,1101461759,US 1101461760,1101462015,AN -1101462016,1101492623,US +1101462016,1101469695,US +1101469696,1101471743,HN +1101471744,1101475839,US +1101475840,1101479935,CO +1101479936,1101484031,US +1101484032,1101488127,CO +1101488128,1101492623,US 1101492624,1101492639,BE -1101492640,1101523039,US +1101492640,1101521407,US +1101521408,1101521919,AS +1101521920,1101523039,US 1101523040,1101523071,GB 1101523072,1101542399,US 1101542400,1101542911,CO @@ -8647,11 +13724,15 @@ 1101619248,1101619255,NL 1101619256,1101625343,US 1101625344,1101625407,VI -1101625408,1101635327,US +1101625408,1101634191,US +1101634192,1101634207,VI +1101634208,1101635327,US 1101635328,1101635583,HN 1101635584,1101650431,US 1101650432,1101650943,HN -1101650944,1101668095,US +1101650944,1101662951,US +1101662952,1101662959,PR +1101662960,1101668095,US 1101668096,1101668351,EC 1101668352,1101676135,US 1101676136,1101676143,CA @@ -8661,19 +13742,23 @@ 1101681408,1101681663,NL 1101681664,1101685383,US 1101685384,1101685391,NL -1101685392,1101726407,US -1101726408,1101726415,CA -1101726416,1101732199,US +1101685392,1101705743,US +1101705744,1101705759,PR +1101705760,1101732199,US 1101732200,1101732207,CH 1101732208,1101750783,US 1101750784,1101751295,BM -1101751296,1101837311,US +1101751296,1101767679,US +1101767680,1101768191,AN +1101768192,1101791743,US +1101791744,1101791999,A2 +1101792000,1101792255,US +1101792256,1101792767,A2 +1101792768,1101837311,US 1101837312,1101837567,EC 1101837568,1101856767,US 1101856768,1101856775,DK -1101856776,1101857295,US -1101857296,1101857311,CA -1101857312,1101864223,US +1101856776,1101864223,US 1101864224,1101864255,BE 1101864256,1101869055,US 1101869056,1101869567,GH @@ -8689,50 +13774,231 @@ 1101952440,1101952447,CA 1101952448,1101971071,US 1101971072,1101971079,VI -1101971080,1102389247,US +1101971080,1101973023,US +1101973024,1101973039,PR +1101973040,1101981663,US +1101981664,1101981695,A2 +1101981696,1101983231,US +1101983232,1101983743,AN +1101983744,1102004223,US +1102004224,1102004479,IN +1102004480,1102005503,US +1102005504,1102005759,PK +1102005760,1102005823,BE +1102005824,1102006271,US +1102006272,1102006527,CA +1102006528,1102007599,US +1102007600,1102007615,AR +1102007616,1102007679,US +1102007680,1102007695,IN +1102007696,1102007791,US +1102007792,1102007807,VE +1102007808,1102008079,US +1102008080,1102008087,DO +1102008088,1102008095,US +1102008096,1102008103,CA +1102008104,1102008159,US +1102008160,1102008167,GB +1102008168,1102008639,US +1102008640,1102008671,BE +1102008672,1102008735,US +1102008736,1102008767,BE +1102008768,1102008831,US +1102008832,1102008863,BE +1102008864,1102010623,US +1102010624,1102010879,PK +1102010880,1102011647,US +1102011648,1102011663,VE +1102011664,1102011679,GB +1102011680,1102011743,US +1102011744,1102011759,TR +1102011760,1102011855,US +1102011856,1102011871,CR +1102011872,1102011887,US +1102011888,1102011903,AU +1102011904,1102012799,US +1102012800,1102012927,IN +1102012928,1102012975,US +1102012976,1102012991,RU +1102012992,1102013167,US +1102013168,1102013183,VE +1102013184,1102016255,US +1102016256,1102016287,AR +1102016288,1102019583,US +1102019584,1102019711,IN +1102019712,1102389247,US 1102389248,1102393343,CA -1102397440,1102446591,US +1102393344,1102446591,US 1102446592,1102448383,HN 1102448384,1102449151,US 1102449152,1102449407,SV 1102449408,1102454527,CR 1102454528,1102454783,HN -1102454784,1102479359,US -1102483456,1102512127,US +1102454784,1102488123,US +1102488124,1102488163,IN +1102488164,1102488284,US +1102488285,1102488315,IN +1102488316,1102494332,US +1102494333,1102494378,AU +1102494379,1102495519,US +1102495520,1102495527,AU +1102495528,1102512127,US 1102512128,1102516223,JM 1102516224,1103244799,US 1103244800,1103245055,EC 1103245056,1103474943,US 1103474944,1103475199,MH -1103475200,1103603711,US +1103475200,1103476223,US +1103476224,1103476255,CA +1103476256,1103548415,US +1103548416,1103550463,BS +1103550464,1103586335,US +1103586336,1103586351,DE +1103586352,1103603711,US 1103603712,1103605759,EC 1103605760,1103623167,US 1103623168,1103623679,CO -1103623680,1103766271,US +1103623680,1103639679,US +1103639680,1103639711,PR +1103639712,1103641687,US +1103641688,1103641695,PR +1103641696,1103670207,US +1103670208,1103670271,GB +1103670272,1103675647,US +1103675648,1103675711,AU +1103675712,1103675775,US +1103675776,1103675903,AU +1103675904,1103676159,US +1103676160,1103676175,AU +1103676176,1103678543,US +1103678544,1103678551,PH +1103678552,1103678655,US +1103678656,1103678719,PH +1103678720,1103678831,US +1103678832,1103678847,AU +1103678848,1103766271,US 1103766272,1103766527,PR -1103766528,1103930879,US +1103766528,1103769367,US +1103769368,1103769375,LU +1103769376,1103929055,US +1103929056,1103929063,MX +1103929064,1103930879,US 1103930880,1103931135,MX 1103931136,1103987967,US 1103987968,1103988223,BR -1103988224,1103996927,US +1103988224,1103992319,US +1103992320,1103992575,FI +1103992576,1103996927,US 1103996928,1103997439,EC -1103997440,1104166911,US +1103997440,1104003455,US +1104003456,1104003583,PH +1104003584,1104021759,US +1104021760,1104022015,PK +1104022016,1104030303,US +1104030304,1104030335,PR +1104030336,1104033439,US +1104033440,1104033471,GB +1104033472,1104081391,US +1104081392,1104081399,PR +1104081400,1104082423,US +1104082424,1104082431,UM +1104082432,1104086175,US +1104086176,1104086183,VI +1104086184,1104096407,US +1104096408,1104096415,DE +1104096416,1104166911,US 1104166912,1104168959,CO -1104168960,1104492287,US +1104168960,1104194823,US +1104194824,1104194831,PR +1104194832,1104232743,US +1104232744,1104232751,CA +1104232752,1104265215,US +1104265216,1104265727,PH +1104265728,1104399071,US +1104399072,1104399079,CA +1104399080,1104413695,US +1104413696,1104413711,CA +1104413712,1104414287,US +1104414288,1104414303,CA +1104414304,1104492287,US 1104492288,1104492543,PH 1104492544,1104510975,US 1104510976,1104511743,EC -1104511744,1104523263,US -1104523264,1104524287,CU -1104524288,1105099519,US +1104511744,1104559391,US +1104559392,1104559399,CA +1104559400,1104559487,US +1104559488,1104559503,CA +1104559504,1104616255,US +1104616256,1104616271,DE +1104616272,1104618271,US +1104618272,1104618303,CA +1104618304,1104630975,US +1104630976,1104631039,CA +1104631040,1104666751,US +1104666752,1104666767,CA +1104666768,1104708687,US +1104708688,1104708703,DE +1104708704,1104787487,US +1104787488,1104787519,GB +1104787520,1104839319,US +1104839320,1104839327,GB +1104839328,1104842751,US +1104842752,1104844799,PR +1104844800,1104870919,US +1104870920,1104870927,MX +1104870928,1104881087,US +1104881088,1104881151,PH +1104881152,1105034495,US +1105034496,1105034751,IT +1105034752,1105099519,US 1105099520,1105099775,EC -1105099776,1106469695,US +1105099776,1105140519,US +1105140520,1105140527,MX +1105140528,1105142463,US +1105142464,1105142471,MN +1105142472,1105143039,US +1105143040,1105143047,MN +1105143048,1105153215,US +1105153216,1105153279,PH +1105153280,1105188463,US +1105188464,1105188471,CA +1105188472,1106305663,US +1106305664,1106305671,CA +1106305672,1106306047,US +1106306048,1106306079,CA +1106306080,1106307967,US +1106307968,1106308031,CA +1106308032,1106320175,US +1106320176,1106320183,CA +1106320184,1106349599,US +1106349600,1106349607,UM +1106349608,1106428959,US +1106428960,1106428975,UM +1106428976,1106443623,US +1106443624,1106443631,CA +1106443632,1106469695,US 1106469696,1106469759,CO 1106469760,1106469887,US 1106469888,1106470911,BS 1106470912,1106475007,US 1106475008,1106475519,CO -1106475520,1106758655,US +1106475520,1106484351,US +1106484352,1106484415,PH +1106484416,1106495303,US +1106495304,1106495319,GB +1106495320,1106532887,US +1106532888,1106532895,TW +1106532896,1106547743,US +1106547744,1106547759,DK +1106547760,1106567423,US +1106567424,1106567455,NZ +1106567456,1106605695,US +1106605696,1106605703,DE +1106605704,1106685047,US +1106685048,1106685055,CA +1106685056,1106740991,US +1106740992,1106741247,CR +1106741248,1106758655,US 1106758656,1106759167,EC 1106759168,1106759679,CO 1106759680,1106767871,US @@ -8741,27 +14007,166 @@ 1106768896,1106769919,CO 1106769920,1106814719,US 1106814720,1106814975,EC -1106814976,1107238911,US +1106814976,1107220223,US +1107220224,1107220239,AX +1107220240,1107241215,US +1107241216,1107241343,CN +1107241344,1107241471,US +1107241472,1107241599,CN +1107241600,1107243007,US 1107243008,1107247103,TC 1107247104,1107275775,US 1107275776,1107279871,CA 1107279872,1107288063,US 1107288064,1107296255,CA -1107296256,1107697663,US +1107296256,1107701759,US 1107701760,1107705855,CA -1107705856,1107805695,US +1107705856,1107800063,US +1107800064,1107800319,CA +1107800320,1107801367,US +1107801368,1107801375,CA +1107801376,1107805695,US 1107805696,1107805951,TR -1107805952,1107820543,US -1107853312,1108025343,US +1107805952,1107808842,US +1107808843,1107808846,PE +1107808847,1107808877,US +1107808878,1107808881,PE +1107808882,1107820543,US +1107820544,1107853311,ZA +1107853312,1107895039,US +1107895040,1107895807,GB +1107895808,1107898367,US +1107898368,1107899903,GB +1107899904,1107900671,US +1107900672,1107900927,GB +1107900928,1107906559,US +1107906560,1107906815,GB +1107906816,1107907839,US +1107907840,1107908095,GB +1107908096,1107909375,US +1107909376,1107909631,GB +1107909632,1107909887,US +1107909888,1107910143,GB +1107910144,1107927039,US +1107927040,1107927551,GB +1107927552,1107935743,US +1107935744,1107936767,GB +1107936768,1107946495,US +1107946496,1107947007,GB +1107947008,1107947775,US +1107947776,1107948031,GB +1107948032,1107948543,US +1107948544,1107948799,GB +1107948800,1108025343,US +1108025344,1108029439,CA 1108029440,1108033535,US 1108033536,1108041727,CA 1108041728,1108054015,US -1108054016,1108066303,CA +1108054016,1108054303,CA +1108054304,1108054319,US +1108054320,1108054527,CA +1108054528,1108054543,US +1108054544,1108054687,CA +1108054688,1108054695,US +1108054696,1108054751,CA +1108054752,1108054767,US +1108054768,1108055039,CA +1108055040,1108055103,US +1108055104,1108055399,CA +1108055400,1108055407,US +1108055408,1108055423,CA +1108055424,1108055439,US +1108055440,1108055455,CA +1108055456,1108055471,US +1108055472,1108055487,CA +1108055488,1108055551,US +1108055552,1108055903,CA +1108055904,1108055919,US +1108055920,1108055967,CA +1108055968,1108055983,US +1108055984,1108056127,PA +1108056128,1108056191,US +1108056192,1108056207,CA +1108056208,1108056215,GB +1108056216,1108056223,CA +1108056224,1108056255,US +1108056256,1108056287,CA +1108056288,1108056319,CR +1108056320,1108056351,CA +1108056352,1108056383,US +1108056384,1108056407,CA +1108056408,1108056415,US +1108056416,1108056527,CA +1108056528,1108056535,US +1108056536,1108056579,CA +1108056580,1108056581,US +1108056582,1108056671,CA +1108056672,1108056703,US +1108056704,1108056727,CA +1108056728,1108056735,US +1108056736,1108056783,CA +1108056784,1108056791,CR +1108056792,1108056799,GB +1108056800,1108057071,CA +1108057072,1108057079,NL +1108057080,1108057087,US +1108057088,1108057135,CA +1108057136,1108057151,US +1108057152,1108057215,CA +1108057216,1108057239,US +1108057240,1108057335,CA +1108057336,1108057343,GB +1108057344,1108057383,CA +1108057384,1108057391,US +1108057392,1108057503,CA +1108057504,1108057519,BS +1108057520,1108057535,US +1108057536,1108057775,CA +1108057776,1108057783,US +1108057784,1108066303,CA 1108066304,1108492287,US -1108500480,1108525055,US +1108492288,1108500479,ZA +1108500480,1108502303,US +1108502304,1108502311,PR +1108502312,1108525055,US 1108525056,1108541439,CA -1108541440,1109610495,US -1109614592,1109639199,US +1108541440,1109245981,US +1109245982,1109245993,GB +1109245994,1109246021,US +1109246022,1109246029,AU +1109246030,1109246127,US +1109246128,1109246135,IE +1109246136,1109246236,US +1109246237,1109246245,IE +1109246246,1109246721,US +1109246722,1109246730,CA +1109246731,1109247350,US +1109247351,1109247370,CA +1109247371,1109247376,US +1109247377,1109247388,NZ +1109247389,1109247403,US +1109247404,1109247413,CA +1109247414,1109247528,US +1109247529,1109247536,AU +1109247537,1109247712,US +1109247713,1109247732,PH +1109247733,1109247792,US +1109247793,1109247800,CA +1109247801,1109249153,US +1109249154,1109249161,PH +1109249162,1109250860,US +1109250861,1109250868,PH +1109250869,1109252455,US +1109252456,1109252463,AU +1109252464,1109252778,US +1109252779,1109252786,CA +1109252787,1109252803,US +1109252804,1109252813,CA +1109252814,1109253416,US +1109253417,1109253432,CH +1109253433,1109253500,US +1109253501,1109253508,CH +1109253509,1109639199,US 1109639200,1109639215,IN 1109639216,1109641663,US 1109641664,1109641679,JP @@ -8804,77 +14209,253 @@ 1109709824,1109710847,ZM 1109710848,1109711175,US 1109711176,1109711183,HT -1109711184,1109774175,US +1109711184,1109738495,US +1109738496,1109738623,VA +1109738624,1109774175,US 1109774176,1109774183,CA 1109774184,1109776575,US 1109776576,1109776607,CN 1109776608,1109776615,CA 1109776616,1109819391,US -1109819392,1109852159,CA +1109819392,1109848831,CA +1109848832,1109849087,A1 +1109849088,1109852159,CA 1109852160,1109902415,US 1109902416,1109902431,CY 1109902432,1109902511,US 1109902512,1109902527,CY -1109902528,1109907455,US -1109907456,1109907711,CY -1109907712,1109919487,US -1109919488,1109919743,GB -1109919744,1109927167,US +1109902528,1109918463,US +1109918464,1109918719,GB +1109918720,1109919487,US +1109919488,1109919999,GB +1109920000,1109923135,US +1109923136,1109923151,BG +1109923152,1109923183,US +1109923184,1109923199,SK +1109923200,1109923279,US +1109923280,1109923295,GB +1109923296,1109923647,US +1109923648,1109923711,CA +1109923712,1109925503,US +1109925504,1109925567,GB +1109925568,1109926911,US +1109926912,1109927167,CA 1109927168,1109927423,AU -1109927424,1110126591,US +1109927424,1109934591,US +1109934592,1109934847,GB +1109934848,1109952599,US +1109952600,1109952607,JP +1109952608,1109952623,US +1109952624,1109952631,GB +1109952632,1109954167,US +1109954168,1109954175,VE +1109954176,1109954351,US +1109954352,1109954367,ES +1109954368,1110126591,US 1110126592,1110130687,CA -1110130688,1110237183,US -1110241280,1110310911,US +1110130688,1110307903,US +1110307904,1110307967,AU +1110307968,1110310911,US 1110310912,1110376447,CA -1110376448,1110445311,US -1110445312,1110446591,CA -1110446592,1110449151,US -1110449152,1110449663,CA -1110449664,1110450687,US -1110450688,1110450943,CA -1110450944,1110452223,US -1110452224,1110453247,CA +1110376448,1110441983,US +1110441984,1110442239,CA +1110442240,1110442303,US +1110442304,1110442367,CA +1110442368,1110442431,US +1110442432,1110442719,CA +1110442720,1110442751,US +1110442752,1110442863,CA +1110442864,1110443007,US +1110443008,1110443295,CA +1110443296,1110443327,US +1110443328,1110443551,CA +1110443552,1110443711,US +1110443712,1110443719,CA +1110443720,1110444287,US +1110444288,1110444799,CA +1110444800,1110445055,US +1110445056,1110446655,CA +1110446656,1110446719,IL +1110446720,1110446847,CA +1110446848,1110446975,US +1110446976,1110447039,CA +1110447040,1110447103,US +1110447104,1110448383,CA +1110448384,1110448639,US +1110448640,1110449055,CA +1110449056,1110449151,US +1110449152,1110449703,CA +1110449704,1110449719,US +1110449720,1110449735,CA +1110449736,1110449751,US +1110449752,1110449783,CA +1110449784,1110449791,US +1110449792,1110449799,CA +1110449800,1110449807,US +1110449808,1110449879,CA +1110449880,1110449895,US +1110449896,1110449943,CA +1110449944,1110449967,US +1110449968,1110449975,CA +1110449976,1110450023,US +1110450024,1110450071,CA +1110450072,1110450175,US +1110450176,1110451327,CA +1110451328,1110451455,US +1110451456,1110451711,CA +1110451712,1110451967,US +1110451968,1110453247,CA 1110453248,1110454271,US 1110454272,1110455295,CA -1110455296,1110459551,US -1110459552,1110459615,CA -1110459616,1110461759,US -1110461760,1110461823,CA -1110461824,1110462463,US -1110462464,1110462719,CA -1110462720,1110472447,US -1110472448,1110472703,CA -1110472704,1110540287,US +1110455296,1110458367,US +1110458368,1110458415,CA +1110458416,1110458431,US +1110458432,1110458479,CA +1110458480,1110458495,US +1110458496,1110458575,CA +1110458576,1110458639,US +1110458640,1110458687,CA +1110458688,1110458703,US +1110458704,1110458735,CA +1110458736,1110458767,US +1110458768,1110458783,CA +1110458784,1110458831,US +1110458832,1110458847,CA +1110458848,1110458879,US +1110458880,1110458927,CA +1110458928,1110458943,US +1110458944,1110459071,CA +1110459072,1110459087,US +1110459088,1110459151,CA +1110459152,1110459167,US +1110459168,1110459183,CA +1110459184,1110459199,US +1110459200,1110459215,CA +1110459216,1110459311,US +1110459312,1110459343,CA +1110459344,1110459391,US +1110459392,1110459423,CA +1110459424,1110459455,US +1110459456,1110459743,CA +1110459744,1110459903,US +1110459904,1110459967,CA +1110459968,1110460223,US +1110460224,1110460319,CA +1110460320,1110460383,US +1110460384,1110460447,CA +1110460448,1110460479,US +1110460480,1110460511,CA +1110460512,1110460671,US +1110460672,1110460719,CA +1110460720,1110460743,US +1110460744,1110460775,CA +1110460776,1110460783,US +1110460784,1110460831,CA +1110460832,1110460863,US +1110460864,1110460887,CA +1110460888,1110460903,US +1110460904,1110460911,CA +1110460912,1110460935,US +1110460936,1110460999,CA +1110461000,1110461183,US +1110461184,1110461375,CA +1110461376,1110461439,US +1110461440,1110461823,CA +1110461824,1110462079,US +1110462080,1110462271,CA +1110462272,1110462335,US +1110462336,1110462719,CA +1110462720,1110462847,US +1110462848,1110463103,CA +1110463104,1110463231,US +1110463232,1110463487,CA +1110463488,1110463999,US +1110464000,1110464767,CA +1110464768,1110464895,US +1110464896,1110464959,CA +1110464960,1110465023,US +1110465024,1110465535,CA +1110465536,1110466047,US +1110466048,1110466303,CA +1110466304,1110466559,US +1110466560,1110466567,CA +1110466568,1110466815,US +1110466816,1110466847,CA +1110466848,1110467583,US +1110467584,1110467711,CA +1110467712,1110472447,US +1110472448,1110473727,CA +1110473728,1110473983,US +1110473984,1110474303,CA +1110474304,1110474495,US +1110474496,1110474751,CA +1110474752,1110540287,US 1110540288,1110573055,CA 1110573056,1110638591,PR 1110638592,1110663167,US 1110663168,1110675455,CA 1110675456,1110679551,US -1110679552,1110683647,CA +1110679552,1110683423,CA +1110683424,1110683431,US +1110683432,1110683647,CA 1110683648,1110700031,US 1110700032,1110704127,CA -1110704128,1110851583,US -1110863872,1110867967,JM -1110867968,1110929407,US +1110704128,1110863871,US +1110863872,1110865919,JM +1110865920,1110867200,KY +1110867201,1110867967,JM +1110867968,1110870791,US +1110870792,1110870799,HK +1110870800,1110870815,US +1110870816,1110870847,HK +1110870848,1110870919,US +1110870920,1110870927,JP +1110870928,1110921215,US +1110925312,1110929407,US 1110929408,1110933503,BM -1110933504,1110941695,US -1110949888,1111175167,US -1111179264,1111195647,US +1110933504,1111195647,US 1111195648,1111212031,CA 1111212032,1111228415,US 1111228416,1111244799,AR -1111244800,1111515135,US -1111523328,1112432639,US -1112432640,1112440831,CA -1112440832,1112498175,US -1112506368,1112530943,US +1111244800,1111472127,US +1111472128,1111472383,AU +1111472384,1111888905,US +1111888906,1111888915,IN +1111888916,1111900223,US +1111900224,1111900287,NL +1111900288,1111901805,US +1111901806,1111901815,GB +1111901816,1112357375,US +1112357376,1112357503,CA +1112357504,1112360959,US +1112360960,1112361023,CA +1112361024,1112369343,US +1112369344,1112369375,AU +1112369376,1112432639,US +1112432640,1112433147,CA +1112433148,1112433151,US +1112433152,1112440831,CA +1112440832,1112530943,US 1112530944,1112539135,CA -1112539136,1113591807,US +1112539136,1113212479,US +1113212480,1113212495,CA +1113212496,1113591807,US 1113591808,1113595903,CA -1113595904,1113596159,CL -1113596160,1113602047,US -1113602048,1113603071,VE -1113603072,1113657343,US +1113595904,1113596415,CL +1113596416,1113596927,GT +1113596928,1113597183,PE +1113597184,1113597439,US +1113597440,1113597695,PE +1113597696,1113598463,PA +1113598464,1113599487,US +1113599488,1113599999,VE +1113600000,1113600255,US +1113600256,1113603071,VE +1113603072,1113603327,CL +1113603328,1113603583,SV +1113603584,1113603839,US +1113603840,1113604095,CA +1113604096,1113657343,US 1113657344,1113661439,CA 1113661440,1113696575,US 1113696576,1113696639,CA @@ -8882,11 +14463,17 @@ 1113696832,1113696895,CA 1113696896,1113718783,US 1113718784,1113743359,DO -1113743360,1113854207,US +1113743360,1113854007,US +1113854008,1113854015,CA +1113854016,1113854207,US 1113854208,1113854463,CA -1113854464,1113857023,US +1113854464,1113854975,US +1113854976,1113855487,CA +1113855488,1113857023,US 1113857024,1113857031,CA -1113857032,1113862247,US +1113857032,1113857087,US +1113857088,1113857151,CA +1113857152,1113862247,US 1113862248,1113862255,MX 1113862256,1113864735,US 1113864736,1113864743,BR @@ -8908,45 +14495,100 @@ 1113919384,1113919391,CA 1113919392,1113923839,US 1113923840,1113923903,BR -1113923904,1113932815,US -1113932816,1113932823,CA -1113932824,1113989119,US -1113993216,1113997311,US +1113923904,1113997311,US 1113997312,1114005503,CA 1114005504,1114054655,US 1114054656,1114062847,CA 1114062848,1114095615,US 1114095616,1114103807,CA -1114103808,1114505215,US -1114505216,1114507279,CA -1114507280,1114507295,US +1114103808,1114163967,US +1114163968,1114164479,VI +1114164480,1114170095,US +1114170096,1114170111,CA +1114170112,1114505215,US +1114505216,1114507263,CA +1114507264,1114507295,US 1114507296,1114507423,CA -1114507424,1114507431,TZ +1114507424,1114507431,GB 1114507432,1114511359,CA -1114511360,1114511615,US -1114511616,1114513407,CA +1114511360,1114511871,US +1114511872,1114513407,CA 1114513408,1114515455,SA -1114515456,1114524159,CA -1114524160,1114524671,SA -1114524672,1114530815,CA -1114530816,1114531839,AR -1114531840,1114533375,CA -1114533376,1114533887,SA -1114533888,1114550271,CA -1114550272,1114681343,US +1114515456,1114517503,GU +1114517504,1114520063,CA +1114520064,1114520319,PH +1114520320,1114520575,US +1114520576,1114520831,PH +1114520832,1114521855,CA +1114521856,1114522111,US +1114522112,1114524159,CA +1114524160,1114524671,ZA +1114524672,1114533375,CA +1114533376,1114533887,ZA +1114533888,1114537983,AO +1114537984,1114550271,CA +1114550272,1114623999,US +1114624000,1114625023,NZ +1114625024,1114627071,US +1114627072,1114628095,NZ +1114628096,1114653951,US +1114653952,1114653983,MO +1114653984,1114657927,US +1114657928,1114657935,LA +1114657936,1114681343,US 1114681344,1114685439,CA 1114685440,1114730495,US -1114734592,1114853375,US -1114857472,1114877951,US -1114877952,1114878207,LT -1114878208,1114878849,US +1114730496,1114734591,CA +1114734592,1114865711,US +1114865712,1114865727,CA +1114865728,1114875391,US +1114875392,1114876159,CA +1114876160,1114876447,US +1114876448,1114876463,CA +1114876464,1114876479,US +1114876480,1114876543,CA +1114876544,1114876575,GB +1114876576,1114876927,US +1114876928,1114877183,CA +1114877184,1114877439,CY +1114877440,1114877695,US +1114877696,1114877759,SK +1114877760,1114877791,US +1114877792,1114877807,CA +1114877808,1114877951,US +1114877952,1114878207,PA +1114878208,1114878463,US +1114878464,1114878719,NL +1114878720,1114878849,US 1114878850,1114878977,LT -1114878978,1114964991,US -1114964992,1114965247,AU -1114965248,1115054079,US -1115058176,1115104511,US +1114878978,1114880079,US +1114880080,1114880095,CY +1114880096,1114880383,US +1114880384,1114880399,CY +1114880400,1114880407,GB +1114880408,1114881343,US +1114881344,1114881407,CY +1114881408,1114881471,US +1114881472,1114881535,CY +1114881536,1114881743,US +1114881744,1114881759,CA +1114881760,1114930175,US +1114930176,1114930303,GB +1114930304,1114966815,US +1114966816,1114966831,GB +1114966832,1115104511,US 1115104512,1115104639,CA -1115104640,1115113471,US +1115104640,1115111935,US +1115111936,1115112063,PR +1115112064,1115112079,US +1115112080,1115112087,ES +1115112088,1115112159,US +1115112160,1115112191,SV +1115112192,1115112575,US +1115112576,1115112607,IN +1115112608,1115113167,US +1115113168,1115113175,SV +1115113176,1115113471,US 1115113472,1115114495,HN 1115114496,1115114751,MX 1115114752,1115115007,GT @@ -8957,340 +14599,1157 @@ 1115117312,1115117567,US 1115117568,1115118591,HN 1115118592,1115119615,SV -1115119616,1115135999,US -1115136000,1115144191,CA -1115144192,1115693055,US +1115119616,1115127807,US +1115131904,1115135999,US +1115136000,1115138671,CA +1115138672,1115138679,US +1115138680,1115144191,CA +1115144192,1115243263,US +1115243264,1115243271,PR +1115243272,1115299871,US +1115299872,1115299879,PR +1115299880,1115350543,US +1115350544,1115350551,PR +1115350552,1115401431,US +1115401432,1115401439,PR +1115401440,1115665631,US +1115665632,1115665639,PR +1115665640,1115693055,US 1115693056,1115697151,CO -1115697152,1115705343,US +1115697152,1115697159,US +1115697160,1115697167,CO +1115697168,1115697175,US +1115697176,1115697183,AU +1115697184,1115697199,US +1115697200,1115697207,ID +1115697208,1115697215,US +1115697216,1115697223,ID +1115697224,1115697231,CA +1115697232,1115697263,US +1115697264,1115697279,IN +1115697280,1115697319,US +1115697320,1115697327,GB +1115697328,1115697383,US +1115697384,1115697391,CO +1115697392,1115697471,US +1115697472,1115697479,CO +1115697480,1115697799,US +1115697800,1115697807,CA +1115697808,1115697815,US +1115697816,1115697823,DO +1115697824,1115697943,US +1115697944,1115697951,MX +1115697952,1115697961,DO +1115697962,1115697991,US +1115697992,1115697999,CO +1115698000,1115698007,DO +1115698008,1115698015,US +1115698016,1115698047,AF +1115698048,1115698127,US +1115698128,1115698135,DO +1115698136,1115698159,US +1115698160,1115698167,AU +1115698168,1115698399,US +1115698400,1115698407,CA +1115698408,1115698431,US +1115698432,1115698687,DO +1115698688,1115698783,US +1115698784,1115698791,CO +1115698792,1115698943,US +1115698944,1115698951,CA +1115698952,1115698983,US +1115698984,1115698991,CO +1115698992,1115699903,US +1115699904,1115699911,CA +1115699912,1115699919,US +1115699920,1115699927,CA +1115699928,1115700223,US +1115700224,1115700479,DO +1115700480,1115700735,US +1115700736,1115700743,CA +1115700744,1115700791,US +1115700792,1115700799,CA +1115700800,1115705343,US 1115705344,1115709439,CA 1115709440,1115783167,US -1115783168,1115791359,CA -1115791360,1115791615,US -1115791616,1115791871,PR -1115791872,1115792895,US -1115792896,1115793151,PR -1115793152,1115795455,US +1115783168,1115784599,CA +1115784600,1115784607,US +1115784608,1115791359,CA +1115791360,1115795455,PR 1115795456,1115799551,CA 1115799552,1115815935,US 1115815936,1115947007,CA -1115947008,1116168191,US -1116168192,1116176383,CA -1116176384,1116897279,US +1115947008,1116014079,US +1116014080,1116014335,A2 +1116014336,1116014591,US +1116014592,1116014847,A2 +1116014848,1116015871,US +1116015872,1116016127,A2 +1116016128,1116027135,US +1116027136,1116027903,A2 +1116027904,1116041791,US +1116041792,1116041807,CA +1116041808,1116158463,US +1116158464,1116158495,AU +1116158496,1116168191,US +1116168192,1116169311,CA +1116169312,1116169327,US +1116169328,1116176383,CA +1116176384,1116210247,US +1116210248,1116210255,PR +1116210256,1116210375,US +1116210376,1116210383,PR +1116210384,1116210519,US +1116210520,1116210527,PR +1116210528,1116210703,US +1116210704,1116210711,PR +1116210712,1116211487,US +1116211488,1116211495,PR +1116211496,1116211631,US +1116211632,1116211639,PR +1116211640,1116211647,US +1116211648,1116211655,PR +1116211656,1116213375,US +1116213376,1116213383,PR +1116213384,1116213447,US +1116213448,1116213463,PR +1116213464,1116213639,US +1116213640,1116213647,PR +1116213648,1116213943,US +1116213944,1116213951,PR +1116213952,1116214159,US +1116214160,1116214167,PR +1116214168,1116217151,US +1116217152,1116217159,PR +1116217160,1116217439,US +1116217440,1116217447,PR +1116217448,1116218527,US +1116218528,1116218535,PR +1116218536,1116220231,US +1116220232,1116220239,PR +1116220240,1116223199,US +1116223200,1116223207,PR +1116223208,1116224047,US +1116224048,1116224055,PR +1116224056,1116228943,US +1116228944,1116228951,PR +1116228952,1116229063,US +1116229064,1116229071,PR +1116229072,1116233767,US +1116233768,1116233775,PR +1116233776,1116233791,US +1116233792,1116233799,PR +1116233800,1116244151,US +1116244152,1116244159,PR +1116244160,1116244767,US +1116244768,1116244775,PR +1116244776,1116244935,US +1116244936,1116244943,PR +1116244944,1116245247,US +1116245248,1116245255,PR +1116245256,1116245263,US +1116245264,1116245271,PR +1116245272,1116251823,US +1116251824,1116251831,PR +1116251832,1116252319,US +1116252320,1116252327,PR +1116252328,1116253247,US +1116253248,1116253255,PR +1116253256,1116253295,US +1116253296,1116253303,PR +1116253304,1116253455,US +1116253456,1116253463,PR +1116253464,1116261583,US +1116261584,1116261591,PR +1116261592,1116269567,US +1116269568,1116269575,PR +1116269576,1116271503,US +1116271504,1116271511,PR +1116271512,1116272879,US +1116272880,1116272887,PR +1116272888,1116275047,US +1116275048,1116275055,PR +1116275056,1116275511,US +1116275512,1116275519,PR +1116275520,1116277687,US +1116277688,1116277695,PR +1116277696,1116279503,US +1116279504,1116279511,PR +1116279512,1116283999,US +1116284000,1116284007,PR +1116284008,1116284871,US +1116284872,1116284879,PR +1116284880,1116291351,US +1116291352,1116291359,PR +1116291360,1116299551,US +1116299552,1116299559,PR +1116299560,1116299623,US +1116299624,1116299631,PR +1116299632,1116300847,US +1116300848,1116300855,PR +1116300856,1116301143,US +1116301144,1116301151,PR +1116301152,1116302423,US +1116302424,1116302431,PR +1116302432,1116303023,US +1116303024,1116303031,PR +1116303032,1116305967,US +1116305968,1116305975,PR +1116305976,1116310527,US +1116310528,1116310535,PR +1116310536,1116311831,US +1116311832,1116311839,PR +1116311840,1116316399,US +1116316400,1116316407,PR +1116316408,1116321559,US +1116321560,1116321567,PR +1116321568,1116325399,US +1116325400,1116325407,PR +1116325408,1116330407,US +1116330408,1116330415,PR +1116330416,1116334743,US +1116334744,1116334751,PR +1116334752,1116334983,US +1116334984,1116334991,PR +1116334992,1116335735,US +1116335736,1116335743,PR +1116335744,1116336839,US +1116336840,1116336847,PR +1116336848,1116337119,US +1116337120,1116337127,PR +1116337128,1116337935,US +1116337936,1116337943,PR +1116337944,1116339559,US +1116339560,1116339567,PR +1116339568,1116339575,US +1116339576,1116339583,PR +1116339584,1116339599,US +1116339600,1116339607,PR +1116339608,1116359815,US +1116359816,1116359823,PR +1116359824,1116359919,US +1116359920,1116359927,PR +1116359928,1116360215,US +1116360216,1116360223,PR +1116360224,1116392463,US +1116392464,1116392471,PR +1116392472,1116401303,US +1116401304,1116401311,PR +1116401312,1116406175,US +1116406176,1116406191,PR +1116406192,1116409287,US +1116409288,1116409295,PR +1116409296,1116422439,US +1116422440,1116422447,PR +1116422448,1116444783,US +1116444784,1116444791,PR +1116444792,1116459631,US +1116459632,1116459647,PR +1116459648,1116473575,US +1116473576,1116473583,PR +1116473584,1116478399,US +1116478400,1116478407,PR +1116478408,1116481879,US +1116481880,1116481887,PR +1116481888,1116487895,US +1116487896,1116487903,PR +1116487904,1116487911,US +1116487912,1116487919,PR +1116487920,1116491303,US +1116491304,1116491311,PR +1116491312,1116496047,US +1116496048,1116496055,PR +1116496056,1116499983,US +1116499984,1116499991,PR +1116499992,1116505919,US +1116505920,1116505951,PR +1116505952,1116506767,US +1116506768,1116506775,PR +1116506776,1116506863,US +1116506864,1116506871,PR +1116506872,1116509495,US +1116509496,1116509503,PR +1116509504,1116510911,US +1116510912,1116510927,PR +1116510928,1116529023,US +1116529024,1116529031,PR +1116529032,1116538687,US +1116538688,1116538703,UA +1116538704,1116566343,US +1116566344,1116566351,PR +1116566352,1116577415,US +1116577416,1116577423,PR +1116577424,1116599479,US +1116599480,1116599487,PR +1116599488,1116897279,US 1116897280,1116905471,CA -1116905472,1117274111,US +1116905472,1117137919,US +1117137920,1117138175,CA +1117138176,1117142271,US +1117142272,1117142527,CA +1117142528,1117163023,US +1117163024,1117163031,CA +1117163032,1117169503,US +1117169504,1117169535,CA +1117169536,1117178287,US +1117178288,1117178303,GB +1117178304,1117182271,US +1117182272,1117182335,CA +1117182336,1117189951,US +1117189952,1117190015,KR +1117190016,1117195903,US +1117195904,1117195911,IL +1117195912,1117195991,US +1117195992,1117195999,A2 +1117196000,1117198591,US +1117198592,1117198847,CA +1117198848,1117206599,US +1117206600,1117206623,FR +1117206624,1117253247,US +1117253248,1117253255,IL +1117253256,1117274111,US 1117274112,1117282303,CA -1117286400,1117413375,US -1117413376,1117415423,CA +1117282304,1117299615,US +1117299616,1117299623,GB +1117299624,1117303103,US +1117303104,1117303167,CA +1117303168,1117305671,US +1117305672,1117305679,GB +1117305680,1117409343,US +1117409344,1117409351,GB +1117409352,1117409783,US +1117409784,1117409791,GB +1117409792,1117411071,US +1117411072,1117411087,PL +1117411088,1117412863,US +1117412864,1117412991,CA +1117412992,1117413375,US +1117413376,1117413631,CA +1117413632,1117415423,US 1117415424,1117416191,AN -1117416192,1117419007,CA +1117416192,1117416447,CA +1117416448,1117416703,US +1117416704,1117417215,CA +1117417216,1117417223,US +1117417224,1117417231,CA +1117417232,1117417239,US +1117417240,1117417247,CA +1117417248,1117417263,US +1117417264,1117417279,CA +1117417280,1117417343,US +1117417344,1117418655,CA +1117418656,1117418671,US +1117418672,1117419007,CA 1117419008,1117419519,US -1117419520,1117421567,CA +1117419520,1117419775,CA +1117419776,1117420543,US +1117420544,1117421055,CA +1117421056,1117421311,US +1117421312,1117421567,CA 1117421568,1117683711,US 1117683712,1117691903,CA 1117691904,1117724671,US 1117724672,1117728767,CA 1117728768,1117745151,US 1117745152,1117749247,CA -1117749248,1117978623,US -1117978624,1117986815,CA +1117749248,1117796575,US +1117796576,1117796591,CA +1117796592,1117814823,US +1117814824,1117814831,CN +1117814832,1117815295,US +1117815296,1117815551,CN +1117815552,1117817919,US +1117817920,1117817983,CA +1117817984,1117818495,US +1117818496,1117818623,IT +1117818624,1117818975,US +1117818976,1117818991,HK +1117818992,1117819631,US +1117819632,1117819647,AE +1117819648,1117823231,US +1117823232,1117823487,CA +1117823488,1117823743,CN +1117823744,1117823999,US +1117824000,1117824511,GR +1117824512,1117829375,US +1117829376,1117829631,GR +1117829632,1117831359,US +1117831360,1117831423,A2 +1117831424,1117832191,US +1117832192,1117832447,IT +1117832448,1117978623,US +1117978624,1117979503,CA +1117979504,1117979519,US +1117979520,1117982639,CA +1117982640,1117982655,US +1117982656,1117982999,CA +1117983000,1117983007,US +1117983008,1117983023,CA +1117983024,1117983039,US +1117983040,1117983215,CA +1117983216,1117983223,US +1117983224,1117983831,CA +1117983832,1117983839,US +1117983840,1117984023,CA +1117984024,1117984047,US +1117984048,1117985055,CA +1117985056,1117985079,US +1117985080,1117985423,CA +1117985424,1117985447,US +1117985448,1117985463,CA +1117985464,1117985471,US +1117985472,1117985615,CA +1117985616,1117985647,US +1117985648,1117985767,CA +1117985768,1117985775,US +1117985776,1117986575,CA +1117986576,1117986687,US +1117986688,1117986815,CA 1117986816,1117995007,US 1117995008,1117999103,CA -1117999104,1118007295,US -1118011392,1118027775,US -1118027776,1118031871,CA -1118031872,1118158847,US +1117999104,1118027783,US +1118027784,1118029471,CA +1118029472,1118029519,US +1118029520,1118029551,CA +1118029552,1118029567,US +1118029568,1118030991,CA +1118030992,1118030999,US +1118031000,1118031071,CA +1118031072,1118031079,US +1118031080,1118031263,CA +1118031264,1118031295,US +1118031296,1118031311,CA +1118031312,1118031319,US +1118031320,1118031375,CA +1118031376,1118031383,CR +1118031384,1118031431,CA +1118031432,1118031439,US +1118031440,1118031759,CA +1118031760,1118031799,US +1118031800,1118031871,CA +1118031872,1118126079,US +1118126080,1118126591,CA +1118126592,1118126847,US +1118126848,1118127231,CA +1118127232,1118127359,US +1118127360,1118127615,CA +1118127616,1118128383,US +1118128384,1118128639,CA +1118128640,1118129151,US +1118129152,1118129663,CA +1118129664,1118129695,BR +1118129696,1118129823,US +1118129824,1118129855,AU +1118129856,1118129887,US +1118129888,1118129919,CA +1118129920,1118130431,US +1118130432,1118131455,CA +1118131456,1118131583,US +1118131584,1118131711,IN +1118131712,1118132479,CA +1118132480,1118132991,US +1118132992,1118133375,CA +1118133376,1118133503,US +1118133504,1118133631,CA +1118133632,1118133759,US +1118133760,1118133887,CA +1118133888,1118134783,US +1118134784,1118134879,CA +1118134880,1118134911,US +1118134912,1118134975,CA +1118134976,1118135007,US +1118135008,1118135039,IN +1118135040,1118135647,US +1118135648,1118135663,CA +1118135664,1118135791,US +1118135792,1118135807,ID +1118135808,1118136191,CA +1118136192,1118136831,US +1118136832,1118136863,IN +1118136864,1118136895,BE +1118136896,1118136927,US +1118136928,1118136959,CA +1118136960,1118137119,US +1118137120,1118137151,IL +1118137152,1118137215,US +1118137216,1118137247,GB +1118137248,1118137279,US +1118137280,1118137311,FR +1118137312,1118138559,US +1118138560,1118138591,AU +1118138592,1118139903,US +1118139904,1118140415,CA +1118140416,1118140735,US +1118140736,1118140767,AU +1118140768,1118141183,US +1118141184,1118141439,CA +1118141440,1118141695,US +1118141696,1118141951,CA +1118141952,1118151215,US +1118151216,1118151231,TT +1118151232,1118151391,US +1118151392,1118151407,PR +1118151408,1118151423,US +1118151424,1118151431,ES +1118151432,1118151463,US +1118151464,1118151471,CR +1118151472,1118151631,US +1118151632,1118151647,MX +1118151648,1118151791,US +1118151792,1118151795,BR +1118151796,1118152015,US +1118152016,1118152031,CO +1118152032,1118152239,US +1118152240,1118152255,AW +1118152256,1118152271,PR +1118152272,1118152287,US +1118152288,1118152303,BR +1118152304,1118152319,FR +1118152320,1118152415,US +1118152416,1118152431,PR +1118152432,1118152879,US +1118152880,1118152895,DO +1118152896,1118153071,US +1118153072,1118153087,UY +1118153088,1118153151,US +1118153152,1118153167,AR +1118153168,1118153423,US +1118153424,1118153439,BR +1118153440,1118153543,US +1118153544,1118153547,BR +1118153548,1118153551,US +1118153552,1118153567,DE +1118153568,1118153679,US +1118153680,1118153695,VE +1118153696,1118153871,US +1118153872,1118153887,CO +1118153888,1118153919,US +1118153920,1118153935,PA +1118153936,1118153951,TT +1118153952,1118154063,US +1118154064,1118154079,MX +1118154080,1118154207,US +1118154208,1118154223,CL +1118154224,1118154543,US +1118154544,1118154559,BB +1118154560,1118155103,US +1118155104,1118155119,NL +1118155120,1118155183,US +1118155184,1118155199,CA +1118155200,1118155215,US +1118155216,1118155231,PA +1118155232,1118156319,US +1118156320,1118156335,PE +1118156336,1118156399,US +1118156400,1118156415,VE +1118156416,1118156607,US +1118156608,1118156623,ES +1118156624,1118156703,US +1118156704,1118156719,DK +1118156720,1118157695,US +1118157696,1118157711,NL +1118157712,1118157759,US +1118157760,1118157775,GY +1118157776,1118157791,AR +1118157792,1118158079,US +1118158080,1118158087,PA +1118158088,1118158319,US +1118158320,1118158323,SV +1118158324,1118158331,US +1118158332,1118158335,SV +1118158336,1118158847,US 1118158848,1118167039,CA 1118167040,1118474239,US -1118474240,1118478335,CA -1118478336,1118962839,US -1118962840,1118962847,NI -1118962848,1118962943,US +1118474240,1118474535,CA +1118474536,1118474543,US +1118474544,1118474591,CA +1118474592,1118474599,US +1118474600,1118474607,CA +1118474608,1118474615,US +1118474616,1118474863,CA +1118474864,1118474871,US +1118474872,1118474879,CA +1118474880,1118474911,US +1118474912,1118475087,CA +1118475088,1118475095,US +1118475096,1118475215,CA +1118475216,1118475223,US +1118475224,1118475231,CA +1118475232,1118475247,US +1118475248,1118476807,CA +1118476808,1118476831,US +1118476832,1118476887,CA +1118476888,1118476895,US +1118476896,1118477535,CA +1118477536,1118477543,US +1118477544,1118478335,CA +1118478336,1118789783,US +1118789784,1118789791,BB +1118789792,1118790351,US +1118790352,1118790367,GB +1118790368,1118791551,US +1118791552,1118791567,LU +1118791568,1118791599,US +1118791600,1118791615,ES +1118791616,1118792703,US +1118792704,1118792831,JM +1118792832,1118792895,US +1118792896,1118793151,JM +1118793152,1118793279,US +1118793280,1118793727,JM +1118793728,1118793823,US +1118793824,1118793839,CA +1118793840,1118793935,US +1118793936,1118793951,ES +1118793952,1118794287,US +1118794288,1118794303,BR +1118794304,1118794799,US +1118794800,1118794815,PR +1118794816,1118794959,US +1118794960,1118794975,JM +1118794976,1118795791,US +1118795792,1118795807,AG +1118795808,1118795895,US +1118795896,1118795903,CY +1118795904,1118796543,US +1118796544,1118796799,CY +1118796800,1118797063,US +1118797064,1118797071,CR +1118797072,1118961663,US +1118961664,1118962831,A2 +1118962832,1118962839,SA +1118962840,1118962847,NG +1118962848,1118962943,A2 1118962944,1118963199,TR -1118963200,1118963455,US +1118963200,1118963455,A2 1118963456,1118963463,TZ -1118963464,1118963471,US +1118963464,1118963471,A2 1118963472,1118963479,NG 1118963480,1118963487,GB 1118963488,1118963495,AO -1118963496,1118963583,US +1118963496,1118963583,A2 1118963584,1118963647,KE -1118963648,1118964863,US +1118963648,1118963967,A2 +1118963968,1118963991,LB +1118963992,1118964863,A2 1118964864,1118964879,LB -1118964880,1118964991,US -1118964992,1118965503,LC -1118965504,1118965839,US +1118964880,1118964991,A2 +1118964992,1118965503,AN +1118965504,1118965839,A2 1118965840,1118965847,EC -1118965848,1118965903,US -1118965904,1118965911,NG +1118965848,1118965911,A2 1118965912,1118965919,MA -1118965920,1118965991,US +1118965920,1118965991,A2 1118965992,1118966007,NG -1118966008,1118966039,US +1118966008,1118966023,A2 +1118966024,1118966031,US +1118966032,1118966039,A2 1118966040,1118966063,EC -1118966064,1118966079,US +1118966064,1118966071,A2 +1118966072,1118966079,PY 1118966080,1118966087,NG -1118966088,1118966111,US +1118966088,1118966111,A2 1118966112,1118966119,SV 1118966120,1118966143,VE 1118966144,1118966151,BB -1118966152,1118966215,US +1118966152,1118966191,A2 +1118966192,1118966207,NI +1118966208,1118966215,A2 1118966216,1118966223,EC -1118966224,1118966271,US +1118966224,1118966271,A2 1118966272,1118966351,SV -1118966352,1118966367,US +1118966352,1118966367,A2 1118966368,1118966399,SV -1118966400,1118966407,US +1118966400,1118966407,A2 1118966408,1118966415,SV -1118966416,1118966655,US +1118966416,1118966423,NI +1118966424,1118966455,A2 +1118966456,1118966463,NI +1118966464,1118966487,A2 +1118966488,1118966495,NI +1118966496,1118966503,A2 +1118966504,1118966511,NI +1118966512,1118966519,A2 +1118966520,1118966527,NI +1118966528,1118966655,US 1118966656,1118966687,SV -1118966688,1118966719,US +1118966688,1118966695,NI +1118966696,1118966703,A2 +1118966704,1118966711,NI +1118966712,1118966719,A2 1118966720,1118966783,EC -1118966784,1118966847,US +1118966784,1118966791,LB +1118966792,1118966807,A2 +1118966808,1118966815,LB +1118966816,1118966847,A2 1118966848,1118966911,PY -1118966912,1118966959,US +1118966912,1118966959,A2 1118966960,1118966975,SA -1118966976,1118967391,US +1118966976,1118966991,A2 +1118966992,1118966999,SA +1118967000,1118967015,LB +1118967016,1118967039,A2 +1118967040,1118967047,LB +1118967048,1118967063,A2 +1118967064,1118967135,SA +1118967136,1118967167,LB +1118967168,1118967199,SA +1118967200,1118967207,A2 +1118967208,1118967247,LB +1118967248,1118967255,A2 +1118967256,1118967271,LB +1118967272,1118967279,A2 +1118967280,1118967287,LB +1118967288,1118967295,A2 +1118967296,1118967327,LB +1118967328,1118967335,A2 +1118967336,1118967343,LB +1118967344,1118967359,A2 +1118967360,1118967367,LB +1118967368,1118967375,SA +1118967376,1118967383,LB +1118967384,1118967391,A2 1118967392,1118967399,MA -1118967400,1118967559,US -1118967560,1118967567,LB -1118967568,1118967799,US -1118967800,1118967807,RW -1118967808,1118968175,US +1118967400,1118967423,LB +1118967424,1118967487,A2 +1118967488,1118967519,SA +1118967520,1118967535,A2 +1118967536,1118967543,LB +1118967544,1118967551,SA +1118967552,1118967567,LB +1118967568,1118967583,A2 +1118967584,1118967615,SA +1118967616,1118967631,A2 +1118967632,1118967647,SA +1118967648,1118967663,LB +1118967664,1118967679,SA +1118967680,1118967743,LB +1118967744,1118967775,SA +1118967776,1118967839,A2 +1118967840,1118967847,LB +1118967848,1118967903,A2 +1118967904,1118968015,SA +1118968016,1118968039,A2 +1118968040,1118968047,LB +1118968048,1118968055,A2 +1118968056,1118968095,SA +1118968096,1118968111,A2 +1118968112,1118968127,LB +1118968128,1118968159,A2 +1118968160,1118968175,LB 1118968176,1118968183,AE -1118968184,1118968207,US +1118968184,1118968191,A2 +1118968192,1118968207,SA 1118968208,1118968223,IQ -1118968224,1118968255,US +1118968224,1118968255,A2 1118968256,1118968287,IQ 1118968288,1118968295,AE -1118968296,1118968303,US +1118968296,1118968303,A2 1118968304,1118968319,AE 1118968320,1118968575,SR -1118968576,1118969471,US +1118968576,1118968831,A2 +1118968832,1118968975,SA +1118968976,1118968991,A2 +1118968992,1118969007,SA +1118969008,1118969023,A2 +1118969024,1118969215,SA +1118969216,1118969279,A2 +1118969280,1118969343,SA +1118969344,1118969367,A2 +1118969368,1118969375,NI +1118969376,1118969471,A2 1118969472,1118969599,TT 1118969600,1118969727,GY -1118969728,1118969855,US +1118969728,1118969855,A2 1118969856,1118970111,LB 1118970112,1118970119,KE -1118970120,1118970239,US +1118970120,1118970239,A2 1118970240,1118970367,NG 1118970368,1118970623,GY -1118970624,1118970751,US +1118970624,1118970751,SA 1118970752,1118970879,GY 1118970880,1118971520,SR -1118971521,1118971647,US +1118971521,1118971647,A2 1118971648,1118971903,GY -1118971904,1118972159,CA +1118971904,1118972159,A2 1118972160,1118972415,VE 1118972416,1118972671,EC -1118972672,1118972943,US +1118972672,1118972927,SA +1118972928,1118972943,NI 1118972944,1118972959,VE -1118972960,1118972999,US +1118972960,1118972967,A2 +1118972968,1118972975,NI +1118972976,1118972983,A2 +1118972984,1118972999,NI 1118973000,1118973007,SV -1118973008,1118973063,US +1118973008,1118973031,A2 +1118973032,1118973039,NI +1118973040,1118973047,A2 +1118973048,1118973055,NI +1118973056,1118973063,A2 1118973064,1118973071,EC 1118973072,1118973079,SV 1118973080,1118973111,VE 1118973112,1118973119,SV -1118973120,1118973183,US +1118973120,1118973151,NI +1118973152,1118973159,A2 +1118973160,1118973167,NI +1118973168,1118973183,A2 1118973184,1118973439,VE 1118973440,1118973695,GY -1118973696,1118973951,LB +1118973696,1118973951,NG 1118973952,1118974015,GY -1118974016,1118974047,US +1118974016,1118974047,A2 1118974048,1118974055,SV -1118974056,1118974095,US +1118974056,1118974095,A2 1118974096,1118974103,EC 1118974104,1118974111,SV -1118974112,1118974135,US +1118974112,1118974119,NI +1118974120,1118974127,A2 +1118974128,1118974135,US 1118974136,1118974207,EC -1118974208,1118975231,US +1118974208,1118974215,US +1118974216,1118975231,A2 1118975232,1118975487,NI 1118975488,1118975743,KE -1118975744,1118975999,US +1118975744,1118975999,A2 1118976000,1118976255,GB -1118976256,1118976511,US +1118976256,1118976287,LB +1118976288,1118976295,A2 +1118976296,1118976311,SA +1118976312,1118976319,A2 +1118976320,1118976327,SA +1118976328,1118976343,A2 +1118976344,1118976359,LB +1118976360,1118976367,A2 +1118976368,1118976375,SA +1118976376,1118976383,LB +1118976384,1118976391,SA +1118976392,1118976399,A2 +1118976400,1118976423,SA +1118976424,1118976511,A2 1118976512,1118976575,NG -1118976576,1118976599,US -1118976600,1118976607,NI -1118976608,1118976687,US -1118976688,1118976695,NG -1118976696,1118976703,NI -1118976704,1118976727,US -1118976728,1118976735,NI -1118976736,1118976767,US -1118976768,1118976791,NI -1118976792,1118976831,US -1118976832,1118976863,NI -1118976864,1118976895,US -1118976896,1118977023,NI -1118977024,1118977311,US -1118977312,1118977343,LB +1118976576,1118976599,A2 +1118976600,1118976607,NG +1118976608,1118976615,LB +1118976616,1118976687,A2 +1118976688,1118976703,NG +1118976704,1118976727,A2 +1118976728,1118976735,NG +1118976736,1118976767,A2 +1118976768,1118976791,NG +1118976792,1118976831,A2 +1118976832,1118976863,NG +1118976864,1118976895,A2 +1118976896,1118977023,NG +1118977024,1118977279,SA +1118977280,1118977311,A2 +1118977312,1118977343,NG 1118977344,1118977351,KE -1118977352,1118977631,US -1118977632,1118977663,LB -1118977664,1118978447,US +1118977352,1118977535,A2 +1118977536,1118977551,US +1118977552,1118977575,A2 +1118977576,1118977583,SA +1118977584,1118977631,A2 +1118977632,1118977663,NG +1118977664,1118977839,A2 +1118977840,1118977847,LB +1118977848,1118977879,A2 +1118977880,1118977887,NI +1118977888,1118978047,A2 +1118978048,1118978079,SA +1118978080,1118978111,A2 +1118978112,1118978439,SA +1118978440,1118978447,A2 1118978448,1118978463,LB -1118978464,1118979311,US -1118979312,1118979319,LB -1118979320,1118979455,US -1118979456,1118979471,LB -1118979472,1118979495,US +1118978464,1118978495,SA +1118978496,1118979071,A2 +1118979072,1118979231,SA +1118979232,1118979263,A2 +1118979264,1118979295,SA +1118979296,1118979327,LB +1118979328,1118979455,SA +1118979456,1118979479,LB +1118979480,1118979495,SA 1118979496,1118979503,LB -1118979504,1118979535,US -1118979536,1118979551,LB -1118979552,1118979567,US -1118979568,1118979575,LB -1118979576,1118979711,US +1118979504,1118979535,SA +1118979536,1118979575,LB +1118979576,1118979583,SA +1118979584,1118979711,A2 1118979712,1118979775,LB -1118979776,1118980095,US +1118979776,1118979839,A2 +1118979840,1118979855,NI +1118979856,1118979895,A2 +1118979896,1118979903,NI +1118979904,1118980095,A2 1118980096,1118980351,NG -1118980352,1118980607,US +1118980352,1118980607,A2 1118980608,1118980863,TZ -1118980864,1118981119,LC -1118981120,1118981375,US +1118980864,1118981119,AN +1118981120,1118981375,A2 1118981376,1118981631,IQ 1118981632,1118981687,EC -1118981688,1118981695,US +1118981688,1118981695,A2 1118981696,1118981735,SV 1118981736,1118981743,EC 1118981744,1118981751,SV 1118981752,1118981759,NG -1118981760,1118981791,US +1118981760,1118981783,A2 +1118981784,1118981791,NI 1118981792,1118981823,NG 1118981824,1118981831,EC -1118981832,1118981855,US +1118981832,1118981855,NI 1118981856,1118981863,EC -1118981864,1118982175,US -1118982176,1118982183,NI -1118982184,1118982191,US +1118981864,1118981871,NI +1118981872,1118981879,A2 +1118981880,1118981887,NI +1118981888,1118982175,A2 +1118982176,1118982183,NG +1118982184,1118982191,A2 1118982192,1118982199,KE -1118982200,1118982215,US -1118982216,1118982231,NG -1118982232,1118982239,NI -1118982240,1118982271,NG -1118982272,1118982279,NI -1118982280,1118982287,US +1118982200,1118982207,US +1118982208,1118982215,A2 +1118982216,1118982279,NG +1118982280,1118982287,A2 1118982288,1118982295,NG -1118982296,1118982303,US +1118982296,1118982303,A2 1118982304,1118982311,KE 1118982312,1118982327,NG -1118982328,1118982335,US +1118982328,1118982335,A2 1118982336,1118982367,NG -1118982368,1118982383,US -1118982384,1118982391,NI -1118982392,1118982399,US -1118982400,1118982407,NI -1118982408,1118982415,NG +1118982368,1118982383,A2 +1118982384,1118982391,NG +1118982392,1118982399,A2 +1118982400,1118982415,NG 1118982416,1118982431,SV -1118982432,1118982439,NI -1118982440,1118982447,NG +1118982432,1118982447,NG 1118982448,1118982463,US -1118982464,1118982471,NI -1118982472,1118982479,NG -1118982480,1118982487,US -1118982488,1118982495,NI -1118982496,1118982543,NG -1118982544,1118982551,NI +1118982464,1118982479,NG +1118982480,1118982487,A2 +1118982488,1118982551,NG 1118982552,1118982559,US -1118982560,1118982567,NI +1118982560,1118982567,NG 1118982568,1118982575,US -1118982576,1118982583,NI +1118982576,1118982583,NG 1118982584,1118982591,CM 1118982592,1118982599,NG -1118982600,1118982607,US -1118982608,1118982615,NI -1118982616,1118982655,NG -1118982656,1118982783,US +1118982600,1118982607,A2 +1118982608,1118982647,NG +1118982648,1118982783,A2 1118982784,1118982911,NG 1118982912,1118982919,LB -1118982920,1118982927,US -1118982928,1118982935,NI -1118982936,1118983039,US -1118983040,1118983047,NG -1118983048,1118983079,US +1118982920,1118982927,A2 +1118982928,1118982935,NG +1118982936,1118983079,A2 1118983080,1118983087,NG -1118983088,1118983167,US +1118983088,1118983167,A2 1118983168,1118983199,AE -1118983200,1118983295,US +1118983200,1118983279,SA +1118983280,1118983295,A2 1118983296,1118983359,AE -1118983360,1118983423,US +1118983360,1118983423,A2 1118983424,1118983679,NI 1118983680,1118983743,TZ 1118983744,1118983759,VE -1118983760,1118983871,US +1118983760,1118983871,A2 1118983872,1118983879,TZ -1118983880,1118984703,US +1118983880,1118983919,US +1118983920,1118984447,A2 +1118984448,1118984703,SA 1118984704,1118984775,TZ 1118984776,1118984783,IQ -1118984784,1118984791,US +1118984784,1118984791,A2 1118984792,1118984799,NG -1118984800,1118984831,US +1118984800,1118984807,A2 +1118984808,1118984815,LB +1118984816,1118984831,A2 1118984832,1118984839,LB -1118984840,1118984855,US +1118984840,1118984847,SA +1118984848,1118984855,A2 1118984856,1118984863,IQ 1118984864,1118984887,TZ -1118984888,1118984959,US +1118984888,1118984895,LB +1118984896,1118984943,SA +1118984944,1118984951,LB +1118984952,1118984959,SA 1118984960,1118985215,VE -1118985216,1118985983,US +1118985216,1118985983,A2 1118985984,1118986111,NG -1118986112,1118986239,US +1118986112,1118986239,A2 1118986240,1118987007,GB 1118987008,1118987263,US 1118987264,1118988287,KE -1118988288,1118988543,CA +1118988288,1118988543,A2 1118988544,1118988575,NG -1118988576,1118988615,US +1118988576,1118988615,A2 1118988616,1118988623,GB -1118988624,1118988735,US +1118988624,1118988735,A2 1118988736,1118988751,GB -1118988752,1118988799,US +1118988752,1118988799,A2 1118988800,1118989055,VE 1118989056,1118989183,KE 1118989184,1118989311,GB 1118989312,1118989823,KE -1118989824,1118989951,US +1118989824,1118989951,A2 1118989952,1118990079,FR -1118990080,1118990719,US +1118990080,1118990271,A2 +1118990272,1118990303,US +1118990304,1118990719,A2 1118990720,1118990727,KE -1118990728,1118991487,US +1118990728,1118991487,A2 1118991488,1118991615,LR -1118991616,1118992639,US +1118991616,1118992639,A2 1118992640,1118992655,KE -1118992656,1118993919,US +1118992656,1118992735,A2 +1118992736,1118992743,SA +1118992744,1118992767,A2 +1118992768,1118992839,US +1118992840,1118993919,A2 1118993920,1118994431,GY -1118994432,1119109119,US -1119109120,1119113215,CA -1119113216,1119150079,US -1119158272,1119191039,US -1119195136,1119199231,US -1119207424,1119211519,US +1118994432,1119023735,US +1119023736,1119023743,UY +1119023744,1119109119,US +1119109120,1119111167,CA +1119113216,1119144927,US +1119144928,1119144935,AU +1119144936,1119150079,US +1119158272,1119166855,US +1119166856,1119166871,HT +1119166872,1119167079,US +1119167080,1119167087,CA +1119167088,1119167119,US +1119167120,1119167127,MX +1119167128,1119167231,US +1119167232,1119167239,CA +1119167240,1119167359,US +1119167360,1119167367,CA +1119167368,1119167407,US +1119167408,1119167415,CA +1119167416,1119167839,US +1119167840,1119167855,CA +1119167856,1119167895,US +1119167896,1119167903,CA +1119167904,1119168023,US +1119168024,1119168031,CA +1119168032,1119168055,US +1119168056,1119168063,MX +1119168064,1119168183,US +1119168184,1119168191,CA +1119168192,1119168687,US +1119168688,1119168695,CA +1119168696,1119168799,US +1119168800,1119168807,MX +1119168808,1119168975,US +1119168976,1119168983,CA +1119168984,1119169359,US +1119169360,1119169367,HT +1119169368,1119169535,US +1119169536,1119169543,CA +1119169544,1119169599,US +1119169600,1119169615,MX +1119169616,1119170439,US +1119170440,1119170447,CA +1119170448,1119170623,US +1119170624,1119170631,CA +1119170632,1119171207,US +1119171208,1119171215,CA +1119171216,1119171383,US +1119171384,1119171391,CA +1119171392,1119172895,US +1119172896,1119172991,MX +1119172992,1119173007,US +1119173008,1119173095,MX +1119173096,1119173119,US +1119173120,1119173143,MX +1119173144,1119173151,US +1119173152,1119173263,MX +1119173264,1119173271,US +1119173272,1119173367,MX +1119173368,1119173375,US +1119173376,1119173399,MX +1119173400,1119173407,US +1119173408,1119173471,MX +1119173472,1119173495,US +1119173496,1119173527,MX +1119173528,1119173535,US +1119173536,1119173543,MX +1119173544,1119173551,US +1119173552,1119173575,MX +1119173576,1119173583,US +1119173584,1119173655,MX +1119173656,1119173671,US +1119173672,1119173679,MX +1119173680,1119173703,US +1119173704,1119173759,MX +1119173760,1119173767,US +1119173768,1119173783,MX +1119173784,1119173791,US +1119173792,1119173815,MX +1119173816,1119173823,US +1119173824,1119173847,MX +1119173848,1119173863,US +1119173864,1119173879,MX +1119173880,1119173935,US +1119173936,1119173983,MX +1119173984,1119173999,US +1119174000,1119174015,MX +1119174016,1119174023,US +1119174024,1119174031,GT +1119174032,1119174039,MX +1119174040,1119174047,US +1119174048,1119174207,MX +1119174208,1119174215,US +1119174216,1119174247,GT +1119174248,1119174287,US +1119174288,1119174319,MX +1119174320,1119174343,US +1119174344,1119174351,GT +1119174352,1119174359,MX +1119174360,1119174399,US +1119174400,1119174407,GT +1119174408,1119174471,MX +1119174472,1119174479,US +1119174480,1119174519,MX +1119174520,1119174527,US +1119174528,1119174543,MX +1119174544,1119211519,US 1119211520,1119215615,CA 1119215616,1119289343,US 1119289344,1119354879,CA -1119354880,1119428607,US +1119354880,1119369407,US +1119369408,1119369415,UM +1119369416,1119428607,US 1119428608,1119432703,VI 1119432704,1119436799,CA 1119436800,1119440895,US 1119440896,1119444991,CA -1119444992,1119449087,US -1119453184,1119469567,US +1119444992,1119446751,US +1119446752,1119446759,CO +1119446760,1119469567,US 1119469568,1119477759,CA -1119477760,1119502335,US +1119477760,1119486623,US +1119486624,1119486631,AU +1119486632,1119490015,US +1119490016,1119490047,IE +1119490048,1119490495,US +1119490496,1119490527,GI +1119490528,1119502335,US 1119502336,1119510527,CA -1119510528,1119555583,US -1119555584,1119559679,PR -1119559680,1119567871,US +1119510528,1119558143,US +1119558144,1119558655,PR +1119558656,1119567871,US 1119567872,1119571967,CA 1119571968,1119580159,US 1119580160,1119584255,CA -1119584256,1119592447,US -1119596544,1120041983,US +1119584256,1119999935,US +1119999936,1119999967,A2 +1119999968,1120015295,US +1120015296,1120015327,A2 +1120015328,1120041983,US 1120041984,1120042495,AR 1120042496,1120064511,US 1120064512,1120064767,AR -1120064768,1120076031,US -1120076032,1120076287,CA -1120076288,1120149503,US +1120064768,1120149503,US 1120149504,1120149599,CA 1120149600,1120149631,US 1120149632,1120150031,CA @@ -9305,9 +15764,14 @@ 1120152320,1120152575,US 1120152576,1120153599,CA 1120153600,1120272383,US -1120272384,1120281087,CA +1120272384,1120280575,CA +1120280576,1120280831,US +1120280832,1120280855,CA +1120280856,1120280863,US +1120280864,1120281087,CA 1120281088,1120281095,PG -1120281096,1120281111,CA +1120281096,1120281103,US +1120281104,1120281111,CA 1120281112,1120281119,US 1120281120,1120281135,ZA 1120281136,1120281375,CA @@ -9315,63 +15779,247 @@ 1120281384,1120281391,US 1120281392,1120281407,ZA 1120281408,1120281599,CA -1120281600,1120282111,US -1120282112,1120286719,CA -1120286720,1120288767,US -1120288768,1120299007,CA +1120281600,1120282367,US +1120282368,1120282623,SY +1120282624,1120282879,US +1120282880,1120283135,SY +1120283136,1120283391,US +1120283392,1120283647,CA +1120283648,1120284671,EC +1120284672,1120286719,CA +1120286720,1120289023,US +1120289024,1120290303,CA +1120290304,1120290559,US +1120290560,1120293119,CA +1120293120,1120293631,US +1120293632,1120299007,CA 1120299008,1120299263,PK -1120299264,1120299519,CA +1120299264,1120299519,US 1120299520,1120300799,PK -1120300800,1120306175,CA +1120300800,1120301055,US +1120301056,1120306175,CA 1120306176,1120306943,PH -1120306944,1120310015,CA -1120310016,1120310271,PH -1120310272,1120311807,CA -1120311808,1120312447,PH +1120306944,1120307199,US +1120307200,1120307967,EC +1120307968,1120308223,PH +1120308224,1120309247,HT +1120309248,1120310015,CA +1120310016,1120310783,PH +1120310784,1120311807,CA +1120311808,1120312063,US +1120312064,1120312447,PH 1120312448,1120312575,US 1120312576,1120312831,PH -1120312832,1120321535,CA +1120312832,1120313343,CA +1120313344,1120313599,US +1120313600,1120315135,CA +1120315136,1120315391,US +1120315392,1120321535,CA 1120321536,1120346111,US -1120350208,1120370943,US -1120370944,1120371199,CA -1120371200,1120372735,US -1120372736,1120372991,CA -1120372992,1120373503,US -1120373504,1120374015,CA -1120374016,1120375183,US -1120375184,1120375199,CA -1120375200,1120376831,US -1120376832,1120377087,CA -1120377088,1120377343,US -1120377344,1120377599,CA -1120377600,1120377855,US -1120377856,1120378367,CA +1120346112,1120350207,CA +1120350208,1120370687,US +1120370688,1120371511,CA +1120371512,1120371519,US +1120371520,1120371647,CA +1120371648,1120371651,US +1120371652,1120371711,CA +1120371712,1120372063,US +1120372064,1120372079,CA +1120372080,1120372223,US +1120372224,1120372479,CA +1120372480,1120372735,US +1120372736,1120374047,CA +1120374048,1120374063,US +1120374064,1120374271,CA +1120374272,1120374303,US +1120374304,1120374399,CA +1120374400,1120374415,US +1120374416,1120374479,CA +1120374480,1120374487,US +1120374488,1120374511,CA +1120374512,1120374527,US +1120374528,1120375231,CA +1120375232,1120375239,US +1120375240,1120375243,CA +1120375244,1120375263,US +1120375264,1120376063,CA +1120376064,1120376079,US +1120376080,1120376095,CA +1120376096,1120376127,US +1120376128,1120376223,CA +1120376224,1120376239,US +1120376240,1120376255,MX +1120376256,1120376287,CA +1120376288,1120376303,US +1120376304,1120376327,CA +1120376328,1120376383,US +1120376384,1120376447,CA +1120376448,1120376479,US +1120376480,1120376494,CA +1120376495,1120376559,US +1120376560,1120376647,CA +1120376648,1120376671,US +1120376672,1120376679,MX +1120376680,1120376687,CA +1120376688,1120376767,US +1120376768,1120376815,CA +1120376816,1120376831,US +1120376832,1120377167,CA +1120377168,1120377199,US +1120377200,1120377215,CA +1120377216,1120377247,US +1120377248,1120377791,CA +1120377792,1120377823,US +1120377824,1120378367,CA 1120378368,1120378623,US -1120378624,1120378879,CA -1120378880,1120379391,US -1120379392,1120379647,CA -1120379648,1120380415,US -1120380416,1120380431,CA -1120380432,1120380511,US -1120380512,1120380543,CA -1120380544,1120381439,US -1120381440,1120381695,CA -1120381696,1120382463,US -1120382464,1120382719,CA -1120382720,1120383999,US -1120384000,1120385023,CA -1120385024,1120509951,US +1120378624,1120378919,CA +1120378920,1120378927,US +1120378928,1120379039,CA +1120379040,1120379071,PA +1120379072,1120380027,CA +1120380028,1120380031,US +1120380032,1120380095,CA +1120380096,1120380127,US +1120380128,1120380131,CA +1120380132,1120380415,US +1120380416,1120380431,VG +1120380432,1120380447,CA +1120380448,1120380479,US +1120380480,1120380639,CA +1120380640,1120380655,US +1120380656,1120380659,CA +1120380660,1120380663,US +1120380664,1120380671,CA +1120380672,1120380927,US +1120380928,1120381055,CA +1120381056,1120381071,US +1120381072,1120381087,PA +1120381088,1120381095,US +1120381096,1120381103,CA +1120381104,1120381119,US +1120381120,1120382231,CA +1120382232,1120382239,US +1120382240,1120382271,CA +1120382272,1120382335,US +1120382336,1120382431,CA +1120382432,1120382463,US +1120382464,1120382975,CA +1120382976,1120383263,US +1120383264,1120383327,CA +1120383328,1120383343,US +1120383344,1120383367,CA +1120383368,1120383423,US +1120383424,1120383439,CA +1120383440,1120383775,US +1120383776,1120383807,CA +1120383808,1120383839,US +1120383840,1120383951,CA +1120383952,1120383999,US +1120384000,1120384095,CA +1120384096,1120384127,US +1120384128,1120385023,CA +1120385024,1120385135,US +1120385136,1120385143,CA +1120385144,1120385151,US +1120385152,1120385183,GB +1120385184,1120385535,CA +1120385536,1120485759,US +1120485760,1120485887,CA +1120485888,1120486079,US +1120486080,1120486143,IN +1120486144,1120486399,US +1120486400,1120486911,CA +1120486912,1120487039,US +1120487040,1120487167,CA +1120487168,1120487199,US +1120487200,1120487231,CA +1120487232,1120487359,US +1120487360,1120487391,CA +1120487392,1120487423,BE +1120487424,1120487679,CA +1120487680,1120487935,US +1120487936,1120488191,CA +1120488192,1120488447,US +1120488448,1120488703,CA +1120488704,1120488767,US +1120488768,1120488799,VE +1120488800,1120488831,IL +1120488832,1120488863,CA +1120488864,1120488895,BE +1120488896,1120488927,KN +1120488928,1120489215,US +1120489216,1120489343,CA +1120489344,1120489471,US +1120489472,1120489727,CA +1120489728,1120489983,US +1120489984,1120490111,SG +1120490112,1120490751,CA +1120490752,1120490783,GB +1120490784,1120491007,US +1120491008,1120491775,CA +1120491776,1120492415,US +1120492416,1120492543,FR +1120492544,1120493055,CA +1120493056,1120493087,IN +1120493088,1120493183,US +1120493184,1120493215,CA +1120493216,1120493247,BE +1120493248,1120493311,US +1120493312,1120493567,CA +1120493568,1120493823,US +1120493824,1120494079,CA +1120494080,1120494335,US +1120494336,1120494591,CA +1120494592,1120495359,US +1120495360,1120495615,CA +1120495616,1120495743,US +1120495744,1120495871,SG +1120495872,1120496223,US +1120496224,1120496255,BE +1120496256,1120496287,CA +1120496288,1120496385,US +1120496386,1120496638,CA +1120496639,1120496639,US +1120496640,1120497023,CA +1120497024,1120497151,IN +1120497152,1120497183,BE +1120497184,1120497215,US +1120497216,1120497247,BE +1120497248,1120497375,US +1120497376,1120497663,CA +1120497664,1120497791,US +1120497792,1120497919,AU +1120497920,1120497983,US +1120497984,1120498013,BE +1120498014,1120498143,US +1120498144,1120498175,CA +1120498176,1120498943,US +1120498944,1120499199,CA +1120499200,1120499487,US +1120499488,1120499519,CA +1120499520,1120499583,US +1120499584,1120499615,FR +1120499616,1120499647,IN +1120499648,1120500639,US +1120500640,1120500671,BE +1120500672,1120501247,US +1120501248,1120501503,CA +1120501504,1120509951,US 1120509952,1120516095,SV 1120516096,1120517375,US 1120517376,1120517631,AR 1120517632,1120517887,US 1120517888,1120518143,CL 1120518144,1120534527,CA -1120534528,1120641023,US +1120534528,1120568639,US +1120568640,1120568671,CA +1120568672,1120575167,US +1120575168,1120575199,CA +1120575200,1120616807,US +1120616808,1120616815,CA +1120616816,1120641023,US 1120641024,1120657407,CA -1120657408,1120733183,US -1120733184,1120735231,BB -1120735232,1120735487,US +1120657408,1120735487,US 1120735488,1120735743,BB 1120735744,1120736207,US 1120736208,1120736223,PY @@ -9392,16 +16040,45 @@ 1120743424,1120743679,KN 1120743680,1120744447,US 1120744448,1120744703,KN -1120744704,1120804863,US -1120808960,1120849919,US +1120744704,1120854015,US 1120854016,1120862207,CA 1120862208,1120870399,US -1120874496,1120886783,US +1120874496,1120874519,A2 +1120874520,1120874527,US +1120874528,1120874631,A2 +1120874632,1120874639,US +1120874640,1120874655,A2 +1120874656,1120874703,US +1120874704,1120874719,CA +1120874720,1120874727,A2 +1120874728,1120874751,US +1120874752,1120874783,A2 +1120874784,1120874815,US +1120874816,1120874855,A2 +1120874856,1120874871,US +1120874872,1120874911,A2 +1120874912,1120874935,US +1120874936,1120874943,A2 +1120874944,1120874959,CA +1120874960,1120874967,A2 +1120874968,1120874975,US +1120874976,1120874983,A2 +1120874984,1120875007,US +1120875008,1120875263,A2 +1120875264,1120876287,US +1120876288,1120876543,A2 +1120876544,1120876567,JO +1120876568,1120876575,A2 +1120876576,1120876591,JO +1120876592,1120876599,A2 +1120876600,1120876607,JO +1120876608,1120876799,A2 +1120876800,1120878359,US +1120878360,1120878591,A2 +1120878592,1120886783,US 1120886784,1120894975,CA 1120894976,1120911359,US -1120911360,1120913383,CA -1120913384,1120913391,GE -1120913392,1120914415,CA +1120911360,1120914415,CA 1120914416,1120914431,AT 1120914432,1120914687,CA 1120914688,1120914719,AG @@ -9412,49 +16089,495 @@ 1121005568,1121009663,CA 1121009664,1121038335,US 1121038336,1121042431,CA -1121042432,1121198079,US -1121202176,1121230847,US -1121230848,1121239039,CA +1121042432,1121230847,US +1121230848,1121232119,CA +1121232120,1121232127,US +1121232128,1121233279,CA +1121233280,1121233311,DE +1121233312,1121233455,CA +1121233456,1121233463,US +1121233464,1121233471,DE +1121233472,1121233575,CA +1121233576,1121233583,US +1121233584,1121233599,DE +1121233600,1121239039,CA 1121239040,1121247231,US -1121247232,1121247527,CA +1121247232,1121247247,CA +1121247248,1121247255,AG +1121247256,1121247263,CA +1121247264,1121247271,CR +1121247272,1121247279,CA +1121247280,1121247287,GI +1121247288,1121247295,CY +1121247296,1121247487,CA +1121247488,1121247495,VG +1121247496,1121247503,CA +1121247504,1121247511,AW +1121247512,1121247519,VG +1121247520,1121247527,BZ 1121247528,1121247535,GI 1121247536,1121247543,BZ -1121247544,1121247663,CA -1121247664,1121247679,BZ -1121247680,1121248127,CA +1121247544,1121247551,CA +1121247552,1121247559,VG +1121247560,1121247567,CA +1121247568,1121247583,PA +1121247584,1121247591,CY +1121247592,1121247615,CA +1121247616,1121247631,BZ +1121247632,1121247639,AW +1121247640,1121247647,VG +1121247648,1121247663,US +1121247664,1121247695,BZ +1121247696,1121247743,CA +1121247744,1121247775,BZ +1121247776,1121247823,CA +1121247824,1121247855,AG +1121247856,1121247967,CA +1121247968,1121247999,CR +1121248000,1121248007,AG +1121248008,1121248015,BZ +1121248016,1121248039,CA +1121248040,1121248055,AG +1121248056,1121248063,AW +1121248064,1121248079,AG +1121248080,1121248095,CA +1121248096,1121248111,AG +1121248112,1121248127,CA 1121248128,1121248135,MT -1121248136,1121248311,CA +1121248136,1121248159,CA +1121248160,1121248255,AG +1121248256,1121248287,CA +1121248288,1121248303,BZ +1121248304,1121248311,KN 1121248312,1121248319,MT -1121248320,1121248343,CA +1121248320,1121248335,CA +1121248336,1121248343,VG 1121248344,1121248351,BZ -1121248352,1121248407,CA +1121248352,1121248367,CY +1121248368,1121248383,CA +1121248384,1121248399,VG +1121248400,1121248407,CA 1121248408,1121248431,GB -1121248432,1121248479,CA -1121248480,1121248495,BZ -1121248496,1121248799,CA +1121248432,1121248447,CA +1121248448,1121248495,BZ +1121248496,1121248783,CA +1121248784,1121248799,VG 1121248800,1121248831,GI -1121248832,1121248911,CA +1121248832,1121248863,CA +1121248864,1121248879,VG +1121248880,1121248911,CA 1121248912,1121248919,BZ -1121248920,1121250239,CA -1121250240,1121250303,GI +1121248920,1121248959,VG +1121248960,1121248983,CA +1121248984,1121248991,AW +1121248992,1121249023,VG +1121249024,1121249279,CA +1121249280,1121249375,SE +1121249376,1121249383,VG +1121249384,1121249407,CA +1121249408,1121249439,AG +1121249440,1121249535,CA +1121249536,1121249543,BZ +1121249544,1121249551,AG +1121249552,1121249599,CA +1121249600,1121249615,AW +1121249616,1121249631,VG +1121249632,1121249743,CA +1121249744,1121249751,CR +1121249752,1121249759,CA +1121249760,1121249775,BZ +1121249776,1121249791,CA +1121249792,1121250047,AG +1121250048,1121250079,CR +1121250080,1121250095,AG +1121250096,1121250111,CA +1121250112,1121250127,CR +1121250128,1121250151,CA +1121250152,1121250159,GB +1121250160,1121250175,CA +1121250176,1121250183,AW +1121250184,1121250207,BZ +1121250208,1121250239,CA +1121250240,1121250303,GB 1121250304,1121250815,BZ -1121250816,1121251071,CA +1121250816,1121250879,AG +1121250880,1121250911,CA +1121250912,1121250927,VG +1121250928,1121250935,CA +1121250936,1121251007,BZ +1121251008,1121251015,VG +1121251016,1121251039,CA +1121251040,1121251047,CR +1121251048,1121251055,AW +1121251056,1121251071,CA 1121251072,1121251079,GB -1121251080,1121251607,CA +1121251080,1121251087,CA +1121251088,1121251103,CY +1121251104,1121251135,CA +1121251136,1121251167,AG +1121251168,1121251199,VG +1121251200,1121251263,AW +1121251264,1121251271,CA +1121251272,1121251279,KN +1121251280,1121251287,CA +1121251288,1121251295,MU +1121251296,1121251311,IM +1121251312,1121251583,CA +1121251584,1121251591,BZ +1121251592,1121251607,CA 1121251608,1121251615,BZ -1121251616,1121251663,CA +1121251616,1121251647,NL +1121251648,1121251663,CA 1121251664,1121251671,MT -1121251672,1121251727,CA -1121251728,1121251775,BZ -1121251776,1121251839,CA +1121251672,1121251679,CA +1121251680,1121251687,AG +1121251688,1121251775,BZ +1121251776,1121251791,CA +1121251792,1121251807,VG +1121251808,1121251831,CA +1121251832,1121251839,VG 1121251840,1121251847,BZ -1121251848,1121252863,CA +1121251848,1121251871,CA +1121251872,1121251887,VG +1121251888,1121251903,CA +1121251904,1121251935,AG +1121251936,1121251943,CY +1121251944,1121251951,PA +1121251952,1121251967,GB +1121251968,1121251983,PA +1121251984,1121251991,CA +1121251992,1121251999,AG +1121252000,1121252063,CA +1121252064,1121252359,AG +1121252360,1121252375,CA +1121252376,1121252383,PA +1121252384,1121252391,CR +1121252392,1121252399,CA +1121252400,1121252415,PA +1121252416,1121252479,GI +1121252480,1121252607,CR +1121252608,1121252671,AW +1121252672,1121252735,BZ +1121252736,1121252863,CA 1121252864,1121253119,BZ -1121253120,1121255423,CA -1121255424,1121652735,US -1121656832,1121697791,US -1121714176,1121751039,US -1121755136,1121878015,US +1121253120,1121253887,CA +1121253888,1121254143,BZ +1121254144,1121254151,CA +1121254152,1121254159,AG +1121254160,1121254167,GI +1121254168,1121254191,CA +1121254192,1121254199,CR +1121254200,1121254207,AW +1121254208,1121254215,GI +1121254216,1121254223,CA +1121254224,1121254231,BZ +1121254232,1121254255,CR +1121254256,1121254271,AG +1121254272,1121255423,CA +1121255424,1121468463,US +1121468464,1121468479,AR +1121468480,1121468495,US +1121468496,1121468511,PK +1121468512,1121468519,AU +1121468520,1121468527,IN +1121468528,1121468551,US +1121468552,1121468559,CA +1121468560,1121468567,US +1121468568,1121468575,AU +1121468576,1121468591,US +1121468592,1121468600,AU +1121468601,1121468911,US +1121468912,1121468927,GB +1121468928,1121468967,US +1121468968,1121468975,CA +1121468976,1121469175,US +1121469176,1121469183,CA +1121469184,1121469367,US +1121469368,1121469375,CA +1121469376,1121469839,US +1121469840,1121469847,AU +1121469848,1121469871,US +1121469872,1121469879,SE +1121469880,1121469895,US +1121469896,1121469903,GB +1121469904,1121469911,US +1121469912,1121469919,PH +1121469920,1121470015,US +1121470016,1121470047,AU +1121470048,1121470175,US +1121470176,1121470191,CA +1121470192,1121470215,US +1121470216,1121470223,CA +1121470224,1121470263,US +1121470264,1121470271,CA +1121470272,1121470311,US +1121470312,1121470319,IL +1121470320,1121470423,US +1121470424,1121470463,NL +1121470464,1121470551,US +1121470552,1121470559,LB +1121470560,1121470583,US +1121470584,1121470591,AU +1121470592,1121470703,US +1121470704,1121470711,VU +1121470712,1121470727,US +1121470728,1121470743,CA +1121470744,1121470759,US +1121470760,1121470767,FR +1121470768,1121470815,US +1121470816,1121470831,AU +1121470832,1121470847,US +1121470848,1121470863,AU +1121470864,1121470871,US +1121470872,1121470879,AU +1121470880,1121471063,US +1121471064,1121471071,AU +1121471072,1121471087,US +1121471088,1121471095,AU +1121471096,1121471127,US +1121471128,1121471135,AU +1121471136,1121471151,US +1121471152,1121471159,CH +1121471160,1121471167,US +1121471168,1121471175,CA +1121471176,1121471279,US +1121471280,1121471295,GB +1121471296,1121471375,US +1121471376,1121471391,DK +1121471392,1121471471,US +1121471472,1121471487,CA +1121471488,1121471503,MY +1121471504,1121471511,US +1121471512,1121471519,BR +1121471520,1121471527,US +1121471528,1121471535,EC +1121471536,1121471559,US +1121471560,1121471575,CA +1121471576,1121471591,US +1121471592,1121471599,CA +1121471600,1121471623,US +1121471624,1121471631,CA +1121471632,1121471655,US +1121471656,1121471663,CA +1121471664,1121471671,AR +1121471672,1121471703,US +1121471704,1121471711,JP +1121471712,1121471719,UA +1121471720,1121471727,IT +1121471728,1121471935,US +1121471936,1121471943,CA +1121471944,1121471951,IN +1121471952,1121471975,US +1121471976,1121471983,CA +1121471984,1121471999,US +1121472000,1121472007,BE +1121472008,1121472047,US +1121472048,1121472055,MY +1121472056,1121472263,US +1121472264,1121472271,LK +1121472272,1121472287,US +1121472288,1121472303,IN +1121472304,1121472375,US +1121472376,1121472447,AU +1121472448,1121472463,US +1121472464,1121472471,CA +1121472472,1121472479,ES +1121472480,1121472511,US +1121472512,1121472519,NZ +1121472520,1121472535,CA +1121472536,1121472559,US +1121472560,1121472567,IN +1121472568,1121472655,US +1121472656,1121472663,UA +1121472664,1121472727,US +1121472728,1121472735,CA +1121472736,1121472743,LB +1121472744,1121472751,GB +1121472752,1121472775,US +1121472776,1121472807,RU +1121472808,1121472831,US +1121472832,1121472839,LB +1121472840,1121472847,US +1121472848,1121472863,IN +1121472864,1121472871,US +1121472872,1121472879,SE +1121472880,1121472887,IT +1121472888,1121472927,US +1121472928,1121472935,GB +1121472936,1121473175,US +1121473176,1121473183,FR +1121473184,1121473199,US +1121473200,1121473207,GB +1121473208,1121473239,US +1121473240,1121473247,ES +1121473248,1121473279,US +1121473280,1121473295,AU +1121473296,1121473303,US +1121473304,1121473311,AU +1121473312,1121473327,US +1121473328,1121473335,AG +1121473336,1121473439,US +1121473440,1121473471,AU +1121473472,1121473479,US +1121473480,1121473487,CA +1121473488,1121473599,US +1121473600,1121473607,GB +1121473608,1121473615,CA +1121473616,1121473871,US +1121473872,1121473887,NL +1121473888,1121474007,US +1121474008,1121474015,DE +1121474016,1121474031,US +1121474032,1121474039,AG +1121474040,1121474063,US +1121474064,1121474071,GB +1121474072,1121474079,SI +1121474080,1121474095,US +1121474096,1121474111,CA +1121474112,1121474151,US +1121474152,1121474159,CA +1121474160,1121474303,US +1121474304,1121474319,VE +1121474320,1121474351,US +1121474352,1121474359,NZ +1121474360,1121474367,US +1121474368,1121474375,AU +1121474376,1121474383,US +1121474384,1121474415,AU +1121474416,1121474447,US +1121474448,1121474455,AU +1121474456,1121474511,US +1121474512,1121474527,UA +1121474528,1121474535,US +1121474536,1121474543,GB +1121474544,1121474591,US +1121474592,1121474607,CA +1121474608,1121474927,US +1121474928,1121474935,AU +1121474936,1121475135,US +1121475136,1121475151,FR +1121475152,1121475199,US +1121475200,1121475215,IN +1121475216,1121475295,US +1121475296,1121475327,BD +1121475328,1121475967,US +1121475968,1121476031,AU +1121476032,1121476191,US +1121476192,1121476223,BD +1121476224,1121476431,US +1121476432,1121476439,JP +1121476440,1121476927,US +1121476928,1121476935,IN +1121476936,1121477391,US +1121477392,1121477399,IN +1121477400,1121477415,US +1121477416,1121477423,NZ +1121477424,1121477431,US +1121477432,1121477439,IE +1121477440,1121477447,ID +1121477448,1121477551,US +1121477552,1121477567,CA +1121477568,1121477599,US +1121477600,1121477607,AU +1121477608,1121477935,US +1121477936,1121477943,CA +1121477944,1121478023,US +1121478024,1121478031,GB +1121478032,1121478079,US +1121478080,1121478087,CA +1121478088,1121478095,US +1121478096,1121478111,CA +1121478112,1121478167,US +1121478168,1121478175,AU +1121478176,1121478207,US +1121478208,1121478239,GB +1121478240,1121478343,US +1121478344,1121478367,AU +1121478368,1121478463,US +1121478464,1121478471,GR +1121478472,1121478495,US +1121478496,1121478503,NO +1121478504,1121478511,US +1121478512,1121478519,RU +1121478520,1121478527,KE +1121478528,1121478591,US +1121478592,1121478655,AU +1121478656,1121478687,US +1121478688,1121478703,NZ +1121478704,1121478967,US +1121478968,1121478975,AU +1121478976,1121478991,US +1121478992,1121478999,IN +1121479000,1121479023,US +1121479024,1121479031,CY +1121479032,1121479143,US +1121479144,1121479167,EG +1121479168,1121479215,US +1121479216,1121479231,CA +1121479232,1121479295,US +1121479296,1121479303,HK +1121479304,1121479343,CA +1121479344,1121479359,US +1121479360,1121479367,NZ +1121479368,1121479407,US +1121479408,1121479415,CA +1121479416,1121479679,US +1121479680,1121479687,GB +1121479688,1121479695,CA +1121479696,1121479759,US +1121479760,1121479783,AU +1121479784,1121479831,US +1121479832,1121479839,NZ +1121479840,1121479847,IN +1121479848,1121479871,US +1121479872,1121479887,PK +1121479888,1121479919,US +1121479920,1121479927,AU +1121479928,1121480783,US +1121480784,1121480791,TH +1121480792,1121480799,US +1121480800,1121480807,CA +1121480808,1121480847,US +1121480848,1121480855,CY +1121480856,1121480903,US +1121480904,1121480911,HK +1121480912,1121480959,US +1121480960,1121480967,AU +1121480968,1121480991,US +1121480992,1121481023,AU +1121481024,1121481039,US +1121481040,1121481047,AU +1121481048,1121481055,US +1121481056,1121481087,AU +1121481088,1121481239,US +1121481240,1121481247,AU +1121481248,1121481407,US +1121481408,1121481415,GB +1121481416,1121481439,US +1121481440,1121481447,AT +1121481448,1121482799,US +1121482800,1121482807,AU +1121482808,1121483567,US +1121483568,1121483575,PT +1121483576,1121483759,US +1121483760,1121483775,FR +1121483776,1121655071,US +1121655072,1121655103,RU +1121655104,1121655231,US +1121655232,1121655263,AR +1121655264,1121655439,US +1121655440,1121655447,VE +1121655448,1121656063,US +1121656064,1121656095,NZ +1121656096,1121714975,US +1121714976,1121714991,AU +1121714992,1121715967,US +1121715968,1121716095,IT +1121716096,1121717431,US +1121717432,1121717439,JP +1121717440,1121717759,US +1121717760,1121718015,IT +1121718016,1121878015,US 1121878016,1121910783,CA 1121910784,1122074623,US 1122074624,1122087935,CA @@ -9462,15 +16585,41 @@ 1122088192,1122091007,CA 1122091008,1122092799,US 1122092800,1122093055,CA -1122093056,1122140159,US -1122140160,1122144255,CA -1122148352,1122268047,US -1122268048,1122268055,AR -1122268056,1122269263,US -1122269264,1122269271,EG -1122269272,1122270207,US -1122270208,1122270215,EG -1122270216,1122320959,US +1122093056,1122093807,US +1122093808,1122093815,HK +1122093816,1122103471,US +1122103472,1122103479,BE +1122103480,1122108671,US +1122108672,1122108735,GR +1122108736,1122125978,US +1122125979,1122125988,PH +1122125989,1122125996,US +1122125997,1122126004,GB +1122126005,1122126239,US +1122126240,1122126249,GB +1122126250,1122126745,US +1122126746,1122126753,CH +1122126754,1122140159,US +1122140160,1122148351,CA +1122148352,1122179343,US +1122179344,1122179351,CA +1122179352,1122197599,US +1122197600,1122197607,FR +1122197608,1122197623,US +1122197624,1122197631,FR +1122197632,1122197695,US +1122197696,1122197759,GB +1122197760,1122197767,US +1122197768,1122197775,FR +1122197776,1122197823,US +1122197824,1122197831,GB +1122197832,1122197839,US +1122197840,1122197855,GB +1122197856,1122197887,US +1122197888,1122198015,GB +1122198016,1122203135,US +1122203136,1122203391,GB +1122203392,1122320959,US 1122320960,1122320995,PT 1122320996,1122411551,US 1122411552,1122411583,AU @@ -9486,19 +16635,70 @@ 1122451456,1122455551,CO 1122455552,1122476031,US 1122476032,1122480127,PR -1122480128,1122511103,US -1122511104,1122511359,VG -1122511360,1122535423,US +1122480128,1122480159,US +1122480160,1122480167,RU +1122480168,1122480207,US +1122480208,1122480223,GB +1122480224,1122480231,PL +1122480232,1122480343,US +1122480344,1122480351,PR +1122480352,1122480415,US +1122480416,1122480423,CL +1122480424,1122480447,US +1122480448,1122480455,PR +1122480456,1122480479,US +1122480480,1122480487,CA +1122480488,1122493055,US +1122493056,1122493183,ES +1122493184,1122493439,US +1122493440,1122494207,PR +1122494208,1122495231,US +1122495232,1122495999,PR +1122496000,1122497407,US +1122497408,1122497471,SV +1122497472,1122497535,US +1122497536,1122498303,PR +1122498304,1122498559,US +1122498560,1122498815,PR +1122498816,1122499327,US +1122499328,1122500095,PR +1122500096,1122525855,US +1122525856,1122525865,RU +1122525866,1122526096,US +1122526097,1122526111,RU +1122526112,1122526454,US +1122526455,1122526462,RU +1122526463,1122526517,US +1122526518,1122526541,HK +1122526542,1122526876,US +1122526877,1122526888,RU +1122526889,1122526925,US +1122526926,1122526939,RU +1122526940,1122528183,US +1122528184,1122528254,RU +1122528255,1122528603,US +1122528604,1122528613,ES +1122528614,1122528832,US +1122528833,1122528863,GR +1122528864,1122535423,US 1122535424,1122538495,KR -1122538496,1122540543,US -1122540544,1122540799,GB -1122540800,1122635775,US +1122538496,1122635775,US 1122635776,1122639871,CA -1122639872,1122729983,US -1122738176,1123115007,US -1123119104,1123123199,US +1122639872,1122667071,US +1122667072,1122667135,CH +1122667136,1122759247,US +1122759248,1122759263,CA +1122759264,1123057663,US +1123057664,1123061759,CA +1123061760,1123063807,US +1123063808,1123069951,CA +1123069952,1123071999,US +1123072000,1123074047,CA +1123074048,1123123199,US 1123123200,1123127295,CA -1123127296,1123180543,US +1123127296,1123165247,US +1123165248,1123165311,CA +1123165312,1123180543,US 1123180544,1123184639,CA 1123184640,1123319807,US 1123319808,1123323903,CA @@ -9508,22 +16708,24 @@ 1123534848,1123536895,AW 1123536896,1123582239,US 1123582240,1123582271,CY -1123582272,1123583327,US +1123582272,1123582399,US +1123582400,1123582431,DE +1123582432,1123582463,CA +1123582464,1123583327,US 1123583328,1123583359,CA 1123583360,1123583455,US 1123583456,1123583519,CY -1123583520,1123584703,US +1123583520,1123584351,US +1123584352,1123584383,DE +1123584384,1123584703,US 1123584704,1123584735,CA -1123584736,1123585535,US -1123585536,1123585791,CA -1123585792,1123586815,US -1123586816,1123587071,CA -1123587072,1123588863,US -1123588864,1123589119,CA -1123589120,1123590143,US +1123584736,1123588063,US +1123588064,1123588095,CY +1123588096,1123590143,US 1123590144,1123598335,VI 1123598336,1123651583,US 1123651584,1123655679,JM +1123655680,1123663871,US 1123663872,1123667967,SV 1123667968,1123670015,PR 1123670016,1123671039,US @@ -9534,20 +16736,37 @@ 1123801088,1123801343,RU 1123801344,1123848191,US 1123848192,1123852287,CA -1123852288,1123864575,US -1123868672,1123950591,US +1123852288,1123862080,US +1123862081,1123862270,RU +1123862271,1123862454,US +1123862455,1123862520,RU +1123862521,1123862592,US +1123862593,1123862782,RU +1123862783,1123862880,US +1123862881,1123862888,RU +1123862889,1123870063,US +1123870064,1123870071,GB +1123870072,1123870295,US +1123870296,1123870303,HK +1123870304,1123870343,US +1123870344,1123870351,HK +1123870352,1123950591,US 1123950592,1123958783,CA -1123958784,1125064703,US +1123958784,1124028511,US +1124028512,1124028543,NC +1124028544,1125064703,US 1125064704,1125065215,GB -1125065216,1125081087,US +1125065216,1125078719,US +1125078720,1125078751,PR +1125078752,1125081087,US 1125081088,1125081151,CL 1125081152,1125081183,CA 1125081184,1125081215,US 1125081216,1125081279,GB -1125081280,1125081855,US +1125081280,1125081311,PR +1125081312,1125081855,US 1125081856,1125082111,DE -1125082112,1125082239,MD -1125082240,1125082367,US +1125082112,1125082367,US 1125082368,1125082623,DE 1125082624,1125082655,US 1125082656,1125082687,UY @@ -9563,8 +16782,7 @@ 1125085136,1125085151,DE 1125085152,1125086079,US 1125086080,1125086143,AU -1125086144,1125086175,MD -1125086176,1125087999,US +1125086144,1125087999,US 1125088000,1125088255,CA 1125088256,1125090303,US 1125090304,1125090335,AU @@ -9629,7 +16847,8 @@ 1125097920,1125097983,IL 1125097984,1125099775,US 1125099776,1125100031,GB -1125100032,1125103487,US +1125100032,1125103359,US +1125103360,1125103487,A1 1125103488,1125103519,UY 1125103520,1125106063,US 1125106064,1125106111,CA @@ -9641,14 +16860,12 @@ 1125106256,1125106271,FR 1125106272,1125106303,US 1125106304,1125106367,DE -1125106368,1125106623,US -1125106624,1125106687,MD -1125106688,1125110271,US +1125106368,1125110271,US 1125110272,1125110335,GB 1125110336,1125110399,US 1125110400,1125110463,KW 1125110464,1125110783,US -1125110784,1125110911,TR +1125110784,1125110911,MA 1125110912,1125110927,UY 1125110928,1125110943,TW 1125110944,1125110959,CA @@ -9667,13 +16884,13 @@ 1125112448,1125112511,PL 1125112512,1125112767,US 1125112768,1125112783,GB -1125112784,1125115647,US +1125112784,1125112831,US +1125112832,1125113087,MA +1125113088,1125115647,US 1125115648,1125115663,ES 1125115664,1125115727,US 1125115728,1125115743,ES -1125115744,1125115855,US -1125115856,1125115871,BR -1125115872,1125116159,US +1125115744,1125116159,US 1125116160,1125116191,BR 1125116192,1125116223,TR 1125116224,1125116415,US @@ -9685,10 +16902,8 @@ 1125117056,1125117151,US 1125117152,1125117167,UY 1125117168,1125117183,US -1125117184,1125117439,MD -1125117440,1125117695,US -1125117696,1125117823,MD -1125117824,1125118495,US +1125117184,1125117439,MA +1125117440,1125118495,US 1125118496,1125118511,BR 1125118512,1125118527,US 1125118528,1125118559,UY @@ -9712,354 +16927,2853 @@ 1125120848,1125120863,US 1125120864,1125120895,GB 1125120896,1125121023,RO -1125121024,1125384191,US -1125416960,1125425151,US -1125449728,1125453823,US -1125477376,1125478399,US -1125482496,1125486591,US -1125490688,1125494783,US -1125546240,1125546495,US -1125548032,1125556223,US -1125597184,1125601279,US -1125613568,1125617663,US -1125638144,1126009343,US +1125121024,1125474303,US +1125474304,1125478399,CA +1125478400,1125479199,US +1125479200,1125479231,BR +1125479232,1125498879,US +1125498880,1125508095,CA +1125508096,1125508351,PA +1125508352,1125514495,CA +1125514496,1125514751,US +1125514752,1125515263,CA +1125515264,1125531647,US +1125531648,1125543935,CA +1125543936,1125545983,US +1125548032,1125552127,CA +1125552128,1125572607,US +1125572608,1125576703,CA +1125576704,1125613567,US +1125613568,1125617663,CA +1125617664,1125626111,US +1125626112,1125626367,IN +1125626368,1125626623,US +1125626624,1125626879,IN +1125626880,1125628671,US +1125628672,1125628703,NZ +1125628704,1126009343,US 1126009344,1126009599,AR -1126009600,1126899711,US -1126907904,1126924287,US +1126009600,1126504223,US +1126504224,1126504231,PR +1126504232,1126551767,US +1126551768,1126551775,PR +1126551776,1126604015,US +1126604016,1126604023,PR +1126604024,1126614439,US +1126614440,1126614447,PR +1126614448,1126671719,US +1126671720,1126671727,PR +1126671728,1126682719,US +1126682720,1126682727,PR +1126682728,1126682823,US +1126682824,1126682831,PR +1126682832,1126907535,US +1126907536,1126907543,ES +1126907544,1126924287,US 1126924288,1126928383,CA 1126928384,1126948863,US -1126948864,1126952959,CA +1126948864,1126949375,CA +1126949376,1126949503,GB +1126949504,1126949551,CA +1126949552,1126949559,GB +1126949560,1126949567,BZ +1126949568,1126949583,CA +1126949584,1126949591,LB +1126949592,1126949607,CA +1126949608,1126949615,CN +1126949616,1126949631,LB +1126949632,1126949695,CA +1126949696,1126949759,PK +1126949760,1126949823,CA +1126949824,1126949855,US +1126949856,1126950191,CA +1126950192,1126950199,ES +1126950200,1126950207,HR +1126950208,1126950303,CA +1126950304,1126950335,US +1126950336,1126950367,CA +1126950368,1126950399,US +1126950400,1126950415,CA +1126950416,1126950423,PK +1126950424,1126950431,RU +1126950432,1126950463,CA +1126950464,1126950495,IT +1126950496,1126950527,US +1126950528,1126950559,CA +1126950560,1126950591,US +1126950592,1126950599,CA +1126950600,1126950607,CN +1126950608,1126950623,CA +1126950624,1126950655,FR +1126950656,1126950783,CA +1126950784,1126950847,MY +1126950848,1126950911,US +1126950912,1126951039,CA +1126951040,1126951071,US +1126951072,1126951103,CA +1126951104,1126951135,US +1126951136,1126951775,CA +1126951776,1126951783,PH +1126951784,1126951967,CA +1126951968,1126951975,KP +1126951976,1126951999,CA +1126952000,1126952007,LB +1126952008,1126952015,CA +1126952016,1126952023,LB +1126952024,1126952031,CA +1126952032,1126952039,LB +1126952040,1126952263,CA +1126952264,1126952271,PH +1126952272,1126952447,CA +1126952448,1126952511,AE +1126952512,1126952543,US +1126952544,1126952559,CA +1126952560,1126952567,TH +1126952568,1126952703,CA +1126952704,1126952767,CY +1126952768,1126952895,CA +1126952896,1126952959,CY 1126952960,1127677951,US 1127677952,1127694335,CA -1127694336,1127875839,US +1127694336,1127874559,US +1127875328,1127875839,US 1127875840,1127876095,CA -1127876096,1127877375,US +1127876608,1127876863,US +1127877120,1127877375,US 1127877376,1127877631,CA -1127877632,1127878399,US +1127878144,1127878399,US 1127878400,1127878911,CA -1127878912,1127879679,US +1127878912,1127879167,US 1127879680,1127879935,CA -1127879936,1127880703,US -1127880704,1127880959,CA -1127880960,1127881471,US -1127881472,1127881983,CA -1127881984,1127903231,US -1127907328,1127923711,US +1127879936,1127880191,US +1127880448,1127880703,US +1127880704,1127882751,CA +1127882752,1127923711,US 1127923712,1127931903,CA -1127931904,1127968767,US -1127972864,1128214527,US -1128218624,1128529919,US -1128529920,1128641023,CA +1127931904,1127976191,US +1127976192,1127976223,IL +1127976224,1127979111,US +1127979112,1127979119,CA +1127979120,1127985951,US +1127985952,1127985983,NG +1127985984,1127986087,US +1127986088,1127986095,RO +1127986096,1127986935,US +1127986936,1127986943,IN +1127986944,1127987583,US +1127987584,1127987599,IL +1127987600,1127988551,US +1127988552,1127988559,AU +1127988560,1127988687,US +1127988688,1127988695,IL +1127988696,1128285063,US +1128285064,1128285071,PR +1128285072,1128288271,US +1128288272,1128288287,PR +1128288288,1128529919,US +1128529920,1128633999,CA +1128634000,1128634015,US +1128634016,1128641023,CA 1128641024,1128641535,US 1128641536,1128792063,CA 1128792064,1128818687,US 1128818688,1128818719,CA -1128818720,1132713607,US +1128818720,1130536959,US +1130536960,1130539007,GU +1130539008,1131440135,US +1131440136,1131440143,PR +1131440144,1131949295,US +1131949296,1131949303,PR +1131949304,1132020767,US +1132020768,1132020775,PR +1132020776,1132582463,US +1132582464,1132582479,CA +1132582480,1132713607,US 1132713608,1132713615,CA 1132713616,1132764423,US 1132764424,1132764431,MX -1132764432,1132947431,US +1132764432,1132910111,US +1132910112,1132910143,AU +1132910144,1132947431,US 1132947432,1132947439,CA -1132947440,1134444543,US +1132947440,1133785375,US +1133785376,1133785383,NE +1133785384,1133785471,US +1133785472,1133785503,GB +1133785504,1133785567,US +1133785568,1133785599,BE +1133785600,1134029055,US +1134029056,1134029567,A2 +1134029568,1134444543,US 1134444544,1134448639,CA -1134448640,1134489599,US -1134493696,1134546943,US +1134448640,1134545919,US +1134545920,1134545951,BH +1134545952,1134546175,US +1134546176,1134546207,BH +1134546208,1134546479,US +1134546480,1134546495,JP +1134546496,1134546943,US +1134546944,1134551039,CA 1134551040,1136517007,US 1136517008,1136517023,GB 1136517024,1136517039,US 1136517040,1136517055,GB -1136517056,1136721919,US +1136517056,1136656503,US +1136656504,1136656511,CA +1136656512,1136656583,US +1136656584,1136656591,GB +1136656592,1136656615,US +1136656616,1136656631,AU +1136656632,1136656863,US +1136656864,1136656895,CA +1136656896,1136657039,US +1136657040,1136657047,CA +1136657048,1136657615,US +1136657616,1136657623,GB +1136657624,1136657775,US +1136657776,1136657783,CA +1136657784,1136657815,US +1136657816,1136657823,CA +1136657824,1136657871,US +1136657872,1136657887,GT +1136657888,1136657911,US +1136657912,1136657919,CA +1136657920,1136658087,US +1136658088,1136658095,CN +1136658096,1136658111,MX +1136658112,1136658119,US +1136658120,1136658127,JP +1136658128,1136658135,US +1136658136,1136658143,AU +1136658144,1136658151,US +1136658152,1136658159,AU +1136658160,1136658439,US +1136658440,1136658447,MX +1136658448,1136658711,US +1136658712,1136658719,IN +1136658720,1136658727,NZ +1136658728,1136658991,US +1136658992,1136658999,AU +1136659000,1136659023,US +1136659024,1136659031,AU +1136659032,1136659039,US +1136659040,1136659047,AU +1136659048,1136659151,US +1136659152,1136659167,CA +1136659168,1136659599,US +1136659600,1136659607,MX +1136659608,1136659639,US +1136659640,1136659647,FR +1136659648,1136659767,US +1136659768,1136659775,CA +1136659776,1136659927,US +1136659928,1136659935,CA +1136659936,1136659967,US +1136659968,1136659975,CA +1136659976,1136660047,US +1136660048,1136660055,GB +1136660056,1136660223,US +1136660224,1136660231,CA +1136660232,1136660239,US +1136660240,1136660247,GB +1136660248,1136660471,US +1136660472,1136660479,GB +1136660480,1136660487,US +1136660488,1136660495,NO +1136660496,1136660511,US +1136660512,1136660519,HR +1136660520,1136660759,US +1136660760,1136660767,CA +1136660768,1136660775,US +1136660776,1136660791,CA +1136660792,1136660823,US +1136660824,1136660839,CA +1136660840,1136660871,US +1136660872,1136660879,AU +1136660880,1136660943,US +1136660944,1136660951,IN +1136660952,1136661295,US +1136661296,1136661303,TW +1136661304,1136661327,US +1136661328,1136661335,IN +1136661336,1136661343,US +1136661344,1136661351,CN +1136661352,1136661367,US +1136661368,1136661375,IN +1136661376,1136661399,US +1136661400,1136661407,MX +1136661408,1136661631,US +1136661632,1136661639,IN +1136661640,1136661687,US +1136661688,1136661695,GB +1136661696,1136661727,US +1136661728,1136661743,CA +1136661744,1136661919,US +1136661920,1136661951,CA +1136661952,1136662087,US +1136662088,1136662095,CA +1136662096,1136662151,US +1136662152,1136662159,MX +1136662160,1136662575,US +1136662576,1136662583,CA +1136662584,1136662663,US +1136662664,1136662671,CA +1136662672,1136662815,US +1136662816,1136662823,IN +1136662824,1136662911,US +1136662912,1136662919,IN +1136662920,1136663247,US +1136663248,1136663255,CL +1136663256,1136663575,US +1136663576,1136663583,CN +1136663584,1136663679,US +1136663680,1136663687,IN +1136663688,1136663695,JP +1136663696,1136664543,US +1136664544,1136664551,AU +1136664552,1136664639,US +1136664640,1136664647,CA +1136664648,1136664791,US +1136664792,1136664799,GB +1136664800,1136664815,US +1136664816,1136664823,IL +1136664824,1136664847,US +1136664848,1136664863,CA +1136664864,1136665103,US +1136665104,1136665111,AU +1136665112,1136665135,US +1136665136,1136665143,GB +1136665144,1136665655,US +1136665656,1136665663,IN +1136665664,1136665735,US +1136665736,1136665743,GB +1136665744,1136665759,US +1136665760,1136665767,CA +1136665768,1136665831,US +1136665832,1136665839,CA +1136665840,1136665919,US +1136665920,1136665927,DE +1136665928,1136666143,US +1136666144,1136666151,CA +1136666152,1136666223,US +1136666224,1136666231,PT +1136666232,1136666351,US +1136666352,1136666359,IL +1136666360,1136666447,US +1136666448,1136666463,GB +1136666464,1136666559,US +1136666560,1136666575,GB +1136666576,1136666743,US +1136666744,1136666751,CA +1136666752,1136666791,US +1136666792,1136666799,IL +1136666800,1136666863,US +1136666864,1136666871,GB +1136666872,1136666991,US +1136666992,1136667007,CA +1136667008,1136667087,US +1136667088,1136667103,IL +1136667104,1136667447,US +1136667448,1136667455,GB +1136667456,1136667551,US +1136667552,1136667559,AU +1136667560,1136667599,US +1136667600,1136667615,IN +1136667616,1136667655,US +1136667656,1136667663,CA +1136667664,1136667759,US +1136667760,1136667767,KW +1136667768,1136668023,US +1136668024,1136668031,GB +1136668032,1136668127,US +1136668128,1136668159,AU +1136668160,1136668191,US +1136668192,1136668207,MX +1136668208,1136668287,US +1136668288,1136668303,IN +1136668304,1136668319,MX +1136668320,1136668335,US +1136668336,1136668351,MX +1136668352,1136668383,US +1136668384,1136668415,IN +1136668416,1136668447,US +1136668448,1136668455,IN +1136668456,1136668559,US +1136668560,1136668567,CA +1136668568,1136668671,US +1136668672,1136668679,IN +1136668680,1136668887,US +1136668888,1136668895,CL +1136668896,1136669143,US +1136669144,1136669151,IN +1136669152,1136669263,US +1136669264,1136669279,GB +1136669280,1136669343,US +1136669344,1136669359,CO +1136669360,1136669487,US +1136669488,1136669495,CA +1136669496,1136669511,US +1136669512,1136669519,CA +1136669520,1136669567,US +1136669568,1136669575,CA +1136669576,1136669583,MX +1136669584,1136669775,US +1136669776,1136669783,NL +1136669784,1136669911,US +1136669912,1136669919,ES +1136669920,1136670063,US +1136670064,1136670071,SG +1136670072,1136670111,US +1136670112,1136670119,NZ +1136670120,1136670151,US +1136670152,1136670159,SG +1136670160,1136670719,US +1136670720,1136670975,GB +1136670976,1136672999,US +1136673000,1136673007,CA +1136673008,1136673039,US +1136673040,1136673047,IN +1136673048,1136673231,US +1136673232,1136673239,GB +1136673240,1136673279,US +1136673280,1136673287,CA +1136673288,1136673327,US +1136673328,1136673335,CA +1136673336,1136673423,US +1136673424,1136673431,CA +1136673432,1136673559,US +1136673560,1136673567,VE +1136673568,1136673703,US +1136673704,1136673711,MX +1136673712,1136673855,US +1136673856,1136673863,CA +1136673864,1136673903,US +1136673904,1136673919,CA +1136673920,1136673927,GB +1136673928,1136674079,US +1136674080,1136674095,AU +1136674096,1136674447,US +1136674448,1136674463,AU +1136674464,1136674583,US +1136674584,1136674591,CA +1136674592,1136674607,MX +1136674608,1136674807,US +1136674808,1136674815,GB +1136674816,1136674863,US +1136674864,1136674871,IN +1136674872,1136674895,US +1136674896,1136674903,IL +1136674904,1136674911,GB +1136674912,1136674967,US +1136674968,1136674975,CA +1136674976,1136675007,US +1136675008,1136675015,AU +1136675016,1136675023,CL +1136675024,1136675055,US +1136675056,1136675063,ES +1136675064,1136675311,US +1136675312,1136675319,GB +1136675320,1136675751,US +1136675752,1136675759,IN +1136675760,1136675815,US +1136675816,1136675823,AE +1136675824,1136675839,US +1136675840,1136676095,GB +1136676096,1136676127,US +1136676128,1136676143,IE +1136676144,1136676255,US +1136676256,1136676271,CA +1136676272,1136676551,US +1136676552,1136676559,GB +1136676560,1136676583,US +1136676584,1136676591,AU +1136676592,1136676671,US +1136676672,1136676679,CA +1136676680,1136676735,US +1136676736,1136676743,AU +1136676744,1136677375,US +1136677376,1136677391,AU +1136677392,1136677463,US +1136677464,1136677471,CA +1136677472,1136677615,US +1136677616,1136677631,CA +1136677632,1136678103,US +1136678104,1136678111,IN +1136678112,1136678303,US +1136678304,1136678319,MX +1136678320,1136678431,US +1136678432,1136678447,GB +1136678448,1136679071,US +1136679072,1136679087,CA +1136679088,1136679135,US +1136679136,1136679167,BR +1136679168,1136679215,US +1136679216,1136679223,GB +1136679224,1136679231,US +1136679232,1136679263,IL +1136679264,1136679279,US +1136679280,1136679295,CA +1136679296,1136680055,US +1136680056,1136680063,CA +1136680064,1136680143,US +1136680144,1136680151,NO +1136680152,1136680159,US +1136680160,1136680175,BD +1136680176,1136680311,US +1136680312,1136680319,IN +1136680320,1136680743,US +1136680744,1136680751,BD +1136680752,1136680759,IN +1136680760,1136681167,US +1136681168,1136681175,CA +1136681176,1136681191,US +1136681192,1136681199,MX +1136681200,1136681215,US +1136681216,1136681223,HN +1136681224,1136681231,US +1136681232,1136681239,IL +1136681240,1136681311,US +1136681312,1136681319,BR +1136681320,1136681439,US +1136681440,1136681447,GB +1136681448,1136681455,US +1136681456,1136681471,IL +1136681472,1136681487,US +1136681488,1136681495,GB +1136681496,1136681559,US +1136681560,1136681567,CA +1136681568,1136682271,US +1136682272,1136682303,GB +1136682304,1136682495,US +1136682496,1136682503,CA +1136682504,1136682527,US +1136682528,1136682559,CA +1136682560,1136682583,US +1136682584,1136682591,CA +1136682592,1136682695,US +1136682696,1136682703,CA +1136682704,1136682863,US +1136682864,1136682871,CA +1136682872,1136683095,US +1136683096,1136683103,IL +1136683104,1136683127,US +1136683128,1136683135,MX +1136683136,1136683367,US +1136683368,1136683375,GB +1136683376,1136683383,ZA +1136683384,1136683527,US +1136683528,1136683535,AU +1136683536,1136683543,US +1136683544,1136683551,AE +1136683552,1136684047,US +1136684048,1136684063,CA +1136684064,1136684087,US +1136684088,1136684095,MX +1136684096,1136684103,US +1136684104,1136684111,CA +1136684112,1136684231,US +1136684232,1136684239,CA +1136684240,1136684247,IN +1136684248,1136684463,US +1136684464,1136684471,CA +1136684472,1136684559,US +1136684560,1136684575,CA +1136684576,1136684607,US +1136684608,1136684615,CA +1136684616,1136684623,US +1136684624,1136684631,IN +1136684632,1136684663,US +1136684664,1136684671,AU +1136684672,1136684679,GB +1136684680,1136684703,US +1136684704,1136684719,MX +1136684720,1136684735,US +1136684736,1136684751,IN +1136684752,1136684807,US +1136684808,1136684815,IT +1136684816,1136684895,US +1136684896,1136684911,CA +1136684912,1136684919,HR +1136684920,1136684975,US +1136684976,1136684983,CA +1136684984,1136684991,US +1136684992,1136684999,JP +1136685000,1136685055,US +1136685056,1136685183,CA +1136685184,1136685191,US +1136685192,1136685199,BM +1136685200,1136685231,US +1136685232,1136685239,CN +1136685240,1136685247,US +1136685248,1136685263,CA +1136685264,1136685791,US +1136685792,1136685799,IL +1136685800,1136685871,US +1136685872,1136685879,CA +1136685880,1136685903,US +1136685904,1136685911,HR +1136685912,1136685935,US +1136685936,1136685943,IT +1136685944,1136686047,US +1136686048,1136686055,IE +1136686056,1136689159,US +1136689160,1136689167,BR +1136689168,1136689271,US +1136689272,1136689279,MX +1136689280,1136689431,US +1136689432,1136689439,BM +1136689440,1136689503,US +1136689504,1136689511,VE +1136689512,1136689551,US +1136689552,1136689559,IN +1136689560,1136689735,US +1136689736,1136689743,GB +1136689744,1136689815,US +1136689816,1136689823,GB +1136689824,1136689951,US +1136689952,1136689959,CA +1136689960,1136689975,US +1136689976,1136689983,IL +1136689984,1136690023,US +1136690024,1136690031,IN +1136690032,1136690055,US +1136690056,1136690063,CA +1136690064,1136690079,US +1136690080,1136690087,AU +1136690088,1136690407,US +1136690408,1136690415,BD +1136690416,1136690847,US +1136690848,1136690863,GB +1136690864,1136691415,US +1136691416,1136691423,CA +1136691424,1136691935,US +1136691936,1136691943,CA +1136691944,1136692039,US +1136692040,1136692047,AU +1136692048,1136692071,US +1136692072,1136692079,CA +1136692080,1136692239,US +1136692240,1136692247,AR +1136692248,1136692319,US +1136692320,1136692327,NL +1136692328,1136692535,US +1136692536,1136692543,GB +1136692544,1136692799,US +1136692800,1136692807,NZ +1136692808,1136692919,US +1136692920,1136692927,IN +1136692928,1136692991,US +1136692992,1136693055,IR +1136693056,1136693063,AU +1136693064,1136693503,US +1136693504,1136693511,GB +1136693512,1136693519,CA +1136693520,1136693887,US +1136693888,1136693903,CA +1136693904,1136693951,US +1136693952,1136693959,CA +1136693960,1136693967,AU +1136693968,1136693975,US +1136693976,1136693983,GB +1136693984,1136694079,US +1136694080,1136694087,BG +1136694088,1136694263,US +1136694264,1136694271,GB +1136694272,1136694303,US +1136694304,1136694311,KR +1136694312,1136694319,US +1136694320,1136694327,KR +1136694328,1136694399,US +1136694400,1136694415,CA +1136694416,1136694895,US +1136694896,1136694903,AU +1136694904,1136694991,US +1136694992,1136694999,GB +1136695000,1136695503,US +1136695504,1136695511,GB +1136695512,1136695703,US +1136695704,1136695711,DK +1136695712,1136695719,US +1136695720,1136695727,IL +1136695728,1136695743,DK +1136695744,1136696087,US +1136696088,1136696095,AU +1136696096,1136696111,US +1136696112,1136696127,AU +1136696128,1136696263,US +1136696264,1136696271,CA +1136696272,1136696647,US +1136696648,1136696655,GB +1136696656,1136696671,US +1136696672,1136696679,IL +1136696680,1136696711,US +1136696712,1136696719,GT +1136696720,1136696767,US +1136696768,1136696775,IL +1136696776,1136696855,US +1136696856,1136696863,GB +1136696864,1136697047,US +1136697048,1136697055,BM +1136697056,1136697455,US +1136697456,1136697463,CA +1136697464,1136697647,US +1136697648,1136697655,CA +1136697656,1136697767,US +1136697768,1136697775,GB +1136697776,1136697975,US +1136697976,1136697983,CA +1136697984,1136698023,US +1136698024,1136698031,GB +1136698032,1136698039,US +1136698040,1136698111,IE +1136698112,1136698815,US +1136698816,1136698823,GB +1136698824,1136699023,US +1136699024,1136699039,GB +1136699040,1136699087,US +1136699088,1136699095,GB +1136699096,1136699487,US +1136699488,1136699503,CA +1136699504,1136699511,US +1136699512,1136699519,SE +1136699520,1136699583,US +1136699584,1136699599,CA +1136699600,1136699623,US +1136699624,1136699631,CA +1136699632,1136699647,IN +1136699648,1136699695,US +1136699696,1136699703,AU +1136699704,1136699839,US +1136699840,1136699847,MT +1136699848,1136699935,US +1136699936,1136699943,AU +1136699944,1136699999,US +1136700000,1136700007,GB +1136700008,1136700031,US +1136700032,1136700039,CA +1136700040,1136700103,US +1136700104,1136700111,NZ +1136700112,1136700263,US +1136700264,1136700271,IL +1136700272,1136700343,US +1136700344,1136700351,MX +1136700352,1136700479,US +1136700480,1136700487,NZ +1136700488,1136700583,US +1136700584,1136700591,AU +1136700592,1136700663,US +1136700664,1136700671,DK +1136700672,1136700783,US +1136700784,1136700791,CA +1136700792,1136700847,US +1136700848,1136700855,CL +1136700856,1136700911,US +1136700912,1136700919,CA +1136700920,1136701119,US +1136701120,1136701183,AU +1136701184,1136701279,US +1136701280,1136701287,CA +1136701288,1136701335,US +1136701336,1136701343,GB +1136701344,1136701455,US +1136701456,1136701463,IN +1136701464,1136701527,US +1136701528,1136701543,CA +1136701544,1136702711,US +1136702712,1136702719,GB +1136702720,1136702727,CA +1136702728,1136702799,US +1136702800,1136702807,GB +1136702808,1136702871,US +1136702872,1136702879,AT +1136702880,1136702911,US +1136702912,1136702919,GB +1136702920,1136703095,US +1136703096,1136703103,CA +1136703104,1136703279,US +1136703280,1136703287,CA +1136703288,1136704639,US +1136704640,1136704703,GB +1136704704,1136705575,US +1136705576,1136705583,CA +1136705584,1136705671,US +1136705672,1136705679,CA +1136705680,1136705807,US +1136705808,1136705815,IN +1136705816,1136705823,RU +1136705824,1136706087,US +1136706088,1136706095,IN +1136706096,1136706119,US +1136706120,1136706127,CA +1136706128,1136706231,US +1136706232,1136706239,MX +1136706240,1136706359,US +1136706360,1136706367,BM +1136706368,1136706455,US +1136706456,1136706463,GB +1136706464,1136706471,CA +1136706472,1136706495,US +1136706496,1136706559,IE +1136706560,1136706591,US +1136706592,1136706599,AU +1136706600,1136706703,US +1136706704,1136706711,CA +1136706712,1136706935,US +1136706936,1136706943,AU +1136706944,1136707087,US +1136707088,1136707095,GB +1136707096,1136707175,US +1136707176,1136707183,ZA +1136707184,1136707263,US +1136707264,1136707271,IN +1136707272,1136707751,US +1136707752,1136707759,GB +1136707760,1136707775,US +1136707776,1136707783,BR +1136707784,1136707847,US +1136707848,1136707855,SG +1136707856,1136707887,US +1136707888,1136707895,CA +1136707896,1136708039,US +1136708040,1136708047,CA +1136708048,1136708679,US +1136708680,1136708687,GB +1136708688,1136708871,US +1136708872,1136708879,GB +1136708880,1136709023,US +1136709024,1136709031,BD +1136709032,1136709647,US +1136709648,1136709655,CA +1136709656,1136709679,US +1136709680,1136709695,AU +1136709696,1136709767,US +1136709768,1136709775,GB +1136709776,1136709815,US +1136709816,1136709823,CA +1136709824,1136709927,US +1136709928,1136709935,CA +1136709936,1136710191,US +1136710192,1136710199,GB +1136710200,1136710415,US +1136710416,1136710431,AU +1136710432,1136711479,US +1136711480,1136711487,ZA +1136711488,1136711927,US +1136711928,1136711935,GB +1136711936,1136711991,US +1136711992,1136711999,AU +1136712000,1136712607,US +1136712608,1136712615,GB +1136712616,1136712695,US +1136712696,1136712703,CA +1136712704,1136712991,US +1136712992,1136712999,CA +1136713000,1136713087,US +1136713088,1136713103,CA +1136713104,1136713151,US +1136713152,1136713167,CA +1136713168,1136713471,US +1136713472,1136713479,SG +1136713480,1136713583,US +1136713584,1136713591,CA +1136713592,1136713919,US +1136713920,1136713935,NO +1136713936,1136714031,US +1136714032,1136714039,BR +1136714040,1136714167,US +1136714168,1136714175,IE +1136714176,1136714255,US +1136714256,1136714263,GB +1136714264,1136714271,US +1136714272,1136714279,GB +1136714280,1136714639,US +1136714640,1136714647,DE +1136714648,1136714671,US +1136714672,1136714679,CN +1136714680,1136715135,US +1136715136,1136715151,MX +1136715152,1136715623,US +1136715624,1136715631,AU +1136715632,1136716287,US +1136716288,1136716295,ZA +1136716296,1136716431,US +1136716432,1136716439,IN +1136716440,1136716447,US +1136716448,1136716479,CA +1136716480,1136716631,US +1136716632,1136716639,AU +1136716640,1136716703,US +1136716704,1136716711,IN +1136716712,1136716759,US +1136716760,1136716767,CA +1136716768,1136716775,US +1136716776,1136716783,NZ +1136716784,1136716799,US +1136716800,1136716831,VI +1136716832,1136717167,US +1136717168,1136717183,IT +1136717184,1136717399,US +1136717400,1136717407,GB +1136717408,1136717551,US +1136717552,1136717559,CA +1136717560,1136717583,US +1136717584,1136717599,GB +1136717600,1136717935,US +1136717936,1136717943,CA +1136717944,1136718391,US +1136718392,1136718399,MX +1136718400,1136718439,US +1136718440,1136718447,IN +1136718448,1136718487,US +1136718488,1136718495,IN +1136718496,1136718759,US +1136718760,1136718767,AU +1136718768,1136718791,US +1136718792,1136718799,CA +1136718800,1136718879,US +1136718880,1136718895,AU +1136718896,1136721919,US 1136721920,1136787455,CA -1136787456,1137016831,US -1137049600,1137156095,US -1137180672,1137195519,US +1136787456,1137090815,US +1137090816,1137091327,NZ +1137091328,1137134083,US +1137134084,1137134099,CA +1137134100,1137134283,US +1137134284,1137134331,CA +1137134332,1137189135,US +1137189136,1137189151,IE +1137189152,1137189183,GB +1137189184,1137189247,IE +1137189248,1137189255,GB +1137189256,1137189263,US +1137189264,1137189271,GB +1137189272,1137195519,US 1137195520,1137195775,JP -1137195776,1137205247,US -1137213440,1137221631,US -1137246208,1137278975,US +1137195776,1137254815,US +1137254816,1137254831,NZ +1137254832,1137278975,US 1137278976,1137283071,CA 1137283072,1137287167,US 1137287168,1137295359,CA -1137295360,1137336319,US -1137344512,1137352703,US -1137360896,1137401855,US -1137410048,1137426431,US +1137295360,1137337599,US +1137337600,1137337855,CA +1137337856,1137369087,US +1137369088,1137369519,CA +1137369520,1137369535,US +1137369536,1137370111,CA +1137370112,1137376255,US +1137376256,1137376335,CA +1137376336,1137376351,US +1137376352,1137376367,CA +1137376368,1137376383,US +1137376384,1137376463,CA +1137376464,1137377311,US +1137377312,1137377327,DE +1137377328,1137377471,US +1137377472,1137377479,IN +1137377480,1137383455,US +1137383456,1137383471,DE +1137383472,1137426431,US 1137426432,1137442815,PR -1137442816,1137451007,CA -1137459200,1137487871,US +1137442816,1137459199,CA +1137459200,1137491967,US 1137491968,1137508351,CA -1137508352,1137516543,US +1137508352,1137524735,US 1137524736,1137541119,CA -1137541120,1137598463,US -1137606656,1137614847,US -1137623040,1137631231,PR -1137639424,1137651711,US -1137655808,1137692671,US -1137696768,1137704959,US -1137704960,1137713151,CA -1137713152,1137717247,US -1137721344,1137733631,US -1137737728,1137741823,US -1137745920,1137758207,US -1137762304,1137766399,US -1137770496,1137774591,US -1137778688,1137799167,US -1137803264,1137815551,US -1137819648,1137823743,US -1137827840,1137831935,US -1137836032,1137840127,US -1137844224,1137848319,US -1137852416,1137856511,US -1137860608,1137864703,US +1137541120,1137623039,US +1137623040,1137639423,PR +1137639424,1137704967,US +1137704968,1137705287,CA +1137705288,1137705295,US +1137705296,1137705383,CA +1137705384,1137705391,NL +1137705392,1137705447,CA +1137705448,1137705455,US +1137705456,1137705727,CA +1137705728,1137705735,US +1137705736,1137705767,CA +1137705768,1137705791,US +1137705792,1137705879,CA +1137705880,1137705887,US +1137705888,1137705903,CA +1137705904,1137705911,US +1137705912,1137705943,CA +1137705944,1137705951,US +1137705952,1137706247,CA +1137706248,1137706263,US +1137706264,1137706319,CA +1137706320,1137706359,US +1137706360,1137706375,CA +1137706376,1137706383,US +1137706384,1137706775,CA +1137706776,1137706791,US +1137706792,1137706807,CA +1137706808,1137706823,US +1137706824,1137706831,CA +1137706832,1137706839,US +1137706840,1137706879,CA +1137706880,1137706887,US +1137706888,1137706903,CA +1137706904,1137706943,US +1137706944,1137706991,CA +1137706992,1137707007,US +1137707008,1137707071,CA +1137707072,1137707095,US +1137707096,1137707127,CA +1137707128,1137707143,US +1137707144,1137707151,CA +1137707152,1137707159,NL +1137707160,1137707191,US +1137707192,1137707199,CA +1137707200,1137707207,NL +1137707208,1137707223,US +1137707224,1137707255,CA +1137707256,1137707263,US +1137707264,1137707519,CA +1137707520,1137707575,US +1137707576,1137707583,NL +1137707584,1137707623,CA +1137707624,1137707647,US +1137707648,1137707663,CA +1137707664,1137707679,US +1137707680,1137707695,CA +1137707696,1137707719,NL +1137707720,1137707727,CA +1137707728,1137707743,US +1137707744,1137707759,CA +1137707760,1137708151,US +1137708152,1137708167,CA +1137708168,1137708175,US +1137708176,1137708183,CA +1137708184,1137708207,US +1137708208,1137708215,CA +1137708216,1137708247,US +1137708248,1137708255,CA +1137708256,1137708279,US +1137708280,1137708287,CA +1137708288,1137708799,US +1137708800,1137708927,CA +1137708928,1137708943,US +1137708944,1137708951,CA +1137708952,1137708959,US +1137708960,1137709007,CA +1137709008,1137709023,US +1137709024,1137709055,CA +1137709056,1137709311,US +1137709312,1137709351,CA +1137709352,1137709359,US +1137709360,1137709383,CA +1137709384,1137709391,US +1137709392,1137709399,CA +1137709400,1137709407,US +1137709408,1137709423,CA +1137709424,1137709431,US +1137709432,1137709439,CA +1137709440,1137709447,US +1137709448,1137709463,CA +1137709464,1137709487,US +1137709488,1137709831,CA +1137709832,1137709839,US +1137709840,1137709903,CA +1137709904,1137709911,US +1137709912,1137709959,CA +1137709960,1137709967,NL +1137709968,1137710087,CA +1137710088,1137710095,US +1137710096,1137710151,CA +1137710152,1137710159,US +1137710160,1137710175,CA +1137710176,1137710183,US +1137710184,1137710191,CA +1137710192,1137710199,NL +1137710200,1137710215,CA +1137710216,1137710231,US +1137710232,1137710239,NL +1137710240,1137710247,US +1137710248,1137710295,CA +1137710296,1137710311,US +1137710312,1137710847,CA +1137710848,1137710959,US +1137710960,1137710967,CA +1137710968,1137711135,US +1137711136,1137711167,CA +1137711168,1137711175,US +1137711176,1137711191,CA +1137711192,1137711199,NL +1137711200,1137711207,CA +1137711208,1137711215,NL +1137711216,1137711223,US +1137711224,1137711231,CA +1137711232,1137711239,NL +1137711240,1137711247,US +1137711248,1137711255,CA +1137711256,1137711263,NL +1137711264,1137711279,US +1137711280,1137711287,NL +1137711288,1137711295,US +1137711296,1137711303,NL +1137711304,1137711343,US +1137711344,1137711367,CA +1137711368,1137711375,US +1137711376,1137711399,CA +1137711400,1137711407,US +1137711408,1137711439,CA +1137711440,1137711455,US +1137711456,1137711471,CA +1137711472,1137711479,US +1137711480,1137711503,CA +1137711504,1137711511,US +1137711512,1137711559,CA +1137711560,1137711567,US +1137711568,1137711575,CA +1137711576,1137711639,US +1137711640,1137711647,CA +1137711648,1137711655,US +1137711656,1137711687,CA +1137711688,1137711703,US +1137711704,1137711743,CA +1137711744,1137711751,US +1137711752,1137711759,CA +1137711760,1137711767,US +1137711768,1137711791,CA +1137711792,1137711807,US +1137711808,1137711863,CA +1137711864,1137711871,US +1137711872,1137712007,CA +1137712008,1137712015,US +1137712016,1137712055,CA +1137712056,1137712119,US +1137712120,1137712127,CA +1137712128,1137712135,US +1137712136,1137712151,CA +1137712152,1137712207,US +1137712208,1137712223,CA +1137712224,1137712239,US +1137712240,1137712255,CA +1137712256,1137712263,US +1137712264,1137712279,CA +1137712280,1137712287,US +1137712288,1137712295,CA +1137712296,1137712327,US +1137712328,1137712343,CA +1137712344,1137712351,US +1137712352,1137712383,CA +1137712384,1137712671,US +1137712672,1137712687,CA +1137712688,1137712711,US +1137712712,1137712719,CA +1137712720,1137712759,US +1137712760,1137712767,CA +1137712768,1137712919,US +1137712920,1137712935,CA +1137712936,1137712959,US +1137712960,1137712975,CA +1137712976,1137713015,US +1137713016,1137713023,CA +1137713024,1137713071,US +1137713072,1137713087,CA +1137713088,1137713103,US +1137713104,1137713111,CA +1137713112,1137724495,US +1137724496,1137724511,CA +1137724512,1137724543,US +1137724544,1137724575,CA +1137724576,1137724607,US +1137724608,1137724623,CA +1137724624,1137724655,US +1137724656,1137724687,CA +1137724688,1137724703,US +1137724704,1137724719,CA +1137724720,1137724847,US +1137724848,1137724863,CA +1137724864,1137724911,US +1137724912,1137724927,CA +1137724928,1137758207,US +1137758208,1137758463,GB +1137758464,1137758495,US +1137758496,1137758527,AU +1137758528,1137758671,US +1137758672,1137758687,CH +1137758688,1137759999,US +1137760000,1137760255,PA +1137760256,1137785855,US +1137785856,1137786111,HU +1137786112,1137795071,US +1137795072,1137799167,A2 +1137799168,1137840127,US +1137840128,1137840383,CA +1137840384,1137843711,US +1137843712,1137843775,NO +1137843776,1137868799,US 1137868800,1137872895,CA +1137872896,1137876991,US 1137876992,1137881087,CA -1137885184,1137889279,US -1137893376,1137897471,US -1137901568,1137913855,US +1137881088,1137889279,US +1137889280,1137893375,CA +1137893376,1137893791,US +1137893792,1137893799,ES +1137893800,1137893807,US +1137893808,1137893823,AR +1137893824,1137893831,CO +1137893832,1137893871,US +1137893872,1137893887,SZ +1137893888,1137894271,US +1137894272,1137894279,CO +1137894280,1137894287,US +1137894288,1137894295,GB +1137894296,1137894311,CO +1137894312,1137894319,US +1137894320,1137894327,CO +1137894328,1137894527,US +1137894528,1137894535,CO +1137894536,1137894607,US +1137894608,1137894615,DO +1137894616,1137895263,US +1137895264,1137895295,AU +1137895296,1137895311,US +1137895312,1137895319,AU +1137895320,1137895743,US +1137895744,1137895751,CO +1137895752,1137896319,US +1137896320,1137896327,ES +1137896328,1137896351,US +1137896352,1137896359,IN +1137896360,1137900559,US +1137900560,1137900567,GB +1137900568,1137901327,US +1137901328,1137901335,GB +1137901336,1137917951,US 1137917952,1137922047,CA -1137926144,1137930239,CA -1137934336,1137946623,US -1137950720,1137953023,US +1137922048,1137926143,US +1137926144,1137927167,CA +1137927168,1137927423,AW +1137927424,1137927495,CA +1137927496,1137927503,AG +1137927504,1137927679,CA +1137927680,1137927807,CR +1137927808,1137927935,CA +1137927936,1137928063,VG +1137928064,1137930143,CA +1137930144,1137930159,MT +1137930160,1137934335,CA +1137934336,1137946145,US +1137946146,1137946153,DE +1137946154,1137946585,US +1137946586,1137946593,NO +1137946594,1137953023,US 1137953024,1137954815,CA -1137958912,1137963007,US +1137954816,1137963007,US +1137963008,1137967103,VI 1137967104,1137975295,CA 1137975296,1137983487,US -1137983488,1137987583,CA -1137991680,1137995775,US -1137999872,1138003967,US -1138008064,1138020351,US -1138024448,1138028543,US -1138032640,1138036735,US -1138040832,1138049023,US -1138049024,1138053119,CA -1138057216,1138061311,CA -1138065408,1138069503,US -1138073600,1138077695,US -1138081792,1138085887,US -1138089984,1138110463,US -1138114560,1138126847,US -1138130944,1138135039,US -1138139136,1138143231,US -1138147328,1138151423,US -1138155520,1138159615,US -1138163712,1138167039,CA +1137983488,1137991679,CA +1137991680,1138000063,US +1138000064,1138000095,CA +1138000096,1138001519,US +1138001520,1138001535,CA +1138001536,1138049023,US +1138049024,1138061311,CA +1138061312,1138163711,US +1138163712,1138163967,CA +1138163968,1138163975,MA +1138163976,1138163983,KE +1138163984,1138163991,CA +1138163992,1138163999,HR +1138164000,1138164007,PA +1138164008,1138164015,FR +1138164016,1138164127,CA +1138164128,1138164151,FR +1138164152,1138164159,GB +1138164160,1138164175,CA +1138164176,1138164183,SK +1138164184,1138164191,PH +1138164192,1138164199,PK +1138164200,1138164207,CA +1138164208,1138164215,US +1138164216,1138164223,ES +1138164224,1138164255,CA +1138164256,1138164263,LB +1138164264,1138164271,FR +1138164272,1138164279,PH +1138164280,1138164311,CA +1138164312,1138164327,GB +1138164328,1138164335,PA +1138164336,1138164367,CA +1138164368,1138164375,PH +1138164376,1138164399,FR +1138164400,1138164511,CA +1138164512,1138164543,FR +1138164544,1138164583,CA +1138164584,1138164591,NZ +1138164592,1138164655,CA +1138164656,1138164663,MA +1138164664,1138164815,CA +1138164816,1138164823,US +1138164824,1138164831,CA +1138164832,1138164839,PH +1138164840,1138164863,CA +1138164864,1138165247,US +1138165248,1138165255,GB +1138165256,1138165311,CA +1138165312,1138165319,US +1138165320,1138165431,CA +1138165432,1138165439,LB +1138165440,1138165463,CA +1138165464,1138165471,GB +1138165472,1138165487,CA +1138165488,1138165503,SK +1138165504,1138165807,CA +1138165808,1138165815,FR +1138165816,1138165823,CH +1138165824,1138165895,CA +1138165896,1138165903,LB +1138165904,1138165935,CA +1138165936,1138165943,IL +1138165944,1138165959,CA +1138165960,1138165975,FR +1138165976,1138165983,US +1138165984,1138166183,CA +1138166184,1138166191,FR +1138166192,1138166199,CA +1138166200,1138166207,FR +1138166208,1138166527,CA +1138166528,1138166535,TR +1138166536,1138166639,CA +1138166640,1138166647,FR +1138166648,1138166655,CA +1138166656,1138166663,FR +1138166664,1138166671,LB +1138166672,1138166703,CA +1138166704,1138166711,FR +1138166712,1138166719,AE +1138166720,1138166819,CA +1138166820,1138166823,PA +1138166824,1138166879,CA +1138166880,1138166887,RU +1138166888,1138166919,CA +1138166920,1138166927,PH +1138166928,1138166951,CA +1138166952,1138166959,LU +1138166960,1138166967,CA +1138166968,1138166983,FR +1138166984,1138166991,SE +1138166992,1138166999,PH +1138167000,1138167007,CA +1138167008,1138167015,FR +1138167016,1138167031,CA +1138167032,1138167039,FR 1138167040,1138167199,MA -1138167200,1138167807,CA -1138171904,1138175999,US +1138167200,1138167207,UA +1138167208,1138167215,AE +1138167216,1138167219,PH +1138167220,1138167223,CA +1138167224,1138167239,KE +1138167240,1138167247,FR +1138167248,1138167543,CA +1138167544,1138167551,PA +1138167552,1138167775,CA +1138167776,1138167783,PA +1138167784,1138167791,IL +1138167792,1138167799,CA +1138167800,1138167807,MA +1138167808,1138175999,US +1138176000,1138180095,CA 1138180096,1138188287,US 1138188288,1138192383,PR +1138192384,1138196479,US 1138196480,1138204671,CA -1138204672,1138208767,US +1138204672,1138212863,US 1138212864,1138216959,CA -1138221056,1138225151,US -1138229248,1138233343,US -1138237440,1138249727,US -1138253824,1138266111,US -1138270208,1138274303,US -1138278400,1138290687,US -1138294784,1138307071,US -1138311168,1138323455,US -1138327552,1138331647,US -1138335744,1138348031,US -1138352128,1138356223,US -1138360320,1138364415,US -1138368512,1138372607,US -1138376704,1138380799,US -1138384896,1138388991,US -1138393088,1138397183,US -1138401280,1138413567,US -1138417664,1138418175,US -1138418176,1138418687,CA -1138418688,1138421247,US -1138421248,1138421759,CA -1138421760,1138423295,US -1138423296,1138423551,CA -1138423552,1138424575,US -1138424576,1138424831,CA -1138424832,1138429951,US -1138434048,1138438143,US -1138442240,1138462719,US -1138466816,1138470911,US -1138475008,1138479103,US -1138483200,1138487295,US -1138491392,1138495487,US +1138216960,1138271087,US +1138271088,1138271103,TN +1138271104,1138417663,US +1138417664,1138417695,CA +1138417696,1138417727,DE +1138417728,1138450959,US +1138450960,1138450967,JM +1138450968,1138450991,US +1138450992,1138450999,MX +1138451000,1138451071,US +1138451072,1138451079,GB +1138451080,1138451103,US +1138451104,1138451111,DO +1138451112,1138451191,US +1138451192,1138451199,BE +1138451200,1138451759,US +1138451760,1138451783,GB +1138451784,1138451807,US +1138451808,1138451815,AU +1138451816,1138451823,US +1138451824,1138451831,AU +1138451832,1138451847,US +1138451848,1138451855,RU +1138451856,1138451879,US +1138451880,1138451887,EG +1138451888,1138451959,US +1138451960,1138451967,RU +1138451968,1138452007,US +1138452008,1138452015,DE +1138452016,1138452047,US +1138452048,1138452055,AU +1138452056,1138452063,GB +1138452064,1138452255,US +1138452256,1138452263,GB +1138452264,1138452271,IN +1138452272,1138452287,US +1138452288,1138452295,GR +1138452296,1138452311,US +1138452312,1138452319,CA +1138452320,1138452335,US +1138452336,1138452351,CA +1138452352,1138452415,US +1138452416,1138452423,CA +1138452424,1138452431,FR +1138452432,1138452439,CN +1138452440,1138452455,US +1138452456,1138452479,FR +1138452480,1138453567,US +1138453568,1138453615,FR +1138453616,1138454015,US +1138454016,1138454271,RU +1138454272,1138454591,US +1138454592,1138454599,CA +1138454600,1138499583,US 1138499584,1138503679,CA -1138507776,1138511871,US -1138515968,1138536447,US -1138540544,1138544639,US -1138548736,1138556927,CA -1138556928,1138561023,US -1138565120,1138569215,US -1138573312,1138585599,US -1138589696,1138593791,US -1138597888,1138601983,US -1138606080,1138610175,US -1138614272,1138618367,US -1138622464,1138626559,US -1138630656,1138642943,US -1138647040,1138651135,US -1138655232,1138659327,US -1138663424,1138667519,US -1138671616,1138675711,US -1138679808,1138683903,US -1138688000,1138692095,US -1138696192,1138704383,US -1138704384,1138716671,CA -1138720768,1138724863,CA -1138728960,1138733055,US -1138737152,1138741247,US -1138745344,1138749439,US -1138753536,1138769919,US -1138786304,1138802687,PR +1138503680,1138508031,US +1138508032,1138508095,GB +1138508096,1138508447,US +1138508448,1138508479,IT +1138508480,1138508511,US +1138508512,1138508543,CR +1138508544,1138508575,US +1138508576,1138508591,IT +1138508592,1138508607,US +1138508608,1138508671,ID +1138508672,1138508735,US +1138508736,1138508767,CR +1138508768,1138509823,US +1138509824,1138510847,IN +1138510848,1138510879,CA +1138510880,1138510911,US +1138510912,1138510975,IN +1138510976,1138511103,MY +1138511104,1138511167,CH +1138511168,1138511263,RO +1138511264,1138512383,US +1138512384,1138512415,ID +1138512416,1138512639,US +1138512640,1138512671,ID +1138512672,1138512895,US +1138512896,1138512927,ID +1138512928,1138548735,US +1138548736,1138549260,CA +1138549261,1138549347,HK +1138549348,1138549503,CA +1138549504,1138549631,PL +1138549632,1138550015,CA +1138550016,1138552575,US +1138552576,1138556927,CA +1138556928,1138593791,US +1138593792,1138597887,CA +1138597888,1138600447,US +1138600448,1138600703,BE +1138600704,1138615299,US +1138615300,1138615323,IT +1138615324,1138655241,US +1138655242,1138655316,CA +1138655317,1138655328,US +1138655329,1138655336,CA +1138655337,1138655374,US +1138655375,1138655382,CA +1138655383,1138655422,US +1138655423,1138655430,RU +1138655431,1138655446,US +1138655447,1138655454,CA +1138655455,1138655458,US +1138655459,1138655486,CA +1138655487,1138655503,US +1138655504,1138655513,MX +1138655514,1138655519,US +1138655520,1138655521,MX +1138655522,1138655609,US +1138655610,1138655617,MX +1138655618,1138655695,US +1138655696,1138655703,MX +1138655704,1138655715,US +1138655716,1138655723,GB +1138655724,1138655841,US +1138655842,1138655849,CN +1138655850,1138655857,US +1138655858,1138655865,CN +1138655866,1138655899,US +1138655900,1138655911,MX +1138655912,1138656021,US +1138656022,1138656029,TW +1138656030,1138656077,US +1138656078,1138656093,MX +1138656094,1138656097,US +1138656098,1138656113,GB +1138656114,1138656121,US +1138656122,1138656129,GB +1138656130,1138656141,US +1138656142,1138656173,GB +1138656174,1138656190,US +1138656191,1138656198,CH +1138656199,1138656206,GB +1138656207,1138656222,US +1138656223,1138656230,EG +1138656231,1138656301,US +1138656302,1138656309,MO +1138656310,1138656330,US +1138656331,1138656338,TR +1138656339,1138656398,US +1138656399,1138656406,MO +1138656407,1138656407,GB +1138656408,1138656413,US +1138656414,1138656415,GB +1138656416,1138656521,US +1138656522,1138656529,EG +1138656530,1138656661,US +1138656662,1138656669,MA +1138656670,1138656745,US +1138656746,1138656753,AE +1138656754,1138656777,US +1138656778,1138656793,UY +1138656794,1138656933,US +1138656934,1138656941,UY +1138656942,1138656973,US +1138656974,1138656981,UY +1138656982,1138656997,US +1138656998,1138657005,UY +1138657006,1138657041,US +1138657042,1138657056,SA +1138657057,1138657123,US +1138657124,1138657131,EG +1138657132,1138657159,US +1138657160,1138657173,MO +1138657174,1138657181,EG +1138657182,1138657193,US +1138657194,1138657195,AE +1138657196,1138657197,US +1138657198,1138657199,EG +1138657200,1138657201,AE +1138657202,1138657205,EG +1138657206,1138657206,US +1138657207,1138657214,EG +1138657215,1138657222,IN +1138657223,1138657235,US +1138657236,1138657244,MA +1138657245,1138657346,US +1138657347,1138657354,MO +1138657355,1138657504,US +1138657505,1138657520,EG +1138657521,1138657569,US +1138657570,1138657577,UY +1138657578,1138657597,US +1138657598,1138657605,UY +1138657606,1138657671,US +1138657672,1138657679,UY +1138657680,1138657681,US +1138657682,1138657691,UY +1138657692,1138657707,US +1138657708,1138657732,UY +1138657733,1138657748,US +1138657749,1138657780,GB +1138657781,1138657790,UY +1138657791,1138658057,US +1138658058,1138658123,GB +1138658124,1138658175,US +1138658176,1138658302,GB +1138658303,1138658431,US +1138658432,1138658496,PK +1138658497,1138658497,US +1138658498,1138658525,PK +1138658526,1138659081,US +1138659082,1138659211,ES +1138659212,1138659369,US +1138659370,1138659401,GB +1138659402,1138659465,US +1138659466,1138659497,GB +1138659498,1138659593,US +1138659594,1138659609,LK +1138659610,1138659642,GB +1138659643,1138659650,US +1138659651,1138659660,UY +1138659661,1138659673,US +1138659674,1138659681,MA +1138659682,1138659705,US +1138659706,1138659713,CA +1138659714,1138659721,UY +1138659722,1138659723,US +1138659724,1138659731,ID +1138659732,1138659789,US +1138659790,1138659797,ID +1138659798,1138659805,UY +1138659806,1138659813,ID +1138659814,1138659823,UY +1138659824,1138659831,ID +1138659832,1138659849,US +1138659850,1138659857,MA +1138659858,1138659889,GB +1138659890,1138659903,US +1138659904,1138659911,CA +1138659912,1138659922,US +1138659923,1138659930,LK +1138659931,1138659983,US +1138659984,1138659999,EG +1138660000,1138660035,US +1138660036,1138660043,IN +1138660044,1138660105,US +1138660106,1138660137,GB +1138660138,1138660169,US +1138660170,1138660177,MA +1138660178,1138660185,ID +1138660186,1138660193,US +1138660194,1138660201,EG +1138660202,1138660217,US +1138660218,1138660225,IN +1138660226,1138660233,US +1138660234,1138660241,EG +1138660242,1138660242,US +1138660243,1138660270,CA +1138660271,1138660310,GB +1138660311,1138660311,US +1138660312,1138660333,GB +1138660334,1138660361,US +1138660362,1138660483,EG +1138660484,1138660499,US +1138660500,1138660507,AE +1138660508,1138660563,US +1138660564,1138660571,GB +1138660572,1138660617,US +1138660618,1138660625,AE +1138660626,1138660633,EG +1138660634,1138660665,US +1138660666,1138660673,IN +1138660674,1138660694,US +1138660695,1138660726,GB +1138660727,1138660734,EG +1138660735,1138660778,US +1138660779,1138660786,MY +1138660787,1138660805,US +1138660806,1138660821,EG +1138660822,1138660873,US +1138660874,1138660881,EG +1138660882,1138660889,MA +1138660890,1138660897,EG +1138660898,1138660921,US +1138660922,1138660929,EG +1138660930,1138660958,US +1138660959,1138660966,MA +1138660967,1138660982,US +1138660983,1138660990,EG +1138660991,1138661002,US +1138661003,1138661010,LK +1138661011,1138661018,EG +1138661019,1138661046,US +1138661047,1138661054,CA +1138661055,1138661055,US +1138661056,1138661063,EG +1138661064,1138661169,US +1138661170,1138661177,LK +1138661178,1138661185,US +1138661186,1138661193,UY +1138661194,1138661201,US +1138661202,1138661209,MA +1138661210,1138661217,UY +1138661218,1138661249,US +1138661250,1138661257,UY +1138661258,1138661265,US +1138661266,1138661281,EG +1138661282,1138661299,US +1138661300,1138661307,GB +1138661308,1138661417,US +1138661418,1138661425,LK +1138661426,1138661457,US +1138661458,1138661465,IN +1138661466,1138661521,US +1138661522,1138661529,EG +1138661530,1138661553,US +1138661554,1138661561,CA +1138661562,1138661583,US +1138661584,1138661591,LK +1138661592,1138661641,US +1138661642,1138661649,EG +1138661650,1138661669,US +1138661670,1138661677,IN +1138661678,1138661713,US +1138661714,1138661721,EG +1138661722,1138661769,US +1138661770,1138661777,MA +1138661778,1138661821,US +1138661822,1138661829,MA +1138661830,1138661913,US +1138661914,1138661954,EG +1138661955,1138661985,US +1138661986,1138661993,EG +1138661994,1138662017,US +1138662018,1138662025,EG +1138662026,1138662057,US +1138662058,1138662107,EG +1138662108,1138662169,US +1138662170,1138662233,EG +1138662234,1138662273,US +1138662274,1138662309,EG +1138662310,1138662409,US +1138662410,1138662473,EG +1138662474,1138662505,GB +1138662506,1138662537,US +1138662538,1138662545,EG +1138662546,1138662575,US +1138662576,1138662607,MX +1138662608,1138662623,US +1138662624,1138662639,GB +1138662640,1138662793,US +1138662794,1138662801,ID +1138662802,1138662841,US +1138662842,1138662849,GB +1138662850,1138662966,US +1138662967,1138662974,EG +1138662975,1138663037,US +1138663038,1138663166,GB +1138663167,1138712575,US +1138712576,1138713583,CA +1138713584,1138713599,IR +1138713600,1138713927,CA +1138713928,1138713935,US +1138713936,1138713951,CA +1138713952,1138713959,US +1138713960,1138714039,CA +1138714040,1138714047,US +1138714048,1138714071,CA +1138714072,1138714079,US +1138714080,1138714087,ES +1138714088,1138716671,CA +1138716672,1138720767,US +1138720768,1138728959,CA +1138728960,1138774015,US +1138774016,1138778111,CA +1138778112,1138780159,US +1138780160,1138780191,CA +1138780192,1138786303,US +1138786304,1138819071,PR 1138819072,1138851839,CA -1138851840,1138854927,US -1138854928,1138854943,GB -1138854944,1138917375,US -1138917376,1138933759,CA -1138950144,1138958335,US -1138982912,1138999295,US -1139015680,1139130367,US -1139146752,1139179519,US -1139212288,1139216383,US -1139277824,1140072447,US -1140850688,1145044991,US -1145073664,1145077759,US -1145094144,1145098239,US -1145110528,1145118719,US -1145188352,1145192447,US -1145221120,1145241599,US -1145247744,1145262079,US -1145266176,1145270271,US -1145339904,1145348095,US -1145376768,1145380863,US -1145454592,1145462783,US -1145487360,1145503743,US -1145536512,1145544703,US -1145563136,1145565183,US -1145569280,1150287871,US +1138851840,1138851847,US +1138851848,1138851855,IN +1138851856,1138865562,US +1138865563,1138865566,IN +1138865567,1138865578,US +1138865579,1138865586,IN +1138865587,1138874252,US +1138874253,1138874264,UY +1138874265,1138879999,US +1138880000,1138880511,CA +1138880512,1138882331,US +1138882332,1138882339,GB +1138882340,1138882445,US +1138882446,1138882453,GB +1138882454,1138917375,US +1138917376,1138937855,CA +1138937856,1138941951,US +1138941952,1138950143,CA +1138950144,1139120127,US +1139120128,1139124223,NZ +1139124224,1139146751,US +1139146752,1139154943,GT +1139154944,1139167231,JM +1139167232,1139179519,US +1139179520,1139195903,CA +1139195904,1139204095,US +1139212288,1139261439,US +1139261440,1139269631,CA +1139269632,1142187775,US +1142187776,1142187783,PR +1142187784,1142191847,US +1142191848,1142191855,PR +1142191856,1142202623,US +1142202624,1142202631,PR +1142202632,1142204103,US +1142204104,1142204111,PR +1142204112,1142204327,US +1142204328,1142204335,PR +1142204336,1145053455,US +1145053456,1145053471,NG +1145053472,1145056703,US +1145056704,1145056719,CO +1145056720,1145188351,US +1145188352,1145192447,CA +1145192448,1145249791,US +1145249792,1145257983,CA +1145257984,1145262079,US +1145262080,1145266175,CA +1145266176,1145307135,US +1145307136,1145311231,CA +1145311232,1145376767,US +1145376768,1145380863,CA +1145380864,1145405439,US +1145405440,1145413631,CA +1145413632,1145421823,US +1145421824,1145430015,CA +1145430016,1145434111,US +1145438208,1145475071,US +1145475072,1145479167,CA +1145479168,1145491455,US +1145503744,1145520127,CA +1145520128,1145552895,US +1145552896,1145556991,CA +1145556992,1150043135,US +1150043136,1150044159,VA +1150044160,1150046207,US +1150046208,1150050303,JP +1150050304,1150287871,US 1150287872,1150812159,CA -1150812160,1151864831,US -1151877120,1151886335,US -1151887872,1151888127,US -1151893504,1151899647,US -1151909888,1151910399,US -1151910912,1151911935,US -1151918080,1151926271,US -1152016384,1152024575,US -1152040960,1152049151,US -1152077824,1152082431,US -1152122880,1152581631,US +1150812160,1151889407,US +1151889408,1151889423,CA +1151889424,1151889431,US +1151889432,1151889447,CA +1151889448,1151889455,FR +1151889456,1151889471,CA +1151889472,1151889487,RU +1151889488,1151889495,CA +1151889496,1151889535,MA +1151889536,1151889599,CN +1151889600,1151889607,RU +1151889608,1151889615,CA +1151889616,1151889631,MA +1151889632,1151889647,CA +1151889648,1151889663,KE +1151889664,1151889791,CA +1151889792,1151889823,MA +1151889824,1151889839,CA +1151889840,1151889847,PH +1151889848,1151889919,CA +1151889920,1151889943,GB +1151889944,1151890007,CA +1151890008,1151890015,GB +1151890016,1151890079,CA +1151890080,1151890087,GB +1151890088,1151890095,CA +1151890096,1151890127,GB +1151890128,1151890215,CA +1151890216,1151890223,GB +1151890224,1151892735,CA +1151892736,1151892991,MA +1151892992,1151897599,CA +1151897600,1151943679,US +1151943680,1151943807,GB +1151943808,1151943871,NL +1151943872,1151943935,CA +1151943936,1151943999,DE +1151944000,1151944063,HK +1151944064,1151944079,CH +1151944080,1151944095,NO +1151944096,1151944111,KR +1151944112,1151944127,US +1151944128,1151944159,AU +1151944160,1151944175,FR +1151944176,1151944575,US +1151944576,1151944703,ES +1151944704,1151945727,US +1151945728,1151945759,RU +1151945760,1151945791,IE +1151945792,1151945823,IT +1151945824,1151945855,AT +1151945856,1151945887,SE +1151945888,1151945919,US +1151945920,1151945935,JP +1151945936,1151946239,US +1151946240,1151946751,GB +1151946752,1151954943,US +1151959040,1152057343,US +1152057344,1152061439,CA +1152061440,1152073727,US +1152073728,1152077823,CA +1152077824,1152581631,US 1152581632,1152614399,CA -1152614400,1152643071,US -1152647168,1152778239,US +1152614400,1152778239,US 1152778240,1152843775,CA -1152843776,1156055039,US -1156058368,1156058623,US -1156059136,1156060159,US -1156104192,1156112383,US -1156128768,1156132863,US -1156136960,1156161535,US -1156177920,1156186111,US -1156256768,1156257791,US -1156259840,1156268031,US -1156300800,1156308991,US -1156317184,1157713663,US +1152843776,1154488319,US +1154488320,1154488575,A2 +1154488576,1156071423,US +1156071424,1156079615,CA +1156079616,1156259839,US +1156259840,1156265983,CA +1156265984,1156276223,US +1156284416,1156296703,US +1156296704,1156300799,CA +1156300800,1156335367,US +1156335368,1156335375,PR +1156335376,1157670431,US +1157670432,1157670463,CA +1157670464,1157713663,US 1157713664,1157713791,CA -1157713792,1157931007,US +1157713792,1157755247,US +1157755248,1157755263,GR +1157755264,1157931007,US 1157931008,1157935103,BS 1157935104,1157943295,US 1157943296,1157947391,CA -1157947392,1158027263,US +1157947392,1157950919,US +1157950920,1157950975,HK +1157950976,1158027263,US 1158027264,1158027519,CA 1158027520,1158028287,US 1158028288,1158028543,CA 1158028544,1158148095,US 1158148096,1158152191,CA -1158152192,1158193151,US -1158193152,1158197247,CA -1158197248,1158291455,US -1158291456,1158291711,GB -1158291712,1158294719,US +1158152192,1158234111,US +1158234112,1158242047,CA +1158242048,1158242303,US +1158242304,1158249727,CA +1158249728,1158294719,US 1158294720,1158294751,GB 1158294752,1158295807,US 1158295808,1158296063,GB 1158296064,1158316031,US -1158316032,1158320031,CA +1158316032,1158316671,CA +1158316672,1158316735,A1 +1158316736,1158318847,CA +1158318848,1158318975,A1 +1158318976,1158319295,CA +1158319296,1158319359,A1 +1158319360,1158319871,CA +1158319872,1158319935,A1 +1158319936,1158320031,CA 1158320032,1158320047,SY -1158320048,1158322671,CA +1158320048,1158320383,CA +1158320384,1158320511,A1 +1158320512,1158320575,CA +1158320576,1158320639,A1 +1158320640,1158321663,CA +1158321664,1158321791,A1 +1158321792,1158322671,CA 1158322672,1158322687,SY -1158322688,1158324223,CA +1158322688,1158323535,CA +1158323536,1158323551,SY +1158323552,1158323695,CA +1158323696,1158323711,SY +1158323712,1158324127,CA +1158324128,1158324159,A1 +1158324160,1158324223,CA 1158324224,1158340607,US 1158340608,1158343199,CA 1158343200,1158343231,US 1158343232,1158344703,CA 1158344704,1158348799,US 1158348800,1158381567,CA -1158381568,1158774783,US +1158381568,1158481417,US +1158481418,1158481426,CA +1158481427,1158481427,US +1158481428,1158481436,CA +1158481437,1158481507,US +1158481508,1158481516,CA +1158481517,1158481597,US +1158481598,1158481606,CA +1158481607,1158481737,US +1158481738,1158481745,CA +1158481746,1158488529,US +1158488530,1158488542,IL +1158488543,1158488833,US +1158488834,1158488846,IL +1158488847,1158493441,US +1158493442,1158493566,CA +1158493567,1158496497,US +1158496498,1158496506,TC +1158496507,1158496530,US +1158496531,1158496539,WS +1158496540,1158496779,US +1158496780,1158496788,FJ +1158496789,1158496797,BE +1158496798,1158496806,US +1158496807,1158496815,PE +1158496816,1158497616,US +1158497617,1158497625,CH +1158497626,1158497652,US +1158497653,1158497661,CA +1158497662,1158497670,GE +1158497671,1158497770,US +1158497771,1158497779,CA +1158497780,1158497825,US +1158497826,1158497834,GE +1158497835,1158497865,WS +1158497866,1158498032,US +1158498033,1158498041,HK +1158498042,1158498282,US +1158498283,1158498291,MX +1158498292,1158498457,US +1158498458,1158498466,GR +1158498467,1158498778,US +1158498779,1158498787,IT +1158498788,1158499171,US +1158499172,1158499179,VI +1158499180,1158499315,US +1158499316,1158499326,CA +1158499327,1158499382,US +1158499383,1158499391,AS +1158499392,1158499400,NL +1158499401,1158499409,FR +1158499410,1158499584,US +1158499585,1158499838,CA +1158499839,1158501120,US +1158501121,1158501374,PR +1158501375,1158504775,US +1158504776,1158504784,CA +1158504785,1158504836,US +1158504837,1158504845,JM +1158504846,1158504863,US +1158504864,1158504872,GR +1158504873,1158504941,US +1158504942,1158504950,CA +1158504951,1158504951,US +1158504952,1158504959,KE +1158504960,1158505490,US +1158505491,1158505499,CA +1158505500,1158505653,US +1158505654,1158505727,AU +1158505728,1158506793,US +1158506794,1158506809,IN +1158506810,1158512741,US +1158512742,1158512750,PK +1158512751,1158513023,US +1158513024,1158513032,CR +1158513033,1158513050,US +1158513051,1158513059,AS +1158513060,1158513070,US +1158513071,1158513079,AS +1158513080,1158513362,US +1158513363,1158513371,TC +1158513372,1158513398,US +1158513399,1158513407,CA +1158513408,1158513600,US +1158513601,1158513609,CA +1158513610,1158513618,US +1158513619,1158513627,CO +1158513628,1158513682,US +1158513683,1158513691,CA +1158513692,1158513756,US +1158513757,1158513765,TC +1158513766,1158513850,US +1158513851,1158513859,SZ +1158513860,1158513877,US +1158513878,1158513886,BZ +1158513887,1158514057,US +1158514058,1158514066,SN +1158514067,1158514075,US +1158514076,1158514084,MX +1158514085,1158514129,US +1158514130,1158514138,TW +1158514139,1158514331,US +1158514332,1158514340,CA +1158514341,1158514349,US +1158514350,1158514358,MX +1158514359,1158514367,US +1158514368,1158514376,CA +1158514377,1158514432,US +1158514433,1158514560,AS +1158514561,1158514664,US +1158514665,1158514673,FR +1158514674,1158514787,US +1158514788,1158514796,AS +1158514797,1158515273,US +1158515274,1158515282,BZ +1158515283,1158516844,US +1158516845,1158516853,CA +1158516854,1158516859,US +1158516860,1158516868,AU +1158516869,1158516938,US +1158516939,1158516947,CA +1158516948,1158517284,US +1158517285,1158517293,PK +1158517294,1158517426,US +1158517427,1158517435,BG +1158517436,1158517466,US +1158517467,1158517475,BE +1158517476,1158518020,US +1158518021,1158518029,CA +1158518030,1158518107,US +1158518108,1158518116,TH +1158518117,1158518246,US +1158518247,1158518255,CA +1158518256,1158518347,US +1158518348,1158518356,NO +1158518357,1158518727,US +1158518728,1158518736,SZ +1158518737,1158518784,US +1158518785,1158519038,NO +1158519039,1158519049,US +1158519050,1158519058,CH +1158519059,1158519067,NL +1158519068,1158519473,US +1158519474,1158519483,CA +1158519484,1158519616,US +1158519617,1158519625,WS +1158519626,1158519758,US +1158519759,1158519776,CA +1158519777,1158519794,US +1158519795,1158519803,NO +1158519804,1158519826,US +1158519827,1158519953,WS +1158519954,1158520541,US +1158520542,1158520550,IS +1158520551,1158525184,US +1158525185,1158525320,BE +1158525321,1158525741,US +1158525742,1158525750,BZ +1158525751,1158525776,US +1158525777,1158525785,FR +1158525786,1158525821,US +1158525822,1158525830,IT +1158525831,1158526297,US +1158526298,1158526306,IT +1158526307,1158526335,US +1158526336,1158526344,FR +1158526345,1158526346,US +1158526347,1158526355,PE +1158526356,1158526357,US +1158526358,1158526366,CA +1158526367,1158526368,US +1158526369,1158526377,CH +1158526378,1158526930,US +1158526931,1158526963,AS +1158526964,1158526987,US +1158526988,1158526996,MY +1158526997,1158527068,US +1158527069,1158527077,WS +1158527078,1158527086,US +1158527087,1158527095,CA +1158527096,1158527097,US +1158527098,1158527106,KE +1158527107,1158527133,US +1158527134,1158527142,FR +1158527143,1158527216,US +1158527217,1158527225,CA +1158527226,1158527288,US +1158527289,1158527297,CA +1158527298,1158527306,US +1158527307,1158527315,BA +1158527316,1158527454,US +1158527455,1158527463,IR +1158527464,1158527839,US +1158527840,1158527848,AS +1158527849,1158528256,US +1158528257,1158528511,CA +1158528512,1158528512,US +1158528513,1158528521,AS +1158528522,1158528575,US +1158528576,1158528584,MX +1158528585,1158528629,US +1158528630,1158528638,CA +1158528639,1158528647,VN +1158528648,1158528755,US +1158528756,1158528764,SN +1158528765,1158528777,US +1158528778,1158528786,AS +1158528787,1158538864,US +1158538865,1158538872,WS +1158538873,1158543487,US +1158543488,1158543495,CA +1158543496,1158715007,US +1158715008,1158715039,IE +1158715040,1158716415,US +1158716416,1158716423,IN +1158716424,1158716543,US +1158716544,1158716551,IE +1158716552,1158716671,US +1158716672,1158716703,IE +1158716704,1158717967,US +1158717968,1158717983,CA +1158717984,1158717999,US +1158718000,1158718015,CY +1158718016,1158726731,US +1158726732,1158726739,CA +1158726740,1158732876,US +1158732877,1158732884,GB +1158732885,1158736241,US +1158736242,1158736249,IN +1158736250,1158741290,US +1158741291,1158741298,CA +1158741299,1158774783,US 1158774784,1158791167,CA 1158791168,1158799359,BM 1158799360,1158807551,CA -1158807552,1158995967,US -1158995968,1159004159,CA +1158807552,1158940823,US +1158940824,1158940831,ES +1158940832,1158940911,US +1158940912,1158940919,CA +1158940920,1158941247,US +1158941248,1158941255,CY +1158941256,1158941351,US +1158941352,1158941359,CR +1158941360,1158941367,CA +1158941368,1158941399,US +1158941400,1158941407,CA +1158941408,1158941775,US +1158941776,1158941791,JM +1158941792,1158941799,IE +1158941800,1158942271,US +1158942272,1158942279,IE +1158942280,1158942311,US +1158942312,1158942319,CA +1158942320,1158943271,US +1158943272,1158943279,TH +1158943280,1158943423,US +1158943424,1158943431,PK +1158943432,1158943535,US +1158943536,1158943543,CA +1158943544,1158943599,US +1158943600,1158943615,GB +1158943616,1158943863,US +1158943864,1158943871,CR +1158943872,1158943887,GB +1158943888,1158943895,US +1158943896,1158943903,GB +1158943904,1158943975,US +1158943976,1158943983,CA +1158943984,1158944279,US +1158944280,1158944287,AE +1158944288,1158944863,US +1158944864,1158944871,CA +1158944872,1158944895,US +1158944896,1158944903,ZA +1158944904,1158944951,US +1158944952,1158944959,IN +1158944960,1158945095,US +1158945096,1158945103,TH +1158945104,1158945111,RU +1158945112,1158945119,CA +1158945120,1158945271,US +1158945272,1158945287,CA +1158945288,1158945319,US +1158945320,1158945335,CA +1158945336,1158945535,US +1158945536,1158945543,CA +1158945544,1158945735,US +1158945736,1158945743,TR +1158945744,1158945791,US +1158945792,1158945815,IE +1158945816,1158945823,US +1158945824,1158945831,JP +1158945832,1158945935,US +1158945936,1158945943,CA +1158945944,1158946047,US +1158946048,1158946055,CA +1158946056,1158946063,US +1158946064,1158946071,IL +1158946072,1158946151,US +1158946152,1158946159,IE +1158946160,1158946207,US +1158946208,1158946215,CA +1158946216,1158946223,US +1158946224,1158946239,CR +1158946240,1158946335,US +1158946336,1158946343,SE +1158946344,1158946487,US +1158946488,1158946495,GB +1158946496,1158946551,US +1158946552,1158946559,CH +1158946560,1158946575,US +1158946576,1158946583,IN +1158946584,1158946631,US +1158946632,1158946639,IT +1158946640,1158946647,IL +1158946648,1158946711,US +1158946712,1158946719,HK +1158946720,1158947087,US +1158947088,1158947095,ZA +1158947096,1158947391,US +1158947392,1158947399,CA +1158947400,1158947407,GB +1158947408,1158947591,US +1158947592,1158947599,JP +1158947600,1158947647,US +1158947648,1158947655,CA +1158947656,1158947663,US +1158947664,1158947695,IE +1158947696,1158947711,US +1158947712,1158947719,CA +1158947720,1158947735,US +1158947736,1158947743,IN +1158947744,1158947791,US +1158947792,1158947799,IN +1158947800,1158947831,US +1158947832,1158947839,TR +1158947840,1158948383,US +1158948384,1158948391,IT +1158948392,1158948415,US +1158948416,1158948423,CA +1158948424,1158948895,US +1158948896,1158948903,CA +1158948904,1158948967,US +1158948968,1158948975,CA +1158948976,1158949007,US +1158949008,1158949015,IL +1158949016,1158949287,US +1158949288,1158949295,CA +1158949296,1158949407,US +1158949408,1158949415,ZA +1158949416,1158949775,US +1158949776,1158949783,GB +1158949784,1158950319,US +1158950320,1158950327,CA +1158950328,1158950335,US +1158950336,1158950351,CA +1158950352,1158950359,IN +1158950360,1158950367,CA +1158950368,1158950767,US +1158950768,1158950775,TH +1158950776,1158950783,US +1158950784,1158950791,SA +1158950792,1158951167,US +1158951168,1158951183,CA +1158951184,1158951215,US +1158951216,1158951223,CA +1158951224,1158951231,US +1158951232,1158951263,TH +1158951264,1158951423,US +1158951424,1158951439,CA +1158951440,1158951447,NL +1158951448,1158951551,US +1158951552,1158951559,NL +1158951560,1158951575,US +1158951576,1158951583,CA +1158951584,1158951743,US +1158951744,1158951751,IN +1158951752,1158951839,US +1158951840,1158951855,CA +1158951856,1158952743,US +1158952744,1158952751,FI +1158952752,1158952815,US +1158952816,1158952823,CA +1158952824,1158952895,US +1158952896,1158952903,IL +1158952904,1158954815,US +1158954816,1158954823,GB +1158954824,1158954831,CA +1158954832,1158955039,US +1158955040,1158955047,GB +1158955048,1158956063,US +1158956064,1158956079,NL +1158956080,1158956095,US +1158956096,1158956103,CA +1158956104,1158956295,US +1158956296,1158956303,CA +1158956304,1158957455,US +1158957456,1158957471,NL +1158957472,1158957647,US +1158957648,1158957655,AU +1158957656,1158957663,PE +1158957664,1158957695,US +1158957696,1158957703,TH +1158957704,1158958295,US +1158958296,1158958303,AG +1158958304,1158958311,ES +1158958312,1158958367,US +1158958368,1158958375,CA +1158958376,1158958591,US +1158958592,1158958599,ZA +1158958600,1158958671,US +1158958672,1158958679,SA +1158958680,1158958719,US +1158958720,1158958751,CA +1158958752,1158959031,US +1158959032,1158959039,CA +1158959040,1158959135,US +1158959136,1158959151,BD +1158959152,1158959679,US +1158959680,1158959687,CR +1158959688,1158960023,US +1158960024,1158960031,GB +1158960032,1158960055,US +1158960056,1158960063,GB +1158960064,1158960455,US +1158960456,1158960463,IN +1158960464,1158960535,US +1158960536,1158960543,NZ +1158960544,1158961063,US +1158961064,1158961071,TW +1158961072,1158961151,US +1158961152,1158961159,GB +1158961160,1158961175,US +1158961176,1158961183,CA +1158961184,1158961255,US +1158961256,1158961263,ES +1158961264,1158961775,US +1158961776,1158961783,CA +1158961784,1158961823,US +1158961824,1158961855,BD +1158961856,1158962175,US +1158962176,1158962183,GB +1158962184,1158962287,US +1158962288,1158962295,ZA +1158962296,1158962591,US +1158962592,1158962607,GB +1158962608,1158962615,US +1158962616,1158962623,GB +1158962624,1158963271,US +1158963272,1158963279,IE +1158963280,1158963335,US +1158963336,1158963343,SE +1158963344,1158963551,US +1158963552,1158963559,IN +1158963560,1158963647,US +1158963648,1158963663,IN +1158963664,1158963727,US +1158963728,1158963735,GB +1158963736,1158964103,US +1158964104,1158964111,IN +1158964112,1158964255,US +1158964256,1158964263,IN +1158964264,1158964287,US +1158964288,1158964319,CA +1158964320,1158964631,US +1158964632,1158964639,CA +1158964640,1158964647,MX +1158964648,1158964701,US +1158964702,1158964703,CA +1158964704,1158964799,US +1158964800,1158964807,IE +1158964808,1158964831,US +1158964832,1158964839,GB +1158964840,1158964943,US +1158964944,1158964951,MX +1158964952,1158964959,TW +1158964960,1158965087,US +1158965088,1158965111,CA +1158965112,1158965119,US +1158965120,1158965135,AR +1158965136,1158965159,US +1158965160,1158965167,IL +1158965168,1158965199,US +1158965200,1158965215,CA +1158965216,1158965247,US +1158965248,1158965255,RU +1158965256,1158965559,US +1158965560,1158965567,IN +1158965568,1158965743,US +1158965744,1158965751,IN +1158965752,1158966127,US +1158966128,1158966143,FR +1158966144,1158966335,US +1158966336,1158966343,PL +1158966344,1158966359,CA +1158966360,1158966567,US +1158966568,1158966591,CA +1158966592,1158966799,US +1158966800,1158966807,CA +1158966808,1158966887,US +1158966888,1158966895,EG +1158966896,1158966911,US +1158966912,1158966919,MX +1158966920,1158966991,US +1158966992,1158966999,CA +1158967000,1158967263,US +1158967264,1158967279,TH +1158967280,1158967327,US +1158967328,1158967335,JP +1158967336,1158967503,US +1158967504,1158967511,GB +1158967512,1158967527,US +1158967528,1158967535,CA +1158967536,1158967543,IE +1158967544,1158967559,US +1158967560,1158967567,CA +1158967568,1158967615,US +1158967616,1158967623,GT +1158967624,1158967631,US +1158967632,1158967679,CA +1158967680,1158968071,US +1158968072,1158968079,MT +1158968080,1158968103,US +1158968104,1158968111,HU +1158968112,1158968207,US +1158968208,1158968239,CA +1158968240,1158969447,US +1158969448,1158969455,CA +1158969456,1158969663,US +1158969664,1158969679,MX +1158969680,1158969703,US +1158969704,1158969711,CA +1158969712,1158970127,US +1158970128,1158970135,CA +1158970136,1158970287,US +1158970288,1158970295,CA +1158970296,1158970303,MY +1158970304,1158970919,US +1158970920,1158970927,AG +1158970928,1158970943,US +1158970944,1158970975,CA +1158970976,1158995967,US +1158995968,1158997919,CA +1158997920,1158997935,GB +1158997936,1158999271,CA +1158999272,1158999279,SK +1158999280,1158999663,CA +1158999664,1158999671,US +1158999672,1158999863,CA +1158999864,1158999871,US +1158999872,1159004159,CA 1159004160,1159213055,US 1159213056,1159217151,CA -1159217152,1159262207,US -1159266304,1159314367,US +1159217152,1159249919,US +1159249920,1159254015,PR +1159254016,1159266935,US +1159266936,1159266943,PR +1159266944,1159269119,US +1159269120,1159269375,CA +1159269376,1159274495,US +1159274496,1159274751,GB +1159274752,1159276799,US +1159276800,1159277055,A2 +1159277056,1159281151,US +1159281152,1159281407,HK +1159281408,1159281679,US +1159281680,1159281695,HK +1159281696,1159281727,US +1159281728,1159281743,HK +1159281744,1159281919,US +1159281920,1159282175,HK +1159282176,1159292807,US +1159292808,1159292815,AU +1159292816,1159293343,US +1159293344,1159293359,KR +1159293360,1159293487,US +1159293488,1159293503,BR +1159293504,1159300607,US +1159300608,1159300863,SE +1159300864,1159304223,US +1159304224,1159304255,CA +1159304256,1159313919,US +1159313920,1159313927,MX +1159313928,1159314079,US +1159314080,1159314087,TR +1159314088,1159314367,US 1159314368,1159314383,BR -1159314384,1159314543,US -1159314544,1159314559,GB -1159314560,1159348223,US +1159314384,1159314687,US +1159314688,1159314703,MX +1159314704,1159318015,US +1159318016,1159318047,GB +1159318048,1159328655,US +1159328656,1159328671,FR +1159328672,1159348223,US 1159348224,1159356415,CA -1159356416,1159405567,US -1159409664,1159421951,US +1159356416,1159421951,US 1159421952,1159430143,CA -1159430144,1159512575,US -1159512576,1159512831,CA -1159512832,1159514111,US -1159514112,1159514367,CA -1159514368,1159515391,US +1159430144,1159441343,US +1159441344,1159441375,CA +1159441376,1159480439,US +1159480440,1159480447,CA +1159480448,1159481167,US +1159481168,1159481183,VG +1159481184,1159481855,US +1159481856,1159481887,EG +1159481888,1159482423,US +1159482424,1159482431,AN +1159482432,1159512063,US +1159512064,1159512159,CA +1159512160,1159512191,US +1159512192,1159512895,CA +1159512896,1159512959,US +1159512960,1159513007,CA +1159513008,1159513023,US +1159513024,1159513343,CA +1159513344,1159513375,US +1159513376,1159513439,CA +1159513440,1159513471,US +1159513472,1159513519,CA +1159513520,1159513535,US +1159513536,1159513567,CA +1159513568,1159513599,US +1159513600,1159514879,CA +1159514880,1159515391,US 1159515392,1159515647,CA -1159515648,1159515807,US -1159515808,1159515839,CA -1159515840,1159515903,US +1159515648,1159515711,US +1159515712,1159515887,CA +1159515888,1159515895,US +1159515896,1159515903,MX 1159515904,1159516159,CA -1159516160,1159519743,US -1159519744,1159520255,CA -1159520256,1159521535,US -1159521536,1159521791,CA -1159521792,1159522287,US +1159516160,1159516255,US +1159516256,1159516287,CA +1159516288,1159517119,US +1159517120,1159517151,CA +1159517152,1159517183,US +1159517184,1159517327,CA +1159517328,1159517343,US +1159517344,1159517359,CA +1159517360,1159517439,US +1159517440,1159517599,CA +1159517600,1159517631,US +1159517632,1159517679,CA +1159517680,1159517695,US +1159517696,1159517975,CA +1159517976,1159517991,US +1159517992,1159518007,CA +1159518008,1159518015,US +1159518016,1159518175,CA +1159518176,1159518199,US +1159518200,1159518207,CA +1159518208,1159519743,US +1159519744,1159520767,CA +1159520768,1159520799,US +1159520800,1159521023,CA +1159521024,1159521087,US +1159521088,1159521199,CA +1159521200,1159521215,US +1159521216,1159521823,CA +1159521824,1159521855,US +1159521856,1159522031,CA +1159522032,1159522047,US +1159522048,1159522095,CA +1159522096,1159522111,US +1159522112,1159522143,CA +1159522144,1159522167,US +1159522168,1159522175,CA +1159522176,1159522207,US +1159522208,1159522239,CA +1159522240,1159522271,BV +1159522272,1159522287,CA 1159522288,1159522303,BV -1159522304,1159522815,CA -1159522816,1159523583,US -1159523584,1159523839,CA -1159523840,1159524095,US -1159524096,1159524351,CA -1159524352,1159525375,US +1159522304,1159523327,CA +1159523328,1159523583,US +1159523584,1159524351,CA +1159524352,1159525071,US +1159525072,1159525087,CA +1159525088,1159525375,US 1159525376,1159526399,CA 1159526400,1159527935,US 1159527936,1159528191,CA -1159528192,1159667711,US -1159667712,1159669759,AU +1159528192,1159530671,US +1159530672,1159530679,MO +1159530680,1159532103,US +1159532104,1159532111,MO +1159532112,1159560207,US +1159560208,1159560215,MO +1159560216,1159643439,US +1159643440,1159643455,TR +1159643456,1159643471,JP +1159643472,1159656487,US +1159656488,1159656511,BR +1159656512,1159657023,US +1159657024,1159657039,AU +1159657040,1159657071,US +1159657072,1159657087,NZ +1159657088,1159659063,US +1159659064,1159659079,IN +1159659080,1159667967,US +1159667968,1159668991,AU +1159668992,1159669247,US +1159669248,1159669759,AU 1159669760,1159700479,US 1159700480,1159725055,CA -1159725056,1160011775,US -1160011776,1160019967,CA -1160019968,1160040447,US -1160044544,1160364031,US +1159725056,1159988735,US +1159988736,1159988991,MX +1159988992,1159990783,US +1159990784,1159991039,MX +1159991040,1159995935,US +1159995936,1159995951,CA +1159995952,1159996063,US +1159996064,1159996079,GB +1159996080,1159996287,US +1159996288,1159996319,AU +1159996320,1159996383,US +1159996384,1159996415,AU +1159996416,1159997583,US +1159997584,1159997591,BB +1159997592,1159997623,US +1159997624,1159997631,SC +1159997632,1159997639,GB +1159997640,1159998575,US +1159998576,1159998583,UG +1159998584,1159998703,US +1159998704,1159998711,RS +1159998712,1160011775,US +1160011776,1160012783,CA +1160012784,1160012791,US +1160012792,1160013399,CA +1160013400,1160013423,US +1160013424,1160013463,CA +1160013464,1160013479,US +1160013480,1160013647,CA +1160013648,1160013663,US +1160013664,1160013679,CA +1160013680,1160013687,US +1160013688,1160014775,CA +1160014776,1160014783,US +1160014784,1160014959,CA +1160014960,1160014967,US +1160014968,1160015007,CA +1160015008,1160015015,US +1160015016,1160015031,CA +1160015032,1160015039,US +1160015040,1160015063,CA +1160015064,1160015071,US +1160015072,1160015143,CA +1160015144,1160015151,US +1160015152,1160015167,CA +1160015168,1160015191,US +1160015192,1160015231,CA +1160015232,1160015239,US +1160015240,1160015279,CA +1160015280,1160015287,US +1160015288,1160015311,CA +1160015312,1160015327,US +1160015328,1160015999,CA +1160016000,1160016095,US +1160016096,1160016183,CA +1160016184,1160016191,US +1160016192,1160016223,CA +1160016224,1160016239,US +1160016240,1160016247,CA +1160016248,1160016263,US +1160016264,1160016271,CA +1160016272,1160016279,US +1160016280,1160016295,CA +1160016296,1160016319,US +1160016320,1160016343,CA +1160016344,1160016351,US +1160016352,1160016359,CA +1160016360,1160016383,US +1160016384,1160016895,CA +1160016896,1160016903,US +1160016904,1160016943,CA +1160016944,1160016951,US +1160016952,1160017023,CA +1160017024,1160017031,US +1160017032,1160017143,CA +1160017144,1160017159,US +1160017160,1160019967,CA +1160019968,1160364031,US 1160364032,1160368127,CA -1160368128,1160392703,US -1160392704,1160395519,CA -1160395520,1160395775,US -1160395776,1160396799,CA -1160396800,1160415637,US +1160368128,1160392751,US +1160392752,1160392799,CA +1160392800,1160392815,US +1160392816,1160392939,CA +1160392940,1160392959,US +1160392960,1160393031,CA +1160393032,1160393039,US +1160393040,1160393055,CA +1160393056,1160393087,US +1160393088,1160393151,CA +1160393152,1160393215,US +1160393216,1160393279,CA +1160393280,1160393295,HK +1160393296,1160393311,CA +1160393312,1160393327,US +1160393328,1160393343,CA +1160393344,1160393359,US +1160393360,1160393535,CA +1160393536,1160393599,US +1160393600,1160393791,CA +1160393792,1160393799,HK +1160393800,1160393807,US +1160393808,1160393871,CA +1160393872,1160393879,GB +1160393880,1160393951,CA +1160393952,1160393959,HK +1160393960,1160393983,CA +1160393984,1160394239,US +1160394240,1160394295,CA +1160394296,1160394303,US +1160394304,1160394495,CA +1160394496,1160394751,US +1160394752,1160395007,CA +1160395008,1160395263,US +1160395264,1160395391,CA +1160395392,1160395775,US +1160395776,1160396031,CA +1160396032,1160396287,US +1160396288,1160396543,CA +1160396544,1160397007,US +1160397008,1160397023,GB +1160397024,1160405503,US +1160405504,1160405615,DO +1160405616,1160405631,US +1160405632,1160406015,DO +1160406016,1160406271,US +1160406272,1160406303,VE +1160406304,1160406319,US +1160406320,1160406335,DO +1160406336,1160406479,US +1160406480,1160406487,A2 +1160406488,1160408095,US +1160408096,1160408111,GD +1160408112,1160408319,US +1160408320,1160408575,CA +1160408576,1160409423,US +1160409424,1160409439,PT +1160409440,1160409599,US +1160409600,1160410111,CO +1160410112,1160410143,US +1160410144,1160410175,PR +1160410176,1160410191,US +1160410192,1160410207,BM +1160410208,1160410239,US +1160410240,1160410255,MX +1160410256,1160410447,US +1160410448,1160410463,UY +1160410464,1160410479,TT +1160410480,1160410495,US +1160410496,1160410511,PR +1160410512,1160410519,EC +1160410520,1160410551,US +1160410552,1160410559,EC +1160410560,1160411407,US +1160411408,1160411423,GB +1160411424,1160411567,US +1160411568,1160411583,BR +1160411584,1160412863,US +1160412864,1160412879,GT +1160412880,1160415637,US 1160415638,1160415733,KN -1160415734,1160425471,US +1160415734,1160415746,US +1160415747,1160415776,CA +1160415777,1160425471,US 1160425472,1160429567,CA -1160429568,1160543327,US +1160429568,1160433695,US +1160433696,1160433711,GR +1160433712,1160434015,US +1160434016,1160434047,TR +1160434048,1160434111,PT +1160434112,1160434303,US +1160434304,1160434367,NL +1160434368,1160434559,US +1160434560,1160434623,GB +1160434624,1160434879,US +1160434880,1160434943,IN +1160434944,1160435007,US +1160435008,1160435199,IN +1160435200,1160436543,US +1160436544,1160436575,ID +1160436576,1160436607,CO +1160436608,1160436799,US +1160436800,1160436863,PK +1160436864,1160436927,PT +1160436928,1160437119,US +1160437120,1160437183,IT +1160437184,1160437247,US +1160437248,1160437279,PT +1160437280,1160437343,US +1160437344,1160437375,CA +1160437376,1160437503,US +1160437504,1160437535,PT +1160437536,1160437695,US +1160437696,1160437759,IN +1160437760,1160483263,US +1160483264,1160483295,MX +1160483296,1160486911,US +1160486912,1160487423,AU +1160487424,1160503295,US +1160503296,1160503871,A2 +1160503872,1160503903,US +1160503904,1160507391,A2 +1160507392,1160542207,US +1160542208,1160542239,LB +1160542240,1160543327,US 1160543328,1160543359,MX -1160543360,1160544047,US -1160544048,1160544071,CA -1160544072,1160547839,US +1160543360,1160544055,US +1160544056,1160544071,CA +1160544072,1160544135,US +1160544136,1160544143,LB +1160544144,1160547839,US 1160547840,1160548351,MX 1160548352,1160563199,US 1160563200,1160563711,MP @@ -10076,10 +19790,122 @@ 1160677440,1160678399,US 1160678400,1160678655,MX 1160678656,1160683519,US -1160683520,1160691711,CA -1160691712,1160808255,US +1160683520,1160684039,CA +1160684040,1160684047,US +1160684048,1160684063,CA +1160684064,1160684071,US +1160684072,1160684615,CA +1160684616,1160684623,US +1160684624,1160684631,CA +1160684632,1160684639,US +1160684640,1160684887,CA +1160684888,1160684895,US +1160684896,1160686567,CA +1160686568,1160686575,US +1160686576,1160687271,CA +1160687272,1160687279,US +1160687280,1160687583,CA +1160687584,1160687591,US +1160687592,1160688191,CA +1160688192,1160688199,US +1160688200,1160688255,CA +1160688256,1160688263,US +1160688264,1160688351,CA +1160688352,1160688359,US +1160688360,1160688555,CA +1160688556,1160688578,US +1160688579,1160688687,CA +1160688688,1160688695,US +1160688696,1160688703,CA +1160688704,1160688711,US +1160688712,1160688767,CA +1160688768,1160688783,US +1160688784,1160688815,CA +1160688816,1160688823,US +1160688824,1160688831,CA +1160688832,1160688839,US +1160688840,1160689167,CA +1160689168,1160689175,US +1160689176,1160689199,CA +1160689200,1160689207,US +1160689208,1160689231,CA +1160689232,1160689239,US +1160689240,1160689287,CA +1160689288,1160689303,US +1160689304,1160689311,CA +1160689312,1160689319,IN +1160689320,1160689367,CA +1160689368,1160689383,US +1160689384,1160689419,CA +1160689420,1160689447,US +1160689448,1160689531,CA +1160689532,1160689571,US +1160689572,1160689693,CA +1160689694,1160689732,US +1160689733,1160689733,CA +1160689734,1160689741,US +1160689742,1160689766,CA +1160689767,1160689778,US +1160689779,1160689789,CA +1160689790,1160689799,US +1160689800,1160689800,CA +1160689801,1160689811,US +1160689812,1160689834,CA +1160689835,1160689846,US +1160689847,1160689861,CA +1160689862,1160689887,US +1160689888,1160689943,CA +1160689944,1160689971,US +1160689972,1160690103,CA +1160690104,1160690175,US +1160690176,1160690349,CA +1160690350,1160690361,US +1160690362,1160690362,CA +1160690363,1160690381,US +1160690382,1160690386,CA +1160690387,1160690415,US +1160690416,1160690447,CA +1160690448,1160690455,US +1160690456,1160690559,CA +1160690560,1160690607,US +1160690608,1160690695,CA +1160690696,1160690727,US +1160690728,1160690735,CA +1160690736,1160690751,US +1160690752,1160690783,CA +1160690784,1160690791,US +1160690792,1160690807,CA +1160690808,1160690823,US +1160690824,1160690911,CA +1160690912,1160690919,US +1160690920,1160690951,CA +1160690952,1160690959,US +1160690960,1160691011,CA +1160691012,1160691027,US +1160691028,1160691551,CA +1160691552,1160691567,US +1160691568,1160691591,CA +1160691592,1160691599,US +1160691600,1160691615,CA +1160691616,1160691631,US +1160691632,1160691639,CA +1160691640,1160691647,US +1160691648,1160691671,CA +1160691672,1160691679,US +1160691680,1160691711,CA +1160691712,1160701439,US +1160701440,1160701567,KY +1160701568,1160702447,US +1160702448,1160702455,KY +1160702456,1160702703,US +1160702704,1160702711,KY +1160702712,1160702783,US +1160702784,1160702847,KY +1160702848,1160808255,US 1160808256,1160808287,CA -1160808288,1160811551,US +1160808288,1160810495,US +1160810496,1160810751,CA +1160810752,1160811551,US 1160811552,1160811559,BE 1160811560,1160847359,US 1160847360,1160855551,CA @@ -10089,113 +19915,487 @@ 1160921088,1160925183,AG 1160925184,1160941535,US 1160941536,1160941567,CA -1160941568,1160949679,US -1160949680,1160949727,CY -1160949728,1160949743,US -1160949744,1160949759,CY -1160949760,1160970431,US -1160970432,1160970439,CA -1160970440,1160972799,US -1160972800,1160973055,AU -1160973056,1160973375,US -1160973376,1160973391,IT -1160973392,1160973471,US -1160973472,1160973503,MX -1160973504,1160973583,US -1160973584,1160973599,CA -1160973600,1160973615,US -1160973616,1160973631,VE -1160973632,1160973647,US -1160973648,1160973663,VG -1160973664,1160973823,US -1160973824,1160973839,RU -1160973840,1161019391,US +1160941568,1160945663,US +1160947712,1160948991,US +1160948992,1160949023,CA +1160949024,1160949087,US +1160949120,1160949151,US +1160949168,1160949183,JP +1160949200,1160949215,US +1160949248,1160949535,US +1160949632,1160949759,CY +1160949760,1160973439,US +1160973440,1160973503,MX +1160973504,1160973567,US +1160973568,1160973599,CA +1160973600,1160973863,US +1160973864,1160973871,GR +1160973872,1160974591,US +1160974592,1160974623,HK +1160974624,1160974975,US +1160974976,1160975007,CA +1160975008,1160975039,US +1160975040,1160975055,MX +1160975056,1160976015,US +1160976016,1160976031,MX +1160976032,1160976303,US +1160976304,1160976319,MX +1160976320,1161019391,US 1161019392,1161035775,CA -1161035776,1161154559,US -1161158656,1161187215,US -1161187216,1161187223,UM -1161187224,1161256959,US -1161265152,1161293823,US +1161035776,1161293823,US 1161293824,1161297919,CA 1161297920,1161298303,US 1161298304,1161298311,IL -1161298312,1161303283,US -1161303284,1161303291,NL -1161303292,1161311743,US +1161298312,1161304591,US +1161304592,1161304599,AU +1161304600,1161311743,US 1161311744,1161311759,KN 1161311760,1161311991,US 1161311992,1161311999,KN -1161312000,1161312991,US +1161312000,1161312839,US +1161312840,1161312855,BS +1161312856,1161312863,US +1161312864,1161312871,BS +1161312872,1161312991,US 1161312992,1161312999,IL 1161313000,1161313127,US -1161313128,1161313135,MP -1161313136,1161314295,US -1161314296,1161314303,NL -1161314304,1161363455,US +1161313128,1161313135,BS +1161313136,1161314151,US +1161314152,1161314159,CA +1161314160,1161363455,US 1161363456,1161367551,CA -1161367552,1161420799,US -1161420800,1161422079,AG +1161367552,1161416703,US +1161420800,1161421311,AG +1161421312,1161421567,AI +1161421568,1161422079,AG 1161422080,1161422335,VG 1161422336,1161422591,LC 1161422592,1161422847,AG 1161422848,1161423103,LC 1161423104,1161423359,VG -1161423360,1161423871,AG +1161423360,1161423615,AI +1161423616,1161423871,AG 1161423872,1161424127,LC -1161424128,1161424383,AG +1161424128,1161424383,AI 1161424384,1161424639,KN 1161424640,1161424895,LC 1161424896,1161425151,VG 1161425152,1161425407,DM -1161425408,1161427199,AG +1161425408,1161425663,AG +1161425664,1161425919,AI +1161425920,1161425935,AG +1161425936,1161425951,MS +1161425952,1161426143,AG +1161426144,1161426175,MS +1161426176,1161426943,AG +1161426944,1161427199,AI 1161427200,1161427455,VG 1161427456,1161428223,AG 1161428224,1161428991,KN 1161428992,1161453567,US 1161453568,1161457663,CA -1161457664,1161506815,US -1161510912,1161617407,US +1161457664,1161576447,US +1161576448,1161580543,CA +1161580544,1161586687,US +1161586688,1161586943,PA +1161586944,1161617407,US 1161617408,1161625599,CA -1161625600,1161633279,US -1161633280,1161633535,CA -1161633536,1161633791,US -1161633792,1161634047,CA -1161634048,1161635071,US -1161635072,1161635327,CA -1161635328,1161639167,US -1161639168,1161639423,CA -1161639424,1161640191,US -1161640192,1161640447,CA -1161640448,1161642239,US -1161642240,1161642495,CA -1161642496,1161644799,US -1161644800,1161645055,CA -1161645056,1161646335,US -1161646336,1161646591,CA -1161646592,1161647871,US -1161647872,1161648127,CA -1161648128,1161653503,US -1161653504,1161653759,CA -1161653760,1161764863,US +1161625600,1161627695,US +1161627696,1161627703,AR +1161627704,1161627727,US +1161627728,1161627735,AR +1161627736,1161627759,US +1161627760,1161627775,GB +1161627776,1161627839,US +1161627840,1161627863,AR +1161627864,1161628479,US +1161628480,1161628487,GB +1161628488,1161628607,US +1161628608,1161628639,AR +1161628640,1161628647,CH +1161628648,1161628655,CA +1161628656,1161628663,US +1161628664,1161628671,AR +1161628672,1161629327,US +1161629328,1161629335,RO +1161629336,1161629343,NL +1161629344,1161629391,US +1161629392,1161629399,RU +1161629400,1161629519,US +1161629520,1161629527,GB +1161629528,1161629535,MY +1161629536,1161629551,GB +1161629552,1161629567,US +1161629568,1161629575,AU +1161629576,1161629695,US +1161629696,1161629951,PL +1161629952,1161630335,US +1161630336,1161630343,PL +1161630344,1161630399,US +1161630400,1161630431,GB +1161630432,1161630727,US +1161630728,1161630735,EG +1161630736,1161630743,AU +1161630744,1161630751,GB +1161630752,1161630767,US +1161630768,1161630775,IL +1161630776,1161630791,US +1161630792,1161630799,AR +1161630800,1161630823,US +1161630824,1161630831,AR +1161630832,1161630855,US +1161630856,1161630863,DE +1161630864,1161630911,US +1161630912,1161630919,KW +1161630920,1161630927,US +1161630928,1161630935,GB +1161630936,1161630967,US +1161630968,1161630975,IL +1161630976,1161630983,US +1161630984,1161630991,CA +1161630992,1161630999,US +1161631000,1161631007,AU +1161631008,1161631015,IL +1161631016,1161631039,US +1161631040,1161631047,GB +1161631048,1161631079,US +1161631080,1161631087,AR +1161631088,1161631159,US +1161631160,1161631167,CA +1161631168,1161631183,US +1161631184,1161631199,GB +1161631200,1161631215,AR +1161631216,1161631223,GB +1161631224,1161631471,US +1161631472,1161631479,AR +1161631480,1161631487,US +1161631488,1161631495,AR +1161631496,1161631503,CA +1161631504,1161631511,US +1161631512,1161631519,BG +1161631520,1161631535,US +1161631536,1161631543,AR +1161631544,1161631551,BR +1161631552,1161631631,US +1161631632,1161631639,CH +1161631640,1161631647,US +1161631648,1161631655,AU +1161631656,1161631663,AR +1161631664,1161631703,US +1161631704,1161631711,NL +1161631712,1161632519,US +1161632520,1161632527,BG +1161632528,1161632551,US +1161632552,1161632559,BR +1161632560,1161632631,US +1161632632,1161632639,GB +1161632640,1161632655,US +1161632656,1161632663,GB +1161632664,1161632719,US +1161632720,1161632735,GB +1161632736,1161633023,US +1161633024,1161633055,IL +1161633056,1161633215,US +1161633216,1161633231,EE +1161633232,1161634063,US +1161634064,1161634071,RO +1161634072,1161634199,US +1161634200,1161634207,NZ +1161634208,1161634239,AR +1161634240,1161634247,GB +1161634248,1161634271,US +1161634272,1161634287,CH +1161634288,1161634335,US +1161634336,1161634352,PL +1161634353,1161634495,US +1161634496,1161634503,GB +1161634504,1161634943,US +1161634944,1161634959,PL +1161634960,1161634975,US +1161634976,1161635007,PL +1161635008,1161635855,US +1161635856,1161635871,BE +1161635872,1161636095,US +1161636096,1161636127,GB +1161636128,1161636159,US +1161636160,1161636223,IL +1161636224,1161636415,US +1161636416,1161636447,PL +1161636448,1161636463,US +1161636464,1161636471,EG +1161636472,1161636495,US +1161636496,1161636503,CA +1161636504,1161637159,US +1161637160,1161637167,NZ +1161637168,1161637199,US +1161637200,1161637207,GB +1161637208,1161637215,US +1161637216,1161637223,PL +1161637224,1161637295,US +1161637296,1161637303,AR +1161637304,1161637343,US +1161637344,1161637351,RU +1161637352,1161637671,US +1161637672,1161637679,IL +1161637680,1161637695,AR +1161637696,1161637775,US +1161637776,1161637783,GB +1161637784,1161638911,US +1161638912,1161638943,PL +1161638944,1161638967,US +1161638968,1161638975,GB +1161638976,1161638991,US +1161638992,1161638999,PL +1161639000,1161639063,US +1161639064,1161639071,PL +1161639072,1161639087,US +1161639088,1161639095,CA +1161639096,1161639119,US +1161639120,1161639127,DK +1161639128,1161639151,US +1161639152,1161639159,IL +1161639160,1161639447,US +1161639448,1161639455,PT +1161639456,1161639511,US +1161639512,1161639519,GB +1161639520,1161639527,PL +1161639528,1161639575,US +1161639576,1161639583,BG +1161639584,1161639703,US +1161639704,1161639711,BZ +1161639712,1161639719,PL +1161639720,1161639727,US +1161639728,1161639743,GB +1161639744,1161639831,US +1161639832,1161639839,AR +1161639840,1161639887,US +1161639888,1161639895,AT +1161639896,1161639935,US +1161639936,1161639943,CH +1161639944,1161639951,US +1161639952,1161639959,IL +1161639960,1161639967,GB +1161639968,1161639999,US +1161640000,1161640015,PL +1161640016,1161640023,US +1161640024,1161640031,AR +1161640032,1161640095,US +1161640096,1161640127,AR +1161640128,1161640767,US +1161640768,1161640791,GB +1161640792,1161640847,US +1161640848,1161640863,PL +1161640864,1161641887,US +1161641888,1161641911,KW +1161641912,1161641919,US +1161641920,1161641983,PL +1161641984,1161642007,US +1161642008,1161642015,NL +1161642016,1161642039,GB +1161642040,1161642175,US +1161642176,1161642191,GB +1161642192,1161642199,AU +1161642200,1161644655,US +1161644656,1161644671,PL +1161644672,1161644703,US +1161644704,1161644743,GB +1161644744,1161644751,AR +1161644752,1161644767,PL +1161644768,1161645839,US +1161645840,1161645855,PL +1161645856,1161645887,US +1161645888,1161645903,GB +1161645904,1161645911,US +1161645912,1161645919,GB +1161645920,1161645935,US +1161645936,1161645951,PL +1161645952,1161646863,US +1161646864,1161646879,PL +1161646880,1161646895,US +1161646896,1161646943,PL +1161646944,1161647103,US +1161647104,1161647119,PL +1161647120,1161647135,GB +1161647136,1161647167,PL +1161647168,1161650183,US +1161650184,1161650191,IL +1161650192,1161650199,US +1161650200,1161650207,BG +1161650208,1161650303,US +1161650304,1161650311,NL +1161650312,1161650327,US +1161650328,1161650335,AR +1161650336,1161650359,US +1161650360,1161650367,RO +1161650368,1161650687,US +1161650688,1161650695,AR +1161650696,1161650703,BR +1161650704,1161650847,US +1161650848,1161650863,AR +1161650864,1161650927,US +1161650928,1161650935,HR +1161650936,1161651103,US +1161651104,1161651135,GB +1161651136,1161651487,US +1161651488,1161651503,GB +1161651504,1161651935,US +1161651936,1161651967,AR +1161651968,1161651975,CH +1161651976,1161652007,US +1161652008,1161652015,GB +1161652016,1161652095,US +1161652096,1161652103,CY +1161652104,1161652127,US +1161652128,1161652135,AR +1161652136,1161653791,US +1161653792,1161653799,SI +1161653800,1161653831,US +1161653832,1161653839,HR +1161653840,1161655807,US +1161655808,1161656063,IL +1161656064,1161657615,US +1161657616,1161657623,CA +1161657624,1161657679,US +1161657680,1161657695,PL +1161657696,1161658135,US +1161658136,1161658143,AR +1161658144,1161658151,SI +1161658152,1161658159,AR +1161658160,1161764863,US 1161764864,1161773055,CA -1161777152,1161818111,US +1161773056,1161777151,SZ +1161777152,1161790407,US +1161790408,1161790416,PA +1161790417,1161790839,US +1161790840,1161790848,CA +1161790849,1161818111,US 1161818112,1161822207,CA -1161822208,1161837567,US +1161822208,1161832671,US +1161832672,1161832703,CL +1161832704,1161832799,US +1161832800,1161832831,ZA +1161832832,1161832863,DE +1161832864,1161833967,US +1161833968,1161833975,DE +1161833976,1161835341,US +1161835342,1161835353,GR +1161835354,1161836031,US +1161836032,1161836063,CA +1161836064,1161836159,US +1161836160,1161836191,BR +1161836192,1161836223,MX +1161836224,1161836255,US +1161836256,1161836287,UA +1161836288,1161836319,RS +1161836320,1161836383,US +1161836384,1161836415,CY +1161836416,1161836447,BR +1161836448,1161836479,US +1161836480,1161836511,UA +1161836512,1161837567,US 1161837568,1161837823,JP 1161837824,1161838351,US 1161838352,1161838367,GB -1161838368,1162018815,US +1161838368,1161838548,US +1161838549,1161838560,RU +1161838561,1161841101,US +1161841102,1161841112,DE +1161841113,1161842101,US +1161842102,1161842109,CH +1161842110,1161842932,US +1161842933,1161842940,MX +1161842941,1161842955,US +1161842956,1161842963,CA +1161842964,1161842970,US +1161842971,1161842978,GB +1161842979,1161843084,US +1161843085,1161843092,MX +1161843093,1161843098,US +1161843099,1161843106,MX +1161843107,1161843143,US +1161843144,1161843153,CA +1161843154,1161843245,US +1161843246,1161843253,MX +1161843254,1161865703,US +1161865704,1161865711,EG +1161865712,1161866111,US +1161866112,1161866127,MT +1161866128,1161868863,US +1161868864,1161868871,VI +1161868872,1161891287,US +1161891288,1161891295,CA +1161891296,1161891527,US +1161891528,1161891535,CA +1161891536,1161891543,US +1161891544,1161891551,CA +1161891552,1161901647,US +1161901648,1161901655,VN +1161901656,1161925631,US +1161925632,1161925887,EC +1161925888,1161926399,US +1161926400,1161926655,EC +1161926656,1162018815,US 1162018816,1162022911,CA -1162031104,1162059775,US +1162022912,1162027007,US +1162027008,1162031103,ZA +1162031104,1162031375,US +1162031376,1162031383,CA +1162031384,1162031407,US +1162031408,1162031423,DO +1162031424,1162032255,US +1162032256,1162032271,CA +1162032272,1162032287,US +1162032288,1162032303,BE +1162032304,1162032359,US +1162032360,1162032367,JO +1162032368,1162032735,US +1162032736,1162032767,CA +1162032768,1162032831,DO +1162032832,1162033247,US +1162033248,1162033263,CA +1162033264,1162033983,US +1162033984,1162034015,IN +1162034016,1162059775,US 1162059776,1162067967,CA 1162067968,1162215423,US 1162215424,1162280959,CA -1162280960,1162297343,US +1162280960,1162296007,US +1162296008,1162296023,CA +1162296024,1162296407,US +1162296408,1162296415,CA +1162296416,1162297343,US 1162297344,1162305535,CA -1162305536,1162330111,US -1162334208,1162394463,US -1162394464,1162394471,GB -1162394472,1162461183,US +1162305536,1162313727,US +1162313728,1162316799,A2 +1162316800,1162318591,BH +1162318592,1162320383,A2 +1162320384,1162320639,US +1162320640,1162321151,A2 +1162321152,1162383063,US +1162383064,1162383071,IN +1162383072,1162393759,US +1162393760,1162393767,IN +1162393768,1162394463,US +1162394464,1162394471,IE +1162394472,1162401519,US +1162401520,1162401527,IN +1162401528,1162408455,US +1162408456,1162408463,IN +1162408464,1162408599,US +1162408600,1162408607,IN +1162408608,1162408783,US +1162408784,1162408831,CR +1162408832,1162409047,US +1162409048,1162409055,IN +1162409056,1162409311,US +1162409312,1162409319,IN +1162409320,1162409479,US +1162409480,1162409487,IN +1162409488,1162409511,US +1162409512,1162409519,IN +1162409520,1162457991,US +1162457992,1162457999,ID +1162458000,1162461183,US 1162461184,1162461695,BB 1162461696,1162462207,GD 1162462208,1162462975,BB @@ -10209,13 +20409,19 @@ 1162473472,1162475007,GD 1162475008,1162477567,BB 1162477568,1162715135,US -1162715136,1162723327,CA +1162715136,1162716159,CA +1162716160,1162716175,US +1162716176,1162718495,CA +1162718496,1162718511,US +1162718512,1162719599,CA +1162719600,1162719615,US +1162719616,1162723327,CA 1162723328,1162805247,US 1162805248,1162811391,PR 1162811392,1162811647,AN 1162811648,1162812159,US 1162812160,1162812415,DO -1162812416,1162813439,US +1162812416,1162813439,BS 1162813440,1162821631,CO 1162821632,1162823679,PR 1162823680,1162825727,GT @@ -10223,137 +20429,790 @@ 1162827776,1162833919,PR 1162833920,1162835967,GT 1162835968,1162836223,BS -1162836224,1162836991,US +1162836224,1162836735,AN +1162836736,1162836991,US 1162836992,1162838015,BS -1162838016,1162870783,CO -1162903552,1163153407,US -1163157504,1163186175,US -1163190272,1163390975,US -1163395072,1163407359,US +1162838016,1162870783,US +1162870784,1162887167,BB +1162903552,1162923391,US +1162923392,1162923519,BE +1162923520,1162924031,US +1162924032,1162924287,AU +1162924288,1162925983,US +1162925984,1162926015,AU +1162926016,1162926071,US +1162926072,1162926079,AU +1162926080,1162932223,US +1162936320,1163395071,US +1163395072,1163395839,A2 +1163395840,1163395847,BD +1163395848,1163395855,ID +1163395856,1163395863,BD +1163395864,1163395871,ID +1163395872,1163395879,PK +1163395880,1163395911,ID +1163395912,1163395919,BD +1163395920,1163395927,ID +1163395928,1163395943,BD +1163395944,1163395951,A2 +1163395952,1163395959,PK +1163395960,1163396023,ID +1163396024,1163396031,PK +1163396032,1163396079,ID +1163396080,1163396087,BD +1163396088,1163396143,ID +1163396144,1163396151,BD +1163396152,1163396191,ID +1163396192,1163396199,A2 +1163396200,1163396207,ID +1163396208,1163396215,A2 +1163396216,1163396231,ID +1163396232,1163396239,A2 +1163396240,1163396247,ID +1163396248,1163396255,BD +1163396256,1163396287,ID +1163396288,1163396295,A2 +1163396296,1163396303,BD +1163396304,1163396319,A2 +1163396320,1163396327,BD +1163396328,1163396343,ID +1163396344,1163396351,A2 +1163396352,1163396383,ID +1163396384,1163396399,A2 +1163396400,1163396431,BD +1163396432,1163396519,A2 +1163396520,1163396527,ID +1163396528,1163396559,A2 +1163396560,1163396575,ID +1163396576,1163396623,A2 +1163396624,1163396639,ID +1163396640,1163396655,A2 +1163396656,1163396671,BD +1163396672,1163396687,A2 +1163396688,1163396719,BD +1163396720,1163396831,A2 +1163396832,1163396895,BD +1163396896,1163396927,ID +1163396928,1163396991,A2 +1163396992,1163397023,BD +1163397024,1163397055,A2 +1163397056,1163397087,BD +1163397088,1163397119,A2 +1163397120,1163397247,NP +1163397248,1163397375,BD +1163397376,1163397471,A2 +1163397472,1163397479,US +1163397480,1163397535,A2 +1163397536,1163397543,US +1163397544,1163397575,A2 +1163397576,1163397583,BD +1163397584,1163397663,A2 +1163397664,1163397695,BD +1163397696,1163397855,A2 +1163397856,1163397887,US +1163397888,1163398143,NP +1163398144,1163398239,A2 +1163398240,1163398303,BD +1163398304,1163398367,A2 +1163398368,1163399039,BD +1163399040,1163399103,A2 +1163399104,1163399295,BD +1163399296,1163399679,A2 +1163399680,1163399807,BD +1163399808,1163399935,A2 +1163399936,1163400063,US +1163400064,1163400447,A2 +1163400448,1163400703,BD +1163400704,1163400719,PK +1163400720,1163400727,ID +1163400728,1163400735,A2 +1163400736,1163400743,PK +1163400744,1163400751,A2 +1163400752,1163400759,PK +1163400760,1163400839,A2 +1163400840,1163400847,ID +1163400848,1163400887,A2 +1163400888,1163400927,ID +1163400928,1163401087,A2 +1163401088,1163401151,BD +1163401152,1163401215,A2 +1163401216,1163401239,ID +1163401240,1163401255,A2 +1163401256,1163401263,ID +1163401264,1163401319,A2 +1163401320,1163401327,PK +1163401328,1163401351,A2 +1163401352,1163401359,PK +1163401360,1163401431,A2 +1163401432,1163401439,PK +1163401440,1163401535,A2 +1163401536,1163401543,ID +1163401544,1163401727,A2 +1163401728,1163401791,BD +1163401792,1163401983,A2 +1163401984,1163402367,BD +1163402368,1163402495,A2 +1163402496,1163402879,BD +1163402880,1163403007,A2 +1163403008,1163403071,BD +1163403072,1163403135,US +1163403136,1163403263,A2 +1163403264,1163407359,US 1163407360,1163411455,CA -1163411456,1163527023,US +1163411456,1163468799,US +1163468800,1163472895,PR +1163472896,1163526143,US +1163526144,1163526463,CA +1163526464,1163526911,US +1163526912,1163527007,CA +1163527008,1163527023,US 1163527024,1163527039,BV -1163527040,1163527935,US -1163527936,1163529215,CA -1163529216,1163531007,US -1163531008,1163532287,CA -1163532288,1163533055,US -1163533056,1163533311,CA -1163533312,1163533567,US -1163533568,1163533631,CA -1163533632,1163536127,US -1163536128,1163536383,CA -1163536384,1163537663,US -1163537664,1163537919,CA -1163537920,1163538175,US -1163538176,1163538431,CA -1163538432,1163540735,US +1163527040,1163527059,CA +1163527060,1163527071,US +1163527072,1163527103,CA +1163527104,1163527135,US +1163527136,1163527143,CA +1163527144,1163527151,US +1163527152,1163527167,CA +1163527168,1163527743,US +1163527744,1163527775,CA +1163527776,1163527791,US +1163527792,1163528191,CA +1163528192,1163528703,US +1163528704,1163528959,CA +1163528960,1163530239,US +1163530240,1163530527,CA +1163530528,1163530543,US +1163530544,1163530639,CA +1163530640,1163530655,US +1163530656,1163530663,CA +1163530664,1163530671,US +1163530672,1163530783,CA +1163530784,1163530815,US +1163530816,1163530839,CA +1163530840,1163530847,RS +1163530848,1163530887,CA +1163530888,1163530895,US +1163530896,1163530903,CA +1163530904,1163530943,US +1163530944,1163530959,CA +1163530960,1163530967,US +1163530968,1163533023,CA +1163533024,1163533055,US +1163533056,1163533511,CA +1163533512,1163533519,US +1163533520,1163533551,CA +1163533552,1163533567,PA +1163533568,1163533695,CA +1163533696,1163533727,US +1163533728,1163533791,CA +1163533792,1163533807,US +1163533808,1163533823,CA +1163533824,1163534015,US +1163534016,1163534031,CA +1163534032,1163534047,US +1163534048,1163534063,CA +1163534064,1163534143,US +1163534144,1163534175,CA +1163534176,1163534255,US +1163534256,1163534311,CA +1163534312,1163534319,US +1163534320,1163534327,CA +1163534328,1163535359,US +1163535360,1163535679,CA +1163535680,1163535743,US +1163535744,1163535839,CA +1163535840,1163535871,US +1163535872,1163536383,CA +1163536384,1163537071,US +1163537072,1163537079,CA +1163537080,1163537663,US +1163537664,1163540479,CA +1163540480,1163540511,US +1163540512,1163540607,CA +1163540608,1163540735,US 1163540736,1163541503,CA -1163541504,1163542527,US -1163542528,1163542783,CA -1163542784,1163543295,US -1163543296,1163543551,CA -1163543552,1163544063,US -1163544064,1163544319,CA -1163544320,1163544511,US -1163544512,1163544575,CA -1163544576,1163544831,US -1163544832,1163545087,CA -1163545088,1163545471,US -1163545472,1163545599,CA -1163545600,1163546623,US -1163546624,1163546879,CA -1163546880,1163547135,US -1163547136,1163547391,CA -1163547392,1163548159,US -1163548160,1163548671,CA -1163548672,1163549695,US -1163549696,1163550207,CA -1163550208,1163550463,US -1163550464,1163550719,CA -1163550720,1163551455,US -1163551456,1163551487,CR -1163551488,1163551743,US +1163541504,1163542015,US +1163542016,1163542847,CA +1163542848,1163542855,US +1163542856,1163542919,CA +1163542920,1163542927,US +1163542928,1163542975,CA +1163542976,1163543007,US +1163543008,1163543687,CA +1163543688,1163543695,FI +1163543696,1163543839,CA +1163543840,1163543847,US +1163543848,1163543983,CA +1163543984,1163543991,US +1163543992,1163544319,CA +1163544320,1163544327,US +1163544328,1163544383,CA +1163544384,1163544423,US +1163544424,1163544575,CA +1163544576,1163544607,US +1163544608,1163544671,CA +1163544672,1163544687,US +1163544688,1163544751,CA +1163544752,1163544759,SG +1163544760,1163544783,CA +1163544784,1163544799,US +1163544800,1163545215,CA +1163545216,1163545247,FI +1163545248,1163545279,CA +1163545280,1163545303,US +1163545304,1163545311,CA +1163545312,1163545343,BV +1163545344,1163545351,US +1163545352,1163545359,CA +1163545360,1163545375,US +1163545376,1163545471,CA +1163545472,1163545599,US +1163545600,1163545631,CA +1163545632,1163545663,GB +1163545664,1163545903,CA +1163545904,1163545911,US +1163545912,1163545983,CA +1163545984,1163546015,US +1163546016,1163546039,CA +1163546040,1163546047,NZ +1163546048,1163546079,CA +1163546080,1163546111,US +1163546112,1163546119,CA +1163546120,1163546127,US +1163546128,1163546135,CA +1163546136,1163546175,US +1163546176,1163546199,CA +1163546200,1163546239,US +1163546240,1163546367,CA +1163546368,1163546375,US +1163546376,1163546391,CA +1163546392,1163546423,US +1163546424,1163546447,CA +1163546448,1163546455,US +1163546456,1163546527,CA +1163546528,1163546535,US +1163546536,1163546543,CA +1163546544,1163546559,US +1163546560,1163547455,CA +1163547456,1163547463,US +1163547464,1163547487,CA +1163547488,1163547519,US +1163547520,1163547527,CA +1163547528,1163547539,US +1163547540,1163547551,CA +1163547552,1163547567,US +1163547568,1163547583,VG +1163547584,1163547647,CA +1163547648,1163547903,US +1163547904,1163547951,CA +1163547952,1163547999,US +1163548000,1163549007,CA +1163549008,1163549023,US +1163549024,1163549183,CA +1163549184,1163549695,US +1163549696,1163550239,CA +1163550240,1163550255,US +1163550256,1163550271,CA +1163550272,1163550303,US +1163550304,1163550335,CA +1163550336,1163550351,US +1163550352,1163550367,CA +1163550368,1163550375,US +1163550376,1163550383,CA +1163550384,1163550399,US +1163550400,1163550591,CA +1163550592,1163550655,US +1163550656,1163550783,CA +1163550784,1163550815,US +1163550816,1163551071,CA +1163551072,1163551087,US +1163551088,1163551423,CA +1163551424,1163551439,US +1163551440,1163551455,CA +1163551456,1163551487,US +1163551488,1163551623,CA +1163551624,1163551631,CN +1163551632,1163551663,CA +1163551664,1163551679,US +1163551680,1163551727,CA +1163551728,1163551743,US 1163551744,1163552255,CA -1163552256,1163553535,US -1163553536,1163553791,CA -1163553792,1163554047,US -1163554048,1163554303,CA -1163554304,1163556095,US +1163552256,1163552519,US +1163552520,1163552527,CA +1163552528,1163552535,US +1163552536,1163552575,CA +1163552576,1163552607,PA +1163552608,1163552679,CA +1163552680,1163552687,US +1163552688,1163553791,CA +1163553792,1163553807,US +1163553808,1163553855,CA +1163553856,1163553871,US +1163553872,1163553919,CA +1163553920,1163553935,BV +1163553936,1163553951,US +1163553952,1163554559,CA +1163554560,1163554591,US +1163554592,1163554639,CA +1163554640,1163554647,US +1163554648,1163554655,MX +1163554656,1163554703,CA +1163554704,1163554751,US +1163554752,1163554815,CA +1163554816,1163556095,US 1163556096,1163556607,CA -1163556608,1163560959,US +1163556608,1163557727,US +1163557728,1163557759,CA +1163557760,1163558015,US +1163558016,1163558028,KW +1163558029,1163560191,US +1163560192,1163560447,CA +1163560448,1163560959,US 1163560960,1163561727,CA 1163561728,1163561983,FI -1163561984,1163562239,US +1163561984,1163561999,CA +1163562000,1163562007,US +1163562008,1163562063,CA +1163562064,1163562079,US +1163562080,1163562119,CA +1163562120,1163562127,SG +1163562128,1163562199,CA +1163562200,1163562207,US +1163562208,1163562231,CA +1163562232,1163562239,US 1163562240,1163563007,CA -1163563008,1163571199,US +1163563008,1163566047,US +1163566048,1163566079,CA +1163566080,1163567103,US +1163567104,1163568127,CA +1163568128,1163570431,US +1163570432,1163570495,CA +1163570496,1163571199,US 1163571200,1163571711,CA -1163571712,1163572479,US -1163572480,1163572511,CA -1163572512,1163575295,US -1163575296,1163575551,CA -1163575552,1163575807,US -1163575808,1163576319,CA -1163576320,1163576639,US -1163576640,1163576703,CA -1163576704,1163577151,US -1163577152,1163577215,CA -1163577216,1163577599,US -1163577600,1163577855,CA -1163577856,1163578367,US -1163578368,1163578495,CA -1163578496,1163579135,US -1163579136,1163579391,CA -1163579392,1163581695,US -1163581696,1163581951,CA -1163581952,1163582207,US -1163582208,1163583487,CA -1163583488,1163588351,US -1163588352,1163588607,CA -1163588608,1163588863,US +1163571712,1163571967,US +1163571968,1163571983,CA +1163571984,1163571999,US +1163572000,1163572031,CA +1163572032,1163572063,BE +1163572064,1163572079,CA +1163572080,1163572087,US +1163572088,1163572175,CA +1163572176,1163572183,US +1163572184,1163572223,CA +1163572224,1163572479,US +1163572480,1163572671,CA +1163572672,1163572679,US +1163572680,1163573071,CA +1163573072,1163573087,US +1163573088,1163573199,CA +1163573200,1163573215,US +1163573216,1163573263,CA +1163573264,1163573439,US +1163573440,1163573503,EG +1163573504,1163575295,US +1163575296,1163576703,CA +1163576704,1163576831,US +1163576832,1163576959,CA +1163576960,1163576991,US +1163576992,1163577087,CA +1163577088,1163577151,US +1163577152,1163577327,CA +1163577328,1163577375,US +1163577376,1163577407,CA +1163577408,1163577423,US +1163577424,1163577439,CA +1163577440,1163577871,US +1163577872,1163577919,CA +1163577920,1163577951,US +1163577952,1163578111,CA +1163578112,1163578191,US +1163578192,1163578239,CA +1163578240,1163578255,US +1163578256,1163578271,CA +1163578272,1163578287,US +1163578288,1163578335,CA +1163578336,1163578351,US +1163578352,1163578711,CA +1163578712,1163578715,US +1163578716,1163579119,CA +1163579120,1163579127,US +1163579128,1163579391,CA +1163579392,1163579519,US +1163579520,1163579647,CA +1163579648,1163579871,US +1163579872,1163579903,CA +1163579904,1163580927,US +1163580928,1163581183,CA +1163581184,1163581439,US +1163581440,1163581503,CA +1163581504,1163581567,US +1163581568,1163581591,CA +1163581592,1163581615,US +1163581616,1163581631,CA +1163581632,1163581695,US +1163581696,1163581983,CA +1163581984,1163582015,US +1163582016,1163582111,CA +1163582112,1163582127,US +1163582128,1163582159,CA +1163582160,1163582167,FI +1163582168,1163582183,CA +1163582184,1163582191,US +1163582192,1163583487,CA +1163583488,1163585855,US +1163585856,1163585887,CA +1163585888,1163585889,US +1163585890,1163585905,GB +1163585906,1163586740,US +1163586741,1163586743,CA +1163586744,1163586744,NL +1163586745,1163586745,GB +1163586746,1163587839,US +1163587840,1163588095,CA +1163588096,1163588111,US +1163588112,1163588159,CA +1163588160,1163588199,US +1163588200,1163588207,DM +1163588208,1163588215,CA +1163588216,1163588223,US +1163588224,1163588607,CA +1163588608,1163588608,US +1163588609,1163588655,CA +1163588656,1163588671,US +1163588672,1163588703,CA +1163588704,1163588711,US +1163588712,1163588727,CA +1163588728,1163588863,US 1163588864,1163589631,CA -1163589632,1167851519,US +1163589632,1163870575,US +1163870576,1163870583,CN +1163870584,1163876471,US +1163876472,1163876479,PA +1163876480,1163878399,US +1163878400,1163878407,CN +1163878408,1167320679,US +1167320680,1167320687,IN +1167320688,1167321959,US +1167321960,1167321967,GB +1167321968,1167322695,US +1167322696,1167322703,IN +1167322704,1167325935,US +1167325936,1167325951,CA +1167325952,1167326207,US +1167326208,1167326271,IN +1167326272,1167326303,US +1167326304,1167326335,IN +1167326336,1167326367,SI +1167326368,1167326399,US +1167326400,1167326431,IN +1167326432,1167326439,US +1167326440,1167326447,IN +1167326448,1167326463,US +1167326464,1167326719,IN +1167326720,1167693199,US +1167693200,1167693215,UA +1167693216,1167851519,US 1167851520,1168113663,CA -1168113664,1168130047,US -1168155648,1168158719,US -1168161280,1168161791,US -1168187904,1168188415,US -1168236544,1168244735,US -1168326656,1168343039,US -1168392192,1168408575,US -1168441344,1168457727,US -1168465920,1168467967,US -1168512000,1168512255,US -1168531456,1168539647,US -1169162240,1169182719,US -1169186816,1169190911,US -1169195008,1169203199,US +1168113664,1168211967,US +1168211968,1168220159,CA +1168228352,1168393215,US +1168393216,1168394151,CA +1168394152,1168394175,US +1168394176,1168394271,CA +1168394272,1168394287,US +1168394288,1168394367,CA +1168394368,1168394399,US +1168394400,1168394407,CA +1168394408,1168394415,US +1168394416,1168394423,CA +1168394424,1168394463,US +1168394464,1168394471,CA +1168394472,1168394479,US +1168394480,1168394495,CA +1168394496,1168394511,US +1168394512,1168394527,CA +1168394528,1168420863,US +1168420864,1168424959,CA +1168424960,1168474111,US +1168474112,1168506879,CA +1168508928,1168510975,US +1168510976,1168515071,CA +1168515072,1168670719,US +1168670720,1168687103,CA +1168687104,1168859135,US +1168859136,1168863231,CA +1168863232,1168867327,US +1168867328,1168875519,CA +1168875520,1168887807,US +1168887808,1168891903,CA +1168891904,1168916479,US +1168916480,1168932863,CA +1168932864,1168936959,US +1168936960,1168949247,CA +1168949248,1168949503,US +1168949504,1168949759,CA +1168949760,1168950271,US +1168950272,1168951823,CA +1168951824,1168952063,US +1168952064,1168952095,CA +1168952096,1168952319,US +1168952320,1168952831,CA +1168952832,1168952863,SG +1168952864,1168952879,CA +1168952880,1168952887,SG +1168952888,1168952895,CA +1168952896,1168952959,US +1168952960,1168953343,CA +1168953344,1168954015,US +1168954016,1168954047,EG +1168954048,1168954075,US +1168954076,1168954079,CA +1168954080,1168955647,US +1168955648,1168956415,CA +1168956416,1168957439,US +1168957440,1168958047,CA +1168958048,1168958055,DE +1168958056,1168958063,CA +1168958064,1168958071,US +1168958072,1168958111,CA +1168958112,1168958127,US +1168958128,1168958191,CA +1168958192,1168958207,AU +1168958208,1168958211,US +1168958212,1168958215,CA +1168958216,1168958223,US +1168958224,1168958231,SG +1168958232,1168958423,CA +1168958424,1168958463,US +1168958464,1168958479,CA +1168958480,1168958495,US +1168958496,1168958527,FR +1168958528,1168958655,US +1168958656,1168958687,EG +1168958688,1168958719,US +1168958720,1168958975,CA +1168958976,1168960543,US +1168960544,1168960591,CA +1168960592,1168960607,US +1168960608,1168960623,CA +1168960624,1168960639,US +1168960640,1168960767,CA +1168960768,1168960863,US +1168960864,1168960887,CA +1168960888,1168960895,US +1168960896,1168961887,CA +1168961888,1168961919,US +1168961920,1168961983,CA +1168961984,1168961991,US +1168961992,1168961999,CA +1168962000,1168962303,US +1168962304,1168962559,CA +1168962560,1168963071,US +1168963072,1168965631,CA +1168965632,1168973823,US +1168973824,1168982015,CA +1168982016,1169051903,US +1169051904,1169051911,SG +1169051912,1169182975,US +1169182976,1169183487,CA +1169183488,1169184767,US +1169184768,1169185023,CA +1169185024,1169185535,US +1169185536,1169186047,CA +1169186048,1169186303,SG +1169186304,1169203199,US 1169203200,1169211391,CA -1169211392,1170276351,US +1169211392,1170472959,US 1170472960,1170481151,CA +1170481152,1170489343,US 1170489344,1170497535,CA -1170505728,1170513919,CA -1170522112,1170530303,US -1170538496,1170653183,US -1170735104,1175977983,US -1175977984,1176240127,CA -1176633344,1176666111,US -1177092096,1177415679,US +1170497536,1170505727,US +1170505728,1170522111,CA +1170522112,1170544255,US +1170544256,1170544383,IN +1170544384,1170544639,US +1170544640,1170544767,MY +1170544768,1170547455,US +1170547456,1170547711,CA +1170547712,1175977983,US +1175977984,1176068167,CA +1176068168,1176068175,US +1176068176,1176068191,CA +1176068192,1176068207,US +1176068208,1176069007,CA +1176069008,1176069023,US +1176069024,1176100903,CA +1176100904,1176100911,US +1176100912,1176101023,CA +1176101024,1176101039,US +1176101040,1176101063,CA +1176101064,1176101071,US +1176101072,1176108551,CA +1176108552,1176108559,US +1176108560,1176502271,CA +1176502272,1176512151,US +1176512152,1176512159,GB +1176512160,1176609535,US +1176609536,1176609583,CA +1176609584,1176609599,US +1176609600,1176609615,CA +1176609616,1176609631,US +1176609632,1176609663,CA +1176609664,1176613927,US +1176613928,1176613935,CA +1176613936,1176616959,US +1176616960,1176619007,CA +1176619008,1176620031,CY +1176620032,1176620047,CA +1176620048,1176620055,US +1176620056,1176620095,CA +1176620096,1176620127,US +1176620128,1176620175,CA +1176620176,1176620183,US +1176620184,1176620239,CA +1176620240,1176620255,US +1176620256,1176620287,CA +1176620288,1176620319,US +1176620320,1176620487,CA +1176620488,1176620511,US +1176620512,1176620743,CA +1176620744,1176620783,US +1176620784,1176620967,CA +1176620968,1176620975,US +1176620976,1176620991,CA +1176620992,1176621055,US +1176621056,1176622079,CA +1176622080,1176623103,US +1176623104,1176623359,CA +1176623360,1176623487,US +1176623488,1176623583,CA +1176623584,1176623599,US +1176623600,1176623615,CA +1176623616,1176623871,US +1176623872,1176629303,CA +1176629304,1176629311,US +1176629312,1176629343,CA +1176629344,1176629375,US +1176629376,1176629439,GI +1176629440,1176629455,CA +1176629456,1176629463,GI +1176629464,1176629471,CA +1176629472,1176629503,US +1176629504,1176629519,CA +1176629520,1176629535,NZ +1176629536,1176629695,CA +1176629696,1176629727,US +1176629728,1176631295,CA +1176631296,1176631807,US +1176631808,1176632063,CR +1176632064,1176662015,US +1176662016,1176666111,CA +1176666112,1176682527,US +1176682528,1176682535,JM +1176682536,1176682543,US +1176682544,1176682559,TR +1176682560,1176682623,US +1176682624,1176682631,JM +1176682632,1176682639,US +1176682640,1176682687,TR +1176682688,1176686591,US +1176686592,1176686599,PK +1176686600,1176686623,US +1176686624,1176686631,IL +1176686632,1176686719,US +1176686720,1176686751,CA +1176686752,1176686847,US +1176686848,1176687103,AN +1176687104,1176702975,US +1176702976,1176707071,CA +1176707072,1176731647,US +1176731648,1176735743,PR +1176735744,1176739839,A2 +1176739840,1176743935,CA +1176748032,1176752127,US +1176752128,1176756223,CA +1176756224,1176764415,US +1176764416,1176768511,PM +1176768512,1176776703,US +1176776704,1176780799,CA +1176780800,1176895487,US +1176895488,1176896519,CA +1176896520,1176896527,MX +1176896528,1176896543,CA +1176896544,1176896551,MX +1176896552,1176897047,CA +1176897048,1176897055,US +1176897056,1176899151,CA +1176899152,1176899159,KZ +1176899160,1176908223,CA +1176908224,1176908231,MX +1176908232,1176909671,CA +1176909672,1176909679,US +1176909680,1176925007,CA +1176925008,1176925015,NG +1176925016,1176928255,CA +1176928256,1176997375,US +1176997376,1176997407,GB +1176997408,1177030655,US +1177030656,1177033727,AG +1177033728,1177053695,US +1177053696,1177053951,GB +1177053952,1177059327,US +1177059328,1177061375,CA +1177061376,1177063423,US +1177063424,1177067519,CA +1177067520,1177071615,US +1177071616,1177074687,CA +1177074688,1177164255,US +1177164256,1177164263,CA +1177164264,1177164415,US +1177164416,1177164479,CA +1177164480,1177164511,US +1177164512,1177164543,CA +1177164544,1177164927,US +1177164928,1177164943,CA +1177164944,1177165311,US +1177165312,1177165823,CA +1177165824,1177168127,US +1177168128,1177168143,FR +1177168144,1177169687,US +1177169688,1177169695,GB +1177169696,1177175199,US +1177175200,1177175231,CZ +1177175232,1177182527,US +1177182528,1177182591,CA +1177182592,1177187663,US +1177187664,1177187671,GB +1177187672,1177210983,US +1177210984,1177211007,FR +1177211008,1177354239,US +1177354240,1177419775,PR 1177419776,1177550847,US 1177550848,1178000911,CA 1178000912,1178000919,US 1178000920,1178075135,CA 1178075136,1178599423,US 1178599424,1179910143,CA -1179910144,1191604223,US -1191608320,1191673855,US +1179910144,1184805887,US +1184805888,1184806015,A2 +1184806016,1184811007,US +1184811008,1184811263,A2 +1184811264,1184829439,US +1184829440,1184829695,A2 +1184829696,1189130447,US +1189130448,1189130463,IN +1189130464,1190170111,US +1190170112,1190170127,UY +1190170128,1190983455,US +1190983456,1190983487,UA +1190983488,1191673855,US 1191673856,1191706623,CA 1191706624,1192296447,US 1192296448,1192361983,CA 1192361984,1192427519,US 1192427520,1192460287,CA -1192460288,1192493055,US -1192755200,1207975935,US +1192493056,1207975935,US 1207975936,1207980031,CA 1207980032,1208008703,US 1208008704,1208016895,CA @@ -10361,37 +21220,787 @@ 1208020992,1208025087,CA 1208025088,1208050943,US 1208050944,1208051199,CA -1208051200,1208074239,US -1208074240,1208082431,CA +1208051200,1208054271,US +1208054272,1208054527,CA +1208054528,1208074239,US +1208074240,1208078527,CA +1208078528,1208078591,US +1208078592,1208079103,CA +1208079104,1208079167,US +1208079168,1208082431,CA 1208082432,1208090623,US 1208090624,1208107007,CA -1208107008,1208250367,US -1208254464,1208266751,US -1208270848,1208582143,US -1208586240,1208590335,US +1208107008,1208189951,US +1208189952,1208190015,GB +1208190016,1208190543,US +1208190544,1208190559,GB +1208190560,1208190583,US +1208190584,1208190591,GB +1208190592,1208190607,US +1208190608,1208190615,GB +1208190616,1208190999,US +1208191000,1208191007,CA +1208191008,1208191047,US +1208191048,1208191055,AU +1208191056,1208191087,US +1208191088,1208191095,NO +1208191096,1208191199,US +1208191200,1208191215,CA +1208191216,1208191223,US +1208191224,1208191231,BG +1208191232,1208191311,US +1208191312,1208191319,GB +1208191320,1208191359,US +1208191360,1208191367,GB +1208191368,1208191391,US +1208191392,1208191423,NO +1208191424,1208191447,US +1208191448,1208191455,IE +1208191456,1208191567,US +1208191568,1208191575,SG +1208191576,1208191647,US +1208191648,1208191655,AG +1208191656,1208192167,US +1208192168,1208192175,BM +1208192176,1208192359,US +1208192360,1208192367,GB +1208192368,1208192879,US +1208192880,1208192895,MY +1208192896,1208192903,US +1208192904,1208192911,CA +1208192912,1208192959,US +1208192960,1208192967,IL +1208192968,1208193135,US +1208193136,1208193151,MY +1208193152,1208193303,US +1208193304,1208193311,CA +1208193312,1208193391,US +1208193392,1208193407,AU +1208193408,1208193455,US +1208193456,1208193463,PA +1208193464,1208193599,US +1208193600,1208193615,CA +1208193616,1208193871,US +1208193872,1208193879,AU +1208193880,1208193935,US +1208193936,1208193943,CA +1208193944,1208194055,US +1208194056,1208194063,AU +1208194064,1208194087,US +1208194088,1208194095,AU +1208194096,1208194191,US +1208194192,1208194223,MY +1208194224,1208195359,US +1208195360,1208195375,MY +1208195376,1208195391,US +1208195392,1208195399,IN +1208195400,1208195447,US +1208195448,1208195455,GB +1208195456,1208195535,US +1208195536,1208195551,GB +1208195552,1208195703,US +1208195704,1208195711,CA +1208195712,1208195727,TH +1208195728,1208195759,US +1208195760,1208195775,BG +1208195776,1208195847,US +1208195848,1208195855,FR +1208195856,1208195871,GB +1208195872,1208195887,US +1208195888,1208195903,ID +1208195904,1208196143,US +1208196144,1208196151,AU +1208196152,1208196327,US +1208196328,1208196335,CA +1208196336,1208196607,US +1208196608,1208196615,CA +1208196616,1208196703,US +1208196704,1208196719,CA +1208196720,1208197023,US +1208197024,1208197031,CR +1208197032,1208197135,US +1208197136,1208197167,MY +1208197168,1208197175,US +1208197176,1208197183,AU +1208197184,1208197239,US +1208197240,1208197247,CA +1208197248,1208197519,US +1208197520,1208197527,AU +1208197528,1208197559,US +1208197560,1208197567,AU +1208197568,1208197631,US +1208197632,1208197639,AU +1208197640,1208197671,US +1208197672,1208197679,MX +1208197680,1208197783,US +1208197784,1208197791,CA +1208197792,1208197967,US +1208197968,1208197983,AU +1208197984,1208198039,US +1208198040,1208198047,BS +1208198048,1208198135,US +1208198136,1208198143,AU +1208198144,1208198279,US +1208198280,1208198287,ZA +1208198288,1208198303,US +1208198304,1208198319,FR +1208198320,1208198463,US +1208198464,1208198471,CA +1208198472,1208198559,US +1208198560,1208198575,IN +1208198576,1208198743,US +1208198744,1208198751,GB +1208198752,1208198791,US +1208198792,1208198799,CN +1208198800,1208199055,US +1208199056,1208199063,AU +1208199064,1208199087,US +1208199088,1208199103,MY +1208199104,1208199215,US +1208199216,1208199223,AU +1208199224,1208199343,US +1208199344,1208199351,CR +1208199352,1208199359,MY +1208199360,1208199767,US +1208199768,1208199775,MX +1208199776,1208199783,MY +1208199784,1208199823,US +1208199824,1208199847,CA +1208199848,1208199935,US +1208199936,1208199943,AU +1208199944,1208200167,US +1208200168,1208200175,CA +1208200176,1208200247,US +1208200248,1208200255,MC +1208200256,1208200271,US +1208200272,1208200287,BD +1208200288,1208200303,US +1208200304,1208200319,AU +1208200320,1208200639,US +1208200640,1208200647,FR +1208200648,1208200655,US +1208200656,1208200663,BS +1208200664,1208200815,US +1208200816,1208200887,BS +1208200888,1208200959,US +1208200960,1208200963,ID +1208200964,1208201063,US +1208201064,1208201071,IN +1208201072,1208201255,US +1208201256,1208201263,ES +1208201264,1208201535,US +1208201536,1208201543,GB +1208201544,1208201631,US +1208201632,1208201639,CA +1208201640,1208201727,US +1208201728,1208201743,MY +1208201744,1208201951,US +1208201952,1208201959,MY +1208201960,1208202007,US +1208202008,1208202015,CA +1208202016,1208202031,US +1208202032,1208202039,GB +1208202040,1208202135,US +1208202136,1208202143,MY +1208202144,1208202239,US +1208202240,1208202247,TW +1208202248,1208202255,US +1208202256,1208202287,MY +1208202288,1208202367,US +1208202368,1208202375,TW +1208202376,1208202495,US +1208202496,1208202511,GB +1208202512,1208202519,AU +1208202520,1208202559,US +1208202560,1208202575,JP +1208202576,1208203023,US +1208203024,1208203071,MY +1208203072,1208203343,US +1208203344,1208203351,AU +1208203352,1208203647,US +1208203648,1208203655,PR +1208203656,1208204007,US +1208204008,1208204015,NL +1208204016,1208204031,US +1208204032,1208204039,GB +1208204040,1208204047,US +1208204048,1208204055,JP +1208204056,1208204767,US +1208204768,1208204775,MX +1208204776,1208204783,CA +1208204784,1208204927,US +1208204928,1208204935,AU +1208204936,1208204951,US +1208204952,1208204959,MY +1208204960,1208205063,US +1208205064,1208205079,MY +1208205080,1208205119,US +1208205120,1208205127,CA +1208205128,1208205167,US +1208205168,1208205231,MY +1208205232,1208205247,US +1208205248,1208205263,IN +1208205264,1208205303,US +1208205304,1208205311,CO +1208205312,1208205407,US +1208205408,1208205423,MY +1208205424,1208205455,US +1208205456,1208205463,CA +1208205464,1208205703,US +1208205704,1208205711,CA +1208205712,1208205959,US +1208205960,1208205967,SG +1208205968,1208205983,US +1208205984,1208205991,GB +1208205992,1208206439,US +1208206440,1208206463,CA +1208206464,1208207183,US +1208207184,1208207191,AU +1208207192,1208207303,US +1208207304,1208207311,ZA +1208207312,1208207359,US +1208207360,1208207399,CA +1208207400,1208207463,US +1208207464,1208207471,CA +1208207472,1208207583,US +1208207584,1208207591,AU +1208207592,1208207599,US +1208207600,1208207607,AU +1208207608,1208207623,US +1208207624,1208207631,GB +1208207632,1208207983,US +1208207984,1208207999,NL +1208208000,1208208215,US +1208208216,1208208223,CA +1208208224,1208208231,AU +1208208232,1208208239,US +1208208240,1208208255,GB +1208208256,1208208287,US +1208208288,1208208303,GB +1208208304,1208208311,KR +1208208312,1208208799,US +1208208800,1208208807,AU +1208208808,1208208815,US +1208208816,1208208831,CA +1208208832,1208208927,US +1208208928,1208208943,AU +1208208944,1208209023,US +1208209024,1208209031,CO +1208209032,1208209175,US +1208209176,1208209183,CA +1208209184,1208209215,US +1208209216,1208209247,MY +1208209248,1208209359,US +1208209360,1208209375,MY +1208209376,1208209391,US +1208209392,1208209407,MY +1208209408,1208209543,US +1208209544,1208209551,AU +1208209552,1208209719,US +1208209720,1208209727,TH +1208209728,1208209863,US +1208209864,1208209871,GT +1208209872,1208210055,US +1208210056,1208210063,IN +1208210064,1208210071,HK +1208210072,1208210079,US +1208210080,1208210095,GB +1208210096,1208210303,US +1208210304,1208210351,GB +1208210352,1208210431,US +1208210432,1208210447,JP +1208210448,1208210511,US +1208210512,1208210519,CA +1208210520,1208210751,US +1208210752,1208210759,TR +1208210760,1208211239,US +1208211240,1208211247,JM +1208211248,1208213087,US +1208213088,1208213103,NG +1208213104,1208213383,US +1208213384,1208213391,CA +1208213392,1208215935,US +1208215936,1208215951,GB +1208215952,1208216367,US +1208216368,1208216375,CA +1208216376,1208217447,US +1208217448,1208217455,AE +1208217456,1208218031,US +1208218032,1208218039,HK +1208218040,1208218415,US +1208218416,1208218423,IN +1208218424,1208219159,US +1208219160,1208219167,AU +1208219168,1208219311,US +1208219312,1208219319,JP +1208219320,1208220655,US +1208220656,1208220663,AU +1208220664,1208220671,NZ +1208220672,1208220743,US +1208220744,1208220751,GB +1208220752,1208250367,US +1208250368,1208250375,CA +1208250376,1208250623,US +1208250624,1208250631,NL +1208250632,1208250711,US +1208250712,1208250719,GB +1208250720,1208250735,US +1208250736,1208250743,IN +1208250744,1208251199,US +1208251200,1208251207,CA +1208251208,1208251215,US +1208251216,1208251223,AU +1208251224,1208251415,US +1208251416,1208251423,GB +1208251424,1208251431,IL +1208251432,1208251447,ES +1208251448,1208251479,US +1208251480,1208251487,GB +1208251488,1208251495,BB +1208251496,1208251631,US +1208251632,1208251647,GB +1208251648,1208251679,US +1208251680,1208251695,GB +1208251696,1208251807,US +1208251808,1208251823,CA +1208251824,1208251839,GR +1208251840,1208251871,US +1208251872,1208251887,GB +1208251888,1208251903,IL +1208251904,1208252423,US +1208252424,1208252431,CA +1208252432,1208252703,US +1208252704,1208252735,AU +1208252736,1208252927,US +1208252928,1208253183,MX +1208253184,1208253599,US +1208253600,1208253615,IN +1208253616,1208301455,US +1208301456,1208301471,CA +1208301472,1208333567,US +1208333568,1208333823,GB +1208333824,1208337919,US +1208337920,1208338175,A2 +1208338176,1208518143,US +1208518144,1208518207,MY +1208518208,1208519551,US +1208519552,1208519679,TR +1208519680,1208519935,CA +1208519936,1208521983,US +1208521984,1208522239,CA +1208522240,1208523775,US +1208523776,1208523903,GB +1208523904,1208523991,US +1208523992,1208523995,TR +1208523996,1208524159,US +1208524160,1208524287,TR +1208524288,1208524563,US +1208524564,1208524567,IT +1208524568,1208525823,US +1208525824,1208526079,CA +1208526080,1208527615,US +1208527616,1208527871,CA +1208527872,1208528127,VN +1208528128,1208528895,US +1208528896,1208529151,CA +1208529152,1208531967,US +1208531968,1208532223,CA +1208532224,1208586364,US +1208586365,1208586372,MA +1208586373,1208586419,US +1208586420,1208586427,AE +1208586428,1208586447,US +1208586448,1208586455,TR +1208586456,1208586526,US +1208586527,1208586536,TR +1208586537,1208586589,US +1208586590,1208586597,NZ +1208586598,1208586662,US +1208586663,1208586670,GB +1208586671,1208586675,US +1208586676,1208586683,CA +1208586684,1208586761,US +1208586762,1208586774,GB +1208586775,1208586871,US +1208586872,1208586879,BS +1208586880,1208586919,US +1208586920,1208586927,AF +1208586928,1208586928,US +1208586929,1208586956,CA +1208586957,1208586957,US +1208586958,1208586973,GB +1208586974,1208586976,US +1208586977,1208586992,GB +1208586993,1208587025,US +1208587026,1208587033,NZ +1208587034,1208587045,US +1208587046,1208587053,IN +1208587054,1208587075,US +1208587076,1208587083,EG +1208587084,1208587169,US +1208587170,1208587177,MX +1208587178,1208587187,US +1208587188,1208587195,EG +1208587196,1208587242,US +1208587243,1208587258,CN +1208587259,1208587321,US +1208587322,1208587329,GB +1208587330,1208587333,US +1208587334,1208587341,CA +1208587342,1208587345,US +1208587346,1208587353,GB +1208587354,1208587359,US +1208587360,1208587377,GB +1208587378,1208587378,US +1208587379,1208587386,GE +1208587387,1208587394,US +1208587395,1208587402,EG +1208587403,1208587418,US +1208587419,1208587426,TR +1208587427,1208587427,US +1208587428,1208587443,GB +1208587444,1208587457,TW +1208587458,1208587479,US +1208587480,1208587487,LK +1208587488,1208587488,US +1208587489,1208587504,GB +1208587505,1208587507,US +1208587508,1208587515,CN +1208587516,1208587629,US +1208587630,1208587637,MA +1208587638,1208587663,US +1208587664,1208587671,CN +1208587672,1208587679,EG +1208587680,1208587705,US +1208587706,1208587713,CA +1208587714,1208587728,US +1208587729,1208587736,CA +1208587737,1208587737,US +1208587738,1208587759,CN +1208587760,1208587873,US +1208587874,1208587881,PK +1208587882,1208587909,US +1208587910,1208587943,UY +1208587944,1208587944,US +1208587945,1208587976,GB +1208587977,1208588071,US +1208588072,1208588079,RU +1208588080,1208588091,US +1208588092,1208588099,CA +1208588100,1208588103,US +1208588104,1208588111,MA +1208588112,1208588211,US +1208588212,1208588219,CA +1208588220,1208588427,US +1208588428,1208588435,MO +1208588436,1208588437,US +1208588438,1208588445,PK +1208588446,1208588451,US +1208588452,1208588455,EG +1208588456,1208588463,US +1208588464,1208588476,AU +1208588477,1208588591,US +1208588592,1208588599,IN +1208588600,1208588728,US +1208588729,1208588760,GB +1208588761,1208588771,US +1208588772,1208588779,GB +1208588780,1208588819,US +1208588820,1208588839,PK +1208588840,1208588941,US +1208588942,1208588949,MO +1208588950,1208588953,US +1208588954,1208588961,TR +1208588962,1208588972,US +1208588973,1208588985,GB +1208588986,1208588989,US +1208588990,1208589000,GB +1208589001,1208589011,US +1208589012,1208589021,MO +1208589022,1208589065,US +1208589066,1208589073,CA +1208589074,1208589082,GB +1208589083,1208589156,US +1208589157,1208589165,GB +1208589166,1208589174,US +1208589175,1208589186,CA +1208589187,1208589321,US +1208589322,1208589329,CA +1208589330,1208589379,US +1208589380,1208589387,EG +1208589388,1208589577,US +1208589578,1208589585,GB +1208589586,1208589639,US +1208589640,1208589651,TR +1208589652,1208589857,US +1208589858,1208589865,MA +1208589866,1208589894,US +1208589895,1208589904,GB +1208589905,1208589970,US +1208589971,1208590002,GB +1208590003,1208590004,US +1208590005,1208590014,GB +1208590015,1208590045,US +1208590046,1208590053,SA +1208590054,1208590061,US +1208590062,1208590071,CN +1208590072,1208590091,US +1208590092,1208590108,GB +1208590109,1208590115,US +1208590116,1208590119,EG +1208590120,1208590120,US +1208590121,1208590123,EG +1208590124,1208590140,US +1208590141,1208590154,CA +1208590155,1208590157,US +1208590158,1208590165,EG +1208590166,1208590170,US +1208590171,1208590178,GB +1208590179,1208590208,US +1208590209,1208590239,GB +1208590240,1208590257,US +1208590258,1208590265,PH +1208590266,1208590335,US 1208590336,1208598527,CA 1208598528,1208647679,US -1208647680,1208659967,CA -1208659968,1208721407,US +1208647680,1208656159,CA +1208656160,1208656191,US +1208656192,1208656223,CA +1208656224,1208656255,US +1208656256,1208656319,CA +1208656320,1208656351,US +1208656352,1208656383,CA +1208656384,1208656511,ID +1208656512,1208656543,US +1208656544,1208656575,CA +1208656576,1208656583,DO +1208656584,1208656591,PA +1208656592,1208656599,RS +1208656600,1208656607,UA +1208656608,1208656639,US +1208656640,1208656703,MY +1208656704,1208656711,UA +1208656712,1208656735,CA +1208656736,1208656767,US +1208656768,1208656895,MY +1208656896,1208656903,CA +1208656904,1208656911,LB +1208656912,1208657087,CA +1208657088,1208657103,MA +1208657104,1208657111,CA +1208657112,1208657119,MA +1208657120,1208657139,CA +1208657140,1208657143,SE +1208657144,1208657415,CA +1208657416,1208657423,CH +1208657424,1208657519,CA +1208657520,1208657527,MA +1208657528,1208657531,PA +1208657532,1208657535,CA +1208657536,1208657543,SE +1208657544,1208657551,CA +1208657552,1208657559,PH +1208657560,1208657719,CA +1208657720,1208657727,CH +1208657728,1208657775,CA +1208657776,1208657783,PA +1208657784,1208657823,CA +1208657824,1208657831,DO +1208657832,1208657855,CA +1208657856,1208657871,PA +1208657872,1208657919,CA +1208657920,1208657975,MA +1208657976,1208657983,CA +1208657984,1208657991,CN +1208657992,1208658015,MA +1208658016,1208658023,CA +1208658024,1208658031,DO +1208658032,1208658039,MA +1208658040,1208658047,CA +1208658048,1208658079,US +1208658080,1208658103,CA +1208658104,1208658111,FR +1208658112,1208658119,DO +1208658120,1208658127,CA +1208658128,1208658143,MA +1208658144,1208658159,CA +1208658160,1208658167,MA +1208658168,1208658175,CA +1208658176,1208658199,MA +1208658200,1208658223,CA +1208658224,1208658239,MA +1208658240,1208658247,CY +1208658248,1208658263,CA +1208658264,1208658271,KE +1208658272,1208658279,IL +1208658280,1208658303,CA +1208658304,1208658335,US +1208658336,1208658343,KE +1208658344,1208658351,CA +1208658352,1208658367,US +1208658368,1208658431,CA +1208658432,1208658767,US +1208658768,1208658775,MA +1208658776,1208658783,UA +1208658784,1208658799,CA +1208658800,1208658807,KE +1208658808,1208658815,RS +1208658816,1208658847,CA +1208658848,1208658855,MA +1208658856,1208658879,CA +1208658880,1208658887,DO +1208658888,1208658895,GB +1208658896,1208659103,CA +1208659104,1208659135,US +1208659136,1208659151,CN +1208659152,1208659167,CA +1208659168,1208659199,AE +1208659200,1208659327,CA +1208659328,1208659359,US +1208659360,1208659391,CA +1208659392,1208659399,CN +1208659400,1208659423,CA +1208659424,1208659455,US +1208659456,1208659519,PK +1208659520,1208659551,US +1208659552,1208659583,CA +1208659584,1208659647,AE +1208659648,1208659711,ID +1208659712,1208659743,CA +1208659744,1208659775,ID +1208659776,1208659791,CA +1208659792,1208659799,US +1208659800,1208659815,CA +1208659816,1208659823,UA +1208659824,1208659831,CA +1208659832,1208659839,ID +1208659840,1208659903,PK +1208659904,1208721407,US 1208721408,1208729599,CA 1208729600,1208770559,US 1208770560,1208774655,CA 1208774656,1208778751,US 1208778752,1208795135,CA -1208795136,1208832607,US +1208795136,1208812895,US +1208812896,1208812927,CA +1208812928,1208814687,US +1208814688,1208814719,CA +1208814720,1208814855,US +1208814856,1208814863,CA +1208814864,1208832455,US +1208832456,1208832463,CA +1208832464,1208832567,US +1208832568,1208832575,CN +1208832576,1208832607,US 1208832608,1208832623,IT -1208832624,1208852479,US +1208832624,1208832631,NZ +1208832632,1208832639,US +1208832640,1208832703,IN +1208832704,1208832775,US +1208832776,1208832783,CA +1208832784,1208833023,US +1208833024,1208833031,PR +1208833032,1208852479,US 1208852480,1208860671,CA 1208860672,1208918015,US -1208918016,1208922111,CA +1208918016,1208920007,CA +1208920008,1208920015,US +1208920016,1208922111,CA 1208922112,1208954879,US -1208954880,1208958975,CA -1208958976,1208975359,US -1208975360,1208983551,CA -1208983552,1209347839,US +1208954880,1208958463,CA +1208958464,1208975359,US +1208975360,1208980191,CA +1208980192,1208980223,US +1208980224,1208980503,CA +1208980504,1208980511,US +1208980512,1208983551,CA +1208983552,1208991775,US +1208991776,1208991791,GB +1208991792,1208995455,US +1208995456,1208995471,CA +1208995472,1209004863,US +1209004864,1209004927,GB +1209004928,1209189308,US +1209189309,1209189310,ES +1209189311,1209189342,US +1209189343,1209189374,ES +1209189375,1209189379,US +1209189380,1209189395,MX +1209189396,1209189631,US +1209189632,1209189887,MX +1209189888,1209190147,US +1209190148,1209190163,MX +1209190164,1209190167,US +1209190168,1209190195,GR +1209190196,1209190851,US +1209190852,1209190883,CA +1209190884,1209190911,US +1209190912,1209191167,MX +1209191168,1209270759,US +1209270760,1209270767,CA +1209270768,1209270859,US +1209270860,1209270863,CA +1209270864,1209270919,US +1209270920,1209270923,CA +1209270924,1209271067,US +1209271068,1209271071,VN +1209271072,1209271095,US +1209271096,1209271099,CA +1209271100,1209271111,US +1209271112,1209271115,CA +1209271116,1209271463,US +1209271464,1209271467,IN +1209271468,1209271495,US +1209271496,1209271499,CA +1209271500,1209271503,US +1209271504,1209271507,TR +1209271508,1209271527,US +1209271528,1209271531,CA +1209271532,1209271691,US +1209271692,1209271695,CA +1209271696,1209271827,US +1209271828,1209271831,CA +1209271832,1209271871,US +1209271872,1209271875,TR +1209271876,1209271967,US +1209271968,1209271971,VN +1209271972,1209272003,US +1209272004,1209272007,GB +1209272008,1209272035,US +1209272036,1209272039,IT +1209272040,1209274623,US +1209274624,1209274751,CA +1209274752,1209274815,US +1209274816,1209274879,CA +1209274880,1209275910,US +1209275911,1209275911,MY +1209275912,1209276511,US +1209276512,1209276543,VN +1209276544,1209276799,US +1209276800,1209276807,BD +1209276808,1209277183,US +1209277184,1209277215,BD +1209277216,1209277575,US +1209277576,1209277583,BD +1209277584,1209279167,US +1209279168,1209279231,VN +1209279232,1209280191,US +1209280192,1209280255,VN +1209280256,1209280975,US +1209280976,1209280983,IT +1209280984,1209281247,US +1209281248,1209281279,CA +1209281280,1209283967,US +1209283968,1209284095,GB +1209284096,1209347839,US 1209347840,1209348095,GB -1209348096,1209368575,US -1209376768,1209434111,US +1209348096,1209357215,US +1209357216,1209357231,SI +1209357232,1209358751,US +1209358752,1209358767,SI +1209358768,1209358823,US +1209358824,1209358831,CN +1209358832,1209434111,US 1209434112,1209436671,BB 1209436672,1209437183,VC 1209437184,1209440767,BB @@ -10399,47 +22008,813 @@ 1209441280,1209442303,BB 1209442304,1209647103,US 1209647104,1209663487,CA -1209663488,1209712639,US -1209720832,1209729023,US +1209663488,1209729023,US 1209729024,1209786367,JM 1209786368,1209810943,US 1209810944,1209819135,CA -1209819136,1209885127,US +1209819136,1209860095,US +1209860096,1209860127,IN +1209860128,1209860159,BE +1209860160,1209860447,US +1209860448,1209860479,BE +1209860480,1209860575,US +1209860576,1209860607,IN +1209860608,1209860863,US +1209860864,1209860895,CY +1209860896,1209861119,US +1209861120,1209861375,CA +1209861376,1209861759,US +1209861760,1209861887,FR +1209861888,1209862143,US +1209862144,1209862399,CA +1209862400,1209863167,US +1209863168,1209863423,CA +1209863424,1209863679,IN +1209863680,1209863935,US +1209863936,1209864447,CA +1209864448,1209864543,US +1209864544,1209864575,BE +1209864576,1209864607,US +1209864608,1209864639,BE +1209864640,1209864671,IN +1209864672,1209865599,US +1209865600,1209865727,IN +1209865728,1209866111,US +1209866112,1209866143,IN +1209866144,1209866175,US +1209866176,1209866207,BE +1209866208,1209866239,IN +1209866240,1209866751,US +1209866752,1209867007,IN +1209867008,1209867039,NZ +1209867040,1209867071,BE +1209867072,1209867135,US +1209867136,1209867167,BE +1209867168,1209867199,US +1209867200,1209867231,IN +1209867232,1209867263,US +1209867264,1209867519,CA +1209867520,1209884671,US +1209884672,1209884679,IT +1209884680,1209884687,ES +1209884688,1209884823,US +1209884824,1209884831,IT +1209884832,1209885119,US +1209885120,1209885127,AU 1209885128,1209885143,IT 1209885144,1209885167,US 1209885168,1209885175,IT -1209885176,1209917439,US +1209885176,1209886175,US +1209886176,1209886207,GB +1209886208,1209890495,US +1209890496,1209890559,AU +1209890560,1209893503,US +1209893504,1209893519,MX +1209893520,1209917439,US 1209917440,1209925631,CA -1209925632,1210253311,US +1209925632,1210057039,US +1210057040,1210057047,JM +1210057048,1210057055,US +1210057056,1210057071,DE +1210057072,1210057519,US +1210057520,1210057535,IN +1210057536,1210057567,US +1210057568,1210057583,NG +1210057584,1210057615,US +1210057616,1210057623,CA +1210057624,1210057879,US +1210057880,1210057887,IL +1210057888,1210057895,US +1210057896,1210057903,MX +1210057904,1210057911,GB +1210057912,1210058047,US +1210058048,1210058055,CA +1210058056,1210058159,US +1210058160,1210058167,CA +1210058168,1210058191,US +1210058192,1210058199,CA +1210058200,1210058615,US +1210058616,1210058623,AU +1210058624,1210059271,US +1210059272,1210059279,ES +1210059280,1210059775,US +1210059776,1210059791,GB +1210059792,1210060031,US +1210060032,1210060047,AE +1210060048,1210060351,US +1210060352,1210060359,IN +1210060360,1210060383,US +1210060384,1210060407,IL +1210060408,1210060623,US +1210060624,1210060639,CA +1210060640,1210060799,US +1210060800,1210060815,BR +1210060816,1210060839,US +1210060840,1210060847,AU +1210060848,1210061327,US +1210061328,1210061335,CA +1210061336,1210061367,US +1210061368,1210061375,IN +1210061376,1210061407,US +1210061408,1210061415,AU +1210061416,1210061463,US +1210061464,1210061471,HK +1210061472,1210061599,US +1210061600,1210061631,IL +1210061632,1210061647,US +1210061648,1210061655,IN +1210061656,1210061663,GB +1210061664,1210061727,US +1210061728,1210061735,GB +1210061736,1210061991,US +1210061992,1210061999,AU +1210062000,1210062007,US +1210062008,1210062015,CA +1210062016,1210062079,US +1210062080,1210062087,IN +1210062088,1210062095,US +1210062096,1210062103,NZ +1210062104,1210062463,US +1210062464,1210062479,IN +1210062480,1210062487,US +1210062488,1210062495,MX +1210062496,1210062815,US +1210062816,1210062831,ZA +1210062832,1210062847,IL +1210062848,1210062927,US +1210062928,1210062935,AU +1210062936,1210062975,US +1210062976,1210062983,CR +1210062984,1210064311,US +1210064312,1210064319,IE +1210064320,1210064527,US +1210064528,1210064535,AU +1210064536,1210064663,US +1210064664,1210064671,AU +1210064672,1210064951,US +1210064952,1210064959,KW +1210064960,1210064999,US +1210065000,1210065007,BR +1210065008,1210065023,US +1210065024,1210065031,CA +1210065032,1210065319,US +1210065320,1210065327,AU +1210065328,1210065535,US +1210065536,1210065543,IN +1210065544,1210065551,US +1210065552,1210065559,GB +1210065560,1210065567,US +1210065568,1210065575,GB +1210065576,1210065615,US +1210065616,1210065623,CA +1210065624,1210065663,US +1210065664,1210065679,IN +1210065680,1210065695,AU +1210065696,1210065703,IN +1210065704,1210065735,US +1210065736,1210065743,DO +1210065744,1210065751,US +1210065752,1210065759,GB +1210065760,1210065783,US +1210065784,1210065791,PA +1210065792,1210065823,US +1210065824,1210065855,AU +1210065856,1210066255,US +1210066256,1210066263,CA +1210066264,1210066287,US +1210066288,1210066295,IN +1210066296,1210066519,US +1210066520,1210066527,BM +1210066528,1210066807,US +1210066808,1210066831,CA +1210066832,1210067263,US +1210067264,1210067287,GB +1210067288,1210067535,US +1210067536,1210067543,AU +1210067544,1210067632,US +1210067633,1210067640,AU +1210067641,1210067967,US +1210067968,1210067983,IL +1210067984,1210068039,US +1210068040,1210068047,GB +1210068048,1210068151,US +1210068152,1210068159,CA +1210068160,1210068319,US +1210068320,1210068327,CA +1210068328,1210068343,US +1210068344,1210068351,MX +1210068352,1210068447,US +1210068448,1210068471,NO +1210068472,1210068543,US +1210068544,1210068559,CA +1210068560,1210068607,US +1210068608,1210068735,IL +1210068736,1210068759,US +1210068760,1210068767,IL +1210068768,1210068775,CA +1210068776,1210068903,US +1210068904,1210068927,AU +1210068928,1210069007,US +1210069008,1210069023,CA +1210069024,1210069159,US +1210069160,1210069167,AU +1210069168,1210070071,US +1210070072,1210070079,GB +1210070080,1210070175,US +1210070176,1210070183,IL +1210070184,1210070431,US +1210070432,1210070439,IL +1210070440,1210070503,US +1210070504,1210070511,CA +1210070512,1210070631,US +1210070632,1210070639,MX +1210070640,1210070703,US +1210070704,1210070711,GB +1210070712,1210070799,US +1210070800,1210070807,AU +1210070808,1210070863,US +1210070864,1210070871,BH +1210070872,1210070943,US +1210070944,1210070951,IN +1210070952,1210070959,US +1210070960,1210070967,JP +1210070968,1210071007,US +1210071008,1210071015,GB +1210071016,1210071039,US +1210071040,1210071167,GB +1210071168,1210072255,US +1210072256,1210072319,CA +1210072320,1210072519,US +1210072520,1210072527,NZ +1210072528,1210072559,US +1210072560,1210072567,GB +1210072568,1210072783,US +1210072784,1210072791,KW +1210072792,1210073199,US +1210073200,1210073207,DE +1210073208,1210075663,US +1210075664,1210075671,IN +1210075672,1210076039,US +1210076040,1210076047,CA +1210076048,1210079903,US +1210079904,1210079911,IT +1210079912,1210079919,BM +1210079920,1210079999,US +1210080000,1210080015,IN +1210080016,1210080079,US +1210080080,1210080111,GB +1210080112,1210080407,US +1210080408,1210080455,NL +1210080456,1210080615,US +1210080616,1210080623,CA +1210080624,1210080847,US +1210080848,1210080855,SV +1210080856,1210081087,US +1210081088,1210081103,CA +1210081104,1210081335,US +1210081336,1210081343,CR +1210081344,1210081559,US +1210081560,1210081567,PK +1210081568,1210081823,US +1210081824,1210081831,MX +1210081832,1210081839,US +1210081840,1210081847,MX +1210081848,1210081879,US +1210081880,1210081887,MX +1210081888,1210081911,US +1210081912,1210081919,AU +1210081920,1210081943,US +1210081944,1210081951,CA +1210081952,1210082047,US +1210082048,1210082055,IN +1210082056,1210082199,US +1210082200,1210082207,CA +1210082208,1210082447,US +1210082448,1210082463,AU +1210082464,1210082655,US +1210082656,1210082663,CA +1210082664,1210082831,US +1210082832,1210082839,AU +1210082840,1210082847,IN +1210082848,1210082975,US +1210082976,1210082991,GB +1210082992,1210083071,US +1210083072,1210083079,JP +1210083080,1210083719,US +1210083720,1210083735,IN +1210083736,1210083871,US +1210083872,1210083879,CA +1210083880,1210083983,US +1210083984,1210083991,IN +1210083992,1210084215,US +1210084216,1210084223,VE +1210084224,1210084263,US +1210084264,1210084271,NZ +1210084272,1210084359,US +1210084360,1210084367,BG +1210084368,1210084415,US +1210084416,1210084479,CA +1210084480,1210084711,US +1210084712,1210084719,AU +1210084720,1210084783,US +1210084784,1210084799,BD +1210084800,1210086503,US +1210086504,1210086511,GB +1210086512,1210086551,US +1210086552,1210086559,SE +1210086560,1210086583,US +1210086584,1210086591,SE +1210086592,1210086599,US +1210086600,1210086607,NZ +1210086608,1210086623,US +1210086624,1210086631,SE +1210086632,1210087295,US +1210087296,1210087303,GB +1210087304,1210087423,US +1210087424,1210087431,MX +1210087432,1210088959,US +1210088960,1210088967,GB +1210088968,1210089047,US +1210089048,1210089055,MX +1210089056,1210089823,US +1210089824,1210089855,CA +1210089856,1210090071,US +1210090072,1210090079,MX +1210090080,1210090287,US +1210090288,1210090295,AU +1210090296,1210090367,US +1210090368,1210090375,JM +1210090376,1210090383,US +1210090384,1210090399,CA +1210090400,1210090623,US +1210090624,1210090639,BD +1210090640,1210090767,US +1210090768,1210090783,BD +1210090784,1210090815,US +1210090816,1210090823,CA +1210090824,1210090895,US +1210090896,1210090903,AU +1210090904,1210091079,US +1210091080,1210091087,SG +1210091088,1210091135,US +1210091136,1210091151,CA +1210091152,1210091175,US +1210091176,1210091183,SR +1210091184,1210091351,US +1210091352,1210091359,AU +1210091360,1210091535,US +1210091536,1210091543,CA +1210091544,1210091679,US +1210091680,1210091687,AU +1210091688,1210091791,US +1210091792,1210091807,CA +1210091808,1210091839,US +1210091840,1210091847,CA +1210091848,1210091987,US +1210091988,1210091991,GB +1210091992,1210092287,US +1210092288,1210092543,ES +1210092544,1210092567,US +1210092568,1210092575,AU +1210092576,1210092583,CA +1210092584,1210092591,MX +1210092592,1210092607,US +1210092608,1210092639,GB +1210092640,1210092799,US +1210092800,1210092815,CA +1210092816,1210093143,US +1210093144,1210093151,ID +1210093152,1210093191,US +1210093192,1210093199,BR +1210093200,1210093407,US +1210093408,1210093423,MX +1210093424,1210093575,US +1210093576,1210093583,MY +1210093584,1210093639,US +1210093640,1210093647,CA +1210093648,1210093663,US +1210093664,1210093671,CA +1210093672,1210093679,AU +1210093680,1210093751,US +1210093752,1210093759,AU +1210093760,1210093847,US +1210093848,1210093855,AU +1210093856,1210094175,US +1210094176,1210094183,TT +1210094184,1210094407,US +1210094408,1210094415,GB +1210094416,1210094831,US +1210094832,1210094847,SG +1210094848,1210094943,US +1210094944,1210094951,GB +1210094952,1210094959,US +1210094960,1210094967,GB +1210094968,1210095263,US +1210095264,1210095271,GB +1210095272,1210095503,US +1210095504,1210095519,IN +1210095520,1210095527,NZ +1210095528,1210095711,US +1210095712,1210095727,GB +1210095728,1210095935,US +1210095936,1210095951,IN +1210095952,1210095959,US +1210095960,1210095967,GB +1210095968,1210096295,US +1210096296,1210096303,GB +1210096304,1210096543,US +1210096544,1210096551,MX +1210096552,1210096559,US +1210096560,1210096575,DE +1210096576,1210096871,US +1210096872,1210096879,CA +1210096880,1210097151,US +1210097152,1210097159,GB +1210097160,1210097303,US +1210097304,1210097311,MX +1210097312,1210097335,US +1210097336,1210097343,IE +1210097344,1210097415,US +1210097416,1210097423,ZA +1210097424,1210097567,US +1210097568,1210097575,GB +1210097576,1210097655,US +1210097656,1210097663,GB +1210097664,1210097783,US +1210097784,1210097791,GB +1210097792,1210097999,US +1210098000,1210098007,CA +1210098008,1210098111,US +1210098112,1210098119,IL +1210098120,1210098127,US +1210098128,1210098143,CA +1210098144,1210098215,US +1210098216,1210098223,IN +1210098224,1210098319,US +1210098320,1210098327,CA +1210098328,1210098527,US +1210098528,1210098535,SG +1210098536,1210098615,US +1210098616,1210098623,NZ +1210098624,1210098743,US +1210098744,1210098751,BO +1210098752,1210098775,US +1210098776,1210098783,CN +1210098784,1210098959,US +1210098960,1210098975,CA +1210098976,1210099383,US +1210099384,1210099399,AE +1210099400,1210099495,US +1210099496,1210099503,BG +1210099504,1210099511,US +1210099512,1210099519,MX +1210099520,1210099583,US +1210099584,1210099591,CA +1210099592,1210099695,US +1210099696,1210099711,AU +1210099712,1210099783,US +1210099784,1210099791,NZ +1210099792,1210099879,US +1210099880,1210099895,GB +1210099896,1210099967,US +1210099968,1210099975,MT +1210099976,1210100103,US +1210100104,1210100111,MT +1210100112,1210100231,US +1210100232,1210100239,CA +1210100240,1210100255,PK +1210100256,1210100287,CA +1210100288,1210100359,US +1210100360,1210100367,AU +1210100368,1210100463,US +1210100464,1210100479,CA +1210100480,1210100631,US +1210100632,1210100639,NZ +1210100640,1210101023,US +1210101024,1210101039,GB +1210101040,1210101263,US +1210101264,1210101279,MY +1210101280,1210101311,US +1210101312,1210101319,IE +1210101320,1210101327,IL +1210101328,1210101559,US +1210101560,1210101567,AU +1210101568,1210101727,US +1210101728,1210101743,GB +1210101744,1210101879,US +1210101880,1210101887,CA +1210101888,1210102399,US +1210102400,1210102407,AU +1210102408,1210102815,US +1210102816,1210102823,CA +1210102824,1210105063,US +1210105064,1210105071,SE +1210105072,1210107967,US +1210107968,1210107975,MO +1210107976,1210108295,US +1210108296,1210108303,IN +1210108304,1210108335,US +1210108336,1210108343,CA +1210108344,1210108351,IL +1210108352,1210108359,US +1210108360,1210108367,CA +1210108368,1210108423,US +1210108424,1210108431,PR +1210108432,1210108631,US +1210108632,1210108639,GB +1210108640,1210108903,US +1210108904,1210108911,AU +1210108912,1210108919,GB +1210108920,1210109247,US +1210109248,1210109255,DK +1210109256,1210109263,IL +1210109264,1210109271,CA +1210109272,1210109343,US +1210109344,1210109351,FI +1210109352,1210109751,US +1210109752,1210109759,IL +1210109760,1210109767,GB +1210109768,1210109775,IN +1210109776,1210109935,US +1210109936,1210109943,BB +1210109944,1210111007,US +1210111008,1210111015,GB +1210111016,1210111095,US +1210111096,1210111103,CA +1210111104,1210111279,US +1210111280,1210111287,VG +1210111288,1210111295,US +1210111296,1210111303,AU +1210111304,1210111999,US +1210112000,1210112007,CA +1210112008,1210112039,US +1210112040,1210112047,IL +1210112048,1210112455,US +1210112456,1210112463,ZA +1210112464,1210112679,US +1210112680,1210112687,CA +1210112688,1210112727,US +1210112728,1210112735,PY +1210112736,1210112815,US +1210112816,1210112823,MX +1210112824,1210112839,US +1210112840,1210112847,LT +1210112848,1210112855,IN +1210112856,1210113055,US +1210113056,1210113063,CA +1210113064,1210113095,US +1210113096,1210113103,BR +1210113104,1210113135,US +1210113136,1210113143,CA +1210113144,1210113535,US +1210113536,1210113551,CA +1210113552,1210113615,US +1210113616,1210113631,GB +1210113632,1210113991,US +1210113992,1210113999,IE +1210114000,1210114095,US +1210114096,1210114103,CR +1210114104,1210114151,US +1210114152,1210114159,MY +1210114160,1210114167,US +1210114168,1210114175,HN +1210114176,1210114279,US +1210114280,1210114287,AU +1210114288,1210114351,US +1210114352,1210114367,AU +1210114368,1210114439,US +1210114440,1210114447,GB +1210114448,1210114471,US +1210114472,1210114479,AU +1210114480,1210114487,CL +1210114488,1210114495,AU +1210114496,1210114503,US +1210114504,1210114511,BB +1210114512,1210114551,US +1210114552,1210114559,AU +1210114560,1210114623,US +1210114624,1210114631,CA +1210114632,1210114711,US +1210114712,1210114719,ZA +1210114720,1210114759,US +1210114760,1210114775,MT +1210114776,1210114831,US +1210114832,1210114839,AU +1210114840,1210114991,US +1210114992,1210114999,AU +1210115000,1210115079,US +1210115080,1210115087,AU +1210115088,1210115135,US +1210115136,1210115143,AU +1210115144,1210115199,US +1210115200,1210115207,GB +1210115208,1210115231,US +1210115232,1210115239,AU +1210115240,1210115335,US +1210115336,1210115343,GB +1210115344,1210115471,US +1210115472,1210115479,IN +1210115480,1210115495,US +1210115496,1210115503,AU +1210115504,1210115543,US +1210115544,1210115575,BB +1210115576,1210115591,US +1210115592,1210115599,CA +1210115600,1210115719,US +1210115720,1210115727,AU +1210115728,1210115791,US +1210115792,1210115799,GB +1210115800,1210115911,US +1210115912,1210115919,GB +1210115920,1210116255,US +1210116256,1210116263,IN +1210116264,1210116375,US +1210116376,1210116383,CA +1210116384,1210116423,US +1210116424,1210116431,GB +1210116432,1210116527,US +1210116528,1210116535,PR +1210116536,1210116671,US +1210116672,1210116679,AU +1210116680,1210116687,GB +1210116688,1210116695,NG +1210116696,1210116863,US +1210116864,1210116871,GB +1210116872,1210117191,US +1210117192,1210117199,CA +1210117200,1210117567,US +1210117568,1210117599,CA +1210117600,1210117631,US +1210117632,1210117639,IN +1210117640,1210117647,GB +1210117648,1210117655,AE +1210117656,1210117871,US +1210117872,1210117879,CA +1210117880,1210117887,US +1210117888,1210117895,TH +1210117896,1210118023,US +1210118024,1210118031,GB +1210118032,1210118191,US +1210118192,1210118199,NZ +1210118200,1210118239,US +1210118240,1210118255,TH +1210118256,1210118431,US +1210118432,1210118439,AU +1210118440,1210118655,US +1210118656,1210118663,IN +1210118664,1210118687,US +1210118688,1210118703,IN +1210118704,1210118887,US +1210118888,1210118895,BR +1210118896,1210119119,US +1210119120,1210119135,GB +1210119136,1210119183,US +1210119184,1210119191,CA +1210119192,1210119255,US +1210119256,1210119263,MY +1210119264,1210119311,US +1210119312,1210119319,AN +1210119320,1210119327,MX +1210119328,1210119551,US +1210119552,1210119559,MX +1210119560,1210119823,US +1210119824,1210119831,CA +1210119832,1210120007,US +1210120008,1210120015,IN +1210120016,1210120847,US +1210120848,1210120855,MY +1210120856,1210120895,US +1210120896,1210120903,MX +1210120904,1210120991,US +1210120992,1210120999,IN +1210121000,1210121023,US +1210121024,1210121039,AU +1210121040,1210121079,US +1210121080,1210121087,BR +1210121088,1210121887,US +1210121888,1210121903,MO +1210121904,1210122031,US +1210122032,1210122039,CA +1210122040,1210122063,US +1210122064,1210122071,MX +1210122072,1210253311,US 1210253312,1210254703,CA 1210254704,1210254719,NZ 1210254720,1210261503,CA -1210261504,1210366655,US +1210261504,1210359039,US +1210359040,1210359295,ES +1210359296,1210366655,US 1210366656,1210366719,GB -1210366720,1210449919,US -1210449920,1210580991,CA -1210580992,1210740735,US -1210744832,1210769407,US -1210777600,1210862847,US -1210862848,1210863103,CA -1210863104,1210892287,US -1210908672,1210925055,US +1210366720,1210418175,US +1210418176,1210418207,SG +1210418208,1210427039,US +1210427040,1210427071,JP +1210427072,1210449919,US +1210449920,1210468743,CA +1210468744,1210468767,US +1210468768,1210580991,CA +1210580992,1210861207,US +1210861208,1210861215,GB +1210861216,1210862191,US +1210862192,1210862199,GB +1210862200,1210865262,US +1210865263,1210865270,MY +1210865271,1210866435,US +1210866436,1210866443,CL +1210866444,1210925055,US 1210925056,1210941439,CA -1210941440,1211019263,US -1211023360,1211236351,US +1210941440,1211031551,US +1211031552,1211031807,BB +1211031808,1211032223,US +1211032224,1211032255,VE +1211032256,1211032271,US +1211032272,1211032287,DO +1211032288,1211033087,US +1211033088,1211033599,CO +1211033600,1211035647,US +1211035648,1211035663,PR +1211035664,1211035711,US +1211035712,1211035775,CA +1211035776,1211035791,US +1211035792,1211035823,CR +1211035824,1211035839,CH +1211035840,1211036031,US +1211036032,1211036095,EC +1211036096,1211036703,US +1211036704,1211036719,BO +1211036720,1211036727,US +1211036728,1211036735,JM +1211036736,1211036751,GT +1211036752,1211036991,US +1211036992,1211037055,BR +1211037056,1211037455,US +1211037456,1211037471,CR +1211037472,1211037519,US +1211037520,1211037535,UY +1211037536,1211037679,US +1211037680,1211037695,AR +1211037696,1211037983,US +1211037984,1211037999,CR +1211038000,1211038007,BB +1211038008,1211038011,TT +1211038012,1211038063,US +1211038064,1211038079,TT +1211038080,1211038719,US +1211038720,1211038975,CY +1211038976,1211039087,US +1211039088,1211039103,RU +1211039104,1211039503,US +1211039504,1211039519,A2 +1211039520,1211039551,US +1211039552,1211039567,BM +1211039568,1211039679,US +1211039680,1211039695,BR +1211039696,1211236351,US 1211236352,1211269119,PR -1211269120,1211297791,US -1211301888,1211304447,US -1211304448,1211304703,CA -1211304704,1211308175,US +1211269120,1211303935,US +1211303936,1211304159,CA +1211304160,1211304191,US +1211304192,1211304319,CA +1211304320,1211304351,NL +1211304352,1211304703,CA +1211304704,1211304767,GB +1211304768,1211304799,US +1211304800,1211304959,CA +1211304960,1211305983,US +1211305984,1211306111,NL +1211306112,1211306751,US +1211306752,1211306879,CA +1211306880,1211308159,US +1211308160,1211308175,CA 1211308176,1211308191,BV -1211308192,1211308223,US -1211308224,1211308543,CA -1211308544,1211309055,US -1211309056,1211309311,GB -1211309312,1211309567,US -1211309568,1211310079,CA -1211310080,1211317503,US +1211308192,1211308543,CA +1211308544,1211308559,KN +1211308560,1211308607,CA +1211308608,1211308615,US +1211308616,1211308623,CA +1211308624,1211308639,US +1211308640,1211308655,MX +1211308656,1211308671,GB +1211308672,1211308703,CA +1211308704,1211308719,VG +1211308720,1211308735,CA +1211308736,1211308751,BV +1211308752,1211309055,CA +1211309056,1211309311,US +1211309312,1211310079,CA +1211310080,1211314383,US +1211314384,1211314399,CA +1211314400,1211314415,US +1211314416,1211314423,CA +1211314424,1211314639,US +1211314640,1211314671,CA +1211314672,1211314863,US +1211314864,1211314879,CA +1211314880,1211315711,US +1211315712,1211316223,CA +1211316224,1211316479,US +1211316480,1211316991,CA +1211316992,1211317503,US 1211317504,1211317759,CA 1211317760,1211318271,US 1211318272,1211321343,BB @@ -10451,59 +22826,148 @@ 1211333120,1211333631,VC 1211333632,1211333887,GD 1211333888,1211334655,VG -1211334656,1211432959,US +1211334656,1211367423,US +1211367424,1211367487,EE +1211367488,1211367495,GB +1211367496,1211367503,US +1211367504,1211367519,CH +1211367520,1211367615,US +1211367616,1211367679,GB +1211367680,1211367935,GI +1211367936,1211368191,CA +1211368192,1211368447,CY +1211368448,1211384279,US +1211384280,1211384287,GB +1211384288,1211387983,US +1211387984,1211387999,AE +1211388000,1211388671,US +1211388672,1211388687,IT +1211388688,1211391455,US +1211391456,1211391487,CN +1211391488,1211391743,US +1211391744,1211391999,IT +1211392000,1211392591,US +1211392592,1211392607,IT +1211392608,1211392639,GB +1211392640,1211392783,US +1211392784,1211392799,IT +1211392800,1211393279,US +1211393280,1211393311,AU +1211393312,1211393327,IT +1211393328,1211394063,US +1211394064,1211394079,ES +1211394080,1211394751,US +1211394752,1211395071,IT +1211395072,1211407293,US +1211407294,1211407333,MX +1211407334,1211413247,US +1211413248,1211413503,CA +1211413504,1211419489,US +1211419490,1211419497,CA +1211419498,1211432959,US 1211432960,1211473919,CA -1211473920,1211478015,US -1211482112,1211596799,US -1211596800,1211605247,CA -1211605248,1211605311,BS -1211605312,1211613183,CA +1211473920,1211596799,US +1211596800,1211613183,CA 1211613184,1216872447,US 1216872448,1217396735,CA -1217396736,1219256319,US +1217396736,1218731807,US +1218731808,1218731815,A2 +1218731816,1218778111,US +1218778112,1218778367,SG +1218778368,1218853247,US +1218853248,1218853279,PR +1218853280,1219253119,US +1219253120,1219253135,IN +1219253136,1219253319,US +1219253320,1219253327,CA +1219253328,1219256319,US 1219256320,1219264511,CA -1219264512,1219268607,US +1219264512,1219272703,US 1219272704,1219276799,CA -1219280896,1223199743,US +1219276800,1219290047,US +1219290048,1219290063,CA +1219290064,1219290623,US +1219290624,1219290751,AU +1219290752,1219295295,US +1219295296,1219295359,GR +1219295360,1223182487,US +1223182488,1223182654,ES +1223182655,1223197183,US +1223197184,1223197439,ES +1223197440,1223199743,US 1223199744,1223199999,GB -1223200000,1223208831,US -1223208832,1223208959,ES -1223208960,1224278015,US +1223200000,1223203327,US +1223203328,1223203583,ES +1223203584,1223208447,US +1223208448,1223208703,ES +1223208704,1223208767,US +1223208768,1223208959,ES +1223208960,1223222911,US +1223222912,1223223039,BR +1223223040,1223234047,US +1223234048,1223234303,ES +1223234304,1223239167,US +1223239168,1223239295,ES +1223239296,1223244159,US +1223244160,1223244223,BR +1223244224,1223257599,US +1223257600,1223257727,MX +1223257728,1224278015,US 1224278016,1224278023,GB 1224278024,1224278111,US 1224278112,1224278143,MY -1224278144,1224284671,US -1224284672,1224284927,GB -1224284928,1224285695,US +1224278144,1224278183,US +1224278184,1224278191,CA +1224278192,1224278359,US +1224278360,1224278367,GB +1224278368,1224278599,US +1224278600,1224278607,AU +1224278608,1224278815,US +1224278816,1224278823,CH +1224278824,1224285695,US 1224285696,1224286207,GB 1224286208,1224286719,US 1224286720,1224286975,CA 1224286976,1224290303,US 1224290304,1224290815,GB -1224290816,1224291327,CA -1224291328,1224292095,US +1224290816,1224291071,CA +1224291072,1224292095,US 1224292096,1224292351,CA -1224292352,1224294143,US -1224294144,1224294399,CA -1224294400,1224295423,US +1224292352,1224295423,US 1224295424,1224295679,VN 1224295680,1224296447,US 1224296448,1224296959,CA 1224296960,1224299519,US 1224299520,1224299775,CA -1224299776,1224305151,US +1224299776,1224303359,US +1224303360,1224303367,CA +1224303368,1224305151,US 1224305152,1224305663,GB -1224305664,1224317439,US +1224305664,1224311063,US +1224311064,1224311071,MX +1224311072,1224311247,US +1224311248,1224311255,CA +1224311256,1224311807,US +1224311808,1224312319,CA +1224312320,1224312327,GB +1224312328,1224312911,US +1224312912,1224312927,AU +1224312928,1224314047,US +1224314048,1224314079,GB +1224314080,1224314687,US +1224314688,1224314751,PA +1224314752,1224317439,US 1224317440,1224317695,CA 1224317696,1224318207,US 1224318208,1224318463,CA 1224318464,1224320511,US 1224320512,1224321023,GB -1224321024,1224327167,US -1224343552,1224388607,US -1224392704,1224396799,US -1224400896,1224450047,US -1224474624,1224476671,US +1224321024,1224321535,CA +1224321536,1224322559,US +1224322560,1224323071,GB +1224323072,1224474623,US +1224474624,1224475647,GT +1224475648,1224476671,US 1224476672,1224478719,AN 1224478720,1224480767,US 1224480768,1224484863,JM @@ -10512,287 +22976,1729 @@ 1224497152,1224501247,GT 1224501248,1224503551,JM 1224503552,1224503807,BS -1224503808,1224521727,JM -1224521728,1224529919,US -1224529920,1224538111,JM -1224538112,1241743359,US -1241776128,1242300415,US +1224503808,1224523520,JM +1224523521,1224523775,US +1224523776,1224525568,JM +1224525569,1224525823,US +1224525824,1224527616,JM +1224527617,1224527871,US +1224527872,1224529664,JM +1224529665,1224529919,US +1224529920,1224539904,JM +1224539905,1241743359,US +1241743360,1241759743,CA +1241759744,1242300415,US 1242300416,1242562559,CA 1242562560,1244659711,US 1244659712,1244790783,CA -1244790784,1244803071,US -1244807168,1244831743,US -1244831744,1244835839,CA -1244839936,1244844031,US +1244790784,1244821247,US +1244821248,1244821375,CA +1244821376,1244831743,US +1244831744,1244839935,CA +1244839936,1244848127,US 1244848128,1244852223,CA -1244856320,1244860415,US -1244864512,1244868607,CA -1244872704,1244893183,US -1244897280,1244901375,US -1244905472,1244909567,US -1244913664,1244917759,US -1244921856,1245183999,US +1244852224,1244864511,US +1244864512,1244872703,CA +1244872704,1245183999,US 1245184000,1245446143,CA -1245446144,1245655039,US -1245659136,1245667327,US -1245675520,1245691903,US -1245708288,1246756863,US -1247019008,1247027199,US -1247035392,1247039487,US -1247051776,1247059967,US -1247068160,1247121407,US -1247125504,1247137791,US -1247141888,1247145983,US -1247150080,1247154063,US -1247154064,1247154071,BR -1247154072,1247156031,US -1247156032,1247156039,SA -1247156040,1247156311,US -1247156312,1247156319,EG -1247156320,1247162647,US -1247162648,1247162655,EG -1247162656,1247169503,US -1247169504,1247169511,IE -1247169512,1247170743,US -1247170744,1247170751,GB -1247170752,1247170927,US -1247170928,1247170935,GB -1247170936,1247173319,US -1247173320,1247173327,IE -1247173328,1247178623,US -1247178624,1247178631,IE -1247178632,1247178703,US -1247178704,1247178711,IE -1247178712,1247179967,US -1247179968,1247179975,ID -1247179976,1247180255,US -1247180256,1247180271,ID -1247180272,1247180399,US -1247180400,1247180407,NO -1247180408,1247182343,US -1247182344,1247182351,IE -1247182352,1247183263,US -1247183264,1247183271,IE -1247183272,1247184559,US -1247184560,1247184567,IE -1247184568,1247186703,US -1247186704,1247186711,EG -1247186712,1247187199,US -1247187200,1247187207,LB -1247187208,1247191127,US -1247191128,1247191135,IE -1247191136,1247191199,US -1247191200,1247191207,IE -1247191208,1247281151,US -1247543296,1247805439,US -1249681408,1249697791,US -1249705984,1249783807,US -1249787904,1249791999,US +1245446144,1246864899,US +1246864900,1246864958,EG +1246864959,1246872069,US +1246872070,1246872081,GB +1246872082,1246873461,US +1246873462,1246873469,CA +1246873470,1246873491,US +1246873492,1246873501,GR +1246873502,1246874112,US +1246874113,1246874216,GB +1246874217,1246874290,US +1246874291,1246874304,CA +1246874305,1246874368,US +1246874369,1246874496,GB +1246874497,1246874558,US +1246874559,1246874590,GB +1246874591,1246875509,US +1246875510,1246875520,NL +1246875521,1246875904,US +1246875905,1246875929,CA +1246875930,1246902783,US +1246902784,1246903039,NL +1246903040,1246937087,US +1246937088,1246945279,CA +1246945280,1246949375,US +1246953472,1247027199,US +1247027200,1247035391,A2 +1247035392,1247069303,US +1247069304,1247069311,VA +1247069312,1247070815,US +1247070816,1247070831,CA +1247070832,1247072719,US +1247072720,1247072735,NL +1247072736,1248864255,US +1248864256,1248866303,CA +1248866304,1248885759,US +1248885760,1248886783,CA +1248886784,1248899071,US +1248899072,1248900095,CA +1248900096,1248913407,US +1248913408,1248915455,GP +1248915456,1248919551,US +1248919552,1248920575,CA +1248920576,1248921599,US +1248921600,1248923647,CA +1248923648,1248936959,US +1248936960,1248939007,CA +1248939008,1248946175,US +1248946176,1248947199,VG +1248947200,1248958463,US +1248958464,1248959487,CA +1248959488,1248964607,US +1248964608,1248966655,CA +1248966656,1249003519,US +1249003520,1249005567,CA +1249005568,1249010687,US +1249010688,1249011711,CA +1249011712,1249019903,US +1249019904,1249020927,CA +1249020928,1249029119,US +1249029120,1249030143,CA +1249030144,1249036287,US +1249036288,1249037311,TC +1249037312,1249040383,CA +1249040384,1249046527,US +1249046528,1249047551,BM +1249047552,1249050623,US +1249050624,1249052671,A1 +1249052672,1249082367,US +1249082368,1249083391,CA +1249083392,1249091583,US +1249091584,1249092607,A1 +1249092608,1249099775,US +1249099776,1249101823,CA +1249101824,1249102847,PR +1249102848,1249103871,CA +1249103872,1249106943,US +1249106944,1249107967,CA +1249107968,1249130495,US +1249130496,1249131519,JM +1249131520,1249139711,US +1249139712,1249140479,GP +1249140480,1249140735,MF +1249140736,1249163263,US +1249163264,1249167359,CA +1249167360,1249171455,US +1249171456,1249173503,CA +1249173504,1249179831,US +1249179832,1249179839,CA +1249179840,1249191935,US +1249191936,1249193983,CA +1249193984,1249203199,US +1249203200,1249204223,GD +1249204224,1249210367,US +1249210368,1249212415,KY +1249212416,1249217535,US +1249217536,1249218559,CA +1249218560,1249236991,US +1249236992,1249239039,KY +1249239040,1249245183,US +1249245184,1249247231,CA +1249247232,1249256447,US +1249256448,1249257471,CA +1249257472,1249260543,US +1249260544,1249261567,CA +1249261568,1249272831,US +1249272832,1249273855,CA +1249273856,1249310719,US +1249310720,1249311743,CA +1249311744,1249312767,US +1249312768,1249313791,CA +1249313792,1249335295,US +1249335296,1249337343,CA +1249337344,1249359871,US +1249359872,1249361919,CA +1249361920,1249384447,US +1249384448,1249386495,PR +1249386496,1249391615,US +1249391616,1249392639,CA +1249392640,1249396735,US +1249396736,1249397759,CA +1249397760,1249409023,US +1249409024,1249410047,CA +1249410048,1249452031,US +1249452032,1249453055,CA +1249453056,1249474559,US +1249474560,1249475583,CA +1249475584,1249484799,US +1249484800,1249486847,CA +1249486848,1249506303,US +1249506304,1249507327,CA +1249507328,1249522687,US +1249522688,1249523711,CA +1249523712,1249531903,US +1249531904,1249533951,GD +1249533952,1249542143,US +1249542144,1249544191,CA +1249544192,1249562623,US +1249562624,1249564671,CA +1249564672,1249571839,US +1249571840,1249572863,CA +1249572864,1249577087,US +1249577088,1249577983,CA +1249577984,1249592319,US +1249592320,1249593343,CA +1249593344,1249598463,US +1249598464,1249599487,CA +1249599488,1249690677,US +1249690678,1249690686,GB +1249690687,1249690783,US +1249690784,1249690815,AU +1249690816,1249691999,US +1249692000,1249692031,CA +1249692032,1249692735,US +1249692736,1249692767,HK +1249692768,1249693263,US +1249693264,1249693271,CA +1249693272,1249773023,US +1249773024,1249773055,CA +1249773056,1249796095,US 1249796096,1249804287,CA -1249804288,1249808383,US -1249812480,1249824767,US -1249828864,1249832959,US -1249837056,1249882111,US +1249804288,1249838847,US +1249838848,1249838911,IN +1249838912,1249839423,US +1249839424,1249839487,VE +1249839488,1249845311,US +1249845312,1249845327,IN +1249845328,1249845343,US +1249845344,1249845375,IN +1249845376,1249846847,US +1249846848,1249846879,GB +1249846880,1249846911,CN +1249846912,1249847039,US +1249847040,1249847167,IN +1249847168,1249847839,US +1249847840,1249847871,IN +1249847872,1249847903,US +1249847904,1249847935,NO +1249847936,1249847967,GB +1249847968,1249848479,US +1249848480,1249848511,PH +1249848512,1249848927,US +1249848928,1249848959,AU +1249848960,1249850367,US +1249850368,1249850383,IN +1249850384,1249850511,US +1249850512,1249850527,CA +1249850528,1249850543,US +1249850544,1249850559,IN +1249850560,1249850575,US +1249850576,1249850591,IN +1249850592,1249850607,NG +1249850608,1249851903,US +1249851904,1249852159,FR +1249852160,1249852447,US +1249852448,1249852479,IN +1249852480,1249852727,US +1249852728,1249852735,CY +1249852736,1249852767,US +1249852768,1249852775,ID +1249852776,1249886207,US 1249886208,1249902591,CA 1249902592,1254490111,US -1254490112,1254498303,CA -1254555648,1254588415,US +1254490112,1254555647,CA +1254555648,1254604159,US +1254604160,1254604175,GB +1254604176,1254621183,US 1254621184,1254629375,CA -1254629376,1254985727,US +1254629376,1254704383,US +1254704384,1254704639,PH +1254704640,1254704903,US +1254704904,1254704911,PH +1254704912,1254708927,US +1254708928,1254708959,SG +1254708960,1254713359,US +1254713360,1254713407,CA +1254713408,1254725119,US +1254725120,1254725151,GB +1254725152,1254924687,US +1254924688,1254924703,RO +1254924704,1254948927,US +1254948928,1254948935,SG +1254948936,1254948959,US +1254948960,1254948975,CA +1254948976,1254949247,US +1254949248,1254949279,IN +1254949280,1254950671,US +1254950672,1254950679,RU +1254950680,1254950687,CA +1254950688,1254950719,US +1254950720,1254950727,SG +1254950728,1254950751,US +1254950752,1254950759,IL +1254950760,1254950767,US +1254950768,1254950775,GR +1254950776,1254950847,US +1254950848,1254950855,IL +1254950856,1254950919,US +1254950920,1254950927,CA +1254950928,1254950951,US +1254950952,1254950959,IN +1254950960,1254951247,US +1254951248,1254951263,CA +1254951264,1254951431,US +1254951432,1254951439,CA +1254951440,1254951471,US +1254951472,1254951479,MX +1254951480,1254951495,US +1254951496,1254951503,PR +1254951504,1254951591,US +1254951592,1254951599,IL +1254951600,1254951607,US +1254951608,1254951615,IN +1254951616,1254951631,US +1254951632,1254951639,JP +1254951640,1254951647,CA +1254951648,1254951655,US +1254951656,1254951663,CA +1254951664,1254951871,US +1254951872,1254951887,TH +1254951888,1254952015,US +1254952016,1254952023,CA +1254952024,1254952047,US +1254952048,1254952055,MX +1254952056,1254952239,US +1254952240,1254952247,AU +1254952248,1254952255,US +1254952256,1254952263,CA +1254952264,1254952279,US +1254952280,1254952287,CA +1254952288,1254952295,IL +1254952296,1254952591,US +1254952592,1254952599,CA +1254952600,1254952927,US +1254952928,1254952935,CA +1254952936,1254953031,US +1254953032,1254953039,CA +1254953040,1254953047,ZA +1254953048,1254953055,US +1254953056,1254953063,IL +1254953064,1254953071,US +1254953072,1254953079,CA +1254953080,1254953087,US +1254953088,1254953095,CA +1254953096,1254953279,US +1254953280,1254953295,BD +1254953296,1254953327,US +1254953328,1254953343,NL +1254953344,1254953359,US +1254953360,1254953367,CA +1254953368,1254953615,US +1254953616,1254953623,GB +1254953624,1254953639,US +1254953640,1254953647,TW +1254953648,1254953671,US +1254953672,1254953679,MT +1254953680,1254953687,US +1254953688,1254953703,CA +1254953704,1254953743,US +1254953744,1254953751,IN +1254953752,1254953759,US +1254953760,1254953767,IN +1254953768,1254953775,GB +1254953776,1254953815,US +1254953816,1254953823,GT +1254953824,1254953855,US +1254953856,1254953879,NL +1254953880,1254953919,US +1254953920,1254953935,NL +1254953936,1254954255,US +1254954256,1254954263,CA +1254954264,1254954287,US +1254954288,1254954295,CA +1254954296,1254954303,US +1254954304,1254954311,MX +1254954312,1254954319,US +1254954320,1254954327,CA +1254954328,1254954343,US +1254954344,1254954351,TH +1254954352,1254954639,US +1254954640,1254954647,GB +1254954648,1254954655,CA +1254954656,1254954663,US +1254954664,1254954671,GB +1254954672,1254954887,US +1254954888,1254954895,IL +1254954896,1254955599,US +1254955600,1254955607,GB +1254955608,1254955735,US +1254955736,1254955743,GB +1254955744,1254956135,US +1254956136,1254956143,IL +1254956144,1254956383,US +1254956384,1254956391,IL +1254956392,1254957055,US +1254957056,1254957063,GB +1254957064,1254957071,MX +1254957072,1254957239,US +1254957240,1254957247,GB +1254957248,1254957263,MT +1254957264,1254957287,US +1254957288,1254957295,IN +1254957296,1254957375,US +1254957376,1254957391,CA +1254957392,1254957407,US +1254957408,1254957423,IN +1254957424,1254957743,US +1254957744,1254957751,GB +1254957752,1254957983,US +1254957984,1254957991,MX +1254957992,1254958303,US +1254958304,1254958319,GB +1254958320,1254958351,US +1254958352,1254958359,BO +1254958360,1254958367,US +1254958368,1254958383,CA +1254958384,1254958423,US +1254958424,1254958431,NO +1254958432,1254958535,US +1254958536,1254958543,CA +1254958544,1254958855,US +1254958856,1254958863,NZ +1254958864,1254958895,US +1254958896,1254958903,CA +1254958904,1254959151,US +1254959152,1254959183,CA +1254959184,1254959391,US +1254959392,1254959399,GB +1254959400,1254959671,US +1254959672,1254959679,GB +1254959680,1254959775,US +1254959776,1254959783,KR +1254959784,1254959799,US +1254959800,1254959807,GB +1254959808,1254959927,US +1254959928,1254959935,MX +1254959936,1254959943,US +1254959944,1254959951,CA +1254959952,1254959991,US +1254959992,1254959999,MX +1254960000,1254960039,US +1254960040,1254960047,IN +1254960048,1254960279,US +1254960280,1254960287,JM +1254960288,1254960351,US +1254960352,1254960359,AU +1254960360,1254960367,CA +1254960368,1254960415,US +1254960416,1254960423,CA +1254960424,1254960447,US +1254960448,1254960455,AU +1254960456,1254960463,US +1254960464,1254960471,SG +1254960472,1254960487,AU +1254960488,1254960495,GB +1254960496,1254960559,US +1254960560,1254960567,MY +1254960568,1254960583,US +1254960584,1254960591,MY +1254960592,1254960655,US +1254960656,1254960663,CA +1254960664,1254960879,US +1254960880,1254960887,CA +1254960888,1254960903,US +1254960904,1254960911,NZ +1254960912,1254960935,US +1254960936,1254960943,IN +1254960944,1254960967,US +1254960968,1254960975,IN +1254960976,1254961279,US +1254961280,1254961295,GB +1254961296,1254961567,US +1254961568,1254961599,BD +1254961600,1254961743,US +1254961744,1254961751,ZA +1254961752,1254961767,GB +1254961768,1254961823,US +1254961824,1254961831,AE +1254961832,1254961911,US +1254961912,1254961919,CA +1254961920,1254962015,US +1254962016,1254962023,AE +1254962024,1254962191,US +1254962192,1254962199,GB +1254962200,1254962351,US +1254962352,1254962359,GB +1254962360,1254962511,US +1254962512,1254962527,JP +1254962528,1254962695,US +1254962696,1254962703,GB +1254962704,1254962799,US +1254962800,1254962807,CA +1254962808,1254962855,US +1254962856,1254962863,CA +1254962864,1254962951,US +1254962952,1254962959,NZ +1254962960,1254962975,US +1254962976,1254962983,CA +1254962984,1254963047,US +1254963048,1254963055,MX +1254963056,1254963575,US +1254963576,1254963591,AU +1254963592,1254963663,US +1254963664,1254963671,GB +1254963672,1254964079,US +1254964080,1254964087,DK +1254964088,1254964231,US +1254964232,1254964239,PR +1254964240,1254964255,US +1254964256,1254964263,BR +1254964264,1254964335,US +1254964336,1254964343,NZ +1254964344,1254964351,PR +1254964352,1254964391,US +1254964392,1254964399,AU +1254964400,1254964799,US +1254964800,1254964815,CA +1254964816,1254964927,US +1254964928,1254964943,CA +1254964944,1254965095,US +1254965096,1254965103,IN +1254965104,1254965207,US +1254965208,1254965215,AU +1254965216,1254965239,US +1254965240,1254965247,GB +1254965248,1254965391,US +1254965392,1254965399,TC +1254965400,1254965431,US +1254965432,1254965439,GB +1254965440,1254965511,US +1254965512,1254965519,AU +1254965520,1254965735,US +1254965736,1254965743,CA +1254965744,1254965751,AU +1254965752,1254965887,US +1254965888,1254965895,MX +1254965896,1254966031,US +1254966032,1254966039,CA +1254966040,1254966135,US +1254966136,1254966143,GB +1254966144,1254966159,US +1254966160,1254966167,CA +1254966168,1254966239,US +1254966240,1254966247,AU +1254966248,1254966383,US +1254966384,1254966391,ZA +1254966392,1254966487,US +1254966488,1254966495,IE +1254966496,1254966567,US +1254966568,1254966575,ZA +1254966576,1254966607,US +1254966608,1254966615,JO +1254966616,1254966655,US +1254966656,1254966663,GB +1254966664,1254966767,US +1254966768,1254966775,ZA +1254966776,1254966863,US +1254966864,1254966879,IL +1254966880,1254966927,US +1254966928,1254966943,FR +1254966944,1254966975,US +1254966976,1254966991,IL +1254966992,1254967007,US +1254967008,1254967023,AE +1254967024,1254967079,US +1254967080,1254967087,PH +1254967088,1254967127,US +1254967128,1254967143,BM +1254967144,1254967263,US +1254967264,1254967271,AU +1254967272,1254967279,US +1254967280,1254967287,FR +1254967288,1254967519,US +1254967520,1254967535,CA +1254967536,1254967607,US +1254967608,1254967615,CA +1254967616,1254967647,US +1254967648,1254967655,EG +1254967656,1254967887,US +1254967888,1254967895,CA +1254967896,1254967975,US +1254967976,1254967991,IN +1254967992,1254968039,US +1254968040,1254968047,CA +1254968048,1254968103,US +1254968104,1254968111,UY +1254968112,1254968183,US +1254968184,1254968191,CA +1254968192,1254968295,US +1254968296,1254968303,IT +1254968304,1254968391,US +1254968392,1254968399,SG +1254968400,1254968407,US +1254968408,1254968415,CA +1254968416,1254968487,US +1254968488,1254968495,CA +1254968496,1254968503,US +1254968504,1254968511,GB +1254968512,1254968671,US +1254968672,1254968679,DO +1254968680,1254968751,US +1254968752,1254968759,GB +1254968760,1254968927,US +1254968928,1254968935,CA +1254968936,1254968951,US +1254968952,1254968959,GB +1254968960,1254968991,US +1254968992,1254968999,CA +1254969000,1254969111,US +1254969112,1254969127,AU +1254969128,1254969175,US +1254969176,1254969183,AU +1254969184,1254969247,US +1254969248,1254969255,CO +1254969256,1254969263,BD +1254969264,1254969287,US +1254969288,1254969295,GB +1254969296,1254969311,US +1254969312,1254969319,CA +1254969320,1254969399,US +1254969400,1254969407,CA +1254969408,1254969423,US +1254969424,1254969431,CA +1254969432,1254969439,GB +1254969440,1254969447,CA +1254969448,1254969455,US +1254969456,1254969463,IL +1254969464,1254969471,GB +1254969472,1254969495,US +1254969496,1254969503,DK +1254969504,1254969551,US +1254969552,1254969559,CA +1254969560,1254969567,GB +1254969568,1254969575,US +1254969576,1254969583,AE +1254969584,1254969663,US +1254969664,1254969671,AU +1254969672,1254970047,US +1254970048,1254970063,CA +1254970064,1254970095,US +1254970096,1254970111,AE +1254970112,1254970167,US +1254970168,1254970175,GB +1254970176,1254970183,US +1254970184,1254970191,GB +1254970192,1254970199,US +1254970200,1254970207,CA +1254970208,1254970215,IL +1254970216,1254970287,US +1254970288,1254970295,IN +1254970296,1254970335,US +1254970336,1254970343,CH +1254970344,1254970527,US +1254970528,1254970543,GB +1254970544,1254970607,US +1254970608,1254970623,GH +1254970624,1254970631,MX +1254970632,1254970903,US +1254970904,1254970911,CA +1254970912,1254971007,US +1254971008,1254971015,JP +1254971016,1254971023,IN +1254971024,1254971055,US +1254971056,1254971063,GB +1254971064,1254971143,US +1254971144,1254971151,CA +1254971152,1254971231,US +1254971232,1254971239,IN +1254971240,1254971255,US +1254971256,1254971263,CA +1254971264,1254971319,US +1254971320,1254971327,MX +1254971328,1254971951,US +1254971952,1254971959,GB +1254971960,1254971967,IN +1254971968,1254972239,US +1254972240,1254972247,CA +1254972248,1254972407,US +1254972408,1254972415,AU +1254972416,1254972431,US +1254972432,1254972439,AU +1254972440,1254972447,US +1254972448,1254972455,GG +1254972456,1254972671,US +1254972672,1254972679,GB +1254972680,1254972727,US +1254972728,1254972735,AU +1254972736,1254972879,US +1254972880,1254972895,MX +1254972896,1254972983,US +1254972984,1254972991,CA +1254972992,1254973015,US +1254973016,1254973023,BR +1254973024,1254973047,US +1254973048,1254973055,AU +1254973056,1254973471,US +1254973472,1254973479,IN +1254973480,1254973511,US +1254973512,1254973519,IE +1254973520,1254973575,US +1254973576,1254973583,MX +1254973584,1254973663,US +1254973664,1254973671,PH +1254973672,1254973679,US +1254973680,1254973687,IN +1254973688,1254973695,US +1254973696,1254973703,MY +1254973704,1254973807,US +1254973808,1254973815,IN +1254973816,1254973895,US +1254973896,1254973903,MX +1254973904,1254974167,US +1254974168,1254974175,MX +1254974176,1254974327,US +1254974328,1254974335,MX +1254974336,1254974367,US +1254974368,1254974375,CA +1254974376,1254974391,US +1254974392,1254974399,CA +1254974400,1254974511,US +1254974512,1254974519,IL +1254974520,1254974647,US +1254974648,1254974655,CA +1254974656,1254974767,US +1254974768,1254974775,GB +1254974776,1254974887,US +1254974888,1254974895,AU +1254974896,1254974951,US +1254974952,1254974959,NZ +1254974960,1254975231,US +1254975232,1254975239,AU +1254975240,1254975415,US +1254975416,1254975423,CA +1254975424,1254975471,US +1254975472,1254975487,GB +1254975488,1254975615,US +1254975616,1254975623,IN +1254975624,1254975631,IL +1254975632,1254975887,US +1254975888,1254975895,IN +1254975896,1254975919,US +1254975920,1254975927,IN +1254975928,1254975935,CA +1254975936,1254976023,US +1254976024,1254976031,GB +1254976032,1254976127,US +1254976128,1254976135,AU +1254976136,1254976151,US +1254976152,1254976167,CA +1254976168,1254976303,US +1254976304,1254976311,GB +1254976312,1254976351,US +1254976352,1254976359,GB +1254976360,1254976399,US +1254976400,1254976407,MX +1254976408,1254976735,US +1254976736,1254976751,CA +1254976752,1254976767,US +1254976768,1254976775,GB +1254976776,1254976791,US +1254976792,1254976799,IN +1254976800,1254976903,US +1254976904,1254976911,MX +1254976912,1254977095,US +1254977096,1254977103,CO +1254977104,1254977135,US +1254977136,1254977143,NZ +1254977144,1254977159,US +1254977160,1254977167,IN +1254977168,1254977247,US +1254977248,1254977255,CL +1254977256,1254977455,US +1254977456,1254977471,IN +1254977472,1254977487,US +1254977488,1254977503,TH +1254977504,1254977623,US +1254977624,1254977631,CA +1254977632,1254977647,US +1254977648,1254977655,AE +1254977656,1254977735,US +1254977736,1254977743,NZ +1254977744,1254977791,US +1254977792,1254977799,GB +1254977800,1254978183,US +1254978184,1254978191,GB +1254978192,1254978327,US +1254978328,1254978335,IN +1254978336,1254978375,US +1254978376,1254978383,BR +1254978384,1254978391,CA +1254978392,1254978447,US +1254978448,1254978463,IN +1254978464,1254978495,US +1254978496,1254978559,NL +1254978560,1254979407,US +1254979408,1254979423,CA +1254979424,1254989823,US 1254989824,1254998015,CA 1254998016,1255002111,US -1255006208,1255026687,US -1255030784,1255043071,US +1255002112,1255006207,CA +1255006208,1255007487,US +1255007488,1255007711,CA +1255007712,1255011343,US +1255011344,1255011359,CA +1255011360,1255011367,US +1255011368,1255011551,CA +1255011552,1255011559,US +1255011560,1255011839,CA +1255011840,1255039631,US +1255039632,1255039663,CA +1255039664,1255042751,US +1255042752,1255042783,CA +1255042784,1255047167,US 1255047168,1255055359,CA -1255055360,1255063551,US +1255055360,1255055487,US +1255055488,1255055503,CA +1255055504,1255056063,US +1255056064,1255056095,NL +1255056096,1255057887,US +1255057888,1255057919,NL +1255057920,1255058671,US +1255058672,1255058687,GB +1255058688,1255059151,US +1255059152,1255059167,GB +1255059168,1255059199,BS +1255059200,1255059327,US +1255059328,1255059343,NL +1255059344,1255059359,US +1255059360,1255059407,CA +1255059408,1255059423,AR +1255059424,1255060159,US +1255060160,1255060191,NL +1255060192,1255060607,US +1255060608,1255060623,AN +1255060624,1255060655,US +1255060656,1255060671,AN +1255060672,1255060863,US +1255060864,1255060991,CA +1255060992,1255061631,US +1255061632,1255061647,CA +1255061648,1255061695,US +1255061696,1255061727,CR +1255061728,1255061983,US +1255061984,1255062015,CA +1255062016,1255062463,US +1255062464,1255062527,PA +1255062528,1255062591,US +1255062592,1255062607,CA +1255062608,1255062847,US +1255062848,1255062863,CA +1255062864,1255063551,US 1255063552,1255071743,PR -1255071744,1255137279,US -1255145472,1255147007,US -1255147008,1255147263,DE -1255147264,1255194623,US -1255211008,1255247871,US -1255260160,1255272447,US +1255071744,1255193599,US +1255193600,1255194623,GB +1255194624,1255210495,US +1255210496,1255211007,DE +1255211008,1255276543,US 1255276544,1255342079,CA -1255342080,1255489535,US +1255342080,1255369055,US +1255369056,1255369087,DE +1255369088,1255372287,US +1255372288,1255372543,CA +1255372544,1255373823,US +1255373824,1255374079,CA +1255374080,1255489535,US 1255489536,1255505919,PR 1255505920,1255514111,US -1255514112,1255518207,CA -1255522304,1255542783,US -1255546880,1255571455,US +1255514112,1255522303,CA +1255522304,1255571455,US 1255571456,1255579647,CA -1255579648,1255583743,US -1255587840,1255591935,US -1255596032,1255669759,US +1255579648,1255669759,US 1255669760,1255735295,CA -1255735296,1255759871,US -1255800832,1255935999,US -1255940096,1255944191,US -1255948288,1255952383,US -1255956480,1255968767,US +1255735296,1255746799,US +1255746800,1255746815,BB +1255746816,1255753215,US +1255753216,1255753471,GB +1255753472,1255768063,US +1255768064,1255768575,CA +1255768576,1255771135,US +1255771136,1255772159,CA +1255772160,1255780351,US +1255780352,1255782399,CA +1255782400,1255796743,US +1255796744,1255796751,GB +1255796752,1255972863,US 1255972864,1255981055,CA -1255981056,1255993343,US -1255997440,1256001535,US -1256005632,1256009727,US -1256013824,1256017919,US -1256022016,1256034303,US -1256038400,1256042495,US -1256046592,1256050687,US -1256054784,1256058879,US -1256062976,1256079359,US +1255981056,1256001535,US +1256001536,1256005631,CA +1256005632,1256057975,US +1256057976,1256057983,BZ +1256057984,1256079359,US 1256079360,1256087551,KY -1256087552,1263263743,US -1263271936,1263304703,US -1263337472,1263370239,US -1263403008,1264582655,US -1264844800,1264926719,US -1264943104,1264980223,US +1256087552,1256098303,US +1256098304,1256098339,CA +1256098340,1256098343,US +1256098344,1256098815,CA +1256098816,1263264273,US +1263264274,1263264289,PK +1263264290,1263264305,CA +1263264306,1263264354,PK +1263264355,1263264386,US +1263264387,1263264450,CA +1263264451,1263264767,US +1263264768,1263265023,CA +1263265024,1263266559,US +1263266560,1263266815,CA +1263266816,1263267327,US +1263267328,1263267583,CA +1263267584,1263267647,US +1263267648,1263267679,CA +1263267680,1263268095,US +1263268096,1263268191,CA +1263268192,1263268275,US +1263268276,1263268340,CA +1263268341,1263268343,US +1263268344,1263268351,CA +1263268352,1263268607,US +1263268608,1263268672,CA +1263268673,1263268769,US +1263268770,1263268863,CA +1263268864,1263269119,US +1263269120,1263269631,CA +1263269632,1263270143,US +1263270144,1263270911,CA +1263270912,1263271423,US +1263271424,1263271679,CA +1263271680,1264717823,US +1264717824,1264718335,CA +1264718336,1264736255,US +1264736256,1264737279,DO +1264737280,1264738303,US +1264779264,1264980223,US 1264980224,1264980479,HK -1264980480,1264992255,US -1265008640,1265012735,US -1265041408,1265057791,US -1265074176,1265098751,US -1265106944,1266114559,US -1266122752,1266139135,US +1264980480,1264980735,US +1264980736,1264980743,CA +1264980744,1266107759,US +1266107760,1266107775,UM +1266107776,1266147327,US +1266147328,1266155519,CA 1266155520,1266489663,US 1266489664,1266489695,CA 1266489696,1266498175,US 1266498176,1266498303,MA 1266498304,1266514815,US 1266514816,1266514879,CA -1266514880,1266551519,US -1266551520,1266551527,PH -1266551528,1266554207,US -1266554208,1266554215,SA -1266554216,1266559095,US -1266559096,1266559103,SA -1266559104,1266559415,US -1266559416,1266559423,CA -1266559424,1266564735,US -1266564736,1266564743,GR -1266564744,1266565031,US -1266565032,1266565039,SA -1266565040,1266566815,US -1266566816,1266566823,AU -1266566824,1266567407,US -1266567408,1266567415,CA -1266567416,1266569567,US -1266569568,1266569575,NO -1266569576,1266569623,US -1266569624,1266569631,SA -1266569632,1266574631,US -1266574632,1266574639,TR -1266574640,1266578911,US -1266578912,1266578927,AU -1266578928,1266581535,US -1266581536,1266581543,IE -1266581544,1266581551,US -1266581552,1266581559,IE -1266581560,1266583679,US -1266583680,1266583687,ID -1266583688,1266583887,US -1266583888,1266583895,ID -1266583896,1266584383,US -1266584384,1266584399,SA -1266584400,1266584783,US -1266584784,1266584791,SA -1266584792,1266587215,US -1266587216,1266587223,GB -1266587224,1266587511,US -1266587512,1266587519,EG -1266587520,1266587631,US -1266587632,1266587639,GB -1266587640,1266589295,US -1266589296,1266589303,IE -1266589304,1266590831,US -1266590832,1266590839,IE -1266590840,1266594367,US -1266594368,1266594383,ID -1266594384,1266597311,US -1266597312,1266597343,SA -1266597344,1266598711,US -1266598712,1266598719,IE -1266598720,1266599295,US -1266599296,1266599303,IE -1266599304,1266599559,US -1266599560,1266599567,SA -1266599568,1266605207,US -1266605208,1266605215,ID -1266605216,1266606527,US -1266606528,1266606559,AR -1266606560,1266607223,US -1266607224,1266607231,SA -1266607232,1266607567,US -1266607568,1266607575,SA -1266607576,1266607935,US -1266607936,1266607951,IE -1266607952,1266608463,US -1266608464,1266608471,SA -1266608472,1266609407,US -1266609408,1266609415,CN -1266609416,1266626559,US -1266630656,1268252671,US -1268252672,1268711423,CA -1268776960,1275596799,US +1266514880,1266516817,US +1266516818,1266516830,IE +1266516831,1268252671,US +1268252672,1268776959,CA +1268776960,1275600895,US 1275600896,1275604991,BM -1275609088,1275621375,US -1275625472,1275629567,US -1275633664,1275666431,US -1275666432,1275670527,CA -1275674624,1275686911,US -1275691008,1275703295,US +1275604992,1275621375,US +1275621376,1275625471,CA +1275625472,1275658239,US +1275658240,1275658495,GB +1275658496,1275659007,US +1275659008,1275659263,GB +1275659264,1275665151,US +1275665152,1275665407,UA +1275665408,1275666431,US +1275666432,1275674623,CA +1275674624,1275707391,US 1275707392,1275708927,CA 1275708928,1275709183,US 1275709184,1275711487,CA 1275711488,1275712511,US -1275712512,1275715583,CA -1275715584,1275719679,US -1275723776,1275756543,US +1275712512,1275714047,CA +1275714048,1275714559,US +1275714560,1275715583,CA +1275715584,1275756543,US 1275756544,1275772927,CA -1275772928,1275781119,US -1275789312,1275813887,CA -1275822080,1279262719,US +1275772928,1275789311,US +1275789312,1275822079,CA +1275822080,1275854967,US +1275854968,1275854975,CA +1275854976,1275858215,US +1275858216,1275858223,BB +1275858224,1275858239,US +1275858240,1275858247,CA +1275858248,1275859671,US +1275859672,1275859679,AU +1275859680,1275859711,US +1275859712,1275859719,PR +1275859720,1275859727,US +1275859728,1275859743,PR +1275859744,1275859807,US +1275859808,1275859815,AE +1275859816,1275860087,US +1275860088,1275860095,MX +1275860096,1275861039,US +1275861040,1275861055,CA +1275861056,1275861103,US +1275861104,1275861119,GT +1275861120,1275862183,US +1275862184,1275862191,JO +1275862192,1275864175,US +1275864176,1275864183,CA +1275864184,1275865055,US +1275865056,1275865063,AU +1275865064,1275865383,US +1275865384,1275865391,CA +1275865392,1275865711,US +1275865712,1275865719,SA +1275865720,1275869087,US +1275869088,1275869095,CA +1275869096,1275869103,IL +1275869104,1275869535,US +1275869536,1275869551,GB +1275869552,1275869895,US +1275869896,1275869903,IL +1275869904,1275869935,US +1275869936,1275869943,PK +1275869944,1275870647,US +1275870648,1275870655,CA +1275870656,1275870671,US +1275870672,1275870695,CA +1275870696,1275871719,US +1275871720,1275871727,GB +1275871728,1275872895,US +1275872896,1275872903,AU +1275872904,1275872911,CA +1275872912,1275872927,US +1275872928,1275872935,CA +1275872936,1275873095,US +1275873096,1275873103,CA +1275873104,1275873183,US +1275873184,1275873215,AU +1275873216,1275873535,US +1275873536,1275873543,CG +1275873544,1275873639,US +1275873640,1275873647,SA +1275873648,1275875135,US +1275875136,1275875143,CA +1275875144,1275875247,US +1275875248,1275875255,CA +1275875256,1275875359,US +1275875360,1275875367,AU +1275875368,1275875479,US +1275875480,1275875503,AU +1275875504,1275875767,US +1275875768,1275875775,CA +1275875776,1275876623,US +1275876624,1275876631,GB +1275876632,1275876839,US +1275876840,1275876847,CA +1275876848,1275877111,US +1275877112,1275877119,CA +1275877120,1275877695,US +1275877696,1275877703,PK +1275877704,1275879463,US +1275879464,1275879471,GB +1275879472,1275879487,AU +1275879488,1275879519,GB +1275879520,1275879527,AU +1275879528,1275879535,US +1275879536,1275879551,AU +1275879552,1275879711,US +1275879712,1275879743,CA +1275879744,1275879791,US +1275879792,1275879807,GB +1275879808,1275880079,US +1275880080,1275880095,AU +1275880096,1275880191,US +1275880192,1275880207,MX +1275880208,1275880247,US +1275880248,1275880255,CA +1275880256,1275880783,US +1275880784,1275880799,CA +1275880800,1275881791,US +1275881792,1275881799,AU +1275881800,1275881807,CA +1275881808,1275881847,US +1275881848,1275881871,CA +1275881872,1275881887,US +1275881888,1275881895,CA +1275881896,1275883127,US +1275883128,1275883135,CA +1275883136,1275883551,US +1275883552,1275883559,CA +1275883560,1275883991,US +1275883992,1275883999,CA +1275884000,1275884391,US +1275884392,1275884399,AU +1275884400,1275885551,US +1275885552,1275885559,IT +1275885560,1275885567,US +1275885568,1275885583,IT +1275885584,1275885647,US +1275885648,1275885655,AU +1275885656,1275886703,US +1275886704,1275886719,CA +1275886720,1275886735,US +1275886736,1275886743,AU +1275886744,1275886855,US +1275886856,1275886863,IT +1275886864,1275886879,US +1275886880,1275886895,IT +1275886896,1275886983,US +1275886984,1275886991,PA +1275886992,1275887063,US +1275887064,1275887071,AE +1275887072,1275887079,US +1275887080,1275887087,AE +1275887088,1275888015,US +1275888016,1275888023,IN +1275888024,1275888039,US +1275888040,1275888047,GB +1275888048,1275888095,US +1275888096,1275888127,ZA +1275888128,1275888311,US +1275888312,1275888319,DE +1275888320,1275889695,US +1275889696,1275889711,CA +1275889712,1275889967,US +1275889968,1275889983,DE +1275889984,1275890039,US +1275890040,1275890047,CA +1275890048,1275890087,US +1275890088,1275890095,GB +1275890096,1275890191,US +1275890192,1275890207,SA +1275890208,1275890359,US +1275890360,1275890367,CA +1275890368,1275890423,US +1275890424,1275890431,NL +1275890432,1275890687,US +1275890688,1275890703,DE +1275890704,1275890735,US +1275890736,1275890751,NL +1275890752,1275891007,US +1275891008,1275891015,CA +1275891016,1275891063,US +1275891064,1275891071,LB +1275891072,1275891191,US +1275891192,1275891199,DE +1275891200,1275891463,US +1275891464,1275891471,IE +1275891472,1275891511,US +1275891512,1275891519,AU +1275891520,1275892255,US +1275892256,1275892279,DK +1275892280,1275892423,US +1275892424,1275892431,GB +1275892432,1275892735,US +1275892736,1275892767,GB +1275892768,1275892951,US +1275892952,1275892967,GB +1275892968,1275893303,US +1275893304,1275893311,CA +1275893312,1275893455,US +1275893456,1275893463,MX +1275893464,1275893663,US +1275893664,1275893679,CA +1275893680,1275893775,US +1275893776,1275893791,MX +1275893792,1275894327,US +1275894328,1275894335,GB +1275894336,1275894383,US +1275894384,1275894399,GB +1275894400,1275894519,US +1275894520,1275894527,AU +1275894528,1275894831,US +1275894832,1275894863,AU +1275894864,1275895023,US +1275895024,1275895039,CA +1275895040,1275895095,US +1275895096,1275895103,CG +1275895104,1275895135,US +1275895136,1275895143,SA +1275895144,1275895159,US +1275895160,1275895167,CA +1275895168,1275895191,US +1275895192,1275895199,GB +1275895200,1275895263,US +1275895264,1275895271,NG +1275895272,1275896951,US +1275896952,1275896959,PK +1275896960,1275898247,US +1275898248,1275898255,IT +1275898256,1275898319,US +1275898320,1275898335,IT +1275898336,1275898783,US +1275898784,1275898791,AU +1275898792,1275898799,US +1275898800,1275898807,AU +1275898808,1275899223,US +1275899224,1275899231,PT +1275899232,1275899887,US +1275899888,1275899903,NO +1275899904,1275899951,US +1275899952,1275899967,NG +1275899968,1275900007,US +1275900008,1275900015,ZA +1275900016,1275900271,US +1275900272,1275900287,GB +1275900288,1275900455,US +1275900456,1275900479,AU +1275900480,1275901007,US +1275901008,1275901023,PT +1275901024,1275901135,US +1275901136,1275901143,IL +1275901144,1275901439,US +1275901440,1275901455,GB +1275901456,1275901511,US +1275901512,1275901519,MX +1275901520,1275901783,US +1275901784,1275901791,NG +1275901792,1275901991,US +1275901992,1275902015,NG +1275902016,1275902031,US +1275902032,1275902039,GB +1275902040,1275902047,US +1275902048,1275902079,GB +1275902080,1275902095,CR +1275902096,1275902119,US +1275902120,1275902127,NG +1275902128,1275902303,US +1275902304,1275902311,CA +1275902312,1275902335,US +1275902336,1275902343,PK +1275902344,1275902383,US +1275902384,1275902391,CA +1275902392,1275903775,US +1275903776,1275903839,NO +1275903840,1275903863,US +1275903864,1275903871,CA +1275903872,1275904823,US +1275904824,1275904831,NG +1275904832,1275904991,US +1275904992,1275905023,CA +1275905024,1275905767,US +1275905768,1275905783,GB +1275905784,1275905791,ZA +1275905792,1275906343,US +1275906344,1275906351,CA +1275906352,1275907071,US +1275907072,1275907079,CA +1275907080,1275907911,US +1275907912,1275907919,HK +1275907920,1275908431,US +1275908432,1275908447,GB +1275908448,1275909439,US +1275909440,1275909455,GB +1275909456,1275910207,US +1275910208,1275910223,PA +1275910224,1275910503,US +1275910504,1275910511,IN +1275910512,1275910631,US +1275910632,1275910639,ZA +1275910640,1275911655,US +1275911656,1275911663,CA +1275911664,1275911935,US +1275911936,1275911967,CA +1275911968,1275912759,US +1275912760,1275912783,CA +1275912784,1275912799,AU +1275912800,1275912879,US +1275912880,1275912887,PT +1275912888,1275914135,US +1275914136,1275914143,AU +1275914144,1275915655,US +1275915656,1275915663,MX +1275915664,1275916167,US +1275916168,1275916199,CA +1275916200,1275916351,US +1275916352,1275916383,NL +1275916384,1275916887,US +1275916888,1275916895,CA +1275916896,1275918431,US +1275918432,1275918463,PK +1275918464,1275918479,IN +1275918480,1275918719,US +1275918720,1275918735,CA +1275918736,1275918807,US +1275918808,1275918815,NG +1275918816,1275919263,US +1275919264,1275919279,IE +1275919280,1275919911,US +1275919912,1275919919,BR +1275919920,1275919935,US +1275919936,1275919967,BR +1275919968,1275919999,IE +1275920000,1275920015,GB +1275920016,1275920031,CH +1275920032,1275920055,US +1275920056,1275920063,GB +1275920064,1275920079,US +1275920080,1275920095,CA +1275920096,1279262719,US 1279262720,1279787007,CA -1279885312,1279950847,US +1279787008,1279848447,US +1279848448,1279852543,PR +1279852544,1279921919,US +1279921920,1279922047,IE +1279922048,1279940879,US +1279940880,1279940887,DE +1279940888,1279940943,US +1279940944,1279940959,DE +1279940960,1279940991,US +1279940992,1279940999,DE +1279941000,1279943679,US +1279943680,1279943743,PR +1279943744,1279950847,US 1279950848,1279951103,FI -1279951104,1279951359,US -1279951360,1279952895,CA -1279952896,1279952919,US -1279952920,1279952927,BV -1279952928,1279953023,US -1279953024,1279953055,BV -1279953056,1279953151,US -1279953152,1279953407,CA -1279953408,1279960511,US +1279951104,1279951135,US +1279951136,1279951151,CA +1279951152,1279951167,US +1279951168,1279951199,CA +1279951200,1279951231,US +1279951232,1279952919,CA +1279952920,1279952927,VG +1279952928,1279952943,US +1279952944,1279953023,CA +1279953024,1279953055,VG +1279953056,1279953087,US +1279953088,1279953671,CA +1279953672,1279953679,US +1279953680,1279953951,CA +1279953952,1279953967,US +1279953968,1279954095,CA +1279954096,1279954119,US +1279954120,1279954303,CA +1279954304,1279954431,US +1279954432,1279954527,CA +1279954528,1279954559,US +1279954560,1279954623,CA +1279954624,1279954687,FI +1279954688,1279954783,CA +1279954784,1279954839,US +1279954840,1279954879,CA +1279954880,1279954911,US +1279954912,1279954943,CA +1279954944,1279955103,US +1279955104,1279955119,CA +1279955120,1279955151,US +1279955152,1279955159,AU +1279955160,1279956031,US +1279956032,1279956047,CR +1279956048,1279956059,US +1279956060,1279956063,MX +1279956064,1279956079,US +1279956080,1279956095,CR +1279956096,1279956239,US +1279956240,1279956255,CA +1279956256,1279956311,US +1279956312,1279956351,CA +1279956352,1279956455,US +1279956456,1279956463,PA +1279956464,1279959551,US +1279959552,1279959807,CA +1279959808,1279960063,US +1279960064,1279960127,CA +1279960128,1279960143,US +1279960144,1279960159,CA +1279960160,1279960215,US +1279960216,1279960319,CA +1279960320,1279960335,US +1279960336,1279960343,CA +1279960344,1279960415,US +1279960416,1279960479,CA +1279960480,1279960511,US 1279960512,1279960527,CA -1279960528,1279967231,US +1279960528,1279960535,US +1279960536,1279960559,CA +1279960560,1279962175,US +1279962176,1279962207,CA +1279962208,1279962223,US +1279962224,1279962239,CA +1279962240,1279962895,US +1279962896,1279962911,CA +1279962912,1279962927,CN +1279962928,1279962943,US +1279962944,1279962975,CN +1279962976,1279963935,US +1279963936,1279963967,CA +1279963968,1279965183,US +1279965184,1279966207,CA +1279966208,1279967231,US 1279967232,1279971327,CA -1279971328,1279977471,US -1279977472,1279977983,CA -1279977984,1279982335,US -1279982336,1279982591,CA -1279982592,1279999999,US +1279971328,1279971583,US +1279971584,1279972095,CA +1279972096,1279973951,US +1279973952,1279973967,CA +1279973968,1279974175,US +1279974176,1279974207,CN +1279974208,1279974271,CA +1279974272,1279974391,US +1279974392,1279974399,CA +1279974400,1279974527,US +1279974528,1279974655,CA +1279974656,1279974783,US +1279974784,1279974799,EG +1279974800,1279974815,CA +1279974816,1279975263,US +1279975264,1279975295,EG +1279975296,1279975407,US +1279975408,1279975423,NZ +1279975424,1279975679,CA +1279975680,1279975959,US +1279975960,1279975967,CA +1279975968,1279975975,HK +1279975976,1279975983,US +1279975984,1279976007,CA +1279976008,1279976015,US +1279976016,1279976031,CA +1279976032,1279976063,KN +1279976064,1279976127,US +1279976128,1279976143,CA +1279976144,1279976159,US +1279976160,1279978111,CA +1279978112,1279978143,US +1279978144,1279978271,CA +1279978272,1279978303,US +1279978304,1279978367,CA +1279978368,1279978495,VG +1279978496,1279979559,US +1279979560,1279979575,CA +1279979576,1279979583,US +1279979584,1279980063,CA +1279980064,1279980071,US +1279980072,1279980079,BV +1279980080,1279980127,CA +1279980128,1279980135,US +1279980136,1279981567,CA +1279981568,1279999999,US 1280000000,1280032767,CA 1280032768,1280040959,US -1280049152,1280061439,US -1280065536,1280073727,US -1280073728,1280081919,CA -1280081920,1280086015,US -1280090112,1280098303,AG +1280040960,1280043527,CA +1280043528,1280043535,US +1280043536,1280043551,CA +1280043552,1280043559,US +1280043560,1280043567,CA +1280043568,1280043607,US +1280043608,1280043679,CA +1280043680,1280043703,US +1280043704,1280043711,CA +1280043712,1280043719,US +1280043720,1280043751,CA +1280043752,1280043759,US +1280043760,1280043767,CA +1280043768,1280043775,US +1280043776,1280043807,CA +1280043808,1280043815,US +1280043816,1280043823,CA +1280043824,1280043831,US +1280043832,1280043959,CA +1280043960,1280043975,US +1280043976,1280044415,CA +1280044416,1280044423,US +1280044424,1280044447,CA +1280044448,1280044455,US +1280044456,1280044463,CA +1280044464,1280044471,US +1280044472,1280044503,CA +1280044504,1280044535,US +1280044536,1280045063,CA +1280045064,1280045071,US +1280045072,1280045167,CA +1280045168,1280045175,US +1280045176,1280045183,CA +1280045184,1280045191,US +1280045192,1280045439,CA +1280045440,1280045463,US +1280045464,1280045511,CA +1280045512,1280045527,US +1280045528,1280045551,CA +1280045552,1280045559,US +1280045560,1280045711,CA +1280045712,1280045727,US +1280045728,1280045751,CA +1280045752,1280045759,US +1280045760,1280045783,CA +1280045784,1280045791,US +1280045792,1280045879,CA +1280045880,1280045887,US +1280045888,1280046039,CA +1280046040,1280046055,US +1280046056,1280046167,CA +1280046168,1280046199,US +1280046200,1280046231,CA +1280046232,1280046239,US +1280046240,1280046247,CA +1280046248,1280046255,US +1280046256,1280046343,CA +1280046344,1280046351,US +1280046352,1280046423,CA +1280046424,1280046431,US +1280046432,1280046527,CA +1280046528,1280046551,US +1280046552,1280046751,CA +1280046752,1280046759,US +1280046760,1280046791,CA +1280046792,1280046799,US +1280046800,1280046871,CA +1280046872,1280046879,US +1280046880,1280046951,CA +1280046952,1280046959,US +1280046960,1280047095,CA +1280047096,1280047103,US +1280047104,1280047183,CA +1280047184,1280047191,US +1280047192,1280047495,CA +1280047496,1280047519,US +1280047520,1280047527,CA +1280047528,1280047535,NL +1280047536,1280047543,CA +1280047544,1280047551,US +1280047552,1280047583,CA +1280047584,1280047591,US +1280047592,1280047775,CA +1280047776,1280047783,US +1280047784,1280047799,CA +1280047800,1280047807,US +1280047808,1280047831,CA +1280047832,1280047839,US +1280047840,1280047967,CA +1280047968,1280047983,US +1280047984,1280047991,CA +1280047992,1280047999,US +1280048000,1280048095,CA +1280048096,1280048103,US +1280048104,1280048119,CA +1280048120,1280048127,US +1280048128,1280048399,CA +1280048400,1280048407,US +1280048408,1280048423,CA +1280048424,1280048431,US +1280048432,1280048551,CA +1280048552,1280048559,US +1280048560,1280048591,CA +1280048592,1280048599,US +1280048600,1280048607,CA +1280048608,1280048623,US +1280048624,1280048631,NL +1280048632,1280048639,US +1280048640,1280048663,CA +1280048664,1280048679,US +1280048680,1280048703,CA +1280048704,1280048711,US +1280048712,1280048735,CA +1280048736,1280048815,US +1280048816,1280048823,CA +1280048824,1280048903,US +1280048904,1280048911,CA +1280048912,1280048919,FR +1280048920,1280048983,US +1280048984,1280048991,CA +1280048992,1280049007,US +1280049008,1280049063,CA +1280049064,1280049071,US +1280049072,1280049095,CA +1280049096,1280049127,US +1280049128,1280049151,CA +1280049152,1280073735,US +1280073736,1280073743,DE +1280073744,1280073759,US +1280073760,1280073767,CA +1280073768,1280073775,US +1280073776,1280073791,CA +1280073792,1280073799,CR +1280073800,1280073807,US +1280073808,1280073815,MY +1280073816,1280073823,CA +1280073824,1280073831,US +1280073832,1280073847,CA +1280073848,1280073855,LT +1280073856,1280073863,UA +1280073864,1280073879,US +1280073880,1280073887,CA +1280073888,1280073895,RU +1280073896,1280073903,US +1280073904,1280073911,CA +1280073912,1280073919,NL +1280073920,1280073935,CA +1280073936,1280073943,US +1280073944,1280073951,ZA +1280073952,1280073959,CR +1280073960,1280073967,FR +1280073968,1280073975,US +1280073976,1280073983,CA +1280073984,1280073999,US +1280074000,1280074007,BR +1280074008,1280074023,US +1280074024,1280074039,CA +1280074040,1280074047,US +1280074048,1280074055,HU +1280074056,1280074071,US +1280074072,1280074087,CA +1280074088,1280074095,US +1280074096,1280074103,IL +1280074104,1280074127,US +1280074128,1280074135,CA +1280074136,1280074143,CN +1280074144,1280074151,GB +1280074152,1280074159,CA +1280074160,1280074175,US +1280074176,1280074183,CA +1280074184,1280074199,US +1280074200,1280074207,MY +1280074208,1280074215,DE +1280074216,1280074223,US +1280074224,1280074231,CA +1280074232,1280074239,SG +1280074240,1280074247,GB +1280074248,1280074255,US +1280074256,1280074263,DE +1280074264,1280074271,FR +1280074272,1280074279,CA +1280074280,1280074287,US +1280074288,1280074295,CA +1280074296,1280074303,US +1280074304,1280074311,CA +1280074312,1280074319,RU +1280074320,1280074327,US +1280074328,1280074359,CA +1280074360,1280074375,US +1280074376,1280074383,CA +1280074384,1280074391,PA +1280074392,1280074399,US +1280074400,1280074415,CA +1280074416,1280074423,JP +1280074424,1280074431,CA +1280074432,1280074439,US +1280074440,1280074455,CA +1280074456,1280074463,US +1280074464,1280074479,CA +1280074480,1280074487,AU +1280074488,1280074495,PA +1280074496,1280074511,US +1280074512,1280074519,MY +1280074520,1280074527,CA +1280074528,1280074567,US +1280074568,1280074575,CA +1280074576,1280074583,NL +1280074584,1280074599,US +1280074600,1280074607,CA +1280074608,1280074615,US +1280074616,1280074623,CA +1280074624,1280074631,VG +1280074632,1280074639,CA +1280074640,1280074655,US +1280074656,1280074663,AU +1280074664,1280074671,CA +1280074672,1280074687,US +1280074688,1280074695,FR +1280074696,1280074703,CA +1280074704,1280074711,MY +1280074712,1280074719,CA +1280074720,1280074735,US +1280074736,1280074751,CA +1280074752,1280074759,US +1280074760,1280074767,RO +1280074768,1280074775,CA +1280074776,1280074783,AE +1280074784,1280074791,AU +1280074792,1280074799,US +1280074800,1280074807,NL +1280074808,1280074815,GB +1280074816,1280074823,CA +1280074824,1280074831,FR +1280074832,1280074839,IL +1280074840,1280074847,CO +1280074848,1280074855,IT +1280074856,1280074871,CA +1280074872,1280074887,US +1280074888,1280074895,CA +1280074896,1280074911,US +1280074912,1280074919,CA +1280074920,1280074935,US +1280074936,1280074943,GB +1280074944,1280074959,CA +1280074960,1280074967,US +1280074968,1280074975,CA +1280074976,1280074999,US +1280075000,1280075007,GI +1280075008,1280075015,US +1280075016,1280075039,CA +1280075040,1280075047,IE +1280075048,1280075055,NL +1280075056,1280075063,RU +1280075064,1280075071,IT +1280075072,1280075087,CA +1280075088,1280075095,US +1280075096,1280075103,CL +1280075104,1280075119,US +1280075120,1280075127,CA +1280075128,1280075135,MY +1280075136,1280075143,CA +1280075144,1280075151,US +1280075152,1280075159,MY +1280075160,1280075167,US +1280075168,1280075175,MY +1280075176,1280075183,CA +1280075184,1280075191,US +1280075192,1280075231,CA +1280075232,1280075239,NL +1280075240,1280075271,US +1280075272,1280075295,CA +1280075296,1280075303,US +1280075304,1280075327,CA +1280075328,1280075343,US +1280075344,1280075351,CA +1280075352,1280075359,MY +1280075360,1280075367,US +1280075368,1280075375,CA +1280075376,1280075383,US +1280075384,1280075391,CA +1280075392,1280075415,MY +1280075416,1280075423,US +1280075424,1280075439,CA +1280075440,1280075471,US +1280075472,1280075487,CA +1280075488,1280075495,CR +1280075496,1280075503,GB +1280075504,1280075511,CA +1280075512,1280075519,CN +1280075520,1280075527,PH +1280075528,1280075535,CA +1280075536,1280075543,IT +1280075544,1280075551,ZA +1280075552,1280075559,TR +1280075560,1280075567,AE +1280075568,1280075575,US +1280075576,1280075583,CA +1280075584,1280075615,US +1280075616,1280075623,GB +1280075624,1280075655,CA +1280075656,1280075679,US +1280075680,1280075687,MY +1280075688,1280075719,CA +1280075720,1280075727,US +1280075728,1280075759,CA +1280075760,1280075767,US +1280075768,1280075775,GB +1280075776,1280075783,US +1280075784,1280078711,CA +1280078712,1280078719,US +1280078720,1280078743,CA +1280078744,1280078751,US +1280078752,1280081919,CA +1280081920,1280090111,US +1280090112,1280091135,AI +1280091136,1280092159,VG +1280092160,1280093183,KN +1280093184,1280094207,VG +1280094208,1280095231,AI +1280095232,1280095487,KN +1280095488,1280097279,AG +1280097280,1280097791,LC +1280097792,1280098303,AG 1280098304,1280102399,PR -1280106496,1280110591,US -1280114688,1280118783,US -1280122880,1280131071,US +1280102400,1280131071,US 1280131072,1280139263,CA -1280139264,1280143359,US -1280147456,1280151551,US -1280155648,1280159743,US -1280163840,1280167935,US -1280172032,1280176127,US -1280180224,1280229375,US -1280245760,1285861375,US -1285865472,1285877759,US -1285881856,1287598079,US -1287602176,1291845631,US +1280139264,1287877503,US +1287877504,1287877567,UM +1287877568,1290252799,US +1290252800,1290252863,GB +1290252864,1291845631,US 1291845632,1292894207,DE 1292894208,1293156351,NO 1293156352,1293549567,DE @@ -10803,7 +24709,9 @@ 1294073856,1294204927,RU 1294204928,1294237695,RO 1294237696,1294270463,IR -1294270464,1294303231,DE +1294270464,1294278463,DE +1294278464,1294278495,CA +1294278496,1294303231,DE 1294303232,1294335999,RU 1294336000,1294368767,SI 1294368768,1294401535,LV @@ -10821,7 +24729,7 @@ 1294794752,1294827519,PL 1294827520,1294860287,RU 1294860288,1294893055,PL -1294893056,1294925823,CS +1294893056,1294925823,RS 1294925824,1294958591,DE 1294958592,1294991359,UA 1294991360,1294998527,CZ @@ -10856,73 +24764,146 @@ 1296237312,1296237567,US 1296237568,1296237823,NL 1296237824,1296238079,ES -1296238080,1296238591,GB +1296238080,1296238591,IL 1296238592,1296239103,NL 1296239104,1296239231,FR 1296239232,1296239359,NL 1296239360,1296239615,ES -1296239616,1296241151,BE +1296239616,1296240127,FR +1296240128,1296241151,BE 1296241152,1296241407,IT -1296241408,1296247807,NL +1296241408,1296242175,NL +1296242176,1296242303,DE +1296242304,1296242431,NL +1296242432,1296242687,BE +1296242688,1296243199,FR +1296243200,1296243455,GB +1296243456,1296244223,US +1296244224,1296244479,NL +1296244480,1296244735,GB +1296244736,1296244991,IR +1296244992,1296245247,CH +1296245248,1296245503,CA +1296245504,1296245759,NL +1296245760,1296246783,ES +1296246784,1296247295,NL +1296247296,1296247807,FR 1296247808,1296247871,US -1296247872,1296247935,FR -1296247936,1296247999,BE +1296247872,1296247999,FR 1296248000,1296248063,IE -1296248064,1296249855,NL +1296248064,1296248127,FR +1296248128,1296248255,IE +1296248256,1296248318,BE +1296248319,1296248319,FR +1296248320,1296248383,BE +1296248384,1296248447,FR +1296248448,1296248575,US +1296248576,1296248703,IE +1296248704,1296249855,FR 1296249856,1296249887,US -1296249888,1296249919,FR -1296249920,1296249951,BE +1296249888,1296249951,FR 1296249952,1296250015,DE 1296250016,1296250047,IL 1296250048,1296250079,IE 1296250080,1296250111,IL 1296250112,1296250143,IE -1296250144,1296251263,NL -1296251264,1296251295,DE +1296250144,1296250175,GB +1296250176,1296250207,BE +1296250208,1296250239,ES +1296250240,1296250271,BE +1296250272,1296250303,DE +1296250304,1296251135,FR +1296251136,1296251167,GB +1296251168,1296251199,HR +1296251200,1296251295,DE 1296251296,1296251327,BE 1296251328,1296251359,IE 1296251360,1296251391,DE -1296251392,1296252287,NL -1296252288,1296252303,FR +1296251392,1296251775,NL +1296251776,1296252127,FR +1296252128,1296252143,ES +1296252144,1296252159,US +1296252160,1296252175,GB +1296252176,1296252191,PL +1296252192,1296252207,RO +1296252208,1296252223,BG +1296252224,1296252239,GB +1296252240,1296252255,IT +1296252256,1296252271,GB +1296252272,1296252303,FR 1296252304,1296252319,IL -1296252320,1296252335,IE -1296252336,1296252351,FR -1296252352,1296252367,GB +1296252320,1296252367,FR 1296252368,1296252383,DE 1296252384,1296252415,IE -1296252416,1296252879,NL +1296252416,1296252703,FR +1296252704,1296252711,DE +1296252712,1296252719,FR +1296252720,1296252727,BE +1296252728,1296252735,IL +1296252736,1296252739,FR +1296252740,1296252743,IM +1296252744,1296252759,FR +1296252760,1296252791,DE +1296252792,1296252799,IE +1296252800,1296252839,GB +1296252840,1296252847,DE +1296252848,1296252855,GB +1296252856,1296252871,IE +1296252872,1296252879,BE 1296252880,1296252887,DE 1296252888,1296252895,IE 1296252896,1296252911,BE -1296252912,1296252919,MU +1296252912,1296252919,FR 1296252920,1296252927,PL -1296252928,1296253439,DE -1296253440,1296253767,NL -1296253768,1296253775,DE -1296253776,1296253951,NL -1296253952,1296254207,DE -1296254208,1296259071,NL -1296259072,1296259839,US +1296252928,1296255743,DE +1296255744,1296255999,FR +1296256000,1296257023,DE +1296257024,1296257535,US +1296257536,1296257791,DE +1296257792,1296258047,US +1296258048,1296258303,TW +1296258304,1296259071,NL +1296259072,1296259583,US +1296259584,1296259839,FR 1296259840,1296260351,NL 1296260352,1296260607,US -1296260608,1296261119,NL -1296261120,1296262911,US -1296262912,1296263167,NL -1296263168,1296263935,US -1296263936,1296263943,NL -1296263944,1296263967,US -1296263968,1296264191,NL +1296260608,1296262143,FR +1296262144,1296262655,US +1296262656,1296262911,CA +1296262912,1296263935,US +1296263936,1296263943,FR +1296263944,1296263999,US +1296264000,1296264015,FR +1296264016,1296264023,US +1296264024,1296264027,DE +1296264028,1296264031,FR +1296264032,1296264035,IM +1296264036,1296264039,FR +1296264040,1296264047,US +1296264048,1296264063,FR +1296264064,1296264151,GB +1296264152,1296264191,FR 1296264192,1296264223,US 1296264224,1296264239,IE -1296264240,1296264703,NL -1296264704,1296264959,US -1296264960,1296265151,NL +1296264240,1296264271,FR +1296264272,1296264303,US +1296264304,1296264319,CA +1296264320,1296264399,US +1296264400,1296264447,FR +1296264448,1296264543,US +1296264544,1296264639,CA +1296264640,1296264671,US +1296264672,1296264703,FR +1296264704,1296265023,US +1296265024,1296265087,FR +1296265088,1296265151,CA 1296265152,1296265215,FR -1296265216,1296265471,NL -1296265472,1296265727,US -1296265728,1296265983,NL -1296265984,1296268799,US -1296268800,1296269311,FR +1296265216,1296267263,US +1296267264,1296267519,FR +1296267520,1296267775,CA +1296267776,1296268799,US +1296268800,1296269055,FR +1296269056,1296269311,US 1296269312,1296302079,TR 1296302080,1296334847,GB 1296334848,1296367615,DK @@ -10930,29 +24911,41 @@ 1296400384,1296433151,BH 1296433152,1296465919,BG 1296465920,1296466239,NG -1296466240,1296466431,NO -1296466432,1296466559,CG -1296466560,1296466687,NO -1296466688,1296466815,NG -1296466816,1296466943,NO -1296466944,1296467455,ZM -1296467456,1296467967,NO -1296467968,1296468223,NE -1296468224,1296468351,NG -1296468352,1296468479,NO -1296468480,1296468991,NG -1296468992,1296469503,NO -1296469504,1296469759,ZM -1296469760,1296470015,NO -1296470016,1296470351,TZ -1296470352,1296470367,NO -1296470368,1296470383,TZ -1296470384,1296470463,NO -1296470464,1296470527,TZ -1296470528,1296473087,NO -1296473088,1296474111,LT -1296474112,1296474367,ZM -1296474368,1296498687,LT +1296466240,1296466303,NO +1296466304,1296466335,BF +1296466336,1296466367,NO +1296466368,1296466383,AO +1296466384,1296466399,NO +1296466400,1296466415,AO +1296466416,1296466431,NG +1296466432,1296466559,NO +1296466560,1296466583,NG +1296466584,1296466591,NO +1296466592,1296466623,NG +1296466624,1296466639,NO +1296466640,1296466655,NG +1296466656,1296466671,BJ +1296466672,1296466679,NG +1296466680,1296466687,NO +1296466688,1296466719,BJ +1296466720,1296466751,NO +1296466752,1296466759,ML +1296466760,1296466767,SL +1296466768,1296466775,BF +1296466776,1296466783,GN +1296466784,1296467711,NO +1296467712,1296467967,NG +1296467968,1296468479,NO +1296468480,1296469247,NG +1296469248,1296472351,NO +1296472352,1296472383,NG +1296472384,1296472415,BI +1296472416,1296473087,NO +1296473088,1296474623,LT +1296474624,1296476159,US +1296476160,1296480255,LT +1296480256,1296481791,NO +1296481792,1296498687,LT 1296498688,1296531455,BG 1296531456,1296564223,MT 1296564224,1296566271,GB @@ -10970,14 +24963,18 @@ 1296590848,1296592895,ES 1296592896,1296594943,NL 1296594944,1296596991,RU -1296596992,1296599039,GB 1296599040,1296601087,RU 1296601088,1296603135,DE 1296603136,1296605183,NL -1296605184,1296607231,AT -1296607232,1296608255,NL -1296608256,1296608767,CH -1296608768,1296609279,NL +1296605184,1296606271,AT +1296606272,1296606335,DE +1296606336,1296606367,AT +1296606368,1296606399,CH +1296606400,1296607231,AT +1296607232,1296607743,DE +1296607744,1296607999,NL +1296608000,1296609023,CH +1296609024,1296609279,NL 1296609280,1296611327,CH 1296611328,1296613375,TR 1296613376,1296615423,IT @@ -10987,11 +24984,10 @@ 1296621568,1296623615,SE 1296623616,1296625663,BE 1296625664,1296629759,RU -1296629760,1296631807,NO -1296631808,1296633855,GB +1296629760,1296633855,GB 1296633856,1296635903,NL 1296635904,1296637951,RU -1296637952,1296639999,GB +1296637952,1296639999,CH 1296640000,1296642047,ES 1296642048,1296644095,RU 1296644096,1296646143,IT @@ -11002,75 +24998,57 @@ 1296654336,1296656383,BE 1296656384,1296658431,RU 1296658432,1296662527,GB -1296662528,1296666623,RU +1296662528,1296664575,KZ +1296664576,1296666623,RU 1296666624,1296670719,GB 1296670720,1296672767,ES -1296672768,1296674815,IT +1296672768,1296674815,GB 1296674816,1296676863,BE -1296676864,1296677167,NG -1296677168,1296677183,JE -1296677184,1296677199,NG -1296677200,1296677231,JE -1296677232,1296677263,NG -1296677264,1296677287,JE -1296677288,1296677295,NG -1296677296,1296677319,JE -1296677320,1296677335,NG -1296677336,1296677375,JE -1296677376,1296677391,NG -1296677392,1296677447,JE -1296677448,1296677495,NG -1296677496,1296677519,JE -1296677520,1296677535,NG -1296677536,1296677551,JE -1296677552,1296677567,NG -1296677568,1296677575,JE -1296677576,1296677591,NG -1296677592,1296677607,JE -1296677608,1296677631,NG -1296677632,1296677663,JE -1296677664,1296677671,NG -1296677672,1296677679,JE -1296677680,1296677703,NG -1296677704,1296677719,JE +1296676864,1296677271,NG +1296677272,1296677287,A2 +1296677288,1296677311,NG +1296677312,1296677319,A2 +1296677320,1296677343,NG +1296677344,1296677351,A2 +1296677352,1296677367,NG +1296677368,1296677375,US +1296677376,1296677511,NG +1296677512,1296677519,A2 +1296677520,1296677591,NG +1296677592,1296677599,A2 +1296677600,1296677703,NG +1296677704,1296677719,A2 1296677720,1296677735,NG -1296677736,1296677759,JE -1296677760,1296677767,NG -1296677768,1296677799,JE -1296677800,1296677839,NG -1296677840,1296677847,JE -1296677848,1296677855,NG -1296677856,1296677871,JE -1296677872,1296677887,NG -1296677888,1296677895,JE -1296677896,1296677927,NG -1296677928,1296677935,JE -1296677936,1296677951,NG -1296677952,1296677967,JE +1296677736,1296677751,A2 +1296677752,1296677767,NG +1296677768,1296677775,A2 +1296677776,1296677959,NG +1296677960,1296677967,A2 1296677968,1296677991,NG -1296677992,1296678015,JE -1296678016,1296678023,NG -1296678024,1296678239,JE -1296678240,1296678247,NG -1296678248,1296678255,JE -1296678256,1296678303,NG -1296678304,1296678311,JE -1296678312,1296678319,NG -1296678320,1296678367,JE -1296678368,1296678383,NG -1296678384,1296678399,JE -1296678400,1296678407,NG -1296678408,1296678415,JE -1296678416,1296678431,US -1296678432,1296678655,JE -1296678656,1296678695,NG -1296678696,1296678703,JE -1296678704,1296678711,NG -1296678712,1296678719,JE -1296678720,1296678735,NG -1296678736,1296678759,JE -1296678760,1296678775,NG -1296678776,1296678911,JE +1296677992,1296678015,A2 +1296678016,1296678047,NG +1296678048,1296678079,A2 +1296678080,1296678119,NG +1296678120,1296678143,A2 +1296678144,1296678151,NG +1296678152,1296678159,A2 +1296678160,1296678215,NG +1296678216,1296678223,A2 +1296678224,1296678319,NG +1296678320,1296678327,A2 +1296678328,1296678351,NG +1296678352,1296678367,A2 +1296678368,1296678415,NG +1296678416,1296678431,A2 +1296678432,1296678447,NG +1296678448,1296678463,A2 +1296678464,1296678471,NG +1296678472,1296678479,A2 +1296678480,1296678775,NG +1296678776,1296678791,A2 +1296678792,1296678831,NG +1296678832,1296678839,A2 +1296678840,1296678911,NG 1296678912,1296680959,SA 1296680960,1296683007,ES 1296683008,1296685055,IE @@ -11085,14 +25063,16 @@ 1296701440,1296703487,RU 1296703488,1296705535,BY 1296705536,1296707583,GE -1296707584,1296709631,NL +1296707584,1296708039,NL +1296708040,1296708047,AE +1296708048,1296709631,NL 1296709632,1296711679,CY 1296711680,1296713727,KZ 1296713728,1296715775,RU -1296715776,1296717823,AT +1296715776,1296717823,CH 1296717824,1296719871,BE 1296719872,1296721919,CH -1296721920,1296723967,DE +1296721920,1296723967,GB 1296723968,1296726015,AT 1296726016,1296728063,GB 1296728064,1296730111,SE @@ -11116,13 +25096,11 @@ 1296758784,1296760831,RS 1296760832,1296762879,GB 1296762880,1296764927,RU -1296764928,1296766975,AT -1296766976,1296767231,GB -1296767232,1296767375,NL -1296767376,1296769023,GB +1296764928,1296769023,AT 1296769024,1296771071,TR 1296771072,1296773119,LT 1296773120,1296774367,FR +1296774368,1296775167,EU 1296775168,1296779263,FR 1296779264,1296781311,CZ 1296781312,1296783359,DK @@ -11158,11 +25136,24 @@ 1296957440,1296973823,BG 1296973824,1296990207,CZ 1296990208,1297006591,BG -1297006592,1297022975,BA +1297006592,1297018623,BA +1297018624,1297019135,MD +1297019136,1297020927,BA +1297020928,1297021183,RS +1297021184,1297021439,MD +1297021440,1297022207,BA +1297022208,1297022463,MD +1297022464,1297022975,BA 1297022976,1297039359,LT 1297039360,1297055743,TR 1297055744,1297072127,RU -1297072128,1297088511,PL +1297072128,1297074743,PL +1297074744,1297074751,SE +1297074752,1297083375,PL +1297083376,1297083391,SE +1297083392,1297088511,PL +1297088512,1297121279,AT +1297121280,1297154047,SE 1297154048,1297219583,RO 1297219584,1297285119,RU 1297285120,1297350655,GR @@ -11174,13 +25165,12 @@ 1297549312,1297551359,LT 1297551360,1297553407,SA 1297553408,1297555455,IE -1297555456,1297557503,UA -1297557504,1297559551,BE +1297555456,1297559551,UA 1297559552,1297561599,DE 1297561600,1297563647,NL 1297563648,1297565695,RU 1297565696,1297567743,PL -1297567744,1297569791,UA +1297567744,1297569791,RU 1297569792,1297571839,RO 1297571840,1297573887,RU 1297573888,1297575935,FR @@ -11197,7 +25187,7 @@ 1297598464,1297602559,RU 1297602560,1297604607,PL 1297604608,1297606655,DE -1297606656,1297608703,CZ +1297606656,1297610751,CZ 1297610752,1297612799,DE 1297612800,1297629183,RU 1297629184,1297645567,NO @@ -11218,19 +25208,24 @@ 1297860608,1297862655,PT 1297862656,1297864703,FI 1297864704,1297866751,SE -1297866752,1297867687,RU +1297866752,1297867583,RU +1297867584,1297867647,SC +1297867648,1297867687,RU 1297867688,1297867695,CY -1297867696,1297868607,RU -1297868608,1297868671,CY -1297868672,1297868799,RU +1297867696,1297867871,RU +1297867872,1297867879,ES +1297867880,1297868799,RU 1297868800,1297870847,DE 1297870848,1297872895,FR 1297872896,1297874943,GB -1297874944,1297883135,CY -1297883136,1297891327,IT -1297891328,1297897471,GB -1297897472,1297897983,RU -1297897984,1297899519,GB +1297874944,1297875487,CY +1297875488,1297875503,TR +1297875504,1297875536,CY +1297875537,1297875551,TR +1297875552,1297879040,CY +1297879041,1297883135,TR +1297883136,1297891327,PL +1297891328,1297899519,GB 1297899520,1297915903,TR 1297915904,1297924095,BH 1297924096,1297932287,CZ @@ -11250,11 +25245,17 @@ 1298014720,1298014975,RU 1298014976,1298015231,LT 1298015232,1298015487,RU -1298015488,1298016767,LB -1298016768,1298017279,RU -1298017280,1298018303,KG +1298015488,1298015743,LB +1298015744,1298015999,IQ +1298016000,1298016511,LB +1298016512,1298017023,RU +1298017024,1298017791,BY +1298017792,1298018303,RU 1298018304,1298018559,TM -1298018560,1298022399,RU +1298018560,1298019327,RU +1298019328,1298019839,LT +1298019840,1298020351,RU +1298020352,1298022399,BY 1298022400,1298030591,IT 1298030592,1298038783,RU 1298038784,1298046975,SI @@ -11264,7 +25265,8 @@ 1298067456,1298071551,NL 1298071552,1298073599,TJ 1298073600,1298075647,RU -1298075648,1298077695,CY +1298075648,1298076671,CY +1298076672,1298077695,US 1298077696,1298079743,DE 1298079744,1298081791,GB 1298081792,1298083839,CZ @@ -11277,7 +25279,9 @@ 1298096128,1298098175,NL 1298098176,1298100223,SE 1298100224,1298102271,GB -1298102272,1298104319,CH +1298102272,1298102687,CH +1298102688,1298102703,LV +1298102704,1298104319,CH 1298104320,1298106367,RU 1298106368,1298108415,IT 1298108416,1298110463,FI @@ -11289,15 +25293,17 @@ 1298120704,1298122751,CZ 1298122752,1298124799,RU 1298124800,1298126847,IT -1298126848,1298128895,SA +1298126848,1298127615,SA +1298127616,1298128127,IR +1298128128,1298128895,SA 1298128896,1298130943,FR 1298130944,1298132991,BG 1298132992,1298135039,FI 1298135040,1298137087,NL 1298137088,1298661375,GB 1298661376,1298677759,FR -1298677760,1298694143,IE -1298694144,1298710527,HR +1298677760,1298694143,IR +1298694144,1298710527,RO 1298710528,1298726911,CZ 1298726912,1298743295,RS 1298743296,1298759679,FI @@ -11314,39 +25320,64 @@ 1298956288,1298972671,GB 1298972672,1298989055,RU 1298989056,1299005439,UA -1299005440,1299013631,NL -1299013632,1299021823,BE -1299021824,1299038207,CH +1299005440,1299005695,RU +1299005696,1299005951,BE +1299005952,1299008511,NL +1299008512,1299009791,BE +1299009792,1299010047,NL +1299010048,1299010815,BE +1299010816,1299011071,RU +1299011072,1299011327,BE +1299011328,1299011583,RU +1299011584,1299011839,FR +1299011840,1299012095,DE +1299012096,1299012607,BE +1299012608,1299013119,GB +1299013120,1299013375,FR +1299013376,1299013631,DE +1299013632,1299015679,BE +1299015680,1299016703,NL +1299016704,1299016959,BE +1299016960,1299017215,NL +1299017216,1299017727,RU +1299017728,1299021823,BE +1299021824,1299026111,CH +1299026112,1299026127,ES +1299026128,1299032063,CH +1299032064,1299032319,NL +1299032320,1299038207,CH 1299038208,1299054591,FI 1299054592,1299070975,SE -1299070976,1299087359,SA +1299070976,1299075071,SA +1299075072,1299087359,LB 1299087360,1299103743,HU 1299103744,1299120127,NO 1299120128,1299136511,SI 1299136512,1299169279,HU 1299169280,1299174399,FR -1299174400,1299176447,GB -1299176448,1299177471,FR -1299177472,1299179519,DE -1299179520,1299185663,FR +1299174400,1299176959,GB +1299176960,1299177471,FR +1299177472,1299180031,DE +1299180032,1299185663,FR 1299185664,1299447807,PL 1299447808,1299709951,AT 1299709952,1299972095,UA 1299972096,1300234239,IL -1300234240,1302331391,DE 1302331392,1303379967,NL 1303379968,1304428543,DE 1304428544,1305477119,FR 1305477120,1305739263,ES 1305739264,1306001407,DK -1306001408,1306263551,FR +1306001408,1306132479,RU +1306132480,1306263551,SE 1306263552,1306271743,KE 1306271744,1306279935,RU 1306279936,1306286079,IT -1306286080,1306287103,CH -1306287104,1306288127,IT +1306286080,1306288127,CH 1306288128,1306296319,AT -1306296320,1306312703,RU +1306296320,1306311143,RU +1306311144,1306311151,CH +1306311152,1306312703,RU 1306312704,1306320895,UZ 1306320896,1306329087,DE 1306329088,1306337279,BA @@ -11371,9 +25402,10 @@ 1306501120,1306509311,NO 1306509312,1306525695,PL 1306525696,1307049983,ES -1307049984,1307058175,RU -1307058176,1307066367,BA -1307069696,1307069791,DE +1307049984,1307066367,RU +1307066368,1307069695,EU +1307069696,1307069919,DE +1307069920,1307074559,EU 1307074560,1307082751,SA 1307082752,1307090943,RU 1307090944,1307099135,GB @@ -11412,7 +25444,9 @@ 1307361280,1307369471,CZ 1307369472,1307377663,RU 1307377664,1307385855,PL -1307385856,1307394047,AT +1307385856,1307393919,AT +1307393920,1307393983,CZ +1307393984,1307394047,AT 1307394048,1307402239,IR 1307402240,1307410431,HR 1307410432,1307418623,CZ @@ -11421,8 +25455,10 @@ 1307435008,1307443199,DE 1307443200,1307451391,IT 1307451392,1307459583,SE -1307459584,1307484159,RU -1307484160,1307491327,GB +1307467776,1307484159,RU +1307484160,1307488767,GB +1307488768,1307489023,IE +1307489024,1307491327,GB 1307491328,1307491839,IE 1307491840,1307492351,GB 1307492352,1307500543,BA @@ -11448,11 +25484,21 @@ 1307623424,1307627519,FR 1307627520,1307631615,SE 1307631616,1307635711,IT -1307635712,1307636991,EE -1307636992,1307637031,LV -1307637032,1307638015,EE -1307638016,1307638095,LT -1307638096,1307639807,EE +1307635712,1307636735,EE +1307636736,1307636807,LV +1307636808,1307636815,EE +1307636816,1307636847,LV +1307636848,1307636863,EE +1307636864,1307637359,LV +1307637360,1307637367,EE +1307637368,1307637383,LV +1307637384,1307637407,EE +1307637408,1307637471,LV +1307637472,1307637491,EE +1307637492,1307637751,LV +1307637752,1307637759,EE +1307637760,1307639791,LT +1307639792,1307639807,EE 1307639808,1307643903,IT 1307643904,1307652095,RU 1307652096,1307656191,ES @@ -11460,8 +25506,7 @@ 1307660288,1307662335,BE 1307662336,1307662351,NL 1307662352,1307662359,GB -1307662360,1307662360,BE -1307662361,1307662367,FR +1307662360,1307662367,FR 1307662368,1307664383,BE 1307664384,1307668479,NO 1307668480,1307672575,ES @@ -11486,12 +25531,26 @@ 1307746304,1307750399,UA 1307750400,1307754495,IT 1307754496,1307755519,US -1307755520,1307758591,GB +1307755520,1307756031,GB +1307756032,1307756287,US +1307756288,1307756431,GB +1307756432,1307756447,FR +1307756448,1307756543,GB +1307756544,1307756847,FR +1307756848,1307756863,US +1307756864,1307756903,FR +1307756904,1307756911,US +1307756912,1307757063,FR +1307757064,1307757071,US +1307757072,1307757183,FR +1307757184,1307757247,US +1307757248,1307757567,FR +1307757568,1307758591,GB 1307758592,1307762687,SM 1307762688,1307766783,PL 1307766784,1307770879,GB 1307770880,1307774975,RU -1307774976,1307779071,CS +1307774976,1307779071,RS 1307779072,1307787263,DK 1307787264,1307791359,MT 1307791360,1307795455,KZ @@ -11500,6 +25559,7 @@ 1307807744,1307811839,SE 1307811840,1307815935,NL 1307815936,1307819791,BE +1307819792,1307820031,EU 1307820032,1307824127,ES 1307824128,1307828223,HU 1307828224,1307832319,NL @@ -11510,27 +25570,54 @@ 1307848704,1307852799,CH 1307852800,1307856895,RU 1307856896,1307860991,IT -1307860992,1307865087,DE +1307860992,1307861119,DE +1307861120,1307861123,LU +1307861124,1307861127,A2 +1307861128,1307861151,DE +1307861152,1307861155,LU +1307861156,1307861919,DE +1307861920,1307861935,LU +1307861936,1307864127,DE +1307864128,1307864135,LU +1307864136,1307864143,DE +1307864144,1307864147,A2 +1307864148,1307864467,DE +1307864468,1307864471,LU +1307864472,1307864479,DE +1307864480,1307864495,LU +1307864496,1307865087,DE 1307865088,1307869183,AZ 1307869184,1307873279,GB 1307873280,1307877375,TJ 1307877376,1307881471,RU 1307881472,1307885567,IT -1307885568,1307886095,DK -1307886096,1307886103,SE -1307886104,1307889663,DK +1307885568,1307886975,DK +1307886976,1307887103,SE +1307887104,1307889663,DK 1307889664,1307893759,RU 1307893760,1307897855,SE -1307897856,1307898047,AT -1307898048,1307898079,AE -1307898080,1307898575,AT -1307898576,1307898591,AE -1307898592,1307901951,AT +1307897856,1307901951,AT 1307901952,1307906047,JO -1307906048,1307910143,CH +1307906048,1307906599,CH +1307906600,1307906607,DK +1307906608,1307906943,CH +1307906944,1307907071,IM +1307907072,1307907199,CH +1307907200,1307907327,IM +1307907328,1307910143,CH 1307910144,1307914239,DE 1307914240,1307918335,NL -1307918336,1307922431,GB +1307918336,1307919439,GB +1307919440,1307919447,ES +1307919448,1307919503,GB +1307919504,1307919511,ES +1307919512,1307919699,GB +1307919700,1307919703,ZA +1307919704,1307920575,GB +1307920576,1307920583,AU +1307920584,1307921471,GB +1307921472,1307921535,ES +1307921536,1307922431,GB 1307922432,1307926527,NL 1307926528,1307930623,KZ 1307930624,1307934719,RU @@ -11542,9 +25629,10 @@ 1307959296,1307963391,IR 1307963392,1307967487,PL 1307967488,1307971583,IT -1307971584,1307980799,GB -1307980800,1307981823,ZW -1307981824,1307983871,GB +1307971584,1307979775,GB +1307979776,1307981823,ZW +1307981824,1307982847,ZA +1307982848,1307983871,GB 1307983872,1307987967,LB 1307987968,1307992063,FR 1307992064,1307996159,RU @@ -11556,7 +25644,17 @@ 1308016640,1308020735,FI 1308020736,1308024831,BG 1308024832,1308033023,RU -1308033024,1308037119,DE +1308033024,1308033279,NL +1308033280,1308033535,FR +1308033536,1308033791,DE +1308033792,1308034047,IT +1308034048,1308034559,DE +1308034560,1308034815,CZ +1308034816,1308035327,DE +1308035328,1308035583,GB +1308035584,1308035839,AE +1308035840,1308036095,GB +1308036096,1308037119,DE 1308037120,1308041215,UA 1308041216,1308049407,RU 1308049408,1308053503,DK @@ -11565,11 +25663,11 @@ 1308061696,1308069887,RU 1308069888,1308073983,NO 1308073984,1308078079,RU -1308078080,1308078599,NL -1308078600,1308078601,RU -1308078602,1308078605,NL -1308078606,1308078607,PL -1308078608,1308080127,NL +1308078080,1308078263,NL +1308078264,1308078267,SE +1308078268,1308078879,NL +1308078880,1308078911,FR +1308078912,1308080127,NL 1308080128,1308082175,RU 1308082176,1308084223,GB 1308084224,1308086271,RS @@ -11591,13 +25689,17 @@ 1310197760,1310199807,CZ 1310199808,1310201855,IE 1310201856,1310203903,RU -1310203904,1310204159,BE -1310204160,1310204191,FR +1310203904,1310204191,FR 1310204192,1310204255,BE -1310204256,1310204271,FR -1310204272,1310204695,BE -1310204696,1310204707,FR -1310204708,1310205951,BE +1310204256,1310204287,FR +1310204288,1310204321,BE +1310204322,1310204415,FR +1310204416,1310204671,BE +1310204672,1310204675,FR +1310204676,1310204687,BE +1310204688,1310204707,FR +1310204708,1310204715,BE +1310204716,1310205951,FR 1310205952,1310207999,RU 1310208000,1310210047,MD 1310210048,1310212095,RU @@ -11613,7 +25715,7 @@ 1310230528,1310232575,ES 1310232576,1310234623,NO 1310234624,1310236671,RU -1310236672,1310238719,KZ +1310236672,1310238719,PL 1310238720,1310240767,BE 1310240768,1310242815,RU 1310242816,1310244863,HU @@ -11626,42 +25728,43 @@ 1310246992,1310247007,NL 1310247008,1310247023,GB 1310247024,1310247039,GR -1310247040,1310247055,TR -1310247056,1310247071,SE -1310247072,1310247087,NO +1310247040,1310247055,CL +1310247056,1310247071,BE +1310247072,1310247087,MX 1310247088,1310247103,AR 1310247104,1310247119,PL 1310247120,1310247135,IE -1310247136,1310247151,DK +1310247136,1310247151,CH 1310247152,1310247167,RU -1310247168,1310247183,IL +1310247168,1310247183,BE 1310247184,1310247199,BR 1310247200,1310247215,CZ -1310247216,1310247231,BG -1310247232,1310247247,RO +1310247216,1310247231,HK +1310247232,1310247247,LU 1310247248,1310247263,CN -1310247264,1310247279,LT -1310247280,1310247295,CY +1310247264,1310247279,PH +1310247280,1310247295,CH 1310247296,1310247311,JP -1310247312,1310247327,HU +1310247312,1310247327,PE 1310247328,1310247343,DE -1310247344,1310247359,FI -1310247360,1310247375,LV +1310247344,1310247359,CA +1310247360,1310247375,CR 1310247376,1310247391,IN 1310247392,1310247407,US 1310247408,1310247423,CA -1310247424,1310247431,IL +1310247424,1310247431,BE 1310247432,1310247439,BR 1310247440,1310247447,CZ -1310247448,1310247463,BG +1310247448,1310247455,HK +1310247456,1310247463,LU 1310247464,1310247471,CN -1310247472,1310247479,LT -1310247480,1310247487,CY +1310247472,1310247479,PH +1310247480,1310247487,CH 1310247488,1310247495,JP -1310247496,1310247503,HU +1310247496,1310247503,PE 1310247504,1310247511,DE -1310247512,1310247519,FI -1310247520,1310247527,LV +1310247512,1310247519,CA +1310247520,1310247527,CR 1310247528,1310247535,IN 1310247536,1310247543,US 1310247544,1310247551,CA @@ -11673,27 +25776,27 @@ 1310247592,1310247599,NL 1310247600,1310247607,GB 1310247608,1310247615,GR -1310247616,1310247623,TR -1310247624,1310247631,SE -1310247632,1310247639,NO +1310247616,1310247623,CL +1310247624,1310247631,BE +1310247632,1310247639,MX 1310247640,1310247647,AR 1310247648,1310247655,PL 1310247656,1310247663,IE -1310247664,1310247671,DK +1310247664,1310247671,CH 1310247672,1310247679,RU -1310247680,1310247687,IL +1310247680,1310247687,BE 1310247688,1310247695,BR 1310247696,1310247703,CZ -1310247704,1310247711,BG -1310247712,1310247719,RO +1310247704,1310247711,HK +1310247712,1310247719,LU 1310247720,1310247727,CN -1310247728,1310247735,LT -1310247736,1310247743,CY +1310247728,1310247735,PH +1310247736,1310247743,CH 1310247744,1310247751,JP -1310247752,1310247759,HU +1310247752,1310247759,PE 1310247760,1310247767,DE -1310247768,1310247775,FI -1310247776,1310247783,LV +1310247768,1310247775,CA +1310247776,1310247783,CR 1310247784,1310247791,IN 1310247792,1310247799,US 1310247800,1310247807,CA @@ -11705,26 +25808,57 @@ 1310247848,1310247855,NL 1310247856,1310247863,GB 1310247864,1310247871,GR -1310247872,1310247879,TR -1310247880,1310247887,SE -1310247888,1310247895,NO +1310247872,1310247879,CL +1310247880,1310247887,BE +1310247888,1310247895,MX 1310247896,1310247903,AR 1310247904,1310247911,PL 1310247912,1310247919,IE -1310247920,1310247927,DK +1310247920,1310247927,CH 1310247928,1310247935,RU -1310247936,1310248447,FR -1310248448,1310248455,IL +1310247936,1310247951,TR +1310247952,1310247967,SE +1310247968,1310247983,NO +1310247984,1310247999,DK +1310248000,1310248015,LV +1310248016,1310248031,BG +1310248032,1310248047,UA +1310248048,1310248063,CH +1310248064,1310248079,ZA +1310248080,1310248095,LU +1310248096,1310248111,UY +1310248112,1310248127,PA +1310248128,1310248143,MY +1310248144,1310248159,CO +1310248160,1310248175,SG +1310248176,1310248191,US +1310248192,1310248207,RO +1310248208,1310248223,LT +1310248224,1310248239,BO +1310248240,1310248255,HU +1310248256,1310248271,FI +1310248272,1310248287,IL +1310248288,1310248303,AU +1310248304,1310248319,NZ +1310248320,1310248335,VE +1310248336,1310248351,CR +1310248352,1310248367,MA +1310248368,1310248383,ID +1310248384,1310248399,SK +1310248400,1310248415,TW +1310248416,1310248431,PA +1310248432,1310248447,US +1310248448,1310248455,BE 1310248456,1310248463,BR 1310248464,1310248487,FR 1310248488,1310248495,CN 1310248496,1310248503,FR -1310248504,1310248511,CY +1310248504,1310248511,CH 1310248512,1310248519,JP -1310248520,1310248527,HU +1310248520,1310248527,PE 1310248528,1310248535,DE -1310248536,1310248543,FI -1310248544,1310248551,LV +1310248536,1310248543,CA +1310248544,1310248551,CR 1310248552,1310248559,IN 1310248560,1310248567,US 1310248568,1310248575,CA @@ -11736,24 +25870,26 @@ 1310248616,1310248623,NL 1310248624,1310248631,GB 1310248632,1310248639,GR -1310248640,1310248647,TR -1310248648,1310248655,SE -1310248656,1310248663,NO +1310248640,1310248647,CL +1310248648,1310248655,BE +1310248656,1310248663,MX 1310248664,1310248671,AR 1310248672,1310248679,PL 1310248680,1310248687,IE -1310248688,1310248695,DK +1310248688,1310248695,CH 1310248696,1310248703,RU -1310248704,1310248959,FR +1310248704,1310248959,CH 1310248960,1310249215,IM 1310249216,1310249279,GB -1310249280,1310250495,IM +1310249280,1310249775,IM +1310249776,1310249799,GG +1310249800,1310250111,IM +1310250112,1310250143,GG +1310250144,1310250495,IM 1310250496,1310251007,MT -1310251008,1310253055,LU -1310253056,1310255103,RU +1310251008,1310255103,RU 1310255104,1310257151,CZ 1310257152,1310259199,FR -1310259200,1310261247,DE 1310261248,1310277631,UA 1310277632,1310310399,RU 1310310400,1310326783,GB @@ -11762,7 +25898,7 @@ 1310359552,1310392319,UA 1310392320,1310408703,NL 1310408704,1310425087,FI -1310441472,1310457855,UA +1310425088,1310457855,UA 1310457856,1310474239,PL 1310474240,1310490623,EE 1310490624,1310507007,BA @@ -11794,8 +25930,8 @@ 1310689280,1310695423,PL 1310695424,1310697471,RO 1310697472,1310699519,DE -1310699520,1310707711,UA -1310707712,1310711807,RU +1310699520,1310705663,UA +1310705664,1310711807,RU 1310711808,1310713855,LT 1310713856,1310715903,UA 1310715904,1310717951,RU @@ -11808,11 +25944,19 @@ 1311246336,1311248383,IT 1311248384,1311250431,GB 1311250432,1311252479,RU -1311252480,1311256575,GB +1311252480,1311254527,GB +1311254528,1311256575,SE 1311256576,1311258623,FR 1311258624,1311262719,GB 1311262720,1311262975,FR -1311262976,1311264767,CH +1311262976,1311263247,CH +1311263248,1311263263,FR +1311263264,1311263359,CH +1311263360,1311263375,FR +1311263376,1311263407,CH +1311263408,1311263423,BE +1311263424,1311263615,CH +1311263616,1311264767,FR 1311264768,1311266815,RU 1311266816,1311268863,FR 1311268864,1311270911,BE @@ -11827,7 +25971,8 @@ 1311291392,1311293439,RU 1311293440,1311295487,NL 1311295488,1311297535,IT -1311297536,1311299583,AT +1311297536,1311298815,EU +1311298816,1311299583,AT 1311299584,1311301631,RU 1311301632,1311303679,TR 1311303680,1311307775,GB @@ -11844,25 +25989,24 @@ 1311322112,1311324159,IT 1311324160,1311326207,LB 1311326208,1311328255,BE -1311328256,1311330831,NL -1311330832,1311330847,DE -1311330848,1311330879,NL -1311330880,1311330943,DE -1311330944,1311331327,NL -1311331328,1311331583,DE -1311331584,1311331839,NL -1311331840,1311332351,DE +1311328256,1311330303,NL +1311330304,1311332351,DE 1311332352,1311338495,RU 1311338496,1311340543,AT -1311340544,1311342591,ES +1311340544,1311342591,NO 1311342592,1311344639,FR 1311344640,1311346687,NO 1311346688,1311348735,AT 1311348736,1311350783,GB -1311350784,1311352831,RU +1311350784,1311352831,FR 1311352832,1311354879,SK 1311354880,1311356927,RU -1311356928,1311358975,FR +1311356928,1311357183,GB +1311357184,1311357439,FR +1311357440,1311357695,IT +1311357696,1311358263,FR +1311358264,1311358271,ES +1311358272,1311358975,FR 1311358976,1311361023,RU 1311361024,1311363071,NL 1311363072,1311365119,GB @@ -11877,25 +26021,28 @@ 1311367808,1311367839,US 1311367840,1311367871,DK 1311367872,1311367887,LR -1311367888,1311367895,DE +1311367888,1311367895,GB 1311367896,1311367935,DK -1311367936,1311368191,BJ +1311367936,1311367967,BJ +1311367968,1311368191,GB 1311368192,1311368319,BD 1311368320,1311368447,CF 1311368448,1311368575,TZ -1311368576,1311368703,ET +1311368576,1311368703,PG 1311368704,1311368831,NP -1311368832,1311368959,DE +1311368832,1311368959,GM 1311368960,1311369087,PT 1311369088,1311369215,BT 1311369216,1311371263,FR 1311371264,1311373311,SE -1311373312,1311375359,FR +1311373312,1311374335,FR +1311374336,1311374351,ES +1311374352,1311375359,FR 1311375360,1311506431,DE 1311506432,1311637503,CZ -1311637504,1311741183,DE -1311741184,1311741439,CH -1311741440,1312292863,DE +1311637504,1311707655,DE +1311707656,1311707663,NL +1311707664,1312292863,DE 1312292864,1312817151,LT 1312817152,1313865727,SE 1313865728,1313931263,CZ @@ -11905,7 +26052,7 @@ 1314127872,1314193407,LV 1314193408,1314258943,RU 1314258944,1314324479,GB -1314324480,1314390015,CY +1314324480,1314390015,GR 1314390016,1314455551,PL 1314455552,1314521087,KW 1314521088,1314586623,BG @@ -11926,68 +26073,85 @@ 1315713024,1315717119,SE 1315717120,1315725311,RU 1315725312,1315729407,CZ +1315729408,1315733503,EU 1315733504,1315737599,NL 1315737600,1315741695,CZ 1315741696,1315745791,LB -1315745792,1315749887,CZ +1315745792,1315749375,CZ +1315749376,1315749503,ES +1315749504,1315749887,CZ 1315749888,1315753983,RU 1315753984,1315758079,KZ 1315758080,1315762175,FR 1315762176,1315766271,BG 1315766272,1315770367,NL -1315770368,1315770391,UA -1315770392,1315770399,NA -1315770400,1315770575,UA +1315770368,1315770383,UA +1315770384,1315770399,NA +1315770400,1315770503,UA +1315770504,1315770511,NA +1315770512,1315770575,UA 1315770576,1315770583,NA 1315770584,1315770591,UA 1315770592,1315770599,NA -1315770600,1315770624,UA -1315770625,1315770631,NA -1315770632,1315770719,UA +1315770600,1315770639,UA +1315770640,1315770647,NA +1315770648,1315770719,UA 1315770720,1315770727,NA 1315770728,1315770975,UA -1315770976,1315770991,NA -1315770992,1315771007,UA -1315771008,1315771015,NA -1315771016,1315771103,UA -1315771104,1315771111,NA -1315771112,1315771223,UA +1315770976,1315770983,NA +1315770984,1315770991,UA +1315770992,1315770999,NA +1315771000,1315771199,UA +1315771200,1315771207,NA +1315771208,1315771223,UA 1315771224,1315771231,NA 1315771232,1315771247,UA 1315771248,1315771263,NA -1315771264,1315771415,UA +1315771264,1315771271,UA +1315771272,1315771279,NA +1315771280,1315771415,UA 1315771416,1315771423,NA -1315771424,1315771759,UA +1315771424,1315771639,UA +1315771640,1315771647,NA +1315771648,1315771759,UA 1315771760,1315771767,NA 1315771768,1315771815,UA 1315771816,1315771823,NA 1315771824,1315771871,UA 1315771872,1315771879,NA -1315771880,1315771907,UA -1315771908,1315771911,NA -1315771912,1315771935,UA -1315771936,1315771943,NA -1315771944,1315771951,UA -1315771952,1315771959,NA -1315771960,1315772151,UA -1315772152,1315772159,RU -1315772160,1315772303,UA +1315771880,1315771935,UA +1315771936,1315771951,NA +1315771952,1315771959,UA +1315771960,1315771967,NA +1315771968,1315771975,UA +1315771976,1315771983,NA +1315771984,1315772031,UA +1315772032,1315772039,NA +1315772040,1315772167,UA +1315772168,1315772175,NA +1315772176,1315772191,UA +1315772192,1315772199,NA +1315772200,1315772223,UA +1315772224,1315772231,NA +1315772232,1315772303,UA 1315772304,1315772311,NA 1315772312,1315772319,UA 1315772320,1315772327,NA -1315772328,1315772463,UA +1315772328,1315772399,UA +1315772400,1315772407,NA +1315772408,1315772463,UA 1315772464,1315772479,NA -1315772480,1315772487,UA -1315772488,1315772495,NA -1315772496,1315772503,UA -1315772504,1315772511,RU +1315772480,1315772503,UA +1315772504,1315772511,NA 1315772512,1315772583,UA 1315772584,1315772599,NA -1315772600,1315772863,UA -1315772864,1315772871,NA -1315772872,1315772887,UA +1315772600,1315772703,UA +1315772704,1315772711,NA +1315772712,1315772887,UA 1315772888,1315772895,NA -1315772896,1315773463,UA +1315772896,1315772919,UA +1315772920,1315772927,NA +1315772928,1315773463,UA 1315773464,1315773471,NA 1315773472,1315773487,UA 1315773488,1315773495,NA @@ -11995,37 +26159,40 @@ 1315773512,1315773519,NA 1315773520,1315773535,UA 1315773536,1315773543,NA -1315773544,1315773559,UA -1315773560,1315773567,NA -1315773568,1315773575,UA +1315773544,1315773551,UA +1315773552,1315773559,NA +1315773560,1315773575,UA 1315773576,1315773583,NA -1315773584,1315773671,UA -1315773672,1315773679,NA -1315773680,1315773703,UA +1315773584,1315773655,UA +1315773656,1315773663,NA +1315773664,1315773679,UA +1315773680,1315773687,NA +1315773688,1315773703,UA 1315773704,1315773711,NA 1315773712,1315773719,UA 1315773720,1315773751,NA 1315773752,1315773895,UA 1315773896,1315773903,NA 1315773904,1315773955,UA -1315773956,1315773967,NA -1315773968,1315773975,UA -1315773976,1315773983,NA +1315773956,1315773959,NA +1315773960,1315773983,UA 1315773984,1315773991,BY -1315773992,1315773999,UA -1315774000,1315774007,NA -1315774008,1315774015,UA -1315774016,1315774023,NA -1315774024,1315774039,UA +1315773992,1315774015,UA +1315774016,1315774031,NA +1315774032,1315774039,UA 1315774040,1315774071,NA -1315774072,1315774111,UA -1315774112,1315774119,NA -1315774120,1315774135,UA +1315774072,1315774095,UA +1315774096,1315774111,NA +1315774112,1315774135,UA 1315774136,1315774143,US -1315774144,1315774151,NA -1315774152,1315774183,UA -1315774184,1315774199,NA -1315774200,1315774463,UA +1315774144,1315774191,UA +1315774192,1315774207,NA +1315774208,1315774239,UA +1315774240,1315774255,RU +1315774256,1315774263,NA +1315774264,1315774423,UA +1315774424,1315774431,NA +1315774432,1315774463,UA 1315774464,1315782655,RU 1315782656,1315786751,AM 1315786752,1315790847,FR @@ -12039,45 +26206,53 @@ 1315827712,1315831807,RU 1315831808,1315835903,SA 1315835904,1315836159,CY -1315836160,1315839999,MT +1315836160,1315839487,MT +1315839488,1315839743,CY +1315839744,1315839999,MT 1315840000,1315844095,EE 1315844096,1315848191,RU -1315848192,1315852287,SA +1315848192,1315852287,BH 1315852288,1315856383,SE 1315856384,1315860479,SY 1315860480,1315864575,IR 1315864576,1315868671,CH 1315868672,1315872767,RU -1315872768,1315875183,GB -1315875184,1315875199,ES -1315875200,1315876863,GB +1315872768,1315876863,GB 1315876864,1315880959,IT 1315880960,1315885055,BE 1315885056,1315889151,CZ 1315889152,1315893247,DE 1315893248,1315897343,RU -1315897344,1315897599,IR -1315897600,1315897863,AE -1315897864,1315897871,IR -1315897872,1315897895,AE -1315897896,1315897903,IR -1315897904,1315897919,AE -1315897920,1315897951,IR -1315897952,1315898879,AE -1315898880,1315900671,IR -1315900672,1315901183,AE -1315901184,1315901439,IR +1315897344,1315897855,IR +1315897856,1315897863,AE +1315897864,1315897879,IR +1315897880,1315897887,AE +1315897888,1315897951,IR +1315897952,1315897991,AE +1315897992,1315897999,IR +1315898000,1315898015,AE +1315898016,1315898031,IR +1315898032,1315898111,AE +1315898112,1315900671,IR +1315900672,1315900735,AE +1315900736,1315900799,IR +1315900800,1315900927,AE +1315900928,1315901223,IR +1315901224,1315901439,AE 1315901440,1315905535,UA +1315905536,1315907583,BA +1315907584,1315908095,SI +1315908096,1315909631,BA 1315909632,1315913727,AZ 1315913728,1315917823,DE 1315917824,1315921919,RU 1315921920,1315926015,TR -1315926016,1315930111,NO +1315926016,1315930111,CZ 1315930112,1315934207,DE 1315934208,1315938303,RU 1315938304,1315942399,DK 1315942400,1315946495,UA -1315946496,1315950591,GB +1315946496,1315950591,GG 1315950592,1315954687,UA 1315954688,1315958783,DE 1315958784,1315962879,RU @@ -12085,38 +26260,25 @@ 1317011456,1317044223,BG 1317044224,1317076991,CZ 1317076992,1317109759,BE -1317109760,1317113279,GB -1317113280,1317113343,RU -1317113344,1317113855,GB -1317113856,1317114111,AE -1317114112,1317118207,GB +1317109760,1317113855,GB +1317113856,1317114111,US +1317114112,1317115135,GB +1317115136,1317115391,IE +1317115392,1317118207,GB 1317118208,1317118463,IN 1317118464,1317119103,GB 1317119104,1317119167,IT -1317119168,1317119487,GB -1317119488,1317119743,IT -1317119744,1317121279,GB -1317121280,1317121343,TR -1317121344,1317122047,GB -1317122048,1317126143,US -1317126144,1317126399,GB +1317119168,1317126399,GB 1317126400,1317126655,US -1317126656,1317126783,RU -1317126784,1317128703,GB -1317128704,1317129215,RU -1317129216,1317129279,GB -1317129280,1317129343,AU +1317126656,1317129279,GB +1317129280,1317129343,CA 1317129344,1317129471,GB 1317129472,1317129727,IT -1317129728,1317130239,GB -1317130240,1317130495,RS -1317130496,1317130559,GB -1317130560,1317130623,US -1317130624,1317132287,GB -1317132288,1317132543,IL -1317132544,1317132799,GB -1317132800,1317133055,RS -1317133056,1317142527,GB +1317129728,1317137663,GB +1317137664,1317137919,SE +1317137920,1317142143,GB +1317142144,1317142271,CA +1317142272,1317142527,GB 1317142528,1317175295,PT 1317175296,1317208063,BG 1317208064,1317240831,HU @@ -12129,50 +26291,623 @@ 1317437440,1317470207,HR 1317470208,1317502975,TR 1317502976,1317535743,IE -1317535744,1317552127,GB +1317535744,1317539607,GB +1317539608,1317539615,A2 +1317539616,1317552127,GB 1317552128,1317568511,ES 1317568512,1317584895,CZ 1317584896,1317601279,RU 1317601280,1317617663,UA 1317617664,1317634047,RU -1317634048,1317650431,IE +1317634048,1317637119,IE +1317637120,1317637375,GB +1317637376,1317640703,IE +1317640704,1317641215,GB +1317641216,1317641471,IE +1317641472,1317641727,GB +1317641728,1317642975,IE +1317642976,1317642991,GB +1317642992,1317645407,IE +1317645408,1317645823,GB +1317645824,1317646895,IE +1317646896,1317646911,GB +1317646912,1317646991,IE +1317646992,1317646999,GB +1317647000,1317647359,IE +1317647360,1317647615,GB +1317647616,1317649407,IE +1317649408,1317649919,GB +1317649920,1317650023,IE +1317650024,1317650031,GB +1317650032,1317650047,IE +1317650048,1317650087,GB +1317650088,1317650127,IE +1317650128,1317650175,GB +1317650176,1317650431,IE 1317650432,1317666815,RU -1317666816,1317666823,NG -1317666824,1317666863,GB -1317666864,1317666871,NG -1317666872,1317666879,GB -1317666880,1317666895,NG -1317666896,1317667047,GB -1317667048,1317667063,NG -1317667064,1317667159,GB -1317667160,1317667175,NG -1317667176,1317667327,GB -1317667328,1317667583,NG -1317667584,1317667727,GB -1317667728,1317667735,NG -1317667736,1317667743,GB -1317667744,1317667775,NG -1317667776,1317667799,GB -1317667800,1317667823,NG -1317667824,1317668199,GB +1317666816,1317666823,IQ +1317666824,1317666831,CD +1317666832,1317666839,NG +1317666840,1317666855,GH +1317666856,1317666863,A2 +1317666864,1317666871,GH +1317666872,1317666879,NG +1317666880,1317666887,LR +1317666888,1317666911,NG +1317666912,1317666919,A2 +1317666920,1317666927,NG +1317666928,1317666959,A2 +1317666960,1317666967,NG +1317666968,1317666983,A2 +1317666984,1317666991,CM +1317666992,1317666999,A2 +1317667000,1317667007,AO +1317667008,1317667015,GH +1317667016,1317667023,A2 +1317667024,1317667031,LR +1317667032,1317667039,NG +1317667040,1317667047,GH +1317667048,1317667055,NG +1317667056,1317667063,LR +1317667064,1317667087,AO +1317667088,1317667095,A2 +1317667096,1317667103,GH +1317667104,1317667111,NG +1317667112,1317667119,GH +1317667120,1317667135,A2 +1317667136,1317667143,AO +1317667144,1317667151,A2 +1317667152,1317667159,NG +1317667160,1317667167,AO +1317667168,1317667175,NG +1317667176,1317667183,GH +1317667184,1317667191,A2 +1317667192,1317667231,NG +1317667232,1317667239,GH +1317667240,1317667247,NG +1317667248,1317667255,A2 +1317667256,1317667263,NG +1317667264,1317667271,GB +1317667272,1317667295,NG +1317667296,1317667303,A2 +1317667304,1317667335,NG +1317667336,1317667343,A2 +1317667344,1317667351,NG +1317667352,1317667367,AO +1317667368,1317667375,NG +1317667376,1317667391,AO +1317667392,1317667407,A2 +1317667408,1317667423,NG +1317667424,1317667431,TD +1317667432,1317667439,GH +1317667440,1317667447,A2 +1317667448,1317667471,NG +1317667472,1317667479,A2 +1317667480,1317667487,NG +1317667488,1317667495,GH +1317667496,1317667503,NG +1317667504,1317667527,A2 +1317667528,1317667535,AO +1317667536,1317667543,A2 +1317667544,1317667551,AO +1317667552,1317667567,NG +1317667568,1317667583,GH +1317667584,1317667759,NG +1317667760,1317667767,FR +1317667768,1317667775,ZA +1317667776,1317667783,CD +1317667784,1317667823,NG +1317667824,1317668095,A2 +1317668096,1317668103,GH +1317668104,1317668111,ZM +1317668112,1317668127,AO +1317668128,1317668143,A2 +1317668144,1317668151,AO +1317668152,1317668167,NG +1317668168,1317668183,A2 +1317668184,1317668191,CI +1317668192,1317668199,NG 1317668200,1317668207,BW -1317668208,1317668343,GB +1317668208,1317668215,LR +1317668216,1317668223,CM +1317668224,1317668239,NG +1317668240,1317668247,A2 +1317668248,1317668255,NG +1317668256,1317668263,A2 +1317668264,1317668271,AO +1317668272,1317668279,SL +1317668280,1317668295,A2 +1317668296,1317668303,CD +1317668304,1317668311,NG +1317668312,1317668319,IQ +1317668320,1317668327,A2 +1317668328,1317668343,NG 1317668344,1317668351,AO -1317668352,1317668687,GB -1317668688,1317668695,NG -1317668696,1317669119,GB +1317668352,1317668359,NG +1317668360,1317668367,SL +1317668368,1317668383,NG +1317668384,1317668391,A2 +1317668392,1317668399,NG +1317668400,1317668407,A2 +1317668408,1317668415,GH +1317668416,1317668447,NG +1317668448,1317668455,SL +1317668456,1317668463,NG +1317668464,1317668471,AO +1317668472,1317668479,NG +1317668480,1317668487,GH +1317668488,1317668495,NG +1317668496,1317668503,GH +1317668504,1317668511,CD +1317668512,1317668519,IQ +1317668520,1317668527,MZ +1317668528,1317668535,AO +1317668536,1317668543,BJ +1317668544,1317668551,UG +1317668552,1317668559,AO +1317668560,1317668575,NG +1317668576,1317668583,IQ +1317668584,1317668591,LR +1317668592,1317668599,NG +1317668600,1317668615,A2 +1317668616,1317668623,NG +1317668624,1317668631,IQ +1317668632,1317668639,A2 +1317668640,1317668655,NG +1317668656,1317668671,A2 +1317668672,1317668735,NG +1317668736,1317668743,A2 +1317668744,1317668751,AO +1317668752,1317668759,A2 +1317668760,1317668767,IQ +1317668768,1317668775,LR +1317668776,1317668791,NG +1317668792,1317668799,A2 +1317668800,1317668807,AO +1317668808,1317668815,NG +1317668816,1317668823,A2 +1317668824,1317668831,AO +1317668832,1317668855,NG +1317668856,1317668863,A2 +1317668864,1317668871,LR +1317668872,1317668887,NG +1317668888,1317668895,A2 +1317668896,1317668903,NG +1317668904,1317668911,A2 +1317668912,1317668927,NG +1317668928,1317668935,A2 +1317668936,1317668983,NG +1317668984,1317668991,A2 +1317668992,1317668999,NG +1317669000,1317669007,CD +1317669008,1317669031,NG +1317669032,1317669055,A2 +1317669056,1317669103,NG +1317669104,1317669111,A2 +1317669112,1317669119,NG 1317669120,1317669375,GE 1317669376,1317669631,CG -1317669632,1317671575,GB -1317671576,1317671583,NG -1317671584,1317671887,GB -1317671888,1317671895,NG -1317671896,1317683199,GB -1317683200,1317686271,DE +1317669632,1317669887,A2 +1317669888,1317669895,AO +1317669896,1317669911,NG +1317669912,1317669919,GH +1317669920,1317669959,NG +1317669960,1317669983,A2 +1317669984,1317669991,LR +1317669992,1317670015,NG +1317670016,1317670031,A2 +1317670032,1317670103,NG +1317670104,1317670111,A2 +1317670112,1317670143,NG +1317670144,1317670175,SL +1317670176,1317670215,A2 +1317670216,1317670223,NG +1317670224,1317670231,AO +1317670232,1317670239,A2 +1317670240,1317670247,NG +1317670248,1317670255,A2 +1317670256,1317670263,NG +1317670264,1317670399,A2 +1317670400,1317670415,CD +1317670416,1317670423,A2 +1317670424,1317670431,NG +1317670432,1317670447,A2 +1317670448,1317670455,IQ +1317670456,1317670471,NG +1317670472,1317670479,CO +1317670480,1317670495,A2 +1317670496,1317670503,NG +1317670504,1317670511,A2 +1317670512,1317670519,CI +1317670520,1317670543,NG +1317670544,1317670551,IQ +1317670552,1317670567,NG +1317670568,1317670575,A2 +1317670576,1317670583,NG +1317670584,1317670599,GH +1317670600,1317670607,AO +1317670608,1317670639,NG +1317670640,1317670647,A2 +1317670648,1317670655,NG +1317670656,1317670663,AO +1317670664,1317670671,A2 +1317670672,1317670679,CM +1317670680,1317670703,NG +1317670704,1317670711,A2 +1317670712,1317670719,GH +1317670720,1317670727,A2 +1317670728,1317670735,GH +1317670736,1317670743,AO +1317670744,1317670751,NG +1317670752,1317670759,A2 +1317670760,1317670767,NG +1317670768,1317670775,GH +1317670776,1317670783,A2 +1317670784,1317670791,GH +1317670792,1317670807,NG +1317670808,1317670815,AO +1317670816,1317670823,NG +1317670824,1317670831,CD +1317670832,1317670839,NG +1317670840,1317670847,A2 +1317670848,1317670855,NG +1317670856,1317670863,CD +1317670864,1317670871,A2 +1317670872,1317670887,NG +1317670888,1317670895,AO +1317670896,1317670896,A2 +1317670897,1317670911,NG +1317670912,1317671167,A2 +1317671168,1317671175,AO +1317671176,1317671191,NG +1317671192,1317671199,A2 +1317671200,1317671207,CI +1317671208,1317671231,A2 +1317671232,1317671239,NG +1317671240,1317671247,CI +1317671248,1317671255,NG +1317671256,1317671263,CI +1317671264,1317671271,NG +1317671272,1317671279,A2 +1317671280,1317671335,NG +1317671336,1317671343,BW +1317671344,1317671351,CD +1317671352,1317671359,A2 +1317671360,1317671367,NG +1317671368,1317671375,A2 +1317671376,1317671383,NG +1317671384,1317671391,CI +1317671392,1317671399,NG +1317671400,1317671407,IQ +1317671408,1317671423,NG +1317671424,1317671439,A2 +1317671440,1317671487,NG +1317671488,1317671511,AO +1317671512,1317671519,A2 +1317671520,1317671527,AO +1317671528,1317671543,NG +1317671544,1317671551,GH +1317671552,1317671567,NG +1317671568,1317671583,A2 +1317671584,1317671591,NG +1317671592,1317671599,A2 +1317671600,1317671607,NG +1317671608,1317671615,GH +1317671616,1317671647,A2 +1317671648,1317671679,NG +1317671680,1317671687,LR +1317671688,1317671703,A2 +1317671704,1317671727,NG +1317671728,1317671735,A2 +1317671736,1317671743,NG +1317671744,1317671759,A2 +1317671760,1317671767,IQ +1317671768,1317671775,A2 +1317671776,1317671807,NG +1317671808,1317671823,CI +1317671824,1317671831,NG +1317671832,1317671839,GH +1317671840,1317671847,AO +1317671848,1317671871,NG +1317671872,1317671879,A2 +1317671880,1317671895,NG +1317671896,1317671903,CM +1317671904,1317671911,NG +1317671912,1317671919,AO +1317671920,1317671927,NG +1317671928,1317671935,A2 +1317671936,1317672447,GA +1317672448,1317672455,NG +1317672456,1317672463,A2 +1317672464,1317672471,NG +1317672472,1317672479,A2 +1317672480,1317672487,ZM +1317672488,1317672511,NG +1317672512,1317672519,A2 +1317672520,1317672527,NG +1317672528,1317672543,A2 +1317672544,1317672551,CD +1317672552,1317672583,A2 +1317672584,1317672591,CD +1317672592,1317672599,NG +1317672600,1317672607,A2 +1317672608,1317672615,CM +1317672616,1317672631,NG +1317672632,1317672639,A2 +1317672640,1317672655,NG +1317672656,1317672663,CD +1317672664,1317672695,NG +1317672696,1317672703,A2 +1317672704,1317672711,NG +1317672712,1317672719,A2 +1317672720,1317672727,LR +1317672728,1317672735,NG +1317672736,1317672743,LR +1317672744,1317672759,A2 +1317672760,1317672767,NG +1317672768,1317672775,A2 +1317672776,1317672783,NG +1317672784,1317672791,AO +1317672792,1317672815,A2 +1317672816,1317672823,BW +1317672824,1317672831,NG +1317672832,1317672839,A2 +1317672840,1317672855,NG +1317672856,1317672863,A2 +1317672864,1317672895,NG +1317672896,1317672903,A2 +1317672904,1317672919,CI +1317672920,1317672927,GH +1317672928,1317672951,NG +1317672952,1317672959,AO +1317672960,1317673239,NG +1317673240,1317673255,A2 +1317673256,1317673287,NG +1317673288,1317673295,LR +1317673296,1317673303,NG +1317673304,1317673311,A2 +1317673312,1317673319,NG +1317673320,1317673327,LR +1317673328,1317673335,NG +1317673336,1317673343,GH +1317673344,1317673351,A2 +1317673352,1317673375,NG +1317673376,1317673383,AO +1317673384,1317673415,NG +1317673416,1317673423,A2 +1317673424,1317673431,NG +1317673432,1317673439,AO +1317673440,1317673447,A2 +1317673448,1317673463,AO +1317673464,1317673471,A2 +1317673472,1317673479,NG +1317673480,1317673487,A2 +1317673488,1317673495,HK +1317673496,1317673527,NG +1317673528,1317673535,A2 +1317673536,1317673575,NG +1317673576,1317673583,CD +1317673584,1317673591,A2 +1317673592,1317673615,NG +1317673616,1317673623,A2 +1317673624,1317673631,NG +1317673632,1317673639,A2 +1317673640,1317673647,AO +1317673648,1317673655,A2 +1317673656,1317673671,NG +1317673672,1317673679,CM +1317673680,1317673687,IQ +1317673688,1317673711,NG +1317673712,1317673719,CO +1317673720,1317673727,NG +1317673728,1317673743,AO +1317673744,1317673751,IQ +1317673752,1317673759,A2 +1317673760,1317673767,NG +1317673768,1317673775,AO +1317673776,1317673783,NG +1317673784,1317673791,AO +1317673792,1317673799,NG +1317673800,1317673807,A2 +1317673808,1317673815,NG +1317673816,1317673823,LR +1317673824,1317673831,NG +1317673832,1317673839,AO +1317673840,1317673847,NG +1317673848,1317673855,A2 +1317673856,1317673871,NG +1317673872,1317673895,A2 +1317673896,1317673911,NG +1317673912,1317673919,AO +1317673920,1317673927,CI +1317673928,1317673943,NG +1317673944,1317673951,AO +1317673952,1317673967,NG +1317673968,1317673975,A2 +1317673976,1317674239,NG +1317674240,1317674247,A2 +1317674248,1317674255,NG +1317674256,1317674263,CM +1317674264,1317674271,AO +1317674272,1317674279,NG +1317674280,1317674287,CD +1317674288,1317674295,GH +1317674296,1317674303,AO +1317674304,1317674319,NG +1317674320,1317674351,A2 +1317674352,1317674359,NG +1317674360,1317674367,AO +1317674368,1317674375,NG +1317674376,1317674383,A2 +1317674384,1317674399,NG +1317674400,1317674407,A2 +1317674408,1317674415,NG +1317674416,1317674423,AO +1317674424,1317674431,NG +1317674432,1317674440,AO +1317674441,1317674447,A2 +1317674448,1317674455,AO +1317674456,1317674471,NG +1317674472,1317674479,A2 +1317674480,1317674487,AO +1317674488,1317674495,NG +1317674496,1317674503,A2 +1317674504,1317674511,AO +1317674512,1317674519,NG +1317674520,1317674527,A2 +1317674528,1317674535,NG +1317674536,1317674543,IQ +1317674544,1317674599,NG +1317674600,1317674607,A2 +1317674608,1317674615,NG +1317674616,1317674623,IQ +1317674624,1317674631,NG +1317674632,1317674639,A2 +1317674640,1317674647,NG +1317674648,1317674655,A2 +1317674656,1317674671,NG +1317674672,1317674679,A2 +1317674680,1317674687,AO +1317674688,1317674735,NG +1317674736,1317674743,AO +1317674744,1317674751,IQ +1317674752,1317674791,NG +1317674792,1317674799,A2 +1317674800,1317674807,NG +1317674808,1317674823,A2 +1317674824,1317674871,NG +1317674872,1317674879,A2 +1317674880,1317674887,NG +1317674888,1317674911,AO +1317674912,1317674927,NG +1317674928,1317674935,AO +1317674936,1317674943,NG +1317674944,1317674951,GA +1317674952,1317674959,NG +1317674960,1317674967,GH +1317674968,1317674975,NG +1317674976,1317674991,A2 +1317674992,1317675007,NG +1317675008,1317675023,A2 +1317675024,1317675047,NG +1317675048,1317675055,A2 +1317675056,1317675063,NG +1317675064,1317675071,AO +1317675072,1317675095,NG +1317675096,1317675119,A2 +1317675120,1317675127,NG +1317675128,1317675135,HK +1317675136,1317675143,NG +1317675144,1317675159,A2 +1317675160,1317675167,AO +1317675168,1317675175,NG +1317675176,1317675183,A2 +1317675184,1317675199,CM +1317675200,1317675231,NG +1317675232,1317675239,LR +1317675240,1317675255,AO +1317675256,1317675263,A2 +1317675264,1317675279,NG +1317675280,1317675287,CM +1317675288,1317675295,A2 +1317675296,1317675319,NG +1317675320,1317675343,CM +1317675344,1317675351,AO +1317675352,1317675359,IQ +1317675360,1317675375,NG +1317675376,1317675383,CM +1317675384,1317675391,NG +1317675392,1317675407,A2 +1317675408,1317675415,NG +1317675416,1317675423,A2 +1317675424,1317675439,NG +1317675440,1317675447,A2 +1317675448,1317675455,NG +1317675456,1317675463,CD +1317675464,1317675471,CI +1317675472,1317675479,A2 +1317675480,1317675511,NG +1317675512,1317675519,A2 +1317675520,1317675527,NG +1317675528,1317675535,AO +1317675536,1317675543,NG +1317675544,1317675551,IQ +1317675552,1317675559,NG +1317675560,1317675567,NA +1317675568,1317675575,AO +1317675576,1317675583,A2 +1317675584,1317675591,LR +1317675592,1317675607,NG +1317675608,1317675623,A2 +1317675624,1317675639,NG +1317675640,1317675647,FR +1317675648,1317675655,LR +1317675656,1317675663,NG +1317675664,1317675671,A2 +1317675672,1317675687,NG +1317675688,1317675695,CM +1317675696,1317675703,NG +1317675704,1317675711,A2 +1317675712,1317675719,CM +1317675720,1317675735,NG +1317675736,1317675743,CD +1317675744,1317675751,GH +1317675752,1317675759,NG +1317675760,1317675775,GH +1317675776,1317675783,NG +1317675784,1317675815,A2 +1317675816,1317675831,NG +1317675832,1317675855,A2 +1317675856,1317675863,CM +1317675864,1317675903,A2 +1317675904,1317675911,GN +1317675912,1317675927,NG +1317675928,1317675935,A2 +1317675936,1317675943,NG +1317675944,1317675951,A2 +1317675952,1317675959,NG +1317675960,1317676287,A2 +1317676288,1317676543,LR +1317676544,1317676583,A2 +1317676584,1317676591,NG +1317676592,1317676663,A2 +1317676664,1317676671,NG +1317676672,1317676807,A2 +1317676808,1317676815,NG +1317676816,1317676823,A2 +1317676824,1317676831,NG +1317676832,1317676847,A2 +1317676848,1317676855,NG +1317676856,1317676895,A2 +1317676896,1317676935,NG +1317676936,1317676991,A2 +1317676992,1317676999,LR +1317677000,1317677007,IQ +1317677008,1317677015,IT +1317677016,1317677223,A2 +1317677224,1317677231,NG +1317677232,1317677247,A2 +1317677248,1317677255,NG +1317677256,1317677303,A2 +1317677304,1317677311,NG +1317677312,1317683199,A2 +1317683200,1317683839,DE +1317683840,1317683855,CH +1317683856,1317683863,DE +1317683864,1317683871,FR +1317683872,1317685503,DE +1317685504,1317685631,BE +1317685632,1317686271,DE 1317686272,1317686287,NL -1317686288,1317695743,DE +1317686288,1317686303,DE +1317686304,1317686319,NL +1317686320,1317686335,DE +1317686336,1317686399,NL +1317686400,1317695743,DE 1317695744,1317695999,CH -1317696000,1317699583,DE +1317696000,1317698559,DE +1317698560,1317698687,NL +1317698688,1317699583,DE 1317699584,1317715967,RU 1317715968,1317732351,SA 1317732352,1317748735,HU @@ -12185,57 +26920,115 @@ 1317832448,1317832511,CY 1317832512,1317832959,NL 1317832960,1317833215,IT -1317833216,1317847039,NL +1317833216,1317835615,NL +1317835616,1317835647,RU +1317835648,1317836863,NL +1317836864,1317836927,CY +1317836928,1317836991,NL +1317836992,1317837007,GB +1317837008,1317838943,NL +1317838944,1317838959,GB +1317838960,1317839359,NL +1317839360,1317839615,RU +1317839616,1317839679,HK +1317839680,1317839695,CZ +1317839696,1317841407,NL +1317841408,1317841439,SC +1317841440,1317841727,NL +1317841728,1317841855,CY +1317841856,1317842943,NL +1317842944,1317843071,CY +1317843072,1317843135,HK +1317843136,1317843199,CY +1317843200,1317843327,US +1317843328,1317847039,NL 1317847040,1317863423,RU 1317863424,1317879807,GB 1317879808,1317896191,SK 1317896192,1317912575,LU -1317912576,1317920767,GB -1317920768,1317928959,ES +1317912576,1317928959,GB 1317928960,1317945343,BG -1317945344,1317978111,AT +1317945344,1317965047,AT +1317965048,1317965055,DE +1317965056,1317978111,AT 1317978112,1317994495,RU -1317994496,1318000383,DE +1317994496,1317996031,NL +1317996032,1317996095,DE +1317996096,1317996287,NL +1317996288,1317997567,DE +1317997568,1317998591,NL +1317998592,1318000383,DE 1318000384,1318000447,NL 1318000448,1318002175,DE 1318002176,1318002431,NL -1318002432,1318010879,DE +1318002432,1318005631,DE +1318005632,1318005759,NL +1318005760,1318006271,DE +1318006272,1318006783,NL +1318006784,1318007999,DE +1318008000,1318008031,NL +1318008032,1318009423,DE +1318009424,1318009471,NL +1318009472,1318010527,DE +1318010528,1318010879,NL 1318010880,1318027263,DK 1318027264,1318043647,IE 1318043648,1318584319,GB 1318584320,1318592511,PL -1318592512,1318600703,FI +1318592512,1318596863,NL +1318596864,1318597375,US +1318597376,1318598143,NL +1318598144,1318598399,SE +1318598400,1318598655,FR +1318598656,1318599167,DE +1318599168,1318599679,NL +1318599680,1318599935,GB +1318599936,1318600191,DE +1318600192,1318600703,NL 1318600704,1318608895,AT 1318608896,1318617087,IT -1318617088,1318625279,LT +1318617088,1318625279,FR 1318625280,1318633471,UA 1318633472,1318649855,IE 1318649856,1318658047,RU 1318658048,1318666239,SI 1318666240,1318674431,DE -1318674432,1318682623,GR +1318674432,1318682623,HU 1318682624,1318690815,RU 1318690816,1318699007,DK -1318699008,1318707199,IE -1318707200,1318711295,SE -1318711296,1318711327,FR -1318711328,1318713343,SE -1318713344,1318713855,FR -1318713856,1318714367,SE -1318714368,1318715390,FR +1318699008,1318702303,IE +1318702304,1318702335,US +1318702336,1318707199,IE +1318707200,1318707775,FR +1318707776,1318707783,GB +1318707784,1318708511,FR +1318708512,1318708527,GB +1318708528,1318708543,FR +1318708544,1318708547,GB +1318708548,1318708559,FR +1318708560,1318708991,GB +1318708992,1318711647,FR +1318711648,1318711663,IT +1318711664,1318713855,FR +1318713856,1318714111,CH +1318714112,1318715390,FR +1318715391,1318715391,GB 1318715392,1318723583,BG 1318723584,1318731775,IR 1318731776,1318739967,PL 1318739968,1318748159,GB -1318748160,1318756351,LV +1318748160,1318753023,LV +1318753024,1318753279,BE +1318753280,1318756351,LV 1318756352,1318764543,UA 1318764544,1318780927,KW 1318780928,1318789119,CH +1318789120,1318797311,ME 1318797312,1318805503,SY 1318805504,1318813695,PL 1318813696,1318821887,FR 1318821888,1318838271,RU -1318838272,1318846463,GB +1318838272,1318846463,IE 1318846464,1318854655,NO 1318854656,1318862847,CZ 1318862848,1318871039,GB @@ -12249,19 +27042,21 @@ 1318920192,1318928383,IR 1318928384,1318936575,LT 1318936576,1318944767,DK -1318944768,1318952959,LV -1318952960,1318956543,CZ -1318956544,1318957055,PL -1318957056,1318959103,CZ -1318959104,1318961151,PL +1318944768,1318956287,CZ +1318956288,1318957055,PL +1318957056,1318958847,CZ +1318958848,1318961151,PL 1318961152,1318969343,NL 1318969344,1318977535,RU 1318977536,1318985727,LT -1318985728,1319002111,GB +1318985728,1319001087,GB +1319001088,1319002111,US 1319002112,1319010303,IE 1319010304,1319017215,CY 1319017216,1319017279,DE -1319017280,1319018495,CY +1319017280,1319017295,CY +1319017296,1319017303,DE +1319017304,1319018495,CY 1319018496,1319026687,IR 1319026688,1319034879,RU 1319034880,1319035903,NO @@ -12271,29 +27066,31 @@ 1319043072,1319051263,FR 1319051264,1319059455,UA 1319059456,1319067647,PL -1319067648,1319069951,DE -1319069952,1319070207,GB -1319070208,1319070271,DE +1319067648,1319069776,DE +1319069777,1319069823,CN +1319069824,1319070217,DE +1319070218,1319070254,CN +1319070255,1319070271,GB 1319070272,1319070335,PT 1319070336,1319070463,RU -1319070464,1319070975,GB +1319070464,1319070975,DE 1319070976,1319071103,PL 1319071104,1319071231,RU 1319071232,1319071487,PL -1319071488,1319071743,GB -1319071744,1319072767,DE +1319071488,1319072767,DE 1319072768,1319073023,IT 1319073024,1319073279,TR 1319073280,1319074303,DE -1319074304,1319074559,ME -1319074560,1319074815,GB +1319074304,1319074559,HK +1319074560,1319074815,DE 1319074816,1319074943,PL 1319074944,1319075071,RU -1319075072,1319075199,DE +1319075072,1319075199,PL 1319075200,1319075327,RU 1319075328,1319075455,DE 1319075456,1319075583,RU -1319075584,1319075711,DE +1319075584,1319075664,DE +1319075665,1319075711,CN 1319075712,1319075839,RU 1319075840,1319084031,BG 1319084032,1319092223,KW @@ -12310,7 +27107,10 @@ 1331824640,1331826687,RU 1331826688,1331828735,FR 1331828736,1331830783,LT -1331830784,1331832831,GB +1331830784,1331831335,GB +1331831336,1331831343,IE +1331831344,1331831351,AE +1331831352,1331832831,GB 1331832832,1331834879,IT 1331834880,1331836927,BY 1331836928,1331838975,FR @@ -12318,7 +27118,7 @@ 1331841024,1331843071,CZ 1331843072,1331845119,GB 1331845120,1331847167,RU -1331847168,1331849215,SE +1331847168,1331849215,FR 1331849216,1331851263,RU 1331851264,1331853311,AL 1331853312,1331855359,AE @@ -12326,13 +27126,15 @@ 1331857408,1331859455,RU 1331859456,1331861503,PL 1331861504,1331863551,CZ -1331863552,1331867647,GB -1331867648,1331869695,NL +1331863552,1331865599,GB +1331865600,1331869695,NL 1331869696,1331871743,SA 1331871744,1331873791,DK 1331873792,1331879935,RU 1331879936,1331881983,DE -1331881984,1331886079,GB +1331881984,1331883007,GB +1331883008,1331883263,SE +1331883264,1331886079,GB 1331886080,1331888127,ES 1331888128,1331890175,SE 1331890176,1331892223,IT @@ -12349,30 +27151,47 @@ 1331914752,1331916799,RU 1331916800,1331918847,IT 1331918848,1331920895,BE -1331920896,1331922943,NL +1331920896,1331922751,NL +1331922752,1331922815,BE +1331922816,1331922943,NL 1331922944,1331924991,DE 1331924992,1331927039,GB 1331927040,1331929087,FI 1331929088,1331931135,FR 1331931136,1331933183,SE 1331933184,1331935231,TR -1331935232,1331937279,GB -1331937280,1331937535,US -1331937536,1331939327,GB +1331937280,1331937535,GB +1331937536,1331937567,SM +1331937568,1331937583,US +1331937584,1331937599,ZA +1331937600,1331938111,GB +1331938112,1331938127,AE +1331938128,1331938191,GB +1331938192,1331938207,AE +1331938208,1331938375,GB +1331938376,1331938383,AE +1331938384,1331938823,GB +1331938824,1331938831,US +1331938832,1331939327,GB 1331939328,1331941375,BE -1331941376,1331943423,GR +1331941376,1331943423,ES 1331943424,1331945471,RU 1331945472,1331947519,SE -1331947520,1331948287,CH -1331948288,1331948543,US +1331947520,1331948543,CH 1331948544,1331948547,NL 1331948548,1331948551,CH 1331948552,1331948559,FR -1331948560,1331949567,CH +1331948560,1331948567,GB +1331948568,1331948575,DE +1331948576,1331948583,CZ +1331948584,1331948591,CY +1331948592,1331948607,BG +1331948608,1331948615,US +1331948616,1331949567,CH 1331949568,1331951615,RU 1331951616,1331953663,GE 1331953664,1332019199,BG -1332019200,1332084735,CS +1332019200,1332084735,RS 1332084736,1332150271,SE 1332150272,1332215807,GR 1332215808,1332346879,RU @@ -12385,7 +27204,9 @@ 1332633600,1332637695,UA 1332637696,1332641791,BG 1332641792,1332658175,UA -1332674560,1332740095,RU +1332658176,1332662271,PL +1332662272,1332670463,UA +1332670464,1332740095,RU 1332740096,1333264383,RO 1333264384,1333297151,RU 1333297152,1333317887,HU @@ -12396,9 +27217,7 @@ 1333428224,1333460991,RU 1333460992,1333493759,GB 1333493760,1333526527,TR -1333526528,1333551103,BG -1333551104,1333555199,UA -1333555200,1333559295,PL +1333526528,1333559295,BG 1333559296,1333592063,UA 1333592064,1333624831,IE 1333624832,1333657599,MK @@ -12414,13 +27233,17 @@ 1334083584,1334091775,DE 1334091776,1334099967,LT 1334099968,1334108159,IR +1334108160,1334109807,BE +1334109808,1334109811,NL +1334109812,1334113527,BE +1334113528,1334113535,NL +1334113536,1334116351,BE 1334116352,1334124543,AX 1334124544,1334132735,DE 1334132736,1334165503,RU 1334165504,1334173695,PL 1334173696,1334181887,LT 1334181888,1334190079,RU -1334190080,1334198271,PL 1334198272,1334206463,RU 1334206464,1334214655,FI 1334214656,1334222847,JO @@ -12430,20 +27253,24 @@ 1334247424,1334255615,NO 1334255616,1334263807,IT 1334263808,1334271999,RU -1334272000,1334279615,GB -1334279616,1334279647,GN -1334279648,1334280191,GB +1334272000,1334280191,GB 1334280192,1334288383,LV -1334288384,1334296575,TR +1334288384,1334296575,PL 1334296576,1334304767,UA 1334304768,1334312959,RU 1334312960,1334316031,SE 1334316032,1334316543,NO -1334316544,1334345727,SE +1334316544,1334343047,SE +1334343048,1334343055,NO +1334343056,1334345727,SE 1334345728,1334378495,RU 1334378496,1334411263,IT 1334411264,1334444031,RU -1334444032,1334501375,SE +1334444032,1334478847,SE +1334478848,1334480895,DK +1334480896,1334484991,SE +1334484992,1334489087,DK +1334489088,1334501375,SE 1334501376,1334509567,DK 1334509568,1334542335,PL 1334542336,1334575103,RU @@ -12451,9 +27278,7 @@ 1334579200,1334583295,RU 1334583296,1334583311,DE 1334583312,1334583319,US -1334583320,1334583327,DE -1334583328,1334583359,US -1334583360,1334583535,DE +1334583320,1334583535,DE 1334583536,1334583543,US 1334583544,1334583807,DE 1334583808,1334584063,CH @@ -12461,16 +27286,33 @@ 1334584256,1334584287,AT 1334584288,1334584351,DE 1334584352,1334584383,LU -1334584384,1334591487,DE +1334584384,1334584903,DE +1334584904,1334584911,AT +1334584912,1334584999,DE +1334585000,1334585007,US +1334585008,1334585111,DE +1334585112,1334585119,AT +1334585120,1334591487,DE 1334591488,1334595583,RU -1334595584,1334596095,IT -1334596096,1334596607,GR -1334596608,1334597631,IT -1334597632,1334597887,US -1334597888,1334599679,IT +1334595584,1334596351,IT +1334596352,1334596607,GR +1334596608,1334597887,IT +1334597888,1334598143,GR +1334598144,1334598271,SK +1334598272,1334598399,CZ +1334598400,1334598463,GR +1334598464,1334598527,IT +1334598528,1334598655,GR +1334598656,1334599039,IT +1334599040,1334599167,FR +1334599168,1334599679,IT 1334599680,1334603775,RU 1334603776,1334607871,DE -1334607872,1334611967,IE +1334607872,1334609994,IE +1334609995,1334609995,GB +1334609996,1334610020,IE +1334610021,1334610021,GB +1334610022,1334611967,IE 1334611968,1334616063,ME 1334616064,1334620159,MD 1334620160,1334624255,DE @@ -12479,11 +27321,19 @@ 1334632448,1334636543,KZ 1334636544,1334640639,RU 1334640640,1334644735,FR -1334644736,1334644991,IQ -1334644992,1334645247,LB -1334645248,1334646783,IQ -1334646784,1334648831,LU -1334648832,1334652927,GB +1334644736,1334644991,LU +1334644992,1334645247,A2 +1334645248,1334648319,IQ +1334648320,1334648831,A2 +1334648832,1334650959,GB +1334650960,1334650975,NL +1334650976,1334651391,GB +1334651392,1334651647,NL +1334651648,1334651903,FR +1334651904,1334652159,DE +1334652160,1334652543,GB +1334652544,1334652559,NL +1334652560,1334652927,GB 1334652928,1334661119,RU 1334661120,1334665215,CH 1334665216,1334669311,NO @@ -12491,14 +27341,19 @@ 1334673408,1334677503,GB 1334677504,1334681599,FI 1334681600,1334681855,PL -1334681856,1334682111,DE -1334682112,1334682367,PL +1334681856,1334682111,GB +1334682112,1334682367,IE 1334682368,1334682623,FR -1334682624,1334682879,AT -1334682880,1334683135,SK -1334683136,1334683391,PL +1334682624,1334682879,NO +1334682880,1334683135,DK +1334683136,1334683391,CZ 1334683392,1334683647,CH -1334683648,1334685695,DE +1334683648,1334684159,DE +1334684160,1334684415,SE +1334684416,1334684671,DE +1334684672,1334684927,FI +1334684928,1334685183,NL +1334685184,1334685695,DE 1334685696,1334689791,IT 1334689792,1334693887,FR 1334693888,1334702079,RU @@ -12507,17 +27362,32 @@ 1334710272,1334714367,RU 1334714368,1334718463,DE 1334718464,1334722559,KZ -1334722560,1334726655,IT -1334726656,1334734847,RU +1334722560,1334726655,NL +1334726656,1334729983,RU +1334729984,1334730431,KZ +1334730432,1334730439,RU +1334730440,1334730443,KZ +1334730444,1334730447,RU +1334730448,1334730463,KZ +1334730464,1334730495,RU +1334730496,1334730499,KZ +1334730500,1334730503,RU +1334730504,1334730539,KZ +1334730540,1334730543,RU +1334730544,1334730667,KZ +1334730668,1334730687,RU +1334730688,1334730699,KZ +1334730700,1334730703,RU +1334730704,1334730743,KZ +1334730744,1334734847,RU 1334734848,1334738943,LT 1334738944,1334743039,CH -1334743040,1334747135,UA 1334747136,1334751231,RU 1334751232,1334755327,BH 1334755328,1334759423,UA 1334759424,1334763519,SE 1334763520,1334767615,DK -1334767616,1334771711,FR +1334767616,1334771711,SE 1334771712,1334779903,RU 1334779904,1334783999,UA 1334784000,1334788095,AT @@ -12527,9 +27397,7 @@ 1334804480,1334808575,FR 1334808576,1334812671,GB 1334812672,1334816767,BA -1334816768,1334817791,LV -1334817792,1334818047,NL -1334818048,1334820863,LV +1334816768,1334820863,DE 1334820864,1334824959,IE 1334824960,1334829055,NL 1334829056,1334833151,RU @@ -12555,7 +27423,7 @@ 1336561664,1336563711,NO 1336563712,1336567807,NL 1336567808,1336569855,BY -1336569856,1336571903,FR +1336569856,1336571903,EU 1336571904,1336573951,PL 1336573952,1336575999,DK 1336576000,1336578047,RU @@ -12575,16 +27443,21 @@ 1336606720,1336608767,PL 1336608768,1336610815,RU 1336610816,1336612863,TR -1336612864,1336613375,ES -1336613376,1336613391,PL -1336613392,1336613407,IT -1336613408,1336614911,ES +1336612864,1336614911,ES 1336614912,1336616959,GB 1336616960,1336619007,ES 1336619008,1336621055,AL 1336621056,1336623103,IT 1336623104,1336625151,BE -1336625152,1336627199,IE +1336625152,1336625823,IE +1336625824,1336625839,GB +1336625840,1336626207,IE +1336626208,1336626239,GB +1336626240,1336626303,IE +1336626304,1336626319,GB +1336626320,1336626447,IE +1336626448,1336626463,GB +1336626464,1336627199,IE 1336627200,1336629247,NO 1336629248,1336631295,DE 1336631296,1336633343,IS @@ -12595,7 +27468,7 @@ 1336643584,1336645631,DK 1336645632,1336647679,GB 1336647680,1336649727,IT -1336649728,1336651775,GE +1336649728,1336651775,RU 1336651776,1336653823,DE 1336653824,1336655871,CZ 1336655872,1336657919,NL @@ -12616,11 +27489,14 @@ 1336786944,1336803327,JO 1336803328,1336811519,UA 1336811520,1336827903,RU +1336827904,1336836095,AT 1336836096,1336852479,RU -1336852480,1336868863,DE +1336852480,1336868863,FR 1336868864,1336885247,RU 1336885248,1336901631,RS -1336901632,1336918015,IR +1336901632,1336911103,IR +1336911104,1336911359,SE +1336911360,1336918015,IR 1336918016,1336934399,PL 1336934400,1337458687,IL 1337458688,1337982975,PL @@ -12641,8 +27517,8 @@ 1342628664,1342628671,IE 1342628672,1342701567,GB 1342701568,1342981887,FR -1342981888,1342981903,GB -1342981904,1342982143,FR +1342981888,1342981935,GB +1342981936,1342982143,FR 1342982144,1342982399,MG 1342982400,1342988287,FR 1342988288,1342989055,US @@ -12656,13 +27532,17 @@ 1343217664,1343218687,MU 1343218688,1343219711,FR 1343219712,1343219967,KR -1343219968,1343220223,FR -1343220224,1343220479,US -1343220480,1343220735,DE +1343219968,1343220479,FR +1343220480,1343220639,DE +1343220640,1343220735,FR 1343220736,1343220863,GB 1343220864,1343221023,FR 1343221024,1343221027,DE -1343221028,1343221503,FR +1343221028,1343221031,FR +1343221032,1343221039,GB +1343221040,1343221439,FR +1343221440,1343221447,GB +1343221448,1343221503,FR 1343221504,1343221759,GB 1343221760,1343221823,LB 1343221824,1343221855,FR @@ -12672,22 +27552,17 @@ 1343222528,1343222575,TD 1343222576,1343222783,FR 1343222784,1343222911,TD -1343222912,1343223039,FR -1343223040,1343223434,MG -1343223435,1343223439,FR -1343223440,1343223447,MG -1343223448,1343223531,FR -1343223532,1343223547,MG -1343223548,1343223551,FR +1343222912,1343223551,FR 1343223552,1343223807,LB -1343223808,1343223983,MG -1343223984,1343224063,FR +1343223808,1343224063,FR 1343224064,1343224303,US 1343224304,1343224319,FR 1343224320,1343224535,LB 1343224536,1343224543,FR 1343224544,1343224575,LB -1343224576,1343225855,FR +1343224576,1343224831,FR +1343224832,1343225087,A2 +1343225088,1343225855,FR 1343225856,1343750143,IT 1343750144,1344798719,ES 1344798720,1345323007,GB @@ -12701,15 +27576,56 @@ 1346379776,1346383871,ES 1346383872,1346387967,GB 1346387968,1346392063,HU -1346392064,1346400255,RU +1346392064,1346396159,UA +1346396160,1346400255,RU 1346400256,1346404351,IT -1346404352,1346408447,AT +1346404352,1346404859,AT +1346404860,1346404863,NL +1346404864,1346404927,AT +1346404928,1346404943,NL +1346404944,1346405087,AT +1346405088,1346405103,NL +1346405104,1346405135,AT +1346405136,1346405199,NL +1346405200,1346405255,AT +1346405256,1346405263,NL +1346405264,1346405319,AT +1346405320,1346405351,NL +1346405352,1346405663,AT +1346405664,1346405887,NL +1346405888,1346406159,AT +1346406160,1346406231,NL +1346406232,1346406255,AT +1346406256,1346406258,NL +1346406259,1346406259,AT +1346406260,1346406263,NL +1346406264,1346406271,AT +1346406272,1346406295,NL +1346406296,1346406351,AT +1346406352,1346406359,NL +1346406360,1346406495,AT +1346406496,1346406503,NL +1346406504,1346406543,AT +1346406544,1346406575,NL +1346406576,1346406655,AT +1346406656,1346406671,NL +1346406672,1346406919,AT +1346406920,1346406927,NL +1346406928,1346406951,AT +1346406952,1346406975,NL +1346406976,1346406991,AT +1346406992,1346407039,NL +1346407040,1346407167,AT +1346407168,1346407183,NL +1346407184,1346407207,AT +1346407208,1346407295,NL +1346407296,1346408447,AT 1346408448,1346412543,LU +1346412544,1346416639,RU 1346416640,1346420735,DE 1346420736,1346424831,NO -1346428928,1346431103,FR -1346431104,1346431119,MA -1346431120,1346431743,FR +1346424832,1346428927,JO +1346428928,1346431743,FR 1346431744,1346431999,KZ 1346432000,1346433023,FR 1346433024,1346439167,NL @@ -12723,13 +27639,38 @@ 1346453504,1346461695,BA 1346461696,1346469887,NL 1346469888,1346473983,BE -1346473984,1346478079,IT +1346473984,1346477823,IT +1346477824,1346477855,HU +1346477856,1346478079,IT 1346478080,1346482175,BA 1346482176,1346486271,CZ 1346486272,1346490367,SE 1346490368,1346494463,GB 1346494464,1346498559,FR -1346498560,1346502655,GB +1346498560,1346499967,IM +1346499968,1346499983,GB +1346499984,1346500607,IM +1346500608,1346500639,GB +1346500640,1346500735,IM +1346500736,1346500767,GB +1346500768,1346500863,IM +1346500864,1346501151,GB +1346501152,1346501247,IM +1346501248,1346501343,GB +1346501344,1346501375,IM +1346501376,1346501743,GB +1346501744,1346501751,IM +1346501752,1346501795,GB +1346501796,1346501823,IM +1346501824,1346501848,GB +1346501849,1346501879,IM +1346501880,1346502319,GB +1346502320,1346502323,IM +1346502324,1346502463,GB +1346502464,1346502527,IM +1346502528,1346502559,GB +1346502560,1346502591,IM +1346502592,1346502655,GB 1346502656,1346510847,DE 1346510848,1346519039,AT 1346519040,1346527231,RU @@ -12742,13 +27683,17 @@ 1346538000,1346538007,CZ 1346538008,1346538015,BE 1346538016,1346538031,CH -1346538032,1346539519,BE +1346538032,1346538143,BE +1346538144,1346538175,HR +1346538176,1346539519,BE 1346539520,1346543615,RU 1346543616,1346547711,FI 1346547712,1346551807,IR 1346551808,1346555903,DE 1346555904,1346559999,IT -1346560000,1346564095,LI +1346560000,1346563071,LI +1346563072,1346563327,CH +1346563328,1346564095,LI 1346564096,1346568191,EE 1346568192,1346572287,SE 1346572288,1346576383,DE @@ -12761,6 +27706,7 @@ 1346589696,1346592767,US 1346592768,1346596863,ES 1346596864,1346600959,IT +1346600960,1346605055,DZ 1346605056,1346609151,CH 1346609152,1346617343,FR 1346617344,1346620415,SE @@ -12770,7 +27716,7 @@ 1346625536,1346629631,DE 1346629632,1346637823,RU 1346637824,1346650111,GB -1346650112,1346654207,IT +1346650112,1346654207,RU 1346654208,1346658303,GB 1346658304,1346666495,SE 1346666496,1346670591,ES @@ -12784,57 +27730,48 @@ 1346700576,1346700591,VG 1346700592,1346700608,GB 1346700609,1346700623,US -1346700624,1346700671,GB -1346700672,1346700735,US -1346700736,1346700847,GB +1346700624,1346700847,GB 1346700848,1346700855,US 1346700856,1346701184,GB 1346701185,1346701215,GR 1346701216,1346703871,GB 1346703872,1346704127,LI -1346704128,1346704383,GB -1346704384,1346704447,US -1346704448,1346704639,GB +1346704128,1346704479,GB +1346704480,1346704511,US +1346704512,1346704639,GB 1346704640,1346704767,LI 1346704768,1346707455,GB 1346707456,1346711551,DE 1346711552,1346715647,AZ 1346715648,1346723839,NL 1346723840,1346732031,DE -1346732032,1346736127,JO +1346732032,1346736127,GB 1346736128,1346740223,RU -1346740224,1346744319,NL +1346740224,1346744319,FI 1346744320,1346748415,RU 1346748416,1346752511,DE 1346752512,1346756607,FR 1346756608,1346760703,SE -1346760704,1346764799,AT -1346764800,1346768895,NL +1346760704,1346764799,IR +1346764800,1346768895,DK 1346768896,1346772991,LV -1346772992,1346775071,FR -1346775072,1346775103,DE -1346775104,1346777087,FR +1346772992,1346777087,FR 1346777088,1346781183,GB 1346781184,1346789375,UA 1346789376,1346793471,RU 1346793472,1346797567,IT 1346797568,1346801663,IL 1346801664,1346805759,SE -1346805760,1346806079,DE -1346806080,1346806111,GB -1346806112,1346806167,DE -1346806168,1346806207,SE -1346806208,1346813951,DE -1346813952,1346822143,FR +1346805760,1346818047,DE +1346818048,1346822143,FR 1346822144,1346826239,RU -1346826240,1346830335,CS +1346826240,1346830335,RS 1346830336,1346838527,GB 1346838528,1346842623,RU 1346842624,1346846719,MT 1346846720,1346854911,DK 1346854912,1346859007,MT 1346859008,1346863103,IR -1346863104,1346867199,TR 1346867200,1346871295,BA 1346871296,1346879487,RU 1346879488,1346883583,FI @@ -12846,7 +27783,7 @@ 1346904064,1346908159,PL 1346908160,1346912255,LI 1346912256,1346920447,BG -1346920448,1346924543,IT +1346920448,1346924543,KE 1346924544,1346928639,RU 1346928640,1346932735,DE 1346932736,1346936831,DK @@ -12870,11 +27807,23 @@ 1347002368,1347006463,RU 1347006464,1347010559,SE 1347010560,1347014655,RU -1347014656,1347018751,GB +1347014656,1347018751,GG 1347018752,1347022847,IT -1347022848,1347024895,AT -1347024896,1347025151,GB -1347025152,1347026943,AT +1347022848,1347024911,AT +1347024912,1347024927,GB +1347024928,1347024959,AT +1347024960,1347025071,GB +1347025072,1347025079,FR +1347025080,1347025087,GB +1347025088,1347025103,AT +1347025104,1347025111,FR +1347025112,1347025119,GB +1347025120,1347025151,AT +1347025152,1347025215,US +1347025216,1347025279,GB +1347025280,1347025343,ES +1347025344,1347025407,DE +1347025408,1347026943,AT 1347026944,1347035135,GB 1347035136,1347039231,CZ 1347039232,1347043327,RO @@ -12882,13 +27831,7 @@ 1347047424,1347051519,SA 1347051520,1347059711,IL 1347059712,1347067903,CH -1347067904,1347071743,CS -1347071744,1347071751,CS -1347071752,1347071759,CS -1347071760,1347071767,CS -1347071768,1347071775,CS -1347071776,1347071791,CS -1347071792,1347071999,CS +1347067904,1347071999,RS 1347072000,1347076095,IT 1347076096,1347084287,FI 1347084288,1347092479,GB @@ -12901,20 +27844,24 @@ 1347121152,1347125247,CH 1347125248,1347129343,RU 1347129344,1347133439,GB +1347133440,1347141631,EG 1347141632,1347145727,CH 1347145728,1347146239,GB -1347146240,1347146751,FR -1347146752,1347149823,GB +1347146240,1347147263,FR +1347147264,1347147775,GB +1347147776,1347148287,DE +1347148288,1347148543,GB +1347148544,1347149823,FR 1347149824,1347153919,HU 1347153920,1347158015,AT 1347158016,1347162111,CH 1347162112,1347166207,IT 1347166208,1347174399,GR -1347174400,1347186687,IT +1347174400,1347182591,IT 1347186688,1347190783,GB 1347190784,1347194879,RU 1347194880,1347198975,SE -1347198976,1347203071,BA +1347198976,1347203071,QA 1347203072,1347207167,RU 1347207168,1347210735,GB 1347210736,1347210743,IE @@ -12929,8 +27876,8 @@ 1347219456,1347223551,KW 1347223552,1347223807,EG 1347223808,1347224063,HK -1347224064,1347224319,US -1347224320,1347224575,EG +1347224064,1347224183,US +1347224184,1347224575,EG 1347224576,1347224831,US 1347224832,1347225599,EG 1347225600,1347226623,PK @@ -12939,34 +27886,36 @@ 1347227392,1347227647,EG 1347227648,1347229311,DE 1347229312,1347229343,AT -1347229344,1347229727,DE -1347229728,1347229743,AT -1347229744,1347231743,DE +1347229344,1347231071,DE +1347231072,1347231087,AT +1347231088,1347231095,GR +1347231096,1347231743,DE 1347231744,1347235839,UA -1347235840,1347239935,IT +1347235840,1347239935,GE 1347239936,1347244031,DK 1347244032,1347247359,GB 1347247360,1347247871,RU -1347247872,1347247872,GB -1347247873,1347248127,US +1347247872,1347248127,US 1347248128,1347248863,SE 1347248864,1347248864,FI 1347248865,1347249343,SE 1347249344,1347249375,FI -1347249376,1347250687,SE +1347249376,1347249631,SE +1347249632,1347249639,RU +1347249640,1347250687,SE 1347250688,1347250691,NO 1347250692,1347250695,SE 1347250696,1347250735,NO 1347250736,1347250767,SE 1347250768,1347250783,FI 1347250784,1347252223,SE -1347252224,1347256319,HU +1347252224,1347255903,HU +1347255904,1347255919,SC +1347255920,1347256319,HU 1347256320,1347260415,FO 1347260416,1347264511,MK -1347264512,1347268607,JO -1347268608,1347271935,LB -1347271936,1347272447,IQ -1347272448,1347272703,LB +1347264512,1347268607,RU +1347268608,1347272703,LB 1347272704,1347276799,MT 1347276800,1347278831,DE 1347278832,1347278847,BR @@ -12982,20 +27931,20 @@ 1347293312,1347293319,LR 1347293320,1347293327,GA 1347293328,1347293335,NG -1347293336,1347293339,SE +1347293336,1347293339,A2 1347293340,1347293343,SO -1347293344,1347293351,SE +1347293344,1347293351,A2 1347293352,1347293391,NG 1347293392,1347293399,CY 1347293400,1347293407,IQ 1347293408,1347293415,NG -1347293416,1347293423,SE +1347293416,1347293423,A2 1347293424,1347293431,GN 1347293432,1347293439,NG -1347293440,1347293447,SE +1347293440,1347293447,A2 1347293448,1347293455,GB 1347293456,1347293463,NG -1347293464,1347293471,SE +1347293464,1347293471,A2 1347293472,1347293479,IQ 1347293480,1347293487,LR 1347293488,1347293495,TD @@ -13006,17 +27955,15 @@ 1347293528,1347293535,NG 1347293536,1347293543,GH 1347293544,1347293551,US -1347293552,1347293559,SE +1347293552,1347293559,A2 1347293560,1347293567,GN 1347293568,1347293575,GH 1347293576,1347293583,IQ 1347293584,1347293591,AF -1347293592,1347293599,SE +1347293592,1347293599,A2 1347293600,1347293607,NG -1347293608,1347293615,SE -1347293616,1347293623,US -1347293624,1347293631,PK -1347293632,1347293639,US +1347293608,1347293615,A2 +1347293616,1347293639,US 1347293640,1347293647,IQ 1347293648,1347293655,US 1347293656,1347293675,GN @@ -13024,9 +27971,9 @@ 1347293680,1347293687,GN 1347293688,1347293723,NG 1347293724,1347293727,IQ -1347293728,1347293735,SE +1347293728,1347293735,A2 1347293736,1347293759,GN -1347293760,1347293767,NG +1347293760,1347293767,US 1347293768,1347293775,CM 1347293776,1347293799,NG 1347293800,1347293807,IQ @@ -13038,7 +27985,7 @@ 1347293848,1347293855,BH 1347293856,1347293863,GN 1347293864,1347293871,GB -1347293872,1347293879,SE +1347293872,1347293879,A2 1347293880,1347293887,NG 1347293888,1347293903,GQ 1347293904,1347293911,NG @@ -13046,7 +27993,7 @@ 1347293920,1347293927,GB 1347293928,1347293935,US 1347293936,1347293943,NG -1347293944,1347293951,SE +1347293944,1347293951,A2 1347293952,1347293959,NG 1347293960,1347293967,GN 1347293968,1347293975,NG @@ -13054,7 +28001,7 @@ 1347293984,1347293991,US 1347293992,1347293999,NG 1347294000,1347294007,US -1347294008,1347294015,SE +1347294008,1347294015,A2 1347294016,1347294023,US 1347294024,1347294039,GN 1347294040,1347294047,GB @@ -13062,11 +28009,11 @@ 1347294056,1347294063,NG 1347294064,1347294071,GH 1347294072,1347294079,NG -1347294080,1347294087,SE +1347294080,1347294087,A2 1347294088,1347294095,US 1347294096,1347294111,CM 1347294112,1347294119,GN -1347294120,1347294127,SE +1347294120,1347294127,A2 1347294128,1347294135,NG 1347294136,1347294143,LR 1347294144,1347294151,NG @@ -13074,77 +28021,83 @@ 1347294160,1347294167,CM 1347294168,1347294175,GB 1347294176,1347294183,NG -1347294184,1347294191,SE +1347294184,1347294191,A2 1347294192,1347294199,GB 1347294200,1347294207,NG -1347294208,1347294215,SE +1347294208,1347294215,A2 1347294216,1347294223,IQ -1347294224,1347294231,SE +1347294224,1347294231,A2 1347294232,1347294239,US -1347294240,1347294271,SE +1347294240,1347294271,A2 1347294272,1347294279,BH 1347294280,1347294287,BD 1347294288,1347294303,UG 1347294304,1347294311,US -1347294312,1347294319,SE +1347294312,1347294319,A2 1347294320,1347294327,NG -1347294328,1347294343,SE +1347294328,1347294343,A2 1347294344,1347294351,CM 1347294352,1347294367,LR 1347294368,1347294375,NG -1347294376,1347294383,SE +1347294376,1347294383,A2 1347294384,1347294399,NG -1347294400,1347294407,SE +1347294400,1347294407,A2 1347294408,1347294415,GN -1347294416,1347294423,SE +1347294416,1347294423,A2 1347294424,1347294431,KW 1347294432,1347294435,US -1347294436,1347294439,SE +1347294436,1347294439,A2 1347294440,1347294447,SO 1347294448,1347294975,US -1347294976,1347294991,SE +1347294976,1347294991,A2 1347294992,1347295007,NG -1347295008,1347295039,SE +1347295008,1347295039,A2 1347295040,1347295047,GB 1347295048,1347295055,IQ 1347295056,1347295063,AF -1347295064,1347295071,SE +1347295064,1347295071,A2 1347295072,1347295079,US 1347295080,1347295087,NG -1347295088,1347295095,SE +1347295088,1347295095,A2 1347295096,1347295103,NG -1347295104,1347295143,SE +1347295104,1347295143,A2 1347295144,1347295151,IQ 1347295152,1347295159,US -1347295160,1347295199,SE +1347295160,1347295199,A2 1347295200,1347295215,GB -1347295216,1347295223,SE +1347295216,1347295223,A2 1347295224,1347295231,CH -1347295232,1347295743,SE +1347295232,1347295743,A2 1347295744,1347295755,US -1347295756,1347295759,SE +1347295756,1347295759,A2 1347295760,1347295775,US 1347295776,1347295783,IQ -1347295784,1347295999,SE +1347295784,1347295999,A2 1347296000,1347296015,US -1347296016,1347297279,SE +1347296016,1347297279,A2 1347297280,1347305471,UA 1347305472,1347309567,AL -1347309568,1347313663,DE +1347309568,1347309839,DE +1347309840,1347309855,CH +1347309856,1347313663,DE 1347313664,1347321855,RU 1347321856,1347323775,KW 1347323776,1347323903,IR 1347323904,1347325183,KW 1347325184,1347325439,SA 1347325440,1347325951,KW -1347325952,1347329535,CZ +1347325952,1347327231,CZ +1347327232,1347327487,SK +1347327488,1347327743,CZ +1347327744,1347327999,SK +1347328000,1347329535,CZ 1347329536,1347329599,SK 1347329600,1347330047,CZ 1347330048,1347338239,DE 1347338240,1347342335,RU 1347342336,1347346431,SE -1347346432,1347354623,AT -1347354624,1347358719,PT +1347346432,1347350527,BG +1347350528,1347354623,RU 1347358720,1347362815,CZ 1347362816,1347366911,NL 1347366912,1347371007,IT @@ -13156,7 +28109,8 @@ 1347391488,1347395583,LB 1347395584,1347399679,SE 1347399680,1347403775,RU -1347403776,1347411967,NL +1347403776,1347407871,NL +1347407872,1347411967,GB 1347411968,1347416063,DE 1347416064,1347420159,RU 1347420160,1347420671,DK @@ -13165,67 +28119,75 @@ 1347420792,1347420799,US 1347420800,1347420831,DK 1347420832,1347420847,US -1347420848,1347423775,DK +1347420848,1347420991,DK +1347420992,1347421007,CH +1347421008,1347423775,DK 1347423776,1347423807,NO 1347423808,1347424339,DK 1347424340,1347424351,NO 1347424352,1347427135,DK 1347427136,1347427327,NO 1347427328,1347428351,DK -1347428352,1347432447,IT 1347432448,1347436543,HR 1347436544,1347440639,SE 1347440640,1347444735,ES 1347444736,1347452927,RU 1347452928,1347461119,BG -1347461120,1347465215,CS -1347465216,1347473407,GB +1347461120,1347461671,AL +1347461672,1347461679,RS +1347461680,1347462023,AL +1347462024,1347462031,RS +1347462032,1347462579,AL +1347462580,1347462583,RS +1347462584,1347462591,AL +1347462592,1347462607,RS +1347462608,1347465215,AL +1347465216,1347469311,GB +1347469312,1347473407,RU 1347473408,1347477503,UZ -1347477504,1347480303,CH -1347480304,1347480319,GB -1347480320,1347481599,CH +1347477504,1347481599,CH 1347481600,1347485695,AT 1347485696,1347493887,DE 1347493888,1347502079,LV 1347502080,1347503103,ES 1347503104,1347503359,GB 1347503360,1347504383,ES -1347504384,1347504639,US -1347504640,1347506175,ES -1347506176,1347510271,FR +1347504384,1347504639,GB +1347504640,1347504959,ES +1347504960,1347505023,GB +1347505024,1347505151,ES +1347505152,1347505407,GB +1347505408,1347505663,DE +1347505664,1347506175,ES +1347506176,1347506431,GB +1347506432,1347510271,FR 1347510272,1347518463,ES 1347518464,1347522559,AT 1347522560,1347526655,LB -1347526656,1347527951,FI -1347527952,1347528015,SE -1347528016,1347528319,FI -1347528320,1347528351,SE -1347528352,1347528639,FI -1347528640,1347528703,SE -1347528704,1347528959,FI -1347528960,1347529087,SE -1347529088,1347529471,FI -1347529472,1347529983,SE -1347529984,1347534847,FI +1347526656,1347527967,FI +1347527968,1347527999,SE +1347528000,1347534847,FI 1347534848,1347538943,DE 1347538944,1347543039,RU 1347543040,1347544063,SK 1347544064,1347544319,SL 1347544320,1347547135,SK -1347547136,1347551231,DE +1347547136,1347550303,DE +1347550304,1347550335,AT +1347550336,1347551167,DE +1347551168,1347551231,PL 1347551232,1347555327,IT -1347555328,1347559423,FR +1347555328,1347559423,PL 1347559424,1347567615,RU -1347567616,1347571711,CH +1347567616,1347571711,NL 1347571712,1347575807,RU 1347575808,1347579903,DK 1347579904,1347588095,GB -1347588096,1347590911,CZ -1347590912,1347591167,PL -1347591168,1347592191,CZ +1347588096,1347592191,CZ 1347592192,1347600383,RU 1347600384,1347604479,IT 1347604480,1347608575,DE +1347608576,1347612671,FR 1347612672,1347616767,GB 1347616768,1347620863,FI 1347620864,1347624959,LB @@ -13249,10 +28211,12 @@ 1347670016,1347674111,SE 1347674112,1347682303,RU 1347682304,1347686399,DE -1347688736,1347688743,BE +1347686400,1347688743,EU 1347688744,1347688751,ET 1347688752,1347688767,SN +1347688768,1347688959,EU 1347688960,1347689343,BE +1347689344,1347690495,EU 1347690496,1347694591,SE 1347694592,1347706879,GB 1347706880,1347710975,IT @@ -13263,9 +28227,7 @@ 1347716152,1347716159,LB 1347716160,1347716207,ES 1347716208,1347716223,CY -1347716224,1347718367,ES -1347718368,1347718399,IR -1347718400,1347719711,ES +1347716224,1347719711,ES 1347719712,1347719719,SO 1347719720,1347722495,ES 1347722496,1347722751,LB @@ -13282,20 +28244,25 @@ 1347754888,1347754888,CY 1347754889,1347754894,GR 1347754895,1347754895,CY -1347754896,1347754903,GR -1347754904,1347754935,CY +1347754896,1347754919,GR +1347754920,1347754927,CY +1347754928,1347754935,GR 1347754936,1347754943,RS 1347754944,1347754951,CY 1347754952,1347754959,TN 1347754960,1347754967,MA 1347754968,1347754983,GR 1347754984,1347754991,CY -1347754992,1347755063,GR -1347755064,1347755079,CY -1347755080,1347755112,GR +1347754992,1347755112,GR 1347755113,1347755119,CY -1347755120,1347755175,GR -1347755176,1347756031,CY +1347755120,1347755191,GR +1347755192,1347755223,CY +1347755224,1347755231,GR +1347755232,1347755239,CY +1347755240,1347755247,GR +1347755248,1347755263,CY +1347755264,1347755775,GR +1347755776,1347756031,CY 1347756032,1347760127,NL 1347760128,1347764223,HU 1347764224,1347772415,GB @@ -13308,9 +28275,9 @@ 1347796992,1347801087,DE 1347801088,1347805183,GB 1347805184,1347809279,PL -1347809280,1347813375,IT +1347809280,1347813375,RU 1347813376,1347817471,DE -1347817472,1347821567,IT +1347817472,1347821567,A2 1347821568,1347822343,GB 1347822344,1347822351,NL 1347822352,1347825663,GB @@ -13318,53 +28285,81 @@ 1347829760,1347833855,SE 1347833856,1347836223,DE 1347836224,1347836255,SE -1347836256,1347836575,DE -1347836576,1347836607,LT -1347836608,1347837951,DE +1347836256,1347837951,DE 1347837952,1347846143,RO 1347846144,1347850239,NO 1347850240,1347854335,IT 1347854336,1347854871,DE +1347854872,1347854879,EU 1347854880,1347854887,DE +1347854888,1347854911,EU 1347854912,1347855071,DE +1347855072,1347855079,EU 1347855080,1347855103,DE 1347855104,1347855359,CH 1347855360,1347855935,DE -1347855944,1347855967,DE -1347856000,1347856071,DE -1347856080,1347856243,DE -1347856256,1347856431,DE -1347856448,1347856471,DE -1347856480,1347856639,DE +1347855936,1347855943,EU +1347855944,1347855951,DE +1347855952,1347855959,EU +1347855960,1347855967,DE +1347855968,1347855999,EU +1347856000,1347856063,DE +1347856064,1347856079,EU +1347856080,1347856239,DE +1347856240,1347856255,EU +1347856256,1347856383,DE +1347856384,1347856391,EU +1347856392,1347856415,DE +1347856416,1347856423,EU +1347856424,1347856431,DE +1347856432,1347856447,EU +1347856448,1347856639,DE 1347856640,1347856895,AT 1347856896,1347858495,DE +1347858496,1347858503,EU 1347858504,1347858527,DE +1347858528,1347858559,EU 1347858560,1347858575,DE +1347858576,1347858591,EU 1347858592,1347858631,DE -1347858640,1347858719,DE -1347858816,1347858943,DE -1347859200,1347859351,DE +1347858632,1347858639,EU +1347858640,1347859351,DE +1347859352,1347859359,EU 1347859360,1347859383,DE +1347859384,1347859407,EU 1347859408,1347859439,DE -1347859456,1347860735,DE -1347860992,1347861247,DE +1347859440,1347859455,EU +1347859456,1347860863,DE +1347860864,1347860879,EU +1347860880,1347860895,DE +1347860896,1347860911,EU +1347860912,1347861395,DE +1347861396,1347861399,EU +1347861400,1347861471,DE +1347861472,1347861503,EU 1347861504,1347861759,DE -1347861800,1347861815,DE +1347861760,1347861799,EU +1347861800,1347861823,DE +1347861824,1347861943,EU 1347861944,1347861951,DE +1347861952,1347862111,EU 1347862112,1347862143,DE +1347862144,1347862279,EU +1347862280,1347862287,DE +1347862288,1347862303,EU 1347862304,1347862431,DE -1347862448,1347862471,DE -1347862480,1347862487,DE -1347862496,1347862527,DE +1347862432,1347862463,EU +1347862464,1347862527,DE 1347862528,1347866623,CH 1347866624,1347870719,NO 1347870720,1347874815,AM -1347874816,1347878911,RU -1347878912,1347883007,GB -1347883008,1347887103,IT -1347887104,1347891199,RU -1347891200,1347895295,TR -1347903488,1347907583,FR +1347874816,1347878911,SK +1347878912,1347887103,GB +1347887104,1347891199,PL +1347891200,1347895287,SE +1347895288,1347895295,GB +1347895296,1347903487,GH +1347903488,1347907583,RU 1347907584,1347911679,DE 1347911680,1347915775,GB 1347915776,1347919871,RU @@ -13374,256 +28369,142 @@ 1347932160,1347936255,SK 1347936256,1347940351,FR 1347940352,1347944447,BA +1347944448,1347948543,DZ 1347948544,1347952639,DE 1347952640,1347956735,BE 1347956736,1347960831,RU 1347960832,1347964927,DE 1347964928,1347969023,IT 1347969024,1347977215,SE -1347977216,1347977471,DK -1347977472,1347977599,NG -1347977600,1347977791,DK -1347977792,1347977951,NG -1347977952,1347977983,DK -1347977984,1347977991,NG -1347977992,1347977999,DK -1347978000,1347978047,NG -1347978048,1347978055,ZW -1347978056,1347978063,SD -1347978064,1347978079,NG -1347978080,1347978111,DK -1347978112,1347978135,NG -1347978136,1347978143,DK -1347978144,1347978199,NG -1347978200,1347978207,IQ -1347978208,1347978215,DK -1347978216,1347978231,NG -1347978232,1347978239,DK -1347978240,1347978279,NG -1347978280,1347978287,IQ -1347978288,1347978319,NG -1347978320,1347978327,CG -1347978328,1347978359,NG -1347978360,1347978367,IQ -1347978368,1347978407,NG -1347978408,1347978415,MZ -1347978416,1347978423,ET -1347978424,1347978431,RW -1347978432,1347978463,NG -1347978464,1347978471,DK -1347978472,1347978479,NG -1347978480,1347978487,TZ -1347978488,1347978495,YE -1347978496,1347978623,NG -1347978624,1347978751,DK -1347978752,1347978831,NG -1347978832,1347978847,DK +1347977216,1347977599,A2 +1347977600,1347977607,NG +1347977608,1347978007,A2 +1347978008,1347978015,NG +1347978016,1347978023,A2 +1347978024,1347978039,NG +1347978040,1347978143,A2 +1347978144,1347978159,NG +1347978160,1347978191,A2 +1347978192,1347978199,NG +1347978200,1347978263,A2 +1347978264,1347978271,NG +1347978272,1347978287,A2 +1347978288,1347978295,NG +1347978296,1347978303,A2 +1347978304,1347978327,NG +1347978328,1347978343,A2 +1347978344,1347978359,NG +1347978360,1347978375,A2 +1347978376,1347978407,NG +1347978408,1347978447,A2 +1347978448,1347978463,NG +1347978464,1347978575,A2 +1347978576,1347978655,NG +1347978656,1347978719,A2 +1347978720,1347978735,NG +1347978736,1347978775,A2 +1347978776,1347978783,NG +1347978784,1347978847,A2 1347978848,1347978855,NG -1347978856,1347978863,GB -1347978864,1347978871,NG -1347978872,1347978879,IQ -1347978880,1347978895,DK -1347978896,1347978911,NG -1347978912,1347978943,IQ -1347978944,1347979007,AO -1347979008,1347979039,NG -1347979040,1347979055,AO -1347979056,1347979143,NG -1347979144,1347979151,MZ -1347979152,1347979159,DK +1347978856,1347978935,A2 +1347978936,1347978943,NG +1347978944,1347979055,A2 +1347979056,1347979071,NG +1347979072,1347979135,A2 +1347979136,1347979143,NG +1347979144,1347979159,A2 1347979160,1347979167,NG -1347979168,1347979183,IQ -1347979184,1347979263,NG -1347979264,1347979279,IQ -1347979280,1347979287,UG -1347979288,1347979311,NG -1347979312,1347979319,CG -1347979320,1347979327,IQ -1347979328,1347979335,AO -1347979336,1347979343,NG -1347979344,1347979359,DK -1347979360,1347979367,NG -1347979368,1347979375,DK +1347979168,1347979215,A2 +1347979216,1347979223,NG +1347979224,1347979231,A2 +1347979232,1347979247,NG +1347979248,1347979375,A2 1347979376,1347979399,NG -1347979400,1347979407,KM -1347979408,1347979423,IQ -1347979424,1347979495,NG -1347979496,1347979503,CI -1347979504,1347979511,MA -1347979512,1347979519,KE -1347979520,1347979535,NG -1347979536,1347979543,UG -1347979544,1347979551,NG -1347979552,1347979559,IQ -1347979560,1347979567,SO -1347979568,1347979591,NG -1347979592,1347979607,IQ -1347979608,1347979623,NG -1347979624,1347979631,CM -1347979632,1347979647,IQ -1347979648,1347979663,DK -1347979664,1347979679,GB -1347979680,1347979751,NG -1347979752,1347979759,AE -1347979760,1347979775,NG -1347979776,1347979783,DK -1347979784,1347979791,NA -1347979792,1347979807,NG -1347979808,1347979839,DK -1347979840,1347979847,BI -1347979848,1347979863,NG -1347979864,1347979871,NA -1347979872,1347979903,NG -1347979904,1347979935,DK -1347979936,1347979967,NG -1347979968,1347979975,KE -1347979976,1347979999,NG -1347980000,1347980031,TR -1347980032,1347980039,NG -1347980040,1347980047,FO -1347980048,1347980063,NG -1347980064,1347980071,UG -1347980072,1347980079,AO +1347979400,1347979567,A2 +1347979568,1347979575,NG +1347979576,1347979583,A2 +1347979584,1347979591,NG +1347979592,1347979743,A2 +1347979744,1347979751,NG +1347979752,1347980079,A2 1347980080,1347980095,GH 1347980096,1347980111,NG 1347980112,1347980127,GN -1347980128,1347980151,NG -1347980152,1347980159,UG -1347980160,1347980175,NG -1347980176,1347980183,TZ -1347980184,1347980271,NG +1347980128,1347980167,A2 +1347980168,1347980175,NG +1347980176,1347980223,A2 +1347980224,1347980271,NG 1347980272,1347980287,DK -1347980288,1347980543,NG +1347980288,1347980415,A2 +1347980416,1347980479,NG +1347980480,1347980543,A2 1347980544,1347980559,DK -1347980560,1347980639,NG -1347980640,1347980647,DK -1347980648,1347980655,NG -1347980656,1347980671,DK -1347980672,1347980703,NG -1347980704,1347980735,TR -1347980736,1347980799,NG -1347980800,1347980991,IQ -1347980992,1347980999,KE -1347981000,1347981031,NG -1347981032,1347981039,IQ -1347981040,1347981055,NG -1347981056,1347981183,IQ +1347980560,1347981007,A2 +1347981008,1347981015,NG +1347981016,1347981023,A2 +1347981024,1347981031,NG +1347981032,1347981183,A2 1347981184,1347981191,NG -1347981192,1347981199,IQ -1347981200,1347981247,NG -1347981248,1347981255,UG +1347981192,1347981239,A2 +1347981240,1347981247,NG +1347981248,1347981255,A2 1347981256,1347981263,DK -1347981264,1347981271,UG -1347981272,1347981279,NG -1347981280,1347981311,AO -1347981312,1347981887,NG -1347981888,1347981903,UG -1347981904,1347981919,DK -1347981920,1347981943,NG -1347981944,1347981959,IQ -1347981960,1347981983,DK -1347981984,1347981999,AO -1347982000,1347982055,NG -1347982056,1347982063,DK -1347982064,1347982079,IQ -1347982080,1347982087,NG -1347982088,1347982095,DK -1347982096,1347982110,AO -1347982111,1347982143,DK -1347982144,1347982207,NG -1347982208,1347982223,AE +1347981264,1347981927,A2 +1347981928,1347981935,NG +1347981936,1347982031,A2 +1347982032,1347982055,NG +1347982056,1347982223,A2 1347982224,1347982239,NG -1347982240,1347982255,AO -1347982256,1347982279,DK -1347982280,1347982303,NG -1347982304,1347982335,AO -1347982336,1347982847,NG -1347982848,1347982863,DK -1347982864,1347982879,NG -1347982880,1347982887,IQ -1347982888,1347983055,NG -1347983056,1347983063,SE +1347982240,1347982279,A2 +1347982280,1347982287,NG +1347982288,1347982887,A2 +1347982888,1347982895,NG +1347982896,1347982911,A2 +1347982912,1347982919,NG +1347982920,1347982927,A2 +1347982928,1347982943,NG +1347982944,1347983039,A2 +1347983040,1347983047,NG +1347983048,1347983063,A2 1347983064,1347983071,NG -1347983072,1347983087,BJ -1347983088,1347983119,NG -1347983120,1347983231,IQ -1347983232,1347983263,DK -1347983264,1347983271,LS -1347983272,1347983279,IQ -1347983280,1347983287,UG -1347983288,1347983295,NG -1347983296,1347983303,MR +1347983072,1347983103,A2 +1347983104,1347983119,NG +1347983120,1347983247,A2 +1347983248,1347983263,DK +1347983264,1347983303,A2 1347983304,1347983311,NG -1347983312,1347983319,IQ -1347983320,1347983327,NG -1347983328,1347983335,ZM -1347983336,1347983343,MU -1347983344,1347983351,NG -1347983352,1347983359,DK -1347983360,1347983519,NG -1347983520,1347983527,NR -1347983528,1347983551,NG -1347983552,1347983559,DK -1347983560,1347983567,NG -1347983568,1347983583,DK -1347983584,1347983591,AO -1347983592,1347983599,NG -1347983600,1347983615,BJ -1347983616,1347983887,DK -1347983888,1347983935,NG -1347983936,1347983943,UG -1347983944,1347983959,NG -1347983960,1347983967,GN -1347983968,1347983975,NG -1347983976,1347983983,NA -1347983984,1347984303,NG -1347984304,1347984319,DK -1347984320,1347984335,NG -1347984336,1347984343,SZ -1347984344,1347984367,NG -1347984368,1347984375,DK -1347984376,1347984399,NG -1347984400,1347984407,DK -1347984408,1347984415,IQ +1347983312,1347983423,A2 +1347983424,1347983487,NG +1347983488,1347983527,A2 +1347983528,1347983535,NG +1347983536,1347983567,A2 +1347983568,1347983575,NG +1347983576,1347983903,A2 +1347983904,1347983911,NG +1347983912,1347983919,A2 +1347983920,1347983927,NG +1347983928,1347983983,A2 +1347983984,1347984127,NG +1347984128,1347984207,A2 +1347984208,1347984215,NG +1347984216,1347984415,A2 1347984416,1347984423,NG -1347984424,1347984447,DK -1347984448,1347984575,IQ -1347984576,1347984607,NG -1347984608,1347984639,IQ -1347984640,1347984647,MW -1347984648,1347984671,NG -1347984672,1347984703,IQ -1347984704,1347984711,GA -1347984712,1347984751,NG -1347984752,1347984767,DK -1347984768,1347984783,NG -1347984784,1347984791,DK -1347984792,1347984799,CO -1347984800,1347984807,CM -1347984808,1347984815,ZA -1347984816,1347984823,KE -1347984824,1347984831,DK -1347984832,1347984839,ZW -1347984840,1347984847,BJ -1347984848,1347984855,MR -1347984856,1347984863,KE -1347984864,1347984871,UG -1347984872,1347984903,NG -1347984904,1347984927,CG -1347984928,1347984943,NG -1347984944,1347984951,DK -1347984952,1347984999,NG -1347985000,1347985007,UG -1347985008,1347985015,NG -1347985016,1347985023,UG -1347985024,1347985039,NG -1347985040,1347985047,UG -1347985048,1347985063,NG -1347985064,1347985079,CG -1347985080,1347985095,NG -1347985096,1347985103,DK -1347985104,1347985119,NG -1347985120,1347985407,DK +1347984424,1347984647,A2 +1347984648,1347984655,NG +1347984656,1347984719,A2 +1347984720,1347984735,NG +1347984736,1347984879,A2 +1347984880,1347984895,NG +1347984896,1347984935,A2 +1347984936,1347984943,NG +1347984944,1347984959,A2 +1347984960,1347984991,NG +1347984992,1347985031,A2 +1347985032,1347985039,NG +1347985040,1347985095,A2 +1347985096,1347985119,NG +1347985120,1347985151,A2 +1347985152,1347985407,DK 1347985408,1347989503,IT 1347989504,1347993599,FI 1347993600,1348001791,GB @@ -13638,35 +28519,37 @@ 1348038656,1348042751,FR 1348042752,1348050943,RU 1348050944,1348055039,SE -1348055040,1348059135,LB -1348059136,1348063231,JO +1348055040,1348058111,NG +1348058112,1348059135,LB +1348059136,1348063231,RU 1348063232,1348067327,CH 1348067328,1348071423,NL 1348071424,1348075519,DE 1348075520,1348075967,LV 1348075968,1348076031,PA -1348076032,1348076303,LV -1348076304,1348076543,RU +1348076032,1348076287,LV +1348076288,1348076543,RU 1348076544,1348083711,LV -1348083712,1348091903,LU +1348083712,1348086535,LU +1348086536,1348086543,NL +1348086544,1348091903,LU 1348091904,1348095999,RU 1348096000,1348100095,AL 1348100096,1348104191,DE 1348104192,1348108287,RU -1348108288,1348112383,GB +1348108288,1348112383,CZ 1348112384,1348116479,DE 1348116480,1348120575,JO 1348120576,1348124671,RU -1348124672,1348132863,PT +1348124672,1348128767,GB +1348128768,1348132863,SI 1348132864,1348136959,UA -1348136960,1348141055,NO +1348136960,1348141055,RU 1348141056,1348145151,DK 1348145152,1348149247,RU 1348149248,1348153343,NO 1348153344,1348157439,IT -1348157440,1348161535,ES -1348161536,1348162559,PT -1348162560,1348165631,ES +1348157440,1348165631,ES 1348165632,1348169727,DE 1348169728,1348173823,AL 1348173824,1348174591,FI @@ -13676,40 +28559,38 @@ 1348190208,1348194303,RU 1348194304,1348198399,GR 1348198400,1348202495,NO +1348202496,1348206591,EU 1348206592,1348218879,RU -1348218880,1348219167,DE -1348219168,1348219183,IQ -1348219184,1348219247,DE -1348219248,1348219263,IQ -1348219264,1348219295,BH -1348219296,1348219327,DE -1348219328,1348219391,SA -1348219392,1348219647,DE -1348219648,1348219903,PK -1348219904,1348220415,DE -1348220416,1348220479,SA -1348220480,1348220511,DE -1348220512,1348220543,SA -1348220544,1348220687,DE +1348218880,1348219295,DE +1348219296,1348219327,A2 +1348219328,1348219343,DE +1348219344,1348219359,ZM +1348219360,1348219391,DE +1348219392,1348219647,US +1348219648,1348219903,DE +1348219904,1348220415,LB +1348220416,1348220687,DE 1348220688,1348220703,SA 1348220704,1348220711,DE 1348220712,1348220735,SA 1348220736,1348220799,BH 1348220800,1348220863,DE 1348220864,1348220895,BH -1348220896,1348221951,DE -1348221952,1348222463,PK -1348222464,1348222975,DE +1348220896,1348220927,DE +1348220928,1348221183,US +1348221184,1348222975,DE 1348222976,1348231167,LU 1348231168,1348235263,RU 1348235264,1348239359,AT -1348239360,1348240383,IE -1348240384,1348247551,GB +1348239360,1348241407,SE +1348241408,1348242943,GB +1348242944,1348243455,SE +1348243456,1348247551,GB 1348247552,1348251647,RU 1348251648,1348255743,GE 1348255744,1348263935,RU 1348263936,1348268031,UA -1348268032,1348272127,RU +1348268032,1348272127,CZ 1348272128,1348274695,IE 1348274696,1348274771,CH 1348274772,1348274775,IE @@ -13721,8 +28602,9 @@ 1348274936,1348274943,IE 1348274944,1348275199,CH 1348275200,1348275711,GB -1348275712,1348280319,IE -1348280320,1348284415,FR +1348275712,1348275967,CH +1348275968,1348280319,IE +1348280320,1348284415,AT 1348284416,1348288511,RU 1348288512,1348292607,IT 1348292608,1348296703,FR @@ -13734,15 +28616,16 @@ 1348317184,1348321279,RU 1348321280,1348325375,GB 1348325376,1348329471,TR -1348329472,1348337663,CS +1348329472,1348337663,RS 1348337664,1348341759,ES 1348341760,1348345855,PL 1348345856,1348349951,GB 1348349952,1348354047,SK -1348354048,1348358143,RU +1348354048,1348358143,NL 1348358144,1348362239,DE 1348362240,1348366335,MC 1348366336,1348370431,IT +1348370432,1348374527,DE 1348374528,1348378623,CH 1348378624,1348382719,BY 1348382720,1348386815,FR @@ -13750,14 +28633,19 @@ 1348390912,1348395007,SE 1348395008,1348399103,BY 1348399104,1348403199,MD +1348403200,1348407295,EG 1348407296,1348411391,BG 1348411392,1348415487,RU 1348415488,1348419583,GB 1348419584,1348427775,HU 1348427776,1348435967,CZ 1348435968,1348440063,FI -1348440064,1348444159,DE -1348444160,1348448255,NL +1348440064,1348441215,DE +1348441216,1348441343,NL +1348441344,1348441855,DE +1348441856,1348442111,NL +1348442112,1348443775,DE +1348443776,1348448255,NL 1348448256,1348456447,GB 1348456448,1348460543,BH 1348460544,1348464639,SI @@ -13780,178 +28668,67 @@ 1350091136,1350091199,SA 1350091200,1350091991,AT 1350091992,1350091999,SA -1350092000,1350092375,AT -1350092376,1350092391,IQ -1350092392,1350092467,AT -1350092468,1350092471,DE -1350092472,1350092495,AT -1350092496,1350092503,IQ -1350092504,1350215167,AT +1350092000,1350092287,AT +1350092288,1350092543,A2 +1350092544,1350215167,AT 1350215168,1350215191,IQ 1350215192,1350215679,AT -1350215680,1350215683,SA -1350215684,1350215699,AT -1350215700,1350215703,IQ -1350215704,1350215743,AT -1350215744,1350215751,IQ -1350215752,1350215763,AT -1350215764,1350215767,IQ -1350215768,1350215783,AT -1350215784,1350215787,AE -1350215788,1350215791,IQ -1350215792,1350215903,AT -1350215904,1350215911,IQ -1350215912,1350215971,AT -1350215972,1350215975,IQ -1350215976,1350215987,AT -1350215988,1350215991,DE -1350215992,1350216023,AT -1350216024,1350216031,IQ -1350216032,1350216047,AT -1350216048,1350216055,SA -1350216056,1350216075,AT -1350216076,1350216079,SA -1350216080,1350216095,AT -1350216096,1350216107,SA -1350216108,1350216111,AT -1350216112,1350216123,SA -1350216124,1350216127,IQ -1350216128,1350216151,AT -1350216152,1350216159,SA -1350216160,1350216175,AT -1350216176,1350216183,SA -1350216184,1350216203,AT -1350216204,1350216207,SA -1350216208,1350216211,AT -1350216212,1350216219,SA -1350216220,1350216223,AT -1350216224,1350216227,SA -1350216228,1350216231,AT -1350216232,1350216235,SA -1350216236,1350216239,AT -1350216240,1350216243,SA -1350216244,1350216247,AT -1350216248,1350216251,SA -1350216252,1350216275,AT -1350216276,1350216287,SA -1350216288,1350216295,AT -1350216296,1350216299,SA -1350216300,1350216311,AT -1350216312,1350216315,SA -1350216316,1350216431,AT -1350216432,1350216451,SA -1350216452,1350216455,AT -1350216456,1350216459,SA -1350216460,1350216467,AT -1350216468,1350216471,SA -1350216472,1350216475,IQ -1350216476,1350216479,SA -1350216480,1350216487,DE -1350216488,1350216551,AT -1350216552,1350216555,SA -1350216556,1350216711,AT -1350216712,1350216719,SA -1350216720,1350216723,AT -1350216724,1350216727,SA -1350216728,1350216731,AT -1350216732,1350216735,IQ -1350216736,1350216743,AT -1350216744,1350216759,IQ -1350216760,1350216983,AT -1350216984,1350216987,IQ -1350216988,1350217011,AT -1350217012,1350217015,IQ -1350217016,1350217027,AT -1350217028,1350217031,SA -1350217032,1350217043,AT -1350217044,1350217047,IQ -1350217048,1350217051,SA -1350217052,1350217079,AT -1350217080,1350217083,SA -1350217084,1350217115,AT -1350217116,1350217119,SA -1350217120,1350217135,AT -1350217136,1350217139,SA -1350217140,1350217343,AT -1350217344,1350217347,IQ -1350217348,1350217351,AE -1350217352,1350217403,AT -1350217404,1350217407,SA -1350217408,1350217423,AE -1350217424,1350217455,AT -1350217456,1350217471,IT -1350217472,1350217635,AT -1350217636,1350217639,DE -1350217640,1350217695,AT -1350217696,1350217711,AE -1350217712,1350219775,AT -1350219776,1350221823,IR -1350221824,1350295823,AT +1350215680,1350217727,A2 +1350217728,1350220287,AT +1350220288,1350220543,DE +1350220544,1350295823,AT 1350295824,1350295831,SA 1350295832,1350295847,AT 1350295848,1350295855,SA -1350295856,1350296071,AT -1350296072,1350296079,IQ -1350296080,1350296099,AT -1350296100,1350296103,SA -1350296104,1350296111,IQ -1350296112,1350296119,AT -1350296120,1350296127,IQ -1350296128,1350296199,AT -1350296200,1350296207,SA -1350296208,1350296243,IQ -1350296244,1350296247,AT -1350296248,1350296255,IQ -1350296256,1350296303,AT -1350296304,1350296319,IQ +1350295856,1350296063,AT +1350296064,1350296319,A2 1350296320,1350296327,AT -1350296328,1350296343,IQ +1350296328,1350296343,A2 1350296344,1350296351,AT -1350296352,1350296359,IQ +1350296352,1350296359,A2 1350296360,1350296367,AT -1350296368,1350296387,IQ +1350296368,1350296387,A2 1350296388,1350296391,AT -1350296392,1350296395,IQ +1350296392,1350296395,A2 1350296396,1350296399,AT -1350296400,1350296403,SA -1350296404,1350296419,IQ -1350296420,1350296431,SA -1350296432,1350296439,DE +1350296400,1350296439,A2 1350296440,1350296511,AT -1350296512,1350296519,IQ +1350296512,1350296519,A2 1350296520,1350296539,AT -1350296540,1350296543,SA +1350296540,1350296543,A2 1350296544,1350303743,AT 1350303744,1350434815,FR 1350434816,1350565887,NL -1350565888,1351789119,DE -1351789120,1351789151,BE -1351789152,1351793791,DE +1350565888,1351793791,DE 1351793792,1351793855,GB 1351793856,1351797231,DE 1351797232,1351797239,PL -1351797240,1351800351,DE -1351800352,1351800359,CN -1351800360,1351801327,DE +1351797240,1351801327,DE 1351801328,1351801335,HU -1351801336,1351807391,DE -1351807392,1351807423,GR -1351807424,1351879631,DE +1351801336,1351806975,DE +1351806976,1351807231,IT +1351807232,1351879631,DE 1351879632,1351879639,IT 1351879640,1351879999,DE 1351880000,1351880031,IT -1351880032,1352010239,DE +1351880032,1351965183,DE +1351965184,1351965439,US +1351965440,1351991295,DE +1351991296,1351991551,IT +1351991552,1352002047,DE +1352002048,1352002303,US +1352002304,1352010239,DE 1352010240,1352010495,US 1352010496,1352011447,DE 1352011448,1352011455,IT -1352011456,1352139671,DE +1352011456,1352038695,DE +1352038696,1352038699,US +1352038700,1352139671,DE 1352139672,1352139679,IT 1352139680,1352144519,DE 1352144520,1352144527,IT 1352144528,1352144535,US -1352144536,1352144559,DE -1352144560,1352144575,HK -1352144576,1352147007,DE +1352144536,1352147007,DE 1352147008,1352147015,SE 1352147016,1352147107,DE 1352147108,1352147111,SE @@ -13963,182 +28740,286 @@ 1352147424,1352147431,ES 1352147432,1352147439,DE 1352147440,1352147447,SZ -1352147448,1352271087,DE -1352271088,1352271095,AT -1352271096,1352271871,DE -1352271872,1352271903,GB -1352271904,1352277535,DE +1352147448,1352148151,DE +1352148152,1352148159,IT +1352148160,1352148751,DE +1352148752,1352148759,US +1352148760,1352149415,DE +1352149416,1352149423,FI +1352149424,1352149427,DE +1352149428,1352149451,FR +1352149452,1352149455,DE +1352149456,1352149487,FR +1352149488,1352277535,DE 1352277536,1352277567,IT -1352277568,1352401239,DE -1352401240,1352401247,SK -1352401248,1352402791,DE +1352277568,1352402791,DE 1352402792,1352402799,BE 1352402800,1352404599,DE 1352404600,1352404607,NL -1352404608,1352404991,DE -1352404992,1352405055,NL -1352405056,1352405119,BE -1352405120,1352663039,DE -1352663040,1352680751,DK -1352680752,1352680759,DE -1352680760,1353187327,DK -1353187328,1353255071,GB +1352404608,1352445687,DE +1352445688,1352445703,NL +1352445704,1352663039,DE +1352663040,1353187327,DK +1353187328,1353253791,GB +1353253792,1353253823,FR +1353253824,1353255071,GB 1353255072,1353255087,CA 1353255088,1353255839,GB 1353255840,1353255855,FR -1353255856,1353258239,GB -1353258240,1353258263,SE -1353258264,1353258271,GB +1353255856,1353257111,GB +1353257112,1353257119,ES +1353257120,1353257983,GB +1353257984,1353258247,SE +1353258248,1353258255,GB +1353258256,1353258263,SE +1353258264,1353258271,DK 1353258272,1353258303,SE 1353258304,1353258367,FI 1353258368,1353258415,SE -1353258416,1353258423,GB -1353258424,1353258503,SE -1353258504,1353258783,GB +1353258416,1353258423,DK +1353258424,1353258495,SE +1353258496,1353258503,GB +1353258504,1353258639,SE +1353258640,1353258783,GB 1353258784,1353258807,SE -1353258808,1353266959,GB +1353258808,1353265943,GB +1353265944,1353265951,IE +1353265952,1353266959,GB 1353266960,1353266975,IE 1353266976,1353267455,GB -1353267456,1353267743,IE -1353267744,1353268495,GB -1353268496,1353268511,BE -1353268512,1353268663,GB -1353268664,1353268671,BE -1353268672,1353269015,GB -1353269016,1353269039,BE -1353269040,1353269055,GB -1353269056,1353269079,BE -1353269080,1353271823,GB -1353271824,1353271831,ES -1353271832,1353272071,GB -1353272072,1353272079,ES -1353272080,1353272095,GB -1353272096,1353272111,ES -1353272112,1353272767,GB -1353272768,1353272775,ES -1353272776,1353273343,GB -1353273344,1353273599,BE -1353273600,1353273663,GB -1353273664,1353273695,BE -1353273696,1353274631,GB -1353274632,1353274639,ES -1353274640,1353274647,GB -1353274648,1353274655,ES -1353274656,1353274719,GB -1353274720,1353274751,ES -1353274752,1353274783,GB -1353274784,1353274791,ES -1353274792,1353274855,GB -1353274856,1353274863,ES -1353274864,1353274935,GB -1353274936,1353274943,ES -1353274944,1353275039,GB -1353275040,1353275055,ES -1353275056,1353275279,GB -1353275280,1353275287,ES -1353275288,1353275295,GB -1353275296,1353275327,ES -1353275328,1353275343,GB -1353275344,1353275359,ES -1353275360,1353277439,GB +1353267456,1353268223,IE +1353268224,1353268479,GB +1353268480,1353269247,BE +1353269248,1353270527,GB +1353270528,1353270783,IE +1353270784,1353271295,GB +1353271296,1353271423,IE +1353271424,1353271807,GB +1353271808,1353271831,ES +1353271832,1353271839,GB +1353271840,1353271847,ES +1353271848,1353271895,GB +1353271896,1353271919,ES +1353271920,1353271927,GB +1353271928,1353272031,ES +1353272032,1353272039,FR +1353272040,1353272047,GB +1353272048,1353272055,ES +1353272056,1353272063,GB +1353272064,1353272245,ES +1353272246,1353272255,GB +1353272256,1353272647,ES +1353272648,1353272655,GB +1353272656,1353272691,ES +1353272692,1353272695,GB +1353272696,1353272727,ES +1353272728,1353272735,GB +1353272736,1353272783,ES +1353272784,1353272799,GB +1353272800,1353272807,ES +1353272808,1353272815,GB +1353272816,1353272847,ES +1353272848,1353272879,GB +1353272880,1353272951,ES +1353272952,1353272959,GB +1353272960,1353273047,ES +1353273048,1353273055,GB +1353273056,1353273343,ES +1353273344,1353273631,BE +1353273632,1353273639,ES +1353273640,1353273711,BE +1353273712,1353273719,GB +1353273720,1353274367,BE +1353274368,1353274671,ES +1353274672,1353274679,GB +1353274680,1353274687,ES +1353274688,1353274703,GB +1353274704,1353274759,ES +1353274760,1353274767,GB +1353274768,1353274791,ES +1353274792,1353274799,GB +1353274800,1353274831,ES +1353274832,1353274839,GB +1353274840,1353274863,ES +1353274864,1353274879,GB +1353274880,1353274895,ES +1353274896,1353274911,GB +1353274912,1353274919,ES +1353274920,1353274927,GB +1353274928,1353275023,ES +1353275024,1353275039,GB +1353275040,1353275087,ES +1353275088,1353275103,GB +1353275104,1353275231,ES +1353275232,1353275255,GB +1353275256,1353275263,ES +1353275264,1353275279,GB +1353275280,1353275335,ES +1353275336,1353275343,GB +1353275344,1353275391,ES +1353275392,1353277439,GB 1353277440,1353279487,CH -1353279488,1353280512,IT -1353280513,1353280519,GB -1353280520,1353280527,IT -1353280528,1353280543,GB -1353280544,1353280575,IT -1353280576,1353287327,GB +1353279488,1353279743,IT +1353279744,1353279751,GB +1353279752,1353279759,IT +1353279760,1353279763,GB +1353279764,1353280119,IT +1353280120,1353280135,GB +1353280136,1353280543,IT +1353280544,1353280575,GB +1353280576,1353281023,IT +1353281024,1353281535,BE +1353281536,1353282047,GB +1353282048,1353282559,IT +1353282560,1353283071,GB +1353283072,1353283327,IT +1353283328,1353287327,GB 1353287328,1353287359,IE -1353287360,1353287935,GB -1353287936,1353288031,IE +1353287360,1353287679,GB +1353287680,1353288031,IE 1353288032,1353288063,GB 1353288064,1353288151,IE 1353288152,1353288159,GB 1353288160,1353288167,IE 1353288168,1353288191,GB -1353288192,1353288231,IE -1353288232,1353288239,GB -1353288240,1353288351,IE +1353288192,1353288319,IE +1353288320,1353288327,GB +1353288328,1353288351,IE 1353288352,1353288383,GB -1353288384,1353288519,IE -1353288520,1353288543,GB -1353288544,1353289343,IE -1353289344,1353289351,GB -1353289352,1353289359,IE +1353288384,1353288399,IE +1353288400,1353288407,GB +1353288408,1353288519,IE +1353288520,1353288527,GB +1353288528,1353288607,IE +1353288608,1353288639,GB +1353288640,1353288831,IE +1353288832,1353288839,GB +1353288840,1353288847,IE +1353288848,1353288855,GB +1353288856,1353288887,IE +1353288888,1353288895,GB +1353288896,1353289247,IE +1353289248,1353289255,GB +1353289256,1353289359,IE 1353289360,1353289367,GB -1353289368,1353289375,IE -1353289376,1353289615,GB +1353289368,1353289391,IE +1353289392,1353289407,GB +1353289408,1353289599,IE +1353289600,1353289615,GB 1353289616,1353289623,IE -1353289624,1353290751,GB -1353290752,1353290815,DE -1353290816,1353297151,GB +1353289624,1353289631,GB +1353289632,1353289647,IE +1353289648,1353289663,GB +1353289664,1353289727,IE +1353289728,1353290927,GB +1353290928,1353290935,IE +1353290936,1353293351,GB +1353293352,1353293355,IT +1353293356,1353297151,GB 1353297152,1353297183,IE 1353297184,1353298687,GB 1353298688,1353298695,SE 1353298696,1353298703,DE -1353298704,1353298719,GB +1353298704,1353298707,SE +1353298708,1353298719,GB 1353298720,1353298751,DE -1353298752,1353298879,SE -1353298880,1353298887,GB -1353298888,1353298895,SE -1353298896,1353298911,GB -1353298912,1353299607,SE -1353299608,1353299615,GB -1353299616,1353299631,SE -1353299632,1353299647,GB -1353299648,1353299711,SE -1353299712,1353299967,GB -1353299968,1353300031,SE -1353300032,1353300039,GB -1353300040,1353300047,SE -1353300048,1353300063,GB -1353300064,1353300287,SE -1353300288,1353300319,GB -1353300320,1353300351,SE -1353300352,1353300367,GB -1353300368,1353300383,SE -1353300384,1353301095,GB +1353298752,1353298881,SE +1353298882,1353298887,GB +1353298888,1353299711,SE +1353299712,1353299839,GB +1353299840,1353299855,SE +1353299856,1353299863,GB +1353299864,1353300063,SE +1353300064,1353300071,GB +1353300072,1353300079,SE +1353300080,1353300103,GB +1353300104,1353300111,SE +1353300112,1353300175,GB +1353300176,1353300191,SE +1353300192,1353300239,GB +1353300240,1353300247,SE +1353300248,1353300279,GB +1353300280,1353300735,SE +1353300736,1353301095,GB 1353301096,1353301103,US -1353301104,1353318399,GB -1353318400,1353383935,FR +1353301104,1353305599,GB +1353305600,1353305607,IE +1353305608,1353306111,GB +1353306112,1353306623,ES +1353306624,1353306624,BE +1353306625,1353306687,GB +1353306688,1353306695,BE +1353306696,1353306703,GB +1353306704,1353306735,BE +1353306736,1353306751,GB +1353306752,1353306831,BE +1353306832,1353306847,GB +1353306848,1353307135,BE +1353307136,1353307143,IT +1353307144,1353308159,GB +1353308160,1353309183,FR +1353309184,1353310463,GB +1353310464,1353310599,ES +1353310600,1353310607,DE +1353310608,1353310719,ES +1353310720,1353311175,IT +1353311176,1353311183,ES +1353311184,1353311231,IT +1353311232,1353312255,GB +1353312256,1353312767,CH +1353312768,1353313111,IT +1353313112,1353313119,GB +1353313120,1353313191,IT +1353313192,1353313199,GB +1353313200,1353313279,IT +1353313280,1353313791,IE +1353313792,1353314303,GB +1353314304,1353314815,CH +1353314816,1353315415,ES +1353315416,1353315423,FR +1353315424,1353316351,ES +1353316352,1353317375,GB +1353317376,1353317631,FR +1353317632,1353318143,GB +1353318144,1353318399,IE +1353318400,1353383935,SE 1353383936,1353449471,DE 1353449472,1353515007,PT 1353515008,1353646079,ES 1353646080,1353842687,GB -1353842688,1353933823,IL -1353933824,1353934071,GB -1353934072,1353934207,IL -1353934208,1353934271,GB -1353934272,1353934519,IL -1353934520,1353934527,GB -1353934528,1353934855,IL -1353934856,1353935103,GB -1353935104,1353956607,IL -1353956608,1353957119,GB -1353957120,1353957345,IL -1353957346,1353957375,GB -1353957376,1353968639,IL -1353968640,1353968895,GB -1353968896,1353969151,IL -1353969152,1353969343,GB -1353969344,1353969919,IL -1353969920,1353970623,GB -1353970624,1353970655,IL -1353970656,1353970703,GB -1353970704,1353970943,IL -1353970944,1353971199,GB -1353971200,1353971967,IL -1353971968,1353972479,GB -1353972480,1353972735,IL -1353972736,1353972991,GB -1353972992,1353973247,IL -1353973248,1353973255,GB -1353973256,1353973263,IL -1353973264,1353973279,GB -1353973280,1353973287,IL -1353973288,1353973415,GB -1353973416,1353973423,IL -1353973424,1353973759,GB +1353842688,1353932559,IL +1353932560,1353932567,A2 +1353932568,1353932575,IL +1353932576,1353932591,A2 +1353932592,1353950239,IL +1353950240,1353950263,A2 +1353950264,1353950351,IL +1353950352,1353950367,A2 +1353950368,1353950399,IL +1353950400,1353950415,A2 +1353950416,1353951487,IL +1353951488,1353951503,A2 +1353951504,1353951511,IL +1353951512,1353951519,A2 +1353951520,1353951551,IL +1353951552,1353951591,A2 +1353951592,1353951615,IL +1353951616,1353951679,A2 +1353951680,1353951711,IL +1353951712,1353951727,A2 +1353951728,1353953279,IL +1353953280,1353953311,A2 +1353953312,1353953367,IL +1353953368,1353953375,A2 +1353953376,1353953391,IL +1353953392,1353953407,A2 +1353953408,1353956607,IL +1353956608,1353956863,GB +1353956864,1353968639,IL +1353968640,1353968895,A2 +1353968896,1353970431,IL +1353970432,1353970687,A2 +1353970688,1353973759,IL 1353973760,1354235903,IT 1354235904,1354301439,KW 1354301440,1354366975,FR @@ -14146,49 +29027,72 @@ 1354432512,1354498047,DE 1354498048,1354563583,CZ 1354563584,1354629119,GB -1354629120,1354663295,DE -1354663296,1354663303,ES -1354663304,1354663807,DE +1354629120,1354662143,DE +1354662144,1354662151,AT +1354662152,1354662463,DE +1354662464,1354662527,AT +1354662528,1354662591,ES +1354662592,1354663807,DE 1354663808,1354663808,AT 1354663809,1354664743,DE 1354664744,1354664751,IT -1354664752,1354665215,DE +1354664752,1354664759,DE +1354664760,1354664767,IT +1354664768,1354665215,DE 1354665216,1354665247,ES 1354665248,1354665943,DE 1354665944,1354665951,IT -1354665952,1354668031,DE +1354665952,1354666639,DE +1354666640,1354666650,FI +1354666651,1354666687,DE +1354666688,1354666688,FI +1354666689,1354668031,DE 1354668032,1354668159,AT -1354668160,1354674719,DE +1354668160,1354673919,DE +1354673920,1354674175,PL +1354674176,1354674719,DE 1354674720,1354674751,CH -1354674752,1354674943,DE +1354674752,1354674783,DK +1354674784,1354674815,DE +1354674816,1354674943,IT 1354674944,1354675199,AE -1354675200,1354676479,DE +1354675200,1354675327,DE +1354675328,1354675359,DK +1354675360,1354676479,DE 1354676480,1354676767,AE -1354676768,1354676991,DE +1354676768,1354676783,DE +1354676784,1354676791,PL +1354676792,1354676991,DE 1354676992,1354677023,AE -1354677024,1354677151,DE -1354677152,1354677159,AT -1354677160,1354677247,DE +1354677024,1354677247,DE 1354677248,1354677279,AE 1354677280,1354678015,DE 1354678016,1354678031,AE -1354678032,1354678335,DE -1354678336,1354678343,RO -1354678344,1354678559,DE +1354678032,1354678159,DE +1354678160,1354678163,PL +1354678164,1354678559,DE 1354678560,1354678575,AE 1354678576,1354678743,DE 1354678744,1354678751,CH -1354678752,1354679295,DE +1354678752,1354678759,IT +1354678760,1354679295,DE 1354679296,1354679807,AE -1354679808,1354680063,DE +1354679808,1354679839,DE +1354679840,1354679871,DK +1354679872,1354680063,DE 1354680064,1354680079,AE -1354680080,1354681087,DE -1354681088,1354681151,ES -1354681152,1354681471,DE +1354680080,1354680175,DE +1354680176,1354680179,PL +1354680180,1354681247,DE +1354681248,1354681279,DK +1354681280,1354681471,DE 1354681472,1354681487,AE -1354681488,1354681503,DE -1354681504,1354681511,US -1354681512,1354682287,DE +1354681488,1354681815,DE +1354681816,1354681823,CH +1354681824,1354682111,DE +1354682112,1354682143,DK +1354682144,1354682175,CH +1354682176,1354682287,DE 1354682288,1354682303,AE 1354682304,1354682771,DE 1354682772,1354682775,RS @@ -14205,10 +29109,8 @@ 1354684432,1354684671,DE 1354684672,1354684927,AE 1354684928,1354687023,DE -1354687024,1354687031,ES -1354687032,1354687231,DE -1354687232,1354687247,CH -1354687248,1354687359,DE +1354687024,1354687031,LU +1354687032,1354687359,DE 1354687360,1354687375,NZ 1354687376,1354687383,DE 1354687384,1354687391,NZ @@ -14218,17 +29120,7 @@ 1354687456,1354687487,IT 1354687488,1354687759,DE 1354687760,1354687763,CH -1354687764,1354687859,DE -1354687860,1354687863,IT -1354687864,1354688122,DE -1354688123,1354688126,ES -1354688127,1354688263,DE -1354688264,1354688271,ES -1354688272,1354688362,DE -1354688363,1354688363,CH -1354688364,1354688815,DE -1354688816,1354688816,IT -1354688817,1354694655,DE +1354687764,1354694655,DE 1354694656,1354760191,IR 1354760192,1355022335,GB 1355022336,1355284479,DK @@ -14244,7 +29136,9 @@ 1356857344,1356922879,ES 1356922880,1356988415,GB 1356988416,1357053951,DE -1357053952,1357119487,AE +1357053952,1357091727,AE +1357091728,1357091743,A2 +1357091744,1357119487,AE 1357119488,1357126807,DE 1357126808,1357126815,NL 1357126816,1357127063,DE @@ -14258,110 +29152,141 @@ 1357250560,1357316095,IL 1357316096,1357316607,ES 1357316608,1357317119,LU -1357317120,1357317375,NG -1357317376,1357317631,LB +1357317120,1357317631,EU 1357317632,1357318143,LY 1357318144,1357320191,QA 1357320192,1357320703,FR 1357320704,1357320959,RO -1357320960,1357320983,DK -1357320992,1357321015,DK -1357321016,1357321023,ES -1357321024,1357321087,GB -1357321088,1357321215,LB +1357320960,1357320991,ES +1357320992,1357320999,GB +1357321000,1357321007,FR +1357321008,1357321015,GB +1357321016,1357321023,DK +1357321024,1357321087,KE +1357321088,1357321215,EU 1357321216,1357321471,GB 1357321472,1357321503,ES +1357321504,1357321727,EU 1357321728,1357321983,CY 1357321984,1357322239,SO +1357322240,1357322751,DE +1357322752,1357323263,BH +1357323264,1357323519,ES +1357323520,1357323775,GB +1357323776,1357324287,DE +1357324288,1357326335,GB 1357326336,1357326591,NL 1357326592,1357326847,DE -1357326848,1357327103,ES -1357327104,1357327359,GB -1357330432,1357330687,IQ -1357330688,1357330943,DE +1357326848,1357327359,GB +1357327360,1357328383,DE +1357328384,1357330431,EU +1357330432,1357330943,DE 1357330944,1357331455,ES +1357331456,1357332479,EU 1357332480,1357333247,DE 1357333248,1357333503,GB 1357333504,1357333759,IR -1357333760,1357333823,GB -1357333824,1357333855,GE +1357333760,1357333823,EU +1357333824,1357333855,GB 1357333856,1357334015,ES -1357334016,1357334271,SM -1357334272,1357334527,ES +1357334016,1357334271,TZ +1357334272,1357334527,CA 1357334528,1357335039,FR 1357335040,1357335295,LB 1357335296,1357335551,FR -1357335552,1357335807,SM +1357335552,1357335807,GB 1357335808,1357336063,KE 1357336064,1357336319,GB 1357336320,1357336575,FR 1357336576,1357337599,NL -1357337600,1357337855,GB -1357337856,1357338111,ES -1357338112,1357338879,FR -1357338880,1357339647,NO +1357337600,1357337855,ES +1357337856,1357338111,SA +1357338112,1357338623,EU +1357338624,1357338879,FR +1357338880,1357339391,NO +1357339392,1357339647,AT 1357339648,1357339903,DZ -1357339904,1357340415,ES +1357339904,1357340159,GB +1357340160,1357340415,DE 1357340416,1357340671,LB +1357340672,1357342719,GB +1357342720,1357348863,EU 1357348864,1357349119,DE 1357349120,1357349375,LU -1357349376,1357350399,ES +1357349376,1357349887,EU +1357349888,1357350399,ES 1357350400,1357350911,QA -1357350912,1357351167,SM +1357350912,1357351167,GB 1357351168,1357351423,PL -1357351424,1357351679,DE -1357351680,1357351935,PL -1357351936,1357352447,GB -1357356032,1357357567,ES +1357351424,1357351935,EU +1357351936,1357352959,GB +1357352960,1357355007,EU +1357355008,1357355263,NL +1357355264,1357355775,FR +1357355776,1357356031,GB +1357356032,1357356543,ES +1357356544,1357357055,EU +1357357056,1357357567,ES 1357357568,1357358079,DE 1357358080,1357358335,ES +1357358336,1357358591,FR 1357358592,1357358847,DE 1357358848,1357359103,PL -1357359104,1357359487,ES -1357359552,1357359999,ES -1357360000,1357360127,DE +1357359104,1357359999,ES +1357360000,1357360127,EU 1357360128,1357360255,GB -1357360256,1357360383,FR +1357360256,1357360383,EU 1357360384,1357360639,ES 1357360640,1357360895,GB 1357360896,1357361151,DE +1357361152,1357363199,EU 1357363200,1357364223,QA 1357364224,1357365247,ES 1357365248,1357365759,DZ 1357365760,1357365791,ES +1357365792,1357365823,BH 1357365824,1357365887,GB -1357365888,1357365951,DE -1357365952,1357366015,GB +1357365888,1357366015,DE 1357366016,1357366271,KM -1357366272,1357366527,KE +1357366272,1357366527,FR 1357366528,1357366591,BE 1357366592,1357366655,FR 1357366656,1357366719,PT -1357366720,1357366783,FR +1357366720,1357366783,EU 1357366784,1357366799,MD +1357366800,1357366815,ES 1357366816,1357366847,FR 1357366848,1357366863,GB 1357366864,1357366879,ES 1357366880,1357366911,GB +1357366912,1357367039,EU 1357367040,1357367295,GB -1357367296,1357368063,DZ +1357367296,1357367807,EU +1357367808,1357368063,GB 1357368064,1357368831,GN +1357368832,1357369343,ES 1357369344,1357369599,PL 1357369600,1357369855,GB 1357369856,1357370111,KE -1357370112,1357370879,DZ +1357370112,1357370367,DE +1357370368,1357370879,EU 1357370880,1357371391,LY -1357371392,1357371903,PK -1357371904,1357372159,FR +1357371392,1357371647,GB +1357371648,1357371903,EU +1357371904,1357372159,RU 1357372160,1357372415,GB +1357372416,1357372927,EU 1357372928,1357373183,AM 1357373184,1357373439,GB +1357373440,1357381631,EU 1357381632,1357391615,NO 1357391616,1357391871,SE 1357391872,1357414399,NO 1357414400,1357447167,LV -1357447168,1357479935,DK -1357479936,1357512703,LV +1357447168,1357479935,IE +1357479936,1357483007,LV +1357483008,1357483263,RU +1357483264,1357512703,LV 1357512704,1357545471,RU 1357545472,1357578239,GB 1357578240,1357611007,EE @@ -14369,11 +29294,15 @@ 1357643776,1357676543,FR 1357676544,1357709311,BE 1357709312,1357742079,RU -1357742080,1357759183,DE +1357742080,1357759079,DE +1357759080,1357759087,AM +1357759088,1357759183,DE 1357759184,1357759191,AT 1357759192,1357765823,DE 1357765824,1357765831,AT -1357765832,1357774847,DE +1357765832,1357773111,DE +1357773112,1357773119,PL +1357773120,1357774847,DE 1357774848,1357791231,GB 1357791232,1357807615,PL 1357807616,1357840383,CH @@ -14382,83 +29311,148 @@ 1357867744,1357873151,NO 1357873152,1357875199,DE 1357875200,1357875215,AT -1357875216,1357875223,DE -1357875232,1357875263,DE +1357875216,1357875247,DE +1357875248,1357875263,US 1357875264,1357875279,AT -1357875280,1357875295,DE -1357875328,1357875391,DE -1357875456,1357875711,DE +1357875280,1357875423,DE +1357875424,1357875439,GB +1357875440,1357875711,DE 1357875712,1357875967,PL -1357875968,1357876191,DE -1357876208,1357876215,DE -1357876272,1357876279,PL +1357875968,1357876143,DE +1357876144,1357876151,SE +1357876152,1357876223,DE +1357876224,1357876239,NO +1357876240,1357876287,EU 1357876288,1357876303,PL +1357876304,1357876335,EU 1357876336,1357876339,PL +1357876340,1357876343,RU +1357876344,1357876383,EU +1357876384,1357876391,RU 1357876392,1357876399,PL +1357876400,1357876415,EU 1357876416,1357876479,PL -1357876736,1357876863,DE -1357876992,1357877759,DE -1357878272,1357879551,DE +1357876480,1357876495,SE +1357876496,1357876543,EU +1357876544,1357876863,DE +1357876864,1357876927,SE +1357876928,1357877335,DE +1357877336,1357877343,EU +1357877344,1357877759,DE +1357877760,1357878783,EU +1357878784,1357879807,DE 1357879808,1357879871,RU 1357879872,1357879935,DE +1357879936,1357880063,GB +1357880064,1357880319,NL +1357880320,1357880447,DE 1357880448,1357880511,CH 1357880512,1357880543,DE +1357880544,1357880559,AT 1357880560,1357880831,DE +1357880832,1357881087,AT 1357881088,1357881343,DE 1357881344,1357883391,FR -1357883424,1357883455,FR +1357883392,1357883407,ES +1357883408,1357883423,EU +1357883424,1357883519,FR +1357883520,1357883535,EU 1357883536,1357883551,FR -1357883648,1357883719,FR -1357883728,1357883743,FR -1357883776,1357883807,FR -1357883840,1357883951,FR +1357883552,1357883583,EU +1357883584,1357883727,FR +1357883728,1357883759,EU +1357883760,1357883935,FR +1357883936,1357883999,EU 1357884000,1357884031,FR -1357884096,1357884419,FR +1357884032,1357884159,EU +1357884160,1357884423,FR +1357884424,1357884427,BE +1357884428,1357884439,EU 1357884440,1357884447,FR -1357884512,1357884927,FR -1357884992,1357885055,FR -1357885120,1357885183,FR -1357885200,1357885215,ES -1357885312,1357885439,DE +1357884448,1357884511,EU +1357884512,1357884935,FR +1357884936,1357884943,EU +1357884944,1357884959,FR +1357884960,1357884991,RU +1357884992,1357885183,FR +1357885184,1357885215,EU +1357885216,1357885247,ES +1357885248,1357885439,DE 1357885440,1357885695,FR -1357885696,1357885951,NO +1357885696,1357885951,DE 1357885952,1357886463,FR 1357886464,1357887487,US 1357887488,1357888511,FR -1357888512,1357889535,NO +1357888512,1357888703,DE +1357888704,1357888767,EU +1357888768,1357889023,DE +1357889024,1357889535,GB 1357889536,1357890815,PL -1357890824,1357890895,NL -1357890944,1357891391,NL -1357891408,1357891423,CA +1357890816,1357890827,NL +1357890828,1357890847,EU +1357890848,1357890879,NL +1357890880,1357890911,EU +1357890912,1357890943,DE +1357890944,1357891327,NL +1357891328,1357891391,EU +1357891392,1357891399,NL +1357891400,1357891423,EU 1357891424,1357891455,NL 1357891456,1357891583,SE -1357891584,1357891679,NL +1357891584,1357891647,EU +1357891648,1357891679,NL +1357891680,1357891711,GB 1357891712,1357891839,NL -1357892096,1357893119,NL +1357891840,1357892095,GB +1357892096,1357892351,EU +1357892352,1357893119,NL +1357893120,1357893375,SE +1357893376,1357893407,EU +1357893408,1357893439,SE +1357893440,1357893503,EU 1357893504,1357893631,DE -1357897856,1357897887,DE -1357897920,1357897983,DE -1357898240,1357898495,DE -1357898752,1357898879,DE -1357899008,1357899015,DE -1357899024,1357899063,DE -1357899072,1357899263,DE -1357899296,1357899311,US +1357893632,1357897855,EU +1357897856,1357898495,DE +1357898496,1357898751,EU +1357898752,1357899015,DE +1357899016,1357899023,EU +1357899024,1357899039,DE +1357899040,1357899047,EU +1357899048,1357899055,DE +1357899056,1357899071,EU +1357899072,1357899199,DE +1357899200,1357899279,EU +1357899280,1357899287,RU +1357899288,1357899327,EU +1357899328,1357899391,PL +1357899392,1357899551,EU +1357899552,1357899567,AT +1357899568,1357899647,EU +1357899648,1357899775,GB 1357899776,1357900287,DE +1357900288,1357900351,EU +1357900352,1357900415,CH +1357900416,1357900543,SE 1357900544,1357900799,NL -1357900800,1357901311,DE -1357901568,1357901823,DE -1357901824,1357903615,PL +1357900800,1357901823,DE +1357901824,1357902335,ES +1357902336,1357902847,PL +1357902848,1357903359,GB +1357903360,1357903615,DE 1357903616,1357903871,SE +1357903872,1357904383,EU +1357904384,1357904895,DE +1357904896,1357905407,GB +1357905408,1357905919,EU 1357905920,1357910015,LT 1357910016,1357914111,GR 1357914112,1357922303,RU 1357922304,1357926399,SA 1357926400,1357930495,GB -1357930496,1357938687,RU -1357938688,1357942783,CH -1357942784,1357946879,CS +1357930496,1357942783,RU +1357942784,1357946879,RS 1357946880,1357955071,PL +1357955072,1357959167,KE 1357959168,1357963263,RU 1357963264,1357964199,AT 1357964200,1357964207,DE @@ -14468,13 +29462,48 @@ 1357975552,1357979647,AT 1357979648,1357983743,KZ 1357983744,1357987839,RU -1357987840,1357988679,GB -1357988680,1357988687,FR -1357988688,1357988695,DE -1357988696,1357988703,NL -1357988704,1357989631,GB -1357989632,1357989639,FR -1357989640,1357991935,GB +1357987840,1357988495,GB +1357988496,1357988543,DE +1357988544,1357988551,NL +1357988552,1357988559,DE +1357988560,1357988567,GB +1357988568,1357988607,DE +1357988608,1357988751,GB +1357988752,1357988775,DE +1357988776,1357988783,GB +1357988784,1357988863,DE +1357988864,1357989375,GB +1357989376,1357989383,CH +1357989384,1357989647,GB +1357989648,1357989655,FR +1357989656,1357989663,GB +1357989664,1357989703,FR +1357989704,1357989711,GB +1357989712,1357989727,FR +1357989728,1357989743,GB +1357989744,1357989759,CH +1357989760,1357989783,FR +1357989784,1357989791,GB +1357989792,1357989807,FR +1357989808,1357989823,GB +1357989824,1357989839,FR +1357989840,1357989847,GB +1357989848,1357989887,FR +1357989888,1357991679,GB +1357991680,1357991711,DE +1357991712,1357991719,GB +1357991720,1357991735,DE +1357991736,1357991759,GB +1357991760,1357991783,DE +1357991784,1357991791,GB +1357991792,1357991799,DE +1357991800,1357991823,GB +1357991824,1357991839,DE +1357991840,1357991855,GB +1357991856,1357991895,DE +1357991896,1357991903,GB +1357991904,1357991927,DE +1357991928,1357991935,GB 1357991936,1357996031,NO 1357996032,1358000127,CH 1358000128,1358004223,LI @@ -14486,16 +29515,19 @@ 1358024704,1358028799,EE 1358028800,1358032895,IT 1358032896,1358036991,GE -1358036992,1358045183,IR +1358036992,1358041087,IR +1358041088,1358045183,FI 1358045184,1358049279,SK 1358049280,1358061567,RU -1358061568,1358065663,NL +1358061568,1358065663,UA 1358065664,1358069759,BA -1358069760,1358082815,DE +1358069760,1358074719,DE +1358074720,1358074751,CH +1358074752,1358082815,DE 1358082816,1358083071,CH 1358083072,1358086143,DE 1358086144,1358090239,CH -1358090240,1358094335,BE +1358090240,1358094335,KZ 1358094336,1358102527,NL 1358102528,1358106623,RU 1358106624,1358110719,LT @@ -14504,9 +29536,9 @@ 1358116912,1358118911,DE 1358118912,1358123007,RU 1358123008,1358127103,PT -1358127104,1358131199,RU +1358127104,1358131199,CZ 1358131200,1358135295,DK -1358135296,1358139391,DE +1358135296,1358139391,RU 1358139392,1358143487,UA 1358143488,1358144159,AT 1358144160,1358144191,MT @@ -14519,7 +29551,9 @@ 1358163968,1358168063,FR 1358168064,1358172159,GB 1358172160,1358173183,CY -1358173184,1358176255,GR +1358173184,1358173951,GR +1358173952,1358174207,DE +1358174208,1358176255,CY 1358176256,1358180351,RU 1358180352,1358184447,ES 1358184448,1358192639,SE @@ -14531,75 +29565,70 @@ 1358217216,1358221311,SE 1358221312,1358223359,DE 1358223360,1358223631,GB -1358223632,1358223743,DE -1358223744,1358223759,GB -1358223760,1358223887,DE -1358223888,1358223895,NL -1358223896,1358223911,DE +1358223632,1358223663,DE +1358223664,1358223671,GB +1358223672,1358223727,DE +1358223728,1358223775,GB +1358223776,1358223843,DE +1358223844,1358223871,GB +1358223872,1358223911,DE 1358223912,1358223927,NL 1358223928,1358223967,DE -1358223968,1358223999,NL -1358224000,1358224007,DE -1358224008,1358224015,NL -1358224016,1358224359,DE -1358224360,1358224367,NL -1358224368,1358224611,DE -1358224612,1358224615,BE -1358224616,1358224639,DE -1358224640,1358224647,BE -1358224648,1358224927,DE -1358224928,1358224991,IT -1358224992,1358225407,DE +1358223968,1358224055,NL +1358224056,1358224511,DE +1358224512,1358224519,BE +1358224520,1358224611,DE +1358224612,1358224651,BE +1358224652,1358224655,DE +1358224656,1358224719,BE +1358224720,1358224927,DE +1358224928,1358225119,IT +1358225120,1358225407,DE 1358225408,1358229503,RU 1358229504,1358229631,DE 1358229632,1358229639,LU 1358229640,1358230111,DE 1358230112,1358230115,AT -1358230116,1358230327,DE -1358230328,1358230335,BA -1358230336,1358230383,DE -1358230384,1358230391,US +1358230116,1358230383,DE +1358230384,1358230391,TR 1358230392,1358230399,CH -1358230400,1358230527,DE -1358230528,1358230531,GB -1358230532,1358231593,DE -1358231594,1358231594,US -1358231595,1358232703,DE -1358232704,1358232831,AT -1358232832,1358232863,DE +1358230400,1358232863,DE 1358232864,1358232879,IT -1358232880,1358233599,DE +1358232880,1358232903,DE +1358232904,1358232911,CH +1358232912,1358233599,DE 1358233600,1358237695,ES 1358237696,1358241791,FR -1358241792,1358241807,BE -1358241808,1358242591,FR +1358241792,1358241823,BE +1358241824,1358241951,FR +1358241952,1358241983,BE +1358241984,1358242591,FR 1358242592,1358242623,BE 1358242624,1358244351,FR -1358244352,1358245375,NL -1358245376,1358245663,FR -1358245664,1358245679,BE -1358245680,1358245695,FR -1358245696,1358245727,BE -1358245728,1358245887,FR -1358245888,1358247935,NL -1358247936,1358249983,FR +1358244352,1358244607,IT +1358244608,1358245695,FR +1358245696,1358245759,BE +1358245760,1358249215,FR +1358249216,1358249471,IT +1358249472,1358249983,FR 1358249984,1358251815,DE 1358251816,1358251823,NL 1358251824,1358254079,DE -1358254080,1358254335,NL -1358254336,1358258175,TR -1358258176,1358262271,GB +1358254080,1358258175,MD +1358258176,1358262271,RU 1358262272,1358266367,UA 1358266368,1358274559,DE 1358274560,1358278655,GR 1358278656,1358282751,PL 1358282752,1358286847,AT 1358286848,1358290943,MT -1358290944,1358295039,DE +1358290944,1358295039,SE 1358295040,1358299135,RU +1358299136,1358303231,DZ 1358303232,1358307327,RU -1358307328,1358311423,DE -1358311424,1358315519,LB +1358307328,1358313215,DE +1358313216,1358313727,ES +1358313728,1358315519,DE 1358315520,1358323711,RU 1358323712,1358327807,LU 1358327808,1358328671,DE @@ -14607,90 +29636,96 @@ 1358328728,1358331903,DE 1358331904,1358335999,IL 1358336000,1358344191,FI -1358344192,1358348287,IT -1358348288,1358352383,BG +1358344192,1358352383,NL 1358352384,1358356479,RU 1358356480,1358360575,SI 1358360576,1358364671,RU 1358364672,1358372863,GB 1358372864,1358376959,RU 1358376960,1358381055,GB -1358381056,1358384127,IT +1358381056,1358383311,IT +1358383312,1358383327,FR +1358383328,1358384127,IT 1358384128,1358384143,FR 1358384144,1358384191,IT 1358384192,1358384199,FR 1358384200,1358385151,IT 1358385152,1358389247,GB 1358389248,1358397439,RU -1358397440,1358397951,GB +1358397440,1358397743,GB +1358397744,1358397951,A2 1358397952,1358398463,TZ -1358398464,1358399487,PK +1358398464,1358399487,GB 1358399488,1358399999,NG 1358400000,1358400007,PK -1358400008,1358400015,GB +1358400008,1358400015,A2 1358400016,1358400071,IN -1358400072,1358400255,GB +1358400072,1358400255,A2 1358400256,1358400511,AF 1358400512,1358400519,GA -1358400520,1358400527,GB +1358400520,1358400527,A2 1358400528,1358400535,TZ -1358400536,1358400543,GB +1358400536,1358400543,A2 1358400544,1358400551,GA -1358400552,1358400575,GB +1358400552,1358400575,A2 1358400576,1358400591,KE -1358400592,1358400639,GB +1358400592,1358400639,A2 1358400640,1358400775,KE -1358400776,1358400783,GB +1358400776,1358400783,A2 1358400784,1358400799,KE 1358400800,1358400863,NG 1358400864,1358400895,GA 1358400896,1358401279,NG 1358401280,1358401391,KE -1358401392,1358401407,GB +1358401392,1358401407,A2 1358401408,1358401439,KE -1358401440,1358402175,GB +1358401440,1358401535,A2 +1358401536,1358401791,GB +1358401792,1358402175,A2 1358402176,1358402303,TZ -1358402304,1358402319,GB +1358402304,1358402319,A2 1358402320,1358402343,NG 1358402344,1358402351,KE -1358402352,1358402359,GB +1358402352,1358402359,A2 1358402360,1358402363,ID -1358402364,1358402367,GB +1358402364,1358402367,A2 1358402368,1358402399,NG 1358402400,1358402415,CG 1358402416,1358402419,ID -1358402420,1358402447,GB +1358402420,1358402447,A2 1358402448,1358402463,KE -1358402464,1358402495,GB +1358402464,1358402495,A2 1358402496,1358402543,KE -1358402544,1358403103,GB +1358402544,1358402559,A2 +1358402560,1358402719,GB +1358402720,1358403103,A2 1358403104,1358403135,ID -1358403136,1358403151,GB +1358403136,1358403151,A2 1358403152,1358403167,ID -1358403168,1358403183,GB +1358403168,1358403183,A2 1358403184,1358403273,ID -1358403274,1358403327,GB +1358403274,1358403327,A2 1358403328,1358403583,NG 1358403584,1358403591,PK -1358403592,1358403631,GB +1358403592,1358403631,A2 1358403632,1358403679,PK -1358403680,1358403687,GB +1358403680,1358403687,A2 1358403688,1358403711,PK -1358403712,1358403839,GB +1358403712,1358403839,A2 1358403840,1358404095,NG -1358404096,1358404607,PK +1358404096,1358404607,A2 1358404608,1358404611,NG 1358404612,1358404615,TZ 1358404616,1358404623,NG 1358404624,1358404655,TZ 1358404656,1358404671,NG -1358404672,1358404695,GB +1358404672,1358404695,A2 1358404696,1358404703,TZ -1358404704,1358404735,GB +1358404704,1358404735,A2 1358404736,1358404751,NG -1358404752,1358404767,GB +1358404752,1358404767,A2 1358404768,1358404783,NG -1358404784,1358404863,GB +1358404784,1358404863,A2 1358404864,1358405119,NG 1358405120,1358405375,TZ 1358405376,1358405631,NG @@ -14699,9 +29734,11 @@ 1358413824,1358422015,NL 1358422016,1358426111,FR 1358426112,1358430207,FI +1358430208,1358434303,NG 1358434304,1358438399,IS 1358438400,1358442495,NL 1358442496,1358446591,RU +1358446592,1358450687,TG 1358450688,1358454783,RU 1358454784,1358462975,FI 1358462976,1358467071,SE @@ -14714,42 +29751,22 @@ 1358491648,1358495743,FI 1358495744,1358499839,PL 1358499840,1358503935,KZ -1358503936,1358508031,ES +1358503936,1358508031,IT 1358508032,1358512127,GB -1358516224,1358520319,NL +1358512128,1358516223,DZ +1358516224,1358520319,BY 1358520320,1358524415,GB -1358524416,1358524671,CH -1358524672,1358524927,DE -1358524928,1358525183,GB -1358525184,1358525215,NL -1358525216,1358525223,DE -1358525224,1358525227,GB -1358525228,1358525235,NL -1358525236,1358525327,DE -1358525328,1358525343,NL -1358525344,1358525359,DE -1358525360,1358525391,NL -1358525392,1358525487,DE -1358525488,1358525491,CH -1358525492,1358525535,DE -1358525536,1358525543,CH -1358525544,1358525951,DE -1358525952,1358526463,NL -1358526464,1358526975,DE -1358526976,1358527743,NL -1358527744,1358527751,DE -1358527752,1358527759,NL -1358527760,1358527999,DE -1358528000,1358528255,NL -1358528256,1358528511,DE +1358524416,1358528511,DE 1358528512,1358536703,RU 1358536704,1358540799,HU 1358540800,1358544895,RU -1358544896,1358548991,LV 1358548992,1358553087,JO 1358553088,1358557183,UA -1358557184,1358561279,IE +1358557184,1358559503,IE +1358559504,1358559519,GB +1358559520,1358561279,IE 1358561280,1358569471,CZ +1358569472,1358573567,NG 1358573568,1358577663,LV 1358577664,1358585855,RU 1358585856,1358589951,GB @@ -14758,66 +29775,74 @@ 1358598144,1358602239,IL 1358602240,1358622719,RU 1358622720,1358626815,SK -1358626816,1358630911,TR +1358626816,1358630911,GB +1358630912,1358634495,US +1358634496,1358635007,GB 1358635008,1358639103,TR 1358639104,1358643199,RU 1358643200,1358647295,ES 1358647296,1358651391,DE 1358651392,1358655487,FR 1358655488,1358667775,RU -1358667776,1358668063,PT -1358668064,1358668095,GB -1358668096,1358668103,PT -1358668104,1358668135,GB -1358668136,1358668143,PT -1358668144,1358668151,GB -1358668152,1358668211,PT -1358668212,1358668223,GB -1358668224,1358668231,PT +1358667776,1358668067,PT +1358668068,1358668071,GB +1358668072,1358668231,PT 1358668232,1358668239,GB 1358668240,1358668263,PT 1358668264,1358668279,GB 1358668280,1358668359,PT -1358668360,1358668383,GB -1358668384,1358668399,PT -1358668400,1358668415,GB -1358668416,1358668463,PT +1358668360,1358668367,GB +1358668368,1358668463,PT 1358668464,1358668479,ES -1358668480,1358668559,PT -1358668560,1358668567,GB -1358668568,1358668799,PT -1358668800,1358668831,GB -1358668832,1358668895,PT -1358668896,1358669055,GB -1358669056,1358669375,PT -1358669376,1358669383,GB -1358669384,1358669399,PT -1358669400,1358669423,GB -1358669424,1358669915,PT -1358669916,1358669919,GB -1358669920,1358669999,PT -1358670000,1358670007,GB -1358670008,1358670023,PT -1358670024,1358670031,GB -1358670032,1358670079,PT -1358670080,1358670591,GB -1358670592,1358670959,PT -1358670960,1358670967,GB -1358670968,1358671103,PT -1358671104,1358671367,GB -1358671368,1358671375,PT -1358671376,1358671383,GB -1358671384,1358671391,PT -1358671392,1358671407,GB -1358671408,1358671415,PT -1358671416,1358671439,GB -1358671440,1358671615,PT -1358671616,1358675967,GB +1358668480,1358668495,GB +1358668496,1358668551,PT +1358668552,1358668575,GB +1358668576,1358668799,PT +1358668800,1358668807,GB +1358668808,1358668927,PT +1358668928,1358668959,ES +1358668960,1358668983,PT +1358668984,1358668991,GB +1358668992,1358669351,PT +1358669352,1358669359,GB +1358669360,1358669431,PT +1358669432,1358669439,GB +1358669440,1358669455,PT +1358669456,1358669471,GB +1358669472,1358669503,PT +1358669504,1358669519,GB +1358669520,1358669543,PT +1358669544,1358669551,GB +1358669552,1358669975,PT +1358669976,1358669999,GB +1358670000,1358670015,PT +1358670016,1358670023,GB +1358670024,1358670071,PT +1358670072,1358670079,GB +1358670080,1358670175,PT +1358670176,1358670335,GB +1358670336,1358671415,PT +1358671416,1358671423,GB +1358671424,1358671431,PT +1358671432,1358671439,GB +1358671440,1358671839,PT +1358671840,1358671855,ES +1358671856,1358671967,PT +1358671968,1358671983,GB +1358671984,1358672479,PT +1358672480,1358672511,GB +1358672512,1358672687,PT +1358672688,1358672703,GB +1358672704,1358673535,PT +1358673536,1358673567,US +1358673568,1358673663,PT +1358673664,1358675967,GB 1358675968,1358676735,SE 1358676736,1358677759,DK -1358677760,1358680063,SE -1358680064,1358684159,RU -1358684160,1358688255,SA +1358677760,1358679295,SE +1358679296,1358679807,DK +1358679808,1358680063,SE +1358680064,1358688255,RU 1358688256,1358692351,CZ 1358692352,1358696447,PL 1358696448,1358700543,RU @@ -14828,11 +29853,41 @@ 1358716928,1358721023,DE 1358721024,1358725119,GB 1358725120,1358733311,RU -1358733312,1358736927,SE +1358733312,1358733639,SE +1358733640,1358733643,DE +1358733644,1358734003,SE +1358734004,1358734007,NO +1358734008,1358734123,SE +1358734124,1358734127,AN +1358734128,1358734343,SE +1358734344,1358734347,NL +1358734348,1358734715,SE +1358734716,1358734719,NL +1358734720,1358734975,SE +1358734976,1358734979,NL +1358734980,1358735139,SE +1358735140,1358735143,NL +1358735144,1358735319,SE +1358735320,1358735323,DE +1358735324,1358735491,SE +1358735492,1358735495,NL +1358735496,1358735711,SE +1358735712,1358735715,FR +1358735716,1358735743,SE +1358735744,1358735751,FR +1358735752,1358736927,SE 1358736928,1358736943,NL -1358736944,1358738431,SE +1358736944,1358737383,SE +1358737384,1358737387,NL +1358737388,1358738103,SE +1358738104,1358738111,FR +1358738112,1358738303,SE +1358738304,1358738307,FR +1358738308,1358738431,SE 1358738432,1358738447,NL -1358738448,1358739135,SE +1358738448,1358738687,SE +1358738688,1358738691,DE +1358738692,1358739135,SE 1358739136,1358739151,NL 1358739152,1358739503,SE 1358739504,1358739519,FR @@ -14842,7 +29897,9 @@ 1358740336,1358740351,GB 1358740352,1358740671,SE 1358740672,1358740687,GB -1358740688,1358741055,SE +1358740688,1358740883,SE +1358740884,1358740887,NL +1358740888,1358741055,SE 1358741056,1358741071,GB 1358741072,1358741503,SE 1358741504,1358745599,IT @@ -14864,12 +29921,14 @@ 1358785088,1358785151,NL 1358785152,1358786559,GB 1358786560,1358787071,NL -1358787072,1358787335,GB -1358787336,1358787359,IE -1358787360,1358799359,GB +1358787072,1358789167,GB +1358789168,1358789183,IE +1358789184,1358790655,GB +1358790656,1358798847,IR +1358798848,1358799359,DE 1358799360,1358802943,HR 1358802944,1358807039,HU -1358807040,1358811135,RU +1358807040,1358811135,ES 1358811136,1358815231,DE 1358815232,1358819327,RU 1358819328,1358823423,TR @@ -14882,10 +29941,12 @@ 1358848000,1358856191,RU 1358856192,1358860287,DE 1358860288,1358861311,GB -1358861312,1358861567,DE -1358861568,1358862335,GB +1358861312,1358861823,DE +1358861824,1358862335,FR 1358862336,1358862591,US -1358862592,1358863359,GB +1358862592,1358862847,GB +1358862848,1358863103,DK +1358863104,1358863359,GB 1358863360,1358863615,US 1358863616,1358864383,GB 1358864384,1358864399,CH @@ -14897,37 +29958,30 @@ 1358876672,1358880767,LV 1358880768,1358884863,GB 1358884864,1358888959,SE -1358888960,1358893055,FR +1358888960,1358893055,DE 1358893056,1358897151,RU -1358897152,1358897183,US -1358897184,1358897199,DE -1358897200,1358897215,GB -1358897216,1358897343,US -1358897344,1358897407,DE -1358897408,1358897919,US -1358897920,1358898175,GB +1358897152,1358898175,A2 1358898176,1358898239,CA -1358898240,1358898335,US +1358898240,1358898335,A2 1358898336,1358898351,DK -1358898352,1358898687,US -1358898688,1358898816,DE +1358898352,1358898816,A2 1358898817,1358898943,CG -1358898944,1358898975,DE +1358898944,1358898975,A2 1358898976,1358898991,US -1358898992,1358899079,DE +1358898992,1358899079,A2 1358899080,1358899087,CD -1358899088,1358899095,DE +1358899088,1358899095,A2 1358899096,1358899103,CD -1358899104,1358899111,DE +1358899104,1358899111,A2 1358899112,1358899119,ZA -1358899120,1358899127,DE +1358899120,1358899127,A2 1358899128,1358899135,NG -1358899136,1358899199,DE +1358899136,1358899199,A2 1358899200,1358899207,UG 1358899208,1358899215,LA 1358899216,1358899239,US 1358899240,1358899247,LK -1358899248,1358899263,GB +1358899248,1358899263,A2 1358899264,1358899295,PK 1358899296,1358899303,NG 1358899304,1358899311,AE @@ -14938,107 +29992,100 @@ 1358899360,1358899375,US 1358899376,1358899383,CD 1358899384,1358899391,UG -1358899392,1358899407,GB +1358899392,1358899407,A2 1358899408,1358899415,DE 1358899416,1358899423,CD 1358899424,1358899431,US 1358899432,1358899455,NG -1358899456,1358899463,GB +1358899456,1358899463,A2 1358899464,1358899471,US 1358899472,1358899479,SV -1358899480,1358899583,GB +1358899480,1358899583,A2 1358899584,1358899591,IN 1358899592,1358899599,NG 1358899600,1358899607,LK -1358899608,1358899615,GB +1358899608,1358899615,A2 1358899616,1358899631,NG 1358899632,1358899647,NP 1358899648,1358899654,NG -1358899655,1358899711,DE -1358899712,1358899967,US -1358899968,1358899983,GB +1358899655,1358899983,A2 1358899984,1358899991,KY -1358899992,1358900223,GB -1358900224,1358900479,US -1358900480,1358900543,DE -1358900544,1358900671,US -1358900672,1358900735,CN -1358900736,1358900767,GB +1358899992,1358900767,A2 1358900768,1358900783,BI -1358900784,1358900959,GB +1358900784,1358900959,A2 1358900960,1358900975,SL -1358900976,1358900991,GB -1358900992,1358901247,TZ -1358901248,1358901503,DE -1358901504,1358901543,US +1358900976,1358901543,A2 1358901544,1358901551,DE -1358901552,1358901615,US -1358901616,1358901729,DE -1358901730,1358901759,US -1358901760,1358901807,DE +1358901552,1358901807,A2 1358901808,1358901815,CD -1358901816,1358901935,DE +1358901816,1358901935,A2 1358901936,1358901951,NG -1358901952,1358902015,DE -1358902016,1358902039,NG -1358902040,1358902063,GB +1358901952,1358901999,A2 +1358902000,1358902039,NG +1358902040,1358902063,A2 1358902064,1358902079,TZ 1358902080,1358902087,NG 1358902088,1358902103,MG 1358902104,1358902143,NG -1358902144,1358902151,GB +1358902144,1358902151,A2 1358902152,1358902167,NG 1358902168,1358902175,AU -1358902176,1358902207,GB +1358902176,1358902207,A2 1358902208,1358902215,US 1358902216,1358902233,NG -1358902234,1358902263,GB +1358902234,1358902263,A2 1358902264,1358902271,ZA -1358902272,1358903807,US +1358902272,1358903615,A2 +1358903616,1358903623,GB +1358903624,1358903807,A2 1358903808,1358903951,NG -1358903952,1358903983,GB -1358903984,1358904063,NG -1358904064,1358904071,DE +1358903952,1358903967,A2 +1358903968,1358903983,CA +1358903984,1358903999,NG +1358904000,1358904032,ZA +1358904033,1358904063,NG +1358904064,1358904071,A2 1358904072,1358904095,US -1358904096,1358904103,DE +1358904096,1358904103,A2 1358904104,1358904119,US -1358904120,1358904127,DE +1358904120,1358904127,A2 1358904128,1358904135,US -1358904136,1358904143,DE +1358904136,1358904143,A2 1358904144,1358904151,NG -1358904152,1358904167,DE +1358904152,1358904167,A2 1358904168,1358904175,US -1358904176,1358904191,DE +1358904176,1358904191,A2 1358904192,1358904199,NG 1358904200,1358904262,US -1358904263,1358904295,DE +1358904263,1358904295,A2 1358904296,1358904311,NG -1358904312,1358904319,DE -1358904320,1358904551,US +1358904312,1358904551,A2 1358904552,1358904559,IL -1358904560,1358904575,US +1358904560,1358904575,A2 1358904576,1358904701,NG -1358904702,1358904703,GB +1358904702,1358904703,A2 1358904704,1358904719,MU 1358904720,1358904735,KN 1358904736,1358904767,ZA 1358904768,1358904831,NG -1358904832,1358905087,US -1358905088,1358905095,GB +1358904832,1358905095,A2 1358905096,1358905103,GH -1358905104,1358905111,GB +1358905104,1358905111,A2 1358905112,1358905119,TZ 1358905120,1358905127,GY -1358905128,1358905151,GB +1358905128,1358905151,A2 1358905152,1358905159,MG -1358905160,1358905167,GB +1358905160,1358905167,A2 1358905168,1358905183,CD 1358905184,1358905215,GH 1358905216,1358905223,US -1358905224,1358905231,GB +1358905224,1358905231,A2 1358905232,1358905247,GN 1358905248,1358905279,US -1358905280,1358905343,GB +1358905280,1358905295,A2 +1358905296,1358905311,LR +1358905312,1358905327,US +1358905328,1358905343,A2 1358905344,1358909439,UA 1358909440,1358913535,RU 1358913536,1358917631,CH @@ -15047,10 +30094,14 @@ 1358929920,1358934015,LU 1358934016,1358938111,RU 1358938112,1358946303,GB -1358946304,1358950399,DE +1358946304,1358950399,LV 1358950400,1358954495,NL 1358954496,1358970879,ES -1358970880,1358987263,HU +1358970880,1358984191,HU +1358984192,1358984703,SK +1358984704,1358986239,HU +1358986240,1358986495,SK +1358986496,1358987263,HU 1358987264,1359003647,NO 1359003648,1359020031,CZ 1359020032,1359036415,FR @@ -15058,22 +30109,35 @@ 1359052800,1359069183,SE 1359069184,1359101951,RU 1359101952,1359118335,GB -1359118336,1359134719,DE +1359118336,1359118655,DE +1359118656,1359118719,NL +1359118720,1359118815,DE +1359118816,1359118831,NL +1359118832,1359120383,DE +1359120384,1359121407,DK +1359121408,1359123583,DE +1359123584,1359123711,SE +1359123712,1359134303,DE +1359134304,1359134319,NL +1359134320,1359134719,DE 1359134720,1359150079,CZ 1359150080,1359150591,HU 1359150592,1359151103,CZ -1359151104,1359166175,DE +1359151104,1359158207,DE +1359158208,1359158215,CH +1359158216,1359166175,DE 1359166176,1359166191,HK 1359166192,1359167487,DE 1359167488,1359183871,GB 1359183872,1359200255,RU 1359200256,1359216639,AT +1359216640,1359233023,EG 1359233024,1359249407,NL -1359249408,1359263743,CY +1359249408,1359260735,CY +1359260736,1359260751,A2 +1359260752,1359263743,CY 1359263744,1359263999,LB -1359264000,1359264767,CY -1359264768,1359265023,LB -1359265024,1359265791,CY +1359264000,1359265791,CY 1359265792,1359282175,RU 1359282176,1359298559,IL 1359298560,1359314943,RU @@ -15084,14 +30148,50 @@ 1359349360,1359364095,CH 1359364096,1359380479,TR 1359380480,1359396863,PL -1359396864,1359429631,GB +1359396864,1359413247,GB +1359413248,1359413503,DE +1359413504,1359413759,FR +1359413760,1359429631,DE 1359429632,1359446015,LT -1359446016,1359462399,DK -1359462400,1359467063,DE +1359446016,1359451727,DK +1359451728,1359451731,US +1359451732,1359462399,DK +1359462400,1359467007,DE +1359467008,1359467015,US +1359467016,1359467063,DE 1359467064,1359467079,US -1359467080,1359468639,DE +1359467080,1359467087,DE +1359467088,1359467095,US +1359467096,1359467103,BR +1359467104,1359467135,US +1359467136,1359467143,MX +1359467144,1359467215,US +1359467216,1359467223,DE +1359467224,1359467231,US +1359467232,1359467239,DE +1359467240,1359467255,US +1359467256,1359467263,MX +1359467264,1359467455,US +1359467456,1359467487,CA +1359467488,1359467495,DE +1359467496,1359467647,US +1359467648,1359467775,DE +1359467776,1359467815,US +1359467816,1359467903,DE +1359467904,1359468031,US +1359468032,1359468639,DE 1359468640,1359468655,SG -1359468656,1359469943,DE +1359468656,1359468671,JP +1359468672,1359468695,SG +1359468696,1359468711,DE +1359468712,1359468743,SG +1359468744,1359468863,DE +1359468864,1359468879,SG +1359468880,1359468927,DE +1359468928,1359469055,SG +1359469056,1359469311,DE +1359469312,1359469567,SG +1359469568,1359469943,DE 1359469944,1359469983,AT 1359469984,1359470591,DE 1359470592,1359478783,CH @@ -15107,6 +30207,12 @@ 1359553600,1359553631,US 1359553632,1359577087,RU 1359577088,1359609855,ES +1359609856,1359630591,EG +1359630592,1359631359,JO +1359631360,1359639551,EG +1359639552,1359640575,JO +1359640576,1359641343,EG +1359641344,1359642623,JO 1359642624,1359675391,AT 1359675392,1359708159,DE 1359708160,1359740927,BE @@ -15114,11 +30220,11 @@ 1359773696,1359806463,RO 1359806464,1359839231,RU 1359839232,1359871999,CH -1359872000,1359904767,GB +1359872000,1359904767,FR 1359904768,1359937535,DE 1359937536,1359970303,IS 1359970304,1360003071,PL -1360003072,1360007167,RU +1360003072,1360007167,AM 1360007168,1360011263,GB 1360011264,1360015359,AT 1360015360,1360019455,DE @@ -15126,9 +30232,11 @@ 1360023552,1360027647,RU 1360027648,1360031743,AT 1360031744,1360039935,RU -1360039936,1360043743,AT -1360043744,1360043747,AU -1360043748,1360044031,AT +1360039936,1360041439,AT +1360041440,1360041447,CZ +1360041448,1360043671,AT +1360043672,1360043679,CZ +1360043680,1360044031,AT 1360044032,1360048127,SE 1360048128,1360049167,DE 1360049168,1360049183,GB @@ -15139,9 +30247,11 @@ 1360049224,1360049231,JP 1360049232,1360049239,US 1360049240,1360049247,GB -1360049248,1360052223,DE +1360049248,1360050959,DE +1360050960,1360050975,US +1360050976,1360052223,DE 1360052224,1360056319,HU -1360056320,1360060415,RU +1360056320,1360060415,SA 1360060416,1360064511,LT 1360064512,1360068607,GE 1360068608,1360076799,RU @@ -15151,14 +30261,13 @@ 1360093184,1360101375,DE 1360101376,1360105471,UA 1360105472,1360109567,RU -1360109568,1360110975,US -1360110976,1360113663,GB +1360109568,1360113663,KZ 1360113664,1360117759,HU 1360117760,1360121855,FI 1360121856,1360125951,DE 1360125952,1360126975,SI 1360126976,1360127487,HR -1360127488,1360127999,CS +1360127488,1360127999,RS 1360128000,1360128511,MK 1360128512,1360129023,SI 1360129024,1360130047,BA @@ -15175,14 +30284,15 @@ 1360131952,1360134143,IE 1360134144,1360138239,NL 1360138240,1360142335,CH -1360142336,1360146431,NG -1360146432,1360148479,CS -1360148480,1360150527,RS +1360142336,1360146431,KZ +1360146432,1360150527,RS 1360150528,1360158719,RO 1360158720,1360162815,DE 1360162816,1360175103,RU 1360175104,1360179199,NL -1360179200,1360183295,FR +1360179200,1360183215,FR +1360183216,1360183231,BE +1360183232,1360183295,FR 1360183296,1360191487,PL 1360191488,1360195583,FO 1360195584,1360199679,NL @@ -15193,28 +30303,41 @@ 1360216064,1360224255,RU 1360224256,1360225663,ES 1360225664,1360225695,GB -1360225696,1360226079,ES -1360226080,1360226111,IT -1360226112,1360226191,ES -1360226192,1360226199,IT -1360226200,1360228351,ES -1360228352,1360232447,FI +1360225696,1360228351,ES +1360228352,1360231615,FI +1360231616,1360231679,AX +1360231680,1360232447,FI 1360232448,1360236543,RU -1360236544,1360240639,AT +1360236544,1360239135,AT +1360239136,1360239167,DE +1360239168,1360240639,AT 1360240640,1360244735,ES -1360244736,1360257023,GB -1360257024,1360265215,DK +1360244736,1360249855,GB +1360249856,1360250111,CH +1360250112,1360251391,GB +1360251392,1360251647,DE +1360251648,1360252415,GB +1360252416,1360252671,CH +1360252672,1360257023,GB +1360257024,1360259447,DK +1360259448,1360259451,US +1360259452,1360265215,DK 1360265216,1360269311,GB 1360269312,1360273407,KG 1360273408,1360281599,GB 1360281600,1360285695,NL 1360285696,1360289791,DE 1360289792,1360293887,RU -1360293888,1360297983,DE -1360297984,1360302079,FR +1360293888,1360302079,DE 1360302080,1360306175,EE 1360306176,1360310271,RU -1360310272,1360314367,GB +1360310272,1360312319,GG +1360312320,1360312575,GB +1360312576,1360312831,GG +1360312832,1360313087,GB +1360313088,1360313343,GG +1360313344,1360313599,GB +1360313600,1360314367,GG 1360314368,1360318463,RU 1360318464,1360322559,FR 1360322560,1360326655,FI @@ -15225,6 +30348,7 @@ 1360343040,1360347135,SA 1360347136,1360351231,GB 1360351232,1360355327,AZ +1360355328,1360359423,EG 1360359424,1360363519,AT 1360363520,1360367615,IT 1360367616,1360371711,IE @@ -15242,6 +30366,7 @@ 1360405248,1360405503,SE 1360405504,1360408575,GB 1360408576,1360412671,RU +1360412672,1360420863,DZ 1360420864,1360424959,TR 1360424960,1360429055,RU 1360429056,1360433151,UA @@ -15253,15 +30378,15 @@ 1360457728,1360459103,FI 1360459104,1360459135,IL 1360459136,1360461823,FI -1360461824,1360465919,LT +1360461824,1360465919,RU 1360465920,1360470015,UA 1360470016,1360474111,FR 1360474112,1360478207,GB 1360478208,1360482303,CH 1360482304,1360486399,IT -1360486400,1360502783,RU -1360502784,1360506879,IR -1360506880,1360515071,RU +1360486400,1360494591,RU +1360494592,1360498687,DK +1360498688,1360515071,RU 1360515072,1360519167,GB 1360519168,1360524031,NL 1360524032,1360524287,US @@ -15271,11 +30396,10 @@ 1360539648,1360543743,NL 1360543744,1360547839,DE 1360547840,1360551935,RU -1360551936,1360556031,SI +1360551936,1360556031,NL 1360556032,1360564223,RU 1360564224,1360568319,AT 1360568320,1360572415,ES -1360572416,1360576511,GR 1360576512,1360580607,GB 1360580608,1360584703,UA 1360584704,1360588799,IT @@ -15287,37 +30411,49 @@ 1360613376,1360617471,SE 1360617472,1360621567,IT 1360621568,1360625663,ES -1360625664,1360629759,RU +1360625664,1360627711,A2 +1360627712,1360627743,LB +1360627744,1360627967,A2 +1360627968,1360628095,IQ +1360628096,1360628223,LU +1360628224,1360628735,LB +1360628736,1360628991,IQ +1360628992,1360629503,A2 +1360629504,1360629759,IQ 1360629760,1360633855,SE 1360633856,1360637951,RU 1360637952,1360642047,FO -1360642048,1360643647,FR -1360643648,1360643711,GB -1360643712,1360646143,FR +1360642048,1360645711,FR +1360645712,1360645719,GB +1360645720,1360646143,FR 1360646144,1360650239,AT 1360650240,1360654335,UA 1360654336,1360658431,EE 1360658432,1360666623,PL 1360666624,1360674815,NO +1360674816,1360678911,DZ 1360678912,1360683007,RU 1360683008,1360691199,GB 1360691200,1360699391,RU -1360699392,1360703487,GE +1360699392,1360703487,DE 1360703488,1360707583,RU -1360707584,1360711679,IT +1360707584,1360709631,IT +1360709632,1360711679,AL 1360711680,1360715775,NL 1360715776,1360728063,SE 1360728064,1360732159,FR 1360732160,1360736255,NO 1360736256,1360740351,RU -1360740352,1360752639,GB +1360740352,1360743679,GB +1360743680,1360743935,FR +1360743936,1360752639,GB 1360752640,1360756735,DE 1360756736,1360760831,IT 1360760832,1360764927,RU 1360764928,1360769023,DE 1360769024,1360773119,IT 1360773120,1360777215,CZ -1360777216,1360781311,IT +1360777216,1360781311,DK 1360781312,1360785407,DE 1360785408,1360793599,RU 1360793600,1360797695,CZ @@ -15345,6 +30481,7 @@ 1360859136,1360863231,LT 1360863232,1360867327,NO 1360867328,1360879615,GB +1360879616,1360883711,EG 1360883712,1360887807,RU 1360887808,1360890367,FI 1360890368,1360890623,RU @@ -15352,39 +30489,74 @@ 1360890880,1360891391,RU 1360891392,1360891647,FI 1360891648,1360891903,RU -1360891904,1360892159,IT -1360892160,1360892671,CH +1360891904,1360892427,CH +1360892428,1360892431,IT +1360892432,1360892479,CH +1360892480,1360892487,FR +1360892488,1360892495,CH +1360892496,1360892502,GB +1360892503,1360892671,CH 1360892672,1360892703,IT -1360892704,1360892767,CH -1360892768,1360892771,IT -1360892772,1360893951,CH -1360893952,1360894151,IT -1360894152,1360894975,CH +1360892704,1360892735,CH +1360892736,1360892739,EE +1360892740,1360892743,GB +1360892744,1360892763,CH +1360892764,1360892771,IT +1360892772,1360892791,CH +1360892792,1360892799,IT +1360892800,1360892807,CH +1360892808,1360892823,IT +1360892824,1360892927,CH +1360892928,1360893055,IT +1360893056,1360893191,CH +1360893192,1360893195,IT +1360893196,1360893831,CH +1360893832,1360893835,IT +1360893836,1360893951,CH +1360893952,1360894207,IT +1360894208,1360894975,CH 1360894976,1360895007,IT -1360895008,1360895999,CH +1360895008,1360895751,CH +1360895752,1360895755,IT +1360895756,1360895999,CH 1360896000,1360900095,QA -1360900096,1360916479,IT -1360916480,1360920575,RU -1360920576,1360932863,IT +1360900096,1360904335,IT +1360904336,1360904343,GB +1360904344,1360905039,IT +1360905040,1360905055,GB +1360905056,1360905391,IT +1360905392,1360905407,GB +1360905408,1360906687,IT +1360906688,1360906719,GB +1360906720,1360907679,IT +1360907680,1360907711,GB +1360907712,1360909391,IT +1360909392,1360909407,GB +1360909408,1360910495,IT +1360910496,1360910511,GB +1360910512,1360910527,IT +1360910528,1360910559,GB +1360910560,1360916479,IT +1360916480,1360920575,IR +1360920576,1360928767,IT +1360928768,1360932863,NL 1360932864,1360936959,RU -1360936960,1360941055,IT +1360936960,1360941055,NL 1360941056,1360945151,BY 1360945152,1360949247,DE 1360949248,1360953343,RU -1360953344,1360957439,DE -1360957440,1360961535,AZ +1360953344,1360957439,PL +1360957440,1360961535,DE 1360961536,1360965631,UA 1360965632,1360977919,RU -1360977920,1360986111,CZ -1360986112,1360987135,GB -1360987136,1360987535,CZ -1360987536,1360987647,GB -1360987648,1360987935,CZ +1360977920,1360987535,CZ +1360987536,1360987903,GB +1360987904,1360987919,CZ +1360987920,1360987927,GB +1360987928,1360987935,CZ 1360987936,1360987983,SK 1360987984,1360987999,CZ -1360988000,1360988007,GB -1360988008,1360988031,CZ -1360988032,1360988039,GB +1360988000,1360988039,GB 1360988040,1360988047,CZ 1360988048,1360988055,GB 1360988056,1360988063,SK @@ -15392,20 +30564,24 @@ 1360988080,1360988159,GB 1360988160,1360988415,SK 1360988416,1360988927,CZ -1360988928,1360989439,SK +1360988928,1360989183,GB +1360989184,1360989439,SK 1360989440,1360989695,GB 1360989696,1360990079,CZ 1360990080,1360990207,GB -1360990208,1360990975,CZ +1360990208,1360990463,CZ +1360990464,1360990719,GB +1360990720,1360990975,CZ 1360990976,1360991231,GB -1360991232,1360991999,CZ +1360991232,1360991743,CZ +1360991744,1360991999,GB 1360992000,1360992255,SK -1360992256,1360993023,CZ -1360993024,1360994047,SK -1360994048,1360994303,GB +1360992256,1360992511,GB +1360992512,1360992767,CZ +1360992768,1360994303,GB 1360994304,1360998399,CZ 1360998400,1361002495,FI -1361002496,1361006591,IT +1361002496,1361006591,GB 1361006592,1361010687,DK 1361010688,1361018879,GB 1361018880,1361022975,AT @@ -15413,92 +30589,92 @@ 1361027072,1361035263,IR 1361035264,1361035527,NL 1361035528,1361035535,IT -1361035536,1361035547,ES +1361035536,1361035543,IQ +1361035544,1361035547,ES 1361035548,1361035551,DE -1361035552,1361035559,GB +1361035552,1361035555,IQ +1361035556,1361035559,NL 1361035560,1361035563,IQ -1361035564,1361035567,GB -1361035568,1361035583,ES -1361035584,1361035591,NL -1361035592,1361035599,IQ +1361035564,1361035567,DE +1361035568,1361035575,ES +1361035576,1361035583,DE +1361035584,1361035587,IT +1361035588,1361035599,IQ 1361035600,1361035607,NL -1361035608,1361035615,IQ -1361035616,1361035623,ES +1361035608,1361035615,IT +1361035616,1361035619,GB +1361035620,1361035623,IT 1361035624,1361035627,DE -1361035628,1361035639,DZ -1361035640,1361035643,IQ -1361035644,1361035647,GB -1361035648,1361035651,TR -1361035652,1361035655,DE -1361035656,1361035667,IQ -1361035668,1361035671,DZ -1361035672,1361035679,ES +1361035628,1361035631,DZ +1361035632,1361035635,IT +1361035636,1361035655,IQ +1361035656,1361035663,TR +1361035664,1361035671,IQ +1361035672,1361035675,IT +1361035676,1361035679,IQ 1361035680,1361035683,IE -1361035684,1361035687,GB -1361035688,1361035691,CS -1361035692,1361035695,IQ -1361035696,1361035711,BA -1361035712,1361035715,DE -1361035716,1361035719,IQ -1361035720,1361035723,ES -1361035724,1361035727,DE -1361035728,1361035735,IQ -1361035736,1361035743,IT -1361035744,1361035751,TR -1361035752,1361035759,KW -1361035760,1361035763,IQ -1361035764,1361035767,DE -1361035768,1361035779,IQ -1361035780,1361035783,KW -1361035784,1361035787,IT -1361035788,1361035791,DZ -1361035792,1361035799,IQ +1361035684,1361035687,IQ +1361035688,1361035691,GB +1361035692,1361035715,IQ +1361035716,1361035723,GB +1361035724,1361035727,IQ +1361035728,1361035735,NL +1361035736,1361035739,IQ +1361035740,1361035743,IT +1361035744,1361035751,IQ +1361035752,1361035755,GB +1361035756,1361035759,IQ +1361035760,1361035763,ES +1361035764,1361035767,NL +1361035768,1361035775,IQ +1361035776,1361035779,GB +1361035780,1361035783,PL +1361035784,1361035799,IQ 1361035800,1361035807,TR -1361035808,1361035811,DE +1361035808,1361035811,NL 1361035812,1361035815,BA -1361035816,1361035823,IT +1361035816,1361035823,NL 1361035824,1361035831,DE 1361035832,1361035839,BE 1361035840,1361035847,ES -1361035848,1361035855,NL +1361035848,1361035851,GB +1361035852,1361035855,IQ 1361035856,1361035863,ES 1361035864,1361035871,BE -1361035872,1361035879,ES -1361035880,1361035887,DE -1361035888,1361035895,GB -1361035896,1361035903,IQ -1361035904,1361035907,DE +1361035872,1361035875,GB +1361035876,1361035879,NL +1361035880,1361035899,IQ +1361035900,1361035903,NL +1361035904,1361035907,KW 1361035908,1361035911,ES 1361035912,1361035915,IQ -1361035916,1361035919,HR +1361035916,1361035919,IT 1361035920,1361035923,CH -1361035924,1361035927,IE -1361035928,1361035931,GB +1361035924,1361035927,IQ +1361035928,1361035931,DE 1361035932,1361035935,TR -1361035936,1361035939,IE -1361035940,1361035943,DE -1361035944,1361035951,US -1361035952,1361035955,CS -1361035956,1361035959,GB -1361035960,1361035963,GR +1361035936,1361035943,GB +1361035944,1361035959,IQ +1361035960,1361035963,GB 1361035964,1361035967,CH -1361035968,1361035975,DE -1361035976,1361035983,IQ -1361035984,1361035991,DE -1361035992,1361035995,IQ +1361035968,1361035975,GB +1361035976,1361035979,NL +1361035980,1361035983,IQ +1361035984,1361035995,DE 1361035996,1361035999,IE 1361036000,1361036015,GB -1361036016,1361036019,ES -1361036020,1361036027,IQ -1361036028,1361036031,GB +1361036016,1361036019,IQ +1361036020,1361036023,NL +1361036024,1361036031,IQ 1361036032,1361036039,IE -1361036040,1361036055,IQ +1361036040,1361036043,IT +1361036044,1361036055,IQ 1361036056,1361036063,NL 1361036064,1361036071,DE 1361036072,1361036079,BE 1361036080,1361036087,FR 1361036088,1361036095,IT -1361036096,1361036103,SE +1361036096,1361036103,IQ 1361036104,1361036111,NO 1361036112,1361036119,RO 1361036120,1361036127,HU @@ -15508,220 +30684,223 @@ 1361036152,1361036167,ES 1361036168,1361036175,IQ 1361036176,1361036191,GB -1361036192,1361036199,KW -1361036200,1361036215,IQ -1361036216,1361036223,TR -1361036224,1361036231,DE -1361036232,1361036239,IQ +1361036192,1361036199,IQ +1361036200,1361036207,TR +1361036208,1361036215,IQ +1361036216,1361036223,DE +1361036224,1361036239,IQ 1361036240,1361036243,NL 1361036244,1361036247,IT 1361036248,1361036251,TN -1361036252,1361036255,GR +1361036252,1361036255,NL 1361036256,1361036259,GB -1361036260,1361036263,IS -1361036264,1361036271,KW -1361036272,1361036287,IQ -1361036288,1361036291,IT -1361036292,1361036295,IE +1361036260,1361036287,IQ +1361036288,1361036295,IT 1361036296,1361036299,IQ -1361036300,1361036303,IT +1361036300,1361036303,GB 1361036304,1361036307,ES -1361036308,1361036311,DE -1361036312,1361036315,TR -1361036316,1361036327,DZ -1361036328,1361036335,MA -1361036336,1361036351,DZ -1361036352,1361036359,IQ +1361036308,1361036311,NL +1361036312,1361036315,IQ +1361036316,1361036319,DZ +1361036320,1361036327,IQ +1361036328,1361036331,DZ +1361036332,1361036335,IT +1361036336,1361036359,IQ 1361036360,1361036367,DZ -1361036368,1361036371,GB -1361036372,1361036375,IT +1361036368,1361036371,TR +1361036372,1361036375,GB 1361036376,1361036379,NL -1361036380,1361036383,IQ +1361036380,1361036383,GB 1361036384,1361036387,DZ -1361036388,1361036391,ES -1361036392,1361036395,IQ -1361036396,1361036403,ES -1361036404,1361036407,KW -1361036408,1361036411,IQ -1361036412,1361036415,ES -1361036416,1361036419,IQ +1361036388,1361036403,IQ +1361036404,1361036411,IT +1361036412,1361036415,NL +1361036416,1361036419,US 1361036420,1361036423,ES -1361036424,1361036431,IQ +1361036424,1361036431,GB 1361036432,1361036435,EG -1361036436,1361036455,IQ -1361036456,1361036459,NL -1361036460,1361036463,TR -1361036464,1361036471,IQ -1361036472,1361036475,IL -1361036476,1361036479,IQ -1361036480,1361036487,KW -1361036488,1361036491,GB -1361036492,1361036495,KW -1361036496,1361036507,IQ -1361036508,1361036511,ES -1361036512,1361036515,TR -1361036516,1361036523,IT -1361036524,1361036527,GB +1361036436,1361036459,IQ +1361036460,1361036471,TR +1361036472,1361036475,GB +1361036476,1361036491,IQ +1361036492,1361036495,GB +1361036496,1361036515,IQ +1361036516,1361036519,IT +1361036520,1361036523,GB +1361036524,1361036527,IQ 1361036528,1361036531,IT -1361036532,1361036543,IQ -1361036544,1361036551,DE +1361036532,1361036535,IQ +1361036536,1361036551,TR 1361036552,1361036559,GB -1361036560,1361036567,TR -1361036568,1361036579,IQ -1361036580,1361036583,ES -1361036584,1361036591,IQ -1361036592,1361036595,KW -1361036596,1361036599,ES -1361036600,1361036603,KW -1361036604,1361036607,ES -1361036608,1361036611,TR -1361036612,1361036623,GB +1361036560,1361036567,IQ +1361036568,1361036575,NL +1361036576,1361036579,IQ +1361036580,1361036583,IT +1361036584,1361036595,IQ +1361036596,1361036599,GI +1361036600,1361036607,IQ +1361036608,1361036611,GI +1361036612,1361036615,IQ +1361036616,1361036623,GB 1361036624,1361036631,IQ -1361036632,1361036635,ES +1361036632,1361036635,GR 1361036636,1361036639,GB -1361036640,1361036663,IQ +1361036640,1361036655,IQ +1361036656,1361036663,NL 1361036664,1361036667,DZ 1361036668,1361036671,CH 1361036672,1361036675,TR -1361036676,1361036679,ES -1361036680,1361036719,IQ -1361036720,1361036727,DZ +1361036676,1361036679,NL +1361036680,1361036687,IQ +1361036688,1361036695,NL +1361036696,1361036703,TR +1361036704,1361036711,IQ +1361036712,1361036719,GB +1361036720,1361036727,IQ 1361036728,1361036735,US -1361036736,1361036815,IQ -1361036816,1361036819,NL -1361036820,1361036823,ES -1361036824,1361036827,DE +1361036736,1361036763,IQ +1361036764,1361036767,KW +1361036768,1361036783,US +1361036784,1361036787,GB +1361036788,1361036791,IQ +1361036792,1361036799,NL +1361036800,1361036823,IQ +1361036824,1361036827,GB 1361036828,1361036831,DZ -1361036832,1361036847,IQ +1361036832,1361036839,NL +1361036840,1361036847,IQ 1361036848,1361036851,DZ -1361036852,1361036863,IQ -1361036864,1361036871,TR -1361036872,1361036879,IQ +1361036852,1361036855,IQ +1361036856,1361036863,NL +1361036864,1361036867,IQ +1361036868,1361036871,DE +1361036872,1361036879,TR 1361036880,1361036887,US 1361036888,1361036891,GB -1361036892,1361036895,IQ -1361036896,1361036899,NL +1361036892,1361036899,NL 1361036900,1361036919,IQ 1361036920,1361036923,IT -1361036924,1361036927,GB -1361036928,1361036935,KW -1361036936,1361036951,IQ -1361036952,1361036959,TR -1361036960,1361036971,IQ -1361036972,1361036979,DZ -1361036980,1361036983,FR -1361036984,1361036999,IQ -1361037000,1361037007,PL -1361037008,1361037015,IQ -1361037016,1361037023,DZ -1361037024,1361037055,KW -1361037056,1361037059,IQ -1361037060,1361037063,ES -1361037064,1361037067,IQ -1361037068,1361037071,TR -1361037072,1361037075,IQ +1361036924,1361036927,DZ +1361036928,1361036935,TR +1361036936,1361036943,NL +1361036944,1361036991,IQ +1361036992,1361037007,TR +1361037008,1361037067,IQ +1361037068,1361037075,TR 1361037076,1361037079,HU -1361037080,1361037083,IQ -1361037084,1361037087,DZ -1361037088,1361037091,GB -1361037092,1361037119,IQ -1361037120,1361037127,TR -1361037128,1361037135,DE -1361037136,1361037159,IQ -1361037160,1361037167,KW -1361037168,1361037179,IQ +1361037080,1361037087,IQ +1361037088,1361037091,AF +1361037092,1361037095,IQ +1361037096,1361037099,IT +1361037100,1361037103,TR +1361037104,1361037111,NL +1361037112,1361037115,US +1361037116,1361037119,NL +1361037120,1361037123,US +1361037124,1361037127,IQ +1361037128,1361037143,NL +1361037144,1361037151,IQ +1361037152,1361037159,US +1361037160,1361037171,IQ +1361037172,1361037175,TR +1361037176,1361037179,IQ 1361037180,1361037183,GB -1361037184,1361037191,US -1361037192,1361037199,IQ -1361037200,1361037203,GB +1361037184,1361037203,IQ 1361037204,1361037207,FR -1361037208,1361037215,DZ -1361037216,1361037223,TR -1361037224,1361037231,ES -1361037232,1361037271,IQ +1361037208,1361037215,DE +1361037216,1361037255,IQ +1361037256,1361037263,NL +1361037264,1361037271,IQ 1361037272,1361037279,NL 1361037280,1361037295,IQ 1361037296,1361037311,DZ 1361037312,1361037319,IQ 1361037320,1361037327,GB -1361037328,1361037339,IQ -1361037340,1361037343,TR -1361037344,1361037359,IQ -1361037360,1361037363,ES -1361037364,1361037367,DZ -1361037368,1361037387,IQ -1361037388,1361037391,TR +1361037328,1361037351,IQ +1361037352,1361037359,NL +1361037360,1361037367,IQ +1361037368,1361037375,TR +1361037376,1361037391,IQ 1361037392,1361037395,IT 1361037396,1361037399,US -1361037400,1361037407,IQ +1361037400,1361037407,DZ 1361037408,1361037415,TR -1361037416,1361037443,IQ -1361037444,1361037447,DZ +1361037416,1361037439,IQ +1361037440,1361037447,TR 1361037448,1361037455,IQ -1361037456,1361037463,NL +1361037456,1361037463,DZ 1361037464,1361037471,CH -1361037472,1361037487,NL -1361037488,1361037495,IQ -1361037496,1361037503,DZ -1361037504,1361037515,IQ -1361037516,1361037519,JO -1361037520,1361037527,IQ -1361037528,1361037551,DZ -1361037552,1361037559,QA -1361037560,1361037567,IQ +1361037472,1361037479,NL +1361037480,1361037487,DZ +1361037488,1361037503,IQ +1361037504,1361037511,DE +1361037512,1361037527,IQ +1361037528,1361037531,NL +1361037532,1361037535,DZ +1361037536,1361037551,TR +1361037552,1361037567,IQ 1361037568,1361037575,TR 1361037576,1361037583,IQ 1361037584,1361037587,GB -1361037588,1361037591,ES -1361037592,1361037599,US -1361037600,1361037611,IQ +1361037588,1361037591,NL +1361037592,1361037607,IQ +1361037608,1361037611,NL 1361037612,1361037615,ES -1361037616,1361037619,IQ -1361037620,1361037631,ES +1361037616,1361037619,NL +1361037620,1361037627,ES +1361037628,1361037631,IT 1361037632,1361037639,DZ 1361037640,1361037667,IQ 1361037668,1361037671,DZ -1361037672,1361037683,IQ +1361037672,1361037679,TR +1361037680,1361037683,IQ 1361037684,1361037687,TR 1361037688,1361037695,IQ -1361037696,1361037703,PL +1361037696,1361037703,TR 1361037704,1361037771,IQ 1361037772,1361037775,GB 1361037776,1361037783,NL -1361037784,1361037823,IQ -1361037824,1361037827,ES -1361037828,1361037835,IQ +1361037784,1361037819,IQ +1361037820,1361037823,NL +1361037824,1361037835,IQ 1361037836,1361037839,ES -1361037840,1361037847,TR -1361037848,1361037851,IQ +1361037840,1361037847,IQ +1361037848,1361037851,NL 1361037852,1361037855,ES 1361037856,1361037871,IQ 1361037872,1361037875,ES -1361037876,1361037879,AL +1361037876,1361037879,NL 1361037880,1361037883,PT 1361037884,1361037891,IQ 1361037892,1361037895,ES -1361037896,1361037907,IQ +1361037896,1361037899,NL +1361037900,1361037903,IQ +1361037904,1361037907,NL 1361037908,1361037911,US -1361037912,1361037919,TR -1361037920,1361038007,IQ -1361038008,1361038015,TR +1361037912,1361037919,NL +1361037920,1361037999,IQ +1361038000,1361038015,NL 1361038016,1361038023,IQ 1361038024,1361038031,IT 1361038032,1361038039,IQ 1361038040,1361038047,US -1361038048,1361038095,IQ +1361038048,1361038055,IQ +1361038056,1361038071,NL +1361038072,1361038087,IQ +1361038088,1361038095,NL 1361038096,1361038103,US -1361038104,1361038127,IQ +1361038104,1361038119,IQ +1361038120,1361038127,NL 1361038128,1361038135,MA 1361038136,1361038143,IQ -1361038144,1361038147,KW +1361038144,1361038147,NL 1361038148,1361038159,GB -1361038160,1361038163,KW +1361038160,1361038163,NL 1361038164,1361038175,GB -1361038176,1361038179,KW +1361038176,1361038179,NL 1361038180,1361038191,GB -1361038192,1361038199,IQ +1361038192,1361038195,NL +1361038196,1361038199,IQ 1361038200,1361038211,GB 1361038212,1361038215,NL 1361038216,1361038223,GB @@ -15730,11 +30909,13 @@ 1361038240,1361038247,IQ 1361038248,1361038271,US 1361038272,1361038275,GB -1361038276,1361038279,KW +1361038276,1361038279,NL 1361038280,1361038287,GB -1361038288,1361038295,IQ +1361038288,1361038295,NL 1361038296,1361038303,DE -1361038304,1361038335,US +1361038304,1361038311,IQ +1361038312,1361038319,NL +1361038320,1361038335,US 1361038336,1361039359,NL 1361039360,1361043455,IT 1361043456,1361051647,NO @@ -15749,7 +30930,11 @@ 1362396416,1362396927,US 1362396928,1362397183,CM 1362397184,1362397255,GB -1362397256,1362399231,FR +1362397256,1362397439,FR +1362397440,1362397503,US +1362397504,1362398463,FR +1362398464,1362398719,DE +1362398720,1362399231,FR 1362399232,1362399263,GB 1362399264,1362399487,FR 1362399488,1362400767,GB @@ -15761,17 +30946,18 @@ 1362411520,1362413273,MQ 1362413274,1362413567,FR 1362413568,1362413587,CM -1362413588,1362413823,FR -1362413824,1362414847,US -1362414848,1362414975,GB -1362414976,1362415359,FR -1362415360,1362415487,DE -1362415488,1362415615,FR +1362413588,1362414079,FR +1362414080,1362414847,US +1362414848,1362415103,GB +1362415104,1362415359,FR +1362415360,1362415615,DE 1362415616,1362417663,GP 1362417664,1362419711,SG 1362419712,1362423039,FR 1362423040,1362423167,SG -1362423168,1362423263,FR +1362423168,1362423231,FR +1362423232,1362423239,GB +1362423240,1362423263,FR 1362423264,1362423295,SG 1362423296,1362423807,VE 1362423808,1362425855,SG @@ -15779,62 +30965,13 @@ 1362426624,1362426879,FR 1362426880,1362427903,MQ 1362427904,1362755583,FR -1362755584,1362813695,NL -1362813696,1362817023,BE -1362817024,1362817055,NL -1362817056,1362817063,BE -1362817064,1362817071,NL -1362817072,1362817087,BE -1362817088,1362817127,NL -1362817128,1362817135,BE -1362817136,1362817563,NL -1362817564,1362817567,BE -1362817568,1362817743,NL -1362817744,1362821119,BE -1362821120,1362837503,NL -1362837504,1362845695,BE -1362845696,1362870271,NL -1362870272,1362872319,BE -1362872320,1362872351,NL -1362872352,1362873855,BE -1362873856,1362873867,NL -1362873868,1362874367,BE -1362874368,1362874375,NL -1362874376,1362875903,BE -1362875904,1362875907,NL -1362875908,1362876415,BE -1362876416,1362876591,NL -1362876592,1362876607,BE -1362876608,1362876639,NL -1362876640,1362877951,BE -1362877952,1362878023,NL -1362878024,1362878463,BE -1362878464,1362878479,NL -1362878480,1362879999,BE -1362880000,1362880007,NL -1362880008,1362880511,BE -1362880512,1362880967,NL -1362880968,1362880975,BE -1362880976,1362881023,NL -1362881024,1362881055,BE -1362881056,1362881111,NL -1362881112,1362882047,BE -1362882048,1362882207,NL -1362882208,1362882211,BE -1362882212,1362882231,NL -1362882232,1362884095,BE -1362884096,1362884099,NL -1362884100,1362885119,BE -1362885120,1362886399,NL -1362886400,1362886400,BE -1362886401,1362886409,NL +1362755584,1362886409,NL 1362886410,1362886413,BE 1362886414,1362886416,NL 1362886417,1362886419,BE 1362886420,1362886421,NL 1362886422,1362886422,BE -1362886423,1362886423,NL -1362886424,1362886655,BE +1362886423,1362886655,NL 1362886656,1363017727,ES 1363017728,1363148799,CH 1363148800,1363410943,FR @@ -15848,19 +30985,32 @@ 1364328448,1364459519,BE 1364459520,1364525055,PT 1364525056,1364526335,NL -1364526336,1364526591,CY +1364526336,1364526591,US 1364526592,1364528639,GB 1364528640,1364528895,UA 1364528896,1364530175,GB -1364530176,1364590591,NL +1364530176,1364539903,NL +1364539904,1364540159,US +1364540160,1364540671,NL +1364540672,1364540927,US +1364540928,1364577023,NL +1364577024,1364577279,GB +1364577280,1364577791,NL +1364577792,1364578303,GB +1364578304,1364581375,NL +1364581376,1364582399,LY +1364582400,1364582415,NL +1364582416,1364582431,LB +1364582432,1364585983,NL +1364585984,1364586240,LB +1364586241,1364586495,NL +1364586496,1364586752,LB +1364586753,1364590591,NL 1364590592,1364721663,GB 1364721664,1364725759,SE 1364725760,1364733951,DE 1364733952,1364738047,IT -1364738048,1364739071,US -1364739072,1364739583,UA -1364739584,1364740095,US -1364740096,1364742143,KZ +1364738048,1364742143,NO 1364742144,1364746239,RU 1364746240,1364749311,FR 1364749312,1364749374,BE @@ -15868,14 +31018,12 @@ 1364749456,1364749463,BE 1364749464,1364749471,FR 1364749472,1364749583,BE -1364749584,1364749631,FR -1364749632,1364749663,BE -1364749664,1364749823,FR -1364749824,1364749839,BE -1364749840,1364749847,FR -1364749848,1364749855,BE -1364749856,1364749871,FR -1364749872,1364750079,BE +1364749584,1364749599,FR +1364749600,1364749696,BE +1364749697,1364749823,FR +1364749824,1364749983,BE +1364749984,1364749991,FR +1364749992,1364750079,BE 1364750080,1364750335,FR 1364750336,1364754431,RU 1364754432,1364758527,SK @@ -15889,11 +31037,10 @@ 1364795392,1364799487,ES 1364799488,1364803583,SK 1364803584,1364811775,RU -1364811776,1364811807,LU -1364811808,1364815871,DE +1364811776,1364815871,DE 1364815872,1364819967,RU 1364819968,1364824063,GB -1364824064,1364828159,IE +1364824064,1364828159,SE 1364828160,1364829439,GB 1364829440,1364829487,FR 1364829488,1364829503,GB @@ -15902,12 +31049,14 @@ 1364832256,1364836351,RU 1364836352,1364840447,DE 1364840448,1364844543,AM -1364844544,1364852479,DE +1364844544,1364852111,DE +1364852112,1364852127,GB +1364852128,1364852479,DE 1364852480,1364852735,GB 1364852736,1364856831,RU 1364856832,1364860927,IQ 1364860928,1364865023,DE -1364865024,1364869119,GB +1364865024,1364869119,PT 1364869120,1364873215,FI 1364873216,1364877311,GB 1364877312,1364881407,ES @@ -15920,7 +31069,7 @@ 1364905984,1364910079,RU 1364910080,1364914175,UA 1364914176,1364918271,CZ -1364918272,1364922367,NL +1364918272,1364922367,SE 1364922368,1364926463,TR 1364926464,1364934655,RU 1364934656,1364938751,FR @@ -15928,20 +31077,41 @@ 1364942848,1364946943,GB 1364946944,1364947167,TR 1364947168,1364947199,US -1364947200,1364949759,TR -1364949760,1364951039,GB +1364947200,1364948479,GB +1364948480,1364949247,TR +1364949248,1364949503,CY +1364949504,1364949759,TR +1364949760,1364950015,CY +1364950016,1364950527,TR +1364950528,1364950783,CY +1364950784,1364950847,TR +1364950848,1364950911,GB +1364950912,1364951039,TR 1364951040,1364959231,IR 1364959232,1364963327,DE 1364963328,1364967423,RU -1364967424,1364971519,GB +1364967424,1364969983,GB +1364969984,1364970239,FR +1364970240,1364970495,US +1364970496,1364971519,GB 1364971520,1364975615,CZ -1364979712,1364983807,GB +1364975616,1364979711,BJ +1364979712,1364983039,GB +1364983040,1364983551,CH +1364983552,1364983807,GB 1364983808,1364991999,DE 1364992000,1364996095,IT 1364996096,1365000191,GR -1365000192,1365002751,SE -1365002752,1365003039,GB -1365003040,1365004287,SE +1365000192,1365002431,SE +1365002432,1365002447,GB +1365002448,1365002751,SE +1365002752,1365003263,GB +1365003264,1365003903,SE +1365003904,1365004035,GB +1365004036,1365004039,SE +1365004040,1365004047,GB +1365004048,1365004063,SE +1365004064,1365004287,GB 1365004288,1365008383,FR 1365008384,1365012479,CH 1365012480,1365016575,FR @@ -15953,8 +31123,38 @@ 1365028864,1365032959,NL 1365032960,1365041151,PT 1365041152,1365041407,IQ -1365041408,1365045247,LU -1365045248,1365047295,AT +1365041408,1365041663,LU +1365041664,1365041695,FR +1365041696,1365041727,GB +1365041728,1365042047,LU +1365042048,1365042055,GB +1365042056,1365042175,LU +1365042176,1365044479,FR +1365044480,1365044655,LU +1365044656,1365044719,FR +1365044720,1365044895,LU +1365044896,1365044911,FR +1365044912,1365044959,LU +1365044960,1365044975,BE +1365044976,1365045215,LU +1365045216,1365045247,BE +1365045248,1365045535,AT +1365045536,1365045543,BA +1365045544,1365045551,BG +1365045552,1365045559,DE +1365045560,1365045567,GB +1365045568,1365045575,HR +1365045576,1365045583,AT +1365045584,1365045591,PL +1365045592,1365045599,RO +1365045600,1365045607,RU +1365045608,1365045615,RS +1365045616,1365045623,SI +1365045624,1365045631,SK +1365045632,1365045639,CZ +1365045640,1365045647,UA +1365045648,1365045663,HU +1365045664,1365047295,AT 1365047296,1365047423,SK 1365047424,1365047551,AT 1365047552,1365047647,SK @@ -15973,29 +31173,29 @@ 1365048888,1365048895,AT 1365048896,1365048927,SK 1365048928,1365049343,AT -1365049344,1365057535,FR -1365057536,1365061631,IR +1365049344,1365054263,FR +1365054264,1365054271,US +1365054272,1365057535,FR +1365057536,1365061631,IT 1365061632,1365065727,NL 1365065728,1365073919,BA 1365073920,1365078015,NO 1365078016,1365082111,DE 1365082112,1365090303,SE 1365090304,1365094399,NO -1365094400,1365095055,FR -1365095056,1365095071,GB -1365095072,1365095087,FR +1365094400,1365095087,FR 1365095088,1365095095,GB 1365095096,1365095575,FR 1365095576,1365095583,GB -1365095584,1365097215,FR +1365095584,1365096703,FR +1365096704,1365096711,GB +1365096712,1365096735,FR +1365096736,1365096767,IT +1365096768,1365097215,FR 1365097216,1365097471,ES 1365097472,1365097727,FR -1365097728,1365097783,CH -1365097784,1365097791,FR -1365097792,1365097839,CH -1365097840,1365097855,FR -1365097856,1365097919,CH -1365097920,1365098495,FR +1365097728,1365097983,CH +1365097984,1365098495,FR 1365098496,1365102591,HU 1365102592,1365102911,ES 1365102912,1365102919,GB @@ -16011,14 +31211,14 @@ 1365103776,1365103791,GB 1365103792,1365103871,ES 1365103872,1365104135,GB -1365104136,1365106687,ES +1365104136,1365104199,ES +1365104200,1365104207,GB +1365104208,1365106687,ES 1365106688,1365110783,GB 1365110784,1365114879,FR 1365114880,1365118975,BA 1365118976,1365127167,RU -1365127168,1365129471,AT -1365129472,1365129727,IT -1365129728,1365130271,AT +1365127168,1365130271,AT 1365130272,1365130303,IT 1365130304,1365130495,AT 1365130496,1365131007,IT @@ -16026,10 +31226,11 @@ 1365131264,1365139455,SE 1365139456,1365147647,CH 1365147648,1365155839,RU -1365155840,1365159935,NL -1365159936,1365164031,NO -1365164032,1365168127,BH -1365168128,1365172223,GB +1365155840,1365159935,SE +1365159936,1365164031,HU +1365164032,1365166255,GB +1365166256,1365166271,IE +1365166272,1365172223,GB 1365172224,1365176319,LV 1365176320,1365180415,HU 1365180416,1365183231,DE @@ -16042,13 +31243,53 @@ 1365204992,1365209087,CZ 1365209088,1365213183,BE 1365213184,1365217279,RU -1365217280,1365219327,PA -1365219328,1365219839,RU -1365219840,1365220351,PA -1365220352,1365221247,SC -1365221248,1365221375,PA +1365217280,1365220391,GB +1365220392,1365220399,ZA +1365220400,1365220471,GB +1365220472,1365220479,US +1365220480,1365220487,AU +1365220488,1365220495,GB +1365220496,1365220503,US +1365220504,1365220511,GB +1365220512,1365220519,US +1365220520,1365220527,GB +1365220528,1365220535,IS +1365220536,1365220551,GB +1365220552,1365220567,IS +1365220568,1365220575,GB +1365220576,1365220583,CH +1365220584,1365220599,TR +1365220600,1365220607,GR +1365220608,1365220615,TR +1365220616,1365220623,GB +1365220624,1365220631,US +1365220632,1365220663,GB +1365220664,1365220679,US +1365220680,1365220687,IT +1365220688,1365220703,US +1365220704,1365220719,GB +1365220720,1365220727,US +1365220728,1365220735,GB +1365220736,1365220743,US +1365220744,1365220767,GB +1365220768,1365220775,GR +1365220776,1365220783,JO +1365220784,1365220791,IN +1365220792,1365220799,KW +1365220800,1365220807,RU +1365220808,1365220815,GB +1365220816,1365220823,IN +1365220824,1365220831,GB +1365220832,1365220839,IT +1365220840,1365220847,GB +1365220848,1365220855,AU +1365220856,1365220863,US +1365220864,1365220895,GB +1365220896,1365220903,GR +1365220904,1365221375,GB 1365221376,1365225471,GE 1365225472,1365229567,UA +1365229568,1365233663,PL 1365233664,1365237759,RU 1365237760,1365241855,UZ 1365241856,1365245951,DK @@ -16060,7 +31301,7 @@ 1369505792,1369538559,DE 1369538560,1369554943,DK 1369554944,1369559039,PL -1369559040,1369563135,BG +1369559040,1369563135,RU 1369563136,1369567231,PL 1369567232,1369571327,BG 1369702400,1369833471,BE @@ -16068,12 +31309,12 @@ 1369964544,1369997311,GB 1369997312,1370030079,PL 1370030080,1370062847,BE -1370062848,1370095615,DE +1370062848,1370081279,DE +1370081280,1370091519,EU +1370091520,1370095615,DE 1370095616,1370128383,GB 1370128384,1370161151,SE -1370161152,1370176511,NL -1370176512,1370177279,US -1370177280,1370187775,NL +1370161152,1370187775,NL 1370187776,1370188031,GR 1370188032,1370193919,NL 1370193920,1370226687,GB @@ -16111,106 +31352,94 @@ 1371205632,1371209727,SE 1371209728,1371275263,GB 1371275264,1371340799,BE -1371340800,1371406335,AT +1371340800,1371374740,AT +1371374741,1371374741,SK +1371374742,1371406335,AT 1371406336,1371471871,PL 1371471872,1371537407,NO +1371537408,1371602943,MA 1371602944,1371668479,PT 1371668480,1371734015,FR 1371734016,1371799551,RU -1371799552,1371834367,RO -1371834368,1371836415,HU -1371836416,1371865087,RO +1371799552,1371865087,RO 1371865088,1371930623,FI 1371930624,1371996159,LV -1371996160,1371997183,IL +1371996160,1371997183,A2 1371997184,1371997439,KE 1371997440,1371998207,NG 1371998208,1371998463,CD 1371998464,1371998719,NG -1371998720,1371999231,IL -1371999232,1372000255,CM +1371998720,1372000255,A2 1372000256,1372004351,UG -1372004352,1372004607,TZ -1372004608,1372004863,GB -1372004864,1372006463,IL +1372004352,1372006399,A2 +1372006400,1372006407,NG +1372006408,1372006463,A2 1372006464,1372006495,NG -1372006496,1372007167,IL -1372007168,1372007455,NG -1372007456,1372007679,IL -1372007680,1372007935,NG -1372007936,1372008095,IL -1372008096,1372008191,NG -1372008192,1372009983,IL -1372009984,1372010239,KE +1372006496,1372007039,A2 +1372007040,1372007455,NG +1372007456,1372008095,A2 +1372008096,1372008127,NG +1372008128,1372008159,A2 +1372008160,1372008191,NG +1372008192,1372008927,A2 +1372008928,1372008959,MW +1372008960,1372010239,A2 1372010240,1372010272,NG -1372010273,1372010751,IL -1372010752,1372010967,NG +1372010273,1372010967,A2 1372010968,1372011007,TZ -1372011008,1372012543,IL +1372011008,1372011775,A2 +1372011776,1372012031,ZM +1372012032,1372012543,A2 1372012544,1372014591,ZM -1372014592,1372015615,IL +1372014592,1372015615,A2 1372015616,1372015871,NG -1372015872,1372016639,GH -1372016640,1372016831,BW -1372016832,1372016847,BJ -1372016848,1372016895,BW -1372016896,1372017407,IL -1372017408,1372017663,TZ -1372017664,1372018943,IL -1372018944,1372019199,GB +1372015872,1372016127,A2 +1372016128,1372016383,GH +1372016384,1372019199,A2 1372019200,1372019455,GA -1372019456,1372020735,IL +1372019456,1372020735,A2 1372020736,1372022783,ZM -1372022784,1372023807,IL -1372023808,1372024831,NG -1372024832,1372025343,IL -1372025344,1372025599,CD -1372025600,1372025663,IL +1372022784,1372024831,A2 +1372024832,1372025087,ZM +1372025088,1372025631,A2 +1372025632,1372025663,ZM 1372025664,1372025695,KE 1372025696,1372025727,TZ -1372025728,1372028927,IL -1372028928,1372029439,CM +1372025728,1372025855,A2 +1372025856,1372026367,IL +1372026368,1372026879,A2 +1372026880,1372027903,IL +1372027904,1372029439,A2 1372029440,1372029695,NG 1372029696,1372029951,NE -1372029952,1372031999,IL +1372029952,1372031999,A2 1372032000,1372032255,CM -1372032256,1372032511,IL -1372032512,1372033023,NG -1372033024,1372035071,GB -1372035072,1372037887,IL -1372037888,1372038143,NG -1372038144,1372038399,KE -1372038400,1372039167,IL -1372039168,1372040191,CD -1372040192,1372040703,IL -1372040704,1372041215,CD -1372041216,1372041343,IL +1372032256,1372041343,A2 1372041344,1372041471,NG -1372041472,1372043263,IL -1372043264,1372043519,GB +1372041472,1372043519,A2 1372043520,1372043775,NG -1372043776,1372044415,IL -1372044416,1372044447,NG -1372044448,1372044799,IL +1372043776,1372044287,A2 +1372044288,1372044543,NG +1372044544,1372044799,A2 1372044800,1372044863,CM 1372044864,1372044927,NG -1372044928,1372045055,IL +1372044928,1372045055,A2 1372045056,1372045087,CM -1372045088,1372045119,IL +1372045088,1372045119,A2 1372045120,1372045151,NG -1372045152,1372045215,IL -1372045216,1372045247,NG -1372045248,1372045567,IL -1372045568,1372045887,NG -1372045888,1372046559,IL +1372045152,1372045567,A2 +1372045568,1372045823,ZM +1372045824,1372045887,NG +1372045888,1372046559,A2 1372046560,1372046591,NG -1372046592,1372047231,IL +1372046592,1372047231,A2 1372047232,1372047295,NG -1372047296,1372047359,IL +1372047296,1372047359,A2 1372047360,1372047615,CM -1372047616,1372049663,IL -1372049664,1372050431,NG -1372050432,1372061695,IL +1372047616,1372049919,A2 +1372049920,1372050175,NG +1372050176,1372060159,A2 +1372060160,1372061695,IL 1372061696,1372069887,RU 1372069888,1372073983,FR 1372073984,1372078079,CZ @@ -16241,59 +31470,99 @@ 1372139520,1372143615,CZ 1372143616,1372147711,RU 1372147712,1372151807,BE -1372151808,1372159999,DE +1372151808,1372152823,DE +1372152824,1372152831,GB +1372152832,1372159999,DE 1372160000,1372164095,GB -1372164096,1372168191,DE +1372164096,1372166863,DE +1372166864,1372166879,US +1372166880,1372168191,DE 1372168192,1372172287,GB 1372172288,1372176383,FR 1372176384,1372180479,CH -1372180480,1372183999,SE -1372184000,1372184063,ES -1372184064,1372184071,SE +1372180480,1372184071,SE 1372184072,1372184079,ES 1372184080,1372184575,SE 1372184576,1372188671,DE 1372188672,1372192767,RU 1372192768,1372323839,ES 1372323840,1372585983,NL -1372585984,1372610047,IT -1372610048,1372610303,VA -1372610304,1372618751,IT +1372585984,1372586239,A2 +1372586240,1372589567,IT +1372589568,1372589823,A2 +1372589824,1372618751,IT 1372618752,1372651519,GB 1372651520,1372684287,FI 1372684288,1372684415,DE +1372684416,1372684543,EU 1372684544,1372685631,DE +1372685632,1372685655,EU 1372685656,1372685663,DE +1372685664,1372685695,EU 1372685696,1372685823,DE +1372685824,1372685887,EU 1372685888,1372686335,DE +1372686336,1372687359,EU 1372687360,1372687711,DE +1372687712,1372687719,EU 1372687720,1372687727,DE +1372687728,1372687735,EU 1372687736,1372688199,DE -1372688224,1372688319,DE -1372688352,1372691455,DE +1372688200,1372688223,EU +1372688224,1372689839,DE +1372689840,1372689855,EU +1372689856,1372691455,DE 1372691456,1372691711,US -1372691712,1372694015,DE +1372691712,1372691967,EU +1372691968,1372694271,DE +1372694272,1372694303,EU +1372694304,1372694367,DE +1372694368,1372694383,EU +1372694384,1372694399,DE +1372694400,1372694559,EU 1372694560,1372694591,DE -1372694624,1372694815,DE -1372694832,1372695295,DE -1372695424,1372695551,DE +1372694592,1372694623,EU +1372694624,1372694719,DE +1372694720,1372694783,EU +1372694784,1372694815,DE +1372694816,1372694831,EU +1372694832,1372695039,DE +1372695040,1372695167,EU +1372695168,1372695551,DE 1372695552,1372695807,CZ 1372695808,1372696007,DK +1372696008,1372696063,EU 1372696064,1372697215,DE +1372697216,1372697231,EU 1372697232,1372697239,DE +1372697240,1372697247,EU 1372697248,1372697279,DE +1372697280,1372697343,EU 1372697344,1372698471,DE +1372698472,1372698559,EU 1372698560,1372700159,DE 1372700160,1372700415,SE -1372700672,1372702207,DE +1372700416,1372700671,EU +1372700672,1372702463,DE +1372702464,1372702719,EU 1372702720,1372702735,DE +1372702736,1372702751,EU 1372702752,1372702991,DE +1372702992,1372703231,EU 1372703232,1372703263,DE +1372703264,1372703271,EU 1372703272,1372703323,DE +1372703324,1372703327,EU 1372703328,1372703407,DE -1372703424,1372713327,DE +1372703408,1372703423,EU +1372703424,1372703487,DE +1372703488,1372703743,EU +1372703744,1372713327,DE +1372713328,1372713343,EU 1372713344,1372713375,DE +1372713376,1372713471,EU 1372713472,1372714239,DE +1372714240,1372714495,EU 1372714496,1372717055,DE 1372717056,1372749823,PL 1372749824,1372782591,DE @@ -16322,22 +31591,16 @@ 1379926016,1380188159,FR 1380188160,1380450303,GB 1380450304,1380712447,NL -1380712448,1380802559,RO -1380802560,1380804607,HU -1380804608,1380833279,RO -1380833280,1380835327,HU -1380835328,1380887039,RO -1380887040,1380887551,HU -1380887552,1380903935,RO +1380712448,1380903935,RO 1380903936,1380904447,SK -1380904448,1380933631,RO -1380933632,1380937727,HU -1380937728,1380950527,RO -1380950528,1380951039,HU -1380951040,1380974591,RO -1380974592,1381105663,IL +1380904448,1380974591,RO +1380974592,1381036471,IL +1381036472,1381036479,A2 +1381036480,1381105663,IL 1381105664,1381236735,DE -1381236736,1381367807,IT +1381236736,1381347327,IT +1381347328,1381347583,A2 +1381347584,1381367807,IT 1381367808,1381498879,ES 1381498880,1381761023,IT 1381761024,1382023167,NL @@ -16357,63 +31620,115 @@ 1382039552,1382055935,DE 1382055936,1382072319,FR 1382072320,1382088703,RU -1382088704,1382091375,FR +1382088704,1382091311,FR +1382091312,1382091327,MC +1382091328,1382091375,FR 1382091376,1382091391,MC 1382091392,1382091775,FR 1382091776,1382092031,MC -1382092032,1382105087,FR +1382092032,1382092367,FR +1382092368,1382092399,MC +1382092400,1382092815,FR +1382092816,1382092831,MC +1382092832,1382092895,FR +1382092896,1382092911,CH +1382092912,1382092927,FR +1382092928,1382092943,MC +1382092944,1382093055,FR +1382093056,1382093087,GB +1382093088,1382093119,FR +1382093120,1382093151,MC +1382093152,1382093503,FR +1382093504,1382093583,MC +1382093584,1382093823,FR +1382093824,1382093887,MC +1382093888,1382094079,FR +1382094080,1382094143,MC +1382094144,1382094335,FR +1382094336,1382094351,MC +1382094352,1382094591,FR +1382094592,1382094623,MC +1382094624,1382105087,FR 1382105088,1382137855,DE 1382137856,1382154239,RU 1382154240,1382170623,FR 1382170624,1382171776,DE 1382171777,1382171791,CH -1382171792,1382187007,DE -1382187008,1382203391,ES -1382203392,1382203647,NL -1382203648,1382203903,DE -1382203904,1382204479,NL -1382204480,1382211327,DE +1382171792,1382173663,DE +1382173664,1382173671,GB +1382173672,1382173675,DE +1382173676,1382173679,CH +1382173680,1382176099,DE +1382176100,1382176103,CH +1382176104,1382177983,DE +1382177984,1382178303,LI +1382178304,1382179247,DE +1382179248,1382179279,GB +1382179280,1382179839,DE +1382179840,1382180863,CN +1382180864,1382182327,DE +1382182328,1382182335,GB +1382182336,1382182547,DE +1382182548,1382182551,CH +1382182552,1382182799,DE +1382182800,1382182831,GB +1382182832,1382182895,DE +1382182896,1382182911,GB +1382182912,1382183167,LI +1382183168,1382187007,DE +1382187008,1382191871,ES +1382191872,1382192127,VE +1382192128,1382203391,ES +1382203392,1382204479,NL +1382204480,1382205439,GB +1382205440,1382205695,EU +1382205696,1382205951,DE +1382205952,1382207743,EU +1382207744,1382207999,DE +1382208000,1382208255,EU +1382208256,1382208319,DE +1382208320,1382209535,EU +1382209536,1382209791,DE +1382209792,1382211071,EU +1382211072,1382211199,DE +1382211200,1382211327,EU 1382211328,1382211583,NL 1382211584,1382211711,FR -1382211712,1382211839,DE +1382211712,1382211839,EU 1382211840,1382212095,FR -1382212096,1382212223,DE +1382212096,1382212223,EU 1382212224,1382212239,FR -1382212240,1382212287,DE +1382212240,1382212287,EU 1382212288,1382212351,NL 1382212352,1382212479,FR -1382212480,1382212607,DE +1382212480,1382212607,EU 1382212608,1382212863,FR 1382212864,1382213183,NL -1382213184,1382213199,DE +1382213184,1382213199,EU 1382213200,1382214079,NL -1382214080,1382214111,DE -1382214112,1382214143,NL -1382214144,1382214271,DE -1382214272,1382214335,NL -1382214336,1382214399,DE -1382214400,1382214879,NL -1382214880,1382214895,DE -1382214896,1382214927,NL -1382214928,1382214943,DE -1382214944,1382216831,NL -1382216832,1382216895,DE +1382214080,1382214111,GB +1382214112,1382214879,NL +1382214880,1382214895,GB +1382214896,1382216831,NL +1382216832,1382216895,GB 1382216896,1382216959,NL 1382216960,1382217215,FR 1382217216,1382217727,NL -1382217728,1382217983,DE +1382217728,1382217983,GB 1382217984,1382218399,NL -1382218400,1382218447,DE +1382218400,1382218447,GB 1382218448,1382218455,NL -1382218456,1382218495,DE +1382218456,1382218495,GB 1382218496,1382218623,NL -1382218624,1382218751,DE +1382218624,1382218751,GB 1382218752,1382218815,NL -1382218816,1382218911,DE +1382218816,1382218911,GB 1382218912,1382218959,NL -1382218960,1382218991,DE +1382218960,1382218991,GB 1382218992,1382219775,NL -1382219776,1382224287,SE +1382219776,1382223551,SE +1382223552,1382223615,NO +1382223616,1382224287,SE 1382224288,1382224319,NO 1382224320,1382226271,SE 1382226272,1382226303,NO @@ -16421,32 +31736,27 @@ 1382227328,1382227455,NO 1382227456,1382227583,SE 1382227584,1382227711,DK -1382227712,1382232575,SE +1382227712,1382229503,SE +1382229504,1382229511,NO +1382229512,1382232575,SE 1382232576,1382232639,NO 1382232640,1382232703,DK 1382232704,1382233407,SE -1382233408,1382233423,GB +1382233408,1382233423,NO 1382233424,1382252543,SE 1382252544,1382268927,CZ 1382268928,1382285311,IR -1382285312,1382301695,CZ +1382285312,1382301391,CZ +1382301392,1382301407,SK +1382301408,1382301695,CZ 1382301696,1382318079,SE 1382318080,1382334463,RU 1382334464,1382350847,DE 1382350848,1382367231,FR 1382367232,1382383615,BG +1382383616,1382399999,DZ 1382400000,1382416383,NL -1382416384,1382419479,PT -1382419480,1382419487,ES -1382419488,1382419967,PT -1382419968,1382419999,ES -1382420000,1382420831,PT -1382420832,1382420863,ES -1382420864,1382420991,PT -1382420992,1382421247,FR -1382421248,1382422783,PT -1382422784,1382423039,ES -1382423040,1382432767,PT +1382416384,1382432767,PT 1382432768,1382449151,CY 1382449152,1382465535,IL 1382465536,1382481919,PS @@ -16455,17 +31765,37 @@ 1382514688,1382531071,DK 1382531072,1382547455,FI 1382547456,1382809599,IT -1382809600,1383071743,GB -1383071744,1383073031,RU -1383073032,1383073039,KG -1383073040,1383073119,RU -1383073120,1383073135,UZ -1383073136,1383073279,RU +1382809600,1383025663,GB +1383025664,1383025672,DE +1383025673,1383025679,GB +1383025680,1383025711,DE +1383025712,1383025727,GB +1383025728,1383025759,DE +1383025760,1383045215,GB +1383045216,1383045231,IT +1383045232,1383071743,GB +1383071744,1383073279,RU 1383073280,1383073535,KZ -1383073536,1383079935,RU -1383079936,1383088127,NL +1383073536,1383088127,RU 1383088128,1383096319,IS -1383096320,1383103271,GB +1383096320,1383096383,PL +1383096384,1383096447,GB +1383096448,1383096575,FR +1383096576,1383096831,GB +1383096832,1383096863,FR +1383096864,1383097087,GB +1383097088,1383097343,ES +1383097344,1383098111,GB +1383098112,1383098367,DE +1383098368,1383099391,GB +1383099392,1383099903,DE +1383099904,1383100159,GB +1383100160,1383100287,FR +1383100288,1383100831,GB +1383100832,1383100847,IE +1383100848,1383100879,GB +1383100880,1383100895,IE +1383100896,1383103271,GB 1383103272,1383103279,ES 1383103280,1383103471,GB 1383103472,1383103487,NL @@ -16473,9 +31803,13 @@ 1383104016,1383104023,ES 1383104024,1383104255,GB 1383104256,1383104511,FR -1383104512,1383112703,GB +1383104512,1383111695,JE +1383111696,1383111727,GB +1383111728,1383112703,JE 1383112704,1383120895,GE -1383120896,1383129087,IT +1383120896,1383129031,IT +1383129032,1383129039,ES +1383129040,1383129087,IT 1383129088,1383137279,GB 1383137280,1383145471,MC 1383145472,1383153663,CZ @@ -16490,20 +31824,14 @@ 1383194624,1383202815,GB 1383202816,1383211007,RU 1383211008,1383219199,CY -1383219200,1383222015,CS -1383222016,1383222527,MK -1383222528,1383222783,CS -1383222784,1383223039,MK -1383223040,1383227391,CS +1383219200,1383227391,RS 1383227392,1383239295,RU 1383239296,1383239423,AR 1383239424,1383243775,RU 1383243776,1383251967,YE 1383251968,1383260159,CZ 1383260160,1383268351,RU -1383268352,1383271935,IR -1383271936,1383272447,DE -1383272448,1383273983,IR +1383268352,1383273983,IR 1383273984,1383276543,KW 1383276544,1383284735,KZ 1383284736,1383292927,PL @@ -16517,17 +31845,19 @@ 1383350272,1383358463,NO 1383358464,1383366911,DE 1383366912,1383367167,SY -1383367168,1383368703,KW +1383367168,1383367679,KW +1383367680,1383368703,GB 1383368704,1383368831,DE 1383368832,1383368847,GB -1383368848,1383369087,DE +1383368848,1383368895,KW +1383368896,1383369087,DE 1383369088,1383369119,GB -1383369120,1383369231,DE +1383369120,1383369231,KW 1383369232,1383369247,GB -1383369248,1383369535,DE +1383369248,1383369535,KW 1383369536,1383369567,GB -1383369568,1383369727,DE -1383369728,1383370751,KW +1383369568,1383369599,DE +1383369600,1383370751,KW 1383370752,1383371775,DE 1383371776,1383374591,KW 1383374592,1383374847,US @@ -16542,42 +31872,17 @@ 1383424000,1383432191,SE 1383432192,1383440383,CZ 1383440384,1383448575,RU -1383448576,1383449343,RS -1383449344,1383449375,CS -1383449376,1383449391,RS -1383449392,1383449395,CS -1383449396,1383449407,RS -1383449408,1383449519,CS -1383449520,1383449535,RS -1383449536,1383449543,CS -1383449544,1383449551,RS -1383449552,1383449599,CS -1383449600,1383450751,RS -1383450752,1383450815,CS -1383450816,1383450847,RS -1383450848,1383450879,CS -1383450880,1383451391,RS -1383451392,1383451647,CS -1383451648,1383451903,RS -1383451904,1383452191,CS -1383452192,1383452223,RS -1383452224,1383452247,CS -1383452248,1383452255,RS -1383452256,1383452295,CS -1383452296,1383452303,RS -1383452304,1383452327,CS -1383452328,1383452335,RS -1383452336,1383452415,CS -1383452416,1383452671,RS -1383452672,1383456767,CS -1383456768,1383464959,NL +1383448576,1383456767,RS +1383456768,1383464959,UA 1383464960,1383473151,US 1383473152,1383481343,DE 1383481344,1383481599,GB 1383481600,1383481615,US 1383481616,1383481663,GB 1383481664,1383481695,US -1383481696,1383481775,GB +1383481696,1383481703,GB +1383481704,1383481711,US +1383481712,1383481775,GB 1383481776,1383481791,SA 1383481792,1383482367,GB 1383482368,1383482879,NL @@ -16590,9 +31895,11 @@ 1383485408,1383497727,GB 1383497728,1383499039,RU 1383499040,1383499047,UA -1383499048,1383499775,RU -1383499776,1383501823,AZ -1383501824,1383505919,RU +1383499048,1383502335,RU +1383502336,1383502847,CH +1383502848,1383503615,RU +1383503616,1383503616,CZ +1383503617,1383505919,RU 1383505920,1383514111,SA 1383514112,1383522303,FI 1383522304,1383530495,BG @@ -16603,55 +31910,83 @@ 1383563264,1383571455,RU 1383571456,1383579647,DE 1383579648,1383587839,IT -1383587840,1383591935,SK -1383591936,1383592607,CZ -1383592608,1383592623,SK -1383592624,1383592887,CZ +1383587840,1383588415,SK +1383588416,1383588423,CZ +1383588424,1383588431,SK +1383588432,1383588439,CZ +1383588440,1383589375,SK +1383589376,1383590143,CZ +1383590144,1383590287,SK +1383590288,1383590295,CZ +1383590296,1383590367,SK +1383590368,1383590375,CZ +1383590376,1383590463,SK +1383590464,1383590543,CZ +1383590544,1383590591,SK +1383590592,1383590655,CZ +1383590656,1383590911,SK +1383590912,1383591167,CZ +1383591168,1383591935,SK +1383591936,1383592887,CZ 1383592888,1383592895,VC -1383592896,1383595279,CZ -1383595280,1383595295,SK -1383595296,1383595467,CZ -1383595468,1383595471,SK -1383595472,1383596031,CZ +1383592896,1383596031,CZ 1383596032,1384120319,FR +1384120320,1384153087,NG 1384153088,1384185855,FI -1384185856,1384190463,DE +1384185856,1384187967,DE +1384187968,1384188031,CH +1384188032,1384189055,DE +1384189056,1384189183,CH +1384189184,1384189439,AT +1384189440,1384190463,DE 1384190464,1384190719,NL 1384190720,1384190975,DE 1384190976,1384191231,DK -1384191232,1384192255,DE +1384191232,1384191359,DE +1384191360,1384191423,AT +1384191424,1384191999,DE +1384192000,1384192191,NL +1384192192,1384192255,DE 1384192256,1384192511,NL -1384192512,1384194175,DE -1384194176,1384194207,AT -1384194208,1384194559,DE +1384192512,1384192575,DE +1384192576,1384192639,SE +1384192640,1384192767,DE +1384192768,1384193023,BG +1384193024,1384194047,NL +1384194048,1384194191,DE +1384194192,1384194207,AT +1384194208,1384194271,DE +1384194272,1384194303,NL +1384194304,1384194559,DE 1384194560,1384194815,NL 1384194816,1384195711,DE 1384195712,1384195743,NL 1384195744,1384195751,CH 1384195752,1384195775,DE 1384195776,1384195839,SE -1384195840,1384218623,DE +1384195840,1384196095,DE +1384196096,1384197119,CZ +1384197120,1384202239,DE +1384202240,1384218623,GB +1384218624,1384251391,EG 1384251392,1384267775,FI 1384267776,1384284159,CH 1384284160,1384316927,ES 1384316928,1384349695,EE 1384349696,1384382463,HU -1384382464,1384415231,IR -1384415232,1384415743,DE -1384415744,1384418047,GB -1384418048,1384418303,DE -1384418304,1384419071,GB -1384419072,1384419583,DE -1384419584,1384419839,GB -1384419840,1384420607,DE -1384420608,1384422783,GB -1384422784,1384422911,DE -1384422912,1384435711,GB -1384435712,1384447743,DE -1384447744,1384447807,GB -1384447808,1384447999,DE -1384448000,1384480767,GB -1384480768,1384513535,FI +1384382464,1384415231,HR +1384415232,1384480767,GB +1384480768,1384488863,FI +1384488864,1384488871,AX +1384488872,1384494879,FI +1384494880,1384494887,AX +1384494888,1384494935,FI +1384494936,1384494943,AX +1384494944,1384502415,FI +1384502416,1384502447,AX +1384502448,1384504615,FI +1384504616,1384504623,AX +1384504624,1384513535,FI 1384513536,1384546303,NO 1384546304,1384579071,NL 1384579072,1384611839,DE @@ -16660,20 +31995,18 @@ 1384660992,1384677375,CH 1384677376,1384693759,SE 1384693760,1384710143,NL -1384710144,1384711167,RO -1384711168,1384712191,HU -1384712192,1384714239,RO -1384714240,1384715263,HU -1384715264,1384720895,RO -1384720896,1384721407,HU -1384721408,1384726527,RO +1384710144,1384726527,RO 1384726528,1384742911,BG 1384742912,1384759295,RU 1384759296,1384775679,SY 1384775680,1384792063,RU -1384792064,1384792623,FR +1384792064,1384792575,FR +1384792576,1384792607,CH +1384792608,1384792623,FR 1384792624,1384792639,BE -1384792640,1384793791,FR +1384792640,1384793679,FR +1384793680,1384793695,BE +1384793696,1384793791,FR 1384793792,1384793823,BE 1384793824,1384794127,FR 1384794128,1384794143,CH @@ -16685,23 +32018,36 @@ 1384794880,1384795135,CH 1384795136,1384795279,FR 1384795280,1384795327,BE -1384795328,1384795647,FR -1384795648,1384795775,NL -1384795776,1384808447,FR +1384795328,1384796351,FR +1384796352,1384796415,IT +1384796416,1384799807,FR +1384799808,1384799871,CH +1384799872,1384801023,FR +1384801024,1384801087,SM +1384801088,1384802495,FR +1384802496,1384802559,IT +1384802560,1384808447,FR +1384808448,1384808959,EU 1384808960,1384808967,DE 1384808968,1384808975,SE 1384808976,1384808991,DE 1384808992,1384809007,FI 1384809008,1384809015,PT 1384809016,1384809023,GB +1384809024,1384809039,EU 1384809040,1384809055,FR 1384809056,1384809063,GE 1384809064,1384809071,GB +1384809072,1384809087,EU 1384809088,1384809103,FR +1384809104,1384811007,EU 1384811008,1384811519,GB 1384811520,1384811647,IR +1384811648,1384812799,EU 1384812800,1384813311,GB +1384813312,1384818463,EU 1384818464,1384818495,BE +1384818496,1384824831,EU 1384824832,1384841215,GB 1384841216,1384857599,PL 1384857600,1384873983,NL @@ -16709,10 +32055,10 @@ 1384890368,1384923135,DE 1384923136,1384939519,RU 1384939520,1384955903,LT -1384955904,1384972287,PT -1384972288,1384973623,DE -1384973624,1384973631,NL -1384973632,1384988671,DE +1384955904,1384972287,RU +1384972288,1384978975,DE +1384978976,1384978991,NL +1384978992,1384988671,DE 1384988672,1385005055,FI 1385005056,1385021439,HU 1385021440,1385037823,IE @@ -16728,7 +32074,7 @@ 1385177088,1385185279,DE 1385185280,1385193471,RU 1385193472,1385201663,ES -1385201664,1385209855,GB +1385201664,1385209855,CZ 1385209856,1385218047,HU 1385218048,1385226239,UA 1385226240,1385234431,GB @@ -16738,13 +32084,13 @@ 1385259008,1385267199,IT 1385267200,1385275391,SE 1385275392,1385283583,IT -1385283584,1385291775,KW +1385283584,1385287679,KW 1385291776,1385299967,TR 1385299968,1385308159,BG -1385308160,1385310207,BE -1385310208,1385312255,RU -1385312256,1385314303,US -1385314304,1385316351,RU +1385308160,1385309439,BE +1385309440,1385309695,RU +1385309696,1385310207,BE +1385310208,1385316351,RU 1385316352,1385324543,NO 1385324544,1385332735,BE 1385332736,1385340927,GB @@ -16766,7 +32112,7 @@ 1385480192,1385488383,NL 1385488384,1385496575,GB 1385496576,1385504767,SI -1385504768,1385512959,FR +1385504768,1385512959,GB 1385512960,1385521151,DE 1385521152,1385529343,AT 1385529344,1385537535,RU @@ -16778,9 +32124,7 @@ 1385554528,1385554531,AT 1385554532,1385554719,DE 1385554720,1385554735,AT -1385554736,1385554783,DE -1385554784,1385554791,CH -1385554792,1385557503,DE +1385554736,1385557503,DE 1385557504,1385557759,AT 1385557760,1385559039,DE 1385559040,1385559295,SK @@ -16788,46 +32132,72 @@ 1385560832,1385561087,SK 1385561088,1385562111,DE 1385562112,1385563135,ES -1385563136,1385563935,IE -1385564032,1385564039,IE -1385564064,1385564127,IE -1385564160,1385564223,HU +1385563136,1385563391,IE +1385563392,1385563647,EU +1385563648,1385563935,IE +1385563936,1385564031,EU +1385564032,1385564095,IE +1385564096,1385564103,EU +1385564104,1385564127,IE +1385564128,1385564159,EU +1385564160,1385564231,HU +1385564232,1385564383,EU 1385564384,1385564671,HU +1385564672,1385565183,EU 1385565184,1385565439,ES -1385566208,1385566415,FR -1385566432,1385566719,FR +1385565440,1385566207,EU +1385566208,1385566399,FR +1385566400,1385566431,EU +1385566432,1385566447,FR +1385566448,1385566455,EU +1385566456,1385566847,FR +1385566848,1385566927,EU 1385566928,1385566935,FR -1385566944,1385566991,FR -1385566996,1385567005,FR -1385567008,1385567071,FR -1385567088,1385567135,FR -1385567152,1385567159,US -1385567160,1385567167,FR -1385567200,1385567227,FR +1385566936,1385566959,EU +1385566960,1385566991,FR +1385566992,1385566999,EU +1385567000,1385567023,FR +1385567024,1385567087,EU +1385567088,1385567103,FR +1385567104,1385567135,EU +1385567136,1385567155,FR +1385567156,1385567167,EU +1385567168,1385567215,FR +1385567216,1385567223,EU +1385567224,1385567227,FR +1385567228,1385567231,EU 1385567232,1385568255,IE -1385569408,1385569439,CZ -1385569456,1385569487,CZ -1385569488,1385569503,DE -1385569504,1385569511,CZ -1385569528,1385569535,GB -1385570288,1385570303,DK +1385568256,1385568767,FR +1385568768,1385569279,EU +1385569280,1385569407,FR +1385569408,1385569487,CZ +1385569488,1385569503,FR +1385569504,1385569791,EU +1385569792,1385570303,FR 1385570304,1385578495,HU -1385578496,1385586687,DK +1385578496,1385586687,TR 1385586688,1385587967,GB 1385587968,1385588735,US 1385588736,1385589247,HK 1385589248,1385589503,JP -1385589504,1385594879,GB +1385589504,1385589759,SG +1385589760,1385590015,JP +1385590016,1385590783,GB +1385590784,1385591295,US +1385591296,1385591807,HK +1385591808,1385592063,SG +1385592064,1385594879,GB 1385594880,1385603071,NL 1385603072,1385611263,CZ 1385611264,1385619455,AT -1385619456,1385627647,DE -1385627648,1385635839,RU +1385619456,1385625599,DE +1385625600,1385635839,FR 1385635840,1385644031,NL +1385644032,1385652223,MR 1385652224,1385660415,RU 1385660416,1385668607,TR 1385668608,1385676799,NL -1385676800,1385684991,ES +1385676800,1385684991,RU 1385684992,1385824255,GB 1385824256,1385955327,PT 1385955328,1386086399,NL @@ -16837,17 +32207,13 @@ 1386348544,1386414079,RU 1386414080,1386479615,GB 1386479616,1386545151,NO -1386545152,1386577919,DE -1386577920,1386600447,US -1386600448,1386602495,DE +1386545152,1386582015,DE +1386582016,1386594303,US +1386594304,1386602495,DE 1386602496,1386610687,US 1386610688,1386676223,IL 1386676224,1386741759,SA -1386741760,1387134975,NL -1387134976,1387155455,BE -1387155456,1387167743,NL -1387167744,1387188223,BE -1387188224,1387233623,NL +1386741760,1387233623,NL 1387233624,1387233627,BE 1387233628,1387233663,NL 1387233664,1387233727,BE @@ -16856,8 +32222,14 @@ 1387233920,1387249663,NL 1387249664,1387251231,BE 1387251232,1387251263,NL -1387251264,1387251727,BE -1387251728,1387331583,NL +1387251264,1387251615,BE +1387251616,1387251647,NL +1387251648,1387251727,BE +1387251728,1387251751,NL +1387251752,1387251759,BE +1387251760,1387252223,NL +1387252224,1387252479,BE +1387252480,1387331583,NL 1387331584,1387397119,PL 1387397120,1387462655,OM 1387462656,1387528191,RU @@ -16872,7 +32244,21 @@ 1388347392,1388363775,DK 1388363776,1388371967,DE 1388371968,1388380159,CH -1388380160,1388396543,IT +1388380160,1388388895,IT +1388388896,1388388927,NG +1388388928,1388388935,IT +1388388936,1388388991,NG +1388388992,1388389119,IT +1388389120,1388389135,NG +1388389136,1388389439,IT +1388389440,1388389471,NG +1388389472,1388389567,IT +1388389568,1388389631,NG +1388389632,1388390143,IT +1388390144,1388394495,NG +1388394496,1388395519,IT +1388395520,1388396287,NG +1388396288,1388396543,IT 1388396544,1388404735,LV 1388404736,1388412927,UA 1388412928,1388421119,RU @@ -16890,34 +32276,63 @@ 1388519424,1388527615,NL 1388527616,1388535807,DE 1388535808,1388543999,GB -1388544000,1388547871,IE +1388544000,1388546191,IE +1388546192,1388546201,GB +1388546202,1388547583,IE +1388547584,1388547775,GB +1388547776,1388547871,IE 1388547872,1388547903,GB -1388547904,1388552191,IE +1388547904,1388547935,IE +1388547936,1388547951,GB +1388547952,1388552191,IE 1388552192,1388560383,GB 1388560384,1388568575,FI 1388568576,1388576767,CH 1388576768,1388584959,FR -1388584960,1388587487,GB +1388584960,1388586303,GB +1388586304,1388586367,EU +1388586368,1388586391,GB +1388586392,1388586399,EU +1388586400,1388586447,GB +1388586448,1388586455,EU +1388586456,1388586495,GB +1388586496,1388587263,EU +1388587264,1388587391,GB +1388587392,1388587407,EU +1388587408,1388587423,GB +1388587424,1388587439,EU +1388587440,1388587471,GB +1388587472,1388587487,EU 1388587488,1388587503,FR -1388587504,1388588543,GB -1388588544,1388588799,US -1388588800,1388590079,GB +1388587504,1388587511,GB +1388587512,1388587519,EU +1388587520,1388587615,GB +1388587616,1388587631,EU +1388587632,1388588415,GB +1388588416,1388588543,EU +1388588544,1388588575,US +1388588576,1388588783,EU +1388588784,1388588799,US +1388588800,1388589823,GB +1388589824,1388590079,EU 1388590080,1388590127,FR -1388590128,1388590591,GB -1388590592,1388590719,US -1388590720,1388591103,GB +1388590128,1388590327,EU +1388590328,1388590335,FR +1388590336,1388591103,EU 1388591104,1388591151,SG -1388591152,1388591167,GB +1388591152,1388591167,EU 1388591168,1388591187,SG -1388591188,1388591199,GB +1388591188,1388591199,EU 1388591200,1388591231,SG -1388591232,1388591295,GB -1388591296,1388591303,SG -1388591304,1388591615,GB +1388591232,1388591303,EU +1388591304,1388591311,SG +1388591312,1388591355,EU +1388591356,1388591359,SG +1388591360,1388591615,EU 1388591616,1388591631,US -1388591632,1388591647,GB +1388591632,1388591647,EU 1388591648,1388591663,US -1388591664,1388593151,GB +1388591664,1388593151,EU 1388593152,1388601343,RU 1388601344,1388609535,SE 1388609536,1388617727,RU @@ -16926,32 +32341,42 @@ 1388634112,1388642303,GB 1388642304,1388650495,FI 1388650496,1388658687,PL -1388658688,1388660831,GB -1388660832,1388660863,US -1388660864,1388666879,GB -1388666880,1388675071,GR +1388658688,1388666879,GB 1388675072,1388675327,NL -1388675584,1388677119,DE +1388675328,1388675583,EU +1388675584,1388676095,DE +1388676096,1388676607,EU +1388676608,1388676863,DE +1388676864,1388677119,EU 1388677120,1388677375,GB +1388677376,1388677631,EU 1388677632,1388677663,AT +1388677664,1388677887,EU 1388677888,1388679167,DE 1388679168,1388679423,FR 1388679424,1388679455,DE -1388679680,1388682239,DE +1388679456,1388679679,EU +1388679680,1388680703,DE +1388680704,1388680959,EU +1388680960,1388682239,DE +1388682240,1388682751,EU 1388682752,1388683263,DE -1388683264,1388691455,CH +1388683264,1388689639,CH +1388689640,1388689647,DE +1388689648,1388691455,CH 1388691456,1388699647,NL 1388699648,1388707839,SE -1388707840,1388711935,RU -1388711936,1388712447,MD -1388712448,1388712959,SE -1388712960,1388713215,RU +1388707840,1388708863,RU +1388708864,1388709119,LB +1388709120,1388712191,RU +1388712192,1388712703,LT +1388712704,1388713215,LB 1388713216,1388713727,TJ 1388713728,1388714239,LB 1388714240,1388714495,LT -1388714496,1388715007,RU -1388715008,1388715263,LT -1388715264,1388715519,LB +1388714496,1388714751,RU +1388714752,1388715007,IQ +1388715008,1388715519,LT 1388715520,1388715775,LV 1388715776,1388716031,LT 1388716032,1388724223,ES @@ -16977,26 +32402,107 @@ 1388731137,1388731391,AT 1388731392,1388732415,DE 1388732416,1388740607,ES -1388740608,1388748799,IE +1388740608,1388740623,GB +1388740624,1388740719,IE +1388740720,1388740735,GB +1388740736,1388741745,IE +1388741746,1388741747,GB +1388741748,1388741751,IE +1388741752,1388741759,GB +1388741760,1388741767,IE +1388741768,1388741787,GB +1388741788,1388741795,IE +1388741796,1388741819,GB +1388741820,1388741859,IE +1388741860,1388741863,GB +1388741864,1388742007,IE +1388742008,1388742015,GB +1388742016,1388742019,IE +1388742020,1388742023,GB +1388742024,1388742024,IE +1388742025,1388742031,GB +1388742032,1388742655,IE +1388742656,1388742719,GB +1388742720,1388742731,IE +1388742732,1388742739,GB +1388742740,1388743043,IE +1388743044,1388743055,GB +1388743056,1388743435,IE +1388743436,1388743439,GB +1388743440,1388744087,IE +1388744088,1388744095,GB +1388744096,1388744117,IE +1388744118,1388744127,GB +1388744128,1388744893,IE +1388744894,1388744895,GB +1388744896,1388744911,IE +1388744912,1388744915,GB +1388744916,1388745155,IE +1388745156,1388745159,GB +1388745160,1388745215,IE +1388745216,1388745343,GB +1388745344,1388745499,IE +1388745500,1388745503,GB +1388745504,1388745651,IE +1388745652,1388745663,GB +1388745664,1388745683,IE +1388745684,1388745727,GB +1388745728,1388745915,IE +1388745916,1388745919,GB +1388745920,1388745927,IE +1388745928,1388745935,GB +1388745936,1388745971,IE +1388745972,1388745975,GB +1388745976,1388746151,IE +1388746152,1388746155,GB +1388746156,1388746167,IE +1388746168,1388746239,GB +1388746240,1388746659,IE +1388746660,1388746671,GB +1388746672,1388746703,IE +1388746704,1388746707,GB +1388746708,1388746859,IE +1388746860,1388746863,GB +1388746864,1388746895,IE +1388746896,1388746903,GB +1388746904,1388746967,IE +1388746968,1388746975,GB +1388746976,1388747083,IE +1388747084,1388747087,GB +1388747088,1388747551,IE +1388747552,1388747555,GB +1388747556,1388747575,IE +1388747576,1388747583,GB +1388747584,1388747671,IE +1388747672,1388747675,GB +1388747676,1388747783,IE +1388747784,1388747791,GB +1388747792,1388747835,IE +1388747836,1388747839,GB +1388747840,1388747859,IE +1388747860,1388747863,GB +1388747864,1388747891,IE +1388747892,1388747895,GB +1388747896,1388747983,IE +1388747984,1388748031,GB +1388748032,1388748179,IE +1388748180,1388748183,GB +1388748184,1388748223,IE +1388748224,1388748319,GB +1388748320,1388748349,IE +1388748350,1388748351,GB +1388748352,1388748799,IE 1388748800,1388756991,RU 1388756992,1388765183,DE 1388765184,1388773375,GB 1388773376,1388781567,NO 1388781568,1388789759,ES -1388789760,1388797951,NL +1388789760,1388789887,NL +1388789888,1388789951,GB +1388789952,1388797951,NL 1388797952,1388806143,RU -1388806144,1388814335,NL -1388814336,1388814591,AX -1388814592,1388814751,FI -1388814752,1388814783,AX -1388814784,1388814847,FI -1388814848,1388815103,AX -1388815104,1388815871,FI -1388815872,1388818687,AX -1388818688,1388818815,FI -1388818816,1388819199,AX -1388819200,1388819231,FI -1388819232,1388821119,AX +1388806144,1388814335,DE +1388814336,1388821119,AX 1388821120,1388821150,SE 1388821151,1388821247,AX 1388821248,1388822527,SE @@ -17005,6 +32511,7 @@ 1388838912,1388871679,RU 1388871680,1388904447,KZ 1388904448,1388937215,NL +1388937216,1388969983,EG 1388969984,1389002751,CZ 1389002752,1389035519,RU 1389035520,1389068287,GB @@ -17012,382 +32519,399 @@ 1389101056,1389133823,NL 1389133824,1389166591,RU 1389166592,1389199359,PS -1389199360,1389199615,AE +1389199360,1389199615,A2 1389199616,1389199647,IR -1389199648,1389199743,AE -1389199744,1389199775,IR -1389199776,1389199871,AE -1389199872,1389200127,IR -1389200128,1389200895,AE -1389200896,1389201023,KW -1389201024,1389201087,AE -1389201088,1389201151,KW -1389201152,1389201791,AE -1389201792,1389201919,KW -1389201920,1389202175,SA -1389202176,1389202191,IR -1389202192,1389202207,AE -1389202208,1389202223,IQ -1389202224,1389202239,SA -1389202240,1389202303,IR -1389202304,1389202343,AE -1389202344,1389202351,IQ -1389202352,1389202367,IR -1389202368,1389202375,IQ -1389202376,1389202383,AE -1389202384,1389202391,IQ -1389202392,1389203391,AE +1389199648,1389203391,A2 1389203392,1389203455,IR 1389203456,1389203487,IQ -1389203488,1389203551,AE -1389203552,1389203583,IQ -1389203584,1389204127,AE -1389204128,1389204143,IR -1389204144,1389204147,AE -1389204148,1389204159,TM -1389204160,1389204167,AE -1389204168,1389204175,IR -1389204176,1389204183,IQ -1389204184,1389204479,AE -1389204480,1389204543,IR -1389204544,1389205503,AE -1389205504,1389205631,IQ -1389205632,1389205935,IR -1389205936,1389205951,AE -1389205952,1389205967,IR -1389205968,1389205999,AE +1389203488,1389203519,A2 +1389203520,1389203551,IQ +1389203552,1389203567,LB +1389203568,1389203583,A2 +1389203584,1389203615,IQ +1389203616,1389203743,A2 +1389203744,1389203775,IQ +1389203776,1389203967,A2 +1389203968,1389203999,LY +1389204000,1389204223,A2 +1389204224,1389204255,IQ +1389204256,1389204287,A2 +1389204288,1389204303,SA +1389204304,1389204799,A2 +1389204800,1389204863,IQ +1389204864,1389204879,A2 +1389204880,1389204895,IQ +1389204896,1389205631,A2 +1389205632,1389205759,IR +1389205760,1389205791,A2 +1389205792,1389205935,IR +1389205936,1389205999,A2 1389206000,1389206015,IR -1389206016,1389206079,AE -1389206080,1389206095,IR -1389206096,1389206191,AE -1389206192,1389206199,TM -1389206200,1389206207,SA -1389206208,1389206271,AE +1389206016,1389206047,IQ +1389206048,1389206143,A2 +1389206144,1389206175,LY +1389206176,1389206271,A2 1389206272,1389206656,IR -1389206657,1389206719,AE +1389206657,1389206719,A2 1389206720,1389207039,IR -1389207040,1389207295,AE -1389207296,1389207359,IR +1389207040,1389207295,LB +1389207296,1389207359,A2 1389207360,1389207391,SA 1389207392,1389207487,IR -1389207488,1389207495,AE -1389207496,1389207519,SA +1389207488,1389207519,A2 1389207520,1389207551,IR -1389207552,1389207807,LB -1389207808,1389208895,AE -1389208896,1389208959,IQ -1389208960,1389209087,AE +1389207552,1389209087,A2 1389209088,1389209343,IR -1389209344,1389210623,AE -1389210624,1389210631,IR -1389210632,1389210655,AE -1389210656,1389210751,IR -1389210752,1389210815,AE -1389210816,1389210879,IR -1389210880,1389211719,AE +1389209344,1389209887,A2 +1389209888,1389209903,IQ +1389209904,1389210127,A2 +1389210128,1389210207,IQ +1389210208,1389210223,A2 +1389210224,1389210255,IR +1389210256,1389210271,A2 +1389210272,1389210303,IQ +1389210304,1389210335,IR +1389210336,1389210623,A2 +1389210624,1389210655,IQ +1389210656,1389210687,IR +1389210688,1389210719,IQ +1389210720,1389210767,A2 +1389210768,1389210783,IQ +1389210784,1389210815,A2 +1389210816,1389210879,IQ +1389210880,1389211135,A2 +1389211136,1389211183,IQ +1389211184,1389211199,A2 +1389211200,1389211263,IQ +1389211264,1389211343,A2 +1389211344,1389211359,LY +1389211360,1389211391,A2 +1389211392,1389211423,IQ +1389211424,1389211439,A2 +1389211440,1389211455,IQ +1389211456,1389211519,A2 +1389211520,1389211535,IQ +1389211536,1389211567,A2 +1389211568,1389211647,IQ +1389211648,1389211719,A2 1389211720,1389211727,IR -1389211728,1389211743,IQ -1389211744,1389212927,AE +1389211728,1389212159,A2 +1389212160,1389212415,KW +1389212416,1389212671,A2 +1389212672,1389212767,IQ +1389212768,1389212927,A2 1389212928,1389212991,IR -1389212992,1389213055,AE +1389212992,1389213055,A2 1389213056,1389213087,IR -1389213088,1389213183,AE +1389213088,1389213119,IQ +1389213120,1389213183,A2 1389213184,1389213199,IQ -1389213200,1389213439,AE -1389213440,1389213695,LY -1389213696,1389213951,LB -1389213952,1389214207,AE -1389214208,1389214463,LY -1389214464,1389214975,AE -1389214976,1389215039,IQ -1389215040,1389215231,AE +1389213200,1389213207,A2 +1389213208,1389213215,LY +1389213216,1389213311,A2 +1389213312,1389213343,LY +1389213344,1389215231,A2 1389215232,1389217791,AF -1389217792,1389218303,AE +1389217792,1389218303,A2 1389218304,1389219839,AF -1389219840,1389220095,AE +1389219840,1389220095,A2 1389220096,1389220143,SA -1389220144,1389220159,AE -1389220160,1389220223,IQ -1389220224,1389220287,AE -1389220288,1389220479,IR +1389220144,1389220191,A2 +1389220192,1389220207,IQ +1389220208,1389220223,IR +1389220224,1389220479,A2 1389220480,1389220495,IQ -1389220496,1389220511,AE -1389220512,1389220543,SA -1389220544,1389220575,AE +1389220496,1389220575,A2 1389220576,1389220591,IQ -1389220592,1389220607,AE -1389220608,1389220655,SA -1389220656,1389220671,AE +1389220592,1389220607,A2 +1389220608,1389220639,SA +1389220640,1389220671,A2 1389220672,1389220687,IQ 1389220688,1389220703,SA -1389220704,1389220735,AE +1389220704,1389220735,A2 1389220736,1389220751,IQ -1389220752,1389220799,SA -1389220800,1389220895,AE +1389220752,1389220767,SA +1389220768,1389220895,A2 1389220896,1389220927,SA -1389220928,1389220935,AE -1389220936,1389220943,IR -1389220944,1389220959,AE +1389220928,1389220959,A2 1389220960,1389220975,IQ -1389220976,1389221119,AE +1389220976,1389221119,A2 1389221120,1389221631,LY -1389221632,1389222431,SA -1389222432,1389222463,IQ -1389222464,1389222495,AE -1389222496,1389222511,IQ -1389222512,1389222528,AE -1389222529,1389222542,SA -1389222543,1389222575,AE -1389222576,1389222591,SA +1389221632,1389221887,A2 +1389221888,1389222399,SA +1389222400,1389222495,A2 +1389222496,1389222511,SA +1389222512,1389222543,A2 +1389222544,1389222559,LY +1389222560,1389222591,SA 1389222592,1389222607,IQ -1389222608,1389222623,AE -1389222624,1389222639,IR -1389222640,1389222687,AE +1389222608,1389222687,A2 1389222688,1389222703,IR 1389222704,1389222719,SA 1389222720,1389222751,IQ -1389222752,1389222799,AE -1389222800,1389222879,SA -1389222880,1389222911,AE +1389222752,1389222799,A2 +1389222800,1389222815,SA +1389222816,1389222847,A2 +1389222848,1389222879,SA +1389222880,1389222911,A2 1389222912,1389223167,SA -1389223168,1389223183,AE +1389223168,1389223175,LY +1389223176,1389223183,A2 1389223184,1389223215,SA -1389223216,1389223231,AE +1389223216,1389223231,A2 1389223232,1389223263,SA 1389223264,1389223327,IQ -1389223328,1389223423,AE +1389223328,1389223423,A2 1389223424,1389223471,SA 1389223472,1389223487,IQ -1389223488,1389223519,AE -1389223520,1389223551,IR -1389223552,1389223679,SA +1389223488,1389223519,LY +1389223520,1389223679,A2 1389223680,1389224191,DE 1389224192,1389224447,SA 1389224448,1389224511,IR -1389224512,1389224543,AE +1389224512,1389224543,A2 1389224544,1389224559,IR -1389224560,1389224703,AE +1389224560,1389224575,SA +1389224576,1389224703,A2 1389224704,1389224959,LY -1389224960,1389225215,AE +1389224960,1389225215,A2 1389225216,1389225471,SA -1389225472,1389225535,IR -1389225536,1389225567,IQ -1389225568,1389225727,AE -1389225728,1389225983,IR -1389225984,1389226239,LY -1389226240,1389226751,IR -1389226752,1389227391,AE -1389227392,1389227775,IR -1389227776,1389228031,AE +1389225472,1389225535,A2 +1389225536,1389225599,IQ +1389225600,1389225983,A2 +1389225984,1389226239,AE +1389226240,1389226495,A2 +1389226496,1389227775,AE +1389227776,1389227791,IQ +1389227792,1389227839,A2 +1389227840,1389227855,SA +1389227856,1389228031,A2 1389228032,1389228047,IQ -1389228048,1389228063,AE -1389228064,1389228095,IQ -1389228096,1389228127,LB -1389228128,1389228175,IQ -1389228176,1389228287,AE -1389228288,1389228351,IQ +1389228048,1389228063,A2 +1389228064,1389228079,IQ +1389228080,1389228303,A2 +1389228304,1389228319,IQ +1389228320,1389228351,A2 1389228352,1389228415,AE 1389228416,1389228479,LB -1389228480,1389228799,AE -1389228800,1389228863,NG -1389228864,1389228871,SO -1389228872,1389229055,AE -1389229056,1389229311,FR -1389229312,1389229567,AE -1389229568,1389229695,AF -1389229696,1389229823,AE -1389229824,1389230095,IR -1389230096,1389230111,AE -1389230112,1389230143,IR -1389230144,1389232063,AE -1389232064,1389232095,SA -1389232096,1389232127,AE -1389232128,1389264383,DE -1389264384,1389264639,ES +1389228480,1389228799,A2 +1389228800,1389229055,LY +1389229056,1389231615,AE +1389231616,1389231871,A2 +1389231872,1389232127,SA +1389232128,1389232319,DE +1389232320,1389232327,LT +1389232328,1389264031,DE +1389264032,1389264063,ES +1389264064,1389264127,DE +1389264128,1389264639,ES 1389264640,1389264911,US 1389264912,1389264927,CD 1389264928,1389264943,GB 1389264944,1389264959,GH 1389264960,1389265039,TZ -1389265040,1389265055,GB +1389265040,1389265055,A2 1389265056,1389265071,ZA 1389265072,1389265079,GB 1389265080,1389265087,NG -1389265088,1389265127,GB +1389265088,1389265127,A2 1389265128,1389265135,BH -1389265136,1389265151,GB +1389265136,1389265151,A2 1389265152,1389265167,NG 1389265168,1389265183,US 1389265184,1389265199,ZA 1389265200,1389265231,ET 1389265232,1389265239,TZ -1389265240,1389265263,GB +1389265240,1389265263,A2 1389265264,1389265279,NG 1389265280,1389265407,TD 1389265408,1389265535,US -1389265536,1389265536,GB +1389265536,1389265536,A2 1389265537,1389265551,US 1389265552,1389265559,CA 1389265560,1389265567,LR 1389265568,1389265574,GM -1389265575,1389265575,GB +1389265575,1389265575,A2 1389265576,1389265591,SC 1389265592,1389265598,CG -1389265599,1389265599,GB +1389265599,1389265599,A2 1389265600,1389265663,SO 1389265664,1389265791,ZA -1389265792,1389265807,GB +1389265792,1389265807,A2 1389265808,1389265823,CA 1389265824,1389265855,NG 1389265856,1389265863,US -1389265864,1389265919,GB -1389265920,1389266463,US +1389265864,1389266463,A2 1389266464,1389266471,CD -1389266472,1389266543,US +1389266472,1389266543,A2 1389266544,1389266551,CD -1389266552,1389266559,US +1389266552,1389266559,A2 1389266560,1389266569,CD -1389266570,1389266575,US +1389266570,1389266575,A2 1389266576,1389266591,NG -1389266592,1389266599,US +1389266592,1389266599,A2 1389266600,1389266607,NG -1389266608,1389266663,US +1389266608,1389266663,A2 1389266664,1389266687,CD 1389266688,1389266695,ZA -1389266696,1389266943,US +1389266696,1389266943,A2 1389266944,1389267199,KE 1389267200,1389267455,CD -1389267456,1389267967,GB -1389267968,1389268096,BI -1389268097,1389268223,GB -1389268224,1389268735,US -1389268736,1389268863,GB +1389267456,1389267967,A2 +1389267968,1389268223,BI +1389268224,1389268351,US +1389268352,1389268479,A2 +1389268480,1389268607,US +1389268608,1389268735,GB +1389268736,1389268863,A2 1389268864,1389268871,KE -1389268872,1389268991,GB -1389268992,1389269023,DE +1389268872,1389269023,A2 1389269024,1389269031,CD -1389269032,1389269055,DE +1389269032,1389269055,A2 1389269056,1389269063,CD -1389269064,1389269151,DE +1389269064,1389269151,A2 1389269152,1389269159,NG -1389269160,1389269183,DE +1389269160,1389269183,A2 1389269184,1389269215,NG -1389269216,1389269247,DE +1389269216,1389269247,A2 1389269248,1389269376,NG -1389269377,1389269759,GB +1389269377,1389269759,A2 1389269760,1389269887,CD -1389269888,1389270015,GB +1389269888,1389270015,A2 1389270016,1389270271,CD -1389270272,1389270783,GB -1389270784,1389271039,US +1389270272,1389270815,A2 +1389270816,1389270823,US +1389270824,1389271039,A2 1389271040,1389271295,CA -1389271296,1389272063,GB +1389271296,1389272063,A2 1389272064,1389272191,NO -1389272192,1389272367,GB -1389272368,1389272383,AE -1389272384,1389272831,GB +1389272192,1389272223,GB +1389272224,1389272319,A2 +1389272320,1389272447,AE +1389272448,1389272575,GB +1389272576,1389272831,A2 1389272832,1389272959,ZA 1389272960,1389273087,FR 1389273088,1389273343,LB 1389273344,1389273599,AE 1389273600,1389273855,MG 1389273856,1389274111,NG -1389274112,1389274367,GB -1389274368,1389274399,US +1389274112,1389274367,A2 +1389274368,1389274383,US +1389274384,1389274399,SA 1389274400,1389274431,GH 1389274432,1389274494,US -1389274495,1389274495,GB +1389274495,1389274495,A2 1389274496,1389274751,ZA 1389274752,1389274815,CD 1389274816,1389274839,LR -1389274840,1389274847,GB +1389274840,1389274847,A2 1389274848,1389274879,LR 1389274880,1389275135,AE 1389275136,1389275391,GB 1389275392,1389275471,BD -1389275472,1389275503,GB +1389275472,1389275503,A2 1389275504,1389275511,DE -1389275512,1389275839,GB +1389275512,1389275839,A2 1389275840,1389275902,SA -1389275903,1389275903,GB +1389275903,1389275903,A2 1389275904,1389276415,US -1389276416,1389276543,MX -1389276544,1389277439,GB -1389277440,1389277567,NP -1389277568,1389278207,GB -1389278208,1389278719,ZA +1389276416,1389276671,MX +1389276672,1389277055,A2 +1389277056,1389277183,MX +1389277184,1389277439,A2 +1389277440,1389277695,IQ +1389277696,1389277951,AE +1389277952,1389278207,A2 +1389278208,1389278463,SN +1389278464,1389278719,MX 1389278720,1389278847,DE 1389278848,1389278975,NG -1389278976,1389279103,GB +1389278976,1389279103,MX 1389279104,1389279231,NG -1389279232,1389279615,GB -1389279616,1389279743,US +1389279232,1389279487,US +1389279488,1389279615,TZ +1389279616,1389279743,NG 1389279744,1389279999,LR -1389280000,1389280511,GB +1389280000,1389280255,CI +1389280256,1389280511,A2 1389280512,1389280767,FR 1389280768,1389281023,VG -1389281024,1389281279,GB -1389281280,1389281791,ZA -1389281792,1389282815,GB +1389281024,1389281279,A2 +1389281280,1389282047,ZA +1389282048,1389282815,A2 1389282816,1389282943,LR -1389282944,1389283711,GB +1389282944,1389283071,SN +1389283072,1389283327,A2 +1389283328,1389283583,LR +1389283584,1389283711,A2 1389283712,1389283839,ZA -1389283840,1389284351,GB +1389283840,1389284351,A2 1389284352,1389286399,TZ -1389286400,1389287423,GB +1389286400,1389287423,A2 1389287424,1389287551,US -1389287552,1389287679,GB +1389287552,1389287679,A2 1389287680,1389287935,DK 1389287936,1389288447,US 1389288448,1389289471,GN 1389289472,1389290495,GB 1389290496,1389290751,US 1389290752,1389291007,FR -1389291008,1389291519,GB -1389291520,1389291775,US -1389291776,1389292031,GB +1389291008,1389291519,A2 +1389291520,1389291855,US +1389291856,1389292031,A2 1389292032,1389292799,GH 1389292800,1389293055,MG 1389293056,1389293311,US 1389293312,1389293567,KE -1389293568,1389294335,GB -1389294336,1389294591,US -1389294592,1389294847,GB -1389294848,1389296639,US -1389296640,1389297151,TZ -1389297152,1389297663,GB +1389293568,1389294335,A2 +1389294336,1389294719,US +1389294720,1389294847,IQ +1389294848,1389295615,US +1389295616,1389295887,ZA +1389295888,1389295935,A2 +1389295936,1389295967,SN +1389295968,1389295999,A2 +1389296000,1389296063,US +1389296064,1389296383,A2 +1389296384,1389296447,AD +1389296448,1389296639,A2 +1389296640,1389297408,US +1389297409,1389297663,A2 1389297664,1389330431,UA 1389330432,1389363199,DE -1389363200,1389365695,CZ -1389365696,1389365727,PL -1389365728,1389379583,CZ +1389363200,1389379583,CZ 1389379584,1389395967,RU 1389395968,1389412351,RO -1389412352,1389413631,CS -1389413632,1389413887,RS -1389413888,1389415423,CS -1389415424,1389415427,RS -1389415428,1389415679,CS -1389415680,1389416447,RS -1389416448,1389419775,CS -1389419776,1389420543,RS -1389420544,1389422591,CS -1389422592,1389422847,RS -1389422848,1389423871,CS -1389423872,1389424127,RS -1389424128,1389428735,CS +1389412352,1389428735,RS 1389428736,1389445119,CZ -1389445120,1389461503,GB +1389445120,1389461503,RU 1389461504,1389477887,SE 1389477888,1389494271,BY -1389494272,1389504511,DE -1389504512,1389505023,FR -1389505024,1389505279,DE -1389505280,1389505535,FR -1389505536,1389510655,DE +1389494272,1389495615,DE +1389495616,1389495645,CH +1389495646,1389502239,DE +1389502240,1389502271,CH +1389502272,1389504511,DE +1389504512,1389504772,FR +1389504773,1389504780,CH +1389504781,1389505023,FR +1389505024,1389510655,DE 1389510656,1389527039,NL 1389527040,1389543423,PL -1389543424,1389555263,DE +1389543424,1389544927,DE +1389544928,1389544943,SG +1389544944,1389548991,DE +1389548992,1389549055,BE +1389549056,1389554023,DE +1389554024,1389554039,FR +1389554040,1389554047,TR +1389554048,1389554087,DE +1389554088,1389554095,ES +1389554096,1389554103,DE +1389554104,1389554111,FR +1389554112,1389554135,IT +1389554136,1389555263,DE 1389555264,1389555327,AT 1389555328,1389556751,DE 1389556752,1389556759,CH @@ -17397,24 +32921,32 @@ 1389559744,1389559807,CH 1389559808,1389562879,DE 1389562880,1389563135,IT -1389563136,1389576191,DE +1389563136,1389563391,DE +1389563392,1389563647,IT +1389563648,1389564159,DE +1389564160,1389564415,BR +1389564416,1389576191,DE 1389576192,1389592575,GB -1389592576,1389608959,CY +1389592576,1389592831,A2 +1389592832,1389593087,CY +1389593088,1389608959,A2 1389608960,1389625343,DK 1389625344,1389641727,DE +1389641728,1389658111,JO 1389658112,1389674495,BE 1389674496,1389690879,DE 1389690880,1389707263,PS 1389707264,1389723647,IT 1389723648,1389756415,ES 1389756416,1389772799,SE -1389772800,1389784575,SI -1389784576,1389784831,BA -1389784832,1389788671,SI -1389788672,1389788927,CS -1389788928,1389789183,SI +1389772800,1389780991,SI +1389780992,1389782527,HR +1389782528,1389783039,SI +1389783040,1389784063,BA +1389784064,1389788671,SI +1389788672,1389789183,RS 1389789184,1389805567,PL -1389805568,1389821951,DE +1389805568,1389821951,US 1389821952,1389838335,NL 1389838336,1389854719,UZ 1389854720,1389871103,IT @@ -17426,7 +32958,9 @@ 1390149632,1390215167,CH 1390215168,1390280703,IS 1390280704,1390346239,TR -1390346240,1390395391,ES +1390346240,1390394367,ES +1390394368,1390394879,PT +1390394880,1390395391,ES 1390395392,1390396415,FR 1390396416,1390397183,PT 1390397184,1390411775,ES @@ -17455,17 +32989,9 @@ 1397751808,1398276095,NL 1398276096,1398800383,DK 1398800384,1398833151,KW -1398833152,1398849535,NL -1398849536,1398850079,BE -1398850080,1398850559,NL -1398850560,1398850687,BE -1398850688,1398850751,NL -1398850752,1398851231,BE -1398851232,1398851263,NL -1398851264,1398852351,BE -1398852352,1398852863,NL -1398852864,1398853119,BE -1398853120,1398865919,NL +1398833152,1398840447,NL +1398840448,1398840575,GB +1398840576,1398865919,NL 1398865920,1398867967,DE 1398867968,1398870015,NL 1398870016,1398872063,PL @@ -17483,27 +33009,36 @@ 1398896640,1398898687,CH 1398898688,1398931455,ES 1398931456,1398964223,GB -1398964224,1398965759,NL -1398965760,1398965887,CH -1398965888,1398967871,NL +1398964224,1398965503,NL +1398965504,1398965759,US +1398965760,1398966015,DE +1398966016,1398966839,NL +1398966840,1398966847,PL +1398966848,1398967871,NL 1398967872,1398967903,IE 1398967904,1398968063,NL 1398968064,1398968319,DE -1398968320,1398969599,NL -1398969600,1398969855,GB -1398969856,1398972319,NL -1398972320,1398972351,US -1398972352,1398972415,NL +1398968320,1398972415,NL 1398972416,1398972671,IE 1398972672,1398973695,NL -1398973696,1398973951,DE +1398973696,1398973951,AT 1398973952,1398974207,IE -1398974208,1398979583,NL +1398974208,1398979327,NL +1398979328,1398979583,US 1398979584,1398979839,GB -1398979840,1398983423,NL +1398979840,1398980873,NL +1398980874,1398980881,US +1398980882,1398980956,NL +1398980957,1398980975,US +1398980976,1398982143,NL +1398982144,1398982399,US +1398982400,1398983423,NL 1398983424,1398983487,GB 1398983488,1398983519,JE -1398983520,1398996991,NL +1398983520,1398983551,GB +1398983552,1398983679,NL +1398983680,1398984191,US +1398984192,1398996991,NL 1398996992,1399029759,LU 1399029760,1399062527,LV 1399062528,1399095295,FI @@ -17519,9 +33054,26 @@ 1399717888,1399848959,AE 1399848960,1400111103,FR 1400111104,1400373247,NL -1400373248,1400716287,DE +1400373248,1400705279,DE +1400705280,1400706047,EU +1400706048,1400707071,DE +1400707072,1400709119,EU +1400709120,1400710143,DE +1400710144,1400710399,EU +1400710400,1400712703,DE +1400712704,1400712959,EU +1400712960,1400716287,DE +1400716288,1400717311,EU 1400717312,1400718335,DE -1400718848,1400730623,DE +1400718336,1400718847,EU +1400718848,1400721407,DE +1400721408,1400721919,EU +1400721920,1400722431,DE +1400722432,1400729599,EU +1400729600,1400730639,DE +1400730640,1400731135,EU +1400731136,1400733695,DE +1400733696,1400897535,EU 1400897536,1400963071,NL 1400963072,1401028607,DE 1401028608,1401094143,IL @@ -17529,12 +33081,19 @@ 1401159680,1401225215,PT 1401225216,1401241599,DE 1401241600,1401242623,DK -1401242624,1401243135,DE -1401243648,1401244159,DE -1401245696,1401264903,DE +1401242624,1401244159,DE +1401244160,1401246719,EU +1401246720,1401264903,DE +1401264904,1401265151,EU 1401265152,1401265919,DE -1401266176,1401270783,DE -1401271296,1401282559,DE +1401265920,1401266175,EU +1401266176,1401273599,DE +1401273600,1401273727,EU +1401273728,1401274367,DE +1401274368,1401278463,EU +1401278464,1401283583,DE +1401283584,1401286655,EU +1401286656,1401290751,DE 1401290752,1401356287,BE 1401356288,1401421823,DE 1401421824,1401423135,GB @@ -17566,52 +33125,53 @@ 1401454592,1401456639,DE 1401456640,1401458687,LV 1401458688,1401460735,IT -1401460736,1401462783,CY +1401460736,1401462783,PL 1401462784,1401464831,FR 1401464832,1401466879,IE -1401466880,1401468927,CS +1401466880,1401468927,RS 1401468928,1401470975,ES 1401470976,1401473023,NL 1401473024,1401475071,CZ -1401475072,1401479167,GB +1401475072,1401477119,FR +1401477120,1401479167,BE 1401479168,1401481215,PL 1401481216,1401485311,RU -1401485312,1401486095,IT -1401486096,1401486111,CH -1401486112,1401486127,SM -1401486128,1401487359,IT 1401487360,1401489407,GB 1401489408,1401491455,SE 1401491456,1401493503,NL 1401493504,1401495551,CH -1401495552,1401497599,DK +1401495552,1401497599,DE 1401497600,1401499647,AT 1401499648,1401501695,RU -1401501696,1401503743,IT +1401501696,1401501791,IT +1401501792,1401502207,A2 +1401502208,1401502463,IT +1401502464,1401503743,A2 1401503744,1401505791,DE 1401505792,1401509887,CH 1401509888,1401511935,UA 1401511936,1401513983,DE 1401513984,1401516031,IT -1401516032,1401518079,FR +1401516032,1401516439,AT +1401516440,1401516447,AE +1401516448,1401518079,AT 1401518080,1401520127,IT 1401520128,1401522175,GB 1401522176,1401526271,NL -1401526272,1401528319,DE +1401526272,1401528319,HU 1401528320,1401530367,IT 1401530368,1401532415,DE 1401532416,1401534463,GB 1401534464,1401536511,DE 1401536512,1401538559,NL -1401538560,1401539327,NO -1401539328,1401539583,SE -1401539584,1401540607,NO +1401538560,1401540607,NO 1401540608,1401542655,GB 1401542656,1401544703,RU 1401544704,1401546751,GB 1401546752,1401548799,IT 1401548800,1401550847,FR -1401550848,1401552895,GB +1401550848,1401551103,JE +1401551104,1401552895,GB 1401552896,1401554943,NL 1401554944,1401556991,IE 1401556992,1401563135,GB @@ -17619,71 +33179,139 @@ 1401565184,1401567231,RU 1401567232,1401569279,GB 1401569280,1401585663,DE -1401585664,1401586535,GB -1401586536,1401586543,IE -1401586544,1401589791,GB -1401589792,1401589799,IE -1401589800,1401599167,GB +1401585664,1401595087,GB +1401595088,1401595095,NG +1401595096,1401599167,GB 1401599168,1401599231,IE 1401599232,1401602047,GB 1401602048,1401618431,ES 1401618432,1401634815,AM 1401634816,1401651199,HR -1401651200,1401667583,GB +1401651200,1401667583,RU 1401667584,1401683967,IT 1401683968,1401684479,SE 1401684480,1401684511,DK 1401684512,1401684543,SE 1401684544,1401684607,DK -1401684608,1401684735,SE +1401684608,1401684671,SE +1401684672,1401684703,DK +1401684704,1401684731,SE +1401684732,1401684735,DK 1401684736,1401684755,NO -1401684756,1401684799,SE -1401684800,1401684863,NO -1401684864,1401686015,SE -1401686016,1401686055,GB -1401686056,1401686079,SE -1401686080,1401686143,GB -1401686144,1401686271,SE +1401684756,1401684767,SE +1401684768,1401684895,NO +1401684896,1401686015,SE +1401686016,1401686059,GB +1401686060,1401686063,SE +1401686064,1401686143,GB +1401686144,1401686223,SE +1401686224,1401686271,GB 1401686272,1401686287,NL 1401686288,1401686335,SE 1401686336,1401686399,NL -1401686400,1401686527,SE -1401686528,1401686543,GB -1401686544,1401686591,SE -1401686592,1401686655,US -1401686656,1401686911,SE +1401686400,1401686911,SE 1401686912,1401686927,DE 1401686928,1401691519,SE 1401691520,1401691535,DE -1401691536,1401697815,SE +1401691536,1401695263,SE +1401695264,1401695267,GB +1401695268,1401697815,SE 1401697816,1401697823,DE -1401697824,1401714047,SE +1401697824,1401698223,SE +1401698224,1401698227,GB +1401698228,1401708543,SE +1401708544,1401709055,FR +1401709056,1401709311,SE +1401709312,1401709567,GB +1401709568,1401714047,SE 1401714048,1401714063,FR 1401714064,1401717759,SE 1401717760,1401718015,NL 1401718016,1401719935,SE 1401719936,1401719951,DK -1401719952,1401728335,SE +1401719952,1401719955,GB +1401719956,1401727743,SE +1401727744,1401727999,GB +1401728000,1401728335,SE 1401728336,1401728351,NL 1401728352,1401728431,SE 1401728432,1401728447,NL -1401728448,1401742847,SE +1401728448,1401740543,SE +1401740544,1401740799,DE +1401740800,1401742847,SE 1401742848,1401742879,GB -1401742880,1401743103,SE -1401743104,1401743119,GB -1401743120,1401745919,SE -1401745920,1401745935,DE -1401745936,1401746175,SE +1401742880,1401742895,SE +1401742896,1401742911,GB +1401742912,1401743055,SE +1401743056,1401743071,GB +1401743072,1401743087,SE +1401743088,1401743119,GB +1401743120,1401743151,SE +1401743152,1401743167,GB +1401743168,1401743311,SE +1401743312,1401743327,GB +1401743328,1401743343,SE +1401743344,1401743359,GB +1401743360,1401745439,SE +1401745440,1401745443,GB +1401745444,1401745487,SE +1401745488,1401745503,ES +1401745504,1401745919,SE +1401745920,1401745935,IT +1401745936,1401745959,SE +1401745960,1401745967,US +1401745968,1401745983,SE +1401745984,1401745999,NL +1401746000,1401746015,ES +1401746016,1401746019,GB +1401746020,1401746175,SE 1401746176,1401746191,DK -1401746192,1401746431,SE +1401746192,1401746215,SE +1401746216,1401746223,GB +1401746224,1401746239,SE +1401746240,1401746255,NL +1401746256,1401746271,ES +1401746272,1401746275,GB +1401746276,1401746431,SE 1401746432,1401746447,NL -1401746448,1401746687,SE +1401746448,1401746467,SE +1401746468,1401746471,NL +1401746472,1401746487,GB +1401746488,1401746495,SE +1401746496,1401746511,NL +1401746512,1401746527,ES +1401746528,1401746623,SE +1401746624,1401746639,DE +1401746640,1401746655,SE +1401746656,1401746687,IE 1401746688,1401746703,NO -1401746704,1401746943,SE +1401746704,1401746751,SE +1401746752,1401746767,NL +1401746768,1401746783,ES +1401746784,1401746879,SE +1401746880,1401746895,DE +1401746896,1401746943,SE 1401746944,1401746959,FR -1401746960,1401747199,SE -1401747200,1401747215,DE -1401747216,1401749135,SE +1401746960,1401747007,SE +1401747008,1401747023,NL +1401747024,1401747039,ES +1401747040,1401747135,SE +1401747136,1401747151,DE +1401747152,1401747199,SE +1401747200,1401747215,IT +1401747216,1401747279,SE +1401747280,1401747295,ES +1401747296,1401747391,SE +1401747392,1401747407,DE +1401747408,1401747487,SE +1401747488,1401747495,DK +1401747496,1401747499,SE +1401747500,1401747503,GB +1401747504,1401747647,SE +1401747648,1401747663,DE +1401747664,1401747711,SE +1401747712,1401747967,FR +1401747968,1401749135,SE 1401749136,1401749151,DE 1401749152,1401749503,SE 1401749504,1401753087,DE @@ -17703,16 +33331,19 @@ 1401827328,1401829375,GB 1401829376,1401831423,PL 1401831424,1401833471,GB +1401833472,1401835519,FI 1401835520,1401837567,DE 1401837568,1401839615,CH 1401839616,1401841663,NO -1401841664,1401847807,PL +1401841664,1401843711,UA +1401843712,1401847807,PL 1401847808,1401849855,DE +1401849856,1401851903,PL 1401851904,1401853951,FR 1401853952,1401855999,PL 1401856000,1401858047,RU 1401858048,1401868287,PL -1401868288,1401870335,AT +1401868288,1401870335,UA 1401870336,1401872383,PL 1401872384,1401874431,GB 1401874432,1401876479,UA @@ -17722,7 +33353,7 @@ 1401882624,1401884671,NG 1401884672,1401886719,FR 1401886720,1401888767,BW -1401888768,1401890815,RO +1401888768,1401890815,RU 1401890816,1401892863,PL 1401892864,1401894911,RU 1401894912,1401896959,FI @@ -17731,33 +33362,34 @@ 1401901056,1401903103,NO 1401903104,1401905151,FI 1401905152,1401907199,PL -1401907200,1401909247,FR +1401907200,1401909247,GR 1401909248,1401911295,NO 1401911296,1401913343,DK 1401913344,1401917439,PL 1401917440,1401919487,BG 1401919488,1401921535,RU 1401921536,1401923583,PL -1401923584,1401925631,BE +1401923584,1401925631,KN 1401925632,1401927679,BG 1401927680,1401929727,NL 1401929728,1401931775,RU -1401931776,1401933823,ES +1401931776,1401933823,UA 1401933824,1401935871,PL 1401935872,1401937919,FI 1401937920,1401939967,GB 1401939968,1401942015,UA +1401942016,1401944063,EU 1401944064,1401946111,BG 1401946112,1401962495,FR 1401962496,1401978879,PL 1401978880,1401995263,PT 1401995264,1402011647,CH -1402011648,1402025951,SE -1402025952,1402025983,DE -1402025984,1402028031,SE +1402011648,1402028031,SE 1402028032,1402044415,FR 1402044416,1402060799,PL -1402060800,1402077183,FI +1402060800,1402068159,FI +1402068160,1402068175,AX +1402068176,1402077183,FI 1402077184,1402093567,GB 1402093568,1402109951,RU 1402109952,1402142719,FI @@ -17785,17 +33417,26 @@ 1402408960,1402413055,DE 1402413056,1402417151,PL 1402417152,1402421247,DE -1402421248,1402421759,FR -1402421760,1402422271,GB -1402422272,1402422527,FR -1402422528,1402425343,GB -1402425344,1402425599,FR -1402425600,1402433535,GB -1402433536,1402433631,LU -1402433632,1402433695,FR -1402433696,1402433775,LU -1402433776,1402433791,FR -1402433792,1402437631,LU +1402421248,1402422783,FR +1402422784,1402423039,LU +1402423040,1402423295,FR +1402423296,1402423807,BE +1402423808,1402424319,FR +1402424320,1402424575,BE +1402424576,1402424831,FR +1402424832,1402425343,GB +1402425344,1402425599,DE +1402425600,1402425855,LU +1402425856,1402426367,FR +1402426368,1402426623,DE +1402426624,1402427135,CH +1402427136,1402429439,GB +1402429440,1402431487,US +1402431488,1402433535,GB +1402433536,1402434047,FR +1402434048,1402434559,GB +1402434560,1402434815,US +1402434816,1402437631,GB 1402437632,1402454015,DK 1402454016,1402470399,GB 1402470400,1402994687,FR @@ -17820,17 +33461,24 @@ 1403445248,1403461631,RU 1403461632,1403464663,FR 1403464664,1403464671,BE -1403464672,1403469823,FR +1403464672,1403469423,FR +1403469424,1403469431,US +1403469432,1403469823,FR 1403469824,1403486207,RU 1403486208,1403494399,FR 1403494400,1403502591,GB 1403502592,1403510783,NL +1403510784,1403518975,CZ 1403518976,1403535359,CY 1403535360,1403551743,PL 1403551744,1403568127,SK -1403568128,1403584511,SE -1403584512,1403600895,IR -1403600896,1403617279,FR +1403568128,1403580159,SE +1403580160,1403580415,GB +1403580416,1403584511,SE +1403584512,1403600895,DE +1403600896,1403601519,FR +1403601520,1403601535,MC +1403601536,1403617279,FR 1403617280,1403633663,DE 1403633664,1403650047,RU 1403650048,1403655935,DE @@ -17887,12 +33535,13 @@ 1403663568,1403663575,AE 1403663576,1403663589,DE 1403663590,1403663590,IR -1403663591,1403664895,DE -1403664896,1403664903,TZ -1403664904,1403666431,DE -1403666432,1403672575,GB -1403672576,1403672831,US -1403672832,1403699199,GB +1403663591,1403664919,DE +1403664920,1403664927,TZ +1403664928,1403666431,DE +1403666432,1403682815,GB +1403682816,1403688959,A2 +1403688960,1403692031,GB +1403692032,1403699199,A2 1403699200,1403715583,UA 1403715584,1403731967,LT 1403731968,1403748351,RU @@ -17914,78 +33563,78 @@ 1403994112,1404010495,AT 1404010496,1404026879,PL 1404026880,1404043263,ES -1404043264,1404051455,IT -1404051456,1404059647,CH -1404059648,1404076031,IT +1404043264,1404076031,SE 1404076032,1404084223,DE -1404084224,1404088319,BE -1404088320,1404116991,SE -1404116992,1404125183,ES -1404125184,1404137471,SE -1404137472,1404139519,HU -1404139520,1404141567,SE -1404141568,1404174335,FR -1404174336,1404184063,SE +1404084224,1404184063,SE 1404184064,1404184575,NO 1404184576,1404186623,SE 1404186624,1404187647,NO -1404187648,1404189183,SE +1404187648,1404188671,SE +1404188672,1404189183,LT 1404189184,1404189695,EE -1404189696,1404190719,RU -1404190720,1404198911,SE -1404198912,1404199935,DK -1404199936,1404200959,RU +1404189696,1404190719,NO +1404190720,1404192767,SE +1404192768,1404194815,LV +1404194816,1404195839,LT +1404195840,1404196351,NO +1404196352,1404197375,LT +1404197376,1404197887,NO +1404197888,1404198911,LT +1404198912,1404200959,SE 1404200960,1404203007,NL -1404203008,1404207103,SE -1404207104,1404208127,RU -1404208128,1404209151,SE -1404209152,1404210175,RU -1404210176,1404221439,SE +1404203008,1404204031,HR +1404204032,1404207103,SE +1404207104,1404210175,NO +1404210176,1404212223,LV +1404212224,1404215295,SE +1404215296,1404219391,LV +1404219392,1404220415,SE +1404220416,1404221439,EE 1404221440,1404222463,RU -1404222464,1404223487,SE -1404223488,1404227071,RU -1404227072,1404232191,SE -1404232192,1404232703,RU -1404232704,1404239871,SE -1404239872,1404305407,FR +1404222464,1404222975,LV +1404222976,1404225535,SE +1404225536,1404227071,RU +1404227072,1404227583,HR +1404227584,1404231679,LV +1404231680,1404232191,SE +1404232192,1404232703,NO +1404232704,1404233215,CH +1404233216,1404234239,SE +1404234240,1404235775,HR +1404235776,1404305407,SE 1404305408,1404321791,NL -1404321792,1404334079,CH -1404334080,1404338175,SE -1404338176,1404362751,ES -1404362752,1404370943,CH -1404370944,1404379135,SE +1404321792,1404379135,SE 1404379136,1404383231,AT -1404383232,1404386303,SE -1404386304,1404387327,IT +1404383232,1404387327,SE 1404387328,1404395519,DE -1404395520,1404403711,CH +1404395520,1404403711,SE 1404403712,1404411903,NL -1404411904,1404436479,IT -1404436480,1404502015,BE -1404502016,1404567551,SE -1404567552,1404633087,IT -1404633088,1404698623,SE -1404698624,1404764159,BE -1404764160,1404801535,PT -1404801536,1404805119,SE +1404411904,1404645375,SE +1404645376,1404645887,HR +1404645888,1404764159,SE +1404764160,1404768255,NL +1404768256,1404802047,SE +1404802048,1404802815,EE +1404802816,1404803071,SE +1404803072,1404803583,LV +1404803584,1404805119,SE 1404805120,1404813311,AT -1404813312,1404829695,IT +1404813312,1404829695,SE 1404829696,1404870655,RU -1404870656,1404895231,SE +1404870656,1404872703,LT +1404872704,1404874751,SE +1404874752,1404875775,LV +1404875776,1404876799,LT +1404876800,1404895231,SE 1404895232,1404927999,DE -1404928000,1404940287,CH -1404940288,1404944383,SE -1404944384,1404952575,IT +1404928000,1404952575,SE 1404952576,1404960767,NL -1404960768,1405026303,IT -1405026304,1405050879,ES +1404960768,1405050879,SE 1405050880,1405059071,AT 1405059072,1405063167,SE -1405063168,1405065215,NO -1405065216,1405067263,SE +1405063168,1405067263,NO 1405067264,1405075455,DE -1405075456,1405083647,FR -1405083648,1405091839,SE +1405075456,1405091839,SE 1405091840,1406140415,FR 1406140416,1406205951,CZ 1406205952,1406271487,SE @@ -18000,15 +33649,58 @@ 1406681088,1406689279,GB 1406689280,1406697471,SE 1406697472,1406705663,GB -1406705664,1406713855,IT -1406713856,1406717695,AT +1406705664,1406708735,IT +1406708736,1406709759,A2 +1406709760,1406710015,IT +1406710016,1406713855,A2 +1406713856,1406714879,AT +1406714880,1406715391,NL +1406715392,1406715519,AT +1406715520,1406715647,NL +1406715648,1406715711,AT +1406715712,1406716415,NL +1406716416,1406716671,AT +1406716672,1406716927,NL +1406716928,1406717439,AT +1406717440,1406717695,NL 1406717696,1406717951,DE -1406717952,1406722047,AT +1406717952,1406719487,GB +1406719488,1406719743,AT +1406719744,1406719999,GB +1406720000,1406721023,AT +1406721024,1406722047,GB 1406722048,1406730239,DE 1406730240,1406746623,RU -1406746624,1406753023,BE -1406753024,1406753279,GB -1406753280,1406754815,BE +1406746624,1406747391,BE +1406747392,1406747679,NL +1406747680,1406747743,BE +1406747744,1406747775,NL +1406747776,1406749183,BE +1406749184,1406749439,NL +1406749440,1406749567,BE +1406749568,1406749695,NL +1406749696,1406749775,BE +1406749776,1406749823,NL +1406749824,1406749839,BE +1406749840,1406749919,NL +1406749920,1406749951,BE +1406749952,1406750207,NL +1406750208,1406750319,BE +1406750320,1406750335,NL +1406750336,1406750975,BE +1406750976,1406751743,NL +1406751744,1406751807,BE +1406751808,1406751903,NL +1406751904,1406751967,BE +1406751968,1406751999,NL +1406752000,1406752255,BE +1406752256,1406752383,NL +1406752384,1406752447,BE +1406752448,1406752511,NL +1406752512,1406752735,BE +1406752736,1406752751,NL +1406752752,1406752767,BE +1406752768,1406754815,NL 1406754816,1406763007,GB 1406763008,1406771199,BE 1406771200,1406779391,GB @@ -18017,7 +33709,8 @@ 1406795776,1406803967,GB 1406803968,1406812159,DE 1406812160,1406820351,SE -1406820352,1406836735,GB +1406820352,1406828543,PL +1406828544,1406836735,GB 1406836736,1406844927,AT 1406844928,1406853119,MD 1406853120,1406861311,UA @@ -18035,15 +33728,14 @@ 1406951424,1406959615,PL 1406959616,1406964287,DE 1406964288,1406964319,CH -1406964320,1406964735,DE +1406964320,1406964327,BG +1406964328,1406964351,NL +1406964352,1406964735,DE 1406964736,1406964927,US -1406964928,1406966783,DE -1406966784,1406966791,GB -1406966792,1406967295,DE +1406964928,1406967295,DE 1406967296,1406967327,GB 1406967328,1406967343,NL -1406967344,1406967551,DE -1406967552,1406967807,GB +1406967344,1406967807,DE 1406967808,1406975999,RU 1406976000,1406984191,IE 1406984192,1407000575,RU @@ -18052,23 +33744,27 @@ 1407025152,1407025663,DK 1407025664,1407025919,US 1407025920,1407033343,DK -1407033344,1407033599,RU -1407033600,1407034367,UZ +1407033344,1407034367,UZ 1407034368,1407035391,RU 1407035392,1407041535,UZ 1407041536,1407049727,RU 1407049728,1407057919,DE 1407057920,1407066111,RU 1407066112,1407074303,LU -1407074304,1407082495,RU -1407082496,1407090687,GB +1407074304,1407082623,RU +1407082624,1407082639,DE +1407082640,1407089663,RU +1407089664,1407090687,US 1407090688,1407098879,CH 1407098880,1407107071,BG -1407107072,1407123455,RU +1407107072,1407115263,RU +1407115264,1407123455,GB 1407123456,1407131647,SE 1407131648,1407139839,NL 1407139840,1407148031,DE -1407148032,1407156223,GB +1407148032,1407152903,GB +1407152904,1407152927,NL +1407152928,1407156223,GB 1407156224,1407164415,LV 1407164416,1407172607,PT 1407172608,1407180799,GB @@ -18077,399 +33773,580 @@ 1407320064,1407451135,SE 1407451136,1407483903,BG 1407483904,1407516671,CH -1407516672,1407516831,GB -1407516832,1407516832,NG -1407516833,1407516927,GB +1407516672,1407516679,A2 +1407516680,1407516687,NG +1407516688,1407516703,A2 +1407516704,1407516735,NG +1407516736,1407516743,UG +1407516744,1407516751,LR +1407516752,1407516759,SL +1407516760,1407516767,A2 +1407516768,1407516775,AO +1407516776,1407516783,A2 +1407516784,1407516791,NG +1407516792,1407516799,AO +1407516800,1407516807,GH +1407516808,1407516815,NG +1407516816,1407516831,A2 +1407516832,1407516839,NG +1407516840,1407516847,A2 +1407516848,1407516855,NG +1407516856,1407516863,A2 +1407516864,1407516895,NG +1407516896,1407516911,A2 +1407516912,1407516927,NG 1407516928,1407517183,ZW -1407517184,1407517415,GB -1407517416,1407517423,NG -1407517424,1407517431,GB -1407517432,1407517439,NG -1407517440,1407517695,GB -1407517696,1407517951,NG -1407517952,1407518015,GB -1407518016,1407518031,NG -1407518032,1407518047,GB -1407518048,1407518055,NG -1407518056,1407518079,GB -1407518080,1407518135,NG -1407518136,1407518143,TD -1407518144,1407518151,NG -1407518152,1407518175,GB +1407517184,1407517311,GB +1407517312,1407517383,A2 +1407517384,1407517391,CD +1407517392,1407517415,A2 +1407517416,1407517439,NG +1407517440,1407517823,A2 +1407517824,1407517887,NG +1407517888,1407517919,CD +1407517920,1407517951,A2 +1407517952,1407518015,SL +1407518016,1407518031,ZA +1407518032,1407518039,A2 +1407518040,1407518047,CD +1407518048,1407518063,NG +1407518064,1407518079,A2 +1407518080,1407518111,FR +1407518112,1407518127,NG +1407518128,1407518135,KE +1407518136,1407518143,GH +1407518144,1407518159,ZA +1407518160,1407518167,NG +1407518168,1407518175,CD 1407518176,1407518183,GH -1407518184,1407518191,NG -1407518192,1407518199,LR -1407518200,1407518215,GB -1407518216,1407518223,NG -1407518224,1407518239,GB -1407518240,1407518263,NG +1407518184,1407518199,NG +1407518200,1407518207,AE +1407518208,1407518215,ZW +1407518216,1407518223,ZA +1407518224,1407518231,A2 +1407518232,1407518255,NG +1407518256,1407518263,CD 1407518264,1407518269,GH -1407518270,1407518335,GB +1407518270,1407518335,A2 1407518336,1407518343,CG -1407518344,1407518351,GN -1407518352,1407518359,GB -1407518360,1407518383,NG -1407518384,1407518391,CI -1407518392,1407518399,NG -1407518400,1407518847,GB -1407518848,1407518911,NG -1407518912,1407518943,GB -1407518944,1407518999,NG -1407519000,1407519007,GB -1407519008,1407519015,GH +1407518344,1407518351,ZA +1407518352,1407518359,GH +1407518360,1407518367,NG +1407518368,1407518375,ZA +1407518376,1407518391,NG +1407518392,1407518399,CD +1407518400,1407518719,A2 +1407518720,1407518783,AO +1407518784,1407518815,CD +1407518816,1407518831,A2 +1407518832,1407518847,NG +1407518848,1407518911,A2 +1407518912,1407518943,NG +1407518944,1407518975,A2 +1407518976,1407518983,NG +1407518984,1407518991,A2 +1407518992,1407518999,NG +1407519000,1407519007,A2 +1407519008,1407519015,NG 1407519016,1407519023,AO 1407519024,1407519031,NG -1407519032,1407519047,AO -1407519048,1407519063,GB -1407519064,1407519087,NG -1407519088,1407519095,GB +1407519032,1407519039,AO +1407519040,1407519047,NG +1407519048,1407519055,A2 +1407519056,1407519063,NG +1407519064,1407519071,BJ +1407519072,1407519079,CD +1407519080,1407519095,NG 1407519096,1407519103,CM 1407519104,1407519111,NG -1407519112,1407519127,SL -1407519128,1407519135,GB -1407519136,1407519143,CM -1407519144,1407519167,GB +1407519112,1407519135,SL +1407519136,1407519143,A2 +1407519144,1407519151,AO +1407519152,1407519159,A2 +1407519160,1407519167,AO 1407519168,1407519175,NG -1407519176,1407519191,GB +1407519176,1407519183,SL +1407519184,1407519191,NG 1407519192,1407519199,CD -1407519200,1407519207,CM -1407519208,1407519215,GB +1407519200,1407519207,AO +1407519208,1407519215,TG 1407519216,1407519223,NG -1407519224,1407519231,GB -1407519232,1407519742,NG -1407519743,1407519743,GB -1407519744,1407520255,NG -1407520256,1407520383,GB -1407520384,1407520397,NG -1407520398,1407520399,GB -1407520400,1407520439,NG +1407519224,1407519231,A2 +1407519232,1407519615,NG +1407519616,1407519743,A2 +1407519744,1407519751,NG +1407519752,1407519759,A2 +1407519760,1407519775,NG +1407519776,1407519783,A2 +1407519784,1407519791,NG +1407519792,1407519799,IQ +1407519800,1407519839,A2 +1407519840,1407519855,NG +1407519856,1407519863,A2 +1407519864,1407519871,NG +1407519872,1407520271,A2 +1407520272,1407520279,NG +1407520280,1407520303,A2 +1407520304,1407520327,NG +1407520328,1407520335,SL +1407520336,1407520343,A2 +1407520344,1407520359,NG +1407520360,1407520367,CD +1407520368,1407520375,A2 +1407520376,1407520397,NG +1407520398,1407520399,A2 +1407520400,1407520423,NG +1407520424,1407520439,A2 1407520440,1407520447,CD -1407520448,1407520463,CG -1407520464,1407520471,GB -1407520472,1407520479,NG -1407520480,1407520495,GB -1407520496,1407520511,CG -1407520512,1407520519,NG -1407520520,1407520527,GB -1407520528,1407520535,NG -1407520536,1407520543,GB -1407520544,1407520559,NG +1407520448,1407520463,NG +1407520464,1407520519,A2 +1407520520,1407520527,CD +1407520528,1407520543,NG +1407520544,1407520551,A2 +1407520552,1407520559,NG 1407520560,1407520567,SL -1407520568,1407520575,GB -1407520576,1407520599,NG -1407520600,1407520615,GB -1407520616,1407520623,NG -1407520624,1407520631,GB -1407520632,1407520639,ZM -1407520640,1407520695,NG -1407520696,1407520703,GB -1407520704,1407520727,NG +1407520568,1407520575,NG +1407520576,1407520607,A2 +1407520608,1407520615,AO +1407520616,1407520623,A2 +1407520624,1407520631,NG +1407520632,1407520639,A2 +1407520640,1407520655,NG +1407520656,1407520663,GA +1407520664,1407520671,A2 +1407520672,1407520679,CM +1407520680,1407520687,A2 +1407520688,1407520695,NG +1407520696,1407520711,A2 +1407520712,1407520719,NG +1407520720,1407520727,A2 1407520728,1407520735,AO -1407520736,1407520743,GB -1407520744,1407520751,NG -1407520752,1407520767,CD -1407520768,1407521535,GB -1407521536,1407521791,NG -1407521792,1407522047,GB +1407520736,1407520759,A2 +1407520760,1407520767,CD +1407520768,1407520775,ZW +1407520776,1407520783,A2 +1407520784,1407520791,SD +1407520792,1407520839,A2 +1407520840,1407520847,NG +1407520848,1407520855,ZM +1407520856,1407520863,A2 +1407520864,1407520871,NG +1407520872,1407520895,A2 +1407520896,1407520903,AO +1407520904,1407520911,NG +1407520912,1407520919,ZW +1407520920,1407520927,IQ +1407520928,1407520943,A2 +1407520944,1407520951,IQ +1407520952,1407520959,ZW +1407520960,1407520967,TZ +1407520968,1407520975,CD +1407520976,1407520983,A2 +1407520984,1407520991,ZM +1407520992,1407520999,AO +1407521000,1407521023,A2 +1407521024,1407521031,ZW +1407521032,1407521055,A2 +1407521056,1407521063,KE +1407521064,1407521127,A2 +1407521128,1407521135,NG +1407521136,1407521415,A2 +1407521416,1407521423,LR +1407521424,1407522047,A2 1407522048,1407522303,TZ -1407522304,1407522815,NG +1407522304,1407522319,A2 +1407522320,1407522327,BF +1407522328,1407522335,NG +1407522336,1407522351,SO +1407522352,1407522359,CD +1407522360,1407522367,NG +1407522368,1407522375,A2 +1407522376,1407522383,LR +1407522384,1407522399,A2 +1407522400,1407522407,NG +1407522408,1407522415,LR +1407522416,1407522431,NG +1407522432,1407522439,IQ +1407522440,1407522440,NG +1407522441,1407522463,A2 +1407522464,1407522479,NG +1407522480,1407522487,CD +1407522488,1407522495,A2 +1407522496,1407522503,NG +1407522504,1407522527,A2 +1407522528,1407522559,NG +1407522560,1407522567,A2 +1407522568,1407522575,NG +1407522576,1407522583,A2 +1407522584,1407522591,NG +1407522592,1407522615,A2 +1407522616,1407522623,NG +1407522624,1407522639,A2 +1407522640,1407522647,GQ +1407522648,1407522655,NG +1407522656,1407522671,A2 +1407522672,1407522679,ZM +1407522680,1407522687,IQ +1407522688,1407522695,LR +1407522696,1407522703,A2 +1407522704,1407522711,NG +1407522712,1407522727,A2 +1407522728,1407522735,CD +1407522736,1407522775,A2 +1407522776,1407522799,NG +1407522800,1407522807,ZM +1407522808,1407522815,IQ 1407522816,1407523071,ZW -1407523072,1407523327,TZ -1407523328,1407523335,GB -1407523336,1407523343,MW +1407523072,1407523279,A2 +1407523280,1407523287,MZ +1407523288,1407523295,NG +1407523296,1407523327,A2 +1407523328,1407523343,MW 1407523344,1407523351,NG -1407523352,1407523359,TZ +1407523352,1407523359,LU 1407523360,1407523367,ZW -1407523368,1407523391,GB +1407523368,1407523375,NG +1407523376,1407523391,A2 1407523392,1407523455,ZW 1407523456,1407523519,MW -1407523520,1407523535,YT -1407523536,1407523543,GH -1407523544,1407523551,NG -1407523552,1407523559,GB -1407523560,1407523567,MW -1407523568,1407523575,NG +1407523520,1407523535,A2 +1407523536,1407523551,NG +1407523552,1407523559,CM +1407523560,1407523567,KE +1407523568,1407523575,A2 1407523576,1407523583,MW 1407523584,1407523839,SO 1407523840,1407524351,MW 1407524352,1407524607,GB -1407524608,1407524863,CG -1407524864,1407527935,MZ -1407527936,1407529023,GB +1407524608,1407524615,A2 +1407524616,1407524623,CM +1407524624,1407524631,NG +1407524632,1407524639,BF +1407524640,1407524655,A2 +1407524656,1407524663,NG +1407524664,1407524687,A2 +1407524688,1407524703,MZ +1407524704,1407525071,A2 +1407525072,1407525079,NG +1407525080,1407526911,A2 +1407526912,1407527935,MZ +1407527936,1407529023,A2 1407529024,1407529087,NG -1407529088,1407529103,GB -1407529104,1407529111,UG -1407529112,1407529119,MW -1407529120,1407529127,GB -1407529128,1407529135,CM -1407529136,1407529143,NG -1407529144,1407529151,GB -1407529152,1407529183,TZ +1407529088,1407529095,TZ +1407529096,1407529103,ZW +1407529104,1407529111,NG +1407529112,1407529127,A2 +1407529128,1407529135,ZW +1407529136,1407529143,US +1407529144,1407529151,ZW +1407529152,1407529183,A2 1407529184,1407529191,NG -1407529192,1407531007,GB -1407531008,1407531519,NG -1407531520,1407532031,GB -1407532032,1407532543,KE -1407532544,1407532583,GB -1407532584,1407532591,CD -1407532592,1407532607,GB +1407529192,1407529199,MZ +1407529200,1407529207,A2 +1407529208,1407529215,NG +1407529216,1407531007,A2 +1407531008,1407531775,NG +1407531776,1407532543,A2 +1407532544,1407532551,UG +1407532552,1407532559,AO +1407532560,1407532583,A2 +1407532584,1407532591,ZW +1407532592,1407532607,A2 1407532608,1407532615,ZW -1407532616,1407532631,GB -1407532632,1407532639,NG -1407532640,1407532663,GB -1407532664,1407532671,NG +1407532616,1407532623,KG +1407532624,1407532631,A2 +1407532632,1407532639,MW +1407532640,1407532647,TZ +1407532648,1407532663,A2 +1407532664,1407532671,TZ 1407532672,1407532799,ZW 1407532800,1407532927,SO -1407532928,1407533055,GB +1407532928,1407533055,A2 1407533056,1407533311,NG -1407533312,1407533327,GE -1407533328,1407533375,GB -1407533376,1407533391,NG -1407533392,1407533423,GB -1407533424,1407533439,GH -1407533440,1407533567,CM -1407533568,1407533599,NG -1407533600,1407533607,GB +1407533312,1407533327,AO +1407533328,1407533343,A2 +1407533344,1407533359,NG +1407533360,1407533375,A2 +1407533376,1407533407,CD +1407533408,1407533423,A2 +1407533424,1407533567,GH +1407533568,1407533591,NG +1407533592,1407533607,A2 1407533608,1407533631,NG 1407533632,1407533663,IQ -1407533664,1407533679,GB -1407533680,1407533711,NG +1407533664,1407533679,A2 +1407533680,1407533695,NG +1407533696,1407533711,A2 1407533712,1407533719,ZW -1407533720,1407533727,GB -1407533728,1407533735,NG +1407533720,1407533727,SL +1407533728,1407533735,A2 1407533736,1407533743,GN -1407533744,1407533759,NG -1407533760,1407533767,GB -1407533768,1407533775,NG -1407533776,1407533783,CM -1407533784,1407533807,GB -1407533808,1407533815,CM +1407533744,1407533751,NG +1407533752,1407533759,A2 +1407533760,1407533783,NG +1407533784,1407533815,A2 1407533816,1407533823,NG -1407533824,1407534079,GB -1407534080,1407534343,NG -1407534344,1407534351,GB -1407534352,1407534359,NG -1407534360,1407534367,LR -1407534368,1407534383,GH -1407534384,1407534391,CD +1407533824,1407534079,A2 +1407534080,1407534335,AE +1407534336,1407534359,A2 +1407534360,1407534383,NG +1407534384,1407534391,A2 1407534392,1407534399,AO 1407534400,1407534407,NG 1407534408,1407534415,CI -1407534416,1407534423,GB -1407534424,1407534431,GE -1407534432,1407534439,CM -1407534440,1407534447,CD -1407534448,1407534527,NG -1407534528,1407534535,GH -1407534536,1407534543,GB +1407534416,1407534447,A2 +1407534448,1407534463,NG +1407534464,1407534543,A2 1407534544,1407534559,GH 1407534560,1407534567,NG -1407534568,1407534575,TZ +1407534568,1407534575,A2 1407534576,1407534583,CD -1407534584,1407534591,GB +1407534584,1407534591,A2 1407534592,1407534727,NG -1407534728,1407534735,CI -1407534736,1407534767,NG -1407534768,1407534775,GB +1407534728,1407534735,A2 +1407534736,1407534775,NG 1407534776,1407534783,ML -1407534784,1407534791,GB -1407534792,1407534799,NG -1407534800,1407534807,CD -1407534808,1407534815,BW -1407534816,1407534823,GB -1407534824,1407534831,GH -1407534832,1407534839,GB -1407534840,1407534847,NG +1407534784,1407534791,CD +1407534792,1407534847,A2 1407534848,1407535103,CM 1407535104,1407535615,GA -1407535616,1407536127,CD +1407535616,1407536127,A2 1407536128,1407536639,GA 1407536640,1407536895,CD -1407536896,1407536903,GB +1407536896,1407536903,A2 1407536904,1407536919,ZW -1407536920,1407536935,AO +1407536920,1407536935,A2 1407536936,1407536943,NG 1407536944,1407536951,AO -1407536952,1407536967,GB -1407536968,1407536983,NG +1407536952,1407536983,A2 1407536984,1407536991,IQ -1407536992,1407536999,GB -1407537000,1407537007,GH -1407537008,1407537015,GB -1407537016,1407537023,GH -1407537024,1407537031,GB +1407536992,1407537031,A2 1407537032,1407537039,NG -1407537040,1407537047,GB +1407537040,1407537047,A2 1407537048,1407537055,NG 1407537056,1407537071,GH 1407537072,1407537087,NG 1407537088,1407537095,GH -1407537096,1407537111,NG -1407537112,1407537135,GB -1407537136,1407537151,NG -1407537152,1407538175,IQ -1407538176,1407538431,AT -1407538432,1407538439,GB +1407537096,1407537103,A2 +1407537104,1407537111,NG +1407537112,1407537119,LR +1407537120,1407537135,A2 +1407537136,1407537143,NG +1407537144,1407537167,A2 +1407537168,1407537175,ZM +1407537176,1407537191,NG +1407537192,1407537199,A2 +1407537200,1407537207,NG +1407537208,1407537215,A2 +1407537216,1407537255,NG +1407537256,1407537263,A2 +1407537264,1407537279,NG +1407537280,1407537287,LR +1407537288,1407537295,NG +1407537296,1407537303,A2 +1407537304,1407537311,NG +1407537312,1407537327,A2 +1407537328,1407537351,NG +1407537352,1407537359,A2 +1407537360,1407537367,LR +1407537368,1407537391,NG +1407537392,1407537399,LR +1407537400,1407537423,A2 +1407537424,1407537455,NG +1407537456,1407537479,A2 +1407537480,1407537487,CM +1407537488,1407537495,GH +1407537496,1407537511,NG +1407537512,1407537519,LR +1407537520,1407537527,A2 +1407537528,1407537535,NG +1407537536,1407537543,LR +1407537544,1407537559,A2 +1407537560,1407537567,NG +1407537568,1407537575,A2 +1407537576,1407537639,NG +1407537640,1407537663,A2 +1407537664,1407537671,AO +1407537672,1407537679,NG +1407537680,1407537687,IQ +1407537688,1407537703,A2 +1407537704,1407537735,NG +1407537736,1407537743,A2 +1407537744,1407537751,IQ +1407537752,1407537847,NG +1407537848,1407537855,A2 +1407537856,1407537863,NG +1407537864,1407537871,A2 +1407537872,1407537879,IQ +1407537880,1407537887,A2 +1407537888,1407537895,NG +1407537896,1407537903,IQ +1407537904,1407537911,A2 +1407537912,1407537927,NG +1407537928,1407537935,A2 +1407537936,1407537943,GH +1407537944,1407537959,NG +1407537960,1407537967,A2 +1407537968,1407537991,NG +1407537992,1407537999,IQ +1407538000,1407538023,NG +1407538024,1407538039,A2 +1407538040,1407538047,IQ +1407538048,1407538055,NG +1407538056,1407538071,LU +1407538072,1407538079,NG +1407538080,1407538087,A2 +1407538088,1407538095,AO +1407538096,1407538111,A2 +1407538112,1407538119,LR +1407538120,1407538135,NG +1407538136,1407538143,A2 +1407538144,1407538151,GN +1407538152,1407538167,A2 +1407538168,1407538175,IQ +1407538176,1407538295,AT +1407538296,1407538303,AO +1407538304,1407538431,AT +1407538432,1407538439,A2 1407538440,1407538447,NG -1407538448,1407538455,GB -1407538456,1407538463,NG +1407538448,1407538463,A2 1407538464,1407538471,ZM 1407538472,1407538479,NG -1407538480,1407538487,GB -1407538488,1407538503,NG -1407538504,1407538527,GB -1407538528,1407538543,GE -1407538544,1407538551,GH -1407538552,1407538559,GB -1407538560,1407538623,NG -1407538624,1407538655,GB -1407538656,1407538751,NG -1407538752,1407538783,GB -1407538784,1407538815,NG -1407538816,1407538847,CD +1407538480,1407538495,A2 +1407538496,1407538503,NG +1407538504,1407538559,A2 +1407538560,1407538623,CD +1407538624,1407538663,A2 +1407538664,1407538687,NG +1407538688,1407538751,A2 +1407538752,1407538783,NG +1407538784,1407538847,A2 1407538848,1407538863,NG 1407538864,1407538879,GE -1407538880,1407538887,GB +1407538880,1407538887,A2 1407538888,1407538895,NG -1407538896,1407538911,GB -1407538912,1407538927,GH +1407538896,1407538911,A2 +1407538912,1407538919,GH +1407538920,1407538927,A2 1407538928,1407538935,NG 1407538936,1407538943,GH -1407538944,1407538959,GB -1407538960,1407538967,NG +1407538944,1407538967,A2 1407538968,1407538975,CM 1407538976,1407538983,NG 1407538984,1407538991,SL -1407538992,1407539007,NG -1407539008,1407539015,BF -1407539016,1407539023,NG -1407539024,1407539055,GB +1407538992,1407538999,A2 +1407539000,1407539007,NG +1407539008,1407539055,A2 1407539056,1407539063,NG -1407539064,1407539071,CM +1407539064,1407539071,A2 1407539072,1407539079,NG -1407539080,1407539087,GB +1407539080,1407539087,A2 1407539088,1407539095,AO -1407539096,1407539103,CI -1407539104,1407539119,NG -1407539120,1407539127,LR -1407539128,1407539135,GB -1407539136,1407539143,CI -1407539144,1407539151,GB -1407539152,1407539159,TZ -1407539160,1407539167,NG +1407539096,1407539103,A2 +1407539104,1407539111,NG +1407539112,1407539143,A2 +1407539144,1407539151,NG +1407539152,1407539167,A2 1407539168,1407539175,TD -1407539176,1407539191,GH -1407539192,1407539199,GB +1407539176,1407539183,GH +1407539184,1407539199,NG 1407539200,1407539455,GE -1407539456,1407541247,NG -1407541248,1407541455,GB -1407541456,1407541463,TD -1407541464,1407541487,GB -1407541488,1407541495,NG -1407541496,1407541503,GB -1407541504,1407541535,BJ +1407539456,1407539967,NG +1407539968,1407541471,A2 +1407541472,1407541495,NG +1407541496,1407541535,A2 1407541536,1407541543,CM -1407541544,1407541551,GB +1407541544,1407541551,A2 1407541552,1407541559,NG 1407541560,1407541567,GH -1407541568,1407541607,NG -1407541608,1407541631,GB -1407541632,1407541719,NG -1407541720,1407541727,GB -1407541728,1407541743,NG -1407541744,1407541751,GB +1407541568,1407541703,A2 +1407541704,1407541719,NG +1407541720,1407541727,A2 +1407541728,1407541735,NG +1407541736,1407541751,A2 1407541752,1407541759,NG -1407541760,1407542271,CM -1407542272,1407542527,GB -1407542528,1407542535,NG -1407542536,1407542543,GB +1407541760,1407541887,A2 +1407541888,1407542143,NG +1407542144,1407542543,A2 1407542544,1407542551,LR -1407542552,1407542559,CM -1407542560,1407542567,GB -1407542568,1407542575,CI +1407542552,1407542575,A2 1407542576,1407542583,CD -1407542584,1407542599,NG +1407542584,1407542591,A2 +1407542592,1407542599,NG 1407542600,1407542607,TG -1407542608,1407542623,GB +1407542608,1407542623,A2 1407542624,1407542631,BJ 1407542632,1407542639,NG -1407542640,1407542655,GB +1407542640,1407542655,A2 1407542656,1407542663,SL -1407542664,1407542671,GB +1407542664,1407542671,A2 1407542672,1407542679,CM 1407542680,1407542687,NG 1407542688,1407542695,CD 1407542696,1407542703,NG -1407542704,1407542711,CI -1407542712,1407542719,GB -1407542720,1407542743,NG -1407542744,1407542759,GB -1407542760,1407542767,CM -1407542768,1407542799,NG -1407542800,1407542807,GB -1407542808,1407542815,NG -1407542816,1407542847,GB -1407542848,1407542895,NG -1407542896,1407542903,GB +1407542704,1407542719,A2 +1407542720,1407542735,NG +1407542736,1407542767,A2 +1407542768,1407542775,GA +1407542776,1407542783,NG +1407542784,1407542791,A2 +1407542792,1407542799,NG +1407542800,1407542831,A2 +1407542832,1407542863,NG +1407542864,1407542903,A2 1407542904,1407542911,CD 1407542912,1407543039,AT -1407543040,1407543167,NG +1407543040,1407543167,A2 1407543168,1407543183,GH -1407543184,1407543191,GB -1407543192,1407543239,NG -1407543240,1407543255,GB +1407543184,1407543239,NG +1407543240,1407543255,A2 1407543256,1407543263,NG -1407543264,1407543279,GB -1407543280,1407543295,NG -1407543296,1407545343,LB +1407543264,1407543279,A2 +1407543280,1407543287,NG +1407543288,1407545343,A2 1407545344,1407546367,SL -1407546368,1407546495,NG -1407546496,1407546879,GB -1407546880,1407547135,NG -1407547136,1407547143,GB +1407546368,1407546495,AE +1407546496,1407546879,A2 +1407546880,1407547135,ZW +1407547136,1407547143,A2 1407547144,1407547151,GH -1407547152,1407547159,GB -1407547160,1407547175,NG +1407547152,1407547167,A2 +1407547168,1407547175,NG 1407547176,1407547183,GH -1407547184,1407547191,AO -1407547192,1407547199,GB -1407547200,1407547207,NG -1407547208,1407547215,AO -1407547216,1407547239,SL -1407547240,1407547247,NG -1407547248,1407547255,GB -1407547256,1407547263,NG -1407547264,1407547279,GB -1407547280,1407547303,NG -1407547304,1407547319,GB -1407547320,1407547327,SL -1407547328,1407547351,GB -1407547352,1407547367,NG -1407547368,1407547383,GB -1407547384,1407547911,NG -1407547912,1407547919,GB +1407547184,1407547199,NG +1407547200,1407547207,AO +1407547208,1407547215,TD +1407547216,1407547223,SL +1407547224,1407547231,A2 +1407547232,1407547255,SL +1407547256,1407547263,A2 +1407547264,1407547271,SL +1407547272,1407547295,NG +1407547296,1407547303,A2 +1407547304,1407547311,SL +1407547312,1407547327,NG +1407547328,1407547335,A2 +1407547336,1407547343,CI +1407547344,1407547911,NG +1407547912,1407547919,A2 1407547920,1407547927,CG -1407547928,1407547935,GB -1407547936,1407547943,CI +1407547928,1407547943,A2 1407547944,1407547951,BJ -1407547952,1407547959,LR -1407547960,1407547967,NG -1407547968,1407547983,GB +1407547952,1407547983,A2 1407547984,1407547999,BJ -1407548000,1407548007,NG -1407548008,1407548015,GB -1407548016,1407548023,NG -1407548024,1407548031,CD -1407548032,1407548063,NG -1407548064,1407548103,GB -1407548104,1407548111,NG +1407548000,1407548023,A2 +1407548024,1407548031,NG +1407548032,1407548047,A2 +1407548048,1407548055,GA +1407548056,1407548063,NG +1407548064,1407548111,A2 1407548112,1407548119,CI -1407548120,1407548127,NG -1407548128,1407548151,CM -1407548152,1407548159,NG -1407548160,1407548415,NE +1407548120,1407548127,A2 +1407548128,1407548143,CM +1407548144,1407548151,A2 +1407548152,1407548415,NG 1407548416,1407548543,GE -1407548544,1407549183,NG +1407548544,1407549183,A2 1407549184,1407549439,GE 1407549440,1407582207,RU 1407582208,1407614975,PL @@ -18478,15 +34355,66 @@ 1407681536,1407681639,FR 1407681640,1407681983,GB 1407681984,1407681999,ES -1407682000,1407682879,GB +1407682000,1407682303,GB +1407682304,1407682559,FR +1407682560,1407682879,GB 1407682880,1407682911,FI -1407682912,1407695215,GB +1407682912,1407687423,GB +1407687424,1407687679,ES +1407687680,1407695215,GB 1407695216,1407695223,ES -1407695224,1407713279,GB +1407695224,1407700271,GB +1407700272,1407700287,DE +1407700288,1407702015,GB +1407702016,1407702271,FR +1407702272,1407702783,GB +1407702784,1407702911,FR +1407702912,1407703039,GB +1407703040,1407703407,FR +1407703408,1407703415,GB +1407703416,1407703455,FR +1407703456,1407703535,GB +1407703536,1407703871,FR +1407703872,1407703935,GB +1407703936,1407704039,FR +1407704040,1407704063,GB +1407704064,1407704127,FR +1407704128,1407704191,GB +1407704192,1407704319,FR +1407704320,1407704383,GB +1407704384,1407704447,FR +1407704448,1407705207,GB +1407705208,1407705215,ES +1407705216,1407705247,GB +1407705248,1407705295,ES +1407705296,1407705599,GB +1407705600,1407705727,FR +1407705728,1407705759,GB +1407705760,1407705791,FR +1407705792,1407706367,GB +1407706368,1407706423,FR +1407706424,1407707703,GB +1407707704,1407707839,CH +1407707840,1407707903,GB +1407707904,1407707935,CH +1407707936,1407709183,GB +1407709184,1407709631,DE +1407709632,1407710207,GB +1407710208,1407710239,ES +1407710240,1407710975,GB +1407710976,1407711319,FR +1407711320,1407711327,GB +1407711328,1407711623,FR +1407711624,1407711631,GB +1407711632,1407711727,FR +1407711728,1407712207,GB +1407712208,1407712223,FR +1407712224,1407712767,GB +1407712768,1407712831,DE +1407712832,1407712887,GB +1407712888,1407713279,DE 1407713280,1407778815,NL -1407778816,1407842303,SE -1407842304,1407842367,NO -1407842368,1407844351,SE +1407778816,1407844351,SE 1407844352,1407909887,RU 1407909888,1407975423,GR 1407975424,1408040959,DE @@ -18502,9 +34430,7 @@ 1408340048,1408340055,NO 1408340056,1408360935,SE 1408360936,1408360943,DK -1408360944,1408360951,SE -1408360952,1408360959,DK -1408360960,1408368639,SE +1408360944,1408368639,SE 1408368640,1408376831,NO 1408376832,1408385023,DE 1408385024,1408393215,PL @@ -18525,23 +34451,24 @@ 1408464896,1408466943,RO 1408466944,1408499711,NO 1408499712,1408532479,PS -1408532480,1408575231,GB +1408532480,1408567919,GB +1408567920,1408567927,IE +1408567928,1408574847,GB +1408574848,1408574911,IE +1408574912,1408575231,GB 1408575232,1408575239,IE -1408575240,1408583167,GB -1408583168,1408583679,IE -1408583680,1408584191,GB +1408575240,1408584191,GB 1408584192,1408584703,IE 1408584704,1408585407,GB 1408585408,1408585471,IE -1408585472,1408590847,GB +1408585472,1408590367,GB +1408590368,1408590383,IM +1408590384,1408590847,GB 1408590848,1408591103,BE -1408591104,1408591871,GB -1408591872,1408592127,IE -1408592128,1408592639,GB -1408592640,1408592895,IE -1408592896,1408598015,GB +1408591104,1408598015,GB 1408598016,1408630783,FI -1408630784,1408663551,DE +1408630784,1408634879,RO +1408634880,1408663551,DE 1408663552,1408696319,RU 1408696320,1408729087,NL 1408729088,1408761855,ES @@ -18550,7 +34477,9 @@ 1409362432,1409363967,BG 1409363968,1409413119,HU 1409413120,1409415167,BG -1409415168,1409548287,HU +1409415168,1409430271,HU +1409430272,1409430783,RO +1409430784,1409548287,HU 1409548288,1409810431,FR 1409810432,1409941503,GB 1409941504,1410007039,PL @@ -18558,34 +34487,34 @@ 1410007552,1410007807,IR 1410007808,1410008575,DE 1410008576,1410008607,AE -1410008608,1410009343,DE +1410008608,1410008831,DE +1410008832,1410008911,US +1410008912,1410009343,DE 1410009344,1410009479,US -1410009480,1410010367,DE +1410009480,1410009487,DE +1410009488,1410009535,GI +1410009536,1410010367,DE 1410010368,1410010399,IR 1410010400,1410010431,LY -1410010432,1410010559,DE -1410010560,1410010575,LY -1410010576,1410010599,DE +1410010432,1410010543,DE +1410010544,1410010575,LY +1410010576,1410010591,DE +1410010592,1410010599,LY 1410010600,1410010607,IR -1410010608,1410010623,DE -1410010624,1410010639,BH -1410010640,1410010647,DE -1410010648,1410010671,IR -1410010672,1410010687,DE -1410010688,1410010711,IR -1410010712,1410010719,DE +1410010608,1410010623,LY +1410010624,1410010687,DE +1410010688,1410010703,IR +1410010704,1410010719,DE 1410010720,1410010751,LY -1410010752,1410010767,IR -1410010768,1410010783,DE -1410010784,1410010799,IR -1410010800,1410010807,DE -1410010808,1410010831,IR -1410010832,1410010839,US -1410010840,1410010879,DE +1410010752,1410010823,DE +1410010824,1410010831,IR +1410010832,1410010879,DE 1410010880,1410011135,IR 1410011136,1410011903,DE 1410011904,1410011919,US -1410011920,1410013183,DE +1410011920,1410012159,DE +1410012160,1410012415,IQ +1410012416,1410013183,DE 1410013184,1410013439,ES 1410013440,1410013471,IR 1410013472,1410013535,AE @@ -18595,9 +34524,11 @@ 1410013664,1410013695,AE 1410013696,1410013727,KW 1410013728,1410013759,AE -1410013760,1410013823,IR +1410013760,1410013791,IR +1410013792,1410013823,DE 1410013824,1410013887,AF -1410013888,1410013951,DE +1410013888,1410013919,DE +1410013920,1410013951,KW 1410013952,1410013983,AE 1410013984,1410014015,IR 1410014016,1410014047,KW @@ -18625,7 +34556,9 @@ 1410014975,1410015007,DE 1410015008,1410015103,IR 1410015104,1410015135,ES -1410015136,1410015423,IR +1410015136,1410015263,IR +1410015264,1410015295,KW +1410015296,1410015423,IR 1410015424,1410015487,AE 1410015488,1410015743,AF 1410015744,1410015871,IR @@ -18718,710 +34651,57 @@ 1410027520,1410027711,DE 1410027712,1410027775,IR 1410027776,1410028799,DE -1410028800,1410028879,IQ -1410028880,1410032127,DE -1410032128,1410033151,IQ -1410033152,1410035199,DE -1410035200,1410035231,KW -1410035232,1410035263,DE -1410035264,1410035295,KW -1410035296,1410035367,IR -1410035368,1410035967,DE -1410035968,1410036063,PA -1410036064,1410036079,IQ -1410036080,1410036095,IR -1410036096,1410036111,IQ +1410028800,1410028831,IR +1410028832,1410035327,DE +1410035328,1410035343,IR +1410035344,1410035983,DE +1410035984,1410035999,PA +1410036000,1410036031,DE +1410036032,1410036063,PA +1410036064,1410036111,DE 1410036112,1410036127,PA -1410036128,1410036143,DE -1410036144,1410036175,PA -1410036176,1410036191,DE -1410036192,1410036223,PA -1410036224,1410036351,AE -1410036352,1410036479,DE -1410036480,1410036511,AE -1410036512,1410036735,DE +1410036128,1410036191,DE +1410036192,1410036207,PA +1410036208,1410036735,DE 1410036736,1410036751,PA -1410036752,1410039807,DE +1410036752,1410037759,DE +1410037760,1410038015,US +1410038016,1410039807,DE 1410039808,1410041855,AE -1410041856,1410042463,DE -1410042464,1410042479,LB -1410042480,1410072319,DE +1410041856,1410042815,DE +1410042816,1410042831,US +1410042832,1410043903,DE +1410043904,1410044415,JO +1410044416,1410044927,DE +1410044928,1410045183,VG +1410045184,1410072319,DE 1410072320,1410072575,AE -1410072576,1410203903,GB -1410203904,1410203911,FR -1410203912,1410203919,GB -1410203920,1410204119,FR -1410204120,1410204127,GB -1410204128,1410204311,FR -1410204312,1410204319,GB -1410204320,1410204511,FR -1410204512,1410204543,GB -1410204544,1410204955,FR -1410204956,1410204959,GB -1410204960,1410204975,FR -1410204976,1410204983,GB -1410204984,1410205143,FR -1410205144,1410205151,GB -1410205152,1410205183,FR -1410205184,1410205695,GB -1410205696,1410205783,FR -1410205784,1410205791,GB -1410205792,1410205807,FR -1410205808,1410205815,GB -1410205816,1410205823,FR -1410205824,1410206207,GB -1410206208,1410206223,FR -1410206224,1410206239,GB -1410206240,1410206255,FR -1410206256,1410206263,GB -1410206264,1410206271,FR -1410206272,1410206279,GB -1410206280,1410206287,FR -1410206288,1410206303,GB -1410206304,1410206367,FR -1410206368,1410206375,GB -1410206376,1410206735,FR -1410206736,1410206743,GB -1410206744,1410206887,FR -1410206888,1410206895,GB -1410206896,1410207103,FR -1410207104,1410207111,GB -1410207112,1410207163,FR -1410207164,1410207167,GB -1410207168,1410207191,FR -1410207192,1410207627,GB -1410207628,1410207647,FR -1410207648,1410207871,GB -1410207872,1410207895,FR -1410207896,1410207903,GB -1410207904,1410207911,FR -1410207912,1410208895,GB -1410208896,1410208911,FR -1410208912,1410210943,GB -1410210944,1410211031,FR -1410211032,1410211039,GB -1410211040,1410211071,FR -1410211072,1410211327,GB -1410211328,1410211607,FR -1410211608,1410211639,GB -1410211640,1410211647,FR -1410211648,1410212095,GB -1410212096,1410212135,FR -1410212136,1410212143,GB -1410212144,1410212159,FR -1410212160,1410212167,GB -1410212168,1410212239,FR -1410212240,1410212263,GB -1410212264,1410212295,FR -1410212296,1410212303,GB -1410212304,1410212335,FR -1410212336,1410212367,GB -1410212368,1410212383,FR -1410212384,1410212415,GB -1410212416,1410212487,FR -1410212488,1410212495,GB -1410212496,1410212535,FR -1410212536,1410214143,GB -1410214144,1410214151,FR -1410214152,1410214159,GB -1410214160,1410214191,FR -1410214192,1410214199,GB -1410214200,1410214311,FR -1410214312,1410214319,GB -1410214320,1410214495,FR +1410072576,1410203647,GB +1410203648,1410204439,FR +1410204440,1410204455,IT +1410204456,1410204479,FR +1410204480,1410204495,PT +1410204496,1410206543,FR +1410206544,1410206551,ES +1410206552,1410212863,FR +1410212864,1410213119,GB +1410213120,1410214495,FR 1410214496,1410214503,PT -1410214504,1410214511,FR -1410214512,1410214519,GB -1410214520,1410214543,FR -1410214544,1410214551,GB -1410214552,1410214599,FR -1410214600,1410214607,GB -1410214608,1410214647,FR -1410214648,1410214655,GB -1410214656,1410214663,FR -1410214664,1410214671,GB -1410214672,1410214687,FR -1410214688,1410214703,GB -1410214704,1410214895,FR -1410214896,1410214911,GB -1410214912,1410215183,FR -1410215184,1410215191,GB -1410215192,1410215199,FR -1410215200,1410215231,GB -1410215232,1410215247,FR -1410215248,1410215295,GB -1410215296,1410215359,FR -1410215360,1410215687,GB -1410215688,1410215695,FR -1410215696,1410216191,GB -1410216192,1410216247,FR -1410216248,1410216319,GB -1410216320,1410216351,FR -1410216352,1410216383,GB -1410216384,1410216395,FR -1410216396,1410216399,GB -1410216400,1410216415,FR -1410216416,1410216431,GB -1410216432,1410216687,FR -1410216688,1410216695,GB -1410216696,1410217055,FR -1410217056,1410217071,GB -1410217072,1410217087,FR -1410217088,1410217103,GB -1410217104,1410217127,FR -1410217128,1410217135,GB -1410217136,1410217167,FR -1410217168,1410217175,GB -1410217176,1410217215,FR -1410217216,1410217279,GB -1410217280,1410217287,FR -1410217288,1410217295,GB -1410217296,1410217311,FR -1410217312,1410217327,GB -1410217328,1410217335,FR -1410217336,1410217343,GB -1410217344,1410217431,FR -1410217432,1410217439,GB -1410217440,1410217471,FR -1410217472,1410217719,GB -1410217720,1410217815,FR -1410217816,1410217831,GB -1410217832,1410217839,FR -1410217840,1410217847,GB -1410217848,1410217935,FR -1410217936,1410218111,GB -1410218112,1410218191,FR -1410218192,1410218199,GB -1410218200,1410218295,FR -1410218296,1410218319,GB -1410218320,1410218327,FR -1410218328,1410218359,GB -1410218360,1410218367,FR -1410218368,1410218535,GB -1410218536,1410218543,FR -1410218544,1410218623,GB -1410218624,1410218639,FR -1410218640,1410219135,GB -1410219136,1410219191,FR -1410219192,1410220159,GB -1410220160,1410220191,FR -1410220192,1410220207,GB -1410220208,1410220223,FR -1410220224,1410220231,GB -1410220232,1410220287,FR -1410220288,1410220543,GB -1410220544,1410220607,FR -1410220608,1410221127,GB -1410221128,1410221167,FR -1410221168,1410221631,GB -1410221632,1410221655,FR -1410221656,1410223167,GB -1410223168,1410223175,FR -1410223176,1410223615,GB -1410223616,1410223871,FR -1410223872,1410226431,GB -1410226432,1410227155,FR -1410227156,1410227159,GB -1410227160,1410227751,FR -1410227752,1410227759,GB -1410227760,1410227967,FR -1410227968,1410228223,GB -1410228224,1410228479,FR -1410228480,1410228991,GB -1410228992,1410229247,FR -1410229248,1410229311,GB -1410229312,1410229327,FR -1410229328,1410229759,GB -1410229760,1410229887,FR -1410229888,1410230015,GB -1410230016,1410230023,FR -1410230024,1410230271,GB -1410230272,1410230335,FR -1410230336,1410230351,GB -1410230352,1410230383,FR -1410230384,1410230399,GB -1410230400,1410230607,FR -1410230608,1410230611,GB -1410230612,1410230623,FR -1410230624,1410230655,GB -1410230656,1410231039,FR -1410231040,1410231311,GB -1410231312,1410231319,FR -1410231320,1410231423,GB -1410231424,1410231807,FR -1410231808,1410232319,GB -1410232320,1410232351,FR -1410232352,1410232359,GB -1410232360,1410232407,FR -1410232408,1410232415,GB -1410232416,1410232575,FR -1410232576,1410232583,GB -1410232584,1410232703,FR -1410232704,1410232711,GB -1410232712,1410232735,FR -1410232736,1410232743,GB -1410232744,1410232831,FR -1410232832,1410233087,GB -1410233088,1410233215,FR -1410233216,1410233231,GB -1410233232,1410233495,FR -1410233496,1410233503,GB -1410233504,1410233567,FR -1410233568,1410233583,GB -1410233584,1410233855,FR -1410233856,1410233983,GB -1410233984,1410234035,FR -1410234036,1410234039,GB -1410234040,1410234111,FR -1410234112,1410234623,GB -1410234624,1410234655,FR -1410234656,1410234663,GB -1410234664,1410234687,FR -1410234688,1410234703,GB -1410234704,1410234927,FR -1410234928,1410234951,GB -1410234952,1410234967,FR -1410234968,1410235007,GB -1410235008,1410235103,FR -1410235104,1410235111,GB -1410235112,1410235119,FR -1410235120,1410235135,GB -1410235136,1410235231,FR -1410235232,1410235239,GB -1410235240,1410235263,FR -1410235264,1410235295,GB -1410235296,1410235391,FR -1410235392,1410235647,GB -1410235648,1410235695,FR -1410235696,1410235711,GB -1410235712,1410235863,FR -1410235864,1410235871,GB -1410235872,1410236063,FR -1410236064,1410236079,GB -1410236080,1410236111,FR -1410236112,1410236127,GB -1410236128,1410236159,FR -1410236160,1410236631,GB -1410236632,1410236639,FR -1410236640,1410236671,GB -1410236672,1410236711,FR -1410236712,1410236719,GB -1410236720,1410236727,FR -1410236728,1410236735,GB -1410236736,1410236855,FR -1410236856,1410236863,GB -1410236864,1410236895,FR -1410236896,1410236903,GB -1410236904,1410237183,FR -1410237184,1410237439,GB -1410237440,1410237775,FR -1410237776,1410237783,GB -1410237784,1410237863,FR -1410237864,1410237871,GB -1410237872,1410237951,FR -1410237952,1410238207,GB -1410238208,1410238247,FR -1410238248,1410238255,GB -1410238256,1410238311,FR -1410238312,1410238335,GB -1410238336,1410238463,FR -1410238464,1410238527,GB -1410238528,1410238559,FR -1410238560,1410238567,GB -1410238568,1410238591,FR -1410238592,1410238655,GB -1410238656,1410238695,FR -1410238696,1410238703,GB -1410238704,1410238775,FR -1410238776,1410238783,GB -1410238784,1410238975,FR -1410238976,1410239231,GB -1410239232,1410239599,FR -1410239600,1410239679,GB -1410239680,1410239719,FR -1410239720,1410239727,GB -1410239728,1410239751,FR -1410239752,1410239759,GB -1410239760,1410239775,FR -1410239776,1410239783,GB -1410239784,1410239831,FR -1410239832,1410239839,GB -1410239840,1410239847,FR -1410239848,1410239863,GB -1410239864,1410239935,FR -1410239936,1410239943,GB -1410239944,1410239951,FR -1410239952,1410239959,GB -1410239960,1410239975,FR -1410239976,1410239983,GB -1410239984,1410239999,FR -1410240000,1410240255,GB -1410240256,1410240287,FR -1410240288,1410240295,GB -1410240296,1410240319,FR -1410240320,1410240327,GB -1410240328,1410240367,FR -1410240368,1410240383,GB -1410240384,1410240423,FR -1410240424,1410240431,GB -1410240432,1410240455,FR -1410240456,1410240471,GB -1410240472,1410240487,FR -1410240488,1410240503,GB -1410240504,1410240511,FR -1410240512,1410240767,GB -1410240768,1410240775,FR -1410240776,1410240791,GB -1410240792,1410240807,FR -1410240808,1410240895,GB -1410240896,1410240927,FR -1410240928,1410240935,GB -1410240936,1410240943,FR -1410240944,1410240951,GB -1410240952,1410240967,FR -1410240968,1410240975,GB -1410240976,1410241015,FR -1410241016,1410241023,GB -1410241024,1410241095,FR -1410241096,1410241111,GB -1410241112,1410241119,FR -1410241120,1410241127,GB -1410241128,1410241151,FR -1410241152,1410241159,GB -1410241160,1410241167,FR -1410241168,1410241191,GB -1410241192,1410241199,FR -1410241200,1410241207,GB -1410241208,1410241255,FR -1410241256,1410241263,GB -1410241264,1410241279,FR -1410241280,1410241535,GB -1410241536,1410241551,FR -1410241552,1410241559,GB -1410241560,1410241575,FR -1410241576,1410241583,GB -1410241584,1410241655,FR -1410241656,1410241663,GB -1410241664,1410241671,FR -1410241672,1410241687,GB -1410241688,1410241695,FR -1410241696,1410241703,GB -1410241704,1410241711,FR -1410241712,1410241727,GB -1410241728,1410241735,FR -1410241736,1410241743,GB -1410241744,1410242047,FR -1410242048,1410242303,GB -1410242304,1410242311,FR -1410242312,1410242319,GB -1410242320,1410242327,FR -1410242328,1410242335,GB -1410242336,1410242383,FR -1410242384,1410242391,GB -1410242392,1410242423,FR -1410242424,1410242439,GB -1410242440,1410242463,FR -1410242464,1410242479,GB -1410242480,1410242559,FR -1410242560,1410242815,GB -1410242816,1410242887,FR -1410242888,1410242895,GB -1410242896,1410243479,FR -1410243480,1410243487,GB -1410243488,1410244143,FR -1410244144,1410244151,GB -1410244152,1410244207,FR -1410244208,1410244215,GB -1410244216,1410244287,FR -1410244288,1410244295,GB -1410244296,1410244383,FR -1410244384,1410244391,GB -1410244392,1410244423,FR -1410244424,1410244447,GB -1410244448,1410244463,FR -1410244464,1410244839,GB -1410244840,1410244847,FR -1410244848,1410244863,GB -1410244864,1410244879,FR -1410244880,1410244895,GB -1410244896,1410245023,FR -1410245024,1410245031,GB -1410245032,1410245039,FR -1410245040,1410245047,GB -1410245048,1410245087,FR -1410245088,1410245095,GB -1410245096,1410245119,FR -1410245120,1410245391,GB -1410245392,1410245495,FR -1410245496,1410245503,GB -1410245504,1410245535,FR -1410245536,1410245991,GB -1410245992,1410245999,FR -1410246000,1410246007,GB -1410246008,1410246023,FR -1410246024,1410246031,GB -1410246032,1410246039,FR -1410246040,1410246919,GB -1410246920,1410246927,FR -1410246928,1410246943,GB -1410246944,1410246959,FR -1410246960,1410246967,GB -1410246968,1410246983,FR -1410246984,1410246999,GB -1410247000,1410247007,FR -1410247008,1410247015,GB -1410247016,1410247023,FR -1410247024,1410247031,GB -1410247032,1410247039,FR -1410247040,1410247047,GB -1410247048,1410247071,FR -1410247072,1410247095,GB -1410247096,1410247103,FR -1410247104,1410247111,GB -1410247112,1410247143,FR -1410247144,1410247151,GB -1410247152,1410247159,FR -1410247160,1410247679,GB -1410247680,1410247727,FR -1410247728,1410247743,GB -1410247744,1410247751,FR -1410247752,1410247759,GB -1410247760,1410247767,FR -1410247768,1410247775,GB -1410247776,1410247935,FR -1410247936,1410248191,GB -1410248192,1410248223,FR -1410248224,1410248263,GB -1410248264,1410248295,FR -1410248296,1410248303,GB -1410248304,1410248343,FR -1410248344,1410248351,GB -1410248352,1410248359,FR -1410248360,1410248367,GB -1410248368,1410248375,FR -1410248376,1410248399,GB -1410248400,1410248423,FR -1410248424,1410248431,GB -1410248432,1410248623,FR -1410248624,1410248639,GB -1410248640,1410249215,FR -1410249216,1410249471,GB -1410249472,1410249503,FR -1410249504,1410249519,GB -1410249520,1410249543,FR -1410249544,1410249551,GB -1410249552,1410249559,FR -1410249560,1410249575,GB -1410249576,1410249583,FR -1410249584,1410249591,GB -1410249592,1410249607,FR -1410249608,1410249631,GB -1410249632,1410249647,FR -1410249648,1410249671,GB -1410249672,1410249679,FR -1410249680,1410249687,GB -1410249688,1410249727,FR -1410249728,1410249743,GB -1410249744,1410249751,FR -1410249752,1410249759,GB -1410249760,1410249767,FR -1410249768,1410249775,GB -1410249776,1410249879,FR -1410249880,1410249911,GB -1410249912,1410249983,FR -1410249984,1410250159,GB -1410250160,1410250167,FR -1410250168,1410250239,GB -1410250240,1410250255,FR -1410250256,1410250271,GB -1410250272,1410250367,FR -1410250368,1410250439,GB -1410250440,1410250535,FR -1410250536,1410250543,GB -1410250544,1410250567,FR -1410250568,1410250575,GB -1410250576,1410250583,FR -1410250584,1410250591,GB -1410250592,1410250631,FR -1410250632,1410250639,GB -1410250640,1410250655,FR -1410250656,1410250671,GB -1410250672,1410250679,FR -1410250680,1410250687,GB -1410250688,1410250695,FR -1410250696,1410250703,GB -1410250704,1410250727,FR -1410250728,1410250735,GB -1410250736,1410250743,FR -1410250744,1410252799,GB -1410252800,1410253055,FR -1410253056,1410253311,GB -1410253312,1410253639,FR -1410253640,1410253655,GB -1410253656,1410253775,FR -1410253776,1410253783,GB -1410253784,1410253807,FR -1410253808,1410253815,GB -1410253816,1410253823,FR -1410253824,1410254015,GB -1410254016,1410254079,FR -1410254080,1410254847,GB -1410254848,1410254871,FR -1410254872,1410254879,GB -1410254880,1410254887,FR -1410254888,1410254895,GB -1410254896,1410254991,FR -1410254992,1410254999,GB -1410255000,1410255007,FR -1410255008,1410255015,GB -1410255016,1410255031,FR -1410255032,1410255039,GB -1410255040,1410255047,FR -1410255048,1410255055,GB -1410255056,1410255079,FR -1410255080,1410255087,GB -1410255088,1410255103,FR -1410255104,1410255111,GB -1410255112,1410255119,FR -1410255120,1410255135,GB -1410255136,1410255151,FR -1410255152,1410255167,GB -1410255168,1410255231,FR -1410255232,1410255239,GB -1410255240,1410255271,FR -1410255272,1410255279,GB -1410255280,1410255655,FR -1410255656,1410255663,GB -1410255664,1410255711,FR -1410255712,1410255743,GB -1410255744,1410255871,FR -1410255872,1410255879,GB -1410255880,1410255927,FR -1410255928,1410255935,GB -1410255936,1410255943,FR -1410255944,1410255951,GB -1410255952,1410255983,FR -1410255984,1410255991,GB -1410255992,1410256063,FR -1410256064,1410256127,GB -1410256128,1410256247,FR -1410256248,1410256255,GB -1410256256,1410256319,FR -1410256320,1410256327,GB -1410256328,1410256375,FR -1410256376,1410256639,GB -1410256640,1410256703,FR -1410256704,1410256711,GB -1410256712,1410256831,FR -1410256832,1410256839,GB -1410256840,1410256855,FR -1410256856,1410256863,GB -1410256864,1410256895,FR -1410256896,1410257151,GB -1410257152,1410257239,FR -1410257240,1410257247,GB -1410257248,1410257487,FR -1410257488,1410257495,GB -1410257496,1410257639,FR -1410257640,1410257647,GB -1410257648,1410257703,FR -1410257704,1410257711,GB -1410257712,1410257743,FR -1410257744,1410257791,GB -1410257792,1410257855,FR -1410257856,1410258311,GB -1410258312,1410258319,FR -1410258320,1410258551,GB -1410258552,1410258559,FR -1410258560,1410258583,GB -1410258584,1410258623,FR -1410258624,1410259455,GB -1410259456,1410259519,FR -1410259520,1410259527,GB -1410259528,1410259551,FR -1410259552,1410259567,GB -1410259568,1410259631,FR -1410259632,1410259647,GB -1410259648,1410259687,FR -1410259688,1410259695,GB -1410259696,1410259703,FR -1410259704,1410259711,GB -1410259712,1410259775,FR -1410259776,1410259783,GB -1410259784,1410259799,FR -1410259800,1410259919,GB -1410259920,1410259927,FR -1410259928,1410259935,GB -1410259936,1410259943,FR -1410259944,1410259967,GB -1410259968,1410259975,FR -1410259976,1410260015,GB -1410260016,1410260023,FR -1410260024,1410260199,GB -1410260200,1410260215,FR -1410260216,1410260287,GB -1410260288,1410260315,FR -1410260316,1410260799,GB -1410260800,1410260831,FR -1410260832,1410260839,GB -1410260840,1410260855,FR -1410260856,1410260895,GB -1410260896,1410260903,FR -1410260904,1410260975,GB -1410260976,1410260991,FR -1410260992,1410261007,GB -1410261008,1410261023,FR -1410261024,1410261055,GB -1410261056,1410261063,FR -1410261064,1410261127,GB -1410261128,1410261135,FR -1410261136,1410261175,GB -1410261176,1410261215,FR -1410261216,1410261551,GB -1410261552,1410261559,FR -1410261560,1410261567,GB -1410261568,1410261631,FR -1410261632,1410261655,GB -1410261656,1410261663,FR -1410261664,1410261679,GB -1410261680,1410261695,FR -1410261696,1410261719,GB -1410261720,1410261727,FR -1410261728,1410261767,GB -1410261768,1410261775,FR -1410261776,1410261791,GB -1410261792,1410261807,FR -1410261808,1410261831,GB -1410261832,1410261839,FR -1410261840,1410261847,GB -1410261848,1410261855,FR -1410261856,1410261879,GB -1410261880,1410261887,FR -1410261888,1410261959,GB -1410261960,1410261967,FR -1410261968,1410261975,GB -1410261976,1410261991,FR -1410261992,1410262007,GB -1410262008,1410262015,FR -1410262016,1410268159,GB -1410268160,1410268223,FR -1410268224,1410268463,GB -1410268464,1410268471,FR -1410268472,1410268607,GB -1410268608,1410268639,FR -1410268640,1410268671,GB -1410268672,1410268687,FR -1410268688,1410268695,GB -1410268696,1410268719,FR -1410268720,1410268767,GB -1410268768,1410268783,FR -1410268784,1410268799,GB -1410268800,1410268863,FR -1410268864,1410268879,GB -1410268880,1410268887,FR -1410268888,1410268911,GB -1410268912,1410268927,FR -1410268928,1410269183,GB +1410214504,1410221663,FR +1410221664,1410221671,GB +1410221672,1410250551,FR +1410250552,1410250559,GB +1410250560,1410255895,FR +1410255896,1410255911,CH +1410255912,1410261007,FR +1410261008,1410261015,GB +1410261016,1410262799,FR +1410262800,1410262815,DE +1410262816,1410267039,FR +1410267040,1410267055,ES +1410267056,1410267071,GB +1410267072,1410267087,IT +1410267088,1410269183,FR 1410269184,1410318335,LT 1410318336,1410319359,LV 1410319360,1410334719,LT @@ -19430,15 +34710,20 @@ 1410342912,1410351103,SK 1410351104,1410353039,CH 1410353040,1410353047,NI -1410353048,1410359295,CH +1410353048,1410353143,CH +1410353144,1410353151,NI +1410353152,1410354175,CH +1410354176,1410354431,FR +1410354432,1410359295,CH 1410359296,1410367487,CZ 1410367488,1410375679,RU -1410375680,1410383871,DK +1410375680,1410375935,DK +1410375936,1410376191,CH +1410376192,1410383871,DK 1410383872,1410392063,NO 1410392064,1410397183,DE 1410397184,1410397439,PL -1410397440,1410397695,GB -1410397696,1410399487,DE +1410397440,1410399487,DE 1410399488,1410399743,TR 1410399744,1410400063,DE 1410400064,1410400127,TR @@ -19454,44 +34739,65 @@ 1410465792,1410473983,ES 1410473984,1410490367,JO 1410490368,1410498559,RU -1410498560,1410506751,IT +1410498560,1410502803,IT +1410502804,1410502807,US +1410502808,1410506751,IT 1410506752,1410514943,IE 1410514944,1410523135,GB 1410523136,1410531327,PT 1410531328,1410539519,DE 1410539520,1410542591,GB 1410542592,1410543103,IE -1410543104,1410547711,GB +1410543104,1410544415,GB +1410544416,1410544431,DE +1410544432,1410544447,FR +1410544448,1410547711,GB 1410547712,1410555903,CZ 1410555904,1410564095,GB 1410564096,1410572287,SE -1410572288,1410573439,DE -1410573440,1410573567,CH -1410573568,1410574727,DE -1410574728,1410574735,UA -1410574736,1410575111,DE +1410572288,1410572863,DE +1410572864,1410572895,RU +1410572896,1410573407,DE +1410573408,1410573439,RU +1410573440,1410573695,DE +1410573696,1410573711,RU +1410573712,1410573815,DE +1410573816,1410573823,RU +1410573824,1410574559,DE +1410574560,1410574575,RU +1410574576,1410574583,DE +1410574584,1410574591,RU +1410574592,1410574719,DE +1410574720,1410574727,RU +1410574728,1410574847,DE +1410574848,1410575103,GB +1410575104,1410575111,US 1410575112,1410575119,IT -1410575120,1410575295,DE +1410575120,1410575135,DE +1410575136,1410575167,RU +1410575168,1410575231,DE +1410575232,1410575263,CH +1410575264,1410575279,DE +1410575280,1410575295,IL 1410575296,1410575327,IT 1410575328,1410575359,SI 1410575360,1410575551,DE 1410575552,1410575615,IT 1410575616,1410575775,DE 1410575776,1410575791,RU -1410575792,1410575823,DE +1410575792,1410575807,DE +1410575808,1410575823,IL 1410575824,1410575839,BG 1410575840,1410575855,IT 1410575856,1410575871,DE -1410575872,1410575999,IE +1410575872,1410575999,DK 1410576000,1410576063,DE 1410576064,1410576127,IT -1410576128,1410576255,IE +1410576128,1410576255,DE 1410576256,1410576383,IT 1410576384,1410588671,DE 1410588672,1410596863,GB -1410596864,1410597839,ES -1410597840,1410597855,FR -1410597856,1410605055,ES +1410596864,1410605055,ES 1410605056,1410613247,CH 1410613248,1410621439,AL 1410621440,1410629631,NO @@ -19508,38 +34814,66 @@ 1410711552,1410719743,BG 1410719744,1410727935,RU 1410727936,1410736127,BG -1410736128,1410744319,CS -1410744320,1410745223,FR +1410736128,1410744319,RS +1410744320,1410744575,FR +1410744576,1410744831,A2 +1410744832,1410745223,FR 1410745224,1410745231,AE 1410745232,1410745247,FR 1410745248,1410745279,US -1410745280,1410752511,FR -1410752512,1410754559,US -1410754560,1410754815,DE -1410754816,1410755071,US -1410755072,1410755327,RO -1410755328,1410755583,DE -1410755584,1410755839,US -1410755840,1410756095,DE -1410756096,1410756608,US -1410756609,1410756863,NL -1410756864,1410757119,US -1410757120,1410758655,NL -1410758656,1410759679,DE -1410759680,1410760191,US -1410760192,1410760447,DE -1410760448,1410760691,US -1410760692,1410760695,DE -1410760696,1410760703,US +1410745280,1410745855,FR +1410745856,1410746111,CH +1410746112,1410746623,AO +1410746624,1410748415,A2 +1410748416,1410752511,DE +1410752512,1410752639,AQ +1410752640,1410752763,DE +1410752764,1410752785,AQ +1410752786,1410752799,DE +1410752800,1410752827,AQ +1410752828,1410753023,DE +1410753024,1410753151,AQ +1410753152,1410753303,DE +1410753304,1410753327,AQ +1410753328,1410753335,DE +1410753336,1410753343,AQ +1410753344,1410753351,DE +1410753352,1410753367,AQ +1410753368,1410753391,DE +1410753392,1410754831,AQ +1410754832,1410754855,DE +1410754856,1410754859,AQ +1410754860,1410754867,DE +1410754868,1410754871,AQ +1410754872,1410755063,DE +1410755064,1410755067,AQ +1410755068,1410755071,DE +1410755072,1410755327,AQ +1410755328,1410756607,DE +1410756608,1410756735,AQ +1410756736,1410756863,DE +1410756864,1410757119,AQ +1410757120,1410758655,DE +1410758656,1410760191,AQ +1410760192,1410760455,DE +1410760456,1410760479,AQ +1410760480,1410760487,DE +1410760488,1410760503,AQ +1410760504,1410760683,DE +1410760684,1410760687,AQ +1410760688,1410760699,DE +1410760700,1410760703,AQ 1410760704,1410768895,RU 1410768896,1410777087,GB 1410777088,1410785279,RU 1410785280,1410793471,SA 1410793472,1410801663,GB -1410801664,1410818047,RU +1410801664,1410809855,RU +1410809856,1410818047,DE 1410818048,1410826239,SA 1410826240,1410834431,SE 1410834432,1410842623,PL +1410842624,1410850815,PT 1410850816,1410859007,DE 1410859008,1411383295,NL 1411383296,1411448831,LT @@ -19560,10 +34894,25 @@ 1411465472,1411465727,US 1411465728,1411481855,IT 1411481856,1411483903,DE -1411483904,1411514367,IT +1411483904,1411500799,IT +1411500800,1411501055,DE +1411501056,1411505407,IT +1411505408,1411505663,US +1411505664,1411514367,IT 1411514368,1411579903,FI 1411579904,1411645439,NL -1411710976,1411776511,FR +1411645440,1411710975,EG +1411710976,1411717127,FR +1411717128,1411717135,A2 +1411717136,1411717183,FR +1411717184,1411717191,A2 +1411717192,1411717367,FR +1411717368,1411717375,A2 +1411717376,1411736663,FR +1411736664,1411736671,A2 +1411736672,1411737079,FR +1411737080,1411737087,A2 +1411737088,1411776511,FR 1411776512,1411780607,GR 1411780608,1411784703,PL 1411784704,1411788799,GB @@ -19574,21 +34923,119 @@ 1411809280,1411813375,LV 1411813376,1411817471,NO 1411817472,1411821567,PL -1411821568,1411825663,CZ +1411821568,1411825663,RU 1411825664,1411829759,DE 1411829760,1411833855,PL 1411833856,1411837951,NL 1411837952,1411842047,BG 1411842048,1411907583,PT -1411908096,1411908351,GB +1411907584,1411907839,EU +1411907840,1411908351,GB +1411908352,1411908399,EU +1411908400,1411908479,GB +1411908480,1411908535,EU +1411908536,1411908559,GB +1411908560,1411908563,AU +1411908564,1411908607,EU +1411908608,1411909375,GB +1411909376,1411909631,EU +1411909632,1411909759,GB +1411909760,1411909887,EU +1411909888,1411910143,GB +1411910144,1411910399,EU +1411910400,1411910655,GB +1411910656,1411910911,EU +1411910912,1411911167,GB +1411911168,1411911423,EU +1411911424,1411911439,GB +1411911440,1411911615,EU +1411911616,1411911647,GB +1411911648,1411911679,EU 1411911680,1411915775,US +1411915776,1411915839,GB +1411915840,1411915903,EU +1411915904,1411915911,GB +1411915912,1411915935,EU +1411915936,1411915967,GB +1411915968,1411916031,EU +1411916032,1411916095,GB +1411916096,1411916295,EU +1411916296,1411916303,GB +1411916304,1411916799,EU +1411916800,1411916863,GB +1411916864,1411917567,EU +1411917568,1411917639,GB +1411917640,1411917663,EU +1411917664,1411917695,GB +1411917696,1411917759,EU +1411917760,1411917791,GB +1411917792,1411919871,EU 1411919872,1411923967,DE +1411923968,1411940351,BG 1411940352,1411973119,PL -1411973120,1412001791,SI -1412001792,1412002815,RO -1412002816,1412003839,BA -1412003840,1412004863,BG -1412004864,1412005887,SI +1411973120,1411999767,SI +1411999768,1411999783,BA +1411999784,1411999791,SI +1411999792,1411999799,BA +1411999800,1411999807,SI +1411999808,1411999823,BA +1411999824,1411999831,SI +1411999832,1411999839,BA +1411999840,1411999871,SI +1411999872,1412000767,BA +1412000768,1412000783,SI +1412000784,1412000791,BA +1412000792,1412000863,SI +1412000864,1412000879,BA +1412000880,1412000895,SI +1412000896,1412000911,BA +1412000912,1412000959,SI +1412000960,1412001023,BA +1412001024,1412001311,SI +1412001312,1412001319,DE +1412001320,1412001807,SI +1412001808,1412001855,RO +1412001856,1412001919,SI +1412001920,1412002303,RO +1412002304,1412002559,SI +1412002560,1412002783,MK +1412002784,1412002815,SI +1412002816,1412002847,BA +1412002848,1412002863,SI +1412002864,1412002911,BA +1412002912,1412002919,SI +1412002920,1412003007,BA +1412003008,1412003023,SI +1412003024,1412003039,BA +1412003040,1412003055,SI +1412003056,1412003119,BA +1412003120,1412003135,SI +1412003136,1412003143,BA +1412003144,1412003167,SI +1412003168,1412003215,BA +1412003216,1412003223,SI +1412003224,1412003231,BA +1412003232,1412003247,SI +1412003248,1412003263,BA +1412003264,1412003271,SI +1412003272,1412003303,BA +1412003304,1412003359,SI +1412003360,1412003375,BA +1412003376,1412003383,SI +1412003384,1412003391,BA +1412003392,1412003399,HR +1412003400,1412003407,BA +1412003408,1412003423,SI +1412003424,1412003527,BA +1412003528,1412003535,SI +1412003536,1412003551,BA +1412003552,1412003583,SI +1412003584,1412003839,BA +1412003840,1412003855,SI +1412003856,1412003903,BG +1412003904,1412003935,SI +1412003936,1412004607,BG +1412004608,1412005887,SI 1412005888,1412038655,NL 1412038656,1412071423,RU 1412071424,1412104191,CZ @@ -19596,32 +35043,37 @@ 1412136960,1412169727,BG 1412169728,1412202495,TR 1412202496,1412235263,DE -1412235264,1412237567,GB -1412237568,1412237823,US -1412237824,1412250271,GB -1412250272,1412250303,US -1412250304,1412300799,GB +1412235264,1412241111,GB +1412241112,1412241119,NL +1412241120,1412254719,GB +1412254720,1412254975,NL +1412254976,1412257535,GB +1412257536,1412257599,NL +1412257600,1412258559,GB +1412258560,1412258815,DE +1412258816,1412300799,GB 1412300800,1412333567,DE 1412333568,1412366335,LT 1412366336,1412399103,SK 1412399104,1412415487,RU -1412415488,1412415743,IR -1412415744,1412415999,AE -1412416000,1412431871,IR +1412415488,1412416511,AE +1412416512,1412420351,IR +1412420352,1412420607,AE +1412420608,1412431871,IR 1412431872,1412562943,NO 1412562944,1412628479,EE 1412628480,1412641791,TR 1412641792,1412642815,DE 1412642816,1412644863,TR -1412644864,1412661247,RU +1412644864,1412653055,UA +1412653056,1412661247,RU 1412661248,1412677631,GB 1412677632,1412685823,RU -1412685824,1412686290,IE -1412686291,1412686335,CA -1412686336,1412686847,GB -1412686848,1412689151,IE -1412689152,1412689407,GB -1412689408,1412690191,IE +1412685824,1412686239,IE +1412686240,1412686335,BB +1412686336,1412686591,IE +1412686592,1412686847,GB +1412686848,1412690191,IE 1412690192,1412690199,GB 1412690200,1412694015,IE 1412694016,1412710399,EE @@ -19629,8 +35081,13 @@ 1412726784,1412743167,SI 1412743168,1412775935,NO 1412775936,1412792319,NL -1412792320,1412798463,US -1412800512,1412804607,US +1412792320,1412793343,US +1412793344,1412793855,EU +1412793856,1412804607,US +1412804608,1412804863,EU +1412804864,1412805631,US +1412805632,1412806143,EU +1412806144,1412808703,US 1412808704,1412825087,RU 1412825088,1412830463,IQ 1412830464,1412833279,LB @@ -19659,10 +35116,23 @@ 1417150464,1417674751,ES 1417674752,1421869055,DE 1421869056,1422393343,BE -1422393344,1422393599,IT -1422393600,1422399743,DE -1422399744,1422399999,IT -1422400000,1422491647,DE +1422393344,1422393599,DE +1422393600,1422393855,IT +1422393856,1422399103,DE +1422399104,1422399231,IT +1422399232,1422399999,DE +1422400000,1422400255,IT +1422400256,1422400511,DE +1422400512,1422400767,BR +1422400768,1422401087,DE +1422401088,1422401151,GB +1422401152,1422462207,DE +1422462208,1422462463,TR +1422462464,1422468671,DE +1422468672,1422468735,IT +1422468736,1422479615,DE +1422479616,1422479871,BE +1422479872,1422491647,DE 1422491648,1422508031,GB 1422508032,1422512127,BG 1422512128,1422516223,PL @@ -19673,27 +35143,29 @@ 1422655488,1422721023,RU 1422721024,1422729215,PL 1422729216,1422737407,NO +1422737408,1422745599,EU 1422745600,1422753791,EG 1422753792,1422761983,FR 1422761984,1422770175,PL 1422770176,1422786559,GR 1422786560,1422852095,HU 1422852096,1422853119,FR -1422853120,1422853631,DE +1422853120,1422853631,EU 1422853632,1422853919,FR -1422853920,1422854143,DE +1422853920,1422854143,EU 1422854144,1422854151,FR -1422854152,1422856319,DE +1422854152,1422856319,EU 1422856320,1422856575,FR -1422856576,1422856703,DE -1422856704,1422857471,FR -1422857472,1422857727,DE -1422857728,1422857855,FR -1422857856,1422857919,DE +1422856576,1422856703,EU +1422856704,1422857855,FR +1422857856,1422857919,EU 1422857920,1422858143,FR -1422858144,1422858239,DE +1422858144,1422858239,EU 1422858240,1422858623,FR -1422858624,1422917631,DE +1422858624,1422909439,EU +1422909440,1422909695,NL +1422909696,1422917375,EU +1422917376,1422917631,GB 1422917632,1423441919,NO 1423441920,1423704063,SE 1423704064,1423966207,IT @@ -19703,19 +35175,31 @@ 1424359424,1424490495,FI 1424490496,1424523263,ES 1424523264,1424556031,RO -1424588800,1424589311,DE +1424556032,1424588799,EG +1424588800,1424588839,DE +1424588840,1424588847,GB +1424588848,1424588959,DE +1424588960,1424588963,IT +1424588964,1424589311,DE 1424589312,1424589567,FR 1424589568,1424590719,GB -1424590720,1424590727,SE -1424590728,1424590735,GB -1424590736,1424591423,SE -1424591424,1424591447,GB -1424591448,1424591551,SE +1424590720,1424590767,SE +1424590768,1424590771,GB +1424590772,1424590783,SE +1424590784,1424590847,CH +1424590848,1424591406,SE +1424591407,1424591407,GB +1424591408,1424591423,SE +1424591424,1424591439,GB +1424591440,1424591463,SE +1424591464,1424591471,GB +1424591472,1424591551,SE 1424591552,1424591615,CZ -1424591616,1424591743,GB -1424591744,1424591871,MT +1424591616,1424591839,GB +1424591840,1424591871,ZA 1424591872,1424592639,GB -1424592640,1424593407,FR +1424592640,1424593151,FR +1424593152,1424593407,NL 1424593408,1424593663,DE 1424593664,1424593727,SK 1424593728,1424593791,HU @@ -19724,31 +35208,48 @@ 1424593968,1424593983,GB 1424593984,1424594055,FR 1424594056,1424594063,IT -1424594064,1424594175,FR -1424594176,1424595175,GB -1424595176,1424595179,FR -1424595180,1424595455,GB -1424595456,1424595743,IT -1424595744,1424595751,GB -1424595752,1424595839,IT -1424595840,1424595871,GB -1424595872,1424596479,IT -1424596480,1424596991,FR -1424596992,1424597503,CZ +1424594064,1424594103,FR +1424594104,1424594111,GB +1424594112,1424594175,FR +1424594176,1424594431,GB +1424594432,1424594495,IE +1424594496,1424595455,GB +1424595456,1424595527,IT +1424595528,1424595535,GB +1424595536,1424595551,IT +1424595552,1424595559,GB +1424595560,1424595575,IT +1424595576,1424595583,ES +1424595584,1424595807,IT +1424595808,1424595839,GB +1424595840,1424596479,IT +1424596480,1424596563,FR +1424596564,1424596567,GB +1424596568,1424596991,FR +1424596992,1424597255,CZ +1424597256,1424597263,GB +1424597264,1424597311,CZ +1424597312,1424597343,GB +1424597344,1424597351,CH +1424597352,1424597503,GB 1424597504,1424597759,FR 1424597760,1424598015,IT 1424598016,1424599039,GB -1424599040,1424599247,DK -1424599248,1424599263,GB -1424599264,1424599279,DK +1424599040,1424599279,DK 1424599280,1424599295,GB 1424599296,1424599551,DK -1424599552,1424599855,HU +1424599552,1424599839,HU +1424599840,1424599847,GB +1424599848,1424599855,HU 1424599856,1424599871,GB 1424599872,1424599875,HU 1424599876,1424599879,GB -1424599880,1424599935,HU -1424599936,1424600063,GB +1424599880,1424599887,HU +1424599888,1424599903,GB +1424599904,1424599951,HU +1424599952,1424599999,GB +1424600000,1424600031,HU +1424600032,1424600063,GB 1424600064,1424600319,CH 1424600320,1424600575,GB 1424600576,1424600831,FR @@ -19758,26 +35259,39 @@ 1424601600,1424601855,CH 1424601856,1424602111,GB 1424602112,1424602623,DE -1424602624,1424602911,GB +1424602624,1424602879,GB +1424602880,1424602911,US 1424602912,1424602927,FR -1424602928,1424603055,US +1424602928,1424603007,US +1424603008,1424603023,GB +1424603024,1424603055,US 1424603056,1424603063,NL -1424603064,1424603071,GB -1424603072,1424603087,US -1424603088,1424603135,GB +1424603064,1424603087,US +1424603088,1424603095,GB +1424603096,1424603135,US 1424603136,1424603391,SK 1424603392,1424603647,DE 1424603648,1424603903,GB -1424603904,1424604159,ES +1424603904,1424604067,ES +1424604068,1424604095,GB +1424604096,1424604159,ES 1424604160,1424604543,NL 1424604544,1424604671,GB -1424604672,1424605183,NL +1424604672,1424604799,NL +1424604800,1424604927,GB +1424604928,1424605119,NL +1424605120,1424605135,GB +1424605136,1424605183,NL 1424605184,1424605439,GB -1424605440,1424605583,BG -1424605584,1424605631,GB +1424605440,1424605567,BG +1424605568,1424605607,GB +1424605608,1424605623,BG +1424605624,1424605631,GB 1424605632,1424605695,BG 1424605696,1424605951,NL -1424605952,1424606199,GB +1424605952,1424605959,CH +1424605960,1424606023,AT +1424606024,1424606199,GB 1424606200,1424606207,AT 1424606208,1424606455,GB 1424606456,1424606463,AT @@ -19785,87 +35299,120 @@ 1424606712,1424606719,AT 1424606720,1424606967,GB 1424606968,1424606975,AT -1424606976,1424607103,GB -1424607104,1424607119,SK -1424607120,1424607135,GB -1424607136,1424607199,SK +1424606976,1424607167,GB +1424607168,1424607199,SK 1424607200,1424607215,GB -1424607216,1424607231,SK -1424607232,1424607487,GB -1424607488,1424607839,DE -1424607840,1424607855,GB -1424607856,1424607871,DE +1424607216,1424607223,SK +1424607224,1424607487,GB +1424607488,1424607871,DE 1424607872,1424608031,GB -1424608032,1424608127,FR -1424608128,1424608255,GB -1424608256,1424608511,FR -1424608512,1424609023,ES -1424609024,1424609279,DE +1424608032,1424608083,FR +1424608084,1424608087,GB +1424608088,1424608127,FR +1424608128,1424608279,GB +1424608280,1424608383,FR +1424608384,1424608399,ES +1424608400,1424608511,FR +1424608512,1424608567,ES +1424608568,1424608671,GB +1424608672,1424608687,ES +1424608688,1424608695,GB +1424608696,1424608743,ES +1424608744,1424608751,GB +1424608752,1424609023,ES +1424609024,1424609259,DE +1424609260,1424609271,GB +1424609272,1424609279,DE 1424609280,1424609395,CH 1424609396,1424609399,GB -1424609400,1424609791,CH +1424609400,1424609543,CH +1424609544,1424609551,GB +1424609552,1424609791,CH 1424609792,1424610303,GB 1424610304,1424610559,TZ -1424610560,1424610631,PL -1424610632,1424610639,GB -1424610640,1424610655,PL -1424610656,1424610687,GB -1424610688,1424610815,PL +1424610560,1424610815,PL 1424610816,1424611071,FR -1424611072,1424611327,BE +1424611072,1424611087,BE +1424611088,1424611103,GB +1424611104,1424611143,BE +1424611144,1424611151,GB +1424611152,1424611327,BE 1424611328,1424611583,PL 1424611584,1424612095,GB -1424612096,1424612223,CZ -1424612224,1424612607,GB +1424612096,1424612231,CZ +1424612232,1424612239,CH +1424612240,1424612319,CZ +1424612320,1424612607,GB 1424612608,1424612671,AE 1424612672,1424612863,GB 1424612864,1424613119,FR 1424613120,1424613375,GB 1424613376,1424613631,ES -1424613632,1424614143,IT +1424613632,1424614127,IT +1424614128,1424614135,GB +1424614136,1424614143,IT 1424614144,1424614399,GB 1424614400,1424614415,FR 1424614416,1424614655,IT 1424614656,1424614911,FR 1424614912,1424615167,RO -1424615168,1424615423,GB -1424615424,1424615935,IT +1424615168,1424615679,GB +1424615680,1424615803,IT +1424615804,1424615807,GB +1424615808,1424615935,IT 1424615936,1424616191,FR 1424616192,1424616447,IT -1424616448,1424616495,ES -1424616496,1424616511,IT -1424616512,1424616639,ES -1424616640,1424616655,GB -1424616656,1424616703,ES +1424616448,1424616483,ES +1424616484,1424616487,GB +1424616488,1424616607,ES +1424616608,1424616615,PT +1424616616,1424616623,GB +1424616624,1424616655,ES +1424616656,1424616659,GB +1424616660,1424616695,ES +1424616696,1424616703,GB 1424616704,1424616959,US 1424616960,1424617215,FR -1424617216,1424617395,IT +1424617216,1424617351,IT +1424617352,1424617391,GB +1424617392,1424617395,IT 1424617396,1424617399,GB 1424617400,1424617407,IT 1424617408,1424617423,ES -1424617424,1424617431,IT -1424617432,1424617439,GB -1424617440,1424617471,IT +1424617424,1424617431,GB +1424617432,1424617439,ES +1424617440,1424617463,IT +1424617464,1424617471,GB 1424617472,1424617727,US -1424617728,1424618239,IT -1424618240,1424618367,NL -1424618368,1424618751,GB -1424618752,1424619007,FR +1424617728,1424617983,IT +1424617984,1424618015,GB +1424618016,1424618239,IT +1424618240,1424618495,NL +1424618496,1424618751,GB +1424618752,1424618983,FR +1424618984,1424618991,GB +1424618992,1424619007,FR 1424619008,1424619775,IT -1424619776,1424619811,BE -1424619812,1424619815,GB -1424619816,1424620031,BE +1424619776,1424619807,BE +1424619808,1424619815,GB +1424619816,1424619823,BE +1424619824,1424619839,GB +1424619840,1424619915,BE +1424619916,1424619919,GB +1424619920,1424620031,BE 1424620032,1424621055,GB 1424621056,1424621567,IT 1424621568,1424625663,PL 1424625664,1424629759,GB -1424629760,1424637951,PL +1424629760,1424633855,PL +1424633856,1424637951,MD 1424637952,1424642047,FI 1424642048,1424646143,DK -1424646144,1424650239,RO 1424650240,1424654335,PL 1424654336,1424687103,NO -1424687104,1424719871,SA +1424687104,1424711679,SA +1424711680,1424713727,BH +1424713728,1424719871,SA 1424719872,1424722431,IE 1424722432,1424723199,CZ 1424723200,1424724735,DE @@ -19889,7 +35436,9 @@ 1424737152,1424737279,GB 1424737280,1424737407,DK 1424737408,1424737535,AT -1424737536,1424738815,DE +1424737536,1424737671,DE +1424737672,1424737751,GB +1424737752,1424738815,DE 1424738816,1424739583,SE 1424739584,1424739839,GB 1424739840,1424740511,DE @@ -19917,7 +35466,7 @@ 1424752128,1424752383,DE 1424752384,1424752639,NL 1424752640,1424785407,HU -1424785408,1424818175,NO +1424785408,1424818175,ES 1424818176,1424850943,RU 1424850944,1424883711,LV 1424883712,1424916479,DK @@ -19939,8 +35488,7 @@ 1425227776,1425244159,RO 1425244160,1425260543,NO 1425260544,1425276927,NL -1425276928,1425287167,SE -1425287168,1425293311,DE +1425276928,1425293311,RU 1425293312,1425309695,CZ 1425309696,1425326079,NL 1425326080,1425342463,SE @@ -19949,7 +35497,8 @@ 1425375232,1425391615,DE 1425391616,1425407999,LV 1425408000,1425424383,NL -1425424384,1425424639,DE +1425424384,1425424543,A2 +1425424544,1425424639,DE 1425424640,1425424895,IR 1425424896,1425425151,NE 1425425152,1425425663,DE @@ -19962,26 +35511,39 @@ 1425426432,1425428479,KW 1425428480,1425430527,GB 1425430528,1425432575,SE -1425432576,1425434623,GB +1425432576,1425434623,IT 1425434624,1425436671,FR 1425436672,1425438719,GB -1425438720,1425439711,DE +1425438720,1425439271,DE +1425439272,1425439279,CZ +1425439280,1425439535,DE +1425439536,1425439543,CZ +1425439544,1425439711,DE 1425439712,1425439727,CZ -1425439728,1425439743,HK -1425439744,1425440767,DE +1425439728,1425440767,DE 1425440768,1425442815,SE 1425442816,1425444863,GB -1425444864,1425445139,IT +1425444864,1425445126,IT +1425445127,1425445127,FR +1425445128,1425445139,IT 1425445140,1425445141,GB 1425445142,1425446911,IT 1425446912,1425448959,GB -1425448960,1425451007,NL -1425451008,1425458271,GB +1425448960,1425451007,CZ +1425451008,1425457855,GB +1425457856,1425457919,US +1425457920,1425458271,GB 1425458272,1425458303,US -1425458304,1425461247,GB +1425458304,1425459199,GB +1425459200,1425460735,IM +1425460736,1425460767,GB +1425460768,1425460863,IM +1425460864,1425460927,GB +1425460928,1425460991,IM +1425460992,1425461119,GB +1425461120,1425461247,IM 1425461248,1425463295,ES -1425463296,1425465343,BE -1425465344,1425467135,FR +1425463296,1425467135,FR 1425467136,1425467391,ES 1425467392,1425469439,CH 1425469440,1425471487,DK @@ -20003,125 +35565,162 @@ 1425965056,1425965100,ES 1425965101,1425965112,FR 1425965113,1425965116,ZA -1425965117,1425965120,FR -1425965121,1425965503,IT +1425965117,1425965120,A2 +1425965121,1425965182,IT +1425965183,1425965183,A2 +1425965184,1425965503,IT 1425965504,1425965567,FR -1425965568,1425965568,IT +1425965568,1425965568,A2 1425965569,1425965572,NG 1425965573,1425965576,US 1425965577,1425965580,FR 1425965581,1425965584,BJ 1425965585,1425965588,ES -1425965589,1425965592,IT +1425965589,1425965592,A2 1425965593,1425965631,FR -1425965632,1425965952,IT -1425965953,1425965992,ZA -1425965993,1425966015,IT -1425966016,1425966079,ZA -1425966080,1425966080,IT +1425965632,1425966080,A2 1425966081,1425966088,DE -1425966089,1425966104,IT +1425966089,1425966104,A2 1425966105,1425966128,DE -1425966129,1425966144,IT +1425966129,1425966144,A2 1425966145,1425966152,DE -1425966153,1425966208,IT +1425966153,1425966208,A2 1425966209,1425966224,DE -1425966225,1425966271,IT +1425966225,1425966239,A2 +1425966240,1425966271,IT 1425966272,1425966335,DE -1425966336,1425966592,IT -1425966593,1425966608,FR -1425966609,1425966720,IT +1425966336,1425966463,A2 +1425966464,1425966527,IT +1425966528,1425966608,A2 +1425966609,1425966624,IT +1425966625,1425966655,A2 +1425966656,1425966719,IT +1425966720,1425966720,A2 1425966721,1425966728,BJ -1425966729,1425966735,IT +1425966729,1425966735,A2 1425966736,1425966751,BJ -1425966752,1425966784,IT +1425966752,1425966784,A2 1425966785,1425966808,BJ -1425966809,1425966815,IT +1425966809,1425966815,A2 1425966816,1425966847,BJ -1425966848,1425966852,IT +1425966848,1425966852,A2 1425966853,1425966896,DE -1425966897,1425966911,IT +1425966897,1425966911,A2 1425966912,1425966975,DE 1425966976,1425967039,IT 1425967040,1425967103,DE -1425967104,1425967104,IT +1425967104,1425967104,A2 1425967105,1425967120,TR -1425967121,1425967876,IT +1425967121,1425967359,IT +1425967360,1425967743,A2 +1425967744,1425967807,IT +1425967808,1425967876,A2 1425967877,1425967892,DE -1425967893,1425967896,IT +1425967893,1425967896,A2 1425967897,1425967904,DE -1425967905,1425967912,IT +1425967905,1425967912,A2 1425967913,1425967924,DE -1425967925,1425967928,IT +1425967925,1425967928,A2 1425967929,1425967940,DE -1425967941,1425967999,IT +1425967941,1425967967,A2 +1425967968,1425967999,IT 1425968000,1425968127,DE -1425968128,1425968639,DZ -1425968640,1425969663,IT +1425968128,1425968383,A2 +1425968384,1425968638,GB +1425968639,1425968703,A2 +1425968704,1425968831,IT +1425968832,1425968895,A2 +1425968896,1425969023,IT +1425969024,1425969199,A2 +1425969200,1425969215,IT +1425969216,1425969279,A2 +1425969280,1425969343,IT +1425969344,1425969407,A2 +1425969408,1425969471,IT +1425969472,1425969663,A2 1425969664,1425969727,FR 1425969728,1425969791,IT 1425969792,1425969855,FR -1425969856,1425969919,IT -1425969920,1425969983,ZA +1425969856,1425969983,A2 1425969984,1425970047,IT 1425970048,1425970111,DE -1425970112,1425970176,IT +1425970112,1425970176,A2 1425970177,1425970180,DE -1425970181,1425970184,IT +1425970181,1425970184,A2 1425970185,1425970188,GB 1425970189,1425970192,DE 1425970193,1425970239,GB -1425970240,1425970688,IT +1425970240,1425970303,A2 +1425970304,1425970431,IT +1425970432,1425970495,A2 +1425970496,1425970687,IT +1425970688,1425970688,A2 1425970689,1425970751,DE -1425970752,1425971007,IT +1425970752,1425970943,A2 +1425970944,1425971007,IT 1425971008,1425971071,NL -1425971072,1425971199,IT +1425971072,1425971199,A2 1425971200,1425971455,NL -1425971456,1425971711,IT +1425971456,1425971519,A2 +1425971520,1425971583,IT +1425971584,1425971647,A2 +1425971648,1425971711,IT 1425971712,1425971727,AE 1425971728,1425971743,US -1425971744,1425971775,IT +1425971744,1425971775,A2 1425971776,1425971839,DE 1425971840,1425971903,SE -1425971904,1425972351,IT -1425972352,1425972415,FR -1425972416,1425972607,IT -1425972608,1425972671,FR -1425972672,1425972863,IT -1425972864,1425972927,FR -1425972928,1425973119,IT -1425973120,1425973183,FR -1425973184,1425973248,IT +1425971904,1425971967,A2 +1425971968,1425972223,IT +1425972224,1425972671,A2 +1425972672,1425972735,IT +1425972736,1425973183,A2 +1425973184,1425973247,IT +1425973248,1425973248,A2 1425973249,1425973260,PL -1425973261,1425973264,IT +1425973261,1425973264,A2 1425973265,1425973268,DE 1425973269,1425973272,FR 1425973273,1425973276,PL -1425973277,1425973280,IT +1425973277,1425973280,A2 1425973281,1425973300,PL 1425973301,1425973308,DE 1425973309,1425973332,PL 1425973333,1425973336,DE -1425973337,1425973439,IT +1425973337,1425973439,A2 1425973440,1425973503,PL 1425973504,1425973759,IT 1425973760,1425973823,PL -1425973824,1425974847,IT +1425973824,1425973887,IT +1425973888,1425974143,A2 +1425974144,1425974207,IT +1425974208,1425974463,A2 +1425974464,1425974527,IT +1425974528,1425974783,A2 +1425974784,1425974847,IT 1425974848,1425974911,SE -1425974912,1425975039,IT -1425975040,1425975103,FR +1425974912,1425974975,A2 +1425974976,1425975039,IT +1425975040,1425975103,A2 1425975104,1425975167,IT -1425975168,1425975231,FR -1425975232,1425975296,IT +1425975168,1425975296,A2 1425975297,1425975360,PE -1425975361,1425976064,IT +1425975361,1425975487,A2 +1425975488,1425975551,IT +1425975552,1425975679,FR +1425975680,1425975743,IT +1425975744,1425975807,A2 +1425975808,1425976063,IT +1425976064,1425976064,A2 1425976065,1425976126,FR -1425976127,1425976191,IT +1425976127,1425976127,A2 +1425976128,1425976191,IT 1425976192,1425976255,FR -1425976256,1425976320,IT +1425976256,1425976319,IT +1425976320,1425976320,A2 1425976321,1425976328,FR 1425976329,1425976336,GB -1425976337,1425976344,IT +1425976337,1425976344,A2 1425976345,1425976352,FR 1425976353,1425976368,GB 1425976369,1425976372,FR @@ -20132,61 +35731,65 @@ 1425976433,1425976440,GB 1425976441,1425976448,FR 1425976449,1425976464,GB -1425976465,1425976832,IT -1425976833,1425976852,ES -1425976853,1425976896,IT -1425976897,1425976932,ES -1425976933,1425976936,IT -1425976937,1425976944,ES -1425976945,1425976960,IT -1425976961,1425977008,GB -1425977009,1425977016,IT -1425977017,1425977040,GB -1425977041,1425977087,IT -1425977088,1425977088,GB -1425977089,1425977151,IT -1425977152,1425977215,GB -1425977216,1425977279,DE -1425977280,1425977343,GB +1425976465,1425976575,A2 +1425976576,1425976830,GB +1425976831,1425976831,A2 +1425976832,1425977342,GB +1425977343,1425977343,A2 1425977344,1425977855,IT 1425977856,1425978111,DE 1425978112,1425978367,BG -1425978368,1425979392,IT +1425978368,1425978368,A2 +1425978369,1425978388,IT +1425978389,1425978389,A2 +1425978390,1425978495,IT +1425978496,1425978624,A2 +1425978625,1425978751,IT +1425978752,1425978815,A2 +1425978816,1425978819,IT +1425978820,1425979071,A2 +1425979072,1425979135,IT +1425979136,1425979327,A2 +1425979328,1425979391,IT +1425979392,1425979392,A2 1425979393,1425979400,DE -1425979401,1425979412,IT +1425979401,1425979412,A2 1425979413,1425979416,DE -1425979417,1425979436,IT +1425979417,1425979436,A2 1425979437,1425979456,DE -1425979457,1425979460,IT +1425979457,1425979460,A2 1425979461,1425979464,DE -1425979465,1425979472,IT +1425979465,1425979472,A2 1425979473,1425979476,DE -1425979477,1425979480,IT +1425979477,1425979480,A2 1425979481,1425979488,DE -1425979489,1425979519,IT +1425979489,1425979503,A2 +1425979504,1425979519,IT 1425979520,1425979583,DE -1425979584,1425979652,IT +1425979584,1425979652,A2 1425979653,1425979656,AE -1425979657,1425979660,IT +1425979657,1425979660,A2 1425979661,1425979692,AE -1425979693,1425979704,IT +1425979693,1425979704,A2 1425979705,1425979708,AE -1425979709,1425979711,IT +1425979709,1425979711,A2 1425979712,1425979775,DE 1425979776,1425979839,US -1425979840,1425979904,IT +1425979840,1425979903,IT +1425979904,1425979904,A2 1425979905,1425979968,AE -1425979969,1425979976,IT +1425979969,1425979976,A2 1425979977,1425979984,FR -1425979985,1425979999,IT +1425979985,1425979998,IT +1425979999,1425979999,A2 1425980000,1425980031,US 1425980032,1425980095,DE 1425980096,1425980159,AE -1425980160,1425980415,IT -1425980416,1425980479,GR -1425980480,1425980543,IT -1425980544,1425980607,GR -1425980608,1425981439,IT +1425980160,1425980287,IT +1425980288,1425980351,A2 +1425980352,1425980415,IT +1425980416,1425981375,A2 +1425981376,1425981439,IT 1425981440,1425997823,RU 1425997824,1426014207,MT 1426014208,1426030591,DK @@ -20199,7 +35802,9 @@ 1426653184,1426669567,RO 1426669568,1426685951,IR 1426685952,1426702335,TJ -1426702336,1426718719,LV +1426702336,1426703103,LV +1426703104,1426703167,RU +1426703168,1426718719,LV 1426718720,1426731007,SI 1426731008,1426735103,HR 1426735104,1426751487,BE @@ -20221,22 +35826,20 @@ 1426852096,1426852352,NL 1426852353,1426852359,RU 1426852360,1426852367,SE -1426852368,1426852383,US +1426852368,1426852375,NL +1426852376,1426852383,US 1426852384,1426852543,GB -1426852544,1426855679,NL -1426855680,1426855807,PA -1426855808,1426855935,AN -1426855936,1426857472,NL +1426852544,1426856447,NL +1426856448,1426856703,ES +1426856704,1426857472,NL 1426857473,1426857500,ES 1426857501,1426859263,NL 1426859264,1426859519,RU 1426859520,1426864511,NL 1426864512,1426864639,PA 1426864640,1426864895,FR -1426864896,1426865151,NL -1426865152,1426865407,BE -1426865408,1426865408,NL -1426865409,1426865919,BE +1426864896,1426865663,NL +1426865664,1426865919,BE 1426865920,1426866175,ES 1426866176,1426882559,GB 1426882560,1426898943,FR @@ -20244,7 +35847,31 @@ 1426915328,1426931711,AT 1426931712,1426948095,CZ 1426948096,1426964479,DE -1426964480,1426980863,GB +1426964480,1426967455,GB +1426967456,1426967463,ES +1426967464,1426967567,GB +1426967568,1426967575,ES +1426967576,1426967671,GB +1426967672,1426967679,ES +1426967680,1426968343,GB +1426968344,1426968351,ES +1426968352,1426968591,GB +1426968592,1426968600,ES +1426968601,1426968791,GB +1426968792,1426968800,ES +1426968801,1426969135,GB +1426969136,1426969151,ES +1426969152,1426972319,GB +1426972320,1426972326,FR +1426972327,1426973335,GB +1426973336,1426973343,ES +1426973344,1426976031,GB +1426976032,1426976047,ES +1426976048,1426976111,GB +1426976112,1426976119,ES +1426976120,1426978999,GB +1426979000,1426979007,ES +1426979008,1426980863,GB 1426980864,1426997247,BG 1426997248,1427013631,PL 1427013632,1427030015,FR @@ -20252,14 +35879,40 @@ 1427031680,1427031743,AT 1427031744,1427031807,DE 1427031808,1427032063,AT -1427032064,1427035391,DE +1427032064,1427032143,DE +1427032144,1427032151,AT +1427032152,1427032183,DE +1427032184,1427032191,PL +1427032192,1427032223,DE +1427032224,1427032231,GR +1427032232,1427032735,DE +1427032736,1427032743,AT +1427032744,1427032959,DE +1427032960,1427032967,NL +1427032968,1427033247,DE +1427033248,1427033263,MZ +1427033264,1427033287,DE +1427033288,1427033295,SE +1427033296,1427035391,DE 1427035392,1427035519,GB 1427035520,1427046399,DE 1427046400,1427062783,IR 1427062784,1427095551,RU 1427095552,1427111935,LV 1427111936,1427177471,DE -1427177472,1427243007,NL +1427177472,1427216703,NL +1427216704,1427216767,BE +1427216768,1427227135,NL +1427227136,1427227647,US +1427227648,1427227967,NL +1427227968,1427227975,GB +1427227976,1427227983,DE +1427227984,1427227991,IT +1427227992,1427227999,ES +1427228000,1427228007,PL +1427228008,1427228015,RU +1427228016,1427228023,FR +1427228024,1427243007,NL 1427243008,1427308543,IT 1427308544,1427374079,NO 1427374080,1427439615,IT @@ -20268,9 +35921,133 @@ 1427570688,1427636223,FI 1427636224,1427668991,DK 1427668992,1427701759,SE -1427701760,1427750911,DE -1427750912,1427759103,NL -1427759104,1427767295,DE +1427701760,1427723391,DE +1427723392,1427723519,LI +1427723520,1427728383,DE +1427728384,1427728415,US +1427728416,1427728479,DE +1427728480,1427728511,CY +1427728512,1427728543,BR +1427728544,1427728671,DE +1427728672,1427728703,TR +1427728704,1427728799,DE +1427728800,1427728831,RU +1427728832,1427728863,DE +1427728864,1427728895,CY +1427728896,1427728927,DE +1427728928,1427728959,IL +1427728960,1427728991,RU +1427728992,1427729055,DE +1427729056,1427729087,CA +1427729088,1427729119,DE +1427729120,1427729151,RO +1427729152,1427729311,DE +1427729312,1427729343,GR +1427729344,1427742719,DE +1427742720,1427742751,IO +1427742752,1427742847,DE +1427742848,1427742879,CZ +1427742880,1427743231,DE +1427743232,1427743263,GR +1427743264,1427743327,DE +1427743328,1427743359,NL +1427743360,1427743455,DE +1427743456,1427743487,CY +1427743488,1427743615,DE +1427743616,1427743647,DK +1427743648,1427743775,DE +1427743776,1427743807,ZA +1427743808,1427744159,DE +1427744160,1427744191,RU +1427744192,1427744255,DE +1427744256,1427744287,US +1427744288,1427744319,TR +1427744320,1427744351,DE +1427744352,1427744383,UA +1427744384,1427744511,DE +1427744512,1427744543,BE +1427744544,1427744639,DE +1427744640,1427744671,TR +1427744672,1427744703,DE +1427744704,1427744735,CA +1427744736,1427744767,DK +1427744768,1427744863,DE +1427744864,1427744927,TR +1427744928,1427744991,DE +1427744992,1427745023,DK +1427745024,1427745151,DE +1427745152,1427745183,RO +1427745184,1427745247,DE +1427745248,1427745279,TR +1427745280,1427745503,DE +1427745504,1427745535,RU +1427745536,1427745567,CN +1427745568,1427745599,RU +1427745600,1427745631,DE +1427745632,1427745663,BM +1427745664,1427745695,CY +1427745696,1427745727,US +1427745728,1427745791,DE +1427745792,1427745823,GB +1427745824,1427745983,DE +1427745984,1427746015,PL +1427746016,1427746079,DE +1427746080,1427746111,GB +1427746112,1427746239,DE +1427746240,1427746271,TR +1427746272,1427746367,DE +1427746368,1427746399,SE +1427746400,1427747839,DE +1427747840,1427747871,FI +1427747872,1427748543,DE +1427748544,1427748575,MX +1427748576,1427748831,DE +1427748832,1427748863,US +1427748864,1427749503,DE +1427749504,1427749535,UA +1427749536,1427749567,DE +1427749568,1427749599,CY +1427749600,1427749631,DE +1427749632,1427749663,US +1427749664,1427749695,DE +1427749696,1427749727,PL +1427749728,1427749919,DE +1427749920,1427749983,RU +1427749984,1427750143,DE +1427750144,1427750175,TR +1427750176,1427750239,DE +1427750240,1427750271,TR +1427750272,1427750303,DE +1427750304,1427750335,GB +1427750336,1427751167,DE +1427751168,1427751423,NL +1427751424,1427759935,DE +1427759936,1427759967,HR +1427759968,1427760191,DE +1427760192,1427760223,TR +1427760224,1427760255,US +1427760256,1427760319,BR +1427760320,1427760383,DE +1427760384,1427760415,TR +1427760416,1427760799,DE +1427760800,1427760831,NL +1427760832,1427760959,DE +1427760960,1427760991,CZ +1427760992,1427761023,DE +1427761024,1427761055,HR +1427761056,1427761087,DE +1427761088,1427761119,CH +1427761120,1427761183,DE +1427761184,1427761215,IT +1427761216,1427761247,DE +1427761248,1427761279,BR +1427761280,1427761375,DE +1427761376,1427761407,TW +1427761408,1427761503,DE +1427761504,1427761535,PL +1427761536,1427761567,US +1427761568,1427761599,RU +1427761600,1427767295,DE 1427767296,1427800063,BE 1427800064,1427823615,RU 1427823616,1427824639,KG @@ -20286,7 +36063,6 @@ 1427980288,1427996671,FI 1427996672,1428013055,KZ 1428013056,1428029439,EE -1428029440,1428045823,GR 1428045824,1428062207,MK 1428062208,1428078591,SE 1428078592,1428094975,RU @@ -20294,7 +36070,7 @@ 1428096032,1428096039,CH 1428096040,1428103167,AT 1428103168,1428119551,GB -1428119552,1428121599,RU +1428119552,1428121599,LV 1428121600,1428123647,FR 1428123648,1428126975,RU 1428126976,1428127231,TR @@ -20306,41 +36082,37 @@ 1428135936,1428137983,IT 1428137984,1428140031,GB 1428140032,1428142079,RU -1428142080,1428143167,DE -1428143168,1428143231,CH -1428143232,1428144127,DE -1428144128,1428145919,FR -1428145920,1428146175,CH -1428146176,1428146719,FR -1428146720,1428146775,SE -1428146776,1428146783,FR -1428146784,1428147199,SE -1428147200,1428147359,FR +1428142080,1428143263,DE +1428143264,1428143279,CH +1428143280,1428144127,DE +1428144128,1428147103,FR +1428147104,1428147119,GB +1428147120,1428147127,FR +1428147128,1428147135,GB +1428147136,1428147359,FR 1428147360,1428147375,IT 1428147376,1428147391,ES -1428147392,1428147775,FR -1428147776,1428147783,CH -1428147784,1428147847,FR -1428147848,1428147855,DK +1428147392,1428147591,FR +1428147592,1428147711,GB +1428147712,1428147855,FR 1428147856,1428147871,US 1428147872,1428147903,GB -1428147904,1428148127,FR -1428148128,1428148135,IL -1428148136,1428148143,BE +1428147904,1428148031,FR +1428148032,1428148063,GB +1428148064,1428148143,FR 1428148144,1428148151,DE 1428148152,1428148159,NL -1428148160,1428148175,SE +1428148160,1428148175,FR 1428148176,1428148191,CH -1428148192,1428148223,SE -1428148224,1428150463,FR -1428150464,1428150655,SE -1428150656,1428150687,FR -1428150688,1428150783,SE -1428150784,1428150911,FR -1428150912,1428151295,SE -1428151296,1428151807,FR -1428151808,1428152063,SE -1428152064,1428152319,FR +1428148192,1428148223,GB +1428148224,1428150495,FR +1428150496,1428150511,GB +1428150512,1428150735,FR +1428150736,1428150751,GB +1428150752,1428151007,FR +1428151008,1428151039,GB +1428151040,1428152127,FR +1428152128,1428152319,GB 1428152320,1428160511,PL 1428160512,1429209087,IT 1429209088,1430257663,ES @@ -20362,56 +36134,23 @@ 1431839040,1431846911,BE 1431846912,1431855103,NO 1431855104,1431863295,NL -1431863296,1431863551,GB -1431863552,1431863599,PT -1431863600,1431863607,GB -1431863608,1431863767,PT -1431863768,1431863775,GB -1431863776,1431863855,PT -1431863856,1431863887,GB -1431863888,1431863919,PT -1431863920,1431863935,GB -1431863936,1431864135,PT -1431864136,1431864143,GB -1431864144,1431864151,PT -1431864152,1431864159,GB -1431864160,1431864191,PT -1431864192,1431864207,GB -1431864208,1431864287,PT -1431864288,1431864295,GB -1431864296,1431864407,PT -1431864408,1431864415,GB -1431864416,1431864623,PT -1431864624,1431864631,GB -1431864632,1431864743,PT -1431864744,1431864751,GB -1431864752,1431864775,PT -1431864776,1431864799,GB -1431864800,1431864887,PT -1431864888,1431864895,GB -1431864896,1431864919,PT -1431864920,1431864927,GB -1431864928,1431865111,PT -1431865112,1431865119,GB -1431865120,1431865263,PT -1431865264,1431865295,GB -1431865296,1431865303,PT -1431865304,1431865327,GB -1431865328,1431865335,PT +1431863296,1431864263,PT +1431864264,1431864271,ES +1431864272,1431864935,PT +1431864936,1431864943,ES +1431864944,1431865335,PT 1431865336,1431865343,ES -1431865344,1431865599,PT -1431865600,1431865631,GB +1431865344,1431865631,PT 1431865632,1431865647,ES -1431865648,1431865655,GB -1431865656,1431865663,PT +1431865648,1431865663,PT 1431865664,1431865679,ES -1431865680,1431865711,GB +1431865680,1431865711,PT 1431865712,1431865719,ES -1431865720,1431865791,GB -1431865792,1431865799,PT -1431865800,1431867391,GB -1431867392,1431867647,PT -1431867648,1431871487,GB +1431865720,1431866447,PT +1431866448,1431866455,NL +1431866456,1431866479,PT +1431866480,1431866495,ES +1431866496,1431871487,PT 1431871488,1431879679,RU 1431879680,1431887871,IT 1431887872,1431896063,GB @@ -20425,7 +36164,11 @@ 1431953408,1431961599,DK 1431961600,1431969791,CH 1431969792,1431977983,GB -1431977984,1431986175,NL +1431977984,1431979479,NL +1431979480,1431979487,GB +1431979488,1431980151,NL +1431980152,1431980159,US +1431980160,1431986175,NL 1431986176,1431994367,RU 1431994368,1432002559,AT 1432002560,1432010751,HU @@ -20445,21 +36188,17 @@ 1432100864,1432109055,CZ 1432109056,1432117247,GB 1432117248,1432125439,CY -1432125440,1432127487,NL -1432127488,1432127551,BE -1432127552,1432131583,NL +1432125440,1432131583,NL 1432131584,1432133631,PH 1432133632,1432150015,GB 1432150016,1432158207,BA -1432158208,1432158463,CH -1432158464,1432159743,DE +1432158208,1432159743,DE 1432159744,1432159871,PL 1432159872,1432160255,DE 1432160256,1432160511,CH 1432160512,1432165247,DE 1432165248,1432165375,PL -1432165376,1432166143,DE -1432166144,1432166399,CH +1432165376,1432166399,DE 1432166400,1432174591,RU 1432174592,1432182783,DE 1432182784,1432190975,CZ @@ -20469,11 +36208,7 @@ 1432215552,1432223743,NO 1432223744,1432240127,RU 1432240128,1432248319,HR -1432248320,1432252415,CS -1432252416,1432254207,ME -1432254208,1432254463,CS -1432254464,1432255487,ME -1432255488,1432256511,AL +1432248320,1432256511,ME 1432256512,1432264703,BA 1432264704,1432272895,AD 1432272896,1432281087,IT @@ -20484,15 +36219,14 @@ 1432313856,1432322047,GB 1432322048,1432338431,RU 1432338432,1432346623,FR -1432346624,1432346879,DE -1432346880,1432347135,AE -1432347136,1432352767,DE -1432352768,1432353279,AE -1432353280,1432353791,DE -1432353792,1433403391,TR -1433403392,1433407711,ES -1433407712,1433408255,NL -1433408256,1433411583,ES +1432346624,1433403391,TR +1433403392,1433407487,ES +1433407488,1433410559,NL +1433410560,1433411071,ES +1433411072,1433411375,TR +1433411376,1433411391,US +1433411392,1433411407,NL +1433411408,1433411583,TR 1433411584,1433419775,RU 1433419776,1433427967,LB 1433427968,1433436159,RU @@ -20546,17 +36280,12 @@ 1433739264,1433747455,GE 1433747456,1433755647,RU 1433755648,1433763839,EE -1433763840,1433765887,CZ -1433765888,1433766911,DE -1433766912,1433769983,RU -1433769984,1433771007,SK -1433771008,1433772031,RU +1433763840,1433772031,CZ 1433772032,1433788415,SE 1433788416,1433796607,UZ 1433796608,1433804799,GB 1433804800,1433812991,FR -1433812992,1433820159,BG -1433820160,1433821183,HR +1433812992,1433821183,BG 1433821184,1433829375,GE 1433829376,1433833471,RU 1433833472,1433835519,IT @@ -20564,9 +36293,11 @@ 1433837568,1433839615,DE 1433839616,1433841663,GB 1433841664,1433843711,RU -1433843712,1433843839,SE +1433843712,1433843743,SE +1433843744,1433843775,NL +1433843776,1433843839,SE 1433843840,1433843967,NL -1433843968,1433843983,CS +1433843968,1433843983,RS 1433843984,1433845759,NL 1433845760,1433847807,BG 1433847808,1433849855,SE @@ -20575,45 +36306,54 @@ 1433853952,1433855999,RU 1433856000,1433858047,GB 1433858048,1433860095,ES -1433860096,1433862143,BA -1433862144,1433863039,CH -1433863040,1433863167,US -1433863168,1433864191,CH +1433860096,1433862143,DE +1433862144,1433862751,CH +1433862752,1433862783,MC +1433862784,1433863423,CH +1433863424,1433863487,US +1433863488,1433864191,CH 1433864192,1433866239,HU 1433866240,1433867263,NL 1433867264,1433867295,GB -1433867296,1433867775,NL -1433867776,1433867839,GB -1433867840,1433868031,NL -1433868032,1433868287,GB -1433868288,1433870335,MT +1433867296,1433867519,NL +1433867520,1433867647,GB +1433867648,1433867775,NL +1433867776,1433867903,GB +1433867904,1433868031,NL +1433868032,1433870335,GB 1433870336,1433872383,TR 1433872384,1433874431,IT 1433874432,1433876479,NL 1433876480,1433878527,GB 1433878528,1433880575,TR 1433880576,1433882623,RU -1433882624,1433884671,FR +1433882624,1433884671,GB 1433884672,1433886719,CZ 1433886720,1433888767,GB -1433888768,1433890815,SA +1433888768,1433890815,NL 1433890816,1433892863,GB 1433892864,1433894911,MT 1433894912,1433896959,SE -1433896960,1433899007,NO +1433896960,1433897471,NO +1433897472,1433897727,NL +1433897728,1433899007,NO 1433899008,1433901055,RU 1433901056,1433905151,DE 1433905152,1433907199,FR 1433907200,1433909247,IT 1433909248,1433911295,BE 1433911296,1433913343,ES -1433913344,1433914879,DE -1433914880,1433915135,NL -1433915136,1433917439,DE +1433913344,1433913875,NL +1433913876,1433913879,DE +1433913880,1433914111,NL +1433914112,1433915135,DE +1433915136,1433915391,NL +1433915392,1433917439,DE 1433917440,1433919487,BE 1433919488,1433921535,GB 1433921536,1433923583,CH -1433923584,1433924479,NL +1433923584,1433923711,BE +1433923712,1433924479,NL 1433924480,1433925631,BE 1433925632,1433927679,GB 1433927680,1434189823,RO @@ -20624,7 +36364,38 @@ 1434583040,1434615807,BG 1434615808,1434648575,IL 1434648576,1434681343,FI -1434681344,1434714111,DE +1434681344,1434681855,DE +1434681856,1434682111,MY +1434682112,1434682303,DE +1434682304,1434682367,NL +1434682368,1434683087,DE +1434683088,1434683135,NL +1434683136,1434683263,DE +1434683264,1434683391,NL +1434683392,1434684415,DE +1434684416,1434684671,NL +1434684672,1434685439,DE +1434685440,1434687231,NL +1434687232,1434687359,DE +1434687360,1434687487,NL +1434687488,1434694655,DE +1434694656,1434694719,NL +1434694720,1434702463,DE +1434702464,1434702591,NL +1434702592,1434702655,DE +1434702656,1434702671,NL +1434702672,1434705663,DE +1434705664,1434705679,NL +1434705680,1434705695,DE +1434705696,1434705919,NL +1434705920,1434710591,DE +1434710592,1434710783,NL +1434710784,1434712063,DE +1434712064,1434712319,NL +1434712320,1434712959,DE +1434712960,1434712975,NL +1434712976,1434713855,DE +1434713856,1434714111,NL 1434714112,1434746879,AZ 1434746880,1434779647,CZ 1434779648,1434812415,GB @@ -20657,7 +36428,12 @@ 1436444672,1436446719,BE 1436446720,1436450815,FR 1436450816,1436452863,BH -1436452864,1436454911,GB +1436452864,1436453119,NL +1436453120,1436453631,DE +1436453632,1436453887,NL +1436453888,1436454399,GB +1436454400,1436454655,NL +1436454656,1436454911,GB 1436454912,1436456959,AZ 1436456960,1436459007,GB 1436459008,1436461055,NL @@ -20668,7 +36444,8 @@ 1436469248,1436471295,NL 1436471296,1436471551,BE 1436471552,1436471615,NL -1436471616,1436471743,BE +1436471616,1436471679,FR +1436471680,1436471743,BE 1436471744,1436471807,BR 1436471808,1436473343,BE 1436473344,1436475391,RO @@ -20676,7 +36453,9 @@ 1436477440,1436481535,CH 1436481536,1436483583,NL 1436483584,1436485631,UA -1436485632,1436487623,DE +1436485632,1436487471,DE +1436487472,1436487487,AT +1436487488,1436487623,DE 1436487624,1436487631,AT 1436487632,1436487679,DE 1436487680,1436489727,IE @@ -20691,7 +36470,7 @@ 1436512256,1436514303,NL 1436514304,1436516351,GI 1436516352,1436520447,GB -1436520448,1436522495,SE +1436520448,1436522495,IT 1436522496,1436524543,GB 1436524544,1436526591,IL 1436526592,1436528639,GB @@ -20707,7 +36486,7 @@ 1436536832,1436538879,GB 1436538880,1436540927,JO 1436540928,1436542975,RU -1436542976,1436545023,BA +1436542976,1436545023,NL 1436545024,1436547071,DE 1436547072,1436549119,GB 1436549120,1436811263,CZ @@ -20717,7 +36496,11 @@ 1437597696,1438121983,DE 1438121984,1438127103,NL 1438127104,1438127359,GB -1438127360,1438187519,NL +1438127360,1438127615,SE +1438127616,1438127871,BE +1438127872,1438142463,NL +1438142464,1438142719,GB +1438142720,1438187519,NL 1438187520,1438253055,IR 1438253056,1438318591,RO 1438318592,1438384127,BG @@ -20729,8 +36512,12 @@ 1438519040,1438523391,DE 1438523392,1438524947,NL 1438524948,1438524951,DE -1438524952,1438525319,NL -1438525320,1438580735,DE +1438524952,1438525335,NL +1438525336,1438525343,DE +1438525344,1438525607,NL +1438525608,1438525695,DE +1438525696,1438526723,NL +1438526724,1438580735,DE 1438580736,1438646271,NL 1438646272,1438662655,RU 1438662656,1438679039,ES @@ -20747,40 +36534,56 @@ 1438842880,1438859263,SE 1438859264,1438861823,DE 1438861824,1438862079,CH -1438862080,1438874411,DE -1438874412,1438874413,GB -1438874414,1438875223,DE +1438862080,1438873119,DE +1438873120,1438873127,PA +1438873128,1438873671,DE +1438873672,1438873679,PA +1438873680,1438874687,DE +1438874688,1438874695,CH +1438874696,1438874719,DE +1438874720,1438874751,NL +1438874752,1438874759,DE +1438874760,1438874767,PA +1438874768,1438874783,DE +1438874784,1438874791,PA +1438874792,1438874799,DE +1438874800,1438874855,PA +1438874856,1438874863,DE +1438874864,1438874879,PA +1438874880,1438875223,DE 1438875224,1438875255,GB 1438875256,1438875257,CH 1438875258,1438875647,DE -1438875648,1438875903,RU -1438875904,1438876159,SE -1438876160,1438876415,AM +1438875648,1438876159,RU +1438876160,1438876415,LB 1438876416,1438876927,RU -1438876928,1438877183,SE +1438876928,1438877183,IQ 1438877184,1438877439,LT -1438877440,1438877695,RU +1438877440,1438877695,LB 1438877696,1438877951,LT -1438877952,1438878719,LB -1438878720,1438878975,LT -1438878976,1438880255,RU -1438880256,1438880511,AM -1438880512,1438880767,LT +1438877952,1438878975,LB +1438878976,1438879231,IQ +1438879232,1438880767,RU 1438880768,1438881791,LB 1438881792,1438882303,RU 1438882304,1438882559,LT 1438882560,1438883583,RU 1438883584,1438883839,AM -1438883840,1438884863,RU -1438884864,1438885887,AM +1438883840,1438884351,RU +1438884352,1438884607,LB +1438884608,1438884863,IQ +1438884864,1438885887,RU 1438885888,1438889983,LT 1438889984,1438890239,LB 1438890240,1438890495,RU -1438890496,1438890751,LB +1438890496,1438890751,IQ 1438890752,1438892031,RU -1438892032,1438892287,AQ -1438892288,1438900223,CH -1438900224,1438908415,AQ +1438892032,1438892287,US +1438892288,1438900223,IS +1438900224,1438900479,AQ +1438900480,1438904319,IS +1438904320,1438904575,CH +1438904576,1438908415,IS 1438908416,1438924799,GR 1438924800,1438941183,NO 1438941184,1438957567,BG @@ -20796,9 +36599,13 @@ 1438995040,1438995047,GB 1438995048,1438995067,DE 1438995068,1438995071,SE -1438995072,1438999099,DE -1438999100,1438999103,CH -1438999104,1438999475,DE +1438995072,1438998781,DE +1438998782,1438998783,CH +1438998784,1438999098,DE +1438999099,1438999103,CH +1438999104,1438999261,DE +1438999262,1438999295,NL +1438999296,1438999475,DE 1438999476,1438999487,PT 1438999488,1438999517,DE 1438999518,1438999518,CH @@ -20807,7 +36614,9 @@ 1438999535,1438999791,DE 1438999792,1438999807,GB 1438999808,1439000575,DE -1439000576,1439002623,NL +1439000576,1439000831,NL +1439000832,1439000839,DE +1439000840,1439002623,NL 1439002624,1439006567,DE 1439006568,1439006575,AT 1439006576,1439006671,DE @@ -20837,34 +36646,52 @@ 1439350784,1439354879,UA 1439354880,1439358975,PL 1439358976,1439367167,RU -1439367168,1439432703,NL +1439367168,1439375359,NL +1439375360,1439383551,DE +1439383552,1439432703,NL 1439432704,1439498239,RO -1439498240,1439514623,DE +1439498240,1439503103,DE +1439503104,1439504127,GB +1439504128,1439504383,DE +1439504384,1439514623,GB 1439514624,1439516671,IT -1439516672,1439518207,DE +1439516672,1439517439,DE +1439517440,1439517695,GB +1439517696,1439518207,DE 1439518208,1439518719,IT -1439518720,1439529983,DE +1439518720,1439520767,GB +1439520768,1439522815,DE +1439522816,1439528959,GB +1439528960,1439529215,DE +1439529216,1439529471,GB +1439529472,1439529599,DE +1439529600,1439529983,GB 1439529984,1439530239,EG 1439530240,1439535103,DE 1439535104,1439538175,IT -1439538176,1439538687,DE +1439538176,1439538687,GB 1439538688,1439539199,IT 1439539200,1439549439,DE 1439549440,1439551487,IT -1439551488,1439556095,DE +1439551488,1439555839,DE +1439555840,1439556095,GB 1439556096,1439556607,IT -1439556608,1439558143,DE +1439556608,1439557119,DE +1439557120,1439557375,GB +1439557376,1439557887,DE +1439557888,1439558143,GB 1439558144,1439558911,IT -1439558912,1439560191,DE +1439558912,1439559423,GB +1439559424,1439560191,DE 1439560192,1439560447,IT -1439560448,1439560703,DE +1439560448,1439560703,GB 1439560704,1439561215,IT 1439561216,1439561727,DE 1439561728,1439562239,GB 1439562240,1439562751,IE 1439562752,1439562879,DE -1439562880,1439563199,GB -1439563200,1439563775,DE +1439562880,1439563263,GB +1439563264,1439563775,DE 1439563776,1439629311,LT 1439629312,1439694847,CZ 1439694848,1439825919,SA @@ -20881,7 +36708,7 @@ 1440514048,1440546815,DE 1440546816,1440579583,NO 1440579584,1440645119,PL -1440645120,1440677887,CS +1440645120,1440677887,RS 1440677888,1440710655,NL 1440710656,1440743423,UA 1440743424,1441267711,SE @@ -20890,9 +36717,11 @@ 1441284096,1441292287,AT 1441292288,1441300479,RU 1441300480,1441308671,LT -1441308672,1441316863,CH +1441308672,1441316863,SE 1441316864,1441325055,MT -1441325056,1441333247,PL +1441325056,1441327519,PL +1441327520,1441327551,SE +1441327552,1441333247,PL 1441333248,1441349631,DE 1441349632,1441357823,RU 1441357824,1441366015,AT @@ -20900,11 +36729,19 @@ 1441374208,1441382399,GB 1441382400,1441384511,FR 1441384512,1441384543,US -1441384544,1441384583,FR -1441384584,1441384591,TN -1441384592,1441384607,FR +1441384544,1441384591,FR +1441384592,1441384599,AU +1441384600,1441384607,FR 1441384608,1441384639,CN -1441384640,1441390591,FR +1441384640,1441385103,FR +1441385104,1441385119,ES +1441385120,1441386111,FR +1441386112,1441386239,IL +1441386240,1441388671,FR +1441388672,1441388799,CA +1441388800,1441389055,FR +1441389056,1441389119,IE +1441389120,1441390591,FR 1441390592,1441398783,DK 1441398784,1441415167,RU 1441415168,1441423359,GB @@ -20925,32 +36762,47 @@ 1441505280,1441521663,RU 1441521664,1441529855,DK 1441529856,1441538047,RU -1441538048,1441543567,DE +1441538048,1441543151,DE +1441543152,1441543167,LI +1441543168,1441543567,DE 1441543568,1441543583,CH 1441543584,1441544063,DE 1441544064,1441544127,TR -1441544128,1441546239,DE +1441544128,1441544143,DE +1441544144,1441544159,CH +1441544160,1441545535,DE +1441545536,1441545599,AT +1441545600,1441546239,DE 1441546240,1441554431,DK 1441554432,1441554687,GB 1441554688,1441554943,NL 1441554944,1441557759,GB 1441557760,1441558015,NL 1441558016,1441562623,GB -1441562624,1441564671,OM +1441562624,1441564671,IQ 1441564672,1441566719,PK 1441566720,1441570815,IR 1441570816,1441579007,RU -1441579008,1441587199,DE +1441579008,1441582975,DE +1441582976,1441583103,US +1441583104,1441587199,DE 1441587200,1441594879,AT 1441594880,1441595135,DE -1441595136,1441596159,AT -1441596160,1441601535,SK -1441601536,1441603583,AT +1441595136,1441596415,AT +1441596416,1441602815,SK +1441602816,1441603071,AT +1441603072,1441603583,SK 1441603584,1441611775,RU 1441611776,1441619967,DE 1441619968,1441620271,FR 1441620272,1441620287,ES -1441620288,1441628159,FR +1441620288,1441620407,FR +1441620408,1441620411,ES +1441620412,1441620735,FR +1441620736,1441620767,ES +1441620768,1441620895,FR +1441620896,1441620927,PT +1441620928,1441628159,FR 1441628160,1441636351,SA 1441636352,1441644543,PL 1441644544,1441652735,GB @@ -21013,7 +36865,56 @@ 1445068800,1445199871,RO 1445199872,1445330943,QA 1445330944,1445396479,LT -1445396480,1445462015,BE +1445396480,1445429247,BE +1445429248,1445429311,NL +1445429312,1445430303,BE +1445430304,1445431295,NL +1445431296,1445431647,BE +1445431648,1445431679,NL +1445431680,1445431807,BE +1445431808,1445433855,NL +1445433856,1445433887,BE +1445433888,1445434111,NL +1445434112,1445434399,BE +1445434400,1445434527,NL +1445434528,1445434559,BE +1445434560,1445435395,NL +1445435396,1445435399,BE +1445435400,1445435423,NL +1445435424,1445435431,BE +1445435432,1445435967,NL +1445435968,1445435999,BE +1445436000,1445436287,NL +1445436288,1445436415,BE +1445436416,1445436463,NL +1445436464,1445436511,BE +1445436512,1445436799,NL +1445436800,1445436863,BE +1445436864,1445436895,NL +1445436896,1445436927,BE +1445436928,1445436959,NL +1445436960,1445437182,BE +1445437183,1445437311,NL +1445437312,1445437319,BE +1445437320,1445437439,NL +1445437440,1445437695,BE +1445437696,1445437711,NL +1445437712,1445437743,BE +1445437744,1445437823,NL +1445437824,1445438271,BE +1445438272,1445439999,NL +1445440000,1445440255,BE +1445440256,1445442559,NL +1445442560,1445443327,BE +1445443328,1445445119,NL +1445445120,1445445855,BE +1445445856,1445447679,NL +1445447680,1445451519,BE +1445451520,1445451647,NL +1445451648,1445456126,BE +1445456127,1445456127,NL +1445456128,1445458175,BE +1445458176,1445462015,NL 1445462016,1445986303,IE 1445986304,1446051839,DK 1446051840,1446117375,CZ @@ -21024,11 +36925,18 @@ 1446445056,1446510591,RO 1446510592,1446543359,DE 1446543360,1446576127,AT -1446576128,1446608895,LV +1446576128,1446608895,IR 1446608896,1446641663,BY 1446641664,1446674431,SI -1446674432,1446707199,DK -1446707200,1446739967,AT +1446674432,1446707175,DK +1446707176,1446707179,NO +1446707180,1446707183,FI +1446707184,1446707199,DK +1446707200,1446710687,AT +1446710688,1446710703,ES +1446710704,1446736503,AT +1446736504,1446736511,US +1446736512,1446739967,AT 1446739968,1446772735,RU 1446772736,1446805503,SA 1446805504,1446838271,FI @@ -21036,28 +36944,34 @@ 1446862080,1446862591,HR 1446862592,1446871039,SI 1446871040,1446903807,CZ -1446903808,1446904071,AE +1446903808,1446904071,A2 1446904072,1446904079,CY 1446904080,1446904095,BH 1446904096,1446904111,SA 1446904112,1446904119,BH -1446904120,1446904127,AE +1446904120,1446904127,A2 1446904128,1446904135,SA 1446904136,1446904143,IQ 1446904144,1446904151,SA 1446904152,1446904159,IR 1446904160,1446904167,ES 1446904168,1446904175,IQ -1446904176,1446904831,AE +1446904176,1446904831,A2 1446904832,1446904835,LY -1446904836,1446920191,AE +1446904836,1446904931,A2 +1446904932,1446904935,ZM +1446904936,1446908539,A2 +1446908540,1446908543,ZM +1446908544,1446920191,A2 1446920192,1446936575,RU 1446936576,1446952959,NO 1446952960,1446969343,QA 1446969344,1446985727,GB 1446985728,1447010303,PL 1447010304,1447018495,LV -1447018496,1447026687,CZ +1447018496,1447019007,CZ +1447019008,1447019023,BZ +1447019024,1447026687,CZ 1447026688,1447169375,FR 1447169376,1447169391,TN 1447169392,1448083455,FR @@ -21069,7 +36983,9 @@ 1449590784,1449656319,DE 1449656320,1449717759,RO 1449717760,1449718783,MD -1449718784,1449840639,RO +1449718784,1449808639,RO +1449808640,1449808895,UA +1449808896,1449840639,RO 1449840640,1449852927,MD 1449852928,1449918463,RO 1449918464,1449951231,JO @@ -21086,17 +37002,28 @@ 1450057728,1450065919,EE 1450065920,1450074111,DE 1450074112,1450082303,RU -1450082304,1450090495,IT +1450082304,1450083327,IT +1450083328,1450083583,A2 +1450083584,1450083839,IT +1450083840,1450084351,A2 +1450084352,1450085375,IT +1450085376,1450085383,A2 +1450085384,1450085549,IT +1450085550,1450085551,A2 +1450085552,1450085679,IT +1450085680,1450085751,A2 +1450085752,1450090495,IT 1450090496,1450106879,RU 1450106880,1450115071,SK 1450115072,1450123263,RU 1450123264,1450131455,AT -1450131456,1450139647,ES +1450131456,1450139647,UA 1450139648,1450147839,PL 1450147840,1450156031,RU 1450156032,1450164223,GB 1450164224,1450166271,SA 1450166272,1450168319,PL +1450168320,1450170367,EU 1450170368,1450172415,GB 1450172416,1450174463,UA 1450174464,1450176511,DE @@ -21105,13 +37032,7 @@ 1450180608,1450311679,GB 1450311680,1450442751,FI 1450442752,1450704895,CH -1450704896,1450731519,RO -1450731520,1450732031,HU -1450732032,1450860543,RO -1450860544,1450864639,HU -1450864640,1450872319,RO -1450872320,1450872831,HU -1450872832,1451173887,RO +1450704896,1451173887,RO 1451173888,1451175935,HU 1451175936,1451229183,RO 1451229184,1455423487,GB @@ -21123,8 +37044,7 @@ 1464074240,1464336383,IL 1464336384,1464467455,DK 1464467456,1464598527,GB -1464598528,1464664063,SE -1464664064,1464860671,DE +1464598528,1464860671,DE 1464860672,1465384959,GB 1465384960,1465647103,FR 1465647104,1465909247,FI @@ -21140,8 +37060,7 @@ 1466103808,1466104575,GB 1466104576,1466104831,FR 1466104832,1466105343,BE -1466105344,1466105599,FR -1466105600,1466105855,GB +1466105344,1466105855,GB 1466105856,1466122239,PL 1466122240,1466130431,LV 1466130432,1466138623,PL @@ -21165,13 +37084,19 @@ 1466564608,1466589183,DE 1466589184,1466590207,FR 1466590208,1466592255,GB -1466592256,1466593279,FR +1466592256,1466592511,FR +1466592512,1466592767,GB +1466592768,1466593279,FR 1466593280,1466606847,DE 1466606848,1466607103,FR 1466607104,1466613759,DE 1466613760,1466615807,ES -1466615808,1466616831,GB -1466616832,1466630143,DE +1466615808,1466616575,GB +1466616576,1466617343,ES +1466617344,1466617471,FR +1466617472,1466617599,GB +1466617600,1466617855,ES +1466617856,1466630143,DE 1466630144,1466695679,IR 1466695680,1466761215,FI 1466761216,1466826751,SA @@ -21182,34 +37107,41 @@ 1466957824,1467219967,GB 1467219968,1467236351,DK 1467236352,1467252735,BG -1467252736,1467262975,CS -1467262976,1467269119,RS +1467252736,1467269119,RS 1467269120,1467285503,PL 1467285504,1467301887,RU 1467301888,1467318271,GB 1467318272,1467334655,RU -1467334656,1467342143,GB -1467342144,1467342207,US -1467342208,1467350783,GB -1467350784,1467351039,US +1467334656,1467340959,GB +1467340960,1467340991,TR +1467340992,1467344127,GB +1467344128,1467344383,CA +1467344384,1467347903,GB +1467347904,1467347935,SE +1467347936,1467351039,GB 1467351040,1467367423,NO 1467367424,1467367615,DE 1467367616,1467367647,SE 1467367648,1467367679,DE 1467367680,1467367695,IT -1467367696,1467367871,DE +1467367696,1467367807,DE +1467367808,1467367871,CZ 1467367872,1467367903,SE 1467367904,1467367935,DE 1467367936,1467368191,SI -1467368192,1467368447,DK -1467368448,1467369471,RU -1467369472,1467369599,DE +1467368192,1467368319,DK +1467368320,1467369519,DE +1467369520,1467369535,RU +1467369536,1467369599,DE 1467369600,1467369663,IT -1467369664,1467369791,DE +1467369664,1467369727,AT +1467369728,1467369759,DE +1467369760,1467369791,HR 1467369792,1467369855,SE -1467369856,1467370495,DE -1467370496,1467370751,IE -1467370752,1467383807,DE +1467369856,1467369871,RU +1467369872,1467369887,DE +1467369888,1467369903,RU +1467369904,1467383807,DE 1467383808,1467400191,BG 1467400192,1467416575,RU 1467416576,1467432959,PL @@ -21230,9 +37162,12 @@ 1467466144,1467466175,NL 1467466176,1467466191,DE 1467466192,1467466207,NL -1467466208,1467466271,DE -1467466272,1467466751,NL -1467466752,1467467071,DE +1467466208,1467466215,DE +1467466216,1467466223,VG +1467466224,1467466239,NL +1467466240,1467466271,DE +1467466272,1467466495,NL +1467466496,1467467071,DE 1467467072,1467467103,CH 1467467104,1467467903,DE 1467467904,1467468031,CH @@ -21265,8 +37200,8 @@ 1472724992,1472856063,AE 1472856064,1472987135,GR 1472987136,1473249279,PL -1473249280,1473642495,NL -1473642496,1473740799,BE +1473249280,1473724415,NL +1473724416,1473740799,BE 1473740800,1473773567,NL 1473773568,1474297855,ES 1474297856,1474330623,GB @@ -21284,37 +37219,43 @@ 1474723840,1474756607,SA 1474756608,1474822143,FR 1474822144,1474887679,IE -1474887680,1474888687,NL -1474888688,1474888703,GB -1474888704,1474953215,NL -1474953216,1475018751,DE +1474887680,1474944527,NL +1474944528,1474944535,US +1474944536,1474953215,NL +1474953216,1474966473,DE +1474966474,1474966474,A2 +1474966475,1475018751,DE 1475018752,1475084287,ES 1475084288,1475086335,NL 1475086336,1475092479,RU 1475092480,1475094527,CY 1475094528,1475096575,RU 1475096576,1475098623,BH -1475098624,1475102719,GB +1475098624,1475101695,GB +1475101696,1475102207,ZA +1475102208,1475102719,GB 1475102720,1475104767,FR 1475104768,1475106815,RU 1475106816,1475108863,GB -1475108864,1475110911,TR +1475108864,1475110911,NL 1475110912,1475112959,DE -1475112960,1475115007,MT +1475112960,1475115007,AT 1475115008,1475117055,KW 1475117056,1475119103,GB 1475119104,1475121151,BH -1475121152,1475123199,GB -1475125248,1475127295,NO -1475127296,1475127551,BA -1475127552,1475129343,SE +1475121152,1475121919,GB +1475121920,1475122175,US +1475122176,1475123199,GB +1475123200,1475125247,FI +1475125248,1475127295,IT +1475127296,1475129343,FI 1475129344,1475131391,BE 1475131392,1475133439,RU 1475133440,1475135487,CZ 1475135488,1475137535,CH 1475137536,1475139583,SE 1475139584,1475141631,BE -1475141632,1475143679,UA +1475141632,1475143679,FI 1475143680,1475145727,JO 1475145728,1475147775,ES 1475147776,1475149823,GB @@ -21325,25 +37266,27 @@ 1475158016,1475160063,IS 1475160064,1475162111,RU 1475162112,1475170303,GB -1475170304,1475172351,IE +1475170304,1475172351,ES 1475172352,1475174399,DE 1475174400,1475175047,NL 1475175048,1475175055,US 1475175056,1475176447,NL 1475176448,1475178495,RO 1475178496,1475180543,RU -1475180544,1475181855,DE -1475181856,1475181887,GB -1475181888,1475184639,DE +1475180544,1475181455,DE +1475181456,1475181471,SC +1475181472,1475181519,DE +1475181520,1475181535,GB +1475181536,1475184639,DE 1475184640,1475186687,RU 1475186688,1475188735,ES 1475188736,1475190783,SE 1475190784,1475192831,GB 1475192832,1475194879,CH 1475194880,1475196927,DE -1475196928,1475197071,FR -1475197072,1475197079,DZ -1475197080,1475198975,FR +1475196928,1475197791,FR +1475197792,1475197807,ES +1475197808,1475198975,FR 1475198976,1475201023,BH 1475201024,1475203071,RS 1475203072,1475205119,SE @@ -21380,50 +37323,75 @@ 1475211264,1475213311,DE 1475213312,1475215359,FR 1475215360,1475223551,IT -1475223552,1475233791,NO +1475223552,1475229695,NO +1475229696,1475229759,SE +1475229760,1475229951,NO +1475229952,1475229991,SE +1475229992,1475233791,NO 1475233792,1475234303,GB 1475234304,1475234559,IE 1475234560,1475235839,GB 1475235840,1475237887,IE 1475237888,1475239935,ES 1475239936,1475241983,RU -1475241984,1475244031,MC -1475244032,1475244159,DE -1475244160,1475244175,RU -1475244176,1475244191,IR -1475244192,1475244543,DE -1475244544,1475245055,RU -1475245056,1475248127,DE +1475241984,1475242239,MC +1475242240,1475243775,FR +1475243776,1475244031,MC +1475244032,1475244287,DE +1475244288,1475244311,CV +1475244312,1475244319,DE +1475244320,1475244543,CV +1475244544,1475245055,DE +1475245056,1475245183,IE +1475245184,1475245311,SD +1475245312,1475245567,CV +1475245568,1475246078,SA +1475246079,1475246079,DE +1475246080,1475248127,CH 1475248128,1475250175,JO 1475250176,1475252223,DE 1475252224,1475254271,FR 1475254272,1475256319,UA -1475256320,1475257290,BE +1475256320,1475257120,BE +1475257121,1475257121,NL +1475257122,1475257136,BE +1475257137,1475257137,FR +1475257138,1475257275,BE +1475257276,1475257276,NL +1475257277,1475257277,GB +1475257278,1475257278,BE +1475257279,1475257280,GB +1475257281,1475257282,NL +1475257283,1475257286,BE +1475257287,1475257287,NL +1475257288,1475257290,BE 1475257291,1475257291,DE -1475257292,1475257298,BE -1475257299,1475257300,ES -1475257301,1475258175,BE -1475258176,1475258207,NL -1475258208,1475258239,DE -1475258240,1475258367,BE +1475257292,1475257295,BE +1475257296,1475257296,GB +1475257297,1475257297,NL +1475257298,1475257298,BE +1475257299,1475257299,ES +1475257300,1475257300,GB +1475257301,1475258177,BE +1475258178,1475258207,NL +1475258208,1475258367,BE 1475258368,1475260415,NL 1475260416,1475262463,FR 1475262464,1475266559,DE 1475266560,1475268607,GB -1475268608,1475270655,CS +1475268608,1475270655,RS 1475270656,1475272703,GB 1475272704,1475274751,BE -1475274752,1475276799,IT +1475274752,1475276799,RU 1475276800,1475278847,ES 1475278848,1475280895,DK 1475280896,1475282943,PL 1475282944,1475284991,NL 1475284992,1475287039,GB -1475289088,1475291135,UA +1475287040,1475291135,RU 1475291136,1475293183,PL 1475293184,1475295231,GB -1475295232,1475297279,PL -1475297280,1475299327,DK +1475295232,1475299327,DK 1475299328,1475301375,PL 1475301376,1475303423,LT 1475303424,1475305471,PL @@ -21447,31 +37415,84 @@ 1475344384,1475346431,RO 1475346432,1475362815,RU 1475362816,1475379199,FR -1475379200,1475395583,GB +1475379200,1475395583,RU 1475395584,1475411967,LU -1475411968,1475428351,IT +1475411968,1475412471,IT +1475412472,1475412479,ES +1475412480,1475417975,IT +1475417976,1475417983,A2 +1475417984,1475428351,IT 1475428352,1475444735,SE 1475444736,1475461119,AM 1475461120,1475477503,RU 1475477504,1475493887,HU 1475493888,1475510271,RU 1475510272,1475543039,GB -1475543040,1475559423,DE +1475543040,1475559423,RO 1475559424,1475575807,GR 1475575808,1475592191,AT 1475592192,1475608575,GB 1475608576,1475624959,RU -1475624960,1475641343,GB -1475641344,1475657727,BE +1475624960,1475627519,JE +1475627520,1475627662,GB +1475627663,1475627663,JE +1475627664,1475627688,GB +1475627689,1475627695,JE +1475627696,1475627775,GB +1475627776,1475634431,JE +1475634432,1475634495,GB +1475634496,1475634559,JE +1475634560,1475634719,GB +1475634720,1475634727,JE +1475634728,1475634735,GB +1475634736,1475634751,JE +1475634752,1475634759,GB +1475634760,1475634967,JE +1475634968,1475634975,GB +1475634976,1475636223,JE +1475636224,1475636399,GB +1475636400,1475636415,JE +1475636416,1475636431,GB +1475636432,1475636447,JE +1475636448,1475637479,GB +1475637480,1475637487,JE +1475637488,1475637503,GB +1475637504,1475638783,JE +1475638784,1475639182,GB +1475639183,1475639183,JE +1475639184,1475639199,GB +1475639200,1475639207,JE +1475639208,1475639216,GB +1475639217,1475639223,JE +1475639224,1475639263,GB +1475639264,1475639271,BB +1475639272,1475639295,JE +1475639296,1475639343,GB +1475639344,1475639351,JE +1475639352,1475639367,GB +1475639368,1475639383,JE +1475639384,1475639595,GB +1475639596,1475639599,JE +1475639600,1475639727,GB +1475639728,1475639735,JE +1475639736,1475639775,GB +1475639776,1475639783,JE +1475639784,1475639807,GB +1475639808,1475641343,JE +1475641344,1475657727,UA 1475657728,1475664263,SK 1475664264,1475664271,UA 1475664272,1475674111,SK 1475674112,1475690495,DE 1475690496,1475706879,CH 1475706880,1475723263,RU -1475723264,1475725823,GB -1475725824,1475725951,RU -1475725952,1475729407,GB +1475723264,1475725311,CY +1475725312,1475725951,RU +1475725952,1475727103,GB +1475727104,1475727167,RU +1475727168,1475727343,GB +1475727344,1475727359,RU +1475727360,1475729407,GB 1475729408,1475731455,UA 1475731456,1475739647,GB 1475739648,1475756031,BG @@ -21494,15 +37515,13 @@ 1475897344,1475899903,GB 1475899904,1475901439,IE 1475901440,1475903487,CH +1475903488,1475911679,IR 1475911680,1475919871,MD -1475919872,1475921279,GB -1475921280,1475921343,NL -1475921344,1475921663,GB -1475921664,1475921919,NL -1475921920,1475928063,GB +1475919872,1475928063,IT 1475928064,1475952639,RU 1475952640,1475953151,AE -1475953152,1475955199,GB +1475953152,1475953663,A2 +1475953664,1475955199,GB 1475955200,1475955839,NG 1475955840,1475955967,GH 1475955968,1475956223,GB @@ -21513,25 +37532,32 @@ 1475957760,1475958015,AF 1475958016,1475959039,GB 1475959040,1475959047,US -1475959048,1475960831,GB -1475960832,1475961087,DE -1475961088,1475969023,NL +1475959048,1475959295,A2 +1475959296,1475960207,GB +1475960208,1475960319,A2 +1475960320,1475960831,GB +1475960832,1475969023,NL 1475969024,1475977215,CZ 1475977216,1475985407,SE -1475985408,1475993599,PL -1475993600,1476009983,RU -1476009984,1476018175,CS +1475985408,1476009983,RU +1476009984,1476018175,RS 1476018176,1476026367,IT 1476026368,1476034559,BA 1476034560,1476042751,NL 1476042752,1476050943,PL 1476050944,1476067327,RU 1476067328,1476075519,TR -1476075520,1476083711,NL +1476075520,1476077911,NL +1476077912,1476077919,DE +1476077920,1476079551,NL +1476079552,1476079567,DE +1476079568,1476083711,NL 1476083712,1476116479,RU 1476116480,1476124671,SE 1476124672,1476132863,PL -1476132864,1476141055,FR +1476132864,1476134911,FR +1476134912,1476135167,GB +1476135168,1476141055,FR 1476141056,1476149247,GB 1476149248,1476157439,NO 1476157440,1476165375,BH @@ -21549,10 +37575,10 @@ 1476247552,1476263935,RU 1476263936,1476272127,GB 1476272128,1476280319,NO -1476280320,1476288511,GB +1476280320,1476288511,IM 1476288512,1476296703,LU 1476296704,1476304895,RU -1476304896,1476313087,NL +1476304896,1476313087,BG 1476313088,1476315135,FI 1476315136,1476316159,US 1476316160,1476321279,FI @@ -21560,8 +37586,7 @@ 1476329472,1476337663,RU 1476337664,1476345855,NL 1476345856,1476354047,MD -1476354048,1476357119,KE -1476358144,1476362239,KE +1476354048,1476362239,KE 1476362240,1476370431,FR 1476370432,1476378623,SE 1476378624,1476386815,KZ @@ -21573,16 +37598,20 @@ 1481646080,1481654271,RU 1481654272,1481662463,IT 1481662464,1481678847,BG -1481678848,1481687039,SE -1481687040,1481690591,DE -1481690592,1481690623,MA -1481690624,1481695231,DE +1481678848,1481679743,SE +1481679744,1481679775,GB +1481679776,1481680639,SE +1481680640,1481680643,GB +1481680644,1481687039,SE +1481687040,1481691071,DE +1481691072,1481691135,ES +1481691136,1481695231,DE 1481695232,1481703423,SK 1481703424,1481711615,SA -1481711616,1481719807,AT +1481711616,1481719807,RU 1481719808,1481727999,CZ 1481728000,1481736191,IE -1481736192,1481744383,GB +1481736192,1481744383,GG 1481744384,1481752575,IT 1481752576,1481760767,RU 1481760768,1481768959,UA @@ -21601,7 +37630,11 @@ 1481867264,1481875455,SE 1481875456,1481883647,CZ 1481883648,1481891839,RU -1481891840,1481900031,CZ +1481891840,1481893119,CZ +1481893120,1481893375,SK +1481893376,1481893631,CZ +1481893632,1481893887,SK +1481893888,1481900031,CZ 1481900032,1481908223,CH 1481908224,1481916415,NO 1481916416,1481924607,ES @@ -21612,8 +37645,7 @@ 1481957376,1481965567,SE 1481965568,1481973759,CH 1481973760,1481981951,FO -1481981952,1481983999,NL -1481984000,1481984127,DE +1481981952,1481984127,NL 1481984128,1481984255,PA 1481984256,1481984383,NL 1481984384,1481984511,GI @@ -21624,7 +37656,10 @@ 1481987968,1481988031,PA 1481988032,1481988095,NL 1481988096,1481988159,GI -1481988160,1481988351,NL +1481988160,1481988167,RU +1481988168,1481988319,NL +1481988320,1481988335,BZ +1481988336,1481988351,NL 1481988352,1481988607,GB 1481988608,1481990143,NL 1481990144,1481998335,MK @@ -21634,7 +37669,9 @@ 1482031104,1482039295,SY 1482039296,1482047487,SE 1482047488,1482055679,RU -1482055680,1482063871,CZ +1482055680,1482060919,CZ +1482060920,1482060927,SK +1482060928,1482063871,CZ 1482063872,1482072063,FI 1482072064,1482076159,IT 1482076160,1482076223,CH @@ -21646,7 +37683,9 @@ 1482096640,1482104831,BG 1482104832,1482113023,NO 1482113024,1482121215,RU -1482121216,1482129407,IT +1482121216,1482127123,IT +1482127124,1482127127,TR +1482127128,1482129407,IT 1482129408,1482137599,ES 1482137600,1482145791,IE 1482145792,1482153983,ES @@ -21657,13 +37696,13 @@ 1483210752,1483735039,GB 1483735040,1483997183,FI 1483997184,1484038223,AT -1484038224,1484038227,SA +1484038224,1484038227,A2 1484038228,1484038243,AT -1484038244,1484038247,AE +1484038244,1484038247,A2 1484038248,1484038251,AT -1484038252,1484038255,IQ +1484038252,1484038255,A2 1484038256,1484038391,AT -1484038392,1484038399,IQ +1484038392,1484038399,A2 1484038400,1484128255,AT 1484128256,1484259327,LT 1484259328,1484783615,FR @@ -21673,7 +37712,16 @@ 1484980224,1485045759,SE 1485045760,1485111295,HU 1485111296,1485242367,DE -1485242368,1485307903,GB +1485242368,1485246463,RU +1485246464,1485250559,UA +1485250560,1485254655,IR +1485254656,1485258751,RU +1485258752,1485266943,UA +1485266944,1485271039,RO +1485271040,1485275135,UA +1485275136,1485283327,LV +1485283328,1485291519,PL +1485291520,1485307903,UA 1485307904,1485832191,FR 1485832192,1485963263,GB 1485963264,1486028799,CZ @@ -21682,10 +37730,19 @@ 1486094336,1486127103,ES 1486127104,1486159871,FI 1486159872,1486192639,IS -1486192640,1486225407,IT +1486192640,1486211687,IT +1486211688,1486211695,GB +1486211696,1486225407,IT 1486225408,1486258175,DE -1486258176,1486290943,CS -1486290944,1486292991,IE +1486258176,1486290943,RS +1486290944,1486290959,IE +1486290960,1486291071,GB +1486291072,1486291103,IE +1486291104,1486291199,GB +1486291200,1486291215,IE +1486291216,1486291455,GB +1486291456,1486291487,IE +1486291488,1486292991,GB 1486292992,1486295039,RU 1486295040,1486297087,ES 1486297088,1486299135,IE @@ -21701,37 +37758,44 @@ 1486307328,1486309375,DE 1486309376,1486311423,AT 1486311424,1486313471,IE -1486313472,1486317567,HU -1486317568,1486321663,RU +1486313472,1486315519,RU +1486315520,1486317567,HU +1486317568,1486320383,RU +1486320384,1486320639,US +1486320640,1486321663,RU +1486321664,1486321823,EU 1486321824,1486321855,US 1486321856,1486321887,NL 1486321888,1486321919,US -1486323200,1486323215,US +1486321920,1486323199,EU +1486323200,1486323215,GU 1486323216,1486323231,NL 1486323232,1486323239,GB -1486323712,1486325759,RU +1486323240,1486323447,EU +1486323448,1486323455,GB +1486323456,1486323711,EU +1486323712,1486325759,GB 1486325760,1486327807,SA -1486327808,1486329855,GB +1486327808,1486329855,CH 1486329856,1486331903,FR -1486331904,1486331919,NL -1486331920,1486333951,NO +1486331904,1486333951,NO 1486333952,1486335999,SE 1486336000,1486338047,KZ 1486338048,1486340095,RU +1486340096,1486342143,AZ 1486342144,1486344191,RU -1486344192,1486346239,NO +1486344192,1486346239,ES 1486346240,1486348287,GB -1486348288,1486350335,BH -1486350336,1486352383,TR +1486348288,1486349311,NL +1486349312,1486350335,US +1486350336,1486352383,FR 1486352384,1486354431,BE 1486354432,1486356479,RU 1486356480,1486487551,DE 1486487552,1486618623,UA 1486618624,1486684159,PL 1486684160,1486749695,PT -1486749696,1486787295,RO -1486787296,1486787327,MD -1486787328,1486815231,RO +1486749696,1486815231,RO 1486815232,1486880767,NL 1486880768,1488977919,FR 1488977920,1489240063,FI @@ -21746,7 +37810,40 @@ 1489534976,1489567743,RU 1489567744,1489600511,BH 1489600512,1489633279,RU -1489633280,1489666047,IT +1489633280,1489635327,IT +1489635328,1489635838,GB +1489635839,1489635839,A2 +1489635840,1489636863,IT +1489636864,1489637119,FR +1489637120,1489637887,IT +1489637888,1489638399,A2 +1489638400,1489638655,IT +1489638656,1489638911,FR +1489638912,1489640703,IT +1489640704,1489640959,FR +1489640960,1489642495,IT +1489642496,1489642751,FR +1489642752,1489644543,IT +1489644544,1489645055,A2 +1489645056,1489645567,IT +1489645568,1489646847,A2 +1489646848,1489647103,IT +1489647104,1489647359,A2 +1489647360,1489648639,IT +1489648640,1489649407,A2 +1489649408,1489650687,FR +1489650688,1489651199,A2 +1489651200,1489653759,IT +1489653760,1489657855,A2 +1489657856,1489661951,IT +1489661952,1489662719,A2 +1489662720,1489662975,ZA +1489662976,1489663487,FR +1489663488,1489663999,ES +1489664000,1489664511,LY +1489664512,1489665023,A2 +1489665024,1489665279,ZA +1489665280,1489666047,IT 1489666048,1489698815,GB 1489698816,1489731583,MT 1489731584,1489764351,BG @@ -21759,34 +37856,46 @@ 1489993728,1490026495,LU 1490026496,1490028543,US 1490028544,1490029055,UA -1490029056,1490042879,NL -1490042880,1490049879,CZ +1490029056,1490040839,NL +1490040840,1490041855,UA +1490041856,1490049879,CZ 1490049880,1490049887,AT 1490049888,1490049919,CZ 1490049920,1490049983,PL -1490049984,1490050031,CZ -1490050032,1490050047,SK -1490050048,1490053375,CZ +1490049984,1490053375,CZ 1490053376,1490054143,PL 1490054144,1490059263,CZ 1490059264,1490075647,DE 1490075648,1490092031,GB 1490092032,1490108415,DE -1490108416,1490124799,MC +1490108416,1490113535,MC +1490113536,1490114047,FR +1490114048,1490114559,MC +1490114560,1490124287,FR +1490124288,1490124799,MC 1490124800,1490157567,HU 1490157568,1490173951,RU 1490173952,1490190335,PT -1490190336,1490195455,GB -1490195456,1490196479,IE -1490196480,1490205439,GB -1490205440,1490205471,IE -1490205472,1490205503,GB -1490205504,1490205519,IT -1490205520,1490205535,GB -1490205536,1490205567,IT -1490205568,1490206719,GB +1490190336,1490196479,GB +1490196480,1490196511,FR +1490196512,1490196527,DE +1490196528,1490196543,RS +1490196544,1490196607,GB +1490196608,1490196735,AL +1490196736,1490196863,CZ +1490196864,1490196895,ES +1490196896,1490196927,HU +1490196928,1490196959,IT +1490196960,1490197247,IE +1490197248,1490206719,GB 1490206720,1490223103,GE -1490223104,1490255871,GB +1490223104,1490226047,GB +1490226048,1490226175,FR +1490226176,1490230719,GB +1490230720,1490230751,FR +1490230752,1490235263,GB +1490235264,1490235391,FR +1490235392,1490255871,GB 1490255872,1490272255,NL 1490272256,1490288639,GB 1490288640,1490305023,SK @@ -21803,7 +37912,9 @@ 1490472448,1490472703,US 1490472704,1490473983,GB 1490473984,1490474239,US -1490474240,1490484223,GB +1490474240,1490478591,GB +1490478592,1490478847,RU +1490478848,1490484223,GB 1490484224,1490484479,US 1490484480,1490501631,GB 1490501632,1490518015,DE @@ -21817,20 +37928,26 @@ 1490878464,1490879487,DE 1490879488,1490880511,US 1490880512,1490881535,FR -1490882560,1490883583,US +1490881536,1490885631,EU 1490885632,1490886655,US +1490886656,1490904063,EU 1490904064,1490905087,US +1490905088,1490909183,EU 1490909184,1490910207,US +1490910208,1490913279,EU 1490913280,1490915327,US 1490915328,1490917375,IT 1490917376,1490919423,IL +1490919424,1490927615,EU 1490927616,1490929663,FR +1490929664,1490931711,EU 1490931712,1490933759,DE +1490933760,1490934527,EU 1490934528,1490934783,IL -1490935040,1490935295,ES +1490934784,1490943999,EU 1490944000,1491075071,LT 1491075072,1493172223,TR -1493172224,1493303295,IL +1493172224,1493303295,DE 1493303296,1493434367,FR 1493434368,1493565439,SA 1493565440,1493696511,ES @@ -21857,8 +37974,9 @@ 1494368256,1494376447,IE 1494376448,1494384639,SE 1494384640,1494392831,RU -1494392832,1494399487,NL -1494399488,1494399743,US +1494392832,1494393087,US +1494393088,1494398975,NL +1494398976,1494399743,US 1494399744,1494401023,NL 1494401024,1494409215,LV 1494409216,1494417407,FI @@ -21868,7 +37986,9 @@ 1494441984,1494450175,UA 1494450176,1494458367,DK 1494458368,1494474751,RU -1494474752,1494482943,DE +1494474752,1494477471,DE +1494477472,1494477503,IL +1494477504,1494482943,DE 1494482944,1494499327,RU 1494499328,1494507519,NL 1494507520,1494523903,RU @@ -21880,15 +38000,20 @@ 1494564864,1494573055,UA 1494573056,1494581247,RO 1494581248,1494589439,RU -1494589440,1494589695,NL -1494589696,1494589723,IQ -1494589724,1494596351,NL -1494596352,1494596607,US +1494589440,1494594559,NL +1494594560,1494595071,US +1494595072,1494595327,A2 +1494595328,1494595583,NL +1494595584,1494596607,US 1494596608,1494597119,NL 1494597120,1494597375,US 1494597376,1494597631,NL -1494597632,1494605823,RU +1494597632,1494605823,IT 1494605824,1494614015,GB +1494679552,1494695935,RU +1494695936,1494704127,RS +1494704128,1494736895,RU +1494736896,1494745087,DK 1494745088,1494810623,CZ 1494810624,1494843391,BG 1494843392,1494876159,PL @@ -21909,40 +38034,100 @@ 1495058432,1495060479,UA 1495060480,1495062527,GB 1495062528,1495064575,JO -1495064576,1495066623,DE +1495064576,1495066623,PL 1495066624,1495068671,GB 1495068672,1495070719,DE 1495070720,1495072767,RU 1495072768,1495105535,CZ 1495105536,1495138303,ES -1495138304,1495139583,FR -1495139584,1495139839,GB -1495139840,1495171071,FR -1495171072,1495203839,NL +1495138304,1495139327,FR +1495139328,1495139583,EU +1495139584,1495139591,GB +1495139592,1495139711,EU +1495139712,1495139839,GB +1495139840,1495139871,ES +1495139872,1495139903,FR +1495139904,1495140351,EU +1495140352,1495142399,FR +1495142400,1495146495,EU +1495146496,1495150591,FR +1495150592,1495151103,GB +1495151104,1495151359,NL +1495151360,1495154687,FR +1495154688,1495161599,EU +1495161600,1495161855,FR +1495161856,1495162367,EU +1495162368,1495162879,US +1495162880,1495163903,FR +1495163904,1495164415,EU +1495164416,1495164671,FR +1495164672,1495164927,EU +1495164928,1495165055,FR +1495165056,1495165183,EU +1495165184,1495165199,FR +1495165200,1495165207,EU +1495165208,1495165215,ES +1495165216,1495165439,EU +1495165440,1495168383,FR +1495168384,1495168511,EU +1495168512,1495168767,FR +1495168768,1495169023,GB +1495169024,1495169279,FR +1495169280,1495169535,EU +1495169536,1495169791,FR +1495169792,1495170047,NL +1495170048,1495170079,FR +1495170080,1495170159,EU +1495170160,1495170175,FR +1495170176,1495170303,EU +1495170304,1495170335,FR +1495170336,1495170559,EU +1495170560,1495170815,FR +1495170816,1495171071,GB +1495171072,1495174399,NL +1495174400,1495174655,US +1495174656,1495203839,NL 1495203840,1495205887,DE 1495205888,1495207935,CZ 1495207936,1495209983,RU 1495209984,1495212031,KZ -1495212032,1495214079,DE +1495212032,1495214079,RU 1495214080,1495216127,CZ 1495216128,1495218175,GB 1495218176,1495220223,IT 1495220224,1495222271,PL 1495222272,1495224319,IT 1495224320,1495228415,RU -1495228416,1495230463,GB +1495228416,1495230463,NL 1495230464,1495234559,RU 1495234560,1495236607,CH -1495236608,1495237711,AT +1495236608,1495237247,AT +1495237248,1495237255,EU +1495237256,1495237271,AT +1495237272,1495237375,EU +1495237376,1495237711,AT 1495237712,1495237727,NL -1495237728,1495238655,AT +1495237728,1495237731,AT +1495237732,1495237759,EU +1495237760,1495237775,AT +1495237776,1495237887,EU +1495237888,1495238207,AT +1495238208,1495238223,EU +1495238224,1495238231,AT +1495238232,1495238239,EU +1495238240,1495238255,AT +1495238256,1495238271,EU +1495238272,1495238655,AT 1495238656,1495240703,DE -1495240704,1495242751,FR +1495240704,1495240751,FR +1495240752,1495240759,BE +1495240760,1495240767,CH +1495240768,1495242751,FR 1495242752,1495244799,MK 1495244800,1495246847,CZ 1495246848,1495248895,IE 1495248896,1495250943,GR -1495250944,1495252991,GB +1495250944,1495252991,RU 1495252992,1495255039,BH 1495255040,1495257087,IT 1495257088,1495259135,GB @@ -21968,7 +38153,11 @@ 1495801856,1495802879,GB 1495802880,1495875583,RO 1495875584,1495891967,MD -1495891968,1496078335,RO +1495891968,1495927295,RO +1495927296,1495927551,AE +1495927552,1495937023,RO +1495937024,1495937535,ES +1495937536,1496078335,RO 1496078336,1496079359,MD 1496079360,1496121343,RO 1496121344,1496122367,MD @@ -21994,36 +38183,72 @@ 1500078080,1500086271,GB 1500086272,1500094463,RU 1500094464,1500102655,AT -1500102656,1500103935,NL -1500103936,1500103967,VG -1500103968,1500110847,NL +1500102656,1500104063,NL +1500104064,1500104071,DE +1500104072,1500106527,NL +1500106528,1500106559,DE +1500106560,1500107415,NL +1500107416,1500107423,DE +1500107424,1500107775,NL +1500107776,1500107903,DE +1500107904,1500110847,NL 1500110848,1500119039,UA 1500119040,1500127231,TR -1500127232,1500135423,RU +1500127232,1500135423,FI 1500135424,1500135555,DE 1500135556,1500135559,CH -1500135560,1500143615,DE +1500135560,1500140560,DE +1500140561,1500140564,AT +1500140565,1500140568,CH +1500140569,1500143615,DE 1500143616,1500151807,BG 1500151808,1500153855,GB 1500153856,1500155903,IE 1500155904,1500157951,GB 1500157952,1500159999,DE +1500160000,1500162047,NL 1500162048,1500164095,RU 1500164096,1500166143,GB -1500166144,1500168191,FR +1500166144,1500166399,FR +1500166400,1500166655,DE +1500166656,1500168191,FR 1500168192,1500170239,RU 1500170240,1500172287,LU 1500172288,1500174335,AT 1500174336,1500176383,DE 1500176384,1500178431,GB 1500178432,1500180479,KZ -1500180480,1500182527,BE +1500180480,1500180619,NL +1500180620,1500181503,BE +1500181504,1500182527,NL 1500182528,1500184575,RU -1500184576,1500186623,GB +1500184576,1500184831,GB +1500184832,1500184895,IM +1500184896,1500184919,GB +1500184920,1500184943,IM +1500184944,1500185007,GB +1500185008,1500185023,IM +1500185024,1500185047,GB +1500185048,1500185055,IM +1500185056,1500185063,GB +1500185064,1500185071,IM +1500185072,1500185079,GB +1500185080,1500185087,IM +1500185088,1500185119,GB +1500185120,1500185199,IM +1500185200,1500185207,GB +1500185208,1500185231,IM +1500185232,1500185247,GB +1500185248,1500185279,IM +1500185280,1500185287,GB +1500185288,1500185311,IM +1500185312,1500185319,GB +1500185320,1500185327,IM +1500185328,1500185335,GB +1500185336,1500186623,IM 1500186624,1500188671,KW 1500188672,1500190719,GB -1500190720,1500192767,RU -1500192768,1500194815,SI +1500190720,1500194815,RU 1500194816,1500196863,GB 1500196864,1500198911,ES 1500198912,1500200959,GB @@ -22032,12 +38257,13 @@ 1500205056,1500207103,RU 1500207104,1500209151,IT 1500209152,1500211199,KZ -1500211200,1500217343,RU +1500211200,1500213247,IT +1500213248,1500217343,RU 1500217344,1500217599,CZ 1500217600,1500218111,DE 1500218112,1500218367,CZ 1500218368,1500219391,DE -1500219392,1500221439,RU +1500219392,1500221439,FR 1500221440,1500223487,SK 1500223488,1500225535,PL 1500225536,1500227583,DE @@ -22046,29 +38272,30 @@ 1500231680,1500233727,DE 1500233728,1500237823,RU 1500237824,1500241919,SE -1500241920,1500243967,TR +1500241920,1500242483,TR +1500242484,1500242485,US +1500242486,1500242801,TR +1500242802,1500242814,US +1500242815,1500243008,TR +1500243009,1500243038,GB +1500243039,1500243967,TR 1500243968,1500246015,GB 1500246016,1500248063,ES -1500248064,1500250111,GB +1500248064,1500250111,HU 1500250112,1500266495,SA 1500266496,1500282879,RU 1500282880,1500299263,LB 1500299264,1500315647,PL 1500315648,1500332031,RU 1500332032,1500348415,PT -1500348416,1500397567,RU -1500397568,1500399615,UA -1500399616,1500413951,RU +1500348416,1500413951,RU 1500413952,1500430335,DE -1500430336,1500430847,RS -1500430848,1500431359,CS -1500431360,1500433407,RS -1500433408,1500433919,CS -1500433920,1500434175,RS -1500434176,1500438015,CS -1500438016,1500438527,RS -1500438528,1500446719,CS -1500446720,1500463103,LV +1500430336,1500446719,RS +1500446720,1500447743,LV +1500447744,1500447999,LT +1500448000,1500448511,LV +1500448512,1500448767,LT +1500448768,1500463103,LV 1500463104,1500479487,CZ 1500479488,1500495871,RU 1500495872,1500512255,BA @@ -22083,9 +38310,10 @@ 1502085120,1502216191,RO 1502216192,1502347263,IL 1502347264,1502478335,ES -1502478336,1502609407,SI -1502609408,1502610175,AT -1502610176,1502625791,DE +1502478336,1502605311,SI +1502605312,1502606335,HR +1502606336,1502609407,SI +1502609408,1502625791,DE 1502625792,1502642175,SA 1502642176,1502658559,IR 1502658560,1502674943,AT @@ -22098,7 +38326,15 @@ 1502740480,1502756863,NL 1502756864,1502773247,UZ 1502773248,1502789631,BA -1502789632,1502806015,DE +1502789632,1502791551,DE +1502791552,1502791679,PL +1502791680,1502793503,DE +1502793504,1502793511,NL +1502793512,1502794239,DE +1502794240,1502794495,NL +1502794496,1502795767,DE +1502795768,1502795771,NL +1502795772,1502806015,DE 1502806016,1502822399,SA 1502822400,1502838783,HU 1502838784,1502855167,SE @@ -22110,34 +38346,43 @@ 1502937088,1502953471,RO 1502953472,1502969855,MD 1502969856,1502975231,US -1502975232,1502975247,DE -1502975248,1502975295,IE -1502975296,1502975311,DE +1502975232,1502975247,FR +1502975248,1502975263,IE +1502975264,1502975311,FR 1502975312,1502975319,IE -1502975320,1502975327,DE +1502975320,1502975327,FR 1502975328,1502975375,IE -1502975376,1502975383,DE +1502975376,1502975383,FR 1502975384,1502975391,ES -1502975392,1502975423,DE -1502975424,1502975487,IE +1502975392,1502975423,FR +1502975424,1502975455,GB +1502975456,1502975487,IE 1502975488,1502975743,ES 1502975744,1502975775,IE -1502975776,1502975999,DE +1502975776,1502975999,FR 1502976000,1502977055,US -1502977056,1502977279,DE -1502977280,1502978047,US -1502978048,1502979103,DE +1502977056,1502977279,FR +1502977280,1502979071,US +1502979072,1502979103,FR 1502979104,1502979111,ES -1502979112,1502979119,DE -1502979120,1502979215,ES -1502979216,1502979327,DE -1502979328,1502980095,ES +1502979112,1502979119,FR +1502979120,1502979135,ES +1502979136,1502979199,FR +1502979200,1502979215,ES +1502979216,1502979327,FR +1502979328,1502979583,US +1502979584,1502980095,FR 1502980096,1502980159,US -1502980160,1502980351,DE +1502980160,1502980351,FR 1502980352,1502980871,US -1502980872,1502981119,DE -1502981120,1502982143,US -1502982144,1502986255,DE +1502980872,1502980927,FR +1502980928,1502980991,US +1502980992,1502981119,FR +1502981120,1502981887,US +1502981888,1502982143,NL +1502982144,1502982911,DE +1502982912,1502983679,FR +1502983680,1502986255,DE 1502986256,1502986495,TR 1502986496,1502986511,DE 1502986512,1502986751,PL @@ -22145,31 +38390,26 @@ 1502987776,1502988031,TR 1502988032,1502989055,DE 1502989056,1502989567,TR -1502989568,1502989823,GB -1502989824,1502990847,DE +1502989568,1502990847,DE 1502990848,1502991103,PL 1502991104,1502991359,DE 1502991360,1502991615,PL -1502991616,1502991871,DE -1502991872,1502992127,GB -1502992128,1502993919,DE -1502993920,1502994431,PL -1502994432,1502994687,GB +1502991616,1502994687,DE 1502994688,1502994943,PL 1502994944,1502995967,DE 1502995968,1502996479,PL -1502996480,1502996735,GB +1502996480,1502996735,DE 1502996736,1502997247,PL 1502997248,1502997503,LT -1502997504,1502997759,ME -1502997760,1502998271,DE -1502998272,1502998783,GB -1502998784,1503000063,DE +1502997504,1502997759,HK +1502997760,1503000063,DE 1503000064,1503000319,PL 1503000320,1503000831,DE 1503000832,1503001343,PL 1503001344,1503002623,DE -1503002624,1503019007,GE +1503002624,1503006719,GE +1503006720,1503010815,GB +1503010816,1503019007,IT 1503019008,1503051775,DK 1503051776,1503068159,SE 1503068160,1503084543,PL @@ -22184,9 +38424,57 @@ 1503789056,1503821823,NO 1503821824,1503854591,UA 1503854592,1503887359,RU -1503887360,1503902975,DE -1503902976,1503903231,FI -1503903232,1503908351,DE +1503887360,1503895607,DE +1503895608,1503895623,NL +1503895624,1503895631,DE +1503895632,1503895639,AT +1503895640,1503895671,DE +1503895672,1503895679,PL +1503895680,1503895767,DE +1503895768,1503895783,IT +1503895784,1503895799,DE +1503895800,1503895807,CA +1503895808,1503896175,DE +1503896176,1503896183,NL +1503896184,1503896351,DE +1503896352,1503896359,AT +1503896360,1503896367,CH +1503896368,1503896375,DE +1503896376,1503896383,CH +1503896384,1503896415,DE +1503896416,1503896423,GR +1503896424,1503896439,DE +1503896440,1503896447,NO +1503896448,1503896543,DE +1503896544,1503896551,FR +1503896552,1503896559,AT +1503896560,1503897303,DE +1503897304,1503897311,BE +1503897312,1503897367,DE +1503897368,1503897375,BE +1503897376,1503897383,GR +1503897384,1503897391,DE +1503897392,1503897399,CH +1503897400,1503897407,DE +1503897408,1503897415,IT +1503897416,1503897423,CH +1503897424,1503897431,DE +1503897432,1503897439,IT +1503897440,1503897463,DE +1503897464,1503897471,GR +1503897472,1503897479,AT +1503897480,1503897575,DE +1503897576,1503897583,GB +1503897584,1503898119,DE +1503898120,1503898135,TH +1503898136,1503898167,DE +1503898168,1503898175,RO +1503898176,1503898183,IT +1503898184,1503898191,AT +1503898192,1503898199,GR +1503898200,1503898207,US +1503898208,1503898215,BE +1503898216,1503908351,DE 1503908352,1503909375,IT 1503909376,1503920127,DE 1503920128,1503985663,HR @@ -22195,37 +38483,35 @@ 1504051200,1504083967,FI 1504083968,1504116735,DE 1504116736,1504149503,PL -1504149504,1504151647,GB -1504151648,1504151679,IE -1504151680,1504152127,GB +1504149504,1504152127,GB 1504152128,1504152191,IE -1504152192,1504152447,GB +1504152192,1504152415,GB +1504152416,1504152431,IE +1504152432,1504152447,GB 1504152448,1504152575,IE -1504152576,1504153855,GB -1504153856,1504154111,IE -1504154112,1504154367,GB -1504154368,1504154623,IE -1504154624,1504156927,GB +1504152576,1504154623,GB +1504154624,1504155647,IE +1504155648,1504156927,GB 1504156928,1504157183,IE -1504157184,1504160255,GB -1504160256,1504161023,IE -1504161024,1504161279,GB +1504157184,1504161279,GB 1504161280,1504161535,IE 1504161536,1504164607,GB -1504164608,1504165887,IE -1504165888,1504169983,GB +1504164608,1504164863,IE +1504164864,1504169983,GB 1504169984,1504170239,IE -1504170240,1504171775,GB +1504170240,1504171007,GB +1504171008,1504171263,PT +1504171264,1504171775,GB 1504171776,1504172031,US 1504172032,1504173055,GB 1504173056,1504173311,IE 1504173312,1504174591,GB 1504174592,1504175103,IE -1504175104,1504175615,GB -1504175616,1504175871,IE -1504175872,1504176383,GB +1504175104,1504176383,GB 1504176384,1504176639,IE -1504176640,1504247807,GB +1504176640,1504178431,GB +1504178432,1504178687,IE +1504178688,1504247807,GB 1504247808,1504313343,RU 1504313344,1504378879,FR 1504378880,1504444415,PL @@ -22239,18 +38525,76 @@ 1505099776,1505230847,DE 1505230848,1505239039,RU 1505239040,1505247231,IE -1505247232,1505255423,LV +1505247232,1505255423,UA 1505255424,1505263615,IT 1505263616,1505271807,DK 1505271808,1505273087,NL 1505273088,1505273095,NZ 1505273096,1505279999,NL -1505280000,1505296383,RU +1505280000,1505280007,IR +1505280008,1505284863,AE +1505284864,1505288191,IR +1505288192,1505296383,RU 1505296384,1505304575,UA -1505304576,1505312767,FR +1505304576,1505305198,FR +1505305199,1505305199,DK +1505305200,1505305200,BE +1505305201,1505305201,NL +1505305202,1505305202,GB +1505305203,1505305203,CA +1505305204,1505305204,FR +1505305205,1505305205,CH +1505305206,1505305206,DE +1505305207,1505305207,AT +1505305208,1505305208,IT +1505305209,1505305209,ES +1505305210,1505305210,SE +1505305211,1505305211,NO +1505305212,1505305878,FR +1505305879,1505305879,US +1505305880,1505305880,ES +1505305881,1505305899,FR +1505305900,1505305900,GB +1505305901,1505305901,DE +1505305902,1505305902,IT +1505305903,1505305908,FR +1505305909,1505305909,LU +1505305910,1505306303,FR +1505306304,1505306319,ES +1505306320,1505306335,DE +1505306336,1505306351,GB +1505306352,1505306367,IT +1505306368,1505312767,FR 1505312768,1505320959,RU -1505320960,1505329151,AT -1505329152,1505337343,GB +1505320960,1505321151,AT +1505321152,1505321183,DE +1505321184,1505321343,AT +1505321344,1505321471,DE +1505321472,1505321631,AT +1505321632,1505321823,DE +1505321824,1505321831,AT +1505321832,1505321983,DE +1505321984,1505322287,AT +1505322288,1505322415,DE +1505322416,1505322879,AT +1505322880,1505325055,DE +1505325056,1505329151,AT +1505329152,1505329215,GB +1505329216,1505329375,IE +1505329376,1505329407,GB +1505329408,1505332991,IE +1505332992,1505332999,GB +1505333000,1505333623,IE +1505333624,1505333631,GB +1505333632,1505336063,IE +1505336064,1505336071,GB +1505336072,1505336831,IE +1505336832,1505336863,GB +1505336864,1505336864,IE +1505336865,1505336879,GB +1505336880,1505337087,IE +1505337088,1505337215,GB +1505337216,1505337343,IE 1505337344,1505345535,FR 1505345536,1505353727,MK 1505353728,1505359663,CZ @@ -22270,17 +38614,39 @@ 1505419264,1505427455,RU 1505427456,1505435647,UA 1505435648,1505443839,MD -1505443840,1505453311,GB -1505453312,1505453439,US -1505453440,1505453567,GB -1505453568,1505454079,US -1505454080,1505460223,GB +1505443840,1505452327,GB +1505452328,1505452335,NO +1505452336,1505454367,GB +1505454368,1505454375,US +1505454376,1505454383,GB +1505454384,1505454391,US +1505454392,1505454399,SG +1505454400,1505454463,GB +1505454464,1505454495,AU +1505454496,1505454511,GB +1505454512,1505454527,DE +1505454528,1505454543,NZ +1505454544,1505454911,GB +1505454912,1505454943,CZ +1505454944,1505454959,GB +1505454960,1505454975,IE +1505454976,1505455103,US +1505455104,1505455503,GB +1505455504,1505455519,NL +1505455520,1505456127,GB +1505456128,1505456255,US +1505456256,1505456639,GB +1505456640,1505456895,US +1505456896,1505456927,GB +1505456928,1505456935,US +1505456936,1505458175,GB +1505458176,1505458431,US +1505458432,1505460223,GB 1505460224,1505476607,CZ 1505476608,1505484799,RU 1505484800,1505492991,PL 1505492992,1505501183,NL -1505501184,1505505279,ME -1505505280,1505509375,CS +1505501184,1505509375,ME 1505509376,1505517567,SA 1505517568,1505525759,RU 1505525760,1505533951,IT @@ -22289,23 +38655,32 @@ 1505550336,1505566719,RU 1505566720,1505574911,IT 1505574912,1505583103,YE -1505583104,1505591295,HU -1505591296,1505607679,RU +1505583104,1505607679,RU 1505607680,1505615871,SE 1505615872,1505624063,SA 1505624064,1505632255,FI 1505632256,1505648639,CZ 1505648640,1505656831,LT 1505656832,1505665023,BH -1505665024,1505673215,IT +1505665024,1505668263,IT +1505668264,1505668267,DE +1505668268,1505670615,IT +1505670616,1505670623,US +1505670624,1505673215,IT 1505673216,1505681407,BG 1505681408,1505689599,RU 1505689600,1505697791,NO 1505697792,1505705983,IE -1505705984,1505714175,DE +1505705984,1505707327,DE +1505707328,1505707519,AT +1505707520,1505708543,DE +1505708544,1505709055,AT +1505709056,1505714175,DE 1505714176,1505722367,LV 1505722368,1505738751,PL -1505738752,1505746943,GB +1505738752,1505745839,GB +1505745840,1505745855,IL +1505745856,1505746943,GB 1505746944,1505755135,RU 1505755136,1506017279,GB 1506017280,1506279423,DE @@ -22324,12 +38699,50 @@ 1506342912,1506344959,UA 1506344960,1506377727,LV 1506377728,1506410495,HR -1506410496,1506440703,DE +1506410496,1506427663,DE +1506427664,1506427679,GB +1506427680,1506428223,DE +1506428224,1506428239,US +1506428240,1506437375,DE +1506437376,1506437503,US +1506437504,1506437631,DE +1506437632,1506437887,MU +1506437888,1506437903,CA +1506437904,1506437951,US +1506437952,1506437983,DE +1506437984,1506437991,US +1506437992,1506437999,DE +1506438000,1506438015,CA +1506438016,1506438019,US +1506438020,1506438143,DE +1506438144,1506438271,HK +1506438272,1506438367,GB +1506438368,1506438384,IL +1506438385,1506438399,DE +1506438400,1506438527,US +1506438528,1506438783,DE +1506438784,1506438799,KR +1506438800,1506438847,DE +1506438848,1506438863,US +1506438864,1506438871,DE +1506438872,1506438879,FR +1506438880,1506438883,US +1506438884,1506438911,DE +1506438912,1506439039,US +1506439040,1506439463,DE +1506439464,1506439471,GB +1506439472,1506439935,DE +1506439936,1506440191,US +1506440192,1506440447,DE +1506440448,1506440575,US +1506440576,1506440703,DE 1506440704,1506440711,US -1506440712,1506440719,DE +1506440712,1506440719,FR 1506440720,1506440735,US 1506440736,1506440767,GB -1506440768,1506440959,DE +1506440768,1506440799,US +1506440800,1506440831,DE +1506440832,1506440959,US 1506440960,1506440991,FR 1506440992,1506440999,US 1506441000,1506441007,GB @@ -22338,20 +38751,27 @@ 1506441088,1506441215,CA 1506441216,1506441343,US 1506441344,1506441407,HK -1506441408,1506441495,DE +1506441408,1506441415,DE +1506441416,1506441423,FR +1506441424,1506441495,DE 1506441496,1506441503,GB 1506441504,1506441535,US 1506441536,1506441599,DE 1506441600,1506441631,US -1506441632,1506441655,DE -1506441656,1506441663,GB +1506441632,1506441647,DE +1506441648,1506441663,GB 1506441664,1506441671,NL 1506441672,1506441679,CA 1506441680,1506441695,DE 1506441696,1506441727,CA 1506441728,1506442239,MU -1506442240,1506442367,US -1506442368,1506442623,DE +1506442240,1506442383,US +1506442384,1506442399,GB +1506442400,1506442415,FR +1506442416,1506442427,US +1506442428,1506442431,DE +1506442432,1506442463,HK +1506442464,1506442623,DE 1506442624,1506442655,GB 1506442656,1506442687,US 1506442688,1506442703,GB @@ -22368,92 +38788,128 @@ 1506442924,1506442927,NL 1506442928,1506442975,US 1506442976,1506442991,DE -1506442992,1506442995,GB -1506442996,1506442999,DE +1506442992,1506442999,GB 1506443000,1506443003,IE 1506443004,1506443151,DE -1506443152,1506443167,US +1506443152,1506443159,US +1506443160,1506443167,GB 1506443168,1506443183,NL 1506443184,1506443199,DE 1506443200,1506443263,US 1506443264,1506444287,GB 1506444288,1506445311,DE -1506445312,1506445519,FR +1506445312,1506445337,FR +1506445338,1506445343,GB +1506445344,1506445375,FR +1506445376,1506445407,GB +1506445408,1506445519,FR 1506445520,1506445527,GB 1506445528,1506445703,FR 1506445704,1506445711,NL -1506445712,1506446335,FR +1506445712,1506445719,GB +1506445720,1506445759,FR +1506445760,1506445767,GB +1506445768,1506445775,FR +1506445776,1506445791,GB +1506445792,1506445807,FR +1506445808,1506445823,GB +1506445824,1506446159,FR +1506446160,1506446175,GB +1506446176,1506446335,FR 1506446336,1506447359,NL 1506447360,1506448383,IT -1506448384,1506448663,AT +1506448384,1506448639,AT +1506448640,1506448647,GB +1506448648,1506448663,AT 1506448664,1506448671,GB -1506448672,1506448719,AT -1506448720,1506448727,GB +1506448672,1506448703,AT +1506448704,1506448727,GB 1506448728,1506448735,AT 1506448736,1506448895,GB -1506448896,1506449295,BE -1506449296,1506449407,GB +1506448896,1506449159,BE +1506449160,1506449171,GB +1506449172,1506449407,BE 1506449408,1506449663,NL 1506449664,1506449919,SK -1506449920,1506449935,GB +1506449920,1506449927,CH +1506449928,1506449935,GB 1506449936,1506450431,CH -1506450432,1506450771,CZ -1506450772,1506450775,GB -1506450776,1506450911,CZ -1506450912,1506450943,GB +1506450432,1506450767,CZ +1506450768,1506450847,GB +1506450848,1506450863,CZ +1506450864,1506450879,GB +1506450880,1506450943,CZ 1506450944,1506451007,DK 1506451008,1506451199,GB -1506451200,1506451899,ES -1506451900,1506451903,GB +1506451200,1506451895,ES +1506451896,1506451903,GB 1506451904,1506452223,ES 1506452224,1506452479,GB 1506452480,1506452735,US -1506452736,1506452767,RO -1506452768,1506452991,GB +1506452736,1506452743,RO +1506452744,1506452991,GB 1506452992,1506453247,AT 1506453248,1506453391,SE -1506453392,1506453503,GB +1506453392,1506453399,ES +1506453400,1506453415,SE +1506453416,1506453423,GB +1506453424,1506453439,SE +1506453440,1506453455,GB +1506453456,1506453471,SE +1506453472,1506453503,GB 1506453504,1506453759,DE 1506453760,1506454015,FR -1506454016,1506454271,SK +1506454016,1506454271,AT 1506454272,1506454527,ES -1506454528,1506455039,US +1506454528,1506454783,IT +1506454784,1506455039,US 1506455040,1506455295,GB 1506455296,1506455551,IT -1506455552,1506455807,US -1506455808,1506456063,AE +1506455552,1506456063,AE 1506456064,1506456319,HU 1506456320,1506456575,IT -1506456576,1506456831,LU -1506456832,1506457087,IT +1506456576,1506456831,IE +1506456832,1506456847,IT +1506456848,1506456863,GB +1506456864,1506457087,IT 1506457088,1506458239,GB 1506458240,1506458623,CH 1506458624,1506459135,GB 1506459136,1506459647,BE -1506459648,1506460339,FR -1506460340,1506460343,GB +1506459648,1506460047,FR +1506460048,1506460055,GB +1506460056,1506460063,FR +1506460064,1506460079,GB +1506460080,1506460126,FR +1506460127,1506460127,GB +1506460128,1506460335,FR +1506460336,1506460343,GB 1506460344,1506460671,FR 1506460672,1506460927,AT -1506460928,1506461351,IT +1506460928,1506461311,IT +1506461312,1506461315,GB +1506461316,1506461319,IT +1506461320,1506461327,GB +1506461328,1506461351,IT 1506461352,1506461359,FR 1506461360,1506461695,IT -1506461696,1506462207,FR +1506461696,1506461863,FR +1506461864,1506461887,GB +1506461888,1506462207,FR 1506462208,1506462463,ES -1506462464,1506462719,FR +1506462464,1506462607,FR +1506462608,1506462623,A2 +1506462624,1506462719,FR 1506462720,1506463231,IT 1506463232,1506463487,SE -1506463488,1506463679,DE -1506463680,1506463743,GB -1506463744,1506463999,DE +1506463488,1506463999,DE 1506464000,1506464767,GB -1506464768,1506465087,NL -1506465088,1506465151,DE -1506465152,1506465279,NL +1506464768,1506465279,NL 1506465280,1506465791,GB 1506465792,1506466047,DE 1506466048,1506466303,BE -1506466304,1506466391,DE -1506466392,1506467071,GB +1506466304,1506466559,DE +1506466560,1506467071,GB 1506467072,1506467327,DE 1506467328,1506467583,GB 1506467584,1506468351,IT @@ -22463,15 +38919,25 @@ 1506470144,1506470399,GB 1506470400,1506470655,DE 1506470656,1506471679,IT -1506471680,1506471935,SK -1506471936,1506472447,NL +1506471680,1506471935,GB +1506471936,1506471975,NL +1506471976,1506471979,GB +1506471980,1506471999,NL +1506472000,1506472031,BE +1506472032,1506472191,NL +1506472192,1506472447,IT 1506472448,1506472703,GB 1506472704,1506473215,IT 1506473216,1506473471,GB -1506473472,1506474495,IT +1506473472,1506474271,IT +1506474272,1506474303,SE +1506474304,1506474495,IT 1506474496,1506474751,FR -1506474752,1506475519,IT -1506475520,1506476031,AT +1506474752,1506474879,IT +1506474880,1506475007,GB +1506475008,1506475519,IT +1506475520,1506475527,AT +1506475528,1506476031,GB 1506476032,1506508799,KW 1506508800,1506541567,CZ 1506541568,1506574335,RU @@ -22483,10 +38949,14 @@ 1506689024,1506705407,CH 1506705408,1506740223,GB 1506740224,1506742271,FI -1506742272,1506744319,SE +1506742272,1506743167,SE +1506743168,1506743183,DE +1506743184,1506743199,FR +1506743200,1506743215,IE +1506743216,1506743232,GB +1506743233,1506744319,SE 1506744320,1506746367,NL -1506746368,1506748415,FI -1506748416,1506750463,RU +1506746368,1506750463,RU 1506750464,1506752511,GB 1506752512,1506754559,IE 1506754560,1506758655,RU @@ -22496,21 +38966,29 @@ 1506766848,1506766903,NO 1506766904,1506768895,GE 1506768896,1506770943,AT -1506770944,1506775039,GB +1506770944,1506772991,NL +1506772992,1506775039,GB 1506775040,1506777087,AT -1506777088,1506783231,GB +1506777088,1506781695,GB +1506781696,1506781759,IE +1506781760,1506781823,US +1506781824,1506781887,ZA +1506781888,1506781951,AU +1506781952,1506783231,GB 1506783232,1506785279,RU 1506785280,1506787327,UA -1506787328,1506789375,KW +1506787328,1506789375,ME 1506789376,1506791423,DE 1506791424,1506793471,GB 1506793472,1506795519,RU 1506795520,1506797567,IE 1506797568,1506799615,ES 1506799616,1506801663,LV -1506801664,1506803007,DE -1506803008,1506803071,AT -1506803072,1506803711,DE +1506801664,1506802767,DE +1506802768,1506802775,DK +1506802776,1506803135,DE +1506803136,1506803151,CH +1506803152,1506803711,DE 1506803712,1506869247,RU 1506869248,1506934783,UA 1506934784,1507000319,GR @@ -22519,36 +38997,28 @@ 1507131392,1507196927,GB 1507196928,1507262463,PT 1507262464,1507327999,BG -1507328000,1507332095,RS -1507332096,1507334655,CS -1507334656,1507336191,RS -1507336192,1507336511,CS -1507336512,1507336703,RS -1507336704,1507337727,SR -1507337728,1507337983,RS -1507337984,1507338751,CS -1507338752,1507360767,RS -1507360768,1507377151,CS -1507377152,1507390719,RS -1507390720,1507391487,SR -1507391488,1507393535,RS +1507328000,1507393535,RS 1507393536,1507459071,CH 1507459072,1507524607,KZ 1507524608,1507590143,EE 1507590144,1507655679,NL -1507655680,1507659775,DE +1507655680,1507659119,DE +1507659120,1507659135,TR +1507659136,1507659775,DE 1507659776,1507663871,RU 1507663872,1507664127,IT 1507664128,1507664383,GR 1507664384,1507664767,DE 1507664768,1507664895,US -1507664896,1507665663,GR +1507664896,1507665407,GR +1507665408,1507665663,IT 1507665664,1507666431,US 1507666432,1507666559,GR 1507666560,1507666591,FR -1507666592,1507666655,GR -1507666656,1507666671,IL -1507666672,1507666943,GB +1507666592,1507666639,GR +1507666640,1507666655,IL +1507666656,1507666687,SG +1507666688,1507666943,GB 1507666944,1507667455,IT 1507667456,1507667711,DE 1507667712,1507667967,US @@ -22563,7 +39033,9 @@ 1507704832,1507708927,RU 1507708928,1507713023,CZ 1507713024,1507717119,RU -1507717120,1507721215,SE +1507717120,1507717631,SE +1507717632,1507718911,NO +1507718912,1507721215,SE 1507721216,1507753983,GB 1507753984,1507819519,RU 1507819520,1507852287,HU @@ -22573,35 +39045,47 @@ 1508392960,1508442111,RU 1508442112,1508458495,DK 1508458496,1508474879,RU -1508474880,1508491263,CZ +1508474880,1508479263,CZ +1508479264,1508479295,GB +1508479296,1508486463,CZ +1508486464,1508486527,DE +1508486528,1508491263,CZ 1508491264,1508507647,SE -1508507648,1508515887,GB -1508515888,1508515895,IE -1508515896,1508519967,GB -1508519968,1508519983,IE -1508519984,1508521535,GB +1508507648,1508514063,GB +1508514064,1508514071,A2 +1508514072,1508521535,GB 1508521536,1508521551,IE 1508521552,1508524031,GB 1508524032,1508540415,IE 1508540416,1508556799,FR 1508556800,1508573183,PL -1508573184,1508589567,CZ +1508573184,1508573255,CZ +1508573256,1508573259,SK +1508573260,1508589567,CZ 1508589568,1508605951,IR 1508605952,1508622335,RU 1508622336,1508638719,EE 1508638720,1508639231,SE -1508639232,1508639743,DK -1508639744,1508640255,SE -1508640256,1508640767,DK +1508639232,1508640767,DK 1508640768,1508641279,SE -1508641280,1508641791,DK -1508641792,1508642175,SE +1508641280,1508641535,DK +1508641536,1508642175,SE 1508642176,1508642303,DK 1508642304,1508642559,SE 1508642560,1508642815,DK -1508642816,1508646527,SE -1508646528,1508646655,DK -1508646656,1508655103,SE +1508642816,1508646911,SE +1508646912,1508646927,DK +1508646928,1508646935,SE +1508646936,1508647015,DK +1508647016,1508648447,SE +1508648448,1508648703,DK +1508648704,1508650751,SE +1508650752,1508650815,DK +1508650816,1508650879,SE +1508650880,1508651263,DK +1508651264,1508652543,SE +1508652544,1508654079,DK +1508654080,1508655103,SE 1508655104,1508671487,FI 1508671488,1508687871,CH 1508687872,1508704255,UZ @@ -22612,18 +39096,16 @@ 1508769792,1508786175,PL 1508786176,1508787199,DE 1508787200,1508787455,ES -1508787456,1508787647,DE -1508787648,1508787679,LU -1508787680,1508788031,DE +1508787456,1508788031,DE 1508788032,1508788063,BE 1508788064,1508802559,DE -1508802560,1508803183,GB -1508803184,1508803199,FR -1508803200,1508804783,GB +1508802560,1508804783,GB 1508804784,1508804791,DE 1508804792,1508805119,GB 1508805120,1508805375,NL -1508805376,1508818943,GB +1508805376,1508809263,GB +1508809264,1508809271,FR +1508809272,1508818943,GB 1508818944,1508835327,RO 1508835328,1508851711,CZ 1508851712,1508868095,PL @@ -22634,31 +39116,44 @@ 1509425152,1509429247,NO 1509429248,1509433343,GB 1509433344,1509437439,CH -1509437440,1509441535,IT -1509441536,1509445631,GB +1509437440,1509443583,GB +1509443584,1509445631,FR 1509445632,1509449727,LV 1509449728,1509453823,ES 1509453824,1509457919,RU -1509457920,1509462015,GB +1509457920,1509462015,NL 1509462016,1509465599,LI 1509465600,1509466111,CH 1509466112,1509466879,NL -1509466880,1509466911,IN +1509466880,1509466911,FR 1509466912,1509467055,NL 1509467056,1509467103,SE -1509467104,1509469823,NL -1509469824,1509469887,IN +1509467104,1509467399,NL +1509467400,1509467407,PL +1509467408,1509467423,NL +1509467424,1509467455,PL +1509467456,1509467487,NL +1509467488,1509467519,PL +1509467520,1509467583,BE +1509467584,1509467839,NL +1509467840,1509467871,PL +1509467872,1509469439,NL +1509469440,1509469567,SE +1509469568,1509469887,NL 1509469888,1509469919,MY -1509469920,1509469951,NL -1509469952,1509470079,RU -1509470080,1509470207,NL +1509469920,1509470207,NL 1509470208,1509478399,RU 1509478400,1509482495,FR 1509482496,1509486591,RU -1509486592,1509490687,CZ +1509486592,1509489407,CZ +1509489408,1509489535,DE +1509489536,1509490687,CZ 1509490688,1509494783,DK 1509494784,1509498879,RU -1509498880,1509501151,CH +1509498880,1509499391,CH +1509499392,1509500671,DE +1509500672,1509500927,CH +1509500928,1509501151,DE 1509501152,1509501159,GB 1509501160,1509502975,CH 1509502976,1509507071,RU @@ -22669,7 +39164,9 @@ 1509531648,1509535743,GB 1509535744,1509539839,RU 1509539840,1509543935,AM -1509543936,1509548031,LB +1509543936,1509543975,LB +1509543976,1509543983,DE +1509543984,1509548031,LB 1509548032,1509564415,RU 1509564416,1509568511,GB 1509568512,1509572607,FI @@ -22687,7 +39184,9 @@ 1509605376,1509609471,PL 1509609472,1509617663,RU 1509617664,1509621759,CZ -1509621760,1509625855,NL +1509621760,1509624319,NL +1509624320,1509624831,US +1509624832,1509625855,NL 1509625856,1509629951,UA 1509629952,1509634047,HU 1509634048,1509638143,FR @@ -22701,7 +39200,8 @@ 1509658624,1509666815,RU 1509666816,1509670911,IT 1509670912,1509675007,GB -1509675008,1509679103,NO +1509675008,1509677823,NO +1509677824,1509679103,GB 1509679104,1509683199,ES 1509683200,1509687295,CH 1509687296,1509703679,UA @@ -22719,61 +39219,105 @@ 1509900288,1509916671,RU 1509916672,1509933055,GB 1509933056,1509949439,US -1509949440,1518338047,FR +1509949440,1515467007,FR +1515467008,1515467263,ES +1515467264,1515467519,FR +1515467520,1515468031,US +1515468032,1515468287,ES +1515468288,1515486975,FR +1515486976,1515487231,CD +1515487232,1515487359,HK +1515487360,1515487999,FR +1515488000,1515488255,HK +1515488256,1515519743,FR +1515519744,1515519999,ES +1515520000,1518338047,FR 1518338048,1518370815,DE 1518370816,1518403583,NL -1518403584,1518419967,LU -1518419968,1518436351,PL -1518436352,1518437375,BE -1518437376,1518452735,SE +1518403584,1518452735,SE 1518452736,1518460927,AT -1518460928,1518469119,PL -1518469120,1518501887,SE -1518501888,1518502911,RU -1518502912,1518503935,SE -1518503936,1518504959,RU +1518460928,1518501887,SE +1518501888,1518503935,EE +1518503936,1518504959,LT 1518504960,1518505983,SE -1518505984,1518508031,RU +1518505984,1518508031,LT 1518508032,1518510079,SE -1518510080,1518514175,RU -1518514176,1518534655,SE -1518534656,1518731263,IT +1518510080,1518514175,LV +1518514176,1518665727,SE +1518665728,1518727167,RU +1518727168,1518731263,SE 1518731264,1518927871,DE 1518927872,1518944255,RU -1518944256,1518962687,SE +1518944256,1518960639,SE +1518960640,1518961663,LT +1518961664,1518962175,EE +1518962176,1518962687,LV 1518962688,1518964735,NO -1518964736,1518993407,SE -1518993408,1519058943,RU -1519058944,1519124479,SE -1519124480,1519222783,PL -1519222784,1519386623,SE -1519386624,1519452159,FR +1518964736,1518966783,HR +1518966784,1518967807,SE +1518967808,1518969855,HR +1518969856,1518993407,SE +1518993408,1519190015,RU +1519190016,1519321087,SE +1519321088,1519386623,RU +1519386624,1519452159,SE 1519452160,1519517695,NL 1519517696,1519583231,AT 1519583232,1519648767,IT 1519648768,1519714303,SA 1519714304,1519779839,NO 1519779840,1519910911,RU -1519910912,1519927303,GB -1519927304,1519927311,FR +1519910912,1519927295,GB +1519927296,1519927311,FR 1519927312,1519927319,BE -1519927320,1519927359,GB -1519927360,1519927375,NL -1519927376,1519927471,GB +1519927320,1519927327,FR +1519927328,1519927335,ES +1519927336,1519927343,CH +1519927344,1519927351,AT +1519927352,1519927375,NL +1519927376,1519927383,CH +1519927384,1519927399,NL +1519927400,1519927407,FR +1519927408,1519927415,AT +1519927416,1519927423,BE +1519927424,1519927431,LU +1519927432,1519927439,NL +1519927440,1519927447,CH +1519927448,1519927463,FR +1519927464,1519927471,IT 1519927472,1519927479,NL -1519927480,1519927503,GB +1519927480,1519927503,FR 1519927504,1519927511,NL -1519927512,1519927591,GB +1519927512,1519927527,ES +1519927528,1519927535,NL +1519927536,1519927543,FR +1519927544,1519927551,IE +1519927552,1519927559,SE +1519927560,1519927567,IT +1519927568,1519927575,GB +1519927576,1519927583,FR +1519927584,1519927591,AT 1519927592,1519927607,BE -1519927608,1519927615,GB +1519927608,1519927615,FR 1519927616,1519927631,NL -1519927632,1519927639,GB +1519927632,1519927639,CH 1519927640,1519927647,BE -1519927648,1519927671,GB +1519927648,1519927655,FR +1519927656,1519927663,NL +1519927664,1519927671,IT 1519927672,1519927679,FI -1519927680,1519927695,GB -1519927696,1519927711,NL -1519927712,1519927823,GB +1519927680,1519927687,IE +1519927688,1519927695,IT +1519927696,1519927719,NL +1519927720,1519927727,ES +1519927728,1519927735,FR +1519927736,1519927743,NL +1519927744,1519927751,ES +1519927752,1519927759,IT +1519927760,1519927767,ES +1519927768,1519927775,NL +1519927776,1519927783,FR +1519927784,1519927823,GB 1519927824,1519927831,BE 1519927832,1519927855,GB 1519927856,1519927863,DK @@ -22789,20 +39333,19 @@ 1519928192,1519928199,SE 1519928200,1519928247,GB 1519928248,1519928255,DK -1519928256,1519929343,GB -1519929344,1519929439,NL -1519929440,1519929471,GB +1519928256,1519929279,GB +1519929280,1519929287,NL +1519929288,1519929343,GB +1519929344,1519929471,NL 1519929472,1519929503,FI 1519929504,1519929567,NL 1519929568,1519929599,FI -1519929600,1519929727,GB -1519929728,1519929759,NL +1519929600,1519929759,NL 1519929760,1519929791,CZ 1519929792,1519929792,GB 1519929793,1519929823,SE 1519929824,1519929855,DK -1519929856,1519929887,GB -1519929888,1519929951,SE +1519929856,1519929951,SE 1519929952,1519930111,BE 1519930112,1519930207,NL 1519930208,1519930239,BE @@ -22812,45 +39355,76 @@ 1519930368,1519930399,DK 1519930400,1519930527,NL 1519930528,1519930559,NO -1519930560,1519930591,GB +1519930560,1519930591,SE 1519930592,1519930655,NO -1519930656,1519930751,GB +1519930656,1519930751,NL 1519930752,1519930783,BE -1519930784,1519930879,NL -1519930880,1519930911,GB +1519930784,1519930911,NL 1519930912,1519930943,CZ 1519930944,1519930975,BE -1519930976,1519935487,GB +1519930976,1519931007,NL +1519931008,1519931039,BE +1519931040,1519931071,DK +1519931072,1519931103,NO +1519931104,1519931135,SE +1519931136,1519931231,NL +1519931232,1519931263,NO +1519931264,1519931359,GB +1519931360,1519931375,BE +1519931376,1519931391,GB +1519931392,1519934463,NL +1519934464,1519934975,GB +1519934976,1519935487,NL 1519935488,1519935615,FR 1519935616,1519935743,NL 1519935744,1519935935,FI 1519935936,1519936191,BE 1519936192,1519936255,DK -1519936256,1519936383,GB +1519936256,1519936383,NL 1519936384,1519936447,BE 1519936448,1519936511,NO 1519936512,1519936575,SK 1519936576,1519936767,DK -1519936768,1519936831,GB -1519936832,1519936895,SE +1519936768,1519936895,SE 1519936896,1519937023,BE 1519937024,1519937279,DK -1519937280,1519937407,GB +1519937280,1519937343,NL +1519937344,1519937407,SE 1519937408,1519937471,NO -1519937472,1519939583,GB +1519937472,1519937535,GB +1519937536,1519937727,NL +1519937728,1519938559,GB +1519938560,1519939583,NL 1519939584,1519939615,NO -1519939616,1519943679,GB +1519939616,1519939647,NL +1519939648,1519939679,SE +1519939680,1519939711,SK +1519939712,1519939743,NL +1519939744,1519939807,BE +1519939808,1519939839,NL +1519939840,1519940095,GB +1519940096,1519940159,NL +1519940160,1519940191,FI +1519940192,1519940223,SE +1519940224,1519943679,GB 1519943680,1519976447,AT 1519976448,1520009215,DE 1520009216,1520041983,SY 1520041984,1520074751,RU -1520074752,1520107519,BG +1520074752,1520099327,BG +1520099328,1520099583,A2 +1520099584,1520107519,BG 1520107520,1520140287,GB 1520140288,1520173055,RU 1520173056,1520205823,PL -1520205824,1520271359,RU -1520271360,1520302079,SI -1520302080,1520304127,HR +1520205824,1520230399,RU +1520230400,1520230911,NL +1520230912,1520231935,RU +1520231936,1520232191,NL +1520232192,1520232959,RU +1520232960,1520233471,NL +1520233472,1520271359,RU +1520271360,1520304127,SI 1520304128,1520435199,TR 1520435200,1521483775,ES 1521483776,1522008063,CZ @@ -22866,7 +39440,9 @@ 1531445248,1531707391,AE 1531707392,1531969535,RU 1531969536,1532100607,IT -1532100608,1532231679,HU +1532100608,1532199935,HU +1532199936,1532200959,RS +1532200960,1532231679,HU 1532231680,1532362751,GB 1532362752,1532493823,BE 1532493824,1532559359,FR @@ -22889,7 +39465,7 @@ 1532657664,1532661759,IL 1532661760,1532665855,DE 1532665856,1532674047,PL -1532674048,1532682239,ES +1532674048,1532682239,UA 1532682240,1532690431,LV 1532690432,1532755967,FR 1532755968,1532821503,BG @@ -22900,15 +39476,15 @@ 1533149184,1533280255,IR 1533280256,1533411327,DK 1533411328,1533413375,GB -1533413376,1533415423,NO +1533413376,1533415423,DE 1533415424,1533417471,SA 1533417472,1533419519,NO 1533419520,1533419775,KW 1533419776,1533420031,SA -1533420032,1533420287,BH +1533420032,1533420287,KW 1533420288,1533420543,AE 1533420544,1533421567,KW -1533421568,1533423615,GB +1533421568,1533423615,NL 1533423616,1533425663,IT 1533425664,1533428479,GB 1533428480,1533428735,US @@ -22927,30 +39503,34 @@ 1533448192,1533450239,KW 1533450240,1533452287,RU 1533452288,1533454335,TR -1533454336,1533456383,CS +1533454336,1533456383,RS 1533456384,1533458431,UA 1533458432,1533460479,GB 1533460480,1533462527,NL 1533462528,1533464575,RU 1533464576,1533466623,NL 1533466624,1533468671,RU -1533468672,1533470719,CS +1533468672,1533470719,RS 1533470720,1533472767,KW 1533472768,1533474815,ES 1533474816,1533476863,FR 1533476864,1533478911,IE -1533478912,1533480959,CS +1533478912,1533480959,RS 1533480960,1533483007,NL 1533483008,1533485055,AM 1533485056,1533485567,GB 1533485568,1533485823,DE -1533485824,1533486079,SE -1533486080,1533487103,GB +1533485824,1533486335,SE +1533486336,1533486591,NO +1533486592,1533486847,DK +1533486848,1533487103,FI 1533487104,1533487359,FR 1533487360,1533487615,US 1533487616,1533487871,JP -1533487872,1533489151,FR -1533489152,1533491199,IT +1533487872,1533488639,FR +1533488640,1533488895,US +1533488896,1533489151,JP +1533489152,1533491199,ES 1533491200,1533493247,AM 1533493248,1533499391,RU 1533499392,1533501439,MT @@ -22959,7 +39539,11 @@ 1533505536,1533507583,DE 1533507584,1533509631,UA 1533509632,1533511679,GB -1533511680,1533513727,FR +1533511680,1533512383,FR +1533512384,1533512447,DE +1533512448,1533513215,FR +1533513216,1533513471,GB +1533513472,1533513727,DE 1533513728,1533515775,KW 1533515776,1533517823,RU 1533517824,1533519871,CZ @@ -22972,15 +39556,440 @@ 1533540352,1533542399,AT 1533542400,1534066687,GB 1534066688,1534129151,AT -1534129152,1534129407,AE +1534129152,1534129407,A2 1534129408,1534328831,AT 1534328832,1534459903,ES 1534459904,1534590975,AT 1534590976,1534656511,HU -1534656512,1534722047,FR +1534656512,1534711807,FR +1534711808,1534712831,BE +1534712832,1534713855,FR +1534713856,1534713887,PL +1534713888,1534713935,FR +1534713936,1534713943,CH +1534713944,1534713947,DE +1534713948,1534713951,GB +1534713952,1534713955,DE +1534713956,1534713959,BE +1534713960,1534713963,CH +1534713964,1534713983,FR +1534713984,1534713999,PL +1534714000,1534714015,FR +1534714016,1534714031,DE +1534714032,1534714047,BE +1534714048,1534714051,FR +1534714052,1534714055,IT +1534714056,1534714059,DE +1534714060,1534714063,FR +1534714064,1534714079,ES +1534714080,1534714095,FR +1534714096,1534714111,BE +1534714112,1534714119,GB +1534714120,1534714123,BE +1534714124,1534714127,NL +1534714128,1534714143,BE +1534714144,1534714159,GB +1534714160,1534714259,FR +1534714260,1534714271,PL +1534714272,1534714287,IT +1534714288,1534714303,ES +1534714304,1534714307,GB +1534714308,1534714311,ES +1534714312,1534714319,FR +1534714320,1534714327,DE +1534714328,1534714331,FR +1534714332,1534714335,PL +1534714336,1534714351,FR +1534714352,1534714367,CH +1534714368,1534714383,GB +1534714384,1534714399,FR +1534714400,1534714415,ES +1534714416,1534714431,GB +1534714432,1534714463,FR +1534714464,1534714495,GB +1534714496,1534714511,FR +1534714512,1534714527,PL +1534714528,1534714531,FR +1534714532,1534714535,PL +1534714536,1534714539,GB +1534714540,1534714547,FR +1534714548,1534714551,ES +1534714552,1534714559,GB +1534714560,1534714575,NL +1534714576,1534714703,FR +1534714704,1534714719,CH +1534714720,1534714751,BE +1534714752,1534714767,DE +1534714768,1534714783,FR +1534714784,1534714799,PL +1534714800,1534714831,FR +1534714832,1534714847,BE +1534714848,1534714855,GB +1534714856,1534714863,CH +1534714864,1534714871,FR +1534714872,1534714875,DE +1534714876,1534714879,FR +1534714880,1534714895,IT +1534714896,1534714911,FR +1534714912,1534714927,DE +1534714928,1534715039,FR +1534715040,1534715055,GB +1534715056,1534715071,PL +1534715072,1534715135,FR +1534715136,1534715139,PL +1534715140,1534715143,GB +1534715144,1534715151,NL +1534715152,1534715167,FR +1534715168,1534715183,NL +1534715184,1534715199,FR +1534715200,1534715203,DE +1534715204,1534715207,FR +1534715208,1534715215,BE +1534715216,1534715263,FR +1534715264,1534715279,ES +1534715280,1534715295,FR +1534715296,1534715311,ES +1534715312,1534715315,FR +1534715316,1534715319,ES +1534715320,1534715327,PL +1534715328,1534715359,FR +1534715360,1534715367,PL +1534715368,1534715371,FR +1534715372,1534715375,GB +1534715376,1534715391,ES +1534715392,1534715407,PL +1534715408,1534715423,ES +1534715424,1534715439,PL +1534715440,1534715447,ES +1534715448,1534715451,FR +1534715452,1534715487,PL +1534715488,1534715503,ES +1534715504,1534715519,CH +1534715520,1534715551,FR +1534715552,1534715583,ES +1534715584,1534715599,GB +1534715600,1534715615,BE +1534715616,1534715631,FR +1534715632,1534715647,ES +1534715648,1534715663,PL +1534715664,1534715679,ES +1534715680,1534715695,GB +1534715696,1534715711,FR +1534715712,1534715727,PT +1534715728,1534715731,FR +1534715732,1534715735,GB +1534715736,1534715759,PL +1534715760,1534715807,ES +1534715808,1534715871,FR +1534715872,1534715887,DE +1534715888,1534715919,FR +1534715920,1534715935,ES +1534715936,1534715999,FR +1534716000,1534716007,PL +1534716008,1534716047,FR +1534716048,1534716063,GB +1534716064,1534716127,FR +1534716128,1534716143,ES +1534716144,1534716159,PL +1534716160,1534716163,IT +1534716164,1534716167,FR +1534716168,1534716175,IE +1534716176,1534716191,FR +1534716192,1534716223,ES +1534716224,1534716239,FR +1534716240,1534716255,GB +1534716256,1534716319,FR +1534716320,1534716359,PL +1534716360,1534716363,CZ +1534716364,1534716367,GB +1534716368,1534716391,FR +1534716392,1534716395,ES +1534716396,1534716399,GB +1534716400,1534716431,FR +1534716432,1534716447,PL +1534716448,1534716479,FR +1534716480,1534716495,ES +1534716496,1534716511,FR +1534716512,1534716527,DE +1534716528,1534716575,FR +1534716576,1534716607,PL +1534716608,1534716639,FR +1534716640,1534716647,BE +1534716648,1534716655,FR +1534716656,1534716663,IE +1534716664,1534716671,FR +1534716672,1534716687,PL +1534716688,1534716703,FR +1534716704,1534716735,ES +1534716736,1534716751,FR +1534716752,1534716759,PL +1534716760,1534716763,FR +1534716764,1534716767,ES +1534716768,1534716879,FR +1534716880,1534716895,BE +1534716896,1534716927,FR +1534716928,1534716943,DE +1534716944,1534716991,FR +1534716992,1534717007,DE +1534717008,1534717023,FR +1534717024,1534717055,PL +1534717056,1534717103,FR +1534717104,1534717119,PL +1534717120,1534717135,IT +1534717136,1534717139,CH +1534717140,1534717143,BE +1534717144,1534717147,FR +1534717148,1534717151,IT +1534717152,1534717263,FR +1534717264,1534717279,ES +1534717280,1534717315,FR +1534717316,1534717319,IE +1534717320,1534717323,GB +1534717324,1534717343,FR +1534717344,1534717359,GB +1534717360,1534717375,PL +1534717376,1534717503,FR +1534717504,1534717519,DE +1534717520,1534717535,FR +1534717536,1534717551,PL +1534717552,1534717567,CZ +1534717568,1534717583,PL +1534717584,1534717647,FR +1534717648,1534717655,BE +1534717656,1534717659,ES +1534717660,1534717663,FR +1534717664,1534717679,GB +1534717680,1534717711,ES +1534717712,1534717727,FR +1534717728,1534717731,GB +1534717732,1534717735,FR +1534717736,1534717739,BE +1534717740,1534717743,DE +1534717744,1534717751,FR +1534717752,1534717759,BE +1534717760,1534717823,ES +1534717824,1534717855,BE +1534717856,1534717871,NL +1534717872,1534717903,FR +1534717904,1534717907,IT +1534717908,1534717911,GB +1534717912,1534717915,FR +1534717916,1534717919,DE +1534717920,1534717935,ES +1534717936,1534717951,IT +1534717952,1534717967,BE +1534717968,1534717983,IT +1534717984,1534718015,FR +1534718016,1534718031,BE +1534718032,1534718063,FR +1534718064,1534718079,IT +1534718080,1534718087,ES +1534718088,1534718095,CZ +1534718096,1534718111,PL +1534718112,1534718127,IT +1534718128,1534718143,ES +1534718144,1534718159,FR +1534718160,1534718175,DE +1534718176,1534718207,PL +1534718208,1534718271,ES +1534718272,1534718399,FR +1534718400,1534718415,DE +1534718416,1534718431,FR +1534718432,1534718447,PL +1534718448,1534718463,FR +1534718464,1534718479,DE +1534718480,1534718531,FR +1534718532,1534718535,PL +1534718536,1534718539,DE +1534718540,1534718543,ES +1534718544,1534718559,FR +1534718560,1534718575,BE +1534718576,1534718687,FR +1534718688,1534718703,PL +1534718704,1534718711,FR +1534718712,1534718735,GB +1534718736,1534718751,FR +1534718752,1534718767,PL +1534718768,1534718799,FR +1534718800,1534718815,ES +1534718816,1534718831,GB +1534718832,1534718847,FR +1534718848,1534718911,BE +1534718912,1534718927,IT +1534718928,1534718943,FR +1534718944,1534718959,DE +1534718960,1534718975,ES +1534718976,1534719039,FR +1534719040,1534719167,BE +1534719168,1534719215,PL +1534719216,1534719359,FR +1534719360,1534719375,PL +1534719376,1534719391,DE +1534719392,1534719395,CH +1534719396,1534719399,PT +1534719400,1534719403,IT +1534719404,1534719423,FR +1534719424,1534719439,DE +1534719440,1534719455,PL +1534719456,1534719471,FR +1534719472,1534719487,GB +1534719488,1534719631,FR +1534719632,1534719639,ES +1534719640,1534719643,GB +1534719644,1534719647,FR +1534719648,1534719655,ES +1534719656,1534719679,FR +1534719680,1534719695,GB +1534719696,1534719699,IT +1534719700,1534719703,DE +1534719704,1534719711,GB +1534719712,1534719759,FR +1534719760,1534719775,IT +1534719776,1534719823,FR +1534719824,1534719839,CH +1534719840,1534719871,FR +1534719872,1534719887,PL +1534719888,1534719951,FR +1534719952,1534719967,DE +1534719968,1534719983,PL +1534719984,1534720007,FR +1534720008,1534720015,PL +1534720016,1534720031,GB +1534720032,1534720047,DE +1534720048,1534720063,ES +1534720064,1534720079,IT +1534720080,1534720095,GB +1534720096,1534720111,FR +1534720112,1534720127,ES +1534720128,1534720207,FR +1534720208,1534720223,GB +1534720224,1534720239,DE +1534720240,1534720255,BE +1534720256,1534720287,PL +1534720288,1534720367,FR +1534720368,1534720383,IT +1534720384,1534720431,FR +1534720432,1534720435,DE +1534720436,1534720439,FR +1534720440,1534720443,GB +1534720444,1534720447,NL +1534720448,1534720451,FR +1534720452,1534720455,NL +1534720456,1534720463,IE +1534720464,1534720467,FR +1534720468,1534720471,GB +1534720472,1534720479,DE +1534720480,1534720495,GB +1534720496,1534720511,PL +1534720512,1534720527,DE +1534720528,1534720535,FR +1534720536,1534720539,PL +1534720540,1534720575,FR +1534720576,1534720591,ES +1534720592,1534720607,FR +1534720608,1534720623,GB +1534720624,1534720655,FR +1534720656,1534720671,PL +1534720672,1534720739,FR +1534720740,1534720743,PL +1534720744,1534720747,NL +1534720748,1534720751,FR +1534720752,1534720767,GB +1534720768,1534720783,ES +1534720784,1534720791,PL +1534720792,1534720795,IT +1534720796,1534720799,ES +1534720800,1534720815,PL +1534720816,1534720831,FR +1534720832,1534720863,PL +1534720864,1534720879,ES +1534720880,1534720895,FR +1534720896,1534720899,ES +1534720900,1534720903,GB +1534720904,1534720959,FR +1534720960,1534720975,ES +1534720976,1534720979,NL +1534720980,1534720983,FR +1534720984,1534720991,PL +1534720992,1534721007,FR +1534721008,1534721023,ES +1534721024,1534721055,FR +1534721056,1534721063,ES +1534721064,1534721071,FR +1534721072,1534721087,GB +1534721088,1534721103,ES +1534721104,1534721107,PL +1534721108,1534721111,ES +1534721112,1534721115,FR +1534721116,1534721119,BE +1534721120,1534721135,IT +1534721136,1534721159,FR +1534721160,1534721163,GB +1534721164,1534721183,FR +1534721184,1534721191,LT +1534721192,1534721195,FR +1534721196,1534721199,IT +1534721200,1534721215,FR +1534721216,1534721223,BE +1534721224,1534721231,CH +1534721232,1534721247,DE +1534721248,1534721263,FR +1534721264,1534721279,GB +1534721280,1534721311,FR +1534721312,1534721319,PL +1534721320,1534721327,PT +1534721328,1534721343,NL +1534721344,1534721359,PL +1534721360,1534721375,FR +1534721376,1534721391,ES +1534721392,1534721407,PL +1534721408,1534721439,DE +1534721440,1534721471,FR +1534721472,1534721491,GB +1534721492,1534721495,FR +1534721496,1534721519,PL +1534721520,1534721527,FR +1534721528,1534721531,ES +1534721532,1534721535,FR +1534721536,1534721583,GB +1534721584,1534721599,FR +1534721600,1534721623,ES +1534721624,1534721627,PL +1534721628,1534721631,NL +1534721632,1534721663,FR +1534721664,1534721679,ES +1534721680,1534721711,FR +1534721712,1534721727,ES +1534721728,1534721743,FR +1534721744,1534721747,PL +1534721748,1534721751,IT +1534721752,1534721755,DE +1534721756,1534721775,FR +1534721776,1534721791,ES +1534721792,1534721823,FR +1534721824,1534721827,PL +1534721828,1534721831,FR +1534721832,1534721835,PL +1534721836,1534721839,BE +1534721840,1534721855,PL +1534721856,1534721887,ES +1534721888,1534721903,FR +1534721904,1534721919,DE +1534721920,1534721935,FR +1534721936,1534721951,PL +1534721952,1534721955,FR +1534721956,1534721959,PL +1534721960,1534721963,IE +1534721964,1534721967,CH +1534721968,1534721975,DE +1534721976,1534721979,ES +1534721980,1534721983,GB +1534721984,1534721999,PL +1534722000,1534722031,FR +1534722032,1534722047,BE 1534722048,1534787583,RU 1534787584,1534791679,RO -1534791680,1534795775,RU +1534791680,1534795775,UA 1534795776,1534803967,NO 1534803968,1534808063,LV 1534808064,1534812159,RU @@ -22988,24 +39997,27 @@ 1534816256,1534820351,FR 1534820352,1534824447,FI 1534824448,1534828543,UA -1534828544,1534836735,PL +1534828544,1534832639,PL 1534836736,1534840831,SE 1534840832,1534844927,PL 1534844928,1534849023,IE 1534849024,1534853119,NL 1534853120,1534918655,UA 1534918656,1534984191,GB -1534984192,1535018235,SE -1535018236,1535018239,ES -1535018240,1535018491,SE -1535018492,1535018495,ES -1535018496,1535018747,SE -1535018748,1535018751,ES -1535018752,1535018991,SE -1535018992,1535019007,ES -1535019008,1535033343,SE -1535033344,1535043583,ES -1535043584,1535049727,SE +1534984192,1534989855,SE +1534989856,1534990063,ES +1534990064,1534990079,SE +1534990080,1534990335,ES +1534990336,1534999551,SE +1534999552,1535004671,ES +1535004672,1535008767,SE +1535008768,1535011839,ES +1535011840,1535017983,SE +1535017984,1535019519,ES +1535019520,1535020543,SE +1535020544,1535021055,ES +1535021056,1535024127,SE +1535024128,1535049727,ES 1535049728,1535115263,SK 1535115264,1535377407,AT 1535377408,1535442943,GR @@ -23018,7 +40030,7 @@ 1535594496,1535598591,LV 1535598592,1535602687,IL 1535602688,1535606783,HU -1535606784,1535610879,CS +1535606784,1535610879,NO 1535610880,1535614975,RU 1535614976,1535619071,AT 1535619072,1535623167,FR @@ -23026,10 +40038,13 @@ 1535627264,1535631359,RU 1535631360,1535635455,GB 1535635456,1535639551,AZ -1535639552,1535672319,CA +1535639552,1535672319,GB 1535672320,1535705087,DE -1535705088,1535737855,CH -1535737856,1535770623,HU +1535705088,1535721471,CH +1535721472,1535721726,DE +1535721727,1535737855,CH +1535737856,1535769855,HU +1535769856,1535770623,SR 1535770624,1535803391,CH 1535803392,1535836159,GR 1535836160,1535868927,HU @@ -23041,24 +40056,45 @@ 1536032768,1536036863,LV 1536036864,1536040959,AT 1536040960,1536045055,GB -1536045056,1536045567,LU -1536045568,1536046591,IQ -1536046592,1536046975,LU +1536045056,1536045439,DE +1536045440,1536045567,A2 +1536045568,1536046079,IQ +1536046080,1536046591,A2 +1536046592,1536046847,IQ +1536046848,1536046975,A2 1536046976,1536047039,SA 1536047040,1536047103,IQ -1536047104,1536047615,LB -1536047616,1536047999,LU +1536047104,1536047679,LB +1536047680,1536047999,A2 1536048000,1536048127,SA 1536048128,1536048255,AE -1536048256,1536048639,LU +1536048256,1536048319,DE +1536048320,1536048383,IQ +1536048384,1536048511,A2 +1536048512,1536048575,IQ +1536048576,1536048639,A2 1536048640,1536048671,FR -1536048672,1536048895,LU -1536048896,1536049151,LB -1536049152,1536053247,NL +1536048672,1536048703,LU +1536048704,1536048719,IQ +1536048720,1536048735,NL +1536048736,1536049151,A2 +1536049152,1536051199,IT 1536053248,1536057343,RU 1536057344,1536061439,IE 1536061440,1536065535,SE -1536065536,1536069631,LU +1536065536,1536065791,GB +1536065792,1536066303,LU +1536066304,1536066815,NL +1536066816,1536067071,RU +1536067072,1536067327,GB +1536067328,1536067583,RU +1536067584,1536067839,DK +1536067840,1536068095,PL +1536068096,1536068351,RU +1536068352,1536068607,HR +1536068608,1536069119,RU +1536069120,1536069375,TR +1536069376,1536069631,IT 1536069632,1536073727,RU 1536073728,1536077823,UA 1536077824,1536081919,SE @@ -23074,7 +40110,7 @@ 1536131072,1536143359,RU 1536143360,1536147455,GB 1536147456,1536151551,IT -1536151552,1536155647,CS +1536151552,1536155647,RS 1536155648,1536159743,IL 1536159744,1536163839,DE 1536163840,1536180223,SY @@ -23093,16 +40129,7 @@ 1536393216,1536409599,SA 1536409600,1536425983,HU 1536425984,1536442367,SK -1536442368,1536444415,CS -1536444416,1536446463,RS -1536446464,1536453375,CS -1536453376,1536453887,RS -1536453888,1536453903,CS -1536453904,1536454655,RS -1536454656,1536455424,CS -1536455425,1536456191,RS -1536456192,1536456447,CS -1536456448,1536458751,RS +1536442368,1536458751,RS 1536458752,1536475135,BG 1536475136,1536491519,NL 1536491520,1536499711,NO @@ -23112,50 +40139,71 @@ 1536524288,1536540671,BY 1536540672,1536557055,PL 1536557056,1536573439,FI -1536573440,1536589823,CS +1536573440,1536589823,RS 1536589824,1536614399,PL 1536614400,1536622591,DK 1536622592,1536626687,GB 1536626688,1536630783,IT 1536630784,1536634879,RU -1536634880,1536635647,FR -1536635648,1536635903,CH -1536635904,1536643071,FR +1536634880,1536643071,FR 1536643072,1536647167,TR 1536647168,1536647434,ES 1536647435,1536647435,PT 1536647436,1536651263,ES 1536651264,1536655359,FR 1536655360,1536659455,GE -1536659456,1536660031,DE -1536660032,1536660039,MR -1536660040,1536660095,DE -1536660096,1536660223,LB -1536660224,1536660735,DE -1536660736,1536660991,KW -1536660992,1536662015,MR -1536662016,1536662271,SD -1536662272,1536662367,DE -1536662368,1536662399,SO -1536662400,1536662783,DE -1536662784,1536663039,KW -1536663040,1536663551,DE +1536659456,1536659759,DE +1536659760,1536659775,BI +1536659776,1536659791,LB +1536659792,1536659823,SD +1536659824,1536659967,DE +1536659968,1536659975,EG +1536659976,1536659991,DE +1536659992,1536660003,EG +1536660004,1536660007,SO +1536660008,1536660015,DE +1536660016,1536660019,KW +1536660020,1536660031,DE +1536660032,1536660039,DJ +1536660040,1536660735,DE +1536660736,1536660991,SA +1536660992,1536661247,DE +1536661248,1536661759,GQ +1536661760,1536662015,BJ +1536662016,1536662271,DE +1536662272,1536662303,SO +1536662304,1536662319,DE +1536662320,1536662335,LB +1536662336,1536662351,DE +1536662352,1536662359,TD +1536662360,1536662367,IR +1536662368,1536662399,IQ +1536662400,1536662415,DE +1536662416,1536662431,GN +1536662432,1536662527,IQ +1536662528,1536662783,DE +1536662784,1536663039,SA +1536663040,1536663295,DE +1536663296,1536663311,LB +1536663312,1536663319,DE +1536663320,1536663327,LB +1536663328,1536663335,CV +1536663336,1536663359,DE +1536663360,1536663391,IQ +1536663392,1536663423,DE +1536663424,1536663551,KW 1536663552,1536667647,SA 1536667648,1536675839,RU 1536675840,1536679935,GB 1536679936,1536684031,LB -1536684032,1536688127,RU 1536688128,1537212415,FI 1537212416,1538260991,FR 1538260992,1538785279,BE 1538785280,1538793471,NL -1538793472,1538794839,DE -1538794840,1538794847,US -1538794848,1538797311,DE -1538797312,1538797327,NL -1538797328,1538797567,DE +1538793472,1538797567,DE 1538797568,1538799551,NL -1538799552,1538801663,DE +1538799552,1538799615,DE +1538799616,1538801663,NL 1538801664,1538809855,IR 1538809856,1538818047,GE 1538818048,1538826239,NO @@ -23163,20 +40211,14 @@ 1538834432,1538842623,CY 1538842624,1538850815,RU 1538850816,1538859007,KZ -1538859008,1538867199,RU -1538875392,1538875711,CS -1538875712,1538875903,RS -1538875904,1538875967,CS -1538875968,1538876159,RS -1538876160,1538878207,CS -1538878208,1538878463,RS -1538878464,1538878975,CS -1538878976,1538883583,RS +1538859008,1538875391,RU +1538875392,1538883583,RS 1538883584,1538891775,BE -1538891776,1538899967,DE -1538899968,1538902063,SI -1538902064,1538902079,NZ -1538902080,1538908159,SI +1538891776,1538898431,DE +1538898432,1538899967,FR +1538899968,1538904031,SI +1538904032,1538904039,BH +1538904040,1538908159,SI 1538908160,1538916351,RU 1538916352,1538924543,GB 1538924544,1538932735,DE @@ -23185,28 +40227,71 @@ 1538949120,1538957311,AT 1538957312,1538961535,DE 1538961536,1538961599,IT -1538961600,1538965503,DE +1538961600,1538962263,DE +1538962264,1538962271,GB +1538962272,1538963399,DE +1538963400,1538963407,FR +1538963408,1538965503,DE 1538965504,1538973695,IR 1538973696,1538981887,JO 1538981888,1538990079,BY 1538990080,1538998271,CZ 1538998272,1539006463,AD -1539006464,1539022847,CS +1539006464,1539006719,AL +1539006720,1539006735,RS +1539006736,1539008511,AL +1539008512,1539009023,RS +1539009024,1539014655,AL +1539014656,1539022847,RS 1539022848,1539031039,LT 1539031040,1539039231,IT 1539039232,1539047423,PL -1539047424,1539048511,IT -1539048512,1539048527,LY -1539048528,1539049215,IT -1539049216,1539049255,IQ +1539047424,1539047583,IT +1539047584,1539047591,US +1539047592,1539048223,IT +1539048224,1539048239,GB +1539048240,1539048247,IT +1539048248,1539048263,GB +1539048264,1539048271,IT +1539048272,1539048335,GB +1539048336,1539048383,IT +1539048384,1539048391,GB +1539048392,1539048399,IT +1539048400,1539048447,GB +1539048448,1539048543,IT +1539048544,1539048551,LY +1539048552,1539048559,IT +1539048560,1539048567,LY +1539048568,1539048639,IT +1539048640,1539048687,IQ +1539048688,1539048703,IT +1539048704,1539048959,A2 +1539048960,1539049215,IT +1539049216,1539049223,LY +1539049224,1539049255,IT 1539049256,1539049263,LY 1539049264,1539049279,IT -1539049280,1539049295,LY -1539049296,1539049311,GL -1539049312,1539049343,LY -1539049344,1539050367,IT +1539049280,1539049287,LY +1539049288,1539049311,IT +1539049312,1539049327,LY +1539049328,1539049335,IT +1539049336,1539049343,LY +1539049344,1539050335,IT +1539050336,1539050351,TR +1539050352,1539050359,IT +1539050360,1539050367,TR 1539050368,1539050375,FR -1539050376,1539055615,IT +1539050376,1539050383,IT +1539050384,1539050399,FR +1539050400,1539050407,IT +1539050408,1539050415,AL +1539050416,1539055471,IT +1539055472,1539055487,FR +1539055488,1539055511,IT +1539055512,1539055519,DE +1539055520,1539055567,IT +1539055568,1539055575,FR +1539055576,1539055615,IT 1539055616,1539063807,LV 1539063808,1539071999,FR 1539072000,1539080191,PL @@ -23230,7 +40315,8 @@ 1539145728,1539147775,UA 1539147776,1539149823,PL 1539149824,1539151871,GB -1539151872,1539155967,RU +1539151872,1539153919,UA +1539153920,1539155967,RU 1539155968,1539160063,NO 1539160064,1539162111,RU 1539162112,1539164159,DE @@ -23249,14 +40335,18 @@ 1539211528,1539211531,GB 1539211532,1539211775,CZ 1539211776,1539212031,DE -1539212032,1539213311,CZ +1539212032,1539212287,CZ +1539212288,1539212543,DE +1539212544,1539213311,CZ 1539213312,1539215359,SE 1539215360,1539219455,DE -1539219456,1539221503,DK -1539221504,1539223551,FR +1539221504,1539222287,FR +1539222288,1539222303,HK +1539222304,1539222527,FR +1539222528,1539222783,HK +1539222784,1539223551,FR 1539223552,1539225599,DE 1539225600,1539227647,HU -1539227648,1539229695,KW 1539229696,1539231743,DE 1539231744,1539233791,BE 1539233792,1539235839,GR @@ -23265,8 +40355,10 @@ 1539239936,1539244031,DE 1539244032,1539260415,BA 1539260416,1539276799,SK -1539276800,1539280895,SE -1539280896,1539284991,KZ +1539276800,1539280135,SE +1539280136,1539280143,FI +1539280144,1539280895,SE +1539280896,1539284991,FR 1539284992,1539287039,DE 1539287040,1539289087,TR 1539289088,1539293183,RU @@ -23276,7 +40368,8 @@ 1539309568,1539310591,PL 1539310592,1539311615,UA 1539311616,1539312639,NL -1539312640,1539314687,DE +1539312640,1539313663,DE +1539313664,1539314687,GB 1539314688,1539315711,RU 1539315712,1539316735,UA 1539316736,1539317759,SE @@ -23285,6 +40378,7 @@ 1539319808,1539320831,DE 1539320832,1539321855,UA 1539321856,1539322879,EG +1539322880,1539323903,DK 1539323904,1539324927,PL 1539324928,1539325951,RU 1539325952,1539326975,KG @@ -23295,9 +40389,9 @@ 1539332096,1539333119,PL 1539333120,1539335167,RU 1539335168,1539336191,CH +1539336192,1539336703,UA 1539336704,1539337215,EE 1539337216,1539338239,ES -1539338240,1539339263,RU 1539339264,1539340287,NL 1539340288,1539341311,PL 1539341312,1539342335,IT @@ -23313,7 +40407,8 @@ 1539357696,1539358719,RU 1539358720,1539359743,GB 1539359744,1539360767,PL -1539360768,1539361791,IL +1539360768,1539361279,UA +1539361280,1539361791,DE 1539361792,1539362815,PL 1539362816,1539363839,GB 1539363840,1539364863,DK @@ -23329,11 +40424,14 @@ 1539376128,1539377151,IL 1539377152,1539378175,UA 1539378176,1539379199,PL +1539379200,1539380223,EU 1539380224,1539381247,CH 1539381248,1539382271,RS 1539382272,1539383295,PL 1539383296,1539384319,UA 1539384320,1539385343,RU +1539385344,1539385855,PL +1539385856,1539386367,BE 1539386368,1539387391,IT 1539387392,1539388415,IL 1539388416,1539389439,PL @@ -23345,15 +40443,18 @@ 1539393536,1539394559,RU 1539394560,1539396607,UA 1539396608,1539397631,PL -1539397632,1539398655,RU +1539397632,1539398143,RU +1539398144,1539398655,PL 1539398656,1539399679,ES 1539399680,1539401727,PL -1539401728,1539402751,UA +1539401728,1539402239,GB +1539402240,1539402751,FR +1539402752,1539403263,GB +1539403264,1539403775,RU 1539403776,1539404799,GR -1539404800,1539405823,LV +1539404800,1539405823,EE 1539405824,1539406847,PL -1539406848,1539407871,UA -1539407872,1539408895,DE +1539406848,1539408895,UA 1539408896,1539409919,CZ 1539409920,1539410943,DK 1539410944,1539411967,RU @@ -23369,7 +40470,7 @@ 1539421184,1539422207,GB 1539422208,1539423231,PL 1539423232,1539424255,IE -1539424256,1539425279,RU +1539424256,1539425279,UA 1539425280,1539426303,PL 1539426304,1539427327,BG 1539427328,1539428351,UA @@ -23380,7 +40481,7 @@ 1539437568,1539439615,GB 1539439616,1539440639,UA 1539440640,1539441663,RU -1539441664,1539442175,US +1539441664,1539442175,IL 1539442176,1539442687,DE 1539442688,1539443199,NL 1539443200,1539444223,RU @@ -23396,7 +40497,7 @@ 1539449344,1539449855,UA 1539449856,1539450367,DK 1539450368,1539450879,SE -1539450880,1539451391,NL +1539450880,1539451391,UA 1539451392,1539452415,RO 1539452416,1539452927,GB 1539452928,1539453439,CH @@ -23465,7 +40566,7 @@ 1539488768,1539489279,PL 1539489280,1539490815,RU 1539490816,1539491327,CH -1539491328,1539491839,AT +1539491328,1539491839,PL 1539491840,1539492351,RU 1539492352,1539492863,BE 1539492864,1539493375,KR @@ -23492,7 +40593,7 @@ 1539504640,1539505151,UA 1539505152,1539506175,RU 1539506176,1539506687,NL -1539506688,1539507199,IT +1539506688,1539507199,UA 1539507200,1539508223,RO 1539508224,1539508735,NO 1539508736,1539509759,UA @@ -23508,7 +40609,7 @@ 1539514368,1539514879,SE 1539514880,1539515391,ES 1539515392,1539515903,FR -1539515904,1539516415,CS +1539515904,1539516415,RS 1539516416,1539516927,AT 1539516928,1539517439,PL 1539517440,1539517951,RO @@ -23546,6 +40647,7 @@ 1539534336,1539534847,RU 1539534848,1539535359,GB 1539535360,1539535871,RU +1539535872,1539536383,AT 1539536384,1539536895,NL 1539536896,1539537407,UA 1539537408,1539537919,GB @@ -23566,6 +40668,7 @@ 1539547136,1539547647,NL 1539547648,1539548159,IL 1539548160,1539548671,FR +1539548672,1539549183,EU 1539549184,1539549695,GB 1539549696,1539550207,RU 1539550208,1539550719,UA @@ -23608,6 +40711,7 @@ 1539571712,1539572735,UA 1539572736,1539573759,RU 1539573760,1539575807,PL +1539575808,1539576831,LV 1539576832,1539577855,GB 1539577856,1539578879,RU 1539578880,1539579903,PL @@ -23629,7 +40733,7 @@ 1539598336,1539599359,NL 1539599360,1539600383,PL 1539600384,1539601407,HU -1539601408,1539602431,DE +1539601408,1539602431,GB 1539602432,1539603455,UA 1539603456,1539604479,BG 1539604480,1539605503,ES @@ -23644,9 +40748,10 @@ 1539616768,1539617791,UA 1539617792,1539618815,FR 1539618816,1539619839,GB -1539619840,1539621887,RU -1539621888,1539623935,UA -1539623936,1539625983,RU +1539619840,1539620863,RU +1539620864,1539623935,UA +1539623936,1539624959,DE +1539624960,1539625983,RU 1539625984,1539627007,PL 1539627008,1539628031,RU 1539628032,1539629055,UA @@ -23694,11 +40799,9 @@ 1539678208,1539679231,RU 1539679232,1539680255,FR 1539680256,1539681279,UA -1539681280,1539682303,RU -1539682304,1539683327,UA -1539683328,1539684351,RU +1539681280,1539684351,RU 1539684352,1539685375,UA -1539685376,1539688447,RU +1539686400,1539688447,RU 1539688448,1539689471,SA 1539689472,1539690495,RU 1539690496,1539691519,FI @@ -23715,7 +40818,8 @@ 1539702784,1539703039,SI 1539703040,1539703295,UA 1539703296,1539703551,DE -1539703552,1539704063,GB +1539703552,1539703807,GB +1539703808,1539704063,UA 1539704064,1539704319,IL 1539704320,1539704575,CH 1539704576,1539704831,HU @@ -23751,7 +40855,7 @@ 1539712768,1539713023,RO 1539713024,1539713279,UA 1539713280,1539713535,FR -1539713536,1539713791,NL +1539713536,1539713791,DK 1539713792,1539714047,DE 1539714048,1539714303,FR 1539714304,1539714559,AT @@ -23778,6 +40882,7 @@ 1539719936,1539720191,DE 1539720192,1539720703,RU 1539720704,1539720959,IL +1539720960,1539721215,RU 1539721216,1539721727,CH 1539721728,1539721983,PL 1539721984,1539722239,RU @@ -23804,7 +40909,7 @@ 1539727360,1539727615,SI 1539727616,1539727871,PL 1539727872,1539728127,RU -1539728128,1539728383,BE +1539728128,1539728383,GB 1539728384,1539728639,PL 1539728640,1539728895,UA 1539728896,1539729151,SA @@ -23814,7 +40919,7 @@ 1539729920,1539730175,NL 1539730176,1539730431,GB 1539730432,1539730687,GR -1539730688,1539730943,UA +1539730688,1539730943,KZ 1539730944,1539731455,PL 1539731456,1539731711,SI 1539731712,1539732223,DE @@ -23827,10 +40932,9 @@ 1539733760,1539734015,PL 1539734016,1539734271,FR 1539734272,1539734527,NO -1539734528,1539734783,TR -1539734784,1539735039,DE +1539734528,1539735039,TR 1539735040,1539735295,BE -1539735296,1539735551,DE +1539735296,1539735551,RU 1539735552,1539735807,AT 1539735808,1539736063,IL 1539736064,1539736319,RU @@ -23880,7 +40984,7 @@ 1539748352,1539748607,NL 1539748608,1539748863,PL 1539748864,1539749119,GB -1539749120,1539749375,PL +1539749120,1539749375,BG 1539749376,1539749631,PT 1539749632,1539749887,GR 1539749888,1539750143,RU @@ -23914,7 +41018,6 @@ 1539757568,1539757823,SI 1539757824,1539758079,UA 1539758080,1539758335,HR -1539758336,1539758591,DE 1539758592,1539758847,NL 1539758848,1539759103,BA 1539759104,1539759359,DK @@ -23931,7 +41034,7 @@ 1539761920,1539762175,RU 1539762176,1539762431,PL 1539762432,1539762687,UA -1539762688,1539762943,PL +1539762688,1539762943,NL 1539762944,1539763199,UA 1539763200,1539763455,MD 1539763456,1539763711,DK @@ -23941,7 +41044,7 @@ 1539764480,1539764735,GB 1539764736,1539764991,RO 1539764992,1539765247,BE -1539765248,1539765503,IE +1539765248,1539765503,GB 1539765504,1539766015,PL 1539766016,1539766271,AM 1539766272,1539766527,PL @@ -24002,15 +41105,14 @@ 1539780608,1539780863,PL 1539780864,1539781119,RO 1539781120,1539781375,NL -1539781376,1539781631,GB +1539781376,1539781631,DE 1539781632,1539781887,HU 1539781888,1539782143,IL 1539782144,1539782399,UA 1539782400,1539782655,LT 1539782656,1539782911,GI 1539782912,1539783167,PL -1539783168,1539783423,NL -1539783424,1539783679,IT +1539783168,1539783679,NL 1539783680,1539783935,DE 1539783936,1539784191,SI 1539784192,1539784447,RU @@ -24031,8 +41133,7 @@ 1539788032,1539788287,HR 1539788288,1539788543,GB 1539788544,1539788799,HR -1539788800,1539789055,IL -1539789056,1539789311,RU +1539788800,1539789311,RU 1539789312,1539789567,UA 1539789568,1539789823,DE 1539789824,1539790079,NL @@ -24097,12 +41198,14 @@ 1539806720,1539806975,BG 1539806976,1539807231,GB 1539807232,1539807487,FR -1539807488,1539807999,GB +1539807488,1539807743,RU +1539807744,1539807999,GB 1539808000,1539808255,HU 1539808256,1539808511,RU 1539808512,1539808767,RO 1539808768,1539809023,DE 1539809024,1539809279,GB +1539809280,1539809535,EU 1539809536,1539809791,SI 1539809792,1539810047,DE 1539810048,1539810303,UA @@ -24160,17 +41263,17 @@ 1539824128,1539824383,CH 1539824384,1539824639,NL 1539824640,1539824895,HU -1539824896,1539825151,UZ +1539824896,1539825151,RU 1539825152,1539825407,UA 1539825408,1539825919,RU 1539825920,1539826175,DE 1539826176,1539826431,AM 1539826432,1539826687,BE 1539826688,1539826943,CH -1539826944,1539827199,DE 1539827200,1539827455,RU 1539827456,1539827711,MK -1539827712,1539828479,FR +1539827712,1539827967,RU +1539827968,1539828479,FR 1539828480,1539828735,SI 1539828736,1539828991,NL 1539828992,1539829247,BG @@ -24214,21 +41317,22 @@ 1539860480,1539861503,UA 1539861504,1539862527,DE 1539862528,1539863551,UA -1539863552,1539864575,MD 1539864576,1539865599,RO 1539865600,1539866623,UA 1539866624,1539867647,IT 1539867648,1539869695,UA 1539869696,1539870719,ES -1539870720,1539871743,RU +1539870720,1539871743,IL 1539871744,1539872767,ES 1539872768,1539873791,SE -1539873792,1539876863,UA +1539873792,1539875839,UA +1539875840,1539876863,MD 1539876864,1539877887,ES 1539877888,1539878911,PL -1539878912,1539880959,UA +1539878912,1539879935,EU +1539879936,1539880959,UA 1539880960,1539881983,PL -1539881984,1539883007,UA +1539881984,1539884031,UA 1539884032,1539885055,MT 1539885056,1539886079,UA 1539886080,1539887103,FR @@ -24239,19 +41343,22 @@ 1539891200,1539893247,RU 1539893248,1539894271,UA 1539894272,1539895295,PL -1539895296,1539899391,UA +1539895296,1539896319,EU +1539896320,1539899391,UA 1539899392,1539900415,RU -1539900416,1539901439,UA +1539900416,1539901439,EU 1539901440,1539902463,RU 1539902464,1539903487,LV 1539903488,1539904511,PL 1539904512,1539905535,CZ -1539905536,1539910655,UA +1539905536,1539907583,UA +1539907584,1539908607,EU +1539908608,1539910655,UA 1539910656,1539911679,PL 1539911680,1539913727,RU 1539913728,1539914751,CH 1539914752,1539915775,SE -1539915776,1539916799,PL +1539915776,1539916799,RU 1539916800,1539917823,UA 1539917824,1539918847,RU 1539918848,1539920895,RO @@ -24277,17 +41384,16 @@ 1539941376,1539942399,NL 1539942400,1539943423,UA 1539943424,1539944447,BG -1539944448,1539945471,GB -1539945472,1539946495,UA +1539944448,1539946495,UA 1539946496,1539947519,RU 1539947520,1539948543,UA 1539948544,1539949567,RO -1539949568,1539950591,UA +1539949568,1539950591,MD 1539950592,1539951615,KZ 1539951616,1539953663,RU 1539953664,1539954687,UA 1539954688,1539956735,RO -1539956736,1539957759,TR +1539956736,1539957759,UA 1539957760,1539958783,RU 1539958784,1539962879,UA 1539962880,1539964927,RU @@ -24361,21 +41467,27 @@ 1540047872,1540048895,LV 1540048896,1540049919,GB 1540049920,1540050943,UA -1540050944,1540052991,RU -1540052992,1540054015,UA +1540050944,1540051967,RU +1540052992,1540054052,UA +1540054053,1540054062,MD +1540054063,1540055039,UA 1540055040,1540056063,NO 1540056064,1540057087,NL -1540057088,1540058111,GB +1540057088,1540057343,PL +1540057344,1540057599,RU +1540057600,1540057855,US +1540057856,1540058111,UA 1540058112,1540059135,DE 1540059136,1540060159,UA 1540060160,1540061183,NO -1540061184,1540062207,IL +1540061184,1540062207,A2 1540062208,1540063231,RU 1540063232,1540064255,NL 1540064256,1540065279,PL 1540065280,1540068351,UA 1540068352,1540069375,FR -1540069376,1540071423,RU +1540069376,1540070399,RU +1540070400,1540071423,PL 1540071424,1540072447,SE 1540072448,1540073471,UA 1540073472,1540074495,RU @@ -24390,9 +41502,9 @@ 1540085760,1540087807,PL 1540087808,1540092927,RU 1540092928,1540094975,PL -1540094976,1540095999,GB +1540094976,1540095999,EU 1540096000,1540097023,SE -1540097024,1540098047,DE +1540097024,1540099071,DE 1540099072,1540100095,UA 1540100096,1540103167,RU 1540103168,1540105215,DE @@ -24400,25 +41512,1809 @@ 1540110336,1540111359,RU 1540111360,1540112383,UA 1540112384,1540113407,LV -1540113408,1540114431,RU -1540114432,1540115455,LT +1540113408,1540115455,RU 1540115456,1540116479,UA 1540116480,1540117503,CH 1540117504,1540118527,UA 1540118528,1540119551,PL 1540119552,1540120575,UA +1540120576,1540124671,RU +1540124672,1540125695,NO +1540125696,1540126719,FR +1540126720,1540127743,UA +1540127744,1540128767,GB +1540128768,1540129791,RU +1540129792,1540130815,UA +1540130816,1540131839,RU +1540131840,1540132863,PL +1540132864,1540134911,RU +1540134912,1540135935,PL +1540135936,1540136959,BG +1540136960,1540137983,PL +1540137984,1540139007,RU +1540139008,1540140031,DE +1540140032,1540141055,GB +1540141056,1540142079,RU +1540142080,1540143103,UA +1540143104,1540144127,RU +1540144128,1540145151,AM +1540145152,1540146175,AT +1540146176,1540147199,UA +1540147200,1540148223,RU +1540148224,1540149247,PL +1540149248,1540150271,GB +1540150272,1540151295,UA +1540151296,1540152319,AT +1540152320,1540153343,SE +1540153344,1540156415,RU +1540156416,1540157439,UZ +1540157440,1540158463,RU +1540158464,1540159487,GB +1540159488,1540160511,UA +1540160512,1540162559,RU +1540162560,1540163583,UA +1540163584,1540164607,RU +1540164608,1540165631,DE +1540165632,1540166655,UA +1540166656,1540167679,PL +1540167680,1540168703,RU +1540168704,1540169727,DE +1540169728,1540170751,NL +1540170752,1540171775,DE +1540171776,1540172799,GB +1540172800,1540173823,RU +1540173824,1540174847,KG +1540174848,1540175871,RU +1540175872,1540176895,DE +1540176896,1540177919,SE +1540177920,1540178943,UA +1540178944,1540179967,BA +1540179968,1540180991,PL +1540180992,1540182015,DE +1540182016,1540183039,UA +1540183040,1540184063,RU +1540184064,1540185087,PL +1540185088,1540186111,RU +1540186112,1540187135,NL +1540187136,1540188159,US +1540188160,1540189183,KZ +1540189184,1540190207,GB +1540190208,1540191231,PT +1540191232,1540192255,FR +1540192256,1540195327,RU +1540195328,1540198399,AM +1540198400,1540199423,RU +1540199424,1540200447,CH +1540200448,1540201471,IL +1540201472,1540202495,UA +1540203520,1540204543,UA +1540204544,1540205567,RU +1540205568,1540206591,DE +1540206592,1540207615,RU +1540208640,1540209663,NO +1540209664,1540211711,RU +1540211712,1540212735,DE +1540212736,1540213759,RU +1540213760,1540214783,UA +1540214784,1540215807,RU +1540215808,1540216831,NL +1540216832,1540217855,UA +1540217856,1540218879,GB +1540218880,1540219903,RU +1540219904,1540220927,PL +1540220928,1540221951,NL +1540221952,1540223999,RU +1540224000,1540225023,PL +1540225024,1540226047,GB +1540226048,1540227071,RU 1540227072,1540227583,GB 1540227584,1540228095,RU 1540228096,1540228607,UA 1540228608,1540229119,PL 1540229120,1540229631,AT 1540229632,1540230143,NL +1540230144,1540232191,RU +1540232192,1540232703,BG +1540232704,1540233215,RU +1540233216,1540233727,CH +1540233728,1540234239,PL +1540234240,1540234751,DE +1540234752,1540235775,UA +1540235776,1540236287,NO +1540236288,1540236799,RO +1540236800,1540237311,PL +1540237312,1540238847,RO +1540238848,1540239359,DE +1540239360,1540239871,UA +1540239872,1540240383,FR +1540240384,1540240895,CH +1540240896,1540242431,RU +1540242432,1540242943,DE +1540242944,1540243455,RU +1540243456,1540243967,PL +1540243968,1540244479,RU +1540244480,1540244991,CH +1540244992,1540245503,DE +1540245504,1540246015,RU +1540246016,1540246527,IT +1540246528,1540247551,RO +1540247552,1540248063,NL +1540248064,1540248575,RO +1540248576,1540249087,GB +1540249088,1540249599,PL +1540249600,1540250111,KZ +1540250112,1540250623,DK +1540250624,1540251135,RU +1540251136,1540251647,GB +1540251648,1540252159,PL +1540252160,1540252671,DE +1540252672,1540253183,RU +1540253184,1540253695,AT +1540253696,1540254207,CH +1540254208,1540254719,RU +1540254720,1540255231,PL +1540255232,1540255743,UA +1540255744,1540256255,AT +1540256256,1540256767,PL +1540256768,1540257279,RU +1540257280,1540257791,GB +1540257792,1540258303,RU +1540258304,1540258815,IR +1540258816,1540259327,UA +1540259328,1540259839,RU +1540259840,1540260351,IT +1540260352,1540260863,RU +1540260864,1540261375,LT +1540261376,1540261887,SA +1540261888,1540262399,NL +1540262400,1540262911,BG +1540262912,1540263423,RO +1540263424,1540263935,DE +1540263936,1540264447,GB +1540264448,1540265983,RU +1540265984,1540266495,DE +1540266496,1540267007,PL +1540267008,1540267519,FR +1540267520,1540268543,RO +1540268544,1540269055,RU +1540269056,1540269567,DK +1540269568,1540270079,RU +1540270080,1540270591,GB +1540270592,1540271103,IL +1540271104,1540271615,PL +1540271616,1540272127,SE +1540272128,1540272639,GB +1540272640,1540273663,PL +1540273664,1540274175,GB +1540274176,1540274687,DE +1540274688,1540275199,UA +1540275200,1540275711,DE +1540275712,1540276223,GR +1540276224,1540276735,AT +1540276736,1540277247,RO +1540277248,1540277759,RU +1540277760,1540278271,FR +1540278272,1540278783,UA +1540278784,1540279807,RU +1540279808,1540280319,RO +1540280320,1540280831,MD +1540280832,1540281343,PL +1540281344,1540281855,UA +1540281856,1540282367,DE +1540282368,1540282879,RU +1540282880,1540283391,UA +1540283392,1540284415,RU +1540284416,1540284927,AT +1540284928,1540285439,UA +1540285440,1540285951,DE +1540285952,1540286463,RU +1540286464,1540286975,NL +1540286976,1540287487,GB +1540287488,1540288511,AT +1540288512,1540289535,RU +1540289536,1540290047,PL +1540290048,1540290559,NL +1540290560,1540291071,RU +1540291072,1540291583,BE +1540291584,1540292095,UA +1540292096,1540292607,RU +1540292608,1540293119,FR +1540293120,1540293631,DK +1540293632,1540295167,UA +1540295168,1540295679,PL +1540295680,1540296191,SA +1540296192,1540296703,PL +1540296704,1540297215,DE +1540297216,1540298239,FR +1540298240,1540298751,HR +1540298752,1540299263,RU +1540299264,1540299775,UA +1540299776,1540300287,KZ +1540300288,1540300799,RU +1540300800,1540301311,DK +1540301312,1540301823,IL +1540301824,1540302847,GB +1540302848,1540303871,RU +1540303872,1540304895,UA +1540304896,1540305407,PL +1540305408,1540305919,GB +1540306432,1540306943,UA +1540306944,1540307455,GB +1540307456,1540307967,RU +1540307968,1540308479,UA +1540308480,1540308991,RS +1540308992,1540309503,PL +1540309504,1540310015,UA +1540310016,1540310527,PL +1540310528,1540313087,RU +1540313088,1540313599,SE +1540313600,1540315135,RU +1540315136,1540315647,UA +1540315648,1540316159,IL +1540316160,1540316671,DE +1540316672,1540317183,RO +1540317184,1540317695,KG +1540317696,1540318207,UA +1540318208,1540318719,RU +1540318720,1540319231,RO +1540319232,1540320255,UA +1540320256,1540320767,RU +1540321280,1540321791,SE +1540321792,1540322303,RU +1540322304,1540322815,UA +1540322816,1540323327,DE +1540323328,1540323839,RO +1540323840,1540324351,UA +1540324352,1540324863,RO +1540324864,1540325375,PL +1540325376,1540325887,DE +1540325888,1540326399,LI +1540326400,1540326911,RU +1540326912,1540327423,AT +1540327424,1540327935,RU +1540327936,1540328447,IR +1540328448,1540329983,RU +1540329984,1540330495,UA +1540330496,1540331007,PL +1540331008,1540331519,IT +1540331520,1540332031,GB +1540332032,1540332543,RU +1540332544,1540333055,PL +1540333056,1540333567,NO +1540333568,1540334079,RO +1540334080,1540334591,DE +1540334592,1540335103,RU +1540335104,1540336127,PL +1540336128,1540336639,RU +1540336640,1540337663,MC +1540337664,1540338175,FR +1540338176,1540339199,RU +1540339200,1540339711,UA +1540339712,1540340735,PL +1540340736,1540341247,CZ +1540341248,1540341759,BG +1540341760,1540342271,GB +1540342272,1540342783,UA +1540342784,1540343295,ES +1540343296,1540343807,GB +1540343808,1540344831,PL +1540344832,1540345343,UA +1540345344,1540345855,IL +1540345856,1540346367,FR +1540346368,1540346879,UA +1540346880,1540347391,GB +1540347392,1540347903,DK +1540347904,1540348415,RO +1540348416,1540348927,UA +1540348928,1540349439,GB +1540349440,1540349951,AT +1540349952,1540350463,UA +1540350464,1540350975,NO +1540350976,1540351487,DK +1540351488,1540351999,RO +1540352000,1540352511,NL +1540352512,1540353023,RU +1540353024,1540353535,GR +1540353536,1540354047,RU +1540354048,1540354559,IL +1540354560,1540355071,PL +1540355072,1540355583,UA +1540355584,1540356607,RU +1540356608,1540357119,DE +1540357120,1540357631,RU +1540357632,1540358143,FR +1540358144,1540358399,RU +1540358400,1540358655,GB +1540358656,1540358911,SE +1540358912,1540359167,GB +1540359168,1540359423,SA +1540359424,1540359679,DE +1540359680,1540359935,GB +1540359936,1540360191,AT +1540360192,1540360447,NO +1540360448,1540360703,FR +1540360704,1540360959,PL +1540360960,1540361215,GB +1540361216,1540361471,BE +1540361472,1540361727,DE +1540361728,1540361983,IT +1540361984,1540362239,EE +1540362240,1540362495,DK +1540362496,1540363007,DE +1540363008,1540363263,FR +1540363264,1540363519,RU +1540363520,1540363775,GB +1540363776,1540364031,IS +1540364032,1540364287,RU +1540364288,1540364543,NO +1540364544,1540364799,UA +1540364800,1540365055,EE +1540365056,1540365311,SI +1540365312,1540365567,GB +1540365568,1540365823,RU +1540365824,1540366079,CH +1540366080,1540366335,IE +1540366336,1540366591,PL +1540366592,1540366847,RU +1540366848,1540367103,AT +1540367104,1540367359,RU +1540367360,1540367615,HU +1540367616,1540367871,BE +1540367872,1540368127,DE +1540368128,1540368383,RU +1540368384,1540368639,FR +1540368640,1540368895,SK +1540368896,1540369407,RU +1540369408,1540369663,PL +1540369664,1540369919,DE +1540369920,1540370175,UA +1540370176,1540370431,DE +1540370432,1540370687,LB +1540370688,1540370943,NL +1540370944,1540371199,PL +1540371200,1540371455,BE +1540371456,1540371711,UA +1540371712,1540371967,GB +1540371968,1540372223,NO +1540372224,1540372479,PL +1540372480,1540372735,EU +1540372736,1540372991,GR +1540372992,1540373247,DE +1540373248,1540373503,UA +1540373504,1540373759,NL +1540373760,1540374015,TR +1540374016,1540374271,NL +1540374272,1540374527,HU +1540374528,1540374783,RU +1540374784,1540375039,UA +1540375040,1540375295,DE +1540375296,1540375551,GB +1540375552,1540375807,DE +1540375808,1540376063,NL +1540376064,1540376319,TR +1540376320,1540376575,DK +1540376576,1540376831,PL +1540376832,1540377087,RU +1540377088,1540377343,DE +1540377344,1540377599,RO +1540377600,1540377855,AM +1540377856,1540378111,ES +1540378112,1540378367,PL +1540378368,1540378623,CH +1540378624,1540378879,AT +1540378880,1540379135,SE +1540379136,1540379391,CH +1540379392,1540379647,DE +1540379648,1540379903,RU +1540379904,1540380159,EU +1540380160,1540380415,IL +1540380416,1540380671,NL +1540380672,1540380927,SI +1540380928,1540381183,RS +1540381184,1540381439,RO +1540381440,1540381695,AT +1540381696,1540381951,RO +1540381952,1540382207,PL +1540382208,1540382463,UA +1540382464,1540382719,GB +1540382720,1540382975,LB +1540382976,1540383231,UA +1540383232,1540383487,AT +1540383488,1540383743,GB +1540383744,1540383999,RO +1540384000,1540384255,SI +1540384256,1540384511,FR +1540384512,1540384767,SE +1540384768,1540385023,HR +1540385024,1540385279,GB +1540385280,1540385535,PL +1540385536,1540385791,DE +1540385792,1540386303,FR +1540386304,1540386559,NL +1540386560,1540386815,GB +1540386816,1540387071,NL +1540387072,1540387327,RU +1540387328,1540387583,GB +1540387584,1540388095,UA +1540388096,1540388351,GB +1540388352,1540388607,IL +1540388608,1540388863,RU +1540388864,1540389119,RO +1540389120,1540389375,RU +1540389376,1540389631,GB +1540389632,1540389887,RO +1540389888,1540390143,GB +1540390144,1540390399,SI +1540390400,1540390655,RU +1540390656,1540390911,UA +1540390912,1540391167,SA +1540391168,1540391423,IL +1540391424,1540391679,CH +1540391680,1540391935,NL +1540391936,1540392191,RU +1540392192,1540392447,PL +1540392448,1540392703,RU +1540392704,1540392959,PL +1540392960,1540393471,GB +1540393472,1540393727,UA +1540393728,1540394239,IL +1540394240,1540394495,GB +1540394496,1540394751,RO +1540394752,1540395007,DK +1540395008,1540395263,GE +1540395264,1540395519,UA +1540395520,1540395775,GB +1540395776,1540396031,IL +1540396032,1540396287,NO +1540396288,1540396543,AM +1540396544,1540396799,PL +1540396800,1540397055,RU +1540397056,1540397311,IT +1540397312,1540397823,UA +1540397824,1540398079,DE +1540398080,1540398335,SA +1540398336,1540398591,DK +1540398592,1540398847,IT +1540398848,1540399359,DE +1540399360,1540399871,RU +1540399872,1540400127,GB +1540400128,1540400383,NL +1540400384,1540400639,IR +1540400640,1540400895,RU +1540400896,1540401151,NL +1540401152,1540401407,SI +1540401408,1540401663,AT +1540401664,1540401919,GB +1540401920,1540402175,RU +1540402176,1540402431,FR +1540402432,1540402687,CH +1540402688,1540402943,SE +1540402944,1540403199,NL +1540403200,1540403455,AT +1540403456,1540403711,GB +1540403712,1540404223,RO +1540404224,1540404479,CH +1540404480,1540404735,FR +1540404736,1540404991,PL +1540404992,1540405247,RU +1540405248,1540405503,GB +1540405504,1540405759,RU +1540405760,1540406015,PL +1540406016,1540406271,RU +1540406272,1540406527,SE +1540406528,1540407039,PL +1540407040,1540407807,DE +1540407808,1540408063,UA +1540408064,1540408319,IT +1540408320,1540408575,NL +1540408576,1540408831,HR +1540408832,1540409087,UA +1540409088,1540409343,TR +1540409344,1540409599,SI +1540409600,1540409855,AT +1540409856,1540410111,DE +1540410112,1540410367,KW +1540410368,1540410623,CH +1540410624,1540410879,RU +1540410880,1540411135,TR +1540411136,1540411391,SG +1540411392,1540411647,RU +1540411648,1540411903,FR +1540411904,1540412159,RU +1540412160,1540412415,BE +1540412416,1540412671,DE +1540412672,1540412927,RO +1540412928,1540413183,FR +1540413184,1540413439,RO +1540413440,1540413695,RU +1540413696,1540413951,AT +1540413952,1540414207,IL +1540414208,1540414463,GB +1540414464,1540414719,BE +1540414720,1540414975,SE +1540414976,1540415231,FR +1540415232,1540415487,RO +1540415488,1540415743,FR +1540415744,1540415999,SI +1540416000,1540416255,FR +1540416256,1540416511,CH +1540416512,1540416767,RU +1540416768,1540417023,NL +1540417024,1540417279,RU +1540417280,1540417535,UA +1540417536,1540417791,RU +1540417792,1540418047,HR +1540418048,1540418559,RO +1540418560,1540418815,AT +1540418816,1540419071,FR +1540419072,1540419327,RU +1540419328,1540419839,GB +1540419840,1540420095,NL +1540420096,1540420607,GB +1540420608,1540420863,DE +1540420864,1540421119,GB +1540421120,1540421375,RU +1540421376,1540421631,PL +1540421632,1540422143,RU +1540422144,1540422399,PL +1540422400,1540422655,UA +1540422656,1540422911,GB +1540422912,1540423423,RU +1540423424,1540423679,BA +1540423680,1540423935,SE +1540423936,1540424191,UA +1540424192,1540424447,AT +1540424448,1540424703,ES +1540424704,1540424959,PL +1540424960,1540425215,RO +1540425216,1540425471,US +1540425472,1540425727,NL +1540425728,1540425983,BG +1540425984,1540426239,DE +1540426240,1540426495,IE +1540426496,1540426751,UA +1540426752,1540427263,NL +1540427264,1540427519,RU +1540427520,1540427775,FR +1540427776,1540428287,RU +1540428288,1540428543,SI +1540428544,1540428799,FR +1540428800,1540429055,PL +1540429056,1540429311,BG +1540429312,1540429823,RO +1540429824,1540430079,UA +1540430080,1540430335,FR +1540430336,1540430591,DE +1540430592,1540430847,PL +1540430848,1540431103,CH +1540431104,1540431359,FI +1540431360,1540431615,NO +1540431616,1540431871,GB +1540431872,1540432127,HR +1540432128,1540432383,AT +1540432384,1540432639,GB +1540432640,1540432895,FR +1540432896,1540433151,UA +1540433152,1540433407,GB +1540433408,1540433663,AM +1540433664,1540433919,DK +1540433920,1540434175,GB +1540434176,1540434431,CH +1540434432,1540434687,DE +1540434688,1540434943,GB +1540434944,1540435199,FR +1540435200,1540435455,RO +1540435456,1540435967,GR +1540435968,1540436223,RU +1540436224,1540436479,SI +1540436480,1540436735,GB +1540436736,1540436991,UA +1540436992,1540437247,DE +1540437248,1540437503,CH +1540437504,1540438015,UA +1540438016,1540438271,PL +1540438272,1540438527,LB +1540438528,1540439039,RU +1540439040,1540439295,NO +1540439296,1540439551,RO +1540439552,1540440063,PL +1540440064,1540440319,UA +1540440320,1540440575,RU +1540440576,1540440831,MD +1540440832,1540441087,FR +1540441088,1540441343,PL +1540441344,1540441855,RU +1540441856,1540442111,GB +1540442112,1540442367,RU +1540442368,1540442623,GB +1540442624,1540442879,IE +1540442880,1540443135,AT +1540443136,1540443647,RU +1540443904,1540444159,GB +1540444160,1540444415,RU +1540444416,1540444671,DE +1540444672,1540445183,GB +1540445184,1540445439,CH +1540445440,1540445695,RU +1540445696,1540445951,GB +1540445952,1540446207,DE +1540446208,1540446463,NO +1540446464,1540446719,AT +1540446720,1540446975,UA +1540446976,1540447231,RU +1540447232,1540447487,DE +1540447488,1540447743,PL +1540447744,1540447999,RU +1540448000,1540448255,PL +1540448256,1540448511,UA +1540448512,1540448767,IT +1540448768,1540449023,CH +1540449024,1540449279,DE +1540449280,1540449535,UA +1540449536,1540449791,CZ +1540449792,1540450047,RO +1540450048,1540450303,DE +1540450304,1540450559,GB +1540450560,1540450815,AM +1540450816,1540451071,IE +1540451072,1540451327,FR +1540451328,1540451583,ES +1540451584,1540451839,RO +1540451840,1540452095,GB +1540452096,1540452351,CH +1540452352,1540452607,AT +1540452608,1540452863,IL +1540452864,1540453119,HU +1540453120,1540453375,RU +1540453376,1540453631,PL +1540453632,1540453887,FR +1540453888,1540454143,UA +1540454144,1540454399,RU +1540454400,1540454911,DE +1540454912,1540455167,RU +1540455168,1540455423,RO +1540455424,1540455679,RU +1540455680,1540455935,GB +1540455936,1540456191,UA +1540456192,1540457215,RU +1540457216,1540457471,GE +1540457472,1540457727,SI +1540457728,1540457983,BE +1540457984,1540458239,CH +1540458240,1540458495,ES +1540458496,1540458751,HR +1540458752,1540459007,NL +1540459008,1540459519,UA +1540459520,1540459775,GB +1540459776,1540460031,PL +1540460032,1540460543,NL +1540460544,1540460799,GB +1540460800,1540461055,SI +1540461056,1540461311,BG +1540461312,1540461823,RU +1540461824,1540462079,RO +1540462080,1540462335,SI +1540462336,1540462591,UA +1540462592,1540463103,PL +1540463104,1540463359,FR +1540463360,1540463615,PL +1540463616,1540463871,DK +1540463872,1540464127,UA +1540464128,1540464383,CH +1540464384,1540464895,DE +1540464896,1540465407,GB +1540465408,1540465663,ES +1540465920,1540466175,UA +1540466176,1540466431,DK +1540466432,1540466687,RU +1540466688,1540466943,NL +1540466944,1540467455,CH +1540467456,1540467711,RO +1540467712,1540467967,KW +1540467968,1540468223,GR +1540468224,1540468735,FR +1540468736,1540468991,UA +1540468992,1540469247,PL +1540469248,1540469503,GB +1540469504,1540469759,RO +1540469760,1540470015,PL +1540470016,1540470271,SI +1540470272,1540470527,IL +1540470528,1540471039,RU +1540471040,1540471295,DE +1540471296,1540471551,RU +1540471552,1540471807,GB +1540471808,1540472063,SI +1540472064,1540472319,RO +1540472320,1540472575,DK +1540472576,1540472831,FR +1540472832,1540473087,NL +1540473088,1540473343,UA +1540473344,1540473599,IT +1540473600,1540473855,RO +1540473856,1540474367,GB +1540474368,1540474623,RO +1540474624,1540474879,PL +1540474880,1540475135,GB +1540475136,1540475903,UA +1540475904,1540476159,CH +1540476160,1540476415,DE +1540476416,1540476671,UA +1540476672,1540476927,SI +1540476928,1540477183,NL +1540477184,1540477439,RO +1540477440,1540477695,UA +1540477696,1540477951,DE +1540477952,1540478207,NO +1540478208,1540478463,NL +1540478464,1540478719,UA +1540478720,1540478975,SA +1540478976,1540479231,HR +1540479232,1540479487,GB +1540479488,1540479743,RU +1540479744,1540479999,AT +1540480000,1540480255,GB +1540480256,1540480767,PL +1540480768,1540481023,GB +1540481024,1540481279,LT +1540481280,1540481535,GB +1540481536,1540481791,UA +1540481792,1540482047,RU +1540482048,1540482303,DK +1540482304,1540482559,FR +1540482560,1540482815,CH +1540482816,1540483071,DE +1540483072,1540483327,SE +1540483328,1540483839,RU +1540483840,1540484095,UA +1540484096,1540484351,DK +1540484352,1540484607,SI +1540484608,1540484863,EU +1540484864,1540485119,UA +1540485120,1540485375,SE +1540485376,1540485631,RO +1540485632,1540485887,IR +1540485888,1540486143,ES +1540486144,1540486399,GB +1540486400,1540486655,FR +1540486656,1540486911,GB +1540486912,1540487167,SK +1540487168,1540487423,PS +1540487424,1540487679,UA +1540487680,1540487935,DE +1540487936,1540488447,GB +1540488448,1540488703,SA +1540488704,1540488959,DE +1540488960,1540489215,RO +1540489216,1540491263,RU +1540491264,1540493311,UA +1540493312,1540494335,CZ +1540494336,1540495359,UA +1540495360,1540496383,RU +1540496384,1540499455,UA +1540499456,1540500479,AM +1540500480,1540501503,RU +1540501504,1540502527,PL +1540502528,1540503551,RU +1540503552,1540504575,NL +1540504576,1540505599,SE +1540505600,1540506623,RU +1540506624,1540507647,GB +1540507648,1540508671,RU +1540508672,1540509695,UA +1540509696,1540510719,RO +1540510720,1540511743,RU +1540511744,1540512767,BG +1540512768,1540514815,UA +1540514816,1540515839,GB +1540515840,1540516863,RU +1540516864,1540517887,UA +1540517888,1540518911,RU +1540518912,1540520959,UA +1540520960,1540521983,RU +1540521984,1540523007,PL +1540523008,1540524031,RU +1540524032,1540525055,AL +1540525056,1540526079,AT +1540526080,1540528127,UA +1540528128,1540529151,RU +1540529152,1540530175,UA +1540530176,1540531199,RU +1540531200,1540532223,UA +1540532224,1540533247,RU +1540533248,1540534271,KZ +1540534272,1540535295,UA +1540535296,1540536319,SK +1540536320,1540537343,RU +1540537344,1540538367,UA +1540538368,1540542463,RU +1540542464,1540543487,PL +1540543488,1540544511,DE +1540544512,1540545535,RU +1540545536,1540546559,AT +1540546560,1540548607,RU +1540548608,1540549631,IE +1540549632,1540552703,PL +1540552704,1540553727,UA +1540553728,1540555775,RU +1540555776,1540556799,UZ +1540556800,1540557823,GB +1540557824,1540559871,UA +1540559872,1540562943,RU +1540562944,1540563967,AT +1540563968,1540564991,RU +1540564992,1540566015,DE +1540566016,1540567039,RU +1540567040,1540568063,MD +1540568064,1540572159,RU +1540572160,1540573183,UA +1540573184,1540574207,NL +1540574208,1540576255,RU +1540576256,1540577279,PL +1540577280,1540579327,RU +1540579328,1540580351,IE +1540580352,1540581375,PL +1540581376,1540582399,RU +1540582400,1540583423,BG +1540583424,1540584447,DE +1540584448,1540586495,UA +1540586496,1540588543,RU +1540588544,1540589567,UA +1540589568,1540593663,RU +1540593664,1540594687,GB +1540594688,1540595711,IT +1540595712,1540596735,KZ +1540596736,1540597759,FR +1540597760,1540598783,SE +1540598784,1540600831,UA +1540600832,1540602879,RU +1540602880,1540603903,BG +1540603904,1540605951,RU +1540605952,1540606975,MD +1540606976,1540607999,UA +1540608000,1540609023,RU +1540609024,1540610047,UA +1540610048,1540611071,RU +1540611072,1540612095,PL +1540612096,1540613119,TR +1540613120,1540614143,RU +1540614144,1540615167,BG +1540615168,1540616191,RU +1540616192,1540617215,AT +1540617216,1540618239,LT +1540618240,1540619263,UA +1540619264,1540620287,PL +1540620288,1540620543,NL +1540620544,1540620799,LB +1540620800,1540621055,PL +1540621056,1540621311,DE +1540621312,1540621567,BA +1540621568,1540621823,PL +1540621824,1540622335,RU +1540622336,1540622591,KW +1540622592,1540622847,PL +1540622848,1540623103,LV +1540623104,1540623359,SE +1540623360,1540623615,GB +1540623616,1540623871,BG +1540623872,1540624127,RO +1540624128,1540624383,RS +1540624384,1540624639,IR +1540624640,1540624895,BG +1540624896,1540625151,GB +1540625152,1540625407,IR +1540625408,1540625663,RU +1540625664,1540625919,FR +1540625920,1540626175,UA +1540626176,1540626431,RO +1540626432,1540626687,SI +1540626688,1540626943,PL +1540626944,1540627199,FR +1540627200,1540627455,PL +1540627456,1540627711,DK +1540627712,1540627967,CH +1540627968,1540628223,PL +1540628224,1540628479,HR +1540628480,1540628735,KW +1540628736,1540628991,PL +1540628992,1540629247,UA +1540629248,1540629503,RO +1540629504,1540629759,DK +1540629760,1540630015,BG +1540630016,1540630271,DE +1540630272,1540630527,RO +1540630528,1540630783,CH +1540630784,1540631039,RU +1540631040,1540631295,NL +1540631296,1540631551,CH +1540631552,1540631807,HR +1540631808,1540632063,LV +1540632064,1540632319,AT +1540632320,1540632575,RU +1540632576,1540632831,DK +1540632832,1540633087,GB +1540633088,1540633343,RU +1540633344,1540633599,CH +1540633600,1540633855,RO +1540633856,1540634367,GB +1540634368,1540634623,FR +1540634624,1540634879,UA +1540634880,1540635135,RU +1540635136,1540635391,FR +1540635392,1540635647,RO +1540635648,1540636159,RU +1540636160,1540636415,RO +1540636416,1540636671,LV +1540636672,1540636927,RU +1540636928,1540637183,UA +1540637184,1540637439,RO +1540637440,1540637695,SA +1540637696,1540637951,RU +1540637952,1540638207,RS +1540638208,1540638463,RO +1540638464,1540638719,AM +1540638720,1540638975,UA +1540638976,1540639487,RO +1540639488,1540639743,CH +1540639744,1540639999,IL +1540640000,1540640255,CH +1540640256,1540640511,FR +1540640512,1540640767,ES +1540640768,1540641023,UA +1540641024,1540641535,RU +1540641536,1540641791,DE +1540641792,1540642047,PL +1540642048,1540642303,DE +1540642304,1540642559,PL +1540642560,1540642815,DE +1540642816,1540643071,IE +1540643072,1540643327,UZ +1540643328,1540643583,GB +1540643584,1540643839,CH +1540643840,1540644095,NO +1540644096,1540644607,GB +1540644608,1540644863,DE +1540644864,1540645119,NL +1540645120,1540645375,RU +1540645376,1540645631,BE +1540645632,1540645887,NL +1540645888,1540646143,PL +1540646144,1540646399,RO +1540646400,1540646655,PS +1540646656,1540646911,SE +1540646912,1540647167,RU +1540647168,1540647423,GB +1540647424,1540647679,RU +1540647680,1540647935,CY +1540647936,1540648191,GB +1540648192,1540648447,CH +1540648448,1540648959,RO +1540648960,1540649215,FR +1540649216,1540649471,DE +1540649472,1540649727,IL +1540649728,1540649983,GB +1540649984,1540650239,FR +1540650240,1540650495,CH +1540650496,1540650751,RU +1540650752,1540651007,FR +1540651008,1540651263,RO +1540651264,1540651519,CH +1540651520,1540651775,MK +1540651776,1540652031,RU +1540652032,1540652543,UA +1540652544,1540652799,TR +1540652800,1540653055,EU +1540653056,1540653311,FR +1540653312,1540653567,DK +1540653568,1540653823,DE +1540653824,1540654079,GB +1540654080,1540654335,RS +1540654336,1540654591,RU +1540654592,1540654847,SI +1540654848,1540655103,RU +1540655104,1540655359,AT +1540655360,1540655615,RU +1540655616,1540655871,GB +1540655872,1540656383,NL +1540656384,1540656895,RU +1540656896,1540657151,RO +1540657152,1540657407,DE +1540657408,1540657663,CY +1540657664,1540657919,RU +1540657920,1540658175,FR +1540658176,1540658431,RO +1540658432,1540659199,RU +1540659200,1540659455,FR +1540659456,1540659967,UA +1540659968,1540660223,PL +1540660224,1540660479,UA +1540660480,1540660735,FR +1540660736,1540660991,UA +1540660992,1540661247,RO +1540661248,1540661503,GB +1540661504,1540662015,RO +1540662016,1540662271,BG +1540662272,1540662527,RO +1540662528,1540662783,PL +1540662784,1540663039,GB +1540663040,1540663295,IT +1540663296,1540663551,RU +1540663552,1540664063,PL +1540664064,1540664319,RU +1540664320,1540664575,PL +1540664576,1540665087,UA +1540665088,1540665343,ES +1540665344,1540665599,NL +1540665600,1540665855,UA +1540665856,1540666111,TR +1540666112,1540666367,RU +1540666368,1540666623,UZ +1540666624,1540666879,DE +1540666880,1540667135,GB +1540667136,1540667647,NL +1540667648,1540668159,BE +1540668160,1540668415,AT +1540668416,1540668671,SE +1540668672,1540668927,IL +1540668928,1540669695,RO +1540669696,1540669951,KZ +1540669952,1540670207,UA +1540670208,1540670463,RU +1540670464,1540670719,CH +1540670720,1540670975,RU +1540670976,1540671231,LV +1540671232,1540671487,SI +1540671488,1540671743,CH +1540671744,1540671999,BG +1540672000,1540672255,FR +1540672256,1540672511,UA +1540672512,1540672767,DE +1540672768,1540673023,FR +1540673024,1540673279,DE +1540673280,1540673535,SE +1540673536,1540673791,SI +1540673792,1540674047,SE +1540674048,1540674303,GB +1540674304,1540674559,FR +1540674560,1540674815,GB +1540674816,1540675071,GE +1540675072,1540675327,UA +1540675328,1540675583,NL +1540675584,1540675839,GB +1540675840,1540676351,RU +1540676352,1540676607,IT +1540676608,1540677119,RU +1540677120,1540677375,GB +1540677376,1540677631,PL +1540677632,1540677887,DK +1540677888,1540678143,DE +1540678144,1540678399,RU +1540678400,1540678655,RO +1540678656,1540678911,SE +1540678912,1540679167,RO +1540679168,1540679423,RU +1540679424,1540679679,PL +1540679680,1540679935,LT +1540679936,1540680191,BG +1540680192,1540680447,CH +1540680448,1540680703,BG +1540680704,1540680959,FR +1540680960,1540681215,NL +1540681216,1540681471,FR +1540681472,1540681727,RU +1540681728,1540681983,TR +1540681984,1540682239,IT +1540682240,1540682495,PL +1540682496,1540682751,DE +1540682752,1540683007,EE +1540683008,1540683263,DE +1540683264,1540683775,HR +1540683776,1540684031,UA +1540684032,1540684287,IT +1540684288,1540684543,HU +1540684544,1540684799,SI +1540684800,1540685055,IR +1540685056,1540685311,UA +1540685312,1540685567,RO +1540685568,1540685823,FR +1540685824,1540686079,SE +1540686080,1540686335,TR +1540686336,1540686591,CH +1540686592,1540686847,GB +1540686848,1540687103,CH +1540687104,1540687359,RU +1540687360,1540687615,AT +1540687616,1540687871,IT +1540687872,1540688127,UA +1540688128,1540688383,HU +1540688384,1540688639,CZ +1540688640,1540688895,RO +1540688896,1540689151,BG +1540689152,1540689407,NL +1540689408,1540689663,RU +1540689664,1540689919,FR +1540689920,1540690175,RO +1540690176,1540690431,DK +1540690432,1540690687,SA +1540690688,1540690943,RO +1540690944,1540691711,DE +1540691712,1540691967,RU +1540691968,1540692223,CH +1540692224,1540692479,FR +1540692480,1540692735,BE +1540692736,1540692991,DE +1540692992,1540693247,GB +1540693248,1540693503,RU +1540693504,1540693759,ES +1540693760,1540694015,UZ +1540694016,1540694271,CH +1540694528,1540695039,RO +1540695040,1540695295,DE +1540695296,1540695551,NL +1540695552,1540695807,PL +1540695808,1540696063,RU +1540696064,1540696319,HU +1540696320,1540696575,FR +1540696576,1540696831,GB +1540696832,1540697087,EE +1540697088,1540697343,RU +1540697344,1540697599,GB +1540697600,1540697855,ES +1540697856,1540698111,NO +1540698112,1540698367,DE +1540698368,1540698623,IE +1540698624,1540698879,EU +1540698880,1540699135,RU +1540699136,1540699391,GR +1540699392,1540699647,NL +1540699648,1540699903,AT +1540699904,1540700159,RO +1540700160,1540700415,DE +1540700416,1540700671,RO +1540700672,1540700927,PL +1540700928,1540701183,UA +1540701184,1540701695,DE +1540701696,1540701951,UA +1540701952,1540702207,GB +1540702208,1540702463,PL +1540702464,1540702719,PT +1540702720,1540702975,AT +1540702976,1540703231,RU +1540703232,1540703487,MH +1540703488,1540703743,NL +1540703744,1540703999,DK +1540704000,1540704255,PL +1540704256,1540704511,KZ +1540704512,1540704767,IE +1540704768,1540705023,UA +1540705024,1540705279,HU +1540705280,1540705535,RO +1540705536,1540705791,AT +1540705792,1540706047,NL +1540706048,1540706303,FR +1540706304,1540706559,SI +1540706560,1540706815,GB +1540706816,1540707071,FR +1540707072,1540707583,GB +1540707584,1540707839,NL +1540707840,1540708095,MD +1540708096,1540708351,RU +1540708352,1540708607,PL +1540708608,1540708863,SI +1540708864,1540709119,FR +1540709120,1540709375,DE +1540709376,1540709631,UA +1540709632,1540709887,KZ +1540709888,1540710143,UA +1540710144,1540710399,NL +1540710400,1540710655,PL +1540710656,1540710911,FI +1540710912,1540711423,DE +1540711424,1540711679,CH +1540711680,1540711935,RO +1540711936,1540712191,FR +1540712192,1540712447,DE +1540712448,1540712703,RU +1540712704,1540713215,LV +1540713216,1540713727,PL +1540713728,1540713983,RU +1540713984,1540714239,GB +1540714240,1540714495,RO +1540714496,1540714751,NL +1540714752,1540715519,RU +1540715520,1540715775,DE +1540715776,1540716031,UA +1540716032,1540716287,PL +1540716288,1540716543,UA +1540716544,1540716799,RU +1540716800,1540717055,UA +1540717056,1540717311,CZ +1540717312,1540717823,PL +1540717824,1540718079,UA +1540718080,1540718335,CR +1540718336,1540718591,DE +1540718592,1540718847,CH +1540718848,1540719103,IT +1540719104,1540719359,RU +1540719360,1540719615,SI +1540719616,1540719871,AT +1540719872,1540720127,CH +1540720128,1540720383,NL +1540720384,1540720639,RO +1540720640,1540720895,CH +1540720896,1540721151,PL +1540721152,1540721663,RU +1540721664,1540721919,GB +1540721920,1540722431,RU +1540722432,1540722687,CZ +1540722688,1540722943,RU +1540722944,1540723455,FR +1540723456,1540723711,SI +1540723712,1540723967,RU +1540723968,1540724223,UA +1540724224,1540724479,HU +1540724480,1540724735,DE +1540724736,1540724991,CH +1540724992,1540725247,IT +1540725248,1540725503,UA +1540725504,1540725759,SE +1540725760,1540726015,PL +1540726016,1540726271,TT +1540726272,1540726527,RU +1540726528,1540726783,CH +1540726784,1540727039,CZ +1540727040,1540727295,FI +1540727296,1540727551,PL +1540727552,1540727807,RU +1540727808,1540728063,GB +1540728064,1540728319,NL +1540728320,1540729343,RU +1540729344,1540729599,PL +1540729600,1540729855,CH +1540729856,1540730111,RU +1540730112,1540730367,GB +1540730368,1540730623,RU +1540730624,1540730879,UA +1540730880,1540731135,IL +1540731136,1540731391,DE +1540731392,1540731647,NL +1540731648,1540731903,SE +1540731904,1540732159,FR +1540732160,1540732415,MD +1540732416,1540732671,UA +1540732672,1540732927,GB +1540732928,1540733183,RU +1540733184,1540733439,UA +1540733440,1540733695,RU +1540733696,1540733951,UA +1540733952,1540734207,GB +1540734208,1540734463,RU +1540734464,1540734719,NL +1540734720,1540734975,IQ +1540734976,1540735231,UA +1540735232,1540735487,PL +1540735488,1540735743,CH +1540735744,1540735999,NL +1540736000,1540736255,RU +1540736256,1540736511,IT +1540736512,1540736767,DE +1540736768,1540737791,GB +1540737792,1540738047,NO +1540738048,1540738303,AT +1540738304,1540738559,SA +1540738560,1540738815,PL +1540738816,1540739071,DE +1540739072,1540739327,SE +1540739328,1540739583,PA +1540739584,1540739839,IT +1540739840,1540740095,CZ +1540740096,1540740351,GB +1540740352,1540740607,SA +1540740608,1540740863,NL +1540740864,1540741119,RO +1540741120,1540741375,GB +1540741376,1540741631,EU +1540741632,1540742143,NL +1540742144,1540742399,RU +1540742400,1540742655,DE +1540742656,1540742911,AT +1540742912,1540743167,RU +1540743168,1540743423,NO +1540743424,1540743679,RU +1540743680,1540743935,MD +1540743936,1540744191,CH +1540744192,1540744447,GR +1540744448,1540744703,UA +1540744704,1540744959,GB +1540744960,1540745215,UA +1540745216,1540745471,DE +1540745472,1540745727,KG +1540745728,1540746239,AT +1540746240,1540746495,FR +1540746496,1540747263,PL +1540747264,1540747519,RU +1540747520,1540747775,SI +1540747776,1540748031,FR +1540748032,1540748287,RU +1540748288,1540748543,CZ +1540748544,1540748799,TR +1540748800,1540749055,SE +1540749056,1540749311,RU +1540749312,1540749567,UZ +1540749568,1540749823,RU +1540749824,1540750079,SE +1540750080,1540750335,BE +1540750336,1540750591,GB +1540750592,1540751103,TR +1540751104,1540752383,PL +1540752384,1540753407,GB +1540753408,1540754431,DE +1540754432,1540755455,RO +1540755456,1540756479,UA +1540756480,1540757503,DK +1540757504,1540758527,PL +1540758528,1540760575,UA +1540760576,1540761599,PL +1540761600,1540762623,RU +1540762624,1540763647,LU +1540763648,1540764671,UA +1540764672,1540765695,PL +1540765696,1540766719,RU +1540766720,1540767743,IT +1540767744,1540768767,GB +1540768768,1540769791,RU +1540769792,1540770815,IT +1540770816,1540771839,RU +1540771840,1540773887,UA +1540773888,1540774911,SE +1540774912,1540775935,GB +1540775936,1540776959,RU +1540776960,1540777983,IL +1540777984,1540779007,HR +1540779008,1540780031,NL +1540780032,1540781055,UA +1540781056,1540783103,RU +1540783104,1540787199,UA +1540787200,1540788223,KZ +1540788224,1540790271,RU +1540790272,1540791295,KW +1540791296,1540792319,CZ +1540792320,1540793343,UA +1540793344,1540794367,FI +1540794368,1540795391,CH +1540795392,1540796415,RU +1540796416,1540798463,UA +1540798464,1540799487,RU +1540799488,1540800511,RO +1540800512,1540801535,CZ +1540801536,1540802559,RU +1540802560,1540803583,MD +1540803584,1540804607,RU +1540804608,1540805631,UA +1540805632,1540809727,RU +1540809728,1540810751,GB +1540810752,1540811775,UA +1540811776,1540812799,PL +1540812800,1540813823,RU +1540813824,1540815871,UA +1540815872,1540816895,DE +1540816896,1540817919,PL +1540817920,1540818943,NL +1540818944,1540819967,UA +1540819968,1540820991,CZ +1540820992,1540822015,RU +1540822016,1540823039,FR +1540823040,1540824063,UA +1540824064,1540825087,RU +1540825088,1540826111,PL +1540826112,1540828159,RU +1540828160,1540829183,PL +1540829184,1540830207,RU +1540830208,1540833279,UA +1540833280,1540834303,ES +1540834304,1540835327,UA +1540835328,1540836351,DE +1540836352,1540837375,RU +1540837376,1540838399,PL +1540838400,1540840447,RU +1540840448,1540841471,SE +1540841472,1540842495,RO +1540842496,1540843519,DE +1540843520,1540844543,PL +1540844544,1540846591,RU +1540846592,1540847615,DE +1540847616,1540848639,RU +1540848640,1540849663,UA +1540849664,1540850687,RU +1540850688,1540851711,FI +1540851712,1540852735,UA +1540852736,1540853759,RU +1540853760,1540854783,UA +1540854784,1540855807,NL +1540855808,1540856831,RU +1540856832,1540857855,NL +1540857856,1540858879,DK +1540858880,1540859903,GB +1540859904,1540860927,RU +1540860928,1540861951,KZ +1540861952,1540862975,BY +1540862976,1540865023,GB +1540865024,1540872191,RU +1540872192,1540873215,BG +1540873216,1540875263,RU +1540875264,1540876287,PL +1540876288,1540877311,RU +1540877312,1540878335,PL +1540878336,1540879359,AT +1540879360,1540880383,RU +1540880384,1540881407,UA +1540881408,1540882431,RU +1540882432,1540882687,SE +1540882688,1540883199,LV +1540883200,1540883455,RU +1540883456,1540883711,IR +1540883712,1540883967,PL +1540883968,1540884223,IE +1540884224,1540884479,SE +1540884480,1540884991,GB +1540884992,1540885247,BE +1540885248,1540885503,UA +1540885504,1540885759,ES +1540885760,1540886015,DE +1540886016,1540886271,DK +1540886272,1540886527,UA +1540886528,1540886783,PL +1540886784,1540887039,IT +1540887040,1540887295,GB +1540887296,1540887551,FR +1540887552,1540887807,BE +1540887808,1540888063,MD +1540888064,1540888319,UA +1540888320,1540888575,DE +1540888576,1540888831,SE +1540888832,1540889087,PL +1540889088,1540889343,FR +1540889344,1540889599,RO +1540889600,1540889855,UA +1540889856,1540890111,FR +1540890112,1540890367,PL +1540890368,1540890623,IL +1540890624,1540890879,SE +1540890880,1540891135,DE +1540891136,1540891391,NL +1540891392,1540891647,DE +1540891648,1540891903,CH +1540892160,1540892415,IT +1540892416,1540892671,UA +1540892672,1540892927,GB +1540892928,1540893183,BE +1540893184,1540893439,GB +1540893440,1540893695,FR +1540893696,1540893951,HU +1540893952,1540894207,DE +1540894208,1540894463,RU +1540894464,1540894719,RO +1540894720,1540894975,RS +1540894976,1540895487,RU +1540895488,1540895743,PL +1540895744,1540895999,RO +1540896000,1540896255,RU +1540896256,1540896511,SI +1540896512,1540896767,GB +1540896768,1540897023,EU +1540897024,1540897279,GB +1540897280,1540897535,FR +1540897536,1540897791,RU +1540897792,1540898047,HU +1540898048,1540898303,UA +1540898304,1540898559,SE +1540898560,1540898815,ES +1540898816,1540899071,PL +1540899328,1540899583,RU +1540899584,1540899839,FR +1540899840,1540900351,RU +1540900352,1540900607,HU +1540900608,1540900863,BG +1540900864,1540901119,RU +1540901120,1540901375,EU +1540901376,1540901631,DE +1540901632,1540901887,RO +1540901888,1540902143,GR +1540902144,1540902399,FI +1540902400,1540902655,RO +1540902656,1540902911,DE +1540902912,1540903167,RO +1540903168,1540903423,RU +1540903424,1540903679,GB +1540903680,1540904447,FR +1540904448,1540904703,EE +1540904704,1540904959,SI +1540904960,1540905471,GB +1540905472,1540905727,DE +1540905728,1540905983,TR +1540905984,1540906239,AT +1540906240,1540906495,GB +1540906496,1540906751,UA +1540906752,1540907007,BG +1540907008,1540907263,RU +1540907264,1540907519,MD +1540907520,1540907775,RU +1540907776,1540908031,PL +1540908032,1540908287,NL +1540908288,1540908543,DK +1540908544,1540908799,IT +1540908800,1540909055,DK +1540909056,1540909311,NL +1540909312,1540909567,GB +1540909568,1540909823,UA +1540909824,1540910079,FR +1540910080,1540910335,DE +1540910336,1540910591,SI +1540910592,1540910847,FR +1540910848,1540911103,SE +1540911104,1540911359,GB +1540911360,1540911615,NL +1540911616,1540912127,RU +1540912128,1540912383,GB +1540912384,1540912639,PT +1540912640,1540912895,DK +1540912896,1540913151,TR +1540913152,1540913407,AT +1540913408,1540913663,RU +1540913664,1540913919,MD +1540913920,1540914175,RU +1540914176,1540914687,PL +1540914688,1540914943,RU +1540914944,1540915199,IT +1540915200,1540915455,DE +1540915456,1540915967,RU +1540915968,1540916479,NL +1540916480,1540916735,UA +1540916736,1540916991,PL +1540916992,1540917247,UA +1540917248,1540917503,FI +1540917504,1540918015,GB +1540918016,1540918527,FR +1540918528,1540918783,EU +1540918784,1540919039,NL +1540919040,1540919295,GB +1540919296,1540919551,RO +1540919552,1540919807,BE +1540919808,1540920063,GB +1540920064,1540920319,RU +1540920320,1540920575,TR +1540920576,1540920831,PL +1540920832,1540921087,HU +1540921088,1540921599,RO +1540921600,1540921855,MT +1540921856,1540922111,EU +1540922112,1540922367,ES +1540922368,1540922879,RO +1540922880,1540923135,DE +1540923136,1540923391,GB +1540923392,1540923647,PL +1540923648,1540923903,UA +1540923904,1540924159,DE +1540924160,1540924415,LT +1540924416,1540924671,RU +1540924672,1540924927,UA +1540924928,1540925183,MD +1540925184,1540925439,RU +1540925440,1540925695,CZ +1540925696,1540925951,AE +1540925952,1540926207,TR +1540926208,1540926463,FR +1540926464,1540926719,SI +1540926720,1540926975,UA +1540926976,1540927231,BG +1540927232,1540927487,RU +1540927488,1540927743,GE +1540927744,1540927999,RO +1540928000,1540928255,KZ +1540928256,1540928511,CZ +1540928512,1540928767,GR +1540928768,1540929023,GB +1540929024,1540929279,DK +1540929280,1540929535,GB +1540929536,1540929791,NL +1540929792,1540930047,CZ +1540930048,1540930303,FR +1540930304,1540930559,RU +1540930560,1540930815,KW +1540930816,1540931071,KZ +1540931072,1540931327,EU +1540931328,1540931583,PL +1540931584,1540931839,RU +1540931840,1540932095,GB +1540932096,1540932351,PL +1540932352,1540932607,FR +1540932608,1540932863,UA +1540932864,1540933119,GB +1540933120,1540933375,RU +1540933376,1540933631,RO +1540933632,1540933887,NL +1540933888,1540934143,TR +1540934144,1540934399,PL +1540934400,1540934655,FR +1540934656,1540934911,PL +1540934912,1540935167,RU +1540935168,1540935423,GR +1540935424,1540935679,NL +1540935680,1540935935,RU +1540935936,1540936191,FR +1540936192,1540936447,CY +1540936448,1540936959,RU +1540936960,1540937471,PL +1540937472,1540937727,RU +1540937728,1540937983,DE +1540938240,1540938751,ES +1540938752,1540939007,KZ +1540939008,1540939263,FR +1540939264,1540939519,IL +1540939520,1540939775,TR +1540939776,1540940031,PL +1540940032,1540940287,RO +1540940288,1540940543,DK +1540940544,1540940799,RO +1540940800,1540941055,FR +1540941056,1540941311,CH +1540941312,1540941567,AT +1540941568,1540941823,UA +1540941824,1540942079,RU +1540942080,1540942335,RO +1540942336,1540942591,FR +1540942592,1540942847,DE +1540942848,1540943103,IE +1540943104,1540943359,UA +1540943360,1540943615,BE +1540943616,1540943871,PL +1540943872,1540944127,UA +1540944128,1540944383,IE +1540944384,1540944639,AT +1540944640,1540944895,DE +1540944896,1540945151,UA +1540945152,1540945407,DE +1540945408,1540945663,GB +1540945664,1540945919,AT +1540945920,1540946175,DE +1540946176,1540946431,AT +1540946432,1540946687,RU +1540946688,1540946943,UA +1540946944,1540947199,IL +1540947200,1540947455,BG +1540947456,1540947711,PL +1540947712,1540947967,IS +1540947968,1540948479,PL +1540948480,1540948991,RU +1540948992,1540949503,UA +1540949504,1540950015,RU +1540950016,1540951551,UA +1540951552,1540952063,RS +1540952064,1540952575,RU +1540952576,1540953087,PL +1540953088,1540953599,RU +1540953600,1540954111,UA +1540954112,1540954623,PL +1540954624,1540955647,RO +1540955648,1540956159,NL +1540956160,1540956671,SK +1540956672,1540957183,RU +1540957184,1540957695,DE +1540957696,1540958207,AT +1540958208,1540958719,PL +1540958720,1540959231,RU +1540959232,1540959743,FR +1540959744,1540960255,RU +1540960256,1540960767,PL +1540960768,1540961279,RU +1540961280,1540961791,CZ +1540961792,1540962303,HU +1540962304,1540962815,NL +1540962816,1540963327,EU +1540980736,1540980991,CH +1540980992,1540981247,RU +1540981248,1540981503,RO +1540981504,1540981759,DE +1540981760,1540982015,PL +1540982016,1540982271,DK +1540982272,1540982783,GB +1540982784,1540983295,RU +1540983296,1540983551,ME +1540983552,1540983807,CH +1540983808,1540984063,FR +1540984064,1540984319,DE +1540984320,1540984575,PL +1540984576,1540984831,RU +1540984832,1540985087,UA +1540985088,1540985343,DE +1540985344,1540985599,NL +1540985600,1540985855,TR +1540985856,1540986111,BG +1540986112,1540986367,AT +1540986368,1540986623,PL +1540986624,1540986879,FR +1540986880,1540987135,PL +1540987136,1540987391,UA +1540987392,1540987647,FR +1540987648,1540987903,GR +1540987904,1540988159,RU +1540988160,1540988415,AM +1540988416,1540988671,PL +1540988672,1540988927,RU +1540988928,1540989183,GB +1540989184,1540989439,PL +1540989440,1540989695,UA +1540989696,1540989951,PL +1540989952,1540990207,FR +1540990208,1540990463,DE +1540990720,1540990975,UA +1540990976,1540991231,FR +1540991232,1540991487,HU +1540991488,1540991743,CH +1540991744,1540991999,PL +1540992000,1540992255,FR +1540992256,1540992511,AT +1541013504,1541014527,RO +1541014528,1541015551,AM +1541015552,1541016575,RU +1541016576,1541018623,UA +1541018624,1541019647,ES +1541019648,1541020671,RU +1541020672,1541023743,UA +1541023744,1541024767,RU +1541024768,1541026815,UA +1541026816,1541027839,LV +1541027840,1541028863,RU +1541028864,1541029887,PL +1541029888,1541030911,UA +1541030912,1541031935,DE +1541031936,1541032959,UA +1541032960,1541033983,PL +1541033984,1541035007,BG +1541035008,1541036031,RU +1541036032,1541037055,UA +1541037056,1541038079,RU +1541038080,1541039103,UA +1541039104,1541040127,RU +1541040128,1541041151,UA +1541041152,1541042175,RU +1541042176,1541043199,DE +1541043200,1541044223,RU +1541044224,1541045247,US +1541045248,1541046271,NL +1541046272,1541051391,RU +1541051392,1541052415,NL +1541052416,1541053439,RO +1541053440,1541054463,PL +1541054464,1541055487,RU +1541056512,1541057535,TJ +1541057536,1541058559,RS +1541058560,1541059583,RU +1541059584,1541060607,AM +1541060608,1541061631,NO +1541061632,1541062655,CZ +1541062656,1541063679,UA +1541063680,1541065727,PL +1541065728,1541066751,NL +1541066752,1541067775,PL +1541067776,1541068799,UA +1541068800,1541069823,PL +1541069824,1541070847,RU +1541070848,1541071871,IT +1541071872,1541072895,RU +1541072896,1541073919,CZ +1541073920,1541074943,RO +1541074944,1541075967,PL +1541075968,1541078015,RU +1541078016,1541079039,RO +1541079040,1541080063,PL +1541080064,1541081087,RU +1541081088,1541082111,DE 1543503872,1545601023,GB 1545601024,1545863167,SE 1545863168,1545895935,RU 1545895936,1545928703,BA -1545928704,1545959423,SI -1545959424,1545961471,HR +1545928704,1545961471,SI 1545961472,1545994239,RU 1545994240,1546027007,CZ 1546027008,1546059775,RU @@ -24452,31 +43348,31 @@ 1546091008,1546091135,NA 1546091136,1546091263,KM 1546091264,1546091391,GN -1546091392,1546091519,DE +1546091392,1546091519,HT 1546091520,1546091647,AF 1546091648,1546091775,TD 1546091776,1546091903,BF -1546091904,1546092031,DE +1546091904,1546092031,RW 1546092032,1546092159,TG 1546092160,1546092287,SD 1546092288,1546092415,RW 1546092416,1546092543,NG 1546092544,1546096639,RU 1546096640,1546100735,IT -1546100736,1546104831,RU -1546108928,1546113023,GB +1546100736,1546104831,AT +1546104832,1546108927,IE +1546108928,1546113023,IM 1546113024,1546121215,RU -1546121216,1546125311,GR +1546121216,1546124799,ES +1546124800,1546125311,FR 1546125312,1546256383,GB 1546256384,1546264575,RU -1546264576,1546266623,GB +1546264576,1546266623,TR 1546266624,1546268671,RU 1546268672,1546270719,IR 1546270720,1546272767,GB 1546272768,1546274815,NO 1546274816,1546276863,SE -1546276864,1546278399,GB -1546278400,1546278911,BZ 1546278912,1546280959,RU 1546280960,1546283007,IT 1546283008,1546285055,CH @@ -24491,19 +43387,21 @@ 1546301440,1546303487,LU 1546303488,1546305535,CH 1546305536,1546307583,DE -1546307584,1546307839,NL -1546307840,1546307855,DE -1546307856,1546309631,NL -1546309632,1546311679,RU +1546307584,1546311679,RU 1546311680,1546313727,FR 1546313728,1546315775,DE 1546315776,1546317823,NL 1546317824,1546319871,CH -1546319872,1546321919,CS +1546319872,1546320383,RS +1546320384,1546320387,SR +1546320388,1546321919,RS 1546321920,1546323967,RU 1546323968,1546324479,GE 1546324480,1546326015,NO -1546326016,1546328063,ES +1546326016,1546327295,ES +1546327296,1546327551,FR +1546327552,1546328063,ES +1546328064,1546330111,CZ 1546330112,1546332159,SE 1546332160,1546334207,GB 1546334208,1546336255,DE @@ -24513,7 +43411,9 @@ 1546342400,1546344447,TR 1546344448,1546346495,DK 1546346496,1546348543,AT -1546348544,1546350591,DE +1546348544,1546350399,DE +1546350400,1546350431,JP +1546350432,1546350591,DE 1546350592,1546352639,PL 1546352640,1546354687,DK 1546354688,1546356735,FR @@ -24534,11 +43434,29 @@ 1546387456,1546518527,TR 1546518528,1546649599,KZ 1546649600,1546665983,SA -1546665984,1546677503,GB -1546677504,1546677759,IN -1546677760,1546680831,GB -1546680832,1546680863,RS -1546680864,1546682367,GB +1546665984,1546673823,GB +1546673824,1546673839,RS +1546673840,1546677503,GB +1546677504,1546677551,IN +1546677552,1546677555,GB +1546677556,1546677557,IN +1546677558,1546677559,GB +1546677560,1546677561,IN +1546677562,1546677567,GB +1546677568,1546677569,IN +1546677570,1546677571,GB +1546677572,1546677573,IN +1546677574,1546677679,GB +1546677680,1546677695,IN +1546677696,1546678863,GB +1546678864,1546678871,RS +1546678872,1546680831,GB +1546680832,1546680895,RS +1546680896,1546681407,GB +1546681408,1546681439,RS +1546681440,1546681455,GB +1546681456,1546681471,RS +1546681472,1546682367,GB 1546682368,1546698751,BE 1546698752,1546715135,NL 1546715136,1546731519,LV @@ -24553,7 +43471,6 @@ 1546895360,1546911743,IE 1546911744,1546928127,SK 1546928128,1546944511,GB -1546944512,1546960895,UA 1546960896,1546977279,HU 1546977280,1546993663,MK 1546993664,1547010047,RU @@ -24600,11 +43517,16 @@ 1547563008,1547564287,NL 1547564288,1547564311,CH 1547564312,1547564315,BG -1547564316,1547564543,NL +1547564316,1547564335,NL +1547564336,1547564415,US +1547564416,1547564439,NZ +1547564440,1547564543,NL 1547564544,1547564799,US -1547564800,1547565055,NL -1547565056,1547565823,US -1547565824,1547567103,NL +1547564800,1547564831,NL +1547564832,1547564863,LV +1547564864,1547565055,NL +1547565056,1547566079,US +1547566080,1547567103,NL 1547567104,1547571199,GB 1547571200,1547575295,AT 1547575296,1547579391,NO @@ -24614,27 +43536,91 @@ 1547591680,1547595775,EE 1547595776,1547599871,JO 1547599872,1547603967,LT +1547603968,1547608063,RU 1547608064,1547612159,LB 1547612160,1547616255,IR 1547616256,1547620351,DK +1547620352,1547620359,A2 +1547620360,1547620367,NG +1547620368,1547620375,A2 +1547620376,1547620383,NG +1547620384,1547620399,A2 +1547620400,1547620407,NG +1547620408,1547620415,A2 +1547620416,1547620423,NG +1547620424,1547620439,A2 +1547620440,1547620551,NG +1547620552,1547620559,A2 +1547620560,1547620615,NG +1547620616,1547620639,A2 +1547620640,1547620647,NG +1547620648,1547620863,A2 +1547620864,1547620871,NG +1547620872,1547620879,A2 +1547620880,1547620887,NG +1547620888,1547620895,A2 +1547620896,1547620903,NG +1547620904,1547620911,A2 +1547620912,1547620935,NG +1547620936,1547620951,A2 +1547620952,1547620959,NG +1547620960,1547620967,A2 +1547620968,1547620983,NG +1547620984,1547620999,A2 +1547621000,1547621031,NG +1547621032,1547621039,A2 +1547621040,1547621063,NG +1547621064,1547621071,A2 +1547621072,1547621087,NG +1547621088,1547621095,A2 +1547621096,1547621119,NG +1547621120,1547621127,A2 +1547621128,1547621135,NG +1547621136,1547621143,A2 +1547621144,1547621151,NG +1547621152,1547621167,A2 +1547621168,1547621191,NG +1547621192,1547621199,A2 +1547621200,1547621223,NG +1547621224,1547621231,A2 +1547621232,1547621239,NG +1547621240,1547621247,A2 +1547621248,1547621263,NG +1547621264,1547621271,A2 +1547621272,1547621279,NG +1547621280,1547621303,A2 +1547621304,1547621335,NG +1547621336,1547621351,A2 +1547621352,1547621375,NG +1547621376,1547622463,A2 +1547622464,1547622471,NG +1547622472,1547624447,A2 1547624448,1547628543,CZ 1547628544,1547632639,BG 1547632640,1547636735,TR 1547636736,1547640831,SI -1547640832,1547644927,LB +1547640832,1547644927,PL 1547644928,1547649023,CZ 1547649024,1547653119,RU -1547653120,1547657215,LV -1547657216,1547659263,RU -1547659264,1547661311,LU +1547653120,1547654911,LV +1547654912,1547655167,SE +1547655168,1547657215,LV +1547657216,1547660287,RU +1547660288,1547661311,BE 1547661312,1547665407,LV 1547665408,1547669503,GB -1547669504,1547673599,AT +1547669504,1547672575,AT +1547672576,1547673087,HR +1547673088,1547673599,AT 1547673600,1547685887,RU 1547685888,1547689983,AT 1547689984,1547694079,IT 1547694080,1547698175,HU -1547698176,1548222463,NL +1547698176,1547777119,NL +1547777120,1547777127,IT +1547777128,1548157119,NL +1548157120,1548157183,DE +1548157184,1548222463,NL 1548222464,1548746751,DE 1548746752,1549271039,RO 1549271040,1549795327,FR @@ -24644,22 +43630,41 @@ 1550319616,1550581759,CH 1550581760,1550843903,NL 1550843904,1550974975,UA -1550974976,1551007743,RO +1550974976,1550996223,RO +1550996224,1550996479,CH +1550996480,1551007743,RO 1551007744,1551106047,MD 1551106048,1551237119,DE 1551237120,1551368191,GR 1551368192,1551499263,NL +1551499264,1551503359,EU 1551503360,1551504383,GB 1551504384,1551505407,FR +1551505408,1551507455,EU 1551507456,1551508479,DE 1551508480,1551509503,IT -1551511552,1551512575,GB +1551509504,1551516671,EU 1551516672,1551517695,IT 1551517696,1551518719,ES +1551518720,1551528959,EU 1551528960,1551529983,FR +1551529984,1551544319,EU +1551544320,1551547391,DE +1551547392,1551548415,EU +1551548416,1551551487,DE +1551551488,1551556607,EU +1551556608,1551558655,FR +1551558656,1551564799,EU +1551564800,1551572991,FR +1551572992,1551576063,NL +1551576064,1551577087,EU +1551577088,1551580159,NL +1551580160,1551630335,EU 1551630336,1551892479,RU 1551892480,1556086783,FR -1556086784,1558708223,DE +1556086784,1556486729,DE +1556486730,1556486730,A2 +1556486731,1558708223,DE 1558708224,1559232511,GB 1559232512,1559240703,IL 1559240704,1559248895,BA @@ -24675,10 +43680,11 @@ 1559322624,1559330815,RU 1559330816,1559339007,BA 1559339008,1559339711,RU -1559339712,1559339775,CY -1559339776,1559347199,RU -1559347200,1559351295,SE -1559351296,1559355391,DK +1559339712,1559339775,A1 +1559339776,1559341695,RU +1559341696,1559341703,ES +1559341704,1559347199,RU +1559347200,1559355391,SE 1559355392,1559388159,RU 1559388160,1559396351,UA 1559396352,1559404543,GB @@ -24712,8 +43718,7 @@ 1559633920,1559642111,IT 1559642112,1559650303,RU 1559650304,1559658495,IT -1559658496,1559674879,RU -1559674880,1559683071,ES +1559658496,1559683071,RU 1559683072,1559691263,CH 1559691264,1559756799,BG 1559756800,1559789567,AT @@ -24721,25 +43726,26 @@ 1559838720,1559855103,UA 1559855104,1559887871,HU 1559887872,1559920639,PT -1559920640,1559937023,LU -1559937024,1559943167,DE -1559943168,1559953407,LU +1559920640,1559932927,LU +1559932928,1559953407,DE 1559953408,1559986175,MT 1559986176,1560018943,IE 1560018944,1560051711,DE 1560051712,1560084479,RU -1560084480,1560117247,GR +1560084480,1560117247,JO 1560117248,1560150015,CZ 1560150016,1560182783,NL 1560182784,1560215551,SE 1560215552,1560281087,RU 1560281088,1562378239,FR -1562378240,1564999679,IT +1562378240,1564404895,IT +1564404896,1564404903,A2 +1564404904,1564999679,IT 1564999680,1565523967,UA 1565523968,1565655039,RU 1565655040,1565786111,AT 1565786112,1565917183,BY -1565917184,1566048255,CS +1565917184,1566048255,RS 1566048256,1566056447,RU 1566056448,1566060543,IT 1566060544,1566064639,UA @@ -24752,13 +43758,17 @@ 1566097408,1566101503,GB 1566101504,1566105599,RU 1566105600,1566109695,DE -1566109696,1566113791,CH +1566109696,1566111231,CH +1566111232,1566111295,FR +1566111296,1566113791,CH 1566113792,1566117887,DE 1566117888,1566121983,TR 1566121984,1566126079,NO 1566126080,1566130175,IT 1566130176,1566134271,TR -1566134272,1566138367,GB +1566134272,1566134999,GB +1566135000,1566135007,ES +1566135008,1566138367,GB 1566138368,1566142463,CZ 1566142464,1566146559,NO 1566146560,1566150655,GB @@ -24767,7 +43777,6 @@ 1566158848,1566162943,RU 1566162944,1566167039,PL 1566167040,1566171135,UA -1566171136,1566175231,HU 1566175232,1566179327,IE 1566179328,1566183423,DK 1566183424,1566187519,ES @@ -24785,12 +43794,12 @@ 1566248960,1566257151,GB 1566257152,1566261247,CZ 1566261248,1566265343,TR -1566265344,1566269439,DE +1566265344,1566269439,A2 1566269440,1566271487,NO 1566271488,1566271999,FI 1566272000,1566272511,SE -1566272512,1566273023,DK -1566273024,1566273535,NO +1566272512,1566273535,NO +1566273536,1566277631,RU 1566277632,1566281727,IT 1566281728,1566285823,CZ 1566285824,1566289919,RU @@ -24805,10 +43814,11 @@ 1566316544,1566318591,NO 1566318592,1566320639,RU 1566320640,1566321151,GB -1566321152,1566321407,DE +1566321152,1566321407,NL 1566321408,1566321663,UA 1566321664,1566321919,BZ -1566321920,1566322687,GB +1566321920,1566322431,GB +1566322432,1566322687,BS 1566322688,1566324735,CZ 1566324736,1566326783,HU 1566326784,1566328831,RU @@ -24838,32 +43848,53 @@ 1566382080,1566384127,TR 1566384128,1566386175,RU 1566386176,1566388223,FR -1566388224,1566388735,HU -1566388736,1566389247,US -1566389248,1566389759,HU +1566388224,1566388991,HU +1566388992,1566389247,SC +1566389248,1566389503,HU +1566389504,1566389759,SC 1566389760,1566390271,US 1566390272,1566392319,LT 1566392320,1566394367,ES 1566394368,1566396415,NO 1566396416,1566398463,GB 1566398464,1566400511,RU -1566400512,1566401023,NO +1566400512,1566400575,NO +1566400576,1566400607,NL +1566400608,1566400639,GB +1566400640,1566400671,NO +1566400672,1566400703,DE +1566400704,1566400735,NL +1566400736,1566400767,DE +1566400768,1566400832,NO +1566400833,1566400895,GB +1566400896,1566401023,NO 1566401024,1566401055,US -1566401056,1566402559,NO +1566401056,1566401087,NO +1566401088,1566401215,US +1566401216,1566401279,NO +1566401280,1566401535,US +1566401536,1566401599,IN +1566401600,1566401663,CN +1566401664,1566401727,SG +1566401728,1566401791,AU +1566401792,1566401856,SI +1566401857,1566401919,HK +1566401920,1566401983,NO +1566401984,1566402047,AU +1566402048,1566402559,NO 1566402560,1566404607,IT 1566404608,1566406655,ES 1566406656,1566408703,NL 1566408704,1566410751,GB 1566410752,1566414847,RU -1566414848,1566416895,SE +1566414848,1566416895,FR 1566416896,1566418943,IT 1566418944,1566420991,RU 1566420992,1566423039,ES 1566423040,1566425087,FR 1566425088,1566427135,RS 1566427136,1566429183,IT -1566429184,1566435327,GB -1566435328,1566437375,IT +1566429184,1566437375,GB 1566437376,1566439423,BE 1566439424,1566443519,DE 1566443520,1566445567,NO @@ -24871,14 +43902,24 @@ 1566447616,1566451711,IT 1566451712,1566453759,IL 1566453760,1566455807,IQ -1566455808,1566457855,PT +1566455808,1566456351,PT +1566456352,1566456359,AO +1566456360,1566457855,PT 1566457856,1566459903,CH -1566459904,1566461951,SK +1566459904,1566461951,GB 1566461952,1566463999,DE 1566464000,1566466047,IT 1566466048,1566468095,ES -1566468096,1566470143,BE -1566470144,1566472191,IE +1566468096,1566468879,BE +1566468880,1566468895,HU +1566468896,1566469391,BE +1566469392,1566469407,HU +1566469408,1566470143,BE +1566470144,1566470320,IE +1566470321,1566470399,GB +1566470400,1566470719,IE +1566470720,1566470911,GB +1566470912,1566472191,IE 1566472192,1566474239,GB 1566474240,1566476287,DE 1566476288,1566478335,BG @@ -24897,17 +43938,16 @@ 1566504960,1566507007,TR 1566507008,1566509055,NL 1566509056,1566511103,GB -1566511104,1566511359,FR -1566511360,1566513151,BE +1566511104,1566513151,KN 1566513152,1566515199,BH 1566515200,1566517247,CZ 1566517248,1566519295,RU -1566519296,1566521343,NL +1566519296,1566521343,BE 1566521344,1566523391,FR 1566523392,1566525439,MK 1566525440,1566527487,IS 1566527488,1566529535,IE -1566529536,1566531583,DK +1566529536,1566531583,PL 1566531584,1566533631,RU 1566533632,1566535679,GB 1566535680,1566537727,NL @@ -24918,7 +43958,8 @@ 1566545920,1566552063,RU 1566552064,1566554111,TR 1566554112,1566556159,UA -1566556160,1566560255,RU +1566556160,1566558207,RU +1566558208,1566560255,JO 1566560256,1566564351,IT 1566564352,1566566399,IS 1566566400,1566568447,FR @@ -24926,7 +43967,11 @@ 1566570496,1566572543,NL 1566572544,1566703615,GB 1566703616,1566769151,SA -1566769152,1566834687,CZ +1566769152,1566773759,CZ +1566773760,1566774015,SK +1566774016,1566793215,CZ +1566793216,1566793471,SK +1566793472,1566834687,CZ 1566834688,1566900223,RU 1566900224,1566965759,IT 1566965760,1567031295,PT @@ -24936,52 +43981,280 @@ 1567227904,1567293439,FI 1567293440,1567358975,IE 1567358976,1567424511,PT -1567424512,1567490047,CY +1567424512,1567488055,CY +1567488056,1567488063,A2 +1567488064,1567490047,CY 1567490048,1567555583,IR 1567555584,1567621119,AT -1567621120,1568178175,RO +1567621120,1567696383,RO +1567696384,1567696895,MD +1567696896,1567705087,RO +1567705088,1567707135,MD +1567707136,1567715327,RO +1567715328,1567717375,MD +1567717376,1567752191,RO +1567752192,1567756287,MD +1567756288,1567775743,RO +1567775744,1567776767,MD +1567776768,1567830015,RO +1567830016,1567831039,MD +1567831040,1567883263,RO +1567883264,1567948799,MD +1567948800,1568083967,RO +1568083968,1568086015,MD +1568086016,1568178175,RO 1568178176,1568243711,RU -1568243712,1568245759,RE -1568245760,1568260095,FR -1568260096,1568264191,MQ -1568264192,1568268287,GP -1568268288,1568272383,GF -1568272384,1568276479,RE -1568276480,1568309247,DE +1568243712,1568276479,FR +1568276480,1568293135,DE +1568293136,1568293151,SA +1568293152,1568294223,DE +1568294224,1568294239,IT +1568294240,1568294983,DE +1568294984,1568294991,FR +1568294992,1568295791,DE +1568295792,1568295799,GB +1568295800,1568295855,DE +1568295856,1568295863,GB +1568295864,1568296239,DE +1568296240,1568296247,ZA +1568296248,1568309247,DE 1568309248,1568342015,RO 1568342016,1568374783,BG 1568374784,1568440319,RU 1568440320,1568473087,NO 1568473088,1568505855,BY 1568505856,1568538623,NL -1568571392,1568572927,RO -1568572928,1568604159,PL +1568538624,1568555007,IR +1568555008,1568571391,UA 1568604160,1568636927,UA -1568636928,1569193983,DE +1568636928,1568669439,DE +1568669440,1568669695,MD +1568669696,1569193983,DE 1569193984,1569718271,HR 1569718272,1570242559,IT 1570242560,1570275327,GB 1570275328,1570308095,BG 1570308096,1570340863,CZ -1570340864,1570439167,RU +1570340864,1570406399,RU +1570406400,1570439167,PL 1570439168,1570471935,TR -1570471936,1570504703,BG +1570471936,1570480895,BG +1570480896,1570481151,MK +1570481152,1570504703,BG 1570504704,1570570239,ES 1570570240,1570572287,NL 1570572288,1570574335,UA -1570574336,1570576383,RU 1570576384,1570578431,UA 1570578432,1570580479,CH -1570635776,1570652159,FR -1570652160,1570668543,SE +1570580480,1570582527,RU +1570582528,1570584575,DE +1570584576,1570586623,RU +1570586624,1570590719,PL +1570590720,1570592767,IL +1570592768,1570596863,PL +1570596864,1570598911,UA +1570598912,1570600959,PL +1570600960,1570603007,RU +1570605056,1570607103,NL +1570607104,1570609151,RU +1570609152,1570611199,PL +1570611200,1570619391,RU +1570619392,1570621439,BA +1570621440,1570625535,RU +1570625536,1570627583,GB +1570627584,1570635775,RU +1570635776,1570644991,FR +1570644992,1570645039,GB +1570645040,1570652159,FR +1570652160,1570652543,SE +1570652544,1570652551,FR +1570652552,1570652891,SE +1570652892,1570652895,DE +1570652896,1570655631,SE +1570655632,1570655635,DE +1570655636,1570655999,SE +1570656000,1570656003,DE +1570656004,1570656119,SE +1570656120,1570656127,GB +1570656128,1570660351,SE +1570660352,1570660359,FI +1570660360,1570660367,SE +1570660368,1570660383,FR +1570660384,1570660387,RU +1570660388,1570660543,SE +1570660544,1570660575,FI +1570660576,1570660591,GB +1570660592,1570660595,RU +1570660596,1570660599,SE +1570660600,1570660607,FI +1570660608,1570660615,SE +1570660616,1570660619,RU +1570660620,1570660623,SE +1570660624,1570660639,FR +1570660640,1570660863,SE +1570660864,1570661375,NO +1570661376,1570661631,GB +1570661632,1570662143,SE +1570662144,1570662399,DE +1570662400,1570663423,SE +1570663424,1570663679,US +1570663680,1570663935,GB +1570663936,1570665343,SE +1570665344,1570665351,GB +1570665352,1570665407,SE +1570665408,1570665423,GB +1570665424,1570665439,SE +1570665440,1570665455,FR +1570665456,1570665463,DK +1570665464,1570665919,SE +1570665920,1570665935,GB +1570665936,1570665951,IT +1570665952,1570665967,FR +1570665968,1570666175,SE +1570666176,1570666191,GB +1570666192,1570666223,FR +1570666224,1570666227,SE +1570666228,1570666231,NO +1570666232,1570666367,SE +1570666368,1570666383,FR +1570666384,1570666387,SE +1570666388,1570666391,NL +1570666392,1570666431,SE +1570666432,1570666447,GB +1570666448,1570666463,DE +1570666464,1570666495,SE +1570666496,1570666499,ES +1570666500,1570666511,SE +1570666512,1570666519,NO +1570666520,1570666687,SE +1570666688,1570666703,GB +1570666704,1570666719,ES +1570666720,1570666735,FR +1570666736,1570666751,SE +1570666752,1570666755,ES +1570666756,1570666759,SE +1570666760,1570666767,GB +1570666768,1570666943,SE +1570666944,1570666959,FR +1570666960,1570666975,SE +1570666976,1570666991,FR +1570666992,1570667007,SE +1570667008,1570667011,ES +1570667012,1570667015,SE +1570667016,1570667023,GB +1570667024,1570667039,ES +1570667040,1570667199,SE +1570667200,1570667215,FR +1570667216,1570667231,SE +1570667232,1570667247,FR +1570667248,1570667263,SE +1570667264,1570667267,ES +1570667268,1570667279,SE +1570667280,1570667295,ES +1570667296,1570667327,GB +1570667328,1570667455,SE +1570667456,1570667471,FR +1570667472,1570667487,SE +1570667488,1570667503,FR +1570667504,1570667515,SE +1570667516,1570667519,US +1570667520,1570667523,NL +1570667524,1570667527,IT +1570667528,1570667531,NO +1570667532,1570667535,GB +1570667536,1570667711,SE +1570667712,1570667727,FR +1570667728,1570667743,NL +1570667744,1570667775,SE +1570667776,1570667779,NL +1570667780,1570667791,SE +1570667792,1570667807,ES +1570667808,1570667839,SE +1570667840,1570667903,FR +1570667904,1570667907,SE +1570667908,1570667911,RU +1570667912,1570667967,SE +1570667968,1570667983,FR +1570667984,1570668031,SE +1570668032,1570668035,NL +1570668036,1570668287,SE +1570668288,1570668291,NL +1570668292,1570668351,SE +1570668352,1570668415,NO +1570668416,1570668543,SE 1570668544,1570701311,RU 1570701312,1570717695,PL +1570717696,1570725887,HR +1570725888,1570734079,DE +1570734080,1570750463,PL +1570752512,1570754559,GB +1570754560,1570756607,ES +1570756608,1570764799,RU +1570764800,1570766847,DE 1570766848,1571291135,DK 1571291136,1571422207,RO -1571422208,1571553279,CZ +1571422208,1571426303,RU +1571426304,1571553279,CZ 1571553280,1571684351,IL +1571684352,1571686399,ES +1571686400,1571688447,GB +1571688448,1571690495,CH +1571690496,1571692543,GE +1571692544,1571694591,FR +1571694592,1571696639,LU +1571696640,1571700735,RU +1571700736,1571702783,IT +1571702784,1571704831,RU +1571704832,1571706879,GB +1571706880,1571708927,NL +1571708928,1571709439,GB +1571709440,1571709567,DE +1571709568,1571709695,GB +1571709696,1571709823,FR +1571709824,1571709951,GB +1571709952,1571710079,NL +1571710080,1571710207,GB +1571710208,1571710335,ES +1571710336,1571710463,GB +1571710464,1571710591,IT +1571710592,1571710975,GB +1571710976,1571713023,NL +1571713024,1571715071,RU +1571715072,1571717119,GR +1571717120,1571719167,RU +1571719168,1571721215,GB +1571721216,1571723263,FR +1571723264,1571723775,GB +1571723776,1571724031,SE +1571724032,1571725311,GB +1571725312,1571727359,RO +1571727360,1571729407,IE +1571729408,1571731455,SK +1571731456,1571732479,CH +1571732480,1571732495,LI +1571732496,1571733503,CH +1571733504,1571735551,FI +1571735552,1571737599,NL +1571737600,1571737855,GB +1571737856,1571738111,EU +1571738112,1571738367,NL +1571738368,1571739647,EU +1571739648,1571741695,GB +1571741696,1571743743,RU +1571743744,1571745791,GB +1571745792,1571747839,RU +1571747840,1571749887,GB +1571749888,1571758079,RU +1571758080,1571766271,IL +1571766272,1571786751,PL +1571786752,1571790847,EU +1571790848,1571794943,PL +1571794944,1571799039,NL +1571799040,1571815423,UA 1571815424,1571831807,FR -1571831808,1571848191,DK +1571831808,1571838079,DK +1571838080,1571838111,CY +1571838112,1571848191,DK 1571848192,1571864575,RU 1571864576,1571880959,PL 1571880960,1571897343,RU @@ -24992,11 +44265,11 @@ 1571962880,1571979263,RU 1571979264,1571995647,DK 1571995648,1572012031,UA -1572012032,1572028415,SE +1572012032,1572020223,NO +1572020224,1572028415,SE 1572028416,1572044799,RU 1572044800,1572061183,IT 1572061184,1572077567,PL -1572077568,1572093951,RU 1572093952,1572110335,BG 1572110336,1572126719,RU 1572126720,1572143103,UA @@ -25007,7 +44280,9 @@ 1572225024,1572241407,TR 1572241408,1572257791,SE 1572257792,1572274175,FR -1572274176,1572290559,US +1572274176,1572282111,SG +1572282112,1572282367,PT +1572282368,1572290559,SG 1572290560,1572306943,RU 1572306944,1572323327,BG 1572323328,1572339711,UA @@ -25035,6 +44310,80 @@ 1572425728,1572429823,LB 1572429824,1572433919,CZ 1572433920,1572438015,IT +1572438016,1572442111,AT +1572442112,1572446207,RU +1572446208,1572450303,NO +1572450304,1572458495,RU +1572458496,1572462591,UA +1572462592,1572466687,LB +1572466688,1572470783,EE +1572470784,1572474879,DE +1572474880,1572483071,GB +1572483072,1572487167,RU +1572487168,1572490751,RS +1572490752,1572491007,HR +1572491008,1572491263,LU +1572491264,1572495359,IT +1572495360,1572499455,RU +1572499456,1572503551,TR +1572503552,1572504063,IT +1572504064,1572504319,US +1572504320,1572504575,DE +1572504576,1572504703,RO +1572504704,1572504831,TR +1572504832,1572507647,IT +1572507648,1572511743,GB +1572511744,1572515839,DE +1572515840,1572517759,NL +1572517760,1572517775,CA +1572517776,1572519935,NL +1572519936,1572524031,DE +1572524032,1572528127,GE +1572528128,1572532223,RU +1572532224,1572536319,IT +1572536320,1572538367,GB +1572538368,1572540415,NL +1572540416,1572541439,GB +1572541440,1572541447,FR +1572541448,1572541455,GB +1572541456,1572541463,FR +1572541464,1572541471,GB +1572541472,1572541535,FR +1572541536,1572541951,GB +1572541952,1572541983,DE +1572541984,1572541999,ES +1572542000,1572542207,GB +1572542208,1572542463,FR +1572542464,1572544511,IT +1572544512,1572546559,HR +1572546560,1572548607,FR +1572548608,1572550655,GB +1572550656,1572552703,DE +1572552704,1572554751,TR +1572554752,1572556799,CH +1572556800,1572558847,NO +1572558848,1572560895,IT +1572560896,1572562943,RU +1572562944,1572564991,CZ +1572564992,1572567039,DE +1572567040,1572569087,RU +1572569088,1572571135,NL +1572571136,1572573183,RO +1572573184,1572574975,GG +1572574976,1572575103,GB +1572575104,1572575231,GG +1572575232,1572577279,RU +1572577280,1572579327,AM +1572579328,1572581375,GB +1572581376,1572585471,RU +1572585472,1572587519,CH +1572587520,1572589567,TR +1572589568,1572591615,CH +1572591616,1572593663,NL +1572593664,1572595711,GB +1572595712,1572597759,DE +1572597760,1572599807,RS +1572599808,1572601855,DE 1572601856,1572603903,SE 1572603904,1572605951,GE 1572605952,1572607999,RU @@ -25044,7 +44393,11 @@ 1572614144,1572616191,ES 1572616192,1572618239,CH 1572618240,1572620287,RS -1572620288,1572622335,CH +1572620288,1572620415,CH +1572620416,1572620431,CZ +1572620432,1572620559,CH +1572620560,1572620567,NL +1572620568,1572622335,CH 1572622336,1572624383,RU 1572624384,1572626431,NO 1572626432,1572628479,RU @@ -25070,12 +44423,20 @@ 1572669440,1572673535,RU 1572673536,1572675583,AT 1572675584,1572677631,ES -1572677632,1572683775,RU +1572677632,1572681727,RU +1572681728,1572681983,DE +1572681984,1572682239,RU +1572682240,1572682751,DE +1572682752,1572683775,RU 1572683776,1572685823,CH 1572685824,1572689919,RU 1572689920,1572691967,ES -1572691968,1572694015,BG -1572694016,1572696063,GB +1572691968,1572694015,SA +1572694016,1572694214,GB +1572694215,1572694217,US +1572694218,1572694655,GB +1572694656,1572694783,SG +1572694784,1572696063,GB 1572696064,1572698111,HU 1572698112,1572700159,RU 1572700160,1572702207,NL @@ -25108,8 +44469,12 @@ 1572761600,1572763647,GB 1572763648,1572765695,TR 1572765696,1572767743,CZ -1572767744,1572769791,NL -1572769792,1572771839,RO +1572767744,1572769740,NL +1572769741,1572769790,KY +1572769791,1572769791,NL +1572769792,1572770047,RO +1572770048,1572770111,RS +1572770112,1572771839,RO 1572771840,1572773887,ES 1572773888,1572775935,RS 1572775936,1572777983,GB @@ -25136,69 +44501,3993 @@ 1572823040,1572825087,BY 1572825088,1572827135,RU 1572827136,1572829183,NO +1572829184,1572831231,FI +1572831232,1572833279,BH +1572833280,1572835327,ES +1572835328,1572837375,IE +1572839424,1572841471,DE +1572841472,1572842239,EU +1572842240,1572842495,LV +1572842496,1572842751,EU +1572842752,1572843007,NL +1572843008,1572843519,EU +1572843520,1572845567,JO +1572845568,1572847615,FR +1572847616,1572849663,GI +1572849664,1572851711,GB +1572851712,1572853759,DE +1572853760,1572854015,BE +1572854016,1572854527,LU +1572854528,1572855551,EU +1572855552,1572855807,LU +1572855808,1572857855,KZ +1572857856,1572859903,SE +1572859904,1572861951,IT +1572861952,1572863999,CH 1572864000,1577058303,DE 1577058304,1578106879,GB 1578106880,1578172415,DE +1578172416,1578237951,MT +1578237952,1578303487,DK +1578303488,1578369023,RU +1578369024,1578434559,AZ +1578434560,1578500095,HU +1578500096,1578565631,FI +1578565632,1578582015,FR +1578582016,1578584575,IT +1578584576,1578586111,PT +1578586112,1578588159,ES +1578588160,1578590207,PL +1578590208,1578590271,FR +1578590272,1578590275,NL +1578590276,1578590279,PT +1578590280,1578590283,PL +1578590284,1578590287,GB +1578590288,1578590303,DE +1578590304,1578590311,IT +1578590312,1578590319,FR +1578590320,1578590335,CH +1578590336,1578590343,FR +1578590344,1578590351,GB +1578590352,1578590415,FR +1578590416,1578590431,PL +1578590432,1578590447,BE +1578590448,1578590471,FR +1578590472,1578590479,DE +1578590480,1578590495,IT +1578590496,1578590527,PL +1578590528,1578590543,FR +1578590544,1578590559,GB +1578590560,1578590575,ES +1578590576,1578590603,FR +1578590604,1578590607,PL +1578590608,1578590619,FR +1578590620,1578590623,IT +1578590624,1578590639,FR +1578590640,1578590647,CZ +1578590648,1578590655,BE +1578590656,1578590659,FR +1578590660,1578590663,CZ +1578590664,1578590667,FR +1578590668,1578590687,PL +1578590688,1578590699,FR +1578590700,1578590719,PL +1578590720,1578590799,FR +1578590800,1578590831,GB +1578590832,1578590847,ES +1578590848,1578590879,FR +1578590880,1578590911,PL +1578590912,1578590927,GB +1578590928,1578590935,DE +1578590936,1578590943,ES +1578590944,1578590959,CH +1578590960,1578590975,NL +1578590976,1578590991,GB +1578590992,1578590999,IT +1578591000,1578591007,FR +1578591008,1578591011,GB +1578591012,1578591023,FR +1578591024,1578591039,PL +1578591040,1578591055,NL +1578591056,1578591087,FR +1578591088,1578591103,ES +1578591104,1578591119,GB +1578591120,1578591127,FR +1578591128,1578591135,DE +1578591136,1578591143,FR +1578591144,1578591151,GB +1578591152,1578591183,FR +1578591184,1578591199,ES +1578591200,1578591247,FR +1578591248,1578591263,PL +1578591264,1578591279,FR +1578591280,1578591287,ES +1578591288,1578591291,DE +1578591292,1578591295,ES +1578591296,1578591327,FR +1578591328,1578591343,PL +1578591344,1578591359,ES +1578591360,1578591375,PL +1578591376,1578591391,FR +1578591392,1578591407,CH +1578591408,1578591423,GB +1578591424,1578591431,PL +1578591432,1578591435,DE +1578591436,1578591439,ES +1578591440,1578591463,FR +1578591464,1578591487,PL +1578591488,1578591503,FR +1578591504,1578591519,CH +1578591520,1578591551,ES +1578591552,1578591555,BE +1578591556,1578591559,IT +1578591560,1578591563,PL +1578591564,1578591583,FR +1578591584,1578591599,IT +1578591600,1578591663,FR +1578591664,1578591695,PL +1578591696,1578591699,DE +1578591700,1578591707,FR +1578591708,1578591711,CZ +1578591712,1578591743,PL +1578591744,1578591759,ES +1578591760,1578591791,FR +1578591792,1578591807,PL +1578591808,1578591823,DE +1578591824,1578591887,FR +1578591888,1578591891,DE +1578591892,1578591903,FR +1578591904,1578591919,PL +1578591920,1578591939,ES +1578591940,1578591943,GB +1578591944,1578591951,FR +1578591952,1578591967,PT +1578591968,1578591983,FR +1578591984,1578592031,PL +1578592032,1578592047,IT +1578592048,1578592079,FR +1578592080,1578592095,PL +1578592096,1578592111,FR +1578592112,1578592127,GB +1578592128,1578592143,DE +1578592144,1578592159,NL +1578592160,1578592163,FR +1578592164,1578592171,IT +1578592172,1578592175,FR +1578592176,1578592183,CZ +1578592184,1578592191,PT +1578592192,1578592199,BE +1578592200,1578592207,CH +1578592208,1578592223,FR +1578592224,1578592255,ES +1578592256,1578592271,FR +1578592272,1578592279,NL +1578592280,1578592283,BE +1578592284,1578592287,NL +1578592288,1578592303,DE +1578592304,1578592319,FR +1578592320,1578592335,ES +1578592336,1578592351,FR +1578592352,1578592367,PL +1578592368,1578592383,FR +1578592384,1578592399,IE +1578592400,1578592415,GB +1578592416,1578592423,IT +1578592424,1578592431,IE +1578592432,1578592447,FR +1578592448,1578592495,PL +1578592496,1578592511,FR +1578592512,1578592515,GB +1578592516,1578592519,PL +1578592520,1578592531,FR +1578592532,1578592535,GB +1578592536,1578592543,NL +1578592544,1578592559,FR +1578592560,1578592575,NL +1578592576,1578592687,FR +1578592688,1578592719,ES +1578592720,1578592735,CH +1578592736,1578592751,FR +1578592752,1578592783,DE +1578592784,1578592815,FR +1578592816,1578592823,PL +1578592824,1578592827,FR +1578592828,1578592831,IE +1578592832,1578592847,PL +1578592848,1578592863,FR +1578592864,1578592879,PL +1578592880,1578592883,FR +1578592884,1578592891,GB +1578592892,1578592895,FR +1578592896,1578592959,IT +1578592960,1578593007,FR +1578593008,1578593279,DE +1578593280,1578593295,PL +1578593296,1578593327,FR +1578593328,1578593343,IT +1578593344,1578593359,FR +1578593360,1578593407,GB +1578593408,1578593415,FR +1578593416,1578593423,PL +1578593424,1578593439,FR +1578593440,1578593455,PL +1578593456,1578593487,FR +1578593488,1578593495,ES +1578593496,1578593503,FR +1578593504,1578593535,PL +1578593536,1578593599,GB +1578593600,1578593631,FR +1578593632,1578593647,NL +1578593648,1578593659,PL +1578593660,1578593663,FR +1578593664,1578593679,IT +1578593680,1578593711,FR +1578593712,1578593727,CZ +1578593728,1578593759,FR +1578593760,1578593775,ES +1578593776,1578593791,NL +1578593792,1578593823,FR +1578593824,1578593831,GB +1578593832,1578593835,FR +1578593836,1578593839,NL +1578593840,1578593871,FR +1578593872,1578593875,ES +1578593876,1578593879,FR +1578593880,1578593887,DE +1578593888,1578593919,FR +1578593920,1578593951,PL +1578593952,1578593955,FR +1578593956,1578593967,PL +1578593968,1578593983,FR +1578593984,1578593999,PL +1578594000,1578594015,FR +1578594016,1578594031,BE +1578594032,1578594039,ES +1578594040,1578594047,IT +1578594048,1578594063,FR +1578594064,1578594079,PL +1578594080,1578594087,CH +1578594088,1578594095,CZ +1578594096,1578594111,FR +1578594112,1578594127,PL +1578594128,1578594159,FR +1578594160,1578594175,DE +1578594176,1578594191,FR +1578594192,1578594207,IT +1578594208,1578594211,DE +1578594212,1578594223,PL +1578594224,1578594239,ES +1578594240,1578594255,FR +1578594256,1578594271,GB +1578594272,1578594303,PL +1578594304,1578594319,FR +1578594320,1578594335,PL +1578594336,1578594375,FR +1578594376,1578594383,PT +1578594384,1578594399,FR +1578594400,1578594431,PL +1578594432,1578594447,FR +1578594448,1578594463,PL +1578594464,1578594479,FR +1578594480,1578594495,ES +1578594496,1578594511,FR +1578594512,1578594515,DE +1578594516,1578594519,FR +1578594520,1578594523,PL +1578594524,1578594559,FR +1578594560,1578594575,PL +1578594576,1578594607,ES +1578594608,1578594623,FR +1578594624,1578594687,DE +1578594688,1578594703,FR +1578594704,1578594707,BE +1578594708,1578594711,DE +1578594712,1578594715,IT +1578594716,1578594751,FR +1578594752,1578594767,ES +1578594768,1578594771,DE +1578594772,1578594775,FR +1578594776,1578594783,ES +1578594784,1578594799,FR +1578594800,1578594815,DE +1578594816,1578595039,FR +1578595040,1578595055,GB +1578595056,1578595103,FR +1578595104,1578595119,GB +1578595120,1578595127,FR +1578595128,1578595131,ES +1578595132,1578595151,FR +1578595152,1578595167,ES +1578595168,1578595199,FR +1578595200,1578595203,DE +1578595204,1578595207,FR +1578595208,1578595215,PL +1578595216,1578595231,DE +1578595232,1578595263,BE +1578595264,1578595267,ES +1578595268,1578595271,FR +1578595272,1578595275,PL +1578595276,1578595279,ES +1578595280,1578595287,FR +1578595288,1578595295,PL +1578595296,1578595327,FR +1578595328,1578595343,IT +1578595344,1578595363,FR +1578595364,1578595367,DE +1578595368,1578595379,FR +1578595380,1578595383,CH +1578595384,1578595387,ES +1578595388,1578595391,PL +1578595392,1578595423,CH +1578595424,1578595455,LT +1578595456,1578595463,DE +1578595464,1578595487,FR +1578595488,1578595503,DE +1578595504,1578595519,PL +1578595520,1578595607,FR +1578595608,1578595611,GB +1578595612,1578595615,ES +1578595616,1578595647,PL +1578595648,1578595679,FR +1578595680,1578595695,BE +1578595696,1578595763,FR +1578595764,1578595775,ES +1578595776,1578595807,CH +1578595808,1578595983,FR +1578595984,1578595991,NL +1578595992,1578595995,IT +1578595996,1578596095,FR +1578596096,1578596099,DE +1578596100,1578596103,GB +1578596104,1578596111,FR +1578596112,1578596127,ES +1578596128,1578596143,PL +1578596144,1578596147,DE +1578596148,1578596151,FR +1578596152,1578596155,DE +1578596156,1578596159,FR +1578596160,1578596175,PL +1578596176,1578596183,GB +1578596184,1578596191,BE +1578596192,1578596207,ES +1578596208,1578596255,FR +1578596256,1578596287,GB +1578596288,1578596303,ES +1578596304,1578596335,FR +1578596336,1578596351,ES +1578596352,1578596863,GB +1578596864,1578600191,FR +1578600192,1578600255,BE +1578600256,1578600511,FR +1578600512,1578600575,BE +1578600576,1578602495,FR +1578602496,1578604543,NL +1578604544,1578606591,GB +1578606592,1578608639,DE +1578608640,1578610687,CZ +1578610688,1578610943,FR +1578610944,1578610975,ES +1578610976,1578611039,PL +1578611040,1578611071,FR +1578611072,1578611075,DE +1578611076,1578611079,FR +1578611080,1578611087,NL +1578611088,1578611119,DE +1578611120,1578611135,FR +1578611136,1578611151,CH +1578611152,1578611167,FR +1578611168,1578611183,ES +1578611184,1578611199,FR +1578611200,1578611215,NL +1578611216,1578611231,PL +1578611232,1578611247,FR +1578611248,1578611251,ES +1578611252,1578611255,IT +1578611256,1578611263,PL +1578611264,1578611279,IT +1578611280,1578611295,FR +1578611296,1578611303,GB +1578611304,1578611327,PL +1578611328,1578611343,BE +1578611344,1578611359,FR +1578611360,1578611375,CH +1578611376,1578611391,FR +1578611392,1578611407,DE +1578611408,1578611423,IT +1578611424,1578611439,FR +1578611440,1578611455,IT +1578611456,1578611711,FR +1578611712,1578611775,CH +1578611776,1578611791,ES +1578611792,1578611807,FR +1578611808,1578611839,CH +1578611840,1578611919,FR +1578611920,1578611935,BE +1578611936,1578611943,PL +1578611944,1578611947,FR +1578611948,1578611951,GB +1578611952,1578611967,FR +1578611968,1578612159,GB +1578612160,1578612223,PL +1578612224,1578612239,DE +1578612240,1578612255,FR +1578612256,1578612259,PL +1578612260,1578612263,IT +1578612264,1578612271,FR +1578612272,1578612287,ES +1578612288,1578612303,BE +1578612304,1578612319,DE +1578612320,1578612383,FR +1578612384,1578612415,PL +1578612416,1578612623,FR +1578612624,1578612639,CH +1578612640,1578612671,PL +1578612672,1578612687,FR +1578612688,1578612703,DE +1578612704,1578612863,FR +1578612864,1578612895,NL +1578612896,1578612911,PL +1578612912,1578612975,ES +1578612976,1578612991,FR +1578612992,1578613247,DE +1578613248,1578613503,FR +1578613504,1578613567,DE +1578613568,1578613631,PL +1578613632,1578613647,DE +1578613648,1578613679,FR +1578613680,1578613695,ES +1578613696,1578613711,NL +1578613712,1578613719,BE +1578613720,1578613723,ES +1578613724,1578613727,IT +1578613728,1578613743,CZ +1578613744,1578613751,ES +1578613752,1578613759,NL +1578613760,1578613791,DE +1578613792,1578613823,ES +1578613824,1578613887,IT +1578613888,1578613951,ES +1578613952,1578614015,IE +1578614016,1578614031,FR +1578614032,1578614047,BE +1578614048,1578614071,FR +1578614072,1578614079,ES +1578614080,1578614175,FR +1578614176,1578614191,ES +1578614192,1578614195,FR +1578614196,1578614207,GB +1578614208,1578614271,PL +1578614272,1578614527,ES +1578614528,1578631167,FR 1578631168,1578663935,RO -1578663936,1578729471,RU +1578663936,1578762239,RU +1578762240,1578795007,BG +1578795008,1578827775,RU +1578827776,1578860543,UA +1578860544,1578893311,HU +1578893312,1578991615,RU +1578991616,1579024383,KW +1579024384,1579057151,GB +1579057152,1579089919,LV +1579089920,1579090575,NL +1579090576,1579090687,GB +1579090688,1579090943,NL +1579090944,1579091759,GB +1579091760,1579091775,IL +1579091776,1579091839,GB +1579091840,1579091855,US +1579091856,1579091967,GB +1579091968,1579092223,DE +1579092224,1579104511,GB +1579104512,1579104767,NL +1579104768,1579105023,GB +1579105024,1579105151,NL +1579105152,1579105279,GB +1579105280,1579105343,NL +1579105344,1579105535,GB +1579105536,1579105599,NL +1579105600,1579106303,GB +1579106304,1579122687,DE +1579122688,1579155455,RU 1579155456,1579679743,IT 1579679744,1579745279,PL 1579745280,1579810815,RU 1579810816,1579876351,PL 1579876352,1579941887,GE 1579941888,1580007423,HU -1580072960,1580138495,PT +1580007424,1580015615,RU +1580015616,1580048383,UA +1580048384,1580064767,RU +1580064768,1580072959,DE +1580072960,1580134399,PT +1580134400,1580136447,ES +1580136448,1580138495,PT 1580138496,1580204031,IT 1580204032,1580335103,RO 1580335104,1580466175,RU +1580466176,1580597247,RO +1580597248,1580728319,TR +1580728320,1580990463,AE +1580990464,1581252607,RO 1581252608,1581776895,GR +1581776896,1581793279,RU +1581793280,1581809663,PL +1581809664,1581826047,BG +1581826048,1581842431,GB +1581842432,1581858815,BG +1581858816,1581875199,IT +1581875200,1581891583,TR +1581891584,1581907967,RU +1581907968,1581924351,IT +1581924352,1581940735,UA +1581940736,1581957119,IR +1581957120,1581973503,CZ +1581973504,1581989887,RU +1581989888,1582006271,PL +1582006272,1582022655,RU +1582022656,1582039039,NL +1582039040,1582055423,RU +1582055424,1582071807,UA +1582071808,1582088191,ES +1582088192,1582104575,GB +1582104576,1582153727,RU +1582153728,1582170111,SA +1582170112,1582186495,CH +1582186496,1582202879,TR +1582202880,1582219263,PL +1582219264,1582252031,RU +1582252032,1582268415,TR +1582268416,1582284799,DE +1582284800,1582301183,BH 1582301184,1583349759,IT +1583349760,1583611903,SA +1583611904,1583615999,LV +1583616000,1583617791,NL +1583617792,1583618047,US +1583618048,1583619839,NL +1583619840,1583620095,US +1583620096,1583624191,IT +1583624192,1583628287,RS +1583628288,1583632383,DE +1583632384,1583636479,RU +1583636480,1583640575,MK +1583640576,1583644671,NL +1583644672,1583648767,DE +1583648768,1583652863,CH +1583652864,1583656959,FR +1583656960,1583665151,RU +1583665152,1583669247,UA +1583669248,1583673343,GE +1583673344,1583673991,DE +1583673992,1583673999,GB +1583674000,1583674031,DE +1583674032,1583674039,NL +1583674040,1583677439,DE +1583677440,1583681535,FI +1583681536,1583685631,PL +1583685632,1583689727,DE +1583689728,1583693823,IT +1583693824,1583697919,RU +1583697920,1583702015,TR +1583702016,1583706111,RU +1583706112,1583710207,GI +1583710208,1583712255,IR +1583712256,1583714303,AE +1583714304,1583718111,GB +1583718112,1583718112,FR +1583718113,1583718113,DE +1583718114,1583718114,ES +1583718115,1583718115,IT +1583718116,1583718116,NL +1583718117,1583718117,BE +1583718118,1583722495,GB +1583722496,1583726591,IR +1583726592,1583730687,BG +1583730688,1583732335,DK +1583732336,1583732351,A2 +1583732352,1583732383,DK +1583732384,1583732399,DE +1583732400,1583734783,DK +1583734784,1583738879,LV +1583738880,1583742975,IR +1583742976,1583747071,TR +1583747072,1583751167,RU +1583751168,1583755263,NO +1583755264,1583759359,NL +1583759360,1583763455,TR +1583763456,1583767551,RU +1583767552,1583771647,AT +1583771648,1583775743,RU +1583775744,1583779839,IT +1583779840,1583783935,GB +1583783936,1583788031,EU +1583788032,1583792127,TM +1583792128,1583796223,IE +1583796224,1583800319,DE +1583800320,1583804415,ME +1583804416,1583808511,GB +1583808512,1583812607,MD +1583812608,1583813679,NL +1583813680,1583813683,GB +1583813684,1583813711,NL +1583813712,1583813727,US +1583813728,1583813735,NL +1583813736,1583813743,DE +1583813744,1583816703,NL +1583816704,1583820799,TR +1583820800,1583824895,LV +1583824896,1583828991,SI +1583828992,1583833087,RU +1583833088,1583837183,CH +1583837184,1583841279,GB +1583841280,1583845375,FR +1583845376,1583845727,NL +1583845728,1583845743,BE +1583845744,1583848639,NL +1583848640,1583848703,BE +1583848704,1583848735,NL +1583848736,1583848799,BE +1583848800,1583849471,NL +1583849472,1583853567,DE +1583853568,1583857663,RU +1583857664,1583861759,SE +1583861760,1583865855,LU +1583865856,1583869951,RU +1583869952,1583874047,KZ +1583874048,1584398335,BE +1584398336,1584660479,CZ +1584660480,1584857087,GB +1584857088,1584859135,DE +1584859136,1584922623,GB +1584922624,1585184767,TR +1585184768,1585190911,PL +1585190912,1585192959,ES +1585192960,1585195007,IT +1585195008,1585197055,CZ +1585197056,1585199103,IT +1585199104,1585201151,NL +1585201152,1585205247,IT +1585205248,1585207295,FR +1585207296,1585209855,NL +1585209856,1585210111,IQ +1585210112,1585210879,IR +1585210880,1585211391,NL +1585211392,1585213439,CZ +1585213440,1585214463,GB +1585214464,1585217535,NL +1585217536,1585219583,FR +1585219584,1585221631,NL +1585221632,1585221759,SK +1585221760,1585223679,CZ +1585223680,1585225727,FR +1585225728,1585227775,UA +1585227776,1585231871,RU +1585231872,1585233919,CZ +1585233920,1585235967,LB +1585235968,1585238015,RU +1585238016,1585240063,DE +1585240064,1585241087,FR +1585241088,1585242111,MQ +1585242112,1585244159,RU +1585244160,1585246207,FR +1585246208,1585248255,RU +1585248256,1585250303,CZ +1585250304,1585254399,RU +1585254400,1585256447,GB +1585256448,1585258495,DE +1585258496,1585260543,GB +1585260544,1585264639,RU +1585264640,1585265663,MT +1585265664,1585265695,FR +1585265696,1585265727,IM +1585265728,1585265767,FR +1585265768,1585265775,IM +1585265776,1585265943,FR +1585265944,1585265951,IM +1585265952,1585265967,FR +1585265968,1585265983,IM +1585265984,1585266047,FR +1585266048,1585266687,IM +1585266688,1585270783,DE +1585270784,1585272831,IT +1585272832,1585274879,RU +1585274880,1585276927,ES +1585276928,1585278975,FR +1585278976,1585281023,AL +1585281024,1585283071,UA +1585283072,1585285119,GB +1585285120,1585287167,ES +1585287168,1585289215,CY +1585289216,1585291263,DE +1585291264,1585295359,FR +1585295360,1585297407,HU +1585297408,1585299455,RU +1585299456,1585301503,GB +1585301504,1585303551,LU +1585303552,1585305599,DE +1585305600,1585307647,CZ +1585307648,1585309695,QA +1585309696,1585311743,IT +1585311744,1585313791,RU +1585313792,1585315839,HU +1585315840,1585317887,DK +1585317888,1585319935,IT +1585319936,1585321983,CH +1585321984,1585324031,RU +1585324032,1585326079,NL +1585326080,1585328127,GB +1585328128,1585330175,BE +1585330176,1585332223,IT +1585332224,1585334271,NL +1585334272,1585336319,DE +1585336320,1585338367,SE +1585338368,1585340415,RU +1585340416,1585342463,AT +1585342464,1585343311,GB +1585343312,1585343319,DE +1585343320,1585344511,GB +1585344512,1585346559,FR +1585346560,1585348607,GB +1585348608,1585350655,CH +1585350656,1585352703,IT +1585352704,1585354751,PT +1585354752,1585356799,RU +1585356800,1585358847,FI +1585358848,1585360895,PT +1585360896,1585362943,GB +1585362944,1585363455,IT +1585363456,1585363551,ES +1585363552,1585364991,IT +1585364992,1585367039,GB +1585367040,1585369087,RU +1585369088,1585371135,GB +1585371136,1585375231,SE +1585375232,1585377279,GB +1585377280,1585379327,ES +1585379328,1585381375,CH +1585381376,1585381887,RS +1585381888,1585383423,GB +1585383424,1585385471,FR +1585385472,1585387519,DE +1585387520,1585389567,SI +1585389568,1585391615,SE +1585391616,1585393663,IT +1585393664,1585395711,DK +1585395712,1585397759,NO +1585397760,1585399807,RU +1585399808,1585400063,NL +1585400064,1585400319,IL +1585400320,1585400575,GB +1585400576,1585401855,US +1585401856,1585403903,IT +1585403904,1585405951,RU +1585405952,1585407999,GB +1585408000,1585410047,PL +1585410048,1585412095,GB +1585412096,1585414143,NO +1585414144,1585416191,CZ +1585416192,1585422335,RU +1585422336,1585424383,ES +1585424384,1585428479,RU +1585428480,1585432575,ES +1585432576,1585434623,RU +1585434624,1585436671,JO +1585436672,1585438719,RU +1585438720,1585440767,DE +1585440768,1585442815,IT +1585442816,1585446911,RU +1585446912,1585577983,KW +1585577984,1585709055,UA +1585709056,1585840127,PT +1585840128,1585971199,DE +1585971200,1585979391,AT +1585979392,1585987583,GB +1585987584,1585988095,SE +1585988096,1585988103,IT +1585988104,1585988351,SE +1585988352,1585988359,DE +1585988360,1585990655,SE +1585990656,1585990659,US +1585990660,1585990911,SE +1585990912,1585990915,US +1585990916,1585991167,SE +1585991168,1585991171,US +1585991172,1585991683,SE +1585991684,1585991687,US +1585991688,1585991935,SE +1585991936,1585991939,US +1585991940,1585995775,SE +1585995776,1586003967,AT +1586003968,1586012159,SK +1586012160,1586020351,DE +1586020352,1586028543,RU +1586028544,1586036735,GB +1586036736,1586061311,RU +1586061312,1586069503,HR +1586069504,1586077695,DE +1586077696,1586085887,GE +1586085888,1586110463,RU +1586110464,1586118655,IT +1586118656,1586126847,DK +1586126848,1586128383,CZ +1586128384,1586128639,SK +1586128640,1586135039,CZ +1586135040,1586143231,RU +1586143232,1586151423,IT +1586151424,1586159615,TR +1586159616,1586167807,MT +1586167808,1586175999,DE +1586176000,1586184191,BE +1586184192,1586192383,NO +1586192384,1586200575,RU +1586200576,1586208767,MD +1586208768,1586216959,IR +1586216960,1586225151,BG +1586225152,1586233343,RU +1586233344,1586241535,FR +1586241536,1586249727,SE +1586249728,1586257919,SI +1586257920,1586266111,EU +1586266112,1586274303,RU +1586274304,1586282495,BE +1586282496,1586298879,RU +1586298880,1586307071,IT +1586307072,1586315263,RU +1586315264,1586323455,UZ +1586323456,1586331647,RU +1586331648,1586339839,PL +1586339840,1586348031,RU +1586348032,1586356223,SY +1586356224,1586372607,RU +1586372608,1586380799,JO +1586380800,1586388991,GB +1586388992,1586397183,ES +1586397184,1586399231,LV +1586399232,1586401279,RU +1586401280,1586403327,IT +1586403328,1586405375,IS +1586405376,1586407423,AT +1586407424,1586409471,GB +1586409472,1586411519,IT +1586411520,1586411775,GB +1586411776,1586412287,US +1586412288,1586412543,HK +1586412544,1586413567,GB +1586413568,1586415615,IT +1586415616,1586416255,ES +1586416256,1586417663,AD +1586417664,1586419711,NL +1586419712,1586421759,DE +1586421760,1586423807,SE +1586423808,1586425855,CZ +1586425856,1586427903,NL +1586427904,1586428159,CH +1586428160,1586429951,FR +1586429952,1586431999,CH +1586432000,1586434047,DK +1586434048,1586436095,BE +1586436096,1586438143,ES +1586438144,1586446335,RU +1586446336,1586448383,NO +1586448384,1586450431,ES +1586452480,1586454527,CH +1586454528,1586456575,IT +1586456576,1586458623,GB +1586458624,1586460671,FR +1586460672,1586462719,GB +1586462720,1586464767,RU +1586464768,1586466815,ES +1586466816,1586468863,RU +1586468864,1586470911,IT +1586470912,1586472959,GB +1586472960,1586475007,CZ +1586475008,1586477055,GR +1586477056,1586479103,BE +1586479104,1586481151,KG +1586481152,1586483199,ES +1586483200,1586485247,NL +1586485248,1586487295,FR +1586487296,1586489343,SA +1586489344,1586491391,CZ +1586491392,1586493439,RU +1586493440,1586495487,GB +1586495488,1587019775,DK +1587019776,1587085311,PL +1587085312,1587183615,UA +1587183616,1587199999,RU +1587200000,1587216383,UA +1587216384,1587347455,BG +1587347456,1587412991,NL +1587412992,1587417087,RU +1587417088,1587425279,UA +1587425280,1587429375,UZ +1587429376,1587437567,UA +1587437568,1587445759,RU +1587445760,1587449855,PL +1587449856,1587453951,UA +1587453952,1587470335,RU +1587470336,1587474431,PL +1587474432,1587478527,UA +1587478528,1587511295,RU +1587511296,1587544063,IL +1587544064,1588068351,IT +1588068352,1588592639,GB +1588592640,1588621311,RO +1588621312,1588625407,MD +1588625408,1588723711,RO +1588723712,1588854783,UA +1588854784,1588985855,RU +1588985856,1589182463,IR +1589182464,1589215231,RU +1589215232,1589247999,GB +1589248000,1589280767,NO +1589280768,1589313535,DE +1589313536,1589346303,LB +1589346304,1589379071,KW +1589379072,1589411839,RU +1589411840,1589444607,IL +1589444608,1589477375,DK +1589477376,1589510143,RS +1589510144,1589542911,RU +1589542912,1589575679,BG +1589575680,1589608447,RU +1589608448,1589612543,DK +1589612544,1589620735,SE +1589620736,1589641215,DK +1589641216,1590034431,GB +1590034432,1590036479,RU +1590036480,1590038527,GB +1590038528,1590040575,RU +1590040576,1590042623,NL +1590042624,1590048767,RU +1590048768,1590050815,DE +1590050816,1590052863,SE +1590052864,1590054911,IT +1590054912,1590056959,GB +1590056960,1590059007,ES +1590059008,1590060223,IT +1590060224,1590060255,CH +1590060256,1590061055,IT +1590061056,1590063103,RU +1590063104,1590065151,CZ +1590065152,1590067199,IE +1590067200,1590069247,RU +1590069248,1590071295,AT +1590071296,1590073343,FR +1590073344,1590075391,NL +1590075392,1590077247,BE +1590077248,1590077279,NL +1590077280,1590077439,BE +1590077440,1590079487,GB +1590079488,1590081535,FR +1590081536,1590083583,GB +1590083584,1590085631,RU +1590085632,1590087679,FR +1590087680,1590089727,IT +1590089728,1590091775,RU +1590091776,1590093823,CZ +1590093824,1590095871,RU +1590095872,1590097919,CZ +1590097920,1590099967,CH +1590099968,1590102015,RU +1590102016,1590104063,IT +1590104064,1590106111,TJ +1590106112,1590108159,GB +1590108160,1590110207,TR +1590110208,1590112255,CZ +1590112256,1590114303,HU +1590114304,1590116351,FI +1590116352,1590120447,RU +1590120448,1590122495,IT +1590122496,1590124543,DE +1590124544,1590126591,CH +1590126592,1590128639,RU +1590128640,1590130687,FI +1590130688,1590132735,FR +1590132736,1590132991,DE +1590132992,1590134783,GB +1590134784,1590136831,ES +1590136832,1590138879,GB +1590138880,1590140927,CZ +1590140928,1590142975,UA +1590142976,1590145023,AT +1590145024,1590147071,HU +1590147072,1590149119,GB +1590149120,1590151167,CZ +1590151168,1590153215,TR +1590153216,1590157311,RU +1590157312,1590159359,IE +1590159360,1590161407,GB +1590161408,1590163455,DE +1590163456,1590165503,NL +1590165504,1590176831,AE +1590176832,1590176863,A2 +1590176864,1590689791,AE +1590689792,1591214079,NL +1591214080,1591738367,DE +1591738368,1592000511,BE +1592000512,1592004607,ES +1592004608,1592008703,AM +1592008704,1592012799,GB +1592012800,1592016895,CH +1592016896,1592020991,GB +1592020992,1592025087,SK +1592025088,1592029183,DE +1592029184,1592033279,RU +1592033280,1592037375,NL +1592037376,1592041471,CH +1592041472,1592045567,RU +1592045568,1592049663,FR +1592049664,1592053759,RU +1592053760,1592054271,NL +1592054272,1592054527,AE +1592054528,1592054783,NL +1592054784,1592055295,AE +1592055296,1592055935,NL +1592055936,1592055999,SG +1592056000,1592056959,NL +1592056960,1592057023,SG +1592057024,1592057855,NL +1592057856,1592061951,RS +1592061952,1592066047,RU +1592066048,1592067583,US +1592067584,1592067711,NO +1592067712,1592069631,CY +1592069632,1592069695,NL +1592069696,1592069887,CY +1592069888,1592074239,RU +1592074240,1592078335,SK +1592078336,1592082431,NL +1592082432,1592086527,GB +1592086528,1592087295,CZ +1592087296,1592088063,PL +1592088064,1592090623,CZ +1592090624,1592094719,RU +1592094720,1592098815,RS +1592098816,1592102911,GB +1592102912,1592107007,PT +1592107008,1592111103,GB +1592111104,1592115199,DE +1592115200,1592119295,ES +1592119296,1592123391,PL +1592123392,1592135679,RU +1592135680,1592139775,PL +1592139776,1592143871,RU +1592143872,1592147967,DE +1592147968,1592152063,IT +1592152064,1592156159,IL +1592156160,1592160255,IE +1592160256,1592168447,RU +1592168448,1592172543,CZ +1592172544,1592176639,RU +1592176640,1592180735,RS +1592180736,1592184831,UA +1592184832,1592188927,CH +1592188928,1592193023,UZ +1592193024,1592197119,RU +1592197120,1592201215,PL +1592201216,1592205311,RU +1592205312,1592209407,UA +1592209408,1592213503,PL +1592213504,1592217599,UA +1592217600,1592221695,CH +1592221696,1592225791,DK +1592225792,1592242175,RU +1592242176,1592246271,UA +1592246272,1592254463,RU +1592254464,1592258559,PL +1592258560,1592262655,NL +1592262656,1592270847,RU +1592270848,1592272895,PL +1592272896,1592281087,RU +1592281088,1592283135,UA +1592283136,1592285183,GR +1592285184,1592287231,RU +1592287232,1592289279,RO +1592289280,1592291327,RU +1592291328,1592293375,NL +1592295424,1592299519,RU +1592299520,1592303615,PL +1592303616,1592305663,NL +1592305664,1592307711,IR +1592307712,1592309759,UA +1592309760,1592311807,RU +1592311808,1592313855,DE +1592313856,1592315903,RU +1592315904,1592317951,UA +1592317952,1592319999,PL +1592320000,1592322047,LT +1592322048,1592324095,RU +1592324096,1592326143,KZ +1592326144,1592328191,UA +1592328192,1592393727,RU +1592393728,1592459263,SE +1592459264,1592524799,GE +1592524800,1592540415,GB +1592540416,1592540423,A2 +1592540424,1592557567,GB +1592557568,1592590335,BG +1592590336,1592623103,FI +1592623104,1592655871,RU +1592655872,1592786943,FR +1592786944,1592803327,PL +1592803328,1592819711,RU +1592819712,1592836095,UA +1592836096,1592852479,GE +1592852480,1592868863,RU +1592868864,1592885247,CZ +1592885248,1592901631,IR +1592901632,1592934399,RU +1592934400,1592950783,CZ +1592950784,1592967167,RU +1592967168,1592983551,LU +1592983552,1592999935,RU +1592999936,1593016319,MD +1593016320,1593049087,RU +1593049088,1593065471,UA +1593065472,1593081855,LT +1593081856,1593098239,UA +1593098240,1593114623,CH +1593114624,1593122815,DK +1593122816,1593131007,SE +1593131008,1593147391,GB +1593147392,1593163775,RU +1593163776,1593180159,AT +1593180160,1593196543,NO +1593196544,1593196783,SE +1593196784,1593196799,GB +1593196800,1593203455,SE +1593203456,1593203487,NO +1593203488,1593204159,SE +1593204160,1593204223,DK +1593204224,1593205567,SE +1593205568,1593205631,DK +1593205632,1593206083,SE +1593206084,1593206095,DK +1593206096,1593206103,FI +1593206104,1593206111,GB +1593206112,1593206207,SE +1593206208,1593206271,FI +1593206272,1593209151,SE +1593209152,1593209155,GR +1593209156,1593209159,HU +1593209160,1593209163,FI +1593209164,1593209167,CH +1593209168,1593210879,SE +1593210880,1593211391,NO +1593211392,1593212415,SE +1593212416,1593212927,NO +1593212928,1593229311,PL +1593229312,1593245695,EE +1593245696,1593247743,NL +1593247744,1593249791,IT +1593249792,1593251839,RU +1593251840,1593252159,FR +1593252160,1593252192,GB +1593252193,1593253887,FR +1593253888,1593255935,CZ +1593255936,1593257983,DE +1593257984,1593260031,IE +1593260032,1593262079,RU +1593262080,1593264127,KZ +1593264128,1593266175,NL +1593266176,1593268223,GB +1593268224,1593270271,HU +1593270272,1593272319,GB +1593272320,1593274367,RU +1593274368,1593276415,DE +1593276416,1593278463,RU +1593278464,1593280511,KZ +1593280512,1593282559,EE +1593282560,1593284607,AT +1593284608,1593286655,GB +1593286656,1593288703,FR +1593288704,1593290751,SE +1593290752,1593292799,FR +1593292800,1593294847,IT +1593294848,1593296895,NL +1593296896,1593298943,RS +1593298944,1593300991,RU +1593300992,1593303039,CH +1593303040,1593305087,UA +1593305088,1593307135,FR +1593307136,1593311231,RU +1593311232,1593343999,UA +1593344000,1593376767,HU +1593376768,1593409535,JO +1593409536,1593416231,DE +1593416232,1593416239,CH +1593416240,1593442303,DE +1593442304,1593475071,BA +1593475072,1593540607,RU +1593540608,1593573375,PL +1593573376,1593606143,LU +1593606144,1593638911,SY +1593638912,1593671679,RU +1593671680,1593704447,HR +1593704448,1593704959,SE +1593704960,1593705471,NO +1593705472,1593737215,SE +1593737216,1593769983,PL +1593769984,1593802751,RU +1593802752,1593835519,SE +1593835520,1594884095,TR +1594884096,1595408383,ES +1595408384,1595998207,RU +1595998208,1596063743,DE +1596063744,1596129279,NO +1596129280,1596194815,IL +1596194816,1596260351,NL +1596260352,1596325887,RU +1596325888,1596391423,IR +1596391424,1596456959,ES +1596456960,1596588031,PL +1596588032,1596719103,BG +1596719104,1596850175,IE +1596850176,1596981247,CZ +1596981248,1597243391,PL +1597243392,1597505535,RU +1597505536,1597767679,KZ +1597767680,1598029823,ES +1598029824,1598062591,RO +1598062592,1598095359,RU +1598095360,1598128127,MD +1598128128,1598160895,TR +1598160896,1598193663,KW +1598193664,1598226431,RU +1598226432,1598259199,UA +1598259200,1598291967,RU +1598291968,1598324735,LV +1598324736,1598357503,RU +1598357504,1598390271,PT +1598390272,1598423039,UA +1598423040,1598455807,RU +1598455808,1598488575,TR +1598488576,1598685183,RU +1598685184,1598816255,IT +1598816256,1598947327,RO +1598947328,1599078399,RU +1599078400,1599094783,SE +1599094784,1599111167,RU +1599111168,1599127551,IR +1599127552,1599143935,CZ +1599160320,1599176703,IR +1599176704,1599193087,FR +1599193088,1599209471,RU +1599209472,1599242239,IR +1599242240,1599258623,CZ +1599258624,1599324159,RU +1599324160,1599340543,IE +1599340544,1599356927,RU +1599356928,1599373311,BH +1599373312,1599438847,RU +1599438848,1599455231,RS +1599455232,1599471615,CZ +1599471616,1599487999,MK +1599488000,1599504383,IL +1599504384,1599520767,AZ +1599520768,1599537151,RU +1599537152,1599553535,BG +1599553536,1599569919,RU +1599569920,1599586303,SI +1599586304,1599602687,BG +1599602688,1599864831,DE +1599864832,1600126975,PT +1600126976,1600389119,NL +1600389120,1600397311,EU +1600397312,1600401407,DE +1600401408,1600520191,EU +1600520192,1600651263,SK +1600651264,1600684031,GE +1600684032,1600749567,RU +1600749568,1600782335,SK +1600782336,1600880639,RU +1600880640,1600913407,AL +1600913408,1600946175,PL +1600946176,1600963167,RU +1600963168,1600963175,UA +1600963176,1600963183,RU +1600963184,1600963191,BY +1600963192,1600963199,KZ +1600963200,1600978943,RU +1600978944,1601011711,SE +1601011712,1601044479,UA +1601044480,1601077247,RU +1601077248,1601110015,IT +1601110016,1601142783,BG +1601142784,1601175551,UA +1601175552,1601699839,DE +1601699840,1602224127,ES +1602224128,1602226175,NL +1602226176,1602228223,GB +1602228224,1602230271,DE +1602230272,1602232319,DK +1602232320,1602234367,CH +1602234368,1602234591,FR +1602234592,1602234623,GB +1602234624,1602234703,FR +1602234704,1602234848,GB +1602234849,1602234895,FR +1602234896,1602234903,GB +1602234904,1602234943,FR +1602234944,1602235135,GB +1602235136,1602235263,FR +1602235264,1602235647,GB +1602235648,1602235775,FR +1602235776,1602235903,GB +1602235904,1602235967,ES +1602235968,1602238463,GB +1602238464,1602240511,TR +1602240512,1602242559,BY +1602242560,1602244607,FR +1602244608,1602246655,CH +1602246656,1602248703,NL +1602248704,1602250751,BE +1602250752,1602252799,NO +1602252800,1602254847,SE +1602254848,1602255359,HU +1602255360,1602255615,US +1602255616,1602256895,HU +1602256896,1602258943,GB +1602258944,1602260991,RU +1602260992,1602263039,FR +1602263040,1602265087,ES +1602265088,1602267135,RU +1602267136,1602269183,RO +1602269184,1602271231,RU +1602271232,1602273279,MK +1602273280,1602273535,FR +1602273536,1602273791,GB +1602273792,1602275327,FR +1602275328,1602275615,DE +1602275616,1602275647,CY +1602275648,1602279423,DE +1602279424,1602281471,GB +1602281472,1602283519,RU +1602283520,1602285567,HR +1602285568,1602287615,RU +1602287616,1602289663,DE +1602289664,1602291711,LB +1602291712,1602293759,SA +1602293760,1602295807,RU +1602295808,1602297855,NL +1602297856,1602298367,IL +1602298368,1602298431,MT +1602298432,1602298879,IL +1602298880,1602299391,MT +1602299392,1602299903,IL +1602299904,1602301951,DK +1602301952,1602303999,DE +1602304000,1602306047,RU +1602306048,1602308095,GB +1602308096,1602310143,RU +1602310144,1602312191,NL +1602312192,1602314239,RU +1602314240,1602316287,CZ +1602316288,1602318335,GB +1602318336,1602320383,ES +1602320384,1602324479,NL +1602324480,1602326527,RU +1602328576,1602330623,ES +1602330624,1602336767,RU +1602336768,1602338815,GB +1602338816,1602340863,EE +1602340864,1602342911,AT +1602342912,1602344959,DE +1602344960,1602347007,ES +1602347008,1602349055,PL +1602349056,1602351103,RU +1602351104,1602353151,CZ +1602353152,1602355199,RU +1602355200,1602357247,GB +1602357248,1602359295,FR +1602359296,1602361343,DE +1602361344,1602363391,FI +1602363392,1602365439,LV +1602365440,1602367487,BE +1602367488,1602369535,ES +1602369536,1602371583,IR +1602371584,1602373631,SE +1602373632,1602375679,GB +1602375680,1602377727,BY +1602377728,1602379775,PS +1602379776,1602383871,GB +1602383872,1602383872,EU +1602383873,1602383873,DE +1602383874,1602384895,EU +1602384896,1602385151,DE +1602385152,1602385919,EU +1602385920,1602387967,AT +1602387968,1602390015,RU +1602390016,1602392063,IT +1602392064,1602394111,GB +1602394112,1602396159,FR +1602396160,1602398207,DE +1602398208,1602400255,TR +1602400256,1602402303,RU +1602402304,1602404351,LU +1602404352,1602406399,GB +1602406400,1602408447,DE +1602408448,1602410495,DK +1602410496,1602412543,NO +1602412544,1602414591,GB +1602414592,1602416639,NL +1602416640,1602418687,IR +1602418688,1602420735,DE +1602420736,1602424831,RU +1602424832,1602426879,FR +1602426880,1602428927,RU +1602428928,1602430975,PL +1602430976,1602433023,IT +1602433024,1602433471,HU +1602433472,1602433479,CY +1602433480,1602435071,HU +1602435072,1602437119,IT +1602437120,1602439167,GB +1602439168,1602441215,RU +1602441216,1602443263,GB +1602443264,1602445311,RU +1602445312,1602447359,DE +1602447360,1602447871,GB +1602447872,1602448383,DE +1602448384,1602448895,NL +1602448896,1602449407,GB +1602449408,1602451455,LV +1602451456,1602453503,DE +1602453504,1602455551,SK +1602455552,1602456015,FR +1602456016,1602456023,ES +1602456024,1602457599,FR +1602457600,1602459647,RU +1602459648,1602461695,GB +1602461696,1602465791,ES +1602465792,1602467839,RU +1602467840,1602469887,GI +1602469888,1602471935,AT +1602471936,1602473983,SE +1602473984,1602476031,RU +1602476032,1602478079,GB +1602478080,1602480127,RU +1602480128,1602482175,MT +1602482176,1602484223,FR +1602484224,1602486271,GB +1602486272,1602748415,UA +1602748416,1602781183,PT +1602781184,1602813951,FR +1602813952,1602846719,RU +1602846720,1602879487,GE +1602879488,1602912255,FR +1602912256,1603010559,RU +1603010560,1603014655,FR +1603014656,1603018751,RU +1603018752,1603022847,HU +1603022848,1603026943,GB +1603026944,1603031039,SE +1603031040,1603035135,RU +1603035136,1603039231,SY +1603039232,1603043327,RS +1603043328,1603047423,IT +1603047424,1603051519,RU +1603051520,1603055615,JO +1603055616,1603059711,SE +1603059712,1603063807,AM +1603063808,1603067903,BG +1603067904,1603071999,GB +1603072000,1603076095,CZ +1603076096,1603080191,RU +1603080192,1603084287,DE +1603084288,1603088383,IT +1603088384,1603092479,LB +1603092480,1603100671,NO +1603100672,1603108863,FR +1603108864,1603112959,KZ +1603112960,1603121151,GB +1603121152,1603129343,RU +1603129344,1603133439,JO +1603133440,1603137535,RU +1603137536,1603141631,KW +1603141632,1603145727,ES +1603145728,1603146015,NL +1603146016,1603146079,CY +1603146080,1603146239,NL +1603146240,1603146751,US +1603146752,1603147007,NL +1603147008,1603147263,US +1603147264,1603147775,IL +1603147776,1603148031,US +1603148032,1603149567,IL +1603149568,1603149823,US +1603149824,1603153919,RU +1603153920,1603158015,NL +1603158016,1603162111,DE +1603162112,1603166207,TJ +1603166208,1603166751,NL +1603166752,1603166767,MT +1603166768,1603166815,NL +1603166816,1603166847,VE +1603166848,1603166911,NL +1603166912,1603166943,VE +1603166944,1603166959,NL +1603166960,1603166975,US +1603166976,1603167135,NL +1603167136,1603167167,JP +1603167168,1603167231,NL +1603167232,1603167743,BE +1603167744,1603167871,NO +1603167872,1603169919,NL +1603169920,1603169983,US +1603169984,1603170047,SE +1603170048,1603170303,NL +1603170304,1603174399,IE +1603174400,1603178495,TR +1603178496,1603182591,DK +1603182592,1603184639,FR +1603184640,1603185663,GB +1603185664,1603186687,FR +1603186688,1603190783,IT +1603190784,1603194879,RU +1603194880,1603198975,IT +1603198976,1603203071,IR +1603203072,1603207167,PL +1603207168,1603215359,RU +1603215360,1603219455,DE +1603219456,1603220495,CH +1603220496,1603220503,LI +1603220504,1603223551,CH +1603223552,1603223615,FR +1603223616,1603223631,GB +1603223632,1603223703,FR +1603223704,1603223711,GB +1603223712,1603223936,FR +1603223937,1603223999,GB +1603224000,1603224319,FR +1603224320,1603226623,GB +1603226624,1603226879,FR +1603226880,1603227647,GB +1603227648,1603231743,AT +1603231744,1603235839,IT +1603235840,1603239935,RU +1603239936,1603244031,CZ +1603244032,1603248127,SI +1603248128,1603252223,DE +1603252224,1603256319,RU +1603256320,1603260415,SE +1603260416,1603264511,RU +1603264512,1603268607,AT +1603268608,1603272703,PL +1603272704,1603796991,GB +1603796992,1603813375,RU +1603813376,1603829759,CH +1603829760,1603846143,NL +1603846144,1603862527,GB +1603862528,1603878911,EE +1603878912,1603895295,MD +1603895296,1603928063,RU +1603928064,1603944447,DK +1603944448,1603977215,RU +1603977216,1603980463,GB +1603980464,1603980479,CH +1603980480,1603981823,GB +1603981824,1603982079,IE +1603982080,1603982655,GB +1603982656,1603982687,DK +1603982688,1603982719,AN +1603982720,1603982783,US +1603982784,1603982847,AN +1603982848,1603984895,GB +1603984896,1603985151,PT +1603985152,1603990271,GB +1603990272,1603990527,SA +1603990528,1603993599,GB +1603993600,1604009983,ME +1604009984,1604026367,PL +1604026368,1604042751,NL +1604042752,1604059135,SE +1604059136,1604075519,MK +1604075520,1604091903,RU +1604091904,1604108287,BA +1604108288,1604141055,DE +1604141056,1604157439,RO +1604157440,1604190207,FR +1604190208,1604206591,UA +1604206592,1604222975,PL +1604222976,1604239359,BG +1604239360,1604255743,RU +1604255744,1604272127,SY +1604272128,1604288511,IQ +1604288512,1604304895,RU +1604304896,1604321279,SI +1604321280,1604386815,PL +1604386816,1604452351,RU +1604452352,1604517887,RO +1604517888,1604632320,RU +1604632321,1604632575,UA +1604632576,1604647679,RU +1604647680,1604648959,UA +1604648960,1604714495,RU +1604714496,1604780031,DK +1604780032,1604845567,RU +1604845568,1604853759,FR +1604853760,1604861951,HU +1604861952,1604870143,RS +1604870144,1604878335,HR +1604878336,1604886655,DE +1604886656,1604886783,RU +1604886784,1604887039,DE +1604887040,1604887295,GB +1604887296,1604888063,DE +1604888064,1604889599,TR +1604889600,1604890111,DE +1604890112,1604890367,RU +1604890368,1604890879,TR +1604890880,1604891967,DE +1604891968,1604892159,RU +1604892160,1604892927,DE +1604892928,1604893183,HK +1604893184,1604893311,RU +1604893312,1604893375,TR +1604893376,1604893439,DE +1604893440,1604893695,TR +1604893696,1604893951,DE +1604893952,1604894463,TR +1604894464,1604894719,DE +1604894720,1604899007,CZ +1604899008,1604899039,SK +1604899040,1604902911,CZ +1604902912,1604911103,BG +1604911104,1604919295,UA +1604919296,1604927487,NO +1604927488,1604935679,IT +1604935680,1604952063,RU +1604952064,1604958719,DE +1604958720,1604959231,RU +1604959232,1604959743,DE +1604959744,1604960255,RU +1604960256,1604968447,BG +1604968448,1604976639,ES +1604976640,1604993023,FR +1604993024,1605001215,NL +1605001216,1605025791,RU +1605025792,1605033983,IQ +1605033984,1605042175,SK +1605042176,1605050367,RU +1605050368,1605058559,IT +1605058560,1605066751,HU +1605066752,1605074943,PL +1605074944,1605083135,FR +1605083136,1605091327,BE +1605091328,1605099519,PL +1605099520,1605107711,RU +1605107712,1605115903,GB +1605115904,1605124095,RU +1605124096,1605124351,US +1605124352,1605125263,GB +1605125264,1605125279,US +1605125280,1605125327,GB +1605125328,1605125335,US +1605125336,1605125375,GB +1605125376,1605125439,US +1605125440,1605125503,GB +1605125504,1605125631,US +1605125632,1605126143,DE +1605126144,1605127167,US +1605127168,1605132287,GB +1605132288,1605148671,RU +1605148672,1605156863,PT +1605156864,1605165055,JO +1605165056,1605173247,GB +1605173248,1605181439,TR +1605181440,1605189631,LT +1605189632,1605189663,SK +1605189664,1605189759,CZ +1605189760,1605189887,SK +1605189888,1605197823,CZ +1605197824,1605206015,DE +1605206016,1605214207,RU +1605214208,1605222399,TR +1605222400,1605230591,CZ +1605230592,1605238783,TR +1605238784,1605246975,IT +1605246976,1605255167,PL +1605255168,1605263359,HU +1605263360,1605271551,RU +1605271552,1605279743,DE +1605279744,1605287935,FR +1605287936,1605296127,RU +1605296128,1605304319,CH +1605304320,1605312511,PL +1605312512,1605320703,IL +1605320704,1605328895,KW +1605328896,1605337087,FI +1605337088,1605345279,GB +1605345280,1605353471,FR +1605353472,1605361663,GB +1605361664,1605369855,RU +1605369856,1605402623,FR +1605402624,1605435391,SI +1605435392,1605468159,GB +1605468160,1605500927,RO +1605500928,1605533695,PL +1605533696,1605566463,HR +1605566464,1605599231,RU +1605599232,1605631999,GR +1605632000,1605664767,RS +1605664768,1605697535,MK +1605697536,1605795839,RU +1605795840,1605828607,BE +1605828608,1605861375,RU +1605861376,1605894143,TR +1605894144,1606156287,RO +1606156288,1606418431,RU +1606418432,1607467007,SE +1607467008,1607532543,DE +1607532544,1607570431,SE +1607570432,1607571455,DK +1607571456,1607585791,SE +1607585792,1607587839,DK +1607587840,1607588863,SE +1607588864,1607598079,DK +1607598080,1607610367,IT +1607610368,1607612415,IE +1607612416,1607614463,A2 +1607614464,1607616511,GR +1607616512,1607630847,A2 +1607630848,1607632895,IE +1607632896,1607663615,A2 +1607663616,1607729151,NL +1607729152,1607761919,EG +1607761920,1607766015,SY +1607766016,1607794687,EG +1607794688,1607860223,RU +1607860224,1607925759,ES +1607925760,1607926783,RU +1607926784,1607927807,NL +1607927808,1607929855,RU +1607929856,1607930879,SE +1607930880,1607933951,PL +1607933952,1607934975,DE +1607934976,1607935999,UA +1607937024,1607938047,LV +1607938048,1607939071,UA +1607939072,1607940095,PL +1607940096,1607941119,RU +1607941120,1607942143,ES +1607942144,1607944191,RU +1607944192,1607945215,FR +1607946240,1607947263,UA +1607947264,1607948287,RU +1607948288,1607949311,GB +1607949312,1607950335,UA +1607952384,1607953407,UA +1607956480,1607957503,ES +1607957504,1607958527,UA +1607958528,1607959551,PS +1607959552,1607960575,EE +1607960576,1607962623,RU +1607962624,1607963647,UA +1607963648,1607965695,RU +1607965696,1607966719,UA +1607966720,1607967743,RU +1607967744,1607968767,UA +1607968768,1607969791,SE +1607969792,1607971839,RU +1607974912,1607975935,LV +1607976960,1607977983,KZ +1607977984,1607979007,NL +1607979008,1607980031,RU +1607980032,1607981055,DE +1607981056,1607982079,UA +1607982080,1607983103,RU +1607983104,1607984127,GB +1607984128,1607985151,RU +1607985152,1607986175,PL +1607986176,1607987199,UA +1607987200,1607988223,ES +1607988224,1607989247,KG +1607990272,1607991295,RU +1607991296,1608122367,UA +1608122368,1608253439,RO +1608253440,1608384511,RU +1608384512,1608515583,DE +1608515584,1610612735,IT +1610612736,1610678271,US 1610678272,1610743807,CA -1610743808,1611145215,US -1611268096,1611825151,US -1611923456,1612054527,CA -1612185600,1612382207,US -1612447744,1612578815,US -1612709888,1613430783,US -1613758464,1614168063,CA -1614282752,1614348287,US -1614413824,1614479359,US -1614544896,1614675967,US -1614807040,1615462399,US -1619001344,1631584255,US -1631649792,1631780863,US -1631846400,1632239615,US -1632370688,1632485375,US -1632632832,1634394111,US -1634729984,1635254271,US -1635778560,1637875711,US -1644167168,1645608959,US -1645740032,1649410047,US -1650458624,1650802687,US -1650982912,1651113983,US -1651245056,1652293631,US +1610743808,1611227135,US +1611227136,1611235327,CA +1611235328,1611923455,US +1611923456,1612185599,CA +1612185600,1612611583,US +1612611584,1612636159,CA +1612636160,1612685567,US +1612685568,1612685583,CA +1612685584,1612686175,US +1612686176,1612686207,KR +1612686208,1612687055,US +1612687056,1612687063,CA +1612687064,1612689087,US +1612689088,1612689151,CA +1612689152,1613471743,US +1613471744,1613479935,JM +1613479936,1613488127,US +1613488128,1613492223,CA +1613496320,1613504511,US +1613512704,1613529087,CA +1613529088,1613536191,US +1613536192,1613536223,TW +1613536224,1613536255,US +1613536256,1613536287,TW +1613536288,1613545471,US +1613545472,1613545495,CA +1613545496,1613545503,US +1613545504,1613545551,CA +1613545552,1613545559,US +1613545560,1613545799,CA +1613545800,1613545807,US +1613545808,1613545871,CA +1613545872,1613545879,US +1613545880,1613545887,NL +1613545888,1613546119,CA +1613546120,1613546127,US +1613546128,1613546159,CA +1613546160,1613546167,US +1613546168,1613546407,CA +1613546408,1613546423,US +1613546424,1613546543,CA +1613546544,1613546551,US +1613546552,1613546607,CA +1613546608,1613546615,US +1613546616,1613546663,CA +1613546664,1613546671,US +1613546672,1613546679,CA +1613546680,1613546695,US +1613546696,1613546703,CA +1613546704,1613546719,US +1613546720,1613547919,CA +1613547920,1613547943,US +1613547944,1613548479,CA +1613548480,1613548487,US +1613548488,1613548959,CA +1613548960,1613548967,US +1613548968,1613548983,CA +1613548984,1613548991,US +1613548992,1613549039,CA +1613549040,1613549047,US +1613549048,1613549143,CA +1613549144,1613549167,US +1613549168,1613549183,CA +1613549184,1613549191,US +1613549192,1613549207,CA +1613549208,1613549319,US +1613549320,1613550735,CA +1613550736,1613550743,US +1613550744,1613565951,CA +1613565952,1613570047,US +1613570048,1613574143,CA +1613574144,1613586431,US +1613586432,1613590527,CA +1613590528,1613606911,US +1613606912,1613615103,CA +1613615104,1613635583,US +1613635584,1613639679,CA +1613639680,1613676543,US +1613676544,1613680639,CA +1613680640,1613737983,US +1613737984,1613742079,CA +1613742080,1613750591,US +1613750592,1613750607,BR +1613750608,1613750639,US +1613750640,1613750647,PA +1613750648,1613750655,NL +1613750656,1613750719,US +1613750720,1613750727,TW +1613750728,1613751311,US +1613751312,1613751319,PA +1613751320,1613758463,US +1613758464,1614282751,CA +1614282752,1614741503,US +1614741504,1614757887,CA +1614757888,1614774271,US +1614774272,1614790655,CA +1614790656,1632305151,US +1632305152,1632321535,CA +1632321536,1632354303,US +1632354304,1632354607,CA +1632354608,1632354615,US +1632354616,1632354679,CA +1632354680,1632354687,US +1632354688,1632354919,CA +1632354920,1632354927,NL +1632354928,1632355511,CA +1632355512,1632355519,US +1632355520,1632355583,CA +1632355584,1632355599,US +1632355600,1632362495,CA +1632362496,1634414591,US +1634414592,1634418687,CA +1634418688,1634447359,US +1634447360,1634451455,CA +1634451456,1634455551,US +1634455552,1634459647,CA +1634459648,1634467839,US +1634467840,1634729983,CA +1634729984,1652293631,US 1652293632,1652310015,CA -1652310016,1652318207,US -1652359168,1652424703,US -1652621312,1652760575,US -1652817920,1653112831,US -1653342208,1653473279,US -1653604352,1654091775,US -1654652928,1660420095,US -1660944384,1661992959,US -1669332992,1673527295,US -1673592832,1673945087,US +1652310016,1652481279,US +1652481280,1652481791,CN +1652481792,1652621327,US +1652621328,1652621335,CA +1652621336,1652621343,AU +1652621344,1652621359,CA +1652621360,1652621495,US +1652621496,1652621503,CA +1652621504,1652621663,US +1652621664,1652621671,GB +1652621672,1652621679,US +1652621680,1652621687,CA +1652621688,1652621695,US +1652621696,1652621703,MX +1652621704,1652621911,US +1652621912,1652621919,GB +1652621920,1652622119,US +1652622120,1652622127,GB +1652622128,1652622175,US +1652622176,1652622207,GB +1652622208,1652622271,US +1652622272,1652622279,AU +1652622280,1652622575,US +1652622576,1652622583,GB +1652622584,1652622895,US +1652622896,1652622903,MX +1652622904,1652623903,US +1652623904,1652623935,IN +1652623936,1652624111,US +1652624112,1652624119,MX +1652624120,1652624511,US +1652624512,1652624519,IN +1652624520,1652624527,US +1652624528,1652624535,GB +1652624536,1652624591,US +1652624592,1652624599,IE +1652624600,1652624655,US +1652624656,1652624663,ZA +1652624664,1652625119,US +1652625120,1652625127,ZA +1652625128,1652625303,US +1652625304,1652625311,CA +1652625312,1652625495,US +1652625496,1652625503,CA +1652625504,1652625695,US +1652625696,1652625711,IN +1652625712,1652626055,US +1652626056,1652626063,GB +1652626064,1652626119,US +1652626120,1652626127,MX +1652626128,1652626319,US +1652626320,1652626327,GB +1652626328,1652626399,US +1652626400,1652626407,IE +1652626408,1652626487,US +1652626488,1652626495,GB +1652626496,1652626727,US +1652626728,1652626735,IL +1652626736,1652627519,US +1652627520,1652627567,MY +1652627568,1652627575,US +1652627576,1652627583,GB +1652627584,1652628055,US +1652628056,1652628063,IN +1652628064,1652628311,US +1652628312,1652628319,BO +1652628320,1652628351,US +1652628352,1652628359,CA +1652628360,1652629551,US +1652629552,1652629559,NZ +1652629560,1652630031,US +1652630032,1652630039,GB +1652630040,1652630247,US +1652630248,1652630255,AU +1652630256,1652630655,US +1652630656,1652630663,IL +1652630664,1652630887,US +1652630888,1652630895,AU +1652630896,1652631015,US +1652631016,1652631023,IN +1652631024,1652631343,US +1652631344,1652631351,CA +1652631352,1652631535,US +1652631536,1652631551,MY +1652631552,1652631751,US +1652631752,1652631759,GB +1652631760,1652631999,US +1652632000,1652632015,AE +1652632016,1652632255,US +1652632256,1652632263,IL +1652632264,1652632431,US +1652632432,1652632439,CA +1652632440,1652632647,US +1652632648,1652632655,MY +1652632656,1652632671,US +1652632672,1652632751,MY +1652632752,1652632863,US +1652632864,1652632879,CA +1652632880,1652632887,US +1652632888,1652632895,AU +1652632896,1652632911,US +1652632912,1652632919,CA +1652632920,1652632935,US +1652632936,1652632943,PH +1652632944,1652633159,US +1652633160,1652633167,CA +1652633168,1652633999,US +1652634000,1652634007,GB +1652634008,1652634143,US +1652634144,1652634151,AE +1652634152,1652634423,US +1652634424,1652634431,CA +1652634432,1652634647,US +1652634648,1652634655,PH +1652634656,1652634663,AU +1652634664,1652634767,US +1652634768,1652634775,AU +1652634776,1652634791,US +1652634792,1652634799,CA +1652634800,1652634855,US +1652634856,1652634863,CA +1652634864,1652635047,US +1652635048,1652635055,GB +1652635056,1652635295,US +1652635296,1652635311,CA +1652635312,1652635591,US +1652635592,1652635599,CA +1652635600,1652635903,US +1652635904,1652635911,AU +1652635912,1652636423,US +1652636424,1652636431,CA +1652636432,1652636631,US +1652636632,1652636639,IL +1652636640,1652636655,US +1652636656,1652636663,CA +1652636664,1652636839,US +1652636840,1652636847,CA +1652636848,1652637207,US +1652637208,1652637215,FR +1652637216,1652637623,US +1652637624,1652637631,GB +1652637632,1652637887,US +1652637888,1652637895,IL +1652637896,1652638143,US +1652638144,1652638151,CH +1652638152,1652638191,US +1652638192,1652638207,IN +1652638208,1652638215,US +1652638216,1652638223,AU +1652638224,1652638703,US +1652638704,1652638711,IN +1652638712,1652638855,US +1652638856,1652638863,CA +1652638864,1652638895,US +1652638896,1652638903,GB +1652638904,1652639015,US +1652639016,1652639023,MX +1652639024,1652639135,US +1652639136,1652639143,AU +1652639144,1652639455,US +1652639456,1652639471,IN +1652639472,1652639535,US +1652639536,1652639543,CA +1652639544,1652639671,US +1652639672,1652639679,GB +1652639680,1652640631,US +1652640632,1652640639,NL +1652640640,1652641183,US +1652641184,1652641191,BR +1652641192,1652641431,US +1652641432,1652641439,IN +1652641440,1652641879,US +1652641880,1652641887,GB +1652641888,1652641895,US +1652641896,1652641911,GB +1652641912,1652641919,CA +1652641920,1652641983,US +1652641984,1652642015,AE +1652642016,1652642023,CA +1652642024,1652643215,US +1652643216,1652643223,IT +1652643224,1652643351,US +1652643352,1652643359,CA +1652643360,1652643431,US +1652643432,1652643447,CA +1652643448,1652643463,US +1652643464,1652643471,CA +1652643472,1652643575,US +1652643576,1652643583,EG +1652643584,1652643631,US +1652643632,1652643639,IN +1652643640,1652643655,US +1652643656,1652643663,GB +1652643664,1652643679,US +1652643680,1652643687,GB +1652643688,1652643799,US +1652643800,1652643807,GB +1652643808,1652643839,US +1652643840,1652643847,GB +1652643848,1652643879,US +1652643880,1652643887,AU +1652643888,1652643895,CA +1652643896,1652644223,US +1652644224,1652644231,AU +1652644232,1652644247,US +1652644248,1652644255,GB +1652644256,1652644311,US +1652644312,1652644319,CA +1652644320,1652644375,US +1652644376,1652644383,CA +1652644384,1652644591,US +1652644592,1652644639,BD +1652644640,1652644647,US +1652644648,1652644655,BO +1652644656,1652644799,US +1652644800,1652644807,CA +1652644808,1652644863,US +1652644864,1652644871,AU +1652644872,1652645103,US +1652645104,1652645111,CA +1652645112,1652645751,US +1652645752,1652645759,NZ +1652645760,1652645791,US +1652645792,1652645799,IN +1652645800,1652645879,US +1652645880,1652645887,NZ +1652645888,1652645919,US +1652645920,1652645935,AE +1652645936,1652646271,US +1652646272,1652646279,AU +1652646280,1652646487,US +1652646488,1652646495,CA +1652646496,1652646503,US +1652646504,1652646511,CA +1652646512,1652646815,US +1652646816,1652646823,BD +1652646824,1652647199,US +1652647200,1652647207,IL +1652647208,1652647215,GB +1652647216,1652647303,US +1652647304,1652647311,AU +1652647312,1652647319,US +1652647320,1652647327,IL +1652647328,1652647351,US +1652647352,1652647359,GB +1652647360,1652647511,US +1652647512,1652647519,CA +1652647520,1652647647,US +1652647648,1652647655,MX +1652647656,1652647823,US +1652647824,1652647831,CA +1652647832,1652647855,US +1652647856,1652647871,CA +1652647872,1652647919,US +1652647920,1652647935,IE +1652647936,1652648103,US +1652648104,1652648111,MX +1652648112,1652648255,US +1652648256,1652648263,GB +1652648264,1652648399,US +1652648400,1652648407,IN +1652648408,1652648639,US +1652648640,1652648647,MY +1652648648,1652648879,US +1652648880,1652648887,BD +1652648888,1652648983,US +1652648984,1652648991,NZ +1652648992,1652649463,US +1652649464,1652649471,GB +1652649472,1652649519,US +1652649520,1652649527,SE +1652649528,1652649543,US +1652649544,1652649551,CA +1652649552,1652650303,US +1652650304,1652650311,SE +1652650312,1652650335,US +1652650336,1652650343,CA +1652650344,1652650679,US +1652650680,1652650687,CA +1652650688,1652650751,US +1652650752,1652650759,AU +1652650760,1652650791,US +1652650792,1652650799,GB +1652650800,1652651063,US +1652651064,1652651071,SG +1652651072,1652651079,US +1652651080,1652651087,GB +1652651088,1652651111,US +1652651112,1652651119,NZ +1652651120,1652651271,US +1652651272,1652651279,IN +1652651280,1652651351,US +1652651352,1652651359,CA +1652651360,1652651495,US +1652651496,1652651503,AR +1652651504,1652652151,US +1652652152,1652652159,IN +1652652160,1652652327,US +1652652328,1652652335,SG +1652652336,1652652591,US +1652652592,1652652599,BD +1652652600,1652652655,US +1652652656,1652652663,GB +1652652664,1652652895,US +1652652896,1652652927,CA +1652652928,1652653231,US +1652653232,1652653239,CA +1652653240,1652653247,US +1652653248,1652653279,BD +1652653280,1652653343,US +1652653344,1652653359,BD +1652653360,1652653631,US +1652653632,1652653639,CA +1652653640,1652653663,US +1652653664,1652653671,IN +1652653672,1652653679,GB +1652653680,1652653855,US +1652653856,1652653863,AR +1652653864,1652654023,US +1652654024,1652654031,CA +1652654032,1652654527,US +1652654528,1652654535,NZ +1652654536,1652654543,CA +1652654544,1652654719,US +1652654720,1652654727,GB +1652654728,1652654783,US +1652654784,1652654815,BD +1652654816,1652654895,US +1652654896,1652654911,ZA +1652654912,1652654927,US +1652654928,1652654935,GB +1652654936,1652655007,US +1652655008,1652655015,GB +1652655016,1652655063,US +1652655064,1652655071,GU +1652655072,1652655231,US +1652655232,1652655263,CA +1652655264,1652655303,US +1652655304,1652655311,IN +1652655312,1652655431,US +1652655432,1652655439,GU +1652655440,1652655511,US +1652655512,1652655519,AU +1652655520,1652655727,US +1652655728,1652655743,GB +1652655744,1652655871,US +1652655872,1652655879,CA +1652655880,1652655887,US +1652655888,1652655895,IN +1652655896,1652655903,GB +1652655904,1652655943,US +1652655944,1652655951,JM +1652655952,1652655983,US +1652655984,1652655999,GB +1652656000,1652656063,US +1652656064,1652656071,GB +1652656072,1652656383,US +1652656384,1652656391,CA +1652656392,1652656431,US +1652656432,1652656439,ZA +1652656440,1652656447,CA +1652656448,1652656671,US +1652656672,1652656679,GB +1652656680,1652656703,US +1652656704,1652656711,CA +1652656712,1652656719,US +1652656720,1652656727,NZ +1652656728,1652656759,US +1652656760,1652656767,CN +1652656768,1652656799,US +1652656800,1652656807,GB +1652656808,1652656855,US +1652656856,1652656863,PH +1652656864,1652656927,US +1652656928,1652656935,GB +1652656936,1652657295,US +1652657296,1652657311,AU +1652657312,1652657439,US +1652657440,1652657447,MX +1652657448,1652657567,US +1652657568,1652657575,JM +1652657576,1652657863,US +1652657864,1652657871,GB +1652657872,1652658223,US +1652658224,1652658231,GB +1652658232,1652658367,US +1652658368,1652658375,MX +1652658376,1652658431,US +1652658432,1652658439,GB +1652658440,1652658535,US +1652658536,1652658543,GB +1652658544,1652658559,US +1652658560,1652658567,CA +1652658568,1652658687,US +1652658688,1652658695,NZ +1652658696,1652658727,US +1652658728,1652658735,IN +1652658736,1652659151,US +1652659152,1652659159,GB +1652659160,1652659367,US +1652659368,1652659375,CA +1652659376,1652660007,US +1652660008,1652660015,CA +1652660016,1652660127,US +1652660128,1652660135,CA +1652660136,1652660183,US +1652660184,1652660191,MX +1652660192,1652660287,US +1652660288,1652660295,IN +1652660296,1652660303,MX +1652660304,1652660551,US +1652660552,1652660559,GB +1652660560,1652660639,US +1652660640,1652660663,AU +1652660664,1652660959,US +1652660960,1652660967,BR +1652660968,1652661087,US +1652661088,1652661095,MY +1652661096,1652661135,US +1652661136,1652661143,GB +1652661144,1652661151,US +1652661152,1652661159,IL +1652661160,1652661191,US +1652661192,1652661199,CA +1652661200,1652662735,US +1652662736,1652662751,GB +1652662752,1652662919,US +1652662920,1652662927,AU +1652662928,1652663039,US +1652663040,1652663047,MX +1652663048,1652663135,US +1652663136,1652663143,CA +1652663144,1652664527,US +1652664528,1652664543,CA +1652664544,1652665079,US +1652665080,1652665087,CA +1652665088,1652665103,US +1652665104,1652665111,CA +1652665112,1652665319,US +1652665320,1652665327,BR +1652665328,1652665335,PR +1652665336,1652665455,US +1652665456,1652665463,CA +1652665464,1652665479,US +1652665480,1652665487,GB +1652665488,1652665671,US +1652665672,1652665679,MX +1652665680,1652665687,IE +1652665688,1652665807,US +1652665808,1652665815,GB +1652665816,1652665863,US +1652665864,1652665871,AU +1652665872,1652665951,US +1652665952,1652665959,IT +1652665960,1652665983,US +1652665984,1652665991,CA +1652665992,1652666175,US +1652666176,1652666183,CA +1652666184,1652666207,US +1652666208,1652666215,GB +1652666216,1652666327,US +1652666328,1652666335,MX +1652666336,1652666495,US +1652666496,1652666511,CA +1652666512,1652666527,US +1652666528,1652666543,GB +1652666544,1652668951,US +1652668952,1652668959,IE +1652668960,1652668967,US +1652668968,1652668975,AU +1652668976,1652669191,US +1652669192,1652669199,IN +1652669200,1652669231,US +1652669232,1652669239,CA +1652669240,1652669567,US +1652669568,1652669575,GB +1652669576,1652670015,US +1652670016,1652670023,CA +1652670024,1652670311,US +1652670312,1652670319,BR +1652670320,1652670327,US +1652670328,1652670335,BR +1652670336,1652670463,CA +1652670464,1652670871,US +1652670872,1652670879,CA +1652670880,1652671167,US +1652671168,1652671175,NL +1652671176,1652671207,US +1652671208,1652671215,NL +1652671216,1652671271,US +1652671272,1652671279,GB +1652671280,1652671343,US +1652671344,1652671351,GB +1652671352,1652671359,MX +1652671360,1652671375,US +1652671376,1652671383,CA +1652671384,1652671407,US +1652671408,1652671415,GB +1652671416,1652671783,US +1652671784,1652671791,NL +1652671792,1652672023,US +1652672024,1652672031,MX +1652672032,1652672063,US +1652672064,1652672071,GB +1652672072,1652672159,US +1652672160,1652672167,JP +1652672168,1652672191,US +1652672192,1652672199,PK +1652672200,1652672295,US +1652672296,1652672303,MT +1652672304,1652672335,US +1652672336,1652672343,MT +1652672344,1652672439,US +1652672440,1652672447,CA +1652672448,1652672455,GB +1652672456,1652672463,US +1652672464,1652672471,IN +1652672472,1652672479,ZA +1652672480,1652672487,IN +1652672488,1652672799,US +1652672800,1652672807,CA +1652672808,1652673279,US +1652673280,1652673535,CA +1652673536,1652674063,US +1652674064,1652674071,CA +1652674072,1652674135,US +1652674136,1652674143,MX +1652674144,1652674327,US +1652674328,1652674335,GB +1652674336,1652674343,US +1652674344,1652674351,NA +1652674352,1652674367,US +1652674368,1652674375,GB +1652674376,1652674879,US +1652674880,1652674887,CA +1652674888,1652674919,US +1652674920,1652674927,CH +1652674928,1652674943,US +1652674944,1652674951,CA +1652674952,1652675047,US +1652675048,1652675055,MX +1652675056,1652675103,US +1652675104,1652675111,GB +1652675112,1652675391,US +1652675392,1652675399,IN +1652675400,1652675487,US +1652675488,1652675495,NZ +1652675496,1652675951,US +1652675952,1652675959,KE +1652675960,1652676031,US +1652676032,1652676047,IN +1652676048,1652676191,US +1652676192,1652676199,IN +1652676200,1652676615,US +1652676616,1652676623,AU +1652676624,1652676679,US +1652676680,1652676687,CA +1652676688,1652677007,US +1652677008,1652677015,IN +1652677016,1652677039,US +1652677040,1652677047,MT +1652677048,1652677335,US +1652677336,1652677343,KE +1652677344,1652677367,US +1652677368,1652677375,GB +1652677376,1652677407,US +1652677408,1652677415,IN +1652677416,1652677575,US +1652677576,1652677583,CH +1652677584,1652678999,US +1652679000,1652679007,SG +1652679008,1652679031,US +1652679032,1652679039,BR +1652679040,1652679103,US +1652679104,1652679111,MX +1652679112,1652679119,NO +1652679120,1652680743,US +1652680744,1652680751,CA +1652680752,1652681047,US +1652681048,1652681055,GB +1652681056,1652681159,US +1652681160,1652681167,CA +1652681168,1652681455,US +1652681456,1652681463,CA +1652681464,1652681471,US +1652681472,1652681479,GB +1652681480,1652681511,US +1652681512,1652681519,IL +1652681520,1653534719,US +1653534720,1653538815,CA +1653538816,1653555199,US +1653555200,1653567487,CA +1653567488,1653571583,US +1653571584,1653575679,CA +1653575680,1653592063,US +1653592064,1653596159,CA +1653596160,1653600255,US +1653600256,1653604351,CA +1653604352,1654542335,US +1654542336,1654546431,CA +1654546432,1654550527,VG +1654550528,1654554623,US +1654554624,1654558719,CA +1654558720,1654597631,US +1654597632,1654597887,CA +1654597888,1654648831,US +1654648832,1654652927,CA +1654652928,1665833175,US +1665833176,1665833183,A2 +1665833184,1673527295,US +1673527296,1673560063,CA +1673560064,1673562207,US +1673562208,1673562239,CR +1673562240,1673562255,CA +1673562256,1673562303,US +1673562304,1673562319,CA +1673562320,1673562335,PL +1673562336,1673562399,US +1673562400,1673562415,GB +1673562416,1673562495,US +1673562496,1673562511,CA +1673562512,1673562639,US +1673562640,1673562671,GB +1673562672,1673562719,US +1673562720,1673562751,NL +1673562752,1673562767,CA +1673562768,1673562895,US +1673562896,1673562911,CA +1673562912,1673562975,US +1673562976,1673563007,NL +1673563008,1673563071,US +1673563072,1673563135,NL +1673563136,1673563167,CA +1673563168,1673563407,US +1673563408,1673563423,CA +1673563424,1673563487,US +1673563488,1673563519,CA +1673563520,1673563663,US +1673563664,1673563679,CA +1673563680,1673563695,US +1673563696,1673563711,CA +1673563712,1673563775,US +1673563776,1673563903,GB +1673563904,1673563967,US +1673563968,1673563983,CA +1673563984,1673566463,US +1673566464,1673566719,NL +1673566720,1673566735,CA +1673566736,1673566767,US +1673566768,1673566783,NO +1673566784,1673566847,US +1673566848,1673566911,CA +1673566912,1673566975,US +1673566976,1673567007,CA +1673567008,1673567103,US +1673567104,1673567167,GB +1673567168,1673567231,US +1673567232,1673567247,CA +1673567248,1673567263,US +1673567264,1673567279,AT +1673567280,1673567311,US +1673567312,1673567327,GB +1673567328,1673567343,RU +1673567344,1673567359,US +1673567360,1673567423,MT +1673567424,1673567567,US +1673567568,1673567583,CZ +1673567584,1673567615,CA +1673567616,1673567743,CZ +1673567744,1673567791,US +1673567792,1673567807,CA +1673567808,1673567823,AU +1673567824,1673567855,US +1673567856,1673567871,CA +1673567872,1673568255,US +1673568256,1673568271,CA +1673568272,1673568303,US +1673568304,1673568319,GB +1673568320,1673568383,US +1673568384,1673568447,CA +1673568448,1673568527,US +1673568528,1673568543,CA +1673568544,1673569023,US +1673569024,1673569039,CA +1673569040,1673569055,HR +1673569056,1673569103,US +1673569104,1673569119,CA +1673569120,1673569183,US +1673569184,1673569215,NL +1673569216,1673569887,US +1673569888,1673569903,PL +1673569904,1673569967,US +1673569968,1673569983,GB +1673569984,1673570559,US +1673570560,1673570831,LT +1673570832,1673571071,US +1673571072,1673571263,LT +1673571264,1673571679,US +1673571680,1673571711,CA +1673571712,1673572095,US +1673572096,1673572351,LT +1673572352,1673572383,US +1673572384,1673572399,EC +1673572400,1673572415,US +1673572416,1673572431,CA +1673572432,1673572895,US +1673572896,1673572911,CA +1673572912,1673573183,US +1673573184,1673573247,CA +1673573248,1673573503,US +1673573504,1673573567,NL +1673573568,1673573759,US +1673573760,1673573823,CA +1673573824,1673576447,US +1673576448,1673576703,NL +1673576704,1673577727,US +1673577728,1673577983,LT +1673577984,1673578239,A1 +1673578240,1673986047,US +1673986048,1674051583,CA 1674051584,1674575871,US 1674575872,1677721599,CA -1879048192,1883218547,AU +1795162112,1795686399,US +1811939328,1828716543,US +1828716544,1830813695,FR +1830813696,1831337983,NL +1831337984,1831862271,DE +1831862272,1832124415,PT +1832124416,1832386559,IT +1832386560,1832517631,DK +1832517632,1832648703,SE +1832648704,1832681471,HR +1832681472,1832714239,RU +1832714240,1832747007,HU +1832747008,1832779775,RU +1832779776,1832812543,FR +1832812544,1832845311,RU +1832845312,1832878079,BH +1832878080,1832910847,RU +1832910848,1833172991,IL +1833172992,1833177087,GB +1833177088,1833179135,RU +1833179136,1833181183,IT +1833181184,1833183231,GB +1833183232,1833185279,UA +1833185280,1833187327,DE +1833187328,1833189375,NL +1833189376,1833191423,GB +1833191424,1833193471,RU +1833193472,1833195519,ES +1833195520,1833197567,NO +1833197568,1833199615,DE +1833199616,1833201663,AT +1833201664,1833203711,RU +1833203712,1833205759,AM +1833205760,1833207807,FI +1833207808,1833209855,RU +1833209856,1833211903,GR +1833211904,1833213951,IT +1833213952,1833215999,BE +1833216000,1833218047,RU +1833218048,1833220095,NO +1833220096,1833222143,RU +1833222144,1833224191,GB +1833224192,1833228287,RU +1833228288,1833232383,DE +1833232384,1833234431,TJ +1833234432,1833236479,GB +1833236480,1833238527,FI +1833238528,1833240575,AL +1833240576,1833242623,ES +1833242624,1833246719,RU +1833246720,1833248767,FI +1833248768,1833250815,MK +1833250816,1833254911,GB +1833254912,1833256959,DE +1833256960,1833261055,GB +1833261056,1833263103,PL +1833263104,1833265151,DE +1833265152,1833267199,GB +1833267200,1833269247,HU +1833269248,1833271295,FI +1833271296,1833273343,IT +1833273344,1833275391,EU +1833275392,1833277439,GB +1833277440,1833279487,CH +1833279488,1833281535,AL +1833281536,1833283583,AT +1833283584,1833285631,RU +1833285632,1833289727,FR +1833289728,1833291775,IT +1833291776,1833293823,CZ +1833293824,1833295871,BE +1833295872,1833297919,NL +1833297920,1833299967,GB +1833299968,1833302015,LU +1833302016,1833304063,AT +1833304064,1833308159,NL +1833308160,1833308755,FR +1833308756,1833308759,NL +1833308760,1833310207,FR +1833310208,1833312255,RU +1833312256,1833314303,ES +1833314304,1833315903,IM +1833315904,1833315919,GB +1833315920,1833316351,IM +1833316352,1833318399,DK +1833318400,1833320447,GB +1833320448,1833322495,AE +1833322496,1833324543,IT +1833324544,1833326591,NO +1833326592,1833327103,GB +1833327104,1833328639,US +1833328640,1833330687,AT +1833330688,1833332735,UA +1833332736,1833334783,CH +1833334784,1833336831,IT +1833336832,1833336959,ES +1833336960,1833336975,FR +1833336976,1833338879,ES +1833338880,1833342975,GB +1833342976,1833345023,CH +1833345024,1833347071,FI +1833347072,1833349119,FR +1833349120,1833351167,FI +1833351168,1833353215,RU +1833353216,1833355263,DE +1833355264,1833357311,IT +1833357312,1833358127,GB +1833358128,1833358135,IE +1833358136,1833359359,GB +1833359360,1833361407,DE +1833361408,1833363455,GB +1833363456,1833365503,RU +1833365504,1833367551,IT +1833367552,1833369599,RU +1833369600,1833370111,NL +1833370112,1833370367,BG +1833370368,1833370623,SE +1833370624,1833371647,NL +1833371648,1833373695,RU +1833373696,1833377791,DE +1833377792,1833379839,KZ +1833379840,1833381887,PT +1833381888,1833383935,NL +1833383936,1833385983,DK +1833385984,1833388031,SK +1833388032,1833390079,RU +1833390080,1833390207,GB +1833390208,1833390335,US +1833390336,1833391871,GB +1833391872,1833392127,US +1833392128,1833396223,CH +1833396224,1833398271,NL +1833398272,1833400319,DE +1833400320,1833402367,GB +1833402368,1833406463,FR +1833406464,1833406720,GB +1833406721,1833406751,NL +1833406752,1833406848,GB +1833406849,1833406863,ET +1833406864,1833406912,GB +1833406913,1833406919,CA +1833406920,1833408511,GB +1833408512,1833410559,RS +1833410560,1833412607,PT +1833412608,1833414655,GB +1833414656,1833416703,RU +1833416704,1833418751,NL +1833418752,1833422847,RU +1833422848,1833424895,CZ +1833424896,1833426687,DE +1833426688,1833426943,GB +1833426944,1833428991,KG +1833428992,1833431039,IT +1833431040,1833433087,RU +1833433088,1833435135,GB +1833435136,1833439231,CZ +1833439232,1833443327,GB +1833443328,1833447423,NL +1833447424,1833451519,RS +1833451520,1833455615,RU +1833455616,1833459711,NL +1833459712,1833463807,ME +1833463808,1833467903,UA +1833467904,1833468079,RU +1833468080,1833468159,CH +1833468160,1833468287,RU +1833468288,1833468575,CH +1833468576,1833468591,RU +1833468592,1833471999,CH +1833472000,1833476095,EU +1833476096,1833477375,NL +1833477376,1833477503,GB +1833477504,1833477631,DE +1833477632,1833481087,NL +1833481088,1833481215,IE +1833481216,1833484287,NL +1833484288,1833488383,IR +1833488384,1833492479,GB +1833492480,1833504767,RU +1833504768,1833508863,DE +1833508864,1833512959,RU +1833512960,1833517055,DE +1833517056,1833521151,ES +1833521152,1833525247,IT +1833525248,1833529343,LV +1833529344,1833533439,GB +1833533440,1833537535,RU +1833537536,1833541631,AT +1833541632,1833542143,IL +1833542144,1833542655,GB +1833542656,1833542911,IN +1833542912,1833545727,GB +1833545728,1833549823,IT +1833549824,1833553919,RU +1833553920,1833558015,CZ +1833558016,1833562111,RO +1833562112,1833566207,PS +1833566208,1833570303,SE +1833570304,1833571327,GB +1833571328,1833574399,NL +1833574400,1833578495,YE +1833578496,1833582591,HU +1833582592,1833586687,TJ +1833586688,1833590783,FR +1833590784,1833594879,PL +1833594880,1833603071,RU +1833603072,1833607167,SK +1833607168,1833611263,RU +1833611264,1833615359,NO +1833615360,1833619455,GB +1833619456,1833623551,RU +1833623552,1833627647,IR +1833627648,1833631743,GB +1833631744,1833635839,CZ +1833635840,1833636367,DE +1833636368,1833636375,AL +1833636376,1833639935,DE +1833639936,1833644031,AM +1833644032,1833644063,TJ +1833644064,1833644287,RU +1833644288,1833644319,TJ +1833644320,1833648127,RU +1833648128,1833652223,LB +1833652224,1833659023,DE +1833659024,1833659039,BZ +1833659040,1833659903,DE +1833659904,1833659919,NA +1833659920,1833660159,DE +1833660160,1833660223,CH +1833660224,1833660351,DE +1833660352,1833660415,US +1833660416,1833664511,IT +1833664512,1833668607,RU +1833668608,1833672703,CZ +1833672704,1833676799,GB +1833676800,1833680895,DE +1833680896,1833684991,UA +1833684992,1833689087,DE +1833689088,1833693183,FI +1833693184,1833697279,RU +1833697280,1833959423,IE +1833959424,1834090495,CZ +1834090496,1834221567,SA +1834221568,1834352639,DE +1834352640,1834483711,UA +1834483712,1834614783,BE +1834614784,1834745855,DE +1834745856,1834876927,RS +1834876928,1834885119,RU +1834885120,1834893311,FR +1834893312,1834901503,RU +1834901504,1834909695,RS +1834909696,1834913791,GB +1834913792,1834917887,RO +1834917888,1834921983,UA +1834921984,1834930175,RU +1834930176,1834934271,UA +1834934272,1834938367,RS +1834938368,1834944511,PL +1834944512,1834946559,RO +1834946560,1834948607,RU +1834948608,1834950655,PL +1834950656,1834956799,UA +1834956800,1834960895,IR +1834960896,1834964991,RU +1834964992,1834967039,PL +1834967040,1834971135,RU +1834971136,1834973183,KZ +1834973184,1834975231,RU +1834975232,1834977279,IL +1834977280,1834983423,PL +1834983424,1834985471,RU +1834985472,1834989567,PL +1834989568,1834991615,GB +1834991616,1834993663,RU +1834993664,1834995711,PL +1834995712,1835001855,RU +1835001856,1835003903,PL +1835003904,1835005951,CH +1835005952,1835007999,RU +1835008000,1835532287,RO +1835532288,1835540479,SE +1835540480,1835548671,DE +1835548672,1835549695,GB +1835549696,1835550207,ES +1835550208,1835565055,GB +1835565056,1835573247,AL +1835573248,1835581439,UA +1835581440,1835589631,BG +1835589632,1835597823,IT +1835597824,1835606015,HU +1835606016,1835614207,CZ +1835614208,1835622399,RU +1835622400,1835624959,SE +1835624960,1835625215,DK +1835625216,1835625471,SE +1835625472,1835625599,DK +1835625600,1835626239,SE +1835626240,1835626495,DK +1835626496,1835626751,SE +1835626752,1835627007,DK +1835627008,1835627519,SE +1835627520,1835627647,DK +1835627648,1835629567,SE +1835629568,1835630335,DK +1835630336,1835630591,SE +1835630592,1835646975,RU +1835646976,1835655167,BA +1835655168,1835663359,CY +1835663360,1835671551,UA +1835671552,1835679743,CH +1835679744,1835687935,FR +1835687936,1835696127,IE +1835696128,1835704319,RU +1835704320,1835709439,NL +1835709440,1835712511,EU +1835712512,1835720703,RU +1835720704,1835728895,RS +1835728896,1835737087,PL +1835737088,1835745279,GB +1835745280,1835753471,BG +1835753472,1835761663,ES +1835761664,1835769855,JO +1835769856,1835778047,RU +1835778048,1835786239,CZ +1835786240,1835794431,JO +1835794432,1835802623,FI +1835802624,1835810815,RU +1835810816,1835819007,UA +1835819008,1835827199,CZ +1835827200,1835835391,GB +1835835392,1835843583,ES +1835843584,1835851775,NO +1835851776,1835859967,UA +1835859968,1835868159,DE +1835868160,1835876351,IR +1835876352,1835884543,NO +1835884544,1835892735,NL +1835892736,1835909119,GB +1835909120,1835913215,RS +1835913216,1835917311,RU +1835917312,1835925503,GB +1835925504,1835933695,LV +1835933696,1835941887,RU +1835941888,1835950079,UA +1835950080,1835958271,LB +1835958272,1835966463,HU +1835966464,1835974655,IR +1835974656,1835982847,PL +1835982848,1835991039,CY +1835991040,1835999231,RU +1835999232,1836007423,IR +1836007424,1836015615,RU +1836015616,1836023807,AD +1836023808,1836040191,RU +1836040192,1836048383,GB +1836048384,1836056575,RS +1836056576,1836580863,IT +1836580864,1836597247,RU +1836597248,1836597759,LU +1836597760,1836601599,DE +1836601600,1836613631,LU +1836613632,1836630015,RU +1836630016,1836646399,BG +1836646400,1836679167,RS +1836679168,1836711935,BG +1836711936,1836728319,UA +1836728320,1836744703,RS +1836744704,1836761087,FR +1836761088,1836777471,IR +1836777472,1836793855,SI +1836793856,1836810239,GB +1836810240,1836826623,RU +1836826624,1836843007,CZ +1836843008,1836875775,RU +1836875776,1836892159,SE +1836892160,1836908543,RU +1836908544,1836924927,IE +1836924928,1836941311,DE +1836941312,1836957695,IR +1836957696,1836974079,PL +1836974080,1836990463,RU +1836990464,1837006847,AT +1837006848,1837023231,BY +1837023232,1837039615,RU +1837039616,1837055999,AZ +1837056000,1837072383,IQ +1837072384,1837088767,RU +1837088768,1837105151,SI +1837105152,1838153727,BE +1838153728,1839202303,GB +1839202304,1839235071,BG +1839235072,1839267839,IL +1839267840,1839300607,RU +1839300608,1839333375,BH +1839333376,1839366143,UA +1839366144,1839398911,IR +1839398912,1839431679,NO +1839431680,1839464447,RU +1839464448,1839497215,CZ +1839497216,1839529983,CH +1839529984,1839562751,RU +1839562752,1839595519,BA +1839595520,1839661055,RO +1839661056,1839693823,UA +1839693824,1839726591,RU +1839726592,1839759359,IT +1839759360,1839792127,RU +1839792128,1839794687,GB +1839794688,1839794943,US +1839794944,1839795071,GB +1839795072,1839795087,US +1839795088,1839795151,GB +1839795152,1839795167,US +1839795168,1839796607,GB +1839796608,1839796671,US +1839796672,1839796735,GB +1839796736,1839796991,TR +1839796992,1839797759,GB +1839797760,1839798015,GR +1839798016,1839798527,GB +1839798528,1839798559,US +1839798560,1839800447,GB +1839800448,1839800479,SG +1839800480,1839800895,GB +1839800896,1839800959,CY +1839800960,1839801023,GR +1839801024,1839801279,GB +1839801280,1839801311,VG +1839801312,1839801343,GB +1839801344,1839801471,CN +1839801472,1839801599,GB +1839801600,1839801855,US +1839801856,1839802111,GB +1839802112,1839802239,RO +1839802240,1839806463,GB +1839806464,1839808511,US +1839808512,1839816703,GB +1839816704,1839824895,NO +1839824896,1839890431,RU +1839890432,1839923199,GB +1839923200,1839955967,RU +1839955968,1839988735,SA +1839988736,1840021503,RU +1840021504,1840054271,GE +1840054272,1840087039,RU +1840087040,1840119807,PL +1840119808,1840152575,RU +1840152576,1840185343,GB +1840185344,1840218111,BA +1840218112,1840316415,GB +1840316416,1840381951,RU +1840381952,1840447487,GR +1840447488,1840513023,NO +1840513024,1840644095,GB +1840644096,1840709631,SI +1840709632,1840775167,CZ +1840775168,1840840703,RU +1840840704,1840906239,MD +1840906240,1840971775,IL +1840971776,1841102847,RU +1841102848,1841168383,NO +1841168384,1841299455,RU +1841299456,1841430527,DE +1841430528,1841561599,RU +1841561600,1841565695,PL +1841565696,1841569791,RU +1841569792,1841577983,PL +1841577984,1841582079,RU +1841582080,1841586175,PL +1841586176,1841590271,RU +1841590272,1841594367,PL +1841594368,1841598463,RU +1841598464,1841602559,PL +1841602560,1841610751,UA +1841610752,1841618943,RU +1841618944,1841627135,PL +1841627136,1841629183,NO +1841629184,1841635327,RU +1841635328,1841639423,PL +1841639424,1841641471,RU +1841641472,1841643519,PL +1841645568,1841647615,RU +1841647616,1841649663,RO +1841649664,1841651711,RU +1841651712,1841653759,PL +1841653760,1841655807,FR +1841655808,1841668095,RU +1841670144,1841672191,PL +1841672192,1841674239,FR +1841674240,1841676287,PL +1841676288,1841680383,RU +1841680384,1841682431,LV +1841682432,1841684479,UA +1841684480,1841686527,RU +1841686528,1841688575,RO +1841688576,1841690623,FR +1841690624,1841692671,RU +1841692672,1841700863,RS +1841700864,1841709055,MD +1841709056,1841725439,RU +1841725440,1841733631,DK +1841733632,1841758207,RU +1841758208,1841766399,PL +1841766400,1841774591,HU +1841774592,1841782783,PL +1841782784,1841790975,RO +1841790976,1841799167,BG +1841799168,1841807359,DE +1841807360,1841815551,NO +1841815552,1841823743,BG +1841823744,1841827079,GB +1841827080,1841827087,ES +1841827088,1841827231,GB +1841827232,1841827263,BR +1841827264,1841827279,BD +1841827280,1841831935,GB +1841831936,1841840127,MT +1841840128,1841848319,PL +1841848320,1841856511,RU +1841856512,1841864703,UA +1841864704,1841872895,YE +1841872896,1841881087,NL +1841881088,1841889279,UA +1841889280,1841897471,IR +1841897472,1841905663,RO +1841905664,1841922047,RU +1841922048,1841930239,NL +1841930240,1841938431,KG +1841938432,1841946623,RU +1841946624,1841954815,UA +1841954816,1841971199,RU +1841971200,1841979391,CZ +1841979392,1841987583,NL +1841987584,1841995775,DK +1841995776,1842003967,RU +1842003968,1842012159,CH +1842012160,1842020351,GB +1842020352,1842028543,NO +1842028544,1842036735,CH +1842036736,1842038783,FR +1842038784,1842044927,LU +1842044928,1842047369,GB +1842047370,1842047371,IN +1842047372,1842053119,GB +1842053120,1842061311,ES +1842061312,1842069503,IR +1842069504,1842077695,RU +1842077696,1842079743,FR +1842079744,1842085887,MQ +1842085888,1842118655,GB +1842118656,1842151423,FI +1842151424,1842153471,FR +1842153472,1842155519,NO +1842155520,1842157567,IT +1842157568,1842159615,AE +1842159616,1842161663,BA +1842161664,1842163711,GE +1842163712,1842165759,PL +1842165760,1842167807,RU +1842167808,1842169855,FR +1842169856,1842171903,CZ +1842171904,1842173951,RU +1842173952,1842175999,RO +1842176000,1842178047,FI +1842178048,1842180095,IT +1842180096,1842182143,IQ +1842182144,1842184191,LV +1842184192,1842186239,DE +1842186240,1842188287,ES +1842188288,1842190335,RU +1842190336,1842192383,GB +1842192384,1842194431,AZ +1842194432,1842196319,CH +1842196320,1842196351,NL +1842196352,1842196479,CH +1842196480,1842198527,DE +1842198528,1842200575,GB +1842200576,1842202623,NL +1842202624,1842204671,CH +1842204672,1842206719,AZ +1842206720,1842208767,SE +1842208768,1842210815,GB +1842210816,1842212863,LT +1842212864,1842214911,CZ +1842214912,1842216959,RU +1842216960,1842225151,RO +1842225152,1842233343,UA +1842233344,1842241535,RO +1842241536,1842249727,RS +1842249728,1842257919,RU +1842257920,1842266111,EU +1842266112,1842274303,PL +1842274304,1842282495,RO +1842282496,1842286591,RU +1842286592,1842290687,GB +1842290688,1842294783,RS +1842294784,1842298879,PL +1842298880,1842302975,UA +1842302976,1842307071,RU +1842307072,1842311167,PL +1842311168,1842315263,UA +1842315264,1842319359,RO +1842319360,1842323455,PL +1842323456,1842331647,RU +1842331648,1842335743,UA +1842335744,1842339839,RO +1842339840,1842343935,RU +1842343936,1842348031,UZ +1842348032,1843396607,FR +1843396608,1843412991,IQ +1843412992,1843429375,CZ +1843429376,1843462143,GB +1843462144,1843478527,RU +1843478528,1843494911,SE +1843494912,1843511295,IR +1843511296,1843527679,RU +1843527680,1843544063,IL +1843544064,1843560447,RU +1843560448,1843576831,DE +1843576832,1843593215,RU +1843593216,1843609599,HR +1843609600,1843625983,UA +1843625984,1843642367,ES +1843642368,1843658751,RU +1843658752,1843675135,GB +1843675136,1843691519,ME +1843691520,1843707903,SE +1843707904,1843724287,TR +1843724288,1843732479,UA +1843732480,1843765247,RU +1843773440,1843781631,LV +1843781632,1843789823,RU +1843789824,1843806207,SK +1843806208,1843822591,IR +1843822592,1843838975,RU +1843838976,1843855359,DE +1843855360,1843871743,PL +1843871744,1843888127,GB +1843888128,1843904511,CZ +1843904512,1843920895,GB +1843920896,1843922943,KZ +1843922944,1843924991,NL +1843924992,1843927039,ES +1843927040,1843929087,PL +1843929088,1843931135,IT +1843931136,1843933183,NL +1843933184,1843935231,IT +1843935232,1843937279,GB +1843937280,1843939327,ES +1843939328,1843941375,DK +1843941376,1843943423,FI +1843943424,1843945471,CH +1843945472,1843947519,FR +1843947520,1843949567,RU +1843949568,1843951615,BY +1843951616,1843955711,DE +1843955712,1843957759,IT +1843957760,1843959807,CZ +1843959808,1843961855,GB +1843961856,1843965951,DE +1843965952,1843967999,GB +1843968000,1843970047,RU +1843970048,1843972095,FR +1843972096,1843974143,HU +1843974144,1843976191,ES +1843976192,1843978239,TR +1843978240,1843980287,NL +1843980288,1843982335,FR +1843982336,1843984383,PL +1843984384,1843985407,RU +1843985408,1843985663,UA +1843985664,1843986431,RU +1843986432,1843988479,NO +1843988480,1843990527,GB +1843990528,1843992575,LB +1843992576,1843994623,AT +1843994624,1844000767,GB +1844000768,1844002047,NL +1844002048,1844002815,NO +1844002816,1844006911,CZ +1844006912,1844008959,SM +1844008960,1844011007,PL +1844011008,1844013055,IT +1844013056,1844015103,PL +1844015104,1844017151,GB +1844017152,1844019199,IT +1844019200,1844021247,RU +1844021248,1844027391,DE +1844027392,1844029439,CZ +1844029440,1844031487,RU +1844031488,1844031743,EU +1844031744,1844031999,CH +1844032000,1844032255,GB +1844032256,1844032511,CH +1844032512,1844033535,EU +1844033536,1844035583,RS +1844035584,1844037631,MD +1844037632,1844041727,RU +1844041728,1844043775,IT +1844043776,1844047871,RU +1844047872,1844049919,KZ +1844049920,1844051967,DE +1844051968,1844054015,FR +1844054016,1844056063,RU +1844056064,1844058111,IL +1844058112,1844062207,RU +1844062208,1844064255,CZ +1844064256,1844068351,IT +1844068352,1844072447,GB +1844072448,1844076543,ES +1844076544,1844078591,IE +1844078592,1844080639,DE +1844080640,1844082687,GE +1844082688,1844084735,DE +1844084736,1844086783,RU +1844086784,1844088831,IT +1844088832,1844090879,AT +1844090880,1844092927,RU +1844092928,1844094975,FR +1844094976,1844099071,GB +1844099072,1844101119,DE +1844101120,1844105215,GB +1844105216,1844107263,ES +1844107264,1844109311,DE +1844109312,1844109567,US +1844109568,1844111359,GB +1844111360,1844113407,AL +1844113408,1844115455,FI +1844115456,1844117503,DE +1844117504,1844119551,CZ +1844119552,1844121599,UA +1844121600,1844123647,ES +1844123648,1844125695,RU +1844125696,1844127743,NL +1844127744,1844129791,DE +1844129792,1844131839,NL +1844131840,1844133887,DE +1844133888,1844135935,LT +1844135936,1844137983,NL +1844137984,1844140031,FR +1844140032,1844142079,RU +1844142080,1844144127,RS +1844144128,1844146175,SM +1844146176,1844148223,NO +1844148224,1844150271,GB +1844150272,1844152319,ES +1844152320,1844154367,DE +1844154368,1844154879,GB +1844154880,1844155135,FR +1844155136,1844155391,US +1844155392,1844156415,GB +1844156416,1844158463,IT +1844158464,1844160511,RU +1844160512,1844162559,SE +1844162560,1844164607,CZ +1844164608,1844166655,RU +1844166656,1844168703,AZ +1844168704,1844169727,LB +1844169728,1844170387,DE +1844170388,1844170751,GI +1844170752,1844174847,RU +1844174848,1844178943,DE +1844178944,1844180991,EE +1844180992,1844181488,TR +1844181489,1844181503,DE +1844181504,1844181608,TR +1844181609,1844181616,CA +1844181617,1844181952,TR +1844181953,1844181958,GB +1844181959,1844181984,TR +1844181985,1844181990,GB +1844181991,1844183039,TR +1844183040,1844191231,IT +1844191232,1844195327,AL +1844195328,1844203519,RU +1844203520,1844207615,NL +1844207616,1844211711,RU +1844211712,1844215807,SK +1844215808,1844219903,BE +1844219904,1844220159,KE +1844220160,1844223999,DE +1844224000,1844228095,GB +1844228096,1844232191,DK +1844232192,1844235775,ES +1844235776,1844236031,GB +1844236032,1844236287,FR +1844236288,1844252671,RU +1844252672,1844256767,GB +1844256768,1844260863,BA +1844260864,1844264959,CH +1844264960,1844269055,NL +1844273152,1844277247,RU +1844277248,1844281343,AZ +1844281344,1844285439,DE +1844285440,1844289535,RU +1844289536,1844293631,IT +1844293632,1844297727,DE +1844297728,1844301823,IQ +1844301824,1844305919,NL +1844305920,1844310015,RU +1844310016,1844318207,FR +1844318208,1844322303,IT +1844322304,1844326399,CZ +1844326400,1844330495,DK +1844330496,1844338687,GB +1844338688,1844342783,RU +1844342784,1844346879,IT +1844346880,1844347007,US +1844347008,1844347135,GB +1844347136,1844347263,BE +1844347264,1844347903,GB +1844347904,1844348159,US +1844348160,1844348671,GB +1844348672,1844348927,BE +1844348928,1844349439,GB +1844349440,1844349951,US +1844349952,1844350207,HK +1844350208,1844350719,CA +1844350720,1844350975,GB +1844350976,1844355071,SY +1844355072,1844359167,KZ +1844359168,1844363263,IR +1844363264,1844367359,RU +1844367360,1844371455,CZ +1844371456,1844375551,GE +1844375552,1844379647,RU +1844379648,1844383743,IR +1844383744,1844387839,AZ +1844387840,1844391935,KZ +1844391936,1844396031,DE +1844396032,1844400127,CZ +1844400128,1844408319,GB +1844408320,1844412415,FR +1844412416,1844416511,RU +1844416512,1844420607,FR +1844420608,1844424703,DE +1844424704,1844428799,SI +1844428800,1844432895,DE +1844432896,1844436991,RU +1844436992,1844441087,NO +1844441088,1844445183,IT +1844445184,1844510719,FI +1844510720,1844576255,RU +1844576256,1844641791,GR +1844641792,1844707327,PL +1844707328,1844772863,RU +1844772864,1844838399,RS +1844838400,1844903935,GB +1844903936,1844969471,NO +1844969472,1845035007,RU +1845035008,1845100543,GB +1845100544,1845166079,DE +1845166080,1845231615,UA +1845231616,1845297151,RU +1845297152,1845362687,IL +1845362688,1845428223,UA +1845428224,1845493759,IE +1845493760,1845755903,JP +1845755904,1845764095,HK +1845764096,1845766143,JP +1845766144,1845768191,MY +1845768192,1845772287,JP +1845772288,1845788671,KR +1845788672,1845837823,JP +1845837824,1845839871,PH +1845839872,1845841919,IN +1845841920,1845846015,AU +1845846016,1845850111,ID +1845850112,1845851135,WS +1845851136,1845852159,AU +1845852160,1845854207,JP +1845854208,1845886975,KR +1845886976,1846018047,CN +1846018048,1846542335,KR +1846542336,1846804479,CN +1846804480,1847066623,AU +1847066624,1847590911,TW +1847590912,1847721983,AU +1847721984,1847730175,NP +1847730176,1847732223,PK +1847734272,1847735295,NZ +1847736320,1847738367,AP +1847738368,1847754751,KR +1847754752,1847787519,AP +1847787520,1847803903,KR +1847803904,1847807999,VN +1847808000,1847810047,ID +1847812096,1847853055,KR +1847853056,1848115199,PK +1848115200,1848377343,CN +1848381440,1848382463,NZ +1848383488,1848385535,AU +1848385536,1848393727,KR +1848393728,1848401919,JP +1848401920,1848406015,PH +1848406016,1848410111,NP +1848410112,1848414207,PH +1848418304,1848419327,AU +1848420352,1848422399,ID +1848422400,1848424447,JP +1848424448,1848426495,VN +1848426496,1848639487,KR +1848639488,1848705023,CN +1848705024,1848770559,TH +1848770560,1848774655,JP +1848774656,1848776703,AU +1848778752,1848786943,IN +1848786944,1848791039,JP +1848791040,1848793087,ID +1848793088,1848803327,JP +1848803328,1848819711,TW +1848819712,1848827903,JP +1848827904,1848831999,PH +1848832000,1848836095,JP +1848836096,1849032703,CN +1849032704,1849065471,JP +1849065472,1849163775,PH +1849163776,1849819135,CN +1849819136,1849950207,JP +1849950208,1850212351,KR +1850212352,1850343423,CN +1850343424,1850376191,JP +1850376192,1850392575,MY +1850392576,1850400767,KH +1850400768,1850408959,JP +1850408960,1850490879,CN +1850490880,1850507263,KR +1850507264,1850511359,AU +1850511360,1850513407,ID +1850513408,1850514431,TH +1850515456,1850519551,IN +1850519552,1850520575,AU +1850522624,1850523647,HK +1850523648,1850572799,CN +1850572800,1850671103,TH +1850671104,1850736639,HK +1850736640,1851523071,CN +1851523072,1851527167,JP +1851527168,1851528191,NZ +1851529216,1851531263,PH +1851531264,1851539455,JP +1851541504,1851542527,ID +1851542528,1851543551,HK +1851543552,1851547647,JP +1851547648,1851555839,SG +1851555840,1851588607,KR +1851588608,1851590655,JP +1851590656,1851591679,AU +1851592704,1851593727,AU +1851594752,1851596799,KR +1851596800,1851604991,IN +1851604992,1851613183,PH +1851613184,1851617279,JP +1851617280,1851637759,KR +1851637760,1851654143,PK +1851654144,1853882367,CN +1853882368,1854406655,JP +1854406656,1854668799,ID +1854668800,1855455231,AU +1855455232,1855848447,CN +1855848448,1855913983,JP +1855913984,1855979519,MY +1855979520,1856241663,JP +1856241664,1856307199,TH +1856307200,1856315391,KR +1856315392,1856323583,CN +1856323584,1856339967,KR +1856339968,1856372735,JP +1856372736,1856503807,CN +1856503808,1856765951,TH +1856765952,1856770047,JP +1856770048,1856774143,IN +1856774144,1856779263,JP +1856779264,1856780287,IN +1856780288,1856782335,JP +1856782336,1856798719,KR +1856798720,1856815103,IN +1856815104,1856843775,CN +1856843776,1856847871,HK +1856856064,1856864255,CN +1856864256,1856872447,AU +1856872448,1856876543,NZ +1856880640,1856888831,CN +1856888832,1856892927,AU +1856892928,1856897023,JP +1856897024,1857028095,AU +1857028096,1860173823,CN +1860173824,1860435967,IN +1860435968,1860698111,CN +1860698112,1860706303,JP +1860706304,1860714495,CN +1860714496,1860722687,ID +1860722688,1860726783,KR +1860726784,1860727807,AU +1860728832,1860734975,JP +1860734976,1860735999,NZ +1860737024,1860739071,JP +1860739072,1860743167,PH +1860743168,1860747263,AU +1860747264,1860759551,JP +1860759552,1860761599,AU +1860763648,1860829183,JP +1860829184,1860960255,IN +1860960256,1861091327,CN +1861091328,1861222399,AU +1861222400,1866465279,CN +1866465280,1866530815,JP +1866530816,1866563583,SG +1866563584,1866579967,KR +1866579968,1866588159,JP +1866588160,1866592255,NZ +1866596352,1866661887,CN +1866661888,1866670079,AU +1866670080,1866674175,MY +1866674176,1866678271,TW +1866678272,1866686463,ID +1866686464,1866690559,KH +1866690560,1866711039,JP +1866711040,1866715135,CN +1866715136,1866727423,KR +1866727424,1866731519,HK +1866731520,1866733567,JP +1866733568,1866735615,ID +1866735616,1866743807,PH +1866743808,1866751999,CN +1866752000,1866756095,PK +1866756096,1866760191,ID +1866760192,1866792959,JP +1866792960,1866858495,NZ +1866858496,1866989567,TW +1866989568,1867513855,CN +1867513856,1867775999,TW +1867776000,1867841535,TH +1867841536,1867907071,CN +1867907072,1868038143,JP +1868038144,1868103679,PK +1868103680,1868201983,JP +1868201984,1868210175,MY +1868210176,1868212223,JP +1868212224,1868214271,IN +1868214272,1868218367,KH +1868218368,1868234751,SG +1868234752,1868267519,IN +1868267520,1868283903,KR +1868283904,1868292095,CN +1868292096,1868294143,IN +1868294144,1868295167,VN +1868295168,1868296191,HK +1868296192,1868300287,JP +1868300288,1868333055,IN +1868333056,1868341247,PK +1868341248,1868345343,ID +1868345344,1868346367,GU +1868347392,1868348415,AU +1868349440,1868357631,SG +1868357632,1868361727,HK +1868361728,1868362751,KH +1868362752,1868363775,JP +1868363776,1868365823,BD +1868365824,1868431359,IN +1868431360,1868562431,ID +1868562432,1869611007,JP +1869611008,1870004223,CN +1870004224,1870036991,KR +1870036992,1870045183,KH +1870045184,1870049279,AU +1870049280,1870053375,IN +1870053376,1870069759,AU +1870069760,1870077951,AP +1870086144,1870110719,CN +1870110720,1870118911,PK +1870118912,1870135295,IN +1870135296,1870462975,CN +1870462976,1870479359,JP +1870479360,1870495743,PH +1870495744,1870497791,TW +1870497792,1870499839,IN +1870499840,1870501887,JP +1870501888,1870503935,AF +1870503936,1870508031,AU +1870512128,1870528511,IN +1870528512,1873281023,CN +1873281024,1873412095,JP +1873412096,1873477631,CN +1873477632,1873510399,KR +1873510400,1873543167,JP +1873543168,1874329599,CN +1874329600,1874460671,TW +1874460672,1874591743,CN +1874591744,1874853887,JP +1874853888,1876426751,CN +1876426752,1876557823,JP +1876557824,1876688895,KR +1876688896,1876754431,AU +1876754432,1876756479,BD +1876756480,1876762623,SG +1876762624,1876764671,KR +1876764672,1876765695,ID +1876765696,1876766719,SG +1876766720,1876768767,MY +1876768768,1876769791,AU +1876769792,1876770815,JP +1876770816,1876787199,SG +1876787200,1876885503,CN +1876885504,1876893695,PH +1876893696,1876901887,TH +1876901888,1876918271,SG +1876918272,1876934655,LK +1876934656,1876942847,JP +1876942848,1876946943,AU +1876946944,1876947967,CN +1876947968,1876948991,AF +1876948992,1876950015,CN +1876950016,1876951039,ID +1876951040,1877475327,CN +1877475328,1877688319,JP +1877688320,1877689343,IN +1877689344,1877690367,TH +1877690368,1877691391,IN +1877691392,1877692415,JP +1877692416,1877696511,PH +1877696512,1877704703,CN +1877704704,1877705727,AU +1877706752,1877707775,SG +1877707776,1877709823,AU +1877710848,1877711871,AP +1877711872,1877712895,BD +1877712896,1877721087,CN +1877721088,1877737471,TW +1877737472,1877999615,JP +1877999616,1879048191,TW +1879048192,1883218547,CN 1883218548,1883218551,ES 1883218552,1883218555,FR -1883218556,1883218579,AU +1883218556,1883218579,CN 1883218580,1883218583,BE -1883218584,1912602623,AU +1883218584,1883504639,CN +1883504640,1883766783,JP +1883766784,1883770879,MN +1883770880,1883783167,KR +1883783168,1883799551,VN +1883799552,1883832319,KR +1883832320,1884028927,CN +1884028928,1884159999,KR +1884160000,1884164095,VN +1884164096,1884168191,TW +1884168192,1884172287,ID +1884172288,1884176383,PH +1884176384,1884184575,TW +1884184576,1884186623,ID +1884186624,1884188671,TW +1884188672,1884192767,JP +1884192768,1884209151,ID +1884209152,1884217343,JP +1884217344,1884225535,SG +1884225536,1884291071,IN +1884291072,1885863935,CN +1885863936,1885995007,TW +1885995008,1886191615,KR +1886191616,1886195711,PH +1886195712,1886197759,ID +1886199808,1886207999,KR +1886208000,1886216191,NZ +1886224384,1886257151,CN +1886257152,1886322687,IN +1886322688,1886781439,CN +1886781440,1886978047,HK +1886978048,1886986239,KR +1886986240,1886990335,TW +1886990336,1886994431,IN +1886994432,1887010815,TW +1887010816,1887019007,TH +1887019008,1887027199,HK +1887027200,1887043583,KR +1887043584,1887764479,CN +1887764480,1887813631,KR +1887813632,1887830015,IN +1887830016,1887961087,LK +1887961088,1887993855,JP +1887993856,1888026623,KR +1888026624,1888030719,BD +1888030720,1888034815,HK +1888034816,1888059391,JP +1888059392,1888063487,VN +1888063488,1888067583,JP +1888067584,1888071679,MY +1888071680,1888073727,KR +1888073728,1888239615,JP +1888239616,1888255999,KR +1888256000,1888260095,JP +1888260096,1888264191,KR +1888264192,1888266239,ID +1888266240,1888268287,JP +1888268288,1888270335,AU +1888270336,1888271359,SG +1888271360,1888272383,TH +1888272384,1888288767,KR +1888288768,1888354303,AU +1888354304,1888485375,TH +1888485376,1891631103,KR +1891631104,1891893247,CN +1891893248,1891942399,IN +1891942400,1891950591,KR +1891950592,1891958783,PH +1891958784,1892024319,VN +1892024320,1892122623,PH +1892122624,1892155391,SG +1892155392,1892941823,PH +1892941824,1893015551,KR +1893015552,1893019647,AU +1893023744,1893027839,HK +1893027840,1893031935,VN +1893031936,1893040127,HK +1893040128,1893072895,AU +1893072896,1893138431,KR +1893138432,1893203967,ID +1893203968,1893728255,KR +1893728256,1896480767,CN +1896480768,1896497151,KR +1896497152,1896513535,SG +1896513536,1896546303,HK +1896546304,1896579071,BD +1896579072,1896587263,ID +1896587264,1896591359,SG +1896591360,1896593407,ID +1896593408,1896594431,AU +1896595456,1896603647,CN +1896603648,1896605695,IN +1896605696,1896606719,AU +1896607744,1896609791,VU +1896611840,1897070591,CN +1897070592,1897136127,IN +1897136128,1897140223,AU +1897140224,1897141247,IN +1897141248,1897142271,HK +1897142272,1897143295,AU +1897144320,1897152511,NC +1897152512,1897160703,FJ +1897168896,1897169919,AU +1897170944,1897172991,ID +1897172992,1897175039,SG +1897175040,1897176063,JP +1897176064,1897177087,SG +1897177088,1897185279,PH +1897185280,1897201663,JP +1897201664,1897209855,KR +1897209856,1897213951,AU +1897213952,1897218047,JP +1897218048,1897222143,IN +1897222144,1897226239,TW +1897226240,1897234431,NC +1897234432,1897242623,MY +1897242624,1897250815,TW +1897250816,1897259007,HK +1897259008,1897260031,NZ +1897260032,1897261055,BD +1897261056,1897263103,JP +1897263104,1897265151,TH +1897265152,1897267199,JP +1897267200,1897365503,VN +1897365504,1897398271,MY +1897398272,1897660415,CN +1897660416,1897725951,HK +1897725952,1897758719,AP +1897758720,1897779199,KR +1897779200,1897781247,AU +1897781248,1897783295,JP +1897783296,1897787391,SG +1897787392,1897788415,AU +1897789440,1897790463,KH +1897790464,1897791487,HK +1897791488,1897824255,KR +1897824256,1897857023,IN +1897857024,1897922559,CN +1897922560,1898708991,JP +1898708992,1899233279,CN +1899233280,1899237375,AU +1899241472,1899249663,VN +1899249664,1899266047,MO +1899266048,1899267071,AU +1899268096,1899270143,KR +1899270144,1899271167,AU +1899272192,1899273215,SG +1899273216,1899274239,JP +1899274240,1899282431,CN +1899282432,1899290623,KR +1899290624,1899294719,AU +1899298816,1899364351,TH +1899364352,1899724799,CN +1899724800,1899741183,KR +1899741184,1899749375,LK +1899750400,1899751423,JP +1899751424,1899753471,ID +1899753472,1899757567,HK +1899757568,1899831295,KR +1899831296,1899839487,PH +1899839488,1899849727,AU +1899849728,1899850751,KR +1899850752,1899851775,VN +1899851776,1899855871,JP +1899855872,1899888639,TW +1899888640,1904345087,CN +1904345088,1904361471,JP +1904361472,1904369663,KR +1904369664,1904375807,CN +1904375808,1904376831,NZ +1904377856,1904476159,KR +1904476160,1905262591,CN +1905262592,1906311167,JP +1906311168,1908408319,VN +1908408320,1908424703,AU +1908441088,1908473855,JP +1908473856,1908539391,IN +1908539392,1908670463,CN +1908670464,1908735999,TW +1908736000,1908740095,AU +1908744192,1908748287,JP +1908748288,1908750335,PK +1908752384,1908753407,NZ +1908754432,1908756479,PH +1908756480,1908760575,KR +1908760576,1908761599,NZ +1908762624,1908763647,IN +1908764672,1908768767,AP +1908768768,1908801535,JP +1908801536,1908899839,KR +1908899840,1908932607,NP +1908932608,1909129215,CN +1909129216,1909161983,AU +1909194752,1909456895,CN +1909456896,1909473279,JP +1909473280,1909481471,HK +1909481472,1909587967,CN +1909587968,1909719039,MY +1909719040,1909735423,CN +1909735424,1909743615,IN +1909743616,1909744639,AU +1909745664,1909746687,JP +1909746688,1909747711,MY +1909747712,1909751807,ID +1909751808,1909759999,JP +1909760000,1909762047,ID +1909762048,1909764095,AU +1909764096,1909766143,PH +1909768192,1909784575,HK +1909784576,1909817343,CN +1909817344,1909850111,JP +1909850112,1909981183,CN +1909981184,1910112255,KR +1910112256,1912340479,CN +1912340480,1912602623,HK 1912602624,1913651199,ID -1913651200,1913913343,JP -1913913344,1914175487,AU +1913651200,1914175487,JP 1914175488,1914437631,TW 1914437632,1914503167,CN 1914503168,1914552319,KR @@ -25217,10 +48506,12 @@ 1914650624,1914652671,MN 1914652672,1914654719,AU 1914654720,1914658815,JP -1914658816,1914662911,AU +1914658816,1914660863,AU 1914662912,1914667007,KR 1914667008,1914683391,IN -1914683392,1914691583,AU +1914683392,1914687487,AU +1914687488,1914688511,NZ +1914689536,1914691583,JP 1914691584,1914695679,IN 1914695680,1914697727,ID 1914697728,1914699775,IN @@ -25232,11 +48523,12 @@ 1916534784,1917124607,CN 1917124608,1917169663,JP 1917169664,1917177855,NC -1917177856,1917181951,AU 1917181952,1917190143,IN 1917190144,1917321215,KR -1917321216,1918894079,AU -1918894080,1919680511,CN +1917321216,1917779967,AU +1917779968,1917796351,ID +1917796352,1917845503,IN +1917845504,1919680511,CN 1919680512,1919729663,KR 1919729664,1919746047,PH 1919746048,1919811583,TH @@ -25244,10 +48536,8 @@ 1919815680,1919817727,ID 1919817728,1919819775,KR 1919819776,1919821823,NZ -1919821824,1919823871,AU 1919823872,1919827967,JP 1919827968,1919844351,CN -1919844352,1919877119,AU 1919877120,1919885311,CN 1919885312,1919893503,KR 1919893504,1919909887,JP @@ -25267,13 +48557,200 @@ 1921089536,1921105919,AU 1921105920,1921122303,KR 1921122304,1921187839,BD -1921187840,1921253375,AU 1921253376,1921318911,CN 1921318912,1921384447,MY 1921384448,1921388543,NZ -1921388544,1921515519,AU +1921392640,1921400831,JP +1921400832,1921404927,ID +1921404928,1921406975,HK +1921406976,1921409023,BD +1921409024,1921425407,JP +1921425408,1921433599,NZ +1921433600,1921449983,JP +1921449984,1921515519,CN 1921515520,1921646591,TW -1921646592,1946157055,AU +1921646592,1921777663,CN +1921777664,1921843199,TW +1921843200,1921851391,KR +1921851392,1921853439,JP +1921853440,1921855487,KR +1921855488,1921859583,ID +1921859584,1921861631,IN +1921861632,1921863679,SG +1921863680,1921865727,BD +1921865728,1921867775,ID +1921867776,1921871871,AU +1921875968,1921892351,CN +1921892352,1921896447,AU +1921900544,1921908735,KR +1921908736,1921943551,JP +1921943552,1921945599,IN +1921945600,1921949695,HK +1921949696,1921953791,AU +1921957888,1921974271,GU +1921974272,1922039807,IN +1922039808,1925447679,JP +1925447680,1925578751,CN +1925578752,1925611519,AU +1925611520,1925619711,PH +1925619712,1925627903,TW +1925627904,1925638143,JP +1925638144,1925638399,SA +1925638400,1925638655,PK +1925638656,1925638911,KW +1925638912,1925639167,EG +1925639168,1925639423,AE +1925639424,1925639679,EG +1925639680,1925639935,KW +1925639936,1925640191,SA +1925640192,1925642239,ID +1925642240,1925644287,AU +1925644288,1925660671,KR +1925660672,1925664767,HK +1925664768,1925677055,ID +1925677056,1926234111,KR +1926234112,1929379839,CN +1929379840,1930952703,KR +1930952704,1931345919,CN +1931345920,1931354111,JP +1931354112,1931362303,AU +1931362304,1931378687,TW +1931378688,1931427839,JP +1931427840,1931431935,PH +1931431936,1931433983,JP +1931433984,1931436031,AU +1931436032,1931444223,KR +1931444224,1931460607,TH +1931460608,1931468799,JP +1931468800,1931476991,SG +1931476992,1931739135,CN +1931739136,1932001279,JP +1932001280,1932132351,KR +1932132352,1932148735,AU +1932148736,1932152831,PK +1932156928,1932161023,JP +1932161024,1932163071,TW +1932163072,1932165119,PH +1932165120,1932197887,SG +1932197888,1932263423,TW +1932263424,1933574143,CN +1933574144,1933639679,AU +1933639680,1933705215,JP +1933705216,1933770751,SG +1933770752,1933836287,TH +1933836288,1933901823,KR +1933901824,1933918207,AU +1933918208,1933922303,KH +1933922304,1933926399,IN +1933926400,1933934591,KR +1933934592,1933942783,IN +1933942784,1933950975,AU +1933950976,1933955071,JP +1933955072,1933957119,BD +1933957120,1933959167,ID +1933959168,1933963263,JP +1933963264,1933967359,IN +1933967360,1934032895,AU +1934098432,1934622719,VN +1934622720,1934884863,TW +1934884864,1934901247,CN +1934901248,1934917631,LA +1934917632,1934925823,MV +1934925824,1934927871,KR +1934927872,1934929919,PH +1934929920,1934931967,VN +1934931968,1934934015,JP +1934934016,1934942207,CN +1934942208,1934966783,PH +1934966784,1934974975,ID +1934974976,1934983167,JP +1934983168,1934985215,AU +1934987264,1934991359,TW +1934991360,1934999551,KR +1934999552,1935015935,CN +1935015936,1935081471,KR +1935081472,1935147007,TH +1935147008,1935671295,KR +1935671296,1935933439,IN +1935933440,1936457727,CN +1936457728,1937244159,IN +1937244160,1937506303,CN +1937506304,1937508351,AU +1937510400,1937514495,CN +1937514496,1937516543,AU +1937522688,1937530879,ID +1937530880,1937532927,US +1937532928,1937534463,IN +1937534464,1937534975,GB +1937534976,1937535487,US +1937535488,1937539071,IN +1937539072,1937637375,JP +1937637376,1937670143,HK +1937670144,1937672191,NZ +1937674240,1937678335,JP +1937678336,1937682431,NC +1937686528,1937702911,KR +1937702912,1937768447,BD +1937768448,1938030591,AU +1938030592,1938292735,MY +1938292736,1938948095,KR +1938948096,1938964479,JP +1938964480,1938968575,AU +1938972672,1938976767,MY +1938976768,1938978815,SG +1938978816,1938980863,VN +1938980864,1939079167,PH +1939079168,1939865599,CN +1939865600,1939898367,KR +1939898368,1939914751,HK +1939914752,1939931135,IN +1939931136,1939996671,KR +1939996672,1940127743,JP +1940127744,1940193279,MY +1940193280,1940234239,JP +1940234240,1940236287,VN +1940236288,1940238335,AU +1940238336,1940240383,KR +1940240384,1940242431,JP +1940242432,1940258815,TW +1940258816,1940275199,AU +1940275200,1940283391,PH +1940283392,1940291583,ID +1940291584,1940295679,HK +1940295680,1940324351,JP +1940324352,1940357119,PK +1940357120,1940389887,JP +1940389888,1940914175,CN +1940914176,1941045247,JP +1941045248,1941049343,AP +1941049344,1941051391,AU +1941051392,1941052415,KH +1941052416,1941053439,AU +1941053440,1941057535,KR +1941057536,1941059583,ID +1941059584,1941061631,TH +1941061632,1941069823,KR +1941069824,1941071871,IN +1941071872,1941073919,AU +1941073920,1941075967,JP +1941075968,1941110783,ID +1941110784,1941176319,JP +1941176320,1941438463,CN +1941438464,1941569535,IN +1941569536,1941618687,PK +1941618688,1941635071,AU +1941635072,1941639167,IN +1941639168,1941643263,NP +1941643264,1941651455,IN +1941651456,1941655551,JP +1941655552,1941657599,KR +1941657600,1941658623,MN +1941658624,1941659647,JP +1941659648,1941667839,NZ +1941667840,1941700607,AU +1941700608,1941831679,NZ +1941962752,1945108479,CN +1945108480,1946157055,IN 1946157056,1946159103,ID 1946159104,1946161151,MY 1946161152,1946163199,AU @@ -25281,19 +48758,21 @@ 1946165248,1946173439,PK 1946173440,1946173503,MY 1946173504,1946173535,SG -1946173536,1946173567,AU +1946173536,1946173567,AP 1946173568,1946173631,HK -1946173632,1946173663,AU +1946173632,1946173663,AP 1946173664,1946173679,PH 1946173680,1946173687,TW -1946173688,1946173695,AU +1946173688,1946173695,AP 1946173696,1946173951,TW -1946173952,1946175487,AU +1946173952,1946174463,AP +1946174464,1946174720,SG +1946174721,1946175487,AP 1946175488,1946176511,SY 1946176512,1946176767,PH -1946176768,1946177535,AU +1946176768,1946177535,AP 1946177536,1946177791,SG -1946177792,1946181631,AU +1946177792,1946181631,AP 1946181632,1946189823,MY 1946189824,1946222591,JP 1946222592,1946943487,CN @@ -25301,7 +48780,6 @@ 1946951680,1946953727,BD 1946953728,1946955775,ID 1946955776,1946957823,SG -1946957824,1946959871,KH 1946959872,1946976255,LK 1946976256,1947009023,SG 1947009024,1947074559,CN @@ -25324,7 +48802,7 @@ 1949990912,1949995007,CN 1949995008,1950007295,JP 1950007296,1950009343,ID -1950009344,1950011391,AU +1950009344,1950011391,BD 1950011392,1950015487,CN 1950015488,1950023679,TH 1950023680,1950089215,TW @@ -25332,27 +48810,26 @@ 1950351360,1950482431,JP 1950482432,1950515199,CN 1950515200,1950518271,US -1950518272,1950518783,GB +1950518272,1950518783,IN 1950518784,1950519295,NL 1950519296,1950523391,IN -1950523392,1950531583,AU +1950523392,1950527487,AU 1950531584,1950533631,NP 1950533632,1950535679,ID 1950535680,1950539775,HK -1950539776,1950543871,AU +1950539776,1950541823,AU 1950543872,1950545919,NZ 1950545920,1950547967,PH 1950547968,1950580735,KR -1950580736,1950613503,AU 1950613504,1950617599,GU -1950617600,1950621695,AU 1950621696,1950629887,KR 1950629888,1950646271,IN 1950646272,1950648319,VN 1950648320,1950650367,PH 1950650368,1950654463,TH 1950654464,1950658559,ID -1950658560,1950662655,AU +1950658560,1950660607,PH +1950660608,1950662655,AP 1950662656,1950666751,BD 1950666752,1950668799,NP 1950668800,1950670847,JP @@ -25362,23 +48839,24 @@ 1950676992,1950679039,ID 1950679040,1950777343,CN 1950777344,1950793727,JP -1950793728,1950810111,AU 1950810112,1950875647,PK 1950875648,1951137791,IN 1951137792,1951399935,CN 1951399936,1951662079,JP 1951662080,1951727615,KR -1951727616,1951793151,AU 1951793152,1952022527,SG 1952022528,1952026623,TW 1952026624,1952030719,CN 1952030720,1952038911,KR -1952038912,1952043007,JP -1952043008,1952047103,AU +1952038912,1952047103,JP 1952047104,1952051199,NZ -1952051200,1952088063,AU -1952088064,1952090111,NZ -1952090112,1952092159,AU +1952055296,1952071679,AU +1952071680,1952073727,HK +1952073728,1952074751,AU +1952074752,1952075775,NZ +1952075776,1952079871,CN +1952079872,1952088063,PK +1952088064,1952092159,NZ 1952092160,1952096255,JP 1952096256,1952102399,ID 1952102400,1952104447,CN @@ -25391,7 +48869,6 @@ 1952186368,1952251903,HK 1952251904,1952284671,PH 1952284672,1952288767,NZ -1952288768,1952301055,AU 1952301056,1952317439,KR 1952317440,1952382975,JP 1952382976,1952448511,CN @@ -25412,33 +48889,31 @@ 1958830080,1958838271,JP 1958838272,1958842367,IN 1958842368,1958844415,NZ -1958844416,1958846463,AU 1958846464,1958848511,IN 1958848512,1958850559,BD -1958850560,1958871039,AU +1958850560,1958862847,AU 1958871040,1959067647,CN 1959067648,1959100415,MY 1959100416,1959102463,ID 1959102464,1959104511,JP -1959104512,1959108607,AU +1959104512,1959106559,AU 1959108608,1959110655,NP 1959110656,1959112703,JP 1959112704,1959116799,HK 1959116800,1959133183,SG 1959133184,1959239679,CN 1959239680,1959241727,KR -1959241728,1959243775,AU +1959241728,1959243775,IN 1959243776,1959247871,JP 1959247872,1959251967,ID -1959251968,1959254015,NZ -1959254016,1959264255,AU +1959251968,1959256063,NZ +1959256064,1959260159,AU 1959264256,1959395327,KR -1959395328,1959526399,AU 1959526400,1959657471,CN 1959657472,1959723007,MY 1959723008,1960050687,CN 1960050688,1960058879,KR -1960058880,1960069119,AU +1960067072,1960069119,AU 1960069120,1960071167,ID 1960071168,1960075263,TW 1960075264,1960077311,ID @@ -25450,30 +48925,25 @@ 1960091648,1960095743,CN 1960095744,1960097791,IN 1960097792,1960099839,BD -1960099840,1960132607,AU +1960099840,1960128511,AU +1960128512,1960132607,ID 1960132608,1960181759,CN 1960181760,1960185855,TW 1960185856,1960187903,JP 1960187904,1960189951,IN 1960189952,1960202239,CN 1960202240,1960206335,JP -1960206336,1960207359,SG -1960207360,1960207615,PH -1960207616,1960208383,SG -1960208384,1960208639,HK -1960208640,1960210431,SG -1960210432,1960210687,ID +1960206336,1960210687,SG 1960210688,1960210943,TH -1960210944,1960211455,IN -1960211456,1960211967,SG -1960211968,1960212223,TH -1960212224,1960212479,SG -1960212480,1960212991,CN -1960212992,1960214527,SG +1960210944,1960211199,IN +1960211200,1960213247,SG +1960213248,1960213503,PH +1960213504,1960213759,CN +1960213760,1960214527,SG 1960214528,1960574975,CN 1960574976,1960837119,JP 1960837120,1961885695,CN -1961885696,1962016767,AU +1961885696,1961951231,AU 1962016768,1962541055,CN 1962541056,1962672127,AU 1962672128,1962803199,CN @@ -25482,7 +48952,7 @@ 1962829824,1962831871,JP 1962831872,1962835967,ID 1962835968,1962868735,CN -1962868736,1962901503,AU +1962868736,1962885119,AU 1962901504,1962934271,CN 1962934272,1963458559,VN 1963458560,1963982847,CN @@ -25495,11 +48965,10 @@ 1964126464,1964130303,SG 1964130304,1964134399,HK 1964134400,1964136447,NZ -1964136448,1964138495,AU 1964138496,1964146687,HK 1964146688,1964171263,JP 1964171264,1964173311,BD -1964173312,1964175359,AU +1964173312,1964175359,AP 1964175360,1964179455,PK 1964179456,1964244991,TW 1964244992,1964249087,AU @@ -25509,7 +48978,7 @@ 1964257280,1964261375,ID 1964261376,1964263423,AU 1964263424,1964265471,JP -1964265472,1964273663,KR +1964265472,1964269567,KR 1964273664,1964275711,KH 1964275712,1964277759,GU 1964277760,1964294143,SG @@ -25518,14 +48987,14 @@ 1965948928,1966014463,JP 1966014464,1966079999,TH 1966080000,1966342143,CN -1966342144,1966407679,AU 1966407680,1966417919,JP -1966417920,1966419967,AU 1966419968,1966424063,CN 1966424064,1966440447,KR 1966440448,1966444543,AU 1966444544,1966446591,NZ -1966446592,1966452735,AU +1966446592,1966447615,MY +1966447616,1966448639,NZ +1966448640,1966452735,AU 1966452736,1966456831,CN 1966456832,1966473215,KR 1966473216,1966538751,ID @@ -25533,7 +49002,7 @@ 1966571520,1966587903,KR 1966587904,1966591999,AF 1966592000,1966596095,JP -1966596096,1966600191,TW +1966596096,1966600191,AU 1966600192,1966602239,IN 1966602240,1966604287,KH 1966604288,1966669823,TW @@ -25568,7 +49037,7 @@ 1969704960,1969707007,BD 1969707008,1969709055,MH 1969709056,1969713151,TW -1969713152,1969717247,AU +1969713152,1969715199,AU 1969717248,1969721343,CN 1969721344,1969725439,HK 1969725440,1969727487,JP @@ -25576,9 +49045,11 @@ 1969729536,1969733631,JP 1969733632,1969750015,VN 1969750016,1969790975,JP -1969790976,1969795071,AU +1969790976,1969793023,AU +1969793024,1969795071,AP 1969795072,1969797119,NZ -1969797120,1969799167,AU +1969797120,1969798143,SG +1969798144,1969799167,HK 1969799168,1969807359,ID 1969807360,1969809407,AF 1969809408,1969811455,IN @@ -25592,16 +49063,18 @@ 1970800640,1970804735,AU 1970804736,1970806783,KH 1970806784,1970808831,NZ -1970808832,1970810879,AU 1970810880,1970812927,JP 1970812928,1970814975,LK 1970814976,1970915327,CN 1970915328,1970917375,ID 1970917376,1970921471,TH 1970921472,1970925567,NP -1970925568,1970926335,SG +1970925568,1970926079,SG +1970926080,1970926335,AU 1970926336,1970926591,US -1970926592,1970927615,SG +1970926592,1970926847,SG +1970926848,1970927103,IL +1970927104,1970927615,SG 1970927616,1970929663,AU 1970929664,1970962431,VN 1970962432,1970995199,CN @@ -25616,27 +49089,26 @@ 1984118784,1984131071,JP 1984131072,1984135167,CN 1984135168,1984151551,KR -1984151552,1984153599,PH 1984153600,1984155647,KH 1984155648,1984159743,AU 1984159744,1984167935,IN 1984167936,1984430079,VN 1984430080,1985085439,CN 1985085440,1985093631,ID -1985093632,1985101823,AU +1985093632,1985097727,AU 1985101824,1985118207,JP -1985118208,1985134591,NZ -1985134592,1985150975,AU +1985118208,1985150975,NZ 1985150976,1985216511,JP 1985216512,1985347583,CN 1985347584,1985478655,JP 1985478656,1985480703,IN 1985480704,1985482751,PH -1985482752,1985486847,AU +1985482752,1985484799,AU 1985486848,1985609727,CN 1985609728,1985675263,NZ 1985675264,1985708031,KR -1985708032,1985716223,AU +1985708032,1985712127,ID +1985712128,1985716223,KR 1985716224,1985720319,NP 1985720320,1985724415,IN 1985724416,1985732607,JP @@ -25646,7 +49118,9 @@ 1985740800,1985871871,NZ 1985871872,1986002943,IN 1986002944,1986199551,ID -1986199552,1986265087,AU +1986199552,1986215935,HK +1986215936,1986232319,ID +1986232320,1986265087,TW 1986265088,1986396159,MY 1986396160,1986398207,VN 1986398208,1986400255,HK @@ -25664,9 +49138,9 @@ 1986523136,1986525183,CN 1986525184,1986527231,BN 1986527232,1986723839,JP -1986723840,1986756607,AU +1986723840,1986740223,AU 1986756608,1986760703,PK -1986760704,1986764799,AU +1986760704,1986762751,AU 1986764800,1986768895,KR 1986768896,1986772991,AU 1986772992,1986789375,MY @@ -25680,16 +49154,19 @@ 1988886528,1989148671,HK 1989148672,1989410815,CN 1989410816,1989541887,NZ -1989541888,1989672959,AU -1989672960,1989935103,JP -1989935104,1990197247,AU +1989541888,1989607423,TW +1989607424,1989660671,JP +1989660672,1989661695,IN +1989661696,1989662719,ID +1989662720,1989663743,AU +1989663744,1989664767,ID +1989664768,1990197247,JP 1990197248,1990983679,TW 1990983680,1991245823,TH 1991245824,1991311359,KR 1991311360,1991376895,JP 1991376896,1991442431,CN -1991442432,1991499775,BD -1991499776,1991507967,AU +1991442432,1991507967,BD 1991507968,1993342975,CN 1993342976,1993605119,AU 1993605120,1993736191,CN @@ -25710,18 +49187,19 @@ 1996636160,1996644351,ID 1996644352,1996652543,BT 1996652544,1997176831,CN -1997176832,1997185023,AU +1997176832,1997180927,AU 1997185024,1997187071,JP 1997187072,1997189119,HK 1997189120,1997191167,ID -1997191168,1997193215,AU -1997193216,1997209599,JP -1997209600,1997406207,AU +1997191168,1997209599,JP +1997209600,1997242367,AU +1997242368,1997275135,ID +1997275136,1997406207,AU 1997406208,1997471743,TW 1997471744,1997479935,NZ -1997479936,1997492223,AU +1997488128,1997490175,AU 1997492224,1997496319,KH -1997496320,1997504511,AU +1997496320,1997500415,AU 1997504512,1997506559,ID 1997506560,1997508607,CN 1997508608,1997510655,JP @@ -25729,12 +49207,10 @@ 1997512704,1997520895,VN 1997520896,1997537279,TW 1997537280,1997602815,CN -1997602816,1997611007,KR -1997611008,1997619199,AU -1997619200,1997635583,KR -1997635584,1997651967,AU +1997602816,1997635583,KR +1997635584,1997643775,AU 1997651968,1997668351,VN -1997668352,1997701119,AU +1997668352,1997684735,AU 1997701120,1997705215,VN 1997705216,1997707263,BD 1997707264,1997709311,ID @@ -25748,7 +49224,7 @@ 1998274560,1998290943,CN 1998290944,1998299135,PH 1998299136,1998454783,CN -1998454784,1998458879,AU +1998454784,1998456831,AU 1998458880,1998462975,TW 1998462976,1998467071,BD 1998467072,1998471167,CN @@ -25760,7 +49236,7 @@ 1998561280,1998565375,IN 1998565376,1998569471,TW 1998569472,1998577663,CN -1998577664,1998581759,AU +1998577664,1998579711,AU 1998581760,1998585855,KR 1998585856,1999130623,CN 1999130624,1999134719,BD @@ -25768,7 +49244,6 @@ 1999136768,1999138815,AU 1999138816,1999142911,MY 1999142912,1999249407,CN -1999249408,1999257599,AU 1999257600,1999276031,TH 1999276032,1999278079,CN 1999278080,1999280127,HK @@ -25783,19 +49258,16 @@ 1999589376,1999591423,HK 1999591424,1999593471,ID 1999593472,1999597567,JP -1999597568,1999599615,NZ -1999599616,1999601663,AU +1999597568,1999601663,NZ 1999601664,1999634431,JP 1999634432,2000158719,CN 2000158720,2000191487,SG -2000191488,2000224255,AU 2000224256,2000355327,CN 2000355328,2000371711,KR 2000371712,2000373759,JP 2000373760,2000375807,HK 2000375808,2000377855,AF 2000377856,2000379903,JP -2000379904,2000388095,AU 2000388096,2000617471,CN 2000617472,2000621567,PH 2000621568,2000625663,JP @@ -25804,7 +49276,6 @@ 2000642048,2000646143,HK 2000646144,2000650239,JP 2000650240,2000654335,PK -2000654336,2000658431,AU 2000658432,2000668671,JP 2000668672,2000674815,AU 2000674816,2001207295,KR @@ -25821,12 +49292,12 @@ 2001559552,2001567743,KR 2001567744,2001600511,TW 2001600512,2001862655,CN -2001862656,2001866751,AU +2001862656,2001864703,AU 2001866752,2001870847,JP 2001870848,2001879039,KR 2001879040,2001895423,IN 2001895424,2001899519,VN -2001899520,2001903615,AU +2001899520,2001901567,AU 2001903616,2001915903,JP 2001915904,2001919999,BD 2001920000,2001926143,ID @@ -25864,7 +49335,8 @@ 2007031808,2007035903,AU 2007035904,2007039999,TW 2007040000,2007048191,KR -2007048192,2007064575,AU +2007048192,2007052287,AU +2007056384,2007064575,AU 2007064576,2007066623,MY 2007066624,2007070719,JP 2007070720,2007072767,US @@ -25872,8 +49344,8 @@ 2007498752,2008023039,JP 2008023040,2009071615,CN 2009071616,2011168767,KR -2011168768,2011205631,NZ -2011205632,2011299839,AU +2011168768,2011234303,NZ +2011234304,2011299839,AU 2011299840,2011430911,IN 2011430912,2011693055,JP 2011693056,2011824127,CN @@ -25883,8 +49355,7 @@ 2011897856,2011899903,NZ 2011899904,2011901951,HK 2011901952,2011906047,IN -2011906048,2011916287,FJ -2011916288,2011922431,AU +2011906048,2011922431,FJ 2011922432,2011938815,CN 2011938816,2011942911,KR 2011942912,2011947007,ID @@ -25895,20 +49366,23 @@ 2012086272,2012610559,JP 2012610560,2012741631,HK 2012741632,2013003775,CN -2013003776,2013036543,AU +2013003776,2013011967,AU +2013020160,2013028351,AU +2013028352,2013030399,TH +2013030400,2013032447,ID +2013032448,2013036543,FM 2013036544,2013038591,ID 2013038592,2013040639,HK 2013040640,2013044735,IN 2013044736,2013048831,ID -2013048832,2013052927,AU +2013048832,2013050879,AU 2013052928,2013061119,IN 2013061120,2013065215,PG -2013065216,2013069311,AU 2013069312,2014314495,CN 2014314496,2014838783,AU 2014838784,2015100927,CN 2015100928,2015166463,PH -2015166464,2015199231,AU +2015166464,2015182847,AU 2015199232,2015203327,KR 2015203328,2015205375,JP 2015205376,2015207423,ID @@ -25916,22 +49390,22 @@ 2015215616,2015216127,HK 2015216128,2015217663,CA 2015217664,2015219456,GU -2015219457,2015223807,CA +2015219457,2015223743,CA +2015223744,2015223751,PG +2015223752,2015223759,AU +2015223760,2015223807,CA 2015223808,2015225855,ID 2015225856,2015227903,IN -2015227904,2015231999,AU +2015227904,2015229951,AU 2015232000,2016542719,CN 2016542720,2016550911,BD 2016550912,2016555007,SG 2016555008,2016559103,MY 2016559104,2016583679,KR 2016583680,2016585727,JP -2016585728,2016587775,AU 2016587776,2016589823,BD 2016589824,2016591871,VN -2016591872,2016595967,JP -2016595968,2016600063,AU -2016600064,2016673791,JP +2016591872,2016673791,JP 2016673792,2016935935,CN 2016935936,2017460223,IN 2017460224,2017984511,CN @@ -25946,15 +49420,16 @@ 2018050048,2018115583,KR 2018115584,2018246655,JP 2018246656,2019033087,CN -2019033088,2019037183,AU +2019033088,2019035135,AU +2019035136,2019037183,CN 2019037184,2019041279,JP 2019041280,2019045375,IN -2019045376,2019098623,AU +2019049472,2019057663,AU +2019065856,2019082239,AU 2019098624,2019115007,PH 2019115008,2019117055,US 2019117056,2019119103,IN 2019119104,2019121151,NZ -2019121152,2019123199,AU 2019123200,2019131391,NP 2019131392,2019164159,JP 2019164160,2019360767,CN @@ -25963,20 +49438,19 @@ 2019557376,2021654527,TW 2021654528,2022178815,CN 2022178816,2022180863,NZ -2022180864,2022182911,AU 2022182912,2022184959,ID 2022184960,2022187007,KH -2022187008,2022191103,HK +2022187008,2022187071,US +2022187072,2022191103,HK 2022191104,2022193151,NZ -2022193152,2022195199,AU 2022195200,2022211583,KR 2022211584,2022227967,CN 2022227968,2022244351,JP 2022244352,2022277119,CN 2022277120,2022309887,JP 2022309888,2022313983,PH -2022313984,2022316031,NZ -2022316032,2022326271,AU +2022313984,2022318079,NZ +2022318080,2022326271,AU 2022326272,2022330367,VN 2022330368,2022334463,MY 2022334464,2022342655,IN @@ -25984,8 +49458,7 @@ 2022359040,2022375423,IN 2022375424,2022572031,MY 2022572032,2022637567,KR -2022637568,2022662143,JP -2022662144,2022670335,AU +2022637568,2022670335,JP 2022670336,2022678527,PH 2022678528,2022703103,KR 2022703104,2023751679,AU @@ -25994,8 +49467,7 @@ 2030043136,2030045183,AU 2030045184,2030047231,BD 2030047232,2030051327,CN -2030051328,2030057471,JP -2030057472,2030059519,AU +2030051328,2030059519,JP 2030059520,2030108671,KR 2030108672,2030125055,PH 2030125056,2030141439,KR @@ -26030,7 +49502,6 @@ 2033623040,2033625087,PH 2033625088,2033627135,HK 2033627136,2033629183,NZ -2033629184,2033631231,AU 2033631232,2033647615,KR 2033647616,2033663999,CN 2033664000,2033696767,KR @@ -26052,14 +49523,12 @@ 2034213792,2034237439,CN 2034237440,2034499583,KR 2034499584,2034761727,CN -2034761728,2034958335,NZ -2034958336,2035023871,AU +2034761728,2035023871,NZ 2035023872,2035154943,CN 2035154944,2035220479,KR 2035220480,2035253247,AU 2035253248,2035269631,CN -2035269632,2035277823,NZ -2035277824,2035286015,AU +2035269632,2035286015,NZ 2035286016,2035810303,JP 2035810304,2035875839,KR 2035875840,2035941375,CN @@ -26067,17 +49536,16 @@ 2036006912,2036072447,AU 2036072448,2036334591,JP 2036334592,2036465663,PH -2036465664,2036531199,NZ -2036531200,2036596735,AU +2036465664,2036596735,NZ 2036596736,2036598783,ID 2036598784,2036600831,JP 2036600832,2036604927,ID 2036604928,2036609023,SG 2036609024,2036611071,AF -2036611072,2036613119,AU 2036613120,2036629503,KR 2036629504,2036662271,CN -2036662272,2036695039,AU +2036662272,2036678655,AU +2036678656,2036695039,JP 2036695040,2036697087,ID 2036697088,2036699135,AU 2036699136,2036703231,IN @@ -26103,7 +49571,8 @@ 2043183104,2043199487,JP 2043199488,2043201535,BD 2043201536,2043203583,JP -2043203584,2043215871,AU +2043203584,2043205631,AU +2043207680,2043211775,AU 2043215872,2043281407,CN 2043281408,2043412479,HK 2043412480,2043674623,CN @@ -26139,31 +49608,29 @@ 2050129920,2050162687,IN 2050162688,2050228223,CN 2050228224,2050490367,PH -2050490368,2050621439,NZ -2050621440,2051014655,AU +2050490368,2051014655,NZ 2051014656,2053242879,CN 2053242880,2053308415,IN 2053308416,2053324799,TW 2053324800,2053332991,AU 2053332992,2053335039,BD 2053335040,2053337087,JP -2053337088,2053341183,AU +2053337088,2053340159,AU +2053340160,2053341183,IN 2053341184,2053373951,KR 2053373952,2053378047,AU 2053378048,2053380095,JP -2053380096,2053382143,AU 2053382144,2053390335,KR 2053390336,2053406719,TW 2053406720,2053439487,MO 2053439488,2053505023,KR 2053505024,2053509119,CN -2053509120,2053513215,AU +2053509120,2053511167,AU 2053513216,2053515263,BD -2053515264,2053517311,AU 2053517312,2053519359,ID 2053519360,2053521407,BD 2053521408,2053529599,CN -2053529600,2053537791,AU +2053529600,2053533695,AU 2053537792,2053636095,JP 2053636096,2054160383,AU 2054160384,2054422527,CN @@ -26180,10 +49647,12 @@ 2055237632,2055239679,JP 2055239680,2055241727,VU 2055241728,2055274495,KR -2055274496,2055323647,AU +2055274496,2055290879,AU +2055290880,2055299071,PK +2055299072,2055307263,ID +2055307264,2055315455,AU 2055323648,2055327743,ID 2055327744,2055329791,KR -2055329792,2055331839,AU 2055331840,2055335935,JP 2055335936,2055340031,KR 2055340032,2055733247,JP @@ -26200,28 +49669,43 @@ 2056519680,2056781823,AU 2056781824,2056794111,JP 2056794112,2056796159,BD -2056796160,2056798207,AU 2056798208,2056806399,JP -2056806400,2056814591,AU 2056814592,2056815167,JP 2056815168,2056815195,HK 2056815196,2056815215,JP -2056815216,2056815327,HK -2056815328,2056815335,JP -2056815336,2056815615,HK -2056815616,2056816031,JP +2056815216,2056815295,HK +2056815296,2056815335,JP +2056815336,2056815343,HK +2056815344,2056815359,JP +2056815360,2056815615,HK +2056815616,2056816031,AU 2056816032,2056816047,NZ -2056816048,2056816639,JP +2056816048,2056816095,AU +2056816096,2056816639,JP 2056816640,2056816815,SG 2056816816,2056816831,JP 2056816832,2056816895,SG 2056816896,2056817151,JP -2056817152,2056817407,HK -2056817408,2056818223,JP +2056817152,2056817399,HK +2056817400,2056817407,JP +2056817408,2056817599,HK +2056817600,2056818223,JP 2056818224,2056818239,SG 2056818240,2056818303,JP 2056818304,2056818559,SG -2056818560,2056826623,JP +2056818560,2056819711,JP +2056819712,2056819759,AU +2056819760,2056819775,JP +2056819776,2056819791,AU +2056819792,2056819807,JP +2056819808,2056819839,AU +2056819840,2056820223,JP +2056820224,2056820279,HK +2056820280,2056820287,JP +2056820288,2056820319,HK +2056820320,2056820351,JP +2056820352,2056820479,HK +2056820480,2056826623,JP 2056826624,2056826879,HK 2056826880,2056827935,JP 2056827936,2056827965,HK @@ -26232,8 +49716,7 @@ 2056847360,2056912895,KR 2056912896,2057043967,TH 2057043968,2057306111,CN -2057306112,2058354687,IN -2058354688,2059403263,AU +2057306112,2059403263,IN 2059403264,2059665407,CN 2059665408,2059796479,JP 2059796480,2059862015,CN @@ -26250,17 +49733,17 @@ 2059960320,2059964415,AU 2059964416,2059966463,ID 2059966464,2059968511,TW -2059968512,2059976703,AU +2059968512,2059972607,AU 2059976704,2059995135,JP 2059995136,2059997183,VN 2059997184,2060001279,MN 2060001280,2060005375,HK -2060005376,2060025855,AU +2060009472,2060025855,AU 2060025856,2060058623,TW -2060058624,2060062719,AU 2060062720,2060066815,JP 2060066816,2060075007,KR -2060075008,2060091391,AU +2060075008,2060079103,AU +2060083200,2060091391,PH 2060091392,2060189695,KR 2060189696,2060451839,CN 2060451840,2061500415,JP @@ -26270,10 +49753,9 @@ 2063081472,2063085567,BD 2063085568,2063089663,CN 2063089664,2063097855,JP -2063097856,2063106047,AU -2063106048,2063107355,SG -2063107356,2063107359,JP -2063107360,2063107423,SG +2063106048,2063106559,SG +2063106560,2063106815,JP +2063106816,2063107423,SG 2063107424,2063107455,JP 2063107456,2063107575,SG 2063107576,2063107583,JP @@ -26281,20 +49763,33 @@ 2063107616,2063108095,JP 2063108096,2063109119,HK 2063109120,2063109375,JP -2063109376,2063109503,HK -2063109504,2063114239,JP +2063109376,2063109567,HK +2063109568,2063109631,JP +2063109632,2063109759,HK +2063109760,2063111167,JP +2063111168,2063111712,AU +2063111713,2063111743,JP +2063111744,2063111799,AU +2063111800,2063112191,JP +2063112192,2063113239,AU +2063113240,2063113247,JP +2063113248,2063113279,AU +2063113280,2063113343,JP +2063113344,2063113727,AU +2063113728,2063114239,JP 2063114240,2063114327,IN -2063114328,2063122431,JP -2063122432,2063138815,AU +2063114328,2063116287,JP +2063116288,2063116319,SG +2063116320,2063122431,JP 2063138816,2063335423,JP -2063335424,2063351807,AU +2063335424,2063341567,AU +2063341568,2063351807,AP 2063351808,2063368191,KR -2063368192,2063370239,AU +2063368192,2063370239,AP 2063370240,2063372287,JP -2063372288,2063376383,AU +2063372288,2063374335,AP 2063376384,2063380479,TW 2063380480,2063382527,KH -2063382528,2063384575,AU 2063384576,2063392767,KR 2063392768,2063400959,IN 2063400960,2063466495,JP @@ -26306,17 +49801,14 @@ 2063550464,2063552511,IN 2063552512,2063556607,TW 2063556608,2063564799,MY -2063564800,2063581183,JP -2063581184,2063597567,AU +2063564800,2063597567,JP 2063597568,2063601663,KR -2063601664,2063605759,AU 2063605760,2063613951,TW -2063613952,2063622143,JP -2063622144,2063630335,AU +2063613952,2063630335,JP 2063630336,2063646719,CN 2063646720,2063663103,TW 2063663104,2063695871,JP -2063695872,2063859711,AU +2063728640,2063859711,AU 2063859712,2064646143,CN 2064646144,2065694719,VN 2065694720,2066743295,KR @@ -26327,9 +49819,11 @@ 2066874368,2066882559,JP 2066882560,2066890751,TW 2066890752,2066907135,PF -2066907136,2066923519,AU +2066907136,2066915327,AU +2066915328,2066923519,IN 2066923520,2066939903,JP -2066939904,2067005439,AU +2066939904,2066972671,AU +2066972672,2067005439,TW 2067005440,2070052863,CN 2070052864,2070056959,AU 2070056960,2070061055,JP @@ -26340,10 +49834,12 @@ 2070118400,2070159359,CN 2070159360,2070167551,AU 2070167552,2070183935,NZ -2070183936,2070200319,AU +2070183936,2070192127,AU 2070200320,2070208511,JP 2070208512,2070209023,MY -2070209024,2070210559,SG +2070209024,2070209535,SG +2070209536,2070210047,AU +2070210048,2070210559,SG 2070210560,2070210815,CN 2070210816,2070211071,SG 2070211072,2070211327,IN @@ -26353,18 +49849,17 @@ 2070216704,2070282239,CN 2070282240,2070347775,AU 2070347776,2070380543,CN -2070380544,2070396927,JP -2070396928,2070405119,AU -2070405120,2070409215,JP -2070409216,2070413311,AU -2070413312,2070677503,JP +2070380544,2070677503,JP 2070677504,2070679551,ID 2070679552,2070683647,KR 2070683648,2070691839,IN -2070691840,2070708223,AU +2070691840,2070700031,AU +2070700032,2070702079,ID +2070702080,2070703103,AU +2070703104,2070704127,HK +2070704128,2070708223,PH 2070708224,2070712319,CN 2070712320,2070714367,NZ -2070714368,2070716415,AU 2070716416,2070724607,KR 2070724608,2070726655,JP 2070726656,2070728703,IN @@ -26380,7 +49875,7 @@ 2072510464,2072514559,HK 2072514560,2072516607,IN 2072516608,2072518655,BD -2072518656,2072526847,AU +2072518656,2072522751,AU 2072526848,2072528895,SG 2072528896,2072530943,PH 2072530944,2072535039,CN @@ -26391,7 +49886,8 @@ 2073034752,2075131903,CN 2075131904,2075140095,MV 2075140096,2075144191,IN -2075144192,2075148287,AU +2075144192,2075146239,JP +2075146240,2075147263,BD 2075148288,2075150335,PH 2075150336,2075152383,WS 2075152384,2075156479,CN @@ -26403,8 +49899,7 @@ 2075197440,2076180479,CN 2076180480,2076442623,TW 2076442624,2076573695,CN -2076573696,2076606463,JP -2076606464,2076639231,AU +2076573696,2076639231,JP 2076639232,2076671999,KR 2076672000,2076704767,CN 2076704768,2076712959,BD @@ -26421,14 +49916,12 @@ 2078539776,2078670847,KR 2078670848,2078736383,JP 2078736384,2078769151,LK -2078769152,2078793727,ID -2078793728,2078801919,AU +2078769152,2078801919,ID 2078801920,2079064063,CN 2079064064,2079326207,IN 2079326208,2079457279,TW 2079457280,2079490047,CN 2079490048,2079506431,TH -2079506432,2079508479,AU 2079508480,2079510527,PH 2079510528,2079514623,JP 2079514624,2079516671,HK @@ -26444,20 +49937,25 @@ 2080178176,2080243711,CN 2080243712,2080260095,JP 2080260096,2080268287,KR -2080268288,2080276479,AU +2080268288,2080270335,AP 2080276480,2080309247,KR 2080309248,2080325631,NZ -2080325632,2080374783,AU +2080325632,2080342015,HK +2080342016,2080360447,JP +2080360448,2080362495,ID +2080362496,2080366591,AU +2080366592,2080368639,TW +2080368640,2080372735,JP +2080372736,2080374783,IN 2080374784,2080636927,KR 2080636928,2080702463,IN 2080702464,2080767999,KR 2080768000,2080776191,TW -2080776192,2080784383,AU +2080776192,2080784383,AP 2080784384,2080800767,CN 2080800768,2080817151,PH 2080817152,2080825343,NZ 2080825344,2080829439,BD -2080829440,2080833535,AU 2080833536,2080899071,IN 2080899072,2081226751,TW 2081226752,2081292287,MY @@ -26475,7 +49973,10 @@ 2082406400,2082471935,CN 2082471936,2083024895,JP 2083024896,2083045375,CN -2083045376,2083061759,AU +2083045376,2083053567,AU +2083053568,2083057663,TH +2083057664,2083058687,AU +2083059712,2083061759,ID 2083061760,2083110911,JP 2083110912,2083127295,NP 2083127296,2083192831,CN @@ -26486,17 +49987,13 @@ 2083471360,2083487743,JP 2083487744,2083504127,IN 2083504128,2083520511,JP -2083520512,2083734583,KR -2083734584,2083734591,FR -2083734592,2084569087,KR +2083520512,2084569087,KR 2084569088,2084732927,CN 2084732928,2084741119,SG 2084741120,2084743167,ID -2084743168,2084745215,AU +2084743168,2084745215,JP 2084745216,2084749311,KR -2084749312,2084753407,JP -2084753408,2084757503,AU -2084757504,2084765695,JP +2084749312,2084765695,JP 2084765696,2085617663,CN 2085617664,2085683199,KR 2085683200,2085748735,ID @@ -26506,7 +50003,7 @@ 2086141952,2086666239,CN 2086666240,2087190527,JP 2087190528,2087452671,PH -2087452672,2087454719,AU +2087453696,2087454719,KH 2087454720,2087456767,CN 2087456768,2087458815,BD 2087458816,2087460863,FJ @@ -26514,22 +50011,27 @@ 2087462912,2087464959,CN 2087464960,2087467007,KH 2087467008,2087469055,JP -2087469056,2087472639,AU +2087469056,2087472639,AP 2087472640,2087473151,SG 2087473152,2087474175,HK -2087474176,2087475711,AU +2087474176,2087475711,AP 2087475712,2087476223,JP 2087476224,2087477247,HK -2087477248,2087481343,AU +2087477248,2087478271,AU +2087478272,2087481343,AP 2087481344,2087485439,HK 2087485440,2087501823,TW 2087501824,2087518207,JP -2087518208,2087520255,AU +2087518208,2087519231,TH +2087519232,2087520255,SG 2087520256,2087522303,FM 2087522304,2087524351,BD 2087524352,2087526399,TH 2087526400,2087534591,PK -2087534592,2087546879,AU +2087534592,2087542783,AU +2087542784,2087544831,AP +2087544832,2087545855,BD +2087545856,2087546879,JP 2087546880,2087550975,TW 2087550976,2087649279,JP 2087649280,2087714815,KR @@ -26542,7 +50044,14 @@ 2089943040,2089959423,KR 2089959424,2090041343,JP 2090041344,2090074111,CN -2090074112,2090401791,AU +2090074112,2090237951,AU +2090237952,2090239999,TW +2090240000,2090240255,IN +2090241024,2090242047,MY +2090242048,2090246143,JP +2090246144,2090250239,NZ +2090250240,2090270719,JP +2090270720,2090336255,CN 2090401792,2090418175,ID 2090418176,2090434559,IN 2090434560,2090467327,KR @@ -26550,17 +50059,18 @@ 2090565632,2090582015,TW 2090582016,2090590207,SG 2090590208,2090594303,NZ -2090594304,2090598399,AU 2090598400,2090663935,CN 2090663936,2090680319,AU 2090680320,2090696703,NZ 2090696704,2090729471,TH -2090729472,2090737663,AU +2090729472,2090733567,VN +2090733568,2090736639,AU +2090736640,2090737663,IN 2090737664,2090745855,PH 2090745856,2090762239,MN 2090762240,2090778623,ID 2090778624,2090786815,HK -2090786816,2090795007,MY +2090786816,2090795007,SG 2090795008,2090860543,JP 2090860544,2091384831,CN 2091384832,2091646975,AU @@ -26580,8 +50090,7 @@ 2093318144,2093342719,KR 2093342720,2093350911,MY 2093350912,2093383679,KR -2093383680,2093400063,NZ -2093400064,2093416447,AU +2093383680,2093416447,NZ 2093416448,2093432831,KR 2093432832,2093445119,TW 2093445120,2093449215,SG @@ -26597,7 +50106,6 @@ 2094759936,2094792703,JP 2094792704,2096152575,CN 2096152576,2096160767,PG -2096160768,2096168959,AU 2096168960,2096234495,JP 2096234496,2096300031,CN 2096300032,2096332799,KR @@ -26611,7 +50119,6 @@ 2096611328,2096627711,IN 2096627712,2096660479,CN 2096660480,2096664575,NZ -2096664576,2096668671,AU 2096668672,2096676863,KH 2096676864,2096693247,HK 2096693248,2096889855,CN @@ -26645,13 +50152,11 @@ 2101149696,2101182463,KR 2101182464,2101231615,CN 2101231616,2101239807,AU -2101239808,2101270527,IN -2101270528,2101272575,AU +2101239808,2101272575,IN 2101272576,2101276671,TW 2101276672,2101280767,JP 2101280768,2101288959,AU 2101288960,2101293055,JP -2101293056,2101297151,AU 2101297152,2101313535,IN 2101313536,2101346303,AU 2101346304,2103640063,CN @@ -26672,7 +50177,7 @@ 2110816256,2110832639,ID 2110832640,2110865407,KR 2110865408,2110881791,PK -2110881792,2110914559,AU +2110881792,2110898175,AU 2110914560,2111045631,CN 2111045632,2111078399,PH 2111078400,2111111167,VN @@ -26697,79 +50202,86 @@ 2112487424,2112618495,VN 2112618496,2112880639,NZ 2112880640,2113683455,KR -2113683456,2113683487,AU +2113683456,2113683487,AP 2113683488,2113683519,TW -2113683520,2113683647,PH -2113683648,2113683679,AU +2113683520,2113683583,PH +2113683584,2113683615,AP +2113683616,2113683647,PH +2113683648,2113683679,AP 2113683680,2113683743,TW -2113683744,2113683775,AU -2113683776,2113683967,PH -2113683968,2113684159,AU +2113683744,2113683775,AP +2113683776,2113683839,PH +2113683840,2113684159,AP 2113684160,2113684175,TW 2113684176,2113684255,PH 2113684256,2113684271,TW -2113684272,2113684287,AU +2113684272,2113684287,AP 2113684288,2113684431,PH 2113684432,2113684439,TW -2113684440,2113684479,PH -2113684480,2113684543,AU +2113684440,2113684447,PH +2113684448,2113684543,AP 2113684544,2113684735,PH 2113684736,2113684991,TW 2113684992,2113685007,PH -2113685008,2113685023,AU +2113685008,2113685023,AP 2113685024,2113685047,PH -2113685048,2113685119,AU -2113685120,2113685231,PH +2113685048,2113685119,AP +2113685120,2113685215,PH +2113685216,2113685223,AP +2113685224,2113685231,PH 2113685232,2113685247,TW -2113685248,2113685407,AU +2113685248,2113685407,AP 2113685408,2113686015,PH -2113686016,2113686047,AU -2113686048,2113686079,PH +2113686016,2113686079,AP 2113686080,2113686207,TW -2113686208,2113686527,AU +2113686208,2113686527,AP 2113686528,2113687039,TW 2113687040,2113687551,JP -2113687552,2113688319,AU +2113687552,2113688319,AP 2113688320,2113689087,PH -2113689088,2113689343,AU +2113689088,2113689343,AP 2113689344,2113689599,HK 2113689600,2113690111,JP 2113690112,2113690367,PH -2113690368,2113691903,AU -2113691904,2113692031,PH -2113692032,2113692159,AU +2113690368,2113690623,AP +2113690624,2113691647,AU +2113691648,2113692159,AP 2113692160,2113692415,PH -2113692416,2113693695,AU -2113693696,2113693951,HK -2113693952,2113694207,AU +2113692416,2113693183,AP +2113693184,2113693663,HK +2113693664,2113694207,AP 2113694208,2113694463,JP 2113694464,2113694719,HK -2113694720,2113694975,AU +2113694720,2113694975,AP 2113694976,2113695231,PH -2113695232,2113699839,AU +2113695232,2113699839,AP 2113699840,2113716223,JP -2113716224,2113724927,AU +2113716224,2113724927,AP 2113724928,2113725183,IN -2113725184,2113728511,AU +2113725184,2113728511,AP 2113728512,2113732607,JP 2113732608,2113765375,AU 2113765376,2113798143,HK -2113798144,2113830911,AU +2113798144,2113811455,AU +2113812480,2113813503,JP +2113813504,2113830911,AU 2113830912,2113863679,CN 2113863680,2113929215,AU 2113929216,2130706431,JP 2147483648,2147942399,US 2147942400,2148007935,DE -2148007936,2148532223,US +2148007936,2148220515,US +2148220516,2148220535,AU +2148220536,2148229151,US +2148229152,2148229183,CA +2148229184,2148532223,US 2148532224,2148597759,GB 2148597760,2150039551,US 2150039552,2150105087,NO 2150105088,2150236159,GB 2150236160,2150301695,US 2150301696,2150367231,CA -2150367232,2150432767,US -2150498304,2151743487,US -2151809024,2151874559,US +2150367232,2151743487,US 2152726528,2153119743,US 2153119744,2153250815,GB 2153250816,2153578495,US @@ -26778,8 +50290,7 @@ 2153906176,2153971711,GB 2153971712,2154037247,US 2154037248,2154102783,CA -2154102784,2155610111,US -2155675648,2156003327,US +2154102784,2156003327,US 2156003328,2156134399,AT 2156134400,2156265471,US 2156265472,2156331007,KR @@ -26800,22 +50311,26 @@ 2160525312,2160590847,GB 2160590848,2160656383,US 2160656384,2160721919,FR -2160721920,2160852991,US -2160918528,2161508351,US +2160721920,2161508351,US 2161508352,2161573887,FI 2161573888,2162687999,US 2162688000,2162753535,GB 2162753536,2162819071,CA 2162884608,2163212287,US 2163212288,2163277823,GB -2163277824,2163408895,US +2163277824,2163288063,US +2163288064,2163290111,A1 +2163290112,2163300351,US +2163300352,2163300607,A1 +2163300608,2163304447,US +2163304448,2163305983,A1 +2163305984,2163408895,US 2163408896,2163474431,GB 2163474432,2163605503,US 2163605504,2163671039,CH 2163671040,2163867647,US 2163867648,2163933183,AU -2163933184,2164260863,US -2164326400,2164981759,US +2163933184,2164981759,US 2164981760,2165112831,GB 2165112832,2165178367,DE 2165178368,2165309439,US @@ -26830,17 +50345,13 @@ 2166292480,2166358015,GB 2166358016,2166571007,US 2166571008,2166575103,GB -2166575104,2167209983,US -2167275520,2167930879,US -2167996416,2168193023,US +2166575104,2168193023,US 2168193024,2168258559,JP 2168258560,2168651775,US 2168651776,2168717311,GB 2168717312,2168782847,US 2168782848,2168913919,DE -2168913920,2169044991,US -2169044992,2169110527,CR -2169110528,2169372671,US +2168913920,2169372671,US 2169372672,2169438207,AU 2169438208,2170028031,US 2170028032,2170093567,FR @@ -26857,8 +50368,7 @@ 2170945536,2171011071,FR 2171011072,2171076607,DE 2171076608,2171142143,FR -2171142144,2172256255,US -2172321792,2172452863,US +2171142144,2172452863,US 2172452864,2172518399,NL 2172518400,2172583935,US 2172583936,2172649471,AU @@ -26909,14 +50419,13 @@ 2180579328,2180644863,JP 2180644864,2180907007,US 2180907008,2180972543,KR -2180972544,2181038079,US -2181103616,2181824511,US +2180972544,2181824511,US 2181824512,2181890047,CA 2181890048,2182021119,US 2182021120,2182086655,CA 2182086656,2182610943,US 2182610944,2182676479,GB -2182676480,2182873087,US +2182742016,2182873087,US 2182873088,2182938623,SE 2182938624,2183135231,US 2183135232,2183200767,GB @@ -26924,8 +50433,7 @@ 2183266304,2183331839,JP 2183331840,2183462911,US 2183462912,2183528447,NL -2183528448,2183856127,US -2183921664,2184577023,US +2183528448,2184577023,US 2184577024,2184642559,JP 2184642560,2184708095,US 2184708096,2184773631,AU @@ -26955,7 +50463,27 @@ 2186870784,2186936319,NL 2186936320,2187067391,US 2187067392,2187132927,CH -2187132928,2187263999,US +2187132928,2187221887,US +2187221888,2187222015,A1 +2187222016,2187225471,US +2187225472,2187225599,A1 +2187225600,2187225823,US +2187225824,2187225855,A1 +2187225856,2187225983,US +2187225984,2187226111,A1 +2187226112,2187229471,US +2187229472,2187229479,A1 +2187229480,2187229607,US +2187229608,2187229615,A1 +2187229616,2187229687,US +2187229688,2187229695,A1 +2187229696,2187230111,US +2187230112,2187230143,A1 +2187230144,2187232511,US +2187232512,2187232639,A1 +2187232640,2187232767,US +2187232768,2187233023,A1 +2187233024,2187263999,US 2187264000,2187329535,AU 2187329536,2187460607,US 2187460608,2187526143,FR @@ -27012,7 +50540,8 @@ 2193817600,2193883135,NZ 2193883136,2194014207,US 2194014208,2194079743,CH -2194079744,2194538495,US +2194079744,2194407423,US +2194472960,2194538495,US 2194538496,2194604031,ES 2194604032,2194669567,US 2194669568,2194735103,IS @@ -27033,10 +50562,9 @@ 2197225472,2197422079,US 2197422080,2197487615,CA 2197487616,2197553151,IT -2197553152,2197749759,US +2197553152,2197815295,US 2197880832,2197946367,IT -2197946368,2202533887,US -2202599424,2204172287,US +2197946368,2204172287,US 2204172288,2204237823,SE 2204237824,2204303359,US 2204303360,2204368895,DE @@ -27050,14 +50578,30 @@ 2205155328,2205286399,JP 2205286400,2205351935,IT 2205351936,2205483007,SE -2205483008,2205516031,CH +2205483008,2205515775,CH 2205548544,2206269439,US 2206269440,2206334975,CA 2206334976,2206400511,AT 2206400512,2206466047,US 2206466048,2207121407,CA 2207121408,2207449087,US -2207449088,2207711231,CA +2207449088,2207647487,CA +2207647488,2207647743,US +2207647744,2207648511,CA +2207648512,2207649791,US +2207649792,2207653631,CA +2207653632,2207653887,US +2207653888,2207659775,CA +2207659776,2207660031,US +2207660032,2207661567,CA +2207661568,2207661823,US +2207661824,2207666175,CA +2207666176,2207667199,US +2207667200,2207678975,CA +2207678976,2207679487,US +2207679488,2207694335,CA +2207694336,2207694591,US +2207694592,2207711231,CA 2207711232,2207776767,US 2207776768,2207842303,CH 2207842304,2207907839,US @@ -27066,9 +50610,9 @@ 2208038912,2208235519,US 2208235520,2208301055,DE 2208301056,2208366591,FI -2208366592,2208432127,US 2208432128,2208563199,CA -2208563200,2208759807,DK +2208563200,2208694271,DK +2208694272,2208759807,EU 2208759808,2208890879,US 2208890880,2208956415,DE 2208956416,2209021951,AU @@ -27077,6 +50621,7 @@ 2209153024,2209218559,DE 2209218560,2209284095,NL 2209284096,2209349631,IT +2209349632,2209415167,US 2209415168,2209480703,FI 2209480704,2209546239,MX 2209546240,2209611775,US @@ -27126,12 +50671,22 @@ 2214068224,2214133759,JP 2214133760,2214264831,US 2214264832,2214330367,GB -2214330368,2214395903,US -2214395904,2214461439,CA +2214330368,2214396159,US +2214396160,2214396415,CA +2214396416,2214396671,US +2214396672,2214396927,CA +2214396928,2214397183,US +2214397184,2214397695,CA +2214397696,2214397951,US +2214397952,2214398207,CA +2214398208,2214398975,US +2214398976,2214400767,CA +2214400768,2214401279,US +2214401280,2214408191,CA +2214408192,2214411519,US +2214411520,2214461439,CA 2214461440,2214526975,FR -2214592512,2215313407,US -2215313408,2215378943,GR -2215378944,2218786815,US +2214592512,2218786815,US 2218786816,2219769855,IL 2219769856,2224160767,US 2224160768,2224226303,GB @@ -27158,8 +50713,7 @@ 2226716672,2226782207,GB 2226782208,2226847743,AU 2226847744,2226913279,DE -2226913280,2227109887,US -2227175424,2227372031,US +2226913280,2227372031,US 2227372032,2227437567,DE 2227437568,2227503103,SE 2227503104,2227634175,US @@ -27187,15 +50741,17 @@ 2231173120,2231238655,US 2231238656,2231304191,MX 2231369728,2248146943,JP -2248212480,2248343551,DE +2248146944,2248409087,DE 2248409088,2248605695,US 2248605696,2248671231,AU -2248671232,2249326591,US +2248671232,2249261055,US 2249326592,2249392127,AU 2249457664,2249523199,US 2249523200,2249588735,CH 2249588736,2249654271,CA -2249654272,2249785343,US +2249654272,2249781247,US +2249781248,2249781255,FR +2249781256,2249785343,US 2249785344,2249850879,SE 2249850880,2249916415,US 2249916416,2249981951,NL @@ -27259,75 +50815,85 @@ 2258568192,2258568447,HK 2258568448,2258583551,US 2258583552,2258591743,GB -2258591744,2258591839,AU +2258591744,2258591807,HK +2258591808,2258591839,AU 2258591840,2258591847,TW 2258591848,2258591855,JP 2258591856,2258591935,TW 2258591936,2258591967,HK -2258591968,2258592255,AU +2258591968,2258591999,AU +2258592000,2258592255,HK 2258592256,2258592383,JP -2258592384,2258592439,AU +2258592384,2258592439,HK 2258592440,2258592447,JP 2258592448,2258592479,IN -2258592480,2258592495,AU +2258592480,2258592495,HK 2258592496,2258592511,JP -2258592512,2258593023,AU +2258592512,2258592767,AU +2258592768,2258593023,HK 2258593024,2258593151,SG -2258593152,2258594303,AU +2258593152,2258593535,HK +2258593536,2258594047,AU +2258594048,2258594303,HK 2258594304,2258594559,BD -2258594560,2258594623,AU -2258594624,2258594639,HK -2258594640,2258594655,AU -2258594656,2258594687,HK -2258594688,2258594831,AU +2258594560,2258594815,HK +2258594816,2258594831,AU 2258594832,2258594839,JP 2258594840,2258594847,AU 2258594848,2258594879,JP -2258594880,2258594959,AU +2258594880,2258594959,HK 2258594960,2258594967,JP 2258594968,2258594975,AU 2258594976,2258594991,JP -2258594992,2258595007,AU +2258594992,2258595007,HK 2258595008,2258595023,TW 2258595024,2258595031,JP -2258595032,2258595135,AU +2258595032,2258595135,HK 2258595136,2258595167,SG -2258595168,2258595231,AU +2258595168,2258595199,AU +2258595200,2258595215,HK +2258595216,2258595231,AU 2258595232,2258595263,TW 2258595264,2258595295,AU 2258595296,2258595327,SG 2258595328,2258595335,KR 2258595336,2258595343,TW -2258595344,2258595351,AU +2258595344,2258595351,HK 2258595352,2258595359,JP -2258595360,2258595383,AU +2258595360,2258595383,HK 2258595384,2258595391,KR -2258595392,2258595463,AU +2258595392,2258595423,HK +2258595424,2258595455,AU +2258595456,2258595463,HK 2258595464,2258595471,TW -2258595472,2258595495,AU -2258595496,2258595503,HK -2258595504,2258595551,AU +2258595472,2258595479,HK +2258595480,2258595495,AU +2258595496,2258595519,HK +2258595520,2258595551,AU 2258595552,2258595567,JP 2258595568,2258595583,AU 2258595584,2258595591,TW -2258595592,2258595603,AU +2258595592,2258595599,HK +2258595600,2258595603,AU 2258595604,2258595607,JP -2258595608,2258595639,AU +2258595608,2258595631,HK +2258595632,2258595639,AU 2258595640,2258595643,JP 2258595644,2258595655,AU 2258595656,2258595663,IN 2258595664,2258595711,AU 2258595712,2258595775,HK 2258595776,2258595839,SG -2258595840,2258596079,AU +2258595840,2258595967,HK +2258595968,2258595983,AU +2258595984,2258595999,HK +2258596000,2258596015,AU +2258596016,2258596079,HK 2258596080,2258596087,JP -2258596088,2258596863,AU -2258596864,2258596903,HK -2258596904,2258596927,AU -2258596928,2258596991,HK -2258596992,2258597071,AU +2258596088,2258597071,HK 2258597072,2258597087,TW -2258597088,2258597895,AU +2258597088,2258597119,AU +2258597120,2258597895,HK 2258597896,2258597903,NZ 2258597904,2258597927,AU 2258597928,2258597935,JP @@ -27335,72 +50901,117 @@ 2258597952,2258597983,NZ 2258597984,2258597999,JP 2258598000,2258598015,TW -2258598016,2258598143,AU +2258598016,2258598143,HK 2258598144,2258598239,KR 2258598240,2258598255,AU 2258598256,2258598287,KR 2258598288,2258598319,NZ 2258598320,2258598335,JP 2258598336,2258598351,TW -2258598352,2258598519,AU +2258598352,2258598399,AU +2258598400,2258598431,HK +2258598432,2258598447,AU +2258598448,2258598495,HK +2258598496,2258598519,AU 2258598520,2258598527,NZ 2258598528,2258598567,JP -2258598568,2258598591,AU +2258598568,2258598583,AU +2258598584,2258598591,HK 2258598592,2258598623,TW -2258598624,2258598639,AU +2258598624,2258598639,HK 2258598640,2258598647,JP 2258598648,2258598655,KR -2258598656,2258600799,AU +2258598656,2258600737,HK +2258600738,2258600741,AU +2258600742,2258600799,HK 2258600800,2258600831,KR -2258600832,2258600959,AU +2258600832,2258600855,HK +2258600856,2258600859,AU +2258600860,2258600959,HK 2258600960,2258601087,SG -2258601088,2258601199,AU +2258601088,2258601151,AU +2258601152,2258601199,HK 2258601200,2258601207,JP -2258601208,2258601471,AU +2258601208,2258601471,HK 2258601472,2258601983,JP -2258601984,2258602495,AU +2258601984,2258602495,HK 2258602496,2258602751,VN -2258602752,2258603263,AU +2258602752,2258603263,HK 2258603264,2258603279,IN -2258603280,2258603679,AU +2258603280,2258603391,HK +2258603392,2258603459,AU +2258603460,2258603519,HK +2258603520,2258603551,AU +2258603552,2258603591,HK +2258603592,2258603599,AU +2258603600,2258603647,HK +2258603648,2258603679,AU 2258603680,2258603711,IN -2258603712,2258603727,AU +2258603712,2258603727,HK 2258603728,2258603735,SG -2258603736,2258603743,AU +2258603736,2258603743,HK 2258603744,2258603751,TW -2258603752,2258603775,AU +2258603752,2258603775,HK 2258603776,2258604031,MO 2258604032,2258604543,AU 2258604544,2258604575,IN 2258604576,2258604591,SG 2258604592,2258604607,IN 2258604608,2258604639,SG -2258604640,2258604671,AU +2258604640,2258604671,HK 2258604672,2258604735,SG 2258604736,2258604799,AU 2258604800,2258605055,TW -2258605056,2258605567,AU +2258605056,2258605567,HK 2258605568,2258605631,SG -2258605632,2258605967,AU +2258605632,2258605695,AU +2258605696,2258605823,HK +2258605824,2258605967,AU 2258605968,2258605991,NZ 2258605992,2258606031,AU 2258606032,2258606035,NZ -2258606036,2258606591,AU +2258606036,2258606463,HK +2258606464,2258606471,JP +2258606472,2258606591,HK 2258606592,2258606607,JP -2258606608,2258606687,AU +2258606608,2258606655,HK +2258606656,2258606687,AU 2258606688,2258606703,JP -2258606704,2258607343,AU +2258606704,2258606847,HK +2258606848,2258606879,AU +2258606880,2258606911,HK +2258606912,2258606959,AU +2258606960,2258606963,HK +2258606964,2258607071,AU +2258607072,2258607103,HK +2258607104,2258607231,AU +2258607232,2258607247,HK +2258607248,2258607263,AU +2258607264,2258607271,HK +2258607272,2258607295,AU +2258607296,2258607335,HK +2258607336,2258607343,AU 2258607344,2258607351,SG -2258607352,2258609487,AU +2258607352,2258607487,AU +2258607488,2258607519,HK +2258607520,2258607535,AU +2258607536,2258609023,HK +2258609024,2258609087,AU +2258609088,2258609439,HK +2258609440,2258609471,AU +2258609472,2258609487,HK 2258609488,2258609503,IN -2258609504,2258609511,AU +2258609504,2258609511,HK 2258609512,2258609527,IN -2258609528,2258610303,AU +2258609528,2258610303,HK 2258610304,2258610431,IN -2258610432,2258614783,AU +2258610432,2258611455,HK +2258611456,2258611527,AU +2258611528,2258611583,HK +2258611584,2258611615,AU +2258611616,2258614783,HK 2258614784,2258614799,TW -2258614800,2258616319,AU -2258616320,2258632703,HK +2258614800,2258632703,HK 2258632704,2258698239,JP 2258698240,2259222527,US 2259222528,2259288063,DE @@ -27451,19 +51062,15 @@ 2264203264,2264268799,DE 2264268800,2264334335,FR 2264334336,2264399871,DE -2264399872,2264465407,US -2264530944,2264858623,US -2264989696,2265710591,US +2264399872,2265710591,US 2265710592,2265776127,CA -2265776128,2266169343,US -2266234880,2276786175,US +2265776128,2276786175,US 2276786176,2276851711,CA 2276851712,2277769215,US 2277769216,2277772543,GB 2277772544,2277772799,DE 2277772800,2277834751,GB -2277834752,2281701375,US -2281766912,2291204095,US +2277834752,2291204095,US 2291204096,2291269631,PR 2291269632,2291400703,CA 2291400704,2291466239,GB @@ -27497,10 +51104,13 @@ 2296512512,2296774655,US 2296774656,2296840191,DE 2296840192,2296905727,NL -2296905728,2297626623,US +2296905728,2297167871,US +2297167872,2297233407,AU +2297233408,2297298943,US +2297298944,2297364479,CH +2297364480,2297626623,US 2297626624,2297692159,DE -2297692160,2298413055,US -2298544128,2299461631,US +2297692160,2299461631,US 2299461632,2299527167,CA 2299527168,2299592703,US 2299592704,2299658239,NL @@ -27519,7 +51129,7 @@ 2302214144,2302279679,US 2302279680,2302541823,SE 2302541824,2302607359,CH -2302738432,2302935039,US +2302672896,2302935039,US 2302935040,2303000575,KR 2303000576,2303262719,US 2303262720,2303328255,GB @@ -27543,8 +51153,7 @@ 2305622016,2305687551,AU 2305687552,2305753087,US 2305753088,2305818623,AU -2305818624,2306015231,US -2306080768,2306146303,US +2305818624,2306146303,US 2306146304,2306211839,CA 2306211840,2306342911,US 2306342912,2306408447,NL @@ -27567,11 +51176,12 @@ 2308636672,2308702207,US 2308702208,2308767743,CH 2308767744,2308833279,AU +2308833280,2308898815,ZA 2308898816,2309160959,US 2309160960,2309226495,FI 2309226496,2309357567,US 2309357568,2309423103,AU -2309423104,2309685247,US +2309423104,2309750783,US 2309750784,2309816319,AU 2309816320,2309881855,US 2309881856,2309947391,NL @@ -27585,7 +51195,7 @@ 2311127040,2311192575,DE 2311192576,2311258111,FR 2311258112,2311323647,GB -2311389184,2311847935,US +2311323648,2311847935,US 2311847936,2311913471,IT 2311913472,2311979007,GB 2311979008,2312044543,US @@ -27593,12 +51203,14 @@ 2312110080,2312175615,AT 2312175616,2312437759,US 2312437760,2312503295,GB +2312503296,2312634367,ZA 2312634368,2312699903,US 2312699904,2312765439,NO 2312765440,2312830975,GB 2312830976,2312896511,AU 2312896512,2312962047,US -2312962048,2313158655,GB +2312962048,2313093119,GB +2313093120,2313158655,IE 2313158656,2313224191,NL 2313224192,2313289727,US 2313289728,2313355263,DE @@ -27641,9 +51253,7 @@ 2318401536,2318467071,BE 2318467072,2318598143,US 2318598144,2318663679,CA -2318663680,2319122431,US -2319187968,2319253503,US -2319253504,2319319039,DE +2318663680,2319319039,US 2319319040,2319384575,NO 2319384576,2319450111,FR 2319450112,2319581183,US @@ -27661,8 +51271,7 @@ 2320433152,2320564223,AU 2320564224,2320629759,CH 2320629760,2320695295,CA -2320695296,2321416191,US -2321481728,2321547263,US +2320695296,2321547263,US 2321547264,2321612799,FR 2321678336,2321743871,US 2321809408,2321874943,ES @@ -27690,8 +51299,11 @@ 2328035328,2328100863,FR 2328100864,2328231935,US 2328231936,2328297471,GB +2328297472,2328313855,EU 2328313856,2328317951,NL +2328317952,2328342527,EU 2328342528,2328342783,DE +2328342784,2328362751,EU 2328362752,2328494079,DE 2328494080,2328559615,US 2328559616,2328625151,BE @@ -27706,7 +51318,7 @@ 2329477120,2329542655,AU 2329542656,2329608191,CA 2329673728,2329739263,US -2329739264,2329804799,SE +2329739264,2329804799,CH 2329804800,2329870335,DE 2329870336,2330132479,CH 2330132480,2330198015,SE @@ -27727,11 +51339,9 @@ 2331770880,2331836415,AU 2331836416,2331901951,GB 2331901952,2331967487,US -2332098560,2332622847,DE -2332688384,2332753919,BE -2332753920,2333343743,DE -2333343744,2333999103,NL -2333999104,2334064639,DE +2332033024,2332622847,DE +2332688384,2332753919,NL +2332753920,2334064639,DE 2334064640,2334916607,US 2334916608,2334982143,AU 2334982144,2335178751,US @@ -27739,6 +51349,7 @@ 2335244288,2335309823,US 2335309824,2335375359,DE 2335375360,2335506431,US +2335506432,2335571967,ZA 2335571968,2335637503,FR 2335637504,2335768575,US 2335768576,2335834111,CA @@ -27763,13 +51374,21 @@ 2337865728,2337931263,DE 2337931264,2337996799,BE 2337996800,2338062335,GR +2338062336,2338075391,EU 2338075392,2338075647,IL +2338075648,2338084863,EU 2338084864,2338085375,IL +2338085376,2338085631,EU 2338085632,2338086143,IL +2338086144,2338087423,EU 2338087424,2338087679,IL +2338087680,2338108927,EU 2338108928,2338109951,IL +2338109952,2338115071,EU 2338115072,2338115839,IL +2338115840,2338126591,EU 2338126592,2338127615,IL +2338127616,2338127871,EU 2338127872,2338324479,US 2338324480,2338390015,SE 2338390016,2338455551,FI @@ -27823,19 +51442,22 @@ 2343632896,2343698431,US 2343698432,2343763967,NL 2343763968,2343829503,TR -2343829504,2344026111,US +2343829504,2343924735,US +2343924736,2343925759,IL +2343925760,2343934975,US +2343934976,2343935999,IL +2343936000,2344026111,US 2344091648,2344157183,GB 2344157184,2344222719,US 2344288256,2344353791,US 2344353792,2344419327,AU +2344550400,2344615935,EU 2346582016,2346647551,GB 2346647552,2346713087,TW 2346778624,2346844159,US 2347040768,2347106303,US 2347106304,2347171839,AU -2347171840,2348744703,US -2348875776,2353725439,US -2353790976,2353856511,US +2347171840,2353856511,US 2353856512,2353922047,FR 2353922048,2353987583,AT 2353987584,2354053119,AU @@ -27859,8 +51481,7 @@ 2355691520,2355757055,IT 2355757056,2355953663,US 2355953664,2357919743,TW -2357919744,2358181887,US -2358247424,2358509567,US +2357919744,2358509567,US 2358509568,2358575103,MX 2358640640,2358706175,SE 2358706176,2358771711,FI @@ -27874,7 +51495,9 @@ 2359689216,2359754751,SE 2359754752,2359820287,CA 2359820288,2359885823,AU -2359885824,2360672255,US +2359885824,2360215807,US +2360215808,2360216063,A1 +2360216064,2360672255,US 2360672256,2360737791,DE 2360737792,2360868863,US 2360868864,2360934399,CA @@ -27887,22 +51510,26 @@ 2361982976,2362114047,US 2362114048,2362179583,IE 2362179584,2362245119,GB -2362441728,2362572799,US -2362638336,2362769407,US -2362834944,2363490303,US -2363555840,2363883519,US +2362441728,2363883519,US 2363883520,2363949055,CA -2363949056,2364342271,US -2364407808,2364538879,US -2364604416,2364735487,US -2364801024,2364932095,US -2364997632,2365128703,US -2365259776,2365390847,US +2363949056,2364538879,US +2364604416,2364671487,US +2364671488,2364671743,CN +2364671744,2364675839,US +2364675840,2364676095,CA +2364676096,2364676863,US +2364676864,2364677119,GB +2364677120,2364735487,US +2364801024,2365390847,US 2365390848,2365456383,AU 2365456384,2365521919,US -2365652992,2367487999,DE -2367488000,2367553535,BA -2367553536,2371158015,DE +2365587456,2366308351,DE +2366308352,2366373887,FR +2366373888,2367487999,DE +2367488000,2367553535,SI +2367553536,2370895871,DE +2370895872,2370961407,SE +2370961408,2371158015,DE 2371158016,2371223551,RO 2371223552,2371289087,US 2371289088,2371616767,DE @@ -27915,8 +51542,7 @@ 2372075520,2372206591,DE 2372272128,2372337663,US 2372337664,2372403199,ID -2372403200,2372468735,US -2372534272,2372665343,US +2372403200,2372665343,US 2372665344,2372730879,IT 2372730880,2372796415,CA 2372796416,2372993023,US @@ -27926,7 +51552,11 @@ 2373189632,2373255167,US 2373255168,2373451775,CA 2373451776,2373517311,AU -2373517312,2374107135,US +2373517312,2373582847,US +2373582848,2373648383,CH +2373648384,2373910527,US +2373910528,2373976063,FI +2373976064,2374107135,US 2374107136,2374172671,DE 2374172672,2374238207,US 2374238208,2374303743,AU @@ -27951,12 +51581,15 @@ 2377121792,2377187327,NL 2377187328,2377252863,US 2377252864,2377318399,JP -2377318400,2378170367,US +2377318400,2377449471,US +2377449472,2377515007,FR +2377515008,2377842687,US +2377842688,2377908223,GB +2377908224,2378170367,US 2378170368,2378235903,FI 2378235904,2378301439,US 2378301440,2378366975,FR -2378366976,2378432511,US -2378498048,2378694655,US +2378366976,2378694655,US 2378694656,2378760191,DE 2378760192,2378825727,AT 2378825728,2378891263,US @@ -27972,8 +51605,7 @@ 2380595200,2380660735,JP 2380660736,2380726271,US 2380726272,2380791807,GB -2380791808,2381119487,US -2381185024,2381381631,US +2380791808,2381381631,US 2381381632,2381447167,GB 2381447168,2381512703,US 2381512704,2381578239,AU @@ -27986,23 +51618,25 @@ 2382102528,2382168063,NL 2382168064,2382233599,BE 2382233600,2382299135,US -2382430208,2383085567,CA -2383151104,2387410943,CA +2382364672,2385430319,CA +2385430320,2385430335,US +2385430336,2385430655,CA +2385430656,2385430687,US +2385430688,2386067455,CA +2386067456,2386083839,US +2386083840,2386624511,CA +2386624512,2386690047,US +2386690048,2386989055,CA +2386989056,2386989311,GB +2386989312,2387410943,CA 2387410944,2387476479,US 2387476480,2387542015,CA 2387542016,2387607551,US -2387607552,2388328447,CA -2388393984,2389245951,CA -2389311488,2389639167,CA -2389704704,2390818815,CA -2390884352,2391277567,CA -2391343104,2394947583,CA +2387607552,2394947583,CA 2394947584,2395013119,US 2395013120,2395209727,CA -2395340800,2397700095,CA -2397765632,2398748671,CA -2398945280,2399010815,CA -2399207424,2401828863,US +2395340800,2399141887,CA +2399141888,2401828863,US 2401828864,2401894399,GB 2401894400,2402222079,US 2402222080,2402287615,IE @@ -28037,11 +51671,13 @@ 2407333888,2407399423,JP 2407399424,2407464959,FR 2407464960,2407530495,US +2407530496,2407596031,ZA 2407596032,2407661567,BE 2407661568,2407727103,AT 2407727104,2408054783,US 2408054784,2408120319,JP 2408185856,2409627647,US +2409627648,2409693183,ZA 2409693184,2409758719,AT 2409758720,2409824255,US 2409824256,2409955327,DE @@ -28097,8 +51733,7 @@ 2416181248,2416246783,FI 2416246784,2416312319,US 2416312320,2416377855,AU -2416443392,2416705535,US -2416771072,2416967679,US +2416443392,2416967679,US 2416967680,2417033215,IN 2417033216,2417229823,US 2417229824,2417295359,ES @@ -28113,7 +51748,8 @@ 2418081792,2418606079,US 2418606080,2418671615,DE 2418671616,2418737151,US -2418737152,2418868223,NL +2418737152,2418802687,NL +2418802688,2418868223,EU 2418868224,2419326975,US 2419392512,2419458047,AU 2419458048,2419523583,NL @@ -28139,7 +51775,11 @@ 2421686272,2422145023,US 2422145024,2422154239,NL 2422154240,2422155263,US -2422155264,2422210559,NL +2422155264,2422161407,NL +2422161408,2422163455,GB +2422163456,2422165503,US +2422165504,2422167551,HK +2422167552,2422210559,NL 2422210560,2422276095,US 2422276096,2422341631,AU 2422341632,2422407167,GB @@ -28187,12 +51827,10 @@ 2430205952,2430271487,AU 2430271488,2432172031,US 2432172032,2432237567,BE -2432237568,2432630783,US +2432237568,2432696319,US 2432696320,2433810431,NL 2433810432,2433875967,GB -2433875968,2435071999,NL -2435072000,2435088383,US -2435088384,2436300799,NL +2433875968,2436300799,NL 2436300800,2436366335,GB 2436366336,2436759551,NL 2436759552,2436825087,GB @@ -28246,13 +51884,14 @@ 2452684800,2452750335,US 2452750336,2452815871,NL 2452815872,2452881407,JP -2452946944,2453143551,US +2452881408,2453143551,US 2453143552,2453209087,JP 2453209088,2453340159,US 2453340160,2453405695,NO 2453471232,2453536767,US 2453536768,2453602303,AU 2453602304,2453667839,US +2453667840,2453733375,ZA 2453733376,2453798911,US 2453864448,2453929983,CH 2453929984,2454061055,US @@ -28276,8 +51915,7 @@ 2454913024,2454978559,CL 2454978560,2455175167,US 2455175168,2455240703,GB -2455240704,2455371775,US -2455437312,2455830527,US +2455240704,2455830527,US 2455830528,2455896063,GB 2455896064,2456027135,US 2456027136,2456092671,IT @@ -28286,6 +51924,7 @@ 2456223744,2456289279,BE 2456289280,2456354815,NL 2456354816,2456420351,GB +2456420352,2456485887,EU 2456485888,2456551423,DE 2456551424,2456616959,AT 2456616960,2456682495,CH @@ -28297,7 +51936,7 @@ 2457141248,2457206783,JP 2457206784,2457272319,AU 2457272320,2457337855,FI -2457403392,2457599999,US +2457337856,2457599999,US 2457600000,2457665535,GR 2457665536,2458058751,US 2458058752,2458124287,CA @@ -28308,9 +51947,12 @@ 2458386432,2458451967,CH 2458451968,2458648575,US 2458648576,2458714111,DE +2458714112,2458779647,ZA 2458779648,2458910719,US 2458910720,2458976255,AU -2458976256,2459631615,US +2458976256,2458995511,US +2458995512,2458995519,PA +2458995520,2459631615,US 2459631616,2459697151,CL 2459697152,2459828223,US 2459893760,2459959295,CH @@ -28331,8 +51973,8 @@ 2461138944,2461204479,AU 2461204480,2461270015,GB 2461270016,2461401087,US -2461466624,2461597695,US -2461663232,2461794303,US +2461401088,2461466623,ZA +2461466624,2461794303,US 2461794304,2461859839,GB 2461859840,2461990911,US 2461990912,2462056447,GB @@ -28359,16 +52001,18 @@ 2464350208,2464415743,GB 2464415744,2464481279,CH 2464481280,2464546815,US +2464546816,2464743423,ZA 2464743424,2464808959,US 2464808960,2464874495,DE -2464874496,2465660927,US +2464874496,2465726463,US 2465726464,2465791999,CH 2465792000,2465857535,FR 2465857536,2465923071,US 2465988608,2466054143,US 2466054144,2466119679,SE 2466119680,2466185215,DE -2466316288,2466643967,US +2466250752,2466643967,US +2466643968,2466709503,KR 2466709504,2466775039,HU 2466775040,2466840575,HK 2466840576,2466906111,US @@ -28378,13 +52022,13 @@ 2467102720,2467233791,SE 2467233792,2468020223,US 2468020224,2468085759,GR -2468085760,2468151295,US +2468085760,2468151295,JP 2468151296,2468174847,DK 2468174848,2468175359,NO 2468175360,2468189663,DK 2468189664,2468189695,GB 2468189696,2468216831,DK -2468216832,2468282367,DE +2468216832,2468282367,EU 2468282368,2468347903,US 2468347904,2468478975,CZ 2468478976,2468937727,US @@ -28410,13 +52054,13 @@ 2471165952,2471231487,CH 2471231488,2471297023,AU 2471297024,2471362559,GB -2471362560,2471428095,CH +2471362560,2471428095,EU 2471428096,2471690239,US 2471690240,2471821311,ES 2471886848,2472083455,CH 2472083456,2472148991,GB 2472148992,2472214527,US -2472214528,2472280063,CS +2472214528,2472280063,RS 2472280064,2472345599,US 2472345600,2472411135,BE 2472411136,2472476671,FR @@ -28428,8 +52072,11 @@ 2472935424,2473000959,GR 2473000960,2473394175,US 2473394176,2473459711,AU +2473459712,2473525247,ZA 2473525248,2473656319,NO -2473656320,2474049535,US +2473656320,2473721855,US +2473721856,2473787391,GB +2473787392,2474049535,US 2474049536,2474115071,GB 2474115072,2474246143,US 2474246144,2474377215,IT @@ -28521,8 +52168,7 @@ 2488401920,2488532991,NO 2488532992,2488795135,US 2488795136,2488860671,GB -2488860672,2489647103,US -2489843712,2490236927,US +2488860672,2490236927,US 2490236928,2490302463,LU 2490302464,2490695679,US 2490695680,2490761215,CA @@ -28552,6 +52198,7 @@ 2494889984,2494955519,GB 2494955520,2495021055,AU 2495021056,2495152127,US +2495152128,2495217663,EU 2495217664,2495283199,US 2495283200,2495348735,CH 2495348736,2495807487,US @@ -28563,33 +52210,26 @@ 2496135168,2496200703,NL 2496200704,2497682431,MX 2497682432,2497683455,EC -2497683456,2498464415,MX -2498464416,2498464431,US -2498464432,2498475007,MX +2497683456,2498475007,MX 2498475008,2498476031,EC 2498476032,2499477503,MX 2499477504,2499543039,DE -2499543040,2499608575,NL -2499608576,2499674111,GB +2499543040,2499674111,GB 2499674112,2499739647,US -2499870720,2500001791,US -2500067328,2501574655,US -2501640192,2503016447,US +2499805184,2503016447,US 2503016448,2503081983,IL 2503081984,2503671807,US 2503671808,2503737343,NL -2503737344,2503868415,US -2503933952,2506293247,US +2503737344,2506293247,US 2506293248,2506358783,CA -2506358784,2508062719,US -2508128256,2508455935,US +2506358784,2508455935,US 2508455936,2508521471,IT 2508521472,2508587007,CH 2508587008,2508652543,BE 2508652544,2508718079,AU 2508718080,2508914687,US 2508914688,2508980223,IT -2509045760,2509242367,US +2508980224,2509242367,US 2509242368,2509307903,AU 2509307904,2509373439,US 2509373440,2509438975,NL @@ -28604,12 +52244,12 @@ 2510815232,2510946303,US 2510946304,2511011839,GB 2511011840,2511077375,AU -2511142912,2511339519,US +2511077376,2511339519,US 2511339520,2511405055,AU 2511405056,2512715775,GB 2512715776,2512781311,FI 2512781312,2512912383,US -2512977920,2513502207,DE +2512912384,2513502207,DE 2513502208,2513567743,NO 2513633280,2513698815,DE 2513698816,2513764351,DK @@ -28617,21 +52257,20 @@ 2514419712,2514485247,GB 2514485248,2514514431,DE 2514514432,2514514687,NL -2514514688,2515832831,DE -2515832832,2515833855,FR -2515833856,2516254719,DE +2514514688,2515599359,DE +2515599360,2515664895,EU +2515664896,2516254719,DE 2516254720,2516320255,FR 2516320256,2516451327,US 2516451328,2516516863,GB -2516647936,2523201535,JP +2516582400,2523201535,JP 2523201536,2523267071,AU 2523267072,2523529215,US 2523529216,2523594751,NO 2523594752,2523660287,AT -2523660288,2524119039,US -2524315648,2524512255,US -2524643328,2524971007,US +2523660288,2524971007,US 2524971008,2525036543,ES +2525036544,2525102079,EU 2525102080,2525233151,US 2525233152,2525298687,SE 2525298688,2525626367,US @@ -28670,8 +52309,7 @@ 2530607104,2530672639,ES 2530672640,2530803711,US 2530803712,2530869247,IT -2530869248,2531196927,US -2531262464,2531459071,US +2530869248,2531459071,US 2531459072,2531524607,SE 2531524608,2531590143,US 2531590144,2531655679,AU @@ -28687,7 +52325,7 @@ 2533031936,2533097471,BE 2533097472,2533228543,US 2533228544,2533294079,PL -2533425152,2539978751,IT +2533359616,2539978751,IT 2539978752,2540240895,US 2540240896,2540306431,FI 2540306432,2540896255,US @@ -28712,6 +52350,7 @@ 2544566272,2544631807,US 2544631808,2544697343,JP 2544697344,2544828415,US +2544828416,2544893951,EU 2544893952,2544959487,GB 2544959488,2545025023,SE 2545025024,2545090559,AU @@ -28720,14 +52359,15 @@ 2545221632,2545287167,US 2545287168,2545352703,GB 2545352704,2545418239,CH -2545418240,2545614847,US +2545418240,2545483775,NL +2545483776,2545614847,US 2545614848,2545680383,NO 2545680384,2545745919,US 2545745920,2545811455,DE 2545811456,2547187711,US 2547187712,2547318783,GB 2547318784,2547515391,US -2550202368,2554462207,US +2550136832,2554462207,US 2554462208,2554527743,HU 2554527744,2554789887,US 2554789888,2554855423,GB @@ -28758,6 +52398,7 @@ 2556690432,2556755967,US 2556755968,2557018111,HK 2557018112,2557083647,GB +2557083648,2557542399,ZA 2557542400,2557607935,US 2557607936,2557673471,GB 2557673472,2557739007,DK @@ -28777,10 +52418,10 @@ 2560032768,2560098303,US 2560098304,2560163839,BE 2560163840,2560229375,NZ -2560229376,2560360447,US -2560425984,2561015807,US -2561671168,2563244031,US -2563768320,2564947967,US +2560229376,2560644607,US +2560644608,2560644863,CA +2560644864,2561015807,US +2561671168,2564947967,US 2564947968,2565013503,SG 2565013504,2565210111,US 2566979584,2567045119,FI @@ -28794,25 +52435,33 @@ 2568093696,2568159231,US 2568159232,2568224767,PL 2568224768,2568290303,SG -2568290304,2569142271,US -2569404416,2569797631,US +2568290304,2569601023,US +2569601024,2569666559,CA +2569666560,2569797631,US 2569797632,2569863167,NO -2569863168,2569928703,CH -2569928704,2569989631,US -2569989632,2569989888,CH -2569989889,2572681215,US +2569863168,2569928703,US +2569928704,2569994239,CH +2569994240,2570125311,US +2570125312,2570190847,BE +2570190848,2572681215,US 2572681216,2572746751,SE 2572746752,2572943359,US -2572943360,2573402111,DE -2573467648,2573533183,DE +2572943360,2572944639,EU +2572944640,2572944895,DE +2572944896,2572945919,EU +2572945920,2572946175,DE +2572946176,2573008895,EU +2573008896,2573533183,DE 2573598720,2573926399,US 2573926400,2573991935,AU 2573991936,2574123007,CH 2574123008,2574188543,NO 2574188544,2574254079,NZ -2574254080,2574319615,SE +2574254080,2574315007,SE +2574315008,2574315263,NO +2574315264,2574319615,SE 2574319616,2574647295,US -2583756800,2584018943,US +2583691264,2584018943,US 2584018944,2584084479,CA 2584084480,2584215551,US 2584215552,2584281087,GB @@ -28853,14 +52502,12 @@ 2605121536,2605187071,AU 2605187072,2605252607,US 2605252608,2605318143,AT -2605318144,2606301183,US -2606366720,2606563327,US -2606628864,2607349759,US +2605318144,2607349759,US 2607349760,2607415295,CH 2607415296,2609053695,US 2609053696,2609119231,GB 2609119232,2609184767,FR -2609184768,2609250303,DE +2609184768,2609250303,EU 2609250304,2609381375,US 2609381376,2609446911,GB 2609446912,2609512447,DK @@ -28871,6 +52518,7 @@ 2609971200,2610036735,GB 2610036736,2610823167,US 2610823168,2610888703,PL +2610888704,2610954239,ZA 2610954240,2611019775,JP 2611019776,2612592639,US 2612592640,2612658175,IT @@ -28902,15 +52550,17 @@ 2615476224,2615541759,US 2615541760,2615607295,KR 2615607296,2615672831,GB +2615672832,2616262655,ZA 2616262656,2616524799,US 2616524800,2616590335,GB 2616590336,2616786943,US 2616786944,2616852479,GB 2616852480,2616918015,DE -2616918016,2617049087,US +2616983552,2617049087,US 2617049088,2617114623,IT 2617114624,2617180159,US -2617311232,2617769983,US +2617245696,2617769983,US +2617769984,2617835519,ZA 2617835520,2617901055,US 2617901056,2617966591,FI 2617966592,2618032127,CA @@ -28932,11 +52582,12 @@ 2619342848,2619473919,US 2619473920,2619539455,CA 2619539456,2619604991,ES -2619604992,2619736063,US -2619801600,2620063743,US +2619604992,2620063743,US 2620063744,2620129279,GB 2620129280,2620194815,CA -2620194816,2620391423,US +2620194816,2620315039,US +2620315040,2620315063,DE +2620315064,2620391423,US 2620391424,2620456959,GB 2620456960,2620522495,SE 2620522496,2620588031,AU @@ -28963,8 +52614,7 @@ 2623602688,2623668223,CL 2623668224,2624192511,US 2624192512,2624258047,CH -2624258048,2624585727,US -2624585728,2624716799,DE +2624258048,2624716799,US 2624716800,2624782335,NL 2624782336,2624847871,CH 2624847872,2624913407,NO @@ -28979,16 +52629,17 @@ 2626945024,2627010559,IT 2627010560,2627076095,NZ 2627076096,2627141631,NL -2627141632,2627403775,US -2634088448,2635202559,JP -2635268096,2635333631,JP +2627141632,2627469311,US +2634022912,2635399167,JP 2635399168,2635530239,US 2635530240,2635595775,FR 2635595776,2635661311,FI 2635661312,2635726847,PL 2635726848,2635792383,CH 2635792384,2635988991,IT -2635988992,2638020607,US +2635988992,2636120063,US +2636120064,2637561855,ID +2637561856,2638020607,US 2638086144,2638151679,US 2638151680,2639462399,JP 2639462400,2639593471,GB @@ -29006,8 +52657,7 @@ 2640445440,2640510975,US 2640510976,2640576511,FR 2640576512,2640642047,EC -2640642048,2641821695,JP -2641887232,2641952767,JP +2640642048,2641952767,JP 2641952768,2642018303,US 2642083840,2642149375,US 2642149376,2642214911,FI @@ -29023,8 +52673,7 @@ 2643197952,2643263487,GB 2643263488,2643460095,US 2643460096,2643525631,FI -2643525632,2643722239,US -2643787776,2644180991,US +2643525632,2644180991,US 2644180992,2644246527,AU 2644312064,2644377599,IS 2644377600,2644443135,PL @@ -29034,7 +52683,8 @@ 2644639744,2644770815,DE 2644770816,2644836351,BE 2644836352,2644967423,US -2644967424,2645098495,AT +2644967424,2645032959,AT +2645032960,2645098495,CH 2645098496,2645164031,FR 2645164032,2645229567,US 2645229568,2645295103,SE @@ -29094,11 +52744,12 @@ 2654142464,2654207999,CA 2654208000,2654339071,US 2654339072,2654404607,AU -2654404608,2654601215,US -2654666752,2654994431,US +2654404608,2654994431,US 2654994432,2655059967,LU 2655059968,2655125503,US +2655125504,2655185151,EU 2655185152,2655186944,PL +2655186945,2655256575,EU 2655256576,2655715327,US 2655715328,2655780863,PL 2655780864,2656632831,US @@ -29171,7 +52822,7 @@ 2665086976,2665152511,GB 2665152512,2665218047,US 2665218048,2665283583,CH -2665283584,2665414655,US +2665283584,2665381887,US 2665414656,2665480191,GB 2665480192,2665545727,US 2665545728,2665611263,DE @@ -29188,9 +52839,7 @@ 2667118592,2667184127,HU 2667184128,2667249663,RU 2667249664,2667315199,CL -2667315200,2667511807,US -2667642880,2667773951,US -2667839488,2667970559,US +2667315200,2667970559,US 2667970560,2668036095,CA 2668036096,2668101631,SE 2668101632,2668167167,CH @@ -29248,9 +52897,7 @@ 2673868800,2674130943,US 2674130944,2674262015,GB 2674262016,2674327551,US -2674327552,2674380799,CH -2674380800,2674381055,NL -2674381056,2674393087,CH +2674327552,2674393087,CH 2674393088,2674458623,GB 2674458624,2674589695,US 2674589696,2674655231,SE @@ -29341,12 +52988,17 @@ 2683305984,2683371519,US 2683371520,2683437055,CH 2683437056,2683568127,US -2683568128,2683699199,GB +2683568128,2683633663,GB +2683633664,2683637759,EU +2683637760,2683641855,NL +2683641856,2683645951,US +2683645952,2683650047,SG +2683650048,2683699199,EU 2683699200,2683830271,US 2683830272,2683895807,AU 2683895808,2684157951,US 2684223488,2684289023,GB -2684420096,2684616703,US +2684354560,2684616703,US 2684616704,2684682239,NZ 2684682240,2684747775,GB 2684747776,2684813311,IE @@ -29360,14 +53012,19 @@ 2686910464,2686975999,US 2686976000,2687041535,GR 2687041536,2687238143,US -2687238144,2687762431,DE +2687238144,2687299119,DE +2687299120,2687299127,US +2687299128,2687299135,CN +2687299136,2687762431,DE 2687762432,2687827967,AT 2687827968,2687893503,CH 2687893504,2688221183,DE 2688221184,2688286719,CH 2688286720,2688352255,DE -2688352256,2688420863,CH -2688420864,2688421375,DE +2688352256,2688420095,CH +2688420096,2688420351,CN +2688420352,2688420863,CH +2688420864,2688421375,SG 2688421376,2688421887,US 2688421888,2688548863,CH 2688548864,2688614399,AU @@ -29383,18 +53040,37 @@ 2689269760,2689335295,TR 2689335296,2689400831,US 2689466368,2689531903,IT -2689531904,2689597439,US +2689531904,2689535999,US +2689536000,2689536511,GB +2689536512,2689541631,US +2689541632,2689541887,GB +2689541888,2689545727,US +2689545728,2689546239,GB +2689546240,2689559807,US +2689559808,2689560063,GB +2689560064,2689566207,US +2689566208,2689566719,GB +2689566720,2689568255,US +2689568256,2689568767,GB +2689568768,2689581823,US +2689581824,2689582079,GB +2689582080,2689586687,US +2689586688,2689587199,GB +2689587200,2689593343,US +2689593344,2689593855,GB +2689593856,2689594111,US +2689594112,2689594879,GB +2689594880,2689597439,US 2689597440,2689662975,IT 2689662976,2689925119,US 2689925120,2689990655,CH -2689990656,2690187263,US -2690318336,2690383871,US +2689990656,2690383871,US 2690383872,2690449407,FR 2690449408,2690646015,US 2690646016,2690711551,SG 2690711552,2690777087,IT 2690777088,2690842623,CH -2690842624,2690908159,CS +2690842624,2690908159,RS 2690908160,2690973695,GB 2690973696,2691104767,US 2691104768,2691170303,FR @@ -29402,10 +53078,10 @@ 2691301376,2691366911,CA 2691366912,2691760127,US 2691825664,2691891199,HU -2692546560,2694316031,US -2694381568,2694447103,US +2691891200,2692546559,ZA +2692546560,2694840319,US 2696151040,2696216575,IT -2696478720,2697789439,JP +2696413184,2697789439,JP 2697789440,2697854975,US 2697854976,2697920511,AU 2697920512,2698117119,US @@ -29424,8 +53100,7 @@ 2699231232,2699296767,US 2699296768,2699362303,FR 2699362304,2699624447,US -2699624448,2700214271,JP -2700279808,2700935167,JP +2699624448,2700935167,JP 2700935168,2701066239,US 2701197312,2701262847,US 2701262848,2701328383,GB @@ -29501,7 +53176,7 @@ 2708865024,2708930559,JP 2708930560,2709127167,US 2709127168,2709192703,KR -2709192704,2709258239,BG +2709192704,2709258239,EU 2709258240,2709389311,US 2709389312,2709454847,SG 2709454848,2709716991,US @@ -29534,13 +53209,11 @@ 2714370048,2714435583,CH 2714435584,2714697727,US 2714697728,2714763263,CN -2714763264,2715025407,US -2715090944,2715287551,US +2714763264,2715287551,US 2715287552,2715353087,CA 2715353088,2716139519,US 2716139520,2716205055,SG -2716205056,2716467199,US -2716532736,2716729343,US +2716205056,2716729343,US 2716729344,2716794879,CL 2716794880,2717253631,US 2717253632,2717319167,TH @@ -29549,7 +53222,7 @@ 2717450240,2717646847,US 2717646848,2717712383,KW 2717712384,2717843455,US -2717974528,2718171135,US +2717908992,2718171135,US 2718171136,2718236671,JP 2718236672,2718629887,US 2718629888,2718695423,GB @@ -29581,7 +53254,7 @@ 2725969920,2727018495,US 2727018496,2727084031,CA 2727084032,2727346175,US -2727411712,2727608319,AU +2727346176,2727608319,AU 2734751744,2734817279,GB 2734817280,2734882815,US 2734882816,2734948351,SE @@ -29605,20 +53278,19 @@ 2742550528,2742616063,US 2742616064,2742681599,EG 2742681600,2742747135,IN -2742747136,2742812671,CA +2742747136,2742779903,CA 2742812672,2742878207,US 2742943744,2743009279,US 2743009280,2743140351,AU 2743140352,2743205887,US -2743205888,2743992319,JP -2744057856,2744516607,JP +2743205888,2744516607,JP 2744516608,2744647679,US 2744647680,2744713215,KR 2744713216,2744844287,US 2744844288,2744909823,CA 2744909824,2744975359,GB 2744975360,2745040895,SE -2745040896,2745106431,CH +2745040896,2745106431,DE 2745106432,2745171967,SI 2745171968,2745237503,GB 2745237504,2745303039,CH @@ -29635,17 +53307,14 @@ 2746155008,2746220543,NL 2746220544,2746286079,US 2746351616,2746417151,CR -2746417152,2746482687,US 2746482688,2746548223,KR 2746548224,2747072511,US 2747072512,2747138047,AU 2747138048,2747465727,US -2748121088,2748317695,US -2748317696,2748645375,JP -2748710912,2749235199,JP -2749300736,2749628415,JP -2749628416,2749693951,US -2749759488,2749890559,US +2747465728,2748055551,ZA +2748055552,2748317695,US +2748317696,2749628415,JP +2749628416,2749890559,US 2749890560,2750021631,AU 2750021632,2750349311,US 2750349312,2750414847,KR @@ -29653,7 +53322,7 @@ 2750873600,2750939135,CL 2750939136,2751070207,US 2751070208,2751135743,CL -2751135744,2751397887,US +2751135744,2751463423,US 2751528960,2751660031,FR 2751660032,2751725567,AT 2751725568,2751791103,SE @@ -29672,7 +53341,7 @@ 2753888256,2753953791,SE 2753953792,2754084863,GB 2754150400,2754215935,BR -2754215936,2754281471,US +2754215936,2754281471,PR 2754281472,2754347007,JP 2754347008,2754478079,US 2754478080,2754543615,JP @@ -29692,8 +53361,8 @@ 2756378624,2756444159,AU 2756444160,2756509695,US 2756509696,2756556543,CL -2756556544,2756557311,PE -2756557312,2756575231,CL +2756556544,2756557567,PE +2756557568,2756575231,CL 2756575232,2756640767,SG 2756640768,2756706303,US 2756706304,2756771839,AU @@ -29701,6 +53370,7 @@ 2756837376,2757033983,US 2757033984,2757099519,BR 2757099520,2757230591,US +2757230592,2757296127,ZA 2757296128,2757754879,US 2757754880,2757820415,CL 2757820416,2757885951,AU @@ -29717,15 +53387,7 @@ 2759000064,2759065599,TH 2759065600,2759589887,US 2759589888,2759720959,KR -2759852032,2759863127,CH -2759863128,2759863131,DE -2759863132,2759870947,CH -2759870948,2759870951,AT -2759870952,2759871035,CH -2759871036,2759871039,GB -2759871040,2759883039,CH -2759883040,2759883043,LI -2759883044,2759883439,CH +2759852032,2759883439,CH 2759883440,2759883443,LI 2759883444,2759883451,CH 2759883452,2759883455,LI @@ -29751,18 +53413,21 @@ 2760898560,2760899583,US 2760899584,2760900607,GB 2760900608,2761031679,US +2761031680,2761424895,ZA 2761424896,2761621503,US +2761621504,2761687039,ZA 2761687040,2761949183,US -2762014720,2762211327,JP +2761949184,2762211327,JP 2762211328,2762276863,IN 2762276864,2762342399,US 2762342400,2762407935,CA 2762407936,2763063295,US 2763128832,2763194367,CA -2763194368,2765553663,US -2765619200,2768240639,US +2763194368,2768240639,US 2768306176,2768437247,US +2768437248,2768633855,ZA 2768633856,2768764927,US +2768764928,2769027071,ZA 2769027072,2769092607,AU 2769092608,2769158143,US 2769158144,2769289215,JP @@ -29772,10 +53437,10 @@ 2769682432,2769747967,US 2769747968,2769813503,CA 2769813504,2769879039,US +2769879040,2769944575,ZA 2769944576,2770272255,US 2770272256,2770337791,AU -2770337792,2771451903,US -2772434944,2772631551,US +2770337792,2772631551,US 2772631552,2772697087,AU 2772697088,2772762623,US 2772762624,2772828159,AU @@ -29787,8 +53452,7 @@ 2773745664,2773811199,NZ 2773811200,2773876735,US 2773876736,2773942271,AU -2773942272,2774138879,US -2774204416,2774335487,US +2773942272,2774335487,US 2774335488,2774401023,JP 2774401024,2774532095,US 2774532096,2774597631,JP @@ -29807,13 +53471,15 @@ 2777022464,2777481215,US 2777481216,2777546751,KR 2777546752,2777612287,AU +2777612288,2778071039,ZA 2778071040,2778333183,US 2778333184,2778398719,CA 2778398720,2779054079,US -2779119616,2779316223,US -2779381760,2779906047,US +2779054080,2779119615,ZA +2779119616,2779906047,US 2779906048,2779971583,CA 2779971584,2780037119,US +2780037120,2780102655,ZA 2780102656,2780168191,US 2780168192,2780299263,CL 2780299264,2780364799,US @@ -29822,19 +53488,45 @@ 2780495872,2780561407,AU 2780561408,2780758015,US 2780758016,2780823551,AU -2780823552,2780909183,US -2780909184,2780909311,CA -2780909312,2780909887,US +2780823552,2780904159,US +2780904160,2780904191,CA +2780904192,2780909887,US 2780909888,2780909903,CA 2780909904,2780921359,US 2780921360,2780921367,GB -2780921368,2780928031,US -2780928032,2780928095,GB -2780928096,2780930047,US +2780921368,2780925951,US +2780925952,2780926207,GB +2780926208,2780926271,US +2780926272,2780926303,FR +2780926304,2780926319,IT +2780926320,2780926327,GB +2780926328,2780926823,US +2780926824,2780926847,GB +2780926848,2780926975,US +2780926976,2780927487,GB +2780927488,2780927743,US +2780927744,2780927999,GB +2780928000,2780928031,US +2780928032,2780928127,GB +2780928128,2780928383,US +2780928384,2780928415,GB +2780928416,2780928447,US +2780928448,2780928455,GB +2780928456,2780928463,US +2780928464,2780928471,DE +2780928472,2780929023,US +2780929024,2780929279,GB +2780929280,2780929791,FR +2780929792,2780930047,US 2780930048,2780930559,GB 2780930560,2780930879,US 2780930880,2780930927,GB -2780930928,2780931071,US +2780930928,2780930943,US +2780930944,2780930959,GB +2780930960,2780930975,FR +2780930976,2780931007,US +2780931008,2780931039,GB +2780931040,2780931071,US 2780931072,2780932335,GB 2780932336,2780932607,US 2780932608,2780933119,GB @@ -29844,13 +53536,26 @@ 2780933248,2780933631,GB 2780933632,2780933887,US 2780933888,2780934143,GB -2780934144,2780940367,US -2780940368,2780940383,IL +2780934144,2780934167,PL +2780934168,2780940367,US +2780940368,2780940383,CA 2780940384,2780941055,US 2780941056,2780941087,GB -2780941088,2780947903,US +2780941088,2780941719,US +2780941720,2780941727,GB +2780941728,2780943575,US +2780943576,2780943583,BM +2780943584,2780945311,US +2780945312,2780945375,BM +2780945376,2780945663,US +2780945664,2780945695,BM +2780945696,2780946127,US +2780946128,2780946135,CA +2780946136,2780947903,US 2780947904,2780947967,MY -2780947968,2780954623,US +2780947968,2780952967,US +2780952968,2780952975,GB +2780952976,2780954623,US 2780954624,2781020159,KR 2781020160,2781478911,US 2781478912,2781544447,HK @@ -29870,20 +53575,45 @@ 2783313920,2783379455,US 2783379456,2783444991,GN 2783444992,2783510527,US +2783510528,2783576063,ZA 2783576064,2783969279,US 2783969280,2784034815,AU 2784034816,2784165887,JP 2784165888,2784296959,KR 2784296960,2784362495,US 2784362496,2784428031,KR -2784428032,2784952319,US -2785148928,2785542143,US +2784428032,2785542143,US 2785542144,2786066431,CH 2786066432,2788163583,US -2788229120,2788261887,US +2788229120,2788229935,US +2788229936,2788229943,GB +2788229944,2788230663,US +2788230664,2788230679,GB +2788230680,2788230703,US +2788230704,2788230719,GB +2788230720,2788230727,CH +2788230728,2788230735,GB +2788230736,2788233263,US +2788233264,2788233271,GB +2788233272,2788234279,US +2788234280,2788234287,CA +2788234288,2788234767,US +2788234768,2788234775,GB +2788234776,2788235295,US +2788235296,2788235311,SG +2788235312,2788238847,US +2788238848,2788238855,GB +2788238856,2788238911,US +2788238912,2788238919,GB +2788238920,2788241447,US +2788241448,2788241455,GB +2788241456,2788243471,US +2788243472,2788243487,SG +2788243488,2788245007,US +2788245008,2788245023,CA +2788245024,2788261887,US 2788261888,2788294655,GB -2788294656,2789081087,US -2789179392,2789203967,US +2788294656,2789212159,US 2789212160,2789277695,AU 2789277696,2789343231,NZ 2789343232,2789933055,US @@ -29892,12 +53622,15 @@ 2790195200,2790260735,KR 2790260736,2790326271,US 2790326272,2790391807,HK -2790391808,2790457343,US +2790391808,2790410495,US +2790410496,2790410751,AQ +2790410752,2790457343,US 2790457344,2790522879,NZ 2790522880,2790588415,US +2790588416,2790653951,ZA 2790653952,2790719487,US 2790719488,2790785023,SA -2790850560,2791571455,US +2790785024,2791571455,US 2791571456,2791636991,JP 2791636992,2791768063,US 2791768064,2791899135,KR @@ -29914,8 +53647,7 @@ 2792947712,2793013247,SG 2793013248,2793209855,US 2793209856,2793275391,KR -2793275392,2801795071,US -2801860608,2802515967,US +2793275392,2802515967,US 2802515968,2802581503,CA 2802581504,2802909183,US 2802909184,2802974719,CA @@ -29924,7 +53656,7 @@ 2803695616,2803761151,US 2803761152,2803826687,AU 2803826688,2803892223,US -2803892224,2805465087,CA +2803892224,2805989375,CA 2805989376,2806644735,US 2806644736,2806710271,CA 2806710272,2807103487,US @@ -29936,8 +53668,7 @@ 2808610816,2808872959,US 2808938496,2809069567,US 2809069568,2809135103,SA -2809135104,2809397247,US -2809462784,2809855999,US +2809135104,2809855999,US 2809856000,2809921535,AU 2809921536,2809987071,US 2809987072,2810052607,CA @@ -29969,26 +53700,80 @@ 2815098880,2815164415,GB 2815164416,2815229951,US 2815229952,2815295487,ID -2815295488,2815986831,US +2815295488,2815984639,US +2815984640,2815985407,IL +2815985408,2815985663,US +2815985664,2815986687,IL +2815986688,2815986815,GB +2815986816,2815986831,US 2815986832,2815987215,GB -2815987216,2816001151,US +2815987216,2815987231,IL +2815987232,2815987271,GB +2815987272,2815987327,IL +2815987328,2815987391,GB +2815987392,2815987455,IL +2815987456,2815987711,US +2815987712,2815988351,FR +2815988352,2815988383,GB +2815988384,2815988479,IL +2815988480,2815988543,GB +2815988544,2815991807,IL +2815991808,2815991839,US +2815991840,2816000383,IL +2816000384,2816000399,US +2816000400,2816000447,IL +2816000448,2816001023,US +2816001024,2816001151,IL 2816001152,2816001183,DE -2816001184,2816671743,US +2816001184,2816002047,IL +2816002048,2816002079,US +2816002080,2816002239,IL +2816002240,2816002247,US +2816002248,2816002815,IL +2816002816,2816002879,US +2816002880,2816002911,IL +2816002912,2816002927,US +2816002928,2816003359,IL +2816003360,2816003391,US +2816003392,2816003439,IL +2816003440,2816003455,US +2816003456,2816003855,IL +2816003856,2816003871,US +2816003872,2816004351,IL +2816004352,2816004367,US +2816004368,2816004415,IL +2816004416,2816004479,US +2816004480,2816008191,IL +2816008192,2816008207,IE +2816008208,2816010495,IL +2816010496,2816010751,US +2816010752,2816014239,IL +2816014240,2816014271,US +2816014272,2816015319,IL +2816015320,2816015327,US +2816015328,2816015335,IL +2816015336,2816015343,US +2816015344,2816015359,IL +2816015360,2816015423,US +2816015424,2816016383,IL +2816016384,2816671743,US 2816671744,2816737279,CA -2816737280,2818113535,US -2818179072,2818310143,US +2816737280,2818310143,US 2818310144,2818375679,AR 2818375680,2818572287,US 2818637824,2818703359,CH 2818703360,2823159807,US 2823159808,2823225343,HK 2823225344,2823553023,US +2823553024,2823618559,ZA 2823618560,2823684095,PA 2823684096,2823749631,KR 2823749632,2823815167,JP +2823815168,2823946239,ZA 2823946240,2824011775,US 2824011776,2824077311,AR 2824077312,2824404991,US +2824404992,2824470527,ZA 2824536064,2824798207,US 2824798208,2824863743,TW 2824863744,2824929279,AR @@ -30000,9 +53785,12 @@ 2826108928,2826174463,KR 2826174464,2826436607,US 2826436608,2826502143,TH -2826567680,2826829823,US +2826567680,2826633215,US +2826633216,2826698751,GU +2826698752,2826829823,US 2826829824,2826895359,KR 2826895360,2826960895,US +2826960896,2827026431,ZA 2827026432,2827091967,US 2827091968,2827157503,AU 2827157504,2827223039,KR @@ -30013,22 +53801,38 @@ 2827681792,2827747327,TR 2827747328,2827812863,AU 2827812864,2827878399,US -2827943936,2828009471,US +2827878400,2827943935,ZA +2827943936,2827973119,US +2827973120,2827973375,A1 +2827973376,2827974015,US +2827974016,2827974143,A1 +2827974144,2827974655,US +2827974656,2827974783,A1 +2827974784,2827975487,US +2827975488,2827975551,A1 +2827975552,2827991471,US +2827991472,2827991487,A1 +2827991488,2827991503,US +2827991504,2827991519,A1 +2827991520,2828009471,US 2828009472,2828075007,CA 2828075008,2828533759,US 2828533760,2828664831,AU 2828664832,2828730367,KR +2828730368,2828795903,ZA 2828795904,2829058047,US 2829058048,2829123583,CN 2829123584,2829254655,US 2829254656,2829320191,CH +2829320192,2829385727,ZA 2829385728,2829451263,MX 2829451264,2829516799,US +2829516800,2829582335,BW 2829582336,2829844479,US +2829844480,2829910015,ZA 2829910016,2830106623,US 2830106624,2830172159,CO -2830172160,2830434303,US -2830499840,2830761983,US +2830172160,2830761983,US 2830761984,2830827519,AU 2830827520,2830893055,KW 2830893056,2830958591,KR @@ -30036,10 +53840,13 @@ 2831548416,2831613951,AU 2831613952,2831810559,US 2831810560,2831876095,IT -2831876096,2832072703,US +2831876096,2832007167,US +2832072704,2832138239,ZA 2832138240,2832269311,US -2832347648,2832347903,ZA -2832465920,2832793599,US +2832269312,2832400383,ZA +2832465920,2832693247,US +2832693248,2832693503,A2 +2832693504,2832793599,US 2832793600,2832859135,AU 2832859136,2832924671,US 2832924672,2832990207,KR @@ -30049,39 +53856,39 @@ 2833711104,2833776639,CL 2833842176,2833907711,US 2833907712,2833973247,GT -2833973248,2834497535,US +2833973248,2833989631,US +2834038784,2834497535,US 2834497536,2834563071,SV 2834563072,2834825215,US 2834825216,2834956287,KR 2834956288,2835087359,US 2835087360,2835152895,AU -2835152896,2835283967,US +2835218432,2835283967,US 2835283968,2835349503,MX -2835480576,2837446655,US +2835349504,2837446655,US 2837446656,2839543807,CH 2839543808,2840015359,US 2840015360,2840015615,GB 2840015616,2843803647,US +2843803648,2843869183,ZA 2843869184,2844524543,US 2844524544,2844590079,KR 2844590080,2845704191,US 2845704192,2845769727,CU -2845835264,2848276479,US -2848325632,2848522239,US +2845835264,2848522239,US 2848522240,2848587775,AU +2848587776,2848653311,ZA 2848653312,2848980991,US -2848980992,2849177599,AU -2849177600,2849177855,JP +2848980992,2849177855,AU 2849177856,2849178111,CN 2849178112,2849178367,KR -2849178368,2849178623,TW +2849178368,2849178623,AU 2849178624,2849178879,ID 2849178880,2849179135,VN 2849179136,2849964031,AU -2849964032,2850029567,TW -2850029568,2851012607,US -2851078144,2852061183,US -2852192256,2853306367,US +2849964032,2850029567,PH +2850029568,2851995647,US +2852126720,2853306367,US 2853306368,2853371903,CL 2853371904,2853765119,US 2853765120,2853830655,MX @@ -30095,11 +53902,12 @@ 2856452096,2856517631,BR 2856517632,2856714239,US 2856714240,2856779775,MX -2856779776,2857238527,US -2857697280,2858352639,US +2856779776,2857369599,US +2857631744,2858352639,US 2858352640,2858418175,SG -2858418176,2861957119,US -2862022656,2862284799,US +2858418176,2859007999,US +2859008000,2859073535,JP +2859073536,2862284799,US 2862284800,2862350335,AR 2862350336,2862415871,US 2862415872,2862481407,AU @@ -30109,10 +53917,11 @@ 2863595520,2863661055,CA 2863661056,2863857663,US 2863857664,2863923199,SG -2863923200,2865889279,US +2863923200,2865577983,US +2865577984,2865610751,BE +2865610752,2865889279,US 2865889280,2865954815,AR -2865954816,2867396607,US -2867462144,2867593215,US +2865954816,2867593215,US 2867593216,2867639295,CH 2867639296,2867639551,AT 2867639552,2867724287,CH @@ -30128,148 +53937,5454 @@ 2870345728,2870411263,GB 2870411264,2870476799,NO 2870476800,2870542335,DE -2870542336,2870574848,CH -2870575104,2870578944,SE -2870579200,2870583040,SE -2870583296,2870583551,NL -2870583552,2870584319,NO +2870542336,2870575103,CH +2870575104,2870583295,SE +2870583296,2870584319,NO 2870607872,2870673407,BE 2870673408,2870738943,CH 2870738944,2870935551,GB 2870935552,2871001087,HU 2871001088,2871066623,SE 2871066624,2871083007,CH -2873098240,2873884671,US -2877292544,2882469887,US -2894069760,2899902463,US -2902458368,2902523903,US -2902589440,2903515135,US -2927624192,2927689727,US -2929721344,2931818495,US -3128948736,3129016319,UY -3145728000,3147825151,MX +2873098240,2874146815,US +2877292544,2885681151,US +2894069760,2894921727,US +2894921728,2895118335,GB +2895118336,2895301887,US +2895301888,2895302143,AR +2895302144,2895642623,US +2895642624,2895708159,FR +2895708160,2896035839,US +2896035840,2896101375,DE +2896101376,2896166911,GB +2896166912,2897018879,US +2897018880,2897149951,DE +2897149952,2897215487,US +2897215488,2897739775,DE +2897739776,2898001919,FR +2898001920,2898132991,GB +2898132992,2898788351,US +2898788352,2899050495,GB +2899050496,2899116031,FR +2899116032,2899148799,VN +2899148800,2899181567,AU +2899181568,2899312639,GB +2899312640,2899378175,FR +2899378176,2899443711,GB +2899443712,2899574783,FR +2899574784,2899902463,GB +2902458368,2902462463,A1 +2902462464,2902507519,US +2902507520,2902515711,CA +2902515712,2904555519,US +2904555520,2904817663,CA +2904817664,2905376767,US +2905376768,2905377535,CA +2905377536,2905377791,US +2905377792,2905378047,CA +2905378048,2905378303,US +2905378304,2905378815,CA +2905378816,2905379071,US +2905379072,2905379583,CA +2905379584,2905380863,US +2905380864,2905381119,CA +2905381120,2905381887,US +2905381888,2905382016,CA +2905382017,2905384191,US +2905384192,2905385471,CA +2905385472,2905386239,US +2905386240,2905386495,CA +2905386496,2905388031,US +2905388032,2905388287,CA +2905388288,2905391871,US +2905391872,2905392127,CA +2905392128,2905392895,US +2905392896,2905394943,CA +2905394944,2905395455,US +2905395456,2905396991,CA +2905396992,2905397759,US +2905397760,2905398271,CA +2905398272,2905399039,US +2905399040,2905399295,CA +2905399296,2905404671,US +2905404672,2905405183,CA +2905405184,2905407743,US +2905407744,2905407999,TW +2905408000,2905428967,US +2905428968,2905428975,AE +2905428976,2905432975,US +2905432976,2905432983,AE +2905432984,2905449983,US +2905449984,2905451007,CA +2905451008,2905451519,US +2905451520,2905451647,PA +2905451648,2905451775,US +2905451776,2905451903,PA +2905451904,2905473023,US +2905473024,2905481215,CA +2905481216,2913992703,US +2913992704,2914516991,CA +2914516992,2915765279,US +2915765280,2915765287,IN +2915765288,2915765343,US +2915765344,2915765351,NZ +2915765352,2915765367,US +2915765368,2915765375,PE +2915765376,2915765431,US +2915765432,2915765439,MX +2915765440,2915765471,US +2915765472,2915765479,CA +2915765480,2915765671,US +2915765672,2915765679,AU +2915765680,2915766079,US +2915766080,2915766095,BR +2915766096,2915766447,US +2915766448,2915766463,GB +2915766464,2915766559,US +2915766560,2915766591,GB +2915766592,2915766623,US +2915766624,2915766655,CA +2915766656,2915766839,US +2915766840,2915766847,DE +2915766848,2915767055,US +2915767056,2915767063,GB +2915767064,2915767407,US +2915767408,2915767415,GB +2915767416,2915767679,US +2915767680,2915767695,GB +2915767696,2915767743,US +2915767744,2915767775,GB +2915767776,2915767831,US +2915767832,2915767839,CA +2915767840,2915767895,US +2915767896,2915767903,KW +2915767904,2915768191,US +2915768192,2915768199,GB +2915768200,2915768303,US +2915768304,2915768311,IL +2915768312,2915768359,US +2915768360,2915768367,GB +2915768368,2915768375,US +2915768376,2915768383,GB +2915768384,2915768431,US +2915768432,2915768439,IE +2915768440,2915768487,US +2915768488,2915768495,CA +2915768496,2915768703,US +2915768704,2915768767,GB +2915768768,2915768903,US +2915768904,2915768911,GR +2915768912,2915769095,US +2915769096,2915769103,BB +2915769104,2915769111,US +2915769112,2915769119,BB +2915769120,2915769239,US +2915769240,2915769247,CA +2915769248,2915769295,US +2915769296,2915769303,BR +2915769304,2915772671,US +2915772672,2915772679,IN +2915772680,2915772711,US +2915772712,2915772719,GB +2915772720,2915773023,US +2915773024,2915773039,IN +2915773040,2915773175,US +2915773176,2915773183,KW +2915773184,2915794959,US +2915794960,2915794975,MX +2915794976,2915795007,US +2915795008,2915795023,BR +2915795024,2915795263,US +2915795264,2915795279,NZ +2915795280,2915795343,US +2915795344,2915795359,NZ +2915795360,2915795535,US +2915795536,2915795551,CA +2915795552,2915795727,US +2915795728,2915795743,CA +2915795744,2915795967,US +2915795968,2915795975,GB +2915795976,2915795983,US +2915795984,2915795991,AE +2915795992,2915796039,US +2915796040,2915796047,MX +2915796048,2915796055,US +2915796056,2915796063,MX +2915796064,2915796135,US +2915796136,2915796143,CA +2915796144,2915796151,US +2915796152,2915796159,AR +2915796160,2915796199,US +2915796200,2915796207,IL +2915796208,2915796303,US +2915796304,2915796311,MX +2915796312,2915796351,US +2915796352,2915796359,CA +2915796360,2915796399,US +2915796400,2915796407,PE +2915796408,2915796431,US +2915796432,2915796439,AU +2915796440,2915796495,US +2915796496,2915796503,IL +2915796504,2915796631,US +2915796632,2915796639,BR +2915796640,2915796647,US +2915796648,2915796655,AU +2915796656,2915796711,US +2915796712,2915796719,GB +2915796720,2915796815,US +2915796816,2915796823,CA +2915796824,2915796919,US +2915796920,2915796927,BR +2915796928,2915796967,US +2915796968,2915796975,BR +2915796976,2915797151,US +2915797152,2915797159,MX +2915797160,2915797447,US +2915797448,2915797455,CA +2915797456,2915797463,MX +2915797464,2915797543,US +2915797544,2915797551,CA +2915797552,2915797559,IN +2915797560,2915797727,US +2915797728,2915797735,IL +2915797736,2915797767,US +2915797768,2915797775,MX +2915797776,2915797871,US +2915797872,2915797879,IN +2915797880,2915797895,US +2915797896,2915797903,MX +2915797904,2915798079,US +2915798080,2915798111,IN +2915798112,2915798687,US +2915798688,2915798719,BR +2915798720,2915798943,US +2915798944,2915798975,PH +2915798976,2915799007,US +2915799008,2915799039,CA +2915799040,2915799047,US +2915799048,2915799055,ES +2915799056,2915799167,US +2915799168,2915799175,GB +2915799176,2915799183,US +2915799184,2915799191,GB +2915799192,2915799199,JE +2915799200,2915799215,US +2915799216,2915799223,MX +2915799224,2915799327,US +2915799328,2915799335,TH +2915799336,2915799431,US +2915799432,2915799439,TH +2915799440,2915799535,US +2915799536,2915799543,JP +2915799544,2915799591,US +2915799592,2915799599,IN +2915799600,2915799775,US +2915799776,2915799791,PR +2915799792,2915799807,CA +2915799808,2915799903,US +2915799904,2915799911,CA +2915799912,2915799935,US +2915799936,2915799943,AR +2915799944,2915800055,US +2915800056,2915800063,NZ +2915800064,2915800231,US +2915800232,2915800239,AU +2915800240,2915800271,US +2915800272,2915800279,AU +2915800280,2915800415,US +2915800416,2915800423,GB +2915800424,2915800519,US +2915800520,2915800527,PH +2915800528,2915800543,US +2915800544,2915800551,IN +2915800552,2915800631,US +2915800632,2915800639,TH +2915800640,2915800663,US +2915800664,2915800679,BG +2915800680,2915800711,US +2915800712,2915800719,CA +2915800720,2915800735,US +2915800736,2915800743,CA +2915800744,2915800751,US +2915800752,2915800759,CL +2915800760,2915800903,US +2915800904,2915800911,IL +2915800912,2915800951,US +2915800952,2915800959,GB +2915800960,2915801079,US +2915801080,2915801087,IL +2915801088,2915801679,US +2915801680,2915801687,MX +2915801688,2915801871,US +2915801872,2915801879,BR +2915801880,2915801991,US +2915801992,2915801999,IL +2915802000,2915802319,US +2915802320,2915802327,AW +2915802328,2915802351,US +2915802352,2915802359,AW +2915802360,2915802375,US +2915802376,2915802383,CA +2915802384,2915802415,US +2915802416,2915802423,CA +2915802424,2915802551,US +2915802552,2915802559,AU +2915802560,2915802711,US +2915802712,2915802719,ZA +2915802720,2915802895,US +2915802896,2915802903,PH +2915802904,2915802999,US +2915803000,2915803007,RU +2915803008,2915803191,US +2915803192,2915803199,CA +2915803200,2915803207,GB +2915803208,2915803239,US +2915803240,2915803247,BR +2915803248,2915803295,US +2915803296,2915803311,CA +2915803312,2915803327,ID +2915803328,2915803783,US +2915803784,2915803791,CN +2915803792,2915803815,US +2915803816,2915803823,PE +2915803824,2915804375,US +2915804376,2915804383,BR +2915804384,2915804519,US +2915804520,2915804527,CN +2915804528,2915804591,US +2915804592,2915804599,CA +2915804600,2915804679,US +2915804680,2915804687,CA +2915804688,2915804759,US +2915804760,2915804767,NZ +2915804768,2915804791,US +2915804792,2915804799,GB +2915804800,2915804807,US +2915804808,2915804815,NZ +2915804816,2915804847,US +2915804848,2915804855,CO +2915804856,2915805055,US +2915805056,2915805063,GB +2915805064,2915805375,US +2915805376,2915805391,PH +2915805392,2915805439,US +2915805440,2915805455,BR +2915805456,2915806735,US +2915806736,2915806751,IT +2915806752,2915806823,US +2915806824,2915806831,IN +2915806832,2915806863,US +2915806864,2915806871,IN +2915806872,2915806895,US +2915806896,2915806903,CA +2915806904,2915806967,US +2915806968,2915806975,CA +2915806976,2915807271,US +2915807272,2915807279,GB +2915807280,2915807287,US +2915807288,2915807295,ZA +2915807296,2915807439,US +2915807440,2915807447,CA +2915807448,2915807455,US +2915807456,2915807463,PT +2915807464,2915807519,US +2915807520,2915807527,CA +2915807528,2915807559,US +2915807560,2915807567,CA +2915807568,2915807607,US +2915807608,2915807615,IL +2915807616,2915807951,US +2915807952,2915807959,CA +2915807960,2915808095,US +2915808096,2915808103,CA +2915808104,2915808183,US +2915808184,2915808191,CA +2915808192,2915808247,US +2915808248,2915808255,DE +2915808256,2915810471,US +2915810472,2915810479,GB +2915810480,2915811135,US +2915811136,2915811199,IN +2915811200,2915958783,US +2915958784,2916024319,CA +2916024320,2916091903,US +2916091904,2916092159,IN +2916092160,2916092927,US +2916092928,2916093183,IN +2916093184,2916093695,US +2916093696,2916093951,IN +2916093952,2916110623,US +2916110624,2916110639,CA +2916110640,2916163583,US +2916163584,2916171775,CA +2916171776,2916188159,US +2916188160,2916196351,CA +2916196352,2916200447,US +2916204544,2916253695,US +2916253696,2916286463,CA +2916286464,2916319231,US +2916319232,2916335615,PR +2916352000,2916368383,US +2916368384,2916401151,CA +2916401152,2916417535,US +2916417536,2916434495,CA +2916434496,2916434559,US +2916434560,2916434591,CA +2916434592,2916437503,US +2916437504,2916437567,CA +2916437568,2916440063,US +2916440064,2916440095,CA +2916440096,2916440143,US +2916440144,2916440159,CA +2916440160,2916441343,US +2916441344,2916442111,CA +2916442112,2916442623,US +2916442624,2916442879,CA +2916442880,2916443582,US +2916443583,2916443614,PK +2916443615,2916443647,CA +2916443648,2916443903,US +2916443904,2916444159,CA +2916444160,2916444927,US +2916444928,2916445951,CA +2916445952,2916447231,US +2916447232,2916448031,CA +2916448032,2916448063,US +2916448064,2916448255,CA +2916448256,2916449279,US +2916449280,2916450303,CA +2916450304,2916515839,US +2916548608,2916581375,US +2916581376,2916614143,PR +2916614144,2917195775,US +2917195776,2917196031,CA +2917196032,2917199871,A2 +2917199872,2917203967,CA +2917203968,2917210335,US +2917210336,2917210367,CA +2917210368,2917210431,US +2917210432,2917210463,HK +2917210464,2917257215,US +2917257216,2917261311,KY +2917261312,2917265407,US +2917265408,2917269503,JM +2917269504,2917572607,US +2917572608,2917580799,CA +2917580800,2917597439,US +2917597440,2917597695,GB +2917597696,2917621759,US +2917629952,2917646335,US +2917662720,2917663231,US +2917663232,2917663487,CA +2917663488,2917665791,US +2917665792,2917666303,CA +2917666304,2917667710,US +2917667711,2917671935,CA +2917671936,2917675263,US +2917675264,2917675775,CA +2917675776,2917676031,US +2917676032,2917677055,CA +2917677056,2917677567,US +2917677568,2917678335,CA +2917678336,2917680895,US +2917680896,2917681407,CA +2917681408,2917681919,US +2917681920,2917682175,CA +2917682176,2917685247,US +2917685248,2917686015,CA +2917686016,2917690367,US +2917690368,2917690879,CA +2917690880,2917693183,US +2917693184,2917693951,CA +2917693952,2917695231,US +2917695232,2917695487,CA +2917695488,2917701119,US +2917701120,2917701375,CA +2917701376,2917702399,US +2917702400,2917707519,CA +2917707520,2917711871,US +2917711872,2917714431,CA +2917714432,2917718527,US +2917718528,2917719039,CA +2917719040,2917719295,US +2917719296,2917719551,CA +2917719552,2917722367,US +2917722368,2917722879,CA +2917722880,2917842175,US +2917842176,2917842431,CA +2917842432,2918055935,US +2918055936,2918121471,CA +2918121472,2918154239,US +2918154240,2918170623,CA +2918170624,2918232063,US +2918232064,2918236159,CA +2918236160,2918260735,US +2918260736,2918264831,CA +2918264832,2918277119,US +2918277120,2918281215,CA +2918281216,2918286879,US +2918286880,2918286895,GB +2918286896,2918287103,US +2918287104,2918287359,CR +2918287360,2918289407,GB +2918289408,2918371327,US +2918371328,2918375423,CA +2918375424,2918391807,US +2918391808,2918395903,CA +2918395904,2918404095,US +2918404096,2918408191,PR +2918408192,2918432767,US +2918432768,2918436863,CA +2918436864,2918580223,US +2918580224,2918588415,CA +2918588416,2918596607,US +2918596608,2918604799,CA +2918604800,2918608895,US +2918612992,2918653951,US +2918653952,2918662143,CA +2918662144,2918760447,US +2918760448,2918776831,CA +2918776832,2918842367,US +2918842368,2918875135,CA +2918875136,2918973439,US +2918973440,2918989823,CA +2919170048,2919174143,US +2919174144,2919178239,CA +2919178240,2919186431,US +2919186432,2919190527,CA +2919190528,2919202815,US +2919206912,2919211007,CA +2919219200,2919235583,US +2919235584,2919759871,CA +2919759872,2921496895,US +2921496896,2921496903,IN +2921496904,2921496967,US +2921496968,2921496975,IN +2921496976,2921497375,US +2921497376,2921497407,IN +2921497408,2921497415,US +2921497416,2921497423,IN +2921497424,2921497471,US +2921497472,2921497599,IN +2921497600,2921503607,US +2921503608,2921503615,GB +2921503616,2921503695,US +2921503696,2921503703,GB +2921503704,2921508095,US +2921508096,2921508103,IN +2921508104,2921508319,US +2921508320,2921508351,IN +2921508352,2921508639,US +2921508640,2921508671,IN +2921508672,2921508679,US +2921508680,2921508719,IN +2921508720,2921508727,SE +2921508728,2921511351,US +2921511352,2921511359,IN +2921511360,2921511743,US +2921511744,2921511759,BE +2921511760,2921512703,US +2921512704,2921512959,CA +2921512960,2921562111,US +2921562112,2921594879,CA +2921594880,2925002751,US +2925002752,2925527039,CA +2925527040,2926575615,US +2926575616,2927099903,CA +2927099904,2928218127,US +2928218128,2928218143,CA +2928218144,2928218623,US +2928218624,2928219135,CA +2928219136,2928226303,US +2928226304,2928226399,CA +2928226400,2928226407,US +2928226408,2928226415,CA +2928226416,2928226423,US +2928226424,2928227583,CA +2928227584,2928227783,US +2928227784,2928228087,CA +2928228088,2928228095,RU +2928228096,2928228351,CA +2928228352,2928228607,US +2928228608,2928230399,CA +2928230400,2928261375,US +2928261376,2928261887,CA +2928261888,2928263167,US +2928263168,2928263679,CA +2928263680,2928263687,US +2928263688,2928263703,CA +2928263704,2928263711,US +2928263712,2928263791,CA +2928263792,2928263799,US +2928263800,2928263823,CA +2928263824,2928263831,US +2928263832,2928263855,CA +2928263856,2928263871,US +2928263872,2928263999,CA +2928264000,2928264007,US +2928264008,2928264015,CA +2928264016,2928264023,US +2928264024,2928264063,CA +2928264064,2928264095,US +2928264096,2928264159,CA +2928264160,2928264167,US +2928264168,2928264199,CA +2928264200,2928264207,US +2928264208,2928264215,CA +2928264216,2928264223,US +2928264224,2928264287,CA +2928264288,2928264303,US +2928264304,2928264327,CA +2928264328,2928264335,NL +2928264336,2928264359,CA +2928264360,2928264375,US +2928264376,2928264383,CA +2928264384,2928264391,US +2928264392,2928264399,CA +2928264400,2928264423,US +2928264424,2928264759,CA +2928264760,2928264775,US +2928264776,2928264783,CA +2928264784,2928264831,US +2928264832,2928264863,CA +2928264864,2928264871,US +2928264872,2928264879,CA +2928264880,2928264967,US +2928264968,2928264983,CA +2928264984,2928265007,US +2928265008,2928265055,CA +2928265056,2928265103,US +2928265104,2928265143,CA +2928265144,2928265215,US +2928265216,2928265471,CA +2928265472,2928265479,US +2928265480,2928265503,CA +2928265504,2928265527,US +2928265528,2928265559,CA +2928265560,2928265567,US +2928265568,2928265575,CA +2928265576,2928265623,US +2928265624,2928265631,CA +2928265632,2928265647,US +2928265648,2928265671,CA +2928265672,2928265687,US +2928265688,2928265703,CA +2928265704,2928265711,US +2928265712,2928265727,CA +2928265728,2928265735,US +2928265736,2928266023,CA +2928266024,2928266031,US +2928266032,2928266055,CA +2928266056,2928266063,US +2928266064,2928266111,CA +2928266112,2928266119,US +2928266120,2928266175,CA +2928266176,2928266191,US +2928266192,2928266255,CA +2928266256,2928266263,US +2928266264,2928266295,CA +2928266296,2928266311,US +2928266312,2928266359,CA +2928266360,2928266367,US +2928266368,2928266407,CA +2928266408,2928266415,US +2928266416,2928269759,CA +2928269760,2928269775,US +2928269776,2928269783,CA +2928269784,2928269807,US +2928269808,2928269975,CA +2928269976,2928269983,US +2928269984,2928269999,CA +2928270000,2928270007,US +2928270008,2928270063,CA +2928270064,2928270071,US +2928270072,2928270135,CA +2928270136,2928270143,US +2928270144,2928270175,CA +2928270176,2928270183,US +2928270184,2928270327,CA +2928270328,2928270335,US +2928270336,2928270479,CA +2928270480,2928270487,NL +2928270488,2928270551,CA +2928270552,2928270559,US +2928270560,2928270583,CA +2928270584,2928270591,US +2928270592,2928270607,CA +2928270608,2928270615,US +2928270616,2928270623,CA +2928270624,2928270631,US +2928270632,2928270647,CA +2928270648,2928270655,US +2928270656,2928270727,CA +2928270728,2928270743,US +2928270744,2928270751,CA +2928270752,2928270767,US +2928270768,2928270791,CA +2928270792,2928270799,US +2928270800,2928271143,CA +2928271144,2928271151,US +2928271152,2928271183,CA +2928271184,2928271191,US +2928271192,2928271447,CA +2928271448,2928271455,US +2928271456,2928271767,CA +2928271768,2928271775,US +2928271776,2928271823,CA +2928271824,2928271871,US +2928271872,2928271943,CA +2928271944,2928271951,US +2928271952,2928272591,CA +2928272592,2928272599,US +2928272600,2928272775,CA +2928272776,2928272783,US +2928272784,2928272839,CA +2928272840,2928272847,US +2928272848,2928272903,CA +2928272904,2928272919,US +2928272920,2928272951,CA +2928272952,2928273071,US +2928273072,2928273079,CA +2928273080,2928273183,US +2928273184,2928273191,CA +2928273192,2928273199,US +2928273200,2928273295,CA +2928273296,2928273303,US +2928273304,2928273311,CA +2928273312,2928273367,US +2928273368,2928273383,CA +2928273384,2928273439,US +2928273440,2928273447,CA +2928273448,2928273471,US +2928273472,2928273479,CA +2928273480,2928273591,US +2928273592,2928273599,CA +2928273600,2928273607,NL +2928273608,2928273639,CA +2928273640,2928273647,US +2928273648,2928273671,CA +2928273672,2928273703,US +2928273704,2928273735,CA +2928273736,2928273799,US +2928273800,2928273807,CA +2928273808,2928273919,US +2928273920,2928274175,CA +2928274176,2928274199,US +2928274200,2928274207,CA +2928274208,2928274247,US +2928274248,2928274263,CA +2928274264,2928274295,US +2928274296,2928274311,CA +2928274312,2928274319,US +2928274320,2928274335,CA +2928274336,2928274359,US +2928274360,2928274367,CA +2928274368,2928274391,US +2928274392,2928274495,CA +2928274496,2928274503,US +2928274504,2928274519,CA +2928274520,2928274527,US +2928274528,2928274575,CA +2928274576,2928274583,US +2928274584,2928274599,CA +2928274600,2928274607,US +2928274608,2928274615,CA +2928274616,2928274623,US +2928274624,2928274631,CA +2928274632,2928274639,US +2928274640,2928274703,CA +2928274704,2928274711,US +2928274712,2928274767,CA +2928274768,2928274775,US +2928274776,2928274847,CA +2928274848,2928274855,US +2928274856,2928274919,CA +2928274920,2928274927,US +2928274928,2928275055,CA +2928275056,2928275071,US +2928275072,2928275455,CA +2928275456,2928275463,US +2928275464,2928275479,CA +2928275480,2928275495,US +2928275496,2928275599,CA +2928275600,2928275607,US +2928275608,2928275719,CA +2928275720,2928275727,US +2928275728,2928275767,CA +2928275768,2928275775,US +2928275776,2928275815,CA +2928275816,2928275823,US +2928275824,2928276071,CA +2928276072,2928276079,US +2928276080,2928276127,CA +2928276128,2928276135,US +2928276136,2928276191,CA +2928276192,2928276231,US +2928276232,2928276271,CA +2928276272,2928276319,US +2928276320,2928276367,CA +2928276368,2928276455,US +2928276456,2928276463,CA +2928276464,2928276535,US +2928276536,2928276543,CA +2928276544,2928276599,US +2928276600,2928276607,CA +2928276608,2928276679,US +2928276680,2928276695,CA +2928276696,2928276711,US +2928276712,2928276727,CA +2928276728,2928276735,US +2928276736,2928276743,CA +2928276744,2928276903,US +2928276904,2928276911,CA +2928276912,2928276919,US +2928276920,2928277031,CA +2928277032,2928277039,US +2928277040,2928277167,CA +2928277168,2928277183,US +2928277184,2928277199,CA +2928277200,2928277215,US +2928277216,2928277279,CA +2928277280,2928277303,US +2928277304,2928277335,CA +2928277336,2928277343,US +2928277344,2928277367,CA +2928277368,2928277415,US +2928277416,2928277423,CA +2928277424,2928277487,US +2928277488,2928277495,CA +2928277496,2928277503,US +2928277504,2928277671,CA +2928277672,2928277679,US +2928277680,2928277695,CA +2928277696,2928277703,US +2928277704,2928278279,CA +2928278280,2928278287,US +2928278288,2928278335,CA +2928278336,2928278343,US +2928278344,2928278367,CA +2928278368,2928278375,US +2928278376,2928278727,CA +2928278728,2928278735,US +2928278736,2928278791,CA +2928278792,2928278799,US +2928278800,2928278879,CA +2928278880,2928278887,US +2928278888,2928278895,CA +2928278896,2928278911,US +2928278912,2928278959,CA +2928278960,2928278991,US +2928278992,2928279015,CA +2928279016,2928279023,US +2928279024,2928279551,CA +2928279552,2928312319,US +2928312320,2928316415,CA +2928316416,2928321311,US +2928321312,2928321327,GB +2928321328,2928323135,US +2928323136,2928323143,RU +2928323144,2928323967,US +2928323968,2928323983,RU +2928323984,2928328703,US +2928328704,2928336895,CA +2928336896,2928374951,US +2928374952,2928374967,CN +2928374968,2928455679,US +2928455680,2928459775,CA +2928459776,2928541695,US +2928541696,2928553303,CA +2928553304,2928553311,HU +2928553312,2928558943,CA +2928558944,2928558951,PE +2928558952,2928570671,CA +2928570672,2928570687,FR +2928570688,2928579543,CA +2928579544,2928579551,HU +2928579552,2928583735,CA +2928583736,2928583743,SY +2928583744,2928595959,CA +2928595960,2928595967,US +2928595968,2928607231,CA +2928607232,2928607287,US +2928607288,2928607303,NO +2928607304,2928607343,US +2928607344,2928607351,GB +2928607352,2928607567,US +2928607568,2928607575,CA +2928607576,2928607711,US +2928607712,2928607719,CA +2928607720,2928607815,US +2928607816,2928607823,CA +2928607824,2928608751,US +2928608752,2928608783,GB +2928608784,2928609071,US +2928609072,2928609087,CA +2928609088,2928609471,US +2928609472,2928609983,BD +2928609984,2928610143,US +2928610144,2928610175,GB +2928610176,2928610383,US +2928610384,2928610391,VG +2928610392,2928610615,US +2928610616,2928610623,IL +2928610624,2928610655,US +2928610656,2928610663,MX +2928610664,2928610703,US +2928610704,2928610711,IN +2928610712,2928610823,US +2928610824,2928610831,CA +2928610832,2928610839,GB +2928610840,2928610935,US +2928610936,2928610943,GB +2928610944,2928611279,US +2928611280,2928611287,CA +2928611288,2928611303,US +2928611304,2928611311,IL +2928611312,2928611351,US +2928611352,2928611359,ZA +2928611360,2928611375,US +2928611376,2928611383,ZA +2928611384,2928611591,US +2928611592,2928611599,CA +2928611600,2928611695,US +2928611696,2928611703,BB +2928611704,2928611791,US +2928611792,2928611807,GB +2928611808,2928611839,US +2928611840,2928611847,CA +2928611848,2928612135,US +2928612136,2928612143,AU +2928612144,2928612231,US +2928612232,2928612239,GB +2928612240,2928612279,US +2928612280,2928612287,GB +2928612288,2928612319,US +2928612320,2928612327,CA +2928612328,2928612343,US +2928612344,2928612351,CA +2928612352,2928612415,US +2928612416,2928612447,CA +2928612448,2928612735,US +2928612736,2928612799,CA +2928612800,2928615455,US +2928615456,2928615463,GB +2928615464,2928615735,US +2928615736,2928615743,GB +2928615744,2928615759,CA +2928615760,2928615871,US +2928615872,2928615879,MY +2928615880,2928615983,US +2928615984,2928615991,AU +2928615992,2928616863,US +2928616864,2928616879,ZA +2928616880,2928617023,US +2928617024,2928617039,IN +2928617040,2928617199,US +2928617200,2928617215,IL +2928617216,2928617359,US +2928617360,2928617375,CA +2928617376,2928617623,US +2928617624,2928617631,IN +2928617632,2928617639,US +2928617640,2928617647,JP +2928617648,2928617895,US +2928617896,2928617903,IN +2928617904,2928617951,US +2928617952,2928617959,GB +2928617960,2928618231,US +2928618232,2928618239,IL +2928618240,2928618247,US +2928618248,2928618255,GB +2928618256,2928618271,US +2928618272,2928618279,IL +2928618280,2928618367,US +2928618368,2928618375,GB +2928618376,2928618383,US +2928618384,2928618399,CA +2928618400,2928618479,US +2928618480,2928618487,CA +2928618488,2928618559,US +2928618560,2928618591,IN +2928618592,2928619071,US +2928619072,2928619103,BD +2928619104,2928619391,US +2928619392,2928619423,CA +2928619424,2928620135,US +2928620136,2928620143,IN +2928620144,2928620151,CA +2928620152,2928620183,US +2928620184,2928620191,FR +2928620192,2928620231,US +2928620232,2928620239,SE +2928620240,2928620303,US +2928620304,2928620311,GB +2928620312,2928620359,US +2928620360,2928620367,IN +2928620368,2928620439,US +2928620440,2928620447,NL +2928620448,2928620615,US +2928620616,2928620623,AU +2928620624,2928620855,US +2928620856,2928620863,ZA +2928620864,2928620991,US +2928620992,2928620999,GB +2928621000,2928621135,US +2928621136,2928621143,GB +2928621144,2928621215,US +2928621216,2928621223,GB +2928621224,2928621551,US +2928621552,2928621559,FR +2928621560,2928621567,GB +2928621568,2928621823,US +2928621824,2928621839,CA +2928621840,2928621903,US +2928621904,2928621911,AE +2928621912,2928621935,US +2928621936,2928621943,NZ +2928621944,2928621951,IN +2928621952,2928622047,US +2928622048,2928622055,CA +2928622056,2928622175,US +2928622176,2928622183,GB +2928622184,2928622231,US +2928622232,2928622239,AU +2928622240,2928622327,US +2928622328,2928622335,CN +2928622336,2928622623,US +2928622624,2928622639,NZ +2928622640,2928622703,US +2928622704,2928622719,GB +2928622720,2928622799,US +2928622800,2928622815,CA +2928622816,2928622927,US +2928622928,2928622959,CA +2928622960,2928623239,US +2928623240,2928623247,CA +2928623248,2928623263,US +2928623264,2928623271,MX +2928623272,2928623495,US +2928623496,2928623503,CA +2928623504,2928623807,US +2928623808,2928623815,AU +2928623816,2928623831,US +2928623832,2928623839,NO +2928623840,2928623855,US +2928623856,2928623863,NZ +2928623864,2928623999,US +2928624000,2928624007,CA +2928624008,2928624127,US +2928624128,2928624135,CY +2928624136,2928624143,CA +2928624144,2928624151,US +2928624152,2928624159,CA +2928624160,2928624303,US +2928624304,2928624311,NL +2928624312,2928624319,US +2928624320,2928624327,CA +2928624328,2928624479,US +2928624480,2928624487,MX +2928624488,2928624711,US +2928624712,2928624719,AU +2928624720,2928624791,US +2928624792,2928624799,AU +2928624800,2928625175,US +2928625176,2928625183,AU +2928625184,2928625191,US +2928625192,2928625199,ZA +2928625200,2928625231,US +2928625232,2928625239,CA +2928625240,2928626175,US +2928626176,2928626191,CA +2928626192,2928626431,US +2928626432,2928626447,HU +2928626448,2928626479,CA +2928626480,2928626607,US +2928626608,2928626623,IN +2928626624,2928626831,US +2928626832,2928626839,MX +2928626840,2928626871,US +2928626872,2928626879,AU +2928626880,2928626903,US +2928626904,2928626911,GB +2928626912,2928626975,US +2928626976,2928626983,CA +2928626984,2928627055,US +2928627056,2928627063,AU +2928627064,2928627071,GB +2928627072,2928627095,US +2928627096,2928627103,AU +2928627104,2928627167,US +2928627168,2928627175,GB +2928627176,2928627183,IE +2928627184,2928627383,US +2928627384,2928627391,AU +2928627392,2928627415,US +2928627416,2928627423,AU +2928627424,2928627431,IL +2928627432,2928627439,GB +2928627440,2928627463,US +2928627464,2928627471,TW +2928627472,2928627487,US +2928627488,2928627495,IN +2928627496,2928627543,US +2928627544,2928627551,GB +2928627552,2928628783,US +2928628784,2928628791,GB +2928628792,2928628799,US +2928628800,2928628807,CA +2928628808,2928628879,US +2928628880,2928628887,AU +2928628888,2928629007,US +2928629008,2928629015,CA +2928629016,2928629031,US +2928629032,2928629039,HK +2928629040,2928629183,US +2928629184,2928629191,GB +2928629192,2928629199,CA +2928629200,2928629207,US +2928629208,2928629215,IL +2928629216,2928629239,US +2928629240,2928629247,GB +2928629248,2928629511,US +2928629512,2928629519,MX +2928629520,2928629607,US +2928629608,2928629615,GB +2928629616,2928629647,US +2928629648,2928629655,GB +2928629656,2928629663,IL +2928629664,2928629671,US +2928629672,2928629679,JP +2928629680,2928629695,US +2928629696,2928629703,CA +2928629704,2928629887,US +2928629888,2928629951,BD +2928629952,2928630527,US +2928630528,2928630559,CA +2928630560,2928630791,US +2928630792,2928630807,GB +2928630808,2928630895,US +2928630896,2928630903,MX +2928630904,2928630911,HU +2928630912,2928631079,US +2928631080,2928631087,GB +2928631088,2928631111,US +2928631112,2928631119,AU +2928631120,2928631135,US +2928631136,2928631143,CA +2928631144,2928631239,US +2928631240,2928631247,CA +2928631248,2928631311,US +2928631312,2928631319,CA +2928631320,2928631423,US +2928631424,2928631431,MX +2928631432,2928631551,US +2928631552,2928631559,SG +2928631560,2928631567,US +2928631568,2928631575,CA +2928631576,2928631743,US +2928631744,2928631751,MX +2928631752,2928631775,US +2928631776,2928631783,IL +2928631784,2928631855,US +2928631856,2928631863,CA +2928631864,2928631871,AU +2928631872,2928631887,US +2928631888,2928631895,FR +2928631896,2928631951,US +2928631952,2928631959,SG +2928631960,2928631975,US +2928631976,2928631983,IN +2928631984,2928632031,US +2928632032,2928632039,NO +2928632040,2928632055,US +2928632056,2928632063,MX +2928632064,2928632223,US +2928632224,2928632231,GB +2928632232,2928632367,US +2928632368,2928632375,IN +2928632376,2928632399,US +2928632400,2928632407,CA +2928632408,2928632519,US +2928632520,2928632527,IN +2928632528,2928633055,US +2928633056,2928633071,CA +2928633072,2928633087,US +2928633088,2928633103,CA +2928633104,2928633119,US +2928633120,2928633135,CA +2928633136,2928633199,US +2928633200,2928633215,CA +2928633216,2928633423,US +2928633424,2928633439,IN +2928633440,2928633583,US +2928633584,2928633599,GB +2928633600,2928633879,US +2928633880,2928633887,IL +2928633888,2928633895,CA +2928633896,2928633959,US +2928633960,2928633967,GB +2928633968,2928634191,US +2928634192,2928634199,CH +2928634200,2928634247,US +2928634248,2928634255,CA +2928634256,2928634479,US +2928634480,2928634487,CA +2928634488,2928634495,US +2928634496,2928634503,CN +2928634504,2928634511,US +2928634512,2928634519,CA +2928634520,2928634543,US +2928634544,2928634551,IN +2928634552,2928634639,US +2928634640,2928634647,VG +2928634648,2928634655,US +2928634656,2928634663,IN +2928634664,2928634839,US +2928634840,2928634847,GB +2928634848,2928634903,US +2928634904,2928634911,MX +2928634912,2928634935,US +2928634936,2928634943,PH +2928634944,2928634959,US +2928634960,2928634967,CA +2928634968,2928635111,US +2928635112,2928635119,IN +2928635120,2928635127,US +2928635128,2928635135,IE +2928635136,2928635191,US +2928635192,2928635199,IN +2928635200,2928635207,US +2928635208,2928635215,IN +2928635216,2928635271,US +2928635272,2928635279,IL +2928635280,2928635303,US +2928635304,2928635311,CA +2928635312,2928635343,US +2928635344,2928635351,ZA +2928635352,2928635663,US +2928635664,2928635671,AU +2928635672,2928635815,US +2928635816,2928635823,BR +2928635824,2928635831,GB +2928635832,2928635863,US +2928635864,2928635871,AU +2928635872,2928636191,US +2928636192,2928636199,CA +2928636200,2928636375,US +2928636376,2928636383,CA +2928636384,2928636479,US +2928636480,2928636487,SE +2928636488,2928636527,US +2928636528,2928636535,CA +2928636536,2928636655,US +2928636656,2928636663,NZ +2928636664,2928636927,US +2928636928,2928636935,IL +2928636936,2928637007,US +2928637008,2928637015,BG +2928637016,2928637039,US +2928637040,2928637047,CA +2928637048,2928637487,US +2928637488,2928637495,CA +2928637496,2928637983,US +2928637984,2928637991,IN +2928637992,2928638047,US +2928638048,2928638055,BE +2928638056,2928638095,US +2928638096,2928638103,IN +2928638104,2928638119,US +2928638120,2928638127,IN +2928638128,2928638207,US +2928638208,2928638215,GB +2928638216,2928638359,US +2928638360,2928638367,CA +2928638368,2928638375,IN +2928638376,2928638455,US +2928638456,2928638463,MX +2928638464,2928638847,US +2928638848,2928638855,CA +2928638856,2928639527,US +2928639528,2928639535,GB +2928639536,2928639615,US +2928639616,2928639623,CA +2928639624,2928639679,US +2928639680,2928639687,GB +2928639688,2928639767,US +2928639768,2928639775,CA +2928639776,2928641087,US +2928641088,2928641151,CA +2928641152,2928641383,US +2928641384,2928641391,ID +2928641392,2928642599,US +2928642600,2928642607,IN +2928642608,2928648319,US +2928648320,2928648383,BD +2928648384,2928648415,US +2928648416,2928648447,BD +2928648448,2928648479,US +2928648480,2928648575,BD +2928648576,2928648607,US +2928648608,2928648639,BD +2928648640,2928649255,US +2928649256,2928649263,ZA +2928649264,2928649271,IL +2928649272,2928649287,US +2928649288,2928649295,RO +2928649296,2928649303,GR +2928649304,2928649311,IN +2928649312,2928649351,US +2928649352,2928649359,JP +2928649360,2928649375,US +2928649376,2928649383,IN +2928649384,2928649415,US +2928649416,2928649423,CA +2928649424,2928649447,US +2928649448,2928649455,GB +2928649456,2928649551,US +2928649552,2928649559,BO +2928649560,2928650087,US +2928650088,2928650095,CZ +2928650096,2928650111,US +2928650112,2928650119,IN +2928650120,2928650151,US +2928650152,2928650159,AU +2928650160,2928650207,US +2928650208,2928650215,IL +2928650216,2928655895,US +2928655896,2928655903,CA +2928655904,2928655927,US +2928655928,2928655935,NZ +2928655936,2928655943,US +2928655944,2928655951,NZ +2928655952,2928655983,US +2928655984,2928655991,GB +2928655992,2928656639,US +2928656640,2928656647,CA +2928656648,2928656655,US +2928656656,2928656663,PK +2928656664,2928656823,US +2928656824,2928656831,ZA +2928656832,2928656879,US +2928656880,2928656895,GB +2928656896,2928657983,US +2928657984,2928658015,NO +2928658016,2928662671,US +2928662672,2928662687,GB +2928662688,2928662735,US +2928662736,2928662751,CA +2928662752,2928662879,US +2928662880,2928662895,IL +2928662896,2928662959,US +2928662960,2928662975,IN +2928662976,2928663103,US +2928663104,2928663119,MX +2928663120,2928663759,US +2928663760,2928663775,GB +2928663776,2928664159,US +2928664160,2928664175,GB +2928664176,2928664191,US +2928664192,2928664207,GB +2928664208,2928664527,US +2928664528,2928664543,CA +2928664544,2928664639,US +2928664640,2928664671,GB +2928664672,2928665471,US +2928665472,2928665503,GB +2928665504,2928665535,US +2928665536,2928665567,GB +2928665568,2928665855,US +2928665856,2928665871,GB +2928665872,2928666031,US +2928666032,2928666047,SG +2928666048,2928666159,US +2928666160,2928666175,GB +2928666176,2928666303,US +2928666304,2928666319,AU +2928666320,2928666335,US +2928666336,2928666351,GB +2928666352,2928666591,US +2928666592,2928666607,AU +2928666608,2936012799,US +2936012800,2937847807,CN +2937847808,2937848831,KH +2937848832,2937849855,JP +2937849856,2937850879,SG +2937850880,2937851903,MY +2937851904,2937855999,JP +2937856000,2937860095,KR +2937860096,2937864191,JP +2937864192,2937880575,SG +2937880576,2937913343,JP +2937913344,2937978879,BD +2937978880,2938109951,CN +2938109952,2938634239,AU +2938634240,2938699775,IN +2938699776,2938703871,KR +2938703872,2938707967,HK +2938707968,2938710015,JP +2938710016,2938712063,AU +2938712064,2938716159,TW +2938716160,2938732543,JP +2938732544,2938765311,SG +2938765312,2938961919,CN +2938961920,2938978303,HK +2938978304,2938996735,AU +2938996736,2938998783,JP +2938998784,2939002879,AU +2939002880,2939004927,KR +2939004928,2939006975,JP +2939006976,2939007999,KP +2939008000,2939009023,IN +2939009024,2939011071,ID +2939011072,2939027455,KR +2939027456,2942304255,CN +2942304256,2942566399,TW +2942566400,2942599167,KH +2942599168,2942608383,IN +2942608384,2942609407,HK +2942609408,2942615551,IN +2942615552,2942619647,HK +2942619648,2942631935,JP +2942631936,2942697471,IN +2942697472,2942763007,CN +2942763008,2942767103,JP +2942767104,2942771199,AU +2942771200,2942779391,ID +2942795776,2942959615,JP +2942959616,2942960639,VN +2942960640,2942961663,AU +2942961664,2942965759,ID +2942965760,2942966783,AU +2942967808,2942975999,AF +2942976000,2942992383,KR +2942992384,2943025151,CN +2943025152,2943041535,PK +2943041536,2943057919,KR +2943057920,2943074303,AU +2943090688,2943221759,JP +2943221760,2943291391,PK +2943291392,2943295487,KR +2943295488,2943303679,TW +2943303680,2943309823,JP +2943309824,2943310847,ID +2943310848,2943311871,JP +2943311872,2943312895,HK +2943312896,2943313919,NZ +2943313920,2943314943,SG +2943314944,2943315967,BD +2943315968,2943318015,ID +2943318016,2943320063,JP +2943320064,2943336447,PK +2943336448,2943352831,TW +2943352832,2944401407,KR +2944401408,2944925695,JP +2944925696,2945581055,MY +2945581056,2946236415,CN +2946236416,2946301951,SG +2946301952,2946367487,LK +2946367488,2946375679,KR +2946375680,2946383871,ID +2946383872,2946392063,IN +2946392064,2946393087,BD +2946393088,2946394111,JP +2946394112,2946395135,AU +2946396160,2946400255,JP +2946400256,2946416639,NC +2946416640,2946433023,PH +2946433024,2946498559,HK +2946498560,2947547135,CN +2947547136,2947579903,PH +2947579904,2947583999,KR +2947584000,2947586047,TO +2947586048,2947588095,JP +2947588096,2947590143,ID +2947590144,2947592191,SG +2947592192,2947596287,HK +2947596288,2947597311,IN +2947597312,2947598335,JP +2947598336,2947602431,AU +2947602432,2947603455,NZ +2947603456,2947604479,TH +2947604480,2947612671,HK +2947612672,2947678207,JP +2947678208,2947743743,CN +2947743744,2947809279,JP +2947809280,2948071423,TW +2948071424,2948104191,JP +2948104192,2948120575,CN +2948120576,2948128767,AU +2948128768,2948132863,ID +2948132864,2948134911,TW +2948134912,2948135935,ID +2948135936,2948136959,IN +2948136960,2948595711,CN +2948595712,2952790015,KR +2986344448,2987393023,DE +2987393024,2987397119,IM +2987397120,2987401215,LV +2987401216,2987405311,LT +2987405312,2987409407,DE +2987409408,2987413503,NO +2987413504,2987417599,UA +2987417600,2987425791,PL +2987425792,2987429887,BG +2987429888,2987433215,RU +2987433216,2987433235,KZ +2987433236,2987433247,RU +2987433248,2987433279,KZ +2987433280,2987433983,RU +2987433984,2987438079,FR +2987438080,2987442175,FI +2987442176,2987446271,IE +2987446272,2987450367,SE +2987450368,2987454463,GB +2987454464,2987458559,FR +2987458560,2987462655,CZ +2987462656,2987466751,RS +2987466752,2987470847,GB +2987470848,2987474943,DE +2987474944,2987479039,GB +2987479040,2987487231,CZ +2987487232,2987491327,HR +2987491328,2987495423,RU +2987495424,2987499519,NO +2987499520,2987500103,MD +2987500104,2987500111,US +2987500112,2987500239,MD +2987500240,2987500255,DE +2987500256,2987503615,MD +2987503616,2987511807,RU +2987511808,2987515903,JO +2987515904,2987519999,A2 +2987520000,2987524095,GB +2987524096,2987528191,RU +2987528192,2987529215,US +2987529216,2987532287,NL +2987532288,2987536383,MD +2987536384,2987540479,FR +2987540480,2987544575,SK +2987544576,2987548671,NL +2987548672,2987552767,RU +2987552768,2987556863,GB +2987556864,2987560959,NL +2987565056,2987569151,AT +2987569152,2987573247,FR +2987573248,2987577343,TR +2987577344,2987585535,RU +2987585536,2987585791,DE +2987585792,2987585799,PA +2987585800,2987585807,CZ +2987585808,2987585815,ES +2987585816,2987585823,IT +2987585824,2987585831,FR +2987585832,2987585839,US +2987585840,2987585847,DK +2987585848,2987585855,SE +2987585856,2987585863,RU +2987585864,2987585871,GB +2987585872,2987585879,IT +2987585880,2987585887,FR +2987585888,2987585895,PL +2987585896,2987589631,DE +2987589632,2987593727,FR +2987593728,2987597823,LT +2987597824,2987601919,ES +2987601920,2987606015,IS +2987606016,2987606527,US +2987606528,2987610111,DE +2987610112,2987614207,RU +2987614208,2987618303,PL +2987618304,2987622399,NL +2987622400,2987626495,FR +2987626496,2987634687,IT +2987634688,2987638783,PL +2987638784,2987642879,FO +2987642880,2987651071,DE +2987651072,2987655167,RU +2987655168,2987658367,DE +2987658368,2987658383,AT +2987658384,2987659263,DE +2987659264,2987659519,BA +2987659520,2987661311,SI +2987661312,2987663359,GB +2987663360,2987665407,IT +2987665408,2987667455,RU +2987667456,2987669503,FR +2987669504,2987671551,NL +2987671552,2987673599,FR +2987673600,2987675647,IT +2987675648,2987677695,IE +2987677696,2987681791,DE +2987681792,2987683839,NO +2987683840,2987685887,IT +2987685888,2987687935,GR +2987687936,2987689983,RU +2987689984,2987692031,CZ +2987692032,2987694079,SA +2987694080,2987696127,UA +2987696128,2987698175,RS +2987698176,2987700223,NL +2987700224,2987702271,RU +2987702272,2987704319,JO +2987704320,2987706367,GB +2987706368,2987708415,RS +2987708416,2987710463,PT +2987710464,2987712511,DK +2987712512,2987714559,GB +2987714560,2987716607,RU +2987716608,2987718655,FR +2987718656,2987720703,NL +2987720704,2987722751,DE +2987722752,2987724799,RU +2987724800,2987726847,NL +2987726848,2987728895,RU +2987728896,2987730943,GB +2987730944,2987732991,IR +2987732992,2987735039,HU +2987735040,2987737087,ES +2987737088,2987739135,RU +2987739136,2987743231,SE +2987743232,2987745279,DK +2987745280,2987747327,IT +2987747328,2987749375,ES +2987749376,2987751423,NL +2987751424,2987753471,RO +2987753472,2987755519,NO +2987755520,2987757567,PL +2987757568,2987759615,DE +2987759616,2987761663,PL +2987761664,2987763711,DK +2987763712,2987765759,GR +2987765760,2987767807,FR +2987767808,2987769855,CZ +2987769856,2987771903,FI +2987771904,2987773951,IT +2987773952,2987775999,FR +2987776000,2987778047,NL +2987778048,2987780095,CH +2987780096,2987782143,GB +2987782144,2987784191,EE +2987784192,2987786239,DK +2987786240,2987788287,FR +2987788288,2987788543,GB +2987788544,2987790335,TR +2987790336,2987792383,GB +2987792384,2987794431,CH +2987794432,2987796479,IQ +2987796480,2987800575,RU +2987800576,2987802623,NL +2987802624,2987804671,CH +2987804672,2987806719,IR +2987806720,2987808767,NL +2987808768,2987810815,RU +2987810816,2987812863,NO +2987812864,2987814911,CH +2987814912,2987816959,CZ +2987816960,2987819007,NL +2987819008,2987821055,FR +2987821056,2987823103,GB +2987823104,2987827199,FR +2987827200,2987829247,GB +2987829248,2987831295,KZ +2987831296,2987833343,FR +2987833344,2987835391,IT +2987835392,2987837439,RU +2987837440,2987839487,SE +2987839488,2987841535,GB +2987841536,2987843583,RS +2987843584,2987845631,HU +2987845632,2987847679,NL +2987847680,2987849727,FR +2987849728,2987851775,IT +2987851776,2987853823,RU +2987853824,2987855871,IT +2987855872,2987857919,QA +2987857920,2987859967,DE +2987859968,2987862015,FR +2987862016,2987864063,BE +2987864064,2987866111,DE +2987866112,2987868159,ES +2987868160,2987870207,RO +2987870208,2987872255,GR +2987872256,2987874303,AT +2987874304,2987876351,SK +2987876352,2987878399,NO +2987878400,2987880447,PL +2987880448,2987882495,EE +2987882496,2987884543,DE +2987884544,2987886591,GB +2987886592,2987888639,UA +2987888640,2987890687,RU +2987890688,2987892735,FR +2987892736,2987894783,GB +2987894784,2987896831,CH +2987896832,2987898879,DK +2987898880,2987900927,NL +2987900928,2987902975,PL +2987902976,2987905023,IT +2987905024,2987907071,ES +2987907072,2987909119,CZ +2987909120,2987911167,RU +2987911168,2987913215,CZ +2987913216,2987915263,DK +2987915264,2987917311,IT +2987917312,2988179455,DE +2988179456,2988441599,SE +2988441600,2988441603,CH +2988441604,2988441655,FR +2988441656,2988441663,DE +2988441664,2988441839,FR +2988441840,2988441843,PL +2988441844,2988441847,BE +2988441848,2988441855,FR +2988441856,2988441887,IT +2988441888,2988441895,FR +2988441896,2988441903,PL +2988441904,2988441911,IT +2988441912,2988441983,FR +2988441984,2988441999,NL +2988442000,2988442003,FR +2988442004,2988442007,ES +2988442008,2988442047,FR +2988442048,2988442063,GB +2988442064,2988442067,FR +2988442068,2988442071,BE +2988442072,2988442075,FR +2988442076,2988442079,GB +2988442080,2988442399,FR +2988442400,2988442431,ES +2988442432,2988442439,CZ +2988442440,2988442447,ES +2988442448,2988442463,GB +2988442464,2988442895,FR +2988442896,2988442899,PL +2988442900,2988442903,FR +2988442904,2988442907,IT +2988442908,2988442911,FR +2988442912,2988442919,NL +2988442920,2988442923,LT +2988442924,2988442927,GB +2988442928,2988442975,FR +2988442976,2988443023,GB +2988443024,2988443027,FR +2988443028,2988443031,BE +2988443032,2988443035,GB +2988443036,2988443039,BE +2988443040,2988443055,PL +2988443056,2988443071,DE +2988443072,2988443087,ES +2988443088,2988443111,PL +2988443112,2988443119,ES +2988443120,2988443391,FR +2988443392,2988443407,GB +2988443408,2988443439,FR +2988443440,2988443443,CZ +2988443444,2988443447,DE +2988443448,2988443455,FR +2988443456,2988443487,BE +2988443488,2988443539,FR +2988443540,2988443547,ES +2988443548,2988443551,IT +2988443552,2988443555,FR +2988443556,2988443559,PL +2988443560,2988443563,GB +2988443564,2988443567,PL +2988443568,2988443583,FR +2988443584,2988443647,GB +2988443648,2988444167,FR +2988444168,2988444171,CZ +2988444172,2988444199,FR +2988444200,2988444203,DE +2988444204,2988444207,NL +2988444208,2988444415,FR +2988444416,2988444679,ES +2988444680,2988444695,PL +2988444696,2988444719,FR +2988444720,2988444735,ES +2988444736,2988444739,GB +2988444740,2988444755,BE +2988444756,2988444759,DE +2988444760,2988444767,IE +2988444768,2988444771,DE +2988444772,2988444775,GB +2988444776,2988444783,CZ +2988444784,2988444799,FR +2988444800,2988445055,ES +2988445056,2988445119,FR +2988445120,2988445151,IT +2988445152,2988445183,GB +2988445184,2988445951,DE +2988445952,2988445967,FR +2988445968,2988445983,GB +2988445984,2988446207,DE +2988446208,2988446271,PL +2988446272,2988446275,IT +2988446276,2988446279,GB +2988446280,2988446287,FR +2988446288,2988446303,GB +2988446304,2988446323,FR +2988446324,2988446327,LT +2988446328,2988446335,NL +2988446336,2988446399,PL +2988446400,2988446463,FR +2988446464,2988446719,PL +2988446720,2988446975,DE +2988446976,2988447103,IT +2988447104,2988447231,FR +2988447232,2988447871,DE +2988447872,2988447923,PL +2988447924,2988447927,IT +2988447928,2988447935,PL +2988447936,2988447943,DE +2988447944,2988447947,NL +2988447948,2988447951,DE +2988447952,2988447955,GB +2988447956,2988447959,BE +2988447960,2988447967,IT +2988447968,2988447999,GB +2988448000,2988448127,DE +2988448128,2988448255,ES +2988448256,2988448511,DE +2988448512,2988448519,FR +2988448520,2988448543,PL +2988448544,2988448559,FR +2988448560,2988448563,DE +2988448564,2988448567,ES +2988448568,2988448607,FR +2988448608,2988448639,ES +2988448640,2988448671,GB +2988448672,2988448691,IT +2988448692,2988448695,DE +2988448696,2988448699,IT +2988448700,2988448703,LT +2988448704,2988448767,GB +2988448768,2988448783,FR +2988448784,2988448815,PL +2988448816,2988448831,ES +2988448832,2988448895,FR +2988448896,2988448899,PT +2988448900,2988448903,PL +2988448904,2988448907,ES +2988448908,2988448959,FR +2988448960,2988448991,DE +2988448992,2988449007,FR +2988449008,2988449023,GB +2988449024,2988449055,PL +2988449056,2988449087,ES +2988449088,2988449103,PL +2988449104,2988449119,DE +2988449120,2988449123,FR +2988449124,2988449127,DE +2988449128,2988449135,ES +2988449136,2988449151,FR +2988449152,2988449279,PL +2988449280,2988449535,GB +2988449536,2988449663,PL +2988449664,2988449695,DE +2988449696,2988449727,IT +2988449728,2988449743,BE +2988449744,2988449759,GB +2988449760,2988449791,CH +2988449792,2988451839,FR +2988451840,2988453887,BE +2988453888,2988457983,GB +2988457984,2988457987,FR +2988457988,2988457991,PL +2988457992,2988458031,FR +2988458032,2988458047,IT +2988458048,2988458055,FR +2988458056,2988458063,CH +2988458064,2988458067,ES +2988458068,2988458075,FR +2988458076,2988458111,PL +2988458112,2988458255,FR +2988458256,2988458271,IT +2988458272,2988458287,PL +2988458288,2988458295,FR +2988458296,2988458299,GB +2988458300,2988458319,ES +2988458320,2988458323,CZ +2988458324,2988458331,FR +2988458332,2988458335,GB +2988458336,2988458367,DE +2988458368,2988458399,FR +2988458400,2988458431,PL +2988458432,2988458495,FR +2988458496,2988458751,GB +2988458752,2988459007,FR +2988459008,2988459015,PL +2988459016,2988459019,DE +2988459020,2988459023,GB +2988459024,2988459027,BE +2988459028,2988459031,CH +2988459032,2988459035,CZ +2988459036,2988459039,ES +2988459040,2988459051,FR +2988459052,2988459055,ES +2988459056,2988459071,CH +2988459072,2988459075,GB +2988459076,2988459079,ES +2988459080,2988459083,DE +2988459084,2988459087,FR +2988459088,2988459103,GB +2988459104,2988459111,FR +2988459112,2988459119,ES +2988459120,2988459127,IT +2988459128,2988459135,PL +2988459136,2988459167,IT +2988459168,2988459171,IE +2988459172,2988459183,FR +2988459184,2988459199,ES +2988459200,2988459215,FR +2988459216,2988459219,DE +2988459220,2988459223,FR +2988459224,2988459263,PL +2988459264,2988459519,ES +2988459520,2988459583,DE +2988459584,2988459599,FR +2988459600,2988459603,GB +2988459604,2988459615,FR +2988459616,2988459631,CZ +2988459632,2988459639,FR +2988459640,2988459643,IT +2988459644,2988459647,CH +2988459648,2988459711,FR +2988459712,2988459715,ES +2988459716,2988459723,FR +2988459724,2988459727,DE +2988459728,2988459731,FR +2988459732,2988459735,BE +2988459736,2988459743,PL +2988459744,2988459747,ES +2988459748,2988459751,PL +2988459752,2988460031,FR +2988460032,2988460063,DE +2988460064,2988460095,FR +2988460096,2988460103,ES +2988460104,2988460107,PL +2988460108,2988460111,DE +2988460112,2988460119,FR +2988460120,2988460123,DE +2988460124,2988460127,FR +2988460128,2988460131,PL +2988460132,2988460135,CZ +2988460136,2988460143,FR +2988460144,2988460159,ES +2988460160,2988460191,GB +2988460192,2988460195,FR +2988460196,2988460199,CZ +2988460200,2988460207,FR +2988460208,2988460223,PL +2988460224,2988460239,FR +2988460240,2988460243,BE +2988460244,2988460247,PL +2988460248,2988460255,FR +2988460256,2988460271,ES +2988460272,2988460275,FR +2988460276,2988460279,NL +2988460280,2988460287,PL +2988460288,2988460323,FR +2988460324,2988460335,PL +2988460336,2988460351,DE +2988460352,2988460375,GB +2988460376,2988460543,FR +2988460544,2988460547,GB +2988460548,2988460551,FR +2988460552,2988460575,PL +2988460576,2988460591,PT +2988460592,2988460607,GB +2988460608,2988460679,FR +2988460680,2988460683,GB +2988460684,2988460687,DE +2988460688,2988460719,FR +2988460720,2988460735,ES +2988460736,2988460759,FR +2988460760,2988460763,PT +2988460764,2988460767,FR +2988460768,2988460799,PL +2988460800,2988460863,CH +2988460864,2988460927,FR +2988460928,2988460931,DE +2988460932,2988460943,PL +2988460944,2988460959,DE +2988460960,2988460991,GB +2988460992,2988461055,FR +2988461056,2988461119,IE +2988461120,2988461151,NL +2988461152,2988461247,GB +2988461248,2988461255,FR +2988461256,2988461295,IT +2988461296,2988461299,PL +2988461300,2988461307,FR +2988461308,2988461311,PL +2988461312,2988461375,CH +2988461376,2988461391,FR +2988461392,2988461395,CH +2988461396,2988461399,DE +2988461400,2988461403,ES +2988461404,2988461407,GB +2988461408,2988461411,IT +2988461412,2988461415,NL +2988461416,2988461423,FR +2988461424,2988461431,IT +2988461432,2988461435,PT +2988461436,2988461439,BE +2988461440,2988461471,ES +2988461472,2988461475,PL +2988461476,2988461479,IE +2988461480,2988461483,CZ +2988461484,2988461487,LT +2988461488,2988461491,FR +2988461492,2988461495,PL +2988461496,2988461499,ES +2988461500,2988461503,BE +2988461504,2988461519,PL +2988461520,2988461523,GB +2988461524,2988461559,FR +2988461560,2988461567,GB +2988461568,2988461599,FR +2988461600,2988461615,BE +2988461616,2988461623,IT +2988461624,2988461695,FR +2988461696,2988461699,DE +2988461700,2988461703,FR +2988461704,2988461707,NL +2988461708,2988461711,BE +2988461712,2988461719,FR +2988461720,2988461723,GB +2988461724,2988461735,FR +2988461736,2988461747,DE +2988461748,2988461751,IT +2988461752,2988461755,FR +2988461756,2988461759,NL +2988461760,2988461791,PL +2988461792,2988461799,IT +2988461800,2988461811,DE +2988461812,2988461815,FR +2988461816,2988461819,PL +2988461820,2988461823,GB +2988461824,2988461855,NL +2988461856,2988461859,PL +2988461860,2988461871,DE +2988461872,2988461879,FR +2988461880,2988461883,CZ +2988461884,2988461887,IT +2988461888,2988461903,FR +2988461904,2988461911,ES +2988461912,2988461935,FR +2988461936,2988461951,GB +2988461952,2988462079,PL +2988462080,2988462095,CZ +2988462096,2988462127,FR +2988462128,2988462131,ES +2988462132,2988462143,FR +2988462144,2988462151,PL +2988462152,2988462155,IT +2988462156,2988462159,NL +2988462160,2988462191,PL +2988462192,2988462199,FR +2988462200,2988462203,PL +2988462204,2988462303,FR +2988462304,2988462307,DE +2988462308,2988462311,NL +2988462312,2988462319,FR +2988462320,2988462323,IT +2988462324,2988462327,DE +2988462328,2988462335,FR +2988462336,2988462463,ES +2988462464,2988462495,GB +2988462496,2988462527,DE +2988462528,2988462559,NL +2988462560,2988462587,FR +2988462588,2988462591,DE +2988462592,2988462599,FR +2988462600,2988462603,IT +2988462604,2988462607,ES +2988462608,2988462735,FR +2988462736,2988462743,IT +2988462744,2988462767,FR +2988462768,2988462775,GB +2988462776,2988462779,PL +2988462780,2988462783,FR +2988462784,2988462799,DE +2988462800,2988462815,FR +2988462816,2988462823,BE +2988462824,2988462847,FR +2988462848,2988463103,BE +2988463104,2988463107,IT +2988463108,2988463119,FR +2988463120,2988463127,GB +2988463128,2988463131,FR +2988463132,2988463135,PL +2988463136,2988463143,NL +2988463144,2988463147,FR +2988463148,2988463151,ES +2988463152,2988463159,FR +2988463160,2988463167,ES +2988463168,2988463199,NL +2988463200,2988463203,GB +2988463204,2988463207,DE +2988463208,2988463211,FR +2988463212,2988463223,GB +2988463224,2988463227,FR +2988463228,2988463231,CH +2988463232,2988463263,NL +2988463264,2988463279,PL +2988463280,2988463315,FR +2988463316,2988463319,DE +2988463320,2988463323,FR +2988463324,2988463331,DE +2988463332,2988463335,IT +2988463336,2988463339,PT +2988463340,2988463343,FR +2988463344,2988463359,BE +2988463360,2988463615,FR +2988463616,2988463623,DE +2988463624,2988463627,PL +2988463628,2988463631,FR +2988463632,2988463647,GB +2988463648,2988463651,PL +2988463652,2988463659,GB +2988463660,2988463663,FR +2988463664,2988463679,PL +2988463680,2988463743,FR +2988463744,2988463747,BE +2988463748,2988463759,FR +2988463760,2988463775,DE +2988463776,2988463791,PL +2988463792,2988463803,GB +2988463804,2988463823,FR +2988463824,2988463827,DE +2988463828,2988463831,ES +2988463832,2988463835,DE +2988463836,2988463839,FR +2988463840,2988463871,PL +2988463872,2988463915,FR +2988463916,2988463919,GB +2988463920,2988463947,FR +2988463948,2988463951,GB +2988463952,2988463999,FR +2988464000,2988464007,IE +2988464008,2988464015,LT +2988464016,2988464055,FR +2988464056,2988464059,ES +2988464060,2988464063,FR +2988464064,2988464095,PL +2988464096,2988464303,FR +2988464304,2988464307,IT +2988464308,2988464351,FR +2988464352,2988464355,DE +2988464356,2988464359,FR +2988464360,2988464363,PL +2988464364,2988464511,FR +2988464512,2988464519,PT +2988464520,2988464527,FR +2988464528,2988464543,DE +2988464544,2988464575,IT +2988464576,2988464607,FR +2988464608,2988464611,DE +2988464612,2988464615,PL +2988464616,2988464619,FR +2988464620,2988464623,ES +2988464624,2988464627,FR +2988464628,2988464631,IT +2988464632,2988464639,GB +2988464640,2988464783,FR +2988464784,2988464787,IT +2988464788,2988464791,ES +2988464792,2988464831,FR +2988464832,2988464895,ES +2988464896,2988464927,NL +2988464928,2988464947,FR +2988464948,2988464951,CH +2988464952,2988464955,FR +2988464956,2988464959,GB +2988464960,2988465215,FR +2988465216,2988465223,ES +2988465224,2988465235,FR +2988465236,2988465239,ES +2988465240,2988465279,FR +2988465280,2988465295,DE +2988465296,2988465299,IT +2988465300,2988465343,FR +2988465344,2988465363,DE +2988465364,2988465371,PL +2988465372,2988465375,FR +2988465376,2988465391,IT +2988465392,2988465407,FR +2988465408,2988465423,CH +2988465424,2988465439,FR +2988465440,2988465471,GB +2988465472,2988465503,FR +2988465504,2988465507,DE +2988465508,2988465511,PL +2988465512,2988465515,PT +2988465516,2988465519,GB +2988465520,2988465523,IT +2988465524,2988465527,ES +2988465528,2988465531,FR +2988465532,2988465535,GB +2988465536,2988465539,FR +2988465540,2988465543,GB +2988465544,2988465551,FR +2988465552,2988465559,ES +2988465560,2988465567,GB +2988465568,2988465571,ES +2988465572,2988465575,GB +2988465576,2988465583,DE +2988465584,2988465587,PL +2988465588,2988465591,ES +2988465592,2988465599,FR +2988465600,2988465615,PL +2988465616,2988465619,FR +2988465620,2988465623,ES +2988465624,2988465631,FR +2988465632,2988465647,IT +2988465648,2988465663,CZ +2988465664,2988466047,FR +2988466048,2988466111,PL +2988466112,2988466115,FR +2988466116,2988466127,NL +2988466128,2988466131,PT +2988466132,2988466139,FR +2988466140,2988466143,PL +2988466144,2988466175,NL +2988466176,2988507135,FR +2988507136,2988507183,DE +2988507184,2988507199,FR +2988507200,2988507203,GB +2988507204,2988507207,PL +2988507208,2988507211,ES +2988507212,2988507215,PL +2988507216,2988507231,FR +2988507232,2988507239,ES +2988507240,2988507243,FR +2988507244,2988507247,ES +2988507248,2988507263,FR +2988507264,2988507279,PL +2988507280,2988507287,GB +2988507288,2988507327,FR +2988507328,2988507335,DE +2988507336,2988507423,FR +2988507424,2988507431,PL +2988507432,2988507439,DE +2988507440,2988507443,IT +2988507444,2988507447,NL +2988507448,2988507451,PL +2988507452,2988507459,FR +2988507460,2988507463,BE +2988507464,2988507467,CH +2988507468,2988507471,ES +2988507472,2988507475,FR +2988507476,2988507479,GB +2988507480,2988507483,IE +2988507484,2988507487,IT +2988507488,2988507503,FR +2988507504,2988507519,IT +2988507520,2988507527,PL +2988507528,2988507531,DE +2988507532,2988507535,PL +2988507536,2988507539,FR +2988507540,2988507543,PL +2988507544,2988507551,FR +2988507552,2988507567,GB +2988507568,2988507583,IE +2988507584,2988507591,ES +2988507592,2988507595,FR +2988507596,2988507599,DE +2988507600,2988507603,ES +2988507604,2988507607,FR +2988507608,2988507611,ES +2988507612,2988507615,DE +2988507616,2988507623,IT +2988507624,2988507627,GB +2988507628,2988507631,PT +2988507632,2988507639,IT +2988507640,2988507643,FR +2988507644,2988507647,IT +2988507648,2988507711,DE +2988507712,2988507775,IT +2988507776,2988507839,IE +2988507840,2988507855,FR +2988507856,2988507859,BE +2988507860,2988507867,PL +2988507868,2988507875,ES +2988507876,2988507879,FR +2988507880,2988507883,ES +2988507884,2988507887,GB +2988507888,2988507903,ES +2988507904,2988507919,PL +2988507920,2988507923,DE +2988507924,2988507927,IT +2988507928,2988507935,BE +2988507936,2988507951,FR +2988507952,2988507955,DE +2988507956,2988507959,BE +2988507960,2988507967,PL +2988507968,2988507971,FR +2988507972,2988507975,PL +2988507976,2988507979,FR +2988507980,2988507983,DE +2988507984,2988507999,FR +2988508000,2988508031,NL +2988508032,2988508063,DE +2988508064,2988508067,FR +2988508068,2988508071,PL +2988508072,2988508079,FR +2988508080,2988508095,ES +2988508096,2988508103,FR +2988508104,2988508127,GB +2988508128,2988508135,PL +2988508136,2988508143,GB +2988508144,2988508151,FR +2988508152,2988508155,ES +2988508156,2988508159,PL +2988508160,2988508219,FR +2988508220,2988508223,DE +2988508224,2988508287,FR +2988508288,2988508303,PL +2988508304,2988508315,FR +2988508316,2988508319,ES +2988508320,2988508343,FR +2988508344,2988508367,ES +2988508368,2988508383,FR +2988508384,2988508399,PL +2988508400,2988508415,ES +2988508416,2988508431,PT +2988508432,2988508435,FR +2988508436,2988508439,DE +2988508440,2988508447,PL +2988508448,2988508479,FR +2988508480,2988508543,PT +2988508544,2988508607,GB +2988508608,2988508671,IT +2988508672,2988508679,DE +2988508680,2988508683,CZ +2988508684,2988508687,DE +2988508688,2988508703,PL +2988508704,2988508711,GB +2988508712,2988508715,DE +2988508716,2988508719,GB +2988508720,2988508847,FR +2988508848,2988508855,GB +2988508856,2988508871,FR +2988508872,2988508875,PL +2988508876,2988508879,DE +2988508880,2988508895,ES +2988508896,2988508911,PL +2988508912,2988508915,FR +2988508916,2988508919,GB +2988508920,2988508923,IE +2988508924,2988508927,IT +2988508928,2988508931,LT +2988508932,2988508939,NL +2988508940,2988508943,PL +2988508944,2988508947,PT +2988508948,2988508951,FR +2988508952,2988508959,IT +2988508960,2988508975,DE +2988508976,2988508991,NL +2988508992,2988509023,FR +2988509024,2988509055,ES +2988509056,2988509119,IT +2988509120,2988509151,GB +2988509152,2988509183,ES +2988509184,2988509279,FR +2988509280,2988509283,DE +2988509284,2988509287,IT +2988509288,2988509291,BE +2988509292,2988509295,FR +2988509296,2988509311,DE +2988509312,2988509343,FR +2988509344,2988509351,BE +2988509352,2988509355,NL +2988509356,2988509363,DE +2988509364,2988509367,IT +2988509368,2988509371,CH +2988509372,2988509375,PL +2988509376,2988509407,FR +2988509408,2988509411,PL +2988509412,2988509415,DE +2988509416,2988509419,ES +2988509420,2988509443,FR +2988509444,2988509451,ES +2988509452,2988509455,PL +2988509456,2988509467,FR +2988509468,2988509471,NL +2988509472,2988509503,FR +2988509504,2988509507,PL +2988509508,2988509511,FR +2988509512,2988509515,GB +2988509516,2988509535,FR +2988509536,2988509543,ES +2988509544,2988509547,PL +2988509548,2988509551,GB +2988509552,2988509575,FR +2988509576,2988509583,PL +2988509584,2988509619,FR +2988509620,2988509623,DE +2988509624,2988509627,CZ +2988509628,2988509631,IT +2988509632,2988509711,FR +2988509712,2988509715,IE +2988509716,2988509719,GB +2988509720,2988509727,IT +2988509728,2988509743,FR +2988509744,2988509751,ES +2988509752,2988509759,DE +2988509760,2988509767,PL +2988509768,2988509775,IT +2988509776,2988509779,DE +2988509780,2988509783,GB +2988509784,2988509787,FR +2988509788,2988509791,ES +2988509792,2988509823,NL +2988509824,2988509839,FR +2988509840,2988509855,ES +2988509856,2988509859,FR +2988509860,2988509871,DE +2988509872,2988509903,FR +2988509904,2988509907,PL +2988509908,2988509919,IT +2988509920,2988509931,FR +2988509932,2988509951,PL +2988509952,2988509955,IT +2988509956,2988509963,DE +2988509964,2988509967,GB +2988509968,2988509983,ES +2988509984,2988509995,FR +2988509996,2988509999,DE +2988510000,2988510015,PL +2988510016,2988510023,ES +2988510024,2988510031,FR +2988510032,2988510079,PL +2988510080,2988510111,NL +2988510112,2988510143,CZ +2988510144,2988510175,NL +2988510176,2988510207,ES +2988510208,2988510211,FR +2988510212,2988510215,DE +2988510216,2988510255,FR +2988510256,2988510259,GB +2988510260,2988510263,FR +2988510264,2988510271,PL +2988510272,2988510287,FR +2988510288,2988510303,PL +2988510304,2988510307,ES +2988510308,2988510311,FR +2988510312,2988510319,BE +2988510320,2988510323,FR +2988510324,2988510327,GB +2988510328,2988510399,FR +2988510400,2988510403,DE +2988510404,2988510407,FR +2988510408,2988510415,PL +2988510416,2988510431,FR +2988510432,2988510435,IT +2988510436,2988510751,FR +2988510752,2988510759,PL +2988510760,2988510767,FR +2988510768,2988510775,ES +2988510776,2988510847,FR +2988510848,2988510911,PL +2988510912,2988510943,FR +2988510944,2988510975,GB +2988510976,2988510991,PL +2988510992,2988511007,FR +2988511008,2988511015,PL +2988511016,2988511023,IT +2988511024,2988511071,FR +2988511072,2988511079,PL +2988511080,2988511083,FR +2988511084,2988511087,PL +2988511088,2988511103,FR +2988511104,2988511167,PL +2988511168,2988511183,FR +2988511184,2988511187,CZ +2988511188,2988511191,GB +2988511192,2988511487,FR +2988511488,2988511551,PL +2988511552,2988511559,FR +2988511560,2988511567,GB +2988511568,2988511575,FR +2988511576,2988511583,GB +2988511584,2988511663,FR +2988511664,2988511671,DE +2988511672,2988511675,FR +2988511676,2988511679,GB +2988511680,2988511683,NL +2988511684,2988511687,ES +2988511688,2988511691,DE +2988511692,2988511695,FR +2988511696,2988511699,BE +2988511700,2988511703,IT +2988511704,2988511711,PL +2988511712,2988511719,DE +2988511720,2988511723,FR +2988511724,2988511727,GB +2988511728,2988511735,FR +2988511736,2988511739,DE +2988511740,2988511999,FR +2988512000,2988512031,PL +2988512032,2988512055,FR +2988512056,2988512059,PL +2988512060,2988512063,FR +2988512064,2988512095,CH +2988512096,2988512127,FR +2988512128,2988512143,PL +2988512144,2988512151,GB +2988512152,2988512155,ES +2988512156,2988512159,FR +2988512160,2988512191,GB +2988512192,2988512199,FR +2988512200,2988512207,ES +2988512208,2988512239,FR +2988512240,2988512247,LT +2988512248,2988512251,GB +2988512252,2988512255,ES +2988512256,2988512287,FR +2988512288,2988512303,PL +2988512304,2988512307,IT +2988512308,2988512311,GB +2988512312,2988512315,FR +2988512316,2988512319,DE +2988512320,2988512335,FR +2988512336,2988512339,PL +2988512340,2988512343,ES +2988512344,2988512351,FR +2988512352,2988512383,IT +2988512384,2988512415,FR +2988512416,2988512435,PL +2988512436,2988512439,FR +2988512440,2988512447,NL +2988512448,2988512455,PL +2988512456,2988512459,ES +2988512460,2988512467,FR +2988512468,2988512471,GB +2988512472,2988512479,FR +2988512480,2988512483,ES +2988512484,2988512523,FR +2988512524,2988512527,IT +2988512528,2988512543,FR +2988512544,2988512551,PL +2988512552,2988512579,FR +2988512580,2988512583,ES +2988512584,2988512587,FR +2988512588,2988512591,PL +2988512592,2988512595,BE +2988512596,2988512599,ES +2988512600,2988512607,PT +2988512608,2988512639,FR +2988512640,2988512647,GB +2988512648,2988512651,ES +2988512652,2988512655,DE +2988512656,2988512663,PT +2988512664,2988512667,FR +2988512668,2988512671,ES +2988512672,2988512687,FR +2988512688,2988512703,PL +2988512704,2988512767,FR +2988512768,2988512831,PL +2988512832,2988512835,FR +2988512836,2988512839,ES +2988512840,2988512847,DE +2988512848,2988512879,FR +2988512880,2988512895,DE +2988512896,2988512899,PL +2988512900,2988512907,GB +2988512908,2988512911,LT +2988512912,2988512919,FR +2988512920,2988512927,CH +2988512928,2988512943,FR +2988512944,2988512951,GB +2988512952,2988512955,FR +2988512956,2988512959,LT +2988512960,2988512975,BE +2988512976,2988512995,FR +2988512996,2988512999,GB +2988513000,2988513003,FR +2988513004,2988513007,PL +2988513008,2988513015,IT +2988513016,2988513019,GB +2988513020,2988513023,NL +2988513024,2988513151,FR +2988513152,2988513183,ES +2988513184,2988513191,DE +2988513192,2988513195,FR +2988513196,2988513199,ES +2988513200,2988513207,PT +2988513208,2988513219,FR +2988513220,2988513223,DE +2988513224,2988513227,PT +2988513228,2988513271,FR +2988513272,2988513275,DE +2988513276,2988513279,CH +2988513280,2988513283,FR +2988513284,2988513287,ES +2988513288,2988513307,FR +2988513308,2988513311,PL +2988513312,2988513327,PT +2988513328,2988513331,ES +2988513332,2988513335,FR +2988513336,2988513343,GB +2988513344,2988513351,ES +2988513352,2988513359,IT +2988513360,2988513375,GB +2988513376,2988513391,IT +2988513392,2988513407,GB +2988513408,2988513471,PL +2988513472,2988513503,FR +2988513504,2988513507,CH +2988513508,2988513511,DE +2988513512,2988513515,FR +2988513516,2988513519,DE +2988513520,2988513535,GB +2988513536,2988513551,DE +2988513552,2988513555,IT +2988513556,2988513567,FR +2988513568,2988513575,GB +2988513576,2988513583,PL +2988513584,2988513599,IE +2988513600,2988513671,FR +2988513672,2988513675,ES +2988513676,2988513679,FR +2988513680,2988513683,ES +2988513684,2988513691,FR +2988513692,2988513695,DE +2988513696,2988513723,FR +2988513724,2988513727,DE +2988513728,2988513731,FR +2988513732,2988513735,BE +2988513736,2988513743,DE +2988513744,2988513759,GB +2988513760,2988513879,FR +2988513880,2988513883,ES +2988513884,2988513895,FR +2988513896,2988513899,IT +2988513900,2988513903,PL +2988513904,2988513951,FR +2988513952,2988513983,PT +2988513984,2988514015,GB +2988514016,2988514019,FR +2988514020,2988514023,NL +2988514024,2988514031,IE +2988514032,2988514111,FR +2988514112,2988514115,DE +2988514116,2988514119,FR +2988514120,2988514127,PT +2988514128,2988514131,IE +2988514132,2988514135,IT +2988514136,2988514159,FR +2988514160,2988514163,IT +2988514164,2988514167,DE +2988514168,2988514171,FR +2988514172,2988514175,DE +2988514176,2988514207,FR +2988514208,2988514211,ES +2988514212,2988514219,FR +2988514220,2988514227,GB +2988514228,2988514231,FR +2988514232,2988514239,GB +2988514240,2988514243,FR +2988514244,2988514251,GB +2988514252,2988514255,FR +2988514256,2988514271,ES +2988514272,2988514279,FR +2988514280,2988514283,PL +2988514284,2988514287,GB +2988514288,2988514303,ES +2988514304,2988514335,FR +2988514336,2988514339,IE +2988514340,2988514343,FR +2988514344,2988514351,GB +2988514352,2988514399,FR +2988514400,2988514431,GB +2988514432,2988514447,FR +2988514448,2988514463,ES +2988514464,2988514527,FR +2988514528,2988514559,GB +2988514560,2988514623,FR +2988514624,2988514655,DE +2988514656,2988514671,FR +2988514672,2988514675,GB +2988514676,2988514679,IT +2988514680,2988514687,FR +2988514688,2988514719,GB +2988514720,2988514735,DE +2988514736,2988514739,FR +2988514740,2988514743,ES +2988514744,2988514747,BE +2988514748,2988514751,IT +2988514752,2988514815,FI +2988514816,2988514831,FR +2988514832,2988514839,PL +2988514840,2988514879,ES +2988514880,2988514943,PL +2988514944,2988514959,ES +2988514960,2988514975,PL +2988514976,2988514979,BE +2988514980,2988514983,PL +2988514984,2988514991,IT +2988514992,2988514999,FR +2988515000,2988515007,PL +2988515008,2988515039,FR +2988515040,2988515071,GB +2988515072,2988515327,FR +2988515328,2988517375,DE +2988517376,2988519423,FR +2988519424,2988521471,PL +2988521472,2988539935,FR +2988539936,2988539967,GB +2988539968,2988539971,ES +2988539972,2988539975,IT +2988539976,2988539983,DE +2988539984,2988540003,PL +2988540004,2988540007,CZ +2988540008,2988540023,FR +2988540024,2988540027,PL +2988540028,2988540031,ES +2988540032,2988540207,FR +2988540208,2988540211,GB +2988540212,2988540215,DE +2988540216,2988540219,FR +2988540220,2988540223,GB +2988540224,2988540255,BE +2988540256,2988540271,PL +2988540272,2988540287,FR +2988540288,2988540303,BE +2988540304,2988540319,FR +2988540320,2988540351,PT +2988540352,2988540363,FR +2988540364,2988540367,PL +2988540368,2988540375,FR +2988540376,2988540379,GB +2988540380,2988540423,FR +2988540424,2988540427,GB +2988540428,2988540431,NL +2988540432,2988540435,FR +2988540436,2988540439,DE +2988540440,2988540447,PL +2988540448,2988540451,IT +2988540452,2988540455,FR +2988540456,2988540459,DE +2988540460,2988540463,ES +2988540464,2988540471,PL +2988540472,2988540479,DE +2988540480,2988540483,FR +2988540484,2988540487,DE +2988540488,2988540491,ES +2988540492,2988540503,FR +2988540504,2988540507,DE +2988540508,2988540511,ES +2988540512,2988540543,FR +2988540544,2988540607,PL +2988540608,2988540639,FR +2988540640,2988540647,PL +2988540648,2988540651,GB +2988540652,2988540663,PL +2988540664,2988540671,IT +2988540672,2988540679,PL +2988540680,2988540683,IT +2988540684,2988540715,FR +2988540716,2988540719,PL +2988540720,2988540735,DE +2988540736,2988540751,ES +2988540752,2988540759,PL +2988540760,2988540763,GB +2988540764,2988540767,DE +2988540768,2988540775,GB +2988540776,2988540783,BE +2988540784,2988540787,ES +2988540788,2988540791,DE +2988540792,2988540795,FR +2988540796,2988540799,GB +2988540800,2988540831,FR +2988540832,2988540839,PL +2988540840,2988540847,GB +2988540848,2988540855,FR +2988540856,2988540863,ES +2988540864,2988540931,FR +2988540932,2988540935,DE +2988540936,2988540943,FR +2988540944,2988540959,ES +2988540960,2988540975,FR +2988540976,2988540991,GB +2988540992,2988541055,ES +2988541056,2988541087,FR +2988541088,2988541103,BE +2988541104,2988541111,ES +2988541112,2988541119,DE +2988541120,2988541131,FR +2988541132,2988541135,DE +2988541136,2988541143,GB +2988541144,2988541151,IT +2988541152,2988541215,FR +2988541216,2988541231,PT +2988541232,2988541235,DE +2988541236,2988541243,FR +2988541244,2988541247,GB +2988541248,2988541279,FR +2988541280,2988541311,NL +2988541312,2988541327,DE +2988541328,2988541335,PL +2988541336,2988541375,FR +2988541376,2988541391,BE +2988541392,2988541407,FR +2988541408,2988541423,BE +2988541424,2988541439,PL +2988541440,2988541443,IT +2988541444,2988541463,FR +2988541464,2988541467,ES +2988541468,2988541503,FR +2988541504,2988541519,CH +2988541520,2988541535,FR +2988541536,2988541551,GB +2988541552,2988541583,FR +2988541584,2988541587,ES +2988541588,2988541591,FR +2988541592,2988541599,PL +2988541600,2988541603,FR +2988541604,2988541607,NL +2988541608,2988541611,GB +2988541612,2988541615,IT +2988541616,2988541619,BE +2988541620,2988541623,CH +2988541624,2988541631,FR +2988541632,2988541647,PL +2988541648,2988541655,FR +2988541656,2988541659,ES +2988541660,2988541663,PL +2988541664,2988541679,FR +2988541680,2988541683,BE +2988541684,2988541687,DE +2988541688,2988541691,ES +2988541692,2988541695,IT +2988541696,2988541727,PL +2988541728,2988541735,FR +2988541736,2988541739,GB +2988541740,2988541743,FR +2988541744,2988541747,DE +2988541748,2988541751,ES +2988541752,2988541759,FR +2988541760,2988541763,BE +2988541764,2988541767,DE +2988541768,2988541775,PL +2988541776,2988541779,CH +2988541780,2988541783,FR +2988541784,2988541787,NL +2988541788,2988541791,FR +2988541792,2988541807,ES +2988541808,2988541823,FR +2988541824,2988541855,LT +2988541856,2988541887,IE +2988541888,2988541895,DE +2988541896,2988541899,FR +2988541900,2988541903,BE +2988541904,2988541907,DE +2988541908,2988541911,GB +2988541912,2988541935,PL +2988541936,2988541939,FR +2988541940,2988541943,FI +2988541944,2988541947,FR +2988541948,2988541951,ES +2988541952,2988541959,DE +2988541960,2988541963,CH +2988541964,2988541967,DE +2988541968,2988541983,FR +2988541984,2988542015,ES +2988542016,2988542019,GB +2988542020,2988542023,FR +2988542024,2988542027,NL +2988542028,2988542031,PL +2988542032,2988542055,FR +2988542056,2988542063,BE +2988542064,2988542067,GB +2988542068,2988572671,FR +2988572672,2988703743,RU +2988703744,2988834815,PL +2988834816,2988965887,CH +2988965888,2989096959,SK +2989096960,2989228031,PL +2989228032,2989490175,RU +2989555712,2989621247,RU +2989621248,2989752319,BE +2989752320,2989817855,SY +2989817856,2989883391,KW +2989883392,2989916159,UA +2989948928,2990014463,FI +2990014464,2990079999,PL +2990080000,2990145535,RU +2990145536,2990211071,SI +2990211072,2990276607,GR +2990276608,2990342143,ES +2990342144,2990407679,KW +2990407680,2990473215,RU +2990473216,2990518015,DE +2990518016,2990518079,IT +2990518080,2990525247,DE +2990525248,2990525311,ES +2990525312,2990534655,DE +2990534656,2990534783,EG +2990534784,2990535935,DE +2990535936,2990535967,PL +2990535968,2990538751,DE +2990538752,2991063039,RU +2991063040,2991067135,SE +2991067136,2991071231,DK +2991071232,2991079423,NO +2991079424,2991095807,RU +2991095808,2991112191,AM +2991112192,2991128575,CZ +2991128576,2991144959,PL +2991144960,2991161343,SA +2991161344,2991177727,FR +2991177728,2991182335,SE +2991182336,2991182591,GB +2991182592,2991185919,SE +2991185920,2991185951,GB +2991185952,2991186175,SE +2991186176,2991186207,GB +2991186208,2991186431,SE +2991186432,2991186463,GB +2991186464,2991186687,SE +2991186688,2991186719,GB +2991186720,2991186943,SE +2991186944,2991186975,GB +2991186976,2991187199,SE +2991187200,2991187231,GB +2991187232,2991187455,SE +2991187456,2991187487,GB +2991187488,2991187711,SE +2991187712,2991187743,GB +2991187744,2991187967,SE +2991187968,2991187999,GB +2991188000,2991188223,SE +2991188224,2991188255,GB +2991188256,2991188479,SE +2991188480,2991188511,GB +2991188512,2991188735,SE +2991188736,2991188767,GB +2991188768,2991188991,SE +2991188992,2991189023,GB +2991189024,2991189247,SE +2991189248,2991189279,GB +2991189280,2991189503,SE +2991189504,2991189535,GB +2991189536,2991189759,SE +2991189760,2991189791,GB +2991189792,2991190015,SE +2991190016,2991190047,GB +2991190048,2991190271,SE +2991190272,2991190303,GB +2991190304,2991190527,SE +2991190528,2991190559,GB +2991190560,2991190783,SE +2991190784,2991190815,GB +2991190816,2991191039,SE +2991191040,2991191071,GB +2991191072,2991191295,SE +2991191296,2991191327,GB +2991191328,2991191551,SE +2991191552,2991191583,GB +2991191584,2991191807,SE +2991191808,2991192063,FI +2991192064,2991192319,DK +2991192320,2991194111,SE +2991194112,2991210495,NO +2991210496,2991243263,RU +2991243264,2991259647,UA +2991259648,2991292415,RU +2991292416,2991308799,FI +2991308800,2991325183,BG +2991325184,2991341567,AZ +2991341568,2991357951,MD +2991357952,2991374335,DE +2991374336,2991390719,RU +2991390720,2991407103,BA +2991407104,2991423487,DE +2991423488,2991439871,JO +2991439872,2991456255,CZ +2991456256,2991472639,RU +2991472640,2991489023,GB +2991489024,2991505407,AM +2991505408,2991521791,SE +2991521792,2991538175,RS +2991538176,2991554559,SI +2991554560,2991571455,GB +2991571456,2991587327,IT +2991587328,2991718399,RU +2991718400,2991849471,CH +2991849472,2991980543,NL +2991980544,2991980807,UA +2991980808,2991980815,NA +2991980816,2991981063,UA +2991981064,2991981071,DE +2991981072,2991981311,UA +2991981312,2991981315,RU +2991981316,2991981375,UA +2991981376,2991981383,NA +2991981384,2991981415,UA +2991981416,2991981423,NA +2991981424,2991981439,UA +2991981440,2991981447,NA +2991981448,2991981463,UA +2991981464,2991981471,NA +2991981472,2991981495,UA +2991981496,2991981503,NA +2991981504,2991981583,UA +2991981584,2991981591,NA +2991981592,2991981631,UA +2991981632,2991981639,NA +2991981640,2991981647,UA +2991981648,2991981655,NA +2991981656,2991981687,UA +2991981688,2991981695,NA +2991981696,2991981839,UA +2991981840,2991981847,RU +2991981848,2991981911,UA +2991981912,2991981919,RU +2991981920,2991981935,UA +2991981936,2991981943,RU +2991981944,2991981951,US +2991981952,2991982535,UA +2991982536,2991982543,GL +2991982544,2991982592,UA +2991982593,2991982846,JP +2991982847,2992111615,UA +2992111616,2992373759,KZ +2992373760,2992635903,UA +2992635904,2993684479,GB +2993684480,2993946623,AT +2993946624,2994208767,BE +2994208768,2994733055,BY +2994733056,2994798591,GR +2994798592,2994929663,RU +2994929664,2994995199,IR +2994995200,2995060735,RU +2995060736,2995126271,UA +2995126272,2995191807,GE +2995191808,2995257343,LB +2995257344,2995388415,UA +2995388416,2995453951,RO +2995453952,2995519487,ES +2995519488,2995650559,RU +2995650560,2995716095,DE +2995716096,2995781631,SK +2995781632,2995912703,BE +2995912704,2996043775,GR +2996043776,2996174847,RS +2996174848,2996305919,UA +2996305920,2996436991,QA +2996436992,2996469759,BY +2996469760,2996479487,RU +2996479488,2996479491,US +2996479492,2996535295,RU +2996535296,2996568063,DK +2996568064,2996600831,ES +2996600832,2996633599,RO +2996633600,2996649983,IR +2996649984,2996666367,RO +2996666368,2996682751,RU +2996682752,2996699135,DK +2996764672,2996768767,NL +2996768768,2996772863,RU +2996772864,2996776959,UA +2996830208,2996862975,HR +2996862976,2996895743,AM +2996895744,2996928511,KW +2996928512,2996994047,RU +2996994048,2996994303,DE +2996994304,2996994815,BY +2996994816,2996994847,DE +2996994848,2996994879,SC +2996994880,2996994943,UA +2996994944,2996995071,US +2996995072,2996995327,BZ +2996995328,2996995647,DE +2996995648,2996995711,BZ +2996995712,2996995775,BY +2996995776,2996995839,RU +2996995840,2996996095,UA +2996996096,2996996127,DE +2996996128,2996996159,CA +2996996160,2996996287,DE +2996996288,2996996351,RU +2996996352,2996996383,DE +2996996384,2996996447,RU +2996996448,2996996575,UA +2996996576,2996996639,DE +2996996640,2996996767,UA +2996996768,2996996831,RU +2996996832,2996996863,DE +2996996864,2996997119,CN +2996997120,2996997375,MK +2996997376,2996997631,DE +2996997632,2996998143,BY +2996998144,2996998271,UA +2996998272,2996998527,DE +2996998528,2996998655,UA +2996998656,2996998719,DE +2996998720,2996998911,RU +2996998912,2996999231,DE +2996999232,2996999359,IN +2996999360,2996999679,DE +2996999680,2996999935,GB +2996999936,2997000063,DE +2997000064,2997000447,CN +2997000448,2997000703,RU +2997000704,2997000831,DE +2997000832,2997000959,CA +2997000960,2997001727,DE +2997001728,2997001983,UA +2997001984,2997003071,DE +2997003072,2997003135,RU +2997003136,2997003199,US +2997003200,2997003263,RU +2997003264,2997003295,DE +2997003296,2997003327,CA +2997003328,2997003391,RU +2997003392,2997003583,DE +2997003584,2997003647,UA +2997003648,2997004031,DE +2997004032,2997004287,BZ +2997004288,2997004543,US +2997004544,2997004607,DE +2997004608,2997004799,RU +2997004800,2997005055,BZ +2997005056,2997005183,GB +2997005184,2997005375,DE +2997005376,2997005439,GR +2997005440,2997005567,GB +2997005568,2997005823,BZ +2997005824,2997006079,DE +2997006080,2997006335,GB +2997006336,2997006591,TR +2997006592,2997006719,DE +2997006720,2997006847,RU +2997006848,2997008191,DE +2997008192,2997008255,GR +2997008256,2997008383,LT +2997008384,2997008447,DE +2997008448,2997008511,RU +2997008512,2997008639,LT +2997008640,2997008895,TR +2997008896,2997008959,DE +2997008960,2997009023,RU +2997009024,2997010431,DE +2997010432,2997018623,US +2997018624,2997019135,GB +2997019136,2997026815,DE +2997026816,2997059583,RU +2997059584,2997092351,BY +2997092352,2997125119,NO +2997125120,2997157887,HU +2997157888,2997190655,UA +2997190656,2997223423,AT +2997223424,2997256191,PT +2997256192,2997321727,RU +2997321728,2997354495,IE +2997354496,2997387263,MD +2997387264,2997420031,BY +2997420032,2997452799,RU +2997452800,2997485567,BG +2997485568,2997518335,FR +2997518336,2997528063,RU +2997528064,2997528319,UA +2997528320,2997583871,RU +2997583872,2997616639,SY +2997616640,2997649407,SI +2997649408,2997682175,BY +2997682176,2997714943,RU +2997714944,2997747711,IR +2997747712,2997780479,DE +2997780480,2997813247,SE +2997813248,2997846015,RS +2997846016,2997878783,MD +2997878784,2998140927,RU +2998140928,2998403071,PL +2998403072,2998665215,RU +2998665216,2998927359,AT +2998927360,2999451647,CH +2999451648,2999713791,DE +2999713792,2999975935,RU +2999975936,2999984127,FR +2999984128,2999985663,BE +2999985664,2999992319,NL +2999992320,3000000511,RU +3000000512,3000008703,DE +3000008704,3000016895,RU +3000016896,3000025087,GB +3000025088,3000033279,GI +3000033280,3000041471,RU +3000041472,3000049663,BA +3000049664,3000057855,CH +3000057856,3000066047,UA +3000066048,3000074239,RU +3000074240,3000082431,CZ +3000082432,3000090623,DK +3000090624,3000131583,RU +3000131584,3000139775,DE +3000139776,3000147967,UA +3000147968,3000156159,TR +3000156160,3000164351,UA +3000164352,3000172543,HU +3000172544,3000180735,RU +3000180736,3000188927,TR +3000188928,3000197119,IT +3000197120,3000213503,UA +3000213504,3000221695,RU +3000221696,3000229887,TR +3000229888,3000238079,CH +3000238080,3000240127,KZ +3000240128,3000242175,RU +3000242176,3000244223,AT +3000244224,3000246271,PL +3000246272,3000248319,RO +3000248320,3000252415,PL +3000252416,3000254463,RO +3000254464,3000256511,UA +3000256512,3000260607,RU +3000260608,3000262655,RS +3000262656,3000266751,UA +3000266752,3000268799,DE +3000268800,3000270847,PL +3000270848,3000272895,RU +3000272896,3000274943,IT +3000274944,3000283135,PL +3000283136,3000285183,RU +3000285184,3000287231,RO +3000287232,3000289279,UA +3000289280,3000291327,RO +3000369152,3000377343,PL +3000377344,3000385535,RU +3000385536,3000393727,PS +3000393728,3000401919,NL +3000434688,3000451071,IR +3000451072,3000467455,RU +3000467456,3000471551,GB +3000475648,3000483839,UA +3000483840,3000487935,PL +3000487936,3000492031,PS +3000492032,3000506367,UA +3000506368,3000508415,PL +3000508416,3000510463,UA +3000510464,3000512511,PL +3000512512,3000514559,EE +3000514560,3000516607,SI +3000516608,3000520703,RU +3000520704,3000522751,CZ +3000522752,3000524799,PL +3000524800,3000526847,UA +3000526848,3000528895,PL +3000528896,3000530943,IE +3000530944,3000532991,UA +3000532992,3000535039,UZ +3000535040,3000537087,PL +3000537088,3000539135,CZ +3000539136,3000543231,RU +3000543232,3000545279,UA +3000545280,3000547327,RU +3000547328,3000549375,UA +3000551424,3000553471,RS +3000553472,3000555519,KG +3000555520,3000557567,RU +3000557568,3000561663,UA +3000561664,3000563711,RO +3000563712,3000565759,CZ +3000565760,3000567807,RU +3000567808,3000569855,RS +3000569856,3000571903,BE +3000571904,3000573951,RU +3000573952,3000575999,PL +3000576000,3000586239,RU +3000586240,3000588287,NL +3000588288,3000590335,RO +3000590336,3000594431,RU +3000594432,3000596479,PL +3000596480,3000598527,RU +3000598528,3000600575,FI +3000600576,3000602623,PL +3000602624,3000604671,CZ +3000604672,3000606719,RU +3000606720,3000608767,UA +3000608768,3000610815,KG +3000610816,3000612863,RU +3000612864,3000616959,PL +3000616960,3000621055,UA +3000621056,3000623103,PL +3000623104,3000625151,RU +3000625152,3000627199,RO +3000627200,3000629247,CZ +3000629248,3000631295,PL +3000631296,3000647679,RU +3000647680,3000651775,UA +3000651776,3000664063,RU +3000664064,3000668159,RO +3000668160,3000672255,RU +3000672256,3000676351,HR +3000676352,3000680447,RO +3000680448,3000684543,RS +3000684544,3000688639,RU +3000688640,3000692735,PL +3000692736,3000696831,UA +3000696832,3000700927,RS +3000700928,3000705023,PL +3000705024,3000709119,RU +3000709120,3000713215,AM +3000713216,3000717311,A2 +3000717312,3000721407,UA +3000721408,3000729599,PL +3000729600,3000733695,NL +3000733696,3000737791,RU +3000737792,3000741887,UA +3000741888,3000745983,RU +3000745984,3000750079,UA +3000750080,3000754175,RU +3000754176,3000758271,IR +3000758272,3000762367,UA +3000762368,3001024511,RS +3001024512,3001548799,NL +3001548800,3001614335,NO +3001614336,3001679871,TR +3001679872,3001745407,RU +3001745408,3001810943,PL +3001810944,3001815039,IE +3001815040,3001819135,RU +3001819136,3001823231,IR +3001823232,3001827327,GE +3001827328,3001831423,SE +3001831424,3001835519,BA +3001835520,3001839615,RU +3001839616,3001843711,ES +3001843712,3001845759,RU +3001845760,3001851903,GB +3001851904,3001855999,IT +3001856000,3001858559,NL +3001858560,3001859071,RO +3001859072,3001859327,MD +3001859328,3001860095,NL +3001860096,3001864191,EE +3001864192,3001868287,RU +3001868288,3001872383,FR +3001872384,3001876479,RU +3001876480,3001880575,IT +3001880576,3001884671,RU +3001884672,3001884927,SE +3001884928,3001885055,NL +3001885056,3001885087,US +3001885088,3001888767,NL +3001888768,3001892863,BH +3001892864,3001896959,AZ +3001896960,3001901055,CH +3001901056,3001905151,FR +3001905152,3001909247,GB +3001909248,3001917439,ES +3001917440,3001921535,GB +3001921536,3001929727,RU +3001929728,3001933823,RS +3001933824,3001937919,ES +3001937920,3001942015,RU +3001942016,3001946111,BY +3001946112,3001950207,RU +3001950208,3001954303,CZ +3001954304,3001958399,IT +3001958400,3001962495,KZ +3001962496,3001966591,GB +3001966592,3001970687,NL +3001970688,3001974783,RU +3001974784,3001982975,GB +3001982976,3001987071,CH +3001987072,3001991167,JO +3001991168,3001995263,IR +3001995264,3001999359,HU +3001999360,3002003455,DE +3002003456,3002011647,PL +3002011648,3002015743,BA +3002015744,3002019839,IT +3002019840,3002020095,NL +3002020096,3002020159,SG +3002020160,3002023935,NL +3002023936,3002028031,DE +3002028032,3002036223,GB +3002036224,3002040319,BG +3002040320,3002044415,PL +3002073088,3002597375,TR +3002597376,3002599423,RU +3002599424,3002601471,CZ +3002601472,3002603519,IS +3002603520,3002605567,SE +3002605568,3002607615,GB +3002607616,3002609663,IR +3002609664,3002611711,IT +3002611712,3002613759,CZ +3002613760,3002615807,RU +3002615808,3002617855,PL +3002617856,3002619903,RU +3002619904,3002619911,GB +3002619912,3002619951,IT +3002619952,3002619967,GB +3002619968,3002619983,IT +3002619984,3002619991,GB +3002619992,3002620031,IT +3002620032,3002620039,DE +3002620040,3002621951,IT +3002621952,3002623999,NO +3002624000,3002628095,GB +3002628096,3002630143,NO +3002630144,3002632191,GB +3002632192,3002634239,EE +3002634240,3002636287,IT +3002636288,3002638335,NL +3002638336,3002640383,BE +3002640384,3002642431,NL +3002642432,3002644479,IT +3002644480,3002648575,FR +3002648576,3002650623,HU +3002650624,3002652671,FR +3002652672,3002654719,DE +3002654720,3002656767,NL +3002656768,3002658815,RU +3002658816,3002660863,DE +3002660864,3002662911,CZ +3002662912,3002664959,DE +3002664960,3002667007,ES +3002667008,3002669055,GE +3002669056,3002671103,DE +3002671104,3002673151,LV +3002673152,3002675199,GB +3002675200,3002677247,DK +3002677248,3002683391,RU +3002683392,3002685439,DE +3002685440,3002687487,MT +3002687488,3002688511,GB +3002688512,3002689535,NL +3002689536,3002691583,IL +3002691584,3002693631,MK +3002693632,3002695679,NO +3002695680,3002697727,RU +3002697728,3002699775,DE +3002699776,3002701823,SE +3002701824,3002703871,NL +3002703872,3002705919,DE +3002705920,3002707967,BG +3002707968,3002710015,KW +3002710016,3002712063,IT +3002712064,3002714111,LU +3002714112,3002716159,IT +3002716160,3002718207,CZ +3002718208,3002724351,IT +3002724352,3002726399,RU +3002726400,3002728447,NL +3002728448,3002730495,FR +3002730496,3002732543,DE +3002732544,3002734591,NL +3002734592,3002736639,CH +3002736640,3002738687,FR +3002738688,3002740735,PL +3002740736,3002742783,GB +3002742784,3002744831,LI +3002744832,3002746879,IT +3002746880,3002748927,GB +3002748928,3002750975,DE +3002750976,3002753023,TR +3002753024,3002755071,GB +3002755072,3002757119,FR +3002757120,3002759167,IE +3002759168,3002761215,DE +3002761216,3002763263,CH +3002763264,3002765311,RS +3002765312,3002767359,NL +3002767360,3002769407,RU +3002769408,3002773503,DE +3002773504,3002775551,GB +3002775552,3002777599,RO +3002777600,3002779647,NL +3002779648,3002781695,IT +3002781696,3002783743,FR +3002783744,3002785791,NO +3002785792,3002789887,DE +3002789888,3002791935,RU +3002791936,3002793983,AE +3002793984,3002796031,DK +3002796032,3002798079,DE +3002798080,3002800127,FR +3002800128,3002802175,NL +3002802176,3002804223,GB +3002804224,3002806271,TR +3002806272,3002808319,DE +3002808320,3002810367,FI +3002810368,3002812415,AT +3002812416,3002814463,IT +3002814464,3002816511,FR +3002816512,3002818559,DE +3002818560,3002820607,RU +3002820608,3002822655,UA +3002822656,3002824703,DE +3002824704,3002826751,NL +3002826752,3002828799,SE +3002828800,3002830847,RU +3002830848,3002834943,FI +3002834944,3002836991,LU +3002836992,3002841087,GB +3002841088,3002843135,CZ +3002843136,3002845183,NL +3002845184,3002847231,FR +3002847232,3002849279,IR +3002849280,3002851327,RU +3002851328,3002853375,DE +3002853376,3002855423,GB +3002855424,3002857471,SE +3002857472,3002859519,FR +3002859520,3002875903,PL +3002875904,3002892287,RU +3002892288,3002908671,IR +3002908672,3002925055,RU +3002925056,3002941439,IR +3002941440,3002957823,SY +3002957824,3002974207,SK +3002974208,3002990591,RS +3002990592,3003006975,DE +3003006976,3003023359,LU +3003023360,3003039743,RS +3003039744,3003056127,BG +3003056128,3003058175,DE +3003058176,3003058431,MT +3003058432,3003058687,FI +3003058688,3003060223,EE +3003060224,3003062271,DE +3003062272,3003064319,NL +3003064320,3003066367,RO +3003066368,3003068415,PL +3003068416,3003070463,NL +3003070464,3003074559,GB +3003074560,3003076607,IT +3003076608,3003080703,GB +3003080704,3003082751,FR +3003082752,3003084799,ES +3003084800,3003086847,IT +3003086848,3003088895,RU +3003088896,3003090943,FR +3003090944,3003092991,DE +3003092992,3003095039,NO +3003095040,3003097087,AT +3003097088,3003099135,FR +3003099136,3003101183,CZ +3003101184,3003103231,UA +3003103232,3003105279,IT +3003105280,3003107327,NL +3003107328,3003109375,RU +3003109376,3003111423,FR +3003111424,3003113471,IT +3003113472,3003115519,ES +3003115520,3003117567,RU +3003117568,3003119615,IT +3003119616,3003121663,RU +3019898880,3024093183,JP +3024093184,3024617471,KR +3024617472,3024879615,MY +3024879616,3025141759,CN +3025141760,3025403903,KR +3025403904,3025600511,CN +3025600512,3025649663,AP +3025649664,3025666047,IN +3025666048,3025928191,CN +3025928192,3025932287,TW +3025932288,3025944575,JP +3025944576,3025960959,KR +3025960960,3025969151,PK +3025969152,3025973247,IN +3025973248,3025974271,AU +3025975296,3025977343,SG +3025977344,3025979391,AU +3025979392,3025981439,IN +3025981440,3025985535,AU +3025985536,3025989631,BD +3025989632,3025993727,KR +3025993728,3026059263,VN +3026059264,3026067455,PH +3026067456,3026068479,BD +3026068480,3026069503,PH +3026069504,3026071551,JP +3026071552,3026073599,AP +3026073600,3026075647,CN +3026075648,3026083839,AF +3026083840,3026087935,CN +3026087936,3026089983,AU +3026089984,3026092031,MN +3026092032,3026108415,MO +3026108416,3026114559,JP +3026114560,3026115583,SG +3026115584,3026116607,AU +3026116608,3026118655,HK +3026118656,3026120703,AU +3026120704,3026124799,JP +3026124800,3026157567,AU +3026157568,3028287487,CN +3028287488,3028353023,TH +3028353024,3028385791,SG +3028385792,3028484095,CN +3028484096,3028500479,KR +3028500480,3028516863,JP +3028516864,3028518911,AU +3028520960,3028521983,ID +3028521984,3028523007,LA +3028523008,3028525055,JP +3028525056,3028533247,HK +3028533248,3028549631,JP +3028549632,3028811775,KR +3028811776,3029336063,CN +3029336064,3029598207,JP +3029598208,3029600255,VN +3029600256,3029601279,AU +3029604352,3029605375,AU +3029606400,3029614591,IN +3029614592,3029622783,AU +3029630976,3029635071,VN +3029635072,3029637119,JP +3029637120,3029639167,BD +3029639168,3029643263,JP +3029643264,3029644287,AU +3029645312,3029651455,JP +3029651456,3029654527,BD +3029654528,3029655551,IN +3029655552,3029663743,CN +3029663744,3029671935,BD +3029671936,3029680127,IN +3029680128,3029696511,MN +3029696512,3029704703,CN +3029704704,3029712895,JP +3029712896,3029713919,AU +3029714944,3029716991,JP +3029716992,3029721087,PK +3029721088,3029725183,AP +3029725184,3029727231,IN +3029727232,3029728255,AU +3029728256,3029729279,HK +3029729280,3029762047,AU +3029762048,3029770239,HK +3029770240,3029778431,CN +3029778432,3029788671,KR +3029788672,3029790719,ID +3029790720,3029791743,IN +3029791744,3029792767,ID +3029792768,3029793791,IN +3029793792,3029794815,PG +3029794816,3029860351,IN +3029860352,3031433215,CN +3031433216,3031564287,TW +3031564288,3031572479,IN +3031572480,3031580671,HK +3031580672,3031581695,AU +3031582720,3031584767,SG +3031584768,3031587839,JP +3031587840,3031592959,ID +3031592960,3031595007,HK +3031595008,3031596031,AU +3031597056,3031613439,PK +3031613440,3031629823,CN +3031629824,3031695359,IN +3031695360,3031760895,TH +3031760896,3031826431,AU +3031826432,3031891967,KR +3031891968,3031957503,TH +3031957504,3032252415,CN +3032252416,3032271871,HK +3032271872,3032272895,AU +3032272896,3032276991,JP +3032276992,3032285183,IN +3032285184,3032301567,JP +3032301568,3032317951,KR +3032317952,3032319999,JP +3032320000,3032321023,AU +3032322048,3032323071,AU +3032323072,3032324095,CN +3032324096,3032326143,AU +3032326144,3032330239,TL +3032330240,3032334335,KR +3032334336,3032342527,NZ +3032350720,3032743935,PH +3032743936,3033038847,JP +3033038848,3033063423,AU +3033063424,3033065471,JP +3033065472,3033066495,MY +3033066496,3033067519,BD +3033067520,3033068543,IN +3033068544,3033069567,AU +3033069568,3033070591,JP +3033070592,3033268223,CN +3033268224,3033530367,TW +3033530368,3033661439,CN +3033661440,3033694207,KR +3033694208,3033710591,BD +3033710592,3033712639,KR +3033712640,3033714687,SG +3033714688,3033715711,NZ +3033716736,3033717759,TH +3033717760,3033718783,BD +3033718784,3033726975,CN +3033726976,3033743359,KR +3033743360,3033745407,IN +3033745408,3033747455,JP +3033747456,3033748479,IN +3033748480,3033749503,JP +3033749504,3033751551,ID +3033751552,3033759743,IN +3033759744,3033792511,BD +3033792512,3033923583,CN +3033923584,3033939967,JP +3033939968,3033948159,AU +3033956352,3033964543,IN +3033964544,3033966591,HK +3033966592,3033968639,AU +3033968640,3033972735,TW +3033972736,3033980927,TH +3033980928,3033982975,JP +3033982976,3033983999,ID +3033984000,3033985023,VN +3033985024,3033989119,ID +3033989120,3034054655,IN +3034054656,3034120191,AU +3034120192,3034251263,TW +3034251264,3034316799,HK +3034316800,3034447871,JP +3034447872,3034456063,AU +3034464256,3034465279,NZ +3034466304,3034472447,JP +3034472448,3034480639,IN +3034480640,3034482687,SG +3034482688,3034484735,AF +3034484736,3034488831,TH +3034488832,3034492927,AU +3034497024,3034498047,AU +3034499072,3034500095,HK +3034500096,3034501119,TW +3034501120,3034502143,VU +3034503168,3034504191,ID +3034504192,3034505215,KR +3034505216,3034578943,CN +3034578944,3035103231,KR +3035103232,3035168767,PH +3035168768,3035193343,CN +3035193344,3035197439,JP +3035197440,3035199487,AP +3035199488,3035200511,IN +3035201536,3035202559,AU +3035202560,3035205631,JP +3035205632,3035207679,MY +3035207680,3035209727,ID +3035209728,3035217919,HK +3035217920,3035234303,KR +3035234304,3035299839,BD +3035299840,3035316223,JP +3035316224,3035324415,CN +3035324416,3035326463,JP +3035326464,3035327487,AU +3035328512,3035332607,BD +3035332608,3035333631,AU +3035334656,3035335679,AU +3035335680,3035337727,JP +3035337728,3035338751,ID +3035338752,3035339007,SG +3035339008,3035339263,IN +3035339264,3035339775,HK +3035340800,3035348991,MN +3035348992,3035357183,AU +3035365376,3035627519,KR +3035627520,3036676095,ID +3053453312,3054501887,ID +3054501888,3054534655,HK +3054534656,3054537727,PH +3054537728,3054538751,SG +3054538752,3054540799,BD +3054540800,3054541823,NZ +3054541824,3054542847,BD +3054542848,3054551039,ID +3054551040,3054559231,CN +3054559232,3054561279,JP +3054561280,3054562303,SG +3054562304,3054563327,JP +3054563328,3054567423,ID +3054567424,3054632959,TH +3054632960,3054665727,CN +3054665728,3054682111,IN +3054682112,3054698495,PH +3054698496,3054731263,IN +3054764032,3054960639,JP +3054960640,3054993407,ID +3054993408,3054997503,IN +3054997504,3055001599,SG +3055001600,3055005695,ID +3055005696,3055007743,NZ +3055009792,3055011839,AU +3055013888,3055014911,JP +3055014912,3055015935,AU +3055015936,3055026175,JP +3055026176,3055550463,ID +3055550464,3056599039,CN +3056599040,3056615423,JP +3056615424,3056623615,BD +3056623616,3056631807,CN +3056631808,3056639999,NZ +3056648192,3056664575,IN +3056664576,3056734207,CN +3056734208,3056746495,KR +3056746496,3056747519,NP +3056747520,3056748543,BD +3056748544,3056749567,WS +3056750592,3056754687,TH +3056754688,3056758783,JP +3056758784,3056762879,CN +3056762880,3056771071,SG +3056771072,3056772095,NZ +3056773120,3056774143,WS +3056775168,3056779263,AP +3056779264,3056791551,JP +3056791552,3056795647,ID +3056795648,3056861183,CN +3056861184,3056992255,TH +3056992256,3057025023,CN +3057025024,3057033215,PH +3057033216,3057037311,NZ +3057041408,3057049599,MY +3057049600,3057053695,AU +3057053696,3057054719,JP +3057054720,3057055743,HK +3057055744,3057057791,JP +3057057792,3057123327,SG +3057123328,3057451007,IN +3057451008,3057516543,CN +3057516544,3057647615,MY +3057647616,3058696191,IN +3058696192,3059548159,CN +3059548160,3059564543,MO +3059564544,3059572735,NP +3059572736,3059580927,JP +3059580928,3059613695,TH +3059613696,3059744767,IN +3059744768,3063414783,CN +3063414784,3063545855,HK +3063545856,3063611391,NZ +3063676928,3063742463,IN +3063742464,3063807999,CN +3063808000,3063939071,JP +3063939072,3063955455,MN +3063955456,3063963647,CN +3063963648,3063971839,BD +3063971840,3063988223,AU +3064004608,3064012799,LK +3064012800,3064020991,MY +3064020992,3064023039,JP +3064023040,3064024063,SG +3064024064,3064025087,JP +3064025088,3064029183,VN +3064029184,3064135679,KR +3064135680,3064160255,JP +3064160256,3064168447,BD +3064168448,3064201215,KR +3064201216,3064725503,JP +3064725504,3064791039,KR +3064791040,3064807423,TW +3064807424,3064808447,IN +3064808448,3064809471,TW +3064809472,3064810495,MY +3064810496,3064811519,HK +3064811520,3064823807,KR +3064823808,3064831999,JP +3064832000,3064840191,KR +3064840192,3064856575,GU +3064856576,3064987647,CN +3064987648,3066036223,PK +3066036224,3066560511,KR +3066560512,3067084799,CN +3067084800,3068657663,KR +3068657664,3068723199,TH +3068723200,3068919807,TW +3068919808,3068948479,JP +3068948480,3068949503,VN +3068949504,3068950527,AU +3068950528,3068952575,NZ +3068952576,3068985343,CN +3068985344,3068986367,HK +3068986368,3068987391,AU +3068987392,3068990463,IN +3068990464,3068991487,VN +3068991488,3068992511,IN +3068992512,3068993535,PH +3068993536,3069018111,KR +3069018112,3069034495,IN +3069034496,3069050879,KR +3069050880,3069124607,CN +3069124608,3069126655,PH +3069126656,3069127679,MY +3069127680,3069128703,TW +3069128704,3069149183,HK +3069149184,3069181951,AU +3069181952,3069706239,CN +3069706240,3069968383,JP +3069968384,3069984767,KR +3069984768,3070001151,BD +3070001152,3070033919,KR +3070033920,3070099455,ID +3070099456,3070164991,CN +3070164992,3070167039,ID +3070167040,3070169087,TH +3070169088,3070170111,ID +3070170112,3070171135,MY +3070171136,3070172159,HK +3070172160,3070173183,AU +3070173184,3070181375,PH +3070181376,3070185471,JP +3070185472,3070197759,AU +3070197760,3070230527,KR +3070230528,3074949119,CN +3074949120,3075342335,JP +3075342336,3075375103,MY +3075375104,3075383295,KR +3075383296,3075385343,IN +3075385344,3075386367,MY +3075386368,3075387391,AU +3075387392,3075388415,JP +3075388416,3075389439,MY +3075389440,3075390463,IN +3075390464,3075391487,JP +3075391488,3075407871,KR +3075407872,3075473407,JP +3075473408,3075571711,VN +3075571712,3075575807,FJ +3075575808,3075577855,AU +3075579904,3075581951,MY +3075581952,3075582975,MN +3075582976,3075583999,TH +3075584000,3075585023,JP +3075585024,3075586047,CN +3075586048,3075588095,KH +3075588096,3075604479,SG +3075604480,3075735551,IN +3075735552,3075866623,CN +3075866624,3075915775,JP +3075915776,3075932159,KR +3075932160,3075997695,IN +3075997696,3076128767,TH +3076128768,3076161535,SG +3076161536,3076169727,KR +3076169728,3076171775,VN +3076171776,3076173823,TH +3076173824,3076175871,JP +3076175872,3076177919,HK +3076177920,3076194303,JP +3076194304,3076202495,VN +3076202496,3076210687,HK +3076210688,3076218879,ID +3076227072,3076228095,CN +3076228096,3076229119,NP +3076229120,3076231167,TH +3076231168,3076235263,CN +3076235264,3076243455,VN +3076243456,3076259839,KR +3076259840,3076521983,CN +3076521984,3078619135,KR +3078619136,3081437183,CN +3081437184,3081502719,MY +3081502720,3081764863,CN +3081764864,3081846783,JP +3081846784,3081854975,AP +3081854976,3081859071,MN +3081859072,3081861119,PH +3081861120,3081862143,AU +3081862144,3081863167,IN +3081863168,3081895935,JP +3081895936,3082027007,HK +3082027008,3082158079,JP +3082158080,3082166271,CN +3082166272,3082174463,JP +3082174464,3082178559,PH +3082178560,3082179583,AP +3082179584,3082181631,IN +3082181632,3082182655,ID +3082182656,3082190847,LA +3082190848,3082289151,JP +3082289152,3087007743,CN +3087007744,3091202047,US +3091202048,3091726335,CA +3091726336,3093168127,US +3093168128,3093200895,CA +3093233664,3093237759,PR +3093299200,3093954759,US +3093954760,3093954767,AR +3093954768,3093954975,US +3093954976,3093954983,AU +3093954984,3093955023,US +3093955024,3093955031,CA +3093955032,3093955079,US +3093955080,3093955087,CA +3093955088,3093955127,US +3093955128,3093955135,CA +3093955136,3093955175,US +3093955176,3093955183,AU +3093955184,3093955231,US +3093955232,3093955247,AU +3093955248,3093955359,US +3093955360,3093955367,GB +3093955368,3093955439,US +3093955440,3093955447,CA +3093955448,3093955455,GB +3093955456,3093955567,US +3093955568,3093955575,GB +3093955576,3093955647,US +3093955648,3093955663,GB +3093955664,3093955679,CA +3093955680,3093956895,US +3093956896,3093956943,CA +3093956944,3093957103,US +3093957104,3093957119,CA +3093957120,3093957143,US +3093957144,3093957151,IL +3093957152,3093957703,US +3093957704,3093957711,BE +3093957712,3093957887,US +3093957888,3093957895,CA +3093957896,3093957903,US +3093957904,3093957911,CA +3093957912,3093958111,US +3093958112,3093958119,CA +3093958120,3093958175,US +3093958176,3093958183,GB +3093958184,3093958663,US +3093958664,3093958667,MX +3093958668,3093958721,US +3093958722,3093958723,IL +3093958724,3093960191,US +3093960192,3093960207,CA +3093960208,3093986367,US +3093986368,3093986431,DE +3093986432,3093986463,US +3093986464,3093986495,GB +3093986496,3094020095,US +3094020096,3094085631,CA +3094085632,3096444927,US +3096444928,3096969215,CA +3096969216,3097493503,US +3097493504,3097755647,CA +3097755648,3098017791,US +3098083328,3098087423,US +3098542080,3103784959,US +3120562176,3120594943,CO +3120594944,3120599039,AR +3120599040,3120601087,EC +3120601088,3120602111,AR +3120602112,3120603135,BO +3120603136,3120608255,AR +3120609280,3120610303,AR +3120610304,3120611327,PY +3120611328,3120627711,AR +3120627712,3120644095,NI +3120660480,3120668671,PA +3120676864,3120680959,HT +3120685056,3120689151,AR +3120693248,3120726015,BO +3120726016,3120734207,HN +3120742400,3120750591,PY +3120758784,3120824319,EC +3120824320,3120840703,CR +3120840704,3120857087,AR +3120857088,3120889855,EC +3120955392,3121020927,DO +3121086464,3121151999,UY +3121152000,3121348607,CL +3121348608,3121479679,AR +3121479680,3121545215,VE +3121545216,3121610751,CR +3121610752,3121741823,PY +3121741824,3121872895,AR +3121872896,3121938431,CL +3122003968,3122135039,AR +3122135040,3122331647,VE +3122331648,3122348031,BO +3122397184,3122659327,CO +3122659328,3122724863,GT +3122790400,3122987007,CL +3123052544,3123118079,AR +3123183616,3123314687,CL +3123314688,3123380223,EC +3123380224,3123412991,CO +3123445760,3123576831,TT +3123576832,3123609599,EC +3123707904,3123970047,UY +3124232192,3124772863,AR +3124887552,3124953087,EC +3125018624,3125149695,EC +3125280768,3125542911,PA +3125805056,3126329343,CO +3126329344,3126853631,VE +3126853632,3126919167,AR +3126919168,3127115775,CO +3127115776,3127181311,AR +3127246848,3127377919,CO +3127377920,3127640063,CL +3127640064,3127902207,AR +3127902208,3128164351,CO +3128426496,3128492031,DO +3128492032,3128524799,CO +3128557568,3128950783,AR +3128950784,3129016319,UY +3129016320,3129999359,AR +3129999360,3130261503,CO +3130523648,3130654719,AR +3131047936,3131310079,PE +3132096512,3132129279,CR +3132227584,3132293119,EC +3133145088,3145727999,BR +3145728000,3154116607,MX +3154116608,3154182143,EU 3154182144,3154247679,DE +3154247680,3154313215,RS +3154313216,3154378751,TR +3154378752,3154444287,GR +3154444288,3154509823,BE +3154509824,3154575359,RU +3154575360,3154640895,FR +3154640896,3155165183,IT +3155165184,3155427327,RU +3155427328,3155506331,AT +3155506332,3155506335,ES +3155506336,3155689471,AT +3155689472,3155951615,RO +3155951616,3156213759,GB +3156213760,3156279295,RU +3156279296,3156344831,PL +3156344832,3156410367,IR +3156410368,3156475903,RU +3156475904,3156539391,HU +3156539392,3156539647,RO +3156539648,3156541439,HU +3156606976,3156672511,TR +3156672512,3156738047,GB +3156738048,3156791439,DE +3156791440,3156791455,NL +3156791456,3156802271,DE +3156802272,3156802303,US +3156802304,3156803583,DE +3156803584,3156869119,TR +3156869120,3156934655,LU +3156934656,3157065727,RU +3157065728,3157131263,AT +3157131264,3157196799,DE +3157196800,3157262335,PL +3157262336,3157786623,SA +3157786624,3158048767,TR +3158048768,3158310911,CH +3158310912,3158312959,FI +3158312960,3158315007,NL +3158315008,3158317055,DE +3158317056,3158319103,SI +3158319104,3158321151,GB +3158321152,3158321407,DE +3158321408,3158321423,US +3158321424,3158322687,DE +3158322688,3158322831,NL +3158322832,3158323199,DE +3158323200,3158325247,BE +3158325248,3158327295,DE +3158327296,3158329343,NL +3158329344,3158331391,BE +3158331392,3158333439,GB +3158333440,3158335487,IT +3158335488,3158337535,IL +3158337536,3158339583,SI +3158339584,3158341631,RU +3158341632,3158343679,IT +3158343680,3158345727,RU +3158345728,3158347775,CY +3158347776,3158349823,RU +3158349824,3158351871,DK +3158351872,3158355967,RU +3158355968,3158358015,LV +3158358016,3158360063,GB +3158360064,3158362111,DE +3158362112,3158364159,IL +3158364160,3158366207,TR +3158366208,3158368255,RU +3158368256,3158370303,FR +3158370304,3158372351,BE +3158372352,3158374399,FR +3158374400,3158376447,DE +3158376448,3158378495,IT +3158378496,3158382591,RU +3158382592,3158384639,OM +3158384640,3158386687,GB +3158386688,3158388735,PL +3158388736,3158390783,RU +3158390784,3158392831,GB +3158392832,3158394879,RU +3158394880,3158395007,AT +3158395008,3158395135,GB +3158395136,3158395151,AT +3158395152,3158395159,DE +3158395160,3158395263,AT +3158395264,3158395295,DE +3158395296,3158395647,AT +3158395648,3158395663,DE +3158395664,3158396927,AT +3158396928,3158398975,IT +3158398976,3158401023,ES +3158401024,3158403071,GB +3158403072,3158405119,RU +3158405120,3158407167,GB +3158407168,3158409215,FR +3158409216,3158411263,RU +3158411264,3158413311,FI +3158413312,3158415359,DE +3158415360,3158417407,SE +3158417408,3158419455,NL +3158419456,3158421503,FR +3158421504,3158423551,GB +3158423552,3158425599,MT +3158425600,3158427647,NL +3158427648,3158429695,DE +3158429696,3158431743,RU +3158431744,3158433791,BE +3158433792,3158435839,NL +3158435840,3158439935,RU +3158439936,3158441983,GB +3158441984,3158444031,EE +3158444032,3158446079,BE +3158446080,3158448127,NL +3158448128,3158452223,RU +3158452224,3158454271,DE +3158573056,3158638591,RU +3158638592,3158704127,LT +3158835200,3158851583,IQ +3158851584,3158867967,RU +3158867968,3158884351,AZ +3158884352,3158884607,DE +3158884608,3158884863,BE +3158884864,3158885119,GB +3158885120,3158885887,TR +3158885888,3158886143,HK +3158886144,3158886175,DE +3158886176,3158886207,BZ +3158886208,3158886271,DE +3158886272,3158886335,RO +3158886336,3158886399,DE +3158886400,3158886655,TR +3158886656,3158887167,DE +3158887168,3158887423,CA +3158887424,3158889215,DE +3158889216,3158889727,TR +3158889728,3158889983,DE +3158889984,3158890239,HK +3158890240,3158891263,DE +3158891264,3158891519,CA +3158891520,3158891583,DE +3158891584,3158891647,RU +3158891648,3158891711,DE +3158891712,3158891775,RU +3158891776,3158892031,PL +3158892032,3158892671,DE +3158892672,3158892799,RU +3158892800,3158893567,DE +3158893568,3158893823,GB +3158893824,3158894079,TR +3158894080,3158895167,DE +3158895168,3158895231,RU +3158895232,3158895423,DE +3158895424,3158895487,RU +3158895488,3158895551,MK +3158895552,3158895615,AE +3158895616,3158895871,IN +3158895872,3158896255,DE +3158896256,3158896383,IN +3158896384,3158897151,DE +3158897152,3158897407,BY +3158897408,3158897503,DE +3158897504,3158897567,RU +3158897568,3158897631,DE +3158897632,3158897663,BZ +3158897664,3158897727,DE +3158897728,3158897791,RU +3158897792,3158897855,DE +3158897856,3158897919,UA +3158897920,3158898175,BY +3158898176,3158898207,DE +3158898208,3158898271,CZ +3158898272,3158898335,RU +3158898336,3158898431,DE +3158898432,3158898687,US +3158898688,3158898943,DE +3158898944,3158899199,ES +3158899200,3158899455,DE +3158899456,3158899711,CA +3158899712,3158900735,DE +3158900736,3158917119,FR +3158917120,3158933503,DE +3158933504,3158949887,RU +3158949888,3158966271,GR +3158982656,3158999039,GB +3158999040,3159031807,RO +3159031808,3159048191,RU +3159048192,3159064575,IR +3159064576,3159080959,CZ +3159080960,3159097343,RU +3159359488,3159621631,PT +3159621632,3159883775,ES +3159883776,3160145919,NL +3160145920,3160147967,RU +3160147968,3160150015,CZ +3160150016,3160152063,LV +3160152064,3160154111,IT +3160154112,3160156159,DE +3160156160,3160158207,AM +3160160256,3160162303,NL +3160162304,3160164351,FR +3160164352,3160166399,LV +3160166400,3160168447,NO +3160168448,3160170495,GB +3160170496,3160172543,IT +3160172544,3160174591,RU +3160174592,3160176639,DE +3160176640,3160178687,IT +3160178688,3160180735,DE +3160180736,3160182783,GB +3160182784,3160184831,CH +3160184832,3160186879,NL +3160186880,3160188927,EE +3160188928,3160190975,SE +3160190976,3160193023,RU +3160193024,3160193279,IT +3160193280,3160193535,DE +3160193536,3160193807,A2 +3160193808,3160193871,LY +3160193872,3160194047,A2 +3160194048,3160194175,LY +3160194176,3160194543,A2 +3160194544,3160194551,IT +3160194552,3160194735,A2 +3160194736,3160194815,IT +3160194816,3160195071,A2 +3160195072,3160197119,RU +3160197120,3160199167,DE +3160199168,3160201215,GE +3160201216,3160203263,RU +3160203264,3160203775,CH +3160203776,3160203783,DE +3160203784,3160203807,CH +3160203808,3160203815,FR +3160203816,3160205311,CH +3160205312,3160207359,GB +3160207360,3160209407,RU +3160209408,3160211455,SE +3160211456,3160213503,IE +3160213504,3160215551,DE +3160215552,3160219647,RU +3160219648,3160221695,ES +3160221696,3160223743,FR +3160223744,3160227839,RU +3160227840,3160229887,IR +3160229888,3160231935,ES +3160231936,3160233983,BE +3160233984,3160236031,GE +3160236032,3160238079,BE +3160238080,3160240127,RU +3160240128,3160242175,BE +3160242176,3160244223,RS +3160244224,3160246271,RU +3160246272,3160248319,IT +3160248320,3160250367,NL +3160250368,3160252415,BE +3160252416,3160254463,PL +3160254464,3160256511,LU +3160256512,3160258559,GB +3160258560,3160260607,NO +3160260608,3160262655,PT +3160262656,3160264703,HU +3160264704,3160266751,RU +3160266752,3160268799,DE +3160268800,3160271615,PT +3160271616,3160271935,ES +3160271936,3160271951,PT +3160271952,3160272895,ES +3160272896,3160274943,RU +3160274944,3160276991,AT +3160279040,3160281087,ES +3160281088,3160283135,GB +3160283136,3160285183,DE +3160285184,3160287231,RU +3160287232,3160289279,GB +3160289280,3160291327,RU +3160291328,3160293375,ES +3160293376,3160295423,FI +3160295424,3160297471,GB +3160297472,3160299519,MD +3160299520,3160301567,RU +3160301568,3160303615,DE +3160303616,3160305663,GB +3160305664,3160307711,DE +3160307712,3160309759,IT +3160309760,3160311807,GB +3160311808,3160313855,HU +3160313856,3160315903,IT +3160315904,3160317951,KZ +3160317952,3160322047,RU +3160322048,3160324095,CH +3160324096,3160328191,IT +3160328192,3160330239,FR +3160330240,3160332287,RU +3160332288,3160333055,NO +3160333056,3160333087,CO +3160333088,3160334335,NO +3160334336,3160336383,RU +3160336384,3160338431,CZ +3160338432,3160340479,GB +3160340480,3160346623,DE +3160346624,3160348671,IT +3160348672,3160350719,PL +3160350720,3160352767,SE +3160352768,3160354815,GB +3160354816,3160356863,NL +3160356864,3160358911,CZ +3160358912,3160360959,JO +3160360960,3160363007,IT +3160363008,3160365055,GB +3160365056,3160369151,NL +3160369152,3160371199,RU +3160371200,3160373247,ES +3160373248,3160375295,CZ +3160375296,3160377343,GB +3160377344,3160379391,NL +3160379392,3160381439,TR +3160381440,3160383487,UA +3160383488,3160385535,GB +3160385536,3160387583,NL +3160387584,3160389631,RS +3160389632,3160391679,RU +3160391680,3160395775,GB +3160395776,3160397823,EE +3160397824,3160399871,ES +3160399872,3160403967,SE +3160403968,3160406015,NO +3160408064,3161456639,DE +3161456640,3161473023,PL +3161473024,3161489407,SK +3161489408,3161505791,LV +3161505792,3161538559,RU +3161538560,3161554943,NO +3161554944,3161571327,RU +3161571328,3161587711,UZ +3161587712,3161620479,RU +3161620480,3161636863,DK +3161636864,3161653247,RU +3161653248,3161669631,LU +3161669632,3161686015,FR +3161686016,3161702399,UA +3161702400,3161718783,AM +3161718784,3161735167,PL +3161735168,3161751551,CZ +3161751552,3161767935,RU +3161767936,3161784319,BH +3161784320,3161800703,FI +3161800704,3161817087,SA +3161817088,3161833471,PL +3161833472,3161833983,MK +3161833984,3161834495,AT +3161834496,3161835263,MK +3161835264,3161849855,AT +3161849856,3161866239,BE +3161866240,3161882623,IR +3161882624,3161899007,DE +3161899008,3161915391,AT +3161931776,3161948159,SA +3161948160,3161964543,RO +3161964544,3161980927,ES +3161980928,3161989119,SK +3161989120,3161997311,RU +3161997312,3162005503,DK +3162005504,3162013695,RS +3162013696,3162021887,IL +3162021888,3162030079,SE +3162030080,3162038271,CZ +3162038272,3162046463,RU +3162046464,3162054655,PL +3162054656,3162062847,NL +3162062848,3162071039,SE +3162071040,3162087423,IR +3162087424,3162095615,SK +3162095616,3162103807,GE +3162103808,3162104319,FR +3162104320,3162111999,NL +3162112000,3162120191,PL +3162120192,3162128895,GB +3162128896,3162129407,NL +3162129408,3162129919,DE +3162129920,3162136575,NL +3162144768,3162152959,SE +3162152960,3162161151,RU +3162161152,3162169343,CZ +3162169344,3162177535,RU +3162177536,3162185727,FI +3162185728,3162193919,RU +3162193920,3162202111,FR +3162202112,3162210303,SK +3162210304,3162218495,GE +3162218496,3162226687,JO +3162226688,3162234879,PL +3162234880,3162243071,RU +3162243072,3162251263,TR +3162251264,3162259455,RU +3162259456,3162267647,CZ +3162267648,3162275839,RU +3162275840,3162284031,NO +3162284032,3162292223,PL +3162292224,3162300415,BA +3162300416,3162308607,RU +3162308608,3162316799,HR +3162316800,3162324991,PL +3162324992,3162327039,GB +3162327040,3162327296,CH +3162327297,3162333183,GB +3162333184,3162341375,IT +3162341376,3162349567,PL +3162349568,3162357759,TR +3162357760,3162365951,PT +3162365952,3162374143,PL +3162374144,3162382335,BG +3162382336,3162390527,RU +3162390528,3162398719,SE +3162398720,3162406911,BE +3162406912,3162415103,IR +3162415104,3162423295,DE +3162423296,3162431487,NO +3162431488,3162439679,SE +3162439680,3162447871,PL +3162447872,3162456063,RU +3162456064,3162464255,BG +3162464256,3162472447,BA +3162472448,3162480639,HU +3162480640,3162488831,ES +3162488832,3162497023,FI +3162497024,3162537983,RU +3162537984,3162570751,PL +3162570752,3162603519,HR +3162603520,3162636287,GE +3162636288,3162669055,FR +3162669056,3162681343,RU +3162681344,3162682367,UA +3162682368,3162685439,RU +3162685440,3162697727,UA +3162697728,3162700287,RU +3162700288,3162700799,LV +3162700800,3162701823,RU +3162701824,3162734591,MD +3162734592,3162767359,RU +3162767360,3162800127,SA +3162800128,3162832895,TR +3162832896,3162865663,GR +3162865664,3162931199,RU +3162931200,3162963967,CZ +3162963968,3162996735,OM +3162996736,3163029503,IT +3163029504,3163062271,DE +3163062272,3163095039,IR +3163095040,3163127807,PL +3163160576,3163161631,DE +3163161632,3163161663,DK +3163161664,3163161695,DE +3163161696,3163161727,BG +3163161728,3163161887,DE +3163161888,3163161919,US +3163161920,3163162111,DE +3163162112,3163162143,TR +3163162144,3163162175,DE +3163162176,3163162207,US +3163162208,3163162239,IT +3163162240,3163162271,CH +3163162272,3163162303,NL +3163162304,3163162335,DE +3163162336,3163162367,TR +3163162368,3163162495,DE +3163162496,3163162527,RU +3163162528,3163163743,DE +3163163744,3163163775,GB +3163163776,3163163871,DE +3163163872,3163163903,RU +3163163904,3163163935,DE +3163163936,3163163967,VG +3163163968,3163164543,DE +3163164544,3163164575,RU +3163164576,3163165695,DE +3163165696,3163165727,TR +3163165728,3163165759,DE +3163165760,3163165791,PL +3163165792,3163166175,DE +3163166176,3163166207,US +3163166208,3163166495,DE +3163166496,3163166527,RO +3163166528,3163166559,DE +3163166560,3163166591,HU +3163166592,3163167775,DE +3163167776,3163167807,GR +3163167808,3163167839,TR +3163167840,3163167967,DE +3163167968,3163167999,TR +3163168000,3163168031,DE +3163168032,3163168063,RU +3163168064,3163168095,DE +3163168096,3163168127,TR +3163168128,3163168159,IL +3163168160,3163168319,DE +3163168320,3163168351,DK +3163168352,3163168415,DE +3163168416,3163168447,CA +3163168448,3163168575,DE +3163168576,3163168607,TR +3163168608,3163168671,DE +3163168672,3163168703,US +3163168704,3163169823,DE +3163169824,3163169855,RU +3163169856,3163169951,DE +3163169952,3163169983,GB +3163169984,3163170015,DE +3163170016,3163170047,ES +3163170048,3163170079,RU +3163170080,3163170111,TR +3163170112,3163170207,DE +3163170208,3163170239,RU +3163170240,3163170303,DE +3163170304,3163170335,IT +3163170336,3163170367,DE +3163170368,3163170399,IR +3163170400,3163170431,CY +3163170432,3163170495,DE +3163170496,3163170527,BR +3163170528,3163170591,DE +3163170592,3163170623,BR +3163170624,3163172031,DE +3163172032,3163172063,PL +3163172064,3163172127,DE +3163172128,3163172159,TR +3163172160,3163172191,RU +3163172192,3163172223,DE +3163172224,3163172255,TR +3163172256,3163172287,PL +3163172288,3163172319,TR +3163172320,3163172351,NL +3163172352,3163172383,GB +3163172384,3163172607,DE +3163172608,3163172639,DK +3163172640,3163172735,DE +3163172736,3163172767,GR +3163172768,3163174047,DE +3163174048,3163174079,DK +3163174080,3163174335,DE +3163174336,3163174367,RU +3163174368,3163174399,DE +3163174400,3163174431,DK +3163174432,3163174591,DE +3163174592,3163174623,SE +3163174624,3163174655,GB +3163174656,3163174687,DE +3163174688,3163174719,US +3163174720,3163174751,NL +3163174752,3163174783,US +3163174784,3163176127,DE +3163176128,3163176159,TR +3163176160,3163176255,DE +3163176256,3163176287,UG +3163176288,3163176479,DE +3163176480,3163176543,GB +3163176544,3163176575,DE +3163176576,3163176607,GR +3163176608,3163176671,DE +3163176672,3163176703,PL +3163176704,3163176767,DE +3163176768,3163176799,PL +3163176800,3163176895,DE +3163176896,3163176927,SE +3163176928,3163193343,DE +3163226112,3163258879,SA +3163258880,3163291647,SY +3163291648,3163324415,PT +3163324416,3163357183,OM +3163357184,3163389951,IE +3163389952,3163422719,FR +3163422720,3163455487,NL +3163455488,3163488255,HU +3163521024,3163553791,RU +3163553792,3163684863,DE +3163684864,3163815935,PL +3163815936,3164078079,NO +3164078080,3164209151,IT +3164209152,3164340223,CH +3164340224,3164471295,HU +3164471296,3164602367,IR +3164602368,3164667903,SY +3164667904,3164733439,PS +3164733440,3164798975,RU +3164798976,3164864511,UA +3164864512,3164930047,RU +3164930048,3164932095,IE +3164932096,3164934143,FR +3164934144,3164936191,PL +3164936192,3164938239,LT +3164938240,3164946431,FR +3164946432,3164946435,PL +3164946436,3164946439,PT +3164946440,3164946447,ES +3164946448,3164946479,FR +3164946480,3164946483,ES +3164946484,3164946495,PL +3164946496,3164946499,IT +3164946500,3164946503,GB +3164946504,3164946507,BE +3164946508,3164946511,FR +3164946512,3164946527,ES +3164946528,3164946559,GB +3164946560,3164946783,FR +3164946784,3164946799,BE +3164946800,3164947039,FR +3164947040,3164947043,ES +3164947044,3164947047,GB +3164947048,3164947063,FR +3164947064,3164947067,NL +3164947068,3164947199,DE +3164947200,3164947455,FR +3164947456,3164947711,DE +3164947712,3164947743,FR +3164947744,3164947747,ES +3164947748,3164947751,BE +3164947752,3164947839,FR +3164947840,3164947967,GB +3164947968,3164948479,BE +3164948480,3164948735,FR +3164948736,3164949087,GB +3164949088,3164949095,FR +3164949096,3164949103,IT +3164949104,3164949119,GB +3164949120,3164949131,DE +3164949132,3164949151,FR +3164949152,3164949155,NL +3164949156,3164949159,FR +3164949160,3164949163,PL +3164949164,3164949183,FR +3164949184,3164949215,DE +3164949216,3164949231,NL +3164949232,3164949247,BE +3164949248,3164949279,FR +3164949280,3164949295,ES +3164949296,3164949359,FR +3164949360,3164949363,BE +3164949364,3164949391,FR +3164949392,3164949395,ES +3164949396,3164949439,FR +3164949440,3164949471,PL +3164949472,3164949503,FR +3164949504,3164950015,BE +3164950016,3164950271,GB +3164950272,3164950399,FR +3164950400,3164950407,ES +3164950408,3164950411,FR +3164950412,3164950415,CZ +3164950416,3164950431,PL +3164950432,3164950435,FR +3164950436,3164950439,ES +3164950440,3164950447,FR +3164950448,3164950451,PL +3164950452,3164950455,CZ +3164950456,3164950463,PL +3164950464,3164950479,ES +3164950480,3164950487,IT +3164950488,3164950495,PL +3164950496,3164950511,ES +3164950512,3164950515,GB +3164950516,3164950519,ES +3164950520,3164950527,GB +3164950528,3164950543,BE +3164950544,3164950591,NL +3164950592,3164950623,FR +3164950624,3164950655,GB +3164950656,3164950687,FR +3164950688,3164950703,ES +3164950704,3164950719,PL +3164950720,3164950723,GB +3164950724,3164950735,FR +3164950736,3164950751,ES +3164950752,3164950759,GB +3164950760,3164950783,ES +3164950784,3164951039,FR +3164951040,3164951231,DE +3164951232,3164951239,GB +3164951240,3164951263,FR +3164951264,3164951295,DE +3164951296,3164951471,PL +3164951472,3164951487,FR +3164951488,3164951519,PL +3164951520,3164951535,GB +3164951536,3164951543,BE +3164951544,3164951547,NL +3164951548,3164951559,FR +3164951560,3164951567,PL +3164951568,3164951571,BE +3164951572,3164951575,CZ +3164951576,3164951583,NL +3164951584,3164951591,GB +3164951592,3164951595,IE +3164951596,3164951615,FR +3164951616,3164951663,GB +3164951664,3164951671,PL +3164951672,3164951679,FR +3164951680,3164951683,ES +3164951684,3164951687,GB +3164951688,3164951691,FR +3164951692,3164951695,CH +3164951696,3164951711,IE +3164951712,3164951807,FR +3164951808,3164951823,NL +3164951824,3164951831,CH +3164951832,3164951839,FR +3164951840,3164951855,PL +3164951856,3164951871,FR +3164951872,3164951875,CZ +3164951876,3164951879,IT +3164951880,3164951887,DE +3164951888,3164951895,ES +3164951896,3164951907,FR +3164951908,3164951911,PL +3164951912,3164951915,ES +3164951916,3164951919,IE +3164951920,3164951935,FR +3164951936,3164951999,DE +3164952000,3164952015,ES +3164952016,3164952031,FR +3164952032,3164952063,PL +3164952064,3164952191,FR +3164952192,3164952207,ES +3164952208,3164952219,NL +3164952220,3164952255,FR +3164952256,3164952319,DE +3164952320,3164952575,ES +3164952576,3164952831,FR +3164952832,3164952959,IT +3164952960,3164952975,GB +3164952976,3164952991,FR +3164952992,3164953007,PL +3164953008,3164953023,ES +3164953024,3164953087,FR +3164953088,3164953151,LT +3164953152,3164953215,PL +3164953216,3164953247,FR +3164953248,3164953255,CH +3164953256,3164953263,CZ +3164953264,3164953311,FR +3164953312,3164953375,PL +3164953376,3164953391,FR +3164953392,3164953395,IT +3164953396,3164953399,NL +3164953400,3164953403,BE +3164953404,3164953407,CH +3164953408,3164953423,BE +3164953424,3164953439,FR +3164953440,3164953443,CZ +3164953444,3164953447,DE +3164953448,3164953451,ES +3164953452,3164953455,FR +3164953456,3164953459,IE +3164953460,3164953463,PT +3164953464,3164953467,PL +3164953468,3164953471,GB +3164953472,3164953503,PL +3164953504,3164953511,FR +3164953512,3164953515,PL +3164953516,3164953519,IE +3164953520,3164953567,PL +3164953568,3164953571,FR +3164953572,3164953575,GB +3164953576,3164953583,IT +3164953584,3164954111,ES +3164954112,3164954263,FR +3164954264,3164954271,DE +3164954272,3164954275,IT +3164954276,3164954279,GB +3164954280,3164954287,FR +3164954288,3164954303,ES +3164954304,3164954367,DE +3164954368,3164954431,FR +3164954432,3164954439,ES +3164954440,3164954443,DE +3164954444,3164954447,NL +3164954448,3164954479,FR +3164954480,3164954495,GB +3164954496,3164954499,PL +3164954500,3164954503,ES +3164954504,3164954507,FR +3164954508,3164954511,ES +3164954512,3164954515,PL +3164954516,3164954519,IT +3164954520,3164954543,GB +3164954544,3164954591,FR +3164954592,3164954623,PL +3164954624,3164956479,FR +3164956480,3164956543,GB +3164956544,3164958847,FR +3164958848,3164958911,IT +3164958912,3164958927,CH +3164958928,3164958943,ES +3164958944,3164958955,FR +3164958956,3164958959,GB +3164958960,3164959039,FR +3164959040,3164959135,DE +3164959136,3164959231,ES +3164959232,3164959247,FR +3164959248,3164959255,BE +3164959256,3164959263,PL +3164959264,3164959295,GB +3164959296,3164959303,IT +3164959304,3164959307,FR +3164959308,3164959311,IT +3164959312,3164959327,ES +3164959328,3164959343,BE +3164959344,3164959359,PL +3164959360,3164959375,ES +3164959376,3164959383,DE +3164959384,3164959387,PL +3164959388,3164959487,FR +3164959488,3164959743,ES +3164959744,3164959999,FR +3164960000,3164960255,DE +3164960256,3164960511,FR +3164960512,3164960575,PL +3164960576,3164960767,IT +3164960768,3164960831,PL +3164960832,3164960895,FR +3164960896,3164960959,PT +3164960960,3164961023,CH +3164961024,3164961279,FR +3164961280,3164961311,DE +3164961312,3164961319,FR +3164961320,3164961327,PL +3164961328,3164961331,ES +3164961332,3164961339,FR +3164961340,3164961343,ES +3164961344,3164961363,FR +3164961364,3164961367,ES +3164961368,3164961375,FR +3164961376,3164961391,DE +3164961392,3164961399,FR +3164961400,3164961403,PL +3164961404,3164961471,FR +3164961472,3164961503,DE +3164961504,3164961551,ES +3164961552,3164961559,FR +3164961560,3164961563,DE +3164961564,3164961583,FR +3164961584,3164961599,DE +3164961600,3164961631,BE +3164961632,3164961647,IT +3164961648,3164961655,NL +3164961656,3164961663,ES +3164961664,3164961695,DE +3164961696,3164961727,GB +3164961728,3164961743,ES +3164961744,3164961759,PL +3164961760,3164961855,FR +3164961856,3164961871,PL +3164961872,3164961887,IE +3164961888,3164961903,ES +3164961904,3164961919,GB +3164961920,3164961951,IT +3164961952,3164961967,ES +3164961968,3164961971,FR +3164961972,3164961975,ES +3164961976,3164961979,GB +3164961980,3164961999,DE +3164962000,3164962031,FR +3164962032,3164962047,NL +3164962048,3164962079,FR +3164962080,3164962095,ES +3164962096,3164962111,BE +3164962112,3164962143,GB +3164962144,3164962175,FR +3164962176,3164962239,NL +3164962240,3164962247,PL +3164962248,3164962251,FR +3164962252,3164962255,DE +3164962256,3164962259,NL +3164962260,3164962263,DE +3164962264,3164962279,ES +3164962280,3164962283,DE +3164962284,3164962295,ES +3164962296,3164962303,PL +3164962304,3164962335,NL +3164962336,3164962367,DE +3164962368,3164962431,PL +3164962432,3164962439,GB +3164962440,3164962447,PL +3164962448,3164962451,PT +3164962452,3164962455,FR +3164962456,3164962459,IE +3164962460,3164962527,FR +3164962528,3164962535,PL +3164962536,3164962539,CH +3164962540,3164962543,CZ +3164962544,3164962623,FR +3164962624,3164962627,BE +3164962628,3164962631,CH +3164962632,3164962655,FR +3164962656,3164962687,ES +3164962688,3164962751,GB +3164962752,3164964863,ES +3164964864,3164966911,FI +3164966912,3164967039,FR +3164967040,3164967071,PL +3164967072,3164967087,FR +3164967088,3164967095,IT +3164967096,3164967103,PL +3164967104,3164967135,ES +3164967136,3164967155,FR +3164967156,3164967159,PL +3164967160,3164967167,FR +3164967168,3164967295,ES +3164967296,3164967303,NL +3164967304,3164967307,IT +3164967308,3164967311,DE +3164967312,3164967343,IT +3164967344,3164967351,ES +3164967352,3164967359,PL +3164967360,3164967423,FR +3164967424,3164967679,ES +3164967680,3164967935,FR +3164967936,3164967967,DE +3164967968,3164967971,FR +3164967972,3164967975,DE +3164967976,3164967999,FR +3164968000,3164968063,ES +3164968064,3164968191,FR +3164968192,3164968703,PL +3164968704,3164968831,FR +3164968832,3164968863,DE +3164968864,3164968895,FR +3164968896,3164968927,GB +3164968928,3164968959,IT +3164968960,3164968991,DE +3164968992,3164969007,FR +3164969008,3164969015,PT +3164969016,3164969023,FR +3164969024,3164969055,PL +3164969056,3164969071,CZ +3164969072,3164969087,FR +3164969088,3164969095,ES +3164969096,3164969099,PL +3164969100,3164969103,DE +3164969104,3164969135,FR +3164969136,3164969143,ES +3164969144,3164969147,PT +3164969148,3164969183,GB +3164969184,3164969199,DE +3164969200,3164969207,GB +3164969208,3164969211,IT +3164969212,3164969471,FR +3164969472,3164969727,PL +3164969728,3164969983,GB +3164969984,3164970047,IE +3164970048,3164970079,GB +3164970080,3164970111,DE +3164970112,3164970211,FR +3164970212,3164970215,GB +3164970216,3164970219,PL +3164970220,3164970223,FR +3164970224,3164970303,GB +3164970304,3164970335,ES +3164970336,3164970339,NL +3164970340,3164970343,BE +3164970344,3164970347,FI +3164970348,3164970351,GB +3164970352,3164970359,FR +3164970360,3164970363,DE +3164970364,3164970367,ES +3164970368,3164970371,PL +3164970372,3164970375,ES +3164970376,3164970399,IT +3164970400,3164970415,GB +3164970416,3164970423,FR +3164970424,3164970427,IE +3164970428,3164970431,PT +3164970432,3164970463,FR +3164970464,3164970495,GB +3164970496,3164970559,PL +3164970560,3164970567,FR +3164970568,3164970575,ES +3164970576,3164970607,FR +3164970608,3164970615,ES +3164970616,3164970623,CH +3164970624,3164970631,FR +3164970632,3164970639,CH +3164970640,3164970647,ES +3164970648,3164970651,GB +3164970652,3164970655,FR +3164970656,3164970687,IT +3164970688,3164970691,GB +3164970692,3164970695,FR +3164970696,3164970719,PL +3164970720,3164970783,FR +3164970784,3164970791,PL +3164970792,3164970823,FR +3164970824,3164970827,BE +3164970828,3164970831,CH +3164970832,3164970835,IT +3164970836,3164970839,PL +3164970840,3164970847,GB +3164970848,3164970911,FR +3164970912,3164970915,ES +3164970916,3164970919,FR +3164970920,3164970923,GB +3164970924,3164970927,LT +3164970928,3164970991,FR +3164970992,3164971007,BE +3164971008,3164971011,ES +3164971012,3164971015,FR +3164971016,3164971023,PL +3164971024,3164971055,FR +3164971056,3164971071,NL +3164971072,3164971135,DE +3164971136,3164971263,GB +3164971264,3164971455,DE +3164971456,3164971459,NL +3164971460,3164971463,IT +3164971464,3164971467,CH +3164971468,3164971471,FR +3164971472,3164971479,NL +3164971480,3164971483,FR +3164971484,3164971487,PL +3164971488,3164971503,ES +3164971504,3164971511,PL +3164971512,3164971519,CZ +3164971520,3164971775,ES +3164971776,3164971795,FR +3164971796,3164971799,IT +3164971800,3164971803,DE +3164971804,3164971807,FR +3164971808,3164971903,BE +3164971904,3164971967,DE +3164971968,3164971983,FR +3164971984,3164971999,ES +3164972000,3164972015,CH +3164972016,3164972019,ES +3164972020,3164972027,FR +3164972028,3164972031,ES +3164972032,3164972287,GB +3164972288,3164972319,FR +3164972320,3164972351,DE +3164972352,3164972415,NL +3164972416,3164972479,BE +3164972480,3164972499,FR +3164972500,3164972503,IT +3164972504,3164972511,DE +3164972512,3164972527,GB +3164972528,3164972799,FR +3164972800,3164973311,ES +3164973312,3164973823,FR +3164973824,3164973855,DE +3164973856,3164973863,PL +3164973864,3164973867,FR +3164973868,3164973875,ES +3164973876,3164973879,GB +3164973880,3164973883,FR +3164973884,3164973887,DE +3164973888,3164973919,ES +3164973920,3164973935,FR +3164973936,3164973939,IT +3164973940,3164973943,FR +3164973944,3164973951,PL +3164973952,3164974591,FR +3164974592,3164975103,GB +3164975104,3164975167,CH +3164975168,3164975231,GB +3164975232,3164975299,IT +3164975300,3164975307,ES +3164975308,3164975311,GB +3164975312,3164975343,ES +3164975344,3164975351,GB +3164975352,3164975355,NL +3164975356,3164975359,FR +3164975360,3164975615,ES +3164975616,3164976127,GB +3164976128,3164976639,IT +3164976640,3164976767,FR +3164976768,3164976783,DE +3164976784,3164976799,ES +3164976800,3164976815,DE +3164976816,3164976831,GB +3164976832,3164976835,IT +3164976836,3164976839,ES +3164976840,3164976847,FR +3164976848,3164976863,CH +3164976864,3164976895,CZ +3164976896,3164977151,FR +3164977152,3164977215,PL +3164977216,3164977247,DE +3164977248,3164977279,ES +3164977280,3164977407,FR +3164977408,3164977663,PL +3164977664,3164977695,GB +3164977696,3164977727,IT +3164977728,3164977743,LT +3164977744,3164977759,PT +3164977760,3164977775,NL +3164977776,3164977791,PL +3164977792,3164977807,FR +3164977808,3164977823,NL +3164977824,3164977839,GB +3164977840,3164977883,FR +3164977884,3164977887,GB +3164977888,3164977903,IT +3164977904,3164977919,NL +3164977920,3164978047,DE +3164978048,3164978067,FR +3164978068,3164978079,ES +3164978080,3164978111,IT +3164978112,3164978127,ES +3164978128,3164978143,FR +3164978144,3164978147,DE +3164978148,3164978151,ES +3164978152,3164978155,GB +3164978156,3164978159,DE +3164978160,3164978175,FR +3164978176,3164978431,IT +3164978432,3164978447,FR +3164978448,3164978463,PT +3164978464,3164978495,DE +3164978496,3164978511,IT +3164978512,3164978527,ES +3164978528,3164978543,FR +3164978544,3164978559,PT +3164978560,3164978575,GB +3164978576,3164978591,ES +3164978592,3164978607,FR +3164978608,3164978623,CZ +3164978624,3164978687,FR +3164978688,3164978943,PL +3164978944,3164978951,PT +3164978952,3164978955,PL +3164978956,3164978959,GB +3164978960,3164978975,FR +3164978976,3164978991,ES +3164978992,3164979007,FR +3164979008,3164979023,ES +3164979024,3164979039,CH +3164979040,3164979071,PT +3164979072,3164979103,ES +3164979104,3164979111,DE +3164979112,3164979119,PL +3164979120,3164979135,NL +3164979136,3164979151,DE +3164979152,3164979159,FR +3164979160,3164979167,PL +3164979168,3164979175,DE +3164979176,3164979183,FR +3164979184,3164979199,DE +3164979200,3164995583,FR +3164995584,3165061119,RU +3165061120,3165126655,SK +3165126656,3165192191,RU +3165192192,3165257727,GE +3165257728,3165323263,RO +3165323264,3165388799,ES +3165388800,3165519871,RO +3165519872,3165585407,DE +3165585408,3165650943,CZ +3165650944,3166175231,DK +3166175232,3166306303,CH +3166306304,3166437375,RU +3166437376,3166568447,BE +3166699520,3166961663,DE +3167223808,3167748095,NL +3167748096,3167940095,RO +3167940096,3167940351,CY +3167940352,3168092159,RO +3168092160,3168096255,GB +3168096256,3168100351,MD +3168100352,3168104447,RO +3168104448,3168108543,GB +3168108544,3168112639,RO +3168112640,3168116735,GB +3168116736,3168120831,RO +3168120832,3168124927,GB +3168124928,3168129023,RO +3168129024,3168141311,GB +3168141312,3168157695,RO +3168157696,3168178175,GB +3168178176,3168182271,RO +3168182272,3168194559,GB +3168194560,3168198655,RO +3168198656,3168202751,GB +3168202752,3168207103,RO +3168207104,3168207359,CY +3168207360,3168214527,RO +3168214528,3168214783,CY +3168214784,3168272383,RO +3168272384,3168534527,IT +3168534528,3168796671,GB +3168796672,3168829439,FR +3168829440,3168862207,RO +3168862208,3168894975,RU +3168894976,3168927743,PS +3168927744,3169058815,RU +3169058816,3169091583,DK +3169091584,3169124351,IT +3169124352,3169157119,RO +3169189888,3169222655,UA +3169222656,3169255423,SI +3169255424,3169264895,KW +3169264896,3169264927,OM +3169264928,3169265167,KW +3169265168,3169265175,IQ +3169265176,3169265183,SA +3169265184,3169265223,KW +3169265224,3169265231,IQ +3169265232,3169265295,SA +3169265296,3169265303,SD +3169265304,3169265311,SA +3169265312,3169265567,KW +3169265568,3169265583,IQ +3169265584,3169278991,KW +3169278992,3169279007,SA +3169279008,3169279231,KW +3169279232,3169279239,IQ +3169279240,3169279255,SA +3169279256,3169279263,KW +3169279264,3169279295,SA +3169279296,3169279303,KW +3169279304,3169279311,SA +3169279312,3169279319,SD +3169279320,3169279743,KW +3169279744,3169279759,IQ +3169279760,3169281023,KW +3169281024,3169281279,US +3169281280,3169288191,KW +3169288192,3169320959,UA +3169845248,3169965823,RO +3169965824,3169966079,GB +3169966080,3169976319,RO +3169976320,3170111487,RU +3170111488,3170115583,MD +3170115584,3170119679,RU +3170119680,3170123775,CZ +3170123776,3170127871,DK +3170127872,3170131967,ES +3170131968,3170136063,JO +3170238464,3170246655,DE +3170246656,3170254847,RS +3170254848,3170263039,BA +3170263040,3170271231,CZ +3170271232,3170279423,PL +3170279424,3170287615,RU +3170295808,3170303999,RU +3170304000,3170312191,SY +3170312192,3170320383,RU +3170320384,3170328575,JO +3170369536,3170500607,SA 3170893824,3179282431,BR -3179282432,3187671039,MX +3179282432,3179282943,UY +3179282944,3179283199,MX +3179283200,3179284479,UY +3179284480,3187671039,MX 3187671040,3187687423,CO 3187687424,3187695615,DO +3187695616,3187703807,AR 3187703808,3187711999,UY +3187712000,3187720191,AR 3187720192,3187728383,GT 3187736576,3187752959,AR 3187752960,3187761151,CO 3187769344,3187802111,CO 3187802112,3187818495,AR 3187818496,3187822591,PY -3187826688,3187830783,AR +3187822592,3187824639,AR +3187824640,3187826687,CL +3187826688,3187834879,AR 3187834880,3187851263,AN 3187851264,3187855359,PY 3187859456,3187863551,PA 3187867648,3187908607,AR +3187908608,3187910655,CO +3187910656,3187914751,CL +3187914752,3187916799,BO 3187916800,3187933183,CO -3187933184,3187949567,GT +3187933184,3187936723,GT +3187936724,3187936727,HN +3187936728,3187949567,GT 3187949568,3187953663,AN 3187957760,3187961855,CL -3187965952,3187974143,AN +3187965952,3187982335,AN 3187982336,3187998719,CL 3187998720,3188006911,AR -3188015104,3188023295,HN +3188015104,3188031487,HN 3188031488,3188039679,SV 3188047872,3188051967,CO -3188056064,3188060159,PA +3188056064,3188064255,PA 3188064256,3188080639,VE -3188080640,3188084735,CU -3188088832,3188092927,AR +3188080640,3188088831,CU +3188088832,3188097023,AR 3188097024,3188105215,DO 3188105216,3188113407,CO 3188113408,3188117503,HN 3188121600,3188125695,TT 3188129792,3188146175,AR -3188146176,3188158463,CO -3188162560,3188170751,CO +3188146176,3188170751,CO 3188170752,3188174847,CR 3188178944,3188187135,CR -3188187136,3188191231,AR -3188195328,3188199423,AR +3188187136,3188199423,AR 3188203520,3188207615,DO 3188211712,3188228095,CL 3188228096,3188236287,PE -3188244480,3188252671,CO +3188244480,3188260863,CO 3188260864,3188264959,AR 3188269056,3188273151,VE +3188273152,3188275199,PA +3188275200,3188277247,CL 3188277248,3188293631,CO 3188293632,3188301823,VE 3188301824,3188310015,EC -3188310016,3188318207,CO -3188326400,3188343807,CR -3188343808,3188344063,CO -3188344064,3188344575,CR -3188344576,3188344831,CO -3188344832,3188359167,CR +3188310016,3188326399,CO +3188326400,3188359167,CR 3188359168,3188400127,EC -3188400128,3188404223,AR +3188400128,3188408319,AR 3188408320,3188416511,BO -3188416512,3188420607,AR -3188424704,3188432895,AR -3188441088,3188445183,AR +3188416512,3188445183,AR 3188449280,3188453375,HN 3188457472,3188473855,EC 3188473856,3188482047,PE 3188482048,3188490239,AR 3188490240,3188498431,CO -3188506624,3188508159,AR -3188508160,3188508415,US -3188508416,3188511487,AR -3188511488,3188511999,US -3188512000,3188512255,AR -3188512256,3188512511,US -3188512512,3188513023,AR -3188513024,3188513279,US -3188513280,3188514559,AR -3188514560,3188517375,US -3188517376,3188518911,AR -3188518912,3188521727,US -3188521728,3188521983,AR -3188521984,3188522751,US -3188522752,3188523007,AR +3188506624,3188513279,AR +3188513280,3188513535,US +3188513536,3188523007,AR 3188523008,3188539391,CO -3188539392,3188542207,CL -3188542208,3188542463,US -3188542464,3188543487,CL +3188539392,3188543487,CL 3188547584,3188551679,CO -3188555776,3188559871,CL -3188563968,3188572159,CL +3188555776,3188572159,CL 3188572160,3188576255,CO -3188580352,3188584447,AR -3188588544,3188596735,AR -3188604928,3188605695,AR -3188605696,3188605951,CL -3188605952,3188606207,AR +3188580352,3188596735,AR +3188604928,3188606207,AR 3188606208,3188606463,CL -3188606464,3188606975,AR -3188606976,3188607487,CL -3188607488,3188607743,AR -3188607744,3188608255,CL -3188608256,3188609023,AR -3188609024,3188609279,CL -3188609280,3188609535,AR -3188609536,3188609791,CL -3188609792,3188611583,AR -3188611584,3188611839,CL -3188611840,3188612095,AR +3188606464,3188609279,AR +3188609280,3188609535,CL +3188609536,3188610047,AR +3188610048,3188610303,CL +3188610304,3188612095,AR 3188612096,3188612351,CL 3188612352,3188621311,AR 3188621312,3188625407,GT -3188629504,3188633599,AR +3188629504,3188637695,AR 3188637696,3188645887,PA -3188645888,3188649983,CO -3188654080,3188662271,CO +3188645888,3188662271,CO 3188670464,3188674559,HN -3188678656,3188682751,AR +3188678656,3188686847,AR 3188686848,3188690943,EC -3188695040,3188699135,VE +3188695040,3188703231,VE 3188703232,3188711423,AR 3188719616,3188981759,AR 3188981760,3189178367,CL +3189178368,3189211135,PY 3189243904,3189637119,CO 3189637120,3189768191,AR 3189768192,3190030335,PA @@ -30280,252 +59395,324 @@ 3191078912,3191087103,CO 3191095296,3191099391,EC 3191103488,3191107583,CO -3191111680,3191119871,PY +3191111680,3191128063,PY 3191128064,3191132159,EC -3191136256,3191140351,DO -3191144448,3191152639,SV -3191152640,3191156735,NI +3191136256,3191144447,DO +3191144448,3191153407,SV +3191153408,3191154687,NI +3191154688,3191156735,SV 3191156736,3191169023,HN 3191169024,3191193599,SV 3191193600,3191197695,HN -3191197696,3191201791,SV -3191201792,3191203839,HN -3191203840,3191209983,SV +3191197696,3191209983,SV 3191209984,3191275519,CL -3191275520,3191324671,AR +3191275520,3191341055,AR 3191341056,3191406591,GT 3191406592,3191427071,SV -3191427072,3191439359,GT +3191427072,3191434751,GT +3191434752,3191435263,SV +3191435264,3191435775,GT +3191435776,3191436287,SV +3191436288,3191438335,GT +3191438336,3191439359,SV 3191472128,3191603199,TT 3191603200,3191608319,MX 3191608320,3191608831,CO 3191608832,3191609087,MX -3191609088,3191734015,CO -3191734016,3191734031,US -3191734032,3191734271,CO +3191609088,3191635967,CO +3191635968,3191637503,AR +3191637504,3191638095,CO +3191638096,3191638103,AR +3191638104,3191638271,CO +3191638272,3191638527,AR +3191638528,3191638783,CO +3191638784,3191639039,AR +3191639040,3191672063,CO +3191672064,3191672319,AR +3191672320,3191734271,CO 3191865344,3191930879,UY 3191930880,3192389631,CO 3192389632,3192913919,VE -3192913920,3192930303,GY +3192913920,3192946687,GY 3192946688,3192979455,DO -3192979456,3192988767,PE -3192988768,3192988775,PA -3192988776,3193044991,PE -3193044992,3193061375,CL -3193077760,3193110527,CL +3192979456,3193044991,PE +3193044992,3193110527,CL 3193110528,3193143295,CO -3193176064,3193241599,CO +3193176064,3193307135,CO 3193307136,3193438207,SV -3193438208,3193454591,AN -3193503744,3193569279,AN +3193438208,3193569279,AN 3193569280,3193634815,CO -3193700352,3193708543,HN -3193733120,3193749503,AR -3193765888,3193774079,TT +3193700352,3193716735,HN +3193733120,3193765887,AR +3193765888,3193798655,TT 3193798656,3193806847,CO -3193831424,3193839615,DO +3193815040,3193819135,AR +3193823232,3193827327,CL +3193831424,3193864191,DO 3193864192,3193872383,EC +3193880576,3193888767,VE 3193896960,3193929727,CL -3193929728,3193946111,EC -3193962496,3193978879,CL -3193995264,3194011647,CO -3194028032,3194036223,AR +3193929728,3193962495,EC +3193962496,3193995263,CL +3193995264,3194028031,CO +3194028032,3194044415,AR 3194044416,3194052607,CO 3194052608,3194056703,TT -3194060800,3194068991,CO -3194077184,3194085375,CO -3194093568,3194101759,SR +3194060800,3194093567,CO +3194093568,3194126335,SR 3194126336,3194127359,GT 3194127360,3194128383,AR 3194128384,3194128639,PE -3194128640,3194134527,AR -3194159104,3194167295,GT +3194128640,3194130431,AR +3194130432,3194134527,BR +3194134528,3194142719,AR +3194142720,3194159103,CL +3194159104,3194163199,NI +3194163200,3194175487,GT +3194175488,3194177535,AR +3194177536,3194179583,EC +3194179584,3194181631,AR +3194181632,3194182655,CL +3194182656,3194183679,BO +3194183680,3194187775,UY 3194191872,3194224639,CO -3194224640,3194290175,CL -3194355712,3194359807,AN +3194224640,3194355711,CL +3194355712,3194363903,AN 3194363904,3194367999,CR +3194368000,3194370047,BO +3194370048,3194372095,PA 3194372096,3194380287,HT -3194404864,3194408959,CO -3194413056,3194417151,CL +3194388480,3194396671,PE +3194404864,3194413055,CO +3194413056,3194421247,CL 3194421248,3194425343,AR -3194429440,3194433535,VE +3194429440,3194437631,VE 3194437632,3194441727,BO -3194445824,3194449919,CO -3194454016,3194458111,AR -3194462208,3194466303,AR +3194445824,3194454015,CO +3194454016,3194486783,AR 3194486784,3194494975,BO -3196059648,3196092415,CO +3194503168,3194507263,AR +3194511360,3194515455,AW +3194519552,3194535935,PY +3194552320,3194585087,AR +3194585088,3194589183,HN +3194601472,3194602495,AN +3194602496,3194605567,AR +3194609664,3194613759,AR +3194617856,3194626047,NI +3194634240,3194638335,CR +3194642432,3194646527,AR +3194650624,3194653439,AR +3194653440,3194653695,US +3194653696,3194665983,AR +3194665984,3194666239,US +3194666240,3194667007,AR +3194683392,3194687487,CU +3194691584,3194699775,BO +3194699776,3194703871,EC +3194707968,3194716159,AR +3194716160,3194724351,HN +3194724352,3194728447,PA +3194732544,3194736639,AR +3194740736,3194742783,CL +3194742784,3194744831,EC +3194744832,3194746879,AR +3194746880,3194748927,AN +3194748928,3194757119,UY +3194765312,3194767359,EC +3194769408,3194771455,PE +3194781696,3194798079,CL +3194798080,3194799103,AR +3194799104,3194802175,GY +3194806272,3194810367,AR +3194818560,3194822655,AR +3194830848,3194839039,PA +3194847232,3194863615,CO +3194863616,3194871807,HN +3194880000,3194896383,DO +3194896384,3194904575,CO +3194912768,3194920959,CL +3194929152,3194937343,EC +3194945536,3194953727,GT +3194961920,3194966015,EC +3194970112,3194974207,PA +3194974208,3194976255,AR +3194978304,3194994687,PA +3194994688,3195002879,AR +3195011072,3195021311,AR +3195023360,3195024383,CL +3195024384,3195025407,UY +3195025408,3195035647,AR +3195043840,3195052031,CO +3195060224,3195064319,UY +3195068416,3195072511,AN +3195076608,3195084799,CL +3195092992,3195097087,AR +3195101184,3195105279,CR +3195109376,3195117567,AR +3195125760,3195133951,PE +3195142144,3195150335,VE +3195158528,3195183103,AR +3195191296,3195199487,AR +3195199488,3195201535,PY +3195203584,3195205631,VE +3195207680,3195211775,GT +3195215872,3195224063,AR +3195224064,3195232255,PA +3195273216,3195535359,PE +3195535360,3195539455,SV +3195543552,3195547647,PE +3195551744,3195555839,EC +3195559936,3195564031,AR +3195568128,3195572223,CO +3195576320,3195580415,CL +3195584512,3195592703,HT +3195592704,3195596799,PA +3195600896,3195633663,CL +3195633664,3195637759,CO +3195641856,3195645951,PY +3195650048,3195654143,GT +3195658240,3195662335,VE +3195666432,3195686911,AR +3195691008,3195695103,DO +3195699200,3195703295,AR +3195707392,3195711487,PA +3195715584,3195731967,AR +3195731968,3195736063,EC +3195740160,3195744255,PA +3195748352,3195752447,CL +3195756544,3195760639,AR +3195764736,3195768831,CR +3195772928,3195777023,VE +3195781120,3195797503,PA +3195797504,3195801599,AR +3195805696,3195807743,NI +3195807744,3195809791,BZ +3195809792,3195811839,PE +3195811840,3195813887,AR +3195813888,3195822079,DO +3195830272,3195838463,AR +3195838464,3195840511,HN +3195846656,3195852799,AR +3195852800,3195853823,AN +3195853824,3195854847,GY +3195854848,3195859967,AR +3195859968,3195862015,CR +3195862016,3195863039,AR +3195863040,3196059647,CO +3196059648,3196061695,UY +3196061696,3196092415,CO 3196092416,3196125183,PY -3196125184,3196157951,BO +3196125184,3196190719,BO 3196190720,3196207103,HN -3196256256,3196272639,EC +3196256256,3196321791,EC 3196321792,3196583935,UY 3196583936,3196690687,AR 3196690688,3196690943,UY -3196690944,3196807359,AR -3196807360,3196807367,AW -3196807368,3196846079,AR -3196846080,3196874431,PA -3196874432,3196874447,PG -3196874448,3196977151,PA +3196690944,3196846079,AR +3196846080,3196977151,PA 3196977152,3197042687,VE -3197042688,3197059071,CO +3197042688,3197075455,CO +3197075456,3197091839,GT 3197108224,3197370367,CO -3197370368,3197435903,GT -3197632512,3197665279,EC +3197370368,3197501439,GT +3197501440,3197534207,SV +3197566976,3197599743,CL +3197632512,3197698047,EC 3197698048,3197730815,VE -3197763584,3197861887,EC +3197763584,3197894655,EC 3197894656,3198156799,CO -3198156800,3198287871,CL -3198418944,3198484479,CL -3198484480,3198500863,CO -3198550016,3198615551,DO +3198156800,3198484479,CL +3198484480,3198550015,CO +3198550016,3198681087,DO 3198681088,3198877695,VE -3198943232,3199336447,AR -3199467520,3199469823,AR -3199469824,3199471103,US -3199471104,3199472127,AR -3199472128,3199472895,US -3199472896,3199474431,AR -3199474432,3199474687,US -3199474688,3199481087,AR -3199481088,3199481343,US -3199481344,3199484927,AR -3199484928,3199486719,US -3199486720,3199492351,AR -3199492352,3199492607,US -3199492608,3199492863,AR -3199492864,3199493119,US -3199493120,3199495935,AR -3199495936,3199499775,US -3199499776,3199516671,AR +3198877696,3198894079,CR +3198910464,3198926847,CL +3198943232,3199500799,AR +3199500800,3199501311,US +3199501312,3199533055,AR 3199533056,3199549439,BO -3199598592,3199614975,CO -3199664128,3199696895,AR +3199565824,3199582207,NI +3199598592,3199631359,CO +3199664128,3199729663,AR 3199729664,3199762431,NI -3199795200,3199811583,AN -3199860736,3199893503,BO -3199926272,3199959039,PE -3199991808,3200253951,AR -3200516096,3200532479,CL -3200581632,3200598015,BZ +3199795200,3199827967,AN +3199827968,3199844351,AR +3199860736,3199926271,BO +3199926272,3199991807,PE +3199991808,3200516095,AR +3200516096,3200565247,CL +3200565248,3200569343,HT +3200573440,3200577535,AR +3200581632,3200614399,BZ +3200614400,3200647167,AR 3200647168,3201302527,VE -3201302528,3201368063,CL -3201433600,3201435135,AR -3201435136,3201435263,US -3201435264,3201435559,AR -3201435560,3201435567,US -3201435568,3201441791,AR -3201441792,3201442047,US -3201442048,3201449983,AR -3201564672,3201581055,NI -3201630208,3201646591,TT -3201695744,3201728511,EC -3201826816,3201867775,AR -3201867776,3201871871,PE -3201871872,3201875967,AR +3201302528,3201433599,CL +3201433600,3201499135,AR +3201499136,3201515519,CL +3201564672,3201630207,NI +3201630208,3201695743,TT +3201695744,3201761279,EC +3201761280,3201794047,CL +3201826816,3201875967,AR 3201875968,3201880063,CO -3201880064,3201884159,EC -3201884160,3201888255,AR +3201880064,3201888255,AR 3201888256,3201892351,VE -3202088960,3202121727,AR -3202220032,3202285567,PE -3202351104,3202495495,AR -3202495496,3202495503,AW -3202495504,3202613247,AR -3202875392,3203006463,PE -3203399680,3203416063,CO -3203465216,3203481599,CR +3201957888,3202088959,PA +3202088960,3202220031,AR +3202220032,3202351103,PE +3202351104,3202875391,AR +3202875392,3203399679,PE +3203399680,3203432447,CO +3203465216,3203476479,CR +3203476480,3203476735,CO +3203476736,3203476991,CR +3203476992,3203477375,CO +3203477376,3203530751,CR 3203530752,3203538943,NI 3203538944,3203596287,CO 3203661824,3203923967,AR -3203923968,3204055039,CO -3204186112,3204448255,CO -3221159936,3221410411,US -3221410412,3221410412,FR -3221410413,3221422079,US -3221487616,3221553151,US -3221553408,3221555967,US -3221556224,3221560319,US -3221560320,3221561087,GB +3203923968,3204448255,CO +3221225472,3221560319,US +3221560320,3221561343,GB 3221561344,3221562367,US 3221562368,3221562623,SE -3221562624,3221564927,US -3221565184,3221565951,US +3221562624,3221565951,US 3221565952,3221566207,SE 3221566464,3221567743,US 3221568256,3221568511,FR 3221568768,3221569279,FR -3221569280,3221570559,US -3221571072,3221576191,US +3221569280,3221576191,US 3221576192,3221576447,KR 3221576448,3221577727,US 3221577728,3221577983,CA 3221577984,3221578239,IT -3221578240,3221579775,US -3221580032,3221589503,US +3221578240,3221589503,US 3221589504,3221589759,FR 3221589760,3221590015,US 3221590016,3221590271,CA 3221590272,3221590527,DE -3221590528,3221591807,US -3221592064,3221592575,US -3221593088,3221594623,US +3221590528,3221594623,US 3221594624,3221594879,AT -3221594880,3221605119,US +3221594880,3221605375,US 3221605376,3221605887,CA -3221605888,3221607167,US -3221607424,3221608447,US +3221605888,3221608447,US 3221608448,3221608703,JP -3221608704,3221609727,US -3221610240,3221614335,US +3221608704,3221614335,US 3221614336,3221614591,GB 3221614592,3221614847,AU 3221615104,3221618175,US 3221618176,3221618431,GB -3221618688,3221621247,US -3221621248,3221621503,GB -3221621504,3221627391,US -3221627392,3221627647,FR -3221627648,3221633279,US -3221633280,3221633535,CH -3221633536,3221633791,US -3221633792,3221634047,CH -3221634048,3221636607,US -3221636608,3221636863,CH -3221636864,3221637119,US -3221637120,3221637375,DE -3221637376,3221638143,US -3221638144,3221638399,DE -3221638400,3221640191,US +3221618688,3221618943,GB +3221618944,3221640191,US 3221640192,3221640447,NL -3221640448,3221642495,US -3221642496,3221642751,DE -3221642752,3221647103,US -3221647104,3221647359,FR -3221647360,3221650943,US -3221650944,3221651199,GB -3221651200,3221654783,US -3221654784,3221655039,FR -3221655040,3221663743,US -3221663744,3221663999,DE -3221664000,3221664255,NL -3221664256,3221664511,US -3221664512,3221664767,GB -3221664768,3221866495,US -3221866752,3221880575,US -3221880832,3222011903,US +3221640448,3221656831,US +3221656832,3221657087,AU +3221657088,3222011903,US 3222012160,3222012415,GB -3222012672,3222016511,US -3222016768,3222017023,US -3222017536,3222017791,US -3222018048,3222018559,US -3222018816,3222019839,US -3222020096,3222022399,US -3222022656,3222023423,US +3222012672,3222023423,US 3222023936,3222024191,IT -3222024192,3222024959,US -3222025216,3222025727,US +3222024192,3222025727,US 3222025728,3222025983,NL 3222026240,3222027775,US 3222027776,3222028031,CA @@ -30541,13 +59728,10 @@ 3222036736,3222036991,US 3222036992,3222037247,CA 3222037248,3222037503,GB -3222037504,3222038271,US -3222039808,3222044671,US +3222037504,3222038527,US +3222039552,3222044671,US 3222044928,3222045183,CA -3222045184,3222048767,US -3222049024,3222049279,US -3222050304,3222051327,US -3222051584,3222055935,US +3222045184,3222055935,US 3222056192,3222056447,US 3222056448,3222059007,CA 3222059008,3222061055,US @@ -30556,24 +59740,20 @@ 3222066944,3222067199,CA 3222067200,3222067455,US 3222067456,3222067967,CH -3222068224,3222068479,US -3222068992,3222071039,US +3222068224,3222071039,US 3222071040,3222071295,GB 3222071296,3222071551,PT 3222071552,3222072063,US 3222072064,3222072319,SE -3222072576,3222075135,US +3222072320,3222075135,US 3222075136,3222075391,CH -3222075392,3222075903,US -3222075904,3222076159,GB -3222076160,3222274047,US -3222292480,3222292735,US -3222292992,3222305535,US +3222075392,3222274047,US +3222290432,3222305535,US 3222305536,3222309119,SE +3222309120,3222309375,EU 3222309376,3222313727,SE 3222313728,3222316799,CH -3222316800,3222318591,US -3222318848,3222319615,US +3222316800,3222319615,US 3222319616,3222320127,JP 3222320128,3222320383,AU 3222320384,3222320895,US @@ -30586,10 +59766,11 @@ 3222868736,3222868991,DE 3222868992,3222869503,US 3222869504,3222869759,GB -3222869760,3222893311,US -3222893824,3222931711,US -3222931968,3222934527,US -3222934784,3222936319,US +3222869760,3222872319,US +3222872320,3222872575,CA +3222872576,3222890751,US +3222890752,3222891007,CA +3222891008,3222936575,US 3222936576,3222940927,CH 3222940928,3222941183,GB 3222941184,3222941695,CH @@ -30601,10 +59782,9 @@ 3222953984,3222954239,JP 3222954240,3222954495,US 3222955008,3222956031,US -3222956288,3222962431,FI -3222963456,3222964223,FI +3222956032,3222964223,FI 3222964224,3222964479,US -3222967040,3222968831,US +3222966272,3222968831,US 3222968832,3222973951,NL 3222973952,3222979071,DE 3222979072,3222983167,US @@ -30617,24 +59797,10 @@ 3222989312,3222989567,GB 3222989568,3222989823,CA 3222989824,3222990079,PT -3222990080,3222990335,NL +3222990080,3222990335,EU 3222990336,3222990591,AT 3222990592,3222990847,PT -3222990848,3222994687,US -3222994944,3223191551,US -3223201024,3223201279,US -3223202816,3223203071,US -3223204352,3223204607,US -3223205120,3223205375,US -3223207168,3223207423,US -3223214848,3223215359,US -3223216128,3223216383,US -3223217152,3223217407,US -3223219200,3223219455,US -3223220480,3223220735,US -3223220992,3223221247,US -3223222784,3223223039,US -3223223552,3223223807,US +3222990848,3223224319,US 3223227904,3223228159,CA 3223229184,3223229695,US 3223229696,3223229951,CA @@ -30643,9 +59809,7 @@ 3223243264,3223243519,CA 3223244288,3223245311,US 3223249408,3223249663,CA -3223254784,3223255295,US -3223255808,3223256063,US -3223257088,3223258623,US +3223252992,3223258623,US 3223258624,3223258879,CA 3223258880,3223260671,US 3223260672,3223260927,DE @@ -30658,19 +59822,13 @@ 3223265024,3223265279,GB 3223265280,3223267327,US 3223267328,3223267583,BE -3223267584,3223269119,US -3223269376,3223269631,US +3223267584,3223269631,US 3223272960,3223273215,GB -3223273216,3223280383,US -3223280640,3223280895,US -3223281408,3223283199,US +3223273216,3223283199,US 3223283200,3223283455,DE -3223283968,3223284991,US -3223285504,3223286783,US -3223286784,3223289087,JP -3223294208,3223297279,US -3223297536,3223298815,US -3223299072,3223299327,US +3223283712,3223286783,US +3223286784,3223289855,JP +3223293952,3223299327,US 3223299584,3223301119,NL 3223301120,3223303167,US 3223303168,3223303423,CA @@ -30680,26 +59838,21 @@ 3223310080,3223310335,US 3223310592,3223311103,US 3223311104,3223311359,FR -3223311360,3223311871,US -3223312128,3223314431,US +3223311360,3223314431,US 3223314432,3223314687,CA 3223314688,3223315455,US 3223315712,3223316223,US 3223316224,3223316479,NL -3223316480,3223316991,US -3223317248,3223317759,US -3223318016,3223319039,US -3223319808,3223321343,US +3223316480,3223321599,US 3223321600,3223321855,FR 3223321856,3223322367,US -3223322624,3223388159,US -3223388672,3223390719,US +3223322624,3223390719,US +3223390720,3223390975,ZA 3223391232,3223391999,US 3223392000,3223392255,FR 3223392256,3223392511,GB -3223393024,3223394047,US -3223396608,3223396863,US -3223397120,3223397375,US +3223393024,3223394303,US +3223396352,3223397375,US 3223397376,3223397631,NL 3223397632,3223410431,US 3223410432,3223416831,CH @@ -30712,15 +59865,13 @@ 3223421696,3223421951,NL 3223422464,3223422719,US 3223422720,3223422975,JP -3223423232,3223423743,US -3223424000,3223424767,US -3223424768,3223425535,FR -3223425792,3223430911,FR -3223431424,3223432191,FR -3223433216,3223435007,FR -3223435008,3223437055,US +3223422976,3223424767,US +3223424768,3223435007,FR +3223435008,3223437311,US 3223437312,3223447551,CH -3223447552,3223452671,US +3223447552,3223447807,US +3223447808,3223448063,NL +3223448064,3223452671,US 3223452928,3223453183,US 3223453184,3223453439,DE 3223458560,3223458815,GB @@ -30735,39 +59886,32 @@ 3223490816,3223491071,US 3223496960,3223497215,US 3223499520,3223499775,FI -3223500032,3223503871,CA -3223504640,3223504895,CA -3223507968,3223508223,US -3223508480,3223508735,US -3223513344,3223513599,US -3223514880,3223515135,US -3223516160,3223516415,US -3223516928,3223517183,US +3223499776,3223504895,CA +3223507968,3223508991,US +3223511040,3223519231,US 3223519232,3223524351,DE 3223524352,3223534335,US 3223534336,3223534591,AU 3223534592,3223534847,US 3223535104,3223535359,US 3223535360,3223537919,DE -3223537920,3223540991,US -3223541248,3223542271,US +3223537920,3223542271,US 3223542272,3223542527,DE 3223542528,3223543295,US 3223543296,3223543551,GB -3223543552,3223545855,US -3223546112,3223546879,US +3223543552,3223546879,US 3223546880,3223547135,GB -3223547136,3223551743,US -3223552000,3223554559,US +3223547136,3223552511,US +3223552512,3223553535,NL +3223553536,3223554559,US 3223554560,3223554815,GB -3223555328,3223556095,US +3223555072,3223556095,US 3223556096,3223556351,CA 3223556352,3223556607,US 3223556608,3223556863,IT 3223556864,3223557375,US 3223557376,3223558655,DE -3223558656,3223559423,US -3223559936,3223563263,US +3223558656,3223563263,US 3223563264,3223563519,GB 3223563520,3223565567,US 3223565824,3223566079,US @@ -30785,34 +59929,20 @@ 3223582208,3223582463,PT 3223582464,3223582719,NL 3223582720,3223582975,AU -3223583488,3223583743,US -3223584000,3223584511,US +3223583488,3223584767,US 3223584768,3223650303,SE 3223650304,3223715839,CH 3223715840,3223781375,DK 3223781376,3223823871,US 3223823872,3223824127,AT -3223824128,3223846911,US -3223848704,3223852799,US -3223853312,3223853567,US -3223854336,3223854591,US -3223857920,3223858175,US -3223858944,3223859455,US -3223859968,3223860223,US -3223860480,3223860991,US -3223862528,3223862783,US +3223824128,3223863295,US 3223863552,3223863807,US -3223864576,3223867647,FI -3223874816,3223875071,US -3223876608,3223876863,US -3223883520,3223883775,US -3223886592,3223887103,US -3223887616,3223887871,US +3223864320,3223867647,FI +3223871488,3223887871,US 3223898368,3223898623,US 3223902464,3223902719,CA 3223905280,3223905535,FI -3223909632,3223910143,US -3223910400,3223910911,US +3223909376,3223910911,US 3223911936,3223912191,CA 3223912448,3223938559,US 3223938816,3223946239,GB @@ -30839,11 +59969,9 @@ 3223966464,3223967743,US 3223968000,3223968255,US 3223968256,3223968511,IT -3223968512,3223968767,US -3223969024,3223970303,US +3223968512,3223970303,US 3223970560,3223970815,DE -3223971072,3223975935,US -3223976192,3223977983,US +3223970816,3223977983,US 3223978240,3223978495,DE 3223978752,3223979263,US 3223979264,3223979775,CA @@ -30860,40 +59988,35 @@ 3223994880,3223995391,US 3223995392,3223995647,CA 3223995648,3223996159,US -3223997184,3223999487,US +3223996416,3223999487,US 3223999488,3224000255,JP 3224000256,3224000511,GB 3224000512,3224001023,US 3224001024,3224001279,CA 3224001280,3224002559,US 3224002816,3224003327,US +3224003328,3224003583,ZA 3224003584,3224003839,GB 3224003840,3224004095,US 3224004096,3224004351,FR 3224004352,3224005631,JP -3224005632,3224006143,US -3224006400,3224006655,US -3224006912,3224012031,NL +3224005632,3224006655,US +3224006656,3224012031,NL 3224012032,3224014591,US 3224014592,3224014847,DE -3224014848,3224015615,US -3224015872,3224016639,US +3224014848,3224016639,US 3224016640,3224016895,AU -3224016896,3224017663,US -3224017920,3224022271,US +3224016896,3224023039,US 3224023808,3224024063,US 3224024064,3224029695,CH 3224029696,3224030463,CA 3224030720,3224030975,CA 3224030976,3224038655,US 3224038656,3224038911,JP -3224038912,3224039679,US -3224039936,3224040959,US -3224041216,3224042239,US -3224042496,3224042751,US +3224038912,3224042751,US 3224042752,3224043007,DE 3224043008,3224043263,US -3224043776,3224084991,US +3224043520,3224084991,US 3224084992,3224087551,SE 3224087552,3224088063,US 3224088064,3224088319,JP @@ -30901,7 +60024,7 @@ 3224090880,3224091135,AU 3224091648,3224091903,US 3224091904,3224092159,JP -3224092160,3224092671,US +3224092416,3224092671,US 3224092672,3224093951,CH 3224093952,3224094207,US 3224094208,3224094463,AU @@ -30915,50 +60038,41 @@ 3224098048,3224098559,US 3224098816,3224099583,US 3224099584,3224099839,CA -3224099840,3224100607,US +3224099840,3224100863,US 3224101120,3224101375,US 3224101376,3224102399,AU 3224103424,3224103679,GB 3224103680,3224104447,US 3224104704,3224104959,AU -3224104960,3224105471,US -3224105728,3224106495,US -3224106752,3224108799,US +3224104960,3224109055,US 3224109056,3224119551,DE -3224119552,3224126463,FR -3224127232,3224129791,FR +3224119552,3224129791,FR 3224129792,3224132351,DE 3224132352,3224170495,US 3224170496,3224173567,SE -3224173568,3224174335,US -3224174592,3224258047,US +3224173568,3224258047,US 3224258048,3224258303,FI 3224258304,3224258559,BE -3224258560,3224305663,US +3224258560,3224288255,US +3224288256,3224289023,DE +3224289024,3224302335,US +3224302336,3224302591,CA +3224302592,3224305663,US 3224305664,3224367615,JP 3224367616,3224368127,US 3224368128,3224369663,CH -3224369664,3224370431,US -3224370688,3224370943,US -3224371200,3224379135,US +3224369664,3224379135,US 3224379136,3224379391,DE -3224379392,3224392191,US -3224394752,3224396287,US -3224396288,3224396543,FR -3224396544,3224397055,US -3224397824,3224398079,US +3224379392,3224398079,US 3224398336,3224398591,US 3224398592,3224398847,DE 3224398848,3224399103,US 3224399104,3224399615,AU -3224399616,3224406015,US -3224406272,3224406527,US -3224406784,3224407039,US +3224399616,3224407039,US 3224407296,3224407551,CA 3224407808,3224408319,US 3224408320,3224408575,DE -3224408576,3224424959,US -3224425216,3224428287,US +3224408576,3224428543,US 3224428544,3224428799,DE 3224428800,3224430079,US 3224430336,3224430591,DE @@ -30966,19 +60080,15 @@ 3224431104,3224431359,CA 3224431360,3224431615,US 3224432128,3224432383,US -3224433152,3224433407,US -3224433664,3224434687,US +3224432640,3224434687,US 3224434688,3224434943,AU 3224434944,3224435967,US +3224435968,3224436223,ZA 3224436224,3224436479,US 3224436736,3224502271,FI 3224502272,3224567807,JP 3224567808,3224571903,NO -3224571904,3224580095,JP -3224580352,3224615935,JP -3224616192,3224616959,JP -3224617472,3224629247,JP -3224629504,3224633343,JP +3224571904,3224633343,JP 3224633344,3224646399,DE 3224646400,3224651775,US 3224651776,3224652287,AU @@ -31002,24 +60112,26 @@ 3224683520,3224684031,AU 3224684032,3224689919,US 3224689920,3224690687,NL -3224690688,3224691455,US -3224691968,3224692735,US +3224690688,3224692735,US 3224692736,3224692991,DZ 3224692992,3224694527,US 3224694528,3224694783,CA -3224694784,3224695039,US -3224695808,3224697343,US +3224694784,3224697343,US 3224697856,3224698111,US 3224698112,3224698367,GB 3224698368,3224698623,FR -3224698880,3224725247,US +3224698880,3224699135,US +3224699136,3224699647,BE +3224699648,3224725247,US 3224725248,3224725503,DE 3224725504,3224725759,CH -3224725760,3224772351,US -3224772352,3224777983,DE -3224778240,3224785151,DE -3224785152,3224787967,US -3224788480,3224791039,US +3224725760,3224739071,US +3224739072,3224739327,FI +3224739328,3224772351,US +3224772352,3224781311,DE +3224781312,3224781567,EU +3224781568,3224785151,DE +3224785152,3224791039,US 3224791040,3224791295,DE 3224791296,3224791807,AU 3224791808,3224793343,US @@ -31039,15 +60151,15 @@ 3224799488,3224799743,AU 3224799744,3224799999,US 3224800000,3224800255,DE -3224800512,3224816639,FR +3224800256,3224816639,FR +3224816640,3224816895,EU 3224816896,3224820735,FR 3224820736,3224820991,AT 3224820992,3224821247,DE 3224821248,3224822015,US 3224822016,3224822271,SE 3224822272,3224822527,US -3224822784,3224823039,US -3224823296,3224826367,US +3224822784,3224826367,US 3224826368,3224826623,CA 3224826624,3224826879,US 3224826880,3224827135,CH @@ -31058,7 +60170,7 @@ 3224828672,3224828927,AU 3224829184,3224829439,US 3224829440,3224829695,DE -3224830208,3224851455,US +3224829952,3224851455,US 3224851456,3224851711,DE 3224851968,3224852735,US 3224852736,3224852991,DE @@ -31070,6 +60182,7 @@ 3224856064,3224856575,US 3224856832,3224857087,NL 3224857088,3224857855,US +3224857856,3224858111,EU 3224858112,3224858367,JP 3224858368,3224858623,US 3224858624,3224858879,AU @@ -31077,7 +60190,7 @@ 3224859392,3224859647,NL 3224859648,3224860159,US 3224860160,3224860415,JP -3224860928,3224862975,US +3224860672,3224862719,US 3224862976,3224863231,NL 3224863488,3224863743,US 3224863744,3224863999,GB @@ -31090,8 +60203,7 @@ 3224879872,3224880383,US 3224880384,3224880639,DE 3224880640,3224880895,AU -3224880896,3224881151,US -3224881408,3224882431,US +3224880896,3224882431,US 3224882688,3224882943,CA 3224882944,3224883455,US 3224883456,3224883711,AU @@ -31100,10 +60212,11 @@ 3224884480,3224884991,US 3224885248,3224885503,CA 3224885760,3224886015,US +3224886016,3224886271,AU 3224886272,3224886527,JP 3224886528,3224887295,US 3224887296,3224887551,CA -3224887808,3224889087,US +3224887808,3224889343,US 3224889344,3224889599,AU 3224889600,3224890879,US 3224890880,3224891135,JP @@ -31112,59 +60225,60 @@ 3224892416,3224892671,DE 3224892928,3224893183,US 3224893440,3224893951,US -3224895488,3224900607,US -3224900608,3224900863,FR -3224900864,3224921087,US +3224895488,3224899071,US +3224899072,3224899327,AT +3224899328,3224908543,US +3224908544,3224908799,CA +3224908800,3224921087,US 3224921088,3224921343,FI 3224921344,3224928255,US 3224928256,3224928511,FI -3224928512,3225026559,US -3225026816,3225028863,US +3224928512,3224933887,US +3224933888,3224934143,DE +3224934144,3224957951,US +3224957952,3224958207,CA +3224958208,3225028863,US 3225028864,3225031423,JP 3225031424,3225033727,US 3225033728,3225035775,LU 3225035776,3225037055,US -3225037056,3225049599,FI -3225051392,3225052671,JP -3225052672,3225056767,US -3225057024,3225057535,US +3225037056,3225051135,FI +3225051136,3225052671,JP +3225052672,3225057535,US 3225057536,3225057791,CA -3225057792,3225060095,US -3225060608,3225061631,AU -3225064704,3225075967,US -3225076224,3225076479,CA -3225076480,3225076991,US +3225057792,3225060351,US +3225060352,3225061631,AU +3225063424,3225076991,US 3225076992,3225077247,SE 3225077504,3225081087,US 3225081088,3225081343,CA 3225081600,3225082367,US 3225082368,3225082623,IT -3225082880,3225089279,US +3225082880,3225084671,US +3225084672,3225085183,NL +3225085184,3225089279,US 3225089280,3225089535,CA -3225089536,3225091071,US -3225091584,3225091839,US -3225092096,3225419775,US +3225089536,3225314303,US +3225314304,3225314559,GB +3225314560,3225419775,US 3225420032,3225420287,US 3225423872,3225424383,US 3225426944,3225427199,AT 3225429504,3225429759,CA +3225431040,3225431551,EU 3225431552,3225433087,US -3225437184,3225437695,US -3225442304,3225442559,US -3225444352,3225444607,US +3225436160,3225444607,US 3225445376,3225446399,BE 3225451776,3225452031,SE 3225459968,3225460479,US -3225460480,3225460735,CA -3225460992,3225462015,CA +3225460480,3225462783,CA 3225470464,3225470719,US 3225471488,3225471743,DE 3225471744,3225472511,US -3225477632,3225480191,US -3225485568,3225498111,US +3225477120,3225481215,US +3225485312,3225498111,US 3225498368,3225503487,NL -3225503488,3225505535,US -3225505792,3225506047,US +3225503488,3225506047,US 3225506304,3225508863,AU 3225508864,3225509631,CH 3225509632,3225509887,US @@ -31180,23 +60294,21 @@ 3225522944,3225524223,US 3225524224,3225524479,VE 3225524480,3225524735,GB -3225529088,3225529343,US -3225529600,3225530367,US +3225528320,3225530367,US 3225530368,3225530623,PR 3225530624,3225530879,US 3225531136,3225531647,US 3225531904,3225532159,AU 3225532160,3225535999,CH -3225536000,3225539839,US -3225540096,3225540863,US +3225536000,3225540863,US 3225540864,3225541119,AU 3225541120,3225541375,US -3225541376,3225543935,GB -3225547776,3225548543,US +3225541376,3225544703,GB +3225547776,3225548799,US 3225548800,3225549055,NZ 3225549056,3225549311,US 3225549312,3225549567,AU -3225549568,3225550591,US +3225549568,3225550847,US 3225550848,3225616383,DK 3225616640,3225616895,AU 3225617152,3225617407,IE @@ -31222,10 +60334,7 @@ 3225630464,3225630719,DE 3225630720,3225631231,US 3225631232,3225631487,SE -3225631488,3225632767,US -3225633536,3225633791,US -3225634048,3225634815,US -3225635072,3225635583,US +3225631488,3225635839,US 3225635840,3225636095,PT 3225636096,3225636607,US 3225636608,3225636863,ES @@ -31238,57 +60347,52 @@ 3225640704,3225641983,US 3225641984,3225643263,GB 3225643264,3225643775,CA -3225643776,3225649919,US -3225650176,3225650943,US +3225643776,3225650943,US 3225650944,3225651199,GB -3225651200,3225657087,US +3225651200,3225657343,US 3225658624,3225659135,US 3225659136,3225659391,DE 3225659392,3225659647,NZ 3225659904,3225660159,DE 3225660160,3225660415,AU -3225660672,3225663743,US -3225664000,3225664511,US -3225664768,3225669887,DE +3225660416,3225664511,US +3225664512,3225669887,DE 3225669888,3225671935,US 3225671936,3225672191,AU 3225672192,3225672447,DE 3225672448,3225672703,US 3225672704,3225673215,NL 3225673472,3225673727,IE -3225673984,3225675263,US -3225675264,3225676287,DE -3225676288,3225679871,US +3225673728,3225679871,US 3225679872,3225680127,AU 3225680128,3225680383,GR -3225680640,3225681151,US -3225681408,3225681663,US +3225680640,3225681919,US 3225681920,3225682943,DE 3225682944,3225683199,AT 3225683200,3225687039,DE 3225687040,3225687807,US 3225687808,3225688063,GB -3225688320,3225689343,US +3225688064,3225689343,US 3225689600,3225689855,US 3225689856,3225694975,NL +3225694976,3225695231,EU 3225695232,3225695487,US 3225695488,3225701119,CA 3225701120,3225701375,US 3225701376,3225709567,NO 3225709568,3225710079,US 3225710080,3225710591,JP -3225710592,3225711615,US -3225712128,3225714175,US +3225710592,3225714687,US 3225715456,3225715711,CA 3225715712,3225715967,AU 3225715968,3225716991,US 3225716992,3225717247,CA +3225717248,3225717503,TN 3225717504,3225717759,AU 3225717760,3225720063,US 3225720576,3225721343,GB -3225721344,3225722111,US -3225722624,3225723647,US -3225724160,3225725439,DE +3225721344,3225723903,US +3225723904,3225725439,DE 3225725440,3225725695,GB 3225725696,3225726207,AU 3225726208,3225726463,US @@ -31303,10 +60407,7 @@ 3225729024,3225729279,CA 3225729280,3225729535,US 3225729536,3225729791,PT -3225729792,3225730047,US -3225730304,3225730559,US -3225730816,3225733887,US -3225734144,3225735167,US +3225729792,3225735167,US 3225735424,3225735679,PT 3225735680,3225735935,US 3225735936,3225737215,DE @@ -31323,37 +60424,30 @@ 3225745920,3225746687,NL 3225746688,3225746943,US 3225746944,3225747199,DE -3225747456,3225747711,US -3225752832,3225753087,US -3225759232,3225759487,US +3225747456,3225763839,US 3225763840,3225764095,BE 3225766400,3225766655,CA -3225767936,3225768191,US -3225768960,3225769215,US +3225767936,3225769983,US 3225773312,3225773567,CA 3225776128,3225776383,US 3225777152,3225777407,AU 3225777408,3225777663,US -3225780224,3225780479,US -3225783296,3225783551,US -3225783808,3225784063,US -3225785600,3225788159,CA +3225780224,3225784319,US +3225784320,3225788415,CA 3225796096,3225796351,US -3225806080,3225806847,US +3225805824,3225806847,US 3225807360,3225807615,DE 3225810688,3225810943,US 3225812992,3225827071,FR 3225827072,3225827327,US 3225827328,3225843711,FR -3225843712,3225846527,US -3225846784,3225847039,US +3225843712,3225847039,US 3225847040,3225847551,TR 3225847552,3225847807,AU 3225847808,3225848063,IT 3225848064,3225848831,US 3225848832,3225853951,DE -3225853952,3225854719,US -3225855232,3225857023,US +3225853952,3225857023,US 3225857024,3225857279,CA 3225857280,3225857535,US 3225857536,3225857791,AU @@ -31361,29 +60455,28 @@ 3225858048,3225858559,CA 3225858560,3225858815,US 3225858816,3225860095,JP -3225860096,3225861887,US -3225862144,3225867775,US -3225868032,3225868287,US +3225860096,3225868287,US 3225868288,3225868543,AU 3225868544,3225869055,US 3225869056,3225869311,AU -3225869568,3225870335,US +3225869312,3225870335,US 3225870336,3225870591,CA 3225870592,3225873663,US +3225873664,3225873919,ZA 3225873920,3225874943,US 3225874944,3225875199,GB 3225875456,3225875967,US -3225876480,3225878271,US +3225876480,3225878527,US 3225878528,3225880319,SE 3225880320,3225880575,US 3225880576,3225944063,SE -3225944832,3225977855,TW +3225944064,3225977855,TW 3225977856,3225978111,CH 3225978112,3226008831,TW 3226008832,3226009343,US -3226009856,3226010879,US +3226009600,3226010879,US 3226010880,3226011135,CA -3226011136,3226012415,US +3226011136,3226012671,US 3226012672,3226012927,AU 3226012928,3226014207,US 3226014464,3226014975,GB @@ -31393,52 +60486,43 @@ 3226016256,3226018303,US 3226018304,3226018559,DE 3226018560,3226021119,CH -3226021120,3226023423,US -3226023680,3226026495,US +3226021120,3226026495,US 3226026496,3226026751,AU -3226026752,3226030079,US -3226030592,3226064383,US -3226064640,3226066687,US -3226066944,3226067455,US +3226026752,3226067455,US 3226067456,3226067711,BE 3226067712,3226068223,US 3226068224,3226068479,GB 3226068480,3226068991,US -3226075136,3226107647,US +3226075136,3226107903,US 3226110208,3226110719,US 3226110720,3226128639,AU 3226128640,3226131455,US -3226140928,3226143487,CA -3226143744,3226156543,CA -3226156800,3226167807,CA -3226168064,3226175231,CA -3226175744,3226188543,CA -3226189056,3226189311,CA -3226189568,3226189823,CA +3226140672,3226157567,CA +3226157568,3226157823,US +3226157824,3226189823,CA 3226191360,3226191615,US -3226191872,3226194175,CA -3226194432,3226194687,CA -3226194944,3226201855,CA +3226191872,3226201855,CA 3226201856,3226202111,US -3226202112,3226205951,CA -3226207744,3226215423,GB -3226215424,3226236159,US +3226202112,3226205439,CA +3226205440,3226205695,AE +3226205696,3226205951,CA +3226206208,3226215423,GB +3226215424,3226236927,US 3226237184,3226237439,US 3226237440,3226237695,AU -3226237696,3226240255,DE -3226240512,3226250495,DE +3226237696,3226241535,DE +3226241536,3226241791,EU +3226241792,3226250495,DE 3226250496,3226251263,US 3226251264,3226251519,DE -3226251520,3226252287,US -3226252544,3226253567,US -3226253824,3226267903,US +3226251520,3226267903,US 3226267904,3226268159,DE 3226268160,3226268415,PT 3226268416,3226268927,AT 3226268928,3226269951,DE 3226269952,3226270719,US -3226270720,3226271487,JP -3226272000,3226273791,US +3226270720,3226271743,JP +3226271744,3226273791,US 3226273792,3226274047,AU 3226274048,3226274559,US 3226274560,3226274815,CH @@ -31447,8 +60531,7 @@ 3226276352,3226276863,US 3226277632,3226283519,US 3226283520,3226291199,CA -3226291200,3226300159,US -3226300416,3226300927,US +3226291200,3226300927,US 3226300928,3226301439,DE 3226301440,3226302463,US 3226302464,3226303487,FI @@ -31456,17 +60539,22 @@ 3226305536,3226307327,GB 3226307328,3226307583,US 3226307584,3226308095,ES -3226308096,3226308863,US -3226309120,3226316799,US -3226318080,3226318335,US -3226319360,3226319615,US -3226320896,3226331903,US -3226337536,3226365439,US +3226308096,3226365439,US 3226365440,3226365951,DE -3226365952,3226374143,US +3226365952,3226366975,US +3226366976,3226367231,CA +3226367232,3226374143,US 3226374144,3226375423,DE -3226375424,3226468351,US -3226470656,3226473471,US +3226375424,3226376703,US +3226376704,3226376959,AT +3226376960,3226384639,US +3226384640,3226385407,BE +3226385408,3226393599,US +3226393600,3226393855,DE +3226393856,3226397695,US +3226397696,3226400255,DE +3226400256,3226468351,US +3226470400,3226473471,US 3226473472,3226473983,PT 3226473984,3226474495,US 3226474496,3226474751,CL @@ -31477,22 +60565,15 @@ 3226480128,3226480383,GB 3226480384,3226481407,US 3226481408,3226481663,DE -3226481664,3226483199,US -3226483968,3226484479,US -3226484736,3226487295,US -3226488064,3226488831,US -3226489088,3226490879,US -3226491904,3226492927,US +3226481664,3226492927,US 3226521344,3226521855,US 3226521856,3226522111,BR -3226522112,3226523135,US -3226523392,3226533631,US +3226522112,3226533887,US 3226535936,3226536191,US 3226546176,3226546431,US 3226548992,3226549247,BE -3226549504,3226550015,GB -3226551040,3226551807,US -3226552832,3226553087,US +3226549248,3226550271,GB +3226550272,3226554367,US 3226555648,3226555903,CA 3226556416,3226556671,US 3226558720,3226558975,US @@ -31510,12 +60591,9 @@ 3226592768,3226593023,DE 3226593792,3226594047,GB 3226598400,3226598911,US -3226599424,3226625535,US -3226625536,3226625791,CA -3226625792,3226626047,US +3226599424,3226626047,US 3226626048,3226626303,CA -3226626304,3226627327,US -3226627584,3226629375,US +3226626304,3226629375,US 3226629376,3226629631,CA 3226629632,3226630399,US 3226630400,3226630655,GB @@ -31528,6 +60606,7 @@ 3226635008,3226635263,US 3226635264,3226635519,AU 3226635520,3226635775,US +3226635776,3226636031,ZA 3226636032,3226636287,AU 3226637056,3226637823,US 3226637824,3226638079,CA @@ -31544,17 +60623,14 @@ 3226656256,3226656511,AU 3226656512,3226658303,US 3226658304,3226658559,AU -3226658560,3226658815,US -3226659072,3226661119,US +3226658560,3226661119,US 3226661120,3226661375,DE 3226661888,3226662143,US 3226664960,3226690815,FI 3226690816,3226691071,CA 3226691072,3226691327,GB 3226691584,3226691839,JP -3226691840,3226693119,US -3226693376,3226693887,US -3226694144,3226695167,US +3226691840,3226695167,US 3226695168,3226695679,AU 3226695680,3226695935,US 3226695936,3226696191,CA @@ -31564,6 +60640,7 @@ 3226705408,3226705919,US 3226705920,3226706175,FR 3226706176,3226706943,US +3226707200,3226707455,EU 3226707456,3226715391,TW 3226715392,3226715647,US 3226715648,3226715903,AU @@ -31579,13 +60656,13 @@ 3226722304,3226722559,AU 3226722560,3226723583,US 3226723584,3226723839,DE -3226723840,3226724095,US +3226723840,3226724095,JP 3226724096,3226724351,AU 3226724352,3226725631,US 3226725632,3226726143,AU 3226726144,3226728191,US 3226728192,3226728447,CA -3226728448,3226729983,US +3226728448,3226730495,US 3226731008,3226731519,US 3226731776,3226732031,GB 3226732288,3226733567,US @@ -31593,14 +60670,12 @@ 3226733824,3226734079,PT 3226734080,3226734335,US 3226734336,3226734591,PT -3226734592,3226736383,US -3226736640,3226737407,US +3226734592,3226737407,US 3226737408,3226737663,AT 3226737664,3226738175,US 3226738176,3226738431,NL 3226738432,3226738687,US 3226738688,3226739199,NO -3226739200,3226739455,US 3226740736,3226742783,US 3226744576,3226746367,US 3226746368,3226746623,PT @@ -31614,8 +60689,7 @@ 3226753280,3226753535,AU 3226753536,3226753791,SI 3226753792,3226754303,HR -3226754304,3226756095,SI -3226756352,3226757375,SI +3226754304,3226757375,SI 3226757376,3226757887,HR 3226757888,3226758655,SI 3226758912,3226762751,US @@ -31624,10 +60698,9 @@ 3226772992,3226773247,CH 3226773248,3226774783,US 3226774784,3226775039,GB -3226775040,3226775551,US +3226775040,3226775295,US 3226775552,3226783743,FI -3226783744,3226783999,US -3226784256,3226784767,US +3226783744,3226784767,US 3226784768,3226785023,GB 3226785024,3226786559,US 3226786560,3226786815,AU @@ -31641,12 +60714,18 @@ 3226791680,3226792191,US 3226792192,3226792703,AU 3226792704,3226792959,US +3226792960,3226793215,ZA 3226793216,3226793983,DE -3226793984,3226794239,US -3226794496,3226795263,US +3226793984,3226795263,US 3226795264,3226795519,NZ 3226795520,3226795775,US -3226796032,3226861567,US +3226796032,3226800127,US +3226800128,3226800639,DE +3226800640,3226811391,US +3226811392,3226811647,DE +3226811648,3226824191,US +3226824192,3226824447,DE +3226824448,3226861567,US 3226861824,3226862079,CA 3226862080,3226864383,US 3226864384,3226864639,RU @@ -31655,18 +60734,13 @@ 3226865152,3226865407,PL 3226865408,3226866175,US 3226866176,3226866431,GB -3226866432,3226866943,US -3226867456,3226867967,US +3226866432,3226867967,US 3226867968,3226868223,IL 3226868224,3226868479,US 3226868480,3226868735,GB -3226868736,3226882303,US -3226882560,3226884351,US +3226868736,3226884351,US 3226884352,3226884607,IL -3226884608,3226886143,US -3226886144,3226886399,PR -3226886400,3226892799,US -3226893056,3226893567,US +3226884608,3226893567,US 3226893568,3226894079,NL 3226894080,3226894335,GB 3226894336,3226894591,US @@ -31696,12 +60770,11 @@ 3226994176,3226994687,AU 3226994688,3226994943,US 3226994944,3226995455,GB -3226995456,3226996479,US +3226995456,3226996735,US 3226996992,3226997247,PT 3226998016,3226998527,US 3226998528,3226999039,AT -3226999040,3227005439,US -3227005696,3227013119,US +3226999040,3227013119,US 3227013120,3227013375,JP 3227013376,3227013887,US 3227013888,3227014399,GB @@ -31709,8 +60782,7 @@ 3227014656,3227014911,FI 3227014912,3227017215,US 3227017472,3227017983,DE -3227017984,3227018239,US -3227018752,3227019007,JP +3227018496,3227019007,JP 3227019008,3227020287,US 3227020288,3227020543,DE 3227020800,3227022847,US @@ -31725,9 +60797,8 @@ 3227025920,3227026175,GB 3227026176,3227026687,US 3227026688,3227026943,GB -3227027456,3227032319,US -3227032576,3227038207,US -3227039744,3227040511,US +3227027456,3227038207,US +3227039744,3227040255,US 3227040512,3227040767,AU 3227040768,3227041279,US 3227041280,3227041535,NZ @@ -31735,20 +60806,30 @@ 3227042816,3227043071,IT 3227043072,3227043327,US 3227043584,3227044863,US -3227044864,3227045119,DE +3227044864,3227045119,EU 3227045120,3227053567,US 3227053568,3227053823,GB 3227053824,3227054079,DE 3227054080,3227056639,US -3227056640,3227057919,PT -3227058176,3227083519,FI +3227056640,3227058175,PT +3227058176,3227058951,FI +3227058952,3227058955,AX +3227058956,3227060735,FI +3227060736,3227060799,AX +3227060800,3227071999,FI +3227072000,3227072127,AX +3227072128,3227072171,FI +3227072172,3227072175,AX +3227072176,3227083519,FI 3227083520,3227083775,ES -3227083776,3227123711,FI -3227123712,3227189247,US -3227189504,3227224831,US +3227083776,3227119679,FI +3227119680,3227119711,AX +3227119712,3227123199,FI +3227123200,3227123455,AX +3227123456,3227123711,FI +3227123712,3227225087,US 3227225088,3227225599,LU -3227225600,3227226111,US -3227226368,3227234559,US +3227225600,3227234559,US 3227234560,3227234815,PT 3227234816,3227235071,US 3227235072,3227235327,AU @@ -31763,8 +60844,7 @@ 3227240192,3227240447,GB 3227240448,3227240703,BE 3227240704,3227240959,GB -3227240960,3227241471,US -3227241728,3227243007,US +3227240960,3227243007,US 3227243008,3227243263,CA 3227243264,3227243519,GB 3227243520,3227243775,US @@ -31772,19 +60852,19 @@ 3227244032,3227249151,SE 3227249408,3227249663,US 3227249664,3227252735,CH -3227252736,3227252991,US -3227253248,3227254271,US +3227252736,3227254271,US 3227254272,3227254527,HK -3227257088,3227258623,US +3227256832,3227258623,US 3227258624,3227258879,NZ -3227258880,3227259135,US -3227259392,3227276543,US +3227258880,3227273983,US +3227273984,3227274239,FI +3227274240,3227274495,US +3227274496,3227274751,NL +3227274752,3227276543,US 3227276800,3227277055,FR 3227277312,3227278847,US 3227278848,3227279103,IE -3227279104,3227279615,US -3227279872,3227280895,US -3227281152,3227281407,US +3227279104,3227281407,US 3227281408,3227282175,IT 3227282176,3227282431,US 3227282432,3227282687,NL @@ -31808,36 +60888,31 @@ 3227290880,3227291135,AT 3227291136,3227294463,PT 3227294464,3227294975,GR -3227295232,3227299839,US -3227300096,3227301375,US -3227301632,3227302399,US -3227302656,3227304191,US -3227304448,3227304959,US -3227305216,3227305983,US +3227295232,3227305983,US 3227309824,3227310079,US 3227310080,3227310335,NO 3227310336,3227312127,US 3227312128,3227312383,DK -3227312384,3227314943,US +3227312384,3227315199,US 3227320320,3227361791,FR 3227361792,3227362303,US 3227362304,3227385855,FR -3227386112,3227391999,US +3227385856,3227391999,US 3227392000,3227392255,PT 3227392256,3227393023,US 3227393024,3227393279,AT 3227393280,3227396351,US 3227396352,3227396607,AU -3227396608,3227398399,US -3227398656,3227400447,US +3227396608,3227400447,US 3227400448,3227400703,AT 3227400704,3227400959,GB 3227400960,3227401471,US +3227401472,3227401727,ZA 3227401728,3227402495,AU 3227402496,3227403007,US 3227403008,3227403519,GR 3227403520,3227403775,US -3227404544,3227405311,US +3227404288,3227405311,US 3227405312,3227405567,DE 3227405568,3227414015,US 3227414272,3227415551,GB @@ -31848,12 +60923,10 @@ 3227417344,3227417599,US 3227417856,3227418111,US 3227418112,3227418367,CA -3227418368,3227425023,US -3227425280,3227425791,US +3227418368,3227425791,US 3227425792,3227427583,DK 3227427584,3227427839,ES -3227427840,3227428351,US -3227428608,3227429119,US +3227427840,3227429119,US 3227429120,3227429375,NZ 3227429376,3227429887,US 3227429888,3227430143,GB @@ -31864,13 +60937,14 @@ 3227437312,3227437823,US 3227438848,3227439103,US 3227439104,3227439615,AU +3227439616,3227439871,ZA 3227439872,3227440127,US 3227440128,3227440383,IT 3227440384,3227442175,US 3227442176,3227442431,JP 3227442432,3227442687,RU 3227442688,3227443711,US -3227443712,3227443967,AT +3227443712,3227443967,EU 3227443968,3227444223,AU 3227444224,3227445503,US 3227445504,3227445759,CH @@ -31879,25 +60953,30 @@ 3227446272,3227446783,US 3227446784,3227447039,JP 3227447040,3227447295,AT +3227447296,3227447807,ZA 3227447808,3227448063,US 3227448064,3227448575,AU 3227448576,3227448831,US -3227449088,3227450111,US +3227448832,3227449087,ZA +3227449088,3227450367,US 3227468032,3227468287,US -3227582464,3227647999,US +3227516928,3227582463,ZA +3227582464,3227638271,US +3227638272,3227638527,CA +3227638528,3227647999,US 3227648000,3227659775,FI 3227659776,3227660031,JP 3227660032,3227660543,FI 3227660544,3227660799,EE 3227660800,3227713535,FI +3227779328,3227779583,ZA 3227779584,3227779839,KR 3227779840,3227783679,US 3227783680,3227783935,FR 3227783936,3227784703,US 3227784704,3227784959,AU 3227784960,3227785727,AT -3227785728,3227786495,US -3227786752,3227792383,US +3227785728,3227792383,US 3227792384,3227792639,GB 3227792640,3227792895,NZ 3227792896,3227794687,US @@ -31911,20 +60990,25 @@ 3227799296,3227799551,US 3227799552,3227799807,AU 3227799808,3227800063,US -3227800320,3227801343,US -3227801600,3227803647,US +3227800320,3227803647,US 3227803648,3227804415,DE 3227804416,3227804671,GB 3227804672,3227804927,US 3227804928,3227805183,CA -3227805184,3227813375,FI +3227805184,3227805695,FI +3227805696,3227806463,US +3227806464,3227806495,FI +3227806496,3227806527,GB +3227806528,3227806719,FI +3227806720,3227807743,US +3227807744,3227813375,FI 3227813376,3227813631,US 3227813632,3227815167,GB 3227815168,3227815935,US 3227815936,3227816191,GB 3227816192,3227818495,US 3227818496,3227818751,GB -3227818752,3227844351,MX +3227818752,3227844607,MX 3227844864,3227845119,ES 3227845120,3227845631,US 3227845632,3227845887,RU @@ -31937,22 +61021,23 @@ 3227851776,3227852031,DE 3227852032,3227853055,US 3227853312,3227853567,GB -3227853568,3227856127,US -3227856896,3227860991,US +3227853568,3227860991,US 3227863808,3227864063,DE -3227864064,3227864831,US -3227865088,3227865343,US +3227864064,3227865343,US 3227865344,3227867903,NL 3227867904,3227868159,TH -3227868160,3227874815,US +3227868160,3227873023,US +3227873024,3227874047,NL +3227874048,3227874815,US 3227874816,3227875071,PT 3227875072,3227878911,US 3227878912,3227879167,AU 3227879168,3227879679,US 3227879680,3227879935,GB 3227880192,3227880959,US +3227880960,3227881215,EG 3227881216,3227885567,US -3227885824,3227887871,ES +3227885568,3227887871,ES 3227887872,3227888127,PR 3227888128,3227888383,BE 3227888384,3227889663,US @@ -31973,10 +61058,10 @@ 3227910656,3227911679,US 3227911680,3227912191,HU 3227912192,3227912447,GB +3227912448,3227912703,ZA 3227912704,3227912959,US 3227912960,3227913215,CA -3227913216,3227913983,US -3227914240,3227914495,US +3227913216,3227914495,US 3227914496,3227914751,AT 3227914752,3227918591,FI 3227918592,3227918847,US @@ -32033,9 +61118,7 @@ 3228010752,3228011519,GB 3228011520,3228013311,US 3228013312,3228013567,PT -3228013568,3228039423,US -3228041472,3228042239,US -3228042752,3228045055,US +3228013568,3228045055,US 3228045056,3228045311,KR 3228045312,3228046335,US 3228046592,3228047103,US @@ -32064,17 +61147,17 @@ 3228061696,3228061951,JP 3228061952,3228062207,US 3228062208,3228062463,GB -3228062464,3228069631,US -3228076288,3228077055,US +3228062464,3228069887,US +3228076032,3228077055,US 3228077056,3228077311,NL 3228077312,3228077567,US 3228077568,3228077823,NL 3228077824,3228078847,US 3228078848,3228079103,GR -3228079360,3228080639,US +3228079104,3228080639,US 3228080640,3228080895,IE 3228080896,3228081151,FR -3228081152,3228081919,US +3228081152,3228082175,US 3228082944,3228083967,US 3228083968,3228084479,BE 3228084480,3228085247,US @@ -32083,8 +61166,7 @@ 3228100608,3228101119,JP 3228101120,3228102143,US 3228102144,3228102399,GB -3228102400,3228103423,US -3228103680,3228103935,US +3228102400,3228103935,US 3228103936,3228104191,FR 3228104192,3228104703,JP 3228104704,3228104959,DK @@ -32096,10 +61178,16 @@ 3228109312,3228109567,NZ 3228109568,3228125951,US 3228125952,3228126207,DE -3228126208,3228172287,US -3228172288,3228222463,IT -3228222464,3228222975,NL -3228222976,3228237823,IT +3228126208,3228133375,US +3228133376,3228134655,CA +3228134656,3228150271,US +3228150272,3228150527,FI +3228150528,3228156671,US +3228156672,3228156927,BE +3228156928,3228171775,US +3228171776,3228172031,GB +3228172032,3228172287,US +3228172288,3228237823,IT 3228238080,3228238335,NO 3228238336,3228238591,GB 3228238592,3228238847,US @@ -32127,7 +61215,7 @@ 3228271360,3228271615,CA 3228271616,3228271871,DE 3228272128,3228272383,US -3228274944,3228280831,US +3228274688,3228280831,US 3228280832,3228281087,GB 3228281088,3228281599,US 3228281600,3228282111,NZ @@ -32143,10 +61231,8 @@ 3228297216,3228297727,AT 3228297728,3228297983,US 3228297984,3228298495,DE -3228298496,3228303103,US -3228303360,3228309247,US -3228309248,3228316159,DE -3228316416,3228327167,DE +3228298496,3228309247,US +3228309248,3228327167,DE 3228327168,3228328703,US 3228328704,3228328959,AU 3228328960,3228329471,NO @@ -32179,22 +61265,17 @@ 3228347392,3228348159,SK 3228348160,3228353279,US 3228353280,3228358399,SE -3228358400,3228361471,US -3228361728,3228362239,US +3228358400,3228362239,US 3228362240,3228362495,TH 3228362496,3228362751,US 3228363008,3228363263,US 3228363264,3228363519,CH 3228363520,3228364287,US 3228364288,3228364543,AT -3228364800,3228368383,US -3228368896,3228380415,DE -3228380672,3228388095,DE -3228388352,3228392447,DE -3228392960,3228394239,DE -3228394496,3228395263,DE -3228395776,3228399615,DE -3228399872,3228413183,DE +3228364800,3228368895,US +3228368896,3228404735,DE +3228404736,3228407039,FR +3228407040,3228413183,DE 3228413184,3228413439,SG 3228413440,3228417791,DE 3228417792,3228418559,AT @@ -32203,16 +61284,23 @@ 3228421120,3228421375,BE 3228421376,3228423679,DE 3228423680,3228424191,CH -3228424192,3228430847,DE -3228430848,3228431103,ZA -3228431104,3228434431,DE -3228434688,3228471295,US -3228472320,3228472831,US -3228473344,3228473599,US -3228473856,3228474111,US -3228477440,3228477695,US -3228491520,3228499711,US -3228500224,3228508159,US +3228424192,3228434431,DE +3228434432,3228443903,US +3228443904,3228444159,CA +3228444160,3228456191,US +3228456192,3228456447,CA +3228456448,3228457471,US +3228457472,3228457727,CA +3228457728,3228458751,US +3228458752,3228459007,CA +3228459008,3228461567,US +3228461568,3228461823,CA +3228461824,3228464127,US +3228464128,3228464383,CA +3228464384,3228483583,US +3228491520,3228496127,US +3228496128,3228496383,GB +3228496384,3228508159,US 3228508160,3228508415,AU 3228508416,3228508671,NO 3228508672,3228509439,US @@ -32231,20 +61319,16 @@ 3228526336,3228526591,CH 3228526592,3228526847,AT 3228526848,3228527103,AU -3228527104,3228528383,US -3228528640,3228531711,US +3228527104,3228531711,US 3228531712,3228532223,NO 3228532224,3228532479,US 3228532480,3228532735,DE -3228540928,3228554751,US -3228555008,3228557311,US -3228557568,3228558591,US +3228540928,3228558591,US 3228558592,3228559103,BR -3228559104,3228564223,US +3228559104,3228564479,US 3228564480,3228564735,AT 3228564736,3228565247,US -3228565760,3228571391,US -3228571648,3228572927,US +3228565504,3228572927,US 3228573184,3228573951,PT 3228573952,3228574463,US 3228574720,3228577023,US @@ -32259,10 +61343,7 @@ 3228590592,3228590847,GB 3228590848,3228591103,DK 3228591104,3228591359,GB -3228591360,3228603391,US -3228603648,3228603903,US -3228604160,3228611583,US -3228611840,3228617727,US +3228591360,3228617727,US 3228617728,3228617983,FI 3228617984,3228618239,US 3228618240,3228618495,SE @@ -32277,65 +61358,44 @@ 3228628992,3228630527,US 3228630528,3228630783,CH 3228631040,3228696575,NL -3228696576,3228827647,IL +3228696576,3228745183,IL +3228745184,3228745187,A2 +3228745188,3228827647,IL 3228827648,3228828159,PS 3228828160,3228829183,IL 3228829184,3228829695,PS 3228829696,3228830207,IL 3228830208,3228833791,PS -3228833792,3228844287,IL -3228844288,3228845567,GB -3228845568,3228845823,IL -3228845824,3228846079,GB -3228846080,3228846335,IL -3228846336,3228846591,GB -3228846592,3228847359,IL -3228847360,3228847615,GB -3228847616,3228847871,IL -3228847872,3228848895,GB -3228848896,3228849407,IL -3228849408,3228849663,GB +3228833792,3228846335,IL +3228846336,3228846591,A2 +3228846592,3228849407,IL +3228849408,3228849663,A2 3228849664,3228850175,IL -3228850176,3228850687,GB -3228850688,3228851711,IL -3228851712,3228851967,GB -3228851968,3228852735,IL -3228852736,3228853247,GB -3228853248,3228853567,IL -3228853568,3228853599,GB -3228853600,3228854271,IL -3228854272,3228855295,GB -3228855296,3228855807,IL -3228855808,3228856063,GB -3228856064,3228856319,IL -3228856320,3228857855,GB -3228857856,3228858111,IL -3228858112,3228858367,GB -3228858368,3228858623,IL -3228858624,3228859647,GB -3228859648,3228859903,IL -3228859904,3228860927,GB -3228860928,3228861695,IL -3228861696,3228862975,GB -3228862976,3228863231,IL -3228863232,3228863487,GB -3228863488,3228863743,IL -3228863744,3228863999,GB -3228864000,3228864255,IL -3228864256,3228864511,GB -3228864512,3228866815,IL -3228866816,3228868095,GB -3228868096,3229024255,IL -3229024512,3229024767,US -3229058816,3229059071,US -3229090048,3229101823,US +3228850176,3228850431,A2 +3228850432,3228858111,IL +3228858112,3228858367,A2 +3228858368,3228864255,IL +3228864256,3228864511,A2 +3228864512,3228887011,IL +3228887012,3228887015,A2 +3228887016,3229024255,IL +3229024256,3229092095,US +3229092096,3229093887,AU +3229093888,3229101823,US 3229101824,3229102591,FI -3229102592,3229155327,US -3229155328,3229219583,SE +3229102592,3229104895,US +3229104896,3229105151,ES +3229105152,3229120511,US +3229120512,3229120767,SE +3229120768,3229151487,US +3229151488,3229151743,SE +3229151744,3229155327,US +3229155328,3229177407,SE +3229177408,3229177423,JP +3229177424,3229219583,SE 3229219584,3229219839,EE 3229219840,3229220863,SE -3229221120,3229221375,FR -3229221376,3229245439,GB +3229220864,3229245439,GB 3229245440,3229246719,US 3229246720,3229250815,GB 3229250816,3229251071,US @@ -32349,23 +61409,18 @@ 3229265920,3229266175,AU 3229266176,3229266943,US 3229266944,3229267199,NZ -3229267200,3229272319,US -3229273600,3229273855,AT -3229273856,3229274623,US +3229267200,3229274623,US 3229274624,3229274879,AU -3229274880,3229275135,US -3229275392,3229275647,US +3229274880,3229275647,US 3229275648,3229275903,GB 3229276160,3229281023,IE 3229281024,3229281791,US 3229281792,3229283071,PT 3229283072,3229285887,US 3229285888,3229286143,NO -3229286400,3229351935,US -3229352192,3229354495,US +3229286400,3229354495,US 3229354496,3229355775,AU -3229355776,3229356543,US -3229356800,3229357823,US +3229355776,3229358079,US 3229358080,3229358335,NZ 3229358336,3229359359,DE 3229359872,3229360127,US @@ -32382,53 +61437,41 @@ 3229381632,3229381887,PL 3229381888,3229382143,AU 3229382144,3229382399,US -3229382656,3229384191,US -3229384448,3229384959,US -3229385216,3229385727,US -3229385984,3229390847,US +3229382656,3229390847,US 3229390848,3229391103,AU 3229391104,3229391359,US 3229391360,3229391615,CN 3229391616,3229391871,AT -3229392128,3229394175,US -3229395456,3229408255,RU -3229408256,3229409279,US -3229409536,3229412095,US -3229412096,3229412351,DE -3229412608,3229414911,DE -3229414912,3229415167,US -3229415168,3229417215,DE -3229417472,3229483007,DE -3229483264,3229499647,FI +3229391872,3229394943,US +3229394944,3229408255,RU +3229408256,3229412095,US +3229412096,3229483007,DE +3229483008,3229499647,FI 3229499648,3229500671,US 3229548544,3229679615,US 3229679872,3229680383,DE 3229680384,3229680895,RO 3229680896,3229693183,DE +3229693184,3229693439,NL 3229693440,3229695487,DE -3229695488,3229697535,US -3229697792,3229699071,US -3229699328,3229699583,US -3229699840,3229700095,US +3229695488,3229700095,US 3229700096,3229700351,AT 3229700352,3229701887,US 3229701888,3229702143,TR 3229702144,3229704703,US 3229704704,3229704959,DE -3229704960,3229708031,US +3229705216,3229708287,US 3229745152,3229749759,FI 3229749760,3229750015,BE 3229750016,3229810687,FI -3229810944,3229811711,US -3229812224,3229814015,US +3229810688,3229814015,US 3229814016,3229814271,AU 3229814272,3229815807,US 3229815808,3229816063,DE 3229816320,3229817087,US 3229817088,3229817599,SE 3229817600,3229818623,AU -3229818624,3229818879,US -3229822208,3229830911,US +3229818624,3229830911,US 3229830912,3229831167,GB 3229831168,3229833215,US 3229833472,3229833727,GB @@ -32443,16 +61486,14 @@ 3229838336,3229838591,GB 3229838592,3229838847,US 3229839104,3229844479,US -3229844480,3229844735,LU +3229844480,3229844735,BE 3229844736,3229844991,US 3229845248,3229845503,US -3229845760,3229847295,CA -3229847296,3229870335,US -3229870848,3229874943,US +3229845504,3229847295,CA +3229847296,3229874943,US 3229874944,3229875455,AU 3229875456,3229875967,US -3229876480,3229877503,US -3229877760,3229878271,US +3229876224,3229878271,US 3229878528,3229878783,GB 3229878784,3229879039,IT 3229879040,3229879295,NO @@ -32460,19 +61501,18 @@ 3229880064,3229880319,KR 3229880320,3229881087,US 3229881088,3229881343,CA -3229881344,3229883135,US +3229881344,3229883391,US 3229883648,3229883903,US 3229884160,3229884415,JP 3229884928,3229885183,IT 3229885184,3229885439,BR 3229885440,3229886719,US 3229886720,3229886975,AU -3229886976,3229887487,US -3229887744,3229889791,US +3229886976,3229889791,US 3229889792,3229890047,PT 3229890048,3229890303,US 3229890304,3229890559,PT -3229890560,3229891327,US +3229890560,3229891583,US 3229891584,3229891839,CA 3229892608,3229900031,US 3229900032,3229900287,AU @@ -32480,9 +61520,7 @@ 3229901568,3229901823,GB 3229901824,3229902335,US 3229902336,3229902591,AU -3229902592,3229928703,US -3229928960,3229930495,US -3229930752,3229937407,US +3229902592,3229937407,US 3229937408,3229937663,GB 3229937664,3229937919,US 3229937920,3229938175,CA @@ -32494,30 +61532,23 @@ 3229940736,3229940991,CH 3229940992,3229941247,AU 3229941248,3229941503,US -3229942272,3229942783,US -3229943040,3229943295,US -3229943552,3229944319,US +3229941760,3229944319,US 3229944320,3229944575,TH 3229944576,3229945343,US 3229945344,3229945599,AU 3229945600,3229945855,PT -3229946112,3229947135,US +3229945856,3229947135,US 3229947136,3229947391,AU -3229947392,3229948415,US -3229948672,3229948927,US +3229947392,3229948927,US 3229948928,3229949183,IT -3229949184,3229949439,GB -3229949440,3229949695,US +3229949184,3229949695,US 3229949696,3229949951,NZ 3229949952,3229950207,NO 3229950208,3229950975,US 3229950976,3229951231,IL 3229951232,3229952255,US 3229952256,3229952511,AU -3229952512,3229953279,US -3229953536,3229953791,US -3229954048,3229954303,US -3229954560,3229955327,US +3229952512,3229955327,US 3229955328,3229955583,NL 3229955584,3229956095,PT 3229956096,3229956607,US @@ -32527,11 +61558,8 @@ 3229958400,3229958655,US 3229958656,3229958911,NZ 3229958912,3229959167,SG -3229959168,3229960191,US -3229960448,3229960959,US -3229963008,3229963519,US -3229963776,3229964799,US -3229965056,3229967615,US +3229959168,3229961215,US +3229962240,3229967615,US 3229967872,3229968127,US 3229968128,3229968383,BE 3229968384,3229968895,US @@ -32546,11 +61574,10 @@ 3229978624,3230004223,US 3230004224,3230004479,GB 3230004480,3230004991,US -3230006016,3230007039,US -3230007296,3230043903,FR -3230043904,3230044159,CM -3230044160,3230072831,FR -3230073088,3230074623,US +3230005760,3230006015,ZA +3230006016,3230007295,US +3230007296,3230072831,FR +3230072832,3230074623,US 3230074624,3230074879,DE 3230074880,3230082559,IT 3230082560,3230082815,US @@ -32572,18 +61599,12 @@ 3230093824,3230094079,NL 3230094080,3230094335,CA 3230094336,3230095615,US -3230095616,3230095871,JP -3230096384,3230096639,JP -3230096896,3230097151,JP -3230097408,3230097663,JP -3230098688,3230100735,JP -3230101504,3230104319,US -3230104576,3230105855,US +3230095616,3230101503,JP +3230101504,3230105855,US 3230105856,3230106111,PT 3230106112,3230106879,US 3230106880,3230107135,AT -3230107136,3230107647,US -3230107904,3230109439,US +3230107136,3230109439,US 3230109440,3230109695,NO 3230109696,3230109951,US 3230109952,3230115071,CH @@ -32596,8 +61617,7 @@ 3230120192,3230120447,BE 3230120448,3230120703,US 3230120704,3230120959,PT -3230120960,3230122495,US -3230123264,3230123775,US +3230120960,3230124031,US 3230125312,3230125567,US 3230125824,3230126335,AU 3230126336,3230126591,US @@ -32610,12 +61630,10 @@ 3230130432,3230130687,IE 3230130688,3230131967,US 3230131968,3230132991,GB -3230132992,3230136319,US -3230136576,3230137087,US -3230137344,3230137599,US +3230132992,3230137599,US 3230137600,3230137855,NO 3230137856,3230138111,PL -3230138624,3230140159,US +3230138368,3230140159,US 3230140160,3230140415,MT 3230140416,3230140671,US 3230140672,3230140927,FI @@ -32642,25 +61660,88 @@ 3230151424,3230151679,NL 3230151680,3230151935,PT 3230152192,3230152447,FR +3230152448,3230152959,BF +3230152960,3230153215,NE 3230153216,3230153471,FR 3230153472,3230153727,PF 3230153728,3230153983,US 3230153984,3230154239,RU 3230154240,3230156543,US -3230156544,3230164735,FI -3230165504,3230167295,US +3230156544,3230164991,FI +3230164992,3230167295,US 3230167552,3230168063,CA -3230168832,3230172927,US -3230173184,3230174463,US +3230168832,3230174463,US 3230174464,3230175231,IN 3230175232,3230177791,US 3230177792,3230178303,GB 3230178304,3230178559,CH -3230203904,3230269439,US -3230269696,3230271743,GB +3230203904,3230210047,US +3230210048,3230210303,CA +3230210304,3230211839,US +3230211840,3230212095,CN +3230212096,3230214911,US +3230214912,3230215167,PR +3230215168,3230219775,US +3230219776,3230220031,NL +3230220032,3230220287,US +3230220288,3230222847,NL +3230222848,3230223103,ES +3230223104,3230223359,GB +3230223360,3230223615,CH +3230223616,3230225919,LU +3230225920,3230226175,AU +3230226176,3230226431,ES +3230226432,3230226687,US +3230226688,3230226943,NO +3230226944,3230228223,GB +3230228224,3230228479,ES +3230228480,3230228735,AU +3230228736,3230228991,US +3230228992,3230229247,GB +3230229248,3230229503,US +3230229504,3230229759,ES +3230229760,3230230015,DE +3230230016,3230236159,US +3230236160,3230236415,AU +3230236416,3230236671,GB +3230236672,3230236927,CA +3230236928,3230240767,US +3230240768,3230241023,DK +3230241024,3230241791,GB +3230241792,3230242303,CH +3230242304,3230243839,US +3230243840,3230244095,HK +3230244096,3230244351,US +3230244352,3230244607,CA +3230244608,3230245119,FR +3230245120,3230246143,SE +3230246144,3230246911,US +3230246912,3230247167,CH +3230247168,3230247679,US +3230247680,3230247935,SE +3230247936,3230248191,AU +3230248192,3230251007,US +3230251008,3230251263,CH +3230251264,3230251519,MX +3230251520,3230252031,CH +3230252032,3230254847,US +3230254848,3230255359,SE +3230255360,3230255615,ES +3230255616,3230256127,US +3230256128,3230256383,GB +3230256384,3230257919,US +3230257920,3230259199,CH +3230259200,3230263807,US +3230263808,3230264063,SE +3230264064,3230264319,NL +3230264320,3230266111,CH +3230266112,3230267135,US +3230267136,3230267903,CA +3230267904,3230269439,US +3230269440,3230273535,GB 3230275584,3230291455,US 3230291456,3230291711,PT -3230291712,3230294783,US +3230291712,3230295039,US 3230295040,3230295295,AU 3230295296,3230296319,US 3230296320,3230297343,NO @@ -32668,14 +61749,10 @@ 3230299648,3230301695,SG 3230301696,3230302207,US 3230302208,3230302975,CA -3230302976,3230303487,US -3230303744,3230307327,US -3230307584,3230309119,US +3230302976,3230309119,US 3230309120,3230309375,NO 3230309376,3230310143,GB -3230310144,3230310655,US -3230310912,3230311423,US -3230311680,3230316287,US +3230310144,3230316287,US 3230316288,3230316543,IT 3230316544,3230316799,US 3230316800,3230317311,CA @@ -32686,9 +61763,7 @@ 3230318848,3230321663,US 3230321664,3230321919,PT 3230321920,3230322175,US -3230322432,3230322943,US -3230323968,3230325247,US -3230325760,3230327551,US +3230322432,3230327807,US 3230327808,3230328063,AT 3230328064,3230328319,GB 3230328320,3230329087,CH @@ -32696,28 +61771,21 @@ 3230332928,3230333183,GB 3230333184,3230333695,US 3230333696,3230333951,NZ -3230333952,3230334719,US -3230335232,3230336255,CA -3230336512,3230339583,CA -3230339840,3230340095,CA -3230340352,3230350847,CA -3230351104,3230354943,CA +3230333952,3230334975,US +3230334976,3230354943,CA 3230354944,3230355199,FR -3230355200,3230368511,CA -3230369024,3230370303,US +3230355200,3230368767,CA +3230368768,3230370303,US 3230370304,3230370559,CA -3230370816,3230372607,CA -3230372864,3230387455,CA -3230387712,3230400255,CA -3230400768,3230591231,FR +3230370816,3230400511,CA +3230400512,3230591231,FR 3230591232,3230591487,FI 3230591488,3230625791,FR 3230625792,3230626047,FI 3230626048,3230654879,FR 3230654880,3230654895,HU -3230654896,3230787327,FR -3230793984,3230822655,US -3230822912,3230823679,US +3230654896,3230793727,FR +3230793728,3230823679,US 3230823680,3230823935,DK 3230824192,3230824447,FR 3230824448,3230825215,US @@ -32744,13 +61812,12 @@ 3230840576,3230840831,US 3230840832,3230841087,JP 3230841088,3230841343,DE -3230841344,3230841599,US 3230841600,3230841855,ES 3230841856,3230842111,US 3230842112,3230842367,AU 3230842624,3230843135,US 3230843136,3230843391,NO -3230843392,3230844671,US +3230843392,3230844927,US 3230844928,3230845183,AU 3230845184,3230845951,US 3230845952,3230846207,CZ @@ -32770,22 +61837,20 @@ 3230855936,3230857983,US 3230857984,3230858751,AU 3230858752,3230859007,US -3230860032,3230865151,US +3230859264,3230865151,US 3230865152,3230865407,GB -3230865664,3230867967,US +3230865408,3230867967,US 3230867968,3230868223,IS 3230868224,3230868479,US 3230868480,3230868735,GB 3230868992,3230870015,US 3230870016,3230870271,PL -3230870272,3230877183,US -3230877696,3230878719,US +3230870272,3230878719,US 3230878720,3230879487,PT 3230879488,3230879743,FR 3230879744,3230888447,US 3230888448,3230888703,AU -3230888704,3230888959,US -3230889216,3230895359,US +3230888704,3230895359,US 3230895360,3230895615,PL 3230895616,3230897151,US 3230897408,3230897663,US @@ -32808,11 +61873,11 @@ 3230917888,3230918399,US 3230918656,3230919423,US 3230919424,3230919679,AU -3230919680,3230920959,US -3230921216,3230922239,US +3230919680,3230922239,US 3230922240,3230922495,AU 3230922496,3230922751,IT 3230922752,3230923519,US +3230923520,3230923775,EU 3230923776,3230924031,US 3230924032,3230924287,AU 3230924288,3230924543,US @@ -32820,12 +61885,12 @@ 3230933248,3230948607,SE 3230948608,3230951167,US 3230951168,3230951423,PT -3230951680,3230951935,US -3230952192,3230953215,US -3230954496,3230967295,AU +3230951424,3230953471,US +3230953472,3230967295,AU 3230967296,3230967551,RU 3230967552,3230967807,ES -3230967808,3230969599,US +3230967808,3230969087,US +3230969344,3230969599,US 3230969600,3230969855,MX 3230969856,3230970111,US 3230970112,3230972671,GB @@ -32844,13 +61909,12 @@ 3230981376,3230981631,NZ 3230981632,3230981887,US 3230981888,3230983935,AU -3230983936,3230989823,US +3230983936,3230990335,US 3230990592,3230991103,US 3230991104,3230991359,PL 3230991360,3230991615,US 3230991616,3230991871,FI -3230991872,3230992383,US -3230992640,3230994175,US +3230991872,3230994175,US 3230994176,3230994431,GB 3230994432,3230994687,US 3230994944,3230995199,US @@ -32874,16 +61938,12 @@ 3231004928,3231005183,GB 3231005440,3231005695,FR 3231005696,3231005951,GB -3231005952,3231007487,US +3231005952,3231007743,US 3231009280,3231009791,US 3231010048,3231010303,FR 3231010304,3231010815,NO 3231010816,3231011071,CA -3231011072,3231011839,US -3231012096,3231012863,US -3231013120,3231013375,US -3231013376,3231013631,DE -3231013888,3231014655,US +3231011072,3231014911,US 3231015168,3231015423,US 3231015424,3231015679,CA 3231015680,3231015935,US @@ -32903,10 +61963,11 @@ 3231022592,3231022847,DE 3231022848,3231028479,US 3231028480,3231028735,AU -3231028736,3231043839,US +3231028736,3231042047,US +3231042048,3231042303,GU +3231042304,3231043839,US 3231043840,3231044095,JP -3231044352,3231046399,US -3231046656,3231048447,US +3231044352,3231048447,US 3231048448,3231048703,NL 3231048704,3231049727,US 3231049728,3231049983,AT @@ -32914,14 +61975,9 @@ 3231050496,3231051263,US 3231051264,3231051519,GB 3231051520,3231051775,HK -3231051776,3231053055,US -3231054848,3231055103,US -3231056128,3231066367,US -3231067392,3231067647,US -3231068928,3231070463,US -3231070720,3231074559,SE -3231075072,3231075583,SE -3231075840,3231077119,SE +3231051776,3231070463,US +3231070720,3231077119,SE +3231077120,3231077375,EU 3231077376,3231077631,SE 3231078144,3231078655,US 3231078656,3231078911,GB @@ -32936,8 +61992,7 @@ 3231082752,3231083007,US 3231083008,3231083263,GB 3231083264,3231083519,AU -3231083520,3231085567,US -3231085824,3231087359,US +3231083520,3231087615,US 3231087616,3231087871,NO 3231087872,3231088127,US 3231088128,3231088383,GT @@ -32949,9 +62004,8 @@ 3231092736,3231092991,NZ 3231092992,3231093247,US 3231093248,3231093503,IT -3231093504,3231094527,US -3231097088,3231100415,US -3231100672,3231101183,US +3231093504,3231094783,US +3231096832,3231101183,US 3231101184,3231103231,GB 3231103488,3231103999,US 3231104000,3231104255,NO @@ -32990,15 +62044,11 @@ 3231120384,3231120639,NO 3231120640,3231120895,US 3231120896,3231121151,NO -3231121664,3231135231,US -3231135232,3231135487,CH -3231135488,3231149311,US +3231121408,3231149311,US 3231149312,3231149567,CA -3231149568,3231150079,US -3231150080,3231150335,NL -3231150336,3231154431,US +3231149568,3231154431,US 3231154432,3231154687,IN -3231187200,3231188479,US +3231186944,3231188479,US 3231188480,3231188735,NO 3231188736,3231190527,US 3231190528,3231190783,GB @@ -33006,7 +62056,7 @@ 3231191296,3231191551,GB 3231191552,3231192575,US 3231193600,3231194111,DE -3231194368,3231197695,US +3231194112,3231197695,US 3231197696,3231197951,FR 3231197952,3231198207,US 3231198208,3231198463,GB @@ -33019,17 +62069,14 @@ 3231201024,3231202559,US 3231202560,3231203071,GB 3231203072,3231203327,AT -3231203328,3231203839,US -3231204096,3231204351,US +3231203328,3231204351,US 3231204352,3231204607,FI 3231204608,3231204863,JP -3231204864,3231207167,US -3231207424,3231207935,US +3231204864,3231207935,US 3231207936,3231208191,DE 3231208192,3231208959,US 3231208960,3231209471,AU -3231209472,3231210239,US -3231210496,3231211775,US +3231209472,3231211775,US 3231211776,3231212031,CA 3231212032,3231212287,CH 3231212288,3231214335,US @@ -33043,9 +62090,7 @@ 3231218176,3231218431,GB 3231218432,3231218687,US 3231218688,3231218943,BE -3231218944,3231219967,US -3231221248,3231221503,US -3231221760,3231223039,US +3231218944,3231223039,US 3231223040,3231223295,IT 3231223296,3231223807,US 3231223808,3231224063,AU @@ -33062,19 +62107,16 @@ 3231229696,3231229951,FR 3231229952,3231231487,US 3231231488,3231231743,PT -3231231744,3231233023,US -3231233280,3231234047,US +3231231744,3231234047,US 3231234048,3231235071,GB 3231235072,3231236095,US 3231236608,3231236863,US 3231236864,3231237119,CA 3231237120,3231237375,US 3231237376,3231237631,AU -3231237632,3231238911,US -3231239168,3231241215,US +3231237632,3231241215,US 3231241216,3231241471,JP -3231241984,3231244287,US -3231244544,3231248639,US +3231241984,3231248639,US 3231248640,3231248895,GB 3231248896,3231249407,US 3231249408,3231249663,GB @@ -33085,17 +62127,14 @@ 3231251968,3231252223,AT 3231252736,3231252991,US 3231252992,3231253503,GB -3231253504,3231254015,US -3231254272,3231254783,US +3231253504,3231254783,US 3231254784,3231255039,AU 3231255040,3231255551,US 3231255552,3231255807,GB 3231255808,3231256063,PT 3231256064,3231257087,US 3231257088,3231257599,HU -3231257600,3231264255,US -3231264512,3231265791,US -3231266048,3231275007,US +3231257600,3231275007,US 3231275008,3231275263,BR 3231275264,3231275519,CH 3231275520,3231276287,US @@ -33109,8 +62148,7 @@ 3231283200,3231283455,BR 3231283456,3231284991,US 3231284992,3231285247,PL -3231285248,3231290111,US -3231290368,3231291647,US +3231285248,3231291647,US 3231291648,3231291903,GB 3231291904,3231292159,US 3231292160,3231292415,BR @@ -33141,30 +62179,25 @@ 3231309056,3231311103,PH 3231311104,3231316735,US 3231316736,3231316991,NZ -3231316992,3231317759,US -3231318272,3231318783,US -3231319040,3231319807,US -3231320064,3231321343,US -3231322112,3231324671,SG -3231326208,3231342591,US -3231350528,3231351551,US -3231383808,3231385343,NO -3231385856,3231401215,US -3231416320,3231423999,US +3231316992,3231322111,US +3231322112,3231326207,SG +3231326208,3231351807,US +3231383552,3231385599,NO +3231385600,3231401983,US +3231416320,3231424511,US 3231449088,3231482879,US 3231482880,3231483135,BE 3231483136,3231484927,US -3231484928,3231485951,JP -3231486208,3231489279,JP -3231489536,3231490047,JP +3231484928,3231490047,JP 3231490048,3231490559,US 3231490560,3231490815,GB 3231490816,3231491071,US 3231491328,3231491583,NZ 3231491584,3231491839,US 3231491840,3231492095,GB -3231492096,3231497727,US -3231497984,3231499263,US +3231492096,3231493631,US +3231493632,3231493887,CH +3231493888,3231499263,US 3231499520,3231500031,US 3231500032,3231500287,BM 3231500288,3231502079,US @@ -33176,31 +62209,41 @@ 3231503872,3231504383,US 3231504640,3231504895,GB 3231504896,3231505407,US +3231505408,3231505663,JP 3231505664,3231506687,US 3231506688,3231506943,NZ 3231506944,3231507199,US 3231507200,3231507455,BE -3231507456,3231507967,US -3231508224,3231508479,US +3231507456,3231508479,US 3231508992,3231509247,US 3231510272,3231510527,GB -3231510784,3231511551,US +3231510528,3231511551,US 3231512576,3231512831,LU 3231512832,3231513087,AU 3231513088,3231513343,US -3231513600,3231514367,US -3231514880,3231515647,NO +3231513600,3231514623,US +3231514624,3231515647,NO 3231515648,3231516159,US 3231516672,3231519231,SE -3231522560,3231524607,US -3231531008,3231533567,US +3231522560,3231524863,US +3231531008,3231535103,US 3231547392,3231547647,US 3231547648,3231547903,NO -3231547904,3231556095,US +3231547904,3231549951,US +3231549952,3231550207,JP +3231550208,3231550719,DE +3231550720,3231550975,GB +3231550976,3231551231,US +3231551232,3231551999,CA +3231552000,3231553023,US +3231553024,3231553791,JP +3231553792,3231554047,CH +3231554048,3231555327,DE +3231555328,3231556095,CA 3231556096,3231556351,HK -3231556352,3231556607,US -3231556608,3231556863,CA -3231556864,3231557887,AT +3231556352,3231556863,US +3231556864,3231557119,AT +3231557120,3231557887,US 3231557888,3231558399,GB 3231558400,3231558655,DE 3231558656,3231558911,GB @@ -33214,18 +62257,11 @@ 3231562496,3231562751,GB 3231562752,3231563007,US 3231563008,3231563263,CH +3231563264,3231563519,ZA 3231563520,3231563775,HK -3231580416,3231580927,US -3231581184,3231583231,US -3231584256,3231586559,US -3231588352,3231596031,US -3231596544,3231634943,US -3231643648,3231644927,US -3231645184,3231645439,US -3231645952,3231647743,US -3231648000,3231649791,US -3231649792,3231653631,SG -3231653888,3231655167,US +3231580160,3231649791,US +3231649792,3231653887,SG +3231653888,3231655935,US 3231663616,3231663871,FI 3231663872,3231664127,CA 3231664128,3231664383,US @@ -33251,11 +62287,10 @@ 3231674368,3231675391,US 3231675392,3231675903,BR 3231675904,3231676159,IE -3231676416,3231676671,US 3231676672,3231676927,FR 3231676928,3231677183,FI -3231678464,3231682047,US -3231711488,3231713023,US +3231678464,3231682559,US +3231711232,3231713023,US 3231713024,3231713279,CA 3231713280,3231713791,US 3231713792,3231714047,IE @@ -33281,16 +62316,16 @@ 3231723008,3231723519,US 3231723776,3231724031,US 3231724032,3231724287,BR -3231724288,3231725055,US -3231725312,3231727871,US +3231724288,3231727871,US 3231727872,3231728127,DE 3231728384,3231728639,AT 3231728640,3231729407,US 3231729408,3231729663,AU 3231729664,3231735551,US 3231735552,3231736063,CH -3231736064,3231737087,US -3231737600,3231739135,US +3231736064,3231738367,US +3231738368,3231738623,NL +3231738624,3231739135,US 3231739136,3231739391,GB 3231739392,3231739647,PL 3231739648,3231739903,BR @@ -33325,8 +62360,8 @@ 3231760896,3231761407,GB 3231761408,3231763711,US 3231763712,3231763967,AU -3231763968,3231766271,US -3231766528,3231768575,US +3231763968,3231768575,US +3231768576,3231768831,EU 3231768832,3231769087,NO 3231769088,3231769343,NZ 3231769344,3231769855,US @@ -33335,16 +62370,16 @@ 3231770368,3231770879,AT 3231770880,3231771135,RU 3231771136,3231773951,US -3231773952,3231775231,PT -3231775488,3231775743,PT +3231773952,3231775743,PT 3231775744,3231775999,IL 3231776000,3231776511,US -3231777024,3231778047,US -3231778816,3231786495,US +3231776768,3231793151,US 3231793152,3231793663,BE 3231809536,3231810047,NZ +3231842304,3231846399,EU 3231846400,3231846655,RO -3231908096,3231913215,US +3231846656,3231907839,EU +3231907840,3231916031,US 3231916032,3231948799,FI 3231973376,3232038911,AT 3232038912,3232092671,SE @@ -33356,64 +62391,59 @@ 3232095232,3232096255,GB 3232096256,3232104447,SE 3232104448,3232107519,DE +3232107520,3232108543,EU 3232108544,3232129023,DE +3232129024,3232131071,EU 3232131072,3232133119,DE +3232133120,3232133631,EU 3232133632,3232134143,DE -3232137216,3232141311,DE +3232134144,3232141823,EU 3232141824,3232156159,DE +3232156160,3232156671,EU 3232156672,3232159743,DE +3232159744,3232160767,EU 3232160768,3232163839,DE +3232163840,3232165887,EU 3232165888,3232169727,DE +3232169728,3232169983,EU 3232169984,3232235519,IT -3232301056,3232302335,US -3232303104,3232303615,US -3232305152,3232305919,US -3232309248,3232311807,SG +3232301056,3232309247,US +3232309248,3232313343,SG 3232317440,3232317951,US -3232366592,3232391167,US -3232391168,3232399359,CH -3232399360,3232399615,US -3232433920,3232435455,US -3232436224,3232436735,US -3232448512,3232461311,US -3232464896,3232483327,GB -3232497664,3232555775,US -3232555776,3232557055,JP -3232557568,3232559103,JP -3232559360,3232560127,JP -3232560384,3232560895,JP +3232366592,3232381439,US +3232381440,3232382207,AU +3232382208,3232399615,US +3232432128,3232433663,EU +3232433920,3232436735,US +3232448512,3232464895,US +3232464896,3232497663,GB +3232497664,3232555007,US +3232555264,3232555775,US +3232555776,3232560895,JP 3232560896,3232561663,US 3232561664,3232561919,CA 3232561920,3232562431,US 3232562432,3232562687,LU 3232562688,3232562943,CA -3232563456,3232564479,GB -3232565248,3232566527,US -3232567296,3232569599,NZ +3232563200,3232565247,GB +3232565248,3232567295,US +3232567296,3232571391,NZ 3232571392,3232579583,US 3232595968,3232598015,GB -3232629248,3232629759,US -3232630784,3232632575,US -3232632832,3232634879,US -3232636928,3232645119,US -3232645120,3232646399,AT +3232628736,3232645119,US +3232645120,3232647167,AT 3232661504,3232694271,JP -3232694528,3232695807,US -3232696320,3232697599,US -3232698368,3232699903,US +3232694272,3232702463,US 3232702464,3232706559,FI 3232706560,3232706815,US -3232710656,3232716799,US +3232710656,3232718847,US 3232727040,3232759807,US 3232759808,3232825343,SE 3233285120,3233285375,US -3233481728,3233484799,US -3233484800,3233487359,ES -3233488896,3233496575,US -3233497088,3233505279,US -3233513472,3233546239,US -3233546496,3233546751,US -3233547008,3233548287,US +3233480704,3233484799,US +3233484800,3233488895,ES +3233488896,3233505279,US +3233513472,3233548287,US 3233548800,3233549055,PT 3233549056,3233549311,BR 3233549312,3233557247,US @@ -33427,10 +62457,7 @@ 3233564160,3233564415,US 3233564416,3233564671,NZ 3233564672,3233564927,US -3233564928,3233566975,JP -3233568000,3233568767,JP -3233569024,3233569535,JP -3233569792,3233570047,JP +3233564928,3233570047,JP 3233570048,3233570559,US 3233570816,3233571071,GB 3233571072,3233572095,US @@ -33463,6 +62490,7 @@ 3233585152,3233586431,US 3233586432,3233586943,GB 3233586944,3233588223,US +3233588224,3233589247,GA 3233589248,3233589759,CA 3233589760,3233590015,CN 3233590016,3233590271,TW @@ -33470,8 +62498,7 @@ 3233590528,3233590783,PR 3233590784,3233591039,PH 3233591040,3233591295,ID -3233591552,3233593087,US -3233593344,3233593599,US +3233591296,3233593599,US 3233593600,3233593855,NZ 3233593856,3233594111,AU 3233594112,3233594367,RU @@ -33479,19 +62506,16 @@ 3233594624,3233594879,RU 3233594880,3233595903,US 3233595904,3233596927,EC -3233596928,3233603327,US -3233603584,3233605887,US +3233596928,3233605887,US 3233605888,3233607167,PL 3233607168,3233607935,US 3233607936,3233608191,NZ 3233608192,3233609727,HU 3233609728,3233609983,BE 3233609984,3233610495,US -3233610752,3233611519,US +3233610752,3233611775,US 3233612032,3233612287,GB -3233612544,3233612799,US -3233613056,3233613311,US -3233613568,3233613823,US +3233612544,3233613823,US 3233613824,3233614847,GB 3233615104,3233615359,US 3233615360,3233615615,DE @@ -33509,8 +62533,7 @@ 3233625344,3233625599,US 3233625600,3233625855,AU 3233625856,3233626111,GB -3233626112,3233626879,US -3233627136,3233628671,US +3233626112,3233628671,US 3233628672,3233628927,FR 3233628928,3233629439,CA 3233629440,3233629695,GB @@ -33518,16 +62541,17 @@ 3233629952,3233630463,US 3233630464,3233630719,NL 3233630720,3233630975,US +3233630976,3233631231,ZA 3233631232,3233631487,DE 3233631488,3233631743,US -3233632000,3233633535,US -3233633792,3233635839,US +3233632000,3233635839,US 3233635840,3233636095,AU 3233636096,3233642239,US 3233642240,3233642495,GB 3233642496,3233646591,US 3233646592,3233646847,AU 3233646848,3233647359,US +3233647360,3233647871,GA 3233647872,3233649663,US 3233649664,3233649919,AU 3233649920,3233650431,US @@ -33542,7 +62566,7 @@ 3233654272,3233655551,GB 3233655552,3233662975,US 3233663488,3233663999,GB -3233664256,3233665023,US +3233664000,3233665023,US 3233665024,3233666047,AU 3233666048,3233668863,US 3233668864,3233669119,PH @@ -33551,13 +62575,9 @@ 3233671680,3233675263,US 3233675520,3233676031,US 3233676032,3233676287,DE -3233676288,3233677055,US -3233677568,3233679103,US -3233679360,3233681151,US -3233681408,3233682431,US -3233682944,3233684991,US +3233676288,3233684991,US 3233684992,3233685503,BR -3233685760,3233688063,US +3233685504,3233688063,US 3233688576,3233688831,GB 3233688832,3233692159,US 3233692160,3233692671,NO @@ -33576,8 +62596,7 @@ 3233701632,3233701887,NO 3233701888,3233704959,US 3233704960,3233705215,NZ -3233705216,3233705983,US -3233707008,3233710335,US +3233705216,3233710335,US 3233710336,3233711359,FR 3233711360,3233721599,US 3233721600,3233721855,HU @@ -33593,8 +62612,7 @@ 3233729536,3233730047,SG 3233730560,3233732607,AU 3233732608,3233733631,US -3233734656,3233734911,US -3233735680,3233736959,US +3233734656,3233736959,US 3233736960,3233737983,FR 3233737984,3233738751,US 3233738752,3233739007,GB @@ -33602,15 +62620,74 @@ 3233739264,3233739519,FR 3233739520,3233740543,US 3233740544,3233741311,GB -3233741312,3233742591,US -3233742848,3233808383,US +3233741312,3233743359,US +3233743360,3233743615,CA +3233743616,3233744383,US +3233744384,3233744639,PR +3233744640,3233745663,US +3233745664,3233745919,CA +3233745920,3233746943,US +3233746944,3233747199,PR +3233747200,3233748735,US +3233748736,3233748991,PR +3233748992,3233749503,US +3233749504,3233750015,CA +3233750016,3233752831,US +3233752832,3233753087,PR +3233753088,3233763071,US +3233763072,3233763327,CA +3233763328,3233765887,US +3233765888,3233766143,CA +3233766144,3233768447,US +3233768448,3233768703,CA +3233768704,3233768959,PR +3233768960,3233778175,US +3233778176,3233778431,CA +3233778432,3233779455,US +3233779456,3233779711,CA +3233779712,3233781503,US +3233781504,3233781759,PR +3233781760,3233783807,US +3233783808,3233784063,PR +3233784064,3233784319,CA +3233784320,3233786111,US +3233786112,3233786367,PR +3233786368,3233790207,US +3233790208,3233790463,PR +3233790464,3233790719,CA +3233790720,3233790975,PR +3233790976,3233791231,CA +3233791232,3233791487,PR +3233791488,3233793023,US +3233793024,3233793279,PR +3233793280,3233794047,US +3233794048,3233794303,CA +3233794304,3233798399,US +3233798400,3233798655,CA +3233798656,3233800447,US +3233800448,3233800703,CA +3233800704,3233800959,US +3233800960,3233801215,CA +3233801216,3233801983,US +3233801984,3233802239,CA +3233802240,3233802495,US +3233802496,3233802751,CA +3233802752,3233803007,US +3233803008,3233803263,CA +3233803264,3233803519,US +3233803520,3233803775,CA +3233803776,3233808383,US 3233808384,3233873919,TW 3233873920,3233939455,US 3233939456,3233980671,FI 3233980672,3233980927,GB 3233980928,3233991167,FI 3233991168,3233991423,DE -3233991424,3234004991,FI +3233991424,3233994351,FI +3233994352,3233994367,AX +3233994368,3234001739,FI +3234001740,3234001743,AX +3234001744,3234004991,FI 3234005248,3234005503,GB 3234005504,3234005759,AU 3234006528,3234007039,US @@ -33619,8 +62696,7 @@ 3234007552,3234007807,AU 3234007808,3234008063,US 3234008064,3234008831,NZ -3234008832,3234011135,US -3234012160,3234013183,US +3234008832,3234013183,US 3234013440,3234013695,US 3234013696,3234013951,AU 3234013952,3234014207,US @@ -33634,7 +62710,7 @@ 3234019840,3234023423,US 3234023424,3234023679,PL 3234023680,3234024703,US -3234026752,3234030079,US +3234025472,3234030079,US 3234030080,3234030335,DE 3234030336,3234031103,US 3234031104,3234031359,AU @@ -33653,8 +62729,7 @@ 3234043904,3234044159,AU 3234044160,3234048511,US 3234048512,3234048767,AU -3234048768,3234049279,US -3234049792,3234051839,US +3234048768,3234051839,US 3234051840,3234052095,NL 3234052096,3234052351,DE 3234052352,3234052607,US @@ -33663,51 +62738,44 @@ 3234054912,3234055167,PT 3234055168,3234055423,US 3234055424,3234055679,AU -3234055680,3234056959,US -3234057216,3234061055,US +3234055680,3234061055,US 3234061056,3234061311,NZ 3234061312,3234064639,US 3234064640,3234064895,AU 3234064896,3234065407,US 3234065408,3234065663,GB 3234065664,3234065919,BR -3234065920,3234069247,US -3234069504,3234069759,US -3234070016,3234070271,US -3234070784,3234110463,FR -3234136064,3234150911,CA -3234151424,3234158847,CA -3234159104,3234159359,CA -3234160128,3234163455,CA +3234065920,3234070527,US +3234070528,3234136063,FR +3234136064,3234163455,CA 3234163456,3234163711,US -3234163712,3234167295,CA -3234167808,3234172927,CA +3234163712,3234172927,CA 3234172928,3234173951,US 3234173952,3234175999,CA -3234176256,3234177279,US +3234176000,3234177279,US 3234177280,3234187007,CA 3234187008,3234187519,US -3234187520,3234189055,CA -3234189312,3234192383,CA +3234187520,3234190463,CA +3234190464,3234190719,A1 +3234190720,3234192383,CA 3234192384,3234193663,US -3234193664,3234198783,CA -3234199040,3234201343,CA +3234193664,3234201599,CA 3234202624,3234203647,US 3234203648,3234205695,BR -3234205696,3234208255,US -3234209792,3234215935,US -3234217984,3234221823,US -3234234368,3234247167,US -3234267392,3234269695,US +3234205696,3234222079,US +3234234368,3234250751,US +3234267136,3234271231,US 3234271232,3234275327,PT 3234275328,3234279423,AU -3234283520,3234312703,US -3234332928,3234334975,US -3234340864,3234349055,US +3234283520,3234316287,US +3234332672,3234349055,US 3234349056,3234353151,NZ 3234365440,3234367487,US -3234398208,3234529279,US -3234529536,3234538751,US +3234398208,3234400679,US +3234400680,3234400687,NA +3234400688,3234401511,US +3234401512,3234401519,NA +3234401520,3234538751,US 3234539008,3234539519,AU 3234539520,3234549759,US 3234549760,3234550015,RU @@ -33744,59 +62812,45 @@ 3234584832,3234585343,US 3234585600,3234587391,US 3234587392,3234587647,SA -3234587648,3234588415,US +3234587648,3234588671,US 3234588672,3234588927,MO 3234588928,3234589439,US 3234589440,3234589695,AU -3234589696,3234589951,US -3234590208,3234590463,US -3234590720,3234592511,US +3234589696,3234592511,US 3234592512,3234592767,TH -3234592768,3234594047,US -3234594816,3234725887,US +3234592768,3234725887,US 3234726144,3234726399,CA 3234726400,3234726911,US -3234728192,3234730495,US -3234730752,3234733055,US +3234727936,3234733055,US 3234733056,3234733311,CA -3234733312,3234734079,US -3234735616,3234737407,US -3234738176,3234739455,US -3234740224,3234742015,US -3234742272,3234743551,US +3234733312,3234744319,US 3234744832,3234745599,US 3234745600,3234746879,GB 3234746880,3234747903,US 3234747904,3234748159,IL 3234748160,3234749439,US -3234749696,3234750207,CA -3234750720,3234751999,US +3234749440,3234750463,CA +3234750464,3234751999,US 3234752000,3234752255,HK 3234752256,3234753535,US 3234753536,3234753791,AU 3234753792,3234754047,US 3234754560,3234755839,US 3234755840,3234756095,AU -3234756096,3234760703,US -3234760960,3234761727,US -3234763264,3234764799,CA +3234756096,3234762751,US +3234762752,3234764799,CA 3234764800,3234766335,NZ 3234766336,3234772223,US 3234772224,3234772479,CA 3234772480,3234772735,US -3234772992,3234777599,US -3234778368,3234781439,US +3234772992,3234781439,US 3234781440,3234781951,CA 3234781952,3234782719,US 3234782720,3234783999,IL -3234784000,3234786815,US -3234787328,3234791167,US -3234791680,3234794495,US +3234784000,3234794495,US 3234794752,3234795007,US 3234795008,3234795263,GB -3234795264,3234795519,US -3234795776,3234796031,US -3234796288,3234799359,US +3234795264,3234799359,US 3234799360,3234799615,NL 3234799616,3234799871,US 3234799872,3234800127,AU @@ -33805,9 +62859,7 @@ 3234801664,3234802431,EC 3234802432,3234803711,US 3234803712,3234803967,PR -3234804224,3234805503,US -3234805760,3234806527,US -3234807552,3234807807,US +3234804224,3234807807,US 3234807808,3234808063,TH 3234808064,3234809087,EC 3234809088,3234810879,US @@ -33853,55 +62905,111 @@ 3234855168,3234855935,US 3234856192,3234856447,US 3234856448,3234856703,TH -3234857216,3234861055,CA -3234861056,3234864383,US -3234865152,3234870271,US -3234873344,3234886143,US -3234889728,3234897407,US -3234922752,3234926847,US -3234930688,3234938367,US -3234938880,3234988031,US -3234988288,3234990847,CA -3234996224,3234998783,US +3234856960,3234861055,CA +3234861056,3234897919,US +3234922496,3234988031,US +3234988032,3234992127,CA +3234996224,3235000319,US 3235004416,3235020799,CA -3235053824,3235056383,US -3235057664,3235065343,US -3235069952,3235085311,US -3235119104,3235275007,US -3235315712,3235512319,US +3235053568,3235086335,US +3235119104,3235184639,US +3235184640,3235184895,CA +3235184896,3235389439,US +3235389440,3235389951,VE +3235389952,3235417215,US +3235417216,3235417223,BR +3235417224,3235512319,US 3235512320,3235577855,JP -3235578112,3235641855,CA -3235642112,3235643135,CA +3235577856,3235643391,CA 3235643392,3235774463,US -3235774720,3235776767,CA -3235778560,3235800319,US -3235840256,3235842303,US -3235844096,3235846143,US -3235848192,3235856383,US +3235774464,3235778559,CA +3235778560,3235807231,US +3235840000,3235856383,US 3235856384,3235872767,BR -3235872768,3235971071,US -3235971328,3235977727,US -3235979264,3235985663,US -3235987456,3235995647,US -3236003840,3236010239,US -3236038656,3236044799,US +3235872768,3235906303,US +3235906304,3235906559,CA +3235906560,3235908863,US +3235908864,3235909119,CA +3235909120,3235912447,US +3235912448,3235912703,CA +3235912704,3235914495,US +3235914496,3235914751,CA +3235914752,3235916543,US +3235916544,3235916799,VI +3235916800,3235917567,US +3235917568,3235917823,CA +3235917824,3235919359,US +3235919360,3235919615,CA +3235919616,3235921151,US +3235921152,3235921407,PR +3235921408,3235925503,US +3235925504,3235925759,CA +3235925760,3235926271,US +3235926272,3235926527,CA +3235926528,3235927295,US +3235927296,3235927807,CA +3235927808,3235928319,US +3235928320,3235929343,CA +3235929344,3235929599,US +3235929600,3235929855,CA +3235929856,3235932159,US +3235932160,3235932927,CA +3235932928,3235936511,US +3235936512,3235936767,CA +3235936768,3235937023,US +3235937024,3235937535,CA +3235937536,3235937791,US +3235937792,3235938047,CA +3235938048,3235941631,US +3235941632,3235941887,CA +3235941888,3235945983,US +3235945984,3235946239,CA +3235946240,3235946751,US +3235946752,3235947263,CA +3235947264,3235949311,US +3235949312,3235950335,CA +3235950336,3235950591,US +3235950592,3235950847,CA +3235950848,3235951871,US +3235951872,3235952127,CA +3235952128,3235957247,US +3235957248,3235957503,PR +3235957504,3235957759,US +3235957760,3235958015,DE +3235958016,3235959551,US +3235959552,3235959807,CA +3235959808,3235960319,US +3235960320,3235960575,CA +3235960576,3235961599,US +3235961600,3235961855,CA +3235961856,3235962111,US +3235962112,3235962367,CA +3235962368,3235963647,US +3235963648,3235963903,CA +3235963904,3235966975,US +3235966976,3235967231,PR +3235967232,3235967743,US +3235967744,3235967999,CA +3235968000,3235968511,US +3235968512,3235968767,CA +3235968768,3235970559,US +3235970560,3235970815,CA +3235970816,3236044799,US 3236044800,3236052991,CA 3236052992,3236069375,US -3236102400,3236106239,PH +3236102144,3236106239,PH 3236106240,3236134911,US -3236167936,3236175871,CA -3236175872,3236191487,US +3236167680,3236175871,CA +3236175872,3236192255,US 3236200448,3236233215,MY -3236233472,3236238591,US -3236241408,3236249599,US +3236233216,3236249599,US 3236298752,3236302847,US 3236302848,3236306943,NZ -3236364544,3236365567,US -3236365824,3236368127,US +3236364288,3236368127,US 3236368128,3236368383,NZ 3236368384,3236372991,US 3236372992,3236373247,AU -3236373760,3236379391,US +3236373504,3236379391,US 3236379392,3236379647,AU 3236379648,3236380927,US 3236381184,3236381439,CA @@ -33913,8 +63021,8 @@ 3236385536,3236385791,US 3236386304,3236387071,US 3236387072,3236387327,CA -3236387328,3236388095,US -3236388096,3236389375,PR +3236387328,3236387839,US +3236387840,3236389375,PR 3236389376,3236392447,US 3236392448,3236392703,CL 3236392704,3236393471,US @@ -33927,8 +63035,7 @@ 3236400128,3236400383,CL 3236400384,3236401151,US 3236401152,3236401407,AU -3236401408,3236403967,US -3236404224,3236406783,US +3236401408,3236406783,US 3236406784,3236407551,AU 3236407552,3236408063,SG 3236408064,3236408319,US @@ -33947,35 +63054,25 @@ 3236419840,3236420095,US 3236420096,3236420351,AU 3236420352,3236424959,US +3236424960,3236425215,MZ 3236425216,3236427519,US 3236427520,3236427775,CA 3236427776,3236428031,NZ 3236428800,3236429311,US -3236430080,3236432639,US -3236433920,3236438015,US +3236429312,3236429567,ZA +3236429824,3236438015,US 3236438016,3236446207,AU 3236446208,3236462591,US 3236462592,3236470783,AU -3236495360,3236560895,US -3236561152,3236566783,US +3236495360,3236566783,US 3236566784,3236567039,CA -3236567040,3236568831,US -3236569856,3236570367,US -3236571392,3236575743,US +3236567040,3236575743,US 3236575744,3236575999,JP -3236576000,3236581119,US -3236583680,3236585983,US +3236576000,3236585983,US 3236585984,3236586239,CA -3236586240,3236587775,US -3236588032,3236589823,US -3236590080,3236591103,US -3236592128,3236601343,US -3236601600,3236604671,US +3236586240,3236604671,US 3236604672,3236604927,CA -3236604928,3236610047,US -3236610304,3236611071,US -3236612096,3236612607,US -3236613376,3236617471,US +3236604928,3236617471,US 3236617728,3236617983,US 3236617984,3236619775,CA 3236619776,3236620031,US @@ -33985,35 +63082,66 @@ 3236623872,3236625919,US 3236625920,3236626175,CA 3236626432,3236642815,US -3236692224,3236694271,US -3236696064,3236698623,US -3236700160,3236708351,US +3236691968,3236708351,US 3236757504,3236765695,CA -3236765696,3236790271,US -3236823296,3236825855,CH +3236765696,3236774911,US +3236774912,3236775423,HK +3236775424,3236775679,NL +3236775680,3236776191,CA +3236776192,3236776447,DE +3236776448,3236776959,US +3236776960,3236777215,CA +3236777216,3236777983,US +3236777984,3236778239,DE +3236778240,3236778751,GB +3236778752,3236780287,US +3236780288,3236780543,FR +3236780544,3236780799,CH +3236780800,3236781599,US +3236781600,3236781615,NL +3236781616,3236781727,US +3236781728,3236781759,NL +3236781760,3236781823,US +3236781824,3236782335,ES +3236782336,3236782719,US +3236782720,3236782751,BE +3236782752,3236782847,US +3236782848,3236782911,LU +3236782912,3236784383,US +3236784384,3236784895,IT +3236784896,3236785663,US +3236785664,3236785919,DE +3236785920,3236786175,ZA +3236786176,3236786431,US +3236786432,3236786687,FR +3236786688,3236787199,CA +3236787200,3236787967,US +3236787968,3236788223,JP +3236788224,3236788479,US +3236788480,3236789503,GB +3236789504,3236790271,US +3236823040,3236827135,CH 3236827136,3236829183,US 3236831232,3236855807,US 3236888576,3236958207,US 3236958208,3236962303,AU -3236962304,3236966143,US +3236962304,3236966399,US 3236970496,3236978687,US -3236986880,3236991999,US -3237019648,3237021695,US -3237023744,3237031935,US -3237085184,3237155839,US +3236986880,3236995071,US +3237019648,3237036031,US +3237085184,3237154815,US +3237154816,3237155839,ES 3237155840,3237156863,AU -3237158912,3237159167,US -3237160192,3237160703,US -3237183488,3237205247,US +3237158912,3237160959,US +3237183488,3237216255,US 3237216256,3237281791,JP -3237282560,3237284607,US +3237281792,3237284607,US 3237284608,3237284863,AU 3237284864,3237285119,US 3237285120,3237285631,AU 3237285632,3237287935,US 3237287936,3237288191,CA -3237288192,3237289471,US -3237289728,3237290495,US +3237288192,3237290495,US 3237290496,3237291007,AU 3237291008,3237291263,NZ 3237291264,3237294847,US @@ -34029,17 +63157,16 @@ 3237305856,3237306111,NZ 3237306112,3237308671,US 3237308672,3237310719,AU -3237310720,3237311999,US -3237312256,3237312767,US +3237310720,3237312767,US 3237312768,3237313023,BO -3237313024,3237317631,US -3237317888,3237319679,US +3237313024,3237319679,US +3237319680,3237319935,DZ 3237319936,3237320703,US 3237320704,3237320959,UA 3237320960,3237321471,US 3237321472,3237321727,HK 3237321728,3237321983,US -3237323264,3237325055,US +3237322752,3237325055,US 3237325056,3237325311,PL 3237325312,3237325823,US 3237325824,3237326079,CA @@ -34065,20 +63192,23 @@ 3237340160,3237340415,CA 3237340416,3237345535,US 3237345536,3237346303,KR -3237346304,3237347071,US -3237347328,3237412863,US -3237413120,3237415679,GB +3237346304,3237349119,US +3237349120,3237349375,AU +3237349376,3237366015,US +3237366016,3237366271,AU +3237366272,3237412863,US +3237412864,3237416959,GB 3237416960,3237437439,US 3237445632,3237478399,US 3237478400,3237511167,LK 3237511168,3237548031,US 3237548032,3237552127,KR -3237552128,3237557247,US +3237552128,3237560319,US 3237609472,3237613567,US 3237615104,3237615615,US 3237615616,3237616895,CA 3237617152,3237658623,US -3237675264,3237681663,US +3237675008,3237681663,US 3237681664,3237682943,CA 3237682944,3237684991,US 3237684992,3237685247,CL @@ -34088,9 +63218,7 @@ 3237690624,3237691903,SA 3237691904,3237698303,US 3237698304,3237698559,CA -3237698560,3237701631,US -3237702400,3237707775,US -3237708032,3237712895,US +3237698560,3237712895,US 3237712896,3237713151,AU 3237713152,3237716991,US 3237716992,3237717247,CA @@ -34101,23 +63229,25 @@ 3237725184,3237725439,CA 3237725440,3237725695,US 3237726464,3237726719,AU +3237726720,3237726975,GH 3237726976,3237727231,US 3237727232,3237728255,AU 3237728256,3237732863,US 3237732864,3237733119,DE 3237733120,3237733631,TH 3237733632,3237733887,AU +3237733888,3237734143,NZ 3237734144,3237734399,CA -3237734400,3237735679,US -3237740544,3237773311,US -3237806336,3237857535,US -3237871616,3237887999,US +3237734400,3237736447,US +3237740544,3238002687,US 3238002688,3238006783,NL 3238006784,3238007039,GB 3238007040,3238010879,NL 3238010880,3238017023,CH 3238017024,3238018303,DK -3238018560,3238019071,CH +3238018304,3238018559,TR +3238018560,3238018815,FR +3238018816,3238019071,DE 3238019072,3238035455,PL 3238035456,3238060031,FR 3238060032,3238060287,CH @@ -34132,7 +63262,7 @@ 3238062848,3238063103,SE 3238063104,3238063359,PL 3238063360,3238063615,CH -3238063616,3238063871,IT +3238063616,3238063871,DE 3238063872,3238064127,GB 3238064128,3238064383,UA 3238064384,3238064639,ES @@ -34154,11 +63284,7 @@ 3238133760,3238199295,SI 3238199296,3238201599,DK 3238201600,3238202367,US -3238202368,3238239647,DK -3238239648,3238239679,US -3238239680,3238239711,NL -3238239712,3238239743,AR -3238239744,3238264831,DK +3238202368,3238264831,DK 3238264832,3238330367,IS 3238330368,3238337023,CH 3238337024,3238337535,LI @@ -34167,33 +63293,33 @@ 3238461440,3238502399,DE 3238502400,3238504447,RU 3238504448,3238526975,DE -3238527232,3238541567,CH -3238541824,3238542591,CH -3238542848,3238545919,CH -3238546432,3238546943,CH -3238547456,3238548991,CH -3238549504,3238559231,CH -3238559488,3238562559,CH -3238562816,3238573567,CH -3238574080,3238582271,CH -3238582784,3238583295,CH -3238583808,3238589951,CH -3238590208,3238590719,CH -3238591232,3238592511,CH -3238592512,3238592767,GB +3238526976,3238592511,CH +3238592512,3238593023,GB +3238593024,3238594303,EU +3238594304,3238594559,GB 3238594560,3238595583,BE 3238595584,3238595839,SI 3238595840,3238596607,GB -3238596608,3238598655,DK -3238598656,3238598911,RO -3238598912,3238599167,DK -3238599168,3238600703,HU +3238596608,3238596863,BG +3238596864,3238597119,RU +3238597120,3238597375,DE +3238597376,3238597631,SI +3238597632,3238597887,GB +3238597888,3238598143,SI +3238598144,3238598399,RU +3238598400,3238598655,NL +3238598656,3238598911,CH +3238598912,3238599167,PL +3238599168,3238599679,HU +3238599680,3238599935,UA +3238599936,3238600703,HU 3238600704,3238604799,DE 3238604800,3238606335,NL 3238606336,3238606591,SE 3238606592,3238607359,NL 3238607360,3238607871,SE 3238607872,3238608895,NL +3238608896,3238621183,EU 3238621184,3238621439,FI 3238621440,3238621695,FR 3238621696,3238621951,IT @@ -34202,16 +63328,22 @@ 3238622464,3238622719,SE 3238622720,3238622975,DK 3238622976,3238623231,GB +3238623232,3238623487,LV 3238623488,3238623743,PL 3238623744,3238623999,CH 3238624000,3238624255,PL 3238624256,3238625279,HU +3238625280,3238630399,EU 3238630400,3238630655,GR 3238630656,3238632959,GB 3238632960,3238633215,UA 3238633216,3238657791,DK 3238657792,3238658047,AT -3238658048,3238795263,SE +3238658048,3238675455,SE +3238675456,3238675711,DK +3238675712,3238723071,SE +3238723072,3238723327,DK +3238723328,3238795263,SE 3238795264,3238795775,IT 3238795776,3238801279,SE 3238801280,3238801343,GB @@ -34222,7 +63354,7 @@ 3239062528,3239062783,CH 3239062784,3239063551,UA 3239063552,3239075839,DE -3239075840,3239076095,BE +3239075840,3239076095,MT 3239076096,3239076351,SE 3239076352,3239076607,DE 3239076608,3239076863,PL @@ -34268,15 +63400,15 @@ 3239108096,3239109887,DE 3239109888,3239110143,PL 3239110144,3239110655,DE -3239110656,3239110911,PL +3239110656,3239110911,RU 3239110912,3239111167,UA 3239111168,3239111423,NL 3239111424,3239111935,DE 3239111936,3239112191,AT -3239112192,3239112447,UA +3239112192,3239112447,IL 3239112448,3239112959,PL 3239112960,3239113215,CH -3239113216,3239113471,DE +3239113216,3239113471,AT 3239113472,3239113727,ES 3239113728,3239113983,AT 3239113984,3239114239,DE @@ -34285,7 +63417,7 @@ 3239114752,3239116543,DE 3239116544,3239116799,PL 3239116800,3239117055,PT -3239117312,3239119871,DE +3239117056,3239119871,DE 3239119872,3239120127,GB 3239120128,3239120383,CZ 3239120384,3239120639,PL @@ -34335,8 +63467,7 @@ 3239161600,3239161855,HU 3239161856,3239162623,DE 3239162624,3239162879,BE -3239162880,3239163903,DE -3239164160,3239164671,DE +3239162880,3239164671,DE 3239164672,3239164927,GB 3239164928,3239165183,DK 3239165184,3239165951,DE @@ -34369,14 +63500,13 @@ 3239173632,3239173887,AT 3239173888,3239174143,PL 3239174144,3239174399,DE -3239174400,3239174655,FR -3239174656,3239174911,UA +3239174656,3239174911,GB 3239174912,3239175167,SI 3239175168,3239175423,UA 3239175424,3239175679,BG 3239175680,3239175935,DE 3239175936,3239176191,FI -3239176192,3239180287,DE +3239176192,3239181311,DE 3239181312,3239181567,AT 3239181568,3239181823,UA 3239181824,3239264255,DE @@ -34398,18 +63528,18 @@ 3239273472,3239273983,UA 3239273984,3239274495,RU 3239274496,3239275007,PL -3239275008,3239275519,ES +3239275008,3239275519,RO 3239275520,3239276543,UA 3239276544,3239277055,LU 3239277056,3239277567,DE 3239277568,3239278079,RU 3239278080,3239278591,UA -3239278592,3239279103,AT +3239278592,3239279103,RU 3239279104,3239280127,PL 3239280128,3239280639,RU 3239280640,3239281663,IR 3239281664,3239282687,UA -3239282688,3239283711,DE +3239282688,3239283711,FI 3239283712,3239284735,PL 3239284736,3239285759,UA 3239285760,3239286783,KW @@ -34417,6 +63547,7 @@ 3239287808,3239288831,GB 3239288832,3239289855,DE 3239289856,3239290879,PL +3239290880,3239291903,GB 3239291904,3239292927,BG 3239292928,3239293951,CZ 3239293952,3239294975,DE @@ -34441,7 +63572,6 @@ 3239446016,3239446271,RU 3239446272,3239446527,FR 3239446528,3239451647,DE -3239451648,3239451903,NO 3239451904,3239452159,DE 3239452160,3239452415,CY 3239452416,3239452671,HR @@ -34463,14 +63593,13 @@ 3239468544,3239468799,NO 3239468800,3239469055,RO 3239469056,3239470591,DE -3239470592,3239470847,DK +3239470592,3239470847,CH 3239470848,3239471103,BG 3239471104,3239471871,DE 3239471872,3239472127,FR 3239472128,3239474943,DE 3239474944,3239475199,ES -3239475200,3239479295,DE -3239479552,3239479807,DE +3239475200,3239479807,DE 3239479808,3239480063,UA 3239480064,3239480319,FR 3239480320,3239480575,UA @@ -34486,7 +63615,6 @@ 3239488256,3239488511,CH 3239488512,3239488767,KW 3239488768,3239489023,RO -3239489024,3239489279,RU 3239489280,3239489535,PL 3239489536,3239501823,DE 3239501824,3239505919,BE @@ -34518,8 +63646,8 @@ 3239525632,3239525887,PL 3239525888,3239526143,SI 3239526144,3239526399,PL -3239526400,3239538943,DE -3239538944,3239539199,NL +3239526400,3239538687,DE +3239538688,3239539199,NL 3239539200,3239539455,IT 3239539456,3239539711,BE 3239539712,3239539967,GB @@ -34532,10 +63660,16 @@ 3239541504,3239541759,FR 3239541760,3239542015,GB 3239542016,3239542271,PL -3239542272,3239542527,GB +3239542272,3239542527,UA 3239542528,3239542783,FR 3239542784,3239544831,DE -3239544832,3239546879,HU +3239544832,3239545087,GB +3239545088,3239545343,SI +3239545344,3239545855,HU +3239545856,3239546111,UA +3239546112,3239546367,GB +3239546368,3239546623,RU +3239546624,3239546879,NL 3239546880,3239549951,DE 3239549952,3239550207,TR 3239550208,3239550463,UA @@ -34552,6 +63686,7 @@ 3239556608,3239556863,HR 3239556864,3239557119,UA 3239557120,3239567359,DE +3239567360,3239567615,GB 3239567616,3239567871,UA 3239567872,3239568127,DE 3239568128,3239568383,FR @@ -34560,7 +63695,7 @@ 3239568896,3239575295,DE 3239575296,3239575551,DK 3239575552,3239575807,RO -3239575808,3239578879,DE +3239575808,3239579135,DE 3239579136,3239579391,PL 3239579392,3239581695,DE 3239581696,3239581951,PL @@ -34575,11 +63710,12 @@ 3239591936,3239593983,FI 3239593984,3239624703,DE 3239624704,3239625727,CH -3239625728,3239628799,PL +3239625728,3239626751,RU +3239626752,3239628799,PL 3239628800,3239629823,DE 3239629824,3239630847,FR 3239630848,3239631871,DE -3239631872,3239632895,PL +3239631872,3239632895,UA 3239632896,3239633919,DE 3239633920,3239634943,FR 3239634944,3239635967,RU @@ -34602,7 +63738,7 @@ 3239670272,3239670783,DE 3239670784,3239671295,GB 3239671296,3239671807,DE -3239671808,3239672319,GB +3239671808,3239672319,UA 3239672320,3239672831,DE 3239672832,3239673343,TR 3239673344,3239673855,SE @@ -34624,10 +63760,10 @@ 3239690496,3239690751,PL 3239690752,3239691263,FR 3239691264,3239691519,IT -3239691520,3239692031,FR +3239691520,3239691775,FR +3239691776,3239692031,EU 3239692032,3239692287,AT 3239692288,3239697407,DE -3239697408,3239697663,NL 3239697664,3239697919,RU 3239697920,3239698431,PL 3239698432,3239706367,DE @@ -34656,7 +63792,7 @@ 3239712000,3239712255,PL 3239712256,3239712511,DE 3239712512,3239712767,GB -3239712768,3239713023,DK +3239712768,3239713023,DE 3239713024,3239713279,PL 3239713280,3239713535,SI 3239713536,3239713791,UA @@ -34677,14 +63813,13 @@ 3239741184,3239741439,RU 3239741440,3239759871,DE 3239759872,3239760127,RU -3239760128,3239760383,NL +3239760128,3239760383,UA 3239760384,3239760895,PL 3239760896,3239761151,RU 3239761152,3239761407,GB 3239761408,3239761663,RU 3239761664,3239761919,PL 3239761920,3239762175,BG -3239762176,3239762431,CH 3239762432,3239762687,DK 3239762688,3239762943,RO 3239762944,3239763199,PL @@ -34701,8 +63836,7 @@ 3239774464,3239774719,ES 3239774720,3239774975,FR 3239774976,3239775231,PT -3239775232,3239776255,DE -3239776512,3239782399,DE +3239775232,3239782399,DE 3239782400,3239782655,AT 3239782656,3239782911,RU 3239782912,3239783167,GB @@ -34712,11 +63846,12 @@ 3239783936,3239784191,DE 3239784192,3239784447,UA 3239784448,3239788543,DE +3239788544,3239789055,EU 3239789056,3239789567,RU -3239789568,3239790079,UA +3239789568,3239790079,FR 3239790080,3239791103,RO -3239791104,3239791615,DK -3239791616,3239792639,FR +3239791104,3239792127,CH +3239792128,3239792639,FR 3239792640,3239793151,UA 3239793152,3239793663,PL 3239793664,3239794175,RO @@ -34742,7 +63877,7 @@ 3239827968,3239828479,CH 3239828480,3239828991,DE 3239828992,3239830015,RU -3239830016,3239830527,DK +3239830016,3239830527,CH 3239830528,3239831039,SE 3239831040,3239832063,RU 3239832064,3239832575,UA @@ -34751,25 +63886,24 @@ 3239834624,3239835135,AT 3239835136,3239836159,RU 3239836160,3239836671,DK -3239836672,3239837183,DE 3239837184,3239837695,SE 3239837696,3239837951,PL -3239837952,3239839743,DE +3239837952,3239839231,DE +3239839232,3239839487,RU +3239839488,3239839743,DE 3239839744,3239839999,SK 3239840000,3239840511,SA 3239840512,3239840767,DE 3239840768,3239841023,AT 3239841024,3239841279,NL 3239841280,3239848447,DE -3239848448,3239848703,DK +3239848448,3239848703,CH 3239848704,3239848959,SE 3239848960,3239849215,RU 3239849216,3239849471,GB 3239849472,3239849727,RU 3239849728,3239849983,NL -3239849984,3239852287,DE -3239852544,3239852799,DE -3239853056,3239859199,DE +3239849984,3239859199,DE 3239859200,3239859455,PL 3239859456,3239859711,UA 3239859712,3239859967,HU @@ -34810,19 +63944,20 @@ 3239885312,3239885567,UA 3239885568,3239885823,PL 3239885824,3239886079,CH -3239886080,3239886335,ES +3239886080,3239886335,PL 3239886336,3239886591,RU 3239886592,3239886847,FR 3239886848,3239888895,DE 3239888896,3239889151,UA 3239889152,3239889407,GB 3239889408,3239889663,CZ +3239889664,3239889919,FI 3239889920,3239890175,AT 3239890176,3239890431,FR 3239890432,3239890687,NL 3239890688,3239895039,DE 3239895040,3239895295,DK -3239895296,3239895551,DE +3239895296,3239895551,TR 3239895552,3239895807,PL 3239895808,3239896063,DK 3239896064,3239896575,DE @@ -34835,7 +63970,7 @@ 3239898112,3239898367,NO 3239898368,3239898623,GB 3239898624,3239898879,DE -3239898880,3239899135,PL +3239898880,3239899135,RU 3239899136,3239901695,DE 3239901696,3239901951,BG 3239901952,3239902207,DE @@ -34844,6 +63979,7 @@ 3239902720,3239902975,EE 3239902976,3239903231,GB 3239903232,3239907327,DE +3239907328,3239907583,UA 3239907584,3239913215,DE 3239913216,3239913471,LT 3239913472,3239915519,DE @@ -34860,11 +63996,10 @@ 3239936256,3239936511,FR 3239936512,3239938815,DE 3239938816,3239939071,NL -3239939072,3239950335,DE -3239950848,3239951103,DE +3239939072,3239951103,DE 3239951104,3239951359,AT 3239951360,3239954431,DE -3239954432,3239954687,HU +3239954432,3239954687,UA 3239954688,3239954943,DK 3239954944,3239955199,ES 3239955200,3239955711,UA @@ -34876,21 +64011,18 @@ 3239959808,3239960063,BE 3239960064,3239960319,FR 3239960320,3239960575,GB -3239960576,3239962111,DE -3239962368,3239968511,DE +3239960576,3239968511,DE 3239968512,3239968767,PL 3239968768,3239969023,NO -3239969024,3239970047,DE -3239970304,3239974911,DE +3239969024,3239974911,DE 3239974912,3239975935,GB -3239976960,3239978751,DE +3239975936,3239978751,DE 3239978752,3239979007,RU 3239979008,3239979263,UA 3239979264,3239979519,GB 3239979520,3239979775,DE 3239979776,3239980031,SI -3239980032,3239993087,DE -3239995392,3239996415,DE +3239980032,3239996415,DE 3239996416,3239996671,GB 3239996672,3239996927,PL 3239996928,3239997183,BE @@ -34914,17 +64046,18 @@ 3240028160,3240029183,GB 3240029184,3240030207,RU 3240030208,3240032255,UA -3240032256,3240033279,RU +3240032256,3240033279,RS 3240033280,3240034303,DE 3240034304,3240034559,RU -3240034560,3240035583,DE -3240035840,3240037375,DE +3240034560,3240037887,DE 3240037888,3240038143,AT 3240038144,3240038399,DK 3240038400,3240098815,DE 3240098816,3240099327,CH -3240099584,3240099839,DE -3240099840,3240104703,GB +3240099328,3240099839,DE +3240099840,3240102911,GB +3240102912,3240103935,UA +3240103936,3240104703,GB 3240104704,3240104959,NL 3240104960,3240105215,RU 3240105216,3240105471,UA @@ -34932,19 +64065,21 @@ 3240109056,3240109567,PL 3240109568,3240125439,GB 3240125440,3240125695,RO -3240125696,3240165375,GB +3240125696,3240125951,IE +3240125952,3240165375,GB 3240165376,3240165887,IT 3240165888,3240166399,ES 3240166400,3240166911,PL 3240166912,3240167423,RO -3240167424,3240167935,MD +3240167424,3240167935,PL 3240167936,3240168447,RU 3240168448,3240168959,FR 3240168960,3240169471,CZ 3240169472,3240169983,IL 3240169984,3240170495,IT 3240170496,3240171007,DE -3240171008,3240172031,RO +3240171008,3240171519,CZ +3240171520,3240172031,RO 3240172032,3240173055,RU 3240173056,3240173567,CH 3240173568,3240174079,RO @@ -34969,7 +64104,7 @@ 3240183616,3240183647,CR 3240183648,3240183807,NL 3240183808,3240184319,GB -3240184320,3240184831,DE +3240184320,3240184831,UA 3240184832,3240185343,GB 3240185344,3240185855,FR 3240185856,3240187391,RU @@ -35002,15 +64137,16 @@ 3240201216,3240201727,RO 3240201728,3240202239,CH 3240202240,3240202751,RU -3240202752,3240203263,UA -3240203264,3240203775,RO -3240203776,3240204799,AT +3240202752,3240203263,GB +3240203264,3240203775,DK +3240203776,3240204287,AT +3240204288,3240204799,SE 3240204800,3240205311,RO 3240205312,3240205823,GB 3240205824,3240206335,DE 3240206336,3240206847,RU 3240206848,3240207871,RO -3240207872,3240208383,CN +3240207872,3240208383,RU 3240208384,3240208895,FR 3240208896,3240209407,GB 3240209408,3240209919,UA @@ -35022,7 +64158,7 @@ 3240212992,3240213503,GB 3240213504,3240214015,SE 3240214016,3240214527,DK -3240215040,3240215551,RU +3240214528,3240215551,RU 3240215552,3240216063,UA 3240216064,3240216575,GB 3240216576,3240217087,RO @@ -35034,9 +64170,10 @@ 3240219648,3240220159,UA 3240220160,3240220671,NL 3240220672,3240221183,AT -3240221184,3240221695,SA +3240221184,3240221695,SE 3240221696,3240222207,NL 3240222208,3240222719,FR +3240222720,3240223231,KW 3240223232,3240223743,RU 3240223744,3240224255,MT 3240224256,3240225279,RU @@ -35055,7 +64192,6 @@ 3240235008,3240236031,FR 3240236032,3240237055,UA 3240237056,3240238079,DE -3240238080,3240239103,GB 3240239104,3240240127,FR 3240240128,3240241151,US 3240241152,3240242175,FI @@ -35076,15 +64212,14 @@ 3240258560,3240259583,RO 3240259584,3240260607,PL 3240260608,3240262655,DE -3240262656,3240263679,RU 3240263680,3240264191,UA 3240264192,3240264703,FR 3240264704,3240265215,TR -3240265216,3240265727,RU +3240265216,3240265727,HU 3240265728,3240266239,CH 3240266240,3240266751,PL 3240266752,3240267263,UA -3240267264,3240267775,CS +3240267264,3240267775,RS 3240267776,3240268287,DE 3240268288,3240269311,GB 3240269312,3240269823,NL @@ -35113,18 +64248,46 @@ 3240280576,3240280703,GB 3240280704,3240280831,RU 3240280832,3240280959,GB -3240281088,3240281215,PL +3240280960,3240281215,PL 3240281216,3240281343,FR 3240281344,3240281471,PL 3240281472,3240281599,IR +3240281600,3240281727,JO +3240281728,3240281855,PL +3240281856,3240281983,NL +3240281984,3240282111,IT +3240282112,3240282239,DE +3240282240,3240282367,UA +3240282368,3240282495,RO +3240282624,3240282879,SE +3240282880,3240283007,UA +3240283008,3240283135,PL +3240284160,3240285183,RU +3240285184,3240286207,PL +3240286208,3240287231,UA +3240287232,3240288255,PL 3240288256,3240296447,GB 3240296448,3240296703,RO 3240296704,3240302847,GB 3240302848,3240303103,UA -3240303104,3240321023,GB -3240325120,3240361983,GB +3240303104,3240361983,GB 3240361984,3240362239,TR -3240362496,3240407039,GB +3240362240,3240370175,GB +3240370176,3240370431,CH +3240370432,3240370687,DE +3240370688,3240370943,GB +3240370944,3240371199,RU +3240371200,3240371455,CH +3240371456,3240371711,RO +3240371712,3240371967,RU +3240371968,3240372223,TR +3240372224,3240372479,SI +3240372480,3240372991,RU +3240372992,3240373247,IE +3240373248,3240373503,RO +3240373504,3240373759,FR +3240373760,3240374015,DE +3240374016,3240407039,GB 3240407040,3240407295,IL 3240407296,3240407551,NL 3240407552,3240407807,NO @@ -35150,13 +64313,12 @@ 3240460288,3240461055,IL 3240461056,3240461567,DE 3240461568,3240461823,UA -3240461824,3240462079,RU +3240461824,3240462079,EU 3240462080,3240462335,TR 3240462336,3240462591,RO 3240462592,3240462847,RU 3240462848,3240463103,RO -3240463104,3240463359,PL -3240463360,3240463615,RU +3240463104,3240463615,PL 3240463616,3240463871,UA 3240463872,3240464127,GB 3240464128,3240464383,SA @@ -35172,7 +64334,7 @@ 3240467200,3240467455,NL 3240467456,3240467711,UA 3240467712,3240467967,RU -3240467968,3240468223,DE +3240467968,3240468223,GB 3240468224,3240468479,CH 3240468480,3240487935,GB 3240487936,3240488191,CH @@ -35204,7 +64366,9 @@ 3240589312,3240593407,SE 3240593408,3240594175,GB 3240594176,3240594431,DK -3240594432,3240622079,GB +3240594432,3240609791,GB +3240609792,3240611839,DE +3240611840,3240622079,GB 3240622080,3240622591,RU 3240622592,3240624127,GB 3240624128,3240689663,EE @@ -35215,7 +64379,7 @@ 3240691712,3240692735,DE 3240692736,3240693247,DK 3240693248,3240693759,ES -3240693760,3240695807,IE +3240693760,3240695807,BE 3240695808,3240697855,ES 3240697856,3240698111,SE 3240698112,3240698367,LV @@ -35239,7 +64403,6 @@ 3240706048,3240707071,BG 3240707072,3240707839,NL 3240707840,3240709119,FR -3240709120,3240710143,IT 3240710144,3240710399,UA 3240710400,3240710655,LT 3240710656,3240710911,DE @@ -35262,6 +64425,7 @@ 3240719360,3240719871,DE 3240719872,3240720383,SE 3240720384,3240720895,DE +3240720896,3240721407,RO 3240721408,3240721919,DE 3240721920,3240722431,RO 3240722432,3240723455,UA @@ -35276,7 +64440,7 @@ 3240728576,3240729599,GB 3240729600,3240730111,DK 3240730112,3240730623,BE -3240730624,3240731647,UA +3240730624,3240731647,ES 3240731648,3240732671,GB 3240732672,3240733695,SE 3240733696,3240734719,UA @@ -35295,9 +64459,9 @@ 3240740608,3240741119,DE 3240741120,3240741375,AT 3240741376,3240741631,IL +3240741632,3240741887,SK 3240741888,3240742143,LV 3240742144,3240742399,IT -3240742400,3240742655,BG 3240742656,3240742911,AT 3240742912,3240743423,IL 3240743424,3240743935,DK @@ -35308,7 +64472,7 @@ 3240745984,3240746495,GB 3240746496,3240747007,FR 3240747008,3240747263,SE -3240747264,3240747519,US +3240747264,3240747519,TR 3240747520,3240747775,RU 3240747776,3240748031,ES 3240748032,3240748287,AT @@ -35326,6 +64490,22 @@ 3240754176,3240755199,DE 3240755200,3240755455,IE 3240755456,3240791551,IT +3240791552,3240791807,RU +3240791808,3240792063,ES +3240792064,3240792319,GB +3240792320,3240792575,RO +3240792576,3240792831,CH +3240792832,3240793087,PL +3240793088,3240793343,UA +3240793344,3240793599,RU +3240793600,3240794111,FR +3240794112,3240794367,GB +3240794368,3240794879,PL +3240794880,3240795135,DE +3240795136,3240795391,BG +3240795392,3240795647,UA +3240795648,3240795903,CH +3240795904,3240796159,SE 3240796160,3240808959,IT 3240808960,3240809215,GB 3240809216,3240809471,PL @@ -35341,12 +64521,13 @@ 3240811776,3240812031,DE 3240812032,3240812287,HU 3240812288,3240812543,KW +3240812544,3240813567,IT 3240813568,3240814591,PL 3240814592,3240818687,IT 3240818688,3240820735,NL +3240820736,3240820799,EU 3240820800,3240820831,RU -3240820832,3240822783,IT -3240824320,3240827135,IT +3240820832,3240827135,IT 3240827136,3240827391,FR 3240827392,3240827647,BG 3240827648,3240827903,CH @@ -35356,7 +64537,7 @@ 3240837120,3240837375,GB 3240837376,3240840447,IT 3240840448,3240840703,PL -3240840704,3240840959,RO +3240840704,3240840959,RU 3240840960,3240841215,GB 3240841216,3240843263,IT 3240843264,3240843775,NL @@ -35371,22 +64552,24 @@ 3240852736,3240852991,GB 3240852992,3240853247,IT 3240853248,3240853503,RU -3240853504,3240855039,VA -3240855040,3240858623,IT -3240858624,3240858879,UA +3240853504,3240854527,VA +3240854528,3240855039,IT +3240855040,3240855295,RU +3240855296,3240857599,IT +3240857600,3240857855,PL +3240857856,3240858623,IT +3240858624,3240858879,PL 3240858880,3240859135,IT 3240859136,3240859391,NL 3240859392,3240859647,SE 3240859648,3240861183,CH 3240861184,3240861695,AT 3240861696,3240866815,IT -3240866816,3240867071,GB 3240867072,3240867327,PL 3240867328,3240867583,RU 3240867584,3240867839,CH 3240867840,3240873983,IT 3240873984,3240874495,RU -3240874496,3240875007,FR 3240875008,3240875519,AT 3240875520,3240876031,FR 3240876032,3240876543,DK @@ -35394,15 +64577,29 @@ 3240877056,3240877567,DE 3240877568,3240879103,UA 3240879104,3240880127,PL -3240880128,3240881151,ES +3240880128,3240881151,RU +3240881152,3240882175,EU 3240882176,3240883199,PL 3240883200,3240884223,IL 3240884224,3240886271,UA -3240886272,3240961791,SE +3240886272,3240952071,SE +3240952072,3240952079,IE +3240952080,3240952087,GB +3240952088,3240952095,SE +3240952096,3240952127,US +3240952128,3240953471,SE +3240953472,3240953599,DE +3240953600,3240954495,SE +3240954496,3240954623,DE +3240954624,3240955647,SE +3240955648,3240955903,GB +3240955904,3240961791,SE 3240961792,3240961799,FI -3240961800,3240968703,SE -3240968704,3240969039,GB -3240969040,3240969215,SE +3240961800,3240968191,SE +3240968192,3240968447,DE +3240968448,3240968703,SE +3240968704,3240968959,GB +3240968960,3240969215,SE 3240969216,3240969231,GB 3240969232,3240988159,SE 3240988160,3240988167,PL @@ -35446,12 +64643,13 @@ 3241040896,3241063423,AT 3241063424,3241063679,IT 3241063680,3241063935,PL -3241063936,3241064703,DE +3241063936,3241064191,DE +3241064192,3241064447,GB +3241064448,3241064703,DE 3241064704,3241065471,PL 3241065472,3241068543,AT 3241068544,3241068799,GB -3241068800,3241069055,UA -3241069056,3241069311,GB +3241068800,3241069311,UA 3241069312,3241069567,FR 3241069568,3241070079,GB 3241070080,3241070335,FR @@ -35474,7 +64672,7 @@ 3241078528,3241078783,DE 3241078784,3241082879,AT 3241082880,3241083135,FR -3241083136,3241100031,CH +3241083136,3241100799,CH 3241100800,3241101055,UA 3241101056,3241101311,DK 3241101312,3241101567,RO @@ -35503,11 +64701,10 @@ 3241118464,3241118719,FR 3241118720,3241118975,CH 3241118976,3241119231,FR -3241119232,3241119487,MD +3241119232,3241119487,DK 3241119488,3241119743,BE 3241119744,3241119999,RO 3241120000,3241120255,UA -3241120256,3241120511,CZ 3241120512,3241120767,GB 3241120768,3241121023,RU 3241121024,3241121279,CH @@ -35542,8 +64739,7 @@ 3241146880,3241148415,CH 3241148416,3241476095,FR 3241476096,3241476351,CH -3241476352,3241477887,BE -3241478144,3241481471,BE +3241476352,3241481471,BE 3241481472,3241481727,NL 3241481728,3241481983,PT 3241481984,3241482239,DE @@ -35553,9 +64749,13 @@ 3241485568,3241496575,BE 3241496576,3241496831,AT 3241496832,3241497343,BE -3241497344,3241498111,SE +3241497344,3241497599,UA +3241497600,3241497855,SE +3241497856,3241498111,DK 3241498112,3241498367,BE -3241498368,3241499135,SE +3241498368,3241498623,RO +3241498624,3241498879,NO +3241498880,3241499135,UA 3241499136,3241499903,BE 3241499904,3241500159,DE 3241500160,3241500671,GB @@ -35564,37 +64764,20 @@ 3241503232,3241503487,FR 3241503488,3241508095,BE 3241508096,3241508351,NL -3241508352,3241538815,BE -3241539072,3241541375,BE +3241508352,3241541375,BE 3241541376,3241541631,PL -3241541632,3241673215,FR -3241673472,3241674751,FR -3241675008,3241681407,FR -3241681664,3241683199,FR -3241683456,3241702399,FR -3241702912,3241704447,FR -3241704704,3241714687,FR -3241715200,3241724927,FR -3241725952,3241726975,FR -3241728000,3241741311,FR -3241741568,3241760767,FR -3241761024,3241780223,FR -3241780736,3241780991,FR -3241781248,3241782527,FR -3241783296,3241784319,FR -3241784576,3241800191,FR -3241800448,3241803775,FR -3241803776,3241803791,GB -3241803800,3241803815,GB +3241541632,3241803775,FR +3241803776,3241803815,GB 3241803816,3241803823,RU +3241803824,3241803831,EU 3241803832,3241803839,GB 3241803840,3241803903,PT +3241803904,3241804031,UA 3241804032,3241820159,BE 3241820160,3241821695,GB 3241821696,3241822207,GR 3241822208,3241824255,CZ -3241824256,3241827071,BE -3241827328,3241843455,BE +3241824256,3241843455,BE 3241843456,3241843711,CH 3241843712,3241848063,BE 3241848064,3241851391,CH @@ -35621,23 +64804,17 @@ 3241865728,3241865983,CH 3241865984,3241866239,RO 3241866240,3241866751,DE -3241866752,3241867007,GB 3241867008,3241867263,FR 3241867264,3241867519,UA 3241867520,3241867775,PL -3241867776,3241868031,CH -3241868032,3241868287,UA +3241868032,3241868287,RU 3241868288,3241868543,HR 3241868544,3241868799,DE 3241868800,3241869055,UA -3241869056,3241869311,CH +3241869056,3241869311,BY 3241869312,3241934847,PL 3241934848,3242196991,GB -3242196992,3242197975,FI -3242197976,3242197987,NO -3242197988,3242207847,FI -3242207848,3242207855,SE -3242207856,3242393599,FI +3242196992,3242393599,FI 3242393600,3242459135,NL 3242459136,3242467327,BG 3242467328,3242475519,HU @@ -35646,9 +64823,7 @@ 3242524672,3242590207,NO 3242590208,3242655743,IT 3242655744,3242721279,NO -3242721280,3242779903,CH -3242779904,3242780159,DE -3242780160,3242852351,CH +3242721280,3242852351,CH 3242852352,3242911231,BE 3242911232,3242911743,NL 3242911744,3242917887,BE @@ -35674,12 +64849,10 @@ 3243444168,3243444183,NL 3243444184,3243507711,AT 3243507712,3243507967,GB -3243508224,3243508991,CZ -3243509248,3243509759,CZ +3243507968,3243509759,CZ 3243509760,3243510015,RU 3243510016,3243510271,NL -3243510272,3243510527,CZ -3243510784,3243511807,CZ +3243510272,3243511807,CZ 3243511808,3243512063,GB 3243512064,3243512319,UA 3243512320,3243512575,FR @@ -35695,7 +64868,7 @@ 3243515136,3243515391,PL 3243515392,3243515647,DE 3243515648,3243515903,RU -3243515904,3243519999,CZ +3243515904,3243520511,CZ 3243520512,3243520767,UA 3243520768,3243521023,GB 3243521024,3243521279,AT @@ -35708,6 +64881,7 @@ 3243524864,3243525119,NL 3243525120,3243525375,CZ 3243525376,3243525631,RO +3243525632,3243525887,CZ 3243525888,3243526143,PL 3243526144,3243526399,UA 3243526400,3243526655,FR @@ -35725,16 +64899,15 @@ 3243530496,3243530751,FR 3243530752,3243531007,UA 3243531008,3243531263,DE +3243531264,3243531775,CZ 3243531776,3243532031,AT 3243532032,3243532287,DE -3243532288,3243533311,CZ -3243534336,3243535359,CZ +3243532288,3243536383,CZ 3243536384,3243536639,AT 3243536640,3243536895,CH 3243536896,3243537151,CZ 3243537152,3243537407,RO -3243537408,3243540991,CZ -3243542528,3243543551,CZ +3243537408,3243544063,CZ 3243544064,3243544319,GB 3243544320,3243544575,CH 3243544576,3243552767,CZ @@ -35749,16 +64922,14 @@ 3243555072,3243555327,RO 3243555328,3243555583,CZ 3243555584,3243555839,FR -3243556864,3243565055,CZ +3243555840,3243565055,CZ 3243565056,3243569151,GB -3243570432,3243570687,CZ +3243569152,3243570687,CZ 3243570688,3243570943,PL -3243570944,3243571199,CZ -3243571456,3243571711,CZ +3243570944,3243571711,CZ 3243571712,3243571967,GB 3243571968,3243572223,GR -3243572224,3243572479,CZ -3243572736,3243572991,CZ +3243572224,3243572991,CZ 3243572992,3243573247,RU 3243573248,3243704319,CZ 3243704320,3243769855,SK @@ -35781,8 +64952,7 @@ 3244105728,3244107775,GB 3244107776,3244108799,RO 3244108800,3244109823,GB -3244109824,3244110847,UA -3244110848,3244111871,PL +3244109824,3244111871,UA 3244111872,3244112895,KZ 3244112896,3244113919,RU 3244113920,3244114943,CH @@ -35791,13 +64961,13 @@ 3244116992,3244118015,UA 3244118016,3244120063,GB 3244120064,3244122111,PL -3244122112,3244123135,IL +3244122112,3244123135,A2 3244123136,3244124159,UA 3244124160,3244125183,PL 3244125184,3244126207,UA 3244126208,3244127231,BE 3244127232,3244128255,UA -3244128256,3244129279,DE +3244128256,3244129279,RU 3244129280,3244130303,FR 3244130304,3244131327,NO 3244131328,3244133375,FI @@ -35807,16 +64977,17 @@ 3244137472,3244138495,PL 3244138496,3244139519,UA 3244139520,3244140543,GR -3244140544,3244141567,SE +3244140544,3244141567,UA 3244141568,3244142591,NL 3244142592,3244143615,DE 3244143616,3244144639,FR -3244144640,3244147711,UA +3244144640,3244146687,UA +3244146688,3244147711,RU 3244147712,3244149759,GB 3244149760,3244150783,PL 3244150784,3244151807,CH 3244151808,3244152831,KZ -3244152832,3244153855,RU +3244152832,3244153855,UA 3244153856,3244154879,NO 3244154880,3244155903,GB 3244155904,3244156927,UA @@ -35824,14 +64995,21 @@ 3244158976,3244159999,DE 3244160000,3244161023,RU 3244161024,3244163071,NO -3244163072,3244228607,FI +3244163072,3244167039,FI +3244167040,3244167103,AX +3244167104,3244228607,FI +3244228608,3244261375,TN 3244261376,3244265823,IE 3244265824,3244265831,ES 3244265832,3244272575,IE 3244272576,3244272639,US 3244272640,3244273687,IE 3244273688,3244273695,US -3244273696,3244274279,IE +3244273696,3244273727,IE +3244273728,3244273735,GB +3244273736,3244274215,IE +3244274216,3244274223,GB +3244274224,3244274279,IE 3244274280,3244274287,US 3244274288,3244277359,IE 3244277360,3244277367,GB @@ -35843,11 +65021,590 @@ 3244408576,3244408831,GB 3244408832,3244592127,DE 3244592128,3244592639,CH -3244592640,3244818431,DE -3244818432,3245080575,FR +3244592640,3244794367,DE +3244794368,3244794879,CA +3244794880,3244813311,DE +3244813312,3244813823,CA +3244813824,3244818431,DE +3244818432,3244818687,ES +3244818688,3244818943,AT +3244818944,3244819199,PL +3244819200,3244819455,DE +3244819456,3244819711,GB +3244819712,3244819967,RO +3244819968,3244820223,NL +3244820224,3244820479,UA +3244820480,3244820735,BE +3244820736,3244820991,DE +3244820992,3244821247,SI +3244821248,3244821503,RU +3244821504,3244821759,PA +3244821760,3244822015,TR +3244822016,3244822271,RU +3244822272,3244822527,GB +3244822528,3244822783,UA +3244822784,3244823039,CZ +3244823040,3244823295,DE +3244823296,3244823551,FR +3244823552,3244823807,GE +3244823808,3244824063,RO +3244824064,3244824319,MT +3244824320,3244824575,SI +3244824576,3244824831,RU +3244824832,3244825087,GB +3244825088,3244825343,DE +3244825344,3244826111,RU +3244826112,3244826367,RO +3244826368,3244826623,CH +3244826624,3244826879,DE +3244826880,3244827135,MK +3244827136,3244827391,RU +3244827392,3244827647,GB +3244827648,3244827903,FR +3244827904,3244828159,BE +3244828160,3244828415,FI +3244828416,3244828671,FR +3244828672,3244828927,SA +3244828928,3244829183,MD +3244829184,3244829439,CH +3244829440,3244829695,DK +3244829696,3244829951,IL +3244829952,3244830463,PL +3244830464,3244830719,CH +3244830720,3244830975,FR +3244830976,3244831231,DE +3244831232,3244831487,PL +3244831488,3244831743,ES +3244831744,3244831999,PT +3244832000,3244832255,HU +3244832256,3244832511,FR +3244832512,3244832767,AT +3244832768,3244833023,FR +3244833024,3244833279,RU +3244833280,3244833535,UA +3244833536,3244833791,RU +3244833792,3244834047,FR +3244834048,3244834303,CH +3244834304,3244834559,IL +3244834560,3244834815,GB +3244834816,3244835071,RU +3244835072,3244835327,AT +3244835328,3244835583,DE +3244835584,3244835839,UA +3244835840,3244836095,RS +3244836096,3244836607,RU +3244836608,3244836863,PL +3244836864,3244837119,FR +3244837120,3244837375,RO +3244837376,3244837631,ES +3244837632,3244837887,RU +3244837888,3244838143,CY +3244838144,3244838399,IL +3244838400,3244838655,GB +3244838656,3244838911,BG +3244838912,3244839167,TR +3244839168,3244839423,GB +3244839424,3244839679,AT +3244839680,3244839935,DK +3244839936,3244840191,DE +3244840192,3244840447,UA +3244840448,3244840703,IT +3244840704,3244840959,RU +3244840960,3244841215,PL +3244841216,3244841471,GB +3244841472,3244841727,DE +3244841728,3244842495,GB +3244842496,3244842751,RU +3244842752,3244843007,DE +3244843008,3244843263,UA +3244843264,3244843519,RU +3244843520,3244843775,NL +3244843776,3244844031,PL +3244844032,3244844287,SE +3244844288,3244844543,GB +3244844544,3244844799,RU +3244844800,3244845055,GB +3244845056,3244845311,NL +3244845312,3244845567,NO +3244845568,3244845823,AD +3244845824,3244846335,GB +3244846336,3244846591,TR +3244846592,3244846847,CZ +3244846848,3244847103,NL +3244847104,3244847359,SE +3244847360,3244847615,A1 +3244847616,3244847871,DK +3244847872,3244848127,IL +3244848128,3244848383,CH +3244848384,3244848639,IL +3244848640,3244848895,HU +3244848896,3244849151,IL +3244849152,3244849407,AT +3244849408,3244849663,RO +3244849664,3244849919,SE +3244849920,3244850175,RO +3244850176,3244850431,TR +3244850432,3244850687,AT +3244850688,3244850943,GB +3244850944,3244851455,RU +3244851456,3244851711,NL +3244851712,3244851967,TR +3244851968,3244852223,GB +3244852224,3244852479,CH +3244852480,3244852735,UA +3244852736,3244852991,SI +3244852992,3244853247,DK +3244853248,3244853503,IE +3244853504,3244853759,IT +3244853760,3244854015,TR +3244854016,3244854271,NL +3244854272,3244854527,GB +3244854528,3244855295,RU +3244855296,3244855551,GB +3244855552,3244855807,UA +3244855808,3244856063,CZ +3244856064,3244856319,IL +3244856320,3244856575,CH +3244856576,3244856831,RU +3244856832,3244857087,RO +3244857088,3244857343,IT +3244857344,3244857599,GB +3244857600,3244857855,MC +3244857856,3244858111,PL +3244858112,3244858367,DE +3244858368,3244858623,PL +3244858624,3244858879,RU +3244858880,3244859135,FR +3244859136,3244859391,BE +3244859392,3244859647,SE +3244859648,3244859903,PL +3244859904,3244860159,FR +3244860160,3244860415,PL +3244860416,3244860671,GB +3244860672,3244860927,BG +3244860928,3244861183,PL +3244861184,3244861439,CH +3244861440,3244861951,GB +3244861952,3244862207,RU +3244862208,3244862463,DK +3244862464,3244862719,CZ +3244862720,3244862975,RO +3244862976,3244863231,DE +3244863232,3244863487,GB +3244863488,3244863743,KZ +3244863744,3244863999,RU +3244864000,3244864255,UA +3244864256,3244864511,GB +3244864512,3244864767,RO +3244864768,3244865023,RU +3244865024,3244865535,UA +3244865536,3244865791,PL +3244865792,3244866047,CH +3244866048,3244866559,NL +3244866560,3244866815,FI +3244866816,3244867071,UA +3244867072,3244867583,RU +3244867584,3244868095,NL +3244868096,3244868351,DE +3244868352,3244868607,RU +3244868608,3244868863,FI +3244868864,3244869119,RU +3244869120,3244869375,GB +3244869376,3244869631,FR +3244869632,3244869887,GR +3244869888,3244870143,TR +3244870144,3244870399,DK +3244870400,3244870655,UA +3244870656,3244870911,SA +3244870912,3244871167,FR +3244871168,3244871423,LT +3244871424,3244871679,RU +3244871680,3244872447,UA +3244872448,3244872703,CH +3244872704,3244872959,IR +3244872960,3244873215,UA +3244873216,3244873471,SE +3244873472,3244873727,IE +3244873728,3244873983,DE +3244873984,3244874239,FI +3244874240,3244874495,ES +3244874496,3244874751,FR +3244874752,3244875007,DE +3244875008,3244875263,PL +3244875264,3244875519,LI +3244875520,3244875775,IT +3244876800,3244877055,GB +3244877056,3244877311,JO +3244877312,3244877567,RU +3244877568,3244877823,FR +3244877824,3244878079,AT +3244878080,3244878335,GB +3244878336,3244878591,RU +3244878592,3244878847,PL +3244878848,3244879103,SI +3244879104,3244879359,RU +3244879360,3244879615,CH +3244879616,3244879871,PL +3244879872,3244880127,SI +3244880128,3244880383,RU +3244880384,3244880639,UA +3244880640,3244880895,RU +3244880896,3244881151,PL +3244881152,3244881407,RU +3244881408,3244881663,DK +3244881664,3244881919,RO +3244881920,3244882175,RU +3244882176,3244882431,UA +3244882432,3244882687,IT +3244882688,3244882943,PL +3244882944,3244883199,NL +3244883200,3244883455,UA +3244883456,3244883711,CZ +3244883712,3244883967,NL +3244883968,3244884223,MD +3244884224,3244884479,FR +3244884480,3244884735,IR +3244884736,3244884991,NL +3244884992,3244885247,GR +3244885248,3244885503,CH +3244885504,3244885759,IR +3244885760,3244886015,UA +3244886016,3244886271,LB +3244886272,3244886527,CH +3244886528,3244886783,DK +3244886784,3244887039,UA +3244887040,3244887295,NL +3244887296,3244887551,GB +3244887552,3244887807,CZ +3244887808,3244888063,BE +3244888064,3244888319,RU +3244888320,3244888575,DE +3244888576,3244888831,FR +3244888832,3244889087,DE +3244889088,3244889343,PL +3244889344,3244889599,RO +3244889600,3244889855,SI +3244889856,3244890111,HR +3244890112,3244890367,PL +3244890368,3244890623,NL +3244890624,3244890879,FR +3244890880,3244891135,RU +3244891136,3244891391,RO +3244891392,3244891647,PL +3244891648,3244891903,UA +3244891904,3244892159,RO +3244892160,3244892415,PL +3244892416,3244892671,NL +3244892672,3244892927,ES +3244892928,3244893183,PL +3244893184,3244893439,BE +3244893440,3244893695,RU +3244893696,3244893951,DE +3244893952,3244894463,RU +3244894464,3244894719,UA +3244894720,3244894975,GR +3244894976,3244895231,FR +3244895232,3244895487,DK +3244895488,3244895743,PL +3244895744,3244895999,DE +3244896000,3244896511,GB +3244896512,3244896767,LT +3244896768,3244897023,NL +3244897024,3244897279,GB +3244897280,3244897535,DE +3244897536,3244897791,RU +3244897792,3244898047,GB +3244898048,3244898303,DE +3244898304,3244898559,UA +3244898560,3244898815,GI +3244898816,3244899071,RO +3244899072,3244899327,RU +3244899328,3244899583,BG +3244899584,3244899839,GB +3244899840,3244900095,UA +3244900096,3244900351,PL +3244900352,3244900607,RO +3244900608,3244900863,RU +3244900864,3244901119,PL +3244901120,3244901375,SI +3244901376,3244901631,DE +3244901632,3244901887,GB +3244901888,3244902143,UA +3244902144,3244902655,RU +3244902656,3244902911,BE +3244902912,3244903167,IM +3244903168,3244903423,PL +3244903424,3244903679,FI +3244903680,3244903935,NO +3244903936,3244904191,TR +3244904192,3244904447,IT +3244904448,3244904703,GR +3244904704,3244904959,FR +3244904960,3244905215,BY +3244905216,3244905471,MD +3244905472,3244905727,GB +3244905728,3244905983,GR +3244905984,3244906239,AT +3244906240,3244906751,DE +3244906752,3244907007,SA +3244907008,3244907263,FR +3244907264,3244907519,RO +3244907520,3244907775,GB +3244907776,3244908287,RU +3244908288,3244908543,NL +3244908544,3244908799,RU +3244908800,3244909055,FI +3244909056,3244909311,GB +3244909312,3244909567,IL +3244909568,3244909823,RU +3244909824,3244910335,NL +3244910336,3244910591,DE +3244910592,3244910847,GB +3244910848,3244911103,DE +3244911104,3244911359,BE +3244911360,3244911615,RU +3244911616,3244911871,GB +3244911872,3244912127,GR +3244912128,3244912383,PL +3244912384,3244912639,NL +3244912640,3244912895,NO +3244912896,3244913151,SE +3244913152,3244913407,RU +3244913408,3244913663,SI +3244913664,3244913919,DK +3244913920,3244914431,RU +3244914432,3244914687,UA +3244914688,3244914943,GB +3244914944,3244915199,UA +3244915200,3244915455,PL +3244915456,3244915711,FI +3244915712,3244915967,UA +3244915968,3244916223,PL +3244916224,3244916479,RU +3244916480,3244916735,SI +3244916736,3244916991,FR +3244916992,3244917247,PL +3244917248,3244917503,SE +3244917504,3244917759,AT +3244917760,3244918015,UA +3244918016,3244918271,BE +3244918272,3244918527,SE +3244918528,3244918783,UA +3244918784,3244919039,CH +3244919040,3244919295,DE +3244919296,3244919551,SE +3244919552,3244919807,DE +3244919808,3244920063,RO +3244920064,3244920319,RU +3244920320,3244920575,SK +3244920576,3244920831,PL +3244920832,3244921087,NL +3244921088,3244921343,IE +3244921344,3244921599,LT +3244921600,3244921855,DE +3244921856,3244922111,BG +3244922112,3244922367,DK +3244922368,3244922623,NL +3244922624,3244922879,BG +3244922880,3244923135,UA +3244923136,3244923391,AT +3244923392,3244923903,LV +3244923904,3244924159,RU +3244924160,3244924927,CZ +3244924928,3244925183,FI +3244925184,3244925439,CH +3244925440,3244925695,GB +3244925696,3244925951,RS +3244925952,3244926207,UA +3244926208,3244926463,NL +3244926464,3244926719,LV +3244926720,3244926975,PL +3244926976,3244927231,DE +3244927232,3244927487,UA +3244927488,3244927743,GB +3244927744,3244927999,US +3244928000,3244928255,GB +3244928256,3244928511,US +3244928512,3244928767,UA +3244928768,3244929023,RU +3244929024,3244929535,RO +3244929536,3244929791,PL +3244929792,3244930047,RU +3244930048,3244930303,PL +3244930304,3244930559,AT +3244930560,3244930815,GB +3244930816,3244931071,NL +3244931072,3244931327,RU +3244931328,3244931583,RO +3244931584,3244931839,FR +3244931840,3244932095,NL +3244932096,3244932351,GB +3244932352,3244932607,UA +3244932608,3244932863,DK +3244932864,3244933375,PL +3244933376,3244933631,HR +3244933632,3244933887,GB +3244933888,3244934143,AT +3244934144,3244934399,BG +3244934400,3244934655,FR +3244934656,3244934911,RU +3244934912,3244935167,IL +3244935168,3244935423,NL +3244935424,3244935679,UA +3244935680,3244935935,PL +3244935936,3244936191,FR +3244936192,3244936959,AT +3244936960,3244937215,KZ +3244937216,3244937471,TR +3244937472,3244937727,GB +3244937728,3244937983,UA +3244937984,3244938239,TR +3244938240,3244938495,GB +3244938496,3244938751,RU +3244938752,3244939007,AT +3244939008,3244939263,RO +3244939264,3244939519,UA +3244939520,3244939775,FR +3244939776,3244940031,GB +3244940032,3244940287,UA +3244940288,3244940543,DK +3244940544,3244940799,PL +3244940800,3244941055,RU +3244941056,3244941311,DE +3244941312,3244941567,CY +3244941568,3244941823,FR +3244941824,3244942079,SE +3244942080,3244942335,PL +3244942336,3244942591,IT +3244942592,3244942847,PL +3244942848,3244943103,DE +3244943104,3244943359,GB +3244943360,3244943615,FR +3244943872,3244944127,TR +3244944128,3244944639,RU +3244944640,3244944895,GE +3244944896,3244945151,FR +3244945152,3244945407,RO +3244945408,3244945663,LV +3244945664,3244945919,NL +3244945920,3244946175,PL +3244946176,3244946431,TR +3244946432,3244946687,RO +3244946688,3244946943,RU +3244946944,3244947455,DE +3244947456,3244947711,PL +3244947712,3244947967,UA +3244947968,3244948223,DE +3244948224,3244948479,PL +3244948480,3244948735,FR +3244948736,3244948991,IE +3244948992,3244949247,UA +3244949248,3244951551,RU +3244951552,3244952575,FI +3244952576,3244953599,GB +3244953600,3244954623,DE +3244955648,3244957695,UA +3244957696,3244958719,EU +3244958720,3244959743,FR +3244959744,3244960767,RU +3244960768,3244961791,RO +3244961792,3244962815,KG +3244962816,3244963839,IL +3244963840,3244966911,UA +3244966912,3244968959,RU +3244968960,3244969983,PL +3244969984,3244971007,UA +3244971008,3244972031,PL +3244972032,3244975103,RU +3244975104,3244977151,PL +3244977152,3244978175,RU +3244978176,3244979199,GB +3244979200,3244980223,FR +3244980224,3244981247,DK +3244981248,3244982271,RO +3244982272,3244983295,PL +3244983296,3244984319,RU +3244984320,3244985343,UA +3244985344,3244986367,DE +3244986368,3244987391,UA +3244987392,3244988415,RU +3244988416,3244990463,PL +3244990464,3244991487,UA +3244991488,3244992511,DK +3244992512,3244994559,RU +3244994560,3244995583,ES +3244995584,3244996607,IT +3244996608,3244997631,UA +3244997632,3244998655,RO +3244998656,3244999679,PL +3244999680,3245000703,IQ +3245000704,3245001727,UA +3245001728,3245002751,IL +3245002752,3245003775,ES +3245003776,3245004799,RU +3245004800,3245005823,PL +3245005824,3245006847,UA +3245006848,3245007871,DE +3245007872,3245008895,PL +3245008896,3245011967,RU +3245011968,3245012991,PL +3245012992,3245014015,UA +3245014016,3245015039,GR +3245015040,3245016063,RU +3245016064,3245017087,RS +3245017088,3245018111,PL +3245018112,3245019135,RU +3245019136,3245020159,SC +3245020160,3245021183,RU +3245021184,3245022207,UA +3245022208,3245023231,NO +3245023232,3245024255,PL +3245024256,3245025279,BG +3245025280,3245026303,UA +3245026304,3245027327,GB +3245027328,3245028351,RU +3245029376,3245030399,FR +3245030400,3245032447,RU +3245032448,3245033471,BG +3245033472,3245034495,UA +3245034496,3245035519,SE +3245035520,3245036543,UA +3245036544,3245037567,IS +3245037568,3245038591,PL +3245038592,3245039615,RU +3245039616,3245040639,MD +3245040640,3245041663,RU +3245041664,3245044735,UA +3245044736,3245045759,GB +3245045760,3245046783,DE +3245046784,3245047807,FR +3245047808,3245050879,UA +3245050880,3245051903,RU +3245051904,3245052927,DE +3245052928,3245054975,RU +3245054976,3245055999,AT +3245056000,3245057023,CZ +3245057024,3245058047,PL +3245058048,3245061119,UA +3245061120,3245062143,RU +3245062144,3245063167,UA +3245063168,3245065215,RU +3245065216,3245066239,PL +3245066240,3245067263,UA +3245067264,3245068287,GB +3245068288,3245069311,UA +3245069312,3245070335,PL +3245070336,3245071359,RU +3245071360,3245072383,NL +3245072384,3245073407,UA +3245073408,3245076479,RU +3245076480,3245077503,FR +3245077504,3245078527,UA +3245078528,3245079551,PL +3245079552,3245080575,CZ 3245080576,3245082623,SE 3245082624,3245084927,DE -3245084928,3245085183,SE +3245084928,3245085183,BE 3245085184,3245085439,GB 3245085440,3245085695,DE 3245085696,3245086207,FR @@ -35859,10 +65616,12 @@ 3245087488,3245087743,NL 3245087744,3245087999,GH 3245088000,3245088255,LV +3245088256,3245088511,KW 3245088512,3245088767,FR 3245088768,3245089279,BG 3245089280,3245089791,PL -3245089792,3245090815,UA +3245089792,3245090303,GB +3245090304,3245090815,UA 3245090816,3245091327,AT 3245091328,3245091839,SE 3245091840,3245093887,UA @@ -35871,20 +65630,26 @@ 3245095936,3245096959,IT 3245096960,3245099007,CZ 3245099008,3245103103,GB +3245103104,3245105151,EU 3245105152,3245105663,GB 3245105664,3245106175,NL 3245106176,3245106687,AT 3245106688,3245107711,UA 3245107712,3245108735,CZ 3245108736,3245109247,FR -3245109248,3245114367,UA +3245109248,3245112319,UA +3245112320,3245113343,PL +3245113344,3245113855,UA +3245113856,3245114367,RU 3245114368,3245114879,SK 3245114880,3245115391,JO 3245115392,3245115903,CH 3245115904,3245116415,AT 3245116416,3245116927,FR +3245116928,3245117439,KW 3245117440,3245118463,LV 3245118464,3245119487,GB +3245119488,3245120511,EU 3245120512,3245121535,GB 3245121536,3245122047,GR 3245122048,3245122559,UA @@ -35906,9 +65671,7 @@ 3245127936,3245128191,LV 3245128192,3245128447,IT 3245128448,3245128703,CH -3245128704,3245128959,GB -3245128960,3245129215,DK -3245129216,3245129471,DE +3245128704,3245129471,DK 3245129472,3245129983,GB 3245129984,3245130239,DE 3245130240,3245130495,PL @@ -35933,6 +65696,7 @@ 3245135872,3245136127,FR 3245136128,3245136383,DE 3245136384,3245136639,GB +3245136640,3245136895,EU 3245136896,3245137151,PL 3245137152,3245137407,IT 3245137408,3245137663,DE @@ -35944,6 +65708,7 @@ 3245139968,3245140479,CH 3245140480,3245140991,RO 3245140992,3245141503,UA +3245141504,3245142015,IT 3245142016,3245143039,UA 3245143040,3245144063,GB 3245144064,3245145087,UA @@ -35964,8 +65729,7 @@ 3245161984,3245162495,BE 3245162496,3245163007,DE 3245163008,3245163519,KE -3245163520,3245164031,GB -3245164032,3245164543,RU +3245163520,3245164543,RU 3245164544,3245165055,BE 3245165056,3245165567,AT 3245165568,3245166079,RU @@ -36012,8 +65776,7 @@ 3245181952,3245182463,AT 3245182464,3245182975,FR 3245182976,3245183999,UA -3245184000,3245185023,CH -3245185024,3245187071,AT +3245184000,3245187071,AT 3245187072,3245190143,UA 3245190144,3245191167,ES 3245191168,3245193215,CZ @@ -36028,12 +65791,11 @@ 3245200640,3245200895,GR 3245200896,3245201151,DE 3245201152,3245201407,GB -3245201408,3245201663,CH +3245201408,3245201663,UA 3245201664,3245201919,NO 3245201920,3245202175,SA 3245202176,3245202687,GB -3245202688,3245203199,DE -3245203200,3245203455,PL +3245202688,3245203455,DE 3245203456,3245203711,FR 3245203712,3245204223,PL 3245204224,3245204479,SI @@ -36066,7 +65828,7 @@ 3245218816,3245219839,AT 3245219840,3245221887,FI 3245221888,3245223935,DE -3245223936,3245225983,NL +3245223936,3245225983,IL 3245225984,3245228031,HU 3245228032,3245229055,FI 3245229056,3245230079,DE @@ -36192,8 +65954,8 @@ 3245296640,3245297151,TJ 3245297152,3245297663,IT 3245297664,3245297919,FR -3245297920,3245298175,DK -3245298176,3245298431,IE +3245297920,3245298175,NL +3245298176,3245298431,GB 3245298432,3245298687,UA 3245298688,3245298943,GB 3245298944,3245299199,UA @@ -36231,7 +65993,7 @@ 3245319424,3245319679,SE 3245319680,3245319935,PL 3245319936,3245320191,DE -3245320192,3245320703,GB +3245320192,3245320447,GB 3245320704,3245320959,DE 3245320960,3245321215,IE 3245321216,3245321471,NL @@ -36253,7 +66015,7 @@ 3245334528,3245334783,HU 3245334784,3245335039,BE 3245335040,3245335551,GB -3245335552,3245335807,NL +3245335552,3245335807,BE 3245335808,3245336063,RO 3245336064,3245336575,GB 3245336576,3245336831,RO @@ -36267,11 +66029,17 @@ 3245340672,3245341695,UA 3245341696,3245342719,RU 3245342720,3245867007,GB -3245867008,3245878303,IE +3245867008,3245868543,IE +3245868544,3245868575,GB +3245868576,3245878303,IE 3245878304,3245878335,US 3245878336,3245888703,IE 3245888704,3245888767,US -3245888768,3245894719,IE +3245888768,3245892639,IE +3245892640,3245892647,US +3245892648,3245894391,IE +3245894392,3245894399,GB +3245894400,3245894719,IE 3245894720,3245894751,US 3245894752,3245896311,IE 3245896312,3245896319,GB @@ -36281,17 +66049,39 @@ 3245899344,3245899351,GB 3245899352,3245901831,IE 3245901832,3245901839,GB -3245901840,3245902887,IE +3245901840,3245902127,IE +3245902128,3245902135,GB +3245902136,3245902887,IE 3245902888,3245902895,GB 3245902896,3245902903,IE 3245902904,3245902911,GB -3245902912,3245903959,IE +3245902912,3245903031,IE +3245903032,3245903039,GB +3245903040,3245903959,IE 3245903960,3245903967,FR -3245903968,3245906367,IE +3245903968,3245904199,IE +3245904200,3245904207,GB +3245904208,3245906367,IE 3245906368,3245906431,GB 3245906432,3245910831,IE 3245910832,3245910847,GB -3245910848,3245931263,IE +3245910848,3245921279,IE +3245921280,3245921535,BE +3245921536,3245922959,IE +3245922960,3245922975,US +3245922976,3245924647,IE +3245924648,3245924655,GB +3245924656,3245924671,IE +3245924672,3245924679,GB +3245924680,3245924687,IE +3245924688,3245924695,GB +3245924696,3245924751,IE +3245924752,3245924767,GB +3245924768,3245927583,IE +3245927584,3245927647,GB +3245927648,3245927959,IE +3245927960,3245927967,US +3245927968,3245931263,IE 3245931264,3245931519,GB 3245931520,3245932543,IE 3245932544,3245998079,BE @@ -36304,38 +66094,47 @@ 3246141440,3246141695,UA 3246141696,3246142975,RU 3246142976,3246143231,UA -3246143232,3246143743,RU -3246143744,3246143999,UA -3246144000,3246144255,RU -3246144256,3246145023,UA -3246145024,3246147839,RU +3246143232,3246144511,RU +3246144512,3246144767,UA +3246144768,3246147839,RU 3246147840,3246148095,UA 3246148096,3246148607,RU -3246148608,3246149631,UA -3246149632,3246260223,RU +3246148608,3246148863,UA +3246148864,3246260223,RU 3246260224,3246325759,PT 3246325760,3246328831,ES +3246328832,3246329087,EU 3246329088,3246329855,ES +3246329856,3246350847,EU 3246350848,3246351103,ES +3246351104,3246351615,EU 3246351616,3246352639,ES +3246352640,3246375159,EU 3246375160,3246375423,GB +3246375424,3246378495,EU 3246378496,3246379007,ES -3246391296,3246418887,GB +3246379008,3246381055,GB +3246381056,3246391295,EU +3246391296,3246417959,GB +3246417960,3246417967,LV +3246417968,3246418887,GB 3246418888,3246418895,SE -3246418896,3246419455,GB -3246419456,3246419463,IT -3246419464,3246613503,GB +3246418896,3246475535,GB +3246475536,3246475551,A2 +3246475552,3246537887,GB +3246537888,3246537903,A2 +3246537904,3246613503,GB 3246613504,3246614527,HU 3246614528,3246784511,GB 3246784512,3246915583,CH 3246915584,3247046655,PT 3247046656,3247046911,AT -3247046912,3247048191,SI +3247046912,3247048703,SI 3247048704,3247048959,EE 3247048960,3247049215,SI 3247049216,3247054079,DE 3247054080,3247054335,CH -3247054336,3247054591,TR +3247054336,3247054591,LT 3247054592,3247054847,DE 3247054848,3247063039,SI 3247063040,3247063295,FR @@ -36402,7 +66201,7 @@ 3247080448,3247081471,UA 3247081472,3247083519,PL 3247083520,3247084543,UA -3247084544,3247086591,RU +3247084544,3247085567,RU 3247086592,3247087615,NL 3247087616,3247088639,IT 3247088640,3247089663,DE @@ -36428,104 +66227,245 @@ 3247112192,3247177727,FR 3247177728,3247243263,TR 3247243264,3247244287,DE -3247244288,3247244431,NL -3247244432,3247244439,DE -3247244440,3247247055,NL -3247247056,3247247063,DE -3247247064,3247248383,NL +3247244288,3247244351,NL +3247244352,3247244359,DE +3247244360,3247244367,NL +3247244368,3247244375,DE +3247244376,3247244927,NL +3247244928,3247244935,DE +3247244936,3247246015,NL +3247246016,3247246023,DE +3247246024,3247246039,NL +3247246040,3247246047,DE +3247246048,3247246967,NL +3247246968,3247246975,DE +3247246976,3247247111,NL +3247247112,3247247119,DE +3247247120,3247247175,NL +3247247176,3247247183,DE +3247247184,3247247543,NL +3247247544,3247247551,DE +3247247552,3247247671,NL +3247247672,3247247679,DE +3247247680,3247247879,NL +3247247880,3247247887,DE +3247247888,3247247999,NL +3247248000,3247248015,DE +3247248016,3247248095,NL +3247248096,3247248103,DE +3247248104,3247248159,NL +3247248160,3247248167,DE +3247248168,3247248175,NL +3247248176,3247248183,DE +3247248184,3247248359,NL +3247248360,3247248367,DE +3247248368,3247248383,NL 3247248384,3247250431,DE -3247250432,3247253503,NL +3247250432,3247252959,NL +3247252960,3247252967,DE +3247252968,3247252999,NL +3247253000,3247253007,DE +3247253008,3247253111,NL +3247253112,3247253119,DE +3247253120,3247253503,NL 3247253504,3247255295,DE -3247255296,3247256831,NL +3247255296,3247255655,NL +3247255656,3247255663,DE +3247255664,3247255711,NL +3247255712,3247255719,DE +3247255720,3247256623,NL +3247256624,3247256631,DE +3247256632,3247256831,NL 3247256832,3247260671,DE -3247260672,3247263903,NL -3247263904,3247263911,DE -3247263912,3247265487,NL -3247265488,3247265495,DE -3247265496,3247265679,NL -3247265680,3247265687,DE -3247265688,3247266559,NL +3247260672,3247260879,NL +3247260880,3247260887,DE +3247260888,3247260983,NL +3247260984,3247260991,DE +3247260992,3247261215,NL +3247261216,3247261223,DE +3247261224,3247261935,NL +3247261936,3247261943,DE +3247261944,3247261951,NL +3247261952,3247261959,DE +3247261960,3247262151,NL +3247262152,3247262159,DE +3247262160,3247262439,NL +3247262440,3247262447,DE +3247262448,3247262663,NL +3247262664,3247262671,DE +3247262672,3247263335,NL +3247263336,3247263343,DE +3247263344,3247263599,NL +3247263600,3247263607,DE +3247263608,3247263623,NL +3247263624,3247263631,DE +3247263632,3247263911,NL +3247263912,3247263919,DE +3247263920,3247263927,NL +3247263928,3247263935,DE +3247263936,3247265095,NL +3247265096,3247265103,DE +3247265104,3247265239,NL +3247265240,3247265247,DE +3247265248,3247265663,NL +3247265664,3247265671,DE +3247265672,3247266287,NL +3247266288,3247266295,DE +3247266296,3247266359,NL +3247266360,3247266367,DE +3247266368,3247266559,NL 3247266560,3247271679,DE -3247271680,3247271703,NL -3247271704,3247271711,DE -3247271712,3247271823,NL -3247271824,3247271831,DE -3247271832,3247272311,NL -3247272312,3247272319,DE -3247272320,3247272503,NL -3247272504,3247272511,DE -3247272512,3247272943,NL -3247272944,3247272951,DE -3247272952,3247274239,NL +3247271680,3247272375,NL +3247272376,3247272383,DE +3247272384,3247272671,NL +3247272672,3247272679,DE +3247272680,3247273063,NL +3247273064,3247273071,DE +3247273072,3247273751,NL +3247273752,3247273759,DE +3247273760,3247274239,NL 3247274240,3247274495,DE -3247274496,3247274887,NL -3247274888,3247274895,DE -3247274896,3247275015,NL -3247275016,3247275023,DE -3247275024,3247275263,NL +3247274496,3247274519,NL +3247274520,3247274535,DE +3247274536,3247274567,NL +3247274568,3247274575,DE +3247274576,3247274863,NL +3247274864,3247274871,DE +3247274872,3247275263,NL 3247275264,3247276031,DE -3247276032,3247277383,NL -3247277384,3247277391,DE -3247277392,3247278511,NL -3247278512,3247278519,DE -3247278520,3247278847,NL +3247276032,3247276615,NL +3247276616,3247276631,DE +3247276632,3247276871,NL +3247276872,3247276879,DE +3247276880,3247276927,NL +3247276928,3247276935,DE +3247276936,3247276951,NL +3247276952,3247276959,DE +3247276960,3247278103,NL +3247278104,3247278111,DE +3247278112,3247278847,NL 3247278848,3247280127,DE -3247280128,3247280951,NL -3247280952,3247280959,DE -3247280960,3247284167,NL -3247284168,3247284175,DE -3247284176,3247284207,NL -3247284208,3247284215,DE -3247284216,3247284247,NL -3247284248,3247284255,DE -3247284256,3247284559,NL -3247284560,3247284567,DE -3247284568,3247284607,NL -3247284608,3247284615,DE -3247284616,3247284943,NL -3247284944,3247284951,DE -3247284952,3247285551,NL -3247285552,3247285559,DE -3247285560,3247285663,NL -3247285664,3247285671,DE -3247285672,3247285999,NL -3247286000,3247286007,DE -3247286008,3247286495,NL -3247286496,3247286503,DE -3247286504,3247287199,NL -3247287200,3247287207,DE -3247287208,3247287495,NL -3247287496,3247287503,DE -3247287504,3247288215,NL -3247288216,3247288223,DE -3247288224,3247288319,NL +3247280128,3247280255,NL +3247280256,3247280263,DE +3247280264,3247280279,NL +3247280280,3247280287,DE +3247280288,3247280807,NL +3247280808,3247280815,DE +3247280816,3247281447,NL +3247281448,3247281455,DE +3247281456,3247281527,NL +3247281528,3247281535,DE +3247281536,3247281567,NL +3247281568,3247281575,DE +3247281576,3247281663,NL +3247281664,3247281671,DE +3247281672,3247281855,NL +3247281856,3247281863,DE +3247281864,3247282999,NL +3247283000,3247283007,DE +3247283008,3247283263,NL +3247283264,3247283271,DE +3247283272,3247283311,NL +3247283312,3247283319,DE +3247283320,3247283759,NL +3247283760,3247283767,DE +3247283768,3247283927,NL +3247283928,3247283935,DE +3247283936,3247283991,NL +3247283992,3247283999,DE +3247284000,3247284015,NL +3247284016,3247284023,DE +3247284024,3247284263,NL +3247284264,3247284271,DE +3247284272,3247284319,NL +3247284320,3247284327,DE +3247284328,3247285471,NL +3247285472,3247285479,DE +3247285480,3247286087,NL +3247286088,3247286095,DE +3247286096,3247286455,NL +3247286456,3247286463,DE +3247286464,3247286983,NL +3247286984,3247286991,DE +3247286992,3247287895,NL +3247287896,3247287903,DE +3247287904,3247288319,NL 3247288320,3247302655,DE -3247302656,3247302711,NL -3247302712,3247302719,DE -3247302720,3247303567,NL -3247303568,3247303575,DE -3247303576,3247306199,NL +3247302656,3247302791,NL +3247302792,3247302799,DE +3247302800,3247303343,NL +3247303344,3247303351,DE +3247303352,3247303615,NL +3247303616,3247303623,DE +3247303624,3247304007,NL +3247304008,3247304015,DE +3247304016,3247304351,NL +3247304352,3247304359,DE +3247304360,3247305583,NL +3247305584,3247305591,DE +3247305592,3247305623,NL +3247305624,3247305631,DE +3247305632,3247305959,NL +3247305960,3247305975,DE +3247305976,3247305999,NL +3247306000,3247306007,DE +3247306008,3247306199,NL 3247306200,3247306207,DE -3247306208,3247306583,NL -3247306584,3247306591,DE -3247306592,3247306775,NL -3247306776,3247306783,DE -3247306784,3247306991,NL -3247306992,3247307007,DE -3247307008,3247307543,NL +3247306208,3247306295,NL +3247306296,3247306303,DE +3247306304,3247306311,NL +3247306312,3247306327,DE +3247306328,3247306423,NL +3247306424,3247306431,DE +3247306432,3247306447,NL +3247306448,3247306455,DE +3247306456,3247306583,NL +3247306584,3247306599,DE +3247306600,3247306671,NL +3247306672,3247306679,DE +3247306680,3247306783,NL +3247306784,3247306791,DE +3247306792,3247306799,NL +3247306800,3247306807,DE +3247306808,3247306895,NL +3247306896,3247306903,DE +3247306904,3247306919,NL +3247306920,3247306943,DE +3247306944,3247306959,NL +3247306960,3247306967,DE +3247306968,3247306999,NL +3247307000,3247307007,DE +3247307008,3247307071,NL +3247307072,3247307079,DE +3247307080,3247307303,NL +3247307304,3247307311,DE +3247307312,3247307375,NL +3247307376,3247307383,DE +3247307384,3247307415,NL +3247307416,3247307423,DE +3247307424,3247307543,NL 3247307544,3247307551,DE -3247307552,3247307751,NL -3247307752,3247307759,DE -3247307760,3247308079,NL -3247308080,3247308087,DE -3247308088,3247308727,NL +3247307552,3247307575,NL +3247307576,3247307583,DE +3247307584,3247307591,NL +3247307592,3247307599,DE +3247307600,3247307871,NL +3247307872,3247307879,DE +3247307880,3247307991,NL +3247307992,3247307999,DE +3247308000,3247308111,NL +3247308112,3247308119,DE +3247308120,3247308415,NL +3247308416,3247308423,DE +3247308424,3247308479,NL +3247308480,3247308487,DE +3247308488,3247308727,NL 3247308728,3247308735,DE 3247308736,3247308799,NL 3247308800,3247309055,BG -3247309056,3247313663,FI -3247313920,3247316479,FI +3247309056,3247316479,FI 3247316480,3247316735,NO -3247316992,3247322367,FI +3247316736,3247322367,FI 3247322368,3247322623,DE 3247322624,3247323135,FI 3247323136,3247323647,RU @@ -36540,7 +66480,9 @@ 3247335168,3247335423,DK 3247335424,3247336447,FI 3247336448,3247337215,NO +3247337216,3247337471,CH 3247337472,3247337983,PL +3247337984,3247338239,FI 3247338240,3247338495,PL 3247338496,3247338751,SI 3247338752,3247339519,GB @@ -36548,7 +66490,7 @@ 3247340544,3247340799,UA 3247340800,3247341055,CH 3247341056,3247341311,FI -3247341312,3247341567,GB +3247341312,3247341567,DE 3247341568,3247345919,FI 3247345920,3247346175,HU 3247346176,3247346943,FI @@ -36559,7 +66501,9 @@ 3247347968,3247348223,HU 3247348224,3247348991,FI 3247348992,3247349247,DE -3247349248,3247362047,FI +3247349248,3247349759,FI +3247349760,3247353855,SE +3247353856,3247362047,FI 3247362048,3247362303,RO 3247362304,3247362559,HU 3247362560,3247362815,PL @@ -36577,14 +66521,13 @@ 3247365888,3247366143,DE 3247366144,3247371007,FI 3247371008,3247371263,PL -3247371264,3247371519,LT +3247371264,3247371519,SE 3247371520,3247371775,GB 3247371776,3247374335,FI 3247374336,3247374591,RU 3247374592,3247394047,FI 3247394048,3247394303,PL -3247394304,3247397887,FI -3247398144,3247399423,FI +3247394304,3247399423,FI 3247399424,3247399679,RU 3247399680,3247404799,FI 3247404800,3247405055,RU @@ -36598,8 +66541,7 @@ 3247438336,3247439871,FI 3247439872,3247702015,ES 3247702016,3247702271,RO -3247702272,3247703551,ES -3247704064,3247704831,ES +3247702272,3247704831,ES 3247704832,3247705087,GB 3247705088,3247705855,ES 3247705856,3247706111,RU @@ -36636,6 +66578,7 @@ 3247833088,3247865855,RU 3247865856,3247871999,GB 3247872000,3247875327,NL +3247875328,3247875583,TR 3247875584,3247876095,DE 3247876096,3247876351,PL 3247876352,3247876607,FR @@ -36651,7 +66594,6 @@ 3247901696,3247902719,UA 3247902720,3247903743,GB 3247903744,3247904767,BG -3247904768,3247905791,PL 3247905792,3247906815,RO 3247906816,3247907839,DE 3247907840,3247908863,PL @@ -36680,13 +66622,13 @@ 3248095232,3248095823,AT 3248095824,3248095831,HU 3248095832,3248160767,AT -3248160768,3248226303,DE +3248160768,3248221215,DE +3248221216,3248221223,PL +3248221224,3248226303,DE 3248226304,3248235007,NO 3248235008,3248235263,PK 3248235264,3248357375,NO -3248357376,3248358367,DE -3248358368,3248358383,LU -3248358384,3248370511,DE +3248357376,3248370511,DE 3248370512,3248370519,AT 3248370520,3248371743,DE 3248371744,3248371751,PL @@ -36697,13 +66639,34 @@ 3248372264,3248372271,NL 3248372272,3248372319,DE 3248372320,3248372327,BE -3248372328,3248417311,DE -3248417312,3248417343,ES -3248417344,3248488447,DE -3248488448,3248525311,NO +3248372328,3248488447,DE +3248488448,3248488703,FR +3248488704,3248491519,NO +3248491520,3248492031,RU +3248492032,3248496895,NO +3248496896,3248497151,IL +3248497152,3248498431,NO +3248498432,3248498687,DE +3248498688,3248513279,NO +3248513280,3248513535,UA +3248513536,3248514047,AT +3248514048,3248521983,NO +3248521984,3248522239,RU +3248522240,3248525311,NO 3248525312,3248525567,DE 3248525568,3248525823,DK -3248525824,3248619519,NO +3248525824,3248545791,NO +3248545792,3248546815,UA +3248546816,3248547839,RU +3248547840,3248553727,NO +3248553728,3248553983,RU +3248553984,3248554239,RO +3248554240,3248557055,NO +3248557056,3248558079,UA +3248558080,3248575487,NO +3248575488,3248576511,CZ +3248576512,3248619263,NO +3248619264,3248619519,UA 3248619520,3248638463,DK 3248638464,3248638719,GB 3248638720,3248750591,DK @@ -36726,7 +66689,7 @@ 3248785408,3248785663,RO 3248785664,3248786943,SI 3248786944,3248787199,PL -3248787200,3248787455,DE +3248787200,3248787455,GB 3248787456,3248787711,NL 3248787712,3248787967,CH 3248787968,3248788223,RU @@ -36742,11 +66705,28 @@ 3248790784,3248791039,PL 3248791040,3248791295,BE 3248791296,3248791551,DE -3248791552,3248792319,GB +3248791552,3248792479,GB +3248792480,3248796607,EU 3248796608,3248796863,GB -3248798648,3248798651,GB +3248796864,3248798975,EU 3248798976,3248799231,GB -3248799736,3248807935,GB +3248799232,3248799735,EU +3248799736,3248799743,GB +3248799744,3248800255,NL +3248800256,3248800767,RU +3248800768,3248801279,FR +3248801280,3248801791,RO +3248801792,3248802303,RU +3248802304,3248802815,FR +3248802816,3248803327,RU +3248803328,3248804351,GB +3248804352,3248804863,LV +3248804864,3248805375,DE +3248805376,3248805887,RU +3248805888,3248806399,NL +3248806400,3248806911,CZ +3248806912,3248807423,US +3248807424,3248807935,BG 3248807936,3248808447,AT 3248808448,3248808959,GR 3248808960,3248810079,FR @@ -36762,17 +66742,124 @@ 3248813568,3248814079,DE 3248814080,3248815103,DK 3248815104,3248815615,GB -3248815616,3248816127,NL +3248815616,3248816127,PL 3248816128,3248881663,CZ 3248881664,3249012735,FI 3249012736,3249012991,DE 3249012992,3249014271,LU +3249014272,3249014783,EU 3249014784,3249025535,LU 3249025536,3249025791,FR 3249025792,3249026559,LU +3249026560,3249026815,EU 3249026816,3249045503,LU 3249045504,3249078271,DE -3249078272,3249143807,GB +3249078272,3249078783,RU +3249078784,3249079295,CH +3249079296,3249079807,RU +3249079808,3249080831,RO +3249080832,3249081343,DE +3249081344,3249081855,LV +3249081856,3249082367,GB +3249082368,3249082879,HU +3249082880,3249083391,PL +3249083392,3249083903,RO +3249083904,3249085951,RU +3249085952,3249086463,GI +3249086464,3249088511,RU +3249088512,3249089023,NL +3249089024,3249089535,NO +3249089536,3249090047,RU +3249090048,3249090559,FR +3249090560,3249091071,SI +3249091072,3249091583,RO +3249091584,3249092095,RU +3249092096,3249092607,DE +3249092608,3249093119,IT +3249093120,3249093631,GB +3249093632,3249094655,RU +3249094656,3249095679,FR +3249095680,3249096191,NL +3249096192,3249096703,IL +3249096704,3249097215,DE +3249097216,3249097727,DK +3249097728,3249098239,DE +3249098240,3249098751,PL +3249098752,3249099263,UA +3249099264,3249099775,CH +3249099776,3249100287,FI +3249100288,3249100799,UA +3249100800,3249101311,IL +3249101312,3249101823,GB +3249101824,3249102335,RU +3249102336,3249102847,DE +3249102848,3249103359,RU +3249103360,3249103871,DE +3249103872,3249104383,FI +3249104384,3249104895,RU +3249104896,3249105407,IL +3249105408,3249105919,RU +3249105920,3249106431,NL +3249106432,3249106943,RU +3249106944,3249108479,PL +3249108480,3249108991,RU +3249108992,3249109503,GB +3249109504,3249110015,RU +3249110016,3249111039,UA +3249111040,3249111551,RU +3249111552,3249112063,KW +3249112064,3249113087,UA +3249113088,3249113599,RO +3249113600,3249114111,NL +3249114112,3249114623,GB +3249114624,3249115647,RO +3249115648,3249116159,UA +3249116160,3249116671,PL +3249116672,3249117183,IT +3249117184,3249117695,CH +3249117696,3249118207,DK +3249118208,3249118719,RO +3249118720,3249119231,LU +3249119232,3249119743,RU +3249119744,3249120255,IT +3249120256,3249120767,SE +3249120768,3249121279,LV +3249121280,3249121791,DE +3249121792,3249122303,RO +3249122304,3249124351,RU +3249124352,3249124863,DE +3249124864,3249125375,CZ +3249125376,3249125887,DE +3249125888,3249126399,CH +3249126400,3249126911,UA +3249126912,3249127423,SA +3249127424,3249127935,GB +3249127936,3249128447,LV +3249128448,3249128959,DE +3249128960,3249129471,BG +3249129472,3249130495,RU +3249130496,3249131007,DE +3249131008,3249131519,GB +3249131520,3249132031,DK +3249132032,3249132543,RU +3249132544,3249133055,DE +3249133056,3249133567,UA +3249133568,3249134079,GB +3249134080,3249134591,UA +3249134592,3249135615,RU +3249135616,3249136127,GB +3249136128,3249137151,RU +3249137152,3249137663,FR +3249137664,3249138175,PL +3249138176,3249138687,JM +3249139200,3249139711,RU +3249139712,3249140223,UA +3249140224,3249140735,IT +3249140736,3249141247,UA +3249141248,3249141759,IL +3249141760,3249142783,RU +3249142784,3249143295,UA +3249143296,3249143807,GB 3249143808,3249274879,AT 3249274880,3249277759,NL 3249277760,3249277775,BG @@ -36794,10 +66881,13 @@ 3249538048,3249551359,NL 3249551360,3249552639,GB 3249552640,3249574143,NL -3249574912,3249590527,NL -3249590784,3249600255,NL -3249601792,3249668095,NL -3249668096,3249676799,IE +3249574144,3249574399,RU +3249574400,3249574655,SE +3249574656,3249574911,UA +3249574912,3249668095,NL +3249668096,3249676287,IE +3249676288,3249676543,GB +3249676544,3249676799,IE 3249676800,3249677055,UA 3249677056,3249677311,SE 3249677312,3249679103,IE @@ -36806,11 +66896,11 @@ 3249683456,3249684479,SE 3249684480,3249698047,IE 3249698048,3249698303,PL -3249698304,3249698815,HU +3249698304,3249698559,RU +3249698560,3249698815,HU 3249698816,3249699839,GB 3249699840,3249700863,UA -3249700864,3249701631,SE -3249701632,3249701887,GR +3249700864,3249701887,SE 3249701888,3249702143,PL 3249702144,3249702399,FI 3249702400,3249702655,FR @@ -36853,7 +66943,7 @@ 3249716736,3249717247,UA 3249717248,3249718271,LV 3249718272,3249719295,DE -3249719296,3249720319,IR +3249719296,3249720319,GB 3249720320,3249721343,IT 3249721344,3249721599,AT 3249721600,3249721855,BE @@ -36881,8 +66971,28 @@ 3249731584,3249732607,UA 3249732608,3249733631,IT 3249733632,3249799167,CZ -3249799168,3250061311,SE -3250061312,3250192383,FI +3249799168,3249932031,SE +3249932032,3249934335,GB +3249934336,3250061311,SE +3250061312,3250061635,FI +3250061636,3250061639,AX +3250061640,3250083643,FI +3250083644,3250083647,AX +3250083648,3250124711,FI +3250124712,3250124715,AX +3250124716,3250144011,FI +3250144012,3250144015,AX +3250144016,3250144071,FI +3250144072,3250144075,AX +3250144076,3250183199,FI +3250183200,3250183215,SE +3250183216,3250187455,FI +3250187456,3250187487,AX +3250187488,3250187583,FI +3250187584,3250187647,SE +3250187648,3250191783,FI +3250191784,3250191787,AX +3250191788,3250192383,FI 3250192384,3250192639,AT 3250192640,3250192895,RU 3250192896,3250193151,IL @@ -36901,14 +67011,16 @@ 3250200832,3250201087,RO 3250201088,3250201343,RU 3250201344,3250201599,DK -3250202624,3250233855,AT +3250201600,3250233855,AT +3250233856,3250234111,GB +3250234112,3250234367,GR 3250234368,3250245631,AT 3250245632,3250245887,TR 3250245888,3250246143,AT 3250246144,3250246399,GB 3250246400,3250257663,AT 3250257664,3250257919,PL -3250257920,3250258175,DE +3250257920,3250258175,EU 3250258176,3250323199,AT 3250323200,3250323455,RU 3250323456,3250323711,PL @@ -36926,8 +67038,12 @@ 3250356224,3250357247,LB 3250357248,3250357823,GB 3250357824,3250357855,FR -3250357888,3250357919,GB +3250357856,3250357871,EE +3250357872,3250357879,CH +3250357880,3250357887,SE +3250357888,3250357895,DK 3250357920,3250357927,PL +3250357928,3250357959,CY 3250357960,3250358015,GB 3250358016,3250358527,LB 3250358528,3250358783,HU @@ -36935,6 +67051,7 @@ 3250359296,3250359807,HU 3250359808,3250362879,KW 3250362880,3250363391,DE +3250363392,3250363903,EU 3250363904,3250364415,DE 3250364416,3250372607,KW 3250372608,3250373375,HU @@ -37024,6 +67141,7 @@ 3250589440,3250589471,IE 3250589472,3250589503,NL 3250589504,3250589567,HR +3250589568,3250589631,UA 3250589632,3250589695,NO 3250589696,3250593791,CH 3250593792,3250594815,GB @@ -37045,6 +67163,7 @@ 3250634752,3250642943,GB 3250642944,3250651135,CH 3250651136,3250659327,IT +3250659328,3250667519,EU 3250667520,3250675711,PL 3250675712,3250683903,GB 3250683904,3250692095,CH @@ -37061,7 +67180,7 @@ 3250697728,3250697983,BG 3250697984,3250698239,IT 3250698240,3250698751,GR -3250699264,3250699775,GB +3250698752,3250699775,GB 3250699776,3250700287,DE 3250700288,3250708479,UA 3250708480,3250716671,KZ @@ -37072,11 +67191,13 @@ 3250722048,3250722303,RO 3250722304,3250724863,GB 3250724864,3250733055,MA +3250733056,3250741247,DZ +3250741248,3250749439,EU 3250749440,3250749695,GH 3250749696,3250749951,IT 3250749952,3250750463,RO 3250750464,3250751487,FR -3250751744,3250751999,DE +3250751488,3250751999,DE 3250752000,3250752511,CH 3250752512,3250753023,BG 3250753024,3250754047,DE @@ -37093,10 +67214,13 @@ 3250756864,3250757119,DE 3250757120,3250757375,BE 3250757376,3250757631,HU +3250757632,3250765823,GH 3250765824,3250782207,SE 3250782208,3250847743,GB 3250847744,3250978815,DE -3250978816,3251044351,HR +3250978816,3250989311,HR +3250989312,3250989343,BA +3250989344,3251044351,HR 3251044352,3251109887,FI 3251109888,3251110143,SI 3251110144,3251110655,BG @@ -37123,7 +67247,7 @@ 3251116544,3251116799,DK 3251116800,3251117055,GB 3251117056,3251117311,BG -3251117312,3251117567,NO +3251117312,3251117567,FR 3251117568,3251117823,IL 3251117824,3251118079,SE 3251118080,3251118591,UA @@ -37134,7 +67258,7 @@ 3251121152,3251121663,DK 3251121664,3251122175,PL 3251122176,3251122687,CH -3251122688,3251123199,RO +3251122688,3251123199,PL 3251123200,3251123711,FR 3251123712,3251124223,RO 3251124224,3251124735,NL @@ -37165,8 +67289,9 @@ 3251137536,3251138047,PL 3251138048,3251138559,FR 3251138560,3251139071,AT +3251139072,3251139583,GB 3251139584,3251140095,FR -3251140096,3251141119,PL +3251140096,3251141631,PL 3251141632,3251142143,LT 3251142144,3251142655,RO 3251142656,3251142911,DE @@ -37190,7 +67315,7 @@ 3251147520,3251147775,NL 3251147776,3251148031,SE 3251148032,3251148287,RU -3251148288,3251148543,DE +3251148288,3251148543,EU 3251148544,3251148799,UA 3251148800,3251149055,HU 3251149056,3251149311,NL @@ -37200,7 +67325,8 @@ 3251150080,3251150335,CH 3251150336,3251150591,GB 3251150592,3251150847,CH -3251150848,3251151359,UA +3251150848,3251151103,DE +3251151104,3251151359,UA 3251151360,3251151615,DE 3251151616,3251151871,PL 3251151872,3251152127,NL @@ -37251,6 +67377,7 @@ 3251164672,3251164927,NL 3251164928,3251165439,PL 3251165440,3251165695,CH +3251165696,3251165951,DE 3251165952,3251166207,UA 3251166208,3251166463,CH 3251166464,3251166719,RU @@ -37258,8 +67385,7 @@ 3251166976,3251167231,CH 3251167232,3251167487,LV 3251167488,3251167743,DK -3251167744,3251167999,FR -3251168000,3251168255,PL +3251167744,3251168255,PL 3251168256,3251168511,AT 3251168512,3251168767,UA 3251168768,3251169023,DE @@ -37268,7 +67394,8 @@ 3251170048,3251170303,NO 3251170304,3251170559,CH 3251170560,3251170815,DE -3251170816,3251171327,RU +3251170816,3251171071,RU +3251171072,3251171327,UA 3251171328,3251171839,DE 3251171840,3251172095,RO 3251172096,3251172351,ES @@ -37293,7 +67420,7 @@ 3251180544,3251181055,RO 3251181056,3251181567,GR 3251181568,3251182079,DE -3251182080,3251182591,UA +3251182080,3251182591,FR 3251182592,3251183103,IT 3251183104,3251183615,RU 3251183616,3251183871,NO @@ -37351,28 +67478,28 @@ 3251209216,3251210239,GB 3251210240,3251211263,PL 3251211264,3251212287,UA -3251212288,3251212415,DE -3251212416,3251212543,FI +3251212416,3251212671,FI 3251212672,3251212799,SE 3251212800,3251212927,FR +3251212928,3251213055,RO 3251213056,3251213119,SE 3251213120,3251213151,NL -3251213152,3251213183,DE +3251213152,3251213183,FR 3251213184,3251213215,UA 3251213216,3251213247,CH 3251213248,3251213311,GB 3251213312,3251213439,DE 3251213440,3251213503,GB -3251213504,3251213567,DE +3251213504,3251213567,NL 3251213568,3251213631,FR -3251213632,3251213695,DE +3251213632,3251213695,PL 3251213696,3251213759,LV 3251213760,3251213823,TR 3251213824,3251213887,GB 3251213888,3251214015,FI 3251214016,3251214079,UA 3251214080,3251214143,FR -3251214144,3251214207,MC +3251214144,3251214207,AF 3251214208,3251214271,RU 3251214272,3251214335,DE 3251214336,3251214463,RU @@ -37423,6 +67550,7 @@ 3251237888,3251238911,DK 3251238912,3251239935,FR 3251239936,3251240959,US +3251240960,3251241215,DE 3251241216,3251243007,GB 3251243008,3251245055,BE 3251245056,3251245311,DE @@ -37430,6 +67558,7 @@ 3251245568,3251245823,TR 3251245824,3251246079,UA 3251246080,3251246335,DE +3251246336,3251246591,UA 3251246592,3251246847,RO 3251246848,3251247103,NL 3251247104,3251247359,FR @@ -37439,7 +67568,7 @@ 3251248384,3251248639,SE 3251248640,3251248895,DE 3251248896,3251249151,GB -3251249152,3251251199,US +3251249152,3251251199,NL 3251251200,3251251455,PT 3251251456,3251251711,GB 3251251712,3251251967,CH @@ -37447,27 +67576,27 @@ 3251252224,3251252479,AT 3251252480,3251252735,NL 3251252736,3251256831,CH -3251256832,3251257343,HU +3251256832,3251257343,GB 3251257344,3251259903,BE 3251259904,3251260671,FR -3251260672,3251261183,BE -3251261184,3251261439,PT -3251261952,3251263999,HU +3251260672,3251260927,BE +3251260928,3251261439,FR +3251261440,3251264255,CH 3251264256,3251264511,BG 3251264512,3251264767,IT 3251264768,3251265023,GB 3251265024,3251265279,ES 3251265280,3251265535,DE 3251265536,3251267839,NL -3251267840,3251268095,RU -3251268096,3251268351,GB -3251268352,3251269119,NL -3251269120,3251269375,UA +3251267840,3251268351,GB +3251268352,3251268607,NL +3251268864,3251269119,NL +3251269120,3251269375,DK 3251269376,3251269631,FR 3251269632,3251269887,NL 3251269888,3251270143,GB 3251270144,3251270399,PL -3251270400,3251270655,NL +3251270400,3251270655,NO 3251270656,3251270911,DE 3251270912,3251271167,PL 3251271168,3251271423,UA @@ -37484,36 +67613,34 @@ 3251306240,3251306495,CH 3251306496,3251306751,AT 3251306752,3251307007,MK -3251307008,3251307519,CS +3251307008,3251307519,RS 3251307520,3251307775,MK 3251307776,3251308031,GB -3251308032,3251308543,CS -3251308544,3251310591,US +3251308032,3251308543,RS +3251308544,3251310591,EU 3251310592,3251311103,SI -3251311104,3251311615,CS -3251312128,3251312383,CS +3251311104,3251311615,RS +3251311616,3251312127,EU +3251312128,3251312383,RS 3251312384,3251312639,CH -3251312640,3251314175,CS +3251312640,3251313151,RS +3251313152,3251313663,EU +3251313664,3251314175,RS 3251314176,3251314687,CH 3251314688,3251315711,FR 3251315712,3251317759,RU 3251317760,3251318783,PL 3251318784,3251319807,UA 3251319808,3251320831,HU +3251320832,3251321855,PL 3251321856,3251322879,RU -3251322880,3251329535,GB -3251329536,3251329567,FR -3251329568,3251329727,GB +3251322880,3251329727,GB 3251329728,3251329791,FR -3251329792,3251330047,GB -3251330048,3251330079,IT -3251330080,3251330239,GB -3251330240,3251330303,IT -3251330304,3251331071,GB +3251329792,3251331071,GB 3251331072,3251331583,FR 3251331584,3251332095,PL 3251332096,3251333119,RU -3251333120,3251333631,IT +3251333120,3251333631,CH 3251333632,3251334143,PT 3251334144,3251334655,FR 3251334656,3251335167,UA @@ -37529,7 +67656,6 @@ 3251355648,3251356159,GB 3251356160,3251356671,AT 3251356672,3251357183,EE -3251357184,3251357695,IL 3251357696,3251358207,ES 3251358208,3251358719,RU 3251358720,3251359231,RO @@ -37543,6 +67669,7 @@ 3251363328,3251363839,PL 3251363840,3251364095,MK 3251364096,3251364607,NL +3251364608,3251364863,RO 3251364864,3251366911,IT 3251366912,3251367423,UA 3251367424,3251367935,DE @@ -37590,13 +67717,13 @@ 3251928000,3252015687,NO 3252015688,3252015695,SE 3252015696,3252289535,NO -3252289792,3252291327,GR +3252289536,3252291327,GR 3252291328,3252291583,SK 3252291584,3252293631,FR 3252293632,3252297983,DE -3252297984,3252310527,GR -3252311040,3252313599,GR -3252313600,3252314111,SK +3252297984,3252313599,GR +3252313600,3252313855,SI +3252313856,3252314111,DE 3252314112,3252314623,GR 3252314624,3252314879,HU 3252314880,3252315135,GB @@ -37607,8 +67734,7 @@ 3252318720,3252318975,GP 3252318976,3252319231,PL 3252319232,3252319743,AT -3252320000,3252320255,GR -3252320512,3252321791,GR +3252319744,3252321791,GR 3252321792,3252322303,DE 3252322304,3252323327,NO 3252323328,3252324351,PL @@ -37616,12 +67742,19 @@ 3252326400,3252327423,UA 3252327424,3252329471,PL 3252329472,3252330495,UA -3252330496,3252338687,GB +3252330496,3252334591,GB +3252334592,3252336639,RU +3252336640,3252337663,UA +3252337664,3252338687,RU 3252338688,3252340735,BE 3252340736,3252340991,TR -3252341504,3252341759,GR +3252340992,3252342015,GR 3252342016,3252342079,GB 3252342080,3252342143,IR +3252342144,3252342207,LU +3252342208,3252342239,GB +3252342240,3252342271,CH +3252342528,3252342543,NO 3252342784,3252346367,DE 3252346368,3252346623,GB 3252346624,3252355071,GR @@ -37651,7 +67784,7 @@ 3252383232,3252383743,GB 3252383744,3252383999,SE 3252384000,3252384511,PL -3252384512,3252384767,CH +3252384512,3252384767,GB 3252384768,3252385023,NL 3252385024,3252385279,RO 3252385280,3252385535,GB @@ -37665,347 +67798,304 @@ 3252387328,3252387583,PL 3252387584,3252387839,RU 3252387840,3252404223,LT -3252404224,3252406271,NO -3252406272,3252407295,LT +3252404224,3252406527,NO +3252406528,3252407295,LT 3252407296,3252407583,NO 3252407584,3252407599,NG 3252407600,3252407615,BJ -3252407616,3252407679,NO -3252407680,3252407743,NG -3252407744,3252407807,NO +3252407616,3252407711,NO +3252407712,3252407743,NG +3252407744,3252407751,NO +3252407752,3252407759,AO +3252407760,3252407767,NE +3252407768,3252407775,CD +3252407776,3252407791,GH +3252407792,3252407807,NO 3252407808,3252407999,GN 3252408000,3252408159,NO 3252408160,3252408191,GQ -3252408192,3252408287,SL -3252408288,3252408319,NO +3252408192,3252408319,NO 3252408320,3252408335,TR -3252408336,3252408351,LT -3252408352,3252408359,IQ -3252408360,3252408543,LT +3252408336,3252408343,GN +3252408344,3252408351,LT +3252408352,3252408367,GN +3252408368,3252408375,NG +3252408376,3252408383,LT +3252408384,3252408391,BI +3252408392,3252408415,LT +3252408416,3252408479,NO +3252408480,3252408495,FI +3252408496,3252408511,LT +3252408512,3252408519,AF +3252408520,3252408543,LT 3252408544,3252408551,AF -3252408552,3252408559,LT -3252408560,3252408575,IQ -3252408576,3252408607,SO -3252408608,3252408639,LT +3252408552,3252408639,LT 3252408640,3252408671,CF -3252408672,3252408687,LT -3252408688,3252408711,SO -3252408712,3252408719,LT -3252408720,3252408735,SO -3252408736,3252408751,NG -3252408752,3252408767,LT +3252408672,3252408703,SO +3252408704,3252408735,NG +3252408736,3252408767,LT 3252408768,3252408783,NG -3252408784,3252408831,LT +3252408784,3252408799,LT +3252408800,3252408831,SO 3252408832,3252408839,NG 3252408840,3252408847,KE 3252408848,3252408855,LR 3252408856,3252408863,CM 3252408864,3252408871,LR 3252408872,3252408879,CI -3252408880,3252408975,LT -3252408976,3252408983,IQ -3252408984,3252408991,LT -3252408992,3252409007,IQ -3252409008,3252409087,LT -3252409088,3252409095,RW -3252409096,3252409119,LT -3252409120,3252409127,KN -3252409128,3252409135,LT -3252409136,3252409143,EG -3252409144,3252409167,LT -3252409168,3252409175,GN +3252408880,3252409103,LT +3252409104,3252409111,SD +3252409112,3252409119,LT +3252409120,3252409127,NG +3252409128,3252409167,LT +3252409168,3252409175,UG 3252409176,3252409183,LT -3252409184,3252409191,IQ -3252409192,3252409231,LT -3252409232,3252409263,IQ -3252409264,3252409279,LT -3252409280,3252409311,SO -3252409312,3252409319,LT -3252409320,3252409327,SO -3252409328,3252409343,LT +3252409184,3252409191,UG +3252409192,3252409199,ZW +3252409200,3252409207,TZ +3252409208,3252409263,LT +3252409264,3252409343,SO 3252409344,3252409375,TD 3252409376,3252409407,LT 3252409408,3252409471,BI -3252409472,3252409487,GN -3252409488,3252409535,LT +3252409472,3252409519,LT +3252409520,3252409527,NG +3252409528,3252409535,LT 3252409536,3252409543,BI -3252409544,3252409551,LT -3252409552,3252409567,CG -3252409568,3252409599,LT -3252409600,3252409663,NG -3252409664,3252409855,LT -3252409856,3252410383,BW -3252410384,3252410623,LT -3252410624,3252410783,GH -3252410784,3252410879,LT -3252410880,3252411007,IQ -3252411008,3252411199,LT -3252411200,3252411263,CD -3252411264,3252411327,LT -3252411328,3252411391,UG -3252411392,3252411647,ML -3252411648,3252411663,BI -3252411664,3252411679,SO -3252411680,3252411711,UG +3252409544,3252409599,LT +3252409600,3252409615,MA +3252409616,3252409631,LT +3252409632,3252409647,AO +3252409648,3252409855,LT +3252409856,3252410111,BW +3252410112,3252410367,LT +3252410368,3252410391,BW +3252410392,3252410431,LT +3252410432,3252410463,BI +3252410464,3252410623,LT +3252410624,3252410751,ZW +3252410752,3252411135,LT +3252411136,3252411167,IQ +3252411168,3252411375,LT +3252411376,3252411391,CD +3252411392,3252411647,LT +3252411648,3252411679,BI +3252411680,3252411695,LT +3252411696,3252411711,UG 3252411712,3252411743,NG 3252411744,3252411775,LT 3252411776,3252411783,GH 3252411784,3252411791,LT -3252411792,3252411807,NG -3252411808,3252411839,LT -3252411840,3252411855,NG -3252411856,3252411887,LT -3252411888,3252411903,CD -3252411904,3252412415,NG -3252412416,3252412479,IQ -3252412480,3252412927,LT -3252412928,3252413439,NG -3252413440,3252414223,ZM -3252414224,3252414239,LT -3252414240,3252414271,ZM -3252414272,3252414335,LT -3252414336,3252414367,ZM -3252414368,3252414399,LT -3252414400,3252414415,ZM -3252414416,3252414463,LT +3252411792,3252411823,NG +3252411824,3252411839,LT +3252411840,3252411855,MR +3252411856,3252411879,LT +3252411880,3252411903,CD +3252411904,3252414463,LT 3252414464,3252414479,GH 3252414480,3252414495,ML 3252414496,3252414511,LT 3252414512,3252414527,MR -3252414528,3252414607,GH -3252414608,3252414639,TZ -3252414640,3252414655,GH +3252414528,3252414591,LT +3252414592,3252414599,GH +3252414600,3252414623,LT +3252414624,3252414639,TZ +3252414640,3252414647,GH +3252414648,3252414655,NE 3252414656,3252414719,ER -3252414720,3252414975,IQ -3252414976,3252415487,LT -3252415488,3252415503,SD -3252415504,3252415519,LT -3252415520,3252415535,NG -3252415536,3252415551,LT +3252414720,3252414975,LT +3252414976,3252415007,IQ +3252415008,3252415015,LT +3252415016,3252415119,IQ +3252415120,3252415551,LT 3252415552,3252415567,NG -3252415568,3252415679,LT -3252415680,3252415743,SO -3252415744,3252415967,LT +3252415568,3252415743,LT +3252415744,3252415775,GB +3252415776,3252415967,LT 3252415968,3252415999,CM -3252416000,3252416255,BW -3252416256,3252416511,LT -3252416512,3252416639,GN -3252416640,3252416767,LT -3252416768,3252416799,CD -3252416800,3252416895,LT -3252416896,3252416927,GN +3252416000,3252416831,LT +3252416832,3252416927,GN 3252416928,3252416959,LT 3252416960,3252417023,GN -3252417024,3252417535,SO +3252417024,3252417279,LT +3252417280,3252417287,IQ +3252417288,3252417359,AF +3252417360,3252417535,LT 3252417536,3252417855,NG 3252417856,3252417919,LT 3252417920,3252417935,MW -3252417936,3252418047,LT -3252418048,3252418079,IQ -3252418080,3252418239,LT +3252417936,3252417951,ZM +3252417952,3252418239,LT 3252418240,3252418303,JO -3252418304,3252418815,LT +3252418304,3252418559,LT +3252418560,3252418623,JO +3252418624,3252418687,LT +3252418688,3252418719,JO +3252418720,3252418815,LT 3252418816,3252418847,KE 3252418848,3252419071,LT 3252419072,3252419087,ZM -3252419088,3252419103,ER +3252419088,3252419103,LT 3252419104,3252419119,SL -3252419120,3252419127,GH -3252419128,3252419135,TZ +3252419120,3252419135,LT 3252419136,3252419167,SL 3252419168,3252419199,CD -3252419200,3252419215,GH +3252419200,3252419215,LT 3252419216,3252419247,GN -3252419248,3252419263,LT +3252419248,3252419263,SN 3252419264,3252419279,TZ -3252419280,3252419311,SN +3252419280,3252419295,LT +3252419296,3252419311,SN 3252419312,3252419327,ZM 3252419328,3252419343,GH 3252419344,3252419359,LT 3252419360,3252419423,GH -3252419424,3252419583,LT -3252419584,3252419775,IQ -3252419776,3252419839,LT -3252419840,3252419999,IQ -3252420000,3252420095,LT -3252420096,3252420111,IQ +3252419424,3252419839,LT +3252419840,3252419911,IQ +3252419912,3252419919,LT +3252419920,3252419951,IQ +3252419952,3252419991,LT +3252419992,3252420007,IQ +3252420008,3252420031,LT +3252420032,3252420055,IQ +3252420056,3252420063,LT +3252420064,3252420071,IQ +3252420072,3252420111,LT 3252420112,3252420119,GB -3252420120,3252420239,IQ -3252420240,3252420247,LT -3252420248,3252420255,IQ -3252420256,3252420263,LT -3252420264,3252420279,IQ -3252420280,3252420287,LT -3252420288,3252420415,IQ -3252420416,3252420431,LT -3252420432,3252420463,IQ -3252420464,3252420479,LT -3252420480,3252420583,IQ -3252420584,3252420591,LT -3252420592,3252420607,IQ -3252420608,3252421119,LT -3252421120,3252424703,NO +3252420120,3252420143,IQ +3252420144,3252420191,LT +3252420192,3252420223,IQ +3252420224,3252420239,LT +3252420240,3252420247,IQ +3252420248,3252420263,LT +3252420264,3252420271,IQ +3252420272,3252420303,LT +3252420304,3252420311,IQ +3252420312,3252420327,LT +3252420328,3252420335,IQ +3252420336,3252420367,LT +3252420368,3252420415,IQ +3252420416,3252420431,GB +3252420432,3252420447,IQ +3252420448,3252420455,LT +3252420456,3252420463,IQ +3252420464,3252420471,AF +3252420472,3252420575,LT +3252420576,3252420591,IQ +3252420592,3252421119,LT +3252421120,3252421631,NO +3252421632,3252424703,LT 3252424704,3252424719,GN 3252424720,3252424735,LT 3252424736,3252424767,MA 3252424768,3252424799,LT 3252424800,3252424815,NE -3252424816,3252424831,CD -3252424832,3252424959,LT +3252424816,3252424959,LT 3252424960,3252424967,KE 3252424968,3252425023,LT 3252425024,3252425215,SO 3252425216,3252425343,TD 3252425344,3252425471,LT 3252425472,3252425543,AO -3252425544,3252425727,LT -3252425728,3252425855,ZM -3252425856,3252426239,LT -3252426240,3252426495,RW -3252426496,3252426751,LT +3252425544,3252425551,LT +3252425552,3252425575,AO +3252425576,3252426239,LT +3252426240,3252426751,BW 3252426752,3252427263,MZ 3252427264,3252427519,NG -3252427520,3252427647,SD -3252427648,3252427775,LT +3252427520,3252427775,LT 3252427776,3252428287,MW 3252428288,3252428351,NG -3252428352,3252428543,LT -3252428544,3252428671,CG -3252428672,3252428799,LT -3252428800,3252428831,IQ -3252428832,3252428863,LT -3252428864,3252428887,IQ -3252428888,3252428895,LT -3252428896,3252428927,IQ -3252428928,3252428943,LT -3252428944,3252429023,IQ -3252429024,3252429055,LT -3252429056,3252429087,IQ -3252429088,3252429103,LT -3252429104,3252429167,IQ -3252429168,3252429183,LT -3252429184,3252429215,IQ -3252429216,3252429247,LT -3252429248,3252429295,IQ -3252429296,3252429583,LT -3252429584,3252429599,IQ -3252429600,3252429615,LT -3252429616,3252429631,AE -3252429632,3252429663,LT -3252429664,3252429679,LB -3252429680,3252429711,IQ -3252429712,3252429727,LT -3252429728,3252429775,IQ -3252429776,3252429791,LT -3252429792,3252429823,IQ -3252429824,3252429951,NE -3252429952,3252430079,LT +3252428352,3252428383,AO +3252428384,3252428415,LT +3252428416,3252428447,KE +3252428448,3252430079,LT 3252430080,3252430335,BJ 3252430336,3252430463,NE -3252430464,3252430527,LT -3252430528,3252430535,BF -3252430536,3252430543,LT +3252430464,3252430511,LT +3252430512,3252430519,BF +3252430520,3252430527,LT +3252430528,3252430543,BF 3252430544,3252430559,BJ 3252430560,3252430591,BF 3252430592,3252430847,GN 3252430848,3252431359,MW -3252431360,3252431871,NG +3252431360,3252431871,LT 3252431872,3252432127,SO -3252432128,3252432383,LT +3252432128,3252432383,LR 3252432384,3252432399,MW 3252432400,3252432447,LT 3252432448,3252432463,MW -3252432464,3252432511,LT -3252432512,3252432527,MW -3252432528,3252432575,LT +3252432464,3252432575,LT 3252432576,3252432591,MW -3252432592,3252432895,LT -3252432896,3252433407,SO -3252433408,3252433663,LT +3252432592,3252433663,LT 3252433664,3252433919,SO 3252433920,3252434175,MZ -3252434176,3252434431,LT -3252434432,3252434687,BW -3252434688,3252434695,GH -3252434696,3252434711,TZ -3252434712,3252435199,LT -3252435200,3252435263,TZ -3252435264,3252435295,GN +3252434176,3252434687,LT +3252434688,3252434703,GH +3252434704,3252434711,TZ +3252434712,3252434719,LT +3252434720,3252434735,GH +3252434736,3252435199,LT +3252435200,3252435247,TZ +3252435248,3252435295,LT 3252435296,3252435311,TZ -3252435312,3252435319,EG +3252435312,3252435319,LT 3252435320,3252435327,MZ -3252435328,3252435343,LT -3252435344,3252435359,BF +3252435328,3252435343,CD +3252435344,3252435359,LT 3252435360,3252435375,CD -3252435376,3252435431,MZ -3252435432,3252435439,LT -3252435440,3252435455,GN +3252435376,3252435415,GN +3252435416,3252435423,CD +3252435424,3252435455,LT 3252435456,3252435711,TZ -3252435712,3252435887,GH +3252435712,3252435855,GH +3252435856,3252435871,MR +3252435872,3252435887,GH 3252435888,3252435919,BW 3252435920,3252435935,BF -3252435936,3252435967,CF +3252435936,3252435951,CF +3252435952,3252435967,LT 3252435968,3252436223,TZ 3252436224,3252436239,GN -3252436240,3252436255,NA +3252436240,3252436255,LT 3252436256,3252436271,ML 3252436272,3252436287,BF -3252436288,3252436319,ZM -3252436320,3252436335,GH +3252436288,3252436303,LT +3252436304,3252436319,ZM +3252436320,3252436335,LT 3252436336,3252436351,ZM 3252436352,3252436383,GN -3252436384,3252436399,ZM -3252436400,3252436447,TZ -3252436448,3252436479,LT -3252436480,3252436735,NG -3252436736,3252436991,LT -3252436992,3252437247,NG -3252437248,3252437503,LT -3252437504,3252437759,NG -3252437760,3252438015,ZM +3252436384,3252436399,SN +3252436400,3252436447,LT +3252436448,3252436479,ER +3252436480,3252436991,LT +3252436992,3252437503,NG +3252437504,3252438015,LT 3252438016,3252438271,TR 3252438272,3252438527,MD 3252438528,3252438783,CM 3252438784,3252439039,LT -3252439040,3252439103,CM -3252439104,3252439287,LT +3252439040,3252439055,BJ +3252439056,3252439071,LT +3252439072,3252439079,BJ +3252439080,3252439263,LT +3252439264,3252439271,SN +3252439272,3252439287,LT 3252439288,3252439295,SN 3252439296,3252439391,SO -3252439392,3252439551,LT -3252439552,3252439583,AL -3252439584,3252439807,LT +3252439392,3252439807,LT 3252439808,3252439871,SO 3252439872,3252440063,LT 3252440064,3252440319,MW -3252440320,3252440383,NG -3252440384,3252440575,LT -3252440576,3252441087,NG -3252441088,3252441599,TZ -3252441600,3252442111,LT -3252442112,3252442143,TZ -3252442144,3252442175,LT -3252442176,3252442191,TZ -3252442192,3252442623,LT -3252442624,3252442767,TZ -3252442768,3252442783,LT -3252442784,3252443135,TZ -3252443136,3252443327,LT -3252443328,3252444159,TZ -3252444160,3252444191,LT -3252444192,3252444287,TZ -3252444288,3252444351,LT -3252444352,3252445183,TZ +3252440320,3252444287,LT +3252444288,3252444351,TZ +3252444352,3252445183,LT 3252445184,3252445263,GN -3252445264,3252445311,LT -3252445312,3252445327,GN -3252445328,3252445431,LT -3252445432,3252445439,GN -3252445440,3252446207,LT -3252446208,3252446591,NO -3252446592,3252446703,LT -3252446704,3252446751,NO -3252446752,3252446815,LT -3252446816,3252448255,NO +3252445264,3252446703,LT +3252446704,3252446719,NO +3252446720,3252447231,LT +3252447232,3252448255,NO 3252448256,3252448511,SE 3252448512,3252448767,NO 3252448768,3252449279,SE @@ -38015,11 +68105,15 @@ 3252449624,3252449791,LT 3252449792,3252450047,CH 3252450048,3252450303,LT -3252450304,3252450831,NO -3252450832,3252451071,LT +3252450304,3252450815,NO +3252450816,3252450823,ET +3252450824,3252450847,LT +3252450848,3252450863,IQ +3252450864,3252450879,LT +3252450880,3252450911,NO +3252450912,3252451071,LT 3252451072,3252451327,CH -3252451328,3252451583,DK -3252451584,3252451839,LT +3252451328,3252451839,LT 3252451840,3252451855,NO 3252451856,3252451967,LT 3252451968,3252451999,NO @@ -38036,100 +68130,63 @@ 3252452228,3252452231,LT 3252452232,3252452239,NL 3252452240,3252452271,LT -3252452272,3252452415,NO -3252452416,3252452479,LT -3252452480,3252452487,KE -3252452488,3252452495,LT +3252452272,3252452351,NO +3252452352,3252452487,LT +3252452488,3252452495,MW 3252452496,3252452503,ZM -3252452504,3252452599,LT -3252452600,3252452607,UG +3252452504,3252452511,SD +3252452512,3252452607,LT 3252452608,3252452735,TD 3252452736,3252452863,LT -3252452864,3252452911,KE -3252452912,3252453119,LT +3252452864,3252452879,TZ +3252452880,3252453119,LT 3252453120,3252453151,NG -3252453152,3252453375,LT -3252453376,3252454527,NO -3252454528,3252454655,LT +3252453152,3252453247,LT +3252453248,3252453271,NG +3252453272,3252454655,LT 3252454656,3252454911,IQ 3252454912,3252455167,GB -3252455168,3252455423,LT -3252455424,3252455552,SO -3252455553,3252455679,LT +3252455168,3252455295,NG +3252455296,3252455679,LT 3252455680,3252455807,BI 3252455808,3252455935,LT 3252455936,3252456191,MW -3252456192,3252456447,LT -3252456448,3252456703,NG -3252456704,3252456959,LT +3252456192,3252456959,LT 3252456960,3252457471,NG -3252457472,3252459519,TZ -3252459520,3252465663,NO +3252457472,3252460799,LT +3252460800,3252460831,AF +3252460832,3252460847,KP +3252460848,3252461055,LT +3252461056,3252461567,NO +3252461568,3252464383,LT +3252464384,3252465663,NO 3252465664,3252465919,GH 3252465920,3252465951,LT 3252465952,3252465983,GH 3252465984,3252466047,LT 3252466048,3252466175,GH -3252466176,3252466431,UG -3252466432,3252466687,LT -3252466688,3252467199,NE -3252467200,3252467455,LT -3252467456,3252467967,CG -3252467968,3252468223,LT -3252468224,3252468231,CM -3252468232,3252468239,LT -3252468240,3252468479,CM -3252468480,3252468735,CG -3252468736,3252468991,CI -3252468992,3252469759,LT -3252469760,3252472159,BW -3252472160,3252473343,LT +3252466176,3252473343,LT 3252473344,3252473855,CD 3252473856,3252474879,SO -3252474880,3252475407,NG -3252475408,3252475903,LT -3252475904,3252476415,BW -3252476416,3252476671,LT -3252476672,3252476799,NG -3252476800,3252476927,LT -3252476928,3252477183,GW -3252477184,3252477439,LT -3252477440,3252477951,GN -3252477952,3252478463,KE -3252478464,3252478719,LT -3252478720,3252478975,KE -3252478976,3252479039,LT -3252479040,3252479063,KE -3252479064,3252479071,LT -3252479072,3252479119,KE -3252479120,3252479135,LT -3252479136,3252479143,KE -3252479144,3252479151,NO -3252479152,3252479167,LT -3252479168,3252479199,KE -3252479200,3252479215,LT -3252479216,3252479231,KE -3252479232,3252479295,LT -3252479296,3252479343,KE -3252479344,3252479359,LT -3252479360,3252479375,KE -3252479376,3252479487,LT -3252479488,3252479807,KE -3252479808,3252479999,LT -3252480000,3252480255,KE -3252480256,3252480511,LT -3252480512,3252480895,CG -3252480896,3252481023,LT +3252474880,3252475903,LT +3252475904,3252476415,NG +3252476416,3252481023,LT 3252481024,3252481535,MZ -3252481536,3252482047,LT -3252482048,3252483071,GW +3252481536,3252483071,LT 3252483072,3252483583,KW 3252483584,3252484095,LT 3252484096,3252486143,KW 3252486144,3252490239,BE -3252490240,3252507135,SE +3252490240,3252495871,SE +3252495872,3252496127,HU +3252496128,3252500991,SE +3252500992,3252501247,DE +3252501248,3252505343,SE +3252505344,3252505855,US +3252505856,3252507135,SE +3252507136,3252507647,EU 3252507648,3252509951,GB -3252509952,3252510719,HU +3252509952,3252510719,CH 3252510720,3252514815,FR 3252514816,3252515071,SI 3252515072,3252515327,GB @@ -38140,7 +68197,7 @@ 3252516352,3252516607,GB 3252516608,3252516863,SE 3252516864,3252517119,FR -3252517120,3252517375,DE +3252517120,3252517375,EU 3252517376,3252517631,PL 3252517632,3252517887,BE 3252517888,3252518143,DK @@ -38150,13 +68207,13 @@ 3252518912,3252527103,NL 3252527104,3252535295,BE 3252535296,3252539391,GB +3252539392,3252540415,EU 3252540416,3252541951,NL 3252541952,3252542207,CI 3252542208,3252551679,BE -3252551680,3252563967,CH -3252566784,3252567295,CH +3252551680,3252567295,CH 3252567296,3252567551,GB -3252567552,3252567807,ES +3252567552,3252567807,RU 3252567808,3252568063,RO 3252568064,3252579327,CH 3252579328,3252579583,FR @@ -38179,7 +68236,8 @@ 3252587520,3252587775,UA 3252587776,3252588031,SE 3252588032,3252600319,CH -3252600320,3252600831,RU +3252600320,3252600575,NL +3252600576,3252600831,RU 3252600832,3252616703,CH 3252616704,3252616959,ES 3252616960,3252617215,CH @@ -38195,8 +68253,7 @@ 3252643072,3252643327,RO 3252643328,3252643583,CH 3252643584,3252643839,AT -3252643840,3252645631,CH -3252645888,3252682751,CH +3252643840,3252682751,CH 3252682752,3252813823,HU 3252813824,3252830207,RO 3252830208,3252832255,MD @@ -38241,7 +68298,7 @@ 3252912896,3252913151,PL 3252913152,3252913407,ES 3252913408,3252913663,FR -3252913664,3252913919,NL +3252913664,3252913919,CZ 3252913920,3252914175,NO 3252914176,3252916223,FR 3252916224,3252920319,DE @@ -38259,6 +68316,7 @@ 3252937728,3252938239,FR 3252938240,3252938751,UA 3252938752,3252939263,RU +3252939264,3252939775,EU 3252939776,3252940287,RO 3252940288,3252940799,PT 3252940800,3252941311,RU @@ -38302,8 +68360,7 @@ 3253223680,3253223935,UA 3253223936,3253230591,RU 3253230592,3253230847,BY -3253230848,3253231103,UA -3253231104,3253247999,RU +3253230848,3253247999,RU 3253248000,3253248255,DE 3253248256,3253248511,UZ 3253248512,3253264383,RU @@ -38324,8 +68381,7 @@ 3253605376,3253606399,UA 3253606400,3253607423,NL 3253607424,3253608447,NG -3253608448,3253609471,UA -3253609472,3253610495,RU +3253608448,3253610495,UA 3253610496,3253611519,PL 3253611520,3253612543,UA 3253612544,3253613567,RU @@ -38334,7 +68390,7 @@ 3253615616,3253616639,DE 3253616640,3253617663,PL 3253617664,3253618687,GB -3253618688,3253619711,PL +3253618688,3253619711,UA 3253619712,3253620735,IT 3253620736,3253622783,GB 3253622784,3253623807,DE @@ -38376,7 +68432,7 @@ 3253663744,3253664767,NL 3253664768,3253665791,DE 3253665792,3253666815,CZ -3253666816,3253667839,NL +3253666816,3253667839,EU 3253667840,3253668863,GB 3253668864,3253669887,ES 3253669888,3253670911,DE @@ -38394,7 +68450,7 @@ 3253683200,3253685247,UA 3253685248,3253686271,FR 3253686272,3253687295,PL -3253687296,3253688319,UA +3253687296,3253688319,RU 3253688320,3253690367,NL 3253690368,3253691391,DK 3253691392,3253692415,PL @@ -38411,7 +68467,8 @@ 3253700608,3253701119,PL 3253701120,3253702143,RO 3253702144,3253702655,UA -3253702656,3253703679,RO +3253702656,3253703167,PL +3253703168,3253703679,RO 3253703680,3253704191,HU 3253704192,3253704703,RU 3253704704,3253705215,UA @@ -38419,8 +68476,7 @@ 3253705728,3253706239,DE 3253706240,3253706751,RO 3253706752,3253707263,GB -3253707264,3253707775,FR -3253707776,3253708287,DE +3253707264,3253708287,DE 3253708288,3253708799,RO 3253708800,3253709311,DK 3253709312,3253709823,UA @@ -38519,8 +68575,9 @@ 3253969408,3253969919,AT 3253969920,3253970431,NL 3253970432,3253970687,DE -3253970688,3253970943,HU -3253970944,3253972991,DK +3253970688,3253970943,UA +3253970944,3253971967,RS +3253971968,3253972991,RU 3253972992,3253974783,GB 3253974784,3253974847,NO 3253974848,3253974911,SE @@ -38529,7 +68586,9 @@ 3253975040,3253977087,DE 3253977088,3253985279,TR 3253985280,3253993471,GB -3253993472,3254124543,BE +3253993472,3254067199,BE +3254067200,3254069247,CZ +3254069248,3254124543,BE 3254124544,3254156799,CH 3254156800,3254157055,LI 3254157056,3254177279,CH @@ -38556,7 +68615,7 @@ 3254486720,3254486735,FR 3254486736,3254486767,US 3254486768,3254486783,HK -3254486784,3254487039,FR +3254486784,3254487039,A2 3254487040,3254487199,KM 3254487200,3254487263,FR 3254487264,3254487295,KM @@ -38567,15 +68626,9 @@ 3254487808,3254487855,LB 3254487856,3254487863,FR 3254487864,3254488063,LB -3254488064,3254488447,MG -3254488448,3254488450,FR -3254488451,3254488515,MG -3254488516,3254488516,FR -3254488517,3254488518,MG -3254488519,3254488521,FR -3254488522,3254488548,MG -3254488549,3254488550,FR -3254488551,3254488831,MG +3254488064,3254488431,FR +3254488432,3254488447,MG +3254488448,3254488831,FR 3254488832,3254489087,DJ 3254489088,3254489343,DZ 3254489344,3254489365,FR @@ -38677,13 +68730,7 @@ 3254557440,3254557695,AT 3254557696,3254576383,FR 3254576384,3254576543,DO -3254576544,3254583296,FR -3254583297,3254583300,SG -3254583301,3254583302,US -3254583303,3254583551,FR -3254583552,3254583567,SG -3254583568,3254583583,US -3254583584,3254623743,FR +3254576544,3254623743,FR 3254623744,3254624255,US 3254624256,3254648831,FR 3254648832,3254648895,DK @@ -38699,7 +68746,9 @@ 3254656512,3254656767,DE 3254656768,3254657023,GB 3254657024,3254665215,RO +3254665216,3254676479,EU 3254676480,3254676735,DE +3254676736,3254681599,EU 3254681600,3254697983,DE 3254697984,3254698495,SE 3254698496,3254699007,GB @@ -38715,14 +68764,16 @@ 3254703616,3254704127,NL 3254704128,3254705663,UA 3254705664,3254706175,GR -3254706176,3254707199,UA +3254706176,3254706687,RU 3254707200,3254707711,TR 3254707712,3254708223,RO -3254708224,3254709247,UA +3254708224,3254708735,UA +3254708736,3254709247,RO 3254709248,3254710271,DE 3254710272,3254710783,IT 3254710784,3254711295,RO 3254711296,3254711807,FR +3254711808,3254712319,PL 3254712320,3254712831,RU 3254712832,3254713343,KZ 3254713344,3254713855,TR @@ -38731,6 +68782,18 @@ 3254779904,3254780159,DE 3254780160,3254780671,GB 3254780672,3254780927,LT +3254780928,3254781183,GR +3254781184,3254781439,NL +3254781440,3254781951,BE +3254781952,3254782207,LV +3254782208,3254782463,FR +3254782464,3254782719,AT +3254782720,3254782975,DE +3254782976,3254783743,CZ +3254783744,3254783999,SA +3254784000,3254784255,IT +3254784256,3254784511,CH +3254784512,3254785279,LT 3254796288,3254797311,SE 3254797312,3254798335,RU 3254798336,3254799359,AT @@ -38822,7 +68885,8 @@ 3254833408,3254833663,RU 3254833664,3254833919,GB 3254833920,3254834175,PL -3254834176,3254834687,CH +3254834176,3254834431,CH +3254834432,3254834687,FR 3254834688,3254834943,GB 3254834944,3254835199,NO 3254835200,3254835455,DE @@ -38830,7 +68894,7 @@ 3254835712,3254835967,UA 3254835968,3254836223,GB 3254836224,3254836479,PL -3254836480,3254836735,DE +3254836480,3254836735,MD 3254836736,3254836991,AT 3254836992,3254837247,GB 3254837248,3254837503,HR @@ -38874,28 +68938,32 @@ 3254884608,3254884863,PL 3254884864,3254885119,SE 3254885120,3254885375,DE -3254885632,3254886143,SK +3254885376,3254885887,SK +3254885888,3254886143,AT +3254886144,3254886399,SK 3254886400,3254886655,IT 3254886656,3254886911,RU 3254886912,3254887423,CH 3254887424,3254888191,GB 3254888192,3254888447,RO -3254888704,3254888959,SK -3254889472,3254890495,SK +3254888448,3254888703,SK +3254888704,3254888959,RO +3254888960,3254890495,SK 3254890496,3254890751,DE 3254890752,3254891007,UA 3254891008,3254891519,RO 3254891520,3254891775,GB 3254891776,3254892031,DE 3254892032,3254892287,GB -3254892288,3254892543,FR -3254892800,3254893567,SK -3254894080,3254894591,SK +3254892288,3254892543,BE +3254892544,3254894079,SK +3254894080,3254894335,CH +3254894336,3254894591,SK 3254894592,3254894847,DK 3254894848,3254895103,UA 3254895104,3254895359,GB 3254895360,3254895615,UA -3254895616,3254895871,DK +3254895616,3254895871,PL 3254895872,3254896127,SE 3254896128,3254896383,RU 3254896384,3254896639,PL @@ -38910,74 +68978,113 @@ 3254898688,3254898943,IT 3254898944,3254899199,EE 3254899200,3254899455,GB -3254899456,3254899711,SE -3254899712,3254899967,SK -3254900480,3254900991,SK -3254901248,3254901503,SK -3254901760,3254904831,SK -3254907904,3254908159,SK -3254908416,3254908671,SK -3254910720,3254910975,SK +3254899456,3254899967,SE +3254899968,3254901759,SK +3254901760,3254902271,UA +3254902272,3254908415,SK +3254908416,3254908671,PL +3254908672,3254910719,SK +3254910720,3254910975,HR 3254910976,3254926279,FR 3254926280,3254926287,GB 3254926288,3254937999,FR 3254938000,3254938007,GB -3254938008,3254994734,FR +3254938008,3254959623,FR +3254959624,3254959631,A2 +3254959632,3254994734,FR 3254994735,3254994735,BE -3254994736,3255017648,FR +3254994736,3255000053,FR +3255000054,3255000054,A2 +3255000055,3255006719,FR +3255006720,3255006975,A2 +3255006976,3255017648,FR 3255017649,3255017649,LB 3255017650,3255120639,FR 3255120640,3255120895,DE 3255120896,3255123711,FR 3255123712,3255123967,DE -3255123968,3255125759,FR -3255126016,3255172351,FR +3255123968,3255172351,FR 3255172352,3255172607,DE 3255172608,3255173119,FR 3255173120,3255173631,GB +3255173632,3255173647,EU 3255173648,3255173711,GB +3255173712,3255173759,EU 3255173760,3255173823,GB +3255173824,3255173839,EU 3255173840,3255174151,GB +3255174152,3255174159,EU 3255174160,3255174167,GB +3255174168,3255174199,EU 3255174200,3255174207,GB +3255174208,3255174215,EU 3255174216,3255174247,GB +3255174248,3255174271,EU 3255174272,3255174279,GB +3255174280,3255174311,EU 3255174312,3255174319,GB +3255174320,3255174327,EU 3255174328,3255174335,GB +3255174336,3255174375,EU 3255174376,3255174383,GB +3255174384,3255174399,EU 3255174400,3255175167,GB +3255175168,3255175199,EU 3255175200,3255175231,GB +3255175232,3255175247,EU 3255175248,3255175263,GB +3255175264,3255175279,EU 3255175280,3255175295,GB +3255175296,3255175311,EU 3255175312,3255175327,GB +3255175328,3255175431,EU 3255175432,3255175447,GB +3255175448,3255175455,EU 3255175456,3255175503,GB +3255175504,3255175511,EU 3255175512,3255175535,GB +3255175536,3255175551,EU 3255175552,3255175559,GB +3255175560,3255175591,EU 3255175592,3255175607,GB +3255175608,3255175679,EU 3255175680,3255175935,GB +3255175936,3255176191,EU 3255176192,3255177215,GB +3255177216,3255177471,EU 3255177472,3255177855,GB +3255177856,3255177983,EU 3255177984,3255187199,GB 3255187200,3255187455,DE 3255187456,3255187711,GB +3255187712,3255188479,EU 3255188480,3255191807,GB +3255191808,3255192319,EU 3255192320,3255193863,GB +3255193864,3255193887,EU 3255193888,3255193959,GB +3255193960,3255193967,EU 3255193968,3255193975,GB 3255193976,3255193983,GI 3255193984,3255193999,GB +3255194000,3255194015,EU 3255194016,3255194039,GB +3255194040,3255194055,EU 3255194056,3255194063,GB +3255194064,3255194071,EU 3255194072,3255194431,GB +3255194432,3255194495,EU 3255194496,3255194559,GB +3255194560,3255194623,EU 3255194624,3255194703,GB +3255194704,3255194719,EU 3255194720,3255194815,GB +3255194816,3255194879,EU 3255194880,3255205887,GB 3255205888,3255214079,FR 3255214080,3255222271,CH 3255222272,3255223295,DE -3255223296,3255224319,UA +3255223296,3255224319,RU 3255224320,3255225343,RO 3255225344,3255226367,PL 3255226368,3255227391,DE @@ -39011,19 +69118,13 @@ 3255237888,3255238143,ES 3255238144,3255238399,GB 3255238400,3255238655,QA -3255238656,3255240991,BE -3255240992,3255241007,LU -3255241008,3255243583,BE -3255243584,3255243591,GB -3255243592,3255243679,BE +3255238656,3255243679,BE 3255243680,3255243711,LU 3255243712,3255245599,BE 3255245600,3255245631,LU 3255245632,3255245687,BE 3255245688,3255245695,LU -3255245696,3255246591,BE -3255246592,3255246623,LU -3255246624,3255247455,BE +3255245696,3255247455,BE 3255247456,3255247487,LU 3255247488,3255247615,BE 3255247616,3255247631,LU @@ -39031,31 +69132,31 @@ 3255247648,3255247663,LU 3255247664,3255248127,BE 3255248128,3255248383,LU -3255248384,3255249295,BE +3255248384,3255248735,BE +3255248736,3255248767,LU +3255248768,3255249295,BE 3255249296,3255249311,LU -3255249312,3255249383,BE -3255249384,3255249387,LU -3255249388,3255249935,BE +3255249312,3255249935,BE 3255249936,3255249951,LU 3255249952,3255250079,BE 3255250080,3255250111,LU -3255250112,3255250231,BE -3255250232,3255250239,LU -3255250240,3255252487,BE +3255250112,3255252487,BE 3255252488,3255252495,FR -3255252496,3255252559,BE +3255252496,3255252527,BE +3255252528,3255252543,LU +3255252544,3255252559,BE 3255252560,3255252575,LU -3255252576,3255254847,BE -3255254848,3255254879,LU -3255254880,3255254927,BE -3255254928,3255254943,LU -3255254944,3255255711,BE +3255252576,3255255559,BE +3255255560,3255255567,LU +3255255568,3255255599,BE +3255255600,3255255607,LU +3255255608,3255255711,BE 3255255712,3255255743,LU -3255255744,3255255775,BE -3255255776,3255255807,LU -3255255808,3255259199,BE -3255259200,3255259215,LU -3255259216,3255259327,BE +3255255744,3255255751,BE +3255255752,3255255759,DK +3255255760,3255256319,BE +3255256320,3255256575,LU +3255256576,3255259327,BE 3255259328,3255259359,LU 3255259360,3255259919,BE 3255259920,3255259927,LU @@ -39067,33 +69168,53 @@ 3255260344,3255260347,LU 3255260348,3255261519,BE 3255261520,3255261535,LU -3255261536,3255261679,BE -3255261680,3255261695,LU -3255261696,3255262799,BE +3255261536,3255262799,BE 3255262800,3255262815,LU 3255262816,3255263295,BE 3255263296,3255263327,US -3255263328,3255264775,BE -3255264776,3255264783,LU -3255264784,3255266055,BE -3255266056,3255266063,FR -3255266064,3255270431,BE +3255263328,3255270431,BE 3255270432,3255270463,FR -3255270464,3255271359,BE -3255271360,3255271391,LU -3255271392,3255276223,BE +3255270464,3255273855,BE +3255273856,3255273887,LU +3255273888,3255274207,BE +3255274208,3255274239,LU +3255274240,3255274335,BE +3255274336,3255274367,LU +3255274368,3255274847,BE +3255274848,3255274879,LU +3255274880,3255274911,BE +3255274912,3255274943,LU +3255274944,3255276223,BE 3255276224,3255276255,FR -3255276256,3255278855,BE -3255278856,3255278863,DE -3255278864,3255279087,BE +3255276256,3255276575,BE +3255276576,3255276607,LU +3255276608,3255276671,BE +3255276672,3255276703,LU +3255276704,3255277247,BE +3255277248,3255277255,LU +3255277256,3255277955,BE +3255277956,3255277959,LU +3255277960,3255278047,BE +3255278048,3255278063,LU +3255278064,3255278607,BE +3255278608,3255278623,LU +3255278624,3255278719,BE +3255278720,3255278751,LU +3255278752,3255279007,BE +3255279008,3255279039,LU +3255279040,3255279087,BE 3255279088,3255279103,LU -3255279104,3255279131,BE -3255279132,3255279135,NL -3255279136,3255280047,BE +3255279104,3255279639,BE +3255279640,3255279647,LU +3255279648,3255280031,BE +3255280032,3255280039,LU +3255280040,3255280047,BE 3255280048,3255280055,LU -3255280056,3255283871,BE -3255283872,3255283903,LU -3255283904,3255283927,BE +3255280056,3255281407,BE +3255281408,3255281439,LU +3255281440,3255283415,BE +3255283416,3255283423,LU +3255283424,3255283927,BE 3255283928,3255283931,LU 3255283932,3255284239,BE 3255284240,3255284255,LU @@ -39112,17 +69233,13 @@ 3255290144,3255290175,LU 3255290176,3255290271,BE 3255290272,3255290287,LU -3255290288,3255290351,BE -3255290352,3255290367,LU -3255290368,3255290879,BE +3255290288,3255290879,BE 3255290880,3255291391,LU 3255291392,3255291399,BE 3255291400,3255291423,LU 3255291424,3255291615,BE 3255291616,3255291623,LU -3255291624,3255291767,BE -3255291768,3255291775,LU -3255291776,3255291871,BE +3255291624,3255291871,BE 3255291872,3255291887,LU 3255291888,3255291983,BE 3255291984,3255291999,LU @@ -39135,6 +69252,7 @@ 3255300808,3255304191,BE 3255304192,3255304447,DE 3255304448,3255305215,LV +3255305216,3255305471,EU 3255305472,3255307775,LV 3255307776,3255308031,PL 3255308032,3255308287,CH @@ -39144,6 +69262,7 @@ 3255311872,3255312127,PT 3255312128,3255312383,SE 3255312384,3255315455,LV +3255315456,3255315711,EU 3255315712,3255316223,PL 3255316224,3255316479,RU 3255316480,3255316991,GB @@ -39155,13 +69274,14 @@ 3255318272,3255318527,RU 3255318528,3255318783,UA 3255318784,3255319295,DE +3255319296,3255319551,UA 3255319552,3255319807,BG 3255319808,3255320063,AT 3255320064,3255320319,BE 3255320320,3255320575,AT 3255320576,3255321087,UA -3255321088,3255321599,PL -3255321600,3255323135,RU +3255321088,3255322111,PL +3255322112,3255323135,RU 3255323136,3255323647,GB 3255323648,3255324159,IL 3255324160,3255324671,CH @@ -39173,14 +69293,29 @@ 3255327744,3255328255,SE 3255328256,3255328767,SI 3255328768,3255336959,DE -3255336960,3255345151,AT +3255336960,3255341055,RU +3255341056,3255342079,UA +3255343104,3255344127,RU +3255344128,3255345151,UA 3255345152,3255353343,RU 3255353344,3255361535,DE -3255361536,3255369727,GB -3255369728,3255370751,UA +3255361536,3255362047,RU +3255362048,3255362559,FI +3255362560,3255364607,RU +3255364608,3255365119,NL +3255365120,3255365631,SK +3255365632,3255366143,UA +3255366144,3255367167,DK +3255367168,3255367679,RU +3255367680,3255368191,UA +3255368192,3255368703,MD +3255368704,3255369215,CZ +3255369216,3255369727,GB +3255369728,3255370239,LU +3255370240,3255370751,RU 3255370752,3255371263,DE 3255371264,3255371775,BG -3255371776,3255372287,RO +3255371776,3255372287,SE 3255372288,3255372799,DE 3255372800,3255373311,MC 3255373312,3255373823,UA @@ -39197,7 +69332,6 @@ 3255378944,3255379455,UA 3255379456,3255379967,RU 3255379968,3255380479,GB -3255380480,3255380991,NL 3255380992,3255381503,CH 3255381504,3255382015,PL 3255382016,3255382527,NL @@ -39220,12 +69354,10 @@ 3255391232,3255391743,NL 3255391744,3255392767,DE 3255392768,3255393791,RO -3255393792,3255394303,SE -3255394304,3255399679,DK +3255393792,3255399679,SE 3255399680,3255400447,DE 3255400448,3255401471,CH -3255401472,3255412303,DE -3255412304,3255412339,PL +3255401472,3255412479,DE 3255412480,3255412735,RO 3255412736,3255413247,DE 3255413248,3255413759,LV @@ -39242,25 +69374,30 @@ 3255426048,3255426559,IT 3255426560,3255426815,FR 3255426816,3255427071,PL -3255427072,3255435263,FI -3255435264,3255436543,GB +3255427072,3255431167,RU +3255431168,3255436543,GB 3255436544,3255436799,NL 3255436800,3255437055,DE 3255437056,3255437311,GB +3255437312,3255446527,EU 3255446528,3255446783,GB +3255446784,3255449599,EU 3255449600,3255450111,BE 3255450112,3255450367,GB 3255450368,3255450623,FR 3255450624,3255451135,DE 3255451136,3255452671,FR +3255452672,3255468031,EU 3255468032,3255468543,GB +3255468544,3255469055,EU 3255469056,3255469567,GB 3255469568,3255469823,DE 3255469824,3255470079,DK 3255470080,3255470591,AT 3255470592,3255470847,DE 3255470848,3255471103,HU -3255471104,3255471615,BE +3255471104,3255471359,BE +3255471360,3255471615,EU 3255471616,3255471871,GB 3255471872,3255472127,BE 3255472128,3255472383,GB @@ -39277,12 +69414,14 @@ 3255477248,3255477503,GB 3255477504,3255477759,CH 3255477760,3255478271,GB +3255478272,3255482367,EU 3255482368,3255482623,GB 3255482624,3255482815,BE 3255482816,3255482831,FR 3255482832,3255482839,BE 3255482840,3255482847,FR 3255482848,3255482871,BE +3255482872,3255482879,EU 3255482880,3255483135,GB 3255483136,3255484415,DE 3255484416,3255484671,PL @@ -39291,6 +69430,7 @@ 3255485184,3255485439,AT 3255485440,3255486463,FR 3255486464,3255486719,BE +3255486720,3255486975,EU 3255486976,3255487487,GB 3255487488,3255487743,BE 3255487744,3255487999,GB @@ -39300,7 +69440,9 @@ 3255489536,3255489887,DE 3255489888,3255490047,GB 3255490048,3255490559,DE +3255490560,3255492607,EU 3255492608,3255496703,GB +3255496704,3255497727,EU 3255497728,3255497983,BE 3255497984,3255498239,DE 3255498240,3255498495,FR @@ -39327,10 +69469,13 @@ 3255558144,3255558399,BE 3255558400,3255564031,CH 3255564032,3255564287,RU -3255564288,3255565823,CH -3255565824,3255566079,DE +3255564288,3255565567,CH +3255565568,3255566079,DE 3255566080,3255566335,CH -3255566336,3255599103,SE +3255566336,3255574527,SE +3255574528,3255578623,CZ +3255578624,3255582719,SE +3255590912,3255599103,UA 3255599104,3255615487,CH 3255615488,3255623679,DE 3255623680,3255631871,BG @@ -39338,9 +69483,12 @@ 3255660288,3255660543,GR 3255660544,3255666431,NL 3255666432,3255666687,DE -3255667200,3255667455,NL -3255667712,3255697407,NL -3255697408,3255762943,SE +3255666688,3255697407,NL +3255697408,3255739647,SE +3255739648,3255739903,GB +3255739904,3255745535,SE +3255745536,3255746047,DK +3255746048,3255762943,SE 3255762944,3255799039,DE 3255799040,3255799295,SE 3255799296,3255800575,DE @@ -39353,7 +69501,9 @@ 3255821824,3255822079,DE 3255822080,3255822335,CH 3255822336,3255828479,DE -3255828480,3255909183,SE +3255828480,3255851311,SE +3255851312,3255851315,DK +3255851316,3255909183,SE 3255909184,3255909191,DK 3255909192,3256025087,SE 3256025088,3256057855,NO @@ -39361,13 +69511,7 @@ 3256074752,3256075007,SE 3256075008,3256076287,DK 3256076288,3256076799,SE -3256076800,3256080127,DK -3256080128,3256080383,US -3256080384,3256080639,DK -3256080640,3256080767,SE -3256080768,3256081919,DK -3256081920,3256082175,SE -3256082176,3256082431,DK +3256076800,3256082431,DK 3256082432,3256090623,LV 3256090624,3256164863,IT 3256164864,3256165375,SE @@ -39413,14 +69557,12 @@ 3256414720,3256415231,DE 3256415232,3256415743,PL 3256415744,3256416255,UA -3256416256,3256416767,DE 3256416768,3256417279,GB 3256417280,3256417791,NO 3256417792,3256418303,GB 3256418304,3256427503,DE 3256427504,3256427511,GB -3256427512,3256427519,AT -3256427520,3256443727,DE +3256427512,3256443727,DE 3256443728,3256443735,GB 3256443736,3256446855,DE 3256446856,3256446863,US @@ -39447,41 +69589,85 @@ 3256528896,3256530943,DE 3256530944,3256549375,NL 3256549376,3256614911,TR -3256614912,3256680447,IT -3256680448,3256682415,CH -3256682416,3256682431,IT -3256682432,3256688639,CH +3256614912,3256615935,FI +3256615936,3256616959,UA +3256616960,3256617983,GB +3256617984,3256619007,PL +3256619008,3256620031,UA +3256620032,3256621055,RU +3256621056,3256622079,DK +3256622080,3256623103,RU +3256623104,3256624127,PL +3256624128,3256625151,UA +3256625152,3256626175,PL +3256626176,3256627199,UA +3256627200,3256628223,PL +3256628224,3256629247,UA +3256629248,3256630271,RU +3256630272,3256633343,UA +3256633344,3256634367,RU +3256634368,3256635391,MD +3256635392,3256636415,PL +3256636416,3256638463,UA +3256638464,3256640511,RU +3256640512,3256641535,UA +3256641536,3256642559,PL +3256642560,3256643583,SI +3256643584,3256644607,MD +3256644608,3256645631,IT +3256645632,3256646655,SE +3256647680,3256648703,RS +3256648704,3256649727,UA +3256649728,3256650751,GB +3256650752,3256652799,UA +3256652800,3256653823,DE +3256653824,3256654847,RU +3256654848,3256655871,GB +3256655872,3256656895,RU +3256656896,3256657919,GB +3256657920,3256658943,PL +3256658944,3256662015,UA +3256662016,3256663039,RU +3256663040,3256664063,PL +3256664064,3256665087,RU +3256665088,3256666111,UA +3256666112,3256667135,PL +3256667136,3256671231,RU +3256671232,3256672255,PL +3256672256,3256673279,RU +3256673280,3256674303,PL +3256674304,3256675327,RO +3256675328,3256677375,RU +3256677376,3256678399,GB +3256678400,3256680447,DK +3256680448,3256688639,CH 3256688640,3256692735,IL 3256692736,3256693759,GR 3256693760,3256694783,IT 3256694784,3256695807,CH 3256695808,3256696831,UA -3256696832,3256697343,BE -3256697344,3256697855,ES +3256696832,3256697599,BE +3256697600,3256697855,GB 3256697856,3256698367,IT -3256698400,3256698407,DK -3256698432,3256698463,IT -3256698464,3256698471,DK -3256698472,3256698479,NL -3256698480,3256698495,IE +3256698368,3256698623,NL 3256698624,3256698879,GB -3256698880,3256700927,GR -3256700928,3256701183,DK +3256698880,3256699135,DE +3256699136,3256699391,NL +3256699392,3256699903,GB +3256699904,3256701183,EU 3256701184,3256701439,BE 3256701440,3256701695,GB -3256701696,3256702719,DK -3256705024,3256705279,IR +3256701696,3256705279,EU 3256705280,3256705791,BE 3256705792,3256706047,AT -3256706048,3256707071,GR -3256707072,3256709119,DE -3256709120,3256709887,AT +3256706048,3256706559,GR +3256706560,3256709631,EU +3256709632,3256709887,AT +3256709888,3256710143,EU 3256710144,3256710655,AT 3256710656,3256711167,SE 3256711168,3256711423,DE -3256711424,3256711679,FR -3256711680,3256712191,DK -3256712192,3256713215,CH +3256711424,3256713215,EU 3256713216,3256727551,PL 3256727552,3256728575,UA 3256728576,3256729599,DE @@ -39520,7 +69706,7 @@ 3256792576,3256792831,NL 3256792832,3256793087,DE 3256793088,3256793343,GB -3256793344,3256793599,PL +3256793344,3256793599,DE 3256793600,3256793855,GB 3256793856,3256794111,SK 3256794112,3256794367,NL @@ -39528,13 +69714,10 @@ 3256794624,3256794879,RU 3256794880,3256795135,AT 3256795136,3256811519,GR -3256811520,3256819711,DE -3256827904,3256869631,DE -3256869888,3256870911,DE -3256871168,3256871935,DE -3256872448,3256877055,DE -3256877056,3256898559,GB -3256899584,3256915455,GB +3256811520,3256864511,DE +3256864512,3256864767,CH +3256864768,3256877055,DE +3256877056,3256915455,GB 3256915456,3256915967,SE 3256915968,3256945663,GB 3256945664,3256945919,UA @@ -39558,15 +69741,9 @@ 3257011200,3257011455,BG 3257011456,3257058815,GB 3257058816,3257059071,PL -3257059072,3257077503,GB -3257077760,3257087487,GB -3257087744,3257139199,GB -3257139200,3257139455,NL -3257139456,3257143295,GB -3257144576,3257144831,GB +3257059072,3257144831,GB 3257144832,3257145087,FR -3257145088,3257160703,GB -3257161728,3257180159,GB +3257145088,3257180159,GB 3257180160,3257180415,TR 3257180416,3257180671,RU 3257180672,3257180927,EE @@ -39599,13 +69776,17 @@ 3257357824,3257371903,DE 3257371904,3257372159,BE 3257372160,3257372671,GB -3257372672,3257388799,DE +3257372672,3257383679,DE +3257383680,3257383935,CH +3257383936,3257388799,DE 3257388800,3257389055,FR 3257389056,3257401343,DE 3257401344,3257466879,CH -3257466880,3257467135,NL +3257466880,3257467135,DE 3257467136,3257467391,GB +3257467392,3257467903,NL 3257467904,3257468927,IT +3257468928,3257469183,EU 3257469184,3257469439,IT 3257469440,3257469951,GB 3257469952,3257470975,BE @@ -39613,6 +69794,7 @@ 3257475072,3257475327,ES 3257475328,3257475583,FI 3257475584,3257476095,DE +3257476096,3257476351,EU 3257476352,3257477119,DE 3257477120,3257477375,NL 3257477376,3257477887,SE @@ -39623,6 +69805,7 @@ 3257481472,3257481727,DE 3257481728,3257481983,FI 3257481984,3257482239,FR +3257482240,3257482751,EU 3257482752,3257483007,NL 3257483008,3257491455,CH 3257491456,3257495551,BE @@ -39648,24 +69831,87 @@ 3257546656,3257546687,SE 3257546688,3257546719,DE 3257546720,3257546751,DK -3257546752,3257548799,FI -3257548800,3257556991,DE +3257546752,3257548799,IE +3257548800,3257549055,DE +3257549056,3257549343,GB +3257549344,3257549359,DE +3257549360,3257549375,GB +3257549376,3257549423,DE +3257549424,3257549567,GB +3257549568,3257549695,DE +3257549696,3257549823,GB +3257549824,3257549871,DE +3257549872,3257549951,GB +3257549952,3257550095,DE +3257550096,3257550847,GB +3257550848,3257551103,DE +3257551104,3257551631,GB +3257551632,3257551647,DE +3257551648,3257551711,GB +3257551712,3257551807,DE +3257551808,3257551871,GB +3257551872,3257552383,DE +3257552384,3257552607,GB +3257552608,3257552655,DE +3257552656,3257552703,GB +3257552704,3257552719,DE +3257552720,3257552895,GB +3257552896,3257552959,DE +3257552960,3257553023,GB +3257553024,3257553039,DE +3257553040,3257553407,GB +3257553408,3257553727,DE +3257553728,3257553791,GB +3257553792,3257553807,DE +3257553808,3257553823,GB +3257553824,3257553839,DE +3257553840,3257553855,GB +3257553856,3257553919,DE +3257553920,3257554175,GB +3257554176,3257554207,DE +3257554208,3257554239,GB +3257554240,3257554271,DE +3257554272,3257554335,GB +3257554336,3257554351,DE +3257554352,3257554415,GB +3257554416,3257554943,DE +3257554944,3257555007,GB +3257555008,3257555039,DE +3257555040,3257555167,GB +3257555168,3257555199,DE +3257555200,3257555247,GB +3257555248,3257555263,DE +3257555264,3257555327,GB +3257555328,3257555359,DE +3257555360,3257555391,GB +3257555392,3257555471,DE +3257555472,3257555583,GB +3257555584,3257555695,DE +3257555696,3257555711,GB +3257555712,3257555775,DE +3257555776,3257555839,GB +3257555840,3257555887,DE +3257555888,3257555903,GB +3257555904,3257555935,DE +3257555936,3257556223,GB +3257556224,3257556287,DE +3257556288,3257556479,GB +3257556480,3257556991,DE 3257556992,3257557503,MW 3257557504,3257558015,LU 3257558016,3257559551,RO 3257559552,3257560063,UA 3257560064,3257560575,DE 3257560576,3257561087,PL -3257561088,3257561599,RU +3257561088,3257561599,UA 3257561600,3257562111,DE 3257562112,3257563647,PL -3257563648,3257564159,DE 3257564160,3257564671,GB 3257564672,3257565183,RO 3257565184,3257570303,CY -3257570304,3257570311,GR -3257570312,3257570319,CY -3257570320,3257570327,GR +3257570304,3257570307,GR +3257570308,3257570311,CY +3257570312,3257570327,GR 3257570328,3257570367,CY 3257570368,3257570431,GR 3257570432,3257570495,CY @@ -39679,7 +69925,8 @@ 3257576192,3257577471,AT 3257577472,3257581567,DE 3257581568,3257585663,UA -3257585664,3257586687,NL +3257585664,3257586175,BE +3257586176,3257586687,NL 3257586688,3257586943,LU 3257586944,3257587455,ES 3257587456,3257587711,GB @@ -39690,87 +69937,787 @@ 3257589760,3257663487,GB 3257663488,3257729023,UA 3257729024,3257731071,DE -3257731072,3257731415,NL -3257731416,3257731423,DE -3257731424,3257731543,NL -3257731544,3257731551,DE -3257731552,3257732007,NL -3257732008,3257732015,DE -3257732016,3257732095,NL +3257731072,3257731567,NL +3257731568,3257731575,DE +3257731576,3257732095,NL 3257732096,3257732607,DE -3257732608,3257732935,NL -3257732936,3257732943,DE -3257732944,3257734143,NL +3257732608,3257732727,NL +3257732728,3257732735,DE +3257732736,3257734143,NL 3257734144,3257736191,DE -3257736192,3257737327,NL -3257737328,3257737335,DE -3257737336,3257737471,NL +3257736192,3257737119,NL +3257737120,3257737127,DE +3257737128,3257737471,NL 3257737472,3257743615,DE -3257743616,3257744151,NL -3257744152,3257744159,DE -3257744160,3257745479,NL -3257745480,3257745487,DE -3257745488,3257746943,NL +3257743616,3257743623,NL +3257743624,3257743631,DE +3257743632,3257743951,NL +3257743952,3257743959,DE +3257743960,3257744111,NL +3257744112,3257744119,DE +3257744120,3257744671,NL +3257744672,3257744679,DE +3257744680,3257744871,NL +3257744872,3257744879,DE +3257744880,3257745119,NL +3257745120,3257745127,DE +3257745128,3257746527,NL +3257746528,3257746535,DE +3257746536,3257746647,NL +3257746648,3257746655,DE +3257746656,3257746671,NL +3257746672,3257746679,DE +3257746680,3257746919,NL +3257746920,3257746927,DE +3257746928,3257746943,NL 3257746944,3257747455,DE -3257747456,3257748071,NL -3257748072,3257748079,DE -3257748080,3257748479,NL +3257747456,3257747471,NL +3257747472,3257747479,DE +3257747480,3257747607,NL +3257747608,3257747615,DE +3257747616,3257747655,NL +3257747656,3257747663,DE +3257747664,3257747847,NL +3257747848,3257747855,DE +3257747856,3257748015,NL +3257748016,3257748023,DE +3257748024,3257748063,NL +3257748064,3257748071,DE +3257748072,3257748455,NL +3257748456,3257748463,DE +3257748464,3257748479,NL 3257748480,3257749503,DE -3257749504,3257750247,NL -3257750248,3257750255,DE -3257750256,3257751927,NL -3257751928,3257751935,DE -3257751936,3257752271,NL -3257752272,3257752279,DE -3257752280,3257753087,NL +3257749504,3257749663,NL +3257749664,3257749671,DE +3257749672,3257749679,NL +3257749680,3257749687,DE +3257749688,3257749743,NL +3257749744,3257749751,DE +3257749752,3257749759,NL +3257749760,3257749767,DE +3257749768,3257749783,NL +3257749784,3257749791,DE +3257749792,3257749863,NL +3257749864,3257749871,DE +3257749872,3257749943,NL +3257749944,3257749951,DE +3257749952,3257750015,NL +3257750016,3257750023,DE +3257750024,3257750071,NL +3257750072,3257750079,DE +3257750080,3257750151,NL +3257750152,3257750159,DE +3257750160,3257750231,NL +3257750232,3257750239,DE +3257750240,3257750359,NL +3257750360,3257750367,DE +3257750368,3257750471,NL +3257750472,3257750479,DE +3257750480,3257750615,NL +3257750616,3257750623,DE +3257750624,3257750631,NL +3257750632,3257750639,DE +3257750640,3257750655,NL +3257750656,3257750663,DE +3257750664,3257750671,NL +3257750672,3257750679,DE +3257750680,3257750735,NL +3257750736,3257750743,DE +3257750744,3257750759,NL +3257750760,3257750767,DE +3257750768,3257750919,NL +3257750920,3257750935,DE +3257750936,3257751031,NL +3257751032,3257751039,DE +3257751040,3257751199,NL +3257751200,3257751207,DE +3257751208,3257751215,NL +3257751216,3257751223,DE +3257751224,3257751247,NL +3257751248,3257751263,DE +3257751264,3257751279,NL +3257751280,3257751287,DE +3257751288,3257751351,NL +3257751352,3257751359,DE +3257751360,3257751623,NL +3257751624,3257751631,DE +3257751632,3257751639,NL +3257751640,3257751647,DE +3257751648,3257751711,NL +3257751712,3257751719,DE +3257751720,3257751823,NL +3257751824,3257751831,DE +3257751832,3257751871,NL +3257751872,3257751887,DE +3257751888,3257751903,NL +3257751904,3257751911,DE +3257751912,3257751975,NL +3257751976,3257751983,DE +3257751984,3257752023,NL +3257752024,3257752031,DE +3257752032,3257752071,NL +3257752072,3257752079,DE +3257752080,3257752103,NL +3257752104,3257752111,DE +3257752112,3257752135,NL +3257752136,3257752143,DE +3257752144,3257752167,NL +3257752168,3257752183,DE +3257752184,3257752399,NL +3257752400,3257752407,DE +3257752408,3257752495,NL +3257752496,3257752503,DE +3257752504,3257752527,NL +3257752528,3257752543,DE +3257752544,3257752583,NL +3257752584,3257752591,DE +3257752592,3257752607,NL +3257752608,3257752615,DE +3257752616,3257752623,NL +3257752624,3257752631,DE +3257752632,3257752727,NL +3257752728,3257752735,DE +3257752736,3257752783,NL +3257752784,3257752791,DE +3257752792,3257752799,NL +3257752800,3257752807,DE +3257752808,3257752919,NL +3257752920,3257752935,DE +3257752936,3257753087,NL 3257753088,3257756671,DE -3257756672,3257760167,NL +3257756672,3257756735,NL +3257756736,3257756743,DE +3257756744,3257756807,NL +3257756808,3257756823,DE +3257756824,3257756887,NL +3257756888,3257756895,DE +3257756896,3257756919,NL +3257756920,3257756927,DE +3257756928,3257757007,NL +3257757008,3257757015,DE +3257757016,3257757343,NL +3257757344,3257757351,DE +3257757352,3257757375,NL +3257757376,3257757383,DE +3257757384,3257757407,NL +3257757408,3257757423,DE +3257757424,3257757511,NL +3257757512,3257757519,DE +3257757520,3257757639,NL +3257757640,3257757647,DE +3257757648,3257757735,NL +3257757736,3257757751,DE +3257757752,3257757799,NL +3257757800,3257757807,DE +3257757808,3257757815,NL +3257757816,3257757831,DE +3257757832,3257757919,NL +3257757920,3257757935,DE +3257757936,3257758143,NL +3257758144,3257758151,DE +3257758152,3257758239,NL +3257758240,3257758247,DE +3257758248,3257758271,NL +3257758272,3257758279,DE +3257758280,3257758335,NL +3257758336,3257758343,DE +3257758344,3257758375,NL +3257758376,3257758383,DE +3257758384,3257758423,NL +3257758424,3257758431,DE +3257758432,3257758511,NL +3257758512,3257758519,DE +3257758520,3257758567,NL +3257758568,3257758575,DE +3257758576,3257758623,NL +3257758624,3257758639,DE +3257758640,3257758647,NL +3257758648,3257758655,DE +3257758656,3257758855,NL +3257758856,3257758863,DE +3257758864,3257758879,NL +3257758880,3257758887,DE +3257758888,3257758927,NL +3257758928,3257758935,DE +3257758936,3257759087,NL +3257759088,3257759095,DE +3257759096,3257759135,NL +3257759136,3257759151,DE +3257759152,3257759159,NL +3257759160,3257759167,DE +3257759168,3257759255,NL +3257759256,3257759263,DE +3257759264,3257759271,NL +3257759272,3257759279,DE +3257759280,3257759287,NL +3257759288,3257759295,DE +3257759296,3257759415,NL +3257759416,3257759423,DE +3257759424,3257759647,NL +3257759648,3257759671,DE +3257759672,3257759735,NL +3257759736,3257759743,DE +3257759744,3257759791,NL +3257759792,3257759799,DE +3257759800,3257759847,NL +3257759848,3257759863,DE +3257759864,3257759871,NL +3257759872,3257759879,DE +3257759880,3257759887,NL +3257759888,3257759903,DE +3257759904,3257759975,NL +3257759976,3257759983,DE +3257759984,3257760015,NL +3257760016,3257760023,DE +3257760024,3257760039,NL +3257760040,3257760047,DE +3257760048,3257760095,NL +3257760096,3257760103,DE +3257760104,3257760167,NL 3257760168,3257760175,DE -3257760176,3257760239,NL -3257760240,3257760247,DE -3257760248,3257761279,NL +3257760176,3257760231,NL +3257760232,3257760239,DE +3257760240,3257760263,NL +3257760264,3257760271,DE +3257760272,3257760303,NL +3257760304,3257760311,DE +3257760312,3257760359,NL +3257760360,3257760367,DE +3257760368,3257760431,NL +3257760432,3257760439,DE +3257760440,3257760495,NL +3257760496,3257760503,DE +3257760504,3257760559,NL +3257760560,3257760567,DE +3257760568,3257760655,NL +3257760656,3257760663,DE +3257760664,3257760791,NL +3257760792,3257760799,DE +3257760800,3257760839,NL +3257760840,3257760847,DE +3257760848,3257760863,NL +3257760864,3257760871,DE +3257760872,3257760927,NL +3257760928,3257760935,DE +3257760936,3257760959,NL +3257760960,3257760967,DE +3257760968,3257761055,NL +3257761056,3257761071,DE +3257761072,3257761151,NL +3257761152,3257761159,DE +3257761160,3257761279,NL 3257761280,3257761791,DE -3257761792,3257761919,NL -3257761920,3257761927,DE -3257761928,3257762799,NL -3257762800,3257762807,DE -3257762808,3257762911,NL -3257762912,3257762919,DE -3257762920,3257763327,NL +3257761792,3257761839,NL +3257761840,3257761847,DE +3257761848,3257761879,NL +3257761880,3257761887,DE +3257761888,3257761903,NL +3257761904,3257761919,DE +3257761920,3257761951,NL +3257761952,3257761959,DE +3257761960,3257762023,NL +3257762024,3257762031,DE +3257762032,3257762175,NL +3257762176,3257762183,DE +3257762184,3257762215,NL +3257762216,3257762223,DE +3257762224,3257762247,NL +3257762248,3257762263,DE +3257762264,3257762359,NL +3257762360,3257762367,DE +3257762368,3257762391,NL +3257762392,3257762399,DE +3257762400,3257762407,NL +3257762408,3257762415,DE +3257762416,3257762447,NL +3257762448,3257762455,DE +3257762456,3257762591,NL +3257762592,3257762599,DE +3257762600,3257762655,NL +3257762656,3257762663,DE +3257762664,3257762679,NL +3257762680,3257762695,DE +3257762696,3257762711,NL +3257762712,3257762719,DE +3257762720,3257762807,NL +3257762808,3257762815,DE +3257762816,3257762863,NL +3257762864,3257762871,DE +3257762872,3257762951,NL +3257762952,3257762959,DE +3257762960,3257763055,NL +3257763056,3257763063,DE +3257763064,3257763151,NL +3257763152,3257763159,DE +3257763160,3257763247,NL +3257763248,3257763255,DE +3257763256,3257763327,NL 3257763328,3257763839,DE -3257763840,3257765047,NL -3257765048,3257765055,DE -3257765056,3257765375,NL +3257763840,3257763855,NL +3257763856,3257763871,DE +3257763872,3257763927,NL +3257763928,3257763935,DE +3257763936,3257763943,NL +3257763944,3257763951,DE +3257763952,3257763999,NL +3257764000,3257764007,DE +3257764008,3257764247,NL +3257764248,3257764255,DE +3257764256,3257764287,NL +3257764288,3257764295,DE +3257764296,3257764487,NL +3257764488,3257764511,DE +3257764512,3257764543,NL +3257764544,3257764551,DE +3257764552,3257764591,NL +3257764592,3257764599,DE +3257764600,3257764647,NL +3257764648,3257764655,DE +3257764656,3257764799,NL +3257764800,3257764807,DE +3257764808,3257764879,NL +3257764880,3257764887,DE +3257764888,3257764927,NL +3257764928,3257764935,DE +3257764936,3257764983,NL +3257764984,3257764991,DE +3257764992,3257765055,NL +3257765056,3257765063,DE +3257765064,3257765263,NL +3257765264,3257765279,DE +3257765280,3257765375,NL 3257765376,3257768959,DE -3257768960,3257769751,NL -3257769752,3257769759,DE -3257769760,3257771007,NL +3257768960,3257769071,NL +3257769072,3257769079,DE +3257769080,3257769215,NL +3257769216,3257769223,DE +3257769224,3257769543,NL +3257769544,3257769551,DE +3257769552,3257769567,NL +3257769568,3257769575,DE +3257769576,3257769703,NL +3257769704,3257769711,DE +3257769712,3257769719,NL +3257769720,3257769727,DE +3257769728,3257770023,NL +3257770024,3257770031,DE +3257770032,3257770039,NL +3257770040,3257770047,DE +3257770048,3257770071,NL +3257770072,3257770079,DE +3257770080,3257770095,NL +3257770096,3257770103,DE +3257770104,3257770151,NL +3257770152,3257770159,DE +3257770160,3257770295,NL +3257770296,3257770303,DE +3257770304,3257770359,NL +3257770360,3257770367,DE +3257770368,3257770455,NL +3257770456,3257770463,DE +3257770464,3257770511,NL +3257770512,3257770519,DE +3257770520,3257770599,NL +3257770600,3257770607,DE +3257770608,3257770623,NL +3257770624,3257770631,DE +3257770632,3257770823,NL +3257770824,3257770831,DE +3257770832,3257770911,NL +3257770912,3257770919,DE +3257770920,3257771007,NL 3257771008,3257772543,DE -3257772544,3257772575,NL -3257772576,3257772583,DE -3257772584,3257775103,NL +3257772544,3257772631,NL +3257772632,3257772639,DE +3257772640,3257772735,NL +3257772736,3257772743,DE +3257772744,3257772783,NL +3257772784,3257772791,DE +3257772792,3257772815,NL +3257772816,3257772831,DE +3257772832,3257772847,NL +3257772848,3257772855,DE +3257772856,3257772895,NL +3257772896,3257772903,DE +3257772904,3257772991,NL +3257772992,3257772999,DE +3257773000,3257773095,NL +3257773096,3257773103,DE +3257773104,3257773199,NL +3257773200,3257773223,DE +3257773224,3257773303,NL +3257773304,3257773311,DE +3257773312,3257773391,NL +3257773392,3257773399,DE +3257773400,3257773415,NL +3257773416,3257773423,DE +3257773424,3257773439,NL +3257773440,3257773447,DE +3257773448,3257773767,NL +3257773768,3257773775,DE +3257773776,3257773799,NL +3257773800,3257773807,DE +3257773808,3257773831,NL +3257773832,3257773839,DE +3257773840,3257773847,NL +3257773848,3257773855,DE +3257773856,3257773903,NL +3257773904,3257773919,DE +3257773920,3257773951,NL +3257773952,3257773959,DE +3257773960,3257774007,NL +3257774008,3257774015,DE +3257774016,3257774055,NL +3257774056,3257774063,DE +3257774064,3257774287,NL +3257774288,3257774295,DE +3257774296,3257774335,NL +3257774336,3257774343,DE +3257774344,3257774359,NL +3257774360,3257774367,DE +3257774368,3257774375,NL +3257774376,3257774383,DE +3257774384,3257774487,NL +3257774488,3257774495,DE +3257774496,3257774775,NL +3257774776,3257774791,DE +3257774792,3257774871,NL +3257774872,3257774879,DE +3257774880,3257774951,NL +3257774952,3257774959,DE +3257774960,3257774983,NL +3257774984,3257774999,DE +3257775000,3257775047,NL +3257775048,3257775055,DE +3257775056,3257775103,NL 3257775104,3257776639,DE -3257776640,3257779199,NL +3257776640,3257776663,NL +3257776664,3257776671,DE +3257776672,3257776727,NL +3257776728,3257776735,DE +3257776736,3257776767,NL +3257776768,3257776775,DE +3257776776,3257776983,NL +3257776984,3257776991,DE +3257776992,3257777047,NL +3257777048,3257777055,DE +3257777056,3257777111,NL +3257777112,3257777119,DE +3257777120,3257777151,NL +3257777152,3257777159,DE +3257777160,3257777223,NL +3257777224,3257777231,DE +3257777232,3257777335,NL +3257777336,3257777343,DE +3257777344,3257777487,NL +3257777488,3257777495,DE +3257777496,3257777551,NL +3257777552,3257777559,DE +3257777560,3257777575,NL +3257777576,3257777583,DE +3257777584,3257777751,NL +3257777752,3257777767,DE +3257777768,3257777799,NL +3257777800,3257777807,DE +3257777808,3257777935,NL +3257777936,3257777943,DE +3257777944,3257777991,NL +3257777992,3257777999,DE +3257778000,3257778023,NL +3257778024,3257778031,DE +3257778032,3257778047,NL +3257778048,3257778055,DE +3257778056,3257778071,NL +3257778072,3257778079,DE +3257778080,3257778087,NL +3257778088,3257778095,DE +3257778096,3257778159,NL +3257778160,3257778167,DE +3257778168,3257778439,NL +3257778440,3257778447,DE +3257778448,3257778479,NL +3257778480,3257778487,DE +3257778488,3257778503,NL +3257778504,3257778511,DE +3257778512,3257778583,NL +3257778584,3257778591,DE +3257778592,3257778663,NL +3257778664,3257778671,DE +3257778672,3257778815,NL +3257778816,3257778823,DE +3257778824,3257778895,NL +3257778896,3257778903,DE +3257778904,3257778943,NL +3257778944,3257778951,DE +3257778952,3257778959,NL +3257778960,3257778975,DE +3257778976,3257779055,NL +3257779056,3257779063,DE +3257779064,3257779079,NL +3257779080,3257779087,DE +3257779088,3257779111,NL +3257779112,3257779127,DE +3257779128,3257779199,NL 3257779200,3257780735,DE -3257780736,3257782271,NL +3257780736,3257780743,NL +3257780744,3257780751,DE +3257780752,3257780775,NL +3257780776,3257780783,DE +3257780784,3257780967,NL +3257780968,3257780983,DE +3257780984,3257781111,NL +3257781112,3257781119,DE +3257781120,3257781135,NL +3257781136,3257781143,DE +3257781144,3257781255,NL +3257781256,3257781263,DE +3257781264,3257781279,NL +3257781280,3257781287,DE +3257781288,3257781391,NL +3257781392,3257781399,DE +3257781400,3257781479,NL +3257781480,3257781487,DE +3257781488,3257781567,NL +3257781568,3257781575,DE +3257781576,3257781615,NL +3257781616,3257781623,DE +3257781624,3257781639,NL +3257781640,3257781647,DE +3257781648,3257781711,NL +3257781712,3257781719,DE +3257781720,3257781791,NL +3257781792,3257781799,DE +3257781800,3257781839,NL +3257781840,3257781847,DE +3257781848,3257781895,NL +3257781896,3257781903,DE +3257781904,3257781919,NL +3257781920,3257781927,DE +3257781928,3257781943,NL +3257781944,3257781951,DE +3257781952,3257781975,NL +3257781976,3257781999,DE +3257782000,3257782015,NL +3257782016,3257782023,DE +3257782024,3257782031,NL +3257782032,3257782039,DE +3257782040,3257782103,NL +3257782104,3257782111,DE +3257782112,3257782191,NL +3257782192,3257782207,DE +3257782208,3257782239,NL +3257782240,3257782247,DE +3257782248,3257782271,NL 3257782272,3257784831,DE -3257784832,3257785111,NL -3257785112,3257785119,DE -3257785120,3257786807,NL -3257786808,3257786815,DE -3257786816,3257786879,NL +3257784832,3257785087,NL +3257785088,3257785095,DE +3257785096,3257785151,NL +3257785152,3257785159,DE +3257785160,3257785183,NL +3257785184,3257785191,DE +3257785192,3257785343,NL +3257785344,3257785359,DE +3257785360,3257785375,NL +3257785376,3257785383,DE +3257785384,3257785415,NL +3257785416,3257785431,DE +3257785432,3257785663,NL +3257785664,3257785671,DE +3257785672,3257785679,NL +3257785680,3257785695,DE +3257785696,3257785719,NL +3257785720,3257785727,DE +3257785728,3257785735,NL +3257785736,3257785743,DE +3257785744,3257785807,NL +3257785808,3257785815,DE +3257785816,3257786079,NL +3257786080,3257786087,DE +3257786088,3257786271,NL +3257786272,3257786279,DE +3257786280,3257786335,NL +3257786336,3257786343,DE +3257786344,3257786359,NL +3257786360,3257786367,DE +3257786368,3257786383,NL +3257786384,3257786391,DE +3257786392,3257786415,NL +3257786416,3257786423,DE +3257786424,3257786431,NL +3257786432,3257786439,DE +3257786440,3257786559,NL +3257786560,3257786567,DE +3257786568,3257786623,NL +3257786624,3257786631,DE +3257786632,3257786647,NL +3257786648,3257786655,DE +3257786656,3257786703,NL +3257786704,3257786711,DE +3257786712,3257786807,NL +3257786808,3257786823,DE +3257786824,3257786839,NL +3257786840,3257786847,DE +3257786848,3257786863,NL +3257786864,3257786871,DE +3257786872,3257786879,NL 3257786880,3257787391,DE -3257787392,3257787967,NL +3257787392,3257787503,NL +3257787504,3257787511,DE +3257787512,3257787695,NL +3257787696,3257787703,DE +3257787704,3257787727,NL +3257787728,3257787735,DE +3257787736,3257787751,NL +3257787752,3257787759,DE +3257787760,3257787879,NL +3257787880,3257787887,DE +3257787888,3257787911,NL +3257787912,3257787919,DE +3257787920,3257787967,NL 3257787968,3257787975,DE -3257787976,3257788007,NL -3257788008,3257788015,DE -3257788016,3257788415,NL +3257787976,3257787999,NL +3257788000,3257788015,DE +3257788016,3257788071,NL +3257788072,3257788079,DE +3257788080,3257788095,NL +3257788096,3257788103,DE +3257788104,3257788119,NL +3257788120,3257788127,DE +3257788128,3257788175,NL +3257788176,3257788183,DE +3257788184,3257788231,NL +3257788232,3257788239,DE +3257788240,3257788247,NL +3257788248,3257788255,DE +3257788256,3257788415,NL 3257788416,3257789951,DE -3257789952,3257790759,NL -3257790760,3257790767,DE -3257790768,3257792135,NL -3257792136,3257792143,DE -3257792144,3257794559,NL +3257789952,3257789975,NL +3257789976,3257789983,DE +3257789984,3257789999,NL +3257790000,3257790007,DE +3257790008,3257790039,NL +3257790040,3257790047,DE +3257790048,3257790159,NL +3257790160,3257790167,DE +3257790168,3257790191,NL +3257790192,3257790199,DE +3257790200,3257790239,NL +3257790240,3257790247,DE +3257790248,3257790255,NL +3257790256,3257790263,DE +3257790264,3257790319,NL +3257790320,3257790327,DE +3257790328,3257790391,NL +3257790392,3257790407,DE +3257790408,3257790479,NL +3257790480,3257790503,DE +3257790504,3257790623,NL +3257790624,3257790639,DE +3257790640,3257790663,NL +3257790664,3257790671,DE +3257790672,3257790711,NL +3257790712,3257790719,DE +3257790720,3257790847,NL +3257790848,3257790855,DE +3257790856,3257790903,NL +3257790904,3257790919,DE +3257790920,3257790975,NL +3257790976,3257790991,DE +3257790992,3257790999,NL +3257791000,3257791007,DE +3257791008,3257791015,NL +3257791016,3257791023,DE +3257791024,3257791047,NL +3257791048,3257791055,DE +3257791056,3257791151,NL +3257791152,3257791159,DE +3257791160,3257791223,NL +3257791224,3257791231,DE +3257791232,3257791255,NL +3257791256,3257791263,DE +3257791264,3257791271,NL +3257791272,3257791287,DE +3257791288,3257791327,NL +3257791328,3257791335,DE +3257791336,3257791359,NL +3257791360,3257791375,DE +3257791376,3257791503,NL +3257791504,3257791511,DE +3257791512,3257791527,NL +3257791528,3257791535,DE +3257791536,3257791623,NL +3257791624,3257791631,DE +3257791632,3257791703,NL +3257791704,3257791711,DE +3257791712,3257791727,NL +3257791728,3257791743,DE +3257791744,3257791831,NL +3257791832,3257791839,DE +3257791840,3257791863,NL +3257791864,3257791871,DE +3257791872,3257791879,NL +3257791880,3257791887,DE +3257791888,3257791895,NL +3257791896,3257791903,DE +3257791904,3257791951,NL +3257791952,3257791959,DE +3257791960,3257792095,NL +3257792096,3257792103,DE +3257792104,3257792127,NL +3257792128,3257792135,DE +3257792136,3257792143,NL +3257792144,3257792159,DE +3257792160,3257792191,NL +3257792192,3257792199,DE +3257792200,3257792207,NL +3257792208,3257792215,DE +3257792216,3257792383,NL +3257792384,3257792391,DE +3257792392,3257792399,NL +3257792400,3257792407,DE +3257792408,3257792487,NL +3257792488,3257792495,DE +3257792496,3257792503,NL +3257792504,3257792511,DE +3257792512,3257792607,NL +3257792608,3257792615,DE +3257792616,3257792719,NL +3257792720,3257792727,DE +3257792728,3257792783,NL +3257792784,3257792791,DE +3257792792,3257792927,NL +3257792928,3257792935,DE +3257792936,3257793087,NL +3257793088,3257793095,DE +3257793096,3257793167,NL +3257793168,3257793175,DE +3257793176,3257793215,NL +3257793216,3257793223,DE +3257793224,3257793391,NL +3257793392,3257793399,DE +3257793400,3257793415,NL +3257793416,3257793431,DE +3257793432,3257793439,NL +3257793440,3257793447,DE +3257793448,3257793519,NL +3257793520,3257793527,DE +3257793528,3257793551,NL +3257793552,3257793559,DE +3257793560,3257793839,NL +3257793840,3257793847,DE +3257793848,3257793919,NL +3257793920,3257793927,DE +3257793928,3257793951,NL +3257793952,3257793959,DE +3257793960,3257794095,NL +3257794096,3257794103,DE +3257794104,3257794135,NL +3257794136,3257794143,DE +3257794144,3257794351,NL +3257794352,3257794359,DE +3257794360,3257794511,NL +3257794512,3257794519,DE +3257794520,3257794559,NL 3257794560,3257827327,GB 3257827328,3257827839,IE 3257827840,3257829375,GB @@ -39790,7 +70737,8 @@ 3257978368,3257978623,BG 3257978624,3257978879,ES 3257978880,3257979135,FR -3257979136,3257979647,GB +3257979136,3257979391,UA +3257979392,3257979647,GB 3257979648,3257979903,DE 3257979904,3257980159,UA 3257980160,3257980415,SE @@ -39804,20 +70752,16 @@ 3257987328,3257987583,CZ 3257987584,3257991167,AT 3257991168,3258003967,DE -3258004480,3258005503,DE -3258005760,3258013183,DE -3258013696,3258018815,DE -3258019328,3258021887,DE -3258023168,3258023679,DE -3258023936,3258056703,DE +3258003968,3258004479,RU +3258004480,3258056703,DE 3258056704,3258056959,UA -3258057216,3258057727,CZ +3258056960,3258058239,CZ 3258058240,3258058495,RU 3258058496,3258059007,RO 3258059008,3258059263,UA 3258059264,3258059519,RU 3258059520,3258059775,RO -3258062848,3258063871,CZ +3258059776,3258063871,CZ 3258063872,3258064127,AT 3258064128,3258064383,FR 3258064384,3258065151,GB @@ -39857,7 +70801,8 @@ 3258075904,3258076159,PL 3258076160,3258076415,BG 3258076416,3258076927,FR -3258076928,3258077439,GB +3258076928,3258077183,UA +3258077184,3258077439,GB 3258077440,3258077695,UA 3258077696,3258077951,NL 3258077952,3258078207,PL @@ -39892,7 +70837,7 @@ 3258085888,3258086143,UA 3258086144,3258086399,AT 3258086400,3258086655,UA -3258086656,3258087167,GB +3258086912,3258087167,GB 3258087168,3258087423,UA 3258087424,3258087679,RU 3258087680,3258087935,GB @@ -39902,6 +70847,7 @@ 3258088704,3258088959,UA 3258088960,3258089215,RO 3258089216,3258089471,FR +3258089472,3258097663,CZ 3258097664,3258097919,DE 3258097920,3258098175,UA 3258098176,3258098431,DE @@ -39925,20 +70871,18 @@ 3258102784,3258103039,PL 3258103040,3258103295,SE 3258103296,3258103551,DE -3258103552,3258103807,GB +3258103552,3258103807,AE 3258103808,3258104063,SE 3258104064,3258104319,GB 3258104320,3258104575,PL 3258104576,3258104831,DE -3258105088,3258105599,CZ +3258104832,3258105599,CZ 3258105600,3258105855,DE 3258105856,3258109951,CZ 3258109952,3258110207,DK 3258110208,3258111487,CZ 3258111488,3258111743,PL -3258111744,3258119679,CZ -3258120192,3258120703,CZ -3258120960,3258121215,CZ +3258111744,3258121215,CZ 3258121216,3258121471,PL 3258121472,3258121727,AT 3258121728,3258121983,UA @@ -39947,13 +70891,11 @@ 3258128896,3258129151,MC 3258129152,3258163967,FR 3258163968,3258164223,BJ -3258164224,3258164479,FR -3258164480,3258164735,MG -3258164736,3258167551,FR +3258164224,3258167551,FR 3258167552,3258167807,ES 3258167808,3258187775,FR -3258187776,3258231295,SE -3258231296,3258232831,NO +3258187776,3258231551,SE +3258231552,3258232831,NO 3258232832,3258250495,SE 3258250496,3258250751,NO 3258250752,3258251007,SE @@ -39986,22 +70928,18 @@ 3258354688,3258355711,BG 3258355712,3258356735,NL 3258356736,3258357759,RU -3258357760,3258359807,UA -3258359808,3258360831,RU +3258357760,3258360831,UA 3258360832,3258361855,SE 3258361856,3258362879,IL 3258362880,3258363903,IM 3258363904,3258364927,RU -3258364928,3258365951,CS +3258364928,3258365951,RS 3258365952,3258366975,UA 3258366976,3258367999,PL 3258368000,3258384383,KW -3258384384,3258419199,DE -3258419456,3258427647,DE +3258384384,3258427647,DE 3258427648,3258427903,RO -3258427904,3258428159,DE -3258428416,3258431999,DE -3258432512,3258449919,DE +3258427904,3258449919,DE 3258449920,3258502682,CH 3258502683,3258502683,FR 3258502684,3258503935,CH @@ -40009,13 +70947,9 @@ 3258504192,3258504703,CH 3258504704,3258504959,DE 3258504960,3258505215,IL -3258505216,3258511871,CH -3258512128,3258514687,CH -3258514944,3258515455,CH +3258505216,3258515455,CH 3258515456,3258580991,FR -3258580992,3258601983,RU -3258601984,3258602495,UA -3258602496,3258625791,RU +3258580992,3258625791,RU 3258625792,3258626047,UA 3258626048,3258646527,RU 3258646528,3258691583,DE @@ -40031,9 +70965,7 @@ 3258694144,3258694399,RU 3258694400,3258694655,DE 3258694656,3258694911,GB -3258694912,3258701567,DE -3258701824,3258710271,DE -3258710528,3258712063,DE +3258694912,3258712063,DE 3258712064,3258728447,GB 3258728448,3258729471,FR 3258729472,3258729727,DE @@ -40055,44 +70987,57 @@ 3258746880,3258748927,DE 3258748928,3258764287,GB 3258764288,3258764543,DE -3258764544,3258764799,CH +3258764544,3258764799,RU 3258764800,3258765055,BE 3258765056,3258765311,NL 3258765312,3258767615,GB 3258767616,3258767871,CH -3258767872,3258818047,GB +3258767872,3258802175,GB +3258802176,3258806271,LU +3258806272,3258818047,GB 3258818048,3258818303,SE 3258818304,3258843135,GB 3258843136,3258843391,RU 3258843392,3258848767,GB 3258848768,3258849023,RO -3258849024,3258849279,RU -3258849280,3258883297,GB -3258883328,3258902783,GB +3258849024,3258849279,DE +3258849280,3258859519,GB +3258859520,3258859775,BY +3258859776,3258902783,GB 3258902784,3258903039,RU 3258903040,3258903295,FR 3258903296,3258903551,GB 3258903552,3258903807,DE -3258903808,3258904063,RU 3258904064,3258941439,GB 3258941440,3258943487,PL 3258943488,3258944511,BG -3258944512,3258945535,UA -3258945536,3258946559,RU +3258944512,3258946559,RU 3258946560,3258947583,CH 3258947584,3258948607,RO -3258948608,3258949631,DK +3258948608,3258949631,RU 3258949632,3258972159,GR 3258972160,3258974207,NO 3258974208,3259023103,DE -3259023104,3259023119,IT -3259023120,3259032551,DE +3259023104,3259023107,ES +3259023108,3259031655,DE +3259031656,3259031659,ES +3259031660,3259031895,DE +3259031896,3259031899,ES +3259031900,3259032199,DE +3259032200,3259032203,ES +3259032204,3259032439,DE +3259032440,3259032443,ES +3259032444,3259032551,DE 3259032552,3259032559,IT 3259032560,3259032831,DE 3259032832,3259032879,GB 3259032880,3259034319,DE 3259034320,3259034327,GB -3259034328,3259039743,DE +3259034328,3259035447,DE +3259035448,3259035455,IT +3259035456,3259036031,DE +3259036032,3259036035,ES +3259036036,3259039743,DE 3259039744,3259062015,PT 3259062016,3259062271,GW 3259062272,3259105279,PT @@ -40114,7 +71059,9 @@ 3259236864,3259237119,CH 3259237120,3259269375,SE 3259269376,3259269631,FR -3259269632,3259301887,SE +3259269632,3259292415,SE +3259292416,3259292671,IT +3259292672,3259301887,SE 3259301888,3259302143,DE 3259302144,3259302399,AE 3259302400,3259303423,CH @@ -40123,14 +71070,9 @@ 3259310080,3259310335,FR 3259310336,3259311103,DK 3259311104,3259311615,DE -3259311616,3259311871,CH -3259311872,3259312639,DE +3259311616,3259312639,EU 3259312640,3259313151,GB -3259313152,3259313407,SE -3259313408,3259313663,FR -3259313664,3259314175,DE -3259314176,3259316223,BE -3259316224,3259317247,DE +3259313152,3259317247,EU 3259317248,3259318271,CH 3259318272,3259318311,GB 3259318312,3259318319,BE @@ -40201,7 +71143,7 @@ 3259344896,3259345151,GB 3259345152,3259345407,IE 3259345408,3259345663,CH -3259345664,3259346943,DE +3259345664,3259346943,EU 3259346944,3259347199,SE 3259347200,3259347455,DE 3259347456,3259347967,CH @@ -40221,14 +71163,26 @@ 3259355136,3259359231,NO 3259359232,3259367423,ES 3259367424,3259432959,GB -3259432960,3259498495,SE +3259432960,3259435263,SE +3259435264,3259435519,IT +3259435520,3259457279,SE +3259457280,3259457535,IT +3259457536,3259460351,SE +3259460352,3259460607,DE +3259460608,3259465215,SE +3259465216,3259465471,KH +3259465472,3259492351,SE +3259492352,3259493375,GB +3259493376,3259498495,SE 3259498496,3259506943,GB 3259506944,3259507199,ES 3259507200,3259507711,GB 3259507712,3259507967,CH 3259507968,3259508223,GB 3259508224,3259508479,ES -3259508480,3259515647,GB +3259508480,3259511807,GB +3259511808,3259512063,IM +3259512064,3259515647,GB 3259515648,3259515903,ES 3259515904,3259518207,GB 3259518208,3259518463,ES @@ -40236,23 +71190,7 @@ 3259518720,3259518975,ES 3259518976,3259521023,GB 3259521024,3259521535,NL -3259521536,3259524863,GB -3259524864,3259525119,ES -3259525120,3259530751,GB -3259530752,3259531007,NL -3259531008,3259531263,GB -3259531264,3259531519,CH -3259531520,3259531663,GB -3259531664,3259531679,NL -3259531680,3259532031,GB -3259532032,3259532047,US -3259532048,3259534847,GB -3259534848,3259534863,IE -3259534864,3259537407,GB -3259537408,3259537919,ES -3259537920,3259538687,GB -3259538688,3259538943,ES -3259538944,3259541503,GB +3259521536,3259541503,GB 3259541504,3259543551,NL 3259543552,3259545599,GB 3259545600,3259546111,LB @@ -40275,7 +71213,9 @@ 3259596800,3259597055,ES 3259597056,3259599359,GB 3259599360,3259599615,FR -3259599616,3259601151,GB +3259599616,3259600639,GB +3259600640,3259600895,IM +3259600896,3259601151,GB 3259601152,3259601407,IE 3259601408,3259614463,GB 3259614464,3259614719,DE @@ -40289,7 +71229,9 @@ 3259628032,3259628543,CH 3259628544,3259630335,GB 3259630336,3259630591,ES -3259630592,3259633407,GB +3259630592,3259632127,GB +3259632128,3259632383,IM +3259632384,3259633407,GB 3259633408,3259633663,DE 3259633664,3259635711,GB 3259635712,3259635967,ES @@ -40327,9 +71269,7 @@ 3259701760,3259702303,DE 3259702304,3259751423,GB 3259751424,3259751431,FR -3259751432,3259751479,GB -3259751480,3259751487,FR -3259751488,3259751551,GB +3259751432,3259751551,GB 3259751552,3259751615,FR 3259751616,3259752191,GB 3259752192,3259752447,FR @@ -40338,8 +71278,7 @@ 3259814400,3259814655,AT 3259814656,3259821823,DE 3259821824,3259822079,AT -3259822080,3259823103,DE -3259824128,3259851823,DE +3259822080,3259851823,DE 3259851824,3259851831,GB 3259851832,3259891711,DE 3259891712,3259957247,BE @@ -40353,19 +71292,20 @@ 3259964416,3259965439,GB 3259965440,3259966463,RU 3259966464,3259967487,DE -3259967488,3259968511,CS -3259968512,3259969535,RO +3259967488,3259968511,RS +3259968512,3259969535,RU 3259969536,3259970559,FR 3259970560,3259971583,CZ 3259971584,3259972607,IT 3259972608,3259973631,UA 3259973632,3259981823,PT +3259981824,3259990015,EG 3259990016,3260006399,FR 3260006400,3260014591,IT 3260014592,3260018687,NL 3260018688,3260019711,GB 3260019712,3260021247,DE -3260021248,3260021759,GB +3260021248,3260021759,RU 3260021760,3260022271,GR 3260022272,3260022783,NL 3260022784,3260237775,GB @@ -40377,9 +71317,7 @@ 3260303936,3260304127,BY 3260304128,3260322047,RU 3260322048,3260322303,BY -3260322304,3260339071,RU -3260339072,3260339135,TJ -3260339136,3260353535,RU +3260322304,3260353535,RU 3260353536,3260353791,AZ 3260353792,3260354559,RU 3260354560,3260355839,KZ @@ -40389,7 +71327,6 @@ 3260481536,3260547071,RU 3260547072,3260547327,DE 3260547328,3260547583,UA -3260547584,3260547839,NL 3260547840,3260548095,PL 3260548096,3260548351,IE 3260548352,3260548607,DK @@ -40400,15 +71337,13 @@ 3260549632,3260549887,DE 3260549888,3260550143,RU 3260550144,3260550399,PL -3260550400,3260550655,NL +3260550400,3260550655,DE 3260550656,3260550911,RU 3260550912,3260551167,ES 3260551168,3260553983,DE 3260553984,3260554239,GB 3260554240,3260555263,SE -3260555264,3260556703,HU -3260556704,3260556799,SK -3260556800,3260559615,HU +3260555264,3260559615,HU 3260559616,3260559647,RO 3260559648,3260559711,HU 3260559712,3260559719,RO @@ -40440,7 +71375,6 @@ 3260600320,3260601343,RU 3260601344,3260601855,CH 3260601856,3260602367,PL -3260602368,3260602879,AT 3260602880,3260603903,UA 3260603904,3260604415,FR 3260604416,3260604927,PL @@ -40463,9 +71397,7 @@ 3260613888,3260614143,DK 3260614144,3260626175,FI 3260626176,3260626431,ES -3260626432,3260626943,FI -3260626944,3260627199,SE -3260627200,3260668415,FI +3260626432,3260668415,FI 3260668416,3260668671,ES 3260668672,3260668927,GB 3260668928,3260669183,FI @@ -40493,11 +71425,11 @@ 3260895232,3260898303,SE 3260898304,3260899327,ES 3260899328,3260900095,CH +3260900096,3260900607,EU 3260900608,3260901119,NL 3260901120,3260903423,DE 3260903424,3260906239,CH -3260906240,3260906367,DE -3260906368,3260906495,GB +3260906240,3260906495,DE 3260906496,3260907519,FR 3260907520,3260915711,GB 3260915712,3260923903,UA @@ -40505,29 +71437,29 @@ 3261071360,3261136895,AT 3261136896,3261150143,DE 3261150144,3261150207,US -3261150208,3261173759,DE -3261173760,3261173767,AT -3261173768,3261173987,DE +3261150208,3261170687,DE +3261170688,3261170943,CH +3261170944,3261173987,DE 3261173988,3261173991,AT 3261173992,3261174007,DE 3261174008,3261174015,AT 3261174016,3261202431,DE -3261202432,3261236527,FR -3261236528,3261236543,GB -3261236544,3261236863,FR -3261236864,3261236991,GB -3261236992,3261241503,FR -3261241504,3261241535,GB -3261241536,3261267967,FR -3261267968,3261333503,DE -3261333504,3261399039,FI +3261202432,3261267967,FR +3261267968,3261297663,DE +3261297664,3261297919,RU +3261297920,3261298175,PL +3261298176,3261333503,DE +3261333504,3261346047,FI +3261346048,3261346175,AX +3261346176,3261399039,FI 3261399040,3261472767,GB 3261472768,3261503487,RO 3261503488,3261503935,MD 3261503936,3261530111,RO -3261530112,3261595647,SE -3261595648,3261599743,NL -3261600768,3261661183,NL +3261530112,3261570303,SE +3261570304,3261570559,IT +3261570560,3261595647,SE +3261595648,3261661183,NL 3261661184,3261669375,RO 3261669376,3261673471,MT 3261673472,3261675519,IT @@ -40541,6 +71473,7 @@ 3261685760,3261687807,DE 3261687808,3261689855,RO 3261689856,3261691903,GB +3261691904,3261693951,EU 3261693952,3261694463,NL 3261694464,3261694975,RU 3261694976,3261695487,PL @@ -40564,40 +71497,9 @@ 3261743104,3261751295,MT 3261751296,3261759487,EE 3261759488,3261767679,IE -3261767680,3261769215,CS -3261769216,3261769343,RS -3261769344,3261769983,CS -3261769984,3261770239,RS -3261770240,3261771775,CS -3261771776,3261773055,RS -3261773056,3261773447,CS -3261773448,3261773455,RS -3261773456,3261773463,CS -3261773464,3261773503,RS -3261773504,3261773855,CS -3261773856,3261773856,RS -3261773857,3261773863,CS -3261773864,3261774015,RS -3261774016,3261774047,CS -3261774048,3261774063,RS -3261774064,3261774079,CS -3261774080,3261774143,CS -3261774144,3261774175,CS -3261774176,3261774191,CS -3261774192,3261774207,RS -3261774208,3261774223,CS -3261774224,3261774239,CS -3261774240,3261774271,CS -3261774272,3261774287,RS -3261774288,3261774351,CS -3261774352,3261774399,RS -3261774400,3261774591,CS -3261774592,3261774719,RS -3261774720,3261774847,CS -3261774848,3261775871,RS +3261767680,3261775871,RS 3261775872,3261776383,PL -3261776384,3261776895,RU -3261776896,3261777407,PL +3261776384,3261777407,RU 3261777408,3261777919,KZ 3261777920,3261778431,PL 3261778432,3261778943,RU @@ -40608,7 +71510,7 @@ 3261780992,3261781503,RO 3261781504,3261782015,PL 3261782016,3261783039,UA -3261783040,3261783551,GB +3261783040,3261784063,GB 3261784064,3261796351,AT 3261796352,3261796607,GB 3261796608,3261796863,RU @@ -40644,18 +71546,18 @@ 3261867956,3261923327,CZ 3261923328,3261988863,NL 3261988864,3261989119,SE -3261989120,3261990399,FI -3261990656,3261993471,FI +3261989120,3261993471,FI 3261993472,3261993727,RU 3261993728,3261995263,FI 3261995264,3261995519,DE 3261995520,3261995775,PL 3261995776,3261996031,FI 3261996032,3261996287,NL -3261996288,3262005247,FI +3261996288,3262005759,FI 3262005760,3262006015,RU 3262006016,3262006271,NL 3262006272,3262006527,RO +3262006528,3262006783,FR 3262006784,3262007039,SE 3262007040,3262007295,IT 3262007296,3262007551,SA @@ -40682,25 +71584,51 @@ 3262023936,3262027263,FI 3262027264,3262027519,TR 3262027520,3262027775,BE +3262027776,3262029823,FI 3262029824,3262030847,US 3262030848,3262031871,FR -3262031872,3262032383,FI -3262033920,3262034123,FI -3262034124,3262034127,AX -3262034128,3262034455,FI -3262034456,3262034463,AX -3262034464,3262034527,FI -3262034528,3262034559,AX -3262034560,3262034687,FI -3262034688,3262034719,AX -3262034720,3262036319,FI -3262036320,3262036335,AX -3262036336,3262036367,FI -3262036368,3262036383,AX -3262036384,3262036415,FI -3262036416,3262036431,AX -3262036432,3262036991,FI -3262036992,3262038015,AX +3262031872,3262033919,FI +3262033920,3262033935,AX +3262033936,3262033951,FI +3262033952,3262033983,AX +3262033984,3262033991,FI +3262033992,3262033999,AX +3262034000,3262034015,FI +3262034016,3262034039,AX +3262034040,3262034111,FI +3262034112,3262034127,AX +3262034128,3262034143,FI +3262034144,3262034295,AX +3262034296,3262034303,FI +3262034304,3262034447,AX +3262034448,3262034451,FI +3262034452,3262034463,AX +3262034464,3262034495,FI +3262034496,3262034511,AX +3262034512,3262034519,FI +3262034520,3262034655,AX +3262034656,3262034687,FI +3262034688,3262034735,AX +3262034736,3262034767,FI +3262034768,3262034879,AX +3262034880,3262034943,FI +3262034944,3262035967,AX +3262035968,3262036111,FI +3262036112,3262036119,AX +3262036120,3262036127,FI +3262036128,3262036159,AX +3262036160,3262036223,FI +3262036224,3262036335,AX +3262036336,3262036351,FI +3262036352,3262036439,AX +3262036440,3262036447,FI +3262036448,3262036623,AX +3262036624,3262036643,FI +3262036644,3262036671,AX +3262036672,3262036687,FI +3262036688,3262036703,AX +3262036704,3262036719,FI +3262036720,3262038015,AX 3262038016,3262038271,FR 3262038272,3262038527,RU 3262038528,3262038783,GB @@ -40724,7 +71652,7 @@ 3262043392,3262043647,TR 3262043648,3262043903,NL 3262043904,3262044159,GB -3262044160,3262044415,CS +3262044160,3262044415,RS 3262044416,3262044671,DE 3262044672,3262044927,GR 3262044928,3262045183,UA @@ -40741,6 +71669,7 @@ 3262051072,3262051583,GB 3262051584,3262051839,FR 3262051840,3262052351,DE +3262052352,3262052607,UA 3262052608,3262052863,IL 3262052864,3262053119,GB 3262053120,3262053375,RU @@ -40748,59 +71677,80 @@ 3262053632,3262053887,RU 3262053888,3262054143,UA 3262054144,3262054399,RU -3262054400,3262099199,FI +3262054400,3262096127,FI +3262096128,3262096383,AX +3262096384,3262099199,FI 3262099200,3262099455,NL -3262099456,3262108671,FI +3262099456,3262106111,FI +3262106112,3262106623,AX +3262106624,3262108671,FI 3262108672,3262108927,RU 3262108928,3262114047,FI 3262114048,3262114303,SE 3262114304,3262115071,FI 3262115072,3262115327,RU 3262115328,3262119935,FI -3262119936,3262120447,AX -3262120448,3262120959,FI -3262120960,3262121215,AX -3262121216,3262122143,FI -3262122144,3262122147,AX -3262122148,3262122631,FI -3262122632,3262122639,AX -3262122640,3262124031,FI +3262119936,3262122367,AX +3262122368,3262122383,FI +3262122384,3262122399,AX +3262122400,3262122431,FI +3262122432,3262123519,AX +3262123520,3262123527,FI +3262123528,3262123775,AX +3262123776,3262124031,FI 3262124032,3262128127,DE 3262128128,3262136319,GB +3262136320,3262137599,EU 3262137600,3262137855,DE +3262137856,3262139391,EU 3262139392,3262140415,GB 3262140416,3262140671,DE +3262140672,3262141183,EU 3262141184,3262141439,DE 3262141440,3262142463,ES 3262142464,3262142719,DE +3262142720,3262143487,EU 3262143488,3262143743,GB +3262143744,3262143999,EU 3262144000,3262144047,DE +3262144048,3262145023,EU 3262145024,3262145279,DE +3262145280,3262145551,EU 3262145552,3262145567,DE +3262145568,3262145615,EU 3262145616,3262145631,DE +3262145632,3262145663,EU 3262145664,3262145791,DE +3262145792,3262146047,EU 3262146048,3262146815,DE -3262147072,3262147327,DE +3262146816,3262147583,EU 3262147584,3262147839,DE +3262147840,3262148607,EU 3262148608,3262148863,DE +3262148864,3262148879,EU 3262148880,3262148919,DE +3262148920,3262148927,EU 3262148928,3262149119,DE 3262149120,3262149151,FR 3262149152,3262149159,DE -3262149160,3262149247,FR +3262149160,3262149375,FR +3262149376,3262149631,EU 3262149632,3262149887,DE +3262149888,3262150911,EU 3262150912,3262151047,DE +3262151048,3262151071,EU 3262151072,3262151103,DE +3262151104,3262151135,EU 3262151136,3262151151,DE +3262151152,3262151167,EU 3262151168,3262151423,DE +3262151424,3262151935,EU 3262151936,3262152191,DE +3262152192,3262152663,EU 3262152664,3262152671,DE +3262152672,3262152703,EU 3262152704,3262185471,AT -3262185472,3262191615,DE -3262192128,3262197503,DE -3262197760,3262209535,DE -3262210048,3262222847,DE -3262223360,3262224895,DE +3262185472,3262224895,DE 3262224896,3262225151,AT 3262225152,3262227711,DE 3262227712,3262227967,RO @@ -40877,10 +71827,9 @@ 3262447616,3262460415,PT 3262460416,3262460543,UA 3262460544,3262460671,RU -3262460672,3262460799,DK -3262460800,3262460927,GB +3262460672,3262460799,AE 3262460928,3262461055,HU -3262461056,3262461183,DE +3262461056,3262461183,LV 3262461184,3262461311,SN 3262461312,3262461439,NO 3262461440,3262461567,DE @@ -40896,8 +71845,7 @@ 3262472220,3262472223,AT 3262472224,3262472231,DE 3262472232,3262472235,AT -3262472236,3262472243,DE -3262472244,3262472247,FR +3262472236,3262472247,DE 3262472248,3262472251,IT 3262472252,3262472267,DE 3262472268,3262472271,AT @@ -40946,8 +71894,7 @@ 3262472516,3262472519,GB 3262472520,3262472527,DE 3262472528,3262472531,CH -3262472532,3262472535,NL -3262472536,3262472539,DE +3262472532,3262472539,DE 3262472540,3262472543,US 3262472544,3262472547,DE 3262472548,3262472551,NL @@ -40988,9 +71935,7 @@ 3262472740,3262472743,PT 3262472744,3262472747,DE 3262472748,3262472751,GB -3262472752,3262472755,DE -3262472756,3262472759,PT -3262472760,3262472763,DE +3262472752,3262472763,DE 3262472764,3262472767,CA 3262472768,3262472771,DE 3262472772,3262472775,US @@ -41093,11 +72038,15 @@ 3262473484,3262473484,VE 3262473485,3262473485,US 3262473486,3262473486,CA -3262473487,3262473516,US +3262473487,3262473513,US +3262473514,3262473514,PR +3262473515,3262473516,US 3262473517,3262473517,CN 3262473518,3262473526,US 3262473527,3262473527,CN -3262473528,3262473540,US +3262473528,3262473538,US +3262473539,3262473539,DE +3262473540,3262473540,US 3262473541,3262473541,DE 3262473542,3262473543,US 3262473544,3262473544,CA @@ -41126,7 +72075,9 @@ 3262473736,3262473736,CA 3262473737,3262473771,US 3262473772,3262473772,DE -3262473773,3262473785,US +3262473773,3262473781,US +3262473782,3262473782,PR +3262473783,3262473785,US 3262473786,3262473855,DE 3262473856,3262473859,US 3262473860,3262473903,DE @@ -41348,7 +72299,9 @@ 3262475043,3262475043,DE 3262475044,3262475044,US 3262475045,3262475045,BR -3262475046,3262475065,US +3262475046,3262475057,US +3262475058,3262475058,PR +3262475059,3262475065,US 3262475066,3262475068,MX 3262475069,3262475072,US 3262475073,3262475075,BR @@ -41563,8 +72516,7 @@ 3262476328,3262476331,NL 3262476332,3262476339,DE 3262476340,3262476343,ES -3262476344,3262476347,DE -3262476348,3262476351,AT +3262476344,3262476351,DE 3262476352,3262476355,AR 3262476356,3262476363,US 3262476364,3262476367,PT @@ -41803,7 +72755,7 @@ 3262477524,3262477527,IT 3262477528,3262477543,DE 3262477544,3262477547,US -3262477548,3262477551,BE +3262477548,3262477551,DE 3262477552,3262477555,BR 3262477556,3262477559,US 3262477560,3262477563,CA @@ -41937,8 +72889,7 @@ 3262478107,3262478107,TR 3262478108,3262478108,DE 3262478109,3262478109,AE -3262478110,3262478110,PT -3262478111,3262478113,DE +3262478110,3262478113,DE 3262478114,3262478114,TR 3262478115,3262478115,DE 3262478116,3262478116,NO @@ -42033,8 +72984,7 @@ 3262478300,3262478303,ES 3262478304,3262478307,PT 3262478308,3262478311,ES -3262478312,3262478315,DE -3262478316,3262478319,BE +3262478312,3262478319,DE 3262478320,3262478323,GB 3262478324,3262478327,BE 3262478328,3262478331,ES @@ -42336,8 +73286,7 @@ 3262478731,3262478731,PT 3262478732,3262478732,PL 3262478733,3262478733,SK -3262478734,3262478734,DE -3262478735,3262478735,FR +3262478734,3262478735,DE 3262478736,3262478736,HU 3262478737,3262478737,ES 3262478738,3262478738,SK @@ -42356,7 +73305,7 @@ 3262478753,3262478753,IE 3262478754,3262478754,ES 3262478755,3262478755,DK -3262478756,3262478756,FR +3262478756,3262478756,DE 3262478757,3262478757,AT 3262478758,3262478758,FR 3262478759,3262478759,CH @@ -42373,7 +73322,7 @@ 3262478771,3262478771,SK 3262478772,3262478772,FR 3262478773,3262478773,CZ -3262478774,3262478774,IT +3262478774,3262478774,DE 3262478775,3262478775,CH 3262478776,3262478776,ES 3262478777,3262478778,IT @@ -42557,8 +73506,7 @@ 3262479051,3262479051,GB 3262479052,3262479052,DE 3262479053,3262479053,NL -3262479054,3262479055,DE -3262479056,3262479056,AT +3262479054,3262479056,DE 3262479057,3262479057,GB 3262479058,3262479058,FR 3262479059,3262479059,IT @@ -42592,7 +73540,7 @@ 3262479094,3262479095,GB 3262479096,3262479096,ES 3262479097,3262479097,FR -3262479098,3262479098,IT +3262479098,3262479098,GB 3262479099,3262479099,DE 3262479100,3262479100,DK 3262479101,3262479101,CH @@ -42740,8 +73688,7 @@ 3262479305,3262479307,DE 3262479308,3262479308,DK 3262479309,3262479309,SE -3262479310,3262479310,DE -3262479311,3262479311,ES +3262479310,3262479311,DE 3262479312,3262479312,IT 3262479313,3262479313,FR 3262479314,3262479318,DE @@ -42883,8 +73830,7 @@ 3262479510,3262479513,DE 3262479514,3262479514,FR 3262479515,3262479515,ES -3262479516,3262479516,AT -3262479517,3262479517,DE +3262479516,3262479517,DE 3262479518,3262479518,GB 3262479519,3262479519,GR 3262479520,3262479521,DE @@ -43075,8 +74021,7 @@ 3262479766,3262479766,CH 3262479767,3262479770,DE 3262479771,3262479771,IT -3262479772,3262479774,DE -3262479775,3262479775,BE +3262479772,3262479775,DE 3262479776,3262479776,IT 3262479777,3262479777,BE 3262479778,3262479778,NL @@ -43250,7 +74195,7 @@ 3262480041,3262480041,AT 3262480042,3262480042,DE 3262480043,3262480043,GB -3262480044,3262480044,CS +3262480044,3262480044,RS 3262480045,3262480045,GB 3262480046,3262480048,DE 3262480049,3262480049,LU @@ -43380,8 +74325,7 @@ 3262480251,3262480251,NL 3262480252,3262480253,DE 3262480254,3262480254,CH -3262480255,3262480259,DE -3262480260,3262480260,NL +3262480255,3262480260,DE 3262480261,3262480261,BE 3262480262,3262480264,DE 3262480265,3262480265,GB @@ -43465,8 +74409,7 @@ 3262480374,3262480374,ES 3262480375,3262480375,NL 3262480376,3262480376,DE -3262480377,3262480377,IT -3262480378,3262480378,DE +3262480377,3262480378,IT 3262480379,3262480379,CH 3262480380,3262480380,GB 3262480381,3262480381,IT @@ -43493,821 +74436,118 @@ 3262611456,3262627839,GB 3262627840,3262636031,IT 3262636032,3262644223,BE -3262644224,3262644695,NL -3262644696,3262644703,DE -3262644704,3262645567,NL -3262645568,3262645575,DE -3262645576,3262648319,NL -3262648320,3262650623,DE -3262650624,3262652799,NL -3262652800,3262652807,DE -3262652808,3262653751,NL -3262653752,3262653759,DE -3262653760,3262653783,NL -3262653784,3262653791,DE -3262653792,3262654463,NL -3262654464,3262655487,DE -3262655488,3262655903,NL -3262655904,3262655911,DE -3262655912,3262657151,NL -3262657152,3262657159,DE -3262657160,3262658095,NL -3262658096,3262658103,DE -3262658104,3262658303,NL +3262644224,3262648319,NL +3262648320,3262648831,DE +3262648832,3262649855,NL +3262649856,3262650623,DE +3262650624,3262654463,NL +3262654464,3262654719,DE +3262654720,3262655231,NL +3262655232,3262655487,DE +3262655488,3262658303,NL 3262658304,3262658559,DE -3262658560,3262659655,NL -3262659656,3262659663,DE -3262659664,3262659807,NL -3262659808,3262659815,DE -3262659816,3262660743,NL -3262660744,3262660751,DE -3262660752,3262660847,NL -3262660848,3262660855,DE -3262660856,3262661119,NL +3262658560,3262661119,NL 3262661120,3262661375,DE -3262661376,3262662775,NL -3262662776,3262662783,DE -3262662784,3262663607,NL -3262663608,3262663615,DE -3262663616,3262663647,NL -3262663648,3262663655,DE -3262663656,3262664703,NL -3262664704,3262678527,DE -3262678528,3262679343,NL -3262679344,3262679351,DE -3262679352,3262680359,NL -3262680360,3262680367,DE -3262680368,3262680495,NL -3262680496,3262680503,DE -3262680504,3262681087,NL -3262681088,3262682879,DE -3262682880,3262683607,NL -3262683608,3262683615,DE -3262683616,3262683815,NL -3262683816,3262683823,DE -3262683824,3262684431,NL -3262684432,3262684439,DE -3262684440,3262684655,NL -3262684656,3262684663,DE -3262684664,3262685239,NL -3262685240,3262685247,DE -3262685248,3262685543,NL -3262685544,3262685551,DE -3262685552,3262685895,NL -3262685896,3262685903,DE -3262685904,3262685951,NL -3262685952,3262688767,DE -3262688768,3262689559,NL -3262689560,3262689567,DE -3262689568,3262690815,NL -3262690816,3262704383,DE -3262704384,3262704703,NL -3262704704,3262704711,DE -3262704712,3262705111,NL -3262705112,3262705119,DE -3262705120,3262705271,NL -3262705272,3262705279,DE -3262705280,3262705791,NL -3262705792,3262705799,DE -3262705800,3262706247,NL -3262706248,3262706255,DE -3262706256,3262706551,NL -3262706552,3262706559,DE -3262706560,3262707159,NL -3262707160,3262707167,DE -3262707168,3262707711,NL -3262707712,3262710527,DE -3262710528,3262712423,NL -3262712424,3262712431,DE -3262712432,3262712575,NL +3262661376,3262664703,NL +3262664704,3262671359,DE +3262671360,3262672127,NL +3262672128,3262672895,DE +3262672896,3262673919,NL +3262673920,3262674175,DE +3262674176,3262674687,NL +3262674688,3262674943,DE +3262674944,3262676479,NL +3262676480,3262676735,DE +3262676736,3262678271,NL +3262678272,3262678527,DE +3262678528,3262681087,NL +3262681088,3262681343,DE +3262681344,3262682623,NL +3262682624,3262682879,DE +3262682880,3262685951,NL +3262685952,3262686463,DE +3262686464,3262687743,NL +3262687744,3262688255,DE +3262688256,3262688511,NL +3262688512,3262688767,DE +3262688768,3262690815,NL +3262690816,3262691583,DE +3262691584,3262692607,NL +3262692608,3262692863,DE +3262692864,3262693375,NL +3262693376,3262701567,DE +3262701568,3262703103,NL +3262703104,3262703615,DE +3262703616,3262704127,NL +3262704128,3262704383,DE +3262704384,3262707807,NL +3262707808,3262707839,DE +3262707840,3262707967,NL +3262707968,3262708223,DE +3262708224,3262709759,NL +3262709760,3262710015,DE +3262710016,3262710271,NL +3262710272,3262710527,DE +3262710528,3262712575,NL 3262712576,3262712831,DE -3262712832,3262713511,NL -3262713512,3262713519,DE -3262713520,3262714871,NL -3262714872,3262714879,DE -3262714880,3262715111,NL -3262715112,3262715119,DE -3262715120,3262715135,NL -3262715136,3262716671,DE -3262716672,3262717023,NL -3262717024,3262717031,DE -3262717032,3262717327,NL -3262717328,3262717335,DE -3262717336,3262718487,NL -3262718488,3262718495,DE -3262718496,3262719631,NL -3262719632,3262719639,DE -3262719640,3262719751,NL -3262719752,3262719759,DE -3262719760,3262720135,NL -3262720136,3262720143,DE -3262720144,3262721383,NL -3262721384,3262721391,DE -3262721392,3262721535,NL -3262721536,3262726911,DE -3262726912,3262728167,NL -3262728168,3262728175,DE -3262728176,3262729311,NL -3262729312,3262729319,DE -3262729320,3262730359,NL -3262730360,3262730367,DE -3262730368,3262730495,NL -3262730496,3262730503,DE -3262730504,3262732559,NL -3262732560,3262732567,DE -3262732568,3262732599,NL -3262732600,3262732607,DE -3262732608,3262732799,NL +3262712832,3262715135,NL +3262715136,3262715391,DE +3262715392,3262716415,NL +3262716416,3262716671,DE +3262716672,3262721535,NL +3262721536,3262721791,DE +3262721792,3262722047,NL +3262722048,3262723071,DE +3262723072,3262724095,NL +3262724096,3262724351,DE +3262724352,3262724863,NL +3262724864,3262725119,DE +3262725120,3262725631,NL +3262725632,3262726143,DE +3262726144,3262726655,NL +3262726656,3262726911,DE +3262726912,3262732799,NL 3262732800,3262733055,DE -3262733056,3262733159,NL -3262733160,3262733167,DE -3262733168,3262733495,NL -3262733496,3262733503,DE -3262733504,3262733599,NL -3262733600,3262733607,DE -3262733608,3262734919,NL -3262734920,3262734927,DE -3262734928,3262736255,NL -3262736256,3262736263,DE -3262736264,3262736383,NL +3262733056,3262736383,NL 3262736384,3262736895,DE -3262736896,3262737463,NL -3262737464,3262737471,DE -3262737472,3262739175,NL -3262739176,3262739183,DE -3262739184,3262739223,NL -3262739224,3262739231,DE -3262739232,3262741247,NL +3262736896,3262741247,NL 3262741248,3262741503,DE -3262741504,3262741583,NL -3262741584,3262741591,DE -3262741592,3262741639,NL -3262741640,3262741647,DE -3262741648,3262741687,NL -3262741688,3262741695,DE -3262741696,3262741791,NL -3262741792,3262741799,DE -3262741800,3262741855,NL -3262741856,3262741863,DE -3262741864,3262742143,NL -3262742144,3262742151,DE -3262742152,3262742319,NL -3262742320,3262742327,DE -3262742328,3262743007,NL -3262743008,3262743015,DE -3262743016,3262743719,NL -3262743720,3262743735,DE -3262743736,3262743775,NL -3262743776,3262743783,DE -3262743784,3262744295,NL -3262744296,3262744303,DE -3262744304,3262744695,NL -3262744696,3262744703,DE -3262744704,3262744887,NL -3262744888,3262744895,DE -3262744896,3262745175,NL -3262745176,3262745183,DE -3262745184,3262745439,NL -3262745440,3262745447,DE -3262745448,3262745591,NL -3262745592,3262745599,DE -3262745600,3262745623,NL -3262745624,3262745631,DE -3262745632,3262745751,NL -3262745752,3262745759,DE -3262745760,3262745831,NL -3262745832,3262745839,DE -3262745840,3262745879,NL -3262745880,3262745887,DE -3262745888,3262746007,NL -3262746008,3262746015,DE -3262746016,3262746303,NL -3262746304,3262746311,DE -3262746312,3262747247,NL -3262747248,3262747255,DE -3262747256,3262747375,NL -3262747376,3262747383,DE -3262747384,3262747535,NL -3262747536,3262747543,DE -3262747544,3262747783,NL -3262747784,3262747791,DE -3262747792,3262747839,NL -3262747840,3262747847,DE -3262747848,3262748271,NL -3262748272,3262748279,DE -3262748280,3262748591,NL -3262748592,3262748599,DE -3262748600,3262748719,NL -3262748720,3262748727,DE -3262748728,3262749519,NL -3262749520,3262749527,DE -3262749528,3262749559,NL -3262749560,3262749567,DE -3262749568,3262749607,NL -3262749608,3262749615,DE -3262749616,3262749703,NL -3262749704,3262749719,DE -3262749720,3262749879,NL -3262749880,3262749887,DE -3262749888,3262750135,NL -3262750136,3262750143,DE -3262750144,3262750551,NL -3262750552,3262750559,DE -3262750560,3262750727,NL -3262750728,3262750735,DE -3262750736,3262750991,NL -3262750992,3262750999,DE -3262751000,3262751015,NL -3262751016,3262751023,DE -3262751024,3262751079,NL -3262751080,3262751087,DE -3262751088,3262751559,NL -3262751560,3262751567,DE -3262751568,3262751991,NL -3262751992,3262751999,DE -3262752000,3262752039,NL -3262752040,3262752055,DE -3262752056,3262752095,NL -3262752096,3262752103,DE -3262752104,3262752343,NL -3262752344,3262752351,DE -3262752352,3262752423,NL -3262752424,3262752431,DE -3262752432,3262752631,NL -3262752632,3262752639,DE -3262752640,3262752703,NL -3262752704,3262752711,DE -3262752712,3262752807,NL -3262752808,3262752815,DE -3262752816,3262752863,NL -3262752864,3262752871,DE -3262752872,3262752887,NL -3262752888,3262752895,DE -3262752896,3262752959,NL -3262752960,3262752967,DE -3262752968,3262753039,NL -3262753040,3262753047,DE -3262753048,3262753071,NL -3262753072,3262753079,DE -3262753080,3262753247,NL -3262753248,3262753255,DE -3262753256,3262753575,NL -3262753576,3262753583,DE -3262753584,3262753695,NL -3262753696,3262753703,DE -3262753704,3262753791,NL +3262741504,3262753791,NL 3262753792,3262754815,DE -3262754816,3262755015,NL -3262755016,3262755023,DE -3262755024,3262755087,NL -3262755088,3262755095,DE -3262755096,3262755407,NL -3262755408,3262755415,DE -3262755416,3262755503,NL -3262755504,3262755511,DE -3262755512,3262755527,NL -3262755528,3262755535,DE -3262755536,3262756215,NL -3262756216,3262756223,DE -3262756224,3262756255,NL -3262756256,3262756263,DE -3262756264,3262756375,NL -3262756376,3262756383,DE -3262756384,3262756415,NL -3262756416,3262756423,DE -3262756424,3262756775,NL -3262756776,3262756783,DE -3262756784,3262756887,NL -3262756888,3262756895,DE -3262756896,3262756951,NL -3262756952,3262756959,DE -3262756960,3262757095,NL -3262757096,3262757103,DE -3262757104,3262757111,NL -3262757112,3262757119,DE -3262757120,3262757591,NL -3262757592,3262757599,DE -3262757600,3262757743,NL -3262757744,3262757751,DE -3262757752,3262757943,NL -3262757944,3262757951,DE -3262757952,3262758511,NL -3262758512,3262758519,DE -3262758520,3262759983,NL -3262759984,3262759991,DE -3262759992,3262760127,NL -3262760128,3262760135,DE -3262760136,3262760823,NL -3262760824,3262760831,DE -3262760832,3262760847,NL -3262760848,3262760855,DE -3262760856,3262760895,NL -3262760896,3262760903,DE -3262760904,3262761167,NL -3262761168,3262761175,DE -3262761176,3262761343,NL -3262761344,3262761351,DE -3262761352,3262761559,NL -3262761560,3262761567,DE -3262761568,3262761623,NL -3262761624,3262761631,DE -3262761632,3262761639,NL -3262761640,3262761647,DE -3262761648,3262761655,NL -3262761656,3262761663,DE -3262761664,3262761703,NL -3262761704,3262761719,DE -3262761720,3262761727,NL +3262754816,3262761727,NL 3262761728,3262761983,DE -3262761984,3262762655,NL -3262762656,3262762663,DE -3262762664,3262762759,NL -3262762760,3262762767,DE -3262762768,3262762895,NL -3262762896,3262762903,DE -3262762904,3262762911,NL -3262762912,3262762919,DE -3262762920,3262763103,NL -3262763104,3262763111,DE -3262763112,3262763223,NL -3262763224,3262763231,DE -3262763232,3262763655,NL -3262763656,3262763663,DE -3262763664,3262763879,NL -3262763880,3262763887,DE -3262763888,3262764231,NL -3262764232,3262764239,DE -3262764240,3262764775,NL -3262764776,3262764783,DE -3262764784,3262765959,NL -3262765960,3262765967,DE -3262765968,3262766079,NL -3262766080,3262767103,DE -3262767104,3262770359,NL -3262770360,3262770367,DE -3262770368,3262770671,NL -3262770672,3262770679,DE -3262770680,3262770743,NL -3262770744,3262770751,DE -3262770752,3262771767,NL -3262771768,3262771775,DE -3262771776,3262772103,NL -3262772104,3262772111,DE -3262772112,3262773479,NL -3262773480,3262773487,DE -3262773488,3262773503,NL -3262773504,3262775295,DE -3262775296,3262775591,NL -3262775592,3262775599,DE -3262775600,3262775687,NL -3262775688,3262775695,DE -3262775696,3262776959,NL -3262776960,3262776967,DE -3262776968,3262777103,NL -3262777104,3262777111,DE -3262777112,3262777895,NL -3262777896,3262777903,DE -3262777904,3262777991,NL -3262777992,3262777999,DE -3262778000,3262778383,NL -3262778384,3262778391,DE -3262778392,3262780239,NL -3262780240,3262780247,DE -3262780248,3262780399,NL -3262780400,3262780407,DE -3262780408,3262780599,NL -3262780600,3262780607,DE -3262780608,3262781287,NL -3262781288,3262781295,DE -3262781296,3262781503,NL -3262781504,3262781511,DE -3262781512,3262781951,NL -3262781952,3262781959,DE -3262781960,3262783447,NL -3262783448,3262783455,DE -3262783456,3262783823,NL -3262783824,3262783831,DE -3262783832,3262783943,NL -3262783944,3262783951,DE -3262783952,3262784103,NL -3262784104,3262784111,DE -3262784112,3262784815,NL -3262784816,3262784823,DE -3262784824,3262785695,NL -3262785696,3262785703,DE -3262785704,3262786423,NL -3262786424,3262786431,DE -3262786432,3262786679,NL -3262786680,3262786687,DE -3262786688,3262787543,NL -3262787544,3262787551,DE -3262787552,3262787591,NL -3262787592,3262787599,DE -3262787600,3262787655,NL -3262787656,3262787663,DE -3262787664,3262788583,NL -3262788584,3262788591,DE -3262788592,3262788639,NL -3262788640,3262788647,DE -3262788648,3262789119,NL -3262789120,3262790143,DE -3262790144,3262791151,NL -3262791152,3262791159,DE -3262791160,3262794751,NL -3262794752,3262797823,DE -3262797824,3262798223,NL -3262798224,3262798239,DE -3262798240,3262798247,NL -3262798248,3262798255,DE -3262798256,3262798423,NL -3262798424,3262798431,DE -3262798432,3262798743,NL -3262798744,3262798751,DE -3262798752,3262798767,NL -3262798768,3262798775,DE -3262798776,3262798863,NL -3262798864,3262798871,DE -3262798872,3262798991,NL -3262798992,3262798999,DE -3262799000,3262799287,NL -3262799288,3262799295,DE -3262799296,3262799415,NL -3262799416,3262799423,DE -3262799424,3262799495,NL -3262799496,3262799503,DE -3262799504,3262799615,NL -3262799616,3262799623,DE -3262799624,3262799711,NL -3262799712,3262799719,DE -3262799720,3262801351,NL -3262801352,3262801359,DE -3262801360,3262801943,NL -3262801944,3262801951,DE -3262801952,3262802455,NL -3262802456,3262802463,DE -3262802464,3262802735,NL -3262802736,3262802743,DE -3262802744,3262802895,NL -3262802896,3262802903,DE -3262802904,3262803655,NL -3262803656,3262803663,DE -3262803664,3262803855,NL -3262803856,3262803863,DE -3262803864,3262804279,NL -3262804280,3262804287,DE -3262804288,3262804391,NL -3262804392,3262804399,DE -3262804400,3262804511,NL -3262804512,3262804519,DE -3262804520,3262804663,NL -3262804664,3262804671,DE -3262804672,3262804711,NL -3262804712,3262804719,DE -3262804720,3262804735,NL -3262804736,3262804743,DE -3262804744,3262804879,NL -3262804880,3262804887,DE -3262804888,3262804895,NL -3262804896,3262804903,DE -3262804904,3262805471,NL -3262805472,3262805479,DE -3262805480,3262805551,NL -3262805552,3262805559,DE -3262805560,3262805631,NL -3262805632,3262805639,DE -3262805640,3262805743,NL -3262805744,3262805751,DE -3262805752,3262806015,NL -3262806016,3262809087,DE -3262809088,3262809511,NL -3262809512,3262809519,DE -3262809520,3262809671,NL -3262809672,3262809679,DE -3262809680,3262810191,NL -3262810192,3262810199,DE -3262810200,3262810423,NL -3262810424,3262810431,DE -3262810432,3262811023,NL -3262811024,3262811039,DE -3262811040,3262811207,NL -3262811208,3262811215,DE -3262811216,3262811415,NL -3262811416,3262811423,DE -3262811424,3262811663,NL -3262811664,3262811671,DE -3262811672,3262811727,NL -3262811728,3262811735,DE -3262811736,3262811927,NL -3262811928,3262811935,DE -3262811936,3262811951,NL -3262811952,3262811959,DE -3262811960,3262812199,NL -3262812200,3262812207,DE -3262812208,3262812247,NL -3262812248,3262812255,DE -3262812256,3262812327,NL -3262812328,3262812335,DE -3262812336,3262812935,NL -3262812936,3262812943,DE -3262812944,3262812959,NL -3262812960,3262812967,DE -3262812968,3262813831,NL -3262813832,3262813839,DE -3262813840,3262814423,NL -3262814424,3262814431,DE -3262814432,3262814767,NL -3262814768,3262814775,DE -3262814776,3262815239,NL -3262815240,3262815247,DE -3262815248,3262816079,NL -3262816080,3262816087,DE -3262816088,3262824455,NL -3262824456,3262824463,DE -3262824464,3262825575,NL -3262825576,3262825583,DE -3262825584,3262825735,NL -3262825736,3262825743,DE -3262825744,3262825927,NL -3262825928,3262825935,DE -3262825936,3262826703,NL -3262826704,3262826711,DE -3262826712,3262826743,NL -3262826744,3262826751,DE -3262826752,3262826815,NL -3262826816,3262826823,DE -3262826824,3262827879,NL -3262827880,3262827887,DE -3262827888,3262829567,NL -3262829568,3262830591,DE -3262830592,3262831543,NL -3262831544,3262831551,DE -3262831552,3262832639,NL +3262761984,3262766079,NL +3262766080,3262766087,DE +3262766088,3262774783,NL +3262774784,3262775295,DE +3262775296,3262794815,NL +3262794816,3262795007,DE +3262795008,3262796799,NL +3262796800,3262797055,DE +3262797056,3262808831,NL +3262808832,3262809087,DE +3262809088,3262832639,NL 3262832640,3262840319,DE -3262840320,3262842031,NL -3262842032,3262842039,DE -3262842040,3262842623,NL -3262842624,3262842887,DE -3262842888,3262843039,NL -3262843040,3262843047,DE -3262843048,3262843159,NL -3262843160,3262843167,DE -3262843168,3262843255,NL -3262843256,3262843263,DE -3262843264,3262843575,NL -3262843576,3262843583,DE -3262843584,3262843735,NL -3262843736,3262843743,DE -3262843744,3262844223,NL -3262844224,3262844231,DE -3262844232,3262844471,NL -3262844472,3262844479,DE -3262844480,3262844623,NL -3262844624,3262844631,DE -3262844632,3262844863,NL -3262844864,3262844871,DE -3262844872,3262845071,NL -3262845072,3262845079,DE -3262845080,3262845175,NL -3262845176,3262845183,DE -3262845184,3262845287,NL -3262845288,3262845295,DE -3262845296,3262846175,NL -3262846176,3262846183,DE -3262846184,3262846199,NL -3262846200,3262846207,DE -3262846208,3262846239,NL -3262846240,3262846255,DE -3262846256,3262846583,NL -3262846584,3262846591,DE -3262846592,3262846759,NL -3262846760,3262846767,DE -3262846768,3262846775,NL -3262846776,3262846783,DE -3262846784,3262847183,NL -3262847184,3262847191,DE -3262847192,3262847319,NL -3262847320,3262847327,DE -3262847328,3262848655,NL -3262848656,3262848663,DE -3262848664,3262848679,NL -3262848680,3262848687,DE -3262848688,3262848703,NL -3262848704,3262848711,DE -3262848712,3262848759,NL -3262848760,3262848767,DE -3262848768,3262849159,NL -3262849160,3262849167,DE -3262849168,3262849423,NL -3262849424,3262849431,DE -3262849432,3262849719,NL -3262849720,3262849727,DE -3262849728,3262849839,NL -3262849840,3262849847,DE -3262849848,3262850063,NL -3262850064,3262850071,DE -3262850072,3262850119,NL -3262850120,3262850127,DE -3262850128,3262850423,NL -3262850424,3262850431,DE -3262850432,3262850943,NL -3262850944,3262850951,DE -3262850952,3262851631,NL -3262851632,3262851639,DE -3262851640,3262852351,NL -3262852352,3262852607,DE -3262852608,3262854071,NL -3262854072,3262854079,DE -3262854080,3262855935,NL -3262855936,3262857215,DE -3262857216,3262857311,NL -3262857312,3262857319,DE -3262857320,3262857599,NL -3262857600,3262857607,DE -3262857608,3262859415,NL -3262859416,3262859423,DE -3262859424,3262860071,NL -3262860072,3262860079,DE -3262860080,3262860303,NL -3262860304,3262860311,DE -3262860312,3262861311,NL -3262861312,3262861319,DE -3262861320,3262863319,NL -3262863320,3262863327,DE -3262863328,3262864807,NL -3262864808,3262864815,DE -3262864816,3262865727,NL -3262865728,3262865735,DE -3262865736,3262866191,NL -3262866192,3262866199,DE -3262866200,3262867271,NL -3262867272,3262867279,DE -3262867280,3262868439,NL -3262868440,3262868447,DE -3262868448,3262868655,NL -3262868656,3262868663,DE -3262868664,3262869079,NL -3262869080,3262869087,DE -3262869088,3262870095,NL -3262870096,3262870103,DE -3262870104,3262870167,NL -3262870168,3262870175,DE -3262870176,3262870703,NL -3262870704,3262870711,DE -3262870712,3262870847,NL -3262870848,3262870855,DE -3262870856,3262870951,NL -3262870952,3262870959,DE -3262870960,3262871087,NL -3262871088,3262871095,DE -3262871096,3262871551,NL -3262871552,3262872319,DE -3262872320,3262872431,NL -3262872432,3262872439,DE -3262872440,3262872615,NL -3262872616,3262872623,DE -3262872624,3262873079,NL -3262873080,3262873087,DE -3262873088,3262873799,NL -3262873800,3262873815,DE -3262873816,3262875319,NL -3262875320,3262875327,DE -3262875328,3262875663,NL -3262875664,3262875671,DE -3262875672,3262876447,NL -3262876448,3262876455,DE -3262876456,3262876927,NL -3262876928,3262877951,DE -3262877952,3262878215,NL -3262878216,3262878223,DE -3262878224,3262878439,NL -3262878440,3262878447,DE -3262878448,3262879951,NL -3262879952,3262879959,DE -3262879960,3262882559,NL -3262882560,3262883071,DE -3262883072,3262883191,NL -3262883192,3262883199,DE -3262883200,3262884615,NL -3262884616,3262884623,DE -3262884624,3262885031,NL -3262885032,3262885039,DE -3262885040,3262885079,NL -3262885080,3262885087,DE -3262885088,3262885615,NL -3262885616,3262885623,DE -3262885624,3262886319,NL -3262886320,3262886327,DE -3262886328,3262886799,NL -3262886800,3262886807,DE -3262886808,3262886855,NL -3262886856,3262886863,DE -3262886864,3262887007,NL -3262887008,3262887015,DE -3262887016,3262888183,NL -3262888184,3262888191,DE -3262888192,3262888399,NL -3262888400,3262888407,DE -3262888408,3262888463,NL -3262888464,3262888471,DE -3262888472,3262888639,NL -3262888640,3262888647,DE -3262888648,3262889007,NL -3262889008,3262889015,DE -3262889016,3262889071,NL -3262889072,3262889079,DE -3262889080,3262889111,NL -3262889112,3262889119,DE -3262889120,3262890399,NL -3262890400,3262890407,DE -3262890408,3262891215,NL -3262891216,3262891223,DE -3262891224,3262891951,NL -3262891952,3262891959,DE -3262891960,3262892143,NL -3262892144,3262892151,DE -3262892152,3262893791,NL -3262893792,3262893799,DE -3262893800,3262894431,NL -3262894432,3262894439,DE -3262894440,3262895359,NL -3262895360,3262895367,DE -3262895368,3262895511,NL -3262895512,3262895527,DE -3262895528,3262896175,NL -3262896176,3262896183,DE -3262896184,3262896207,NL -3262896208,3262896215,DE -3262896216,3262896271,NL -3262896272,3262896287,DE -3262896288,3262896303,NL -3262896304,3262896311,DE -3262896312,3262896391,NL -3262896392,3262896399,DE -3262896400,3262896647,NL -3262896648,3262896655,DE -3262896656,3262897167,NL -3262897168,3262897175,DE -3262897176,3262897647,NL -3262897648,3262897655,DE -3262897656,3262898071,NL -3262898072,3262898079,DE -3262898080,3262898151,NL -3262898152,3262898159,DE -3262898160,3262898215,NL -3262898216,3262898223,DE -3262898224,3262898271,NL -3262898272,3262898279,DE -3262898280,3262898999,NL -3262899000,3262899007,DE -3262899008,3262899223,NL -3262899224,3262899231,DE -3262899232,3262899303,NL -3262899304,3262899311,DE -3262899312,3262899743,NL -3262899744,3262899751,DE -3262899752,3262899903,NL -3262899904,3262899911,DE -3262899912,3262900223,NL -3262900224,3262900479,DE -3262900480,3262901079,NL -3262901080,3262901087,DE -3262901088,3262901199,NL -3262901200,3262901207,DE -3262901208,3262902495,NL -3262902496,3262902503,DE -3262902504,3262902919,NL -3262902920,3262902927,DE -3262902928,3262903087,NL -3262903088,3262903095,DE -3262903096,3262903599,NL -3262903600,3262903607,DE -3262903608,3262904495,NL -3262904496,3262904503,DE -3262904504,3262904839,NL -3262904840,3262904847,DE -3262904848,3262904983,NL -3262904984,3262904991,DE -3262904992,3262905071,NL -3262905072,3262905079,DE -3262905080,3262905167,NL -3262905168,3262905175,DE -3262905176,3262905303,NL -3262905304,3262905311,DE -3262905312,3262905447,NL -3262905448,3262905455,DE -3262905456,3262905663,NL -3262905664,3262905671,DE -3262905672,3262905855,NL -3262905856,3262905863,DE -3262905864,3262906055,NL -3262906056,3262906063,DE -3262906064,3262906263,NL -3262906264,3262906271,DE -3262906272,3262906367,NL +3262840320,3262842624,NL +3262842625,3262842625,DE +3262842626,3262872063,NL +3262872064,3262872127,DE +3262872128,3262872159,NL +3262872160,3262872191,DE +3262872192,3262872255,NL +3262872256,3262872271,DE +3262872272,3262872275,NL +3262872276,3262872279,DE +3262872280,3262872307,NL +3262872308,3262872308,DE +3262872309,3262872309,NL +3262872310,3262872313,DE +3262872314,3262882815,NL +3262882816,3262883071,DE +3262883072,3262906367,NL 3262906368,3262964991,CH 3262964992,3262965247,DE -3262965248,3262969599,CH -3262969856,3262971903,CH +3262965248,3262971903,CH 3262971904,3263029247,IE 3263029248,3263030271,UA 3263030272,3263031295,GB @@ -44322,18 +74562,20 @@ 3263036416,3263036927,GR 3263036928,3263037439,RU 3263037440,3263045631,LB -3263045632,3263047935,KW +3263045632,3263046847,KW +3263046848,3263046911,IQ +3263046912,3263047935,KW 3263047936,3263048191,LB -3263048192,3263048447,BH -3263048448,3263053823,KW +3263048192,3263053823,KW 3263053824,3263062015,GB 3263062016,3263070207,EE +3263070208,3263070719,FR 3263070720,3263070975,NL 3263070976,3263071487,DE 3263071488,3263072255,NL 3263072256,3263074303,LB 3263074304,3263074815,CH -3263074816,3263075327,PL +3263074816,3263075327,RO 3263075328,3263075839,GB 3263075840,3263076351,SE 3263076352,3263076863,RO @@ -44363,7 +74605,7 @@ 3263090688,3263090943,DE 3263090944,3263091199,GB 3263091200,3263091455,PL -3263091456,3263091711,RU +3263091456,3263091711,NO 3263091712,3263091967,FI 3263091968,3263092479,HR 3263092480,3263092735,ES @@ -44400,29 +74642,36 @@ 3263100928,3263101183,AT 3263101184,3263101439,SE 3263101440,3263101695,DK -3263101696,3263101951,DE +3263101696,3263101951,RU 3263101952,3263102207,LT 3263102208,3263102463,RO +3263102464,3263102719,PL 3263102720,3263102975,GR -3263102976,3263128575,DE -3263128832,3263137791,DE -3263138816,3263148543,DE -3263149056,3263155711,DE -3263155968,3263168511,DE +3263102976,3263137791,DE +3263137792,3263138303,PL +3263138304,3263138559,DE +3263138560,3263138815,AT +3263138816,3263168511,DE 3263168512,3263430655,GB -3263430656,3263477759,SE +3263430656,3263436799,SE +3263436800,3263437311,GB +3263437312,3263477759,SE 3263477760,3263478015,JP -3263478016,3263496191,SE -3263497216,3263497983,US +3263478016,3263478271,AU +3263478272,3263496191,SE +3263496192,3263497983,EU 3263497984,3263498239,GB -3263498496,3263498751,ES +3263498240,3263498751,EU 3263498752,3263498879,US 3263498880,3263498943,GB +3263498944,3263498959,EU 3263498960,3263499007,GB -3263499008,3263499519,MC -3263499520,3263499775,GB +3263499008,3263499775,EU 3263499776,3263500031,FR -3263500032,3263501341,GB +3263500032,3263500287,GB +3263500288,3263500799,EU +3263500800,3263501341,GB +3263501342,3263501343,EU 3263501344,3263501439,GB 3263501440,3263501503,US 3263501504,3263501519,GB @@ -44431,27 +74680,25 @@ 3263501536,3263501551,DE 3263501552,3263501823,GB 3263501824,3263502079,EG -3263502080,3263502335,FR -3263502336,3263502847,GB -3263502848,3263503103,FR +3263502080,3263503103,EU 3263503104,3263503167,DE +3263503168,3263503199,EU 3263503200,3263503267,DE +3263503268,3263503271,EU 3263503272,3263503279,DE +3263503280,3263503295,EU 3263503296,3263503359,DE -3263503360,3263503871,FR +3263503360,3263503871,EU 3263503872,3263504127,GB 3263504128,3263504255,EG -3263504384,3263506431,QA -3263506432,3263506687,BE +3263504256,3263506687,EU 3263506688,3263506815,DE 3263506816,3263506943,US -3263506944,3263507199,BE +3263506944,3263507199,EU 3263507200,3263507455,US -3263507456,3263507967,GB -3263507968,3263508223,IE -3263508224,3263508735,GB -3263508736,3263508991,SL -3263508992,3263509503,US +3263507456,3263508223,EU +3263508224,3263508479,GB +3263508480,3263509503,EU 3263509504,3263509759,SE 3263509760,3263509791,GB 3263509792,3263509807,IE @@ -44464,82 +74711,70 @@ 3263510032,3263510063,GB 3263510064,3263510079,US 3263510080,3263510271,GB -3263510528,3263510783,GB -3263510784,3263511039,US +3263510272,3263511295,EU 3263511296,3263511551,GB -3263511552,3263512063,BE +3263511552,3263512063,EU 3263512064,3263512311,GB -3263512320,3263512831,ES -3263512832,3263513087,TR -3263513088,3263513343,FR +3263512312,3263513343,EU 3263513344,3263513599,US +3263513600,3263513855,EU 3263513856,3263514111,RU -3263514112,3263514367,GB -3263514368,3263515391,US -3263515392,3263515903,ES -3263515904,3263516159,GB -3263516160,3263516415,FR -3263516416,3263516671,LK +3263514112,3263516671,EU 3263516672,3263516927,US -3263516928,3263517695,GB +3263516928,3263517183,GB +3263517184,3263517695,EU 3263517696,3263517951,US 3263517952,3263518463,GB 3263518464,3263518719,FR 3263518720,3263518751,IR +3263518752,3263518975,EU 3263518976,3263519231,GB -3263519232,3263519743,FR +3263519232,3263519743,EU 3263519744,3263519759,GB -3263520000,3263520255,GB +3263519760,3263520255,EU 3263520256,3263520511,FR -3263520512,3263521279,US -3263521280,3263521535,FR -3263521536,3263521791,DE +3263520512,3263520767,US +3263520768,3263521791,EU 3263521792,3263522047,GB -3263522048,3263522303,IE -3263522304,3263522559,FR -3263522560,3263522815,GB -3263522816,3263523071,ES -3263523072,3263523839,DE -3263523840,3263524095,FR -3263524096,3263524351,GB -3263524352,3263524607,FR -3263524608,3263524863,GB -3263524864,3263525119,FR -3263525120,3263525375,GB -3263525376,3263525631,ES +3263522048,3263523071,EU +3263523072,3263523583,DE +3263523584,3263525759,EU 3263525760,3263525887,DE -3263526400,3263526655,IT -3263526912,3263527167,FR +3263525888,3263527423,EU 3263527424,3263527679,ZW 3263527680,3263527935,DE -3263527936,3263528191,SL +3263527936,3263528191,EU 3263528192,3263528447,FR -3263528448,3263528959,GB -3263529984,3263530239,GB -3263530240,3263530495,BE +3263528448,3263528703,EU +3263528704,3263528959,GB +3263528960,3263530495,EU 3263530496,3263530751,GB -3263530752,3263531007,IE -3263531008,3263531519,FR +3263530752,3263531519,EU 3263531520,3263531535,DE +3263531536,3263531551,EU 3263531552,3263531775,DE -3263531776,3263532031,FR -3263532032,3263532799,GB -3263536896,3263537151,ZW -3263537152,3263540479,TR +3263531776,3263532543,EU +3263532544,3263532799,GB +3263532800,3263537663,EU +3263537664,3263538431,TR +3263538432,3263540223,EU +3263540224,3263540479,TR 3263540480,3263540735,GB -3263540736,3263541247,TR -3263541248,3263541535,GB -3263543296,3263545343,IL -3263545344,3263557631,US -3263557632,3263558911,TR +3263540736,3263541503,EU +3263541504,3263541535,GB +3263541536,3263557631,EU +3263557632,3263557887,TR +3263557888,3263558655,EU +3263558656,3263558911,TR 3263558912,3263559679,GB 3263559680,3263560191,TR +3263560192,3263560447,EU 3263560448,3263560703,TR +3263560704,3263560959,EU 3263560960,3263561231,TR +3263561232,3263561471,EU 3263561472,3263561727,TR -3263561728,3263606671,NL -3263606672,3263606687,GB -3263606688,3263627263,NL +3263561728,3263627263,NL 3263627264,3263657471,RU 3263657472,3263657727,KZ 3263657728,3263684351,RU @@ -44550,15 +74785,11 @@ 3263689472,3263689727,UA 3263689728,3263689983,RU 3263689984,3263690239,UA -3263690240,3263691007,RU -3263691008,3263691263,UA -3263691264,3263691775,RU +3263690240,3263691775,RU 3263691776,3263692031,UA 3263692032,3263692287,RU 3263692288,3263692799,UA -3263692800,3263758335,FI -3263758336,3263758591,SE -3263758592,3263760127,FI +3263692800,3263760127,FI 3263760128,3263760383,SE 3263760384,3263764991,FI 3263764992,3263765503,BE @@ -44570,9 +74801,13 @@ 3263774464,3263774719,BE 3263774720,3263792351,FI 3263792352,3263792367,SE -3263792368,3263793151,FI +3263792368,3263792383,FI +3263792384,3263792639,AX +3263792640,3263793151,FI 3263793152,3263793407,BE -3263793408,3263816703,FI +3263793408,3263815123,FI +3263815124,3263815127,AX +3263815128,3263816703,FI 3263816704,3263816959,ES 3263816960,3263817215,NL 3263817216,3263823871,FI @@ -44611,14 +74846,18 @@ 3264019968,3264020223,AT 3264020224,3264020479,PL 3264020480,3264086015,BG -3264086016,3264099839,FI +3264086016,3264092287,FI +3264092288,3264092295,AX +3264092296,3264099839,FI 3264099840,3264100095,GB 3264100096,3264124927,FI 3264124928,3264125183,DE 3264125184,3264125439,NL 3264125440,3264125695,FI 3264125696,3264125951,BE -3264125952,3264133375,FI +3264125952,3264129271,FI +3264129272,3264129279,AX +3264129280,3264133375,FI 3264133376,3264133631,SE 3264133632,3264151551,FI 3264151552,3264184319,NO @@ -44631,7 +74870,7 @@ 3264187392,3264187903,IR 3264187904,3264188415,IT 3264188416,3264189439,UA -3264189952,3264190463,RU +3264189440,3264190463,RU 3264190464,3264190975,LV 3264190976,3264191487,GB 3264191488,3264191999,DE @@ -44652,12 +74891,13 @@ 3264312064,3264312319,CH 3264312320,3264312575,PL 3264312576,3264312831,UA -3264312832,3264313343,DE +3264312832,3264313087,DE +3264313088,3264313343,NL 3264313344,3264313599,RO 3264313600,3264313855,PT 3264313856,3264314623,DE 3264314624,3264314879,SE -3264314880,3264315135,DE +3264314880,3264315135,GB 3264315136,3264315391,GR 3264315392,3264317439,IE 3264317440,3264318463,SK @@ -44669,7 +74909,7 @@ 3264320256,3264321023,GB 3264321024,3264321535,DE 3264321536,3264321791,SE -3264321792,3264322047,CS +3264321792,3264322047,RS 3264322048,3264322303,FR 3264322304,3264322559,RO 3264322560,3264322815,HU @@ -44689,7 +74929,7 @@ 3264332800,3264333311,GB 3264333312,3264333823,UA 3264333824,3264334335,NL -3264334336,3264334847,RO +3264334336,3264334847,UA 3264334848,3264335359,PL 3264335360,3264335871,SK 3264335872,3264336383,CY @@ -44707,7 +74947,7 @@ 3264341504,3264341759,DE 3264341760,3264342015,IT 3264342016,3264342783,DE -3264342784,3264343039,RU +3264342784,3264343039,ES 3264343040,3264343295,DE 3264343296,3264343551,GB 3264343552,3264343807,RO @@ -44716,8 +74956,7 @@ 3264345088,3264346111,NL 3264346112,3264347135,SE 3264347136,3264348159,DE -3264348160,3264372223,FR -3264372736,3264375039,FR +3264348160,3264375039,FR 3264375040,3264376063,SE 3264376064,3264376319,HR 3264376320,3264376575,UA @@ -44742,7 +74981,7 @@ 3264386048,3264387071,IR 3264387072,3264388095,LB 3264388096,3264389119,UA -3264389120,3264390143,DE +3264389120,3264390143,RU 3264390144,3264391167,IR 3264391168,3264392191,SE 3264392192,3264393215,FR @@ -44752,7 +74991,7 @@ 3264396288,3264397311,UA 3264397312,3264398335,GB 3264398336,3264399359,UA -3264399360,3264400383,PL +3264399360,3264400383,RU 3264400384,3264401407,PA 3264401408,3264402431,DE 3264402432,3264403455,CH @@ -44765,16 +75004,11 @@ 3264409600,3264410623,RU 3264410624,3264411647,NO 3264411648,3264413695,PL -3264417536,3264431103,CH +3264413696,3264431103,CH 3264431104,3264431615,LI -3264431616,3264439039,CH -3264439296,3264439807,CH -3264440320,3264441599,CH -3264442112,3264445439,CH +3264431616,3264446207,CH 3264446208,3264446463,FR -3264446464,3264456191,CH -3264456704,3264476671,CH -3264477696,3264483071,CH +3264446464,3264483071,CH 3264483072,3264483327,LI 3264483328,3264486527,CH 3264486528,3264486559,LI @@ -44782,17 +75016,16 @@ 3264494080,3264494335,US 3264494336,3264544767,CH 3264544768,3264561151,HU -3264561152,3264562687,RU -3264562944,3264563183,RU +3264561152,3264563199,RU 3264563200,3264564223,ES 3264564224,3264565247,IE 3264565248,3264567295,NL 3264567296,3264567551,PL 3264567552,3264567807,GB 3264567808,3264568319,RU -3264568320,3264568575,DE +3264568320,3264568575,UA 3264568576,3264568831,RU -3264568832,3264569087,DE +3264568832,3264569087,FR 3264569088,3264569343,RU 3264569344,3264577535,CZ 3264577536,3264585727,MK @@ -44810,7 +75043,53 @@ 3264606976,3264607231,BE 3264607232,3264607487,IT 3264607488,3264610303,DE -3264610304,3264626687,FR +3264610304,3264611583,GB +3264611584,3264612095,FR +3264612096,3264612351,GB +3264612352,3264612479,FR +3264612480,3264612511,GB +3264612512,3264612591,FR +3264612592,3264613119,GB +3264613120,3264614399,FR +3264614400,3264614431,GB +3264614432,3264614447,FR +3264614448,3264614463,GB +3264614464,3264614527,FR +3264614528,3264614559,GB +3264614560,3264614591,FR +3264614592,3264614623,GB +3264614624,3264614655,FR +3264614656,3264615935,GB +3264615936,3264615999,FR +3264616000,3264616095,GB +3264616096,3264616159,FR +3264616160,3264616191,GB +3264616192,3264616511,FR +3264616512,3264616575,GB +3264616576,3264616591,FR +3264616592,3264616639,GB +3264616640,3264616655,FR +3264616656,3264616671,GB +3264616672,3264616687,FR +3264616688,3264616959,GB +3264616960,3264617215,FR +3264617216,3264617311,GB +3264617312,3264617983,FR +3264617984,3264618751,GB +3264618752,3264619007,FR +3264619008,3264619519,GB +3264619520,3264619551,FR +3264619552,3264619583,GB +3264619584,3264619615,FR +3264619616,3264619775,GB +3264619776,3264620031,FR +3264620032,3264620159,GB +3264620160,3264620191,FR +3264620192,3264620543,GB +3264620544,3264620927,FR +3264620928,3264621567,GB +3264621568,3264621823,FR +3264621824,3264626687,GB 3264626688,3264627711,EE 3264627712,3264628735,GR 3264628736,3264630783,UA @@ -44819,7 +75098,7 @@ 3264632832,3264633855,RU 3264633856,3264634879,UA 3264634880,3264636927,PL -3264636928,3264637951,UA +3264636928,3264637951,RU 3264637952,3264639999,DK 3264640000,3264641023,BG 3264641024,3264642047,GB @@ -44828,6 +75107,8 @@ 3264651776,3264652287,IT 3264652288,3264652799,RU 3264652800,3264653311,PL +3264653312,3264653823,EU +3264653824,3264654335,RO 3264654336,3264654847,DE 3264654848,3264655359,UA 3264655360,3264655871,GB @@ -44867,10 +75148,8 @@ 3264673792,3264674303,CH 3264674304,3264674815,PL 3264674816,3264675327,GB -3264675328,3264675839,RO -3264675840,3264687247,NL -3264687248,3264687263,BG -3264687264,3264741375,NL +3264675328,3264675839,RU +3264675840,3264741375,NL 3264741376,3264749567,SI 3264749568,3264750079,LV 3264750080,3264750591,RU @@ -44897,13 +75176,12 @@ 3264815104,3264825343,SE 3264825344,3264825599,NO 3264825600,3264825855,IT -3264825856,3264826111,NL -3264826112,3264826879,GB +3264825856,3264826879,GB 3264826880,3264827135,NL 3264827136,3264827391,LV 3264827392,3264827647,FR 3264827648,3264828159,GR -3264828160,3264828415,DE +3264828160,3264828415,CH 3264828416,3264828671,SE 3264828672,3264828927,MT 3264828928,3264829439,DE @@ -44946,22 +75224,22 @@ 3264845952,3264846079,GB 3264846080,3264846207,UG 3264846208,3264846335,PL +3264846336,3264846463,GB 3264846464,3264846591,NO 3264846592,3264846719,US +3264846720,3264846847,RU 3264846848,3264846911,DK -3264846976,3264847039,DE +3264846912,3264846975,SK 3264847040,3264847103,GB 3264847104,3264847135,FR 3264847136,3264847167,ES -3264847168,3264847199,NL +3264847168,3264847199,IE 3264847200,3264847231,NO -3264847232,3264847263,NL 3264847264,3264847295,LI -3264847296,3264847327,FR -3264847328,3264847359,NL 3264847360,3264847487,FR 3264847488,3264847615,RU 3264847616,3264847679,PL +3264847680,3264847743,LV 3264847744,3264847807,BE 3264847808,3264847871,SE 3264847872,3264849919,DE @@ -44971,13 +75249,12 @@ 3264850944,3264851967,IT 3264851968,3264854015,CH 3264854016,3264854527,DE -3264854528,3264854783,GR +3264854528,3264854783,RU 3264854784,3264855039,IT 3264855040,3264855551,CH 3264855552,3264856063,DE 3264856064,3264861695,IT -3264861696,3264862079,FR -3264862080,3264862207,SE +3264861696,3264862207,FR 3264862208,3264862463,PL 3264862464,3264862719,AT 3264862720,3264862975,GB @@ -44987,47 +75264,59 @@ 3264872448,3264888831,GB 3264888832,3264897023,RU 3264897024,3264905215,GB -3264905216,3264906287,CY +3264905216,3264906255,CY +3264906256,3264906263,GR +3264906264,3264906287,CY 3264906288,3264906291,GR -3264906292,3264906299,CY -3264906300,3264906303,GR +3264906292,3264906295,CY +3264906296,3264906303,GR 3264906304,3264906323,CY 3264906324,3264906327,GR -3264906328,3264906331,CY -3264906332,3264906335,GR +3264906328,3264906332,CY +3264906333,3264906335,GR 3264906336,3264906339,CY -3264906340,3264906343,GR -3264906344,3264906495,CY +3264906340,3264906351,GR +3264906352,3264906355,CY +3264906356,3264906359,GR +3264906360,3264906367,CY +3264906368,3264906411,GR +3264906412,3264906423,CY +3264906424,3264906435,GR +3264906436,3264906495,CY 3264906496,3264906623,GR 3264906624,3264906751,CY 3264906752,3264906761,GR 3264906762,3264906879,CY 3264906880,3264906895,GR -3264906896,3264906907,CY -3264906908,3264906927,GR -3264906928,3264906983,CY +3264906896,3264906911,CY +3264906912,3264906919,GR +3264906920,3264906983,CY 3264906984,3264906995,GR 3264906996,3264907135,CY 3264907136,3264907143,GR -3264907144,3264907639,CY +3264907144,3264907151,CY +3264907152,3264907155,GR +3264907156,3264907639,CY 3264907640,3264907647,GR -3264907648,3264907655,CY -3264907656,3264907671,GR -3264907672,3264907687,CY +3264907648,3264907663,CY +3264907664,3264907671,GR +3264907672,3264907679,CY +3264907680,3264907683,GR +3264907684,3264907687,CY 3264907688,3264907691,GR 3264907692,3264907695,CY 3264907696,3264907703,GR 3264907704,3264907715,CY -3264907716,3264907719,GR -3264907720,3264907723,CY -3264907724,3264907727,GR +3264907716,3264907727,GR 3264907728,3264907735,CY -3264907736,3264907739,GR -3264907740,3264907772,CY -3264907773,3264907775,GR +3264907736,3264907743,GR +3264907744,3264907755,CY +3264907756,3264907763,GR +3264907764,3264907767,CY +3264907768,3264907775,GR 3264907776,3264907919,CY -3264907920,3264907923,GR -3264907924,3264907935,CY +3264907920,3264907927,GR +3264907928,3264907935,CY 3264907936,3264907939,GR 3264907940,3264907963,CY 3264907964,3264907971,GR @@ -45041,17 +75330,19 @@ 3264908064,3264908071,GR 3264908072,3264908095,CY 3264908096,3264908103,GR -3264908104,3264908167,CY +3264908104,3264908111,CY +3264908112,3264908119,GR +3264908120,3264908167,CY 3264908168,3264908175,GR -3264908176,3264908207,CY -3264908208,3264908223,GR -3264908224,3264908286,CY +3264908176,3264908183,CY +3264908184,3264908191,GR +3264908192,3264908223,CY +3264908224,3264908255,GR +3264908256,3264908286,CY 3264908287,3264908799,GR 3264908800,3264909055,GB 3264909056,3264909311,GR -3264909312,3264909599,CY -3264909600,3264909615,GR -3264909616,3264909639,CY +3264909312,3264909639,CY 3264909640,3264909647,GR 3264909648,3264909655,CY 3264909656,3264909663,GR @@ -45061,18 +75352,18 @@ 3264910608,3264910623,GR 3264910624,3264910655,CY 3264910656,3264910671,GR -3264910672,3264910695,CY -3264910696,3264910699,GR -3264910700,3264910703,CY -3264910704,3264910719,GR +3264910672,3264910696,CY +3264910697,3264910699,GR +3264910700,3264910707,CY +3264910708,3264910719,GR 3264910720,3264910815,CY 3264910816,3264911103,GR 3264911104,3264911651,CY 3264911652,3264911655,GR 3264911656,3264911679,CY -3264911680,3264911711,GR -3264911712,3264911775,CY -3264911776,3264911807,GR +3264911680,3264911703,GR +3264911704,3264911743,CY +3264911744,3264911807,GR 3264911808,3264912131,CY 3264912132,3264912135,GR 3264912136,3264912139,CY @@ -45080,17 +75371,21 @@ 3264912144,3264912147,CY 3264912148,3264912151,GR 3264912152,3264912167,CY -3264912168,3264912219,GR +3264912168,3264912183,GR +3264912184,3264912191,CY +3264912192,3264912219,GR 3264912220,3264912223,CY 3264912224,3264912231,GR 3264912232,3264912235,CY 3264912236,3264912239,GR 3264912240,3264912243,CY 3264912244,3264912251,GR -3264912252,3264912271,CY -3264912272,3264912279,GR +3264912252,3264912263,CY +3264912264,3264912279,GR 3264912280,3264912283,CY -3264912284,3264912319,GR +3264912284,3264912287,GR +3264912288,3264912295,CY +3264912296,3264912319,GR 3264912320,3264912655,CY 3264912656,3264912663,GR 3264912664,3264912815,CY @@ -45106,7 +75401,11 @@ 3264913200,3264913223,CY 3264913224,3264913231,GR 3264913232,3264913243,CY -3264913244,3264913303,GR +3264913244,3264913263,GR +3264913264,3264913279,CY +3264913280,3264913295,GR +3264913296,3264913299,CY +3264913300,3264913303,GR 3264913304,3264913311,CY 3264913312,3264913327,GR 3264913328,3264913375,CY @@ -45121,11 +75420,7 @@ 3264922320,3264929791,LU 3264929792,3264937983,SK 3264937984,3265003519,GB -3265003520,3265006335,DE -3265006592,3265010943,DE -3265011200,3265043199,DE -3265043456,3265052671,DE -3265053440,3265055231,DE +3265003520,3265055231,DE 3265055232,3265055743,FR 3265055744,3265069055,DE 3265069056,3265134591,FI @@ -45137,14 +75432,11 @@ 3265175552,3265183743,NL 3265183744,3265191935,BY 3265191936,3265200127,CH -3265200128,3265216511,GB -3265216512,3265216767,DE +3265200128,3265216767,GB 3265216768,3265217023,FR 3265217024,3265218559,GB 3265218560,3265219071,NL -3265219072,3265244415,GB -3265244416,3265244671,NL -3265244672,3265257471,GB +3265219072,3265257471,GB 3265257472,3265259519,NL 3265259520,3265265663,GB 3265265664,3265286463,SK @@ -45155,6 +75447,7 @@ 3265340672,3265340927,GB 3265340928,3265341183,CH 3265341184,3265341279,AT +3265341280,3265341311,EU 3265341312,3265341439,FR 3265341440,3265341695,GB 3265341696,3265341951,DE @@ -45178,6 +75471,7 @@ 3265360896,3265361919,GB 3265361920,3265363967,IT 3265363968,3265366015,ES +3265366016,3265366079,EU 3265366080,3265366271,BE 3265366272,3265366527,HU 3265366528,3265367039,DK @@ -45199,22 +75493,43 @@ 3265382912,3265384447,GB 3265384448,3265386495,DE 3265386496,3265387519,NL +3265387520,3265388543,EU 3265388544,3265396735,GB -3265396736,3265464847,DE +3265396736,3265417919,DE +3265417920,3265417927,A2 +3265417928,3265418503,DE +3265418504,3265418511,A2 +3265418512,3265464847,DE 3265464848,3265464863,AT 3265464864,3265465343,DE 3265465344,3265465599,AT -3265465600,3265527807,DE +3265465600,3265467519,DE +3265467520,3265467523,ES +3265467524,3265527055,DE +3265527056,3265527059,ES +3265527060,3265527807,DE 3265527808,3265569279,GB 3265569280,3265569791,AE -3265569792,3265593343,GB +3265569792,3265582335,GB +3265582336,3265582591,A2 +3265582592,3265593343,GB +3265593344,3265594367,RU +3265594368,3265595391,UA +3265595392,3265595903,PL +3265595904,3265596415,RU +3265596416,3265596927,GB +3265596928,3265597439,FR +3265597440,3265599999,RU +3265600000,3265600511,HU +3265600512,3265601023,GB +3265601024,3265601535,RU 3265601536,3265601791,SE 3265601792,3265602047,CH 3265602048,3265602559,NL 3265602560,3265602815,IT 3265602816,3265603071,IE 3265603072,3265603327,DK -3265603328,3265603583,NL +3265603328,3265603583,MD 3265603584,3265603839,DE 3265603840,3265604095,PL 3265604096,3265604351,SA @@ -45225,12 +75540,12 @@ 3265605376,3265605631,CZ 3265605632,3265605887,PL 3265605888,3265606143,FR +3265606144,3265606399,RU 3265606400,3265606655,DE 3265606656,3265606911,AT 3265606912,3265607167,FR 3265607168,3265607423,PL -3265607424,3265607679,PT -3265607680,3265607935,DK +3265607424,3265607935,DK 3265607936,3265608191,CZ 3265608192,3265608447,RU 3265608448,3265608703,SE @@ -45240,7 +75555,9 @@ 3265609728,3265617919,NL 3265617920,3265626111,SI 3265626112,3265634303,JO -3265634304,3265642495,IE +3265634304,3265642287,IE +3265642288,3265642303,US +3265642304,3265642495,IE 3265642496,3265650687,GB 3265650688,3265658879,SE 3265658880,3265724415,AT @@ -45265,17 +75582,16 @@ 3265906944,3265907199,ES 3265907200,3265907455,DE 3265907456,3265907711,FR -3265907712,3265907967,MD -3265907968,3265908735,UA +3265907712,3265908735,UA 3265908736,3265908991,NL 3265908992,3265909247,RO 3265909248,3265909503,UA 3265909504,3265909759,DE 3265909760,3265910015,RO 3265910016,3265910271,PL -3265910272,3265910527,RO -3265910528,3265910783,RU -3265910784,3265911039,NL +3265910272,3265910527,FR +3265910528,3265910783,PT +3265910784,3265911039,DE 3265911040,3265911551,GB 3265911552,3265911807,CH 3265911808,3265912063,PL @@ -45299,17 +75615,21 @@ 3265917440,3265917695,RU 3265917696,3265917951,SE 3265917952,3265918207,GB +3265918208,3265918463,EU 3265918464,3265918719,AT 3265918720,3265918975,RU 3265918976,3265919231,NL 3265919232,3265919487,FR 3265919488,3265919743,RU 3265919744,3265919999,DK +3265920000,3265920255,CZ 3265920256,3265920511,TR 3265920512,3265921023,GB 3265921024,3265986559,AE 3265986560,3266052095,NL -3266052096,3266322431,DE +3266052096,3266073823,DE +3266073824,3266073839,GB +3266073840,3266322431,DE 3266322432,3266330623,LT 3266330624,3266338815,GB 3266338816,3266339071,RU @@ -45335,52 +75655,68 @@ 3266344192,3266344447,UA 3266344448,3266344703,RU 3266344704,3266344959,ES -3266344960,3266345215,IE -3266345216,3266345727,DE +3266344960,3266345727,DE 3266345728,3266345983,DK 3266345984,3266346495,GB 3266346496,3266346751,IT 3266346752,3266347007,FR 3266347008,3266347263,GB +3266347264,3266351359,EU 3266351360,3266352623,GB +3266352624,3266352895,EU 3266352896,3266353567,GB +3266353568,3266353583,EU 3266353584,3266353591,GB +3266353592,3266353663,EU 3266353664,3266353671,GB +3266353672,3266353679,EU 3266353680,3266353687,GB +3266353688,3266353775,EU 3266353776,3266353783,US +3266353784,3266353855,EU 3266353856,3266353863,GB +3266353864,3266353879,EU 3266353880,3266353887,GB +3266353888,3266353895,EU 3266353896,3266353903,GB +3266353904,3266353919,EU 3266353920,3266355199,GB 3266355200,3266363391,RO 3266363392,3266371583,GB 3266371584,3266379775,HU -3266379776,3266382335,ES -3266387968,3266388991,LU -3266388992,3266389247,FR +3266379776,3266380799,UA +3266380800,3266381823,PL +3266381824,3266382847,FR +3266382848,3266383871,RU +3266383872,3266384895,IL +3266384896,3266385919,RU +3266385920,3266386943,UA +3266386944,3266387967,PL +3266387968,3266388375,FR +3266388376,3266388378,NL +3266388379,3266389247,FR 3266389248,3266389327,LU -3266389328,3266396159,FR +3266389328,3266395135,FR +3266395136,3266395903,NL +3266395904,3266396159,FR 3266396160,3266412543,IT 3266412544,3266420735,AT 3266420736,3266428927,GB 3266428928,3266437119,GR -3266437120,3266444911,GL -3266444912,3266444915,GB -3266444916,3266445311,GL +3266437120,3266445311,GL 3266445312,3266510847,NL 3266510848,3266543615,ES 3266543616,3266576383,IT -3266576384,3266603519,DE -3266604032,3266617327,DE -3266617344,3266634383,DE +3266576384,3266634391,DE +3266634392,3266634399,EE 3266634400,3266641919,DE 3266641920,3266707455,PL -3266707456,3266767615,DK -3266767616,3266767871,FO -3266767872,3266772991,DK +3266707456,3266772991,DK 3266772992,3266781183,IT 3266781184,3266789375,PL -3266789376,3266797567,SM +3266789376,3266796543,SM +3266796544,3266796799,IT +3266796800,3266797567,SM 3266797568,3266797823,GB 3266797824,3266798079,NL 3266798080,3266799103,GB @@ -45396,16 +75732,18 @@ 3266801216,3266801407,GB 3266801408,3266801471,NL 3266801472,3266801487,GB -3266801488,3266801599,NL +3266801488,3266801519,NL +3266801520,3266801535,GB +3266801536,3266801599,NL 3266801600,3266801615,GB 3266801616,3266801647,NL 3266801648,3266801663,GB 3266801664,3266801919,NL 3266801920,3266802943,GB 3266802944,3266803199,NL -3266803200,3266803711,GB -3266803712,3266803839,NL -3266803840,3266804223,GB +3266803200,3266803727,GB +3266803728,3266803831,NL +3266803832,3266804223,GB 3266804224,3266804479,NL 3266804480,3266804735,GB 3266804736,3266804991,NL @@ -45416,17 +75754,15 @@ 3266809600,3266813951,AT 3266813952,3266822143,UA 3266822144,3266830335,FR -3266830336,3266836479,BE -3266836480,3266837023,LU -3266837024,3266838527,BE +3266830336,3266835151,BE +3266835152,3266835159,FR +3266835160,3266836479,BE +3266836480,3266837503,LU +3266837504,3266838527,BE 3266838528,3266969599,IT -3266969600,3266973439,RU -3266973440,3266973695,KZ -3266973696,3267008767,RU +3266969600,3267008767,RU 3267008768,3267009023,UA -3267009024,3267029247,RU -3267029248,3267029503,KZ -3267029504,3267030095,RU +3267009024,3267030095,RU 3267030096,3267030103,KZ 3267030104,3267032575,RU 3267032576,3267032831,KZ @@ -45441,14 +75777,14 @@ 3267046400,3267047423,NL 3267047424,3267048447,UA 3267048448,3267049471,PL -3267049472,3267050495,UA +3267049472,3267050495,GB 3267050496,3267051519,SE 3267051520,3267052543,DE 3267052544,3267053567,LV 3267053568,3267054591,PL 3267054592,3267055615,NL 3267055616,3267056639,PS -3267056640,3267057663,US +3267056640,3267057663,IL 3267057664,3267058687,CH 3267058688,3267059711,AT 3267059712,3267060735,NL @@ -45473,6 +75809,7 @@ 3267082240,3267083263,DE 3267083264,3267084287,RO 3267084288,3267085311,FR +3267085312,3267086335,RU 3267086336,3267087359,PL 3267087360,3267088383,RU 3267088384,3267089407,UA @@ -45487,13 +75824,11 @@ 3267097600,3267098623,KZ 3267098624,3267099647,GB 3267099648,3267100671,IT -3267100672,3267166207,FI +3267100672,3267117311,FI +3267117312,3267118079,AX +3267118080,3267166207,FI 3267166208,3267231743,GB -3267231744,3267235327,RU -3267235328,3267235583,UA -3267235584,3267240959,RU -3267240960,3267241215,UA -3267241216,3267297279,RU +3267231744,3267297279,RU 3267297280,3267362815,CH 3267362816,3267426879,DK 3267426880,3267426943,CH @@ -45517,6 +75852,7 @@ 3267508992,3267509247,GB 3267509248,3267509503,AT 3267509504,3267509695,CH +3267509696,3267509727,EU 3267509728,3267509759,CH 3267509760,3267510271,GB 3267510272,3267512831,FR @@ -45525,13 +75861,15 @@ 3267514368,3267517951,DE 3267517952,3267518463,GB 3267518464,3267524607,DE +3267524608,3267526655,EU 3267526656,3267527679,DE 3267527680,3267529215,FR 3267529216,3267529471,GB 3267529472,3267529727,FR 3267529728,3267530751,AT 3267530752,3267534335,FR -3267534336,3267534527,CS +3267534336,3267534527,RS +3267534528,3267534559,EU 3267534560,3267534575,FR 3267534576,3267534591,AT 3267534592,3267538943,FR @@ -45566,6 +75904,7 @@ 3267553280,3267554303,DK 3267554304,3267554815,DE 3267554816,3267555071,FR +3267555072,3267555199,EU 3267555200,3267555327,ZA 3267555328,3267555583,FI 3267555584,3267556095,GB @@ -45588,54 +75927,70 @@ 3267626240,3267626495,BE 3267626496,3267626751,ES 3267626752,3267627007,RU -3267627008,3267627151,DE -3267627160,3267627343,DE -3267627360,3267627439,DE -3267627456,3267627463,DE -3267627488,3267627503,DE -3267627520,3267627775,HU +3267627008,3267627167,DE +3267627168,3267627199,EU +3267627200,3267627343,DE +3267627344,3267627359,EU +3267627360,3267627423,DE +3267627424,3267627431,EU +3267627432,3267627519,DE +3267627520,3267627775,EU 3267627776,3267627807,DE -3267627840,3267628031,DE +3267627808,3267627871,EU +3267627872,3267628031,DE 3267628032,3267628287,IT +3267628288,3267628543,EU 3267628544,3267628799,IT 3267628800,3267629055,HU 3267629056,3267629311,CZ 3267629312,3267629567,DK -3267629568,3267629695,BE -3267629712,3267629791,BE -3267629800,3267629815,BE +3267629568,3267629759,BE +3267629760,3267629807,EU +3267629808,3267629823,BE 3267629824,3267630079,GR 3267630080,3267630591,GB 3267630592,3267630847,SK 3267630848,3267630863,IT -3267630864,3267630943,FR -3267630944,3267631055,IT +3267630864,3267630879,EU +3267630880,3267630943,FR +3267630944,3267630959,EU +3267630960,3267631055,IT 3267631056,3267631071,GB +3267631072,3267631087,EU 3267631088,3267631103,IT 3267631104,3267631615,GB -3267631616,3267631935,DE -3267632000,3267632127,DE +3267631616,3267632127,DE +3267632128,3267632383,EU 3267632384,3267632511,BE +3267632512,3267632639,EU 3267632640,3267632895,IT 3267632896,3267633151,BE 3267633152,3267633679,NO -3267633696,3267633711,NO +3267633680,3267633727,EU 3267633728,3267633855,NO -3267633920,3267634175,NO +3267633856,3267634175,EU 3267634176,3267634431,GB -3267634432,3267634559,IE +3267634432,3267634559,EU 3267634560,3267634687,GB +3267634688,3267634943,EU 3267634944,3267635711,GB +3267635712,3267635967,EU 3267635968,3267636223,BE -3267636736,3267636991,ZA +3267636224,3267636735,EU +3267636736,3267636783,ZA +3267636784,3267636799,EU +3267636800,3267636815,ZA +3267636816,3267636831,EU +3267636832,3267636991,ZA 3267636992,3267637247,AT -3267637504,3267637591,IT -3267637600,3267637695,IT -3267637760,3267637887,ES +3267637248,3267637503,EU +3267637504,3267637695,IT +3267637696,3267637759,EU +3267637760,3267637823,ES +3267637824,3267638015,EU 3267638016,3267638271,ES 3267638272,3267638527,BE -3267638528,3267638583,DK -3267638592,3267638783,DK +3267638528,3267638783,DK 3267638784,3267639295,CZ 3267639296,3267639551,NL 3267639552,3267639807,GB @@ -45644,7 +75999,9 @@ 3267640320,3267640575,CH 3267640576,3267640831,IT 3267640832,3267641087,GR +3267641088,3267641343,EU 3267641344,3267641599,IE +3267641600,3267641855,EU 3267641856,3267642111,GB 3267642112,3267642367,SE 3267642368,3267642623,GB @@ -45652,164 +76009,274 @@ 3267642880,3267643135,SI 3267643136,3267643391,BE 3267643392,3267643407,RU +3267643408,3267643423,EU 3267643424,3267643439,RU +3267643440,3267643455,EU 3267643456,3267643487,RU +3267643488,3267643519,EU 3267643520,3267643647,RU 3267643648,3267643903,GB +3267643904,3267644159,EU 3267644160,3267644415,BE 3267644416,3267644671,DE 3267644672,3267644927,SI +3267644928,3267644935,EU 3267644936,3267644959,BE 3267644960,3267644975,FR -3267644976,3267644991,GB -3267644992,3267645055,BE +3267644976,3267644983,GB +3267644984,3267645055,BE 3267645056,3267645183,GB +3267645184,3267645439,EU 3267645440,3267645695,GB 3267645696,3267645951,DE 3267645952,3267646207,DK +3267646208,3267647487,EU 3267647488,3267647743,GB 3267647744,3267647999,SI 3267648000,3267648255,DE -3267648256,3267648415,GB -3267648416,3267648447,BE +3267648256,3267648431,EU +3267648432,3267648447,BE 3267648448,3267648479,FR 3267648480,3267648511,GB 3267648512,3267648767,DE 3267648768,3267649023,NL 3267649024,3267649279,RU -3267649288,3267649359,DE -3267649376,3267649535,DE +3267649280,3267649295,DE +3267649296,3267649311,EU +3267649312,3267649471,DE +3267649472,3267649791,EU 3267649792,3267650303,NL +3267650304,3267650319,EU 3267650320,3267650367,AT -3267650432,3267650495,AT +3267650368,3267650463,EU +3267650464,3267650495,AT +3267650496,3267650527,EU 3267650528,3267650559,AT 3267650560,3267651071,GB 3267651072,3267651327,DE +3267651328,3267651583,EU 3267651584,3267651839,FR +3267651840,3267652095,EU 3267652096,3267652351,GB -3267652352,3267652607,GR +3267652352,3267652607,EU 3267652608,3267652863,DE 3267652864,3267653119,PT 3267653120,3267653375,GB +3267653376,3267653887,EU 3267653888,3267654143,GB +3267654144,3267654911,EU 3267654912,3267655167,SK 3267655168,3267655679,GB 3267655680,3267656191,IT 3267656192,3267656447,DK +3267656448,3267657215,EU 3267657216,3267657471,HU -3267657480,3267657487,RO +3267657472,3267657487,RO +3267657488,3267657503,EU 3267657504,3267657567,RO +3267657568,3267657663,EU 3267657664,3267657679,RO +3267657680,3267657983,EU 3267657984,3267658239,GB 3267658240,3267658495,IT +3267658496,3267658751,EU 3267658752,3267659263,CH +3267659264,3267659519,EU 3267659520,3267659775,IT +3267659776,3267660287,EU 3267660288,3267660543,CH 3267660544,3267660671,ES +3267660672,3267661311,EU 3267661312,3267661567,SK 3267661568,3267661679,GB +3267661680,3267661695,EU 3267661696,3267661823,GB -3267661824,3267661951,ES +3267661824,3267661847,ES +3267661848,3267661855,EU +3267661856,3267661887,ES +3267661888,3267662023,EU 3267662024,3267662031,ES -3267662040,3267662047,ES -3267662848,3267662887,IE +3267662032,3267662047,EU +3267662048,3267662079,ES +3267662080,3267662847,EU +3267662848,3267662879,IE +3267662880,3267662887,EU 3267662888,3267662895,GB 3267662896,3267662951,IE 3267662952,3267662959,GB -3267662960,3267663071,IE +3267662960,3267662991,IE +3267662992,3267663007,EU +3267663008,3267663071,IE +3267663072,3267663087,EU 3267663088,3267663103,IE -3267663104,3267663295,IT -3267663312,3267663327,IT +3267663104,3267663327,IT +3267663328,3267663359,EU 3267663360,3267663871,GB 3267663872,3267664127,DE +3267664128,3267664383,EU 3267664384,3267664639,GB 3267664640,3267664671,SK +3267664672,3267664799,EU 3267664800,3267664815,SK +3267664816,3267664831,EU 3267664832,3267664879,SK +3267664880,3267664887,EU 3267664888,3267664895,SK +3267664896,3267665919,EU 3267665920,3267666175,GB -3267666176,3267666207,GR -3267666240,3267666431,GR +3267666176,3267666191,EU +3267666192,3267666207,GR +3267666208,3267666255,EU +3267666256,3267666263,GR +3267666264,3267666271,EU +3267666272,3267666431,GR 3267666432,3267666447,GB -3267666464,3267666543,GB -3267666576,3267666655,GB -3267666720,3267667199,GB +3267666448,3267666463,EU +3267666464,3267666479,GB +3267666480,3267666495,EU +3267666496,3267666543,GB +3267666544,3267666575,EU +3267666576,3267666951,GB +3267666952,3267666959,EU +3267666960,3267667199,GB 3267667200,3267667455,NL -3267667456,3267667583,GB -3267667712,3267667967,GB +3267667456,3267667967,GB +3267667968,3267670015,EU 3267670016,3267671551,ZA 3267671552,3267671679,DE +3267671680,3267671711,EU 3267671712,3267671807,DE 3267671808,3267672063,NO -3267672064,3267672319,DE +3267672064,3267672223,DE +3267672224,3267672255,EU +3267672256,3267672319,DE +3267672320,3267672575,EU 3267672576,3267672831,AT -3267672832,3267673015,FR +3267672832,3267672847,FR +3267672848,3267672855,EU +3267672856,3267672927,FR +3267672928,3267672943,EU +3267672944,3267672999,FR +3267673000,3267673007,EU +3267673008,3267673015,FR +3267673016,3267673023,EU 3267673024,3267673087,FR 3267673088,3267673439,DE -3267673472,3267673487,DE -3267673496,3267673503,DE -3267673600,3267673671,DE -3267673696,3267673791,DE +3267673440,3267673471,EU +3267673472,3267673479,DE +3267673480,3267673487,EU +3267673488,3267673503,DE +3267673504,3267673599,EU +3267673600,3267673759,DE +3267673760,3267673807,EU 3267673808,3267673855,DE +3267673856,3267674111,EU 3267674112,3267674127,NL 3267674128,3267674159,GB -3267674160,3267674175,BE -3267674192,3267674207,BE +3267674160,3267674207,BE +3267674208,3267674239,GB 3267674240,3267674303,BE -3267674304,3267674367,GB +3267674304,3267674335,EU +3267674336,3267674367,GB 3267674368,3267674879,BE +3267674880,3267675135,EU 3267675136,3267675391,AT -3267675392,3267675647,CH +3267675392,3267675619,CH +3267675620,3267675623,EU +3267675624,3267675631,CH +3267675632,3267675647,EU 3267675648,3267675775,CY +3267675776,3267675903,CH +3267675904,3267676159,EU 3267676160,3267676415,GB +3267676416,3267676671,EU 3267676672,3267676679,HU +3267676680,3267676687,EU 3267676688,3267676711,HU +3267676712,3267676735,EU 3267676736,3267676767,HU +3267676768,3267676783,EU 3267676784,3267676799,HU +3267676800,3267676863,EU 3267676864,3267676879,HU -3267676920,3267676927,HU +3267676880,3267676927,EU 3267676928,3267677367,GB +3267677368,3267677375,EU 3267677376,3267677695,GB +3267677696,3267678207,EU 3267678208,3267678719,FR +3267678720,3267678975,EU 3267678976,3267679231,NL +3267679232,3267679487,EU 3267679488,3267679743,BE +3267679744,3267679999,EU 3267680000,3267680255,CZ 3267680256,3267680767,SK -3267681280,3267681535,FR -3267681792,3267681975,FR -3267681984,3267682047,FR +3267680768,3267681279,EU +3267681280,3267681319,FR +3267681320,3267681327,EU +3267681328,3267681503,FR +3267681504,3267681511,EU +3267681512,3267681535,FR +3267681536,3267681791,EU +3267681792,3267681887,FR +3267681888,3267681903,EU +3267681904,3267681975,FR +3267681976,3267682015,EU +3267682016,3267682047,FR +3267682048,3267682303,EU 3267682304,3267682559,BE -3267683328,3267683359,PL -3267683376,3267683503,PL -3267683512,3267683551,PL +3267682560,3267683335,EU +3267683336,3267683359,PL +3267683360,3267683391,EU +3267683392,3267683471,PL +3267683472,3267683519,EU +3267683520,3267683527,PL +3267683528,3267683535,EU +3267683536,3267683551,PL +3267683552,3267683567,EU 3267683568,3267683575,PL -3267683712,3267683727,PL -3267684384,3267685119,GB +3267683576,3267684383,EU +3267684384,3267684399,GB +3267684400,3267684407,EU +3267684408,3267684783,GB +3267684784,3267684791,EU +3267684792,3267685119,GB 3267685120,3267685375,DE 3267685376,3267685887,NL 3267685888,3267686399,GB +3267686400,3267687935,EU 3267687936,3267688191,IE 3267688192,3267688703,DE 3267688704,3267688959,SE +3267688960,3267689215,EU 3267689216,3267689247,CZ -3267689312,3267689471,CZ +3267689248,3267689327,EU +3267689328,3267689471,CZ +3267689472,3267689727,EU 3267689728,3267689983,GB 3267689984,3267690239,FR +3267690240,3267690271,EU 3267690272,3267690495,FR 3267690496,3267691519,FI 3267691520,3267692543,SE 3267692544,3267711999,FI 3267712000,3267712255,SE -3267712256,3267741439,FI +3267712256,3267729311,FI +3267729312,3267729343,AX +3267729344,3267741439,FI 3267741440,3267741695,BE 3267741696,3267741759,FI 3267741760,3267741791,SE 3267741792,3267741855,FI 3267741856,3267741919,SE -3267741920,3267743999,FI +3267741920,3267743743,FI +3267743744,3267743999,AX 3267744000,3267744255,DE 3267744256,3267744511,BE -3267744512,3267746303,FI +3267744512,3267745615,FI +3267745616,3267745619,AX +3267745620,3267746303,FI 3267746304,3267746559,NL 3267746560,3267756031,FI 3267756032,3267760639,SE @@ -45832,15 +76299,11 @@ 3267766352,3267766367,NO 3267766368,3267766383,SE 3267766384,3267766415,NO -3267766416,3267785727,SE -3267785728,3267785983,NO -3267785984,3267787007,SE +3267766416,3267787007,SE 3267787008,3267787263,NO 3267787264,3267787519,SE 3267787520,3267787775,NO -3267787776,3267788031,SE -3267788032,3267788287,NO -3267788288,3267793919,SE +3267787776,3267793919,SE 3267793920,3267794175,DK 3267794176,3267821567,SE 3267821568,3267887103,FR @@ -45851,156 +76314,281 @@ 3268165632,3268173823,CH 3268173824,3268182015,MT 3268182016,3268198399,PL +3268198400,3268214783,MA +3268214784,3268215583,EU 3268215584,3268215615,GB +3268215616,3268215647,EU 3268215648,3268215679,GB +3268215680,3268215711,EU 3268215712,3268215743,GB -3268215776,3268216319,GB +3268215744,3268215807,EU +3268215808,3268216063,GB +3268216064,3268218111,EU 3268218112,3268218367,GB +3268218368,3268219807,EU 3268219808,3268219823,GB -3268219856,3268219871,GB -3268221440,3268221599,GB +3268219824,3268221439,EU +3268221440,3268221471,GB +3268221472,3268221503,EU +3268221504,3268221599,GB +3268221600,3268221695,EU 3268221696,3268221951,GB +3268221952,3268222975,EU 3268222976,3268223167,GB +3268223168,3268223199,EU 3268223200,3268223231,GB +3268223232,3268224767,EU 3268224768,3268225023,US -3268226368,3268226815,GB +3268225024,3268226367,EU +3268226368,3268226639,GB +3268226640,3268226687,EU +3268226688,3268226815,GB +3268226816,3268227327,EU 3268227328,3268227391,GB +3268227392,3268227519,EU 3268227520,3268227615,GB +3268227616,3268229631,EU 3268229632,3268229887,GB -3268230656,3268230911,GB +3268229888,3268231167,EU 3268231168,3268231199,GB +3268231200,3268231319,EU 3268231320,3268231359,GB +3268231360,3268231391,EU 3268231392,3268231423,GB +3268231424,3268231647,EU 3268231648,3268231679,GB +3268231680,3268231743,EU 3268231744,3268231807,GB +3268231808,3268232223,EU 3268232224,3268232243,GB +3268232244,3268232351,EU 3268232352,3268232367,GB +3268232368,3268232383,EU 3268232384,3268232415,GB +3268232416,3268232479,EU 3268232480,3268232575,GB +3268232576,3268232959,EU 3268232960,3268233087,GB -3268233920,3268234047,GB -3268234112,3268234239,GB +3268233088,3268233983,EU +3268233984,3268234047,GB +3268234048,3268234175,EU +3268234176,3268234239,GB +3268234240,3268234559,EU 3268234560,3268234623,GB +3268234624,3268235007,EU 3268235008,3268235263,GB 3268235264,3268235519,DE 3268235520,3268235775,GB +3268235776,3268235935,EU 3268235936,3268236031,GB +3268236032,3268236191,EU 3268236192,3268236207,GB +3268236208,3268236543,EU 3268236544,3268236607,GB +3268236608,3268236671,EU 3268236672,3268236799,GB -3268237312,3268237567,GB +3268236800,3268237823,EU 3268237824,3268237847,GB +3268237848,3268237855,EU 3268237856,3268237887,GB -3268238336,3268238351,GB +3268237888,3268238335,EU +3268238336,3268238359,GB +3268238360,3268238367,DE 3268238368,3268238463,GB +3268238464,3268238471,DE +3268238472,3268238535,GB +3268238536,3268238559,EU +3268238560,3268238591,GB +3268238592,3268239103,EU 3268239104,3268239359,GB +3268239360,3268239583,EU 3268239584,3268240127,GB +3268240128,3268240159,EU 3268240160,3268240191,GB -3268240256,3268240399,GB +3268240192,3268240383,EU +3268240384,3268240399,GB +3268240400,3268240479,EU +3268240480,3268240487,GB +3268240488,3268240687,EU 3268240688,3268240695,GB +3268240696,3268240711,EU 3268240712,3268240735,GB +3268240736,3268240743,EU 3268240744,3268240751,GB -3268240776,3268240783,GB +3268240752,3268240975,EU 3268240976,3268240991,GB +3268240992,3268241007,EU 3268241008,3268241023,GB +3268241024,3268241543,EU 3268241544,3268241551,GB -3268241640,3268241663,GB +3268241552,3268241639,EU +3268241640,3268241655,GB +3268241656,3268242495,EU 3268242496,3268242523,GB -3268242880,3268243103,GB +3268242524,3268242879,EU +3268242880,3268243071,GB +3268243072,3268243327,EU 3268243328,3268243391,GB +3268243392,3268243743,EU 3268243744,3268243775,GB +3268243776,3268243967,EU 3268243968,3268244031,GB +3268244032,3268244775,EU 3268244776,3268244783,GB +3268244784,3268244791,EU 3268244792,3268244799,GB -3268245112,3268245115,GB +3268244800,3268245503,EU 3268245504,3268245759,GB +3268245760,3268246271,EU 3268246272,3268246783,GB +3268246784,3268246791,EU 3268246792,3268246807,GB -3268246912,3268246927,GB -3268246960,3268246991,GB +3268246808,3268246975,EU +3268246976,3268246991,GB +3268246992,3268248319,EU 3268248320,3268248447,GB +3268248448,3268248511,EU 3268248512,3268248543,GB +3268248544,3268248831,EU 3268248832,3268248959,GB +3268248960,3268249599,EU 3268249600,3268251311,GB 3268251312,3268251327,IE 3268251328,3268251583,GB 3268251584,3268251615,DE 3268251616,3268251631,CH 3268251632,3268251647,GB -3268253952,3268254015,GB +3268251648,3268254463,EU 3268254464,3268254543,GB +3268254544,3268254591,EU 3268254592,3268254607,GB +3268254608,3268254623,EU 3268254624,3268254639,GB +3268254640,3268254895,EU 3268254896,3268254903,GB -3268255808,3268255863,GB +3268254904,3268255823,EU +3268255824,3268255863,GB +3268255864,3268255871,EU 3268255872,3268255887,GB +3268255888,3268255895,EU 3268255896,3268255919,GB +3268255920,3268255951,EU 3268255952,3268255983,GB +3268255984,3268256895,EU 3268256896,3268256959,GB +3268256960,3268257023,EU 3268257024,3268257055,GB +3268257056,3268257087,EU 3268257088,3268257119,GB +3268257120,3268257263,EU 3268257264,3268257271,GB +3268257272,3268257415,EU 3268257416,3268257419,GB -3268257424,3268257431,GB +3268257420,3268257431,EU 3268257432,3268257439,IT +3268257440,3268257455,EU 3268257456,3268257471,GB +3268257472,3268257487,EU 3268257488,3268257527,GB +3268257528,3268258559,EU 3268258560,3268258623,GB +3268258624,3268258687,EU 3268258688,3268258751,GB +3268258752,3268259263,EU 3268259264,3268259327,GB +3268259328,3268259519,EU 3268259520,3268259527,GB +3268259528,3268259543,EU 3268259544,3268259551,GB +3268259552,3268259559,EU 3268259560,3268259575,GB +3268259576,3268259807,EU 3268259808,3268259823,GB +3268259824,3268259831,EU 3268259832,3268260095,GB +3268260096,3268260351,EU 3268260352,3268260383,GB -3268260416,3268260479,GB +3268260384,3268260415,EU +3268260416,3268260447,GB +3268260448,3268260511,EU 3268260512,3268260607,GB +3268260608,3268260639,EU 3268260640,3268260647,GB +3268260648,3268260655,EU 3268260656,3268260671,GB +3268260672,3268261935,EU 3268261936,3268261951,GB +3268261952,3268262767,EU 3268262768,3268262783,GB +3268262784,3268262879,EU 3268262880,3268262887,GB +3268262888,3268263231,EU 3268263232,3268263263,GB -3268263392,3268263423,GB +3268263264,3268263775,EU 3268263776,3268263783,GB +3268263784,3268264735,EU 3268264736,3268264767,GB +3268264768,3268265415,EU 3268265416,3268265431,GB +3268265432,3268265983,EU 3268265984,3268266495,GB +3268266496,3268266983,EU 3268266984,3268266991,GB +3268266992,3268267535,EU 3268267536,3268267551,GB +3268267552,3268267583,EU 3268267584,3268267599,GB +3268267600,3268267615,EU 3268267616,3268267647,GB +3268267648,3268267743,EU 3268267744,3268267775,GB +3268267776,3268267951,EU 3268267952,3268267959,GB +3268267960,3268268543,EU 3268268544,3268268799,GB +3268268800,3268270351,EU 3268270352,3268270367,GB +3268270368,3268270495,EU 3268270496,3268270511,GB +3268270512,3268270847,EU 3268270848,3268271359,GB +3268271360,3268271911,EU 3268271912,3268271919,GB +3268271920,3268271927,EU 3268271928,3268271935,GB -3268272704,3268272719,GB +3268271936,3268272703,EU +3268272704,3268272711,GB +3268272712,3268272727,EU 3268272728,3268272743,GB -3268272752,3268272759,GB +3268272744,3268273023,EU 3268273024,3268273151,GB -3268273920,3268273983,GB +3268273152,3268274111,EU 3268274112,3268274175,GB +3268274176,3268274455,EU 3268274456,3268274459,GB +3268274460,3268274527,EU 3268274528,3268274543,GB +3268274544,3268274559,EU 3268274560,3268274591,GB -3268275776,3268275839,GB +3268274592,3268275983,EU 3268275984,3268275999,GB +3268276000,3268276639,EU 3268276640,3268276655,GB +3268276656,3268276671,EU 3268276672,3268276687,GB +3268276688,3268276767,EU 3268276768,3268276799,GB +3268276800,3268276863,EU 3268276864,3268276895,GB +3268276896,3268277055,EU 3268277056,3268277119,GB +3268277120,3268277759,EU 3268277760,3268278015,GB +3268278016,3268278463,EU 3268278464,3268278495,GB +3268278496,3268280063,EU 3268280064,3268280319,GB -3268280320,3268299007,FR -3268299008,3268299263,CF -3268299264,3268335615,FR +3268280320,3268335615,FR 3268335616,3268335871,CH 3268335872,3268345855,FR 3268345856,3268411391,GB @@ -46026,7 +76614,7 @@ 3268703808,3268728287,CZ 3268728288,3268728299,CR 3268728300,3268739071,CZ -3268739072,3268739327,NL +3268739072,3268739327,DE 3268739328,3268739583,PL 3268739584,3268739839,DE 3268739840,3268740095,CH @@ -46051,7 +76639,7 @@ 3268744960,3268745215,UA 3268745216,3268745471,KZ 3268745472,3268745727,RU -3268745728,3268745983,SI +3268745728,3268745983,PL 3268745984,3268746239,DE 3268746240,3268746495,GB 3268746496,3268746751,IE @@ -46059,10 +76647,26 @@ 3268747008,3268747263,DE 3268747264,3268755455,CZ 3268755456,3268763647,SE -3268763648,3268771839,IT +3268763648,3268764159,RU +3268764160,3268764671,DE +3268764672,3268765183,LV +3268765184,3268765695,RU +3268765696,3268766719,UA +3268766720,3268767231,IL +3268767232,3268767743,RU +3268767744,3268768255,NL +3268768256,3268768767,BE +3268768768,3268769279,RU +3268769280,3268769791,SE +3268769792,3268770303,UA +3268770304,3268770815,RU +3268770816,3268771327,FR +3268771328,3268771839,NL 3268771840,3268788223,NO 3268788224,3268804607,CZ -3268804608,3268869375,FR +3268804608,3268848895,FR +3268848896,3268849151,A2 +3268849152,3268869375,FR 3268869376,3268870143,PF 3268870144,3268876063,FI 3268876064,3268876127,SE @@ -46072,7 +76676,9 @@ 3268881152,3268881407,SE 3268881408,3268881919,FI 3268881920,3268882175,SE -3268882176,3268916223,FI +3268882176,3268897519,FI +3268897520,3268897535,AX +3268897536,3268916223,FI 3268916224,3268916479,GB 3268916480,3268920575,FI 3268920576,3268920831,SE @@ -46088,114 +76694,175 @@ 3269132288,3269197823,GR 3269197824,3269200639,RU 3269200640,3269200895,UA -3269200896,3269202175,RU -3269202176,3269202431,UA -3269202432,3269212671,RU +3269200896,3269212671,RU 3269212672,3269213183,UA -3269213184,3269231871,RU -3269231872,3269232127,UA -3269232128,3269233407,RU -3269233408,3269233663,UA -3269233664,3269239039,RU +3269213184,3269239039,RU 3269239040,3269239295,UA 3269239296,3269263359,RU +3269263360,3269264639,EU 3269264640,3269264895,DE +3269264896,3269265855,EU 3269265856,3269265919,DE 3269265920,3269266175,GB +3269266176,3269266687,EU 3269266688,3269266943,DE 3269266944,3269267455,GB +3269267456,3269272575,EU 3269272576,3269272583,DE +3269272584,3269272703,EU 3269272704,3269272831,DE 3269272832,3269272847,GB -3269272848,3269272959,NL +3269272848,3269272863,NL +3269272864,3269272887,GB +3269272888,3269272895,EU +3269272896,3269273087,NL 3269273088,3269273343,DE +3269273344,3269273599,EU 3269273600,3269273855,GB 3269273856,3269275647,DE +3269275648,3269275903,EU 3269275904,3269276159,DE 3269276160,3269276415,GB +3269276416,3269277183,EU 3269277184,3269277695,FR +3269277696,3269277759,GB +3269277760,3269278719,NL +3269278720,3269279231,EU 3269279232,3269279487,NL +3269279488,3269279671,EU 3269279672,3269279679,CH +3269279680,3269279743,EU +3269279744,3269279999,GB +3269280000,3269280767,NL 3269280768,3269281023,GB 3269281024,3269281279,DE -3269281536,3269281663,DE +3269281280,3269282047,EU 3269282048,3269282303,DE 3269282304,3269282559,GB 3269282560,3269282815,FR +3269282816,3269283327,EU 3269283328,3269283583,DE +3269283584,3269283871,EU 3269283872,3269283903,DE +3269283904,3269284095,EU 3269284096,3269284351,GB -3269284992,3269285055,FR +3269284352,3269284863,EU +3269284864,3269285055,FR +3269285056,3269285087,EU 3269285088,3269285135,DE +3269285136,3269285151,EU 3269285152,3269285215,DE -3269285240,3269285247,FR +3269285216,3269285311,EU 3269285312,3269285327,DE +3269285328,3269285343,FR +3269285344,3269285631,EU 3269285632,3269285887,DE +3269285888,3269286399,EU 3269286400,3269286463,DE +3269286464,3269288687,EU 3269288688,3269288959,DE +3269288960,3269290559,EU 3269290560,3269290575,DE +3269290576,3269290591,EU 3269290592,3269290687,DE +3269290688,3269290735,EU 3269290736,3269290743,DE +3269290744,3269291263,EU 3269291264,3269291519,DE -3269291520,3269291551,GB +3269291520,3269291559,GB +3269291560,3269291583,EU 3269291584,3269291647,GB +3269291648,3269291775,EU 3269291776,3269292287,ES +3269292288,3269293119,EU 3269293120,3269293151,DE +3269293152,3269293207,EU 3269293208,3269293215,DE +3269293216,3269293247,EU 3269293248,3269293279,DE -3269293376,3269293383,DE +3269293280,3269293375,EU +3269293376,3269293391,DE +3269293392,3269293855,EU 3269293856,3269293887,DE +3269293888,3269293919,EU 3269293920,3269293951,DE +3269293952,3269296231,EU 3269296232,3269296235,DE +3269296236,3269296367,EU 3269296368,3269296375,DE +3269296376,3269297151,EU 3269297152,3269297663,GB +3269297664,3269298663,EU 3269298664,3269298671,DE +3269298672,3269303039,EU 3269303040,3269303295,DE 3269303296,3269303423,GB +3269303424,3269303551,EU 3269303552,3269303679,DE +3269303680,3269305343,EU 3269305344,3269305351,DE +3269305352,3269305855,EU 3269305856,3269306879,DE +3269306880,3269307647,EU 3269307648,3269307903,DE +3269307904,3269310655,EU 3269310656,3269310671,DE +3269310672,3269310975,EU 3269310976,3269311231,DE +3269311232,3269311871,EU 3269311872,3269311999,DE +3269312000,3269313791,EU 3269313792,3269314175,DE +3269314176,3269314191,EU 3269314192,3269314199,DE +3269314200,3269315583,EU 3269315584,3269315591,DE +3269315592,3269317631,EU 3269317632,3269317663,GB 3269317664,3269317671,IE 3269317672,3269317887,GB 3269317888,3269318399,DE 3269318400,3269318655,GB 3269318656,3269318983,DE +3269318984,3269319007,EU 3269319008,3269319047,DE +3269319048,3269319055,EU 3269319056,3269319071,DE +3269319072,3269319135,EU 3269319136,3269320447,DE +3269320448,3269320703,EU 3269320704,3269321727,GB +3269321728,3269322239,EU 3269322240,3269322495,DE +3269322496,3269322679,EU 3269322680,3269322683,DE +3269322684,3269322751,EU 3269322752,3269323263,DE +3269323264,3269326847,EU 3269326848,3269326855,DE +3269326856,3269326959,EU 3269326960,3269326971,DE +3269326972,3269326991,EU 3269326992,3269326999,DE +3269327000,3269327023,EU 3269327024,3269327039,DE +3269327040,3269327055,EU 3269327056,3269327103,DE +3269327104,3269327759,EU 3269327760,3269327767,DE +3269327768,3269327863,EU 3269327864,3269328383,DE +3269328384,3269328895,EU 3269328896,3269459967,GB 3269459968,3269525503,ES -3269525504,3269591039,IR +3269525504,3269556223,IR +3269556224,3269556479,AE +3269556480,3269591039,IR 3269591040,3269621759,RU 3269621760,3269623551,BY -3269623552,3269623807,RU -3269623808,3269625855,KZ -3269625856,3269626367,RU -3269626368,3269627135,KZ -3269627136,3269656575,RU +3269623552,3269656575,RU 3269656576,3269722111,GB -3269722112,3269731839,CZ -3269731840,3269732095,CR -3269732096,3269750799,CZ +3269722112,3269750799,CZ 3269750800,3269750815,CR 3269750816,3269787647,CZ 3269787648,3269853183,NL @@ -46204,97 +76871,157 @@ 3269936064,3269936079,NL 3269936080,3269984255,DE 3269984256,3270049791,AT -3270049792,3270115327,DE +3270049792,3270062191,DE +3270062192,3270062195,ES +3270062196,3270078391,DE +3270078392,3270078395,ES +3270078396,3270115327,DE +3270115328,3270117503,EU 3270117504,3270117631,DK -3270118400,3270120703,DK +3270117632,3270122239,EU 3270122240,3270122495,DK +3270122496,3270123715,EU 3270123716,3270123719,DK +3270123720,3270123775,EU 3270123776,3270124031,DK +3270124032,3270124543,EU 3270124544,3270124799,DK +3270124800,3270125055,EU 3270125056,3270125567,DK +3270125568,3270126079,EU 3270126080,3270126335,DK +3270126336,3270126623,EU 3270126624,3270126655,DK +3270126656,3270131967,EU 3270131968,3270132223,NO +3270132224,3270132991,EU 3270132992,3270133023,NO +3270133024,3270136927,EU 3270136928,3270136959,NO +3270136960,3270136991,EU 3270136992,3270137055,NO -3270137344,3270138111,NO +3270137056,3270140927,EU 3270140928,3270141439,NO +3270141440,3270142207,EU 3270142208,3270142463,NO +3270142464,3270143999,EU 3270144000,3270144767,NO +3270144768,3270146815,EU 3270146816,3270147327,NO +3270147328,3270147583,EU 3270147584,3270148095,NO 3270148096,3270151423,FI +3270151424,3270151935,EU 3270151936,3270154527,FI +3270154528,3270155007,EU 3270155008,3270155775,FI +3270155776,3270156287,EU 3270156288,3270156799,DK +3270156800,3270159615,EU 3270159616,3270159871,DK +3270159872,3270164991,EU 3270164992,3270165247,NO +3270165248,3270166527,EU 3270166528,3270167807,NO +3270167808,3270169087,EU 3270169088,3270169343,NO +3270169344,3270170111,EU 3270170112,3270170623,NO -3270173184,3270173951,NO +3270170624,3270174719,EU 3270174720,3270174975,NO +3270174976,3270175743,EU 3270175744,3270175999,NO -3270176768,3270177023,NO -3270181120,3270181887,CH -3270182144,3270183679,CH -3270188288,3270188799,CH -3270189056,3270190079,BE +3270176000,3270181119,EU +3270181120,3270181375,CH +3270181376,3270181631,EU +3270181632,3270181887,CH +3270181888,3270182143,EU +3270182144,3270182399,CH +3270182400,3270182655,EU +3270182656,3270183679,CH +3270183680,3270189055,EU +3270189056,3270189311,BE +3270189312,3270190079,EU 3270190080,3270190591,IT -3270190592,3270191359,CH -3270191616,3270192047,CH -3270193152,3270193919,CH -3270194176,3270194431,CH -3270194688,3270194943,CH -3270195456,3270195967,CH -3270196480,3270197247,CH -3270198528,3270199039,NL -3270199808,3270201087,NL +3270190592,3270191103,CH +3270191104,3270191935,EU +3270191936,3270192047,CH +3270192048,3270196991,EU +3270196992,3270197247,CH +3270197248,3270200063,EU +3270200064,3270200319,NL +3270200320,3270201343,EU 3270201344,3270201599,NL -3270202624,3270203135,NL -3270204416,3270205695,NL +3270201600,3270202879,EU +3270202880,3270203135,NL +3270203136,3270205439,EU +3270205440,3270205695,NL +3270205696,3270205983,EU 3270205984,3270205999,ES +3270206000,3270206063,EU 3270206064,3270206079,ES +3270206080,3270206975,EU 3270206976,3270207231,ES 3270207232,3270207487,CH +3270207488,3270207743,EU 3270207744,3270207903,IT +3270207904,3270207999,EU 3270208000,3270208255,CH 3270208256,3270208511,LU +3270208512,3270208767,EU 3270208768,3270209023,RO 3270209024,3270209279,NL -3270210560,3270211071,NL -3270211328,3270211583,NL +3270209280,3270212351,EU 3270212352,3270212863,NL +3270212864,3270213119,EU 3270213120,3270213631,NL +3270213632,3270213887,EU 3270213888,3270214279,PT 3270214280,3270214287,US 3270214288,3270214303,PT +3270214304,3270214319,EU 3270214320,3270215439,PT +3270215440,3270215519,EU 3270215520,3270215935,PT +3270215936,3270216191,EU 3270216192,3270216351,PT +3270216352,3270216383,EU 3270216384,3270216703,PT +3270216704,3270216735,EU 3270216736,3270216751,IT +3270216752,3270216799,EU 3270216800,3270216815,IT +3270216816,3270216831,EU 3270216832,3270216879,IT -3270217472,3270219775,CH -3270222336,3270223871,IT +3270216880,3270217471,EU +3270217472,3270217727,CH +3270217728,3270218495,EU +3270218496,3270218751,CH +3270218752,3270224639,EU 3270224640,3270224895,CH -3270225408,3270225663,CH -3270230016,3270230783,LU +3270224896,3270230271,EU +3270230272,3270230783,LU +3270230784,3270231295,EU 3270231296,3270231647,LU -3270231808,3270232831,LU +3270231648,3270232575,EU +3270232576,3270232831,LU +3270232832,3270234111,EU 3270234112,3270234367,LU -3270234368,3270238719,NL -3270238976,3270239999,CH -3270240000,3270240255,NL -3270240768,3270241023,NL -3270241280,3270241535,NL -3270241536,3270242559,RO -3270242816,3270243071,AT +3270234368,3270234623,NL +3270234624,3270235135,EU +3270235136,3270236159,NL +3270236160,3270238207,EU +3270238208,3270238719,NL +3270238720,3270238975,EU +3270238976,3270239487,CH +3270239488,3270241791,EU +3270241792,3270242559,RO +3270242560,3270243327,EU 3270243328,3270243839,RO -3270243840,3270244351,NL -3270244352,3270245887,CH +3270243840,3270244095,EU +3270244096,3270244351,NL +3270244352,3270244863,CH +3270244864,3270245887,EU 3270245888,3270246143,RO 3270246144,3270246399,CH 3270246400,3270247951,SE @@ -46304,8 +77031,20 @@ 3270369928,3270377471,SE 3270377472,3270443007,GB 3270443008,3270508543,DK -3270508544,3270639615,FI -3270639616,3270647807,IT +3270508544,3270522367,FI +3270522368,3270522623,AX +3270522624,3270639615,FI +3270639616,3270640127,PL +3270640128,3270642175,RU +3270642176,3270642687,NO +3270642688,3270643199,DE +3270643200,3270643711,RU +3270643712,3270644223,AT +3270644224,3270644735,NL +3270644736,3270645247,DE +3270645248,3270645759,PL +3270645760,3270646271,IL +3270646272,3270647807,RU 3270647808,3270648063,TR 3270648064,3270648319,RU 3270648320,3270648575,CH @@ -46328,6 +77067,7 @@ 3270653440,3270653695,NL 3270653696,3270653951,GB 3270653952,3270654207,ES +3270654208,3270654463,EU 3270654464,3270654719,BE 3270654720,3270655231,UA 3270655232,3270655487,IT @@ -46349,13 +77089,13 @@ 3270781360,3270808127,IT 3270808128,3270808159,LU 3270808160,3270836223,IT -3270836224,3270911807,DE -3270911840,3270911935,DE +3270836224,3270911839,DE +3270911840,3270911871,PL +3270911872,3270911935,DE 3270911936,3270911967,PL 3270911968,3270911999,NL -3270912000,3270920191,DE -3270922240,3270926335,DE -3270926336,3270926591,AT +3270912000,3270926335,DE +3270926336,3270926591,US 3270926592,3270926847,CH 3270926848,3270927103,PL 3270927104,3270927359,UA @@ -46367,8 +77107,7 @@ 3270928896,3270929407,PL 3270929408,3270929919,GB 3270929920,3270930431,BG -3270930432,3270930943,RU -3270930944,3270931455,NL +3270930432,3270931455,RU 3270931456,3270931967,UA 3270931968,3270932479,CH 3270932480,3270932991,UA @@ -46376,55 +77115,50 @@ 3270933504,3270934015,PL 3270934016,3270934527,IT 3270934528,3270967295,DE -3270967296,3270975487,IT -3270975488,3270991871,GB +3270967296,3270968319,PL +3270968320,3270968831,DE +3270968832,3270969343,SE +3270969344,3270969855,CH +3270969856,3270970367,AT +3270970368,3270970879,UA +3270970880,3270971391,RU +3270971392,3270972415,UA +3270972416,3270973951,RU +3270973952,3270974463,FR +3270974464,3270974975,IT +3270974976,3270975487,NL +3270983680,3270991871,GB 3270991872,3271000063,NL 3271000064,3271008255,RU -3271008256,3271016447,IT -3271016448,3271018655,CS -3271018656,3271018671,CS -3271018672,3271019111,CS -3271019112,3271019119,RS -3271019120,3271019271,CS -3271019272,3271019295,RS -3271019296,3271019767,CS -3271019768,3271019775,RS -3271019776,3271019903,CS -3271019904,3271019919,RS -3271019920,3271020215,CS -3271020216,3271020223,RS -3271020224,3271020239,CS -3271020240,3271020255,RS -3271020256,3271020271,CS -3271020272,3271020279,RS -3271020280,3271020511,CS -3271020512,3271020543,CS -3271020544,3271020695,CS -3271020696,3271020703,CS -3271020704,3271020735,CS -3271020736,3271020743,RS -3271020744,3271020759,CS -3271020760,3271020767,RS -3271020768,3271022159,CS -3271022160,3271022175,RS -3271022176,3271022335,CS +3271008256,3271008767,BE +3271008768,3271009279,SI +3271009280,3271009791,MD +3271009792,3271010303,IL +3271010304,3271010815,RU +3271010816,3271011327,GB +3271011328,3271013375,UA +3271013376,3271013887,FR +3271013888,3271014399,UA +3271014400,3271014911,RU +3271014912,3271015423,RO +3271015424,3271015935,DK +3271015936,3271016447,RU +3271016448,3271022335,RS 3271022336,3271022463,CY -3271022464,3271022583,CS -3271022584,3271022591,RS -3271022592,3271024395,CS -3271024396,3271024447,CS +3271022464,3271024447,RS 3271024448,3271024451,BA -3271024452,3271024455,CS -3271024456,3271024495,CS -3271024496,3271024639,CS +3271024452,3271024639,RS 3271024640,3271032831,GB 3271032832,3271098367,NO 3271098368,3271163903,SI 3271163904,3271200767,FR 3271200768,3271200775,GB -3271200776,3271200783,ES -3271200784,3271229439,FR -3271229440,3271249919,FI +3271200776,3271229439,FR +3271229440,3271244191,FI +3271244192,3271244223,AX +3271244224,3271247867,FI +3271247868,3271247871,AX +3271247872,3271249919,FI 3271249920,3271250175,SE 3271250176,3271280351,FI 3271280352,3271280383,RU @@ -46432,13 +77166,19 @@ 3271280688,3271280703,SE 3271280704,3271280719,FI 3271280720,3271280735,SE -3271280736,3271290623,FI +3271280736,3271282687,FI +3271282688,3271284735,AX +3271284736,3271290623,FI 3271290624,3271290879,BE -3271290880,3271310079,FI +3271290880,3271299071,FI +3271299072,3271299199,AX +3271299200,3271301631,FI +3271301632,3271302143,AX +3271302144,3271310079,FI 3271310080,3271310335,DE -3271310336,3271341247,FI -3271341248,3271341311,SE -3271341312,3271360511,FI +3271310336,3271324031,FI +3271324032,3271324063,AX +3271324064,3271360511,FI 3271360512,3271363407,GB 3271363408,3271363415,AT 3271363416,3271363423,GB @@ -46446,6 +77186,7 @@ 3271363456,3271363471,GB 3271363472,3271363487,ZA 3271363488,3271363519,IT +3271363520,3271363551,EU 3271363552,3271363583,FR 3271363584,3271365887,GB 3271365888,3271366143,DE @@ -46570,18 +77311,38 @@ 3271425536,3271426047,DE 3271426048,3271426303,PF 3271426304,3271491583,FR -3271491584,3271557119,DK +3271491584,3271495679,DK +3271495680,3271495807,SE +3271495808,3271557119,DK 3271557120,3271589887,BE 3271589888,3271688191,NO +3271688192,3271691775,EU 3271691776,3271692031,US 3271692032,3271692287,GB +3271692288,3271694847,EU +3271694848,3271695103,GB +3271695104,3271696383,EU 3271696384,3271698431,DE +3271698432,3271704575,EU 3271704576,3271712767,RU -3271712768,3271720959,LV +3271712768,3271716863,LV +3271716864,3271717119,RU +3271717120,3271720959,LV 3271720960,3271729151,GB 3271729152,3271737343,DE +3271737344,3271738367,RU +3271738368,3271738879,RO +3271738880,3271739391,RU +3271739392,3271739903,AT +3271739904,3271740415,IE +3271740416,3271740927,UA +3271740928,3271741439,RU +3271741440,3271741951,PL +3271741952,3271743999,RU +3271744000,3271744511,RO +3271744512,3271745023,AT +3271745024,3271745535,PL 3271745536,3271746047,GB -3271746048,3271746559,IE 3271746560,3271747071,CH 3271747072,3271747583,KZ 3271747584,3271748095,RU @@ -46630,7 +77391,11 @@ 3271818240,3271819263,RU 3271819264,3271821246,DE 3271821247,3271821247,AT -3271821248,3271884799,DE +3271821248,3271847487,DE +3271847488,3271847495,US +3271847496,3271851879,DE +3271851880,3271851887,NL +3271851888,3271884799,DE 3271884800,3271901183,UA 3271901184,3271909375,ES 3271909376,3271909887,RO @@ -46642,9 +77407,9 @@ 3271912960,3271913471,NL 3271913472,3271913983,NO 3271913984,3271914495,RO -3271914496,3271915007,EE +3271914496,3271915007,ES 3271915008,3271915519,SE -3271915520,3271916031,IL +3271915520,3271916031,NL 3271916032,3271916543,GB 3271916544,3271917055,UA 3271917056,3271917567,RO @@ -46700,30 +77465,32 @@ 3272065504,3272065535,GB 3272065536,3272065551,NL 3272065552,3272065559,GB -3272065560,3272065599,NL +3272065560,3272065575,NL +3272065576,3272065583,GB +3272065584,3272065599,NL 3272065600,3272065615,GB 3272065616,3272065663,NL 3272065664,3272065791,GB 3272065792,3272065823,NL -3272065824,3272065839,GB -3272065840,3272065855,NL -3272065856,3272066303,GB -3272066304,3272066431,NL +3272065824,3272066335,GB +3272066336,3272066431,NL 3272066432,3272066815,GB 3272066816,3272066879,NL 3272066880,3272066911,GB 3272066912,3272066943,NL -3272066944,3272067055,GB -3272067056,3272067071,NL +3272066944,3272067063,GB +3272067064,3272067071,NL 3272067072,3272067327,GB -3272067328,3272067647,NL +3272067328,3272067583,NL +3272067584,3272067615,GB +3272067616,3272067647,NL 3272067648,3272067711,GB 3272067712,3272067775,NL 3272067776,3272067807,GB 3272067808,3272067839,NL 3272067840,3272067871,GB -3272067872,3272067895,NL -3272067896,3272067927,GB +3272067872,3272067887,NL +3272067888,3272067927,GB 3272067928,3272067967,NL 3272067968,3272068095,GB 3272068096,3272068351,NL @@ -46756,8 +77523,8 @@ 3272070648,3272070655,NL 3272070656,3272070911,GB 3272070912,3272071167,NL -3272071168,3272071231,GB -3272071232,3272071283,NL +3272071168,3272071247,GB +3272071248,3272071283,NL 3272071284,3272071287,GB 3272071288,3272071295,NL 3272071296,3272071327,GB @@ -46770,10 +77537,11 @@ 3272072192,3272073215,NL 3272073216,3272081407,GB 3272081408,3272081919,PT -3272081920,3272083455,CV +3272081920,3272082687,CV +3272082688,3272083455,PT 3272083456,3272083711,ST -3272083712,3272084223,PT -3272084224,3272084991,CV +3272083712,3272084735,PT +3272084736,3272084991,CV 3272084992,3272085503,GW 3272085504,3272086015,AO 3272086016,3272086527,ST @@ -46787,25 +77555,28 @@ 3272086976,3272087039,AN 3272087040,3272087295,PT 3272087296,3272087551,AO -3272087552,3272087807,GH -3272087808,3272088063,CV +3272087552,3272088063,PT 3272088064,3272088319,GH -3272088320,3272088575,CV -3272088576,3272088831,PT -3272088832,3272089087,GH -3272089088,3272089343,PT +3272088320,3272089343,PT 3272089344,3272089479,ST 3272089480,3272089535,PT 3272089536,3272089551,ST 3272089552,3272089599,PT -3272097792,3272101375,GB -3272101376,3272101383,FR -3272101384,3272101391,GB -3272101392,3272101399,IT -3272101400,3272101407,NL -3272101408,3272101415,ES -3272101416,3272101423,PT -3272101424,3272106239,GB +3272089600,3272090111,NO +3272090112,3272091647,RU +3272091648,3272092671,UA +3272092672,3272093183,RU +3272093184,3272094207,RO +3272094208,3272094719,AM +3272094720,3272095231,PL +3272095232,3272095743,FI +3272095744,3272096255,UA +3272096256,3272096767,PT +3272096768,3272097279,FI +3272097280,3272097791,RU +3272097792,3272098519,GB +3272098520,3272098527,FR +3272098528,3272106239,GB 3272106240,3272106495,PL 3272106496,3272106751,SE 3272106752,3272107007,PL @@ -46827,6 +77598,7 @@ 3272111104,3272111871,GB 3272111872,3272112383,RO 3272112384,3272113151,DE +3272113152,3272113407,FR 3272113408,3272113663,PL 3272113664,3272113919,GB 3272113920,3272114175,AT @@ -46844,135 +77616,184 @@ 3272135680,3272136191,AT 3272136192,3272136703,FR 3272136704,3272137215,PL -3272137216,3272137727,UA +3272137216,3272137727,LT 3272137728,3272138239,PL 3272138240,3272138751,BG 3272138752,3272146943,DE 3272146944,3272161023,RU 3272161024,3272161279,KZ -3272161280,3272169215,RU -3272169216,3272169471,UA -3272169472,3272178559,RU +3272161280,3272178559,RU 3272178560,3272178623,UA -3272178624,3272210175,RU -3272210176,3272210431,UA -3272210432,3272212479,RU +3272178624,3272212479,RU 3272212480,3272212991,GB -3272212992,3272213375,BE +3272212992,3272213375,EU 3272213376,3272213391,IT 3272213392,3272213399,GB +3272213400,3272213407,EU 3272213408,3272213415,NL +3272213416,3272213423,EU 3272213424,3272213431,NL 3272213432,3272213455,GB +3272213456,3272213471,EU 3272213472,3272213487,CY 3272213488,3272213495,GB +3272213496,3272213503,EU 3272213504,3272213567,IT 3272213568,3272213575,GB 3272213576,3272213583,IE 3272213584,3272213599,DE +3272213600,3272213631,EU 3272213632,3272213639,NL +3272213640,3272213655,EU 3272213656,3272213663,IT +3272213664,3272213671,EU 3272213672,3272213679,IT +3272213680,3272213695,EU 3272213696,3272213735,IT +3272213736,3272213751,EU 3272213752,3272213759,IT 3272213760,3272213823,NL 3272213824,3272213831,DE 3272213832,3272213839,NL 3272213840,3272213855,RU -3272213856,3272213887,NL +3272213856,3272213887,EU 3272213888,3272214015,GB 3272214016,3272214271,ES 3272214272,3272214351,GB 3272214352,3272214407,FR +3272214408,3272214431,EU 3272214432,3272214463,SE +3272214464,3272214655,EU 3272214656,3272214671,NL 3272214672,3272214679,GB 3272214680,3272214687,FR +3272214688,3272214815,EU 3272214816,3272214823,CH +3272214824,3272214831,EU 3272214832,3272214847,BE 3272214848,3272214879,NL +3272214880,3272214883,EU 3272214884,3272214887,NL -3272214888,3272214895,FR +3272214888,3272214895,EU 3272214896,3272214903,ES 3272214904,3272214911,SE +3272214912,3272214943,EU 3272214944,3272214951,DE 3272214952,3272214959,BE 3272214960,3272215007,NL 3272215008,3272215015,FR 3272215016,3272215023,IT +3272215024,3272215039,EU 3272215040,3272215295,ES 3272215296,3272215551,IR 3272215552,3272215807,CH 3272215808,3272215823,NL +3272215824,3272215871,EU 3272215872,3272215879,BE +3272215880,3272215883,EU 3272215884,3272215919,CH 3272215920,3272215935,NL 3272215936,3272215999,GB +3272216000,3272216015,EU 3272216016,3272216031,DE +3272216032,3272216039,EU 3272216040,3272216047,GB +3272216048,3272216191,EU 3272216192,3272216207,BE +3272216208,3272216215,EU 3272216216,3272216223,FR 3272216224,3272216231,DE +3272216232,3272216239,EU 3272216240,3272216255,NL 3272216256,3272216287,CH +3272216288,3272216303,EU 3272216304,3272216311,ES +3272216312,3272216319,EU 3272216320,3272216351,NL 3272216352,3272216383,DE 3272216384,3272216447,CH +3272216448,3272216451,EU 3272216452,3272216455,NL +3272216456,3272216463,EU 3272216464,3272216479,FR 3272216480,3272216495,IR -3272216512,3272216543,NL -3272216544,3272216575,IT +3272216496,3272216511,EU +3272216512,3272216575,IT 3272216576,3272216895,GB 3272216896,3272216911,FR 3272216912,3272216927,DE +3272216928,3272216959,EU 3272216960,3272217007,GB +3272217008,3272217215,EU 3272217216,3272217279,BE 3272217280,3272217303,DE 3272217304,3272217311,BE +3272217312,3272217599,EU 3272217600,3272217631,CH -3272217632,3272217639,IT +3272217632,3272217855,EU 3272217856,3272217875,ES +3272217876,3272217879,EU 3272217880,3272217895,IT +3272217896,3272217911,ES +3272217912,3272217919,EU 3272217920,3272217983,DE 3272217984,3272218079,ES +3272218080,3272218111,EU 3272218112,3272218623,GB 3272218624,3272218639,RU 3272218640,3272218671,DE +3272218672,3272218687,EU 3272218688,3272218719,DE +3272218720,3272218879,EU 3272218880,3272219135,BE 3272219136,3272219391,NL +3272219392,3272219647,EU 3272219648,3272219903,FR 3272219904,3272220159,DE 3272220160,3272220415,FR 3272220416,3272221183,GB 3272221184,3272221311,NL +3272221312,3272221439,EU 3272221440,3272221447,SE +3272221448,3272221455,NO +3272221456,3272221463,SE +3272221464,3272221695,EU +3272221696,3272221951,NL 3272221952,3272222207,GB 3272222208,3272222463,ES +3272222464,3272222719,NL 3272222720,3272222975,DE 3272222976,3272223015,GB +3272223016,3272223023,EU 3272223024,3272223039,GB +3272223040,3272223231,EU 3272223232,3272223487,NL 3272223488,3272223743,GB 3272223744,3272223775,GI +3272223776,3272223807,EU 3272223808,3272223815,CY +3272223816,3272223823,EU 3272223824,3272223839,GB +3272223840,3272223999,EU 3272224000,3272224255,GB 3272224256,3272224383,GI +3272224384,3272224511,EU 3272224512,3272225279,GB +3272225280,3272225791,IT +3272225792,3272226047,EU 3272226048,3272226815,FR 3272226816,3272227071,GB 3272227072,3272227327,NL 3272227328,3272227359,US 3272227360,3272227511,GB +3272227512,3272227519,EU 3272227520,3272227583,GB 3272227584,3272227839,FR 3272227840,3272228095,ES 3272228096,3272228223,GB 3272228224,3272228351,ES 3272228352,3272228607,FR +3272228608,3272228623,NL 3272228624,3272228631,CY 3272228632,3272228639,NL 3272228640,3272228671,IT @@ -46983,9 +77804,11 @@ 3272228864,3272237055,LU 3272237056,3272240575,GB 3272240576,3272240639,GH -3272240640,3272245247,GB +3272240640,3272243967,GB +3272243968,3272244007,IM +3272244008,3272245247,GB 3272245248,3272261631,FI -3272261632,3272261887,AT +3272261632,3272261887,MT 3272261888,3272262143,BG 3272262144,3272262399,IL 3272262400,3272262655,DE @@ -47004,12 +77827,12 @@ 3272265984,3272266239,GB 3272266240,3272266495,UA 3272266496,3272266751,SE -3272266752,3272267007,RU +3272266752,3272267007,NL 3272267008,3272267263,GB 3272267264,3272267519,SE 3272267520,3272267775,GB 3272267776,3272268031,LV -3272268032,3272268287,CH +3272268032,3272268287,MT 3272268288,3272268543,UA 3272268544,3272268799,RO 3272268800,3272269055,IL @@ -47023,26 +77846,52 @@ 3272353792,3272355839,CH 3272355840,3272356863,GB 3272356864,3272357887,RO -3272357888,3272358911,FI +3272357888,3272358911,UA 3272358912,3272359935,NL 3272359936,3272368127,RU 3272368128,3272376319,KZ 3272376320,3272384511,SK 3272384512,3272392703,LT 3272392704,3272400895,AT -3272400896,3272400911,GB -3272400920,3272400935,GB -3272401024,3272401119,GB +3272400896,3272400903,EU +3272400904,3272400927,GB +3272400928,3272401023,EU +3272401024,3272401087,GB +3272401088,3272401183,EU 3272401184,3272401199,GB -3272401280,3272401407,GB -3272401920,3272401967,GB +3272401200,3272401407,EU +3272401408,3272401919,ES +3272401920,3272401951,GB +3272401952,3272401983,EU +3272401984,3272402015,DE +3272402016,3272402031,EU 3272402032,3272402039,GB +3272402040,3272402047,US +3272402048,3272402079,EU +3272402080,3272402111,SE +3272402112,3272402175,EU 3272402176,3272402191,GB -3272402208,3272402303,GB -3272402440,3272402443,GB -3272402560,3272402687,GB -3272402816,3272403007,GB +3272402192,3272402239,EU +3272402240,3272402303,GB +3272402304,3272402431,FR +3272402432,3272402447,EU +3272402448,3272402455,FR +3272402456,3272402559,EU +3272402560,3272402623,GB +3272402624,3272402687,EU +3272402688,3272402815,SE +3272402816,3272402879,GB +3272402880,3272403007,EU +3272403008,3272403023,FR +3272403024,3272403039,EU +3272403040,3272403055,DE +3272403056,3272403071,NL 3272403072,3272403199,FR +3272403200,3272403455,EU +3272403456,3272404991,FR +3272404992,3272406015,DE +3272406016,3272407039,NL +3272407040,3272409087,EU 3272409088,3272417279,BE 3272417280,3272418687,FR 3272418688,3272419327,PL @@ -47078,10 +77927,10 @@ 3272478720,3272478975,GB 3272478976,3272479231,UA 3272479232,3272479487,GB -3272479488,3272479743,TR +3272479488,3272479743,SA 3272479744,3272480255,SE 3272480256,3272480511,FR -3272480512,3272480767,CH +3272480512,3272480767,GB 3272480768,3272481023,DE 3272481024,3272481279,SE 3272481280,3272481535,CH @@ -47091,10 +77940,20 @@ 3272482304,3272482559,FR 3272482560,3272482815,BE 3272482816,3272491007,RU -3272491008,3272498815,GB -3272498816,3272498943,FR -3272498944,3272499199,GB -3272499200,3272507391,IT +3272491008,3272499199,GB +3272499200,3272499711,RU +3272499712,3272500223,US +3272500224,3272500735,RU +3272500736,3272501247,IT +3272501248,3272502783,RU +3272502784,3272503295,KW +3272503296,3272503807,UA +3272503808,3272504319,RU +3272504320,3272504831,PL +3272504832,3272505343,RU +3272505344,3272505855,AT +3272505856,3272506879,UA +3272506880,3272507391,CH 3272507392,3272515583,CY 3272515584,3272523775,LT 3272523776,3272540159,DE @@ -47129,17 +77988,20 @@ 3272625152,3272626175,UA 3272626176,3272627199,DE 3272627200,3272628223,NL -3272628224,3272629247,PL -3272630272,3272633343,RU -3272633344,3272633599,KZ -3272633600,3272633983,RU +3272628224,3272629247,UA +3272629248,3272633983,RU 3272633984,3272634047,KZ 3272634048,3272638463,RU 3272638464,3272646655,ES -3272646656,3272650623,GB +3272646656,3272646784,DE +3272646785,3272646911,GB +3272646912,3272647423,DE +3272647424,3272649215,GB +3272649216,3272649727,IE +3272649728,3272650623,GB 3272650624,3272650639,FR 3272650640,3272650655,GB -3272650656,3272650751,NL +3272650656,3272650751,DE 3272650752,3272651135,GB 3272651136,3272651151,CH 3272651152,3272651183,GB @@ -47200,7 +78062,12 @@ 3272733136,3272733983,SE 3272733984,3272733991,RU 3272733992,3272736767,SE -3272736768,3272744959,IT +3272736768,3272737791,IT +3272737792,3272738815,GB +3272738816,3272739839,IL +3272739840,3272741887,UA +3272741888,3272743935,RU +3272743936,3272744959,UA 3272744960,3272753151,RU 3272753152,3272769535,NL 3272769536,3272802303,NO @@ -47216,7 +78083,8 @@ 3272884224,3272892415,DE 3272892416,3272892927,UA 3272892928,3272893439,DE -3272893440,3272894463,UA +3272893440,3272893951,SE +3272893952,3272894463,UA 3272894464,3272894975,FR 3272894976,3272895487,RO 3272895488,3272895999,GB @@ -47228,7 +78096,6 @@ 3272899072,3272899583,GB 3272899584,3272900095,UA 3272900096,3272900607,LV -3272900608,3272908799,UA 3272908800,3272910847,SK 3272910848,3272911359,NL 3272911360,3272911871,SK @@ -47244,14 +78111,211 @@ 3272921088,3272921599,CH 3272921600,3272922111,DE 3272922112,3272922623,PL -3272922624,3272923135,RO +3272922624,3272923135,GB 3272923136,3272923647,ES 3272923648,3272924159,PL 3272924160,3272924671,DE 3272924672,3272925183,GB -3272925184,3272933759,DE +3272925184,3272933375,DE +3272933376,3272933759,GB 3272933760,3272933775,DK -3272933776,3272998911,DE +3272933776,3272934687,GB +3272934688,3272934703,DE +3272934704,3272934847,GB +3272934848,3272934911,DE +3272934912,3272935167,GB +3272935168,3272935679,DE +3272935680,3272936447,GB +3272936448,3272936479,DE +3272936480,3272936703,GB +3272936704,3272936719,DE +3272936720,3272936735,GB +3272936736,3272936895,DE +3272936896,3272936959,GB +3272936960,3272937087,DE +3272937088,3272937471,GB +3272937472,3272937535,DE +3272937536,3272937599,GB +3272937600,3272937631,DE +3272937632,3272937791,GB +3272937792,3272937903,DE +3272937904,3272937919,GB +3272937920,3272937983,DE +3272937984,3272938015,GB +3272938016,3272938063,DE +3272938064,3272938239,GB +3272938240,3272938271,DE +3272938272,3272938479,GB +3272938480,3272938495,DE +3272938496,3272939775,GB +3272939776,3272940223,DE +3272940224,3272940287,GB +3272940288,3272940543,DE +3272940544,3272940799,GB +3272940800,3272940831,DE +3272940832,3272941055,GB +3272941056,3272941311,DE +3272941312,3272943103,GB +3272943104,3272943167,DE +3272943168,3272943359,GB +3272943360,3272943391,DE +3272943392,3272943439,GB +3272943440,3272943455,DE +3272943456,3272943471,GB +3272943472,3272943487,DE +3272943488,3272943503,GB +3272943504,3272943535,DE +3272943536,3272943551,GB +3272943552,3272943583,DE +3272943584,3272944127,GB +3272944128,3272944191,DE +3272944192,3272944383,GB +3272944384,3272944415,DE +3272944416,3272944447,GB +3272944448,3272944463,DE +3272944464,3272944575,GB +3272944576,3272944607,DE +3272944608,3272944639,GB +3272944640,3272944959,DE +3272944960,3272945151,GB +3272945152,3272945423,DE +3272945424,3272945471,GB +3272945472,3272945487,DE +3272945488,3272945503,GB +3272945504,3272945519,DE +3272945520,3272945535,GB +3272945536,3272945551,DE +3272945552,3272945567,GB +3272945568,3272945599,DE +3272945600,3272945919,GB +3272945920,3272946229,DE +3272946230,3272946271,GB +3272946272,3272946287,DE +3272946288,3272946335,GB +3272946336,3272946351,DE +3272946352,3272946367,GB +3272946368,3272946383,DE +3272946384,3272946399,GB +3272946400,3272946415,DE +3272946416,3272946687,GB +3272946688,3272946751,DE +3272946752,3272946783,GB +3272946784,3272946831,DE +3272946832,3272946847,GB +3272946848,3272946863,DE +3272946864,3272947199,GB +3272947200,3272947215,DE +3272947216,3272947231,GB +3272947232,3272947247,DE +3272947248,3272947263,GB +3272947264,3272947279,DE +3272947280,3272947327,GB +3272947328,3272947343,DE +3272947344,3272962303,GB +3272962304,3272962319,DE +3272962320,3272962559,GB +3272962560,3272962688,DE +3272962689,3272964351,GB +3272964352,3272964607,DE +3272964608,3272966399,GB +3272966400,3272966975,DE +3272966976,3272967103,GB +3272967104,3272967167,DE +3272967168,3272967423,GB +3272967424,3272968703,DE +3272968704,3272968735,GB +3272968736,3272968879,DE +3272968880,3272968927,GB +3272968928,3272968959,DE +3272968960,3272969215,GB +3272969216,3272969279,DE +3272969280,3272969727,GB +3272969728,3272969791,DE +3272969792,3272970015,GB +3272970016,3272970079,DE +3272970080,3272970095,GB +3272970096,3272970175,DE +3272970176,3272971263,GB +3272971264,3272971519,DE +3272971520,3272972031,GB +3272972032,3272972287,DE +3272972288,3272974335,GB +3272974336,3272974367,DE +3272974368,3272975871,GB +3272975872,3272976383,DE +3272976384,3272976895,GB +3272976896,3272976927,DE +3272976928,3272976959,GB +3272976960,3272976991,DE +3272976992,3272977151,GB +3272977152,3272977407,DE +3272977408,3272978415,GB +3272978416,3272978687,DE +3272978688,3272979023,GB +3272979024,3272979103,DE +3272979104,3272979119,GB +3272979120,3272979167,DE +3272979168,3272979519,GB +3272979520,3272979535,DE +3272979536,3272979967,GB +3272979968,3272979999,DE +3272980000,3272980095,GB +3272980096,3272980127,DE +3272980128,3272980479,GB +3272980480,3272980607,DE +3272980608,3272980639,GB +3272980640,3272980767,DE +3272980768,3272980799,GB +3272980800,3272980863,DE +3272980864,3272980927,GB +3272980928,3272980943,DE +3272980944,3272981119,GB +3272981120,3272981215,DE +3272981216,3272981503,GB +3272981504,3272981759,DE +3272981760,3272982015,GB +3272982016,3272982527,DE +3272982528,3272982783,GB +3272982784,3272983039,DE +3272983040,3272983295,GB +3272983296,3272983343,DE +3272983344,3272983391,GB +3272983392,3272983423,DE +3272983424,3272983551,GB +3272983552,3272983823,DE +3272983824,3272984079,GB +3272984080,3272984095,DE +3272984096,3272984191,GB +3272984192,3272984255,DE +3272984256,3272985599,GB +3272985600,3272985615,DE +3272985616,3272985631,GB +3272985632,3272985647,DE +3272985648,3272985695,GB +3272985696,3272985871,DE +3272985872,3272985887,GB +3272985888,3272985935,DE +3272985936,3272985951,GB +3272985952,3272986047,DE +3272986048,3272986063,GB +3272986064,3272986079,DE +3272986080,3272986095,GB +3272986096,3272986111,DE +3272986112,3272988415,GB +3272988416,3272988927,DE +3272988928,3272989183,GB +3272989184,3272989199,DE +3272989200,3272990975,GB +3272990976,3272991007,DE +3272991008,3272994815,GB +3272994816,3272994847,DE +3272994848,3272994927,GB +3272994928,3272995008,DE +3272995009,3272995023,GB +3272995024,3272995055,DE +3272995056,3272996863,GB +3272996864,3272997119,DE +3272997120,3272998911,GB 3272998912,3273007103,PT 3273007104,3273015295,CZ 3273015296,3273023487,SE @@ -47277,19 +78341,22 @@ 3273038336,3273038847,GR 3273038848,3273039871,GB 3273039872,3273048063,LT -3273048064,3273049855,IT +3273048064,3273048319,IT +3273048320,3273048575,GR +3273048576,3273048831,IT +3273048832,3273049087,US +3273049088,3273049855,IT 3273049856,3273050111,US -3273050112,3273051647,IT +3273050112,3273050783,IT +3273050784,3273050879,GR +3273050880,3273051647,IT 3273051648,3273051903,US 3273051904,3273052039,IT 3273052040,3273052047,NL 3273052048,3273052063,GR -3273052064,3273052079,IT -3273052080,3273052087,CU -3273052088,3273052095,IT -3273052096,3273052111,FR -3273052112,3273052127,GB -3273052128,3273052415,IT +3273052064,3273052087,IT +3273052088,3273052111,GR +3273052112,3273052415,IT 3273052416,3273052671,GB 3273052672,3273052927,FR 3273052928,3273053183,DE @@ -47303,18 +78370,23 @@ 3273054976,3273055231,BR 3273055232,3273055487,AR 3273055488,3273055743,CL -3273055744,3273055999,PE -3273056000,3273056255,IT +3273055744,3273055999,US +3273056000,3273056127,IT +3273056128,3273056255,HK 3273056256,3273064447,MD 3273064448,3273129983,PT -3273129984,3273138175,DK +3273129984,3273131999,DK +3273132000,3273132015,NO +3273132016,3273138175,DK 3273138176,3273146367,BG 3273146368,3273148415,RU 3273148416,3273150463,LU +3273150464,3273152511,DZ 3273152512,3273154559,BG 3273154560,3273162751,DE 3273162752,3273170943,UA 3273170944,3273179135,SE +3273179136,3273187327,CM 3273187328,3273187839,SE 3273187840,3273188351,DK 3273188352,3273188863,RU @@ -47364,16 +78436,23 @@ 3273310208,3273318399,AT 3273318400,3273326591,GB 3273326592,3273326847,IE +3273326848,3273326983,EU 3273326984,3273326987,DE +3273326988,3273326991,EU 3273326992,3273327047,DE +3273327048,3273327279,EU 3273327280,3273327287,DE -3273327360,3273327383,IE -3273327392,3273327407,IE -3273327424,3273327487,GB +3273327288,3273327359,EU +3273327360,3273327423,IE +3273327424,3273327495,GB +3273327496,3273327519,EU +3273327520,3273327551,IE +3273327552,3273328511,EU 3273328512,3273328639,DE -3273328768,3273329199,GB +3273328640,3273329199,GB 3273329200,3273329215,DE 3273329216,3273329311,GB +3273329312,3273329407,EU 3273329408,3273329423,GB 3273329424,3273329439,DE 3273329440,3273330175,GB @@ -47386,113 +78465,199 @@ 3273330296,3273330303,GB 3273330304,3273330431,IE 3273330432,3273331199,GB +3273331200,3273331711,EU 3273331712,3273331967,GB 3273331968,3273332031,DE +3273332032,3273332095,EU 3273332096,3273332223,DE +3273332224,3273332543,EU 3273332544,3273332575,DE +3273332576,3273332607,EU 3273332608,3273332671,DE +3273332672,3273333055,EU 3273333056,3273333119,DE +3273333120,3273334271,EU +3273334272,3273334783,DE +3273334784,3273335039,EU 3273335040,3273335295,DE 3273335296,3273335807,GB +3273335808,3273335935,EU 3273335936,3273335999,DE +3273336000,3273336847,EU 3273336848,3273336863,DE +3273336864,3273336871,GB 3273336872,3273336879,DE +3273336880,3273336959,EU 3273336960,3273337087,DE +3273337088,3273337855,EU 3273337856,3273338111,DE +3273338112,3273338623,EU 3273338624,3273338879,DE -3273339136,3273339391,DE -3273339392,3273339919,GB +3273338880,3273339135,EU +3273339136,3273339903,DE +3273339904,3273339919,GB 3273339920,3273339943,DE 3273339944,3273339955,GB -3273339956,3273339967,DE -3273339968,3273340095,GB +3273339956,3273339959,DE +3273339960,3273340095,GB 3273340096,3273340111,GI -3273340112,3273340143,GB -3273340144,3273340159,DE -3273340160,3273340415,GB -3273340928,3273341439,FR +3273340112,3273340415,GB +3273340416,3273340927,EU +3273340928,3273341695,FR 3273341696,3273341951,DE +3273341952,3273342463,EU 3273342464,3273342975,DE 3273342976,3273343999,GB 3273344000,3273344767,DE +3273344768,3273345023,EU 3273345024,3273345279,DE +3273345280,3273346815,EU 3273346816,3273347071,DE +3273347072,3273347839,EU 3273347840,3273348351,DE +3273348352,3273349119,EU 3273349120,3273349631,DE +3273349632,3273350271,EU 3273350272,3273350287,DE +3273350288,3273350335,EU 3273350336,3273350351,DE +3273350352,3273351423,EU 3273351424,3273351455,DE +3273351456,3273351503,EU 3273351504,3273351519,DE +3273351520,3273351871,EU 3273351872,3273351903,DE +3273351904,3273351935,EU 3273351936,3273352191,DE +3273352192,3273352927,EU 3273352928,3273352959,DE +3273352960,3273352991,EU 3273352992,3273353023,DE +3273353024,3273355519,EU 3273355520,3273356287,DE +3273356288,3273359887,EU 3273359888,3273359903,DE +3273359904,3273360015,EU 3273360016,3273360079,DE +3273360080,3273361471,EU 3273361472,3273361535,DE +3273361536,3273361631,EU 3273361632,3273361663,DE +3273361664,3273361791,EU 3273361792,3273361823,DE +3273361824,3273361855,EU 3273361856,3273361919,DE +3273361920,3273362047,EU 3273362048,3273362175,DE +3273362176,3273362239,EU 3273362240,3273362255,DE +3273362256,3273363207,EU 3273363208,3273363211,DE +3273363212,3273363327,EU 3273363328,3273363391,DE +3273363392,3273364607,EU 3273364608,3273364735,DE +3273364736,3273364991,EU 3273364992,3273365247,DE +3273365248,3273365503,EU 3273365504,3273365519,NL 3273365520,3273365527,GB 3273365528,3273365759,NL 3273365760,3273365767,GB +3273365768,3273365887,EU 3273365888,3273366015,FR +3273366016,3273366527,DE +3273366528,3273367295,EU 3273367296,3273367423,DE +3273367424,3273367551,EU 3273367552,3273367567,DE +3273367568,3273368063,EU 3273368064,3273368575,DE +3273368576,3273369343,EU 3273369344,3273369855,DE +3273369856,3273370623,EU 3273370624,3273371135,DE -3273371520,3273371583,DE +3273371136,3273371711,EU 3273371712,3273371743,DE +3273371744,3273371759,EU 3273371760,3273371775,DE +3273371776,3273371807,EU 3273371808,3273371823,DE +3273371824,3273371871,EU 3273371872,3273371875,DE -3273372000,3273372063,DE +3273371876,3273371999,EU +3273372000,3273372055,DE +3273372056,3273372143,EU 3273372144,3273372151,DE +3273372152,3273372671,EU 3273372672,3273372927,GB 3273372928,3273373183,NL 3273373184,3273373455,GB 3273373456,3273373695,DE +3273373696,3273375231,EU 3273375232,3273375551,DE +3273375552,3273375743,EU 3273375744,3273375871,DE +3273375872,3273375999,EU 3273376000,3273376255,DE +3273376256,3273376535,EU 3273376536,3273376543,DE +3273376544,3273377791,EU 3273377792,3273378095,DE +3273378096,3273378559,EU 3273378560,3273378815,DE +3273378816,3273381887,EU 3273381888,3273382143,DE 3273382144,3273382399,GB 3273382400,3273382463,DE +3273382464,3273382479,EU 3273382480,3273382591,DE +3273382592,3273382639,EU 3273382640,3273382687,DE +3273382688,3273384191,EU 3273384192,3273384703,DE +3273384704,3273384959,EU 3273384960,3273385215,DE -3273385280,3273385727,DE +3273385216,3273385279,EU +3273385280,3273385343,DE +3273385344,3273385471,EU +3273385472,3273385727,DE +3273385728,3273385759,EU 3273385760,3273385791,DE +3273385792,3273385855,EU 3273385856,3273385919,DE +3273385920,3273387055,EU 3273387056,3273387071,DE +3273387072,3273387215,EU 3273387216,3273387231,DE +3273387232,3273387263,EU 3273387264,3273387519,DE +3273387520,3273387551,EU 3273387552,3273387583,DE +3273387584,3273388159,EU 3273388160,3273388223,DE +3273388224,3273388799,EU 3273388800,3273388807,DE +3273388808,3273388815,EU 3273388816,3273388863,DE +3273388864,3273388871,EU 3273388872,3273388879,DE +3273388880,3273388903,EU 3273388904,3273388911,DE +3273388912,3273388927,EU 3273388928,3273389055,DE +3273389056,3273390079,EU 3273390080,3273390111,DE -3273390112,3273390143,US +3273390112,3273390143,EU 3273390144,3273390207,DE -3273390368,3273390463,DE -3273391296,3273391327,DE -3273391352,3273391359,DE +3273390208,3273390335,EU +3273390336,3273390463,DE +3273390464,3273391231,EU +3273391232,3273391327,DE +3273391328,3273391343,EU +3273391344,3273391359,DE +3273391360,3273391871,EU +3273391872,3273392127,DE 3273392128,3273392639,UA 3273392640,3273393663,RO 3273393664,3273394175,BG @@ -47502,7 +78667,8 @@ 3273395712,3273396223,RU 3273396224,3273396735,PL 3273396736,3273397247,RO -3273397248,3273398271,RU +3273397248,3273397759,RU +3273397760,3273398271,NL 3273398272,3273398783,RO 3273398784,3273399295,LV 3273399296,3273399807,SE @@ -47525,15 +78691,48 @@ 3273439744,3273440255,UA 3273440256,3273440767,RO 3273440768,3273441279,AT -3273441280,3273449471,FR +3273441280,3273441463,FR +3273441464,3273441535,GB +3273441536,3273441607,FR +3273441608,3273441615,GB +3273441616,3273441631,FR +3273441632,3273441647,GB +3273441648,3273441759,FR +3273441760,3273441791,GB +3273441792,3273442127,FR +3273442128,3273442143,GB +3273442144,3273442151,FR +3273442152,3273442303,GB +3273442304,3273442331,FR +3273442332,3273442335,GB +3273442336,3273442367,FR +3273442368,3273442431,GB +3273442432,3273442815,FR +3273442816,3273443071,GB +3273443072,3273443080,FR +3273443081,3273443327,GB +3273443328,3273443839,FR +3273443840,3273444095,GB +3273444096,3273444351,FR +3273444352,3273449471,GB 3273449472,3273457663,CH 3273457664,3273523199,HR -3273523200,3273532463,DE -3273532464,3273532471,US -3273532472,3273588735,DE +3273523200,3273588735,DE 3273588736,3273687039,IT 3273687040,3273719807,DE -3273719808,3273727999,GB +3273719808,3273720831,GB +3273720832,3273720839,IE +3273720840,3273727071,GB +3273727072,3273727079,DK +3273727080,3273727087,FR +3273727088,3273727095,ES +3273727096,3273727103,DE +3273727104,3273727119,GB +3273727120,3273727127,PT +3273727128,3273727135,FI +3273727136,3273727143,NO +3273727144,3273727151,CZ +3273727152,3273727999,GB 3273728000,3273728255,NL 3273728256,3273728511,GB 3273728512,3273732095,NL @@ -47543,7 +78742,7 @@ 3273743616,3273744383,FR 3273744384,3273752575,GB 3273752576,3273760767,NL -3273760768,3273768959,GB +3273760768,3273768959,DE 3273768960,3273785343,TR 3273785344,3273801727,RU 3273801728,3273802239,DE @@ -47557,14 +78756,17 @@ 3273805824,3273806335,PL 3273806336,3273806847,DE 3273806848,3273807359,SE -3273807360,3273807871,LB +3273807360,3273807871,A2 3273807872,3273808383,CH 3273808384,3273808895,UA 3273808896,3273809407,GB 3273809408,3273809919,UA 3273809920,3273818111,BG 3273818112,3273826303,AT -3273826304,3273834495,DE +3273826304,3273831231,DE +3273831232,3273831247,PL +3273831248,3273831263,LV +3273831264,3273834495,DE 3273834496,3273835519,RU 3273835520,3273838591,UA 3273838592,3273839615,PL @@ -47582,7 +78784,8 @@ 3273871360,3273871615,PL 3273871616,3273871871,LU 3273871872,3273872383,SE -3273872384,3273872895,UA +3273872384,3273872639,BG +3273872640,3273872895,PS 3273872896,3273873151,SE 3273873152,3273873919,DE 3273873920,3273874431,GB @@ -47606,6 +78809,7 @@ 3273880064,3273880575,LV 3273880576,3273881087,RU 3273881088,3273881343,RO +3273881344,3273881599,CH 3273881600,3273881855,GB 3273881856,3273882111,CH 3273882112,3273882367,SI @@ -47645,11 +78849,12 @@ 3274164224,3274164735,AT 3274164736,3274165759,GB 3274165760,3274166271,RU -3274166272,3274166783,AT +3274166272,3274166783,RO 3274166784,3274167295,UA 3274167296,3274167807,BG 3274167808,3274168319,UA 3274168320,3274168831,PL +3274168832,3274169343,DZ 3274169344,3274170367,DE 3274170368,3274170879,TR 3274170880,3274171391,DE @@ -47668,7 +78873,9 @@ 3274178048,3274178559,NL 3274178560,3274204063,GB 3274204064,3274204095,FR -3274204096,3274244095,GB +3274204096,3274227199,GB +3274227200,3274227455,A2 +3274227456,3274244095,GB 3274244096,3274309631,DK 3274309632,3274318031,FR 3274318032,3274318047,RU @@ -47685,7 +78892,7 @@ 3274338816,3274339327,DE 3274339328,3274339839,RO 3274339840,3274340351,RU -3274340352,3274340863,ES +3274340352,3274340863,IE 3274340864,3274341375,RU 3274341376,3274341887,FR 3274341888,3274342399,UA @@ -47696,10 +78903,10 @@ 3274344448,3274344959,UA 3274344960,3274345471,RO 3274345472,3274345983,PL -3274345984,3274346495,BG +3274345984,3274346495,DE 3274346496,3274347007,FR 3274347008,3274347519,RU -3274347520,3274348031,IL +3274347520,3274348031,FR 3274348032,3274348543,DK 3274348544,3274349055,PL 3274349056,3274358783,RU @@ -47721,100 +78928,223 @@ 3274388480,3274389503,DE 3274389504,3274390527,CH 3274390528,3274391551,NO -3274391552,3274399743,LT +3274391552,3274392063,FR +3274392064,3274392575,PL +3274392576,3274393087,RU +3274393088,3274393599,UA +3274393600,3274394111,PL +3274394112,3274394623,AM +3274394624,3274395135,CZ +3274395136,3274395647,DK +3274395648,3274396671,LV +3274396672,3274397183,PL +3274397184,3274397695,EE +3274397696,3274398207,DE +3274398208,3274399231,RU +3274399232,3274399743,SC 3274399744,3274407935,LU -3274407936,3274408191,CH +3274407936,3274408191,ES 3274408192,3274408447,IT 3274408448,3274408703,NL 3274408704,3274408959,SI +3274408960,3274409215,GR +3274409216,3274409471,SI +3274409472,3274409727,CH +3274409728,3274409983,RU +3274409984,3274410239,LT +3274410240,3274410495,SA +3274410496,3274410751,NL +3274410752,3274411007,AT +3274411008,3274411263,CH +3274411264,3274411519,LI +3274411520,3274412031,PL +3274412032,3274412287,RU +3274412288,3274412543,NO +3274412544,3274412799,UA +3274412800,3274413055,RU +3274413056,3274413311,UA +3274413312,3274413567,AT +3274413568,3274413823,FR +3274413824,3274414079,SE +3274414080,3274414335,AT +3274414336,3274414591,CH +3274414592,3274414847,NL +3274414848,3274415103,IE +3274415104,3274415359,GR +3274415360,3274415615,GB +3274415616,3274415871,NL +3274415872,3274416127,SI 3274416128,3274424319,IT 3274424320,3274435711,SE 3274435712,3274435839,US 3274435840,3274440703,SE +3274440704,3274442751,EU 3274442752,3274443263,GB +3274443264,3274443519,EU 3274443520,3274443647,GB +3274443648,3274443711,EU 3274443712,3274443775,GB +3274443776,3274443807,EU 3274443808,3274444031,GB +3274444032,3274446335,EU 3274446336,3274447871,GB +3274447872,3274448383,EU 3274448384,3274448639,GB +3274448640,3274448895,EU 3274448896,3274449663,GB +3274449664,3274449919,EU 3274449920,3274450231,GB +3274450232,3274450247,EU 3274450248,3274450367,GB +3274450368,3274450375,EU 3274450376,3274450391,GB +3274450392,3274450407,EU 3274450408,3274450415,GB +3274450416,3274450431,EU 3274450432,3274450591,GB +3274450592,3274450655,EU 3274450656,3274450687,GB +3274450688,3274451199,EU 3274451200,3274452255,GB +3274452256,3274452263,EU 3274452264,3274452311,GB +3274452312,3274452319,EU 3274452320,3274452335,GB +3274452336,3274452343,EU 3274452344,3274452367,GB +3274452368,3274452383,EU 3274452384,3274452391,GB +3274452392,3274452399,EU 3274452400,3274452423,GB +3274452424,3274452431,EU 3274452432,3274452439,GB +3274452440,3274452447,EU 3274452448,3274452455,GB +3274452456,3274452463,EU 3274452464,3274452471,GB +3274452472,3274452495,EU 3274452496,3274452543,GB +3274452544,3274452559,EU 3274452560,3274452575,GB +3274452576,3274452655,EU 3274452656,3274452703,GB +3274452704,3274452735,EU 3274452736,3274452927,GB +3274452928,3274452991,EU 3274452992,3274453767,GB +3274453768,3274453783,EU 3274453784,3274453791,GB +3274453792,3274453799,EU 3274453800,3274453847,GB +3274453848,3274453863,EU 3274453864,3274453871,GB +3274453872,3274453887,EU 3274453888,3274453903,GB +3274453904,3274453919,EU 3274453920,3274453935,GB +3274453936,3274453943,EU 3274453944,3274453951,GB +3274453952,3274453959,EU 3274453960,3274453975,GB +3274453976,3274453983,EU 3274453984,3274453991,GB +3274453992,3274453999,EU 3274454000,3274454271,GB +3274454272,3274454655,EU 3274454656,3274455311,GB +3274455312,3274455327,EU 3274455328,3274455335,GB +3274455336,3274455343,EU 3274455344,3274455351,GB +3274455352,3274455359,EU 3274455360,3274455375,GB +3274455376,3274455383,EU 3274455384,3274455391,GB +3274455392,3274455399,EU 3274455400,3274455423,GB +3274455424,3274455431,EU 3274455432,3274455439,GB +3274455440,3274455447,EU 3274455448,3274455503,GB +3274455504,3274455519,EU 3274455520,3274455535,GB +3274455536,3274455743,EU 3274455744,3274455807,GB +3274455808,3274455871,EU 3274455872,3274455935,GB +3274455936,3274455967,EU 3274455968,3274456359,GB +3274456360,3274456367,EU 3274456368,3274456375,GB +3274456376,3274456383,EU 3274456384,3274456391,GB +3274456392,3274456399,EU 3274456400,3274456407,GB +3274456408,3274456415,EU 3274456416,3274456447,GB +3274456448,3274456455,EU 3274456456,3274456511,GB +3274456512,3274456527,EU 3274456528,3274456535,GB +3274456536,3274456543,EU 3274456544,3274456559,GB +3274456560,3274456567,EU 3274456568,3274460223,GB +3274460224,3274460415,EU 3274460416,3274462207,GB +3274462208,3274462463,EU 3274462464,3274465023,GB +3274465024,3274465151,EU 3274465152,3274466351,GB +3274466352,3274466367,EU 3274466368,3274466399,GB +3274466400,3274466415,EU 3274466416,3274466463,GB +3274466464,3274466559,EU 3274466560,3274466735,GB +3274466736,3274466743,EU 3274466744,3274466763,GB +3274466764,3274466767,EU 3274466768,3274466783,GB +3274466784,3274466815,EU 3274466816,3274467099,GB +3274467100,3274467103,EU 3274467104,3274467307,GB +3274467308,3274467327,EU 3274467328,3274470383,GB +3274470384,3274470399,EU 3274470400,3274470535,GB +3274470536,3274470655,EU 3274470656,3274471423,GB +3274471424,3274471535,EU 3274471536,3274471615,GB +3274471616,3274471679,EU 3274471680,3274471935,GB +3274471936,3274472959,EU 3274472960,3274483711,GB +3274483712,3274489599,EU 3274489600,3274489855,GB +3274489856,3274490175,EU 3274490176,3274490895,GB +3274490896,3274490911,EU 3274490912,3274491247,GB +3274491248,3274491255,EU 3274491256,3274491295,GB +3274491296,3274491303,EU 3274491304,3274491319,GB +3274491320,3274491327,EU 3274491328,3274491383,GB +3274491384,3274491391,EU 3274491392,3274504447,GB +3274504448,3274505727,EU 3274505728,3274505791,GB +3274505792,3274505792,EU 3274505793,3274505855,GB +3274505856,3274506239,EU 3274506240,3274571775,IT 3274571776,3274579967,GR -3274579968,3274580991,RU +3274579968,3274580991,UA +3274580992,3274582015,NL 3274582016,3274583039,PL 3274583040,3274584063,DE 3274584064,3274585087,GB @@ -47826,7 +79156,11 @@ 3274604544,3274612735,TR 3274612736,3274620927,RU 3274620928,3274629119,FR -3274629120,3274637311,LU +3274629120,3274629151,LU +3274629152,3274629159,A2 +3274629160,3274637175,LU +3274637176,3274637183,A2 +3274637184,3274637311,LU 3274637312,3274670079,CZ 3274670080,3274686463,DK 3274686464,3274686719,RU @@ -47841,7 +79175,7 @@ 3274688768,3274689023,PL 3274689024,3274689279,UA 3274689280,3274689535,PL -3274689536,3274689791,DE +3274689536,3274689791,RU 3274689792,3274690047,SE 3274690048,3274690303,ES 3274690304,3274690559,GB @@ -47880,7 +79214,7 @@ 3274698752,3274699007,GB 3274699008,3274699263,FR 3274699264,3274699519,RO -3274699520,3274700031,GB +3274699776,3274700031,GB 3274700032,3274700287,CH 3274700288,3274700543,PL 3274700544,3274700799,DK @@ -47902,7 +79236,7 @@ 3274809344,3274810367,SE 3274810368,3274811391,UA 3274811392,3274812415,RU -3274812416,3274813439,DE +3274812416,3274813439,SE 3274813440,3274814463,ES 3274814464,3274815487,GB 3274815488,3274816511,RU @@ -47912,7 +79246,6 @@ 3274821632,3274823679,KZ 3274823680,3274825727,TR 3274825728,3274827775,DE -3274827776,3274829823,RU 3274829824,3274831871,SE 3274831872,3274833919,RO 3274833920,3274842111,BY @@ -47923,7 +79256,11 @@ 3274891264,3274899455,CH 3274899456,3274902399,DE 3274902400,3274902423,AT -3274902528,3274910975,DE +3274902424,3274902527,EU +3274902528,3274909695,DE +3274909696,3274910207,EU +3274910208,3274910975,DE +3274910976,3274911231,EU 3274911232,3274911743,DE 3274911744,3274911999,FR 3274912000,3274912031,GB @@ -47941,6 +79278,7 @@ 3274912896,3274913023,RO 3274913024,3274913279,FR 3274913280,3274914815,DE +3274914816,3274915071,EU 3274915072,3274915839,DE 3274915840,3274916735,NL 3274916736,3274916863,DE @@ -47953,6 +79291,7 @@ 3274917376,3274917887,NL 3274917888,3274918911,BE 3274918912,3274919359,CH +3274919360,3274919391,EU 3274919392,3274919423,CH 3274919424,3274919935,GB 3274919936,3274921983,BE @@ -47962,13 +79301,14 @@ 3274922872,3274922879,IT 3274922880,3274922943,ZA 3274922944,3274923007,NL +3274923008,3274923263,EU 3274923264,3274924031,NL 3274924032,3274928127,FR 3274928128,3274928511,ES 3274928512,3274928575,RU 3274928576,3274928639,GB 3274928640,3274929151,ES -3274929152,3274929407,NL +3274929152,3274929407,EU 3274929408,3274929663,FR 3274929664,3274930175,BE 3274930176,3274932223,IT @@ -47980,14 +79320,17 @@ 3274933248,3274936063,GB 3274936064,3274936159,SE 3274936160,3274936175,GB +3274936176,3274936191,EU 3274936192,3274936863,GB 3274936864,3274936871,BE 3274936872,3274936879,CH 3274936880,3274936895,SE 3274936896,3274938367,GB +3274938368,3274938495,EU 3274938496,3274938535,GB 3274938536,3274938543,FR 3274938544,3274938559,GB +3274938560,3274938623,EU 3274938624,3274938879,GB 3274938880,3274939135,DE 3274939136,3274939391,IT @@ -48014,6 +79357,7 @@ 3274954496,3274954623,AT 3274954624,3274954751,NL 3274954752,3274955007,SE +3274955008,3274955263,EU 3274955264,3274956287,SE 3274956288,3274956543,GB 3274956544,3274956615,BE @@ -48028,22 +79372,28 @@ 3274957056,3274957567,AT 3274957568,3274957823,CH 3274957824,3274957831,GR +3274957832,3274957951,EU 3274957952,3274957959,BE +3274957960,3274957967,EU 3274957968,3274957983,FR 3274957984,3274957999,BE 3274958000,3274958007,GB 3274958008,3274958015,BE +3274958016,3274958079,EU 3274958080,3274958279,IE +3274958280,3274958287,EU 3274958288,3274958335,IE 3274958336,3274959231,AT 3274959232,3274959247,IT 3274959248,3274959255,GB 3274959256,3274959263,ZA +3274959264,3274959271,EU 3274959272,3274959279,GB 3274959280,3274959287,DE 3274959288,3274959295,GB 3274959296,3274959327,ES 3274959328,3274959615,DE +3274959616,3274960383,EU 3274960384,3274960447,BE 3274960448,3274960511,ES 3274960512,3274960575,GB @@ -48052,8 +79402,10 @@ 3274961408,3274961503,CH 3274961504,3274961535,DK 3274961536,3274961559,CH +3274961560,3274961567,EU 3274961568,3274961663,CH 3274961664,3274961727,BY +3274961728,3274961919,EU 3274961920,3274962111,AT 3274962112,3274962175,GB 3274962176,3274962431,ZA @@ -48081,13 +79433,38 @@ 3274964928,3274964991,GB 3274964992,3275030527,DE 3275030528,3275096063,ES -3275096064,3275104255,RU -3275104256,3275112447,IT +3275096064,3275105279,RU +3275105280,3275105791,GB +3275105792,3275106303,NL +3275106304,3275106815,RU +3275106816,3275107327,UA +3275107328,3275107839,BG +3275107840,3275108351,PL +3275108352,3275108863,FR +3275108864,3275109375,PL +3275109376,3275109887,UA +3275109888,3275110399,DE +3275110400,3275110911,NL +3275110912,3275111423,GB +3275111424,3275111935,IT +3275111936,3275112447,FR 3275112448,3275120639,DK 3275120640,3275136639,SE 3275136640,3275136767,DK 3275136768,3275137023,SE -3275137024,3275145215,AT +3275137024,3275137535,DE +3275137536,3275138047,UA +3275138048,3275138559,DE +3275138560,3275139071,UA +3275139072,3275139583,PT +3275139584,3275140095,MD +3275140096,3275140607,AT +3275140608,3275141119,NL +3275141120,3275141631,RU +3275141632,3275142143,GE +3275142144,3275142655,KG +3275142656,3275143167,SE +3275143168,3275145215,PL 3275145216,3275153407,RU 3275153408,3275161599,GB 3275161600,3275227135,ES @@ -48103,32 +79480,77 @@ 3275407360,3275415551,GB 3275415552,3275423743,UA 3275423744,3275423751,GB +3275423752,3275423775,EU 3275423776,3275423807,GB -3275424000,3275424255,GB -3275425792,3275426303,GB -3275427840,3275428367,GB +3275423808,3275423871,EU +3275423872,3275424255,GB +3275424256,3275425791,EU +3275425792,3275426599,GB +3275426600,3275426607,EU +3275426608,3275426655,GB +3275426656,3275426815,EU +3275426816,3275427199,GB +3275427200,3275427327,EU +3275427328,3275427583,GB +3275427584,3275427839,EU +3275427840,3275428375,GB +3275428376,3275429887,EU 3275429888,3275430143,GB +3275430144,3275430271,EU 3275430272,3275430399,GB +3275430400,3275430591,EU 3275430592,3275430623,GB +3275430624,3275431935,EU 3275431936,3275432447,GB +3275432448,3275433983,EU 3275433984,3275437567,GB -3275438080,3275438591,GB +3275437568,3275438079,EU +3275438080,3275438607,GB +3275438608,3275440127,EU 3275440128,3275440639,GB +3275440640,3275442175,EU 3275442176,3275442719,GB +3275442720,3275444223,EU 3275444224,3275444735,GB -3275446272,3275446783,GB -3275448320,3275449391,GB -3275450368,3275450879,GB +3275444736,3275446271,EU +3275446272,3275446831,GB +3275446832,3275446847,EU +3275446848,3275446943,GB +3275446944,3275448319,EU +3275448320,3275449519,GB +3275449520,3275449527,FR +3275449528,3275450879,GB +3275450880,3275451231,EU 3275451232,3275451263,GB -3275452416,3275452927,GB -3275454464,3275454975,GB +3275451264,3275452415,EU +3275452416,3275454111,GB +3275454112,3275454463,EU +3275454464,3275456383,GB +3275456384,3275456511,EU 3275456512,3275457023,GB -3275457024,3275457535,FK -3275457536,3275458559,GB -3275458560,3275459327,IE -3275464704,3275465727,GB -3275466752,3275467775,GB +3275457024,3275457791,FK +3275457792,3275458559,GB +3275458560,3275460095,IE +3275460096,3275460607,EU +3275460608,3275460863,HK +3275460864,3275463471,GB +3275463472,3275463487,EU +3275463488,3275463503,GB +3275463504,3275463679,EU +3275463680,3275464031,GB +3275464032,3275464047,IE +3275464048,3275468655,GB +3275468656,3275468671,IE +3275468672,3275468735,GB +3275468736,3275468751,IE +3275468752,3275468767,GB +3275468768,3275468799,IE +3275468800,3275469071,GB +3275469072,3275469087,IE +3275469088,3275469695,GB +3275469696,3275469951,EU 3275469952,3275469983,GB +3275469984,3275489279,EU 3275489280,3275497471,GB 3275497472,3275505663,DE 3275505664,3275506175,PL @@ -48144,16 +79566,25 @@ 3275509984,3275510015,PT 3275510016,3275510079,SE 3275510080,3275510143,ES -3275510208,3275510271,FR +3275510144,3275510207,IT +3275510336,3275510399,IE +3275510400,3275510463,NL +3275510464,3275510527,GB +3275510528,3275510559,PL +3275510560,3275510591,DE +3275510624,3275510655,EE +3275510656,3275510687,FR 3275510784,3275510911,RU 3275510912,3275511167,GB +3275511168,3275511295,LV 3275511296,3275511551,GB 3275511552,3275511679,NL 3275511680,3275511807,GB 3275511808,3275511935,CH -3275511936,3275512063,IT +3275511936,3275512063,FR 3275512064,3275512191,CZ 3275512192,3275512319,IT +3275512320,3275512447,FI 3275512448,3275512575,DK 3275512576,3275512703,BE 3275512704,3275512831,PL @@ -48165,6 +79596,8 @@ 3275513216,3275513279,CH 3275513280,3275513343,DK 3275513344,3275513471,PL +3275513472,3275513599,FR +3275513600,3275513727,PL 3275513728,3275513855,GB 3275513856,3275514615,DE 3275514616,3275514623,CH @@ -48174,7 +79607,7 @@ 3275530752,3275531263,AT 3275531264,3275531775,GB 3275531776,3275532287,IE -3275532288,3275532799,FR +3275532288,3275532799,CH 3275532800,3275533823,GB 3275533824,3275534335,UA 3275534336,3275534847,IL @@ -48191,7 +79624,7 @@ 3275542528,3275543551,DE 3275543552,3275544575,NL 3275544576,3275545599,PL -3275545600,3275546623,RU +3275545600,3275546623,EU 3275546624,3275547647,UA 3275547648,3275548671,RU 3275548672,3275549695,IL @@ -48200,92 +79633,172 @@ 3275551744,3275552767,RU 3275552768,3275553791,LV 3275553792,3275554815,FI -3275554816,3275555071,ES +3275554816,3275555391,EU 3275555392,3275555455,ES +3275555456,3275555591,EU 3275555592,3275555647,ES +3275555648,3275555743,EU 3275555744,3275555759,ES +3275555760,3275555767,EU 3275555768,3275555776,ES +3275555777,3275556607,EU 3275556608,3275556863,ES +3275556864,3275560959,EU 3275560960,3275561215,ES +3275561216,3275561471,EU 3275561472,3275561727,ES +3275561728,3275562495,EU 3275562496,3275562751,ES +3275562752,3275563007,EU 3275563008,3275563519,CH +3275563520,3275563583,EU 3275563584,3275563647,CH 3275563648,3275563775,DE 3275563776,3275564287,CH +3275564288,3275564415,EU 3275564416,3275564495,CH +3275564496,3275564799,EU 3275564800,3275565055,CH +3275565056,3275565311,EU 3275565312,3275565567,CH -3275565824,3275567487,CH +3275565568,3275565823,EU +3275565824,3275567359,CH +3275567360,3275567615,EU 3275567616,3275568127,CH +3275568128,3275568383,EU 3275568384,3275569407,CH +3275569408,3275569919,EU 3275569920,3275570687,CH -3275571200,3275572223,PT +3275570688,3275571199,EU +3275571200,3275571455,PT +3275571456,3275571967,EU +3275571968,3275572095,PT +3275572096,3275572767,EU 3275572768,3275572863,PT +3275572864,3275572991,EU 3275572992,3275573055,PT +3275573056,3275573119,EU 3275573120,3275574015,PT +3275574016,3275574031,EU 3275574032,3275574047,PT +3275574048,3275574143,EU 3275574144,3275574147,PT -3275574152,3275574191,PT +3275574148,3275574151,EU +3275574152,3275574159,PT +3275574160,3275574175,EU +3275574176,3275574191,PT +3275574192,3275574783,EU 3275574784,3275575231,PT +3275575232,3275575423,EU 3275575424,3275575727,PT +3275575728,3275575807,EU 3275575808,3275575935,PT +3275575936,3275576063,EU 3275576064,3275577407,PT +3275577408,3275577471,EU 3275577472,3275577495,PT +3275577496,3275577519,EU 3275577520,3275577567,PT +3275577568,3275577599,EU 3275577600,3275577727,PT +3275577728,3275577791,EU 3275577792,3275577807,PT +3275577808,3275577839,EU 3275577840,3275578623,PT +3275578624,3275578879,EU 3275578880,3275579007,PT +3275579008,3275579135,EU 3275579136,3275579391,PT 3275579392,3275579519,FR -3275579520,3275579615,NL +3275579520,3275579583,NL +3275579584,3275579599,EU +3275579600,3275579615,NL +3275579616,3275579647,EU 3275579648,3275579703,NL -3275579904,3275581311,NL +3275579704,3275579903,EU +3275579904,3275580159,NL +3275580160,3275580927,EU +3275580928,3275581311,NL +3275581312,3275581535,EU 3275581536,3275581671,NL -3275581680,3275582207,NL +3275581672,3275581679,EU +3275581680,3275581695,NL +3275581696,3275582223,EU 3275582224,3275582247,NL +3275582248,3275582255,EU 3275582256,3275582287,NL -3275582464,3275582591,NL +3275582288,3275582655,EU 3275582656,3275582719,NL +3275582720,3275582975,EU 3275582976,3275583231,NL -3275583744,3275584127,NL +3275583232,3275584255,EU 3275584256,3275584287,NL +3275584288,3275584511,EU 3275584512,3275584527,NL +3275584528,3275585023,EU 3275585024,3275585279,NL -3275585536,3275586047,NL +3275585280,3275587071,EU 3275587072,3275587136,NL +3275587137,3275587583,EU 3275587584,3275587855,BE +3275587856,3275588095,EU 3275588096,3275588287,BE 3275588288,3275588319,NL -3275588352,3275588711,BE +3275588320,3275588351,EU +3275588352,3275588607,BE +3275588608,3275588639,EU +3275588640,3275588655,BE +3275588656,3275588711,EU 3275588712,3275588719,CH -3275588720,3275588799,BE +3275588720,3275588735,EU +3275588736,3275588799,BE +3275588800,3275588847,EU 3275588848,3275588855,BE +3275588856,3275588863,EU 3275588864,3275589119,IT +3275589120,3275589271,EU 3275589272,3275589279,BE +3275589280,3275589375,EU 3275589376,3275589471,BE +3275589472,3275589887,EU 3275589888,3275591167,BE +3275591168,3275591423,EU 3275591424,3275591679,BE 3275591680,3275592063,RO +3275592064,3275592191,EU 3275592192,3275592959,RO 3275592960,3275593215,MD +3275593216,3275593343,EU 3275593344,3275593855,RO +3275593856,3275593983,EU 3275593984,3275595007,RO 3275595008,3275595039,BE +3275595040,3275595263,EU 3275595264,3275595519,US -3275595776,3275603967,AT +3275595520,3275596167,EU +3275596168,3275596175,AT +3275596176,3275599103,EU +3275599104,3275599231,AT +3275599232,3275599871,EU +3275599872,3275600127,AT +3275600128,3275603967,EU 3275603968,3275604735,IT 3275604736,3275604767,IL +3275604768,3275604991,EU 3275604992,3275606271,IT +3275606272,3275606527,EU 3275606528,3275606783,IT -3275607296,3275608319,IT +3275606784,3275608831,EU 3275608832,3275610063,IT +3275610064,3275610111,EU 3275610112,3275610623,IT +3275610624,3275612159,EU 3275612160,3275612287,LU +3275612288,3275612415,EU 3275612416,3275612671,LU 3275612672,3275612927,BE 3275612928,3275613951,LU +3275613952,3275620351,EU 3275620352,3275622399,RU 3275622400,3275623423,GB 3275623424,3275623935,PL @@ -48297,9 +79810,10 @@ 3275626496,3275627007,UA 3275627008,3275627519,AT 3275627520,3275628031,GB -3275628032,3275628543,PL +3275628032,3275628543,IL 3275628544,3275629567,RU 3275629568,3275630079,UA +3275630080,3275630591,EU 3275630592,3275631103,PL 3275631104,3275631615,FR 3275631616,3275632127,DE @@ -48315,6 +79829,7 @@ 3275638784,3275639807,FR 3275639808,3275640319,SE 3275640320,3275640831,RU +3275640832,3275641343,DE 3275641344,3275641855,NL 3275641856,3275642367,AT 3275642368,3275642879,RU @@ -48348,7 +79863,7 @@ 3275791360,3275791871,RU 3275791872,3275792383,PL 3275792384,3275792895,BG -3275792896,3275793407,RU +3275792896,3275793407,UA 3275793408,3275793919,FR 3275793920,3275794431,UA 3275794432,3275794943,IT @@ -48358,7 +79873,7 @@ 3275796480,3275796991,DE 3275796992,3275797503,RO 3275797504,3275798015,DE -3275798016,3275799039,RO +3275798016,3275799039,UA 3275799040,3275799551,ES 3275799552,3275800063,IT 3275800064,3275800575,UA @@ -48405,7 +79920,7 @@ 3275907840,3275908095,DE 3275908096,3275908351,SA 3275908352,3275908607,SE -3275908608,3275908863,US +3275908608,3275908863,DE 3275908864,3275909119,PL 3275909120,3275909375,RU 3275909376,3275909631,UA @@ -48432,196 +79947,155 @@ 3275915008,3275915263,PT 3275915264,3275915775,FR 3275915776,3275916287,SE -3275916288,3275917311,NL +3275916288,3275916799,US +3275916800,3275917311,NL 3275917312,3275918847,UA 3275918848,3275919359,RO 3275919360,3275919871,PL -3275919872,3275920383,RO +3275919872,3275920383,UA 3275920384,3275920895,GB 3275920896,3275921407,ES 3275921408,3275921919,UA 3275921920,3275922431,DE 3275922432,3275922943,UA 3275922944,3275923455,GR -3275923456,3275924159,CS -3275924160,3275924191,CS -3275924192,3275924319,CS -3275924320,3275924351,ME -3275924352,3275925759,CS -3275925760,3275925775,ME -3275925776,3275925855,CS -3275925856,3275925887,CS -3275925888,3275925951,CS -3275925952,3275926015,ME -3275926016,3275926303,CS -3275926304,3275926335,ME -3275926336,3275926431,CS -3275926432,3275926463,ME -3275926464,3275926783,CS -3275926784,3275927359,CS -3275927360,3275927423,CS -3275927424,3275927743,CS -3275927744,3275927807,ME -3275927808,3275928063,CS -3275928064,3275928319,ME -3275928320,3275928351,CS -3275928352,3275928383,ME -3275928384,3275928543,CS -3275928544,3275928559,ME -3275928560,3275928575,CS -3275928576,3275928847,CS -3275928848,3275928863,ME -3275928864,3275928879,CS -3275928880,3275928927,ME -3275928928,3275928943,CS -3275928944,3275928959,ME -3275928960,3275929023,CS -3275929024,3275929055,ME -3275929056,3275929103,CS -3275929104,3275929151,CS -3275929152,3275929183,CS -3275929184,3275929215,CS -3275929216,3275929295,ME -3275929296,3275929311,CS -3275929312,3275929343,CS -3275929344,3275929359,CS -3275929360,3275929471,ME -3275929472,3275929487,CS -3275929488,3275929495,ME -3275929496,3275929535,CS -3275929536,3275929599,ME -3275929600,3275929663,CS +3275923456,3275924479,ME +3275924480,3275925759,RS +3275925760,3275926287,ME +3275926288,3275926303,RS +3275926304,3275926527,ME +3275926528,3275926783,RS +3275926784,3275928927,ME +3275928928,3275928943,RS +3275928944,3275929151,ME +3275929152,3275929159,RS +3275929160,3275929167,ME +3275929168,3275929183,RS +3275929184,3275929295,ME +3275929296,3275929311,RS +3275929312,3275929471,ME +3275929472,3275929487,RS +3275929488,3275929503,ME +3275929504,3275929535,RS +3275929536,3275929615,ME +3275929616,3275929663,RS 3275929664,3275929695,ME -3275929696,3275929727,CS -3275929728,3275929791,CS -3275929792,3275929855,ME -3275929856,3275929983,CS -3275929984,3275930015,ME -3275930016,3275930023,CS -3275930024,3275930047,ME -3275930048,3275930111,CS -3275930112,3275930127,ME -3275930128,3275930143,CS -3275930144,3275930207,ME -3275930208,3275930295,CS -3275930296,3275930303,CS -3275930304,3275930335,ME -3275930336,3275930623,CS -3275930624,3275930795,ME -3275930796,3275930799,CS -3275930800,3275931647,ME +3275929696,3275929711,RS +3275929712,3275929719,ME +3275929720,3275929727,RS +3275929728,3275929855,ME +3275929856,3275929919,RS +3275929920,3275929935,ME +3275929936,3275929951,RS +3275929952,3275930015,ME +3275930016,3275930023,RS +3275930024,3275930079,ME +3275930080,3275930095,RS +3275930096,3275930239,ME +3275930240,3275930271,RS +3275930272,3275930287,ME +3275930288,3275930295,RS +3275930296,3275931647,ME 3275931648,3275939839,UA 3275939840,3275948031,GB 3275948032,3275965267,SE 3275965268,3275965271,FI 3275965272,3276013567,SE -3276013568,3276014191,FR +3276013568,3276014087,FR +3276014088,3276014095,GB +3276014096,3276014151,FR +3276014152,3276014159,GB +3276014160,3276014191,FR 3276014192,3276014207,GB -3276014208,3276014343,FR -3276014344,3276014351,GB -3276014352,3276014391,FR -3276014392,3276014399,GB -3276014400,3276014415,FR -3276014416,3276014439,GB -3276014440,3276014471,FR +3276014208,3276014255,FR +3276014256,3276014263,GB +3276014264,3276014471,FR 3276014472,3276014495,GB -3276014496,3276014503,FR -3276014504,3276014511,GB -3276014512,3276014607,FR -3276014608,3276014623,GB -3276014624,3276014647,FR -3276014648,3276014655,GB -3276014656,3276014671,FR -3276014672,3276014679,GB -3276014680,3276014695,FR -3276014696,3276014719,GB -3276014720,3276014751,FR -3276014752,3276014799,GB -3276014800,3276014815,FR -3276014816,3276014847,GB -3276014848,3276014879,FR -3276014880,3276014895,GB -3276014896,3276014911,FR -3276014912,3276014935,GB -3276014936,3276015007,FR -3276015008,3276015055,GB -3276015056,3276015199,FR +3276014496,3276014887,FR +3276014888,3276014895,IE +3276014896,3276015103,FR +3276015104,3276015119,GB +3276015120,3276015199,FR 3276015200,3276015231,GB 3276015232,3276015247,FR 3276015248,3276015263,GB 3276015264,3276015295,FR 3276015296,3276015327,GB -3276015328,3276015407,FR -3276015408,3276015423,GB -3276015424,3276015567,FR -3276015568,3276015583,GB -3276015584,3276015615,FR -3276015616,3276015655,GB -3276015656,3276015815,FR -3276015816,3276015855,GB -3276015856,3276015863,FR -3276015864,3276015871,GB -3276015872,3276015929,FR -3276015930,3276015935,GB -3276015936,3276016095,FR -3276016096,3276016103,GB -3276016104,3276016119,FR -3276016120,3276016127,GB -3276016128,3276016391,FR +3276015328,3276015415,FR +3276015416,3276015423,GB +3276015424,3276015559,FR +3276015560,3276015583,GB +3276015584,3276015879,FR +3276015880,3276015887,GB +3276015888,3276016391,FR 3276016392,3276016399,GB 3276016400,3276016415,FR 3276016416,3276016463,GB -3276016464,3276016495,FR -3276016496,3276016511,GB -3276016512,3276016527,FR -3276016528,3276016591,GB +3276016464,3276016511,FR +3276016512,3276016591,GB 3276016592,3276016703,FR 3276016704,3276016735,GB 3276016736,3276016767,FR 3276016768,3276016783,GB -3276016784,3276016815,FR -3276016816,3276016847,GB +3276016784,3276016799,FR +3276016800,3276016815,GB +3276016816,3276016831,FR +3276016832,3276016847,GB 3276016848,3276016863,FR 3276016864,3276016879,GB 3276016880,3276016943,FR 3276016944,3276016959,GB 3276016960,3276016975,FR 3276016976,3276016991,GB -3276016992,3276017055,FR -3276017056,3276017071,GB -3276017072,3276017119,FR +3276016992,3276017039,FR +3276017040,3276017043,GB +3276017044,3276017047,FR +3276017048,3276017055,GB +3276017056,3276017119,FR 3276017120,3276017151,GB -3276017152,3276017551,FR +3276017152,3276017327,FR +3276017328,3276017343,GB +3276017344,3276017551,FR 3276017552,3276017567,GB 3276017568,3276017607,FR -3276017608,3276017631,GB -3276017632,3276018047,FR +3276017608,3276017663,GB +3276017664,3276018015,FR +3276018016,3276018031,GB +3276018032,3276018047,FR 3276018048,3276018063,GB 3276018064,3276018095,FR 3276018096,3276018127,GB 3276018128,3276018143,FR 3276018144,3276018159,GB -3276018160,3276018495,FR +3276018160,3276018183,FR +3276018184,3276018207,GB +3276018208,3276018375,FR +3276018376,3276018383,GB +3276018384,3276018423,FR +3276018424,3276018431,GB +3276018432,3276018495,FR 3276018496,3276018527,GB 3276018528,3276018543,FR -3276018544,3276018591,GB -3276018592,3276018943,FR +3276018544,3276018623,GB +3276018624,3276018943,FR 3276018944,3276018975,GB 3276018976,3276018985,FR 3276018986,3276019007,GB 3276019008,3276019023,FR -3276019024,3276019151,GB -3276019152,3276019455,FR -3276019456,3276019479,GB -3276019480,3276019487,FR -3276019488,3276019511,GB +3276019024,3276019071,GB +3276019072,3276019135,FR +3276019136,3276019151,GB +3276019152,3276019463,FR +3276019464,3276019471,GB +3276019472,3276019503,FR +3276019504,3276019511,GB 3276019512,3276019535,FR -3276019536,3276019591,GB -3276019592,3276019639,FR +3276019536,3276019543,GB +3276019544,3276019559,FR +3276019560,3276019599,GB +3276019600,3276019639,FR 3276019640,3276019647,GB -3276019648,3276019663,FR -3276019664,3276019671,GB -3276019672,3276019679,FR +3276019648,3276019679,FR 3276019680,3276019687,GB 3276019688,3276019695,FR 3276019696,3276019703,GB @@ -48630,140 +80104,128 @@ 3276019832,3276019839,FR 3276019840,3276019855,GB 3276019856,3276019863,FR -3276019864,3276019871,GB -3276019872,3276019895,FR -3276019896,3276019903,GB -3276019904,3276019911,FR -3276019912,3276019919,GB -3276019920,3276019967,FR -3276019968,3276019975,GB -3276019976,3276020071,FR -3276020072,3276020079,GB -3276020080,3276020127,FR -3276020128,3276020143,GB -3276020144,3276020399,FR -3276020400,3276020431,GB -3276020432,3276020495,FR -3276020496,3276020511,GB -3276020512,3276020527,FR -3276020528,3276020543,GB -3276020544,3276020679,FR +3276019864,3276019887,GB +3276019888,3276019919,FR +3276019920,3276019927,GB +3276019928,3276020103,FR +3276020104,3276020111,GB +3276020112,3276020399,FR +3276020400,3276020423,GB +3276020424,3276020431,FR +3276020432,3276020439,GB +3276020440,3276020495,FR +3276020496,3276020503,GB +3276020504,3276020623,FR +3276020624,3276020631,GB +3276020632,3276020679,FR 3276020680,3276020687,GB -3276020688,3276020943,FR +3276020688,3276020703,FR +3276020704,3276020735,GB +3276020736,3276020879,FR +3276020880,3276020887,GB +3276020888,3276020943,FR 3276020944,3276020991,GB -3276020992,3276021151,FR -3276021152,3276021167,GB -3276021168,3276021215,FR -3276021216,3276021247,GB -3276021248,3276021535,FR -3276021536,3276021543,GB -3276021544,3276021575,FR -3276021576,3276021591,GB -3276021592,3276021599,FR -3276021600,3276021615,GB -3276021616,3276021655,FR -3276021656,3276021663,GB -3276021664,3276021727,FR -3276021728,3276021759,GB -3276021760,3276021791,FR -3276021792,3276021823,GB -3276021824,3276021855,FR -3276021856,3276021887,GB -3276021888,3276021983,FR -3276021984,3276021999,GB -3276022000,3276022031,FR -3276022032,3276022047,GB +3276020992,3276021103,FR +3276021104,3276021111,GB +3276021112,3276021591,FR +3276021592,3276021599,GB +3276021600,3276022039,FR +3276022040,3276022047,GB 3276022048,3276022087,FR 3276022088,3276022095,GB 3276022096,3276022127,FR 3276022128,3276022143,GB -3276022144,3276022247,FR -3276022248,3276022255,GB -3276022256,3276022415,FR -3276022416,3276022431,GB -3276022432,3276022479,FR +3276022144,3276022215,FR +3276022216,3276022223,GB +3276022224,3276022255,FR +3276022256,3276022271,GB +3276022272,3276022343,FR +3276022344,3276022351,GB +3276022352,3276022455,FR +3276022456,3276022463,GB +3276022464,3276022479,FR 3276022480,3276022495,GB 3276022496,3276022519,FR 3276022520,3276022527,GB 3276022528,3276022567,FR -3276022568,3276022575,GB -3276022576,3276022591,FR -3276022592,3276022639,GB -3276022640,3276022751,FR +3276022568,3276022639,GB +3276022640,3276022655,FR +3276022656,3276022687,GB +3276022688,3276022751,FR 3276022752,3276022783,GB -3276022784,3276022983,FR +3276022784,3276022791,FR +3276022792,3276022799,GB +3276022800,3276022983,FR 3276022984,3276022991,GB 3276022992,3276023031,FR 3276023032,3276023039,GB -3276023040,3276023103,FR -3276023104,3276023231,GB -3276023232,3276023247,FR -3276023248,3276023279,GB -3276023280,3276023295,FR -3276023296,3276023303,GB -3276023304,3276023311,FR -3276023312,3276023343,GB -3276023344,3276023375,FR -3276023376,3276023423,GB -3276023424,3276023455,FR -3276023456,3276023471,GB -3276023472,3276023487,FR -3276023488,3276023519,GB -3276023520,3276023679,FR -3276023680,3276023711,GB -3276023712,3276023855,FR -3276023856,3276023887,GB -3276023888,3276023895,FR -3276023896,3276023919,GB +3276023040,3276023071,FR +3276023072,3276023079,GB +3276023080,3276023103,FR +3276023104,3276023279,GB +3276023280,3276023687,FR +3276023688,3276023695,GB +3276023696,3276023759,FR +3276023760,3276023767,GB +3276023768,3276023871,FR +3276023872,3276023887,GB +3276023888,3276023903,FR +3276023904,3276023919,GB 3276023920,3276023943,FR 3276023944,3276023951,GB 3276023952,3276023959,FR -3276023960,3276024063,GB -3276024064,3276024239,FR -3276024240,3276024271,GB -3276024272,3276025103,FR -3276025104,3276025135,GB +3276023960,3276023967,GB +3276023968,3276024719,FR +3276024720,3276024831,GB +3276024832,3276025111,FR +3276025112,3276025135,GB 3276025136,3276025151,FR 3276025152,3276025159,GB 3276025160,3276025167,FR 3276025168,3276025175,GB 3276025176,3276025183,FR 3276025184,3276025191,GB -3276025192,3276025247,FR +3276025192,3276025207,FR +3276025208,3276025215,GB +3276025216,3276025247,FR 3276025248,3276025279,GB 3276025280,3276025295,FR 3276025296,3276025327,GB -3276025328,3276026111,FR -3276026112,3276026127,GB -3276026128,3276026167,FR +3276025328,3276026143,FR +3276026144,3276026159,GB +3276026160,3276026167,FR 3276026168,3276026175,GB -3276026176,3276026399,FR -3276026400,3276026415,GB -3276026416,3276026423,FR +3276026176,3276026191,FR +3276026192,3276026199,GB +3276026200,3276026215,FR +3276026216,3276026223,GB +3276026224,3276026319,FR +3276026320,3276026351,GB +3276026352,3276026423,FR 3276026424,3276026431,GB -3276026432,3276026439,FR -3276026440,3276026447,GB -3276026448,3276026543,FR -3276026544,3276026551,GB -3276026552,3276026559,FR -3276026560,3276026575,GB -3276026576,3276026727,FR -3276026728,3276026743,GB -3276026744,3276026815,FR +3276026432,3276026527,FR +3276026528,3276026535,GB +3276026536,3276026543,FR +3276026544,3276026575,GB +3276026576,3276026591,FR +3276026592,3276026607,GB +3276026608,3276026703,FR +3276026704,3276026719,GB +3276026720,3276026727,FR +3276026728,3276026783,GB +3276026784,3276026815,FR 3276026816,3276026823,GB -3276026824,3276026879,FR -3276026880,3276026927,GB -3276026928,3276026959,FR -3276026960,3276026991,GB +3276026824,3276026847,FR +3276026848,3276026927,GB +3276026928,3276026943,FR +3276026944,3276026991,GB 3276026992,3276027311,FR 3276027312,3276027327,GB 3276027328,3276027503,FR -3276027504,3276027535,GB -3276027536,3276027551,FR +3276027504,3276027519,GB +3276027520,3276027551,FR 3276027552,3276027583,GB -3276027584,3276027646,FR -3276027647,3276027647,GB -3276027648,3276027695,FR +3276027584,3276027695,FR 3276027696,3276027743,GB 3276027744,3276027791,FR 3276027792,3276027807,GB @@ -48783,79 +80245,83 @@ 3276028248,3276028255,GB 3276028256,3276028263,FR 3276028264,3276028287,GB -3276028288,3276028415,FR -3276028416,3276028479,GB -3276028480,3276028511,FR -3276028512,3276028671,GB -3276028672,3276028743,FR +3276028288,3276028479,FR +3276028480,3276028511,GB +3276028512,3276028743,FR 3276028744,3276028751,GB -3276028752,3276028791,FR +3276028752,3276028759,FR +3276028760,3276028767,GB +3276028768,3276028791,FR 3276028792,3276028799,GB -3276028800,3276028895,FR +3276028800,3276028807,FR +3276028808,3276028815,GB +3276028816,3276028863,FR +3276028864,3276028871,GB +3276028872,3276028879,FR +3276028880,3276028887,GB +3276028888,3276028895,FR 3276028896,3276028927,GB 3276028928,3276029183,FR 3276029184,3276029199,GB -3276029200,3276029247,FR -3276029248,3276029263,GB -3276029264,3276029343,FR +3276029200,3276029343,FR 3276029344,3276029359,GB 3276029360,3276029375,FR 3276029376,3276029407,GB 3276029408,3276029423,FR 3276029424,3276029439,GB -3276029440,3276029567,FR -3276029568,3276029599,GB -3276029600,3276029759,FR -3276029760,3276029791,GB -3276029792,3276029871,FR -3276029872,3276029887,GB -3276029888,3276029935,FR -3276029936,3276029967,GB +3276029440,3276029583,FR +3276029584,3276029599,GB +3276029600,3276029727,FR +3276029728,3276029791,GB +3276029792,3276029855,FR +3276029856,3276029887,GB +3276029888,3276029919,FR +3276029920,3276029967,GB 3276029968,3276030079,FR 3276030080,3276030095,GB 3276030096,3276030191,FR 3276030192,3276030207,GB 3276030208,3276030215,FR -3276030216,3276030223,GB -3276030224,3276030239,FR -3276030240,3276030247,GB -3276030248,3276030255,FR +3276030216,3276030239,GB +3276030240,3276030255,FR 3276030256,3276030263,GB 3276030264,3276030271,FR -3276030272,3276030295,GB -3276030296,3276030407,FR +3276030272,3276030303,GB +3276030304,3276030407,FR 3276030408,3276030415,GB 3276030416,3276030543,FR 3276030544,3276030559,GB -3276030560,3276030607,FR -3276030608,3276030623,GB -3276030624,3276031103,FR -3276031104,3276031231,GB -3276031232,3276031375,FR -3276031376,3276031391,GB -3276031392,3276031423,FR +3276030560,3276031255,FR +3276031256,3276031263,GB +3276031264,3276031375,FR +3276031376,3276031383,GB +3276031384,3276031423,FR 3276031424,3276031439,GB 3276031440,3276031519,FR -3276031520,3276031535,GB -3276031536,3276031559,FR -3276031560,3276031567,GB -3276031568,3276031575,FR -3276031576,3276031591,GB -3276031592,3276031615,FR -3276031616,3276031679,GB +3276031520,3276031551,GB +3276031552,3276031559,FR +3276031560,3276031575,GB +3276031576,3276031583,FR +3276031584,3276031591,GB +3276031592,3276031631,FR +3276031632,3276031679,GB 3276031680,3276031719,FR 3276031720,3276031743,GB 3276031744,3276032007,FR -3276032008,3276032023,GB -3276032024,3276032055,FR -3276032056,3276032079,GB -3276032080,3276032103,FR +3276032008,3276032015,GB +3276032016,3276032023,FR +3276032024,3276032031,GB +3276032032,3276032103,FR 3276032104,3276032111,GB -3276032112,3276032287,FR -3276032288,3276032303,GB +3276032112,3276032271,FR +3276032272,3276032303,GB 3276032304,3276032319,FR 3276032320,3276032343,GB -3276032344,3276032543,FR +3276032344,3276032367,FR +3276032368,3276032383,GB +3276032384,3276032431,FR +3276032432,3276032479,GB +3276032480,3276032543,FR 3276032544,3276032559,GB 3276032560,3276032591,FR 3276032592,3276032607,GB @@ -48870,20 +80336,24 @@ 3276033232,3276033247,FR 3276033248,3276033279,GB 3276033280,3276033535,FR -3276033536,3276033695,GB -3276033696,3276033727,FR -3276033728,3276033895,GB -3276033896,3276033911,FR -3276033912,3276033919,GB -3276033920,3276033927,FR +3276033536,3276033647,GB +3276033648,3276033663,FR +3276033664,3276033695,GB +3276033696,3276033791,FR +3276033792,3276033823,GB +3276033824,3276033839,FR +3276033840,3276033855,GB +3276033856,3276033863,FR +3276033864,3276033871,GB +3276033872,3276033879,FR +3276033880,3276033887,GB +3276033888,3276033927,FR 3276033928,3276033951,GB -3276033952,3276033983,FR -3276033984,3276034015,GB -3276034016,3276035839,FR -3276035840,3276036079,GB -3276036080,3276036103,FR -3276036104,3276036151,GB -3276036152,3276036191,FR +3276033952,3276036095,FR +3276036096,3276036103,GB +3276036104,3276036111,FR +3276036112,3276036119,GB +3276036120,3276036191,FR 3276036192,3276036207,GB 3276036208,3276036223,FR 3276036224,3276036255,GB @@ -48891,163 +80361,175 @@ 3276036272,3276036287,GB 3276036288,3276036303,FR 3276036304,3276036335,GB -3276036336,3276036351,FR -3276036352,3276036447,GB -3276036448,3276036479,FR -3276036480,3276036527,GB -3276036528,3276036543,FR -3276036544,3276036607,GB -3276036608,3276037135,FR -3276037136,3276037151,GB -3276037152,3276037199,FR +3276036336,3276036343,FR +3276036344,3276036351,GB +3276036352,3276036383,FR +3276036384,3276036415,GB +3276036416,3276036591,FR +3276036592,3276036607,GB +3276036608,3276037199,FR 3276037200,3276037215,GB -3276037216,3276037327,FR -3276037328,3276037343,GB -3276037344,3276037359,FR +3276037216,3276037359,FR 3276037360,3276037375,GB 3276037376,3276037695,FR 3276037696,3276037743,GB -3276037744,3276037783,FR -3276037784,3276037791,GB -3276037792,3276037887,FR +3276037744,3276037887,FR 3276037888,3276037903,GB 3276037904,3276037959,FR 3276037960,3276037983,GB -3276037984,3276038015,FR -3276038016,3276038031,GB -3276038032,3276038047,FR +3276037984,3276038047,FR 3276038048,3276038111,GB -3276038112,3276038127,FR -3276038128,3276038399,GB +3276038112,3276038143,FR +3276038144,3276038399,GB 3276038400,3276038703,FR 3276038704,3276038719,GB 3276038720,3276038735,FR -3276038736,3276038751,GB -3276038752,3276038799,FR +3276038736,3276038767,GB +3276038768,3276038799,FR 3276038800,3276038815,GB 3276038816,3276038847,FR 3276038848,3276038911,GB 3276038912,3276039199,FR 3276039200,3276039247,GB 3276039248,3276039279,FR -3276039280,3276039311,GB -3276039312,3276039327,FR -3276039328,3276039423,GB +3276039280,3276039295,GB +3276039296,3276039327,FR +3276039328,3276039343,GB +3276039344,3276039391,FR +3276039392,3276039423,GB 3276039424,3276039551,FR -3276039552,3276039583,GB -3276039584,3276039647,FR +3276039552,3276039567,GB +3276039568,3276039647,FR 3276039648,3276039663,GB -3276039664,3276039935,FR -3276039936,3276039951,GB +3276039664,3276039943,FR +3276039944,3276039951,GB 3276039952,3276039967,FR 3276039968,3276040031,GB 3276040032,3276040063,FR -3276040064,3276040111,GB -3276040112,3276040159,FR +3276040064,3276040095,GB +3276040096,3276040159,FR 3276040160,3276040175,GB 3276040176,3276040207,FR 3276040208,3276040215,GB 3276040216,3276040231,FR -3276040232,3276040319,GB -3276040320,3276040447,FR -3276040448,3276040463,GB -3276040464,3276040479,FR -3276040480,3276040495,GB -3276040496,3276040591,FR +3276040232,3276040239,GB +3276040240,3276040319,FR +3276040320,3276040327,GB +3276040328,3276040335,FR +3276040336,3276040343,GB +3276040344,3276040351,FR +3276040352,3276040367,GB +3276040368,3276040439,FR +3276040440,3276040495,GB +3276040496,3276040543,FR +3276040544,3276040575,GB +3276040576,3276040591,FR 3276040592,3276040607,GB -3276040608,3276040671,FR -3276040672,3276040687,GB -3276040688,3276040703,FR -3276040704,3276040735,GB -3276040736,3276040927,FR -3276040928,3276040959,GB -3276040960,3276040991,FR +3276040608,3276040639,FR +3276040640,3276040671,GB +3276040672,3276040879,FR +3276040880,3276040895,GB +3276040896,3276040991,FR 3276040992,3276041007,GB -3276041008,3276041023,FR -3276041024,3276041055,GB -3276041056,3276041071,FR +3276041008,3276041071,FR 3276041072,3276041087,GB 3276041088,3276041199,FR 3276041200,3276041215,GB 3276041216,3276041279,FR -3276041280,3276041295,GB -3276041296,3276041343,FR -3276041344,3276041375,GB -3276041376,3276041391,FR +3276041280,3276041311,GB +3276041312,3276041391,FR 3276041392,3276041407,GB 3276041408,3276041487,FR -3276041488,3276041535,GB +3276041488,3276041503,GB +3276041504,3276041519,FR +3276041520,3276041535,GB 3276041536,3276041551,FR -3276041552,3276041663,GB -3276041664,3276041759,FR +3276041552,3276041599,GB +3276041600,3276041759,FR 3276041760,3276041775,GB -3276041776,3276041855,FR -3276041856,3276041887,GB +3276041776,3276041839,FR +3276041840,3276041887,GB 3276041888,3276041919,FR 3276041920,3276041951,GB -3276041952,3276041999,FR +3276041952,3276041967,FR +3276041968,3276041983,GB +3276041984,3276041999,FR 3276042000,3276042007,GB -3276042008,3276042111,FR +3276042008,3276042015,FR +3276042016,3276042047,GB +3276042048,3276042111,FR 3276042112,3276042143,GB 3276042144,3276042175,FR -3276042176,3276042239,GB +3276042176,3276042191,GB +3276042192,3276042207,FR +3276042208,3276042239,GB 3276042240,3276042767,FR 3276042768,3276042815,GB 3276042816,3276042831,FR 3276042832,3276042847,GB 3276042848,3276044303,FR -3276044304,3276044359,GB -3276044360,3276044447,FR +3276044304,3276044319,GB +3276044320,3276044351,FR +3276044352,3276044359,GB +3276044360,3276044367,FR +3276044368,3276044375,GB +3276044376,3276044447,FR 3276044448,3276044463,GB -3276044464,3276044511,FR +3276044464,3276044479,FR +3276044480,3276044495,GB +3276044496,3276044511,FR 3276044512,3276044543,GB 3276044544,3276044607,FR 3276044608,3276044639,GB 3276044640,3276044671,FR -3276044672,3276044735,GB -3276044736,3276044815,FR -3276044816,3276044839,GB -3276044840,3276044863,FR +3276044672,3276044703,GB +3276044704,3276044735,FR +3276044736,3276044799,GB +3276044800,3276044815,FR +3276044816,3276044831,GB +3276044832,3276044863,FR 3276044864,3276044879,GB 3276044880,3276044927,FR 3276044928,3276044943,GB -3276044944,3276044967,FR -3276044968,3276044975,GB -3276044976,3276044991,FR +3276044944,3276044959,FR +3276044960,3276044967,GB +3276044968,3276044991,FR 3276044992,3276044999,GB 3276045000,3276045023,FR 3276045024,3276045039,GB -3276045040,3276045055,FR -3276045056,3276045071,GB -3276045072,3276045079,FR -3276045080,3276045095,GB -3276045096,3276045111,FR -3276045112,3276045119,GB -3276045120,3276045143,FR -3276045144,3276045151,GB -3276045152,3276045183,FR -3276045184,3276045199,GB -3276045200,3276045239,FR -3276045240,3276045255,GB -3276045256,3276045295,FR -3276045296,3276045311,GB -3276045312,3276045567,FR +3276045040,3276045063,FR +3276045064,3276045071,GB +3276045072,3276045119,FR +3276045120,3276045127,GB +3276045128,3276045135,FR +3276045136,3276045151,GB +3276045152,3276045191,FR +3276045192,3276045199,GB +3276045200,3276045223,FR +3276045224,3276045239,GB +3276045240,3276045255,FR +3276045256,3276045271,GB +3276045272,3276045287,FR +3276045288,3276045311,GB +3276045312,3276045351,FR +3276045352,3276045359,GB +3276045360,3276045455,FR +3276045456,3276045463,GB +3276045464,3276045479,FR +3276045480,3276045487,GB +3276045488,3276045543,FR +3276045544,3276045551,GB +3276045552,3276045567,FR 3276045568,3276045599,GB 3276045600,3276045631,FR 3276045632,3276045647,GB -3276045648,3276045655,FR -3276045656,3276045663,GB -3276045664,3276045767,FR +3276045648,3276045767,FR 3276045768,3276045783,GB -3276045784,3276045791,FR -3276045792,3276045807,GB -3276045808,3276045815,FR +3276045784,3276045815,FR 3276045816,3276045823,GB 3276045824,3276045919,FR 3276045920,3276045951,GB -3276045952,3276045983,FR -3276045984,3276045991,GB -3276045992,3276046335,FR +3276045952,3276046335,FR 3276046336,3276062719,RU 3276062720,3276063231,PL 3276063232,3276063743,FR @@ -49104,9 +80586,9 @@ 3276116992,3276118015,RU 3276118016,3276119039,GB 3276119040,3276120063,RU -3276120064,3276121087,LB +3276120064,3276121087,GB 3276121088,3276122111,BG -3276122112,3276123135,UA +3276122112,3276123135,RU 3276123136,3276124159,AT 3276124160,3276125183,UA 3276125184,3276126207,AT @@ -49115,7 +80597,6 @@ 3276128256,3276129279,AT 3276129280,3276131327,UA 3276131328,3276132351,DK -3276132352,3276133375,TR 3276133376,3276134399,GB 3276134400,3276135423,RU 3276135424,3276136447,UA @@ -49133,29 +80614,21 @@ 3276185600,3276193791,NO 3276193792,3276201983,RU 3276201984,3276210175,AT -3276210176,3276221463,DE -3276221464,3276221503,AT -3276221504,3276222255,DE -3276222256,3276222263,CH -3276222264,3276234303,DE +3276210176,3276227607,DE +3276227608,3276227615,MT +3276227616,3276227727,DE +3276227728,3276227743,MT +3276227744,3276233791,DE +3276233792,3276233799,RO +3276233800,3276233807,DE +3276233808,3276233823,RO +3276233824,3276234303,DE 3276234304,3276234367,GB -3276234368,3276244447,DE +3276234368,3276241759,DE +3276241760,3276241767,FR +3276241768,3276244447,DE 3276244448,3276244479,RO -3276244480,3276244515,DE -3276244516,3276244519,CH -3276244520,3276244671,DE -3276244672,3276244703,CH -3276244704,3276244707,DE -3276244708,3276244715,CH -3276244716,3276244831,DE -3276244832,3276244863,AT -3276244864,3276244935,DE -3276244936,3276244967,AT -3276244968,3276244979,DE -3276244980,3276244983,AT -3276244984,3276244987,DE -3276244988,3276244991,AT -3276244992,3276249279,DE +3276244480,3276249279,DE 3276249280,3276249287,FR 3276249288,3276249855,DE 3276249856,3276249983,GB @@ -49184,259 +80657,2027 @@ 3276316672,3276324863,GB 3276324864,3276333055,IT 3276333056,3276341247,RU -3276341248,3276341519,NL -3276341520,3276341527,DE -3276341528,3276341591,NL -3276341592,3276341599,DE -3276341600,3276341815,NL -3276341816,3276341823,DE -3276341824,3276341919,NL -3276341920,3276341927,DE -3276341928,3276342871,NL -3276342872,3276342879,DE -3276342880,3276343071,NL +3276341248,3276341263,NL +3276341264,3276341279,DE +3276341280,3276341535,NL +3276341536,3276341543,DE +3276341544,3276341655,NL +3276341656,3276341663,DE +3276341664,3276341679,NL +3276341680,3276341695,DE +3276341696,3276341735,NL +3276341736,3276341743,DE +3276341744,3276341767,NL +3276341768,3276341775,DE +3276341776,3276341823,NL +3276341824,3276341831,DE +3276341832,3276341879,NL +3276341880,3276341887,DE +3276341888,3276341975,NL +3276341976,3276341983,DE +3276341984,3276342119,NL +3276342120,3276342127,DE +3276342128,3276342191,NL +3276342192,3276342199,DE +3276342200,3276342247,NL +3276342248,3276342255,DE +3276342256,3276342383,NL +3276342384,3276342391,DE +3276342392,3276342495,NL +3276342496,3276342503,DE +3276342504,3276342535,NL +3276342536,3276342551,DE +3276342552,3276342583,NL +3276342584,3276342591,DE +3276342592,3276342671,NL +3276342672,3276342679,DE +3276342680,3276342703,NL +3276342704,3276342719,DE +3276342720,3276342767,NL +3276342768,3276342783,DE +3276342784,3276342831,NL +3276342832,3276342839,DE +3276342840,3276342847,NL +3276342848,3276342863,DE +3276342864,3276342991,NL +3276342992,3276342999,DE +3276343000,3276343039,NL +3276343040,3276343047,DE +3276343048,3276343055,NL +3276343056,3276343063,DE +3276343064,3276343071,NL 3276343072,3276343079,DE -3276343080,3276343447,NL -3276343448,3276343455,DE -3276343456,3276343551,NL -3276343552,3276343807,DE -3276343808,3276343887,NL -3276343888,3276343895,DE -3276343896,3276343911,NL -3276343912,3276343919,DE -3276343920,3276344431,NL -3276344432,3276344439,DE -3276344440,3276344471,NL +3276343080,3276343087,NL +3276343088,3276343095,DE +3276343096,3276343231,NL +3276343232,3276343239,DE +3276343240,3276343247,NL +3276343248,3276343255,DE +3276343256,3276343287,NL +3276343288,3276343295,DE +3276343296,3276343359,NL +3276343360,3276343367,DE +3276343368,3276343391,NL +3276343392,3276343399,DE +3276343400,3276343423,NL +3276343424,3276343447,DE +3276343448,3276343463,NL +3276343464,3276343479,DE +3276343480,3276343487,NL +3276343488,3276343495,DE +3276343496,3276343511,NL +3276343512,3276343519,DE +3276343520,3276343551,NL +3276343552,3276343815,DE +3276343816,3276343831,NL +3276343832,3276343839,DE +3276343840,3276343871,NL +3276343872,3276343879,DE +3276343880,3276343903,NL +3276343904,3276343911,DE +3276343912,3276344047,NL +3276344048,3276344055,DE +3276344056,3276344063,NL +3276344064,3276344071,DE +3276344072,3276344111,NL +3276344112,3276344119,DE +3276344120,3276344215,NL +3276344216,3276344223,DE +3276344224,3276344303,NL +3276344304,3276344319,DE +3276344320,3276344391,NL +3276344392,3276344399,DE +3276344400,3276344415,NL +3276344416,3276344423,DE +3276344424,3276344471,NL 3276344472,3276344479,DE -3276344480,3276344775,NL -3276344776,3276344783,DE -3276344784,3276345031,NL -3276345032,3276345039,DE -3276345040,3276345063,NL +3276344480,3276344551,NL +3276344552,3276344559,DE +3276344560,3276344575,NL +3276344576,3276344583,DE +3276344584,3276344623,NL +3276344624,3276344631,DE +3276344632,3276344663,NL +3276344664,3276344671,DE +3276344672,3276344711,NL +3276344712,3276344719,DE +3276344720,3276344727,NL +3276344728,3276344759,DE +3276344760,3276344799,NL +3276344800,3276344807,DE +3276344808,3276344895,NL +3276344896,3276344903,DE +3276344904,3276344983,NL +3276344984,3276344991,DE +3276344992,3276345007,NL +3276345008,3276345015,DE +3276345016,3276345063,NL 3276345064,3276345071,DE -3276345072,3276345439,NL -3276345440,3276345447,DE -3276345448,3276345775,NL -3276345776,3276345783,DE -3276345784,3276346639,NL -3276346640,3276346647,DE -3276346648,3276346719,NL -3276346720,3276346727,DE -3276346728,3276346911,NL -3276346912,3276346919,DE -3276346920,3276347151,NL -3276347152,3276347159,DE -3276347160,3276347487,NL -3276347488,3276347495,DE -3276347496,3276347607,NL -3276347608,3276347615,DE -3276347616,3276347863,NL -3276347864,3276347871,DE -3276347872,3276348983,NL -3276348984,3276348991,DE -3276348992,3276349535,NL -3276349536,3276349543,DE -3276349544,3276349831,NL +3276345072,3276345223,NL +3276345224,3276345231,DE +3276345232,3276345295,NL +3276345296,3276345303,DE +3276345304,3276345327,NL +3276345328,3276345335,DE +3276345336,3276345343,NL +3276345344,3276345359,DE +3276345360,3276345415,NL +3276345416,3276345423,DE +3276345424,3276345647,NL +3276345648,3276345655,DE +3276345656,3276345727,NL +3276345728,3276345735,DE +3276345736,3276345767,NL +3276345768,3276345783,DE +3276345784,3276345823,NL +3276345824,3276345831,DE +3276345832,3276345839,NL +3276345840,3276345847,DE +3276345848,3276345863,NL +3276345864,3276345871,DE +3276345872,3276345927,NL +3276345928,3276345935,DE +3276345936,3276346167,NL +3276346168,3276346175,DE +3276346176,3276346207,NL +3276346208,3276346215,DE +3276346216,3276346223,NL +3276346224,3276346231,DE +3276346232,3276346295,NL +3276346296,3276346303,DE +3276346304,3276346359,NL +3276346360,3276346375,DE +3276346376,3276346655,NL +3276346656,3276346663,DE +3276346664,3276346703,NL +3276346704,3276346711,DE +3276346712,3276346727,NL +3276346728,3276346735,DE +3276346736,3276346839,NL +3276346840,3276346847,DE +3276346848,3276346879,NL +3276346880,3276346887,DE +3276346888,3276346951,NL +3276346952,3276346959,DE +3276346960,3276347039,NL +3276347040,3276347047,DE +3276347048,3276347111,NL +3276347112,3276347127,DE +3276347128,3276347135,NL +3276347136,3276347143,DE +3276347144,3276347159,NL +3276347160,3276347167,DE +3276347168,3276347207,NL +3276347208,3276347215,DE +3276347216,3276347327,NL +3276347328,3276347335,DE +3276347336,3276347391,NL +3276347392,3276347399,DE +3276347400,3276347543,NL +3276347544,3276347551,DE +3276347552,3276347655,NL +3276347656,3276347663,DE +3276347664,3276347759,NL +3276347760,3276347767,DE +3276347768,3276347847,NL +3276347848,3276347855,DE +3276347856,3276347903,NL +3276347904,3276347911,DE +3276347912,3276347959,NL +3276347960,3276347967,DE +3276347968,3276347991,NL +3276347992,3276347999,DE +3276348000,3276348015,NL +3276348016,3276348023,DE +3276348024,3276348063,NL +3276348064,3276348071,DE +3276348072,3276348111,NL +3276348112,3276348119,DE +3276348120,3276348127,NL +3276348128,3276348135,DE +3276348136,3276348151,NL +3276348152,3276348167,DE +3276348168,3276348183,NL +3276348184,3276348191,DE +3276348192,3276348199,NL +3276348200,3276348223,DE +3276348224,3276348231,NL +3276348232,3276348239,DE +3276348240,3276348295,NL +3276348296,3276348303,DE +3276348304,3276348319,NL +3276348320,3276348327,DE +3276348328,3276348343,NL +3276348344,3276348351,DE +3276348352,3276348431,NL +3276348432,3276348439,DE +3276348440,3276348455,NL +3276348456,3276348463,DE +3276348464,3276348511,NL +3276348512,3276348519,DE +3276348520,3276348623,NL +3276348624,3276348631,DE +3276348632,3276348679,NL +3276348680,3276348687,DE +3276348688,3276348719,NL +3276348720,3276348751,DE +3276348752,3276348767,NL +3276348768,3276348775,DE +3276348776,3276348839,NL +3276348840,3276348847,DE +3276348848,3276349063,NL +3276349064,3276349071,DE +3276349072,3276349135,NL +3276349136,3276349143,DE +3276349144,3276349167,NL +3276349168,3276349175,DE +3276349176,3276349199,NL +3276349200,3276349207,DE +3276349208,3276349215,NL +3276349216,3276349223,DE +3276349224,3276349679,NL +3276349680,3276349687,DE +3276349688,3276349831,NL 3276349832,3276349839,DE -3276349840,3276350447,NL -3276350448,3276350455,DE -3276350456,3276351007,NL +3276349840,3276349871,NL +3276349872,3276349879,DE +3276349880,3276349903,NL +3276349904,3276349911,DE +3276349912,3276349991,NL +3276349992,3276349999,DE +3276350000,3276350031,NL +3276350032,3276350047,DE +3276350048,3276350191,NL +3276350192,3276350199,DE +3276350200,3276350207,NL +3276350208,3276350215,DE +3276350216,3276350239,NL +3276350240,3276350247,DE +3276350248,3276350287,NL +3276350288,3276350295,DE +3276350296,3276350455,NL +3276350456,3276350463,DE +3276350464,3276350519,NL +3276350520,3276350527,DE +3276350528,3276350639,NL +3276350640,3276350647,DE +3276350648,3276350671,NL +3276350672,3276350679,DE +3276350680,3276350687,NL +3276350688,3276350695,DE +3276350696,3276350959,NL +3276350960,3276350967,DE +3276350968,3276350975,NL +3276350976,3276350983,DE +3276350984,3276351007,NL 3276351008,3276351015,DE -3276351016,3276351071,NL -3276351072,3276351079,DE -3276351080,3276351703,NL +3276351016,3276351095,NL +3276351096,3276351103,DE +3276351104,3276351119,NL +3276351120,3276351135,DE +3276351136,3276351191,NL +3276351192,3276351199,DE +3276351200,3276351215,NL +3276351216,3276351223,DE +3276351224,3276351311,NL +3276351312,3276351319,DE +3276351320,3276351383,NL +3276351384,3276351391,DE +3276351392,3276351535,NL +3276351536,3276351543,DE +3276351544,3276351559,NL +3276351560,3276351567,DE +3276351568,3276351575,NL +3276351576,3276351583,DE +3276351584,3276351591,NL +3276351592,3276351599,DE +3276351600,3276351607,NL +3276351608,3276351623,DE +3276351624,3276351647,NL +3276351648,3276351655,DE +3276351656,3276351679,NL +3276351680,3276351687,DE +3276351688,3276351703,NL 3276351704,3276351711,DE -3276351712,3276352047,NL -3276352048,3276352055,DE -3276352056,3276352079,NL -3276352080,3276352087,DE -3276352088,3276352191,NL -3276352192,3276352199,DE -3276352200,3276352415,NL -3276352416,3276352423,DE -3276352424,3276352615,NL -3276352616,3276352623,DE -3276352624,3276353087,NL -3276353088,3276353095,DE -3276353096,3276353343,NL +3276351712,3276351727,NL +3276351728,3276351735,DE +3276351736,3276351775,NL +3276351776,3276351783,DE +3276351784,3276351791,NL +3276351792,3276351799,DE +3276351800,3276351807,NL +3276351808,3276351815,DE +3276351816,3276351879,NL +3276351880,3276351887,DE +3276351888,3276351967,NL +3276351968,3276351975,DE +3276351976,3276352167,NL +3276352168,3276352175,DE +3276352176,3276352279,NL +3276352280,3276352287,DE +3276352288,3276352335,NL +3276352336,3276352343,DE +3276352344,3276352399,NL +3276352400,3276352407,DE +3276352408,3276352511,NL +3276352512,3276352519,DE +3276352520,3276352655,NL +3276352656,3276352663,DE +3276352664,3276352695,NL +3276352696,3276352703,DE +3276352704,3276352767,NL +3276352768,3276352775,DE +3276352776,3276352783,NL +3276352784,3276352791,DE +3276352792,3276352831,NL +3276352832,3276352839,DE +3276352840,3276352911,NL +3276352912,3276352935,DE +3276352936,3276352943,NL +3276352944,3276352951,DE +3276352952,3276352959,NL +3276352960,3276352967,DE +3276352968,3276353039,NL +3276353040,3276353047,DE +3276353048,3276353079,NL +3276353080,3276353087,DE +3276353088,3276353143,NL +3276353144,3276353151,DE +3276353152,3276353207,NL +3276353208,3276353215,DE +3276353216,3276353295,NL +3276353296,3276353303,DE +3276353304,3276353343,NL 3276353344,3276353351,DE -3276353352,3276353407,NL -3276353408,3276353415,DE -3276353416,3276354839,NL -3276354840,3276354847,DE -3276354848,3276356103,NL -3276356104,3276356111,DE -3276356112,3276356351,NL +3276353352,3276353359,NL +3276353360,3276353367,DE +3276353368,3276353655,NL +3276353656,3276353663,DE +3276353664,3276353687,NL +3276353688,3276353695,DE +3276353696,3276353711,NL +3276353712,3276353719,DE +3276353720,3276353799,NL +3276353800,3276353807,DE +3276353808,3276353927,NL +3276353928,3276353935,DE +3276353936,3276354095,NL +3276354096,3276354103,DE +3276354104,3276354183,NL +3276354184,3276354191,DE +3276354192,3276354207,NL +3276354208,3276354223,DE +3276354224,3276354255,NL +3276354256,3276354263,DE +3276354264,3276354327,NL +3276354328,3276354335,DE +3276354336,3276354343,NL +3276354344,3276354351,DE +3276354352,3276354415,NL +3276354416,3276354423,DE +3276354424,3276354623,NL +3276354624,3276354639,DE +3276354640,3276354647,NL +3276354648,3276354655,DE +3276354656,3276354735,NL +3276354736,3276354743,DE +3276354744,3276354831,NL +3276354832,3276354847,DE +3276354848,3276354855,NL +3276354856,3276354879,DE +3276354880,3276354887,NL +3276354888,3276354895,DE +3276354896,3276354903,NL +3276354904,3276354911,DE +3276354912,3276354967,NL +3276354968,3276354975,DE +3276354976,3276354999,NL +3276355000,3276355007,DE +3276355008,3276355063,NL +3276355064,3276355071,DE +3276355072,3276355183,NL +3276355184,3276355191,DE +3276355192,3276355263,NL +3276355264,3276355271,DE +3276355272,3276355367,NL +3276355368,3276355383,DE +3276355384,3276355399,NL +3276355400,3276355407,DE +3276355408,3276355439,NL +3276355440,3276355447,DE +3276355448,3276355543,NL +3276355544,3276355559,DE +3276355560,3276355647,NL +3276355648,3276355655,DE +3276355656,3276355663,NL +3276355664,3276355671,DE +3276355672,3276355783,NL +3276355784,3276355791,DE +3276355792,3276355847,NL +3276355848,3276355855,DE +3276355856,3276356063,NL +3276356064,3276356071,DE +3276356072,3276356135,NL +3276356136,3276356143,DE +3276356144,3276356207,NL +3276356208,3276356215,DE +3276356216,3276356279,NL +3276356280,3276356295,DE +3276356296,3276356311,NL +3276356312,3276356319,DE +3276356320,3276356351,NL 3276356352,3276356607,DE -3276356608,3276356967,NL -3276356968,3276356975,DE -3276356976,3276358599,NL -3276358600,3276358607,DE -3276358608,3276358751,NL -3276358752,3276358759,DE -3276358760,3276358943,NL -3276358944,3276358951,DE -3276358952,3276359759,NL -3276359760,3276359767,DE -3276359768,3276359903,NL -3276359904,3276359919,DE -3276359920,3276360535,NL -3276360536,3276360543,DE -3276360544,3276360687,NL -3276360688,3276360695,DE -3276360696,3276360831,NL -3276360832,3276360839,DE -3276360840,3276362239,NL -3276362240,3276362247,DE -3276362248,3276363335,NL +3276356608,3276356623,NL +3276356624,3276356631,DE +3276356632,3276356647,NL +3276356648,3276356655,DE +3276356656,3276356775,NL +3276356776,3276356783,DE +3276356784,3276356799,NL +3276356800,3276356807,DE +3276356808,3276356911,NL +3276356912,3276356927,DE +3276356928,3276356935,NL +3276356936,3276356943,DE +3276356944,3276357015,NL +3276357016,3276357023,DE +3276357024,3276357175,NL +3276357176,3276357183,DE +3276357184,3276357279,NL +3276357280,3276357287,DE +3276357288,3276357295,NL +3276357296,3276357303,DE +3276357304,3276357319,NL +3276357320,3276357327,DE +3276357328,3276357343,NL +3276357344,3276357351,DE +3276357352,3276357383,NL +3276357384,3276357391,DE +3276357392,3276357415,NL +3276357416,3276357423,DE +3276357424,3276357447,NL +3276357448,3276357455,DE +3276357456,3276357503,NL +3276357504,3276357519,DE +3276357520,3276357543,NL +3276357544,3276357551,DE +3276357552,3276357655,NL +3276357656,3276357663,DE +3276357664,3276357671,NL +3276357672,3276357679,DE +3276357680,3276357783,NL +3276357784,3276357791,DE +3276357792,3276357831,NL +3276357832,3276357847,DE +3276357848,3276357903,NL +3276357904,3276357911,DE +3276357912,3276357927,NL +3276357928,3276357935,DE +3276357936,3276358111,NL +3276358112,3276358127,DE +3276358128,3276358199,NL +3276358200,3276358207,DE +3276358208,3276358215,NL +3276358216,3276358223,DE +3276358224,3276358239,NL +3276358240,3276358247,DE +3276358248,3276358279,NL +3276358280,3276358295,DE +3276358296,3276358335,NL +3276358336,3276358343,DE +3276358344,3276358471,NL +3276358472,3276358479,DE +3276358480,3276358495,NL +3276358496,3276358503,DE +3276358504,3276358591,NL +3276358592,3276358599,DE +3276358600,3276358607,NL +3276358608,3276358615,DE +3276358616,3276358631,NL +3276358632,3276358647,DE +3276358648,3276358743,NL +3276358744,3276358759,DE +3276358760,3276358775,NL +3276358776,3276358783,DE +3276358784,3276358791,NL +3276358792,3276358807,DE +3276358808,3276358903,NL +3276358904,3276358911,DE +3276358912,3276358927,NL +3276358928,3276358935,DE +3276358936,3276358951,NL +3276358952,3276358959,DE +3276358960,3276359047,NL +3276359048,3276359055,DE +3276359056,3276359135,NL +3276359136,3276359143,DE +3276359144,3276359167,NL +3276359168,3276359175,DE +3276359176,3276359383,NL +3276359384,3276359391,DE +3276359392,3276359439,NL +3276359440,3276359447,DE +3276359448,3276359511,NL +3276359512,3276359519,DE +3276359520,3276359607,NL +3276359608,3276359615,DE +3276359616,3276359703,NL +3276359704,3276359711,DE +3276359712,3276359727,NL +3276359728,3276359735,DE +3276359736,3276359751,NL +3276359752,3276359759,DE +3276359760,3276359767,NL +3276359768,3276359775,DE +3276359776,3276359783,NL +3276359784,3276359791,DE +3276359792,3276359807,NL +3276359808,3276359815,DE +3276359816,3276359839,NL +3276359840,3276359847,DE +3276359848,3276359919,NL +3276359920,3276359927,DE +3276359928,3276360007,NL +3276360008,3276360015,DE +3276360016,3276360055,NL +3276360056,3276360063,DE +3276360064,3276360087,NL +3276360088,3276360095,DE +3276360096,3276360111,NL +3276360112,3276360119,DE +3276360120,3276360175,NL +3276360176,3276360183,DE +3276360184,3276360199,NL +3276360200,3276360207,DE +3276360208,3276360223,NL +3276360224,3276360239,DE +3276360240,3276360271,NL +3276360272,3276360279,DE +3276360280,3276360327,NL +3276360328,3276360335,DE +3276360336,3276360351,NL +3276360352,3276360359,DE +3276360360,3276360375,NL +3276360376,3276360383,DE +3276360384,3276360399,NL +3276360400,3276360407,DE +3276360408,3276360495,NL +3276360496,3276360503,DE +3276360504,3276360519,NL +3276360520,3276360527,DE +3276360528,3276360559,NL +3276360560,3276360567,DE +3276360568,3276360583,NL +3276360584,3276360591,DE +3276360592,3276360615,NL +3276360616,3276360623,DE +3276360624,3276360687,NL +3276360688,3276360703,DE +3276360704,3276360743,NL +3276360744,3276360751,DE +3276360752,3276360847,NL +3276360848,3276360863,DE +3276360864,3276360999,NL +3276361000,3276361007,DE +3276361008,3276361015,NL +3276361016,3276361023,DE +3276361024,3276361063,NL +3276361064,3276361071,DE +3276361072,3276361239,NL +3276361240,3276361247,DE +3276361248,3276361255,NL +3276361256,3276361271,DE +3276361272,3276361303,NL +3276361304,3276361311,DE +3276361312,3276361343,NL +3276361344,3276361351,DE +3276361352,3276361383,NL +3276361384,3276361391,DE +3276361392,3276361399,NL +3276361400,3276361407,DE +3276361408,3276361519,NL +3276361520,3276361527,DE +3276361528,3276361599,NL +3276361600,3276361607,DE +3276361608,3276361655,NL +3276361656,3276361663,DE +3276361664,3276361679,NL +3276361680,3276361687,DE +3276361688,3276361751,NL +3276361752,3276361767,DE +3276361768,3276361999,NL +3276362000,3276362007,DE +3276362008,3276362047,NL +3276362048,3276362055,DE +3276362056,3276362071,NL +3276362072,3276362079,DE +3276362080,3276362143,NL +3276362144,3276362151,DE +3276362152,3276362311,NL +3276362312,3276362319,DE +3276362320,3276362599,NL +3276362600,3276362607,DE +3276362608,3276362695,NL +3276362696,3276362703,DE +3276362704,3276362759,NL +3276362760,3276362767,DE +3276362768,3276362775,NL +3276362776,3276362783,DE +3276362784,3276362791,NL +3276362792,3276362799,DE +3276362800,3276362967,NL +3276362968,3276362975,DE +3276362976,3276362983,NL +3276362984,3276362991,DE +3276362992,3276363047,NL +3276363048,3276363055,DE +3276363056,3276363071,NL +3276363072,3276363079,DE +3276363080,3276363223,NL +3276363224,3276363231,DE +3276363232,3276363295,NL +3276363296,3276363303,DE +3276363304,3276363335,NL 3276363336,3276363343,DE 3276363344,3276363375,NL 3276363376,3276363383,DE -3276363384,3276363647,NL -3276363648,3276363655,DE -3276363656,3276363807,NL -3276363808,3276363815,DE -3276363816,3276364103,NL -3276364104,3276364111,DE -3276364112,3276364503,NL -3276364504,3276364511,DE -3276364512,3276365999,NL +3276363384,3276363503,NL +3276363504,3276363511,DE +3276363512,3276363583,NL +3276363584,3276363591,DE +3276363592,3276363607,NL +3276363608,3276363615,DE +3276363616,3276363623,NL +3276363624,3276363631,DE +3276363632,3276363655,NL +3276363656,3276363679,DE +3276363680,3276363703,NL +3276363704,3276363711,DE +3276363712,3276363823,NL +3276363824,3276363831,DE +3276363832,3276363855,NL +3276363856,3276363863,DE +3276363864,3276363951,NL +3276363952,3276363967,DE +3276363968,3276363975,NL +3276363976,3276363991,DE +3276363992,3276364183,NL +3276364184,3276364191,DE +3276364192,3276364295,NL +3276364296,3276364303,DE +3276364304,3276364311,NL +3276364312,3276364319,DE +3276364320,3276364383,NL +3276364384,3276364391,DE +3276364392,3276364431,NL +3276364432,3276364439,DE +3276364440,3276364543,NL +3276364544,3276364551,DE +3276364552,3276364639,NL +3276364640,3276364655,DE +3276364656,3276364807,NL +3276364808,3276364815,DE +3276364816,3276364855,NL +3276364856,3276364863,DE +3276364864,3276364935,NL +3276364936,3276364943,DE +3276364944,3276364959,NL +3276364960,3276364967,DE +3276364968,3276364991,NL +3276364992,3276365007,DE +3276365008,3276365215,NL +3276365216,3276365223,DE +3276365224,3276365247,NL +3276365248,3276365255,DE +3276365256,3276365303,NL +3276365304,3276365311,DE +3276365312,3276365327,NL +3276365328,3276365335,DE +3276365336,3276365375,NL +3276365376,3276365391,DE +3276365392,3276365415,NL +3276365416,3276365423,DE +3276365424,3276365495,NL +3276365496,3276365519,DE +3276365520,3276365543,NL +3276365544,3276365551,DE +3276365552,3276365623,NL +3276365624,3276365631,DE +3276365632,3276365647,NL +3276365648,3276365655,DE +3276365656,3276365743,NL +3276365744,3276365751,DE +3276365752,3276365999,NL 3276366000,3276366007,DE -3276366008,3276366023,NL -3276366024,3276366031,DE -3276366032,3276366095,NL -3276366096,3276366103,DE -3276366104,3276367239,NL -3276367240,3276367247,DE -3276367248,3276367839,NL -3276367840,3276367847,DE -3276367848,3276367967,NL -3276367968,3276367975,DE -3276367976,3276367983,NL -3276367984,3276367991,DE -3276367992,3276368015,NL -3276368016,3276368031,DE -3276368032,3276368111,NL -3276368112,3276368119,DE -3276368120,3276368303,NL -3276368304,3276368311,DE -3276368312,3276368679,NL -3276368680,3276368687,DE -3276368688,3276369167,NL -3276369168,3276369175,DE -3276369176,3276370463,NL -3276370464,3276370471,DE -3276370472,3276371783,NL -3276371784,3276371799,DE -3276371800,3276371959,NL -3276371960,3276371967,DE -3276371968,3276372903,NL -3276372904,3276372911,DE -3276372912,3276373119,NL +3276366008,3276366039,NL +3276366040,3276366047,DE +3276366048,3276366055,NL +3276366056,3276366063,DE +3276366064,3276366119,NL +3276366120,3276366127,DE +3276366128,3276366143,NL +3276366144,3276366151,DE +3276366152,3276366255,NL +3276366256,3276366263,DE +3276366264,3276366319,NL +3276366320,3276366335,DE +3276366336,3276366455,NL +3276366456,3276366471,DE +3276366472,3276366591,NL +3276366592,3276366599,DE +3276366600,3276366639,NL +3276366640,3276366647,DE +3276366648,3276366679,NL +3276366680,3276366695,DE +3276366696,3276366727,NL +3276366728,3276366735,DE +3276366736,3276366751,NL +3276366752,3276366767,DE +3276366768,3276366775,NL +3276366776,3276366783,DE +3276366784,3276366855,NL +3276366856,3276366863,DE +3276366864,3276366887,NL +3276366888,3276366895,DE +3276366896,3276366919,NL +3276366920,3276366927,DE +3276366928,3276367063,NL +3276367064,3276367071,DE +3276367072,3276367079,NL +3276367080,3276367087,DE +3276367088,3276367119,NL +3276367120,3276367127,DE +3276367128,3276367159,NL +3276367160,3276367175,DE +3276367176,3276367271,NL +3276367272,3276367279,DE +3276367280,3276367455,NL +3276367456,3276367463,DE +3276367464,3276367607,NL +3276367608,3276367615,DE +3276367616,3276367623,NL +3276367624,3276367631,DE +3276367632,3276367679,NL +3276367680,3276367687,DE +3276367688,3276367711,NL +3276367712,3276367719,DE +3276367720,3276367743,NL +3276367744,3276367751,DE +3276367752,3276367783,NL +3276367784,3276367791,DE +3276367792,3276367855,NL +3276367856,3276367863,DE +3276367864,3276368079,NL +3276368080,3276368087,DE +3276368088,3276368103,NL +3276368104,3276368111,DE +3276368112,3276368191,NL +3276368192,3276368199,DE +3276368200,3276368271,NL +3276368272,3276368279,DE +3276368280,3276368343,NL +3276368344,3276368351,DE +3276368352,3276368431,NL +3276368432,3276368439,DE +3276368440,3276368527,NL +3276368528,3276368535,DE +3276368536,3276368615,NL +3276368616,3276368623,DE +3276368624,3276368631,NL +3276368632,3276368639,DE +3276368640,3276368655,NL +3276368656,3276368663,DE +3276368664,3276368703,NL +3276368704,3276368711,DE +3276368712,3276368727,NL +3276368728,3276368735,DE +3276368736,3276368751,NL +3276368752,3276368759,DE +3276368760,3276368815,NL +3276368816,3276368823,DE +3276368824,3276368871,NL +3276368872,3276368879,DE +3276368880,3276369031,NL +3276369032,3276369047,DE +3276369048,3276369079,NL +3276369080,3276369087,DE +3276369088,3276369167,NL +3276369168,3276369183,DE +3276369184,3276369263,NL +3276369264,3276369271,DE +3276369272,3276369431,NL +3276369432,3276369439,DE +3276369440,3276369527,NL +3276369528,3276369543,DE +3276369544,3276369551,NL +3276369552,3276369559,DE +3276369560,3276369599,NL +3276369600,3276369607,DE +3276369608,3276369623,NL +3276369624,3276369631,DE +3276369632,3276369639,NL +3276369640,3276369647,DE +3276369648,3276369703,NL +3276369704,3276369711,DE +3276369712,3276369735,NL +3276369736,3276369743,DE +3276369744,3276369751,NL +3276369752,3276369759,DE +3276369760,3276369855,NL +3276369856,3276369863,DE +3276369864,3276369871,NL +3276369872,3276369879,DE +3276369880,3276369919,NL +3276369920,3276369927,DE +3276369928,3276369999,NL +3276370000,3276370015,DE +3276370016,3276370063,NL +3276370064,3276370071,DE +3276370072,3276370119,NL +3276370120,3276370143,DE +3276370144,3276370183,NL +3276370184,3276370191,DE +3276370192,3276370335,NL +3276370336,3276370343,DE +3276370344,3276370375,NL +3276370376,3276370383,DE +3276370384,3276370551,NL +3276370552,3276370567,DE +3276370568,3276370599,NL +3276370600,3276370607,DE +3276370608,3276370831,NL +3276370832,3276370839,DE +3276370840,3276370919,NL +3276370920,3276370927,DE +3276370928,3276370959,NL +3276370960,3276370967,DE +3276370968,3276370999,NL +3276371000,3276371007,DE +3276371008,3276371039,NL +3276371040,3276371055,DE +3276371056,3276371167,NL +3276371168,3276371175,DE +3276371176,3276371239,NL +3276371240,3276371247,DE +3276371248,3276371255,NL +3276371256,3276371271,DE +3276371272,3276371327,NL +3276371328,3276371335,DE +3276371336,3276371343,NL +3276371344,3276371351,DE +3276371352,3276371367,NL +3276371368,3276371375,DE +3276371376,3276371407,NL +3276371408,3276371415,DE +3276371416,3276371431,NL +3276371432,3276371439,DE +3276371440,3276371455,NL +3276371456,3276371463,DE +3276371464,3276371511,NL +3276371512,3276371527,DE +3276371528,3276371727,NL +3276371728,3276371735,DE +3276371736,3276371815,NL +3276371816,3276371823,DE +3276371824,3276371831,NL +3276371832,3276371839,DE +3276371840,3276371863,NL +3276371864,3276371871,DE +3276371872,3276371879,NL +3276371880,3276371887,DE +3276371888,3276371903,NL +3276371904,3276371911,DE +3276371912,3276371951,NL +3276371952,3276371959,DE +3276371960,3276372023,NL +3276372024,3276372031,DE +3276372032,3276372095,NL +3276372096,3276372111,DE +3276372112,3276372135,NL +3276372136,3276372143,DE +3276372144,3276372303,NL +3276372304,3276372311,DE +3276372312,3276372343,NL +3276372344,3276372351,DE +3276372352,3276372679,NL +3276372680,3276372687,DE +3276372688,3276372807,NL +3276372808,3276372815,DE +3276372816,3276372911,NL +3276372912,3276372919,DE +3276372920,3276372943,NL +3276372944,3276372951,DE +3276372952,3276373015,NL +3276373016,3276373023,DE +3276373024,3276373039,NL +3276373040,3276373047,DE +3276373048,3276373063,NL +3276373064,3276373071,DE +3276373072,3276373119,NL 3276373120,3276373127,DE -3276373128,3276373487,NL -3276373488,3276373495,DE -3276373496,3276373599,NL -3276373600,3276373607,DE -3276373608,3276374079,NL -3276374080,3276374087,DE -3276374088,3276375367,NL -3276375368,3276375375,DE -3276375376,3276375751,NL -3276375752,3276375759,DE -3276375760,3276377687,NL +3276373128,3276373167,NL +3276373168,3276373175,DE +3276373176,3276373207,NL +3276373208,3276373215,DE +3276373216,3276373223,NL +3276373224,3276373231,DE +3276373232,3276373343,NL +3276373344,3276373351,DE +3276373352,3276373431,NL +3276373432,3276373439,DE +3276373440,3276373447,NL +3276373448,3276373455,DE +3276373456,3276373519,NL +3276373520,3276373527,DE +3276373528,3276373551,NL +3276373552,3276373559,DE +3276373560,3276373727,NL +3276373728,3276373735,DE +3276373736,3276373751,NL +3276373752,3276373759,DE +3276373760,3276373863,NL +3276373864,3276373871,DE +3276373872,3276373911,NL +3276373912,3276373919,DE +3276373920,3276373927,NL +3276373928,3276373943,DE +3276373944,3276374063,NL +3276374064,3276374071,DE +3276374072,3276374143,NL +3276374144,3276374151,DE +3276374152,3276374159,NL +3276374160,3276374167,DE +3276374168,3276374327,NL +3276374328,3276374335,DE +3276374336,3276374399,NL +3276374400,3276374407,DE +3276374408,3276374439,NL +3276374440,3276374447,DE +3276374448,3276374479,NL +3276374480,3276374487,DE +3276374488,3276374527,NL +3276374528,3276374535,DE +3276374536,3276374575,NL +3276374576,3276374583,DE +3276374584,3276374679,NL +3276374680,3276374687,DE +3276374688,3276374703,NL +3276374704,3276374711,DE +3276374712,3276374727,NL +3276374728,3276374735,DE +3276374736,3276374751,NL +3276374752,3276374767,DE +3276374768,3276374775,NL +3276374776,3276374783,DE +3276374784,3276374807,NL +3276374808,3276374815,DE +3276374816,3276374823,NL +3276374824,3276374831,DE +3276374832,3276374999,NL +3276375000,3276375007,DE +3276375008,3276375103,NL +3276375104,3276375119,DE +3276375120,3276375183,NL +3276375184,3276375191,DE +3276375192,3276375223,NL +3276375224,3276375231,DE +3276375232,3276375335,NL +3276375336,3276375359,DE +3276375360,3276375423,NL +3276375424,3276375439,DE +3276375440,3276375607,NL +3276375608,3276375615,DE +3276375616,3276375679,NL +3276375680,3276375687,DE +3276375688,3276375727,NL +3276375728,3276375735,DE +3276375736,3276375783,NL +3276375784,3276375791,DE +3276375792,3276375911,NL +3276375912,3276375919,DE +3276375920,3276376015,NL +3276376016,3276376023,DE +3276376024,3276376055,NL +3276376056,3276376063,DE +3276376064,3276376095,NL +3276376096,3276376103,DE +3276376104,3276376143,NL +3276376144,3276376151,DE +3276376152,3276376191,NL +3276376192,3276376199,DE +3276376200,3276376311,NL +3276376312,3276376319,DE +3276376320,3276376359,NL +3276376360,3276376367,DE +3276376368,3276376375,NL +3276376376,3276376383,DE +3276376384,3276376471,NL +3276376472,3276376479,DE +3276376480,3276376503,NL +3276376504,3276376511,DE +3276376512,3276376599,NL +3276376600,3276376607,DE +3276376608,3276376679,NL +3276376680,3276376687,DE +3276376688,3276376767,NL +3276376768,3276376775,DE +3276376776,3276376871,NL +3276376872,3276376879,DE +3276376880,3276376927,NL +3276376928,3276376935,DE +3276376936,3276377031,NL +3276377032,3276377039,DE +3276377040,3276377087,NL +3276377088,3276377095,DE +3276377096,3276377335,NL +3276377336,3276377351,DE +3276377352,3276377359,NL +3276377360,3276377367,DE +3276377368,3276377407,NL +3276377408,3276377415,DE +3276377416,3276377447,NL +3276377448,3276377455,DE +3276377456,3276377631,NL +3276377632,3276377639,DE +3276377640,3276377687,NL 3276377688,3276377695,DE -3276377696,3276378575,NL -3276378576,3276378583,DE -3276378584,3276380071,NL -3276380072,3276380079,DE -3276380080,3276380703,NL -3276380704,3276380711,DE -3276380712,3276380743,NL -3276380744,3276380751,DE -3276380752,3276381215,NL -3276381216,3276381223,DE -3276381224,3276381607,NL +3276377696,3276377807,NL +3276377808,3276377815,DE +3276377816,3276377831,NL +3276377832,3276377847,DE +3276377848,3276377887,NL +3276377888,3276377895,DE +3276377896,3276377983,NL +3276377984,3276377991,DE +3276377992,3276378063,NL +3276378064,3276378071,DE +3276378072,3276378103,NL +3276378104,3276378111,DE +3276378112,3276378143,NL +3276378144,3276378151,DE +3276378152,3276378231,NL +3276378232,3276378239,DE +3276378240,3276378311,NL +3276378312,3276378319,DE +3276378320,3276378351,NL +3276378352,3276378359,DE +3276378360,3276378567,NL +3276378568,3276378591,DE +3276378592,3276378607,NL +3276378608,3276378615,DE +3276378616,3276378631,NL +3276378632,3276378639,DE +3276378640,3276378735,NL +3276378736,3276378743,DE +3276378744,3276378839,NL +3276378840,3276378847,DE +3276378848,3276378871,NL +3276378872,3276378879,DE +3276378880,3276378911,NL +3276378912,3276378919,DE +3276378920,3276378935,NL +3276378936,3276378943,DE +3276378944,3276378951,NL +3276378952,3276378959,DE +3276378960,3276378983,NL +3276378984,3276378991,DE +3276378992,3276379047,NL +3276379048,3276379055,DE +3276379056,3276379071,NL +3276379072,3276379079,DE +3276379080,3276379167,NL +3276379168,3276379175,DE +3276379176,3276379215,NL +3276379216,3276379223,DE +3276379224,3276379279,NL +3276379280,3276379287,DE +3276379288,3276379295,NL +3276379296,3276379303,DE +3276379304,3276379463,NL +3276379464,3276379471,DE +3276379472,3276379503,NL +3276379504,3276379511,DE +3276379512,3276379583,NL +3276379584,3276379591,DE +3276379592,3276379607,NL +3276379608,3276379615,DE +3276379616,3276379703,NL +3276379704,3276379711,DE +3276379712,3276379727,NL +3276379728,3276379735,DE +3276379736,3276379767,NL +3276379768,3276379775,DE +3276379776,3276379815,NL +3276379816,3276379823,DE +3276379824,3276379943,NL +3276379944,3276379951,DE +3276379952,3276379959,NL +3276379960,3276379967,DE +3276379968,3276380023,NL +3276380024,3276380031,DE +3276380032,3276380199,NL +3276380200,3276380215,DE +3276380216,3276380295,NL +3276380296,3276380303,DE +3276380304,3276380351,NL +3276380352,3276380359,DE +3276380360,3276380471,NL +3276380472,3276380479,DE +3276380480,3276380687,NL +3276380688,3276380695,DE +3276380696,3276380879,NL +3276380880,3276380887,DE +3276380888,3276380919,NL +3276380920,3276380927,DE +3276380928,3276381103,NL +3276381104,3276381111,DE +3276381112,3276381127,NL +3276381128,3276381135,DE +3276381136,3276381167,NL +3276381168,3276381175,DE +3276381176,3276381247,NL +3276381248,3276381263,DE +3276381264,3276381279,NL +3276381280,3276381287,DE +3276381288,3276381295,NL +3276381296,3276381303,DE +3276381304,3276381311,NL +3276381312,3276381319,DE +3276381320,3276381327,NL +3276381328,3276381335,DE +3276381336,3276381359,NL +3276381360,3276381367,DE +3276381368,3276381415,NL +3276381416,3276381431,DE +3276381432,3276381583,NL +3276381584,3276381599,DE +3276381600,3276381607,NL 3276381608,3276381615,DE -3276381616,3276381895,NL -3276381896,3276381903,DE -3276381904,3276381999,NL -3276382000,3276382007,DE -3276382008,3276382951,NL -3276382952,3276382959,DE -3276382960,3276385071,NL -3276385072,3276385079,DE -3276385080,3276385335,NL -3276385336,3276385343,DE -3276385344,3276385951,NL -3276385952,3276385959,DE -3276385960,3276386063,NL -3276386064,3276386071,DE -3276386072,3276386079,NL -3276386080,3276386087,DE -3276386088,3276386199,NL +3276381616,3276381671,NL +3276381672,3276381679,DE +3276381680,3276381775,NL +3276381776,3276381783,DE +3276381784,3276381967,NL +3276381968,3276381975,DE +3276381976,3276382055,NL +3276382056,3276382063,DE +3276382064,3276382103,NL +3276382104,3276382111,DE +3276382112,3276382119,NL +3276382120,3276382135,DE +3276382136,3276382175,NL +3276382176,3276382183,DE +3276382184,3276382287,NL +3276382288,3276382295,DE +3276382296,3276382383,NL +3276382384,3276382399,DE +3276382400,3276382495,NL +3276382496,3276382511,DE +3276382512,3276382575,NL +3276382576,3276382583,DE +3276382584,3276382663,NL +3276382664,3276382671,DE +3276382672,3276382711,NL +3276382712,3276382719,DE +3276382720,3276382863,NL +3276382864,3276382871,DE +3276382872,3276382887,NL +3276382888,3276382895,DE +3276382896,3276383039,NL +3276383040,3276383047,DE +3276383048,3276383063,NL +3276383064,3276383071,DE +3276383072,3276383079,NL +3276383080,3276383087,DE +3276383088,3276383095,NL +3276383096,3276383111,DE +3276383112,3276383119,NL +3276383120,3276383127,DE +3276383128,3276383207,NL +3276383208,3276383215,DE +3276383216,3276383247,NL +3276383248,3276383255,DE +3276383256,3276383311,NL +3276383312,3276383327,DE +3276383328,3276383359,NL +3276383360,3276383367,DE +3276383368,3276383479,NL +3276383480,3276383487,DE +3276383488,3276383527,NL +3276383528,3276383559,DE +3276383560,3276383615,NL +3276383616,3276383623,DE +3276383624,3276383671,NL +3276383672,3276383687,DE +3276383688,3276383703,NL +3276383704,3276383711,DE +3276383712,3276383783,NL +3276383784,3276383791,DE +3276383792,3276383887,NL +3276383888,3276383895,DE +3276383896,3276384063,NL +3276384064,3276384071,DE +3276384072,3276384111,NL +3276384112,3276384119,DE +3276384120,3276384199,NL +3276384200,3276384207,DE +3276384208,3276384263,NL +3276384264,3276384271,DE +3276384272,3276384279,NL +3276384280,3276384287,DE +3276384288,3276384335,NL +3276384336,3276384343,DE +3276384344,3276384367,NL +3276384368,3276384375,DE +3276384376,3276384383,NL +3276384384,3276384391,DE +3276384392,3276384399,NL +3276384400,3276384407,DE +3276384408,3276384415,NL +3276384416,3276384423,DE +3276384424,3276384439,NL +3276384440,3276384447,DE +3276384448,3276384551,NL +3276384552,3276384559,DE +3276384560,3276384567,NL +3276384568,3276384575,DE +3276384576,3276384647,NL +3276384648,3276384655,DE +3276384656,3276384727,NL +3276384728,3276384735,DE +3276384736,3276384823,NL +3276384824,3276384839,DE +3276384840,3276384879,NL +3276384880,3276384887,DE +3276384888,3276384895,NL +3276384896,3276384903,DE +3276384904,3276385031,NL +3276385032,3276385039,DE +3276385040,3276385047,NL +3276385048,3276385055,DE +3276385056,3276385079,NL +3276385080,3276385087,DE +3276385088,3276385111,NL +3276385112,3276385119,DE +3276385120,3276385135,NL +3276385136,3276385143,DE +3276385144,3276385175,NL +3276385176,3276385183,DE +3276385184,3276385191,NL +3276385192,3276385199,DE +3276385200,3276385215,NL +3276385216,3276385223,DE +3276385224,3276385247,NL +3276385248,3276385255,DE +3276385256,3276385295,NL +3276385296,3276385303,DE +3276385304,3276385383,NL +3276385384,3276385399,DE +3276385400,3276385575,NL +3276385576,3276385583,DE +3276385584,3276385679,NL +3276385680,3276385687,DE +3276385688,3276385695,NL +3276385696,3276385703,DE +3276385704,3276385751,NL +3276385752,3276385759,DE +3276385760,3276385799,NL +3276385800,3276385807,DE +3276385808,3276385903,NL +3276385904,3276385911,DE +3276385912,3276385919,NL +3276385920,3276385927,DE +3276385928,3276385935,NL +3276385936,3276385943,DE +3276385944,3276385959,NL +3276385960,3276385967,DE +3276385968,3276386047,NL +3276386048,3276386055,DE +3276386056,3276386087,NL +3276386088,3276386095,DE +3276386096,3276386199,NL 3276386200,3276386207,DE -3276386208,3276386351,NL -3276386352,3276386359,DE -3276386360,3276386775,NL -3276386776,3276386783,DE -3276386784,3276387071,NL +3276386208,3276386231,NL +3276386232,3276386239,DE +3276386240,3276386359,NL +3276386360,3276386367,DE +3276386368,3276386375,NL +3276386376,3276386383,DE +3276386384,3276386399,NL +3276386400,3276386407,DE +3276386408,3276386415,NL +3276386416,3276386423,DE +3276386424,3276386431,NL +3276386432,3276386439,DE +3276386440,3276386503,NL +3276386504,3276386511,DE +3276386512,3276386559,NL +3276386560,3276386567,DE +3276386568,3276386575,NL +3276386576,3276386583,DE +3276386584,3276386599,NL +3276386600,3276386607,DE +3276386608,3276386615,NL +3276386616,3276386623,DE +3276386624,3276386655,NL +3276386656,3276386663,DE +3276386664,3276386727,NL +3276386728,3276386735,DE +3276386736,3276386743,NL +3276386744,3276386751,DE +3276386752,3276386759,NL +3276386760,3276386767,DE +3276386768,3276386831,NL +3276386832,3276386839,DE +3276386840,3276386847,NL +3276386848,3276386855,DE +3276386856,3276386863,NL +3276386864,3276386871,DE +3276386872,3276386879,NL +3276386880,3276386887,DE +3276386888,3276386895,NL +3276386896,3276386903,DE +3276386904,3276386927,NL +3276386928,3276386935,DE +3276386936,3276386951,NL +3276386952,3276386959,DE +3276386960,3276386975,NL +3276386976,3276386983,DE +3276386984,3276387007,NL +3276387008,3276387015,DE +3276387016,3276387071,NL 3276387072,3276387079,DE -3276387080,3276388439,NL -3276388440,3276388447,DE -3276388448,3276388583,NL -3276388584,3276388591,DE -3276388592,3276388823,NL -3276388824,3276388831,DE -3276388832,3276389247,NL -3276389248,3276389255,DE -3276389256,3276389439,NL -3276389440,3276389447,DE -3276389448,3276389647,NL -3276389648,3276389655,DE -3276389656,3276391927,NL -3276391928,3276391935,DE -3276391936,3276392263,NL -3276392264,3276392271,DE -3276392272,3276392623,NL -3276392624,3276392631,DE -3276392632,3276392735,NL -3276392736,3276392743,DE -3276392744,3276393455,NL -3276393456,3276393463,DE -3276393464,3276396295,NL -3276396296,3276396303,DE -3276396304,3276396655,NL +3276387080,3276387199,NL +3276387200,3276387207,DE +3276387208,3276387231,NL +3276387232,3276387239,DE +3276387240,3276387247,NL +3276387248,3276387255,DE +3276387256,3276387263,NL +3276387264,3276387271,DE +3276387272,3276387311,NL +3276387312,3276387319,DE +3276387320,3276387383,NL +3276387384,3276387391,DE +3276387392,3276387399,NL +3276387400,3276387415,DE +3276387416,3276387423,NL +3276387424,3276387431,DE +3276387432,3276387439,NL +3276387440,3276387455,DE +3276387456,3276387471,NL +3276387472,3276387487,DE +3276387488,3276387511,NL +3276387512,3276387519,DE +3276387520,3276387559,NL +3276387560,3276387567,DE +3276387568,3276387575,NL +3276387576,3276387591,DE +3276387592,3276387599,NL +3276387600,3276387615,DE +3276387616,3276387639,NL +3276387640,3276387647,DE +3276387648,3276387671,NL +3276387672,3276387679,DE +3276387680,3276387887,NL +3276387888,3276387895,DE +3276387896,3276387911,NL +3276387912,3276387927,DE +3276387928,3276387983,NL +3276387984,3276387991,DE +3276387992,3276388015,NL +3276388016,3276388023,DE +3276388024,3276388191,NL +3276388192,3276388199,DE +3276388200,3276388207,NL +3276388208,3276388215,DE +3276388216,3276388223,NL +3276388224,3276388231,DE +3276388232,3276388239,NL +3276388240,3276388255,DE +3276388256,3276388279,NL +3276388280,3276388287,DE +3276388288,3276388303,NL +3276388304,3276388311,DE +3276388312,3276388319,NL +3276388320,3276388327,DE +3276388328,3276388375,NL +3276388376,3276388383,DE +3276388384,3276388519,NL +3276388520,3276388527,DE +3276388528,3276388783,NL +3276388784,3276388791,DE +3276388792,3276388815,NL +3276388816,3276388831,DE +3276388832,3276388879,NL +3276388880,3276388887,DE +3276388888,3276388975,NL +3276388976,3276388983,DE +3276388984,3276389055,NL +3276389056,3276389063,DE +3276389064,3276389159,NL +3276389160,3276389167,DE +3276389168,3276389199,NL +3276389200,3276389207,DE +3276389208,3276389231,NL +3276389232,3276389239,DE +3276389240,3276389303,NL +3276389304,3276389311,DE +3276389312,3276389335,NL +3276389336,3276389343,DE +3276389344,3276389351,NL +3276389352,3276389359,DE +3276389360,3276389391,NL +3276389392,3276389399,DE +3276389400,3276389407,NL +3276389408,3276389415,DE +3276389416,3276389431,NL +3276389432,3276389439,DE +3276389440,3276389447,NL +3276389448,3276389455,DE +3276389456,3276389575,NL +3276389576,3276389607,DE +3276389608,3276389615,NL +3276389616,3276389623,DE +3276389624,3276389695,NL +3276389696,3276389703,DE +3276389704,3276389711,NL +3276389712,3276389727,DE +3276389728,3276389791,NL +3276389792,3276389815,DE +3276389816,3276389887,NL +3276389888,3276389903,DE +3276389904,3276389951,NL +3276389952,3276389967,DE +3276389968,3276390231,NL +3276390232,3276390239,DE +3276390240,3276390295,NL +3276390296,3276390303,DE +3276390304,3276390351,NL +3276390352,3276390359,DE +3276390360,3276390383,NL +3276390384,3276390391,DE +3276390392,3276390407,NL +3276390408,3276390423,DE +3276390424,3276390431,NL +3276390432,3276390439,DE +3276390440,3276390463,NL +3276390464,3276390471,DE +3276390472,3276390527,NL +3276390528,3276390535,DE +3276390536,3276390591,NL +3276390592,3276390599,DE +3276390600,3276390687,NL +3276390688,3276390695,DE +3276390696,3276390711,NL +3276390712,3276390719,DE +3276390720,3276390727,NL +3276390728,3276390735,DE +3276390736,3276390807,NL +3276390808,3276390815,DE +3276390816,3276390911,NL +3276390912,3276390919,DE +3276390920,3276390927,NL +3276390928,3276390943,DE +3276390944,3276390959,NL +3276390960,3276390967,DE +3276390968,3276390983,NL +3276390984,3276390991,DE +3276390992,3276391023,NL +3276391024,3276391047,DE +3276391048,3276391111,NL +3276391112,3276391119,DE +3276391120,3276391191,NL +3276391192,3276391207,DE +3276391208,3276391215,NL +3276391216,3276391223,DE +3276391224,3276391343,NL +3276391344,3276391351,DE +3276391352,3276391407,NL +3276391408,3276391415,DE +3276391416,3276391439,NL +3276391440,3276391447,DE +3276391448,3276391495,NL +3276391496,3276391503,DE +3276391504,3276391535,NL +3276391536,3276391543,DE +3276391544,3276391591,NL +3276391592,3276391599,DE +3276391600,3276391719,NL +3276391720,3276391727,DE +3276391728,3276391791,NL +3276391792,3276391799,DE +3276391800,3276391815,NL +3276391816,3276391823,DE +3276391824,3276391895,NL +3276391896,3276391903,DE +3276391904,3276391935,NL +3276391936,3276391943,DE +3276391944,3276392079,NL +3276392080,3276392087,DE +3276392088,3276392119,NL +3276392120,3276392127,DE +3276392128,3276392143,NL +3276392144,3276392151,DE +3276392152,3276392239,NL +3276392240,3276392247,DE +3276392248,3276392255,NL +3276392256,3276392263,DE +3276392264,3276392279,NL +3276392280,3276392287,DE +3276392288,3276392319,NL +3276392320,3276392327,DE +3276392328,3276392351,NL +3276392352,3276392359,DE +3276392360,3276392423,NL +3276392424,3276392431,DE +3276392432,3276392519,NL +3276392520,3276392527,DE +3276392528,3276392615,NL +3276392616,3276392631,DE +3276392632,3276392679,NL +3276392680,3276392687,DE +3276392688,3276392751,NL +3276392752,3276392759,DE +3276392760,3276392903,NL +3276392904,3276392911,DE +3276392912,3276392935,NL +3276392936,3276392943,DE +3276392944,3276392959,NL +3276392960,3276392967,DE +3276392968,3276392991,NL +3276392992,3276392999,DE +3276393000,3276393007,NL +3276393008,3276393023,DE +3276393024,3276393159,NL +3276393160,3276393167,DE +3276393168,3276393399,NL +3276393400,3276393407,DE +3276393408,3276393423,NL +3276393424,3276393431,DE +3276393432,3276393447,NL +3276393448,3276393455,DE +3276393456,3276393463,NL +3276393464,3276393479,DE +3276393480,3276393511,NL +3276393512,3276393519,DE +3276393520,3276393599,NL +3276393600,3276393615,DE +3276393616,3276393695,NL +3276393696,3276393703,DE +3276393704,3276393783,NL +3276393784,3276393791,DE +3276393792,3276393799,NL +3276393800,3276393815,DE +3276393816,3276393823,NL +3276393824,3276393831,DE +3276393832,3276393871,NL +3276393872,3276393879,DE +3276393880,3276393903,NL +3276393904,3276393911,DE +3276393912,3276393983,NL +3276393984,3276393999,DE +3276394000,3276394015,NL +3276394016,3276394023,DE +3276394024,3276394063,NL +3276394064,3276394071,DE +3276394072,3276394191,NL +3276394192,3276394199,DE +3276394200,3276394215,NL +3276394216,3276394223,DE +3276394224,3276394279,NL +3276394280,3276394287,DE +3276394288,3276394327,NL +3276394328,3276394335,DE +3276394336,3276394351,NL +3276394352,3276394359,DE +3276394360,3276394471,NL +3276394472,3276394487,DE +3276394488,3276394495,NL +3276394496,3276394511,DE +3276394512,3276394575,NL +3276394576,3276394591,DE +3276394592,3276394671,NL +3276394672,3276394687,DE +3276394688,3276394695,NL +3276394696,3276394703,DE +3276394704,3276394775,NL +3276394776,3276394783,DE +3276394784,3276394815,NL +3276394816,3276394823,DE +3276394824,3276394871,NL +3276394872,3276394879,DE +3276394880,3276394919,NL +3276394920,3276394927,DE +3276394928,3276394951,NL +3276394952,3276394959,DE +3276394960,3276395047,NL +3276395048,3276395055,DE +3276395056,3276395063,NL +3276395064,3276395071,DE +3276395072,3276395095,NL +3276395096,3276395103,DE +3276395104,3276395175,NL +3276395176,3276395183,DE +3276395184,3276395191,NL +3276395192,3276395199,DE +3276395200,3276395295,NL +3276395296,3276395303,DE +3276395304,3276395319,NL +3276395320,3276395327,DE +3276395328,3276395423,NL +3276395424,3276395439,DE +3276395440,3276395487,NL +3276395488,3276395495,DE +3276395496,3276395543,NL +3276395544,3276395551,DE +3276395552,3276395567,NL +3276395568,3276395575,DE +3276395576,3276395599,NL +3276395600,3276395607,DE +3276395608,3276395647,NL +3276395648,3276395655,DE +3276395656,3276395687,NL +3276395688,3276395695,DE +3276395696,3276395743,NL +3276395744,3276395751,DE +3276395752,3276395759,NL +3276395760,3276395767,DE +3276395768,3276395807,NL +3276395808,3276395815,DE +3276395816,3276395831,NL +3276395832,3276395839,DE +3276395840,3276395871,NL +3276395872,3276395879,DE +3276395880,3276395959,NL +3276395960,3276395975,DE +3276395976,3276396007,NL +3276396008,3276396023,DE +3276396024,3276396047,NL +3276396048,3276396055,DE +3276396056,3276396095,NL +3276396096,3276396103,DE +3276396104,3276396111,NL +3276396112,3276396119,DE +3276396120,3276396207,NL +3276396208,3276396223,DE +3276396224,3276396287,NL +3276396288,3276396295,DE +3276396296,3276396319,NL +3276396320,3276396327,DE +3276396328,3276396351,NL +3276396352,3276396359,DE +3276396360,3276396399,NL +3276396400,3276396415,DE +3276396416,3276396431,NL +3276396432,3276396439,DE +3276396440,3276396471,NL +3276396472,3276396495,DE +3276396496,3276396527,NL +3276396528,3276396535,DE +3276396536,3276396583,NL +3276396584,3276396591,DE +3276396592,3276396599,NL +3276396600,3276396607,DE +3276396608,3276396615,NL +3276396616,3276396623,DE +3276396624,3276396655,NL 3276396656,3276396663,DE -3276396664,3276396695,NL -3276396696,3276396703,DE -3276396704,3276396847,NL -3276396848,3276396855,DE -3276396856,3276397095,NL -3276397096,3276397103,DE -3276397104,3276397599,NL -3276397600,3276397607,DE -3276397608,3276399015,NL +3276396664,3276396719,NL +3276396720,3276396735,DE +3276396736,3276396751,NL +3276396752,3276396767,DE +3276396768,3276396783,NL +3276396784,3276396791,DE +3276396792,3276396991,NL +3276396992,3276397007,DE +3276397008,3276397031,NL +3276397032,3276397039,DE +3276397040,3276397055,NL +3276397056,3276397063,DE +3276397064,3276397215,NL +3276397216,3276397223,DE +3276397224,3276397327,NL +3276397328,3276397335,DE +3276397336,3276397343,NL +3276397344,3276397351,DE +3276397352,3276397479,NL +3276397480,3276397487,DE +3276397488,3276397535,NL +3276397536,3276397543,DE +3276397544,3276397559,NL +3276397560,3276397567,DE +3276397568,3276397743,NL +3276397744,3276397751,DE +3276397752,3276397791,NL +3276397792,3276397815,DE +3276397816,3276397871,NL +3276397872,3276397879,DE +3276397880,3276397895,NL +3276397896,3276397911,DE +3276397912,3276397935,NL +3276397936,3276397943,DE +3276397944,3276397967,NL +3276397968,3276397975,DE +3276397976,3276397983,NL +3276397984,3276397991,DE +3276397992,3276398047,NL +3276398048,3276398055,DE +3276398056,3276398071,NL +3276398072,3276398079,DE +3276398080,3276398199,NL +3276398200,3276398207,DE +3276398208,3276398255,NL +3276398256,3276398271,DE +3276398272,3276398287,NL +3276398288,3276398295,DE +3276398296,3276398311,NL +3276398312,3276398319,DE +3276398320,3276398351,NL +3276398352,3276398359,DE +3276398360,3276398367,NL +3276398368,3276398375,DE +3276398376,3276398423,NL +3276398424,3276398447,DE +3276398448,3276398455,NL +3276398456,3276398463,DE +3276398464,3276398511,NL +3276398512,3276398519,DE +3276398520,3276398559,NL +3276398560,3276398567,DE +3276398568,3276398575,NL +3276398576,3276398583,DE +3276398584,3276398591,NL +3276398592,3276398607,DE +3276398608,3276398623,NL +3276398624,3276398631,DE +3276398632,3276398679,NL +3276398680,3276398687,DE +3276398688,3276398783,NL +3276398784,3276398807,DE +3276398808,3276398839,NL +3276398840,3276398855,DE +3276398856,3276398927,NL +3276398928,3276398935,DE +3276398936,3276398959,NL +3276398960,3276398967,DE +3276398968,3276398983,NL +3276398984,3276398991,DE +3276398992,3276399015,NL 3276399016,3276399023,DE -3276399024,3276400519,NL -3276400520,3276400527,DE -3276400528,3276400735,NL -3276400736,3276400743,DE -3276400744,3276401895,NL -3276401896,3276401903,DE -3276401904,3276402167,NL -3276402168,3276402175,DE -3276402176,3276403399,NL +3276399024,3276399031,NL +3276399032,3276399039,DE +3276399040,3276399079,NL +3276399080,3276399087,DE +3276399088,3276399191,NL +3276399192,3276399199,DE +3276399200,3276399279,NL +3276399280,3276399287,DE +3276399288,3276399319,NL +3276399320,3276399327,DE +3276399328,3276399495,NL +3276399496,3276399503,DE +3276399504,3276399511,NL +3276399512,3276399519,DE +3276399520,3276399527,NL +3276399528,3276399535,DE +3276399536,3276399583,NL +3276399584,3276399615,DE +3276399616,3276399679,NL +3276399680,3276399687,DE +3276399688,3276399807,NL +3276399808,3276399823,DE +3276399824,3276399895,NL +3276399896,3276399903,DE +3276399904,3276399935,NL +3276399936,3276399951,DE +3276399952,3276399983,NL +3276399984,3276399991,DE +3276399992,3276400007,NL +3276400008,3276400015,DE +3276400016,3276400023,NL +3276400024,3276400031,DE +3276400032,3276400087,NL +3276400088,3276400095,DE +3276400096,3276400151,NL +3276400152,3276400159,DE +3276400160,3276400223,NL +3276400224,3276400231,DE +3276400232,3276400239,NL +3276400240,3276400247,DE +3276400248,3276400295,NL +3276400296,3276400303,DE +3276400304,3276400343,NL +3276400344,3276400351,DE +3276400352,3276400487,NL +3276400488,3276400495,DE +3276400496,3276400503,NL +3276400504,3276400519,DE +3276400520,3276400527,NL +3276400528,3276400535,DE +3276400536,3276400543,NL +3276400544,3276400551,DE +3276400552,3276400639,NL +3276400640,3276400647,DE +3276400648,3276400839,NL +3276400840,3276400847,DE +3276400848,3276400855,NL +3276400856,3276400863,DE +3276400864,3276400895,NL +3276400896,3276400911,DE +3276400912,3276401023,NL +3276401024,3276401031,DE +3276401032,3276401063,NL +3276401064,3276401071,DE +3276401072,3276401087,NL +3276401088,3276401095,DE +3276401096,3276401111,NL +3276401112,3276401119,DE +3276401120,3276401167,NL +3276401168,3276401175,DE +3276401176,3276401215,NL +3276401216,3276401223,DE +3276401224,3276401239,NL +3276401240,3276401247,DE +3276401248,3276401279,NL +3276401280,3276401287,DE +3276401288,3276401327,NL +3276401328,3276401335,DE +3276401336,3276401391,NL +3276401392,3276401399,DE +3276401400,3276401455,NL +3276401456,3276401463,DE +3276401464,3276401535,NL +3276401536,3276401543,DE +3276401544,3276401583,NL +3276401584,3276401591,DE +3276401592,3276401615,NL +3276401616,3276401623,DE +3276401624,3276401703,NL +3276401704,3276401711,DE +3276401712,3276401727,NL +3276401728,3276401735,DE +3276401736,3276401743,NL +3276401744,3276401759,DE +3276401760,3276401775,NL +3276401776,3276401783,DE +3276401784,3276401855,NL +3276401856,3276401863,DE +3276401864,3276401919,NL +3276401920,3276401927,DE +3276401928,3276401943,NL +3276401944,3276401959,DE +3276401960,3276401975,NL +3276401976,3276401983,DE +3276401984,3276401991,NL +3276401992,3276402007,DE +3276402008,3276402055,NL +3276402056,3276402063,DE +3276402064,3276402271,NL +3276402272,3276402279,DE +3276402280,3276402303,NL +3276402304,3276402311,DE +3276402312,3276402327,NL +3276402328,3276402351,DE +3276402352,3276402383,NL +3276402384,3276402391,DE +3276402392,3276402415,NL +3276402416,3276402423,DE +3276402424,3276402439,NL +3276402440,3276402447,DE +3276402448,3276402503,NL +3276402504,3276402511,DE +3276402512,3276402519,NL +3276402520,3276402527,DE +3276402528,3276402591,NL +3276402592,3276402599,DE +3276402600,3276402607,NL +3276402608,3276402615,DE +3276402616,3276402639,NL +3276402640,3276402647,DE +3276402648,3276402655,NL +3276402656,3276402671,DE +3276402672,3276402711,NL +3276402712,3276402719,DE +3276402720,3276402735,NL +3276402736,3276402743,DE +3276402744,3276402759,NL +3276402760,3276402767,DE +3276402768,3276402783,NL +3276402784,3276402791,DE +3276402792,3276402847,NL +3276402848,3276402855,DE +3276402856,3276402959,NL +3276402960,3276402967,DE +3276402968,3276402975,NL +3276402976,3276402983,DE +3276402984,3276403007,NL +3276403008,3276403015,DE +3276403016,3276403023,NL +3276403024,3276403031,DE +3276403032,3276403047,NL +3276403048,3276403055,DE +3276403056,3276403135,NL +3276403136,3276403143,DE +3276403144,3276403151,NL +3276403152,3276403159,DE +3276403160,3276403167,NL +3276403168,3276403191,DE +3276403192,3276403239,NL +3276403240,3276403247,DE +3276403248,3276403271,NL +3276403272,3276403279,DE +3276403280,3276403287,NL +3276403288,3276403295,DE +3276403296,3276403343,NL +3276403344,3276403351,DE +3276403352,3276403367,NL +3276403368,3276403375,DE +3276403376,3276403399,NL 3276403400,3276403407,DE -3276403408,3276403599,NL -3276403600,3276403607,DE -3276403608,3276403671,NL -3276403672,3276403679,DE -3276403680,3276404103,NL -3276404104,3276404111,DE -3276404112,3276405015,NL -3276405016,3276405023,DE -3276405024,3276406783,NL +3276403408,3276403479,NL +3276403480,3276403487,DE +3276403488,3276403495,NL +3276403496,3276403503,DE +3276403504,3276403511,NL +3276403512,3276403519,DE +3276403520,3276403527,NL +3276403528,3276403535,DE +3276403536,3276403567,NL +3276403568,3276403583,DE +3276403584,3276403679,NL +3276403680,3276403687,DE +3276403688,3276403799,NL +3276403800,3276403807,DE +3276403808,3276403839,NL +3276403840,3276403847,DE +3276403848,3276403967,NL +3276403968,3276403975,DE +3276403976,3276403983,NL +3276403984,3276403991,DE +3276403992,3276404023,NL +3276404024,3276404031,DE +3276404032,3276404047,NL +3276404048,3276404055,DE +3276404056,3276404079,NL +3276404080,3276404087,DE +3276404088,3276404119,NL +3276404120,3276404127,DE +3276404128,3276404399,NL +3276404400,3276404407,DE +3276404408,3276404447,NL +3276404448,3276404455,DE +3276404456,3276404479,NL +3276404480,3276404487,DE +3276404488,3276404639,NL +3276404640,3276404647,DE +3276404648,3276404719,NL +3276404720,3276404743,DE +3276404744,3276404903,NL +3276404904,3276404911,DE +3276404912,3276404935,NL +3276404936,3276404943,DE +3276404944,3276405023,NL +3276405024,3276405031,DE +3276405032,3276405063,NL +3276405064,3276405079,DE +3276405080,3276405263,NL +3276405264,3276405271,DE +3276405272,3276405327,NL +3276405328,3276405335,DE +3276405336,3276405391,NL +3276405392,3276405399,DE +3276405400,3276405679,NL +3276405680,3276405687,DE +3276405688,3276405719,NL +3276405720,3276405735,DE +3276405736,3276405759,NL +3276405760,3276405767,DE +3276405768,3276405775,NL +3276405776,3276405783,DE +3276405784,3276405943,NL +3276405944,3276405951,DE +3276405952,3276406159,NL +3276406160,3276406167,DE +3276406168,3276406175,NL +3276406176,3276406183,DE +3276406184,3276406207,NL +3276406208,3276406215,DE +3276406216,3276406287,NL +3276406288,3276406295,DE +3276406296,3276406375,NL +3276406376,3276406383,DE +3276406384,3276406407,NL +3276406408,3276406415,DE +3276406416,3276406511,NL +3276406512,3276406519,DE +3276406520,3276406559,NL +3276406560,3276406567,DE +3276406568,3276406639,NL +3276406640,3276406647,DE +3276406648,3276406759,NL +3276406760,3276406767,DE +3276406768,3276406783,NL 3276406784,3276414975,FI 3276414976,3276415999,DK 3276416000,3276417023,SE @@ -49444,7 +82685,8 @@ 3276419072,3276420095,PL 3276420096,3276421119,GB 3276421120,3276422143,PL -3276422144,3276423167,GB +3276422144,3276422655,GB +3276422656,3276423167,RU 3276423168,3276423423,PL 3276423424,3276423679,NL 3276423680,3276423935,SE @@ -49466,7 +82708,8 @@ 3276428032,3276428287,GB 3276428288,3276428543,RU 3276428544,3276428799,BG -3276428800,3276429311,DE +3276428800,3276429055,DE +3276429056,3276429311,NL 3276429312,3276430079,RU 3276430080,3276430591,PL 3276430592,3276430847,GB @@ -49474,247 +82717,434 @@ 3276431104,3276431359,RU 3276431360,3276447743,GB 3276447744,3276451583,DE +3276451584,3276455935,EU 3276455936,3276464127,BE 3276464128,3276472319,GR +3276472320,3276472575,EU 3276472576,3276472831,AT +3276472832,3276472863,EU 3276472864,3276472895,AT -3276473088,3276473111,AT +3276472896,3276473103,EU +3276473104,3276473111,AT +3276473112,3276473119,EU 3276473120,3276473135,AT +3276473136,3276473143,EU 3276473144,3276473199,AT -3276473216,3276473311,AT +3276473200,3276473215,EU +3276473216,3276473279,AT +3276473280,3276473295,EU +3276473296,3276473311,AT +3276473312,3276473343,EU 3276473344,3276473855,AT -3276474176,3276474207,AT -3276474224,3276474239,AT -3276474272,3276474303,AT +3276473856,3276474271,EU +3276474272,3276474295,AT +3276474296,3276474319,EU 3276474320,3276474367,AT -3276474624,3276474879,GB -3276475008,3276475391,IT -3276475904,3276476095,IT -3276476112,3276476119,GB +3276474368,3276475015,EU +3276475016,3276475063,IT +3276475064,3276475071,EU +3276475072,3276475135,IT +3276475136,3276475903,EU +3276475904,3276475951,IT +3276475952,3276475983,EU +3276475984,3276476039,IT +3276476040,3276476047,EU +3276476048,3276476111,IT +3276476112,3276476119,EU 3276476120,3276476159,IT -3276476160,3276476287,GB -3276476288,3276476415,IT +3276476160,3276476415,EU 3276476416,3276476671,CH -3276477440,3276477967,CH -3276477976,3276477983,CH -3276478304,3276478311,CH +3276476672,3276477439,EU +3276477440,3276477983,CH +3276477984,3276478319,EU 3276478320,3276478335,CH -3276478464,3276479023,FR -3276479040,3276479167,FR +3276478336,3276478463,EU +3276478464,3276479127,FR +3276479128,3276479135,EU +3276479136,3276479167,FR +3276479168,3276479199,EU 3276479200,3276479215,FR +3276479216,3276479223,EU 3276479224,3276479343,FR -3276479344,3276479351,GB +3276479344,3276479351,EU 3276479352,3276479615,FR +3276479616,3276479647,EU 3276479648,3276479743,FR -3276480000,3276480031,FR -3276480064,3276480095,FR -3276480112,3276480127,FR -3276480144,3276480263,FR +3276479744,3276480015,EU +3276480016,3276480095,FR +3276480096,3276480111,EU +3276480112,3276480159,FR +3276480160,3276480191,EU +3276480192,3276480271,FR +3276480272,3276480287,EU +3276480288,3276480295,FR +3276480296,3276480303,EU 3276480304,3276480319,FR -3276480352,3276480479,FR -3276480496,3276480511,FR +3276480320,3276480351,EU +3276480352,3276480375,FR +3276480376,3276480399,EU +3276480400,3276480439,FR +3276480440,3276480455,EU +3276480456,3276480479,FR +3276480480,3276480511,EU 3276480512,3276480767,RU +3276480768,3276481023,EU 3276481024,3276481535,RU +3276481536,3276482559,EU 3276482560,3276482815,GR +3276482816,3276483071,EU 3276483072,3276483359,GR +3276483360,3276483391,EU 3276483392,3276483519,GR +3276483520,3276483583,EU 3276483584,3276483711,GR +3276483712,3276483839,EU 3276483840,3276484351,GR +3276484352,3276484383,EU 3276484384,3276484479,GR +3276484480,3276484607,EU 3276484608,3276484863,SK +3276484864,3276485631,EU 3276485632,3276486655,GB +3276486656,3276486911,EU 3276486912,3276487167,GR +3276487168,3276488959,EU 3276488960,3276489215,CZ +3276489216,3276490751,EU 3276490752,3276491263,NL 3276491264,3276491327,CZ +3276491328,3276491391,EU 3276491392,3276491775,CZ 3276491776,3276491847,GB -3276491856,3276491903,GB -3276491968,3276492095,GB -3276492288,3276492295,GB -3276492304,3276492351,GB -3276492360,3276492423,GB -3276492432,3276492543,GB -3276492800,3276493183,GB +3276491848,3276491855,EU +3276491856,3276492055,GB +3276492056,3276492063,EU +3276492064,3276492127,GB +3276492128,3276492143,EU +3276492144,3276492151,GB +3276492152,3276492287,EU +3276492288,3276492487,GB +3276492488,3276492495,EU +3276492496,3276493215,GB +3276493216,3276493247,EU 3276493248,3276494383,GB -3276494416,3276494463,GB -3276494472,3276494559,GB -3276494592,3276495487,GB -3276495496,3276495543,GB -3276495552,3276495679,GB -3276495712,3276495743,GB -3276495776,3276495823,GB -3276495832,3276496639,GB -3276496640,3276497151,DE -3276497216,3276497295,DE -3276497304,3276497375,DE -3276497408,3276497567,DE -3276497584,3276497599,DE -3276497616,3276497919,DE -3276497920,3276498431,GB +3276494384,3276494415,EU +3276494416,3276495503,GB +3276495504,3276495519,EU +3276495520,3276495679,GB +3276495680,3276495775,EU +3276495776,3276496639,GB +3276496640,3276496895,EU +3276496896,3276497151,DE +3276497152,3276497215,EU +3276497216,3276497279,DE +3276497280,3276497295,EU +3276497296,3276497311,DE +3276497312,3276497343,EU +3276497344,3276497375,DE +3276497376,3276497407,EU +3276497408,3276497599,DE +3276497600,3276497607,EU +3276497608,3276497647,DE +3276497648,3276497663,EU +3276497664,3276497919,DE +3276497920,3276498047,GB +3276498048,3276498303,EU +3276498304,3276498311,GB +3276498312,3276498319,EU +3276498320,3276498431,GB 3276498432,3276499199,DE +3276499200,3276499455,EU 3276499456,3276499503,DE -3276499512,3276499615,DE -3276499680,3276499695,DE -3276499712,3276499759,DE -3276499760,3276499775,GB -3276499776,3276499815,DE -3276499824,3276499839,DE -3276499872,3276499903,DE +3276499504,3276499519,EU +3276499520,3276499615,DE +3276499616,3276499679,EU +3276499680,3276499759,DE +3276499760,3276499775,EU +3276499776,3276499791,DE +3276499792,3276499799,EU +3276499800,3276499815,DE +3276499816,3276499935,EU 3276499936,3276499999,DE 3276500000,3276500031,CH 3276500032,3276500095,DE +3276500096,3276500127,EU 3276500128,3276500159,DE +3276500160,3276500479,EU 3276500480,3276500735,DE +3276500736,3276500991,EU 3276500992,3276501023,DE 3276501024,3276501055,FR -3276501056,3276501087,DE -3276501120,3276501175,DE +3276501056,3276501119,EU +3276501120,3276501167,DE +3276501168,3276501247,EU 3276501248,3276501503,DE +3276501504,3276502271,EU 3276502272,3276505087,DE -3276505088,3276505599,ZA -3276505856,3276505919,ZA -3276505984,3276506079,ZA -3276506096,3276506191,ZA -3276506208,3276507135,ZA +3276505088,3276505231,ZA +3276505232,3276505247,EU +3276505248,3276505599,ZA +3276505600,3276505855,EU +3276505856,3276505887,ZA +3276505888,3276505903,EU +3276505904,3276505919,ZA +3276505920,3276505983,EU +3276505984,3276506047,ZA +3276506048,3276506071,EU +3276506072,3276506079,ZA +3276506080,3276506095,EU +3276506096,3276506159,ZA +3276506160,3276506175,EU +3276506176,3276506191,ZA +3276506192,3276506207,EU +3276506208,3276506367,ZA +3276506368,3276506623,EU +3276506624,3276507135,ZA 3276507136,3276507231,CH +3276507232,3276507391,EU 3276507392,3276507647,CH +3276507648,3276508159,EU 3276508160,3276508327,GB +3276508328,3276508351,EU 3276508352,3276508415,FR 3276508416,3276508671,GB -3276508680,3276509183,GB +3276508672,3276508679,EU +3276508680,3276508927,GB +3276508928,3276509183,EU 3276509184,3276510207,IT +3276510208,3276510719,EU 3276510720,3276510735,IT -3276510784,3276510847,IT +3276510736,3276510783,EU +3276510784,3276510815,IT +3276510816,3276510847,EU 3276510848,3276510911,GB +3276510912,3276511487,EU 3276511488,3276511775,ZA -3276511808,3276511839,ZA -3276511872,3276511951,ZA -3276511968,3276512223,ZA +3276511776,3276511823,EU +3276511824,3276511839,ZA +3276511840,3276511871,EU +3276511872,3276511919,ZA +3276511920,3276511935,EU +3276511936,3276511951,ZA +3276511952,3276511967,EU +3276511968,3276512191,ZA +3276512192,3276512199,EU +3276512200,3276512207,ZA +3276512208,3276512255,EU 3276512256,3276513023,ZA -3276513536,3276513599,CH +3276513024,3276513535,EU +3276513536,3276513551,CH +3276513552,3276513559,EU +3276513560,3276513567,CH +3276513568,3276514335,EU 3276514336,3276514367,CH +3276514368,3276514559,EU 3276514560,3276514815,CH +3276514816,3276515327,EU 3276515328,3276515583,ES +3276515584,3276517375,EU 3276517376,3276517503,NL +3276517504,3276517631,EU 3276517632,3276517647,NL +3276517648,3276517655,EU 3276517656,3276517759,NL -3276517792,3276517823,NL -3276517832,3276517887,NL +3276517760,3276517791,EU +3276517792,3276517887,NL +3276517888,3276517903,EU 3276517904,3276517951,NL +3276517952,3276518015,EU 3276518016,3276518023,NL +3276518024,3276518055,EU 3276518056,3276518063,NL -3276518072,3276518095,NL -3276518112,3276518175,NL -3276518184,3276518271,NL +3276518064,3276518095,EU +3276518096,3276518111,NL +3276518112,3276518127,EU +3276518128,3276518175,NL +3276518176,3276518183,EU +3276518184,3276518191,NL +3276518192,3276518207,EU +3276518208,3276518271,NL +3276518272,3276518303,EU 3276518304,3276518335,NL -3276518352,3276518367,NL -3276518400,3276518655,BE +3276518336,3276518399,EU +3276518400,3276518527,BE +3276518528,3276518591,EU +3276518592,3276518655,BE +3276518656,3276518911,EU 3276518912,3276519423,BE -3276519424,3276520191,DK -3276520200,3276520223,BE +3276519424,3276519679,EU +3276519680,3276520191,DK +3276520192,3276520223,BE 3276520224,3276520255,GB 3276520256,3276520415,BE +3276520416,3276520431,EU 3276520432,3276520447,BE -3276520448,3276520599,SE -3276520608,3276520735,SE -3276520784,3276520815,SE +3276520448,3276520463,EU +3276520464,3276520591,SE +3276520592,3276520607,EU +3276520608,3276520623,SE +3276520624,3276520639,EU +3276520640,3276520703,SE +3276520704,3276520767,EU +3276520768,3276520815,SE +3276520816,3276520831,EU 3276520832,3276520927,SE -3276520936,3276521215,SE +3276520928,3276520943,EU +3276520944,3276521215,SE +3276521216,3276521983,EU 3276521984,3276523519,NL -3276523776,3276523911,NO +3276523520,3276523791,EU +3276523792,3276523911,NO +3276523912,3276523927,EU 3276523928,3276523951,NO +3276523952,3276523967,EU 3276523968,3276524031,NO +3276524032,3276524063,EU 3276524064,3276524095,TR -3276524160,3276524279,TR +3276524096,3276524191,EU +3276524192,3276524279,TR +3276524280,3276524543,EU 3276524544,3276524799,GB -3276524800,3276524823,PT -3276524832,3276524847,PT -3276525024,3276525039,PT +3276524800,3276524855,PT +3276524856,3276525039,EU +3276525040,3276525055,PT 3276525056,3276525311,FI -3276525512,3276525519,HR +3276525312,3276525503,EU +3276525504,3276525527,HR 3276525528,3276525535,PL 3276525536,3276525567,HR -3276526080,3276526095,CH -3276526104,3276526111,CH -3276526144,3276526175,CH +3276525568,3276526079,EU +3276526080,3276526111,CH +3276526112,3276526143,EU +3276526144,3276526159,CH +3276526160,3276526335,EU 3276526336,3276526591,CH +3276526592,3276527103,EU 3276527104,3276527135,SI -3276527144,3276527159,SI +3276527136,3276527167,EU 3276527168,3276527199,SI +3276527200,3276527215,EU 3276527216,3276527231,SI +3276527232,3276527359,EU 3276527360,3276527615,SI 3276527616,3276527743,PK +3276527744,3276527871,EU 3276527872,3276527999,PK +3276528000,3276528127,EU 3276528128,3276528223,BE 3276528224,3276528239,GB 3276528240,3276528247,BE 3276528248,3276528255,GB 3276528256,3276528351,BE +3276528352,3276528359,GB +3276528360,3276528367,FR 3276528368,3276528399,BE +3276528400,3276528447,EU 3276528448,3276528503,BE -3276528520,3276528527,GB -3276528544,3276528567,BE -3276528576,3276528671,BE -3276528688,3276528719,BE -3276528720,3276528727,FR +3276528504,3276528559,EU +3276528560,3276528567,BE +3276528568,3276528575,EU +3276528576,3276528719,BE +3276528720,3276528727,EU 3276528728,3276528799,BE 3276528800,3276528815,GB -3276528816,3276528831,FR +3276528816,3276528831,EU 3276528832,3276528895,BE -3276528896,3276529151,IE +3276528896,3276528903,IE +3276528904,3276528911,EU +3276528912,3276528927,IE +3276528928,3276528935,EU +3276528936,3276528943,IE +3276528944,3276528959,EU +3276528960,3276529151,IE 3276529152,3276529167,TR +3276529168,3276529183,EU 3276529184,3276529279,TR -3276529328,3276529375,TR +3276529280,3276529327,EU +3276529328,3276529351,TR +3276529352,3276529359,EU +3276529360,3276529375,TR +3276529376,3276529391,EU 3276529392,3276529407,TR -3276529664,3276530495,NL +3276529408,3276529663,EU +3276529664,3276530455,NL +3276530456,3276530463,EU +3276530464,3276530495,NL +3276530496,3276530559,EU 3276530560,3276532735,NL -3276532736,3276532767,TR -3276532776,3276532791,TR +3276532736,3276532775,TR +3276532776,3276532783,EU +3276532784,3276532791,TR +3276532792,3276532855,EU 3276532856,3276532991,TR 3276532992,3276533023,HU -3276533056,3276533063,HU +3276533024,3276533071,EU 3276533072,3276533087,HU -3276533104,3276533183,HU -3276533248,3276533391,TR -3276533760,3276533775,IE +3276533088,3276533119,EU +3276533120,3276533183,HU +3276533184,3276533247,EU +3276533248,3276533375,TR +3276533376,3276533775,EU 3276533776,3276533791,GB +3276533792,3276533823,EU 3276533824,3276533887,IE -3276533920,3276534015,IE -3276534016,3276534271,NL -3276534272,3276534415,GB +3276533888,3276533919,EU +3276533920,3276533951,IE +3276533952,3276533983,EU +3276533984,3276534015,IE +3276534016,3276534399,EU +3276534400,3276534415,GB 3276534416,3276534431,NL 3276534432,3276534463,GB 3276534464,3276534495,FR -3276534512,3276534591,NL -3276534608,3276534671,NL +3276534496,3276534543,EU +3276534544,3276534591,NL +3276534592,3276534623,EU +3276534624,3276534671,NL +3276534672,3276534687,EU 3276534688,3276534719,NL +3276534720,3276534783,EU 3276534784,3276534879,NL +3276534880,3276534887,EU 3276534888,3276534895,NL -3276534928,3276534975,NL -3276534992,3276535007,NL +3276534896,3276534911,EU +3276534912,3276534919,NL +3276534920,3276535015,EU 3276535016,3276535039,GB 3276535040,3276535063,RU 3276535064,3276535071,LV 3276535072,3276535103,RU -3276535296,3276535311,FI -3276535320,3276535327,FI +3276535104,3276535311,EU +3276535312,3276535319,FI +3276535320,3276535335,EU 3276535336,3276535359,FI -3276535368,3276535423,FI +3276535360,3276535375,EU +3276535376,3276535423,FI +3276535424,3276535551,EU 3276535552,3276535807,PK 3276535808,3276536063,FI +3276536064,3276536319,EU 3276536320,3276536415,ES +3276536416,3276536447,EU 3276536448,3276536511,ES +3276536512,3276536583,EU 3276536584,3276536591,HR +3276536592,3276536639,EU 3276536640,3276536671,HU +3276536672,3276536687,EU 3276536688,3276536711,HU -3276536720,3276536743,HU +3276536712,3276536735,EU +3276536736,3276536743,HU +3276536744,3276536863,EU 3276536864,3276536895,ES -3276536928,3276536959,ES +3276536896,3276536967,EU 3276536968,3276536991,ES +3276536992,3276537151,EU 3276537152,3276537215,AT +3276537216,3276537343,EU 3276537344,3276537599,AT 3276537600,3276537663,GR +3276537664,3276537855,EU 3276537856,3276668927,ES 3276668928,3276677119,MC 3276677120,3276678143,HR @@ -49728,7 +83158,8 @@ 3276681728,3276682239,BE 3276682240,3276682751,AT 3276682752,3276683263,GB -3276683264,3276684799,UA +3276683264,3276684287,UA +3276684288,3276684799,RU 3276684800,3276685311,DE 3276685312,3276685823,RO 3276685824,3276686335,PL @@ -49745,11 +83176,23 @@ 3276691968,3276692479,RU 3276692480,3276692991,UA 3276692992,3276693503,GB -3276693504,3276701695,FR +3276693504,3276694015,UA +3276694016,3276694527,AT +3276694528,3276695039,UA +3276695040,3276695551,RU +3276695552,3276696063,UA +3276696064,3276696575,RO +3276696576,3276697087,EU +3276697088,3276697599,GB +3276697600,3276698111,UA +3276698112,3276699647,RU +3276700160,3276700671,KZ +3276700672,3276701183,RO +3276701184,3276701695,RU 3276701696,3276709887,SE 3276709888,3276718079,DE 3276718080,3276726271,IT -3276726272,3276727295,DE +3276726272,3276727295,PK 3276727296,3276728319,ES 3276728320,3276729343,UA 3276729344,3276730367,PL @@ -49761,16 +83204,19 @@ 3276734736,3276734751,DK 3276734752,3276734815,AT 3276734816,3276734847,DE +3276734848,3276734879,EU 3276734880,3276734895,GB 3276734896,3276734911,NL 3276734912,3276734943,FR 3276734944,3276735455,AT 3276735456,3276735487,NL 3276735488,3276735871,AT +3276735872,3276735935,EU 3276735936,3276735999,ES 3276736000,3276736511,AT 3276736512,3276736575,IT 3276736576,3276736735,GB +3276736736,3276736767,EU 3276736768,3276736799,IT 3276736800,3276736815,DE 3276736816,3276736831,CZ @@ -49799,11 +83245,14 @@ 3276738144,3276738175,IT 3276738176,3276738559,GB 3276738560,3276738847,CH +3276738848,3276739071,EU 3276739072,3276739151,CH +3276739152,3276739167,EU 3276739168,3276740127,CH 3276740128,3276740167,GB 3276740168,3276740175,DE 3276740176,3276740191,NL +3276740192,3276740223,EU 3276740224,3276740351,CH 3276740352,3276740703,FR 3276740704,3276740719,IT @@ -49813,6 +83262,7 @@ 3276740816,3276740831,SK 3276740832,3276740863,DE 3276740864,3276741375,FR +3276741376,3276741631,EU 3276741632,3276742655,FR 3276742656,3276742735,RU 3276742736,3276742751,NL @@ -49822,6 +83272,7 @@ 3276743072,3276743103,DE 3276743104,3276743135,HU 3276743136,3276743167,NL +3276743168,3276743423,EU 3276743424,3276743903,AT 3276743904,3276743935,BE 3276743936,3276744191,AT @@ -49832,7 +83283,9 @@ 3276745296,3276745311,NL 3276745312,3276745343,DK 3276745344,3276745407,DE -3276745408,3276745727,DK +3276745408,3276745655,DK +3276745656,3276745663,EU +3276745664,3276745727,DK 3276745728,3276746047,GB 3276746048,3276746111,DE 3276746112,3276746239,IT @@ -49848,6 +83301,7 @@ 3276749024,3276749055,IT 3276749056,3276749087,AT 3276749088,3276749103,FR +3276749104,3276749119,EU 3276749120,3276749183,NL 3276749184,3276749311,DE 3276749312,3276749343,BE @@ -49859,12 +83313,14 @@ 3276750176,3276750207,BE 3276750208,3276750335,FR 3276750336,3276750431,GB +3276750432,3276750463,EU 3276750464,3276751039,GB 3276751040,3276751071,FR 3276751072,3276751087,GB 3276751088,3276751103,NL 3276751104,3276751175,GB 3276751176,3276751199,SE +3276751200,3276751231,EU 3276751232,3276751295,IL 3276751296,3276751359,AT 3276751360,3276753055,GB @@ -49896,7 +83352,9 @@ 3276757120,3276757135,NO 3276757136,3276757151,NL 3276757152,3276757183,GB +3276757184,3276757247,EU 3276757248,3276757503,GB +3276757504,3276757759,EU 3276757760,3276757823,GB 3276757824,3276757839,DE 3276757840,3276757855,ES @@ -49906,6 +83364,7 @@ 3276759696,3276759711,NL 3276759712,3276759743,DE 3276759744,3276759775,CH +3276759776,3276759807,EU 3276759808,3276761215,DE 3276761216,3276761279,ES 3276761280,3276761919,DE @@ -49913,6 +83372,7 @@ 3276761984,3276762015,DK 3276762016,3276762111,FR 3276762112,3276762623,DE +3276762624,3276762879,EU 3276762880,3276762943,DE 3276762944,3276762959,GB 3276762960,3276762975,IT @@ -49929,9 +83389,11 @@ 3276763984,3276763991,GB 3276763992,3276763999,BE 3276764000,3276764031,IT +3276764032,3276764159,EU 3276764160,3276765183,DE 3276765184,3276766975,GB 3276766976,3276766983,FR +3276766984,3276766991,EU 3276766992,3276767015,FR 3276767016,3276767023,DK 3276767024,3276767039,BE @@ -49956,6 +83418,7 @@ 3276769312,3276769343,CH 3276769344,3276769407,NL 3276769408,3276769919,ES +3276769920,3276769983,EU 3276769984,3276770015,AT 3276770016,3276770031,IT 3276770032,3276770047,CH @@ -49964,17 +83427,21 @@ 3276770176,3276770239,ES 3276770240,3276770303,DK 3276770304,3276770815,ES +3276770816,3276770943,EU 3276770944,3276771135,ES +3276771136,3276771199,EU 3276771200,3276771327,ES 3276771328,3276771455,NL 3276771456,3276771583,GB 3276771584,3276772287,NL 3276772288,3276772351,AT 3276772352,3276772567,BE +3276772568,3276772575,EU 3276772576,3276773375,BE 3276773376,3276774047,DK 3276774048,3276774079,FI 3276774080,3276774095,DK +3276774096,3276774111,EU 3276774112,3276774143,IE 3276774144,3276774271,DK 3276774272,3276774303,DE @@ -49996,6 +83463,7 @@ 3276781312,3276781503,NL 3276781504,3276781567,FR 3276781568,3276782719,BE +3276782720,3276782783,EU 3276782784,3276782799,FR 3276782800,3276782815,CZ 3276782816,3276782847,ES @@ -50007,6 +83475,7 @@ 3276783088,3276783103,CH 3276783104,3276783615,IT 3276783616,3276784383,FR +3276784384,3276784639,EU 3276784640,3276784895,FR 3276784896,3276785151,NO 3276785152,3276785407,IE @@ -50023,9 +83492,11 @@ 3276785632,3276785663,IT 3276785664,3276785791,IL 3276785792,3276785823,NL +3276785824,3276785855,EU 3276785856,3276785919,GB 3276785920,3276786175,AT 3276786176,3276786431,NO +3276786432,3276786687,EU 3276786688,3276786815,HU 3276786816,3276786879,SE 3276786880,3276786911,TR @@ -50034,12 +83505,15 @@ 3276787360,3276787391,DE 3276787392,3276787455,BE 3276787456,3276787775,FR +3276787776,3276787967,EU 3276787968,3276788735,FR 3276788736,3276788863,IE 3276788864,3276788895,DE +3276788896,3276788927,EU 3276788928,3276788991,NL 3276788992,3276789247,NO 3276789248,3276789439,FI +3276789440,3276789503,EU 3276789504,3276789567,FR 3276789568,3276789583,ES 3276789584,3276789599,FR @@ -50062,6 +83536,7 @@ 3276791008,3276791039,NL 3276791040,3276791295,GB 3276791296,3276791327,PT +3276791328,3276791551,EU 3276791552,3276792831,GB 3276792832,3276793087,FR 3276793088,3276793279,GB @@ -50072,13 +83547,17 @@ 3276793752,3276793759,FR 3276793760,3276793791,PL 3276793792,3276793855,FR +3276793856,3276794111,EU 3276794112,3276794255,NL 3276794256,3276794271,DE +3276794272,3276794303,EU 3276794304,3276794335,DK 3276794336,3276794367,NL 3276794368,3276795903,BE 3276795904,3276797951,AT +3276797952,3276799103,EU 3276799104,3276799231,GB +3276799232,3276799295,EU 3276799296,3276799359,GB 3276799360,3276799391,NL 3276799392,3276799455,AT @@ -50092,7 +83571,12 @@ 3276799872,3276799999,NL 3276800000,3276824575,GB 3276824576,3276832767,EE -3276832768,3276840959,FR +3276832768,3276834495,GB +3276834496,3276834503,FR +3276834504,3276834815,GB +3276836864,3276837887,RU +3276837888,3276838911,EU +3276838912,3276840959,FR 3276840960,3276849151,SK 3276849152,3276857343,DE 3276857344,3276857599,RU @@ -50112,72 +83596,162 @@ 3276861440,3276865535,DK 3276865536,3276866559,NL 3276866560,3276866815,IT -3276866816,3276867071,GB -3276867072,3276868095,IT -3276868096,3276868607,GB +3276866816,3276866863,DE +3276866864,3276866879,GB +3276866880,3276866959,DE +3276866960,3276866967,GB +3276866968,3276866975,DE +3276866976,3276867071,GB +3276867072,3276868606,IT +3276868607,3276868607,GB 3276868608,3276868863,NL -3276868864,3276869887,GB +3276868864,3276869695,IT +3276869696,3276869727,A2 +3276869728,3276869855,IT +3276869856,3276869887,GB 3276869888,3276870143,NL -3276870144,3276875263,GB +3276870144,3276871679,IT +3276871680,3276872479,DE +3276872480,3276872511,GB +3276872512,3276872703,DE +3276872704,3276873727,GB +3276873728,3276874303,ES +3276874304,3276874367,GB +3276874368,3276874751,ES +3276874752,3276875007,NL +3276875008,3276875263,GB 3276875264,3276875775,NL -3276875776,3276876799,GB +3276875776,3276876031,GB +3276876032,3276876287,DK +3276876288,3276876799,GB 3276876800,3276876823,AT 3276876824,3276877303,GB 3276877304,3276877311,AT -3276877312,3276877559,GB +3276877312,3276877535,GB +3276877536,3276877551,AT +3276877552,3276877559,GB 3276877560,3276877567,AT 3276877568,3276877815,GB 3276877816,3276877823,AT -3276877824,3276879871,GB -3276879872,3276880127,DK -3276880128,3276883967,GB -3276883968,3276884223,PL -3276884224,3276886015,GB +3276877824,3276877831,BG +3276877832,3276878079,GB +3276878080,3276878335,BG +3276878336,3276879359,GB +3276879360,3276879423,TR +3276879424,3276879615,GB +3276879616,3276879871,TR +3276879872,3276880639,DK +3276880640,3276881919,GB +3276881920,3276883391,IT +3276883392,3276883455,GB +3276883456,3276883839,IT +3276883840,3276883967,GB +3276883968,3276884487,PL +3276884488,3276886015,GB 3276886016,3276886271,RO -3276886272,3276896255,GB -3276896256,3276896319,BE -3276896320,3276898303,GB -3276898304,3276898311,CH -3276898312,3276898319,GB -3276898320,3276898335,CH -3276898336,3276898559,GB -3276898560,3276899071,CH -3276899072,3276902399,GB -3276902400,3276902431,SE -3276902432,3276906495,GB -3276906496,3276906567,NL -3276906568,3276906623,GB -3276906624,3276906751,NL -3276906752,3276910591,GB -3276910592,3276912615,IT +3276886272,3276887807,GB +3276887808,3276888063,DE +3276888064,3276888575,GB +3276888576,3276888831,AT +3276888832,3276889087,GB +3276889088,3276890111,AT +3276890112,3276890135,US +3276890136,3276890143,GB +3276890144,3276890191,US +3276890192,3276890367,GB +3276890368,3276890623,US +3276890624,3276891135,IT +3276891136,3276891391,GB +3276891392,3276892159,US +3276892160,3276893695,IT +3276893696,3276894463,GB +3276894464,3276894719,IT +3276894720,3276894975,GB +3276894976,3276895999,IT +3276896000,3276896255,CZ +3276896256,3276896831,BE +3276896832,3276896847,SE +3276896848,3276896895,GB +3276896896,3276896927,BE +3276896928,3276897023,GB +3276897024,3276897279,BE +3276897280,3276898303,GB +3276898304,3276898775,CH +3276898776,3276898783,GB +3276898784,3276899135,CH +3276899136,3276899167,GB +3276899168,3276900039,CH +3276900040,3276900095,GB +3276900096,3276900351,CH +3276900352,3276900607,GB +3276900608,3276900671,CH +3276900672,3276902143,GB +3276902144,3276902151,CH +3276902152,3276902159,GB +3276902160,3276902175,CH +3276902176,3276902399,GB +3276902400,3276902575,SE +3276902576,3276902655,GB +3276902656,3276903422,SE +3276903423,3276903423,GB +3276903424,3276903679,SE +3276903680,3276905311,GB +3276905312,3276905319,ES +3276905320,3276905471,GB +3276905472,3276905727,SE +3276905728,3276906239,BE +3276906240,3276906279,SE +3276906280,3276906495,GB +3276906496,3276906863,NL +3276906864,3276906879,GB +3276906880,3276907551,NL +3276907552,3276910079,GB +3276910080,3276910591,NL +3276910592,3276910967,IT +3276910968,3276910975,GB +3276910976,3276912615,IT 3276912616,3276912623,GB -3276912624,3276913151,IT -3276913152,3276913663,GB -3276913664,3276913919,IT +3276912624,3276913919,IT 3276913920,3276913983,US -3276913984,3276914687,GB -3276914688,3276915559,ES -3276915560,3276915567,GB -3276915568,3276916031,ES -3276916032,3276916223,GB -3276916224,3276916479,ES -3276916480,3276918783,GB -3276918784,3276919295,DE -3276919296,3276922623,GB -3276922624,3276923775,FR -3276923776,3276923791,GB -3276923792,3276923799,FR -3276923800,3276923903,GB -3276923904,3276923935,FR -3276923936,3276924159,GB -3276924160,3276924167,FR -3276924168,3276924223,GB -3276924224,3276924287,FR -3276924288,3276931071,GB +3276913984,3276914687,IT +3276914688,3276915455,ES +3276915456,3276915487,GB +3276915488,3276916175,ES +3276916176,3276916183,GB +3276916184,3276917231,ES +3276917232,3276917247,GB +3276917248,3276917279,ES +3276917280,3276917287,GB +3276917288,3276917311,ES +3276917312,3276917343,GB +3276917344,3276917759,ES +3276917760,3276918271,GB +3276918272,3276918783,ES +3276918784,3276920551,DE +3276920552,3276920559,GB +3276920560,3276921183,DE +3276921184,3276921191,GB +3276921192,3276921239,DE +3276921240,3276921343,GB +3276921344,3276921399,DE +3276921400,3276921403,DK +3276921404,3276921607,DE +3276921608,3276921855,GB +3276921856,3276922623,DE +3276922624,3276923431,FR +3276923432,3276923455,GB +3276923456,3276923615,FR +3276923616,3276923647,GB +3276923648,3276924039,FR +3276924040,3276924095,GB +3276924096,3276924287,FR +3276924288,3276924415,GB +3276924416,3276925951,FR +3276925952,3276926463,GB +3276926464,3276926735,FR +3276926736,3276931071,GB 3276931072,3276939263,KZ -3276939264,3276951535,DE -3276951536,3276951543,AT -3276951544,3276955647,DE +3276939264,3276955647,DE 3276955648,3276963839,GB 3276963840,3276964351,IL 3276964352,3276965375,RO @@ -50226,7 +83800,7 @@ 3277184512,3277184767,DE 3277184768,3277185023,UA 3277185024,3277185279,SA -3277185280,3277185535,NL +3277185280,3277185535,RU 3277185536,3277185791,DE 3277185792,3277186047,PL 3277186048,3277186303,IT @@ -50253,13 +83827,127 @@ 3277191936,3277192191,DK 3277192192,3277192447,PL 3277192448,3277192703,DK -3277192704,3277192959,DE +3277192704,3277192959,GG 3277192960,3277193215,TR 3277193216,3277254727,NL 3277254728,3277254735,DE 3277254736,3277258751,NL 3277258752,3277324287,TR -3277389824,3277395951,GB +3277324288,3277325311,RU +3277325312,3277326335,IT +3277326336,3277326847,GB +3277326848,3277327359,AT +3277327360,3277327871,RS +3277327872,3277328383,UA +3277328384,3277328895,RU +3277328896,3277329407,NL +3277329408,3277329919,GB +3277329920,3277330431,RU +3277330432,3277330943,RO +3277330944,3277331455,UA +3277331456,3277332479,PL +3277332480,3277332991,NL +3277332992,3277333503,AT +3277333504,3277334015,DK +3277334016,3277334527,RO +3277334528,3277335039,RU +3277335040,3277335551,UA +3277335552,3277336063,DE +3277336064,3277336575,HR +3277336576,3277337087,AT +3277337088,3277337599,PL +3277337600,3277338111,UA +3277338112,3277338623,NO +3277338624,3277339647,RU +3277339648,3277340159,RO +3277340160,3277340671,RU +3277340672,3277341183,RO +3277341184,3277341695,AM +3277341696,3277342207,RU +3277342208,3277342719,GB +3277342720,3277343231,UA +3277343232,3277343743,BG +3277343744,3277344767,UA +3277344768,3277345279,RO +3277345280,3277345791,SI +3277345792,3277346303,FR +3277346304,3277346815,GB +3277346816,3277347327,DE +3277347328,3277347839,PL +3277347840,3277348351,RU +3277348352,3277348863,FR +3277348864,3277349887,RO +3277349888,3277350399,GB +3277350400,3277351423,RU +3277351424,3277351935,NO +3277351936,3277352447,DE +3277352448,3277352959,SE +3277352960,3277353471,UA +3277353472,3277353983,PL +3277353984,3277354495,DE +3277354496,3277355007,GB +3277355008,3277355519,RU +3277355520,3277356031,MK +3277356032,3277356543,UA +3277356544,3277357055,RU +3277357056,3277357567,PL +3277357568,3277358079,SE +3277358080,3277359103,RU +3277359104,3277359615,NL +3277359616,3277360127,UA +3277360128,3277360639,BG +3277360640,3277361151,CZ +3277361152,3277361663,UA +3277361664,3277362175,RU +3277362176,3277362687,ES +3277362688,3277363199,IE +3277363200,3277363711,ES +3277363712,3277364223,RU +3277364224,3277364735,GB +3277364736,3277365247,UA +3277365248,3277365759,NL +3277365760,3277366271,GR +3277366272,3277366783,CZ +3277366784,3277367295,AT +3277367296,3277367807,PL +3277367808,3277368319,RU +3277368320,3277369343,RO +3277369344,3277369855,CY +3277369856,3277370367,RU +3277370368,3277370879,SE +3277370880,3277371391,RO +3277371392,3277371903,RU +3277371904,3277372415,PL +3277372928,3277373951,RU +3277373952,3277374463,FR +3277374464,3277375999,RU +3277376000,3277376511,NL +3277376512,3277377023,RO +3277377024,3277378559,RU +3277378560,3277379071,HR +3277379072,3277379583,UZ +3277379584,3277380095,RS +3277380096,3277380607,RO +3277380608,3277381119,RU +3277381120,3277381631,KW +3277381632,3277382143,RU +3277382144,3277382655,MD +3277382656,3277383167,GB +3277383168,3277383679,UA +3277383680,3277384191,PL +3277384192,3277384703,IL +3277384704,3277385215,GB +3277385216,3277385727,AT +3277385728,3277386239,RU +3277386240,3277386751,UA +3277386752,3277387263,SA +3277387264,3277388287,RU +3277388288,3277388799,SE +3277388800,3277389311,RU +3277389312,3277389823,AM +3277389824,3277394943,GB +3277394944,3277395455,US +3277395456,3277395951,GB 3277395952,3277395967,IE 3277395968,3277452647,GB 3277452648,3277452655,DK @@ -50269,24 +83957,21 @@ 3277463808,3277464063,US 3277464064,3277464575,FR 3277464576,3277464831,BE -3277464832,3277465087,IL -3277465088,3277465599,FR -3277466368,3277466495,US -3277466624,3277466879,US +3277464832,3277467471,US 3277467472,3277467551,CA -3277467648,3277467663,US -3277467904,3277467919,US -3277468096,3277468607,US -3277468672,3277468735,US -3277468928,3277469056,US -3277469184,3277469439,US -3277471744,3277472607,NL +3277467552,3277471743,US +3277471744,3277472511,NL +3277472512,3277472607,EU 3277472608,3277472623,IL -3277472624,3277474815,NL +3277472624,3277474815,EU 3277474816,3277475711,BE -3277475712,3277476607,NL +3277475712,3277475839,EU +3277475840,3277476095,NL +3277476096,3277476607,EU 3277476608,3277477631,BE -3277477632,3277479935,NL +3277477632,3277478143,EU +3277478144,3277478399,NL +3277478400,3277479935,EU 3277479936,3277480959,GB 3277480960,3277481471,DK 3277481472,3277481983,PL @@ -50305,8 +83990,11 @@ 3277504512,3277520895,DE 3277520896,3277553663,SK 3277553664,3277586431,RU -3277586432,3277651967,GB -3277651968,3277684735,US +3277586432,3277666815,GB +3277666816,3277667327,US +3277667328,3277676543,DE +3277676544,3277680639,FR +3277680640,3277684735,US 3277684736,3277685247,RU 3277685248,3277685759,DE 3277685760,3277686271,IE @@ -50315,9 +84003,9 @@ 3277687296,3277687807,UA 3277687808,3277688319,RO 3277688320,3277688831,PL -3277688832,3277689343,RU 3277689344,3277689855,AT -3277689856,3277691391,RU +3277689856,3277690879,RU +3277690880,3277691391,KZ 3277691392,3277691903,UA 3277691904,3277692415,GB 3277692416,3277692927,DE @@ -50344,11 +84032,11 @@ 3277703680,3277704191,PL 3277704192,3277704703,UA 3277704704,3277705215,RU -3277705216,3277705727,UA +3277705216,3277705727,KZ 3277705728,3277706239,ES 3277706240,3277707263,UA 3277707264,3277707775,CZ -3277707776,3277708287,RU +3277707776,3277708287,MD 3277708288,3277708799,AT 3277708800,3277709311,PL 3277709312,3277709823,NL @@ -50357,7 +84045,6 @@ 3277710848,3277711359,PL 3277711360,3277711871,NO 3277711872,3277712383,IL -3277712384,3277712895,FR 3277712896,3277713407,NL 3277713408,3277713919,RU 3277713920,3277714943,DE @@ -50366,12 +84053,8 @@ 3277716480,3277716991,SE 3277716992,3277717503,IT 3277717504,3277725695,YE -3277725696,3277728367,CH -3277728368,3277728383,NL -3277728384,3277733887,CH -3277733888,3277736351,DE -3277736352,3277736367,AT -3277736368,3277742079,DE +3277725696,3277733887,CH +3277733888,3277742079,DE 3277742080,3277750271,FI 3277750272,3277766655,IT 3277766656,3277774847,PL @@ -50398,18 +84081,18 @@ 3277820672,3277820927,UA 3277820928,3277821183,CH 3277821184,3277821439,TR -3277821440,3277821695,NL +3277821440,3277821695,GB 3277821696,3277821951,UA 3277821952,3277822207,RO 3277822208,3277822463,ES 3277822464,3277822719,PL -3277822720,3277822975,GB +3277822720,3277822975,RU 3277822976,3277823231,FR 3277823232,3277823487,UA 3277823488,3277823743,SI -3277823744,3277823999,RU +3277823744,3277823999,UA 3277824000,3277824255,TR -3277824256,3277824511,AT +3277824256,3277824511,SI 3277824512,3277824767,UA 3277824768,3277825023,AT 3277825024,3277825279,PL @@ -50436,6 +84119,7 @@ 3277831168,3277831423,PL 3277831424,3277831679,UA 3277831680,3277832191,IE +3277832192,3277833215,EU 3277833216,3277833727,BE 3277833728,3277834239,NL 3277834240,3277834751,RU @@ -50445,12 +84129,12 @@ 3277836288,3277836799,FI 3277836800,3277837311,UA 3277837312,3277838847,RU +3277838848,3277839359,BY 3277839360,3277839871,DE 3277839872,3277840383,UA 3277840384,3277840895,FR 3277840896,3277841407,GR 3277841408,3277841919,RO -3277841920,3277842431,IL 3277842432,3277842943,UA 3277842944,3277843455,PL 3277843456,3277843967,PT @@ -50463,14 +84147,15 @@ 3277856768,3277864959,DE 3277864960,3277873151,RU 3277873152,3277881343,NL -3277881344,3277882111,IT -3277882112,3277882367,AE -3277882368,3277884175,IQ +3277881344,3277884175,IT 3277884176,3277884191,IR -3277884192,3277886207,IQ -3277886208,3277887103,IR -3277887104,3277887231,IT -3277887232,3277889535,IR +3277884192,3277885439,IT +3277885440,3277885951,LB +3277885952,3277886207,IT +3277886208,3277886975,IR +3277886976,3277888255,IT +3277888256,3277888319,LB +3277888320,3277889535,IT 3277889536,3277897727,RU 3277897728,3277905919,IT 3277905920,3277914111,BG @@ -50497,32 +84182,38 @@ 3278110752,3278110767,ES 3278110768,3278111239,SE 3278111240,3278111247,ES -3278111248,3278119935,SE +3278111248,3278114815,SE +3278114816,3278115071,ES +3278115072,3278115327,SE +3278115328,3278116607,ES +3278116608,3278116863,SE +3278116864,3278118303,ES +3278118304,3278119935,SE 3278119936,3278119943,DE 3278119944,3278119967,SE 3278119968,3278119975,NO 3278119976,3278120151,SE 3278120152,3278120159,DE -3278120160,3278160107,SE -3278160108,3278160111,GB -3278160112,3278161631,SE +3278120160,3278161631,SE 3278161632,3278161647,DE -3278161648,3278168063,SE -3278168064,3278168071,DM -3278168072,3278168111,SE +3278161648,3278168111,SE 3278168112,3278168119,DK -3278168120,3278168127,SE -3278168128,3278168159,DK -3278168160,3278168175,SE +3278168120,3278168175,SE 3278168176,3278168191,DK 3278168192,3278176255,SE -3278176256,3278232511,FR +3278176256,3278220799,FR +3278220800,3278221055,GB +3278221056,3278221087,FR +3278221088,3278221119,GB +3278221120,3278232511,FR 3278232512,3278232575,MC 3278232576,3278241791,FR 3278241792,3278307327,GB 3278307328,3278372863,IT 3278372864,3278635007,GB -3278635008,3278766079,NL +3278635008,3278744791,NL +3278744792,3278744799,A2 +3278744800,3278766079,NL 3278766080,3278766591,RO 3278766592,3278767103,RU 3278767104,3278767615,RO @@ -50537,11 +84228,36 @@ 3278772224,3278772735,BG 3278772736,3278773247,DE 3278773248,3278773759,NO -3278773760,3278774271,FR -3278774272,3278782463,HU +3278773760,3278774271,GB +3278774272,3278774783,RU +3278775296,3278775807,GB +3278775808,3278776319,IR +3278776320,3278776831,IL +3278776832,3278777343,ES +3278777344,3278777855,SE +3278777856,3278778367,RU +3278778368,3278779391,PL +3278779392,3278779903,RU +3278779904,3278780415,BE +3278780416,3278780927,UA +3278780928,3278781439,LT +3278781440,3278781951,DE +3278781952,3278782463,RU 3278782464,3278782975,GB 3278782976,3278783231,DE -3278783232,3278790655,GB +3278783232,3278784703,GB +3278784704,3278784735,US +3278784736,3278786911,GB +3278786912,3278786943,LU +3278786944,3278787567,GB +3278787568,3278787583,FR +3278787584,3278788095,GB +3278788096,3278788223,US +3278788224,3278789935,GB +3278789936,3278789951,US +3278789952,3278790095,GB +3278790096,3278790111,ES +3278790112,3278790655,GB 3278790656,3278807039,IT 3278807040,3278815231,GB 3278815232,3278823423,AT @@ -50555,7 +84271,7 @@ 3278929920,3278938111,TR 3278938112,3278938119,DE 3278938120,3278938123,DK -3278938124,3278938127,ES +3278938124,3278938127,DE 3278938128,3278938131,TR 3278938132,3278938151,DE 3278938152,3278938155,GB @@ -50769,7 +84485,9 @@ 3278939136,3278939147,US 3278939148,3278939151,AR 3278939152,3278939155,ES -3278939156,3278939195,US +3278939156,3278939183,US +3278939184,3278939187,GU +3278939188,3278939195,US 3278939196,3278939199,CL 3278939200,3278939259,US 3278939260,3278939263,BR @@ -50800,8 +84518,7 @@ 3278939416,3278939419,ZW 3278939420,3278939423,IE 3278939424,3278939427,GB -3278939428,3278939435,DE -3278939436,3278939439,ES +3278939428,3278939439,DE 3278939440,3278939443,IT 3278939444,3278939447,DE 3278939448,3278939451,PL @@ -50889,7 +84606,7 @@ 3278939840,3278939843,IT 3278939844,3278939847,BE 3278939848,3278939851,CH -3278939852,3278939855,HU +3278939852,3278939855,DE 3278939856,3278939859,FR 3278939860,3278939863,GB 3278939864,3278939867,IT @@ -51101,8 +84818,7 @@ 3278940912,3278940915,IT 3278940916,3278940919,DE 3278940920,3278940923,PT -3278940924,3278940927,FR -3278940928,3278940931,DE +3278940924,3278940931,DE 3278940932,3278940935,NL 3278940936,3278940939,ES 3278940940,3278940943,FR @@ -51130,8 +84846,7 @@ 3278941040,3278941043,DE 3278941044,3278941047,FR 3278941048,3278941051,ES -3278941052,3278941055,DE -3278941056,3278941059,FR +3278941052,3278941059,DE 3278941060,3278941063,GB 3278941064,3278941067,IT 3278941068,3278941071,ES @@ -51159,7 +84874,8 @@ 3278941180,3278941183,FR 3278941184,3278941191,US 3278941192,3278941195,BR -3278941196,3278941215,US +3278941196,3278941211,US +3278941212,3278941215,GU 3278941216,3278941219,BR 3278941220,3278941243,US 3278941244,3278941247,CO @@ -51181,7 +84897,8 @@ 3278941376,3278941399,US 3278941400,3278941403,VE 3278941404,3278941407,BR -3278941408,3278941423,US +3278941408,3278941419,US +3278941420,3278941423,DE 3278941424,3278941427,CL 3278941428,3278941431,PE 3278941432,3278941439,US @@ -51372,7 +85089,7 @@ 3278942738,3278942739,DE 3278942740,3278942740,NL 3278942741,3278942741,GB -3278942742,3278942742,SE +3278942742,3278942742,DE 3278942743,3278942743,ES 3278942744,3278942748,DE 3278942749,3278942749,GB @@ -51384,8 +85101,7 @@ 3278942756,3278942756,DE 3278942757,3278942757,GB 3278942758,3278942759,IT -3278942760,3278942760,ES -3278942761,3278942761,DE +3278942760,3278942761,DE 3278942762,3278942762,GB 3278942763,3278942763,NL 3278942764,3278942764,FR @@ -51450,8 +85166,7 @@ 3278942833,3278942833,DE 3278942834,3278942834,NL 3278942835,3278942835,AT -3278942836,3278942836,DE -3278942837,3278942837,IT +3278942836,3278942837,DE 3278942838,3278942838,ES 3278942839,3278942839,FR 3278942840,3278942841,DE @@ -51745,8 +85460,7 @@ 3278943237,3278943237,FR 3278943238,3278943239,DE 3278943240,3278943240,NL -3278943241,3278943241,FR -3278943242,3278943242,DE +3278943241,3278943242,DE 3278943243,3278943243,ES 3278943244,3278943244,FR 3278943245,3278943245,DE @@ -51865,7 +85579,7 @@ 3278943388,3278943388,ES 3278943389,3278943389,BE 3278943390,3278943390,ES -3278943391,3278943391,FR +3278943391,3278943391,DE 3278943392,3278943392,PL 3278943393,3278943393,CH 3278943394,3278943394,FR @@ -51928,9 +85642,7 @@ 3278943457,3278943457,GB 3278943458,3278943459,DE 3278943460,3278943460,FR -3278943461,3278943462,DE -3278943463,3278943463,IT -3278943464,3278943464,DE +3278943461,3278943464,DE 3278943465,3278943465,ES 3278943466,3278943466,DE 3278943467,3278943467,ES @@ -51946,7 +85658,7 @@ 3278943482,3278943482,IT 3278943483,3278943489,DE 3278943490,3278943490,BE -3278943491,3278943491,DK +3278943491,3278943491,DE 3278943492,3278943492,CH 3278943493,3278943494,DE 3278943495,3278943495,FR @@ -52002,8 +85714,7 @@ 3278943556,3278943556,FR 3278943557,3278943557,DE 3278943558,3278943558,AT -3278943559,3278943559,DE -3278943560,3278943560,CH +3278943559,3278943560,DE 3278943561,3278943561,FR 3278943562,3278943564,DE 3278943565,3278943565,GB @@ -52060,7 +85771,7 @@ 3278943621,3278943621,CH 3278943622,3278943622,IT 3278943623,3278943623,DK -3278943624,3278943624,PL +3278943624,3278943624,DE 3278943625,3278943625,FR 3278943626,3278943628,DE 3278943629,3278943630,FR @@ -52298,7 +86009,7 @@ 3278943919,3278943920,FR 3278943921,3278943921,DE 3278943922,3278943922,ES -3278943923,3278943923,FR +3278943923,3278943923,DE 3278943924,3278943924,IT 3278943925,3278943926,ES 3278943927,3278943927,GB @@ -52339,7 +86050,8 @@ 3278943972,3278943972,IT 3278943973,3278943973,DE 3278943974,3278943974,GR -3278943975,3278943976,CH +3278943975,3278943975,CH +3278943976,3278943976,DE 3278943977,3278943977,DK 3278943978,3278943978,DE 3278943979,3278943979,ES @@ -52354,8 +86066,8 @@ 3278943989,3278943990,DE 3278943991,3278943991,NL 3278943992,3278943992,IT -3278943993,3278943994,AT -3278943995,3278943995,DE +3278943993,3278943993,AT +3278943994,3278943995,DE 3278943996,3278943997,CH 3278943998,3278943998,FR 3278943999,3278944001,DE @@ -52411,8 +86123,7 @@ 3278944059,3278944059,ES 3278944060,3278944060,BE 3278944061,3278944061,FR -3278944062,3278944062,NL -3278944063,3278944063,DE +3278944062,3278944063,DE 3278944064,3278944064,FR 3278944065,3278944065,IT 3278944066,3278944066,GB @@ -52485,7 +86196,7 @@ 3278944145,3278944145,SE 3278944146,3278944147,DE 3278944148,3278944148,ES -3278944149,3278944149,NL +3278944149,3278944149,DE 3278944150,3278944150,IE 3278944151,3278944151,IT 3278944152,3278944152,IS @@ -52537,8 +86248,7 @@ 3278944215,3278944215,IT 3278944216,3278944216,DE 3278944217,3278944217,IT -3278944218,3278944218,ES -3278944219,3278944219,DE +3278944218,3278944219,DE 3278944220,3278944220,GB 3278944221,3278944221,GR 3278944222,3278944222,IT @@ -52591,7 +86301,9 @@ 3278944366,3278944366,MX 3278944367,3278944367,US 3278944368,3278944368,CA -3278944369,3278944379,US +3278944369,3278944373,US +3278944374,3278944374,PR +3278944375,3278944379,US 3278944380,3278944380,DE 3278944381,3278944385,US 3278944386,3278944386,DE @@ -52633,7 +86345,9 @@ 3278944527,3278944527,CA 3278944528,3278944528,US 3278944529,3278944529,CA -3278944530,3278944537,US +3278944530,3278944535,US +3278944536,3278944536,GU +3278944537,3278944537,US 3278944538,3278944538,AR 3278944539,3278944544,US 3278944545,3278944545,CA @@ -52649,12 +86363,16 @@ 3278944570,3278944570,DE 3278944571,3278944572,US 3278944573,3278944573,DE -3278944574,3278944578,US +3278944574,3278944574,US +3278944575,3278944575,DE +3278944576,3278944578,US 3278944579,3278944579,DE 3278944580,3278944580,AR 3278944581,3278944581,US 3278944582,3278944583,DE -3278944584,3278944588,US +3278944584,3278944586,US +3278944587,3278944587,PR +3278944588,3278944588,US 3278944589,3278944589,DE 3278944590,3278944599,US 3278944600,3278944600,SA @@ -52662,7 +86380,9 @@ 3278944607,3278944608,DE 3278944609,3278944611,US 3278944612,3278944612,DE -3278944613,3278944633,US +3278944613,3278944626,US +3278944627,3278944627,DE +3278944628,3278944633,US 3278944634,3278944634,DE 3278944635,3278944638,US 3278944639,3278944640,DE @@ -52694,7 +86414,7 @@ 3278944688,3278944688,AR 3278944689,3278944693,US 3278944694,3278944695,DE -3278944696,3278944696,US +3278944696,3278944696,AS 3278944697,3278944697,CA 3278944698,3278944706,US 3278944707,3278944707,DE @@ -52865,7 +86585,7 @@ 3278945801,3278945801,NL 3278945802,3278945802,PT 3278945803,3278945803,GB -3278945804,3278945804,NL +3278945804,3278945804,DE 3278945805,3278945805,DK 3278945806,3278945806,FR 3278945807,3278945807,DE @@ -52961,9 +86681,13 @@ 3278946092,3278946092,DE 3278946093,3278946108,US 3278946109,3278946109,GB -3278946110,3278946166,US +3278946110,3278946142,US +3278946143,3278946143,DE +3278946144,3278946166,US 3278946167,3278946167,DE -3278946168,3278946208,US +3278946168,3278946190,US +3278946191,3278946191,PR +3278946192,3278946208,US 3278946209,3278946213,DE 3278946214,3278946214,US 3278946215,3278946221,DE @@ -52981,7 +86705,8 @@ 3278946280,3278946283,DE 3278946284,3278946287,US 3278946288,3278946291,DE -3278946292,3278946299,US +3278946292,3278946295,PR +3278946296,3278946299,US 3278946300,3278946303,DE 3278946304,3278954495,LB 3278954496,3278962687,RU @@ -52993,7 +86718,7 @@ 3279030784,3279031295,DE 3279031296,3279031807,NL 3279031808,3279032319,RO -3279032320,3279032831,RU +3279032320,3279032831,HU 3279032832,3279033343,FR 3279033344,3279033855,RU 3279033856,3279034367,DE @@ -53001,7 +86726,9 @@ 3279035392,3279035903,PS 3279035904,3279036415,UA 3279036416,3279044607,LV -3279044608,3279052799,FR +3279044608,3279050455,FR +3279050456,3279050463,A2 +3279050464,3279052799,FR 3279052800,3279053311,UA 3279053312,3279053823,DE 3279053824,3279054335,NL @@ -53015,8 +86742,7 @@ 3279057920,3279058431,RO 3279058432,3279058943,RU 3279058944,3279059455,UA -3279059456,3279059967,RU -3279059968,3279060479,RO +3279059456,3279060479,RU 3279060480,3279060991,PL 3279060992,3279069183,UA 3279069184,3279077375,PL @@ -53031,18 +86757,19 @@ 3279083808,3279083839,NL 3279083840,3279084543,ES 3279084544,3279085567,IT -3279085568,3279093759,NL +3279085568,3279090687,NL +3279090688,3279090943,DE +3279090944,3279093759,NL 3279093760,3279103103,FR 3279103104,3279103135,GB 3279103136,3279119295,FR 3279119296,3279119327,GB 3279119328,3279159295,FR -3279159296,3279169279,PL -3279169280,3279169535,GB -3279169536,3279290367,PL +3279159296,3279290367,PL 3279290368,3279291391,NL 3279291392,3279291647,GB 3279291648,3279294463,NL +3279294464,3279294719,EU 3279294720,3279294975,IE 3279294976,3279295231,SE 3279295232,3279295487,ES @@ -53054,6 +86781,7 @@ 3279297536,3279298047,SE 3279298048,3279298559,ZA 3279298560,3279305471,DE +3279305472,3279305487,EU 3279305488,3279305503,DE 3279305504,3279305535,GB 3279305536,3279305631,DE @@ -53062,7 +86790,9 @@ 3279305728,3279306751,DE 3279306752,3279310847,FR 3279310848,3279311871,DE +3279311872,3279312895,EU 3279312896,3279313415,DE +3279313416,3279313423,EU 3279313424,3279313919,DE 3279313920,3279314943,GB 3279314944,3279315711,CH @@ -53096,12 +86826,14 @@ 3279323072,3279330079,GB 3279330080,3279330111,DK 3279330112,3279330815,GB +3279330816,3279331071,EU 3279331072,3279335295,GB 3279335296,3279335423,BE 3279335424,3279339519,GB 3279339520,3279340031,ES 3279340032,3279340543,IT 3279340544,3279340671,FR +3279340672,3279340799,EU 3279340800,3279341055,FR 3279341056,3279341567,IT 3279341568,3279341823,SE @@ -53129,56 +86861,86 @@ 3279352320,3279352575,GB 3279352576,3279352831,BE 3279352832,3279352855,SE +3279352856,3279353087,EU 3279353088,3279353343,GB 3279353344,3279354879,DK 3279354880,3279355647,AT 3279355648,3279355903,BE +3279355904,3279356039,EU 3279356040,3279356047,NO +3279356048,3279356063,EU 3279356064,3279356127,NO +3279356128,3279356159,EU 3279356160,3279356415,NO +3279356416,3279356927,EU 3279356928,3279357439,NO +3279357440,3279372287,EU 3279372288,3279372799,FI +3279372800,3279373055,EU 3279373056,3279375359,FI +3279375360,3279380479,EU 3279380480,3279380991,CH +3279380992,3279382783,EU 3279382784,3279383807,CH +3279383808,3279384063,EU 3279384064,3279385343,CH +3279385344,3279386367,EU 3279386368,3279386495,CH +3279386496,3279387135,EU 3279387136,3279387391,CH +3279387392,3279388671,EU 3279388672,3279388927,GR +3279388928,3279389183,EU 3279389184,3279389243,GR +3279389244,3279389247,EU 3279389248,3279389255,GR +3279389256,3279389259,EU 3279389260,3279389275,GR +3279389276,3279389279,EU 3279389280,3279389359,GR +3279389360,3279389363,EU 3279389364,3279389379,GR +3279389380,3279389383,EU 3279389384,3279389439,GR +3279389440,3279389711,EU 3279389712,3279389727,GR +3279389728,3279390015,EU 3279390016,3279390143,GR +3279390144,3279393791,EU 3279393792,3279394047,GR +3279394048,3279394303,EU 3279394304,3279394559,GR +3279394560,3279402751,EU 3279402752,3279403007,CZ +3279403008,3279403263,EU 3279403264,3279403903,CZ +3279403904,3279404287,EU 3279404288,3279404415,CZ +3279404416,3279404799,EU 3279404800,3279405055,CZ +3279405056,3279421439,EU 3279421440,3279486975,IT 3279486976,3279552511,NL 3279552512,3279560703,LV 3279560704,3279568895,GB 3279568896,3279577087,IT 3279577088,3279585279,BE -3279585280,3279585991,DE +3279585280,3279585919,DE +3279585920,3279585951,GB +3279585952,3279585991,DE 3279585992,3279585999,GB -3279586000,3279586015,DE -3279586016,3279586047,GB -3279586048,3279586303,DE +3279586000,3279586303,DE 3279586304,3279586559,GB 3279586560,3279588095,DE 3279588096,3279588607,GB 3279588608,3279588863,DE 3279588864,3279589375,GB -3279589376,3279590399,DE -3279590400,3279590655,GB -3279590656,3279590911,DE -3279590912,3279592959,GB +3279589376,3279589887,DE +3279589888,3279590655,GB +3279590656,3279590935,DE +3279590936,3279591167,GB +3279591168,3279591935,DE +3279591936,3279592959,GB 3279592960,3279593215,DE 3279593216,3279593247,GB 3279593248,3279593267,DE @@ -53188,11 +86950,17 @@ 3279593408,3279593440,DE 3279593441,3279593471,GB 3279593472,3279593487,DE -3279593488,3279595903,GB +3279593488,3279593535,GB +3279593536,3279593567,DE +3279593568,3279593599,GB +3279593600,3279594495,DE +3279594496,3279595903,GB 3279595904,3279595999,DE 3279596000,3279596023,GB 3279596024,3279596031,DE -3279596032,3279600383,GB +3279596032,3279596543,GB +3279596544,3279597311,DE +3279597312,3279600383,GB 3279600384,3279600479,DE 3279600480,3279600487,GB 3279600488,3279600639,DE @@ -53202,13 +86970,15 @@ 3279618048,3279683583,UA 3279683584,3279752959,DE 3279752960,3279753215,CH -3279753216,3279946751,DE +3279753216,3279897583,DE +3279897584,3279897591,GB +3279897592,3279946751,DE 3279946752,3279947775,SE 3279947776,3279948799,NL 3279948800,3279949823,GB 3279949824,3279950847,UA 3279950848,3279951871,DE -3279951872,3279952895,IQ +3279951872,3279952895,CY 3279952896,3279953919,PL 3279953920,3279955967,TR 3279955968,3279958015,DE @@ -53219,7 +86989,7 @@ 3279986688,3279987199,NL 3279987200,3279987711,RU 3279987712,3279988223,RO -3279988224,3279988735,RU +3279988224,3279988735,AM 3279988736,3279989247,RO 3279989248,3279989759,AT 3279989760,3279990271,PL @@ -53249,53 +87019,111 @@ 3280010752,3280011263,TR 3280011264,3280011327,DE 3280011328,3280011391,NL +3280011392,3280011407,EU 3280011408,3280011415,GB +3280011416,3280011551,EU 3280011552,3280011567,GB +3280011568,3280011647,EU 3280011648,3280011775,IT 3280011776,3280011783,NL 3280011784,3280011791,BE +3280011792,3280011903,EU 3280011904,3280011951,BE -3280014592,3280015103,FR +3280011952,3280014847,EU +3280014848,3280015103,FR 3280015104,3280015359,GB +3280015360,3280015871,EU 3280015872,3280016383,GB +3280016384,3280016447,EU 3280016448,3280016463,BE +3280016464,3280016543,EU 3280016544,3280016559,BE 3280016560,3280016575,GR 3280016576,3280016607,NO 3280016608,3280016623,CH +3280016624,3280016959,EU 3280016960,3280016991,BE 3280016992,3280017023,FR 3280017024,3280017055,IT +3280017056,3280017087,EU 3280017088,3280017151,IE +3280017152,3280017919,EU 3280017920,3280018431,IT 3280018432,3280019455,GB +3280019456,3280019711,EU 3280019712,3280020479,CH 3280020480,3280020735,IE 3280020736,3280020991,BE 3280020992,3280021087,GB +3280021088,3280021119,EU 3280021120,3280021183,NL +3280021184,3280021247,EU 3280021248,3280021503,CH +3280021504,3280021759,EU 3280021760,3280021823,BE +3280021824,3280022783,EU 3280022784,3280023039,IT +3280023040,3280023551,EU 3280023552,3280024575,IT 3280024576,3280024831,SE +3280024832,3280027135,EU 3280027136,3280027391,IE +3280027392,3280027647,EU 3280027648,3280027903,CH +3280027904,3280028159,EU 3280028160,3280028415,IT 3280028416,3280028671,BE +3280028672,3280030207,EU 3280030208,3280030463,CH +3280030464,3280031743,EU 3280031744,3280031999,IE +3280032000,3280032127,EU 3280032128,3280032255,CH +3280032256,3280035327,EU 3280035328,3280035583,CH +3280035584,3280036607,EU 3280036608,3280036863,CH +3280036864,3280037887,EU 3280037888,3280038399,CH +3280038400,3280041471,EU 3280041472,3280041727,CH +3280041728,3280076799,EU 3280076800,3280084991,GB 3280084992,3280093183,BA 3280093184,3280109567,GR 3280109568,3280117759,BE 3280117760,3280125951,CH -3280125952,3280142335,IT +3280125952,3280126207,DE +3280126208,3280126463,IS +3280126464,3280126719,SI +3280126720,3280126975,IT +3280126976,3280127231,CH +3280127232,3280127487,PL +3280127488,3280127743,AT +3280127744,3280127999,EU +3280128000,3280128255,SE +3280128256,3280128511,GB +3280128512,3280129023,HU +3280129024,3280129279,RU +3280129280,3280129535,LV +3280129536,3280129791,SA +3280129792,3280130047,FR +3280130048,3280130559,RU +3280130560,3280130815,GB +3280130816,3280131071,IS +3280131072,3280131327,PL +3280131328,3280131583,IT +3280131584,3280131839,RU +3280131840,3280132095,RO +3280132096,3280132351,RU +3280132352,3280132607,GB +3280132608,3280132863,CH +3280132864,3280133119,UA +3280133120,3280133375,IT +3280133376,3280133631,DE +3280133632,3280133887,FR +3280133888,3280134143,NL +3280134144,3280142335,IT 3280142336,3280144815,RU 3280144816,3280144823,RO 3280144824,3280207871,RU @@ -53305,13 +87133,78 @@ 3280347136,3280355327,NO 3280355328,3280371711,GR 3280371712,3280379903,CH -3280379904,3280392127,FR +3280379904,3280388127,FR +3280388128,3280388159,GB +3280388160,3280388191,FR +3280388192,3280388223,GB +3280388224,3280388759,FR +3280388760,3280388767,GB +3280388768,3280388799,FR +3280388800,3280388831,GB +3280388832,3280390655,FR +3280390656,3280390719,GB +3280390720,3280390751,FR +3280390752,3280390783,GB +3280390784,3280390815,FR +3280390816,3280390879,GB +3280390880,3280390911,FR +3280390912,3280391167,GB +3280391168,3280391551,FR +3280391552,3280391583,GB +3280391584,3280391743,FR +3280391744,3280391775,GB +3280391776,3280391807,FR +3280391808,3280391967,GB +3280391968,3280392007,FR +3280392008,3280392031,GB +3280392032,3280392063,FR +3280392064,3280392095,GB +3280392096,3280392127,FR 3280392128,3280392191,CH -3280392192,3280396287,FR +3280392192,3280392319,FR +3280392320,3280392383,GB +3280392384,3280392415,FR +3280392416,3280392447,GB +3280392448,3280392463,FR +3280392464,3280392639,GB +3280392640,3280392671,FR +3280392672,3280392703,GB +3280392704,3280392831,FR +3280392832,3280393023,GB +3280393024,3280393055,FR +3280393056,3280393087,GB +3280393088,3280393151,FR +3280393152,3280393343,GB +3280393344,3280393375,FR +3280393376,3280393407,GB +3280393408,3280393535,FR +3280393536,3280393599,GB +3280393600,3280393631,FR +3280393632,3280393695,GB +3280393696,3280393727,FR +3280393728,3280394367,GB +3280394368,3280394431,FR +3280394432,3280394463,GB +3280394464,3280394495,FR +3280394496,3280394527,GB +3280394528,3280394559,FR +3280394560,3280394623,GB +3280394624,3280395519,FR +3280395520,3280395647,GB +3280395648,3280395839,FR +3280395840,3280396031,GB +3280396032,3280396055,FR +3280396056,3280396071,GB +3280396072,3280396095,FR +3280396096,3280396191,GB +3280396192,3280396223,FR +3280396224,3280396255,GB +3280396256,3280396263,FR +3280396264,3280396287,GB 3280396288,3280404479,FI 3280404480,3280437247,IT 3280437248,3280453631,DE -3280453632,3280454655,ES +3280453632,3280454655,RO 3280454656,3280455679,UA 3280455680,3280456703,IT 3280456704,3280457727,RU @@ -53319,8 +87212,10 @@ 3280458752,3280459775,RU 3280459776,3280460799,DK 3280460800,3280462847,DE +3280462848,3280463871,DK 3280463872,3280466943,RU 3280466944,3280467967,UA +3280467968,3280468991,GB 3280468992,3280470015,CY 3280470016,3280535551,PL 3280535552,3280568319,GB @@ -53368,7 +87263,7 @@ 3280589312,3280590335,DE 3280590336,3280590847,NL 3280590848,3280591359,DE -3280591872,3280592383,GB +3280591360,3280592383,GB 3280592384,3280592895,TR 3280592896,3280593407,DE 3280593408,3280593919,UA @@ -53392,7 +87287,9 @@ 3280625664,3280633855,MD 3280633856,3280635807,BG 3280635808,3280635815,DE -3280635816,3280642047,BG +3280635816,3280638207,BG +3280638208,3280638463,A2 +3280638464,3280642047,BG 3280642048,3280650239,UA 3280650240,3280650495,RO 3280650496,3280650751,UA @@ -53413,7 +87310,7 @@ 3280654848,3280655103,RU 3280655104,3280655359,PL 3280655360,3280655615,SE -3280655616,3280655871,RU +3280655616,3280655871,FI 3280655872,3280656127,RO 3280656128,3280656639,CH 3280656640,3280657407,UA @@ -53424,7 +87321,7 @@ 3280658432,3280666623,GB 3280666624,3280732159,NO 3280732160,3280764927,DE -3280764928,3280765951,RU +3280764928,3280765951,TJ 3280765952,3280766975,DK 3280766976,3280767999,AT 3280768000,3280769023,FR @@ -53433,7 +87330,7 @@ 3280771072,3280772095,PL 3280772096,3280773119,ES 3280773120,3280774143,UA -3280774144,3280775167,CS +3280774144,3280775167,ME 3280775168,3280776191,UA 3280776192,3280777215,SE 3280777216,3280778239,UA @@ -53447,8 +87344,7 @@ 3280785408,3280787455,DE 3280787456,3280788479,GB 3280788480,3280789503,PL -3280789504,3280790527,UA -3280790528,3280791551,NL +3280789504,3280791551,UA 3280791552,3280792575,DE 3280792576,3280793599,PL 3280793600,3280794623,NL @@ -53461,7 +87357,1360 @@ 3280844293,3280844295,GB 3280844296,3280863231,CH 3280863232,3280928767,TR -3280928768,3280994303,DE +3280928768,3280928768,GB +3280928769,3280928769,DE +3280928770,3280928771,GB +3280928772,3280928791,DE +3280928792,3280928799,GB +3280928800,3280928815,DE +3280928816,3280928831,GB +3280928832,3280928843,DE +3280928844,3280928847,GB +3280928848,3280928849,DE +3280928850,3280928854,GB +3280928855,3280928859,DE +3280928860,3280928895,GB +3280928896,3280928906,DE +3280928907,3280928907,GB +3280928908,3280928927,DE +3280928928,3280928960,GB +3280928961,3280928961,DE +3280928962,3280928962,GB +3280928963,3280928963,DE +3280928964,3280928964,GB +3280928965,3280928965,DE +3280928966,3280928991,GB +3280928992,3280928998,DE +3280928999,3280929007,GB +3280929008,3280929015,DE +3280929016,3280929055,GB +3280929056,3280929096,DE +3280929097,3280929098,GB +3280929099,3280929099,DE +3280929100,3280929100,GB +3280929101,3280929101,DE +3280929102,3280929119,GB +3280929120,3280929151,DE +3280929152,3280929183,GB +3280929184,3280929247,DE +3280929248,3280929255,GB +3280929256,3280929259,DE +3280929260,3280929263,GB +3280929264,3280929271,DE +3280929272,3280929272,GB +3280929273,3280929273,DE +3280929274,3280929274,GB +3280929275,3280929276,DE +3280929277,3280929277,GB +3280929278,3280929278,DE +3280929279,3280929343,GB +3280929344,3280929367,DE +3280929368,3280929375,GB +3280929376,3280929395,DE +3280929396,3280929399,GB +3280929400,3280929403,DE +3280929404,3280929404,GB +3280929405,3280929406,DE +3280929407,3280929455,GB +3280929456,3280929487,DE +3280929488,3280929503,GB +3280929504,3280929527,DE +3280929528,3280929531,GB +3280929532,3280929534,DE +3280929535,3280929551,GB +3280929552,3280929583,DE +3280929584,3280929599,GB +3280929600,3280929615,DE +3280929616,3280929631,GB +3280929632,3280929641,DE +3280929642,3280929642,GB +3280929643,3280929645,DE +3280929646,3280929647,GB +3280929648,3280929655,DE +3280929656,3280929663,GB +3280929664,3280929695,DE +3280929696,3280929696,GB +3280929697,3280929697,DE +3280929698,3280929698,GB +3280929699,3280929699,DE +3280929700,3280929700,GB +3280929701,3280929703,DE +3280929704,3280929711,GB +3280929712,3280929727,DE +3280929728,3280929792,GB +3280929793,3280929799,DE +3280929800,3280929827,GB +3280929828,3280929839,DE +3280929840,3280929855,GB +3280929856,3280929887,DE +3280929888,3280929888,GB +3280929889,3280929889,DE +3280929890,3280930047,GB +3280930048,3280930079,DE +3280930080,3280930087,GB +3280930088,3280930091,DE +3280930092,3280930095,GB +3280930096,3280930111,DE +3280930112,3280930127,GB +3280930128,3280930155,DE +3280930156,3280930175,GB +3280930176,3280930177,DE +3280930178,3280930180,GB +3280930181,3280930182,DE +3280930183,3280930190,GB +3280930191,3280930191,DE +3280930192,3280930197,GB +3280930198,3280930198,DE +3280930199,3280930199,GB +3280930200,3280930239,DE +3280930240,3280930351,GB +3280930352,3280930367,DE +3280930368,3280930383,GB +3280930384,3280930391,DE +3280930392,3280930407,GB +3280930408,3280930420,DE +3280930421,3280930421,GB +3280930422,3280930431,DE +3280930432,3280930464,GB +3280930465,3280930465,DE +3280930466,3280930466,GB +3280930467,3280930495,DE +3280930496,3280930511,GB +3280930512,3280930515,DE +3280930516,3280930524,GB +3280930525,3280930535,DE +3280930536,3280930537,GB +3280930538,3280930541,DE +3280930542,3280930561,GB +3280930562,3280930562,DE +3280930563,3280930563,GB +3280930564,3280930575,DE +3280930576,3280930579,GB +3280930580,3280930591,DE +3280930592,3280930639,GB +3280930640,3280930655,DE +3280930656,3280930671,GB +3280930672,3280930687,DE +3280930688,3280930719,GB +3280930720,3280930731,DE +3280930732,3280930735,GB +3280930736,3280930743,DE +3280930744,3280930747,GB +3280930748,3280930759,DE +3280930760,3280930767,GB +3280930768,3280930771,DE +3280930772,3280930779,GB +3280930780,3280930783,DE +3280930784,3280930807,GB +3280930808,3280930812,DE +3280930813,3280930818,GB +3280930819,3280930819,DE +3280930820,3280930822,GB +3280930823,3280930823,DE +3280930824,3280930863,GB +3280930864,3280930868,DE +3280930869,3280930869,GB +3280930870,3280930870,DE +3280930871,3280930879,GB +3280930880,3280930911,DE +3280930912,3280930919,GB +3280930920,3280930927,DE +3280930928,3280930959,GB +3280930960,3280930983,DE +3280930984,3280931103,GB +3280931104,3280931119,DE +3280931120,3280931135,GB +3280931136,3280931143,DE +3280931144,3280931154,GB +3280931155,3280931155,DE +3280931156,3280931157,GB +3280931158,3280931158,DE +3280931159,3280931159,GB +3280931160,3280931167,DE +3280931168,3280931175,GB +3280931176,3280931180,DE +3280931181,3280931191,GB +3280931192,3280931193,DE +3280931194,3280931194,GB +3280931195,3280931199,DE +3280931200,3280931327,GB +3280931328,3280931631,DE +3280931632,3280931633,GB +3280931634,3280931634,DE +3280931635,3280931635,GB +3280931636,3280931639,DE +3280931640,3280931649,GB +3280931650,3280931650,DE +3280931651,3280931655,GB +3280931656,3280931663,DE +3280931664,3280931815,GB +3280931816,3280931819,DE +3280931820,3280931825,GB +3280931826,3280931826,DE +3280931827,3280931935,GB +3280931936,3280931943,DE +3280931944,3280931951,GB +3280931952,3280931983,DE +3280931984,3280932015,GB +3280932016,3280932031,DE +3280932032,3280932351,GB +3280932352,3280932367,DE +3280932368,3280932383,GB +3280932384,3280932399,DE +3280932400,3280932431,GB +3280932432,3280932455,DE +3280932456,3280932463,GB +3280932464,3280932472,DE +3280932473,3280932474,GB +3280932475,3280932477,DE +3280932478,3280932479,GB +3280932480,3280932495,DE +3280932496,3280932543,GB +3280932544,3280932559,DE +3280932560,3280932567,GB +3280932568,3280932575,DE +3280932576,3280932591,GB +3280932592,3280932607,DE +3280932608,3280932655,GB +3280932656,3280932663,DE +3280932664,3280932671,GB +3280932672,3280932687,DE +3280932688,3280932711,GB +3280932712,3280932735,DE +3280932736,3280932831,GB +3280932832,3280932847,DE +3280932848,3280932976,GB +3280932977,3280932983,DE +3280932984,3280932984,GB +3280932985,3280932985,DE +3280932986,3280932988,GB +3280932989,3280932989,DE +3280932990,3280932990,GB +3280932991,3280932991,DE +3280932992,3280933023,GB +3280933024,3280933039,DE +3280933040,3280933071,GB +3280933072,3280933087,DE +3280933088,3280933103,GB +3280933104,3280933119,DE +3280933120,3280933175,GB +3280933176,3280933215,DE +3280933216,3280933311,GB +3280933312,3280933375,DE +3280933376,3280933439,GB +3280933440,3280933451,DE +3280933452,3280933487,GB +3280933488,3280933519,DE +3280933520,3280933539,GB +3280933540,3280933551,DE +3280933552,3280933567,GB +3280933568,3280933599,DE +3280933600,3280933615,GB +3280933616,3280933616,DE +3280933617,3280933618,GB +3280933619,3280933620,DE +3280933621,3280933631,GB +3280933632,3280934399,DE +3280934400,3280934655,GB +3280934656,3280934863,DE +3280934864,3280934911,GB +3280934912,3280934943,DE +3280934944,3280935007,GB +3280935008,3280935015,DE +3280935016,3280935053,GB +3280935054,3280935055,DE +3280935056,3280935059,GB +3280935060,3280935063,DE +3280935064,3280935119,GB +3280935120,3280935127,DE +3280935128,3280935135,GB +3280935136,3280935167,DE +3280935168,3280935247,GB +3280935248,3280935263,DE +3280935264,3280935344,GB +3280935345,3280935345,DE +3280935346,3280935347,GB +3280935348,3280935351,DE +3280935352,3280935807,GB +3280935808,3280935823,DE +3280935824,3280935856,GB +3280935857,3280935858,DE +3280935859,3280935859,GB +3280935860,3280935863,DE +3280935864,3280935887,GB +3280935888,3280935903,DE +3280935904,3280936039,GB +3280936040,3280936048,DE +3280936049,3280936052,GB +3280936053,3280936053,DE +3280936054,3280936054,GB +3280936055,3280936063,DE +3280936064,3280936143,GB +3280936144,3280936159,DE +3280936160,3280936191,GB +3280936192,3280936319,DE +3280936320,3280936463,GB +3280936464,3280936479,DE +3280936480,3280936495,GB +3280936496,3280936498,DE +3280936499,3280936500,GB +3280936501,3280936501,DE +3280936502,3280936504,GB +3280936505,3280936505,DE +3280936506,3280936506,GB +3280936507,3280936510,DE +3280936511,3280936511,GB +3280936512,3280936512,DE +3280936513,3280936519,GB +3280936520,3280936523,DE +3280936524,3280936559,GB +3280936560,3280936567,DE +3280936568,3280936575,GB +3280936576,3280936583,DE +3280936584,3280936591,GB +3280936592,3280936655,DE +3280936656,3280936999,GB +3280937000,3280937003,DE +3280937004,3280937007,GB +3280937008,3280937023,DE +3280937024,3280937639,GB +3280937640,3280937643,DE +3280937644,3280937919,GB +3280937920,3280937935,DE +3280937936,3280937999,GB +3280938000,3280938003,DE +3280938004,3280938167,GB +3280938168,3280938175,DE +3280938176,3280938207,GB +3280938208,3280938223,DE +3280938224,3280938236,GB +3280938237,3280938237,DE +3280938238,3280938271,GB +3280938272,3280938279,DE +3280938280,3280938283,GB +3280938284,3280938284,DE +3280938285,3280938285,GB +3280938286,3280938286,DE +3280938287,3280938303,GB +3280938304,3280938367,DE +3280938368,3280938400,GB +3280938401,3280938401,DE +3280938402,3280938402,GB +3280938403,3280938407,DE +3280938408,3280938543,GB +3280938544,3280938591,DE +3280938592,3280938619,GB +3280938620,3280938623,DE +3280938624,3280938668,GB +3280938669,3280938669,DE +3280938670,3280938723,GB +3280938724,3280938751,DE +3280938752,3280938767,GB +3280938768,3280938815,DE +3280938816,3280938919,GB +3280938920,3280938931,DE +3280938932,3280939167,GB +3280939168,3280939175,DE +3280939176,3280939179,GB +3280939180,3280939183,DE +3280939184,3280939839,GB +3280939840,3280939871,DE +3280939872,3280939896,GB +3280939897,3280939900,DE +3280939901,3280939901,GB +3280939902,3280939902,DE +3280939903,3280939923,GB +3280939924,3280939924,DE +3280939925,3280939925,GB +3280939926,3280939926,DE +3280939927,3280939975,GB +3280939976,3280939977,DE +3280939978,3280939978,GB +3280939979,3280939979,DE +3280939980,3280939983,GB +3280939984,3280939999,DE +3280940000,3280940015,GB +3280940016,3280940023,DE +3280940024,3280940095,GB +3280940096,3280940103,DE +3280940104,3280940132,GB +3280940133,3280940135,DE +3280940136,3280940143,GB +3280940144,3280940151,DE +3280940152,3280940487,GB +3280940488,3280940495,DE +3280940496,3280940503,GB +3280940504,3280940511,DE +3280940512,3280940575,GB +3280940576,3280940599,DE +3280940600,3280940703,GB +3280940704,3280940719,DE +3280940720,3280940735,GB +3280940736,3280940767,DE +3280940768,3280940832,GB +3280940833,3280940833,DE +3280940834,3280940834,GB +3280940835,3280940835,DE +3280940836,3280940836,GB +3280940837,3280940837,DE +3280940838,3280940959,GB +3280940960,3280940967,DE +3280940968,3280941124,GB +3280941125,3280941127,DE +3280941128,3280941183,GB +3280941184,3280941199,DE +3280941200,3280941312,GB +3280941313,3280941314,DE +3280941315,3280941335,GB +3280941336,3280941343,DE +3280941344,3280941359,GB +3280941360,3280941367,DE +3280941368,3280941369,GB +3280941370,3280941370,DE +3280941371,3280941371,GB +3280941372,3280941373,DE +3280941374,3280941423,GB +3280941424,3280941439,DE +3280941440,3280941479,GB +3280941480,3280941484,DE +3280941485,3280941485,GB +3280941486,3280941523,DE +3280941524,3280941527,GB +3280941528,3280941551,DE +3280941552,3280941655,GB +3280941656,3280941663,DE +3280941664,3280941672,GB +3280941673,3280941675,DE +3280941676,3280941887,GB +3280941888,3280941888,DE +3280941889,3280941894,GB +3280941895,3280941895,DE +3280941896,3280941901,GB +3280941902,3280941902,DE +3280941903,3280941912,GB +3280941913,3280941919,DE +3280941920,3280941952,GB +3280941953,3280941953,DE +3280941954,3280941957,GB +3280941958,3280941958,DE +3280941959,3280941964,GB +3280941965,3280941967,DE +3280941968,3280941994,GB +3280941995,3280941996,DE +3280941997,3280941998,GB +3280941999,3280942000,DE +3280942001,3280942008,GB +3280942009,3280942009,DE +3280942010,3280942010,GB +3280942011,3280942011,DE +3280942012,3280942031,GB +3280942032,3280942047,DE +3280942048,3280942335,GB +3280942336,3280942351,DE +3280942352,3280942383,GB +3280942384,3280942399,DE +3280942400,3280942431,GB +3280942432,3280942471,DE +3280942472,3280943103,GB +3280943104,3280943359,DE +3280943360,3280943615,GB +3280943616,3280943679,DE +3280943680,3280943711,GB +3280943712,3280943743,DE +3280943744,3280943935,GB +3280943936,3280943943,DE +3280943944,3280943967,GB +3280943968,3280943983,DE +3280943984,3280944191,GB +3280944192,3280944199,DE +3280944200,3280944215,GB +3280944216,3280944219,DE +3280944220,3280944223,GB +3280944224,3280944225,DE +3280944226,3280944243,GB +3280944244,3280944247,DE +3280944248,3280944447,GB +3280944448,3280944527,DE +3280944528,3280944543,GB +3280944544,3280944575,DE +3280944576,3280944591,GB +3280944592,3280944607,DE +3280944608,3280944623,GB +3280944624,3280944639,DE +3280944640,3280945186,GB +3280945187,3280945189,DE +3280945190,3280945312,GB +3280945313,3280945313,DE +3280945314,3280945315,GB +3280945316,3280945317,DE +3280945318,3280945319,GB +3280945320,3280945323,DE +3280945324,3280945327,GB +3280945328,3280945335,DE +3280945336,3280945439,GB +3280945440,3280945503,DE +3280945504,3280945535,GB +3280945536,3280945551,DE +3280945552,3280945679,GB +3280945680,3280945695,DE +3280945696,3280945715,GB +3280945716,3280945719,DE +3280945720,3280945743,GB +3280945744,3280945751,DE +3280945752,3280945759,GB +3280945760,3280945767,DE +3280945768,3280945776,GB +3280945777,3280945777,DE +3280945778,3280945812,GB +3280945813,3280945814,DE +3280945815,3280945817,GB +3280945818,3280945818,DE +3280945819,3280945819,GB +3280945820,3280945820,DE +3280945821,3280945821,GB +3280945822,3280945823,DE +3280945824,3280945835,GB +3280945836,3280945840,DE +3280945841,3280945842,GB +3280945843,3280945843,DE +3280945844,3280945847,GB +3280945848,3280945853,DE +3280945854,3280945855,GB +3280945856,3280945919,DE +3280945920,3280946721,GB +3280946722,3280946722,DE +3280946723,3280946723,GB +3280946724,3280946724,DE +3280946725,3280948623,GB +3280948624,3280948639,DE +3280948640,3280948719,GB +3280948720,3280948735,DE +3280948736,3280949503,GB +3280949504,3280950015,DE +3280950016,3280950655,GB +3280950656,3280950687,DE +3280950688,3280951039,GB +3280951040,3280952063,DE +3280952064,3280952067,GB +3280952068,3280952079,DE +3280952080,3280952087,GB +3280952088,3280952095,DE +3280952096,3280952111,GB +3280952112,3280952119,DE +3280952120,3280952127,GB +3280952128,3280952159,DE +3280952160,3280952183,GB +3280952184,3280952191,DE +3280952192,3280952207,GB +3280952208,3280952223,DE +3280952224,3280952319,GB +3280952320,3280952323,DE +3280952324,3280952327,GB +3280952328,3280952343,DE +3280952344,3280952351,GB +3280952352,3280952359,DE +3280952360,3280952383,GB +3280952384,3280952559,DE +3280952560,3280952575,GB +3280952576,3280952623,DE +3280952624,3280952631,GB +3280952632,3280952687,DE +3280952688,3280952695,GB +3280952696,3280952703,DE +3280952704,3280952743,GB +3280952744,3280952767,DE +3280952768,3280952783,GB +3280952784,3280952815,DE +3280952816,3280953104,GB +3280953105,3280953135,DE +3280953136,3280953343,GB +3280953344,3280953371,DE +3280953372,3280953375,GB +3280953376,3280953383,DE +3280953384,3280953423,GB +3280953424,3280953431,DE +3280953432,3280953443,GB +3280953444,3280953444,DE +3280953445,3280953451,GB +3280953452,3280953454,DE +3280953455,3280953455,GB +3280953456,3280953463,DE +3280953464,3280953471,GB +3280953472,3280953475,DE +3280953476,3280953479,GB +3280953480,3280953487,DE +3280953488,3280953491,GB +3280953492,3280953492,DE +3280953493,3280953493,GB +3280953494,3280953494,DE +3280953495,3280953495,GB +3280953496,3280953503,DE +3280953504,3280953519,GB +3280953520,3280953527,DE +3280953528,3280953599,GB +3280953600,3280953663,DE +3280953664,3280953807,GB +3280953808,3280953823,DE +3280953824,3280954063,GB +3280954064,3280954079,DE +3280954080,3280954119,GB +3280954120,3280954127,DE +3280954128,3280954367,GB +3280954368,3280954495,DE +3280954496,3280955391,GB +3280955392,3280956927,DE +3280956928,3280956991,GB +3280956992,3280957007,DE +3280957008,3280957015,GB +3280957016,3280957019,DE +3280957020,3280957151,GB +3280957152,3280957167,DE +3280957168,3280957183,GB +3280957184,3280957199,DE +3280957200,3280957215,GB +3280957216,3280957231,DE +3280957232,3280957247,GB +3280957248,3280957249,DE +3280957250,3280957255,GB +3280957256,3280957263,DE +3280957264,3280957311,GB +3280957312,3280957695,DE +3280957696,3280957743,GB +3280957744,3280957791,DE +3280957792,3280957823,GB +3280957824,3280957839,DE +3280957840,3280957871,GB +3280957872,3280957887,DE +3280957888,3280957935,GB +3280957936,3280957943,DE +3280957944,3280958207,GB +3280958208,3280958223,DE +3280958224,3280958287,GB +3280958288,3280958335,DE +3280958336,3280958343,GB +3280958344,3280958350,DE +3280958351,3280958463,GB +3280958464,3280958851,DE +3280958852,3280958863,GB +3280958864,3280958871,DE +3280958872,3280958879,GB +3280958880,3280958915,DE +3280958916,3280958919,GB +3280958920,3280958927,DE +3280958928,3280958975,GB +3280958976,3280959231,DE +3280959232,3280959487,GB +3280959488,3280959711,DE +3280959712,3280959743,GB +3280959744,3280959935,DE +3280959936,3280959999,GB +3280960000,3280960039,DE +3280960040,3280960255,GB +3280960256,3280960287,DE +3280960288,3280960511,GB +3280960512,3280961279,DE +3280961280,3280961791,GB +3280961792,3280961807,DE +3280961808,3280961855,GB +3280961856,3280961863,DE +3280961864,3280961869,GB +3280961870,3280961871,DE +3280961872,3280961887,GB +3280961888,3280961919,DE +3280961920,3280962111,GB +3280962112,3280962175,DE +3280962176,3280962815,GB +3280962816,3280962831,DE +3280962832,3280962847,GB +3280962848,3280962887,DE +3280962888,3280963199,GB +3280963200,3280963263,DE +3280963264,3280963303,GB +3280963304,3280963311,DE +3280963312,3280963327,GB +3280963328,3280963583,DE +3280963584,3280963590,GB +3280963591,3280963591,DE +3280963592,3280963593,GB +3280963594,3280963595,DE +3280963596,3280963603,GB +3280963604,3280963604,DE +3280963605,3280963615,GB +3280963616,3280963616,DE +3280963617,3280963623,GB +3280963624,3280963631,DE +3280963632,3280963711,GB +3280963712,3280963719,DE +3280963720,3280963727,GB +3280963728,3280963735,DE +3280963736,3280963751,GB +3280963752,3280963767,DE +3280963768,3280963775,GB +3280963776,3280963791,DE +3280963792,3280963823,GB +3280963824,3280963839,DE +3280963840,3280964095,GB +3280964096,3280964351,DE +3280964352,3280965631,GB +3280965632,3280965887,DE +3280965888,3280965951,GB +3280965952,3280965967,DE +3280965968,3280966015,GB +3280966016,3280966079,DE +3280966080,3280966127,GB +3280966128,3280966143,DE +3280966144,3280967167,GB +3280967168,3280967455,DE +3280967456,3280967535,GB +3280967536,3280967551,DE +3280967552,3280968447,GB +3280968448,3280968703,DE +3280968704,3280969039,GB +3280969040,3280969087,DE +3280969088,3280969599,GB +3280969600,3280969603,DE +3280969604,3280969631,GB +3280969632,3280969647,DE +3280969648,3280970239,GB +3280970240,3280970399,DE +3280970400,3280970431,GB +3280970432,3280970463,DE +3280970464,3280970507,GB +3280970508,3280970511,DE +3280970512,3280970575,GB +3280970576,3280970579,DE +3280970580,3280970671,GB +3280970672,3280970687,DE +3280970688,3280970775,GB +3280970776,3280970783,DE +3280970784,3280970799,GB +3280970800,3280970815,DE +3280970816,3280970847,GB +3280970848,3280970863,DE +3280970864,3280970975,GB +3280970976,3280970991,DE +3280970992,3280971039,GB +3280971040,3280971055,DE +3280971056,3280971295,GB +3280971296,3280971327,DE +3280971328,3280971343,GB +3280971344,3280971351,DE +3280971352,3280971359,GB +3280971360,3280971391,DE +3280971392,3280971599,GB +3280971600,3280971615,DE +3280971616,3280971647,GB +3280971648,3280971743,DE +3280971744,3280971799,GB +3280971800,3280971807,DE +3280971808,3280971815,GB +3280971816,3280971819,DE +3280971820,3280971823,GB +3280971824,3280971839,DE +3280971840,3280972031,GB +3280972032,3280972063,DE +3280972064,3280972071,GB +3280972072,3280972079,DE +3280972080,3280972319,GB +3280972320,3280972335,DE +3280972336,3280972351,GB +3280972352,3280972415,DE +3280972416,3280974079,GB +3280974080,3280974335,DE +3280974336,3280974399,GB +3280974400,3280974415,DE +3280974416,3280974591,GB +3280974592,3280974847,DE +3280974848,3280976695,GB +3280976696,3280976719,DE +3280976720,3280976831,GB +3280976832,3280976847,DE +3280976848,3280976895,GB +3280976896,3280977407,DE +3280977408,3280977439,GB +3280977440,3280977479,DE +3280977480,3280977487,GB +3280977488,3280977495,DE +3280977496,3280977935,GB +3280977936,3280977936,DE +3280977937,3280977937,GB +3280977938,3280977938,DE +3280977939,3280977941,GB +3280977942,3280977942,DE +3280977943,3280977947,GB +3280977948,3280977959,DE +3280977960,3280977967,GB +3280977968,3280977969,DE +3280977970,3280977974,GB +3280977975,3280977975,DE +3280977976,3280977983,GB +3280977984,3280978007,DE +3280978008,3280978063,GB +3280978064,3280978079,DE +3280978080,3280978127,GB +3280978128,3280978143,DE +3280978144,3280978175,GB +3280978176,3280978191,DE +3280978192,3280978225,GB +3280978226,3280978226,DE +3280978227,3280978231,GB +3280978232,3280978239,DE +3280978240,3280978271,GB +3280978272,3280978279,DE +3280978280,3280978335,GB +3280978336,3280978367,DE +3280978368,3280978383,GB +3280978384,3280978415,DE +3280978416,3280978433,GB +3280978434,3280978441,DE +3280978442,3280978442,GB +3280978443,3280978443,DE +3280978444,3280978445,GB +3280978446,3280978479,DE +3280978480,3280978503,GB +3280978504,3280978507,DE +3280978508,3280978543,GB +3280978544,3280978552,DE +3280978553,3280978575,GB +3280978576,3280978591,DE +3280978592,3280978783,GB +3280978784,3280978799,DE +3280978800,3280978847,GB +3280978848,3280978863,DE +3280978864,3280978887,GB +3280978888,3280978891,DE +3280978892,3280979003,GB +3280979004,3280979007,DE +3280979008,3280979023,GB +3280979024,3280979044,DE +3280979045,3280979049,GB +3280979050,3280979051,DE +3280979052,3280979052,GB +3280979053,3280979053,DE +3280979054,3280979103,GB +3280979104,3280979111,DE +3280979112,3280979141,GB +3280979142,3280979142,DE +3280979143,3280979143,GB +3280979144,3280979147,DE +3280979148,3280979151,GB +3280979152,3280979159,DE +3280979160,3280979167,GB +3280979168,3280979183,DE +3280979184,3280979199,GB +3280979200,3280979215,DE +3280979216,3280979231,GB +3280979232,3280979247,DE +3280979248,3280979311,GB +3280979312,3280979327,DE +3280979328,3280979344,GB +3280979345,3280979345,DE +3280979346,3280979348,GB +3280979349,3280979350,DE +3280979351,3280979363,GB +3280979364,3280979364,DE +3280979365,3280979419,GB +3280979420,3280979420,DE +3280979421,3280979431,GB +3280979432,3280979435,DE +3280979436,3280979471,GB +3280979472,3280979479,DE +3280979480,3280979503,GB +3280979504,3280979519,DE +3280979520,3280979527,GB +3280979528,3280979535,DE +3280979536,3280979555,GB +3280979556,3280979559,DE +3280979560,3280979567,GB +3280979568,3280979568,DE +3280979569,3280979569,GB +3280979570,3280979571,DE +3280979572,3280979573,GB +3280979574,3280979574,DE +3280979575,3280979576,GB +3280979577,3280979577,DE +3280979578,3280979631,GB +3280979632,3280979647,DE +3280979648,3280979679,GB +3280979680,3280979695,DE +3280979696,3280979711,GB +3280979712,3280979743,DE +3280979744,3280979839,GB +3280979840,3280979975,DE +3280979976,3280980031,GB +3280980032,3280980039,DE +3280980040,3280980047,GB +3280980048,3280980071,DE +3280980072,3280980079,GB +3280980080,3280980081,DE +3280980082,3280980085,GB +3280980086,3280980086,DE +3280980087,3280980089,GB +3280980090,3280980090,DE +3280980091,3280980092,GB +3280980093,3280980093,DE +3280980094,3280980094,GB +3280980095,3280980095,DE +3280980096,3280980103,GB +3280980104,3280980111,DE +3280980112,3280980135,GB +3280980136,3280980143,DE +3280980144,3280980147,GB +3280980148,3280980151,DE +3280980152,3280980168,GB +3280980169,3280980170,DE +3280980171,3280980175,GB +3280980176,3280980183,DE +3280980184,3280980191,GB +3280980192,3280980199,DE +3280980200,3280980298,GB +3280980299,3280980299,DE +3280980300,3280980300,GB +3280980301,3280980304,DE +3280980305,3280980305,GB +3280980306,3280980307,DE +3280980308,3280980310,GB +3280980311,3280980311,DE +3280980312,3280980312,GB +3280980313,3280980313,DE +3280980314,3280980351,GB +3280980352,3280980367,DE +3280980368,3280980383,GB +3280980384,3280980399,DE +3280980400,3280980471,GB +3280980472,3280980479,DE +3280980480,3280980503,GB +3280980504,3280980508,DE +3280980509,3280980592,GB +3280980593,3280980594,DE +3280980595,3280980601,GB +3280980602,3280980602,DE +3280980603,3280980603,GB +3280980604,3280980606,DE +3280980607,3280980639,GB +3280980640,3280980647,DE +3280980648,3280980683,GB +3280980684,3280980703,DE +3280980704,3280980759,GB +3280980760,3280980767,DE +3280980768,3280980823,GB +3280980824,3280980827,DE +3280980828,3280980831,GB +3280980832,3280980847,DE +3280980848,3280980927,GB +3280980928,3280980991,DE +3280980992,3280980993,GB +3280980994,3280980996,DE +3280980997,3280981000,GB +3280981001,3280981001,DE +3280981002,3280981039,GB +3280981040,3280981055,DE +3280981056,3280981087,GB +3280981088,3280981111,DE +3280981112,3280981135,GB +3280981136,3280981151,DE +3280981152,3280981179,GB +3280981180,3280981183,DE +3280981184,3280981199,GB +3280981200,3280981207,DE +3280981208,3280981215,GB +3280981216,3280981231,DE +3280981232,3280981247,GB +3280981248,3280981375,DE +3280981376,3280981407,GB +3280981408,3280981415,DE +3280981416,3280981487,GB +3280981488,3280981503,DE +3280981504,3280981555,GB +3280981556,3280981556,DE +3280981557,3280981557,GB +3280981558,3280981558,DE +3280981559,3280981559,GB +3280981560,3280981561,DE +3280981562,3280981599,GB +3280981600,3280981615,DE +3280981616,3280981623,GB +3280981624,3280981647,DE +3280981648,3280981983,GB +3280981984,3280981999,DE +3280982000,3280982015,GB +3280982016,3280982023,DE +3280982024,3280982047,GB +3280982048,3280982051,DE +3280982052,3280982052,GB +3280982053,3280982053,DE +3280982054,3280982079,GB +3280982080,3280982095,DE +3280982096,3280982167,GB +3280982168,3280982175,DE +3280982176,3280982239,GB +3280982240,3280982263,DE +3280982264,3280982269,GB +3280982270,3280982270,DE +3280982271,3280982271,GB +3280982272,3280982287,DE +3280982288,3280982399,GB +3280982400,3280982431,DE +3280982432,3280982528,GB +3280982529,3280982529,DE +3280982530,3280982530,GB +3280982531,3280982531,DE +3280982532,3280982536,GB +3280982537,3280982537,DE +3280982538,3280982580,GB +3280982581,3280982582,DE +3280982583,3280982607,GB +3280982608,3280982671,DE +3280982672,3280982676,GB +3280982677,3280982677,DE +3280982678,3280982678,GB +3280982679,3280982679,DE +3280982680,3280982680,GB +3280982681,3280982686,DE +3280982687,3280982767,GB +3280982768,3280982783,DE +3280982784,3280982799,GB +3280982800,3280982815,DE +3280982816,3280982863,GB +3280982864,3280982864,DE +3280982865,3280982866,GB +3280982867,3280982867,DE +3280982868,3280982879,GB +3280982880,3280982895,DE +3280982896,3280982911,GB +3280982912,3280982931,DE +3280982932,3280982943,GB +3280982944,3280982975,DE +3280982976,3280983072,GB +3280983073,3280983073,DE +3280983074,3280983103,GB +3280983104,3280983104,DE +3280983105,3280983112,GB +3280983113,3280983113,DE +3280983114,3280983114,GB +3280983115,3280983183,DE +3280983184,3280983199,GB +3280983200,3280983215,DE +3280983216,3280983343,GB +3280983344,3280983375,DE +3280983376,3280983391,GB +3280983392,3280983407,DE +3280983408,3280983423,GB +3280983424,3280983431,DE +3280983432,3280983455,GB +3280983456,3280983471,DE +3280983472,3280983487,GB +3280983488,3280983515,DE +3280983516,3280983516,GB +3280983517,3280983517,DE +3280983518,3280983518,GB +3280983519,3280983527,DE +3280983528,3280983695,GB +3280983696,3280983711,DE +3280983712,3280983783,GB +3280983784,3280983791,DE +3280983792,3280983807,GB +3280983808,3280983815,DE +3280983816,3280983887,GB +3280983888,3280983919,DE +3280983920,3280983927,GB +3280983928,3280983939,DE +3280983940,3280983951,GB +3280983952,3280983975,DE +3280983976,3280983999,GB +3280984000,3280984007,DE +3280984008,3280984013,GB +3280984014,3280984014,DE +3280984015,3280984015,GB +3280984016,3280984031,DE +3280984032,3280984319,GB +3280984320,3280984335,DE +3280984336,3280984367,GB +3280984368,3280984399,DE +3280984400,3280984431,GB +3280984432,3280984443,DE +3280984444,3280984445,GB +3280984446,3280984495,DE +3280984496,3280984503,GB +3280984504,3280984511,DE +3280984512,3280984527,GB +3280984528,3280984535,DE +3280984536,3280984559,GB +3280984560,3280984567,DE +3280984568,3280984639,GB +3280984640,3280984640,DE +3280984641,3280984642,GB +3280984643,3280984643,DE +3280984644,3280984646,GB +3280984647,3280984647,DE +3280984648,3280984661,GB +3280984662,3280984662,DE +3280984663,3280984663,GB +3280984664,3280984671,DE +3280984672,3280984984,GB +3280984985,3280984985,DE +3280984986,3280984987,GB +3280984988,3280984988,DE +3280984989,3280984991,GB +3280984992,3280985007,DE +3280985008,3280985047,GB +3280985048,3280985055,DE +3280985056,3280985079,GB +3280985080,3280985087,DE +3280985088,3280985343,GB +3280985344,3280985415,DE +3280985416,3280985431,GB +3280985432,3280985435,DE +3280985436,3280985471,GB +3280985472,3280985631,DE +3280985632,3280985635,GB +3280985636,3280985647,DE +3280985648,3280985663,GB +3280985664,3280985679,DE +3280985680,3280985695,GB +3280985696,3280985703,DE +3280985704,3280985727,GB +3280985728,3280985735,DE +3280985736,3280985791,GB +3280985792,3280985823,DE +3280985824,3280985831,GB +3280985832,3280985832,DE +3280985833,3280985833,GB +3280985834,3280985834,DE +3280985835,3280986263,GB +3280986264,3280986267,DE +3280986268,3280986271,GB +3280986272,3280986303,DE +3280986304,3280986336,GB +3280986337,3280986337,DE +3280986338,3280986338,GB +3280986339,3280986339,DE +3280986340,3280986342,GB +3280986343,3280986343,DE +3280986344,3280986356,GB +3280986357,3280986357,DE +3280986358,3280986364,GB +3280986365,3280986365,DE +3280986366,3280986527,GB +3280986528,3280986541,DE +3280986542,3280986583,GB +3280986584,3280986599,DE +3280986600,3280986615,GB +3280986616,3280986619,DE +3280986620,3280986767,GB +3280986768,3280986775,DE +3280986776,3280986783,GB +3280986784,3280986799,DE +3280986800,3280986867,GB +3280986868,3280986871,DE +3280986872,3280987343,GB +3280987344,3280987359,DE +3280987360,3280987385,GB +3280987386,3280987387,DE +3280987388,3280987647,GB +3280987648,3280987679,DE +3280987680,3280987696,GB +3280987697,3280987697,DE +3280987698,3280987698,GB +3280987699,3280987699,DE +3280987700,3280987711,GB +3280987712,3280987727,DE +3280987728,3280987775,GB +3280987776,3280987855,DE +3280987856,3280987919,GB +3280987920,3280987935,DE +3280987936,3280987936,GB +3280987937,3280987939,DE +3280987940,3280987940,GB +3280987941,3280987942,DE +3280987943,3280988111,GB +3280988112,3280988127,DE +3280988128,3280988171,GB +3280988172,3280988175,DE +3280988176,3280988207,GB +3280988208,3280988215,DE +3280988216,3280988303,GB +3280988304,3280988311,DE +3280988312,3280988383,GB +3280988384,3280988391,DE +3280988392,3280988399,GB +3280988400,3280988431,DE +3280988432,3280988671,GB +3280988672,3280988679,DE +3280988680,3280988703,GB +3280988704,3280988719,DE +3280988720,3280988740,GB +3280988741,3280988741,DE +3280988742,3280988747,GB +3280988748,3280988751,DE +3280988752,3280988815,GB +3280988816,3280988831,DE +3280988832,3280988855,GB +3280988856,3280988879,DE +3280988880,3280988895,GB +3280988896,3280988903,DE +3280988904,3280988915,GB +3280988916,3280988916,DE +3280988917,3280988917,GB +3280988918,3280988918,DE +3280988919,3280988923,GB +3280988924,3280988943,DE +3280988944,3280989007,GB +3280989008,3280989010,DE +3280989011,3280989011,GB +3280989012,3280989012,DE +3280989013,3280989023,GB +3280989024,3280989039,DE +3280989040,3280989055,GB +3280989056,3280989063,DE +3280989064,3280989067,GB +3280989068,3280989071,DE +3280989072,3280989135,GB +3280989136,3280989151,DE +3280989152,3280989183,GB +3280989184,3280989187,DE +3280989188,3280989195,GB +3280989196,3280989199,DE +3280989200,3280989239,GB +3280989240,3280989243,DE +3280989244,3280989255,GB +3280989256,3280989263,DE +3280989264,3280989270,GB +3280989271,3280989279,DE +3280989280,3280989303,GB +3280989304,3280989311,DE +3280989312,3280989351,GB +3280989352,3280989359,DE +3280989360,3280989367,GB +3280989368,3280989371,DE +3280989372,3280989373,GB +3280989374,3280989391,DE +3280989392,3280989406,GB +3280989407,3280989407,DE +3280989408,3280989427,GB +3280989428,3280989439,DE +3280989440,3280989446,GB +3280989447,3280989447,DE +3280989448,3280989535,GB +3280989536,3280989551,DE +3280989552,3280989575,GB +3280989576,3280989583,DE +3280989584,3280989607,GB +3280989608,3280989615,DE +3280989616,3280989623,GB +3280989624,3280989631,DE +3280989632,3280989807,GB +3280989808,3280989811,DE +3280989812,3280989814,GB +3280989815,3280989815,DE +3280989816,3280989820,GB +3280989821,3280989821,DE +3280989822,3280989839,GB +3280989840,3280989847,DE +3280989848,3280990047,GB +3280990048,3280990079,DE +3280990080,3280990119,GB +3280990120,3280990143,DE +3280990144,3280990191,GB +3280990192,3280990223,DE +3280990224,3280990231,GB +3280990232,3280990239,DE +3280990240,3280990271,GB +3280990272,3280990287,DE +3280990288,3280990335,GB +3280990336,3280990367,DE +3280990368,3280990377,GB +3280990378,3280990379,DE +3280990380,3280990491,GB +3280990492,3280990495,DE +3280990496,3280990511,GB +3280990512,3280990527,DE +3280990528,3280990575,GB +3280990576,3280990599,DE +3280990600,3280990607,GB +3280990608,3280990623,DE +3280990624,3280990647,GB +3280990648,3280990687,DE +3280990688,3280990703,GB +3280990704,3280990719,DE +3280990720,3280990751,GB +3280990752,3280990767,DE +3280990768,3280990847,GB +3280990848,3280990871,DE +3280990872,3280990872,GB +3280990873,3280990873,DE +3280990874,3280990875,GB +3280990876,3280990879,DE +3280990880,3280990901,GB +3280990902,3280990902,DE +3280990903,3280990903,GB +3280990904,3280990905,DE +3280990906,3280990908,GB +3280990909,3280990910,DE +3280990911,3280990911,GB +3280990912,3280990927,DE +3280990928,3280990963,GB +3280990964,3280990964,DE +3280990965,3280990968,GB +3280990969,3280990969,DE +3280990970,3280990975,GB +3280990976,3280990983,DE +3280990984,3280991027,GB +3280991028,3280991028,DE +3280991029,3280991031,GB +3280991032,3280991055,DE +3280991056,3280991199,GB +3280991200,3280991211,DE +3280991212,3280991359,GB +3280991360,3280991375,DE +3280991376,3280991391,GB +3280991392,3280991407,DE +3280991408,3280991422,GB +3280991423,3280991423,DE +3280991424,3280991743,GB +3280991744,3280992007,DE +3280992008,3280992095,GB +3280992096,3280992111,DE +3280992112,3280992131,GB +3280992132,3280992135,DE +3280992136,3280992159,GB +3280992160,3280992207,DE +3280992208,3280992219,GB +3280992220,3280992223,DE +3280992224,3280992231,GB +3280992232,3280992239,DE +3280992240,3280992319,GB +3280992320,3280992335,DE +3280992336,3280992367,GB +3280992368,3280992383,DE +3280992384,3280992391,GB +3280992392,3280992415,DE +3280992416,3280992495,GB +3280992496,3280992503,DE +3280992504,3280992508,GB +3280992509,3280992509,DE +3280992510,3280992543,GB +3280992544,3280992551,DE +3280992552,3280992575,GB +3280992576,3280992591,DE +3280992592,3280992767,GB +3280992768,3280992775,DE +3280992776,3280992783,GB +3280992784,3280992799,DE +3280992800,3280992847,GB +3280992848,3280992863,DE +3280992864,3280992871,GB +3280992872,3280992879,DE +3280992880,3280993119,GB +3280993120,3280993135,DE +3280993136,3280993159,GB +3280993160,3280993175,DE +3280993176,3280993199,GB +3280993200,3280993215,DE +3280993216,3280993247,GB +3280993248,3280993263,DE +3280993264,3280993535,GB +3280993536,3280994303,DE 3280994304,3280994559,GB 3280994560,3280994815,RU 3280994816,3280995071,NL @@ -53476,7 +88725,8 @@ 3280997120,3280997375,FR 3280997376,3280997631,BE 3280997632,3280997887,SE -3280997888,3280998399,DE +3280997888,3280998143,UA +3280998144,3280998399,DE 3280998400,3280998655,GR 3280998656,3280999423,GB 3280999424,3280999679,HU @@ -53484,7 +88734,7 @@ 3280999936,3281000447,DE 3281000448,3281000703,FR 3281000704,3281000959,UA -3281000960,3281001215,RU +3281000960,3281001215,SI 3281001216,3281001471,RO 3281001472,3281001727,UA 3281001728,3281001983,RU @@ -53493,31 +88743,43 @@ 3281002496,3281010687,CH 3281010688,3281018879,BE 3281018880,3281027071,CZ +3281027072,3281027079,EU 3281027080,3281027087,GB +3281027088,3281027135,EU 3281027136,3281027151,GB +3281027152,3281027199,EU 3281027200,3281027215,GB +3281027216,3281027279,EU 3281027280,3281027287,GB +3281027288,3281027303,EU 3281027304,3281027311,GB +3281027312,3281027319,EU 3281027320,3281027327,GB +3281027328,3281027583,EU 3281027584,3281027615,GB +3281027616,3281027631,EU 3281027632,3281027679,GB +3281027680,3281027695,EU 3281027696,3281027743,GB +3281027744,3281027775,EU 3281027776,3281027807,GB +3281027808,3281027839,EU 3281027840,3281027903,GB +3281027904,3281028063,EU 3281028064,3281028223,GB +3281028224,3281028991,EU 3281028992,3281029055,GB +3281029056,3281030399,EU 3281030400,3281035263,GB 3281035264,3281043455,CH 3281043456,3281059839,RU 3281059840,3281074671,DE 3281074672,3281074679,ES -3281074680,3281093951,DE -3281093952,3281093983,US -3281093984,3281103935,DE +3281074680,3281103935,DE 3281103936,3281103943,AT -3281103944,3281110015,DE -3281110016,3281110023,BE -3281110024,3281113703,DE +3281103944,3281104127,DE +3281104128,3281104383,FR +3281104384,3281113703,DE 3281113704,3281113711,BE 3281113712,3281125375,DE 3281125376,3281133567,SK @@ -53537,12 +88799,14 @@ 3281339392,3281339647,PL 3281339648,3281339903,GB 3281339904,3281340159,UA +3281340160,3281340415,SA 3281340416,3281340927,RO 3281340928,3281341183,DE 3281341184,3281341439,AT 3281341440,3281341695,DE 3281341696,3281341951,PL 3281341952,3281342207,DK +3281342208,3281342463,GB 3281342464,3281343231,DE 3281343232,3281343487,FI 3281343488,3281343743,GB @@ -53588,7 +88852,6 @@ 3281354752,3281359071,SE 3281359072,3281359103,AN 3281359104,3281371135,SE -3281371136,3281373183,AT 3281373184,3281375231,RU 3281375232,3281377279,ES 3281377280,3281379327,AT @@ -53601,9 +88864,7 @@ 3281471232,3281518591,RU 3281518592,3281578431,GB 3281578432,3281578447,IE -3281578448,3281599183,GB -3281599184,3281599199,BE -3281599200,3281640959,GB +3281578448,3281640959,GB 3281640960,3281640983,SE 3281640984,3281641023,GB 3281641024,3281641039,SE @@ -53614,9 +88875,7 @@ 3281700000,3281700031,US 3281700032,3281703551,FR 3281703552,3281703615,US -3281703616,3281706687,FR -3281706688,3281706719,US -3281706720,3281710799,FR +3281703616,3281710799,FR 3281710800,3281710815,US 3281710816,3281711487,FR 3281711488,3281711519,BE @@ -53624,12 +88883,20 @@ 3281712128,3281712159,US 3281712160,3281712191,FR 3281712192,3281712255,US -3281712256,3281712831,FR -3281712832,3281712895,US -3281712896,3281715199,FR +3281712256,3281715199,FR 3281715200,3281780735,TR -3281780736,3281846271,FI -3281846272,3281911807,GB +3281780736,3281836543,FI +3281836544,3281836799,AX +3281836800,3281846271,FI +3281846272,3281861407,GB +3281861408,3281861423,FR +3281861424,3281868271,GB +3281868272,3281868287,FR +3281868288,3281880191,GB +3281880192,3281880223,FR +3281880224,3281886207,GB +3281886208,3281886335,FR +3281886336,3281911807,GB 3281911808,3281919999,UZ 3281920000,3281928191,DE 3281928192,3281944575,MT @@ -53638,7 +88905,7 @@ 3281969152,3281969663,RU 3281969664,3281970175,PL 3281970176,3281970687,RU -3281970688,3281971199,CH +3281970688,3281971199,LI 3281971200,3281971711,RU 3281971712,3281972223,RO 3281972224,3281972735,DE @@ -53650,10 +88917,13 @@ 3281975296,3281976319,RU 3281976320,3281976831,DE 3281976832,3281977343,RU -3281977344,3282042879,NO +3281977344,3281999095,NO +3281999096,3281999103,US +3281999104,3282042879,NO 3282042880,3282083839,CH 3282083840,3282084351,DE -3282084352,3282085375,RO +3282084352,3282084863,RO +3282084864,3282085375,RU 3282085376,3282085887,BE 3282085888,3282086399,DE 3282086400,3282086911,LV @@ -53668,7 +88938,7 @@ 3282091520,3282092031,CH 3282092032,3282093055,UA 3282093056,3282095103,DE -3282095104,3282096127,RO +3282095104,3282096127,UA 3282096128,3282097151,IT 3282097152,3282098175,GB 3282098176,3282099199,NL @@ -53688,8 +88958,24 @@ 3282149472,3282149599,RU 3282149600,3282149631,GB 3282149632,3282173951,RU +3282173952,3282174463,UA +3282174464,3282174975,GB +3282174976,3282177023,RU +3282177024,3282177535,GB +3282177536,3282178047,KZ +3282178048,3282178559,PL +3282178560,3282179071,ES +3282179072,3282179583,GB +3282179584,3282180095,RU +3282180096,3282180607,PL +3282180608,3282181119,KZ +3282181120,3282181631,GB +3282181632,3282182143,DE 3282182144,3282190335,RU -3282190336,3282194431,SE +3282194432,3282195455,UA +3282195456,3282196479,IE +3282196480,3282197503,UA +3282197504,3282198527,RU 3282198528,3282206719,GB 3282206720,3282223103,CH 3282223104,3282231295,BE @@ -53697,24 +88983,31 @@ 3282239488,3282242223,SE 3282242224,3282242227,NO 3282242228,3282284543,SE -3282284544,3282284559,FI -3282284560,3282284579,SE -3282284580,3282284591,FI -3282284592,3282284671,SE -3282284672,3282284703,FI -3282284704,3282284783,SE -3282284784,3282284927,FI -3282284928,3282286975,SE +3282284544,3282284551,FI +3282284552,3282284567,SE +3282284568,3282284575,FR +3282284576,3282284579,FI +3282284580,3282284591,SE +3282284592,3282284595,FR +3282284596,3282284599,SE +3282284600,3282284603,FR +3282284604,3282284735,SE +3282284736,3282284783,FI +3282284784,3282286975,SE 3282286976,3282287007,FI 3282287008,3282287615,SE 3282287616,3282287759,FI 3282287760,3282305023,SE 3282305024,3282370559,PL -3282370560,3282388175,FI +3282370560,3282388095,FI +3282388096,3282388159,AX +3282388160,3282388175,FI 3282388176,3282388191,SE 3282388192,3282390015,FI 3282390016,3282390271,NL -3282390272,3282416383,FI +3282390272,3282408527,FI +3282408528,3282408535,AX +3282408536,3282416383,FI 3282416384,3282416511,RU 3282416512,3282429279,FI 3282429280,3282429311,SE @@ -53747,6 +89040,7 @@ 3282467360,3282477055,GB 3282477056,3282485247,RU 3282485248,3282493439,GI +3282493440,3282501631,NG 3282501632,3282534399,GR 3282534400,3282550783,GB 3282550784,3282554879,FR @@ -53763,7 +89057,7 @@ 3282739200,3282739455,CH 3282739456,3282739711,RO 3282739712,3282739967,FR -3282739968,3282740223,UA +3282739968,3282740223,IR 3282740224,3282740479,FR 3282740480,3282740735,AT 3282740736,3282740991,BG @@ -53773,14 +89067,16 @@ 3282741760,3282742015,ES 3282742016,3282742527,RO 3282742528,3282742783,GB +3282742784,3282743039,RU 3282743040,3282743295,CH 3282743296,3282743551,CY 3282743552,3282743807,SI 3282743808,3282744063,MD 3282744064,3282744319,UA 3282744320,3282744575,SA -3282744576,3282745087,PL -3282745088,3282745343,CS +3282744576,3282744831,LT +3282744832,3282745087,PL +3282745088,3282745343,RS 3282745344,3282745599,HU 3282745600,3282746111,DE 3282746112,3282746367,SE @@ -53788,26 +89084,20 @@ 3282746624,3282746879,SE 3282746880,3282747135,RO 3282747136,3282747391,PL -3282747392,3282749183,RU -3282749184,3282749439,AM -3282749440,3282763775,RU +3282747392,3282763775,RU 3282763776,3282772991,GB 3282772992,3282773119,BE -3282773120,3282805727,GB -3282805728,3282805759,IE -3282805760,3282952191,GB +3282773120,3282844855,GB +3282844856,3282844863,A2 +3282844864,3282952191,GB 3282952192,3282960383,NL 3282960384,3283091455,TR 3283091456,3283156991,CH 3283156992,3283158215,DE 3283158216,3283158219,EE -3283158220,3283158547,DE -3283158548,3283158551,AT -3283158552,3283160171,DE +3283158220,3283160171,DE 3283160172,3283160175,BE -3283160176,3283162063,DE -3283162064,3283162071,BE -3283162072,3283173375,DE +3283160176,3283173375,DE 3283173376,3283174399,PL 3283174400,3283176447,UA 3283176448,3283177471,GB @@ -53841,7 +89131,7 @@ 3283213824,3283214335,UA 3283214336,3283214847,RO 3283214848,3283215359,RU -3283215360,3283215871,SE +3283215360,3283215871,AT 3283215872,3283216383,TR 3283216384,3283216895,DE 3283216896,3283217407,CH @@ -53852,26 +89142,23 @@ 3283220480,3283220991,BG 3283220992,3283221503,AT 3283221504,3283222015,GB -3283222016,3283230719,DE -3283230720,3283232767,CS -3283232768,3283232895,CS -3283232896,3283233023,CS -3283233024,3283233279,CS -3283233280,3283233343,RS -3283233344,3283234815,CS -3283234816,3283235071,CS -3283235072,3283237631,CS -3283237632,3283238335,CS -3283238336,3283238399,CS -3283238400,3283238479,CS -3283238480,3283238527,CS -3283238528,3283238623,CS -3283238624,3283238655,CS -3283238656,3283238671,CS -3283238672,3283238687,CS -3283238688,3283238719,CS -3283238720,3283238783,CS -3283238784,3283238911,CS +3283222016,3283223039,DE +3283223040,3283223551,RU +3283223552,3283224063,NL +3283224064,3283224575,EU +3283224576,3283225087,BG +3283225088,3283225599,UA +3283225600,3283226111,RU +3283226112,3283226623,DK +3283226624,3283227135,RU +3283227136,3283227647,UA +3283227648,3283228159,RU +3283228160,3283228671,RO +3283228672,3283229183,RU +3283229184,3283229695,PL +3283229696,3283230207,IT +3283230208,3283230719,UA +3283230720,3283238911,RS 3283238912,3283247103,CZ 3283247104,3283247615,LV 3283247616,3283248127,BG @@ -53883,7 +89170,7 @@ 3283250688,3283251199,RO 3283251200,3283251711,FR 3283251712,3283252223,PL -3283252224,3283252735,SE +3283252224,3283252735,BG 3283252736,3283253247,SI 3283253248,3283253759,RO 3283253760,3283254271,PL @@ -53894,15 +89181,32 @@ 3283279872,3283288063,SE 3283288064,3283288575,DE 3283288576,3283288579,BE -3283288580,3283305087,DE +3283288580,3283291487,DE +3283291488,3283291491,ES +3283291492,3283304919,DE +3283304920,3283304923,ES +3283304924,3283305087,DE 3283305088,3283305127,FR -3283305128,3283321087,DE +3283305128,3283305711,DE +3283305712,3283305715,ES +3283305716,3283318687,DE +3283318688,3283318691,ES +3283318692,3283318975,DE +3283318976,3283318991,NL +3283318992,3283318999,ES +3283319000,3283319167,DE +3283319168,3283319171,ES +3283319172,3283321087,DE 3283321088,3283321119,GB -3283321120,3283321167,DE -3283321168,3283321175,AT -3283321176,3283355735,DE -3283355736,3283355743,AT -3283355744,3283419135,DE +3283321120,3283321151,DE +3283321152,3283321155,ES +3283321156,3283321711,DE +3283321712,3283321715,ES +3283321716,3283321871,DE +3283321872,3283321875,ES +3283321876,3283329923,DE +3283329924,3283329927,ES +3283329928,3283419135,DE 3283419136,3283484671,DK 3283484672,3283484927,UA 3283484928,3283485183,NL @@ -53914,9 +89218,10 @@ 3283486464,3283486719,UA 3283486720,3283486975,RU 3283486976,3283487231,PL -3283487232,3283487487,RU +3283487232,3283487487,FR 3283487488,3283487743,DE -3283487744,3283488255,CH +3283487744,3283487999,CH +3283488000,3283488255,NL 3283488256,3283488511,PL 3283488512,3283488767,RU 3283488768,3283489279,FR @@ -53964,14 +89269,27 @@ 3283500800,3283501055,UA 3283501056,3283509247,LT 3283509248,3283513375,DE +3283513376,3283513407,EU 3283513408,3283513415,DE +3283513416,3283513431,EU 3283513432,3283513435,DE -3283513448,3283514095,DE -3283514112,3283514495,DE +3283513436,3283513447,EU +3283513448,3283513519,DE +3283513520,3283513535,EU +3283513536,3283513855,DE +3283513856,3283513983,EU +3283513984,3283514095,DE +3283514096,3283514111,EU +3283514112,3283514463,DE +3283514464,3283514527,EU 3283514528,3283514547,DE +3283514548,3283514551,EU 3283514552,3283516415,DE -3283516736,3283516863,DE +3283516416,3283516799,EU +3283516800,3283516863,DE +3283516864,3283516991,EU 3283516992,3283517055,DE +3283517056,3283517183,EU 3283517184,3283517439,DE 3283517440,3283525631,RU 3283525632,3283533823,GB @@ -53981,24 +89299,33 @@ 3283535872,3283536383,GI 3283536384,3283536895,UA 3283536896,3283537407,DK -3283537408,3283537919,UA +3283537408,3283537919,PL 3283537920,3283538431,RO 3283538432,3283538943,IT -3283538944,3283539967,RO +3283538944,3283539455,RO +3283539456,3283539967,RS 3283539968,3283540479,DK 3283540480,3283540991,PL 3283540992,3283541503,RO 3283541504,3283542015,CH 3283542016,3283550207,IT 3283550208,3283550239,AT -3283550272,3283550335,AT +3283550240,3283550287,EU +3283550288,3283550319,AT +3283550320,3283550463,EU 3283550464,3283550623,AT 3283550624,3283550655,FR 3283550656,3283550719,GB 3283550720,3283552255,AT -3283552256,3283552319,IT +3283552256,3283552279,IT +3283552280,3283552287,EU +3283552288,3283552319,IT +3283552320,3283552351,EU 3283552352,3283552415,IT -3283552448,3283552575,IT +3283552416,3283552447,EU +3283552448,3283552495,IT +3283552496,3283552511,EU +3283552512,3283552575,IT 3283552576,3283552639,DE 3283552640,3283552671,IT 3283552672,3283552703,CH @@ -54012,6 +89339,7 @@ 3283553120,3283553151,GR 3283553152,3283553279,GB 3283553280,3283553535,IT +3283553536,3283553791,EU 3283553792,3283554047,GB 3283554048,3283554079,IT 3283554080,3283554095,ES @@ -54022,14 +89350,21 @@ 3283554256,3283554271,RU 3283554272,3283554303,GB 3283554304,3283554327,CH -3283554336,3283555743,CH +3283554328,3283554335,EU +3283554336,3283554367,CH +3283554368,3283554431,EU +3283554432,3283555743,CH 3283555744,3283555759,SE 3283555760,3283555775,DE 3283555776,3283555807,NL 3283555808,3283555839,DE 3283555840,3283556351,CH -3283556352,3283556623,FR +3283556352,3283556391,FR +3283556392,3283556399,EU +3283556400,3283556623,FR +3283556624,3283556671,EU 3283556672,3283556735,FR +3283556736,3283556863,EU 3283556864,3283558303,FR 3283558304,3283558335,DE 3283558336,3283558367,IT @@ -54038,6 +89373,7 @@ 3283558400,3283558431,RU 3283558432,3283558463,DE 3283558464,3283558535,RU +3283558536,3283558655,EU 3283558656,3283558751,FR 3283558752,3283558783,BE 3283558784,3283558799,GB @@ -54058,10 +89394,13 @@ 3283559680,3283559935,IT 3283559936,3283560191,GB 3283560192,3283560447,NO +3283560448,3283560703,EU 3283560704,3283560847,ZA +3283560848,3283560863,EU 3283560864,3283560895,SE 3283560896,3283560959,GB 3283560960,3283561215,BE +3283561216,3283561375,EU 3283561376,3283561407,GB 3283561408,3283561471,ES 3283561472,3283562495,GB @@ -54075,6 +89414,7 @@ 3283566016,3283566079,ZA 3283566080,3283566591,GB 3283566592,3283566719,PL +3283566720,3283566847,EU 3283566848,3283567103,NO 3283567104,3283567423,GB 3283567424,3283567455,DE @@ -54102,6 +89442,7 @@ 3283571168,3283571199,DE 3283571200,3283571711,GB 3283571712,3283571719,HU +3283571720,3283571743,EU 3283571744,3283571775,DE 3283571776,3283571839,GB 3283571840,3283571903,SE @@ -54118,24 +89459,30 @@ 3283572632,3283572639,CH 3283572640,3283572671,GB 3283572672,3283572735,DE +3283572736,3283573247,EU 3283573248,3283574527,GB +3283574528,3283574591,EU 3283574592,3283574607,GB 3283574608,3283574615,NL 3283574616,3283574623,GB 3283574624,3283574639,ZA 3283574640,3283574655,GB -3283574656,3283575039,DE +3283574656,3283575071,DE 3283575072,3283575087,NL -3283575088,3283575679,DE -3283575808,3283576415,DE +3283575088,3283576415,DE 3283576416,3283576447,ZA 3283576448,3283580159,DE +3283580160,3283580415,EU 3283580416,3283580455,DE +3283580456,3283580463,EU 3283580464,3283582975,DE -3283582976,3283583039,ZA -3283583072,3283583359,ZA +3283582976,3283583007,EU +3283583008,3283583359,ZA +3283583360,3283583487,EU 3283583488,3283583503,ZA +3283583504,3283583519,EU 3283583520,3283583615,ZA +3283583616,3283583743,EU 3283583744,3283583839,ZA 3283583840,3283583847,IT 3283583848,3283583871,GB @@ -54144,8 +89491,8 @@ 3283584032,3283584063,DE 3283584064,3283584127,IE 3283584128,3283585023,ZA -3283585032,3283585039,ES -3283585056,3283585279,ES +3283585024,3283585031,EU +3283585032,3283585279,ES 3283585280,3283585535,ZA 3283585536,3283585679,ES 3283585680,3283585695,IE @@ -54153,22 +89500,30 @@ 3283585728,3283585791,ES 3283585792,3283586047,IE 3283586048,3283586335,ES +3283586336,3283586343,EU 3283586344,3283586351,ES +3283586352,3283586367,EU 3283586368,3283586407,ES +3283586408,3283586415,EU 3283586416,3283586503,ES +3283586504,3283586559,EU 3283586560,3283586815,FR 3283586816,3283587071,DE 3283587072,3283587231,NL +3283587232,3283587327,EU 3283587328,3283587335,NL 3283587336,3283587343,GB 3283587344,3283587359,NL 3283587360,3283587391,SE 3283587392,3283587423,NL 3283587424,3283587431,SE +3283587432,3283587439,EU 3283587440,3283587447,GB 3283587448,3283587455,DE 3283587456,3283587487,CH +3283587488,3283587519,EU 3283587520,3283587551,CH +3283587552,3283587583,EU 3283587584,3283587647,NL 3283587648,3283587679,DE 3283587680,3283587711,CH @@ -54180,20 +89535,26 @@ 3283587904,3283587967,IE 3283587968,3283588095,DE 3283588096,3283588191,BE +3283588192,3283588223,EU 3283588224,3283588479,BE 3283588480,3283588543,AT 3283588544,3283588607,GB 3283588608,3283589119,BE +3283589120,3283589151,EU 3283589152,3283589791,DK 3283589792,3283589823,DE +3283589824,3283589839,EU 3283589840,3283589887,DE 3283589888,3283590143,DK -3283590144,3283590151,SE +3283590144,3283590159,EU 3283590160,3283590167,SE +3283590168,3283590175,EU 3283590176,3283590207,SE -3283590224,3283590231,SE -3283590272,3283590311,SE -3283590336,3283590351,SE +3283590208,3283590271,EU +3283590272,3283590319,SE +3283590320,3283590335,EU +3283590336,3283590359,SE +3283590360,3283590367,EU 3283590368,3283590527,SE 3283590528,3283590543,ZA 3283590544,3283590591,DE @@ -54219,10 +89580,12 @@ 3283593056,3283593087,IT 3283593088,3283593215,CH 3283593216,3283595263,IT -3283595264,3283596287,DE +3283595264,3283595775,DE +3283595776,3283596287,EU 3283596288,3283598127,GB -3283598128,3283598143,NL +3283598128,3283598143,EU 3283598144,3283598175,DE +3283598176,3283598207,EU 3283598208,3283598335,DE 3283598336,3283598639,GB 3283598640,3283598655,CH @@ -54245,6 +89608,7 @@ 3283600528,3283600543,FR 3283600544,3283600575,DE 3283600576,3283600607,IT +3283600608,3283600639,EU 3283600640,3283600671,ZA 3283600672,3283600703,DE 3283600704,3283600767,IT @@ -54264,7 +89628,9 @@ 3283602944,3283603007,CH 3283603008,3283603071,IT 3283603072,3283603199,CH +3283603200,3283603455,EU 3283603456,3283604479,GB +3283604480,3283604735,EU 3283604736,3283605503,GB 3283605504,3283606783,DE 3283606784,3283607359,BE @@ -54272,6 +89638,7 @@ 3283607424,3283607551,AT 3283607552,3283608575,BE 3283608576,3283608831,DE +3283608832,3283608895,EU 3283608896,3283608959,DE 3283608960,3283609087,IT 3283609088,3283610783,DE @@ -54284,6 +89651,7 @@ 3283613696,3283614079,CH 3283614080,3283614207,FR 3283614208,3283614975,CH +3283614976,3283615231,EU 3283615232,3283615743,CH 3283615744,3283623935,HU 3283623936,3283632127,DK @@ -54296,7 +89664,6 @@ 3283635712,3283636223,RU 3283636224,3283636735,UA 3283636736,3283637247,PL -3283637248,3283637759,FR 3283637760,3283638271,UA 3283638272,3283638783,PL 3283638784,3283639295,RU @@ -54318,25 +89685,26 @@ 3283650960,3283650975,CH 3283650976,3283651071,GB 3283651072,3283651135,IT -3283651136,3283651167,BE +3283651136,3283651167,EU 3283651168,3283651183,ES -3283651184,3283651199,BE +3283651184,3283651199,EU 3283651200,3283651263,HU 3283651264,3283651327,ZA -3283651328,3283651423,BE +3283651328,3283651423,EU 3283651424,3283651439,DE -3283651440,3283651463,BE +3283651440,3283651463,EU 3283651464,3283651471,DE -3283651472,3283651487,BE +3283651472,3283651487,EU 3283651488,3283651519,FR 3283651520,3283651583,IL 3283651584,3283651591,GB -3283651592,3283651599,BE +3283651592,3283651599,EU 3283651600,3283651615,DE -3283651616,3283651647,BE +3283651616,3283651647,EU 3283651648,3283651663,SE 3283651664,3283651671,RO -3283651672,3283651687,BE +3283651672,3283651679,BE +3283651680,3283651687,EU 3283651688,3283651695,IT 3283651696,3283651711,GB 3283651712,3283651727,CH @@ -54347,24 +89715,21 @@ 3283651840,3283651967,NL 3283651968,3283652031,DK 3283652032,3283652063,DE -3283652064,3283652071,BE +3283652064,3283652071,EU 3283652072,3283652079,GB -3283652080,3283652095,BE +3283652080,3283652095,EU 3283652096,3283652351,GB 3283652352,3283652479,IT -3283652480,3283652519,BE +3283652480,3283652519,EU 3283652520,3283652527,SE -3283652528,3283652543,BE +3283652528,3283652543,EU 3283652544,3283652575,FR 3283652576,3283652607,DE 3283652608,3283652863,NO 3283652864,3283653055,BE -3283653056,3283653087,DE -3283653088,3283653103,GR -3283653104,3283653119,DE -3283653120,3283653247,BE +3283653056,3283653247,EU 3283653248,3283653311,NO -3283653312,3283653503,BE +3283653312,3283653503,EU 3283653504,3283653631,GB 3283653632,3283653887,FR 3283653888,3283654015,SE @@ -54372,7 +89737,7 @@ 3283654144,3283654399,DE 3283654400,3283654655,CH 3283654656,3283654911,DK -3283654912,3283655039,BE +3283654912,3283655039,EU 3283655040,3283655167,DK 3283655168,3283655295,DE 3283655296,3283655423,BE @@ -54380,16 +89745,16 @@ 3283655680,3283655935,ES 3283655936,3283656191,ZA 3283656192,3283656223,GB -3283656224,3283656255,BE +3283656224,3283656255,EU 3283656256,3283656271,GB -3283656272,3283656303,BE +3283656272,3283656303,EU 3283656304,3283656311,GB -3283656312,3283656447,BE +3283656312,3283656447,EU 3283656448,3283656559,ES 3283656560,3283656575,FR -3283656576,3283656591,BE +3283656576,3283656591,EU 3283656592,3283656599,FR -3283656600,3283656703,BE +3283656600,3283656703,EU 3283656704,3283664895,HU 3283664896,3283673087,UA 3283673088,3283681279,GB @@ -54418,9 +89783,7 @@ 3283960832,3283961855,KZ 3283961856,3283962879,RU 3283962880,3283963903,PL -3283963904,3283964927,RU -3283964928,3283965951,FR -3283965952,3283966975,RU +3283964928,3283966975,PL 3283966976,3283967999,DE 3283968000,3283969023,UA 3283969024,3283970047,RU @@ -54445,18 +89808,18 @@ 3283984384,3283984895,SE 3283984896,3283985407,GR 3283985408,3283985919,RO -3283985920,3283986431,PL +3283985920,3283986431,AT 3283986432,3283986943,RU 3283986944,3283987455,AT 3283987456,3283987967,GB 3283987968,3283988991,RO 3283988992,3283989503,FR -3283989504,3283990015,IE +3283989504,3283990015,RU 3283990016,3283990527,SE 3283990528,3283991551,RO 3283991552,3283992063,SE 3283992064,3283992575,RO -3283992576,3283993087,RU +3283992576,3283993087,IL 3283993088,3283993599,RO 3283993600,3283994111,UA 3283994112,3283994623,AT @@ -54480,7 +89843,7 @@ 3284003840,3284004351,DE 3284004352,3284004863,RU 3284004864,3284005375,UA -3284005376,3284005887,NL +3284005376,3284005887,PA 3284005888,3284006399,DE 3284006400,3284007423,UA 3284007424,3284007935,RO @@ -54506,7 +89869,7 @@ 3284014336,3284014591,IT 3284014592,3284014847,GB 3284014848,3284015103,IL -3284015104,3284015359,PL +3284015104,3284015359,US 3284015360,3284015615,DK 3284015616,3284015871,AT 3284015872,3284016127,FR @@ -54514,7 +89877,52 @@ 3284016384,3284016639,CH 3284016640,3284017151,DK 3284017152,3284025343,GR -3284025344,3284033535,DE +3284025344,3284025359,DE +3284025360,3284025439,GB +3284025440,3284025471,DE +3284025472,3284025535,GB +3284025536,3284025567,DE +3284025568,3284026111,GB +3284026112,3284026479,DE +3284026480,3284026495,GB +3284026496,3284026623,DE +3284026624,3284026815,GB +3284026816,3284026879,DE +3284026880,3284027231,GB +3284027232,3284027359,DE +3284027360,3284027743,GB +3284027744,3284027775,DE +3284027776,3284027807,GB +3284027808,3284027903,DE +3284027904,3284028415,GB +3284028416,3284028671,DE +3284028672,3284028879,GB +3284028880,3284028895,DE +3284028896,3284028911,GB +3284028912,3284028927,DE +3284028928,3284029215,GB +3284029216,3284029311,DE +3284029312,3284029695,GB +3284029696,3284029791,DE +3284029792,3284029951,GB +3284029952,3284030463,DE +3284030464,3284030655,GB +3284030656,3284030687,DE +3284030688,3284030975,GB +3284030976,3284031167,DE +3284031168,3284031551,GB +3284031552,3284031615,DE +3284031616,3284031743,GB +3284031744,3284032031,DE +3284032032,3284032063,GB +3284032064,3284032095,DE +3284032096,3284032127,GB +3284032128,3284032255,DE +3284032256,3284032639,GB +3284032640,3284032703,DE +3284032704,3284032767,GB +3284032768,3284032895,DE +3284032896,3284033535,GB 3284033536,3284041727,RU 3284041728,3284041983,DK 3284041984,3284042239,SI @@ -54527,18 +89935,19 @@ 3284043776,3284044031,HR 3284044032,3284044287,FR 3284044288,3284044799,DE -3284044800,3284045055,CH +3284044800,3284045055,CZ 3284045056,3284045311,LT 3284045312,3284045567,DE 3284045568,3284045823,AT 3284045824,3284046079,UA 3284046080,3284046335,DE -3284046336,3284046591,DK +3284046336,3284046591,NL 3284046592,3284046847,SE 3284046848,3284047103,DE 3284047104,3284047359,DK 3284047360,3284047615,DE 3284047616,3284047871,NL +3284047872,3284048127,HU 3284048128,3284048383,DK 3284048384,3284048639,GB 3284048640,3284049151,FR @@ -54547,13 +89956,131 @@ 3284049664,3284049919,RO 3284049920,3284058111,CH 3284058112,3284066303,SE -3284066304,3284074495,NL -3284074496,3284140031,IT +3284066304,3284075007,NL +3284075008,3284075519,DE +3284075520,3284076031,RU +3284076032,3284076543,SA +3284076544,3284077055,PL +3284077056,3284077567,RU +3284077568,3284078079,UA +3284078080,3284078591,DE +3284078592,3284079103,NL +3284079104,3284079615,RU +3284079616,3284080127,DE +3284080128,3284080639,BE +3284080640,3284081151,UA +3284081152,3284081663,CH +3284081664,3284082175,IE +3284082176,3284082687,NO +3284082688,3284083199,RU +3284083200,3284083711,BG +3284083712,3284084223,RU +3284084224,3284084735,UA +3284084736,3284085247,RU +3284085248,3284085759,DE +3284085760,3284086783,RO +3284086784,3284087295,CZ +3284087296,3284087807,RU +3284087808,3284088319,IL +3284088320,3284088831,LV +3284088832,3284089855,UA +3284089856,3284090367,BG +3284090368,3284090879,PL +3284090880,3284091391,RU +3284091392,3284091903,GB +3284091904,3284092415,DE +3284092416,3284092927,GB +3284092928,3284093439,UA +3284093440,3284093951,IR +3284093952,3284094463,RU +3284094976,3284095487,UA +3284095488,3284095999,RU +3284096000,3284096511,IT +3284096512,3284097023,GB +3284097024,3284097535,RU +3284097536,3284098047,UA +3284098048,3284098559,DE +3284098560,3284099071,BG +3284099072,3284099583,RO +3284099584,3284100095,GR +3284100096,3284100607,AM +3284100608,3284101119,EU +3284101120,3284101631,UA +3284101632,3284102143,GB +3284102144,3284102655,DK +3284102656,3284103167,AT +3284103168,3284103679,NL +3284103680,3284104191,DE +3284104192,3284104703,NO +3284104704,3284105215,TR +3284105216,3284105727,NL +3284105728,3284106239,FI +3284106240,3284106751,RO +3284106752,3284107263,UA +3284107264,3284108287,RU +3284108288,3284108799,CH +3284108800,3284109311,FR +3284109312,3284109823,RU +3284109824,3284110335,UA +3284110336,3284110847,RU +3284110848,3284111359,DK +3284111360,3284111871,SE +3284111872,3284112383,RU +3284112384,3284112895,BG +3284112896,3284113919,NL +3284113920,3284114431,AM +3284114432,3284114943,GB +3284114944,3284115455,RU +3284115456,3284115967,RO +3284115968,3284116479,PL +3284116480,3284116991,NL +3284116992,3284117503,RU +3284117504,3284118015,UA +3284118016,3284118527,PL +3284118528,3284119039,FR +3284119040,3284120063,RU +3284120064,3284120575,UA +3284120576,3284121087,PL +3284121088,3284121599,RU +3284121600,3284122111,PL +3284122112,3284122623,AM +3284122624,3284123135,CH +3284123136,3284124159,RU +3284124160,3284124671,UA +3284124672,3284125183,DE +3284125184,3284125695,RO +3284125696,3284126207,UA +3284126208,3284127231,CZ +3284127232,3284127743,NL +3284127744,3284128255,RU +3284128256,3284128767,GB +3284128768,3284129279,CZ +3284129280,3284129791,UA +3284129792,3284130303,DE +3284130304,3284130815,GB +3284130816,3284131327,RU +3284131328,3284131839,HU +3284131840,3284132351,DE +3284132352,3284132863,UA +3284132864,3284133375,HU +3284133376,3284133887,TM +3284133888,3284134399,PL +3284134400,3284134911,UA +3284134912,3284135935,RU +3284135936,3284136447,CH +3284136448,3284136959,RU +3284136960,3284137471,FR +3284137472,3284137983,UA +3284137984,3284138495,PL +3284138496,3284139007,RU +3284139008,3284140031,AT 3284140032,3284205567,DK 3284205568,3284271103,NL 3284271104,3284402175,GB 3284402176,3284467711,SE -3284467712,3284531775,FI +3284467712,3284485155,FI +3284485156,3284485159,AX +3284485160,3284531775,FI 3284531776,3284531779,NL 3284531780,3284533247,FI 3284533248,3284598783,SE @@ -54574,10 +90101,11 @@ 3284686336,3284686847,RO 3284686848,3284687359,PL 3284687360,3284687871,UA -3284687872,3284688383,IL -3284688384,3284688895,RU +3284687872,3284688383,NG 3284688896,3284697087,FR -3284697088,3284705279,GB +3284697088,3284697215,GB +3284697216,3284697279,FR +3284697280,3284705279,GB 3284705280,3284713471,FR 3284713472,3284713727,DE 3284713728,3284713983,GR @@ -54609,13 +90137,37 @@ 3284720896,3284721151,UA 3284721152,3284721407,TR 3284721408,3284721663,NL -3284721664,3284721919,CA -3284721920,3284722943,IR -3284722944,3284729855,CA +3284721664,3284722175,BE +3284722176,3284722687,RU +3284722688,3284723199,FR +3284723200,3284723711,GB +3284723712,3284724223,RU +3284724224,3284724735,PL +3284724736,3284725247,RU +3284725248,3284725759,GR +3284725760,3284726271,LU +3284726272,3284726783,DE +3284726784,3284727295,UA +3284727296,3284727807,MK +3284727808,3284728319,RU +3284728320,3284728831,UA +3284728832,3284729343,PT +3284729344,3284729855,FR 3284729856,3284795391,RU 3284795392,3284803583,FR 3284803584,3284811775,DE -3284819968,3284828159,DE +3284811776,3284819967,KE +3284819968,3284820479,GB +3284820480,3284820495,DE +3284820496,3284822527,GB +3284822528,3284822783,DE +3284822784,3284823519,GB +3284823520,3284823527,DE +3284823528,3284825343,GB +3284825344,3284825359,DE +3284825360,3284825423,GB +3284825424,3284825439,DE +3284825440,3284828159,GB 3284828160,3284844543,AT 3284844544,3284860927,CH 3284860928,3284863743,DE @@ -54631,17 +90183,21 @@ 3284992000,3285057535,PL 3285057536,3285065727,IT 3285065728,3285073919,RU -3285073920,3285076607,NL +3285073920,3285074687,GB +3285074688,3285075199,NL +3285075200,3285076607,EU 3285076608,3285076767,BE -3285076768,3285078111,NL +3285076768,3285078111,EU 3285078112,3285078143,GB -3285078144,3285078175,NL +3285078144,3285078175,EU 3285078176,3285078191,GB -3285078192,3285079423,NL +3285078192,3285079423,EU 3285079424,3285079551,DE -3285079552,3285079967,NL +3285079552,3285079807,EU +3285079808,3285079935,NL +3285079936,3285079967,EU 3285079968,3285079999,DE -3285080000,3285082111,NL +3285080000,3285082111,EU 3285082112,3285084159,AT 3285084160,3285085183,LU 3285085184,3285086207,GB @@ -54650,7 +90206,20 @@ 3285089280,3285090303,PL 3285090304,3285098495,DE 3285098496,3285114879,GB -3285114880,3285123071,UA +3285114880,3285115903,RU +3285115904,3285116415,PL +3285116416,3285116927,RU +3285116928,3285117439,UA +3285117440,3285117951,RU +3285117952,3285118463,FR +3285118464,3285118975,UA +3285118976,3285119487,RU +3285119488,3285119999,RO +3285120000,3285120511,RU +3285120512,3285121023,RO +3285121024,3285121535,SE +3285121536,3285122047,CY +3285122048,3285123071,RU 3285123072,3285158639,BE 3285158640,3285158647,FR 3285158648,3285164367,BE @@ -54659,289 +90228,575 @@ 3285188608,3285265999,RU 3285266000,3285266007,CH 3285266008,3285319679,RU -3285319680,3285327871,CH -3285327872,3285328383,RU +3285319680,3285320191,HU +3285320192,3285320703,RU +3285320704,3285321215,RO +3285321216,3285321727,DE +3285321728,3285322239,RU +3285322240,3285322751,DE +3285322752,3285323263,PL +3285323264,3285323775,CZ +3285323776,3285324287,CH +3285324288,3285324799,DK +3285324800,3285325311,RU +3285325312,3285325823,GB +3285325824,3285326335,PL +3285326336,3285326847,DE +3285326848,3285327359,SK +3285327360,3285328383,RU 3285328384,3285328895,PL 3285328896,3285329407,SE 3285329408,3285329919,GB 3285329920,3285330431,RO 3285330432,3285330943,FR 3285330944,3285331455,RO -3285331456,3285331967,CH +3285331456,3285331967,KZ 3285331968,3285332991,DE 3285332992,3285333503,SE 3285333504,3285334015,GB 3285334016,3285334527,NL -3285334528,3285335551,DE +3285334528,3285335039,DE 3285335552,3285336063,SE 3285336064,3285352447,IT 3285352448,3285368831,RU 3285368832,3285385215,SI -3285385216,3285450751,DE +3285385216,3285386239,PL +3285386240,3285387263,RU +3285387264,3285388287,PL +3285388288,3285389311,CH +3285389312,3285390335,FI +3285390336,3285391359,RU +3285391360,3285392383,AM +3285392384,3285393407,RU +3285393408,3285394431,AT +3285394432,3285396479,RU +3285396480,3285397503,IR +3285397504,3285398527,NL +3285398528,3285399551,RU +3285399552,3285400575,NL +3285400576,3285401599,UA +3285401600,3285402623,RU +3285402624,3285403647,IL +3285403648,3285404671,NL +3285404672,3285406719,RU +3285406720,3285407743,UA +3285407744,3285408767,RU +3285408768,3285409791,GB +3285409792,3285410815,UA +3285410816,3285412863,RU +3285412864,3285413887,UA +3285413888,3285414911,RU +3285414912,3285415935,UA +3285415936,3285419007,RU +3285419008,3285420031,SE +3285420032,3285424127,UA +3285424128,3285425151,RO +3285425152,3285427199,UA +3285427200,3285428223,GB +3285428224,3285429247,RU +3285429248,3285430271,UA +3285430272,3285431295,DK +3285431296,3285432319,UZ +3285432320,3285434367,UA +3285434368,3285436415,RU +3285436416,3285437439,GR +3285437440,3285438463,RU +3285438464,3285440511,UA +3285440512,3285442559,RU +3285442560,3285443583,IE +3285443584,3285444607,UA +3285444608,3285446655,RU +3285446656,3285447679,UA +3285447680,3285449727,RU +3285449728,3285450751,UA 3285450752,3285453055,GB -3285453120,3285454047,GB +3285453056,3285453119,EU +3285453120,3285453415,GB +3285453416,3285453423,EU +3285453424,3285453439,GB +3285453440,3285453567,EU +3285453568,3285453623,GB +3285453624,3285453631,EU +3285453632,3285454047,GB +3285454048,3285454079,EU 3285454080,3285454175,GB +3285454176,3285454207,EU 3285454208,3285454847,GB -3285454848,3285455687,DE -3285455696,3285455887,DE -3285455888,3285455903,GB -3285455904,3285456255,DE +3285454848,3285455695,DE +3285455696,3285455711,EU +3285455712,3285455743,DE +3285455744,3285455871,EU +3285455872,3285455887,DE +3285455888,3285455895,EU +3285455896,3285455903,GB +3285455904,3285455935,EU +3285455936,3285456015,DE +3285456016,3285456031,EU +3285456032,3285456255,DE +3285456256,3285456287,EU 3285456288,3285456351,DE +3285456352,3285456383,EU 3285456384,3285456639,DE 3285456640,3285456703,DK -3285456704,3285456711,DE -3285456720,3285456743,DK -3285456760,3285456871,DK +3285456704,3285456735,EU +3285456736,3285456743,DK +3285456744,3285456751,EU +3285456752,3285456767,DK +3285456768,3285456831,EU +3285456832,3285456871,DK +3285456872,3285456879,EU 3285456880,3285456895,DK 3285456896,3285456959,GB -3285456976,3285456991,GB +3285456960,3285456975,EU +3285456976,3285457023,GB +3285457024,3285457055,EU 3285457056,3285457151,GB 3285457152,3285457183,SE -3285457216,3285457223,SE -3285457232,3285457407,SE +3285457184,3285457231,EU +3285457232,3285457247,SE +3285457248,3285457279,EU +3285457280,3285457407,SE 3285457408,3285457663,GB 3285457664,3285457759,IT +3285457760,3285457791,EU 3285457792,3285457919,IT -3285457920,3285458943,GB -3285458944,3285459071,DK -3285459104,3285459535,DK +3285457920,3285457951,GB +3285457952,3285457983,EU +3285457984,3285458095,GB +3285458096,3285458103,EU +3285458104,3285458111,GB +3285458112,3285458175,EU +3285458176,3285458943,GB +3285458944,3285458975,DK +3285458976,3285459007,EU +3285459008,3285459071,DK +3285459072,3285459119,EU +3285459120,3285459327,DK +3285459328,3285459391,EU +3285459392,3285459535,DK +3285459536,3285459543,EU 3285459544,3285459711,DK 3285459712,3285459967,NO 3285459968,3285460479,FI 3285460480,3285460991,DK 3285460992,3285461007,NL -3285461056,3285461087,NL -3285461104,3285461111,NL -3285461120,3285461167,NL -3285461176,3285461263,NL +3285461008,3285461055,EU +3285461056,3285461111,NL +3285461112,3285461119,EU +3285461120,3285461231,NL +3285461232,3285461247,EU +3285461248,3285461263,NL 3285461264,3285461279,BE +3285461280,3285461311,EU 3285461312,3285461375,CH -3285461376,3285461447,NL +3285461376,3285461407,NL +3285461408,3285461423,EU +3285461424,3285461439,NL +3285461440,3285461447,EU 3285461448,3285461455,DE -3285461456,3285461535,NL +3285461456,3285461503,NL +3285461504,3285461527,EU +3285461528,3285461535,NL +3285461536,3285461567,EU 3285461568,3285461807,NL -3285461856,3285461871,NL -3285461880,3285461951,NL -3285461960,3285461991,NL +3285461808,3285461855,EU +3285461856,3285461877,NL +3285461878,3285461879,EU +3285461880,3285461991,NL 3285461992,3285461999,GB 3285462000,3285462007,NL -3285462016,3285462183,DE +3285462008,3285462015,EU +3285462016,3285462175,DE +3285462176,3285462191,EU 3285462192,3285462207,DE 3285462208,3285462223,GB -3285462224,3285462287,DE -3285462296,3285462383,DE +3285462224,3285462367,DE +3285462368,3285462399,EU 3285462400,3285462527,DE +3285462528,3285462543,EU 3285462544,3285462655,DE +3285462656,3285462783,EU 3285462784,3285462831,AT +3285462832,3285462839,EU 3285462840,3285462847,AT -3285462880,3285462911,AT -3285462952,3285462975,AT +3285462848,3285462951,EU +3285462952,3285462959,AT +3285462960,3285463007,EU 3285463008,3285463039,AT -3285463040,3285463071,LU -3285463080,3285463087,LU +3285463040,3285463079,LU +3285463080,3285463103,EU +3285463104,3285463135,LU +3285463136,3285463295,EU 3285463296,3285463311,FR -3285463320,3285463359,FR -3285463360,3285463423,BE -3285463488,3285463519,GB +3285463312,3285463319,BE +3285463320,3285463327,FR +3285463328,3285463359,EU +3285463360,3285463455,BE +3285463456,3285463519,EU 3285463520,3285463615,BE 3285463616,3285463647,FR -3285463664,3285463671,GB -3285463672,3285463839,BE -3285463856,3285463935,BE -3285463944,3285463991,BE -3285464000,3285464095,BE +3285463648,3285463663,EU +3285463664,3285463743,BE +3285463744,3285463775,EU +3285463776,3285463839,BE +3285463840,3285463855,EU +3285463856,3285463991,BE +3285463992,3285464015,EU +3285464016,3285464063,BE +3285464064,3285464071,EU +3285464072,3285464095,BE 3285464096,3285464127,GB -3285464320,3285464383,BE +3285464128,3285464319,EU +3285464320,3285464351,BE +3285464352,3285464359,EU +3285464360,3285464383,BE 3285464384,3285464415,GB 3285464416,3285464431,BE 3285464432,3285464447,DE 3285464448,3285465087,BE 3285465088,3285465103,DK -3285465120,3285465135,DK -3285465152,3285465343,DK +3285465104,3285465151,EU +3285465152,3285465175,DK +3285465176,3285465215,EU +3285465216,3285465231,DK +3285465232,3285465247,EU +3285465248,3285465343,DK +3285465344,3285465663,EU 3285465664,3285465727,DE -3285465856,3285466367,DE -3285466368,3285466463,CH -3285466528,3285466551,CH +3285465728,3285465855,EU +3285465856,3285465903,DE +3285465904,3285465911,EU +3285465912,3285466367,DE +3285466368,3285466447,CH +3285466448,3285466455,EU +3285466456,3285466463,CH +3285466464,3285466527,EU +3285466528,3285466559,CH +3285466560,3285466623,EU 3285466624,3285466879,AT 3285466880,3285466895,BG -3285466912,3285466935,BG -3285466952,3285466967,BG -3285466984,3285467015,BG +3285466896,3285466911,EU +3285466912,3285466943,BG +3285466944,3285466951,EU +3285466952,3285466959,BG +3285466960,3285466983,EU +3285466984,3285467007,BG +3285467008,3285467015,EU +3285467016,3285467023,BG +3285467024,3285467135,EU 3285467136,3285467391,DE +3285467392,3285467663,EU 3285467664,3285467679,DE -3285467712,3285467743,DE -3285467832,3285467871,DE -3285467904,3285467919,DE -3285467928,3285467951,DE +3285467680,3285467831,EU +3285467832,3285467839,DE +3285467840,3285467935,EU +3285467936,3285467951,DE 3285467952,3285467959,GB +3285467960,3285467967,EU 3285467968,3285468511,DE +3285468512,3285468575,EU 3285468576,3285468591,DE +3285468592,3285468599,EU 3285468600,3285468615,DE 3285468616,3285468623,GB -3285468640,3285468647,DE -3285468656,3285471007,DE +3285468624,3285468639,EU +3285468640,3285469695,DE +3285469696,3285469727,EU +3285469728,3285471007,DE +3285471008,3285471039,EU 3285471040,3285471055,DE +3285471056,3285471103,EU 3285471104,3285471743,DE -3285471752,3285471775,DE -3285471808,3285471903,DE -3285471936,3285471951,DE +3285471744,3285471807,EU +3285471808,3285471871,DE +3285471872,3285471935,EU +3285471936,3285471967,DE +3285471968,3285471999,EU 3285472000,3285472127,DE -3285472152,3285472175,DE +3285472128,3285472159,EU +3285472160,3285472175,DE +3285472176,3285472191,EU 3285472192,3285472223,DE -3285472256,3285472271,DE -3285472288,3285472319,DE -3285472360,3285472383,DE -3285472768,3285473023,DE -3285473280,3285473343,DE -3285473376,3285473407,DE +3285472224,3285472255,EU +3285472256,3285472287,DE +3285472288,3285472367,EU +3285472368,3285472511,DE +3285472512,3285473327,EU +3285473328,3285473343,DE +3285473344,3285473439,EU 3285473440,3285473527,DE -3285473536,3285473583,DE +3285473528,3285473535,EU +3285473536,3285473567,DE +3285473568,3285473583,EU 3285473584,3285473591,GB 3285473592,3285473599,DE +3285473600,3285473631,EU 3285473632,3285473663,DE +3285473664,3285473791,EU 3285473792,3285474047,DE -3285474080,3285474143,DE -3285474176,3285474271,DE -3285474304,3285474559,DE -3285474816,3285475135,DE -3285475144,3285475207,DE -3285475224,3285475327,DE -3285475584,3285475615,AT -3285475624,3285475743,AT -3285475776,3285475839,AT +3285474048,3285474079,EU +3285474080,3285474095,DE +3285474096,3285474175,EU +3285474176,3285474231,DE +3285474232,3285474239,EU +3285474240,3285474271,DE +3285474272,3285474303,EU +3285474304,3285474319,DE +3285474320,3285474335,EU +3285474336,3285474815,DE +3285474816,3285475071,EU +3285475072,3285475127,DE +3285475128,3285475143,EU +3285475144,3285475167,DE +3285475168,3285475199,EU +3285475200,3285475207,DE +3285475208,3285475231,EU +3285475232,3285475327,DE +3285475328,3285475623,EU +3285475624,3285475647,AT +3285475648,3285475679,EU +3285475680,3285475711,AT +3285475712,3285475775,EU +3285475776,3285475783,AT +3285475784,3285475807,EU +3285475808,3285475823,AT +3285475824,3285475903,EU 3285475904,3285475951,AT -3285475960,3285476095,AT -3285476352,3285476735,DE +3285475952,3285475967,EU +3285475968,3285476031,AT +3285476032,3285476351,EU +3285476352,3285476607,DE +3285476608,3285476735,EU 3285476736,3285476863,GB 3285476864,3285476895,AT -3285476992,3285477087,AT -3285477120,3285477343,IT -3285477344,3285477359,FR +3285476896,3285477023,EU +3285477024,3285477087,AT +3285477088,3285477151,EU +3285477152,3285477263,IT +3285477264,3285477279,EU +3285477280,3285477319,IT +3285477320,3285477335,EU +3285477336,3285477343,IT +3285477344,3285477359,EU 3285477360,3285477375,IT 3285477376,3285477631,FR +3285477632,3285477887,EU 3285477888,3285477919,FR +3285477920,3285477951,EU 3285477952,3285477983,FR -3285478000,3285479399,FR +3285477984,3285477999,EU +3285478000,3285478655,FR +3285478656,3285478911,EU +3285478912,3285479391,FR +3285479392,3285479399,EU 3285479400,3285479407,GB -3285479408,3285479423,FR +3285479408,3285479423,EU 3285479424,3285479807,CH +3285479808,3285480447,EU 3285480448,3285480575,CH -3285480704,3285480831,CH -3285480864,3285480895,CH +3285480576,3285480735,EU +3285480736,3285480767,CH +3285480768,3285480775,EU +3285480776,3285480895,CH +3285480896,3285480959,EU 3285480960,3285481215,CH +3285481216,3285481471,EU 3285481472,3285481727,IT -3285481744,3285481775,CH -3285481784,3285481791,CH -3285481920,3285481983,CH +3285481728,3285481743,CH +3285481744,3285481751,EU +3285481752,3285481791,CH +3285481792,3285481983,EU 3285481984,3285481999,FR 3285482000,3285482007,CY -3285482016,3285482239,FR +3285482008,3285482015,EU +3285482016,3285482087,FR +3285482088,3285482095,EU +3285482096,3285482239,FR +3285482240,3285482495,EU 3285482496,3285482527,CH +3285482528,3285482751,EU 3285482752,3285482783,CH +3285482784,3285483007,EU 3285483008,3285483519,CH +3285483520,3285484543,EU +3285484544,3285485055,IE +3285485056,3285485103,EU 3285485104,3285485119,SK +3285485120,3285485639,EU 3285485640,3285485647,SK +3285485648,3285485727,EU 3285485728,3285485743,SK -3285485768,3285485775,SK -3285485784,3285485791,SK +3285485744,3285485799,EU 3285485800,3285485815,SK +3285485816,3285486591,EU 3285486592,3285487103,IT 3285487104,3285487359,HU -3285487360,3285487423,NL +3285487360,3285487391,NL +3285487392,3285487423,EU 3285487424,3285487487,GB -3285487488,3285488127,NL -3285488640,3285489663,GB +3285487488,3285487615,EU +3285487616,3285487679,NL +3285487680,3285487743,EU +3285487744,3285488127,NL +3285488128,3285488895,EU +3285488896,3285489663,GB +3285489664,3285490175,EU 3285490176,3285490319,RU +3285490320,3285490335,EU 3285490336,3285490463,RU +3285490464,3285490495,EU 3285490496,3285490511,RU +3285490512,3285490519,EU 3285490520,3285490527,LT 3285490528,3285490535,LV 3285490536,3285490543,RU -3285490552,3285490687,RU +3285490544,3285490559,EU +3285490560,3285490687,RU +3285490688,3285490943,EU 3285490944,3285491007,RU +3285491008,3285491455,EU 3285491456,3285491711,RU +3285491712,3285492223,EU 3285492224,3285492479,FR 3285492480,3285492687,GB +3285492688,3285492695,EU 3285492696,3285492735,GB -3285493760,3285493791,ES -3285493800,3285493887,ES -3285493952,3285493983,ES +3285492736,3285493759,EU +3285493760,3285493775,ES +3285493776,3285493783,EU +3285493784,3285493791,ES +3285493792,3285493807,EU +3285493808,3285493887,ES +3285493888,3285493967,EU +3285493968,3285493983,ES 3285493984,3285493991,GB +3285493992,3285493999,EU 3285494000,3285494015,ES -3285494016,3285494783,IT +3285494016,3285494079,IT +3285494080,3285494111,EU +3285494112,3285494783,IT +3285494784,3285495807,EU 3285495808,3285496319,DE 3285496320,3285496335,ES +3285496336,3285496351,EU 3285496352,3285496383,ES -3285496400,3285496407,ES -3285496416,3285496463,ES +3285496384,3285496463,EU +3285496464,3285496471,ES +3285496472,3285496479,EU 3285496480,3285496495,ES 3285496496,3285496527,FR +3285496528,3285496543,EU 3285496544,3285496575,FR -3285496576,3285496607,GB -3285496608,3285496783,DE -3285496800,3285497087,DE -3285497344,3285497855,DE -3285497888,3285498039,DE +3285496576,3285496607,EU +3285496608,3285496815,DE +3285496816,3285496831,EU +3285496832,3285497855,DE +3285497856,3285497887,EU +3285497888,3285498031,DE +3285498032,3285498095,EU 3285498096,3285498111,DE 3285498112,3285498367,IT 3285498368,3285498623,DE -3285498624,3285498639,CH -3285498656,3285498671,CY +3285498624,3285498655,CH +3285498656,3285498663,CY +3285498664,3285498671,EU +3285498672,3285498687,CH +3285498688,3285499391,EU 3285499392,3285499455,FR +3285499456,3285499487,EU 3285499488,3285499647,FR 3285499648,3285499903,DE 3285499904,3285500159,CZ +3285500160,3285500287,EU 3285500288,3285500415,CZ 3285500416,3285500927,GB 3285500928,3285501183,DK +3285501184,3285501311,CZ +3285501312,3285501319,EU 3285501320,3285501327,CZ +3285501328,3285501335,EU 3285501336,3285501343,CZ 3285501344,3285501375,GB 3285501376,3285501407,CZ +3285501408,3285501439,EU 3285501440,3285501567,CZ +3285501568,3285501727,EU 3285501728,3285501759,GB 3285501760,3285501767,CZ +3285501768,3285502207,EU 3285502208,3285502463,CZ +3285502464,3285502495,IL 3285502496,3285502503,CY +3285502504,3285502511,IL 3285502512,3285502527,CY 3285502528,3285502591,BY 3285502592,3285502655,GB -3285502672,3285502703,IL +3285502656,3285502719,IL +3285502720,3285503391,EU 3285503392,3285503423,CZ -3285503488,3285503615,ES +3285503424,3285503487,EU +3285503488,3285503551,ES +3285503552,3285503743,EU 3285503744,3285503999,FI +3285504000,3285504511,EU 3285504512,3285504607,CZ +3285504608,3285505215,EU 3285505216,3285505279,CZ +3285505280,3285505439,EU 3285505440,3285505471,CZ +3285505472,3285506047,EU 3285506048,3285506079,CZ +3285506080,3285507327,EU 3285507328,3285507391,GR -3285507656,3285507711,CZ +3285507392,3285507663,EU +3285507664,3285507711,CZ +3285507712,3285507839,EU 3285507840,3285508095,CZ 3285508096,3285508607,DE -3285508608,3285508671,RU +3285508608,3285508623,RU +3285508624,3285508639,EU +3285508640,3285508671,RU +3285508672,3285508735,EU 3285508736,3285508863,RU +3285508864,3285508871,EU 3285508872,3285508927,PT +3285508928,3285509119,EU 3285509120,3285509247,SE -3285509280,3285509375,SE +3285509248,3285509279,EU +3285509280,3285509311,SE +3285509312,3285509631,EU 3285509632,3285509887,TR +3285509888,3285510015,EU 3285510016,3285510047,HU -3285510080,3285510143,HU +3285510048,3285510111,EU +3285510112,3285510143,HU 3285510144,3285512191,GB -3285512192,3285512511,GR -3285512576,3285512735,GR +3285512192,3285512319,GR +3285512320,3285512383,EU +3285512384,3285512511,GR +3285512512,3285512575,EU +3285512576,3285512719,GR +3285512720,3285512767,EU 3285512768,3285512831,GR +3285512832,3285513215,EU 3285513216,3285513223,GB +3285513224,3285513231,EU 3285513232,3285513247,GR -3285513280,3285513471,GR +3285513248,3285513279,EU +3285513280,3285513343,GR +3285513344,3285513727,EU 3285513728,3285514239,GR +3285514240,3285515263,EU 3285515264,3285515519,AT -3285515792,3285515799,GR +3285515520,3285515791,EU +3285515792,3285515803,GR +3285515804,3285516159,EU 3285516160,3285516191,GR +3285516192,3285516223,EU 3285516224,3285516287,GR 3285516288,3285516543,DK 3285516544,3285516671,NO -3285516672,3285516687,BE +3285516672,3285516687,EU 3285516688,3285516691,NL 3285516692,3285516695,IT 3285516696,3285516703,NL @@ -54950,17 +90805,17 @@ 3285516736,3285516799,DE 3285516800,3285516927,GB 3285516928,3285516991,PL -3285516992,3285517023,BE +3285516992,3285517023,EU 3285517024,3285517055,SE 3285517056,3285517215,GB 3285517216,3285517247,AT 3285517248,3285518335,GB 3285518336,3285518351,NL 3285518352,3285518367,ES -3285518368,3285518463,BE +3285518368,3285518463,EU 3285518464,3285518591,ES 3285518592,3285518847,CH -3285518848,3285519103,BE +3285518848,3285519103,EU 3285519104,3285519359,FR 3285519360,3285519615,DE 3285519616,3285520127,GB @@ -54971,22 +90826,22 @@ 3285520576,3285520639,DE 3285520640,3285520767,NL 3285520768,3285520895,GB -3285520896,3285521167,BE +3285520896,3285521167,EU 3285521168,3285521407,GB -3285521408,3285521695,BE +3285521408,3285521535,BE +3285521536,3285521695,EU 3285521696,3285521791,GB -3285521792,3285522175,BE +3285521792,3285522175,EU 3285522176,3285523071,GB -3285523072,3285523079,BE +3285523072,3285523079,EU 3285523080,3285523087,ES 3285523088,3285523199,CH 3285523200,3285523231,ZA -3285523232,3285523327,BE +3285523232,3285523327,EU 3285523328,3285523335,FI -3285523336,3285523359,BE +3285523336,3285523359,EU 3285523360,3285523391,GB -3285523392,3285523455,BE -3285523456,3285523711,FR +3285523392,3285523711,FR 3285523712,3285523967,CH 3285523968,3285524063,GB 3285524064,3285524095,LU @@ -54995,86 +90850,106 @@ 3285524176,3285524191,CH 3285524192,3285524223,BE 3285524224,3285524351,GB -3285524352,3285524479,BE +3285524352,3285524479,EU 3285524480,3285524735,DK 3285524736,3285524863,GB -3285524864,3285524895,BE +3285524864,3285524879,EU +3285524880,3285524895,BE 3285524896,3285524927,ES 3285524928,3285524991,GB -3285524992,3285525247,BE +3285524992,3285525247,EU 3285525248,3285525503,CH -3285525504,3285526015,BE +3285525504,3285525759,EU +3285525760,3285526015,BE 3285526016,3285526023,IL -3285526024,3285526035,BE +3285526024,3285526035,EU 3285526036,3285526039,FR -3285526040,3285526047,BE +3285526040,3285526047,EU 3285526048,3285526079,CZ -3285526080,3285526143,BE +3285526080,3285526143,EU 3285526144,3285526175,HU -3285526176,3285526383,BE +3285526176,3285526271,EU +3285526272,3285526335,BE +3285526336,3285526383,EU 3285526384,3285526399,PT 3285526400,3285526527,CH 3285526528,3285526783,ES 3285526784,3285526815,CH -3285526816,3285526847,BE +3285526816,3285526823,EU +3285526824,3285526847,BE 3285526848,3285526911,CH 3285526912,3285527295,GB -3285527296,3285527423,BE +3285527296,3285527423,EU 3285527424,3285527427,GB -3285527428,3285527431,BE +3285527428,3285527431,EU 3285527432,3285527439,FR 3285527440,3285527455,LU 3285527456,3285527487,IL -3285527488,3285527551,BE +3285527488,3285527495,EU +3285527496,3285527503,DE +3285527504,3285527519,JP +3285527520,3285527551,EU 3285527552,3285527615,IL 3285527616,3285527679,GB -3285527680,3285527807,BE +3285527680,3285527807,EU 3285527808,3285527811,GB 3285527812,3285527815,PL -3285527816,3285527855,BE +3285527816,3285527855,EU 3285527856,3285527871,FR -3285527872,3285527967,BE +3285527872,3285527967,EU 3285527968,3285527999,DE -3285528000,3285528319,BE +3285528000,3285528319,EU 3285528320,3285528447,DE 3285528448,3285528575,FR -3285528576,3285528799,BE +3285528576,3285528703,BE +3285528704,3285528735,EU +3285528736,3285528799,BE 3285528800,3285528831,GB -3285528832,3285528847,BE +3285528832,3285528839,BE +3285528840,3285528847,EU 3285528848,3285528863,ZA -3285528864,3285528883,BE +3285528864,3285528883,EU 3285528884,3285528887,FR -3285528888,3285528895,BE +3285528888,3285528895,EU 3285528896,3285528911,GB -3285528912,3285528931,BE +3285528912,3285528927,BE +3285528928,3285528931,EU 3285528932,3285528935,FR -3285528936,3285528943,BE +3285528936,3285528943,EU 3285528944,3285529071,GB -3285529072,3285529151,BE +3285529072,3285529087,EU +3285529088,3285529151,BE 3285529152,3285529183,DE 3285529184,3285529199,NL 3285529200,3285529215,IL 3285529216,3285529247,CH 3285529248,3285529263,GB -3285529264,3285529343,BE +3285529264,3285529279,EU +3285529280,3285529311,BE +3285529312,3285529343,EU 3285529344,3285529599,IT 3285529600,3285529631,NO 3285529632,3285529663,IE 3285529664,3285529679,LI 3285529680,3285529687,FI 3285529688,3285529695,IT -3285529696,3285529727,BE +3285529696,3285529711,BE +3285529712,3285529727,EU 3285529728,3285529855,GB 3285529856,3285529951,LU 3285529952,3285529983,GR 3285529984,3285529999,CZ -3285530000,3285530143,BE +3285530000,3285530143,EU 3285530144,3285530175,GB 3285530176,3285530183,NL -3285530184,3285530215,BE +3285530184,3285530211,EU +3285530212,3285530215,BE 3285530216,3285530223,GB 3285530224,3285530271,FR -3285530272,3285530399,BE +3285530272,3285530303,EU +3285530304,3285530335,BE +3285530336,3285530367,EU +3285530368,3285530399,BE 3285530400,3285530431,NL 3285530432,3285530463,IT 3285530464,3285530495,DE @@ -55083,23 +90958,24 @@ 3285530576,3285530583,GB 3285530584,3285530591,BE 3285530592,3285530607,GB -3285530608,3285530655,BE +3285530608,3285530623,BE +3285530624,3285530655,EU 3285530656,3285530687,ZA 3285530688,3285530719,GB -3285530720,3285530723,BE +3285530720,3285530723,EU 3285530724,3285530727,GB 3285530728,3285530735,DE 3285530736,3285530739,GB -3285530740,3285530743,BE +3285530740,3285530743,EU 3285530744,3285530751,GB 3285530752,3285530767,IT 3285530768,3285530783,DE -3285530784,3285530815,BE +3285530784,3285530815,EU 3285530816,3285530831,GB -3285530832,3285530879,BE +3285530832,3285530879,EU 3285530880,3285530911,CH 3285530912,3285530975,GB -3285530976,3285530983,BE +3285530976,3285530983,EU 3285530984,3285530991,IE 3285530992,3285531007,GB 3285531008,3285531023,FR @@ -55107,50 +90983,60 @@ 3285531040,3285531071,ES 3285531072,3285531103,NL 3285531104,3285531119,FR -3285531120,3285531263,BE -3285531264,3285531295,GB -3285531296,3285531303,BE -3285531304,3285531311,GB +3285531120,3285531127,BE +3285531128,3285531263,EU +3285531264,3285531311,GB 3285531312,3285531327,DK -3285531328,3285531391,GB +3285531328,3285531343,EU +3285531344,3285531351,GB +3285531352,3285531355,FR +3285531356,3285531359,ES +3285531360,3285531367,EU +3285531368,3285531375,DE +3285531376,3285531379,EU +3285531380,3285531383,BE +3285531384,3285531391,DE 3285531392,3285531423,BE 3285531424,3285531455,DE -3285531456,3285531495,BE +3285531456,3285531495,EU 3285531496,3285531503,NL 3285531504,3285531519,FR -3285531520,3285531535,BE +3285531520,3285531535,EU 3285531536,3285531551,DE 3285531552,3285531567,IL -3285531568,3285531615,BE +3285531568,3285531615,EU 3285531616,3285531647,NL 3285531648,3285531903,BE 3285531904,3285532159,GB 3285532160,3285532223,BE 3285532224,3285532231,ES -3285532232,3285532415,BE +3285532232,3285532287,EU +3285532288,3285532415,BE 3285532416,3285532687,IT 3285532688,3285532703,DE -3285532704,3285532711,BE +3285532704,3285532711,EU 3285532712,3285532719,RU 3285532720,3285532735,IT 3285532736,3285532799,CH 3285532800,3285532831,DE 3285532832,3285532847,FI 3285532848,3285532863,IT -3285532864,3285532895,GB +3285532864,3285532895,EU 3285532896,3285532959,IT -3285532960,3285533055,BE +3285532960,3285532975,BE +3285532976,3285533047,EU +3285533048,3285533055,BE 3285533056,3285533059,NL -3285533060,3285533087,BE +3285533060,3285533087,EU 3285533088,3285533103,IT 3285533104,3285533119,LU -3285533120,3285533127,BE +3285533120,3285533127,EU 3285533128,3285533135,SE 3285533136,3285533151,GB -3285533152,3285533183,BE +3285533152,3285533183,FR 3285533184,3285533311,IT 3285533312,3285533343,SE -3285533344,3285533367,BE +3285533344,3285533367,EU 3285533368,3285533375,CH 3285533376,3285533471,GB 3285533472,3285533503,BE @@ -55163,15 +91049,17 @@ 3285533952,3285534079,IL 3285534080,3285534095,IT 3285534096,3285534111,TR -3285534112,3285534143,BE +3285534112,3285534143,EU 3285534144,3285534207,IT 3285534208,3285534463,PT 3285534464,3285534479,NL -3285534480,3285534527,BE +3285534480,3285534495,BE +3285534496,3285534527,EU 3285534528,3285534559,FR 3285534560,3285534591,IT 3285534592,3285534627,GB -3285534628,3285534639,BE +3285534628,3285534631,EU +3285534632,3285534639,BE 3285534640,3285534655,GB 3285534656,3285534719,IT 3285534720,3285534751,GB @@ -55182,60 +91070,61 @@ 3285534816,3285534831,HU 3285534832,3285534927,IE 3285534928,3285534943,GB -3285534944,3285534975,BE +3285534944,3285534975,EU 3285534976,3285535103,IT -3285535104,3285535123,BE +3285535104,3285535119,BE +3285535120,3285535123,EU 3285535124,3285535127,ES -3285535128,3285535131,BE +3285535128,3285535131,EU 3285535132,3285535135,NL 3285535136,3285535139,FR -3285535140,3285535143,BE +3285535140,3285535143,EU 3285535144,3285535147,GR 3285535148,3285535151,CZ 3285535152,3285535155,SE -3285535156,3285535231,BE +3285535156,3285535231,EU 3285535232,3285535743,NO 3285535744,3285535871,IT 3285535872,3285535903,FR 3285535904,3285535907,DK 3285535908,3285535911,NO -3285535912,3285535919,BE +3285535912,3285535919,EU 3285535920,3285535927,NL -3285535928,3285535951,BE +3285535928,3285535951,EU 3285535952,3285535967,GB -3285535968,3285535999,BE +3285535968,3285535999,EU 3285536000,3285536063,GB -3285536064,3285536079,BE +3285536064,3285536079,EU 3285536080,3285536095,IT 3285536096,3285536111,GB -3285536112,3285536255,BE +3285536112,3285536255,EU 3285536256,3285536511,GB 3285536512,3285536543,LU 3285536544,3285536575,DE 3285536576,3285536607,IL -3285536608,3285536703,BE +3285536608,3285536703,EU 3285536704,3285536735,GB 3285536736,3285536739,IT 3285536740,3285536743,GB 3285536744,3285536747,DE 3285536748,3285536751,AT -3285536752,3285536755,BE +3285536752,3285536755,EU 3285536756,3285536759,IL -3285536760,3285536767,BE +3285536760,3285536767,EU 3285536768,3285536959,DK 3285536960,3285536991,ES 3285536992,3285537023,GB 3285537024,3285537087,IL 3285537088,3285537127,GB -3285537128,3285537135,BE +3285537128,3285537135,EU 3285537136,3285537143,DK 3285537144,3285537151,GB 3285537152,3285537167,DK 3285537168,3285537175,CH -3285537176,3285537183,BE +3285537176,3285537183,EU 3285537184,3285537215,DE 3285537216,3285537231,GB -3285537232,3285537535,BE +3285537232,3285537535,EU 3285537536,3285537599,RU 3285537600,3285537615,FR 3285537616,3285537631,BE @@ -55248,7 +91137,7 @@ 3285538048,3285538175,NL 3285538176,3285538183,DE 3285538184,3285538187,LU -3285538188,3285538207,BE +3285538188,3285538207,EU 3285538208,3285538239,LU 3285538240,3285538271,NO 3285538272,3285538287,FI @@ -55259,13 +91148,14 @@ 3285538328,3285538335,BE 3285538336,3285538351,GB 3285538352,3285538367,LU -3285538368,3285538375,BE +3285538368,3285538375,EU 3285538376,3285538383,AT -3285538384,3285538399,BE +3285538384,3285538399,EU 3285538400,3285538431,DK -3285538432,3285538623,BE +3285538432,3285538559,EU +3285538560,3285538623,BE 3285538624,3285538687,LU -3285538688,3285538719,BE +3285538688,3285538719,EU 3285538720,3285538751,DE 3285538752,3285538755,IT 3285538756,3285538759,FR @@ -55274,10 +91164,10 @@ 3285538768,3285538783,CZ 3285538784,3285538815,BE 3285538816,3285538847,CH -3285538848,3285538879,BE +3285538848,3285538879,EU 3285538880,3285539071,ES 3285539072,3285539327,NL -3285539328,3285539583,BE +3285539328,3285539583,EU 3285539584,3285539711,IE 3285539712,3285539839,GB 3285539840,3285539967,IT @@ -55285,39 +91175,38 @@ 3285540032,3285540095,ZA 3285540096,3285540103,GB 3285540104,3285540107,IT -3285540108,3285540111,BE +3285540108,3285540111,EU 3285540112,3285540127,IL 3285540128,3285540159,ZA 3285540160,3285540191,FI 3285540192,3285540207,CH 3285540208,3285540215,IE -3285540216,3285540219,BE +3285540216,3285540219,EU 3285540220,3285540223,ZA 3285540224,3285540351,CZ 3285540352,3285540415,PT 3285540416,3285540423,ZA -3285540424,3285540447,BE +3285540424,3285540447,EU 3285540448,3285540479,DE 3285540480,3285540607,NL -3285540608,3285540623,FI -3285540624,3285540671,BE +3285540608,3285540671,EU 3285540672,3285540735,DE -3285540736,3285540863,BE +3285540736,3285540863,EU 3285540864,3285540871,FR -3285540872,3285540879,BE +3285540872,3285540879,EU 3285540880,3285541375,FR 3285541376,3285541391,GB 3285541392,3285541439,FR 3285541440,3285541519,GB 3285541520,3285541527,BG -3285541528,3285541535,BE +3285541528,3285541535,EU 3285541536,3285541551,FR -3285541552,3285541567,BE +3285541552,3285541567,EU 3285541568,3285541599,GB -3285541600,3285541631,BE +3285541600,3285541631,EU 3285541632,3285541663,ES 3285541664,3285541695,FR -3285541696,3285541759,BE +3285541696,3285541759,EU 3285541760,3285541887,FR 3285541888,3285541919,GB 3285541920,3285541951,FR @@ -55331,32 +91220,32 @@ 3285543424,3285543679,SE 3285543680,3285543743,AT 3285543744,3285543759,FR -3285543760,3285543775,BE +3285543760,3285543775,EU 3285543776,3285543791,IT 3285543792,3285543795,ES -3285543796,3285543799,BE +3285543796,3285543799,EU 3285543800,3285543807,FR 3285543808,3285543871,NL 3285543872,3285543935,FR -3285543936,3285544191,BE +3285543936,3285544191,EU 3285544192,3285544255,IL 3285544256,3285544319,DE 3285544320,3285544335,ES 3285544336,3285544351,NL -3285544352,3285544383,BE +3285544352,3285544383,EU 3285544384,3285544479,FR 3285544480,3285544511,ES 3285544512,3285544639,FR 3285544640,3285544703,BE 3285544704,3285544959,FR 3285544960,3285545215,GB -3285545216,3285545343,BE +3285545216,3285545343,EU 3285545344,3285545379,GB -3285545380,3285545471,BE +3285545380,3285545471,EU 3285545472,3285545727,SE 3285545728,3285545983,FI 3285545984,3285545999,IT -3285546000,3285546007,BE +3285546000,3285546007,EU 3285546008,3285546015,IT 3285546016,3285546063,ES 3285546064,3285546071,IT @@ -55365,7 +91254,7 @@ 3285546240,3285546367,ZA 3285546368,3285546495,FR 3285546496,3285546559,NL -3285546560,3285546623,BE +3285546560,3285546623,EU 3285546624,3285546671,FR 3285546672,3285546687,SE 3285546688,3285546751,GB @@ -55380,15 +91269,15 @@ 3285547264,3285547519,LU 3285547520,3285547775,NL 3285547776,3285547903,ES -3285547904,3285548031,BE +3285547904,3285548031,EU 3285548032,3285548287,FR 3285548288,3285548543,DE 3285548544,3285548607,FR 3285548608,3285548639,LI -3285548640,3285548647,BE +3285548640,3285548647,EU 3285548648,3285548655,LI 3285548656,3285548735,GB -3285548736,3285548767,BE +3285548736,3285548767,EU 3285548768,3285548799,LU 3285548800,3285548831,IT 3285548832,3285548839,GB @@ -55398,43 +91287,46 @@ 3285549024,3285549039,PT 3285549040,3285549055,FR 3285549056,3285549183,DE -3285549184,3285549215,BE +3285549184,3285549215,EU 3285549216,3285549247,CH 3285549248,3285549279,DE 3285549280,3285549311,GB 3285549312,3285549695,DE -3285549696,3285549719,BE +3285549696,3285549719,EU 3285549720,3285549727,GB 3285549728,3285549735,SE -3285549736,3285549767,BE +3285549736,3285549767,EU 3285549768,3285549775,FI 3285549776,3285549791,DE 3285549792,3285549823,LU 3285549824,3285549871,DE 3285549872,3285549887,DK 3285549888,3285549951,DE -3285549952,3285550335,BE +3285549952,3285550335,EU 3285550336,3285550463,GB 3285550464,3285550527,DE 3285550528,3285550591,IT 3285550592,3285550847,FR 3285550848,3285550943,IT 3285550944,3285550975,NL -3285550976,3285551007,BE +3285550976,3285551007,EU 3285551008,3285551039,CH 3285551040,3285551071,DE -3285551072,3285551103,BE +3285551072,3285551103,EU 3285551104,3285551359,DE -3285551360,3285551391,BE +3285551360,3285551375,BE +3285551376,3285551391,EU 3285551392,3285551423,DE 3285551424,3285551487,DK -3285551488,3285551551,BE +3285551488,3285551519,BE +3285551520,3285551551,EU 3285551552,3285551615,DE 3285551616,3285551647,GB 3285551648,3285551679,FR 3285551680,3285551807,GB 3285551808,3285551839,RU -3285551840,3285552127,BE +3285551840,3285551871,EU +3285551872,3285552127,BE 3285552128,3285552191,DE 3285552192,3285552255,ZA 3285552256,3285552287,CZ @@ -55443,60 +91335,61 @@ 3285552384,3285552511,DE 3285552512,3285552639,GB 3285552640,3285552927,DE -3285552928,3285552959,BE +3285552928,3285552959,EU 3285552960,3285553023,FR -3285553024,3285553039,BE +3285553024,3285553039,EU 3285553040,3285553055,EG -3285553056,3285553087,BE +3285553056,3285553087,EU 3285553088,3285553151,IT 3285553152,3285553215,DE -3285553216,3285553247,BE +3285553216,3285553247,EU 3285553248,3285553263,PL 3285553264,3285553727,DE 3285553728,3285553759,CH 3285553760,3285553767,GB 3285553768,3285553775,ZA 3285553776,3285553791,FR -3285553792,3285553855,BE +3285553792,3285553855,EU 3285553856,3285553887,ZA 3285553888,3285553919,DE 3285553920,3285554047,CH 3285554048,3285554127,DE -3285554128,3285554143,BE +3285554128,3285554143,EU 3285554144,3285554175,GB 3285554176,3285554431,AT -3285554432,3285554687,BE +3285554432,3285554687,EU 3285554688,3285554703,DE -3285554704,3285554719,BE +3285554704,3285554719,EU 3285554720,3285554751,FR -3285554752,3285554815,BE +3285554752,3285554815,EU 3285554816,3285554943,CH 3285554944,3285555199,LU 3285555200,3285555231,AT 3285555232,3285555263,NL 3285555264,3285555327,FR 3285555328,3285555455,IL -3285555456,3285555711,BE +3285555456,3285555711,EU 3285555712,3285555967,LU 3285555968,3285556223,IT -3285556224,3285556479,BE +3285556224,3285556479,EU 3285556480,3285556735,DE 3285556736,3285556767,CH -3285556768,3285556775,BE +3285556768,3285556771,EU +3285556772,3285556775,BE 3285556776,3285556779,NL -3285556780,3285556799,BE +3285556780,3285556799,EU 3285556800,3285556863,DE -3285556864,3285556991,BE +3285556864,3285556991,EU 3285556992,3285557055,GB 3285557056,3285557119,NL 3285557120,3285557247,DE 3285557248,3285557363,NL -3285557364,3285557375,BE +3285557364,3285557375,EU 3285557376,3285557519,NL 3285557520,3285557535,FI 3285557536,3285557575,NL 3285557576,3285557579,SE -3285557580,3285557583,BE +3285557580,3285557583,EU 3285557584,3285557599,NL 3285557600,3285557631,BE 3285557632,3285557791,NL @@ -55507,18 +91400,19 @@ 3285557920,3285557951,FR 3285557952,3285558015,DE 3285558016,3285558271,NL -3285558272,3285558463,BE +3285558272,3285558399,BE +3285558400,3285558463,EU 3285558464,3285558591,NL -3285558592,3285558655,BE +3285558592,3285558655,EU 3285558656,3285558783,IT 3285558784,3285559039,GB -3285559040,3285559167,BE +3285559040,3285559167,EU 3285559168,3285559231,NL -3285559232,3285559295,BE +3285559232,3285559295,EU 3285559296,3285559807,SE 3285559808,3285559839,IE 3285559840,3285559871,CH -3285559872,3285559887,BE +3285559872,3285559887,EU 3285559888,3285559903,SE 3285559904,3285559919,NL 3285559920,3285559935,SE @@ -55528,7 +91422,7 @@ 3285560384,3285560447,SE 3285560448,3285560479,LI 3285560480,3285560511,CH -3285560512,3285560575,BE +3285560512,3285560575,EU 3285560576,3285560831,DE 3285560832,3285561215,SE 3285561216,3285561343,NO @@ -55537,31 +91431,31 @@ 3285561472,3285561599,DK 3285561600,3285561619,NO 3285561620,3285561623,DE -3285561624,3285561647,BE +3285561624,3285561647,EU 3285561648,3285561663,NO -3285561664,3285561727,BE +3285561664,3285561727,EU 3285561728,3285561791,NO -3285561792,3285561919,BE +3285561792,3285561919,EU 3285561920,3285561951,CH 3285561952,3285561967,NO -3285561968,3285561983,BE +3285561968,3285561983,EU 3285561984,3285562111,FI 3285562112,3285562367,NO 3285562368,3285562751,FI 3285562752,3285562783,NL -3285562784,3285562815,BE +3285562784,3285562815,EU 3285562816,3285562879,IT 3285562880,3285562911,FI -3285562912,3285562943,BE +3285562912,3285562943,EU 3285562944,3285562975,DE 3285562976,3285562991,FI -3285562992,3285562999,BE +3285562992,3285562999,EU 3285563000,3285563007,GB 3285563008,3285563135,SE 3285563136,3285563391,FI -3285563392,3285563455,BE +3285563392,3285563455,EU 3285563456,3285563471,NL -3285563472,3285563487,BE +3285563472,3285563487,EU 3285563488,3285563519,SE 3285563520,3285563647,PL 3285563648,3285563903,CH @@ -55570,114 +91464,118 @@ 3285564160,3285564415,GB 3285564416,3285564511,CH 3285564512,3285564543,NO -3285564544,3285564671,BE +3285564544,3285564671,EU 3285564672,3285564735,CH 3285564736,3285564751,FR -3285564752,3285564767,BE +3285564752,3285564767,EU 3285564768,3285564799,SE -3285564800,3285564927,BE +3285564800,3285564927,EU 3285564928,3285565183,FR 3285565184,3285565439,NL 3285565440,3285565951,GB 3285565952,3285566015,FR 3285566016,3285566031,IT -3285566032,3285566047,BE +3285566032,3285566047,EU 3285566048,3285566079,CH 3285566080,3285566143,FR -3285566144,3285566207,BE +3285566144,3285566207,EU 3285566208,3285566495,RU 3285566496,3285566511,SE 3285566512,3285566527,FI 3285566528,3285566559,CH -3285566560,3285566575,BE +3285566560,3285566575,EU 3285566576,3285566591,CH 3285566592,3285566655,NL -3285566656,3285566847,BE +3285566656,3285566847,EU 3285566848,3285566975,FR 3285566976,3285567231,GB 3285567232,3285567487,PT 3285567488,3285568511,NL 3285568512,3285568671,DE 3285568672,3285568703,CH -3285568704,3285568751,BE +3285568704,3285568751,EU 3285568752,3285569023,DE -3285569024,3285569407,BE +3285569024,3285569407,EU 3285569408,3285569535,GB 3285569536,3285569791,DE 3285569792,3285570047,FI 3285570048,3285570175,FR -3285570176,3285570207,BE +3285570176,3285570207,EU 3285570208,3285570223,PL 3285570224,3285570239,NL -3285570240,3285570559,BE +3285570240,3285570303,EU +3285570304,3285570559,BE 3285570560,3285570815,SE 3285570816,3285571071,IT 3285571072,3285571327,DE 3285571328,3285571583,FI 3285571584,3285571711,FR 3285571712,3285571775,SE -3285571776,3285571807,BE +3285571776,3285571791,BE +3285571792,3285571807,EU 3285571808,3285571839,DE -3285571840,3285571903,BE +3285571840,3285571903,EU 3285571904,3285571967,SE -3285571968,3285572095,BE +3285571968,3285572095,EU 3285572096,3285572223,DE 3285572224,3285572351,FI 3285572352,3285572367,IR 3285572368,3285572383,ES -3285572384,3285572447,BE +3285572384,3285572447,EU 3285572448,3285572479,CH 3285572480,3285572607,FR 3285572608,3285572863,DK 3285572864,3285573119,IT 3285573120,3285573375,SE -3285573376,3285573535,BE +3285573376,3285573535,EU 3285573536,3285573567,CH 3285573568,3285573631,FR 3285573632,3285573887,NL 3285573888,3285573951,IL -3285573952,3285574143,BE +3285573952,3285574143,EU 3285574144,3285574399,RU 3285574400,3285574655,IL 3285574656,3285574911,GB -3285574912,3285575167,IL +3285574912,3285575167,EU 3285575168,3285575423,ES 3285575424,3285575679,IL -3285575680,3285575935,BE +3285575680,3285575935,EU 3285575936,3285575999,DK -3285576000,3285576063,BE +3285576000,3285576063,EU 3285576064,3285576127,FR -3285576128,3285576159,BE +3285576128,3285576159,EU 3285576160,3285576191,DK -3285576192,3285576447,BE +3285576192,3285576447,EU 3285576448,3285576703,CZ 3285576704,3285576959,HU -3285576960,3285577215,BE +3285576960,3285577215,EU 3285577216,3285577471,ZA 3285577472,3285577599,IT -3285577600,3285577983,BE +3285577600,3285577983,EU 3285577984,3285578111,IT 3285578112,3285578239,DE -3285578240,3285578367,BE +3285578240,3285578367,EU 3285578368,3285578431,FR -3285578432,3285578495,BE +3285578432,3285578495,EU 3285578496,3285578751,DE -3285578752,3285579007,BE +3285578752,3285579007,EU 3285579008,3285579519,ES 3285579520,3285579775,FR 3285579776,3285580031,US 3285580032,3285580287,HU 3285580288,3285580415,DE -3285580416,3285580543,BE +3285580416,3285580543,EU 3285580544,3285580547,NL -3285580548,3285580651,BE +3285580548,3285580651,EU 3285580652,3285580655,SE -3285580656,3285580799,BE +3285580656,3285580799,EU 3285580800,3285580831,SE 3285580832,3285580847,PL -3285580848,3285580927,BE +3285580848,3285580927,EU 3285580928,3285581055,ZA -3285581056,3285581503,BE +3285581056,3285581183,EU +3285581184,3285581311,BE +3285581312,3285581503,EU 3285581504,3285581567,AT 3285581568,3285581599,FR 3285581600,3285581615,GB @@ -55715,15 +91613,21 @@ 3285647360,3285712895,DK 3285712896,3285721087,GB 3285721088,3285729279,SE -3285729280,3285737471,CH +3285729280,3285734143,CH +3285734144,3285734159,GB +3285734160,3285734335,CH +3285734336,3285734351,LI +3285734352,3285734399,CH +3285734400,3285734655,LI +3285734656,3285737471,CH 3285737472,3285745663,PL 3285745664,3285753855,IT 3285753856,3285762047,LV +3285762048,3285762559,FR 3285762560,3285763071,RU 3285763072,3285763583,GB 3285763584,3285764095,DE -3285764096,3285764607,RO -3285764608,3285765119,RU +3285764096,3285765119,RU 3285765120,3285766143,UA 3285766144,3285766655,DE 3285766656,3285767679,UA @@ -55733,7 +91637,7 @@ 3285769216,3285769727,DE 3285769728,3285770239,RO 3285770240,3285770495,NL -3285770496,3285770751,GB +3285770496,3285770751,US 3285770752,3285771007,UA 3285771008,3285771263,CH 3285771264,3285771519,BG @@ -55761,7 +91665,7 @@ 3285776896,3285777151,PL 3285777152,3285777407,HU 3285777408,3285777663,IL -3285777664,3285777919,DK +3285777664,3285777919,SI 3285777920,3285778175,PL 3285778176,3285778431,DE 3285778432,3285843967,GB @@ -55771,173 +91675,221 @@ 3285868544,3285876735,IE 3285876736,3285909503,RU 3285909504,3285910015,GB +3285910016,3285910271,EU 3285910272,3285910303,ES 3285910304,3285910335,GB -3285910336,3285910407,DE +3285910336,3285910399,ES +3285910400,3285910407,IT 3285910408,3285910463,GB 3285910464,3285910527,ES 3285910528,3285911551,GB +3285911552,3285912575,EU 3285912576,3285913087,GB 3285913088,3285913215,ES +3285913216,3285913343,EU 3285913344,3285913599,GB +3285913600,3285915647,EU +3285915648,3285915903,GB +3285915904,3285916159,AT 3285916160,3285916415,FR 3285916416,3285916671,YE 3285916672,3285916703,BH 3285916704,3285916711,DE 3285916712,3285916719,CY 3285916720,3285916735,ES -3285916768,3285916799,GB +3285916736,3285916799,GB +3285916800,3285916927,EU 3285916928,3285917183,YE 3285917184,3285917439,ES 3285917440,3285917695,YE -3285918848,3285918975,GB +3285917696,3285918719,EU +3285918720,3285918975,SE 3285918976,3285919231,YE 3285919232,3285919487,GB 3285919488,3285919743,UA 3285919744,3285921791,QA -3285921792,3285921855,RU -3285921856,3285921919,DE +3285921792,3285921823,CZ +3285921824,3285921855,GB +3285921856,3285921919,EU 3285921920,3285921983,GB -3285921984,3285922047,FR -3285922048,3285922111,GB -3285922176,3285922207,DE -3285922224,3285922239,IR -3285922288,3285922303,IR +3285921984,3285922111,EU +3285922112,3285922175,FR +3285922176,3285922183,GB +3285922184,3285922191,RU +3285922192,3285922207,DE +3285922208,3285922239,ES +3285922240,3285922303,RU +3285922304,3285922559,DE +3285922560,3285922815,GB 3285922816,3285923327,KW 3285923328,3285924415,ES -3285924416,3285924431,IR +3285924416,3285924431,DE 3285924432,3285924479,GB 3285924480,3285924863,ES -3285925056,3285925119,FR +3285924864,3285925887,EU 3285925888,3285926143,NL 3285926144,3285926399,YE -3285926400,3285926407,DE -3285926408,3285926431,ES -3285926432,3285926463,GB -3285926496,3285926527,ES -3285926720,3285926783,DE +3285926400,3285926407,GB +3285926408,3285926415,ES +3285926416,3285926431,GB +3285926432,3285926463,CH +3285926464,3285926847,EU 3285926848,3285926911,GB +3285926912,3285927423,DE 3285927424,3285927679,GB 3285927680,3285927935,IR +3285927936,3285928063,EU 3285928064,3285928191,ES 3285928192,3285928207,PL 3285928208,3285928223,GB -3285928224,3285928287,DE -3285928288,3285928319,ES -3285929424,3285929439,IT -3285929984,3285930239,GB -3285930240,3285930495,DE +3285928224,3285928255,DE +3285928256,3285928271,GB +3285928272,3285928287,DE +3285928288,3285928447,EU +3285928448,3285928959,ES +3285928960,3285929983,EU +3285929984,3285930495,GB +3285930496,3285930559,EU 3285930560,3285930575,ES 3285930576,3285930623,GB -3285930624,3285930647,DE -3285930672,3285930751,DE +3285930624,3285930631,EU +3285930632,3285930639,GB +3285930640,3285930655,ES +3285930656,3285930671,NL +3285930672,3285930679,EU +3285930680,3285930687,DE +3285930688,3285930751,EU 3285930752,3285931007,GB -3285932544,3285932799,GB +3285931008,3285932031,EU +3285932032,3285932287,NL +3285932288,3285932799,GB 3285932800,3285933055,ES 3285933056,3285933311,DE 3285933312,3285933567,ES -3285934080,3285934847,GB +3285933568,3285934079,DE +3285934080,3285934591,GB +3285934592,3285935103,EU 3285935104,3285935615,GB +3285935616,3285938175,EU 3285938176,3285938431,ES +3285938432,3285938559,EU 3285938560,3285938607,GB -3285938608,3285938623,ES -3285938624,3285938631,DE +3285938608,3285938623,FR +3285938624,3285938631,EU 3285938632,3285938639,ES -3285938656,3285938687,US +3285938640,3285938655,GB +3285938656,3285938687,EU 3285938688,3285938943,ES -3285938944,3285938951,DE -3285938976,3285939071,ES -3285939200,3285940223,ES -3285940224,3285940479,DK -3285940480,3285940735,ES -3285942272,3285942527,IR +3285938944,3285938951,EU +3285938952,3285938959,NL +3285938960,3285938975,EU +3285938976,3285939039,ES +3285939040,3285939199,EU +3285939200,3285939711,ES +3285939712,3285940223,EU +3285940224,3285940735,ES +3285940736,3285941247,GB +3285941248,3285942655,EU 3285942656,3285942783,IR -3285942784,3285942784,ES +3285942784,3285943039,ES 3285943040,3285943295,SE 3285943296,3285943551,ES 3285943552,3285943559,DK -3285943560,3285943567,DE -3285943568,3285943575,DK -3285943584,3285943679,ES +3285943560,3285943567,EU +3285943568,3285943575,ES +3285943576,3285943583,DE +3285943584,3285943679,EU 3285943680,3285943807,GB +3285943808,3285944319,EU 3285944320,3285944831,US 3285944832,3285945343,DK 3285945344,3285945599,ES -3285945664,3285945691,FR +3285945600,3285945663,EU +3285945664,3285945695,FR 3285945696,3285945727,GB +3285945728,3285945855,EU 3285945856,3285946111,GB 3285946112,3285946367,ES 3285946368,3285946879,GB +3285946880,3285947391,EU 3285947392,3285947647,DE 3285947648,3285947903,ES 3285947904,3285948159,NL 3285948160,3285948671,GB 3285948672,3285948927,SA -3285948928,3285949183,ML -3285949184,3285949831,ES +3285948928,3285949183,GB +3285949184,3285949439,ES +3285949440,3285949695,DE +3285949696,3285949823,ES +3285949824,3285949855,EU 3285949856,3285949887,ES +3285949888,3285949951,EU 3285949952,3285950463,ES 3285950464,3285950719,GB 3285950720,3285950783,US +3285950784,3285950975,EU 3285950976,3285951231,NL 3285951232,3285951487,IT -3285951552,3285951567,GB -3285951568,3285951583,PK -3285951584,3285951615,ES -3285951616,3285951631,PK -3285951632,3285951639,DE +3285951488,3285951615,EU +3285951616,3285951647,GB 3285951648,3285951679,ES +3285951680,3285951743,EU 3285951744,3285951999,GB 3285952000,3285952255,IT 3285952256,3285952511,SA +3285952512,3285955583,EU 3285955584,3285955839,DE 3285955840,3285956095,ES 3285956096,3285956351,FR 3285956352,3285956607,DE -3285956608,3285956863,IR +3285956608,3285956863,GB 3285956864,3285957631,PT 3285957632,3285957887,PL 3285957888,3285958143,GB -3285958144,3285958655,ES +3285958144,3285958847,EU 3285958848,3285958895,NL -3285958896,3285958903,DE -3285958904,3285958911,NL -3285958912,3285959039,GB +3285958896,3285959039,GB 3285959040,3285959167,DE -3285959168,3285959423,ES +3285959168,3285959423,NL 3285959424,3285959935,GB 3285959936,3285960191,ES 3285960192,3285960447,FR 3285960448,3285960703,GB +3285960704,3285962751,EU 3285962752,3285963775,DE -3285963776,3285964031,GB -3285964032,3285964287,IR -3285964288,3285964351,KE -3285964544,3285964799,FR +3285963776,3285964287,GB +3285964288,3285964799,FR +3285964800,3285966847,EU 3285966848,3285967103,FR 3285967104,3285967359,PL 3285967360,3285967615,ES 3285967616,3285968383,BE 3285968384,3285968639,ES 3285968640,3285968895,PL +3285968896,3285971199,EU 3285971200,3285971455,FR 3285971456,3285971711,DE 3285971712,3285971967,GB +3285971968,3285972223,ES +3285972224,3285972479,EU +3285972480,3285972735,PL 3285972736,3285972991,FR +3285972992,3285975039,GB 3285975040,3286106111,FR 3286106112,3286106687,EE 3286106688,3286106691,FI 3286106692,3286114303,EE 3286114304,3286122495,BA 3286122496,3286130687,BY -3286130688,3286131711,CS +3286130688,3286131711,RS 3286131712,3286132735,PL 3286132736,3286133759,RO 3286133760,3286134783,IE 3286134784,3286135807,PL 3286135808,3286136831,NL 3286136832,3286137855,AT -3286137856,3286155263,RU +3286137856,3286138879,UA +3286138880,3286155263,RU 3286155264,3286171647,DE 3286171648,3286237183,IT 3286237184,3286243583,GB @@ -55963,14 +91915,14 @@ 3286312960,3286313983,RO 3286313984,3286314495,CH 3286314496,3286315007,IL -3286315008,3286315519,PL +3286315008,3286315519,UA 3286315520,3286316031,DE 3286316032,3286316543,UA -3286316544,3286317055,RO +3286316544,3286317055,NL 3286317056,3286317567,RU -3286317568,3286318079,PL +3286317568,3286318079,RO 3286318080,3286318591,CH -3286318592,3286319103,IL +3286318592,3286319103,A2 3286319104,3286320127,RO 3286320128,3286321151,PL 3286321152,3286322175,CZ @@ -55979,8 +91931,7 @@ 3286324224,3286325247,RO 3286325248,3286326271,DK 3286326272,3286327295,PL -3286327296,3286328319,UA -3286328320,3286329343,NL +3286327296,3286329343,NL 3286329344,3286330367,DE 3286330368,3286331391,RO 3286331392,3286332415,UA @@ -55989,7 +91940,6 @@ 3286334464,3286335487,BG 3286335488,3286336511,RU 3286336512,3286337535,DE -3286337536,3286338559,SA 3286338560,3286339583,RO 3286339584,3286340607,UA 3286340608,3286342655,DE @@ -56002,7 +91952,7 @@ 3286348800,3286349823,PL 3286349824,3286350847,SE 3286350848,3286351871,GB -3286351872,3286352895,DK +3286351872,3286352895,CH 3286352896,3286353919,DE 3286353920,3286354943,LI 3286354944,3286355967,FR @@ -56022,19 +91972,47 @@ 3286384640,3286401023,DE 3286401024,3286409215,GB 3286409216,3286417407,DE -3286417408,3286425599,IT +3286417408,3286417663,UA +3286417664,3286417919,IT +3286417920,3286418175,DE +3286418176,3286418431,AT +3286418432,3286418687,TR +3286418688,3286418943,UA +3286418944,3286419199,PL +3286419200,3286419455,DK +3286419456,3286419711,DE +3286419712,3286419967,GB +3286419968,3286420223,FI +3286420224,3286420735,RU +3286420736,3286420991,NL +3286420992,3286421247,RO +3286421248,3286421503,PL +3286421504,3286421759,KZ +3286421760,3286422015,RU +3286422016,3286422271,MD +3286422272,3286422527,FR +3286422528,3286422783,RO +3286422784,3286423039,UA +3286423040,3286423295,RO +3286423296,3286423551,UA +3286423552,3286423807,RU +3286423808,3286424063,CZ +3286424064,3286424319,LV +3286424320,3286424575,FR +3286424576,3286424831,UA +3286424832,3286425087,TR +3286425088,3286425343,RU +3286425344,3286425599,IT 3286425600,3286433791,KW -3286433792,3286476319,DE -3286476320,3286476343,AT -3286476344,3286499327,DE -3286499328,3286564863,HU +3286433792,3286499327,DE +3286499328,3286519039,HU +3286519040,3286519295,RO +3286519296,3286564863,HU 3286564864,3286566143,AE -3286566144,3286566399,TZ -3286566400,3286566655,AE +3286566144,3286566271,TZ +3286566272,3286566655,AE 3286566656,3286567423,KW -3286567424,3286567679,AE -3286567680,3286567935,TZ -3286567936,3286568191,AE +3286567424,3286568191,AE 3286568192,3286568703,KW 3286568704,3286571007,AE 3286571008,3286571775,KW @@ -56089,10 +92067,8 @@ 3286681752,3286681767,IT 3286681768,3286681775,DE 3286681776,3286681815,IT -3286681816,3286681831,ES -3286681832,3286682399,IT -3286682400,3286682415,ES -3286682416,3286682431,IT +3286681816,3286681823,FR +3286681824,3286682431,IT 3286682432,3286682463,FR 3286682464,3286682495,RO 3286682496,3286682623,IT @@ -56132,7 +92108,20 @@ 3286791680,3286791935,AT 3286791936,3286794239,GB 3286794240,3286892543,DE -3286892544,3286900735,DK +3286892544,3286893055,LI +3286893056,3286893567,RU +3286893568,3286894591,UA +3286895104,3286895615,GB +3286895616,3286896127,DE +3286896128,3286896639,SE +3286896640,3286897151,PL +3286897152,3286897663,AT +3286897664,3286898175,PL +3286898176,3286898687,HR +3286898688,3286899199,EU +3286899200,3286899711,IL +3286899712,3286900223,HU +3286900224,3286900735,RO 3286900736,3286900991,BE 3286900992,3286901503,DE 3286901504,3286902015,FR @@ -56166,7 +92155,7 @@ 3286914048,3286915071,BG 3286915072,3286916095,FR 3286916096,3286917119,DE -3286917120,3286918143,UA +3286917120,3286918143,RU 3286918144,3286919167,AT 3286919168,3286920191,DE 3286920192,3286921215,RU @@ -56248,12 +92237,14 @@ 3286952960,3286953983,BG 3286953984,3286955007,GB 3286955008,3286956031,DE -3286956032,3286957055,FR +3286956032,3286957055,A2 3286957056,3286958079,EG 3286958080,3287023615,ES -3287023616,3287154687,FI +3287023616,3287097343,FI +3287097344,3287097599,AX +3287097600,3287154687,FI 3287154688,3287162879,BE -3287162880,3287171071,DE +3287162880,3287171071,US 3287171072,3287171583,LT 3287171584,3287172095,PL 3287172096,3287172607,DE @@ -56268,7 +92259,12 @@ 3287177216,3287178239,RO 3287178240,3287178751,UA 3287178752,3287179263,RO -3287179264,3287187455,GB +3287179264,3287180287,FR +3287180288,3287181311,RU +3287181312,3287182335,UZ +3287182336,3287185407,UA +3287185408,3287186431,SE +3287186432,3287187455,FI 3287187456,3287196671,DE 3287196672,3287198719,PL 3287198720,3287199743,GB @@ -56302,13 +92298,10 @@ 3287218176,3287218431,DE 3287218432,3287218687,GB 3287218688,3287218943,RU -3287218944,3287219199,AT 3287219200,3287219455,DE 3287219456,3287219711,CH 3287219712,3287220223,SE -3287220224,3287223807,RU -3287223808,3287224319,UZ -3287224320,3287259375,RU +3287220224,3287259375,RU 3287259376,3287259383,DK 3287259384,3287267191,RU 3287267192,3287267201,KZ @@ -56320,16 +92313,15 @@ 3287425024,3287427759,SE 3287427760,3287427775,GB 3287427776,3287433215,SE -3287433216,3287433727,GB 3287433728,3287434239,DE 3287434240,3287434751,PL 3287434752,3287435263,GB 3287435264,3287435775,NL 3287435776,3287436287,GB -3287436288,3287436799,CS +3287436288,3287436799,RS 3287436800,3287437311,RO 3287437312,3287437823,UA -3287437824,3287438335,NL +3287437824,3287438335,RU 3287438336,3287438847,CH 3287438848,3287439359,GB 3287439360,3287439871,RO @@ -56345,23 +92337,51 @@ 3287446528,3287447039,PL 3287447040,3287447551,IL 3287447552,3287448063,DK -3287448064,3287448575,TR +3287448064,3287448575,GB 3287448576,3287449087,PL 3287449088,3287449599,BG -3287449600,3287450111,DE 3287450112,3287450623,DK 3287450624,3287451135,SE 3287451136,3287451647,PL 3287451648,3287452159,ES -3287452160,3287452671,NO +3287452160,3287452671,FR 3287452672,3287453183,CH -3287453184,3287453695,RU -3287453696,3287454207,GB +3287453184,3287454207,RU 3287454208,3287454719,SE 3287454720,3287455743,UA -3287455744,3287456255,PL +3287455744,3287456255,NL 3287456256,3287457279,GB 3287457280,3287457791,RO +3287457792,3287458047,NL +3287458048,3287458303,UA +3287458304,3287458559,DE +3287458560,3287459327,CH +3287459328,3287459583,AT +3287459584,3287459839,DE +3287459840,3287460095,AT +3287460096,3287460351,ME +3287460352,3287460607,CY +3287460608,3287460863,NL +3287460864,3287461119,BE +3287461120,3287461375,DE +3287461376,3287461631,CH +3287461632,3287461887,AT +3287461888,3287462143,PL +3287462144,3287462399,SA +3287462400,3287462655,BE +3287462656,3287462911,UA +3287462912,3287463167,FR +3287463168,3287463423,IT +3287463424,3287463679,RO +3287463680,3287463935,PL +3287463936,3287464191,AT +3287464192,3287464447,SK +3287464448,3287464703,PL +3287464704,3287464959,NL +3287464960,3287465215,SA +3287465216,3287465471,NO +3287465472,3287465727,DE +3287465728,3287465983,FR 3287465984,3287467007,DK 3287467008,3287468031,SA 3287468032,3287469055,UA @@ -56389,11 +92409,7 @@ 3287507984,3287507991,FR 3287507992,3287515375,DE 3287515376,3287515383,CZ -3287515384,3287516591,DE -3287516592,3287516599,CZ -3287516600,3287522399,DE -3287522400,3287522431,GR -3287522432,3287523303,DE +3287515384,3287523303,DE 3287523304,3287523311,US 3287523312,3287526303,DE 3287526304,3287526311,LU @@ -56416,11 +92432,14 @@ 3287552512,3287553023,RO 3287553024,3287553535,FR 3287553536,3287554047,IL +3287554048,3287554559,RU 3287554560,3287555071,PL 3287555072,3287555583,GB 3287555584,3287556095,FR 3287556096,3287564287,TR -3287564288,3287572479,FI +3287564288,3287564623,FI +3287564624,3287564655,AX +3287564656,3287572479,FI 3287572480,3287578863,DE 3287578864,3287578879,LI 3287578880,3287580671,DE @@ -56428,10 +92447,9 @@ 3287588864,3287597055,BE 3287597056,3287605247,GI 3287605248,3287630335,DE -3287630336,3287630847,AT -3287630848,3287631359,PL -3287631360,3287631871,DE -3287631872,3287632383,DK +3287630336,3287631359,PL +3287631360,3287631871,IR +3287631872,3287632383,RU 3287632384,3287632895,SE 3287632896,3287633407,RU 3287633408,3287633919,SK @@ -56449,13 +92467,14 @@ 3287639552,3287640063,RU 3287640064,3287640575,DE 3287640576,3287641087,SI -3287641088,3287641599,IL +3287641088,3287641599,A2 3287641600,3287642111,FI 3287642112,3287642623,UA 3287642624,3287643135,BE 3287643136,3287643647,IT 3287643648,3287644671,UA 3287644672,3287645183,NL +3287645184,3287646207,EU 3287646208,3287662591,PT 3287662592,3287662847,DE 3287662848,3287663103,DK @@ -56487,7 +92506,7 @@ 3287669760,3287670015,RO 3287670016,3287670271,UA 3287670272,3287670527,PL -3287670528,3287670783,GB +3287670528,3287670783,US 3287670784,3287671039,PL 3287671040,3287671295,AT 3287671296,3287671551,PL @@ -56527,18 +92546,50 @@ 3287704064,3287704575,NL 3287704576,3287705087,LU 3287705088,3287705599,RU -3287705600,3287706111,UA +3287705600,3287706111,SA 3287706112,3287706623,RU 3287706624,3287707135,GB 3287707136,3287707647,FR 3287707648,3287708159,BE 3287708160,3287708671,NL +3287708672,3287709183,EU 3287709184,3287709695,RU 3287709696,3287710207,SE 3287710208,3287710719,RU -3287710720,3287711231,CZ +3287710720,3287711231,UA 3287711232,3287711743,PL -3287711744,3287719935,FR +3287711744,3287711983,GB +3287711984,3287711999,FR +3287712000,3287712512,GB +3287712513,3287713023,FR +3287713024,3287713439,GB +3287713440,3287713471,FR +3287713472,3287713535,GB +3287713536,3287713567,FR +3287713568,3287713591,GB +3287713592,3287713598,FR +3287713599,3287713599,GB +3287713600,3287713603,FR +3287713604,3287713611,GB +3287713612,3287713615,FR +3287713616,3287713623,GB +3287713624,3287713667,FR +3287713668,3287713711,GB +3287713712,3287713727,FR +3287713728,3287713775,GB +3287713776,3287713791,FR +3287713792,3287714047,GB +3287714048,3287715071,FR +3287715072,3287715327,GB +3287715328,3287715839,FR +3287715840,3287716127,GB +3287716128,3287716143,FR +3287716144,3287717631,GB +3287717632,3287717887,FR +3287717888,3287718719,GB +3287718720,3287718731,FR +3287718732,3287718735,GB +3287718736,3287719935,FR 3287719936,3287728127,DE 3287728128,3287729407,IT 3287729408,3287729663,SE @@ -56556,7 +92607,8 @@ 3287736320,3287736831,PL 3287736832,3287737343,LV 3287737344,3287737855,GB -3287737856,3287738879,FR +3287737856,3287738367,FR +3287738368,3287738879,GB 3287738880,3287739391,DE 3287739392,3287739903,NL 3287739904,3287740415,PT @@ -56569,7 +92621,9 @@ 3287743488,3287743999,LV 3287744000,3287744511,FR 3287744512,3287810047,DE -3287810048,3287818239,FR +3287810048,3287816495,FR +3287816496,3287816511,A2 +3287816512,3287818239,FR 3287818240,3287826431,AT 3287826432,3287826687,LV 3287826688,3287826943,RO @@ -56607,12 +92661,19 @@ 3287851008,3287859199,UA 3287859200,3287859455,GB 3287859456,3287859711,FK +3287859712,3287859967,EU 3287859968,3287860479,GB +3287860480,3287861247,EU 3287861248,3287862015,GB +3287862016,3287863807,EU 3287863808,3287864063,GB +3287864064,3287866383,EU 3287866384,3287866439,GB +3287866440,3287866495,EU 3287866496,3287866591,GB +3287866592,3287866607,EU 3287866608,3287866623,GB +3287866624,3287867391,EU 3287867392,3287867903,UA 3287867904,3287868415,PL 3287868416,3287868927,RO @@ -56641,7 +92702,7 @@ 3287951104,3287951359,HU 3287951360,3287951615,FR 3287951616,3287951871,CH -3287951872,3287952127,FR +3287951872,3287952127,RU 3287952128,3287952383,UA 3287952384,3287953151,CH 3287953152,3287953407,IL @@ -56661,124 +92722,23 @@ 3287956992,3287957247,UA 3287957248,3287957503,GB 3287957504,3287965695,AM -3287965696,3287967743,RS -3287967744,3287967871,CS -3287967872,3287967878,RS -3287967879,3287967879,CS -3287967880,3287967883,CS -3287967884,3287967884,CS -3287967885,3287967885,CS -3287967886,3287967886,RS -3287967887,3287967888,CS -3287967889,3287967889,CS -3287967890,3287967905,RS -3287967906,3287967906,CS -3287967907,3287967935,RS -3287967936,3287967967,CS -3287967968,3287967999,CS -3287968000,3287968335,CS -3287968336,3287968383,RS -3287968384,3287968447,CS -3287968448,3287968463,RS -3287968464,3287968479,CS -3287968480,3287968495,RS -3287968496,3287968607,CS -3287968608,3287968639,RS -3287968640,3287969023,CS -3287969024,3287969791,RS -3287969792,3287969951,CS -3287969952,3287969999,RS -3287970000,3287970191,CS -3287970192,3287970207,CS -3287970208,3287970239,CS -3287970240,3287970271,CS -3287970272,3287970527,CS -3287970528,3287970559,CS -3287970560,3287970815,RS -3287970816,3287970943,CS -3287970944,3287971071,CS -3287971072,3287971327,RS -3287971328,3287971391,CS -3287971392,3287971583,RS -3287971584,3287971711,CS -3287971712,3287971839,RS -3287971840,3287972351,CS -3287972352,3287973887,RS +3287965696,3287973887,RS 3287973888,3287982079,CZ 3287982080,3287990271,EE 3287990272,3287998463,SI 3287998464,3288006655,IT 3288006656,3288072191,GR 3288072192,3288088575,SE -3288088576,3288090111,RS -3288090112,3288093183,CS -3288093184,3288093439,CS -3288093440,3288093695,RS -3288093696,3288097023,CS -3288097024,3288097279,RS -3288097280,3288097727,CS -3288097728,3288097759,CS -3288097760,3288097775,RS -3288097776,3288097791,CS -3288097792,3288099007,CS -3288099008,3288099327,RS -3288099328,3288099455,CS -3288099456,3288099583,CS -3288099584,3288099719,CS -3288099720,3288099727,CS -3288099728,3288099735,CS -3288099736,3288099775,CS -3288099776,3288099783,RS -3288099784,3288099799,CS -3288099800,3288099839,RS -3288099840,3288100351,CS -3288100352,3288100415,CS -3288100416,3288100431,RS -3288100432,3288100463,CS -3288100464,3288100479,RS -3288100480,3288100607,CS -3288100608,3288100735,CS -3288100736,3288101119,CS -3288101120,3288101135,CS -3288101136,3288101151,RS -3288101152,3288101167,CS -3288101168,3288101503,RS -3288101504,3288101599,CS -3288101600,3288101615,CS -3288101616,3288101887,CS -3288101888,3288102143,CS -3288102144,3288102527,CS -3288102528,3288102543,RS +3288088576,3288102543,RS 3288102544,3288102551,DK -3288102552,3288102655,RS -3288102656,3288102911,CS -3288102912,3288103167,CS -3288103168,3288103183,CS -3288103184,3288103199,RS -3288103200,3288103231,CS -3288103232,3288103295,RS -3288103296,3288103399,CS -3288103400,3288103407,RS -3288103408,3288103935,CS -3288103936,3288103967,CS -3288103968,3288103983,CS -3288103984,3288104079,RS -3288104080,3288104111,CS -3288104112,3288104191,RS -3288104192,3288104279,CS -3288104280,3288104287,RS -3288104288,3288104383,CS -3288104384,3288104415,CS -3288104416,3288104639,CS -3288104640,3288104703,CS -3288104704,3288104767,CS -3288104768,3288104799,RS -3288104800,3288104959,CS +3288102552,3288104959,RS 3288104960,3288143615,DE 3288143616,3288143871,CH 3288143872,3288145663,DE 3288145664,3288146175,CH -3288146176,3288236031,DE +3288146176,3288150015,DE +3288150016,3288151551,NL +3288151552,3288236031,DE 3288236032,3288236543,LI 3288236544,3288237055,FR 3288237056,3288238591,RO @@ -56792,192 +92752,529 @@ 3288242176,3288242687,RO 3288242688,3288243199,FR 3288243200,3288243711,PL -3288243712,3288244223,FR -3288244224,3288252415,KG +3288243712,3288244735,FR +3288244736,3288245247,DE +3288245248,3288245759,GB +3288245760,3288246271,RO +3288246272,3288246783,DK +3288246784,3288247295,KW +3288247296,3288247807,NO +3288247808,3288248831,PL +3288248832,3288249855,GB +3288249856,3288250367,RO +3288250368,3288250879,PL +3288250880,3288251903,RU +3288251904,3288252415,AT 3288252416,3288260607,NO 3288260608,3288268799,IT 3288268800,3288334335,FI +3288334336,3288399871,UG +3288399872,3288400127,MU 3288400128,3288400383,IN 3288400384,3288400639,PR 3288400640,3288400895,SA +3288400896,3288401151,KE 3288401152,3288401407,RU 3288401408,3288401663,SA +3288401664,3288401919,MU +3288401920,3288403711,ZA +3288403712,3288403967,MU +3288403968,3288406527,ZA +3288406528,3288407039,KE +3288407040,3288408063,NA +3288408064,3288413183,ZA +3288413184,3288414207,TZ +3288414208,3288416255,ZA 3288416256,3288417279,SA 3288417280,3288417535,IN 3288417536,3288418047,KW +3288418048,3288418303,ZA 3288418304,3288418815,US +3288418816,3288423423,ZA +3288423424,3288425727,SN +3288425728,3288426495,ZA 3288426496,3288427263,IN 3288427264,3288427519,BM 3288427520,3288428543,IN 3288428544,3288428799,CU 3288428800,3288429311,IN +3288429312,3288429567,ZA +3288429568,3288430335,GH +3288430336,3288430591,EG +3288430592,3288432639,SC +3288432640,3288433151,ZA +3288433152,3288434175,BW 3288434176,3288434431,IN 3288434432,3288434687,CU 3288434688,3288434943,JM +3288434944,3288435199,GH 3288435200,3288435711,JM 3288435712,3288435967,US 3288435968,3288436223,PR 3288436224,3288436479,US +3288436480,3288436735,EG +3288436736,3288440831,ZA 3288440832,3288441103,VC 3288441104,3288442879,BB 3288442880,3288443135,KN -3288443136,3288443391,BB -3288443392,3288443647,VC +3288443136,3288443647,VC 3288443648,3288444927,BB +3288444928,3288449023,NG +3288449024,3288465407,SD 3288465408,3288465919,JM +3288465920,3288466175,ZA +3288466176,3288466431,MU 3288466432,3288467455,SY +3288467456,3288469503,BI +3288469504,3288485887,ZA +3288485888,3288489983,MA +3288489984,3288514559,ZA +3288514560,3288530943,EG 3288530944,3288532991,JM 3288532992,3288534527,PR +3288534528,3288535039,EG 3288535040,3288539135,AN 3288539136,3288545535,US +3288545536,3288545791,ZA +3288545792,3288546303,KE +3288546304,3288547327,NG +3288547328,3288547583,GH 3288547584,3288547839,IN 3288547840,3288548095,SA 3288548096,3288549375,AE 3288549376,3288549631,PK 3288549632,3288549887,GD 3288549888,3288553983,DO +3288553984,3288554239,CM 3288554240,3288554495,IR +3288554496,3288555007,ZA +3288555008,3288555263,NA 3288555264,3288555519,JM +3288555520,3288557567,MZ 3288557568,3288557823,JM +3288557824,3288558079,ZA 3288558080,3288558335,DO +3288558336,3288558847,ZA +3288558848,3288559103,MU +3288559104,3288564735,ZA 3288564736,3288568831,TT +3288568832,3288569855,ZA 3288569856,3288570111,CU 3288570112,3288570367,JM +3288570368,3288577023,ZA +3288577024,3288578047,NG 3288578048,3288580095,JM 3288580096,3288588287,BB +3288588288,3288608255,ZA 3288608256,3288614655,US +3288614656,3288616959,ZA +3288616960,3288617215,ZW +3288617216,3288661759,ZA +3288661760,3288662015,LS +3288662016,3289070335,ZA +3289070336,3289070591,ZW +3289070592,3289070847,NA +3289070848,3289086975,ZA +3289086976,3289087231,SZ +3289087232,3289120767,ZA 3289120768,3289123327,PR +3289123328,3289123583,NA +3289123584,3289123839,EG +3289123840,3289124863,ZM +3289124864,3289128959,ZA 3289128960,3289137151,IN 3289137152,3289153535,BM -3289161728,3289163263,PR -3289163264,3289163519,US -3289163520,3289169919,PR +3289153536,3289161727,RW +3289161728,3289169631,PR +3289169632,3289169663,US +3289169664,3289169919,PR +3289169920,3289186303,MA +3289186304,3289229311,ZA +3289229312,3289229567,SZ +3289229824,3289230591,ZA +3289233408,3289320191,ZA +3289320192,3289320447,NA 3289321472,3289325567,IN 3289325568,3289333759,SA -3290103808,3290104831,US -3290104832,3290105855,VE -3290105856,3290107351,US -3290107352,3290107359,CA +3289333760,3289376767,ZA +3289376768,3289378815,SZ +3289378816,3289645055,ZA +3289645056,3289653247,NA +3289653248,3289661439,EG +3289661440,3289677823,DZ +3289677824,3289710591,MU +3289710592,3289777407,ZA +3289777408,3289777663,EG +3289777664,3289777919,NG +3289777920,3289778175,EG +3289778176,3289779199,CD +3289779200,3289780223,GW +3289780224,3289788415,ZA +3289788416,3289792511,MZ +3289792512,3289796607,ZA +3289796608,3289796863,SZ +3289796864,3289809407,ZA +3289809408,3289809663,EG +3289809664,3289809919,KE +3289809920,3289812991,ZA +3289812992,3289817087,MU +3289817088,3289907199,ZA +3289907200,3289908223,LS +3289908224,3289923583,ZA +3289923584,3289924607,SZ +3289924608,3290103807,ZA +3290103808,3290104319,JO +3290104320,3290104831,EG +3290104832,3290106879,VE +3290106880,3290107135,CL +3290107136,3290107151,CA +3290107152,3290107167,US +3290107168,3290107231,CA +3290107232,3290107263,US +3290107264,3290107311,CA +3290107312,3290107343,US +3290107344,3290107359,CA 3290107360,3290107375,US 3290107376,3290107383,CA -3290107384,3290111999,US -3290112000,3290112127,CA -3290112128,3290120191,US -3290181632,3290181887,US -3290181888,3290181951,PR -3290181952,3290181959,US -3290181960,3290181967,PR -3290181968,3290182031,US -3290182032,3290182399,PR -3290182400,3290182655,US -3290182656,3290183230,PR -3290183231,3290183262,US -3290183263,3290183326,PR -3290183327,3290183679,US -3290183680,3290185727,PR +3290107384,3290107391,US +3290107392,3290107647,CA +3290107648,3290108415,US +3290108416,3290108671,CA +3290108672,3290108927,US +3290108928,3290109183,GH +3290109184,3290109439,MU +3290109440,3290109695,ET +3290109696,3290110207,PR +3290110208,3290110463,US +3290110464,3290110719,ES +3290110720,3290110975,DO +3290110976,3290111487,US +3290111488,3290111743,MX +3290111744,3290111999,US +3290112000,3290112143,CA +3290112144,3290116095,US +3290116096,3290118399,PE +3290118400,3290120191,US +3290120192,3290128383,MU +3290128384,3290136575,ZW +3290169344,3290171135,ZA +3290171136,3290171391,SZ +3290171392,3290171647,ZA +3290171904,3290172159,NG +3290172160,3290172415,KE +3290172416,3290181631,ZA +3290181632,3290185727,PR +3290185728,3290226687,ZA +3290226688,3290230783,MZ +3290230784,3290234879,BF +3290234880,3290243071,ZA +3290243072,3290245119,ZW +3290245120,3290246143,DZ +3290247168,3290249215,TZ 3290251264,3290259455,TT +3290259456,3290267647,GH +3290267648,3290275839,ZA +3290275840,3290284031,SD +3290284032,3290288127,AO +3290288128,3290292223,NG +3290292224,3290296319,GH +3290296320,3290431487,ZA 3290431488,3290433535,JM 3290439680,3290447871,TT 3290447872,3290456063,AR -3290464256,3290472447,PR +3290456064,3290460159,MZ +3290460160,3290464255,ML +3290464256,3290468351,PR +3290468352,3290468607,DO +3290468608,3290471487,PR +3290471488,3290471551,DO +3290471552,3290472447,PR +3290472448,3290480639,ZA +3290480640,3290482687,AO +3290482688,3290484735,CF +3290484736,3290486783,ZA +3290486784,3290488831,SC +3290488832,3290489343,NG +3290489344,3290489855,KE +3290489856,3290490367,EG +3290497024,3290955775,ZA 3290955776,3290980351,CR +3290980352,3290984447,ZA +3291021312,3291029503,ZA +3291029504,3291033343,TZ +3291033344,3291033599,KE +3291033600,3291037695,TZ +3291037696,3291078655,ZA +3291078656,3291086847,DZ 3291086848,3291103231,PR -3301507328,3301507583,ZW +3291152384,3291168767,ZA +3291168768,3291176959,TZ +3291176960,3291185151,ZW +3291185152,3291201535,UG +3291217920,3291230207,ZA +3291230208,3291234303,GH +3291234304,3291242495,ZA +3291242496,3291250687,GH +3291250688,3291258879,NA +3291258880,3291262975,TZ +3291262976,3291267071,ZW +3291267072,3291279359,ZA +3291279360,3291283455,RW +3291283456,3291287551,NA +3291287552,3291291647,ZA +3291291648,3291293375,TZ +3291293376,3291293439,NG +3291293440,3291293951,TZ +3291293952,3291294079,KE +3291294080,3291295743,TZ +3291295744,3291299839,NG +3291299840,3291316223,ZA +3291316224,3291324415,TZ +3291324416,3291325439,AO +3291325440,3291326463,BW +3291326464,3291330559,ZA +3291330560,3291331583,TZ +3291331584,3291332607,MW +3291332608,3291348991,NG +3291348992,3291353087,MZ +3291353088,3291353343,KE +3291353344,3291353599,EG +3291353600,3291354111,ZM +3291354112,3291354367,NG +3291354368,3291354623,AO +3291354624,3291354879,EG +3291354880,3291355135,ZA +3291355136,3291355391,EG +3291355392,3291355647,ZA +3291355648,3291355903,EG +3291355904,3291356159,NG +3291356160,3291356415,NA +3291356416,3291356671,EG +3291356672,3291357183,ZA +3291357184,3291365375,MU +3291365376,3291367423,ZA +3291367424,3291369471,AO +3291369472,3291373567,GH +3291373568,3291377663,TZ +3291377664,3291379711,ZA +3291379712,3291380735,TZ +3291380736,3291381759,ZM +3291381760,3291383807,TZ +3291383808,3291385855,ZA +3291385856,3291386879,NG +3291386880,3291387903,SC +3291387904,3291388927,BJ +3291388928,3291389951,GA +3291389952,3291397119,ZA +3291397120,3291398143,EG +3291398144,3291406335,ZM +3291406336,3291408383,ZA +3291408384,3291410431,GM +3291410432,3291412479,NG +3291412480,3291414527,DZ +3291414528,3291431423,ZA +3291431424,3291431551,NA +3291431552,3291432191,ZA +3291432192,3291432447,NA +3291432448,3291433471,ZA +3291433472,3291433727,NA +3291433728,3291435519,ZA +3291435520,3291436543,NA +3291436544,3291437567,ZA +3291437568,3291437823,NA +3291437824,3291439103,ZA +3291447296,3291463679,CI +3300917248,3300921343,MU +3300925440,3300929535,MG +3300933632,3300950015,MU +3301441536,3301445631,NG +3301445632,3301453823,KE +3301453824,3301457919,ML +3301457920,3301462015,NG +3301462016,3301466111,ML +3301466112,3301470207,ER +3301470208,3301474303,NG +3301474304,3301490687,MA +3301490688,3301494783,DZ +3301494784,3301498879,NG +3301498880,3301507071,GH +3301507328,3301507583,US +3301507584,3301507839,GH +3301507840,3301508095,EG 3301508096,3301508607,MW +3301508608,3301509119,ZA 3301510144,3301511167,MW 3301511168,3301513215,ZW -3301539840,3301543935,KE -3301543936,3301543951,NG -3301543952,3301543967,TZ -3301543968,3301544191,UG -3301544192,3301544959,DE -3301544960,3301548031,KE -3301566464,3301568511,BE -3302449152,3302449279,DK +3301513216,3301515263,EG +3301515264,3301523455,GH +3301523456,3301531647,CI +3301539840,3301548031,KE +3301548032,3301556223,GH +3301556224,3301560319,DJ +3301560320,3301566463,KE +3301568512,3301570559,EG +3301570560,3301572607,KE +3301572608,3301605375,EG +3301605376,3301613567,SD +3301613568,3301621759,NG +3301621760,3301629951,KE +3301629952,3301631999,NG +3301632000,3301634047,CM +3301634048,3301636095,LS +3301636096,3301637119,ZA +3301637120,3301638143,AO +3301638144,3301703679,TN +3301703680,3301834751,EG +3301834752,3301900287,MA +3301900288,3301902663,NG +3301902664,3301902671,CM +3301902672,3301904383,NG +3301904384,3301908479,KE +3301908480,3301912575,ZA +3301912576,3301916671,MU +3301933056,3301949439,NG +3301949440,3301965823,SN +3301965824,3302490111,ZA 3302490368,3302490623,US -3321956352,3321960959,US -3321962496,3321967615,US +3302490624,3302492159,MU +3302492160,3302494207,MW +3302494208,3302496255,ZA +3302498304,3302506495,NA +3302506496,3302514687,KE +3302522880,3302524927,KE +3302524928,3302525951,AO +3302525952,3302526975,EG +3302526976,3302529023,NG +3302529024,3302530047,ZA +3302530048,3302531071,TN +3302531072,3302531327,CF +3302531328,3302531583,AO +3302531584,3302531839,TZ +3302531840,3302532095,BW +3302532096,3302533119,NA +3302533120,3302533631,MU +3302533632,3302533887,ZA +3302533888,3302534143,MU +3302534144,3302535167,ZA +3302535168,3302536191,UG +3302536192,3302537215,GH +3302537216,3302538239,NG +3302552576,3302552831,TZ +3302552832,3302553087,KE +3302553088,3302553343,EG +3302553344,3302553599,TZ +3302553600,3302554111,AO +3302554112,3302554367,ZA +3302554368,3302554623,NG +3302554624,3302554879,EG +3302554880,3302555135,NG +3302555136,3302555391,MU +3302555392,3302555647,NG +3302555648,3302621183,MA +3302621184,3302684671,EG +3302684672,3302686719,JO +3302686720,3302752255,EG +3302752256,3302753031,NG +3302753032,3302753039,MA +3302753040,3302753359,NG +3302753360,3302753363,CM +3302753364,3302753607,NG +3302753608,3302753615,GH +3302753616,3302760447,NG +3302760448,3302768639,ZA +3302817792,3302883327,EG +3302883328,3302948863,MA +3302948864,3302949119,MU +3302949120,3302949375,AO +3302949376,3302949631,ZM +3302949632,3302949887,BI +3302949888,3302950143,CI +3302950144,3302950655,TZ +3302950656,3302950911,EG +3302950912,3302951423,ZA +3302951424,3302951679,SL +3302951680,3302951935,KE +3302951936,3302952191,RW +3302952192,3302952447,AO +3302952448,3302952959,ZA +3302952960,3302953471,EG +3302953472,3302953727,NA +3302953728,3302953983,AO +3305111552,3307208703,TN +3315597312,3316121599,EG +3317694464,3318218751,EG +3318218752,3318743039,DZ +3319791616,3320053759,MU +3320053760,3320315903,ZA +3321886720,3321888767,MU +3321954304,3321970687,US 3322019840,3322023935,US 3322023936,3322028031,CL -3322085376,3322167295,US -3322167296,3322167807,GB -3322167808,3322351615,US -3322355712,3322372095,US -3322380288,3322396671,US -3322404864,3322427647,US -3322429440,3322430975,US -3322445824,3322609663,US +3322085376,3322167551,US +3322167552,3322167807,GB +3322167808,3322202111,US +3322202112,3322203135,GB +3322203136,3322250975,US +3322250976,3322251007,IL +3322251008,3322251335,US +3322251336,3322251343,IL +3322251344,3322254719,US +3322254720,3322254783,CA +3322254784,3322339583,US +3322339584,3322339839,GB +3322339840,3322609663,US 3322609664,3322610687,SA 3322610688,3322611711,US -3322613760,3322638847,US -3322675200,3322677759,US -3322679296,3322683391,US +3322613760,3322642431,US +3322675200,3322683391,US 3322683392,3322691583,BR -3322740736,3322759679,US -3322806272,3322855423,US -3322872832,3322875903,US +3322740736,3322773503,US +3322806272,3322875903,US 3322875904,3322888191,AU -3322937344,3322938367,US -3322939392,3322943743,US +3322937344,3322945535,US 3323003136,3323003391,JP 3323003392,3323003647,US 3323004160,3323004671,US 3323004672,3323004927,CN -3323004928,3323007743,US -3323009024,3323011071,US -3323011328,3323013631,US +3323004928,3323013631,US 3323013888,3323014143,CA -3323014400,3323015679,US -3323016192,3323017727,US +3323014144,3323017727,US 3323017728,3323017983,CA 3323017984,3323018239,US 3323018752,3323020799,US 3323020800,3323021055,SG 3323021056,3323022591,US 3323022592,3323022847,GB -3323022848,3323025663,US -3323025920,3323027199,US -3323027456,3323027711,CA -3323027712,3323030015,US +3323022848,3323030015,US 3323030016,3323030271,AU 3323030272,3323031039,US -3323031808,3323032575,AU +3323031552,3323032575,AU 3323032576,3323032831,US 3323032832,3323033087,IT 3323033088,3323033343,JP 3323033600,3323034111,BR -3323034112,3323038463,US +3323034112,3323038719,US 3323038720,3323038975,CA -3323038976,3323043839,US -3323044096,3323046399,US -3323046912,3323048447,US -3323048704,3323048959,US +3323038976,3323048959,US 3323048960,3323049727,NL -3323049728,3323056895,US -3323057408,3323058175,US -3323058432,3323058943,US -3323059200,3323061247,US +3323049728,3323061247,US 3323061248,3323061503,SG 3323061504,3323062015,US 3323062016,3323062527,BR 3323062784,3323064319,US 3323064320,3323064831,AU -3323064832,3323066367,US -3323066624,3323068159,US -3323068416,3323199487,US +3323064832,3323068415,US 3323201536,3323203583,CA 3323203584,3323207679,US 3323207680,3323215871,CA -3323267072,3323286015,US +3323265024,3323297791,US 3323330816,3323331071,US 3323331072,3323331839,CA -3323331840,3323333119,US -3323333376,3323339263,US +3323331840,3323339263,US 3323339264,3323339519,AU 3323339520,3323339775,TH 3323340032,3323340287,NZ -3323340288,3323340799,US -3323341056,3323342335,US +3323340288,3323342335,US 3323342592,3323343615,AU 3323343616,3323343871,DE 3323343872,3323345919,US @@ -56986,96 +93283,118 @@ 3323354368,3323355647,DE 3323355904,3323356671,US 3323356672,3323356927,CA -3323356928,3323357695,US -3323358208,3323365119,US -3323365632,3323365887,US -3323366144,3323367423,US -3323367680,3323374079,US -3323374336,3323376127,US -3323376384,3323376639,US -3323376896,3323378687,US +3323356928,3323378687,US 3323378688,3323378943,CA -3323378944,3323380479,US -3323380736,3323382271,US -3323383552,3323383807,US -3323386112,3323388927,US -3323389184,3323391231,US +3323378944,3323391231,US 3323391232,3323391487,CA 3323391488,3323394559,US 3323394560,3323395071,CL -3323395072,3323395327,US -3323395584,3323395839,US -3323396096,3323402751,US -3323404288,3323408383,US -3323461632,3323464191,US -3323465728,3323469823,US -3323527168,3323658239,US -3323658496,3323659263,US +3323395072,3323412479,US +3323461632,3323659263,US 3323659264,3323660543,NZ -3323662336,3323665407,US -3323666432,3323672831,US -3323723776,3323727103,US -3323727872,3323730943,US -3323731968,3323791103,US -3323791360,3323797503,US -3323805696,3323806207,CA -3323806208,3323854335,US -3323854848,3324051455,US +3323662336,3323674623,US +3323723776,3324051455,US 3324051456,3324182527,CA -3324182528,3324189183,US -3324190720,3324193279,US -3324198912,3324211711,US -3324215296,3324251135,US -3324252160,3324255231,US +3324182528,3324256255,US 3324256256,3324259327,SA 3324259328,3324259583,US 3324259584,3324259839,SA 3324259840,3324260095,US -3324264448,3324277247,US -3324280832,3324315391,US -3324315648,3324320767,US -3324321792,3324325631,US -3324329984,3324337663,US -3324346368,3324347647,US +3324264448,3324379135,US 3324379136,3324380159,CA -3324380160,3324380927,US -3324381184,3324382463,US -3324383232,3324391423,US -3324395520,3324398079,US -3324411904,3324521471,US -3324526592,3324567551,US -3324575744,3324579327,US -3324579840,3324582911,NZ -3324583936,3324587775,CL +3324380160,3324391423,US +3324395520,3324399615,US +3324411904,3324579839,US +3324579840,3324583935,NZ +3324583936,3324588031,CL 3324592128,3324596223,US -3324641280,3324772351,US -3324837888,3324840959,US -3324841984,3324850175,US -3324854272,3324867071,US -3324903424,3324905983,US -3324911616,3324915711,US -3324919808,3324923903,US -3324968960,3324972287,US -3324973056,3324976895,US -3324977152,3324979967,US -3324985344,3324991743,US +3324641280,3324642303,US +3324642304,3324642559,CA +3324642560,3324645887,US +3324645888,3324646143,CA +3324646144,3324646911,US +3324646912,3324647167,CA +3324647168,3324647679,US +3324647680,3324647935,CA +3324647936,3324650495,US +3324650496,3324650751,CA +3324650752,3324653311,US +3324653312,3324653567,CA +3324653568,3324655359,US +3324655360,3324655615,CA +3324655616,3324655871,US +3324655872,3324656127,CA +3324656128,3324659967,US +3324659968,3324660223,CA +3324660224,3324660479,US +3324660480,3324660735,CA +3324660736,3324662015,US +3324662016,3324662271,CA +3324662272,3324662527,US +3324662528,3324662783,CA +3324662784,3324664319,US +3324664320,3324664575,CA +3324664576,3324665855,US +3324665856,3324666367,CA +3324666368,3324668415,US +3324668416,3324668671,CA +3324668672,3324672767,US +3324672768,3324673023,CA +3324673024,3324674815,US +3324674816,3324675327,CA +3324675328,3324676351,US +3324676352,3324676863,CA +3324676864,3324678143,US +3324678144,3324678399,CA +3324678400,3324678911,US +3324678912,3324679167,CA +3324679168,3324679423,US +3324679424,3324679935,CA +3324679936,3324681215,US +3324681216,3324681471,CA +3324681472,3324682495,US +3324682496,3324682751,CA +3324682752,3324684799,US +3324684800,3324685055,CA +3324685056,3324686335,US +3324686336,3324686591,CA +3324686592,3324690687,US +3324690688,3324690943,CA +3324690944,3324692991,US +3324692992,3324693247,CA +3324693248,3324693503,US +3324693504,3324693759,CA +3324693760,3324694015,US +3324694016,3324694271,CA +3324694272,3324694527,US +3324694528,3324695039,CA +3324695040,3324695551,US +3324695552,3324696575,CA +3324696576,3324696831,US +3324696832,3324697087,CA +3324697088,3324698623,US +3324698624,3324699135,CA +3324699136,3324699391,US +3324699392,3324699647,CA +3324699648,3324701183,US +3324701184,3324702207,CA +3324702208,3324703999,US +3324704000,3324704255,CA +3324704256,3324706303,US +3324706304,3324706559,CA +3324706560,3325034495,US 3325034496,3325035519,NZ -3325035520,3325045759,US +3325035520,3325046783,US 3325050880,3325059071,US 3325100288,3325100543,US 3325100544,3325100799,HK 3325100800,3325101055,NZ -3325101312,3325102335,US -3325102592,3325105919,US -3325106176,3325108223,US +3325101056,3325108223,US 3325108224,3325110271,AU -3325110272,3325111807,US -3325120768,3325122047,US +3325110272,3325112319,US +3325120512,3325122047,US 3325122304,3325122559,AU -3325123328,3325124351,US -3325124608,3325125375,US -3325125888,3325126143,US -3325126400,3325128703,US +3325122560,3325128703,US 3325128704,3325129215,TH 3325129216,3325131775,US 3325131776,3325132031,AU @@ -57085,659 +93404,521 @@ 3325134848,3325135359,US 3325136128,3325136383,CA 3325136384,3325136639,US -3325136896,3325137919,US -3325138176,3325141503,US -3325141760,3325142015,US +3325136896,3325142015,US 3325142016,3325142271,AR 3325142272,3325144831,US 3325144832,3325145087,CA -3325145088,3325145599,US -3325145856,3325151231,US -3325151488,3325162239,US -3325162496,3325165311,US -3325165568,3325169663,US +3325145088,3325169663,US 3325169664,3325171711,BR 3325173760,3325190143,US -3325231360,3325232127,US +3325231104,3325232127,US 3325232128,3325233151,AU -3325233408,3325234175,US +3325233152,3325234175,US 3325234176,3325234431,SA -3325234432,3325242367,US -3325242880,3325247231,US -3325247488,3325249279,US +3325234432,3325249279,US 3325249280,3325249535,CO -3325249536,3325250303,US -3325250816,3325253631,US -3325253888,3325256447,US +3325249536,3325256447,US 3325256448,3325256703,HK 3325256960,3325257215,ID 3325257216,3325257727,US 3325258752,3325259775,US 3325259776,3325261311,CA -3325261312,3325264639,US -3325266944,3325267711,US +3325261312,3325264895,US +3325267200,3325267711,US 3325267712,3325268735,SY 3325268736,3325269759,US 3325269760,3325270015,CA -3325270272,3325271039,US +3325270016,3325271039,US 3325271040,3325271295,CA 3325271296,3325271551,US -3325271808,3325272575,US -3325272832,3325274111,US -3325274624,3325278719,US +3325271808,3325278719,US 3325278720,3325278975,AU 3325278976,3325281023,US 3325281024,3325281279,NZ 3325281280,3325281535,AU 3325281536,3325284863,US 3325284864,3325285375,AU -3325285632,3325292543,US -3325292800,3325296383,US -3325296640,3325298687,US -3325300736,3325303295,US +3325285376,3325304831,US 3325304832,3325307647,CA 3325307648,3325307903,BB 3325307904,3325308927,CA -3325313024,3325319423,US +3325313024,3325321215,US 3325362176,3325427711,CA +3325427712,3325460479,ZA +3325463808,3325464063,ZA +3325464064,3325465087,NA +3325465088,3325493247,ZA 3325493248,3325497343,US -3325497344,3325499903,PR -3325501440,3325503999,US -3325509632,3325517311,US -3325526016,3325551615,US -3325558784,3325562879,US -3325562880,3325565439,PH -3325566976,3325572095,US -3325575168,3325591551,US -3325626368,3325630975,US -3325632512,3325635583,US +3325497344,3325501439,PR +3325501440,3325505535,US +3325509632,3325517823,US +3325526016,3325562879,US +3325562880,3325566975,PH +3325566976,3325591551,US +3325624320,3325640703,US 3325640704,3325644799,CA 3325689856,3325690367,JM -3325690368,3325691647,US -3325691904,3325693183,BR -3325693952,3325697023,US -3325698048,3325699839,US +3325690368,3325691903,US +3325691904,3325693951,BR +3325693952,3325700095,US 3325706240,3325708287,US 3325755392,3325886463,US -3325886720,3325887487,NZ -3325887488,3325888255,US +3325886464,3325887487,NZ +3325887488,3325888511,US 3325888512,3325890559,AU -3325890560,3325901055,US -3325902848,3325911039,US +3325890560,3325911039,US 3325952000,3325956095,US 3325956096,3325960191,CA -3325960192,3325967871,US -3325968384,3325976063,US +3325960192,3325976063,US 3325976064,3325976319,CA 3325976320,3325980671,US 3325980672,3325980927,CA -3325980928,3325986815,US -3325987072,3325992447,US +3325980928,3325992447,US 3325992448,3325992959,CA -3325992960,3325993215,US -3325993472,3325993727,US -3325994240,3325996799,US +3325992960,3325996799,US 3325996800,3325997055,CA -3325997056,3326003455,US -3326004224,3326010623,US -3326010880,3326017279,US -3326017536,3326349823,US +3325997056,3326189567,US +3326189568,3326189823,A1 +3326189824,3326190591,US +3326190592,3326190719,A1 +3326190720,3326190847,US +3326190848,3326190975,A1 +3326190976,3326191295,US +3326191296,3326191359,A1 +3326191360,3326191551,US +3326191552,3326191583,A1 +3326191584,3326349823,US 3326349824,3326350335,EC 3326350336,3326390527,US 3326390528,3326390535,CA -3326390536,3326492239,US +3326390536,3326400639,US +3326400640,3326400655,PR +3326400656,3326402111,US +3326402112,3326402119,PR +3326402120,3326406655,US +3326406656,3326408703,CO +3326408704,3326413823,US +3326413824,3326414335,YE +3326414336,3326420991,US +3326420992,3326423039,PR +3326423040,3326476495,US +3326476496,3326476503,GE +3326476504,3326492239,US 3326492240,3326492255,CA -3326492256,3326543359,US -3326543872,3326548991,US -3326550016,3326553087,US -3326558208,3326561279,US -3326607360,3326608895,US -3326609408,3326610687,US -3326611456,3326613503,US -3326615552,3326618111,US -3326623744,3326627327,US -3326680832,3326681087,CA -3326681344,3326682623,CA +3326492256,3326526463,US +3326526464,3326526719,CA +3326526720,3326574591,US +3326607360,3326640127,US +3326680832,3326682623,CA 3326682624,3326682879,US -3326682880,3326697215,CA -3326699776,3326713343,CA +3326682880,3326713343,CA 3326713344,3326714111,US 3326714112,3326716927,CA 3326716928,3326717951,US -3326717952,3326728703,CA -3326728960,3326729215,CA +3326717952,3326729215,CA 3326729216,3326729471,JP 3326729472,3326729727,CA -3326729728,3326730495,US -3326731264,3326734335,US +3326729728,3326734335,US 3326734336,3326737663,CA 3326737664,3326737919,US 3326737920,3326738175,CA -3326738432,3326739455,US -3326740480,3326745599,US -3326746624,3326749183,US -3326754816,3326757375,US -3326771200,3326796799,US -3326803968,3327397119,US -3327397888,3327408127,US -3327459328,3327723263,US -3327723520,3327725311,CA -3327725568,3327728127,US -3327729664,3327732735,US -3327737856,3327743231,US -3327754240,3327769087,US -3327770368,3327779839,US -3327787008,3327788287,US -3327789056,3327790591,US -3327791104,3327792127,US -3327795200,3327805695,US -3327819776,3327856127,US -3327856640,3327857919,US -3327860736,3327863295,US -3327868928,3327871487,US -3327918080,3328028671,US +3326738432,3326952191,US +3326952192,3326952447,AS +3326952448,3326953983,US +3326953984,3326954495,AS +3326954496,3327144959,US +3327144960,3327145983,CA +3327145984,3327162367,US +3327162368,3327162623,GB +3327162624,3327162879,US +3327162880,3327163391,GB +3327163392,3327197183,US +3327197184,3327198207,JP +3327198208,3327199231,US +3327199232,3327200255,BR +3327200256,3327256831,US +3327256832,3327257087,GU +3327257088,3327723519,US +3327723520,3327725567,CA +3327725568,3327733759,US +3327737856,3327746047,US +3327754240,3327995903,US +3327995904,3327996927,AN +3327996928,3328028671,US 3328028672,3328030719,AN 3328030720,3328180223,US -3328180480,3328181247,CA -3328181760,3328185855,CA -3328186112,3328187647,CA -3328187904,3328196351,CA -3328196608,3328202751,CA -3328204800,3328235263,CA -3328235520,3328236799,CA -3328237312,3328245759,CA -3328245760,3328249087,US -3328249856,3328253439,US -3328253952,3328265471,US -3328265728,3328268543,US -3328269056,3328271871,US -3328272128,3328297215,US -3328298240,3328298495,US -3328298752,3328299775,US -3328303872,3328304127,US -3328305664,3328306431,US -3328307200,3328307455,US -3328307968,3328308223,US -3328308480,3328308735,US -3328308992,3328309247,US -3328309504,3328311039,US -3328311296,3328313087,US -3328313344,3328314623,US -3328315392,3328316927,US -3328319488,3328323583,US -3328327680,3328332799,US -3328344064,3328356863,US -3328376832,3328383487,US -3328385024,3328412159,US -3328412416,3328412927,US -3328413184,3328414719,US +3328180224,3328210175,CA +3328210176,3328210943,AE +3328210944,3328214783,CA +3328214784,3328215295,GB +3328215296,3328233983,CA +3328233984,3328234239,AE +3328234240,3328235007,CA +3328235008,3328235263,US +3328235520,3328241663,CA +3328241664,3328243199,US +3328243200,3328245759,CA +3328245760,3328414719,US 3328414720,3328414975,CH -3328414976,3328417279,US -3328417792,3328420351,US +3328414976,3328420351,US 3328420352,3328420607,CA 3328420608,3328421119,US 3328421120,3328421375,HK -3328421376,3328427007,US -3328427264,3328432639,US +3328421376,3328432639,US 3328432640,3328433663,CA 3328433664,3328433919,CH -3328433920,3328442111,US -3328442368,3328447999,US -3328450560,3328453119,US -3328458752,3328466431,US +3328433920,3328475135,US 3328475136,3328477183,CA -3328507904,3328509695,US -3328509952,3328511231,US -3328512000,3328514559,US -3328516096,3328520191,US -3328573440,3328574463,US -3328574720,3328575487,US -3328577536,3328580607,US -3328581632,3328591615,US -3328591872,3328592895,US -3328594688,3328617983,US +3328507904,3328524287,US +3328573440,3328617983,US 3328617984,3328618239,CA -3328618240,3328630015,US -3328630272,3328630783,US +3328618240,3328630783,US 3328630784,3328631807,CA -3328631808,3328636671,US -3328636928,3328638719,US +3328631808,3328638975,US 3328638976,3328704511,CA -3328704512,3328771839,US -3328772096,3328773375,US -3328774144,3328776703,US +3328704512,3328774399,US +3328774400,3328775935,CA +3328775936,3328776703,US 3328778240,3328782335,US 3328786432,3328790527,US -3328802816,3328810495,US -3328819200,3328821247,US -3328829440,3328830463,US -3328835584,3330607103,US -3330609152,3330614271,US -3330614272,3330614527,CA -3330614528,3330621439,US -3330621440,3330623743,CA +3328802816,3329230335,US +3329230336,3329230591,JP +3329230592,3329497343,US +3329497344,3329497599,KE +3329497600,3329498623,US +3329498624,3329498879,ES +3329498880,3330613247,US +3330613248,3330614783,CA +3330614784,3330617087,US +3330617088,3330617343,CA +3330617344,3330621183,US +3330621184,3330623743,CA 3330623744,3330624255,US 3330624512,3330625535,US 3330625536,3330627071,GB -3330627072,3330637823,US -3330638080,3330640895,US +3330627072,3330640895,US 3330640896,3330641151,CH -3330641152,3330645247,US -3330645504,3330646527,US +3330641152,3330641663,US +3330641920,3330646527,US 3330646528,3330647295,CA 3330647296,3330647807,US -3330648064,3330648831,US -3330649088,3330649343,US +3330648064,3330649343,US 3330649600,3330649855,CA -3330649856,3330662911,US +3330649856,3330657791,US +3330657792,3330658047,JP +3330658048,3330662911,US 3330662912,3330663167,GB 3330663168,3330664191,US 3330664192,3330664447,CA -3330664448,3330665983,US -3330666240,3330668543,US -3330668800,3330670335,US -3330670592,3330671871,US -3330672640,3330674175,US -3330674688,3330677759,US -3330678784,3330697215,US -3330703360,3330714367,US +3330664448,3330714367,US 3330714368,3330714623,CA 3330714624,3330726655,US 3330726656,3330726911,CA -3330726912,3330735871,US -3330736128,3330743295,US -3330744320,3330748159,US -3330752512,3330754559,US +3330726912,3330754559,US 3330754560,3330754815,CA 3330754816,3330755071,US -3330755328,3330756607,US -3330756864,3330763519,US +3330755328,3330763519,US 3330763520,3330763775,CA 3330763776,3330765823,US 3330765824,3330766335,CA -3330766336,3330767871,US -3330768640,3330769151,US -3330769408,3330771199,US +3330766336,3330771199,US 3330771200,3330771711,CH 3330771712,3330778879,US 3330778880,3330779135,GB -3330779136,3330784255,US -3330785792,3330791423,US +3330779136,3330791423,US 3330791424,3330791679,CA -3330791680,3330795775,US -3330796032,3330798847,US -3330799104,3330799871,US -3330800128,3330801407,US -3330801664,3330807807,US -3330809856,3330812415,US -3330818048,3330844159,US -3330844416,3330862591,US -3330862848,3330866943,US -3330867200,3330904575,US -3330904832,3330906623,US -3330906880,3330923263,US -3330923520,3330928127,US -3330928384,3330930175,US -3330930944,3330932479,US -3330932736,3331065343,US -3331065856,3331070463,US -3331072000,3331092991,US -3331096576,3331098111,US -3331098368,3331102463,US +3330791680,3330883583,US +3330883584,3330884351,NL +3330884352,3330884863,US +3330884864,3330885119,GB +3330885120,3330888063,US +3330888064,3330888127,NL +3330888128,3330888191,US +3330888192,3330888703,AU +3330888704,3330888959,US +3330888960,3330889215,CH +3330889216,3330889471,GB +3330889472,3330890239,JP +3330890240,3330890751,BE +3330890752,3330891263,GB +3330891264,3330892287,US +3330892288,3330892543,FR +3330892544,3330893567,US +3330893568,3330893823,NL +3330893824,3330894079,CA +3330894080,3330894591,GB +3330894592,3330894847,DE +3330894848,3330897919,US +3330897920,3330898175,CA +3330898176,3330898431,DE +3330898432,3330898943,FR +3330898944,3331102463,US 3331102464,3331102719,CA -3331102720,3331103231,US -3331104000,3331110143,US -3331110656,3331117567,US -3331117824,3331125759,US -3331126016,3331129087,US -3331129344,3331194879,US +3331102720,3331194879,US 3331194880,3331260415,AU -3331260416,3331268607,US -3331276800,3331284991,US -3331293184,3331301375,US -3331309568,3331330047,US -3331334144,3331338239,US -3331342336,3331350527,US -3331358720,3331362815,US -3331366912,3331371007,US -3331375104,3331387391,US -3331391488,3331527679,US -3331530752,3331557375,US -3331557632,3331562495,US -3331562752,3331563519,US +3331260416,3331563519,US 3331563520,3331563775,CH -3331563776,3331565567,US -3331566080,3331567615,US -3331567872,3331574271,US -3331574528,3331575295,US -3331577344,3331578623,US -3331578880,3331585791,US -3331586048,3331587839,US -3331588096,3331589631,US -3331590144,3331591935,US -3331592192,3331594751,US -3331596288,3331607807,US -3331620864,3331627007,US -3331627520,3331631359,US -3331632128,3331632383,US -3331632896,3331633407,US +3331563776,3331633407,US 3331633408,3331633919,CH 3331633920,3331647231,US 3331647232,3331647487,CA 3331647488,3331649279,US 3331649280,3331649535,CA -3331649536,3331653375,US -3331653632,3331818495,US +3331649536,3331818495,US 3331818496,3331818751,MX -3331818752,3331819775,US -3331820032,3331821567,US -3331821824,3331825151,US -3331825408,3331837183,US -3331837696,3331839999,US -3331840256,3331849215,US -3331849472,3331849983,US -3331850240,3331930623,US -3331932160,3331934719,US -3331948544,3331962879,US -3331964416,3331968767,US -3331969024,3331972863,US -3331973120,3331981055,US -3331981312,3331983103,US -3331983360,3331987967,US -3331989504,3331996671,US -3331997696,3332001535,US -3332014080,3332026879,US -3332046848,3332375807,US -3332376576,3332381183,US -3332382720,3332389375,US -3332390912,3332418303,US -3332418560,3332418815,US -3332419072,3332430079,US -3332430336,3332435199,US -3332435456,3332438015,US -3332438272,3332439807,US -3332440320,3332460543,CA +3331818752,3332440063,US +3332440064,3332460543,CA 3332460544,3332460799,US -3332460800,3332462335,CA -3332462592,3332473855,CA -3332477952,3332482303,CA -3332484096,3332491263,CA -3332492032,3332500735,CA -3332500992,3332505343,CA -3332505856,3332508671,CA -3332508928,3332528127,CA -3332529664,3332554751,CA -3332558848,3332564479,CA -3332564736,3332570879,CA -3332571392,3332579327,CA -3332581376,3332590079,CA +3332460800,3332461311,CA +3332461568,3332554751,CA +3332558848,3332562943,CA +3332562944,3332563455,US +3332563456,3332590079,CA 3332590080,3332590591,US -3332590592,3332594687,CA -3332594944,3332595455,CA -3332595712,3332610559,CA -3332611072,3332611327,CA -3332611584,3332617471,CA +3332590592,3332618239,CA 3332618240,3332624383,US -3332624384,3332636415,CA -3332636672,3332833279,CA -3332833536,3332841471,CA -3332841728,3332866303,CA -3332874240,3332875007,CA -3332897280,3332898559,CA -3332899072,3332922879,CA -3332923392,3332925695,CA -3332929024,3332930559,CA -3332931328,3332964095,CA -3332964352,3332966143,CA +3332624384,3332724735,CA +3332724736,3332726783,PM +3332726784,3332737023,CA +3332737024,3332738047,PM +3332738048,3332744191,CA +3332744192,3332745215,PM +3332745216,3332906495,CA +3332906496,3332909567,US +3332909568,3332947967,CA +3332947968,3332948223,US +3332948224,3332966143,CA 3332966144,3332966399,US -3332966400,3332966911,CA -3332967424,3332979967,CA -3332980736,3332988927,CA -3332989952,3333008383,CA -3333008896,3333012479,CA +3332966400,3333012479,CA 3333012480,3333012991,US -3333012992,3333014015,CA -3333014528,3333017599,CA -3333018112,3333023231,CA -3333025280,3333029631,CA -3333029888,3333389311,US -3333390336,3333406463,US -3333406720,3333422847,US -3333423104,3333429759,US -3333431296,3333434111,US -3333439488,3333461247,US -3333461504,3333462527,US -3333462784,3333480191,US +3333012992,3333029887,CA +3333029888,3333212415,US +3333212416,3333212927,A1 +3333212928,3333213119,US +3333213120,3333213439,A1 +3333213440,3333213695,US +3333213696,3333214079,A1 +3333214080,3333385983,US +3333385984,3333386239,JP +3333386240,3333427967,US +3333427968,3333428223,GB +3333428224,3333429759,US +3333431296,3333435391,US +3333439488,3333480191,US 3333480192,3333481471,DE -3333481472,3333482495,US -3333482752,3333488383,US -3333488640,3333490175,US -3333490688,3333495807,US -3333496832,3333501951,US -3333505024,3333517823,US -3333521408,3333534975,US -3333535232,3333535743,US -3333536256,3333541631,US -3333541888,3333553919,US -3333554176,3333561343,US -3333562368,3333568511,US -3333570560,3333583359,US -3333586944,3333591295,US -3333591552,3333593855,US -3333594112,3333595647,US -3333595904,3333619455,US -3333619712,3333620991,US -3333621760,3333624319,US -3333624576,3333627391,US -3333627904,3333633023,US -3333652480,3333654015,US -3333654272,3333665023,US -3333665280,3333669887,US -3333670144,3333675775,US -3333676288,3333684991,US -3333685248,3333725951,US -3333726208,3333732863,US -3333733376,3333735935,US -3333736192,3333737215,US -3333737472,3333750527,US -3333750784,3333766655,US -3333767168,3333779967,US -3333783552,3333791487,US -3333791744,3333793279,US -3333794048,3333796351,US -3333796608,3333801727,US -3333802496,3333859839,US +3333481472,3333701887,US +3333701888,3333702143,GB +3333702144,3333702399,US +3333702400,3333702655,CH +3333702656,3333705727,US +3333705728,3333709567,GB +3333709568,3333710335,US +3333710336,3333710591,DE +3333710592,3333710847,IT +3333710848,3333711359,GB +3333711360,3333712127,DE +3333712128,3333712383,CH +3333712384,3333712639,DE +3333712640,3333716223,US +3333716224,3333716735,CA +3333716736,3333716991,GB +3333716992,3333717247,AU +3333717248,3333717503,FR +3333717504,3333717759,SG +3333717760,3333718015,NL +3333718016,3333723647,US +3333723648,3333724671,JP +3333724672,3333859839,US 3333859840,3333860095,BM -3333860096,3333870847,US -3333871104,3333881599,US -3333881856,3333927423,US -3333927936,3333933823,US -3333934080,3333937919,US -3333939200,3333939455,US -3333939968,3333947135,US -3333947392,3333950719,US -3333951488,3333954047,US -3333955584,3333963263,US -3333963776,3333988607,US +3333860096,3333988607,US 3333988608,3333988863,BR 3333988864,3333997823,US 3333997824,3333998079,CA -3333998080,3334012671,US -3334012928,3334019583,US -3334021120,3334028799,US -3334029312,3334053631,US -3334053888,3334055167,US -3334055680,3334079999,US -3334082560,3334116607,US -3334116864,3334119935,US -3334120448,3334138623,US +3333998080,3334138623,US 3334138624,3334138879,BM -3334139136,3334143743,US -3334144000,3334151167,US -3334152192,3334179071,US -3334180096,3334181631,US -3334182400,3334187775,US +3334138880,3334187775,US 3334187776,3334188031,BM -3334188032,3334196735,US -3334196992,3334201087,US -3334201344,3334205183,US -3334205440,3334209279,US -3334209536,3334343935,US -3334344704,3334348543,US -3334348800,3334355967,US -3334373376,3334374143,US -3334374656,3334391039,US -3334391552,3334392063,US -3334392320,3334400255,US -3334400768,3334405887,US -3334406144,3334932223,US -3334932480,3334934015,US -3334934528,3334943743,US -3334963200,3334974207,US -3334974464,3334977791,US -3334978048,3334979071,US -3334979328,3334983167,US -3334983424,3334987263,US -3334987520,3334988031,US -3334988288,3334993663,US -3334993920,3334995711,US -3334995968,3334998527,PH -3335000064,3335003135,US -3335028736,3335032063,US -3335032320,3335033343,US -3335033600,3335043327,US -3335043584,3335048191,US -3335048448,3335057407,US -3335058176,3335163135,US -3335163904,3335180287,US -3335180544,3335181567,US -3335181824,3335192319,US -3335192576,3335199231,US -3335200768,3335235839,US -3335236096,3335247103,US -3335247360,3335249407,US -3335249664,3335251967,US +3334188032,3334995967,US +3334995968,3335000063,PH +3335000064,3335004159,US +3335028736,3335251967,US 3335252224,3335252735,US 3335252736,3335252991,CA -3335252992,3335257855,US -3335258112,3335265535,US -3335266304,3335273983,US -3335274496,3335276287,US +3335252992,3335276287,US 3335276288,3335276799,PR -3335276800,3335310079,US -3335323648,3335324927,US -3335325696,3335327487,US -3335327744,3335349247,US -3335356416,3335422463,US -3335424000,3335439615,US +3335276800,3335439615,US 3335439616,3335439871,CH 3335439872,3335440383,US 3335440384,3335441151,CH -3335441152,3335447039,US -3335447296,3335451903,US -3335452160,3335452671,US -3335453696,3335454463,US -3335454720,3335458815,US +3335441152,3335458815,US 3335458816,3335460863,BM -3335462912,3335487743,US -3335488000,3335501311,US -3335501568,3335502591,US -3335502848,3335511295,US -3335511552,3335519999,US -3335520256,3335654911,US -3335659520,3335667711,US -3335684096,3335784191,US -3335784448,3335789567,US -3335790592,3335795199,US -3335798784,3336111359,US -3336112128,3336116223,US -3336118272,3336139263,US -3336142848,3337029119,US -3337029632,3337031167,US -3337031680,3337034239,US -3337035776,3337055231,US +3335462912,3335475199,US +3335475200,3335475455,DE +3335475456,3335480191,US +3335480192,3335480319,IT +3335480320,3335860991,US +3335860992,3335861247,MX +3335861248,3337043967,US +3337043968,3337044223,CA +3337044224,3337044479,US +3337044480,3337044735,CA +3337044736,3337044991,US +3337044992,3337046015,CA +3337046016,3337046527,US +3337046528,3337047551,CA +3337047552,3337050111,US +3337050112,3337051647,CA +3337051648,3337051903,US +3337051904,3337052159,CA +3337052160,3337053183,US +3337053184,3337054463,CA +3337054464,3337054719,US +3337054720,3337054975,CA +3337054976,3337055231,US 3337055232,3337060351,CA -3337060352,3337119743,US -3337125888,3337127167,US -3337127424,3337139967,US -3337140224,3337148927,US -3337149696,3337149951,US -3337150464,3337155071,US -3337155328,3337157887,US -3337158656,3337289727,US -3337289984,3337297919,CA +3337060352,3337289727,US +3337289728,3337297919,CA 3337297920,3337302015,US -3337302016,3337303551,CA -3337304064,3337323007,CA -3337324544,3337335295,CA +3337302016,3337335295,CA 3337335296,3337335807,US -3337335808,3337341951,CA -3337342464,3337355007,CA -3337355264,3337650943,US -3337650944,3337682943,CH -3337682944,3337685503,US -3337687040,3337694207,US -3337699328,3337882111,US -3337883648,3337891583,US -3337912320,3337948415,US -3337949184,3337955839,US +3337335808,3337355263,CA +3337355264,3337650175,US +3337650176,3337650687,GB +3337650688,3337650943,US +3337650944,3337651199,HK +3337651200,3337651455,CH +3337651456,3337651711,SG +3337651712,3337653503,CH +3337653504,3337653759,JP +3337653760,3337654783,CH +3337654784,3337655039,AU +3337655040,3337682943,CH +3337682944,3337961471,US 3337977856,3337980671,US 3337980672,3337980927,PR 3337980928,3337986047,US 3337986048,3337986303,BB -3337986304,3337989375,US -3337990912,3338010367,US -3338010624,3338017279,US -3338018816,3338021887,US -3338027008,3338051583,US -3338051840,3338058239,US -3338059264,3338063871,US -3338064128,3338069247,US +3337986304,3338069247,US 3338069248,3338069759,BB -3338069760,3338075903,US -3338076160,3338342143,US -3338342400,3338346239,US -3338346496,3338348543,US -3338403840,3338439167,US -3338439424,3338444799,US -3338445056,3338445311,US -3338445824,3338455551,US -3338456576,3338460671,US -3338460928,3338462719,US -3338462976,3338469119,US -3338469376,3338541567,US -3338543104,3338551295,US -3338665984,3338686463,US +3338069760,3338207487,US +3338207488,3338207743,CA +3338207744,3338208511,US +3338208512,3338208767,CA +3338208768,3338211071,US +3338211072,3338211327,CA +3338211328,3338211583,US +3338211584,3338212095,CA +3338212096,3338215423,US +3338215424,3338215935,CA +3338215936,3338216447,US +3338216448,3338216703,CA +3338216704,3338217215,US +3338217216,3338217471,CA +3338217472,3338220543,US +3338220544,3338221055,CA +3338221056,3338222847,US +3338222848,3338223359,CA +3338223360,3338225151,US +3338225152,3338225407,CA +3338225408,3338228735,US +3338228736,3338228991,CA +3338228992,3338229759,US +3338229760,3338230015,CA +3338230016,3338230527,US +3338230528,3338230783,CA +3338230784,3338231807,US +3338231808,3338232063,CA +3338232064,3338233599,US +3338233600,3338233855,VG +3338233856,3338235135,US +3338235136,3338235391,CA +3338235392,3338235647,US +3338235648,3338235903,CA +3338235904,3338236671,US +3338236672,3338236927,CA +3338236928,3338238975,US +3338238976,3338239231,CA +3338239232,3338239999,US +3338240000,3338240255,CA +3338240256,3338241535,US +3338241536,3338242047,CA +3338242048,3338246143,US +3338246144,3338246399,CA +3338246400,3338246655,US +3338246656,3338247167,CA +3338247168,3338247423,US +3338247424,3338247679,CA +3338247680,3338247935,US +3338247936,3338249215,CA +3338249216,3338249727,US +3338249728,3338249983,CA +3338249984,3338250751,US +3338250752,3338251775,CA +3338251776,3338252543,US +3338252544,3338252799,CA +3338252800,3338253311,US +3338253312,3338253567,CA +3338253568,3338254079,US +3338254080,3338254335,CA +3338254336,3338255615,US +3338255616,3338255871,CA +3338255872,3338257407,US +3338257408,3338257663,CA +3338257664,3338257919,US +3338257920,3338258175,CA +3338258176,3338258431,US +3338258432,3338258687,CA +3338258688,3338259455,US +3338259456,3338259711,CA +3338259712,3338260735,US +3338260736,3338262015,CA +3338262016,3338262527,US +3338262528,3338263039,CA +3338263040,3338264063,US +3338264064,3338264575,CA +3338264576,3338265855,US +3338265856,3338266623,CA +3338266624,3338267647,US +3338267648,3338268159,CA +3338268160,3338269183,US +3338269184,3338270207,CA +3338270208,3338270719,US +3338270720,3338271231,CA +3338271232,3338271487,US +3338271488,3338271743,CA +3338271744,3338271999,US +3338272000,3338272255,CA +3338272256,3338686463,US 3338686464,3338688511,AW 3338688512,3338689535,US 3338689536,3338689791,SL -3338689792,3338825727,US +3338689792,3338770431,US +3338770432,3338772479,PR +3338772480,3338825727,US 3338825728,3338827775,AW 3338827776,3338912767,US 3338912768,3338913023,EC 3338913024,3338916351,US 3338916352,3338916479,CN -3338916480,3338963199,US -3338963712,3338964991,US -3338965248,3338969343,US -3338970112,3338976767,US -3338977024,3338993407,US -3338993664,3339000319,US -3339001856,3339028735,US -3339028992,3339031295,US -3339031552,3339042047,US -3339042304,3339045119,US -3339045376,3339050751,US -3339051008,3339058943,US -3339059200,3339063039,US -3339063296,3339076863,US -3339076864,3339077631,JP -3339077632,3339079167,US -3339079168,3339079679,DE -3339079680,3339091967,US -3339091968,3339094015,NL -3339094016,3339136767,US -3339137024,3339142655,US +3338916480,3339075583,US +3339075584,3339076863,GB +3339076864,3339077631,NO +3339077632,3339077887,SG +3339077888,3339079167,US +3339079168,3339079423,DK +3339079424,3339079679,CA +3339079680,3339080703,IT +3339080704,3339080959,FR +3339080960,3339081727,HK +3339081728,3339081983,NL +3339081984,3339082751,FR +3339082752,3339086335,US +3339086336,3339086591,JP +3339086592,3339091967,US +3339091968,3339092991,NL +3339092992,3339093503,US +3339093504,3339094015,NL +3339094016,3339142655,US 3339142656,3339142911,NL 3339142912,3339145727,US 3339145728,3339145983,NL @@ -57745,190 +93926,236 @@ 3339146496,3339147007,US 3339147008,3339147775,CA 3339147776,3339148031,MS -3339148032,3339148543,US -3339148800,3339149311,US -3339190272,3339256575,US -3339256832,3339259135,US -3339259904,3339260927,US -3339264000,3339270399,US -3339272192,3339319295,US -3339321344,3339322367,US -3339323392,3339324927,US -3339325440,3339327999,US -3339329536,3339337727,US -3339337984,3339338239,US -3339338496,3339342847,US -3339343104,3339343615,US -3339343872,3339348223,US -3339348480,3339352831,US -3339353088,3339355647,US -3339355904,3339367423,US -3339367680,3339370751,US -3339371264,3339373055,US -3339373568,3339374079,US -3339375104,3339386111,US -3339386880,3339655679,US -3339657216,3339667967,US +3339148032,3339149311,US +3339157504,3339159551,US +3339159552,3339160575,CA +3339160576,3339164671,US +3339164672,3339165695,CA +3339165696,3339167743,US +3339167744,3339168767,PR +3339168768,3339177983,US +3339177984,3339179007,PR +3339179008,3339180031,US +3339180032,3339181055,CA +3339181056,3339184127,US +3339184128,3339186175,CA +3339186176,3339669503,US 3339669504,3339671807,CA -3339714560,3339722495,US -3339722752,3339735039,US -3339780096,3339918335,US -3339919360,3339923455,US -3339923456,3339926015,CA -3339976704,3340046079,US -3340046336,3340058623,US +3339672576,3339673599,US +3339681792,3339747327,US +3339747328,3339748351,CA +3339748352,3339753471,US +3339753472,3339754495,CA +3339754496,3339760639,US +3339760640,3339761663,CA +3339761664,3339923455,US +3339923456,3339927551,CA +3339943936,3339952127,US +3339952128,3339956223,CA +3339956224,3339965439,US +3339965440,3339969535,CA +3339969536,3340058623,US +3340075008,3340080127,US +3340080128,3340081151,CA +3340081152,3340084223,US +3340084224,3340085247,KN +3340085248,3340088319,US +3340088320,3340089343,CA +3340089344,3340097535,US +3340097536,3340098559,CA +3340098560,3340107775,US 3340107776,3340369919,CA -3340369920,3340383487,US -3340386304,3340386559,US -3340394496,3340411903,US -3340412160,3340414975,US -3340415232,3340419071,US -3340419328,3340425983,US -3340426752,3340429823,US +3340369920,3340386559,US +3340387328,3340388351,CA +3340388352,3340390399,US +3340394496,3340429823,US 3340429824,3340430079,PA -3340430080,3340431871,US -3340433408,3340435199,US -3340435456,3340436991,US -3340437504,3340443135,US -3340443648,3340451839,US -3340500992,3340643839,US -3340697600,3340835327,US -3340836864,3340865279,US -3340865536,3340882431,US -3340882688,3340884479,US -3340884992,3340886527,US -3340886784,3340887551,US -3340888576,3340893951,US -3340894208,3340896255,US -3340898304,3340923391,US -3340926976,3340952575,US -3340959744,3341027839,US -3341029376,3341031935,US -3341033472,3341041663,US -3341090816,3341162751,US -3341164544,3341169663,US -3341189120,3341192959,US -3341193216,3341194239,US -3341194496,3341196799,US -3341221888,3341484287,US +3340430080,3340451839,US +3340468224,3340481535,US +3340481536,3340482559,CA +3340482560,3340488703,US +3340500992,3340584703,US +3340584704,3340584959,KW +3340584960,3340898047,US +3340898048,3340898303,CA +3340898304,3340925071,US +3340925072,3340925079,CA +3340925080,3340925199,US +3340925200,3340925207,RU +3340925208,3340925239,US +3340925240,3340925247,MX +3340925248,3340925255,AR +3340925256,3340925279,US +3340925280,3340925287,CA +3340925288,3340925303,US +3340925304,3340925311,SE +3340925312,3340925375,US +3340925376,3340925383,RU +3340925384,3340925471,US +3340925472,3340925479,CH +3340925480,3340925535,US +3340925536,3340925543,RU +3340925544,3340925607,US +3340925608,3340925615,AU +3340925616,3340925631,US +3340925632,3340925639,BR +3340925640,3340925647,CO +3340925648,3340925703,US +3340925704,3340925711,FR +3340925712,3340925719,US +3340925720,3340925727,CA +3340925728,3340925735,BR +3340925736,3340925743,UA +3340925744,3340925823,US +3340925824,3340925887,GB +3340925888,3340925895,CA +3340925896,3340925919,US +3340925920,3340925927,PT +3340925928,3340925935,US +3340925936,3340925943,DE +3340925944,3340925999,US +3340926000,3340926007,RU +3340926008,3340926015,US +3340926016,3340926023,RU +3340926024,3340926079,US +3340926080,3340926087,CA +3340926088,3340926095,US +3340926096,3340926103,AU +3340926104,3340926111,CA +3340926112,3340926143,US +3340926144,3340926151,BR +3340926152,3340926159,CN +3340926160,3340926175,AR +3340926176,3340926199,US +3340926200,3340926207,DE +3340926208,3340926215,US +3340926216,3340926223,BO +3340926224,3340926231,PT +3340926232,3340926247,CA +3340926248,3340926255,AR +3340926256,3340926263,AU +3340926264,3340926287,US +3340926288,3340926295,CA +3340926296,3340926319,US +3340926320,3340926327,RU +3340926328,3340926343,US +3340926344,3340926351,GB +3340926352,3340926359,US +3340926360,3340926367,DE +3340926368,3340926407,US +3340926408,3340926415,GB +3340926416,3340926439,US +3340926440,3340926447,NO +3340926448,3340926455,DE +3340926456,3340926463,US +3340926464,3340926479,MX +3340926480,3340926495,US +3340926496,3340926503,DE +3340926504,3340926511,MX +3340926512,3340926543,US +3340926544,3340926559,GB +3340926560,3340926599,US +3340926600,3340926607,CA +3340926608,3340926615,RU +3340926616,3340926623,US +3340926624,3340926655,GB +3340926656,3340926663,BE +3340926664,3340926671,GB +3340926672,3340926679,US +3340926680,3340926687,CL +3340926688,3340926791,US +3340926792,3340926799,GB +3340926800,3340926815,US +3340926816,3340926831,CA +3340926832,3340926903,US +3340926904,3340926911,IL +3340926912,3340926927,US +3340926928,3340926935,ES +3340926936,3340926951,US +3340926952,3340926959,BR +3340926960,3341444863,US +3341444864,3341445631,DE +3341445632,3341479935,US +3341479936,3341480447,DE +3341480448,3341484287,US 3341484288,3341485055,CA 3341485056,3341511679,US -3341511680,3341513215,CA -3341513728,3341531135,CA -3341531392,3341533951,US -3341534976,3341536767,CA -3341537280,3341541375,US -3341541888,3341546239,US +3341511680,3341517823,CA +3341517824,3341518847,US +3341518848,3341520895,CA +3341520896,3341521663,US +3341521664,3341531135,CA +3341531136,3341534207,US +3341534976,3341537279,CA +3341537280,3341546239,US 3341546240,3341547007,CA 3341547008,3341547519,CH -3341547520,3341549311,CA -3341549568,3341618175,US -3341619200,3341622271,US -3341623296,3341705215,US -3341713408,3341750015,US -3341750272,3341755647,US -3341811712,3341815039,US -3341815808,3341823999,US -3341877248,3342139391,US +3341547520,3341549567,CA +3341549568,3341631999,US +3341632000,3341632767,CA +3341632768,3341634815,US +3341634816,3341635071,CA +3341635072,3341641727,US +3341641728,3341643007,CA +3341643008,3341643519,US +3341643520,3341643775,CA +3341643776,3341644287,US +3341644288,3341644799,CA +3341644800,3341645055,US +3341645056,3341645567,CA +3341645568,3341646079,US +3341646080,3341646591,CA +3341646592,3342139391,US 3342139392,3342204927,CH -3342204928,3342470399,US -3342471168,3342474239,US -3342475264,3342481407,US -3342532608,3342534143,US -3342534656,3342540543,US -3342540800,3342543359,US +3342204928,3342598143,US 3342598144,3342603263,CA 3342603264,3342604799,US 3342604800,3342605311,CA 3342605312,3342605567,US -3342605568,3342614271,CA -3342614528,3342623743,CA -3342624256,3342627839,CA -3342628096,3342657535,CA -3342657792,3342663423,CA -3342663680,3342999039,US -3342999552,3343007743,US -3343056896,3343120383,US -3343122432,3343123967,US -3343124480,3343126015,US -3343126528,3343129087,US -3343130624,3343135999,US -3343138816,3343148543,US -3343187968,3343319039,US -3343319296,3343342847,CA -3343343104,3343346175,CA -3343346688,3343355391,CA -3343355904,3343359743,CA -3343360000,3343364095,CA -3343365632,3343366655,CA -3343366912,3343372543,CA -3343380480,3343384319,CA -3343384576,3343452671,US -3343454208,3343456511,US -3343458304,3343460863,US -3343466496,3343470847,US -3343482880,3343559679,US -3343560704,3343568127,US -3343568384,3343575807,US -3343576064,3343580927,US -3343581184,3343850495,US -3343851520,3343855359,US -3343859712,3343887359,US -3343887616,3343890687,US -3343890944,3343902463,US -3343902720,3343905023,US -3343905280,3343908607,US -3343908864,3343916031,US -3343917056,3343922175,US -3343925248,3344109055,US -3344109568,3344111871,US -3344113664,3344116223,US -3344121856,3344125951,US -3344171264,3344236287,CA -3344237056,3344242175,CA -3344242688,3344252671,CA -3344252928,3344255999,CA -3344261888,3344266239,CA -3344266752,3344268543,CA +3342605568,3342663679,CA +3342663680,3343319295,US +3343319296,3343364095,CA +3343364096,3343365119,US +3343365632,3343372543,CA +3343373312,3343376383,US +3343380480,3343384575,CA +3343384576,3344171007,US +3344171008,3344255999,CA +3344256000,3344257023,US +3344261120,3344268543,CA 3344268544,3344269311,US -3344269312,3344287743,CA -3344288000,3344288767,CA +3344269312,3344288767,CA +3344288768,3344289791,PR +3344289792,3344292863,US 3344292864,3344296447,CA +3344296960,3344297983,GD +3344297984,3344299007,US 3344299264,3344299519,CA 3344299520,3344299775,US 3344299776,3344300543,CA 3344300544,3344300799,US -3344300800,3344301823,CA -3344302080,3344374271,US -3344375808,3344378879,US -3344384000,3344387071,US -3344433152,3344446463,US -3344449536,3344466431,US -3344466688,3344467455,US -3344468480,3344469247,US -3344469504,3344482047,US -3344482304,3344495871,US -3344496640,3344497919,US -3344498176,3344498431,US -3344498688,3344511231,US -3344515072,3344531711,US -3344531968,3344534271,US -3344534528,3344536831,US -3344537088,3344548351,US -3344548608,3344556031,US -3344556288,3344563967,US -3344564224,3344633855,US +3344300800,3344302079,CA +3344302080,3344486399,US +3344486400,3344488447,NL +3344488448,3344633855,US 3344633856,3344637951,CH -3344637952,3344640511,US -3344695296,3344959999,US -3344961536,3344964607,US -3344965632,3344966655,US -3344967680,3344968703,US -3345022976,3345291775,US -3345293312,3345295871,US -3345350656,3345361919,US -3345418240,3345422847,US -3345424384,3345429503,US +3344637952,3344642047,US +3344695296,3344937471,US +3344937472,3344937983,EG +3344937984,3344938239,US +3344938240,3344938495,UZ +3344938496,3344955391,US +3344955392,3344955647,GB +3344955648,3344964607,US +3344964608,3344965631,CA +3344965632,3344969727,US +3345022976,3345367039,US +3345416192,3345418239,US +3345418240,3345419519,NL +3345419520,3345422847,US +3345423360,3345424383,TC +3345424384,3345430527,US +3345430528,3345432575,CA 3345432576,3345433599,GB 3345433600,3345433855,SG 3345433856,3345434879,US @@ -57945,7 +94172,7 @@ 3345439744,3345439999,FR 3345440000,3345440255,DE 3345440256,3345440767,US -3345441024,3345441791,DE +3345440768,3345441791,DE 3345442304,3345442559,CL 3345442560,3345442815,JP 3345442816,3345443327,AT @@ -57957,327 +94184,239 @@ 3345445376,3345446399,GB 3345446656,3345446911,IT 3345446912,3345447679,US -3345447680,3345448959,BE -3345448960,3346138879,US -3346139136,3346140415,US -3346141184,3346170111,US -3346202624,3346209279,US -3346210816,3346216447,US -3346268160,3346269695,US -3346272256,3346281471,US -3346333696,3346471423,US -3346472960,3346481151,US -3346530304,3346545151,US -3346546688,3346578431,US -3346578688,3346583807,US -3346584064,3346595583,US -3346596864,3346660863,US -3346661376,3346662143,US -3346662400,3346663167,US -3346663424,3346668543,US -3346669568,3346687999,US -3346694144,3346726911,US -3346727936,3346730239,US -3346731008,3346734591,US -3346735104,3346744319,US -3346744832,3346748159,US -3346748416,3346750207,US -3346750464,3346750719,US -3346751488,3346792447,US -3346793472,3346793983,US -3346794496,3346798847,US -3346800640,3346807039,US -3346808832,3346861823,US -3346862080,3346923519,US +3345447680,3345448447,FR +3345448448,3345448703,BE +3345448704,3345448959,DE +3345448960,3345666567,US +3345666568,3345666591,IN +3345666592,3345666639,NO +3345666640,3345667103,US +3345667104,3345667119,IN +3345667120,3346282495,US +3346282496,3346284543,PR +3346333696,3346923519,US 3346923520,3346989055,CA -3346989056,3346996991,US -3346997248,3346999807,US -3347054592,3349446911,US +3346989056,3347005439,US +3347054592,3349268479,US +3349268480,3349268991,CA +3349268992,3349273087,US +3349273088,3349273343,CA +3349273344,3349341695,US +3349341696,3349341951,CA +3349341952,3349446911,US 3349446912,3349447167,CA -3349447168,3349450495,US -3349450752,3349461503,US -3349461760,3349462783,US -3349463296,3349479167,US -3349479424,3349482495,US -3349483520,3349533695,US -3349533952,3349544703,US -3349545216,3349545727,CA -3349545984,3349549567,CA -3349550080,3349551103,CA -3349551104,3349553151,US -3349553152,3349607423,CA -3349607936,3349608447,CA +3349447168,3349532671,US +3349532672,3349533695,GB +3349533696,3349544959,US +3349544960,3349551103,CA +3349551104,3349553663,US +3349553664,3349608447,CA 3349608448,3349609215,US -3349609216,3349610239,CA +3349609216,3349610495,CA 3349610496,3349614591,US -3349676032,3349678591,US -3349680128,3349682431,US -3349684224,3349686527,US -3349741568,3349987327,US +3349676032,3349987327,US 3349987328,3349996543,BM 3349996544,3349997055,KY 3349997056,3350003711,BM -3350003712,3350134783,US -3350135040,3350145791,CA -3350151168,3350160639,CA -3350160896,3350175743,CA -3350176512,3350181887,CA -3350183168,3350200063,CA -3350200320,3350466303,US -3350466560,3350469119,US +3350003712,3350042879,US +3350042880,3350043135,KW +3350043136,3350134783,US +3350134784,3350146047,CA +3350146048,3350147071,US +3350151168,3350181887,CA +3350181888,3350182911,US +3350182912,3350200319,CA +3350200320,3350469119,US +3350469632,3350470655,CA 3350470656,3350475775,US -3350528000,3350545151,US -3350545408,3350548735,US -3350549248,3350565887,US -3350566144,3350574591,US -3350575104,3350577151,US -3350577664,3350588927,US -3350589696,3350591231,US -3350591488,3350593279,US -3350593536,3350728191,US -3350728704,3350746367,US -3350746624,3350756607,US -3350757376,3350760959,US -3350766080,3350770943,US -3350772224,3350774271,US -3350774528,3350778623,US -3350778880,3350789887,US -3350790400,3350814975,CA -3350815232,3350825727,CA +3350475776,3350476799,CA +3350476800,3350478847,US +3350528000,3350790143,US +3350790144,3350825727,CA 3350825728,3350825983,GB -3350825984,3350834687,CA -3350835200,3350836223,CA -3350836992,3350837247,CA -3350837760,3350843391,CA -3350843648,3350855679,CA +3350825984,3350855679,CA 3350855680,3350862079,US 3350862080,3350864639,CL -3350864640,3350925055,US -3350925312,3350928383,US -3350929408,3350950399,US -3350986752,3350988031,US -3350988800,3350990335,US -3350990848,3350993919,US -3350994944,3350998015,US -3351052288,3351053823,US -3351054336,3351058943,US -3351060480,3351068159,US -3351117824,3351129087,US -3351134208,3351151359,US -3351151616,3351151871,US -3351152128,3351158527,US -3351158784,3351159295,US -3351159552,3351160063,US -3351160320,3351160575,US -3351161088,3351167487,US -3351168512,3351183103,US -3351183360,3351209983,US -3351216128,3351251967,US -3351252992,3351265279,US -3351314432,3351315967,US -3351316480,3351318015,US -3351318528,3351322367,US -3351322624,3351326719,US -3351379968,3351446783,US -3351447552,3351448831,US -3351449600,3351458815,US -3351461888,3351474687,US -3351511040,3351512319,US -3351513088,3351579135,US -3351580672,3351642111,US -3351642112,3351695871,CA -3351696384,3351696639,CA -3351697408,3351698431,CA -3351698432,3351707391,US -3351707648,3351774463,US -3351775232,3351776767,US -3351777280,3351780351,US -3351781376,3351785471,US -3351789568,3351797759,US -3351805952,3351855103,US -3351871488,3351894015,US -3351894272,3351895295,US -3351895808,3351896319,US -3351896576,3351900671,US -3351900928,3351903999,US -3351912448,3351963647,CA -3351964160,3351969791,CA -3351969792,3351971839,US -3351971840,3351972095,IL -3351972096,3351972863,US -3351972864,3351973119,IL -3351973120,3351975935,US -3351975936,3351976447,IL -3351976448,3351976703,US -3351976704,3351976959,IL -3351976960,3351979519,US -3351979520,3351979583,IL -3351979584,3351986943,US -3351986944,3351987199,IL -3351987200,3351995647,US -3351995648,3351995903,IL -3351995904,3351996927,US -3351996928,3351997439,IL -3351997440,3352004351,US -3352004352,3352004607,IL -3352004608,3352005887,US -3352005888,3352006143,IL -3352006144,3352006399,US -3352006400,3352006527,IL -3352006528,3352006591,US -3352006592,3352006655,IL -3352006656,3352007359,US -3352007360,3352007367,IL -3352007368,3352007391,US -3352007392,3352007423,IL -3352007424,3352007583,US -3352007584,3352007679,IL -3352007680,3352007967,US -3352007968,3352008063,IL -3352008064,3352009311,US -3352009312,3352009343,IL -3352009344,3352010815,US -3352010816,3352010879,IL -3352010880,3352011199,US -3352011200,3352011263,IL -3352011264,3352014719,US -3352014720,3352014847,IL -3352014848,3352014927,US -3352014928,3352014943,IL -3352014944,3352014975,US -3352014976,3352015103,IL -3352015104,3352015839,US -3352015840,3352015871,IL -3352015872,3352015999,US -3352016000,3352016127,IL -3352016128,3352020671,US -3352020672,3352020703,IL -3352020704,3352020735,US -3352020736,3352020863,IL -3352020864,3352023039,US -3352023040,3352023167,IL -3352023168,3352023343,US -3352023344,3352023359,IL -3352023360,3352023679,US -3352023680,3352023807,IL -3352023808,3352024319,US -3352024320,3352024447,IL -3352024448,3352025087,US -3352025088,3352025215,IL -3352025216,3352026623,US -3352026624,3352026751,IL -3352026752,3352027295,US -3352027296,3352027327,IL -3352027328,3352028799,US -3352028800,3352028927,IL -3352028928,3352030047,US -3352030048,3352030079,IL -3352030080,3352030143,US -3352030144,3352030175,IL -3352030176,3352030383,US -3352030384,3352030399,IL -3352030400,3352032719,US -3352032720,3352032735,IL -3352032736,3352034303,US -3352034304,3352034815,IL -3352034816,3352559615,US -3352559872,3352563199,CA -3352563456,3352570111,CA -3352570368,3352573951,CA -3352574208,3352581631,CA -3352582144,3352583935,CA -3352584192,3352591359,CA -3352591616,3352615423,CA +3350864640,3350953983,US +3350986752,3350994943,US +3350994944,3350995199,CA +3350995200,3350997503,US +3350997504,3350997759,CA +3350997760,3350999039,US +3351052288,3351068671,US +3351117824,3351232511,US +3351232512,3351232767,IL +3351232768,3351380223,US +3351380224,3351380479,CA +3351380480,3351380735,US +3351380736,3351381759,CA +3351381760,3351382271,US +3351382272,3351382527,CA +3351382528,3351383039,US +3351383040,3351383295,CA +3351383296,3351384319,US +3351384320,3351384575,CA +3351384576,3351385343,US +3351385344,3351385599,CA +3351385600,3351386111,US +3351386112,3351386367,PR +3351386368,3351386623,US +3351386624,3351386879,CA +3351386880,3351387135,US +3351387136,3351387391,CA +3351387392,3351387903,US +3351387904,3351388159,CA +3351388160,3351388927,US +3351388928,3351389439,CA +3351389440,3351390463,US +3351390464,3351390975,CA +3351390976,3351392511,US +3351392512,3351392767,CA +3351392768,3351393279,US +3351393280,3351393535,CA +3351393536,3351394815,US +3351394816,3351395071,CA +3351395072,3351396095,US +3351396096,3351396351,CA +3351396352,3351397375,US +3351397376,3351397631,CA +3351397632,3351397887,US +3351397888,3351398143,CA +3351398144,3351398399,US +3351398400,3351398655,CA +3351398656,3351398911,US +3351398912,3351399167,CA +3351399168,3351399423,US +3351399424,3351399935,CA +3351399936,3351400191,US +3351400192,3351400447,CA +3351400448,3351400959,US +3351400960,3351401215,CA +3351401216,3351401983,US +3351401984,3351402239,CA +3351402240,3351402495,US +3351402496,3351403775,CA +3351403776,3351404031,US +3351404032,3351404287,CA +3351404288,3351405311,US +3351405312,3351405567,CA +3351405568,3351405823,US +3351405824,3351406079,CA +3351406080,3351407103,US +3351407104,3351407359,CA +3351407360,3351407615,US +3351407616,3351408127,CA +3351408128,3351408895,US +3351408896,3351409407,CA +3351409408,3351410687,US +3351410688,3351410943,CA +3351410944,3351411711,US +3351411712,3351411967,CA +3351411968,3351412223,US +3351412224,3351412479,CA +3351412480,3351412735,US +3351412736,3351413247,CA +3351413248,3351413503,US +3351413504,3351413759,CA +3351413760,3351414271,US +3351414272,3351414783,CA +3351414784,3351415039,US +3351415040,3351415551,CA +3351415552,3351415807,US +3351415808,3351416063,CA +3351416064,3351417087,US +3351417088,3351417599,CA +3351417600,3351417855,US +3351417856,3351418111,CA +3351418112,3351419647,US +3351419648,3351419903,CA +3351419904,3351423743,US +3351423744,3351423999,PR +3351424000,3351427071,US +3351427072,3351427327,CA +3351427328,3351428351,US +3351428352,3351428607,CA +3351428608,3351436031,US +3351436032,3351436287,CA +3351436288,3351436543,US +3351436544,3351436799,PR +3351436800,3351437055,US +3351437056,3351437311,CA +3351437312,3351437567,US +3351437568,3351437823,CA +3351437824,3351438079,US +3351438080,3351438335,CA +3351438336,3351438591,US +3351438592,3351439103,CA +3351439104,3351441151,US +3351441152,3351441407,CA +3351441408,3351441919,US +3351441920,3351442175,CA +3351442176,3351478271,US +3351511040,3351524095,US +3351524096,3351524351,GB +3351524352,3351642111,US +3351642112,3351698431,CA +3351698432,3351904255,US +3351904256,3351969791,CA +3351969792,3352035327,IL +3352035328,3352036351,CA +3352036352,3352046591,US +3352046592,3352049663,CA +3352049664,3352051711,US +3352051712,3352055807,CA +3352055808,3352066047,US +3352066048,3352067071,CA +3352067072,3352068095,US +3352068096,3352069119,CA +3352069120,3352082431,US +3352082432,3352083455,JM +3352083456,3352088575,US +3352088576,3352090623,CA +3352090624,3352094719,US +3352094720,3352096767,VG +3352096768,3352559871,US +3352559872,3352615423,CA 3352615424,3352616959,US -3352616960,3352624895,CA -3352625152,3352887295,CA -3352887296,3352911871,US -3352920064,3353309695,US -3353313280,3353333759,US -3353346048,3353729023,US +3352616960,3352887295,CA +3352887296,3353653503,US +3353653504,3353653759,GB +3353653760,3353722367,US +3353722368,3353722623,GB +3353722624,3353729023,US 3353729024,3353729279,HK 3353729280,3353730047,US -3353739264,3353741823,US -3353743360,3353746943,US -3353747456,3353752575,US -3353755648,3353765887,US -3353772032,3353806335,US -3353806848,3353818111,US -3353837568,3353843455,US -3353870336,3353939455,US -3353939968,3353942527,US -3353944064,3353948159,US -3353952256,3353953279,US -3353953536,3353960191,US -3353960448,3353966079,US -3353966336,3353967871,US -3353968128,3353969663,US -3353969920,3353977343,US -3353977600,3353979647,US +3353739264,3353979647,US 3353979648,3353979903,CA 3353979904,3353982719,US 3353982720,3353983231,CA -3353983232,3353985023,US -3353985280,3353987583,US -3353988352,3353991679,US +3353983232,3353993215,US 3354001408,3354066943,US 3354066944,3354132479,CA -3354132480,3354463743,US -3354464256,3354466815,US -3354468352,3354476031,US -3354476544,3354484735,US -3354525696,3354532351,US -3354533888,3354540031,US -3354542080,3354560255,US -3354560512,3354562559,US -3354562816,3354568703,US -3354568960,3354570239,US -3354570496,3354582527,US -3354582784,3354590975,US +3354132480,3354591231,US 3354591232,3354656767,CA -3354656768,3354660351,US -3354660864,3354663423,US -3354664960,3354670079,US -3354689536,3354707455,US -3354709248,3354720511,US -3354722304,3354735615,US -3354738688,3354747391,US -3354748416,3354751999,US -3354752256,3354758399,US -3354759424,3354767359,US -3354767616,3354770687,US -3354770944,3354775551,US -3354776064,3354782719,US +3354656768,3354782719,US 3354782720,3354782975,CA -3354782976,3354787071,US -3354787328,3354787583,US -3354788096,3354817535,CA -3354817792,3354823423,CA -3354823680,3354830847,CA -3354831360,3354853119,CA -3354853376,3354918911,CA -3354918912,3354920447,US -3354920960,3354926847,US -3354927104,3354934783,US -3354935296,3354955775,US +3354782976,3354787839,US +3354787840,3354806399,CA +3354806400,3354806463,US +3354806464,3354807551,CA +3354807552,3354810367,US +3354810368,3354814975,CA +3354814976,3354815231,US +3354815232,3354918911,CA +3354918912,3354955775,US 3354955776,3354956031,AR -3354956032,3354967295,US -3354967552,3354969855,US -3354970112,3354978303,US -3354978560,3354988031,US -3354988544,3355012351,US -3355017216,3355025919,US -3355026176,3355032063,US -3355032320,3355049727,US -3355049984,3355052031,US -3355052032,3355053567,CA -3355054080,3355065343,US -3355066368,3355249151,US -3355250688,3355253247,US -3355254784,3355260927,US -3355262976,3355292927,US -3355293696,3355310335,US -3355312128,3355319039,US +3354956032,3355013119,US +3355013120,3355017215,CA +3355017216,3355052287,US +3355052288,3355053311,CA +3355053312,3355053567,US +3355054080,3355260927,US +3355260928,3355262975,CA +3355262976,3355310591,US +3355310592,3355311103,CA +3355312128,3355319295,US 3355319296,3355320319,CA 3355320320,3355324415,US 3355324416,3355328511,CA @@ -58286,12 +94425,21 @@ 3355351040,3355351295,CA 3355351296,3355372287,US 3355372288,3355372543,CA -3355372544,3355377663,US +3355372544,3355384831,US +3355384832,3355385855,CA +3355385856,3355407359,US +3355407360,3355408383,PR +3355408384,3355412479,US +3355412480,3355412991,BE +3355412992,3355430911,US +3355430912,3355432959,A1 +3355432960,3355443199,US 3355443200,3355445247,CO 3355445248,3355447295,BR 3355447296,3355447551,CU 3355447552,3355447807,AR -3355448832,3355449343,AN +3355447808,3355448063,HT +3355448320,3355449343,AN 3355449344,3355450367,CU 3355450368,3355451391,EC 3355451392,3355459071,BR @@ -58347,11 +94495,13 @@ 3355500544,3355508735,AR 3355508736,3355510271,VE 3355510272,3355510527,EC +3355510528,3355510783,AR 3355510784,3355512831,VE 3355512832,3355516927,CL 3355516928,3355525119,AR 3355525120,3355535359,CO 3355535360,3355537407,TT +3355537664,3355537919,AR 3355537920,3355538175,NI 3355538176,3355538431,CL 3355538432,3355539199,AR @@ -58366,7 +94516,7 @@ 3355547904,3355548159,GT 3355548160,3355548671,DO 3355548672,3355549695,SR -3355549696,3355549951,US +3355549696,3355549951,BM 3355549952,3355550207,EC 3355550208,3355552767,VE 3355552768,3355553023,EC @@ -58385,27 +94535,34 @@ 3355582464,3355590655,UY 3355590656,3355592703,CO 3355592704,3355599871,CL +3355599872,3355600895,BR 3355600896,3355604991,CL 3355604992,3355607039,AR 3355607040,3355615231,HT 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 3355672576,3355677183,CO -3355677696,3355682815,CO +3355677184,3355677439,GT +3355677440,3355682815,CO 3355682816,3355684863,AR 3355684864,3355686911,TT 3355686912,3355688959,AR 3355688960,3355689471,CO -3355691008,3355693055,PA +3355689472,3355689727,HN +3355689728,3355689983,AR +3355689984,3355693055,PA 3355693056,3355695103,CL 3355695104,3355697151,AR 3355697152,3355701503,HN -3355701504,3355701759,PE +3355701504,3355702015,PE +3355702016,3355702271,AR 3355702272,3355703295,CO 3355703296,3355705343,PY 3355705344,3355709439,MX @@ -58413,11 +94570,13 @@ 3355713536,3355720447,MX 3355720448,3355720703,AR 3355720704,3355722751,MX +3355722752,3355723263,AR 3355723264,3355746303,MX -3355746304,3355750399,HT +3355746304,3355754495,HT 3355754496,3355770879,PE -3355770880,3355773183,US +3355770880,3355773183,PR 3355773184,3355773439,BR +3355773440,3355773695,AR 3355773696,3355773951,PR 3355773952,3355774975,CU 3355774976,3355779071,VE @@ -58437,6 +94596,7 @@ 3355845120,3355845375,EC 3355845376,3355848959,BR 3355848960,3355849215,CL +3355849216,3355849727,AR 3355849728,3355849983,PA 3355849984,3355850495,CL 3355850496,3355850751,NI @@ -58447,26 +94607,32 @@ 3355858944,3355860991,DO 3355860992,3355869183,CL 3355869184,3355870719,BR -3355871232,3355873279,AR +3355870720,3355871231,CR +3355871232,3355871743,AR +3355871744,3355871999,UY +3355872000,3355872511,AR +3355872512,3355873023,UY +3355873024,3355873279,AR 3355873280,3355875327,AN 3355875328,3355877375,VE 3355877376,3355885567,CO 3355885568,3355901951,GT 3355901952,3355902975,BR +3355902976,3355903999,CL 3355904000,3355905535,BR +3355905536,3355905791,PY +3355905792,3355906047,AR 3355906048,3355910143,CL -3355910144,3355911503,AN -3355911504,3355911519,TF -3355911520,3355918335,AN +3355910144,3355918335,AN 3355918336,3355923455,EC -3355923456,3355923967,UY +3355923456,3355924479,UY 3355924480,3355926527,TT 3355926528,3355934719,VE 3355934720,3355938815,AR 3355942912,3355947007,BO 3355947008,3355949055,AR 3355949056,3355951103,AN -3355951104,3355959295,EC +3355951104,3355967487,EC 3355967488,3356033023,VE 3356033024,3356033791,BR 3356033792,3356034047,CL @@ -58480,7 +94646,7 @@ 3356051712,3356051967,CL 3356051968,3356052223,GT 3356052224,3356052479,AR -3356052480,3356052991,BR +3356052480,3356053247,BR 3356053248,3356054015,CL 3356054016,3356054527,US 3356054528,3356057599,BR @@ -58501,6 +94667,7 @@ 3356070656,3356070911,AR 3356070912,3356071423,BR 3356071424,3356072447,CL +3356072448,3356073215,CR 3356073472,3356075263,BR 3356075264,3356076287,BO 3356076288,3356078079,BR @@ -58527,8 +94694,7 @@ 3356089088,3356089343,AR 3356089344,3356090623,BR 3356090624,3356090879,CL -3356090880,3356091135,BR -3356091136,3356091391,AR +3356090880,3356091391,BR 3356091392,3356091647,CL 3356091648,3356091903,BR 3356091904,3356092927,CL @@ -58546,7 +94712,9 @@ 3356100608,3356102399,CL 3356102400,3356102655,PA 3356102656,3356105727,CL +3356105728,3356106751,SV 3356106752,3356113919,BR +3356113920,3356114431,UY 3356114944,3356123135,PE 3356123136,3356131839,AR 3356131840,3356132351,PE @@ -58559,7 +94727,7 @@ 3356135680,3356135935,CL 3356135936,3356136191,BR 3356136192,3356137471,EC -3356137472,3356137727,US +3356137472,3356137727,JM 3356137728,3356138239,BR 3356138240,3356138495,US 3356138496,3356139519,BR @@ -58567,7 +94735,7 @@ 3356139776,3356140031,AR 3356140032,3356140287,DO 3356140288,3356140799,BR -3356140800,3356141311,US +3356140800,3356141311,BM 3356141312,3356142847,CL 3356142848,3356145151,BR 3356145152,3356145407,CL @@ -58589,7 +94757,8 @@ 3356150016,3356150527,AR 3356150528,3356150783,PA 3356150784,3356151039,AR -3356151552,3356151807,AR +3356151040,3356151295,NI +3356151296,3356151807,AR 3356151808,3356152063,CL 3356152064,3356152575,BR 3356152576,3356152831,CL @@ -58601,6 +94770,7 @@ 3356157952,3356158207,CL 3356158208,3356158463,MX 3356158464,3356158719,CL +3356158720,3356158975,AR 3356158976,3356159743,CL 3356159744,3356160255,MX 3356160256,3356160511,GT @@ -58613,7 +94783,11 @@ 3356163584,3356163839,VE 3356163840,3356164095,CL 3356164096,3356171519,BR +3356171520,3356171775,AR +3356171776,3356172031,NI +3356172032,3356172287,SV 3356172288,3356172543,PE +3356172544,3356172799,AR 3356172800,3356174335,PE 3356174336,3356176383,CO 3356176384,3356180479,PE @@ -58623,7 +94797,7 @@ 3356194816,3356196863,TT 3356196864,3356229631,VE 3356229632,3356233727,BR -3356233728,3356236799,CL +3356233728,3356237823,CL 3356237824,3356246015,GT 3356246016,3356262655,MX 3356262656,3356263167,CL @@ -58632,7 +94806,9 @@ 3356263680,3356265215,AR 3356265216,3356265471,BR 3356265472,3356267007,CL +3356267008,3356267263,PY 3356267264,3356268799,CL +3356268800,3356269055,PA 3356269056,3356269311,AR 3356269312,3356269823,UY 3356269824,3356270079,BR @@ -58641,9 +94817,12 @@ 3356272640,3356272895,US 3356272896,3356273151,EC 3356273152,3356273407,CO +3356273408,3356273663,CL 3356273664,3356274431,SV 3356274432,3356278783,CO 3356279040,3356279295,VE +3356279296,3356279807,CL +3356279808,3356280831,EC 3356280832,3356282879,AR 3356282880,3356284927,PA 3356284928,3356286975,AR @@ -58653,16 +94832,18 @@ 3356287024,3356287039,GT 3356287040,3356287047,US 3356287048,3356287071,GT -3356287072,3356287135,US -3356287136,3356287151,GT -3356287152,3356287359,US -3356287360,3356287367,GT -3356287368,3356287487,US -3356287488,3356287743,SV -3356287744,3356288255,HN -3356288256,3356288767,SV -3356288768,3356289023,GT -3356289024,3356289791,SV +3356287072,3356287087,SV +3356287088,3356287103,US +3356287104,3356287151,GT +3356287152,3356287231,US +3356287232,3356287487,GT +3356287488,3356287999,AN +3356288000,3356288255,NI +3356288256,3356288511,TT +3356288512,3356288767,SV +3356288768,3356289023,NI +3356289024,3356289535,SV +3356289536,3356289791,NI 3356289792,3356289799,US 3356289800,3356289807,GT 3356289808,3356289823,SV @@ -58671,28 +94852,37 @@ 3356289920,3356289951,US 3356289952,3356289983,GT 3356289984,3356290303,US -3356290304,3356290559,SV +3356290304,3356290559,NI 3356290560,3356291071,CR 3356291072,3356293119,TT 3356293120,3356295167,AW 3356295168,3356297215,CL 3356297216,3356299263,BR 3356299264,3356305663,MX -3356305664,3356305919,AR -3356307456,3356316415,MX -3356317696,3356328959,MX +3356305664,3356306431,AR +3356307456,3356328959,MX 3356329984,3356332031,GF 3356332032,3356334079,CU 3356334080,3356336127,BO -3356336128,3356336639,SV -3356336640,3356338175,HN -3356338176,3356339967,SV -3356339968,3356341247,HN -3356341248,3356341503,SV -3356341504,3356342271,HN -3356342272,3356343039,SV -3356343040,3356343551,HN -3356343552,3356344319,SV +3356336128,3356337151,SV +3356337152,3356337663,HN +3356337664,3356338055,SV +3356338056,3356338063,HN +3356338064,3356340455,SV +3356340456,3356340463,HN +3356340464,3356340687,SV +3356340688,3356340703,HN +3356340704,3356340863,SV +3356340864,3356340879,HN +3356340880,3356341231,SV +3356341232,3356341239,HN +3356341240,3356341799,SV +3356341800,3356341807,HN +3356341808,3356341863,SV +3356341864,3356341871,HN +3356341872,3356343295,SV +3356343296,3356343423,HN +3356343424,3356344319,SV 3356344320,3356360703,CO 3356360704,3356362751,CL 3356362752,3356364799,VE @@ -58703,33 +94893,39 @@ 3356370944,3356372991,CO 3356372992,3356375039,CU 3356375040,3356377087,HN -3356377088,3356379647,CL -3356380160,3356380927,CL -3356381184,3356381439,CL -3356382208,3356389119,CL +3356377088,3356389375,CL 3356389376,3356389887,CO -3356389888,3356390399,CL -3356390656,3356391167,CL +3356389888,3356391423,CL 3356391424,3356393471,CO -3356393472,3356426239,CL +3356393472,3356413183,CL +3356413184,3356413951,CO +3356413952,3356419839,CL +3356419840,3356422143,CO +3356422144,3356426239,CL 3356426240,3356491775,US 3356491776,3356493823,PE -3356493824,3356495871,MU +3356493824,3356495871,ZA 3356495872,3356499967,AR 3356499968,3356508159,MX -3356508160,3356508671,AR -3356510208,3356511999,AR -3356512256,3356514303,AR +3356508160,3356514303,AR 3356514304,3356514559,US -3356516352,3356520447,AR -3356521472,3356521727,AR -3356522496,3356557311,AR +3356516352,3356557311,AR 3356557312,3356819455,BR 3356819456,3356884991,CO 3356884992,3356950527,CL 3356950528,3357016063,MX -3357016064,3357018623,CO -3357020160,3357048831,CO +3357016064,3357032447,CO +3357032448,3357032703,EC +3357032704,3357048831,CO +3357048832,3357050879,PA +3357050880,3357050895,CR +3357050896,3357054463,PA +3357054464,3357054719,BZ +3357054720,3357054975,PA +3357054976,3357055087,BZ +3357055088,3357055103,PA +3357055104,3357055231,BZ +3357055232,3357057023,PA 3357057024,3357065215,PE 3357065216,3357073407,EC 3357073408,3357077503,CL @@ -58743,47 +94939,60 @@ 3357190144,3357192191,DO 3357192192,3357194239,PY 3357194240,3357196287,AR -3357196288,3357204479,AN -3357204480,3357204991,US -3357204992,3357205759,AN -3357205760,3357206271,VG -3357206272,3357206527,AW -3357206528,3357212671,AN +3357196288,3357210111,AN +3357210112,3357210367,AW +3357210368,3357212159,AN +3357212160,3357212415,AW +3357212416,3357212671,AN 3357212672,3357368319,CL 3357368320,3357376511,CO 3357376512,3357403135,CL 3357403136,3357405183,CO 3357405184,3357407231,EC 3357407232,3357409279,AR -3357409280,3357413119,US +3357409280,3357411327,BR +3357411328,3357412351,VE +3357412352,3357412863,PE +3357412864,3357413119,US 3357413120,3357413375,FR -3357413376,3357421311,US +3357413376,3357414399,US +3357414400,3357415423,PR +3357415424,3357415679,US +3357415680,3357416447,MX +3357416448,3357417215,VE +3357417216,3357417471,US +3357417472,3357418495,CL +3357418496,3357418751,NI +3357418752,3357419007,PR +3357419008,3357419519,GT +3357419520,3357420031,SZ +3357420032,3357421055,CO +3357421056,3357421311,CL 3357421312,3357421567,CO -3357421568,3357422847,US +3357421568,3357422847,NI 3357422848,3357423103,PR -3357423104,3357423615,US -3357423616,3357424639,VE -3357424640,3357425663,US +3357423104,3357423359,CO +3357423360,3357424639,VE +3357424640,3357425663,CL 3357425664,3357442047,CO 3357442048,3357442303,NI -3357442304,3357442447,HN -3357442448,3357442455,SV -3357442456,3357442559,HN +3357442304,3357442559,HN 3357442560,3357442815,NI 3357442816,3357443071,SV 3357443072,3357443327,NI 3357443328,3357443583,GT 3357443584,3357444607,HN 3357444608,3357444863,SV -3357444864,3357448191,GT +3357444864,3357445119,HN +3357445120,3357448191,GT 3357448192,3357448703,SV 3357448704,3357448959,GT 3357448960,3357449727,HN 3357449728,3357450751,GT -3357450752,3357451007,SV -3357451008,3357451519,HN +3357450752,3357451519,HN 3357451520,3357451775,NI -3357451776,3357452287,GT +3357451776,3357452031,HN +3357452032,3357452287,GT 3357452288,3357452799,HN 3357452800,3357453055,NI 3357453056,3357453311,SV @@ -58791,68 +95000,19 @@ 3357454592,3357454847,NI 3357454848,3357455103,HN 3357455104,3357455359,SV -3357455360,3357455871,GT -3357455872,3357456127,NI -3357456128,3357456639,GT -3357456640,3357456895,HN -3357456896,3357458431,GT +3357455360,3357458431,GT 3357458432,3357474815,CL -3357474816,3357474843,US -3357474844,3357474847,PE -3357474848,3357474851,VE -3357474852,3357474855,EC -3357474856,3357474863,US -3357474864,3357474867,EC -3357474868,3357474875,CO -3357474876,3357474879,EC -3357474880,3357474883,VE -3357474884,3357474887,US -3357474888,3357474891,CO -3357474892,3357474895,US -3357474896,3357474899,CO -3357474900,3357474903,US -3357474904,3357474907,VE -3357474908,3357474923,US -3357474924,3357474927,VE -3357474928,3357474931,CO -3357474932,3357474935,US -3357474936,3357474939,PE -3357474940,3357474951,US -3357474952,3357474955,VE -3357474956,3357474959,US -3357474960,3357474963,CO -3357474964,3357474967,US -3357474968,3357474975,EC -3357474976,3357474983,US -3357474984,3357474987,EC -3357474988,3357474991,CO -3357474992,3357474995,CL -3357474996,3357475023,US -3357475024,3357475027,CO -3357475028,3357475051,US -3357475052,3357475055,CO -3357475056,3357475059,US -3357475060,3357475071,EC +3357474816,3357475071,PR 3357475072,3357475839,AR 3357475840,3357476351,VE -3357476352,3357476607,EC -3357476608,3357476863,US +3357476352,3357476607,US +3357476608,3357476863,PR 3357476864,3357477631,EC 3357477632,3357477887,AR -3357477888,3357478199,CO -3357478200,3357478207,EC -3357478208,3357480871,CO -3357480872,3357480879,EC -3357480880,3357480959,CO +3357477888,3357480959,CO 3357480960,3357483007,EC 3357483008,3357491199,CL -3357491200,3357491843,CO -3357491844,3357491847,CR -3357491848,3357495375,CO -3357495376,3357495383,US -3357495384,3357496643,CO -3357496644,3357496647,CR -3357496648,3357499391,CO +3357491200,3357499391,CO 3357499392,3357507583,PE 3357507584,3357515775,VE 3357515776,3357523967,SV @@ -58861,20 +95021,15 @@ 3357540352,3357556735,AR 3357556736,3357556991,VE 3357556992,3357557759,MX -3357557760,3357559295,EC -3357559296,3357559551,CA -3357559552,3357559807,US -3357559808,3357560319,VE +3357557760,3357558015,EC +3357558016,3357558047,AR +3357558048,3357559295,EC +3357559296,3357560063,CL +3357560064,3357560319,HN 3357560320,3357560575,MX -3357560576,3357560831,US +3357560576,3357560831,PR 3357560832,3357561855,CO -3357561856,3357562351,AR -3357562352,3357562367,US -3357562368,3357563047,AR -3357563048,3357563055,CL -3357563056,3357573003,AR -3357573004,3357573007,CL -3357573008,3357581311,AR +3357561856,3357581311,AR 3357581312,3357589503,CL 3357589504,3357605887,BZ 3357605888,3357736959,MX @@ -58885,58 +95040,58 @@ 3357757496,3357773823,VE 3357773824,3357775871,PA 3357775872,3357777919,UY -3357777920,3357785567,GT -3357785568,3357785575,SV -3357785576,3357786111,GT +3357777920,3357786111,GT 3357786112,3357802495,VE 3357802496,3357868031,MX 3357868032,3357933567,PE 3357933568,3358064639,MX 3358064640,3358130175,UY 3358130176,3358131199,EC -3358131200,3358132223,CO +3358131200,3358131391,CO +3358131392,3358131415,GT +3358131416,3358131983,CO +3358131984,3358131991,GT +3358131992,3358132223,CO 3358132224,3358132479,AR 3358132480,3358132735,CO 3358132736,3358133247,EC -3358133248,3358133759,VE -3358133760,3358140471,AR -3358140472,3358140475,US -3358140476,3358140547,AR -3358140548,3358140551,CL -3358140552,3358140623,AR -3358140624,3358140627,US -3358140628,3358142719,AR +3358133248,3358133503,VE +3358133504,3358133759,CO +3358133760,3358142719,AR 3358142720,3358143231,CO 3358143232,3358143487,VE -3358143488,3358143615,US -3358143616,3358143623,CL -3358143624,3358143999,AR -3358144000,3358144511,CL -3358144512,3358145023,VE -3358145024,3358147135,AR -3358147136,3358147167,US -3358147168,3358149631,AR +3358143488,3358143743,CL +3358143744,3358143999,HN +3358144000,3358144255,SV +3358144256,3358144511,CL +3358144512,3358144767,HN +3358144768,3358145023,VE +3358145024,3358149631,AR 3358149632,3358150655,CO -3358150656,3358151679,EC -3358151680,3358152703,PE -3358152704,3358152959,US -3358152960,3358153215,EC -3358153216,3358153247,HT -3358153248,3358153327,US -3358153328,3358153343,AR -3358153344,3358153559,US -3358153560,3358153567,CL -3358153568,3358153583,BR -3358153584,3358153727,US +3358150656,3358151167,EC +3358151168,3358151423,PY +3358151424,3358151679,CO +3358151680,3358152703,GT +3358152704,3358152735,AR +3358152736,3358152767,VE +3358152768,3358152831,US +3358152832,3358153279,AR +3358153280,3358153311,US +3358153312,3358153343,AR +3358153344,3358153535,US +3358153536,3358153599,AR +3358153600,3358153663,PR +3358153664,3358153727,US 3358153728,3358153983,EC -3358153984,3358154239,US -3358154240,3358154751,CL -3358154752,3358158847,PE -3358158848,3358159103,AR -3358159104,3358159151,US -3358159152,3358159159,AR +3358153984,3358154239,VE +3358154240,3358154495,CL +3358154496,3358154751,SV +3358154752,3358155775,PE +3358155776,3358156031,HN +3358156032,3358158847,PE +3358158848,3358159159,VE 3358159160,3358159167,US -3358159168,3358159359,AR +3358159168,3358159359,VE 3358159360,3358159615,EC 3358159616,3358159871,US 3358159872,3358160895,VE @@ -58949,17 +95104,16 @@ 3358264064,3358264319,PY 3358264320,3358326783,AR 3358326784,3358392319,VE -3358392320,3358411183,AR -3358411184,3358411191,UY -3358411192,3358411263,AR -3358411264,3358411279,UY -3358411280,3358457855,AR +3358392320,3358457855,AR 3358457856,3358523391,PA 3358523392,3358543615,AR 3358543616,3358543871,VE 3358543872,3358544127,MX -3358544128,3358558463,AR -3358558464,3358558975,PY +3358544128,3358554879,AR +3358554880,3358555007,UY +3358555008,3358555135,US +3358555136,3358558207,AR +3358558208,3358558975,PY 3358558976,3358559231,AR 3358559232,3358560255,VE 3358560256,3358561791,AR @@ -58967,65 +95121,116 @@ 3358562304,3358563327,PE 3358563328,3358564095,CO 3358564096,3358564351,MX -3358564352,3358564479,AR -3358564480,3358564511,US -3358564512,3358567423,AR -3358567424,3358568959,CO +3358564352,3358567423,AR +3358567424,3358568447,CO +3358568448,3358568959,AR 3358568960,3358569471,MX 3358569472,3358570495,VE 3358570496,3358570751,MX 3358570752,3358571263,PE -3358571264,3358572543,MX -3358572544,3358577151,AR -3358577152,3358577407,PE -3358577408,3358578431,AR +3358571264,3358571775,MX +3358571776,3358572031,AR +3358572032,3358572543,MX +3358572544,3358573951,AR +3358573952,3358574079,UY +3358574080,3358576895,AR +3358576896,3358577279,PE +3358577280,3358578431,AR 3358578432,3358578687,VE 3358578688,3358579967,CO 3358579968,3358580223,AR -3358580224,3358580735,MX +3358580224,3358580735,PE 3358580736,3358588927,AR 3358588928,3358654463,PE 3358654464,3358658559,AR 3358658560,3358660607,CL -3358660608,3358662655,AR +3358660608,3358663455,AR +3358663456,3358663487,US +3358663488,3358665471,AR +3358665472,3358665599,US +3358665600,3358666367,AR +3358666368,3358666495,US +3358666496,3358666623,AR +3358666624,3358666751,US 3358666752,3358695423,AR 3358695424,3358703615,GT 3358703616,3358715903,AR 3358715904,3358717951,EC 3358717952,3358719999,AR -3358720000,3358728191,PR +3358720000,3358720075,PR +3358720076,3358720083,DO +3358720084,3358722047,PR +3358722048,3358723071,DO +3358723072,3358723327,PR +3358723328,3358723583,AN +3358723584,3358724095,PR +3358724096,3358725119,DO +3358725120,3358725375,AN +3358725376,3358728191,PR 3358728192,3358736383,CL -3358736384,3358744575,US +3358736384,3358737111,BB +3358737112,3358737119,CA +3358737120,3358738175,BB +3358738176,3358738687,GD +3358738688,3358739711,BB +3358739712,3358739967,KN +3358739968,3358744575,BB 3358744576,3358752767,CL 3358752768,3358756863,BB 3358756864,3358760959,CL -3358760960,3358765055,AR -3358765056,3358766591,UY +3358760960,3358765311,AR +3358765312,3358765567,UY +3358765568,3358765823,AR +3358765824,3358766591,UY 3358766592,3358769151,AR 3358769152,3358777343,HT 3358777344,3358779391,CR 3358779392,3358781439,EC -3358781440,3358851071,AR +3358781440,3358822399,AR +3358822400,3358827519,UY +3358827520,3358829567,AR +3358829568,3358830591,CL +3358830592,3358851071,AR 3358851072,3358982143,MX 3358982144,3359047679,CL -3359047680,3359057007,AR -3359057008,3359057023,CL -3359057024,3359080447,AR -3359080448,3359093295,CU -3359093296,3359093303,EC -3359093304,3359093335,CU -3359093336,3359093343,DO -3359093344,3359095719,CU -3359095720,3359095727,EC -3359095728,3359096831,CU +3359047680,3359080447,AR +3359080448,3359096831,CU 3359096832,3359105023,CL 3359105024,3359109119,EC +3359109120,3359111167,AR +3359111168,3359113215,EC 3359113216,3359244287,MX -3359244288,3359260671,US +3359244288,3359248383,US +3359248384,3359248399,BR +3359248400,3359249679,US +3359249680,3359249759,AR +3359249760,3359249791,BR +3359249792,3359249887,AR +3359249888,3359250175,US +3359250176,3359252039,AR +3359252040,3359252047,IT +3359252048,3359252063,US +3359252064,3359252095,AR +3359252096,3359252159,US +3359252160,3359252223,AR +3359252224,3359256575,US +3359256576,3359256639,BR +3359256640,3359257087,US +3359257088,3359257103,BR +3359257104,3359257127,AR +3359257128,3359257135,BR +3359257136,3359257151,AR +3359257152,3359257183,BR +3359257184,3359257215,US +3359257216,3359257247,AR +3359257248,3359257263,BR +3359257264,3359257279,US +3359257280,3359257311,AR +3359257312,3359257327,US +3359257328,3359257343,AR +3359257344,3359260671,US 3359260672,3359268863,BO -3359268864,3359275519,AR -3359275520,3359275551,VE -3359275552,3359277055,AR +3359268864,3359277055,AR 3359277056,3359285247,UY 3359285248,3359293439,BO 3359293440,3359305727,CO @@ -59034,86 +95239,90 @@ 3359309824,3359313919,AR 3359313920,3359315967,CR 3359315968,3359318015,HN -3359318016,3359354879,AR -3359358976,3359363071,AR +3359318016,3359356927,AR +3359356928,3359358975,VE +3359358976,3359361023,AR +3359361024,3359362047,UY +3359362048,3359363071,AR 3359367168,3359375359,AR 3359375360,3359440895,PE 3359440896,3359457487,AR 3359457488,3359457503,EC -3359457504,3359457663,AR -3359457664,3359457679,EC -3359457680,3359457695,AR +3359457504,3359457695,AR 3359457696,3359457727,BO -3359457728,3359461951,AR +3359457728,3359457791,AR +3359457792,3359459327,EC +3359459328,3359459583,PY +3359459584,3359460847,AR +3359460848,3359461119,UY +3359461120,3359461375,AR +3359461376,3359461887,EC +3359461888,3359461951,AR 3359461952,3359462015,HN 3359462016,3359462271,AR 3359462272,3359462335,UY -3359462336,3359463399,AR +3359462336,3359462399,AR +3359462400,3359462655,UY +3359462656,3359463399,AR 3359463400,3359463407,CO -3359463408,3359463423,BO -3359463424,3359463679,AR +3359463408,3359463663,AR +3359463664,3359463679,PY 3359463680,3359463743,HN -3359463744,3359464447,AR +3359463744,3359463935,AR +3359463936,3359464127,EC +3359464128,3359464191,AR +3359464192,3359464447,EC 3359464448,3359465471,UY -3359465472,3359466495,AR +3359465472,3359465983,CO +3359465984,3359466495,AR 3359466496,3359466751,BO -3359466752,3359472639,AR +3359466752,3359467263,AR +3359467264,3359467519,UY +3359467520,3359468031,BO +3359468032,3359468543,UY +3359468544,3359468799,AR +3359468800,3359469567,UY +3359469568,3359470591,AR +3359470592,3359471615,PY +3359471616,3359472127,AR +3359472128,3359472639,BO 3359472640,3359473663,PY -3359473664,3359475223,CO -3359475224,3359475263,AR -3359475264,3359475279,CO -3359475280,3359475287,AR -3359475288,3359475327,CO -3359475328,3359475359,AR -3359475360,3359475447,CO -3359475448,3359475471,AR -3359475472,3359475487,CO -3359475488,3359475503,AR -3359475504,3359475511,CO -3359475512,3359475519,AR -3359475520,3359475527,CO -3359475528,3359475535,AR -3359475536,3359475551,CO -3359475552,3359475583,AR -3359475584,3359475591,CO -3359475592,3359475599,AR -3359475600,3359475607,CO -3359475608,3359475623,AR -3359475624,3359475631,CO -3359475632,3359475639,AR -3359475640,3359475647,CO -3359475648,3359475663,AR -3359475664,3359475687,CO -3359475688,3359475688,AR -3359475689,3359475695,CO -3359475696,3359475703,AR -3359475704,3359477847,CO -3359477848,3359477855,AR -3359477856,3359478687,CO -3359478688,3359478727,AR -3359478728,3359479343,CO -3359479344,3359479383,AR -3359479384,3359479391,CO -3359479392,3359479423,AR -3359479424,3359480319,CO -3359480320,3359480575,AR -3359480576,3359480703,CO -3359480704,3359480767,AR -3359480768,3359480863,CO -3359480864,3359480887,AR -3359480888,3359480935,CO -3359480936,3359480959,AR -3359480960,3359480975,CO -3359480976,3359480983,AR -3359480984,3359481023,CO -3359481024,3359481055,AR -3359481056,3359481759,CO -3359481760,3359481775,AR -3359481776,3359481823,CO +3359473664,3359475359,CO +3359475360,3359475367,AR +3359475368,3359475519,CO +3359475520,3359475551,AR +3359475552,3359475615,CO +3359475616,3359475623,AR +3359475624,3359478687,CO +3359478688,3359478719,AR +3359478720,3359479295,CO +3359479296,3359479303,AR +3359479304,3359479327,CO +3359479328,3359479343,AR +3359479344,3359479375,CO +3359479376,3359479383,AR +3359479384,3359479487,CO +3359479488,3359479551,AR +3359479552,3359480575,CO +3359480576,3359480815,AR +3359480816,3359480871,CO +3359480872,3359480887,AR +3359480888,3359480911,CO +3359480912,3359480915,AR +3359480916,3359480927,CO +3359480928,3359480935,AR +3359480936,3359480959,CO +3359480960,3359480975,AR +3359480976,3359481599,CO +3359481600,3359481663,AR +3359481664,3359481727,CO +3359481728,3359481743,AR +3359481744,3359481823,CO 3359481824,3359481839,AR 3359481840,3359481855,CO 3359481856,3359498239,AR -3359498240,3359502335,PY +3359498240,3359501311,PY +3359501312,3359502335,SR 3359506432,3359508479,US 3359508480,3359514623,VE 3359514624,3359516671,GT @@ -59126,40 +95335,36 @@ 3359520256,3359520767,AR 3359520768,3359522815,US 3359522816,3359539199,NI -3359539200,3359550319,PE -3359550320,3359550335,NI -3359550336,3359571967,PE +3359539200,3359571967,PE 3359571968,3359582207,AR -3359582208,3359583743,PA -3359583744,3359583999,UA -3359584000,3359584255,PA -3359584256,3359584511,CY -3359584512,3359586303,AR +3359582208,3359584255,PA +3359584256,3359586303,AR 3359586304,3359588351,CL 3359588352,3359589375,AR -3359589376,3359589887,UY -3359589888,3359596543,AR +3359589376,3359589631,UY +3359589632,3359596543,AR 3359596544,3359598591,CL -3359598592,3359600639,AN 3359600640,3359621119,AR 3359621120,3359637503,EC 3359637504,3359789583,MX 3359789584,3359789599,US -3359789600,3359789823,MX -3359789824,3359789887,US -3359789888,3359899647,MX +3359789600,3359899647,MX 3359899648,3359916031,CL -3359916032,3359918143,AR -3359918144,3359918175,US -3359918176,3359932415,AR -3359932416,3359948799,CO -3359948800,3359989759,AR +3359916032,3359932415,AR +3359932416,3359945471,CO +3359945472,3359945727,EC +3359945728,3359948799,CO +3359948800,3359969663,AR +3359969664,3359969791,UY +3359969792,3359989759,AR 3359989760,3359997951,CO 3359997952,3360006143,AR 3360006144,3360014335,EC 3360014336,3360096255,AR 3360096256,3360104447,UY 3360104448,3360116735,CO +3360116736,3360118783,BO +3360118784,3360120831,AR 3360120832,3360129023,CO 3360129024,3360145407,VE 3360145408,3360153599,CL @@ -59169,45 +95374,37 @@ 3360161792,3360227327,CL 3360227328,3360228191,CO 3360228192,3360228223,CL -3360228224,3360229375,CO -3360229376,3360230399,CL -3360230400,3360231431,CO -3360231432,3360231463,CL -3360231464,3360231471,CO -3360231472,3360231479,CL -3360231480,3360231487,CO -3360231488,3360231527,CL -3360231528,3360231551,CO -3360231552,3360231631,CL -3360231632,3360231639,CO -3360231640,3360231655,CL -3360231656,3360232447,CO -3360232448,3360233471,CL -3360233472,3360235263,CO +3360228224,3360228639,CO +3360228640,3360228663,CL +3360228664,3360229119,CO +3360229120,3360231423,CL +3360231424,3360231455,CO +3360231456,3360231463,CL +3360231464,3360231487,CO +3360231488,3360231519,CL +3360231520,3360231599,CO +3360231600,3360231607,CL +3360231608,3360231679,CO +3360231680,3360234751,CL +3360234752,3360235263,CO 3360235264,3360235271,CL -3360235272,3360235487,CO -3360235488,3360235495,CL -3360235496,3360235519,CO -3360235520,3360235775,CL -3360235776,3360236799,CO -3360236800,3360237055,CL -3360237056,3360240895,CO -3360240896,3360241151,CL -3360241152,3360243199,CO -3360243200,3360243455,CL -3360243456,3360243711,CO -3360243712,3360243967,CL -3360243968,3360244095,CO -3360244096,3360244127,CL -3360244128,3360244479,CO -3360244480,3360244735,CL -3360244736,3360245119,CO -3360245120,3360245123,CL -3360245124,3360245199,CO -3360245200,3360245203,CL -3360245204,3360245759,CO -3360245760,3360247807,CL -3360247808,3360248319,CO +3360235272,3360235519,CO +3360235520,3360236287,CL +3360236288,3360236303,CO +3360236304,3360236311,CL +3360236312,3360236423,CO +3360236424,3360236439,CL +3360236440,3360236487,CO +3360236488,3360236503,CL +3360236504,3360236527,CO +3360236528,3360236543,CL +3360236544,3360236799,CO +3360236800,3360238079,CL +3360238080,3360239103,CO +3360239104,3360239615,CL +3360239616,3360240895,CO +3360240896,3360243967,CL +3360243968,3360248319,CO 3360248320,3360248575,CL 3360248576,3360251903,CO 3360251904,3360253951,BO @@ -59223,127 +95420,108 @@ 3360325632,3360333823,CO 3360333824,3360342015,CL 3360342016,3360354303,VE -3360358400,3360358911,CL -3360358912,3360358919,CO -3360358920,3360366591,CL +3360354304,3360356351,PA +3360356352,3360358399,CR +3360358400,3360366591,CL 3360366592,3360382975,CO 3360382976,3360399359,VE 3360399360,3360403455,BO -3360403456,3360405503,US +3360403456,3360404479,AR +3360404480,3360405503,US 3360405504,3360407551,HN 3360407552,3360423935,PA -3360423936,3360547983,MX -3360547984,3360547999,NI -3360548000,3360686079,MX +3360423936,3360686079,MX 3360686080,3360687871,CO -3360687872,3360687975,AR -3360687976,3360687983,CO -3360687984,3360688079,AR -3360688080,3360688119,CO -3360688120,3360688127,AR -3360688128,3360689407,CO -3360689408,3360689919,AR -3360689920,3360690199,CO -3360690200,3360690215,AR -3360690216,3360690223,CO -3360690224,3360690231,AR -3360690232,3360690303,CO -3360690304,3360690327,AR -3360690328,3360690351,CO -3360690352,3360690415,AR -3360690416,3360690431,CO -3360690432,3360690687,AR -3360690688,3360690703,CO -3360690704,3360690719,AR -3360690720,3360690735,CO -3360690736,3360690879,AR -3360690880,3360691711,CO -3360691712,3360691967,AR -3360691968,3360692319,CO -3360692320,3360692367,AR -3360692368,3360692431,CO -3360692432,3360692439,AR -3360692440,3360692479,CO -3360692480,3360692671,AR -3360692672,3360692735,CO -3360692736,3360692799,AR -3360692800,3360692863,CO -3360692864,3360693263,AR -3360693264,3360693279,CO -3360693280,3360693351,AR -3360693352,3360693407,CO -3360693408,3360693423,AR -3360693424,3360693759,CO -3360693760,3360693799,AR -3360693800,3360693855,CO -3360693856,3360694015,AR -3360694016,3360694071,CO -3360694072,3360694079,AR -3360694080,3360694239,CO -3360694240,3360694247,AR -3360694248,3360694391,CO -3360694392,3360694415,AR -3360694416,3360694431,CO -3360694432,3360694447,AR -3360694448,3360694463,CO -3360694464,3360694783,AR -3360694784,3360695039,CO -3360695040,3360695263,AR -3360695264,3360695423,CO -3360695424,3360695487,AR -3360695488,3360695559,CO -3360695560,3360695583,AR -3360695584,3360695743,CO -3360695744,3360695759,AR -3360695760,3360696319,CO -3360696320,3360696447,AR -3360696448,3360696487,CO -3360696488,3360696495,AR -3360696496,3360696511,CO -3360696512,3360696543,AR -3360696544,3360696575,CO -3360696576,3360696703,AR -3360696704,3360696719,CO -3360696720,3360696735,AR -3360696736,3360696767,CO -3360696768,3360696783,AR -3360696784,3360696831,CO -3360696832,3360697343,AR -3360697344,3360697855,CO -3360697856,3360698111,AR -3360698112,3360698879,CO -3360698880,3360698911,AR -3360698912,3360698991,CO -3360698992,3360699007,AR -3360699008,3360700415,CO +3360687872,3360688639,AR +3360688640,3360688767,CO +3360688768,3360689151,AR +3360689152,3360689407,CO +3360689408,3360689535,AR +3360689536,3360689663,CO +3360689664,3360689919,AR +3360689920,3360690175,CO +3360690176,3360690303,AR +3360690304,3360690431,CO +3360690432,3360690719,AR +3360690720,3360690751,CO +3360690752,3360690943,AR +3360690944,3360691711,CO +3360691712,3360692351,AR +3360692352,3360692367,CO +3360692368,3360692607,AR +3360692608,3360692735,CO +3360692736,3360693247,AR +3360693248,3360693311,CO +3360693312,3360693343,AR +3360693344,3360693503,CO +3360693504,3360693791,AR +3360693792,3360693823,CO +3360693824,3360694015,AR +3360694016,3360694079,CO +3360694080,3360694143,AR +3360694144,3360694271,CO +3360694272,3360694303,AR +3360694304,3360694463,CO +3360694464,3360695071,AR +3360695072,3360695087,CO +3360695088,3360695167,AR +3360695168,3360695199,CO +3360695200,3360695215,AR +3360695216,3360695295,CO +3360695296,3360696447,AR +3360696448,3360696511,CO +3360696512,3360696527,AR +3360696528,3360696735,CO +3360696736,3360696767,AR +3360696768,3360696831,CO +3360696832,3360698111,AR +3360698112,3360699391,CO +3360699392,3360700159,AR +3360700160,3360700415,CO 3360700416,3360701311,AR -3360701312,3360702463,CO -3360702464,3360710655,AR -3360710656,3360714751,HT +3360701312,3360701439,CO +3360701440,3360710655,AR +3360710656,3360718847,HT 3360718848,3360763903,AR -3360768000,3360772351,AR +3360763904,3360765951,GT +3360765952,3360767999,CO +3360768000,3360770047,PY +3360770048,3360771327,EC +3360771328,3360771839,AR +3360771840,3360772095,EC +3360772096,3360772351,AR 3360772352,3360772479,BO -3360772480,3360780287,AR -3360784384,3360788479,AR -3360792576,3360796671,AR -3360800768,3360849919,AR +3360772480,3360772607,AR +3360772608,3360773119,EC +3360773120,3360774143,BO +3360774144,3360774399,EC +3360774400,3360774655,AR +3360774656,3360774911,EC +3360774912,3360775087,AR +3360775088,3360775099,EC +3360775100,3360775167,AR +3360775168,3360775679,BO +3360775680,3360788479,AR +3360788480,3360790527,CL +3360790528,3360849919,AR 3360849920,3360882687,VE 3360882688,3360948223,CL 3360948224,3361013759,VE 3361013760,3361021951,SV 3361021952,3361030143,PY 3361030144,3361034239,VE -3361038336,3361046527,AR -3361046528,3361050623,BO +3361034240,3361036287,EC +3361036288,3361046527,AR +3361046528,3361052671,BO +3361052672,3361054719,AR 3361054720,3361058815,NI +3361058816,3361062911,AR 3361062912,3361071103,CL 3361071104,3361079295,CO 3361079296,3361144831,CL 3361144832,3361210367,BO 3361210368,3361275903,DO -3361275904,3361276639,PE -3361276640,3361276647,US -3361276648,3361284095,PE +3361275904,3361284095,PE 3361284096,3361296383,CL 3361296384,3361298431,SV 3361298432,3361300479,DO @@ -59352,20 +95530,19 @@ 3361325056,3361341439,CO 3361341440,3361374207,VE 3361374208,3361378303,PA +3361378304,3361380351,BO +3361380352,3361382399,EC 3361382400,3361415167,CL +3361415168,3361417215,AR +3361417216,3361419263,CL +3361419264,3361423359,AR 3361423360,3361456127,CR -3361456128,3361465455,CO -3361465456,3361465459,CL -3361465460,3361465607,CO -3361465608,3361465615,CR -3361465616,3361471131,CO -3361471132,3361471135,CL -3361471136,3361472511,CO +3361456128,3361472511,CO 3361472512,3361538047,MX 3361538048,3361570815,VE 3361570816,3361587199,CO 3361587200,3361599487,EC -3361599488,3361600511,UY +3361599488,3361601535,UY 3361601536,3361603583,EC 3361603584,3361734655,MX 3361734656,3362258943,BR @@ -59381,24 +95558,38 @@ 3362338816,3362339839,AR 3362339840,3362341887,CO 3362341888,3362342143,GT -3362342144,3362342911,PA -3362342912,3362343423,CO -3362343424,3362343679,EC -3362343680,3362344959,CO +3362342144,3362342399,PA +3362342400,3362342655,AR +3362342656,3362342911,PA +3362342912,3362344959,CO 3362344960,3362347007,PA 3362347008,3362349055,CO -3362357248,3362381823,BO +3362349056,3362351103,CR +3362351104,3362353151,AR +3362353152,3362355199,EC +3362355200,3362357247,AR +3362357248,3362373631,BO +3362373632,3362377727,PE +3362377728,3362381823,BO 3362381824,3362390015,EC 3362390016,3362422783,PE 3362422784,3362426879,CO +3362426880,3362428927,PA +3362428928,3362430975,CL 3362430976,3362447359,CO -3362447360,3362449407,HN -3362449408,3362450175,SV -3362450176,3362451455,HN +3362447360,3362451455,SV 3362455552,3362471935,EC 3362471936,3362476031,CL -3362484224,3362484479,AR -3362484480,3362486271,UY +3362476032,3362476287,HN +3362476288,3362476543,AR +3362476544,3362477055,CR +3362478080,3362480127,AR +3362480128,3362484223,PE +3362484224,3362484735,AR +3362484736,3362484991,UY +3362484992,3362485759,AR +3362485760,3362486015,UY +3362486016,3362486271,AR 3362486272,3362488319,HN 3362488320,3362504703,PE 3362504704,3362506751,VE @@ -59414,80 +95605,75 @@ 3362537472,3362545663,AR 3362545664,3362549759,PE 3362553856,3362557951,PY -3362562048,3362570239,BZ +3362562048,3362563071,BZ +3362563072,3362563199,PA +3362563200,3362563583,BZ +3362563584,3362563711,PA +3362563712,3362564095,BZ +3362564096,3362564223,PA +3362564224,3362564479,BZ +3362564480,3362564607,PA +3362564608,3362565375,BZ +3362565376,3362565503,PA +3362565504,3362565631,BZ +3362565632,3362565759,PA +3362565760,3362567423,BZ +3362567424,3362567679,PA +3362567680,3362569727,BZ +3362569728,3362569983,PA +3362569984,3362570239,BZ 3362570240,3362586623,UY 3362586624,3362652159,VE -3362652160,3362664447,PE +3362652160,3362668543,PE 3362668544,3362676735,EC 3362676736,3362680831,CO -3362684928,3362685439,CO -3362685440,3362685447,AR -3362685448,3362685455,CO -3362685456,3362685463,AR -3362685464,3362685471,CO -3362685472,3362685479,AR -3362685480,3362685567,CO -3362685568,3362685631,AR -3362685632,3362685951,CO -3362685952,3362685983,AR -3362685984,3362686079,CO -3362686080,3362686143,AR -3362686144,3362686167,CO -3362686168,3362686175,AR -3362686176,3362686271,CO -3362686272,3362686303,AR -3362686304,3362686463,CO -3362686464,3362686471,AR -3362686472,3362686975,CO -3362686976,3362687039,AR -3362687040,3362687487,CO +3362680832,3362684927,EC +3362684928,3362685951,CO +3362685952,3362686975,AR +3362686976,3362687487,CO 3362687488,3362687999,AR -3362688000,3362688255,CO -3362688256,3362688775,AR -3362688776,3362689279,CO -3362689280,3362689311,AR -3362689312,3362689791,CO -3362689792,3362690047,AR -3362690048,3362690367,CO -3362690368,3362690431,AR -3362690432,3362691327,CO +3362688000,3362688383,CO +3362688384,3362688511,AR +3362688512,3362689535,CO +3362689536,3362690047,AR +3362690048,3362690303,CO +3362690304,3362690687,AR +3362690688,3362690815,CO +3362690816,3362691071,AR +3362691072,3362691327,CO 3362691328,3362691583,PA -3362691584,3362691839,CO -3362691840,3362692095,PA -3362692096,3362692223,AR -3362692224,3362692231,CO -3362692232,3362692239,AR -3362692240,3362692351,CO -3362692352,3362692607,MX -3362692608,3362693119,CO -3362693120,3362695167,AR +3362691584,3362692095,CO +3362692096,3362692351,AR +3362692352,3362692479,MX +3362692480,3362692607,AR +3362692608,3362692863,CO +3362692864,3362695167,AR 3362695168,3362697215,CO 3362697216,3362703359,AR 3362703360,3362705407,GT 3362705408,3362711551,AR 3362711552,3362713599,EC 3362713600,3362717695,GT -3362717696,3362742271,CL -3362750464,3362815999,CL +3362717696,3362815999,CL 3362816000,3362832383,AR 3362832384,3362836479,BO 3362840576,3362897919,CL 3362897920,3362906111,HT 3362914304,3362934783,CO -3362947072,3362983935,AR +3362934784,3362936831,AR +3362936832,3362938879,CL +3362938880,3362942975,AR +3362942976,3362945023,GT +3362945024,3362983935,AR 3362988032,3362992127,EC 3362996224,3363000319,UY 3363004416,3363012607,CO -3363012608,3363024895,PA +3363012608,3363028991,PA 3363028992,3363045375,AR 3363045376,3363110911,CO -3363110912,3363112063,AR -3363112064,3363112079,PY -3363112080,3363112127,AR -3363112128,3363112143,PY -3363112144,3363176447,AR +3363110912,3363176447,AR 3363176448,3363274751,CO -3363274752,3363282943,GT +3363274752,3363291135,GT 3363291136,3363299327,BO 3363299328,3363373055,CL 3363373056,3363438591,PE @@ -59496,8 +95682,8 @@ 3363487744,3363504127,CO 3363504128,3363512319,PE 3363520512,3363553791,AR -3363553792,3363554303,PE -3363554304,3363557375,AR +3363553792,3363554047,PE +3363554048,3363557375,AR 3363561472,3363565567,CO 3363569664,3363577855,PA 3363577856,3363586047,CL @@ -59514,26 +95700,22 @@ 3363680256,3363682303,GT 3363682304,3363684351,VE 3363684352,3363700735,EC +3363700736,3363708927,CU +3363708928,3363713023,CL 3363717120,3363733503,CL 3363733504,3363831807,AR 3363831808,3378511871,BR -3378511872,3382600575,MX -3382600576,3382600703,US -3382600704,3382601087,MX -3382601088,3382601215,US -3382601216,3383754751,MX -3384803328,3385851903,CR +3378511872,3383754751,MX +3384737792,3385851903,CR 3385851904,3386114047,VE 3386114048,3386245119,AR 3386245120,3386376191,CL 3386376192,3386392575,CO -3386392576,3386396671,AN -3386396672,3386400767,VG -3386400768,3386408959,AN +3386392576,3386398463,AN +3386398464,3386398719,VG +3386398720,3386408959,AN 3386408960,3386425343,GT -3386425344,3386429855,AR -3386429856,3386429863,US -3386429864,3386441727,AR +3386425344,3386441727,AR 3386441728,3386458111,PY 3386458112,3386474495,EC 3386474496,3386490879,UY @@ -59550,7 +95732,7 @@ 3386646528,3386662911,CO 3386662912,3386671103,CL 3386671104,3386675199,HN -3386679296,3386683391,AR +3386679296,3386687487,AR 3386687488,3386695679,CU 3386695680,3386703871,CL 3386703872,3386720255,UY @@ -59566,46 +95748,46 @@ 3386802176,3386900479,CL 3386900480,3387162623,PA 3387162624,3387228159,CO -3387228160,3387244543,AW +3387228160,3387260927,AW 3387260928,3387293695,DO 3387293696,3387359231,PE 3387359232,3387424767,AR 3387424768,3387555839,CO -3387555840,3387559999,AR -3387560000,3387560063,BR -3387560064,3387568127,AR +3387555840,3387568127,AR 3387568128,3387572223,PE -3387572224,3387576319,CO -3387576320,3387578367,EC -3387578368,3387584511,AR +3387572224,3387572863,AR +3387572864,3387572991,CO +3387572992,3387573503,AR +3387573504,3387573631,CO +3387573632,3387575935,AR +3387575936,3387576063,CO +3387576064,3387576319,AR +3387576320,3387580415,EC +3387580416,3387584511,AR 3387584512,3387588607,PE 3387588608,3387600895,AR 3387600896,3387604991,CO 3387604992,3387613183,EC 3387613184,3387617279,VE -3387617280,3387617327,CO -3387617328,3387617335,CL -3387617336,3387619327,CO +3387617280,3387619327,CO 3387619328,3387686911,AR 3387686912,3387736063,CL 3387736064,3387752447,CO 3387752448,3387817983,CR -3387817984,3387826175,VE +3387817984,3387834367,VE 3387834368,3387850751,TT -3387858944,3387867135,EC +3387850752,3387867135,EC 3387867136,3387949055,CL 3387949056,3388014591,PE 3388014592,3388080127,CL 3388080128,3388211199,VE -3388211200,3388323671,CO -3388323672,3388323679,GS -3388323680,3388342271,CO +3388211200,3388342271,CO 3388342272,3388407807,CL 3388407808,3388473343,SV 3388473344,3388604415,VE -3388604416,3388827407,AR -3388827408,3388827415,AW -3388827416,3388997631,AR +3388604416,3388800255,AR +3388800256,3388800511,PY +3388800512,3388997631,AR 3388997632,3389001727,AU 3389001728,3389005823,PH 3389005824,3389014015,NZ @@ -59617,7 +95799,6 @@ 3389016576,3389017087,AU 3389017088,3389017343,JP 3389017344,3389017855,HK -3389017856,3389018111,AU 3389018112,3389018367,PG 3389018368,3389018623,ID 3389018624,3389019135,AU @@ -59673,7 +95854,12 @@ 3389104128,3389112319,SB 3389112320,3389116415,MV 3389116416,3389120511,JP -3389120512,3389124607,AU +3389120512,3389122559,AU +3389122560,3389122815,HK +3389122816,3389123583,AU +3389123584,3389123839,ID +3389123840,3389124351,AU +3389124352,3389124607,SG 3389124608,3389128703,PG 3389128704,3389129727,AU 3389129728,3389132799,NZ @@ -59685,16 +95871,24 @@ 3389151232,3389152255,JP 3389152256,3389153279,ID 3389153280,3389161471,TV -3389161472,3389165286,JP +3389161472,3389163791,JP +3389163792,3389163795,AU +3389163796,3389165286,JP 3389165287,3389165287,SG 3389165288,3389165631,JP 3389165632,3389165695,CN 3389165696,3389194239,JP 3389194240,3389195775,AU 3389195776,3389196287,HK -3389196288,3389198335,AU +3389196288,3389197567,AU +3389197568,3389197823,IN +3389198080,3389198335,IN 3389198336,3389202431,NZ -3389202432,3389211647,AU +3389202432,3389210623,AU +3389210624,3389210879,IN +3389210880,3389211135,AU +3389211136,3389211391,IN +3389211392,3389211647,AU 3389211648,3389212671,TH 3389212672,3389213439,AU 3389213440,3389214207,IN @@ -59724,7 +95918,32 @@ 3389276160,3389284351,AU 3389284352,3389292543,BD 3389292544,3389300735,CN -3389300736,3389308927,AU +3389300736,3389301247,ID +3389301248,3389301759,AU +3389301760,3389302015,IN +3389302016,3389302527,AU +3389302528,3389302783,PK +3389302784,3389303039,VN +3389303040,3389303295,TW +3389303296,3389303807,ID +3389303808,3389304063,IN +3389304064,3389304319,BD +3389304320,3389304575,PH +3389304576,3389304831,AU +3389304832,3389305087,VN +3389305088,3389305599,IN +3389305600,3389305855,ID +3389305856,3389306111,IN +3389306112,3389306367,AU +3389306368,3389306623,IN +3389306624,3389306879,AU +3389306880,3389307135,FJ +3389307136,3389307647,ID +3389307648,3389307903,HK +3389307904,3389308159,AU +3389308160,3389308415,KH +3389308416,3389308671,AU +3389308672,3389308927,PH 3389308928,3389317119,HK 3389317120,3389322239,AU 3389322240,3389324031,JP @@ -59753,9 +95972,10 @@ 3389412352,3389412863,NZ 3389412864,3389413119,AU 3389413120,3389413375,NZ -3389413376,3389413887,AU +3389413376,3389413887,AP 3389413888,3389414143,TH -3389414144,3389414911,AU +3389414144,3389414655,AU +3389414656,3389414911,NZ 3389414912,3389415167,HK 3389415168,3389415423,KR 3389415424,3389415935,VN @@ -59803,13 +96023,14 @@ 3389526016,3389528319,AU 3389528320,3389528575,TH 3389528576,3389529087,JP -3389529088,3389532159,AU +3389529088,3389529599,ID +3389529600,3389529855,PH +3389529856,3389530111,AP +3389530112,3389532159,AU 3389532160,3389533183,SG 3389533184,3389534207,NZ 3389534208,3389538303,JP -3389538304,3389538559,AU -3389538560,3389540351,TH -3389540352,3389541631,AU +3389538304,3389541375,TH 3389541632,3389541887,JP 3389541888,3389542399,TH 3389542400,3389543423,JP @@ -59822,10 +96043,31 @@ 3389554688,3389562879,CN 3389562880,3389571071,TW 3389571072,3389575167,LK -3389575168,3389579233,JP -3389579234,3389579263,AU +3389575168,3389579263,JP 3389579264,3389587455,PH -3389587456,3389612031,AU +3389587456,3389604351,AU +3389604352,3389604863,SG +3389604864,3389605119,HK +3389605120,3389605375,ID +3389605376,3389605887,AU +3389605888,3389606399,ID +3389606400,3389606655,AU +3389606656,3389606911,IN +3389606912,3389607423,LA +3389607424,3389607679,AU +3389607680,3389608191,VN +3389608192,3389608447,TH +3389608448,3389608703,AP +3389608704,3389608959,AU +3389608960,3389609215,VN +3389609216,3389609471,ID +3389609472,3389609727,SG +3389609728,3389609983,AU +3389609984,3389610239,NZ +3389610240,3389610495,IN +3389610496,3389610751,HK +3389610752,3389611519,IN +3389611520,3389612031,AU 3389612032,3389616127,MY 3389616128,3389640703,IN 3389640704,3389644799,JP @@ -59849,13 +96091,11 @@ 3389789696,3389790719,AU 3389790720,3389790975,BN 3389790976,3389791231,JP -3389791232,3389791743,AU -3389791744,3389791999,JP +3389791232,3389791999,AP 3389792000,3389801983,AU 3389801984,3389802239,NZ 3389802240,3389802751,AU 3389802752,3389803263,TH -3389803264,3389803519,AU 3389803520,3389806079,NZ 3389806080,3389807359,AU 3389807360,3389807615,NZ @@ -59865,7 +96105,7 @@ 3389808896,3389809151,TH 3389809152,3389809919,AU 3389809920,3389810175,IN -3389810176,3389810687,AU +3389810176,3389810431,AU 3389810688,3389811199,NZ 3389811200,3389811711,AU 3389811712,3389811967,NZ @@ -59894,7 +96134,8 @@ 3389936128,3389936895,NZ 3389936896,3389937663,PH 3389937664,3389937919,CN -3389937920,3389939711,AU +3389937920,3389938175,AU +3389939456,3389939711,AU 3389939712,3389940223,NZ 3389940224,3389940479,AU 3389940480,3389940991,NZ @@ -59915,7 +96156,7 @@ 3389950976,3389951743,NZ 3389951744,3389953279,AU 3389953280,3389953535,NZ -3389953536,3389954303,AU +3389953792,3389954303,AU 3389954304,3389954815,SG 3389954816,3389956607,AU 3389956608,3389957375,TH @@ -59926,8 +96167,8 @@ 3389970432,3389971199,NZ 3389971200,3389971967,AU 3389971968,3389972223,HK -3389972224,3389972735,AU -3389972736,3389973759,NZ +3389972224,3389972479,AU +3389972480,3389973759,NZ 3389973760,3389975295,AU 3389975296,3389976319,CN 3389976320,3389979647,AU @@ -59948,13 +96189,14 @@ 3390331648,3390332415,NZ 3390332416,3390332927,HK 3390332928,3390333439,NZ -3390333440,3390333695,AU +3390333440,3390333695,AP 3390333696,3390333951,KR 3390333952,3390334463,HK 3390334464,3390335231,NZ 3390335232,3390335487,TH 3390335488,3390336511,ID -3390336512,3390337023,AU +3390336512,3390336767,JP +3390336768,3390337023,AP 3390337024,3390337279,GU 3390337280,3390337535,NZ 3390337536,3390338303,SG @@ -60015,72 +96257,25 @@ 3390771200,3390775295,SG 3390775296,3390790399,NZ 3390790400,3390790655,AU -3390790656,3390796287,NZ -3390796288,3390796543,AU -3390796544,3390800383,NZ -3390800384,3390800895,AU -3390800896,3390801151,NZ -3390801152,3390801407,AU -3390801408,3390802943,NZ -3390802944,3390803967,AU -3390803968,3390815231,NZ -3390815232,3390815359,AU -3390815360,3390819583,NZ -3390819584,3390820351,AU -3390820352,3390832639,NZ +3390790656,3390832639,NZ 3390832640,3390963711,TH 3390963712,3391094783,KR 3391094784,3391356927,JP -3391356928,3391364095,NZ -3391364096,3391364351,AU -3391364352,3391375871,NZ -3391375872,3391376127,AU -3391376128,3391379199,NZ -3391379200,3391379455,AU -3391379456,3391386623,NZ -3391386624,3391387135,AU -3391387136,3391414783,NZ -3391414784,3391415039,AU -3391415040,3391432703,NZ -3391432704,3391433215,AU -3391433216,3391434239,NZ -3391434240,3391434751,AU -3391434752,3391440255,NZ -3391440256,3391440383,AU -3391440384,3391440639,NZ -3391440640,3391440895,AU -3391440896,3391441407,NZ -3391441408,3391441663,AU -3391441664,3391444479,NZ -3391444480,3391444991,AU -3391444992,3391456511,NZ -3391456512,3391456767,AU -3391456768,3391461375,NZ -3391461376,3391461631,AU -3391461632,3391464959,NZ -3391464960,3391465215,AU -3391465216,3391469055,NZ +3391356928,3391469055,NZ 3391469056,3391469311,AU -3391469312,3391473407,NZ -3391473408,3391473663,AU -3391473664,3391482623,NZ -3391482624,3391482879,AU -3391482880,3391487999,NZ +3391469312,3391487999,NZ 3391488000,3391492095,CN 3391492096,3391496191,HK 3391496192,3391500287,SG 3391500288,3391504383,PK -3391504384,3391523583,CN -3391523584,3391523839,AU -3391523840,3391524863,CN -3391524864,3391525375,AU +3391504384,3391524863,CN 3391525376,3391525887,CN 3391525888,3391526143,AU 3391526144,3391526655,CN 3391526656,3391526911,SG 3391526912,3391528191,CN -3391528192,3391528959,AU -3391528960,3391529471,CN +3391528192,3391528447,AU +3391528448,3391529471,CN 3391529472,3391529983,AU 3391529984,3391533567,CN 3391533568,3391534079,HK @@ -60129,10 +96324,32 @@ 3391819776,3391823871,JP 3391823872,3391827967,TH 3391827968,3391832063,KR -3391832064,3391852543,AU +3391832064,3391832575,ID +3391832576,3391832831,AU +3391832832,3391833087,IN +3391833088,3391834111,JP +3391834112,3391835135,ID +3391835136,3391836159,CN +3391836160,3391836671,AU +3391836672,3391837183,HK +3391837184,3391838207,AU +3391838208,3391838719,ID +3391838720,3391838975,IN +3391838976,3391839231,AU +3391839232,3391840255,ID +3391840256,3391841279,JP +3391841280,3391842303,MY +3391842304,3391843327,JP +3391843328,3391844351,VN +3391844352,3391845887,ID +3391845888,3391846399,PK +3391847424,3391848447,PK +3391848448,3391852543,AU 3391852544,3391856639,CN 3391856640,3391864831,ID -3391864832,3391873023,US +3391864832,3391868927,US +3391868928,3391870975,SG +3391870976,3391873023,US 3391873024,3391877119,AU 3391877120,3391879167,JP 3391879168,3391881215,ID @@ -60149,11 +96366,7 @@ 3391909888,3391910911,IO 3391910912,3391911935,AU 3391911936,3391913983,HK -3391913984,3391915519,TH -3391915520,3391915775,AU -3391915776,3391916287,TH -3391916288,3391916543,IN -3391916544,3391920127,TH +3391913984,3391920127,TH 3391920128,3391930367,AU 3391930368,3391946751,TH 3391946752,3391947007,DE @@ -60171,8 +96384,16 @@ 3391979776,3391980031,JP 3391980032,3391980543,HK 3391980544,3391983615,MY -3391983616,3391987711,AU -3391987712,3391991807,JP +3391983616,3391984639,NP +3391984640,3391984895,HK +3391984896,3391985151,ID +3391985152,3391986687,AU +3391986688,3391987199,PK +3391987200,3391987455,AU +3391987456,3391987711,BD +3391987712,3391988607,JP +3391988608,3391988735,SG +3391988736,3391991807,JP 3391991808,3392012287,HK 3392012288,3392017151,ID 3392017152,3392017407,IN @@ -60193,8 +96414,16 @@ 3392079872,3392081919,TH 3392081920,3392086015,JP 3392086016,3392094207,AU -3392094208,3392098303,ID -3392098304,3392102399,AU +3392094208,3392098559,ID +3392098560,3392098815,AU +3392098816,3392099327,PH +3392099328,3392100095,AU +3392100096,3392100351,VN +3392100352,3392100607,ID +3392100608,3392100863,SG +3392100864,3392101887,ID +3392101888,3392102143,PK +3392102144,3392102399,AU 3392102400,3392106495,KH 3392106496,3392109567,AU 3392109568,3392109823,IN @@ -60212,38 +96441,11 @@ 3392126976,3392135167,ID 3392135168,3392143359,TH 3392143360,3392208895,JP -3392208896,3392229375,NZ -3392229376,3392229887,AU -3392229888,3392230335,NZ -3392230336,3392230399,AU -3392230400,3392233471,NZ -3392233472,3392235519,AU -3392235520,3392238079,NZ -3392238080,3392238335,AU -3392238336,3392272383,NZ -3392272384,3392272639,AU -3392272640,3392286719,NZ -3392286720,3392286975,AU +3392208896,3392286975,NZ 3392286976,3392287231,US -3392287232,3392287743,NZ -3392287744,3392288767,AU -3392288768,3392293887,NZ -3392293888,3392294399,AU -3392294400,3392295935,NZ +3392287232,3392295935,NZ 3392295936,3392296191,AU -3392296192,3392307199,NZ -3392307200,3392307455,AU -3392307456,3392307711,NZ -3392307712,3392309503,AU -3392309504,3392324607,NZ -3392324608,3392325119,AU -3392325120,3392325631,NZ -3392325632,3392326655,AU -3392326656,3392336159,NZ -3392336160,3392336639,AU -3392336640,3392339727,NZ -3392339728,3392339743,AU -3392339744,3392339967,NZ +3392296192,3392339967,NZ 3392339968,3392340991,NP 3392340992,3392344063,JP 3392344064,3392348159,ID @@ -60251,7 +96453,7 @@ 3392354304,3392356351,ID 3392356352,3392364543,NP 3392364544,3392372735,ID -3392372736,3392385023,AU +3392380928,3392385023,AU 3392385024,3392389119,BD 3392389120,3392401407,ID 3392401408,3392403455,SG @@ -60262,13 +96464,61 @@ 3392406528,3392407551,TH 3392407552,3392409599,ID 3392409600,3392413695,JP -3392413696,3392421887,AU +3392413696,3392413951,PK +3392413952,3392414207,HK +3392414208,3392414463,PH +3392414464,3392414719,HK +3392414720,3392415231,AU +3392415232,3392415487,JP +3392415488,3392415743,VN +3392415744,3392415999,IN +3392416000,3392416255,AU +3392416256,3392416767,HK +3392416768,3392417023,IN +3392417024,3392417535,AU +3392417536,3392417791,HK +3392417792,3392418559,ID +3392418560,3392418815,SG +3392418816,3392419071,ID +3392419072,3392419327,IN +3392419328,3392419839,PH +3392419840,3392420351,IN +3392420352,3392420863,ID +3392420864,3392421119,AU +3392421120,3392421375,MY +3392421376,3392421887,IN 3392421888,3392430271,SG 3392430272,3392430303,TW 3392430304,3392432511,SG 3392432512,3392432543,TW 3392432544,3392438271,SG -3392438272,3392446463,AU +3392438272,3392438527,IN +3392438528,3392438783,AU +3392438784,3392439039,IN +3392439040,3392439551,ID +3392439552,3392439807,PG +3392439808,3392440063,IN +3392440064,3392440319,AU +3392440320,3392440575,HK +3392440576,3392440831,ID +3392440832,3392441343,BD +3392441344,3392441855,ID +3392441856,3392442111,AU +3392442112,3392442367,IN +3392442368,3392442623,HK +3392442624,3392442879,AU +3392442880,3392443391,ID +3392443392,3392443647,IN +3392443648,3392443903,MY +3392443904,3392444159,IN +3392444160,3392444415,JP +3392444416,3392444671,NZ +3392444672,3392444927,IN +3392444928,3392445183,JP +3392445184,3392445439,NZ +3392445440,3392445695,ID +3392445696,3392445951,IN +3392445952,3392446463,AU 3392446464,3392450559,PH 3392450560,3392454655,JP 3392454656,3392462847,HK @@ -60290,7 +96540,11 @@ 3392618496,3392626687,SG 3392626688,3392630783,NZ 3392630784,3392634879,JP -3392634880,3392643071,AU +3392634880,3392635903,PK +3392635904,3392636927,VN +3392636928,3392637951,JP +3392637952,3392638975,TH +3392638976,3392643071,AU 3392643072,3392647167,ID 3392647168,3392651263,MN 3392651264,3392659455,JP @@ -60308,7 +96562,10 @@ 3392670848,3392671743,HK 3392671744,3392675839,JP 3392675840,3392681983,NZ -3392681984,3392684031,AU +3392681984,3392682239,AP +3392682240,3392682495,VN +3392682496,3392683007,IN +3392683008,3392684031,AU 3392684032,3392688127,JP 3392688128,3392692223,MY 3392692224,3392700415,IN @@ -60321,7 +96578,6 @@ 3392765952,3392782335,TH 3392782336,3392790527,HK 3392790528,3392794623,JP -3392794624,3392798719,HK 3392798720,3392798975,LA 3392798976,3392799231,JP 3392799232,3392799487,PH @@ -60334,7 +96590,17 @@ 3392806912,3392815103,AU 3392815104,3392819199,ID 3392819200,3392823295,MY -3392823296,3392831487,AU +3392823296,3392824319,KH +3392824320,3392824831,AU +3392824832,3392825343,IN +3392825344,3392826367,JP +3392826368,3392827391,PH +3392828416,3392829439,JP +3392829440,3392830463,IN +3392830464,3392830719,ID +3392830720,3392830975,IN +3392830976,3392831231,TH +3392831232,3392831487,IN 3392831488,3392832511,PG 3392832512,3392833535,IN 3392833536,3392835583,AU @@ -60347,7 +96613,7 @@ 3392864512,3392864767,AU 3392864768,3392865279,IN 3392865280,3392866303,NU -3392866304,3392880639,AU +3392868352,3392880639,AU 3392880640,3392888831,PK 3392888832,3392892927,AU 3392892928,3392897023,JP @@ -60358,14 +96624,20 @@ 3392909312,3392913407,JP 3392913408,3392917503,ID 3392917504,3392921599,BD -3392921600,3392929791,AU +3392921600,3392921855,NZ +3392921856,3392922623,AU +3392922624,3392922879,IN +3392922880,3392923135,AU +3392923136,3392923391,BN +3392923392,3392923647,AP +3392923648,3392924159,CN 3392929792,3392931839,MU 3392931840,3392933887,PH 3392933888,3392942079,JP 3392942080,3392944127,AU 3392944128,3392945151,MY 3392945152,3392946175,IN -3392946176,3392956415,AU +3392946176,3392954367,AU 3392956416,3392958463,VN 3392958464,3392962559,CN 3392962560,3392970751,IN @@ -60382,24 +96654,26 @@ 3392999424,3393003519,JP 3393003520,3393011711,PK 3393011712,3393019903,PH -3393019904,3393060863,AU +3393028096,3393060863,AU 3393060864,3393062911,FJ 3393062912,3393069055,ID 3393069056,3393077247,AU 3393077248,3393085439,IN 3393085440,3393089535,LA -3393089536,3393090559,AU 3393090560,3393091071,IN 3393091072,3393093631,FJ 3393093632,3393101823,AU 3393101824,3393110015,JP 3393110016,3393118207,HK 3393118208,3393122303,IN -3393122304,3393124351,ID -3393124352,3393125375,AU +3393122304,3393123327,AU +3393123328,3393123583,IN +3393123584,3393123839,NZ +3393123840,3393124351,IN 3393125376,3393125631,IN 3393125632,3393125887,JP -3393125888,3393126399,AU +3393125888,3393126143,AU +3393126144,3393126399,FJ 3393126400,3393134591,HK 3393134592,3393146879,AU 3393146880,3393150975,PK @@ -60464,9 +96738,16 @@ 3393593344,3393597439,MN 3393597440,3393601535,ID 3393601536,3393609727,NP -3393609728,3393613823,PH 3393613824,3393617919,AS -3393617920,3393622015,AU +3393617920,3393618431,AU +3393618432,3393618687,NZ +3393618688,3393618943,IN +3393618944,3393620223,ID +3393620224,3393620479,AU +3393620480,3393620735,ID +3393620736,3393620991,AU +3393620992,3393621247,JP +3393621248,3393622015,AU 3393622016,3393626111,PK 3393626112,3393626367,HK 3393626368,3393630207,CN @@ -60522,7 +96803,6 @@ 3393814528,3393815551,HK 3393815552,3393816575,KR 3393816576,3393818623,JP -3393818624,3393822719,AU 3393822720,3393830911,PH 3393830912,3393835007,NZ 3393835008,3393839103,JP @@ -60531,7 +96811,7 @@ 3393848320,3393849343,JP 3393849344,3393851391,CN 3393851392,3393855487,JP -3393855488,3393865727,AU +3393863680,3393865727,AU 3393865728,3393867775,ID 3393867776,3393880063,HK 3393880064,3393896447,AU @@ -60610,18 +96890,13 @@ 3394273280,3394277375,HK 3394277376,3394279423,AU 3394279424,3394281471,PH -3394281472,3394282239,BD -3394282240,3394282751,SG -3394282752,3394283007,BD -3394283008,3394283023,NP -3394283024,3394283775,SG +3394281472,3394283775,SG 3394283776,3394284031,BD 3394284032,3394284287,SG 3394284288,3394284351,SO 3394284352,3394285567,SG 3394285568,3394289663,AU 3394289664,3394290687,HK -3394290688,3394293759,AU 3394293760,3394297855,ID 3394297856,3394306047,TH 3394306048,3394307071,HK @@ -60636,9 +96911,7 @@ 3394347008,3394355199,PH 3394355200,3394359295,IN 3394359296,3394363391,AU -3394363392,3394437119,HK -3394437120,3394438143,AU -3394438144,3394441215,HK +3394363392,3394441215,HK 3394441216,3394453503,IN 3394453504,3394461695,AU 3394461696,3394465791,SG @@ -60655,16 +96928,20 @@ 3394501632,3394507263,HK 3394507264,3394507775,JP 3394507776,3394508799,PH -3394508800,3394510847,AU 3394510848,3394514943,BD 3394514944,3394519039,JP 3394519040,3394521087,BD 3394521088,3394523135,KH 3394523136,3394527231,JP 3394527232,3394535423,PH -3394535424,3394565631,HK +3394535424,3394559487,HK +3394559488,3394559999,A2 +3394560000,3394564095,HK +3394564096,3394564607,A2 +3394564608,3394565631,HK 3394565632,3394565887,PK -3394565888,3394621439,HK +3394565888,3394566143,A2 +3394566144,3394621439,HK 3394621440,3394625535,CN 3394625536,3394629631,HK 3394629632,3394631679,AU @@ -60688,7 +96965,6 @@ 3394697472,3394697727,PK 3394697728,3394697983,AU 3394697984,3394698239,IN -3394698240,3394699263,AU 3394699264,3394700287,HK 3394700288,3394707455,AU 3394707456,3394715647,IN @@ -60725,12 +97001,19 @@ 3394835712,3394835967,CN 3394835968,3394836239,JP 3394836240,3394836247,AS -3394836248,3394836479,JP +3394836248,3394836415,JP +3394836416,3394836479,HK 3394836480,3394838527,BT 3394838528,3394846719,NZ 3394846720,3394850815,IN 3394850816,3394854911,JP -3394854912,3394863103,AU +3394855936,3394856959,AP +3394856960,3394859007,IN +3394859008,3394860031,JP +3394860032,3394860543,ID +3394860544,3394861055,IN +3394861056,3394862079,HK +3394862080,3394863103,KR 3394863104,3394871295,NZ 3394871296,3394879487,AU 3394879488,3394883583,PH @@ -60742,7 +97025,11 @@ 3394896896,3394897919,TH 3394897920,3394899967,JP 3394899968,3394904063,SG -3394904064,3394910207,AU +3394904576,3394905087,AU +3394905088,3394905343,BN +3394905344,3394906111,AU +3394906112,3394906367,IN +3394908160,3394910207,AU 3394910208,3394912255,PH 3394912256,3394920447,PF 3394920448,3394924543,IN @@ -60750,20 +97037,29 @@ 3394928640,3394936831,PH 3394936832,3394940927,AU 3394940928,3394945023,JP -3394945024,3394949119,AU +3394945024,3394945279,IN +3394945280,3394945535,AU +3394945536,3394946047,ID +3394946048,3394946559,AU +3394946560,3394947071,ID +3394947072,3394948095,BD +3394948096,3394948351,IN +3394948352,3394948607,PH +3394948608,3394949119,AU 3394949120,3394953215,JP 3394953216,3394957311,CN -3394957312,3394959359,AU +3394957312,3394959359,AP 3394959360,3394960383,HK 3394960384,3394962431,CN 3394962432,3394963455,AU 3394963456,3394965503,ID 3394965504,3394967551,TH 3394967552,3394969599,ID -3394969600,3394973695,SG +3394969600,3394971391,SG +3394971392,3394971647,AU +3394971648,3394973695,SG 3394973696,3394977791,JP 3394977792,3394985983,IN -3394985984,3394990079,AU 3394990080,3394994175,JP 3394994176,3394995199,CN 3394995200,3394998271,IN @@ -60806,9 +97102,8 @@ 3395149824,3395155967,ID 3395155968,3395156991,AU 3395156992,3395158015,CN -3395158016,3395170303,AU +3395166208,3395170303,AU 3395170304,3395174399,JP -3395174400,3395182591,AU 3395182592,3395190783,SG 3395190784,3395198975,JP 3395198976,3395203071,MY @@ -60852,7 +97147,7 @@ 3397029888,3397033983,MY 3397033984,3397038079,ID 3397038080,3397058559,JP -3397058560,3397066751,AU +3397058560,3397066751,MU 3397066752,3397070847,IN 3397070848,3397074943,PH 3397074944,3397083135,HK @@ -60866,7 +97161,6 @@ 3397115904,3397119999,ID 3397120000,3397124095,PK 3397124096,3397128191,JP -3397128192,3397130239,AU 3397130240,3397131263,CN 3397131264,3397132287,HK 3397132288,3397136383,AU @@ -60875,13 +97169,42 @@ 3397148672,3397156863,NZ 3397156864,3397165055,PH 3397165056,3397173247,LK -3397173248,3397177343,AU +3397173248,3397173503,AU +3397173504,3397173759,PH +3397173760,3397174015,IN +3397174016,3397174271,AU +3397174272,3397175295,ID +3397175296,3397175807,AU +3397175808,3397176063,IN +3397176064,3397176319,ID +3397176320,3397176575,VN +3397176576,3397176831,ID +3397176832,3397177343,AU 3397177344,3397181439,JP 3397181440,3397185535,PW -3397185536,3397201919,AU +3397185536,3397187583,AU +3397187584,3397189631,AP +3397189632,3397201919,AU 3397201920,3397206015,JP 3397206016,3397210111,BD -3397210112,3397218303,AU +3397210112,3397211135,ID +3397211136,3397211647,TH +3397211648,3397212159,AU +3397212160,3397212671,ID +3397212672,3397213183,HK +3397213184,3397213439,IN +3397213440,3397213695,AU +3397213696,3397214207,ID +3397214208,3397214719,AP +3397214720,3397215231,AU +3397215232,3397215743,ID +3397215744,3397216255,PH +3397216256,3397216767,AU +3397216768,3397217023,IN +3397217024,3397217279,SG +3397217280,3397217791,AU +3397217792,3397218047,NZ +3397218048,3397218303,AU 3397218304,3397230591,PK 3397230592,3397234687,AU 3397234688,3397238783,CN @@ -60926,13 +97249,21 @@ 3397349376,3397363711,CN 3397363712,3397365759,HK 3397365760,3397369855,JP -3397369856,3397374463,CN -3397374464,3397374975,AU -3397374976,3397386239,CN +3397369856,3397386239,CN 3397386240,3397394431,GU 3397394432,3397402623,PH 3397402624,3397410815,GU -3397410816,3397419007,AU +3397410816,3397411327,AU +3397411328,3397411583,SG +3397411584,3397411839,HK +3397411840,3397412351,KR +3397412352,3397412863,AU +3397412864,3397413375,HK +3397413376,3397413631,AU +3397413632,3397413887,IN +3397413888,3397414399,NZ +3397414400,3397414911,IN +3397414912,3397419007,AU 3397419008,3397419535,HK 3397419536,3397419551,KR 3397419552,3397419871,HK @@ -60945,9 +97276,41 @@ 3397492736,3397496831,MY 3397496832,3397498879,JP 3397498880,3397500927,ID -3397500928,3397517311,AU +3397500928,3397501951,BD +3397501952,3397503999,IN +3397504000,3397505023,TH +3397505024,3397505279,NZ +3397505280,3397506559,IN +3397506560,3397506815,AU +3397506816,3397507071,IN +3397507072,3397507583,ID +3397507584,3397507839,AU +3397507840,3397508095,IN +3397508096,3397509119,PH +3397509120,3397510143,ID +3397510144,3397511167,FJ +3397511168,3397512191,LK +3397512192,3397512447,KH +3397512448,3397512703,AU +3397512704,3397512959,PH +3397512960,3397513727,IN +3397513728,3397514239,SG +3397514240,3397515263,AU +3397515264,3397516287,NP +3397516288,3397516543,AU +3397516544,3397516799,NZ +3397516800,3397517055,JP +3397517056,3397517311,AU 3397517312,3397525503,CN -3397525504,3397533695,AU +3397525504,3397526527,AU +3397526528,3397527039,VN +3397527040,3397527295,AU +3397527296,3397527551,JP +3397527552,3397528575,IN +3397528576,3397530623,AU +3397530624,3397531647,ID +3397531648,3397532671,SG +3397532672,3397533695,JP 3397533696,3397555903,HK 3397555904,3397555935,JP 3397555936,3397566263,HK @@ -61013,7 +97376,13 @@ 3397781504,3397783551,BD 3397783552,3397785599,VN 3397785600,3397787647,TO -3397787648,3397793791,AU +3397787648,3397791743,AU +3397791744,3397791999,NZ +3397792000,3397792767,AU +3397792768,3397793023,IN +3397793024,3397793279,NZ +3397793280,3397793535,VN +3397793536,3397793791,HK 3397793792,3397794303,PH 3397794304,3397794559,AU 3397794560,3397794815,IN @@ -61044,7 +97413,6 @@ 3397963776,3397971967,CN 3397971968,3397974015,LA 3397974016,3397975039,IN -3397975040,3397976063,AU 3397976064,3397984255,ID 3397984256,3397992447,JP 3397992448,3398004735,AU @@ -61055,7 +97423,10 @@ 3398023168,3398025215,JP 3398025216,3398029311,AU 3398029312,3398033407,IN -3398033408,3398035455,AU +3398033408,3398033663,NZ +3398033664,3398033919,ID +3398033920,3398034943,IN +3398034944,3398035199,ID 3398035456,3398037503,IN 3398037504,3398039551,NZ 3398039552,3398040575,IN @@ -61108,14 +97479,13 @@ 3398481920,3398483967,LA 3398483968,3398488063,MY 3398488064,3398492159,TW -3398492160,3398500351,AU 3398500352,3398504447,ID 3398504448,3398508543,JP 3398508544,3398565887,TW 3398565888,3398567423,ID 3398567424,3398569983,AU 3398569984,3398572031,JP -3398572032,3398574079,AU +3398572032,3398574079,AP 3398574080,3398582271,ID 3398582272,3398590463,MY 3398590464,3398598655,HK @@ -61124,135 +97494,147 @@ 3398610944,3398612991,ID 3398612992,3398613503,PH 3398613504,3398613759,NZ -3398613760,3398615039,AU +3398613760,3398614015,AU 3398615040,3398619135,IN 3398619136,3398621183,AU 3398621184,3398623231,HK 3398623232,3398631423,ID -3398631424,3398631983,AU -3398631984,3398632143,JP -3398632144,3398632175,AU -3398632176,3398632191,JP -3398632192,3398632255,AU -3398632256,3398632343,JP -3398632344,3398632351,AU -3398632352,3398632375,JP -3398632376,3398632391,AU -3398632392,3398632399,JP -3398632400,3398632415,AU -3398632416,3398632687,JP -3398632688,3398632703,AU -3398632704,3398632831,JP -3398632832,3398633983,AU +3398631424,3398631935,AP +3398631936,3398632015,JP +3398632016,3398632023,AP +3398632024,3398632143,JP +3398632144,3398632175,AP +3398632176,3398632383,JP +3398632384,3398632391,AP +3398632392,3398632623,JP +3398632624,3398632639,AP +3398632640,3398632959,JP +3398632960,3398633983,AP 3398633984,3398634111,KR -3398634112,3398634303,AU -3398634304,3398634343,KR -3398634344,3398634367,AU -3398634368,3398634479,KR -3398634480,3398634495,AU +3398634112,3398634303,AP +3398634304,3398634335,KR +3398634336,3398634343,AP +3398634344,3398634479,KR +3398634480,3398634495,AP 3398634496,3398634591,KR -3398634592,3398634607,AU +3398634592,3398634607,AP 3398634608,3398634623,KR -3398634624,3398634751,AU +3398634624,3398634751,AP 3398634752,3398634783,KR -3398634784,3398635263,AU +3398634784,3398635263,AP 3398635264,3398635391,KR -3398635392,3398636039,AU -3398636040,3398636047,HK -3398636048,3398636351,AU +3398635392,3398636039,AP +3398636040,3398636127,HK +3398636128,3398636351,AP 3398636352,3398636383,HK -3398636384,3398636447,AU +3398636384,3398636447,AP 3398636448,3398636527,HK -3398636528,3398636543,AU +3398636528,3398636543,AP 3398636544,3398636583,HK -3398636584,3398636591,AU +3398636584,3398636591,AP 3398636592,3398636735,HK -3398636736,3398636767,AU +3398636736,3398636767,AP 3398636768,3398636775,HK -3398636776,3398636783,AU +3398636776,3398636783,AP 3398636784,3398636799,HK -3398636800,3398637183,AU +3398636800,3398637183,AP 3398637184,3398637215,HK -3398637216,3398637247,AU +3398637216,3398637247,AP 3398637248,3398637311,HK 3398637312,3398637375,JP -3398637376,3398637535,HK -3398637536,3398637551,AU +3398637376,3398637519,HK +3398637520,3398637551,AP 3398637552,3398637567,HK -3398637568,3398638095,AU +3398637568,3398638095,AP 3398638096,3398638111,PH -3398638112,3398638159,AU +3398638112,3398638159,AP 3398638160,3398638167,PH 3398638168,3398638191,TW 3398638192,3398638207,PH -3398638208,3398638367,AU +3398638208,3398638367,AP 3398638368,3398638383,TW -3398638384,3398638399,AU +3398638384,3398638399,AP 3398638400,3398638431,TW 3398638432,3398638447,PH -3398638448,3398638479,AU +3398638448,3398638479,AP 3398638480,3398638495,TW -3398638496,3398638527,AU -3398638528,3398638575,PH -3398638576,3398638719,AU +3398638496,3398638719,AP 3398638720,3398638847,PH -3398638848,3398638879,AU +3398638848,3398638879,AP 3398638880,3398638911,PH -3398638912,3398638943,AU -3398638944,3398638951,TW -3398638952,3398639007,AU +3398638912,3398639007,AP 3398639008,3398639231,PH -3398639232,3398639247,AU +3398639232,3398639247,AP 3398639248,3398639263,PH 3398639264,3398639271,TW -3398639272,3398639423,AU +3398639272,3398639423,AP 3398639424,3398639455,PH -3398639456,3398640127,AU +3398639456,3398640127,AP 3398640128,3398640159,SG -3398640160,3398640191,AU +3398640160,3398640191,AP 3398640192,3398640207,MY -3398640208,3398640639,AU +3398640208,3398640639,AP 3398640640,3398640695,SG -3398640696,3398640783,AU +3398640696,3398640783,AP 3398640784,3398640799,SG -3398640800,3398640895,AU +3398640800,3398640895,AP 3398640896,3398640911,MY 3398640912,3398640959,SG -3398640960,3398641007,AU +3398640960,3398641007,AP 3398641008,3398641039,SG -3398641040,3398641055,AU +3398641040,3398641055,AP 3398641056,3398641087,SG -3398641088,3398641095,AU +3398641088,3398641095,AP 3398641096,3398641103,SG -3398641104,3398641119,AU +3398641104,3398641119,AP 3398641120,3398641311,SG -3398641312,3398641423,AU +3398641312,3398641423,AP 3398641424,3398641431,SG 3398641432,3398641447,MY -3398641448,3398641455,AU +3398641448,3398641455,AP 3398641456,3398641503,SG -3398641504,3398641535,AU +3398641504,3398641535,AP 3398641536,3398641543,SG -3398641544,3398641567,AU +3398641544,3398641567,AP 3398641568,3398641631,MY -3398641632,3398642511,AU +3398641632,3398642463,AP +3398642464,3398642511,AU 3398642512,3398642527,NZ -3398642528,3398643223,AU +3398642528,3398642559,AU +3398642560,3398642623,AP +3398642624,3398642639,AU +3398642640,3398642655,AP +3398642656,3398642815,AU +3398642816,3398642975,AP +3398642976,3398643007,AU +3398643008,3398643023,AP +3398643024,3398643039,AU +3398643040,3398643047,AP +3398643048,3398643071,AU +3398643072,3398643199,AP +3398643200,3398643223,AU 3398643224,3398643247,NZ -3398643248,3398643375,AU +3398643248,3398643263,AU +3398643264,3398643343,AP +3398643344,3398643359,AU +3398643360,3398643375,AP 3398643376,3398643383,NZ -3398643384,3398643711,AU +3398643384,3398643519,AP +3398643520,3398643583,AU +3398643584,3398643711,AP 3398643712,3398643967,SG -3398643968,3398647295,AU +3398643968,3398645759,AP +3398645760,3398646271,AU +3398646272,3398647295,AP 3398647296,3398647551,TW -3398647552,3398672383,AU +3398647552,3398647807,AP +3398647808,3398668287,AU 3398672384,3398680575,PK 3398680576,3398684671,ID 3398684672,3398688767,JP 3398688768,3398705151,ID -3398705152,3398711295,AU +3398709248,3398711295,AU 3398711296,3398713343,BD -3398713344,3398721535,AU 3398721536,3398729727,CN 3398729728,3398737919,AU 3398737920,3398742015,SG @@ -61269,7 +97651,10 @@ 3398803456,3398811647,CN 3398811648,3398819839,IN 3398819840,3398828031,CN -3398828032,3398832127,AU +3398828032,3398829055,KH +3398829056,3398830079,IN +3398830080,3398831103,KH +3398831104,3398832127,AP 3398832128,3398836223,CN 3398836224,3398840319,ID 3398840320,3398842367,JP @@ -61279,7 +97664,6 @@ 3398852608,3398860799,NZ 3398860800,3398873087,ID 3398873088,3398877183,KR -3398877184,3398881279,AU 3398881280,3398885375,SG 3398885376,3398894591,ID 3398894592,3398895615,TH @@ -61371,18 +97755,24 @@ 3399311360,3399319551,JP 3399319552,3399331839,SG 3399331840,3399332351,MY -3399332352,3399332863,SG +3399332352,3399332863,AU 3399332864,3399333375,HK 3399333376,3399335423,MY 3399335424,3399335935,IN -3399335936,3399344127,AU 3399344128,3399352319,JP 3399352320,3399389183,ID 3399389184,3399393279,KR 3399393280,3399401471,CN 3399401472,3399409663,AU 3399409664,3399413759,JP -3399413760,3399417855,AU +3399413760,3399414015,NL +3399414016,3399414271,AU +3399414272,3399414527,JP +3399414528,3399414783,AU +3399414784,3399415807,VN +3399415808,3399416831,SG +3399416832,3399417087,ID +3399417088,3399417855,AU 3399417856,3399450623,ID 3399450624,3399467007,TW 3399467008,3399483391,IN @@ -61401,8 +97791,12 @@ 3399544832,3399546879,SG 3399546880,3399547135,US 3399547136,3399547903,SG -3399547904,3399548159,PK -3399548160,3399548415,SG +3399547904,3399547911,PK +3399547912,3399547935,SG +3399547936,3399547951,PK +3399547952,3399547967,SG +3399547968,3399547999,PK +3399548000,3399548415,SG 3399548416,3399548671,ID 3399548672,3399548927,SG 3399548928,3399557119,AU @@ -61422,7 +97816,11 @@ 3399614464,3399622655,MY 3399622656,3399626751,ID 3399626752,3399630847,IN -3399630848,3399634943,AU +3399630848,3399631871,AU +3399631872,3399632895,SG +3399632896,3399633407,NZ +3399633408,3399633663,AU +3399633920,3399634943,TH 3399634944,3399639039,JP 3399639040,3399643135,AU 3399643136,3399655423,JP @@ -61446,7 +97844,6 @@ 3399752704,3399753727,NZ 3399753728,3399761919,IN 3399761920,3399770111,JP -3399770112,3399778303,AU 3399778304,3399786495,IN 3399786496,3399794687,PH 3399794688,3399798783,AU @@ -61459,7 +97856,8 @@ 3399825408,3399826431,KR 3399826432,3399826943,PH 3399826944,3399827455,IN -3399827456,3399839743,AU +3399827456,3399835647,AU +3399835648,3399839743,AP 3399839744,3399841791,JP 3399841792,3399846399,TW 3399846400,3399846407,US @@ -61482,19 +97880,27 @@ 3399924736,3399925759,PH 3399925760,3399933951,NP 3399933952,3399942143,TW -3399942144,3399950335,AU -3399950336,3399967871,US +3399942144,3399950335,AP +3399950336,3399952639,US +3399952640,3399952703,AU +3399952704,3399967871,US 3399967872,3399967999,HK 3399968000,3399974911,US -3399974912,3399979007,AU +3399974912,3399979007,AP 3399979008,3399982959,US 3399982960,3399982975,SG 3399982976,3399995391,US 3399995392,3399999487,KR -3399999488,3400002047,SG +3399999488,3400001279,SG +3400001280,3400001535,AU +3400001536,3400002047,SG 3400002048,3400002559,HK 3400002560,3400003583,JP -3400003584,3400007679,SG +3400003584,3400004671,SG +3400004672,3400004703,AU +3400004704,3400006911,SG +3400006912,3400006943,AU +3400006944,3400007679,SG 3400007680,3400024063,AU 3400024064,3400028159,MY 3400028160,3400030207,AU @@ -61506,12 +97912,15 @@ 3400048640,3400056831,CN 3400056832,3400060927,TW 3400060928,3400061695,HK -3400061696,3400061791,US +3400061696,3400061759,US +3400061760,3400061791,PR 3400061792,3400061983,HK 3400061984,3400061999,US 3400062000,3400062015,HK 3400062016,3400062047,MO -3400062048,3400062975,HK +3400062048,3400062079,HK +3400062080,3400062207,AU +3400062208,3400062975,HK 3400062976,3400065023,JP 3400065024,3400073215,BD 3400073216,3400077311,HK @@ -61522,7 +97931,7 @@ 3400097792,3400105983,AU 3400105984,3400114175,JP 3400114176,3400118271,TW -3400118272,3400120319,AU +3400118272,3400120319,AP 3400120320,3400122367,JP 3400122368,3400130559,NZ 3400130560,3400138751,ID @@ -61538,7 +97947,7 @@ 3400187904,3400191999,AU 3400192000,3400194047,JP 3400194048,3400196095,CN -3400196096,3400212479,ID +3400204288,3400212479,ID 3400212480,3400220671,MY 3400220672,3400221055,NC 3400221056,3400221119,NZ @@ -61549,9 +97958,13 @@ 3400245248,3400253439,AU 3400253440,3400257535,MY 3400257536,3400259583,HK -3400259584,3400261631,AU 3400261632,3400263679,JP -3400263680,3400265727,AU +3400263680,3400263935,AU +3400263936,3400264191,ID +3400264192,3400264447,IN +3400264704,3400265215,ID +3400265216,3400265471,AU +3400265472,3400265727,IN 3400265728,3400267775,PG 3400267776,3400268799,KR 3400268800,3400270847,MO @@ -61583,7 +97996,7 @@ 3400401920,3400402175,TW 3400402176,3400402431,IN 3400402432,3400402943,NZ -3400402944,3400404991,AU +3400402944,3400404991,AP 3400404992,3400409087,TW 3400409088,3400413183,AU 3400413184,3400417279,JP @@ -61783,8 +98196,8 @@ 3400440608,3400440623,HK 3400440624,3400440639,ID 3400440640,3400440703,HK -3400440704,3400440711,AF -3400440712,3400440719,ID +3400440704,3400440712,AF +3400440713,3400440719,ID 3400440720,3400440727,AF 3400440728,3400440735,KZ 3400440736,3400440743,BD @@ -61794,15 +98207,15 @@ 3400440760,3400440767,MY 3400440768,3400440775,ID 3400440776,3400440783,HK -3400440784,3400440791,MN -3400440792,3400440799,AF -3400440800,3400440807,BD -3400440808,3400440815,MY +3400440784,3400440792,MN +3400440793,3400440799,AF +3400440800,3400440808,BD +3400440809,3400440815,MY 3400440816,3400440823,AF 3400440824,3400440831,MY 3400440832,3400440895,BD 3400440896,3400440959,AF -3400440960,3400441023,HK +3400440960,3400441023,VN 3400441024,3400441047,AF 3400441048,3400441055,BD 3400441056,3400441063,PK @@ -61832,18 +98245,35 @@ 3400536064,3400548351,JP 3400548352,3400581119,TH 3400581120,3400589311,SG -3400589312,3400597503,AU 3400597504,3400605695,HK 3400605696,3400607743,JP 3400607744,3400608767,AU 3400608768,3400609791,IN 3400609792,3400630271,JP 3400630272,3400646655,IN -3400646656,3400649191,SG +3400646656,3400647775,SG +3400647776,3400647791,AU +3400647792,3400649191,SG 3400649192,3400649199,HK 3400649200,3400649983,SG 3400649984,3400650047,HK -3400650048,3400654847,SG +3400650048,3400650407,SG +3400650408,3400650415,AU +3400650416,3400652031,SG +3400652032,3400652287,AU +3400652288,3400652439,SG +3400652440,3400652447,AU +3400652448,3400652479,SG +3400652480,3400652543,AU +3400652544,3400654103,SG +3400654104,3400654111,AU +3400654112,3400654207,SG +3400654208,3400654335,AU +3400654336,3400654695,SG +3400654696,3400654703,AU +3400654704,3400654719,SG +3400654720,3400654735,AU +3400654736,3400654847,SG 3400654848,3400663039,IN 3400663040,3400683519,MY 3400683520,3400691711,JP @@ -61867,18 +98297,16 @@ 3400826880,3400835071,CN 3400835072,3400839167,HK 3400839168,3400847359,JP -3400847360,3400849407,AU 3400849408,3400851455,MN -3400851456,3400884223,AU +3400851456,3400867839,AU +3400876032,3400884223,AU 3400884224,3400888319,JP 3400888320,3400892415,CN 3400892416,3400925183,HK 3400925184,3400933375,TH -3400933376,3400937471,AU 3400937472,3400941567,ID 3400941568,3400966143,AU 3400966144,3400974335,ID -3400974336,3400982527,AU 3400982528,3400990719,HK 3400990720,3400998911,ID 3400998912,3401003007,PH @@ -61887,7 +98315,7 @@ 3401011200,3401015295,JP 3401015296,3401023487,AU 3401023488,3401056255,TH -3401056256,3401400319,MY +3401056256,3401383935,MY 3401400320,3401404415,AU 3401404416,3401408511,CN 3401408512,3401416703,HK @@ -61895,12 +98323,10 @@ 3401420800,3401424895,JP 3401424896,3401428991,NZ 3401428992,3401431039,JP -3401431040,3401433087,AU 3401433088,3401441279,JP 3401441280,3401449471,IN 3401449472,3401515007,MY 3401515008,3401515263,DE -3401515264,3401515519,AU 3401515520,3401516031,ID 3401516032,3401519103,AU 3401519104,3401523199,JP @@ -61925,7 +98351,9 @@ 3406071808,3406073855,US 3406073856,3406077951,AU 3406077952,3406078207,TH -3406078208,3406384639,AU +3406078208,3406327039,AU +3406327040,3406327295,IN +3406327296,3406384639,AU 3406384640,3406385151,SG 3406385152,3406409727,AU 3406409728,3406411775,NZ @@ -61935,7 +98363,8 @@ 3406542848,3406543103,SG 3406543104,3406565887,AU 3406565888,3406566143,PH -3406566144,3406591487,AU +3406566144,3406566399,AU +3406566912,3406591487,AU 3406591488,3406591743,NP 3406591744,3406617599,AU 3406617600,3406617855,MY @@ -61947,11 +98376,17 @@ 3406669824,3406670847,IN 3406670848,3406696959,AU 3406696960,3406697215,IN -3406697216,3406737407,AU +3406697216,3406734847,AU +3406734848,3406735103,AP +3406735104,3406737407,AU 3406737408,3406737663,ID -3406737664,3406746623,AU +3406737664,3406739199,AU +3406739200,3406739455,ID +3406739456,3406746623,AU 3406746624,3406746879,HK -3406746880,3406946815,AU +3406746880,3406865663,AU +3406865664,3406865919,IN +3406865920,3406946815,AU 3406946816,3406947071,KR 3406947072,3406950399,AU 3406950400,3406951423,NF @@ -61959,11 +98394,14 @@ 3406961152,3406961407,IN 3406961408,3406967295,AU 3406967296,3406967551,CN -3406967552,3407020287,AU +3406967552,3406989567,AU +3406989568,3406989823,IN +3406989824,3407020287,AU 3407020288,3407020543,SG 3407020544,3407020799,AU 3407020800,3407021055,IN -3407021056,3407045887,AU +3407021056,3407021311,ID +3407021312,3407045887,AU 3407045888,3407046143,HK 3407046144,3407057663,AU 3407057664,3407057919,JP @@ -61983,9 +98421,7 @@ 3407157644,3407157647,NZ 3407157648,3407157703,AU 3407157704,3407157711,NZ -3407157712,3407157727,AU -3407157728,3407157759,NZ -3407157760,3407158015,AU +3407157712,3407158015,AU 3407158016,3407158047,NZ 3407158048,3407158051,AU 3407158052,3407158055,NZ @@ -62015,7 +98451,10 @@ 3407243264,3407243775,HK 3407243776,3407268863,AU 3407268864,3407269119,US -3407269120,3407369983,AU +3407269120,3407367167,AU +3407367168,3407367679,ID +3407367680,3407367935,AU +3407368192,3407369983,AU 3407369984,3407370239,IN 3407370240,3407498495,AU 3407498496,3407498751,PK @@ -62027,7 +98466,9 @@ 3407604480,3407604735,IN 3407604736,3407608715,AU 3407608716,3407608736,JP -3407608737,3407732223,AU +3407608737,3407682047,AU +3407682048,3407682559,ID +3407682560,3407732223,AU 3407732224,3407732479,HK 3407732480,3407750655,AU 3407750656,3407751167,SG @@ -62035,7 +98476,11 @@ 3407753216,3407753727,HK 3407753728,3407785471,AU 3407785472,3407785727,NZ -3407785728,3407814655,AU +3407785728,3407801343,AU +3407801344,3407801855,ID +3407801856,3407805951,AU +3407805952,3407806463,ID +3407806464,3407814655,AU 3407814656,3407815167,HK 3407815168,3407828991,AU 3407828992,3407829503,US @@ -62064,7 +98509,10 @@ 3408024064,3408032767,AU 3408032768,3408033279,IN 3408033280,3408033791,ID -3408033792,3408041983,AU +3408033792,3408039935,AU +3408039936,3408040191,VN +3408040192,3408040703,AU +3408040960,3408041983,AU 3408041984,3408042495,SG 3408042496,3408042751,HK 3408042752,3408066047,AU @@ -62073,11 +98521,17 @@ 3409396480,3409396735,PH 3409396736,3409418495,AU 3409418496,3409418751,PL -3409418752,3409423615,AU +3409418752,3409420287,AU +3409420288,3409420543,IN +3409420544,3409423615,AU 3409423616,3409423871,IN -3409423872,3409491711,AU +3409423872,3409425663,AU +3409425664,3409425919,AP +3409425920,3409491711,AU 3409491712,3409491967,SG -3409491968,3409505023,AU +3409491968,3409503999,AU +3409504000,3409504255,HK +3409504256,3409505023,AU 3409505024,3409505279,US 3409505280,3409506559,AU 3409506560,3409506815,IN @@ -62085,13 +98539,15 @@ 3409509632,3409509887,HK 3409509888,3409510367,AU 3409510368,3409510383,IN -3409510384,3409547519,AU +3409510384,3409516543,AU +3409516544,3409517055,ID +3409517056,3409547519,AU 3409547520,3409547775,NZ 3409547776,3409802831,AU 3409802832,3409802847,MT 3409802848,3409838335,AU 3409838336,3409838591,MY -3409838592,3409876991,AU +3409838848,3409876991,AU 3409876992,3409878015,TH 3409878016,3409882111,AU 3409882112,3409883135,IN @@ -62104,7 +98560,10 @@ 3410780160,3410788351,BD 3410788352,3410792447,IN 3410792448,3410796543,BD -3410796544,3410800639,AU +3410796544,3410797567,KH +3410797568,3410798591,JP +3410798592,3410799615,IN +3410799616,3410800639,SG 3410800640,3410804735,IN 3410804736,3410821119,PH 3410821120,3410853887,TW @@ -62124,7 +98583,6 @@ 3410888704,3410890751,SG 3410890752,3410894847,AU 3410894848,3410898943,HK -3410898944,3410903039,AU 3410903040,3410911231,HK 3410911232,3410915327,TH 3410915328,3410919423,ID @@ -62135,7 +98593,12 @@ 3410939904,3410943999,IN 3410944000,3410952191,JP 3410952192,3410956287,CN -3410956288,3410960383,AU +3410956288,3410958335,AU +3410958336,3410958847,IN +3410958848,3410959359,ID +3410959360,3410959615,VN +3410959616,3410959871,ID +3410959872,3410960383,AU 3410960384,3410964479,GB 3410964480,3410968575,JP 3410968576,3410984959,NZ @@ -62146,10 +98609,9 @@ 3411019776,3411021823,ID 3411021824,3411023871,MY 3411023872,3411025919,JP -3411025920,3411030015,AU 3411030016,3411032063,NC 3411032064,3411032319,TH -3411032320,3411033087,AU +3411032576,3411033087,AU 3411033088,3411034111,NZ 3411034112,3411050495,HK 3411050496,3411052543,PK @@ -62159,7 +98621,6 @@ 3411062784,3411063231,HK 3411063232,3411063295,PK 3411063296,3411083263,HK -3411083264,3411085311,AU 3411085312,3411086335,KR 3411086336,3411087359,JP 3411087360,3411091455,CN @@ -62178,7 +98639,6 @@ 3411149312,3411149823,MV 3411149824,3411150847,IN 3411150848,3411152895,HK -3411152896,3411154943,AU 3411154944,3411156991,JP 3411156992,3411161087,PH 3411161088,3411165183,PK @@ -62219,14 +98679,15 @@ 3411296256,3411312639,AU 3411312640,3411313151,HK 3411313152,3411313663,TW -3411313664,3411313919,AU +3411313664,3411313919,AP 3411313920,3411314175,HK 3411314176,3411314687,NZ 3411314688,3411316735,ID 3411316736,3411318783,TW 3411318784,3411320831,ID 3411320832,3411329023,PH -3411329024,3411341311,AU +3411329024,3411337215,AP +3411337216,3411341311,AU 3411341312,3411345407,KR 3411345408,3411410943,HK 3411410944,3411435519,CN @@ -62239,7 +98700,7 @@ 3411472384,3411475199,JP 3411475200,3411475455,AU 3411475456,3411475967,HK -3411475968,3411509247,AU +3411476480,3411509247,AU 3411509248,3411542015,PH 3411542016,3411550207,IN 3411550208,3411558399,CN @@ -62338,7 +98799,9 @@ 3411564776,3411565055,HK 3411565056,3411565063,BD 3411565064,3411565119,HK -3411565120,3411565311,BD +3411565120,3411565247,BD +3411565248,3411565279,HK +3411565280,3411565311,BD 3411565312,3411566591,HK 3411566592,3411570687,BD 3411570688,3411574783,AU @@ -62351,16 +98814,24 @@ 3411608576,3411608831,IN 3411608832,3411609087,AU 3411609088,3411609599,HK -3411609600,3411611647,AU 3411611648,3411615743,ID 3411615744,3411623935,JP -3411623936,3411648511,AU +3411623936,3411640319,AU +3411640320,3411641343,JP +3411641344,3411641599,IN +3411641600,3411641855,HK +3411641856,3411642367,IN +3411643392,3411644415,VN +3411644416,3411644927,AU +3411644928,3411645951,ID +3411645952,3411646207,SG +3411646208,3411647487,IN 3411648512,3411656703,NZ 3411656704,3411673087,AU 3411673088,3411674111,CN 3411674112,3411674623,IN 3411674624,3411675135,HK -3411675136,3411677183,PK +3411676160,3411677183,PK 3411677184,3411679231,JP 3411679232,3411681279,AU 3411681280,3411689471,KR @@ -62410,7 +98881,8 @@ 3411858944,3411859199,JP 3411859200,3411859455,SG 3411859456,3411860991,HK -3411860992,3411861375,JP +3411860992,3411861247,AU +3411861248,3411861375,JP 3411861376,3411861487,HK 3411861488,3411861503,JP 3411861504,3411869695,AU @@ -62425,11 +98897,7 @@ 3412017152,3412025343,SG 3412025344,3412033535,CN 3412033536,3412066303,TW -3412066304,3412107263,NZ -3412107264,3412115455,AU -3412115456,3412123647,NZ -3412123648,3412131839,AU -3412131840,3412213759,NZ +3412066304,3412213759,NZ 3412213760,3412221951,AU 3412221952,3412230143,IN 3412230144,3412246527,HK @@ -62447,16 +98915,23 @@ 3412247024,3412247031,CN 3412247032,3412247039,NZ 3412247040,3412247055,HK -3412247056,3412247063,AU -3412247064,3412247071,CN +3412247056,3412247071,CN 3412247072,3412247103,JP 3412247104,3412247167,AU 3412247168,3412247319,IN 3412247320,3412247327,AU 3412247328,3412247335,IN -3412247336,3412248831,AU +3412247336,3412247343,SG +3412247344,3412247359,CN +3412247360,3412247375,AU +3412247376,3412247391,MY +3412247392,3412247399,SG +3412247400,3412247423,AU +3412247424,3412247439,HK +3412247440,3412248831,AU 3412248832,3412249087,CN -3412249088,3412249855,AU +3412249088,3412249103,HK +3412249104,3412249855,AU 3412249856,3412249863,SG 3412249864,3412249871,AU 3412249872,3412249879,HK @@ -62468,8 +98943,8 @@ 3412250024,3412250031,CN 3412250032,3412250063,IN 3412250064,3412250079,AU -3412250080,3412250111,KR -3412250112,3412250367,HK +3412250080,3412250087,KR +3412250088,3412250367,HK 3412250368,3412250375,CN 3412250376,3412250383,TW 3412250384,3412250399,SG @@ -62528,7 +99003,6 @@ 3412253696,3412254719,JP 3412254720,3412262911,NR 3412262912,3412264959,JP -3412264960,3412267007,AU 3412267008,3412271103,CN 3412271104,3412273151,NZ 3412273152,3412275199,IN @@ -62537,7 +99011,14 @@ 3412281344,3412283391,JP 3412283392,3412287487,CN 3412287488,3412295679,ID -3412295680,3412302847,AU +3412295680,3412296191,NZ +3412296192,3412296703,ID +3412296704,3412297727,NZ +3412297728,3412298751,MY +3412298752,3412299263,SG +3412299264,3412299519,AU +3412299520,3412299775,HK +3412299776,3412302847,AU 3412302848,3412303871,WS 3412303872,3412312063,PK 3412312064,3412320255,IN @@ -62550,14 +99031,14 @@ 3412328192,3412328447,WS 3412328448,3412336639,AU 3412336640,3412340735,CN -3412340736,3412343039,AU +3412342784,3412343039,AU 3412343040,3412343295,IN -3412343296,3412344319,AU +3412343296,3412343551,AP +3412343552,3412344319,AU 3412344320,3412344575,SG -3412344576,3412344831,AU 3412344832,3412348927,IN 3412348928,3412361215,CN -3412361216,3412369407,AU +3412361216,3412369407,AP 3412369408,3412377599,KR 3412377600,3412381695,CN 3412381696,3412385791,NZ @@ -62569,19 +99050,16 @@ 3412451328,3412594687,AU 3412594688,3412596735,IN 3412596736,3412598783,MV -3412598784,3412602879,AU 3412602880,3412606975,NC 3412606976,3412615167,PH 3412615168,3412656127,JP 3412656128,3412672511,HK 3412672512,3412680703,JP -3412680704,3412697087,AU 3412697088,3412705279,IN 3412705280,3412713471,AU 3412713472,3412721663,TW 3412721664,3412787199,MY 3412787200,3412803583,TW -3412803584,3412819967,AU 3412819968,3412852735,TH 3412852736,3412918271,AU 3412918272,3412926463,KR @@ -62596,9 +99074,10 @@ 3413032960,3413037055,AU 3413037056,3413041151,IN 3413041152,3413043199,JP -3413043200,3413045247,AU +3413043200,3413044223,AU +3413044224,3413045247,AP 3413045248,3413047295,IN -3413047296,3413102591,AU +3413047296,3413098495,AU 3413102592,3413106687,TW 3413106688,3413110783,PH 3413110784,3413112831,JP @@ -62606,7 +99085,6 @@ 3413113856,3413133311,JP 3413133312,3413135359,BD 3413135360,3413139455,HK -3413139456,3413147647,AU 3413147648,3413155839,IN 3413155840,3413164031,SG 3413164032,3413172223,BD @@ -62619,7 +99097,14 @@ 3413270528,3413278719,TH 3413278720,3413295103,NZ 3413295104,3413303295,JP -3413303296,3413311487,AU +3413303296,3413304319,ID +3413304320,3413305343,JP +3413305344,3413306367,IN +3413306368,3413307391,PH +3413307392,3413308415,IN +3413308416,3413309439,CN +3413309440,3413310463,JP +3413310464,3413311487,HK 3413311488,3413327871,LK 3413327872,3413344255,IN 3413344256,3413360639,PH @@ -62629,7 +99114,14 @@ 3413540864,3413557247,NZ 3413557248,3413565439,CN 3413565440,3413569535,TW -3413569536,3413573887,AU +3413569536,3413569791,SG +3413569792,3413570047,NZ +3413570048,3413570303,KH +3413570304,3413570559,AU +3413570560,3413571583,PH +3413571584,3413572607,CN +3413572608,3413573631,JP +3413573632,3413573887,AU 3413573888,3413574143,JP 3413574144,3413574399,HK 3413574400,3413574655,TW @@ -62637,8 +99129,8 @@ 3413575680,3413576703,VN 3413576704,3413576959,AU 3413576960,3413577215,ID -3413577216,3413579007,AU -3413579008,3413579775,NL +3413577216,3413577727,AU +3413577728,3413579775,AP 3413579776,3413582847,CN 3413582848,3413583871,VN 3413583872,3413584127,JP @@ -62647,11 +99139,23 @@ 3413584896,3413585919,VN 3413585920,3413586175,ID 3413586176,3413586687,IN -3413586688,3413586943,AU +3413586688,3413586943,AP 3413586944,3413587967,ID 3413587968,3413588223,NZ 3413588224,3413588479,MY -3413588480,3413639167,AU +3413588480,3413593087,VN +3413593088,3413593343,AU +3413593344,3413593599,AP +3413593600,3413593855,SG +3413593856,3413594111,KH +3413594112,3413595135,CN +3413595136,3413595391,NZ +3413595392,3413595647,AP +3413595648,3413595903,AU +3413595904,3413596159,HK +3413596160,3413596671,AP +3413596672,3413597183,NP +3413597184,3413597695,AP 3413639168,3413704703,SG 3413704704,3413737471,MY 3413737472,3413753855,TH @@ -62692,16 +99196,15 @@ 3414171648,3414179839,CN 3414179840,3414188031,ID 3414188032,3414196223,CN -3414196224,3414204415,AU 3414204416,3414220799,KR -3414220800,3414223871,AU +3414222848,3414223871,AU 3414223872,3414224895,KR 3414224896,3414226943,VN 3414226944,3414227967,ID 3414227968,3414230015,PK 3414230016,3414230527,PH 3414230528,3414231039,KR -3414231040,3414245375,AU +3414233088,3414245375,AU 3414245376,3414253567,HK 3414253568,3414261759,JP 3414261760,3414269951,AU @@ -62744,10 +99247,13 @@ 3414654976,3414663167,HK 3414663168,3414667263,CN 3414667264,3414669311,ID -3414669312,3414671359,AU +3414669312,3414670335,AU +3414670336,3414670591,IN +3414670592,3414670847,AP +3414670848,3414671359,MY 3414671360,3415080959,JP 3415080960,3415083007,MY -3415083008,3415083519,SG +3415083008,3415083519,AU 3415083520,3415084031,HK 3415084032,3415084543,CN 3415084544,3415085055,US @@ -62779,7 +99285,7 @@ 3415228416,3415236607,KH 3415236608,3415244799,IN 3415244800,3415277567,TH -3415277568,3415293951,AU +3415285760,3415293951,AU 3415293952,3415302143,HK 3415302144,3415306239,AU 3415306240,3415308287,TH @@ -62789,15 +99295,20 @@ 3415334912,3415343103,JP 3415343104,3415425023,TH 3415425024,3415431167,NC -3415431168,3415435263,AU +3415431168,3415432191,IN +3415432192,3415435263,AU 3415435264,3415436287,PH -3415436288,3415436799,AU +3415436288,3415436799,AP 3415436800,3415437311,HK 3415437312,3415441407,SE 3415441408,3415474175,AU 3415474176,3415490559,CN 3415490560,3415491583,PK -3415491584,3415498751,AU +3415494656,3415495679,PH +3415495680,3415496191,ID +3415496704,3415497727,MY +3415497728,3415497983,TW +3415497984,3415498751,AU 3415498752,3415506943,JP 3415506944,3415556095,TH 3415556096,3415563263,AU @@ -62808,7 +99319,6 @@ 3415605248,3415752703,TH 3415752704,3415760895,CN 3415760896,3415769087,NZ -3415769088,3415777279,AU 3415777280,3415785471,KR 3415785472,3415793663,JP 3415793664,3415801855,AU @@ -62817,15 +99327,24 @@ 3415803392,3415805951,PH 3415805952,3415807999,MY 3415808000,3415810047,ID -3415810048,3415814143,IN -3415814144,3415818239,AU +3415810048,3415814399,IN +3415814400,3415814655,ID +3415814656,3415815167,TH +3415815168,3415816191,IN +3415816192,3415817215,JP +3415817216,3415817727,ID 3415818240,3415822335,HK 3415822336,3415826431,MY 3415826432,3415834623,ID 3415834624,3415838719,TH 3415838720,3415842815,KR 3415842816,3415851007,TH -3415851008,3415867391,AU +3415851008,3415855103,AU +3415855104,3415855615,HK +3415855616,3415856127,IN +3415856128,3415858175,ID +3415858176,3415859199,LK +3415859200,3415867391,AU 3415867392,3416047615,TH 3416047616,3416063999,CN 3416064000,3416131583,TH @@ -62845,20 +99364,39 @@ 3416274944,3416276991,ID 3416276992,3416285183,HK 3416285184,3416287231,VN -3416287232,3416289279,AU 3416289280,3416293375,NZ -3416293376,3416297471,AU +3416293376,3416293631,ID +3416293888,3416294399,PH +3416294400,3416295423,AU +3416295424,3416295679,IN +3416295680,3416295935,TH +3416295936,3416296447,IN +3416296448,3416297471,KR 3416297472,3416301567,TW 3416301568,3416309759,PH -3416309760,3416317951,AU 3416317952,3416326143,TW 3416326144,3416327167,VN 3416327168,3416328191,HK 3416328192,3416330239,AU 3416330240,3416334335,ID -3416334336,3416339967,SG +3416334336,3416338431,SG +3416338432,3416338687,MY +3416338688,3416339967,SG 3416339968,3416342527,IN -3416342528,3416375295,AU +3416342528,3416371199,AU +3416371200,3416371711,AP +3416371712,3416371967,VN +3416371968,3416372223,IN +3416372224,3416372479,CN +3416372480,3416372735,SG +3416372736,3416372991,AU +3416372992,3416373247,SG +3416373248,3416373503,AU +3416373504,3416373759,SG +3416373760,3416374271,AU +3416374272,3416374527,PH +3416374528,3416374783,IN +3416374784,3416375295,ID 3416375296,3416383487,CN 3416383488,3416391679,HK 3416391680,3416457215,VN @@ -62870,9 +99408,16 @@ 3416471040,3416471295,NZ 3416471296,3416473727,JP 3416473728,3416473855,PH -3416473856,3416474111,JP +3416473856,3416473871,JP +3416473872,3416473983,AU +3416473984,3416474047,JP +3416474048,3416474111,AU 3416474112,3416474239,ID -3416474240,3416474639,JP +3416474240,3416474375,JP +3416474376,3416474383,AU +3416474384,3416474407,JP +3416474408,3416474415,AU +3416474416,3416474639,JP 3416474640,3416474671,NZ 3416474672,3416474687,JP 3416474688,3416474740,NZ @@ -62898,7 +99443,13 @@ 3416476072,3416476079,SG 3416476080,3416476111,JP 3416476112,3416476127,SG -3416476128,3416476863,JP +3416476128,3416476159,JP +3416476160,3416476167,AU +3416476168,3416476207,JP +3416476208,3416476255,AU +3416476256,3416476367,JP +3416476368,3416476375,AU +3416476376,3416476863,JP 3416476864,3416477183,TW 3416477184,3416477199,JP 3416477200,3416477207,MY @@ -62929,19 +99480,23 @@ 3416478800,3416478847,JP 3416478848,3416478911,TW 3416478912,3416478927,KR -3416478928,3416480255,JP +3416478928,3416479103,JP +3416479104,3416479231,AU +3416479232,3416480255,JP 3416480256,3416480383,TW 3416480384,3416481559,JP 3416481560,3416481567,IN -3416481568,3416481807,JP +3416481568,3416481575,JP +3416481576,3416481583,AU +3416481584,3416481807,JP 3416481808,3416481815,HK 3416481816,3416481823,JP 3416481824,3416481839,HK 3416481840,3416481855,JP 3416481856,3416481871,HK 3416481872,3416481887,JP -3416481888,3416481935,HK -3416481936,3416481967,JP +3416481888,3416481919,HK +3416481920,3416481967,JP 3416481968,3416481983,HK 3416481984,3416482047,JP 3416482048,3416482079,SG @@ -62953,9 +99508,10 @@ 3416482592,3416482607,KR 3416482608,3416482671,JP 3416482672,3416482687,KR -3416482688,3416482719,JP -3416482720,3416482783,SG -3416482784,3416482815,HK +3416482688,3416482703,JP +3416482704,3416482719,AU +3416482720,3416482784,SG +3416482785,3416482815,HK 3416482816,3416482879,KR 3416482880,3416483167,JP 3416483168,3416483199,SG @@ -62966,7 +99522,9 @@ 3416483408,3416483423,HK 3416483424,3416483567,JP 3416483568,3416483583,HK -3416483584,3416483775,SG +3416483584,3416483663,SG +3416483664,3416483671,JP +3416483672,3416483775,SG 3416483776,3416483863,JP 3416483864,3416483871,KR 3416483872,3416483903,JP @@ -62975,7 +99533,8 @@ 3416483920,3416483943,JP 3416483944,3416483951,KR 3416483952,3416483959,HK -3416483960,3416483975,JP +3416483960,3416483967,AU +3416483968,3416483975,JP 3416483976,3416484031,HK 3416484032,3416484039,JP 3416484040,3416484055,KR @@ -62985,23 +99544,26 @@ 3416484176,3416484183,MY 3416484184,3416484191,JP 3416484192,3416484223,MY -3416484224,3416484319,JP +3416484224,3416484255,JP +3416484256,3416484271,AU +3416484272,3416484319,JP 3416484320,3416484335,HK 3416484336,3416484351,JP 3416484352,3416484607,SG 3416484608,3416484671,JP 3416484672,3416484735,HK 3416484736,3416485823,JP -3416485824,3416485879,SG -3416485880,3416485887,JP -3416485888,3416485903,SG +3416485824,3416485903,SG 3416485904,3416485911,JP 3416485912,3416485927,SG 3416485928,3416485935,JP 3416485936,3416485943,SG 3416485944,3416485967,JP 3416485968,3416485975,SG -3416485976,3416486063,JP +3416485976,3416486023,JP +3416486024,3416486039,AU +3416486040,3416486047,SG +3416486048,3416486063,JP 3416486064,3416486103,SG 3416486104,3416486111,JP 3416486112,3416486119,SG @@ -63010,8 +99572,8 @@ 3416486144,3416487167,JP 3416487168,3416487175,HK 3416487176,3416487183,JP -3416487184,3416487199,HK -3416487200,3416487255,JP +3416487184,3416487191,HK +3416487192,3416487255,JP 3416487256,3416487263,HK 3416487264,3416487271,JP 3416487272,3416487279,HK @@ -63023,13 +99585,26 @@ 3416487392,3416487415,HK 3416487416,3416487423,JP 3416487424,3416487487,PH -3416487488,3416488578,JP +3416487488,3416488451,JP +3416488452,3416488453,AU +3416488454,3416488578,JP 3416488579,3416488579,TW 3416488580,3416488580,SG 3416488581,3416488581,JP 3416488582,3416488582,HK -3416488583,3416489983,JP -3416489984,3416506367,AU +3416488583,3416488583,AU +3416488584,3416489471,JP +3416489472,3416489727,AU +3416489728,3416489731,JP +3416489732,3416489735,AU +3416489736,3416489751,JP +3416489752,3416489759,AU +3416489760,3416489763,JP +3416489764,3416489773,AU +3416489774,3416489774,JP +3416489775,3416489783,AU +3416489784,3416489787,JP +3416489788,3416489983,AU 3416506368,3416514559,TW 3416514560,3416522751,IN 3416522752,3416588287,AU @@ -63045,12 +99620,16 @@ 3416694784,3416702975,CN 3416702976,3416707071,ID 3416707072,3416709119,KR -3416709120,3416719359,AU +3416709120,3416709375,AU +3416709376,3416709631,ID +3416709632,3416710143,AU +3416710144,3416711167,HK +3416711168,3416719359,AU 3416719360,3416727551,PH 3416727552,3416735743,JP 3416735744,3416752127,PH 3416752128,3416784895,NZ -3416784896,3416801279,AU +3416793088,3416801279,AU 3416801280,3416817663,JP 3416817664,3416850431,HK 3416850432,3416851455,PH @@ -63065,19 +99644,33 @@ 3416864896,3416865023,SG 3416865024,3416865151,HK 3416865152,3416865279,SG -3416865280,3416865295,JP -3416865296,3416865407,AU +3416865280,3416865287,JP +3416865288,3416865295,AP +3416865296,3416865303,AU +3416865304,3416865407,AP 3416865408,3416865599,JP 3416865600,3416865607,HK -3416865608,3416865655,AU +3416865608,3416865655,AP 3416865656,3416865791,JP 3416865792,3416866047,HK -3416866048,3416866815,AU +3416866048,3416866815,AP 3416866816,3416883199,SG 3416883200,3416915967,HK -3416915968,3416924159,AU +3416915968,3416920063,AU +3416920064,3416921087,TH +3416921088,3416922111,PH +3416922112,3416922367,AU +3416922368,3416922623,IN +3416922624,3416923135,VN +3416923136,3416924159,AP 3416924160,3416928255,JP -3416928256,3416932351,AU +3416928256,3416928511,IN +3416928512,3416928767,HK +3416928768,3416929279,TH +3416929280,3416930303,JP +3416930304,3416930559,NZ +3416930560,3416930815,AU +3416931328,3416932351,IN 3416932352,3416936447,PK 3416936448,3416938495,AU 3416938496,3416938751,NZ @@ -63092,11 +99685,19 @@ 3416983040,3416983551,PH 3416983552,3416985599,JP 3416985600,3416989695,VN -3416989696,3416993791,NZ -3416993792,3417014271,AU +3416989696,3416997887,NZ +3416997888,3417014271,AU 3417014272,3417022463,JP 3417022464,3417030655,KR -3417030656,3417038847,AU +3417030656,3417034751,AU +3417034752,3417035007,NZ +3417035008,3417035775,IN +3417035776,3417036799,JP +3417036800,3417037823,ID +3417037824,3417038079,AU +3417038080,3417038335,ID +3417038336,3417038591,IN +3417038592,3417038847,NZ 3417038848,3417042943,CN 3417042944,3417044991,IN 3417044992,3417047039,AU @@ -63108,7 +99709,6 @@ 3417137152,3417145343,KR 3417145344,3417178111,NZ 3417178112,3417179135,PH -3417179136,3417179391,AU 3417179392,3417179647,ID 3417179648,3417179903,IN 3417179904,3417180159,CN @@ -63138,12 +99738,25 @@ 3417275392,3417276415,PH 3417276416,3417284607,CN 3417284608,3417288703,SG -3417288704,3417292799,AU +3417288704,3417289215,IN +3417289216,3417289727,AU +3417289728,3417291263,IN +3417291264,3417291775,AU +3417291776,3417292799,KR 3417292800,3417309183,CN -3417309184,3417341951,AU -3417341952,3417346047,CA +3417333760,3417337855,AU +3417337856,3417338367,IN +3417338368,3417338879,HK +3417338880,3417339903,PH +3417339904,3417340415,AU +3417340416,3417341951,NZ +3417341952,3417346047,KH 3417346048,3417348095,MY -3417348096,3417350143,AU +3417348096,3417348351,AU +3417348352,3417348607,IN +3417348608,3417349119,NZ +3417349120,3417349631,IN +3417349632,3417350143,AU 3417350144,3417352191,VN 3417352192,3417354239,CN 3417354240,3417356287,ID @@ -63173,17 +99786,7 @@ 3417948160,3417964543,AU 3417964544,3418030079,HK 3418030080,3418062847,TW -3418062848,3418063647,US -3418063648,3418063679,IN -3418063680,3418063871,US -3418063872,3418064127,IN -3418064128,3418065023,US -3418065024,3418065039,IN -3418065040,3418066527,US -3418066528,3418066591,IN -3418066592,3418066703,US -3418066704,3418066719,IN -3418066720,3418071039,US +3418062848,3418071039,IN 3418071040,3418079231,CN 3418079232,3418095615,IN 3418095616,3418111999,TH @@ -63198,7 +99801,6 @@ 3418157056,3418161663,BD 3418161664,3418162431,AU 3418162432,3418162687,IN -3418162688,3418163199,AU 3418163200,3418165247,PH 3418165248,3418167295,MY 3418167296,3418167551,IN @@ -63212,12 +99814,13 @@ 3418184192,3418184959,IN 3418184960,3418185727,AU 3418185728,3418189823,PK -3418189824,3418193919,AU +3418190848,3418191871,TH +3418191872,3418192895,ID +3418192896,3418193919,AU 3418193920,3418202111,KH 3418202112,3418206207,HK 3418206208,3418208255,IN 3418208256,3418210303,LK -3418210304,3418218495,AU 3418218496,3418227711,BD 3418227712,3418228735,TW 3418228736,3418230783,BD @@ -63227,7 +99830,7 @@ 3418233856,3418234879,JP 3418234880,3418235903,BD 3418235904,3418236415,ID -3418236416,3418236927,AU +3418236416,3418236927,AP 3418236928,3418241023,ID 3418241024,3418243071,JP 3418243072,3418246015,PH @@ -63248,7 +99851,15 @@ 3418283520,3418284031,AU 3418284032,3418285055,SG 3418285056,3418285567,JP -3418285568,3418288127,SG +3418285568,3418286111,SG +3418286112,3418286143,AU +3418286144,3418286227,SG +3418286228,3418286235,AU +3418286236,3418286239,SG +3418286240,3418286255,AU +3418286256,3418286927,SG +3418286928,3418286943,AU +3418286944,3418288127,SG 3418288128,3418290175,ID 3418290176,3418290431,IN 3418290432,3418290687,HK @@ -63259,7 +99870,8 @@ 3418292992,3418293247,HK 3418293248,3418293503,JP 3418293504,3418293759,IN -3418293760,3418294271,AU +3418293760,3418294015,AU +3418294016,3418294271,NZ 3418294272,3418296319,VN 3418296320,3418300415,CN 3418300416,3418300927,BD @@ -63280,22 +99892,23 @@ 3418365952,3418374143,TH 3418374144,3418382335,AU 3418382336,3418390527,JP -3418390528,3418392319,AU +3418390528,3418392319,AP 3418392320,3418392575,HK 3418392576,3418392831,AU 3418392832,3418393087,HK 3418393088,3418393103,SG -3418393104,3418393111,AU -3418393112,3418393119,SG -3418393120,3418393135,AU -3418393136,3418393143,SG -3418393144,3418393151,AU -3418393152,3418393183,SG -3418393184,3418393599,AU +3418393104,3418393111,AP +3418393112,3418393159,SG +3418393160,3418393183,AP +3418393184,3418393247,SG +3418393248,3418393279,AP +3418393280,3418393343,SG +3418393344,3418393599,AP 3418393600,3418393607,JP -3418393608,3418393695,AU -3418393696,3418393711,JP -3418393712,3418393983,AU +3418393608,3418393679,AP +3418393680,3418393791,JP +3418393792,3418393855,AP +3418393856,3418393983,AU 3418393984,3418394015,SG 3418394016,3418394047,AU 3418394048,3418394063,MY @@ -63303,69 +99916,76 @@ 3418394080,3418394111,AU 3418394112,3418394367,KR 3418394368,3418394623,TW -3418394624,3418394879,KR +3418394624,3418394879,AP 3418394880,3418395135,JP -3418395136,3418395391,AU +3418395136,3418395391,AP 3418395392,3418395407,JP -3418395408,3418395423,AU +3418395408,3418395423,AP 3418395424,3418395439,JP -3418395440,3418395455,AU +3418395440,3418395455,AP 3418395456,3418395520,JP -3418395521,3418395679,AU +3418395521,3418395679,AP 3418395680,3418395695,KR -3418395696,3418395839,AU +3418395696,3418395839,AP 3418395840,3418395903,KR 3418395904,3418396415,JP -3418396416,3418396719,AU +3418396416,3418396719,AP 3418396720,3418396735,TW -3418396736,3418397823,AU +3418396736,3418397823,AP 3418397824,3418397831,HK -3418397832,3418397847,AU +3418397832,3418397847,AP 3418397848,3418397911,HK -3418397912,3418398079,AU +3418397912,3418398079,AP 3418398080,3418398207,KR 3418398208,3418398719,JP -3418398720,3418399231,AU +3418398720,3418399231,AP 3418399232,3418399359,PH -3418399360,3418399439,AU +3418399360,3418399439,AP 3418399440,3418399455,PH -3418399456,3418399471,AU +3418399456,3418399471,AP 3418399472,3418399487,TW -3418399488,3418401535,AU +3418399488,3418401535,AP 3418401536,3418401599,PH -3418401600,3418401631,AU +3418401600,3418401631,AP 3418401632,3418401647,PH -3418401648,3418401719,AU +3418401648,3418401719,AP 3418401720,3418401727,PH 3418401728,3418401791,TW -3418401792,3418401887,AU +3418401792,3418401887,AP 3418401888,3418401903,PH 3418401904,3418401919,TW -3418401920,3418401935,AU +3418401920,3418401935,AP 3418401936,3418401951,TW -3418401952,3418403071,AU +3418401952,3418403071,AP 3418403072,3418403103,MY -3418403104,3418403591,AU -3418403592,3418403599,NZ -3418403600,3418403775,AU +3418403104,3418403583,AP +3418403584,3418403591,AU +3418403592,3418403599,AP +3418403600,3418403615,AU +3418403616,3418403623,AP +3418403624,3418403679,AU +3418403680,3418403711,AP +3418403712,3418403775,AU 3418403776,3418403783,NZ -3418403784,3418403839,AU -3418403840,3418403903,HK -3418403904,3418403967,AU -3418403968,3418403991,HK -3418403992,3418403999,AU +3418403784,3418403807,AU +3418403808,3418403815,AP +3418403816,3418403839,AU +3418403840,3418403991,HK +3418403992,3418403999,AP 3418404000,3418404063,HK -3418404064,3418404159,AU +3418404064,3418404159,AP 3418404160,3418404175,TW -3418404176,3418404351,AU +3418404176,3418404351,AP 3418404352,3418404479,KR -3418404480,3418405631,AU +3418404480,3418405375,AP +3418405376,3418405503,AU +3418405504,3418405631,AP 3418405632,3418405663,HK -3418405664,3418405855,AU +3418405664,3418405855,AP 3418405856,3418405887,SG -3418405888,3418406143,AU +3418405888,3418406143,AP 3418406144,3418406399,SG -3418406400,3418406911,AU +3418406400,3418406911,AP 3418406912,3418423295,IN 3418423296,3418435711,HK 3418435712,3418435743,JP @@ -63387,10 +100007,11 @@ 3418453632,3418453759,US 3418453760,3418456063,HK 3418456064,3418472447,IN -3418472448,3418505215,AU +3418472448,3418480639,AU +3418488832,3418505215,AU 3418505216,3418506831,JP 3418506832,3418506879,ID -3418506880,3418506895,JP +3418506880,3418506895,AU 3418506896,3418506911,NZ 3418506912,3418507043,JP 3418507044,3418507047,ID @@ -63420,7 +100041,8 @@ 3418510592,3418510847,TW 3418510848,3418510927,JP 3418510928,3418510943,HK -3418510944,3418510991,JP +3418510944,3418510951,AU +3418510952,3418510991,JP 3418510992,3418511007,HK 3418511008,3418511023,JP 3418511024,3418511039,HK @@ -63438,43 +100060,57 @@ 3418511408,3418511415,TW 3418511416,3418511423,SG 3418511424,3418511439,TW -3418511440,3418513031,JP +3418511440,3418512191,JP +3418512192,3418512255,AU +3418512256,3418512703,JP +3418512704,3418512735,AU +3418512736,3418512951,JP +3418512952,3418512959,AU +3418512960,3418512983,JP +3418512984,3418513031,AU 3418513032,3418513039,HK -3418513040,3418513215,JP +3418513040,3418513055,AU +3418513056,3418513063,JP +3418513064,3418513071,AU +3418513072,3418513087,JP +3418513088,3418513127,AU +3418513128,3418513215,JP 3418513216,3418513231,TW 3418513232,3418513407,JP 3418513408,3418517503,IN 3418517504,3418519551,MN -3418519552,3418521599,AU 3418521600,3418524574,HK 3418524575,3418524606,CN 3418524607,3418524638,TH 3418524639,3418554367,HK -3418554368,3418578943,AU 3418578944,3418583039,TH -3418583040,3418585087,AU 3418585088,3418586111,TH 3418586112,3418586367,AU 3418586368,3418586623,SG -3418586624,3418619903,AU +3418586624,3418586879,PK +3418586880,3418587135,AU 3418619904,3418621951,CN -3418621952,3418623999,HK 3418624000,3418626047,JP 3418626048,3418628095,KI 3418628096,3418636287,AU -3418636288,3418642431,JP -3418642432,3418644479,AU -3418644480,3418644991,JP +3418636288,3418642943,JP +3418642944,3418643199,ID +3418643200,3418643455,JP +3418643456,3418644479,AU +3418644480,3418644735,JP +3418644736,3418644991,AU 3418644992,3418645247,TW 3418645248,3418645503,SG -3418645504,3418646015,JP -3418646016,3418646271,NZ +3418645504,3418645759,JP +3418645760,3418646271,NZ 3418646272,3418646527,HK 3418646528,3418646783,JP 3418646784,3418647039,TW 3418647040,3418648063,JP 3418648064,3418648575,SG -3418648576,3418648783,JP +3418648576,3418648591,AU +3418648592,3418648639,JP +3418648640,3418648783,AU 3418648784,3418648799,SG 3418648800,3418648815,NZ 3418648816,3418648831,HK @@ -63486,8 +100122,8 @@ 3418649584,3418649599,SG 3418649600,3418649887,JP 3418649888,3418649951,PH -3418649952,3418650719,JP -3418650720,3418650808,HK +3418649952,3418650751,JP +3418650752,3418650808,HK 3418650809,3418650823,JP 3418650824,3418650839,HK 3418650840,3418650846,JP @@ -63509,16 +100145,29 @@ 3418816512,3418947583,IN 3418947584,3418955775,AU 3418955776,3418959871,TW -3418959872,3418988543,AU +3418959872,3418960383,BD +3418960384,3418960895,ID +3418960896,3418961919,SG +3418961920,3418962943,VN +3418962944,3418963967,IN +3418963968,3418988543,AU 3418988544,3418992639,ID -3418992640,3418996735,AU +3418992640,3418993919,SG +3418993920,3418994175,MN +3418994176,3418994431,MY +3418994432,3418994687,AU +3418994688,3418995711,MY +3418995712,3418996735,JP 3418996736,3419013119,IN 3419013120,3419062271,AU 3419062272,3419070463,JP 3419070464,3419071999,HK 3419072000,3419072255,ID 3419072256,3419072511,HK -3419072512,3419074559,AU +3419072512,3419073023,JP +3419073024,3419073279,SG +3419073280,3419073535,FJ +3419073536,3419074559,SG 3419074560,3419078655,BD 3419078656,3419209727,TW 3419209728,3419275263,JP @@ -63526,10 +100175,13 @@ 3419340800,3419344895,TW 3419344896,3419348991,KR 3419348992,3419353087,TW -3419353088,3419357183,AU +3419353088,3419354111,JP +3419354112,3419356159,ID +3419356160,3419356671,NZ +3419356672,3419357183,IN 3419357184,3419411455,CN 3419411456,3419411711,HK -3419411712,3419412223,AU +3419411712,3419411967,NZ 3419412224,3419412479,JP 3419412480,3419414527,PH 3419414528,3419422719,CN @@ -63538,9 +100190,7 @@ 3419448704,3419448735,NP 3419448736,3419449023,SG 3419449024,3419449055,BD -3419449056,3419456639,SG -3419456640,3419456671,BD -3419456672,3419456911,SG +3419449056,3419456911,SG 3419456912,3419456927,JP 3419456928,3419459007,SG 3419459008,3419459071,AF @@ -63548,20 +100198,35 @@ 3419471872,3419504639,TH 3419504640,3419508735,HK 3419508736,3419512831,JP -3419512832,3419529215,AU +3419512832,3419516927,AU +3419516928,3419517951,JP +3419517952,3419518975,VN +3419518976,3419519999,TW +3419520000,3419520767,ID +3419520768,3419521023,TH +3419521024,3419529215,AU 3419529216,3419537407,CN 3419537408,3419541503,HK 3419541504,3419553791,KR -3419553792,3419570175,AU +3419553792,3419557887,AU +3419557888,3419558399,ID +3419558400,3419558655,AU +3419558656,3419559935,ID +3419559936,3419560959,JP +3419560960,3419561983,IN +3419561984,3419570175,AU 3419570176,3419602943,VN 3419602944,3419611135,TW 3419611136,3419617279,JP -3419617280,3419619327,AU +3419617280,3419618303,AU +3419618304,3419619327,SG 3419619328,3419635711,NZ 3419635712,3419643903,SG 3419643904,3419668479,JP 3419668480,3419672575,CN -3419672576,3419676671,AU +3419672576,3419674623,AU +3419674624,3419675647,IN +3419675648,3419676671,MN 3419676672,3419684863,JP 3419684864,3419688959,IN 3419688960,3419693055,CN @@ -63574,20 +100239,52 @@ 3419783168,3419791359,PH 3419791360,3419873279,AU 3419873280,3419877375,AF -3419877376,3419881471,AU +3419877376,3419877631,ID +3419877632,3419877887,KH +3419877888,3419878143,ID +3419878144,3419878399,IN +3419879424,3419880447,JP +3419880448,3419881471,MY 3419881472,3419897855,PH -3419897856,3419906047,AU +3419897856,3419899903,JP +3419899904,3419900159,FR +3419900160,3419900415,BE +3419900416,3419901439,AU +3419901440,3419901951,NZ +3419901952,3419902207,AU +3419902208,3419902463,HK +3419902464,3419902719,CN +3419902720,3419902975,HK +3419902976,3419903231,AU +3419903232,3419903487,JP +3419903488,3419906047,AU 3419906048,3419914239,PK 3419914240,3419922431,KR 3419922432,3419924479,JP -3419924480,3419926527,PH 3419926528,3419930623,HK 3419930624,3419971583,JP 3419971584,3419979775,KR 3419979776,3419996159,JP 3419996160,3420020735,AU 3420020736,3420028927,TW -3420028928,3420045311,AU +3420028928,3420029951,MY +3420029952,3420030975,ID +3420030976,3420031999,IN +3420032000,3420032255,ID +3420032256,3420032511,AU +3420032512,3420033023,NZ +3420033024,3420034047,IN +3420034048,3420036095,AU +3420036096,3420037119,JP +3420037120,3420039167,AU +3420039168,3420040191,KH +3420040192,3420040703,ID +3420040704,3420040959,IN +3420040960,3420041215,HK +3420041216,3420042239,MY +3420042240,3420043263,JP +3420043264,3420044287,SG +3420044288,3420045311,ID 3420045312,3420061695,KR 3420061696,3420127231,HK 3420127232,3420323839,AU @@ -63631,7 +100328,8 @@ 3420337176,3420337183,AU 3420337184,3420337599,SG 3420337600,3420337631,HK -3420337632,3420337643,SG +3420337632,3420337635,AU +3420337636,3420337643,SG 3420337644,3420337647,AU 3420337648,3420337663,SG 3420337664,3420337727,AU @@ -63738,271 +100436,690 @@ 3420372992,3420377087,HK 3420377088,3420389375,JP 3420389376,3420393471,US -3420393472,3420395519,BD 3420395520,3420397567,JP 3420397568,3420401663,KH 3420401664,3420411903,JP -3420411904,3420413951,AU +3420411904,3420412415,TH +3420412416,3420412927,ID +3420412928,3420413951,BD 3420413952,3420422143,KR 3420422144,3420430335,MY 3420430336,3420434431,PK -3420434432,3420438527,AU +3420434432,3420434687,IN +3420434688,3420434943,KR +3420434944,3420435199,HK +3420435200,3420435455,AU +3420435456,3420436479,JP +3420436480,3420437503,AU +3420437504,3420438527,IN 3420438528,3420454911,HK 3420454912,3422552063,KR -3422552064,3422848511,US +3422552064,3422717439,US +3422717440,3422717695,A1 +3422717696,3422848511,US 3422848512,3422848767,GB -3422848768,3423092735,US -3423092736,3423093759,VI +3422848768,3422955519,US +3422955520,3422956799,FR +3422956800,3423092735,US +3423092736,3423092767,VI +3423092768,3423092783,US +3423092784,3423092831,VI +3423092832,3423092847,US +3423092848,3423093759,VI 3423093760,3423094783,US 3423094784,3423095807,CA 3423095808,3423143935,US 3423143936,3423145983,CA -3423148032,3423168511,US -3423170560,3423182847,US -3423182848,3423183743,CA +3423145984,3423161031,US +3423161032,3423161039,CA +3423161040,3423161479,US +3423161480,3423161487,HK +3423161488,3423161613,US +3423161614,3423161621,CA +3423161622,3423177471,US +3423177472,3423177727,CA +3423177728,3423182847,US +3423182848,3423183199,CA +3423183200,3423183231,BM +3423183232,3423183263,CA +3423183264,3423183295,BM +3423183296,3423183743,CA 3423183744,3423183871,EE -3423183872,3423184207,CA +3423183872,3423184175,CA +3423184176,3423184191,US +3423184192,3423184207,CA 3423184208,3423184215,EE -3423184216,3423184895,CA -3423184896,3423197183,US -3423198208,3423203327,US -3423205376,3423221759,US +3423184216,3423184287,CA +3423184288,3423184319,AU +3423184320,3423184895,CA +3423184896,3423204095,US +3423204096,3423204351,CA +3423204352,3423207663,US +3423207664,3423207671,AN +3423207672,3423208193,US +3423208194,3423208383,AN +3423208384,3423221759,US 3423221760,3423222783,CA 3423222784,3423234751,US 3423234752,3423234783,CA -3423234784,3423235711,US +3423234784,3423235543,US +3423235544,3423235551,TR +3423235552,3423235559,US +3423235560,3423235563,TR +3423235564,3423235711,US 3423235712,3423235743,CA -3423235744,3423235871,US +3423235744,3423235807,US +3423235808,3423235823,IN +3423235824,3423235871,US 3423235872,3423235903,CA -3423235904,3423236095,US +3423235904,3423235975,US +3423235976,3423235983,IL +3423235984,3423236095,US 3423236096,3423238143,JM -3423238144,3423246335,US -3423248384,3423252479,US -3423254528,3423258623,US +3423238144,3423258623,US 3423258624,3423260671,CA -3423260672,3423264831,US +3423262720,3423264831,US 3423264832,3423264863,NG 3423264864,3423265247,US 3423265248,3423265263,EC -3423265264,3423265791,US -3423266816,3423268863,US -3423268864,3423269887,CA +3423265264,3423266815,US +3423266872,3423266879,US +3423268864,3423269135,CA +3423269136,3423269151,US +3423269152,3423269887,CA 3423269888,3423285247,US -3423285248,3423287295,CA -3423287296,3423291391,US -3423293440,3423303679,US +3423285248,3423285527,CA +3423285528,3423285535,NL +3423285536,3423285543,JP +3423285544,3423285551,CA +3423285552,3423285559,US +3423285560,3423285583,CA +3423285584,3423285591,US +3423285592,3423285647,CA +3423285648,3423285655,US +3423285656,3423285671,CA +3423285672,3423285679,JP +3423285680,3423285703,CA +3423285704,3423285711,TL +3423285712,3423285791,CA +3423285792,3423285807,CR +3423285808,3423286175,CA +3423286176,3423286207,US +3423286208,3423286527,CA +3423286528,3423286655,GB +3423286656,3423287295,CA +3423287296,3423303679,US 3423303680,3423304703,CA 3423304704,3423311871,US -3423311872,3423313919,VI -3423313920,3423337471,US -3423404032,3423408127,US -3423410176,3423412223,US -3423412224,3423412239,CA +3423311872,3423313151,VI +3423313152,3423313407,US +3423313408,3423313919,VI +3423313920,3423329567,US +3423329568,3423329615,IL +3423329616,3423338527,US +3423338528,3423338535,AE +3423338536,3423338927,US +3423338928,3423338943,DE +3423338944,3423339375,US +3423339376,3423339383,DE +3423339384,3423340399,US +3423340400,3423340407,AU +3423340408,3423341511,US +3423341512,3423341519,PE +3423341520,3423341543,US +3423341544,3423341551,GB +3423341552,3423341567,US +3423341568,3423341599,GB +3423341600,3423342279,US +3423342280,3423342287,IL +3423342288,3423342631,US +3423342632,3423342639,IN +3423342640,3423342759,US +3423342760,3423342775,GB +3423342776,3423342967,US +3423342968,3423342975,AU +3423342976,3423343039,US +3423343040,3423343055,IN +3423343056,3423343135,US +3423343136,3423343151,PK +3423343152,3423343167,RO +3423343168,3423343327,US +3423343328,3423343343,AU +3423343344,3423344767,US +3423344768,3423344791,PK +3423344792,3423344807,CA +3423344808,3423344991,US +3423344992,3423344999,IE +3423345000,3423345087,US +3423345088,3423345095,CA +3423345096,3423345111,US +3423345112,3423345119,IE +3423345120,3423345399,US +3423345400,3423345407,IE +3423345408,3423345431,US +3423345432,3423345439,GT +3423345440,3423345503,US +3423345504,3423345535,AU +3423345536,3423345583,US +3423345584,3423345591,JO +3423345592,3423345623,US +3423345624,3423345631,GB +3423345632,3423345695,US +3423345696,3423345719,CA +3423345720,3423346127,US +3423346128,3423346143,CA +3423346144,3423346319,US +3423346320,3423346327,DK +3423346328,3423346487,US +3423346488,3423346495,AE +3423346496,3423346831,US +3423346832,3423346847,IM +3423346848,3423346943,US +3423346944,3423346951,CA +3423346952,3423346983,US +3423346984,3423346991,AE +3423346992,3423346999,AU +3423347000,3423347207,US +3423347208,3423347231,CA +3423347232,3423347447,US +3423347448,3423347455,CA +3423347456,3423347503,US +3423347504,3423347519,DE +3423347520,3423347783,US +3423347784,3423347791,SA +3423347792,3423347823,US +3423347824,3423347831,FR +3423347832,3423347919,US +3423347920,3423347927,AU +3423347928,3423348007,US +3423348008,3423348023,GB +3423348024,3423348071,US +3423348072,3423348095,AU +3423348096,3423349119,US +3423349120,3423349135,IT +3423349136,3423349247,US +3423349248,3423349263,AU +3423349264,3423349295,US +3423349296,3423349303,AU +3423349304,3423349327,US +3423349328,3423349335,DE +3423349336,3423349359,US +3423349360,3423349383,DE +3423349384,3423349679,US +3423349680,3423349687,IL +3423349688,3423350663,US +3423350664,3423350671,AU +3423350672,3423350719,US +3423350720,3423350727,CA +3423350728,3423350735,US +3423350736,3423350743,SA +3423350744,3423351831,US +3423351832,3423351839,AU +3423351840,3423352047,US +3423352048,3423352063,GB +3423352064,3423352255,US +3423352256,3423352271,CA +3423352272,3423352439,US +3423352440,3423352447,IL +3423352448,3423352503,US +3423352504,3423352511,IL +3423352512,3423352679,US +3423352680,3423352687,NL +3423352688,3423353031,US +3423353032,3423353039,AU +3423353040,3423353143,US +3423353144,3423353151,KH +3423353152,3423353295,US +3423353296,3423353303,BR +3423353304,3423353351,US +3423353352,3423353367,PA +3423353368,3423353471,US +3423353472,3423353479,KH +3423353480,3423353543,US +3423353544,3423353551,IN +3423353552,3423353791,US +3423353792,3423353807,GB +3423353808,3423353919,US +3423353920,3423353927,BB +3423353928,3423354031,US +3423354032,3423354039,IL +3423354040,3423354047,US +3423354048,3423354063,PK +3423354064,3423354095,US +3423354096,3423354103,CA +3423354104,3423354143,US +3423354144,3423354207,CA +3423354208,3423354335,US +3423354336,3423354359,PE +3423354360,3423354583,US +3423354584,3423354591,AU +3423354592,3423354655,US +3423354656,3423354663,AE +3423354664,3423354783,US +3423354784,3423354791,PA +3423354792,3423357111,US +3423357112,3423357127,AE +3423357128,3423357311,US +3423357312,3423357319,CO +3423357320,3423357511,US +3423357512,3423357519,DE +3423357520,3423357527,CO +3423357528,3423363463,US +3423363464,3423363471,AU +3423363472,3423363487,CA +3423363488,3423363511,US +3423363512,3423363519,MX +3423363520,3423363567,US +3423363568,3423363583,ZA +3423363584,3423363615,US +3423363616,3423363631,AU +3423363632,3423365775,US +3423365776,3423365783,CA +3423365784,3423365903,US +3423365904,3423365911,AE +3423365912,3423366223,US +3423366224,3423366239,AU +3423366240,3423366351,US +3423366352,3423366367,AU +3423366368,3423366479,US +3423366480,3423366495,IT +3423366496,3423366703,US +3423366704,3423366711,GB +3423366712,3423366991,US +3423366992,3423366999,CA +3423367000,3423367223,US +3423367224,3423367231,AU +3423367232,3423367279,US +3423367280,3423367303,BR +3423367304,3423367311,AU +3423367312,3423367343,US +3423367344,3423367359,NL +3423367360,3423367367,US +3423367368,3423367375,GB +3423367376,3423367807,US +3423367808,3423367823,IT +3423367824,3423367831,US +3423367832,3423367847,MX +3423367848,3423367903,US +3423367904,3423367919,IL +3423367920,3423367983,US +3423367984,3423368007,CA +3423368008,3423368103,US +3423368104,3423368111,CA +3423368112,3423368143,US +3423368144,3423368167,IL +3423368168,3423368255,US +3423368256,3423368287,CA +3423368288,3423368319,US +3423368320,3423368327,CA +3423368328,3423369327,US +3423369328,3423369343,BR +3423369344,3423369591,US +3423369592,3423369599,BR +3423369600,3423369719,US +3423369720,3423369727,AU +3423369728,3423370303,US +3423370304,3423370319,IL +3423370320,3423370551,US +3423370552,3423370559,IE +3423370560,3423370719,US +3423370720,3423370727,VG +3423370728,3423370775,US +3423370776,3423370783,LB +3423370784,3423370871,US +3423370872,3423370879,VG +3423370880,3423371263,US +3423371264,3423375359,ZA +3423375360,3423379455,CA +3423379456,3423393903,US +3423393904,3423393911,RU +3423393912,3423396487,US +3423396488,3423396495,RU +3423396496,3423398839,US +3423398840,3423398847,RU +3423398848,3423400855,US +3423400856,3423400871,RU +3423400872,3423401079,US +3423401080,3423401087,RU +3423401088,3423401151,US +3423401152,3423401159,RU +3423401160,3423401183,US +3423401184,3423401191,RU +3423401192,3423402943,US +3423402944,3423402951,RU +3423402952,3423412223,US 3423412240,3423412255,GR 3423412256,3423412287,TK 3423412288,3423412319,RU -3423412320,3423412415,CA +3423412320,3423412335,CA 3423412416,3423412479,SA 3423412480,3423412495,CA 3423412496,3423412511,US -3423412512,3423412543,CA 3423412544,3423412623,FR 3423412624,3423412639,NO -3423412640,3423412655,CA 3423412656,3423412671,RU -3423412672,3423412703,CA +3423412688,3423412703,CA 3423412704,3423412719,RU 3423412720,3423412727,US -3423412728,3423412751,CA +3423412736,3423412751,CA 3423412752,3423412767,US 3423412768,3423412783,FI -3423412784,3423412799,CA 3423412800,3423412815,US 3423412816,3423412831,GR -3423412832,3423412847,CA 3423412848,3423412863,US -3423412864,3423412927,CA 3423412928,3423412991,NL -3423412992,3423413055,CA 3423413056,3423413071,US -3423413072,3423413151,CA +3423413072,3423413135,CA 3423413152,3423413167,US -3423413168,3423413183,CA 3423413184,3423413247,RS 3423413248,3423413279,US 3423413280,3423413295,SE -3423413296,3423413311,CA 3423413312,3423413327,PT 3423413328,3423413343,US -3423413344,3423413375,CA 3423413376,3423413759,US -3423413760,3423414143,CA +3423414016,3423414143,CA 3423414144,3423414159,FR -3423414160,3423414271,CA -3423414272,3423439871,US -3423440896,3423465471,US -3423467520,3423469567,US -3423471616,3423473663,US -3423473664,3423474687,CA -3423474688,3423493631,US -3423493632,3423493887,CA -3423493888,3423498239,US -3423500288,3423526911,US -3423528960,3423532031,US +3423414192,3423414207,US +3423414272,3423416319,US +3423417344,3423417470,US +3423417471,3423417480,AU +3423417481,3423417636,US +3423417637,3423417646,CA +3423417647,3423417715,US +3423417716,3423417725,BR +3423417726,3423417769,US +3423417770,3423417777,CA +3423417778,3423417954,US +3423417955,3423417964,GB +3423417965,3423417975,US +3423417976,3423417995,RO +3423417996,3423418172,US +3423418173,3423418180,JP +3423418181,3423462655,US +3423462656,3423462671,CA +3423462672,3423473663,US +3423473664,3423474655,CA +3423474656,3423474671,CY +3423474672,3423474687,CA +3423474688,3423479807,US +3423479808,3423480319,A2 +3423480320,3423480447,NG +3423480448,3423480527,A2 +3423480528,3423480543,US +3423480544,3423480575,A2 +3423480576,3423480831,DM +3423480832,3423480927,A2 +3423480928,3423480935,US +3423480936,3423480943,AO +3423480944,3423481007,A2 +3423481008,3423481023,US +3423481024,3423481039,NG +3423481040,3423481055,US +3423481056,3423481535,A2 +3423481536,3423481551,NG +3423481552,3423481855,A2 +3423481856,3423493631,US +3423493632,3423493887,RU +3423493888,3423493903,ID +3423493904,3423493911,ES +3423493912,3423493927,TT +3423493928,3423493967,US +3423493968,3423493975,AT +3423493976,3423498079,US +3423498080,3423498087,CA +3423498088,3423533055,US 3423533056,3423535103,AI -3423535104,3423543295,US -3423543296,3423545343,CA -3423545344,3423571967,US +3423535104,3423540087,US +3423540088,3423540095,HN +3423540096,3423540175,US +3423540176,3423540183,HN +3423540184,3423543295,US +3423543296,3423544495,CA +3423544496,3423544511,US +3423544512,3423544543,CA +3423544544,3423544551,US +3423544552,3423545343,CA +3423545344,3423549439,US +3423551488,3423554183,US +3423554184,3423554191,CA +3423554192,3423554271,US +3423554272,3423554279,GB +3423554280,3423554759,US +3423554760,3423554767,CA +3423554768,3423571967,US 3423571968,3423574015,PR 3423574016,3423582207,US -3423582208,3423586303,CA -3423586304,3423602687,US +3423582208,3423584343,CA +3423584344,3423584351,US +3423584352,3423584359,AU +3423584360,3423584367,CA +3423584368,3423584375,US +3423584376,3423584423,CA +3423584424,3423584431,US +3423584432,3423584447,CA +3423584448,3423584455,US +3423584456,3423584503,CA +3423584504,3423584511,US +3423584512,3423584687,CA +3423584688,3423584703,US +3423584704,3423584719,CA +3423584720,3423584735,US +3423584736,3423584751,CA +3423584752,3423584767,US +3423584768,3423585535,CA +3423585536,3423585551,IR +3423585552,3423585631,CA +3423585632,3423585647,US +3423585648,3423585807,CA +3423585808,3423585823,US +3423585824,3423585839,CA +3423585840,3423585847,US +3423585848,3423585879,CA +3423585880,3423585887,US +3423585888,3423585895,CA +3423585896,3423585903,NL +3423585904,3423585911,CA +3423585912,3423585919,ES +3423585920,3423585927,CA +3423585928,3423585935,NZ +3423585936,3423585999,CA +3423586000,3423586007,US +3423586008,3423586015,PA +3423586016,3423586031,US +3423586032,3423586039,NZ +3423586040,3423586159,CA +3423586160,3423586167,IR +3423586168,3423586303,CA +3423586304,3423589151,US +3423589152,3423589159,GB +3423589160,3423590871,US +3423590872,3423590879,HT +3423590880,3423591143,US +3423591144,3423591151,HN +3423591152,3423592599,US +3423592600,3423592607,ES +3423592608,3423592687,US +3423592688,3423592703,CA +3423592704,3423592739,US +3423592740,3423592755,CA +3423592756,3423592895,US +3423592896,3423592911,IL +3423592912,3423598719,US +3423598720,3423598783,CA +3423598784,3423600241,US +3423600242,3423600251,GB +3423600252,3423602687,US 3423602688,3423603711,KN -3423603712,3423626239,US +3423603712,3423604967,US +3423604968,3423604975,BZ +3423604976,3423626239,US 3423626240,3423627263,CA -3423627264,3423631359,US -3423632384,3423637503,US +3423627264,3423629311,US +3423632384,3423633407,A2 +3423633408,3423637503,US 3423637504,3423639551,CA 3423639552,3423651839,US -3423651840,3423653887,CA -3423654912,3423705599,US -3423705856,3423709183,US -3423709184,3423709439,CA -3423709440,3423718399,US -3423718656,3423731455,US -3423731712,3423797247,US -3423797504,3423801087,CA -3423801344,3423827711,CA +3423651840,3423651967,CA +3423651968,3423651999,US +3423652000,3423653887,CA +3423653888,3423797247,US +3423797248,3423827711,CA 3423827712,3423827967,US -3423827968,3423830271,CA -3423830528,3423838719,CA -3423838976,3423848447,CA -3423849984,3423850495,CA -3423850752,3423854335,CA -3423854592,3423858175,CA +3423827968,3423848447,CA +3423848448,3423849471,KN +3423849984,3423858175,CA 3423858176,3423858687,US -3423858688,3423858943,CA -3423859456,3423859711,CA -3423859968,3423862527,CA -3423862784,3424270591,US -3424272384,3424321279,US -3424321536,3424334847,US -3424337920,3424371967,US -3424372224,3424375295,US -3424375552,3424389631,US -3424391168,3424412415,US -3424419840,3424444159,US -3424452608,3424455423,US -3424456704,3424493823,US +3423858688,3423862783,CA +3423862784,3424334847,US +3424334848,3424335871,CA +3424335872,3424335903,US +3424335904,3424335911,CN +3424335912,3424335943,US +3424335944,3424335951,BY +3424335952,3424335983,US +3424335984,3424335991,GB +3424335992,3424336015,US +3424336016,3424336023,BY +3424336024,3424336087,US +3424336088,3424336111,CA +3424336112,3424336367,US +3424336368,3424336375,SE +3424336376,3424336495,US +3424336496,3424336511,CN +3424336512,3424336647,US +3424336648,3424336655,BY +3424336656,3424336703,US +3424336704,3424336711,SG +3424336712,3424336743,US +3424336744,3424336751,GB +3424336752,3424336775,US +3424336776,3424336783,BE +3424336784,3424336847,US +3424336848,3424336855,BR +3424336856,3424336871,US +3424336872,3424336879,IN +3424336880,3424337151,US +3424337152,3424337159,BY +3424337160,3424337175,US +3424337176,3424337183,SG +3424337184,3424337191,US +3424337192,3424337199,BY +3424337200,3424337255,US +3424337256,3424337263,IL +3424337264,3424337271,MX +3424337272,3424378879,US +3424378880,3424379135,PR +3424379136,3424493823,US 3424493824,3424494079,CA 3424494080,3424494335,US -3424494592,3424496383,US -3424496640,3424499967,US -3424500224,3424500991,US -3424501248,3424502015,US -3424502272,3424502783,US -3424503296,3424505599,US -3424505856,3424507135,US -3424507392,3425173503,US +3424494592,3425173503,US 3425173504,3425304575,CA -3425304576,3425439487,US -3425439744,3425450239,US -3425452032,3425470975,US -3425472512,3425475839,US -3425476608,3425483775,US -3425484800,3425501183,US -3425566720,3425697791,US +3425304576,3425697791,US 3425697792,3425699839,CA -3425699840,3425705983,US -3425706752,3425708287,US -3425709824,3425711359,US -3425713408,3425728255,US -3425730560,3425828863,US -3425828864,3425855231,CA +3425699840,3425828863,US +3425828864,3425830815,CA +3425830816,3425830831,US +3425830832,3425855231,CA 3425855232,3425855487,US -3425855488,3425894399,CA -3425894400,3425910783,US -3425959936,3425962495,US -3425964032,3425984511,US -3425992704,3426010111,US -3426010368,3426012671,US -3426012928,3426013183,US +3425855488,3425869167,CA +3425869168,3425869183,US +3425869184,3425875391,CA +3425875392,3425875407,US +3425875408,3425894399,CA +3425894400,3425912815,US +3425912816,3425912831,DO +3425912832,3425914159,US +3425914160,3425914239,A2 +3425914240,3425915807,US +3425915808,3425915823,NI +3425915824,3425916479,US +3425916480,3425916543,DK +3425916544,3426013183,US 3426013184,3426013439,IL -3426013440,3426019327,US -3426019584,3426369023,US -3426369536,3426386687,US -3426386944,3426387711,US +3426013440,3426387967,US 3426387968,3426388991,MX -3426388992,3426390783,US -3426391040,3426411519,US -3426412544,3426415615,US -3426415872,3426416895,US -3426417152,3426418175,US -3426418688,3426553343,US -3426553856,3426557439,US -3426557952,3426602751,US -3426603008,3426605567,US -3426607104,3426617855,US -3426619392,3426622463,US -3426623488,3426628607,US -3426631680,3426644479,US -3426648064,3426653695,US -3426654208,3426680831,US -3426684928,3426714879,US -3426715648,3426725375,US -3426725888,3426729471,US -3426729984,3426735359,US -3426736128,3426738175,US -3426740224,3426744319,US -3426746368,3427033087,US -3427041280,3427055615,US -3427055872,3427061503,US -3427061760,3427073535,US -3427074048,3427110911,US -3427111168,3427112959,US -3427113216,3427113471,US -3427113984,3427116543,US -3427117312,3427127295,US +3426388992,3426646015,US +3426646016,3426647039,CA +3426647040,3426744319,US +3426744320,3426746367,CA +3426746368,3427127295,US 3427127296,3427127551,CA 3427127552,3427127807,US 3427128064,3427128831,US -3427129344,3427134207,US -3427134464,3427136511,US -3427137024,3427139327,US -3427139584,3427404287,US -3427405824,3427454719,US -3427467264,3427470079,US -3427471360,3427503103,US -3427503360,3427503871,US -3427504640,3427507455,US -3427507968,3427511295,US -3427511808,3427540223,US -3427540992,3427567103,US -3427567616,3427572991,US -3427573248,3427582975,US -3427583488,3427584767,US -3427585536,3427586815,US -3427587584,3427589119,US -3427589632,3427597823,US -3427598336,3427605247,US -3427606528,3427632639,US -3427634176,3427635455,US -3427635712,3427636223,US -3427636736,3427636991,US -3427637248,3427637503,US -3427637760,3427639551,US -3427640320,3427641343,US -3427641856,3427642111,US -3427642368,3427646719,US -3427646976,3427647743,US -3427648768,3427649279,US -3427649536,3427651071,US -3427651328,3427652607,US -3427653376,3427653631,US -3427654144,3427655167,US -3427663872,3427742975,US -3427742976,3427743231,GB -3427743232,3427762175,US +3427129344,3427618303,US +3427618304,3427618559,CA +3427618560,3427729407,US +3427729408,3427729663,CA +3427729664,3427730431,US +3427730432,3427730687,BE +3427730688,3427730943,DE +3427730944,3427731967,US +3427731968,3427732223,DE +3427732224,3427732479,US +3427732480,3427732735,CH +3427732736,3427735039,IE +3427735040,3427735295,US +3427735296,3427736063,HK +3427736064,3427736319,GB +3427736320,3427741951,US +3427741952,3427742463,DE +3427742464,3427742719,AT +3427742720,3427742975,CH +3427742976,3427743487,GB +3427743488,3427743743,DE +3427743744,3427743999,CA +3427744000,3427744255,SE +3427744256,3427745279,DE +3427745280,3427745791,TW +3427745792,3427746047,GB +3427746048,3427746303,DK +3427746304,3427746559,US +3427746560,3427746815,JP +3427746816,3427747071,DE +3427747072,3427747327,US +3427747328,3427747583,DE +3427747584,3427747839,US +3427747840,3427748095,NO +3427748096,3427748351,CH +3427748352,3427748607,JP +3427748608,3427749631,DE +3427749632,3427749887,NL +3427749888,3427750655,DE +3427750656,3427750911,GB +3427750912,3427751423,US +3427751424,3427751519,BE +3427751520,3427752447,US +3427752448,3427752703,NL +3427752704,3427752959,GB +3427752960,3427753215,US +3427753216,3427753471,JP +3427753472,3427753727,FI +3427753728,3427753983,IT +3427753984,3427754239,CH +3427754240,3427754495,GB +3427754496,3427754751,DE +3427754752,3427755007,CA +3427755008,3427755263,IT +3427755264,3427755519,US +3427755520,3427755775,DE +3427755776,3427756287,BE +3427756288,3427756543,AU +3427756544,3427756799,DE +3427756800,3427757055,US +3427757056,3427757311,GR +3427757312,3427757567,FR +3427757568,3427757823,JP +3427757824,3427758079,DE +3427758080,3427758591,BE +3427758592,3427758847,IT +3427758848,3427759103,US +3427759104,3427759359,BE +3427759360,3427759871,GB +3427759872,3427760127,US +3427760128,3427760895,CA +3427760896,3427761663,US +3427761664,3427761919,JP +3427761920,3427762175,US 3427762176,3427762431,DE 3427762432,3427762687,CA 3427762688,3427763455,IT @@ -64046,7 +101163,8 @@ 3427779072,3427779327,GB 3427779328,3427780095,US 3427780096,3427780351,GB -3427780352,3427781375,US +3427780352,3427780863,DE +3427780864,3427781375,US 3427781376,3427781631,GB 3427781632,3427781887,BE 3427781888,3427782399,US @@ -64071,98 +101189,192 @@ 3427791104,3427791615,DE 3427791616,3427791871,GB 3427791872,3427792383,CA -3427792384,3427793919,NL +3427792384,3427792639,NL +3427792640,3427793407,SG +3427793408,3427793919,HK 3427793920,3427794175,US 3427794176,3427794943,NL -3427796992,3427811327,US -3427811584,3427816959,US -3427819520,3427831551,US +3427794944,3427796991,CA +3427796992,3427831551,US 3427831552,3427831807,MX -3427831808,3427835647,US -3427835904,3427848959,US -3427849216,3427860479,US -3427860480,3428057087,CA -3428057088,3428191487,US -3428192256,3428217855,US -3428218880,3428221439,US -3428222976,3428237823,US -3428239360,3428251903,US -3428253696,3428286719,US +3427831808,3427860479,US +3427860480,3428025343,CA +3428025344,3428025855,US +3428025856,3428057087,CA +3428057088,3428286719,US 3428286720,3428286975,CA -3428286976,3428290047,US -3428290304,3428296959,US +3428286976,3428296959,US 3428296960,3428297215,CL -3428297472,3428297983,US -3428298240,3428299519,US -3428299776,3428302079,US -3428302336,3428306175,US +3428297472,3428299519,US +3428299520,3428299775,ZA +3428299776,3428306175,US 3428306176,3428306431,MX -3428306432,3428310527,US -3428310784,3428311039,US -3428311296,3428318975,US -3428319232,3428326399,US -3428327424,3428367871,US -3428368384,3428391679,US -3428392960,3428398079,US -3428399104,3428399359,US -3428401152,3428421375,US -3428421632,3428423679,US -3428423936,3428433919,US -3428434176,3428434943,US -3428434944,3428435199,IT -3428435200,3428437503,US +3428306432,3428437503,US 3428437504,3428437759,MX -3428437760,3428440575,US -3428440832,3428442367,US -3428442624,3428445695,US -3428445952,3428452863,US -3428454400,3428463615,US -3428466688,3428471807,US -3428472064,3428472831,US -3428473088,3428475391,US -3428475648,3428477439,US -3428477696,3428496639,US +3428437760,3428496639,US 3428496640,3428497151,NL -3428497152,3428582655,US +3428497152,3428581375,US +3428581376,3428581567,CA +3428581568,3428581695,US +3428581696,3428581759,CA +3428581760,3428581823,US +3428581824,3428581887,CA +3428581888,3428581951,US +3428581952,3428582231,CA +3428582232,3428582239,US +3428582240,3428582279,CA +3428582280,3428582287,DK +3428582288,3428582303,CA +3428582304,3428582311,US +3428582312,3428582319,CA +3428582320,3428582327,US +3428582328,3428582399,CA +3428582400,3428582655,US 3428582656,3428582911,CA -3428582912,3428585023,US -3428585024,3428585055,CA -3428585056,3428585151,US -3428585152,3428585215,CA -3428585216,3428586751,US +3428582912,3428583167,US +3428583168,3428583231,CA +3428583232,3428583359,US +3428583360,3428583455,CA +3428583456,3428583487,US +3428583488,3428583551,CA +3428583552,3428583583,US +3428583584,3428583743,CA +3428583744,3428583871,US +3428583872,3428583935,CA +3428583936,3428584127,US +3428584128,3428584191,CA +3428584192,3428584511,US +3428584512,3428584703,CA +3428584704,3428584767,US +3428584768,3428584895,CA +3428584896,3428584959,US +3428584960,3428585471,CA +3428585472,3428585599,US +3428585600,3428585727,CA +3428585728,3428585983,US +3428585984,3428586495,CA +3428586496,3428586751,US 3428586752,3428586879,CA -3428586880,3428591631,US -3428591632,3428591647,CA -3428591648,3428591655,US -3428591656,3428591663,CA -3428591664,3428594687,US -3428594688,3428594943,CA -3428594944,3428595551,US -3428595552,3428595583,CA -3428595584,3428598527,US -3428598528,3428598559,CA -3428598560,3428599551,US -3428599552,3428599807,CA -3428599808,3428600063,US -3428600064,3428600319,CA -3428600320,3428601343,US -3428601344,3428601599,CA -3428601600,3428607999,US +3428586880,3428587007,US +3428587008,3428587519,CA +3428587520,3428587775,US +3428587776,3428588287,CA +3428588288,3428588543,US +3428588544,3428589055,CA +3428589056,3428591623,US +3428591624,3428591663,CA +3428591664,3428591679,US +3428591680,3428591695,CA +3428591696,3428591831,US +3428591832,3428591847,CA +3428591848,3428591871,US +3428591872,3428592135,CA +3428592136,3428592151,US +3428592152,3428592191,CA +3428592192,3428592207,US +3428592208,3428592247,CA +3428592248,3428592255,US +3428592256,3428592271,CA +3428592272,3428592343,US +3428592344,3428593663,CA +3428593664,3428593919,US +3428593920,3428594303,CA +3428594304,3428594431,US +3428594432,3428594495,CA +3428594496,3428594623,US +3428594624,3428595199,CA +3428595200,3428595215,US +3428595216,3428595247,CA +3428595248,3428595455,US +3428595456,3428595743,CA +3428595744,3428595807,US +3428595808,3428595871,CA +3428595872,3428595903,US +3428595904,3428595967,CA +3428595968,3428596095,US +3428596096,3428596783,CA +3428596784,3428596791,US +3428596792,3428596799,CA +3428596800,3428596815,US +3428596816,3428596823,CA +3428596824,3428596831,US +3428596832,3428596839,CA +3428596840,3428596847,US +3428596848,3428596887,CA +3428596888,3428596895,US +3428596896,3428596991,CA +3428596992,3428597247,US +3428597248,3428597511,CA +3428597512,3428597519,US +3428597520,3428597551,CA +3428597552,3428597559,US +3428597560,3428597575,CA +3428597576,3428597583,US +3428597584,3428597623,CA +3428597624,3428597631,US +3428597632,3428597655,CA +3428597656,3428597663,US +3428597664,3428597727,CA +3428597728,3428597759,US +3428597760,3428598271,CA +3428598272,3428598527,US +3428598528,3428598687,CA +3428598688,3428598719,US +3428598720,3428598751,CA +3428598752,3428598783,US +3428598784,3428599103,CA +3428599104,3428599231,US +3428599232,3428599295,CA +3428599296,3428599551,US +3428599552,3428601599,CA +3428601600,3428602111,US +3428602112,3428602367,CA +3428602368,3428602623,US +3428602624,3428602687,CA +3428602688,3428602719,US +3428602720,3428602847,CA +3428602848,3428603135,US +3428603136,3428603199,CA +3428603200,3428603263,US +3428603264,3428603327,CA +3428603328,3428603391,US +3428603392,3428603519,CA +3428603520,3428603903,US +3428603904,3428605183,CA +3428605184,3428605695,US +3428605696,3428605823,CA +3428605824,3428605855,US +3428605856,3428606023,CA +3428606024,3428606031,US +3428606032,3428606039,CA +3428606040,3428606111,US +3428606112,3428606119,CA +3428606120,3428606207,US +3428606208,3428606271,CA +3428606272,3428606367,US +3428606368,3428606383,CA +3428606384,3428606415,US +3428606416,3428606431,CA +3428606432,3428606463,US +3428606464,3428606559,CA +3428606560,3428606655,US +3428606656,3428606687,CA +3428606688,3428606911,US +3428606912,3428606975,IS +3428606976,3428607743,US +3428607744,3428607871,CA +3428607872,3428607999,US 3428608000,3428609023,CA -3428609024,3428610815,US -3428610816,3428611071,CA -3428611072,3428612607,US -3428612608,3428612863,CA -3428612864,3428613119,US -3428613120,3428613631,CA -3428613632,3428614143,US -3428614144,3428619263,CA -3428619264,3428619519,US -3428619520,3428620095,CA +3428609024,3428610303,US +3428610304,3428611071,CA +3428611072,3428611583,US +3428611584,3428611839,CA +3428611840,3428612607,US +3428612608,3428613887,CA +3428613888,3428614143,US +3428614144,3428620095,CA 3428620096,3428620287,US -3428620288,3428620799,CA -3428620800,3428621055,US -3428621056,3428621887,CA +3428620288,3428621887,CA 3428621888,3428622047,US 3428622048,3428622095,CA 3428622096,3428622335,US @@ -64171,20 +101383,63 @@ 3428623872,3428624639,CA 3428624640,3428625407,US 3428625408,3428627199,CA -3428627200,3428634879,US +3428627200,3428630015,US +3428630016,3428634623,CA +3428634624,3428634879,US 3428634880,3428635135,CA -3428635136,3428635903,US -3428635904,3428636927,CA -3428636928,3428637439,US -3428637440,3428637951,CA -3428637952,3428638975,US -3428638976,3428639231,CA -3428639232,3428642047,US -3428642048,3428642303,CA -3428642304,3428679679,US -3428712448,3428739327,US +3428635136,3428635391,US +3428635392,3428635679,CA +3428635680,3428635711,US +3428635712,3428635775,CA +3428635776,3428635871,US +3428635872,3428636927,CA +3428636928,3428636991,US +3428636992,3428637055,CA +3428637056,3428637119,US +3428637120,3428637215,CA +3428637216,3428637247,US +3428637248,3428637375,CA +3428637376,3428637407,US +3428637408,3428638015,CA +3428638016,3428638079,US +3428638080,3428638143,CA +3428638144,3428638207,US +3428638208,3428638591,CA +3428638592,3428638719,US +3428638720,3428639487,CA +3428639488,3428640255,US +3428640256,3428640511,CA +3428640512,3428640767,US +3428640768,3428643327,CA +3428643328,3428643583,US +3428643584,3428643855,CA +3428643856,3428643871,US +3428643872,3428643903,CA +3428643904,3428643919,US +3428643920,3428643935,CA +3428643936,3428643951,US +3428643952,3428644015,CA +3428644016,3428644047,US +3428644048,3428644063,CA +3428644064,3428644351,US +3428644352,3428645631,CA +3428645632,3428645695,US +3428645696,3428645759,CA +3428645760,3428645791,US +3428645792,3428645855,CA +3428645856,3428645887,US +3428645888,3428645951,CA +3428645952,3428646015,US +3428646016,3428646079,CA +3428646080,3428646143,US +3428646144,3428646911,CA +3428646912,3428739327,US 3428739328,3428739343,GB -3428739344,3428752383,US +3428739344,3428743167,US +3428743168,3428744191,CA +3428744192,3428751103,US +3428751104,3428751231,PR +3428751232,3428752383,US 3428752384,3428753407,GH 3428753408,3428756479,US 3428756480,3428756487,SE @@ -64196,54 +101451,21 @@ 3428958208,3428962303,CO 3428962304,3429171199,US 3429171200,3429236735,CA -3429236736,3429396223,US +3429236736,3429381887,US +3429381888,3429382143,DE +3429382144,3429396223,US 3429396224,3429396479,DE 3429396480,3429408511,US 3429408512,3429408767,DE 3429408768,3429411583,US 3429411584,3429411839,DE 3429411840,3429500927,US -3429502976,3429557247,US -3429564416,3429566975,US -3429568512,3429571071,US -3429572608,3429580799,US -3429581056,3429583103,US -3429583360,3429583615,US -3429583872,3429587199,US -3429587456,3429588223,US -3429588480,3429593855,US -3429594112,3429595647,US -3429595904,3429601535,US -3429601792,3429603071,US -3429603328,3429616639,US -3429616896,3429619711,US -3429619968,3429632767,US -3429634048,3429636607,US -3429638144,3429698815,US -3429699584,3429708799,US -3429711872,3429763071,US -3429765120,3429774335,US -3429777408,3429808639,US -3429810176,3429816831,US -3429818368,3429892095,US +3429500928,3429502975,A2 +3429502976,3429775359,US +3429775360,3429777407,TC +3429777408,3429892095,US 3429892096,3429957631,CA -3429957632,3430025471,US -3430027264,3430029311,US -3430031360,3430090239,US -3430090752,3430092287,US -3430092800,3430094335,US -3430094848,3430104575,US -3430105088,3430110975,US -3430111232,3430114559,US -3430115328,3430116863,US -3430117376,3430118655,US -3430119424,3430120959,US -3430121472,3430127103,US -3430127616,3430137343,US -3430137856,3430141439,US -3430141952,3430147839,US -3430148096,3430153727,US -3430154240,3430291295,US +3429957632,3430291295,US 3430291296,3430291327,IS 3430291328,3430313967,US 3430313968,3430313983,CA @@ -64253,168 +101475,181 @@ 3430328832,3430329087,GH 3430329088,3430354943,US 3430354944,3430356991,PR -3430356992,3430681343,US -3430681600,3430682367,US -3430682624,3430683391,US -3430683648,3430699775,US -3430700032,3430700799,US +3430356992,3430468607,US +3430468608,3430468863,AQ +3430468864,3430468871,PR +3430468872,3430701055,US 3430701056,3430702079,CA -3430702080,3430702847,US -3430703104,3430703871,US -3430704128,3430705151,US +3430702080,3430705151,US 3430705152,3430706175,MX -3430706176,3430707967,US -3430708224,3430715135,US -3430715392,3430719231,US -3430719488,3430721279,US -3430721536,3430722303,US -3430722560,3430724607,US -3430725632,3430727423,US -3430727680,3430730495,US -3430730752,3430734591,US -3430734848,3430738687,US -3430738944,3430739711,US -3430739968,3430742783,US -3430743040,3430812159,US +3430706176,3430747903,US +3430747904,3430748159,CA +3430748160,3430749951,US +3430749952,3430750207,CA +3430750208,3430767615,US +3430767616,3430768383,CA +3430768384,3430768895,US +3430768896,3430769151,CA +3430769152,3430769407,US +3430769408,3430769663,CA +3430769664,3430770943,US +3430770944,3430771199,CA +3430771200,3430771711,US +3430771712,3430772223,CA +3430772224,3430773247,US +3430773248,3430773503,CA +3430773504,3430774271,US +3430774272,3430774527,CA +3430774528,3430777343,US +3430777344,3430777599,CA +3430777600,3430777855,US +3430777856,3430778111,CA +3430778112,3430778623,US +3430778624,3430778879,CA +3430778880,3430779903,US +3430779904,3430780159,CA +3430780160,3430780671,US +3430780672,3430780927,CA +3430780928,3430782463,US +3430782464,3430782719,CA +3430782720,3430793983,US +3430793984,3430794239,PR +3430794240,3430795007,US +3430795008,3430795263,CA +3430795264,3430797823,US +3430797824,3430798079,CA +3430798080,3430805759,US +3430805760,3430806015,CA +3430806016,3430807295,US +3430807296,3430807551,CA +3430807552,3430809087,US +3430809088,3430809343,CA +3430809344,3430812159,US 3430812672,3430813183,MX -3430813184,3430814207,US -3430814720,3430828287,US -3430828544,3430836735,US -3430837248,3430842367,US +3430813184,3430842367,US 3430842368,3430842879,DO 3430842880,3430845439,US 3430845440,3430845951,MX -3430845952,3430849535,US -3430850048,3430861823,US -3430862336,3430953983,US -3430957056,3430977791,US -3430978304,3430993151,US -3430993408,3430994431,US -3430994688,3431005183,US -3431005440,3431107583,US -3431107840,3431114495,US +3430845952,3431114495,US 3431114496,3431114751,CA -3431114752,3431133183,US -3431133440,3431399423,US -3431464960,3431467519,US -3431469056,3431537151,US -3431538688,3431596031,US -3431596288,3431602687,CA -3431602944,3431613439,CA +3431114752,3431467519,US +3431468032,3431469055,CA +3431469056,3431596031,US +3431596032,3431613439,CA 3431613440,3431613695,US -3431613696,3431620095,CA -3431620352,3431621375,CA -3431622400,3431622655,CA -3431622912,3431624703,CA -3431624960,3431625215,CA -3431625472,3431638783,CA -3431639040,3431641855,CA -3431642624,3431657471,CA -3431658496,3431661311,CA -3431661568,3431674879,US -3431677952,3431733759,US -3431735296,3431753727,US -3431753728,3431759615,CA -3431759616,3431992319,US -3431993344,3432003839,US +3431613696,3431657471,CA +3431657472,3431658495,US +3431658496,3431661567,CA +3431661568,3431745023,US +3431745024,3431745279,BE +3431745280,3431745791,US +3431745792,3431746047,GB +3431746048,3431746559,US +3431746560,3431746815,DE +3431746816,3431747071,US +3431747072,3431747327,LU +3431747328,3431748607,US +3431748608,3431749119,FR +3431749120,3431752703,IT +3431752704,3431753215,US +3431753216,3431753471,SG +3431753472,3431755007,CA +3431755008,3431759615,NL +3431759616,3431759871,DE +3431759872,3431783431,US +3431783432,3431783435,NL +3431783436,3432003839,US +3432004608,3432005631,CA 3432005632,3432009215,US 3432009216,3432009471,PR -3432009472,3432019455,US -3432022016,3432071167,US -3432085248,3432085503,US -3432087552,3432095231,US -3432095488,3432099839,US -3432100096,3432106239,US +3432009472,3432106239,US 3432106240,3432106495,MX -3432106496,3432108543,US -3432108800,3432110847,US -3432111104,3432112639,US -3432112896,3432113407,US +3432106496,3432113407,US 3432113408,3432113663,CA -3432113664,3432116479,US -3432116736,3432205311,US -3432206336,3432237567,US -3432239104,3432513535,US -3432514048,3432515071,US -3432515584,3432517119,US -3432517632,3432518143,US -3432518656,3432519167,US -3432519680,3432520703,US +3432113664,3432133887,US +3432133888,3432134143,GB +3432134144,3432205311,US +3432205312,3432206335,CA +3432206336,3432253439,US +3432253440,3432253951,CA +3432253952,3432265983,US +3432265984,3432267263,DE +3432267264,3432280063,US +3432280064,3432280319,GB +3432280320,3432324607,US +3432324608,3432324863,CA +3432324864,3432329215,US +3432329216,3432330239,DE +3432330240,3432361983,US +3432361984,3432366079,DE +3432366080,3432476415,US +3432476416,3432476671,DE +3432476672,3432493823,US +3432493824,3432495103,DE +3432495104,3432517119,US +3432517120,3432517631,NA +3432517632,3432520703,US 3432520704,3432520959,GB -3432520960,3432523263,US -3432523776,3432526335,US -3432526848,3432536575,US -3432538112,3432538879,US -3432539136,3432540415,US -3432540672,3432550911,US -3432551424,3432551935,US -3432552448,3432559615,US -3432560640,3432562687,US -3432572928,3432574975,US -3432579072,3432580863,US -3432581120,3432585215,US +3432520960,3432571647,US +3432571648,3432571903,CA +3432571904,3432572799,US +3432572800,3432572927,DO +3432572928,3432585215,US 3432585216,3432585727,MX -3432586240,3432588031,US -3432588288,3432589055,US -3432589312,3432593151,US -3432593408,3432596223,US -3432596480,3432604671,US -3432605952,3432610559,US -3432610816,3432613631,US -3432613888,3432614655,US -3432614912,3432615679,US -3432615936,3432634111,US -3432634368,3432635135,US -3432636416,3432660991,US +3432586240,3432660991,US 3432660992,3432662527,DE 3432662528,3432662531,PT 3432662532,3432663039,DE -3432663040,3432668671,US -3432669184,3432670719,US -3432671232,3432672511,US -3432673280,3432675583,US -3432677376,3432680703,US -3432681472,3432683263,US -3432683520,3432688895,US -3432689664,3432703231,US -3432704000,3432706047,US -3432708096,3432716799,US -3432718336,3432725503,US -3432726528,3432734463,US -3432734720,3432806655,US -3432808448,3433955327,US -3433955584,3433964799,CA -3433965056,3433967359,CA -3433967616,3433981951,CA -3433984000,3434012671,CA -3434012928,3434014719,CA -3434015232,3434020607,CA -3434020864,3434299391,US -3434299392,3434303487,VE -3434303488,3434423295,US +3432663040,3432806655,US +3432807424,3432808447,CA +3432808448,3433581312,US +3433581313,3433581567,CA +3433581568,3433955327,US +3433955328,3433981951,CA +3433981952,3433983999,US +3433984000,3434020863,CA +3434020864,3434096063,US +3434096064,3434096079,AU +3434096080,3434097919,US +3434097920,3434097983,GB +3434097984,3434108639,US +3434108640,3434108671,IL +3434108672,3434112239,US +3434112240,3434112255,IN +3434112256,3434117631,US +3434117632,3434117695,CA +3434117696,3434133551,US +3434133552,3434133567,IL +3434133568,3434133759,US +3434133760,3434133791,IL +3434133792,3434134015,US +3434134016,3434134079,CA +3434134080,3434423295,US 3434423296,3434423303,CA 3434423304,3434427391,US 3434427392,3434428415,HN 3434428416,3434433279,US 3434433280,3434433535,PR -3434433536,3434571775,US +3434433536,3434553343,US +3434553344,3434553599,ES +3434553600,3434571775,US 3434571776,3434573823,CO -3434573824,3434583039,US +3434573824,3434575359,US +3434575360,3434575615,BR +3434575616,3434583039,US 3434583040,3434584063,NL 3434584064,3434807295,US -3434807552,3434810111,CA -3434811392,3434824191,CA -3434824448,3434831359,CA +3434807296,3434831359,CA 3434831360,3434831615,US -3434831616,3434872575,CA +3434831616,3434872831,CA 3434872832,3434907647,US 3434907648,3434909695,PA 3434909696,3434913791,US 3434913792,3434914047,AG 3434914048,3434914303,DM -3434914304,3434914815,AG -3434914816,3434915071,VG -3434915072,3434915327,AG +3434914304,3434914559,VG +3434914560,3434914815,AG +3434914816,3434915327,VG 3434915328,3434915583,DM 3434915584,3434915839,KN 3434915840,3434916095,LC @@ -64423,50 +101658,104 @@ 3434916608,3434917119,AG 3434917120,3434917375,LC 3434917376,3434917887,AG -3434917888,3434921983,US -3434938368,3435069439,US +3434917888,3435069439,US 3435069440,3435134975,CA -3435134976,3435267839,US -3435268096,3435271423,US -3435272192,3435294463,US -3435294720,3435319039,US -3435319296,3435320831,US -3435321344,3435322879,US -3435323392,3435325439,US -3435327488,3435331583,US -3435397120,3435462655,US -3435528192,3436249087,US -3436249344,3436255743,CA -3436256256,3436282367,CA +3435134976,3436249087,US +3436249088,3436282367,CA 3436282368,3436282623,US 3436282624,3436289791,CA 3436289792,3436290047,US -3436290048,3436314367,CA +3436290048,3436314623,CA 3436314624,3436476415,US 3436476416,3436478463,AW 3436478464,3436697087,US 3436697088,3436697343,VE -3436697344,3437297663,US -3437297920,3437307391,CA -3437307904,3437331711,CA +3436697344,3437232383,US +3437232384,3437232639,CA +3437232640,3437242879,US +3437242880,3437243135,CA +3437243136,3437249279,US +3437249280,3437249535,CA +3437249536,3437259775,US +3437259776,3437260031,CA +3437260032,3437262079,US +3437262080,3437262335,CA +3437262336,3437263615,US +3437263616,3437263871,CA +3437263872,3437266431,US +3437266432,3437266687,CA +3437266688,3437279487,US +3437279488,3437279743,CA +3437279744,3437281279,US +3437281280,3437281535,CA +3437281536,3437292799,US +3437292800,3437293055,CA +3437293056,3437296639,US +3437296640,3437296895,CA +3437296896,3437297663,US +3437297664,3437310975,CA +3437310976,3437311487,US +3437311488,3437331711,CA 3437331712,3437331967,US -3437331968,3437332479,CA -3437332736,3437334015,CA +3437331968,3437334015,CA 3437334016,3437334271,US -3437334272,3437336063,CA -3437336320,3437341695,CA +3437334272,3437341695,CA 3437341696,3437341951,US -3437341952,3437343231,CA -3437343488,3437346303,CA -3437346560,3437350911,CA -3437351424,3437354751,CA -3437355008,3437358847,CA +3437341952,3437358847,CA 3437358848,3437359103,US -3437359104,3437362943,CA -3437363200,3437428735,CA -3437428736,3437715711,US +3437359104,3437428735,CA +3437428736,3437691391,US +3437691392,3437691647,HK +3437691648,3437691903,JP +3437691904,3437692415,FR +3437692416,3437692671,US +3437692672,3437693439,CA +3437693440,3437693695,HK +3437693696,3437693951,NO +3437693952,3437694207,ES +3437694208,3437695231,AT +3437695232,3437695999,HK +3437696000,3437696767,NL +3437696768,3437702911,US +3437702912,3437703167,HK +3437703168,3437703423,US +3437703424,3437703679,NL +3437703680,3437703935,ES +3437703936,3437704191,US +3437704192,3437704703,CH +3437704704,3437706495,US +3437706496,3437706751,CH +3437706752,3437707263,US +3437707264,3437707519,DE +3437707520,3437707775,US +3437707776,3437708031,FR +3437708032,3437708287,US +3437708288,3437708799,FI +3437708800,3437709311,CA +3437709312,3437709823,FR +3437709824,3437710079,US +3437710080,3437710335,GB +3437710336,3437712639,US +3437712640,3437713663,GB +3437713664,3437715199,US +3437715200,3437715455,DE +3437715456,3437715711,JP 3437715712,3437715967,IT -3437715968,3437736447,US +3437715968,3437716991,DE +3437716992,3437717247,US +3437717248,3437718527,BE +3437718528,3437720063,US +3437720064,3437723135,SG +3437723136,3437725183,US +3437725184,3437725695,MN +3437725696,3437726207,DE +3437726208,3437726463,US +3437726464,3437726975,GB +3437726976,3437731583,US +3437731584,3437731615,AF +3437731616,3437734399,US +3437734400,3437734655,SG +3437734656,3437736447,US 3437736448,3437737471,CL 3437737472,3437748223,US 3437748224,3437748479,GB @@ -64488,28 +101777,200 @@ 3437755904,3437756159,US 3437756160,3437756415,IE 3437756416,3437772799,US -3437821952,3437961215,US -3437965312,3437968383,US -3437969408,3437979903,US -3437981696,3437984255,US -3437985792,3437989375,US -3437989888,3438006271,US -3438010368,3438026751,US -3438149632,3438160895,US -3438161152,3438200063,US -3438200576,3438214655,US -3438214912,3438215167,US -3438215424,3438215935,CA -3438216192,3438217983,CA +3437772800,3437776895,CA +3437776896,3437789863,US +3437789864,3437789871,AU +3437789872,3437790143,US +3437790144,3437790159,CA +3437790160,3437790215,US +3437790216,3437790223,AU +3437790224,3437790615,US +3437790616,3437790623,GB +3437790624,3437790735,US +3437790736,3437790743,SE +3437790744,3437791199,US +3437791200,3437791207,CO +3437791208,3437791647,US +3437791648,3437791663,CA +3437791664,3437791935,US +3437791936,3437791999,AU +3437792000,3437792031,US +3437792032,3437792063,AU +3437792064,3437792279,US +3437792280,3437792287,SE +3437792288,3437792415,US +3437792416,3437792423,AU +3437792424,3437792735,US +3437792736,3437792743,CA +3437792744,3437792775,US +3437792776,3437792783,CA +3437792784,3437793279,US +3437793280,3437793535,BD +3437793536,3437793727,US +3437793728,3437793791,BD +3437793792,3437794647,US +3437794648,3437794655,GB +3437794656,3437794831,US +3437794832,3437794839,ID +3437794840,3437794879,US +3437794880,3437794887,CA +3437794888,3437795103,US +3437795104,3437795111,IN +3437795112,3437795247,US +3437795248,3437795255,CA +3437795256,3437795303,US +3437795304,3437795311,BD +3437795312,3437795807,US +3437795808,3437795815,AR +3437795816,3437795919,US +3437795920,3437795927,TH +3437795928,3437796919,US +3437796920,3437796935,ES +3437796936,3437799303,US +3437799304,3437799311,CA +3437799312,3437799359,US +3437799360,3437799367,IN +3437799368,3437799439,US +3437799440,3437799447,CA +3437799448,3437799471,US +3437799472,3437799479,CA +3437799480,3437799599,US +3437799600,3437799607,MX +3437799608,3437799663,US +3437799664,3437799671,GB +3437799672,3437799775,US +3437799776,3437799783,CA +3437799784,3437799791,US +3437799792,3437799799,IN +3437799800,3437799871,US +3437799872,3437799879,CA +3437799880,3437800031,US +3437800032,3437800039,AU +3437800040,3437800215,US +3437800216,3437800223,CN +3437800224,3437800231,US +3437800232,3437800239,CA +3437800240,3437800767,US +3437800768,3437800783,CA +3437800784,3437800831,US +3437800832,3437800847,PH +3437800848,3437800959,US +3437800960,3437800975,FR +3437800976,3437801695,US +3437801696,3437801703,AU +3437801704,3437801727,US +3437801728,3437801735,CO +3437801736,3437801743,CA +3437801744,3437802039,US +3437802040,3437802047,BR +3437802048,3437802207,US +3437802208,3437802223,BR +3437802224,3437802495,US +3437802496,3437802503,GB +3437802504,3437802559,US +3437802560,3437802567,SA +3437802568,3437802727,US +3437802728,3437802735,AR +3437802736,3437802743,GB +3437802744,3437802791,US +3437802792,3437802799,CA +3437802800,3437802823,GB +3437802824,3437802879,US +3437802880,3437802887,GB +3437802888,3437803055,US +3437803056,3437803071,EC +3437803072,3437803319,US +3437803320,3437803327,CA +3437803328,3437803383,US +3437803384,3437803391,BR +3437803392,3437803535,US +3437803536,3437803543,GB +3437803544,3437803647,US +3437803648,3437803655,AU +3437803656,3437803759,US +3437803760,3437803767,CA +3437803768,3437803783,US +3437803784,3437803791,CA +3437803792,3437803887,US +3437803888,3437803895,CA +3437803896,3437803919,US +3437803920,3437803927,CA +3437803928,3437803967,US +3437803968,3437803975,FR +3437803976,3437804063,US +3437804064,3437804071,IL +3437804072,3437804159,US +3437804160,3437804167,GB +3437804168,3437804175,NZ +3437804176,3437804335,US +3437804336,3437804351,PE +3437804352,3437804447,US +3437804448,3437804455,CA +3437804456,3437804471,US +3437804472,3437804487,IN +3437804488,3437804671,US +3437804672,3437804703,CA +3437804704,3437804767,US +3437804768,3437804799,PH +3437804800,3437804807,US +3437804808,3437804815,CA +3437804816,3437804903,US +3437804904,3437804911,CA +3437804912,3437805159,US +3437805160,3437805167,MX +3437805168,3437805175,US +3437805176,3437805183,CA +3437805184,3437805191,GB +3437805192,3437805207,US +3437805208,3437805215,GB +3437805216,3437805231,US +3437805232,3437805239,FR +3437805240,3437805271,US +3437805272,3437805279,IL +3437805280,3437815807,US +3437815808,3437815815,IN +3437815816,3437815991,US +3437815992,3437815999,CA +3437816000,3437816007,AU +3437816008,3437816095,US +3437816096,3437816103,IT +3437816104,3437816159,US +3437816160,3437816167,IL +3437816168,3437816183,US +3437816184,3437816191,BR +3437816192,3437816263,US +3437816264,3437816271,GB +3437816272,3437816431,US +3437816432,3437816439,CA +3437816440,3437817375,US +3437817376,3437817383,IL +3437817384,3437817391,US +3437817392,3437817399,SG +3437817400,3437817647,US +3437817648,3437817663,FR +3437817664,3437817855,US +3437817856,3437817983,BD +3437817984,3437819871,US +3437819872,3437819887,FR +3437819888,3437821823,US +3437821824,3437821887,BD +3437821888,3437961215,US +3437961216,3437964287,ZA +3437964288,3438006271,US +3438006272,3438010367,CA +3438010368,3438034943,US +3438034944,3438051327,BS +3438051328,3438084095,US +3438084096,3438116863,CA +3438116864,3438215167,US +3438215168,3438217983,CA 3438217984,3438218239,US 3438218240,3438218751,CA -3438219264,3438219519,CA -3438219776,3438246911,CA -3438247168,3438252543,CA -3438252800,3438261759,CA -3438262016,3438280447,CA +3438219264,3438280703,CA 3438280704,3438542847,US -3438542848,3438545423,CA +3438542848,3438544943,CA +3438544944,3438544959,TC +3438544960,3438545423,CA 3438545424,3438545431,US 3438545432,3438545471,CA 3438545472,3438545479,US @@ -64523,255 +101984,512 @@ 3438552272,3438552287,US 3438552288,3438570031,CA 3438570032,3438570039,MY -3438570040,3438592255,CA +3438570040,3438590975,CA +3438590976,3438591231,TC +3438591232,3438592255,CA 3438592256,3438592263,US 3438592264,3438600319,CA 3438600320,3438600351,US 3438600352,3438608383,CA -3438608384,3438678015,US -3438690304,3438712831,US -3438723072,3438813183,US +3438608384,3438689535,US +3438689536,3438689791,CA +3438689792,3438813183,US 3438813184,3438814207,GH 3438814208,3438895103,US 3438895104,3438896895,HN -3438896896,3439183359,US +3438896896,3439059711,US +3439059712,3439059967,PR +3439059968,3439070975,US +3439070976,3439071135,MX +3439071136,3439183359,US 3439183360,3439183871,HT -3439183872,3447991551,US -3447994368,3448004095,US -3448004608,3448263423,US -3448263424,3448263935,AG -3448263936,3448338687,US +3439183872,3439219967,US +3439219968,3439220079,CL +3439220080,3439220087,US +3439220088,3439220159,CL +3439220160,3439220175,US +3439220176,3439220191,CL +3439220192,3448159471,US +3448159472,3448159487,AG +3448159488,3448168831,US +3448168832,3448168839,IN +3448168840,3448169263,US +3448169264,3448169279,AE +3448169280,3448170511,US +3448170512,3448170527,UY +3448170528,3448170551,US +3448170552,3448170559,CA +3448170560,3448172927,US +3448172928,3448173055,CA +3448173056,3448173439,US +3448173440,3448173567,CA +3448173568,3448173647,US +3448173648,3448173655,CA +3448173656,3448173695,US +3448173696,3448173823,CA +3448173824,3448173855,US +3448173856,3448173863,CA +3448173864,3448173919,US +3448173920,3448173935,UY +3448173936,3448263423,US +3448263424,3448263431,AG +3448263432,3448263439,KN +3448263440,3448263447,AG +3448263448,3448263471,KN +3448263472,3448263487,AG +3448263488,3448263551,AI +3448263552,3448263655,AG +3448263656,3448263663,MS +3448263664,3448263743,AG +3448263744,3448263871,VG +3448263872,3448263935,AG +3448263936,3448303103,US +3448303104,3448303871,KY +3448303872,3448338687,US 3448338688,3448339455,GB 3448339456,3448377343,US 3448377344,3448377855,AG -3448377856,3448397887,US +3448377856,3448379415,US +3448379416,3448379423,IL +3448379424,3448379439,US +3448379440,3448379447,SG +3448379448,3448379519,US +3448379520,3448379647,IN +3448379648,3448379903,SG +3448379904,3448380063,US +3448380064,3448380079,SG +3448380080,3448380095,US +3448380096,3448380239,SG +3448380240,3448380255,US +3448380256,3448380287,SG +3448380288,3448380415,US +3448380416,3448380719,SG +3448380720,3448380735,US +3448380736,3448380775,SG +3448380776,3448380783,AE +3448380784,3448380799,SG +3448380800,3448380839,US +3448380840,3448380847,SG +3448380848,3448380927,US +3448380928,3448380959,SG +3448380960,3448380975,US +3448380976,3448380991,AU +3448380992,3448381183,US +3448381184,3448381439,SG +3448381440,3448381695,GB +3448381696,3448382343,US +3448382344,3448382351,IE +3448382352,3448382367,GB +3448382368,3448382415,US +3448382416,3448382447,GB +3448382448,3448382567,US +3448382568,3448382583,GB +3448382584,3448397887,US 3448397888,3448397967,CA 3448397968,3448398335,US 3448398336,3448399103,CA 3448399104,3448399359,US 3448399360,3448399871,CA -3448399872,3448462111,US +3448399872,3448411391,US +3448411392,3448411455,CA +3448411456,3448461311,US +3448461312,3448461391,GB +3448461392,3448461415,US +3448461416,3448461423,SG +3448461424,3448461431,US +3448461432,3448461439,GB +3448461440,3448461543,US +3448461544,3448461551,GB +3448461552,3448461559,US +3448461560,3448461567,GB +3448461568,3448461599,SG +3448461600,3448461631,US +3448461632,3448461695,SG +3448461696,3448461735,US +3448461736,3448461743,GB +3448461744,3448462111,US 3448462112,3448462127,SG 3448462128,3448462143,US 3448462144,3448462223,SG 3448462224,3448462239,GB 3448462240,3448462255,US 3448462256,3448462271,GB -3448462272,3448629247,US -3448631296,3448637183,US -3448637440,3448638975,US -3448639488,3448647423,US -3448647680,3448700927,US -3448702976,3448868863,US -3448872448,3448872703,US -3448872960,3449001245,US +3448462272,3448500479,US +3448500480,3448500735,SG +3448500736,3448545599,US +3448545600,3448545679,AU +3448545680,3448545695,US +3448545696,3448545727,AU +3448545728,3448545791,US +3448545792,3448545823,SG +3448545824,3448545855,AU +3448545856,3448545879,US +3448545880,3448545919,SG +3448545920,3448545951,US +3448545952,3448545967,SG +3448545968,3448545975,MY +3448545976,3448546007,AU +3448546008,3448556671,US +3448556672,3448556735,GB +3448556736,3448556799,US +3448556800,3448556815,GB +3448556816,3448558911,US +3448558912,3448558919,GB +3448558920,3448559103,US +3448559104,3448559359,GB +3448559360,3448563015,US +3448563016,3448563031,GB +3448563032,3449001245,US 3449001246,3449001246,MC -3449001247,3449096191,US -3449098240,3449159679,US -3449159680,3449159935,CA -3449159936,3449160191,US -3449160192,3449160447,CA -3449160448,3449163775,US -3449163776,3449164031,CA -3449164032,3449164799,US -3449164800,3449165055,CA -3449165056,3449166847,US -3449166848,3449167103,CA -3449167104,3449167359,US -3449167360,3449167615,CA -3449167616,3449168383,US -3449168384,3449168639,CA -3449168640,3449171711,US -3449171712,3449172223,CA -3449172224,3449174015,US -3449174016,3449174783,CA -3449174784,3449176063,US -3449176064,3449176319,CA -3449176320,3449176831,US -3449176832,3449177599,CA -3449177600,3449178111,US -3449178112,3449178367,CA +3449001247,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 +3449168640,3449168895,US +3449168896,3449169151,CA +3449169152,3449169663,US +3449169664,3449171199,CA +3449171200,3449171711,US +3449171712,3449172991,CA +3449172992,3449173247,US +3449173248,3449174783,CA +3449174784,3449175039,US +3449175040,3449175295,CA +3449175296,3449175551,US +3449175552,3449175807,CA +3449175808,3449176063,US +3449176064,3449177087,CA +3449177088,3449177103,US +3449177104,3449178367,CA 3449178368,3449178623,US -3449178624,3449179647,CA -3449179648,3449180671,US -3449180672,3449180927,CA -3449180928,3449181439,US -3449181440,3449181695,CA -3449181696,3449182719,US -3449182720,3449182975,CA -3449182976,3449184255,US -3449184256,3449184511,CA -3449184512,3449185535,US -3449185536,3449185791,CA -3449185792,3449186559,US +3449178624,3449179967,CA +3449179968,3449180031,US +3449180032,3449180095,CA +3449180096,3449180671,US +3449180672,3449181951,CA +3449181952,3449181983,US +3449181984,3449181999,CA +3449182000,3449182015,US +3449182016,3449182031,CA +3449182032,3449182047,US +3449182048,3449182063,CA +3449182064,3449182079,US +3449182080,3449182095,CA +3449182096,3449182111,US +3449182112,3449182159,CA +3449182160,3449182207,US +3449182208,3449186303,CA +3449186304,3449186559,US 3449186560,3449186815,CA -3449186816,3449187839,US -3449187840,3449188095,CA -3449188096,3449188607,US -3449188608,3449188671,CA -3449188672,3449188703,US -3449188704,3449188767,CA -3449188768,3449188863,US -3449188864,3449189119,CA -3449189120,3449191223,US -3449191224,3449191231,CA -3449191232,3449191295,US -3449191296,3449191303,CA -3449191304,3449191351,US -3449191352,3449191359,CA -3449191360,3449191423,US -3449191424,3449191679,CA -3449191680,3449194495,US -3449194496,3449194751,CA -3449194752,3449196031,US +3449186816,3449187071,US +3449187072,3449187647,CA +3449187648,3449187711,US +3449187712,3449188159,CA +3449188160,3449188223,US +3449188224,3449188831,CA +3449188832,3449188863,US +3449188864,3449189599,CA +3449189600,3449189631,US +3449189632,3449189647,CA +3449189648,3449189663,US +3449189664,3449189679,CA +3449189680,3449189711,US +3449189712,3449189759,CA +3449189760,3449189775,US +3449189776,3449189791,CA +3449189792,3449189839,US +3449189840,3449190655,CA +3449190656,3449190911,US +3449190912,3449191175,CA +3449191176,3449191183,US +3449191184,3449191255,CA +3449191256,3449191263,US +3449191264,3449191303,CA +3449191304,3449191311,US +3449191312,3449191319,CA +3449191320,3449191327,US +3449191328,3449191343,CA +3449191344,3449191351,GB +3449191352,3449191367,CA +3449191368,3449191375,US +3449191376,3449191679,CA +3449191680,3449191743,US +3449191744,3449195775,CA +3449195776,3449196031,US 3449196032,3449196287,CA -3449196288,3449198879,US +3449196288,3449198687,US +3449198688,3449198783,CA +3449198784,3449198879,US 3449198880,3449199103,CA -3449199104,3449202983,US -3449202984,3449202991,CA -3449202992,3449203175,US -3449203176,3449203183,CA -3449203184,3449203543,US -3449203544,3449203551,CA -3449203552,3449203695,US -3449203696,3449203703,CA -3449203704,3449204735,US +3449199104,3449199647,US +3449199648,3449199695,CA +3449199696,3449199711,US +3449199712,3449199871,CA +3449199872,3449202767,US +3449202768,3449202847,CA +3449202848,3449202863,US +3449202864,3449202911,CA +3449202912,3449202943,US +3449202944,3449202959,CA +3449202960,3449202967,US +3449202968,3449203023,CA +3449203024,3449203031,US +3449203032,3449203039,CA +3449203040,3449203047,US +3449203048,3449203095,CA +3449203096,3449203103,US +3449203104,3449203119,CA +3449203120,3449203127,US +3449203128,3449203263,CA +3449203264,3449203295,US +3449203296,3449203527,CA +3449203528,3449203543,US +3449203544,3449203599,CA +3449203600,3449203607,US +3449203608,3449203623,CA +3449203624,3449203631,US +3449203632,3449203655,CA +3449203656,3449203663,US +3449203664,3449203687,CA +3449203688,3449203695,US +3449203696,3449203775,CA +3449203776,3449203903,US +3449203904,3449203967,CA +3449203968,3449204031,US +3449204032,3449204479,CA +3449204480,3449204735,US 3449204736,3449205759,CA -3449205760,3449210623,US -3449210624,3449211391,CA -3449211392,3449211647,US -3449211648,3449211903,CA -3449211904,3449213183,US +3449205760,3449206271,US +3449206272,3449206335,CA +3449206336,3449206367,US +3449206368,3449206591,CA +3449206592,3449206655,US +3449206656,3449207007,CA +3449207008,3449208575,US +3449208576,3449208767,CA +3449208768,3449208831,US +3449208832,3449208879,CA +3449208880,3449208895,US +3449208896,3449208975,CA +3449208976,3449209007,US +3449209008,3449209023,CA +3449209024,3449209039,US +3449209040,3449209599,CA +3449209600,3449209855,US +3449209856,3449209983,CA +3449209984,3449210015,US +3449210016,3449212415,CA +3449212416,3449212671,US +3449212672,3449212927,CA +3449212928,3449213183,US 3449213184,3449213695,CA -3449213696,3449214551,US -3449214552,3449214559,CA -3449214560,3449214975,US -3449214976,3449215231,CA -3449215232,3449215487,US -3449215488,3449215743,CA -3449215744,3449220863,US -3449220864,3449221119,CA -3449221120,3449222655,US -3449222656,3449223423,CA -3449223424,3449224191,US -3449224192,3449224447,CA -3449224448,3449224703,US -3449224704,3449224959,CA +3449213696,3449213951,US +3449213952,3449214079,CA +3449214080,3449214143,US +3449214144,3449214583,CA +3449214584,3449214591,SE +3449214592,3449214623,CA +3449214624,3449214647,US +3449214648,3449214719,CA +3449214720,3449214735,US +3449214736,3449214815,CA +3449214816,3449214831,US +3449214832,3449214847,CA +3449214848,3449214863,US +3449214864,3449215999,CA +3449216000,3449220351,US +3449220352,3449221375,CA +3449221376,3449222655,US +3449222656,3449224959,CA 3449224960,3449225215,US -3449225472,3449254143,CA -3449254912,3449273599,CA -3449273856,3449278975,CA -3449280000,3449290495,CA -3449290752,3449385983,US -3449387008,3449598207,US +3449225216,3449290751,CA +3449290752,3449598207,US 3449598208,3449598463,GB -3449598464,3449755391,US -3449755648,3449758207,US -3449758464,3449760767,US -3449761024,3449767935,US -3449768192,3449769727,US -3449769984,3449782271,US -3449782528,3449783551,US -3449783808,3449814783,US -3449815040,3449843199,US +3449598464,3449769727,US +3449769728,3449769983,ZA +3449769984,3449823231,US +3449823232,3449824255,CO +3449824256,3449835519,US +3449835520,3449836543,ES +3449836544,3449843199,US 3449843200,3449843711,YE 3449843712,3449874687,US 3449874688,3449874943,AG 3449874944,3449910719,US 3449910720,3449910783,CA -3449910784,3449960127,US -3449960128,3449960159,CA -3449960160,3450213887,US -3450214144,3450217215,US +3449910784,3449923583,US +3449923584,3449923839,ES +3449923840,3449974783,US +3449974784,3449976831,CA +3449976832,3449980159,US +3449980160,3449980415,AN +3449980416,3449994239,US +3449994240,3449994495,MX +3449994496,3450217215,US 3450217216,3450217471,LC -3450217472,3450228735,US -3450228992,3450235903,US -3450236160,3450239743,US -3450240000,3450245375,US -3450245632,3450248703,US -3450248960,3450254079,US -3450254336,3450254591,US -3450254848,3450271487,US -3450271744,3450272511,US +3450217472,3450272511,US 3450272512,3450272767,MX -3450272768,3450273535,US -3450273792,3450293759,US -3450294272,3450328831,US -3450329088,3450334719,US -3450335232,3450612479,US -3450612736,3450618879,US -3450619904,3450673151,US -3450675200,3450685183,US -3450685440,3450686719,US -3450687488,3450691583,US -3450693632,3450699007,US -3450699776,3450730495,US -3450732544,3450738687,US -3450740736,3450773503,US -3450773504,3450777599,CA -3450777600,3451027455,US -3451027456,3451029503,CA -3451029504,3451030015,US -3451030016,3451031551,CA -3451031552,3451032319,US -3451032320,3451043839,CA -3451043840,3451715583,US -3451715840,3451724543,CA -3451725568,3451726847,CA -3451727360,3451740927,CA -3451741184,3451766783,CA -3451767296,3451767551,CA -3451767808,3451780863,CA -3451781120,3451912191,US +3450272768,3450345231,US +3450345232,3450345247,FR +3450345248,3450345263,IT +3450345264,3450345439,US +3450345440,3450345471,GE +3450345472,3450731519,US +3450731520,3450732543,CA +3450732544,3450773503,US +3450773504,3450774783,CA +3450774784,3450775039,US +3450775040,3450777599,CA +3450777600,3450936319,US +3450936320,3450936351,HK +3450936352,3450974255,US +3450974256,3450974271,GB +3450974272,3451170303,US +3451170304,3451170559,VE +3451170560,3451187967,US +3451187968,3451188223,AU +3451188224,3451207423,US +3451207424,3451207679,CH +3451207680,3451236351,US +3451236352,3451236607,HU +3451236608,3451371519,US +3451371520,3451371775,GB +3451371776,3451506687,US +3451506688,3451507199,BR +3451507200,3451715583,US +3451715584,3451737343,CA +3451737344,3451737599,US +3451737600,3451744255,CA +3451744256,3451745535,US +3451745536,3451781119,CA +3451781120,3451783935,US +3451783936,3451784191,CA +3451784192,3451786751,US +3451786752,3451787263,CA +3451787264,3451788031,US +3451788032,3451788287,CA +3451788288,3451798783,US +3451798784,3451799039,CA +3451799040,3451800063,US +3451800064,3451800319,CA +3451800320,3451807231,US +3451807232,3451807487,CA +3451807488,3451808511,US +3451808512,3451808767,CA +3451808768,3451810815,US +3451810816,3451811327,CA +3451811328,3451821567,US +3451821568,3451821823,PR +3451821824,3451824127,US +3451824128,3451824383,CA +3451824384,3451827455,US +3451827456,3451827711,PR +3451827712,3451828479,US +3451828480,3451828735,CA +3451828736,3451828991,US +3451828992,3451829247,CA +3451829248,3451835903,US +3451835904,3451836159,CA +3451836160,3451836415,US +3451836416,3451836671,CA +3451836672,3451836927,US +3451836928,3451837183,CA +3451837184,3451837695,US +3451837696,3451837951,CA +3451837952,3451840255,US +3451840256,3451840767,CA +3451840768,3451879423,US +3451879424,3451879935,DE +3451879936,3451896319,US +3451896320,3451896575,DE +3451896576,3451912191,US 3451912192,3452174335,CA -3452174592,3452174847,US -3452176128,3452176383,US -3452177920,3452178175,US -3452181504,3452187135,US -3452187392,3452190463,US -3452191488,3452192255,US -3452192512,3452194047,US -3452194816,3452199423,US -3452199680,3452204287,US -3452207104,3452216831,US -3452219392,3452225791,US -3452227584,3452436479,US +3452174336,3452178719,US +3452178720,3452178751,CA +3452178752,3452179391,US +3452179392,3452179399,CA +3452179400,3452179940,US +3452179941,3452179941,CA +3452179942,3452436479,US 3452436480,3452502015,CA -3452502016,3452563455,US -3452567552,3452764159,US -3452764160,3452895231,CA -3452895488,3452914175,CA +3452502016,3452678143,US +3452678144,3452682239,BE +3452682240,3452706815,US +3452715008,3452723199,CA +3452731392,3452764159,US +3452764160,3452764439,CA +3452764440,3452764447,US +3452764448,3452764487,CA +3452764488,3452764495,US +3452764496,3452764615,CA +3452764616,3452764623,US +3452764624,3452764639,CA +3452764640,3452764647,US +3452764648,3452764655,CA +3452764656,3452764663,US +3452764664,3452768399,CA +3452768400,3452768431,US +3452768432,3452768751,CA +3452768752,3452768767,US +3452768768,3452770591,CA +3452770592,3452770607,US +3452770608,3452770783,CA +3452770784,3452770799,US +3452770800,3452771647,CA +3452771648,3452771711,US +3452771712,3452776895,CA +3452776896,3452776959,US +3452776960,3452785399,CA +3452785400,3452785407,US +3452785408,3452787519,CA +3452787520,3452787583,US +3452787584,3452791039,CA +3452791040,3452791055,US +3452791056,3452793215,CA +3452793216,3452793343,US +3452793344,3452798951,CA +3452798952,3452798959,US +3452798960,3452810239,CA +3452810240,3452810751,US +3452810752,3452818527,CA +3452818528,3452818535,US +3452818536,3452818599,CA +3452818600,3452818615,US +3452818616,3452818639,CA +3452818640,3452818647,US +3452818648,3452824575,CA +3452824576,3452824607,US +3452824608,3452914175,CA 3452914176,3452914431,US 3452914432,3452920831,CA -3452923392,3452931327,CA -3452931584,3452934911,CA -3452934912,3452935167,US -3452936192,3452940799,CA -3452941056,3452942847,CA -3452943104,3452953087,CA -3452953344,3452960511,CA +3452920832,3452922879,US +3452923392,3452934911,CA +3452934912,3452936191,US +3452936192,3452960767,CA 3452960768,3453026303,US -3453026560,3453028095,CA -3453028352,3453028607,CA -3453030400,3453034495,CA -3453034496,3453091839,US -3453092096,3453101055,CA +3453026304,3453028607,CA +3453029376,3453032447,US +3453032448,3453032703,CA +3453032704,3453039167,US +3453039168,3453039183,AU +3453039184,3453039199,US +3453039200,3453039215,CA +3453039216,3453091839,US +3453091840,3453101055,CA 3453101056,3453101311,US -3453101312,3453123839,CA -3453124096,3453129983,CA -3453130240,3453139455,CA +3453101312,3453139455,CA +3453139968,3453140991,US 3453140992,3453149183,CA 3453149184,3453149439,US -3453149440,3453151743,CA -3453152000,3453155327,CA -3453155584,3453157119,CA -3453157632,3453159423,CA +3453149440,3453159423,CA 3453159424,3453159935,BM -3453159936,3453163519,CA -3453164032,3453180671,CA -3453180928,3453195263,CA -3453195520,3453199871,CA -3453200384,3453206527,CA +3453159936,3453206527,CA 3453206528,3453207551,HN 3453207552,3453207807,NI 3453207808,3453208575,HN @@ -64787,14 +102505,177 @@ 3453216000,3453217023,CR 3453217024,3453217791,SV 3453217792,3453219327,CR -3453219328,3453220607,SV +3453219328,3453219583,US +3453219584,3453219839,SV +3453219840,3453220607,US 3453220608,3453222911,HN -3453222912,3453375999,US +3453222912,3453241343,US +3453241344,3453243391,A1 +3453243392,3453370583,US +3453370584,3453370607,CA +3453370608,3453370703,US +3453370704,3453370719,CA +3453370720,3453371191,US +3453371192,3453371199,CA +3453371200,3453371215,US +3453371216,3453371223,MY +3453371224,3453371463,US +3453371464,3453371471,CZ +3453371472,3453371639,US +3453371640,3453371663,CA +3453371664,3453371671,US +3453371672,3453371679,CA +3453371680,3453371767,US +3453371768,3453371783,SA +3453371784,3453371807,US +3453371808,3453371815,SA +3453371816,3453371831,US +3453371832,3453371839,JP +3453371840,3453371967,US +3453371968,3453371975,AT +3453371976,3453371983,CA +3453371984,3453372047,US +3453372048,3453372063,SA +3453372064,3453372183,US +3453372184,3453372191,JP +3453372192,3453372199,CH +3453372200,3453372231,US +3453372232,3453372247,CA +3453372248,3453372263,US +3453372264,3453372271,PT +3453372272,3453372287,US +3453372288,3453372327,CA +3453372328,3453372415,US +3453372416,3453372439,UA +3453372440,3453372535,US +3453372536,3453372543,HK +3453372544,3453372551,LB +3453372552,3453372711,US +3453372712,3453372727,SA +3453372728,3453372735,OM +3453372736,3453372767,US +3453372768,3453372775,AE +3453372776,3453372783,US +3453372784,3453372791,LB +3453372792,3453372951,US +3453372952,3453372967,IN +3453372968,3453372975,US +3453372976,3453372991,IN +3453372992,3453373007,US +3453373008,3453373023,IN +3453373024,3453373095,US +3453373096,3453373127,SA +3453373128,3453373135,US +3453373136,3453373143,PH +3453373144,3453373239,US +3453373240,3453373271,CA +3453373272,3453374519,US +3453374520,3453374527,AT +3453374528,3453374551,US +3453374552,3453374559,CA +3453374560,3453374567,US +3453374568,3453374583,PH +3453374584,3453374591,CY +3453374592,3453374639,US +3453374640,3453374647,CA +3453374648,3453374791,US +3453374792,3453374807,PH +3453374808,3453374815,US +3453374816,3453374823,CA +3453374824,3453374871,US +3453374872,3453374879,UA +3453374880,3453374927,US +3453374928,3453374935,GB +3453374936,3453374983,US +3453374984,3453374999,GB +3453375000,3453375023,US +3453375024,3453375047,SA +3453375048,3453375095,US +3453375096,3453375135,SA +3453375136,3453375143,TH +3453375144,3453375167,US +3453375168,3453375191,SA +3453375192,3453375215,US +3453375216,3453375239,GB +3453375240,3453375255,US +3453375256,3453375263,IN +3453375264,3453375279,GB +3453375280,3453375319,TK +3453375320,3453375343,US +3453375344,3453375375,GB +3453375376,3453375383,US +3453375384,3453375407,SA +3453375408,3453375415,GB +3453375416,3453375447,FR +3453375448,3453375487,AU +3453375488,3453375551,US +3453375552,3453375559,NZ +3453375560,3453375575,US +3453375576,3453375583,RU +3453375584,3453375591,US +3453375592,3453375599,NZ +3453375600,3453375639,US +3453375640,3453375647,NZ +3453375648,3453375783,US +3453375784,3453375791,NZ +3453375792,3453375807,US +3453375808,3453375887,SA +3453375888,3453375999,US 3453376000,3453376255,CA -3453376256,3453403135,US +3453376256,3453376535,US +3453376536,3453376543,GB +3453376544,3453376719,US +3453376720,3453376727,GB +3453376728,3453376743,US +3453376744,3453376751,GB +3453376752,3453376759,UA +3453376760,3453376783,US +3453376784,3453376791,GB +3453376792,3453376823,US +3453376824,3453376831,AU +3453376832,3453376839,SA +3453376840,3453376847,US +3453376848,3453376887,KW +3453376888,3453376919,US +3453376920,3453376927,GB +3453376928,3453376951,US +3453376952,3453376959,GB +3453376960,3453376975,US +3453376976,3453376983,SA +3453376984,3453377031,US +3453377032,3453377039,CA +3453377040,3453377159,US +3453377160,3453377167,GB +3453377168,3453377183,US +3453377184,3453377191,AU +3453377192,3453377319,US +3453377320,3453377327,GB +3453377328,3453377607,US +3453377608,3453377615,SA +3453377616,3453377671,US +3453377672,3453377679,NL +3453377680,3453377815,US +3453377816,3453377823,HN +3453377824,3453377887,US +3453377888,3453377903,CA +3453377904,3453377999,US +3453378000,3453378007,SA +3453378008,3453378015,US +3453378016,3453378031,GB +3453378032,3453378047,US +3453378048,3453378055,GB +3453378056,3453378143,US +3453378144,3453378151,SA +3453378152,3453378271,US +3453378272,3453378279,DK +3453378280,3453378503,US +3453378504,3453378511,BE +3453378512,3453378519,CA +3453378520,3453378535,GB +3453378536,3453403135,US 3453403136,3453405951,BB 3453405952,3453406207,KN -3453406208,3453406463,BB +3453406208,3453406463,TC 3453406464,3453406975,VC 3453406976,3453407231,GD 3453407232,3453407743,BB @@ -64802,52 +102683,144 @@ 3453408256,3453409023,BB 3453409024,3453409535,KN 3453409536,3453411327,BB -3453411328,3453607935,US -3453607936,3453616127,AG -3453616128,3454436351,US +3453411328,3453551839,US +3453551840,3453551879,GB +3453551880,3453551895,US +3453551896,3453551903,GB +3453551904,3453551935,US +3453551936,3453551967,GB +3453551968,3453552039,US +3453552040,3453552047,GB +3453552048,3453552399,US +3453552400,3453552407,GB +3453552408,3453552455,US +3453552456,3453552463,IE +3453552464,3453552471,GB +3453552472,3453552511,US +3453552512,3453552639,IE +3453552640,3453552895,GB +3453552896,3453553151,US +3453553152,3453553407,GB +3453553408,3453553631,US +3453553632,3453553639,GB +3453553640,3453553919,US +3453553920,3453553983,GB +3453553984,3453554063,US +3453554064,3453554095,GB +3453554096,3453554159,US +3453554160,3453554175,GB +3453554176,3453554207,US +3453554208,3453554215,GB +3453554216,3453554431,US +3453554432,3453554687,GB +3453554688,3453554863,US +3453554864,3453554879,NL +3453554880,3453555711,US +3453555712,3453555767,GB +3453555768,3453599999,US +3453600000,3453600511,GB +3453600512,3453607935,US +3453607936,3453608959,KN +3453608960,3453609983,LC +3453609984,3453610495,AG +3453610496,3453610751,MS +3453610752,3453611007,AG +3453611008,3453611263,MS +3453611264,3453612543,DM +3453612544,3453613055,KN +3453613056,3453614591,AG +3453614592,3453615103,DM +3453615104,3453615359,AG +3453615360,3453615615,KN +3453615616,3453616127,AG +3453616128,3454003013,US +3454003014,3454003014,ES +3454003015,3454004997,US +3454004998,3454004998,GB +3454004999,3454436351,US 3454436352,3454436607,GU -3454436608,3454599167,US -3454599424,3454601215,CA -3454603008,3454603263,US -3454603264,3454603519,CA -3454604032,3454604799,CA +3454436608,3454497791,US +3454497792,3454498815,MX +3454498816,3454563623,US +3454563624,3454563631,NC +3454563632,3454599167,US +3454599168,3454601215,CA +3454601216,3454602239,US +3454603008,3454604799,CA 3454604800,3454607359,US -3454607360,3454609151,CA -3454611456,3454617343,CA -3454617600,3454617855,CA -3454618112,3454618367,CA -3454619648,3454634751,CA +3454607360,3454608127,CA +3454608128,3454608383,US +3454608384,3454609407,CA +3454609408,3454611455,US +3454611456,3454618623,CA +3454618624,3454619647,US +3454619648,3454635007,CA +3454635008,3454636031,US 3454636032,3454636799,CA 3454636800,3454637055,US -3454637056,3454652159,CA -3454652416,3454661631,CA -3454662656,3454664447,CA +3454637056,3454661631,CA +3454661632,3454662655,US +3454662656,3454664703,CA 3454664704,3454672895,US 3454672896,3454681087,CA -3454681088,3454705151,US +3454681088,3454698823,US +3454698824,3454698839,CA +3454698840,3454698887,US +3454698888,3454698895,HK +3454698896,3454703135,US +3454703136,3454703143,IN +3454703144,3454703255,US +3454703256,3454703263,CA +3454703264,3454703807,US +3454703808,3454703823,AF +3454703824,3454705151,US 3454705152,3454705215,GB -3454705216,3454730239,US +3454705216,3454708927,US +3454708928,3454708991,IN +3454708992,3454710551,US +3454710552,3454710559,SO +3454710560,3454710671,US +3454710672,3454710679,IN +3454710680,3454711487,US +3454711488,3454711519,HK +3454711520,3454717551,US +3454717552,3454717559,CA +3454717560,3454718623,US +3454718624,3454718655,HK +3454718656,3454718767,US +3454718768,3454718775,EG +3454718776,3454718783,BE +3454718784,3454718959,US +3454718960,3454718967,TR +3454718968,3454721183,US +3454721184,3454721191,EG +3454721192,3454725759,US +3454725760,3454725767,DE +3454725768,3454726631,US +3454726632,3454726639,NL +3454726640,3454727799,US +3454727800,3454727807,CA +3454727808,3454730239,US 3454730240,3454732287,EC 3454732288,3454795775,US -3454796032,3454808831,CA +3454795776,3454808831,CA 3454808832,3454809087,US -3454809088,3454810111,CA -3454810368,3454814975,CA +3454809088,3454814975,CA 3454814976,3454815231,US 3454815232,3454815743,CA -3454816256,3454816511,CA -3454816768,3454828287,CA -3454828544,3454861055,CA -3454861568,3454867711,CA -3454867968,3454881535,CA -3454881792,3454883839,CA -3454885888,3454914559,US -3454915072,3454926591,CA -3454926848,3455109119,US +3454816256,3454883839,CA +3454883840,3454914559,US +3454914560,3454926847,CA +3454926848,3455096831,US +3455096832,3455097855,EC +3455097856,3455109119,US 3455109120,3455111167,HN -3455111168,3455122879,US +3455111168,3455115263,SR +3455115264,3455122879,US 3455122880,3455122887,PR -3455122888,3455132159,US +3455122888,3455126527,US +3455126528,3455126783,MX +3455126784,3455132159,US 3455132160,3455133695,BO 3455133696,3455242407,US 3455242408,3455242415,CA @@ -64855,255 +102828,1151 @@ 3455244848,3455244855,CA 3455244856,3455320063,US 3455320064,3455322111,FR -3455322112,3455551999,US +3455322112,3455328255,US +3455328256,3455329279,DO +3455329280,3455330815,US +3455330816,3455331327,ES +3455331328,3455333887,US +3455333888,3455334399,NL +3455334400,3455359231,US +3455359232,3455359487,ES +3455359488,3455360671,US +3455360672,3455360687,PR +3455360688,3455418367,US +3455418368,3455418879,KY +3455418880,3455421439,US +3455421440,3455421951,BE +3455421952,3455551999,US 3455552000,3455552255,EC 3455552256,3455566079,US 3455566080,3455566335,EC -3455566336,3455713279,US -3455713280,3455844351,CA -3455844352,3456303103,US +3455566336,3455582207,US +3455582208,3455583743,SG +3455583744,3455584255,NL +3455584256,3455584767,GB +3455584768,3455588351,US +3455588352,3455588863,BE +3455588864,3455589119,FR +3455589120,3455589375,US +3455589376,3455589631,BE +3455589632,3455591679,US +3455591680,3455591935,NL +3455591936,3455592191,US +3455592192,3455592447,IE +3455592448,3455592703,KR +3455592704,3455594239,US +3455594240,3455594495,DE +3455594496,3455594751,TW +3455594752,3455595007,DE +3455595008,3455595519,US +3455595520,3455595775,KR +3455595776,3455596031,FR +3455596032,3455596543,CH +3455596544,3455596799,NL +3455596800,3455597311,US +3455597312,3455597567,FR +3455597568,3455598847,US +3455598848,3455599103,NO +3455599104,3455599359,US +3455599360,3455599615,MX +3455599616,3455600127,TW +3455600128,3455600639,GB +3455600640,3455600895,US +3455600896,3455601151,GB +3455601152,3455601407,US +3455601408,3455601919,GB +3455601920,3455602175,US +3455602176,3455602687,GB +3455602688,3455615487,US +3455615488,3455616255,JP +3455616256,3455616511,US +3455616512,3455616767,CA +3455616768,3455617279,US +3455617280,3455619071,GB +3455619072,3455619263,US +3455619264,3455619327,AR +3455619328,3455619839,US +3455619840,3455620095,GB +3455620096,3455620287,US +3455620288,3455620351,VE +3455620352,3455621631,US +3455621632,3455622143,GB +3455622144,3455624191,US +3455624192,3455624447,FR +3455624448,3455627519,US +3455627520,3455628287,DK +3455628288,3455628543,BE +3455628544,3455628799,CA +3455628800,3455630847,GB +3455630848,3455631103,US +3455631104,3455631359,GB +3455631360,3455632639,ES +3455632640,3455632895,US +3455632896,3455633407,GB +3455633408,3455634431,US +3455634432,3455635455,DE +3455635456,3455635711,US +3455635712,3455635967,FR +3455635968,3455636223,DE +3455636224,3455636479,CA +3455636480,3455637759,US +3455637760,3455638271,GB +3455638272,3455638527,BE +3455638528,3455639551,US +3455639552,3455639807,IT +3455639808,3455640063,US +3455640064,3455640319,CA +3455640320,3455640575,GB +3455640576,3455640831,US +3455640832,3455641087,GB +3455641088,3455641343,NL +3455641344,3455641599,GB +3455641600,3455642879,US +3455642880,3455643135,FR +3455643136,3455644159,US +3455644160,3455644415,HK +3455644416,3455644927,US +3455644928,3455645439,GB +3455645440,3455645695,JP +3455645696,3455645951,BE +3455645952,3455646719,FR +3455646720,3455646975,SE +3455646976,3455647231,GB +3455647232,3455647487,HK +3455647488,3455647743,IT +3455647744,3455713279,US +3455713280,3455778815,CA +3455778816,3456303103,US 3456303104,3456311295,JP 3456311296,3456892927,US 3456892928,3456958463,CA -3456958464,3457683455,US -3457683456,3457684479,CA -3457684480,3457723535,US +3456958464,3457040383,US +3457040384,3457040639,A1 +3457040640,3457246367,US +3457246368,3457246383,SE +3457246384,3457312191,US +3457312192,3457312255,IE +3457312256,3457551871,US +3457551872,3457552127,CA +3457552128,3457553151,US +3457553152,3457553663,CA +3457553664,3457554175,US +3457554176,3457554431,CA +3457554432,3457555711,US +3457555712,3457555967,CA +3457555968,3457564927,US +3457564928,3457565183,CA +3457565184,3457575167,US +3457575168,3457575423,CA +3457575424,3457577727,US +3457577728,3457578239,CA +3457578240,3457580543,US +3457580544,3457580799,CA +3457580800,3457582591,US +3457582592,3457582847,CA +3457582848,3457592319,US +3457592320,3457592575,CA +3457592576,3457595391,US +3457595392,3457595903,CA +3457595904,3457596671,US +3457596672,3457597695,CA +3457597696,3457598207,US +3457598208,3457598463,CA +3457598464,3457600511,US +3457600512,3457600767,CA +3457600768,3457683967,US +3457683968,3457684991,CA +3457684992,3457723535,US 3457723536,3457723551,GB 3457723552,3457859839,US 3457859840,3457860095,CA 3457860096,3457862847,US 3457862848,3457862911,CA -3457862912,3457986559,US -3457988608,3458195455,US +3457862912,3458141631,US +3458141632,3458141655,GB +3458141656,3458143863,US +3458143864,3458143871,AE +3458143872,3458143919,US +3458143920,3458143935,AE +3458143936,3458143999,US +3458144000,3458144015,DE +3458144016,3458144031,US +3458144032,3458144047,DE +3458144048,3458195455,US 3458195456,3458196479,SG -3458196480,3458811903,US +3458196480,3458765631,US +3458765632,3458765695,CA +3458765696,3458811903,US 3458813952,3458818047,CA 3458818048,3458820095,US -3458822144,3459055615,US +3458822144,3458823559,US +3458823560,3458823575,LB +3458823576,3458823583,US +3458823584,3458823591,MY +3458823592,3458823701,US +3458823702,3458823717,GB +3458823718,3458823725,US +3458823726,3458823733,GR +3458823734,3458823765,US +3458823766,3458823781,RU +3458823782,3458823789,US +3458823790,3458823813,IL +3458823814,3458823846,US +3458823847,3458823862,GB +3458823863,3458823871,US +3458823872,3458823903,ID +3458823904,3458823919,JP +3458823920,3458823935,US +3458823936,3458823967,CA +3458823968,3458823983,JP +3458823984,3458824087,US +3458824088,3458824111,GB +3458824112,3458824159,US +3458824160,3458824183,ID +3458824184,3458824191,GB +3458824192,3459055615,US 3459055616,3459121151,CA 3459121152,3459186687,US 3459186688,3459252223,CA -3459252224,3459266559,US -3459266560,3459267583,AG +3459252224,3459256831,US +3459256832,3459257087,CO +3459257088,3459257343,US +3459257344,3459258367,AW +3459258368,3459259391,CL +3459259392,3459264767,US +3459264768,3459265023,VE +3459265024,3459266559,US +3459266560,3459266623,AG +3459266624,3459266655,KN +3459266656,3459267327,AG +3459267328,3459267583,AI 3459267584,3459267839,LC -3459267840,3459268607,AG -3459268608,3459295231,US +3459267840,3459268095,DM +3459268096,3459268607,AG +3459268608,3459273727,US +3459273728,3459274751,CL +3459274752,3459277823,US +3459277824,3459278847,AW +3459278848,3459285247,US +3459285248,3459285311,CL +3459285312,3459285375,US +3459285376,3459286271,CL +3459286272,3459287807,US +3459287808,3459288063,CL +3459288064,3459290111,US +3459290112,3459290623,CL +3459290624,3459295231,US 3459295232,3459296255,KR -3459296256,3459326463,US +3459296256,3459312639,US +3459312640,3459312687,MX +3459312688,3459312767,US +3459312768,3459312895,MX +3459312896,3459325951,US +3459325952,3459326207,VE +3459326208,3459326463,SZ 3459326464,3459327487,CA 3459327488,3459327999,CO 3459328000,3459329023,CL -3459329024,3459330047,US -3459330048,3459330303,CL -3459330304,3459331071,US +3459329024,3459330047,VE +3459330048,3459330559,CL +3459330560,3459331071,US 3459331072,3459331583,MX 3459331584,3459332607,PA -3459332608,3459334399,US +3459332608,3459333119,US +3459333120,3459333631,PW +3459333632,3459333887,MR +3459333888,3459334399,US 3459334400,3459334655,CA -3459334656,3459340031,US +3459334656,3459335423,US +3459335424,3459335679,VE +3459335680,3459335935,DO +3459335936,3459336191,VE +3459336192,3459336447,MX +3459336448,3459336703,US +3459336704,3459336959,LK +3459336960,3459337215,AW +3459337216,3459337471,CO +3459337472,3459337727,VE +3459337728,3459337983,MX +3459337984,3459338239,US +3459338240,3459338495,SV +3459338496,3459339263,PH +3459339264,3459339519,ID +3459339520,3459339775,US +3459339776,3459340031,ID 3459340032,3459340287,VE 3459340288,3459340543,MX -3459340544,3459341823,US +3459340544,3459340799,FM +3459340800,3459341055,SK +3459341056,3459341311,MX +3459341312,3459341567,TW +3459341568,3459341823,US 3459341824,3459342079,IL -3459342080,3459342335,US +3459342080,3459342335,LK 3459342336,3459342591,VE -3459342592,3459342847,US +3459342592,3459342847,BY 3459342848,3459343103,VE -3459343104,3459343615,US +3459343104,3459343359,BR +3459343360,3459343439,CA +3459343440,3459343455,US +3459343456,3459343591,CA +3459343592,3459343599,US +3459343600,3459343615,CA 3459343616,3459344127,OM 3459344128,3459345663,US -3459345664,3459346175,OM -3459346176,3459347967,US -3459347968,3459348223,PR +3459345664,3459345919,OM +3459345920,3459346431,US +3459346432,3459346687,LK +3459346688,3459346943,US +3459346944,3459348223,PR 3459348224,3459348479,AG -3459348480,3459348991,US +3459348480,3459348735,CO +3459348736,3459348991,BW 3459348992,3459349503,IT 3459349504,3459350527,US 3459350528,3459352575,VE 3459352576,3459352831,US 3459352832,3459353087,FM -3459353088,3459353599,US -3459353600,3459354623,CO +3459353088,3459353343,US +3459353344,3459354623,CO 3459354624,3459357183,NI 3459357184,3459357439,VE -3459357440,3459362815,US +3459357440,3459357695,HT +3459357696,3459357951,SV +3459357952,3459358207,TG +3459358208,3459358719,PR +3459358720,3459358975,VE +3459358976,3459359999,US +3459360000,3459360511,VE +3459360512,3459362815,US 3459362816,3459364863,CO 3459364864,3459366911,AR -3459366912,3459368959,VE +3459366912,3459367167,VE +3459367168,3459367423,US +3459367424,3459367455,VE +3459367456,3459367535,VN +3459367536,3459367551,VE +3459367552,3459367647,VN +3459367648,3459367935,VE +3459367936,3459367999,VN +3459368000,3459368063,VE +3459368064,3459368095,VN +3459368096,3459368703,VE +3459368704,3459368959,US 3459368960,3459371007,MX 3459371008,3459373055,PE 3459373056,3459373311,US 3459373312,3459375103,CL -3459375104,3459448831,US -3459449088,3459450623,CA +3459375104,3459376127,VE +3459376128,3459448831,US +3459448832,3459450623,CA 3459450624,3459450879,US -3459450880,3459456511,CA +3459450880,3459455487,CA +3459455488,3459455743,US +3459455744,3459456511,CA 3459456512,3459456767,US 3459456768,3459457279,CA 3459457280,3459457535,US 3459457536,3459457791,CA -3459458048,3459469311,US -3459473408,3459510271,US +3459457792,3459458047,PR +3459458048,3459512319,US 3459512320,3459513855,CA -3459514368,3459580927,US -3459584000,3459590143,US +3459513856,3459592191,US 3459592192,3459596287,CA -3459596288,3459614719,US -3459616768,3459620863,CA -3459620864,3459622911,US +3459596288,3459622911,US 3459624960,3459629055,BM -3459629056,3459631103,US -3459633152,3459731455,US +3459629056,3459731455,US 3459731456,3459735551,CA -3459735552,3459736575,US -3459739648,3459752959,US -3459756032,3459761151,US -3459764224,3460108895,US +3459735552,3459745535,US +3459745536,3459745791,IT +3459745792,3460104703,US +3460104704,3460105215,MX +3460105216,3460108895,US 3460108896,3460108903,FI 3460108904,3460111871,US 3460111872,3460111887,CA -3460111888,3460161535,US +3460111888,3460113039,US +3460113040,3460113047,PR +3460113048,3460114431,US +3460114432,3460116479,SR +3460116480,3460161535,US 3460161536,3460163583,PR -3460163584,3460453631,US +3460163584,3460374527,US +3460374528,3460375551,MX +3460375552,3460408359,US +3460408360,3460408367,DE +3460408368,3460409951,US +3460409952,3460409967,DE +3460409968,3460413535,US +3460413536,3460413543,DE +3460413544,3460453631,US 3460453632,3460453887,BS -3460453888,3460761599,US -3460763648,3460794367,US -3460796416,3460894847,US -3460894848,3460894975,NL -3460894976,3460933887,US +3460453888,3460507647,US +3460507648,3460507903,MX +3460507904,3460854911,US +3460854912,3460854943,GB +3460854944,3460855023,US +3460855024,3460855031,BR +3460855032,3460855247,US +3460855248,3460855255,AU +3460855256,3460855271,US +3460855272,3460855279,GB +3460855280,3460855287,CA +3460855288,3460855311,US +3460855312,3460855319,CA +3460855320,3460855463,US +3460855464,3460855471,SA +3460855472,3460855535,US +3460855536,3460855543,MX +3460855544,3460855551,AU +3460855552,3460855631,US +3460855632,3460855647,IT +3460855648,3460855703,US +3460855704,3460855711,AU +3460855712,3460855743,US +3460855744,3460855775,CA +3460855776,3460855807,US +3460855808,3460855815,GB +3460855816,3460855823,NZ +3460855824,3460855855,US +3460855856,3460855863,GB +3460855864,3460855871,US +3460855872,3460855879,GB +3460855880,3460855887,GU +3460855888,3460855927,US +3460855928,3460855935,GB +3460855936,3460856007,US +3460856008,3460856015,CA +3460856016,3460856127,US +3460856128,3460856135,JP +3460856136,3460856191,US +3460856192,3460856199,ZA +3460856200,3460856215,US +3460856216,3460856223,GB +3460856224,3460856287,US +3460856288,3460856295,IN +3460856296,3460856383,US +3460856384,3460856399,GB +3460856400,3460856447,US +3460856448,3460856495,GB +3460856496,3460856559,US +3460856560,3460856575,CA +3460856576,3460856607,US +3460856608,3460856639,NZ +3460856640,3460856815,US +3460856816,3460856831,NZ +3460856832,3460857055,US +3460857056,3460857087,NZ +3460857088,3460857151,US +3460857152,3460857183,CA +3460857184,3460857599,US +3460857600,3460857855,AU +3460857856,3460891135,US +3460891136,3460891199,CL +3460891200,3460891967,US +3460891968,3460891999,BR +3460892000,3460892031,CO +3460892032,3460892095,VE +3460892096,3460892127,BR +3460892128,3460892159,US +3460892160,3460892223,FR +3460892224,3460892271,BR +3460892272,3460892287,US +3460892288,3460892415,FR +3460892416,3460893439,US +3460893440,3460893695,IT +3460893696,3460894223,US +3460894224,3460894239,MX +3460894240,3460894335,US +3460894336,3460894367,MX +3460894368,3460894463,US +3460894464,3460894719,JP +3460894720,3460894735,NL +3460894736,3460894751,CA +3460894752,3460894783,US +3460894784,3460894975,NL +3460894976,3460895231,DK +3460895232,3460895487,BE +3460895488,3460896255,US +3460896256,3460896511,ZA +3460896512,3460896767,ES +3460896768,3460897023,FR +3460897024,3460897279,GB +3460897280,3460899327,US +3460899328,3460899583,ZA +3460899584,3460900607,US +3460900608,3460900671,PE +3460900672,3460900735,US +3460900736,3460900799,PR +3460900800,3460900831,EC +3460900832,3460901375,US +3460901376,3460901631,SE +3460901632,3460902143,US +3460902144,3460902271,IN +3460902272,3460903215,US +3460903216,3460903231,AR +3460903232,3460903239,BR +3460903240,3460903263,US +3460903264,3460903295,VE +3460903296,3460903359,US +3460903360,3460903423,MX +3460903424,3460903807,US +3460903808,3460903871,BO +3460903872,3460903935,US +3460903936,3460904063,VE +3460904064,3460904079,MX +3460904080,3460904191,US +3460904192,3460904223,FI +3460904224,3460904255,US +3460904256,3460904319,DE +3460904320,3460904447,US +3460904448,3460904479,FI +3460904480,3460904591,US +3460904592,3460904607,CA +3460904608,3460904639,US +3460904640,3460904703,BR +3460904704,3460904735,US +3460904736,3460904751,CA +3460904752,3460905255,US +3460905256,3460905263,MX +3460905264,3460905295,US +3460905296,3460905311,BR +3460905312,3460905407,US +3460905408,3460905471,BR +3460905472,3460905743,US +3460905744,3460905759,BR +3460905760,3460905791,US +3460905792,3460905823,BR +3460905824,3460906047,US +3460906048,3460906079,ID +3460906080,3460906111,CN +3460906112,3460906143,HK +3460906144,3460906495,US +3460906496,3460906559,ID +3460906560,3460907263,US +3460907264,3460907519,SG +3460907520,3460908159,US +3460908160,3460908191,CN +3460908192,3460908287,US +3460908288,3460908543,FI +3460908544,3460908799,US +3460908800,3460910335,IE +3460910336,3460910591,US +3460910592,3460910847,IE +3460910848,3460911167,US +3460911168,3460911199,ID +3460911200,3460912127,US +3460912128,3460912383,IT +3460912384,3460912639,FR +3460912640,3460912895,ES +3460912896,3460913407,US +3460913408,3460913439,FR +3460913440,3460913471,US +3460913472,3460913663,FR +3460913664,3460913951,US +3460913952,3460914015,CN +3460914016,3460914047,US +3460914048,3460914111,DE +3460914112,3460916223,US +3460916224,3460916479,CH +3460916480,3460916735,GB +3460916736,3460916991,AR +3460916992,3460917023,CA +3460917024,3460917135,US +3460917136,3460917151,MX +3460917152,3460917183,PR +3460917184,3460917279,US +3460917280,3460917311,CA +3460917312,3460917343,US +3460917344,3460917359,CA +3460917360,3460917423,US +3460917424,3460917439,MX +3460917440,3460917759,US +3460917760,3460918015,CA +3460918016,3460918207,US +3460918208,3460918239,AR +3460918240,3460918271,US +3460918272,3460918527,NL +3460918528,3460918687,US +3460918688,3460918719,MX +3460918720,3460918783,US +3460918784,3460919039,JP +3460919040,3460919295,NL +3460919296,3460919535,US +3460919536,3460919543,AR +3460919544,3460919551,CO +3460919552,3460920319,US +3460920320,3460920575,IT +3460920576,3460920831,BE +3460920832,3460921343,US +3460921344,3460921599,DE +3460921600,3460921855,AU +3460921856,3460923391,US +3460923392,3460923647,MX +3460923648,3460923679,US +3460923680,3460923711,FR +3460923712,3460923743,DE +3460923744,3460923775,CH +3460923776,3460923807,SE +3460923808,3460923839,GB +3460923840,3460923871,AT +3460923872,3460924159,US +3460924160,3460924175,GB +3460924176,3460924223,US +3460924224,3460924287,GB +3460924288,3460924415,DE +3460924416,3460924607,GB +3460924608,3460924671,US +3460924672,3460925183,GB +3460925184,3460925695,US +3460925696,3460925951,ES +3460925952,3460926207,US +3460926208,3460926463,GB +3460926464,3460926719,US +3460926720,3460926975,DE +3460926976,3460927103,US +3460927104,3460927231,ES +3460927232,3460929023,BE +3460929024,3460929279,US +3460929280,3460929535,DE +3460929536,3460929791,GB +3460929792,3460930047,DK +3460930048,3460931007,US +3460931008,3460931071,IT +3460931072,3460931199,GR +3460931200,3460931247,US +3460931248,3460931327,BE +3460931328,3460931583,US +3460931584,3460931839,SE +3460931840,3460932095,DE +3460932096,3460932351,GB +3460932352,3460932607,FR +3460932608,3460932863,US +3460932864,3460933119,GB +3460933120,3460933375,US +3460933376,3460933439,DE +3460933440,3460933679,US +3460933680,3460933695,SE +3460933696,3460933823,US +3460933824,3460933887,IL 3460933888,3460934143,DE -3460934144,3461021695,US +3460934144,3460934655,US +3460934656,3460934783,CH +3460934784,3460934911,IT +3460934912,3460935167,SG +3460935168,3460935199,US +3460935200,3460935231,ES +3460935232,3460935295,US +3460935296,3460935423,HU +3460935424,3460935679,FR +3460935680,3460935935,FI +3460935936,3460936191,FR +3460936192,3460936447,US +3460936448,3460936703,GB +3460936704,3460936959,IT +3460936960,3460937215,DE +3460937216,3460937471,FR +3460937472,3460937727,US +3460937728,3460937983,DK +3460937984,3460938239,IE +3460938240,3460938495,DE +3460938496,3460939039,US +3460939040,3460939071,BE +3460939072,3460939103,IT +3460939104,3460939263,US +3460939264,3460939519,HK +3460939520,3460939711,US +3460939712,3460939775,CH +3460939776,3460939903,US +3460939904,3460939935,AU +3460939936,3460939967,SG +3460939968,3460940287,US +3460940288,3460940351,MX +3460940352,3460940415,ID +3460940416,3460940479,US +3460940480,3460940511,HK +3460940512,3460940543,TH +3460940544,3460940559,US +3460940560,3460940567,GB +3460940568,3460940607,US +3460940608,3460940639,CN +3460940640,3460941311,US +3460941312,3460941375,MY +3460941376,3460941439,US +3460941440,3460941567,TW +3460941568,3460941823,AU +3460941824,3460942079,US +3460942080,3460942335,GB +3460942336,3460943359,US +3460943360,3460943615,ID +3460943616,3460943871,HK +3460943872,3460944383,US +3460944384,3460944447,KR +3460944448,3460944479,US +3460944480,3460944511,CN +3460944512,3460944543,TH +3460944544,3460944575,JP +3460944576,3460944671,KR +3460944672,3460944767,US +3460944768,3460944895,TH +3460944896,3460945151,DE +3460945152,3460945663,US +3460945664,3460945919,GB +3460945920,3460946687,US +3460946688,3460946943,DE +3460946944,3460946975,CH +3460946976,3460947199,US +3460947200,3460947455,BE +3460947456,3460947711,DE +3460947712,3460947967,SE +3460947968,3460948095,US +3460948096,3460948159,KR +3460948160,3460948735,US +3460948736,3460948799,PH +3460948800,3460948863,CN +3460948864,3460948927,US +3460948928,3460948959,ID +3460948960,3460949023,US +3460949024,3460949055,JP +3460949056,3460949183,ID +3460949184,3460950271,US +3460950272,3460950527,DE +3460950528,3460950559,HK +3460950560,3460950671,US +3460950672,3460950687,JP +3460950688,3460950991,US +3460950992,3460951007,JP +3460951008,3460951295,US +3460951296,3460951551,GB +3460951552,3460951559,JP +3460951560,3460951567,US +3460951568,3460951583,HK +3460951584,3460951743,US +3460951744,3460951751,HK +3460951752,3460951759,ID +3460951760,3460951823,US +3460951824,3460951831,CA +3460951832,3460951855,US +3460951856,3460951871,JP +3460951872,3460951887,CH +3460951888,3460951935,US +3460951936,3460951951,MX +3460951952,3460952007,US +3460952008,3460952015,CA +3460952016,3460952255,US +3460952256,3460952287,CA +3460952288,3460952319,US +3460952320,3460952575,GB +3460952576,3460952831,ES +3460952832,3460952895,US +3460952896,3460952927,BR +3460952928,3460952959,US +3460952960,3460953023,CA +3460953024,3460953111,US +3460953112,3460953119,TW +3460953120,3460953135,MX +3460953136,3460953151,US +3460953152,3460953167,TH +3460953168,3460953183,JP +3460953184,3460953199,MX +3460953200,3460953231,US +3460953232,3460953247,ID +3460953248,3460953279,US +3460953280,3460953343,CA +3460953344,3460953599,US +3460953600,3460953615,BR +3460953616,3460953623,US +3460953624,3460953631,SG +3460953632,3460953647,CN +3460953648,3460953663,SG +3460953664,3460953727,US +3460953728,3460953855,HK +3460953856,3460954111,GB +3460954112,3460954191,US +3460954192,3460954207,SG +3460954208,3460954367,US +3460954368,3460954431,DO +3460954432,3460954463,US +3460954464,3460954479,MY +3460954480,3460954527,US +3460954528,3460954559,KR +3460954560,3460954623,US +3460954624,3460954879,DE +3460954880,3460955135,LU +3460955136,3460955391,US +3460955392,3460955423,JP +3460955424,3460955455,US +3460955456,3460955487,BR +3460955488,3460955519,CO +3460955520,3460955583,BR +3460955584,3461021695,US 3461021696,3461031935,CA 3461031936,3461032191,US 3461032192,3461087231,CA 3461087232,3461285887,US -3461285888,3461285951,GB -3461285952,3461408767,US +3461285888,3461285975,GB +3461285976,3461286143,US +3461286144,3461286335,FR +3461286336,3461286399,US +3461286400,3461286463,FR +3461286464,3461286471,GB +3461286472,3461330943,US +3461330944,3461331199,SG +3461331200,3461331295,US +3461331296,3461331311,SG +3461331312,3461331327,US +3461331328,3461331551,SG +3461331552,3461331567,US +3461331568,3461331583,SG +3461331584,3461331711,US +3461331712,3461331967,SG +3461331968,3461332223,US +3461332224,3461332559,SG +3461332560,3461332735,US +3461332736,3461332991,SG +3461332992,3461408767,US 3461410816,3461414911,CA -3461414912,3461435391,US -3461439488,3461441535,US -3461443584,3461456895,US -3461459968,3461507071,US -3461509120,3461513215,US -3461513216,3461517311,CA -3461517312,3461522431,US -3461525504,3461548031,US -3461550080,3461554175,US +3461414912,3461513215,US +3461513216,3461513727,CA +3461513728,3461513983,BF +3461513984,3461514495,CA +3461514496,3461514751,QA +3461514752,3461516287,CA +3461516288,3461516543,IL +3461516544,3461517055,CA +3461517056,3461554175,US 3461554176,3461556223,CA -3461558272,3461580799,US -3461582848,3461604351,US -3461607424,3461808127,US +3461558272,3461597887,US +3461597888,3461597951,CO +3461597952,3461598015,US +3461598016,3461598079,CO +3461598080,3461808127,US 3461808128,3461873663,CA -3461873664,3462571095,US +3461873664,3461897727,US +3461897728,3461897983,CA +3461897984,3461905407,US +3461905408,3461905663,CA +3461905664,3461940735,US +3461940736,3461940991,CA +3461940992,3461948159,US +3461948160,3461948415,CA +3461948416,3461948927,US +3461948928,3461949183,CA +3461949184,3461949695,US +3461949696,3461950207,CA +3461950208,3461950719,US +3461950720,3461951231,CA +3461951232,3461953535,US +3461953536,3461953791,CA +3461953792,3461968127,US +3461968128,3461968383,CA +3461968384,3461970431,US +3461970432,3461970687,CA +3461970688,3461972223,US +3461972224,3461972479,CA +3461972480,3461977855,US +3461977856,3461978111,CA +3461978112,3461984767,US +3461984768,3461985023,CA +3461985024,3461992703,US +3461992704,3461992959,CA +3461992960,3461999871,US +3461999872,3462000127,PR +3462000128,3462000895,US +3462000896,3462001151,CA +3462001152,3462001919,US +3462001920,3462002431,CA +3462002432,3462148607,US +3462148608,3462148863,CA +3462148864,3462160895,US +3462160896,3462161151,PR +3462161152,3462163967,US +3462163968,3462164223,CA +3462164224,3462168319,US +3462168320,3462168575,CA +3462168576,3462169599,US +3462169600,3462169855,CA +3462169856,3462170623,US +3462170624,3462171135,CA +3462171136,3462171391,US +3462171392,3462171647,CA +3462171648,3462173695,US +3462173696,3462173951,CA +3462173952,3462174463,US +3462174464,3462174719,CA +3462174720,3462179839,US +3462179840,3462180095,CA +3462180096,3462181375,US +3462181376,3462182143,CA +3462182144,3462191871,US +3462191872,3462192127,PR +3462192128,3462194175,US +3462194176,3462194431,CA +3462194432,3462231039,US +3462231040,3462231295,CA +3462231296,3462231807,US +3462231808,3462232063,CA +3462232064,3462268415,US +3462268416,3462268671,CA +3462268672,3462276863,US +3462276864,3462277119,CA +3462277120,3462290175,US +3462290176,3462290431,CA +3462290432,3462314239,US +3462314240,3462314495,CA +3462314496,3462321407,US +3462321408,3462321663,CA +3462321664,3462321919,US +3462321920,3462322175,CA +3462322176,3462323711,US +3462323712,3462323967,CA +3462323968,3462339071,US +3462339072,3462339583,CA +3462339584,3462340607,US +3462340608,3462340863,CA +3462340864,3462350847,US +3462350848,3462351103,CA +3462351104,3462478559,US +3462478560,3462478591,IL +3462478592,3462478623,US +3462478624,3462478655,IL +3462478656,3462478943,US +3462478944,3462478975,IL +3462478976,3462571095,US 3462571096,3462571103,CA 3462571104,3462571663,US 3462571664,3462571671,CA 3462571672,3462593791,US 3462593792,3462594559,GN 3462594560,3462605823,US -3462605824,3462608895,UY -3462608896,3462889479,US +3462605824,3462606847,UY +3462606848,3462606863,US +3462606864,3462606927,UY +3462606928,3462606943,US +3462606944,3462606991,UY +3462606992,3462607007,US +3462607008,3462607087,UY +3462607088,3462607135,US +3462607136,3462607167,UY +3462607168,3462607199,US +3462607200,3462607231,UY +3462607232,3462607263,US +3462607264,3462608799,UY +3462608800,3462608815,US +3462608816,3462608895,UY +3462608896,3462633727,US +3462633728,3462633799,BV +3462633800,3462633823,US +3462633824,3462633855,SG +3462633856,3462634247,US +3462634248,3462634271,SG +3462634272,3462634367,AE +3462634368,3462634495,SG +3462634496,3462889479,US 3462889480,3462889487,GB 3462889488,3462991183,US 3462991184,3462991191,CA -3462991192,3463089151,US +3462991192,3463004159,US +3463004160,3463006207,CO +3463006208,3463032319,US +3463032320,3463032831,PR +3463032832,3463043071,US +3463043072,3463044095,ES +3463044096,3463089151,US 3463089152,3463090175,CA -3463090176,3463156735,US +3463090176,3463116799,US +3463116800,3463118847,CO +3463118848,3463156735,US 3463156736,3463157759,BO -3463157760,3463184383,US -3463184640,3463193087,CA -3463193600,3463194623,CA +3463157760,3463176191,US +3463176192,3463176703,AN +3463176704,3463184383,US +3463184384,3463194623,CA +3463194624,3463198719,US 3463198720,3463213311,CA 3463213312,3463213567,US -3463217152,3463229327,CA +3463214080,3463215103,US +3463215104,3463229327,CA 3463229328,3463229335,US 3463229336,3463243775,CA -3463245056,3463249663,CA +3463243776,3463244799,US +3463244800,3463249919,CA 3463249920,3463480063,US 3463480064,3463480319,CA -3463480320,3463518207,US +3463480320,3463502335,US +3463502336,3463502399,GB +3463502400,3463518207,US 3463518208,3463520255,NL -3463520256,3463538943,US -3463538944,3463539455,DM -3463539456,3463602687,US +3463520256,3463583567,US +3463583568,3463583583,UM +3463583584,3463602687,US 3463602688,3463602943,PH -3463602944,3463708671,US +3463602944,3463632383,US +3463632384,3463632391,CA +3463632392,3463632399,US +3463632400,3463632415,CA +3463632416,3463708671,US 3463708672,3463774207,CA -3463774208,3464167423,US -3464167680,3464169215,CA -3464169472,3464171775,CA +3463774208,3464108031,US +3464108032,3464108287,DE +3464108288,3464127999,US +3464128000,3464128255,DE +3464128256,3464129535,US +3464129536,3464130047,DE +3464130048,3464167423,US +3464167424,3464171775,CA 3464171776,3464172031,US -3464172032,3464173567,CA -3464173824,3464174591,CA -3464175360,3464180735,CA -3464183808,3464189439,US -3464189440,3464189951,GB -3464189952,3464190463,US +3464172032,3464180735,CA +3464180736,3464184487,US +3464184488,3464184495,GB +3464184496,3464184511,CA +3464184512,3464185759,US +3464185760,3464185791,PR +3464185792,3464190463,US 3464190464,3464190719,CA 3464190720,3464195543,US 3464195544,3464195551,IT -3464195552,3464195951,US +3464195552,3464195887,US +3464195888,3464195895,PR +3464195896,3464195943,US +3464195944,3464195951,AU 3464195952,3464195959,IT -3464195960,3464196183,US +3464195960,3464196151,US +3464196152,3464196159,AU +3464196160,3464196175,US +3464196176,3464196183,AU 3464196184,3464196191,IT -3464196192,3464208383,US +3464196192,3464196287,US +3464196288,3464196295,SG +3464196296,3464208383,US 3464208384,3464216575,CA -3464216576,3464243199,US -3464245248,3464259583,US -3464261632,3464308735,US -3464310784,3464340479,US -3464343552,3464349695,US -3464351744,3464382463,US +3464216576,3464309903,US +3464309904,3464309911,CA +3464309912,3464310463,US +3464310464,3464310495,AU +3464310496,3464310591,US +3464310592,3464310655,AU +3464310656,3464340479,US +3464340480,3464341503,CA +3464341504,3464341759,US +3464341760,3464341775,JP +3464341776,3464341823,US +3464341824,3464341831,PT +3464341832,3464342543,US +3464342544,3464342559,SE +3464342560,3464342703,US +3464342704,3464342711,JP +3464342712,3464342879,US +3464342880,3464342887,GB +3464342888,3464343111,US +3464343112,3464343119,CN +3464343120,3464343215,US +3464343216,3464343223,CA +3464343224,3464343239,US +3464343240,3464343247,MX +3464343248,3464343271,US +3464343272,3464343279,CA +3464343280,3464343423,US +3464343424,3464343431,SG +3464343432,3464382463,US 3464384512,3464388607,CA -3464389888,3464391935,US -3464392704,3464393215,US -3464393984,3464394751,US -3464396800,3464415231,US -3464417280,3464464383,US -3464466432,3464472575,US -3464474624,3464515583,US -3464519680,3464525823,US -3464527872,3464548607,US +3464388608,3464394751,US +3464394752,3464396799,VC +3464396800,3464548367,US +3464548368,3464548375,AG +3464548376,3464548391,US +3464548392,3464548399,AG +3464548400,3464548415,US +3464548416,3464548431,AG +3464548432,3464548479,US +3464548480,3464548599,AG +3464548600,3464548607,US 3464548608,3464548863,LC -3464548864,3464549119,US +3464548864,3464549119,KN 3464549120,3464549375,VG -3464549376,3464550143,US +3464549376,3464549391,US +3464549392,3464549399,AG +3464549400,3464549415,US +3464549416,3464549439,AG +3464549440,3464549503,MS +3464549504,3464549519,AG +3464549520,3464549551,US +3464549552,3464549567,AG +3464549568,3464549639,US +3464549640,3464549679,AG +3464549680,3464549687,US +3464549688,3464549727,AG +3464549728,3464549759,KN +3464549760,3464549855,AG +3464549856,3464549863,US +3464549864,3464549871,AG +3464549872,3464549919,US +3464549920,3464549927,AG +3464549928,3464549935,US +3464549936,3464549943,AG +3464549944,3464549951,US +3464549952,3464550015,AG +3464550016,3464550047,US +3464550048,3464550127,AG +3464550128,3464550143,US 3464550144,3464550399,LC 3464550400,3464626175,US -3464626432,3464626687,CA -3464627968,3464628735,CA -3464628992,3464630015,CA -3464631296,3464631807,CA -3464632064,3464641791,CA -3464642560,3464642815,CA -3464643072,3464647935,CA -3464648192,3464648703,CA -3464649216,3464650239,CA -3464650752,3464663039,US -3464664320,3464684543,CA -3464684800,3464688383,CA -3464688640,3464691455,CA -3464691712,3464769535,US +3464626176,3464630271,CA +3464630272,3464631295,US +3464631296,3464650751,CA +3464650752,3464664063,US +3464664064,3464691711,CA +3464691712,3464768607,US +3464768608,3464768623,IT +3464768624,3464768767,US +3464768768,3464768895,CA +3464768896,3464769535,US 3464769536,3464773631,CA -3464773632,3464802303,US +3464773632,3464799695,US +3464799696,3464799703,JP +3464799704,3464802303,US 3464802304,3464806399,CA 3464806400,3465154559,US 3465154560,3465158655,BS 3465158656,3465177087,US 3465177088,3465179135,PE -3465179136,3465475071,US -3465475072,3465475327,PH -3465475328,3465510911,US +3465179136,3465412607,US +3465412608,3465412871,HK +3465412872,3465412927,US +3465412928,3465413055,HK +3465413056,3465413119,US +3465413120,3465413127,HK +3465413128,3465413375,US +3465413376,3465413383,HK +3465413384,3465510911,US 3465510912,3465543679,JP 3465543680,3465982991,US 3465982992,3465983007,GB 3465983008,3465983023,US -3465983024,3465983031,GB -3465983032,3466044903,US +3465983024,3465983127,GB +3465983128,3465983167,US +3465983168,3465983199,GB +3465983200,3465983207,ZA +3465983208,3465983263,GB +3465983264,3465983271,US +3465983272,3465983311,GB +3465983312,3465983463,US +3465983464,3465983487,GB +3465983488,3466044903,US 3466044904,3466044911,PH 3466044912,3466158079,US 3466158080,3466166271,PA -3466166272,3466489855,US +3466166272,3466282111,US +3466282112,3466282119,GB +3466282120,3466282727,US +3466282728,3466282743,CA +3466282744,3466283327,US +3466283328,3466283391,CA +3466283392,3466286103,US +3466286104,3466286111,DE +3466286112,3466313727,US +3466313728,3466317823,CA +3466317824,3466489855,US 3466489856,3466490111,CA 3466490112,3466555199,US 3466555200,3466555215,CA @@ -65113,57 +103982,1231 @@ 3466560256,3466560511,GH 3466560512,3466627007,US 3466627008,3466627039,PR -3466627040,3466756095,US +3466627040,3466647039,US +3466647040,3466647047,PR +3466647048,3466734847,US +3466734848,3466735103,RU +3466735104,3466756095,US 3466756096,3466772479,CA -3466772480,3466780671,US -3466788864,3466846207,US +3466772480,3466846207,US 3466846208,3466854399,CA 3466854400,3467051007,US -3467051008,3467051263,CA -3467051520,3467068927,CA -3467069440,3467116543,CA -3467116544,3467378687,US +3467051008,3467116543,CA +3467116544,3467145351,US +3467145352,3467145359,DE +3467145360,3467145743,US +3467145744,3467145751,DE +3467145752,3467145815,US +3467145816,3467145823,DE +3467145824,3467145831,CH +3467145832,3467145839,US +3467145840,3467145847,HK +3467145848,3467145855,DE +3467145856,3467146495,US +3467146496,3467146559,CO +3467146560,3467146591,DE +3467146592,3467146655,US +3467146656,3467146671,CN +3467146672,3467378687,US 3467378688,3467444223,CA 3467444224,3467554815,US -3467558912,3467567103,CA -3467567104,3467706367,US +3467554816,3467567103,CA +3467567104,3467619935,US +3467619936,3467619967,CA +3467619968,3467706367,US 3467706368,3467902975,CA -3467902976,3467964415,US -3467968512,3468084991,US +3467902976,3468034047,US +3468034048,3468036095,GB +3468036096,3468036351,BE +3468036352,3468036607,DE +3468036608,3468036863,ES +3468036864,3468037375,DE +3468037376,3468037887,US +3468037888,3468038143,IE +3468038144,3468038655,FR +3468038656,3468038911,NL +3468038912,3468039167,SE +3468039168,3468039423,FR +3468039424,3468041215,US +3468041216,3468041471,FI +3468041472,3468041727,US +3468041728,3468041983,TW +3468041984,3468042367,US +3468042368,3468042431,IT +3468042432,3468042495,US +3468042496,3468042751,AT +3468042752,3468043135,US +3468043136,3468043263,DK +3468043264,3468044543,US +3468044544,3468044799,ES +3468044800,3468044927,GB +3468044928,3468045055,DK +3468045056,3468045311,DE +3468045312,3468045695,US +3468045696,3468045823,ZA +3468045824,3468046079,NO +3468046080,3468046335,ZA +3468046336,3468046591,FR +3468046592,3468046719,US +3468046720,3468046847,DE +3468046848,3468047103,IT +3468047104,3468047359,US +3468047360,3468047615,DE +3468047616,3468047743,US +3468047744,3468047807,LU +3468047808,3468047871,US +3468047872,3468047887,ES +3468047888,3468047999,US +3468048000,3468048127,DE +3468048128,3468048383,US +3468048384,3468048639,FR +3468048640,3468049407,US +3468049408,3468049663,GB +3468049664,3468049919,US +3468049920,3468050175,IT +3468050176,3468050431,US +3468050432,3468050687,SE +3468050688,3468050943,US +3468050944,3468051007,IT +3468051008,3468051231,US +3468051232,3468051263,DK +3468051264,3468051327,AT +3468051328,3468052479,US +3468052480,3468052735,ES +3468052736,3468052991,GB +3468052992,3468053247,ES +3468053248,3468053503,ZA +3468053504,3468053759,AU +3468053760,3468054015,CH +3468054016,3468054271,DE +3468054272,3468055295,US +3468055296,3468055551,BE +3468055552,3468055807,IT +3468055808,3468056063,NL +3468056064,3468056319,FR +3468056320,3468056575,CH +3468056576,3468056831,NO +3468056832,3468056959,DK +3468056960,3468057023,IN +3468057024,3468057087,US +3468057088,3468057215,LU +3468057216,3468057375,GB +3468057376,3468057599,US +3468057600,3468057855,IL +3468057856,3468058111,US +3468058112,3468058175,BE +3468058176,3468058239,CH +3468058240,3468058367,GB +3468058368,3468058368,US +3468058369,3468058432,IT +3468058433,3468058559,US +3468058560,3468058623,SG +3468058624,3468058687,US +3468058688,3468058719,ES +3468058720,3468059647,US +3468059648,3468059903,FR +3468059904,3468060159,DE +3468060160,3468060671,FR +3468060672,3468060927,US +3468060928,3468060991,FR +3468060992,3468061119,US +3468061120,3468061183,CH +3468061184,3468061695,US +3468061696,3468061951,JP +3468061952,3468062079,US +3468062080,3468062143,GB +3468062144,3468062335,US +3468062336,3468062399,TW +3468062400,3468062463,DE +3468062464,3468062719,AT +3468062720,3468063231,NL +3468063232,3468063359,US +3468063360,3468063423,RO +3468063424,3468063487,US +3468063488,3468063743,BE +3468063744,3468063999,US +3468064000,3468064255,HK +3468064256,3468064511,US +3468064512,3468064527,BE +3468064528,3468064543,US +3468064544,3468064575,NO +3468064576,3468064639,US +3468064640,3468064703,LU +3468064704,3468064735,US +3468064736,3468064767,CH +3468064768,3468065023,DE +3468065024,3468065279,US +3468065280,3468065535,DE +3468065536,3468065791,US +3468065792,3468065919,IT +3468065920,3468065951,GB +3468065952,3468065983,LU +3468065984,3468065999,CZ +3468066000,3468066015,BE +3468066016,3468066047,DE +3468066048,3468066239,US +3468066240,3468066271,IE +3468066272,3468066319,US +3468066320,3468066327,FR +3468066328,3468066367,US +3468066368,3468066399,FR +3468066400,3468066463,US +3468066464,3468066495,SE +3468066496,3468066527,CH +3468066528,3468066559,FR +3468066560,3468066623,IT +3468066624,3468067199,US +3468067200,3468067231,CA +3468067232,3468067263,US +3468067264,3468067295,IL +3468067296,3468067327,US +3468067328,3468067359,BR +3468067360,3468067391,US +3468067392,3468067399,BR +3468067400,3468067551,US +3468067552,3468067567,GB +3468067568,3468067759,US +3468067760,3468067775,AR +3468067776,3468068095,US +3468068096,3468068351,MC +3468068352,3468068527,US +3468068528,3468068543,MX +3468068544,3468068863,US +3468068864,3468069631,CA +3468069632,3468071791,US +3468071792,3468071807,MX +3468071808,3468071871,US +3468071872,3468071887,MX +3468071888,3468072351,US +3468072352,3468072383,CA +3468072384,3468073183,US +3468073184,3468073215,MX +3468073216,3468073727,US +3468073728,3468073791,CA +3468073792,3468073855,US +3468073856,3468073919,CA +3468073920,3468074463,US +3468074464,3468074479,GB +3468074480,3468075919,US +3468075920,3468075935,BR +3468075936,3468075967,US +3468075968,3468075999,MX +3468076000,3468076031,PH +3468076032,3468076191,US +3468076192,3468076207,BR +3468076208,3468076223,US +3468076224,3468076287,GB +3468076288,3468077631,US +3468077632,3468077663,AR +3468077664,3468079327,US +3468079328,3468079359,BR +3468079360,3468079487,US +3468079488,3468079551,JP +3468079552,3468081407,US +3468081408,3468081663,DE +3468081664,3468081919,AT +3468081920,3468082431,US +3468082432,3468082687,NO +3468082688,3468083311,US +3468083312,3468083327,IN +3468083328,3468083391,BR +3468083392,3468083663,US +3468083664,3468083679,ID +3468083680,3468083967,US +3468083968,3468084223,AU +3468084224,3468084735,US +3468084736,3468084991,SG 3468084992,3468085055,CA 3468085056,3468085119,US 3468085120,3468085183,CA -3468085184,3468125183,US -3468128256,3468142591,US -3468144640,3468296191,US -3468296192,3468361727,CA -3468361728,3468443647,US +3468085184,3468085191,JP +3468085192,3468085199,PH +3468085200,3468085207,CN +3468085208,3468085247,US +3468085248,3468085279,BR +3468085280,3468085311,US +3468085312,3468085375,BR +3468085376,3468085439,CN +3468085440,3468085503,BR +3468085504,3468085535,JP +3468085536,3468085551,US +3468085552,3468085567,PH +3468085568,3468085599,HK +3468085600,3468085607,US +3468085608,3468085623,HK +3468085624,3468085663,US +3468085664,3468085695,ID +3468085696,3468085759,US +3468085760,3468086015,ID +3468086016,3468086143,US +3468086144,3468086271,SG +3468086272,3468086783,US +3468086784,3468086799,HK +3468086800,3468086879,US +3468086880,3468086911,SG +3468086912,3468087807,US +3468087808,3468088063,SG +3468088064,3468088191,US +3468088192,3468088207,HK +3468088208,3468088223,US +3468088224,3468088231,HK +3468088232,3468088335,US +3468088336,3468088351,JP +3468088352,3468088383,ID +3468088384,3468088415,US +3468088416,3468088431,TW +3468088432,3468088959,US +3468088960,3468088991,JP +3468088992,3468089023,US +3468089024,3468089055,HK +3468089056,3468089663,US +3468089664,3468089695,JP +3468089696,3468089823,US +3468089824,3468089855,SG +3468089856,3468090623,US +3468090624,3468090687,IT +3468090688,3468090719,MY +3468090720,3468090727,US +3468090728,3468090735,JP +3468090736,3468090751,CN +3468090752,3468090815,US +3468090816,3468090879,CN +3468090880,3468091135,US +3468091136,3468091199,JP +3468091200,3468091391,US +3468091392,3468091647,NL +3468091648,3468091903,US +3468091904,3468091935,KR +3468091936,3468092031,US +3468092032,3468092063,TH +3468092064,3468092127,US +3468092128,3468092159,SG +3468092160,3468093247,US +3468093248,3468093263,JP +3468093264,3468093279,US +3468093280,3468093287,JP +3468093288,3468093343,US +3468093344,3468093375,HK +3468093376,3468093391,SG +3468093392,3468093407,ID +3468093408,3468093439,AU +3468093440,3468093695,US +3468093696,3468093951,DE +3468093952,3468094207,US +3468094208,3468094223,HK +3468094224,3468094271,US +3468094272,3468094303,KR +3468094304,3468094335,ID +3468094336,3468095135,US +3468095136,3468095167,JP +3468095168,3468095231,US +3468095232,3468095487,SE +3468095488,3468096255,US +3468096256,3468096383,CA +3468096384,3468096447,TW +3468096448,3468096479,US +3468096480,3468096511,MY +3468096512,3468096767,NO +3468096768,3468096895,PH +3468096896,3468097023,AU +3468097024,3468098047,US +3468098048,3468098079,JP +3468098080,3468098111,SG +3468098112,3468098239,US +3468098240,3468098271,SG +3468098272,3468099327,US +3468099328,3468099583,FR +3468099584,3468127999,US +3468128000,3468128255,IN +3468128256,3468296191,US +3468296192,3468309503,CA +3468309504,3468309759,US +3468309760,3468313471,CA +3468313472,3468313599,US +3468313600,3468319999,CA +3468320000,3468320255,US +3468320256,3468320351,CA +3468320352,3468320383,US +3468320384,3468361727,CA +3468361728,3468427359,US +3468427360,3468427375,IL +3468427376,3468427935,US +3468427936,3468427967,AU +3468427968,3468428191,US +3468428192,3468428207,BG +3468428208,3468428415,US +3468428416,3468428447,GR +3468428448,3468428543,US +3468428544,3468428559,CA +3468428560,3468428607,US +3468428608,3468428671,CA +3468428672,3468428927,US +3468428928,3468428991,SE +3468428992,3468429343,US +3468429344,3468429359,QA +3468429360,3468430495,US +3468430496,3468430527,CA +3468430528,3468431999,US +3468432000,3468432063,CA +3468432064,3468432671,US +3468432672,3468432687,ES +3468432688,3468433167,US +3468433168,3468433183,CA +3468433184,3468433215,US +3468433216,3468433279,SE +3468433280,3468433439,US +3468433440,3468433455,AU +3468433456,3468433663,US +3468433664,3468433919,AU +3468433920,3468435359,US +3468435360,3468435423,AU +3468435424,3468443647,US 3468443648,3468460031,CA 3468460032,3468468223,BM -3468468224,3468616703,US -3468619776,3468623871,US -3468623872,3468656639,CA +3468468224,3468545791,US +3468545792,3468546047,SG +3468546048,3468623871,US +3468623872,3468624527,CA +3468624528,3468624543,US +3468624544,3468624551,CA +3468624552,3468624559,US +3468624560,3468625727,CA +3468625728,3468625743,US +3468625744,3468627087,CA +3468627088,3468627103,US +3468627104,3468627247,CA +3468627248,3468627263,US +3468627264,3468627663,CA +3468627664,3468627679,US +3468627680,3468628119,CA +3468628120,3468628127,GB +3468628128,3468628143,CA +3468628144,3468628159,US +3468628160,3468628183,CA +3468628184,3468628191,US +3468628192,3468628511,CA +3468628512,3468628607,US +3468628608,3468628927,CA +3468628928,3468628991,US +3468628992,3468631583,CA +3468631584,3468631615,US +3468631616,3468631679,CA +3468631680,3468631695,US +3468631696,3468632143,CA +3468632144,3468632159,US +3468632160,3468632287,CA +3468632288,3468632295,US +3468632296,3468632975,CA +3468632976,3468632991,US +3468632992,3468633759,CA +3468633760,3468633791,US +3468633792,3468634383,CA +3468634384,3468634391,US +3468634392,3468634559,CA +3468634560,3468634591,US +3468634592,3468635583,CA +3468635584,3468635647,US +3468635648,3468635919,CA +3468635920,3468635935,US +3468635936,3468637839,CA +3468637840,3468637847,SK +3468637848,3468638143,CA +3468638144,3468638159,US +3468638160,3468639935,CA +3468639936,3468639967,US +3468639968,3468656639,CA 3468656640,3469055743,US 3469055744,3469055999,CA -3469056000,3469068287,US -3469068800,3469766655,US -3469768704,3469893631,US +3469056000,3469176319,US +3469176320,3469176575,MX +3469176576,3469186303,US +3469186304,3469186559,MX +3469186560,3469893631,US 3469893632,3469901823,CA -3469901824,3469987839,US -3469990400,3470458879,US +3469901824,3470131199,US +3470131200,3470137343,AG +3470137344,3470139391,VG +3470147584,3470148095,US +3470148096,3470148351,CA +3470148352,3470148607,US +3470148608,3470148863,CR +3470148864,3470149119,CA +3470149120,3470150655,US +3470150656,3470150911,CA +3470150912,3470151935,US +3470151936,3470152703,CA +3470152704,3470153215,US +3470153216,3470153471,CA +3470153472,3470154495,US +3470154496,3470154751,CA +3470154752,3470155007,US +3470155008,3470155775,CA +3470155776,3470184454,US +3470184455,3470184458,LK +3470184459,3470184460,RU +3470184461,3470184476,US +3470184477,3470184480,CN +3470184481,3470184484,US +3470184485,3470184488,IN +3470184489,3470184492,US +3470184493,3470184496,ID +3470184497,3470184512,US +3470184513,3470184516,TH +3470184517,3470184528,US +3470184529,3470184532,CA +3470184533,3470184540,US +3470184541,3470184544,ID +3470184545,3470184545,MY +3470184546,3470184549,CA +3470184550,3470184553,SI +3470184554,3470184557,IN +3470184558,3470184561,US +3470184562,3470184565,IN +3470184566,3470184574,US +3470184575,3470184575,BE +3470184576,3470184577,CA +3470184578,3470184581,MX +3470184582,3470184585,CA +3470184586,3470184593,US +3470184594,3470184597,JP +3470184598,3470184613,US +3470184614,3470184617,IN +3470184618,3470184619,NZ +3470184620,3470184639,US +3470184640,3470184643,TW +3470184644,3470184671,US +3470184672,3470184675,MY +3470184676,3470184683,US +3470184684,3470184687,BR +3470184688,3470184691,CA +3470184692,3470184699,US +3470184700,3470184701,AU +3470184702,3470184722,US +3470184723,3470184723,MY +3470184724,3470184731,US +3470184732,3470184733,NZ +3470184734,3470184737,US +3470184738,3470184741,SG +3470184742,3470184746,US +3470184747,3470184750,MY +3470184751,3470184769,US +3470184770,3470184773,ID +3470184774,3470184785,US +3470184786,3470184789,NZ +3470184790,3470184801,US +3470184802,3470184805,TW +3470184806,3470184809,US +3470184810,3470184813,MY +3470184814,3470184817,CA +3470184818,3470184821,US +3470184822,3470184825,AU +3470184826,3470184829,US +3470184830,3470184833,JP +3470184834,3470184837,US +3470184838,3470184841,GB +3470184842,3470184849,US +3470184850,3470184853,JP +3470184854,3470184857,SG +3470184858,3470184861,RO +3470184862,3470184865,US +3470184866,3470184869,AU +3470184870,3470184873,HK +3470184874,3470184881,US +3470184882,3470184884,AU +3470184885,3470184885,US +3470184886,3470184889,CA +3470184890,3470184905,US +3470184906,3470184907,SG +3470184908,3470184919,US +3470184920,3470184923,MX +3470184924,3470184929,US +3470184930,3470184933,AU +3470184934,3470184957,US +3470184958,3470184958,LK +3470184959,3470184969,US +3470184970,3470184971,RU +3470184972,3470184975,US +3470184976,3470184976,MY +3470184977,3470184990,US +3470184991,3470184994,NZ +3470184995,3470185010,US +3470185011,3470185014,GB +3470185015,3470185016,AU +3470185017,3470185020,US +3470185021,3470185021,BE +3470185022,3470185050,US +3470185051,3470185054,IN +3470185055,3470185062,US +3470185063,3470185066,BR +3470185067,3470185070,PL +3470185071,3470185082,US +3470185083,3470185086,AU +3470185087,3470185090,IN +3470185091,3470185138,US +3470185139,3470185142,ID +3470185143,3470185146,US +3470185147,3470185150,AR +3470185151,3470185154,AU +3470185155,3470185166,US +3470185167,3470185170,CN +3470185171,3470185199,US +3470185200,3470185203,ID +3470185204,3470185207,GB +3470185208,3470185213,US +3470185214,3470185214,LK +3470185215,3470185234,US +3470185235,3470185238,AE +3470185239,3470185242,NL +3470185243,3470185250,US +3470185251,3470185254,CA +3470185255,3470185258,SG +3470185259,3470185262,AU +3470185263,3470185270,US +3470185271,3470185274,ID +3470185275,3470185278,AU +3470185279,3470185282,CA +3470185283,3470185286,US +3470185287,3470185290,CN +3470185291,3470185294,US +3470185295,3470185295,MY +3470185296,3470185312,US +3470185313,3470185316,TW +3470185317,3470185336,US +3470185337,3470185340,AU +3470185341,3470185344,US +3470185345,3470185348,EC +3470185349,3470185352,US +3470185353,3470185353,NZ +3470185354,3470185357,AR +3470185358,3470185365,US +3470185366,3470185367,AU +3470185368,3470185371,PH +3470185372,3470185379,US +3470185380,3470185383,AU +3470185384,3470185399,US +3470185400,3470185403,ID +3470185404,3470185415,US +3470185416,3470185419,BE +3470185420,3470185423,NL +3470185424,3470185427,CA +3470185428,3470185431,US +3470185432,3470185435,CN +3470185436,3470185451,US +3470185452,3470185455,VE +3470185456,3470185463,US +3470185464,3470185467,NZ +3470185468,3470185468,US +3470185469,3470185469,LK +3470185470,3470186003,US +3470186004,3470186007,MX +3470186008,3470186015,CA +3470186016,3470186019,AU +3470186020,3470186048,US +3470186049,3470186052,PY +3470186053,3470186060,US +3470186061,3470186064,CN +3470186065,3470186068,AU +3470186069,3470186072,US +3470186073,3470186076,IN +3470186077,3470186084,US +3470186085,3470186085,BE +3470186086,3470186089,US +3470186090,3470186093,SG +3470186094,3470186097,CA +3470186098,3470186113,US +3470186114,3470186117,AU +3470186118,3470186251,US +3470186252,3470186255,CN +3470186256,3470186267,US +3470186268,3470186271,MX +3470186272,3470186275,SG +3470186276,3470186283,US +3470186284,3470186287,CA +3470186288,3470186306,US +3470186307,3470186310,MY +3470186311,3470186314,TH +3470186315,3470186318,AU +3470186319,3470186324,US +3470186325,3470186328,CN +3470186329,3470186329,NZ +3470186330,3470186338,US +3470186339,3470186342,UA +3470186343,3470186513,US +3470186514,3470186517,CA +3470186518,3470186525,US +3470186526,3470186529,ID +3470186530,3470186537,GB +3470186538,3470186545,US +3470186546,3470186549,MY +3470186550,3470186573,US +3470186574,3470186577,CH +3470186578,3470186593,US +3470186594,3470186597,CA +3470186598,3470186601,TR +3470186602,3470186605,US +3470186606,3470186609,CA +3470186610,3470186613,ES +3470186614,3470186617,US +3470186618,3470186621,RO +3470186622,3470186625,BR +3470186626,3470186637,US +3470186638,3470186641,BR +3470186642,3470186645,US +3470186646,3470186649,ES +3470186650,3470186669,US +3470186670,3470186673,AU +3470186674,3470186677,US +3470186678,3470186681,CA +3470186682,3470186685,US +3470186686,3470186689,IL +3470186690,3470186693,IN +3470186694,3470186697,ES +3470186698,3470186701,CA +3470186702,3470186705,AU +3470186706,3470186721,US +3470186722,3470186725,IN +3470186726,3470186729,US +3470186730,3470186733,IN +3470186734,3470186737,US +3470186738,3470186741,CA +3470186742,3470186745,IL +3470186746,3470186757,US +3470186758,3470186761,CA +3470186762,3470186765,US +3470186766,3470186769,RO +3470186770,3470186785,US +3470186786,3470186789,GB +3470186790,3470186805,US +3470186806,3470186809,IN +3470186810,3470186813,US +3470186814,3470186817,EE +3470186818,3470186825,US +3470186826,3470186829,GB +3470186830,3470186833,IN +3470186834,3470186837,US +3470186838,3470186841,AR +3470186842,3470186845,CA +3470186846,3470186849,EG +3470186850,3470186853,US +3470186854,3470186857,KW +3470186858,3470186861,US +3470186862,3470186865,AR +3470186866,3470186873,US +3470186874,3470186877,AE +3470186878,3470186881,CA +3470186882,3470186885,US +3470186886,3470186889,FR +3470186890,3470186891,CA +3470186892,3470186895,FR +3470186896,3470186899,AU +3470186900,3470186903,US +3470186904,3470186907,IN +3470186908,3470186933,US +3470186934,3470186935,BR +3470186936,3470186943,US +3470186944,3470186947,CA +3470186948,3470186963,US +3470186964,3470186967,TR +3470186968,3470186989,US +3470186990,3470186993,PE +3470186994,3470186997,RU +3470186998,3470187001,GB +3470187002,3470187041,US +3470187042,3470187045,GB +3470187046,3470187057,US +3470187058,3470187061,MY +3470187062,3470187073,US +3470187074,3470187077,IT +3470187078,3470187081,CA +3470187082,3470187085,CZ +3470187086,3470187089,US +3470187090,3470187093,TR +3470187094,3470187097,GB +3470187098,3470187101,IN +3470187102,3470187109,US +3470187110,3470187113,BR +3470187114,3470187117,VN +3470187118,3470187125,US +3470187126,3470187129,GB +3470187130,3470187133,AR +3470187134,3470187137,BA +3470187138,3470187141,US +3470187142,3470187145,CA +3470187146,3470187153,IN +3470187154,3470187157,ID +3470187158,3470187161,US +3470187162,3470187165,AU +3470187166,3470187169,NO +3470187170,3470187181,US +3470187182,3470187185,GR +3470187186,3470187229,US +3470187230,3470187231,CA +3470187232,3470187235,GB +3470187236,3470187247,US +3470187248,3470187251,GB +3470187252,3470187255,US +3470187256,3470187259,ES +3470187260,3470187269,US +3470187270,3470187273,AU +3470187274,3470187309,US +3470187310,3470187313,ES +3470187314,3470187335,US +3470187336,3470187339,CA +3470187340,3470187343,GR +3470187344,3470187356,US +3470187357,3470187360,GB +3470187361,3470187364,BG +3470187365,3470187368,SA +3470187369,3470187372,GR +3470187373,3470187380,US +3470187381,3470187384,AR +3470187385,3470187388,US +3470187389,3470187392,GB +3470187393,3470187396,IN +3470187397,3470187400,RU +3470187401,3470187404,GB +3470187405,3470187408,DO +3470187409,3470187416,US +3470187417,3470187420,IN +3470187421,3470187429,US +3470187430,3470187431,RU +3470187432,3470187437,US +3470187438,3470187441,PH +3470187442,3470187446,US +3470187447,3470187450,CA +3470187451,3470187454,US +3470187455,3470187458,IT +3470187459,3470187470,US +3470187471,3470187474,PT +3470187475,3470187502,US +3470187503,3470187503,JP +3470187504,3470187511,US +3470187512,3470187515,UA +3470187516,3470187525,US +3470187526,3470187529,EC +3470187530,3470187557,US +3470187558,3470187561,AE +3470187562,3470187569,US +3470187570,3470187573,IN +3470187574,3470187577,US +3470187578,3470187581,GB +3470187582,3470187589,US +3470187590,3470187593,IT +3470187594,3470187606,US +3470187607,3470187610,IL +3470187611,3470187614,PL +3470187615,3470187618,US +3470187619,3470187622,IT +3470187623,3470187634,US +3470187635,3470187638,SG +3470187639,3470187642,US +3470187643,3470187646,AU +3470187647,3470187650,IT +3470187651,3470187654,AR +3470187655,3470187666,US +3470187667,3470187670,IN +3470187671,3470187674,RS +3470187675,3470187678,ES +3470187679,3470187682,PT +3470187683,3470187686,US +3470187687,3470187690,JP +3470187691,3470187702,US +3470187703,3470187706,GB +3470187707,3470187725,US +3470187726,3470187729,GB +3470187730,3470187741,US +3470187742,3470187745,VN +3470187746,3470187755,US +3470187756,3470187759,PH +3470187760,3470187763,ZA +3470187764,3470187781,US +3470187782,3470187785,SI +3470187786,3470187801,US +3470187802,3470187805,IN +3470187806,3470187813,US +3470187814,3470187817,HK +3470187818,3470187825,US +3470187826,3470187829,CA +3470187830,3470187841,US +3470187842,3470187845,TR +3470187846,3470187857,US +3470187858,3470187861,MX +3470187862,3470187867,US +3470187868,3470187871,IL +3470187872,3470187885,US +3470187886,3470187889,IN +3470187890,3470187940,US +3470187941,3470187944,SA +3470187945,3470187952,US +3470187953,3470187956,NO +3470187957,3470187960,US +3470187961,3470187964,IN +3470187965,3470187976,US +3470187977,3470187980,ES +3470187981,3470187988,US +3470187989,3470187992,CA +3470187993,3470188004,US +3470188005,3470188008,AU +3470188009,3470188016,SE +3470188017,3470188024,US +3470188025,3470188028,GB +3470188029,3470188041,US +3470188042,3470188045,TH +3470188046,3470188049,GB +3470188050,3470188053,CA +3470188054,3470188057,US +3470188058,3470188061,GB +3470188062,3470188069,US +3470188070,3470188073,NZ +3470188074,3470188095,US +3470188096,3470188099,GB +3470188100,3470188103,US +3470188104,3470188107,CA +3470188108,3470188111,US +3470188112,3470188115,CA +3470188116,3470188131,US +3470188132,3470188135,AU +3470188136,3470188151,US +3470188152,3470188155,KW +3470188156,3470188159,US +3470188160,3470188163,BE +3470188164,3470188167,ID +3470188168,3470188171,US +3470188172,3470188175,NL +3470188176,3470188187,US +3470188188,3470188191,ES +3470188192,3470188199,US +3470188200,3470188203,AR +3470188204,3470188207,US +3470188208,3470188211,ES +3470188212,3470188215,TR +3470188216,3470188227,US +3470188228,3470188231,GB +3470188232,3470188243,US +3470188244,3470188247,CA +3470188248,3470188251,BE +3470188252,3470188255,US +3470188256,3470188259,CA +3470188260,3470188275,US +3470188276,3470188279,IN +3470188280,3470188283,GR +3470188284,3470188293,US +3470188294,3470188295,RU +3470188296,3470188299,US +3470188300,3470188303,ES +3470188304,3470188347,US +3470188348,3470188351,HU +3470188352,3470188393,US +3470188394,3470188397,GB +3470188398,3470188405,US +3470188406,3470188409,GR +3470188410,3470188421,US +3470188422,3470188425,GB +3470188426,3470188433,ES +3470188434,3470188437,AR +3470188438,3470188483,US +3470188484,3470188487,PH +3470188488,3470188491,ID +3470188492,3470188503,US +3470188504,3470188507,CA +3470188508,3470188509,US +3470188510,3470188510,IL +3470188511,3470188521,US +3470188522,3470188541,HK +3470188542,3470192639,US +3470196736,3470360631,US +3470360632,3470360639,CA +3470360640,3470360687,US +3470360688,3470360695,AF +3470360696,3470360799,US +3470360800,3470360807,CA +3470360808,3470361039,US +3470361040,3470361055,CA +3470361056,3470361615,US +3470361616,3470361623,AF +3470361624,3470361655,US +3470361656,3470361671,CA +3470361672,3470361703,US +3470361704,3470361711,AF +3470361712,3470361935,US +3470361936,3470361951,CA +3470361952,3470361959,CL +3470361960,3470361983,US +3470361984,3470361991,CA +3470361992,3470362111,US +3470362112,3470362119,CA +3470362120,3470362127,AU +3470362128,3470362159,US +3470362160,3470362167,AF +3470362168,3470362175,US +3470362176,3470362191,CA +3470362192,3470362263,US +3470362264,3470362271,NZ +3470362272,3470362319,US +3470362320,3470362335,AF +3470362336,3470362447,US +3470362448,3470362479,CA +3470362480,3470362495,US +3470362496,3470362503,CA +3470362504,3470362559,US +3470362560,3470362623,CA +3470362624,3470362783,US +3470362784,3470362791,AF +3470362792,3470362847,US +3470362848,3470362895,CA +3470362896,3470363295,US +3470363296,3470363303,BR +3470363304,3470363391,US +3470363392,3470363399,MX +3470363400,3470363407,GB +3470363408,3470363423,US +3470363424,3470363455,CA +3470363456,3470363535,US +3470363536,3470363543,CA +3470363544,3470363551,AF +3470363552,3470363559,US +3470363560,3470363567,CA +3470363568,3470363871,US +3470363872,3470363879,CA +3470363880,3470363967,US +3470363968,3470363983,CA +3470363984,3470364415,US +3470364416,3470364479,CA +3470364480,3470364495,HN +3470364496,3470364503,CA +3470364504,3470364527,US +3470364528,3470364535,CA +3470364536,3470458879,US 3470458880,3470475263,KR -3470475264,3470528511,US -3470529536,3470538751,US -3470539776,3470558207,US +3470475264,3470558207,US 3470558208,3470559231,HK -3470559232,3470568447,US -3470569472,3470571519,US -3470576640,3470585855,US -3470589952,3470610431,US +3470559232,3470573567,US +3470573568,3470575615,CA +3470575616,3470610431,US 3470610432,3470614527,BR -3470614528,3470651391,US +3470614528,3470643639,US +3470643640,3470643647,IL +3470643648,3470645511,US +3470645512,3470645519,GB +3470645520,3470645527,FR +3470645528,3470645535,BR +3470645536,3470645559,US +3470645560,3470645567,IT +3470645568,3470645575,CA +3470645576,3470645583,US +3470645584,3470645591,FR +3470645592,3470645623,US +3470645624,3470645631,BR +3470645632,3470645655,US +3470645656,3470645663,RU +3470645664,3470645687,US +3470645688,3470645703,ES +3470645704,3470645731,US +3470645732,3470645735,AU +3470645736,3470645739,CN +3470645740,3470645743,US +3470645744,3470645747,ES +3470645748,3470645751,US +3470645752,3470645759,BR +3470645760,3470646015,US +3470646016,3470646019,BR +3470646020,3470646035,US +3470646036,3470646039,VI +3470646040,3470646055,US +3470646056,3470646063,ES +3470646064,3470646087,US +3470646088,3470646095,ES +3470646096,3470646103,US +3470646104,3470646119,BR +3470646120,3470646135,US +3470646136,3470646143,AU +3470646144,3470646151,CA +3470646152,3470646167,AU +3470646168,3470646175,BR +3470646176,3470646215,US +3470646216,3470646223,BR +3470646224,3470646231,IL +3470646232,3470646239,US +3470646240,3470646247,IL +3470646248,3470646255,DE +3470646256,3470646263,AU +3470646264,3470646271,AR +3470646272,3470646359,US +3470646360,3470646367,ZA +3470646368,3470646375,US +3470646376,3470646383,BR +3470646384,3470646415,US +3470646416,3470646423,CA +3470646424,3470646431,FR +3470646432,3470646455,US +3470646456,3470646463,DK +3470646464,3470646487,US +3470646488,3470646495,PL +3470646496,3470646503,BR +3470646504,3470646511,US +3470646512,3470646519,BR +3470646520,3470646527,US +3470646528,3470646543,FR +3470646544,3470646567,US +3470646568,3470646575,BR +3470646576,3470646583,US +3470646584,3470646591,LK +3470646592,3470646599,CN +3470646600,3470646607,US +3470646608,3470646623,ZA +3470646624,3470646631,DE +3470646632,3470646639,BR +3470646640,3470646663,US +3470646664,3470646671,PL +3470646672,3470646679,BR +3470646680,3470646687,CA +3470646688,3470646703,US +3470646704,3470646711,CN +3470646712,3470646719,UY +3470646720,3470646727,US +3470646728,3470646735,GB +3470646736,3470646743,US +3470646744,3470646751,BR +3470646752,3470646767,FR +3470646768,3470646775,US +3470646776,3470646783,IT +3470646784,3470646791,US +3470646792,3470646799,CZ +3470646800,3470646807,BR +3470646808,3470646831,US +3470646832,3470646847,IL +3470646848,3470646903,US +3470646904,3470646911,SG +3470646912,3470646919,RU +3470646920,3470646935,US +3470646936,3470646943,CA +3470646944,3470646959,BR +3470646960,3470646991,US +3470646992,3470646999,CN +3470647000,3470651391,US 3470651392,3470655487,CA -3470655488,3470671871,US +3470655488,3470656063,US +3470656064,3470656095,IL +3470656096,3470656191,US +3470656192,3470656199,IL +3470656200,3470656383,US +3470656384,3470656415,IL +3470656416,3470656471,US +3470656472,3470656479,IL +3470656480,3470656791,US +3470656792,3470656799,CA +3470656800,3470657095,US +3470657096,3470657103,IN +3470657104,3470657383,US +3470657384,3470657391,CA +3470657392,3470657503,US +3470657504,3470657511,IN +3470657512,3470657695,US +3470657696,3470657711,RU +3470657712,3470657887,US +3470657888,3470657895,PK +3470657896,3470658599,US +3470658600,3470658607,JP +3470658608,3470658615,US +3470658616,3470658623,ZA +3470658624,3470658703,US +3470658704,3470658711,SG +3470658712,3470658751,US +3470658752,3470658759,IE +3470658760,3470658871,US +3470658872,3470658879,RU +3470658880,3470659183,US +3470659184,3470659191,BE +3470659192,3470659199,US +3470659200,3470659207,TR +3470659208,3470659271,US +3470659272,3470659279,CO +3470659280,3470659471,US +3470659472,3470659487,ES +3470659488,3470659519,IL +3470659520,3470659567,US +3470659568,3470659575,BR +3470659576,3470659583,DE +3470659584,3470659711,US +3470659712,3470659719,BD +3470659720,3470659735,US +3470659736,3470659743,AU +3470659744,3470659783,US +3470659784,3470659791,CA +3470659792,3470659951,US +3470659952,3470659959,MY +3470659960,3470659975,IN +3470659976,3470660079,US +3470660080,3470660087,CA +3470660088,3470660103,US +3470660104,3470660111,HK +3470660112,3470660159,US +3470660160,3470660191,IL +3470660192,3470660199,US +3470660200,3470660215,AU +3470660216,3470660223,US +3470660224,3470660255,PH +3470660256,3470660327,US +3470660328,3470660335,NL +3470660336,3470660647,US +3470660648,3470660655,IE +3470660656,3470660831,US +3470660832,3470660847,TR +3470660848,3470660911,US +3470660912,3470660919,ID +3470660920,3470660927,US +3470660928,3470660935,JP +3470660936,3470660943,IR +3470660944,3470661039,US +3470661040,3470661047,GB +3470661048,3470661167,US +3470661168,3470661175,IE +3470661176,3470661191,US +3470661192,3470661207,CA +3470661208,3470661215,US +3470661216,3470661223,IN +3470661224,3470661231,US +3470661232,3470661239,ES +3470661240,3470661295,US +3470661296,3470661303,SA +3470661304,3470661319,US +3470661320,3470661327,BD +3470661328,3470661543,US +3470661544,3470661551,IR +3470661552,3470661567,US +3470661568,3470661575,RO +3470661576,3470661727,US +3470661728,3470661735,AU +3470661736,3470662167,US +3470662168,3470662175,IL +3470662176,3470662183,CN +3470662184,3470662215,US +3470662216,3470662223,DK +3470662224,3470662663,US +3470662664,3470662671,AE +3470662672,3470662711,US +3470662712,3470662719,NL +3470662720,3470662863,US +3470662864,3470662871,IN +3470662872,3470662911,US +3470662912,3470662919,GB +3470662920,3470662959,US +3470662960,3470662967,AU +3470662968,3470663047,US +3470663048,3470663055,PH +3470663056,3470663063,NL +3470663064,3470663095,US +3470663096,3470663103,GB +3470663104,3470663119,US +3470663120,3470663127,VE +3470663128,3470663287,US +3470663288,3470663295,TH +3470663296,3470663311,IE +3470663312,3470663463,US +3470663464,3470663471,EG +3470663472,3470663527,US +3470663528,3470663535,GR +3470663536,3470671871,US 3470671872,3470680063,CA 3470680064,3470744063,US 3470744064,3470744575,CA @@ -65171,25 +105214,33 @@ 3470745856,3470746111,CA 3470746112,3470749951,US 3470749952,3470750207,CA -3470750208,3470751743,US -3470752512,3470752767,US +3470750208,3470752767,US 3470752768,3470753023,CO 3470753024,3470754303,US 3470754304,3470754559,PE 3470754560,3470755839,US +3470755840,3470756095,ZA 3470756096,3470761983,US -3470761984,3470767871,CA +3470761984,3470762751,CA +3470762752,3470762759,NL +3470762760,3470767871,CA 3470767872,3470768127,IE 3470768128,3470770175,CA 3470770176,3470778367,US 3470778368,3470786559,CA 3470786560,3470794751,US 3470794752,3470802943,PA -3470802944,3470869503,US -3470872576,3470884863,US +3470802944,3470873288,US +3470873289,3470873296,MX +3470873297,3470873584,US +3470873585,3470873592,NA +3470873593,3470875817,US +3470875818,3470875827,JP +3470875828,3470876402,US +3470876403,3470876410,IN +3470876411,3470884863,US 3470884864,3470885887,HK -3470888960,3470894079,US -3470897152,3471057919,US +3470885888,3471057919,US 3471057920,3471058943,VE 3471058944,3471059455,US 3471059456,3471060223,ES @@ -65197,7 +105248,12 @@ 3471060992,3471061247,NL 3471061248,3471061503,US 3471061504,3471061759,NL -3471061760,3471529215,US +3471061760,3471204679,US +3471204680,3471204687,PR +3471204688,3471262719,US +3471262720,3471263743,EC +3471263744,3471265791,CO +3471265792,3471529215,US 3471529216,3471529983,CA 3471529984,3471558655,US 3471558656,3471560703,CA @@ -65206,189 +105262,865 @@ 3471572992,3472375807,US 3472375808,3472392191,PR 3472392192,3472408575,CA -3472408576,3472565247,US -3472568320,3472609279,US -3472613376,3472721919,US -3472723968,3472730111,US -3472732160,3473039359,US -3473039360,3473041407,BM -3473043456,3473108991,US -3473108992,3473113087,UY -3473113088,3473276927,US +3472408576,3472990207,US +3472990208,3472990463,AS +3472990464,3473039359,US +3473039360,3473040639,BM +3473040640,3473040895,US +3473040896,3473041407,BM +3473041408,3473096192,US +3473096193,3473096447,PH +3473096448,3473109007,US +3473109008,3473109023,UY +3473109024,3473109039,US +3473109040,3473109071,UY +3473109072,3473109087,US +3473109088,3473109151,UY +3473109152,3473109167,US +3473109168,3473109183,UY +3473109184,3473109215,US +3473109216,3473109247,UY +3473109248,3473109279,US +3473109280,3473109311,UY +3473109312,3473109407,US +3473109408,3473109471,UY +3473109472,3473109487,US +3473109488,3473109495,UY +3473109496,3473109535,US +3473109536,3473109543,UY +3473109544,3473109567,US +3473109568,3473109695,UY +3473109696,3473109791,US +3473109792,3473110271,UY +3473110272,3473110303,US +3473110304,3473110383,UY +3473110384,3473110399,US +3473110400,3473110431,UY +3473110432,3473110495,US +3473110496,3473110783,UY +3473110784,3473110791,US +3473110792,3473110815,UY +3473110816,3473110831,US +3473110832,3473111007,UY +3473111008,3473111167,US +3473111168,3473112575,UY +3473112576,3473112639,US +3473112640,3473112703,UY +3473112704,3473112831,US +3473112832,3473112863,UY +3473112864,3473112895,US +3473112896,3473112959,UY +3473112960,3473276927,US 3473276928,3473342463,CA -3473342464,3473362943,US -3473367040,3473755391,US +3473342464,3473375495,US +3473375496,3473375503,NZ +3473375504,3473375671,US +3473375672,3473375679,GB +3473375680,3473377279,US +3473377280,3473377535,GB +3473377536,3473378559,US +3473378560,3473378575,DE +3473378576,3473381311,US +3473381312,3473381343,DE +3473381344,3473703551,US +3473703552,3473703679,CA +3473703680,3473755391,US 3473755392,3473755647,HN -3473755648,3473765887,US +3473755648,3473764799,US +3473764800,3473764815,PR +3473764816,3473764823,US +3473764824,3473764831,PR +3473764832,3473765887,US 3473765888,3473766399,EC -3473766400,3473813567,US +3473766400,3473786111,US +3473786112,3473786127,PR +3473786128,3473813567,US 3473813568,3473813599,CA 3473813600,3473901055,US 3473901056,3473901311,EC -3473901312,3474046463,US +3473901312,3473917439,US +3473917440,3473917695,PR +3473917696,3474046463,US 3474046464,3474046975,MX 3474046976,3474053119,US 3474053120,3474055167,PE -3474055168,3474391039,US +3474055168,3474193407,US +3474193408,3474193663,PH +3474193664,3474193919,US +3474193920,3474194431,PH +3474194432,3474362783,US +3474362784,3474362815,AU +3474362816,3474363647,US +3474363648,3474363687,GB +3474363688,3474363695,US +3474363696,3474363711,GB +3474363712,3474391039,US 3474391040,3474456575,CA -3474456576,3475025919,US -3475030016,3475034111,US -3475038208,3475111935,US +3474456576,3474463071,US +3474463072,3474463087,GB +3474463088,3474463183,US +3474463184,3474463199,GB +3474463200,3474463231,US +3474463232,3474463487,GB +3474463488,3474463791,US +3474463792,3474463807,GB +3474463808,3474463855,US +3474463856,3474463871,GB +3474463872,3474463903,US +3474463904,3474463919,GB +3474463920,3474464255,US +3474464256,3474464767,GB +3474464768,3474548223,US +3474548224,3474548479,JP +3474548480,3474623599,US +3474623600,3474623615,CA +3474623616,3475112191,US 3475112192,3475113215,CA -3475113216,3475113471,US +3475113216,3475115007,US 3475115008,3475120127,CA 3475120128,3475124223,US 3475124224,3475243007,CA 3475243008,3475589887,US 3475589888,3475590143,EC 3475590144,3475670015,US -3475670016,3475671039,AG -3475671040,3475719231,US +3475670016,3475670047,AG +3475670048,3475670079,KN +3475670080,3475670175,AG +3475670176,3475670207,KN +3475670208,3475670271,AG +3475670272,3475670527,AI +3475670528,3475670783,LC +3475670784,3475670847,DM +3475670848,3475671039,AG +3475671040,3475681279,US +3475681280,3475685375,HN +3475685376,3475719231,US 3475719232,3475719295,PR 3475719296,3475745503,US 3475745504,3475745535,CA -3475745536,3475851263,US -3475853312,3475881983,US -3475881984,3475890175,CA +3475745536,3475752703,US +3475752704,3475752959,AN +3475752960,3475881983,US +3475881984,3475884031,CA +3475884032,3475884287,US +3475884288,3475884319,CA +3475884320,3475884327,US +3475884328,3475888127,CA +3475888128,3475888383,US +3475888384,3475890175,CA 3475890176,3475996671,US 3475996672,3476029439,CA -3476029440,3476111359,US +3476029440,3476041551,US +3476041552,3476041583,MX +3476041584,3476076319,US +3476076320,3476076351,JO +3476076352,3476111359,US 3476111360,3476111871,CA 3476111872,3476221951,US 3476221952,3476223999,UY -3476224000,3476418559,US -3476418560,3476422655,CA +3476224000,3476265855,US +3476265856,3476265919,EG +3476265920,3476348927,US +3476348928,3476349183,CA +3476349184,3476418559,US +3476418560,3476419839,CA +3476419840,3476419959,US +3476419960,3476420095,CA +3476420096,3476420351,US +3476420352,3476420607,CA +3476420608,3476420863,US +3476420864,3476421887,CA +3476421888,3476422143,US +3476422144,3476422655,CA 3476422656,3476447231,US -3476447232,3476455423,CA -3476455424,3476881407,US +3476447232,3476451343,CA +3476451344,3476451375,US +3476451376,3476455423,CA +3476455424,3476718616,US +3476718617,3476718617,IN +3476718618,3476720363,US +3476720364,3476720367,LV +3476720368,3476720377,US +3476720378,3476720381,PT +3476720382,3476721159,US +3476721160,3476721167,IT +3476721168,3476721319,US +3476721320,3476721327,GB +3476721328,3476721679,US +3476721680,3476721687,IT +3476721688,3476721703,US +3476721704,3476721711,SI +3476721712,3476721743,US +3476721744,3476721759,CA +3476721760,3476721799,US +3476721800,3476721807,GB +3476721808,3476721823,US +3476721824,3476721831,GB +3476721832,3476721895,US +3476721896,3476721903,CA +3476721904,3476721911,AU +3476721912,3476722191,US +3476722192,3476722207,BE +3476722208,3476722239,IT +3476722240,3476722255,SA +3476722256,3476722271,US +3476722272,3476722319,IT +3476722320,3476722527,US +3476722528,3476722543,AU +3476722544,3476722591,US +3476722592,3476722607,GB +3476722608,3476722695,US +3476722696,3476722703,CA +3476722704,3476722727,US +3476722728,3476722735,BR +3476722736,3476722759,US +3476722760,3476722767,IN +3476722768,3476722775,US +3476722776,3476722783,GB +3476722784,3476723263,US +3476723264,3476723271,NL +3476723272,3476725183,US +3476725184,3476725215,ZA +3476725216,3476725247,US +3476725248,3476725255,CA +3476725256,3476725263,NL +3476725264,3476725287,US +3476725288,3476725295,NL +3476725296,3476725303,CA +3476725304,3476725359,NL +3476725360,3476725367,US +3476725368,3476725375,CA +3476725376,3476725383,VE +3476725384,3476725399,US +3476725400,3476725415,CA +3476725416,3476725423,US +3476725424,3476725431,GB +3476725432,3476725439,NL +3476725440,3476725455,US +3476725456,3476725463,NL +3476725464,3476732373,US +3476732374,3476732377,MX +3476732378,3476881407,US 3476881408,3476946943,CA -3476946944,3478114303,US +3476946944,3477161503,US +3477161504,3477161519,TN +3477161520,3477161551,US +3477161552,3477161567,TN +3477161568,3477161615,US +3477161616,3477161623,TN +3477161624,3477161631,US +3477161632,3477161663,TN +3477161664,3477161775,US +3477161776,3477161791,TN +3477161792,3477311871,US +3477311872,3477312255,A1 +3477312256,3477312511,US +3477312512,3477313023,A1 +3477313024,3478114303,US 3478114304,3478118399,PE 3478118400,3478192127,US 3478192128,3478257663,CA 3478257664,3478294527,US 3478294528,3478294543,GB -3478294544,3478352111,US +3478294544,3478323391,US +3478323392,3478323399,CA +3478323400,3478331519,US +3478331520,3478331647,GB +3478331648,3478331839,US +3478331840,3478331847,DK +3478331848,3478332991,US +3478332992,3478332999,CA +3478333000,3478347903,US +3478347904,3478348031,MX +3478348032,3478351951,US +3478351952,3478351967,GB +3478351968,3478352111,US 3478352112,3478352119,GB 3478352120,3478364159,US 3478364160,3478364167,BR -3478364168,3479207935,US +3478364168,3478364191,US +3478364192,3478364223,BR +3478364224,3478364255,US +3478364256,3478364271,BR +3478364272,3478372351,US +3478372352,3478380543,MX +3478380544,3479207935,US 3479207936,3479214079,CA 3479214080,3479214335,US -3479214336,3479231199,CA -3479231200,3479231207,US -3479231208,3479240703,CA -3479240704,3479339007,US -3479371776,3479568383,US +3479214336,3479240703,CA +3479240704,3479289919,US +3479289920,3479289951,BD +3479289952,3479290063,US +3479290064,3479290071,MX +3479290072,3479290087,US +3479290088,3479290095,LC +3479290096,3479290207,US +3479290208,3479290239,BD +3479290240,3479290351,US +3479290352,3479290359,IN +3479290360,3479290367,TH +3479290368,3479290431,BD +3479290432,3479290487,US +3479290488,3479290495,GB +3479290496,3479290631,US +3479290632,3479290639,GB +3479290640,3479290743,US +3479290744,3479290751,EC +3479290752,3479290767,US +3479290768,3479290783,CA +3479290784,3479291263,US +3479291264,3479291287,CA +3479291288,3479291671,US +3479291672,3479291679,CA +3479291680,3479291687,AU +3479291688,3479291695,US +3479291696,3479291703,AU +3479291704,3479291831,US +3479291832,3479291847,AU +3479291848,3479291855,JM +3479291856,3479291871,US +3479291872,3479291879,CA +3479291880,3479291911,US +3479291912,3479291919,IE +3479291920,3479292007,US +3479292008,3479292015,CA +3479292016,3479292223,US +3479292224,3479292231,UY +3479292232,3479292239,IN +3479292240,3479292671,US +3479292672,3479292687,AU +3479292688,3479292735,US +3479292736,3479292751,BD +3479292752,3479292815,US +3479292816,3479292823,IL +3479292824,3479293007,US +3479293008,3479293023,AU +3479293024,3479293031,US +3479293032,3479293039,CO +3479293040,3479293255,US +3479293256,3479293263,GB +3479293264,3479293311,US +3479293312,3479293319,CA +3479293320,3479293583,US +3479293584,3479293591,GB +3479293592,3479294031,US +3479294032,3479294039,BD +3479294040,3479294223,US +3479294224,3479294231,TH +3479294232,3479294487,US +3479294488,3479294495,MX +3479294496,3479294527,US +3479294528,3479294543,BD +3479294544,3479294559,US +3479294560,3479294567,GB +3479294568,3479294663,US +3479294664,3479294671,AU +3479294672,3479294775,US +3479294776,3479294783,CA +3479294784,3479295015,US +3479295016,3479295023,MY +3479295024,3479295071,US +3479295072,3479295079,CR +3479295080,3479295095,US +3479295096,3479295103,PR +3479295104,3479295359,US +3479295360,3479295367,AU +3479295368,3479295519,US +3479295520,3479295527,CA +3479295528,3479295583,US +3479295584,3479295591,NL +3479295592,3479295703,US +3479295704,3479295735,MY +3479295736,3479296007,US +3479296008,3479296015,CA +3479296016,3479296071,US +3479296072,3479296079,GB +3479296080,3479296095,MY +3479296096,3479296319,US +3479296320,3479296335,BD +3479296336,3479296607,US +3479296608,3479296615,BM +3479296616,3479296631,US +3479296632,3479296639,JP +3479296640,3479296671,US +3479296672,3479296679,NL +3479296680,3479296759,US +3479296760,3479296763,IL +3479296764,3479297615,US +3479297616,3479297623,CA +3479297624,3479298047,US +3479298048,3479298063,IS +3479298064,3479298079,GB +3479298080,3479298103,US +3479298104,3479298111,BM +3479298112,3479298199,US +3479298200,3479298207,BM +3479298208,3479298319,US +3479298320,3479298327,IN +3479298328,3479298399,US +3479298400,3479298407,IN +3479298408,3479298463,US +3479298464,3479298471,CA +3479298472,3479298583,US +3479298584,3479298591,JP +3479298592,3479298599,AU +3479298600,3479298759,US +3479298760,3479298767,CA +3479298768,3479301127,US +3479301128,3479301135,GB +3479301136,3479301183,US +3479301184,3479301191,GB +3479301192,3479301287,US +3479301288,3479301295,IL +3479301296,3479301455,US +3479301456,3479301463,IN +3479301464,3479301519,US +3479301520,3479301535,TH +3479301536,3479301551,CA +3479301552,3479301579,US +3479301580,3479301583,IN +3479301584,3479301663,US +3479301664,3479301679,NL +3479301680,3479301687,US +3479301688,3479301695,NZ +3479301696,3479301775,US +3479301776,3479301783,IN +3479301784,3479303759,US +3479303760,3479303767,ZA +3479303768,3479303951,US +3479303952,3479303975,NL +3479303976,3479303983,US +3479303984,3479303991,CA +3479303992,3479304319,US +3479304320,3479304327,JM +3479304328,3479304447,US +3479304448,3479304455,IL +3479304456,3479304463,MX +3479304464,3479304863,US +3479304864,3479304871,PK +3479304872,3479305055,US +3479305056,3479305071,JP +3479305072,3479305175,US +3479305176,3479305183,BM +3479305184,3479305215,US +3479305216,3479305231,EG +3479305232,3479305271,US +3479305272,3479305279,IN +3479305280,3479305583,US +3479305584,3479305599,BD +3479305600,3479305983,US +3479305984,3479306015,CA +3479306016,3479306031,US +3479306032,3479306039,PK +3479306040,3479306079,US +3479306080,3479306087,BD +3479306088,3479568383,US 3479568384,3479633919,CA -3479633920,3479896063,US -3479896064,3479961599,CA +3479633920,3479789343,US +3479789344,3479789360,UY +3479789361,3479896063,US +3479896064,3479923071,CA +3479923072,3479923079,US +3479923080,3479961599,CA 3479961600,3480223743,US -3480223744,3480256511,CA +3480223744,3480226959,CA +3480226960,3480226967,US +3480226968,3480227455,CA +3480227456,3480227463,US +3480227464,3480251007,CA +3480251008,3480251071,US +3480251072,3480256511,CA 3480256512,3480284159,US 3480284160,3480284671,CA 3480284672,3480416063,US -3480416064,3480416127,PA -3480416128,3480444927,US -3480444928,3480449023,CA -3480449024,3481149439,US -3481153536,3481169151,US +3480416064,3480416095,PA +3480416096,3480444927,US +3480444928,3480446335,CA +3480446336,3480446463,US +3480446464,3480446575,CA +3480446576,3480446583,ES +3480446584,3480449023,CA +3480449024,3480551423,US +3480551424,3480551679,JP +3480551680,3480551935,DE +3480551936,3480552191,GB +3480552192,3480552447,US +3480552448,3480552703,CH +3480552704,3480552959,US +3480552960,3480553215,AT +3480553216,3480553343,US +3480553344,3480553470,MX +3480553471,3480553471,US +3480553472,3480553727,SG +3480553728,3480553983,HK +3480553984,3480554239,US +3480554240,3480554495,GB +3480554496,3480554751,SG +3480554752,3480555263,US +3480555264,3480555519,NO +3480555520,3480555775,FR +3480555776,3480556287,SG +3480556288,3480556543,HK +3480556544,3480557055,US +3480557056,3480557311,HK +3480557312,3480557567,US +3480557568,3480557823,JP +3480557824,3480558079,CA +3480558080,3480558591,US +3480558592,3480558847,DO +3480558848,3480559359,US +3480559360,3480559615,IT +3480559616,3480560895,US +3480560896,3480561151,BR +3480561152,3480561919,US +3480561920,3480562175,JP +3480562176,3480562751,US +3480562752,3480562815,PR +3480562816,3480564735,US +3480564736,3480564991,DE +3480564992,3480567039,US +3480567040,3480567551,GB +3480567552,3480568319,US +3480568320,3480568575,HK +3480568576,3480568671,IT +3480568672,3480568703,GB +3480568704,3480568831,FR +3480568832,3480569599,US +3480569600,3480569855,HK +3480569856,3480570111,US +3480570112,3480570367,FR +3480570368,3480570623,ES +3480570624,3480570879,JP +3480570880,3480571391,CH +3480571392,3480571647,BE +3480571648,3480571775,FI +3480571776,3480573567,US +3480573568,3480573631,IT +3480573632,3480573695,DE +3480573696,3480574527,US +3480574528,3480574591,NL +3480574592,3480575231,US +3480575232,3480575487,IL +3480575488,3480575743,US +3480575744,3480577023,IT +3480577024,3480579327,US +3480579328,3480579583,IT +3480579584,3480579711,US +3480579712,3480579775,BG +3480579776,3480579839,AU +3480579840,3480580095,HK +3480580096,3480580351,JP +3480580352,3480580607,KR +3480580608,3480580863,SE +3480580864,3480581119,DK +3480581120,3480581247,US +3480581248,3480581375,NL +3480581376,3480581631,US +3480581632,3480581887,CL +3480581888,3480582143,NO +3480582144,3480582399,US +3480582400,3480582655,RU +3480582656,3480583423,MX +3480583424,3480585599,US +3480585600,3480585663,ES +3480585664,3480587647,US +3480587648,3480587775,PT +3480587776,3480588799,US +3480588800,3480589055,SE +3480589056,3480590463,US +3480590464,3480590591,FR +3480590592,3480591103,US +3480591104,3480591359,ZA +3480591360,3480591423,US +3480591424,3480591487,GR +3480591488,3480591615,US +3480591616,3480592127,ID +3480592128,3480592383,NO +3480592384,3480592639,CH +3480592640,3480592895,IE +3480592896,3480593151,SG +3480593152,3480593407,DK +3480593408,3480593663,SG +3480593664,3480593919,CN +3480593920,3480594175,ZA +3480594176,3480594431,BE +3480594432,3480595711,US +3480595712,3480595967,TH +3480595968,3480596991,SG +3480596992,3480597247,US +3480597248,3480598271,AU +3480598272,3480598527,FR +3480598528,3480599039,AU +3480599040,3480599295,JP +3480599296,3480599551,CA +3480599552,3480599807,SG +3480599808,3480600575,US +3480600576,3480601087,DE +3480601088,3480601343,BE +3480601344,3480601599,AU +3480601600,3480601855,GB +3480601856,3480602111,FR +3480602112,3480602879,US +3480602880,3480603647,IT +3480603648,3480603903,BE +3480603904,3480604159,HK +3480604160,3480604671,ES +3480604672,3480604927,IL +3480604928,3480605183,GB +3480605184,3480605439,MX +3480605440,3480605695,PH +3480605696,3480605951,MX +3480605952,3480606207,PH +3480606208,3480606463,MX +3480606464,3480606719,BE +3480606720,3480606975,GR +3480606976,3480607231,CA +3480607232,3480607487,IT +3480607488,3480610303,US +3480610304,3480610559,ES +3480610560,3480610815,US +3480610816,3480610943,AU +3480610944,3480611071,HU +3480611072,3480611327,US +3480611328,3480611583,JP +3480611584,3480611839,MX +3480611840,3480612095,BR +3480612096,3480612351,LU +3480612352,3480613631,DE +3480613632,3480839423,US +3480839424,3480840191,GB +3480840192,3480907263,US +3480907264,3480907775,FR +3480907776,3480968191,US +3480968192,3480968447,AU +3480968448,3481169151,US 3481169152,3481169407,NZ -3481169408,3481176063,US -3481178112,3481182207,US -3481184256,3481665535,US +3481169408,3481182503,US +3481182504,3481182511,CA +3481182512,3481665535,US 3481665536,3481731071,CA -3481731072,3481776127,US -3481780224,3481812991,US -3481812992,3481829375,CA +3481731072,3481812991,US +3481812992,3481822063,CA +3481822064,3481822079,US +3481822080,3481829375,CA 3481829376,3481993215,US -3481993216,3481993887,CA +3481993216,3481993783,CA +3481993784,3481993791,US +3481993792,3481993887,CA 3481993888,3481993895,US -3481993896,3482058751,CA +3481993896,3481995279,CA +3481995280,3481995287,US +3481995288,3481995303,CA +3481995304,3481995311,US +3481995312,3481995519,CA +3481995520,3481995527,US +3481995528,3481995543,CA +3481995544,3481995551,US +3481995552,3481998591,CA +3481998592,3481998847,AG +3481998848,3482014079,CA +3482014080,3482014207,AG +3482014208,3482018815,CA +3482018816,3482019071,US +3482019072,3482022783,CA +3482022784,3482022847,US +3482022848,3482043735,CA +3482043736,3482043743,US +3482043744,3482048191,CA +3482048192,3482048255,US +3482048256,3482058751,CA 3482058752,3482583039,US 3482583040,3482632191,CA 3482632192,3482775551,US -3482775552,3482779647,PR -3482779648,3482910719,US +3482775552,3482778375,PR +3482778376,3482778383,US +3482778384,3482779647,PR +3482779648,3482864191,US +3482864192,3482864255,A1 +3482864256,3482910719,US 3482910720,3482927103,CA 3482927104,3483296004,US 3483296005,3483296005,BE 3483296006,3483435007,US 3483435008,3483533311,CA -3483541504,3483631615,US +3483533312,3483631615,US 3483631616,3483697151,CA 3483697152,3483791359,US -3483791360,3483795455,PR +3483791360,3483791407,PR +3483791408,3483791415,VI +3483791416,3483791423,US +3483791424,3483791599,PR +3483791600,3483791607,VI +3483791608,3483791735,PR +3483791736,3483791743,VI +3483791744,3483791831,PR +3483791832,3483791839,VI +3483791840,3483791983,PR +3483791984,3483791999,US +3483792000,3483792015,PR +3483792016,3483792031,IL +3483792032,3483792111,PR +3483792112,3483792119,US +3483792120,3483795455,PR 3483795456,3483828223,US 3483828224,3483836415,CA 3483836416,3483877375,US 3483877376,3483893759,CA -3483893760,3484450815,US -3484450816,3484451071,CA -3484451072,3484451871,US -3484451872,3484451903,CA -3484451904,3484451967,US -3484451968,3484451999,CA -3484452000,3484452031,US -3484452032,3484452063,CA -3484452064,3484452095,US -3484452096,3484452351,CA -3484452352,3484453887,US -3484453888,3484455167,CA -3484455168,3484455199,US -3484455200,3484455231,CA -3484455232,3484455359,US -3484455360,3484455423,CA -3484455424,3484459007,US -3484459008,3484459775,CA -3484459776,3484460735,US -3484460736,3484460751,CA -3484460752,3484462335,US -3484462336,3484462591,CA -3484462592,3484463615,US -3484463616,3484464143,CA -3484464144,3484464831,US -3484464832,3484464895,CA -3484464896,3484465663,US -3484465664,3484465919,CA -3484465920,3484466687,US -3484466688,3484467199,CA -3484467200,3484467967,US -3484467968,3484468223,CA -3484468224,3484468479,US -3484468480,3484468991,CA -3484468992,3484469247,US +3483893760,3484013055,US +3484013056,3484013567,DE +3484013568,3484319743,US +3484320256,3484320815,US +3484320816,3484320823,DE +3484320832,3484321279,US +3484321792,3484450815,US +3484450816,3484451839,CA +3484451840,3484451871,US +3484451872,3484455263,CA +3484455264,3484455295,US +3484455296,3484455359,CA +3484455360,3484455391,US +3484455392,3484455807,CA +3484455808,3484455871,US +3484455872,3484456191,CA +3484456192,3484456703,US +3484456704,3484457727,CA +3484457728,3484457983,US +3484457984,3484458239,CA +3484458240,3484458495,US +3484458496,3484458783,CA +3484458784,3484458791,US +3484458792,3484458807,CA +3484458808,3484458815,US +3484458816,3484458887,CA +3484458888,3484458903,US +3484458904,3484458911,CA +3484458912,3484458919,US +3484458920,3484458959,CA +3484458960,3484458967,US +3484458968,3484459791,CA +3484459792,3484459807,US +3484459808,3484459823,CA +3484459824,3484459839,US +3484459840,3484459855,CA +3484459856,3484459871,US +3484459872,3484459887,CA +3484459888,3484459919,US +3484459920,3484459967,CA +3484459968,3484459999,US +3484460000,3484460015,CA +3484460016,3484460031,US +3484460032,3484460287,CA +3484460288,3484460543,US +3484460544,3484460575,CA +3484460576,3484460591,US +3484460592,3484460703,CA +3484460704,3484460719,US +3484460720,3484460783,CA +3484460784,3484460799,US +3484460800,3484461079,CA +3484461080,3484461095,US +3484461096,3484461103,CA +3484461104,3484461199,US +3484461200,3484461231,CA +3484461232,3484461263,US +3484461264,3484461271,CA +3484461272,3484461279,US +3484461280,3484461375,CA +3484461376,3484461439,US +3484461440,3484461503,CA +3484461504,3484461631,US +3484461632,3484462103,CA +3484462104,3484462143,US +3484462144,3484462159,CA +3484462160,3484462175,US +3484462176,3484462199,CA +3484462200,3484462215,US +3484462216,3484462263,CA +3484462264,3484462271,US +3484462272,3484462279,CA +3484462280,3484462303,US +3484462304,3484462975,CA +3484462976,3484463039,US +3484463040,3484463151,CA +3484463152,3484463183,US +3484463184,3484464143,CA +3484464144,3484464159,US +3484464160,3484464175,CA +3484464176,3484464191,US +3484464192,3484464223,CA +3484464224,3484464287,US +3484464288,3484464303,CA +3484464304,3484464319,US +3484464320,3484464335,CA +3484464336,3484464383,US +3484464384,3484464703,CA +3484464704,3484464735,US +3484464736,3484465151,CA +3484465152,3484465407,US +3484465408,3484466431,CA +3484466432,3484466687,US +3484466688,3484468287,CA +3484468288,3484468479,US +3484468480,3484469119,CA +3484469120,3484469247,US 3484469248,3484469759,CA -3484469760,3484470271,US -3484470272,3484470527,CA -3484470528,3484471807,US -3484471808,3484472063,CA -3484472064,3484473343,US -3484473344,3484473599,CA -3484473600,3484473855,US -3484473856,3484474623,CA -3484474624,3484475135,US -3484475136,3484475647,CA -3484475648,3484475903,US -3484475904,3484476159,CA -3484476160,3484476415,US -3484476416,3484476927,CA -3484476928,3484480255,US -3484480256,3484481279,CA -3484481280,3484481791,US -3484481792,3484482047,CA +3484469760,3484469791,US +3484469792,3484469887,CA +3484469888,3484469951,US +3484469952,3484470527,CA +3484470528,3484471295,US +3484471296,3484471551,CA +3484471552,3484471807,US +3484471808,3484472135,CA +3484472136,3484472167,US +3484472168,3484472183,CA +3484472184,3484472199,US +3484472200,3484472223,CA +3484472224,3484472263,US +3484472264,3484472271,CA +3484472272,3484472279,US +3484472280,3484472295,CA +3484472296,3484472303,US +3484472304,3484472311,CA +3484472312,3484472319,US +3484472320,3484472839,CA +3484472840,3484472855,US +3484472856,3484473007,CA +3484473008,3484473015,US +3484473016,3484473023,CA +3484473024,3484473031,US +3484473032,3484473047,CA +3484473048,3484473055,US +3484473056,3484473087,CA +3484473088,3484473151,US +3484473152,3484473343,CA +3484473344,3484473727,US +3484473728,3484473791,CA +3484473792,3484474111,US +3484474112,3484477183,CA +3484477184,3484477695,US +3484477696,3484478207,CA +3484478208,3484478719,US +3484478720,3484478975,CA +3484478976,3484479231,US +3484479232,3484479487,CA +3484479488,3484479743,US +3484479744,3484479999,CA +3484480000,3484480255,US +3484480256,3484482047,CA 3484482048,3484482559,US -3484482560,3484482815,CA -3484482816,3484483071,US -3484483072,3484483327,CA -3484483328,3484647423,US +3484482560,3484483583,CA +3484483584,3484647423,US 3484647424,3484663807,CA 3484663808,3484746815,US 3484746816,3484746943,GB 3484746944,3484762111,US -3484762112,3484778495,CA -3484778496,3484848127,US -3484852224,3484884991,US +3484762112,3484775743,CA +3484775744,3484775775,US +3484775776,3484777663,CA +3484777664,3484777695,US +3484777696,3484778495,CA +3484778496,3484884991,US 3484884992,3484893183,CA 3484893184,3485220863,US 3485220864,3485229055,CA @@ -65396,28 +106128,288 @@ 3485290464,3485290479,GB 3485290480,3485327359,US 3485327360,3485335551,CA -3485335552,3485433855,US +3485335552,3485442047,US 3485442048,3485446143,VE -3485446144,3485462527,US +3485446144,3485458847,US +3485458848,3485458863,FR +3485458864,3485462527,US +3485462528,3485466623,VC 3485466624,3485597695,US 3485597696,3485671583,CA 3485671584,3485671615,US 3485671616,3485672543,CA 3485672544,3485672551,US 3485672552,3485695999,CA -3485696000,3486023679,US +3485696000,3485724671,US +3485724672,3485728767,A1 +3485728768,3485885127,US +3485885128,3485885141,CA +3485885142,3485886917,US +3485886918,3485886931,IN +3485886932,3485887747,US +3485887748,3485887777,AU +3485887778,3486023679,US 3486023680,3486031871,CA -3486031872,3486048255,US -3486056448,3486253055,US -3486318592,3486646271,US +3486031872,3486210303,US +3486210304,3486210319,FM +3486210320,3486269439,US +3486269440,3486285823,JM +3486285824,3486302207,PR +3486302208,3486310399,CA +3486318592,3486501951,US +3486501952,3486501967,DE +3486501968,3486580735,US +3486580736,3486580991,GB +3486580992,3486581503,DE +3486581504,3486581759,TW +3486581760,3486582015,GB +3486582016,3486582271,NO +3486582272,3486582527,BE +3486582528,3486582783,AU +3486582784,3486583039,DE +3486583040,3486583295,CH +3486583296,3486583807,US +3486583808,3486584063,KR +3486584064,3486584319,US +3486584320,3486584831,CA +3486584832,3486585343,US +3486585344,3486585599,PT +3486585600,3486586367,FR +3486586368,3486586623,NZ +3486586624,3486586879,US +3486586880,3486587135,AU +3486587136,3486587391,FR +3486587392,3486587647,NL +3486587648,3486587903,CL +3486587904,3486588415,GB +3486588416,3486588671,FR +3486588672,3486589119,US +3486589120,3486589151,NL +3486589152,3486589247,US +3486589248,3486589279,ZA +3486589280,3486589951,US +3486589952,3486590207,IT +3486590208,3486590463,US +3486590464,3486591743,GB +3486591744,3486591999,CH +3486592000,3486592063,FI +3486592064,3486592255,US +3486592256,3486592511,NL +3486592512,3486593023,NO +3486593024,3486593279,NL +3486593280,3486593791,DE +3486593792,3486594047,FR +3486594048,3486594303,DE +3486594304,3486594559,BE +3486594560,3486594719,US +3486594720,3486594751,LU +3486594752,3486594783,GB +3486594784,3486594815,US +3486594816,3486594943,AR +3486594944,3486595071,US +3486595072,3486595327,DK +3486595328,3486595583,ID +3486595584,3486595839,PR +3486595840,3486596095,DK +3486596096,3486596351,NL +3486596352,3486596607,NO +3486596608,3486596735,US +3486596736,3486596799,CH +3486596800,3486596863,FR +3486596864,3486597119,GB +3486597120,3486597375,IE +3486597376,3486597631,IT +3486597632,3486597887,GB +3486597888,3486598591,US +3486598592,3486598655,FR +3486598656,3486598911,BR +3486598912,3486599167,NO +3486599168,3486599423,SE +3486599424,3486599679,BR +3486599680,3486599935,US +3486599936,3486600447,BR +3486600448,3486601215,US +3486601216,3486601471,BE +3486601472,3486601535,TR +3486601536,3486601727,US +3486601728,3486601983,BE +3486601984,3486602239,NZ +3486602240,3486602431,US +3486602432,3486602495,CO +3486602496,3486603007,US +3486603008,3486603263,SG +3486603264,3486603295,US +3486603296,3486603327,BR +3486603328,3486603391,CL +3486603392,3486603407,US +3486603408,3486603423,AR +3486603424,3486603455,US +3486603456,3486603519,AR +3486603520,3486603775,JP +3486603776,3486604031,US +3486604032,3486604287,AU +3486604288,3486604543,BE +3486604544,3486604575,US +3486604576,3486604607,SG +3486604608,3486604615,MY +3486604616,3486604671,US +3486604672,3486604735,CO +3486604736,3486605055,US +3486605056,3486605311,ES +3486605312,3486605567,NL +3486605568,3486606079,US +3486606080,3486606335,MY +3486606336,3486606591,US +3486606592,3486606847,FI +3486606848,3486607359,US +3486607360,3486607615,JP +3486607616,3486607871,US +3486607872,3486608127,PH +3486608128,3486608383,GB +3486608384,3486609151,US +3486609152,3486609663,HK +3486609664,3486609919,AU +3486609920,3486610175,SG +3486610176,3486610431,US +3486610432,3486610687,SE +3486610688,3486610943,NL +3486610944,3486611199,US +3486611200,3486611215,BR +3486611216,3486611455,US +3486611456,3486611711,SG +3486611712,3486611775,EC +3486611776,3486611967,US +3486611968,3486612223,HK +3486612224,3486612479,SG +3486612480,3486612607,US +3486612608,3486612735,FR +3486612736,3486612991,DE +3486612992,3486613247,US +3486613248,3486613759,GB +3486613760,3486614015,ES +3486614016,3486614271,DE +3486614272,3486614527,GB +3486614528,3486614783,US +3486614784,3486615039,FR +3486615040,3486615295,BE +3486615296,3486615551,PH +3486615552,3486615871,US +3486615872,3486615903,LU +3486615904,3486615935,US +3486615936,3486615967,CH +3486615968,3486616319,US +3486616320,3486616831,NO +3486616832,3486617215,US +3486617216,3486617343,SE +3486617344,3486617599,US +3486617600,3486617855,CH +3486617856,3486618111,AU +3486618112,3486618367,NO +3486618368,3486618623,ES +3486618624,3486618879,BE +3486618880,3486619135,FR +3486619136,3486619391,SG +3486619392,3486619647,BE +3486619648,3486619903,CA +3486619904,3486620159,US +3486620160,3486620415,SE +3486620416,3486620671,HK +3486620672,3486620927,US +3486620928,3486621183,NL +3486621184,3486621439,US +3486621440,3486621695,NL +3486621696,3486621951,FI +3486621952,3486622207,ES +3486622208,3486622463,ZA +3486622464,3486622719,GB +3486622720,3486622975,MX +3486622976,3486623231,DE +3486623232,3486623487,JP +3486623488,3486623743,DE +3486623744,3486623999,US +3486624000,3486624255,PH +3486624256,3486624511,SG +3486624512,3486624767,SE +3486624768,3486625023,ES +3486625024,3486625055,US +3486625056,3486625087,MX +3486625088,3486625151,US +3486625152,3486625183,MX +3486625184,3486625279,US +3486625280,3486625535,SE +3486625536,3486625791,NO +3486625792,3486626047,NL +3486626048,3486626303,FI +3486626304,3486626559,IL +3486626560,3486626567,CH +3486626568,3486626591,US +3486626592,3486626623,FI +3486626624,3486627071,US +3486627072,3486627327,JP +3486627328,3486627583,US +3486627584,3486627839,BE +3486627840,3486628095,BW +3486628096,3486628351,ZA +3486628352,3486628607,US +3486628608,3486628863,NO +3486628864,3486629375,PT +3486629376,3486629631,US +3486629632,3486629887,CL +3486629888,3486630143,SE +3486630144,3486631679,JP +3486631680,3486631935,ID +3486631936,3486632447,JP +3486632448,3486632703,US +3486632704,3486632959,JP +3486632960,3486633215,IT +3486633216,3486633471,GB +3486633472,3486633599,US +3486633600,3486633727,CN +3486633728,3486633983,US +3486633984,3486634239,HK +3486634240,3486634495,US +3486634496,3486634751,KR +3486634752,3486635007,CH +3486635008,3486635263,DK +3486635264,3486635519,FR +3486635520,3486635775,ES +3486635776,3486636031,IL +3486636032,3486636287,ES +3486636288,3486636543,NL +3486636544,3486636799,TW +3486636800,3486637055,DE +3486637056,3486637311,US +3486637312,3486637823,BE +3486637824,3486638335,SE +3486638336,3486638591,FR +3486638592,3486638623,US +3486638624,3486638639,CN +3486638640,3486638847,US +3486638848,3486639103,DK +3486639104,3486639359,BE +3486639360,3486639615,SG +3486639616,3486640127,US +3486640128,3486640383,BE +3486640384,3486640639,GB +3486640640,3486642175,US +3486642176,3486642431,BR +3486642432,3486642687,PT +3486642688,3486642943,DK +3486642944,3486646015,US +3486646016,3486646143,JP +3486646144,3486646271,US 3486646272,3486662655,CA 3486662656,3486699519,US 3486699520,3486699775,CA 3486699776,3486700399,US 3486700400,3486700407,CA -3486700408,3486701311,US +3486700408,3486700439,US +3486700440,3486700447,IT +3486700448,3486701311,US 3486701312,3486701567,CA -3486701568,3487039487,US +3486701568,3486711551,US +3486711552,3486711807,CA +3486711808,3487039487,US 3487039488,3487105023,CA 3487105024,3487187199,US 3487187200,3487187215,GB @@ -65445,50 +106437,49 @@ 3487863808,3487875071,BM 3487875072,3487891455,US 3487891456,3487907839,CA -3487907840,3488014335,US +3487907840,3487969791,US +3487969792,3487970047,KW +3487970048,3488014335,US 3488014336,3488022527,CA -3488022528,3488049151,US -3488051200,3488065535,US -3488067584,3488071679,US +3488022528,3488071679,US 3488071680,3488072703,CA -3488075776,3488079871,US +3488072704,3488079871,US 3488079872,3488083967,CA -3488083968,3488089119,US -3488089120,3488089343,IL -3488089344,3488089887,US -3488089888,3488089983,IL -3488089984,3488090527,US -3488090528,3488090559,IL -3488090560,3488090623,US -3488090624,3488090687,IL -3488090688,3488090719,US -3488090720,3488090879,IL -3488090880,3488090943,US -3488090944,3488090975,IL -3488090976,3488091647,US -3488091648,3488091775,IL -3488091776,3488092943,US -3488092944,3488092959,IL -3488092960,3488092991,US -3488092992,3488093055,IL -3488093056,3488093951,US -3488093952,3488094015,IL -3488094016,3488094719,US -3488094720,3488094735,IL -3488094736,3488094751,US -3488094752,3488094783,IL -3488094784,3488094831,US -3488094832,3488094847,IL -3488094848,3488095103,US -3488095104,3488095119,IL -3488095120,3488108543,US -3488112640,3488120831,CA -3488120832,3488350207,US -3488350208,3488415743,CA -3488415744,3488722687,US +3488083968,3488088063,US +3488088064,3488104447,IL +3488104448,3488112639,US +3488112640,3488113839,CA +3488113840,3488113847,US +3488113848,3488116863,CA +3488116864,3488116871,US +3488116872,3488118559,CA +3488118560,3488118567,US +3488118568,3488120831,CA +3488120832,3488300287,US +3488300288,3488300543,A2 +3488300544,3488350207,US +3488350208,3488361215,CA +3488361216,3488361471,US +3488361472,3488415743,CA +3488415744,3488615935,US +3488615936,3488616191,AU +3488616192,3488718847,US +3488718848,3488719999,A2 +3488720000,3488720063,US +3488720064,3488720095,BG +3488720096,3488720111,BY +3488720112,3488720639,A2 +3488720640,3488720895,US +3488720896,3488721151,AL +3488721152,3488721407,A2 +3488721408,3488722175,BA +3488722176,3488722431,RO +3488722432,3488722687,AL 3488722688,3488723199,JM -3488723200,3488909311,US -3488911360,3488940031,US +3488723200,3488727039,A2 +3488727040,3488901887,US +3488901888,3488902143,CA +3488902144,3488940031,US 3488940032,3488956415,CA 3488956416,3488989183,US 3488989184,3489005567,CA @@ -65502,13 +106493,18 @@ 3489464320,3489529855,CA 3489529856,3489562623,US 3489562624,3489566719,JM -3489566720,3489579007,US -3489587200,3489717759,US +3489566720,3489673471,US +3489673472,3489673727,PR +3489673728,3489717759,US 3489717760,3489718015,PR 3489718016,3489718271,US -3489718272,3489718527,AG +3489718272,3489718527,DM 3489718528,3489719039,LC -3489719040,3489720063,AG +3489719040,3489719191,AG +3489719192,3489719199,VG +3489719200,3489719551,AG +3489719552,3489719807,VG +3489719808,3489720063,DM 3489720064,3489720319,LC 3489720320,3489738751,US 3489738752,3489740799,PH @@ -65516,7 +106512,9 @@ 3489741784,3489741791,CA 3489741792,3489749503,US 3489749504,3489749519,CA -3489749520,3489756119,US +3489749520,3489753151,US +3489753152,3489753167,PR +3489753168,3489756119,US 3489756120,3489756127,DE 3489756128,3489761743,US 3489761744,3489761759,CA @@ -65524,25 +106522,41 @@ 3489774832,3489774839,GB 3489774840,3489775103,US 3489775104,3489775359,BO -3489775360,3490041503,US +3489775360,3489969151,US +3489969152,3489969663,PR +3489969664,3490041503,US 3490041504,3490041535,CA -3490041536,3490072575,US -3490072576,3490074623,CA -3490074624,3490263039,US +3490041536,3490072831,US +3490072832,3490073279,CA +3490073280,3490073311,US +3490073312,3490073375,CA +3490073376,3490073599,US +3490073600,3490074622,CA +3490074623,3490228735,US +3490228736,3490229247,CO +3490229248,3490263039,US 3490263040,3490267135,CO -3490267136,3490653871,US +3490267136,3490488319,US +3490488320,3490489343,PR +3490489344,3490653871,US 3490653872,3490653887,CA -3490653888,3490703615,US +3490653888,3490702847,US +3490702848,3490703103,AS +3490703104,3490703615,US 3490703616,3490703871,PR 3490703872,3490732431,US 3490732432,3490732447,CA 3490732448,3490786047,US 3490786048,3490786303,PR -3490786304,3490863615,US -3490863616,3490863871,CA -3490863872,3490879231,US +3490786304,3490879231,US 3490879232,3490879487,PR -3490879488,3491226687,US +3490879488,3490922495,US +3490922496,3490924543,CO +3490924544,3490974719,US +3490974720,3490975743,PR +3490975744,3491219183,US +3491219184,3491219191,PR +3491219192,3491226687,US 3491226688,3491226719,CA 3491226720,3491231807,US 3491231808,3491231823,PR @@ -65552,24 +106566,40 @@ 3491381248,3491389439,BM 3491389440,3491476991,US 3491476992,3491478527,VI -3491478528,3491506631,US +3491478528,3491478591,US +3491478592,3491478599,PR +3491478600,3491506631,US 3491506632,3491506639,DK 3491506640,3491508223,US 3491508224,3491512319,CA -3491512320,3491637247,US +3491512320,3491594239,US +3491594240,3491596287,CO +3491596288,3491637247,US 3491637248,3491637759,CO 3491637760,3491651583,US 3491651584,3491659775,VI -3491659776,3491743743,US +3491659776,3491736063,US +3491736064,3491736319,PR +3491736320,3491743743,US 3491743744,3491745791,CO 3491745792,3491764783,US 3491764784,3491764791,PR 3491764792,3491780607,US 3491780608,3491781631,EC -3491781632,3491968423,US +3491781632,3491826687,US +3491826688,3491826943,AN +3491826944,3491921663,US +3491921664,3491921919,PR +3491921920,3491955711,US +3491955712,3491956735,CO +3491956736,3491959807,US +3491959808,3491960319,CO +3491960320,3491968423,US 3491968424,3491968431,PR 3491968432,3491968447,AF -3491968448,3491971607,US +3491968448,3491969023,US +3491969024,3491970047,PR +3491970048,3491971607,US 3491971608,3491971615,IT 3491971616,3491971751,US 3491971752,3491971759,AU @@ -65577,7 +106607,11 @@ 3491971952,3491971967,HK 3491971968,3491973151,US 3491973152,3491973159,VE -3491973160,3492005375,US +3491973160,3491979263,US +3491979264,3491981823,CO +3491981824,3491983359,US +3491983360,3491987455,CO +3491987456,3492005375,US 3492005376,3492005391,DK 3492005392,3492005439,US 3492005440,3492005447,DK @@ -65585,11 +106619,18 @@ 3492005464,3492005487,AU 3492005488,3492151295,US 3492151296,3492167679,CA -3492167680,3492198655,US -3492198656,3492200447,GB -3492216832,3492669951,US -3492669952,3492671487,PA -3492671488,3492827391,US +3492167680,3492188799,US +3492188800,3492188831,CH +3492188832,3492208639,US +3492216832,3492472039,US +3492472040,3492472047,GB +3492472048,3492646623,US +3492646624,3492646639,IL +3492646640,3492669695,US +3492669696,3492671487,PA +3492671488,3492795775,US +3492795776,3492795903,AR +3492795904,3492827391,US 3492827392,3492827423,CA 3492827424,3492827431,US 3492827432,3492827439,DE @@ -65598,7 +106639,11 @@ 3492827520,3492827647,AU 3492827648,3492827903,US 3492827904,3492827967,AU -3492827968,3493070847,US +3492827968,3493018639,US +3493018640,3493018655,AE +3493018656,3493069055,US +3493069056,3493069311,A2 +3493069312,3493070847,US 3493070848,3493071871,HT 3493071872,3493073151,US 3493073152,3493073407,BO @@ -65611,133 +106656,332 @@ 3493079040,3493081087,HT 3493081088,3493081599,US 3493081600,3493082623,PY -3493082624,3493089279,US -3493089280,3493090815,BO +3493082624,3493089023,US +3493089024,3493089279,A2 +3493089280,3493089311,BO +3493089312,3493089343,US +3493089344,3493090815,BO 3493090816,3493091327,US 3493091328,3493092351,BO 3493092352,3493092607,NA 3493092608,3493135167,US 3493135168,3493135199,CY -3493135200,3493135807,US -3493135808,3493135839,CA -3493135840,3493135871,US -3493135872,3493136383,CA -3493136384,3493137919,US -3493137920,3493138175,CA -3493138176,3493139199,US -3493139200,3493139455,CA -3493139456,3493140127,US +3493135200,3493135871,US +3493135872,3493136127,CA +3493136128,3493138207,US +3493138208,3493138239,DE +3493138240,3493139711,US +3493139712,3493139775,CA +3493139776,3493139839,US +3493139840,3493139935,CA +3493139936,3493140127,US 3493140128,3493140159,CA 3493140160,3493141279,US 3493141280,3493141311,CY -3493141312,3493141503,US -3493141504,3493141759,CA -3493141760,3493142271,US -3493142272,3493142527,CA -3493142528,3493244927,US +3493141312,3493244927,US 3493244928,3493249023,PR -3493249024,3493858303,US -3493859328,3493866495,US +3493249024,3493728959,US +3493728960,3493728991,A2 +3493728992,3493866495,US 3493866496,3493867519,VG 3493867520,3493874687,US 3493874688,3493875711,BM 3493875712,3493881855,US 3493881856,3493882879,CA -3493882880,3493903551,US +3493882880,3493901311,US +3493901312,3493901567,AE +3493901568,3493901599,IL +3493901600,3493901759,US +3493901760,3493901767,AE +3493901768,3493901791,US +3493901792,3493901823,AE +3493901824,3493901951,US +3493901952,3493901983,CA +3493901984,3493902215,US +3493902216,3493902223,CA +3493902224,3493903551,US 3493903552,3493903567,KW -3493903568,3493936127,US +3493903568,3493907199,US +3493907200,3493907231,GB +3493907232,3493914111,US +3493914112,3493914367,CA +3493914368,3493936127,US 3493936128,3493937151,CA -3493937152,3493939199,US -3493939200,3493941247,CA -3493941248,3493982207,US +3493937152,3493982207,US 3493982208,3493984255,CA 3493984256,3493986303,US -3493986304,3493987327,CA +3493986304,3493986623,CA +3493986624,3493986687,US +3493986688,3493987327,CA 3493987328,3493990399,US 3493990400,3493991423,CA 3493991424,3493998591,US 3493998592,3494000639,AI 3494000640,3494003711,US -3494003712,3494004735,CA +3494003712,3494003967,CA +3494003968,3494003983,US +3494003984,3494003991,SA +3494003992,3494003999,US +3494004000,3494004047,CA +3494004048,3494004055,US +3494004056,3494004095,CA +3494004096,3494004111,US +3494004112,3494004127,CA +3494004128,3494004159,BR +3494004160,3494004183,US +3494004184,3494004290,CA +3494004291,3494004312,US +3494004313,3494004319,CA +3494004320,3494004351,FR +3494004352,3494004383,US +3494004384,3494004735,CA 3494004736,3494009855,US 3494009856,3494010879,CA -3494010880,3494014975,US +3494010880,3494011231,US +3494011232,3494011247,HK +3494011248,3494014975,US 3494014976,3494017023,CA -3494017024,3494035807,US +3494017024,3494035455,US +3494035712,3494035791,US +3494035792,3494035807,BY 3494035808,3494035823,CY -3494035824,3494036319,US +3494035824,3494035887,US +3494035888,3494035904,RU +3494035905,3494035967,ES +3494035968,3494036031,US +3494036032,3494036047,CA +3494036048,3494036063,RU +3494036064,3494036255,US +3494036256,3494036287,CA +3494036288,3494036319,US 3494036320,3494036351,RU 3494036352,3494036417,EE 3494036418,3494036431,US 3494036432,3494036439,RU -3494036440,3494044671,US +3494036480,3494044671,US 3494044672,3494045695,CA 3494045696,3494049791,US 3494049792,3494051839,CA -3494051840,3494074367,US +3494051840,3494072319,US +3494074368,3494075391,US 3494075392,3494076415,CA 3494076416,3494088703,US 3494088704,3494090751,CA 3494090752,3494094847,US 3494094848,3494095871,CA -3494095872,3494114303,US -3494114304,3494115327,CA -3494115328,3494121471,US +3494095872,3494102623,US +3494102624,3494102639,SB +3494102640,3494102735,US +3494102736,3494102751,VI +3494102752,3494109540,US +3494109541,3494109548,GB +3494109549,3494109697,US +3494109698,3494109722,GB +3494109723,3494109795,US +3494109796,3494109825,LB +3494109826,3494109859,US +3494109860,3494109869,GB +3494109870,3494109925,US +3494109926,3494109942,CA +3494109943,3494110091,US +3494110092,3494110109,CA +3494110110,3494110145,US +3494110146,3494110161,CA +3494110162,3494114303,US +3494115328,3494115471,US +3494115472,3494115487,AU +3494115488,3494116407,US +3494116408,3494116415,CA +3494116416,3494116431,US +3494116432,3494116439,GB +3494116440,3494116511,US +3494116512,3494116519,NL +3494116520,3494121471,US 3494121472,3494122495,CA 3494122496,3494135807,US 3494135808,3494136831,CA 3494136832,3494139903,US -3494139904,3494141951,CA +3494139904,3494141735,CA +3494141736,3494141743,US +3494141744,3494141951,CA 3494141952,3494143999,US 3494144000,3494145023,CA -3494145024,3494160895,US -3494160896,3494161407,GB -3494161408,3494168575,US +3494145024,3494159039,US +3494159040,3494159071,CH +3494159072,3494168575,US 3494168576,3494170623,CA -3494170624,3494184959,US +3494170624,3494181631,US +3494181632,3494181887,SN +3494181888,3494184959,US 3494184960,3494187007,CA 3494187008,3494197247,US -3494197248,3494198271,CA -3494198272,3494244351,US +3494197248,3494197391,CA +3494197392,3494197412,FR +3494197413,3494197448,CA +3494197449,3494197456,AE +3494197457,3494197493,CA +3494197494,3494197502,FR +3494197503,3494197536,CA +3494197537,3494197560,AE +3494197561,3494197569,FR +3494197570,3494197604,CA +3494197605,3494197614,US +3494197615,3494197617,CA +3494197618,3494197632,US +3494197633,3494197684,CA +3494197685,3494197694,US +3494197695,3494197760,CA +3494197761,3494197777,AE +3494197778,3494197953,CA +3494197954,3494197967,US +3494197968,3494198259,CA +3494198260,3494198260,US +3494198261,3494198271,CA +3494198272,3494206847,US +3494206848,3494206887,CA +3494206888,3494206911,US +3494206912,3494206943,CA +3494206944,3494228319,US +3494228320,3494228335,RU +3494228336,3494228495,US +3494228496,3494228511,CA +3494228512,3494228863,US +3494228864,3494228927,IN +3494228928,3494229375,US +3494229376,3494229407,BZ +3494229408,3494229999,US +3494230000,3494230015,CA +3494230016,3494241927,US +3494241928,3494241935,AU +3494241936,3494241951,US +3494241952,3494241959,IN +3494241960,3494242175,US +3494242176,3494242207,GB +3494242208,3494242247,US +3494242248,3494242255,CO +3494242256,3494244351,US 3494244352,3494246399,CA 3494246400,3494247423,US -3494247424,3494248703,CA -3494248704,3494248831,US -3494248832,3494250495,CA -3494250496,3494257663,US -3494258688,3494262783,US +3494247424,3494250495,CA +3494250496,3494262783,US 3494262784,3494264831,CA -3494264832,3494271999,US +3494264832,3494267007,US +3494267008,3494267023,AE +3494267024,3494267087,US +3494267088,3494267103,PK +3494267104,3494267423,US +3494267424,3494267439,GB +3494267440,3494268287,US +3494268288,3494268319,TH +3494268320,3494268335,UA +3494268336,3494268815,US +3494268816,3494268831,UA +3494268832,3494271999,US 3494272000,3494273023,KN 3494273024,3494275071,US 3494275072,3494277119,CA 3494277120,3494290943,US 3494290944,3494291455,GB -3494291456,3494298623,US -3494299648,3494302719,US +3494291456,3494291743,US +3494291744,3494291751,GB +3494291752,3494291903,US +3494291904,3494291967,GB +3494291968,3494295039,US +3494295040,3494295551,UM +3494295552,3494299663,US +3494299664,3494299679,TH +3494299680,3494299687,US +3494299688,3494299695,SC +3494299696,3494299727,US +3494299728,3494299735,SC +3494299736,3494300359,US +3494300360,3494300383,TW +3494300384,3494300927,US +3494300928,3494301055,TW +3494301056,3494301247,US +3494301248,3494301311,SG +3494301312,3494301439,US +3494301440,3494301695,TW +3494301696,3494302719,US 3494302720,3494303743,CA 3494303744,3494310911,US 3494310912,3494311935,CA -3494311936,3494316031,US +3494311936,3494313135,US +3494313136,3494313143,GB +3494313144,3494313151,RO +3494313152,3494313327,US +3494313328,3494313343,CO +3494313344,3494313359,US +3494313360,3494313375,MX +3494313376,3494313391,ES +3494313392,3494313535,US +3494313536,3494313551,AU +3494313552,3494316031,US 3494316032,3494317055,CA 3494317056,3494336511,US 3494336512,3494337535,CA -3494338560,3494342655,US +3494337536,3494342655,US 3494342656,3494344703,CA -3494344704,3494359039,US +3494344704,3494350079,US +3494350080,3494350087,AU +3494350088,3494350095,US +3494350096,3494350103,CA +3494350104,3494359039,US 3494359040,3494360063,CA 3494360064,3494361087,US 3494361088,3494362111,CA 3494362112,3494380543,US 3494380544,3494381567,CA -3494381568,3494410239,US +3494381568,3494409215,US 3494410240,3494412287,CA -3494412288,3494424575,US +3494412288,3494418951,US +3494418952,3494418959,CA +3494418960,3494419007,US +3494419008,3494419039,ID +3494419040,3494419095,US +3494419096,3494419103,JO +3494419104,3494419111,US +3494419112,3494419119,BR +3494419120,3494419123,CA +3494419124,3494419207,US +3494419208,3494419215,CA +3494419216,3494419223,IE +3494419224,3494419279,US +3494419280,3494419287,FR +3494419288,3494419295,US +3494419296,3494419303,GR +3494419304,3494419311,US +3494419312,3494419327,PT +3494419328,3494419343,US +3494419344,3494419351,TR +3494419352,3494419375,US +3494419376,3494419383,BR +3494419384,3494419399,US +3494419400,3494419407,RU +3494419408,3494419411,ES +3494419412,3494420223,US +3494420224,3494420239,BO +3494420240,3494420415,US +3494420416,3494420447,CA +3494420448,3494424575,US 3494424576,3494425599,CA -3494425600,3494432767,US +3494425600,3494427199,US +3494427200,3494427215,CA +3494427216,3494428223,US +3494428224,3494428239,CA +3494428240,3494432767,US 3494432768,3494433791,CA 3494433792,3494437887,US -3494437888,3494438911,GP +3494437888,3494437983,GP +3494437984,3494437999,KN +3494438000,3494438023,GP +3494438024,3494438031,KN +3494438032,3494438063,GP +3494438064,3494438071,KN +3494438072,3494438143,GP +3494438144,3494438399,VC +3494438400,3494438655,KN +3494438656,3494438911,DM 3494438912,3494439935,CA 3494439936,3494449151,US 3494449152,3494451199,CA @@ -65745,15 +106989,50 @@ 3494454129,3494454158,PH 3494454159,3494455295,US 3494455296,3494456319,CA -3494456320,3494459391,US +3494456320,3494457779,US +3494457780,3494457787,GB +3494457788,3494458121,US +3494458122,3494458185,PH +3494458186,3494458201,US +3494458202,3494458211,FR +3494458212,3494458231,US +3494458232,3494458255,DE +3494458256,3494459391,US 3494459392,3494460415,CA 3494460416,3494464511,US 3494464512,3494465535,CA -3494465536,3494510591,US +3494465536,3494467583,US +3494469632,3494501023,US +3494501024,3494501039,AU +3494501040,3494510591,US 3494510592,3494512639,CA -3494512640,3494516735,US +3494512640,3494513135,US +3494513136,3494513151,NO +3494513152,3494516735,US 3494516736,3494517759,CA -3494517760,3494563839,US +3494517760,3494539263,US +3494539264,3494540287,A2 +3494540288,3494554440,US +3494554441,3494554448,GB +3494554449,3494554453,US +3494554454,3494554461,ES +3494554462,3494554534,US +3494554535,3494554542,GB +3494554543,3494554554,US +3494554555,3494554562,ES +3494554563,3494554655,US +3494554656,3494554687,TR +3494554688,3494555053,US +3494555054,3494555074,CA +3494555075,3494555107,US +3494555108,3494555116,CA +3494555117,3494555167,US +3494555168,3494555199,TR +3494555200,3494555263,US +3494555264,3494555295,TR +3494555296,3494555392,US +3494555393,3494555423,CN +3494555424,3494563839,US 3494563840,3494565887,CA 3494565888,3494594559,US 3494594560,3494595583,CA @@ -65761,43 +107040,204 @@ 3494605824,3494606847,CA 3494606848,3494610943,US 3494610944,3494611967,CA -3494611968,3494624255,US -3494624256,3494625279,CA +3494611968,3494624263,US +3494624264,3494624271,DE +3494624272,3494624279,US +3494624280,3494624287,GB +3494624288,3494624295,ES +3494624296,3494624319,US +3494624320,3494624327,CR +3494624328,3494624335,SA +3494624336,3494624343,MY +3494624344,3494624351,CA +3494624352,3494624367,US +3494624368,3494624375,CA +3494624376,3494624383,LT +3494624384,3494624391,UA +3494624392,3494624399,GB +3494624400,3494624407,US +3494624408,3494624415,CA +3494624416,3494624423,RU +3494624424,3494624439,US +3494624440,3494624447,NL +3494624448,3494624455,CA +3494624456,3494624463,ES +3494624464,3494624471,US +3494624472,3494624479,ZA +3494624480,3494624527,US +3494624528,3494624535,CA +3494624536,3494624543,US +3494624544,3494624551,CA +3494624552,3494624591,US +3494624592,3494624599,RU +3494624600,3494624607,IL +3494624608,3494624631,US +3494624632,3494624639,ZA +3494624640,3494624647,GB +3494624648,3494624655,MK +3494624656,3494624671,US +3494624672,3494624679,BY +3494624680,3494624687,US +3494624688,3494624695,JP +3494624696,3494624703,NL +3494624704,3494624711,DE +3494624712,3494624719,US +3494624720,3494624727,ZA +3494624728,3494624735,SG +3494624736,3494624751,US +3494624752,3494624759,DE +3494624760,3494624767,RU +3494624768,3494624775,US +3494624776,3494624791,CA +3494624792,3494624799,US +3494624800,3494624807,RU +3494624808,3494624815,CA +3494624816,3494624823,US +3494624824,3494624831,CA +3494624832,3494624855,US +3494624856,3494624863,CA +3494624864,3494624871,US +3494624872,3494624879,CA +3494624880,3494624887,US +3494624888,3494624903,CA +3494624904,3494624911,JP +3494624912,3494624919,DE +3494624920,3494624935,US +3494624936,3494624943,CA +3494624944,3494624951,US +3494624952,3494624959,CA +3494624960,3494624975,AU +3494624976,3494624983,RU +3494624984,3494624991,CA +3494624992,3494625047,US +3494625048,3494625055,CA +3494625056,3494625063,UA +3494625064,3494625071,NL +3494625072,3494625111,US +3494625112,3494625119,VG +3494625120,3494625127,IT +3494625128,3494625143,US +3494625144,3494625151,AU +3494625152,3494625159,US +3494625160,3494625167,UA +3494625168,3494625183,US +3494625184,3494625199,CA +3494625200,3494625207,UA +3494625208,3494625223,US +3494625224,3494625231,CA +3494625232,3494625247,US +3494625248,3494625255,RO +3494625256,3494625263,US +3494625264,3494625271,AE +3494625272,3494625279,AU 3494625280,3494627327,US 3494627328,3494628351,BM -3494628352,3494648831,US -3494649856,3494651903,US +3494628352,3494651903,US 3494651904,3494652927,CA 3494652928,3494660095,US 3494660096,3494661119,CA 3494661120,3494668287,US -3494668288,3494670335,CA -3494670336,3494700031,US +3494668288,3494669375,CA +3494669376,3494669439,US +3494669440,3494670207,CA +3494670208,3494670215,US +3494670216,3494670335,CA +3494670336,3494698015,US +3494698016,3494698023,CA +3494698024,3494698079,US +3494698080,3494698087,CA +3494698088,3494698111,US +3494698112,3494698119,CA +3494698120,3494698151,US +3494698152,3494698159,GB +3494698160,3494698167,JP +3494698168,3494698255,US +3494698256,3494698263,CA +3494698264,3494698271,US +3494698272,3494698279,RU +3494698280,3494698331,US +3494698332,3494698335,AR +3494698336,3494698463,US +3494698464,3494698471,GB +3494698472,3494698503,US +3494698504,3494698511,CA +3494698512,3494698615,US +3494698616,3494698623,GB +3494698624,3494698791,US +3494698792,3494698799,CA +3494698800,3494698843,US +3494698844,3494698847,EG +3494698848,3494698887,US +3494698888,3494698895,EG +3494698896,3494700031,US 3494700032,3494701055,CA -3494701056,3494727679,US +3494701056,3494712319,US +3494712320,3494713343,CA +3494713344,3494727679,US 3494727680,3494729727,CA 3494729728,3494730751,US 3494730752,3494731775,CA 3494731776,3494743039,US 3494743040,3494744063,CA -3494744064,3494757375,US +3494744064,3494744703,US +3494744704,3494744711,DK +3494744712,3494745151,US +3494745152,3494745159,AU +3494745160,3494745303,US +3494745304,3494745311,AU +3494745312,3494745919,US +3494745920,3494745927,CN +3494745928,3494757375,US 3494757376,3494758399,CA -3494758400,3494776831,US +3494758400,3494763007,US +3494763008,3494763015,ES +3494763016,3494763047,US +3494763048,3494763055,JP +3494763056,3494763063,US +3494763064,3494763071,MX +3494763072,3494763119,US +3494763120,3494763127,DE +3494763128,3494763143,US +3494763144,3494763151,ES +3494763152,3494763903,US +3494763904,3494763919,AU +3494763920,3494764295,US +3494764296,3494764303,CA +3494764304,3494764343,US +3494764344,3494764351,GB +3494764352,3494764383,US +3494764384,3494764391,GB +3494764392,3494764447,US +3494764448,3494764463,GB +3494764464,3494764527,US +3494764528,3494764535,ES +3494764536,3494776831,US 3494776832,3494777855,CA 3494777856,3494785023,US -3494785024,3494787071,GP -3494787072,3494789119,CA +3494785024,3494787071,MF +3494787072,3494787199,A2 +3494787200,3494787231,GB +3494787232,3494789119,A2 3494789120,3494852607,US 3494852608,3494854655,CA -3494854656,3494862847,US -3494862848,3494863871,GP +3494854656,3494861087,US +3494861088,3494861095,CA +3494861096,3494861111,US +3494861112,3494861119,AU +3494861120,3494862639,US +3494862640,3494862647,JP +3494862648,3494862815,US +3494862816,3494862823,AU +3494862824,3494862847,US +3494862848,3494863615,VC +3494863616,3494863871,DM 3494863872,3494866943,US 3494866944,3494867967,CA 3494867968,3494893567,US 3494893568,3494894591,CA 3494894592,3494917119,US -3494917120,3494918143,CA -3494918144,3494928383,US +3494917120,3494917631,CA +3494917632,3494928383,US 3494928384,3494930431,CA 3494930432,3494938623,US 3494938624,3494939647,CA @@ -65805,7 +107245,7 @@ 3494964224,3494965247,PR 3494965248,3494968319,US 3494968320,3494972415,CA -3494972416,3494979583,US +3494972416,3494978559,US 3494979584,3494981631,CA 3494981632,3495000063,US 3495000064,3495001087,CA @@ -65815,11 +107255,17 @@ 3495010304,3495011327,KN 3495011328,3495012351,US 3495012352,3495014399,PR -3495014400,3495023615,US +3495014400,3495014448,US +3495014449,3495014456,SG +3495014457,3495023615,US 3495023616,3495024639,CA 3495024640,3495065599,US 3495065600,3495066623,CA -3495066624,3495076863,US +3495066624,3495068223,US +3495068224,3495068239,PL +3495068240,3495068655,US +3495068656,3495068671,PL +3495068672,3495076863,US 3495076864,3495077887,BM 3495077888,3495090175,US 3495090176,3495091199,KY @@ -65827,9 +107273,29 @@ 3495098368,3495100415,CA 3495100416,3495120895,US 3495120896,3495122943,AG -3495122944,3495153663,US -3495153664,3495155711,CA -3495155712,3495192575,US +3495122944,3495136455,US +3495136456,3495136463,IN +3495136464,3495136471,US +3495136472,3495136479,AR +3495136480,3495136495,US +3495136496,3495136503,IN +3495136504,3495136847,US +3495136848,3495136855,PR +3495136856,3495153663,US +3495153664,3495154303,CA +3495154304,3495154431,US +3495154432,3495154751,CA +3495154752,3495154759,US +3495154760,3495154823,CA +3495154824,3495154831,US +3495154832,3495154839,CA +3495154840,3495154847,US +3495154848,3495155711,CA +3495155712,3495157039,US +3495157040,3495157047,SE +3495157048,3495164239,US +3495164240,3495164247,CA +3495164248,3495192575,US 3495192576,3495193599,CA 3495193600,3495215103,US 3495215104,3495217151,VI @@ -65840,7 +107306,10 @@ 3495260160,3495261183,CA 3495261184,3495286783,US 3495286784,3495288831,CA -3495288832,3495332863,US +3495288832,3495292927,US +3495292928,3495292943,GB +3495292944,3495331839,US +3495331840,3495332863,A2 3495332864,3495333887,CA 3495333888,3495349247,US 3495349248,3495350271,CA @@ -65848,17 +107317,36 @@ 3495358464,3495359487,CA 3495359488,3495367679,US 3495367680,3495368703,CA -3495368704,3495370751,US +3495368704,3495370239,US +3495370240,3495370495,CA +3495370496,3495370751,US 3495370752,3495372799,BS 3495372800,3495375871,US 3495375872,3495376895,CA 3495376896,3495399423,US 3495399424,3495400447,KN -3495400448,3495412735,US +3495400448,3495401471,US +3495403520,3495412735,US 3495412736,3495413759,CA 3495413760,3495429119,US 3495429120,3495430143,CA -3495430144,3495454719,US +3495430144,3495440799,US +3495440800,3495440815,PL +3495440816,3495440831,US +3495440832,3495440847,IN +3495440848,3495440895,US +3495440896,3495440911,PL +3495440912,3495441151,US +3495441152,3495441167,PL +3495441168,3495441407,US +3495441408,3495441423,PL +3495441424,3495441663,US +3495441664,3495441679,PL +3495441680,3495441919,US +3495441920,3495441935,PL +3495441936,3495442319,US +3495442320,3495442335,PL +3495442336,3495454719,US 3495454720,3495456767,CA 3495456768,3495463935,US 3495463936,3495464959,CA @@ -65870,9 +107358,27 @@ 3495505920,3495507967,CA 3495507968,3495515135,US 3495515136,3495516159,CA -3495516160,3495526399,US +3495516160,3495520375,US +3495520376,3495520379,SG +3495520380,3495526399,US 3495526400,3495527423,CA -3495527424,3495551999,US +3495527424,3495542783,US +3495542784,3495544831,A2 +3495544832,3495549183,US +3495549184,3495549302,CA +3495549303,3495549334,US +3495549335,3495549439,CA +3495549440,3495549727,US +3495549728,3495549760,CA +3495549761,3495549809,US +3495549810,3495549813,IN +3495549814,3495549917,US +3495549918,3495549923,CA +3495549924,3495550031,US +3495550032,3495550039,CA +3495550040,3495550207,US +3495550208,3495550463,CA +3495550464,3495551999,US 3495552000,3495553023,BM 3495553024,3495579647,US 3495579648,3495581695,CA @@ -65886,59 +107392,351 @@ 3495620608,3495622655,CA 3495622656,3495653375,US 3495653376,3495654399,CA -3495654400,3495657471,US -3495952384,3495968767,US +3495655424,3495657551,US +3495657552,3495657567,GB +3495657568,3495658015,US +3495658016,3495658023,IN +3495658024,3495658039,US +3495658040,3495658047,CO +3495658048,3495658319,US +3495658320,3495658327,IN +3495658328,3495673855,US +3495673856,3495674623,GP +3495674624,3495674879,MF +3495674880,3495686143,US +3495687168,3495688191,US +3495688192,3495689215,CA +3495689216,3495694335,US +3495694336,3495696383,CA +3495698432,3495703551,US +3495703552,3495704575,CA +3495704576,3495718911,US +3495718912,3495719151,A2 +3495719152,3495720959,CA +3495720960,3495724031,US +3495724032,3495727103,CA +3495727104,3495740415,US +3495740416,3495741439,CA +3495741440,3495749631,US +3495749632,3495750655,CA +3495750656,3495781311,US +3495781312,3495781375,CA +3495781376,3495815167,US +3495815168,3495817215,CA +3495817216,3495828479,US +3495828480,3495829503,CA +3495829504,3495847935,US +3495847936,3495849983,CA +3495849984,3495862271,US +3495862272,3495864319,CA +3495864320,3495865343,GP +3495865344,3495866367,CA +3495866368,3495868415,VC +3495868416,3495871487,US +3495871488,3495872511,CA +3495872512,3495882799,US +3495882800,3495882807,AM +3495882808,3495882815,US +3495882816,3495882823,RU +3495882824,3495882863,US +3495882864,3495882871,AU +3495882872,3495882895,US +3495882896,3495882911,CN +3495882912,3495882927,JP +3495882928,3495882983,US +3495882984,3495882991,AU +3495882992,3495882999,CA +3495883000,3495883215,US +3495883216,3495883223,AU +3495883224,3495883287,US +3495883288,3495883295,GB +3495883296,3495883311,US +3495883312,3495883319,TR +3495883320,3495883327,SA +3495883328,3495883367,US +3495883368,3495883375,AU +3495883376,3495883391,US +3495883392,3495883399,IN +3495883400,3495883407,US +3495883408,3495883415,EG +3495883416,3495883439,US +3495883440,3495883447,GB +3495883448,3495883479,US +3495883480,3495883487,BR +3495883488,3495883503,CN +3495883504,3495883615,US +3495883616,3495883623,AU +3495883624,3495883631,US +3495883632,3495883647,GM +3495883648,3495883759,US +3495883760,3495883775,CN +3495883776,3495884119,US +3495884120,3495884127,CA +3495884128,3495884239,US +3495884240,3495884247,AU +3495884248,3495884263,US +3495884264,3495884271,IN +3495884272,3495884287,CN +3495884288,3495884447,US +3495884448,3495884463,AU +3495884464,3495884479,US +3495884480,3495884487,BY +3495884488,3495884519,US +3495884520,3495884527,IN +3495884528,3495884543,US +3495884544,3495884551,RO +3495884552,3495884679,US +3495884680,3495884687,AU +3495884688,3495884719,US +3495884720,3495884735,CA +3495884736,3495896063,US +3495896064,3495897087,PR +3495897088,3495930879,US +3495930880,3495931903,CA +3495931904,3495968767,US 3495968768,3495985151,CA 3495985152,3495988223,NI 3495988224,3495989247,GT -3495993344,3495997439,US -3496001536,3496030207,US +3495989248,3496034303,US 3496034304,3496050687,CA 3496050688,3496132607,US -3496132608,3496148991,CA -3496148992,3496169471,US -3496173568,3496177663,US +3496132608,3496145951,CA +3496145952,3496145983,US +3496145984,3496148991,CA +3496148992,3496181759,US 3496181760,3496189951,CA -3496189952,3496287999,US -3496288000,3496288007,BR -3496288008,3496288167,US -3496288168,3496288175,SA -3496288176,3496288447,US -3496288448,3496288463,AR -3496288464,3496292319,US -3496292320,3496292335,PH -3496292336,3496295839,US -3496295840,3496295871,AR -3496295872,3496296447,US +3496189952,3496190463,US +3496190464,3496190975,CA +3496190976,3496202239,US +3496202240,3496202303,CA +3496202304,3496205839,US +3496205840,3496205855,ID +3496205856,3496205871,CA +3496205872,3496296447,US 3496296448,3496312831,CA -3496312832,3496341503,US -3496345600,3496431615,US -3496435712,3496439807,US -3496443904,3496468479,US -3496476672,3496878079,US +3496312832,3496468479,US +3496468480,3496476671,CA +3496476672,3496873983,US +3496873984,3496878079,A2 3496878080,3496882175,CA -3496886272,3496894463,US +3496882176,3496886399,US +3496886400,3496886463,TR +3496886464,3496886495,US +3496886496,3496886503,CA +3496886504,3496886511,US +3496886512,3496886527,GB +3496886528,3496886607,US +3496886608,3496886623,CA +3496886624,3496886655,US +3496886656,3496886671,IN +3496886672,3496886711,US +3496886712,3496886727,AU +3496886728,3496886823,US +3496886824,3496886831,IN +3496886832,3496886919,US +3496886920,3496886927,PK +3496886928,3496886935,US +3496886936,3496886943,PK +3496886944,3496887135,US +3496887136,3496887167,AU +3496887168,3496887399,US +3496887400,3496887407,PK +3496887408,3496887439,US +3496887440,3496887447,AU +3496887448,3496887471,US +3496887472,3496887503,AU +3496887504,3496887511,US +3496887512,3496887519,CA +3496887520,3496887527,AU +3496887528,3496887535,US +3496887536,3496887543,PK +3496887544,3496887551,US +3496887552,3496887559,TR +3496887560,3496887575,US +3496887576,3496887583,AU +3496887584,3496887615,US +3496887616,3496887623,AT +3496887624,3496887631,MY +3496887632,3496887639,RU +3496887640,3496887655,US +3496887656,3496887663,AU +3496887664,3496887703,US +3496887704,3496887727,AU +3496887728,3496887807,US +3496887808,3496887935,AU +3496887936,3496887975,US +3496887976,3496887983,AU +3496887984,3496887999,US +3496888000,3496888063,IN +3496888064,3496888095,AU +3496888096,3496888103,PT +3496888104,3496888111,GB +3496888112,3496888127,US +3496888128,3496888159,TR +3496888160,3496888207,US +3496888208,3496888223,AU +3496888224,3496888231,US +3496888232,3496888239,BR +3496888240,3496888279,US +3496888280,3496888287,DE +3496888288,3496888319,US +3496888320,3496888335,AU +3496888336,3496888343,US +3496888344,3496888351,AU +3496888352,3496888367,US +3496888368,3496888383,AU +3496888384,3496888399,US +3496888400,3496888415,AU +3496888416,3496888431,US +3496888432,3496888439,AU +3496888440,3496888583,US +3496888584,3496888591,AU +3496888592,3496888599,US +3496888600,3496888607,PK +3496888608,3496888623,US +3496888624,3496888655,AU +3496888656,3496888671,US +3496888672,3496888679,NO +3496888680,3496893695,US +3496893696,3496893703,RU +3496893704,3496893991,US +3496893992,3496893999,TR +3496894000,3496894463,US 3496894464,3496902655,CA -3496902656,3496914943,US -3496919040,3496931327,US -3496935424,3496947711,US +3496902656,3496943775,US +3496943776,3496943807,JP +3496943808,3496951807,US 3496951808,3496959999,CA -3496960000,3496964095,US -3496968192,3497066495,US +3496960000,3497001247,US +3497001248,3497001263,AU +3497001264,3497001327,US +3497001328,3497001343,DE +3497001344,3497005887,US +3497005888,3497005951,CA +3497005952,3497008071,US +3497008072,3497008079,CA +3497008080,3497008671,US +3497008672,3497008687,CA +3497008688,3497009399,US +3497009400,3497009407,AE +3497009408,3497010703,US +3497010704,3497010711,PK +3497010712,3497010719,US +3497010720,3497010727,AE +3497010728,3497010735,US +3497010736,3497010751,CA +3497010752,3497014687,US +3497014688,3497014695,GB +3497014696,3497017343,US +3497017344,3497017375,GB +3497017376,3497017399,US +3497017400,3497017439,GB +3497017440,3497018599,US +3497018600,3497018607,IL +3497018608,3497019231,US +3497019232,3497019247,PK +3497019248,3497020415,US +3497020416,3497020671,IL +3497020672,3497020943,US +3497020944,3497020959,CA +3497020960,3497022367,US +3497022368,3497022399,AU +3497022400,3497023447,US +3497023448,3497023455,CA +3497023456,3497024639,US +3497024640,3497024655,AU +3497024656,3497024735,US +3497024736,3497024751,GB +3497024752,3497024991,US +3497024992,3497025007,JP +3497025008,3497025127,US +3497025128,3497025135,PK +3497025136,3497026815,US +3497026816,3497026847,ES +3497026848,3497026919,US +3497026920,3497026927,CA +3497026928,3497027375,US +3497027376,3497027383,AE +3497027384,3497028383,US +3497028384,3497028391,MX +3497028392,3497028431,US +3497028432,3497028439,MX +3497028440,3497028479,US +3497028480,3497028495,AE +3497028496,3497028983,US +3497028984,3497029055,CA +3497029056,3497029071,US +3497029072,3497029087,TH +3497029088,3497029095,GB +3497029096,3497029151,US +3497029152,3497029167,TH +3497029168,3497029231,US +3497029232,3497029239,GB +3497029240,3497030415,US +3497030416,3497030423,IN +3497030424,3497030495,US +3497030496,3497030511,AU +3497030512,3497030767,US +3497030768,3497030775,CH +3497030776,3497030911,US +3497030912,3497030943,CH +3497030944,3497031071,US +3497031072,3497031079,CA +3497031080,3497032111,US +3497032112,3497032119,CA +3497032120,3497033383,US +3497033384,3497033391,CH +3497033392,3497033439,US +3497033440,3497033447,PK +3497033448,3497066495,US 3497066496,3497082879,CA -3497082880,3497144319,US -3497148416,3497164799,US +3497082880,3497156863,US +3497156864,3497156879,NL +3497156880,3497156983,US +3497156984,3497157006,DZ +3497157007,3497161607,US +3497161608,3497161615,NO +3497161616,3497161703,US +3497161704,3497161711,GB +3497161712,3497161735,US +3497161736,3497161743,MT +3497161744,3497161751,US +3497161752,3497161759,GB +3497161760,3497161767,PT +3497161768,3497161775,MT +3497161776,3497161895,US +3497161896,3497161903,MT +3497161904,3497161911,US +3497161912,3497161919,TN +3497161920,3497161927,US +3497161928,3497161935,GB +3497161936,3497161943,MT +3497161944,3497163311,US +3497163312,3497163319,NO +3497163320,3497163351,US +3497163352,3497163359,ES +3497163360,3497163383,GB +3497163384,3497163399,US +3497163400,3497163407,NO +3497163408,3497163447,US +3497163448,3497163455,ES +3497163456,3497163463,US +3497163464,3497163471,ES +3497163472,3497163519,US +3497163520,3497163655,DK +3497163656,3497163663,NO +3497163664,3497163679,DK +3497163680,3497163695,US +3497163696,3497163703,DK +3497163704,3497164287,US +3497164288,3497164295,GB +3497164296,3497164799,US 3497164800,3497181183,CA -3497181184,3497209855,US -3497213952,3497222407,US +3497181184,3497222407,US 3497222408,3497222415,IN 3497222416,3497222463,US 3497222464,3497222479,IN -3497222480,3497222655,US -3497222656,3497222911,CA -3497222912,3497223295,US -3497223296,3497223359,CH -3497223360,3497223791,US +3497222480,3497223791,US 3497223792,3497223807,CH 3497223808,3497223839,US 3497223840,3497223871,CH @@ -65948,33 +107746,79 @@ 3497224256,3497224319,IN 3497224320,3497224831,US 3497224832,3497224863,CH -3497224864,3497224959,US -3497224960,3497225215,CA -3497225216,3497234431,US -3497238528,3497264913,US +3497224864,3497225375,US +3497225376,3497225383,CN +3497225384,3497225471,US +3497225472,3497225535,IN +3497225536,3497226295,US +3497226296,3497226303,SG +3497226304,3497226391,US +3497226392,3497226399,IR +3497226400,3497226783,US +3497226784,3497226815,CH +3497226816,3497226831,US +3497226832,3497226847,CH +3497226848,3497226943,US +3497226944,3497226959,CH +3497226960,3497227023,US +3497227024,3497227039,GB +3497227040,3497227231,US +3497227232,3497227247,CH +3497227248,3497227255,CN +3497227256,3497227263,CH +3497227264,3497227391,US +3497227392,3497227407,CN +3497227408,3497227527,US +3497227528,3497227535,CN +3497227536,3497228079,US +3497228080,3497228087,CN +3497228088,3497233407,US +3497233408,3497233663,CN +3497233664,3497263815,US +3497263816,3497263823,GB +3497263824,3497264127,US +3497264128,3497264159,CA +3497264160,3497264913,US 3497264914,3497264950,GB 3497264951,3497266527,US 3497266528,3497266535,GB 3497266536,3497268223,US 3497268224,3497268287,GB -3497268288,3497357311,US -3497361408,3497406463,US +3497268288,3497268703,US +3497268704,3497268719,CA +3497268720,3497268815,US +3497268816,3497268831,CA +3497268832,3497273919,US +3497273920,3497273927,CA +3497273928,3497274175,US +3497274176,3497274207,CA +3497274208,3497276951,US +3497276952,3497276959,IN +3497276960,3497277159,US +3497277160,3497277167,IN +3497277168,3497410559,US 3497410560,3497431039,CA -3497435136,3497447423,US -3497451520,3497455615,US -3497459712,3497684991,US -3497689088,3497717759,US -3497721856,3497740071,US -3497740072,3497740095,CA -3497740096,3497750527,US -3497754624,3497766911,US -3497771008,3497775103,US -3497775104,3497779199,CA -3497779200,3497783295,US -3497787392,3497820159,US -3497820160,3497848831,CA -3497852928,3497959423,US -3497984000,3498254591,US +3497431040,3497447423,US +3497447424,3497451519,CA +3497451520,3497713415,US +3497713416,3497713423,EC +3497713424,3497717759,US +3497717760,3497719807,A2 +3497719808,3497719839,MR +3497719840,3497721343,A2 +3497721344,3497721599,NG +3497721600,3497721855,A2 +3497721856,3497739327,US +3497739328,3497739351,IN +3497739352,3497739679,US +3497739680,3497739687,CA +3497739688,3497820159,US +3497820160,3497852927,CA +3497852928,3498254335,US +3498254336,3498254367,JM +3498254368,3498254431,US +3498254432,3498254447,JM +3498254448,3498254591,US 3498254592,3498254847,JM 3498254848,3498287103,US 3498287104,3498292543,JM @@ -65994,13 +107838,21 @@ 3498513920,3498514431,CL 3498514432,3498587135,US 3498587136,3498588159,NL -3498588160,3498708991,US +3498588160,3498599935,US +3498599936,3498600191,WS +3498600192,3498708991,US 3498708992,3498713639,JM 3498713640,3498713647,CA 3498713648,3498717183,JM 3498717184,3498760191,US 3498760192,3498762239,PR -3498762240,3499403263,US +3498762240,3498812415,US +3498812416,3498812671,PF +3498812672,3499186591,US +3499186592,3499186623,MX +3499186624,3499299327,US +3499299328,3499299583,WS +3499299584,3499403263,US 3499403264,3499403775,MW 3499403776,3499436031,US 3499436032,3499436287,DE @@ -66013,9 +107865,20 @@ 3499451392,3499705343,US 3499705344,3499705855,TZ 3499705856,3499706367,MG -3499706368,3500076415,US +3499706368,3499986943,US +3499986944,3499988991,KY +3499988992,3500015615,US +3500015616,3500016383,AG +3500016384,3500016639,KN +3500016640,3500016895,AG +3500016896,3500017151,DM +3500017152,3500019711,AG +3500019712,3500076415,US 3500076416,3500076543,SG -3500076544,3500144639,US +3500076544,3500126207,US +3500126208,3500126463,SE +3500126464,3500126719,GB +3500126720,3500144639,US 3500144640,3500144895,IT 3500144896,3500274175,US 3500274176,3500274239,IE @@ -66027,79 +107890,722 @@ 3500396832,3500396863,GB 3500396864,3500486655,US 3500486656,3500490751,CR -3500490752,3500689407,US +3500490752,3500613631,US +3500613632,3500614655,MZ +3500614656,3500689407,US 3500689408,3500689919,CL -3500689920,3500724991,US +3500689920,3500707327,US +3500707328,3500707839,CA +3500707840,3500724991,US 3500724992,3500725503,EC -3500725504,3500725759,US +3500725504,3500725759,HT 3500725760,3500726015,EC -3500726016,3500728319,US +3500726016,3500726271,HT +3500726272,3500728319,US 3500728320,3500736511,KY 3500736512,3500752895,US 3500752896,3500761087,KY -3500761088,3501182975,US +3500761088,3500809991,US +3500809992,3500809999,CA +3500810000,3500810247,US +3500810248,3500810255,CA +3500810256,3500921279,US +3500921280,3500921311,AU +3500921312,3501181703,US +3501181704,3501181711,AU +3501181712,3501181727,KR +3501181728,3501182975,US 3501182976,3501183007,SG -3501183008,3501183487,US +3501183008,3501183023,US +3501183024,3501183047,SG +3501183048,3501183167,US +3501183168,3501183231,SG +3501183232,3501183487,US 3501183488,3501183743,GB -3501183744,3501522943,US +3501183744,3501183959,US +3501183960,3501183967,IL +3501183968,3501183999,SG +3501184000,3501522943,US 3501522944,3501588479,CA -3501588480,3502418175,US +3501588480,3501728831,US +3501728832,3501728863,AU +3501728864,3501732071,US +3501732072,3501732087,AU +3501732088,3501747967,US +3501747968,3501748031,CA +3501748032,3501809151,US +3501809152,3501809407,CA +3501809408,3501817983,US +3501817984,3501818015,HK +3501818016,3502002807,US +3502002808,3502002815,PR +3502002816,3502013919,US +3502013920,3502013927,PR +3502013928,3502013935,US +3502013936,3502013943,PR +3502013944,3502045679,US +3502045680,3502045687,PR +3502045688,3502070775,US +3502070776,3502070783,PR +3502070784,3502082383,US +3502082384,3502082391,PR +3502082392,3502100255,US +3502100256,3502100263,PR +3502100264,3502144759,US +3502144760,3502144767,PR +3502144768,3502146927,US +3502146928,3502146935,PR +3502146936,3502159391,US +3502159392,3502159399,PR +3502159400,3502159407,US +3502159408,3502159415,PR +3502159416,3502202159,US +3502202160,3502202167,PR +3502202168,3502202287,US +3502202288,3502202295,PR +3502202296,3502202647,US +3502202648,3502202655,PR +3502202656,3502207535,US +3502207536,3502207543,PR +3502207544,3502418175,US 3502418176,3502418431,GU -3502418432,3502569215,US -3502569216,3502569471,BS -3502569472,3502929663,US +3502418432,3502439167,US +3502439168,3502439423,PK +3502439424,3502470143,US +3502470144,3502471167,MX +3502471168,3502518783,US +3502518784,3502519295,LK +3502519296,3502541055,US +3502541056,3502541311,CA +3502541312,3502545663,US +3502545664,3502545919,BS +3502545920,3502683135,US +3502683136,3502683391,MC +3502683392,3502929663,US 3502929664,3502929919,GU 3502929920,3502993407,US 3502993408,3502993919,NL -3502993920,3503215615,US -3503215616,3503215639,NL -3503215640,3503473151,US -3503473152,3503473663,NA -3503473664,3503757823,US +3502993920,3503027327,US +3503027328,3503027359,GB +3503027360,3503058431,US +3503058432,3503058447,CA +3503058448,3503206399,US +3503206400,3503206911,CR +3503206912,3503215623,US +3503215624,3503215639,NL +3503215640,3503222695,US +3503222696,3503222703,CA +3503222704,3503227391,US +3503227392,3503227407,CA +3503227408,3503250431,US +3503250432,3503250943,PK +3503250944,3503323135,US +3503323136,3503323647,KE +3503323648,3503323903,A2 +3503323904,3503372031,US +3503372032,3503372287,A2 +3503372288,3503386111,US +3503386112,3503386367,CH +3503386368,3503413871,US +3503413872,3503413887,PR +3503413888,3503454719,US +3503454720,3503454975,AZ +3503454976,3503478783,US +3503478784,3503479039,DE +3503479040,3503738879,US +3503738880,3503740927,CO +3503740928,3503757823,US 3503757824,3503758335,GU -3503758336,3503890431,US +3503758336,3503826087,US +3503826088,3503826095,PR +3503826096,3503890431,US 3503890432,3503894527,CO -3503894528,3504193535,US +3503894528,3503990783,US +3503990784,3503992831,AE +3503992832,3504086015,US +3504086016,3504086527,LI +3504086528,3504136191,US +3504136192,3504138239,AZ +3504138240,3504193535,US 3504193536,3504194559,EC -3504194560,3504521215,US +3504194560,3504207871,US +3504207872,3504208127,CA +3504208128,3504223743,US +3504223744,3504223999,RO +3504224000,3504521215,US 3504521216,3504521727,GU -3504521728,3505004543,US +3504521728,3504889343,US +3504889344,3504889855,PK +3504889856,3504922623,US +3504922624,3504923391,PH +3504923392,3504928687,US +3504928688,3504928695,IT +3504928696,3504932351,US +3504932352,3504932863,BD +3504932864,3505004543,US 3505004544,3505012735,PR -3505012736,3505661951,US +3505012736,3505112063,US +3505112064,3505112319,EC +3505112320,3505112335,US +3505112336,3505113087,EC +3505113088,3505119231,US +3505119232,3505119487,PH +3505119488,3505201151,US +3505201152,3505201407,JO +3505201408,3505220351,US +3505220352,3505220479,CA +3505220480,3505227247,US +3505227248,3505227255,GB +3505227256,3505270271,US +3505270272,3505270527,JM +3505270528,3505270783,HT +3505270784,3505416703,US +3505416704,3505417471,MX +3505417472,3505424383,US +3505424384,3505425407,PK +3505425408,3505432159,US +3505432160,3505432191,A2 +3505432192,3505446271,US +3505446272,3505446399,CA +3505446400,3505474559,US +3505474560,3505474815,GU +3505474816,3505511679,US +3505511680,3505511935,RO +3505511936,3505661951,US 3505661952,3505662463,JM -3505662464,3505818623,US +3505662464,3505664799,US +3505664800,3505664831,UA +3505664832,3505818623,US 3505818624,3505819647,BS -3505819648,3506043135,US +3505819648,3505999359,US +3505999360,3506000127,PR +3506000128,3506043135,US 3506043136,3506044927,PA -3506044928,3506765823,US +3506044928,3506052543,US +3506052544,3506052559,DE +3506052560,3506135263,US +3506135264,3506135295,GB +3506135296,3506177967,US +3506177968,3506177983,DE +3506177984,3506192639,US +3506192640,3506192895,A2 +3506192896,3506194535,US +3506194536,3506194543,AU +3506194544,3506198007,US +3506198008,3506198015,NO +3506198016,3506214159,US +3506214160,3506214175,CA +3506214176,3506307631,US +3506307632,3506307647,GB +3506307648,3506383999,US +3506384000,3506384031,CA +3506384032,3506421983,US +3506421984,3506422015,PR +3506422016,3506765823,US 3506765824,3506831359,CA -3506831360,3507290111,US +3506831360,3507025407,US +3507025408,3507025663,IQ +3507025664,3507101919,US +3507101920,3507101935,IL +3507101936,3507134591,US +3507134592,3507134607,GB +3507134608,3507290111,US 3507290112,3507355647,AR 3507355648,3507540015,US 3507540016,3507540031,IN 3507540032,3507585023,US -3507585024,3507601407,CA -3507601408,3507748863,US +3507585024,3507586623,CA +3507586624,3507586655,US +3507586656,3507598911,CA +3507598912,3507598943,US +3507598944,3507601407,CA +3507601408,3507634335,US +3507634336,3507634351,IQ +3507634352,3507634383,US +3507634384,3507634399,ES +3507634400,3507634623,US +3507634624,3507634655,CA +3507634656,3507635391,US +3507635392,3507635407,AU +3507635408,3507636959,US +3507636960,3507636975,CA +3507636976,3507637551,US +3507637552,3507637567,IL +3507637568,3507639189,US +3507639190,3507639199,IT +3507639200,3507639385,US +3507639386,3507639395,BE +3507639396,3507639515,US +3507639516,3507639525,IN +3507639526,3507639671,US +3507639672,3507639681,SY +3507639682,3507639711,US +3507639712,3507639721,BE +3507639722,3507639741,US +3507639742,3507639751,NZ +3507639752,3507639761,LB +3507639762,3507642527,US +3507642528,3507642559,IL +3507642560,3507642591,CA +3507642592,3507643007,US +3507643008,3507643039,GB +3507643040,3507643175,US +3507643176,3507643185,FR +3507643186,3507643265,US +3507643266,3507643275,IQ +3507643276,3507643285,US +3507643286,3507643295,ES +3507643296,3507643315,US +3507643316,3507643325,JP +3507643326,3507643461,US +3507643462,3507643471,AU +3507643472,3507643521,US +3507643522,3507643531,LB +3507643532,3507643601,US +3507643602,3507643611,IT +3507643612,3507644031,US +3507644032,3507644063,IL +3507644064,3507644127,US +3507644128,3507644159,FR +3507644160,3507644511,US +3507644512,3507644543,NO +3507644544,3507644591,US +3507644592,3507644607,GB +3507644608,3507644639,US +3507644640,3507644671,FR +3507644672,3507645017,US +3507645018,3507645027,AU +3507645028,3507645037,UA +3507645038,3507645117,US +3507645118,3507645127,NZ +3507645128,3507645193,US +3507645194,3507645203,NZ +3507645204,3507645223,US +3507645224,3507645233,AU +3507645234,3507645333,US +3507645334,3507645343,IR +3507645344,3507645353,UA +3507645354,3507645423,US +3507645424,3507645433,GB +3507645434,3507645479,US +3507645480,3507645489,GR +3507645490,3507646127,US +3507646128,3507646143,ES +3507646144,3507647807,US +3507647808,3507647871,AU +3507647872,3507649263,US +3507649264,3507649279,QA +3507649280,3507650047,US +3507650048,3507650111,BV +3507650112,3507650335,US +3507650336,3507650367,PA +3507650368,3507650431,US +3507650432,3507650495,AU +3507650496,3507748863,US 3507748864,3507765247,CA -3507765248,3507769343,US -3507773440,3508110591,US -3508110592,3508111103,GB -3508111104,3508118527,US +3507765248,3507809279,US +3507809280,3507809535,BG +3507809536,3508110015,US +3508110016,3508110047,CA +3508110048,3508110207,US +3508110208,3508110239,ES +3508110240,3508111359,US +3508111360,3508111615,CA +3508111616,3508114431,US +3508114432,3508114687,ID +3508114688,3508115807,US +3508115808,3508115839,RU +3508115840,3508117439,US +3508117440,3508117503,CA +3508117504,3508118527,US 3508118528,3508118559,AU -3508118560,3508120063,US -3508120064,3508120319,GB -3508120320,3508126463,US -3508126464,3508126719,GB -3508126720,3508219903,US -3508220928,3508223999,US +3508118560,3508118911,US +3508118912,3508118943,CA +3508118944,3508123935,US +3508123936,3508123951,CA +3508123952,3508126239,US +3508126240,3508126255,GB +3508126256,3508130815,US +3508130816,3508130831,RU +3508130832,3508131135,US +3508131136,3508131199,CA +3508131200,3508133119,US +3508133120,3508133247,GB +3508133248,3508137631,US +3508137632,3508137647,SK +3508137648,3508137695,US +3508137696,3508137711,ID +3508137712,3508219903,US +3508219904,3508220927,CA +3508220928,3508221951,KY +3508221952,3508222975,US +3508222976,3508223999,KY 3508224000,3508224255,BM 3508224256,3508243967,US 3508243968,3508244223,BM -3508244224,3508338687,US +3508244224,3508273407,US +3508273408,3508273663,MX +3508273664,3508274719,US +3508274720,3508274751,AR +3508274752,3508275199,US +3508275200,3508275327,IT +3508275328,3508275455,US +3508275456,3508275487,ZA +3508275488,3508276991,US +3508276992,3508277247,MX +3508277248,3508277343,US +3508277344,3508277375,CA +3508277376,3508277487,US +3508277488,3508277503,PR +3508277504,3508278527,US +3508278528,3508278783,AU +3508278784,3508279039,US +3508279040,3508279295,VE +3508279296,3508279551,US +3508279552,3508279807,CO +3508279808,3508280063,JP +3508280064,3508280319,TH +3508280320,3508280575,JP +3508280576,3508280831,TW +3508280832,3508281087,JP +3508281088,3508281343,KR +3508281344,3508281599,PH +3508281600,3508281855,NZ +3508281856,3508282047,US +3508282048,3508282111,SG +3508282112,3508282367,HK +3508282368,3508282591,US +3508282592,3508282623,IT +3508282624,3508282879,AU +3508282880,3508282887,KP +3508282888,3508283135,US +3508283136,3508283391,HK +3508283392,3508283647,US +3508283648,3508283903,AU +3508283904,3508284159,MY +3508284160,3508284415,SG +3508284416,3508284671,AU +3508284672,3508284735,JP +3508284736,3508284927,US +3508284928,3508284991,ES +3508284992,3508285087,US +3508285088,3508285095,ES +3508285096,3508285119,US +3508285120,3508285151,ES +3508285152,3508285823,US +3508285824,3508285855,ES +3508285856,3508285887,US +3508285888,3508285951,GB +3508285952,3508286015,NL +3508286016,3508286079,US +3508286080,3508286111,NL +3508286112,3508286207,US +3508286208,3508286463,SE +3508286464,3508286719,HK +3508286720,3508286847,US +3508286848,3508286863,TW +3508286864,3508286911,US +3508286912,3508286927,PH +3508286928,3508286943,US +3508286944,3508286975,ID +3508286976,3508287039,TH +3508287040,3508287055,US +3508287056,3508287063,TH +3508287064,3508287103,US +3508287104,3508287167,HK +3508287168,3508287231,US +3508287232,3508287263,HK +3508287264,3508287295,US +3508287296,3508287359,HK +3508287360,3508287999,US +3508288000,3508288127,MY +3508288128,3508288255,SG +3508288256,3508288511,JP +3508288512,3508288767,US +3508288768,3508289023,BR +3508289024,3508289279,AU +3508289280,3508289343,BR +3508289344,3508289407,US +3508289408,3508289471,BR +3508289472,3508289535,US +3508289536,3508289791,CA +3508289792,3508290847,US +3508290848,3508290879,MX +3508290880,3508290895,US +3508290896,3508290911,BR +3508290912,3508290927,US +3508290928,3508290943,BR +3508290944,3508291263,US +3508291264,3508291327,IT +3508291328,3508292095,GB +3508292096,3508292351,CH +3508292352,3508292415,US +3508292416,3508292447,CL +3508292448,3508292863,US +3508292864,3508294143,DE +3508294144,3508294271,US +3508294272,3508294335,VI +3508294336,3508295439,US +3508295440,3508295487,BR +3508295488,3508295519,GB +3508295520,3508295551,US +3508295552,3508295615,BR +3508295616,3508295631,ES +3508295632,3508295647,US +3508295648,3508295679,BE +3508295680,3508295935,GB +3508295936,3508295999,US +3508296000,3508296015,BR +3508296016,3508296095,US +3508296096,3508296127,BR +3508296128,3508296191,US +3508296192,3508296319,GB +3508296320,3508296447,US +3508296448,3508296479,GB +3508296480,3508296495,BE +3508296496,3508296543,US +3508296544,3508296559,SE +3508296560,3508296671,US +3508296672,3508296703,GB +3508296704,3508296767,FR +3508296768,3508296831,US +3508296832,3508296959,NO +3508296960,3508297215,CH +3508297216,3508297407,GB +3508297408,3508297471,SG +3508297472,3508297727,IT +3508297728,3508297791,CH +3508297792,3508298047,US +3508298048,3508298079,BE +3508298080,3508298111,US +3508298112,3508298159,BE +3508298160,3508298207,US +3508298208,3508298223,BE +3508298224,3508298239,US +3508298240,3508298495,DE +3508298496,3508298559,DK +3508298560,3508298623,US +3508298624,3508298655,DK +3508298656,3508298687,US +3508298688,3508298751,DK +3508298752,3508299007,ES +3508299008,3508299263,BE +3508299264,3508299519,GB +3508299520,3508299647,US +3508299648,3508299679,CH +3508299680,3508299775,US +3508299776,3508300031,SE +3508300032,3508300287,DE +3508300288,3508300543,US +3508300544,3508300799,FR +3508300800,3508300863,US +3508300864,3508300879,GB +3508300880,3508300895,US +3508300896,3508300911,GB +3508300912,3508301631,US +3508301632,3508301663,BR +3508301664,3508301823,US +3508301824,3508301951,GB +3508301952,3508301983,DK +3508301984,3508301999,IT +3508302000,3508302079,US +3508302080,3508302111,DE +3508302112,3508302207,US +3508302208,3508302223,DE +3508302224,3508302239,US +3508302240,3508302255,GB +3508302256,3508302335,US +3508302336,3508302463,SG +3508302464,3508302527,BE +3508302528,3508302623,US +3508302624,3508302687,BE +3508302688,3508303359,US +3508303360,3508303391,BE +3508303392,3508303423,US +3508303424,3508303439,BE +3508303440,3508303455,US +3508303456,3508303471,BE +3508303472,3508303487,US +3508303488,3508303551,ES +3508303552,3508303615,US +3508303616,3508303871,DE +3508303872,3508303903,US +3508303904,3508303935,CL +3508303936,3508303950,PR +3508303951,3508303951,US +3508303952,3508303967,CO +3508303968,3508303983,US +3508303984,3508303999,BR +3508304000,3508304383,US +3508304384,3508304639,DE +3508304640,3508304703,IR +3508304704,3508304927,US +3508304928,3508304943,DE +3508304944,3508305151,US +3508305152,3508305215,NL +3508305216,3508305247,US +3508305248,3508305263,NL +3508305264,3508305791,US +3508305792,3508305823,CO +3508305824,3508305855,US +3508305856,3508305871,BE +3508305872,3508306431,US +3508306432,3508306687,EC +3508306688,3508306943,US +3508306944,3508307199,CH +3508307200,3508307455,US +3508307456,3508307711,AR +3508307712,3508308991,US +3508308992,3508309247,BE +3508309248,3508310527,SE +3508310528,3508310783,DE +3508310784,3508311039,BE +3508311040,3508311295,NL +3508311296,3508311807,IE +3508311808,3508311967,US +3508311968,3508311983,DE +3508311984,3508312063,US +3508312064,3508312319,NL +3508312320,3508312575,CH +3508312576,3508312591,ES +3508312592,3508312831,US +3508312832,3508313343,DE +3508313344,3508313599,SE +3508313600,3508313855,DK +3508313856,3508314367,GB +3508314368,3508314623,IT +3508314624,3508314879,DK +3508314880,3508314911,US +3508314912,3508314927,FR +3508314928,3508314943,US +3508314944,3508314959,CH +3508314960,3508314975,PT +3508314976,3508315135,US +3508315136,3508315391,NO +3508315392,3508315647,US +3508315648,3508315903,FR +3508315904,3508316159,US +3508316160,3508316415,PT +3508316416,3508316671,GB +3508316672,3508316927,RU +3508316928,3508317183,SE +3508317184,3508317199,US +3508317200,3508317207,RU +3508317208,3508317231,US +3508317232,3508317247,AT +3508317248,3508317375,US +3508317376,3508317439,FR +3508317440,3508317695,DE +3508317696,3508317951,US +3508317952,3508318463,FI +3508318464,3508318719,LU +3508318720,3508318975,IT +3508318976,3508319487,IL +3508319488,3508319743,RU +3508319744,3508319999,CH +3508320000,3508320255,SE +3508320256,3508320383,PT +3508320384,3508320511,US +3508320512,3508320527,DE +3508320528,3508320543,PT +3508320544,3508320767,US +3508320768,3508321791,BE +3508321792,3508321823,NL +3508321824,3508321855,ZA +3508321856,3508321871,FR +3508321872,3508321887,SE +3508321888,3508322111,US +3508322112,3508322143,PL +3508322144,3508322175,US +3508322176,3508322191,CH +3508322192,3508322239,US +3508322240,3508322303,CH +3508322304,3508322559,GB +3508322560,3508322815,FI +3508322816,3508323071,NO +3508323072,3508323135,DE +3508323136,3508323327,US +3508323328,3508323583,NO +3508323584,3508323839,DE +3508323840,3508324095,FI +3508324096,3508324351,IT +3508324352,3508324607,CH +3508324608,3508324863,NO +3508324864,3508325119,GB +3508325120,3508325375,DE +3508325376,3508325471,GR +3508325472,3508325503,US +3508325504,3508325567,GB +3508325568,3508325631,US +3508325632,3508325887,ZA +3508325888,3508326399,SE +3508326400,3508326655,GB +3508326656,3508326911,ZA +3508326912,3508327167,IT +3508327168,3508327679,ES +3508327680,3508327935,US +3508327936,3508328447,NE +3508328448,3508328703,BE +3508328704,3508329471,IL +3508329472,3508329727,NL +3508329728,3508329983,FR +3508329984,3508330495,SE +3508330496,3508331263,GB +3508331264,3508331519,BE +3508331520,3508331583,FR +3508331584,3508331711,US +3508331712,3508331743,FR +3508331744,3508331775,US +3508331776,3508331807,IT +3508331808,3508331839,US +3508331840,3508331871,AT +3508331872,3508332031,US +3508332032,3508332287,GB +3508332288,3508332543,GR +3508332544,3508332799,IE +3508332800,3508333055,NO +3508333056,3508333183,GB +3508333184,3508333311,US +3508333312,3508333823,CH +3508333824,3508333951,GB +3508333952,3508334079,US +3508334080,3508334207,GB +3508334208,3508334335,US +3508334336,3508334463,DE +3508334464,3508334527,GB +3508334528,3508334591,US +3508334592,3508334847,AU +3508334848,3508335103,SG +3508335104,3508335359,MY +3508335360,3508335615,AU +3508335616,3508336127,JP +3508336128,3508336383,SG +3508336384,3508336639,HK +3508336640,3508336895,AU +3508336896,3508337151,JP +3508337152,3508337663,PH +3508337664,3508337919,KR +3508337920,3508338175,JP +3508338176,3508338303,HK +3508338304,3508338335,ID +3508338336,3508338367,US +3508338368,3508338399,SG +3508338400,3508338431,US +3508338432,3508338687,KR 3508338688,3508404223,CA 3508404224,3508690943,US -3508695040,3509112831,US -3509116928,3509149695,US +3508690944,3508695039,CA +3508695040,3508729935,US +3508729936,3508729951,GB +3508729952,3508761120,US +3508761121,3508761136,BE +3508761137,3508761184,US +3508761185,3508761200,BE +3508761201,3508780079,US +3508780080,3508780111,NL +3508780112,3508780623,US +3508780624,3508780639,IT +3508780640,3509157887,US 3509157888,3509166079,CA 3509166080,3509215231,US 3509215232,3509223423,CA @@ -66107,143 +108613,440 @@ 3509326080,3509326087,CA 3509326088,3509327695,US 3509327696,3509327711,CA -3509327712,3509346303,US -3509346304,3509347103,CA -3509347104,3509347119,US -3509347120,3509349439,CA -3509349440,3509349471,US -3509349472,3509351167,CA -3509351168,3509351423,IN -3509351424,3509354495,CA +3509327712,3509327807,US +3509327808,3509327871,CA +3509327872,3509346303,US +3509346304,3509350711,CA +3509350712,3509350719,US +3509350720,3509354495,CA 3509354496,3509387263,US 3509387264,3509420031,PE -3509420032,3509519871,US -3509519872,3509520255,CA -3509520256,3509521407,US -3509521408,3509521663,CA -3509521664,3509522175,US -3509522176,3509522431,CA +3509420032,3509518591,US +3509518592,3509518815,CA +3509518816,3509518831,US +3509518832,3509519359,CA +3509519360,3509519423,US +3509519424,3509519647,CA +3509519648,3509519679,US +3509519680,3509520511,CA +3509520512,3509520639,US +3509520640,3509520831,CA +3509520832,3509520895,US +3509520896,3509521151,CA +3509521152,3509521407,US +3509521408,3509521791,CA +3509521792,3509521919,US +3509521920,3509522431,CA 3509522432,3509522687,KW -3509522688,3509522943,CA -3509522944,3509523839,US +3509522688,3509523071,CA +3509523072,3509523199,US +3509523200,3509523327,CA +3509523328,3509523391,US +3509523392,3509523455,CA +3509523456,3509523471,US +3509523472,3509523775,CA +3509523776,3509523839,US 3509523840,3509523903,CA 3509523904,3509524223,US -3509524224,3509524479,CA -3509524480,3509524991,US -3509524992,3509525247,CA -3509525248,3509526015,US -3509526016,3509526271,CA -3509526272,3509527215,US -3509527216,3509527231,CA -3509527232,3509529855,US -3509529856,3509529887,CA +3509524224,3509524735,CA +3509524736,3509524991,US +3509524992,3509525823,CA +3509525824,3509525887,US +3509525888,3509526815,CA +3509526816,3509526879,US +3509526880,3509527071,CA +3509527072,3509527119,US +3509527120,3509527199,CA +3509527200,3509527215,US +3509527216,3509527551,CA +3509527552,3509527807,US +3509527808,3509528207,CA +3509528208,3509528223,US +3509528224,3509528319,CA +3509528320,3509528831,US +3509528832,3509529343,CA +3509529344,3509529599,US +3509529600,3509529727,CA +3509529728,3509529823,US +3509529824,3509529887,CA 3509529888,3509529951,US -3509529952,3509530111,CA -3509530112,3509530367,US -3509530368,3509530431,CA -3509530432,3509530623,US +3509529952,3509530239,CA +3509530240,3509530367,US +3509530368,3509530559,CA +3509530560,3509530623,US 3509530624,3509532671,CA -3509532672,3509534719,US -3509534720,3509535231,CA -3509535232,3509535487,US -3509535488,3509535503,CA -3509535504,3509536255,US -3509536256,3509536511,CA -3509536512,3509537279,US -3509537280,3509538303,CA -3509538304,3509538463,US -3509538464,3509538479,CA -3509538480,3509539071,US +3509532672,3509532927,US +3509532928,3509533471,CA +3509533472,3509533535,US +3509533536,3509533567,CA +3509533568,3509533599,US +3509533600,3509533823,CA +3509533824,3509534335,US +3509534336,3509534367,CA +3509534368,3509534719,US +3509534720,3509535535,CA +3509535536,3509535551,US +3509535552,3509536895,CA +3509536896,3509537023,US +3509537024,3509538335,CA +3509538336,3509538351,US +3509538352,3509538399,CA +3509538400,3509538415,US +3509538416,3509538447,CA +3509538448,3509538463,NO +3509538464,3509538815,CA +3509538816,3509539071,US 3509539072,3509539327,CA -3509539328,3509542783,US -3509542784,3509542815,CA -3509542816,3509543359,US -3509543360,3509543423,CA -3509543424,3509543999,US -3509544000,3509544063,CA -3509544064,3509544191,US -3509544192,3509544447,CA +3509539328,3509539583,US +3509539584,3509539679,CA +3509539680,3509539695,US +3509539696,3509539823,CA +3509539824,3509539839,US +3509539840,3509539903,CA +3509539904,3509539967,US +3509539968,3509540095,CA +3509540096,3509540127,US +3509540128,3509540351,CA +3509540352,3509540607,US +3509540608,3509541663,CA +3509541664,3509541695,US +3509541696,3509541951,CA +3509541952,3509541999,US +3509542000,3509542063,CA +3509542064,3509542079,US +3509542080,3509542399,CA +3509542400,3509542655,US +3509542656,3509544447,CA 3509544448,3509544703,US -3509544704,3509544959,CA -3509544960,3509545215,US -3509545216,3509545471,CA -3509545472,3509554175,US -3509554176,3509554431,CA -3509554432,3509555455,US -3509555456,3509555711,CA -3509555712,3509555967,US -3509555968,3509556479,CA -3509556480,3509556735,US -3509556736,3509557247,CA -3509557248,3509558015,US -3509558016,3509558079,CA -3509558080,3509559039,US +3509544704,3509545151,CA +3509545152,3509545471,US +3509545472,3509545999,CA +3509546000,3509546015,US +3509546016,3509546031,CA +3509546032,3509546063,US +3509546064,3509546207,CA +3509546208,3509546223,US +3509546224,3509549823,CA +3509549824,3509550079,US +3509550080,3509553151,CA +3509553152,3509553407,US +3509553408,3509553855,CA +3509553856,3509553919,US +3509553920,3509554047,CA +3509554048,3509554111,US +3509554112,3509555119,CA +3509555120,3509555135,US +3509555136,3509557439,CA +3509557440,3509557759,US +3509557760,3509558367,CA +3509558368,3509558399,US +3509558400,3509558463,CA +3509558464,3509558495,US +3509558496,3509558527,CA +3509558528,3509558559,US +3509558560,3509558783,CA +3509558784,3509559039,US 3509559040,3509559295,KW -3509559296,3509559551,US -3509559552,3509559807,CA -3509559808,3509559999,US -3509560000,3509560015,CA -3509560016,3509560063,US -3509560064,3509560319,CA -3509560320,3509560831,US -3509560832,3509561087,CA -3509561088,3509561599,US -3509561600,3509562111,CA -3509562112,3509562367,US -3509562368,3509562623,CA -3509562624,3509563903,US -3509563904,3509564223,CA -3509564224,3509564415,US -3509564416,3509564927,CA -3509564928,3509565183,US -3509565184,3509565951,CA -3509565952,3509566767,US -3509566768,3509566783,CA -3509566784,3509567487,US -3509567488,3509567743,CA -3509567744,3509568511,US -3509568512,3509569023,CA -3509569024,3509570079,US -3509570080,3509570111,CA -3509570112,3509571071,US -3509571072,3509571327,CA -3509571328,3509572351,US -3509572352,3509572863,CA -3509572864,3509574143,US -3509574144,3509574655,CA -3509574656,3509575935,US -3509575936,3509576191,CA -3509576192,3509580031,US +3509559296,3509560319,CA +3509560320,3509560703,US +3509560704,3509561215,CA +3509561216,3509561279,US +3509561280,3509562623,CA +3509562624,3509562751,US +3509562752,3509562879,CA +3509562880,3509563167,US +3509563168,3509565087,CA +3509565088,3509565119,US +3509565120,3509566799,CA +3509566800,3509566815,US +3509566816,3509566847,CA +3509566848,3509566863,US +3509566864,3509566927,CA +3509566928,3509566943,US +3509566944,3509567151,CA +3509567152,3509567167,US +3509567168,3509567199,CA +3509567200,3509567215,US +3509567216,3509569023,CA +3509569024,3509569535,US +3509569536,3509569663,CA +3509569664,3509569791,US +3509569792,3509569919,CA +3509569920,3509570047,US +3509570048,3509570431,CA +3509570432,3509570687,US +3509570688,3509571327,CA +3509571328,3509571647,US +3509571648,3509571663,CA +3509571664,3509571839,US +3509571840,3509572095,CA +3509572096,3509572223,US +3509572224,3509573487,CA +3509573488,3509573503,US +3509573504,3509573887,CA +3509573888,3509573919,US +3509573920,3509573951,CA +3509573952,3509573983,US +3509573984,3509575695,CA +3509575696,3509575999,US +3509576000,3509576063,CA +3509576064,3509576191,US +3509576192,3509576255,CA +3509576256,3509576271,US +3509576272,3509576703,CA +3509576704,3509576959,US +3509576960,3509577407,CA +3509577408,3509577471,US +3509577472,3509577535,CA +3509577536,3509577551,US +3509577552,3509577631,CA +3509577632,3509577647,US +3509577648,3509577695,CA +3509577696,3509577711,US +3509577712,3509577727,CA +3509577728,3509577983,US +3509577984,3509578367,CA +3509578368,3509578495,US +3509578496,3509579263,CA +3509579264,3509579327,US +3509579328,3509579455,CA +3509579456,3509579519,US +3509579520,3509579775,CA +3509579776,3509580031,US 3509580032,3509580287,CA -3509580288,3509580799,US -3509580800,3509581055,CA -3509581056,3509581823,US -3509581824,3509582335,CA -3509582336,3509582591,US -3509582592,3509582847,CA +3509580288,3509580671,US +3509580672,3509581087,CA +3509581088,3509581119,US +3509581120,3509581199,CA +3509581200,3509581215,US +3509581216,3509581231,CA +3509581232,3509581247,US +3509581248,3509581263,CA +3509581264,3509581279,US +3509581280,3509581295,CA +3509581296,3509581311,US +3509581312,3509581375,CA +3509581376,3509581407,US +3509581408,3509581503,CA +3509581504,3509581567,US +3509581568,3509582847,CA 3509582848,3509583615,US 3509583616,3509583871,CA 3509583872,3509731327,US 3509731328,3509739519,CA -3509739520,3509846015,US +3509739520,3509773991,US +3509773992,3509774003,GR +3509774004,3509774013,US +3509774014,3509774033,GB +3509774034,3509774120,US +3509774121,3509774135,GB +3509774136,3509774138,US +3509774139,3509774163,GB +3509774164,3509774263,US +3509774264,3509774295,HR +3509774296,3509774575,US +3509774576,3509774591,GR +3509774592,3509775104,US +3509775105,3509775120,CA +3509775121,3509775296,US +3509775297,3509775312,GB +3509775313,3509775328,CA +3509775329,3509775444,US +3509775445,3509775454,TH +3509775455,3509775477,US +3509775478,3509775492,CA +3509775493,3509775504,US +3509775505,3509775520,NL +3509775521,3509775536,US +3509775537,3509775552,DK +3509775553,3509775584,US +3509775585,3509775614,DE +3509775615,3509775616,US +3509775617,3509775648,DE +3509775649,3509775664,CA +3509775665,3509775792,US +3509775793,3509775870,CA +3509775871,3509775871,US +3509775872,3509775879,RU +3509775880,3509775903,US +3509775904,3509775919,AU +3509775920,3509775943,US +3509775944,3509775951,IT +3509775952,3509775975,US +3509775976,3509775983,GB +3509775984,3509776023,US +3509776024,3509776031,CA +3509776032,3509776047,US +3509776048,3509776055,SA +3509776056,3509776095,US +3509776096,3509776103,AU +3509776104,3509776111,US +3509776112,3509776127,IT +3509776128,3509776224,US +3509776225,3509776256,CA +3509776257,3509776288,TC +3509776289,3509776352,US +3509776353,3509776382,GB +3509776383,3509777159,US +3509777160,3509777167,CN +3509777168,3509777175,RU +3509777176,3509777199,US +3509777200,3509777207,GB +3509777208,3509777215,CA +3509777216,3509777223,TH +3509777224,3509777271,US +3509777272,3509777279,IT +3509777280,3509777327,US +3509777328,3509777335,GB +3509777336,3509777449,US +3509777450,3509777545,ID +3509777546,3509777584,US +3509777585,3509777648,ID +3509777649,3509778399,US +3509778400,3509778431,NL +3509778432,3509778703,US +3509778704,3509778711,CA +3509778712,3509778847,US +3509778848,3509778855,CA +3509778856,3509778903,US +3509778904,3509778911,RU +3509778912,3509778919,US +3509778920,3509778927,GB +3509778928,3509779007,US +3509779008,3509779039,IN +3509779040,3509821911,US +3509821912,3509821919,BM +3509821920,3509822335,US +3509822336,3509822351,DE +3509822352,3509829503,US +3509829504,3509829535,GB +3509829536,3509830287,US +3509830288,3509830295,BE +3509830296,3509830407,US +3509830408,3509830415,GB +3509830416,3509830943,US +3509830944,3509830951,BE +3509830952,3509831039,US +3509831040,3509831047,DE +3509831048,3509831135,US +3509831136,3509831143,IN +3509831144,3509831287,US +3509831288,3509831295,GB +3509831296,3509831303,US +3509831304,3509831311,CO +3509831312,3509831319,CN +3509831320,3509831535,US +3509831536,3509831551,LB +3509831552,3509831615,US +3509831616,3509831647,IL +3509831648,3509831735,US +3509831736,3509831743,AT +3509831744,3509831799,US +3509831800,3509831807,DO +3509831808,3509831815,IN +3509831816,3509831823,CA +3509831824,3509831831,US +3509831832,3509831839,GB +3509831840,3509831959,US +3509831960,3509831967,CA +3509831968,3509832079,US +3509832080,3509832087,CN +3509832088,3509833103,US +3509833104,3509833111,IN +3509833112,3509833535,US +3509833536,3509833543,CA +3509833544,3509833551,IN +3509833552,3509833567,US +3509833568,3509833599,PH +3509833600,3509833623,US +3509833624,3509833631,GR +3509833632,3509833703,US +3509833704,3509833711,ZA +3509833712,3509834095,US +3509834096,3509834103,IL +3509834104,3509834111,US +3509834112,3509834143,IL +3509834144,3509834167,US +3509834168,3509834175,BR +3509834176,3509834287,US +3509834288,3509834303,IN +3509834304,3509834399,US +3509834400,3509834407,BD +3509834408,3509834431,US +3509834432,3509834463,JP +3509834464,3509834495,US +3509834496,3509834503,NO +3509834504,3509834519,US +3509834520,3509834527,BD +3509834528,3509834591,US +3509834592,3509834599,IN +3509834600,3509834831,US +3509834832,3509834847,CO +3509834848,3509835103,US +3509835104,3509835111,GB +3509835112,3509836375,US +3509836376,3509836383,GR +3509836384,3509837167,US +3509837168,3509837175,GB +3509837176,3509837623,US +3509837624,3509837639,GB +3509837640,3509837751,US +3509837752,3509837759,GB +3509837760,3509846015,US 3509846016,3509977087,CA 3510042624,3510239231,US -3510239232,3510241063,CA +3510239232,3510240703,CA +3510240704,3510240735,AM +3510240736,3510240767,CA +3510240768,3510241023,US +3510241024,3510241063,CA 3510241064,3510241071,US -3510241072,3510271999,CA -3510272000,3510321151,US +3510241072,3510242303,CA +3510242304,3510242559,OM +3510242560,3510245375,CA +3510245376,3510245631,BD +3510245632,3510246735,CA +3510246736,3510246767,US +3510246768,3510249471,CA +3510249472,3510249983,QA +3510249984,3510251519,CA +3510251520,3510252799,DO +3510252800,3510253311,CA +3510253312,3510253567,NC +3510253568,3510253631,US +3510253632,3510255439,CA +3510255440,3510255447,US +3510255448,3510261503,CA +3510261504,3510261759,ZM +3510261760,3510262783,CA +3510262784,3510263039,US +3510263040,3510264063,CA +3510264064,3510264319,UG +3510264320,3510268671,CA +3510268672,3510268927,SY +3510268928,3510269823,CA +3510269824,3510269951,CO +3510269952,3510270719,LY +3510270720,3510270975,SY +3510270976,3510271999,CA +3510272000,3510284423,US +3510284424,3510284431,CA +3510284432,3510312959,US +3510312960,3510321151,A1 3510321152,3510321663,VG 3510321664,3510321919,AG 3510321920,3510322175,KN 3510322176,3510323199,AG 3510323200,3510324223,KN -3510324224,3510324735,AG -3510324736,3510324991,AI -3510324992,3510326271,AG +3510324224,3510325247,AI +3510325248,3510326271,AG 3510326272,3510327295,VG 3510327296,3510328319,AG 3510328320,3510328575,KN -3510328576,3510331391,AG +3510328576,3510328831,MS +3510328832,3510329599,AG +3510329600,3510329855,MS +3510329856,3510331391,AG 3510331392,3510332415,DM 3510332416,3510332927,KN 3510332928,3510333183,LC @@ -66253,8 +109056,375 @@ 3510334976,3510335231,KN 3510335232,3510335743,AI 3510335744,3510335999,VG -3510336000,3510337535,AG -3510337536,3510831527,US +3510336000,3510337279,AG +3510337280,3510337535,LC +3510337536,3510338436,US +3510338437,3510338452,ES +3510338453,3510468631,US +3510468632,3510468639,GB +3510468640,3510468719,US +3510468720,3510468727,MX +3510468728,3510468847,US +3510468848,3510468855,MX +3510468856,3510468863,NZ +3510468864,3510468895,US +3510468896,3510468903,CA +3510468904,3510468911,ID +3510468912,3510469023,US +3510469024,3510469039,AG +3510469040,3510469055,US +3510469056,3510469063,CA +3510469064,3510469071,US +3510469072,3510469087,AU +3510469088,3510469095,RU +3510469096,3510469103,CA +3510469104,3510469119,BS +3510469120,3510469167,US +3510469168,3510469175,FR +3510469176,3510469183,BE +3510469184,3510469191,US +3510469192,3510469199,AU +3510469200,3510469223,US +3510469224,3510469231,AU +3510469232,3510469247,US +3510469248,3510469263,ID +3510469264,3510469279,US +3510469280,3510469295,MY +3510469296,3510469343,US +3510469344,3510469351,GB +3510469352,3510469359,US +3510469360,3510469367,CH +3510469368,3510469375,GR +3510469376,3510469399,US +3510469400,3510469407,BE +3510469408,3510469487,US +3510469488,3510469495,CA +3510469496,3510469519,US +3510469520,3510469527,IN +3510469528,3510469567,US +3510469568,3510469575,MY +3510469576,3510469599,US +3510469600,3510469607,CA +3510469608,3510469615,VG +3510469616,3510469623,US +3510469624,3510469631,DE +3510469632,3510469719,US +3510469720,3510469727,CA +3510469728,3510469743,AU +3510469744,3510469751,CH +3510469752,3510469767,US +3510469768,3510469775,IN +3510469776,3510469815,US +3510469816,3510469831,CA +3510469832,3510469855,US +3510469856,3510469863,UM +3510469864,3510469871,CA +3510469872,3510469887,IN +3510469888,3510469895,US +3510469896,3510469903,IN +3510469904,3510469919,US +3510469920,3510469927,GB +3510469928,3510469975,US +3510469976,3510469983,IN +3510469984,3510469991,CA +3510469992,3510469999,GB +3510470000,3510470031,US +3510470032,3510470039,CA +3510470040,3510470047,RU +3510470048,3510470055,CA +3510470056,3510470063,MX +3510470064,3510470143,US +3510470144,3510470151,DK +3510470152,3510470159,US +3510470160,3510470175,DK +3510470176,3510470183,CA +3510470184,3510470295,US +3510470296,3510470319,CA +3510470320,3510470327,TW +3510470328,3510470351,US +3510470352,3510470359,IL +3510470360,3510470367,TH +3510470368,3510470375,US +3510470376,3510470383,CH +3510470384,3510470455,US +3510470456,3510470463,GB +3510470464,3510470471,NL +3510470472,3510470623,US +3510470624,3510470631,BR +3510470632,3510470647,US +3510470648,3510470655,IN +3510470656,3510470743,US +3510470744,3510470751,SE +3510470752,3510470775,US +3510470776,3510470783,GR +3510470784,3510470799,US +3510470800,3510470807,GB +3510470808,3510470815,US +3510470816,3510470831,GB +3510470832,3510470855,US +3510470856,3510470863,FR +3510470864,3510470871,US +3510470872,3510470879,AR +3510470880,3510470927,US +3510470928,3510470935,IL +3510470936,3510470959,US +3510470960,3510470975,IN +3510470976,3510470999,US +3510471000,3510471007,CH +3510471008,3510471039,BH +3510471040,3510471119,US +3510471120,3510471135,GB +3510471136,3510471183,US +3510471184,3510471199,CA +3510471200,3510471207,US +3510471208,3510471215,HR +3510471216,3510471223,US +3510471224,3510471231,DE +3510471232,3510471311,US +3510471312,3510471319,IE +3510471320,3510471407,US +3510471408,3510471415,GR +3510471416,3510471431,US +3510471432,3510471439,AU +3510471440,3510471455,US +3510471456,3510471487,FR +3510471488,3510471511,US +3510471512,3510471519,HK +3510471520,3510471535,FR +3510471536,3510471607,US +3510471608,3510471615,DE +3510471616,3510471639,US +3510471640,3510471647,IN +3510471648,3510471703,US +3510471704,3510471711,JP +3510471712,3510471751,US +3510471752,3510471759,CA +3510471760,3510471791,US +3510471792,3510471799,IN +3510471800,3510471839,US +3510471840,3510471847,MX +3510471848,3510471871,US +3510471872,3510471887,VE +3510471888,3510471911,US +3510471912,3510471919,IN +3510471920,3510471951,US +3510471952,3510471959,ID +3510471960,3510471991,US +3510471992,3510471999,AR +3510472000,3510472007,IN +3510472008,3510472111,US +3510472112,3510472119,GB +3510472120,3510472191,US +3510472192,3510472207,IN +3510472208,3510472215,FR +3510472216,3510472223,CA +3510472224,3510472231,IT +3510472232,3510472239,SG +3510472240,3510472295,US +3510472296,3510472303,AE +3510472304,3510472447,US +3510472448,3510472463,IN +3510472464,3510472471,US +3510472472,3510472479,EG +3510472480,3510472511,US +3510472512,3510472575,AG +3510472576,3510472735,US +3510472736,3510472743,AR +3510472744,3510472751,US +3510472752,3510472767,AR +3510472768,3510472791,US +3510472792,3510472799,CA +3510472800,3510472800,US +3510472801,3510472831,DE +3510472832,3510472919,US +3510472920,3510472927,NL +3510472928,3510473087,US +3510473088,3510473095,TR +3510473096,3510473103,US +3510473104,3510473119,VE +3510473120,3510473135,US +3510473136,3510473143,NZ +3510473144,3510473151,US +3510473152,3510473159,DE +3510473160,3510473175,US +3510473176,3510473183,FR +3510473184,3510473199,IE +3510473200,3510473215,US +3510473216,3510473223,IN +3510473224,3510473231,US +3510473232,3510473239,FR +3510473240,3510473247,RU +3510473248,3510473343,US +3510473344,3510473383,DE +3510473384,3510473407,US +3510473408,3510473447,DE +3510473448,3510473463,US +3510473464,3510473471,NL +3510473472,3510473511,DE +3510473512,3510473607,US +3510473608,3510473615,ID +3510473616,3510473623,AU +3510473624,3510473647,US +3510473648,3510473655,GB +3510473656,3510473695,US +3510473696,3510473703,BY +3510473704,3510474039,US +3510474040,3510474047,MX +3510474048,3510474431,US +3510474432,3510474447,TC +3510474448,3510474479,US +3510474480,3510474495,AU +3510474496,3510475151,US +3510475152,3510475159,AU +3510475160,3510475167,SE +3510475168,3510477063,US +3510477064,3510477071,GB +3510477072,3510477087,US +3510477088,3510477111,GB +3510477112,3510477311,US +3510477312,3510477319,IN +3510477320,3510477327,US +3510477328,3510477335,GB +3510477336,3510477343,MO +3510477344,3510477375,AG +3510477376,3510477487,US +3510477488,3510477495,IN +3510477496,3510477503,US +3510477504,3510477519,GB +3510477520,3510477535,US +3510477536,3510477543,GB +3510477544,3510477815,US +3510477816,3510477823,GB +3510477824,3510477903,US +3510477904,3510477911,IT +3510477912,3510477919,US +3510477920,3510477927,NL +3510477928,3510477975,US +3510477976,3510477983,AR +3510477984,3510478007,US +3510478008,3510478015,IN +3510478016,3510478023,CA +3510478024,3510478127,US +3510478128,3510478135,GB +3510478136,3510478143,US +3510478144,3510478175,FI +3510478176,3510478231,US +3510478232,3510478239,IN +3510478240,3510478271,US +3510478272,3510478279,MT +3510478280,3510478311,US +3510478312,3510478319,FI +3510478320,3510478495,US +3510478496,3510478527,FR +3510478528,3510478535,US +3510478536,3510478543,GB +3510478544,3510478551,US +3510478552,3510478559,VE +3510478560,3510478567,NL +3510478568,3510478591,US +3510478592,3510478599,MX +3510478600,3510478631,US +3510478632,3510478639,GB +3510478640,3510478655,US +3510478656,3510478663,GB +3510478664,3510478671,US +3510478672,3510478719,AU +3510478720,3510478735,US +3510478736,3510478751,LB +3510478752,3510478775,US +3510478776,3510478783,CR +3510478784,3510478855,US +3510478856,3510478863,IN +3510478864,3510478903,US +3510478904,3510478919,GB +3510478920,3510478943,US +3510478944,3510478951,IN +3510478952,3510479095,US +3510479096,3510479103,GB +3510479104,3510479359,GU +3510479360,3510479367,US +3510479368,3510479375,ID +3510479376,3510479407,US +3510479408,3510479415,CA +3510479416,3510479439,US +3510479440,3510479447,CA +3510479448,3510479455,GI +3510479456,3510479503,US +3510479504,3510479511,AU +3510479512,3510479519,US +3510479520,3510479535,LB +3510479536,3510479575,US +3510479576,3510479583,GI +3510479584,3510479791,US +3510479792,3510479799,IE +3510479800,3510479831,US +3510479832,3510479839,DE +3510479840,3510479855,US +3510479856,3510479863,DE +3510479864,3510479879,US +3510479880,3510479887,DE +3510479888,3510479903,US +3510479904,3510479919,ES +3510479920,3510479935,US +3510479936,3510479943,MY +3510479944,3510479951,US +3510479952,3510479959,AU +3510479960,3510479967,US +3510479968,3510479975,AE +3510479976,3510479991,US +3510479992,3510479999,SG +3510480000,3510480047,US +3510480048,3510480055,FR +3510480056,3510480103,US +3510480104,3510480111,CA +3510480112,3510480119,MX +3510480120,3510480415,US +3510480416,3510480423,GB +3510480424,3510480431,VE +3510480432,3510480439,US +3510480440,3510480447,BZ +3510480448,3510480527,US +3510480528,3510480535,GB +3510480536,3510480543,US +3510480544,3510480575,AT +3510480576,3510480655,US +3510480656,3510480663,IN +3510480664,3510480671,US +3510480672,3510480735,AU +3510480736,3510480815,US +3510480816,3510480823,IN +3510480824,3510480839,US +3510480840,3510480847,IN +3510480848,3510480959,US +3510480960,3510480967,GB +3510480968,3510480991,US +3510480992,3510481023,CR +3510481024,3510481191,US +3510481192,3510481199,GB +3510481200,3510481215,US +3510481216,3510481231,CA +3510481232,3510481295,US +3510481296,3510481311,AU +3510481312,3510481319,FR +3510481320,3510481359,US +3510481360,3510481375,ES +3510481376,3510481407,US +3510481408,3510481415,MY +3510481416,3510481679,US +3510481680,3510481687,AU +3510481688,3510481711,US +3510481712,3510481719,CA +3510481720,3510481727,JP +3510481728,3510481743,AU +3510481744,3510481855,US +3510481856,3510481871,CA +3510481872,3510481919,US +3510481920,3510481927,MX +3510481928,3510481935,RU +3510481936,3510482111,US +3510482112,3510482143,CA +3510482144,3510482151,AR +3510482152,3510831527,US 3510831528,3510831535,GB 3510831536,3510833423,US 3510833424,3510833439,CA @@ -66273,7 +109443,9 @@ 3510844416,3510844927,CA 3510844928,3510846527,US 3510846528,3510846559,CA -3510846560,3510897442,US +3510846560,3510886271,US +3510886272,3510886399,BR +3510886400,3510897442,US 3510897443,3510897443,IE 3510897444,3510935551,US 3510935552,3510943743,CA @@ -66281,7 +109453,15 @@ 3511140352,3511156735,CA 3511156736,3511331199,US 3511331200,3511331231,CA -3511331232,3511812095,US +3511331232,3511335231,US +3511335232,3511335263,RU +3511335264,3511335295,US +3511335296,3511335423,RU +3511335424,3511419951,US +3511419952,3511419959,UA +3511419960,3511611135,US +3511611136,3511611391,CA +3511611392,3511812095,US 3511812096,3511844863,CA 3511844864,3512011311,US 3512011312,3512011327,UM @@ -66299,8 +109479,7 @@ 3512012192,3512012223,BR 3512012224,3512012255,US 3512012256,3512012287,GB -3512012288,3512012543,IE -3512012544,3512013583,US +3512012288,3512013583,US 3512013584,3512013599,CA 3512013600,3512013647,US 3512013648,3512013663,CA @@ -66399,30 +109578,103 @@ 3512156160,3512172543,US 3512172544,3512176639,CA 3512176640,3512197119,US -3512197120,3512205311,CA -3512205312,3512207359,US +3512197120,3512200159,CA +3512200160,3512200175,US +3512200176,3512205311,CA +3512205312,3512205567,US +3512205568,3512205823,CL +3512205824,3512206079,AW +3512206080,3512206335,CL +3512206336,3512207103,HN +3512207104,3512207231,NI +3512207232,3512207359,US 3512207360,3512209407,CO -3512209408,3512221695,US -3512221696,3512223231,AG +3512209408,3512210943,US +3512210944,3512211199,CL +3512211200,3512211455,AR +3512211456,3512221439,US +3512221440,3512221471,CO +3512221472,3512221695,US +3512221696,3512221759,AG +3512221760,3512221791,GP +3512221792,3512221951,AG +3512221952,3512222207,VG +3512222208,3512222239,AG +3512222240,3512222271,VG +3512222272,3512222335,KN +3512222336,3512222463,AG +3512222464,3512222975,AI +3512222976,3512223231,AG 3512223232,3512223487,LC 3512223488,3512223743,AG -3512223744,3512228351,US -3512228352,3512229887,ZW +3512223744,3512225791,ZA +3512225792,3512227839,PR +3512227840,3512229887,ZW 3512229888,3512230143,VE -3512230144,3512233215,US +3512230144,3512230271,US +3512230272,3512230287,CA +3512230288,3512230399,US +3512230400,3512230431,CO +3512230432,3512230911,US +3512230912,3512231167,CL +3512231168,3512231199,VE +3512231200,3512231295,US +3512231296,3512231423,VE +3512231424,3512231679,CL +3512231680,3512231935,VE +3512231936,3512231967,CO +3512231968,3512232063,US +3512232064,3512232127,CO +3512232128,3512232191,US +3512232192,3512232223,CO +3512232224,3512232319,US +3512232320,3512232351,CO +3512232352,3512233215,US 3512233216,3512233471,CL -3512233472,3512233727,US +3512233472,3512233503,VE +3512233504,3512233599,US +3512233600,3512233631,CO +3512233632,3512233727,US 3512233728,3512233983,HN -3512233984,3512244991,US +3512233984,3512236031,ZA +3512236032,3512236287,US +3512236288,3512237311,MR +3512237312,3512237823,US +3512237824,3512238079,HN +3512238080,3512240127,AW +3512240128,3512241663,BS +3512241664,3512242175,CO +3512242176,3512242431,CL +3512242432,3512242687,VE +3512242688,3512244991,EG 3512244992,3512246015,IL -3512246016,3512249343,US +3512246016,3512246783,CL +3512246784,3512247039,US +3512247040,3512247295,NG +3512247296,3512248319,US +3512248320,3512248863,CO +3512248864,3512248927,US +3512248928,3512248959,CO +3512248960,3512249023,US +3512249024,3512249055,CO +3512249056,3512249087,US +3512249088,3512249343,CO 3512249344,3512256511,IL 3512256512,3512258559,CL -3512258560,3512263679,US +3512258560,3512260607,US +3512260608,3512261631,GU +3512261632,3512262655,US +3512262656,3512263679,GT 3512263680,3512264703,VE -3512264704,3512269055,US +3512264704,3512267263,US +3512267264,3512268031,TG +3512268032,3512268543,US +3512268544,3512268799,PR +3512268800,3512269055,US 3512269056,3512269311,PR -3512269312,3512270847,US +3512269312,3512269567,US +3512269568,3512269823,HN +3512269824,3512270847,US 3512270848,3512336383,CA 3512336384,3512369151,US 3512369152,3512385535,CA @@ -66431,15 +109683,439 @@ 3512401920,3512418303,US 3512418304,3512451071,CA 3512451072,3512467455,PR -3512467456,3512647679,US +3512467456,3512534015,US +3512534016,3512534079,BR +3512534080,3512535679,US +3512535680,3512535743,CA +3512535744,3512535935,US +3512535936,3512536063,DE +3512536064,3512536191,US +3512536192,3512536319,HK +3512536320,3512536383,CO +3512536384,3512536447,US +3512536448,3512536511,ES +3512536512,3512536575,US +3512536576,3512536703,MX +3512536704,3512537087,US +3512537088,3512537151,CL +3512537152,3512537215,DK +3512537216,3512537599,US +3512537600,3512537855,CA +3512537856,3512537983,US +3512537984,3512538111,BR +3512538112,3512538495,US +3512538496,3512538623,VE +3512538624,3512539007,US +3512539008,3512539135,ID +3512539136,3512539327,US +3512539328,3512539391,CO +3512539392,3512539903,US +3512539904,3512540031,MX +3512540032,3512540287,US +3512540288,3512540295,TH +3512540296,3512540351,US +3512540352,3512540415,CO +3512540416,3512541055,US +3512541056,3512541119,CO +3512541120,3512541231,US +3512541232,3512541247,SE +3512541248,3512541279,US +3512541280,3512541295,IT +3512541296,3512541439,US +3512541440,3512541583,IT +3512541584,3512541599,US +3512541600,3512541615,IT +3512541616,3512541631,US +3512541632,3512541695,IT +3512541696,3512541921,NO +3512541922,3512542207,US +3512542208,3512542239,SE +3512542240,3512542719,US +3512542720,3512542751,DE +3512542752,3512542975,US +3512542976,3512543023,IL +3512543024,3512543743,US +3512543744,3512543903,FI +3512543904,3512543999,US +3512544000,3512544063,DE +3512544064,3512544071,ID +3512544072,3512544079,TW +3512544080,3512544087,MY +3512544088,3512544095,US +3512544096,3512544103,HK +3512544104,3512544111,JP +3512544112,3512544255,US +3512544256,3512544335,GB +3512544336,3512544383,US +3512544384,3512544447,GB +3512544448,3512544511,US +3512544512,3512544527,DE +3512544528,3512544575,US +3512544576,3512544639,DE +3512544640,3512544767,US +3512544768,3512544799,NO +3512544800,3512544831,US +3512544832,3512544911,NO +3512544912,3512545023,US +3512545024,3512545151,TW +3512545152,3512545407,US +3512545408,3512545439,GB +3512545440,3512545471,US +3512545472,3512545663,GB +3512545664,3512545759,US +3512545760,3512545791,GB +3512545792,3512545935,IT +3512545936,3512545983,US +3512545984,3512546047,IT +3512546048,3512546175,GB +3512546176,3512546303,US +3512546304,3512546463,FR +3512546464,3512546559,US +3512546560,3512546591,IT +3512546592,3512546607,SG +3512546608,3512546623,JP +3512546624,3512546631,KR +3512546632,3512546687,US +3512546688,3512546815,BE +3512546816,3512546879,DE +3512546880,3512546943,US +3512546944,3512547071,DE +3512547072,3512547103,LU +3512547104,3512547231,BE +3512547232,3512547263,US +3512547264,3512547327,ES +3512547328,3512547359,SE +3512547360,3512547391,US +3512547392,3512547455,ZA +3512547456,3512547583,US +3512547584,3512547839,GB +3512547840,3512547871,PT +3512547872,3512548095,US +3512548096,3512548143,CH +3512548144,3512548351,US +3512548352,3512548479,ES +3512548480,3512548671,US +3512548672,3512548703,NL +3512548704,3512548735,US +3512548736,3512548863,NL +3512548864,3512548991,CH +3512548992,3512549087,US +3512549088,3512549119,GR +3512549120,3512549247,FR +3512549248,3512549311,US +3512549312,3512549375,FR +3512549376,3512549567,US +3512549568,3512549631,BE +3512549632,3512549695,DE +3512549696,3512549727,TW +3512549728,3512549759,US +3512549760,3512549887,TH +3512549888,3512550015,US +3512550016,3512550031,DE +3512550032,3512550143,US +3512550144,3512550175,AT +3512550176,3512550255,US +3512550256,3512550271,AT +3512550272,3512550399,US +3512550400,3512550415,CH +3512550416,3512550911,US +3512550912,3512551167,GB +3512551168,3512551423,DE +3512551424,3512551551,IL +3512551552,3512552191,US +3512552192,3512552447,NL +3512552448,3512552559,US +3512552560,3512552703,DE +3512552704,3512552959,US +3512552960,3512553111,GR +3512553112,3512553471,US +3512553472,3512553663,AT +3512553664,3512553727,US +3512553728,3512553855,CH +3512553856,3512553983,US +3512553984,3512554751,GB +3512554752,3512554767,DK +3512554768,3512555775,US +3512555776,3512556287,IE +3512556288,3512556415,SE +3512556416,3512556479,DE +3512556480,3512556543,US +3512556544,3512556799,FR +3512556800,3512556831,US +3512556832,3512556847,BE +3512556848,3512556863,US +3512556864,3512556927,BE +3512556928,3512557055,US +3512557056,3512557311,DE +3512557312,3512557567,GB +3512557568,3512557911,US +3512557912,3512557919,JP +3512557920,3512557951,US +3512557952,3512558015,ID +3512558016,3512558079,HK +3512558080,3512558591,US +3512558592,3512558719,JP +3512558720,3512558783,MY +3512558784,3512558847,US +3512558848,3512558911,JP +3512558912,3512558959,SG +3512558960,3512558975,US +3512558976,3512559039,JP +3512559040,3512559071,AU +3512559072,3512559103,US +3512559104,3512559135,SG +3512559136,3512559231,US +3512559232,3512559359,ID +3512559360,3512560127,US +3512560128,3512560257,TH +3512560258,3512560383,US +3512560384,3512560511,JP +3512560512,3512561151,US +3512561152,3512561279,CN +3512561280,3512561407,US +3512561408,3512561535,HK +3512561536,3512561663,US +3512561664,3512561727,AU +3512561728,3512561791,JP +3512561792,3512561919,CN +3512561920,3512562175,JP +3512562176,3512562239,CH +3512562240,3512562271,HK +3512562272,3512562303,US +3512562304,3512562367,CN +3512562368,3512562431,HK +3512562432,3512562463,TH +3512562464,3512562543,US +3512562544,3512562559,TH +3512562560,3512562943,US +3512562944,3512563071,PH +3512563072,3512563135,US +3512563136,3512563199,SG +3512563200,3512563391,US +3512563392,3512563455,ID +3512563456,3512563711,US +3512563712,3512563727,MY +3512563728,3512563743,US +3512563744,3512563775,AU +3512563776,3512563807,JP +3512563808,3512563967,US +3512563968,3512564095,PH +3512564096,3512564223,US +3512564224,3512564479,SG +3512564480,3512565119,US +3512565120,3512565247,HK +3512565248,3512565503,PH +3512565504,3512566527,US +3512566528,3512566655,BR +3512566656,3512567199,US +3512567200,3512567231,CA +3512567232,3512567295,US +3512567296,3512567423,GB +3512567424,3512567935,US +3512567936,3512568063,BR +3512568064,3512569087,US +3512569088,3512569215,CA +3512569216,3512569983,US +3512569984,3512569999,VE +3512570000,3512570015,CA +3512570016,3512570239,US +3512570240,3512570367,MX +3512570368,3512571775,US +3512571776,3512571903,CL +3512571904,3512571967,VE +3512571968,3512572927,US +3512572928,3512573055,MX +3512573056,3512573151,US +3512573152,3512573183,BR +3512573184,3512573311,US +3512573312,3512573375,CL +3512573376,3512573439,US +3512573440,3512573695,CL +3512573696,3512573727,KR +3512573728,3512573759,HK +3512573760,3512573791,TW +3512573792,3512573823,ID +3512573824,3512573855,SG +3512573856,3512573887,US +3512573888,3512574207,ID +3512574208,3512574719,US +3512574720,3512574975,SG +3512574976,3512575551,US +3512575552,3512575615,MY +3512575616,3512575743,JP +3512575744,3512575999,US +3512576000,3512576031,KR +3512576032,3512576063,US +3512576064,3512576127,KR +3512576128,3512576255,US +3512576256,3512576511,HK +3512576512,3512576767,US +3512576768,3512576895,KR +3512576896,3512577023,US +3512577024,3512577087,JP +3512577088,3512577279,US +3512577280,3512577343,TW +3512577344,3512577407,SG +3512577408,3512577439,TH +3512577440,3512577535,US +3512577536,3512577599,AU +3512577600,3512577631,PH +3512577632,3512577663,US +3512577664,3512577727,TH +3512577728,3512577791,US +3512577792,3512577855,JP +3512577856,3512578047,US +3512578048,3512578111,KR +3512578112,3512578559,US +3512578560,3512578720,CN +3512578721,3512578815,US +3512578816,3512578943,TH +3512578944,3512579071,US +3512579072,3512579199,ID +3512579200,3512579327,HK +3512579328,3512579455,KR +3512579456,3512579583,NZ +3512579584,3512579839,ID +3512579840,3512579967,SG +3512579968,3512580031,KR +3512580032,3512580095,TW +3512580096,3512580223,JP +3512580224,3512580287,US +3512580288,3512580351,CN +3512580352,3512580367,CH +3512580368,3512580415,US +3512580416,3512580479,SG +3512580480,3512580863,HK +3512580864,3512580991,ID +3512580992,3512581055,SG +3512581056,3512581119,KR +3512581120,3512581247,NZ +3512581248,3512581375,TW +3512581376,3512582143,CN +3512582144,3512582207,US +3512582208,3512582223,BR +3512582224,3512582463,US +3512582464,3512582527,BR +3512582528,3512582655,PE +3512582656,3512582719,BR +3512582720,3512582783,CN +3512582784,3512582911,BR +3512582912,3512583295,US +3512583296,3512583679,BR +3512583680,3512584447,US +3512584448,3512584479,BR +3512584480,3512585407,US +3512585408,3512585439,BR +3512585440,3512585887,US +3512585888,3512585919,PE +3512585920,3512585983,CO +3512585984,3512586175,US +3512586176,3512586239,VE +3512586240,3512586495,US +3512586496,3512586687,BR +3512586688,3512586751,AR +3512586752,3512587295,US +3512587296,3512587327,CH +3512587328,3512587647,US +3512587648,3512587775,CO +3512587776,3512587903,US +3512587904,3512588031,CO +3512588032,3512588159,US +3512588160,3512588191,PE +3512588192,3512588223,US +3512588224,3512588287,BR +3512588288,3512588415,US +3512588416,3512588543,MX +3512588544,3512589407,US +3512589408,3512589567,BR +3512589568,3512589887,US +3512589888,3512589951,CO +3512589952,3512590015,US +3512590016,3512590079,CO +3512590080,3512590143,MX +3512590144,3512590207,CH +3512590208,3512590847,US +3512590848,3512590975,TH +3512590976,3512591103,PH +3512591104,3512591359,JP +3512591360,3512592383,US +3512592384,3512592895,GB +3512592896,3512593151,PH +3512593152,3512593279,GB +3512593280,3512593407,SG +3512593408,3512593471,TH +3512593472,3512593511,US +3512593512,3512593519,CN +3512593520,3512593663,US +3512593664,3512593791,JP +3512593792,3512593887,US +3512593888,3512593919,DE +3512593920,3512594047,US +3512594048,3512594175,CN +3512594176,3512594431,MY +3512594432,3512594495,HK +3512594496,3512594559,US +3512594560,3512594687,CN +3512594688,3512594943,US +3512594944,3512595007,TH +3512595008,3512595199,US +3512595200,3512595455,TW +3512595456,3512595711,US +3512595712,3512595743,KR +3512595744,3512595775,US +3512595776,3512595839,KR +3512595840,3512596223,US +3512596224,3512596479,JP +3512596480,3512596991,US +3512596992,3512597247,TH +3512597248,3512597759,US +3512597760,3512598015,JP +3512598016,3512598079,KR +3512598080,3512598143,US +3512598144,3512598271,TH +3512598272,3512598527,PH +3512598528,3512647679,US 3512647680,3512655871,TT -3512655872,3512696831,US -3512696832,3512699775,SE -3512699776,3512699903,US -3512699904,3512705023,SE +3512655872,3512690591,US +3512690592,3512690623,IN +3512690624,3512695839,US +3512695840,3512695871,GB +3512695872,3512696831,US +3512696832,3512699647,SE +3512699648,3512701951,US +3512701952,3512705023,SE 3512705024,3512844287,US -3512844288,3512852479,CA -3512852480,3512983551,US +3512844288,3512844543,CA +3512844544,3512844607,A1 +3512844608,3512845567,CA +3512845568,3512845695,A1 +3512845696,3512845697,CA +3512845698,3512845745,A1 +3512845746,3512845747,CA +3512845748,3512845758,A1 +3512845759,3512845759,CA +3512845760,3512845823,A1 +3512845824,3512847487,CA +3512847488,3512847615,A1 +3512847616,3512847999,CA +3512848000,3512848127,A1 +3512848128,3512848360,CA +3512848361,3512848361,A1 +3512848362,3512848959,CA +3512848960,3512849023,A1 +3512849024,3512849697,CA +3512849698,3512849699,A1 +3512849700,3512852459,CA +3512852460,3512852461,A1 +3512852462,3512852479,CA +3512852480,3512891135,US +3512891136,3512891167,BE +3512891168,3512891199,AU +3512891200,3512891231,FR +3512891232,3512891263,KW +3512891264,3512891327,US +3512891328,3512891359,CA +3512891360,3512983551,US 3512983552,3512987647,AR 3512987648,3513188351,US 3513188352,3513204735,CA @@ -66449,36 +110125,123 @@ 3513294848,3513303039,CA 3513303040,3513368575,US 3513368576,3513376767,CA -3513384960,3513475071,US +3513376768,3513475071,US 3513475072,3513483263,CA -3513483264,3513499647,US -3513507840,3513778175,US +3513483264,3513670911,US +3513670912,3513671167,A2 +3513671168,3513778175,US 3513778176,3513794559,CA 3513794560,3514007551,US 3514007552,3514040319,CA 3514040320,3514367999,US 3514368000,3514433535,CA -3514433536,3514589439,US +3514433536,3514583479,US +3514583480,3514583487,PA +3514583488,3514587511,US +3514587512,3514587519,PA +3514587520,3514589439,US 3514589440,3514589695,GT 3514589696,3514590207,SV -3514590208,3514590719,US +3514590208,3514590719,NI 3514590720,3514591103,SV 3514591104,3514591487,US 3514591488,3514592255,NI -3514592256,3514592767,SV -3514592768,3514593279,US -3514593280,3514597375,SV -3514597376,3514775295,US +3514592256,3514597375,SV +3514597376,3514763423,US +3514763424,3514763439,PA +3514763440,3514763711,US +3514763712,3514763727,VE +3514763728,3514763775,US +3514763776,3514763791,PA +3514763792,3514764047,US +3514764048,3514764063,PA +3514764064,3514765823,US +3514765824,3514765855,PA +3514765856,3514765919,US +3514765920,3514765951,VE +3514765952,3514766111,US +3514766112,3514766143,VE +3514766144,3514766207,US +3514766208,3514766271,PA +3514766272,3514766303,US +3514766304,3514766335,PA +3514766336,3514766463,US +3514766464,3514766495,PA +3514766496,3514766879,US +3514766880,3514766911,PA +3514766912,3514767199,US +3514767200,3514767231,VE +3514767232,3514767455,US +3514767456,3514767487,VE +3514767488,3514768127,US +3514768128,3514768191,VE +3514768192,3514769023,US +3514769024,3514769151,PA +3514769152,3514769215,US +3514769216,3514769279,PA +3514769280,3514775295,US 3514775296,3514775551,PA -3514775552,3514791935,US -3514791936,3514793983,PA +3514775552,3514776063,US +3514776064,3514776319,VE +3514776320,3514776343,US +3514776344,3514776351,VE +3514776352,3514776407,US +3514776408,3514776415,VE +3514776416,3514781695,US +3514781696,3514782719,VE +3514782720,3514787583,US +3514787584,3514787839,PA +3514787840,3514791679,US +3514791680,3514793983,PA 3514793984,3514826751,US 3514826752,3514843135,CA -3514843136,3515301887,US +3514843136,3515114247,US +3515114248,3515114255,AU +3515114256,3515149567,US +3515149568,3515149583,AU +3515149584,3515154943,US +3515154944,3515155199,CA +3515155200,3515155455,US +3515155456,3515155711,CA +3515155712,3515166719,US +3515166720,3515166975,CA +3515166976,3515170991,US +3515170992,3515170999,KR +3515171000,3515185151,US +3515185152,3515185407,CA +3515185408,3515301887,US 3515301888,3515318271,CA -3515318272,3515596799,US +3515318272,3515358975,US +3515358976,3515359231,MX +3515359232,3515452639,US +3515452640,3515452655,KR +3515452656,3515452775,US +3515452776,3515452783,JP +3515452784,3515453055,US +3515453056,3515453071,JP +3515453072,3515453679,US +3515453680,3515453687,JP +3515453688,3515454063,US +3515454064,3515454079,JP +3515454080,3515454095,US +3515454096,3515454111,JP +3515454112,3515454143,US +3515454144,3515454159,JP +3515454160,3515454167,US +3515454168,3515454207,JP +3515454208,3515454399,US +3515454400,3515454463,JP +3515454464,3515455311,US +3515455312,3515455319,JP +3515455320,3515455999,US +3515456000,3515456015,JP +3515456016,3515456703,US +3515456704,3515456767,JP +3515456768,3515596799,US 3515596800,3515613183,CA -3515744256,3515867151,US +3515744256,3515793351,US +3515793352,3515793359,MO +3515793360,3515867151,US 3515867152,3515867167,AU 3515867168,3515867391,US 3515867392,3515867519,AU @@ -66486,27 +110249,49 @@ 3515868464,3515868479,IT 3515868480,3515913631,US 3515913632,3515913663,CA -3515913664,3515965439,US +3515913664,3515916519,US +3515916520,3515916527,AU +3515916528,3515955375,US +3515955376,3515955391,GB +3515955392,3515955503,US +3515955504,3515955519,CA +3515955520,3515955551,US +3515955552,3515955567,ES +3515955568,3515956319,US +3515956320,3515956335,NL +3515956336,3515956383,US +3515956384,3515956399,GB +3515956400,3515965439,US 3515965440,3515973631,CA 3515973632,3515990015,US 3516006400,3516039167,US 3516039168,3516071935,CA -3516071936,3516153855,US +3516071936,3516139007,US +3516139008,3516139263,GB +3516139264,3516153855,US 3516153856,3516162047,CA 3516162048,3516170239,US 3516170240,3516203007,CA 3516203008,3516334079,US 3516334080,3516342271,CA -3516342272,3516355663,US +3516342272,3516351055,US +3516351056,3516351087,TR +3516351088,3516351095,US +3516351096,3516351103,MY +3516351104,3516351255,US +3516351256,3516351271,AE +3516351272,3516355663,US 3516355664,3516355679,CA -3516355680,3516366847,US +3516355680,3516357631,US +3516357632,3516357887,MY +3516357888,3516358143,US +3516358144,3516358399,CA +3516358400,3516366847,US 3516366848,3516370943,CA -3516370944,3516375039,US -3516383232,3516432383,US -3516440576,3516514303,US +3516370944,3516514303,US 3516514304,3516530687,CA -3516530688,3516891135,US -3516899328,3516899839,ZA +3516530688,3516899327,US +3516899328,3516899839,A2 3516899840,3516899847,US 3516899848,3516899855,NG 3516899856,3516899887,US @@ -66514,184 +110299,400 @@ 3516899904,3516899935,EC 3516899936,3516900015,NG 3516900016,3516900095,US -3516900096,3516900351,ZA +3516900096,3516900351,A2 3516900352,3516900607,NG -3516900608,3516900863,ZA +3516900608,3516900863,A2 3516900864,3516901119,NG -3516901120,3516901887,ZA +3516901120,3516901887,A2 3516901888,3516902399,NG -3516902400,3516902655,ZA +3516902400,3516902655,A2 3516902656,3516902911,NG -3516902912,3516903167,ZA +3516902912,3516903167,A2 3516903168,3516903423,NG 3516903424,3516907519,CA -3516907520,3516952575,US -3516956672,3517038591,US +3516907520,3517038591,US 3517038592,3517054975,CA 3517054976,3517095935,US 3517095936,3517100031,CA -3517100032,3517112319,US +3517100032,3517100137,US +3517100138,3517100153,CA +3517100154,3517100213,US +3517100214,3517100223,NZ +3517100224,3517100569,US +3517100570,3517100585,NE +3517100586,3517100619,US +3517100620,3517100635,CA +3517100636,3517100648,US +3517100649,3517100668,CA +3517100669,3517100811,US +3517100812,3517100829,GB +3517100830,3517101597,US +3517101598,3517101613,GB +3517101614,3517103316,US +3517103317,3517103330,NZ +3517103331,3517112319,US 3517112320,3517116159,CA 3517116160,3517116415,US 3517116416,3517120511,CA 3517120512,3517233151,US 3517233152,3517235199,GU -3517235200,3517309951,US -3517309952,3517313023,CA -3517313024,3517383167,US -3517383168,3517383423,CA -3517383424,3517385983,US -3517385984,3517386239,CA -3517386240,3517388287,US -3517388288,3517388543,CA -3517388544,3517391103,US -3517391104,3517391359,CA -3517391360,3517391439,US -3517391440,3517391455,CA -3517391456,3517391871,US -3517391872,3517392127,CA +3517235200,3517308927,US +3517308928,3517313023,CA +3517313024,3517382655,US +3517382656,3517383679,CA +3517383680,3517383935,US +3517383936,3517384447,CA +3517384448,3517385215,US +3517385216,3517385311,CA +3517385312,3517385375,US +3517385376,3517387775,CA +3517387776,3517388031,US +3517388032,3517388255,CA +3517388256,3517388271,US +3517388272,3517388799,CA +3517388800,3517389311,US +3517389312,3517389567,CA +3517389568,3517390079,US +3517390080,3517390335,CA +3517390336,3517390591,US +3517390592,3517391471,CA +3517391472,3517391487,US +3517391488,3517391535,CA +3517391536,3517391551,US +3517391552,3517392127,CA 3517392128,3517392383,US 3517392384,3517392639,CA -3517392640,3517394687,US -3517394688,3517394943,CA -3517394944,3517396063,US -3517396064,3517396079,CA -3517396080,3517396175,US -3517396176,3517396183,CA -3517396184,3517396479,US -3517396480,3517396543,CA -3517396544,3517396815,US -3517396816,3517396831,CA -3517396832,3517397503,US -3517397504,3517398527,CA -3517398528,3517400063,US -3517400064,3517400319,CA -3517400320,3517400511,US -3517400512,3517400543,CA -3517400544,3517401343,US -3517401344,3517401375,CA -3517401376,3517401439,US -3517401440,3517401471,CA -3517401472,3517401855,US -3517401856,3517402111,CA -3517402112,3517403903,US -3517403904,3517404159,CA -3517404160,3517404671,US -3517404672,3517404927,CA +3517392640,3517392655,US +3517392656,3517392719,CA +3517392720,3517392735,US +3517392736,3517392863,CA +3517392864,3517392879,US +3517392880,3517393407,CA +3517393408,3517393439,US +3517393440,3517393471,CA +3517393472,3517393503,US +3517393504,3517395663,CA +3517395664,3517395679,US +3517395680,3517395695,CA +3517395696,3517395743,US +3517395744,3517395807,CA +3517395808,3517395839,US +3517395840,3517395871,CA +3517395872,3517395903,US +3517395904,3517396095,CA +3517396096,3517396111,US +3517396112,3517396143,CA +3517396144,3517396175,US +3517396176,3517396911,CA +3517396912,3517396927,US +3517396928,3517396943,CA +3517396944,3517396959,US +3517396960,3517397503,CA +3517397504,3517397759,US +3517397760,3517398015,CA +3517398016,3517398527,US +3517398528,3517399551,CA +3517399552,3517399807,US +3517399808,3517399871,CA +3517399872,3517399935,IL +3517399936,3517400831,CA +3517400832,3517400847,US +3517400848,3517401183,CA +3517401184,3517401199,US +3517401200,3517401279,CA +3517401280,3517401343,US +3517401344,3517401599,CA +3517401600,3517401855,US +3517401856,3517402879,CA +3517402880,3517403391,US +3517403392,3517403455,CA +3517403456,3517403519,US +3517403520,3517404927,CA 3517404928,3517405183,US -3517405184,3517405439,CA -3517405440,3517405631,US -3517405632,3517405647,CA -3517405648,3517405695,US -3517405696,3517406463,CA -3517406464,3517407231,US -3517407232,3517407359,CA -3517407360,3517407743,US -3517407744,3517408255,CA -3517408256,3517408959,US -3517408960,3517408975,CA -3517408976,3517409007,US +3517405184,3517406751,CA +3517406752,3517406783,US +3517406784,3517407359,CA +3517407360,3517407487,US +3517407488,3517408583,CA +3517408584,3517408591,US +3517408592,3517408703,CA +3517408704,3517408711,US +3517408712,3517408727,CA +3517408728,3517408735,US +3517408736,3517408743,CA +3517408744,3517408767,US +3517408768,3517408799,CA +3517408800,3517408815,US +3517408816,3517408895,CA +3517408896,3517408911,US +3517408912,3517408991,CA +3517408992,3517409007,US 3517409008,3517409279,CA 3517409280,3517409791,US -3517409792,3517410815,CA -3517410816,3517411327,US -3517411328,3517411583,CA -3517411584,3517413119,US -3517413120,3517414399,CA -3517414400,3517414751,US -3517414752,3517414767,CA -3517414768,3517415167,US -3517415168,3517415423,CA -3517415424,3517416527,US -3517416528,3517416543,CA -3517416544,3517416655,US -3517416656,3517416687,CA -3517416688,3517416903,US -3517416904,3517416911,CA -3517416912,3517416959,US -3517416960,3517417471,CA -3517417472,3517417599,US -3517417600,3517417631,CA -3517417632,3517418303,US -3517418304,3517418335,CA -3517418336,3517419295,US -3517419296,3517419391,CA -3517419392,3517419423,US -3517419424,3517419775,CA -3517419776,3517420031,US -3517420032,3517420159,CA -3517420160,3517422847,US -3517422848,3517423359,CA -3517423360,3517423871,US -3517423872,3517424127,CA -3517424128,3517424607,US -3517424608,3517424623,CA -3517424624,3517428991,US -3517428992,3517429247,CA -3517429248,3517429887,US -3517429888,3517429919,CA -3517429920,3517430223,US +3517409792,3517411071,CA +3517411072,3517411327,US +3517411328,3517414463,CA +3517414464,3517414495,US +3517414496,3517414751,CA +3517414752,3517414767,US +3517414768,3517415983,CA +3517415984,3517415999,GB +3517416000,3517416063,CA +3517416064,3517416079,US +3517416080,3517416111,CA +3517416112,3517416127,US +3517416128,3517416143,CA +3517416144,3517416159,US +3517416160,3517416591,CA +3517416592,3517416607,US +3517416608,3517416711,CA +3517416712,3517416727,US +3517416728,3517416735,CA +3517416736,3517416743,US +3517416744,3517416775,CA +3517416776,3517416783,US +3517416784,3517416791,CA +3517416792,3517416799,US +3517416800,3517416823,CA +3517416824,3517416839,US +3517416840,3517417535,CA +3517417536,3517417567,US +3517417568,3517417631,CA +3517417632,3517417663,US +3517417664,3517417695,CA +3517417696,3517417855,US +3517417856,3517418367,CA +3517418368,3517418399,US +3517418400,3517419103,CA +3517419104,3517419135,US +3517419136,3517420159,CA +3517420160,3517420287,US +3517420288,3517420303,CA +3517420304,3517420311,US +3517420312,3517420327,CA +3517420328,3517420335,US +3517420336,3517420351,CA +3517420352,3517420359,US +3517420360,3517420383,CA +3517420384,3517420399,US +3517420400,3517420407,CA +3517420408,3517420431,US +3517420432,3517420439,CA +3517420440,3517420447,US +3517420448,3517420471,CA +3517420472,3517420479,US +3517420480,3517420487,CA +3517420488,3517420495,US +3517420496,3517422591,CA +3517422592,3517422599,US +3517422600,3517422663,CA +3517422664,3517422687,US +3517422688,3517422695,CA +3517422696,3517422703,US +3517422704,3517422719,CA +3517422720,3517422759,US +3517422760,3517422783,CA +3517422784,3517422791,US +3517422792,3517424319,CA +3517424320,3517424335,SE +3517424336,3517424511,CA +3517424512,3517424543,US +3517424544,3517424623,CA +3517424624,3517424639,US +3517424640,3517426047,CA +3517426048,3517426111,US +3517426112,3517426687,CA +3517426688,3517426751,US +3517426752,3517427711,CA +3517427712,3517427727,US +3517427728,3517428063,CA +3517428064,3517428095,US +3517428096,3517428431,CA +3517428432,3517428447,US +3517428448,3517429759,CA +3517429760,3517429791,US +3517429792,3517430015,CA +3517430016,3517430031,US +3517430032,3517430127,CA +3517430128,3517430143,US +3517430144,3517430175,CA +3517430176,3517430191,US +3517430192,3517430207,CA +3517430208,3517430223,US 3517430224,3517430239,CA -3517430240,3517432319,US -3517432320,3517432575,CA -3517432576,3517434111,US -3517434112,3517434367,CA -3517434368,3517434447,US -3517434448,3517434455,CA -3517434456,3517435583,US -3517435584,3517435647,CA -3517435648,3517438879,US +3517430240,3517430255,US +3517430256,3517430783,CA +3517430784,3517431039,US +3517431040,3517431599,CA +3517431600,3517431615,US +3517431616,3517431663,CA +3517431664,3517431679,US +3517431680,3517431695,CA +3517431696,3517431711,NL +3517431712,3517431759,CA +3517431760,3517431775,US +3517431776,3517431807,CA +3517431808,3517431823,US +3517431824,3517431919,CA +3517431920,3517431935,US +3517431936,3517431967,CA +3517431968,3517431983,US +3517431984,3517432191,CA +3517432192,3517432319,US +3517432320,3517433919,CA +3517433920,3517433983,US +3517433984,3517434375,CA +3517434376,3517434383,US +3517434384,3517434503,CA +3517434504,3517434527,US +3517434528,3517434567,CA +3517434568,3517434583,US +3517434584,3517434607,CA +3517434608,3517434615,US +3517434616,3517435007,CA +3517435008,3517435135,US +3517435136,3517436935,CA +3517436936,3517436943,US +3517436944,3517436975,CA +3517436976,3517436983,US +3517436984,3517436991,CA +3517436992,3517436999,US +3517437000,3517437007,CA +3517437008,3517437015,US +3517437016,3517437039,CA +3517437040,3517437063,US +3517437064,3517437071,CA +3517437072,3517437079,US +3517437080,3517437087,CA +3517437088,3517437095,NO +3517437096,3517437135,CA +3517437136,3517437143,US +3517437144,3517437151,CA +3517437152,3517437175,US +3517437176,3517438015,CA +3517438016,3517438079,US +3517438080,3517438143,CA +3517438144,3517438207,US +3517438208,3517438463,CA +3517438464,3517438527,US +3517438528,3517438591,CA +3517438592,3517438655,US +3517438656,3517438751,CA +3517438752,3517438783,US +3517438784,3517438879,CA 3517438880,3517438911,KW -3517438912,3517439423,US -3517439424,3517439487,CA -3517439488,3517439999,US -3517440000,3517440255,CA +3517438912,3517439487,CA +3517439488,3517439615,US +3517439616,3517440255,CA 3517440256,3517440511,US -3517440512,3517441535,CA -3517441536,3517441791,US -3517441792,3517442047,CA -3517442048,3517442527,US -3517442528,3517442543,CA -3517442544,3517442751,US -3517442752,3517443071,CA -3517443072,3517443327,US -3517443328,3517443583,CA -3517443584,3517443839,US -3517443840,3517443903,CA -3517443904,3517444031,US -3517444032,3517444095,CA -3517444096,3517445631,US -3517445632,3517445887,CA +3517440512,3517442239,CA +3517442240,3517442303,US +3517442304,3517442319,CA +3517442320,3517442335,US +3517442336,3517442383,CA +3517442384,3517442399,US +3517442400,3517442431,CA +3517442432,3517442447,US +3517442448,3517443647,CA +3517443648,3517443679,US +3517443680,3517444223,CA +3517444224,3517444351,US +3517444352,3517444671,CA +3517444672,3517444735,US +3517444736,3517444799,CA +3517444800,3517444863,US +3517444864,3517445199,CA +3517445200,3517445375,US +3517445376,3517445503,CA +3517445504,3517445567,US +3517445568,3517445887,CA 3517445888,3517446015,US -3517446016,3517446143,CA -3517446144,3517447423,US -3517447424,3517447679,CA -3517447680,3517447743,US +3517446016,3517446911,CA +3517446912,3517447167,US +3517447168,3517447727,CA +3517447728,3517447743,US 3517447744,3517447759,CA -3517447760,3517447927,US -3517447928,3517448191,CA -3517448192,3517546495,US +3517447760,3517447767,US +3517447768,3517447783,CA +3517447784,3517447791,US +3517447792,3517447847,CA +3517447848,3517447863,US +3517447864,3517448191,CA +3517448192,3517523167,US +3517523168,3517523183,BS +3517523184,3517523671,US +3517523672,3517523679,KY +3517523680,3517523935,US +3517523936,3517523951,BZ +3517523952,3517524175,US +3517524176,3517524183,GT +3517524184,3517524191,VI +3517524192,3517524431,US +3517524432,3517524439,GT +3517524440,3517546495,US 3517546496,3517562879,CA 3517562880,3517596671,US -3517596672,3517600767,SE +3517596672,3517596927,NO +3517596928,3517597183,SE +3517597184,3517597695,US +3517597696,3517598207,SE +3517598208,3517598463,IE +3517598464,3517598591,SE +3517598592,3517599231,US +3517599232,3517600767,SE 3517600768,3517601279,US -3517601280,3517604351,SE -3517604352,3517604863,US -3517604864,3517605119,SE +3517601280,3517602047,SE +3517602048,3517602303,DE +3517602304,3517602559,US +3517602560,3517602623,SE +3517602624,3517602815,US +3517602816,3517603071,SE +3517603072,3517603615,US +3517603616,3517603647,DE +3517603648,3517603839,US +3517603840,3517603903,SE +3517603904,3517603967,MA +3517603968,3517604031,DE +3517604032,3517604095,SE +3517604096,3517604351,US +3517604352,3517605119,SE 3517605120,3517605375,US 3517605376,3517605775,SE 3517605776,3517605791,US -3517605792,3517606911,SE +3517605792,3517605887,SE +3517605888,3517606207,US +3517606208,3517606271,SE +3517606272,3517606399,US +3517606400,3517606911,SE 3517606912,3517607935,US -3517607936,3517608191,SE +3517607936,3517608191,DE 3517608192,3517608447,US 3517608448,3517608703,GB -3517608704,3517612031,SE +3517608704,3517609743,US +3517609744,3517609855,SE +3517609856,3517610047,US +3517610048,3517610191,SE +3517610192,3517610199,US +3517610200,3517610207,SE +3517610208,3517610495,US +3517610496,3517611263,IE +3517611264,3517611295,SE +3517611296,3517611303,US +3517611304,3517611311,CA +3517611312,3517611367,SE +3517611368,3517611383,US +3517611384,3517611463,SE +3517611464,3517611471,IL +3517611472,3517612031,SE 3517612032,3517644799,US 3517644800,3517710335,CA 3517710336,3517718527,US 3517718528,3517726719,CA -3517726720,3517989487,US +3517726720,3517838927,US +3517838928,3517838938,LB +3517838939,3517979103,US +3517979104,3517979111,CA +3517979112,3517989487,US 3517989488,3517989503,CA 3517989504,3517989695,US 3517989696,3517989727,CA @@ -66701,35 +110702,310 @@ 3517990912,3517991423,CA 3517991424,3518062591,US 3518062592,3518066687,CA -3518066688,3518431231,US +3518066688,3518075455,US +3518075456,3518075519,AR +3518075520,3518075583,US +3518075584,3518075647,MX +3518075648,3518075903,AU +3518075904,3518076079,US +3518076080,3518076087,AU +3518076088,3518076671,US +3518076672,3518076927,PA +3518076928,3518077103,US +3518077104,3518077111,GB +3518077112,3518374719,US +3518374720,3518374783,IN +3518374784,3518380223,US +3518380224,3518380287,DE +3518380288,3518381055,US +3518381056,3518381311,IN +3518381312,3518381439,US +3518381440,3518381567,IN +3518381568,3518381631,DE +3518381632,3518381823,US +3518381824,3518382079,SG +3518382080,3518431231,US 3518431232,3518439423,CA 3518439424,3518463999,US 3518464000,3518472191,CA -3518472192,3518760575,US +3518472192,3518758911,US +3518758912,3518758975,CY +3518758976,3518759407,US +3518759408,3518759423,CY +3518759424,3518760511,US +3518760512,3518760575,AU 3518760576,3518760703,HU -3518760704,3518764671,US +3518760704,3518762495,US +3518762496,3518762751,GB +3518762752,3518764031,US +3518764032,3518764287,GB +3518764288,3518764671,US 3518764672,3518764703,NL -3518764704,3518779391,US -3518783488,3518894439,US +3518764704,3518765311,US +3518765312,3518765567,CA +3518765568,3518766879,US +3518766880,3518766911,TH +3518766912,3518890831,US +3518890832,3518890839,IT +3518890840,3518891175,US +3518891176,3518891183,GB +3518891184,3518891767,US +3518891768,3518891775,BG +3518891776,3518892039,US +3518892040,3518892047,GT +3518892048,3518892223,US +3518892224,3518892231,CL +3518892232,3518892415,US +3518892416,3518892423,GB +3518892424,3518894095,US +3518894096,3518894103,KW +3518894104,3518894343,US +3518894344,3518894351,MY +3518894352,3518894439,US 3518894440,3518894447,TR -3518894448,3518911743,US +3518894448,3518895719,US +3518895720,3518895727,PH +3518895728,3518895775,US +3518895776,3518895783,CA +3518895784,3518895791,TH +3518895792,3518895799,US +3518895800,3518895807,AR +3518895808,3518896215,US +3518896216,3518896223,CA +3518896224,3518896231,US +3518896232,3518896239,CN +3518896240,3518896519,US +3518896520,3518896527,AE +3518896528,3518896543,US +3518896544,3518896551,BD +3518896552,3518896895,US +3518896896,3518896903,GB +3518896904,3518897071,US +3518897072,3518897079,IT +3518897080,3518897119,US +3518897120,3518897127,IT +3518897128,3518897423,US +3518897424,3518897431,IN +3518897432,3518897879,US +3518897880,3518897887,AM +3518897888,3518898015,US +3518898016,3518898023,IN +3518898024,3518898143,US +3518898144,3518898151,BR +3518898152,3518898167,US +3518898168,3518898175,RO +3518898176,3518903175,US +3518903176,3518903183,BR +3518903184,3518903191,US +3518903192,3518903199,JP +3518903200,3518903399,US +3518903400,3518903407,PK +3518903408,3518903871,US +3518903872,3518903879,PK +3518903880,3518903927,US +3518903928,3518903935,RU +3518903936,3518903959,US +3518903960,3518903967,GB +3518903968,3518903999,US +3518904000,3518904007,ES +3518904008,3518904015,US +3518904016,3518904031,EG +3518904032,3518911743,US 3518911744,3518911999,GB 3518912000,3518912511,US 3518912512,3518912767,IN -3518912768,3518929535,US +3518912768,3518919031,US +3518919032,3518919039,GT +3518919040,3518919095,US +3518919096,3518919103,BD +3518919104,3518921447,US +3518921448,3518921455,CN +3518921456,3518921479,US +3518921480,3518921487,BD +3518921488,3518929535,US 3518929536,3518929599,CA -3518929600,3519234047,US +3518929600,3518995695,US +3518995696,3518995703,GB +3518995704,3519061295,US +3519061296,3519061311,GB +3519061312,3519234047,US 3519234048,3519250431,CA -3519250432,3519340543,US +3519250432,3519320975,US +3519320976,3519320983,GR +3519320984,3519340543,US 3519340544,3519344639,CA -3519344640,3519381503,US +3519344640,3519350079,US +3519350080,3519350087,NL +3519350088,3519352895,US +3519352896,3519352903,NL +3519352904,3519381503,US 3519381504,3519397887,CA -3519397888,3519406503,US +3519397888,3519406079,US +3519406080,3519406111,IT +3519406112,3519406127,US +3519406128,3519406143,DE +3519406144,3519406207,US +3519406208,3519406215,SA +3519406216,3519406255,US +3519406256,3519406263,SA +3519406264,3519406295,US +3519406296,3519406303,TH +3519406304,3519406335,US +3519406336,3519406359,DE +3519406360,3519406375,US +3519406376,3519406383,IT +3519406384,3519406391,IN +3519406392,3519406407,GB +3519406408,3519406479,US +3519406480,3519406487,AU +3519406488,3519406503,US 3519406504,3519406511,CA -3519406512,3519409295,US +3519406512,3519406527,GB +3519406528,3519406559,CA +3519406560,3519406695,US +3519406696,3519406831,SA +3519406832,3519406847,US +3519406848,3519407103,CA +3519407104,3519407151,US +3519407152,3519407199,MY +3519407200,3519407215,AR +3519407216,3519407351,AE +3519407352,3519407359,US +3519407360,3519407583,AR +3519407584,3519407591,US +3519407592,3519407599,AE +3519407600,3519407607,US +3519407608,3519407615,RU +3519407616,3519407623,AR +3519407624,3519409111,US +3519409112,3519409119,MY +3519409120,3519409135,OM +3519409136,3519409295,US 3519409296,3519409303,CA -3519409304,3519676415,US -3519676416,3519702319,CA +3519409304,3519409327,US +3519409328,3519409335,AR +3519409336,3519409407,US +3519409408,3519409423,AE +3519409424,3519409439,US +3519409440,3519409455,GB +3519409456,3519409599,MY +3519409600,3519409615,AR +3519409616,3519409807,US +3519409808,3519409815,GB +3519409816,3519409919,US +3519409920,3519409927,AR +3519409928,3519409943,MY +3519409944,3519409951,US +3519409952,3519410175,MY +3519410176,3519410279,US +3519410280,3519410287,AU +3519410288,3519410943,US +3519410944,3519411199,AR +3519411200,3519411327,US +3519411328,3519411391,RU +3519411392,3519411711,US +3519411712,3519411967,AR +3519411968,3519412223,DE +3519412224,3519412463,US +3519412464,3519412479,GB +3519412480,3519412519,US +3519412520,3519412527,RU +3519412528,3519412735,US +3519412736,3519412751,RU +3519412752,3519412799,US +3519412800,3519412815,RU +3519412816,3519413759,US +3519413760,3519414271,CA +3519414272,3519417087,US +3519417088,3519417151,IT +3519417152,3519417215,DE +3519417216,3519420767,US +3519420768,3519420775,HK +3519420776,3519422495,US +3519422496,3519422527,CA +3519422528,3519475711,US +3519475712,3519476223,BH +3519476224,3519477759,A2 +3519477760,3519566871,US +3519566872,3519566879,IE +3519566880,3519566943,US +3519566944,3519566951,GB +3519566952,3519567087,US +3519567088,3519567096,IE +3519567097,3519567679,US +3519567680,3519567687,GB +3519567688,3519567727,US +3519567728,3519567735,LB +3519567736,3519567759,US +3519567760,3519567767,JP +3519567768,3519567831,US +3519567832,3519567863,LB +3519567864,3519568911,US +3519568912,3519568919,FR +3519568920,3519568927,LB +3519568928,3519568991,US +3519568992,3519568999,GB +3519569000,3519569071,US +3519569072,3519569079,LB +3519569080,3519569103,US +3519569104,3519569111,GB +3519569112,3519569127,US +3519569128,3519569135,GB +3519569136,3519569727,US +3519569728,3519569735,JP +3519569736,3519578367,US +3519578368,3519578623,NA +3519578624,3519578879,US +3519578880,3519579135,CA +3519579136,3519579583,US +3519579584,3519579591,CR +3519579592,3519579967,US +3519579968,3519579983,CY +3519579984,3519579991,CR +3519579992,3519580031,US +3519580032,3519580047,CY +3519580048,3519580063,CR +3519580064,3519583999,US +3519584000,3519584255,CA +3519584256,3519586047,US +3519586048,3519586559,GB +3519586560,3519586815,US +3519586816,3519587007,GB +3519587008,3519587071,AG +3519587072,3519588351,US +3519588352,3519588367,CR +3519588368,3519588391,US +3519588392,3519588399,CR +3519588400,3519588447,US +3519588448,3519588463,CR +3519588464,3519588639,US +3519588640,3519588671,GB +3519588672,3519588687,US +3519588688,3519588703,CY +3519588704,3519590655,US +3519590656,3519590911,CA +3519590912,3519590927,GB +3519590928,3519590943,EE +3519590944,3519590959,AG +3519590960,3519591055,US +3519591056,3519591071,MT +3519591072,3519591087,IM +3519591088,3519591167,US +3519591168,3519591423,GB +3519591424,3519603204,US +3519603205,3519603212,VN +3519603213,3519603255,US +3519603256,3519603265,BR +3519603266,3519603271,US +3519603272,3519603286,CA +3519603287,3519603772,US +3519603773,3519603781,IN +3519603782,3519676415,US +3519676416,3519700559,CA +3519700560,3519700567,US +3519700568,3519700575,CA +3519700576,3519700607,US +3519700608,3519702319,CA 3519702320,3519702327,US 3519702328,3519709183,CA 3519709184,3519709311,US @@ -66738,38 +111014,399 @@ 3519712448,3519712511,CA 3519712512,3519715295,US 3519715296,3519715327,GB -3519715328,3519741951,US -3519758336,3519774719,US -3519782912,3519791103,US -3519799296,3519873023,US -3519873024,3519901695,CA -3519905792,3519934463,US +3519715328,3519716863,US +3519716864,3519716991,CA +3519716992,3519741951,US +3519741952,3519758335,ZA +3519758336,3519791103,US +3519799296,3519799871,US +3519799872,3519799903,IN +3519799904,3519805119,US +3519805120,3519805183,GB +3519805184,3519873023,US +3519873024,3519879679,CA +3519879680,3519879687,US +3519879688,3519879767,CA +3519879768,3519879775,US +3519879776,3519879807,CA +3519879808,3519879815,US +3519879816,3519879863,CA +3519879864,3519879871,US +3519879872,3519880767,CA +3519880768,3519880831,DE +3519880832,3519881375,CA +3519881376,3519881407,US +3519881408,3519881567,CA +3519881568,3519881599,US +3519881600,3519901695,CA +3519901696,3519934463,US 3519934464,3519938559,CA -3519938560,3520004095,US -3520020480,3520028671,CA -3520036864,3520344063,US -3520348160,3520356351,US -3520364544,3520368639,US -3520372736,3520393215,US -3520397312,3520405503,US -3520409600,3520454655,US +3519938560,3520020479,US +3520020480,3520020559,CA +3520020560,3520020567,US +3520020568,3520020655,CA +3520020656,3520020663,US +3520020664,3520020719,CA +3520020720,3520020727,US +3520020728,3520020983,CA +3520020984,3520021015,US +3520021016,3520021055,CA +3520021056,3520021071,US +3520021072,3520021183,CA +3520021184,3520021191,US +3520021192,3520021319,CA +3520021320,3520021359,US +3520021360,3520021383,CA +3520021384,3520021415,US +3520021416,3520021471,CA +3520021472,3520021479,US +3520021480,3520021487,CA +3520021488,3520021503,US +3520021504,3520021687,CA +3520021688,3520021695,US +3520021696,3520021839,CA +3520021840,3520021847,US +3520021848,3520021863,CA +3520021864,3520021871,US +3520021872,3520021895,CA +3520021896,3520021903,US +3520021904,3520021911,CA +3520021912,3520021935,US +3520021936,3520021943,CA +3520021944,3520021951,US +3520021952,3520021967,CA +3520021968,3520021975,US +3520021976,3520021983,CA +3520021984,3520021991,US +3520021992,3520021999,CA +3520022000,3520022007,US +3520022008,3520022015,CA +3520022016,3520022023,US +3520022024,3520022071,CA +3520022072,3520022087,US +3520022088,3520022143,CA +3520022144,3520022151,US +3520022152,3520022207,CA +3520022208,3520022215,US +3520022216,3520022271,CA +3520022272,3520022279,US +3520022280,3520022375,CA +3520022376,3520022383,US +3520022384,3520022391,CA +3520022392,3520022399,US +3520022400,3520022863,CA +3520022864,3520022871,US +3520022872,3520022927,CA +3520022928,3520022935,US +3520022936,3520023047,CA +3520023048,3520023063,US +3520023064,3520023087,CA +3520023088,3520023119,US +3520023120,3520023127,CA +3520023128,3520023135,US +3520023136,3520023151,CA +3520023152,3520023159,US +3520023160,3520023383,CA +3520023384,3520023415,US +3520023416,3520023647,CA +3520023648,3520023655,US +3520023656,3520023879,CA +3520023880,3520023887,US +3520023888,3520023911,CA +3520023912,3520023919,US +3520023920,3520024215,CA +3520024216,3520024231,US +3520024232,3520024487,CA +3520024488,3520024495,US +3520024496,3520024799,CA +3520024800,3520024815,US +3520024816,3520025191,CA +3520025192,3520025199,US +3520025200,3520025239,CA +3520025240,3520025247,US +3520025248,3520025295,CA +3520025296,3520025303,US +3520025304,3520025343,CA +3520025344,3520025359,US +3520025360,3520025503,CA +3520025504,3520025511,US +3520025512,3520025591,CA +3520025592,3520025599,NL +3520025600,3520025623,CA +3520025624,3520025631,US +3520025632,3520025639,CA +3520025640,3520025647,US +3520025648,3520025767,CA +3520025768,3520025775,US +3520025776,3520025791,CA +3520025792,3520025799,US +3520025800,3520026671,CA +3520026672,3520026679,US +3520026680,3520026719,CA +3520026720,3520026727,US +3520026728,3520026783,CA +3520026784,3520026791,US +3520026792,3520026895,CA +3520026896,3520026903,US +3520026904,3520026991,CA +3520026992,3520026999,US +3520027000,3520027047,CA +3520027048,3520027055,US +3520027056,3520027111,CA +3520027112,3520027119,US +3520027120,3520027231,CA +3520027232,3520027239,US +3520027240,3520027271,CA +3520027272,3520027279,US +3520027280,3520027439,CA +3520027440,3520027447,US +3520027448,3520027711,CA +3520027712,3520027727,US +3520027728,3520027783,CA +3520027784,3520027791,US +3520027792,3520027815,CA +3520027816,3520027823,US +3520027824,3520027839,CA +3520027840,3520027887,US +3520027888,3520027951,CA +3520027952,3520027991,US +3520027992,3520028047,CA +3520028048,3520028055,US +3520028056,3520028095,CA +3520028096,3520028103,US +3520028104,3520028191,CA +3520028192,3520028199,US +3520028200,3520028487,CA +3520028488,3520028535,US +3520028536,3520028543,CA +3520028544,3520028551,US +3520028552,3520028655,CA +3520028656,3520028671,US +3520028672,3520028687,CA +3520028688,3520028711,US +3520028712,3520029167,CA +3520029168,3520029175,IL +3520029176,3520030799,CA +3520030800,3520030807,US +3520030808,3520030951,CA +3520030952,3520030959,US +3520030960,3520030975,CA +3520030976,3520030983,NL +3520030984,3520031143,CA +3520031144,3520031151,US +3520031152,3520031527,CA +3520031528,3520031535,US +3520031536,3520031543,CA +3520031544,3520031551,US +3520031552,3520031607,CA +3520031608,3520031655,US +3520031656,3520032039,CA +3520032040,3520032087,US +3520032088,3520032103,CA +3520032104,3520032111,US +3520032112,3520032119,CA +3520032120,3520032127,US +3520032128,3520032159,CA +3520032160,3520032191,US +3520032192,3520032199,CA +3520032200,3520032223,US +3520032224,3520032303,CA +3520032304,3520032311,US +3520032312,3520032399,CA +3520032400,3520032407,US +3520032408,3520032591,CA +3520032592,3520032599,US +3520032600,3520032687,CA +3520032688,3520032711,US +3520032712,3520032735,CA +3520032736,3520032759,US +3520032760,3520032767,CA +3520032768,3520032791,US +3520032792,3520032807,CA +3520032808,3520032847,US +3520032848,3520032855,CA +3520032856,3520032863,US +3520032864,3520033031,CA +3520033032,3520033047,US +3520033048,3520033055,CA +3520033056,3520033063,US +3520033064,3520033135,CA +3520033136,3520033159,US +3520033160,3520033391,CA +3520033392,3520033407,US +3520033408,3520033583,CA +3520033584,3520033591,US +3520033592,3520033631,CA +3520033632,3520033639,US +3520033640,3520033671,CA +3520033672,3520033679,US +3520033680,3520033695,CA +3520033696,3520033703,US +3520033704,3520033759,CA +3520033760,3520033767,US +3520033768,3520034151,CA +3520034152,3520034159,US +3520034160,3520034167,CA +3520034168,3520034175,US +3520034176,3520034263,CA +3520034264,3520034271,US +3520034272,3520034487,CA +3520034488,3520034495,US +3520034496,3520034559,CA +3520034560,3520034567,US +3520034568,3520034623,CA +3520034624,3520034639,US +3520034640,3520034647,GH +3520034648,3520034663,CA +3520034664,3520034751,US +3520034752,3520034775,CA +3520034776,3520034791,US +3520034792,3520034951,CA +3520034952,3520034959,US +3520034960,3520035055,CA +3520035056,3520035071,US +3520035072,3520035135,CA +3520035136,3520035263,US +3520035264,3520035279,CA +3520035280,3520035287,US +3520035288,3520035327,CA +3520035328,3520035335,US +3520035336,3520035487,CA +3520035488,3520035503,US +3520035504,3520035519,CA +3520035520,3520035543,US +3520035544,3520035583,CA +3520035584,3520035631,US +3520035632,3520036191,CA +3520036192,3520036199,US +3520036200,3520036255,CA +3520036256,3520036271,US +3520036272,3520036287,CA +3520036288,3520036295,US +3520036296,3520036327,CA +3520036328,3520036343,US +3520036344,3520036351,CA +3520036352,3520036359,US +3520036360,3520036863,CA +3520036864,3520071823,US +3520071824,3520071839,NL +3520071840,3520073967,US +3520073968,3520073975,CA +3520073976,3520074671,US +3520074672,3520074687,GB +3520074688,3520074783,US +3520074784,3520074815,NL +3520074816,3520074847,US +3520074848,3520074863,GB +3520074864,3520075311,US +3520075312,3520075327,BR +3520075328,3520075455,US +3520075456,3520075471,CA +3520075472,3520075743,US +3520075744,3520075775,NL +3520075776,3520078911,US +3520078912,3520078927,AU +3520078928,3520078943,EC +3520078944,3520081455,US +3520081456,3520081471,BR +3520081472,3520081743,US +3520081744,3520081759,VG +3520081760,3520082151,US +3520082152,3520082167,CA +3520082168,3520086271,US +3520086272,3520086527,CA +3520086528,3520086959,US +3520086960,3520086975,CA +3520086976,3520088447,US +3520088448,3520088463,ES +3520088464,3520092991,US +3520092992,3520093007,IL +3520093008,3520095455,US +3520095456,3520095471,NL +3520095472,3520097135,US +3520097136,3520097151,CA +3520097152,3520097791,US +3520097792,3520098047,CA +3520098048,3520100031,US +3520100032,3520100039,LB +3520100040,3520101839,US +3520101840,3520101855,CA +3520101856,3520112975,US +3520112976,3520112991,ES +3520112992,3520114399,US +3520114400,3520114407,VG +3520114408,3520121519,US +3520121520,3520121535,GB +3520121536,3520356351,US +3520356352,3520364543,ZA +3520364544,3520450943,US +3520450944,3520450959,GB +3520450960,3520454655,US 3520454656,3520462847,CA -3520462848,3520622591,US +3520462848,3520527871,US +3520527872,3520528383,A2 +3520528384,3520626687,US 3520626688,3520634879,CA 3520634880,3520675839,US -3520675840,3520692223,CA +3520675840,3520675991,CA +3520675992,3520675999,US +3520676000,3520679439,CA +3520679440,3520679447,US +3520679448,3520683247,CA +3520683248,3520683263,US +3520683264,3520683743,CA +3520683744,3520683759,US +3520683760,3520684407,CA +3520684408,3520684415,US +3520684416,3520688399,CA +3520688400,3520688431,US +3520688432,3520689799,CA +3520689800,3520689807,US +3520689808,3520691583,CA +3520691584,3520691591,US +3520691592,3520691807,CA +3520691808,3520691839,US +3520691840,3520692223,CA 3520692224,3520749871,US 3520749872,3520749879,CA 3520749880,3520937983,US 3520937984,3520954367,CA -3520954368,3520999423,US +3520954368,3520956155,US +3520956156,3520956159,CH +3520956160,3520958783,US +3520958784,3520958847,CA +3520958848,3520966111,US +3520966112,3520966119,CA +3520966120,3520978943,US +3520978944,3520979711,BZ +3520979712,3520999423,US 3520999424,3521003519,CA -3521003520,3521011711,US -3521019904,3521028095,US +3521003520,3521007103,US +3521007104,3521007111,IN +3521007112,3521011743,US +3521011744,3521011751,PK +3521011752,3521011759,GB +3521011760,3521011791,US +3521011792,3521011799,CA +3521011800,3521011967,US +3521011968,3521011975,IL +3521011976,3521013559,US +3521013560,3521013567,GB +3521013568,3521013951,US +3521013952,3521013959,AU +3521013960,3521014103,US +3521014104,3521014111,NL +3521014112,3521014127,US +3521014128,3521014135,GR +3521014136,3521014143,CA +3521014144,3521028095,US 3521028096,3521032191,CA -3521036288,3521044479,US +3521032192,3521044479,US 3521044480,3521048575,CA -3521048576,3521074735,US +3521048576,3521049599,US +3521052672,3521074687,US +3521074688,3521074695,CA +3521074696,3521074735,US 3521074736,3521074751,AU 3521074752,3521086207,US 3521086208,3521086463,AU @@ -66783,26 +111420,118 @@ 3521186624,3521186687,AR 3521186688,3521192703,US 3521192704,3521192735,FR -3521192736,3521249279,US +3521192736,3521196287,US +3521196288,3521196543,AR +3521196544,3521199103,US +3521199104,3521199167,CA +3521199168,3521199215,US +3521199216,3521199223,CA +3521199224,3521199231,US +3521199232,3521199239,CA +3521199240,3521249279,US 3521249280,3521314815,CA -3521314816,3521781759,US -3521789952,3521904639,US -3521921024,3522101247,US +3521314816,3521364735,US +3521364736,3521364815,IT +3521364816,3521366783,US +3521366784,3521367039,CY +3521367040,3521371423,US +3521371424,3521371455,IT +3521371456,3521371463,US +3521371464,3521371495,IT +3521371496,3521371647,US +3521371648,3521371679,CA +3521371680,3521371711,US +3521371712,3521371759,CA +3521371760,3521371903,US +3521371904,3521371911,IT +3521371912,3521371919,US +3521371920,3521371983,IT +3521371984,3521371999,US +3521372000,3521372031,IT +3521372032,3521372063,US +3521372064,3521372079,IN +3521372080,3521372095,IT +3521372096,3521372159,CA +3521372160,3521377407,US +3521377408,3521377439,IT +3521377440,3521835903,US +3521835904,3521835967,CA +3521835968,3521836351,US +3521836352,3521836415,IL +3521836416,3521836503,US +3521836504,3521836511,IL +3521836512,3521836687,US +3521836688,3521836703,CA +3521836704,3521904639,US +3521904640,3521921023,JM +3521921024,3521965055,US +3521965056,3521966079,DE +3521966080,3522029439,US +3522029440,3522029503,FI +3522029504,3522029567,CA +3522029568,3522029823,US +3522029824,3522029855,A1 +3522029856,3522031871,US +3522031872,3522032127,AT +3522032128,3522034447,US +3522034448,3522034463,GB +3522034464,3522101247,US 3522101248,3522109439,CA -3522109440,3522121983,US +3522109440,3522117631,US +3522117632,3522121983,A2 3522121984,3522122239,AW -3522122240,3522129919,US -3522142208,3522174975,US +3522122240,3522125823,A2 +3522125824,3522131455,US +3522131456,3522131487,PE +3522131488,3522131519,RS +3522131520,3522131711,US +3522131712,3522131743,GB +3522131744,3522131775,DE +3522131776,3522131807,BR +3522131808,3522132479,US +3522132480,3522132543,CO +3522132544,3522132575,US +3522132576,3522132607,UA +3522132608,3522132639,CA +3522132640,3522132671,PE +3522132672,3522132703,BR +3522132704,3522132735,LK +3522132736,3522132767,US +3522132768,3522132799,RO +3522132800,3522133567,US +3522133568,3522133568,PT +3522133569,3522133599,US +3522133600,3522133631,JP +3522133632,3522133639,US +3522133640,3522133647,DE +3522133648,3522133663,US +3522133664,3522133695,DE +3522133696,3522133759,US +3522133760,3522133791,IR +3522133792,3522133823,DE +3522133824,3522174975,US 3522174976,3522179071,BM -3522179072,3522181119,US -3522183168,3522195455,US +3522179072,3522195455,US 3522195456,3522199551,CA -3522199552,3522854911,US -3522854912,3522871295,CA -3522871296,3522880511,US -3522880512,3522881023,GB -3522881024,3522893823,US -3522895872,3523215359,US +3522199552,3522759591,US +3522759592,3522759599,CA +3522759600,3522763263,US +3522763264,3522763519,CA +3522763520,3522768895,US +3522768896,3522769151,CA +3522769152,3522769919,US +3522769920,3522770175,CA +3522770176,3522807807,US +3522807808,3522807815,JP +3522807816,3522820863,US +3522820864,3522821119,CA +3522821120,3522854911,US +3522854912,3522859999,CA +3522860000,3522860031,IN +3522860032,3522871295,CA +3522871296,3522937855,US +3522937856,3522938367,GB +3522938368,3523215359,US 3523215360,3523223551,AU 3523223552,3523231743,KR 3523231744,3523248127,AU @@ -66810,11 +111539,11 @@ 3523280896,3523297279,TH 3523297280,3523317759,PH 3523317760,3523330047,JP -3523330048,3523342335,AU +3523330048,3523338239,AU +3523340288,3523341311,AP 3523342336,3523346431,BD 3523346432,3523354623,CN 3523354624,3523362815,KR -3523362816,3523379199,JP 3523379200,3523395583,PK 3523395584,3523411967,JP 3523411968,3523477503,HK @@ -66831,11 +111560,10 @@ 3523534848,3523538943,AU 3523538944,3523543039,JP 3523543040,3523551231,CN -3523551232,3523555327,AU +3523551232,3523553279,AU +3523553280,3523555327,MY 3523555328,3523557375,NZ -3523557376,3523559423,AU -3523559424,3523575807,PH -3523575808,3523579903,AU +3523557376,3523575807,PH 3523579904,3523583999,CN 3523584000,3523592479,HK 3523592480,3523592495,YE @@ -66948,7 +111676,9 @@ 3523604992,3523605503,AE 3523605504,3523606015,HK 3523606016,3523606527,AE -3523606528,3523608319,HK +3523606528,3523606783,AU +3523606784,3523607039,HK +3523607040,3523608319,AU 3523608320,3523608575,QA 3523608576,3523674111,HK 3523674112,3523682303,FJ @@ -66956,57 +111686,78 @@ 3523686400,3523690495,AU 3523690496,3523698687,IN 3523698688,3523698863,HK -3523698864,3523698879,AU +3523698864,3523698879,AP 3523698880,3523698943,HK -3523698944,3523698975,AU +3523698944,3523698975,AP 3523698976,3523699007,HK -3523699008,3523699071,AU +3523699008,3523699071,AP 3523699072,3523699199,HK 3523699200,3523699711,US -3523699712,3523700223,AU +3523699712,3523700223,AP 3523700224,3523700287,US -3523700288,3523700351,AU +3523700288,3523700351,AP 3523700352,3523700415,US -3523700416,3523700671,AU +3523700416,3523700671,AP 3523700672,3523700679,HK -3523700680,3523700735,AU +3523700680,3523700735,AP 3523700736,3523701759,HK -3523701760,3523702783,AU +3523701760,3523702783,AP 3523702784,3523702799,SG 3523702800,3523702807,SN 3523702808,3523702847,SG -3523702848,3523702871,AU +3523702848,3523702871,AP 3523702872,3523702911,SG -3523702912,3523703039,AU +3523702912,3523703039,AP 3523703040,3523703103,SG -3523703104,3523704703,AU +3523703104,3523704703,AP 3523704704,3523704719,SG -3523704720,3523704751,AU +3523704720,3523704751,AP 3523704752,3523704783,SG -3523704784,3523704791,AU +3523704784,3523704791,AP 3523704792,3523704831,SG 3523704832,3523704839,HK -3523704840,3523707135,AU +3523704840,3523706879,AP +3523706880,3523707039,AU +3523707040,3523707071,AP +3523707072,3523707103,AU +3523707104,3523707119,AP +3523707120,3523707135,AU 3523707136,3523707903,GB -3523707904,3523713279,AU +3523707904,3523708159,AU +3523708160,3523708287,AP +3523708288,3523708319,AU +3523708320,3523708351,AP +3523708352,3523708415,AU +3523708416,3523708927,AP +3523708928,3523708975,AU +3523708976,3523708991,AP +3523708992,3523709183,AU +3523709184,3523713023,AP +3523713024,3523713135,AU +3523713136,3523713279,AP 3523713280,3523713535,NL -3523713536,3523714943,AU +3523713536,3523714047,AP +3523714048,3523714719,AU +3523714720,3523714799,AP +3523714800,3523714943,AU 3523714944,3523715007,GB -3523715008,3523723263,AU +3523715008,3523715031,AP +3523715032,3523715071,AU +3523715072,3523723263,AP 3523723264,3523725311,US -3523725312,3523731455,AU +3523725312,3523731455,AP 3523731456,3523731503,JP -3523731504,3523731519,AU +3523731504,3523731519,AP 3523731520,3523731567,JP -3523731568,3523731583,AU +3523731568,3523731583,AP 3523731584,3523731615,JP -3523731616,3523737599,AU +3523731616,3523737599,AP 3523737600,3523738111,US -3523738112,3523739135,AU +3523738112,3523739135,AP 3523739136,3523739455,JP -3523739456,3523739519,AU +3523739456,3523739519,AP 3523739520,3523739551,JP -3523739552,3523739575,AU +3523739552,3523739575,AP 3523739576,3523739647,JP 3523739648,3524001791,AU 3524001792,3524132863,CN @@ -67045,11 +111796,12 @@ 3525300744,3526361087,CN 3526361088,3526393855,NZ 3526393856,3526395903,JP -3526395904,3526397951,AU +3526395904,3526397951,KH 3526397952,3526402047,MY 3526402048,3526410239,NZ 3526410240,3526414335,MY -3526414336,3526418431,AU +3526414336,3526416383,AU +3526416384,3526418431,MY 3526418432,3526426623,JP 3526426624,3526557695,AU 3526557696,3526754303,CN @@ -67074,14 +111826,17 @@ 3528396800,3528400895,AU 3528400896,3528404991,JP 3528404992,3528407039,NZ -3528407040,3528409087,AU 3528409088,3528425471,CN 3528425472,3528445951,JP 3528445952,3528450047,ID 3528450048,3528458239,CN -3528458240,3528464895,AU +3528458240,3528460575,AP +3528460576,3528460591,AU +3528460592,3528464895,AP 3528464896,3528465151,HK -3528465152,3528474623,AU +3528465152,3528470015,AP +3528470016,3528470271,AU +3528470272,3528474623,AP 3528474624,3528482815,TW 3528482816,3528491007,KR 3528491008,3528505007,AU @@ -67113,8 +111868,8 @@ 3529097216,3529113599,JP 3529113600,3531603967,KR 3531603968,3534749695,JP -3534749696,3534757887,HK -3534757888,3534757951,IN +3534749696,3534757919,HK +3534757920,3534757951,IN 3534757952,3534757983,HK 3534757984,3534761023,IN 3534761024,3534761119,HK @@ -67151,11 +111906,11 @@ 3536977920,3537010687,IN 3537010688,3537027071,ID 3537027072,3537043455,KR -3537043456,3537047551,AU 3537047552,3537049599,ID -3537049600,3537051647,AU -3537051648,3537057791,JP -3537057792,3537076223,AU +3537049600,3537051647,HK +3537051648,3537059839,JP +3537059840,3537068031,KR +3537068032,3537076223,VN 3537076224,3537174527,IN 3537174528,3537190911,TH 3537190912,3537240063,PH @@ -67185,10 +111940,20 @@ 3554544608,3554544639,DE 3554544640,3556769791,KR 3556769792,3556774399,DE +3556774400,3556786175,EU 3556786176,3556794367,RU 3556794368,3556795647,ES 3556795648,3556795679,IT -3556795680,3556802559,ES +3556795680,3556797767,ES +3556797768,3556797775,GB +3556797776,3556797839,ES +3556797840,3556797847,PT +3556797848,3556800079,ES +3556800080,3556800087,FR +3556800088,3556800799,ES +3556800800,3556800807,FR +3556800808,3556802559,ES +3556802560,3556810751,SD 3556810752,3556818943,PT 3556818944,3556827135,MD 3556827136,3556843519,NL @@ -67202,13 +111967,15 @@ 3556900864,3556909055,GB 3556909056,3556925439,DE 3556925440,3556933631,PL -3556933632,3556941823,IT +3556933632,3556941823,UA 3556941824,3556950015,IE 3556950016,3556958207,TR +3556958208,3556966399,KG 3556966400,3556974591,SE -3556974592,3556974863,US -3556974864,3556975103,GB -3556975104,3556982783,US +3556974592,3556982783,ES +3556982784,3556984623,DE +3556984624,3556984639,FR +3556984640,3556990975,DE 3556990976,3556999167,UA 3556999168,3557007359,RU 3557007360,3557015551,GB @@ -67217,29 +111984,33 @@ 3557023880,3557023903,GB 3557023904,3557023999,BE 3557024000,3557024255,GB -3557024256,3557024767,BE -3557024768,3557025791,GB +3557024256,3557025279,BE +3557025280,3557025791,GB 3557025792,3557026047,BE 3557026048,3557026303,GB 3557026304,3557026815,BE 3557026816,3557027071,GB 3557027072,3557027839,BE 3557027840,3557027863,GB -3557027864,3557028031,BE -3557028032,3557028047,GB -3557028048,3557028095,BE +3557027864,3557027871,BE +3557027872,3557027887,GB +3557027888,3557028031,BE +3557028032,3557028063,GB +3557028064,3557028095,BE 3557028096,3557028351,GB -3557028352,3557028735,BE +3557028352,3557028543,BE +3557028544,3557028607,GB +3557028608,3557028735,BE 3557028736,3557028799,GB -3557028800,3557028927,BE -3557028928,3557028935,GB -3557028936,3557028943,BE -3557028944,3557028959,GB -3557028960,3557029059,BE -3557029060,3557029087,GB -3557029088,3557029567,BE +3557028800,3557028911,BE +3557028912,3557028927,GB +3557028928,3557029059,BE +3557029060,3557029071,GB +3557029072,3557029567,BE 3557029568,3557029631,GB -3557029632,3557030079,BE +3557029632,3557029887,BE +3557029888,3557029951,GB +3557029952,3557030079,BE 3557030080,3557030143,GB 3557030144,3557030719,BE 3557030720,3557030751,GB @@ -67247,18 +112018,15 @@ 3557030768,3557030783,GB 3557030784,3557030975,BE 3557030976,3557031039,GB -3557031040,3557031423,BE -3557031424,3557031679,GB -3557031680,3557031807,BE +3557031040,3557031807,BE 3557031808,3557031935,GB 3557031936,3557033575,IT 3557033576,3557033583,GB -3557033584,3557034143,IT -3557034144,3557034175,GB -3557034176,3557040127,IT +3557033584,3557040127,IT 3557040128,3557048319,NO 3557048320,3557056511,CH 3557056512,3557064703,ES +3557064704,3557072895,CZ 3557072896,3557081087,DE 3557081088,3557086015,NL 3557086016,3557086047,DE @@ -67268,6 +112036,7 @@ 3557086784,3557086847,IT 3557086848,3557089279,NL 3557089280,3557105663,DE +3557105664,3557113855,BG 3557113856,3557130239,RU 3557130240,3557138431,BG 3557138432,3557146623,RU @@ -67280,68 +112049,197 @@ 3557173696,3557173703,AE 3557173704,3557173759,IT 3557173760,3557174015,IR -3557174016,3557174527,IQ +3557174016,3557174527,IT 3557174528,3557174783,IR 3557174784,3557175039,AE -3557175040,3557176127,IR -3557176128,3557176319,IT +3557175040,3557176063,IR +3557176064,3557176319,IT 3557176320,3557176619,NE 3557176620,3557176831,IT 3557176832,3557177023,IQ -3557177024,3557178367,IT -3557178368,3557179391,IR +3557177024,3557177199,IT +3557177200,3557177215,IR +3557177216,3557178367,IT +3557178368,3557179135,IR +3557179136,3557179391,IT 3557179392,3557213351,DE 3557213352,3557213359,US 3557213360,3557228543,DE 3557228544,3557236735,EE 3557236736,3557244927,ES 3557244928,3557253119,IT -3557253120,3557261311,AT +3557253120,3557261311,RU 3557261312,3557277695,DE -3557277696,3557285887,BG +3557277696,3557285887,PL 3557285888,3557294079,RU 3557294080,3557302271,DE 3557302272,3557310463,UA 3557310464,3557326847,ES 3557326848,3557335039,DE -3557335040,3557335343,BE -3557335360,3557335423,BE -3557335456,3557335935,BE -3557336000,3557336191,BE -3557336320,3557336575,BE +3557335040,3557335391,BE +3557335392,3557335455,EU +3557335456,3557335951,BE +3557335952,3557335967,LU +3557335968,3557336191,BE +3557336192,3557336255,EU +3557336256,3557336319,BE +3557336320,3557336575,EU +3557336576,3557336655,BE +3557336656,3557336703,EU +3557336704,3557336767,BE +3557336768,3557338111,EU 3557338112,3557338367,BE -3557338496,3557338591,BE -3557338608,3557339135,BE -3557339152,3557339175,BE +3557338368,3557338495,EU +3557338496,3557339175,BE +3557339176,3557339183,EU 3557339184,3557339199,BE +3557339200,3557339215,EU 3557339216,3557339223,BE +3557339224,3557339231,EU 3557339232,3557339267,BE +3557339268,3557339271,EU 3557339272,3557340159,BE +3557340160,3557340191,EU 3557340192,3557340927,BE -3557341184,3557341455,BE -3557341456,3557341471,GB -3557341472,3557341695,BE +3557340928,3557341183,EU +3557341184,3557341439,BE +3557341440,3557341487,EU +3557341488,3557341527,BE +3557341528,3557341535,EU +3557341536,3557341551,BE +3557341552,3557341559,EU +3557341560,3557341567,BE +3557341568,3557341663,EU +3557341664,3557341679,BE +3557341680,3557341951,EU 3557341952,3557342479,BE -3557342496,3557342543,BE +3557342480,3557342495,EU +3557342496,3557342511,BE +3557342512,3557342527,EU +3557342528,3557342543,BE +3557342544,3557342559,EU 3557342560,3557342623,BE +3557342624,3557342719,EU 3557342720,3557343231,BE 3557343232,3557351423,DE 3557351424,3557359615,RU -3557359616,3557365439,GB -3557365440,3557365503,JE -3557365504,3557367807,GB -3557367808,3557371391,DE -3557371392,3557371903,US -3557371904,3557375999,DE +3557359616,3557359743,GB +3557359744,3557359871,JE +3557359872,3557360055,GB +3557360056,3557360063,JE +3557360064,3557360406,GB +3557360407,3557360407,JE +3557360408,3557360415,GB +3557360416,3557360431,JE +3557360432,3557360471,GB +3557360472,3557360479,JE +3557360480,3557360495,GB +3557360496,3557360527,JE +3557360528,3557360535,GB +3557360536,3557360543,JE +3557360544,3557360559,GB +3557360560,3557360567,JE +3557360568,3557360623,GB +3557360624,3557360639,JE +3557360640,3557360680,GB +3557360681,3557360687,JE +3557360688,3557360807,GB +3557360808,3557360895,JE +3557360896,3557360927,GB +3557360928,3557360943,JE +3557360944,3557360959,GB +3557360960,3557360967,JE +3557360968,3557361055,GB +3557361056,3557361151,JE +3557361152,3557361159,GB +3557361160,3557361167,JE +3557361168,3557361183,GB +3557361184,3557361215,JE +3557361216,3557361247,GB +3557361248,3557361279,JE +3557361280,3557361375,GB +3557361376,3557361391,JE +3557361392,3557361415,GB +3557361416,3557361423,JE +3557361424,3557361607,GB +3557361608,3557361615,JE +3557361616,3557361919,GB +3557361920,3557361983,JE +3557361984,3557362047,GB +3557362048,3557362431,JE +3557362432,3557362687,GB +3557362688,3557363455,JE +3557363456,3557363471,GB +3557363472,3557363479,JE +3557363480,3557363655,GB +3557363656,3557363783,JE +3557363784,3557363791,GB +3557363792,3557364223,JE +3557364224,3557364479,GB +3557364480,3557364495,JE +3557364496,3557364527,GB +3557364528,3557364559,JE +3557364560,3557364587,GB +3557364588,3557364607,JE +3557364608,3557364631,GB +3557364632,3557364639,JE +3557364640,3557364703,GB +3557364704,3557364719,JE +3557364720,3557364727,GB +3557364728,3557364735,JE +3557364736,3557364751,GB +3557364752,3557364759,JE +3557364760,3557364791,GB +3557364792,3557364847,JE +3557364848,3557364895,GB +3557364896,3557364927,JE +3557364928,3557364959,GB +3557364960,3557364991,JE +3557364992,3557365055,GB +3557365056,3557365103,JE +3557365104,3557365111,GB +3557365112,3557365119,JE +3557365120,3557365183,GB +3557365184,3557365247,JE +3557365248,3557365407,GB +3557365408,3557365503,JE +3557365504,3557365511,GB +3557365512,3557365519,JE +3557365520,3557365551,GB +3557365552,3557365559,JE +3557365560,3557365631,GB +3557365632,3557365695,JE +3557365696,3557365847,GB +3557365848,3557365863,JE +3557365864,3557365887,GB +3557365888,3557365895,JE +3557365896,3557365911,GB +3557365912,3557365919,JE +3557365920,3557365935,GB +3557365936,3557366015,JE +3557366016,3557366055,GB +3557366056,3557366063,JE +3557366064,3557366111,GB +3557366112,3557366119,JE +3557366120,3557366263,GB +3557366264,3557366271,JE +3557366272,3557367807,GB +3557367808,3557375999,DE 3557376000,3557384191,ES 3557384192,3557392383,GB 3557392384,3557400575,AT -3557400576,3557408767,DE +3557400576,3557404703,DE +3557404704,3557404719,CH +3557404720,3557404735,DE +3557404736,3557404799,CH +3557404800,3557408767,DE 3557408768,3557416959,GB 3557416960,3557425151,UA 3557425152,3557490687,DK -3557490688,3557507071,FR -3557507072,3557515263,IT +3557490688,3557497431,FR +3557497432,3557497439,A2 +3557497440,3557507071,FR +3557507072,3557515263,GB 3557515264,3557523455,CZ 3557523456,3557531647,RU 3557531648,3557539839,SA @@ -67367,15 +112265,15 @@ 3557597184,3557597711,SA 3557597712,3557597719,AS 3557597720,3557605375,SA -3557621760,3557629951,IT +3557605376,3557613567,LT +3557613568,3557621759,EG +3557621760,3557629951,RU 3557629952,3557638143,PT 3557638144,3557646335,MK 3557646336,3557654527,RU 3557654528,3557670911,KZ 3557670912,3557679103,GB -3557679104,3557686271,SI -3557686272,3557686279,BA -3557686280,3557687295,SI +3557679104,3557687295,SI 3557687296,3557703679,PL 3557703680,3557711871,DE 3557711872,3557720063,ES @@ -67383,6 +112281,7 @@ 3557728256,3557744639,RU 3557744640,3557752831,PS 3557752832,3557761023,TR +3557761024,3557769215,RU 3557769216,3557777407,GB 3557777408,3557785599,RU 3557785600,3557793791,UA @@ -67401,7 +112300,7 @@ 3557892096,3557900287,IE 3557900288,3557916671,AT 3557916672,3557924863,NO -3557924864,3557933055,FI +3557924864,3557933055,AX 3557933056,3557941247,IT 3557941248,3557945183,DE 3557945184,3557945199,GB @@ -67418,7 +112317,10 @@ 3557998592,3558006783,DE 3558006784,3558014975,GB 3558014976,3558023167,RU -3558023168,3558031359,DE +3558023168,3558023199,GB +3558023200,3558030655,DE +3558030656,3558030659,CH +3558030660,3558031359,DE 3558031360,3558039551,GB 3558039552,3558047743,IT 3558047744,3558055935,KZ @@ -67428,22 +112330,37 @@ 3558067856,3558080511,NL 3558080512,3558096895,RU 3558096896,3558113279,CZ -3558113280,3558114767,DE -3558114768,3558114775,FR -3558114776,3558122767,DE +3558113280,3558122767,DE 3558122768,3558122783,CH 3558122784,3558129663,DE 3558129664,3558137855,NO -3558137856,3558154239,GB -3558154240,3558170623,DE +3558137856,3558146047,GB +3558146048,3558154239,RU +3558154240,3558154367,NG +3558154368,3558154495,SD +3558154496,3558154623,MZ +3558154624,3558154751,CI +3558154752,3558154879,CM +3558154880,3558155007,SD +3558155008,3558155135,GB +3558155136,3558155263,SD +3558155264,3558155391,ET +3558155392,3558155519,GB +3558155520,3558156031,SD +3558156032,3558156032,GB +3558156033,3558156287,KG +3558156288,3558162431,GB +3558162432,3558170623,DE 3558170624,3558178815,GB 3558178816,3558187007,BG 3558187008,3558195199,DE 3558195200,3558195455,BE 3558195456,3558196031,ES -3558196032,3558196047,IT -3558196048,3558196063,ES -3558196064,3558196127,IT +3558196032,3558196035,IT +3558196036,3558196039,ES +3558196040,3558196047,IT +3558196048,3558196119,ES +3558196120,3558196127,IT 3558196128,3558196159,ES 3558196160,3558196167,IT 3558196168,3558196175,ES @@ -67451,13 +112368,11 @@ 3558196192,3558196199,ES 3558196200,3558196271,IT 3558196272,3558196351,ES -3558196352,3558196355,IT -3558196356,3558196359,ES -3558196360,3558196415,IT -3558196416,3558196479,ES -3558196480,3558196495,IT -3558196496,3558196527,ES -3558196528,3558196607,IT +3558196352,3558196359,IT +3558196360,3558196367,ES +3558196368,3558196415,IT +3558196416,3558196543,ES +3558196544,3558196607,IT 3558196608,3558196719,ES 3558196720,3558196727,IT 3558196728,3558196735,ES @@ -67468,6 +112383,8 @@ 3558227968,3558236159,RU 3558236160,3558244351,GB 3558244352,3558252543,IT +3558252544,3558260735,KE +3558260736,3558268927,UA 3558268928,3558269439,GB 3558269440,3558269951,GI 3558269952,3558270463,GB @@ -67481,7 +112398,9 @@ 3558285824,3558285951,GB 3558285952,3558286079,DE 3558286080,3558286591,GB -3558286592,3558286847,FR +3558286592,3558286655,FR +3558286656,3558286719,GB +3558286720,3558286847,FR 3558286848,3558287679,GB 3558287680,3558287743,BE 3558287744,3558287871,NL @@ -67493,13 +112412,12 @@ 3558288192,3558288255,SE 3558288256,3558288319,US 3558288320,3558288383,CH -3558288384,3558288431,US -3558288432,3558288447,GB +3558288384,3558288423,US +3558288424,3558288447,GB 3558288448,3558288483,US 3558288484,3558288487,GB -3558288488,3558288503,US -3558288504,3558288511,GB -3558288512,3558288639,US +3558288488,3558288495,GU +3558288496,3558288639,US 3558288640,3558288671,BE 3558288672,3558288687,DE 3558288688,3558288703,BE @@ -67512,24 +112430,28 @@ 3558289408,3558289663,NL 3558289664,3558289747,IT 3558289748,3558289751,GB -3558289752,3558289919,IT +3558289752,3558289775,IT +3558289776,3558289783,GB +3558289784,3558289919,IT 3558289920,3558290175,CZ 3558290176,3558290431,GB 3558290432,3558290575,BE 3558290576,3558290591,GB -3558290592,3558290623,BE +3558290592,3558290599,BE +3558290600,3558290615,GB +3558290616,3558290623,BE 3558290624,3558290655,GB 3558290656,3558290663,BE 3558290664,3558290671,GB -3558290672,3558290679,BE -3558290680,3558290687,GB -3558290688,3558290943,ES +3558290672,3558290687,BE +3558290688,3558290871,ES +3558290872,3558290879,GB +3558290880,3558290943,ES 3558290944,3558290959,DE 3558290960,3558290967,NL 3558290968,3558290975,GB 3558290976,3558290991,NL -3558290992,3558291007,DE -3558291008,3558291023,GB +3558290992,3558291023,DE 3558291024,3558291031,SE 3558291032,3558291135,DE 3558291136,3558291199,GB @@ -67539,23 +112461,49 @@ 3558291240,3558291247,GB 3558291248,3558291263,CH 3558291264,3558291279,AT -3558291280,3558291455,CH -3558291456,3558291903,GB -3558291904,3558291967,DE -3558291968,3558292223,GB +3558291280,3558291295,GB +3558291296,3558291455,CH +3558291456,3558292223,GB 3558292224,3558292287,SE 3558292288,3558292543,NL 3558292544,3558292607,GB 3558292608,3558292735,NL -3558292736,3558292863,GB -3558292864,3558292871,DE -3558292872,3558293503,NL +3558292736,3558292871,GB +3558292872,3558292879,NL +3558292880,3558292895,GB +3558292896,3558293087,NL +3558293088,3558293247,GB +3558293248,3558293503,NL 3558293504,3558301695,RU -3558301696,3558318079,DE +3558301696,3558310319,DE +3558310320,3558310327,CH +3558310328,3558310511,DE +3558310512,3558310519,CH +3558310520,3558312791,DE +3558312792,3558312799,CH +3558312800,3558318079,DE 3558318080,3558319889,FR 3558319890,3558319891,ES 3558319892,3558334463,FR -3558334464,3558342655,CH +3558334464,3558334935,CH +3558334936,3558334943,FR +3558334944,3558335499,CH +3558335500,3558335503,DE +3558335504,3558335511,CH +3558335512,3558335519,DE +3558335520,3558337515,CH +3558337516,3558337519,ES +3558337520,3558337783,CH +3558337784,3558337787,DE +3558337788,3558337789,CH +3558337790,3558337790,GB +3558337791,3558339359,CH +3558339360,3558339367,ES +3558339368,3558339699,CH +3558339700,3558339703,DE +3558339704,3558340039,CH +3558340040,3558340043,DE +3558340044,3558342655,CH 3558342656,3558350847,IT 3558350848,3558359039,RU 3558359040,3558367231,GB @@ -67582,25 +112530,31 @@ 3558368448,3558368479,DE 3558368480,3558368495,ES 3558368496,3558368511,US -3558368512,3558372351,AT +3558368512,3558369503,AT +3558369504,3558369519,FR +3558369520,3558372351,AT 3558372352,3558372607,BG 3558372608,3558372735,AT -3558372736,3558373119,ES -3558373120,3558375423,AT +3558372736,3558372863,ES +3558372864,3558375423,AT 3558375424,3558383615,CZ 3558383616,3558391807,HU 3558391808,3558399999,LU 3558400000,3558408191,SA -3558408192,3558416383,CH +3558408192,3558412095,CH +3558412096,3558412103,GB +3558412104,3558416383,CH 3558416384,3558424575,BG 3558424576,3558440959,IL -3558440960,3558449151,ES +3558440960,3558449151,SE 3558449152,3558457343,IT 3558457344,3558457407,BE 3558457408,3558457599,GB 3558457600,3558457727,FR 3558457728,3558465535,NL -3558465536,3558473727,GB +3558465536,3558468607,GB +3558468608,3558469119,US +3558469120,3558473727,GB 3558473728,3558506495,SA 3558506496,3558514687,UA 3558514688,3558522879,SK @@ -67610,9 +112564,7 @@ 3558543360,3558547455,DK 3558547456,3558555647,FR 3558555648,3558572031,AT -3558572032,3558579839,DE -3558579840,3558579871,GB -3558579872,3558580223,DE +3558572032,3558580223,DE 3558580224,3558581119,CH 3558581120,3558581151,DE 3558581152,3558581423,CH @@ -67624,7 +112576,7 @@ 3558596608,3558604799,EE 3558604800,3558612991,GB 3558612992,3558621183,DE -3558621184,3558629375,RU +3558621184,3558629375,MD 3558629376,3558637567,DE 3558637568,3558645759,CH 3558645760,3558653951,IT @@ -67635,22 +112587,169 @@ 3558703104,3558711295,IT 3558711296,3558719487,NL 3558719488,3558735871,IL -3558735872,3558744063,GB -3558744064,3558752255,GR +3558735872,3558736127,GB +3558736128,3558736639,GG +3558736640,3558737023,GB +3558737024,3558737151,GG +3558737152,3558737279,GB +3558737280,3558737919,GG +3558737920,3558738431,GB +3558738432,3558738687,GG +3558738688,3558738751,GB +3558738752,3558738943,GG +3558738944,3558738991,GB +3558738992,3558739007,GG +3558739008,3558739039,GB +3558739040,3558739055,GG +3558739056,3558739071,GB +3558739072,3558739087,GG +3558739088,3558739199,GB +3558739200,3558739231,GG +3558739232,3558739295,GB +3558739296,3558739711,GG +3558739712,3558739975,GB +3558739976,3558739983,GG +3558739984,3558740015,GB +3558740016,3558740023,GG +3558740024,3558740031,GB +3558740032,3558740039,GG +3558740040,3558740063,GB +3558740064,3558740079,GG +3558740080,3558740087,GB +3558740088,3558740095,GG +3558740096,3558740183,GB +3558740184,3558740199,GG +3558740200,3558740207,GB +3558740208,3558740215,GG +3558740216,3558740222,GB +3558740223,3558740223,GG +3558740224,3558740255,GB +3558740256,3558740271,GG +3558740272,3558740287,GB +3558740288,3558740295,GG +3558740296,3558740343,GB +3558740344,3558740351,GG +3558740352,3558740359,GB +3558740360,3558740367,GG +3558740368,3558740383,GB +3558740384,3558740607,GG +3558740608,3558740687,GB +3558740688,3558741255,GG +3558741256,3558741271,GB +3558741272,3558741279,GG +3558741280,3558741287,GB +3558741288,3558741295,GG +3558741296,3558741311,GB +3558741312,3558741335,GG +3558741336,3558741359,GB +3558741360,3558741367,GG +3558741368,3558741391,GB +3558741392,3558741399,GG +3558741400,3558741423,GB +3558741424,3558741431,GG +3558741432,3558741439,GB +3558741440,3558741447,GG +3558741448,3558741471,GB +3558741472,3558741487,GG +3558741488,3558741503,GB +3558741504,3558742015,GG +3558742016,3558742039,GB +3558742040,3558742047,GG +3558742048,3558742055,GB +3558742056,3558742071,GG +3558742072,3558742079,GB +3558742080,3558742087,GG +3558742088,3558742103,GB +3558742104,3558742135,GG +3558742136,3558742159,GB +3558742160,3558742191,GG +3558742192,3558742215,GB +3558742216,3558742223,GG +3558742224,3558742239,GB +3558742240,3558742247,GG +3558742248,3558742255,GB +3558742256,3558742527,GG +3558742528,3558742543,GB +3558742544,3558742551,GG +3558742552,3558742567,GB +3558742568,3558742583,GG +3558742584,3558742623,GB +3558742624,3558742631,GG +3558742632,3558742655,GB +3558742656,3558742663,GG +3558742664,3558742679,GB +3558742680,3558742695,GG +3558742696,3558742727,GB +3558742728,3558742735,GG +3558742736,3558742743,GB +3558742744,3558742751,GG +3558742752,3558742775,GB +3558742776,3558743039,GG +3558743040,3558743047,GB +3558743048,3558743051,GG +3558743052,3558743075,GB +3558743076,3558743091,GG +3558743092,3558743107,GB +3558743108,3558743111,GG +3558743112,3558743115,GB +3558743116,3558743119,GG +3558743120,3558743131,GB +3558743132,3558743135,GG +3558743136,3558743147,GB +3558743148,3558743151,GG +3558743152,3558743167,GB +3558743168,3558743171,GG +3558743172,3558743183,GB +3558743184,3558743191,GG +3558743192,3558743203,GB +3558743204,3558743207,GG +3558743208,3558743219,GB +3558743220,3558743223,GG +3558743224,3558743235,GB +3558743236,3558743239,GG +3558743240,3558743243,GB +3558743244,3558743255,GG +3558743256,3558743263,GB +3558743264,3558743295,GG +3558743296,3558743303,GB +3558743304,3558743311,GG +3558743312,3558743319,GB +3558743320,3558743327,GG +3558743328,3558743351,GB +3558743352,3558743359,GG +3558743360,3558743383,GB +3558743384,3558743391,GG +3558743392,3558743399,GB +3558743400,3558743407,GG +3558743408,3558743439,GB +3558743440,3558743447,GG +3558743448,3558743463,GB +3558743464,3558743495,GG +3558743496,3558743507,GB +3558743508,3558743511,GG +3558743512,3558743535,GB +3558743536,3558743551,GG +3558743552,3558743839,GB +3558743840,3558744063,GG +3558744064,3558752255,LB 3558752256,3558760447,SI 3558760448,3558768639,FR 3558768640,3558785023,RU 3558785024,3558801407,IS 3558801408,3558809599,TR 3558809600,3558817791,ES -3558817792,3558819167,AT -3558819168,3558819199,DE -3558819200,3558821791,AT -3558821792,3558821799,DE +3558817792,3558821655,AT +3558821656,3558821663,DE +3558821664,3558821795,AT +3558821796,3558821799,DE 3558821800,3558821823,AT 3558821824,3558821831,DE 3558821832,3558825983,AT -3558825984,3558832383,CY +3558825984,3558827807,CY +3558827808,3558827815,A2 +3558827816,3558828287,CY +3558828288,3558828303,A2 +3558828304,3558832383,CY 3558832384,3558832639,LB 3558832640,3558834175,CY 3558834176,3558842367,FR @@ -67661,26 +112760,19 @@ 3558851360,3558851391,GB 3558851392,3558851471,ES 3558851472,3558851479,NO -3558851480,3558851807,ES -3558851808,3558851815,PT -3558851816,3558851823,IR -3558851824,3558852095,ES -3558852096,3558852607,GB -3558852608,3558852863,DE -3558852864,3558853119,ES +3558851480,3558853119,ES 3558853120,3558853375,BE -3558853376,3558853383,DE -3558853384,3558853391,ES -3558853392,3558853407,DE +3558853376,3558853399,ES +3558853400,3558853407,DE 3558853408,3558853439,ES -3558853440,3558853467,DE +3558853440,3558853455,DE +3558853456,3558853463,ES +3558853464,3558853467,DE 3558853468,3558853503,ES 3558853504,3558853511,DE 3558853512,3558853535,ES 3558853536,3558853547,DE -3558853548,3558853615,ES -3558853616,3558853631,DE -3558853632,3558854655,ES +3558853548,3558854655,ES 3558854656,3558854911,US 3558854912,3558854975,ES 3558854976,3558855039,US @@ -67694,7 +112786,11 @@ 3558856576,3558856639,ES 3558856640,3558856703,NL 3558856704,3558858751,US -3558858752,3558866943,IT +3558858752,3558860967,IT +3558860968,3558860975,IE +3558860976,3558864695,IT +3558864696,3558864703,GB +3558864704,3558866943,IT 3558866944,3558899711,GB 3558899712,3558916095,SE 3558916096,3558924287,RU @@ -67705,137 +112801,209 @@ 3558957056,3558965247,PS 3558965248,3558973439,NO 3558973440,3558981631,SA +3558981632,3558989823,IR 3558989824,3558998015,RU 3558998016,3559006207,JO 3559006208,3559014399,RU -3559014400,3559022591,DE +3559014400,3559016191,DE +3559016192,3559016207,GB +3559016208,3559022591,DE 3559022592,3559030783,RU 3559030784,3559038720,ES 3559038721,3559038975,US 3559038976,3559047167,DE -3559047168,3559063551,IT +3559047168,3559055359,IT +3559055360,3559063551,AM 3559063552,3559079935,CH 3559079936,3559088127,JO -3559088128,3559088283,BE -3559088284,3559088287,GB -3559088288,3559088919,BE -3559088920,3559088927,GB -3559088928,3559089055,BE +3559088128,3559088263,BE +3559088264,3559088267,GB +3559088268,3559088307,BE +3559088308,3559088311,GB +3559088312,3559088343,BE +3559088344,3559088347,GB +3559088348,3559088367,BE +3559088368,3559088371,GB +3559088372,3559088375,BE +3559088376,3559088379,GB +3559088380,3559089023,BE +3559089024,3559089027,GB +3559089028,3559089055,BE 3559089056,3559089063,DE -3559089064,3559089143,BE -3559089144,3559089151,GB -3559089152,3559089159,BE -3559089160,3559089215,GB -3559089216,3559089279,BE -3559089280,3559089287,GB -3559089288,3559089295,BE -3559089296,3559089343,GB -3559089344,3559089563,BE -3559089564,3559089567,GB -3559089568,3559089607,BE +3559089064,3559089407,BE +3559089408,3559089411,GB +3559089412,3559089423,BE +3559089424,3559089427,GB +3559089428,3559089439,BE +3559089440,3559089443,GB +3559089444,3559089447,BE +3559089448,3559089451,GB +3559089452,3559089459,BE +3559089460,3559089467,GB +3559089468,3559089547,BE +3559089548,3559089551,GB +3559089552,3559089607,BE 3559089608,3559089611,GB -3559089612,3559089983,BE -3559089984,3559090071,GB +3559089612,3559089623,BE +3559089624,3559089627,GB +3559089628,3559089631,BE +3559089632,3559089639,FR +3559089640,3559089643,GB +3559089644,3559089655,BE +3559089656,3559089659,GB +3559089660,3559090071,BE 3559090072,3559090079,NL -3559090080,3559090191,GB -3559090192,3559090199,BE -3559090200,3559090207,GB -3559090208,3559090215,BE -3559090216,3559090239,GB -3559090240,3559090367,BE -3559090368,3559090399,GB -3559090400,3559090415,BE -3559090416,3559090431,GB -3559090432,3559090519,BE -3559090520,3559090527,GB -3559090528,3559090815,BE -3559090816,3559090823,GB -3559090824,3559090895,BE +3559090080,3559090439,BE +3559090440,3559090443,GB +3559090444,3559090463,BE +3559090464,3559090467,GB +3559090468,3559090483,BE +3559090484,3559090487,GB +3559090488,3559090587,BE +3559090588,3559090591,GB +3559090592,3559090751,BE +3559090752,3559090755,GB +3559090756,3559090775,BE +3559090776,3559090779,GB +3559090780,3559090803,BE +3559090804,3559090807,GB +3559090808,3559090863,BE +3559090864,3559090871,GB +3559090872,3559090895,BE 3559090896,3559090899,GB -3559090900,3559091047,BE -3559091048,3559091055,GB -3559091056,3559091131,BE -3559091132,3559091135,GB -3559091136,3559091239,BE -3559091240,3559091247,GB -3559091248,3559091327,BE -3559091328,3559091391,GB -3559091392,3559091399,BE -3559091400,3559091407,GB -3559091408,3559091423,BE +3559090900,3559090903,BE +3559090904,3559090907,GB +3559090908,3559090923,BE +3559090924,3559090927,GB +3559090928,3559091011,BE +3559091012,3559091015,GB +3559091016,3559091087,BE +3559091088,3559091091,GB +3559091092,3559091203,BE +3559091204,3559091207,GB +3559091208,3559091211,BE +3559091212,3559091215,GB +3559091216,3559091423,BE 3559091424,3559091427,GB 3559091428,3559091507,BE 3559091508,3559091511,GB -3559091512,3559091519,BE -3559091520,3559091535,GB -3559091536,3559091631,BE -3559091632,3559091635,GB -3559091636,3559091775,BE -3559091776,3559091783,GB -3559091784,3559091791,BE -3559091792,3559091807,GB -3559091808,3559091855,BE -3559091856,3559091871,GB -3559091872,3559092159,BE +3559091512,3559091535,BE +3559091536,3559091543,GB +3559091544,3559091571,BE +3559091572,3559091575,GB +3559091576,3559091591,BE +3559091592,3559091615,GB +3559091616,3559091631,BE +3559091632,3559091639,LU +3559091640,3559092159,BE 3559092160,3559092160,GB 3559092161,3559092222,BE 3559092223,3559092223,GB -3559092224,3559092239,BE -3559092240,3559092247,GB -3559092248,3559092287,BE -3559092288,3559092351,GB -3559092352,3559092367,BE -3559092368,3559092383,GB -3559092384,3559092447,BE -3559092448,3559092463,GB -3559092464,3559092471,BE -3559092472,3559092735,GB -3559092736,3559092783,BE -3559092784,3559092791,GB -3559092792,3559092879,BE -3559092880,3559092895,GB -3559092896,3559093083,BE +3559092224,3559092735,BE +3559092736,3559092739,GB +3559092740,3559092799,BE +3559092800,3559092803,GB +3559092804,3559092855,BE +3559092856,3559092863,GB +3559092864,3559092871,BE +3559092872,3559092895,GB +3559092896,3559092939,BE +3559092940,3559092943,GB +3559092944,3559092959,BE +3559092960,3559092975,GB +3559092976,3559092995,BE +3559092996,3559092999,GB +3559093000,3559093007,BE +3559093008,3559093015,GB +3559093016,3559093023,FR +3559093024,3559093063,BE +3559093064,3559093071,FR +3559093072,3559093075,BE +3559093076,3559093079,GB +3559093080,3559093083,BE 3559093084,3559093087,GB -3559093088,3559093311,BE -3559093312,3559093319,GB -3559093320,3559093351,BE -3559093352,3559093355,GB -3559093356,3559093567,BE -3559093568,3559093599,GB -3559093600,3559093671,BE -3559093672,3559093675,GB -3559093676,3559093679,BE -3559093680,3559093695,GB -3559093696,3559093703,BE -3559093704,3559093711,GB -3559093712,3559094071,BE -3559094072,3559094079,GB -3559094080,3559094415,BE -3559094416,3559094431,GB -3559094432,3559095119,BE -3559095120,3559095135,GB -3559095136,3559095263,BE -3559095264,3559095295,GB -3559095296,3559095351,BE -3559095352,3559095359,GB -3559095360,3559095495,BE -3559095496,3559095551,GB -3559095552,3559095575,BE -3559095576,3559095583,GB -3559095584,3559095591,BE +3559093088,3559093103,BE +3559093104,3559093119,FR +3559093120,3559093135,BE +3559093136,3559093159,FR +3559093160,3559093163,GB +3559093164,3559093167,BE +3559093168,3559093171,GB +3559093172,3559093195,BE +3559093196,3559093203,GB +3559093204,3559093215,BE +3559093216,3559093219,GB +3559093220,3559093239,BE +3559093240,3559093243,GB +3559093244,3559093567,BE +3559093568,3559093599,IT +3559093600,3559093687,BE +3559093688,3559093699,GB +3559093700,3559094019,BE +3559094020,3559094023,GB +3559094024,3559094031,BE +3559094032,3559094039,FR +3559094040,3559094047,BE +3559094048,3559094055,FR +3559094056,3559094083,BE +3559094084,3559094087,GB +3559094088,3559094095,FR +3559094096,3559094099,GB +3559094100,3559094103,BE +3559094104,3559094111,GB +3559094112,3559094143,BE +3559094144,3559094147,GB +3559094148,3559094151,BE +3559094152,3559094159,GB +3559094160,3559094175,BE +3559094176,3559094179,GB +3559094180,3559094183,BE +3559094184,3559094191,GB +3559094192,3559094211,BE +3559094212,3559094215,GB +3559094216,3559094219,BE +3559094220,3559094223,GB +3559094224,3559094231,BE +3559094232,3559094235,GB +3559094236,3559094239,BE +3559094240,3559094243,GB +3559094244,3559094247,BE +3559094248,3559094251,GB +3559094252,3559094319,BE +3559094320,3559094335,GB +3559094336,3559094423,BE +3559094424,3559094447,GB +3559094448,3559094527,BE +3559094528,3559095039,GB +3559095040,3559095055,BE +3559095056,3559095063,GB +3559095064,3559095167,BE +3559095168,3559095231,GB +3559095232,3559095263,BE +3559095264,3559095303,GB +3559095304,3559095439,BE +3559095440,3559095455,GB +3559095456,3559095487,BE +3559095488,3559095551,GB +3559095552,3559095591,BE 3559095592,3559095623,GB -3559095624,3559096087,BE -3559096088,3559096095,GB -3559096096,3559096103,BE -3559096104,3559096107,GB -3559096108,3559096123,BE +3559095624,3559095631,BE +3559095632,3559095647,GB +3559095648,3559095871,BE +3559095872,3559095887,GB +3559095888,3559095919,BE +3559095920,3559095927,GB +3559095928,3559096047,BE +3559096048,3559096063,GB +3559096064,3559096083,BE +3559096084,3559096095,GB +3559096096,3559096123,BE 3559096124,3559096127,GB -3559096128,3559096191,BE -3559096192,3559096223,GB +3559096128,3559096215,BE +3559096216,3559096223,NL 3559096224,3559096247,BE -3559096248,3559096251,GB -3559096252,3559096255,BE -3559096256,3559096319,GB +3559096248,3559096255,GB +3559096256,3559096319,BE 3559096320,3559103231,RO 3559103232,3559103487,GB 3559103488,3559104511,RO @@ -67845,17 +113013,57 @@ 3559129088,3559137279,BG 3559137280,3559145471,GB 3559145472,3559153663,ES -3559153664,3559177215,GB +3559153664,3559161855,GB +3559161856,3559161887,FR +3559161888,3559161919,GB +3559161920,3559161983,SE +3559161984,3559162047,GB +3559162048,3559162079,BE +3559162080,3559163903,GB +3559163904,3559163935,FR +3559163936,3559163999,GB +3559164000,3559164031,NL +3559164032,3559164087,GB +3559164088,3559164095,SE +3559164096,3559164151,GB +3559164152,3559164159,IT +3559164160,3559166335,GB +3559166336,3559166351,CH +3559166352,3559169023,GB +3559169024,3559169055,CH +3559169056,3559174703,GB +3559174704,3559174711,IT +3559174712,3559174743,GB +3559174744,3559174751,DE +3559174752,3559174767,GB +3559174768,3559174775,DE +3559174776,3559174783,GB +3559174784,3559174791,DK +3559174792,3559174799,GB +3559174800,3559174807,NO +3559174808,3559174943,GB +3559174944,3559174951,IT +3559174952,3559174975,GB +3559174976,3559174983,DE +3559174984,3559175071,GB +3559175072,3559175095,FR +3559175096,3559175127,GB +3559175128,3559175135,DE +3559175136,3559175143,FR +3559175144,3559175151,GB +3559175152,3559175167,FR +3559175168,3559177215,GB 3559177216,3559177471,DE 3559177472,3559177727,GB 3559177728,3559178239,DE 3559178240,3559186431,LB -3559186432,3559194623,DE +3559186432,3559194623,RU 3559194624,3559202815,SE 3559202816,3559211007,DE 3559211008,3559219199,GR 3559219200,3559227391,SE 3559227392,3559235583,DK +3559235584,3559243775,DE 3559243776,3559251967,FR 3559251968,3559260159,NO 3559260160,3559268351,DE @@ -67866,13 +113074,9 @@ 3559284912,3559288175,RU 3559288176,3559288191,UA 3559288192,3559288207,AZ -3559288208,3559288575,RU -3559288576,3559289855,AZ -3559289856,3559291391,RU -3559291392,3559291647,AZ -3559291648,3559291903,RU -3559291904,3559292159,AZ -3559292160,3559292927,RU +3559288208,3559288831,RU +3559288832,3559289855,AZ +3559289856,3559292927,RU 3559292928,3559301119,JO 3559301120,3559309311,GB 3559309312,3559317503,PL @@ -67888,9 +113092,7 @@ 3559374848,3559383039,AT 3559383040,3559391231,GB 3559391232,3559399423,CH -3559399424,3559406591,UA -3559406592,3559406847,DE -3559406848,3559407615,UA +3559399424,3559407615,UA 3559407616,3559423999,HU 3559424000,3559432191,LB 3559432192,3559440383,DE @@ -67900,35 +113102,38 @@ 3559473152,3559489535,CH 3559489536,3559490591,NL 3559490592,3559490623,DE -3559490624,3559490719,NL -3559490720,3559490751,ES -3559490752,3559490783,NL +3559490624,3559490687,NL +3559490688,3559490719,ES +3559490720,3559490751,NL +3559490752,3559490783,ES 3559490784,3559490791,CH 3559490792,3559490799,BE -3559490800,3559490815,ES -3559490816,3559491135,NL -3559491136,3559491167,ES -3559491168,3559491767,NL -3559491768,3559491771,ES -3559491772,3559491871,NL +3559490800,3559491135,NL +3559491136,3559491199,ES +3559491200,3559491327,NL +3559491328,3559491359,ES +3559491360,3559491439,NL +3559491440,3559491455,ES +3559491456,3559491647,NL +3559491648,3559491711,ES +3559491712,3559491839,NL +3559491840,3559491871,ES 3559491872,3559491903,GB -3559491904,3559491935,NL -3559491936,3559491967,ES -3559491968,3559492013,NL -3559492014,3559492015,ES -3559492016,3559492023,NL -3559492024,3559492031,ES +3559491904,3559491967,ES +3559491968,3559492003,NL +3559492004,3559492007,ES +3559492008,3559492013,NL +3559492014,3559492031,ES 3559492032,3559493151,NL -3559493152,3559493167,IT +3559493152,3559493167,ES 3559493168,3559493247,NL 3559493248,3559493279,ES 3559493280,3559493311,GB -3559493312,3559493343,ES -3559493344,3559493349,NL +3559493312,3559493349,NL 3559493350,3559493359,ES 3559493360,3559497727,NL 3559497728,3559505919,GB -3559505920,3559514111,IT +3559505920,3559514111,CH 3559514112,3559522303,AT 3559522304,3559530495,GB 3559530496,3559538687,RU @@ -67964,7 +113169,10 @@ 3559718912,3559727103,RU 3559727104,3559735295,NL 3559735296,3559743487,BG -3559743488,3559759871,IT +3559743488,3559745535,IT +3559745536,3559747583,DE +3559747584,3559751679,DK +3559751680,3559759871,IT 3559759872,3559768063,NO 3559768064,3559776255,CH 3559776256,3559792639,RU @@ -67982,16 +113190,95 @@ 3559877968,3559882751,LT 3559882752,3559890943,AZ 3559890944,3559899135,CH -3559899136,3559899911,EE -3559899912,3559899935,RU -3559899936,3559899959,EE +3559899136,3559899391,UA +3559899392,3559899395,EE +3559899396,3559899487,UA +3559899488,3559899519,EE +3559899520,3559899903,UA +3559899904,3559899907,EE +3559899908,3559899935,RU +3559899936,3559899951,UA +3559899952,3559899955,RU +3559899956,3559899959,UA 3559899960,3559899991,RU -3559899992,3559905139,EE +3559899992,3559900275,UA +3559900276,3559900279,EE +3559900280,3559900423,UA +3559900424,3559900432,EE +3559900433,3559900439,UA +3559900440,3559900447,EE +3559900448,3559900471,UA +3559900472,3559900479,EE +3559900480,3559900483,UA +3559900484,3559900487,EE +3559900488,3559900492,UA +3559900493,3559900493,EE +3559900494,3559900494,UA +3559900495,3559900495,EE +3559900496,3559900503,UA +3559900504,3559900511,EE +3559900512,3559900519,UA +3559900520,3559900523,EE +3559900524,3559900611,UA +3559900612,3559900624,EE +3559900625,3559900927,UA +3559900928,3559900951,EE +3559900952,3559900959,DE +3559900960,3559900975,SE +3559900976,3559900983,PL +3559900984,3559900991,GB +3559900992,3559901007,RU +3559901008,3559901183,UA +3559901184,3559902011,EE +3559902012,3559902015,UA +3559902016,3559902031,EE +3559902032,3559902047,UA +3559902048,3559902055,EE +3559902056,3559902071,UA +3559902072,3559902079,EE +3559902080,3559902175,UA +3559902176,3559902187,EE +3559902188,3559902191,UA +3559902192,3559902207,EE +3559902208,3559902623,UA +3559902624,3559902631,EE +3559902632,3559902975,UA +3559902976,3559903231,EE +3559903232,3559903743,UA +3559903744,3559904023,EE +3559904024,3559904255,UA +3559904256,3559904319,EE +3559904320,3559904607,UA +3559904608,3559904639,EE +3559904640,3559905019,UA +3559905020,3559905031,EE +3559905032,3559905055,UA +3559905056,3559905139,EE 3559905140,3559905143,DE -3559905144,3559907327,EE +3559905144,3559905151,UA +3559905152,3559905155,EE +3559905156,3559905159,UA +3559905160,3559905247,EE +3559905248,3559905255,UA +3559905256,3559905297,EE +3559905298,3559905299,UA +3559905300,3559905307,EE +3559905308,3559905535,UA +3559905536,3559905623,EE +3559905624,3559905631,UA +3559905632,3559905951,EE +3559905952,3559905983,UA +3559905984,3559906257,EE +3559906258,3559906263,UA +3559906264,3559906783,EE +3559906784,3559906815,UA +3559906816,3559906975,EE +3559906976,3559907071,UA +3559907072,3559907327,EE 3559907328,3559915519,FR 3559915520,3559923711,IT 3559923712,3559931903,RU +3559931904,3559940095,IL 3559940096,3559945471,DE 3559945472,3559945727,US 3559945728,3559948287,DE @@ -68000,15 +113287,15 @@ 3559956544,3559956551,NL 3559956552,3559957567,IT 3559957568,3559957599,NL -3559957600,3559964671,IT -3559964672,3559972863,RU -3559972864,3559981055,TR +3559957600,3559964159,IT +3559964160,3559964415,HU +3559964416,3559964671,IT +3559964672,3559981055,RU 3559981056,3559989247,EE -3559989248,3559997439,IT +3559989248,3559997439,PL +3559997440,3560005631,KE 3560005632,3560013823,RU -3560013824,3560022975,ES -3560022976,3560022991,IT -3560022992,3560030207,ES +3560013824,3560030207,ES 3560030208,3560046591,GB 3560046592,3560054783,BG 3560054784,3560062975,TR @@ -68028,15 +113315,15 @@ 3560177664,3560185855,NL 3560185856,3560194047,LT 3560194048,3560210431,IT +3560210432,3560218623,BF 3560218624,3560226815,HU 3560226816,3560235007,AT 3560235008,3560243199,DE 3560243200,3560247295,BE -3560247296,3560247999,NL -3560248000,3560251391,BE -3560251392,3560252519,RU -3560252520,3560252527,UA -3560252528,3560259583,RU +3560247296,3560251391,NL +3560251392,3560253439,RU +3560253440,3560253695,CZ +3560253696,3560259583,RU 3560259584,3560267775,GB 3560267776,3560275967,CH 3560275968,3560308735,DE @@ -68044,13 +113331,18 @@ 3560316928,3560325119,NL 3560325120,3560333311,DK 3560333312,3560341503,RO -3560341504,3560349695,PT 3560349696,3560357887,GB 3560357888,3560366079,GR -3560366080,3560374271,CH +3560366080,3560366687,CH +3560366688,3560366695,IT +3560366696,3560366703,CH +3560366704,3560366719,IT +3560366720,3560374271,CH 3560374272,3560382463,ES -3560382464,3560390655,FO -3560398848,3560407039,RU +3560382464,3560387103,FO +3560387104,3560387111,DK +3560387112,3560390655,FO +3560390656,3560407039,RU 3560407040,3560423423,PT 3560423424,3560431615,CH 3560431616,3560439807,SK @@ -68061,12 +113353,17 @@ 3560472576,3560480767,MT 3560480768,3560488959,IT 3560488960,3560497151,MD -3560497152,3560505343,LU +3560497152,3560501247,LU +3560501248,3560501503,EU +3560501504,3560505343,LU 3560505344,3560513535,TR -3560513536,3560521727,GB +3560513536,3560515583,SK +3560515584,3560517631,RS +3560517632,3560521727,NL 3560521728,3560529919,PT 3560529920,3560554495,RU -3560554496,3560570879,GB +3560554496,3560562687,SA +3560562688,3560570879,GB 3560570880,3560579071,TR 3560579072,3560587263,GB 3560587264,3560595455,DE @@ -68083,85 +113380,30 @@ 3560660992,3560669183,RU 3560669184,3560685567,CH 3560685568,3560693759,ES +3560693760,3560701951,PL 3560701952,3560710143,DE 3560710144,3560718335,CH +3560718336,3560726527,GM +3560726528,3560734719,DK 3560734720,3560742623,DE 3560742624,3560742631,GB 3560742632,3560742911,DE 3560742912,3560751103,AT 3560751104,3560767487,DE -3560767488,3560832791,NL +3560767488,3560832255,NL +3560832256,3560832511,GB +3560832512,3560832791,NL 3560832792,3560832799,BE 3560832800,3560833023,NL 3560833024,3560841215,GB -3560841216,3560841727,CS -3560841728,3560841855,RS -3560841856,3560842015,CS -3560842016,3560842047,RS -3560842048,3560842447,CS -3560842448,3560842455,CS -3560842456,3560842751,CS -3560842752,3560843007,RS -3560843008,3560843071,CS -3560843072,3560843135,RS -3560843136,3560844031,CS -3560844032,3560844223,RS -3560844224,3560844227,CS -3560844228,3560844287,RS -3560844288,3560844667,CS -3560844668,3560844671,RS -3560844672,3560844675,CS -3560844676,3560844679,RS -3560844680,3560844687,CS -3560844688,3560844735,RS -3560844736,3560844751,CS -3560844752,3560844759,RS -3560844760,3560844875,CS -3560844876,3560844879,RS -3560844880,3560844895,CS -3560844896,3560844899,RS -3560844900,3560844991,CS -3560844992,3560844995,RS -3560844996,3560844999,CS -3560845000,3560845007,RS -3560845008,3560845023,CS -3560845024,3560845055,RS -3560845056,3560845071,CS -3560845072,3560845103,RS -3560845104,3560845311,CS -3560845312,3560845327,CS -3560845328,3560845351,RS -3560845352,3560845407,CS -3560845408,3560845455,RS -3560845456,3560845535,CS -3560845536,3560845551,CS -3560845552,3560845567,CS -3560845568,3560845599,CS -3560845600,3560845631,RS -3560845632,3560845695,CS -3560845696,3560845703,CS -3560845704,3560845727,CS -3560845728,3560845743,CS -3560845744,3560845759,CS -3560845760,3560845763,RS -3560845764,3560846783,CS -3560846784,3560846815,CS -3560846816,3560846847,CS -3560846848,3560846863,RS -3560846864,3560846975,CS -3560846976,3560847103,RS -3560847104,3560847615,CS -3560847616,3560847871,RS -3560847872,3560848127,CS -3560848128,3560848255,CS -3560848256,3560848383,CS -3560848384,3560848655,RS -3560848656,3560848671,CS -3560848672,3560848679,RS -3560848680,3560848695,CS -3560848696,3560848895,RS -3560848896,3560849407,CS -3560849408,3560857599,DE +3560841216,3560849407,RS +3560849408,3560849663,DE +3560849664,3560849727,NL +3560849728,3560852911,DE +3560852912,3560852919,TH +3560852920,3560852959,DE +3560852960,3560852967,GB +3560852968,3560857599,DE 3560857600,3560865791,SA 3560865792,3560882175,FR 3560882176,3560890367,DE @@ -68172,7 +113414,7 @@ 3560916392,3560919047,DE 3560919048,3560919055,CH 3560919056,3560923135,DE -3560923136,3560931327,IT +3560923136,3560931327,ES 3560931328,3560939523,DE 3560939524,3560939527,AT 3560939528,3560939535,DE @@ -68180,8 +113422,7 @@ 3560939540,3560939543,IT 3560939544,3560939555,DE 3560939556,3560939559,ES -3560939560,3560939563,DE -3560939564,3560939567,IT +3560939560,3560939567,DE 3560939568,3560939571,NL 3560939572,3560939579,ES 3560939580,3560939583,BE @@ -68189,8 +113430,7 @@ 3560939588,3560939591,BE 3560939592,3560939607,DE 3560939608,3560939611,IT -3560939612,3560939623,DE -3560939624,3560939627,NL +3560939612,3560939627,DE 3560939628,3560939631,CH 3560939632,3560939643,DE 3560939644,3560939647,BE @@ -68217,8 +113457,7 @@ 3560939768,3560939771,IE 3560939772,3560939775,CZ 3560939776,3560939779,BE -3560939780,3560939783,DK -3560939784,3560939791,DE +3560939780,3560939791,DE 3560939792,3560939795,FR 3560939796,3560939799,GB 3560939800,3560939803,DE @@ -68256,8 +113495,7 @@ 3560939944,3560939951,FR 3560939952,3560939955,DE 3560939956,3560939959,AT -3560939960,3560939963,CH -3560939964,3560939967,DE +3560939960,3560939967,DE 3560939968,3560939971,ES 3560939972,3560939975,DE 3560939976,3560939983,BE @@ -68428,8 +113666,7 @@ 3560940820,3560940823,NL 3560940824,3560940827,IT 3560940828,3560940831,ES -3560940832,3560940835,DE -3560940836,3560940839,FR +3560940832,3560940839,DE 3560940840,3560940843,IT 3560940844,3560940851,ES 3560940852,3560940859,DE @@ -68540,8 +113777,7 @@ 3560941348,3560941351,IE 3560941352,3560941355,NL 3560941356,3560941359,ES -3560941360,3560941363,DE -3560941364,3560941367,SG +3560941360,3560941367,DE 3560941368,3560941371,DK 3560941372,3560941379,DE 3560941380,3560941383,CH @@ -68585,9 +113821,7 @@ 3560941556,3560941559,DE 3560941560,3560941563,GB 3560941564,3560941567,GR -3560941568,3560941571,DE -3560941572,3560941575,GB -3560941576,3560941587,DE +3560941568,3560941587,DE 3560941588,3560941591,ES 3560941592,3560941599,DE 3560941600,3560941603,FR @@ -68637,8 +113871,7 @@ 3560941824,3560941827,DE 3560941828,3560941831,ES 3560941832,3560941835,GB -3560941836,3560941839,DE -3560941840,3560941843,GB +3560941836,3560941843,DE 3560941844,3560941847,IT 3560941848,3560941851,BE 3560941852,3560941855,CH @@ -68769,7 +114002,7 @@ 3560942484,3560942487,HU 3560942488,3560942495,FR 3560942496,3560942499,ES -3560942500,3560942503,FR +3560942500,3560942503,DE 3560942504,3560942511,ES 3560942512,3560942515,IT 3560942516,3560942523,DE @@ -68790,8 +114023,7 @@ 3560942588,3560942590,ES 3560942591,3560942599,DE 3560942600,3560942603,DK -3560942604,3560942607,LU -3560942608,3560942619,DE +3560942604,3560942619,DE 3560942620,3560942623,BE 3560942624,3560942627,IT 3560942628,3560942631,GB @@ -68822,7 +114054,7 @@ 3560942744,3560942751,GB 3560942752,3560942763,DE 3560942764,3560942767,FR -3560942768,3560942771,NL +3560942768,3560942771,DE 3560942772,3560942775,ES 3560942776,3560942779,DE 3560942780,3560942783,CH @@ -68856,8 +114088,7 @@ 3560942896,3560942899,ES 3560942900,3560942903,DE 3560942904,3560942907,CH -3560942908,3560942911,DE -3560942912,3560942915,ES +3560942908,3560942915,DE 3560942916,3560942919,BE 3560942920,3560942923,DE 3560942924,3560942927,IT @@ -68871,7 +114102,8 @@ 3560942960,3560942963,GB 3560942964,3560942975,DE 3560942976,3560942979,IT -3560942980,3560942987,DE +3560942980,3560942983,DE +3560942984,3560942987,BE 3560942988,3560942999,IT 3560943000,3560943003,PL 3560943004,3560943007,DK @@ -68966,7 +114198,7 @@ 3560943200,3560943200,AT 3560943201,3560943201,IT 3560943202,3560943202,IL -3560943203,3560943203,FR +3560943203,3560943203,DE 3560943204,3560943204,CH 3560943205,3560943205,IT 3560943206,3560943207,DE @@ -69055,7 +114287,7 @@ 3560943308,3560943309,DE 3560943310,3560943311,IT 3560943312,3560943312,PL -3560943313,3560943313,FR +3560943313,3560943313,DE 3560943314,3560943314,ES 3560943315,3560943315,IT 3560943316,3560943316,GB @@ -69097,7 +114329,7 @@ 3560943362,3560943362,GB 3560943363,3560943365,DE 3560943366,3560943367,IT -3560943368,3560943368,GB +3560943368,3560943368,DE 3560943369,3560943369,GR 3560943370,3560943370,DE 3560943371,3560943371,AT @@ -69152,7 +114384,7 @@ 3560943431,3560943432,DE 3560943433,3560943433,GB 3560943434,3560943434,SE -3560943435,3560943435,NL +3560943435,3560943435,DE 3560943436,3560943436,FR 3560943437,3560943437,ES 3560943438,3560943438,FR @@ -69182,8 +114414,7 @@ 3560943467,3560943467,IT 3560943468,3560943468,CH 3560943469,3560943469,IT -3560943470,3560943470,DE -3560943471,3560943471,GB +3560943470,3560943471,DE 3560943472,3560943472,BE 3560943473,3560943473,AT 3560943474,3560943474,CH @@ -69472,12 +114703,11 @@ 3560943829,3560943829,NL 3560943830,3560943830,DK 3560943831,3560943833,FR -3560943834,3560943835,DE -3560943836,3560943836,BE +3560943834,3560943836,DE 3560943837,3560943837,CH 3560943838,3560943838,DE 3560943839,3560943839,NO -3560943840,3560943840,LU +3560943840,3560943840,DE 3560943841,3560943841,GB 3560943842,3560943842,DE 3560943843,3560943843,GB @@ -69534,7 +114764,9 @@ 3560944088,3560944103,DE 3560944104,3560944107,US 3560944108,3560944119,DE -3560944120,3560944159,US +3560944120,3560944135,US +3560944136,3560944139,DE +3560944140,3560944159,US 3560944160,3560944163,MX 3560944164,3560944167,AR 3560944168,3560944175,US @@ -69914,11 +115146,14 @@ 3560946235,3560946235,CL 3560946236,3560946237,US 3560946238,3560946238,AR -3560946239,3560946253,US +3560946239,3560946246,US +3560946247,3560946247,PR +3560946248,3560946253,US 3560946254,3560946254,SG 3560946255,3560946256,US 3560946257,3560946257,MX -3560946258,3560946259,US +3560946258,3560946258,US +3560946259,3560946259,VI 3560946260,3560946260,AR 3560946261,3560946262,US 3560946263,3560946263,AR @@ -69976,7 +115211,7 @@ 3560946376,3560946398,DE 3560946399,3560946399,US 3560946400,3560946408,DE -3560946409,3560946409,US +3560946409,3560946409,PR 3560946410,3560946419,DE 3560946420,3560946420,US 3560946421,3560946431,DE @@ -69986,7 +115221,8 @@ 3560946452,3560946455,BO 3560946456,3560946467,US 3560946468,3560946471,BR -3560946472,3560946483,US +3560946472,3560946475,GU +3560946476,3560946483,US 3560946484,3560946487,MX 3560946488,3560946491,US 3560946492,3560946495,BR @@ -70075,7 +115311,9 @@ 3560946988,3560946991,US 3560946992,3560946995,DE 3560946996,3560946999,UY -3560947000,3560947015,US +3560947000,3560947007,US +3560947008,3560947011,PR +3560947012,3560947015,US 3560947016,3560947019,AR 3560947020,3560947027,US 3560947028,3560947031,CO @@ -70084,7 +115322,9 @@ 3560947044,3560947067,US 3560947068,3560947071,AR 3560947072,3560947075,BR -3560947076,3560947095,US +3560947076,3560947087,US +3560947088,3560947091,PR +3560947092,3560947095,US 3560947096,3560947099,MX 3560947100,3560947107,US 3560947108,3560947111,DE @@ -70092,7 +115332,10 @@ 3560947124,3560947127,CO 3560947128,3560947143,US 3560947144,3560947147,DE -3560947148,3560947191,US +3560947148,3560947151,PR +3560947152,3560947159,US +3560947160,3560947163,PR +3560947164,3560947191,US 3560947192,3560947195,VE 3560947196,3560947199,DE 3560947200,3560947203,CA @@ -70138,19 +115381,97 @@ 3560947500,3560947686,JP 3560947687,3560947687,DE 3560947688,3560947711,JP -3560947712,3560955903,SE -3560955904,3560958207,BE -3560958208,3560959999,BR -3560960000,3560964095,BE +3560947712,3560950863,SE +3560950864,3560950867,DK +3560950868,3560950871,ES +3560950872,3560950956,SE +3560950957,3560950958,PL +3560950959,3560951027,SE +3560951028,3560951031,DK +3560951032,3560951039,SE +3560951040,3560951043,NO +3560951044,3560951088,SE +3560951089,3560951090,PL +3560951091,3560951091,SE +3560951092,3560951095,IT +3560951096,3560951103,SE +3560951104,3560951107,DE +3560951108,3560951111,DK +3560951112,3560951115,FR +3560951116,3560951195,SE +3560951196,3560951199,DK +3560951200,3560951207,SE +3560951208,3560951211,DK +3560951212,3560951307,SE +3560951308,3560951311,IT +3560951312,3560951376,SE +3560951377,3560951378,PL +3560951379,3560951380,SE +3560951381,3560951382,FI +3560951383,3560951383,SE +3560951384,3560951387,NO +3560951388,3560951388,SE +3560951389,3560951390,PT +3560951391,3560951391,SE +3560951392,3560951395,IT +3560951396,3560951399,DE +3560951400,3560951403,SE +3560951404,3560951407,NO +3560951408,3560951423,SE +3560951424,3560951427,NL +3560951428,3560951431,DK +3560951432,3560951440,SE +3560951441,3560951442,JP +3560951443,3560951444,SE +3560951445,3560951446,HU +3560951447,3560951447,SE +3560951448,3560951451,FR +3560951452,3560951551,SE +3560951552,3560951555,ES +3560951556,3560951559,NO +3560951560,3560951583,SE +3560951584,3560951587,FI +3560951588,3560951591,SE +3560951592,3560951595,NO +3560951596,3560951679,SE +3560951680,3560951683,DE +3560951684,3560951807,SE +3560951808,3560951811,US +3560951812,3560951816,SE +3560951817,3560951818,ES +3560951819,3560951820,SE +3560951821,3560951822,IT +3560951823,3560951831,SE +3560951832,3560951835,DE +3560951836,3560951915,SE +3560951916,3560951919,PL +3560951920,3560951935,SE +3560951936,3560951940,NL +3560951941,3560952223,SE +3560952224,3560952227,CZ +3560952228,3560952231,SE +3560952232,3560952235,US +3560952236,3560952239,PT +3560952240,3560953103,SE +3560953104,3560953119,JP +3560953120,3560954239,SE +3560954240,3560954367,AX +3560954368,3560955903,SE +3560955904,3560964095,BE 3560964096,3560996863,NL -3560996864,3561005055,SA +3560996864,3561005055,GB 3561005056,3561013247,ES 3561013248,3561021439,TR 3561021440,3561022719,DE 3561022720,3561022975,AT 3561022976,3561037823,DE -3561037824,3561046015,BE +3561037824,3561039231,BE +3561039232,3561039263,NL +3561039264,3561039327,BE +3561039328,3561039330,NL +3561039331,3561046015,BE 3561046016,3561054207,RU +3561054208,3561062399,MT 3561062400,3561070591,TR 3561070592,3561070847,DE 3561070848,3561078783,CH @@ -70165,11 +115486,7 @@ 3561152512,3561160703,IT 3561160704,3561168895,RU 3561168896,3561177087,FR -3561177088,3561181215,CZ -3561181216,3561181247,CA -3561181248,3561181263,CZ -3561181264,3561181271,DE -3561181272,3561185279,CZ +3561177088,3561185279,CZ 3561185280,3561193471,GB 3561193472,3561201663,PL 3561201664,3561206655,NL @@ -70183,7 +115500,7 @@ 3561259008,3561267199,IL 3561267200,3561275391,UA 3561275392,3561291775,BE -3561291776,3561299967,CS +3561291776,3561299967,RS 3561299968,3561308159,GB 3561308160,3561316351,PL 3561316352,3561324543,RU @@ -70196,37 +115513,40 @@ 3561381888,3561382479,AT 3561382480,3561382495,DE 3561382496,3561390079,AT -3561390080,3561398271,BG +3561390080,3561396223,BG +3561396224,3561396480,MK +3561396481,3561398271,BG 3561398272,3561406463,LV 3561406464,3561414655,GR 3561414656,3561422847,IT 3561422848,3561427207,BE 3561427208,3561427211,NL -3561427212,3561427691,BE -3561427692,3561427695,NL -3561427696,3561431039,BE +3561427212,3561428135,BE +3561428136,3561428143,NL +3561428144,3561429279,BE +3561429280,3561429287,NL +3561429288,3561431039,BE 3561431040,3561439231,SA 3561439232,3561447423,NO 3561447424,3561455615,CH 3561455616,3561471999,CZ 3561472000,3561480191,DE -3561480192,3561480199,GB -3561480200,3561480255,IT -3561480256,3561480319,GB -3561480320,3561484351,IT -3561484352,3561484367,GB -3561484368,3561484383,IT -3561484384,3561484399,GB -3561484400,3561487359,IT -3561487360,3561487375,GB -3561487376,3561488383,IT +3561480192,3561488383,GB 3561488384,3561496575,OM -3561496576,3561496735,NL -3561496736,3561497215,GB +3561496576,3561496831,NL +3561496832,3561496887,GB +3561496888,3561496891,NL +3561496892,3561496955,GB +3561496956,3561496959,NL +3561496960,3561497087,GB +3561497088,3561497119,NL +3561497120,3561497215,GB 3561497216,3561497423,NL 3561497424,3561497471,GB -3561497472,3561498367,NL -3561498368,3561498399,GB +3561497472,3561497535,NL +3561497536,3561497599,GB +3561497600,3561498111,NL +3561498112,3561498399,GB 3561498400,3561498431,NL 3561498432,3561498487,GB 3561498488,3561498491,NL @@ -70237,30 +115557,30 @@ 3561498616,3561498623,GB 3561498624,3561500415,NL 3561500416,3561500671,GB -3561500672,3561500751,NL +3561500672,3561500703,NL +3561500704,3561500719,GB +3561500720,3561500751,NL 3561500752,3561500763,GB 3561500764,3561500767,NL 3561500768,3561500775,GB -3561500776,3561500807,NL -3561500808,3561500815,GB -3561500816,3561500991,NL -3561500992,3561501055,GB -3561501056,3561501375,NL +3561500776,3561501311,NL +3561501312,3561501343,GB +3561501344,3561501375,NL 3561501376,3561501407,GB -3561501408,3561501455,NL -3561501456,3561501487,GB -3561501488,3561501551,NL -3561501552,3561501567,GB -3561501568,3561501599,NL -3561501600,3561501695,GB +3561501408,3561501443,NL +3561501444,3561501487,GB +3561501488,3561501503,NL +3561501504,3561501535,GB +3561501536,3561501631,NL +3561501632,3561501695,GB 3561501696,3561502047,NL 3561502048,3561502079,GB 3561502080,3561502143,NL 3561502144,3561502207,GB 3561502208,3561502631,NL 3561502632,3561502655,GB -3561502656,3561504319,NL -3561504320,3561504383,GB +3561502656,3561504255,NL +3561504256,3561504383,GB 3561504384,3561504767,NL 3561504768,3561512959,DE 3561512960,3561521151,SI @@ -70284,8 +115604,8 @@ 3561603264,3561603295,GB 3561603296,3561603455,FR 3561603456,3561603487,GB -3561603488,3561603775,FR -3561603776,3561604895,GB +3561603488,3561604607,FR +3561604608,3561604895,GB 3561604896,3561604911,FR 3561604912,3561605119,GB 3561605120,3561607231,FR @@ -70296,59 +115616,45 @@ 3561607344,3561607359,GB 3561607360,3561607679,FR 3561607680,3561607711,GB -3561607712,3561607775,FR -3561607776,3561607807,GB -3561607808,3561610239,FR +3561607712,3561607727,FR +3561607728,3561607775,GB +3561607776,3561610239,FR 3561610240,3561610495,US -3561610496,3561610719,GB -3561610720,3561611007,FR -3561611008,3561611263,GB -3561611264,3561611295,FR +3561610496,3561610527,FR +3561610528,3561610719,GB +3561610720,3561611295,FR 3561611296,3561611559,GB 3561611560,3561611567,FR -3561611568,3561613055,GB -3561613056,3561613183,FR -3561613184,3561614175,GB +3561611568,3561614175,GB 3561614176,3561614199,FR -3561614200,3561615359,GB +3561614200,3561614335,GB +3561614336,3561614591,FR +3561614592,3561615359,GB 3561615360,3561615615,FR 3561615616,3561615871,IT -3561615872,3561616447,FR -3561616448,3561616511,GB -3561616512,3561616543,FR +3561615872,3561616383,FR +3561616384,3561616495,GB +3561616496,3561616543,FR 3561616544,3561616559,GB 3561616560,3561616575,FR 3561616576,3561616895,GB 3561616896,3561616959,FR -3561616960,3561617407,GB +3561616960,3561617151,GB +3561617152,3561617407,FR 3561617408,3561617919,CH 3561617920,3561618175,SE 3561618176,3561618431,IE 3561618432,3561618687,DK 3561618688,3561618815,FR 3561618816,3561618943,PL -3561618944,3561619455,FR -3561619456,3561636863,GB -3561636864,3561637119,BE -3561637120,3561637375,ES -3561637376,3561637631,CH -3561637632,3561637887,IT -3561637888,3561638143,AT -3561638144,3561638399,SE -3561638400,3561638655,US -3561638656,3561638911,DK -3561638912,3561639423,GB -3561639424,3561639679,DE -3561639680,3561640575,GB +3561618944,3561640575,GB 3561640576,3561640831,FR -3561640832,3561641983,GB -3561641984,3561642239,DE -3561642240,3561652223,GB +3561640832,3561652223,GB 3561652224,3561668607,CH -3561676800,3561679359,RU +3561668608,3561679359,RU 3561679360,3561679615,UA 3561679616,3561684991,RU -3561684992,3561693183,IT +3561684992,3561693183,BG 3561693184,3561694487,DE 3561694488,3561694495,CH 3561694496,3561701375,DE @@ -70358,13 +115664,12 @@ 3561709568,3561717759,PL 3561717760,3561725951,RU 3561725952,3561734143,ES -3561734144,3561742335,IT +3561734144,3561750527,RU 3561750528,3561758719,KZ 3561758720,3561766911,PL 3561766912,3561775103,SA 3561775104,3561783295,IL -3561783296,3561791487,DE -3561791488,3561799679,RU +3561783296,3561799679,RU 3561799680,3561807871,DE 3561807872,3561816063,BE 3561816064,3561824255,VA @@ -70380,98 +115685,98 @@ 3561897984,3561906175,GB 3561906176,3561907759,DE 3561907760,3561907763,GB -3561907764,3561910207,DE +3561907764,3561909891,DE +3561909892,3561909895,GB +3561909896,3561910207,DE 3561910208,3561910223,GB 3561910224,3561914367,DE 3561914368,3561922559,ES -3561922560,3561922855,NL -3561922856,3561922911,GB +3561922560,3561922815,NL +3561922816,3561922847,GB +3561922848,3561922863,NL +3561922864,3561922871,FR +3561922872,3561922911,GB 3561922912,3561922975,NL 3561922976,3561922991,GB 3561922992,3561923015,NL -3561923016,3561923071,GB -3561923072,3561923551,NL +3561923016,3561923063,GB +3561923064,3561923067,NL +3561923068,3561923071,GB +3561923072,3561923327,NL +3561923328,3561923403,GB +3561923404,3561923407,NL +3561923408,3561923423,GB +3561923424,3561923551,NL 3561923552,3561923583,GB -3561923584,3561923711,NL -3561923712,3561923847,GB -3561923848,3561923855,NL -3561923856,3561923871,GB -3561923872,3561924159,NL -3561924160,3561924199,GB -3561924200,3561924215,NL -3561924216,3561924703,GB +3561923584,3561923679,NL +3561923680,3561923711,GB +3561923712,3561923743,FR +3561923744,3561923775,NL +3561923776,3561923839,GB +3561923840,3561924351,NL +3561924352,3561924607,GB +3561924608,3561924647,NL +3561924648,3561924655,GB +3561924656,3561924671,NL +3561924672,3561924679,GB +3561924680,3561924687,NL +3561924688,3561924703,GB 3561924704,3561924719,NL -3561924720,3561924911,GB -3561924912,3561924943,NL -3561924944,3561924959,GB -3561924960,3561924991,NL -3561924992,3561925007,GB -3561925008,3561925039,NL +3561924720,3561924895,GB +3561924896,3561924903,FR +3561924904,3561924911,GB +3561924912,3561925039,NL 3561925040,3561925087,GB -3561925088,3561925103,NL -3561925104,3561925887,GB -3561925888,3561925951,NL -3561925952,3561926079,GB -3561926080,3561926143,NL -3561926144,3561926335,GB -3561926336,3561926399,NL -3561926400,3561926911,GB -3561926912,3561926975,NL -3561926976,3561927167,GB -3561927168,3561927423,NL -3561927424,3561927551,GB -3561927552,3561927655,NL -3561927656,3561927663,GB -3561927664,3561927743,NL -3561927744,3561928191,GB -3561928192,3561929727,NL +3561925088,3561925119,NL +3561925120,3561926943,GB +3561926944,3561926975,NL +3561926976,3561926983,GB +3561926984,3561926999,NL +3561927000,3561927007,GB +3561927008,3561927039,NL +3561927040,3561927103,GB +3561927104,3561927167,NL +3561927168,3561927551,GB +3561927552,3561927647,NL +3561927648,3561927663,GB +3561927664,3561929727,NL 3561929728,3561929743,GB -3561929744,3561929791,NL -3561929792,3561929879,GB +3561929744,3561929823,NL +3561929824,3561929855,CH +3561929856,3561929879,GB 3561929880,3561929919,NL 3561929920,3561929967,GB 3561929968,3561930335,NL -3561930336,3561930503,GB -3561930504,3561930511,NL -3561930512,3561930751,GB -3561930752,3561931519,DE -3561931520,3561931967,SE -3561931968,3561932031,DE -3561932032,3561934591,SE -3561934592,3561934847,DE -3561934848,3561935359,SE -3561935360,3561935871,DE -3561935872,3561936127,SE -3561936128,3561938175,DE -3561938176,3561938559,SE -3561938560,3561938687,DE -3561938688,3561938943,SE -3561947136,3561963519,DE +3561930336,3561930495,GB +3561930496,3561930511,NL +3561930512,3561930519,BE +3561930520,3561930527,FR +3561930528,3561930535,CH +3561930536,3561930543,GB +3561930544,3561930551,FR +3561930552,3561930575,NL +3561930576,3561930583,DE +3561930584,3561930599,NL +3561930600,3561930615,GB +3561930616,3561930671,NL +3561930672,3561930679,GB +3561930680,3561930719,NL +3561930720,3561930727,GB +3561930728,3561938943,NL +3561938944,3561940991,IE +3561940992,3561942015,GB +3561942016,3561947135,IE +3561947136,3561963143,DE +3561963144,3561963151,AU +3561963152,3561963519,DE 3561963520,3561971711,BE -3561971712,3561976831,TR -3561976832,3561977343,DE -3561977344,3561977855,US -3561977856,3561978367,PK -3561978368,3561979903,TR +3561975808,3561979903,UA 3561979904,3561988095,ES 3561988096,3562004479,DE -3562004480,3562006159,NL -3562006160,3562006175,DE -3562006176,3562006819,NL -3562006820,3562006823,VG -3562006824,3562007839,NL -3562007840,3562007871,VG -3562007872,3562007903,KN -3562007904,3562010399,NL -3562010400,3562010431,KN -3562010432,3562010943,NL -3562010944,3562010975,VG -3562010976,3562012031,NL -3562012032,3562012063,VG -3562012064,3562012479,NL -3562012480,3562012483,KN -3562012484,3562012671,NL -3562012672,3562020863,BE +3562004480,3562012671,NL +3562012672,3562020095,IR +3562020096,3562020351,AE +3562020352,3562020863,IR 3562020864,3562029055,UA 3562029056,3562037247,CZ 3562037248,3562045439,CH @@ -70499,44 +115804,209 @@ 3562086400,3562087423,SE 3562087424,3562088447,GB 3562088448,3562094591,SE -3562094592,3562098879,FR +3562094592,3562094975,GB +3562094976,3562095775,FR +3562095776,3562095807,GB +3562095808,3562095887,FR +3562095888,3562095903,GB +3562095904,3562096383,FR +3562096384,3562096639,GB +3562096640,3562096767,FR +3562096768,3562096927,GB +3562096928,3562097055,FR +3562097056,3562097151,GB +3562097152,3562097687,FR +3562097688,3562097695,GB +3562097696,3562097727,FR +3562097728,3562097791,GB +3562097792,3562097919,FR +3562097920,3562098175,GB +3562098176,3562098207,FR +3562098208,3562098223,GB +3562098224,3562098271,FR +3562098272,3562098367,GB +3562098368,3562098375,FR +3562098376,3562098383,GB +3562098384,3562098431,FR +3562098432,3562098687,GB +3562098688,3562098879,FR 3562098880,3562098895,BE -3562098896,3562102415,FR +3562098896,3562098911,FR +3562098912,3562099199,GB +3562099200,3562099359,FR +3562099360,3562099391,GB +3562099392,3562099423,FR +3562099424,3562099519,GB +3562099520,3562099583,FR +3562099584,3562099615,GB +3562099616,3562099647,FR +3562099648,3562099903,GB +3562099904,3562099935,FR +3562099936,3562100223,GB +3562100224,3562100351,FR +3562100352,3562100415,GB +3562100416,3562100479,FR +3562100480,3562100543,GB +3562100544,3562100575,FR +3562100576,3562100703,GB +3562100704,3562100735,FR +3562100736,3562100863,GB +3562100864,3562101215,FR +3562101216,3562101375,GB +3562101376,3562101439,FR +3562101440,3562101471,GB +3562101472,3562101535,FR +3562101536,3562101631,GB +3562101632,3562101647,FR +3562101648,3562101663,GB +3562101664,3562101695,FR +3562101696,3562101759,GB +3562101760,3562101887,FR +3562101888,3562101951,GB +3562101952,3562101983,FR +3562101984,3562102015,GB +3562102016,3562102111,FR +3562102112,3562102143,GB +3562102144,3562102335,FR +3562102336,3562102367,GB +3562102368,3562102415,FR 3562102416,3562102431,NL -3562102432,3562105503,FR +3562102432,3562102463,DE +3562102464,3562102655,FR +3562102656,3562102719,GB +3562102720,3562102735,FR +3562102736,3562102751,GB +3562102752,3562102783,FR +3562102784,3562103039,GB +3562103040,3562103295,FR +3562103296,3562103423,GB +3562103424,3562103647,FR +3562103648,3562103711,GB +3562103712,3562103743,FR +3562103744,3562103807,GB +3562103808,3562103903,FR +3562103904,3562103967,GB +3562103968,3562103999,FR +3562104000,3562104351,GB +3562104352,3562104383,FR +3562104384,3562104447,GB +3562104448,3562104511,FR +3562104512,3562104831,GB +3562104832,3562104927,FR +3562104928,3562104959,GB +3562104960,3562105007,FR +3562105008,3562105119,GB +3562105120,3562105151,FR +3562105152,3562105167,GB +3562105168,3562105199,FR +3562105200,3562105247,GB +3562105248,3562105343,FR +3562105344,3562105471,GB +3562105472,3562105487,FR +3562105488,3562105503,GB 3562105504,3562105535,DE -3562105536,3562110975,FR +3562105536,3562105567,FR +3562105568,3562105599,GB +3562105600,3562105855,FR +3562105856,3562106143,GB +3562106144,3562106159,FR +3562106160,3562106191,GB +3562106192,3562106271,FR +3562106272,3562106367,GB +3562106368,3562106495,FR +3562106496,3562106527,GB +3562106528,3562106559,FR +3562106560,3562106623,GB +3562106624,3562106911,FR +3562106912,3562106927,GB +3562106928,3562106959,FR +3562106960,3562107007,GB +3562107008,3562107103,FR +3562107104,3562107119,GB +3562107120,3562107135,FR +3562107136,3562107231,GB +3562107232,3562107263,FR +3562107264,3562107327,GB +3562107328,3562107391,FR +3562107392,3562107503,GB +3562107504,3562107583,FR +3562107584,3562107647,GB +3562107648,3562107711,FR +3562107712,3562107775,GB +3562107776,3562107807,FR +3562107808,3562107887,GB +3562107888,3562108063,FR +3562108064,3562108159,GB +3562108160,3562108415,FR +3562108416,3562108959,GB +3562108960,3562108991,FR +3562108992,3562109119,GB +3562109120,3562109183,FR +3562109184,3562109567,GB +3562109568,3562109583,FR +3562109584,3562109759,GB +3562109760,3562109791,FR +3562109792,3562109823,GB +3562109824,3562110207,FR +3562110208,3562110399,GB +3562110400,3562110719,FR +3562110720,3562110943,GB +3562110944,3562110959,FR +3562110960,3562110967,GB +3562110968,3562110975,FR 3562110976,3562143743,ES 3562143744,3562151935,GB 3562151936,3562160127,DE 3562160128,3562161151,GB 3562161152,3562161183,NL -3562161184,3562174463,GB +3562161184,3562169343,GB +3562169344,3562170367,CH +3562170368,3562172415,IE +3562172416,3562173951,CH +3562173952,3562174463,GB 3562174464,3562176511,CH 3562176512,3562184703,FR 3562184704,3562192895,DE 3562192896,3562201087,UA 3562201088,3562209279,DE 3562209280,3562217471,RU +3562217472,3562220287,DE +3562220288,3562220799,CH +3562220800,3562225663,DE 3562225664,3562233855,NL 3562233856,3562242047,FI 3562242048,3562258431,FR -3562258432,3562283007,NL +3562258432,3562263975,NL +3562263976,3562263983,BE +3562263984,3562283007,NL 3562283008,3562291199,IT -3562299392,3562307583,GB +3562291200,3562307583,GB 3562307584,3562315775,NL -3562315776,3562323967,GB +3562315776,3562321231,GB +3562321232,3562321239,BE +3562321240,3562322743,GB +3562322744,3562322751,GG +3562322752,3562323087,GB +3562323088,3562323095,ES +3562323096,3562323135,GB +3562323136,3562323143,BE +3562323144,3562323951,GB +3562323952,3562323959,GG +3562323960,3562323967,GB 3562323968,3562340351,DE 3562340352,3562348543,GB 3562348544,3562356735,ES 3562356736,3562364927,SE 3562364928,3562373119,PL 3562373120,3562381311,FR -3562381312,3562389503,IT +3562381312,3562389503,SI +3562389504,3562395647,GH +3562395648,3562396159,TZ +3562396160,3562397695,SZ 3562397696,3562405887,GB 3562405888,3562414079,FI 3562414080,3562422271,DE -3562422272,3562430463,GB +3562422272,3562430463,IR 3562430464,3562438655,UA 3562438656,3562463231,DE 3562463232,3562471423,UA @@ -70545,11 +116015,13 @@ 3562487808,3562495999,GB 3562496000,3562504191,BE 3562504192,3562512383,DE +3562512384,3562520575,UA 3562520576,3562528767,ES 3562528768,3562536959,PL 3562536960,3562545151,AT 3562545152,3562553343,GB 3562553344,3562561535,DK +3562561536,3562569727,UG 3562569728,3562572143,DE 3562572144,3562572159,LU 3562572160,3562572223,DE @@ -70568,17 +116040,14 @@ 3562610688,3562618879,NO 3562618880,3562627071,GB 3562627072,3562643455,DE -3562643456,3562651647,GR +3562643456,3562651647,AT 3562651648,3562659839,DE 3562659840,3562668031,SK 3562668032,3562676223,IT -3562676224,3562684415,GB 3562684416,3562692607,FI 3562692608,3562695375,UA 3562695376,3562695379,CZ -3562695380,3562698751,UA -3562698752,3562699775,DE -3562699776,3562700799,UA +3562695380,3562700799,UA 3562700800,3562708991,DE 3562708992,3562717183,UA 3562717184,3562725375,CH @@ -70589,11 +116058,17 @@ 3562766336,3562774527,SE 3562774528,3562782719,BG 3562782720,3562790911,RU -3562790912,3562799103,DE -3562799104,3562807295,HU +3562790912,3562797951,DE +3562797952,3562797967,CH +3562797968,3562799103,DE +3562799104,3562803471,HU +3562803472,3562803479,UA +3562803480,3562807295,HU 3562807296,3562815487,ES 3562815488,3562823679,NL 3562823680,3562848255,RU +3562848256,3562856447,HR +3562856448,3562864639,UA 3562864640,3562872831,DE 3562872832,3562881023,DK 3562881024,3562889215,GB @@ -70609,17 +116084,52 @@ 3562971136,3562987519,FR 3562987520,3562995711,DE 3562995712,3563003903,AT -3563003904,3563012095,DE +3563003904,3563005183,DE +3563005184,3563005311,KZ +3563005312,3563005439,DE +3563005440,3563005695,TR +3563005696,3563005951,DE +3563005952,3563006463,TR +3563006464,3563006591,DE +3563006592,3563006719,CA +3563006720,3563006729,DE +3563006730,3563006847,CN +3563006848,3563007487,DE +3563007488,3563007999,TR +3563008000,3563008255,DE +3563008256,3563008511,PL +3563008512,3563009279,DE +3563009280,3563009535,LT +3563009536,3563009791,DE +3563009792,3563010047,HK +3563010048,3563010063,DE +3563010064,3563010079,KZ +3563010080,3563010303,DE +3563010304,3563010559,NL +3563010560,3563010815,DE +3563010816,3563011071,PL +3563011072,3563011583,DE +3563011584,3563011839,ES +3563011840,3563012095,DE 3563012096,3563020287,FR 3563020288,3563028479,DE -3563028480,3563036671,GB +3563028480,3563036671,IR 3563036672,3563044863,BG 3563044864,3563053055,ES 3563053056,3563053503,GB 3563053504,3563053527,US 3563053528,3563061247,GB -3563077632,3563085567,FR -3563085568,3563085823,SE +3563061248,3563061759,GH +3563061760,3563062527,NG +3563062528,3563067391,GH +3563067392,3563067519,MZ +3563067520,3563067647,GH +3563067648,3563067903,MZ +3563067904,3563068415,GH +3563068416,3563069183,NG +3563069184,3563069439,GH +3563069440,3563077631,HU +3563077632,3563085823,FR 3563085824,3563094015,RU 3563094016,3563096255,DE 3563096256,3563096287,GB @@ -70635,11 +116145,13 @@ 3563102208,3563110399,CZ 3563110400,3563118591,RU 3563118592,3563126783,DE -3563126784,3563134975,HU +3563126784,3563134975,KG 3563134976,3563143167,IT 3563143168,3563151359,GB 3563151360,3563159551,DE -3563159552,3563167743,DK +3563159552,3563163647,DK +3563163648,3563164159,SE +3563164160,3563167743,DK 3563167744,3563175935,ES 3563175936,3563192319,DK 3563192320,3563200511,TR @@ -70652,7 +116164,9 @@ 3563290624,3563315199,DE 3563315200,3563323391,DK 3563323392,3563329791,GB +3563329792,3563331583,EU 3563331584,3563339775,DE +3563339776,3563347967,NG 3563347968,3563356159,GB 3563356160,3563364351,RU 3563364352,3563372543,BE @@ -70675,21 +116189,13 @@ 3563407872,3563407903,US 3563407904,3563413503,ES 3563413504,3563421695,TR -3563421696,3563438079,CH +3563421696,3563438079,SI 3563438080,3563446271,DE -3563446272,3563454463,RU +3563446272,3563454463,LB 3563454464,3563462655,SA 3563462656,3563479039,IT 3563479040,3563487231,GB -3563487232,3563488255,RS -3563488256,3563488351,CS -3563488352,3563488383,CS -3563488384,3563488447,RS -3563488448,3563488511,CS -3563488512,3563489535,RS -3563489536,3563491323,CS -3563491324,3563491327,RS -3563491328,3563495423,CS +3563487232,3563495423,RS 3563495424,3563503615,DE 3563503616,3563511807,GB 3563511808,3563519999,DE @@ -70699,17 +116205,17 @@ 3563539088,3563539095,US 3563539096,3563539119,CH 3563539120,3563539135,DE -3563539136,3563540191,CH -3563540192,3563540199,DE -3563540200,3563544575,CH -3563544576,3563552767,DE +3563539136,3563544575,CH +3563544576,3563552767,RU 3563552768,3563560959,SI +3563560960,3563569151,EG 3563569152,3563577343,IT 3563577344,3563585535,GB 3563585536,3563601919,IT -3563601920,3563610111,GR +3563601920,3563610111,RU 3563610112,3563618303,BG 3563618304,3563626495,GB +3563626496,3563634687,ES 3563634688,3563651071,NL 3563651072,3563683839,SE 3563683840,3563692031,BE @@ -70816,70 +116322,85 @@ 3563806688,3563806703,DE 3563806704,3563806719,FR 3563806720,3563814911,SA +3563814912,3563823103,SE 3563823104,3563831295,DE 3563831296,3563847679,RU -3563847680,3563848383,NL +3563847680,3563848231,NL +3563848232,3563848239,GB +3563848240,3563848319,NL +3563848320,3563848327,ES +3563848328,3563848383,NL 3563848384,3563848447,ES -3563848448,3563848575,NL +3563848448,3563848495,NL +3563848496,3563848511,ES +3563848512,3563848575,NL 3563848576,3563848583,ES -3563848584,3563848671,NL -3563848672,3563848703,ES -3563848704,3563848959,US -3563848960,3563848975,NL -3563848976,3563848983,ES -3563848984,3563849015,NL -3563849016,3563849023,ES -3563849024,3563849151,NL +3563848584,3563848655,NL +3563848656,3563848959,ES +3563848960,3563848967,NL +3563848968,3563848975,ES +3563848976,3563848979,NL +3563848980,3563848983,ES +3563848984,3563848987,NL +3563848988,3563848999,ES +3563849000,3563849151,NL 3563849152,3563849183,ES 3563849184,3563849197,NL -3563849198,3563849199,ES -3563849200,3563849211,NL -3563849212,3563849215,ES +3563849198,3563849215,ES 3563849216,3563849727,GB 3563849728,3563849991,NL -3563849992,3563849999,SA +3563849992,3563849999,ES 3563850000,3563850007,FI -3563850008,3563850239,NL +3563850008,3563850015,NL +3563850016,3563850047,ES +3563850048,3563850239,NL 3563850240,3563850751,GB -3563850752,3563850783,NL -3563850784,3563850831,ES +3563850752,3563850767,NL +3563850768,3563850783,ES +3563850784,3563850815,NL +3563850816,3563850831,ES 3563850832,3563850847,NL 3563850848,3563850879,ES -3563850880,3563851199,NL -3563851200,3563851263,ES -3563851264,3563851775,US -3563851776,3563852031,NL -3563852032,3563852071,ES -3563852072,3563852079,NL -3563852080,3563852159,ES -3563852160,3563852191,NL +3563850880,3563851007,NL +3563851008,3563851199,ES +3563851200,3563851839,NL +3563851840,3563851903,ES +3563851904,3563851967,NL +3563851968,3563852095,ES +3563852096,3563852191,NL 3563852192,3563852207,GB 3563852208,3563852216,NL 3563852217,3563852223,ES -3563852224,3563852255,NL -3563852256,3563852271,ES -3563852272,3563852543,NL +3563852224,3563852543,NL 3563852544,3563852799,ES -3563852800,3563853327,NL -3563853328,3563853439,ES +3563852800,3563853319,NL +3563853320,3563853327,ES +3563853328,3563853375,NL +3563853376,3563853439,ES 3563853440,3563853567,NL -3563853568,3563853823,ES -3563853824,3563854079,IT -3563854080,3563854103,ES +3563853568,3563854103,ES 3563854104,3563854175,NL 3563854176,3563854239,ES 3563854240,3563854259,NL 3563854260,3563854591,ES -3563854592,3563855487,NL -3563855488,3563855615,ES +3563854592,3563854847,NL +3563854848,3563855359,ES +3563855360,3563855487,NL +3563855488,3563855551,ES +3563855552,3563855583,NL +3563855584,3563855615,ES 3563855616,3563855871,US 3563855872,3563864063,AT 3563864064,3563872255,GB 3563872256,3563880447,RU 3563880448,3563888639,TR 3563888640,3563896831,DE -3563896832,3563913215,HU -3563913216,3563921407,SE +3563896832,3563899903,HU +3563899904,3563900159,SK +3563900160,3563900415,HU +3563900416,3563900671,SK +3563900672,3563913215,HU +3563913216,3563921407,RU 3563921408,3563929599,UA 3563929600,3563937791,CH 3563937792,3563945983,TR @@ -70893,20 +116414,20 @@ 3564008192,3564008223,CH 3564008224,3564011519,DE 3564011520,3564019711,UA -3564019712,3564027903,IT -3564027904,3564036351,DE -3564036352,3564037631,RU -3564037632,3564038143,KZ -3564038144,3564039167,RU -3564039168,3564039679,AZ -3564039680,3564039935,RU -3564039936,3564040191,KZ -3564040192,3564040447,RU -3564040448,3564040703,UZ -3564040704,3564042239,RU -3564042240,3564042495,TJ -3564042496,3564043007,RU -3564043008,3564044287,DE +3564019712,3564021247,GB +3564021248,3564021279,IT +3564021280,3564024095,GB +3564024096,3564024103,IT +3564024104,3564024135,GB +3564024136,3564024143,IT +3564024144,3564024447,GB +3564024448,3564024463,IT +3564024464,3564024671,GB +3564024672,3564024831,IT +3564024832,3564027903,GB +3564027904,3564041215,DE +3564041216,3564041727,RU +3564041728,3564044287,DE 3564044288,3564052479,CZ 3564052480,3564060671,GB 3564060672,3564068863,RU @@ -70915,15 +116436,23 @@ 3564093440,3564101631,UA 3564101632,3564109823,DE 3564109824,3564126207,SE -3564126208,3564134399,IT +3564126208,3564128287,IT +3564128288,3564128303,BG +3564128304,3564129727,IT +3564129728,3564129743,PH +3564129744,3564130655,IT +3564130656,3564130671,IN +3564130672,3564134399,IT 3564134400,3564142591,KG 3564142592,3564146175,DE 3564146176,3564150783,DK 3564150784,3564152607,SE 3564152608,3564152639,NO -3564152640,3564156703,SE -3564156704,3564156735,NO -3564156736,3564157207,SE +3564152640,3564153087,SE +3564153088,3564153151,NO +3564153152,3564153199,SE +3564153200,3564153207,NL +3564153208,3564157207,SE 3564157208,3564157215,NO 3564157216,3564158975,SE 3564158976,3564161855,DE @@ -70932,19 +116461,24 @@ 3564165120,3564165439,NL 3564165440,3564175359,DE 3564175360,3564183551,GB -3564183552,3564191743,UA +3564183552,3564185087,UA +3564185088,3564185343,DE +3564185344,3564191743,UA 3564191744,3564199935,BE 3564199936,3564208127,RU +3564208128,3564216319,GB 3564216320,3564224511,PT 3564224512,3564232703,GB -3564232704,3564240895,DE +3564232704,3564240895,RU 3564240896,3564241407,TJ 3564241408,3564249087,RU 3564249088,3564260735,DE 3564260736,3564260863,NL 3564260864,3564265471,DE -3564265472,3564273663,GR -3564273664,3564302655,DE +3564265472,3564273663,NL +3564273664,3564292151,DE +3564292152,3564292159,AT +3564292160,3564302655,DE 3564302656,3564302687,BE 3564302688,3564306431,DE 3564306432,3564314623,TR @@ -70980,17 +116514,21 @@ 3564343872,3564343967,GB 3564343968,3564343999,NL 3564344000,3564344031,GB -3564344032,3564344231,NL +3564344032,3564344215,NL +3564344216,3564344223,GB +3564344224,3564344231,NL 3564344232,3564344239,GB -3564344240,3564344255,NL -3564344256,3564344575,GB +3564344240,3564344247,NL +3564344248,3564344575,GB 3564344576,3564344831,NL 3564344832,3564344895,GB 3564344896,3564344959,NL 3564344960,3564345023,GB 3564345024,3564345087,NL 3564345088,3564345127,GB -3564345128,3564345151,NL +3564345128,3564345131,NL +3564345132,3564345135,GB +3564345136,3564345151,NL 3564345152,3564345215,GB 3564345216,3564345343,NL 3564345344,3564346143,GB @@ -71039,9 +116577,9 @@ 3564351472,3564351487,NL 3564351488,3564351503,GB 3564351504,3564351679,NL -3564351680,3564351743,GB -3564351744,3564352079,NL -3564352080,3564352095,GB +3564351680,3564351999,GB +3564352000,3564352063,NL +3564352064,3564352095,GB 3564352096,3564352127,NL 3564352128,3564352191,GB 3564352192,3564352511,NL @@ -71052,8 +116590,8 @@ 3564352768,3564353023,GB 3564353024,3564353087,NL 3564353088,3564353111,GB -3564353112,3564353167,NL -3564353168,3564353199,GB +3564353112,3564353151,NL +3564353152,3564353199,GB 3564353200,3564353215,NL 3564353216,3564353223,GB 3564353224,3564353263,NL @@ -71074,8 +116612,8 @@ 3564354336,3564354367,GB 3564354368,3564354559,NL 3564354560,3564354943,GB -3564354944,3564355055,NL -3564355056,3564355135,GB +3564354944,3564355039,NL +3564355040,3564355135,GB 3564355136,3564355199,NL 3564355200,3564355295,GB 3564355296,3564355311,NL @@ -71084,57 +116622,82 @@ 3564363776,3564371967,UA 3564371968,3564380159,DE 3564380160,3564388351,FI -3564388352,3564396543,SE +3564388352,3564392959,SE +3564392960,3564393087,NO +3564393088,3564396543,SE +3564396544,3564404735,RU 3564404736,3564412927,BG 3564412928,3564421119,IL 3564421120,3564429311,SA 3564429312,3564431567,KZ 3564431568,3564431583,AF 3564431584,3564437503,KZ +3564437504,3564445695,LT 3564445696,3564453887,BG 3564453888,3564462079,DE 3564462080,3564470271,CH -3564470272,3564478463,IL +3564470272,3564473439,IL +3564473440,3564473455,A2 +3564473456,3564478463,IL 3564478464,3564486655,LU 3564486656,3564494847,CH 3564494848,3564494907,GB 3564494908,3564494911,FR -3564494912,3564494975,GB -3564494976,3564494983,CH -3564494984,3564495103,GB +3564494912,3564495103,GB 3564495104,3564495167,DE 3564495168,3564495203,GB +3564495204,3564495615,EU 3564495616,3564495743,GB +3564495744,3564495871,EU 3564495872,3564495927,GB +3564495928,3564495935,EU 3564495936,3564496111,GB +3564496112,3564496127,EU 3564496128,3564496175,GB +3564496176,3564496183,EU 3564496184,3564496199,GB +3564496200,3564496207,EU 3564496208,3564496215,GB +3564496216,3564496223,EU 3564496224,3564496263,GB +3564496264,3564496271,EU 3564496272,3564496319,GB 3564496320,3564496327,FR +3564496328,3564496335,EU 3564496336,3564496607,GB +3564496608,3564496639,EU 3564496640,3564496655,GB +3564496656,3564496671,EU 3564496672,3564496847,GB 3564496848,3564496863,FR 3564496864,3564496895,GB +3564496896,3564498943,EU 3564498944,3564499007,NL 3564499008,3564499055,GB +3564499056,3564499199,EU 3564499200,3564499215,NL 3564499216,3564499231,DK 3564499232,3564499239,NL +3564499240,3564499247,EU 3564499248,3564499335,GB +3564499336,3564499455,EU 3564499456,3564499551,NL 3564499552,3564499711,GB +3564499712,3564500991,EU 3564500992,3564500999,SE +3564501000,3564501247,EU 3564501248,3564501263,DE 3564501264,3564501279,SE 3564501280,3564501311,GB +3564501312,3564501503,EU 3564501504,3564501507,SE 3564501508,3564501511,DE +3564501512,3564501759,EU 3564501760,3564501887,DE +3564501888,3564502527,EU 3564502528,3564502559,DE 3564502560,3564502591,GB +3564502592,3564503039,EU 3564503040,3564511231,JO 3564511232,3564519423,RU 3564519424,3564527615,SI @@ -71144,42 +116707,62 @@ 3564560392,3564560399,CA 3564560400,3564560415,US 3564560416,3564560511,GB -3564560512,3564560639,US -3564560640,3564560927,GB +3564560512,3564560607,US +3564560608,3564560927,GB 3564560928,3564560959,US 3564560960,3564561039,GB -3564561040,3564561087,US +3564561040,3564561055,US +3564561056,3564561071,GB +3564561072,3564561087,US 3564561088,3564561151,GB 3564561152,3564561407,US 3564561408,3564561663,GB -3564561664,3564561791,US +3564561664,3564561671,US +3564561672,3564561679,GB +3564561680,3564561687,US +3564561688,3564561695,GB +3564561696,3564561791,US 3564561792,3564561919,GB 3564561920,3564562431,CH 3564562432,3564562687,GB -3564562688,3564562815,US -3564562816,3564563711,GB +3564562688,3564562831,US +3564562832,3564562847,GB +3564562848,3564562943,US +3564562944,3564563711,GB 3564563712,3564563967,US 3564563968,3564564223,GB -3564564224,3564564479,US -3564564480,3564565247,GB +3564564224,3564564239,US +3564564240,3564565231,GB +3564565232,3564565239,US +3564565240,3564565247,GB 3564565248,3564565279,US 3564565280,3564565327,GB -3564565328,3564565375,US -3564565376,3564566271,GB +3564565328,3564565407,US +3564565408,3564566047,GB +3564566048,3564566079,US +3564566080,3564566143,GB +3564566144,3564566175,US +3564566176,3564566271,GB 3564566272,3564566527,US -3564566528,3564567143,GB +3564566528,3564567047,GB +3564567048,3564567055,US +3564567056,3564567143,GB 3564567144,3564567151,US -3564567152,3564567247,GB +3564567152,3564567183,GB +3564567184,3564567199,US +3564567200,3564567247,GB 3564567248,3564567255,US 3564567256,3564567295,GB -3564567296,3564567423,US -3564567424,3564567551,GB -3564567552,3564567935,US +3564567296,3564567551,US +3564567552,3564567807,GB +3564567808,3564567935,US 3564567936,3564568039,GB -3564568040,3564568191,US -3564568192,3564568223,GB +3564568040,3564568063,US +3564568064,3564568223,GB 3564568224,3564568231,US -3564568232,3564571055,GB +3564568232,3564568255,GB +3564568256,3564568319,US +3564568320,3564571055,GB 3564571056,3564571071,DE 3564571072,3564571135,GB 3564571136,3564571455,FR @@ -71202,15 +116785,11 @@ 3564634112,3564642303,MK 3564642304,3564650495,CH 3564650496,3564666879,NL -3564666880,3564668943,IE -3564668944,3564668991,GB +3564666880,3564668959,IE +3564668960,3564668991,GB 3564668992,3564669103,IE 3564669104,3564669119,GB -3564669120,3564669183,IE -3564669184,3564669247,GB -3564669248,3564669343,IE -3564669344,3564669359,GB -3564669360,3564669407,IE +3564669120,3564669407,IE 3564669408,3564669439,GB 3564669440,3564670207,IE 3564670208,3564670239,GB @@ -71232,70 +116811,54 @@ 3564691456,3564699647,GI 3564699648,3564716031,GB 3564716032,3564724223,IT -3564724224,3564732415,GR -3564732416,3564733439,DE -3564733440,3564733695,GB -3564733696,3564734239,DE -3564734240,3564734271,GB -3564734272,3564734287,DE +3564724224,3564732415,NL +3564732416,3564734287,DE 3564734288,3564734303,GB -3564734304,3564734335,DE -3564734336,3564734431,GB -3564734432,3564734719,DE -3564734720,3564734807,GB -3564734808,3564734815,DE +3564734304,3564734399,DE +3564734400,3564734431,GB +3564734432,3564734815,DE 3564734816,3564734819,GB -3564734820,3564736511,DE +3564734820,3564734847,DE +3564734848,3564734975,GB +3564734976,3564736511,DE 3564736512,3564736527,GB 3564736528,3564736583,DE -3564736584,3564736591,GB -3564736592,3564736599,DE -3564736600,3564736603,GB +3564736584,3564736603,GB 3564736604,3564736607,DE 3564736608,3564736611,GB -3564736612,3564736767,DE -3564736768,3564736887,GB +3564736612,3564736623,DE +3564736624,3564736631,GB +3564736632,3564736871,DE +3564736872,3564736887,GB 3564736888,3564736895,DE 3564736896,3564736903,GB -3564736904,3564736927,DE -3564736928,3564736959,GB +3564736904,3564736911,DE +3564736912,3564736959,GB 3564736960,3564736967,DE 3564736968,3564736975,GB 3564736976,3564736991,DE -3564736992,3564737007,GB -3564737008,3564737535,DE -3564737536,3564737791,GB -3564737792,3564738047,DE -3564738048,3564738303,GB -3564738304,3564739327,DE -3564739328,3564739335,GB -3564739336,3564739351,DE -3564739352,3564739391,GB -3564739392,3564739455,DE -3564739456,3564739503,GB -3564739504,3564739519,DE -3564739520,3564739567,GB -3564739568,3564739583,DE -3564739584,3564739799,GB -3564739800,3564739815,DE +3564736992,3564737023,GB +3564737024,3564739383,DE +3564739384,3564739391,ES +3564739392,3564739495,DE +3564739496,3564739503,GB +3564739504,3564739519,AT +3564739520,3564739807,GB +3564739808,3564739815,DE 3564739816,3564739823,GB -3564739824,3564740367,DE -3564740368,3564740383,GB -3564740384,3564740415,DE -3564740416,3564740447,GB -3564740448,3564740455,DE +3564739824,3564740351,DE +3564740352,3564740383,GB +3564740384,3564740455,DE 3564740456,3564740459,GB -3564740460,3564740463,DE -3564740464,3564740471,GB -3564740472,3564740479,DE +3564740460,3564740479,DE 3564740480,3564740495,GB 3564740496,3564740503,DE 3564740504,3564740527,GB -3564740528,3564740543,DE -3564740544,3564740575,GB -3564740576,3564740591,DE +3564740528,3564740591,DE 3564740592,3564740595,GB -3564740596,3564740607,DE +3564740596,3564740599,DE +3564740600,3564740603,GB +3564740604,3564740607,DE 3564740608,3564748799,FR 3564748800,3564756991,GB 3564756992,3564765183,ES @@ -71306,132 +116869,146 @@ 3564797952,3564806143,DE 3564806144,3564814335,BG 3564814336,3564822527,PL +3564822528,3564830719,EG 3564830720,3564838911,BE 3564838912,3564847103,DE 3564847104,3564855295,IT 3564855296,3564862863,DE 3564862864,3564862871,AE 3564862872,3564863487,DE -3564863488,3564880895,NL -3564880896,3564880911,GB -3564880912,3564880919,NL -3564880920,3564880943,GB +3564863488,3564880935,NL +3564880936,3564880943,GB 3564880944,3564880951,NL -3564880952,3564880975,GB -3564880976,3564880991,NL -3564880992,3564881023,GB -3564881024,3564881039,NL -3564881040,3564881167,GB -3564881168,3564881183,NL -3564881184,3564881231,GB +3564880952,3564880967,FR +3564880968,3564880975,NL +3564880976,3564880991,GB +3564880992,3564881007,NL +3564881008,3564881103,GB +3564881104,3564881159,NL +3564881160,3564881199,GB +3564881200,3564881203,FR +3564881204,3564881231,GB 3564881232,3564881263,NL -3564881264,3564881327,GB -3564881328,3564881343,NL -3564881344,3564881375,GB -3564881376,3564881391,NL -3564881392,3564881455,GB -3564881456,3564881471,NL -3564881472,3564881519,GB -3564881520,3564881535,NL -3564881536,3564881551,GB -3564881552,3564881567,NL -3564881568,3564881663,GB +3564881264,3564881343,GB +3564881344,3564881359,NL +3564881360,3564881375,GB +3564881376,3564881439,NL +3564881440,3564881455,GB +3564881456,3564881463,NL +3564881464,3564881471,GB +3564881472,3564881551,NL +3564881552,3564881599,GB +3564881600,3564881631,NL +3564881632,3564881663,GB 3564881664,3564881727,NL -3564881728,3564881919,GB -3564881920,3564881939,NL -3564881940,3564881951,GB -3564881952,3564881959,NL -3564881960,3564881983,GB +3564881728,3564881935,GB +3564881936,3564881939,NL +3564881940,3564881983,GB 3564881984,3564881991,NL 3564881992,3564881999,GB 3564882000,3564882079,NL -3564882080,3564882087,GB -3564882088,3564882119,NL +3564882080,3564882095,GB +3564882096,3564882119,NL 3564882120,3564882127,GB -3564882128,3564882239,NL -3564882240,3564882247,GB -3564882248,3564882287,NL -3564882288,3564882335,GB -3564882336,3564882367,NL -3564882368,3564882399,GB -3564882400,3564883039,NL -3564883040,3564883047,GB -3564883048,3564883055,NL -3564883056,3564883087,GB -3564883088,3564883095,NL -3564883096,3564883103,GB -3564883104,3564883119,NL -3564883120,3564883167,GB -3564883168,3564883967,NL +3564882128,3564882135,NL +3564882136,3564882143,GB +3564882144,3564882239,NL +3564882240,3564882255,GB +3564882256,3564882271,NL +3564882272,3564882399,GB +3564882400,3564882943,NL +3564882944,3564883007,GB +3564883008,3564883039,NL +3564883040,3564883071,GB +3564883072,3564883087,NL +3564883088,3564883199,GB +3564883200,3564883967,NL 3564883968,3564884223,GB -3564884224,3564884235,NL -3564884236,3564884239,GB -3564884240,3564884255,NL -3564884256,3564884287,GB -3564884288,3564884319,NL +3564884224,3564884255,NL +3564884256,3564884303,GB +3564884304,3564884319,NL 3564884320,3564884335,GB 3564884336,3564884343,NL 3564884344,3564884359,GB -3564884360,3564884415,NL +3564884360,3564884367,NL +3564884368,3564884375,GB +3564884376,3564884399,NL +3564884400,3564884407,GB +3564884408,3564884415,NL 3564884416,3564884431,GB 3564884432,3564884439,NL 3564884440,3564884455,GB 3564884456,3564884463,NL -3564884464,3564884735,GB -3564884736,3564884991,NL -3564884992,3564885007,GB -3564885008,3564885023,NL -3564885024,3564885055,GB -3564885056,3564885071,NL -3564885072,3564885087,GB -3564885088,3564885135,NL -3564885136,3564885343,GB -3564885344,3564885359,NL -3564885360,3564885375,GB -3564885376,3564885391,NL -3564885392,3564885439,GB -3564885440,3564885455,NL -3564885456,3564885527,GB -3564885528,3564885546,NL -3564885547,3564885551,GB -3564885552,3564885583,NL -3564885584,3564885615,GB -3564885616,3564885695,NL -3564885696,3564885727,GB +3564884464,3564884487,GB +3564884488,3564884519,NL +3564884520,3564884527,FR +3564884528,3564884552,NL +3564884553,3564884559,GB +3564884560,3564884567,NL +3564884568,3564884735,GB +3564884736,3564885039,NL +3564885040,3564885087,GB +3564885088,3564885119,NL +3564885120,3564885215,GB +3564885216,3564885343,NL +3564885344,3564885359,GB +3564885360,3564885367,NL +3564885368,3564885487,GB +3564885488,3564885495,NL +3564885496,3564885503,GB +3564885504,3564885543,NL +3564885544,3564885551,BE +3564885552,3564885559,NL +3564885560,3564885567,GB +3564885568,3564885599,NL +3564885600,3564885615,GB +3564885616,3564885631,NL +3564885632,3564885647,GB +3564885648,3564885663,NL +3564885664,3564885727,FR 3564885728,3564885743,NL -3564885744,3564885775,GB -3564885776,3564885791,NL -3564885792,3564885807,GB -3564885808,3564885823,NL -3564885824,3564885839,GB -3564885840,3564885903,NL -3564885904,3564885919,GB -3564885920,3564885967,NL -3564885968,3564885983,GB -3564885984,3564885999,NL -3564886000,3564886015,GB -3564886016,3564886047,NL -3564886048,3564886271,GB +3564885744,3564885759,GB +3564885760,3564885775,NL +3564885776,3564885791,GB +3564885792,3564885799,NL +3564885800,3564885839,GB +3564885840,3564885887,NL +3564885888,3564885919,GB +3564885920,3564885935,NL +3564885936,3564885951,GB +3564885952,3564885967,NL +3564885968,3564885999,GB +3564886000,3564886031,NL +3564886032,3564886063,GB +3564886064,3564886079,NL +3564886080,3564886127,GB +3564886128,3564886143,NL +3564886144,3564886159,GB +3564886160,3564886207,NL +3564886208,3564886271,GB 3564886272,3564886279,NL 3564886280,3564886287,GB 3564886288,3564886295,NL 3564886296,3564886303,GB 3564886304,3564886367,NL -3564886368,3564886375,GB -3564886376,3564886527,NL +3564886368,3564886383,GB +3564886384,3564886415,NL +3564886416,3564886431,GB +3564886432,3564886527,NL 3564886528,3564886655,GB 3564886656,3564886751,NL -3564886752,3564886919,GB -3564886920,3564886927,NL -3564886928,3564886943,GB +3564886752,3564886943,GB 3564886944,3564886951,NL 3564886952,3564887039,GB -3564887040,3564888207,NL +3564887040,3564888063,NL +3564888064,3564888079,GB +3564888080,3564888095,CH +3564888096,3564888207,NL 3564888208,3564888223,GB 3564888224,3564888327,NL 3564888328,3564888335,GB 3564888336,3564888367,NL -3564888368,3564888383,GB +3564888368,3564888383,FR 3564888384,3564888463,NL 3564888464,3564888479,DE 3564888480,3564888503,NL @@ -71439,96 +117016,128 @@ 3564888512,3564888527,DE 3564888528,3564888591,NL 3564888592,3564888607,GB -3564888608,3564888623,NL -3564888624,3564888663,GB +3564888608,3564888655,NL +3564888656,3564888663,BE 3564888664,3564888671,NL -3564888672,3564888799,GB -3564888800,3564888815,NL +3564888672,3564888735,BE +3564888736,3564888815,NL 3564888816,3564888823,GB -3564888824,3564888879,NL -3564888880,3564888895,GB -3564888896,3564888903,NL -3564888904,3564888911,GB -3564888912,3564888991,NL +3564888824,3564888959,NL +3564888960,3564888991,GB 3564888992,3564889023,FR 3564889024,3564889087,NL -3564889088,3564889135,GB -3564889136,3564889167,NL -3564889168,3564889183,GB -3564889184,3564889215,NL -3564889216,3564889263,GB -3564889264,3564889279,NL -3564889280,3564889295,GB -3564889296,3564889311,NL -3564889312,3564889343,GB -3564889344,3564889375,NL -3564889376,3564889407,GB -3564889408,3564889511,NL -3564889512,3564889519,GB -3564889520,3564889631,NL -3564889632,3564889647,GB -3564889648,3564889663,NL -3564889664,3564889695,GB +3564889088,3564889119,GB +3564889120,3564889167,NL +3564889168,3564889215,GB +3564889216,3564889311,NL +3564889312,3564889375,GB +3564889376,3564889615,NL +3564889616,3564889623,DE +3564889624,3564889639,NL +3564889640,3564889647,GB +3564889648,3564889695,NL 3564889696,3564889727,DE -3564889728,3564889887,NL -3564889888,3564890239,GB -3564890240,3564890271,NL +3564889728,3564889791,NL +3564889792,3564889807,GB +3564889808,3564889839,BE +3564889840,3564889847,NL +3564889848,3564889855,GB +3564889856,3564889919,NL +3564889920,3564889983,GB +3564889984,3564890111,NL +3564890112,3564890143,GB +3564890144,3564890151,NL +3564890152,3564890159,GB +3564890160,3564890183,BE +3564890184,3564890191,GB +3564890192,3564890207,NL +3564890208,3564890231,GB +3564890232,3564890271,NL 3564890272,3564890303,GB 3564890304,3564890367,NL 3564890368,3564890399,FR 3564890400,3564890527,NL -3564890528,3564890543,GB -3564890544,3564890579,NL +3564890528,3564890535,BE +3564890536,3564890579,NL 3564890580,3564890591,GB 3564890592,3564890623,NL -3564890624,3564890703,GB -3564890704,3564890719,NL -3564890720,3564890751,GB -3564890752,3564890783,NL -3564890784,3564892431,GB -3564892432,3564892447,NL -3564892448,3564892463,GB -3564892464,3564892479,NL -3564892480,3564894207,GB -3564894208,3564896255,NL +3564890624,3564890639,BE +3564890640,3564890655,NL +3564890656,3564890663,IE +3564890664,3564890703,NL +3564890704,3564890735,GB +3564890736,3564890783,NL +3564890784,3564890799,GB +3564890800,3564890831,NL +3564890832,3564890847,BE +3564890848,3564890863,GB +3564890864,3564890879,BE +3564890880,3564890943,NL +3564890944,3564890991,BE +3564890992,3564891023,NL +3564891024,3564891391,GB +3564891392,3564891903,NL +3564891904,3564892415,GB +3564892416,3564892543,NL +3564892544,3564892575,GB +3564892576,3564892711,NL +3564892712,3564892735,GB +3564892736,3564892751,NL +3564892752,3564892767,GB +3564892768,3564892799,NL +3564892800,3564893039,GB +3564893040,3564893055,NL +3564893056,3564893375,GB +3564893376,3564893759,NL +3564893760,3564893951,GB +3564893952,3564895743,NL +3564895744,3564896255,GB 3564896256,3564904447,RU 3564904448,3564912639,DE 3564912640,3564920831,BG +3564920832,3564922879,ES +3564922880,3564927999,US +3564928000,3564929023,RU 3564929024,3564937215,AT -3564937216,3564941311,CS -3564941312,3564942591,CS -3564942592,3564942847,CS -3564942848,3564945407,CS +3564937216,3564945407,RS 3564945408,3564947175,GB 3564947176,3564947183,FR 3564947184,3564948063,GB 3564948064,3564948071,IE -3564948072,3564953647,GB +3564948072,3564948319,GB +3564948320,3564948351,IE +3564948352,3564953647,GB 3564953648,3564953651,CH -3564953652,3564954111,GB +3564953652,3564953727,GB +3564953728,3564953743,AT +3564953744,3564953744,GB +3564953745,3564953759,AT +3564953760,3564953791,GB +3564953792,3564953855,AT +3564953856,3564954111,GB 3564954112,3564954131,AT 3564954132,3564954139,GB 3564954140,3564954143,AT 3564954144,3564954155,GB 3564954156,3564954159,AT -3564954160,3564954175,GB +3564954160,3564954175,DE 3564954176,3564954183,AT 3564954184,3564954191,CH -3564954192,3564954199,AT -3564954200,3564954207,GB -3564954208,3564954211,AT +3564954192,3564954211,AT 3564954212,3564954231,GB 3564954232,3564954239,AT 3564954240,3564954303,GB 3564954304,3564954311,AT 3564954312,3564954367,GB 3564954368,3564954383,AT -3564954384,3564956160,GB -3564956161,3564956543,AT -3564956544,3564956671,GB -3564956672,3564956703,GR -3564956704,3564956719,AT -3564956720,3564956751,GB +3564954384,3564954415,GB +3564954416,3564954431,DE +3564954432,3564956160,GB +3564956161,3564956671,AT +3564956672,3564956687,GB +3564956688,3564956719,AT +3564956720,3564956735,GB +3564956736,3564956751,AT 3564956752,3564956767,US 3564956768,3564956831,AT 3564956832,3564956839,GB @@ -71536,7 +117145,8 @@ 3564956856,3564956903,GB 3564956904,3564956907,AT 3564956908,3564956911,CH -3564956912,3564956967,GB +3564956912,3564956927,AT +3564956928,3564956967,GB 3564956968,3564956971,CH 3564956972,3564956975,US 3564956976,3564956979,GB @@ -71546,9 +117156,7 @@ 3564957008,3564957023,GB 3564957024,3564957039,AT 3564957040,3564957087,GB -3564957088,3564957119,AT -3564957120,3564957183,GB -3564957184,3564957255,AT +3564957088,3564957255,AT 3564957256,3564957263,GB 3564957264,3564957439,AT 3564957440,3564957447,GB @@ -71556,7 +117164,9 @@ 3564957456,3564957459,AT 3564957460,3564957471,GB 3564957472,3564957499,AT -3564957500,3564957511,GB +3564957500,3564957503,GB +3564957504,3564957507,AT +3564957508,3564957511,GB 3564957512,3564957519,AT 3564957520,3564957527,GB 3564957528,3564957531,AT @@ -71567,7 +117177,9 @@ 3564957592,3564957595,GB 3564957596,3564957599,AT 3564957600,3564957607,GB -3564957608,3564957631,AT +3564957608,3564957615,AT +3564957616,3564957619,GB +3564957620,3564957631,AT 3564957632,3564957663,GB 3564957664,3564957671,AT 3564957672,3564957679,GB @@ -71588,38 +117200,38 @@ 3564958016,3564958111,GB 3564958112,3564958143,AT 3564958144,3564958147,GB -3564958148,3564958159,AT -3564958160,3564958175,GB -3564958176,3564958179,AT +3564958148,3564958155,AT +3564958156,3564958159,GB +3564958160,3564958179,AT 3564958180,3564958183,US 3564958184,3564958191,AT 3564958192,3564958207,GB 3564958208,3564958463,AT 3564958464,3564958487,GB -3564958488,3564958495,AT -3564958496,3564958719,GB +3564958488,3564958591,AT +3564958592,3564958719,GB 3564958720,3564958799,AT 3564958800,3564958807,GB -3564958808,3564958815,AT -3564958816,3564958816,GB -3564958817,3564958847,AT -3564958848,3564958912,GB -3564958913,3564958943,AT -3564958944,3564959008,GB -3564959009,3564959039,AT -3564959040,3564959075,GB +3564958808,3564958847,AT +3564958848,3564958911,GB +3564958912,3564958975,AT +3564958976,3564959007,NL +3564959008,3564959055,AT +3564959056,3564959075,GB 3564959076,3564959091,AT 3564959092,3564959095,GB 3564959096,3564959103,AT 3564959104,3564959119,GB 3564959120,3564959127,AT -3564959128,3564959191,GB +3564959128,3564959135,GB +3564959136,3564959155,AT +3564959156,3564959191,GB 3564959192,3564959195,AT 3564959196,3564959199,GB 3564959200,3564959227,AT -3564959228,3564959263,GB -3564959264,3564959295,AT -3564959296,3564959383,GB +3564959228,3564959231,GB +3564959232,3564959359,AT +3564959360,3564959383,GB 3564959384,3564959391,AT 3564959392,3564959399,SA 3564959400,3564959407,AT @@ -71632,14 +117244,14 @@ 3564959480,3564959487,GB 3564959488,3564959495,AT 3564959496,3564959499,GB -3564959500,3564959503,AT -3564959504,3564959511,GB -3564959512,3564959519,AT +3564959500,3564959519,AT 3564959520,3564959535,GB 3564959536,3564959551,AT 3564959552,3564959567,GB 3564959568,3564959579,AT -3564959580,3564959623,GB +3564959580,3564959583,GB +3564959584,3564959615,AT +3564959616,3564959623,GB 3564959624,3564959639,AT 3564959640,3564959655,GB 3564959656,3564959663,CH @@ -71648,38 +117260,44 @@ 3564959696,3564959711,AT 3564959712,3564959755,GB 3564959756,3564959759,AT -3564959760,3564959904,GB -3564959905,3564959935,AT -3564959936,3564960127,GB +3564959760,3564959775,GB +3564959776,3564959807,AT +3564959808,3564959839,GB +3564959840,3564959903,AT +3564959904,3564959904,GB +3564959905,3564959967,AT +3564959968,3564959999,GB +3564960000,3564960127,AT 3564960128,3564960135,DE -3564960136,3564960191,GB -3564960192,3564960195,AT +3564960136,3564960159,GB +3564960160,3564960195,AT 3564960196,3564960211,GB 3564960212,3564960223,AT 3564960224,3564960231,GB -3564960232,3564960383,AT -3564960384,3564960551,GB -3564960552,3564960559,AT +3564960232,3564960511,AT +3564960512,3564960543,GB +3564960544,3564960559,AT 3564960560,3564960615,GB 3564960616,3564960623,FR -3564960624,3564960635,GB -3564960636,3564960639,AT +3564960624,3564960631,GB +3564960632,3564960639,AT 3564960640,3564960767,GB -3564960768,3564960799,AT -3564960800,3564960871,GB -3564960872,3564960879,IT +3564960768,3564960879,AT 3564960880,3564960927,GB 3564960928,3564960959,AT 3564960960,3564960991,GB 3564960992,3564961007,AT 3564961008,3564961023,GB 3564961024,3564961079,AT -3564961080,3564961279,GB -3564961280,3564961311,AT +3564961080,3564961151,GB +3564961152,3564961311,AT 3564961312,3564961319,GB 3564961320,3564961791,AT 3564961792,3564969983,TR -3564969984,3564978175,DE +3564969984,3564972607,DE +3564972608,3564972631,AT +3564972632,3564972639,LI +3564972640,3564978175,DE 3564978176,3564986367,GB 3564986368,3564994559,DE 3564994560,3565002751,NL @@ -71687,25 +117305,29 @@ 3565007248,3565007251,SE 3565007252,3565027327,NO 3565027328,3565035519,PL -3565035520,3565038591,GB -3565038592,3565039615,DE -3565039616,3565040383,GB -3565040384,3565040639,DE -3565040640,3565041407,GB -3565041408,3565041663,FR -3565041664,3565042431,GB -3565042432,3565042687,US -3565042688,3565043711,GB -3565043712,3565045247,AT -3565045248,3565045503,SK -3565045504,3565051903,AT -3565051904,3565068287,GB +3565035520,3565036287,IE +3565036288,3565036543,GB +3565036544,3565037119,IE +3565037120,3565037135,GB +3565037136,3565037199,IE +3565037200,3565037215,GB +3565037216,3565037279,IE +3565037280,3565037567,GB +3565037568,3565037823,IE +3565037824,3565038591,GB +3565038592,3565038663,IE +3565038664,3565039615,GB +3565039616,3565041663,IE +3565041664,3565043711,GB +3565043712,3565047807,AT +3565047808,3565048063,LI +3565048064,3565051903,AT +3565051904,3565060095,IQ +3565060096,3565068287,GB 3565068288,3565076479,CH 3565076480,3565084671,DE 3565084672,3565092863,IS -3565092864,3565093055,GB -3565093056,3565093087,PS -3565093088,3565093391,GB +3565092864,3565093391,GB 3565093392,3565093399,NO 3565093400,3565096759,GB 3565096760,3565096767,IE @@ -71720,9 +117342,7 @@ 3565223936,3565240319,FR 3565240320,3565248511,IE 3565248512,3565256703,RU -3565256704,3565287231,NL -3565287232,3565287263,GB -3565287264,3565289471,NL +3565256704,3565289471,NL 3565289472,3565355007,DK 3565355008,3565420543,IT 3565420544,3565486079,GB @@ -71745,8 +117365,7 @@ 3565491712,3565491839,GB 3565491840,3565491903,IT 3565491904,3565491967,NL -3565491968,3565492223,DE -3565492224,3565492295,GB +3565491968,3565492295,GB 3565492296,3565492303,IE 3565492304,3565492319,GB 3565492320,3565492327,DE @@ -71854,95 +117473,181 @@ 3565518848,3565551615,TR 3565551616,3565578495,GB 3565578496,3565578751,CA -3565578752,3565682687,GB +3565578752,3565641487,GB +3565641488,3565641503,DE +3565641504,3565682687,GB 3565682688,3565688063,NL 3565688064,3565688319,GB 3565688320,3565748223,NL 3565748224,3565752407,GB +3565752408,3565752415,EU 3565752416,3565752463,GB +3565752464,3565752471,EU 3565752472,3565752479,GB +3565752480,3565752487,EU 3565752488,3565752535,GB +3565752536,3565752543,EU 3565752544,3565752839,GB +3565752840,3565752855,EU 3565752856,3565752879,GB +3565752880,3565752887,EU 3565752888,3565752983,GB +3565752984,3565752991,EU 3565752992,3565752999,GB +3565753000,3565753015,EU 3565753016,3565753031,GB +3565753032,3565753039,EU 3565753040,3565753071,GB +3565753072,3565753079,EU 3565753080,3565753183,GB +3565753184,3565753247,EU 3565753248,3565753279,GB +3565753280,3565753343,EU 3565753344,3565753791,GB +3565753792,3565753799,EU 3565753800,3565753815,GB +3565753816,3565753823,EU 3565753824,3565753831,GB +3565753832,3565753839,EU 3565753840,3565753847,GB +3565753848,3565753983,EU 3565753984,3565754367,GB +3565754368,3565754495,EU 3565754496,3565754511,GB +3565754512,3565754623,EU 3565754624,3565755263,GB +3565755264,3565755279,EU 3565755280,3565755359,GB +3565755360,3565755375,EU 3565755376,3565755583,GB +3565755584,3565755647,EU 3565755648,3565755695,GB +3565755696,3565755703,EU 3565755704,3565755727,GB +3565755728,3565755735,EU 3565755736,3565755831,GB +3565755832,3565755839,EU 3565755840,3565755847,GB +3565755848,3565755855,EU 3565755856,3565755871,GB +3565755872,3565755879,EU 3565755880,3565755919,GB +3565755920,3565755927,EU 3565755928,3565755935,GB +3565755936,3565755943,EU 3565755944,3565755959,GB +3565755960,3565755967,EU 3565755968,3565755999,GB +3565756000,3565756007,EU 3565756008,3565756063,GB +3565756064,3565756071,EU 3565756072,3565756087,GB +3565756088,3565756095,EU 3565756096,3565756119,GB +3565756120,3565756135,EU 3565756136,3565756159,GB +3565756160,3565756287,EU 3565756288,3565760783,GB +3565760784,3565760791,EU 3565760792,3565760799,GB +3565760800,3565760807,EU 3565760808,3565760823,GB +3565760824,3565760831,EU 3565760832,3565760855,GB +3565760856,3565760863,EU 3565760864,3565760935,GB +3565760936,3565760943,EU 3565760944,3565760967,GB +3565760968,3565760975,EU 3565760976,3565761007,GB +3565761008,3565761015,EU 3565761016,3565761279,GB +3565761280,3565761343,EU 3565761344,3565761535,GB +3565761536,3565761543,EU 3565761544,3565761599,GB +3565761600,3565761615,EU 3565761616,3565761631,GB +3565761632,3565761639,EU 3565761640,3565761647,GB +3565761648,3565761655,EU 3565761656,3565761687,GB +3565761688,3565761703,EU 3565761704,3565761727,GB +3565761728,3565761751,EU 3565761752,3565761783,GB +3565761784,3565761791,EU 3565761792,3565762047,GB 3565762048,3565762303,ZA +3565762304,3565762559,EU 3565762560,3565762815,GB +3565762816,3565763071,EU 3565763072,3565763455,GB +3565763456,3565763487,EU 3565763488,3565763599,GB +3565763600,3565763615,EU 3565763616,3565763671,GB +3565763672,3565763679,EU 3565763680,3565763703,GB +3565763704,3565763719,EU 3565763720,3565763735,GB +3565763736,3565763743,EU 3565763744,3565763751,GB +3565763752,3565763759,EU 3565763760,3565763799,GB +3565763800,3565763807,EU 3565763808,3565763815,GB +3565763816,3565763831,EU 3565763832,3565763839,GB +3565763840,3565763883,EU 3565763884,3565763891,GB +3565763892,3565764095,EU 3565764096,3565764183,GB +3565764184,3565764191,EU 3565764192,3565764207,GB +3565764208,3565764255,EU 3565764256,3565764367,GB +3565764368,3565764375,EU 3565764376,3565764439,GB +3565764440,3565764447,EU 3565764448,3565764455,GB +3565764456,3565764463,EU 3565764464,3565764551,GB +3565764552,3565764575,EU 3565764576,3565766655,GB +3565766656,3565766911,EU 3565766912,3565767167,GB +3565767168,3565767175,EU 3565767176,3565767255,GB +3565767256,3565767271,EU 3565767272,3565767287,GB +3565767288,3565767295,EU 3565767296,3565767351,GB +3565767352,3565767359,EU 3565767360,3565767399,GB +3565767400,3565767407,EU 3565767408,3565767439,GB +3565767440,3565767455,EU 3565767456,3565767487,GB +3565767488,3565767503,EU 3565767504,3565767599,GB +3565767600,3565767615,EU 3565767616,3565767631,GB +3565767632,3565767679,EU 3565767680,3565767999,GB +3565768000,3565768207,EU 3565768208,3565768271,GB +3565768272,3565768279,EU 3565768280,3565768295,GB +3565768296,3565768311,EU 3565768312,3565768335,GB +3565768336,3565768447,EU 3565768448,3565768575,GB +3565768576,3565768703,EU 3565768704,3565768983,GB +3565768984,3565769215,EU 3565769216,3565769471,GB +3565769472,3565777919,EU 3565777920,3565813759,GB 3565813760,3565879295,SA 3565879296,3566010367,GB @@ -71962,166 +117667,266 @@ 3566439632,3566469119,IE 3566469120,3566534655,GB 3566534656,3566551039,DE -3566551040,3566600191,FI +3566551040,3566574747,FI +3566574748,3566574751,SE +3566574752,3566600191,FI 3566600192,3566665727,IL 3566665728,3566723071,SE -3566723072,3566723327,FR -3566723328,3566731263,SE -3566731264,3566739455,CH +3566723072,3566723327,RU +3566723328,3566739455,SE 3566739456,3566747647,RU 3566747648,3566764031,GR 3566764032,3566796799,AT -3566796800,3566816511,NL +3566796800,3566803455,NL +3566803456,3566803711,A2 +3566803712,3566816511,NL 3566816512,3566816767,US 3566816768,3566862335,NL 3566862336,3566895103,TR 3566895104,3566897279,KZ 3566897280,3566897311,KG -3566897312,3566905939,KZ -3566905940,3566905943,DE -3566905944,3566927871,KZ -3566927872,3566960127,FR -3566960128,3566960143,GB -3566960144,3566993407,FR +3566897312,3566927871,KZ +3566927872,3566993407,FR 3566993408,3567058943,TR -3567058944,3567108255,FR +3567058944,3567103047,FR +3567103048,3567103055,IT +3567103056,3567108255,FR 3567108256,3567108263,SE 3567108264,3567124479,FR +3567124480,3567124991,EU 3567124992,3567125023,GB +3567125024,3567125247,EU 3567125248,3567125503,GB +3567125504,3567126687,EU 3567126688,3567126759,GB +3567126760,3567127551,EU 3567127552,3567127807,GB +3567127808,3567129855,EU 3567129856,3567129887,GB +3567129888,3567130015,EU 3567130016,3567130079,GB +3567130080,3567131383,EU 3567131384,3567131647,GB +3567131648,3567133215,EU 3567133216,3567133247,GB +3567133248,3567133367,EU 3567133368,3567133375,GB +3567133376,3567134207,EU 3567134208,3567134335,GB +3567134336,3567134847,EU 3567134848,3567134975,GB +3567134976,3567135999,EU 3567136000,3567136255,GB +3567136256,3567136511,EU 3567136512,3567136575,GB +3567136576,3567136639,EU 3567136640,3567136671,GB +3567136672,3567136767,EU 3567136768,3567136895,GB +3567136896,3567137023,EU 3567137024,3567137279,GB +3567137280,3567137599,EU 3567137600,3567137663,GB +3567137664,3567137987,EU 3567137988,3567137991,GB +3567137992,3567137999,EU 3567138000,3567138003,GB +3567138004,3567138039,EU 3567138040,3567138047,GB +3567138048,3567140095,EU 3567140096,3567140351,GB +3567140352,3567140863,EU 3567140864,3567140927,GB +3567140928,3567141631,EU 3567141632,3567141887,GB +3567141888,3567142271,EU 3567142272,3567142399,GB +3567142400,3567143431,EU 3567143432,3567143439,GB -3567143448,3567143455,GB +3567143440,3567143519,EU 3567143520,3567143551,GB +3567143552,3567143679,EU 3567143680,3567143687,GB +3567143688,3567143871,EU 3567143872,3567143935,GB +3567143936,3567143951,EU 3567143952,3567143967,GB -3567144048,3567144063,GB +3567143968,3567144171,EU 3567144172,3567144175,GB +3567144176,3567144319,EU 3567144320,3567144447,GB +3567144448,3567144767,EU 3567144768,3567144831,GB +3567144832,3567147527,EU 3567147528,3567147535,GB +3567147536,3567147551,EU 3567147552,3567147559,GB -3567147936,3567147967,GB +3567147560,3567148519,EU 3567148520,3567148527,GB +3567148528,3567148799,EU 3567148800,3567149055,GB +3567149056,3567149087,EU 3567149088,3567149119,GB +3567149120,3567149903,EU 3567149904,3567149911,GB +3567149912,3567149919,EU 3567149920,3567149935,GB -3567151104,3567151199,GB +3567149936,3567151135,EU +3567151136,3567151199,GB +3567151200,3567151231,EU 3567151232,3567151263,GB +3567151264,3567151999,EU 3567152000,3567152127,GB +3567152128,3567152159,EU 3567152160,3567152191,GB +3567152192,3567152255,EU 3567152256,3567152383,GB +3567152384,3567152391,EU 3567152392,3567152407,GB +3567152408,3567152639,EU 3567152640,3567152647,GB +3567152648,3567152663,EU 3567152664,3567152671,GB -3567152736,3567152751,GB +3567152672,3567152743,EU +3567152744,3567152751,GB +3567152752,3567152831,EU 3567152832,3567152863,GB +3567152864,3567152959,EU 3567152960,3567152991,GB +3567152992,3567153023,EU 3567153024,3567153055,GB -3567153600,3567153623,GB +3567153056,3567153599,EU +3567153600,3567153607,GB +3567153608,3567153615,EU +3567153616,3567153623,GB +3567153624,3567153647,EU 3567153648,3567153663,GB +3567153664,3567153687,EU 3567153688,3567153703,GB +3567153704,3567153719,EU 3567153720,3567153727,GB +3567153728,3567153823,EU 3567153824,3567153847,GB +3567153848,3567154303,EU 3567154304,3567154367,GB +3567154368,3567155199,EU 3567155200,3567155967,GB +3567155968,3567156415,EU 3567156416,3567156607,GB -3567156992,3567157247,GB +3567156608,3567157247,EU 3567157248,3567165439,CZ 3567165440,3567169535,RU +3567169536,3567173631,MK 3567173632,3567239167,GB -3567239168,3567243263,NL -3567247360,3567250143,NL +3567239168,3567250143,NL +3567250144,3567250175,EU 3567250176,3567250943,NL +3567250944,3567255551,EU 3567255552,3567321087,PL -3567321088,3567333983,GB -3567333984,3567334015,US -3567334016,3567353855,GB +3567321088,3567323007,GB +3567323008,3567323023,CH +3567323024,3567323135,GB +3567323136,3567323391,IE +3567323392,3567324479,GB +3567324480,3567324543,ES +3567324544,3567324559,GB +3567324560,3567324575,ES +3567324576,3567324607,GB +3567324608,3567324671,ES +3567324672,3567325119,GB +3567325120,3567325135,ES +3567325136,3567329711,GB +3567329712,3567329727,IE +3567329728,3567331743,GB +3567331744,3567331775,IE +3567331776,3567350807,GB +3567350808,3567350815,US +3567350816,3567350839,GB +3567350840,3567350847,CH +3567350848,3567350935,GB +3567350936,3567350943,CH +3567350944,3567352479,GB +3567352480,3567352487,NL +3567352488,3567352511,GB +3567352512,3567352519,FR +3567352520,3567352759,GB +3567352760,3567352767,NL +3567352768,3567353855,GB 3567353856,3567386623,CH 3567386624,3567386879,GB 3567386880,3567386883,DE 3567386884,3567386975,GB 3567386976,3567387007,DE 3567387008,3567387071,GB -3567387072,3567387135,DE -3567387136,3567387439,GB +3567387072,3567387391,DE +3567387392,3567387439,GB 3567387440,3567387455,DE -3567387456,3567387471,GB -3567387472,3567387539,DE +3567387456,3567387487,GB +3567387488,3567387539,DE 3567387540,3567387543,GB 3567387544,3567387547,DE -3567387548,3567387567,GB -3567387568,3567388031,DE +3567387548,3567387583,GB +3567387584,3567388031,DE 3567388032,3567388159,GB 3567388160,3567388399,DE 3567388400,3567388415,GB -3567388416,3567388479,DE -3567388480,3567388543,GB +3567388416,3567388511,DE +3567388512,3567388543,GB 3567388544,3567388607,DE 3567388608,3567388671,GB 3567388672,3567388927,CZ 3567388928,3567389183,DE 3567389184,3567389695,GB -3567389696,3567390847,DE -3567390848,3567390879,GB -3567390880,3567390975,DE -3567390976,3567391231,GB -3567391232,3567391743,DE -3567391744,3567392767,GB -3567392768,3567392895,DE -3567392896,3567393023,GB +3567389696,3567390975,DE +3567390976,3567391107,GB +3567391108,3567391111,DE +3567391112,3567391147,GB +3567391148,3567391151,DE +3567391152,3567391231,GB +3567391232,3567391615,DE +3567391616,3567391759,GB +3567391760,3567391791,DE +3567391792,3567391807,GB +3567391808,3567391839,DE +3567391840,3567392767,GB +3567392768,3567393023,DE 3567393024,3567393279,FR -3567393280,3567394975,GB +3567393280,3567393535,HU +3567393536,3567394975,GB 3567394976,3567395007,DE 3567395008,3567395071,GB 3567395072,3567395327,DE 3567395328,3567396863,GB 3567396864,3567397119,DE -3567397120,3567397887,GB +3567397120,3567397375,GB +3567397376,3567397503,ES +3567397504,3567397887,GB 3567397888,3567398143,DE -3567398144,3567398655,GB +3567398144,3567398191,RO +3567398192,3567398199,DE +3567398200,3567398399,RO +3567398400,3567398655,GB 3567398656,3567398911,DE 3567398912,3567398991,GB 3567398992,3567399031,DE 3567399032,3567399039,GB -3567399040,3567399055,DE -3567399056,3567399071,GB -3567399072,3567399087,DE -3567399088,3567399167,GB -3567399168,3567399183,DE -3567399184,3567399199,GB -3567399200,3567399423,DE -3567399424,3567399487,GB -3567399488,3567399647,DE -3567399648,3567399687,GB +3567399040,3567399047,DE +3567399048,3567399071,GB +3567399072,3567399103,DE +3567399104,3567399167,GB +3567399168,3567399263,DE +3567399264,3567399295,GB +3567399296,3567399391,DE +3567399392,3567399423,GB +3567399424,3567399439,DE +3567399440,3567399487,GB +3567399488,3567399679,DE +3567399680,3567399687,GB 3567399688,3567399695,DE -3567399696,3567399711,GB -3567399712,3567399807,DE -3567399808,3567399871,GB -3567399872,3567400703,DE +3567399696,3567399743,GB +3567399744,3567399871,DE +3567399872,3567399935,GB +3567399936,3567400703,DE 3567400704,3567400735,GB 3567400736,3567400751,DE 3567400752,3567400959,GB @@ -72130,11 +117935,9 @@ 3567401504,3567401519,DE 3567401520,3567401543,GB 3567401544,3567401551,DE -3567401552,3567401583,GB -3567401584,3567401599,DE -3567401600,3567401727,GB -3567401728,3567402367,DE -3567402368,3567402495,GB +3567401552,3567401727,GB +3567401728,3567402239,DE +3567402240,3567402495,GB 3567402496,3567403007,DE 3567403008,3567419391,IT 3567419392,3567427583,SA @@ -72148,15 +117951,10 @@ 3567436896,3567441375,GB 3567441376,3567441407,NL 3567441408,3567444223,GB -3567444224,3567444475,TZ -3567444476,3567444479,NL +3567444224,3567444479,TZ 3567444480,3567445951,GB 3567445952,3567445983,NL -3567445984,3567446367,GB -3567446368,3567446399,CH -3567446400,3567446607,GB -3567446608,3567446623,IT -3567446624,3567452031,GB +3567445984,3567452031,GB 3567452032,3567452047,GR 3567452048,3567452159,GB 3567452160,3567507455,ES @@ -72166,122 +117964,135 @@ 3567513600,3567517695,ES 3567517696,3567583231,RU 3567583232,3567583487,AT +3567583488,3567583743,EU 3567583744,3567583871,AT +3567583872,3567583935,EU 3567583936,3567583999,AT +3567584000,3567584255,EU 3567584256,3567584383,AT +3567584384,3567584399,EU 3567584400,3567584407,AT +3567584408,3567584511,EU 3567584512,3567584639,AT +3567584640,3567585791,EU +3567585792,3567586303,GB +3567586304,3567587327,EU 3567587328,3567591423,GB 3567591424,3567599615,IT -3567599616,3567606271,NL -3567606272,3567606783,DZ -3567606784,3567615999,NL +3567599616,3567615999,NL 3567616000,3567616511,BD -3567616512,3567617087,GB +3567616512,3567616527,A2 +3567616528,3567616535,GB +3567616536,3567616575,A2 +3567616576,3567616583,GB +3567616584,3567617087,A2 3567617088,3567617119,NG -3567617120,3567617151,GB +3567617120,3567617151,A2 3567617152,3567617279,NG 3567617280,3567617535,IN 3567617536,3567617791,KE 3567617792,3567618047,NG 3567618048,3567619071,IN 3567619072,3567619075,NG -3567619076,3567619087,GB +3567619076,3567619087,A2 3567619088,3567619095,NG -3567619096,3567619103,GB +3567619096,3567619103,A2 3567619104,3567619111,KE -3567619112,3567619135,GB +3567619112,3567619135,A2 3567619136,3567619583,NG 3567619584,3567620095,TZ -3567620096,3567620351,GB +3567620096,3567620351,A2 3567620352,3567620479,TZ -3567620480,3567620623,GB +3567620480,3567620623,A2 3567620624,3567620631,PK 3567620632,3567620639,IN 3567620640,3567620679,PK -3567620680,3567620695,GB +3567620680,3567620695,A2 3567620696,3567620719,PK -3567620720,3567620727,GB +3567620720,3567620727,A2 3567620728,3567620735,IN -3567620736,3567620863,GB +3567620736,3567620863,A2 3567620864,3567620927,NG -3567620928,3567620931,GB +3567620928,3567620931,A2 3567620932,3567620935,TZ 3567620936,3567620959,KE -3567620960,3567620991,GB +3567620960,3567620991,A2 3567620992,3567621055,NG 3567621056,3567621119,KE -3567621120,3567621631,GB +3567621120,3567621375,GB +3567621376,3567621631,A2 3567621632,3567621887,ID 3567621888,3567621895,TZ 3567621896,3567621903,KE 3567621904,3567621911,NG 3567621912,3567621919,TZ 3567621920,3567621951,NG -3567621952,3567622655,GB +3567621952,3567622655,A2 3567622656,3567622951,KE -3567622952,3567622959,GB +3567622952,3567622959,A2 3567622960,3567622963,TZ 3567622964,3567622967,NG -3567622968,3567622975,GB +3567622968,3567622975,A2 3567622976,3567623039,TZ 3567623040,3567623055,GA 3567623056,3567623071,NG 3567623072,3567623087,TZ -3567623088,3567623095,GB +3567623088,3567623095,A2 3567623096,3567623103,GA 3567623104,3567623135,TZ -3567623136,3567623143,GB +3567623136,3567623143,A2 3567623144,3567623151,TZ -3567623152,3567623167,GB +3567623152,3567623167,A2 3567623168,3567623423,KE -3567623424,3567623471,GB +3567623424,3567623471,A2 3567623472,3567623479,KE -3567623480,3567623727,GB +3567623480,3567623727,A2 3567623728,3567623759,PK -3567623760,3567623767,GB +3567623760,3567623767,A2 3567623768,3567623775,PK -3567623776,3567623791,GB +3567623776,3567623791,A2 3567623792,3567623839,PK -3567623840,3567623935,GB +3567623840,3567623935,A2 3567623936,3567624191,PK 3567624192,3567624447,GB 3567624448,3567625727,TZ -3567625728,3567625983,PK +3567625728,3567625983,CG 3567625984,3567626239,KE 3567626240,3567627008,NG -3567627009,3567629311,GB +3567627009,3567629311,A2 3567629312,3567630207,TJ -3567630208,3567648767,GB +3567630208,3567647487,A2 +3567647488,3567648767,GB 3567648768,3567665151,BE 3567665152,3567673343,ES -3567673344,3567674095,AT -3567674096,3567674111,DE -3567674112,3567675655,AT -3567675656,3567675663,DE -3567675664,3567675671,AT -3567675672,3567675759,DE -3567675760,3567676159,AT -3567676160,3567676287,DE -3567676288,3567681535,AT +3567673344,3567673647,AT +3567673648,3567673655,GI +3567673656,3567681535,AT 3567681536,3567714303,ES 3567714304,3567715327,GB +3567715328,3567715583,EU +3567715584,3567715839,GB +3567715840,3567716351,EU 3567716352,3567716383,GB +3567716384,3567716607,EU 3567716608,3567716639,IL +3567716640,3567716943,EU 3567716944,3567717119,GB 3567717120,3567717375,DE 3567717376,3567717631,GB 3567717632,3567717679,DE +3567717680,3567717759,EU 3567717760,3567717887,DE 3567717888,3567718015,GB +3567718016,3567718143,EU 3567718144,3567718399,CH 3567718400,3567719423,US 3567719424,3567719679,GB +3567719680,3567779839,EU 3567779840,3567845375,DE 3567845376,3567861759,GB 3567861760,3567878143,NO -3567878144,3567910911,DE -3567910912,3567976447,ES +3567878144,3567976447,ES 3567976448,3568041983,IT 3568041984,3568107519,DE 3568107520,3568153759,GB @@ -72294,12 +118105,24 @@ 3568309920,3568309951,RU 3568309952,3568310015,BY 3568310016,3568369663,RU -3568369664,3568369743,IT -3568369744,3568369751,FR -3568369752,3568435199,IT -3568443392,3568500735,NL +3568369664,3568435199,IT +3568435200,3568443391,UA +3568443392,3568476159,NL +3568476160,3568484351,DK +3568484352,3568492543,NL +3568492544,3568500735,RS 3568500736,3568566271,IL -3568566272,3568599039,FR +3568566272,3568574967,FR +3568574968,3568574975,A2 +3568574976,3568577151,FR +3568577152,3568577167,A2 +3568577168,3568577231,FR +3568577232,3568577239,A2 +3568577240,3568583783,FR +3568583784,3568583791,A2 +3568583792,3568595079,FR +3568595080,3568595087,A2 +3568595088,3568599039,FR 3568599040,3568631807,PL 3568631808,3568697343,SE 3568697344,3568730111,PL @@ -72313,40 +118136,22 @@ 3568812032,3568828415,ES 3568828416,3568829631,DE 3568829632,3568829639,CH -3568829640,3568831343,DE -3568831344,3568831351,CN -3568831352,3568836247,DE -3568836248,3568836255,NL -3568836256,3568848791,DE +3568829640,3568848791,DE 3568848792,3568848799,PL 3568848800,3568848871,DE 3568848872,3568848879,GB 3568848880,3568876159,DE 3568876160,3568876287,ES -3568876288,3568877583,DE -3568877584,3568877591,NL -3568877592,3568916399,DE +3568876288,3568916399,DE 3568916400,3568916407,IT -3568916408,3568937103,DE -3568937104,3568937111,SK -3568937112,3568938311,DE +3568916408,3568938311,DE 3568938312,3568938319,FI 3568938320,3568939519,DE 3568939520,3568939527,IT -3568939528,3568946663,DE -3568946664,3568946671,IT -3568946672,3568959487,DE -3568959488,3568992255,AT -3568992256,3569000447,PL -3569000448,3569004543,AT -3569004544,3569008447,FR -3569008448,3569017087,AT -3569017088,3569018879,FR -3569018880,3569024959,AT -3569024960,3569025023,NO +3568939528,3568959487,DE +3568959488,3569025023,AT 3569025024,3569057791,NL -3569057792,3569068031,GB -3569068032,3569068543,DE +3569057792,3569068543,GB 3569068544,3569068671,BG 3569068672,3569068951,GB 3569068952,3569068991,DE @@ -72367,9 +118172,7 @@ 3569239232,3569239263,LU 3569239264,3569239519,BE 3569239520,3569239551,LU -3569239552,3569239903,BE -3569239904,3569239935,LU -3569239936,3569239983,BE +3569239552,3569239983,BE 3569239984,3569239999,BN 3569240000,3569240031,BE 3569240032,3569240063,FR @@ -72379,13 +118182,7 @@ 3569241888,3569241903,LU 3569241904,3569242047,BE 3569242048,3569242111,LU -3569242112,3569242143,BE -3569242144,3569242175,AU -3569242176,3569242551,BE -3569242552,3569242559,LU -3569242560,3569242879,BE -3569242880,3569243135,US -3569243136,3569243903,BE +3569242112,3569243903,BE 3569243904,3569244031,NL 3569244032,3569244303,BE 3569244304,3569244319,LU @@ -72393,29 +118190,18 @@ 3569245696,3569245727,LU 3569245728,3569250879,BE 3569250880,3569250895,LU -3569250896,3569250927,BE -3569250928,3569250935,CA -3569250936,3569251071,BE +3569250896,3569251071,BE 3569251072,3569251327,LU 3569251328,3569251839,US 3569251840,3569252991,BE 3569252992,3569253007,LU 3569253008,3569253095,BE 3569253096,3569253103,LU -3569253104,3569253311,BE -3569253312,3569253343,LU -3569253344,3569254175,BE -3569254176,3569254207,US -3569254208,3569254911,BE -3569254912,3569254959,LU -3569254960,3569254975,BE -3569254976,3569255055,LU -3569255056,3569255071,BE +3569253104,3569255007,BE +3569255008,3569255039,LU +3569255040,3569255071,BE 3569255072,3569255103,LU -3569255104,3569258783,BE -3569258784,3569258815,LU -3569258816,3569258847,US -3569258848,3569258975,BE +3569255104,3569258975,BE 3569258976,3569259007,LU 3569259008,3569271815,BE 3569271816,3569271823,LU @@ -72425,24 +118211,15 @@ 3569271912,3569271919,DE 3569271920,3569271935,BE 3569271936,3569271943,IT -3569271944,3569271959,BE -3569271960,3569271963,LU -3569271964,3569272063,BE +3569271944,3569272063,BE 3569272064,3569272079,LU -3569272080,3569272223,BE -3569272224,3569272255,LU -3569272256,3569273167,BE +3569272080,3569273167,BE 3569273168,3569273183,LU -3569273184,3569273751,BE -3569273752,3569273759,LU -3569273760,3569273791,BE +3569273184,3569273791,BE 3569273792,3569273823,LU 3569273824,3569273935,BE 3569273936,3569273951,LI -3569273952,3569274143,BE -3569274144,3569274175,CA -3569274176,3569274207,LU -3569274208,3569274303,BE +3569273952,3569274303,BE 3569274304,3569274311,LU 3569274312,3569274335,BE 3569274336,3569274383,LU @@ -72452,9 +118229,7 @@ 3569274688,3569274719,LU 3569274720,3569277183,BE 3569277184,3569277439,LU -3569277440,3569278311,BE -3569278312,3569278319,LU -3569278320,3569278703,BE +3569277440,3569278703,BE 3569278704,3569278719,NL 3569278720,3569279223,BE 3569279224,3569279231,US @@ -72465,7 +118240,9 @@ 3569352704,3569483775,RU 3569483776,3569614847,FR 3569614848,3569680383,GB -3569680384,3569710959,SK +3569680384,3569683711,SK +3569683712,3569683719,IQ +3569683720,3569710959,SK 3569710960,3569710975,NL 3569710976,3569713151,SK 3569713152,3569729535,AT @@ -72641,9 +118418,7 @@ 3569740704,3569740799,NL 3569740800,3569741311,FR 3569741312,3569741823,BE -3569741824,3569741843,FR -3569741844,3569741859,NL -3569741860,3569742335,FR +3569741824,3569742335,FR 3569742336,3569742351,BE 3569742352,3569742383,FR 3569742384,3569742399,BE @@ -72726,46 +118501,50 @@ 3569745920,3569811455,FR 3569811456,3569830463,IL 3569830464,3569830527,GB -3569830528,3569839231,IL -3569839232,3569839359,GB -3569839360,3569858559,IL -3569858560,3569858815,GB -3569858816,3569873279,IL -3569873280,3569873407,GB -3569873408,3569875711,IL -3569875712,3569875751,GB -3569875752,3569875775,IL -3569875776,3569875967,GB -3569875968,3569876479,IL -3569876480,3569876735,GB -3569876736,3569876991,IL -3569876992,3569885183,CS -3569885184,3569885439,CS -3569885440,3569892351,CS -3569892352,3569892607,CS -3569892608,3569896447,CS -3569896448,3569896703,CS -3569896704,3569898495,CS -3569898496,3569899007,CS -3569899008,3569942527,CS -3569942528,3570073599,DE -3570073600,3570076943,NL -3570076944,3570076951,PH -3570076952,3570081791,NL -3570081792,3570096831,CH -3570096832,3570096895,US -3570096896,3570106367,CH +3569830528,3569839187,IL +3569839188,3569839191,A2 +3569839192,3569839359,IL +3569839360,3569839615,A2 +3569839616,3569846527,IL +3569846528,3569846783,A2 +3569846784,3569851935,IL +3569851936,3569851951,A2 +3569851952,3569851967,IL +3569851968,3569851999,A2 +3569852000,3569852031,IL +3569852032,3569852047,A2 +3569852048,3569862143,IL +3569862144,3569862159,A2 +3569862160,3569873279,IL +3569873280,3569873407,A2 +3569873408,3569876991,IL +3569876992,3569942527,RS +3569942528,3570064759,DE +3570064760,3570064767,A2 +3570064768,3570073599,DE +3570073600,3570081791,NL +3570081792,3570102463,CH +3570102464,3570102479,ES +3570102480,3570106367,CH 3570106368,3570139135,PL 3570139136,3570170079,DE 3570170080,3570170111,BE 3570170112,3570171903,DE 3570171904,3570204671,NL -3570204672,3570270207,GR +3570204672,3570215679,GR +3570215680,3570215807,DE +3570215808,3570223103,GR +3570223104,3570223231,DE +3570223232,3570236159,GR +3570236160,3570236415,DE +3570236416,3570236927,GR +3570236928,3570237183,DE +3570237184,3570241791,GR +3570241792,3570242047,DE +3570242048,3570270207,GR 3570270208,3570335743,NL 3570335744,3570401279,GB -3570401280,3570442687,FR -3570442688,3570442695,IT -3570442696,3570466815,FR +3570401280,3570466815,FR 3570466816,3570507439,SE 3570507440,3570507455,CH 3570507456,3570532351,SE @@ -72785,7 +118564,11 @@ 3570663424,3570728959,GB 3570728960,3570729983,FI 3570729984,3570731007,SE -3570731008,3570756191,FI +3570731008,3570751427,FI +3570751428,3570751431,AX +3570751432,3570753311,FI +3570753312,3570753327,AX +3570753328,3570756191,FI 3570756192,3570756223,RU 3570756224,3570760543,FI 3570760544,3570760575,RU @@ -72794,6 +118577,7 @@ 3570860032,3570892799,CH 3570892800,3570925567,SA 3570925568,3570991103,IT +3570991104,3571023871,MA 3571023872,3571056639,SE 3571056640,3571122175,DE 3571122176,3571187711,GB @@ -72823,72 +118607,481 @@ 3571272576,3571277119,BE 3571277120,3571277151,DE 3571277152,3571286015,BE -3571286016,3571321055,DE -3571321056,3571321087,GB -3571321088,3571326255,DE +3571286016,3571318911,DE +3571318912,3571319167,GB +3571319168,3571319295,DE +3571319296,3571319679,GB +3571319680,3571319935,DE +3571319936,3571320063,GB +3571320064,3571320575,DE +3571320576,3571320855,GB +3571320856,3571320863,DE +3571320864,3571320927,GB +3571320928,3571320991,DE +3571320992,3571321023,GB +3571321024,3571321055,DE +3571321056,3571321151,GB +3571321152,3571321247,DE +3571321248,3571321279,GB +3571321280,3571321727,DE +3571321728,3571321791,GB +3571321792,3571321855,DE +3571321856,3571321887,GB +3571321888,3571321919,DE +3571321920,3571321983,GB +3571321984,3571321999,DE +3571322000,3571322015,GB +3571322016,3571322111,DE +3571322112,3571322559,GB +3571322560,3571322591,DE +3571322592,3571322879,GB +3571322880,3571323135,DE +3571323136,3571323391,GB +3571323392,3571323455,DE +3571323456,3571323487,GB +3571323488,3571323519,DE +3571323520,3571323711,GB +3571323712,3571323743,DE +3571323744,3571323775,GB +3571323776,3571323903,DE +3571323904,3571323935,GB +3571323936,3571324031,DE +3571324032,3571324095,GB +3571324096,3571324127,DE +3571324128,3571324415,GB +3571324416,3571324527,DE +3571324528,3571324927,GB +3571324928,3571324959,DE +3571324960,3571324991,GB +3571324992,3571325023,DE +3571325024,3571325183,GB +3571325184,3571325247,DE +3571325248,3571325407,GB +3571325408,3571325439,DE +3571325440,3571325567,GB +3571325568,3571325631,DE +3571325632,3571326207,GB +3571326208,3571326255,DE 3571326256,3571326259,BE -3571326260,3571337471,DE -3571337472,3571337599,NL -3571337600,3571343495,DE +3571326260,3571326263,DE +3571326264,3571326463,GB +3571326464,3571326591,DE +3571326592,3571326975,GB +3571326976,3571327039,DE +3571327040,3571327135,GB +3571327136,3571327167,DE +3571327168,3571327615,GB +3571327616,3571327679,DE +3571327680,3571327711,GB +3571327712,3571328063,DE +3571328064,3571328223,GB +3571328224,3571328255,DE +3571328256,3571328447,GB +3571328448,3571328543,DE +3571328544,3571328767,GB +3571328768,3571328831,DE +3571328832,3571328863,GB +3571328864,3571329119,DE +3571329120,3571329183,GB +3571329184,3571329247,DE +3571329248,3571329439,GB +3571329440,3571329455,DE +3571329456,3571329535,GB +3571329536,3571329791,DE +3571329792,3571330047,GB +3571330048,3571330079,DE +3571330080,3571330111,GB +3571330112,3571330175,DE +3571330176,3571330239,GB +3571330240,3571330271,DE +3571330272,3571330911,GB +3571330912,3571331071,DE +3571331072,3571331455,GB +3571331456,3571331519,DE +3571331520,3571331647,GB +3571331648,3571331775,DE +3571331776,3571331807,GB +3571331808,3571332415,DE +3571332416,3571332479,GB +3571332480,3571332607,DE +3571332608,3571332735,GB +3571332736,3571332751,DE +3571332752,3571332831,GB +3571332832,3571333631,DE +3571333632,3571333759,GB +3571333760,3571333791,DE +3571333792,3571333887,GB +3571333888,3571333951,DE +3571333952,3571334079,GB +3571334080,3571334111,DE +3571334112,3571334175,GB +3571334176,3571334207,DE +3571334208,3571334303,GB +3571334304,3571334335,DE +3571334336,3571334911,GB +3571334912,3571334943,DE +3571334944,3571335103,GB +3571335104,3571335455,DE +3571335456,3571335487,GB +3571335488,3571335519,DE +3571335520,3571335583,GB +3571335584,3571335647,DE +3571335648,3571335807,GB +3571335808,3571335935,DE +3571335936,3571336063,GB +3571336064,3571336191,DE +3571336192,3571336223,GB +3571336224,3571336255,DE +3571336256,3571336319,GB +3571336320,3571336447,DE +3571336448,3571336927,GB +3571336928,3571336959,DE +3571336960,3571337215,GB +3571337216,3571337279,DE +3571337280,3571337407,GB +3571337408,3571337439,DE +3571337440,3571338367,GB +3571338368,3571338751,DE +3571338752,3571338879,GB +3571338880,3571338975,DE +3571338976,3571339135,GB +3571339136,3571339199,DE +3571339200,3571339391,GB +3571339392,3571339583,DE +3571339584,3571339903,GB +3571339904,3571339967,DE +3571339968,3571340095,GB +3571340096,3571340159,DE +3571340160,3571340383,GB +3571340384,3571340447,DE +3571340448,3571340511,GB +3571340512,3571340543,DE +3571340544,3571340799,GB +3571340800,3571341375,DE +3571341376,3571341487,GB +3571341488,3571341503,DE +3571341504,3571341567,GB +3571341568,3571341823,DE +3571341824,3571342015,GB +3571342016,3571342047,DE +3571342048,3571342079,GB +3571342080,3571342591,DE +3571342592,3571342623,GB +3571342624,3571342655,DE +3571342656,3571342719,GB +3571342720,3571342751,DE +3571342752,3571343039,GB +3571343040,3571343071,DE +3571343072,3571343103,GB +3571343104,3571343359,DE +3571343360,3571343391,GB +3571343392,3571343455,DE +3571343456,3571343487,GB +3571343488,3571343495,DE 3571343496,3571343503,ES -3571343504,3571347455,DE +3571343504,3571343515,DE +3571343516,3571343519,GB +3571343520,3571343551,DE +3571343552,3571343615,GB +3571343616,3571343871,DE +3571343872,3571344095,GB +3571344096,3571344127,DE +3571344128,3571344191,GB +3571344192,3571344255,DE +3571344256,3571345215,GB +3571345216,3571346463,DE +3571346464,3571346495,GB +3571346496,3571346559,DE +3571346560,3571346591,GB +3571346592,3571346623,DE +3571346624,3571346831,GB +3571346832,3571346847,DE +3571346848,3571346879,GB +3571346880,3571346911,DE +3571346912,3571347071,GB +3571347072,3571347191,DE +3571347192,3571347199,GB +3571347200,3571347455,DE 3571347456,3571347711,BE -3571347712,3571349743,DE +3571347712,3571347967,GB +3571347968,3571348223,DE +3571348224,3571348255,GB +3571348256,3571348287,DE +3571348288,3571348383,GB +3571348384,3571348399,DE +3571348400,3571348447,GB +3571348448,3571348511,DE +3571348512,3571348543,GB +3571348544,3571348735,DE +3571348736,3571348991,GB +3571348992,3571349135,DE +3571349136,3571349151,GB +3571349152,3571349231,DE +3571349232,3571349239,GB +3571349240,3571349263,DE +3571349264,3571349311,GB +3571349312,3571349343,DE +3571349344,3571349743,GB 3571349744,3571349759,CH 3571349760,3571349791,DE 3571349792,3571349799,SE 3571349800,3571349807,DE 3571349808,3571349815,BE 3571349816,3571349819,SE -3571349820,3571364951,DE -3571364952,3571364955,GB -3571364956,3571366399,DE +3571349820,3571349887,GB +3571349888,3571349919,DE +3571349920,3571350511,GB +3571350512,3571350527,DE +3571350528,3571351551,GB +3571351552,3571351807,DE +3571351808,3571351871,GB +3571351872,3571352031,DE +3571352032,3571352063,GB +3571352064,3571352415,DE +3571352416,3571352527,GB +3571352528,3571352639,DE +3571352640,3571352735,GB +3571352736,3571352783,DE +3571352784,3571352831,GB +3571352832,3571353215,DE +3571353216,3571353231,GB +3571353232,3571353279,DE +3571353280,3571353311,GB +3571353312,3571353343,DE +3571353344,3571353471,GB +3571353472,3571353599,DE +3571353600,3571353791,GB +3571353792,3571353807,DE +3571353808,3571353855,GB +3571353856,3571354111,DE +3571354112,3571354463,GB +3571354464,3571354495,DE +3571354496,3571355007,GB +3571355008,3571355135,DE +3571355136,3571355167,GB +3571355168,3571355183,DE +3571355184,3571355391,GB +3571355392,3571355935,DE +3571355936,3571355967,GB +3571355968,3571356031,DE +3571356032,3571356159,GB +3571356160,3571356415,DE +3571356416,3571356671,GB +3571356672,3571357071,DE +3571357072,3571357183,GB +3571357184,3571357695,DE +3571357696,3571357791,GB +3571357792,3571357855,DE +3571357856,3571357871,GB +3571357872,3571357951,DE +3571357952,3571358047,GB +3571358048,3571358079,DE +3571358080,3571358223,GB +3571358224,3571358255,DE +3571358256,3571358319,GB +3571358320,3571358335,DE +3571358336,3571358399,GB +3571358400,3571358415,DE +3571358416,3571358431,GB +3571358432,3571358447,DE +3571358448,3571358463,GB +3571358464,3571358495,DE +3571358496,3571358503,GB +3571358504,3571358559,DE +3571358560,3571358575,GB +3571358576,3571358591,DE +3571358592,3571358975,GB +3571358976,3571358991,DE +3571358992,3571358999,GB +3571359000,3571359079,DE +3571359080,3571359095,GB +3571359096,3571359151,DE +3571359152,3571359159,GB +3571359160,3571359167,DE +3571359168,3571359175,GB +3571359176,3571359207,DE +3571359208,3571359215,GB +3571359216,3571359319,DE +3571359320,3571359327,GB +3571359328,3571359335,DE +3571359336,3571359343,GB +3571359344,3571359351,DE +3571359352,3571359359,GB +3571359360,3571359415,DE +3571359416,3571359419,GB +3571359420,3571359463,DE +3571359464,3571359471,GB +3571359472,3571359487,DE +3571359488,3571359999,GB +3571360000,3571360767,DE +3571360768,3571361151,GB +3571361152,3571361215,DE +3571361216,3571361247,GB +3571361248,3571361407,DE +3571361408,3571361439,GB +3571361440,3571361455,DE +3571361456,3571361471,GB +3571361472,3571361535,DE +3571361536,3571361983,GB +3571361984,3571362303,DE +3571362304,3571362559,GB +3571362560,3571362879,DE +3571362880,3571363007,GB +3571363008,3571363039,DE +3571363040,3571363327,GB +3571363328,3571364095,DE +3571364096,3571364287,GB +3571364288,3571364319,DE +3571364320,3571364919,GB +3571364920,3571364927,DE +3571364928,3571364955,GB +3571364956,3571364975,DE +3571364976,3571364983,GB +3571364984,3571364991,DE +3571364992,3571365023,GB +3571365024,3571365031,DE +3571365032,3571365039,GB +3571365040,3571365047,DE +3571365048,3571365055,GB +3571365056,3571365071,DE +3571365072,3571365079,GB +3571365080,3571365087,DE +3571365088,3571365183,GB +3571365184,3571365247,DE +3571365248,3571365999,GB +3571366000,3571366007,DE +3571366008,3571366399,GB 3571366400,3571366511,NL -3571366512,3571379311,DE +3571366512,3571366519,DE +3571366520,3571366559,GB +3571366560,3571366591,DE +3571366592,3571366655,GB +3571366656,3571366911,DE +3571366912,3571368447,GB +3571368448,3571368479,DE +3571368480,3571368511,GB +3571368512,3571368575,DE +3571368576,3571368623,GB +3571368624,3571368687,DE +3571368688,3571368695,GB +3571368696,3571368959,DE +3571368960,3571369215,GB +3571369216,3571369279,DE +3571369280,3571369727,GB +3571369728,3571369759,DE +3571369760,3571369807,GB +3571369808,3571369823,DE +3571369824,3571369983,GB +3571369984,3571371299,DE +3571371300,3571371303,GB +3571371304,3571371319,DE +3571371320,3571371327,GB +3571371328,3571371359,DE +3571371360,3571372303,GB +3571372304,3571372319,DE +3571372320,3571375327,GB +3571375328,3571375343,DE +3571375344,3571379199,GB +3571379200,3571379231,DE +3571379232,3571379247,GB +3571379248,3571379311,DE 3571379312,3571379315,NL -3571379316,3571381631,DE +3571379316,3571379351,DE +3571379352,3571379359,GB +3571379360,3571379367,DE +3571379368,3571379375,GB +3571379376,3571379631,DE +3571379632,3571379647,GB +3571379648,3571379871,DE +3571379872,3571379887,GB +3571379888,3571379903,DE +3571379904,3571381151,GB +3571381152,3571381631,DE 3571381632,3571381695,AT -3571381696,3571382783,DE +3571381696,3571381711,DE +3571381712,3571381727,GB +3571381728,3571381791,DE +3571381792,3571381887,GB +3571381888,3571381951,DE +3571381952,3571382015,GB +3571382016,3571382207,DE +3571382208,3571382271,GB +3571382272,3571382303,DE +3571382304,3571382351,GB +3571382352,3571382367,DE +3571382368,3571382623,GB +3571382624,3571382783,DE 3571382784,3571383039,AT 3571383040,3571383135,DE 3571383136,3571383151,AT -3571383152,3571385151,DE +3571383152,3571383167,GB +3571383168,3571383175,DE +3571383176,3571383999,GB +3571384000,3571384063,DE +3571384064,3571384191,GB +3571384192,3571385151,DE 3571385152,3571385183,GB 3571385184,3571385631,DE 3571385632,3571385663,GB -3571385664,3571389471,DE -3571389472,3571389475,ES -3571389476,3571389503,DE +3571385664,3571389503,DE 3571389504,3571389519,HU -3571389520,3571425695,DE +3571389520,3571414015,DE +3571414016,3571414271,IE +3571414272,3571414783,DE +3571414784,3571414799,IE +3571414800,3571414943,DE +3571414944,3571414959,GB +3571414960,3571415039,DE +3571415040,3571415295,GB +3571415296,3571415311,DE +3571415312,3571415327,AT +3571415328,3571425695,DE 3571425696,3571425727,ES -3571425728,3571426899,DE -3571426900,3571426903,ES -3571426904,3571456575,DE +3571425728,3571426895,DE +3571426896,3571426899,ES +3571426900,3571426931,DE +3571426932,3571426935,ES +3571426936,3571456575,DE 3571456576,3571456591,GB -3571456592,3571482367,DE +3571456592,3571473151,DE +3571473152,3571473407,NL +3571473408,3571482367,DE 3571482368,3571482623,CH 3571482624,3571515391,BE 3571515392,3571548159,GB 3571548160,3571580927,ES -3571580928,3571646463,FI +3571580928,3571595727,FI +3571595728,3571595743,AX +3571595744,3571646463,FI 3571646464,3571675679,DE 3571675680,3571675687,GB 3571675688,3571711999,DE 3571712000,3571843071,GB 3571843072,3571974143,ES -3571974144,3571978495,AT -3571978496,3571979007,SK -3571979008,3572006911,AT +3571974144,3571978239,RU +3571978240,3571980287,SK +3571980288,3571982335,AT +3571982336,3572006911,RU 3572006912,3572039679,CH 3572039680,3572047871,BE -3572047872,3572056063,LU +3572047872,3572052479,LU +3572052480,3572052735,BE +3572052736,3572054303,LU +3572054304,3572054431,BE +3572054432,3572054527,LU +3572054528,3572055551,BE +3572055552,3572055743,LU +3572055744,3572056063,BE 3572056064,3572072447,RU 3572072448,3572105215,BG -3572105216,3572148223,FR -3572148224,3572148479,MC -3572148480,3572170751,FR -3572170752,3572203519,IL +3572105216,3572106095,FR +3572106096,3572106111,A2 +3572106112,3572116527,FR +3572116528,3572116535,A2 +3572116536,3572170751,FR +3572170752,3572195791,IL +3572195792,3572195807,GB +3572195808,3572203519,IL 3572203520,3572236287,SI 3572236288,3572301823,AT 3572301824,3572367359,DK @@ -72919,11 +119112,28 @@ 3572715776,3572760575,CH 3572760576,3572826111,PL 3572826112,3572891647,IT -3572891648,3572957183,FI -3572957184,3573022719,SE +3572891648,3572957175,FI +3572957176,3572957183,AX +3572957184,3572975359,SE +3572975360,3572975615,A2 +3572975616,3572980991,SE +3572980992,3572981247,A2 +3572981248,3572984319,SE +3572984320,3572984575,A2 +3572984576,3572986367,SE +3572986368,3572986623,A2 +3572986624,3573022719,SE 3573022720,3573055487,RU 3573055488,3573088255,GB -3573088256,3573153791,CH +3573088256,3573088263,CH +3573088264,3573088271,DE +3573088272,3573089759,CH +3573089760,3573089791,AT +3573089792,3573090055,CH +3573090056,3573090063,CD +3573090064,3573142015,CH +3573142016,3573142271,AT +3573142272,3573153791,CH 3573153792,3573175711,GB 3573175712,3573175727,IE 3573175728,3573208511,GB @@ -72935,17 +119145,36 @@ 3573415936,3573481471,CH 3573481472,3573547007,DE 3573547008,3573612543,ES -3573612544,3573733375,GB -3573733376,3573734399,IT -3573734400,3573743615,GB +3573612544,3573743615,GB 3573743616,3573809151,CH 3573809152,3573874687,ES -3573874688,3573940223,GR +3573874688,3573878783,PL +3573878784,3573882879,RU +3573882880,3573884927,DK +3573884928,3573886975,PL +3573886976,3573889023,RU +3573889024,3573891071,HR +3573891072,3573893119,NL +3573893120,3573897215,RU +3573897216,3573899263,GB +3573899264,3573903359,RU +3573903360,3573905407,SI +3573905408,3573909503,RU +3573909504,3573913599,PL +3573913600,3573915647,CH +3573915648,3573917695,RU +3573917696,3573919743,SA +3573919744,3573921791,GB +3573921792,3573923839,RU +3573923840,3573925887,UA +3573925888,3573929983,PL +3573929984,3573938175,RU +3573938176,3573940223,PL 3573940224,3574005759,PS 3574005760,3574071295,CY 3574071296,3574136831,IL 3574136832,3574137783,DE -3574137784,3574137791,GB +3574137784,3574137791,AT 3574137792,3574137823,DE 3574137824,3574137855,NL 3574137856,3574138559,DE @@ -72954,81 +119183,46 @@ 3574138736,3574138751,NL 3574138752,3574138767,DE 3574138768,3574138775,NL -3574138776,3574143263,DE -3574143264,3574143295,GB -3574143296,3574148095,DE -3574148096,3574148111,GB -3574148112,3574151823,DE +3574138776,3574151823,DE 3574151824,3574151831,AT -3574151832,3574152847,DE -3574152848,3574152863,GB -3574152864,3574153217,DE -3574153218,3574153218,LU -3574153219,3574153239,DE -3574153240,3574153243,AT -3574153244,3574153299,DE -3574153300,3574153303,CH -3574153304,3574153351,DE -3574153352,3574153359,LU +3574151832,3574153359,DE 3574153360,3574153367,AT -3574153368,3574153567,DE -3574153568,3574153583,ES -3574153584,3574153611,DE -3574153612,3574153623,AT -3574153624,3574153679,DE -3574153680,3574153687,CH -3574153688,3574153731,DE +3574153368,3574153615,DE +3574153616,3574153623,AT +3574153624,3574153731,DE 3574153732,3574153735,HU -3574153736,3574153783,DE -3574153784,3574153787,AT -3574153788,3574154495,DE -3574154496,3574154623,NO -3574154624,3574154827,DE -3574154828,3574154831,AT -3574154832,3574154847,LU -3574154848,3574155535,DE -3574155536,3574155539,CH -3574155540,3574155551,DE -3574155552,3574155583,CH -3574155584,3574155591,DE -3574155592,3574155595,FR -3574155596,3574155727,DE +3574153736,3574155627,DE +3574155628,3574155631,NL +3574155632,3574155727,DE 3574155728,3574155731,AT 3574155732,3574155739,DE -3574155740,3574155747,AT -3574155748,3574155759,DE -3574155760,3574155763,ES -3574155764,3574155787,DE -3574155788,3574155791,AT -3574155792,3574155811,DE -3574155812,3574155815,LU -3574155816,3574155851,DE +3574155740,3574155743,AT +3574155744,3574155851,DE 3574155852,3574155855,NO -3574155856,3574155887,DE -3574155888,3574155891,AT -3574155892,3574155983,DE -3574155984,3574155987,AT -3574155988,3574155991,NO -3574155992,3574157551,DE -3574157552,3574157559,AT -3574157560,3574159871,DE -3574159872,3574159875,GB -3574159876,3574160931,DE +3574155856,3574155883,DE +3574155884,3574155887,NL +3574155888,3574159919,DE +3574159920,3574159927,NL +3574159928,3574160931,DE 3574160932,3574160935,NL -3574160936,3574160959,DE -3574160960,3574161023,GB -3574161024,3574161039,DE +3574160936,3574161039,DE 3574161040,3574161043,NL 3574161044,3574161055,DE 3574161056,3574161087,NL -3574161088,3574161383,DE -3574161384,3574161387,GB -3574161388,3574169599,DE +3574161088,3574161107,DE +3574161108,3574161111,NL +3574161112,3574161335,DE +3574161336,3574161339,AI +3574161340,3574161391,DE +3574161392,3574161395,NO +3574161396,3574169599,DE 3574169600,3574202367,ES 3574202368,3574267903,NL 3574267904,3574333439,FR 3574333440,3574341631,GB +3574341632,3574348287,EU 3574348288,3574348543,GB +3574348544,3574398975,EU 3574398976,3574464511,PT 3574464512,3574530047,TR 3574530048,3574563679,SE @@ -73045,17 +119239,16 @@ 3574566208,3574566271,FI 3574566272,3574566447,SE 3574566448,3574566463,FI -3574566464,3574595583,SE -3574595584,3574595839,RE -3574595840,3574596095,MQ -3574596096,3574596351,FR -3574596352,3574596863,MQ -3574596864,3574597119,FR -3574597120,3574597631,MQ -3574597632,3574598143,GP -3574598144,3574598399,FR -3574598400,3574598655,RE -3574598656,3574601215,MQ +3574566464,3574594559,SE +3574594560,3574595583,GB +3574595584,3574596351,FR +3574596352,3574596607,MQ +3574596608,3574597631,FR +3574597632,3574597887,MQ +3574597888,3574598655,FR +3574598656,3574599679,MQ +3574599680,3574600191,FR +3574600192,3574601215,MQ 3574601216,3574601471,RE 3574601472,3574601983,MQ 3574601984,3574602239,GF @@ -73069,41 +119262,42 @@ 3574693888,3574726655,PL 3574726656,3574792191,GB 3574792192,3574824959,CZ -3574824960,3574825215,NL -3574825216,3574825343,GB -3574825344,3574825407,NL +3574824960,3574825279,GB +3574825280,3574825407,NL 3574825408,3574825471,GB 3574825472,3574826111,NL 3574826112,3574826239,GB -3574826240,3574829823,NL +3574826240,3574826751,NL +3574826752,3574827007,GB +3574827008,3574829311,NL +3574829312,3574829567,GB +3574829568,3574829823,NL 3574829824,3574830079,GB -3574830080,3574831103,NL -3574831104,3574833279,GB +3574830080,3574831359,NL +3574831360,3574833279,GB 3574833280,3574833311,NL 3574833312,3574833343,GB 3574833344,3574833359,NL 3574833360,3574833407,GB 3574833408,3574833439,NL -3574833440,3574833599,GB -3574833600,3574833631,NL -3574833632,3574833663,GB -3574833664,3574834175,NL -3574834176,3574834431,GB +3574833440,3574834431,GB 3574834432,3574834559,NL 3574834560,3574834687,GB -3574834688,3574836223,NL -3574836224,3574836351,GB +3574834688,3574835199,NL +3574835200,3574836351,GB 3574836352,3574838015,NL 3574838016,3574838271,GB 3574838272,3574838527,NL -3574838528,3574839807,GB -3574839808,3574841343,NL -3574841344,3574857727,GB +3574838528,3574857727,GB 3574857728,3574917375,DE 3574917376,3574917631,CH 3574917632,3574919359,DE 3574919360,3574919391,FR -3574919392,3574923263,DE +3574919392,3574920223,DE +3574920224,3574920239,RO +3574920240,3574920503,DE +3574920504,3574920511,RO +3574920512,3574923263,DE 3574923264,3574939647,RU 3574939648,3574956031,SE 3574956032,3574972415,IT @@ -73118,131 +119312,183 @@ 3575316480,3575349247,RU 3575349248,3575355231,ES 3575355232,3575355247,GB -3575355248,3575367111,ES +3575355248,3575360199,ES +3575360200,3575360207,FR +3575360208,3575367111,ES 3575367112,3575367119,DE -3575367120,3575372239,ES +3575367120,3575372159,ES +3575372160,3575372167,GB +3575372168,3575372239,ES 3575372240,3575372247,PT 3575372248,3575382015,ES 3575382016,3575412991,FI 3575412992,3575413119,RU -3575413120,3575447551,FI +3575413120,3575414375,FI +3575414376,3575414383,AX +3575414384,3575419903,FI +3575419904,3575419919,AX +3575419920,3575420127,FI +3575420128,3575420159,AX +3575420160,3575447551,FI 3575447552,3575513087,CZ 3575513088,3575545855,PT 3575545856,3575562239,FR 3575562240,3575578623,DE -3575578624,3575580671,BE -3575580672,3575580927,NL -3575580928,3575581439,ES +3575578624,3575578879,EU +3575578880,3575579135,AU +3575579136,3575579647,EU +3575579648,3575579903,AU +3575579904,3575581439,EU 3575581440,3575581567,GB -3575581568,3575581695,BE -3575581696,3575581823,FR -3575581824,3575581951,ES -3575581952,3575582207,GR -3575582208,3575583103,BE +3575581568,3575581695,IT +3575581696,3575582207,EU +3575582208,3575582463,CH +3575582464,3575582719,FR +3575582720,3575583103,EU 3575583104,3575583111,HU -3575583112,3575583999,BE -3575584000,3575584255,FR -3575584256,3575586943,BE -3575586944,3575587071,GB -3575587072,3575587103,BE -3575587104,3575587119,ES -3575587120,3575587135,BE -3575587136,3575587151,GB -3575587152,3575587247,BE +3575583112,3575583115,GB +3575583116,3575583119,FR +3575583120,3575583231,EU +3575583232,3575583487,IT +3575583488,3575585791,EU +3575585792,3575586047,EG +3575586048,3575586303,IT +3575586304,3575586815,BE +3575586816,3575587071,GB +3575587072,3575587199,EU +3575587200,3575587215,BE +3575587216,3575587231,EU +3575587232,3575587247,NL 3575587248,3575587255,FR -3575587256,3575587295,BE -3575587296,3575587311,RU -3575587312,3575587839,BE +3575587256,3575587263,EU +3575587264,3575587271,CH +3575587272,3575587287,EU +3575587288,3575587295,PL +3575587296,3575587319,EU +3575587320,3575587323,PL +3575587324,3575587839,EU 3575587840,3575588351,GB -3575588352,3575588863,BE -3575588864,3575589375,FR -3575589376,3575622655,BE -3575622656,3575622783,GB -3575622784,3575622815,BE -3575622816,3575622847,DK -3575622848,3575622911,BE +3575588352,3575588863,EU +3575588864,3575589887,A2 +3575589888,3575590399,EU +3575590400,3575590911,A2 +3575590912,3575592447,EU +3575592448,3575592959,BE +3575592960,3575595007,EU +3575595008,3575595519,GB +3575595520,3575596287,EU +3575596288,3575596415,GB +3575596416,3575596543,EU +3575596544,3575596799,FR +3575596800,3575622607,EU +3575622608,3575622611,GB +3575622612,3575622655,EU +3575622656,3575622815,GB +3575622816,3575622847,EU +3575622848,3575622879,IT +3575622880,3575622911,FI 3575622912,3575623167,GB -3575623168,3575624703,BE +3575623168,3575624703,EU 3575624704,3575624831,FR 3575624832,3575624839,PT 3575624840,3575624863,GB -3575624864,3575624895,BE +3575624864,3575624895,IL 3575624896,3575624911,GB -3575624912,3575624927,ES -3575624928,3575624943,GB -3575624944,3575624951,BE -3575624952,3575624959,IE -3575624960,3575624975,BE -3575624976,3575624991,GB +3575624912,3575624959,EU +3575624960,3575624991,GB 3575624992,3575624999,IT -3575625000,3575625087,BE -3575625088,3575625095,US -3575625096,3575625375,BE +3575625000,3575625007,GB +3575625008,3575625023,NL +3575625024,3575625027,EG +3575625028,3575625035,EU +3575625036,3575625039,GB +3575625040,3575625047,EU +3575625048,3575625055,FI +3575625056,3575625071,EU +3575625072,3575625087,PL +3575625088,3575625095,BE +3575625096,3575625103,EU +3575625104,3575625151,GB +3575625152,3575625351,EU +3575625352,3575625359,GB +3575625360,3575625375,EU 3575625376,3575625407,IT -3575625408,3575625439,BE +3575625408,3575625439,EU 3575625440,3575625455,ES -3575625456,3575625471,BE +3575625456,3575625471,EU 3575625472,3575625503,NO -3575625504,3575625983,BE +3575625504,3575625983,EU 3575625984,3575625991,SE -3575625992,3575626047,BE +3575625992,3575626047,EU 3575626048,3575626111,FR -3575626112,3575626319,BE +3575626112,3575626319,EU 3575626320,3575626335,GB 3575626336,3575626351,ES 3575626352,3575626367,DE -3575626368,3575626503,BE +3575626368,3575626503,EU 3575626504,3575626511,CH -3575626512,3575626519,BE +3575626512,3575626519,EU 3575626520,3575626527,FR -3575626528,3575626567,BE +3575626528,3575626567,EU 3575626568,3575626575,RO -3575626576,3575626599,BE +3575626576,3575626599,EU 3575626600,3575626607,IE -3575626608,3575626631,BE +3575626608,3575626631,EU 3575626632,3575626639,GB 3575626640,3575626647,DE 3575626648,3575626655,IT -3575626656,3575627311,BE +3575626656,3575627311,EU 3575627312,3575627327,ES -3575627328,3575627359,BE +3575627328,3575627335,SE +3575627336,3575627359,EU 3575627360,3575627367,ES -3575627368,3575627487,BE +3575627368,3575627423,EU +3575627424,3575627431,DE +3575627432,3575627487,EU 3575627488,3575627503,GB -3575627504,3575627775,BE -3575627776,3575628799,NL -3575628800,3575628815,BE +3575627504,3575627711,EU +3575627712,3575627775,GB +3575627776,3575628543,NL +3575628544,3575628631,EU +3575628632,3575628639,GB +3575628640,3575628815,EU 3575628816,3575628823,ES 3575628824,3575628831,FR -3575628832,3575629183,BE +3575628832,3575629183,EU 3575629184,3575629247,NL -3575629248,3575629823,BE +3575629248,3575629279,EU +3575629280,3575629287,GB +3575629288,3575629295,EU +3575629296,3575629303,NL +3575629304,3575629823,EU 3575629824,3575629855,GR 3575629856,3575629871,DE -3575629872,3575629935,BE +3575629872,3575629935,EU 3575629936,3575629951,FR -3575629952,3575630015,BE +3575629952,3575630015,EU 3575630016,3575630023,GR -3575630024,3575630063,BE +3575630024,3575630063,EU 3575630064,3575630079,ZA 3575630080,3575630335,BE 3575630336,3575630463,IT 3575630464,3575630591,CH 3575630592,3575630847,IL -3575630848,3575630975,BE +3575630848,3575630975,EU 3575630976,3575630991,FR -3575630992,3575631103,BE +3575630992,3575631103,EU 3575631104,3575631111,AT 3575631112,3575631119,CH 3575631120,3575631127,DE -3575631128,3575631183,BE -3575631184,3575631199,HU +3575631128,3575631135,EU +3575631136,3575631143,HU +3575631144,3575631159,EU +3575631160,3575631167,GB +3575631168,3575631199,NL 3575631200,3575631207,IE -3575631208,3575631231,BE +3575631208,3575631223,EU +3575631224,3575631231,IL 3575631232,3575631295,CH -3575631296,3575631303,BE -3575631304,3575631311,FI -3575631312,3575631615,BE +3575631296,3575631615,EU 3575631616,3575631631,SE 3575631632,3575631639,BE 3575631640,3575631647,CH @@ -73250,170 +119496,186 @@ 3575631664,3575631679,DE 3575631680,3575631695,SE 3575631696,3575631711,IT -3575631712,3575631759,BE +3575631712,3575631759,EU 3575631760,3575631775,ZA -3575631776,3575631791,BE +3575631776,3575631791,EU 3575631792,3575631799,ES -3575631800,3575631855,BE +3575631800,3575631807,CZ +3575631808,3575631855,EU 3575631856,3575631863,ZA -3575631864,3575631871,BE +3575631864,3575631871,EU 3575631872,3575632639,IL 3575632640,3575632655,NO -3575632656,3575632703,BE +3575632656,3575632703,EU 3575632704,3575632711,GB -3575632712,3575632783,BE +3575632712,3575632783,EU 3575632784,3575632791,GB -3575632792,3575632847,BE +3575632792,3575632831,EU +3575632832,3575632847,BE 3575632848,3575632863,CH -3575632864,3575632879,BE +3575632864,3575632871,BE +3575632872,3575632879,EU 3575632880,3575632895,DE -3575632896,3575632967,BE +3575632896,3575632967,EU 3575632968,3575632975,GB -3575632976,3575632991,BE +3575632976,3575632991,EU 3575632992,3575632999,IT -3575633000,3575633039,BE +3575633000,3575633039,EU 3575633040,3575633055,DE 3575633056,3575633063,SE 3575633064,3575633071,NL -3575633072,3575633087,BE +3575633072,3575633087,EU 3575633088,3575633119,GB -3575633120,3575633135,BE +3575633120,3575633135,EU 3575633136,3575633143,GB -3575633144,3575633599,BE +3575633144,3575633599,EU 3575633600,3575633663,NL -3575633664,3575633727,BE +3575633664,3575633727,EU 3575633728,3575633735,AT 3575633736,3575633743,IT -3575633744,3575633783,BE +3575633744,3575633783,EU 3575633784,3575633791,DE -3575633792,3575633887,BE +3575633792,3575633887,EU 3575633888,3575633895,SE -3575633896,3575633919,BE +3575633896,3575633919,EU 3575633920,3575633983,CH 3575633984,3575633991,DE -3575633992,3575633999,BE +3575633992,3575633999,EU 3575634000,3575634007,PT 3575634008,3575634015,DK 3575634016,3575634047,GB -3575634048,3575634183,BE +3575634048,3575634175,BE +3575634176,3575634183,EU 3575634184,3575634191,AT -3575634192,3575634255,BE +3575634192,3575634255,EU 3575634256,3575634271,IT -3575634272,3575634367,BE +3575634272,3575634367,EU 3575634368,3575634399,NO 3575634400,3575634431,GB -3575634432,3575634455,BE +3575634432,3575634455,EU 3575634456,3575634463,DE -3575634464,3575634495,BE -3575634496,3575634519,FI -3575634520,3575634591,BE +3575634464,3575634495,EU +3575634496,3575634511,FI +3575634512,3575634519,CH +3575634520,3575634591,EU 3575634592,3575634599,ES -3575634600,3575634607,BE +3575634600,3575634607,EU 3575634608,3575634615,GB -3575634616,3575634695,BE +3575634616,3575634623,DE +3575634624,3575634695,EU 3575634696,3575634703,FI -3575634704,3575634711,BE +3575634704,3575634711,EU 3575634712,3575634719,DE -3575634720,3575634767,BE +3575634720,3575634767,EU 3575634768,3575634775,NO -3575634776,3575634783,BE +3575634776,3575634783,EU 3575634784,3575634791,FR 3575634792,3575634799,ES -3575634800,3575634807,PL +3575634800,3575634807,BE 3575634808,3575634815,SE -3575634816,3575634879,BE +3575634816,3575634879,EU 3575634880,3575634911,GB 3575634912,3575634919,SE 3575634920,3575634927,GB 3575634928,3575634935,IT -3575634936,3575635015,BE +3575634936,3575635015,EU 3575635016,3575635023,CH 3575635024,3575635039,ES -3575635040,3575635055,BE +3575635040,3575635055,EU 3575635056,3575635063,CH -3575635064,3575635071,BE +3575635064,3575635071,EU 3575635072,3575635087,SE -3575635088,3575635103,BE +3575635088,3575635103,EU 3575635104,3575635119,PT 3575635120,3575635135,PL 3575635136,3575635151,DE 3575635152,3575635159,PT -3575635160,3575635167,BE +3575635160,3575635167,DE 3575635168,3575635175,GB -3575635176,3575635199,BE +3575635176,3575635199,EU 3575635200,3575635455,NO 3575635456,3575635463,RU 3575635464,3575635471,GB -3575635472,3575635583,BE +3575635472,3575635583,EU 3575635584,3575635615,EG 3575635616,3575635631,FI -3575635632,3575635647,BE +3575635632,3575635647,EU 3575635648,3575635679,GB -3575635680,3575635695,BE +3575635680,3575635695,EU 3575635696,3575635703,GB -3575635704,3575635775,BE +3575635704,3575635775,EU 3575635776,3575635839,CH 3575635840,3575635847,GB 3575635848,3575635855,FR 3575635856,3575635871,TR -3575635872,3575635983,BE +3575635872,3575635983,EU 3575635984,3575635999,DE -3575636000,3575636143,BE +3575636000,3575636143,EU 3575636144,3575636151,HU -3575636152,3575636607,BE +3575636152,3575636607,EU 3575636608,3575636735,FR -3575636736,3575636823,BE +3575636736,3575636807,EU +3575636808,3575636815,GB +3575636816,3575636823,EU 3575636824,3575636831,RU -3575636832,3575636855,BE +3575636832,3575636855,EU 3575636856,3575636863,DE -3575636864,3575636871,BE +3575636864,3575636871,EU 3575636872,3575636879,CZ -3575636880,3575636903,BE +3575636880,3575636895,EU +3575636896,3575636903,PL 3575636904,3575636911,CZ -3575636912,3575636983,BE +3575636912,3575636927,EU +3575636928,3575636959,DE +3575636960,3575636983,EU 3575636984,3575636991,FR -3575636992,3575637039,BE +3575636992,3575637039,EU 3575637040,3575637055,DE -3575637056,3575637151,BE +3575637056,3575637151,EU 3575637152,3575637183,GB -3575637184,3575637407,BE +3575637184,3575637367,EU +3575637368,3575637375,BE +3575637376,3575637407,EU 3575637408,3575637439,LU 3575637440,3575637471,GB -3575637472,3575638103,BE +3575637472,3575638103,EU 3575638104,3575638111,GB -3575638112,3575638175,BE +3575638112,3575638175,EU 3575638176,3575638239,GB -3575638240,3575638279,BE +3575638240,3575638263,EU +3575638264,3575638271,PL +3575638272,3575638279,EU 3575638280,3575638287,RU -3575638288,3575638303,BE +3575638288,3575638303,EU 3575638304,3575638335,NO -3575638336,3575638527,BE +3575638336,3575638527,EU 3575638528,3575638543,DE -3575638544,3575638559,BE +3575638544,3575638559,EU 3575638560,3575638591,GB -3575638592,3575638623,BE +3575638592,3575638623,EU 3575638624,3575638639,PL -3575638640,3575638719,BE +3575638640,3575638719,EU 3575638720,3575638735,NL 3575638736,3575638751,GR -3575638752,3575638767,BE +3575638752,3575638767,EU 3575638768,3575638783,SE -3575638784,3575638911,BE +3575638784,3575638911,EU 3575638912,3575638943,FR 3575638944,3575638975,GB -3575638976,3575639007,BE +3575638976,3575639007,EU 3575639008,3575639011,GB 3575639012,3575639023,IE 3575639024,3575639039,PL -3575639040,3575644159,BE +3575639040,3575640063,EU +3575640064,3575644159,TR 3575644160,3575709695,DK 3575709696,3575730175,AT -3575730176,3575730183,SA -3575730184,3575732735,AT +3575730176,3575730191,SA +3575730192,3575732735,AT 3575732736,3575732991,LI 3575732992,3575736319,AT -3575736320,3575736831,LI -3575736832,3575738407,AT +3575736320,3575736895,LI +3575736896,3575738407,AT 3575738408,3575738415,SA 3575738416,3575738431,AT 3575738432,3575738463,SA @@ -73425,348 +119687,689 @@ 3575775296,3575775487,NL 3575775488,3575775743,AT 3575775744,3575824383,NL -3575832576,3575850719,NL -3575850720,3575850735,GB -3575850736,3575854079,NL -3575854080,3575854847,GB -3575854848,3575857151,NL +3575824384,3575832575,KW +3575832576,3575840767,NL +3575840768,3575848991,GB +3575848992,3575849007,NL +3575849008,3575850255,GB +3575850256,3575850263,NL +3575850264,3575850543,GB +3575850544,3575850559,NL +3575850560,3575850783,GB +3575850784,3575850815,NL +3575850816,3575852799,GB +3575852800,3575853055,NL +3575853056,3575853311,GB +3575853312,3575853375,NL +3575853376,3575853439,GB +3575853440,3575853503,NL +3575853504,3575853567,GB +3575853568,3575853579,NL +3575853580,3575853587,GB +3575853588,3575853591,NL +3575853592,3575853619,GB +3575853620,3575853631,NL +3575853632,3575853635,GB +3575853636,3575853647,NL +3575853648,3575853655,GB +3575853656,3575853663,NL +3575853664,3575853691,GB +3575853692,3575853695,NL +3575853696,3575853719,GB +3575853720,3575853723,NL +3575853724,3575853739,GB +3575853740,3575853743,NL +3575853744,3575853763,GB +3575853764,3575853767,NL +3575853768,3575853799,GB +3575853800,3575853807,NL +3575853808,3575853815,GB +3575853816,3575853823,NL +3575853824,3575853831,GB +3575853832,3575853863,NL +3575853864,3575853871,GB +3575853872,3575853879,NL +3575853880,3575853895,GB +3575853896,3575853927,NL +3575853928,3575853943,GB +3575853944,3575853951,NL +3575853952,3575853959,GB +3575853960,3575853975,NL +3575853976,3575853999,GB +3575854000,3575854015,NL +3575854016,3575854031,GB +3575854032,3575854039,NL +3575854040,3575857151,GB 3575857152,3575857407,BE -3575857408,3575858529,NL +3575857408,3575858529,GB 3575858530,3575858543,US -3575858544,3575860299,NL +3575858544,3575860299,GB 3575860300,3575860303,BE -3575860304,3575866367,NL +3575860304,3575860735,GB +3575860736,3575860863,NL +3575860864,3575860991,GB +3575860992,3575861247,NL +3575861248,3575861503,GB +3575861504,3575861519,NL +3575861520,3575864327,GB +3575864328,3575864331,NL +3575864332,3575864343,GB +3575864344,3575864347,NL +3575864348,3575864359,GB +3575864360,3575864363,NL +3575864364,3575864380,GB +3575864381,3575864382,NL +3575864383,3575864387,GB +3575864388,3575864391,NL +3575864392,3575864395,GB +3575864396,3575864403,NL +3575864404,3575864583,GB +3575864584,3575864599,NL +3575864600,3575864607,GB +3575864608,3575864615,NL +3575864616,3575864631,GB +3575864632,3575864639,NL +3575864640,3575864663,GB +3575864664,3575864671,NL +3575864672,3575864687,GB +3575864688,3575864703,NL +3575864704,3575864775,GB +3575864776,3575864783,NL +3575864784,3575865087,GB +3575865088,3575865215,NL +3575865216,3575866367,GB 3575866368,3575867135,US -3575867136,3575873535,NL +3575867136,3575872047,GB +3575872048,3575872063,NL +3575872064,3575872079,GB +3575872080,3575872095,NL +3575872096,3575872255,GB +3575872256,3575872767,NL +3575872768,3575873535,GB 3575873536,3575906303,EE 3575906304,3575971839,FR 3575971840,3576037375,ES -3576038144,3576038175,GB +3576037376,3576038207,EU 3576038208,3576038271,GB +3576038272,3576038335,EU 3576038336,3576038463,GB +3576038464,3576038527,EU 3576038528,3576038591,GB +3576038592,3576038911,EU 3576038912,3576038975,GB +3576038976,3576039167,EU 3576039168,3576039231,GB +3576039232,3576039359,EU 3576039360,3576039383,GB +3576039384,3576039391,EU 3576039392,3576039455,GB +3576039456,3576039519,EU 3576039520,3576039551,GB +3576039552,3576039583,EU 3576039584,3576039647,GB +3576039648,3576039807,EU 3576039808,3576039839,GB +3576039840,3576039903,EU 3576039904,3576039935,GB +3576039936,3576040063,EU 3576040064,3576040127,GB +3576040128,3576040215,EU 3576040216,3576040223,GB +3576040224,3576040271,EU 3576040272,3576040287,GB +3576040288,3576040351,EU 3576040352,3576040383,GB +3576040384,3576040831,EU 3576040832,3576040959,GB +3576040960,3576041471,EU 3576041472,3576041535,GB +3576041536,3576041727,EU 3576041728,3576041799,GB +3576041800,3576041831,EU 3576041832,3576041847,GB +3576041848,3576041863,EU 3576041864,3576041871,GB +3576041872,3576041879,EU 3576041880,3576041887,GB +3576041888,3576041903,EU 3576041904,3576041919,GB +3576041920,3576041935,EU 3576041936,3576041943,GB +3576041944,3576041951,EU 3576041952,3576041975,GB +3576041976,3576042111,EU 3576042112,3576042239,GB +3576042240,3576042495,EU 3576042496,3576042623,GB -3576042688,3576042815,GB +3576042624,3576042687,EU +3576042688,3576042695,GB +3576042696,3576042751,EU +3576042752,3576042815,GB +3576042816,3576045567,EU 3576045568,3576045599,GB -3576045616,3576045631,GB +3576045600,3576045663,EU 3576045664,3576045679,GB +3576045680,3576045711,EU 3576045712,3576045735,GB -3576045800,3576045823,GB -3576048128,3576048255,GB +3576045736,3576045799,EU +3576045800,3576045807,GB +3576045808,3576045815,EU +3576045816,3576045823,GB +3576045824,3576048639,EU 3576048640,3576048767,GB +3576048768,3576048959,EU 3576048960,3576049023,GB +3576049024,3576049151,EU 3576049152,3576050047,GB -3576050112,3576050175,GB +3576050048,3576053759,EU 3576053760,3576054911,GB +3576054912,3576055103,EU 3576055104,3576055111,GB +3576055112,3576055119,EU 3576055120,3576055127,GB +3576055128,3576055151,EU 3576055152,3576055167,GB +3576055168,3576055183,EU 3576055184,3576055199,GB +3576055200,3576055207,EU 3576055208,3576055215,GB +3576055216,3576055279,EU 3576055280,3576055551,GB +3576055552,3576055679,EU 3576055680,3576055871,GB +3576055872,3576055935,EU 3576055936,3576055999,GB +3576056000,3576056191,EU 3576056192,3576056255,GB +3576056256,3576056319,EU 3576056320,3576056447,GB +3576056448,3576056703,EU 3576056704,3576056767,GB +3576056768,3576056855,EU 3576056856,3576056871,GB -3576056880,3576056903,GB +3576056872,3576056879,EU +3576056880,3576056887,GB +3576056888,3576056895,EU +3576056896,3576056903,GB +3576056904,3576056919,EU 3576056920,3576056927,GB +3576056928,3576056935,EU 3576056936,3576056943,GB +3576056944,3576056951,EU 3576056952,3576056975,GB +3576056976,3576056991,EU 3576056992,3576057007,GB +3576057008,3576057039,EU 3576057040,3576057055,GB +3576057056,3576057631,EU 3576057632,3576057647,GB +3576057648,3576057711,EU 3576057712,3576057743,GB -3576057760,3576057775,GB +3576057744,3576057823,EU 3576057824,3576057839,GB +3576057840,3576058879,EU 3576058880,3576059007,GB +3576059008,3576059647,EU 3576059648,3576059679,GB +3576059680,3576059711,EU 3576059712,3576059743,GB +3576059744,3576059775,EU 3576059776,3576059807,GB +3576059808,3576060095,EU 3576060096,3576060159,GB +3576060160,3576060287,EU 3576060288,3576060351,GB +3576060352,3576061039,EU 3576061040,3576061055,GB +3576061056,3576061119,EU 3576061120,3576061135,GB +3576061136,3576061183,EU 3576061184,3576061247,GB +3576061248,3576061311,EU 3576061312,3576061439,GB +3576061440,3576061583,EU 3576061584,3576061591,GB +3576061592,3576061619,EU 3576061620,3576061631,GB +3576061632,3576061639,EU 3576061640,3576061647,GB +3576061648,3576061687,EU 3576061688,3576061695,GB -3576062144,3576062175,GB +3576061696,3576062463,EU 3576062464,3576062479,GB -3576062976,3576063103,GB +3576062480,3576064319,EU 3576064320,3576064448,GB +3576064449,3576064543,EU 3576064544,3576064559,GB +3576064560,3576065407,EU 3576065408,3576065535,GB +3576065536,3576065855,EU 3576065856,3576065887,GB +3576065888,3576066287,EU 3576066288,3576066295,GB +3576066296,3576066303,EU 3576066304,3576066431,GB +3576066432,3576067071,EU 3576067072,3576067199,GB +3576067200,3576067247,EU 3576067248,3576067255,GB +3576067256,3576068351,EU 3576068352,3576068479,GB +3576068480,3576068863,EU 3576068864,3576068927,GB +3576068928,3576069055,EU 3576069056,3576069119,GB +3576069120,3576069247,EU 3576069248,3576069279,GB +3576069280,3576069311,EU 3576069312,3576069343,GB +3576069344,3576070695,EU 3576070696,3576070703,GB +3576070704,3576070711,EU 3576070712,3576070719,GB +3576070720,3576070727,EU 3576070728,3576070735,GB +3576070736,3576070775,EU 3576070776,3576070783,GB +3576070784,3576071295,EU 3576071296,3576071423,GB +3576071424,3576071551,EU 3576071552,3576071679,GB +3576071680,3576071935,EU 3576071936,3576071951,GB +3576071952,3576072063,EU 3576072064,3576072079,GB +3576072080,3576072287,EU 3576072288,3576072319,GB +3576072320,3576072415,EU 3576072416,3576072511,GB +3576072512,3576073215,EU 3576073216,3576073279,GB +3576073280,3576074751,EU 3576074752,3576074879,GB -3576075104,3576075135,GB +3576074880,3576075263,EU 3576075264,3576075327,GB +3576075328,3576075647,EU 3576075648,3576075711,GB +3576075712,3576075775,EU 3576075776,3576075903,GB -3576076256,3576076351,GB +3576075904,3576076271,EU +3576076272,3576076351,GB +3576076352,3576076567,EU 3576076568,3576076575,GB +3576076576,3576076623,EU 3576076624,3576076631,GB +3576076632,3576076703,EU 3576076704,3576076719,GB +3576076720,3576076783,EU 3576076784,3576076791,GB -3576077328,3576077335,GB +3576076792,3576077439,EU 3576077440,3576077471,GB +3576077472,3576077567,EU 3576077568,3576077695,GB +3576077696,3576077871,EU 3576077872,3576077887,GB +3576077888,3576077935,EU 3576077936,3576077967,GB -3576078080,3576078175,GB +3576077968,3576078143,EU +3576078144,3576078175,GB +3576078176,3576078463,EU 3576078464,3576078591,GB +3576078592,3576079615,EU 3576079616,3576079871,GB +3576079872,3576079999,EU 3576080000,3576080127,GB +3576080128,3576080223,EU 3576080224,3576080255,GB +3576080256,3576080775,EU 3576080776,3576080799,GB +3576080800,3576080807,EU 3576080808,3576080815,GB +3576080816,3576080823,EU 3576080824,3576080831,GB +3576080832,3576082079,EU 3576082080,3576082111,GB +3576082112,3576082191,EU 3576082192,3576082223,GB +3576082224,3576082687,EU 3576082688,3576082943,GB +3576082944,3576083967,EU 3576083968,3576084031,GB +3576084032,3576084479,EU 3576084480,3576084543,GB +3576084544,3576084607,EU 3576084608,3576084671,GB +3576084672,3576084703,EU 3576084704,3576084735,GB +3576084736,3576084863,EU 3576084864,3576084927,GB +3576084928,3576085183,EU 3576085184,3576085215,GB +3576085216,3576085695,EU 3576085696,3576085711,GB +3576085712,3576086015,EU 3576086016,3576086143,GB +3576086144,3576086367,EU 3576086368,3576086431,GB +3576086432,3576086495,EU 3576086496,3576086527,GB +3576086528,3576086567,EU 3576086568,3576086571,GB +3576086572,3576086575,EU 3576086576,3576086591,GB +3576086592,3576086599,EU 3576086600,3576086603,GB +3576086604,3576087807,EU 3576087808,3576087823,GB +3576087824,3576087951,EU 3576087952,3576087967,GB +3576087968,3576088031,EU 3576088032,3576088047,GB +3576088048,3576088223,EU 3576088224,3576088231,GB +3576088232,3576088375,EU 3576088376,3576088383,GB +3576088384,3576088479,EU 3576088480,3576088511,GB +3576088512,3576088959,EU 3576088960,3576088967,GB +3576088968,3576089023,EU 3576089024,3576089039,GB +3576089040,3576089439,EU 3576089440,3576089471,GB +3576089472,3576089775,EU 3576089776,3576089791,GB +3576089792,3576089823,EU 3576089824,3576089839,GB +3576089840,3576091407,EU 3576091408,3576091423,GB +3576091424,3576091455,EU 3576091456,3576091479,GB +3576091480,3576091519,EU 3576091520,3576091535,GB +3576091536,3576091967,EU 3576091968,3576091983,GB +3576091984,3576091999,EU 3576092000,3576092031,GB -3576092096,3576092159,GB -3576092864,3576092903,GB +3576092032,3576092127,EU +3576092128,3576092159,GB +3576092160,3576092863,EU +3576092864,3576092895,GB +3576092896,3576093063,EU 3576093064,3576093071,GB +3576093072,3576093183,EU 3576093184,3576093247,GB +3576093248,3576095231,EU 3576095232,3576096767,GB +3576096768,3576099071,EU 3576099072,3576100863,GB +3576100864,3576101375,EU 3576101376,3576102911,GB -3576102912,3576109023,FR +3576102912,3576103167,FR +3576103168,3576103247,GB +3576103248,3576103295,FR +3576103296,3576103327,GB +3576103328,3576103367,FR +3576103368,3576103375,GB +3576103376,3576103455,FR +3576103456,3576103583,GB +3576103584,3576103599,FR +3576103600,3576103615,GB +3576103616,3576103631,FR +3576103632,3576103679,GB +3576103680,3576103935,FR +3576103936,3576104111,GB +3576104112,3576104127,FR +3576104128,3576104175,GB +3576104176,3576104191,FR +3576104192,3576104319,GB +3576104320,3576104351,FR +3576104352,3576104447,GB +3576104448,3576104495,FR +3576104496,3576104575,GB +3576104576,3576104607,FR +3576104608,3576104639,GB +3576104640,3576104655,FR +3576104656,3576104703,GB +3576104704,3576104959,FR +3576104960,3576105055,GB +3576105056,3576105183,FR +3576105184,3576105215,GB +3576105216,3576105535,FR +3576105536,3576105599,GB +3576105600,3576105727,FR +3576105728,3576105759,GB +3576105760,3576105855,FR +3576105856,3576105991,GB +3576105992,3576106047,FR +3576106048,3576106055,GB +3576106056,3576106111,FR +3576106112,3576106239,GB +3576106240,3576106287,FR +3576106288,3576106559,GB +3576106560,3576106751,FR +3576106752,3576107007,GB +3576107008,3576107135,FR +3576107136,3576107183,GB +3576107184,3576107231,FR +3576107232,3576107263,GB +3576107264,3576107295,FR +3576107296,3576107391,GB +3576107392,3576107519,FR +3576107520,3576107647,GB +3576107648,3576107679,FR +3576107680,3576107695,GB +3576107696,3576107759,FR +3576107760,3576107775,GB +3576107776,3576107903,FR +3576107904,3576108031,GB +3576108032,3576108063,FR +3576108064,3576108079,GB +3576108080,3576108159,FR +3576108160,3576108255,GB +3576108256,3576108263,FR +3576108264,3576108271,GB +3576108272,3576108351,FR +3576108352,3576108511,GB +3576108512,3576108799,FR +3576108800,3576108815,GB +3576108816,3576108863,FR +3576108864,3576108991,GB +3576108992,3576109023,FR 3576109024,3576109055,DE -3576109056,3576119295,FR +3576109056,3576109567,FR +3576109568,3576109695,GB +3576109696,3576109791,FR +3576109792,3576109799,GB +3576109800,3576109815,FR +3576109816,3576110079,GB +3576110080,3576110207,FR +3576110208,3576110271,GB +3576110272,3576110335,FR +3576110336,3576110367,GB +3576110368,3576110463,FR +3576110464,3576110575,GB +3576110576,3576110847,FR +3576110848,3576111103,GB +3576111104,3576111231,FR +3576111232,3576111423,GB +3576111424,3576111599,FR +3576111600,3576111615,GB +3576111616,3576111647,FR +3576111648,3576111679,GB +3576111680,3576111711,FR +3576111712,3576111727,GB +3576111728,3576111807,FR +3576111808,3576112383,GB +3576112384,3576112543,FR +3576112544,3576113407,GB +3576113408,3576113535,FR +3576113536,3576119295,GB 3576119296,3576119455,CH 3576119456,3576119471,BE 3576119472,3576127487,CH -3576127488,3576131583,FR +3576127488,3576127615,GB +3576127616,3576127647,FR +3576127648,3576127679,GB +3576127680,3576127687,FR +3576127688,3576127695,GB +3576127696,3576127703,FR +3576127704,3576131583,GB 3576131584,3576135679,CH 3576135680,3576168447,DE 3576168448,3576233983,GB 3576233984,3576236671,FR 3576236672,3576236703,GB 3576236704,3576236879,FR -3576236880,3576237055,GB -3576237056,3576237063,FR +3576236880,3576236927,GB +3576236928,3576237063,FR 3576237064,3576237071,GB 3576237072,3576237087,FR -3576237088,3576237135,GB -3576237136,3576237215,FR -3576237216,3576237279,GB +3576237088,3576237119,GB +3576237120,3576237231,FR +3576237232,3576237279,GB 3576237280,3576237455,FR 3576237456,3576237503,GB -3576237504,3576237567,FR -3576237568,3576237583,GB -3576237584,3576237599,FR -3576237600,3576237679,GB -3576237680,3576237695,FR -3576237696,3576237759,GB -3576237760,3576237791,FR -3576237792,3576237823,GB -3576237824,3576237855,FR -3576237856,3576237871,GB -3576237872,3576237887,FR -3576237888,3576237919,GB -3576237920,3576237935,FR -3576237936,3576237967,GB -3576237968,3576237983,FR -3576237984,3576238015,GB -3576238016,3576238143,FR +3576237504,3576237615,FR +3576237616,3576237631,GB +3576237632,3576237711,FR +3576237712,3576237743,GB +3576237744,3576238143,FR 3576238144,3576238159,GB -3576238160,3576238271,FR -3576238272,3576238287,GB -3576238288,3576238303,FR -3576238304,3576238335,GB -3576238336,3576238559,FR -3576238560,3576238591,GB -3576238592,3576238607,FR +3576238160,3576238305,FR +3576238306,3576238335,GB +3576238336,3576238447,FR +3576238448,3576238463,GB +3576238464,3576238511,FR +3576238512,3576238527,GB +3576238528,3576238559,FR +3576238560,3576238575,GB +3576238576,3576238607,FR 3576238608,3576238623,GB 3576238624,3576238639,FR 3576238640,3576238655,GB -3576238656,3576238703,FR -3576238704,3576238719,GB -3576238720,3576238847,FR -3576238848,3576238911,GB +3576238656,3576238863,FR +3576238864,3576238879,GB +3576238880,3576238895,FR +3576238896,3576238911,GB 3576238912,3576238927,FR -3576238928,3576238959,GB -3576238960,3576239007,FR +3576238928,3576238975,GB +3576238976,3576239007,FR 3576239008,3576239023,GB 3576239024,3576239039,FR -3576239040,3576239055,GB -3576239056,3576239087,FR +3576239040,3576239071,GB +3576239072,3576239087,FR 3576239088,3576239103,GB -3576239104,3576240039,FR +3576239104,3576239663,FR +3576239664,3576239671,GB +3576239672,3576240039,FR 3576240040,3576240047,GB 3576240048,3576240111,FR 3576240112,3576240127,GB -3576240128,3576240639,FR -3576240640,3576240895,GB -3576240896,3576241391,FR -3576241392,3576241399,GB -3576241400,3576241791,FR -3576241792,3576241799,GB -3576241800,3576241815,FR -3576241816,3576241823,GB -3576241824,3576241919,FR -3576241920,3576242111,GB -3576242112,3576246399,FR -3576246400,3576246527,GB -3576246528,3576246656,FR -3576246657,3576246783,GB -3576246784,3576248575,FR -3576248576,3576248831,GB -3576248832,3576249463,FR +3576240128,3576240475,FR +3576240476,3576240511,GB +3576240512,3576240575,FR +3576240576,3576240895,GB +3576240896,3576241183,FR +3576241184,3576241215,GB +3576241216,3576241287,FR +3576241288,3576241295,GB +3576241296,3576241343,FR +3576241344,3576241351,GB +3576241352,3576241383,FR +3576241384,3576241399,GB +3576241400,3576241935,FR +3576241936,3576241943,GB +3576241944,3576241951,FR +3576241952,3576241991,GB +3576241992,3576242007,FR +3576242008,3576242031,GB +3576242032,3576242039,FR +3576242040,3576242047,GB +3576242048,3576242111,FR +3576242112,3576242143,GB +3576242144,3576242183,FR +3576242184,3576242199,GB +3576242200,3576242319,FR +3576242320,3576242327,GB +3576242328,3576243967,FR +3576243968,3576243999,GB +3576244000,3576244031,FR +3576244032,3576244047,GB +3576244048,3576244127,FR +3576244128,3576244143,GB +3576244144,3576246399,FR +3576246400,3576246463,GB +3576246464,3576246656,FR +3576246657,3576246727,GB +3576246728,3576246743,FR +3576246744,3576246751,GB +3576246752,3576249359,FR +3576249360,3576249367,GB +3576249368,3576249463,FR 3576249464,3576249471,GB 3576249472,3576249527,FR 3576249528,3576249535,GB 3576249536,3576249743,FR 3576249744,3576249791,GB -3576249792,3576249799,FR -3576249800,3576249823,GB +3576249792,3576249807,FR +3576249808,3576249823,GB 3576249824,3576249831,FR 3576249832,3576249839,GB -3576249840,3576251407,FR -3576251408,3576251599,GB +3576249840,3576250623,FR +3576250624,3576250879,GB +3576250880,3576251407,FR +3576251408,3576251519,GB +3576251520,3576251583,FR +3576251584,3576251599,GB 3576251600,3576251615,FR 3576251616,3576251647,GB 3576251648,3576252415,FR 3576252416,3576252671,GB -3576252672,3576253159,FR -3576253160,3576253183,GB -3576253184,3576254479,FR -3576254480,3576254495,GB -3576254496,3576254511,FR -3576254512,3576254527,GB -3576254528,3576254551,FR +3576252672,3576254487,FR +3576254488,3576254495,GB +3576254496,3576254551,FR 3576254552,3576254559,GB -3576254560,3576254575,FR -3576254576,3576254615,GB +3576254560,3576254607,FR +3576254608,3576254615,GB 3576254616,3576254623,FR -3576254624,3576254639,GB -3576254640,3576254647,FR -3576254648,3576254663,GB -3576254664,3576254671,FR -3576254672,3576254679,GB -3576254680,3576254695,FR -3576254696,3576254711,GB -3576254712,3576254767,FR -3576254768,3576254783,GB -3576254784,3576254847,FR +3576254624,3576254647,GB +3576254648,3576254655,FR +3576254656,3576254687,GB +3576254688,3576254847,FR 3576254848,3576254855,GB 3576254856,3576254863,FR 3576254864,3576254879,GB 3576254880,3576254895,FR 3576254896,3576254903,GB -3576254904,3576255087,FR -3576255088,3576255199,GB +3576254904,3576255151,FR +3576255152,3576255199,GB 3576255200,3576255215,FR 3576255216,3576255263,GB -3576255264,3576255319,FR -3576255320,3576255359,GB -3576255360,3576255407,FR +3576255264,3576255375,FR +3576255376,3576255383,GB +3576255384,3576255407,FR 3576255408,3576255423,GB -3576255424,3576255447,FR -3576255448,3576255455,GB -3576255456,3576255503,FR -3576255504,3576255511,GB -3576255512,3576255519,FR +3576255424,3576255431,FR +3576255432,3576255439,GB +3576255440,3576255519,FR 3576255520,3576255527,GB 3576255528,3576255543,FR 3576255544,3576255551,GB -3576255552,3576255575,FR -3576255576,3576255583,GB -3576255584,3576255631,FR +3576255552,3576255631,FR 3576255632,3576255647,GB 3576255648,3576255671,FR 3576255672,3576255679,GB -3576255680,3576255711,FR -3576255712,3576255727,GB -3576255728,3576255743,FR -3576255744,3576255759,GB -3576255760,3576255839,FR -3576255840,3576255871,GB -3576255872,3576255887,FR -3576255888,3576255935,GB -3576255936,3576255943,FR -3576255944,3576255951,GB -3576255952,3576255975,FR -3576255976,3576255983,GB -3576255984,3576255999,FR -3576256000,3576256047,GB -3576256048,3576256111,FR -3576256112,3576256143,GB +3576255680,3576255703,FR +3576255704,3576255719,GB +3576255720,3576255743,FR +3576255744,3576255751,GB +3576255752,3576255887,FR +3576255888,3576255919,GB +3576255920,3576255983,FR +3576255984,3576255999,GB +3576256000,3576256127,FR +3576256128,3576256143,GB 3576256144,3576256239,FR 3576256240,3576256255,GB 3576256256,3576256351,FR @@ -73774,9 +120377,7 @@ 3576256368,3576256383,FR 3576256384,3576256415,GB 3576256416,3576256431,FR -3576256432,3576256447,GB -3576256448,3576256463,FR -3576256464,3576256527,GB +3576256432,3576256527,GB 3576256528,3576256543,FR 3576256544,3576256559,GB 3576256560,3576256607,FR @@ -73789,17 +120390,25 @@ 3576256896,3576256959,GB 3576256960,3576256991,FR 3576256992,3576257007,GB -3576257008,3576257135,FR +3576257008,3576257079,FR +3576257080,3576257087,GB +3576257088,3576257103,FR +3576257104,3576257111,GB +3576257112,3576257135,FR 3576257136,3576257151,GB -3576257152,3576257287,FR +3576257152,3576257159,FR +3576257160,3576257167,GB +3576257168,3576257287,FR 3576257288,3576257295,GB -3576257296,3576257343,FR -3576257344,3576257359,GB +3576257296,3576257327,FR +3576257328,3576257359,GB 3576257360,3576257367,FR 3576257368,3576257375,GB 3576257376,3576257455,FR 3576257456,3576257471,GB -3576257472,3576257503,FR +3576257472,3576257487,FR +3576257488,3576257495,GB +3576257496,3576257503,FR 3576257504,3576257535,GB 3576257536,3576257551,FR 3576257552,3576257583,GB @@ -73812,35 +120421,41 @@ 3576257840,3576257855,FR 3576257856,3576257871,GB 3576257872,3576257887,FR -3576257888,3576257895,GB -3576257896,3576257983,FR +3576257888,3576257903,GB +3576257904,3576257983,FR 3576257984,3576257999,GB -3576258000,3576258095,FR -3576258096,3576258127,GB -3576258128,3576258160,FR -3576258161,3576258175,GB -3576258176,3576258191,FR -3576258192,3576258207,GB -3576258208,3576258351,FR +3576258000,3576258055,FR +3576258056,3576258063,GB +3576258064,3576258079,FR +3576258080,3576258095,GB +3576258096,3576258167,FR +3576258168,3576258175,GB +3576258176,3576258351,FR 3576258352,3576258399,GB 3576258400,3576258415,FR 3576258416,3576258431,GB 3576258432,3576258447,FR -3576258448,3576258463,GB -3576258464,3576258495,FR +3576258448,3576258479,GB +3576258480,3576258495,FR 3576258496,3576258511,GB 3576258512,3576258527,FR 3576258528,3576258575,GB 3576258576,3576258591,FR -3576258592,3576258607,GB -3576258608,3576258719,FR -3576258720,3576258783,GB -3576258784,3576258863,FR +3576258592,3576258623,GB +3576258624,3576258671,FR +3576258672,3576258687,GB +3576258688,3576258703,FR +3576258704,3576258783,GB +3576258784,3576258815,FR +3576258816,3576258847,GB +3576258848,3576258863,FR 3576258864,3576258895,GB -3576258896,3576258911,FR -3576258912,3576258927,GB -3576258928,3576259031,FR -3576259032,3576259087,GB +3576258896,3576258943,FR +3576258944,3576259007,GB +3576259008,3576259023,FR +3576259024,3576259039,GB +3576259040,3576259071,FR +3576259072,3576259087,GB 3576259088,3576259103,FR 3576259104,3576259199,GB 3576259200,3576259231,FR @@ -73853,34 +120468,40 @@ 3576259344,3576259391,GB 3576259392,3576259423,FR 3576259424,3576259439,GB -3576259440,3576259519,FR +3576259440,3576259471,FR +3576259472,3576259487,GB +3576259488,3576259519,FR 3576259520,3576259583,GB -3576259584,3576259919,FR -3576259920,3576259935,GB -3576259936,3576259991,FR +3576259584,3576259951,FR +3576259952,3576259975,GB +3576259976,3576259991,FR 3576259992,3576259999,GB -3576260000,3576260063,FR -3576260064,3576260087,GB -3576260088,3576260175,FR +3576260000,3576260015,FR +3576260016,3576260047,GB +3576260048,3576260079,FR +3576260080,3576260111,GB +3576260112,3576260175,FR 3576260176,3576260191,GB 3576260192,3576260207,FR 3576260208,3576260223,GB 3576260224,3576260239,FR 3576260240,3576260255,GB 3576260256,3576260271,FR -3576260272,3576260335,GB +3576260272,3576260287,GB +3576260288,3576260303,FR +3576260304,3576260335,GB 3576260336,3576260463,FR 3576260464,3576260543,GB 3576260544,3576260559,FR 3576260560,3576260607,GB -3576260608,3576260623,FR -3576260624,3576260639,GB -3576260640,3576260655,FR -3576260656,3576260687,GB -3576260688,3576260703,FR +3576260608,3576260655,FR +3576260656,3576260663,GB +3576260664,3576260671,FR +3576260672,3576260679,GB +3576260680,3576260703,FR 3576260704,3576260735,GB -3576260736,3576260895,FR -3576260896,3576260927,GB +3576260736,3576260903,FR +3576260904,3576260927,GB 3576260928,3576260959,FR 3576260960,3576260999,GB 3576261000,3576261015,FR @@ -73889,50 +120510,72 @@ 3576261048,3576261055,GB 3576261056,3576261063,FR 3576261064,3576261071,GB -3576261072,3576261087,FR -3576261088,3576261095,GB +3576261072,3576261079,FR +3576261080,3576261095,GB 3576261096,3576261103,FR 3576261104,3576261111,GB 3576261112,3576261375,FR 3576261376,3576261631,GB -3576261632,3576262023,FR -3576262024,3576262031,GB -3576262032,3576262063,FR -3576262064,3576262071,GB -3576262072,3576263439,FR -3576263440,3576263455,GB -3576263456,3576263519,FR -3576263520,3576263551,GB -3576263552,3576263583,FR +3576261632,3576261823,FR +3576261824,3576261887,GB +3576261888,3576261927,FR +3576261928,3576261935,GB +3576261936,3576263439,FR +3576263440,3576263487,GB +3576263488,3576263519,FR +3576263520,3576263527,GB +3576263528,3576263535,FR +3576263536,3576263551,GB +3576263552,3576263567,FR +3576263568,3576263575,GB +3576263576,3576263583,FR 3576263584,3576263599,GB -3576263600,3576263751,FR +3576263600,3576263615,FR +3576263616,3576263623,GB +3576263624,3576263751,FR 3576263752,3576263759,GB 3576263760,3576263791,FR -3576263792,3576263903,GB -3576263904,3576263911,FR +3576263792,3576263887,GB +3576263888,3576263911,FR 3576263912,3576263919,GB -3576263920,3576264303,FR -3576264304,3576264311,GB -3576264312,3576264447,FR +3576263920,3576264295,FR +3576264296,3576264319,GB +3576264320,3576264383,FR +3576264384,3576264399,GB +3576264400,3576264447,FR 3576264448,3576264511,GB 3576264512,3576264543,FR 3576264544,3576264559,GB 3576264560,3576264575,FR -3576264576,3576264607,GB -3576264608,3576264639,FR -3576264640,3576264703,GB -3576264704,3576265311,FR -3576265312,3576265319,GB -3576265320,3576265343,FR -3576265344,3576265359,GB -3576265360,3576265407,FR -3576265408,3576265415,GB -3576265416,3576265887,FR -3576265888,3576265895,GB -3576265896,3576265911,FR -3576265912,3576265935,GB -3576265936,3576266655,FR -3576266656,3576266671,GB +3576264576,3576264623,GB +3576264624,3576264639,FR +3576264640,3576264687,GB +3576264688,3576265279,FR +3576265280,3576265287,GB +3576265288,3576265303,FR +3576265304,3576265311,GB +3576265312,3576265327,FR +3576265328,3576265335,GB +3576265336,3576265359,FR +3576265360,3576265367,GB +3576265368,3576265375,FR +3576265376,3576265383,GB +3576265384,3576265399,FR +3576265400,3576265431,GB +3576265432,3576265463,FR +3576265464,3576265471,GB +3576265472,3576265759,FR +3576265760,3576265775,GB +3576265776,3576265807,FR +3576265808,3576265823,GB +3576265824,3576265831,FR +3576265832,3576265839,GB +3576265840,3576265847,FR +3576265848,3576265863,GB +3576265864,3576265879,FR +3576265880,3576265903,GB +3576265904,3576266663,FR +3576266664,3576266671,GB 3576266672,3576266687,FR 3576266688,3576266751,GB 3576266752,3576299519,FR @@ -73959,773 +120602,286 @@ 3576607744,3576620031,NL 3576620032,3576620543,SE 3576620544,3576620799,GB -3576620800,3576622335,NL -3576622336,3576622591,GB +3576620800,3576622079,NL +3576622080,3576622591,GB 3576622592,3576623871,NL 3576623872,3576624127,AT -3576624128,3576627199,NL -3576627200,3576692735,AT +3576624128,3576626943,NL +3576626944,3576692735,AT 3576692736,3576758271,GB 3576758272,3576823807,BE 3576823808,3576889343,SE 3576889344,3576954879,NL 3576954880,3576987647,NO -3576987648,3577020415,GB +3576987648,3577001983,GB +3577001984,3577003583,NL +3577003584,3577003771,GB +3577003772,3577003775,NL +3577003776,3577020415,GB 3577020416,3577085951,NL 3577085952,3577151487,DE -3577151488,3577167871,GB +3577167872,3577184255,ET 3577184256,3577217023,CH -3577217024,3577263167,FR -3577263168,3577263199,US -3577263200,3577282559,FR -3577282560,3577329407,IL -3577329408,3577329471,IT -3577329472,3577348095,IL +3577217024,3577282559,FR +3577282560,3577348095,IL 3577348096,3577392767,PT 3577392768,3577392783,DE 3577392784,3577413631,PT 3577413632,3577417519,RU 3577417520,3577417535,KZ -3577417536,3577452415,RU -3577452416,3577452543,GE -3577452544,3577479167,RU +3577417536,3577479167,RU 3577479168,3577544703,ES -3577544704,3577545795,DE -3577545796,3577545799,GB -3577545800,3577545863,DE +3577544704,3577545863,DE 3577545864,3577545871,US 3577545872,3577545983,DE 3577545984,3577546111,SE -3577546112,3577546143,DE -3577546144,3577546151,GB -3577546152,3577546159,DE -3577546160,3577546175,GB -3577546176,3577546239,DE +3577546112,3577546239,DE 3577546240,3577546367,US -3577546368,3577546383,GB -3577546384,3577546415,DE -3577546416,3577546423,GB -3577546424,3577546703,DE -3577546704,3577546719,GB -3577546720,3577547223,DE -3577547224,3577547231,GB -3577547232,3577547375,DE -3577547376,3577547383,GB -3577547384,3577547455,DE +3577546368,3577547455,DE 3577547456,3577547519,FR -3577547520,3577547631,DE -3577547632,3577547663,GB -3577547664,3577547743,DE -3577547744,3577547775,GB -3577547776,3577548287,DE -3577548288,3577548303,GB -3577548304,3577548319,DE -3577548320,3577548351,GB -3577548352,3577549055,DE -3577549056,3577549079,GB -3577549080,3577549119,DE -3577549120,3577549151,GB -3577549152,3577549599,DE -3577549600,3577549631,GB -3577549632,3577549695,DE -3577549696,3577549823,GB -3577549824,3577550847,DE -3577550848,3577550983,GB -3577550984,3577551047,DE -3577551048,3577551063,GB -3577551064,3577551087,DE -3577551088,3577551095,GB -3577551096,3577551103,DE -3577551104,3577551111,GB -3577551112,3577551119,DE -3577551120,3577551127,GB -3577551128,3577551151,DE -3577551152,3577551159,GB -3577551160,3577551271,DE -3577551272,3577551279,GB -3577551280,3577551287,DE -3577551288,3577551327,GB -3577551328,3577551343,DE -3577551344,3577551351,GB -3577551352,3577551407,DE +3577547520,3577551407,DE 3577551408,3577551411,US -3577551412,3577551423,DE -3577551424,3577551455,GB -3577551456,3577552159,DE -3577552160,3577552183,GB -3577552184,3577552191,DE -3577552192,3577552199,GB -3577552200,3577552215,DE -3577552216,3577552223,GB -3577552224,3577552239,DE -3577552240,3577552247,GB -3577552248,3577552255,DE -3577552256,3577552263,GB -3577552264,3577552399,DE -3577552400,3577552447,GB -3577552448,3577552919,DE -3577552920,3577552927,GB -3577552928,3577552959,DE -3577552960,3577552967,GB -3577552968,3577552975,DE -3577552976,3577552991,GB -3577552992,3577553007,DE -3577553008,3577553023,GB -3577553024,3577553223,DE -3577553224,3577553407,GB -3577553408,3577553503,DE -3577553504,3577553543,GB -3577553544,3577553551,DE -3577553552,3577553575,GB -3577553576,3577553583,DE -3577553584,3577553607,GB -3577553608,3577553623,DE -3577553624,3577553663,GB -3577553664,3577553983,DE -3577553984,3577554463,GB -3577554464,3577554467,DE -3577554468,3577554483,GB -3577554484,3577554487,DE -3577554488,3577554647,GB -3577554648,3577554659,DE -3577554660,3577554663,GB -3577554664,3577554671,DE -3577554672,3577554687,GB -3577554688,3577556999,DE -3577557000,3577557007,GB -3577557008,3577557071,DE -3577557072,3577557087,GB -3577557088,3577557215,DE +3577551412,3577557215,DE 3577557216,3577557231,US -3577557232,3577557247,GB -3577557248,3577558783,DE -3577558784,3577559167,GB -3577559168,3577559183,DE -3577559184,3577559199,GB -3577559200,3577559215,DE -3577559216,3577559223,GB -3577559224,3577559231,DE -3577559232,3577559247,GB -3577559248,3577559279,DE -3577559280,3577559303,GB -3577559304,3577559311,DE -3577559312,3577559319,GB -3577559320,3577559327,DE -3577559328,3577559351,GB -3577559352,3577559383,DE -3577559384,3577559391,GB -3577559392,3577559399,DE -3577559400,3577559407,GB -3577559408,3577559415,DE -3577559416,3577559423,GB -3577559424,3577559431,DE -3577559432,3577559447,GB -3577559448,3577559455,DE -3577559456,3577559463,GB -3577559464,3577559471,DE -3577559472,3577559479,GB -3577559480,3577559519,DE -3577559520,3577559527,GB -3577559528,3577559535,DE -3577559536,3577559543,GB -3577559544,3577559559,DE -3577559560,3577559567,GB -3577559568,3577559663,DE -3577559664,3577559671,GB -3577559672,3577559679,DE -3577559680,3577559687,GB -3577559688,3577559815,DE -3577559816,3577559823,GB -3577559824,3577559951,DE -3577559952,3577559959,GB -3577559960,3577559983,DE -3577559984,3577559999,GB -3577560000,3577560063,DE -3577560064,3577560079,GB -3577560080,3577560087,DE -3577560088,3577560103,GB -3577560104,3577560111,DE -3577560112,3577560575,GB -3577560576,3577561087,DE -3577561088,3577561127,GB -3577561128,3577561131,DE -3577561132,3577561235,GB -3577561236,3577561263,DE -3577561264,3577561267,GB -3577561268,3577561271,DE -3577561272,3577561287,GB -3577561288,3577561323,DE -3577561324,3577561327,GB -3577561328,3577561331,DE -3577561332,3577561595,GB -3577561596,3577561639,DE -3577561640,3577561647,GB -3577561648,3577561767,DE -3577561768,3577561775,GB -3577561776,3577561791,DE -3577561792,3577561855,GB -3577561856,3577561887,DE -3577561888,3577561903,GB -3577561904,3577562087,DE -3577562088,3577562103,GB -3577562104,3577562391,DE -3577562392,3577562415,GB -3577562416,3577562439,DE -3577562440,3577562447,GB -3577562448,3577562455,DE -3577562456,3577562463,GB -3577562464,3577562479,DE -3577562480,3577562495,GB -3577562496,3577562511,DE -3577562512,3577562519,GB -3577562520,3577562535,DE -3577562536,3577562551,GB -3577562552,3577562559,DE -3577562560,3577562623,GB -3577562624,3577562935,DE -3577562936,3577562991,GB -3577562992,3577562999,DE -3577563000,3577563007,GB -3577563008,3577563015,DE -3577563016,3577563135,GB -3577563136,3577563295,DE -3577563296,3577563311,GB -3577563312,3577563375,DE -3577563376,3577563383,GB -3577563384,3577563935,DE -3577563936,3577563967,GB -3577563968,3577563983,DE -3577563984,3577563991,GB -3577563992,3577564039,DE -3577564040,3577564043,GB -3577564044,3577564079,DE -3577564080,3577564087,GB -3577564088,3577564303,DE -3577564304,3577564319,GB -3577564320,3577564359,DE -3577564360,3577564383,GB -3577564384,3577564575,DE -3577564576,3577564583,GB -3577564584,3577564591,DE -3577564592,3577564599,GB -3577564600,3577564927,DE -3577564928,3577565227,GB -3577565228,3577565255,DE -3577565256,3577565259,GB -3577565260,3577565271,DE -3577565272,3577565283,GB -3577565284,3577565287,DE -3577565288,3577565695,GB -3577565696,3577565711,DE -3577565712,3577565719,GB -3577565720,3577565743,DE -3577565744,3577565759,GB -3577565760,3577565775,DE -3577565776,3577565791,GB -3577565792,3577565823,DE -3577565824,3577565839,GB -3577565840,3577565847,DE -3577565848,3577565855,GB -3577565856,3577565863,DE -3577565864,3577565879,GB -3577565880,3577565895,DE -3577565896,3577565903,GB -3577565904,3577565911,DE -3577565912,3577565919,GB -3577565920,3577565943,DE -3577565944,3577565967,GB -3577565968,3577565975,DE -3577565976,3577565999,GB -3577566000,3577566007,DE -3577566008,3577566071,GB -3577566072,3577566079,DE -3577566080,3577566103,GB -3577566104,3577566119,DE -3577566120,3577566135,GB -3577566136,3577566143,DE -3577566144,3577566151,GB -3577566152,3577566175,DE -3577566176,3577566183,GB -3577566184,3577566191,DE -3577566192,3577566207,GB -3577566208,3577566219,DE -3577566220,3577566423,GB -3577566424,3577566431,DE -3577566432,3577566463,GB -3577566464,3577566711,DE -3577566712,3577566719,GB -3577566720,3577566943,DE -3577566944,3577566951,GB -3577566952,3577567039,DE -3577567040,3577567047,GB -3577567048,3577567111,DE -3577567112,3577567119,GB -3577567120,3577567127,DE -3577567128,3577567135,GB -3577567136,3577567167,DE -3577567168,3577567199,GB -3577567200,3577567495,DE -3577567496,3577567503,GB -3577567504,3577567615,DE -3577567616,3577567623,GB -3577567624,3577567639,DE -3577567640,3577567647,GB -3577567648,3577567663,DE -3577567664,3577567671,GB -3577567672,3577567679,DE -3577567680,3577567871,GB -3577567872,3577568351,DE -3577568352,3577568359,GB -3577568360,3577568479,DE -3577568480,3577568487,GB -3577568488,3577568495,DE -3577568496,3577568519,GB -3577568520,3577568527,DE -3577568528,3577569279,GB -3577569280,3577569383,DE -3577569384,3577569391,GB -3577569392,3577569499,DE -3577569500,3577569503,GB -3577569504,3577569855,DE -3577569856,3577569871,GB -3577569872,3577569887,DE -3577569888,3577569895,GB -3577569896,3577570367,DE -3577570368,3577570559,GB -3577570560,3577570703,DE -3577570704,3577570707,GB -3577570708,3577570911,DE -3577570912,3577570943,GB -3577570944,3577571695,DE -3577571696,3577571703,GB -3577571704,3577571775,DE -3577571776,3577571839,GB -3577571840,3577573051,DE -3577573052,3577573055,GB -3577573056,3577573071,DE -3577573072,3577573079,GB -3577573080,3577573119,DE -3577573120,3577573151,GB -3577573152,3577573175,DE -3577573176,3577573183,GB -3577573184,3577573191,DE -3577573192,3577573199,GB -3577573200,3577573439,DE -3577573440,3577574399,GB -3577574400,3577574479,DE -3577574480,3577575175,GB -3577575176,3577575191,DE -3577575192,3577575431,GB -3577575432,3577575583,DE -3577575584,3577575599,GB -3577575600,3577575655,DE -3577575656,3577575663,GB -3577575664,3577576799,DE -3577576800,3577576815,GB -3577576816,3577576847,DE -3577576848,3577576863,GB -3577576864,3577576911,DE -3577576912,3577576927,GB -3577576928,3577577231,DE +3577557232,3577559775,DE +3577559776,3577559783,FR +3577559784,3577562391,DE +3577562392,3577562399,GB +3577562400,3577577231,DE 3577577232,3577577247,US -3577577248,3577577391,DE -3577577392,3577577407,GB -3577577408,3577577647,DE -3577577648,3577577655,GB -3577577656,3577577783,DE -3577577784,3577577791,GB -3577577792,3577577887,DE -3577577888,3577577895,GB -3577577896,3577577923,DE -3577577924,3577577927,GB -3577577928,3577579887,DE -3577579888,3577579895,GB -3577579896,3577580127,DE -3577580128,3577580135,GB -3577580136,3577580175,DE -3577580176,3577580191,GB -3577580192,3577580343,DE -3577580344,3577580351,GB -3577580352,3577580375,DE -3577580376,3577580383,GB -3577580384,3577580407,DE -3577580408,3577580415,GB -3577580416,3577580483,DE -3577580484,3577580487,GB -3577580488,3577580895,DE -3577580896,3577580911,GB -3577580912,3577581015,DE -3577581016,3577581023,GB -3577581024,3577581903,DE -3577581904,3577581911,GB -3577581912,3577581919,DE -3577581920,3577581927,GB -3577581928,3577582015,DE -3577582016,3577582023,GB -3577582024,3577582111,DE -3577582112,3577582335,GB -3577582336,3577582343,DE -3577582344,3577582351,GB -3577582352,3577583247,DE -3577583248,3577583255,GB -3577583256,3577584143,DE -3577584144,3577584147,GB -3577584148,3577584183,DE -3577584184,3577584191,GB -3577584192,3577584295,DE -3577584296,3577584303,GB -3577584304,3577584351,DE -3577584352,3577584359,GB -3577584360,3577584383,DE -3577584384,3577584407,GB -3577584408,3577584463,DE -3577584464,3577584471,GB -3577584472,3577584591,DE -3577584592,3577584599,GB -3577584600,3577584639,DE -3577584640,3577584895,GB -3577584896,3577584903,DE -3577584904,3577584911,GB -3577584912,3577584927,DE -3577584928,3577584959,GB -3577584960,3577584991,DE -3577584992,3577585023,GB -3577585024,3577585415,DE -3577585416,3577585423,GB -3577585424,3577585439,DE -3577585440,3577585447,GB -3577585448,3577585463,DE -3577585464,3577585487,GB -3577585488,3577585599,DE -3577585600,3577585615,GB -3577585616,3577585631,DE -3577585632,3577585639,GB -3577585640,3577585647,DE -3577585648,3577585663,GB -3577585664,3577585919,DE -3577585920,3577586067,GB -3577586068,3577586071,DE -3577586072,3577586075,GB -3577586076,3577586079,DE -3577586080,3577586083,GB -3577586084,3577586087,DE -3577586088,3577586171,GB -3577586172,3577586175,DE -3577586176,3577586207,GB -3577586208,3577586319,DE -3577586320,3577586327,GB -3577586328,3577586431,DE -3577586432,3577586447,GB -3577586448,3577586495,DE -3577586496,3577586559,GB -3577586560,3577586575,DE -3577586576,3577586583,GB -3577586584,3577586647,DE -3577586648,3577586687,GB -3577586688,3577586711,DE -3577586712,3577586719,GB -3577586720,3577586751,DE -3577586752,3577586783,GB -3577586784,3577587103,DE -3577587104,3577587135,GB -3577587136,3577587239,DE -3577587240,3577587319,GB -3577587320,3577587327,DE -3577587328,3577587455,GB -3577587456,3577587479,DE -3577587480,3577587487,GB -3577587488,3577587503,DE -3577587504,3577587519,GB -3577587520,3577587615,DE -3577587616,3577587623,GB -3577587624,3577587631,DE -3577587632,3577587647,GB -3577587648,3577587783,DE -3577587784,3577587791,GB -3577587792,3577587847,DE -3577587848,3577587863,GB -3577587864,3577588095,DE -3577588096,3577588099,GB -3577588100,3577588103,DE -3577588104,3577588151,GB -3577588152,3577588155,DE -3577588156,3577588223,GB -3577588224,3577588511,DE -3577588512,3577588551,GB -3577588552,3577588559,DE -3577588560,3577588735,GB -3577588736,3577588783,DE -3577588784,3577588799,GB -3577588800,3577588803,DE -3577588804,3577588815,GB -3577588816,3577588863,DE -3577588864,3577588871,GB -3577588872,3577589015,DE -3577589016,3577589023,GB -3577589024,3577589503,DE -3577589504,3577589515,GB -3577589516,3577589519,DE -3577589520,3577589551,GB -3577589552,3577589555,DE -3577589556,3577589703,GB -3577589704,3577589735,DE -3577589736,3577589759,GB -3577589760,3577590219,DE -3577590220,3577590223,GB -3577590224,3577590399,DE -3577590400,3577590407,GB -3577590408,3577590975,DE -3577590976,3577591039,GB -3577591040,3577591807,DE -3577591808,3577591871,GB -3577591872,3577591887,DE -3577591888,3577591935,GB -3577591936,3577591959,DE -3577591960,3577591963,GB -3577591964,3577592011,DE -3577592012,3577592015,GB -3577592016,3577592543,DE -3577592544,3577592551,GB -3577592552,3577592703,DE -3577592704,3577592743,GB +3577577248,3577592431,DE +3577592432,3577592447,FR +3577592448,3577592743,DE 3577592744,3577592751,IE -3577592752,3577592767,GB -3577592768,3577593103,DE -3577593104,3577593111,GB -3577593112,3577593171,DE -3577593172,3577593175,GB -3577593176,3577593187,DE -3577593188,3577593199,GB -3577593200,3577593215,DE -3577593216,3577593223,GB -3577593224,3577593407,DE -3577593408,3577593415,GB -3577593416,3577600687,DE -3577600688,3577600703,GB -3577600704,3577600795,DE -3577600796,3577600831,GB -3577600832,3577600918,DE -3577600919,3577600919,GB -3577600920,3577601007,DE -3577601008,3577601023,GB -3577601024,3577601319,DE -3577601320,3577601327,GB -3577601328,3577601375,DE -3577601376,3577601383,GB -3577601384,3577601399,DE -3577601400,3577601407,GB -3577601408,3577601447,DE -3577601448,3577601455,GB -3577601456,3577601791,DE -3577601792,3577602063,GB -3577602064,3577602919,DE -3577602920,3577602927,GB -3577602928,3577602959,DE -3577602960,3577602967,GB -3577602968,3577603039,DE -3577603040,3577603055,GB -3577603056,3577603063,DE -3577603064,3577603079,GB -3577603080,3577603103,DE -3577603104,3577603111,GB -3577603112,3577603131,DE -3577603132,3577603135,GB -3577603136,3577603199,DE -3577603200,3577603247,GB -3577603248,3577603263,DE -3577603264,3577603271,GB -3577603272,3577603455,DE -3577603456,3577603471,GB -3577603472,3577603887,DE -3577603888,3577603903,GB -3577603904,3577604031,DE -3577604032,3577604095,GB -3577604096,3577606191,DE -3577606192,3577606199,GB -3577606200,3577606215,DE -3577606216,3577606223,GB -3577606224,3577606279,DE -3577606280,3577606287,GB -3577606288,3577606431,DE -3577606432,3577606447,GB -3577606448,3577606479,DE -3577606480,3577606487,GB -3577606488,3577606655,DE -3577606656,3577606663,GB -3577606664,3577606735,DE -3577606736,3577606783,GB -3577606784,3577606815,DE -3577606816,3577606831,GB -3577606832,3577606847,DE -3577606848,3577606855,GB -3577606856,3577606911,DE -3577606912,3577607007,GB -3577607008,3577607199,DE -3577607200,3577607423,GB -3577607424,3577607559,DE -3577607560,3577607567,GB -3577607568,3577607583,DE -3577607584,3577607615,GB -3577607616,3577607663,DE -3577607664,3577607671,GB -3577607672,3577607711,DE -3577607712,3577607719,GB -3577607720,3577607727,DE -3577607728,3577607735,GB -3577607736,3577607743,DE -3577607744,3577607775,GB -3577607776,3577607807,DE -3577607808,3577607815,GB -3577607816,3577607831,DE -3577607832,3577607839,GB -3577607840,3577607847,DE -3577607848,3577607855,GB -3577607856,3577608191,DE -3577608192,3577608447,GB -3577608448,3577608703,DE -3577608704,3577608959,GB -3577608960,3577608999,DE -3577609000,3577609007,GB -3577609008,3577609023,DE -3577609024,3577609071,GB -3577609072,3577609087,DE -3577609088,3577609215,GB -3577609216,3577609359,DE -3577609360,3577610239,GB -3577610240,3577610367,DE +3577592752,3577608743,DE +3577608744,3577608751,ES +3577608752,3577610367,DE 3577610368,3577610495,GB 3577610496,3577610751,DE 3577610752,3577611199,CH +3577611200,3577611263,EU 3577611264,3577612287,DE +3577612288,3577612319,EU 3577612320,3577612383,DE +3577612384,3577612415,EU 3577612416,3577612543,NO 3577612544,3577612799,HU 3577612800,3577613055,FI +3577613056,3577613311,EU 3577613312,3577613567,DE -3577613888,3577613951,TR +3577613568,3577614079,EU 3577614080,3577614111,DE +3577614112,3577614143,EU 3577614144,3577614207,DE +3577614208,3577618431,EU 3577618432,3577618447,GB 3577618448,3577618463,NL 3577618464,3577618559,GB 3577618560,3577618623,BE -3577618656,3577618663,AT +3577618624,3577618655,EU +3577618656,3577618671,AT +3577618672,3577618687,EU 3577618688,3577619935,GB +3577619936,3577619967,EU 3577619968,3577620575,GB +3577620576,3577620623,EU 3577620624,3577620671,GB 3577620672,3577620735,TR +3577620736,3577620991,EU 3577620992,3577621055,GB +3577621056,3577621119,EU 3577621120,3577621151,GB +3577621152,3577621215,EU 3577621216,3577621223,SK +3577621224,3577621247,EU 3577621248,3577622143,GB 3577622144,3577622271,DE 3577622272,3577622527,GB +3577622528,3577622591,EU 3577622592,3577622927,GB +3577622928,3577623039,EU 3577623040,3577623935,GB +3577623936,3577624063,EU 3577624064,3577624319,GB +3577624320,3577624447,EU 3577624448,3577624879,GB +3577624880,3577624895,EU 3577624896,3577625199,GB +3577625200,3577625207,EU 3577625208,3577625215,GB +3577625216,3577625231,EU 3577625232,3577625599,GB -3577625728,3577625839,GB -3577625848,3577626127,GB +3577625600,3577625823,EU +3577625824,3577625839,GB +3577625840,3577625855,DE +3577625856,3577626175,GB +3577626176,3577626239,EU 3577626240,3577626367,GB +3577626368,3577626623,EU 3577626624,3577627135,FR +3577627136,3577627391,EU 3577627392,3577627647,GB 3577627648,3577627967,FR +3577627968,3577627999,EU 3577628000,3577628671,FR 3577628672,3577630719,CH -3577630720,3577630975,GB -3577631232,3577631743,GB +3577630720,3577631743,GB +3577631744,3577633791,EU 3577633792,3577633951,CZ +3577633952,3577633959,EU 3577633960,3577633967,CZ +3577633968,3577634047,EU 3577634048,3577634239,CZ +3577634240,3577634815,EU 3577634816,3577635455,FR +3577635456,3577635519,EU 3577635520,3577635839,FR 3577635840,3577636863,DE 3577636864,3577638143,GB 3577638144,3577638399,BE 3577638400,3577638911,GB 3577638912,3577638959,FR +3577638960,3577638967,EU 3577638968,3577639239,FR -3577639248,3577639743,FR -3577639760,3577639783,FR -3577639792,3577639807,FR -3577639840,3577639871,FR -3577639936,3577641175,FR -3577641184,3577641279,FR -3577641344,3577641407,FR -3577641416,3577641423,FR -3577641472,3577641983,FR -3577641984,3577642007,GB -3577642016,3577642031,GB -3577642056,3577642063,GB -3577642080,3577642095,GB -3577642176,3577642207,GB -3577642224,3577642239,GB -3577642240,3577642623,FR +3577639240,3577639247,EU +3577639248,3577639679,FR +3577639680,3577639767,EU +3577639768,3577639783,FR +3577639784,3577639799,EU +3577639800,3577639807,FR +3577639808,3577639839,EU +3577639840,3577639847,FR +3577639848,3577639863,EU +3577639864,3577639871,FR +3577639872,3577639935,EU +3577639936,3577640719,FR +3577640720,3577640735,EU +3577640736,3577641151,FR +3577641152,3577641159,EU +3577641160,3577641175,FR +3577641176,3577641183,EU +3577641184,3577641199,FR +3577641200,3577641215,EU +3577641216,3577641391,FR +3577641392,3577641399,EU +3577641400,3577641423,FR +3577641424,3577641983,EU +3577641984,3577642023,GB +3577642024,3577642031,EU +3577642032,3577642111,GB +3577642112,3577642175,EU +3577642176,3577642239,GB +3577642240,3577642495,EU +3577642496,3577642623,FR +3577642624,3577642751,EU 3577642752,3577643007,FR 3577643008,3577643231,NL 3577643232,3577643247,GB 3577643248,3577643263,NL +3577643264,3577645431,EU 3577645432,3577645447,NL +3577645448,3577645455,EU 3577645456,3577645503,NL 3577645504,3577645567,SK +3577645568,3577645823,EU 3577645824,3577645887,NL +3577645888,3577645903,EU 3577645904,3577645951,NL +3577645952,3577646079,EU 3577646080,3577646207,NL 3577646208,3577646335,NO 3577646336,3577646407,NL +3577646408,3577646415,EU 3577646416,3577646527,NL +3577646528,3577646591,EU 3577646592,3577646847,NL +3577646848,3577647103,EU 3577647104,3577647911,DK +3577647912,3577647935,EU 3577647936,3577647967,DK +3577647968,3577647999,EU 3577648000,3577648127,DK -3577648384,3577649151,NL +3577648128,3577648639,EU +3577648640,3577649151,NL +3577649152,3577651199,EU 3577651200,3577651455,GB +3577651456,3577652223,EU 3577652224,3577652671,IT +3577652672,3577652735,EU 3577652736,3577652743,NO +3577652744,3577652751,EU 3577652752,3577652767,NO +3577652768,3577652863,EU 3577652864,3577652943,NO +3577652944,3577652991,EU 3577652992,3577653119,NO +3577653120,3577653247,EU 3577653248,3577655295,IT 3577655296,3577655519,AT +3577655520,3577655551,EU 3577655552,3577655647,AT +3577655648,3577655663,EU 3577655664,3577655679,AT +3577655680,3577655711,EU 3577655712,3577655743,AT +3577655744,3577655807,EU 3577655808,3577656447,AT -3577657344,3577659391,GB +3577656448,3577657343,EU +3577657344,3577657599,GB +3577657600,3577657663,EU +3577657664,3577659391,GB 3577659392,3577659679,GR +3577659680,3577659711,EU 3577659712,3577659743,GR -3577659904,3577660159,GB +3577659744,3577660159,EU 3577660160,3577660607,BE +3577660608,3577660671,EU 3577660672,3577661439,BE +3577661440,3577663487,EU 3577663488,3577665215,SE +3577665216,3577665247,EU 3577665248,3577665311,SE +3577665312,3577665343,EU 3577665344,3577665375,SE +3577665376,3577665407,EU 3577665408,3577665455,SE +3577665456,3577665535,EU 3577665536,3577665591,ES +3577665592,3577665599,EU 3577665600,3577665607,ES +3577665608,3577665615,EU 3577665616,3577665679,ES +3577665680,3577665791,EU 3577665792,3577665823,BE 3577665824,3577665855,RO 3577665856,3577665919,LU +3577665920,3577666047,EU 3577666048,3577666175,ES +3577666176,3577667583,EU 3577667584,3577667743,PL +3577667744,3577668639,EU 3577668640,3577668671,IE +3577668672,3577668735,EU 3577668736,3577668799,IE +3577668800,3577669119,EU 3577669120,3577669383,HU +3577669384,3577669503,EU 3577669504,3577669631,HU 3577669632,3577671679,BE 3577671680,3577672191,ZA 3577672192,3577673727,DE +3577673728,3577675775,EU 3577675776,3577741311,PT 3577741312,3578003455,SE 3578003456,3578049023,DE 3578049024,3578049055,CH -3578049056,3578235279,DE -3578235280,3578235295,NL -3578235296,3578265599,DE +3578049056,3578208127,DE +3578208128,3578208191,PK +3578208192,3578234759,DE +3578234760,3578234767,US +3578234768,3578236791,DE +3578236792,3578236799,PL +3578236800,3578265599,DE 3578265600,3578331135,GB 3578331136,3578339327,PL 3578339328,3578347519,ES @@ -74743,41 +120899,103 @@ 3578855424,3578888191,GB 3578888192,3578920959,SK 3578920960,3578986495,IT -3578986496,3578996999,DE +3578986496,3578988095,DE +3578988096,3578988099,CH +3578988100,3578996999,DE 3578997000,3578997007,CH -3578997008,3578998575,DE +3578997008,3578997935,DE +3578997936,3578997943,FR +3578997944,3578998575,DE 3578998576,3578998583,GB -3578998584,3579002879,DE +3578998584,3578999647,DE +3578999648,3578999651,CH +3578999652,3579002879,DE 3579002880,3579019263,GB 3579019264,3579052031,DK 3579052032,3579117567,NL 3579117568,3579132159,RU 3579132160,3579132415,BY 3579132416,3579183103,RU -3579183104,3579191759,GB +3579183104,3579188239,GB +3579188240,3579188255,BE +3579188256,3579188415,GB +3579188416,3579188431,IS +3579188432,3579191759,GB 3579191760,3579191775,DE 3579191776,3579193599,GB -3579193600,3579193695,NL -3579193696,3579193711,GB +3579193600,3579193703,NL +3579193704,3579193704,GB +3579193705,3579193705,NL +3579193706,3579193711,GB 3579193712,3579193727,BE -3579193728,3579193743,GB -3579193744,3579193855,NL -3579193856,3579197055,GB +3579193728,3579193815,NL +3579193816,3579193823,ES +3579193824,3579193855,NL +3579193856,3579194103,GB +3579194104,3579194111,US +3579194112,3579197055,GB 3579197056,3579197183,US -3579197184,3579197871,GB -3579197872,3579197887,US +3579197184,3579197311,GB +3579197312,3579197439,US +3579197440,3579197887,GB 3579197888,3579197903,IT -3579197904,3579228159,GB -3579228160,3579228415,US -3579228416,3579228671,GB +3579197904,3579205631,GB +3579205632,3579205887,IE +3579205888,3579210079,GB +3579210080,3579210087,BE +3579210088,3579221071,GB +3579221072,3579221087,DE +3579221088,3579221103,GB +3579221104,3579221119,IT +3579221120,3579221471,GB +3579221472,3579221503,ES +3579221504,3579223071,GB +3579223072,3579223087,BE +3579223088,3579223103,FR +3579223104,3579226143,GB +3579226144,3579226151,DE +3579226152,3579226327,GB +3579226328,3579226351,FR +3579226352,3579228191,GB +3579228192,3579228207,IT +3579228208,3579228223,ES +3579228224,3579228671,GB 3579228672,3579228799,US -3579228800,3579241151,GB +3579228800,3579231815,GB +3579231816,3579231831,FR +3579231832,3579231919,GB +3579231920,3579231927,US +3579231928,3579237183,GB +3579237184,3579237215,DE +3579237216,3579237247,NL +3579237248,3579240143,GB +3579240144,3579240159,CH +3579240160,3579241151,GB 3579241152,3579241215,IE -3579241216,3579242751,GB -3579242752,3579243007,US -3579243008,3579248639,GB -3579248640,3579314175,RU -3579314176,3579346943,IT +3579241216,3579244375,GB +3579244376,3579244383,CH +3579244384,3579247199,GB +3579247200,3579247207,DE +3579247208,3579247223,GB +3579247224,3579247231,FR +3579247232,3579247271,GB +3579247272,3579247279,US +3579247280,3579247311,GB +3579247312,3579247319,FR +3579247320,3579247391,GB +3579247392,3579247399,US +3579247400,3579247407,GB +3579247408,3579247415,US +3579247416,3579247535,GB +3579247536,3579247543,IE +3579247544,3579247567,GB +3579247568,3579247575,DE +3579247576,3579247583,GB +3579247584,3579247615,US +3579247616,3579248135,GB +3579248136,3579248143,DE +3579248144,3579248639,GB +3579248640,3579346943,RU 3579346944,3579361535,SE 3579361536,3579361791,NO 3579361792,3579362047,SE @@ -74920,12 +121138,14 @@ 3579497984,3579497991,NL 3579497992,3579527167,FR 3579527168,3579543551,BA -3579543552,3579576319,BG -3579576320,3579579263,IT -3579579264,3579579295,US -3579579296,3579582367,IT -3579582368,3579582399,US -3579582400,3579596927,IT +3579543552,3579552767,BG +3579552768,3579553023,A2 +3579553024,3579553535,BG +3579553536,3579553791,A2 +3579553792,3579576319,BG +3579576320,3579595967,IT +3579595968,3579595983,A2 +3579595984,3579596927,IT 3579596928,3579597055,GR 3579597056,3579600191,IT 3579600192,3579600207,US @@ -74943,22 +121163,28 @@ 3579740160,3579772927,IE 3579772928,3579838463,DE 3579838464,3580100607,ES -3580100608,3580213247,SE +3580100608,3580198911,SE +3580198912,3580199423,LV +3580199424,3580199935,SE +3580199936,3580200447,EE +3580200448,3580200959,SE +3580200960,3580201471,LT +3580201472,3580203519,SE +3580203520,3580204543,RU +3580204544,3580205055,SE +3580205056,3580207103,HR +3580207104,3580208127,SE +3580208128,3580208639,EE +3580208640,3580213247,SE 3580213248,3580214271,CH 3580214272,3580214783,LV -3580214784,3580216831,SE -3580216832,3580217087,PT -3580217088,3580222463,SE -3580222464,3580222719,FR -3580222720,3580223487,SE +3580214784,3580223487,SE 3580223488,3580231679,DE -3580231680,3580231935,LV -3580231936,3580232191,LT -3580232192,3580233215,LV -3580233216,3580233727,LT +3580231680,3580231935,LT +3580231936,3580232447,LV +3580232448,3580233727,LT 3580233728,3580235263,SE -3580235264,3580235775,LT -3580235776,3580236799,SE +3580235264,3580236799,LT 3580236800,3580237567,LV 3580237568,3580237823,LT 3580237824,3580239359,SE @@ -74966,18 +121192,15 @@ 3580239872,3580241919,SE 3580241920,3580243967,CH 3580243968,3580248063,NL -3580248064,3580250111,ES -3580250112,3580252671,SE +3580248064,3580252671,SE 3580252672,3580254207,EE 3580254208,3580260351,DE 3580260352,3580265727,AT -3580265728,3580266495,SE -3580266496,3580272639,PL -3580272640,3580280831,FR -3580280832,3580289023,SE -3580289024,3580329983,FR -3580329984,3580338175,CH -3580338176,3580362751,FR +3580265728,3580338175,SE +3580338176,3580338432,HR +3580338433,3580338687,SE +3580338688,3580339199,HR +3580339200,3580362751,SE 3580362752,3580473375,GB 3580473376,3580473391,IE 3580473392,3580473503,GB @@ -75014,53 +121237,127 @@ 3580475124,3580475127,IE 3580475128,3580475343,GB 3580475344,3580475351,IE -3580475352,3580887039,GB +3580475352,3580624895,GB +3580624896,3580626943,RU +3580626944,3580628991,PL +3580628992,3580631039,RU +3580631040,3580632575,NL +3580632576,3580632831,DE +3580632832,3580633087,GB +3580633088,3580635135,RU +3580635136,3580637183,UA +3580637184,3580639231,KZ +3580639232,3580641279,PL +3580641280,3580643327,FR +3580643328,3580645375,UA +3580645376,3580647423,PL +3580647424,3580649471,DE +3580649472,3580651519,SE +3580651520,3580653567,NL +3580653568,3580655615,PL +3580655616,3580657663,SK +3580657664,3580663807,RU +3580663808,3580665855,PL +3580665856,3580667903,CZ +3580667904,3580669951,RU +3580669952,3580671999,UA +3580672000,3580682239,RU +3580682240,3580684287,PL +3580684288,3580686335,FR +3580686336,3580688383,BG +3580688384,3580698623,RU +3580698624,3580702719,PL +3580702720,3580710911,RU +3580710912,3580715007,UA +3580715008,3580719103,RU +3580719104,3580723199,NL +3580723200,3580727295,UA +3580727296,3580731391,RU +3580731392,3580739583,RO +3580739584,3580743679,RU +3580743680,3580751871,UA +3580751872,3580755967,IR +3580755968,3580772351,RU +3580772352,3580780543,LV +3580780544,3580805119,UA +3580805120,3580821503,RU +3580821504,3580837887,FR +3580837888,3580887039,UA 3580887040,3581149183,SE +3581149184,3581150367,EU 3581150368,3581150463,IE +3581150464,3581150591,EU 3581150592,3581150719,NL 3581150720,3581150783,SE +3581150784,3581150975,EU 3581150976,3581151039,SE +3581151040,3581151231,EU 3581151232,3581151295,SE +3581151296,3581154047,EU 3581154048,3581154303,NL +3581154304,3581157119,EU 3581157120,3581158655,AT +3581158656,3581159167,EU 3581159168,3581159295,AT +3581159296,3581159423,EU 3581159424,3581161471,IE +3581161472,3581173759,EU 3581173760,3581196799,NL +3581196800,3581197311,EU 3581197312,3581197567,IE -3581197824,3581200127,NL +3581197568,3581197823,EU +3581197824,3581198335,GB +3581198336,3581200127,NL +3581200128,3581203967,EU 3581203968,3581214719,SE 3581214720,3581231103,NL +3581231104,3581239295,EU 3581239296,3581241343,NL +3581241344,3581255679,EU 3581255680,3581259263,FR +3581259264,3581261311,EU 3581261312,3581261439,FR +3581261440,3581279103,EU 3581279104,3581279199,NL +3581279200,3581280255,EU 3581280256,3581411327,BE 3581411328,3581673471,GB 3581673472,3581935615,NL 3581935616,3581943807,RU 3581943808,3581951999,FR -3581952000,3581976575,DE -3581976576,3581984767,ES +3581952000,3581960191,TR +3581960192,3581976575,DE +3581976576,3581984767,NO 3581984768,3581992959,RU 3581992960,3582001151,GB 3582001152,3582009343,DK 3582009344,3582017535,RU 3582017536,3582025727,GB 3582025728,3582033919,RU +3582033920,3582042111,CZ 3582042112,3582050303,ES 3582050304,3582058495,NL 3582058496,3582066687,AT 3582066688,3582074879,UA 3582074880,3582078631,GB 3582078632,3582078639,DE -3582078640,3582083071,GB +3582078640,3582081023,GB +3582081024,3582081535,ES +3582081536,3582081791,DE +3582081792,3582083071,GB 3582083072,3582091263,BG 3582091264,3582099455,QA 3582099456,3582107647,GB 3582107648,3582115839,NL -3582115840,3582132223,FI +3582115840,3582120959,SE +3582120960,3582121983,EE +3582121984,3582124031,SE +3582124032,3582125383,FI +3582125384,3582125391,AX +3582125392,3582132223,FI 3582132224,3582140415,RU 3582140416,3582148607,GE +3582148608,3582156799,EG 3582156800,3582164991,GB 3582164992,3582173183,SE 3582173184,3582181375,GB @@ -75070,17 +121367,21 @@ 3582190928,3582190931,FR 3582190932,3582191023,DE 3582191024,3582191031,BE -3582191032,3582192287,DE +3582191032,3582192127,DE +3582192128,3582192143,NL +3582192144,3582192287,DE 3582192288,3582192303,CH -3582192304,3582194863,DE +3582192304,3582194775,DE +3582194776,3582194783,CY +3582194784,3582194863,DE 3582194864,3582194879,CH 3582194880,3582195135,DE 3582195136,3582195143,CH -3582195144,3582195175,DE -3582195176,3582195183,BE -3582195184,3582196183,DE +3582195144,3582196183,DE 3582196184,3582196191,BE -3582196192,3582197759,DE +3582196192,3582197127,DE +3582197128,3582197135,BZ +3582197136,3582197759,DE 3582197760,3582205951,DK 3582205952,3582214143,AE 3582214144,3582222335,RU @@ -75088,7 +121389,11 @@ 3582222512,3582222527,DK 3582222528,3582222863,SE 3582222864,3582222879,NO -3582222880,3582230527,SE +3582222880,3582223967,SE +3582223968,3582223975,NO +3582223976,3582226599,SE +3582226600,3582226607,FI +3582226608,3582230527,SE 3582230528,3582238719,BE 3582238720,3582255103,NL 3582255104,3582263295,KW @@ -75115,130 +121420,256 @@ 3582435328,3582443519,MK 3582443520,3582451711,DE 3582451712,3582459903,LU -3582459904,3582468095,NL +3582459904,3582462143,NL +3582462144,3582462207,DE +3582462208,3582467135,NL +3582467136,3582467199,DE +3582467200,3582468095,NL 3582468096,3582476287,SE 3582476288,3582484479,DE +3582484480,3582492671,CI 3582492672,3582509055,IT 3582509056,3582517247,SA 3582517248,3582525439,PL -3582525440,3582533631,GB +3582525440,3582525695,IM +3582525696,3582525727,GB +3582525728,3582525735,IM +3582525736,3582525743,GB +3582525744,3582525747,IM +3582525748,3582525879,GB +3582525880,3582525895,IM +3582525896,3582525923,GB +3582525924,3582525927,IM +3582525928,3582525959,GB +3582525960,3582525975,IM +3582525976,3582526055,GB +3582526056,3582526063,IM +3582526064,3582526135,GB +3582526136,3582526143,IM +3582526144,3582526463,GB +3582526464,3582526503,IM +3582526504,3582526815,GB +3582526816,3582526819,IM +3582526820,3582526911,GB +3582526912,3582526927,IM +3582526928,3582527231,GB +3582527232,3582527271,IM +3582527272,3582527311,GB +3582527312,3582527335,IM +3582527336,3582527455,GB +3582527456,3582527463,IM +3582527464,3582527479,GB +3582527480,3582527743,IM +3582527744,3582529023,GB +3582529024,3582530303,IM +3582530304,3582530399,GB +3582530400,3582530815,IM +3582530816,3582530951,GB +3582530952,3582530959,IM +3582530960,3582530979,GB +3582530980,3582530983,IM +3582530984,3582530991,GB +3582530992,3582531007,IM +3582531008,3582531031,GB +3582531032,3582531039,IM +3582531040,3582531071,GB +3582531072,3582531423,IM +3582531424,3582531431,GB +3582531432,3582531439,IM +3582531440,3582531471,GB +3582531472,3582531487,IM +3582531488,3582531511,GB +3582531512,3582531535,IM +3582531536,3582531551,GB +3582531552,3582531559,IM +3582531560,3582531583,GB +3582531584,3582531631,IM +3582531632,3582531647,GB +3582531648,3582531663,IM +3582531664,3582531687,GB +3582531688,3582531695,IM +3582531696,3582531767,GB +3582531768,3582531775,IM +3582531776,3582531783,GB +3582531784,3582531791,IM +3582531792,3582531799,GB +3582531800,3582531807,IM +3582531808,3582531823,GB +3582531824,3582532607,IM +3582532608,3582532927,GB +3582532928,3582532983,IM +3582532984,3582532991,GB +3582532992,3582533119,IM +3582533120,3582533631,GB 3582533632,3582538183,BG 3582538184,3582538191,GB 3582538192,3582541823,BG 3582541824,3582550015,US -3582550016,3582550059,CS -3582550060,3582550063,RS -3582550064,3582550527,CS -3582550528,3582550531,RS -3582550532,3582550915,CS -3582550916,3582550919,RS -3582550920,3582551103,CS -3582551104,3582551107,RS -3582551108,3582551191,CS -3582551192,3582551215,RS -3582551216,3582551551,CS -3582551552,3582553599,RS -3582553600,3582554623,CS -3582554624,3582555391,RS -3582555392,3582555647,CS -3582555648,3582557183,RS -3582557184,3582557439,CS -3582557440,3582557951,RS -3582557952,3582558079,CS -3582558080,3582558207,RS +3582550016,3582558207,RS 3582558208,3582566399,MC +3582566400,3582566431,EU 3582566432,3582566479,BE -3582566480,3582566495,SA +3582566480,3582566527,EU 3582566528,3582566591,BE +3582566592,3582566735,EU 3582566736,3582566743,BE +3582566744,3582566751,EU 3582566752,3582566767,BE +3582566768,3582566783,EU 3582566784,3582566847,BE +3582566848,3582566863,EU 3582566864,3582566879,BE +3582566880,3582566911,EU 3582566912,3582567019,BE +3582567020,3582567023,EU 3582567024,3582567039,BE +3582567040,3582567135,EU 3582567136,3582567151,BE +3582567152,3582567231,EU 3582567232,3582567295,BE +3582567296,3582567391,EU 3582567392,3582567399,BE +3582567400,3582567423,EU 3582567424,3582567807,US +3582567808,3582567903,EU 3582567904,3582567935,US -3582567936,3582568191,GB -3582568192,3582568199,SE -3582568208,3582568223,SE +3582567936,3582568215,EU +3582568216,3582568223,SE +3582568224,3582568247,EU 3582568248,3582568263,SE +3582568264,3582568335,EU 3582568336,3582568339,SE -3582568344,3582568351,SE -3582568432,3582568447,SE +3582568340,3582568439,EU +3582568440,3582568447,SE 3582568448,3582568703,US +3582568704,3582568831,EU 3582568832,3582568959,US 3582568960,3582568967,HU -3582568976,3582568983,AT +3582568968,3582568991,EU 3582568992,3582569023,CZ +3582569024,3582569031,EU 3582569032,3582569035,AT 3582569036,3582569039,DE +3582569040,3582569043,AT +3582569044,3582569079,EU 3582569080,3582569087,HU +3582569088,3582569095,EU 3582569096,3582569103,HU -3582569152,3582569167,HU -3582569208,3582569239,AT +3582569104,3582569207,EU +3582569208,3582569215,AT +3582569216,3582569279,EU 3582569280,3582569303,AT -3582569472,3582569983,FR -3582569984,3582570239,GB +3582569304,3582569471,EU +3582569472,3582569535,FR +3582569536,3582569983,EU +3582569984,3582570239,FR 3582570240,3582570367,DE -3582570368,3582570431,FR -3582570464,3582570479,FR -3582570752,3582570831,FR -3582570848,3582570863,FR -3582570880,3582570895,FR -3582570904,3582570943,FR -3582570984,3582571039,FR -3582571048,3582571055,FR -3582571264,3582571303,FR +3582570368,3582570399,EU +3582570400,3582570431,FR +3582570432,3582570463,EU +3582570464,3582570471,FR +3582570472,3582570751,EU +3582570752,3582570823,FR +3582570824,3582570847,EU +3582570848,3582570855,FR +3582570856,3582570879,EU +3582570880,3582570883,FR +3582570884,3582570887,EU +3582570888,3582570895,FR +3582570896,3582570903,EU +3582570904,3582570975,FR +3582570976,3582570983,EU +3582570984,3582571031,FR +3582571032,3582571135,EU +3582571136,3582571199,FR +3582571200,3582571303,EU 3582571304,3582571307,CH -3582571308,3582571319,FR -3582571328,3582571343,FR +3582571308,3582571311,FR +3582571312,3582571375,EU 3582571376,3582571391,FR -3582571408,3582571455,FR -3582571648,3582571671,IE -3582571672,3582571679,GB -3582571680,3582571707,IE -3582571720,3582571839,IE -3582571856,3582571871,IE -3582571896,3582571903,IE -3582571976,3582571991,IE +3582571392,3582571407,EU +3582571408,3582571423,FR +3582571424,3582571455,EU +3582571456,3582571487,FR +3582571488,3582571647,EU +3582571648,3582571687,IE +3582571688,3582571691,EU +3582571692,3582571707,IE +3582571708,3582571727,EU +3582571728,3582571743,IE +3582571744,3582571751,EU +3582571752,3582571839,IE +3582571840,3582571999,EU 3582572000,3582572015,IE +3582572016,3582572023,EU 3582572024,3582572031,IE -3582572032,3582572463,CH +3582572032,3582572415,EU +3582572416,3582572431,CH +3582572432,3582572447,EU +3582572448,3582572451,CH +3582572452,3582572455,EU +3582572456,3582572459,CH +3582572460,3582572479,EU 3582572480,3582572543,CH -3582572544,3582572551,DE +3582572544,3582572559,EU 3582572560,3582572567,DE -3582572624,3582572639,DE -3582572800,3582572871,DE +3582572568,3582572799,EU +3582572800,3582572863,DE +3582572864,3582572943,EU 3582572944,3582572951,DE +3582572952,3582572975,EU 3582572976,3582572983,DE +3582572984,3582573023,EU 3582573024,3582573055,DE +3582573056,3582573087,EU 3582573088,3582573095,DE -3582573104,3582573135,DE +3582573096,3582573103,EU +3582573104,3582573111,DE +3582573112,3582573127,EU +3582573128,3582573135,DE +3582573136,3582573183,EU 3582573184,3582573215,DE -3582573408,3582573519,DE +3582573216,3582573407,EU +3582573408,3582573423,DE +3582573424,3582573431,EU +3582573432,3582573439,DE +3582573440,3582573511,EU +3582573512,3582573519,DE +3582573520,3582573551,EU 3582573552,3582573567,DE -3582573608,3582573703,CH +3582573568,3582573599,EU +3582573600,3582573615,CH +3582573616,3582573631,EU +3582573632,3582573695,CH +3582573696,3582573727,EU 3582573728,3582573759,CH -3582573824,3582573855,CH -3582573888,3582573903,CH -3582573912,3582573951,CH -3582573952,3582574079,LI +3582573760,3582573823,EU +3582573824,3582573887,CH +3582573888,3582573895,EU +3582573896,3582573903,CH +3582573904,3582573911,EU +3582573912,3582574015,CH +3582574016,3582574431,EU 3582574432,3582574435,CH -3582574456,3582574479,CH +3582574436,3582574455,EU +3582574456,3582574463,CH +3582574464,3582574591,EU 3582574592,3582582783,DE 3582582784,3582590975,RU 3582590976,3582599167,FR 3582599168,3582607359,DE -3582615552,3582619391,CY -3582619392,3582619647,UA -3582619648,3582622591,CY +3582607360,3582615551,RU +3582615552,3582618111,A2 +3582618112,3582618367,CY +3582618368,3582619647,A2 +3582619648,3582619903,CY +3582619904,3582620671,A2 +3582620672,3582622207,CY +3582622208,3582622591,A2 3582622592,3582622719,LB -3582622720,3582623743,CY +3582622720,3582623743,A2 3582623744,3582631935,FI -3582631936,3582640127,IT +3582631936,3582640127,NO 3582640128,3582648319,RU 3582648320,3582656511,PT 3582656512,3582664047,ES @@ -75251,17 +121682,15 @@ 3582697472,3582705663,FI 3582705664,3582722047,TR 3582722048,3582730239,IT -3582730240,3582735871,ES -3582735872,3582736127,GB -3582736128,3582736383,ES +3582730240,3582736383,ES 3582736384,3582737407,DZ 3582737408,3582737919,MA -3582737920,3582738431,NG -3582738432,3582746623,IT +3582737920,3582738431,ES +3582738432,3582746623,DK 3582746624,3582754815,RU 3582754816,3582763007,GR 3582763008,3582771199,FI -3582771200,3582779391,IT +3582771200,3582779391,CY 3582779392,3582787583,RU 3582787584,3582795775,PT 3582795776,3582803967,ES @@ -75273,7 +121702,7 @@ 3582853120,3582861311,SE 3582869504,3582877695,NO 3582877696,3582885887,AT -3582885888,3582894079,GR +3582885888,3582894079,TR 3582894080,3582902271,CH 3582902272,3582910463,RU 3582910464,3582918655,SI @@ -75289,40 +121718,37 @@ 3582992384,3583000575,ES 3583000576,3583008767,IT 3583008768,3583016959,TR -3583016960,3583017847,CH -3583017848,3583017855,US -3583017856,3583019367,CH +3583016960,3583019367,CH 3583019368,3583019375,DE 3583019376,3583023215,CH 3583023216,3583023223,DE 3583023224,3583025151,CH 3583025152,3583028991,IT -3583028992,3583029247,US +3583028992,3583029119,DJ +3583029120,3583029247,US 3583029248,3583029375,SG 3583029376,3583029503,FR 3583029504,3583029759,IT 3583029760,3583030015,GR 3583030016,3583030783,IT -3583030784,3583031039,GR +3583030784,3583030847,IE +3583030848,3583031039,GR 3583031040,3583031295,FR -3583031296,3583031551,GR -3583031552,3583031807,GB -3583031808,3583031839,GR -3583031840,3583031871,IT -3583031872,3583031887,GR -3583031888,3583031935,GB -3583031936,3583032095,IT +3583031296,3583031839,GR +3583031840,3583031847,IT +3583031848,3583031895,GR +3583031896,3583031903,SG +3583031904,3583031919,LB +3583031920,3583032095,IT 3583032096,3583032127,GR 3583032128,3583032159,IT 3583032160,3583032191,FR 3583032192,3583032319,IT -3583032320,3583032831,NL -3583032832,3583033087,GR -3583033088,3583033343,IT +3583032320,3583032575,FR +3583032576,3583033343,IT 3583033344,3583041535,FR 3583041536,3583049727,NL -3583049728,3583057919,IT -3583057920,3583066111,RU +3583049728,3583066111,RU 3583066112,3583074303,DE 3583074304,3583082495,BG 3583082496,3583090687,KG @@ -75336,86 +121762,75 @@ 3583141728,3583141735,AT 3583141736,3583148031,DE 3583148032,3583157247,GB -3583157248,3583159039,DE -3583159040,3583159295,GB -3583159296,3583159327,DE -3583159328,3583159359,GB +3583157248,3583157279,IE +3583157280,3583157439,GB +3583157440,3583157471,IE +3583157472,3583157487,GB +3583157488,3583157503,IE +3583157504,3583158511,GB +3583158512,3583158527,IE +3583158528,3583159039,DE +3583159040,3583159359,GB 3583159360,3583159375,DE -3583159376,3583159551,GB -3583159552,3583159615,DE -3583159616,3583160063,GB -3583160064,3583161343,DE -3583161344,3583161599,GB -3583161600,3583162623,DE -3583162624,3583164415,GB +3583159376,3583160319,GB +3583160320,3583161343,DE +3583161344,3583162271,GB +3583162272,3583162303,IE +3583162304,3583162367,GB +3583162368,3583162623,DE +3583162624,3583163391,GB +3583163392,3583163903,IE +3583163904,3583164415,GB 3583164416,3583172607,PT 3583172608,3583188991,DE 3583188992,3583197183,RU -3583205376,3583212619,HR -3583212620,3583212623,SI -3583212624,3583213567,HR -3583213568,3583221759,RU +3583197184,3583205375,KE +3583205376,3583213567,HR +3583213568,3583221759,IR 3583221760,3583229951,AT 3583229952,3583238143,RU 3583238144,3583246335,GB 3583246336,3583254527,RU 3583254528,3583262719,GB 3583262720,3583270911,TR -3583270912,3583279103,NL -3583279104,3583287295,DE +3583270912,3583287295,DE 3583287296,3583295487,RU 3583295488,3583303679,ES 3583303680,3583311871,NL 3583311872,3583320063,RU 3583320064,3583328255,HR 3583328256,3583336447,DE -3583336448,3583337471,CS -3583337472,3583337487,ME -3583337488,3583337727,CS +3583336448,3583337727,ME 3583337728,3583337983,AL -3583337984,3583337999,CS -3583338000,3583338015,ME -3583338016,3583338023,CS +3583337984,3583338015,ME +3583338016,3583338023,RS 3583338024,3583338031,ME -3583338032,3583338175,CS -3583338176,3583338239,ME -3583338240,3583338255,CS -3583338256,3583338495,ME -3583338496,3583338751,CS -3583338752,3583339007,ME -3583339008,3583339519,CS -3583339520,3583340287,AL -3583340288,3583340303,CS -3583340304,3583340319,ME -3583340320,3583340351,CS -3583340352,3583340543,ME -3583340544,3583340927,CS -3583340928,3583341039,ME -3583341040,3583341311,AL -3583341312,3583341327,ME -3583341328,3583341343,CS -3583341344,3583341567,ME -3583341568,3583341583,CS -3583341584,3583341727,ME -3583341728,3583341759,CS -3583341760,3583342335,ME -3583342336,3583342607,CS -3583342608,3583342847,ME -3583342848,3583342863,CS -3583342864,3583342911,ME -3583342912,3583342975,CS -3583342976,3583343231,ME -3583343232,3583343359,CS -3583343360,3583343871,ME -3583343872,3583343999,CS -3583344000,3583344639,ME +3583338032,3583338047,RS +3583338048,3583338143,ME +3583338144,3583338175,RS +3583338176,3583339519,ME +3583339520,3583339775,AL +3583339776,3583341039,ME +3583341040,3583341055,AL +3583341056,3583342335,ME +3583342336,3583342591,RS +3583342592,3583344639,ME +3583344640,3583345663,BG +3583345664,3583346175,MK +3583346176,3583350271,BG +3583350272,3583351039,MK +3583351040,3583352319,BG +3583352320,3583352831,MK 3583352832,3583361023,CY 3583361024,3583369215,IT 3583369216,3583377407,ES 3583377408,3583385599,AT 3583385600,3583393791,DK 3583393792,3583401983,RU +3583401984,3583410175,KE 3583410176,3583418367,SE +3583418368,3583426559,TN +3583426560,3583434751,CI 3583434752,3583442943,AT 3583442944,3583451135,UA 3583451136,3583459327,IL @@ -75426,9 +121841,13 @@ 3583475712,3583483903,NO 3583483904,3583492095,FR 3583492096,3583508479,SK +3583508480,3583516671,FR 3583516672,3583524863,GB +3583524864,3583533055,EG +3583533056,3583541247,DE 3583541248,3583549439,RU -3583549440,3583558399,IT +3583549440,3583557631,NL +3583557632,3583558399,IT 3583558400,3583558527,SM 3583558528,3583565823,IT 3583565824,3583574015,GB @@ -75437,48 +121856,364 @@ 3583590400,3583598591,DE 3583598592,3583606783,SE 3583606784,3583639551,TR -3583639552,3583647743,GB +3583639552,3583647743,AZ +3583647744,3583655935,EG +3583655936,3583664127,SN 3583664128,3583680511,RO 3583680512,3583688703,RU 3583688704,3583696895,UA 3583696896,3583705087,NL -3583705088,3583705095,UA -3583705096,3583705103,NA -3583705104,3583705183,UA -3583705184,3583705223,NA +3583705088,3583705175,UA +3583705176,3583705223,NA 3583705224,3583705239,UA -3583705240,3583705255,NA -3583705256,3583705303,UA +3583705240,3583705247,NA +3583705248,3583705255,UA +3583705256,3583705263,NA +3583705264,3583705287,UA +3583705288,3583705295,NA +3583705296,3583705303,UA 3583705304,3583705319,NA -3583705320,3583705347,UA -3583705348,3583705351,NA -3583705352,3583705603,UA -3583705604,3583705615,NA -3583705616,3583705663,UA -3583705664,3583705791,NA -3583705792,3583705887,UA -3583705888,3583705895,NA +3583705320,3583705335,UA +3583705336,3583705343,NA +3583705344,3583705471,UA +3583705472,3583705487,NA +3583705488,3583705495,UA +3583705496,3583705503,NA +3583705504,3583705603,UA +3583705604,3583705607,NA +3583705608,3583705647,UA +3583705648,3583705791,NA +3583705792,3583705831,UA +3583705832,3583705839,NA +3583705840,3583705847,UA +3583705848,3583705855,NA +3583705856,3583705859,UA +3583705860,3583705863,NA +3583705864,3583705887,UA +3583705888,3583705895,RU 3583705896,3583705903,UA 3583705904,3583705911,NA -3583705912,3583705927,UA -3583705928,3583705935,NA -3583705936,3583713279,UA +3583705912,3583705919,RU +3583705920,3583706023,UA +3583706024,3583706031,NA +3583706032,3583706055,UA +3583706056,3583706063,RU +3583706064,3583706103,UA +3583706104,3583706107,NA +3583706108,3583706151,UA +3583706152,3583706159,NA +3583706160,3583706175,UA +3583706176,3583706183,NA +3583706184,3583706191,UA +3583706192,3583706199,NA +3583706200,3583706223,UA +3583706224,3583706231,NA +3583706232,3583706295,UA +3583706296,3583706319,NA +3583706320,3583706375,UA +3583706376,3583706383,NA +3583706384,3583706463,UA +3583706464,3583706471,NA +3583706472,3583706495,UA +3583706496,3583706511,NA +3583706512,3583706519,UA +3583706520,3583706527,NA +3583706528,3583706535,UA +3583706536,3583706543,NA +3583706544,3583706575,UA +3583706576,3583706583,NA +3583706584,3583706591,UA +3583706592,3583706607,NA +3583706608,3583706615,UA +3583706616,3583706623,NA +3583706624,3583706647,UA +3583706648,3583706655,NA +3583706656,3583706679,UA +3583706680,3583706687,NA +3583706688,3583706695,UA +3583706696,3583706711,NA +3583706712,3583706743,UA +3583706744,3583706767,NA +3583706768,3583706775,UA +3583706776,3583706791,NA +3583706792,3583706807,UA +3583706808,3583706815,NA +3583706816,3583706863,UA +3583706864,3583706879,NA +3583706880,3583706883,UA +3583706884,3583706887,NA +3583706888,3583706895,UA +3583706896,3583706911,NA +3583706912,3583706927,UA +3583706928,3583706943,NA +3583706944,3583706959,UA +3583706960,3583706967,NA +3583706968,3583706991,UA +3583706992,3583706999,NA +3583707000,3583707015,UA +3583707016,3583707023,NA +3583707024,3583707031,UA +3583707032,3583707039,NA +3583707040,3583707071,UA +3583707072,3583707111,NA +3583707112,3583707127,UA +3583707128,3583707135,NA +3583707136,3583707215,UA +3583707216,3583707223,NA +3583707224,3583707519,UA +3583707520,3583707535,NA +3583707536,3583707663,UA +3583707664,3583707679,NA +3583707680,3583707751,UA +3583707752,3583707767,NA +3583707768,3583707775,UA +3583707776,3583707791,NA +3583707792,3583707807,UA +3583707808,3583707815,NA +3583707816,3583707839,UA +3583707840,3583707855,NA +3583707856,3583708031,UA +3583708032,3583708032,NA +3583708033,3583708040,UA +3583708041,3583708095,NA +3583708096,3583708167,UA +3583708168,3583708175,NA +3583708176,3583708183,UA +3583708184,3583708191,RU +3583708192,3583708223,UA +3583708224,3583708239,NA +3583708240,3583708423,UA +3583708424,3583708431,NA +3583708432,3583708455,UA +3583708456,3583708463,NA +3583708464,3583708479,UA +3583708480,3583708543,NA +3583708544,3583708575,UA +3583708576,3583708583,NA +3583708584,3583708607,UA +3583708608,3583708623,NA +3583708624,3583709447,UA +3583709448,3583709455,NA +3583709456,3583709463,DE +3583709464,3583709479,UA +3583709480,3583709487,NA +3583709488,3583709503,UA +3583709504,3583709511,NA +3583709512,3583709527,UA +3583709528,3583709543,NA +3583709544,3583709551,UA +3583709552,3583709559,NA +3583709560,3583709575,UA +3583709576,3583709583,NA +3583709584,3583709599,UA +3583709600,3583709607,NA +3583709608,3583709615,RU +3583709616,3583709623,UA +3583709624,3583709639,NA +3583709640,3583709663,UA +3583709664,3583709671,NA +3583709672,3583709699,UA +3583709700,3583709703,NA +3583709704,3583709727,UA +3583709728,3583709751,NA +3583709752,3583709759,UA +3583709760,3583709767,NA +3583709768,3583709791,UA +3583709792,3583709799,NA +3583709800,3583709807,DE +3583709808,3583709823,UA +3583709824,3583709831,NA +3583709832,3583709839,UA +3583709840,3583709863,NA +3583709864,3583709871,UA +3583709872,3583709879,NA +3583709880,3583709887,UA +3583709888,3583709911,NA +3583709912,3583709927,UA +3583709928,3583709943,NA +3583709944,3583710055,UA +3583710056,3583710063,NA +3583710064,3583710079,DE +3583710080,3583710087,NA +3583710088,3583710103,UA +3583710104,3583710111,NA +3583710112,3583710119,UA +3583710120,3583710135,NA +3583710136,3583710211,UA +3583710212,3583710223,NA +3583710224,3583710239,UA +3583710240,3583710247,NA +3583710248,3583710319,UA +3583710320,3583710335,NA +3583710336,3583710375,UA +3583710376,3583710383,NA +3583710384,3583710407,UA +3583710408,3583710415,NA +3583710416,3583710455,UA +3583710456,3583710459,NA +3583710460,3583710519,UA +3583710520,3583710527,NA +3583710528,3583710535,UA +3583710536,3583710543,RU +3583710544,3583710631,UA +3583710632,3583710639,NA +3583710640,3583710671,UA +3583710672,3583710679,NA +3583710680,3583710703,UA +3583710704,3583710711,NA +3583710712,3583710743,UA +3583710744,3583710751,BE +3583710752,3583710759,US +3583710760,3583710823,UA +3583710824,3583710831,NA +3583710832,3583710847,UA +3583710848,3583710855,IL +3583710856,3583710863,NA +3583710864,3583710871,UA +3583710872,3583710879,NA +3583710880,3583710887,UA +3583710888,3583710911,NA +3583710912,3583710935,UA +3583710936,3583710943,NA +3583710944,3583710959,UA +3583710960,3583710967,NA +3583710968,3583710991,UA +3583710992,3583710999,NA +3583711000,3583711007,UA +3583711008,3583711023,NA +3583711024,3583711079,UA +3583711080,3583711087,GB +3583711088,3583711095,NA +3583711096,3583711247,UA +3583711248,3583711255,NA +3583711256,3583711311,UA +3583711312,3583711319,NA +3583711320,3583711327,UA +3583711328,3583711335,NA +3583711336,3583711359,UA +3583711360,3583711367,NA +3583711368,3583711375,UA +3583711376,3583711383,NA +3583711384,3583711495,UA +3583711496,3583711503,NA +3583711504,3583711551,UA +3583711552,3583711559,NA +3583711560,3583711567,UA +3583711568,3583711591,NA +3583711592,3583711607,UA +3583711608,3583711615,NA +3583711616,3583711695,UA +3583711696,3583711703,NA +3583711704,3583711711,UA +3583711712,3583711727,NA +3583711728,3583711759,UA +3583711760,3583711767,NA +3583711768,3583711783,UA +3583711784,3583711799,NA +3583711800,3583711807,UA +3583711808,3583711823,NA +3583711824,3583711831,UA +3583711832,3583711839,NA +3583711840,3583711863,UA +3583711864,3583711879,NA +3583711880,3583712015,UA +3583712016,3583712031,NA +3583712032,3583712095,UA +3583712096,3583712111,NA +3583712112,3583712119,UA +3583712120,3583712127,NA +3583712128,3583712159,UA +3583712160,3583712199,NA +3583712200,3583712287,UA +3583712288,3583712295,NA +3583712296,3583712311,UA +3583712312,3583712319,NA +3583712320,3583712415,UA +3583712416,3583712423,NA +3583712424,3583712431,SG +3583712432,3583712439,UA +3583712440,3583712479,NA +3583712480,3583712591,UA +3583712592,3583712599,NA +3583712600,3583712623,UA +3583712624,3583712631,NA +3583712632,3583712639,UA +3583712640,3583712647,NA +3583712648,3583712655,UA +3583712656,3583712663,NA +3583712664,3583712703,UA +3583712704,3583712719,NA +3583712720,3583712727,UA +3583712728,3583712735,RU +3583712736,3583712743,NA +3583712744,3583712759,UA +3583712760,3583712763,NA +3583712764,3583712775,UA +3583712776,3583712783,NA +3583712784,3583712839,UA +3583712840,3583712847,NA +3583712848,3583712911,UA +3583712912,3583712943,NA +3583712944,3583712959,UA +3583712960,3583712983,NA +3583712984,3583713007,UA +3583713008,3583713015,RU +3583713016,3583713031,UA +3583713032,3583713039,NA +3583713040,3583713071,UA +3583713072,3583713079,NA +3583713080,3583713103,UA +3583713104,3583713111,NA +3583713112,3583713127,UA +3583713128,3583713135,IT +3583713136,3583713143,UA +3583713144,3583713151,NA +3583713152,3583713159,UA +3583713160,3583713167,NA +3583713168,3583713175,EG +3583713176,3583713183,UA +3583713184,3583713191,NA +3583713192,3583713223,UA +3583713224,3583713231,NA +3583713232,3583713279,UA 3583713280,3583721471,CZ 3583721472,3583729663,DE 3583729664,3583737855,TR -3583740672,3583741183,GB +3583737856,3583740671,EU +3583740672,3583740927,GB +3583740928,3583741439,EU 3583741440,3583741695,GB +3583741696,3583741951,NL +3583741952,3583742719,EU +3583742720,3583743487,DE +3583743488,3583743519,EU +3583743520,3583743551,FR +3583743552,3583743679,EU 3583743680,3583743711,GB +3583743712,3583743975,EU 3583743976,3583743983,GB +3583743984,3583744067,EU 3583744068,3583744071,GB -3583744128,3583744303,GB -3583744832,3583744839,GB -3583745016,3583745023,GB +3583744072,3583744127,EU +3583744128,3583744255,GB +3583744256,3583744287,EU +3583744288,3583744303,GB +3583744304,3583744319,EU +3583744320,3583744447,GB +3583744448,3583744511,EU +3583744512,3583744767,GB +3583744768,3583744831,EU +3583744832,3583744847,GB +3583744848,3583744959,EU +3583744960,3583744991,GB +3583744992,3583745279,EU 3583745280,3583745535,GB 3583745536,3583745663,SE +3583745664,3583745799,EU +3583745800,3583745807,NL 3583745808,3583745823,GB +3583745824,3583746047,EU 3583746048,3583754239,PL -3583754240,3583762431,IT 3583762432,3583770623,CZ 3583770624,3583772351,NL 3583772352,3583772367,IT @@ -75495,32 +122230,30 @@ 3583827968,3583836159,CH 3583836160,3583844351,DE 3583844352,3583852543,KZ -3583852544,3583854591,FI -3583854592,3583854607,GB -3583854608,3583854655,FI -3583854656,3583854991,GB -3583854992,3583855007,FI -3583855008,3583855039,GB -3583855040,3583855047,FI -3583855048,3583855103,GB +3583852544,3583853055,SG +3583853056,3583854591,FI +3583854592,3583854726,GB +3583854727,3583854735,FI +3583854736,3583854871,GB +3583854872,3583854879,FI +3583854880,3583855103,GB 3583855104,3583855167,US 3583855168,3583855175,FI 3583855176,3583855183,US 3583855184,3583855191,FI 3583855192,3583855199,US 3583855200,3583855207,FI -3583855208,3583855231,US -3583855232,3583855311,FI +3583855208,3583855247,US +3583855248,3583855311,FI 3583855312,3583855327,US 3583855328,3583856383,FI -3583856384,3583856415,SN -3583856416,3583856615,FI -3583856616,3583856639,SN +3583856384,3583856447,SG +3583856448,3583856615,FI +3583856616,3583856639,SG 3583856640,3583860735,FI 3583860736,3583868927,HU 3583868928,3583877119,AT -3583877120,3583878143,HU -3583878144,3583882239,RO +3583877120,3583882239,RO 3583882240,3583882751,HU 3583882752,3583885311,RO 3583885312,3583893503,GE @@ -75530,12 +122263,14 @@ 3583918080,3583926271,IT 3583926272,3583934463,DE 3583934464,3583942655,CH +3583942656,3583950847,EG 3583950848,3583959039,PL 3583959040,3583967231,NO 3583967232,3583975423,NL +3583975424,3583983615,LT 3583983616,3583999999,RU 3584000000,3584008191,IE -3584008192,3584016383,DK +3584008192,3584016383,SE 3584016384,3584024575,RU 3584024576,3584032767,UA 3584032768,3584040959,DE @@ -75548,7 +122283,9 @@ 3584073728,3584081919,SK 3584081920,3584081951,AT 3584081952,3584081959,NL -3584081960,3584082279,AT +3584081960,3584082143,AT +3584082144,3584082175,NL +3584082176,3584082279,AT 3584082280,3584082287,NL 3584082288,3584082943,AT 3584082944,3584089087,NL @@ -75583,43 +122320,40 @@ 3584172032,3584180223,FR 3584180224,3584188415,AT 3584188416,3584196607,GB -3584196608,3584204799,SE +3584196608,3584204799,DE 3584204800,3584212991,NL 3584212992,3584221183,ES 3584221184,3584229375,NO 3584229376,3584245759,HU -3584245760,3584253951,GB -3584253952,3584256383,CS -3584256384,3584256399,CS -3584256400,3584260135,CS -3584260136,3584260139,CS -3584260140,3584260151,CS -3584260152,3584260155,CS -3584260156,3584260231,CS -3584260232,3584260239,CS -3584260240,3584260247,CS -3584260248,3584260255,CS -3584260256,3584262143,CS +3584245760,3584253951,NL +3584253952,3584262143,RS 3584262144,3584270335,SE 3584270336,3584278527,FR 3584278528,3584286719,GB -3584286720,3584303103,AT +3584286720,3584295719,AT +3584295720,3584295727,NL +3584295728,3584295759,AT +3584295760,3584295767,PT +3584295768,3584295807,AT +3584295808,3584295815,PT +3584295816,3584295935,AT +3584295936,3584295943,AS +3584295944,3584303103,AT 3584303104,3584311295,ES 3584311296,3584319487,DE 3584319488,3584327679,LT -3584327680,3584335871,DE +3584327680,3584332519,DE +3584332520,3584332527,NL +3584332528,3584335871,DE 3584335872,3584344063,ES 3584344064,3584352255,SE 3584352256,3584360447,RO 3584360448,3584368639,GB 3584368640,3584376831,SA -3584376832,3584385023,DE -3584385024,3584393215,IR +3584376832,3584393215,DE 3584393216,3584401407,GB 3584401408,3584409599,MT -3584409600,3584412159,RU -3584412160,3584412415,AM -3584412416,3584413439,RU +3584409600,3584413439,RU 3584413440,3584413695,DE 3584413696,3584414207,GB 3584414208,3584414719,RU @@ -75630,8 +122364,9 @@ 3584417792,3584434175,GB 3584434176,3584442367,LU 3584442368,3584450559,GB +3584450560,3584458751,EU 3584458752,3584466943,SA -3584466944,3584475135,NG +3584466944,3584475135,NO 3584475136,3584483327,FR 3584483328,3584491519,DE 3584491520,3584499711,BG @@ -75639,29 +122374,29 @@ 3584507904,3584508927,GB 3584508928,3584508943,CY 3584508944,3584508951,KY -3584508952,3584509031,GB -3584509032,3584509039,NL -3584509040,3584509359,GB +3584508952,3584509231,GB +3584509232,3584509239,AW +3584509240,3584509359,GB 3584509360,3584509367,KY -3584509368,3584510623,GB -3584510624,3584510655,NL -3584510656,3584510999,GB +3584509368,3584510999,GB 3584511000,3584511007,KY 3584511008,3584511023,GB 3584511024,3584511039,KY -3584511040,3584511807,GB -3584511808,3584511935,MT -3584511936,3584513535,GB -3584513536,3584513599,US -3584513600,3584516047,GB -3584516048,3584516063,KY -3584516064,3584516071,GB +3584511040,3584511055,GB +3584511056,3584511071,NL +3584511072,3584511135,GB +3584511136,3584511143,HK +3584511144,3584511807,GB +3584511808,3584511871,MT +3584511872,3584513535,GB +3584513536,3584513567,US +3584513568,3584516071,GB 3584516072,3584516079,BB 3584516080,3584516095,GB 3584516096,3584524287,NO 3584524288,3584532479,IS 3584532480,3584540671,DE -3584540672,3584548863,IT +3584540672,3584548863,RU 3584548864,3584557055,ES 3584557056,3584565247,EE 3584565248,3584573439,RU @@ -75669,12 +122404,23 @@ 3584589824,3584598015,RU 3584598016,3584606207,CZ 3584606208,3584614399,DE -3584614400,3584622335,IE +3584614400,3584614463,GB +3584614464,3584614527,IE +3584614528,3584614591,GB +3584614592,3584614623,IE +3584614624,3584614655,GB +3584614656,3584614751,IE +3584614752,3584614759,GB +3584614760,3584614763,IE +3584614764,3584614767,GB +3584614768,3584622335,IE 3584622336,3584622591,GB 3584622592,3584630783,FI 3584630784,3584638975,BG 3584638976,3584647167,UA -3584647168,3584655359,LU +3584647168,3584649983,LU +3584649984,3584650239,EU +3584650240,3584655359,LU 3584655360,3584663551,CY 3584663552,3584671743,FR 3584671744,3584688127,NL @@ -75691,7 +122437,7 @@ 3584729088,3584737279,DE 3584737280,3584745471,GR 3584745472,3584753663,DK -3584761856,3584770047,RU +3584753664,3584770047,RU 3584770048,3584778239,NL 3584778240,3584786431,IT 3584786432,3584794623,NL @@ -75702,6 +122448,7 @@ 3584827392,3584835583,ES 3584835584,3584843775,AZ 3584843776,3584851967,DE +3584851968,3584860159,GH 3584860160,3584868351,PL 3584868352,3584876543,NO 3584876544,3584884735,SI @@ -75710,44 +122457,62 @@ 3584901120,3584909311,AT 3584909312,3584917503,IT 3584917504,3584925695,FI -3584925696,3584933887,CH +3584925696,3584928275,CH +3584928276,3584928279,IT +3584928280,3584929599,CH +3584929600,3584929727,DE +3584929728,3584931375,CH +3584931376,3584931391,ES +3584931392,3584933887,CH 3584933888,3584942079,PL 3584942080,3584950271,DK -3584950272,3584958463,BG +3584950272,3584958463,UA 3584958464,3584966655,DE 3584966656,3584974847,DK 3584974848,3584983039,FR -3584983040,3584983551,US -3584983552,3584985087,NL -3584985088,3584987135,US -3584987136,3584988159,NL -3584988160,3584989183,US -3584989184,3584991231,NL +3584983040,3584983807,US +3584983808,3584984063,UA +3584984064,3584984319,US +3584984320,3584984575,UA +3584984576,3584988607,US +3584988608,3584988623,UA +3584988624,3584988655,US +3584988656,3584988671,UA +3584988672,3584990303,US +3584990304,3584990463,UA +3584990464,3584990495,NL +3584990496,3584990527,UA +3584990528,3584990591,US +3584990592,3584990719,GB +3584990720,3584991231,US 3584991232,3584999423,IT 3584999424,3585007615,GB 3585007616,3585015807,AT 3585015808,3585023999,IT 3585024000,3585032191,CZ 3585032192,3585048575,LV -3585048576,3585056767,AT +3585048576,3585050623,IQ +3585050624,3585054719,GB +3585054720,3585055063,NG +3585055064,3585055071,GB +3585055072,3585055087,NG +3585055088,3585056767,GB 3585056768,3585064959,LB -3585073152,3585081343,GB +3585064960,3585081343,GB 3585081344,3585114111,IR 3585114112,3585122303,IS 3585122304,3585130495,ES -3585130496,3585138687,DE -3585138688,3585146879,AT -3585146880,3585147327,GB -3585147328,3585155071,CH +3585130496,3585138687,FR +3585138688,3585146879,RU +3585146880,3585155071,RO 3585155072,3585163263,GB 3585163264,3585171455,BE 3585171456,3585179647,RU 3585179648,3585189887,BE 3585189888,3585190399,DZ -3585190400,3585190463,IQ -3585190464,3585190527,BE -3585190528,3585190591,DZ -3585190592,3585196031,BE +3585190400,3585190527,BE +3585190528,3585190655,DZ +3585190656,3585196031,BE 3585196032,3585204223,ES 3585204224,3585212415,GB 3585212416,3585220607,DE @@ -75763,7 +122528,10 @@ 3585294336,3585302527,DE 3585302528,3585310719,ES 3585310720,3585318911,DE -3585327104,3585335295,DE +3585318912,3585327103,DZ +3585327104,3585331327,NL +3585331328,3585331343,FI +3585331344,3585335295,NL 3585335296,3585343487,UA 3585343488,3585351679,EE 3585351680,3585359871,CZ @@ -75772,16 +122540,15 @@ 3585376256,3585384447,PL 3585384448,3585392639,CH 3585392640,3585400831,RU -3585400832,3585409023,FR +3585400832,3585409023,A2 3585409024,3585417215,RU 3585417216,3585425407,BE -3585425408,3585433599,NG +3585425408,3585433599,ES 3585433600,3585441791,IS -3585441792,3585445207,NL -3585445208,3585445215,BE -3585445216,3585449983,NL +3585441792,3585449983,SK 3585449984,3585458175,SA 3585458176,3585466367,HU +3585466368,3585474559,EG 3585474560,3585482751,DE 3585482752,3585490943,FR 3585490944,3585499135,IT @@ -75790,6 +122557,7 @@ 3585523712,3585531903,LV 3585531904,3585540095,AT 3585540096,3585548287,DE +3585548288,3585556479,RU 3585556480,3585564671,DE 3585564672,3585572863,RU 3585572864,3585581055,IT @@ -75798,27 +122566,16 @@ 3585605632,3585613823,PL 3585613824,3585622015,EE 3585622016,3585630207,RU -3585630208,3585630783,CS -3585630784,3585630975,CS -3585630976,3585630983,CS -3585630984,3585630999,CS -3585631000,3585631007,CS -3585631008,3585631023,CS -3585631024,3585631031,CS -3585631032,3585631103,CS -3585631104,3585631135,CS -3585631136,3585631167,CS -3585631168,3585631183,CS -3585631184,3585631215,CS -3585631216,3585631223,CS -3585631224,3585638399,CS +3585630208,3585638399,RS 3585638400,3585646591,RU 3585646592,3585654783,SA 3585654784,3585655631,NO 3585655632,3585655639,US 3585655640,3585662975,NO 3585662976,3585671167,BY -3585671168,3585672959,SE +3585671168,3585672191,SE +3585672192,3585672447,DK +3585672448,3585672959,SE 3585672960,3585673983,DK 3585673984,3585674239,SE 3585674240,3585675775,DK @@ -75831,27 +122588,33 @@ 3585687552,3585695743,DE 3585695744,3585695999,CM 3585696000,3585696063,BD -3585696064,3585696511,GB +3585696064,3585696511,A2 3585696512,3585696767,LB 3585696768,3585696799,NO 3585696800,3585696831,LR -3585696832,3585697279,GB +3585696832,3585696847,GB +3585696848,3585697023,A2 +3585697024,3585697279,GB 3585697280,3585697535,NO -3585697536,3585697791,LB +3585697536,3585697791,A2 3585697792,3585698047,NG -3585698048,3585698303,GB +3585698048,3585698303,A2 3585698304,3585698815,NG -3585698816,3585699711,GB +3585698816,3585699071,GB +3585699072,3585699583,A2 +3585699584,3585699711,US 3585699712,3585699839,AU -3585699840,3585700159,US -3585700160,3585700191,GB +3585699840,3585700095,IQ +3585700096,3585700159,NG +3585700160,3585700191,A2 3585700192,3585700222,US -3585700223,3585700231,GB +3585700223,3585700223,NG +3585700224,3585700231,A2 3585700232,3585700239,US 3585700240,3585700255,ZA -3585700256,3585700271,GB +3585700256,3585700271,A2 3585700272,3585700287,NG -3585700288,3585700303,GB +3585700288,3585700303,A2 3585700304,3585700319,NG 3585700320,3585700343,AU 3585700344,3585700351,ZA @@ -75859,7 +122622,8 @@ 3585700608,3585700863,TZ 3585700864,3585701119,IQ 3585701120,3585701375,US -3585701376,3585701503,GB +3585701376,3585701439,MW +3585701440,3585701503,A2 3585701504,3585701519,NG 3585701520,3585701535,CA 3585701536,3585701631,NG @@ -75867,36 +122631,46 @@ 3585701888,3585702143,FR 3585702144,3585702399,LR 3585702400,3585702463,US -3585702464,3585702527,GB +3585702464,3585702527,A2 3585702528,3585702655,TZ 3585702656,3585702911,TG 3585702912,3585703167,NG 3585703168,3585703423,FR -3585703424,3585703679,TZ +3585703424,3585703679,A2 3585703680,3585703935,GB 3585703936,3585712127,DE -3585712128,3585720319,AT +3585712128,3585716335,AT +3585716336,3585716351,DE +3585716352,3585716415,AT +3585716416,3585716423,DE +3585716424,3585720319,AT 3585720320,3585728511,GB 3585728512,3585736703,SE -3585736704,3585744895,GB -3585744896,3585753087,FR +3585744896,3585750335,FR +3585750336,3585750351,GB +3585750352,3585750367,DE +3585750368,3585750383,ES +3585750384,3585750399,PT +3585750400,3585753087,FR 3585753088,3585761279,PL 3585761280,3585769471,UA 3585769472,3585777663,TR 3585777664,3585785855,JO 3585785856,3585794047,UA 3585794048,3585802239,FI -3585802240,3585810431,DE +3585802240,3585810431,IT 3585810432,3585818623,GB 3585818624,3585826815,DE 3585826816,3585835007,RU -3585835008,3585835583,NL +3585835008,3585835023,GB +3585835024,3585835583,NL 3585835584,3585835647,IQ -3585835648,3585835839,NL -3585835840,3585835855,ZM -3585835856,3585835871,NL -3585835872,3585835887,IQ -3585835888,3585835895,NL +3585835648,3585835791,NL +3585835792,3585835839,GQ +3585835840,3585835847,AO +3585835848,3585835871,NL +3585835872,3585835879,IQ +3585835880,3585835895,NL 3585835896,3585835903,IQ 3585835904,3585835911,NL 3585835912,3585835919,KE @@ -75910,12 +122684,9 @@ 3585835984,3585836007,NL 3585836008,3585836023,IQ 3585836024,3585836287,NL -3585836288,3585836351,SA -3585836352,3585836543,NL +3585836288,3585836543,CH 3585836544,3585837055,DZ -3585837056,3585837311,NG -3585837312,3585837439,IQ -3585837440,3585837567,NG +3585837056,3585837567,IQ 3585837568,3585838143,AO 3585838144,3585838207,NA 3585838208,3585838247,NL @@ -75924,25 +122695,26 @@ 3585838272,3585838279,AO 3585838280,3585838295,NL 3585838296,3585838303,AO -3585838304,3585838591,NL -3585838592,3585838879,NG +3585838304,3585838719,NL +3585838720,3585838847,NG +3585838848,3585838879,NL 3585838880,3585838911,IQ 3585838912,3585838975,NG 3585838976,3585839103,DZ 3585839104,3585840127,NL -3585840128,3585841151,US -3585841152,3585841663,IQ -3585841664,3585841919,DZ +3585840128,3585841151,IQ +3585841152,3585841407,NL +3585841408,3585841411,NG +3585841412,3585841919,NL 3585841920,3585842175,NG 3585842176,3585842199,IQ -3585842200,3585842207,NG +3585842200,3585842207,NL 3585842208,3585842687,IQ -3585842688,3585842943,NG -3585842944,3585843199,SE +3585842688,3585843199,NG 3585843200,3585851391,NO 3585851392,3585859583,SE -3585859584,3585860095,RU -3585860096,3585865727,DE +3585859584,3585860607,RU +3585860608,3585865727,DE 3585865728,3585867775,RU 3585867776,3585875967,NO 3585875968,3585884159,CH @@ -75955,8 +122727,7 @@ 3585902464,3585908735,NO 3585908736,3585909759,FR 3585909760,3585910271,MQ -3585910272,3585910527,GP -3585910528,3585910783,FR +3585910272,3585910783,FR 3585910784,3585911039,MQ 3585911040,3585911551,FR 3585911552,3585911807,GP @@ -75964,9 +122735,7 @@ 3585912064,3585912319,GP 3585912320,3585912575,FR 3585912576,3585912831,GP -3585912832,3585913855,FR -3585913856,3585914111,GP -3585914112,3585916671,FR +3585912832,3585916671,FR 3585916672,3585916927,MQ 3585916928,3585925119,IT 3585925120,3585933311,CH @@ -75975,12 +122744,10 @@ 3585937408,3585940479,NL 3585940480,3585940735,BE 3585940736,3585941503,NL -3585941504,3585949695,IL +3585941504,3585949695,PL 3585949696,3585957887,KW 3585957888,3585966079,SE -3585966080,3585971735,CH -3585971736,3585971743,DE -3585971744,3585974271,CH +3585966080,3585974271,CH 3585974272,3585982463,BE 3585982464,3585998847,RU 3585998848,3586007039,ES @@ -75990,11 +122757,13 @@ 3586031616,3586039807,IE 3586039808,3586047999,GB 3586048000,3586056191,PT -3586056192,3586064383,RU +3586056192,3586072575,RU 3586072576,3586088959,DE 3586088960,3586097151,CZ 3586097152,3586105343,HR +3586105344,3586105599,A2 3586105600,3586105727,ER +3586105728,3586113535,A2 3586113536,3586121727,BG 3586121728,3586129919,IE 3586129920,3586146303,CZ @@ -76003,13 +122772,12 @@ 3586179072,3586191871,ES 3586191872,3586191887,FR 3586191888,3586195455,ES -3586195456,3586196767,FR -3586196768,3586197503,DE -3586197504,3586198015,FR -3586198016,3586198527,DE -3586198528,3586199295,FR -3586199296,3586203391,DE -3586203392,3586203647,SE +3586195456,3586203647,RU +3586203648,3586204159,ZM +3586204160,3586205695,KE +3586205696,3586207743,BW +3586207744,3586208767,ZA +3586208768,3586211839,KE 3586211840,3586220287,CH 3586220288,3586220303,FR 3586220304,3586225295,CH @@ -76018,8 +122786,8 @@ 3586228224,3586237695,BE 3586237696,3586237951,NL 3586237952,3586244607,BE -3586244608,3586244863,NL -3586244864,3586246655,GB +3586244608,3586244927,NL +3586244928,3586246655,GB 3586246656,3586248703,BE 3586248704,3586250449,NL 3586250450,3586250457,BE @@ -76027,164 +122795,177 @@ 3586252800,3586254847,BE 3586254848,3586258943,NL 3586258944,3586259455,BE -3586259456,3586269263,NL -3586269264,3586269311,ES -3586269312,3586269343,NL +3586259456,3586269247,NL +3586269248,3586269263,ES +3586269264,3586269343,NL 3586269344,3586269415,ES 3586269416,3586269423,NL 3586269424,3586269439,ES 3586269440,3586269471,NL -3586269472,3586269487,ES -3586269488,3586269495,NL -3586269496,3586269519,ES -3586269520,3586269535,NL +3586269472,3586269503,ES +3586269504,3586269535,NL 3586269536,3586269607,GB 3586269608,3586269695,ES 3586269696,3586269759,NL 3586269760,3586269823,ES 3586269824,3586269855,NL 3586269856,3586269887,ES -3586269888,3586269951,NL -3586269952,3586270079,ES +3586269888,3586269919,NL +3586269920,3586270079,ES 3586270080,3586270207,NL 3586270208,3586271231,ES -3586271232,3586271615,NL -3586271616,3586271999,ES +3586271232,3586271487,NL +3586271488,3586271831,ES +3586271832,3586271839,IT +3586271840,3586271999,ES 3586272000,3586272255,IT 3586272256,3586272383,NL -3586272384,3586272767,ES -3586272768,3586272799,NL +3586272384,3586272799,ES 3586272800,3586272807,IT 3586272808,3586272815,ES 3586272816,3586272831,IT 3586272832,3586272895,NL 3586272896,3586272959,IT 3586272960,3586272991,ES -3586272992,3586273023,IT +3586272992,3586273007,IT +3586273008,3586273015,ES +3586273016,3586273023,IT 3586273024,3586276351,NL -3586276352,3586277375,ES -3586277376,3586293759,TR +3586276352,3586276863,ES +3586276864,3586277375,NL +3586277376,3586286591,TR +3586286592,3586286607,A2 +3586286608,3586293759,TR 3586293760,3586310143,ES 3586310144,3586326527,CZ -3586326528,3586342911,FR +3586326528,3586342911,IR 3586342912,3586359295,ES 3586359296,3586375679,PL -3586375680,3586378687,CZ -3586378688,3586378719,SK -3586378720,3586392063,CZ -3586392064,3586396415,NL -3586396416,3586396671,GB -3586396672,3586408447,NL +3586375680,3586392063,CZ +3586392064,3586408447,NL 3586408448,3586424831,BA 3586424832,3586441215,CH 3586441216,3586457599,DE 3586457600,3586473983,NL -3586473984,3586490367,HU +3586473984,3586473987,SK +3586473988,3586476287,HU +3586476288,3586476295,SK +3586476296,3586476311,HU +3586476312,3586476319,AT +3586476320,3586476351,HU +3586476352,3586476383,AT +3586476384,3586476407,UA +3586476408,3586476431,HU +3586476432,3586476439,SK +3586476440,3586478079,HU +3586478080,3586478591,SK +3586478592,3586478847,TR +3586478848,3586479103,SK +3586479104,3586490367,HU 3586490368,3586506751,LT 3586506752,3586523135,NL 3586523136,3586543519,DE 3586543520,3586543527,GB -3586543528,3586543623,DE -3586543624,3586543631,GB -3586543632,3586545679,DE +3586543528,3586543759,DE +3586543760,3586543791,GB +3586543792,3586545679,DE 3586545680,3586545703,GB 3586545704,3586546375,DE 3586546376,3586546383,GB 3586546384,3586555903,DE 3586555904,3586572287,IT -3586572288,3586588671,CS +3586572288,3586588671,RS 3586588672,3586596863,IT 3586596864,3586605055,GB 3586605056,3586621439,SE 3586621440,3586625535,IE -3586625536,3586637823,GB +3586625536,3586629631,GB +3586629632,3586637823,IE 3586637824,3586654207,PL 3586654208,3586662399,GE 3586662400,3586670591,UA -3586670592,3586677759,DE +3586670592,3586677183,DE +3586677184,3586677247,FR +3586677248,3586677311,DE +3586677312,3586677327,FR +3586677328,3586677375,DE +3586677376,3586677487,FR +3586677488,3586677759,DE 3586677760,3586678015,GR 3586678016,3586678271,DE -3586678272,3586678303,IE -3586678304,3586678335,DE +3586678272,3586678335,FR 3586678336,3586678399,US -3586678400,3586678415,DE +3586678400,3586678415,GB 3586678416,3586678439,IE -3586678440,3586678443,ES -3586678444,3586678447,DE +3586678440,3586678447,FR 3586678448,3586678527,IE -3586678528,3586678591,DE -3586678592,3586678623,GB -3586678624,3586678671,DE +3586678528,3586678671,FR 3586678672,3586678679,GB 3586678680,3586678687,MU 3586678688,3586678783,GB -3586678784,3586679039,DE +3586678784,3586679039,IT 3586679040,3586679103,US 3586679104,3586679167,DE 3586679168,3586679231,US -3586679232,3586679327,DE -3586679328,3586679335,DK -3586679336,3586679583,DE +3586679232,3586679327,FR +3586679328,3586679343,DK +3586679344,3586679359,FR +3586679360,3586679423,DE +3586679424,3586679583,FR 3586679584,3586679599,IT -3586679600,3586679647,DE +3586679600,3586679647,FR 3586679648,3586679711,IT -3586679712,3586679727,DE +3586679712,3586679727,FR 3586679728,3586679743,IT -3586679744,3586679839,DE -3586679840,3586679871,FR -3586679872,3586679935,DE -3586679936,3586679999,MU -3586680000,3586680319,DE +3586679744,3586680063,FR +3586680064,3586680319,IT 3586680320,3586680447,ES -3586680448,3586680463,DE -3586680464,3586680575,ES -3586680576,3586680591,DE -3586680592,3586680623,ES -3586680624,3586680703,DE -3586680704,3586680831,ES -3586680832,3586680959,FR -3586680960,3586680975,DE -3586680976,3586680991,FR -3586680992,3586681015,DE -3586681016,3586681087,FR -3586681088,3586681599,DE -3586681600,3586681615,FR -3586681616,3586681695,DE -3586681696,3586682111,FR -3586682112,3586682175,US -3586682176,3586682367,DE +3586680448,3586680463,FR +3586680464,3586680543,ES +3586680544,3586680559,FR +3586680560,3586680575,ES +3586680576,3586680607,FR +3586680608,3586680615,ES +3586680616,3586680767,FR +3586680768,3586680831,ES +3586680832,3586681087,FR +3586681088,3586681343,IT +3586681344,3586682111,FR +3586682112,3586682367,US 3586682368,3586682399,AT -3586682400,3586682431,DE -3586682432,3586682879,FR +3586682400,3586682879,FR 3586682880,3586686975,US 3586686976,3586703359,SE 3586703360,3586719743,CH 3586719744,3586752511,ES 3586752512,3586785279,NL +3586785280,3586793471,RU 3586793472,3586801663,CH 3586801664,3586818047,HR 3586818048,3586834431,IE 3586834432,3586850495,DE 3586850496,3586850511,US -3586850512,3586850815,DE +3586850512,3586850543,DE +3586850544,3586850559,GR +3586850560,3586850815,DE 3586850816,3586867199,NO 3586867200,3586883583,FR 3586883584,3586899967,IT -3586899968,3586902271,DE +3586899968,3586900287,DE +3586900288,3586900351,NL +3586900352,3586902271,DE 3586902272,3586902335,CH -3586902336,3586902375,DE -3586902376,3586902383,BE -3586902384,3586902411,DE +3586902336,3586902411,DE 3586902412,3586902415,CH 3586902416,3586903263,DE 3586903264,3586903295,CH -3586903296,3586903423,DE -3586903424,3586903439,NL -3586903440,3586904223,DE +3586903296,3586904223,DE 3586904224,3586904255,CH 3586904256,3586904319,DE 3586904320,3586904415,CH -3586904416,3586905039,DE +3586904416,3586904831,DE +3586904832,3586904839,VG +3586904840,3586905039,DE 3586905040,3586905055,CH 3586905056,3586905071,DE 3586905072,3586905079,CH @@ -76195,7 +122976,9 @@ 3586905200,3586905215,GB 3586905216,3586905247,DE 3586905248,3586905279,CH -3586905280,3586906391,DE +3586905280,3586905287,DE +3586905288,3586905295,CY +3586905296,3586906391,DE 3586906392,3586906399,CH 3586906400,3586906423,DE 3586906424,3586906427,CH @@ -76203,58 +122986,48 @@ 3586906720,3586906735,CH 3586906736,3586907903,DE 3586907904,3586908031,CH -3586908032,3586910559,DE +3586908032,3586909695,DE +3586909696,3586909823,CH +3586909824,3586910559,DE 3586910560,3586910567,NL 3586910568,3586910575,CY 3586910576,3586910587,NL -3586910588,3586910591,DE -3586910592,3586910671,NL -3586910672,3586910687,DE -3586910688,3586910703,NL -3586910704,3586910983,DE -3586910984,3586910991,BE -3586910992,3586911039,DE +3586910588,3586910655,DE +3586910656,3586910703,NL +3586910704,3586910711,DE +3586910712,3586910719,NL +3586910720,3586910991,DE +3586910992,3586911007,BE +3586911008,3586911039,DE 3586911040,3586911103,GB 3586911104,3586911167,NL -3586911168,3586911187,DE -3586911188,3586911191,BR +3586911168,3586911191,DE 3586911192,3586911195,BE -3586911196,3586912255,DE -3586912256,3586912575,FR -3586912576,3586912651,DE -3586912652,3586912671,FR -3586912672,3586912703,DE -3586912704,3586912719,FR -3586912720,3586912735,DE -3586912736,3586912767,FR -3586912768,3586915567,DE -3586915568,3586915575,AT -3586915576,3586916351,DE +3586911196,3586912511,DE +3586912512,3586912575,FR +3586912576,3586912647,DE +3586912648,3586912651,FR +3586912652,3586916351,DE 3586916352,3586924031,IT 3586924032,3586924047,US 3586924048,3586924543,IT -3586924544,3586924743,FI -3586924744,3586924751,AX -3586924752,3586924919,FI -3586924920,3586924927,AX -3586924928,3586924943,FI -3586924944,3586924959,AX -3586924960,3586924983,FI -3586924984,3586925055,AX -3586925056,3586925791,FI -3586925792,3586925823,AX -3586925824,3586925835,FI -3586925836,3586925839,AX -3586925840,3586925983,FI -3586925984,3586926003,AX -3586926004,3586926591,FI +3586924544,3586924831,AX +3586924832,3586924839,FI +3586924840,3586924879,AX +3586924880,3586924887,FI +3586924888,3586924967,AX +3586924968,3586924983,FI +3586924984,3586925439,AX +3586925440,3586925471,FI +3586925472,3586925567,AX +3586925568,3586925695,FI +3586925696,3586926591,AX 3586926592,3586926847,SE -3586926848,3586927103,FI -3586927104,3586927871,AX -3586927872,3586928159,FI -3586928160,3586928175,AX -3586928176,3586928639,FI -3586928640,3586932735,AX +3586926848,3586928255,AX +3586928256,3586928287,FI +3586928288,3586928335,AX +3586928336,3586928351,FI +3586928352,3586932735,AX 3586932736,3586949119,LB 3586949120,3586965503,SE 3586965504,3586981887,NL @@ -76269,7 +123042,15 @@ 3587053056,3587053823,FR 3587053824,3587055615,GB 3587055616,3587063807,UZ -3587063808,3587080191,NL +3587063808,3587071583,NL +3587071584,3587071599,BE +3587071600,3587071615,NL +3587071616,3587071631,DE +3587071632,3587072095,NL +3587072096,3587072127,DE +3587072128,3587074415,NL +3587074416,3587074431,BE +3587074432,3587080191,NL 3587080192,3587082367,GB 3587082368,3587082431,US 3587082432,3587088383,GB @@ -76283,220 +123064,175 @@ 3587162112,3587178495,IR 3587178496,3587178795,AT 3587178796,3587178799,US -3587178800,3587179439,AT +3587178800,3587179279,AT +3587179280,3587179287,AU +3587179288,3587179439,AT 3587179440,3587179455,GB 3587179456,3587179463,TR 3587179464,3587179471,CH 3587179472,3587186687,AT -3587186688,3587186943,DE -3587186944,3587187199,AM -3587187200,3587187455,DE -3587187456,3587188223,RU -3587188224,3587189503,DE -3587189504,3587189759,RU -3587189760,3587193343,DE -3587193344,3587193599,KG -3587193600,3587194367,DE -3587194368,3587194511,RU -3587194512,3587194623,DE -3587194624,3587194879,RU +3587186688,3587194495,DE +3587194496,3587194511,RU +3587194512,3587194879,DE 3587194880,3587211263,GB 3587211264,3587211531,AT 3587211532,3587211535,DE -3587211536,3587213911,AT +3587211536,3587211663,AT +3587211664,3587211671,IT +3587211672,3587213911,AT 3587213912,3587213919,UY -3587213920,3587213959,AT -3587213960,3587213967,RO -3587213968,3587219455,AT +3587213920,3587219455,AT 3587219456,3587227647,RU -3587227648,3587227663,GB -3587227664,3587227711,NL -3587227712,3587227751,GB -3587227752,3587227791,NL -3587227792,3587227807,GB -3587227808,3587227823,NL -3587227824,3587227871,GB -3587227872,3587227887,NL -3587227888,3587227919,GB +3587227648,3587227759,NL +3587227760,3587227775,GB +3587227776,3587227903,NL +3587227904,3587227919,GB 3587227920,3587227935,NL -3587227936,3587227983,GB -3587227984,3587228015,NL -3587228016,3587228047,GB -3587228048,3587228095,NL -3587228096,3587228127,GB -3587228128,3587228159,NL -3587228160,3587228175,GB -3587228176,3587228207,NL -3587228208,3587228223,GB -3587228224,3587228319,NL -3587228320,3587228335,GB -3587228336,3587228351,NL -3587228352,3587228447,GB -3587228448,3587228463,NL -3587228464,3587228607,GB -3587228608,3587228623,NL -3587228624,3587228671,GB -3587228672,3587229183,NL -3587229184,3587229247,GB -3587229248,3587229375,NL -3587229376,3587229455,GB -3587229456,3587229487,NL -3587229488,3587229535,GB -3587229536,3587229663,NL -3587229664,3587229743,GB -3587229744,3587229775,NL -3587229776,3587229791,GB -3587229792,3587229807,NL -3587229808,3587229855,GB -3587229856,3587229903,NL -3587229904,3587229919,GB -3587229920,3587229935,NL -3587229936,3587230047,GB -3587230048,3587230111,NL -3587230112,3587230127,GB -3587230128,3587230143,NL -3587230144,3587230239,GB -3587230240,3587230271,NL -3587230272,3587230335,GB -3587230336,3587230367,NL -3587230368,3587230383,GB -3587230384,3587230399,NL -3587230400,3587230511,GB +3587227936,3587227967,GB +3587227968,3587227983,DE +3587227984,3587228047,GB +3587228048,3587228087,NL +3587228088,3587228127,GB +3587228128,3587228271,NL +3587228272,3587228287,GB +3587228288,3587228591,NL +3587228592,3587228607,GB +3587228608,3587228640,NL +3587228641,3587228647,GB +3587228648,3587228927,NL +3587228928,3587229455,GB +3587229456,3587229823,NL +3587229824,3587229839,GB +3587229840,3587229871,NL +3587229872,3587229887,GB +3587229888,3587229920,NL +3587229921,3587229935,GB +3587229936,3587230159,NL +3587230160,3587230207,GB +3587230208,3587230399,NL +3587230400,3587230415,GB +3587230416,3587230431,NL +3587230432,3587230447,GB +3587230448,3587230463,NL +3587230464,3587230511,GB 3587230512,3587230519,NL 3587230520,3587230527,GB 3587230528,3587230543,NL 3587230544,3587230607,GB 3587230608,3587230623,NL -3587230624,3587230719,GB -3587230720,3587230783,NL -3587230784,3587230791,GB -3587230792,3587230815,NL -3587230816,3587230847,GB +3587230624,3587230687,GB +3587230688,3587230719,NL +3587230720,3587230791,GB +3587230792,3587230799,NL +3587230800,3587230847,GB 3587230848,3587230911,NL 3587230912,3587230943,GB -3587230944,3587230959,NL -3587230960,3587230975,GB +3587230944,3587230967,DE +3587230968,3587230975,GB 3587230976,3587230991,NL -3587230992,3587231231,GB -3587231232,3587231263,NL -3587231264,3587231359,GB -3587231360,3587231487,NL -3587231488,3587231887,GB -3587231888,3587231903,NL -3587231904,3587232767,GB -3587232768,3587232831,NL -3587232832,3587232847,GB -3587232848,3587232895,NL -3587232896,3587232911,GB -3587232912,3587232927,NL -3587232928,3587232967,GB -3587232968,3587232975,NL -3587232976,3587232991,GB -3587232992,3587233007,NL -3587233008,3587233023,GB -3587233024,3587233119,NL -3587233120,3587233151,GB -3587233152,3587233183,NL -3587233184,3587233199,GB -3587233200,3587233215,NL -3587233216,3587233231,GB -3587233232,3587233295,NL -3587233296,3587233311,GB -3587233312,3587233343,NL +3587230992,3587231295,GB +3587231296,3587231327,NL +3587231328,3587231359,GB +3587231360,3587232535,NL +3587232536,3587232711,GB +3587232712,3587232719,NL +3587232720,3587232767,GB +3587232768,3587233295,NL +3587233296,3587233319,GB +3587233320,3587233343,NL 3587233344,3587233359,GB -3587233360,3587233519,NL +3587233360,3587233407,NL +3587233408,3587233471,GB +3587233472,3587233519,NL 3587233520,3587233535,GB -3587233536,3587233551,NL -3587233552,3587233599,GB -3587233600,3587233663,NL -3587233664,3587233791,GB -3587233792,3587233823,NL -3587233824,3587233839,GB -3587233840,3587233871,NL -3587233872,3587233903,GB -3587233904,3587233935,NL +3587233536,3587233543,NL +3587233544,3587233599,GB +3587233600,3587233807,NL +3587233808,3587233823,GB +3587233824,3587233839,NL +3587233840,3587233919,GB +3587233920,3587233935,NL 3587233936,3587233951,GB -3587233952,3587233999,NL +3587233952,3587233967,NL +3587233968,3587233983,GB +3587233984,3587233999,NL 3587234000,3587234015,GB -3587234016,3587234047,NL -3587234048,3587234063,GB -3587234064,3587234079,NL +3587234016,3587234031,NL +3587234032,3587234047,GB +3587234048,3587234079,NL 3587234080,3587234095,GB -3587234096,3587234175,NL -3587234176,3587234303,GB -3587234304,3587236094,NL -3587236095,3587236095,GB -3587236096,3587236471,NL -3587236472,3587236479,GB -3587236480,3587236487,NL -3587236488,3587236495,GB -3587236496,3587236503,NL -3587236504,3587236511,GB -3587236512,3587236535,NL -3587236536,3587236543,GB +3587234096,3587234143,NL +3587234144,3587234159,GB +3587234160,3587234207,NL +3587234208,3587234815,GB +3587234816,3587236447,NL +3587236448,3587236479,GB +3587236480,3587236511,NL +3587236512,3587236543,GB 3587236544,3587236607,NL 3587236608,3587236863,GB 3587236864,3587237375,NL -3587237376,3587237407,GB -3587237408,3587237439,NL -3587237440,3587237447,GB -3587237448,3587237471,NL -3587237472,3587237479,GB -3587237480,3587237487,NL -3587237488,3587237503,GB -3587237504,3587237551,NL -3587237552,3587237567,GB -3587237568,3587237887,NL -3587237888,3587238143,GB -3587238144,3587238399,NL -3587238400,3587238463,GB -3587238464,3587238479,NL -3587238480,3587238487,GB -3587238488,3587238559,NL -3587238560,3587239935,GB -3587239936,3587239983,NL -3587239984,3587239999,GB -3587240000,3587240055,NL -3587240056,3587240071,GB -3587240072,3587240111,NL -3587240112,3587240119,GB -3587240120,3587240271,NL -3587240272,3587240287,GB -3587240288,3587240295,NL -3587240296,3587240319,GB -3587240320,3587240351,NL -3587240352,3587240359,GB -3587240360,3587240575,NL -3587240576,3587240583,GB -3587240584,3587240639,NL -3587240640,3587240959,GB -3587240960,3587241167,NL -3587241168,3587241279,GB -3587241280,3587241287,NL -3587241288,3587241983,GB -3587241984,3587242047,NL -3587242048,3587242063,GB -3587242064,3587242071,NL -3587242072,3587242079,GB -3587242080,3587242111,NL -3587242112,3587242271,GB -3587242272,3587242287,NL -3587242288,3587242495,GB -3587242496,3587242655,NL -3587242656,3587242663,GB -3587242664,3587243279,NL -3587243280,3587243295,GB -3587243296,3587243407,NL -3587243408,3587243415,GB -3587243416,3587243423,NL -3587243424,3587243439,GB -3587243440,3587243455,NL -3587243456,3587243519,GB -3587243520,3587243647,NL -3587243648,3587244031,GB +3587237376,3587237391,GB +3587237392,3587237399,NL +3587237400,3587237407,GB +3587237408,3587237471,NL +3587237472,3587237487,GB +3587237488,3587237495,NL +3587237496,3587237519,GB +3587237520,3587237567,NL +3587237568,3587237887,GB +3587237888,3587238471,NL +3587238472,3587238479,GB +3587238480,3587238535,NL +3587238536,3587238543,GB +3587238544,3587238607,NL +3587238608,3587238911,GB +3587238912,3587239303,NL +3587239304,3587239311,GB +3587239312,3587239679,NL +3587239680,3587239687,GB +3587239688,3587239767,NL +3587239768,3587239775,GB +3587239776,3587239791,NL +3587239792,3587239807,GB +3587239808,3587239871,NL +3587239872,3587239935,GB +3587239936,3587240015,NL +3587240016,3587240023,GB +3587240024,3587240087,NL +3587240088,3587240095,GB +3587240096,3587240103,NL +3587240104,3587240107,GB +3587240108,3587240439,NL +3587240440,3587240447,GB +3587240448,3587240511,NL +3587240512,3587240575,GB +3587240576,3587240615,NL +3587240616,3587240623,GB +3587240624,3587241143,NL +3587241144,3587241151,GB +3587241152,3587241223,NL +3587241224,3587241247,GB +3587241248,3587241263,NL +3587241264,3587241271,GB +3587241272,3587241343,NL +3587241344,3587241471,GB +3587241472,3587242063,NL +3587242064,3587242071,BE +3587242072,3587243935,NL +3587243936,3587243943,GB +3587243944,3587243967,NL +3587243968,3587243975,GB +3587243976,3587244031,NL 3587244032,3587260415,IT 3587260416,3587284991,DE -3587284992,3587287295,IT +3587284992,3587285135,A2 +3587285136,3587285159,HK +3587285160,3587287043,A2 +3587287044,3587287047,LY +3587287048,3587287055,A2 +3587287056,3587287059,LY +3587287060,3587287295,A2 3587287296,3587287307,GE 3587287308,3587287311,DE 3587287312,3587287319,GE @@ -76527,7 +123263,8 @@ 3587287460,3587287463,IT 3587287464,3587287475,SE 3587287476,3587287479,PL -3587287480,3587287535,IT +3587287480,3587287487,A2 +3587287488,3587287535,IT 3587287536,3587287543,DE 3587287544,3587287551,PL 3587287552,3587287559,GB @@ -76559,11 +123296,13 @@ 3587287960,3587287963,FR 3587287964,3587287967,GB 3587287968,3587287983,DE -3587287984,3587288575,IT +3587287984,3587288063,IT +3587288064,3587288319,A2 +3587288320,3587288575,IT 3587288576,3587288703,AE 3587288704,3587288707,DE 3587288708,3587288759,NL -3587288760,3587288959,IT +3587288760,3587288959,A2 3587288960,3587289087,DE 3587289088,3587289343,FR 3587289344,3587289347,ES @@ -76571,37 +123310,40 @@ 3587289352,3587289359,PT 3587289360,3587289367,ES 3587289368,3587289375,FR -3587289376,3587289383,IT +3587289376,3587289383,A2 3587289384,3587289387,GB 3587289388,3587289391,ES 3587289392,3587289399,GB 3587289400,3587289407,ES -3587289408,3587289411,IT +3587289408,3587289411,A2 3587289412,3587289415,FR -3587289416,3587289423,IT +3587289416,3587289423,A2 3587289424,3587289467,GB -3587289468,3587289855,IT +3587289468,3587289855,A2 3587289856,3587289859,FR -3587289860,3587289863,IT +3587289860,3587289863,A2 3587289864,3587289871,GB -3587289872,3587289895,IT +3587289872,3587289895,A2 3587289896,3587289907,GB 3587289908,3587289911,ES -3587289912,3587289915,IT +3587289912,3587289915,A2 3587289916,3587289919,FR -3587289920,3587290367,IT -3587290368,3587290431,AL -3587290432,3587290495,DE -3587290496,3587290623,IT -3587290624,3587291135,FR +3587289920,3587290111,A2 +3587290112,3587290367,IT +3587290368,3587290622,GB +3587290623,3587290623,A2 +3587290624,3587290879,FR +3587290880,3587291135,A2 3587291136,3587291139,NL -3587291140,3587291967,IT +3587291140,3587291647,A2 +3587291648,3587291967,IT 3587291968,3587292031,AL 3587292032,3587292159,IT -3587292160,3587292223,DZ +3587292160,3587292223,A2 3587292224,3587292415,IT 3587292416,3587292419,ES -3587292420,3587292799,IT +3587292420,3587292671,A2 +3587292672,3587292799,IT 3587292800,3587292863,AT 3587292864,3587309567,IT 3587309568,3587325951,GB @@ -76611,28 +123353,54 @@ 3587375104,3587383295,TR 3587383296,3587391487,CZ 3587391488,3587407871,KZ -3587407872,3587424255,NL +3587407872,3587408127,NL +3587408128,3587415039,BE +3587415040,3587422719,NL +3587422720,3587424255,BE 3587424256,3587440639,DE 3587440640,3587457023,SE 3587457024,3587459263,GB 3587459264,3587459295,DE 3587459296,3587473407,GB 3587473408,3587489791,IT +3587489792,3587506175,EG 3587506176,3587538943,IT 3587538944,3587547135,IS 3587547136,3587555327,CH 3587555328,3587571711,BE 3587571712,3587579903,DE 3587579904,3587588095,BE -3587588096,3587596287,IT +3587588096,3587596287,BG 3587596288,3587604479,NL 3587604480,3587620863,FI 3587620864,3587637247,SE 3587637248,3587653631,FR 3587653632,3587670015,SK -3587670016,3587687591,IT +3587670016,3587673763,IT +3587673764,3587673767,GB +3587673768,3587673787,IT +3587673788,3587673792,GB +3587673793,3587679135,IT +3587679136,3587679143,ES +3587679144,3587683327,IT +3587683328,3587683359,FR +3587683360,3587683415,IT +3587683416,3587683416,GB +3587683417,3587685831,IT +3587685832,3587685839,GB +3587685840,3587686031,IT +3587686032,3587686039,FR +3587686040,3587687591,IT 3587687592,3587687599,NL -3587687600,3587702783,IT +3587687600,3587699255,IT +3587699256,3587699263,A2 +3587699264,3587699559,IT +3587699560,3587699567,GB +3587699568,3587700031,IT +3587700032,3587700039,GB +3587700040,3587701295,IT +3587701296,3587701303,FR +3587701304,3587702783,IT 3587702784,3587710975,DE 3587710976,3587719167,CZ 3587719168,3587735551,PL @@ -76658,12 +123426,7 @@ 3587883008,3587915775,GB 3587915776,3587932159,EE 3587932160,3587932415,NL -3587932416,3587932671,DE -3587932672,3587932927,NL -3587932928,3587933183,GB -3587933184,3587940095,BE -3587940096,3587940351,FR -3587940352,3587944447,BE +3587932416,3587944447,BE 3587944448,3587945471,NL 3587945472,3587948031,BE 3587948032,3587948543,NL @@ -76672,9 +123435,7 @@ 3587981312,3587997695,IS 3587997696,3588014079,DE 3588014080,3588030463,CZ -3588030464,3588038655,RU -3588038656,3588038783,FR -3588038784,3588046847,RU +3588030464,3588046847,RU 3588046848,3588060351,DE 3588060352,3588060359,CH 3588060360,3588063231,DE @@ -76685,7 +123446,7 @@ 3588104192,3588112383,BG 3588112384,3588128767,FR 3588128768,3588145151,HU -3588145152,3588161535,PL +3588145152,3588153343,PL 3588161536,3588227071,FR 3588227072,3588292607,BE 3588292608,3588308991,AT @@ -76707,16 +123468,26 @@ 3588489216,3588505599,FR 3588505600,3588521983,RU 3588521984,3588538367,PT -3588538368,3588538623,ES -3588538624,3588547327,GB +3588538368,3588544383,GB +3588544384,3588544391,IE +3588544392,3588547327,GB 3588547328,3588547583,IE 3588547584,3588550447,GB 3588550448,3588550463,IE -3588550464,3588554687,GB +3588550464,3588553983,GB +3588553984,3588554239,IE +3588554240,3588554255,DE +3588554256,3588554687,GB 3588554688,3588554751,IE 3588554752,3588571135,AT -3588571136,3588587519,NL -3588587520,3588603903,ES +3588571136,3588587519,GB +3588587520,3588590175,ES +3588590176,3588590207,BE +3588590208,3588594751,ES +3588594752,3588594759,DE +3588594760,3588598607,ES +3588598608,3588598615,IT +3588598616,3588603903,ES 3588603904,3588620287,SI 3588620288,3588628479,SA 3588628480,3588636671,CH @@ -76733,7 +123504,9 @@ 3588773760,3588773887,SL 3588773888,3588775935,GB 3588775936,3588776191,NG -3588776192,3588784127,GB +3588776192,3588782271,GB +3588782272,3588782279,A2 +3588782280,3588784127,GB 3588784128,3588800511,CH 3588800512,3588816895,RU 3588816896,3588833279,IT @@ -76753,63 +123526,39 @@ 3588997120,3589013503,AT 3589013504,3589021695,ES 3589021696,3589029887,SA -3589029888,3589029951,NL -3589029952,3589029983,ES -3589029984,3589030015,NL -3589030016,3589030143,ES -3589030144,3589030175,NL -3589030176,3589030183,ES -3589030184,3589030207,NL -3589030208,3589030239,ES -3589030240,3589031423,NL -3589031424,3589031935,ES -3589031936,3589034015,NL -3589034016,3589034111,ES -3589034112,3589034143,NL +3589029888,3589030183,NL +3589030184,3589030191,FR +3589030192,3589030303,NL +3589030304,3589030335,FR +3589030336,3589034143,NL 3589034144,3589034159,ES 3589034160,3589034167,GB -3589034168,3589034175,NL -3589034176,3589034183,ES +3589034168,3589034183,NL 3589034184,3589034191,GB 3589034192,3589034207,DE -3589034208,3589034231,ES -3589034232,3589034271,NL -3589034272,3589034303,ES +3589034208,3589034303,NL 3589034304,3589034335,DE 3589034336,3589034367,FR 3589034368,3589034431,NL 3589034432,3589034495,FR 3589034496,3589037055,ES -3589037056,3589037327,NL -3589037328,3589037343,ES +3589037056,3589037343,NL 3589037344,3589037375,SE -3589037376,3589037391,NL -3589037392,3589037407,ES -3589037408,3589037423,NL +3589037376,3589037423,NL 3589037424,3589037439,ES -3589037440,3589037487,NL -3589037488,3589037495,ES +3589037440,3589037495,NL 3589037496,3589037503,CH -3589037504,3589037535,NL -3589037536,3589037551,ES +3589037504,3589037551,NL 3589037552,3589037559,BE 3589037560,3589037567,NL 3589037568,3589038079,ES -3589038080,3589040127,NL -3589040128,3589042207,ES -3589042208,3589042367,NL -3589042368,3589043231,ES -3589043232,3589043327,NL -3589043328,3589043455,ES -3589043456,3589043711,NL -3589043712,3589044223,ES -3589044224,3589044319,NL -3589044320,3589046271,ES +3589038080,3589046271,NL 3589046272,3589079039,NO 3589079040,3589092223,DK 3589092224,3589092227,SE 3589092228,3589128191,DK 3589128192,3589144575,GB +3589144576,3589152767,UA 3589152768,3589152927,DE 3589152928,3589152935,CH 3589152936,3589153027,DE @@ -76836,31 +123585,7 @@ 3589259264,3589269455,DE 3589269456,3589269471,AT 3589269472,3589275647,DE -3589275648,3589283327,CS -3589283328,3589283343,RS -3589283344,3589283535,CS -3589283536,3589283543,RS -3589283544,3589284975,CS -3589284976,3589285007,RS -3589285008,3589285015,CS -3589285016,3589285023,RS -3589285024,3589285047,CS -3589285048,3589285055,RS -3589285056,3589285087,CS -3589285088,3589285279,RS -3589285280,3589285327,CS -3589285328,3589285335,RS -3589285336,3589288015,CS -3589288016,3589288023,RS -3589288024,3589288127,CS -3589288128,3589288159,RS -3589288160,3589289855,CS -3589289856,3589289871,RS -3589289872,3589289879,CS -3589289880,3589289887,RS -3589289888,3589289927,CS -3589289928,3589289935,RS -3589289936,3589292031,CS +3589275648,3589292031,RS 3589292032,3589308415,AT 3589308416,3589317887,DE 3589317888,3589317951,GB @@ -76877,18 +123602,16 @@ 3589424640,3589425151,ES 3589425152,3589425663,CH 3589425664,3589426175,GB -3589426176,3589426239,FR -3589426240,3589427199,GB -3589427200,3589427231,FR -3589427232,3589429247,GB +3589426176,3589426303,FR +3589426304,3589427199,GB +3589427200,3589427247,FR +3589427248,3589429247,GB 3589429248,3589429503,FR -3589429504,3589430655,GB -3589430656,3589430719,FR -3589430720,3589430783,GB -3589430784,3589431343,FR -3589431344,3589431551,GB -3589431552,3589431807,FR -3589431808,3589432319,GB +3589429504,3589430271,GB +3589430272,3589430543,FR +3589430544,3589431295,GB +3589431296,3589431343,FR +3589431344,3589432319,GB 3589432320,3589432575,CH 3589432576,3589432895,FR 3589432896,3589433343,GB @@ -76902,9 +123625,17 @@ 3589433568,3589433599,GB 3589433600,3589434111,IE 3589434112,3589434623,DK -3589434624,3589434879,GB +3589434624,3589434751,GB +3589434752,3589434879,ES 3589434880,3589435391,FR -3589435392,3589439487,GB +3589435392,3589435519,PL +3589435520,3589435775,ES +3589435776,3589435903,GB +3589435904,3589436159,ES +3589436160,3589436415,GB +3589436416,3589436671,FR +3589436672,3589436799,PL +3589436800,3589439487,GB 3589439488,3589444631,SE 3589444632,3589444639,NO 3589444640,3589455871,SE @@ -76919,431 +123650,282 @@ 3589545984,3589554175,DE 3589554176,3589570559,PS 3589570560,3589570655,NL -3589570656,3589571327,GB -3589571328,3589571455,NL -3589571456,3589578751,GB -3589578752,3589580031,NL -3589580032,3589580127,GB -3589580128,3589580159,NL -3589580160,3589580287,GB -3589580288,3589580799,NL +3589570656,3589578751,GB +3589578752,3589579263,NL +3589579264,3589579775,GB +3589579776,3589580799,NL 3589580800,3589580895,GB 3589580896,3589581055,NL 3589581056,3589581199,GB 3589581200,3589581215,NL 3589581216,3589581327,GB -3589581328,3589581791,NL +3589581328,3589581439,NL +3589581440,3589581567,GB +3589581568,3589581791,NL 3589581792,3589581823,GB 3589581824,3589582591,NL 3589582592,3589582607,GB 3589582608,3589582639,NL 3589582640,3589582655,GB -3589582656,3589583615,NL -3589583616,3589583647,GB +3589582656,3589583359,NL +3589583360,3589583647,GB 3589583648,3589583663,NL 3589583664,3589583743,GB -3589583744,3589584271,NL -3589584272,3589584383,GB -3589584384,3589585279,NL +3589583744,3589583871,DE +3589583872,3589584255,GB +3589584256,3589584271,NL +3589584272,3589584639,GB +3589584640,3589585279,NL 3589585280,3589585407,GB 3589585408,3589585983,NL -3589585984,3589586175,GB -3589586176,3589586431,NL -3589586432,3589586687,GB -3589586688,3589586943,NL -3589586944,3589603327,CS +3589585984,3589586431,GB +3589586432,3589586687,NL +3589586688,3589586943,GB +3589586944,3589603327,RS 3589603328,3589668863,FR -3589668864,3589677055,IT +3589668864,3589677055,RU 3589677056,3589680287,FR 3589680288,3589680303,MQ 3589680304,3589680751,FR 3589680752,3589680767,MQ 3589680768,3589685247,FR -3589685248,3589718079,GB -3589718080,3589718087,BE -3589718088,3589718095,GB -3589718096,3589718303,BE -3589718304,3589718319,GB -3589718320,3589718599,BE -3589718600,3589718631,GB -3589718632,3589718639,BE -3589718640,3589718647,GB -3589718648,3589719095,BE -3589719096,3589719103,GB -3589719104,3589719159,BE -3589719160,3589719167,GB -3589719168,3589719231,BE -3589719232,3589719263,GB -3589719264,3589719271,BE -3589719272,3589719295,GB -3589719296,3589719343,BE -3589719344,3589719359,GB -3589719360,3589719399,BE -3589719400,3589719407,GB -3589719408,3589719423,BE -3589719424,3589719551,GB -3589719552,3589719711,BE -3589719712,3589719743,GB -3589719744,3589719807,BE -3589719808,3589719815,GB -3589719816,3589719823,BE -3589719824,3589719839,GB -3589719840,3589719871,BE -3589719872,3589719903,GB -3589719904,3589719971,BE -3589719972,3589719975,GB +3589685248,3589718015,GB +3589718016,3589719343,BE +3589719344,3589719347,GB +3589719348,3589719847,BE +3589719848,3589719855,AT +3589719856,3589719967,BE +3589719968,3589719975,GB 3589719976,3589720071,BE -3589720072,3589720075,GB -3589720076,3589720151,BE -3589720152,3589720159,GB -3589720160,3589720263,BE +3589720072,3589720079,FR +3589720080,3589720135,BE +3589720136,3589720143,GB +3589720144,3589720263,BE 3589720264,3589720271,GB -3589720272,3589720575,BE -3589720576,3589720607,GB -3589720608,3589720655,BE -3589720656,3589720671,GB -3589720672,3589720727,BE +3589720272,3589720279,FR +3589720280,3589720303,BE +3589720304,3589720311,FR +3589720312,3589720575,BE +3589720576,3589720583,ES +3589720584,3589720599,FR +3589720600,3589720603,BE +3589720604,3589720607,GB +3589720608,3589720623,BE +3589720624,3589720631,GB +3589720632,3589720639,FR +3589720640,3589720655,BE +3589720656,3589720663,ES +3589720664,3589720687,BE +3589720688,3589720695,GB +3589720696,3589720703,FR +3589720704,3589720727,BE 3589720728,3589720735,GB -3589720736,3589720791,BE -3589720792,3589720799,GB -3589720800,3589720823,BE -3589720824,3589720831,GB -3589720832,3589720887,BE -3589720888,3589720895,GB -3589720896,3589720911,BE -3589720912,3589720935,GB -3589720936,3589721063,BE +3589720736,3589720743,BE +3589720744,3589720767,GB +3589720768,3589720783,BE +3589720784,3589720799,GB +3589720800,3589720815,BE +3589720816,3589720823,GB +3589720824,3589720839,BE +3589720840,3589720847,GB +3589720848,3589720879,BE +3589720880,3589720887,FR +3589720888,3589720895,BE +3589720896,3589720903,IT +3589720904,3589720935,BE +3589720936,3589720943,GB +3589720944,3589720951,FR +3589720952,3589720983,GB +3589720984,3589720995,BE +3589720996,3589721003,GB +3589721004,3589721015,BE +3589721016,3589721031,GB +3589721032,3589721039,BE +3589721040,3589721047,GB +3589721048,3589721055,ES +3589721056,3589721063,BE 3589721064,3589721071,GB -3589721072,3589721143,BE -3589721144,3589721151,GB -3589721152,3589721155,BE -3589721156,3589721159,GB -3589721160,3589721215,BE -3589721216,3589721223,GB -3589721224,3589721375,BE -3589721376,3589721407,GB -3589721408,3589721423,BE -3589721424,3589721431,GB -3589721432,3589721487,BE -3589721488,3589721495,GB -3589721496,3589721575,BE -3589721576,3589721583,GB -3589721584,3589721679,BE -3589721680,3589721695,GB -3589721696,3589721711,BE -3589721712,3589721719,GB -3589721720,3589721831,BE -3589721832,3589721847,GB -3589721848,3589721879,BE -3589721880,3589721887,GB -3589721888,3589721895,BE -3589721896,3589721899,GB -3589721900,3589721967,BE -3589721968,3589721983,GB -3589721984,3589722059,BE +3589721072,3589721147,BE +3589721148,3589721151,GB +3589721152,3589721159,BE +3589721160,3589721167,GB +3589721168,3589721231,BE +3589721232,3589721247,GB +3589721248,3589721255,FR +3589721256,3589721279,GB +3589721280,3589721295,BE +3589721296,3589721311,FR +3589721312,3589721399,BE +3589721400,3589721407,GB +3589721408,3589721855,BE +3589721856,3589721863,GB +3589721864,3589721867,BE +3589721868,3589721883,GB +3589721884,3589721903,BE +3589721904,3589721911,GB +3589721912,3589721951,BE +3589721952,3589721967,GB +3589721968,3589722023,BE +3589722024,3589722031,FR +3589722032,3589722059,BE 3589722060,3589722063,GB -3589722064,3589722295,BE +3589722064,3589722111,BE +3589722112,3589722143,GB +3589722144,3589722159,BE +3589722160,3589722167,FR +3589722168,3589722175,BE +3589722176,3589722191,GB +3589722192,3589722199,BE +3589722200,3589722207,FR +3589722208,3589722263,BE +3589722264,3589722271,GB +3589722272,3589722279,BE +3589722280,3589722287,FR +3589722288,3589722295,BE 3589722296,3589722299,GB -3589722300,3589722351,BE -3589722352,3589722359,GB -3589722360,3589722395,BE +3589722300,3589722303,BE +3589722304,3589722311,FR +3589722312,3589722319,GB +3589722320,3589722335,FR +3589722336,3589722343,BE +3589722344,3589722359,FR +3589722360,3589722383,BE +3589722384,3589722391,FR +3589722392,3589722395,BE 3589722396,3589722399,GB 3589722400,3589722439,BE 3589722440,3589722447,GB -3589722448,3589722511,BE -3589722512,3589722527,GB -3589722528,3589722607,BE -3589722608,3589722615,GB -3589722616,3589722655,BE -3589722656,3589722663,GB -3589722664,3589722691,BE -3589722692,3589722695,GB -3589722696,3589722799,BE -3589722800,3589722803,GB -3589722804,3589722835,BE +3589722448,3589722623,BE +3589722624,3589722631,GB +3589722632,3589722639,BE +3589722640,3589722647,GB +3589722648,3589722703,BE +3589722704,3589722711,FR +3589722712,3589722791,BE +3589722792,3589722799,GB +3589722800,3589722835,BE 3589722836,3589722843,GB -3589722844,3589722855,BE -3589722856,3589722863,GB -3589722864,3589722871,BE -3589722872,3589722875,GB -3589722876,3589722883,BE -3589722884,3589722887,GB -3589722888,3589722943,BE -3589722944,3589722999,GB +3589722844,3589722859,BE +3589722860,3589722863,GB +3589722864,3589722943,BE +3589722944,3589722951,GB +3589722952,3589722959,FR +3589722960,3589722979,BE +3589722980,3589722991,GB +3589722992,3589722995,BE +3589722996,3589722999,GB 3589723000,3589723023,BE -3589723024,3589723095,GB -3589723096,3589723391,BE -3589723392,3589723647,GB -3589723648,3589723775,BE -3589723776,3589723839,GB -3589723840,3589723903,BE -3589723904,3589723967,GB -3589723968,3589724031,BE -3589724032,3589724039,GB -3589724040,3589724047,BE -3589724048,3589724159,GB -3589724160,3589724223,BE -3589724224,3589724287,GB -3589724288,3589724351,BE -3589724352,3589724415,GB -3589724416,3589724423,BE -3589724424,3589724431,GB -3589724432,3589724607,BE -3589724608,3589724631,GB -3589724632,3589724639,BE -3589724640,3589724647,GB -3589724648,3589724671,BE -3589724672,3589724735,GB -3589724736,3589724775,BE -3589724776,3589724783,GB -3589724784,3589724791,BE +3589723024,3589723031,FR +3589723032,3589723975,BE +3589723976,3589723983,FR +3589723984,3589724031,BE +3589724032,3589724039,ES +3589724040,3589724199,BE +3589724200,3589724207,ES +3589724208,3589724271,BE +3589724272,3589724287,NL +3589724288,3589724671,BE +3589724672,3589724679,FR +3589724680,3589724695,GB +3589724696,3589724703,BE +3589724704,3589724719,FR +3589724720,3589724727,GB +3589724728,3589724791,BE 3589724792,3589724807,GB -3589724808,3589724839,BE -3589724840,3589724847,GB -3589724848,3589724863,BE -3589724864,3589724883,GB -3589724884,3589724887,BE -3589724888,3589724927,GB -3589724928,3589725023,BE -3589725024,3589725039,GB -3589725040,3589725135,BE -3589725136,3589725151,GB -3589725152,3589725247,BE -3589725248,3589725279,GB -3589725280,3589725295,BE -3589725296,3589725311,GB -3589725312,3589725383,BE -3589725384,3589725391,GB -3589725392,3589725407,BE -3589725408,3589725423,GB -3589725424,3589725439,BE -3589725440,3589725463,GB -3589725464,3589725495,BE -3589725496,3589725503,GB -3589725504,3589725567,BE -3589725568,3589725583,GB -3589725584,3589725591,BE -3589725592,3589725607,GB -3589725608,3589725615,BE -3589725616,3589725623,GB -3589725624,3589725759,BE -3589725760,3589725767,GB -3589725768,3589725775,BE -3589725776,3589725783,GB -3589725784,3589725791,BE -3589725792,3589725807,GB -3589725808,3589725831,BE -3589725832,3589725863,GB -3589725864,3589725871,BE -3589725872,3589725879,GB -3589725880,3589725887,BE -3589725888,3589725895,GB -3589725896,3589725903,BE -3589725904,3589725943,GB -3589725944,3589725967,BE -3589725968,3589725983,GB -3589725984,3589725999,BE -3589726000,3589726007,GB -3589726008,3589726023,BE -3589726024,3589726031,GB -3589726032,3589726071,BE -3589726072,3589726095,GB -3589726096,3589726111,BE -3589726112,3589726143,GB -3589726144,3589726167,BE -3589726168,3589726183,GB -3589726184,3589726191,BE -3589726192,3589726199,GB -3589726200,3589726207,BE -3589726208,3589726351,GB -3589726352,3589726359,BE -3589726360,3589726367,GB -3589726368,3589726391,BE -3589726392,3589726407,GB -3589726408,3589726415,BE -3589726416,3589726439,GB -3589726440,3589726447,BE -3589726448,3589726495,GB -3589726496,3589726527,BE -3589726528,3589726535,GB -3589726536,3589726543,BE -3589726544,3589726551,GB -3589726552,3589726599,BE -3589726600,3589726631,GB -3589726632,3589726655,BE -3589726656,3589726663,GB -3589726664,3589726671,BE -3589726672,3589726687,GB -3589726688,3589726695,BE -3589726696,3589726711,GB -3589726712,3589726719,BE -3589726720,3589726735,GB -3589726736,3589726751,BE -3589726752,3589726783,GB -3589726784,3589726791,BE -3589726792,3589726847,GB -3589726848,3589726911,BE -3589726912,3589726975,GB -3589726976,3589726991,BE -3589726992,3589727007,GB -3589727008,3589727015,BE -3589727016,3589727023,GB -3589727024,3589727047,BE -3589727048,3589727055,GB -3589727056,3589727063,BE -3589727064,3589727071,GB -3589727072,3589727103,BE -3589727104,3589727119,GB -3589727120,3589727143,BE -3589727144,3589727159,GB -3589727160,3589727175,BE -3589727176,3589727215,GB -3589727216,3589727223,BE -3589727224,3589727295,GB -3589727296,3589727431,BE -3589727432,3589727439,GB -3589727440,3589727447,BE -3589727448,3589727455,GB -3589727456,3589727463,BE -3589727464,3589727471,GB -3589727472,3589727487,BE -3589727488,3589727743,GB -3589727744,3589727759,BE -3589727760,3589727999,GB -3589728000,3589728255,BE -3589728256,3589729111,GB -3589729112,3589729127,BE -3589729128,3589729151,GB -3589729152,3589729191,BE -3589729192,3589729215,GB -3589729216,3589729287,BE -3589729288,3589729295,GB -3589729296,3589729311,BE -3589729312,3589729343,GB -3589729344,3589729407,BE -3589729408,3589729559,GB -3589729560,3589729567,BE -3589729568,3589729583,GB -3589729584,3589729607,BE -3589729608,3589729631,GB -3589729632,3589729647,BE -3589729648,3589729679,GB -3589729680,3589729703,BE -3589729704,3589729751,GB -3589729752,3589729775,BE -3589729776,3589729799,GB -3589729800,3589729815,BE -3589729816,3589729823,GB -3589729824,3589729855,BE -3589729856,3589729895,GB -3589729896,3589729903,BE -3589729904,3589729919,GB -3589729920,3589729943,BE -3589729944,3589729951,GB -3589729952,3589729959,BE -3589729960,3589729975,GB -3589729976,3589729983,BE -3589729984,3589729991,GB -3589729992,3589730015,BE -3589730016,3589730031,GB -3589730032,3589730039,BE -3589730040,3589730047,GB -3589730048,3589730055,BE -3589730056,3589730063,GB -3589730064,3589730071,BE -3589730072,3589730079,GB -3589730080,3589730095,BE -3589730096,3589730103,GB -3589730104,3589730111,BE +3589724808,3589725247,BE +3589725248,3589725263,GB +3589725264,3589725495,BE +3589725496,3589725503,PT +3589725504,3589725663,BE +3589725664,3589725695,GB +3589725696,3589725799,BE +3589725800,3589725807,IE +3589725808,3589725847,BE +3589725848,3589725855,IE +3589725856,3589725911,BE +3589725912,3589725919,GB +3589725920,3589725959,BE +3589725960,3589725967,LU +3589725968,3589725999,BE +3589726000,3589726007,FR +3589726008,3589726047,BE +3589726048,3589726055,FR +3589726056,3589726111,BE +3589726112,3589726119,GB +3589726120,3589726367,BE +3589726368,3589726375,FR +3589726376,3589726423,BE +3589726424,3589726431,FR +3589726432,3589726455,BE +3589726456,3589726463,FR +3589726464,3589726471,BE +3589726472,3589726479,GB +3589726480,3589726487,BE +3589726488,3589726495,GB +3589726496,3589726535,BE +3589726536,3589726543,GB +3589726544,3589729743,BE +3589729744,3589729751,GB +3589729752,3589730071,BE +3589730072,3589730075,GB +3589730076,3589730087,BE +3589730088,3589730095,GB +3589730096,3589730111,BE 3589730112,3589730119,GB -3589730120,3589730135,BE -3589730136,3589730143,GB -3589730144,3589730151,BE -3589730152,3589730159,GB -3589730160,3589730175,BE -3589730176,3589730279,GB -3589730280,3589730287,BE -3589730288,3589730295,GB -3589730296,3589730815,BE -3589730816,3589731455,GB -3589731456,3589731599,BE -3589731600,3589731607,GB -3589731608,3589731615,BE -3589731616,3589731623,GB -3589731624,3589731631,BE -3589731632,3589731679,GB -3589731680,3589731719,BE -3589731720,3589731735,GB -3589731736,3589731783,BE -3589731784,3589731791,GB -3589731792,3589731799,BE -3589731800,3589731831,GB -3589731832,3589731839,BE -3589731840,3589732111,GB -3589732112,3589732239,BE -3589732240,3589732255,GB -3589732256,3589732287,BE -3589732288,3589732295,GB -3589732296,3589732303,BE -3589732304,3589732319,GB -3589732320,3589732327,BE -3589732328,3589732607,GB -3589732608,3589732711,BE -3589732712,3589732743,GB -3589732744,3589732759,BE -3589732760,3589732783,GB -3589732784,3589732863,BE -3589732864,3589733183,GB -3589733184,3589733191,BE -3589733192,3589733439,GB -3589733440,3589733455,BE -3589733456,3589733695,GB -3589733696,3589733711,BE -3589733712,3589734015,GB -3589734016,3589734055,BE -3589734056,3589734063,GB -3589734064,3589734119,BE -3589734120,3589734159,GB -3589734160,3589734271,BE -3589734272,3589734319,GB -3589734320,3589734327,BE -3589734328,3589734335,GB -3589734336,3589734391,BE -3589734392,3589734399,GB -3589742592,3589744895,NL +3589730120,3589730139,BE +3589730140,3589730143,GB +3589730144,3589731603,BE +3589731604,3589731607,GB +3589731608,3589731635,BE +3589731636,3589731639,GB +3589731640,3589731719,BE +3589731720,3589731723,GB +3589731724,3589731731,BE +3589731732,3589731735,GB +3589731736,3589731819,BE +3589731820,3589731823,GB +3589731824,3589733375,BE +3589733376,3589733439,LU +3589733440,3589734399,BE +3589734400,3589742591,EG +3589742592,3589742687,NL +3589742688,3589742695,AT +3589742696,3589742975,NL +3589742976,3589743039,IE +3589743040,3589743458,NL +3589743459,3589743460,US +3589743461,3589744895,NL 3589744896,3589744959,BE 3589744960,3589745119,NL 3589745120,3589745151,BE -3589745152,3589747047,NL -3589747048,3589747055,BE -3589747056,3589747071,NL +3589745152,3589746087,NL +3589746088,3589746095,DE +3589746096,3589747071,NL 3589747072,3589747103,ES -3589747104,3589747167,NL -3589747168,3589747199,IE -3589747200,3589747327,NL -3589747328,3589747455,US -3589747456,3589750783,NL -3589750784,3589761535,IL -3589761536,3589767167,FR +3589747104,3589767167,NL 3589767168,3589816319,RU +3589816320,3589827071,EU 3589827072,3589827327,SE 3589827328,3589827583,FR -3589827584,3589827687,HU -3589827696,3589827711,PL -3589827712,3589827839,DE +3589827584,3589827647,EU +3589827648,3589827679,DE +3589827680,3589827711,EU +3589827712,3589828095,DE 3589828096,3589828111,FR +3589828112,3589828127,EU +3589828128,3589828159,DE 3589828160,3589828607,FR 3589828608,3589828639,SE 3589828640,3589828671,NL -3589828672,3589828735,SE +3589828672,3589828735,EU 3589828736,3589828863,NL -3589829184,3589829247,GB -3589829376,3589829887,GB -3589830144,3589830655,GB +3589828864,3589829119,EU +3589829120,3589829183,GB +3589829184,3589829375,EU +3589829376,3589830655,GB 3589830656,3589831167,DE 3589831168,3589831679,US -3589831680,3589831935,SE -3589831936,3589832447,FR +3589831680,3589832703,FR 3589832704,3589849087,TR 3589849088,3589865471,GB 3589865472,3589881855,GR @@ -77359,7 +123941,9 @@ 3589891616,3589891631,BE 3589891632,3589931007,GB 3589931008,3589947391,SI -3589947392,3589963775,FI +3589947392,3589951863,FI +3589951864,3589951871,AX +3589951872,3589963775,FI 3589963776,3589971231,ES 3589971232,3589971247,CA 3589971248,3589980159,ES @@ -77386,25 +123970,14 @@ 3589997568,3590012927,GB 3590012928,3590029311,BE 3590029312,3590045695,FR -3590045696,3590053887,RU -3590053888,3590057983,UA -3590057984,3590062079,RU +3590045696,3590062079,RU 3590062080,3590078463,DE 3590078464,3590094847,RU 3590094848,3590111231,DE 3590111232,3590113023,LT 3590113024,3590113279,LV 3590113280,3590127615,LT -3590127616,3590128127,GB -3590128128,3590128383,FR -3590128384,3590128639,GB -3590128640,3590128895,IT -3590128896,3590129151,NL -3590129152,3590135551,GB -3590135552,3590135807,ES -3590135808,3590137855,GB -3590137856,3590138111,PT -3590138112,3590143999,GB +3590127616,3590143999,GB 3590144000,3590151143,SI 3590151144,3590151151,HR 3590151152,3590154047,SI @@ -77413,37 +123986,53 @@ 3590155800,3590155807,HR 3590155808,3590155815,SI 3590155816,3590155823,HR -3590155824,3590156287,SI -3590156288,3590156959,HR +3590155824,3590156031,SI +3590156032,3590156287,RS +3590156288,3590156415,HR +3590156416,3590156423,SI +3590156424,3590156431,HR +3590156432,3590156447,SI +3590156448,3590156679,HR +3590156680,3590156687,SI +3590156688,3590156719,HR +3590156720,3590156727,SI +3590156728,3590156959,HR 3590156960,3590156991,AE -3590156992,3590157039,HR -3590157040,3590157055,RS -3590157056,3590157311,HR -3590157312,3590157335,CS -3590157336,3590157343,RS -3590157344,3590157439,SI -3590157440,3590157455,RS -3590157456,3590157567,CS +3590156992,3590157039,SI +3590157040,3590157311,HR +3590157312,3590157343,RS +3590157344,3590157351,SI +3590157352,3590157359,RS +3590157360,3590157439,SI +3590157440,3590157471,RS +3590157472,3590157487,SI +3590157488,3590157567,RS 3590157568,3590157631,SI -3590157632,3590157647,RS -3590157648,3590157655,CS -3590157656,3590157663,RS -3590157664,3590157695,SI -3590157696,3590157727,CS -3590157728,3590157743,SI +3590157632,3590157679,RS +3590157680,3590157687,SI +3590157688,3590157695,RS +3590157696,3590157743,SI 3590157744,3590157751,RS 3590157752,3590157759,SI -3590157760,3590157775,RS -3590157776,3590157823,SI -3590157824,3590158343,CS +3590157760,3590157767,RS +3590157768,3590157775,SI +3590157776,3590157783,RS +3590157784,3590157823,SI +3590157824,3590157839,RS +3590157840,3590157855,SI +3590157856,3590157951,RS +3590157952,3590158015,SI +3590158016,3590158343,RS 3590158344,3590158407,SI -3590158408,3590158439,CS +3590158408,3590158415,RS +3590158416,3590158431,SI +3590158432,3590158439,RS 3590158440,3590158455,SI -3590158456,3590158479,CS -3590158480,3590158503,SI -3590158504,3590158511,CS -3590158512,3590158591,SI -3590158592,3590159359,CS +3590158456,3590158479,RS +3590158480,3590158527,SI +3590158528,3590158535,RS +3590158536,3590158591,SI +3590158592,3590159359,RS 3590159360,3590160383,SI 3590160384,3590176767,GB 3590176768,3590178615,HU @@ -77455,13 +124044,13 @@ 3590225920,3590234111,TR 3590234112,3590242303,GB 3590242304,3590244351,US -3590244352,3590244415,FR -3590244416,3590244863,DE +3590244352,3590244863,DE 3590244864,3590245119,GR -3590245120,3590245183,BE -3590245184,3590245215,FR -3590245216,3590245375,BE -3590245376,3590245503,FR +3590245120,3590245167,BE +3590245168,3590245279,FR +3590245280,3590245311,BE +3590245312,3590245439,US +3590245440,3590245503,FR 3590245504,3590245567,GB 3590245568,3590245631,US 3590245632,3590245887,FR @@ -77469,14 +124058,15 @@ 3590245984,3590246175,FR 3590246176,3590246207,AU 3590246208,3590246271,FR -3590246272,3590246303,DE -3590246304,3590246399,FR +3590246272,3590246287,DE +3590246288,3590246399,FR 3590246400,3590246911,US 3590246912,3590247039,DE 3590247040,3590247055,IT -3590247056,3590247071,DE -3590247072,3590247087,IT -3590247088,3590247167,DE +3590247056,3590247063,DE +3590247064,3590247071,FR +3590247072,3590247103,IT +3590247104,3590247167,FR 3590247168,3590247231,US 3590247232,3590247295,IT 3590247296,3590247423,US @@ -77484,257 +124074,337 @@ 3590247488,3590247551,US 3590247552,3590247679,IT 3590247680,3590247687,GB -3590247688,3590247935,DE -3590247936,3590248191,ES -3590248192,3590248447,DE +3590247688,3590247711,FR +3590247712,3590247743,A1 +3590247744,3590248447,FR 3590248448,3590248959,US 3590248960,3590249471,ES 3590249472,3590249983,IE 3590249984,3590250495,GR 3590250496,3590250751,IE 3590250752,3590251007,GR -3590251008,3590251263,ES +3590251008,3590251263,IT 3590251264,3590251519,DE 3590251520,3590251551,ES -3590251552,3590251583,DE +3590251552,3590251583,FR 3590251584,3590251647,US -3590251648,3590251775,DE -3590251776,3590251839,US +3590251648,3590251775,NL +3590251776,3590251839,FR 3590251840,3590251903,ES -3590251904,3590251967,US +3590251904,3590251967,FR 3590251968,3590252543,ES 3590252544,3590253055,GB -3590253056,3590253375,DE +3590253056,3590253311,DE +3590253312,3590253375,FR 3590253376,3590253407,US -3590253408,3590253567,DE -3590253568,3590253823,MU -3590253824,3590254111,DE -3590254112,3590254127,IL +3590253408,3590254079,FR +3590254080,3590254087,DE +3590254088,3590254095,FR +3590254096,3590254111,DE +3590254112,3590254127,FR 3590254128,3590254135,RU -3590254136,3590254143,GB -3590254144,3590254207,US -3590254208,3590254271,FR -3590254272,3590254303,DE +3590254136,3590254143,FR +3590254144,3590254271,US +3590254272,3590254303,FR 3590254304,3590254335,US -3590254336,3590254591,DE -3590254592,3590254879,ES -3590254880,3590254911,DE +3590254336,3590254463,FR +3590254464,3590254879,ES +3590254880,3590254911,FR 3590254912,3590254975,ES -3590254976,3590255047,DE +3590254976,3590255039,DE +3590255040,3590255047,FR 3590255048,3590255071,ES -3590255072,3590255103,DE +3590255072,3590255103,FR 3590255104,3590255359,ES -3590255360,3590255935,DE -3590255936,3590255999,US -3590256000,3590256639,DE +3590255360,3590255615,FR +3590255616,3590255871,BE +3590255872,3590256127,US +3590256128,3590256383,ES +3590256384,3590256639,IT 3590256640,3590256703,US 3590256704,3590256719,BE -3590256720,3590256735,DE +3590256720,3590256735,IE 3590256736,3590256767,BE -3590256768,3590256895,DE -3590256896,3590257151,FR -3590257152,3590258431,DE -3590258432,3590258463,GB -3590258464,3590258495,US -3590258496,3590258687,DE +3590256768,3590257151,US +3590257152,3590258175,DE +3590258176,3590258387,FR +3590258388,3590258391,DE +3590258392,3590258431,FR +3590258432,3590258447,GB +3590258448,3590258463,FR +3590258464,3590258687,US 3590258688,3590291455,IT +3590291456,3590299647,EG 3590299648,3590307839,FI -3590307840,3590307903,CG +3590307840,3590307903,A2 3590307904,3590307935,UA -3590307936,3590307951,GB +3590307936,3590307951,A2 3590307952,3590307967,NG -3590307968,3590307999,CD -3590308000,3590308031,GB +3590307968,3590308031,A2 3590308032,3590308047,UG 3590308048,3590308055,NG -3590308056,3590308063,GB -3590308064,3590308071,ZM -3590308072,3590308079,SZ -3590308080,3590308351,GB -3590308352,3590308607,CG +3590308056,3590308063,A2 +3590308064,3590308071,ZW +3590308072,3590308079,A2 +3590308080,3590308087,MW +3590308088,3590308095,AO +3590308096,3590308119,A2 +3590308120,3590308127,IQ +3590308128,3590308175,A2 +3590308176,3590308183,NG +3590308184,3590308191,IQ +3590308192,3590308199,A2 +3590308200,3590308231,IQ +3590308232,3590308247,A2 +3590308248,3590308263,IQ +3590308264,3590308271,A2 +3590308272,3590308287,IQ +3590308288,3590308295,A2 +3590308296,3590308303,IQ +3590308304,3590308311,SO +3590308312,3590308319,IQ +3590308320,3590308327,A2 +3590308328,3590308343,IQ +3590308344,3590308607,A2 3590308608,3590308735,NG -3590308736,3590308767,GB +3590308736,3590308767,A2 3590308768,3590308775,RW 3590308776,3590308783,ZA 3590308784,3590308799,ZW -3590308800,3590308831,GB -3590308832,3590308839,CG -3590308840,3590308911,NG -3590308912,3590308927,BI -3590308928,3590308951,GB +3590308800,3590308807,A2 +3590308808,3590308815,ZM +3590308816,3590308831,KE +3590308832,3590308839,ZW +3590308840,3590308847,ET +3590308848,3590308855,A2 +3590308856,3590308863,NG +3590308864,3590308911,A2 +3590308912,3590308927,ZW +3590308928,3590308951,A2 3590308952,3590308959,GH -3590308960,3590308991,GB -3590308992,3590308999,ZM +3590308960,3590308991,A2 +3590308992,3590308999,NG 3590309000,3590309007,UG -3590309008,3590309023,GB +3590309008,3590309023,TZ 3590309024,3590309055,ZW -3590309056,3590309079,GB -3590309080,3590309087,GH -3590309088,3590309103,GB +3590309056,3590309063,CD +3590309064,3590309071,LU +3590309072,3590309079,MW +3590309080,3590309103,NG 3590309104,3590309111,ZW -3590309112,3590309511,GB +3590309112,3590309119,A2 +3590309120,3590309375,GB +3590309376,3590309503,A2 +3590309504,3590309511,NG 3590309512,3590309519,AO 3590309520,3590309527,NG 3590309528,3590309535,CM 3590309536,3590309543,SO 3590309544,3590309551,AM -3590309552,3590309559,NG -3590309560,3590309567,GB -3590309568,3590309575,NG -3590309576,3590309583,AO -3590309584,3590309591,ZW -3590309592,3590309599,SO -3590309600,3590309607,KE -3590309608,3590309615,GB +3590309552,3590309575,A2 +3590309576,3590309583,NG +3590309584,3590309615,A2 3590309616,3590309623,UG -3590309624,3590309631,SO -3590309632,3590309887,NG -3590309888,3590310143,MW -3590310144,3590310399,GB +3590309624,3590309631,ZW +3590309632,3590309647,IQ +3590309648,3590309679,A2 +3590309680,3590309695,IQ +3590309696,3590309711,A2 +3590309712,3590309719,IQ +3590309720,3590309727,A2 +3590309728,3590309759,IQ +3590309760,3590309775,A2 +3590309776,3590309783,IQ +3590309784,3590309799,A2 +3590309800,3590309807,IQ +3590309808,3590309823,A2 +3590309824,3590309839,IQ +3590309840,3590309863,A2 +3590309864,3590309871,IQ +3590309872,3590309879,A2 +3590309880,3590309887,IQ +3590309888,3590310143,A2 +3590310144,3590310159,MZ +3590310160,3590310167,IQ +3590310168,3590310175,A2 +3590310176,3590310183,LR +3590310184,3590310191,IQ +3590310192,3590310247,A2 +3590310248,3590310255,IQ +3590310256,3590310279,A2 +3590310280,3590310287,IQ +3590310288,3590310288,A2 +3590310289,3590310303,IQ +3590310304,3590310327,A2 +3590310328,3590310335,NG +3590310336,3590310351,IQ +3590310352,3590310367,A2 +3590310368,3590310399,IQ 3590310400,3590310655,UA 3590310656,3590310911,GB -3590310912,3590311423,NG +3590310912,3590311423,A2 3590311424,3590311679,GB 3590311680,3590311935,YT 3590311936,3590312703,MW -3590312704,3590312799,GB +3590312704,3590312799,A2 3590312800,3590312807,KE -3590312808,3590312815,GB -3590312816,3590312823,MW -3590312824,3590312831,GB -3590312832,3590312895,NG +3590312808,3590312895,A2 3590312896,3590312903,ZA -3590312904,3590312911,KE -3590312912,3590312927,NG +3590312904,3590312911,AO +3590312912,3590312919,NG +3590312920,3590312927,A2 3590312928,3590312943,UG -3590312944,3590312951,NG -3590312952,3590314639,GB +3590312944,3590312951,A2 +3590312952,3590312959,KE +3590312960,3590314623,A2 +3590314624,3590314639,ET 3590314640,3590314655,GH -3590314656,3590314671,GB +3590314656,3590314671,A2 3590314672,3590314679,UG -3590314680,3590314687,CG +3590314680,3590314687,A2 3590314688,3590314703,NG -3590314704,3590314735,GB -3590314736,3590314751,NG -3590314752,3590314775,GB -3590314776,3590314783,KE -3590314784,3590314799,GB -3590314800,3590314807,NG -3590314808,3590314815,GB -3590314816,3590314823,NG -3590314824,3590314895,GB -3590314896,3590314903,NG +3590314704,3590314719,A2 +3590314720,3590314727,TG +3590314728,3590314735,UG +3590314736,3590314743,NG +3590314744,3590314823,A2 +3590314824,3590314831,ZW +3590314832,3590314887,A2 +3590314888,3590314895,NG +3590314896,3590314903,A2 3590314904,3590314911,KE 3590314912,3590314927,GH 3590314928,3590314943,NG -3590314944,3590314959,GB -3590314960,3590314967,NG +3590314944,3590314967,A2 3590314968,3590314973,YT -3590314974,3590314975,GB +3590314974,3590314975,A2 3590314976,3590314983,UG -3590314984,3590316031,GB -3590316032,3590316039,CI -3590316040,3590316047,GB +3590314984,3590316031,A2 +3590316032,3590316039,TZ +3590316040,3590316047,A2 3590316048,3590316055,GH -3590316056,3590316063,LB -3590316064,3590316071,NG -3590316072,3590316079,BJ -3590316080,3590316087,GB -3590316088,3590316095,IQ -3590316096,3590316127,AO +3590316056,3590316079,IQ +3590316080,3590316087,LB +3590316088,3590316095,A2 +3590316096,3590316127,IQ 3590316128,3590316151,NG -3590316152,3590316159,GR -3590316160,3590316543,LB -3590316544,3590316559,GB -3590316560,3590316575,IQ -3590316576,3590316591,GB +3590316152,3590316159,A2 +3590316160,3590316175,LB +3590316176,3590316199,A2 +3590316200,3590316215,IQ +3590316216,3590316231,A2 +3590316232,3590316239,LB +3590316240,3590316271,A2 +3590316272,3590316279,IQ +3590316280,3590316287,A2 +3590316288,3590316543,LB +3590316544,3590316567,A2 +3590316568,3590316575,IQ +3590316576,3590316591,A2 3590316592,3590316599,IQ -3590316600,3590316615,GB -3590316616,3590316623,GR -3590316624,3590316632,IQ -3590316633,3590316647,GB -3590316648,3590316655,LB +3590316600,3590316647,A2 +3590316648,3590316655,LY 3590316656,3590316663,IQ -3590316664,3590316671,GB -3590316672,3590316679,IQ -3590316680,3590316687,GB -3590316688,3590316695,IQ -3590316696,3590316703,NG -3590316704,3590316719,GB -3590316720,3590316727,IQ +3590316664,3590316671,LY +3590316672,3590316727,A2 3590316728,3590316735,LB -3590316736,3590316751,GR -3590316752,3590316783,GB -3590316784,3590316791,NG -3590316792,3590316799,CI -3590316800,3590317055,CS -3590317056,3590317079,US -3590317080,3590317311,UA -3590317312,3590317343,IQ -3590317344,3590317567,GB -3590317568,3590317631,IQ -3590317632,3590317695,UA -3590317696,3590317823,IQ -3590317824,3590318063,UA -3590318064,3590318079,GB -3590318080,3590319103,UA -3590319104,3590319165,AE -3590319166,3590319167,GB -3590319168,3590319359,AE -3590319360,3590319375,US -3590319376,3590319391,AE -3590319392,3590319423,US -3590319424,3590320112,AE -3590320113,3590320127,GB -3590320128,3590320191,NG +3590316736,3590316815,A2 +3590316816,3590316831,IQ +3590316832,3590317055,A2 +3590317056,3590317311,NG +3590317312,3590317343,AO +3590317344,3590317407,A2 +3590317408,3590317439,US +3590317440,3590317447,AM +3590317448,3590317455,LB +3590317456,3590317471,IQ +3590317472,3590317479,MW +3590317480,3590317487,US +3590317488,3590317495,A2 +3590317496,3590317503,LB +3590317504,3590317519,A2 +3590317520,3590317527,LY +3590317528,3590317823,IQ +3590317824,3590317951,A2 +3590317952,3590318047,UA +3590318048,3590319167,A2 +3590319168,3590319231,AE +3590319232,3590319335,A2 +3590319336,3590319359,AE +3590319360,3590319423,A2 +3590319424,3590319455,AE +3590319456,3590319967,A2 +3590319968,3590319999,AE +3590320000,3590320191,A2 3590320192,3590320199,LB -3590320200,3590320231,GB +3590320200,3590320207,IQ +3590320208,3590320231,A2 3590320232,3590320239,IQ -3590320240,3590320247,GB +3590320240,3590320247,A2 3590320248,3590320255,LB -3590320256,3590320383,GB -3590320384,3590320639,CM -3590320640,3590321151,GB +3590320256,3590320271,A2 +3590320272,3590320295,IQ +3590320296,3590320303,A2 +3590320304,3590320319,IQ +3590320320,3590320335,A2 +3590320336,3590320343,UG +3590320344,3590320367,IQ +3590320368,3590320375,A2 +3590320376,3590320383,IQ +3590320384,3590321151,A2 3590321152,3590321663,IQ -3590321664,3590321927,GB +3590321664,3590321679,A2 +3590321680,3590321687,CM +3590321688,3590321695,IQ +3590321696,3590321711,ZW +3590321712,3590321727,IQ +3590321728,3590321791,A2 +3590321792,3590321823,IQ +3590321824,3590321855,A2 +3590321856,3590321887,IQ +3590321888,3590321927,A2 3590321928,3590321935,IQ 3590321936,3590321943,LY -3590321944,3590321951,NG -3590321952,3590321959,IQ -3590321960,3590321967,GB +3590321944,3590321959,IQ +3590321960,3590321967,A2 3590321968,3590321983,TR -3590321984,3590321991,NG -3590321992,3590321999,GB -3590322000,3590322007,CY -3590322008,3590322023,GB -3590322024,3590322031,AO -3590322032,3590322047,GB -3590322048,3590322055,IQ -3590322056,3590322063,NE -3590322064,3590322071,GB -3590322072,3590322079,IQ -3590322080,3590322111,GB +3590321984,3590322007,A2 +3590322008,3590322015,IQ +3590322016,3590322047,A2 +3590322048,3590322055,NG +3590322056,3590322063,A2 +3590322064,3590322079,IQ +3590322080,3590322111,A2 3590322112,3590322119,BJ 3590322120,3590322127,IQ 3590322128,3590322135,GH -3590322136,3590322151,GB -3590322152,3590322159,NG -3590322160,3590322167,GB -3590322168,3590322175,IQ -3590322176,3590322303,NG -3590322304,3590322367,IQ -3590322368,3590322375,GB -3590322376,3590322391,LB -3590322392,3590322399,GB +3590322136,3590322151,A2 +3590322152,3590322159,LY +3590322160,3590322167,A2 +3590322168,3590322239,IQ +3590322240,3590322255,A2 +3590322256,3590322271,RW +3590322272,3590322335,A2 +3590322336,3590322351,MG +3590322352,3590322375,A2 +3590322376,3590322383,LY +3590322384,3590322399,IQ 3590322400,3590322415,AO 3590322416,3590322423,LR -3590322424,3590322431,NG -3590322432,3590322687,LB +3590322424,3590322431,A2 +3590322432,3590322559,LB +3590322560,3590322575,A2 +3590322576,3590322687,LB 3590322688,3590323199,IQ 3590323200,3590323711,MW -3590323712,3590323903,GB +3590323712,3590323903,A2 3590323904,3590323911,CD -3590323912,3590324223,GB +3590323912,3590324023,A2 +3590324024,3590324031,ZW +3590324032,3590324095,NG +3590324096,3590324103,A2 +3590324104,3590324111,ZW +3590324112,3590324223,A2 3590324224,3623890943,US 3623890944,3623891199,ZA 3623891200,3623891455,US @@ -77751,74 +124421,478 @@ 3624255488,3624257535,ZA 3624257536,3624271871,US 3624271872,3624272383,SY -3624272384,3624279039,CA +3624272384,3624272415,US +3624272416,3624272639,CA +3624272640,3624272895,DZ +3624272896,3624279039,CA 3624279040,3624279087,BD -3624279088,3624288255,CA +3624279088,3624281087,CA +3624281088,3624281343,HT +3624281344,3624283135,CA +3624283136,3624284159,US +3624284160,3624288255,CA 3624288256,3624290303,IN 3624290304,3624292351,CA 3624292352,3624292607,GP -3624292608,3624297471,CA +3624292608,3624294143,CA +3624294144,3624294399,US +3624294400,3624295935,CA +3624295936,3624296191,LY +3624296192,3624297471,CA 3624297472,3624298495,CO 3624298496,3624299519,PH -3624299520,3624303743,CA +3624299520,3624300031,CA +3624300032,3624300287,LY +3624300288,3624303359,CA +3624303360,3624303615,US +3624303616,3624303743,CA 3624303744,3624303759,ZA 3624303760,3624304639,CA 3624304640,3624321023,US 3624321024,3624325119,CA -3624325120,3624353791,US -3624357888,3624359679,US +3624325120,3624330511,US +3624330512,3624330519,IN +3624330520,3624333183,US +3624333184,3624333215,IN +3624333216,3624357887,US +3624357888,3624358143,KN +3624358144,3624359679,US 3624359680,3624360703,AN -3624360704,3624370175,US -3624374272,3624384767,US +3624360704,3624374431,US +3624374432,3624374439,GB +3624374440,3624374447,US +3624374448,3624374455,ES +3624374456,3624374463,DE +3624374464,3624374543,US +3624374544,3624374551,ES +3624374552,3624374559,US +3624374560,3624374599,ES +3624374600,3624374679,US +3624374680,3624374687,CY +3624374688,3624375871,US +3624375872,3624375879,NL +3624375880,3624376023,US +3624376024,3624376031,GB +3624376032,3624376247,US +3624376248,3624376263,ES +3624376264,3624376279,CY +3624376280,3624376287,GB +3624376288,3624376295,US +3624376296,3624376303,GB +3624376304,3624376335,US +3624376336,3624376343,AU +3624376344,3624376351,US +3624376352,3624376359,PT +3624376360,3624376567,US +3624376568,3624376575,NL +3624376576,3624376655,US +3624376656,3624376679,GB +3624376680,3624377319,US +3624377320,3624377323,GB +3624377324,3624377879,US +3624377880,3624377887,GB +3624377888,3624378039,US +3624378040,3624378047,GB +3624378048,3624379391,US +3624379392,3624379399,SG +3624379400,3624380415,US +3624380416,3624380447,CA +3624380448,3624380455,GB +3624380456,3624380511,US +3624380512,3624380519,HK +3624380520,3624380527,US +3624380528,3624380535,BE +3624380536,3624380543,US +3624380544,3624380551,CA +3624380552,3624380687,US +3624380688,3624380695,AU +3624380696,3624380735,US +3624380736,3624380743,VI +3624380744,3624380751,US +3624380752,3624380759,CA +3624380760,3624380767,CY +3624380768,3624380799,US +3624380800,3624380807,GB +3624380808,3624380831,US +3624380832,3624380839,OM +3624380840,3624380855,US +3624380856,3624380863,AR +3624380864,3624380935,US +3624380936,3624380943,SA +3624380944,3624380967,GB +3624380968,3624380983,TW +3624380984,3624381471,US +3624381472,3624381487,AU +3624381488,3624381535,US +3624381536,3624381551,CA +3624381552,3624381567,US +3624381568,3624381583,MY +3624381584,3624381631,US +3624381632,3624381647,GB +3624381648,3624381711,US +3624381712,3624381727,OM +3624381728,3624381807,US +3624381808,3624381823,IN +3624381824,3624381855,US +3624381856,3624381887,AU +3624381888,3624381903,US +3624381904,3624381919,CA +3624381920,3624382031,US +3624382032,3624382047,RO +3624382048,3624383071,US +3624383072,3624383087,GB +3624383088,3624383103,PT +3624383104,3624383183,US +3624383184,3624383199,DE +3624383200,3624384767,US 3624384768,3624385023,CA 3624385024,3624386559,US 3624386560,3624394751,CA 3624394752,3624435711,US -3624435712,3624452095,CA -3624452096,3624456191,US -3624468480,3624474879,US +3624435712,3624438664,CA +3624438665,3624438665,US +3624438666,3624443871,CA +3624443872,3624443879,US +3624443880,3624443903,CA +3624443904,3624443919,US +3624443920,3624444343,CA +3624444344,3624444351,US +3624444352,3624444359,CA +3624444360,3624444367,US +3624444368,3624452095,CA +3624452096,3624474879,US 3624474880,3624475391,CA 3624475392,3624480767,US 3624480768,3624484863,CA -3624484864,3624529919,US -3624529920,3624534015,CA -3624534016,3624587263,US +3624484864,3624534015,US +3624534016,3624534271,PA +3624534272,3624536063,CA +3624536064,3624546559,US +3624546560,3624546815,A2 +3624546816,3624546943,US +3624546944,3624546991,A2 +3624546992,3624547007,US +3624547008,3624547015,A2 +3624547016,3624547071,US +3624547072,3624547079,A2 +3624547080,3624547087,US +3624547088,3624547119,A2 +3624547120,3624547167,US +3624547168,3624547175,A2 +3624547176,3624547183,US +3624547184,3624547191,A2 +3624547192,3624547199,US +3624547200,3624547215,A2 +3624547216,3624547239,US +3624547240,3624547255,A2 +3624547256,3624547263,AS +3624547264,3624547591,US +3624547592,3624547647,A2 +3624547648,3624547711,US +3624547712,3624547743,A2 +3624547744,3624547839,US +3624547840,3624547847,A2 +3624547848,3624547863,US +3624547864,3624547871,A2 +3624547872,3624547895,US +3624547896,3624547919,A2 +3624547920,3624547967,US +3624547968,3624548007,A2 +3624548008,3624548031,US +3624548032,3624548039,A2 +3624548040,3624548063,US +3624548064,3624548087,A2 +3624548088,3624548607,US +3624548608,3624548671,A2 +3624548672,3624548687,US +3624548688,3624548703,A2 +3624548704,3624548711,US +3624548712,3624548735,A2 +3624548736,3624548815,US +3624548816,3624548823,A2 +3624548824,3624548935,US +3624548936,3624548959,A2 +3624548960,3624548975,US +3624548976,3624549023,A2 +3624549024,3624549047,US +3624549048,3624549063,A2 +3624549064,3624549079,US +3624549080,3624549087,A2 +3624549088,3624549095,US +3624549096,3624549111,A2 +3624549112,3624549375,US +3624549376,3624549887,AS +3624549888,3624550143,A2 +3624550144,3624587263,US +3624587264,3624591359,JM 3624591360,3624730623,US 3624730624,3624796159,CA 3624796160,3624798207,US -3624798208,3624798975,CA -3624798976,3624803071,US +3624798208,3624799231,CA +3624799232,3624799743,US +3624799744,3624799999,CA +3624800000,3624800255,US +3624800768,3624801023,CA +3624801024,3624803071,US 3624803072,3624803583,CA -3624803584,3624807935,US +3624803840,3624804351,US +3624804608,3624804863,CA +3624804864,3624807679,US 3624807936,3624808447,CA 3624808448,3624811519,US 3624811520,3624812287,CA -3624812288,3624820735,US +3624812288,3624817679,US +3624817680,3624817687,CA +3624817688,3624820735,US 3624820736,3624820799,CY 3624820800,3624821695,US 3624821696,3624821703,GB -3624821704,3624828927,US +3624821704,3624825097,US +3624825098,3624825102,BR +3624825103,3624827296,US +3624827297,3624827299,RS +3624827300,3624828927,US 3624828928,3624833023,CA 3624833024,3624845311,US 3624845312,3624849407,AU -3624849408,3624903167,US +3624849408,3624895055,US +3624895056,3624895071,TZ +3624895072,3624895103,US +3624895104,3624895119,DE +3624895120,3624895135,US +3624895136,3624895151,IN +3624895152,3624895775,US +3624895776,3624895807,MY +3624895808,3624895935,US +3624895936,3624895967,IN +3624895968,3624896287,US +3624896288,3624896319,GB +3624896320,3624896415,US +3624896416,3624896447,AT +3624896448,3624897791,US +3624897792,3624898047,IN +3624898048,3624898815,US +3624898816,3624899071,AU +3624899072,3624899327,CA +3624899328,3624899583,US +3624899584,3624899839,AU +3624899840,3624900607,US +3624900608,3624900639,AU +3624900640,3624900671,BE +3624900672,3624900735,US +3624900736,3624900799,CA +3624900800,3624900831,US +3624900832,3624900863,DE +3624900864,3624900951,US +3624900952,3624900959,FR +3624900960,3624900967,US +3624900968,3624900975,CA +3624900976,3624901103,US +3624901104,3624901111,PK +3624901112,3624901279,US +3624901280,3624901311,IN +3624901312,3624901343,BE +3624901344,3624901887,US +3624901888,3624901919,IN +3624901920,3624901951,MY +3624901952,3624902111,US +3624902112,3624902143,IN +3624902144,3624902271,US +3624902272,3624902399,MY +3624902400,3624902655,US +3624902656,3624902783,IN +3624902784,3624902911,CA +3624902912,3624902943,US +3624902944,3624902975,CA +3624902976,3624903167,US 3624903168,3624903423,CA -3624903424,3624903679,US +3624903424,3624903551,US +3624903552,3624903583,CA +3624903584,3624903679,US 3624903680,3624904703,CA -3624904704,3624905471,US +3624904704,3624904767,IN +3624904768,3624905087,US +3624905088,3624905151,CA +3624905152,3624905471,US 3624905472,3624905727,CA -3624905728,3624959999,US -3624976384,3624984575,US -3624984576,3624992767,CA -3624992768,3625019135,US +3624905728,3624906879,US +3624906880,3624907007,TW +3624907008,3624907039,FR +3624907040,3624907071,US +3624907072,3624907103,GB +3624907104,3624907455,US +3624907456,3624907518,MY +3624907519,3624907519,US +3624907520,3624907551,IN +3624907552,3624907583,US +3624907584,3624907615,CA +3624907616,3624907679,US +3624907680,3624907711,IN +3624907712,3624907745,US +3624907746,3624907775,IN +3624907776,3624907903,US +3624907904,3624908031,SG +3624908032,3624908159,TW +3624908160,3624908287,US +3624908288,3624908319,CA +3624908320,3624908351,US +3624908352,3624908383,BR +3624908384,3624908415,IN +3624908416,3624908479,US +3624908480,3624908511,CA +3624908512,3624908607,US +3624908608,3624908622,CA +3624908623,3624908639,US +3624908640,3624908687,CA +3624908688,3624908783,US +3624908784,3624908799,CA +3624908800,3624909375,US +3624909376,3624909407,VE +3624909408,3624909471,US +3624909472,3624909503,AU +3624909504,3624909567,US +3624909568,3624909822,MY +3624909823,3624909823,US +3624909824,3624909951,CA +3624909952,3624910079,US +3624910080,3624910111,CA +3624910112,3624910175,US +3624910176,3624910207,BE +3624910208,3624910271,US +3624910272,3624910303,FR +3624910304,3624910655,US +3624910656,3624910687,TZ +3624910688,3624910719,CA +3624910720,3624910751,US +3624910752,3624910783,TZ +3624910784,3624910815,US +3624910816,3624910847,AU +3624910848,3624910911,US +3624910912,3624910975,IN +3624910976,3624911007,FR +3624911008,3624911039,GB +3624911040,3624911103,US +3624911104,3624911135,CA +3624911136,3624911199,US +3624911200,3624911231,BE +3624911232,3624911359,US +3624911360,3624911615,CA +3624911616,3624911647,US +3624911648,3624911651,RU +3624911652,3624911999,US +3624912000,3624912127,CA +3624912128,3624913023,US +3624913024,3624913087,IN +3624913088,3624913311,US +3624913312,3624913343,CA +3624913344,3624913375,PK +3624913376,3624913535,US +3624913536,3624913663,IN +3624913664,3624914047,US +3624914048,3624914079,IN +3624914080,3624914143,US +3624914144,3624914175,GB +3624914176,3624914271,US +3624914272,3624914303,CA +3624914304,3624914335,US +3624914336,3624914367,CA +3624914368,3624914687,US +3624914688,3624914943,BE +3624914944,3624915199,US +3624915200,3624915455,CA +3624915456,3624915903,US +3624915904,3624915935,HK +3624915936,3624916159,US +3624916160,3624916223,MY +3624916224,3624916479,US +3624916480,3624916735,CA +3624916736,3624917247,US +3624917248,3624917503,AU +3624917504,3624917919,US +3624917920,3624917951,CH +3624917952,3624917983,US +3624917984,3624918015,CA +3624918016,3624918527,US +3624918528,3624918783,CA +3624918784,3624918815,HK +3624918816,3624918847,US +3624918848,3624918875,IN +3624918876,3624919007,US +3624919008,3624919039,MY +3624919040,3624919071,US +3624919072,3624919103,BE +3624919104,3624919295,US +3624919296,3624919423,CA +3624919424,3624919551,IN +3624919552,3624919679,CA +3624919680,3624919967,US +3624919968,3624919999,BE +3624920000,3624920031,CA +3624920032,3624920063,US +3624920064,3624920191,CA +3624920192,3624920319,IN +3624920320,3624920703,CA +3624920704,3624920831,IN +3624920832,3624920959,CA +3624920960,3624921087,IN +3624921088,3624921215,PK +3624921216,3624921343,CA +3624921344,3624921855,US +3624921856,3624922111,CA +3624922112,3624922143,US +3624922144,3624922207,MY +3624922208,3624922239,FR +3624922240,3624922271,US +3624922272,3624922287,CR +3624922288,3624922335,US +3624922336,3624922367,FR +3624922368,3624922495,IN +3624922496,3624922623,BE +3624922624,3624922815,US +3624922816,3624922847,FR +3624922848,3624922879,US +3624922880,3624923135,IN +3624923136,3624923263,CA +3624923264,3624923391,US +3624923392,3624923519,CA +3624923520,3624923647,US +3624923648,3624923775,CA +3624923776,3624924095,US +3624924096,3624924127,CA +3624924128,3624924287,US +3624924288,3624924671,CA +3624924672,3624924895,US +3624924896,3624924927,CA +3624924928,3624925054,US +3624925055,3624925695,CA +3624925696,3624926719,US +3624926720,3624926975,CA +3624926976,3624927039,US +3624927040,3624927071,HK +3624927072,3624927167,US +3624927168,3624927199,TH +3624927200,3624984575,US +3624984576,3624986367,CA +3624986368,3624986399,US +3624986400,3624990431,CA +3624990432,3624990463,US +3624990464,3624991223,CA +3624991224,3624991231,US +3624991232,3624992767,CA +3624992768,3625002351,US +3625002352,3625002367,CA +3625002368,3625019135,US 3625019136,3625019391,ES -3625019392,3625058303,US +3625019392,3625042327,US +3625042328,3625042335,IT +3625042336,3625058303,US 3625058304,3625091071,CA 3625091072,3625116671,US 3625116672,3625116767,CA 3625116768,3625116775,US 3625116776,3625116927,CA -3625116928,3625117775,US +3625116928,3625117183,SE +3625117184,3625117775,US 3625117776,3625117783,CA 3625117784,3625117791,US 3625117792,3625117799,CA @@ -77834,17 +124908,125 @@ 3625140224,3625148415,CA 3625148416,3625168895,US 3625168896,3625172991,CA -3625172992,3625234431,US -3625238528,3625254911,US -3625255168,3625255423,US -3625256448,3625256959,US -3625258752,3625259007,US -3625259264,3625259519,US -3625263104,3625287679,US -3625287680,3625295871,CA -3625295872,3625346047,US +3625172992,3625176767,US +3625176768,3625176831,NZ +3625176832,3625243215,US +3625243216,3625243223,CA +3625243224,3625245439,US +3625245440,3625245767,MX +3625245768,3625245903,US +3625245904,3625245911,BZ +3625245912,3625245951,US +3625245952,3625246255,MX +3625246256,3625246263,US +3625246264,3625246271,MX +3625246272,3625246279,US +3625246280,3625246287,MX +3625246288,3625246295,US +3625246296,3625246375,MX +3625246376,3625246391,US +3625246392,3625246719,MX +3625246720,3625287679,US +3625287680,3625288887,CA +3625288888,3625288895,US +3625288896,3625289959,CA +3625289960,3625289967,US +3625289968,3625292575,CA +3625292576,3625292583,US +3625292584,3625292671,CA +3625292672,3625292679,US +3625292680,3625292927,CA +3625292928,3625292935,US +3625292936,3625293607,CA +3625293608,3625293615,US +3625293616,3625295871,CA +3625295872,3625320447,US +3625320448,3625320467,CA +3625320468,3625321727,US +3625321728,3625321983,PA +3625321984,3625325055,US +3625325056,3625325087,RU +3625325088,3625326632,US +3625326633,3625326642,GB +3625326643,3625327748,US +3625327749,3625327812,ID +3625327813,3625327814,US +3625327815,3625327824,GB +3625327825,3625327907,US +3625327908,3625327917,ID +3625327918,3625333375,US +3625333376,3625333383,PA +3625333384,3625333391,GB +3625333392,3625333455,US +3625333456,3625333463,GB +3625333464,3625335861,US +3625335862,3625335865,IN +3625335866,3625346047,US 3625346048,3625346303,AR -3625346304,3625418751,US +3625346304,3625357631,US +3625357632,3625357639,CA +3625357640,3625358055,US +3625358056,3625358063,CH +3625358064,3625364351,US +3625364352,3625364479,DE +3625364480,3625364607,NL +3625364608,3625364733,DE +3625364734,3625364895,US +3625364896,3625364911,NO +3625364912,3625364951,US +3625364952,3625364959,NL +3625364960,3625364967,ZA +3625364968,3625373711,US +3625373712,3625373719,GB +3625373720,3625373735,US +3625373736,3625373743,CA +3625373744,3625373751,GB +3625373752,3625373823,US +3625373824,3625373831,CA +3625373832,3625373887,US +3625373888,3625373895,GB +3625373896,3625373953,US +3625373954,3625373983,CA +3625373984,3625374031,US +3625374032,3625374044,GB +3625374045,3625374047,US +3625374048,3625374063,CA +3625374064,3625374143,US +3625374144,3625374159,CA +3625374160,3625374879,US +3625374880,3625374911,MX +3625374912,3625375039,US +3625375040,3625375071,CA +3625375072,3625375135,US +3625375136,3625375167,RU +3625375168,3625375247,US +3625375248,3625375255,CA +3625375256,3625375271,US +3625375272,3625375279,GB +3625375280,3625375359,US +3625375360,3625375367,SE +3625375368,3625375399,US +3625375400,3625375407,MT +3625375408,3625375519,US +3625375520,3625375527,JM +3625375528,3625375599,US +3625375600,3625375607,JM +3625375608,3625375935,US +3625375936,3625375982,SG +3625375983,3625376031,US +3625376032,3625376063,AR +3625376064,3625376159,US +3625376160,3625376191,LB +3625376192,3625376223,TR +3625376224,3625377023,US +3625377024,3625377535,TH +3625377536,3625377583,US +3625377584,3625377599,CA +3625377600,3625381911,US +3625381912,3625381919,CA +3625381920,3625382079,US +3625382080,3625382111,CA +3625382112,3625418751,US 3625418752,3625420031,CA 3625420032,3625420543,US 3625420544,3625422591,CA @@ -77853,7 +125035,13 @@ 3625426944,3625508863,US 3625508864,3625512959,CA 3625512960,3625517055,PR -3625517056,3625631743,US +3625517056,3625528541,US +3625528542,3625528551,AU +3625528552,3625574399,US +3625574400,3625578495,A2 +3625578496,3625581631,US +3625581632,3625581647,NL +3625581648,3625631743,US 3625631744,3625639935,CA 3625639936,3626025919,US 3626025920,3626025951,LT @@ -77871,7 +125059,9 @@ 3626108896,3626108927,AU 3626108928,3626130415,US 3626130416,3626130431,CA -3626130432,3626142623,US +3626130432,3626140479,US +3626140480,3626140671,AU +3626140672,3626142623,US 3626142624,3626142639,AU 3626142640,3626184191,US 3626184192,3626184223,LT @@ -77893,49 +125083,667 @@ 3626227168,3626227199,AR 3626227200,3626228463,US 3626228464,3626228479,AE -3626228480,3626250239,US -3626254336,3626270719,US +3626228480,3626270719,US 3626270720,3626287103,CA 3626287104,3626332159,US -3626336256,3626369023,US -3626369024,3626377215,CA -3626377216,3626381311,US -3626385408,3626508287,US +3626332160,3626336255,CA +3626336256,3626381317,US +3626381318,3626381321,AU +3626381322,3626381325,CR +3626381326,3626381329,IT +3626381330,3626381337,US +3626381338,3626381341,IL +3626381342,3626381349,US +3626381350,3626381353,QA +3626381354,3626381357,US +3626381358,3626381361,IN +3626381362,3626381373,US +3626381374,3626381377,AU +3626381378,3626381401,US +3626381402,3626381405,MX +3626381406,3626381409,US +3626381410,3626381419,MX +3626381420,3626381423,GB +3626381424,3626381435,US +3626381436,3626381439,TR +3626381440,3626381451,US +3626381452,3626381456,GB +3626381457,3626381460,CA +3626381461,3626381480,US +3626381481,3626381484,VE +3626381485,3626381492,US +3626381493,3626381496,CO +3626381497,3626381508,US +3626381509,3626381510,RU +3626381511,3626381512,BE +3626381513,3626381516,US +3626381517,3626381520,GB +3626381521,3626381524,IN +3626381525,3626381528,US +3626381529,3626381532,IT +3626381533,3626381537,US +3626381538,3626381541,CA +3626381542,3626381545,CL +3626381546,3626381549,US +3626381550,3626381553,GB +3626381554,3626381555,US +3626381556,3626381559,RU +3626381560,3626381564,US +3626381565,3626381566,GR +3626381567,3626381573,US +3626381574,3626381577,ID +3626381578,3626381597,US +3626381598,3626381601,VE +3626381602,3626381605,IL +3626381606,3626381609,US +3626381610,3626381613,DE +3626381614,3626381621,US +3626381622,3626381625,FR +3626381626,3626381641,US +3626381642,3626381645,VI +3626381646,3626381649,US +3626381650,3626381653,AU +3626381654,3626381657,US +3626381658,3626381661,BE +3626381662,3626381665,US +3626381666,3626381669,CA +3626381670,3626381675,US +3626381676,3626381679,GB +3626381680,3626381702,US +3626381703,3626381706,LB +3626381707,3626381710,GB +3626381711,3626381715,US +3626381716,3626381719,NL +3626381720,3626381732,US +3626381733,3626381736,EG +3626381737,3626381740,FR +3626381741,3626381742,RU +3626381743,3626381744,US +3626381745,3626381748,IE +3626381749,3626381750,CA +3626381751,3626381752,US +3626381753,3626381755,GB +3626381756,3626381759,CA +3626381760,3626381763,SA +3626381764,3626381767,US +3626381768,3626381771,RU +3626381772,3626381779,US +3626381780,3626381783,AU +3626381784,3626381797,US +3626381798,3626381801,MX +3626381802,3626381803,US +3626381804,3626381816,RU +3626381817,3626381842,US +3626381843,3626381846,CA +3626381847,3626381862,US +3626381863,3626381866,GB +3626381867,3626381874,US +3626381875,3626381882,IN +3626381883,3626381894,US +3626381895,3626381898,CA +3626381899,3626381902,US +3626381903,3626381906,CA +3626381907,3626381920,US +3626381921,3626381924,NL +3626381925,3626381932,US +3626381933,3626381936,MX +3626381937,3626381940,GB +3626381941,3626381944,US +3626381945,3626381948,CA +3626381949,3626381972,US +3626381973,3626381976,GB +3626381977,3626381980,VN +3626381981,3626381984,RU +3626381985,3626381988,US +3626381989,3626381992,LK +3626381993,3626381993,US +3626381994,3626381997,NZ +3626381998,3626382001,SA +3626382002,3626382025,US +3626382026,3626382029,CO +3626382030,3626382033,RO +3626382034,3626382049,US +3626382050,3626382053,JP +3626382054,3626382069,US +3626382070,3626382073,CA +3626382074,3626382074,US +3626382075,3626382078,IN +3626382079,3626382085,US +3626382086,3626382087,GB +3626382088,3626382101,US +3626382102,3626382105,GB +3626382106,3626382109,US +3626382110,3626382113,IN +3626382114,3626382117,CH +3626382118,3626382121,SG +3626382122,3626382133,US +3626382134,3626382137,CA +3626382138,3626382145,US +3626382146,3626382149,CA +3626382150,3626382169,US +3626382170,3626382173,CA +3626382174,3626382177,NZ +3626382178,3626382181,US +3626382182,3626382185,ES +3626382186,3626382193,US +3626382194,3626382197,IN +3626382198,3626382201,US +3626382202,3626382205,GB +3626382206,3626382207,US +3626382208,3626382211,IN +3626382212,3626382223,US +3626382224,3626382227,CN +3626382228,3626382239,US +3626382240,3626382243,NL +3626382244,3626382247,US +3626382248,3626382251,IN +3626382252,3626382263,US +3626382264,3626382267,CA +3626382268,3626382271,IT +3626382272,3626382275,US +3626382276,3626382279,GB +3626382280,3626382283,DK +3626382284,3626382295,US +3626382296,3626382299,AR +3626382300,3626382307,US +3626382308,3626382311,RS +3626382312,3626382315,US +3626382316,3626382319,IN +3626382320,3626382324,US +3626382325,3626382328,CA +3626382329,3626382332,US +3626382333,3626382334,IN +3626382335,3626382353,US +3626382354,3626382357,GB +3626382358,3626382361,RU +3626382362,3626382365,TH +3626382366,3626382378,US +3626382379,3626382383,IN +3626382384,3626382387,US +3626382388,3626382391,SR +3626382392,3626382395,IT +3626382396,3626382399,US +3626382400,3626382403,AU +3626382404,3626382411,US +3626382412,3626382415,CN +3626382416,3626382419,GB +3626382420,3626382426,US +3626382427,3626382430,ID +3626382431,3626382434,US +3626382435,3626382438,BR +3626382439,3626382442,ZA +3626382443,3626382450,US +3626382451,3626382454,GR +3626382455,3626382458,FR +3626382459,3626382470,US +3626382471,3626382474,AU +3626382475,3626382478,US +3626382479,3626382482,JP +3626382483,3626382486,US +3626382487,3626382490,IL +3626382491,3626382494,MY +3626382495,3626382502,GB +3626382503,3626382506,BR +3626382507,3626382518,US +3626382519,3626382522,GR +3626382523,3626382526,SG +3626382527,3626382534,US +3626382535,3626382538,BR +3626382539,3626382546,US +3626382547,3626382550,IN +3626382551,3626382570,US +3626382571,3626382574,IT +3626382575,3626382578,US +3626382579,3626382582,IN +3626382583,3626382586,AU +3626382587,3626382597,US +3626382598,3626382601,IN +3626382602,3626382635,US +3626382636,3626382639,TH +3626382640,3626382670,US +3626382671,3626382674,AU +3626382675,3626382678,US +3626382679,3626382682,UA +3626382683,3626382686,US +3626382687,3626382690,TR +3626382691,3626382694,US +3626382695,3626382698,BR +3626382699,3626382755,US +3626382756,3626382759,GB +3626382760,3626382763,US +3626382764,3626382767,CA +3626382768,3626382771,US +3626382772,3626382775,IN +3626382776,3626382787,US +3626382788,3626382791,IT +3626382792,3626382795,PT +3626382796,3626382815,US +3626382816,3626382819,AU +3626382820,3626382823,CA +3626382824,3626382835,US +3626382836,3626382839,NL +3626382840,3626382843,US +3626382844,3626382845,IN +3626382846,3626382862,US +3626382863,3626382866,RU +3626382867,3626382870,IT +3626382871,3626382878,US +3626382879,3626382882,GB +3626382883,3626382892,US +3626382893,3626382896,BR +3626382897,3626382901,US +3626382902,3626382905,SG +3626382906,3626382909,CA +3626382910,3626382913,IN +3626382914,3626382917,SG +3626382918,3626382925,US +3626382926,3626382930,HN +3626382931,3626382937,US +3626382938,3626382941,PL +3626382942,3626382965,US +3626382966,3626382969,GR +3626382970,3626382973,US +3626382974,3626382977,AU +3626382978,3626382981,IT +3626382982,3626382993,GB +3626382994,3626383026,US +3626383027,3626383030,SG +3626383031,3626383034,CN +3626383035,3626383038,AU +3626383039,3626383042,US +3626383043,3626383046,DE +3626383047,3626383050,US +3626383051,3626383054,CN +3626383055,3626383074,US +3626383075,3626383078,AU +3626383079,3626383082,US +3626383083,3626383086,IN +3626383087,3626383090,GR +3626383091,3626383094,CN +3626383095,3626383127,US +3626383128,3626383131,IN +3626383132,3626383135,US +3626383136,3626383139,CO +3626383140,3626383147,US +3626383148,3626383151,BR +3626383152,3626383200,US +3626383201,3626383204,PE +3626383205,3626383208,AE +3626383209,3626383220,US +3626383221,3626383225,TR +3626383226,3626383229,IN +3626383230,3626383233,US +3626383234,3626383237,IN +3626383238,3626383245,US +3626383246,3626383249,MX +3626383250,3626383257,US +3626383258,3626383261,CO +3626383262,3626383270,US +3626383271,3626383278,GB +3626383279,3626383282,US +3626383283,3626383286,DE +3626383287,3626383290,GR +3626383291,3626383294,CA +3626383295,3626383298,MX +3626383299,3626383375,US +3626383376,3626383383,RU +3626383384,3626383391,CA +3626383392,3626383423,US +3626383424,3626383431,GB +3626383432,3626383439,AU +3626383440,3626383447,GR +3626383448,3626383455,IN +3626383456,3626383503,US +3626383504,3626383519,GB +3626383520,3626383527,US +3626383528,3626383535,GB +3626383536,3626383543,US +3626383544,3626383551,GB +3626383552,3626383583,US +3626383584,3626383599,CA +3626383600,3626383607,GB +3626383608,3626383615,IN +3626383616,3626383647,US +3626383648,3626383679,CH +3626383680,3626383727,US +3626383728,3626383759,CA +3626383760,3626383775,GB +3626383776,3626383871,US +3626383872,3626383903,NL +3626383904,3626384095,US +3626384096,3626384127,NL +3626384128,3626384481,US +3626384482,3626384485,IN +3626384486,3626384901,US +3626384902,3626384905,MX +3626384906,3626384921,US +3626384922,3626384925,IN +3626384926,3626384937,US +3626384938,3626384945,CA +3626384946,3626384949,US +3626384950,3626384953,IN +3626384954,3626384957,US +3626384958,3626384961,GB +3626384962,3626384969,US +3626384970,3626384973,AU +3626384974,3626384977,GB +3626384978,3626384981,SG +3626384982,3626384985,US +3626384986,3626384989,CA +3626384990,3626384993,NZ +3626384994,3626384997,US +3626384998,3626385001,IT +3626385002,3626385005,ID +3626385006,3626385025,US +3626385026,3626385029,CN +3626385030,3626385033,ID +3626385034,3626385037,IN +3626385038,3626385041,US +3626385042,3626385045,MX +3626385046,3626385049,CA +3626385050,3626385073,US +3626385074,3626385077,IE +3626385078,3626385097,US +3626385098,3626385101,IN +3626385102,3626385113,US +3626385114,3626385117,JP +3626385118,3626385125,US +3626385126,3626385129,ID +3626385130,3626385133,GR +3626385134,3626385137,CA +3626385138,3626385141,GB +3626385142,3626385145,IN +3626385146,3626385149,RO +3626385150,3626385179,US +3626385180,3626385183,IT +3626385184,3626385187,US +3626385188,3626385191,CA +3626385192,3626385195,US +3626385196,3626385199,CA +3626385200,3626385207,US +3626385208,3626385209,NZ +3626385210,3626385217,US +3626385218,3626385221,CA +3626385222,3626385225,US +3626385226,3626385229,CA +3626385230,3626385237,US +3626385238,3626385241,BE +3626385242,3626385245,US +3626385246,3626385249,ID +3626385250,3626385253,CN +3626385254,3626385257,US +3626385258,3626385261,PK +3626385262,3626385265,GR +3626385266,3626385321,US +3626385322,3626385325,FR +3626385326,3626385329,CA +3626385330,3626385333,US +3626385334,3626385337,CA +3626385338,3626385349,US +3626385350,3626385353,CA +3626385354,3626385357,MX +3626385358,3626385361,CA +3626385362,3626385365,US +3626385366,3626385369,IL +3626385370,3626385373,US +3626385374,3626385377,SI +3626385378,3626385381,US +3626385382,3626385389,IN +3626385390,3626385393,GB +3626385394,3626508287,US 3626508288,3626512383,CA 3626512384,3626524671,US -3626524672,3626532863,CA -3626532864,3626852351,US +3626524672,3626524927,CA +3626524928,3626524943,US +3626524944,3626524967,CA +3626524968,3626524975,US +3626524976,3626525783,CA +3626525784,3626525799,US +3626525800,3626525807,IN +3626525808,3626526031,CA +3626526032,3626526039,US +3626526040,3626526239,CA +3626526240,3626526247,US +3626526248,3626526255,CA +3626526256,3626526263,US +3626526264,3626526279,CA +3626526280,3626526287,US +3626526288,3626526295,CA +3626526296,3626526303,US +3626526304,3626526431,CA +3626526432,3626526463,CR +3626526464,3626526567,CA +3626526568,3626526575,US +3626526576,3626526623,CA +3626526624,3626526631,US +3626526632,3626526711,CA +3626526712,3626526719,US +3626526720,3626526983,CA +3626526984,3626527023,US +3626527024,3626527135,CA +3626527136,3626527159,US +3626527160,3626527167,CA +3626527168,3626527183,US +3626527184,3626527423,CA +3626527424,3626527463,US +3626527464,3626527471,CA +3626527472,3626527479,US +3626527480,3626527487,CA +3626527488,3626527495,US +3626527496,3626527551,CA +3626527552,3626527559,US +3626527560,3626527903,CA +3626527904,3626527911,US +3626527912,3626528239,CA +3626528240,3626528247,US +3626528248,3626528327,CA +3626528328,3626528335,US +3626528336,3626528535,CA +3626528536,3626528543,US +3626528544,3626528631,CA +3626528632,3626528639,US +3626528640,3626528679,CA +3626528680,3626528703,US +3626528704,3626529183,CA +3626529184,3626529191,US +3626529192,3626529735,CA +3626529736,3626529751,US +3626529752,3626529807,CA +3626529808,3626529863,US +3626529864,3626529919,CA +3626529920,3626529927,US +3626529928,3626530039,CA +3626530040,3626530055,US +3626530056,3626530151,CA +3626530152,3626530159,US +3626530160,3626530207,CA +3626530208,3626530215,US +3626530216,3626530287,CA +3626530288,3626530295,US +3626530296,3626530327,CA +3626530328,3626530343,US +3626530344,3626530391,CA +3626530392,3626530407,US +3626530408,3626530439,CA +3626530440,3626530455,US +3626530456,3626530471,CA +3626530472,3626530479,US +3626530480,3626530487,CA +3626530488,3626530495,US +3626530496,3626530543,CA +3626530544,3626530559,US +3626530560,3626530815,CA +3626530816,3626530831,US +3626530832,3626530911,CA +3626530912,3626530919,US +3626530920,3626530943,CA +3626530944,3626530951,US +3626530952,3626530991,CA +3626530992,3626531007,US +3626531008,3626531015,CA +3626531016,3626531023,US +3626531024,3626531031,CA +3626531032,3626531047,US +3626531048,3626531143,CA +3626531144,3626531151,US +3626531152,3626531199,CA +3626531200,3626531207,US +3626531208,3626531279,CA +3626531280,3626531287,US +3626531288,3626531463,CA +3626531464,3626531471,US +3626531472,3626531519,CA +3626531520,3626531535,US +3626531536,3626531551,CA +3626531552,3626531559,US +3626531560,3626531575,CA +3626531576,3626531583,US +3626531584,3626531607,CA +3626531608,3626531615,US +3626531616,3626531639,CA +3626531640,3626531647,US +3626531648,3626531703,CA +3626531704,3626531711,US +3626531712,3626531799,CA +3626531800,3626531807,US +3626531808,3626531839,CA +3626531840,3626531847,US +3626531848,3626531855,CA +3626531856,3626531863,US +3626531864,3626531871,CA +3626531872,3626531879,US +3626531880,3626531887,CA +3626531888,3626531895,US +3626531896,3626532287,CA +3626532288,3626532311,US +3626532312,3626532319,CA +3626532320,3626532327,US +3626532328,3626532391,CA +3626532392,3626532519,US +3626532520,3626532535,CA +3626532536,3626532543,US +3626532544,3626532551,CA +3626532552,3626532591,US +3626532592,3626532607,CA +3626532608,3626532615,US +3626532616,3626532623,CA +3626532624,3626532703,US +3626532704,3626532727,CA +3626532728,3626532735,US +3626532736,3626532759,CA +3626532760,3626532767,US +3626532768,3626532855,CA +3626532856,3626852351,US 3626852352,3626860543,CA 3626860544,3626893311,US -3626893312,3626905599,CA -3626909696,3626926079,US +3626893312,3626896175,CA +3626896176,3626896183,US +3626896184,3626905599,CA +3626905600,3626926079,US 3626926080,3626934271,CA 3626934272,3627044863,US 3627044864,3627048959,CA 3627048960,3627065343,US 3627065344,3627069439,CA -3627069440,3627387903,US +3627069440,3627288575,US +3627288576,3627288607,GB +3627288608,3627309455,US +3627309456,3627309471,IL +3627309472,3627310471,US +3627310472,3627310479,BM +3627310480,3627317087,US +3627317088,3627317119,GB +3627317120,3627317191,US +3627317192,3627317199,CA +3627317200,3627328055,US +3627328056,3627328063,SR +3627328064,3627330527,US +3627330528,3627330559,SE +3627330560,3627350127,US +3627350128,3627350135,IL +3627350136,3627387903,US 3627387904,3627388415,BR -3627388416,3627400319,US +3627388416,3627399935,US +3627399936,3627399967,GE +3627399968,3627399999,US +3627400000,3627400063,DE +3627400064,3627400151,US +3627400152,3627400191,DE +3627400192,3627400319,US 3627400320,3627400351,BR -3627400352,3627401151,US +3627400352,3627400639,US +3627400640,3627400671,CA +3627400672,3627400959,US +3627400960,3627401103,DE +3627401104,3627401151,US 3627401152,3627401215,BR 3627401216,3627507711,US 3627507712,3627511807,CA -3627511808,3627532287,US +3627511808,3627519616,US +3627519617,3627519626,CA +3627519627,3627522690,US +3627522691,3627522700,GB +3627522701,3627524751,US +3627524752,3627524759,AE +3627524760,3627524979,US +3627524980,3627524987,IR +3627524988,3627525200,US +3627525201,3627525208,AU +3627525209,3627532287,US 3627532288,3627544575,CA 3627544576,3627659263,US 3627659264,3627663359,CA 3627663360,3627665407,US 3627665408,3627665439,CA -3627665440,3627666719,US +3627665440,3627666255,US +3627666256,3627666271,CA +3627666272,3627666719,US 3627666720,3627666751,CA -3627666752,3627679743,US +3627666752,3627667519,US +3627667520,3627667583,CA +3627667584,3627669831,US +3627669832,3627669839,CA +3627669840,3627670799,US +3627670800,3627670811,CA +3627670812,3627679743,US 3627679744,3627712511,CA -3627712512,3627745279,US +3627712512,3627745343,US +3627745344,3627745375,BE +3627745376,3627745439,US +3627745440,3627745471,IN +3627745472,3627745503,CA +3627745504,3627745919,US +3627745920,3627745983,IL +3627745984,3627746399,US +3627746400,3627746431,CA +3627746432,3627746559,US +3627746560,3627746815,IN +3627746816,3627753471,US +3627753472,3627753727,AR +3627753728,3627769855,US 3627778048,3627802623,US 3627802624,3627810815,CA -3627810816,3628123615,US +3627810816,3627842047,US +3627842048,3627842303,IS +3627842304,3627896935,US +3627896936,3627896943,PR +3627896944,3627897279,US +3627897280,3627897287,PR +3627897288,3627897391,US +3627897392,3627897399,PR +3627897400,3627912367,US +3627912368,3627912375,PR +3627912376,3627970103,US +3627970104,3627970111,PR +3627970112,3627970487,US +3627970488,3627970495,PR +3627970496,3627970519,US +3627970520,3627970527,PR +3627970528,3628001399,US +3628001400,3628001407,PR +3628001408,3628005167,US +3628005168,3628005175,PR +3628005176,3628123615,US 3628123616,3628123647,CA 3628123648,3628123711,BM 3628123712,3628123903,US @@ -77948,67 +125756,138 @@ 3628138752,3628139007,GB 3628139008,3628139311,US 3628139312,3628139327,SG -3628139328,3628143615,US +3628139328,3628139343,GB +3628139344,3628139487,US +3628139488,3628139503,NZ +3628139504,3628139519,US +3628139520,3628139535,RU +3628139536,3628139695,US +3628139696,3628139711,VI +3628139712,3628139967,US +3628139968,3628139999,AU +3628140000,3628140351,US +3628140352,3628140415,RU +3628140416,3628143615,US 3628143616,3628143871,GB -3628143872,3628153087,US +3628143872,3628145919,US +3628145920,3628146175,AU +3628146176,3628146527,US +3628146528,3628146559,GB +3628146560,3628148447,US +3628148448,3628148479,SK +3628148480,3628148815,US +3628148816,3628148831,NL +3628148832,3628148847,IT +3628148848,3628148871,US +3628148872,3628148879,CA +3628148880,3628151423,US +3628151424,3628151551,DE +3628151552,3628151871,US +3628151872,3628151935,DO +3628151936,3628152063,ID +3628152064,3628153087,US 3628153088,3628153343,KW 3628153344,3628154239,US 3628154240,3628154303,PH 3628154304,3628154463,US 3628154464,3628154495,GB -3628154496,3628155647,US +3628154496,3628155023,US +3628155024,3628155039,ID +3628155040,3628155103,US +3628155104,3628155119,NZ +3628155120,3628155647,US 3628155648,3628155903,CA -3628155904,3628164479,US -3628164480,3628164607,GB -3628164608,3628179455,US +3628155904,3628156159,US +3628156160,3628156415,GB +3628156416,3628161023,US +3628161024,3628161279,CA +3628161280,3628164927,US +3628164928,3628164943,IE +3628164944,3628164959,ES +3628164960,3628165119,US +3628165120,3628165183,CA +3628165184,3628165311,US +3628165312,3628165375,DO +3628165376,3628165647,US +3628165648,3628165663,VI +3628165664,3628169471,US +3628169472,3628169599,IT +3628169600,3628179455,US +3628179456,3628187647,CA 3628187648,3628208127,US 3628208128,3628208383,IT -3628208384,3628225279,US -3628225280,3628225535,IT -3628225536,3628236799,US +3628208384,3628223983,US +3628223984,3628223999,CA +3628224000,3628224735,US +3628224736,3628224743,IT +3628224744,3628236799,US 3628236800,3628257279,CA -3628257280,3628598271,US +3628257280,3628328559,US +3628328560,3628328567,MY +3628328568,3628332383,US +3628332384,3628332391,IN +3628332392,3628332423,US +3628332424,3628332431,IN +3628332432,3628598271,US 3628598272,3628599295,CO 3628599296,3628603391,CL 3628603392,3628604415,US 3628604416,3628605439,GT 3628605440,3628608511,IL 3628608512,3628609023,VE -3628609024,3628616191,US +3628609024,3628609151,US +3628609152,3628609215,VE +3628609216,3628613375,US +3628613376,3628613631,HN +3628613632,3628614399,ID +3628614400,3628614911,CO +3628614912,3628615167,US +3628615168,3628615679,IL +3628615680,3628616191,US 3628616192,3628617215,PR 3628617216,3628617471,HN 3628617472,3628617727,US 3628617728,3628618239,CO -3628618240,3628618495,US -3628618496,3628619775,HN +3628618240,3628619775,HN 3628619776,3628622847,US 3628622848,3628623871,PR 3628623872,3628625919,NG -3628625920,3628626175,US +3628625920,3628626175,PA 3628626176,3628626943,HN 3628626944,3628627199,CO 3628627200,3628627455,IL 3628627456,3628627711,HN -3628627712,3628627967,US -3628627968,3628628991,SV +3628627712,3628628991,SV 3628628992,3628629247,GT -3628629248,3628629759,US -3628629760,3628631807,VE -3628631808,3628634111,US +3628629248,3628629503,US +3628629504,3628631807,VE +3628631808,3628633855,US +3628633856,3628634111,CO 3628634112,3628636159,AR 3628636160,3628636671,VE -3628636672,3628638207,US +3628636672,3628636927,US +3628636928,3628637183,VE +3628637184,3628637695,CO +3628637696,3628638207,US 3628638208,3628646399,CL 3628646400,3628646911,US 3628646912,3628647423,HN -3628647424,3628647679,US -3628647680,3628649727,CO -3628649728,3628655103,US +3628647424,3628647679,SZ +3628647680,3628648959,CO +3628648960,3628649215,US +3628649216,3628649727,CO +3628649728,3628654079,US +3628654080,3628654591,PA +3628654592,3628654847,US +3628654848,3628655103,CR 3628655104,3628655359,VE -3628655360,3628657407,CO +3628655360,3628656383,CO +3628656384,3628656639,EC +3628656640,3628657407,CO 3628657408,3628657663,US 3628657664,3628657919,VE -3628657920,3628679167,US +3628657920,3628658175,BS +3628658176,3628679167,US 3628679168,3628683263,CA 3628683264,3628762335,US 3628762336,3628762367,IL @@ -78024,9 +125903,13 @@ 3628767696,3628767703,NO 3628767704,3628768223,US 3628768224,3628768239,NO -3628768240,3628770207,US +3628768240,3628769087,US +3628769088,3628769119,AU +3628769120,3628770207,US 3628770208,3628770215,NO -3628770216,3628771455,US +3628770216,3628770367,US +3628770368,3628770383,CY +3628770384,3628771455,US 3628771456,3628771647,GB 3628771648,3628771839,US 3628771840,3628772095,NO @@ -78038,17 +125921,58 @@ 3628843008,3629187071,US 3629187072,3629195263,CA 3629195264,3629199359,US -3629199360,3629203455,CA -3629203456,3629318143,US +3629199360,3629201463,CA +3629201464,3629201467,US +3629201468,3629201487,CA +3629201488,3629201515,US +3629201516,3629201539,CA +3629201540,3629201543,US +3629201544,3629201615,CA +3629201616,3629201619,US +3629201620,3629201647,CA +3629201648,3629201667,US +3629201668,3629201679,CA +3629201680,3629201683,US +3629201684,3629201707,CA +3629201708,3629201719,US +3629201720,3629201747,CA +3629201748,3629201751,US +3629201752,3629201755,CA +3629201756,3629201763,US +3629201764,3629201791,CA +3629201792,3629201839,US +3629201840,3629201855,CA +3629201856,3629201887,US +3629201888,3629201903,CA +3629201904,3629201919,US +3629201920,3629201983,CA +3629201984,3629201991,US +3629201992,3629201999,CA +3629202000,3629202003,US +3629202004,3629202011,CA +3629202012,3629202015,US +3629202016,3629202047,CA +3629202048,3629202175,US +3629202176,3629202207,CA +3629202208,3629202219,US +3629202220,3629202239,CA +3629202240,3629202263,US +3629202264,3629202271,CA +3629202272,3629202279,US +3629202280,3629202287,CA +3629202288,3629202311,US +3629202312,3629202367,CA +3629202368,3629202399,US +3629202400,3629202407,CA +3629202408,3629202427,US +3629202428,3629203199,CA +3629203200,3629318143,US 3629318144,3629326335,CA 3629326336,3629331967,US 3629331968,3629332479,CA -3629332480,3629333503,US -3629333504,3629334527,HK -3629334528,3629539327,US +3629332480,3629539327,US 3629539328,3629547519,CA -3629547520,3629576191,US -3629580288,3629662207,US +3629547520,3629662207,US 3629662208,3629662463,GB 3629662464,3629735943,US 3629735944,3629735951,CA @@ -78058,9 +125982,13 @@ 3629737216,3629737471,CA 3629737472,3629761551,US 3629761552,3629761567,CA -3629761568,3629767935,US +3629761568,3629761647,US +3629761648,3629761663,CA +3629761664,3629767935,US 3629767936,3629768191,CA -3629768192,3629789439,US +3629768192,3629785375,US +3629785376,3629785407,CA +3629785408,3629789439,US 3629789440,3629789695,CA 3629789696,3629789951,US 3629789952,3629790207,CA @@ -78070,7 +125998,9 @@ 3629838552,3629838559,CA 3629838560,3629838583,US 3629838584,3629838591,CA -3629838592,3629841951,US +3629838592,3629839103,US +3629839104,3629839359,CA +3629839360,3629841951,US 3629841952,3629841983,CA 3629841984,3629859551,US 3629859552,3629859583,CA @@ -78078,215 +126008,516 @@ 3629875776,3629875807,CA 3629875808,3629876255,US 3629876256,3629876263,CA -3629876264,3630039039,US -3630039040,3630039295,CA -3630039296,3630040063,US -3630040064,3630040319,CA -3630040320,3630040575,US -3630040576,3630040831,CA -3630040832,3630041343,US -3630041344,3630041599,CA -3630041600,3630041863,US -3630041864,3630041871,CA -3630041872,3630041911,US -3630041912,3630041919,CA -3630041920,3630042095,US -3630042096,3630042103,CA -3630042104,3630042391,US -3630042392,3630042399,CA -3630042400,3630042463,US -3630042464,3630042471,CA -3630042472,3630042479,US -3630042480,3630042487,CA -3630042488,3630042599,US -3630042600,3630042607,CA -3630042608,3630044927,US -3630044928,3630045183,CA -3630045184,3630045695,US -3630045696,3630046207,CA -3630046208,3630046591,US -3630046592,3630047231,CA -3630047232,3630048767,US -3630048768,3630049023,CA -3630049024,3630049279,US -3630049280,3630049535,CA -3630049536,3630050479,US -3630050480,3630050487,CA -3630050488,3630050527,US -3630050528,3630050535,CA -3630050536,3630050559,US -3630050560,3630050815,CA -3630050816,3630051839,US -3630051840,3630052351,CA -3630052352,3630054655,US -3630054656,3630055167,CA -3630055168,3630055615,US -3630055616,3630055647,CA -3630055648,3630055935,US +3629876264,3629876279,US +3629876280,3629876287,CA +3629876288,3630035215,US +3630035216,3630035231,UG +3630035232,3630039039,US +3630039040,3630039359,CA +3630039360,3630039391,US +3630039392,3630039455,CA +3630039456,3630039487,US +3630039488,3630039551,CA +3630039552,3630039583,US +3630039584,3630039599,CA +3630039600,3630039631,US +3630039632,3630039807,CA +3630039808,3630039815,US +3630039816,3630039823,CA +3630039824,3630039831,US +3630039832,3630039839,CA +3630039840,3630040063,US +3630040064,3630040335,CA +3630040336,3630040351,US +3630040352,3630040383,CA +3630040384,3630040399,US +3630040400,3630040415,CA +3630040416,3630040431,US +3630040432,3630040447,CA +3630040448,3630040463,US +3630040464,3630040479,CA +3630040480,3630040495,US +3630040496,3630040527,CA +3630040528,3630040543,US +3630040544,3630040831,CA +3630040832,3630040895,US +3630040896,3630041023,CA +3630041024,3630041087,US +3630041088,3630041215,CA +3630041216,3630041279,US +3630041280,3630041903,CA +3630041904,3630041911,US +3630041912,3630041927,CA +3630041928,3630041935,US +3630041936,3630042015,CA +3630042016,3630042023,US +3630042024,3630042399,CA +3630042400,3630042407,US +3630042408,3630042431,CA +3630042432,3630042439,US +3630042440,3630042655,CA +3630042656,3630042687,US +3630042688,3630042751,CA +3630042752,3630042783,US +3630042784,3630042847,CA +3630042848,3630042975,US +3630042976,3630043007,CA +3630043008,3630043039,US +3630043040,3630043103,CA +3630043104,3630043135,US +3630043136,3630043391,CA +3630043392,3630043903,US +3630043904,3630043919,CA +3630043920,3630043935,US +3630043936,3630043967,CA +3630043968,3630043983,US +3630043984,3630043999,CA +3630044000,3630044015,US +3630044016,3630044063,CA +3630044064,3630044079,US +3630044080,3630044287,CA +3630044288,3630044351,US +3630044352,3630044415,CA +3630044416,3630044671,US +3630044672,3630046367,CA +3630046368,3630046399,US +3630046400,3630047791,CA +3630047792,3630047807,US +3630047808,3630049791,CA +3630049792,3630050047,US +3630050048,3630050391,CA +3630050392,3630050399,US +3630050400,3630050487,CA +3630050488,3630050495,US +3630050496,3630050543,CA +3630050544,3630050559,US +3630050560,3630050847,CA +3630050848,3630050879,US +3630050880,3630051135,CA +3630051136,3630051327,US +3630051328,3630051583,CA +3630051584,3630051599,US +3630051600,3630051959,CA +3630051960,3630052019,US +3630052020,3630052863,CA +3630052864,3630052927,US +3630052928,3630053183,CA +3630053184,3630053247,US +3630053248,3630053631,CA +3630053632,3630053695,IL +3630053696,3630053759,CA +3630053760,3630053887,US +3630053888,3630054239,CA +3630054240,3630054335,US +3630054336,3630054495,CA +3630054496,3630054511,US +3630054512,3630055519,CA +3630055520,3630055551,US +3630055552,3630055679,CA +3630055680,3630055935,US 3630055936,3630056959,CA -3630056960,3630060223,US -3630060224,3630060287,CA -3630060288,3630062847,US -3630062848,3630063103,CA -3630063104,3630066175,US -3630066176,3630066431,CA -3630066432,3630066687,US -3630066688,3630067967,CA -3630067968,3630069503,US -3630069504,3630069759,CA -3630069760,3630070783,US -3630070784,3630071039,CA -3630071040,3630073087,US -3630073088,3630073343,CA -3630073344,3630073599,US -3630073600,3630073855,CA -3630073856,3630074543,US -3630074544,3630074551,CA -3630074552,3630074607,US -3630074608,3630074615,CA -3630074616,3630074815,US -3630074816,3630074879,CA -3630074880,3630075391,US +3630056960,3630056975,US +3630056976,3630057039,CA +3630057040,3630057055,US +3630057056,3630057087,CA +3630057088,3630057103,US +3630057104,3630057151,CA +3630057152,3630057167,US +3630057168,3630057183,CA +3630057184,3630057199,US +3630057200,3630057471,CA +3630057472,3630057727,US +3630057728,3630057983,CA +3630057984,3630058047,US +3630058048,3630058335,CA +3630058336,3630058367,US +3630058368,3630058495,CA +3630058496,3630058751,US +3630058752,3630059007,CA +3630059008,3630059263,US +3630059264,3630059775,CA +3630059776,3630060031,US +3630060032,3630060351,CA +3630060352,3630060383,US +3630060384,3630060543,CA +3630060544,3630060671,US +3630060672,3630060799,CA +3630060800,3630060815,US +3630060816,3630060823,CA +3630060824,3630060831,US +3630060832,3630060847,CA +3630060848,3630060855,US +3630060856,3630060895,CA +3630060896,3630060903,US +3630060904,3630060935,CA +3630060936,3630060943,US +3630060944,3630060959,CA +3630060960,3630060975,US +3630060976,3630060983,CA +3630060984,3630060991,US +3630060992,3630060999,CA +3630061000,3630061015,US +3630061016,3630061031,CA +3630061032,3630061039,US +3630061040,3630061047,CA +3630061048,3630061311,US +3630061312,3630061359,CA +3630061360,3630061375,US +3630061376,3630062591,CA +3630062592,3630062847,US +3630062848,3630063903,CA +3630063904,3630063919,US +3630063920,3630063951,CA +3630063952,3630063983,US +3630063984,3630063999,CA +3630064000,3630064015,US +3630064016,3630064191,CA +3630064192,3630064255,US +3630064256,3630064383,CA +3630064384,3630064511,US +3630064512,3630065199,CA +3630065200,3630065215,US +3630065216,3630065327,CA +3630065328,3630065343,US +3630065344,3630065359,CA +3630065360,3630065391,US +3630065392,3630065727,CA +3630065728,3630065791,US +3630065792,3630065919,CA +3630065920,3630066175,CN +3630066176,3630067983,CA +3630067984,3630067999,US +3630068000,3630068015,CA +3630068016,3630068031,US +3630068032,3630068223,CA +3630068224,3630068479,US +3630068480,3630068863,CA +3630068864,3630068991,CN +3630068992,3630069247,CA +3630069248,3630069503,US +3630069504,3630071247,CA +3630071248,3630071263,US +3630071264,3630071551,CA +3630071552,3630071807,US +3630071808,3630071871,CA +3630071872,3630072063,US +3630072064,3630074159,CA +3630074160,3630074191,US +3630074192,3630074255,CA +3630074256,3630074287,US +3630074288,3630074335,CA +3630074336,3630074367,US +3630074368,3630074375,CA +3630074376,3630074383,US +3630074384,3630074415,CA +3630074416,3630074431,US +3630074432,3630074471,CA +3630074472,3630074495,US +3630074496,3630074527,CA +3630074528,3630074543,US +3630074544,3630075183,CA +3630075184,3630075199,US +3630075200,3630075375,CA +3630075376,3630075391,US 3630075392,3630075647,CA -3630075648,3630077183,US -3630077184,3630077439,CA -3630077440,3630077951,US -3630077952,3630078015,CA -3630078016,3630078463,US -3630078464,3630078719,CA -3630078720,3630080511,US -3630080512,3630080575,CA -3630080576,3630081279,US -3630081280,3630081535,CA -3630081536,3630082047,US -3630082048,3630082303,CA -3630082304,3630085119,US +3630075648,3630076223,US +3630076224,3630076287,CA +3630076288,3630076351,US +3630076352,3630076415,CA +3630076416,3630076671,US +3630076672,3630076831,CA +3630076832,3630076863,US +3630076864,3630077823,CA +3630077824,3630077887,US +3630077888,3630078847,CA +3630078848,3630078879,US +3630078880,3630079263,CA +3630079264,3630079279,US +3630079280,3630079439,CA +3630079440,3630079455,AG +3630079456,3630079487,CA +3630079488,3630080511,US +3630080512,3630080895,CA +3630080896,3630081023,US +3630081024,3630081791,CA +3630081792,3630082047,US +3630082048,3630083071,CA +3630083072,3630083103,CH +3630083104,3630083327,CA +3630083328,3630083391,US +3630083392,3630083519,CA +3630083520,3630083583,US +3630083584,3630083727,CA +3630083728,3630083743,US +3630083744,3630083839,CA +3630083840,3630084159,US +3630084160,3630084351,CA +3630084352,3630084607,US +3630084608,3630084863,CA +3630084864,3630085119,US 3630085120,3630085375,CA -3630085376,3630088703,US -3630088704,3630088959,CA +3630085376,3630085631,US +3630085632,3630086143,CA +3630086144,3630086287,US +3630086288,3630086295,CA +3630086296,3630086319,US +3630086320,3630086399,CA +3630086400,3630086655,US +3630086656,3630086847,CA +3630086848,3630086911,US +3630086912,3630087935,CA +3630087936,3630088447,US +3630088448,3630088959,CA 3630088960,3630089471,US -3630089472,3630090239,CA -3630090240,3630091263,US -3630091264,3630091519,CA -3630091520,3630092031,US -3630092032,3630092287,CA -3630092288,3630093439,US -3630093440,3630093447,CA -3630093448,3630093527,US -3630093528,3630093535,CA -3630093536,3630094591,US -3630094592,3630094847,CA -3630094848,3630095015,US -3630095016,3630095023,CA -3630095024,3630095039,US +3630089472,3630090271,CA +3630090272,3630090287,US +3630090288,3630090319,CA +3630090320,3630090335,US +3630090336,3630090751,CA +3630090752,3630091007,US +3630091008,3630092335,CA +3630092336,3630092351,US +3630092352,3630092527,CA +3630092528,3630092543,US +3630092544,3630092575,CA +3630092576,3630092799,US +3630092800,3630092975,CA +3630092976,3630092991,US +3630092992,3630093310,CA +3630093311,3630093319,US +3630093320,3630093367,CA +3630093368,3630093375,US +3630093376,3630093495,CA +3630093496,3630093503,US +3630093504,3630093823,CA +3630093824,3630094079,US +3630094080,3630094335,CA +3630094336,3630094367,US +3630094368,3630094495,CA +3630094496,3630094559,US +3630094560,3630094847,CA +3630094848,3630094855,US +3630094856,3630094863,CA +3630094864,3630094871,US +3630094872,3630094879,CA +3630094880,3630094887,US +3630094888,3630094903,CA +3630094904,3630094919,US +3630094920,3630094935,CA +3630094936,3630094943,US +3630094944,3630094999,CA +3630095000,3630095015,US +3630095016,3630095031,CA +3630095032,3630095039,US 3630095040,3630095047,CA -3630095048,3630097663,US +3630095048,3630095055,US +3630095056,3630095103,CA +3630095104,3630095359,US +3630095360,3630095487,CA +3630095488,3630095743,US +3630095744,3630096943,CA +3630096944,3630097151,US +3630097152,3630097663,CA 3630097664,3630098175,KW -3630098176,3630098687,US -3630098688,3630100223,CA +3630098176,3630098495,CA +3630098496,3630098527,US +3630098528,3630100223,CA 3630100224,3630100479,KW -3630100480,3630102783,US -3630102784,3630103807,CA -3630103808,3630141503,US -3630141504,3630141567,CA -3630141568,3630142463,US -3630142464,3630143231,CA -3630143232,3630143615,US -3630143616,3630143647,CA -3630143648,3630143711,US -3630143712,3630143743,CA -3630143744,3630144511,US -3630144512,3630145023,CA -3630145024,3630145535,US -3630145536,3630145791,CA -3630145792,3630146047,US -3630146048,3630146815,CA -3630146816,3630147327,US -3630147328,3630147583,CA -3630147584,3630149535,US -3630149536,3630149567,CA -3630149568,3630149631,US -3630149632,3630149887,CA -3630149888,3630150911,US -3630150912,3630151167,CA -3630151168,3630151455,US -3630151456,3630151487,CA -3630151488,3630151615,US -3630151616,3630151647,CA -3630151648,3630151679,US -3630151680,3630152191,CA -3630152192,3630152447,US -3630152448,3630152703,CA -3630152704,3630156031,US -3630156032,3630156287,CA -3630156288,3630156543,US -3630156544,3630156799,CA -3630156800,3630157055,US -3630157056,3630157311,CA -3630157312,3630157567,US -3630157568,3630158087,CA -3630158088,3630158231,US -3630158232,3630158239,CA -3630158240,3630158303,US -3630158304,3630158311,CA -3630158312,3630159007,US -3630159008,3630159071,CA -3630159072,3630159103,US -3630159104,3630159359,CA -3630159360,3630160487,US +3630100480,3630100863,CA +3630100864,3630101247,US +3630101248,3630101823,CA +3630101824,3630101855,US +3630101856,3630101887,CA +3630101888,3630101919,US +3630101920,3630102015,CA +3630102016,3630102335,US +3630102336,3630103999,CA +3630104000,3630104063,US +3630104064,3630104575,CA +3630104576,3630106015,US +3630106016,3630106031,CA +3630106032,3630106063,US +3630106064,3630106079,CA +3630106080,3630141439,US +3630141440,3630141759,CA +3630141760,3630141791,US +3630141792,3630141887,CA +3630141888,3630141951,US +3630141952,3630144031,CA +3630144032,3630144063,US +3630144064,3630144223,CA +3630144224,3630144255,US +3630144256,3630145023,CA +3630145024,3630145039,GB +3630145040,3630145247,CA +3630145248,3630145535,US +3630145536,3630147647,CA +3630147648,3630147711,US +3630147712,3630147775,CA +3630147776,3630147839,US +3630147840,3630147903,CA +3630147904,3630147935,US +3630147936,3630147999,CA +3630148000,3630148031,US +3630148032,3630148623,CA +3630148624,3630148639,US +3630148640,3630148655,CA +3630148656,3630148671,US +3630148672,3630148815,CA +3630148816,3630148863,US +3630148864,3630149151,CA +3630149152,3630149183,US +3630149184,3630149215,CA +3630149216,3630149375,US +3630149376,3630149439,CA +3630149440,3630149471,US +3630149472,3630149503,CA +3630149504,3630149535,US +3630149536,3630151487,CA +3630151488,3630151519,US +3630151520,3630153119,CA +3630153120,3630153151,US +3630153152,3630153407,CA +3630153408,3630153727,US +3630153728,3630154751,CA +3630154752,3630155007,US +3630155008,3630155263,CA +3630155264,3630155519,US +3630155520,3630155583,CA +3630155584,3630155599,US +3630155600,3630155615,CA +3630155616,3630155631,US +3630155632,3630158135,CA +3630158136,3630158143,US +3630158144,3630158159,CA +3630158160,3630158167,US +3630158168,3630158175,CA +3630158176,3630158183,US +3630158184,3630158271,CA +3630158272,3630158279,US +3630158280,3630158591,CA +3630158592,3630158847,US +3630158848,3630158975,CA +3630158976,3630159007,US +3630159008,3630159487,CA +3630159488,3630159551,US +3630159552,3630159871,CA +3630159872,3630160127,US +3630160128,3630160383,CA +3630160384,3630160399,US +3630160400,3630160471,CA +3630160472,3630160487,US 3630160488,3630160495,CA -3630160496,3630160591,US -3630160592,3630160599,CA +3630160496,3630160503,US +3630160504,3630160527,CA +3630160528,3630160559,US +3630160560,3630160599,CA 3630160600,3630160607,US 3630160608,3630160895,CA -3630160896,3630161151,US -3630161152,3630161919,CA -3630161920,3630162687,US -3630162688,3630162943,CA -3630162944,3630163887,US -3630163888,3630163895,CA -3630163896,3630164223,US -3630164224,3630164735,CA -3630164736,3630164783,US -3630164784,3630164799,CA -3630164800,3630164815,US -3630164816,3630164831,CA -3630164832,3630165247,US -3630165248,3630165759,CA -3630165760,3630166015,US -3630166016,3630166527,CA -3630166528,3630166687,US -3630166688,3630166719,CA -3630166720,3630167583,US -3630167584,3630167615,CA -3630167616,3630167711,US -3630167712,3630167743,CA -3630167744,3630167807,US -3630167808,3630167823,CA -3630167824,3630167903,US -3630167904,3630167911,CA -3630167912,3630168319,US -3630168320,3630169087,CA -3630169088,3630292991,US -3630297088,3630309375,US +3630160896,3630160919,US +3630160920,3630160927,CA +3630160928,3630161111,US +3630161112,3630161135,CA +3630161136,3630161151,US +3630161152,3630161983,CA +3630161984,3630162047,US +3630162048,3630162303,CA +3630162304,3630162367,US +3630162368,3630163455,CA +3630163456,3630163711,US +3630163712,3630163719,CA +3630163720,3630163727,US +3630163728,3630163759,CA +3630163760,3630163767,US +3630163768,3630163927,CA +3630163928,3630163959,US +3630163960,3630164735,CA +3630164736,3630164751,US +3630164752,3630164847,CA +3630164848,3630164863,US +3630164864,3630164911,CA +3630164912,3630164927,US +3630164928,3630164975,CA +3630164976,3630164991,US +3630164992,3630166719,CA +3630166720,3630166751,US +3630166752,3630166815,CA +3630166816,3630166831,US +3630166832,3630166863,CA +3630166864,3630166879,US +3630166880,3630166975,CA +3630166976,3630166991,US +3630166992,3630167295,CA +3630167296,3630167359,US +3630167360,3630167487,CA +3630167488,3630167551,US +3630167552,3630167911,CA +3630167912,3630167919,FR +3630167920,3630167927,CA +3630167928,3630167943,US +3630167944,3630168127,CA +3630168128,3630168191,US +3630168192,3630169087,CA +3630169088,3630169343,US +3630169344,3630169407,CA +3630169408,3630169471,US +3630169472,3630170111,CA +3630170112,3630301695,US +3630301696,3630301711,RU +3630301712,3630309375,US 3630309376,3630317567,CA -3630317568,3630370815,US -3630372864,3630374911,US +3630317568,3630330287,US +3630330288,3630330303,JP +3630330304,3630374911,US 3630374912,3630383103,CA 3630383104,3630391295,US 3630391296,3630395391,CA -3630395392,3630407679,US -3630411776,3630718975,US +3630395392,3630718975,US 3630718976,3630727167,CA 3630727168,3630746879,US 3630746880,3630747391,TZ 3630747392,3630780415,US 3630780416,3630784511,CA -3630784512,3630850047,US +3630784512,3630784895,US +3630784896,3630784911,IL +3630784912,3630787568,US +3630787569,3630787576,IE +3630787577,3630850047,US 3630850048,3630854143,CA 3630854144,3630956543,US 3630956544,3631005695,CA -3631005696,3631039439,US +3631005696,3631013925,US +3631013926,3631013941,GB +3631013942,3631013963,US +3631013964,3631013979,MX +3631013980,3631014021,US +3631014022,3631014053,BR +3631014054,3631014915,US +3631014916,3631015011,HU +3631015012,3631015075,US +3631015076,3631015111,HU +3631015112,3631015139,US +3631015140,3631015147,CN +3631015148,3631015253,US +3631015254,3631015269,CA +3631015270,3631015295,US +3631015296,3631015311,CN +3631015312,3631016243,US +3631016244,3631016257,BD +3631016258,3631016555,US +3631016556,3631016571,CN +3631016572,3631016581,US +3631016582,3631016613,BD +3631016614,3631016645,UA +3631016646,3631016707,US +3631016708,3631016958,LT +3631016959,3631017175,US +3631017176,3631017191,CN +3631017192,3631017475,US +3631017476,3631017726,LT +3631017727,3631017731,US +3631017732,3631017982,LT +3631017983,3631039439,US 3631039440,3631039455,CA 3631039456,3631039487,US 3631039488,3631039743,CA @@ -78298,7 +126529,17 @@ 3631045632,3631045759,CA 3631045760,3631045983,US 3631045984,3631045991,CA -3631045992,3631112191,US +3631045992,3631057577,US +3631057578,3631057597,GB +3631057598,3631058405,US +3631058406,3631058415,CA +3631058416,3631058511,US +3631058512,3631058521,CA +3631058522,3631058581,US +3631058582,3631058591,CA +3631058592,3631059229,US +3631059230,3631059239,NO +3631059240,3631112191,US 3631112192,3631112703,VC 3631112704,3631116543,BB 3631116544,3631117567,GD @@ -78315,19 +126556,58 @@ 3631333376,3631333679,CA 3631333680,3631333695,US 3631333696,3631341567,CA -3631341568,3631480831,US +3631341568,3631435007,US +3631435008,3631435263,GB +3631435264,3631480831,US 3631480832,3631484927,CA -3631484928,3631497215,US -3631501312,3631644671,US -3631644672,3631648767,CA +3631484928,3631644671,US +3631644672,3631652863,CA 3631652864,3631663151,US 3631663152,3631663159,CA 3631663160,3631665151,US 3631665152,3631669247,CA -3631669248,3631710207,US -3631722496,3631841279,US +3631669248,3631669759,US +3631669760,3631669767,A2 +3631669768,3631669775,US +3631669776,3631669783,BO +3631669784,3631669791,US +3631669792,3631669799,BO +3631669800,3631669807,US +3631669808,3631669823,EC +3631669824,3631669839,BO +3631669840,3631669855,A2 +3631669856,3631669871,US +3631669872,3631669887,A2 +3631669888,3631669919,BO +3631669920,3631669951,EC +3631669952,3631670015,US +3631670016,3631670143,CO +3631670144,3631670207,NI +3631670208,3631670271,A2 +3631670272,3631670527,US +3631670528,3631670783,NG +3631670784,3631671039,EC +3631671040,3631671295,US +3631671296,3631671551,JM +3631671552,3631672575,PY +3631672576,3631672831,NG +3631672832,3631673119,US +3631673120,3631673151,A2 +3631673152,3631673183,US +3631673184,3631673199,A2 +3631673200,3631673231,US +3631673232,3631673247,EC +3631673248,3631673263,JM +3631673264,3631673295,BB +3631673296,3631673311,EC +3631673312,3631677439,A2 +3631677440,3631841279,US 3631841280,3631874047,CA -3631874048,3631939583,US +3631874048,3631879199,US +3631879200,3631879231,CA +3631879232,3631881759,US +3631881760,3631881791,CA +3631881792,3631939583,US 3631939584,3632005119,CA 3632005120,3632136191,US 3632136192,3632144383,CA @@ -78335,8 +126615,23 @@ 3632152576,3632168959,CA 3632168960,3632197631,US 3632197632,3632201727,CA -3632201728,3632242687,US -3632250880,3632332799,US +3632201728,3632244223,US +3632244224,3632244479,CA +3632244480,3632270025,US +3632270026,3632270058,CA +3632270059,3632273645,US +3632273646,3632273657,AU +3632273658,3632284879,US +3632284880,3632284895,CA +3632284896,3632286479,US +3632286480,3632286495,CA +3632286496,3632287239,US +3632287240,3632287263,CA +3632287264,3632289583,US +3632289584,3632289599,PH +3632289600,3632291775,US +3632291776,3632291839,GB +3632291840,3632332799,US 3632332800,3632357375,CA 3632357376,3632370559,US 3632370560,3632370575,NG @@ -78344,14 +126639,444 @@ 3632373504,3632373759,NG 3632373760,3632381951,US 3632381952,3632390143,CA -3632390144,3632410623,US +3632390144,3632414719,US 3632414720,3632422911,CA -3632422912,3632447487,US -3632452352,3632452607,US -3632455680,3632710191,US -3632710192,3632710207,CA -3632710208,3632754687,US -3632758784,3632826495,US +3632422912,3632451583,US +3632451584,3632455679,CA +3632455680,3632480319,US +3632480320,3632480335,GB +3632480336,3632480367,US +3632480368,3632480383,GB +3632480384,3632480391,DK +3632480392,3632480415,US +3632480416,3632480423,NL +3632480424,3632480431,RU +3632480432,3632480439,US +3632480440,3632480447,VE +3632480448,3632480463,US +3632480464,3632480471,GB +3632480472,3632480487,US +3632480488,3632480495,FR +3632480496,3632480503,US +3632480504,3632480511,RU +3632480512,3632480543,TK +3632480544,3632480567,US +3632480568,3632480575,GB +3632480576,3632480599,US +3632480600,3632480607,CA +3632480608,3632480615,GB +3632480616,3632480647,US +3632480648,3632480655,CA +3632480656,3632480671,GB +3632480672,3632480703,US +3632480704,3632480767,CA +3632480768,3632481023,US +3632481024,3632481087,IO +3632481088,3632481183,US +3632481184,3632481199,TH +3632481200,3632481279,US +3632481280,3632481287,GB +3632481288,3632481295,PH +3632481296,3632481311,TH +3632481312,3632481391,US +3632481392,3632481399,GB +3632481400,3632481415,US +3632481416,3632481423,TH +3632481424,3632481431,US +3632481432,3632481439,CA +3632481440,3632481463,US +3632481464,3632481471,CH +3632481472,3632481479,US +3632481480,3632481487,CA +3632481488,3632481511,US +3632481512,3632481519,GB +3632481520,3632481527,US +3632481528,3632481535,PL +3632481536,3632481631,US +3632481632,3632481647,GB +3632481648,3632481751,US +3632481752,3632481759,GB +3632481760,3632481767,KW +3632481768,3632481775,US +3632481776,3632481783,CA +3632481784,3632481791,GB +3632481792,3632481815,US +3632481816,3632481823,GB +3632481824,3632481999,US +3632482000,3632482007,BZ +3632482008,3632482039,US +3632482040,3632482047,TK +3632482048,3632482239,US +3632482240,3632482247,GB +3632482248,3632482399,US +3632482400,3632482431,TH +3632482432,3632483071,US +3632483072,3632483087,GB +3632483088,3632483127,US +3632483128,3632483135,AU +3632483136,3632483151,US +3632483152,3632483159,GB +3632483160,3632483327,US +3632483328,3632483335,CA +3632483336,3632483351,US +3632483352,3632483359,CN +3632483360,3632483367,NL +3632483368,3632483375,GI +3632483376,3632483391,GB +3632483392,3632483407,US +3632483408,3632483415,CA +3632483416,3632483423,US +3632483424,3632483455,SK +3632483456,3632483471,HK +3632483472,3632483551,US +3632483552,3632483583,GB +3632483584,3632483599,US +3632483600,3632483607,AU +3632483608,3632483615,PL +3632483616,3632483623,GB +3632483624,3632483663,US +3632483664,3632483671,PH +3632483672,3632483679,CA +3632483680,3632483759,US +3632483760,3632483775,TH +3632483776,3632483815,US +3632483816,3632483823,GB +3632483824,3632483831,DE +3632483832,3632483887,US +3632483888,3632483895,TR +3632483896,3632483903,CA +3632483904,3632483919,AU +3632483920,3632483935,TW +3632483936,3632483951,US +3632483952,3632483959,NL +3632483960,3632483967,US +3632483968,3632483983,SR +3632483984,3632483991,GI +3632483992,3632483999,GB +3632484000,3632484063,US +3632484064,3632484079,CA +3632484080,3632484087,GB +3632484088,3632484383,US +3632484384,3632484391,GB +3632484392,3632484623,US +3632484624,3632484639,GB +3632484640,3632484647,CA +3632484648,3632484655,TH +3632484656,3632484687,US +3632484688,3632484695,GI +3632484696,3632484727,US +3632484728,3632484735,HK +3632484736,3632484743,IL +3632484744,3632484751,CA +3632484752,3632484767,US +3632484768,3632484783,CA +3632484784,3632484791,US +3632484792,3632484799,BZ +3632484800,3632484807,US +3632484808,3632484815,FR +3632484816,3632484823,US +3632484824,3632484831,CA +3632484832,3632484839,HK +3632484840,3632484847,BZ +3632484848,3632484855,US +3632484856,3632484863,GB +3632484864,3632485055,US +3632485056,3632485087,TW +3632485088,3632485103,US +3632485104,3632485111,GB +3632485112,3632485119,US +3632485120,3632485135,GB +3632485136,3632485143,TH +3632485144,3632485151,NC +3632485152,3632485167,CA +3632485168,3632485175,US +3632485176,3632485183,CH +3632485184,3632485263,US +3632485264,3632485271,IT +3632485272,3632485279,US +3632485280,3632485311,TH +3632485312,3632485359,US +3632485360,3632485367,TH +3632485368,3632485391,US +3632485392,3632485399,SR +3632485400,3632485431,US +3632485432,3632485439,CA +3632485440,3632485471,US +3632485472,3632485487,NC +3632485488,3632485551,US +3632485552,3632485559,GB +3632485560,3632485567,US +3632485568,3632485575,GB +3632485576,3632485615,US +3632485616,3632485623,TH +3632485624,3632485631,CA +3632485632,3632485639,US +3632485640,3632485647,NC +3632485648,3632485655,US +3632485656,3632485663,GR +3632485664,3632485671,GB +3632485672,3632485679,TK +3632485680,3632485687,BR +3632485688,3632485727,US +3632485728,3632485735,CA +3632485736,3632485743,KW +3632485744,3632485751,US +3632485752,3632485759,CA +3632485760,3632485767,CZ +3632485768,3632485775,KW +3632485776,3632485847,US +3632485848,3632485855,CA +3632485856,3632485863,US +3632485864,3632485871,BZ +3632485872,3632485887,US +3632485888,3632485895,GB +3632485896,3632485903,KW +3632485904,3632486087,US +3632486088,3632486095,DE +3632486096,3632486103,US +3632486104,3632486111,BZ +3632486112,3632486143,US +3632486144,3632486151,TK +3632486152,3632486159,GB +3632486160,3632486263,US +3632486264,3632486271,GB +3632486272,3632486287,FR +3632486288,3632486319,US +3632486320,3632486327,GB +3632486328,3632486335,US +3632486336,3632486343,GB +3632486344,3632486351,FR +3632486352,3632486407,US +3632486408,3632486415,TH +3632486416,3632486423,US +3632486424,3632486431,CA +3632486432,3632486479,US +3632486480,3632486495,GB +3632486496,3632486519,US +3632486520,3632486527,GB +3632486528,3632486543,US +3632486544,3632486551,DE +3632486552,3632486567,US +3632486568,3632486575,IL +3632486576,3632486583,TH +3632486584,3632486687,US +3632486688,3632486703,HK +3632486704,3632486711,US +3632486712,3632486719,CA +3632486720,3632486751,TH +3632486752,3632486759,NL +3632486760,3632486783,US +3632486784,3632486815,DE +3632486816,3632486879,US +3632486880,3632486895,TH +3632486896,3632486903,GB +3632486904,3632487023,US +3632487024,3632487031,TH +3632487032,3632487039,CZ +3632487040,3632487103,US +3632487104,3632487135,EE +3632487136,3632487143,GB +3632487144,3632487423,US +3632487424,3632487455,GB +3632487456,3632487783,US +3632487784,3632487791,CA +3632487792,3632487807,US +3632487808,3632487815,BZ +3632487816,3632487823,IL +3632487824,3632487855,US +3632487856,3632487863,GB +3632487864,3632487871,CA +3632487872,3632489087,US +3632489088,3632489119,SR +3632489120,3632489127,US +3632489128,3632489135,AU +3632489136,3632489143,US +3632489144,3632489151,GB +3632489152,3632489887,US +3632489888,3632489895,TK +3632489896,3632489903,US +3632489904,3632489911,NL +3632489912,3632489919,US +3632489920,3632489943,GB +3632489944,3632490535,US +3632490536,3632490543,CA +3632490544,3632490551,TH +3632490552,3632490559,US +3632490560,3632490623,DE +3632490624,3632490687,US +3632490688,3632490695,BZ +3632490696,3632490703,US +3632490704,3632490719,TH +3632490720,3632490751,US +3632490752,3632490783,GB +3632490784,3632490815,IN +3632490816,3632490823,TH +3632490824,3632490831,US +3632490832,3632490839,MO +3632490840,3632490847,US +3632490848,3632490879,RU +3632490880,3632490887,GB +3632490888,3632490895,GR +3632490896,3632490935,US +3632490936,3632490943,CA +3632490944,3632490959,US +3632490960,3632490967,CA +3632490968,3632490983,US +3632490984,3632490991,HK +3632490992,3632491071,US +3632491072,3632491087,GB +3632491088,3632491151,US +3632491152,3632491167,IN +3632491168,3632491231,US +3632491232,3632491239,CA +3632491240,3632491263,US +3632491264,3632491327,DM +3632491328,3632491343,FR +3632491344,3632491359,BR +3632491360,3632491391,IN +3632491392,3632491471,US +3632491472,3632491487,TH +3632491488,3632491503,ZA +3632491504,3632491519,US +3632491520,3632491527,GB +3632491528,3632491535,US +3632491536,3632491543,GB +3632491544,3632491583,US +3632491584,3632491591,TH +3632491592,3632491599,US +3632491600,3632491607,TH +3632491608,3632491639,US +3632491640,3632491647,CA +3632491648,3632491807,US +3632491808,3632491823,TW +3632491824,3632491967,US +3632491968,3632491999,SR +3632492000,3632492007,NL +3632492008,3632492015,IO +3632492016,3632492023,IN +3632492024,3632492031,GB +3632492032,3632492087,US +3632492088,3632492095,GB +3632492096,3632492231,US +3632492232,3632492239,GB +3632492240,3632492255,US +3632492256,3632492263,CH +3632492264,3632492271,US +3632492272,3632492279,CA +3632492280,3632492319,US +3632492320,3632492327,CH +3632492328,3632492367,US +3632492368,3632492375,GB +3632492376,3632492455,US +3632492456,3632492463,TH +3632492464,3632492543,US +3632492544,3632492551,FR +3632492552,3632492559,US +3632492560,3632492575,GB +3632492576,3632492775,US +3632492776,3632492791,GB +3632492792,3632492839,US +3632492840,3632492847,CA +3632492848,3632492879,US +3632492880,3632492895,TH +3632492896,3632492903,US +3632492904,3632492911,TH +3632492912,3632492983,US +3632492984,3632492991,TH +3632492992,3632493015,US +3632493016,3632493023,GI +3632493024,3632493055,GB +3632493056,3632493071,US +3632493072,3632493079,ID +3632493080,3632493087,US +3632493088,3632493119,IO +3632493120,3632493151,US +3632493152,3632493159,GR +3632493160,3632493191,US +3632493192,3632493199,CA +3632493200,3632493207,GB +3632493208,3632493215,US +3632493216,3632493223,DE +3632493224,3632493239,US +3632493240,3632493247,TW +3632493248,3632493255,CA +3632493256,3632493263,DE +3632493264,3632493271,US +3632493272,3632493279,SK +3632493280,3632493287,US +3632493288,3632493295,IN +3632493296,3632493439,US +3632493440,3632493455,MX +3632493456,3632493471,JP +3632493472,3632493479,TK +3632493480,3632493567,US +3632493568,3632493575,TH +3632493576,3632493583,GB +3632493584,3632493607,US +3632493608,3632493615,SK +3632493616,3632493639,US +3632493640,3632493647,GB +3632493648,3632493663,NL +3632493664,3632493671,AU +3632493672,3632493695,US +3632493696,3632493703,NL +3632493704,3632493711,US +3632493712,3632493727,CA +3632493728,3632493847,US +3632493848,3632493855,CA +3632493856,3632493887,US +3632493888,3632493895,CA +3632493896,3632493903,US +3632493904,3632493911,CA +3632493912,3632494015,US +3632494016,3632494023,GB +3632494024,3632494031,CA +3632494032,3632494039,SK +3632494040,3632494071,US +3632494072,3632494079,CA +3632494080,3632494399,US +3632494400,3632494415,IO +3632494416,3632494431,US +3632494432,3632494439,CA +3632494440,3632494447,US +3632494448,3632494455,TH +3632494456,3632494535,US +3632494536,3632494543,NC +3632494544,3632494551,US +3632494552,3632494567,TH +3632494568,3632494591,US +3632494592,3632494719,CA +3632494720,3632494911,US +3632494912,3632494927,CN +3632494928,3632494975,US +3632494976,3632495007,FR +3632495008,3632495103,US +3632495104,3632495111,GB +3632495112,3632495199,US +3632495200,3632495207,ZA +3632495208,3632495231,US +3632495232,3632495239,GB +3632495240,3632495247,US +3632495248,3632495255,GB +3632495256,3632495319,US +3632495320,3632495327,CA +3632495328,3632495831,US +3632495832,3632495839,RU +3632495840,3632495967,US +3632495968,3632495999,GB +3632496000,3632496031,GI +3632496032,3632496055,US +3632496056,3632496063,NZ +3632496064,3632496135,US +3632496136,3632496143,NL +3632496144,3632496159,GB +3632496160,3632496191,US +3632496192,3632496223,IE +3632496224,3632652559,US +3632652560,3632652575,GB +3632652576,3632719303,US +3632719304,3632719311,SG +3632719312,3632826495,US 3632826496,3632826511,CN 3632826512,3632833231,US 3632833232,3632833247,CN @@ -78368,27 +127093,42 @@ 3632861184,3632881663,US 3632881664,3632889855,CA 3632889856,3632898047,US -3632898048,3632902143,CA -3632902144,3632914431,US -3632922624,3632971775,US -3632971776,3632988159,CA -3632988160,3633030159,US -3633030160,3633030167,ZA +3632898048,3632898335,CA +3632898336,3632898351,US +3632898352,3632902143,CA +3632902144,3632971775,US +3632971776,3632972031,CA +3632972032,3632972063,US +3632972064,3632976287,CA +3632976288,3632976303,US +3632976304,3632988159,CA +3632988160,3633029119,US +3633029120,3633029631,PY +3633029632,3633030143,NI +3633030144,3633030159,US +3633030160,3633030167,A2 3633030168,3633030175,US -3633030176,3633030183,ZA +3633030176,3633030183,A2 3633030184,3633030191,US -3633030192,3633030215,ZA +3633030192,3633030199,A2 +3633030200,3633030207,US +3633030208,3633030215,A2 3633030216,3633030223,NG -3633030224,3633030231,ZA +3633030224,3633030231,A2 3633030232,3633030287,US -3633030288,3633030303,ZA +3633030288,3633030303,A2 3633030304,3633030335,US -3633030336,3633030359,ZA -3633030360,3633031615,US -3633031616,3633031623,ZA +3633030336,3633030359,A2 +3633030360,3633030655,US +3633030656,3633030911,SN +3633030912,3633031167,A2 +3633031168,3633031615,US +3633031616,3633031623,A2 3633031624,3633031647,US 3633031648,3633031655,NG -3633031656,3633031959,US +3633031656,3633031687,US +3633031688,3633031695,NG +3633031696,3633031959,US 3633031960,3633031967,NL 3633031968,3633031983,US 3633031984,3633031991,PG @@ -78399,36 +127139,38 @@ 3633032176,3633032223,US 3633032224,3633032231,NG 3633032232,3633032239,US -3633032240,3633032247,ZA +3633032240,3633032247,A2 3633032248,3633032271,US -3633032272,3633032279,ZA +3633032272,3633032279,A2 3633032280,3633032287,US 3633032288,3633032319,GQ 3633032320,3633032415,US 3633032416,3633032431,NG 3633032432,3633032439,US -3633032440,3633032447,ZA -3633032448,3633032511,US -3633032512,3633032575,SL -3633032576,3633032591,US -3633032592,3633032607,ZA -3633032608,3633033247,US -3633033248,3633033255,ZA +3633032440,3633032447,A2 +3633032448,3633032543,US +3633032544,3633032567,NG +3633032568,3633032591,US +3633032592,3633032607,A2 +3633032608,3633032959,US +3633032960,3633033215,A2 +3633033216,3633033247,US +3633033248,3633033255,A2 3633033256,3633033263,US -3633033264,3633033271,ZA +3633033264,3633033271,A2 3633033272,3633033287,US 3633033288,3633033295,GH 3633033296,3633033303,NG -3633033304,3633033319,ZA +3633033304,3633033319,A2 3633033320,3633033327,NG 3633033328,3633033335,US -3633033336,3633033359,ZA +3633033336,3633033359,A2 3633033360,3633033367,NG -3633033368,3633033375,ZA +3633033368,3633033375,A2 3633033376,3633033391,NG -3633033392,3633033399,ZA +3633033392,3633033399,A2 3633033400,3633034047,US -3633034048,3633034079,ZA +3633034048,3633034079,A2 3633034080,3633034519,US 3633034520,3633034527,NG 3633034528,3633034559,US @@ -78442,7 +127184,9 @@ 3633035136,3633035151,NR 3633035152,3633035199,US 3633035200,3633035207,ID -3633035208,3633035311,US +3633035208,3633035287,US +3633035288,3633035295,A2 +3633035296,3633035311,US 3633035312,3633035319,ID 3633035320,3633035439,US 3633035440,3633035447,ID @@ -78451,94 +127195,251 @@ 3633035488,3633035527,US 3633035528,3633035535,NG 3633035536,3633035551,US -3633035552,3633035599,ZA +3633035552,3633035599,A2 3633035600,3633036031,US 3633036032,3633036287,HT 3633036288,3633036479,US 3633036480,3633036511,TT 3633036512,3633036607,US -3633036608,3633036671,GB +3633036608,3633036671,A2 3633036672,3633039503,US 3633039504,3633039519,CA -3633039520,3633336319,US -3633336320,3633340415,KY +3633039520,3633166079,US +3633166080,3633166207,MX +3633166208,3633336319,US +3633336320,3633336463,KY +3633336464,3633336479,US +3633336480,3633340415,KY 3633340416,3633344511,US 3633344512,3633348607,CA -3633348608,3633405951,US +3633348608,3633373535,US +3633373536,3633373567,BA +3633373568,3633374799,US +3633374800,3633374815,CA +3633374816,3633376959,US +3633376960,3633376991,CA +3633376992,3633377087,US +3633377088,3633377119,IN +3633377120,3633379327,US +3633381376,3633405951,US 3633405952,3633410047,CA -3633410048,3633455103,US -3633459200,3633479679,US +3633410048,3633479679,US 3633479680,3633483775,CA -3633483776,3633545215,US +3633483776,3633513984,US +3633513985,3633514238,ES +3633514239,3633545215,US 3633545216,3633545727,GA -3633545728,3633546495,US -3633546496,3633546751,GA -3633546752,3633547263,US +3633545728,3633546239,A2 +3633546240,3633546751,GA +3633546752,3633547263,A2 3633547264,3633548287,GA -3633548288,3633548543,US +3633548288,3633548543,A2 3633548544,3633548799,GA -3633548800,3633548927,US +3633548800,3633548927,A2 3633548928,3633549055,GA -3633549056,3633552911,US +3633549056,3633549567,A2 +3633549568,3633549823,GA +3633549824,3633550079,A2 +3633550080,3633550335,US +3633550336,3633550463,A2 +3633550464,3633550527,US +3633550528,3633550847,A2 +3633550848,3633551359,GA +3633551360,3633552383,A2 +3633552384,3633552639,US +3633552640,3633552911,A2 3633552912,3633552927,GA -3633552928,3633553151,US +3633552928,3633552951,US +3633552952,3633552959,A2 +3633552960,3633552967,US +3633552968,3633553031,A2 +3633553032,3633553039,US +3633553040,3633553127,A2 +3633553128,3633553135,US +3633553136,3633553151,A2 3633553152,3633553279,GW -3633553280,3633783295,US -3633783552,3633783807,US -3633784064,3633784319,US -3633784576,3633785087,US -3633785600,3633786367,US -3633786880,3633815551,US -3633815552,3633819647,CA -3633823744,3633840127,US -3633844224,3633848319,US -3633856512,3633881087,US +3633553280,3633553295,US +3633553296,3633553351,A2 +3633553352,3633553367,US +3633553368,3633553399,A2 +3633553400,3633812775,US +3633812776,3633812783,CA +3633812784,3633815551,US +3633815552,3633816079,CA +3633816080,3633816095,US +3633816096,3633816119,CA +3633816120,3633816127,IN +3633816128,3633816143,US +3633816144,3633816151,CA +3633816152,3633816159,IN +3633816160,3633816175,ZA +3633816176,3633816207,US +3633816208,3633816215,CA +3633816216,3633816223,US +3633816224,3633816231,IN +3633816232,3633816247,US +3633816248,3633816255,IN +3633816256,3633816263,NG +3633816264,3633816279,CA +3633816280,3633816303,US +3633816304,3633816351,CA +3633816352,3633816383,IN +3633816384,3633816391,NG +3633816392,3633816399,US +3633816400,3633816407,CA +3633816408,3633816463,US +3633816464,3633816471,CA +3633816472,3633816479,IN +3633816480,3633816495,CA +3633816496,3633816503,ZA +3633816504,3633816511,IN +3633816512,3633816519,US +3633816520,3633816527,ZA +3633816528,3633819135,CA +3633819136,3633819199,IN +3633819200,3633819391,CA +3633819392,3633819423,IN +3633819424,3633819647,CA +3633819648,3633821279,US +3633821280,3633821311,BB +3633821312,3633822207,US +3633822208,3633822335,CY +3633822336,3633881087,US 3633881088,3633885183,AN 3633885184,3633889279,US 3633889280,3633893375,CA -3633893376,3633971199,US +3633893376,3633915647,US +3633915648,3633915903,IT +3633915904,3633922303,US +3633922304,3633922367,TN +3633922368,3633971199,US 3633971200,3634020351,CA 3634020352,3634053119,US 3634053120,3634061311,CL -3634061312,3634511871,US +3634061312,3634065311,US +3634065312,3634065343,SV +3634065344,3634125831,US +3634125832,3634125839,CA +3634125840,3634125855,JP +3634125856,3634125887,US +3634125888,3634125903,GB +3634125904,3634125951,US +3634125952,3634125967,CA +3634125968,3634135423,US +3634135424,3634135487,CA +3634135488,3634135935,US +3634135936,3634136062,CA +3634136063,3634136103,US +3634136104,3634136111,CA +3634136112,3634138127,US +3634138128,3634138143,CA +3634138144,3634204255,US +3634204256,3634204263,AT +3634204264,3634204591,US +3634204592,3634204607,GB +3634204608,3634267649,US +3634267650,3634267681,GB +3634267682,3634269669,US +3634269670,3634269679,GB +3634269680,3634269801,US +3634269802,3634269815,CA +3634269816,3634270016,US +3634270017,3634270080,CN +3634270081,3634270976,US +3634270977,3634271231,CN +3634271232,3634271232,US +3634271233,3634271328,CA +3634271329,3634367023,US +3634367024,3634367031,CA +3634367032,3634511871,US 3634511872,3634515967,CA -3634515968,3634520063,US -3634528256,3634552831,US +3634515968,3634552831,US 3634552832,3634556927,CA 3634556928,3634880511,US 3634880512,3634888703,CA 3634888704,3634913279,US -3634913280,3634921471,CA +3634913280,3634915663,CA +3634915664,3634915679,US +3634915680,3634921471,CA 3634921472,3634925567,US 3634925568,3634929663,CA -3634929664,3635109887,US +3634929664,3635107903,US +3635107904,3635107967,MX +3635107968,3635109887,US 3635109888,3635110295,CA 3635110296,3635110303,US 3635110304,3635113983,CA 3635113984,3635142655,US 3635142656,3635146751,CA -3635146752,3635150847,US -3635216384,3635253247,US -3635257344,3635314687,US +3635146752,3635314687,US 3635314688,3635322879,CA 3635322880,3635425279,US 3635425280,3635429375,CA -3635429376,3635466239,US +3635429376,3635458527,US +3635458528,3635458543,CH +3635458544,3635460031,US +3635460032,3635460095,CH +3635460096,3635460543,US +3635460544,3635460575,CH +3635460576,3635460799,US +3635460800,3635460831,CH +3635460832,3635464031,US +3635464032,3635464063,GB +3635464064,3635464127,US +3635464128,3635464135,GB +3635464136,3635464223,US +3635464224,3635464239,GB +3635464240,3635466239,US 3635466240,3635470335,CA -3635470336,3635658751,US +3635470336,3635527679,US +3635527680,3635527935,PR +3635527936,3635528447,US +3635528448,3635528575,PR +3635528576,3635528959,US +3635528960,3635529215,PR +3635529216,3635529591,US +3635529592,3635529599,MX +3635529600,3635529703,US +3635529704,3635529711,MX +3635529712,3635529719,CO +3635529720,3635529983,US +3635529984,3635530751,PR +3635530752,3635530759,US +3635530760,3635530767,PR +3635530768,3635531007,US +3635531008,3635531263,PR +3635531264,3635531583,US +3635531584,3635531615,PR +3635531616,3635531639,US +3635531640,3635531647,PR +3635531648,3635531727,US +3635531728,3635531735,ES +3635531736,3635532287,US +3635532288,3635532303,ES +3635532304,3635532831,US +3635532832,3635532863,VE +3635532864,3635532927,SV +3635532928,3635532999,US +3635533000,3635533007,NO +3635533008,3635533535,US +3635533536,3635533551,PR +3635533552,3635658751,US 3635658752,3635660799,CN -3635660800,3635847791,US +3635660800,3635829631,US +3635829632,3635829663,CA +3635829664,3635847791,US 3635847792,3635847807,CA 3635847808,3635856511,US 3635856512,3635856543,CA 3635856544,3635871743,US 3635871744,3635879935,CA 3635879936,3635892223,US -3635892224,3635896319,CA +3635892224,3635895807,CA +3635895808,3635895839,US +3635895840,3635896319,CA 3635896320,3635904511,US 3635904512,3635912703,CA -3635912704,3635924991,US -3635929088,3635961855,US +3635912704,3635961855,US 3635961856,3635963903,SV 3635963904,3635964159,US 3635964160,3635964415,BO @@ -78547,65 +127448,447 @@ 3635966976,3635967999,PY 3635968000,3635970047,SV 3635970048,3636019199,US -3636019200,3636027391,CA +3636019200,3636021775,CA +3636021776,3636021791,US +3636021792,3636027391,CA 3636027392,3636064255,US 3636064256,3636068351,CA -3636068352,3636152287,US -3636152288,3636152575,CA -3636152576,3636154367,US -3636154368,3636154879,CA -3636154880,3636157055,US -3636157056,3636157063,CA -3636157064,3636158111,US -3636158112,3636158143,CA -3636158144,3636158463,US -3636158464,3636158719,CA -3636158720,3636158783,US -3636158784,3636158815,CA -3636158816,3636160511,US -3636160512,3636160767,CA -3636160768,3636161791,US -3636161792,3636161855,CA -3636161856,3636164095,US +3636068352,3636150495,US +3636150496,3636150527,CA +3636150528,3636150783,US +3636150784,3636150839,CA +3636150840,3636150911,US +3636150912,3636150935,CA +3636150936,3636150943,US +3636150944,3636151007,CA +3636151008,3636151023,BS +3636151024,3636151031,CA +3636151032,3636151039,US +3636151040,3636151167,CA +3636151168,3636151199,US +3636151200,3636151455,CA +3636151456,3636151479,US +3636151480,3636151488,CA +3636151489,3636151535,US +3636151536,3636151759,CA +3636151760,3636151775,US +3636151776,3636152575,CA +3636152576,3636152591,US +3636152592,3636152639,CA +3636152640,3636152647,US +3636152648,3636152655,CA +3636152656,3636152703,US +3636152704,3636152767,CA +3636152768,3636152775,MX +3636152776,3636152783,US +3636152784,3636152791,CA +3636152792,3636152799,US +3636152800,3636152847,CA +3636152848,3636152895,US +3636152896,3636153023,CA +3636153024,3636153055,KN +3636153056,3636153343,CA +3636153344,3636153375,US +3636153376,3636153823,CA +3636153824,3636153839,US +3636153840,3636153847,CA +3636153848,3636153855,US +3636153856,3636154895,CA +3636154896,3636154911,US +3636154912,3636154975,CA +3636154976,3636154979,US +3636154980,3636154990,CA +3636154991,3636154991,US +3636154992,3636155007,CA +3636155008,3636155071,US +3636155072,3636155391,CA +3636155392,3636155407,US +3636155408,3636155455,CA +3636155456,3636155519,US +3636155520,3636155775,CA +3636155776,3636155839,US +3636155840,3636156159,CA +3636156160,3636156191,US +3636156192,3636156255,CA +3636156256,3636156256,US +3636156257,3636156271,CA +3636156272,3636156279,US +3636156280,3636156415,CA +3636156416,3636156927,US +3636156928,3636157063,CA +3636157064,3636157167,US +3636157168,3636157183,CA +3636157184,3636157439,US +3636157440,3636158015,CA +3636158016,3636158031,US +3636158032,3636158063,CA +3636158064,3636158079,US +3636158080,3636158215,CA +3636158216,3636158223,US +3636158224,3636158335,CA +3636158336,3636158351,US +3636158352,3636158367,CA +3636158368,3636158399,US +3636158400,3636158719,CA +3636158720,3636158751,US +3636158752,3636158815,CA +3636158816,3636158831,US +3636158832,3636158847,CA +3636158848,3636158975,US +3636158976,3636159743,CA +3636159744,3636159775,US +3636159776,3636159807,CA +3636159808,3636159839,US +3636159840,3636159871,CA +3636159872,3636159999,IN +3636160000,3636160255,US +3636160256,3636160415,CA +3636160416,3636160431,US +3636160432,3636160831,CA +3636160832,3636160895,US +3636160896,3636160927,CA +3636160928,3636160975,US +3636160976,3636161279,CA +3636161280,3636161327,US +3636161328,3636161535,CA +3636161536,3636161791,US +3636161792,3636161871,CA +3636161872,3636161885,US +3636161886,3636161943,CA +3636161944,3636161951,US +3636161952,3636162559,CA +3636162560,3636163583,US +3636163584,3636164095,CA 3636164096,3636164111,BV -3636164112,3636164159,US -3636164160,3636164223,CA -3636164224,3636166399,US -3636166400,3636166655,CA -3636166656,3636396031,US +3636164112,3636164319,CA +3636164320,3636164327,US +3636164328,3636164335,CA +3636164336,3636164351,US +3636164352,3636164607,CA +3636164608,3636165119,US +3636165120,3636165375,CA +3636165376,3636165471,US +3636165472,3636165503,CA +3636165504,3636166143,US +3636166144,3636166655,CA +3636166656,3636206079,US +3636206080,3636206335,AU +3636206336,3636265535,US +3636265536,3636265599,DE +3636265600,3636266879,US +3636266880,3636266911,HK +3636266912,3636396031,US 3636396032,3636461567,CA -3636461568,3636609023,US +3636461568,3636577647,US +3636577648,3636577663,CA +3636577664,3636609023,US 3636609024,3636610559,CA 3636610560,3636610815,US 3636610816,3636621311,CA -3636621312,3636809727,US -3636813824,3636822015,US +3636621312,3636625407,US +3636625408,3636626431,AR +3636626432,3636626943,BR +3636626944,3636627199,AR +3636627200,3636627455,BR +3636627456,3636628479,MX +3636628480,3636628991,PE +3636628992,3636633951,US +3636633952,3636633983,CR +3636633984,3636634015,US +3636634016,3636634063,CR +3636634064,3636634079,US +3636634080,3636634111,CR +3636634112,3636634287,US +3636634288,3636634335,CR +3636634336,3636634351,US +3636634352,3636634431,CR +3636634432,3636634463,US +3636634464,3636634479,CR +3636634480,3636634495,US +3636634496,3636634511,CR +3636634512,3636634623,US +3636634624,3636634687,CR +3636634688,3636634719,US +3636634720,3636635135,CR +3636635136,3636635391,US +3636635392,3636635775,CR +3636635776,3636636415,US +3636636416,3636636543,CR +3636636544,3636667647,US +3636667904,3636668159,SC +3636668416,3636668671,GI +3636668672,3636668927,US +3636668928,3636669183,BZ +3636669184,3636669439,CY +3636669696,3636669951,SC +3636669952,3636670207,DE +3636670304,3636670335,RU +3636670464,3636670527,US +3636670656,3636670719,RU +3636670784,3636670799,RU +3636670976,3636671007,VG +3636671200,3636671231,IT +3636671232,3636671487,SC +3636671488,3636671743,GB +3636674560,3636822015,US 3636822016,3636854783,CA 3636854784,3636887551,US 3636887552,3636895743,CA -3636895744,3637071935,US +3636895744,3636904351,US +3636904352,3636904383,MY +3636904384,3636904511,US +3636904512,3636904543,CA +3636904544,3636904575,IN +3636904576,3636904607,US +3636904608,3636904639,IN +3636904640,3636904703,US +3636904704,3636904959,MY +3636904960,3636905087,US +3636905088,3636905215,MY +3636905216,3636905471,US +3636905472,3636905727,CA +3636905728,3636905759,HK +3636905760,3636905791,US +3636905792,3636905823,IN +3636905824,3636905887,US +3636905888,3636905951,CA +3636905952,3636906015,US +3636906016,3636906047,IN +3636906048,3636906079,US +3636906080,3636906111,BE +3636906112,3636906143,US +3636906144,3636906175,BE +3636906176,3636906207,IN +3636906208,3636906367,US +3636906368,3636906465,IN +3636906466,3636906623,US +3636906624,3636906751,IN +3636906752,3636906879,US +3636906880,3636907007,IN +3636907008,3636907103,US +3636907104,3636907135,IN +3636907136,3636907199,CA +3636907200,3636907231,HK +3636907232,3636907775,US +3636907776,3636908031,CA +3636908032,3636908543,US +3636908544,3636908799,IN +3636908800,3636909055,US +3636909056,3636909567,CA +3636909568,3636909663,US +3636909664,3636909695,IT +3636909696,3636909791,CA +3636909792,3636909855,US +3636909856,3636909887,CN +3636909888,3636909951,IT +3636909952,3636910079,US +3636910080,3636910335,CA +3636910336,3636910399,IN +3636910400,3636910495,US +3636910496,3636910527,BE +3636910528,3636910591,US +3636910592,3636910719,CA +3636910720,3636910847,US +3636910848,3636911103,AU +3636911104,3636911295,US +3636911296,3636911359,CA +3636911360,3636911423,US +3636911424,3636911455,BE +3636911456,3636911615,US +3636911616,3636911743,TW +3636911744,3636911871,IN +3636911872,3636912383,US +3636912384,3636912447,JP +3636912448,3636912959,US +3636912960,3636912991,BE +3636912992,3636913919,US +3636913920,3636914175,CA +3636914176,3636914431,US +3636914432,3636914687,CA +3636914688,3636914815,US +3636914816,3636914943,CA +3636914944,3636915103,US +3636915104,3636915135,IN +3636915136,3636915199,US +3636915200,3636915327,IN +3636915328,3636915455,US +3636915456,3636915583,IN +3636915584,3636916223,US +3636916224,3636916351,CA +3636916352,3636916479,US +3636916480,3636916607,CA +3636916608,3636916735,IN +3636916736,3636916991,US +3636916992,3636917120,CA +3636917121,3636917255,US +3636917256,3636917263,IN +3636917264,3636917271,CA +3636917272,3636917295,US +3636917296,3636917303,IN +3636917304,3636917447,US +3636917448,3636917455,HK +3636917456,3636917631,US +3636917632,3636919039,CA +3636919040,3636919071,IN +3636919072,3636919103,US +3636919104,3636919135,CA +3636919136,3636919167,IN +3636919168,3636919199,CA +3636919200,3636919231,IN +3636919232,3636919711,US +3636919712,3636919743,BE +3636919744,3636919807,US +3636919808,3636919871,GB +3636919872,3637071887,US +3637071888,3637071903,AD +3637071904,3637071935,US 3637071936,3637071943,SK -3637071944,3637075967,US +3637071944,3637071951,IL +3637071952,3637071967,CY +3637071968,3637071999,US +3637072000,3637072015,CA +3637072016,3637072031,CY +3637072032,3637072071,US +3637072072,3637072079,FI +3637072080,3637072095,CA +3637072096,3637072127,GB +3637072128,3637072135,US +3637072136,3637072143,AD +3637072144,3637072159,CY +3637072160,3637072279,US +3637072280,3637072287,CA +3637072288,3637072303,NE +3637072304,3637072319,US +3637072320,3637072335,IL +3637072336,3637072343,CA +3637072344,3637072895,US +3637072896,3637073151,CY +3637073152,3637073167,US +3637073168,3637073183,AD +3637073184,3637073215,US +3637073216,3637073231,CY +3637073232,3637073935,US +3637073936,3637073959,AD +3637073960,3637074239,US +3637074240,3637074303,PA +3637074304,3637074687,US +3637074688,3637074703,CA +3637074704,3637074751,US +3637074752,3637074815,PA +3637074816,3637074943,US +3637074944,3637074959,CA +3637074960,3637074975,US +3637074976,3637075007,PA +3637075008,3637075231,US +3637075232,3637075263,PA +3637075264,3637075487,US +3637075488,3637075519,PA +3637075520,3637075743,US +3637075744,3637075775,PA +3637075776,3637075967,US 3637075968,3637080063,CA 3637080064,3637389335,US 3637389336,3637389343,CA -3637389344,3637510143,US -3637510144,3637641215,CA -3637641216,3637657599,US +3637389344,3637427711,US +3637427712,3637427743,CA +3637427744,3637443103,US +3637443104,3637443135,JP +3637443136,3637469439,US +3637469440,3637469695,GE +3637469696,3637510143,US +3637510144,3637520127,CA +3637520128,3637520191,US +3637520192,3637641215,CA +3637641216,3637665791,US 3637665792,3637667439,CA 3637667440,3637667518,US 3637667519,3637669887,CA 3637669888,3637706751,US 3637706752,3637739519,CA -3637739520,3637743615,US -3637747712,3638165503,US +3637739520,3638165503,US 3638165504,3638181887,CA -3638181888,3638247439,US +3638181888,3638198951,US +3638198952,3638198959,BM +3638198960,3638198983,US +3638198984,3638198991,ES +3638198992,3638199711,US +3638199712,3638199743,DE +3638199744,3638200007,US +3638200008,3638200015,JP +3638200016,3638206407,US +3638206408,3638206415,LU +3638206416,3638208527,US +3638208528,3638208543,CN +3638208544,3638214167,US +3638214168,3638214175,GB +3638214176,3638214399,US +3638214400,3638214655,GR +3638214656,3638214783,IT +3638214784,3638214871,US +3638214872,3638214879,CK +3638214880,3638215663,US +3638215664,3638215679,GB +3638215680,3638215831,US +3638215832,3638215839,JP +3638215840,3638215855,US +3638215856,3638215863,AU +3638215864,3638216735,US +3638216736,3638216743,LU +3638216744,3638219087,US +3638219088,3638219103,IT +3638219104,3638219455,US +3638219456,3638219519,AU +3638219520,3638219775,US +3638219776,3638220031,IT +3638220032,3638220167,US +3638220168,3638220175,JP +3638220176,3638220191,US +3638220192,3638220223,QA +3638220224,3638220511,US +3638220512,3638220519,CN +3638220520,3638222087,US +3638222088,3638222095,DE +3638222096,3638222143,US +3638222144,3638222207,DE +3638222208,3638222463,US +3638222464,3638222591,AU +3638222592,3638222623,CA +3638222624,3638222911,US +3638222912,3638222919,IT +3638222920,3638223559,US +3638223560,3638223567,PA +3638223568,3638224255,US +3638224256,3638224271,IT +3638224272,3638224639,US +3638224640,3638224895,GR +3638224896,3638225983,US +3638225984,3638226015,IN +3638226016,3638226687,US +3638226688,3638226943,NL +3638226944,3638228023,US +3638228024,3638228031,GB +3638228032,3638229279,US +3638229280,3638229311,IT +3638229312,3638230671,US +3638230672,3638230679,AU +3638230680,3638230815,US +3638230816,3638230847,ES +3638230848,3638230927,US +3638230928,3638230935,CA +3638230936,3638231031,US +3638231032,3638231039,GB +3638231040,3638247439,US 3638247440,3638247455,GB 3638247456,3638247487,US 3638247488,3638247551,GB 3638247552,3638247679,DE -3638247680,3638249751,US +3638247680,3638247855,US +3638247856,3638247871,DE +3638247872,3638247903,US +3638247904,3638247935,GB +3638247936,3638248703,US +3638248704,3638249215,FR +3638249216,3638249751,US 3638249752,3638249791,GB 3638249792,3638250535,US 3638250536,3638250543,GB @@ -78613,31 +127896,51 @@ 3638250560,3638250623,GB 3638250624,3638250687,US 3638250688,3638250703,GB -3638250704,3638250751,US -3638250752,3638250815,GB +3638250704,3638250719,US +3638250720,3638250815,GB 3638250816,3638250831,US 3638250832,3638250847,GB 3638250848,3638250863,US 3638250864,3638250871,GB -3638250872,3638304767,US +3638250872,3638250895,US +3638250896,3638250911,GB +3638250912,3638250919,CH +3638250920,3638250983,US +3638250984,3638250991,GB +3638250992,3638304767,US 3638304768,3638312959,CA 3638312960,3638370303,US -3638370304,3638386687,CA -3638386688,3638509567,US -3638509568,3638534143,CA +3638370304,3638374751,CA +3638374752,3638374767,US +3638374768,3638386687,CA +3638386688,3638494175,US +3638494176,3638494183,CA +3638494184,3638509295,US +3638509296,3638509311,GB +3638509312,3638509567,US +3638509568,3638526911,CA +3638526912,3638526919,US +3638526920,3638528751,CA +3638528752,3638528759,US +3638528760,3638530047,CA +3638530048,3638530063,US +3638530064,3638530239,CA +3638530240,3638530255,US +3638530256,3638533695,CA +3638533696,3638533703,US +3638533704,3638534143,CA 3638534144,3638697983,US 3638697984,3638706175,CA -3638706176,3638710271,US -3638714368,3638788095,US -3638804480,3638841343,US -3638845440,3638874111,US +3638706176,3638707199,A2 +3638707200,3638707455,VC +3638707456,3638710271,A2 +3638710272,3638874111,US 3638874112,3638878207,CA 3638878208,3638960383,US 3638960384,3638960639,BR 3638960640,3638984703,US 3638984704,3638992895,GT -3638992896,3639042047,US -3639050240,3639083007,US +3638992896,3639083007,US 3639083008,3639148543,CA 3639148544,3639222271,US 3639222272,3639230463,CA @@ -78647,190 +127950,236 @@ 3639258679,3639263231,CA 3639263232,3639279615,US 3639279616,3639283711,CA -3639283712,3639308287,US -3639312384,3639322719,US -3639322720,3639322751,ID -3639322752,3639390207,US -3639394304,3639396351,US +3639283712,3639322511,US +3639322512,3639322519,JP +3639322520,3639322535,US +3639322536,3639322543,JP +3639322544,3639342703,US +3639342704,3639342711,GB +3639342712,3639343135,US +3639343136,3639343167,GB +3639343168,3639343231,US +3639343232,3639343263,GB +3639343264,3639344447,US +3639344448,3639344463,MA +3639344464,3639344543,US +3639344544,3639344575,GB +3639344576,3639344591,PL +3639344592,3639369727,US +3639369728,3639376383,A2 +3639376384,3639377407,GU +3639377408,3639377663,A2 +3639377664,3639390207,US +3639390208,3639394303,ZA +3639394304,3639396095,US +3639396096,3639396351,A2 3639396352,3639396383,NE -3639396384,3639396415,US +3639396384,3639396415,A2 3639396416,3639396431,PK -3639396432,3639396447,US +3639396432,3639396447,A2 3639396448,3639396463,NG 3639396464,3639396471,TZ -3639396472,3639396543,US +3639396472,3639396487,A2 +3639396488,3639396519,IN +3639396520,3639396543,A2 3639396544,3639396551,TZ -3639396552,3639396671,US +3639396552,3639396671,A2 3639396672,3639396735,NE -3639396736,3639396863,US +3639396736,3639396743,IN +3639396744,3639396863,A2 3639396864,3639396879,NE -3639396880,3639396927,US +3639396880,3639396927,A2 3639396928,3639396959,FR 3639396960,3639396975,NG -3639396976,3639396991,US +3639396976,3639396991,A2 3639396992,3639397023,CD -3639397024,3639397119,US +3639397024,3639397119,A2 3639397120,3639397375,IN 3639397376,3639397631,US 3639397632,3639397887,NG -3639397888,3639398527,US +3639397888,3639398399,US +3639398400,3639398423,A2 +3639398424,3639398431,LB +3639398432,3639398439,A2 +3639398440,3639398447,LB +3639398448,3639398463,A2 +3639398464,3639398495,SA +3639398496,3639398527,A2 3639398528,3639398591,SA -3639398592,3639400447,US +3639398592,3639398599,LB +3639398600,3639398655,A2 +3639398656,3639398663,SA +3639398664,3639398911,A2 +3639398912,3639399935,US +3639399936,3639400447,A2 3639400448,3639401471,RS 3639401472,3639401495,PK -3639401496,3639401511,US +3639401496,3639401511,A2 3639401512,3639401519,ID -3639401520,3639401535,US +3639401520,3639401535,A2 3639401536,3639401551,TZ 3639401552,3639401559,LK -3639401560,3639401623,US +3639401560,3639401591,A2 +3639401592,3639401599,US +3639401600,3639401623,A2 3639401624,3639401631,TZ -3639401632,3639401647,US +3639401632,3639401647,A2 3639401648,3639401655,PK -3639401656,3639401687,US +3639401656,3639401687,A2 3639401688,3639401727,PK -3639401728,3639402015,US -3639402016,3639402039,PK -3639402040,3639402055,US +3639401728,3639402015,A2 +3639402016,3639402031,PK +3639402032,3639402047,A2 +3639402048,3639402055,US 3639402056,3639402071,PK -3639402072,3639402079,US +3639402072,3639402079,A2 3639402080,3639402095,PK -3639402096,3639402111,US +3639402096,3639402111,A2 3639402112,3639402175,NG 3639402176,3639402191,PK -3639402192,3639402199,US +3639402192,3639402199,A2 3639402200,3639402207,PK -3639402208,3639402239,US +3639402208,3639402239,A2 3639402240,3639402495,GH -3639402496,3639558143,US +3639402496,3639439631,US +3639439632,3639439639,RO +3639439640,3639440767,US +3639440768,3639440895,IN +3639440896,3639476223,US +3639507456,3639507967,US +3639541760,3639558143,US 3639558144,3639566335,CA -3639566336,3639603199,US +3639566336,3639607295,US 3639607296,3639611391,CA 3639611392,3639656447,US 3639656448,3639660543,CA 3639660544,3639664639,US 3639664640,3639668735,CA -3639672832,3639673343,CL -3639673344,3639673599,CO +3639668736,3639672831,US +3639672832,3639673599,CO 3639673600,3639675391,CL 3639675392,3639676159,CO -3639676160,3639676423,CL -3639676424,3639676479,CO -3639676480,3639676575,CL -3639676576,3639676607,CO -3639676608,3639676655,CL -3639676656,3639676679,CO -3639676680,3639676687,CL -3639676688,3639676695,CO +3639676160,3639676415,CL +3639676416,3639676543,CO +3639676544,3639676575,CL +3639676576,3639676639,CO +3639676640,3639676655,CL +3639676656,3639676695,CO 3639676696,3639676703,CL -3639676704,3639676799,CO -3639676800,3639676807,CL -3639676808,3639676815,CO -3639676816,3639676831,CL -3639676832,3639676943,CO -3639676944,3639677023,CL -3639677024,3639677031,CO -3639677032,3639677103,CL -3639677104,3639677111,CO -3639677112,3639677423,CL -3639677424,3639677431,CO -3639677432,3639677455,CL -3639677456,3639677487,CO -3639677488,3639677711,CL -3639677712,3639677719,CO -3639677720,3639677791,CL -3639677792,3639677823,CO -3639677824,3639677871,CL -3639677872,3639677879,CO -3639677880,3639677959,CL -3639677960,3639677967,CO -3639677968,3639677983,CL -3639677984,3639677991,CO -3639677992,3639678007,CL -3639678008,3639678023,CO -3639678024,3639678055,CL -3639678056,3639678063,CO -3639678064,3639678071,CL -3639678072,3639678087,CO -3639678088,3639678119,CL -3639678120,3639678127,CO -3639678128,3639678143,CL -3639678144,3639678159,CO -3639678160,3639678167,CL -3639678168,3639678175,CO +3639676704,3639676959,CO +3639676960,3639676967,CL +3639676968,3639676983,CO +3639676984,3639676999,CL +3639677000,3639677063,CO +3639677064,3639677071,CL +3639677072,3639677111,CO +3639677112,3639677119,CL +3639677120,3639677223,CO +3639677224,3639677231,CL +3639677232,3639677335,CO +3639677336,3639677343,CL +3639677344,3639677375,CO +3639677376,3639677383,CL +3639677384,3639677431,CO +3639677432,3639677439,CL +3639677440,3639677503,CO +3639677504,3639677519,CL +3639677520,3639677559,CO +3639677560,3639677567,CL +3639677568,3639677575,CO +3639677576,3639677583,CL +3639677584,3639677631,CO +3639677632,3639677695,CL +3639677696,3639677751,CO +3639677752,3639677767,CL +3639677768,3639677823,CO +3639677824,3639677831,CL +3639677832,3639677839,CO +3639677840,3639677847,CL +3639677848,3639677927,CO +3639677928,3639677951,CL +3639677952,3639677975,CO +3639677976,3639677983,CL +3639677984,3639677999,CO +3639678000,3639678007,CL +3639678008,3639678031,CO +3639678032,3639678039,CL +3639678040,3639678175,CO 3639678176,3639678191,CL 3639678192,3639678199,CO -3639678200,3639678527,CL -3639678528,3639678535,CO -3639678536,3639678583,CL -3639678584,3639678591,CO -3639678592,3639678639,CL -3639678640,3639678647,CO -3639678648,3639678663,CL -3639678664,3639678671,CO -3639678672,3639678783,CL -3639678784,3639678791,CO -3639678792,3639678799,CL -3639678800,3639678815,CO -3639678816,3639678823,CL -3639678824,3639678831,CO -3639678832,3639678839,CL -3639678840,3639678855,CO -3639678856,3639678887,CL -3639678888,3639678895,CO +3639678200,3639678463,CL +3639678464,3639678487,CO +3639678488,3639678495,CL +3639678496,3639678647,CO +3639678648,3639678655,CL +3639678656,3639678671,CO +3639678672,3639678687,CL +3639678688,3639678735,CO +3639678736,3639678751,CL +3639678752,3639678895,CO 3639678896,3639678911,CL -3639678912,3639678919,CO -3639678920,3639678935,CL -3639678936,3639678951,CO -3639678952,3639678975,CL -3639678976,3639679231,CO -3639679232,3639679247,CL -3639679248,3639679263,CO -3639679264,3639679383,CL -3639679384,3639679391,CO -3639679392,3639679415,CL -3639679416,3639679423,CO -3639679424,3639679447,CL -3639679448,3639679455,CO -3639679456,3639679487,CL -3639679488,3639679743,CO -3639679744,3639680271,CL -3639680272,3639680311,CO -3639680312,3639680319,CL -3639680320,3639680335,CO -3639680336,3639680383,CL -3639680384,3639680415,CO -3639680416,3639680431,CL -3639680432,3639680447,CO -3639680448,3639680767,CL -3639680768,3639680799,CO -3639680800,3639680831,CL -3639680832,3639680847,CO -3639680848,3639680871,CL -3639680872,3639680879,CO -3639680880,3639680887,CL -3639680888,3639680895,CO -3639680896,3639680967,CL -3639680968,3639680991,CO +3639678912,3639678927,CO +3639678928,3639678935,CL +3639678936,3639679359,CO +3639679360,3639679383,CL +3639679384,3639679455,CO +3639679456,3639679463,CL +3639679464,3639679487,CO +3639679488,3639679743,CL +3639679744,3639680255,CO +3639680256,3639680271,CL +3639680272,3639680343,CO +3639680344,3639680351,CL +3639680352,3639680359,CO +3639680360,3639680367,CL +3639680368,3639680447,CO +3639680448,3639680479,CL +3639680480,3639680847,CO +3639680848,3639680863,CL +3639680864,3639680895,CO +3639680896,3639680927,CL +3639680928,3639680991,CO 3639680992,3639681023,CL 3639681024,3639730175,US 3639730176,3639734271,CA -3639734272,3639812095,US -3639820288,3639902207,US -3639902208,3639903755,PE -3639903756,3639903759,PA -3639903760,3639904031,PE -3639904032,3639904035,CL -3639904036,3639912127,PE -3639912128,3639912143,CL -3639912144,3639914767,PE -3639914768,3639914775,PA -3639914776,3639918591,PE +3639734272,3639886095,US +3639886096,3639886103,CN +3639886104,3639886591,US +3639886592,3639886599,SG +3639886600,3639888927,US +3639888928,3639888959,NO +3639888960,3639902207,US +3639902208,3639918591,PE 3639918592,3639934975,AR -3639934976,3640045567,US -3640049664,3640057855,US +3639934976,3640001751,US +3640001752,3640001759,IL +3640001760,3640003239,US +3640003240,3640003247,TR +3640003248,3640007311,US +3640007312,3640007319,HK +3640007320,3640007359,US +3640007360,3640007367,SO +3640007368,3640013767,US +3640013768,3640013775,GI +3640013776,3640023079,US +3640023080,3640023087,EG +3640023088,3640023231,US +3640023232,3640023247,GI +3640023248,3640023271,US +3640023272,3640023279,HK +3640023280,3640027415,US +3640027416,3640027423,GB +3640027424,3640057855,US 3640057856,3640066047,CA -3640066048,3640197119,US +3640066048,3640075391,US +3640075392,3640075407,NL +3640075408,3640075759,US +3640075760,3640075775,CA +3640075776,3640112063,US +3640112064,3640112079,NL +3640112080,3640112575,US +3640112576,3640112591,NL +3640112592,3640197119,US 3640197120,3640201215,CA 3640201216,3640205311,US 3640205312,3640209407,BM @@ -78842,37 +128191,88 @@ 3640312096,3640312103,GB 3640312104,3640312159,US 3640312160,3640312191,ID -3640312192,3640312575,US +3640312192,3640312319,US +3640312320,3640312575,NI 3640312576,3640312607,NG 3640312608,3640314879,US -3640314880,3640315135,ZA -3640315136,3640317327,US -3640317328,3640317343,ZA +3640314880,3640315135,A2 +3640315136,3640315391,US +3640315392,3640315647,TR +3640315648,3640317327,US +3640317328,3640317343,A2 3640317344,3640317407,US -3640317408,3640317423,ZA -3640317424,3640317559,US +3640317408,3640317423,A2 +3640317424,3640317503,US +3640317504,3640317535,ID +3640317536,3640317559,US 3640317560,3640317567,NL -3640317568,3640318975,US +3640317568,3640318207,US +3640318208,3640318975,NC 3640318976,3640319103,GQ -3640319104,3640328191,US -3640336384,3640360959,US +3640319104,3640319231,US +3640319232,3640319487,NG +3640319488,3640319743,US +3640319744,3640319999,A2 +3640320000,3640344959,US +3640344960,3640345007,MX +3640345008,3640345023,US +3640345024,3640345086,MX +3640345087,3640345087,US +3640345088,3640345342,MX +3640345343,3640345391,US +3640345392,3640345407,MX +3640345408,3640345423,US +3640345424,3640345431,MX +3640345432,3640345455,US +3640345456,3640345503,MX +3640345504,3640345663,US +3640345664,3640345711,MX +3640345712,3640345743,US +3640345744,3640345854,MX +3640345855,3640346815,US +3640346816,3640346847,MX +3640346848,3640346879,US +3640346880,3640347134,MX +3640347135,3640347391,US +3640347392,3640347455,MX +3640347456,3640347471,US +3640347472,3640347487,MX +3640347488,3640347503,US +3640347504,3640347519,MX +3640347520,3640347535,US +3640347536,3640347551,MX +3640347552,3640347567,US +3640347568,3640347599,MX +3640347600,3640347615,US +3640347616,3640347631,MX +3640347632,3640347647,US +3640347648,3640347711,MX +3640347712,3640347839,US +3640347840,3640347902,MX +3640347903,3640360959,US 3640360960,3640369151,CA -3640369152,3640377343,US -3640381440,3640401919,US +3640369152,3640410111,US 3640410112,3640418303,CA -3640418304,3640557567,US -3640557568,3640582143,CA +3640418304,3640430591,US +3640430592,3640432639,A2 +3640432640,3640433407,US +3640433408,3640433663,A2 +3640433664,3640434943,US +3640438784,3640442879,A2 +3640442880,3640446975,US +3640449024,3640450047,A2 +3640450048,3640451071,US +3640451072,3640459263,A2 +3640459264,3640557567,US +3640557568,3640560511,CA +3640560512,3640560527,US +3640560528,3640564455,CA +3640564456,3640564463,US +3640564464,3640582143,CA 3640582144,3640647679,US 3640647680,3640651775,JP 3640651776,3640655871,US -3640655872,3641029375,DE -3641029376,3641029631,LU -3641029632,3641056319,DE -3641056320,3641056327,HU -3641056328,3641056359,DE -3641056360,3641056367,AT -3641056368,3641056375,PL -3641056376,3641057655,DE +3640655872,3641057655,DE 3641057656,3641057663,CZ 3641057664,3641078559,DE 3641078560,3641078567,BE @@ -78922,7 +128322,7 @@ 3641159768,3641159775,ES 3641159776,3641180159,DE 3641180160,3641188351,GB -3641188352,3641192447,SE +3641188352,3641192447,TJ 3641192448,3641196543,DE 3641196544,3641200639,SA 3641200640,3641204735,RU @@ -78939,14 +128339,11 @@ 3641249792,3641262079,DE 3641262080,3641266175,IT 3641266176,3641270271,RU -3641270272,3641278175,DE -3641278176,3641278191,CH -3641278192,3641278463,DE +3641270272,3641278463,DE 3641278464,3641282559,IS 3641282560,3641286655,RU 3641286656,3641294847,PL -3641294848,3641298687,SE -3641298688,3641298943,GB +3641294848,3641298943,GB 3641298944,3641303039,SE 3641303040,3641307135,BG 3641307136,3641311231,LT @@ -78959,61 +128356,85 @@ 3641335808,3641343999,SE 3641344000,3641345199,GB 3641345200,3641345215,IE -3641345216,3641349383,GB -3641349384,3641349391,DE -3641349392,3641349399,FR -3641349400,3641349407,CH -3641349408,3641349415,DK -3641349416,3641349423,NO -3641349424,3641349431,SE -3641349432,3641349439,NL -3641349440,3641349511,GB -3641349512,3641349519,DE -3641349520,3641349527,IT -3641349528,3641353151,GB +3641345216,3641353087,GB +3641353088,3641353151,A2 3641353152,3641353183,BD 3641353184,3641353215,NG 3641353216,3641353231,GB 3641353232,3641353247,IQ -3641353248,3641353343,GB +3641353248,3641353263,GB +3641353264,3641353343,A2 3641353344,3641353727,BD 3641353728,3641353759,NG 3641353760,3641353775,GB 3641353776,3641353807,NG -3641353808,3641353983,GB +3641353808,3641353831,GB +3641353832,3641353839,A2 +3641353840,3641353855,GB +3641353856,3641353983,A2 3641353984,3641354239,AF -3641354240,3641354751,GB +3641354240,3641354255,GB +3641354256,3641354311,A2 +3641354312,3641354319,GB +3641354320,3641354327,A2 +3641354328,3641354335,GB +3641354336,3641354339,A2 +3641354340,3641354367,GB +3641354368,3641354383,A2 +3641354384,3641354479,IT +3641354480,3641354495,A2 +3641354496,3641354751,GB 3641354752,3641355263,NG 3641355264,3641355519,AO -3641355520,3641355775,GB +3641355520,3641355583,A2 +3641355584,3641355599,GB +3641355600,3641355775,A2 3641355776,3641356031,LB -3641356032,3641356111,GB +3641356032,3641356111,A2 3641356112,3641356119,NG -3641356120,3641356191,GB +3641356120,3641356191,A2 3641356192,3641356207,NG -3641356208,3641359359,GB +3641356208,3641356287,A2 +3641356288,3641357311,GB +3641357312,3641357567,A2 +3641357568,3641357823,GB +3641357824,3641357855,A2 +3641357856,3641357879,GB +3641357880,3641357887,A2 +3641357888,3641357927,GB +3641357928,3641358079,A2 +3641358080,3641359359,GB 3641359360,3641359615,IQ -3641359616,3641360383,GB +3641359616,3641359639,GB +3641359640,3641359647,A2 +3641359648,3641359664,GB +3641359665,3641359871,A2 +3641359872,3641360383,GB 3641360384,3641368575,RO 3641368576,3641372671,GB 3641372672,3641376767,BG 3641376768,3641380863,IT -3641380864,3641384959,IR +3641380864,3641383991,IR +3641383992,3641383999,SE +3641384000,3641384959,IR 3641384960,3641389055,CH -3641389056,3641393151,DE -3641393152,3641401343,IT +3641389056,3641391807,DE +3641391808,3641391823,AT +3641391824,3641393151,DE +3641393152,3641397247,KZ +3641397248,3641401343,IT 3641401344,3641409535,ES 3641409536,3641417727,PL 3641417728,3641421823,GE 3641421824,3641425919,TJ 3641425920,3641430015,DE -3641430016,3641434111,KW +3641430016,3641434111,CH 3641434112,3641442303,CZ 3641442304,3641446399,GB 3641446400,3641450495,ES -3641450496,3641454591,IE +3641450496,3641454591,RU 3641454592,3641458687,SK -3641458688,3641462783,GB +3641458688,3641462783,RU 3641462784,3641466879,UZ 3641466880,3641470975,RU 3641470976,3641475071,MD @@ -79025,19 +128446,22 @@ 3641494016,3641495551,UA 3641495552,3641496063,RU 3641496064,3641499647,UA -3641499648,3641503743,DE +3641499648,3641503743,SA 3641503744,3641507839,RU 3641507840,3641516031,NO 3641516032,3641520127,HU 3641520128,3641524223,FR 3641524224,3641528319,DE 3641528320,3641532415,ES -3641532416,3641536511,RO +3641532416,3641536511,HU 3641536512,3641540607,ES 3641540608,3641548799,GB 3641548800,3641552895,DE 3641552896,3641556991,AT -3641556992,3641561087,DE +3641556992,3641559103,DE +3641559104,3641559135,NL +3641559136,3641560959,DE +3641560960,3641561087,NL 3641561088,3641565183,RU 3641565184,3641573375,SE 3641573376,3641577471,NO @@ -79045,6 +128469,7 @@ 3641581568,3641585663,ES 3641585664,3641589759,RU 3641589760,3641593855,CH +3641593856,3641597951,NG 3641597952,3641602047,AZ 3641602048,3641606143,DE 3641606144,3641607695,GB @@ -79063,41 +128488,40 @@ 3641655296,3641659391,GB 3641659392,3641663487,FR 3641663488,3641667583,MT -3641667584,3641668863,GB -3641668864,3641670655,ZW +3641667584,3641668607,GB +3641668608,3641670655,ZW 3641670656,3641670783,SO 3641670784,3641670791,NG 3641670792,3641670911,GB 3641670912,3641671679,LS 3641671680,3641679871,RU -3641679872,3641683967,GB +3641679872,3641683967,EU 3641683968,3641688063,KZ -3641688064,3641692159,GB +3641688064,3641692159,RU 3641692160,3641696255,IT 3641696256,3641700351,DE 3641700352,3641704447,SE -3641704448,3641704959,US -3641704960,3641708543,CY +3641704448,3641708543,FR 3641708544,3641712639,RU -3641712640,3641713447,NL -3641713448,3641713639,BE -3641713640,3641716735,NL +3641712640,3641716735,NL 3641716736,3641720831,GB 3641720832,3641729023,MK 3641729024,3641733119,DK 3641733120,3641737215,AT -3641737216,3641741311,HR +3641737216,3641741311,RS 3641741312,3641745407,ES 3641745408,3641749503,DE -3641749504,3641753599,RU +3641749504,3641753599,CZ 3641753600,3641757695,SE 3641757696,3641761791,GB -3641761792,3641761799,CY -3641761800,3641761803,GR -3641761804,3641761807,CY -3641761808,3641761851,GR +3641761792,3641761795,CY +3641761796,3641761851,GR 3641761852,3641761855,CY -3641761856,3641761923,GR +3641761856,3641761863,GR +3641761864,3641761867,CY +3641761868,3641761895,GR +3641761896,3641761899,CY +3641761900,3641761923,GR 3641761924,3641761927,CY 3641761928,3641761935,GR 3641761936,3641761939,CY @@ -79106,58 +128530,84 @@ 3641761972,3641762007,GR 3641762008,3641762011,CY 3641762012,3641762047,GR -3641762048,3641762703,CY +3641762048,3641762571,CY +3641762572,3641762575,GR +3641762576,3641762591,CY +3641762592,3641762595,GR +3641762596,3641762607,CY +3641762608,3641762611,GR +3641762612,3641762647,CY +3641762648,3641762655,GR +3641762656,3641762687,CY +3641762688,3641762691,GR +3641762692,3641762703,CY 3641762704,3641762711,GR 3641762712,3641762755,CY 3641762756,3641762759,GR 3641762760,3641762907,CY -3641762908,3641762947,GR +3641762908,3641762911,GR +3641762912,3641762943,CY +3641762944,3641762947,GR 3641762948,3641762951,CY 3641762952,3641762999,GR 3641763000,3641763003,CY 3641763004,3641763023,GR 3641763024,3641763035,CY 3641763036,3641763063,GR -3641763064,3641763327,CY -3641763328,3641763331,GR -3641763332,3641763335,CY -3641763336,3641763339,GR -3641763340,3641763427,CY -3641763428,3641763435,GR -3641763436,3641763439,CY +3641763064,3641763331,CY +3641763332,3641763339,GR +3641763340,3641763343,CY +3641763344,3641763347,GR +3641763348,3641763367,CY +3641763368,3641763371,GR +3641763372,3641763427,CY +3641763428,3641763431,GR +3641763432,3641763439,CY 3641763440,3641763443,GR -3641763444,3641763475,CY +3641763444,3641763451,CY +3641763452,3641763455,GR +3641763456,3641763475,CY 3641763476,3641763479,GR -3641763480,3641763515,CY -3641763516,3641763519,GR +3641763480,3641763491,CY +3641763492,3641763503,GR +3641763504,3641763511,CY +3641763512,3641763519,GR 3641763520,3641763582,CY 3641763583,3641763583,GR -3641763584,3641764231,CY +3641763584,3641764099,CY +3641764100,3641764103,GR +3641764104,3641764111,CY +3641764112,3641764115,GR +3641764116,3641764223,CY +3641764224,3641764227,GR +3641764228,3641764231,CY 3641764232,3641764239,GR 3641764240,3641764279,CY -3641764280,3641764283,GR -3641764284,3641764287,CY -3641764288,3641764291,GR +3641764280,3641764291,GR 3641764292,3641764303,CY 3641764304,3641764307,GR 3641764308,3641764319,CY 3641764320,3641764327,GR -3641764328,3641764607,CY -3641764608,3641764631,GR -3641764632,3641764635,CY -3641764636,3641764699,GR +3641764328,3641764347,CY +3641764348,3641764351,GR +3641764352,3641764607,CY +3641764608,3641764679,GR +3641764680,3641764683,CY +3641764684,3641764699,GR 3641764700,3641764703,CY -3641764704,3641764779,GR -3641764780,3641764787,CY -3641764788,3641764847,GR +3641764704,3641764711,GR +3641764712,3641764715,CY +3641764716,3641764775,GR +3641764776,3641764783,CY +3641764784,3641764787,GR +3641764788,3641764791,CY +3641764792,3641764847,GR 3641764848,3641764856,CY 3641764857,3641764863,GR -3641764864,3641764867,CY -3641764868,3641764871,GR -3641764872,3641764875,CY +3641764864,3641764875,CY 3641764876,3641764927,GR -3641764928,3641764931,CY -3641764932,3641764943,GR +3641764928,3641764935,CY +3641764936,3641764943,GR 3641764944,3641764951,CY 3641764952,3641764963,GR 3641764964,3641764967,CY @@ -79165,9 +128615,9 @@ 3641764976,3641764979,CY 3641764980,3641765023,GR 3641765024,3641765031,CY -3641765032,3641765087,GR -3641765088,3641765091,CY -3641765092,3641765119,GR +3641765032,3641765083,GR +3641765084,3641765087,CY +3641765088,3641765119,GR 3641765120,3641765631,CY 3641765632,3641765887,GR 3641765888,3641769983,ES @@ -79176,12 +128626,14 @@ 3641778176,3641782271,PL 3641782272,3641784079,GB 3641784080,3641786367,BG -3641786368,3641790463,DK +3641786368,3641790463,SE 3641790464,3641794559,LT 3641794560,3641798655,RS -3641798656,3641802751,GB +3641798656,3641802751,RU 3641802752,3641806847,NL -3641806848,3641809663,TR +3641806848,3641807871,TR +3641807872,3641808895,NL +3641808896,3641809663,TR 3641809664,3641809919,NL 3641809920,3641810315,TR 3641810316,3641810431,CY @@ -79202,35 +128654,46 @@ 3641835520,3641839615,IT 3641839616,3641843711,GB 3641843712,3641847807,ES -3641847808,3641851903,RU +3641847808,3641851903,IT 3641851904,3641855999,NL 3641856000,3641860095,GB 3641860096,3641868287,IT 3641868288,3641876479,RU 3641876480,3641880575,ES -3641880576,3641881447,DE +3641880576,3641881343,DE +3641881344,3641881359,US +3641881360,3641881391,DE +3641881392,3641881395,CH +3641881396,3641881399,DE +3641881400,3641881407,CH +3641881408,3641881423,DE +3641881424,3641881439,US +3641881440,3641881447,DE 3641881448,3641881455,CH 3641881456,3641881567,DE 3641881568,3641881583,CH -3641881584,3641884671,DE +3641881584,3641882727,DE +3641882728,3641882735,CH +3641882736,3641884671,DE 3641884672,3641888767,NO 3641888768,3641892863,IT -3641892864,3641896959,DK +3641892864,3641896959,ES 3641896960,3641901055,BG 3641901056,3641905151,RO 3641905152,3641909247,NL 3641909248,3641913343,AT 3641913344,3641917439,FR 3641917440,3641925631,GR -3641925632,3641929727,PL -3641929728,3641933823,RU +3641925632,3641933823,RU 3641933824,3641937919,GB 3641937920,3641942015,IT 3641942016,3641950207,DE 3641950208,3641954303,FR 3641954304,3641957887,MD 3641957888,3641957951,GB -3641957952,3641958399,MD +3641957952,3641958143,MD +3641958144,3641958207,GB +3641958208,3641958399,MD 3641958400,3641960699,BE 3641960700,3641960703,NL 3641960704,3641961727,BE @@ -79240,76 +128703,101 @@ 3641961800,3641962495,BE 3641962496,3641966591,GB 3641966592,3641970687,IT -3641970688,3641972247,GB -3641972248,3641972255,BG -3641972256,3641978879,GB -3641978880,3641987071,DK -3641987072,3641991167,RU +3641970688,3641978879,GB +3641978880,3641982975,DK +3641982976,3641991167,RU 3641991168,3641995263,SE 3641995264,3641999359,DE 3641999360,3642003455,HU -3642003456,3642007551,DE +3642003456,3642007551,RU 3642007552,3642015743,UA 3642015744,3642019839,CH -3642019840,3642023935,RU -3642028032,3642028288,GB -3642028289,3642028295,NG -3642028296,3642028303,GB -3642028304,3642028319,NG -3642028320,3642028327,AO -3642028328,3642028503,NG -3642028504,3642028511,GH -3642028512,3642028519,SO -3642028520,3642028543,CG -3642028544,3642028599,NG -3642028600,3642028607,GB -3642028608,3642028671,NG -3642028672,3642028703,GB -3642028704,3642028735,NG -3642028736,3642028767,GH -3642028768,3642028815,GB -3642028816,3642028823,GH -3642028824,3642028863,NG -3642028864,3642028959,GB -3642028960,3642028991,NG -3642028992,3642029051,GB -3642029052,3642029055,SO -3642029056,3642029183,GB -3642029184,3642029199,SA -3642029200,3642029215,GB -3642029216,3642029247,CD -3642029248,3642029407,GB -3642029408,3642029439,SO -3642029440,3642029567,GB -3642029568,3642029823,SL -3642029824,3642030079,GB -3642030080,3642030335,SL -3642030336,3642030623,GB -3642030624,3642030631,CY -3642030632,3642031519,GB -3642031520,3642031551,UG -3642031552,3642032127,GB +3642019840,3642023935,SY +3642023936,3642028031,EG +3642028032,3642028287,A2 +3642028288,3642028543,NG +3642028544,3642028544,A2 +3642028545,3642028799,NG +3642028800,3642028800,A2 +3642028801,3642028863,SO +3642028864,3642028928,A2 +3642028929,3642029055,NG +3642029056,3642029056,A2 +3642029057,3642029311,NG +3642029312,3642029312,A2 +3642029313,3642029567,GB +3642029568,3642031359,NG +3642031360,3642031615,GB +3642031616,3642031616,A2 +3642031617,3642031743,SL +3642031744,3642031871,A2 +3642031872,3642032127,GB 3642032128,3642036223,PS -3642036224,3642040319,RU 3642040320,3642048511,BY -3642048512,3642053439,IL +3642048512,3642053439,A2 3642053440,3642053631,TZ -3642053632,3642055935,IL -3642055936,3642056703,KE +3642053632,3642056703,A2 3642056704,3642060799,RU -3642064896,3642068991,GB -3642068992,3642073087,NL +3642060800,3642064895,KE +3642064896,3642068991,SE 3642073088,3642077183,LV -3642077184,3642081279,GB -3642081280,3642085375,DE +3642077184,3642081271,BE +3642081272,3642081278,US +3642081279,3642081279,BE +3642081280,3642085375,NL 3642085376,3642089471,RU 3642089472,3642093567,SE 3642093568,3642097663,NL 3642097664,3642101759,GB -3642101760,3642105855,NO -3642105856,3642109951,IT -3642109952,3642114047,BE -3642114048,3642118143,NL +3642101760,3642109951,NO +3642109952,3642110463,BE +3642110464,3642110991,NL +3642110992,3642111023,BE +3642111024,3642111103,NL +3642111104,3642111486,BE +3642111487,3642111791,NL +3642111792,3642111839,BE +3642111840,3642111887,NL +3642111888,3642111903,BE +3642111904,3642111919,NL +3642111920,3642111935,BE +3642111936,3642111951,NL +3642111952,3642111983,BE +3642111984,3642111999,NL +3642112000,3642112031,BE +3642112032,3642112047,NL +3642112048,3642112063,BE +3642112064,3642112143,NL +3642112144,3642112159,BE +3642112160,3642112207,NL +3642112208,3642112239,BE +3642112240,3642112351,NL +3642112352,3642112383,BE +3642112384,3642112415,NL +3642112416,3642112447,BE +3642112448,3642112527,NL +3642112528,3642112543,BE +3642112544,3642112559,NL +3642112560,3642112575,BE +3642112576,3642112591,NL +3642112592,3642112607,BE +3642112608,3642112623,NL +3642112624,3642112655,BE +3642112656,3642112671,NL +3642112672,3642112687,BE +3642112688,3642112719,NL +3642112720,3642112751,BE +3642112752,3642112767,NL +3642112768,3642112831,BE +3642112832,3642113023,NL +3642113024,3642113215,BE +3642113216,3642113279,NL +3642113280,3642113311,BE +3642113312,3642113791,NL +3642113792,3642113823,BE +3642113824,3642113855,NL +3642113856,3642113919,BE +3642113920,3642118143,NL 3642118144,3642122239,GB 3642122240,3642126335,ES 3642126336,3642130431,IL @@ -79319,7 +128807,11 @@ 3642142720,3642146815,MT 3642146816,3642150911,DE 3642150912,3642163199,IT -3642163200,3642167295,PT +3642163200,3642164046,NL +3642164047,3642164048,AF +3642164049,3642164595,NL +3642164596,3642164663,HK +3642164664,3642167295,NL 3642167296,3642171391,RU 3642171392,3642175487,JO 3642175488,3642179583,DE @@ -79347,25 +128839,31 @@ 3642220544,3642224639,GB 3642224640,3642228735,SK 3642228736,3642232831,DE -3642232832,3642233855,CS -3642233856,3642236927,CS +3642232832,3642236927,RS 3642236928,3642241023,CH 3642241024,3642245119,DE -3642245120,3642249215,BE +3642245120,3642249215,LV 3642249216,3642253311,FR -3642253312,3642257407,DE +3642253312,3642257407,FI 3642257408,3642261503,RU 3642261504,3642265599,GB -3642265600,3642266879,IR -3642266880,3642267135,AE -3642267136,3642269695,IR +3642265600,3642266111,AE +3642266112,3642266367,IR +3642266368,3642266623,AE +3642266624,3642269695,IR 3642269696,3642273791,UA 3642273792,3642277887,RU 3642277888,3642290175,DE 3642290176,3642294271,AL 3642294272,3642298367,GB 3642298368,3642302463,AZ -3642302464,3642306559,SE +3642302464,3642302759,SE +3642302760,3642302764,GB +3642302765,3642302975,SE +3642302976,3642303007,GB +3642303008,3642304031,SE +3642304032,3642304036,GB +3642304037,3642306559,SE 3642306560,3642310655,IR 3642310656,3642314751,DE 3642314752,3642318847,RU @@ -79373,31 +128871,28 @@ 3642322944,3642327039,AT 3642327040,3642331135,DE 3642331136,3642335231,RU -3642335232,3642339327,UA +3642335232,3642339327,DE 3642339328,3642343423,FR 3642343424,3642347519,UA 3642347520,3642355711,RU 3642355712,3642359807,SE 3642359808,3642367999,RU 3642368000,3642376191,CH -3642376192,3642376447,CS -3642376448,3642377215,CS -3642377216,3642379519,CS -3642379520,3642379711,CS -3642379712,3642380031,CS -3642380032,3642380063,CS -3642380064,3642380287,CS +3642376192,3642380287,RS 3642380288,3642384383,IT -3642384384,3642388479,NO -3642388480,3642392575,NL -3642392576,3642396671,SE +3642384384,3642392575,NL +3642392576,3642396671,AM 3642396672,3642404863,MD 3642404864,3642408959,RU 3642408960,3642413055,FR -3642413056,3642414591,CS -3642414592,3642417151,GB +3642413056,3642414591,RS +3642414592,3642415627,GB +3642415628,3642415635,MT +3642415636,3642415651,GB +3642415652,3642415655,MT +3642415656,3642417151,GB 3642417152,3642421247,IT -3642421248,3642425343,ES +3642421248,3642425343,A2 3642425344,3642429439,DE 3642429440,3642433535,GB 3642433536,3642435583,CY @@ -79412,22 +128907,23 @@ 3642439484,3642439495,RU 3642439496,3642439551,CY 3642439552,3642439567,RU -3642439568,3642440447,CY -3642440448,3642440451,RU -3642440452,3642441727,CY +3642439568,3642441727,CY 3642441728,3642449919,IT 3642449920,3642454015,CH 3642454016,3642458111,IT -3642458112,3642462207,DE +3642458112,3642462207,RU 3642462208,3642466303,UA 3642466304,3642474495,SE 3642474496,3642478591,DE 3642478592,3642482687,HU -3642482688,3642499071,GB +3642482688,3642486783,NL +3642486784,3642490879,GB +3642490880,3642494975,IM +3642494976,3642499071,GB 3642499072,3642503167,SE 3642503168,3642507263,LV -3642507264,3642511359,FR -3642511360,3642515455,RU +3642507264,3642509311,FR +3642509312,3642511359,RU 3642515456,3642519551,DE 3642519552,3642523647,IT 3642523648,3642527743,GB @@ -79436,61 +128932,82 @@ 3642532352,3642532607,GB 3642532608,3642532863,US 3642532864,3642535935,DK -3642535936,3642540031,IS +3642535936,3642539869,IS +3642539870,3642539870,GB +3642539871,3642539971,IS +3642539972,3642539975,DK +3642539976,3642540031,IS 3642540032,3642544127,SE -3642544128,3642548223,RU -3642548224,3642552319,DE -3642552320,3642552639,NL +3642544128,3642552319,RU +3642552320,3642552639,UA 3642552640,3642552655,EE 3642552656,3642552663,HU -3642552664,3642552671,NL +3642552664,3642552665,EE +3642552666,3642552671,UA 3642552672,3642552687,SE -3642552688,3642553103,NL -3642553104,3642553115,LV -3642553116,3642553151,NL -3642553152,3642553163,LV -3642553164,3642553167,NL -3642553168,3642553183,LV -3642553184,3642553215,NL -3642553216,3642553279,LV -3642553280,3642553343,NL -3642553344,3642553363,RU -3642553364,3642553379,NL -3642553380,3642553417,RU -3642553418,3642553419,NL -3642553420,3642553519,RU -3642553520,3642553523,NL +3642552688,3642552831,UA +3642552832,3642552847,EE +3642552848,3642553095,UA +3642553096,3642553097,LV +3642553098,3642553103,UA +3642553104,3642553139,LV +3642553140,3642553143,UA +3642553144,3642553175,LV +3642553176,3642553183,UA +3642553184,3642553335,LV +3642553336,3642553343,UA +3642553344,3642553371,RU +3642553372,3642553375,UA +3642553376,3642553377,RU +3642553378,3642553379,UA +3642553380,3642553383,RU +3642553384,3642553387,UA +3642553388,3642553411,RU +3642553412,3642553415,UA +3642553416,3642553423,RU +3642553424,3642553431,UA +3642553432,3642553463,RU +3642553464,3642553467,UA +3642553468,3642553519,RU +3642553520,3642553523,UA 3642553524,3642553535,RU 3642553536,3642553543,DE -3642553544,3642553551,NL -3642553552,3642553575,RU -3642553576,3642554111,NL -3642554112,3642554143,RU -3642554144,3642554175,NL -3642554176,3642554185,RU -3642554186,3642554187,NL -3642554188,3642554193,RU -3642554194,3642554239,NL +3642553544,3642553589,RU +3642553590,3642553591,UA +3642553592,3642553599,RU +3642553600,3642553855,UA +3642553856,3642553925,RU +3642553926,3642553935,UA +3642553936,3642553951,RU +3642553952,3642554111,UA +3642554112,3642554119,RU +3642554120,3642554123,UA +3642554124,3642554151,RU +3642554152,3642554177,UA +3642554178,3642554203,RU +3642554204,3642554205,UA +3642554206,3642554223,RU +3642554224,3642554239,UA 3642554240,3642554271,RU -3642554272,3642554367,NL -3642554368,3642554375,LT -3642554376,3642554383,NL -3642554384,3642554391,LT -3642554392,3642554395,NL -3642554396,3642554623,LT -3642554624,3642554631,NL -3642554632,3642554675,LV -3642554676,3642554679,EE -3642554680,3642554799,LV -3642554800,3642554807,EE -3642554808,3642554879,LV +3642554272,3642554367,UA +3642554368,3642554623,LT +3642554624,3642554631,UA +3642554632,3642554671,LV +3642554672,3642554675,UA +3642554676,3642554687,LV +3642554688,3642554751,UA +3642554752,3642554791,LV +3642554792,3642554807,UA +3642554808,3642554815,LV +3642554816,3642554847,UA +3642554848,3642554879,LV 3642554880,3642554911,DE -3642554912,3642554915,NL -3642554916,3642554927,DE -3642554928,3642554951,UA -3642554952,3642554955,DE -3642554956,3642554959,GE -3642554960,3642554967,UA +3642554912,3642554919,NL +3642554920,3642554931,DE +3642554932,3642554951,UA +3642554952,3642554959,GE +3642554960,3642554963,DE +3642554964,3642554967,UA 3642554968,3642554971,LV 3642554972,3642554975,DE 3642554976,3642554977,CZ @@ -79501,45 +129018,71 @@ 3642554990,3642554991,UA 3642554992,3642555015,DE 3642555016,3642555017,NL -3642555018,3642555021,DE -3642555022,3642555151,NL -3642555152,3642555223,LT +3642555018,3642555023,DE +3642555024,3642555039,NL +3642555040,3642555045,DE +3642555046,3642555047,UA +3642555048,3642555051,DE +3642555052,3642555055,UA +3642555056,3642555067,DE +3642555068,3642555069,NL +3642555070,3642555071,DE +3642555072,3642555087,GE +3642555088,3642555135,UA +3642555136,3642555153,LT +3642555154,3642555167,UA +3642555168,3642555183,LT +3642555184,3642555199,UA +3642555200,3642555223,LT 3642555224,3642555227,LV -3642555228,3642555259,LT -3642555260,3642555263,NL -3642555264,3642555391,LT -3642555392,3642555451,PL -3642555452,3642555647,NL +3642555228,3642555391,LT +3642555392,3642555499,PL +3642555500,3642555647,UA 3642555648,3642555683,SE -3642555684,3642555687,NL +3642555684,3642555687,UA 3642555688,3642555695,SE 3642555696,3642555703,LV 3642555704,3642555707,FI -3642555708,3642555711,NL +3642555708,3642555711,SE 3642555712,3642555727,RU -3642555728,3642555935,NL -3642555936,3642555983,UA -3642555984,3642556159,NL +3642555728,3642555735,SE +3642555736,3642555743,GB +3642555744,3642555759,SE +3642555760,3642555771,GB +3642555772,3642555783,SE +3642555784,3642555787,GB +3642555788,3642555789,UA +3642555790,3642555791,SE +3642555792,3642555839,UA +3642555840,3642555903,SE +3642555904,3642556159,UA 3642556160,3642556415,LV -3642556416,3642560511,DE +3642556416,3642560511,CZ 3642560512,3642564607,KG 3642564608,3642568703,DE -3642568704,3642572799,GB +3642568704,3642572799,RU 3642572800,3642576895,IT 3642576896,3642580991,RU -3642580992,3642585087,DE -3642585088,3642585855,RU -3642585856,3642586111,US -3642586112,3642589183,UZ +3642580992,3642585087,ES +3642585088,3642589183,UZ +3642589184,3642593279,EG 3642593280,3642597375,AT 3642597376,3642601471,IT 3642601472,3642605567,RU 3642605568,3642609663,GB -3642613760,3642615295,FI -3642615296,3642615551,NO -3642615552,3642615583,FI +3642609664,3642613759,DZ +3642613760,3642614527,AX +3642614528,3642614783,FI +3642614784,3642615103,AX +3642615104,3642615167,FI +3642615168,3642615295,AX +3642615296,3642615551,FI +3642615552,3642615567,AX +3642615568,3642615583,FI 3642615584,3642615615,AX -3642615616,3642617855,FI +3642615616,3642615679,FI +3642615680,3642616383,AX +3642616384,3642617855,FI 3642617856,3642621951,JO 3642621952,3642626047,IT 3642626048,3642630143,BE @@ -79550,15 +129093,15 @@ 3642646528,3642650623,MT 3642650624,3642654719,GB 3642654720,3642662911,PL -3642662912,3642667007,GR +3642662912,3642667007,UZ 3642667008,3642671103,FI -3642671104,3642675199,IT +3642671104,3642675199,UA 3642675200,3642679295,BG 3642679296,3642683391,DE 3642683392,3642687487,RU 3642687488,3642691583,GB 3642691584,3642695679,DE -3642695680,3642699775,ES +3642695680,3642699775,SK 3642699776,3642703871,CZ 3642703872,3642707967,LU 3642707968,3642712063,DE @@ -79570,28 +129113,28 @@ 3642740736,3642744831,DE 3642744832,3642753023,TR 3642753024,3643801599,GB -3643801600,3644031487,DE -3644031488,3644031743,GB -3644031744,3644033023,DE -3644033024,3644033151,GB -3644033152,3644033279,DE -3644033280,3644033407,GB -3644033408,3644063743,DE +3643801600,3644063743,DE +3644063744,3644325887,EG 3644325888,3644588031,IT 3644588032,3644719103,DK 3644719104,3644809215,NL +3644809216,3644817407,AM 3644817408,3644850175,NL 3644850176,3644854271,CZ 3644854272,3644858367,AZ -3644858368,3644862463,GB +3644858368,3644862463,FI 3644862464,3644866559,FR 3644866560,3644871167,DE 3644871168,3644871423,AT 3644871424,3644874751,DE -3644878848,3644887039,GB -3644887040,3644891135,TR +3644874752,3644878847,ML +3644878848,3644882943,GB +3644882944,3644887039,RU +3644887040,3644891135,IR 3644891136,3644895231,DE -3644895232,3644899327,FI +3644895232,3644899047,FI +3644899048,3644899055,AX +3644899056,3644899327,FI 3644899328,3644903423,IT 3644903424,3644907519,TR 3644907520,3644908983,GB @@ -79602,16 +129145,29 @@ 3644911616,3644915711,BE 3644915712,3644919807,RU 3644919808,3644923903,DE -3644923904,3644927999,IL +3644923904,3644924159,IL +3644924160,3644924671,GB +3644924672,3644924927,IL +3644924928,3644925183,US +3644925184,3644925439,IL +3644925440,3644925695,GB +3644925696,3644925951,IL +3644925952,3644927231,US +3644927232,3644927743,IL +3644927744,3644927999,US 3644928000,3644932095,GI 3644932096,3644936191,IT 3644936192,3644940287,RU 3644940288,3644948479,HU 3644948480,3644952575,DE 3644952576,3644960767,GB -3644960768,3644964863,DE -3644964864,3644965479,CS -3644965480,3644968959,CS +3644960768,3644961311,DE +3644961312,3644961343,TR +3644961344,3644961791,DE +3644961792,3644964351,TR +3644964352,3644964383,DE +3644964384,3644964863,TR +3644964864,3644968959,RS 3644968960,3644973055,RU 3644973056,3644977151,NO 3644977152,3644981247,UA @@ -79623,27 +129179,145 @@ 3645009920,3645014015,FR 3645014016,3645018111,DE 3645018112,3645022207,RU -3645022208,3645030143,CZ +3645022208,3645023743,CZ +3645023744,3645023999,SK +3645024000,3645030143,CZ 3645030144,3645030399,SK 3645030400,3645038591,IR 3645038592,3645046783,PS 3645046784,3645050879,RU -3645050880,3645054975,SK +3645050880,3645051059,SK +3645051060,3645051063,CZ +3645051064,3645051131,SK +3645051132,3645051135,CZ +3645051136,3645051223,SK +3645051224,3645051247,CZ +3645051248,3645051255,SK +3645051256,3645051279,CZ +3645051280,3645051379,SK +3645051380,3645051383,CZ +3645051384,3645051439,SK +3645051440,3645051455,CZ +3645051456,3645051555,SK +3645051556,3645051559,CZ +3645051560,3645051567,SK +3645051568,3645051583,CZ +3645051584,3645051599,SK +3645051600,3645051615,CZ +3645051616,3645051639,SK +3645051640,3645051647,CZ +3645051648,3645051671,SK +3645051672,3645051711,CZ +3645051712,3645051719,SK +3645051720,3645051727,CZ +3645051728,3645051775,SK +3645051776,3645051791,CZ +3645051792,3645051815,SK +3645051816,3645051823,CZ +3645051824,3645051887,SK +3645051888,3645051899,CZ +3645051900,3645051943,SK +3645051944,3645051951,CZ +3645051952,3645051967,SK +3645051968,3645051975,CZ +3645051976,3645051979,SK +3645051980,3645051999,CZ +3645052000,3645052015,SK +3645052016,3645052031,CZ +3645052032,3645052095,SK +3645052096,3645052103,CZ +3645052104,3645052127,SK +3645052128,3645052143,CZ +3645052144,3645052183,SK +3645052184,3645052191,CZ +3645052192,3645052263,SK +3645052264,3645052287,CZ +3645052288,3645052351,SK +3645052352,3645052367,CZ +3645052368,3645052407,SK +3645052408,3645052415,CZ +3645052416,3645052423,SK +3645052424,3645052431,CZ +3645052432,3645052447,SK +3645052448,3645052455,CZ +3645052456,3645052591,SK +3645052592,3645052599,CZ +3645052600,3645052607,SK +3645052608,3645052631,CZ +3645052632,3645052655,SK +3645052656,3645052663,CZ +3645052664,3645052943,SK +3645052944,3645052951,CZ +3645052952,3645052983,SK +3645052984,3645052991,CZ +3645052992,3645052999,SK +3645053000,3645053007,CZ +3645053008,3645053015,SK +3645053016,3645053023,CZ +3645053024,3645053079,SK +3645053080,3645053087,CZ +3645053088,3645053095,SK +3645053096,3645053099,CZ +3645053100,3645053123,SK +3645053124,3645053131,CZ +3645053132,3645053135,SK +3645053136,3645053139,CZ +3645053140,3645053143,SK +3645053144,3645053167,CZ +3645053168,3645053179,SK +3645053180,3645053183,CZ +3645053184,3645053263,SK +3645053264,3645053271,CZ +3645053272,3645053287,SK +3645053288,3645053295,CZ +3645053296,3645053311,SK +3645053312,3645053319,CZ +3645053320,3645053343,SK +3645053344,3645053351,CZ +3645053352,3645053535,SK +3645053536,3645053543,CZ +3645053544,3645053647,SK +3645053648,3645053663,CZ +3645053664,3645053727,SK +3645053728,3645053735,CZ +3645053736,3645053743,SK +3645053744,3645053751,CZ +3645053752,3645053911,SK +3645053912,3645053919,CZ +3645053920,3645053923,SK +3645053924,3645053927,CZ +3645053928,3645053951,SK +3645053952,3645053959,CZ +3645053960,3645053963,SK +3645053964,3645053967,CZ +3645053968,3645053999,SK +3645054000,3645054007,CZ +3645054008,3645054255,SK +3645054256,3645054263,CZ +3645054264,3645054303,SK +3645054304,3645054311,CZ +3645054312,3645054315,SK +3645054316,3645054319,CZ +3645054320,3645054351,SK +3645054352,3645054359,CZ +3645054360,3645054383,SK +3645054384,3645054399,CZ +3645054400,3645054975,SK 3645054976,3645059071,DE 3645059072,3645063167,GB -3645063168,3645067263,BE +3645063168,3645067263,UA 3645067264,3645071359,SE 3645071360,3645075455,DE 3645075456,3645079551,RU 3645079552,3645083647,IE -3645083648,3645087743,RU -3645087744,3645091839,GB +3645083648,3645087743,FR +3645087744,3645091839,ES 3645091840,3645095935,RU 3645095936,3645104127,PL 3645104128,3645112319,NL -3645112320,3645113631,DE -3645113632,3645113639,TR -3645113640,3645116415,DE +3645112320,3645113735,DE +3645113736,3645113743,MK +3645113744,3645116415,DE 3645116416,3645120511,GB 3645120512,3645124607,SE 3645124608,3645128703,NL @@ -79659,12 +129333,11 @@ 3645150616,3645150623,US 3645150624,3645150975,DE 3645150976,3645151231,US -3645151232,3645151263,DK -3645151264,3645151487,DE +3645151232,3645151487,DE 3645151488,3645151615,MT -3645151616,3645151743,DE -3645151744,3645151771,CH -3645151772,3645161471,DE +3645151616,3645152767,DE +3645152768,3645152799,HK +3645152800,3645161471,DE 3645161472,3645165567,AT 3645165568,3645169663,TR 3645169664,3645173759,CH @@ -79672,21 +129345,24 @@ 3645177856,3645181951,GR 3645181952,3645183327,FR 3645183328,3645183359,GB -3645183360,3645183615,FR +3645183360,3645183439,FR +3645183440,3645183455,US +3645183456,3645183615,FR 3645183616,3645183679,SA 3645183680,3645183743,FR 3645183744,3645183871,GB -3645183872,3645183999,FR -3645184000,3645184255,US -3645184256,3645184256,FR -3645184257,3645184383,GB -3645184384,3645186047,FR +3645183872,3645183903,FR +3645183904,3645183935,IE +3645183936,3645184256,FR +3645184257,3645184447,GB +3645184448,3645186047,FR 3645186048,3645190143,GB 3645190144,3645194239,FI 3645194240,3645202431,DE 3645202432,3645206527,CZ -3645206528,3645210623,RU -3645210624,3645214719,DE +3645206528,3645208575,LV +3645208576,3645210623,LT +3645210624,3645214719,RU 3645214720,3645218815,NL 3645218816,3645222911,DE 3645222912,3645227007,KW @@ -79704,26 +129380,29 @@ 3645281280,3645281535,DE 3645281536,3645281791,IT 3645281792,3645281919,HU -3645281920,3645282047,IT -3645282048,3645282303,DE -3645282304,3645284351,IT +3645281920,3645284351,IT 3645284352,3645288447,DE 3645288448,3645292543,FR 3645292544,3645295103,DE 3645295104,3645295359,NL 3645295360,3645296639,DE 3645296640,3645300735,NL +3645300736,3645304831,BE 3645304832,3645308927,ES -3645308928,3645313023,GB +3645308928,3645313023,DK 3645313024,3645317119,ES 3645317120,3645321215,EE 3645321216,3645325311,BA 3645325312,3645329407,IT 3645329408,3645333503,CH -3645333504,3645334015,DE -3645335040,3645336927,DE -3645336936,3645336975,DE +3645333504,3645334031,DE +3645334032,3645334271,EU +3645334272,3645336927,DE +3645336928,3645336935,EU +3645336936,3645336991,DE +3645336992,3645337007,EU 3645337008,3645337023,DE +3645337024,3645337087,EU 3645337088,3645337599,DE 3645337600,3645337631,FR 3645337632,3645337663,BE @@ -79747,8 +129426,9 @@ 3645349888,3645353983,RU 3645353984,3645358079,MT 3645358080,3645362175,ES -3645362176,3645366271,FR -3645366272,3645370367,GB +3645362176,3645364223,FR +3645364224,3645366271,DE +3645366272,3645370367,RU 3645370368,3645374463,CH 3645374464,3645378559,RU 3645378560,3645382655,SE @@ -79756,9 +129436,8 @@ 3645386752,3645390847,SE 3645390848,3645399039,SI 3645399040,3645403135,IT -3645403136,3645404671,DE -3645404672,3645405183,CH -3645405184,3645408255,DE +3645403136,3645407231,GB +3645407232,3645408255,DE 3645408256,3645408319,CH 3645408320,3645411327,DE 3645411328,3645415423,RU @@ -79769,20 +129448,16 @@ 3645440000,3645444095,SE 3645444096,3645448191,SK 3645448192,3645456383,DE -3645456384,3645456639,GB -3645456640,3645456895,DE -3645456896,3645457407,GB -3645457408,3645460479,DE -3645460480,3645464575,GB +3645456384,3645460479,GB +3645460480,3645464575,UA 3645464576,3645468671,SE 3645468672,3645472767,RU 3645472768,3645476863,UA 3645476864,3645480959,DE 3645480960,3645485055,RO -3645485056,3645489151,MT 3645489152,3645493247,RU 3645493248,3645501439,IT -3645501440,3645505535,RU +3645501440,3645505535,PL 3645505536,3645506559,DE 3645506560,3645506815,AT 3645506816,3645507583,DE @@ -79805,13 +129480,14 @@ 3645545216,3645550591,RU 3645550592,3645558783,DE 3645558784,3645562879,DK -3645562880,3645563135,PK +3645562880,3645563135,ZW 3645563136,3645564671,LS -3645564672,3645564927,PK +3645564672,3645564927,ZW 3645564928,3645565055,SO -3645565056,3645565439,GB -3645565440,3645565951,NG -3645565952,3645566975,ZW +3645565056,3645565183,GB +3645565184,3645565439,ZW +3645565440,3645565695,GB +3645565696,3645566975,ZW 3645566976,3645571071,RU 3645571072,3645575167,IE 3645575168,3645579263,CH @@ -79831,7 +129507,7 @@ 3645620224,3645624319,BA 3645624320,3645628415,CZ 3645628416,3645636607,ES -3645636608,3645640703,IT +3645636608,3645640703,AM 3645640704,3645644799,NL 3645644800,3645648895,RU 3645648896,3645652991,SE @@ -79842,7 +129518,9 @@ 3645669376,3645669631,ES 3645669632,3645669855,FR 3645669856,3645670399,ES -3645670400,3645670911,FR +3645670400,3645670527,FR +3645670528,3645670655,ES +3645670656,3645670911,FR 3645670912,3645673471,ES 3645673472,3645673535,FR 3645673536,3645675263,ES @@ -79862,6 +129540,7 @@ 3645706240,3645710335,LT 3645710336,3645714431,NO 3645714432,3645718527,RU +3645718528,3645722623,GA 3645722624,3645726719,IT 3645726720,3645734911,RU 3645734912,3645743103,NL @@ -79875,7 +129554,7 @@ 3645763588,3645763588,DE 3645763589,3645763589,IE 3645763590,3645763590,ES -3645763591,3645763591,IT +3645763591,3645763591,BE 3645763592,3645763593,DE 3645763594,3645763594,CH 3645763595,3645763595,IT @@ -79914,8 +129593,7 @@ 3645763640,3645763640,HU 3645763641,3645763641,IT 3645763642,3645763642,GB -3645763643,3645763644,DE -3645763645,3645763645,NL +3645763643,3645763645,DE 3645763646,3645763647,ES 3645763648,3645763648,DE 3645763649,3645763649,IL @@ -79930,8 +129608,7 @@ 3645763666,3645763666,NL 3645763667,3645763667,DE 3645763668,3645763668,IT -3645763669,3645763669,DK -3645763670,3645763670,DE +3645763669,3645763670,DE 3645763671,3645763671,FR 3645763672,3645763672,DE 3645763673,3645763673,BE @@ -79967,7 +129644,9 @@ 3645763708,3645763708,GR 3645763709,3645763709,NL 3645763710,3645763710,GB -3645763711,3645763715,NL +3645763711,3645763713,NL +3645763714,3645763714,DE +3645763715,3645763715,NL 3645763716,3645763716,DE 3645763717,3645763717,NL 3645763718,3645763718,DE @@ -80032,8 +129711,7 @@ 3645763793,3645763793,ES 3645763794,3645763794,DE 3645763795,3645763795,IT -3645763796,3645763796,GB -3645763797,3645763797,DE +3645763796,3645763797,DE 3645763798,3645763798,FR 3645763799,3645763801,DE 3645763802,3645763802,ES @@ -80063,11 +129741,11 @@ 3645763851,3645763851,GB 3645763852,3645763852,DE 3645763853,3645763853,CH -3645763854,3645763855,NL -3645763856,3645763858,DE +3645763854,3645763854,NL +3645763855,3645763858,DE 3645763859,3645763859,DK 3645763860,3645763860,IT -3645763861,3645763861,BE +3645763861,3645763861,DE 3645763862,3645763862,FR 3645763863,3645763864,ES 3645763865,3645763865,CH @@ -80099,7 +129777,7 @@ 3645763901,3645763902,LU 3645763903,3645763903,DE 3645763904,3645763904,BE -3645763905,3645763905,CS +3645763905,3645763905,RS 3645763906,3645763906,DE 3645763907,3645763908,IT 3645763909,3645763909,DE @@ -80110,7 +129788,8 @@ 3645763914,3645763914,DE 3645763915,3645763915,IL 3645763916,3645763916,BE -3645763917,3645763918,IT +3645763917,3645763917,DE +3645763918,3645763918,IT 3645763919,3645763919,GB 3645763920,3645763920,DE 3645763921,3645763921,CH @@ -80128,7 +129807,7 @@ 3645763934,3645763934,IT 3645763935,3645763935,FR 3645763936,3645763936,DE -3645763937,3645763937,NL +3645763937,3645763937,FR 3645763938,3645763938,ES 3645763939,3645763939,NL 3645763940,3645763941,DE @@ -80176,7 +129855,8 @@ 3645763988,3645763988,CH 3645763989,3645763989,FR 3645763990,3645763991,DE -3645763992,3645763993,NL +3645763992,3645763992,NL +3645763993,3645763993,DE 3645763994,3645763994,IT 3645763995,3645763995,ES 3645763996,3645764000,DE @@ -80189,21 +129869,19 @@ 3645764014,3645764015,GB 3645764016,3645764016,IT 3645764017,3645764017,GB -3645764018,3645764018,ES +3645764018,3645764018,DE 3645764019,3645764019,NL 3645764020,3645764020,IT 3645764021,3645764021,DE 3645764022,3645764022,ES 3645764023,3645764023,FR 3645764024,3645764026,ES -3645764027,3645764027,HU -3645764028,3645764028,DE +3645764027,3645764028,DE 3645764029,3645764029,ES 3645764030,3645764030,DE -3645764031,3645764031,ES +3645764031,3645764031,NL 3645764032,3645764032,FR -3645764033,3645764033,ES -3645764034,3645764034,DE +3645764033,3645764034,DE 3645764035,3645764035,IT 3645764036,3645764037,ES 3645764038,3645764038,IT @@ -80215,8 +129893,7 @@ 3645764044,3645764044,ES 3645764045,3645764045,AE 3645764046,3645764046,ES -3645764047,3645764047,DE -3645764048,3645764048,BE +3645764047,3645764048,DE 3645764049,3645764049,ES 3645764050,3645764051,DE 3645764052,3645764052,FR @@ -80247,14 +129924,15 @@ 3645764085,3645764085,IE 3645764086,3645764086,IT 3645764087,3645764087,CH -3645764088,3645764093,DE +3645764088,3645764091,DE +3645764092,3645764092,FR +3645764093,3645764093,DE 3645764094,3645764094,IT 3645764095,3645764097,DE 3645764098,3645764098,IT 3645764099,3645764099,DE 3645764100,3645764100,BE -3645764101,3645764101,DE -3645764102,3645764102,PL +3645764101,3645764102,DE 3645764103,3645764103,SK 3645764104,3645764105,IT 3645764106,3645764106,NL @@ -80289,8 +129967,7 @@ 3645764136,3645764136,BE 3645764137,3645764137,DE 3645764138,3645764138,CH -3645764139,3645764139,PL -3645764140,3645764140,NL +3645764139,3645764140,DE 3645764141,3645764141,ES 3645764142,3645764142,HU 3645764143,3645764145,DE @@ -80367,9 +130044,7 @@ 3645764229,3645764229,PL 3645764230,3645764230,NL 3645764231,3645764231,CH -3645764232,3645764232,DE -3645764233,3645764233,IT -3645764234,3645764234,DE +3645764232,3645764234,DE 3645764235,3645764235,FR 3645764236,3645764236,IT 3645764237,3645764238,DE @@ -80380,8 +130055,7 @@ 3645764244,3645764244,FR 3645764245,3645764246,NL 3645764247,3645764247,IT -3645764248,3645764249,DE -3645764250,3645764250,GB +3645764248,3645764250,DE 3645764251,3645764251,FR 3645764252,3645764253,ES 3645764254,3645764254,DE @@ -80394,8 +130068,7 @@ 3645764262,3645764262,BE 3645764263,3645764264,IT 3645764265,3645764265,TR -3645764266,3645764266,NL -3645764267,3645764268,DE +3645764266,3645764268,DE 3645764269,3645764270,ES 3645764271,3645764271,IT 3645764272,3645764272,DE @@ -80575,7 +130248,9 @@ 3645764506,3645764506,DE 3645764507,3645764507,ES 3645764508,3645764508,IT -3645764509,3645764511,NL +3645764509,3645764509,NL +3645764510,3645764510,DE +3645764511,3645764511,NL 3645764512,3645764512,DE 3645764513,3645764513,NL 3645764514,3645764514,ES @@ -80585,8 +130260,8 @@ 3645764519,3645764522,NL 3645764523,3645764523,DE 3645764524,3645764531,NL -3645764532,3645764532,DE -3645764533,3645764535,NL +3645764532,3645764533,DE +3645764534,3645764535,NL 3645764536,3645764536,IT 3645764537,3645764539,NL 3645764540,3645764540,DE @@ -80640,10 +130315,9 @@ 3645765268,3645765271,PL 3645765272,3645765275,IT 3645765276,3645765279,FR -3645765280,3645765283,GB +3645765280,3645765283,DE 3645765284,3645765287,ES -3645765288,3645765291,IT -3645765292,3645765295,DE +3645765288,3645765295,DE 3645765296,3645765299,ES 3645765300,3645765303,FR 3645765304,3645765311,IT @@ -80703,8 +130377,7 @@ 3645765568,3645765571,FR 3645765572,3645765575,DE 3645765576,3645765579,IT -3645765580,3645765583,GB -3645765584,3645765591,DE +3645765580,3645765591,DE 3645765592,3645765595,IE 3645765596,3645765611,DE 3645765612,3645765615,IT @@ -80727,7 +130400,9 @@ 3645765708,3645765711,FR 3645765712,3645765715,DE 3645765716,3645765719,FR -3645765720,3645767187,DE +3645765720,3645766401,DE +3645766402,3645766407,US +3645766408,3645767187,DE 3645767188,3645767188,US 3645767189,3645767193,DE 3645767194,3645767194,US @@ -80757,42 +130432,46 @@ 3645767680,3645771775,IE 3645771776,3645779967,SE 3645779968,3645784063,PS +3645784064,3645788159,NG 3645788160,3645792255,GB -3645792256,3645796351,NO 3645796352,3645800447,CH 3645800448,3645804543,DE 3645804544,3645808639,GB 3645808640,3645812735,DE 3645812736,3645816831,RU 3645816832,3645825023,FI -3645825024,3645829119,GR 3645829120,3645833215,NL -3645833216,3645837311,DE -3645837312,3645841407,RU +3645833216,3645841407,RU 3645841408,3645845503,BG 3645845504,3645849599,RU 3645849600,3645857791,BG 3645857792,3645865983,GB 3645865984,3645870079,HU 3645870080,3645874175,PL -3645874176,3645875711,GB -3645875712,3645877247,DE -3645877248,3645878271,NL +3645874176,3645878271,GB 3645878272,3645882367,DE -3645882368,3645886463,GB -3645886464,3645888127,DE +3645882368,3645886463,CH +3645886464,3645886991,DE +3645886992,3645886995,GB +3645886996,3645887067,DE +3645887068,3645887071,US +3645887072,3645887079,AT +3645887080,3645887743,DE +3645887744,3645887871,US +3645887872,3645888127,DE 3645888128,3645888143,AT 3645888144,3645888159,DE 3645888160,3645888191,AT -3645888192,3645894655,DE -3645894656,3645898751,GB +3645888192,3645889791,DE +3645889792,3645889919,US +3645889920,3645890559,DE +3645890560,3645894655,RU +3645894656,3645898751,NL 3645898752,3646501711,DE 3646501712,3646501719,US 3646501720,3646513103,DE 3646513104,3646513111,CA -3646513112,3646519103,DE -3646519104,3646519135,GB -3646519136,3646947327,DE +3646513112,3646947327,DE 3646947328,3647209471,PL 3647209472,3647602687,NL 3647602688,3647658751,RU @@ -80802,1229 +130481,168 @@ 3647665408,3647722751,RU 3647722752,3647722879,BY 3647722880,3647733759,RU -3647733760,3647864831,FR -3647864832,3647864863,GB -3647864864,3647864879,DE -3647864880,3647864887,GB -3647864888,3647864935,DE -3647864936,3647864943,GB -3647864944,3647865071,DE -3647865072,3647865087,GB -3647865088,3647865127,DE -3647865128,3647865135,GB -3647865136,3647865143,DE -3647865144,3647865167,GB -3647865168,3647865175,DE -3647865176,3647865183,GB -3647865184,3647865191,DE -3647865192,3647865199,GB -3647865200,3647865223,DE -3647865224,3647865231,GB -3647865232,3647865271,DE -3647865272,3647865279,GB -3647865280,3647865295,DE -3647865296,3647865303,GB -3647865304,3647865311,DE -3647865312,3647865343,GB -3647865344,3647865351,DE -3647865352,3647865359,GB -3647865360,3647865391,DE -3647865392,3647865399,GB -3647865400,3647865551,DE -3647865552,3647865559,GB -3647865560,3647865567,DE -3647865568,3647865575,GB -3647865576,3647865631,DE -3647865632,3647865639,GB -3647865640,3647865687,DE -3647865688,3647865703,GB -3647865704,3647865735,DE -3647865736,3647865743,GB -3647865744,3647865783,DE -3647865784,3647865791,GB -3647865792,3647865895,DE -3647865896,3647865903,GB -3647865904,3647865935,DE -3647865936,3647865951,GB -3647865952,3647865959,DE -3647865960,3647865967,GB -3647865968,3647866039,DE -3647866040,3647866047,GB -3647866048,3647866079,DE -3647866080,3647866111,GB -3647866112,3647866151,DE -3647866152,3647866159,GB -3647866160,3647866175,DE -3647866176,3647866191,GB -3647866192,3647866279,DE -3647866280,3647866287,GB -3647866288,3647866311,DE -3647866312,3647866319,GB -3647866320,3647866327,DE -3647866328,3647866367,GB -3647866368,3647866391,DE -3647866392,3647866399,GB -3647866400,3647866463,DE -3647866464,3647866479,GB -3647866480,3647866535,DE -3647866536,3647866551,GB -3647866552,3647866559,DE -3647866560,3647866567,GB -3647866568,3647866591,DE -3647866592,3647866599,GB -3647866600,3647866663,DE -3647866664,3647866679,GB -3647866680,3647866727,DE -3647866728,3647866735,GB -3647866736,3647866743,DE -3647866744,3647866751,GB -3647866752,3647866759,DE -3647866760,3647866775,GB -3647866776,3647866815,DE -3647866816,3647866823,GB -3647866824,3647866863,DE -3647866864,3647866871,GB -3647866872,3647866975,DE -3647866976,3647866983,GB -3647866984,3647867127,DE -3647867128,3647867135,GB -3647867136,3647867167,DE -3647867168,3647867175,GB -3647867176,3647867199,DE -3647867200,3647867207,GB -3647867208,3647867255,DE -3647867256,3647867263,GB -3647867264,3647867343,DE -3647867344,3647867351,GB -3647867352,3647867383,DE -3647867384,3647867423,GB -3647867424,3647867463,DE -3647867464,3647867471,GB -3647867472,3647867599,DE -3647867600,3647867607,GB -3647867608,3647867679,DE -3647867680,3647867687,GB -3647867688,3647867695,DE -3647867696,3647867703,GB -3647867704,3647867727,DE -3647867728,3647867735,GB -3647867736,3647868063,DE -3647868064,3647868071,GB -3647868072,3647868135,DE -3647868136,3647868159,GB -3647868160,3647868231,DE -3647868232,3647868239,GB -3647868240,3647868263,DE -3647868264,3647868271,GB -3647868272,3647868287,DE -3647868288,3647868295,GB -3647868296,3647868367,DE -3647868368,3647868375,GB -3647868376,3647868383,DE -3647868384,3647868391,GB -3647868392,3647868399,DE -3647868400,3647868415,GB -3647868416,3647868431,DE -3647868432,3647868447,GB -3647868448,3647868479,DE -3647868480,3647868487,GB -3647868488,3647868639,DE -3647868640,3647868647,GB -3647868648,3647868663,DE -3647868664,3647868703,GB -3647868704,3647868711,DE -3647868712,3647868719,GB -3647868720,3647868727,DE -3647868728,3647868735,GB -3647868736,3647868831,DE -3647868832,3647868839,GB -3647868840,3647868887,DE -3647868888,3647868895,GB -3647868896,3647868959,DE -3647868960,3647868967,GB -3647868968,3647869071,DE -3647869072,3647869087,GB -3647869088,3647869279,DE -3647869280,3647869287,GB -3647869288,3647869375,DE -3647869376,3647869383,GB -3647869384,3647869407,DE -3647869408,3647869415,GB -3647869416,3647869423,DE -3647869424,3647869439,GB -3647869440,3647869455,DE -3647869456,3647869463,GB -3647869464,3647869567,DE -3647869568,3647869575,GB -3647869576,3647869583,DE -3647869584,3647869591,GB -3647869592,3647869775,DE -3647869776,3647869783,GB -3647869784,3647869791,DE -3647869792,3647869799,GB -3647869800,3647869863,DE -3647869864,3647869871,GB -3647869872,3647869991,DE -3647869992,3647869999,GB -3647870000,3647870127,DE -3647870128,3647870135,GB -3647870136,3647870191,DE -3647870192,3647870207,GB -3647870208,3647870447,DE -3647870448,3647870463,GB -3647870464,3647870503,DE -3647870504,3647870519,GB -3647870520,3647870535,DE -3647870536,3647870543,GB -3647870544,3647870583,DE -3647870584,3647870591,GB -3647870592,3647870639,DE -3647870640,3647870647,GB -3647870648,3647870719,DE -3647870720,3647870751,GB -3647870752,3647870815,DE -3647870816,3647870831,GB -3647870832,3647871039,DE -3647871040,3647871047,GB -3647871048,3647871055,DE -3647871056,3647871071,GB -3647871072,3647871103,DE -3647871104,3647871119,GB -3647871120,3647871127,DE -3647871128,3647871135,GB -3647871136,3647871151,DE -3647871152,3647871167,GB -3647871168,3647871191,DE -3647871192,3647871199,GB -3647871200,3647871215,DE -3647871216,3647871231,GB -3647871232,3647871287,DE -3647871288,3647871295,GB -3647871296,3647871303,DE -3647871304,3647871311,GB -3647871312,3647871351,DE -3647871352,3647871367,GB -3647871368,3647871407,DE -3647871408,3647871431,GB -3647871432,3647871447,DE -3647871448,3647871455,GB -3647871456,3647871471,DE -3647871472,3647871487,GB -3647871488,3647871631,DE -3647871632,3647871999,GB -3647872000,3647872239,DE -3647872240,3647872247,GB -3647872248,3647872311,DE -3647872312,3647872335,GB -3647872336,3647872359,DE -3647872360,3647872367,GB -3647872368,3647872407,DE -3647872408,3647872415,GB -3647872416,3647872471,DE -3647872472,3647872479,GB -3647872480,3647872495,DE -3647872496,3647872511,GB -3647872512,3647872679,DE -3647872680,3647872687,GB -3647872688,3647872759,DE -3647872760,3647872767,GB -3647872768,3647872783,DE -3647872784,3647872927,GB -3647872928,3647872959,DE -3647872960,3647872967,GB -3647872968,3647872975,DE -3647872976,3647872983,GB -3647872984,3647873075,DE -3647873076,3647873079,GB -3647873080,3647873095,DE -3647873096,3647873103,GB -3647873104,3647873279,DE -3647873280,3647873343,GB -3647873344,3647873535,DE -3647873536,3647873663,GB -3647873664,3647874958,DE -3647874959,3647874959,GB -3647874960,3647875039,DE -3647875040,3647875055,GB -3647875056,3647875095,DE -3647875096,3647875103,GB -3647875104,3647875111,DE -3647875112,3647875119,GB -3647875120,3647875127,DE -3647875128,3647875135,GB -3647875136,3647875175,DE -3647875176,3647875183,GB -3647875184,3647875199,DE -3647875200,3647875231,GB -3647875232,3647875367,DE -3647875368,3647875375,GB -3647875376,3647875379,DE -3647875380,3647875383,GB -3647875384,3647875455,DE -3647875456,3647875487,GB -3647875488,3647875527,DE -3647875528,3647875839,GB -3647875840,3647876095,DE -3647876096,3647876359,GB -3647876360,3647876375,DE -3647876376,3647876383,GB -3647876384,3647876455,DE -3647876456,3647876471,GB -3647876472,3647876647,DE -3647876648,3647876655,GB -3647876656,3647876663,DE -3647876664,3647876671,GB -3647876672,3647876703,DE -3647876704,3647876711,GB -3647876712,3647876767,DE -3647876768,3647876783,GB -3647876784,3647877447,DE -3647877448,3647877463,GB -3647877464,3647877487,DE -3647877488,3647877503,GB -3647877504,3647877567,DE -3647877568,3647877599,GB -3647877600,3647877635,DE -3647877636,3647877639,GB -3647877640,3647877643,DE -3647877644,3647877671,GB -3647877672,3647877675,DE -3647877676,3647877771,GB -3647877772,3647877775,DE -3647877776,3647877875,GB -3647877876,3647877879,DE -3647877880,3647877895,GB -3647877896,3647877927,DE -3647877928,3647877951,GB -3647877952,3647878103,DE -3647878104,3647878111,GB -3647878112,3647878447,DE -3647878448,3647878463,GB -3647878464,3647878487,DE -3647878488,3647878495,GB -3647878496,3647878503,DE -3647878504,3647878527,GB -3647878528,3647878591,DE -3647878592,3647878607,GB -3647878608,3647879239,DE -3647879240,3647879295,GB -3647879296,3647879695,DE -3647879696,3647879703,GB -3647879704,3647879735,DE -3647879736,3647879807,GB -3647879808,3647879839,DE -3647879840,3647879867,GB -3647879868,3647879879,DE -3647879880,3647879887,GB -3647879888,3647879895,DE -3647879896,3647879903,GB -3647879904,3647879935,DE -3647879936,3647879999,GB -3647880000,3647880047,DE -3647880048,3647880063,GB -3647880064,3647880183,DE -3647880184,3647880447,GB -3647880448,3647880959,DE -3647880960,3647880991,GB -3647880992,3647881015,DE -3647881016,3647881023,GB -3647881024,3647881135,DE -3647881136,3647881151,GB -3647881152,3647881199,DE -3647881200,3647881215,GB -3647881216,3647881243,DE -3647881244,3647881247,GB -3647881248,3647881375,DE -3647881376,3647881391,GB -3647881392,3647881471,DE -3647881472,3647881727,GB -3647881728,3647881991,DE -3647881992,3647881995,GB -3647881996,3647882255,DE -3647882256,3647882263,GB -3647882264,3647882343,DE -3647882344,3647882351,GB -3647882352,3647882359,DE -3647882360,3647882367,GB -3647882368,3647882415,DE -3647882416,3647882423,GB -3647882424,3647882431,DE -3647882432,3647882503,GB -3647882504,3647882511,DE -3647882512,3647882575,GB -3647882576,3647882623,DE -3647882624,3647882751,GB -3647882752,3647883071,DE -3647883072,3647883095,GB -3647883096,3647883135,DE -3647883136,3647883199,GB -3647883200,3647883207,DE -3647883208,3647883215,GB -3647883216,3647883231,DE -3647883232,3647883239,GB -3647883240,3647884287,DE -3647884288,3647884799,GB -3647884800,3647884847,DE -3647884848,3647884855,GB -3647884856,3647884915,DE -3647884916,3647884919,GB -3647884920,3647885191,DE -3647885192,3647885215,GB -3647885216,3647885247,DE -3647885248,3647885311,GB -3647885312,3647885575,DE -3647885576,3647885583,GB -3647885584,3647885599,DE -3647885600,3647885607,GB -3647885608,3647885663,DE -3647885664,3647885695,GB -3647885696,3647886187,DE -3647886188,3647886191,GB -3647886192,3647886271,DE +3647733760,3647814855,FR +3647814856,3647814863,A2 +3647814864,3647864831,FR +3647864832,3647886111,DE +3647886112,3647886119,GB +3647886120,3647886175,DE +3647886176,3647886183,GB +3647886184,3647886187,DE +3647886188,3647886207,GB +3647886208,3647886271,DE 3647886272,3647886303,GB -3647886304,3647886727,DE -3647886728,3647886847,GB -3647886848,3647887427,DE -3647887428,3647887431,GB -3647887432,3647887479,DE -3647887480,3647887483,GB -3647887484,3647887519,DE -3647887520,3647887527,GB -3647887528,3647887599,DE -3647887600,3647887615,GB -3647887616,3647887951,DE -3647887952,3647887959,GB -3647887960,3647888895,DE -3647888896,3647888959,GB -3647888960,3647889023,DE -3647889024,3647889055,GB -3647889056,3647889279,DE -3647889280,3647889343,GB -3647889344,3647889359,DE -3647889360,3647889367,GB -3647889368,3647889375,DE -3647889376,3647889383,GB -3647889384,3647889407,DE -3647889408,3647889471,GB -3647889472,3647889535,DE -3647889536,3647889671,GB -3647889672,3647889687,DE -3647889688,3647889695,GB -3647889696,3647889727,DE -3647889728,3647889735,GB -3647889736,3647889775,DE -3647889776,3647889783,GB -3647889784,3647890247,DE -3647890248,3647890255,GB -3647890256,3647890271,DE -3647890272,3647890295,GB -3647890296,3647890375,DE -3647890376,3647890447,GB -3647890448,3647890471,DE -3647890472,3647890479,GB -3647890480,3647890487,DE -3647890488,3647890527,GB -3647890528,3647890543,DE -3647890544,3647891199,GB -3647891200,3647891463,DE -3647891464,3647891471,GB -3647891472,3647891487,DE -3647891488,3647891503,GB -3647891504,3647891791,DE -3647891792,3647891807,GB -3647891808,3647892239,DE -3647892240,3647892247,GB -3647892248,3647892799,DE -3647892800,3647892815,GB -3647892816,3647892991,DE -3647892992,3647893135,GB -3647893136,3647893183,DE -3647893184,3647893199,GB -3647893200,3647893503,DE -3647893504,3647893511,GB -3647893512,3647893519,DE -3647893520,3647893527,GB -3647893528,3647893535,DE -3647893536,3647893551,GB -3647893552,3647894335,DE -3647894336,3647894351,GB -3647894352,3647894719,DE -3647894720,3647894783,GB -3647894784,3647894911,DE -3647894912,3647894975,GB -3647894976,3647894991,DE -3647894992,3647895007,GB -3647895008,3647895023,DE -3647895024,3647895039,GB -3647895040,3647895311,DE -3647895312,3647895327,GB -3647895328,3647895359,DE -3647895360,3647895399,GB -3647895400,3647895687,DE -3647895688,3647895711,GB -3647895712,3647895799,DE -3647895800,3647895807,GB -3647895808,3647896095,DE -3647896096,3647896127,GB -3647896128,3647896159,DE -3647896160,3647896351,GB -3647896352,3647896399,DE -3647896400,3647896407,GB -3647896408,3647896415,DE -3647896416,3647896423,GB -3647896424,3647896511,DE -3647896512,3647896519,GB -3647896520,3647896527,DE -3647896528,3647896543,GB -3647896544,3647896559,DE -3647896560,3647896567,GB -3647896568,3647896631,DE -3647896632,3647896647,GB -3647896648,3647896687,DE -3647896688,3647896695,GB -3647896696,3647897039,DE -3647897040,3647897047,GB -3647897048,3647897111,DE -3647897112,3647897119,GB -3647897120,3647897215,DE -3647897216,3647897343,GB -3647897344,3647897359,DE -3647897360,3647897375,GB -3647897376,3647897415,DE -3647897416,3647897423,GB -3647897424,3647901247,DE -3647901248,3647901255,GB -3647901256,3647901259,DE -3647901260,3647901263,GB -3647901264,3647901439,DE -3647901440,3647901519,GB -3647901520,3647901535,DE -3647901536,3647901695,GB -3647901696,3647901735,DE -3647901736,3647901743,GB -3647901744,3647901751,DE -3647901752,3647901759,GB -3647901760,3647901863,DE -3647901864,3647901871,GB -3647901872,3647901895,DE -3647901896,3647901911,GB -3647901912,3647901935,DE -3647901936,3647901951,GB -3647901952,3647902063,DE -3647902064,3647902071,GB -3647902072,3647902079,DE -3647902080,3647902087,GB -3647902088,3647902095,DE -3647902096,3647902111,GB -3647902112,3647902159,DE -3647902160,3647902167,GB -3647902168,3647902183,DE -3647902184,3647902207,GB -3647902208,3647902263,DE -3647902264,3647902463,GB -3647902464,3647902495,DE -3647902496,3647902511,GB -3647902512,3647902559,DE -3647902560,3647902719,GB -3647902720,3647902807,DE -3647902808,3647903007,GB -3647903008,3647903039,DE -3647903040,3647903047,GB -3647903048,3647903055,DE -3647903056,3647903063,GB -3647903064,3647903119,DE -3647903120,3647903743,GB -3647903744,3647903919,DE -3647903920,3647903927,GB -3647903928,3647903935,DE -3647903936,3647903943,GB -3647903944,3647903967,DE -3647903968,3647903975,GB -3647903976,3647904023,DE -3647904024,3647904031,GB -3647904032,3647904103,DE -3647904104,3647904111,GB -3647904112,3647904119,DE -3647904120,3647904127,GB -3647904128,3647904207,DE -3647904208,3647904215,GB -3647904216,3647904391,DE -3647904392,3647904398,GB -3647904399,3647904399,DE -3647904400,3647904447,GB -3647904448,3647904639,DE -3647904640,3647904671,GB -3647904672,3647904735,DE -3647904736,3647904751,GB -3647904752,3647904799,DE -3647904800,3647904807,GB -3647904808,3647904967,DE -3647904968,3647904999,GB -3647905000,3647905007,DE -3647905008,3647905023,GB -3647905024,3647905055,DE -3647905056,3647905063,GB -3647905064,3647905071,DE -3647905072,3647905079,GB -3647905080,3647905191,DE -3647905192,3647905279,GB -3647905280,3647905311,DE -3647905312,3647905535,GB -3647905536,3647905567,DE -3647905568,3647905791,GB -3647905792,3647905839,DE -3647905840,3647905847,GB -3647905848,3647905863,DE -3647905864,3647906047,GB -3647906048,3647906079,DE -3647906080,3647906087,GB -3647906088,3647906095,DE -3647906096,3647906103,GB -3647906104,3647906119,DE -3647906120,3647906127,GB -3647906128,3647906151,DE -3647906152,3647906159,GB -3647906160,3647906175,DE -3647906176,3647906303,GB -3647906304,3647906335,DE -3647906336,3647906559,GB -3647906560,3647906591,DE -3647906592,3647907839,GB -3647907840,3647907879,DE -3647907880,3647907887,GB -3647907888,3647907967,DE -3647907968,3647907975,GB -3647907976,3647908007,DE -3647908008,3647908015,GB -3647908016,3647908071,DE -3647908072,3647908079,GB -3647908080,3647908127,DE -3647908128,3647908135,GB -3647908136,3647908151,DE -3647908152,3647908159,GB -3647908160,3647908207,DE -3647908208,3647908215,GB -3647908216,3647908255,DE -3647908256,3647908263,GB -3647908264,3647908271,DE -3647908272,3647908279,GB -3647908280,3647908343,DE -3647908344,3647908351,GB -3647908352,3647908479,DE -3647908480,3647908487,GB -3647908488,3647908495,DE -3647908496,3647908503,GB -3647908504,3647908687,DE -3647908688,3647908695,GB -3647908696,3647908735,DE -3647908736,3647908751,GB -3647908752,3647908775,DE -3647908776,3647908783,GB -3647908784,3647908815,DE -3647908816,3647908831,GB -3647908832,3647908847,DE -3647908848,3647908855,GB -3647908856,3647908967,DE -3647908968,3647908975,GB -3647908976,3647909095,DE -3647909096,3647909111,GB -3647909112,3647909119,DE -3647909120,3647909151,GB -3647909152,3647909159,DE -3647909160,3647909175,GB -3647909176,3647909207,DE -3647909208,3647909215,GB -3647909216,3647909303,DE -3647909304,3647909311,GB -3647909312,3647909327,DE -3647909328,3647909335,GB -3647909336,3647909631,DE -3647909632,3647909671,GB -3647909672,3647909695,DE -3647909696,3647909703,GB -3647909704,3647909711,DE -3647909712,3647909727,GB -3647909728,3647909735,DE -3647909736,3647909743,GB -3647909744,3647909775,DE -3647909776,3647909791,GB -3647909792,3647909815,DE -3647909816,3647909839,GB -3647909840,3647909879,DE -3647909880,3647911423,GB -3647911424,3647911439,DE -3647911440,3647911455,GB -3647911456,3647911519,DE -3647911520,3647911535,GB -3647911536,3647911551,DE -3647911552,3647911583,GB -3647911584,3647911631,DE -3647911632,3647911647,GB -3647911648,3647912615,DE -3647912616,3647912623,GB -3647912624,3647912687,DE -3647912688,3647912695,GB -3647912696,3647912959,DE -3647912960,3647913471,GB -3647913472,3647913727,DE -3647913728,3647913983,GB -3647913984,3647914039,DE -3647914040,3647914055,GB -3647914056,3647914223,DE -3647914224,3647914231,GB -3647914232,3647914239,DE -3647914240,3647914271,GB -3647914272,3647914319,DE -3647914320,3647914327,GB -3647914328,3647914399,DE -3647914400,3647914407,GB -3647914408,3647914463,DE -3647914464,3647914471,GB -3647914472,3647914487,DE -3647914488,3647914751,GB -3647914752,3647915055,DE -3647915056,3647915063,GB -3647915064,3647915111,DE -3647915112,3647915135,GB -3647915136,3647915175,DE -3647915176,3647915183,GB -3647915184,3647915223,DE -3647915224,3647915231,GB -3647915232,3647915295,DE -3647915296,3647915311,GB -3647915312,3647915327,DE -3647915328,3647915335,GB -3647915336,3647915359,DE -3647915360,3647915367,GB -3647915368,3647915495,DE -3647915496,3647915519,GB -3647915520,3647915527,DE -3647915528,3647915535,GB -3647915536,3647915583,DE -3647915584,3647915591,GB -3647915592,3647915671,DE -3647915672,3647915687,GB -3647915688,3647915775,DE -3647915776,3647915807,GB -3647915808,3647915823,DE -3647915824,3647915831,GB -3647915832,3647915855,DE -3647915856,3647915871,GB -3647915872,3647915911,DE -3647915912,3647915919,GB -3647915920,3647915927,DE -3647915928,3647915935,GB -3647915936,3647915943,DE -3647915944,3647915951,GB -3647915952,3647915967,DE -3647915968,3647915975,GB -3647915976,3647916023,DE -3647916024,3647916095,GB -3647916096,3647916223,DE -3647916224,3647916303,GB -3647916304,3647916351,DE -3647916352,3647916367,GB -3647916368,3647916415,DE -3647916416,3647916543,GB -3647916544,3647916575,DE -3647916576,3647916607,GB -3647916608,3647916623,DE -3647916624,3647916663,GB -3647916664,3647916767,DE -3647916768,3647916783,GB -3647916784,3647916799,DE +3647886304,3647890463,DE +3647890464,3647890471,FR +3647890472,3647912447,DE +3647912448,3647912511,BE +3647912512,3647916799,DE 3647916800,3647917055,SE 3647917056,3647917599,DE 3647917600,3647917615,US -3647917616,3647917647,DE -3647917648,3647917663,GB -3647917664,3647917791,DE -3647917792,3647917823,GB -3647917824,3647917839,DE -3647917840,3647917871,GB -3647917872,3647918151,DE -3647918152,3647918159,GB -3647918160,3647918367,DE -3647918368,3647918383,GB -3647918384,3647918423,DE -3647918424,3647918431,GB -3647918432,3647918463,DE -3647918464,3647918479,GB -3647918480,3647918487,DE -3647918488,3647918495,GB -3647918496,3647918503,DE -3647918504,3647918527,GB -3647918528,3647918543,DE -3647918544,3647918559,GB -3647918560,3647918615,DE -3647918616,3647918623,GB -3647918624,3647918671,DE -3647918672,3647918679,GB -3647918680,3647918703,DE -3647918704,3647918711,GB -3647918712,3647918751,DE -3647918752,3647918759,GB -3647918760,3647918927,DE -3647918928,3647918935,GB -3647918936,3647918959,DE -3647918960,3647918967,GB -3647918968,3647919015,DE -3647919016,3647919023,GB -3647919024,3647919031,DE -3647919032,3647919039,GB -3647919040,3647919055,DE -3647919056,3647919063,GB -3647919064,3647919079,DE -3647919080,3647919135,GB -3647919136,3647919175,DE -3647919176,3647919391,GB -3647919392,3647919431,DE -3647919432,3647919439,GB -3647919440,3647919447,DE -3647919448,3647920159,GB -3647920160,3647920223,DE -3647920224,3647920415,GB -3647920416,3647920439,DE -3647920440,3647920479,GB -3647920480,3647920495,DE -3647920496,3647920503,GB -3647920504,3647920519,DE -3647920520,3647920527,GB -3647920528,3647920535,DE -3647920536,3647920679,GB -3647920680,3647920695,DE -3647920696,3647921151,GB -3647921152,3647921391,DE -3647921392,3647921407,GB -3647921408,3647921559,DE -3647921560,3647921567,GB -3647921568,3647921615,DE -3647921616,3647921631,GB -3647921632,3647921647,DE -3647921648,3647921663,GB -3647921664,3647921911,DE -3647921912,3647921919,GB -3647921920,3647921967,DE -3647921968,3647921983,GB -3647921984,3647922095,DE -3647922096,3647922103,GB -3647922104,3647922167,DE -3647922168,3647922207,GB -3647922208,3647922219,DE -3647922220,3647922223,GB -3647922224,3647922303,DE -3647922304,3647922367,GB -3647922368,3647922447,DE -3647922448,3647922455,GB -3647922456,3647922687,DE -3647922688,3647922811,GB -3647922812,3647922815,DE -3647922816,3647922831,GB -3647922832,3647922835,DE -3647922836,3647922843,GB -3647922844,3647922847,DE -3647922848,3647922943,GB -3647922944,3647922959,DE -3647922960,3647922967,GB -3647922968,3647922975,DE -3647922976,3647922991,GB -3647922992,3647923327,DE -3647923328,3647923331,GB -3647923332,3647923343,DE -3647923344,3647923351,GB -3647923352,3647923399,DE -3647923400,3647923407,GB -3647923408,3647923775,DE -3647923776,3647923839,GB -3647923840,3647924287,DE -3647924288,3647924367,GB -3647924368,3647924399,DE -3647924400,3647924415,GB -3647924416,3647924447,DE -3647924448,3647924463,GB -3647924464,3647924479,DE -3647924480,3647925247,GB -3647925248,3647925255,DE -3647925256,3647925263,GB -3647925264,3647925335,DE -3647925336,3647925343,GB -3647925344,3647925543,DE -3647925544,3647925559,GB -3647925560,3647925575,DE -3647925576,3647925583,GB -3647925584,3647925591,DE -3647925592,3647925599,GB -3647925600,3647925639,DE -3647925640,3647925655,GB -3647925656,3647925671,DE -3647925672,3647925679,GB -3647925680,3647925751,DE -3647925752,3647925759,GB -3647925760,3647925911,DE -3647925912,3647925919,GB -3647925920,3647926055,DE -3647926056,3647926063,GB -3647926064,3647926095,DE -3647926096,3647926103,GB -3647926104,3647926159,DE -3647926160,3647926175,GB -3647926176,3647926183,DE -3647926184,3647926191,GB -3647926192,3647926223,DE -3647926224,3647926239,GB -3647926240,3647926255,DE -3647926256,3647926271,GB -3647926272,3647926343,DE -3647926344,3647926375,GB -3647926376,3647926407,DE -3647926408,3647926423,GB -3647926424,3647926463,DE -3647926464,3647926471,GB -3647926472,3647926591,DE -3647926592,3647926615,GB -3647926616,3647926623,DE -3647926624,3647926631,GB -3647926632,3647926655,DE -3647926656,3647926663,GB -3647926664,3647926679,DE -3647926680,3647926687,GB -3647926688,3647926695,DE -3647926696,3647926703,GB -3647926704,3647926711,DE -3647926712,3647926719,GB -3647926720,3647926759,DE -3647926760,3647926767,GB -3647926768,3647926775,DE -3647926776,3647926791,GB -3647926792,3647926807,DE -3647926808,3647926815,GB -3647926816,3647926823,DE -3647926824,3647926831,GB -3647926832,3647926839,DE -3647926840,3647926847,GB -3647926848,3647926863,DE -3647926864,3647926871,GB -3647926872,3647926879,DE -3647926880,3647926895,GB -3647926896,3647926903,DE -3647926904,3647927047,GB -3647927048,3647927055,DE -3647927056,3647927079,GB -3647927080,3647927087,DE -3647927088,3647927095,GB -3647927096,3647927119,DE -3647927120,3647927127,GB -3647927128,3647927135,DE -3647927136,3647927159,GB -3647927160,3647927167,DE -3647927168,3647927175,GB -3647927176,3647927191,DE -3647927192,3647927215,GB -3647927216,3647927239,DE -3647927240,3647927279,GB -3647927280,3647927295,DE -3647927296,3647927551,GB -3647927552,3647927591,DE -3647927592,3647927599,GB -3647927600,3647927615,DE -3647927616,3647927623,GB -3647927624,3647927647,DE -3647927648,3647927695,GB -3647927696,3647927703,DE -3647927704,3647927735,GB -3647927736,3647927759,DE -3647927760,3647927783,GB -3647927784,3647927791,DE -3647927792,3647928063,GB -3647928064,3647928119,DE -3647928120,3647928151,GB -3647928152,3647928175,DE -3647928176,3647928183,GB -3647928184,3647928199,DE -3647928200,3647928215,GB -3647928216,3647928223,DE -3647928224,3647928231,GB -3647928232,3647928247,DE -3647928248,3647928319,GB -3647928320,3647928671,DE -3647928672,3647929343,GB -3647929344,3647929599,DE -3647929600,3647929727,GB -3647929728,3647929791,DE -3647929792,3647929855,GB -3647929856,3647930487,DE -3647930488,3647930495,GB -3647930496,3647930623,DE -3647930624,3647930879,GB -3647930880,3647931159,DE -3647931160,3647931199,GB -3647931200,3647931279,DE -3647931280,3647931287,GB -3647931288,3647931311,DE -3647931312,3647931327,GB -3647931328,3647931391,DE -3647931392,3647931611,GB -3647931612,3647931615,DE -3647931616,3647931647,GB -3647931648,3647931775,DE -3647931776,3647931783,GB -3647931784,3647931799,DE -3647931800,3647931807,GB -3647931808,3647931855,DE -3647931856,3647931863,GB -3647931864,3647932199,DE -3647932200,3647932223,GB -3647932224,3647932287,DE -3647932288,3647932671,GB -3647932672,3647932975,DE -3647932976,3647932991,GB -3647932992,3647933063,DE -3647933064,3647933071,GB -3647933072,3647933103,DE -3647933104,3647933119,GB -3647933120,3647933375,DE -3647933376,3647933695,GB -3647933696,3647933791,DE -3647933792,3647933951,GB -3647933952,3647934463,DE -3647934464,3647934719,GB -3647934720,3647934783,DE -3647934784,3647934815,GB -3647934816,3647934847,DE -3647934848,3647935103,GB -3647935104,3647935199,DE -3647935200,3647935359,GB -3647935360,3647935423,DE -3647935424,3647935487,GB -3647935488,3647935743,DE -3647935744,3647936511,GB -3647936512,3647936539,DE -3647936540,3647936543,GB -3647936544,3647936555,DE -3647936556,3647936559,GB -3647936560,3647936563,DE -3647936564,3647936567,GB -3647936568,3647936575,DE -3647936576,3647936579,GB -3647936580,3647936603,DE -3647936604,3647936607,GB -3647936608,3647936623,DE -3647936624,3647936635,GB -3647936636,3647936639,DE -3647936640,3647936655,GB -3647936656,3647936659,DE -3647936660,3647936767,GB -3647936768,3647936943,DE -3647936944,3647936959,GB -3647936960,3647937535,DE -3647937536,3647937595,GB -3647937596,3647937599,DE -3647937600,3647937611,GB -3647937612,3647937615,DE -3647937616,3647937791,GB -3647937792,3647938559,DE -3647938560,3647938575,GB -3647938576,3647938583,DE -3647938584,3647938591,GB -3647938592,3647938615,DE -3647938616,3647938623,GB -3647938624,3647938631,DE -3647938632,3647938655,GB -3647938656,3647938671,DE -3647938672,3647938727,GB -3647938728,3647938735,DE -3647938736,3647938751,GB -3647938752,3647938759,DE -3647938760,3647938783,GB -3647938784,3647938807,DE -3647938808,3647938879,GB -3647938880,3647938887,DE -3647938888,3647938911,GB -3647938912,3647938927,DE -3647938928,3647938935,GB -3647938936,3647938943,DE -3647938944,3647938975,GB -3647938976,3647938983,DE -3647938984,3647939103,GB -3647939104,3647939143,DE -3647939144,3647939151,GB -3647939152,3647939167,DE -3647939168,3647939175,GB -3647939176,3647939239,DE -3647939240,3647939247,GB -3647939248,3647939583,DE -3647939584,3647939591,GB -3647939592,3647939615,DE -3647939616,3647939623,GB -3647939624,3647939639,DE -3647939640,3647939647,GB -3647939648,3647939703,DE -3647939704,3647939711,GB -3647939712,3647939751,DE -3647939752,3647939759,GB -3647939760,3647939807,DE -3647939808,3647939839,GB -3647939840,3647939927,DE -3647939928,3647939935,GB -3647939936,3647940047,DE -3647940048,3647940055,GB -3647940056,3647940415,DE -3647940416,3647940607,GB -3647940608,3647941119,DE -3647941120,3647941151,GB -3647941152,3647941167,DE -3647941168,3647941375,GB -3647941376,3647941559,DE -3647941560,3647941567,GB -3647941568,3647941887,DE -3647941888,3647941935,GB -3647941936,3647941939,DE -3647941940,3647941943,GB -3647941944,3647941955,DE -3647941956,3647941959,GB -3647941960,3647941967,DE -3647941968,3647941971,GB -3647941972,3647941983,DE -3647941984,3647941987,GB -3647941988,3647941991,DE -3647941992,3647941999,GB -3647942000,3647942007,DE -3647942008,3647942015,GB -3647942016,3647942023,DE -3647942024,3647942031,GB -3647942032,3647942047,DE -3647942048,3647942399,GB -3647942400,3647942711,DE -3647942712,3647942719,GB -3647942720,3647942903,DE -3647942904,3647942911,GB -3647942912,3647943207,DE -3647943208,3647943215,GB -3647943216,3647943423,DE -3647943424,3647943431,GB -3647943432,3647943435,DE -3647943436,3647943499,GB -3647943500,3647943503,DE -3647943504,3647943527,GB -3647943528,3647943543,DE -3647943544,3647943547,GB -3647943548,3647943559,DE -3647943560,3647943679,GB -3647943680,3647944591,DE -3647944592,3647944599,GB -3647944600,3647944623,DE -3647944624,3647944671,GB -3647944672,3647944695,DE -3647944696,3647944703,GB -3647944704,3647945475,DE -3647945476,3647945531,GB -3647945532,3647945535,DE -3647945536,3647945635,GB -3647945636,3647945643,DE -3647945644,3647945727,GB -3647945728,3647945983,DE -3647945984,3647946239,GB -3647946240,3647946499,DE -3647946500,3647946503,GB -3647946504,3647947391,DE -3647947392,3647947399,GB -3647947400,3647947407,DE -3647947408,3647947415,GB -3647947416,3647947423,DE -3647947424,3647947431,GB -3647947432,3647947447,DE -3647947448,3647947455,GB -3647947456,3647947647,DE -3647947648,3647947711,GB -3647947712,3647947735,DE -3647947736,3647947775,GB -3647947776,3647947919,DE -3647947920,3647947935,GB -3647947936,3647948191,DE -3647948192,3647948287,GB -3647948288,3647948543,DE -3647948544,3647948807,GB -3647948808,3647948815,DE -3647948816,3647949063,GB -3647949064,3647949079,DE -3647949080,3647949119,GB -3647949120,3647949151,DE -3647949152,3647949183,GB -3647949184,3647949887,DE -3647949888,3647949951,GB -3647949952,3647950015,DE -3647950016,3647950847,GB -3647950848,3647953023,DE -3647953024,3647953031,GB -3647953032,3647953071,DE -3647953072,3647953079,GB -3647953080,3647953407,DE -3647953408,3647953663,GB -3647953664,3647953791,DE -3647953792,3647953823,GB -3647953824,3647953919,DE -3647953920,3647954175,GB -3647954176,3647954207,DE -3647954208,3647954215,GB -3647954216,3647954231,DE +3647917616,3647936823,DE +3647936824,3647936827,GB +3647936828,3647936871,DE +3647936872,3647936879,FR +3647936880,3647954231,DE 3647954232,3647954239,GB -3647954240,3647954263,DE -3647954264,3647954271,GB -3647954272,3647954719,DE -3647954720,3647954815,GB -3647954816,3647954879,DE -3647954880,3647955199,GB -3647955200,3647955207,DE -3647955208,3647955215,GB -3647955216,3647955287,DE -3647955288,3647955295,GB -3647955296,3647955311,DE -3647955312,3647955327,GB -3647955328,3647955375,DE -3647955376,3647955383,GB -3647955384,3647955423,DE -3647955424,3647955431,GB -3647955432,3647956615,DE -3647956616,3647956671,GB -3647956672,3647956991,DE -3647956992,3647957503,GB -3647957504,3647957543,DE -3647957544,3647957551,GB -3647957552,3647957559,DE -3647957560,3647957599,GB -3647957600,3647957631,DE -3647957632,3647957727,GB -3647957728,3647957735,DE -3647957736,3647959679,GB -3647959680,3647959687,DE -3647959688,3647995903,GB -3647995904,3647997183,DE -3647997184,3647999999,FR -3648000000,3648004095,RU +3647954240,3647954783,DE +3647954784,3647954815,CH +3647954816,3647957511,DE +3647957512,3647957519,GB +3647957520,3647959567,DE +3647959568,3647959575,ES +3647959576,3647961215,DE +3647961216,3647961247,IT +3647961248,3647963167,DE +3647963168,3647963183,BE +3647963184,3647963231,DE +3647963232,3647963263,BE +3647963264,3647963519,DE +3647963520,3647963647,FR +3647963648,3647963775,BE +3647963776,3647963839,FR +3647963840,3647964159,DE +3647964160,3647964287,BE +3647964288,3647964415,DE +3647964416,3647964567,ES +3647964568,3647964583,DE +3647964584,3647964599,ES +3647964600,3647964607,DE +3647964608,3647964615,ES +3647964616,3647964623,DE +3647964624,3647964671,ES +3647964672,3647964679,DE +3647964680,3647964703,ES +3647964704,3647965183,DE +3647965184,3647965255,ES +3647965256,3647965279,DE +3647965280,3647965295,ES +3647965296,3647965303,DE +3647965304,3647965311,ES +3647965312,3647965327,DE +3647965328,3647965343,ES +3647965344,3647965351,DE +3647965352,3647965359,ES +3647965360,3647965375,DE +3647965376,3647965407,ES +3647965408,3647965439,DE +3647965440,3647965695,ES +3647965696,3647966207,CH +3647966208,3647966575,GB +3647966576,3647966583,DE +3647966584,3647967231,GB +3647967232,3647968255,BE +3647968256,3647968703,FR +3647968704,3647968767,GB +3647968768,3647969279,FR +3647969280,3647969791,IT +3647969792,3647970303,BE +3647970304,3647971327,FR +3647971328,3647971671,GB +3647971672,3647971679,DE +3647971680,3647972215,GB +3647972216,3647972223,DE +3647972224,3647972259,GB +3647972260,3647972263,DE +3647972264,3647972351,GB +3647972352,3647973783,IT +3647973784,3647973791,DE +3647973792,3647973967,IT +3647973968,3647973975,DE +3647973976,3647974047,IT +3647974048,3647974055,DE +3647974056,3647974399,IT +3647974400,3647976447,ES +3647976448,3647976559,BE +3647976560,3647976575,FR +3647976576,3647976607,BE +3647976608,3647976639,BR +3647976640,3647976647,BE +3647976648,3647976663,DE +3647976664,3647976719,BE +3647976720,3647976727,DE +3647976728,3647976743,BE +3647976744,3647976751,DE +3647976752,3647976759,BE +3647976760,3647976783,DE +3647976784,3647976791,BE +3647976792,3647976799,DE +3647976800,3647976927,BE +3647976928,3647976935,DE +3647976936,3647977047,BE +3647977048,3647977215,DE +3647977216,3647977471,BE +3647977472,3647977791,GB +3647977792,3647977855,IE +3647977856,3647978495,GB +3647978496,3647979007,NL +3647979008,3647979519,DE +3647979520,3647980543,FR +3647980544,3647981055,GB +3647981056,3647981567,IE +3647981568,3647982591,BE +3647982592,3647983615,IT +3647983616,3647995903,DE +3647995904,3648004095,RU 3648004096,3648004607,GB -3648004608,3648004863,RU -3648004864,3648005119,GB -3648005120,3648006271,RU +3648004608,3648006271,RU 3648006272,3648006399,GB 3648006400,3648007167,RU 3648007168,3648008191,GB 3648008192,3648016383,FR 3648016384,3648020479,GB -3648020480,3648024575,ES +3648020480,3648024575,IT 3648024576,3648028671,NL -3648028672,3648032767,CZ +3648028672,3648032767,HU 3648032768,3648033023,IE -3648033024,3648033039,DE +3648033024,3648033039,EU 3648033040,3648033087,IE -3648033088,3648033103,DE +3648033088,3648033103,EU 3648033104,3648033119,IE -3648033120,3648033535,DE +3648033120,3648033535,EU 3648033536,3648033791,IE -3648033792,3648036863,DE +3648033792,3648034047,EU +3648034048,3648034051,IE +3648034052,3648034055,EU +3648034056,3648034095,IE +3648034096,3648034175,EU +3648034176,3648034191,IE +3648034192,3648034815,EU +3648034816,3648034847,DE +3648034848,3648034887,EU +3648034888,3648034895,IE +3648034896,3648034943,EU +3648034944,3648035023,IE +3648035024,3648035039,EU +3648035040,3648035071,NL +3648035072,3648036863,EU 3648036864,3648040959,CZ 3648040960,3648041020,BE 3648041021,3648041021,FR -3648041022,3648045055,BE +3648041022,3648041052,BE +3648041053,3648041053,NL +3648041054,3648045055,BE 3648045056,3648049151,FI 3648049152,3648053247,UA 3648053248,3648057343,FR @@ -82033,10 +130651,17 @@ 3648069632,3648073727,DE 3648073728,3648077823,HU 3648077824,3648078079,BE -3648078080,3648078975,CG -3648078976,3648079103,BE +3648078080,3648078335,CG +3648078336,3648078463,BE +3648078464,3648078495,BF +3648078496,3648078527,BE +3648078528,3648078591,BF +3648078592,3648078847,CG +3648078848,3648079103,BE 3648079104,3648080383,UG -3648080384,3648080639,TZ +3648080384,3648080511,TZ +3648080512,3648080543,BF +3648080544,3648080639,TZ 3648080640,3648080895,BE 3648080896,3648080903,NE 3648080904,3648080919,CD @@ -82055,9 +130680,11 @@ 3648086016,3648090111,AT 3648090112,3648094207,RU 3648094208,3648102399,PL -3648102400,3648102655,GB -3648102656,3648102911,NL -3648102912,3648106495,GB +3648102400,3648104767,GB +3648104768,3648104783,IE +3648104784,3648104791,GB +3648104792,3648104799,IE +3648104800,3648106495,GB 3648106496,3648110591,DE 3648110592,3648114687,FR 3648114688,3648118783,IT @@ -82079,42 +130706,56 @@ 3648163840,3648167935,RU 3648167936,3648172031,IE 3648172032,3648176127,RU -3648176128,3648180223,GB +3648176128,3648178687,FR +3648178688,3648178815,LU +3648178816,3648180223,FR 3648180224,3648180767,DE 3648180768,3648180799,AT -3648180800,3648180863,DE -3648180864,3648180991,CH -3648180992,3648181023,DE +3648180800,3648181023,DE 3648181024,3648181055,AT -3648181056,3648181119,DE -3648181120,3648181247,CH -3648181248,3648181311,DE +3648181056,3648181215,DE +3648181216,3648181231,RU +3648181232,3648181311,DE 3648181312,3648181343,AT -3648181344,3648182783,DE +3648181344,3648181375,DE +3648181376,3648181407,RU +3648181408,3648181423,DE +3648181424,3648181439,CH +3648181440,3648181551,DE +3648181552,3648181567,RU +3648181568,3648181631,DE +3648181632,3648181647,AT +3648181648,3648181655,DE +3648181656,3648181663,IT +3648181664,3648181887,DE +3648181888,3648181903,AT +3648181904,3648182143,DE +3648182144,3648182159,NL +3648182160,3648182175,DE +3648182176,3648182207,RU +3648182208,3648182271,GB +3648182272,3648182303,CH +3648182304,3648182335,IT +3648182336,3648182591,DE +3648182592,3648182623,AT +3648182624,3648182655,CH +3648182656,3648182783,DE 3648182784,3648182799,IT 3648182800,3648182815,AT -3648182816,3648182823,DE +3648182816,3648182823,US 3648182824,3648182831,RU 3648182832,3648182847,DE 3648182848,3648182911,IT -3648182912,3648184319,DE +3648182912,3648183871,DE +3648183872,3648183935,GB +3648183936,3648184319,DE 3648184320,3648192511,RU -3648192512,3648193023,ES -3648193024,3648193087,US -3648193088,3648193151,FI -3648193152,3648193215,BG -3648193216,3648193279,ES -3648193280,3648193311,GB -3648193312,3648193343,FR -3648193344,3648193375,DE -3648193376,3648193407,IT -3648193408,3648193439,DK -3648193440,3648196607,ES +3648192512,3648196607,DE 3648196608,3648200703,IT 3648200704,3648208895,SE 3648208896,3648212991,DE 3648212992,3648217087,RU -3648217088,3648221183,GB +3648217088,3648221183,UA 3648221184,3648225279,IE 3648225280,3648231263,DE 3648231264,3648231295,NL @@ -82135,32 +130776,23 @@ 3648290816,3648299007,RU 3648299008,3648303103,FI 3648303104,3648307199,AT -3648307200,3648311295,GB -3648311296,3648315391,IR -3648315392,3648315567,DK -3648315568,3648315583,CA -3648315584,3648315615,DK +3648307200,3648311295,TR +3648311296,3648315615,DK 3648315616,3648315631,CA 3648315632,3648316079,DK 3648316080,3648316087,SE -3648316088,3648316127,DK -3648316128,3648316143,CA -3648316144,3648316415,DK +3648316088,3648316415,DK 3648316416,3648316671,NL -3648316672,3648316927,AT -3648316928,3648317247,DK +3648316672,3648317247,DK 3648317248,3648317263,CA -3648317264,3648319487,DK -3648319488,3648319519,ES -3648319520,3648319527,DK +3648317264,3648319527,DK 3648319528,3648319535,CH 3648319536,3648321631,DK 3648321632,3648321639,CA 3648321640,3648321823,DK 3648321824,3648321839,GB -3648321840,3648322303,DK -3648322304,3648322559,BE -3648322560,3648323583,DK +3648321840,3648323583,DK +3648323584,3648327679,NG 3648327680,3648331775,LT 3648331776,3648339967,BE 3648339968,3648344063,UA @@ -82174,24 +130806,36 @@ 3648372736,3648376831,LU 3648376832,3648380927,CZ 3648380928,3648385023,NL -3648385024,3648389119,GR +3648385024,3648389119,RU 3648389120,3648393215,IT 3648393216,3648397311,DE 3648397312,3648405503,NO 3648405504,3648413695,RU 3648413696,3648417791,SK -3648417792,3648417879,AT +3648417792,3648417807,AT +3648417808,3648417815,GB +3648417816,3648417831,AT +3648417832,3648417839,GB +3648417840,3648417879,AT 3648417880,3648417919,GB 3648417920,3648418047,AT 3648418048,3648418079,GB -3648418080,3648418247,ES +3648418080,3648418095,ES +3648418096,3648418111,GB +3648418112,3648418135,ES +3648418136,3648418143,GB +3648418144,3648418247,ES 3648418248,3648418255,CH -3648418256,3648418303,ES +3648418256,3648418263,ES +3648418264,3648418271,GB +3648418272,3648418303,ES 3648418304,3648419327,GB 3648419328,3648419455,FR 3648419456,3648419519,IT 3648419520,3648419583,ES -3648419584,3648420095,GB +3648419584,3648419839,GB +3648419840,3648419901,BE +3648419902,3648420095,GB 3648420096,3648420351,NL 3648420352,3648420863,GB 3648420864,3648421119,US @@ -82203,7 +130847,9 @@ 3648430080,3648434175,NL 3648434176,3648438271,RU 3648438272,3648442367,CH -3648442368,3648446463,SE +3648442368,3648443743,SE +3648443744,3648443759,PA +3648443760,3648446463,SE 3648446464,3648447055,FR 3648447056,3648447063,ES 3648447064,3648449119,FR @@ -82220,15 +130866,15 @@ 3648469312,3648471039,DE 3648471040,3648475135,PL 3648475136,3648479231,RU -3648479232,3648483327,DE +3648479232,3648483327,CH 3648483328,3648487423,SK -3648487424,3648491519,IT +3648487424,3648491519,FR 3648491520,3648495615,CH 3648495616,3648499711,SE 3648499712,3648503807,FR 3648503808,3648511999,DE 3648512000,3648516095,NL -3648516096,3648520191,CS +3648516096,3648520191,RS 3648520192,3648782335,NL 3648782336,3649044479,ES 3649044480,3649110015,FR @@ -82236,8 +130882,14 @@ 3649175552,3649241087,ES 3649241088,3649306623,TR 3649306624,3649372159,IL -3649372160,3649437695,IT -3649437696,3649568767,GB +3649372160,3649415439,IT +3649415440,3649415455,A2 +3649415456,3649417279,IT +3649417280,3649417287,A2 +3649417288,3649437695,IT +3649437696,3649512191,GB +3649512192,3649512447,FR +3649512448,3649568767,GB 3649568768,3649634303,BE 3649634304,3649700159,GB 3649700160,3649700247,US @@ -82253,6 +130905,7 @@ 3649709312,3649709815,GB 3649709816,3649709823,TT 3649709824,3649765375,GB +3649765376,3649830911,EG 3649830912,3649835007,NL 3649835008,3649839103,ES 3649839104,3649847295,GB @@ -82271,18 +130924,18 @@ 3650097152,3650101247,SK 3650101248,3650105343,DE 3650105344,3650109439,CH -3650109440,3650113535,UA +3650109440,3650113535,NO 3650113536,3650117631,GB 3650117632,3650121727,RU 3650121728,3650125823,FR -3650125824,3650129919,NO +3650125824,3650129743,DE +3650129744,3650129751,IE +3650129752,3650129919,DE 3650129920,3650134015,GB 3650134016,3650142207,RU 3650142208,3650150399,PL 3650150400,3650158591,NO -3650158592,3650159135,MT -3650159136,3650159151,SC -3650159152,3650162687,MT +3650158592,3650162687,MT 3650162688,3650166783,RU 3650166784,3650167807,BE 3650167808,3650168063,LU @@ -82291,8 +130944,7 @@ 3650174976,3650179071,GB 3650179072,3650183167,BG 3650183168,3650187263,DE -3650187264,3650191359,GB -3650191360,3650195455,DE +3650187264,3650195455,GB 3650195456,3650199551,RU 3650199552,3650203647,BG 3650203648,3650207743,ES @@ -82300,24 +130952,24 @@ 3650211840,3650215935,LV 3650215936,3650220031,GB 3650220032,3650224127,SA -3650224128,3650225027,US -3650225028,3650228223,GB -3650228224,3650232319,US +3650224128,3650228223,A2 +3650228224,3650228735,US +3650228736,3650228991,A2 +3650228992,3650232319,US 3650232320,3650236415,RU -3650236416,3650240511,GR -3650240512,3650244607,IT +3650236416,3650240511,GB +3650240512,3650244607,EE 3650244608,3650256895,GB 3650256896,3650265087,DE -3650265088,3650269183,PL +3650265088,3650269183,CH 3650269184,3650273279,GB -3650273280,3650277375,RU +3650273280,3650277375,IT 3650277376,3650281471,IR 3650281472,3650285567,FR 3650285568,3650289663,UA 3650289664,3650297855,RU 3650297856,3650301951,LT -3650301952,3650306047,RU -3650306048,3650306623,DE +3650301952,3650306623,DE 3650306624,3650306639,GE 3650306640,3650306775,DE 3650306776,3650306779,GE @@ -82336,16 +130988,64 @@ 3650315273,3650316711,DE 3650316712,3650316715,FR 3650316716,3650318335,DE -3650318336,3650322431,GI +3650318336,3650320383,GI +3650320384,3650322431,GB 3650322432,3650330623,IT 3650330624,3650334719,UA 3650334720,3650338815,GB 3650338816,3650342911,FR -3650342912,3650347007,CH +3650342912,3650344463,CH +3650344464,3650344479,AT +3650344480,3650344879,CH +3650344880,3650344911,PT +3650344912,3650345879,CH +3650345880,3650345887,IM +3650345888,3650345903,AT +3650345904,3650345935,CH +3650345936,3650345951,PT +3650345952,3650346207,CH +3650346208,3650346239,IM +3650346240,3650347007,CH 3650347008,3650351103,GE 3650351104,3650351871,GB 3650351872,3650351879,NL -3650351880,3650355199,GB +3650351880,3650351887,IT +3650351888,3650351903,GB +3650351904,3650351911,FR +3650351912,3650351919,SE +3650351920,3650351927,DK +3650351928,3650351935,DE +3650351936,3650351943,PL +3650351944,3650351951,ES +3650351952,3650351959,BE +3650351960,3650351967,ZA +3650351968,3650351975,PT +3650351976,3650351983,FI +3650351984,3650351991,NO +3650351992,3650351999,HU +3650352000,3650352007,GB +3650352008,3650352015,IE +3650352016,3650352127,GB +3650352128,3650352247,DE +3650352248,3650352255,IE +3650352256,3650352263,GB +3650352264,3650352271,DE +3650352272,3650352279,NL +3650352280,3650352287,IT +3650352288,3650352295,FR +3650352296,3650352303,SE +3650352304,3650352311,DK +3650352312,3650352319,DE +3650352320,3650352327,PL +3650352328,3650352335,ES +3650352336,3650352343,BE +3650352344,3650352351,ZA +3650352352,3650352359,PT +3650352360,3650352367,FI +3650352368,3650352375,NL +3650352376,3650352383,HU +3650352384,3650352895,DE +3650352896,3650355199,GB 3650355200,3650359295,CH 3650359296,3650363391,NL 3650363392,3650367487,GB @@ -82356,7 +131056,8 @@ 3650387968,3650392063,DE 3650392064,3650396159,NO 3650396160,3650404351,NL -3650404352,3650416639,RU +3650404352,3650412543,RU +3650412544,3650416639,DE 3650416640,3650420735,BE 3650420736,3650424831,ES 3650424832,3650428927,RU @@ -82366,26 +131067,25 @@ 3650441216,3650445311,IT 3650445312,3650449407,GB 3650449408,3650453503,NO -3650453504,3650454527,GB -3650454528,3650457599,CZ +3650453504,3650457599,NL 3650457600,3650461695,ES 3650461696,3650465791,AT -3650465792,3650469887,GB +3650465792,3650469887,RU 3650469888,3650478079,NL 3650478080,3650482175,AT -3650482176,3650486271,PL +3650482176,3650484687,PL +3650484688,3650484695,SE +3650484696,3650486271,PL 3650486272,3650502655,RU 3650502656,3650510847,SE 3650510848,3650519039,GB 3650519040,3650523135,HU 3650523136,3650527231,DE -3650527232,3650535423,SE +3650527232,3650534911,SE +3650534912,3650535423,NL 3650535424,3650539519,RU 3650539520,3650543615,ES -3650543616,3650547711,GR -3650547712,3650549087,CH -3650549088,3650549119,LI -3650549120,3650551807,CH +3650543616,3650551807,CH 3650551808,3650555903,FR 3650555904,3650559999,RU 3650560000,3650564095,GB @@ -82412,13 +131112,23 @@ 3650610944,3650611711,DE 3650611712,3650612735,KZ 3650612736,3650617343,DE -3650617344,3650682879,FI +3650617344,3650619275,FI +3650619276,3650619279,AX +3650619280,3650621023,FI +3650621024,3650621027,AX +3650621028,3650682879,FI 3650682880,3650748415,PL 3650748416,3650789375,GB 3650789376,3650790143,NL -3650790144,3650879487,GB +3650790144,3650827095,GB +3650827096,3650827103,A2 +3650827104,3650879487,GB 3650879488,3650912255,RO -3650912256,3650945023,GB +3650912256,3650912639,GB +3650912640,3650912671,FR +3650912672,3650923103,GB +3650923104,3650923135,FR +3650923136,3650945023,GB 3650945024,3651010559,DK 3651010560,3651076095,GB 3651076096,3651077375,DE @@ -82435,7 +131145,8 @@ 3651080832,3651081215,DE 3651081216,3651081727,GB 3651081728,3651081983,AT -3651081984,3651082751,GB +3651081984,3651082239,DE +3651082240,3651082751,GB 3651082752,3651083007,IE 3651083008,3651083519,GB 3651083520,3651083775,DE @@ -82457,11 +131168,7 @@ 3651088128,3651088383,IE 3651088384,3651088639,GR 3651088640,3651088895,SG -3651088896,3651088911,DE -3651088912,3651088927,SG -3651088928,3651089147,DE -3651089148,3651089151,SG -3651089152,3651098111,DE +3651088896,3651098111,DE 3651098112,3651098367,IE 3651098368,3651098623,FR 3651098624,3651101439,DE @@ -82490,39 +131197,76 @@ 3651108480,3651108543,ES 3651108544,3651108863,DE 3651108864,3651141631,EE -3651141632,3651198975,DE -3651198976,3651207167,US +3651141632,3651173375,DE +3651173376,3651173631,ES +3651173632,3651199487,DE +3651199488,3651199743,GB +3651199744,3651200255,ES +3651200256,3651201023,PL +3651201024,3651201279,ES +3651201280,3651201535,PL +3651201536,3651201791,ES +3651201792,3651201919,FR +3651201920,3651202047,ES +3651202048,3651202175,FR +3651202176,3651202303,GB +3651202304,3651202815,ES +3651202816,3651203071,GB +3651203072,3651207167,US 3651207168,3651207199,GB +3651207200,3651207223,EU 3651207224,3651207295,GB +3651207296,3651207423,EU 3651207424,3651207615,GB +3651207616,3651207647,EU 3651207648,3651208959,GB +3651208960,3651209215,EU 3651209216,3651209231,US 3651209232,3651209239,GB 3651209240,3651209243,DE -3651209248,3651209263,GB +3651209244,3651209471,EU 3651209472,3651210751,GB +3651210752,3651211263,EU 3651211264,3651211775,IR +3651211776,3651213823,EU 3651213824,3651214207,US +3651214208,3651215359,EU 3651215360,3651215395,GB +3651215396,3651215615,EU 3651215616,3651215871,GB +3651215872,3651217407,EU 3651217408,3651217535,GI +3651217536,3651219455,EU 3651219456,3651219967,US +3651219968,3651220383,EU 3651220384,3651220479,GB +3651220480,3651221503,EU 3651221504,3651221695,GB +3651221696,3651223551,EU 3651223552,3651223567,GB +3651223568,3651223583,EU 3651223584,3651223607,GB +3651223608,3651223647,EU 3651223648,3651223663,ES -3651223744,3651223775,GB +3651223664,3651227135,EU 3651227136,3651227391,GB +3651227392,3651230719,EU 3651230720,3651231743,MU +3651231744,3651232255,EU 3651232256,3651232287,GB +3651232288,3651232319,EU 3651232320,3651232383,GB +3651232384,3651232447,EU 3651232448,3651232511,GB +3651232512,3651233791,EU 3651233792,3651233855,GB -3651234048,3651234303,GB +3651233856,3651236031,EU 3651236032,3651236063,GB +3651236064,3651236863,EU 3651236864,3651237631,SC +3651237632,3651237887,EU 3651237888,3651238399,SC +3651238400,3651239935,EU 3651239936,3651272703,GB 3651272704,3651338239,CH 3651338240,3651403775,GB @@ -82542,11 +131286,16 @@ 3651694848,3651694975,NG 3651694976,3651695103,PT 3651695104,3651695359,CV -3651695360,3651696639,PT +3651695360,3651695871,AO +3651695872,3651696127,PT +3651696128,3651696383,AO +3651696384,3651696639,PT 3651696640,3651698687,AO 3651698688,3651702783,PL 3651702784,3651706879,GB -3651706880,3651710975,MT +3651706880,3651709791,MT +3651709792,3651709807,CY +3651709808,3651710975,MT 3651710976,3651715071,AZ 3651715072,3651719167,PL 3651719168,3651723263,CZ @@ -82556,32 +131305,56 @@ 3651747840,3651751935,FI 3651751936,3651756031,RU 3651756032,3651764223,IT -3651764224,3651772415,CH +3651764224,3651764679,CH +3651764680,3651764687,FR +3651764688,3651772415,CH 3651772416,3651776511,GB 3651776512,3651780607,CZ 3651780608,3651784703,TR -3651784704,3651788799,CS +3651784704,3651788799,RS 3651788800,3651792895,NL 3651792896,3651796991,FR 3651796992,3651813375,NL 3651813376,3651821567,RU -3651821568,3651825663,DE +3651821568,3651825663,CZ 3651825664,3651829759,RU 3651829760,3651833855,NO -3651837952,3651842047,IT -3651842048,3651846143,GB -3651846144,3651850239,GR +3651833856,3651837951,ML +3651837952,3651842047,PL +3651842048,3651846143,DE +3651846144,3651850239,NO 3651850240,3651854335,RU 3651854336,3651858431,IT -3651858432,3651858687,CS -3651858688,3651858943,SC -3651858944,3651862527,CS 3651862528,3651866623,RU 3651866624,3651870719,FR 3651870720,3651874815,IT 3651874816,3651878911,PL 3651878912,3651883007,RU -3651883008,3651887103,BE +3651883008,3651885823,BE +3651885824,3651885847,CD +3651885848,3651885851,BE +3651885852,3651885855,CD +3651885856,3651885867,BE +3651885868,3651885875,CD +3651885876,3651885903,BE +3651885904,3651885919,CD +3651885920,3651886335,BE +3651886336,3651886347,CD +3651886348,3651886379,BE +3651886380,3651886383,CD +3651886384,3651886391,BE +3651886392,3651886395,CD +3651886396,3651886435,BE +3651886436,3651886451,CD +3651886452,3651886455,BE +3651886456,3651886459,CD +3651886460,3651886463,BE +3651886464,3651886471,CD +3651886472,3651886479,BE +3651886480,3651886495,CD +3651886496,3651886511,BE +3651886512,3651886527,CD +3651886528,3651887103,BE 3651887104,3651891199,GB 3651891200,3651895295,DE 3651895296,3651899391,GB @@ -82593,20 +131366,16 @@ 3651909376,3651909631,DE 3651909632,3651910655,IQ 3651910656,3651910783,DE -3651910784,3651911231,IQ -3651911232,3651911295,IR -3651911296,3651911359,DE -3651911360,3651911551,IQ -3651911552,3651911583,DE -3651911584,3651911615,IQ -3651911616,3651911623,DE +3651910784,3651911167,IQ +3651911168,3651911623,DE 3651911624,3651911631,IQ 3651911632,3651911643,DE 3651911644,3651911647,IR -3651911648,3651915775,DE +3651911648,3651911679,DE +3651911680,3651915775,NO 3651915776,3651919871,IS 3651919872,3651923967,RU -3651923968,3651928063,GB +3651923968,3651928063,DE 3651928064,3651932159,IT 3651932160,3651936255,RU 3651936256,3651938175,DE @@ -82654,7 +131423,9 @@ 3651940928,3651940991,IT 3651940992,3651941027,DE 3651941028,3651941055,TR -3651941056,3651941183,DE +3651941056,3651941087,DE +3651941088,3651941119,GB +3651941120,3651941183,DE 3651941184,3651941215,IT 3651941216,3651941249,TR 3651941250,3651941695,DE @@ -82668,52 +131439,72 @@ 3651942816,3651944447,DE 3651944448,3651948543,ES 3651948544,3651952639,FO -3651952640,3651953151,AE -3651953152,3651954175,IR +3651952640,3651954175,IR 3651954176,3651954431,AE -3651954432,3651955711,IR -3651955712,3651955967,AE -3651955968,3651958271,IR -3651958272,3651958783,UA -3651958784,3651959039,AE -3651959040,3651960831,IR -3651960832,3651964927,IT +3651954432,3651958271,IR +3651958272,3651958783,AE +3651958784,3651959039,IR +3651959040,3651960831,AE +3651960832,3651964927,GB 3651964928,3651969023,SK 3651969024,3651977215,DE 3651977216,3651985407,IT 3651985408,3651993599,PL -3651993600,3652001791,RU +3651997696,3652001791,RU 3652001792,3652005887,HU -3652005888,3652014079,GB +3652005888,3652009983,GB +3652009984,3652011519,RU +3652011520,3652011775,IT +3652011776,3652014079,RU 3652014080,3652018175,SA 3652018176,3652018239,IE -3652018240,3652018943,GB -3652018944,3652019167,IE -3652019168,3652019199,GB -3652019200,3652019423,IE -3652019424,3652019583,GB -3652019584,3652019599,IE -3652019600,3652019615,GB -3652019616,3652019663,IE +3652018240,3652018303,GB +3652018304,3652018687,IE +3652018688,3652018943,GB +3652018944,3652019169,IE +3652019170,3652019199,GB +3652019200,3652019327,IE +3652019328,3652019335,GB +3652019336,3652019351,IE +3652019352,3652019359,GB +3652019360,3652019407,IE +3652019408,3652019423,GB +3652019424,3652019455,IE +3652019456,3652019471,GB +3652019472,3652019479,IE +3652019480,3652019487,GB +3652019488,3652019527,IE +3652019528,3652019551,GB +3652019552,3652019615,IE +3652019616,3652019631,GB +3652019632,3652019663,IE 3652019664,3652019679,GB 3652019680,3652019687,IE -3652019688,3652019727,GB -3652019728,3652019735,IE -3652019736,3652019775,GB -3652019776,3652019791,IE +3652019688,3652019695,GB +3652019696,3652019735,IE +3652019736,3652019751,GB +3652019752,3652019791,IE 3652019792,3652019807,GB 3652019808,3652019815,IE 3652019816,3652019887,GB -3652019888,3652019903,IE -3652019904,3652019951,GB -3652019952,3652019967,IE -3652019968,3652020479,GB -3652020480,3652020735,IE -3652020736,3652020767,GB -3652020768,3652020799,IE +3652019888,3652019935,IE +3652019936,3652019951,GB +3652019952,3652020255,IE +3652020256,3652020279,GB +3652020280,3652020351,IE +3652020352,3652020479,GB +3652020480,3652020767,IE +3652020768,3652020799,GB 3652020800,3652020863,DE -3652020864,3652020991,IE -3652020992,3652021791,GB +3652020864,3652020991,GB +3652020992,3652021063,IE +3652021064,3652021087,GB +3652021088,3652021151,IE +3652021152,3652021247,GB +3652021248,3652021423,IE +3652021424,3652021759,GB +3652021760,3652021775,IE +3652021776,3652021791,GB 3652021792,3652021887,IE 3652021888,3652022271,GB 3652022272,3652026367,ES @@ -82740,46 +131531,52 @@ 3652034144,3652034175,CH 3652034176,3652034207,NL 3652034208,3652034239,ES -3652034240,3652034303,VG -3652034304,3652034367,GD +3652034240,3652034271,VG +3652034272,3652034367,GD 3652034368,3652034383,ES 3652034384,3652034399,VG 3652034400,3652034559,GD 3652034560,3652046847,PL -3652046848,3652050943,IE +3652046848,3652050271,IE +3652050272,3652050299,GB +3652050300,3652050499,IE +3652050500,3652050503,GB +3652050504,3652050527,IE +3652050528,3652050535,GB +3652050536,3652050567,IE +3652050568,3652050615,GB +3652050616,3652050619,IE +3652050620,3652050671,GB +3652050672,3652050787,IE +3652050788,3652050791,GB +3652050792,3652050943,IE 3652050944,3652055039,LI 3652055040,3652059135,NO -3652059136,3652063231,BE +3652059136,3652063231,RU 3652063232,3652067327,IR 3652067328,3652071423,TR -3652071424,3652075519,IT +3652071424,3652075519,BG 3652075520,3652083711,SE 3652083712,3652087807,RU -3652087808,3652091903,IT -3652091904,3652095999,GB +3652087808,3652095999,IT 3652096000,3652100095,BG -3652100096,3652104191,SL -3652104192,3652105471,RU +3652100096,3652105471,RU 3652105472,3652105535,US 3652105536,3652108287,RU 3652108288,3652116479,FR 3652116480,3652120575,TM 3652120576,3652124671,GB -3652124672,3652124927,DE -3652124928,3652125183,NL -3652125184,3652128767,DE -3652128768,3652132863,RU -3652132864,3652133119,FR -3652133120,3652133375,NL -3652133376,3652136959,FR +3652124672,3652128767,UA +3652128768,3652136959,RU 3652136960,3652141055,IT -3652141056,3652141071,NL -3652141072,3652141119,GB -3652141120,3652141151,NL -3652141152,3652141311,GB -3652141312,3652141567,NL -3652141568,3652144895,GB -3652144896,3652145151,NL +3652141056,3652141311,GB +3652141312,3652143103,A2 +3652143104,3652143359,GB +3652143360,3652143871,A2 +3652143872,3652144127,GB +3652144128,3652144383,KE +3652144384,3652144639,CM +3652144640,3652145151,A2 3652145152,3652149247,UA 3652149248,3652153343,DE 3652153344,3652157439,SE @@ -82795,10 +131592,18 @@ 3652186880,3652187007,AT 3652187008,3652190207,DE 3652190208,3652714495,GB -3652714496,3653039103,DE +3652714496,3652985039,DE +3652985040,3652985047,FR +3652985048,3653029775,DE +3653029776,3653029791,RO +3653029792,3653039103,DE 3653039104,3653039359,IT 3653039360,3653238783,DE -3653238784,3653369855,CH +3653238784,3653334141,CH +3653334142,3653334142,AT +3653334143,3653341871,CH +3653341872,3653341879,AT +3653341880,3653369855,CH 3653369856,3653373951,IT 3653373952,3653378047,NL 3653378048,3653382143,DE @@ -82807,163 +131612,186 @@ 3653390336,3653394431,FR 3653394432,3653402623,NL 3653402624,3653403135,AT -3653403136,3653403647,UA -3653403648,3653403903,GH +3653403136,3653403647,CD +3653403648,3653403903,ZW 3653403904,3653403911,UA 3653403912,3653403919,IQ 3653403920,3653403931,UA -3653403932,3653403935,GB +3653403932,3653403935,A2 3653403936,3653403943,IQ 3653403944,3653403951,LB -3653403952,3653403967,IQ +3653403952,3653403959,IQ +3653403960,3653403967,MW 3653403968,3653403983,NG 3653403984,3653403999,UA -3653404000,3653404015,LB -3653404016,3653404023,IQ -3653404024,3653404031,GB -3653404032,3653404039,LB -3653404040,3653404047,GB -3653404048,3653404055,LB -3653404056,3653404063,GB -3653404064,3653404079,LB +3653404000,3653404008,LB +3653404009,3653404015,A2 +3653404016,3653404023,LB +3653404024,3653404039,A2 +3653404040,3653404055,IQ +3653404056,3653404063,A2 +3653404064,3653404071,LB +3653404072,3653404079,AO 3653404080,3653404087,UA 3653404088,3653404095,LB 3653404096,3653404103,IQ -3653404104,3653404111,GB +3653404104,3653404111,A2 3653404112,3653404119,MD -3653404120,3653404127,TR -3653404128,3653404135,CS -3653404136,3653404143,AM -3653404144,3653404159,GB +3653404120,3653404127,A2 +3653404128,3653404135,RS +3653404136,3653404159,A2 3653404160,3653404415,AT -3653404416,3653404543,IQ +3653404416,3653404543,A2 3653404544,3653404559,NG -3653404560,3653404567,CM -3653404568,3653404575,LB +3653404560,3653404567,IQ +3653404568,3653404575,LY 3653404576,3653404591,TR -3653404592,3653404599,GH -3653404600,3653404607,GB +3653404592,3653404607,A2 3653404608,3653404655,UA -3653404656,3653404671,GB +3653404656,3653404671,A2 3653404672,3653404679,TR -3653404680,3653404687,IQ -3653404688,3653404707,GB +3653404680,3653404707,A2 3653404708,3653404713,IQ -3653404714,3653404719,GB +3653404714,3653404719,A2 3653404720,3653404735,LB -3653404736,3653404751,GB +3653404736,3653404751,A2 3653404752,3653404759,AM -3653404760,3653404767,GB -3653404768,3653404775,LB -3653404776,3653404783,GB -3653404784,3653404791,IQ -3653404792,3653404807,GB -3653404808,3653404815,IQ +3653404760,3653404815,A2 3653404816,3653404831,LB 3653404832,3653404847,NG -3653404848,3653404855,GB +3653404848,3653404855,A2 3653404856,3653404863,SL -3653404864,3653404871,US -3653404872,3653404879,GB +3653404864,3653404871,LY +3653404872,3653404879,A2 3653404880,3653404887,UA -3653404888,3653404903,GB +3653404888,3653404903,A2 3653404904,3653404911,IQ -3653404912,3653404943,GB -3653404944,3653404959,IQ +3653404912,3653404919,LY +3653404920,3653404959,A2 3653404960,3653404975,UA -3653404976,3653404983,TD +3653404976,3653404983,A2 3653404984,3653404991,AM -3653404992,3653404999,LB -3653405000,3653405007,IQ +3653404992,3653404999,IQ +3653405000,3653405007,A2 3653405008,3653405031,LB -3653405032,3653405039,GB +3653405032,3653405039,A2 3653405040,3653405047,LB -3653405048,3653405071,IQ -3653405072,3653405079,LY -3653405080,3653405087,GB +3653405048,3653405055,IQ +3653405056,3653405063,A2 +3653405064,3653405079,IQ +3653405080,3653405087,A2 3653405088,3653405095,LY 3653405096,3653405103,NG -3653405104,3653405119,CY -3653405120,3653405135,AM -3653405136,3653405183,UA +3653405104,3653405119,A2 +3653405120,3653405135,ZW +3653405136,3653405151,UA +3653405152,3653405167,A2 +3653405168,3653405183,UA 3653405184,3653405439,AT -3653405440,3653405695,IQ -3653405696,3653406975,NG -3653406976,3653407007,GB -3653407008,3653407015,TZ +3653405440,3653407015,A2 3653407016,3653407023,UG -3653407024,3653407031,KE -3653407032,3653407071,NG -3653407072,3653407151,GB -3653407152,3653407159,NG -3653407160,3653407167,GB +3653407024,3653407031,A2 +3653407032,3653407039,ZW +3653407040,3653407071,NG +3653407072,3653407087,A2 +3653407088,3653407095,NG +3653407096,3653407103,A2 +3653407104,3653407111,UG +3653407112,3653407119,ZM +3653407120,3653407127,ZW +3653407128,3653407167,A2 3653407168,3653407231,NG -3653407232,3653407359,GB -3653407360,3653407423,NG +3653407232,3653407359,A2 +3653407360,3653407375,NG +3653407376,3653407391,A2 +3653407392,3653407399,NG +3653407400,3653407423,A2 3653407424,3653407487,ZW -3653407488,3653407615,GB -3653407616,3653407631,NG -3653407632,3653407647,ZM -3653407648,3653407679,GB +3653407488,3653407615,A2 +3653407616,3653407639,NG +3653407640,3653407647,ZM +3653407648,3653407679,A2 3653407680,3653407695,UG 3653407696,3653407703,CD 3653407704,3653407711,NG -3653407712,3653407719,US -3653407720,3653407743,GB +3653407712,3653407727,A2 +3653407728,3653407743,ZW 3653407744,3653407999,AT -3653408000,3653408023,GB -3653408024,3653408031,SO -3653408032,3653408055,GB -3653408056,3653408063,TZ +3653408000,3653408023,A2 +3653408024,3653408031,UG +3653408032,3653408047,ZW +3653408048,3653408063,A2 3653408064,3653408071,ZM 3653408072,3653408079,NG 3653408080,3653408087,MW -3653408088,3653408143,GB -3653408144,3653408159,NG -3653408160,3653408175,GB -3653408176,3653408183,NG +3653408088,3653408143,A2 +3653408144,3653408151,NG +3653408152,3653408159,ZM +3653408160,3653408167,A2 +3653408168,3653408175,ZW +3653408176,3653408183,A2 3653408184,3653408191,MW -3653408192,3653408223,GB -3653408224,3653408231,ZM -3653408232,3653408239,GB +3653408192,3653408215,A2 +3653408216,3653408223,MW +3653408224,3653408231,A2 +3653408232,3653408239,KE 3653408240,3653408247,ZM -3653408248,3653409279,GB +3653408248,3653408767,A2 +3653408768,3653409023,CD +3653409024,3653409039,A2 +3653409040,3653409047,NG +3653409048,3653409087,A2 +3653409088,3653409095,CD +3653409096,3653409103,A2 +3653409104,3653409127,NG +3653409128,3653409143,CD +3653409144,3653409151,NG +3653409152,3653409175,A2 +3653409176,3653409183,NG +3653409184,3653409191,A2 +3653409192,3653409199,NG +3653409200,3653409223,A2 +3653409224,3653409231,NG +3653409232,3653409279,A2 3653409280,3653409535,TZ 3653409536,3653409559,UA 3653409560,3653409567,CM 3653409568,3653409575,UA -3653409576,3653409615,GB +3653409576,3653409615,A2 3653409616,3653409623,IQ 3653409624,3653409639,NG -3653409640,3653409647,GB +3653409640,3653409647,A2 3653409648,3653409663,NG 3653409664,3653409791,CM 3653409792,3653409855,ZW -3653409856,3653409919,GB +3653409856,3653409919,A2 3653409920,3653410047,NG 3653410048,3653410063,YT 3653410064,3653410079,UG -3653410080,3653410087,GB -3653410088,3653410095,CM +3653410080,3653410087,A2 +3653410088,3653410095,IQ 3653410096,3653410111,ZW -3653410112,3653410127,NG -3653410128,3653410143,GB -3653410144,3653410183,NG +3653410112,3653410119,A2 +3653410120,3653410127,NG +3653410128,3653410143,A2 +3653410144,3653410151,ET +3653410152,3653410159,KE +3653410160,3653410175,NG +3653410176,3653410183,KE 3653410184,3653410191,MZ 3653410192,3653410199,ZW -3653410200,3653410215,GB +3653410200,3653410215,A2 3653410216,3653410223,ZW -3653410224,3653410239,GB -3653410240,3653410247,SO +3653410224,3653410247,A2 3653410248,3653410255,ZM -3653410256,3653410263,MW -3653410264,3653410271,IQ -3653410272,3653410279,GB -3653410280,3653410287,NG -3653410288,3653410295,GB -3653410296,3653410303,NG +3653410256,3653410263,A2 +3653410264,3653410271,NG +3653410272,3653410279,SD +3653410280,3653410287,LU +3653410288,3653410295,A2 +3653410296,3653410303,MW 3653410304,3653410815,GB -3653410816,3653414911,HU +3653410816,3653414911,CZ 3653414912,3653419007,IT 3653419008,3653423103,IL 3653423104,3653427199,GB @@ -82980,7 +131808,23 @@ 3653468160,3653472255,GR 3653472256,3653472279,NL 3653472280,3653472291,AF -3653472292,3653474303,NL +3653472292,3653472511,NL +3653472512,3653472559,AF +3653472560,3653472567,NL +3653472568,3653472575,AF +3653472576,3653472591,NL +3653472592,3653472807,AF +3653472808,3653472815,NL +3653472816,3653472823,AF +3653472824,3653472831,NL +3653472832,3653472915,AF +3653472916,3653472919,NL +3653472920,3653472983,AF +3653472984,3653472999,NL +3653473000,3653473039,AF +3653473040,3653473064,NL +3653473065,3653473071,AF +3653473072,3653474303,NL 3653474304,3653474367,US 3653474368,3653476351,NL 3653476352,3653480447,CZ @@ -82997,9 +131841,9 @@ 3653518400,3653518479,AT 3653518480,3653518495,SK 3653518496,3653519815,AT -3653519816,3653519871,SK -3653519872,3653520191,AT -3653520192,3653520255,SK +3653519816,3653519839,SK +3653519840,3653520223,AT +3653520224,3653520255,SK 3653520256,3653522975,AT 3653522976,3653522991,SK 3653522992,3653523199,AT @@ -83015,24 +131859,18 @@ 3653525152,3653525183,AT 3653525184,3653525215,SK 3653525216,3653525503,AT -3653525504,3653533695,RU -3653533696,3653537791,HU +3653525504,3653529599,RU +3653529600,3653533695,CZ 3653537792,3653541887,AT -3653541888,3653544959,UA -3653544960,3653545215,AT -3653545216,3653545343,UA -3653545344,3653545471,SE -3653545472,3653545727,UA -3653545728,3653545791,SE -3653545792,3653545855,UA -3653545856,3653545983,SE +3653541888,3653545983,UA 3653545984,3653550079,CH -3653550080,3653554175,DE +3653550080,3653554175,GB 3653554176,3653558271,CZ -3653558272,3653566463,GB -3653566464,3653570559,DE -3653570560,3653574655,NO -3653574656,3653578751,GB +3653558272,3653559671,GB +3653559672,3653559679,US +3653559680,3653566463,GB +3653566464,3653570559,RU +3653574656,3653578751,CZ 3653578752,3653582847,SE 3653582848,3653586943,PL 3653586944,3653591039,DE @@ -83042,25 +131880,25 @@ 3653603328,3653607423,CZ 3653607424,3653611519,PL 3653611520,3653615615,HU -3653615616,3653619711,GB +3653615616,3653619711,RU 3653619712,3653623295,CH 3653623296,3653623551,JP 3653623552,3653623807,US -3653623808,3653627903,DE -3653627904,3653636095,RU +3653623808,3653636095,RU 3653636096,3653640191,NL 3653640192,3653644031,GB 3653644032,3653644047,BE 3653644048,3653644271,GB 3653644272,3653644275,BE 3653644276,3653648383,GB +3653648384,3653652479,SE 3653652480,3653656575,RU -3653656576,3653660671,HR +3653656576,3653660671,GB 3653660672,3653664767,CZ 3653664768,3653668863,UA 3653668864,3653672959,SE 3653672960,3653681151,RU -3653681152,3653685247,NL +3653681152,3653685247,ES 3653685248,3653689343,DK 3653689344,3653693439,LV 3653693440,3653697535,DE @@ -83083,12 +131921,13 @@ 3653718016,3653722111,AT 3653722112,3653730303,LV 3653730304,3653734399,BA +3653734400,3653738495,KE 3653738496,3653740295,GB 3653740296,3653740303,US 3653740304,3653744895,GB 3653744896,3653744959,AE 3653744960,3653746687,GB -3653746688,3653750783,GR +3653746688,3653750783,DE 3653750784,3653754879,RU 3653754880,3653758975,UA 3653758976,3653763071,RU @@ -83099,7 +131938,9 @@ 3654035584,3654035591,US 3654035592,3654035607,GB 3654035608,3654035615,SE -3654035616,3654061035,GB +3654035616,3654045879,GB +3654045880,3654045887,IT +3654045888,3654061035,GB 3654061036,3654061039,US 3654061040,3654061951,GB 3654061952,3654062079,DE @@ -83110,24 +131951,19 @@ 3654607872,3654608127,NO 3654608128,3654608895,SE 3654608896,3654609919,NO -3654609920,3654609927,DK -3654609928,3654610431,SE -3654610432,3654610687,RU -3654610688,3654611143,SE -3654611144,3654611147,US -3654611148,3654612991,SE -3654612992,3654612995,RU -3654612996,3654612999,SE -3654613000,3654613023,RU -3654613024,3654613055,SE -3654613056,3654613151,RU +3654609920,3654613007,SE +3654613008,3654613015,RU +3654613016,3654613055,SE +3654613056,3654613071,RU +3654613072,3654613087,SE +3654613088,3654613151,RU 3654613152,3654613247,SE 3654613248,3654614015,NO 3654614016,3654614031,SE 3654614032,3654614047,US 3654614048,3654614079,SE -3654614080,3654614143,FI -3654614144,3654614527,SE +3654614080,3654614271,FI +3654614272,3654614527,SE 3654614528,3654614783,RU 3654614784,3654615039,NO 3654615040,3654811647,SE @@ -83138,11 +131974,7 @@ 3656229704,3656229711,ES 3656229712,3656233999,DE 3656234000,3656234007,NL -3656234008,3656234263,DE -3656234264,3656234271,US -3656234272,3656236359,DE -3656236360,3656236367,SK -3656236368,3656236527,DE +3656234008,3656236527,DE 3656236528,3656236535,GB 3656236536,3656236543,US 3656236544,3656633487,DE @@ -83150,9 +131982,7 @@ 3656633496,3656633503,US 3656633504,3656650583,DE 3656650584,3656650591,US -3656650592,3656650623,DE -3656650624,3656650687,CN -3656650688,3656661183,DE +3656650592,3656661183,DE 3656661184,3656661199,AT 3656661200,3656661583,DE 3656661584,3656661599,AT @@ -83202,7 +132032,21 @@ 3663999744,3663999999,KH 3664000000,3664000767,AU 3664000768,3664001023,ID -3664001024,3664052223,AU +3664001024,3664001279,NZ +3664001280,3664001535,LK +3664001536,3664001791,MY +3664001792,3664002047,AU +3664002048,3664002303,VN +3664002304,3664002559,LK +3664002560,3664003327,ID +3664003328,3664003583,NZ +3664003584,3664003839,TH +3664003840,3664004095,JP +3664004096,3664004351,NZ +3664004352,3664004607,MY +3664004608,3664004863,SG +3664004864,3664005119,KH +3664005120,3664006143,ID 3664052224,3664084991,NZ 3664084992,3664117759,KR 3664117760,3664248831,HK @@ -83290,12 +132134,12 @@ 3700424704,3700752383,JP 3700752384,3700817919,KR 3700817920,3700977663,JP -3700977664,3700981759,AU +3700977664,3700979711,AU +3700979712,3700981759,JP 3700981760,3701014527,CN 3701014528,3701080063,JP 3701080064,3701211135,CN 3701211136,3701252095,JP -3701252096,3701256191,AU 3701256192,3701258239,SG 3701258240,3701260287,IN 3701260288,3701293055,JP @@ -83335,15 +132179,12 @@ 3707764736,3708600319,CN 3708600320,3708616703,JP 3708616704,3708813311,CN -3708813312,3714175487,JP -3714175488,3714175743,DK -3714175744,3715629055,JP +3708813312,3715629055,JP 3715629056,3715653631,TW 3715653632,3715655679,BD 3715655680,3715657727,IN -3715657728,3715659775,AU -3715659776,3715661823,SG -3715661824,3715674111,AU +3715657728,3715661823,SG +3715661824,3715672063,AU 3715674112,3715678207,HK 3715678208,3715694591,PK 3715694592,3715710975,VN @@ -83351,7 +132192,7 @@ 3715719168,3715727359,PH 3715727360,3715735551,AU 3715735552,3715741695,JP -3715741696,3715743743,AU +3715741696,3715743743,PH 3715743744,3715760127,JP 3715760128,3715891199,CN 3715891200,3716153343,HK @@ -83363,7 +132204,6 @@ 3716431872,3716440063,KR 3716440064,3716444159,JP 3716444160,3716446207,PK -3716446208,3716448255,AU 3716448256,3716464639,JP 3716464640,3716481023,ID 3716481024,3716489215,VN @@ -83420,7 +132260,7 @@ 3735552000,3739222015,CN 3739222016,3739570175,JP 3739570176,3739572223,ID -3739572224,3739574271,AU +3739572224,3739574271,TH 3739574272,3739680767,JP 3739680768,3739697151,KR 3739697152,3739746303,JP @@ -83429,4 +132269,90 @@ 3740925952,3741024255,TW 3741024256,3741057023,KR 3741057024,3741319167,VN -3758096384,4294967295,US +3741319168,3742367743,CN +3742367744,3742629887,HK +3742629888,3742760959,CN +3742760960,3742892031,TW +3742892032,3742957567,TH +3742957568,3742973951,PH +3742973952,3742982143,SG +3742982144,3742986239,ID +3742986240,3742988287,AU +3742990336,3743006719,JP +3743006720,3743014911,TH +3743014912,3743016959,AU +3743019008,3743022079,MY +3743022080,3743023103,AP +3743023104,3743027199,TW +3743027200,3743031295,SG +3743031296,3743035391,IN +3743035392,3743039487,HK +3743039488,3743055871,TW +3743055872,3743088639,KR +3743088640,3743096831,AU +3743105024,3743106047,AU +3743107072,3743109119,JP +3743109120,3743113215,BD +3743113216,3743115263,AU +3743117312,3743118335,BD +3743119360,3743120383,IN +3743120384,3743121407,JP +3743121408,3743125503,MY +3743125504,3743129599,ID +3743154176,3743186943,MY +3743186944,3743219711,KR +3743285248,3743416319,IN +3743416320,3745513471,KR +3745513472,3749838847,CN +3749838848,3749839103,AP +3749839872,3749840895,IN +3749840896,3749841919,PH +3749841920,3749847039,AU +3749847040,3749855231,HK +3749855232,3749969919,KR +3749969920,3750232063,JP +3750232064,3750756351,TW +3751804928,3752067071,CN +3752067072,3752132607,ID +3752132608,3752133631,BD +3752133632,3752134655,ID +3752134656,3752136703,TW +3752136704,3752137727,NZ +3752138752,3752140799,IN +3752140800,3752148991,JP +3752148992,3752153087,NZ +3752157184,3752165375,AU +3752165376,3752198143,KR +3752198144,3752329215,CN +3752329216,3752853503,KR +3753902080,3754033151,CN +3754033152,3754164223,KR +3754164224,3754229759,IN +3754229760,3754295295,HK +3754295296,3754426367,CN +3754426368,3754491903,TW +3754491904,3754688511,CN +3754688512,3754950655,TH +3754950656,3755474943,CN +3755474944,3755737087,JP +3755737088,3755868159,CN +3755868160,3755933695,KR +3755933696,3755966463,JP +3755966464,3755974655,IN +3755974656,3755976703,JP +3755976704,3755978751,KH +3755978752,3755986943,CN +3755986944,3755988991,JP +3755988992,3755990015,HK +3755991040,3755999231,JP +3757047808,3757834239,CN +3757834240,3757867007,AU +3757899776,3757965311,KR +3757965312,3758063615,CN +3758063616,3758079999,HK +3758080000,3758088191,KR +3758088192,3758090239,ID +3758090240,3758091263,AU +3758092288,3758093311,HK +3758093312,3758094335,IN +3758094336,3758095359,AU diff -Nru tor-0.2.0.34/src/config/Makefile.am tor-0.2.2.16-alpha/src/config/Makefile.am --- tor-0.2.0.34/src/config/Makefile.am 2008-06-03 19:33:24.000000000 +0000 +++ tor-0.2.2.16-alpha/src/config/Makefile.am 2009-05-18 23:47:00.000000000 +0000 @@ -1,11 +1,14 @@ confdir = $(sysconfdir)/tor + tordatadir = $(datadir)/tor EXTRA_DIST = geoip +# fallback-consensus conf_DATA = torrc.sample tordata_DATA = geoip +# fallback_consensus # If we don't have it, fake it. fallback-consensus: diff -Nru tor-0.2.0.34/src/config/Makefile.in tor-0.2.2.16-alpha/src/config/Makefile.in --- tor-0.2.0.34/src/config/Makefile.in 2009-02-09 03:31:02.000000000 +0000 +++ tor-0.2.2.16-alpha/src/config/Makefile.in 2010-09-17 06:08:41.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -56,8 +56,10 @@ tordataDATA_INSTALL = $(INSTALL_DATA) DATA = $(conf_DATA) $(tordata_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -92,6 +94,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -100,7 +103,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -111,8 +116,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -166,6 +174,7 @@ confdir = $(sysconfdir)/tor tordatadir = $(datadir)/tor EXTRA_DIST = geoip +# fallback-consensus conf_DATA = torrc.sample tordata_DATA = geoip all: all-am @@ -368,6 +377,7 @@ pdf-am ps ps-am uninstall uninstall-am uninstall-confDATA \ uninstall-tordataDATA +# fallback_consensus # If we don't have it, fake it. fallback-consensus: diff -Nru tor-0.2.0.34/src/config/torrc.sample.in tor-0.2.2.16-alpha/src/config/torrc.sample.in --- tor-0.2.0.34/src/config/torrc.sample.in 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/config/torrc.sample.in 2010-07-13 01:37:00.000000000 +0000 @@ -1,20 +1,20 @@ ## Configuration file for a typical Tor user -## Last updated 22 December 2007 for Tor 0.2.0.14-alpha. +## Last updated 16 July 2009 for Tor 0.2.2.1-alpha. ## (May or may not work for much older or much newer versions of Tor.) ## ## Lines that begin with "## " try to explain what's going on. Lines ## that begin with just "#" are disabled commands: you can enable them ## by removing the "#" symbol. ## -## See the man page, or https://www.torproject.org/tor-manual-dev.html, +## See 'man tor', or https://www.torproject.org/tor-manual.html, ## for more options you can use in this file. ## ## Tor will look for this file in various places based on your platform: -## http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#torrc +## https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ#torrc ## Replace this with "SocksPort 0" if you plan to run Tor only as a -## server, and not make any local application connections yourself. +## relay, and not make any local application connections yourself. SocksPort 9050 # what port to open for local application connections SocksListenAddress 127.0.0.1 # accept connections only from localhost #SocksListenAddress 192.168.0.1:9100 # listen on this IP:port also @@ -53,6 +53,10 @@ ## The port on which Tor will listen for local connections from Tor ## controller applications, as documented in control-spec.txt. #ControlPort 9051 +## If you enable the controlport, be sure to enable one of these +## authentication methods, to prevent attackers from accessing it. +#HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C +#CookieAuthentication 1 ############### This section is just for location-hidden services ### @@ -74,54 +78,75 @@ # ## See https://www.torproject.org/docs/tor-doc-relay for details. -## A unique handle for your server. +## Required: what port to advertise for incoming Tor connections. +#ORPort 9001 +## If you want to listen on a port other than the one advertised +## in ORPort (e.g. to advertise 443 but bind to 9090), uncomment the +## line below too. You'll need to do ipchains or other port forwarding +## yourself to make this work. +#ORListenAddress 0.0.0.0:9090 + +## A handle for your relay, so people don't have to refer to it by key. #Nickname ididnteditheconfig -## The IP or FQDN for your server. Leave commented out and Tor will guess. +## The IP address or full DNS name for your relay. Leave commented out +## and Tor will guess. #Address noname.example.com -## Define these to limit the bandwidth usage of relayed (server) -## traffic. Your own traffic is still unthrottled. -## Note that RelayBandwidthRate must be at least 20 KB. -#RelayBandwidthRate 100 KBytes # Throttle traffic to 100KB/s (800Kbps) -#RelayBandwidthBurst 200 KBytes # But allow bursts up to 200KB/s (1600Kbps) +## Define these to limit how much relayed traffic you will allow. Your +## own traffic is still unthrottled. Note that RelayBandwidthRate must +## be at least 20 KB. +#RelayBandwidthRate 100 KB # Throttle traffic to 100KB/s (800Kbps) +#RelayBandwidthBurst 200 KB # But allow bursts up to 200KB/s (1600Kbps) + +## Use these to restrict the maximum traffic per day, week, or month. +## Note that this threshold applies to sent _and_ to received bytes, +## not to their sum: Setting "4 GB" may allow up to 8 GB +## total before hibernating. +## +## Set a maximum of 4 gigabytes each way per period. +#AccountingMax 4 GB +## Each period starts daily at midnight (AccountingMax is per day) +#AccountingStart day 00:00 +## Each period starts on the 3rd of the month at 15:00 (AccountingMax +## is per month) +#AccountingStart month 3 15:00 ## Contact info to be published in the directory, so we can contact you -## if your server is misconfigured or something else goes wrong. +## if your relay is misconfigured or something else goes wrong. Google +## indexes this, so spammers might also collect it. #ContactInfo Random Person ## You might also include your PGP or GPG fingerprint if you have one: #ContactInfo 1234D/FFFFFFFF Random Person -## Required: what port to advertise for Tor connections. -#ORPort 9001 -## If you need to listen on a port other than the one advertised -## in ORPort (e.g. to advertise 443 but bind to 9090), uncomment the -## line below too. You'll need to do ipchains or other port forwarding -## yourself to make this work. -#ORListenAddress 0.0.0.0:9090 - ## Uncomment this to mirror directory information for others. Please do ## if you have enough bandwidth. #DirPort 9030 # what port to advertise for directory connections -## If you need to listen on a port other than the one advertised +## If you want to listen on a port other than the one advertised ## in DirPort (e.g. to advertise 80 but bind to 9091), uncomment the line ## below too. You'll need to do ipchains or other port forwarding yourself ## to make this work. #DirListenAddress 0.0.0.0:9091 - -## Uncomment this if you run more than one Tor server, and add the -## nickname of each Tor server you control, even if they're on different -## networks. You declare it here so Tor clients can avoid using more than -## one of your servers in a single circuit. See -## http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#MultipleServers -#MyFamily nickname1,nickname2,... +## Uncomment to return an arbitrary blob of html on your DirPort. Now you +## can explain what Tor is if anybody wonders why your IP address is +## contacting them. See contrib/tor-exit-notice.html in Tor's source +## distribution for a sample. +#DirPortFrontPage @CONFDIR@/tor-exit-notice.html + +## Uncomment this if you run more than one Tor relay, and add the identity +## key fingerprint of each Tor relay you control, even if they're on +## different networks. You declare it here so Tor clients can avoid +## using more than one of your relays in a single circuit. See +## https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ#MultipleServers +#MyFamily $keyid,$keyid,... ## A comma-separated list of exit policies. They're considered first ## to last, and the first match wins. If you want to _replace_ ## the default exit policy, end this with either a reject *:* or an ## accept *:*. Otherwise, you're _augmenting_ (prepending to) the ## default exit policy. Leave commented to just use the default, which is -## available in the man page or at https://www.torproject.org/documentation.html +## described in the man page or at +## https://www.torproject.org/documentation.html ## ## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses ## for issues you might encounter if you use the default exit policy. @@ -134,17 +159,12 @@ #ExitPolicy accept *:119 # accept nntp as well as default exit policy #ExitPolicy reject *:* # no exits allowed # -################ This section is just for bridge relays ############## -# -## Bridge relays (or "bridges" ) are Tor relays that aren't listed in the +## Bridge relays (or "bridges") are Tor relays that aren't listed in the ## main directory. Since there is no complete public list of them, even if an ## ISP is filtering connections to all the known Tor relays, they probably -## won't be able to block all the bridges. Unlike running an exit relay, -## running a bridge relay just passes data to and from the Tor network -- -## so it shouldn't expose the operator to abuse complaints. - -#ORPort 443 +## won't be able to block all the bridges. Also, websites won't treat you +## differently because they won't know you're running Tor. If you can +## be a real relay, please do; but if not, be a bridge! #BridgeRelay 1 -#RelayBandwidthRate 50KBytes #ExitPolicy reject *:* diff -Nru tor-0.2.0.34/src/Makefile.am tor-0.2.2.16-alpha/src/Makefile.am --- tor-0.2.0.34/src/Makefile.am 2008-02-26 19:56:29.000000000 +0000 +++ tor-0.2.2.16-alpha/src/Makefile.am 2009-11-17 20:37:02.000000000 +0000 @@ -1,5 +1,5 @@ # leave in dependency order, since common must be built first -SUBDIRS = common or tools win32 config -DIST_SUBDIRS = common or tools win32 config +SUBDIRS = common or test tools win32 config +DIST_SUBDIRS = common or test tools win32 config diff -Nru tor-0.2.0.34/src/Makefile.in tor-0.2.2.16-alpha/src/Makefile.in --- tor-0.2.0.34/src/Makefile.in 2009-02-09 03:31:01.000000000 +0000 +++ tor-0.2.2.16-alpha/src/Makefile.in 2010-09-17 06:08:41.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -55,8 +55,10 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -91,6 +93,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -99,7 +102,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -110,8 +115,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -164,8 +172,8 @@ top_srcdir = @top_srcdir@ # leave in dependency order, since common must be built first -SUBDIRS = common or tools win32 config -DIST_SUBDIRS = common or tools win32 config +SUBDIRS = common or test tools win32 config +DIST_SUBDIRS = common or test tools win32 config all: all-recursive .SUFFIXES: @@ -274,8 +282,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS @@ -300,8 +308,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ @@ -311,13 +319,12 @@ CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique diff -Nru tor-0.2.0.34/src/or/buffers.c tor-0.2.2.16-alpha/src/or/buffers.c --- tor-0.2.0.34/src/or/buffers.c 2008-11-20 22:14:26.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/buffers.c 2010-08-18 23:04:46.000000000 +0000 @@ -1,23 +1,33 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: buffers.c 17263 2008-11-12 14:49:17Z nickm $ */ -const char buffers_c_id[] = - "$Id: buffers.c 17263 2008-11-12 14:49:17Z nickm $"; /** * \file buffers.c - * \brief Implements a generic buffer interface. Buffers are + * \brief Implements a generic interface buffer. Buffers are * fairly opaque string holders that can read to or flush from: * memory, file descriptors, or TLS connections. **/ #define BUFFERS_PRIVATE #include "or.h" +#include "buffers.h" +#include "config.h" +#include "connection_edge.h" +#include "connection_or.h" +#include "control.h" +#include "reasons.h" +#include "../common/util.h" +#include "../common/torlog.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_UIO_H +#include +#endif //#define PARANOIA -//#define NOINLINE #ifdef PARANOIA /** Helper: If PARANOIA is defined, assert that the buffer in local variable @@ -27,11 +37,6 @@ #define check() STMT_NIL #endif -#ifdef NOINLINE -#undef INLINE -#define INLINE -#endif - /* Implementation notes: * * After flirting with memmove, and dallying with ring-buffers, we're finally @@ -148,10 +153,13 @@ /** Deallocate a chunk or put it on a freelist */ static void -chunk_free(chunk_t *chunk) +chunk_free_unchecked(chunk_t *chunk) { - size_t alloc = CHUNK_ALLOC_SIZE(chunk->memlen); - chunk_freelist_t *freelist = get_freelist(alloc); + size_t alloc; + chunk_freelist_t *freelist; + + alloc = CHUNK_ALLOC_SIZE(chunk->memlen); + freelist = get_freelist(alloc); if (freelist && freelist->cur_length < freelist->max_length) { chunk->next = freelist->head; freelist->head = chunk; @@ -164,7 +172,7 @@ } /** Allocate a new chunk with a given allocation size, or get one from the - * freelist. Note that a chunk with allocation size A can actualy hold only + * freelist. Note that a chunk with allocation size A can actually hold only * CHUNK_SIZE_WITH_ALLOC(A) bytes in its mem field. */ static INLINE chunk_t * chunk_new_with_alloc_size(size_t alloc) @@ -180,7 +188,7 @@ freelist->lowest_length = freelist->cur_length; ++freelist->n_hit; } else { - /* XXXX021 take advantage of tor_malloc_roundup, once we know how that + /* XXXX take advantage of tor_malloc_roundup, once we know how that * affects freelists. */ if (freelist) ++freelist->n_alloc; @@ -196,7 +204,7 @@ } #else static void -chunk_free(chunk_t *chunk) +chunk_free_unchecked(chunk_t *chunk) { tor_free(chunk); } @@ -213,10 +221,6 @@ } #endif -/** Allocate a new chunk with memory size of sz. */ -#define chunk_new_with_capacity(sz) \ - (chunk_new_with_alloc_size(CHUNK_ALLOC_SIZE(sz))) - /** Expand chunk until it can hold sz bytes, and return a * new pointer to chunk. Old pointers are no longer valid. */ static INLINE chunk_t * @@ -265,14 +269,26 @@ int n_to_free = free_all ? freelists[i].cur_length : (freelists[i].lowest_length - slack); int n_to_skip = freelists[i].cur_length - n_to_free; + int orig_n_to_free = n_to_free, n_freed=0; + int orig_n_to_skip = n_to_skip; int new_length = n_to_skip; chunk_t **chp = &freelists[i].head; chunk_t *chunk; - log_info(LD_MM, "Cleaning freelist for %d-byte chunks: keeping %d, " - "dropping %d.", - (int)freelists[i].alloc_size, n_to_skip, n_to_free); + log_info(LD_MM, "Cleaning freelist for %d-byte chunks: length %d, " + "keeping %d, dropping %d.", + (int)freelists[i].alloc_size, freelists[i].cur_length, + n_to_skip, n_to_free); + tor_assert(n_to_skip + n_to_free == freelists[i].cur_length); while (n_to_skip) { - tor_assert((*chp)->next); + if (! (*chp)->next) { + log_warn(LD_BUG, "I wanted to skip %d chunks in the freelist for " + "%d-byte chunks, but only found %d. (Length %d)", + orig_n_to_skip, (int)freelists[i].alloc_size, + orig_n_to_skip-n_to_skip, freelists[i].cur_length); + assert_freelist_ok(&freelists[i]); + return; + } + // tor_assert((*chp)->next); chp = &(*chp)->next; --n_to_skip; } @@ -283,9 +299,19 @@ tor_free(chunk); chunk = next; --n_to_free; + ++n_freed; ++freelists[i].n_free; } - tor_assert(!n_to_free); + if (n_to_free) { + log_warn(LD_BUG, "Freelist length for %d-byte chunks may have been " + "messed up somehow.", (int)freelists[i].alloc_size); + log_warn(LD_BUG, "There were %d chunks at the start. I decided to " + "keep %d. I wanted to free %d. I freed %d. I somehow think " + "I have %d left to free.", + freelists[i].cur_length, n_to_skip, orig_n_to_free, + n_freed, n_to_free); + } + // tor_assert(!n_to_free); freelists[i].cur_length = new_length; } freelists[i].lowest_length = freelists[i].cur_length; @@ -397,7 +423,7 @@ dest->next = src->next; if (buf->tail == src) buf->tail = dest; - chunk_free(src); + chunk_free_unchecked(src); } else { memcpy(CHUNK_WRITE_PTR(dest), src->data, n); dest->datalen += n; @@ -443,7 +469,7 @@ buf->head = victim->next; if (buf->tail == victim) buf->tail = NULL; - chunk_free(victim); + chunk_free_unchecked(victim); } } check(); @@ -477,7 +503,7 @@ buf->datalen = 0; for (chunk = buf->head; chunk; chunk = next) { next = chunk->next; - chunk_free(chunk); + chunk_free_unchecked(chunk); } buf->head = buf->tail = NULL; } @@ -516,6 +542,8 @@ void buf_free(buf_t *buf) { + if (!buf) + return; buf_clear(buf); buf->magic = 0xdeadbeef; tor_free(buf); @@ -547,18 +575,39 @@ return chunk; } +/** If we're using readv and writev, how many chunks are we willing to + * read/write at a time? */ +#define N_IOV 3 + /** Read up to at_most bytes from the socket fd into * chunk (which must be on buf). If we get an EOF, set * *reached_eof to 1. Return -1 on error, 0 on eof or blocking, * and the number of bytes read otherwise. */ static INLINE int read_to_chunk(buf_t *buf, chunk_t *chunk, int fd, size_t at_most, - int *reached_eof) + int *reached_eof, int *socket_error) { ssize_t read_result; - - tor_assert(CHUNK_REMAINING_CAPACITY(chunk) >= at_most); +#if 0 && defined(HAVE_READV) && !defined(WIN32) + struct iovec iov[N_IOV]; + int i; + size_t remaining = at_most; + for (i=0; chunk && i < N_IOV && remaining; ++i) { + iov[i].iov_base = CHUNK_WRITE_PTR(chunk); + if (remaining > CHUNK_REMAINING_CAPACITY(chunk)) + iov[i].iov_len = CHUNK_REMAINING_CAPACITY(chunk); + else + iov[i].iov_len = remaining; + remaining -= iov[i].iov_len; + chunk = chunk->next; + } + read_result = readv(fd, iov, i); +#else + if (at_most > CHUNK_REMAINING_CAPACITY(chunk)) + at_most = CHUNK_REMAINING_CAPACITY(chunk); read_result = tor_socket_recv(fd, CHUNK_WRITE_PTR(chunk), at_most, 0); +#endif + if (read_result < 0) { int e = tor_socket_errno(fd); if (!ERRNO_IS_EAGAIN(e)) { /* it's a real error */ @@ -566,6 +615,7 @@ if (e == WSAENOBUFS) log_warn(LD_NET,"recv() failed: WSAENOBUFS. Not enough ram?"); #endif + *socket_error = e; return -1; } return 0; /* would block. */ @@ -575,6 +625,14 @@ return 0; } else { /* actually got bytes. */ buf->datalen += read_result; +#if 0 && defined(HAVE_READV) && !defined(WIN32) + while ((size_t)read_result > CHUNK_REMAINING_CAPACITY(chunk)) { + chunk->datalen += CHUNK_REMAINING_CAPACITY(chunk); + read_result -= CHUNK_REMAINING_CAPACITY(chunk); + chunk = chunk->next; + tor_assert(chunk); + } +#endif chunk->datalen += read_result; log_debug(LD_NET,"Read %ld bytes. %d on inbuf.", (long)read_result, (int)buf->datalen); @@ -607,7 +665,8 @@ */ /* XXXX021 indicate "read blocked" somehow? */ int -read_to_buf(int s, size_t at_most, buf_t *buf, int *reached_eof) +read_to_buf(int s, size_t at_most, buf_t *buf, int *reached_eof, + int *socket_error) { /* XXXX021 It's stupid to overload the return values for these functions: * "error status" and "number of bytes read" are not mutually exclusive. @@ -633,7 +692,7 @@ readlen = cap; } - r = read_to_chunk(buf, chunk, s, readlen, reached_eof); + r = read_to_chunk(buf, chunk, s, readlen, reached_eof, socket_error); check(); if (r < 0) return r; /* Error */ @@ -692,7 +751,7 @@ if (r < 0) return r; /* Error */ tor_assert(total_read+r < INT_MAX); - total_read += r; + total_read += r; if ((size_t)r < readlen) /* eof, block, or no more to read. */ break; } @@ -709,9 +768,26 @@ size_t *buf_flushlen) { ssize_t write_result; - - tor_assert(sz <= chunk->datalen); +#if 0 && defined(HAVE_WRITEV) && !defined(WIN32) + struct iovec iov[N_IOV]; + int i; + size_t remaining = sz; + for (i=0; chunk && i < N_IOV && remaining; ++i) { + iov[i].iov_base = chunk->data; + if (remaining > chunk->datalen) + iov[i].iov_len = chunk->datalen; + else + iov[i].iov_len = remaining; + remaining -= iov[i].iov_len; + chunk = chunk->next; + } + write_result = writev(s, iov, i); +#else + if (sz > chunk->datalen) + sz = chunk->datalen; write_result = tor_socket_send(s, chunk->data, sz, 0); +#endif + if (write_result < 0) { int e = tor_socket_errno(s); if (!ERRNO_IS_EAGAIN(e)) { /* it's a real error */ @@ -735,7 +811,7 @@ * chunk of buffer buf onto socket s. (Tries to write * more if there is a forced pending write size.) On success, deduct the * bytes written from *buf_flushlen. Return the number of bytes - * written on success, and a TOR_TLS error code on failue or blocking. + * written on success, and a TOR_TLS error code on failure or blocking. */ static INLINE int flush_chunk_tls(tor_tls_t *tls, buf_t *buf, chunk_t *chunk, @@ -957,7 +1033,7 @@ return 0; peek_from_buf(hdr, sizeof(hdr), buf); - command = *(uint8_t*)(hdr+2); + command = get_uint8(hdr+2); if (!(CELL_COMMAND_IS_VAR_LENGTH(command))) return 0; @@ -1034,14 +1110,6 @@ tor_assert(out); if (out->chunk) { if (out->chunk->datalen) { - /*XXXX020 remove this once the bug it detects is fixed. */ - if (!(out->pos < (off_t)out->chunk->datalen)) { - log_warn(LD_BUG, "About to assert. %p, %d, %d, %p, %d.", - out, (int)out->pos, - (int)out->chunk_pos, out->chunk, - out->chunk?(int)out->chunk->datalen : (int)-1 - ); - } tor_assert(out->pos < (off_t)out->chunk->datalen); } else { tor_assert(out->pos == 0); @@ -1064,7 +1132,7 @@ } /** Advance pos by a single character, if there are any more characters - * in the buffer. Returns 0 on sucess, -1 on failure. */ + * in the buffer. Returns 0 on success, -1 on failure. */ static INLINE int buf_pos_inc(buf_pos_t *pos) { @@ -1125,13 +1193,13 @@ } /** There is a (possibly incomplete) http statement on buf, of the - * form "\%s\\r\\n\\r\\n\%s", headers, body. (body may contain nuls.) + * form "\%s\\r\\n\\r\\n\%s", headers, body. (body may contain NULs.) * If a) the headers include a Content-Length field and all bytes in * the body are present, or b) there's no Content-Length field and * all headers are present, then: * - * - strdup headers into *headers_out, and nul-terminate it. - * - memdup body into *body_out, and nul-terminate it. + * - strdup headers into *headers_out, and NUL-terminate it. + * - memdup body into *body_out, and NUL-terminate it. * - Then remove them from buf, and return 1. * * - If headers or body is NULL, discard that part of the buf. @@ -1215,14 +1283,14 @@ if (headers_out) { *headers_out = tor_malloc(headerlen+1); fetch_from_buf(*headers_out, headerlen, buf); - (*headers_out)[headerlen] = 0; /* nul terminate it */ + (*headers_out)[headerlen] = 0; /* NUL terminate it */ } if (body_out) { tor_assert(body_used); *body_used = bodylen; *body_out = tor_malloc(bodylen+1); fetch_from_buf(*body_out, bodylen, buf); - (*body_out)[bodylen] = 0; /* nul terminate it */ + (*body_out)[bodylen] = 0; /* NUL terminate it */ } check(); return 1; @@ -1258,7 +1326,8 @@ int log_sockstype, int safe_socks) { unsigned int len; - char tmpbuf[INET_NTOA_BUF_LEN]; + char tmpbuf[TOR_ADDR_BUF_LEN+1]; + tor_addr_t destaddr; uint32_t destip; uint8_t socksver; enum {socks4, socks4a} socks4_prot = socks4a; @@ -1302,7 +1371,7 @@ req->replylen = 2; /* 2 bytes of response */ req->reply[0] = 5; /* socks5 reply */ - req->reply[1] = SOCKS5_SUCCEEDED; + req->reply[1] = 0; /* tell client to use "none" auth method */ req->socks_version = 5; /* remember we've already negotiated auth */ log_debug(LD_APP,"socks5: accepted method 0"); return 0; @@ -1323,13 +1392,20 @@ } switch (*(buf->head->data+3)) { /* address type */ case 1: /* IPv4 address */ + case 4: /* IPv6 address */ { + const int is_v6 = *(buf->head->data+3) == 4; + const unsigned addrlen = is_v6 ? 16 : 4; log_debug(LD_APP,"socks5: ipv4 address type"); - if (buf->datalen < 10) /* ip/port there? */ + if (buf->datalen < 6+addrlen) /* ip/port there? */ return 0; /* not yet */ - destip = ntohl(*(uint32_t*)(buf->head->data+4)); - in.s_addr = htonl(destip); - tor_inet_ntoa(&in,tmpbuf,sizeof(tmpbuf)); + if (is_v6) + tor_addr_from_ipv6_bytes(&destaddr, buf->head->data+4); + else + tor_addr_from_ipv4n(&destaddr, get_uint32(buf->head->data+4)); + + tor_addr_to_str(tmpbuf, &destaddr, sizeof(tmpbuf), 1); + if (strlen(tmpbuf)+1 > MAX_SOCKS_ADDR_LEN) { log_warn(LD_APP, "socks5 IP takes %d bytes, which doesn't fit in %d. " @@ -1338,27 +1414,31 @@ return -1; } strlcpy(req->address,tmpbuf,sizeof(req->address)); - req->port = ntohs(*(uint16_t*)(buf->head->data+8)); - buf_remove_from_front(buf, 10); + req->port = ntohs(get_uint16(buf->head->data+4+addrlen)); + buf_remove_from_front(buf, 6+addrlen); if (req->command != SOCKS_COMMAND_RESOLVE_PTR && - !addressmap_have_mapping(req->address) && + !addressmap_have_mapping(req->address,0) && !have_warned_about_unsafe_socks) { - log_warn(LD_APP, - "Your application (using socks5 to port %d) is giving " - "Tor only an IP address. Applications that do DNS resolves " - "themselves may leak information. Consider using Socks4A " - "(e.g. via privoxy or socat) instead. For more information, " - "please see http://wiki.noreply.org/noreply/TheOnionRouter/" - "TorFAQ#SOCKSAndDNS.%s", req->port, - safe_socks ? " Rejecting." : ""); -// have_warned_about_unsafe_socks = 1; // (for now, warn every time) + if (get_options()->WarnUnsafeSocks) { + log_warn(LD_APP, + "Your application (using socks5 to port %d) is giving " + "Tor only an IP address. Applications that do DNS resolves " + "themselves may leak information. Consider using Socks4A " + "(e.g. via privoxy or socat) instead. For more information, " + "please see https://wiki.torproject.org/TheOnionRouter/" + "TorFAQ#SOCKSAndDNS.%s", req->port, + safe_socks ? " Rejecting." : ""); + /*have_warned_about_unsafe_socks = 1;*/ + /*(for now, warn every time)*/ control_event_client_status(LOG_WARN, "DANGEROUS_SOCKS PROTOCOL=SOCKS5 ADDRESS=%s:%d", req->address, req->port); + } if (safe_socks) return -1; } return 1; + } case 3: /* fqdn */ log_debug(LD_APP,"socks5: fqdn address type"); if (req->command == SOCKS_COMMAND_RESOLVE_PTR) { @@ -1434,7 +1514,8 @@ return -1; } log_debug(LD_APP, - "socks4: successfully read destip (%s)", safe_str(tmpbuf)); + "socks4: successfully read destip (%s)", + safe_str_client(tmpbuf)); socks4_prot = socks4; } @@ -1452,20 +1533,23 @@ startaddr = NULL; if (socks4_prot != socks4a && - !addressmap_have_mapping(tmpbuf) && + !addressmap_have_mapping(tmpbuf,0) && !have_warned_about_unsafe_socks) { - log_warn(LD_APP, + if (get_options()->WarnUnsafeSocks) { + log_warn(LD_APP, "Your application (using socks4 to port %d) is giving Tor " "only an IP address. Applications that do DNS resolves " "themselves may leak information. Consider using Socks4A " "(e.g. via privoxy or socat) instead. For more information, " - "please see http://wiki.noreply.org/noreply/TheOnionRouter/" + "please see https://wiki.torproject.org/TheOnionRouter/" "TorFAQ#SOCKSAndDNS.%s", req->port, safe_socks ? " Rejecting." : ""); -// have_warned_about_unsafe_socks = 1; // (for now, warn every time) - control_event_client_status(LOG_WARN, + /*have_warned_about_unsafe_socks = 1;*/ + /*(for now, warn every time)*/ + control_event_client_status(LOG_WARN, "DANGEROUS_SOCKS PROTOCOL=SOCKS4 ADDRESS=%s:%d", tmpbuf, req->port); + } if (safe_socks) return -1; } @@ -1557,6 +1641,132 @@ } } +/** Inspect a reply from SOCKS server stored in buf according + * to state, removing the protocol data upon success. Return 0 on + * incomplete response, 1 on success and -1 on error, in which case + * reason is set to a descriptive message (free() when finished + * with it). + * + * As a special case, 2 is returned when user/pass is required + * during SOCKS5 handshake and user/pass is configured. + */ +int +fetch_from_buf_socks_client(buf_t *buf, int state, char **reason) +{ + unsigned char *data; + size_t addrlen; + + if (buf->datalen < 2) + return 0; + + buf_pullup(buf, 128, 0); + tor_assert(buf->head && buf->head->datalen >= 2); + + data = (unsigned char *) buf->head->data; + + switch (state) { + case PROXY_SOCKS4_WANT_CONNECT_OK: + /* Wait for the complete response */ + if (buf->head->datalen < 8) + return 0; + + if (data[1] != 0x5a) { + *reason = tor_strdup(socks4_response_code_to_string(data[1])); + return -1; + } + + /* Success */ + buf_remove_from_front(buf, 8); + return 1; + + case PROXY_SOCKS5_WANT_AUTH_METHOD_NONE: + /* we don't have any credentials */ + if (data[1] != 0x00) { + *reason = tor_strdup("server doesn't support any of our " + "available authentication methods"); + return -1; + } + + log_info(LD_NET, "SOCKS 5 client: continuing without authentication"); + buf_clear(buf); + return 1; + + case PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929: + /* we have a username and password. return 1 if we can proceed without + * providing authentication, or 2 otherwise. */ + switch (data[1]) { + case 0x00: + log_info(LD_NET, "SOCKS 5 client: we have auth details but server " + "doesn't require authentication."); + buf_clear(buf); + return 1; + case 0x02: + log_info(LD_NET, "SOCKS 5 client: need authentication."); + buf_clear(buf); + return 2; + /* fall through */ + } + + *reason = tor_strdup("server doesn't support any of our available " + "authentication methods"); + return -1; + + case PROXY_SOCKS5_WANT_AUTH_RFC1929_OK: + /* handle server reply to rfc1929 authentication */ + if (data[1] != 0x00) { + *reason = tor_strdup("authentication failed"); + return -1; + } + + log_info(LD_NET, "SOCKS 5 client: authentication successful."); + buf_clear(buf); + return 1; + + case PROXY_SOCKS5_WANT_CONNECT_OK: + /* response is variable length. BND.ADDR, etc, isn't needed + * (don't bother with buf_pullup()), but make sure to eat all + * the data used */ + + /* wait for address type field to arrive */ + if (buf->datalen < 4) + return 0; + + switch (data[3]) { + case 0x01: /* ip4 */ + addrlen = 4; + break; + case 0x04: /* ip6 */ + addrlen = 16; + break; + case 0x03: /* fqdn (can this happen here?) */ + if (buf->datalen < 5) + return 0; + addrlen = 1 + data[4]; + break; + default: + *reason = tor_strdup("invalid response to connect request"); + return -1; + } + + /* wait for address and port */ + if (buf->datalen < 6 + addrlen) + return 0; + + if (data[1] != 0x00) { + *reason = tor_strdup(socks5_response_code_to_string(data[1])); + return -1; + } + + buf_remove_from_front(buf, 6 + addrlen); + return 1; + } + + /* shouldn't get here... */ + tor_assert(0); + + return -1; +} + /** Return 1 iff buf looks more like it has an (obsolete) v0 controller * command on it than any valid v1 controller command. */ int diff -Nru tor-0.2.0.34/src/or/buffers.h tor-0.2.2.16-alpha/src/or/buffers.h --- tor-0.2.0.34/src/or/buffers.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/buffers.h 2010-08-18 23:04:46.000000000 +0000 @@ -0,0 +1,58 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file buffers.h + * \brief Header file for buffers.c. + **/ + +#ifndef _TOR_BUFFERS_H +#define _TOR_BUFFERS_H + +buf_t *buf_new(void); +buf_t *buf_new_with_capacity(size_t size); +void buf_free(buf_t *buf); +void buf_clear(buf_t *buf); +void buf_shrink(buf_t *buf); +void buf_shrink_freelists(int free_all); +void buf_dump_freelist_sizes(int severity); + +size_t buf_datalen(const buf_t *buf); +size_t buf_allocation(const buf_t *buf); +size_t buf_slack(const buf_t *buf); + +int read_to_buf(int s, size_t at_most, buf_t *buf, int *reached_eof, + int *socket_error); +int read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf); + +int flush_buf(int 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 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); +int fetch_from_buf_http(buf_t *buf, + char **headers_out, size_t max_headerlen, + char **body_out, size_t *body_used, size_t max_bodylen, + int force_complete); +int fetch_from_buf_socks(buf_t *buf, socks_request_t *req, + int log_sockstype, int safe_socks); +int fetch_from_buf_socks_client(buf_t *buf, int state, char **reason); +int fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len); + +int peek_buf_has_control0_command(buf_t *buf); + +void assert_buf_ok(buf_t *buf); + +#ifdef BUFFERS_PRIVATE +int buf_find_string_offset(const buf_t *buf, const char *s, size_t n); +#endif + +#endif + diff -Nru tor-0.2.0.34/src/or/circuitbuild.c tor-0.2.2.16-alpha/src/or/circuitbuild.c --- tor-0.2.0.34/src/or/circuitbuild.c 2008-12-17 22:36:01.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/circuitbuild.c 2010-09-17 01:30:36.000000000 +0000 @@ -1,67 +1,1309 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: circuitbuild.c 17639 2008-12-17 13:14:47Z nickm $ */ -const char circuitbuild_c_id[] = - "$Id: circuitbuild.c 17639 2008-12-17 13:14:47Z nickm $"; /** * \file circuitbuild.c * \brief The actual details of building circuits. **/ +#define CIRCUIT_PRIVATE + #include "or.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "connection_or.h" +#include "control.h" +#include "directory.h" +#include "main.h" +#include "networkstatus.h" +#include "onion.h" +#include "policies.h" +#include "relay.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" +#include "crypto.h" +#undef log +#include + +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + +#define CBT_BIN_TO_MS(bin) ((bin)*CBT_BIN_WIDTH + (CBT_BIN_WIDTH/2)) + +/********* START VARIABLES **********/ +/** Global list of circuit build times */ +// FIXME: Add this as a member for entry_guard_t instead of global? +// Then we could do per-guard statistics, as guards are likely to +// vary in their own latency. The downside of this is that guards +// can change frequently, so we'd be building a lot more circuits +// most likely. +circuit_build_times_t circ_times; + +/** A global list of all circuits at this hop. */ +extern circuit_t *global_circuitlist; + +/** An entry_guard_t represents our information about a chosen long-term + * first hop, known as a "helper" node in the literature. We can't just + * use a routerinfo_t, since we want to remember these even when we + * don't have a directory. */ +typedef struct { + char nickname[MAX_NICKNAME_LEN+1]; + char identity[DIGEST_LEN]; + time_t chosen_on_date; /**< Approximately when was this guard added? + * "0" if we don't know. */ + char *chosen_by_version; /**< What tor version added this guard? NULL + * if we don't know. */ + unsigned int made_contact : 1; /**< 0 if we have never connected to this + * router, 1 if we have. */ + unsigned int can_retry : 1; /**< Should we retry connecting to this entry, + * in spite of having it marked as unreachable?*/ + time_t bad_since; /**< 0 if this guard is currently usable, or the time at + * which it was observed to become (according to the + * directory or the user configuration) unusable. */ + time_t unreachable_since; /**< 0 if we can connect to this guard, or the + * time at which we first noticed we couldn't + * connect to it. */ + time_t last_attempted; /**< 0 if we can connect to this guard, or the time + * at which we last failed to connect to it. */ +} entry_guard_t; + +/** A list of our chosen entry guards. */ +static smartlist_t *entry_guards = NULL; +/** A value of 1 means that the entry_guards list has changed + * and those changes need to be flushed to disk. */ +static int entry_guards_dirty = 0; + +/** If set, we're running the unit tests: we should avoid clobbering + * our state file or accessing get_options() or get_or_state() */ +static int unit_tests = 0; + +/********* END VARIABLES ************/ + +static int circuit_deliver_create_cell(circuit_t *circ, + uint8_t cell_type, const char *payload); +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_routers(smartlist_t *routers); +static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice); + +static void entry_guards_changed(void); + +static int +circuit_build_times_disabled(void) +{ + if (unit_tests) { + return 0; + } else { + int consensus_disabled = networkstatus_get_param(NULL, "cbtdisabled", + 0); + int config_disabled = !get_options()->LearnCircuitBuildTimeout; + int dirauth_disabled = get_options()->AuthoritativeDir; + int state_disabled = (get_or_state()->LastWritten == -1); + + if (consensus_disabled || config_disabled || dirauth_disabled || + state_disabled) { + log_info(LD_CIRC, + "CircuitBuildTime learning is disabled. " + "Consensus=%d, Config=%d, AuthDir=%d, StateFile=%d", + consensus_disabled, config_disabled, dirauth_disabled, + state_disabled); + return 1; + } else { + return 0; + } + } +} + +static int32_t +circuit_build_times_max_timeouts(void) +{ + int32_t num = networkstatus_get_param(NULL, "cbtmaxtimeouts", + CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT); + return num; +} + +static int32_t +circuit_build_times_default_num_xm_modes(void) +{ + int32_t num = networkstatus_get_param(NULL, "cbtnummodes", + CBT_DEFAULT_NUM_XM_MODES); + return num; +} + +static int32_t +circuit_build_times_min_circs_to_observe(void) +{ + int32_t num = networkstatus_get_param(NULL, "cbtmincircs", + CBT_DEFAULT_MIN_CIRCUITS_TO_OBSERVE); + return num; +} + +double +circuit_build_times_quantile_cutoff(void) +{ + int32_t num = networkstatus_get_param(NULL, "cbtquantile", + CBT_DEFAULT_QUANTILE_CUTOFF); + return num/100.0; +} + +static double +circuit_build_times_close_quantile(void) +{ + int32_t num = networkstatus_get_param(NULL, "cbtclosequantile", + CBT_DEFAULT_CLOSE_QUANTILE); + + return num/100.0; +} + +static int32_t +circuit_build_times_test_frequency(void) +{ + int32_t num = networkstatus_get_param(NULL, "cbttestfreq", + CBT_DEFAULT_TEST_FREQUENCY); + return num; +} + +static int32_t +circuit_build_times_min_timeout(void) +{ + int32_t num = networkstatus_get_param(NULL, "cbtmintimeout", + CBT_DEFAULT_TIMEOUT_MIN_VALUE); + return num; +} + +int32_t +circuit_build_times_initial_timeout(void) +{ + int32_t num = networkstatus_get_param(NULL, "cbtinitialtimeout", + CBT_DEFAULT_TIMEOUT_INITIAL_VALUE); + return num; +} + +static int32_t +circuit_build_times_recent_circuit_count(void) +{ + int32_t num = networkstatus_get_param(NULL, "cbtrecentcount", + CBT_DEFAULT_RECENT_CIRCUITS); + return num; +} + +/** + * This function is called when we get a consensus update. + * + * It checks to see if we have changed any consensus parameters + * that require reallocation or discard of previous stats. + */ +void +circuit_build_times_new_consensus_params(circuit_build_times_t *cbt, + networkstatus_t *ns) +{ + int32_t num = networkstatus_get_param(ns, "cbtrecentcount", + CBT_DEFAULT_RECENT_CIRCUITS); + + if (num > 0 && num != cbt->liveness.num_recent_circs) { + int8_t *recent_circs; + log_notice(LD_CIRC, "Changing recent timeout size from %d to %d", + cbt->liveness.num_recent_circs, num); + + tor_assert(cbt->liveness.timeouts_after_firsthop); + + /* + * Technically this is a circular array that we are reallocating + * and memcopying. However, since it only consists of either 1s + * or 0s, and is only used in a statistical test to determine when + * we should discard our history after a sufficient number of 1's + * have been reached, it is fine if order is not preserved or + * elements are lost. + * + * cbtrecentcount should only be changing in cases of severe network + * distress anyway, so memory correctness here is paramount over + * doing acrobatics to preserve the array. + */ + recent_circs = tor_malloc_zero(sizeof(int8_t)*num); + memcpy(recent_circs, cbt->liveness.timeouts_after_firsthop, + sizeof(int8_t)*MIN(num, cbt->liveness.num_recent_circs)); + + // Adjust the index if it needs it. + if (num < cbt->liveness.num_recent_circs) { + cbt->liveness.after_firsthop_idx = MIN(num-1, + cbt->liveness.after_firsthop_idx); + } + + tor_free(cbt->liveness.timeouts_after_firsthop); + cbt->liveness.timeouts_after_firsthop = recent_circs; + cbt->liveness.num_recent_circs = num; + } +} + +/** Make a note that we're running unit tests (rather than running Tor + * itself), so we avoid clobbering our state file. */ +void +circuitbuild_running_unit_tests(void) +{ + unit_tests = 1; +} + +/** + * Return the initial default or configured timeout in milliseconds + */ +static double +circuit_build_times_get_initial_timeout(void) +{ + double timeout; + if (!unit_tests && get_options()->CircuitBuildTimeout) { + timeout = get_options()->CircuitBuildTimeout*1000; + if (timeout < circuit_build_times_min_timeout()) { + log_warn(LD_CIRC, "Config CircuitBuildTimeout too low. Setting to %ds", + circuit_build_times_min_timeout()/1000); + timeout = circuit_build_times_min_timeout(); + } + } else { + timeout = circuit_build_times_initial_timeout(); + } + return timeout; +} + +/** + * Reset the build time state. + * + * Leave estimated parameters, timeout and network liveness intact + * for future use. + */ +void +circuit_build_times_reset(circuit_build_times_t *cbt) +{ + memset(cbt->circuit_build_times, 0, sizeof(cbt->circuit_build_times)); + cbt->total_build_times = 0; + cbt->build_times_idx = 0; + cbt->have_computed_timeout = 0; +} + +/** + * Initialize the buildtimes structure for first use. + * + * Sets the initial timeout value based to either the + * config setting or BUILD_TIMEOUT_INITIAL_VALUE. + */ +void +circuit_build_times_init(circuit_build_times_t *cbt) +{ + memset(cbt, 0, sizeof(*cbt)); + cbt->liveness.num_recent_circs = circuit_build_times_recent_circuit_count(); + cbt->liveness.timeouts_after_firsthop = tor_malloc_zero(sizeof(int8_t)* + cbt->liveness.num_recent_circs); + cbt->close_ms = cbt->timeout_ms = circuit_build_times_get_initial_timeout(); + control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET); +} + +/** + * Rewind our build time history by n positions. + */ +static void +circuit_build_times_rewind_history(circuit_build_times_t *cbt, int n) +{ + int i = 0; + + cbt->build_times_idx -= n; + cbt->build_times_idx %= CBT_NCIRCUITS_TO_OBSERVE; + + for (i = 0; i < n; i++) { + cbt->circuit_build_times[(i+cbt->build_times_idx) + %CBT_NCIRCUITS_TO_OBSERVE]=0; + } + + if (cbt->total_build_times > n) { + cbt->total_build_times -= n; + } else { + cbt->total_build_times = 0; + } + + log_info(LD_CIRC, + "Rewound history by %d places. Current index: %d. " + "Total: %d", n, cbt->build_times_idx, cbt->total_build_times); +} + +/** + * Add a new build time value time to the set of build times. Time + * units are milliseconds. + * + * circuit_build_times cbt is a circular array, so loop around when + * array is full. + */ +int +circuit_build_times_add_time(circuit_build_times_t *cbt, build_time_t time) +{ + if (time <= 0 || time > CBT_BUILD_TIME_MAX) { + log_warn(LD_BUG, "Circuit build time is too large (%u)." + "This is probably a bug.", time); + tor_fragile_assert(); + return -1; + } + + log_debug(LD_CIRC, "Adding circuit build time %u", time); + + cbt->circuit_build_times[cbt->build_times_idx] = time; + cbt->build_times_idx = (cbt->build_times_idx + 1) % CBT_NCIRCUITS_TO_OBSERVE; + if (cbt->total_build_times < CBT_NCIRCUITS_TO_OBSERVE) + cbt->total_build_times++; + + if ((cbt->total_build_times % CBT_SAVE_STATE_EVERY) == 0) { + /* Save state every n circuit builds */ + if (!unit_tests && !get_options()->AvoidDiskWrites) + or_state_mark_dirty(get_or_state(), 0); + } + + return 0; +} + +/** + * Return maximum circuit build time + */ +static build_time_t +circuit_build_times_max(circuit_build_times_t *cbt) +{ + int i = 0; + build_time_t max_build_time = 0; + for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { + if (cbt->circuit_build_times[i] > max_build_time + && cbt->circuit_build_times[i] != CBT_BUILD_ABANDONED) + max_build_time = cbt->circuit_build_times[i]; + } + return max_build_time; +} + +#if 0 +/** Return minimum circuit build time */ +build_time_t +circuit_build_times_min(circuit_build_times_t *cbt) +{ + int i = 0; + build_time_t min_build_time = CBT_BUILD_TIME_MAX; + for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { + if (cbt->circuit_build_times[i] && /* 0 <-> uninitialized */ + cbt->circuit_build_times[i] < min_build_time) + min_build_time = cbt->circuit_build_times[i]; + } + if (min_build_time == CBT_BUILD_TIME_MAX) { + log_warn(LD_CIRC, "No build times less than CBT_BUILD_TIME_MAX!"); + } + return min_build_time; +} +#endif + +/** + * Calculate and return a histogram for the set of build times. + * + * Returns an allocated array of histrogram bins representing + * the frequency of index*CBT_BIN_WIDTH millisecond + * build times. Also outputs the number of bins in nbins. + * + * The return value must be freed by the caller. + */ +static uint32_t * +circuit_build_times_create_histogram(circuit_build_times_t *cbt, + build_time_t *nbins) +{ + uint32_t *histogram; + build_time_t max_build_time = circuit_build_times_max(cbt); + int i, c; + + *nbins = 1 + (max_build_time / CBT_BIN_WIDTH); + histogram = tor_malloc_zero(*nbins * sizeof(build_time_t)); + + // calculate histogram + for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { + if (cbt->circuit_build_times[i] == 0 + || cbt->circuit_build_times[i] == CBT_BUILD_ABANDONED) + continue; /* 0 <-> uninitialized */ + + c = (cbt->circuit_build_times[i] / CBT_BIN_WIDTH); + histogram[c]++; + } + + return histogram; +} + +/** + * Return the Pareto start-of-curve parameter Xm. + * + * Because we are not a true Pareto curve, we compute this as the + * weighted average of the N=3 most frequent build time bins. + */ +static build_time_t +circuit_build_times_get_xm(circuit_build_times_t *cbt) +{ + build_time_t i, nbins; + build_time_t *nth_max_bin; + int32_t bin_counts=0; + build_time_t ret = 0; + uint32_t *histogram = circuit_build_times_create_histogram(cbt, &nbins); + int n=0; + int num_modes = circuit_build_times_default_num_xm_modes(); + + // Only use one mode if < 1000 buildtimes. Not enough data + // for multiple. + if (cbt->total_build_times < CBT_NCIRCUITS_TO_OBSERVE) + num_modes = 1; + + nth_max_bin = (build_time_t*)tor_malloc_zero(num_modes*sizeof(build_time_t)); + + for (i = 0; i < nbins; i++) { + if (histogram[i] >= histogram[nth_max_bin[0]]) { + nth_max_bin[0] = i; + } + + for (n = 1; n < num_modes; n++) { + if (histogram[i] >= histogram[nth_max_bin[n]] && + (!histogram[nth_max_bin[n-1]] + || histogram[i] < histogram[nth_max_bin[n-1]])) { + nth_max_bin[n] = i; + } + } + } + + for (n = 0; n < num_modes; n++) { + bin_counts += histogram[nth_max_bin[n]]; + ret += CBT_BIN_TO_MS(nth_max_bin[n])*histogram[nth_max_bin[n]]; + log_info(LD_CIRC, "Xm mode #%d: %u %u", n, CBT_BIN_TO_MS(nth_max_bin[n]), + histogram[nth_max_bin[n]]); + } + + ret /= bin_counts; + tor_free(histogram); + tor_free(nth_max_bin); + + return ret; +} + +/** + * Output a histogram of current circuit build times to + * the or_state_t state structure. + */ +void +circuit_build_times_update_state(circuit_build_times_t *cbt, + or_state_t *state) +{ + uint32_t *histogram; + build_time_t i = 0; + build_time_t nbins = 0; + config_line_t **next, *line; + + histogram = circuit_build_times_create_histogram(cbt, &nbins); + // write to state + config_free_lines(state->BuildtimeHistogram); + next = &state->BuildtimeHistogram; + *next = NULL; + + state->TotalBuildTimes = cbt->total_build_times; + state->CircuitBuildAbandonedCount = 0; + + for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { + if (cbt->circuit_build_times[i] == CBT_BUILD_ABANDONED) + state->CircuitBuildAbandonedCount++; + } + + for (i = 0; i < nbins; i++) { + // compress the histogram by skipping the blanks + if (histogram[i] == 0) continue; + *next = line = tor_malloc_zero(sizeof(config_line_t)); + line->key = tor_strdup("CircuitBuildTimeBin"); + line->value = tor_malloc(25); + tor_snprintf(line->value, 25, "%d %d", + CBT_BIN_TO_MS(i), histogram[i]); + next = &(line->next); + } + + if (!unit_tests) { + if (!get_options()->AvoidDiskWrites) + or_state_mark_dirty(get_or_state(), 0); + } + + tor_free(histogram); +} + +/** + * Shuffle the build times array. + * + * Stolen from http://en.wikipedia.org/wiki/Fisher\u2013Yates_shuffle + */ +static void +circuit_build_times_shuffle_and_store_array(circuit_build_times_t *cbt, + build_time_t *raw_times, + int num_times) +{ + int n = num_times; + if (num_times > CBT_NCIRCUITS_TO_OBSERVE) { + log_notice(LD_CIRC, "Decreasing circuit_build_times size from %d to %d", + num_times, CBT_NCIRCUITS_TO_OBSERVE); + } + + /* This code can only be run on a compact array */ + while (n-- > 1) { + int k = crypto_rand_int(n + 1); /* 0 <= k <= n. */ + build_time_t tmp = raw_times[k]; + raw_times[k] = raw_times[n]; + raw_times[n] = tmp; + } + + /* Since the times are now shuffled, take a random CBT_NCIRCUITS_TO_OBSERVE + * subset (ie the first CBT_NCIRCUITS_TO_OBSERVE values) */ + for (n = 0; n < MIN(num_times, CBT_NCIRCUITS_TO_OBSERVE); n++) { + circuit_build_times_add_time(cbt, raw_times[n]); + } +} + +/** + * Filter old synthetic timeouts that were created before the + * new right-censored Pareto calculation was deployed. + * + * Once all clients before 0.2.1.13-alpha are gone, this code + * will be unused. + */ +static int +circuit_build_times_filter_timeouts(circuit_build_times_t *cbt) +{ + int num_filtered=0, i=0; + double timeout_rate = 0; + build_time_t max_timeout = 0; + + timeout_rate = circuit_build_times_timeout_rate(cbt); + max_timeout = (build_time_t)cbt->close_ms; + + for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { + if (cbt->circuit_build_times[i] > max_timeout) { + build_time_t replaced = cbt->circuit_build_times[i]; + num_filtered++; + cbt->circuit_build_times[i] = CBT_BUILD_ABANDONED; + + log_debug(LD_CIRC, "Replaced timeout %d with %d", replaced, + cbt->circuit_build_times[i]); + } + } + + log_info(LD_CIRC, + "We had %d timeouts out of %d build times, " + "and filtered %d above the max of %u", + (int)(cbt->total_build_times*timeout_rate), + cbt->total_build_times, num_filtered, max_timeout); + + return num_filtered; +} + +/** + * Load histogram from state, shuffling the resulting array + * after we do so. Use this result to estimate parameters and + * calculate the timeout. + * + * Return -1 on error. + */ +int +circuit_build_times_parse_state(circuit_build_times_t *cbt, + or_state_t *state) +{ + int tot_values = 0; + uint32_t loaded_cnt = 0, N = 0; + config_line_t *line; + unsigned int i; + build_time_t *loaded_times; + int err = 0; + circuit_build_times_init(cbt); + + if (circuit_build_times_disabled()) { + return 0; + } + + /* build_time_t 0 means uninitialized */ + loaded_times = tor_malloc_zero(sizeof(build_time_t)*state->TotalBuildTimes); + + for (line = state->BuildtimeHistogram; line; line = line->next) { + smartlist_t *args = smartlist_create(); + smartlist_split_string(args, line->value, " ", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + if (smartlist_len(args) < 2) { + log_warn(LD_GENERAL, "Unable to parse circuit build times: " + "Too few arguments to CircuitBuildTime"); + err = 1; + SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); + smartlist_free(args); + break; + } else { + const char *ms_str = smartlist_get(args,0); + const char *count_str = smartlist_get(args,1); + uint32_t count, k; + build_time_t ms; + int ok; + ms = (build_time_t)tor_parse_ulong(ms_str, 0, 0, + CBT_BUILD_TIME_MAX, &ok, NULL); + if (!ok) { + log_warn(LD_GENERAL, "Unable to parse circuit build times: " + "Unparsable bin number"); + err = 1; + SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); + smartlist_free(args); + break; + } + count = (uint32_t)tor_parse_ulong(count_str, 0, 0, + UINT32_MAX, &ok, NULL); + if (!ok) { + log_warn(LD_GENERAL, "Unable to parse circuit build times: " + "Unparsable bin count"); + err = 1; + SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); + smartlist_free(args); + break; + } + + if (loaded_cnt+count+state->CircuitBuildAbandonedCount + > state->TotalBuildTimes) { + log_warn(LD_CIRC, + "Too many build times in state file. " + "Stopping short before %d", + loaded_cnt+count); + SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); + smartlist_free(args); + break; + } + + for (k = 0; k < count; k++) { + loaded_times[loaded_cnt++] = ms; + } + N++; + SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); + smartlist_free(args); + } + } + + log_info(LD_CIRC, + "Adding %d timeouts.", state->CircuitBuildAbandonedCount); + for (i=0; i < state->CircuitBuildAbandonedCount; i++) { + loaded_times[loaded_cnt++] = CBT_BUILD_ABANDONED; + } + + if (loaded_cnt != state->TotalBuildTimes) { + log_warn(LD_CIRC, + "Corrupt state file? Build times count mismatch. " + "Read %d times, but file says %d", loaded_cnt, + state->TotalBuildTimes); + err = 1; + circuit_build_times_reset(cbt); + goto done; + } + + circuit_build_times_shuffle_and_store_array(cbt, loaded_times, loaded_cnt); + + /* Verify that we didn't overwrite any indexes */ + for (i=0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { + if (!cbt->circuit_build_times[i]) + break; + tot_values++; + } + log_info(LD_CIRC, + "Loaded %d/%d values from %d lines in circuit time histogram", + tot_values, cbt->total_build_times, N); + + if (cbt->total_build_times != tot_values + || cbt->total_build_times > CBT_NCIRCUITS_TO_OBSERVE) { + log_warn(LD_CIRC, + "Corrupt state file? Shuffled build times mismatch. " + "Read %d times, but file says %d", tot_values, + state->TotalBuildTimes); + err = 1; + circuit_build_times_reset(cbt); + goto done; + } + + circuit_build_times_set_timeout(cbt); + + if (!state->CircuitBuildAbandonedCount && cbt->total_build_times) { + circuit_build_times_filter_timeouts(cbt); + } + + done: + tor_free(loaded_times); + return err ? -1 : 0; +} + +/** + * Estimates the Xm and Alpha parameters using + * http://en.wikipedia.org/wiki/Pareto_distribution#Parameter_estimation + * + * The notable difference is that we use mode instead of min to estimate Xm. + * This is because our distribution is frechet-like. We claim this is + * an acceptable approximation because we are only concerned with the + * accuracy of the CDF of the tail. + */ +int +circuit_build_times_update_alpha(circuit_build_times_t *cbt) +{ + build_time_t *x=cbt->circuit_build_times; + double a = 0; + int n=0,i=0,abandoned_count=0; + build_time_t max_time=0; + + /* http://en.wikipedia.org/wiki/Pareto_distribution#Parameter_estimation */ + /* We sort of cheat here and make our samples slightly more pareto-like + * and less frechet-like. */ + cbt->Xm = circuit_build_times_get_xm(cbt); + + tor_assert(cbt->Xm > 0); + + for (i=0; i< CBT_NCIRCUITS_TO_OBSERVE; i++) { + if (!x[i]) { + continue; + } + + if (x[i] < cbt->Xm) { + a += tor_mathlog(cbt->Xm); + } else if (x[i] == CBT_BUILD_ABANDONED) { + abandoned_count++; + } else { + a += tor_mathlog(x[i]); + if (x[i] > max_time) + max_time = x[i]; + } + n++; + } + + /* + * We are erring and asserting here because this can only happen + * in codepaths other than startup. The startup state parsing code + * performs this same check, and resets state if it hits it. If we + * hit it at runtime, something serious has gone wrong. + */ + if (n!=cbt->total_build_times) { + log_err(LD_CIRC, "Discrepancy in build times count: %d vs %d", n, + cbt->total_build_times); + } + tor_assert(n==cbt->total_build_times); + + if (max_time <= 0) { + /* This can happen if Xm is actually the *maximum* value in the set. + * It can also happen if we've abandoned every single circuit somehow. + * In either case, tell the caller not to compute a new build timeout. */ + log_warn(LD_BUG, + "Could not determine largest build time (%d). " + "Xm is %dms and we've abandoned %d out of %d circuits.", max_time, + cbt->Xm, abandoned_count, n); + return 0; + } + + a += abandoned_count*tor_mathlog(max_time); + + a -= n*tor_mathlog(cbt->Xm); + // Estimator comes from Eq #4 in: + // "Bayesian estimation based on trimmed samples from Pareto populations" + // by Arturo J. Fernández. We are right-censored only. + a = (n-abandoned_count)/a; + + cbt->alpha = a; + + return 1; +} + +/** + * This is the Pareto Quantile Function. It calculates the point x + * in the distribution such that F(x) = quantile (ie quantile*100% + * of the mass of the density function is below x on the curve). + * + * We use it to calculate the timeout and also to generate synthetic + * values of time for circuits that timeout before completion. + * + * See http://en.wikipedia.org/wiki/Quantile_function, + * http://en.wikipedia.org/wiki/Inverse_transform_sampling and + * http://en.wikipedia.org/wiki/Pareto_distribution#Generating_a_ + * random_sample_from_Pareto_distribution + * That's right. I'll cite wikipedia all day long. + * + * Return value is in milliseconds. + */ +double +circuit_build_times_calculate_timeout(circuit_build_times_t *cbt, + double quantile) +{ + double ret; + tor_assert(quantile >= 0); + tor_assert(1.0-quantile > 0); + tor_assert(cbt->Xm > 0); + + ret = cbt->Xm/pow(1.0-quantile,1.0/cbt->alpha); + if (ret > INT32_MAX) { + ret = INT32_MAX; + } + tor_assert(ret > 0); + return ret; +} + +/** Pareto CDF */ +double +circuit_build_times_cdf(circuit_build_times_t *cbt, double x) +{ + double ret; + tor_assert(cbt->Xm > 0); + ret = 1.0-pow(cbt->Xm/x,cbt->alpha); + tor_assert(0 <= ret && ret <= 1.0); + return ret; +} + +/** + * Generate a synthetic time using our distribution parameters. + * + * The return value will be within the [q_lo, q_hi) quantile points + * on the CDF. + */ +build_time_t +circuit_build_times_generate_sample(circuit_build_times_t *cbt, + double q_lo, double q_hi) +{ + double randval = crypto_rand_double(); + build_time_t ret; + double u; + + /* Generate between [q_lo, q_hi) */ + /*XXXX This is what nextafter is supposed to be for; we should use it on the + * platforms that support it. */ + q_hi -= 1.0/(INT32_MAX); + + tor_assert(q_lo >= 0); + tor_assert(q_hi < 1); + tor_assert(q_lo < q_hi); + + u = q_lo + (q_hi-q_lo)*randval; + + tor_assert(0 <= u && u < 1.0); + /* circuit_build_times_calculate_timeout returns <= INT32_MAX */ + ret = (build_time_t) + tor_lround(circuit_build_times_calculate_timeout(cbt, u)); + tor_assert(ret > 0); + return ret; +} + +/** + * Estimate an initial alpha parameter by solving the quantile + * function with a quantile point and a specific timeout value. + */ +void +circuit_build_times_initial_alpha(circuit_build_times_t *cbt, + double quantile, double timeout_ms) +{ + // Q(u) = Xm/((1-u)^(1/a)) + // Q(0.8) = Xm/((1-0.8))^(1/a)) = CircBuildTimeout + // CircBuildTimeout = Xm/((1-0.8))^(1/a)) + // CircBuildTimeout = Xm*((1-0.8))^(-1/a)) + // ln(CircBuildTimeout) = ln(Xm)+ln(((1-0.8)))*(-1/a) + // -ln(1-0.8)/(ln(CircBuildTimeout)-ln(Xm))=a + tor_assert(quantile >= 0); + tor_assert(cbt->Xm > 0); + cbt->alpha = tor_mathlog(1.0-quantile)/ + (tor_mathlog(cbt->Xm)-tor_mathlog(timeout_ms)); + tor_assert(cbt->alpha > 0); +} + +/** + * Returns true if we need circuits to be built + */ +int +circuit_build_times_needs_circuits(circuit_build_times_t *cbt) +{ + /* Return true if < MIN_CIRCUITS_TO_OBSERVE */ + if (cbt->total_build_times < circuit_build_times_min_circs_to_observe()) + return 1; + return 0; +} + +/** + * Returns true if we should build a timeout test circuit + * right now. + */ +int +circuit_build_times_needs_circuits_now(circuit_build_times_t *cbt) +{ + return circuit_build_times_needs_circuits(cbt) && + approx_time()-cbt->last_circ_at > circuit_build_times_test_frequency(); +} + +/** + * Called to indicate that the network showed some signs of liveness. + * + * This function is called every time we receive a cell. Avoid + * syscalls, events, and other high-intensity work. + */ +void +circuit_build_times_network_is_live(circuit_build_times_t *cbt) +{ + cbt->liveness.network_last_live = approx_time(); + cbt->liveness.nonlive_discarded = 0; + cbt->liveness.nonlive_timeouts = 0; +} + +/** + * Called to indicate that we completed a circuit. Because this circuit + * succeeded, it doesn't count as a timeout-after-the-first-hop. + */ +void +circuit_build_times_network_circ_success(circuit_build_times_t *cbt) +{ + cbt->liveness.timeouts_after_firsthop[cbt->liveness.after_firsthop_idx] = 0; + cbt->liveness.after_firsthop_idx++; + cbt->liveness.after_firsthop_idx %= cbt->liveness.num_recent_circs; +} + +/** + * A circuit just timed out. If it failed after the first hop, record it + * in our history for later deciding if the network speed has changed. + */ +static void +circuit_build_times_network_timeout(circuit_build_times_t *cbt, + int did_onehop) +{ + if (did_onehop) { + cbt->liveness.timeouts_after_firsthop[cbt->liveness.after_firsthop_idx]=1; + cbt->liveness.after_firsthop_idx++; + cbt->liveness.after_firsthop_idx %= cbt->liveness.num_recent_circs; + } +} + +/** + * A circuit was just forcibly closed. If there has been no recent network + * activity at all, but this circuit was launched back when we thought the + * network was live, increment the number of "nonlive" circuit timeouts. + */ +static void +circuit_build_times_network_close(circuit_build_times_t *cbt, + int did_onehop, time_t start_time) +{ + time_t now = time(NULL); + /* + * Check if this is a timeout that was for a circuit that spent its + * entire existence during a time where we have had no network activity. + * + * Also double check that it is a valid timeout after we have possibly + * just recently reset cbt->close_ms. + * + * We use close_ms here because timeouts aren't actually counted as timeouts + * until close_ms elapses. + */ + if (cbt->liveness.network_last_live <= start_time && + start_time <= (now - cbt->close_ms/1000.0)) { + if (did_onehop) { + char last_live_buf[ISO_TIME_LEN+1]; + char start_time_buf[ISO_TIME_LEN+1]; + char now_buf[ISO_TIME_LEN+1]; + format_local_iso_time(last_live_buf, cbt->liveness.network_last_live); + format_local_iso_time(start_time_buf, start_time); + format_local_iso_time(now_buf, now); + log_warn(LD_BUG, + "Circuit somehow completed a hop while the network was " + "not live. Network was last live at %s, but circuit launched " + "at %s. It's now %s.", last_live_buf, start_time_buf, + now_buf); + } + cbt->liveness.nonlive_timeouts++; + } +} + +/** + * Returns false if the network has not received a cell or tls handshake + * in the past NETWORK_NOTLIVE_TIMEOUT_COUNT circuits. + * + * Also has the side effect of rewinding the circuit time history + * in the case of recent liveness changes. + */ +int +circuit_build_times_network_check_live(circuit_build_times_t *cbt) +{ + time_t now = approx_time(); + if (cbt->liveness.nonlive_timeouts >= CBT_NETWORK_NONLIVE_DISCARD_COUNT) { + if (!cbt->liveness.nonlive_discarded) { + cbt->liveness.nonlive_discarded = 1; + log_notice(LD_CIRC, "Network is no longer live (too many recent " + "circuit timeouts). Dead for %ld seconds.", + (long int)(now - cbt->liveness.network_last_live)); + /* Only discard NETWORK_NONLIVE_TIMEOUT_COUNT-1 because we stopped + * counting after that */ + circuit_build_times_rewind_history(cbt, + CBT_NETWORK_NONLIVE_TIMEOUT_COUNT-1); + control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_DISCARD); + } + return 0; + } else if (cbt->liveness.nonlive_timeouts >= + CBT_NETWORK_NONLIVE_TIMEOUT_COUNT) { + if (cbt->timeout_ms < circuit_build_times_get_initial_timeout()) { + log_notice(LD_CIRC, + "Network is flaky. No activity for %ld seconds. " + "Temporarily raising timeout to %lds.", + (long int)(now - cbt->liveness.network_last_live), + tor_lround(circuit_build_times_get_initial_timeout()/1000)); + cbt->liveness.suspended_timeout = cbt->timeout_ms; + cbt->liveness.suspended_close_timeout = cbt->close_ms; + cbt->close_ms = cbt->timeout_ms + = circuit_build_times_get_initial_timeout(); + control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_SUSPENDED); + } + + return 0; + } else if (cbt->liveness.suspended_timeout > 0) { + log_notice(LD_CIRC, + "Network activity has resumed. " + "Resuming circuit timeout calculations."); + cbt->timeout_ms = cbt->liveness.suspended_timeout; + cbt->close_ms = cbt->liveness.suspended_close_timeout; + cbt->liveness.suspended_timeout = 0; + cbt->liveness.suspended_close_timeout = 0; + control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESUME); + } + + return 1; +} + +/** + * Returns true if we have seen more than MAX_RECENT_TIMEOUT_COUNT of + * the past RECENT_CIRCUITS time out after the first hop. Used to detect + * if the network connection has changed significantly. + * + * Also resets the entire timeout history in this case and causes us + * to restart the process of building test circuits and estimating a + * new timeout. + */ +int +circuit_build_times_network_check_changed(circuit_build_times_t *cbt) +{ + int total_build_times = cbt->total_build_times; + int timeout_count=0; + int i; + + /* how many of our recent circuits made it to the first hop but then + * timed out? */ + for (i = 0; i < cbt->liveness.num_recent_circs; i++) { + timeout_count += cbt->liveness.timeouts_after_firsthop[i]; + } + + /* If 80% of our recent circuits are timing out after the first hop, + * we need to re-estimate a new initial alpha and timeout. */ + if (timeout_count < circuit_build_times_max_timeouts()) { + return 0; + } + + circuit_build_times_reset(cbt); + memset(cbt->liveness.timeouts_after_firsthop, 0, + sizeof(*cbt->liveness.timeouts_after_firsthop)* + cbt->liveness.num_recent_circs); + cbt->liveness.after_firsthop_idx = 0; + + /* Check to see if this has happened before. If so, double the timeout + * to give people on abysmally bad network connections a shot at access */ + if (cbt->timeout_ms >= circuit_build_times_get_initial_timeout()) { + if (cbt->timeout_ms > INT32_MAX/2 || cbt->close_ms > INT32_MAX/2) { + log_warn(LD_CIRC, "Insanely large circuit build timeout value. " + "(timeout = %lfmsec, close = %lfmsec)", + cbt->timeout_ms, cbt->close_ms); + } else { + cbt->timeout_ms *= 2; + cbt->close_ms *= 2; + } + } else { + cbt->close_ms = cbt->timeout_ms + = circuit_build_times_get_initial_timeout(); + } + + control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET); + + log_notice(LD_CIRC, + "Network connection speed appears to have changed. Resetting " + "timeout to %lds after %d timeouts and %d buildtimes.", + tor_lround(cbt->timeout_ms/1000), timeout_count, + total_build_times); + + return 1; +} + +/** + * Count the number of timeouts in a set of cbt data. + */ +double +circuit_build_times_timeout_rate(const circuit_build_times_t *cbt) +{ + int i=0,timeouts=0; + for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { + if (cbt->circuit_build_times[i] >= cbt->timeout_ms) { + timeouts++; + } + } + + if (!cbt->total_build_times) + return 0; + + return ((double)timeouts)/cbt->total_build_times; +} + +/** + * Count the number of closed circuits in a set of cbt data. + */ +double +circuit_build_times_close_rate(const circuit_build_times_t *cbt) +{ + int i=0,closed=0; + for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { + if (cbt->circuit_build_times[i] == CBT_BUILD_ABANDONED) { + closed++; + } + } + + if (!cbt->total_build_times) + return 0; + + return ((double)closed)/cbt->total_build_times; +} + +/** + * Store a timeout as a synthetic value. + * + * Returns true if the store was successful and we should possibly + * update our timeout estimate. + */ +int +circuit_build_times_count_close(circuit_build_times_t *cbt, + int did_onehop, + time_t start_time) +{ + if (circuit_build_times_disabled()) { + cbt->close_ms = cbt->timeout_ms + = circuit_build_times_get_initial_timeout(); + return 0; + } + + /* Record this force-close to help determine if the network is dead */ + circuit_build_times_network_close(cbt, did_onehop, start_time); + + /* Only count timeouts if network is live.. */ + if (!circuit_build_times_network_check_live(cbt)) { + return 0; + } + + circuit_build_times_add_time(cbt, CBT_BUILD_ABANDONED); + return 1; +} + +/** + * Update timeout counts to determine if we need to expire + * our build time history due to excessive timeouts. + */ +void +circuit_build_times_count_timeout(circuit_build_times_t *cbt, + int did_onehop) +{ + if (circuit_build_times_disabled()) { + cbt->close_ms = cbt->timeout_ms + = circuit_build_times_get_initial_timeout(); + return; + } + + circuit_build_times_network_timeout(cbt, did_onehop); + + /* If there are a ton of timeouts, we should reset + * the circuit build timeout. + */ + circuit_build_times_network_check_changed(cbt); +} + +/** + * Estimate a new timeout based on history and set our timeout + * variable accordingly. + */ +static int +circuit_build_times_set_timeout_worker(circuit_build_times_t *cbt) +{ + if (cbt->total_build_times < circuit_build_times_min_circs_to_observe()) { + return 0; + } -/********* START VARIABLES **********/ + if (!circuit_build_times_update_alpha(cbt)) + return 0; -/** A global list of all circuits at this hop. */ -extern circuit_t *global_circuitlist; + cbt->timeout_ms = circuit_build_times_calculate_timeout(cbt, + circuit_build_times_quantile_cutoff()); -/** An entry_guard_t represents our information about a chosen long-term - * first hop, known as a "helper" node in the literature. We can't just - * use a routerinfo_t, since we want to remember these even when we - * don't have a directory. */ -typedef struct { - char nickname[MAX_NICKNAME_LEN+1]; - char identity[DIGEST_LEN]; - time_t chosen_on_date; /**< Approximately when was this guard added? - * "0" if we don't know. */ - char *chosen_by_version; /**< What tor version added this guard? NULL - * if we don't know. */ - unsigned int made_contact : 1; /**< 0 if we have never connected to this - * router, 1 if we have. */ - unsigned int can_retry : 1; /**< Should we retry connecting to this entry, - * in spite of having it marked as unreachable?*/ - time_t bad_since; /**< 0 if this guard is currently usable, or the time at - * which it was observed to become (according to the - * directory or the user configuration) unusable. */ - time_t unreachable_since; /**< 0 if we can connect to this guard, or the - * time at which we first noticed we couldn't - * connect to it. */ - time_t last_attempted; /**< 0 if we can connect to this guard, or the time - * at which we last failed to connect to it. */ -} entry_guard_t; + cbt->close_ms = circuit_build_times_calculate_timeout(cbt, + circuit_build_times_close_quantile()); -/** A list of our chosen entry guards. */ -static smartlist_t *entry_guards = NULL; -/** A value of 1 means that the entry_guards list has changed - * and those changes need to be flushed to disk. */ -static int entry_guards_dirty = 0; + /* Sometimes really fast guard nodes give us such a steep curve + * that this ends up being not that much greater than timeout_ms. + * Make it be at least 1 min to handle this case. */ + cbt->close_ms = MAX(cbt->close_ms, circuit_build_times_initial_timeout()); -/********* END VARIABLES ************/ + cbt->have_computed_timeout = 1; + return 1; +} -static int circuit_deliver_create_cell(circuit_t *circ, - uint8_t cell_type, const char *payload); -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_routers(smartlist_t *routers); -static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice); +/** + * Exposed function to compute a new timeout. Dispatches events and + * also filters out extremely high timeout values. + */ +void +circuit_build_times_set_timeout(circuit_build_times_t *cbt) +{ + long prev_timeout = tor_lround(cbt->timeout_ms/1000); + double timeout_rate; -static void entry_guards_changed(void); -static time_t start_of_month(time_t when); + if (!circuit_build_times_set_timeout_worker(cbt)) + return; + + if (cbt->timeout_ms < circuit_build_times_min_timeout()) { + log_warn(LD_CIRC, "Set buildtimeout to low value %lfms. Setting to %dms", + cbt->timeout_ms, circuit_build_times_min_timeout()); + cbt->timeout_ms = circuit_build_times_min_timeout(); + if (cbt->close_ms < cbt->timeout_ms) { + /* This shouldn't happen because of MAX() in timeout_worker above, + * but doing it just in case */ + cbt->close_ms = circuit_build_times_initial_timeout(); + } + } + + control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_COMPUTED); + + timeout_rate = circuit_build_times_timeout_rate(cbt); + + if (prev_timeout > tor_lround(cbt->timeout_ms/1000)) { + log_notice(LD_CIRC, + "Based on %d circuit times, it looks like we don't need to " + "wait so long for circuits to finish. We will now assume a " + "circuit is too slow to use after waiting %ld seconds.", + cbt->total_build_times, + tor_lround(cbt->timeout_ms/1000)); + log_info(LD_CIRC, + "Circuit timeout data: %lfms, %lfms, Xm: %d, a: %lf, r: %lf", + cbt->timeout_ms, cbt->close_ms, cbt->Xm, cbt->alpha, + timeout_rate); + } else if (prev_timeout < tor_lround(cbt->timeout_ms/1000)) { + log_notice(LD_CIRC, + "Based on %d circuit times, it looks like we need to wait " + "longer for circuits to finish. We will now assume a " + "circuit is too slow to use after waiting %ld seconds.", + cbt->total_build_times, + tor_lround(cbt->timeout_ms/1000)); + log_info(LD_CIRC, + "Circuit timeout data: %lfms, %lfms, Xm: %d, a: %lf, r: %lf", + cbt->timeout_ms, cbt->close_ms, cbt->Xm, cbt->alpha, + timeout_rate); + } else { + log_info(LD_CIRC, + "Set circuit build timeout to %lds (%lfms, %lfms, Xm: %d, a: %lf," + " r: %lf) based on %d circuit times", + tor_lround(cbt->timeout_ms/1000), + cbt->timeout_ms, cbt->close_ms, cbt->Xm, cbt->alpha, timeout_rate, + cbt->total_build_times); + } +} /** Iterate over values of circ_id, starting from conn-\>next_circ_id, * and with the high bit specified by conn-\>circ_id_type, until we get @@ -69,12 +1311,12 @@ * * Return it, or 0 if can't get a unique circ_id. */ -static uint16_t +static circid_t get_unique_circ_id_by_conn(or_connection_t *conn) { - uint16_t test_circ_id; - uint16_t attempts=0; - uint16_t high_bit; + circid_t test_circ_id; + circid_t attempts=0; + circid_t high_bit; tor_assert(conn); if (conn->circ_id_type == CIRC_ID_TYPE_NEITHER) { @@ -116,59 +1358,60 @@ crypt_path_t *hop; smartlist_t *elements; const char *states[] = {"closed", "waiting for keys", "open"}; - char buf[128]; char *s; elements = smartlist_create(); if (verbose) { const char *nickname = build_state_get_exit_nickname(circ->build_state); - tor_snprintf(buf, sizeof(buf), "%s%s circ (length %d%s%s):", + char *cp; + tor_asprintf(&cp, "%s%s circ (length %d%s%s):", circ->build_state->is_internal ? "internal" : "exit", circ->build_state->need_uptime ? " (high-uptime)" : "", circ->build_state->desired_path_len, circ->_base.state == CIRCUIT_STATE_OPEN ? "" : ", exit ", circ->_base.state == CIRCUIT_STATE_OPEN ? "" : (nickname?nickname:"*unnamed*")); - smartlist_add(elements, tor_strdup(buf)); + smartlist_add(elements, cp); } hop = circ->cpath; do { routerinfo_t *ri; + routerstatus_t *rs; char *elt; + const char *id; if (!hop) break; if (!verbose && hop->state != CPATH_STATE_OPEN) break; if (!hop->extend_info) break; + id = hop->extend_info->identity_digest; if (verbose_names) { elt = tor_malloc(MAX_VERBOSE_NICKNAME_LEN+1); - if ((ri = router_get_by_digest(hop->extend_info->identity_digest))) { + if ((ri = router_get_by_digest(id))) { router_get_verbose_nickname(elt, ri); - } else if (hop->extend_info->nickname && - is_legal_nickname(hop->extend_info->nickname)) { + } else if ((rs = router_get_consensus_status_by_id(id))) { + routerstatus_get_verbose_nickname(elt, rs); + } else if (is_legal_nickname(hop->extend_info->nickname)) { elt[0] = '$'; - base16_encode(elt+1, HEX_DIGEST_LEN+1, - hop->extend_info->identity_digest, DIGEST_LEN); + base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); elt[HEX_DIGEST_LEN+1]= '~'; strlcpy(elt+HEX_DIGEST_LEN+2, hop->extend_info->nickname, MAX_NICKNAME_LEN+1); } else { elt[0] = '$'; - base16_encode(elt+1, HEX_DIGEST_LEN+1, - hop->extend_info->identity_digest, DIGEST_LEN); + base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); } } else { /* ! verbose_names */ - if ((ri = router_get_by_digest(hop->extend_info->identity_digest)) && + if ((ri = router_get_by_digest(id)) && ri->is_named) { elt = tor_strdup(hop->extend_info->nickname); } else { elt = tor_malloc(HEX_DIGEST_LEN+2); elt[0] = '$'; - base16_encode(elt+1, HEX_DIGEST_LEN+1, - hop->extend_info->identity_digest, DIGEST_LEN); + base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); } } tor_assert(elt); @@ -219,7 +1462,7 @@ circuit_log_path(int severity, unsigned int domain, origin_circuit_t *circ) { char *s = circuit_list_path(circ,1); - log(severity,domain,"%s",s); + tor_log(severity,domain,"%s",s); tor_free(s); } @@ -271,7 +1514,7 @@ onion_populate_cpath(origin_circuit_t *circ) { int r; -again: + again: r = onion_extend_cpath(circ); if (r < 0) { log_info(LD_CIRC,"Generating cpath hop failed."); @@ -343,37 +1586,36 @@ { crypt_path_t *firsthop; or_connection_t *n_conn; - char tmpbuf[INET_NTOA_BUF_LEN]; - struct in_addr in; int err_reason = 0; + const char *msg = NULL; + int should_launch = 0; firsthop = onion_next_hop_in_cpath(circ->cpath); tor_assert(firsthop); tor_assert(firsthop->extend_info); /* now see if we're already connected to the first OR in 'route' */ - in.s_addr = htonl(firsthop->extend_info->addr); - tor_inet_ntoa(&in, tmpbuf, sizeof(tmpbuf)); - log_debug(LD_CIRC,"Looking for firsthop '%s:%u'",tmpbuf, + log_debug(LD_CIRC,"Looking for firsthop '%s:%u'", + fmt_addr(&firsthop->extend_info->addr), firsthop->extend_info->port); - /* imprint the circuit with its future n_conn->id */ - memcpy(circ->_base.n_conn_id_digest, firsthop->extend_info->identity_digest, - DIGEST_LEN); - n_conn = connection_or_get_by_identity_digest( - firsthop->extend_info->identity_digest); - /* If we don't have an open conn, or the conn we have is obsolete - * (i.e. old or broken) and the other side will let us make a second - * connection without dropping it immediately... */ - if (!n_conn || n_conn->_base.state != OR_CONN_STATE_OPEN || - (n_conn->_base.or_is_obsolete && - router_digest_version_as_new_as(firsthop->extend_info->identity_digest, - "0.1.1.9-alpha-cvs"))) { - /* not currently connected */ - circ->_base.n_addr = firsthop->extend_info->addr; - circ->_base.n_port = firsthop->extend_info->port; - if (!n_conn || n_conn->_base.or_is_obsolete) { /* launch the connection */ - n_conn = connection_or_connect(firsthop->extend_info->addr, + n_conn = connection_or_get_for_extend(firsthop->extend_info->identity_digest, + &firsthop->extend_info->addr, + &msg, + &should_launch); + + if (!n_conn) { + /* not currently connected in a useful way. */ + const char *name = strlen(firsthop->extend_info->nickname) ? + firsthop->extend_info->nickname : fmt_addr(&firsthop->extend_info->addr); + log_info(LD_CIRC, "Next router is %s: %s ", + safe_str_client(name), msg?msg:"???"); + circ->_base.n_hop = extend_info_dup(firsthop->extend_info); + + if (should_launch) { + if (circ->build_state->onehop_tunnel) + control_event_bootstrap(BOOTSTRAP_STATUS_CONN_DIR, 0); + n_conn = connection_or_connect(&firsthop->extend_info->addr, firsthop->extend_info->port, firsthop->extend_info->identity_digest); if (!n_conn) { /* connect failed, forget the whole thing */ @@ -389,8 +1631,7 @@ */ return 0; } else { /* it's already open. use it. */ - circ->_base.n_addr = n_conn->_base.addr; - circ->_base.n_port = n_conn->_base.port; + tor_assert(!circ->_base.n_hop); circ->_base.n_conn = n_conn; log_debug(LD_CIRC,"Conn open. Delivering first onion skin."); if ((err_reason = circuit_send_next_onion_skin(circ)) < 0) { @@ -419,25 +1660,24 @@ pending_circs = smartlist_create(); circuit_get_all_pending_on_or_conn(pending_circs, or_conn); - SMARTLIST_FOREACH(pending_circs, circuit_t *, circ, + SMARTLIST_FOREACH_BEGIN(pending_circs, circuit_t *, circ) { /* These checks are redundant wrt get_all_pending_on_or_conn, but I'm * leaving them in in case it's possible for the status of a circuit to * change as we're going down the list. */ - if (circ->marked_for_close || circ->n_conn || + if (circ->marked_for_close || circ->n_conn || !circ->n_hop || circ->state != CIRCUIT_STATE_OR_WAIT) continue; - if (tor_digest_is_zero(circ->n_conn_id_digest)) { + + if (tor_digest_is_zero(circ->n_hop->identity_digest)) { /* Look at addr/port. This is an unkeyed connection. */ - if (circ->n_addr != or_conn->_base.addr || - circ->n_port != or_conn->_base.port) + if (!tor_addr_eq(&circ->n_hop->addr, &or_conn->_base.addr) || + circ->n_hop->port != or_conn->_base.port) continue; - /* now teach circ the right identity_digest */ - memcpy(circ->n_conn_id_digest, or_conn->identity_digest, DIGEST_LEN); } else { /* We expected a key. See if it's the right one. */ if (memcmp(or_conn->identity_digest, - circ->n_conn_id_digest, DIGEST_LEN)) + circ->n_hop->identity_digest, DIGEST_LEN)) continue; } if (!status) { /* or_conn failed; close circ */ @@ -450,6 +1690,9 @@ * orconn_circuid_circuit_map, so we don't need to call * set_circid_orconn here. */ circ->n_conn = or_conn; + extend_info_free(circ->n_hop); + circ->n_hop = NULL; + if (CIRCUIT_IS_ORIGIN(circ)) { if ((err_reason = circuit_send_next_onion_skin(TO_ORIGIN_CIRCUIT(circ))) < 0) { @@ -471,7 +1714,8 @@ tor_free(circ->n_conn_onionskin); circuit_set_state(circ, CIRCUIT_STATE_OPEN); } - }); + } + SMARTLIST_FOREACH_END(circ); smartlist_free(pending_circs); } @@ -488,7 +1732,7 @@ const char *payload) { cell_t cell; - uint16_t id; + circid_t id; tor_assert(circ); tor_assert(circ->n_conn); @@ -508,7 +1752,8 @@ cell.circ_id = circ->n_circ_id; memcpy(cell.payload, payload, ONIONSKIN_CHALLENGE_LEN); - append_cell_to_circuit_queue(circ, circ->n_conn, &cell, CELL_DIRECTION_OUT); + append_cell_to_circuit_queue(circ, circ->n_conn, &cell, + CELL_DIRECTION_OUT, 0); if (CIRCUIT_IS_ORIGIN(circ)) { /* mark it so it gets better rate limiting treatment. */ @@ -528,16 +1773,24 @@ routerinfo_t *me = router_get_my_routerinfo(); if (!me) return 0; - if (me->dir_port) + control_event_server_status(LOG_NOTICE, + "CHECKING_REACHABILITY ORADDRESS=%s:%d", + me->address, me->or_port); + if (me->dir_port) { tor_snprintf(dirbuf, sizeof(dirbuf), " and DirPort %s:%d", me->address, me->dir_port); - log(LOG_NOTICE, LD_OR, "Now checking whether ORPort %s:%d%s %s reachable... " + control_event_server_status(LOG_NOTICE, + "CHECKING_REACHABILITY DIRADDRESS=%s:%d", + me->address, me->dir_port); + } + log_notice(LD_OR, "Now checking whether ORPort %s:%d%s %s reachable... " "(this may take up to %d minutes -- look for log " "messages indicating success)", me->address, me->or_port, me->dir_port ? dirbuf : "", me->dir_port ? "are" : "is", TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT/60); + return 1; } @@ -588,6 +1841,10 @@ int fast; uint8_t cell_type; log_debug(LD_CIRC,"First skin; sending create cell."); + if (circ->build_state->onehop_tunnel) + control_event_bootstrap(BOOTSTRAP_STATUS_ONEHOP_CREATE, 0); + else + control_event_bootstrap(BOOTSTRAP_STATUS_CIRCUIT_CREATE, 0); router = router_get_by_digest(circ->_base.n_conn->identity_digest); fast = should_use_create_fast_for_circuit(circ); @@ -602,6 +1859,7 @@ log_warn(LD_CIRC,"onion_skin_create (first hop) failed."); return - END_CIRC_REASON_INTERNAL; } + note_request("cell: create", 1); } else { /* We are not an OR, and we're building the first hop of a circuit to a * new OR: we can be speedy and use CREATE_FAST to save an RSA operation @@ -612,6 +1870,7 @@ sizeof(circ->cpath->fast_handshake_state)); memcpy(payload, circ->cpath->fast_handshake_state, sizeof(circ->cpath->fast_handshake_state)); + note_request("cell: create fast", 1); } if (circuit_deliver_create_cell(TO_CIRCUIT(circ), cell_type, payload) < 0) @@ -630,15 +1889,43 @@ if (!hop) { /* done building the circuit. whew. */ circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OPEN); + if (!circ->build_state->onehop_tunnel) { + struct timeval end; + long timediff; + tor_gettimeofday(&end); + timediff = tv_mdiff(&circ->_base.highres_created, &end); + /* + * If the circuit build time is much greater than we would have cut + * it off at, we probably had a suspend event along this codepath, + * and we should discard the value. + */ + if (timediff < 0 || timediff > 2*circ_times.close_ms+1000) { + log_notice(LD_CIRC, "Strange value for circuit build time: %ldmsec. " + "Assuming clock jump.", timediff); + } else if (!circuit_build_times_disabled()) { + /* Don't count circuit times if the network was not live */ + if (circuit_build_times_network_check_live(&circ_times)) { + circuit_build_times_add_time(&circ_times, (build_time_t)timediff); + circuit_build_times_set_timeout(&circ_times); + } + + if (circ->_base.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { + circuit_build_times_network_circ_success(&circ_times); + } + } + } log_info(LD_CIRC,"circuit built!"); circuit_reset_failure_count(0); + if (circ->build_state->onehop_tunnel) + control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_STATUS, 0); if (!has_completed_circuit && !circ->build_state->onehop_tunnel) { or_options_t *options = get_options(); has_completed_circuit=1; /* FFFF Log a count of known routers here */ - log(LOG_NOTICE, LD_GENERAL, + log_notice(LD_GENERAL, "Tor has successfully opened a circuit. " "Looks like client functionality is working."); + control_event_bootstrap(BOOTSTRAP_STATUS_DONE, 0); control_event_client_status(LOG_NOTICE, "CIRCUIT_ESTABLISHED"); if (server_mode(options) && !check_whether_orport_reachable()) { inform_testing_reachability(); @@ -647,10 +1934,19 @@ } circuit_rep_hist_note_result(circ); circuit_has_opened(circ); /* do other actions as necessary */ + + /* We're done with measurement circuits here. Just close them */ + if (circ->_base.purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED); return 0; } - set_uint32(payload, htonl(hop->extend_info->addr)); + if (tor_addr_family(&hop->extend_info->addr) != AF_INET) { + log_warn(LD_BUG, "Trying to extend to a non-IPv4 address."); + return - END_CIRC_REASON_INTERNAL; + } + + set_uint32(payload, tor_addr_to_ipv4n(&hop->extend_info->addr)); set_uint16(payload+4, htons(hop->extend_info->port)); onionskin = payload+2+4; @@ -665,6 +1961,7 @@ } log_info(LD_CIRC,"Sending extend relay cell."); + note_request("cell: extend", 1); /* send it to hop->prev, because it will transfer * it to a create cell and then send to hop */ if (relay_send_command_from_edge(0, TO_CIRCUIT(circ), @@ -684,7 +1981,7 @@ circuit_note_clock_jumped(int seconds_elapsed) { int severity = server_mode(get_options()) ? LOG_WARN : LOG_NOTICE; - log(severity, LD_GENERAL, "Your system clock just jumped %d seconds %s; " + tor_log(severity, LD_GENERAL, "Your system clock just jumped %d seconds %s; " "assuming established circuits no longer work.", seconds_elapsed >=0 ? seconds_elapsed : -seconds_elapsed, seconds_elapsed >=0 ? "forward" : "backward"); @@ -712,12 +2009,22 @@ relay_header_t rh; char *onionskin; char *id_digest=NULL; + uint32_t n_addr32; + uint16_t n_port; + tor_addr_t n_addr; + const char *msg = NULL; + int should_launch = 0; if (circ->n_conn) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "n_conn already set. Bug/attack. Closing."); return -1; } + if (circ->n_hop) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "conn to next hop already launched. Bug/attack. Closing."); + return -1; + } if (!server_mode(get_options())) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, @@ -734,13 +2041,19 @@ return -1; } - circ->n_addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE)); - circ->n_port = ntohs(get_uint16(cell->payload+RELAY_HEADER_SIZE+4)); - + n_addr32 = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE)); + n_port = ntohs(get_uint16(cell->payload+RELAY_HEADER_SIZE+4)); onionskin = cell->payload+RELAY_HEADER_SIZE+4+2; id_digest = cell->payload+RELAY_HEADER_SIZE+4+2+ONIONSKIN_CHALLENGE_LEN; + tor_addr_from_ipv4h(&n_addr, n_addr32); + + if (!n_port || !n_addr32) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Client asked me to extend to zero destination port or addr."); + return -1; + } - /* First, check if they asked us for 0000..0000. We support using + /* Check if they asked us for 0000..0000. We support using * an empty fingerprint for the first hop (e.g. for a bridge relay), * but we don't want to let people send us extend cells for empty * fingerprints -- a) because it opens the user up to a mitm attack, @@ -762,34 +2075,27 @@ return -1; } - n_conn = connection_or_get_by_identity_digest(id_digest); - - /* If we don't have an open conn, or the conn we have is obsolete - * (i.e. old or broken) and the other side will let us make a second - * connection without dropping it immediately... */ - if (!n_conn || n_conn->_base.state != OR_CONN_STATE_OPEN || - (n_conn->_base.or_is_obsolete && - router_digest_version_as_new_as(id_digest,"0.1.1.9-alpha-cvs"))) { - struct in_addr in; - char tmpbuf[INET_NTOA_BUF_LEN]; - in.s_addr = htonl(circ->n_addr); - tor_inet_ntoa(&in,tmpbuf,sizeof(tmpbuf)); - log_debug(LD_CIRC|LD_OR,"Next router (%s:%d) not connected. Connecting.", - tmpbuf, circ->n_port); + n_conn = connection_or_get_for_extend(id_digest, + &n_addr, + &msg, + &should_launch); + + if (!n_conn) { + log_debug(LD_CIRC|LD_OR,"Next router (%s:%d): %s", + fmt_addr(&n_addr), (int)n_port, msg?msg:"????"); + + circ->n_hop = extend_info_alloc(NULL /*nickname*/, + id_digest, + NULL /*onion_key*/, + &n_addr, n_port); circ->n_conn_onionskin = tor_malloc(ONIONSKIN_CHALLENGE_LEN); memcpy(circ->n_conn_onionskin, onionskin, ONIONSKIN_CHALLENGE_LEN); circuit_set_state(circ, CIRCUIT_STATE_OR_WAIT); - /* imprint the circuit with its future n_conn->id */ - memcpy(circ->n_conn_id_digest, id_digest, DIGEST_LEN); - - if (n_conn && !n_conn->_base.or_is_obsolete) { - circ->n_addr = n_conn->_base.addr; - circ->n_port = n_conn->_base.port; - } else { - /* we should try to open a connection */ - n_conn = connection_or_connect(circ->n_addr, circ->n_port, id_digest); + if (should_launch) { + /* we should try to open a connection */ + n_conn = connection_or_connect(&n_addr, n_port, id_digest); if (!n_conn) { log_info(LD_CIRC,"Launching n_conn failed. Closing circuit."); circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED); @@ -804,12 +2110,8 @@ return 0; } - /* these may be different if the router connected to us from elsewhere */ - circ->n_addr = n_conn->_base.addr; - circ->n_port = n_conn->_base.port; - + tor_assert(!circ->n_hop); /* Connection is already established. */ circ->n_conn = n_conn; - memcpy(circ->n_conn_id_digest, n_conn->identity_digest, DIGEST_LEN); log_debug(LD_CIRC,"n_conn is %s:%u", n_conn->_base.address,n_conn->_base.port); @@ -916,10 +2218,9 @@ return -END_CIRC_REASON_TORPROTOCOL; } - if (hop->dh_handshake_state) { - crypto_dh_free(hop->dh_handshake_state); /* don't need it anymore */ - hop->dh_handshake_state = NULL; - } + crypto_dh_free(hop->dh_handshake_state); /* don't need it anymore */ + hop->dh_handshake_state = NULL; + memset(hop->fast_handshake_state, 0, sizeof(hop->fast_handshake_state)); if (circuit_init_cpath_crypto(hop, keys, 0)<0) { @@ -1029,10 +2330,10 @@ circ->is_first_hop = (cell_type == CELL_CREATED_FAST); append_cell_to_circuit_queue(TO_CIRCUIT(circ), - circ->p_conn, &cell, CELL_DIRECTION_IN); + circ->p_conn, &cell, CELL_DIRECTION_IN, 0); log_debug(LD_CIRC,"Finished sending 'created' cell."); - if (!is_local_IP(circ->p_conn->_base.addr) && + if (!is_local_addr(&circ->p_conn->_base.addr) && !connection_or_nonopen_was_started_here(circ->p_conn)) { /* record that we could process create cells from a non-local conn * that we didn't initiate; presumably this means that create cells @@ -1058,7 +2359,7 @@ tor_assert(routers); - routelen = 3; + routelen = DEFAULT_ROUTE_LEN; if (exit && purpose != CIRCUIT_PURPOSE_TESTING && purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) @@ -1066,7 +2367,7 @@ num_acceptable_routers = count_acceptable_routers(routers); - log_debug(LD_CIRC,"Chosen route length %d (%d/%d routers available).", + log_debug(LD_CIRC,"Chosen route length %d (%d/%d routers suitable).", routelen, num_acceptable_routers, smartlist_len(routers)); if (num_acceptable_routers < 2) { @@ -1123,6 +2424,8 @@ smartlist_t *LongLivedServices = get_options()->LongLivedPorts; tor_assert(need_uptime); tor_assert(need_capacity); + // Always predict need_capacity + *need_capacity = 1; enough = (smartlist_len(sl) == 0); for (i = 0; i < smartlist_len(sl); ++i) { port = smartlist_get(sl, i); @@ -1190,7 +2493,6 @@ smartlist_t *connections; int best_support = -1; int n_best_support=0; - smartlist_t *sl, *preferredexits, *excludedexits; routerinfo_t *router; or_options_t *options = get_options(); @@ -1210,6 +2512,8 @@ * of the pending connections could possibly exit from that * router (n_supported[i]). (We can't be sure about cases where we * don't know the IP address of the pending connection.) + * + * -1 means "Don't use this router at all." */ n_supported = tor_malloc(sizeof(int)*smartlist_len(dir->routers)); for (i = 0; i < smartlist_len(dir->routers); ++i) {/* iterate over routers */ @@ -1226,9 +2530,16 @@ n_supported[i] = -1; continue; /* skip routers that are known to be down or bad exits */ } - if (router_is_unreliable(router, need_uptime, need_capacity, 0)) { + if (router_is_unreliable(router, need_uptime, need_capacity, 0) && + (!options->ExitNodes || + !routerset_contains_router(options->ExitNodes, router))) { + /* FFFF Someday, differentiate between a routerset that names + * routers, and a routerset that names countries, and only do this + * check if they've asked for specific exit relays. Or if the country + * they ask for is rare. Or something. */ n_supported[i] = -1; - continue; /* skip routers that are not suitable */ + continue; /* skip routers that are not suitable, unless we have + * ExitNodes set, in which case we asked for it */ } if (!(router->is_valid || options->_AllowInvalid & ALLOW_INVALID_EXIT)) { /* if it's invalid and we don't want it */ @@ -1237,6 +2548,10 @@ // router->nickname, i); continue; /* skip invalid routers */ } + if (options->ExcludeSingleHopRelays && router->allow_single_hop_exits) { + n_supported[i] = -1; + continue; + } if (router_exit_policy_rejects_all(router)) { n_supported[i] = -1; // log_fn(LOG_DEBUG,"Skipping node %s (index %d) -- it rejects all.", @@ -1249,7 +2564,7 @@ { if (!ap_stream_wants_exit_attention(conn)) continue; /* Skip everything but APs in CIRCUIT_WAIT */ - if (connection_ap_can_use_exit(TO_EDGE_CONN(conn), router)) { + if (connection_ap_can_use_exit(TO_EDGE_CONN(conn), router, 1)) { ++n_supported[i]; // log_fn(LOG_DEBUG,"%s is supported. n_supported[%d] now %d.", // router->nickname, i, n_supported[i]); @@ -1280,32 +2595,32 @@ n_best_support, best_support >= 0 ? best_support : 0, n_pending_connections); - preferredexits = smartlist_create(); - add_nickname_list_to_smartlist(preferredexits,options->ExitNodes,1); - - excludedexits = smartlist_create(); - add_nickname_list_to_smartlist(excludedexits,options->ExcludeNodes,0); - - sl = smartlist_create(); - /* If any routers definitely support any pending connections, choose one * at random. */ if (best_support > 0) { + smartlist_t *supporting = smartlist_create(), *use = smartlist_create(); + for (i = 0; i < smartlist_len(dir->routers); i++) if (n_supported[i] == best_support) - smartlist_add(sl, smartlist_get(dir->routers, i)); + smartlist_add(supporting, smartlist_get(dir->routers, i)); - smartlist_subtract(sl,excludedexits); - if (options->StrictExitNodes || smartlist_overlap(sl,preferredexits)) - smartlist_intersect(sl,preferredexits); - router = routerlist_sl_choose_by_bandwidth(sl, WEIGHT_FOR_EXIT); + routersets_get_disjunction(use, supporting, options->ExitNodes, + options->_ExcludeExitNodesUnion, 1); + if (smartlist_len(use) == 0 && options->ExitNodes && + !options->StrictNodes) { /* give up on exitnodes and try again */ + routersets_get_disjunction(use, supporting, NULL, + options->_ExcludeExitNodesUnion, 1); + } + router = routerlist_sl_choose_by_bandwidth(use, WEIGHT_FOR_EXIT); + smartlist_free(use); + smartlist_free(supporting); } else { /* Either there are no pending connections, or no routers even seem to * possibly support any of them. Choose a router at random that satisfies * at least one predicted exit port. */ - int try; - smartlist_t *needed_ports; + int attempt; + smartlist_t *needed_ports, *supporting, *use; if (best_support == -1) { if (need_uptime || need_capacity) { @@ -1314,54 +2629,60 @@ "to list of all routers.", need_capacity?", fast":"", need_uptime?", stable":""); - smartlist_free(preferredexits); - smartlist_free(excludedexits); - smartlist_free(sl); tor_free(n_supported); return choose_good_exit_server_general(dir, 0, 0); } - log_notice(LD_CIRC, "All routers are down or won't exit -- choosing a " - "doomed exit at random."); + log_notice(LD_CIRC, "All routers are down or won't exit%s -- " + "choosing a doomed exit at random.", + options->_ExcludeExitNodesUnion ? " or are Excluded" : ""); } + supporting = smartlist_create(); + use = smartlist_create(); needed_ports = circuit_get_unhandled_ports(time(NULL)); - for (try = 0; try < 2; try++) { + for (attempt = 0; attempt < 2; attempt++) { /* try once to pick only from routers that satisfy a needed port, * then if there are none, pick from any that support exiting. */ for (i = 0; i < smartlist_len(dir->routers); i++) { router = smartlist_get(dir->routers, i); if (n_supported[i] != -1 && - (try || router_handles_some_port(router, needed_ports))) { + (attempt || router_handles_some_port(router, needed_ports))) { // log_fn(LOG_DEBUG,"Try %d: '%s' is a possibility.", // try, router->nickname); - smartlist_add(sl, router); + smartlist_add(supporting, router); } } - smartlist_subtract(sl,excludedexits); - if (options->StrictExitNodes || smartlist_overlap(sl,preferredexits)) - smartlist_intersect(sl,preferredexits); - /* XXX sometimes the above results in null, when the requested - * exit node is down. we should pick it anyway. */ - router = routerlist_sl_choose_by_bandwidth(sl, WEIGHT_FOR_EXIT); + routersets_get_disjunction(use, supporting, options->ExitNodes, + options->_ExcludeExitNodesUnion, 1); + if (smartlist_len(use) == 0 && options->ExitNodes && + !options->StrictNodes) { /* give up on exitnodes and try again */ + routersets_get_disjunction(use, supporting, NULL, + options->_ExcludeExitNodesUnion, 1); + } + /* FFF sometimes the above results in null, when the requested + * exit node is considered down by the consensus. we should pick + * it anyway, since the user asked for it. */ + router = routerlist_sl_choose_by_bandwidth(use, WEIGHT_FOR_EXIT); if (router) break; + smartlist_clear(supporting); + smartlist_clear(use); } SMARTLIST_FOREACH(needed_ports, uint16_t *, cp, tor_free(cp)); smartlist_free(needed_ports); + smartlist_free(use); + smartlist_free(supporting); } - smartlist_free(preferredexits); - smartlist_free(excludedexits); - smartlist_free(sl); tor_free(n_supported); if (router) { log_info(LD_CIRC, "Chose exit server '%s'", router->nickname); return router; } - if (options->StrictExitNodes) { + if (options->ExitNodes && options->StrictNodes) { log_warn(LD_CIRC, "No specified exit routers seem to be running, and " - "StrictExitNodes is set: can't choose an exit."); + "StrictNodes is set: can't choose an exit."); } return NULL; } @@ -1381,25 +2702,93 @@ int need_uptime, int need_capacity, int is_internal) { or_options_t *options = get_options(); + router_crn_flags_t flags = 0; + if (need_uptime) + flags |= CRN_NEED_UPTIME; + if (need_capacity) + flags |= CRN_NEED_CAPACITY; + switch (purpose) { case CIRCUIT_PURPOSE_C_GENERAL: + if (options->_AllowInvalid & ALLOW_INVALID_MIDDLE) + flags |= CRN_ALLOW_INVALID; if (is_internal) /* pick it like a middle hop */ - return router_choose_random_node(NULL, get_options()->ExcludeNodes, - NULL, need_uptime, need_capacity, 0, - get_options()->_AllowInvalid & ALLOW_INVALID_MIDDLE, 0, 0); + return router_choose_random_node(NULL, options->ExcludeNodes, flags); else return choose_good_exit_server_general(dir,need_uptime,need_capacity); case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - return router_choose_random_node( - options->RendNodes, options->RendExcludeNodes, - NULL, need_uptime, need_capacity, 0, - options->_AllowInvalid & ALLOW_INVALID_RENDEZVOUS, 0, 0); + if (options->_AllowInvalid & ALLOW_INVALID_RENDEZVOUS) + flags |= CRN_ALLOW_INVALID; + return router_choose_random_node(NULL, options->ExcludeNodes, flags); } log_warn(LD_BUG,"Unhandled purpose %d", purpose); tor_fragile_assert(); return NULL; } +/** Log a warning if the user specified an exit for the circuit that + * has been excluded from use by ExcludeNodes or ExcludeExitNodes. */ +static void +warn_if_last_router_excluded(origin_circuit_t *circ, const extend_info_t *exit) +{ + or_options_t *options = get_options(); + routerset_t *rs = options->ExcludeNodes; + const char *description; + int domain = LD_CIRC; + uint8_t purpose = circ->_base.purpose; + + if (circ->build_state->onehop_tunnel) + return; + + switch (purpose) + { + default: + case CIRCUIT_PURPOSE_OR: + case CIRCUIT_PURPOSE_INTRO_POINT: + case CIRCUIT_PURPOSE_REND_POINT_WAITING: + case CIRCUIT_PURPOSE_REND_ESTABLISHED: + log_warn(LD_BUG, "Called on non-origin circuit (purpose %d)", + (int)purpose); + return; + case CIRCUIT_PURPOSE_C_GENERAL: + if (circ->build_state->is_internal) + return; + description = "Requested exit node"; + rs = options->_ExcludeExitNodesUnion; + break; + case CIRCUIT_PURPOSE_C_INTRODUCING: + case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: + case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED: + case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: + case CIRCUIT_PURPOSE_S_CONNECT_REND: + case CIRCUIT_PURPOSE_S_REND_JOINED: + case CIRCUIT_PURPOSE_TESTING: + return; + case CIRCUIT_PURPOSE_C_ESTABLISH_REND: + case CIRCUIT_PURPOSE_C_REND_READY: + case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: + case CIRCUIT_PURPOSE_C_REND_JOINED: + description = "Chosen rendezvous point"; + domain = LD_BUG; + break; + case CIRCUIT_PURPOSE_CONTROLLER: + rs = options->_ExcludeExitNodesUnion; + description = "Controller-selected circuit target"; + break; + } + + if (routerset_contains_extendinfo(rs, exit)) { + log_fn(LOG_WARN, domain, "%s '%s' is in ExcludeNodes%s. Using anyway " + "(circuit purpose %d).", + description,exit->nickname, + rs==options->ExcludeNodes?"":" or ExcludeExitNodes", + (int)purpose); + circuit_log_path(LOG_WARN, domain, circ); + } + + return; +} + /** Decide a suitable length for circ's cpath, and pick an exit * router (or use exit if provided). Store these in the * cpath. Return 0 if ok, -1 if circuit should be closed. */ @@ -1420,6 +2809,7 @@ } if (exit) { /* the circuit-builder pre-requested one */ + warn_if_last_router_excluded(circ, exit); log_info(LD_CIRC,"Using requested exit node '%s'", exit->nickname); exit = extend_info_dup(exit); } else { /* we have to decide one */ @@ -1449,8 +2839,7 @@ state = circ->build_state; tor_assert(state); - if (state->chosen_exit) - extend_info_free(state->chosen_exit); + extend_info_free(state->chosen_exit); state->chosen_exit = extend_info_dup(exit); ++circ->build_state->desired_path_len; @@ -1466,6 +2855,7 @@ circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit) { int err_reason = 0; + warn_if_last_router_excluded(circ, exit); circuit_append_new_exit(circ, exit); circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING); if ((err_reason = circuit_send_next_onion_skin(circ))<0) { @@ -1531,52 +2921,6 @@ } } -/** Pick a random server digest that's running a Tor version that - * doesn't have the reachability bug. These are versions 0.1.1.21-cvs+ - * and 0.1.2.1-alpha+. Avoid picking authorities, since we're - * probably already connected to them. - * - * We only return one, so this doesn't become stupid when the - * whole network has upgraded. - * XXX021 we can great simplify this function now that all the broken - * versions are obsolete. -RD */ -static char * -compute_preferred_testing_list(const char *answer) -{ - smartlist_t *choices; - routerlist_t *rl = router_get_routerlist(); - routerinfo_t *router; - char *s; - - if (answer) /* they have one in mind -- easy */ - return tor_strdup(answer); - - choices = smartlist_create(); - /* now count up our choices */ - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, - if (r->is_running && r->is_valid && - ((tor_version_as_new_as(r->platform,"0.1.1.21-cvs") && - !tor_version_as_new_as(r->platform,"0.1.2.0-alpha-cvs")) || - tor_version_as_new_as(r->platform,"0.1.2.1-alpha")) && - !is_local_IP(r->addr) && - !router_get_trusteddirserver_by_digest(r->cache_info.identity_digest)) - smartlist_add(choices, r)); - router = smartlist_choose(choices); - smartlist_free(choices); - if (!router) { - log_info(LD_CIRC, "Looking for middle server that doesn't have the " - "reachability bug, but didn't find one. Oh well."); - return NULL; - } - log_info(LD_CIRC, "Looking for middle server that doesn't have the " - "reachability bug, and chose '%s'. Great.", router->nickname); - s = tor_malloc(HEX_DIGEST_LEN+2); - s[0] = '$'; - base16_encode(s+1, HEX_DIGEST_LEN+1, - router->cache_info.identity_digest, DIGEST_LEN); - return s; -} - /** A helper function used by onion_extend_cpath(). Use purpose * and state and the cpath head (currently populated only * to length cur_len to decide a suitable middle hop for a @@ -1594,7 +2938,7 @@ crypt_path_t *cpath; smartlist_t *excluded; or_options_t *options = get_options(); - char *preferred = NULL; + router_crn_flags_t flags = 0; tor_assert(_CIRCUIT_PURPOSE_MIN <= purpose && purpose <= _CIRCUIT_PURPOSE_MAX); @@ -1610,13 +2954,14 @@ routerlist_add_family(excluded, r); } } - if (purpose == CIRCUIT_PURPOSE_TESTING) - preferred = compute_preferred_testing_list(options->TestVia); - choice = router_choose_random_node(preferred, - options->ExcludeNodes, excluded, - state->need_uptime, state->need_capacity, 0, - options->_AllowInvalid & ALLOW_INVALID_MIDDLE, 0, 0); - tor_free(preferred); + + if (state->need_uptime) + flags |= CRN_NEED_UPTIME; + if (state->need_capacity) + flags |= CRN_NEED_CAPACITY; + if (options->_AllowInvalid & ALLOW_INVALID_MIDDLE) + flags |= CRN_ALLOW_INVALID; + choice = router_choose_random_node(excluded, options->ExcludeNodes, flags); smartlist_free(excluded); return choice; } @@ -1635,9 +2980,10 @@ routerinfo_t *r, *choice; smartlist_t *excluded; or_options_t *options = get_options(); - (void)purpose; /* not used yet. */ + router_crn_flags_t flags = CRN_NEED_GUARD; - if (state && options->UseEntryGuards) { + if (state && options->UseEntryGuards && + (purpose != CIRCUIT_PURPOSE_TESTING || options->BridgeRelay)) { return choose_random_entry(state); } @@ -1648,13 +2994,14 @@ routerlist_add_family(excluded, r); } if (firewall_is_fascist_or()) { - /* exclude all ORs that listen on the wrong port */ + /*XXXX This could slow things down a lot; use a smarter implementation */ + /* exclude all ORs that listen on the wrong port, if anybody notices. */ routerlist_t *rl = router_get_routerlist(); int i; for (i=0; i < smartlist_len(rl->routers); i++) { r = smartlist_get(rl->routers, i); - if (!fascist_firewall_allows_address_or(r->addr,r->or_port)) + if (!fascist_firewall_allows_or(r)) smartlist_add(excluded, r); } } @@ -1662,17 +3009,23 @@ if (options->UseEntryGuards && entry_guards) { SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, { - if ((r = router_get_by_digest(entry->identity))) + if ((r = router_get_by_digest(entry->identity))) { smartlist_add(excluded, r); + routerlist_add_family(excluded, r); + } }); } - choice = router_choose_random_node( - NULL, options->ExcludeNodes, - excluded, state ? state->need_uptime : 0, - state ? state->need_capacity : 0, - state ? 0 : 1, - options->_AllowInvalid & ALLOW_INVALID_ENTRY, 0, 0); + if (state) { + if (state->need_uptime) + flags |= CRN_NEED_UPTIME; + if (state->need_capacity) + flags |= CRN_NEED_CAPACITY; + } + if (options->_AllowInvalid & ALLOW_INVALID_ENTRY) + flags |= CRN_ALLOW_INVALID; + + choice = router_choose_random_node(excluded, options->ExcludeNodes, flags); smartlist_free(excluded); return choice; } @@ -1754,7 +3107,7 @@ hop->extend_info = extend_info_dup(choice); - hop->package_window = CIRCWINDOW_START; + hop->package_window = circuit_initial_package_window(); hop->deliver_window = CIRCWINDOW_START; return 0; @@ -1764,7 +3117,7 @@ extend_info_t * extend_info_alloc(const char *nickname, const char *digest, crypto_pk_env_t *onion_key, - uint32_t addr, uint16_t port) + const tor_addr_t *addr, uint16_t port) { extend_info_t *info = tor_malloc_zero(sizeof(extend_info_t)); memcpy(info->identity_digest, digest, DIGEST_LEN); @@ -1772,7 +3125,7 @@ strlcpy(info->nickname, nickname, sizeof(info->nickname)); if (onion_key) info->onion_key = crypto_pk_dup_key(onion_key); - info->addr = addr; + tor_addr_copy(&info->addr, addr); info->port = port; return info; } @@ -1782,18 +3135,20 @@ extend_info_t * extend_info_from_router(routerinfo_t *r) { + tor_addr_t addr; tor_assert(r); + tor_addr_from_ipv4h(&addr, r->addr); return extend_info_alloc(r->nickname, r->cache_info.identity_digest, - r->onion_pkey, r->addr, r->or_port); + r->onion_pkey, &addr, r->or_port); } /** Release storage held by an extend_info_t struct. */ void extend_info_free(extend_info_t *info) { - tor_assert(info); - if (info->onion_key) - crypto_free_pk_env(info->onion_key); + if (!info) + return; + crypto_free_pk_env(info->onion_key); tor_free(info); } @@ -1844,6 +3199,7 @@ * * If it's not usable, set *reason to a static string explaining why. */ +/*XXXX take a routerstatus, not a routerinfo. */ static int entry_guard_set_status(entry_guard_t *e, routerinfo_t *ri, time_t now, or_options_t *options, const char **reason) @@ -1863,9 +3219,9 @@ else if (options->UseBridges && ri->purpose != ROUTER_PURPOSE_BRIDGE) *reason = "not a bridge"; else if (!options->UseBridges && !ri->is_possible_guard && - !router_nickname_is_in_list(ri, options->EntryNodes)) + !routerset_contains_router(options->EntryNodes,ri)) *reason = "not recommended as a guard"; - else if (router_nickname_is_in_list(ri, options->ExcludeNodes)) + else if (routerset_contains_router(options->ExcludeNodes, ri)) *reason = "excluded"; if (*reason && ! e->bad_since) { @@ -1887,7 +3243,6 @@ control_event_guard(e->nickname, e->identity, "GOOD"); changed = 1; } - return changed; } @@ -1915,36 +3270,59 @@ * right now. (Else return NULL.) In particular, it must be * - Listed as either up or never yet contacted; * - Present in the routerlist; - * - Listed as 'stable' or 'fast' by the current dirserver concensus, - * if demanded by need_uptime or need_capacity; - * (This check is currently redundant with the Guard flag, but in - * the future that might change. Best to leave it in for now.) + * - Listed as 'stable' or 'fast' by the current dirserver consensus, + * if demanded by need_uptime or need_capacity + * (unless it's a configured EntryNode); * - Allowed by our current ReachableORAddresses config option; and - * - Currently thought to be reachable by us (unless assume_reachable + * - Currently thought to be reachable by us (unless assume_reachable * is true). + * + * If the answer is no, set *msg to an explanation of why. */ static INLINE routerinfo_t * entry_is_live(entry_guard_t *e, int need_uptime, int need_capacity, - int assume_reachable) + int assume_reachable, const char **msg) { routerinfo_t *r; - if (e->bad_since) + or_options_t *options = get_options(); + tor_assert(msg); + + if (e->bad_since) { + *msg = "bad"; return NULL; + } /* no good if it's unreachable, unless assume_unreachable or can_retry. */ - if ((!assume_reachable && !e->can_retry) && - e->unreachable_since && !entry_is_time_to_retry(e, time(NULL))) + if (!assume_reachable && !e->can_retry && + e->unreachable_since && !entry_is_time_to_retry(e, time(NULL))) { + *msg = "unreachable"; return NULL; + } r = router_get_by_digest(e->identity); - if (!r) + if (!r) { + *msg = "no descriptor"; return NULL; - if (get_options()->UseBridges && r->purpose != ROUTER_PURPOSE_BRIDGE) + } + if (get_options()->UseBridges && r->purpose != ROUTER_PURPOSE_BRIDGE) { + *msg = "not a bridge"; return NULL; - if (!get_options()->UseBridges && r->purpose != ROUTER_PURPOSE_GENERAL) + } + if (!get_options()->UseBridges && r->purpose != ROUTER_PURPOSE_GENERAL) { + *msg = "not general-purpose"; return NULL; - if (router_is_unreliable(r, need_uptime, need_capacity, 0)) + } + if (options->EntryNodes && + routerset_contains_router(options->EntryNodes, r)) { + /* they asked for it, they get it */ + need_uptime = need_capacity = 0; + } + if (router_is_unreliable(r, need_uptime, need_capacity, 0)) { + *msg = "not fast/stable"; return NULL; - if (!fascist_firewall_allows_address_or(r->addr,r->or_port)) + } + if (!fascist_firewall_allows_or(r)) { + *msg = "unreachable by config"; return NULL; + } return r; } @@ -1953,11 +3331,12 @@ num_live_entry_guards(void) { int n = 0; + const char *msg; if (! entry_guards) return 0; SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, { - if (entry_is_live(entry, 0, 1, 0)) + if (entry_is_live(entry, 0, 1, 0, &msg)) ++n; }); return n; @@ -1981,16 +3360,21 @@ log_entry_guards(int severity) { smartlist_t *elements = smartlist_create(); - char buf[1024]; char *s; SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, { - tor_snprintf(buf, sizeof(buf), "%s (%s%s)", - e->nickname, - entry_is_live(e, 0, 1, 0) ? "up " : "down ", - e->made_contact ? "made-contact" : "never-contacted"); - smartlist_add(elements, tor_strdup(buf)); + const char *msg = NULL; + char *cp; + if (entry_is_live(e, 0, 1, 0, &msg)) + tor_asprintf(&cp, "%s (up %s)", + e->nickname, + e->made_contact ? "made-contact" : "never-contacted"); + else + tor_asprintf(&cp, "%s (%s, %s)", + e->nickname, msg, + e->made_contact ? "made-contact" : "never-contacted"); + smartlist_add(elements, cp); }); s = smartlist_join_strings(elements, ",", 0, NULL); @@ -2002,7 +3386,7 @@ /** Called when one or more guards that we would previously have used for some * purpose are no longer in use because a higher-priority guard has become - * useable again. */ + * usable again. */ static void control_event_guard_deferred(void) { @@ -2014,12 +3398,13 @@ **/ #if 0 int n = 0; + const char *msg; or_options_t *options = get_options(); if (!entry_guards) return; SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, { - if (entry_is_live(entry, 0, 1, 0)) { + if (entry_is_live(entry, 0, 1, 0, &msg)) { if (n++ == options->NumEntryGuards) { control_event_guard(entry->nickname, entry->identity, "DEFERRED"); return; @@ -2061,7 +3446,12 @@ log_info(LD_CIRC, "Chose '%s' as new entry guard.", router->nickname); strlcpy(entry->nickname, router->nickname, sizeof(entry->nickname)); memcpy(entry->identity, router->cache_info.identity_digest, DIGEST_LEN); - entry->chosen_on_date = start_of_month(time(NULL)); + /* Choose expiry time smudged over the past month. The goal here + * is to a) spread out when Tor clients rotate their guards, so they + * don't all select them on the same day, and b) avoid leaving a + * precise timestamp in the state file about when we first picked + * this guard. For details, see the Jan 2010 or-dev thread. */ + entry->chosen_on_date = time(NULL) - crypto_rand_int(3600*24*30); entry->chosen_by_version = tor_strdup(VERSION); if (chosen) /* prepend */ smartlist_insert(entry_guards, 0, entry); @@ -2100,7 +3490,8 @@ static void entry_guard_free(entry_guard_t *e) { - tor_assert(e); + if (!e) + return; tor_free(e->chosen_by_version); tor_free(e); } @@ -2112,32 +3503,51 @@ remove_obsolete_entry_guards(void) { int changed = 0, i; + time_t now = time(NULL); + for (i = 0; i < smartlist_len(entry_guards); ++i) { entry_guard_t *entry = smartlist_get(entry_guards, i); const char *ver = entry->chosen_by_version; const char *msg = NULL; tor_version_t v; - int version_is_bad = 0; + int version_is_bad = 0, date_is_bad = 0; if (!ver) { msg = "does not say what version of Tor it was selected by"; version_is_bad = 1; } else if (tor_version_parse(ver, &v)) { msg = "does not seem to be from any recognized version of Tor"; version_is_bad = 1; - } else if ((tor_version_as_new_as(ver, "0.1.0.10-alpha") && - !tor_version_as_new_as(ver, "0.1.2.16-dev")) || - (tor_version_as_new_as(ver, "0.2.0.0-alpha") && - !tor_version_as_new_as(ver, "0.2.0.6-alpha"))) { - msg = "was selected without regard for guard bandwidth"; - version_is_bad = 1; + } else { + size_t len = strlen(ver)+5; + char *tor_ver = tor_malloc(len); + tor_snprintf(tor_ver, len, "Tor %s", ver); + if ((tor_version_as_new_as(tor_ver, "0.1.0.10-alpha") && + !tor_version_as_new_as(tor_ver, "0.1.2.16-dev")) || + (tor_version_as_new_as(tor_ver, "0.2.0.0-alpha") && + !tor_version_as_new_as(tor_ver, "0.2.0.6-alpha")) || + /* above are bug 440; below are bug 1217 */ + (tor_version_as_new_as(tor_ver, "0.2.1.3-alpha") && + !tor_version_as_new_as(tor_ver, "0.2.1.23")) || + (tor_version_as_new_as(tor_ver, "0.2.2.0-alpha") && + !tor_version_as_new_as(tor_ver, "0.2.2.7-alpha"))) { + msg = "was selected without regard for guard bandwidth"; + version_is_bad = 1; + } + tor_free(tor_ver); + } + if (!version_is_bad && entry->chosen_on_date + 3600*24*60 < now) { + /* It's been 2 months since the date listed in our state file. */ + msg = "was selected several months ago"; + date_is_bad = 1; } - if (version_is_bad) { + + if (version_is_bad || date_is_bad) { /* we need to drop it */ char dbuf[HEX_DIGEST_LEN+1]; tor_assert(msg); base16_encode(dbuf, sizeof(dbuf), entry->identity, DIGEST_LEN); - log_notice(LD_CIRC, "Entry guard '%s' (%s) %s. (Version=%s.) " - "Replacing it.", - entry->nickname, dbuf, msg, ver?escaped(ver):"none"); + log_fn(version_is_bad ? LOG_NOTICE : LOG_INFO, LD_CIRC, + "Entry guard '%s' (%s) %s. (Version=%s.) Replacing it.", + entry->nickname, dbuf, msg, ver?escaped(ver):"none"); control_event_guard(entry->nickname, entry->identity, "DROPPED"); entry_guard_free(entry); smartlist_del_keeporder(entry_guards, i--); @@ -2198,24 +3608,31 @@ int changed = 0; int severity = LOG_DEBUG; or_options_t *options; + digestmap_t *reasons; + if (! entry_guards) return; options = get_options(); + if (options->EntryNodes) /* reshuffle the entry guard list if needed */ + entry_nodes_should_be_added(); now = time(NULL); - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, + reasons = digestmap_new(); + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { routerinfo_t *r = router_get_by_digest(entry->identity); const char *reason = NULL; - /*XXX021 log reason again. */ if (entry_guard_set_status(entry, r, now, options, &reason)) changed = 1; if (entry->bad_since) tor_assert(reason); - }); + if (reason) + digestmap_set(reasons, entry->identity, (char*)reason); + } + SMARTLIST_FOREACH_END(entry); if (remove_dead_entry_guards()) changed = 1; @@ -2223,27 +3640,41 @@ severity = changed ? LOG_DEBUG : LOG_INFO; if (changed) { - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, - log_info(LD_CIRC, "Summary: Entry '%s' is %s, %s, and %s.", + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { + const char *reason = digestmap_get(reasons, entry->identity); + const char *live_msg = ""; + routerinfo_t *r = entry_is_live(entry, 0, 1, 0, &live_msg); + log_info(LD_CIRC, "Summary: Entry '%s' is %s, %s%s%s, and %s%s.", entry->nickname, entry->unreachable_since ? "unreachable" : "reachable", entry->bad_since ? "unusable" : "usable", - entry_is_live(entry, 0, 1, 0) ? "live" : "not live")); + reason ? ", ": "", + reason ? reason : "", + r ? "live" : "not live / ", + r ? "" : live_msg); + } SMARTLIST_FOREACH_END(entry); log_info(LD_CIRC, " (%d/%d entry guards are usable/new)", num_live_entry_guards(), smartlist_len(entry_guards)); log_entry_guards(LOG_INFO); entry_guards_changed(); } + + digestmap_free(reasons, NULL); } /** Called when a connection to an OR with the identity digest digest * is established (succeeded==1) or has failed (succeeded==0). * If the OR is an entry, change that entry's up/down status. * Return 0 normally, or -1 if we want to tear down the new connection. + * + * If mark_relay_status, also call router_set_status() on this + * relay. + * + * XXX022 change succeeded and mark_relay_status into 'int flags'. */ int entry_guard_register_connect_status(const char *digest, int succeeded, - time_t now) + int mark_relay_status, time_t now) { int changed = 0; int refuse_conn = 0; @@ -2291,6 +3722,7 @@ "Removing from the list. %d/%d entry guards usable/new.", entry->nickname, buf, num_live_entry_guards()-1, smartlist_len(entry_guards)-1); + control_event_guard(entry->nickname, entry->identity, "DROPPED"); entry_guard_free(entry); smartlist_del_keeporder(entry_guards, idx); log_entry_guards(LOG_INFO); @@ -2313,6 +3745,11 @@ } } + /* if the caller asked us to, also update the is_running flags for this + * relay */ + if (mark_relay_status) + router_set_status(digest, succeeded); + if (first_contact) { /* We've just added a new long-term entry guard. Perhaps the network just * came back? We should give our earlier entries another try too, @@ -2322,7 +3759,8 @@ if (e == entry) break; if (e->made_contact) { - routerinfo_t *r = entry_is_live(e, 0, 1, 1); + const char *msg; + routerinfo_t *r = entry_is_live(e, 0, 1, 1, &msg); if (r && e->unreachable_since) { refuse_conn = 1; e->can_retry = 1; @@ -2353,7 +3791,8 @@ void entry_nodes_should_be_added(void) { - log_info(LD_CIRC, "New EntryNodes config option detected. Will use."); + log_info(LD_CIRC, "EntryNodes config option set. Putting configured " + "relays at the front of the entry guard list."); should_add_entry_nodes = 1; } @@ -2377,8 +3816,11 @@ return; } - log_info(LD_CIRC,"Adding configured EntryNodes '%s'.", - options->EntryNodes); + { + char *string = routerset_to_string(options->EntryNodes); + log_info(LD_CIRC,"Adding configured EntryNodes '%s'.", string); + tor_free(string); + } entry_routers = smartlist_create(); entry_fps = smartlist_create(); @@ -2386,7 +3828,14 @@ old_entry_guards_not_on_list = smartlist_create(); /* Split entry guards into those on the list and those not. */ - add_nickname_list_to_smartlist(entry_routers, options->EntryNodes, 0); + + /* XXXX022 Now that we allow countries and IP ranges in EntryNodes, this is + * potentially an enormous list. For now, we disable such values for + * EntryNodes in options_validate(); really, this wants a better solution. + * Perhaps we should do this calculation once whenever the list of routers + * changes or the entrynodes setting changes. + */ + routerset_get_all_routers(entry_routers, options->EntryNodes, 0); SMARTLIST_FOREACH(entry_routers, routerinfo_t *, ri, smartlist_add(entry_fps,ri->cache_info.identity_digest)); SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, { @@ -2411,8 +3860,9 @@ SMARTLIST_FOREACH(entry_routers, routerinfo_t *, ri, { add_an_entry_guard(ri, 0); }); - /* Finally, the remaining EntryNodes, unless we're strict */ - if (options->StrictEntryNodes) { + /* Finally, the remaining previously configured guards that are not in + * EntryNodes, unless we're strict in which case we drop them */ + if (options->StrictNodes) { SMARTLIST_FOREACH(old_entry_guards_not_on_list, entry_guard_t *, e, entry_guard_free(e)); } else { @@ -2426,16 +3876,30 @@ entry_guards_changed(); } -/** Return 1 if we're fine adding arbitrary routers out of the - * directory to our entry guard list. Else return 0. */ +/** Return 0 if we're fine adding arbitrary routers out of the + * directory to our entry guard list, or return 1 if we have a + * list already and we'd prefer to stick to it. + */ int -entry_list_can_grow(or_options_t *options) +entry_list_is_constrained(or_options_t *options) { - if (options->StrictEntryNodes) - return 0; + if (options->EntryNodes) + return 1; if (options->UseBridges) - return 0; - return 1; + return 1; + return 0; +} + +/* Are we dead set against changing our entry guard list, or would we + * change it if it means keeping Tor usable? */ +static int +entry_list_is_totally_static(or_options_t *options) +{ + if (options->EntryNodes && options->StrictNodes) + return 1; + if (options->UseBridges) + return 1; + return 0; } /** Pick a live (up and listed) entry guard from entry_guards. If @@ -2453,7 +3917,7 @@ routerinfo_t *r = NULL; int need_uptime = state ? state->need_uptime : 0; int need_capacity = state ? state->need_capacity : 0; - int consider_exit_family = 0; + int preferred_min, consider_exit_family = 0; if (chosen_exit) { smartlist_add(exit_family, chosen_exit); @@ -2467,36 +3931,60 @@ if (should_add_entry_nodes) entry_guards_prepend_from_config(); - if (entry_list_can_grow(options) && - (! entry_guards || - smartlist_len(entry_guards) < options->NumEntryGuards)) + if (!entry_list_is_constrained(options) && + smartlist_len(entry_guards) < options->NumEntryGuards) pick_entry_guards(); retry: smartlist_clear(live_entry_guards); SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, { - r = entry_is_live(entry, need_uptime, need_capacity, 0); - if (r && (!consider_exit_family || !smartlist_isin(exit_family, r))) { - smartlist_add(live_entry_guards, r); - if (!entry->made_contact) { - /* Always start with the first not-yet-contacted entry - * guard. Otherwise we might add several new ones, pick - * the second new one, and now we've expanded our entry - * guard list without needing to. */ - goto choose_and_finish; + const char *msg; + r = entry_is_live(entry, need_uptime, need_capacity, 0, &msg); + if (!r) + continue; /* down, no point */ + if (consider_exit_family && smartlist_isin(exit_family, r)) + continue; /* avoid relays that are family members of our exit */ + if (options->EntryNodes && + !routerset_contains_router(options->EntryNodes, r)) { + /* We've come to the end of our preferred entry nodes. */ + if (smartlist_len(live_entry_guards)) + goto choose_and_finish; /* only choose from the ones we like */ + if (options->StrictNodes) { + /* in theory this case should never happen, since + * entry_guards_prepend_from_config() drops unwanted relays */ + tor_fragile_assert(); + } else { + log_info(LD_CIRC, + "No relays from EntryNodes available. Using others."); } - if (smartlist_len(live_entry_guards) >= options->NumEntryGuards) - break; /* we have enough */ } + smartlist_add(live_entry_guards, r); + if (!entry->made_contact) { + /* Always start with the first not-yet-contacted entry + * guard. Otherwise we might add several new ones, pick + * the second new one, and now we've expanded our entry + * guard list without needing to. */ + goto choose_and_finish; + } + if (smartlist_len(live_entry_guards) >= options->NumEntryGuards) + break; /* we have enough */ }); - /* Try to have at least 2 choices available. This way we don't - * get stuck with a single live-but-crummy entry and just keep - * using him. - * (We might get 2 live-but-crummy entry guards, but so be it.) */ - if (smartlist_len(live_entry_guards) < 2) { - if (entry_list_can_grow(options)) { + if (entry_list_is_constrained(options)) { + /* If we prefer the entry nodes we've got, and we have at least + * one choice, that's great. Use it. */ + preferred_min = 1; + } else { + /* Try to have at least 2 choices available. This way we don't + * get stuck with a single live-but-crummy entry and just keep + * using him. + * (We might get 2 live-but-crummy entry guards, but so be it.) */ + preferred_min = 2; + } + + if (smartlist_len(live_entry_guards) < preferred_min) { + if (!entry_list_is_totally_static(options)) { /* still no? try adding a new entry then */ /* XXX if guard doesn't imply fast and stable, then we need * to tell add_an_entry_guard below what we want, or it might @@ -2521,7 +4009,7 @@ need_capacity = 0; goto retry; } - if (!r && !entry_list_can_grow(options) && consider_exit_family) { + if (!r && entry_list_is_constrained(options) && consider_exit_family) { /* still no? if we're using bridges or have strictentrynodes * set, and our chosen exit is in the same family as all our * bridges/entry guards, then be flexible about families. */ @@ -2532,34 +4020,21 @@ } choose_and_finish: - if (entry_list_can_grow(options)) { + if (entry_list_is_constrained(options)) { + /* We need to weight by bandwidth, because our bridges or entryguards + * were not already selected proportional to their bandwidth. */ + r = routerlist_sl_choose_by_bandwidth(live_entry_guards, WEIGHT_FOR_GUARD); + } else { /* We choose uniformly at random here, because choose_good_entry_server() * already weights its choices by bandwidth, so we don't want to * *double*-weight our guard selection. */ r = smartlist_choose(live_entry_guards); - } else { - /* We need to weight by bandwidth, because our bridges or entryguards - * were not already selected proportional to their bandwidth. */ - r = routerlist_sl_choose_by_bandwidth(live_entry_guards, WEIGHT_FOR_GUARD); } smartlist_free(live_entry_guards); smartlist_free(exit_family); return r; } -/** Helper: Return the start of the month containing time. */ -static time_t -start_of_month(time_t now) -{ - struct tm tm; - tor_gmtime_r(&now, &tm); - tm.tm_sec = 0; - tm.tm_min = 0; - tm.tm_hour = 0; - tm.tm_mday = 1; - return tor_timegm(&tm); -} - /** Parse state and learn about the entry guards it describes. * If set is true, and there are no errors, replace the global * entry_list with what we find. @@ -2668,7 +4143,7 @@ } else { if (state_version) { e->chosen_by_version = tor_strdup(state_version); - e->chosen_on_date = start_of_month(time(NULL)); + e->chosen_on_date = time(NULL) - crypto_rand_int(3600*24*30); } } }); @@ -2677,7 +4152,7 @@ SMARTLIST_FOREACH(new_entry_guards, entry_guard_t *, e, entry_guard_free(e)); smartlist_free(new_entry_guards); - } else { /* !*err && set */ + } else { /* !err && set */ if (entry_guards) { SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, entry_guard_free(e)); @@ -2685,6 +4160,8 @@ } entry_guards = new_entry_guards; entry_guards_dirty = 0; + /* XXX022 hand new_entry_guards to this func, and move it up a + * few lines, so we don't have to re-dirty it */ if (remove_obsolete_entry_guards()) entry_guards_dirty = 1; } @@ -2784,9 +4261,11 @@ * */ int getinfo_helper_entry_guards(control_connection_t *conn, - const char *question, char **answer) + const char *question, char **answer, + const char **errmsg) { - int use_long_names = conn->use_long_names; + (void) conn; + (void) errmsg; if (!strcmp(question,"entry-guards") || !strcmp(question,"helper-nodes")) { @@ -2795,12 +4274,13 @@ char nbuf[MAX_VERBOSE_NICKNAME_LEN+1]; if (!entry_guards) entry_guards = smartlist_create(); - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, - { + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { size_t len = MAX_VERBOSE_NICKNAME_LEN+ISO_TIME_LEN+32; char *c = tor_malloc(len); const char *status = NULL; time_t when = 0; + routerinfo_t *ri; + if (!e->made_contact) { status = "never-connected"; } else if (e->bad_since) { @@ -2809,19 +4289,17 @@ } else { status = "up"; } - if (use_long_names) { - routerinfo_t *ri = router_get_by_digest(e->identity); - if (ri) { - router_get_verbose_nickname(nbuf, ri); - } else { - nbuf[0] = '$'; - base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN); - /* e->nickname field is not very reliable if we don't know about - * this router any longer; don't include it. */ - } + + ri = router_get_by_digest(e->identity); + if (ri) { + router_get_verbose_nickname(nbuf, ri); } else { - base16_encode(nbuf, sizeof(nbuf), e->identity, DIGEST_LEN); + nbuf[0] = '$'; + base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN); + /* e->nickname field is not very reliable if we don't know about + * this router any longer; don't include it. */ } + if (when) { format_iso_time(tbuf, when); tor_snprintf(c, len, "%s %s %s\n", nbuf, status, tbuf); @@ -2829,7 +4307,7 @@ tor_snprintf(c, len, "%s %s\n", nbuf, status); } smartlist_add(sl, c); - }); + } SMARTLIST_FOREACH_END(e); *answer = smartlist_join_strings(sl, "", 0, NULL); SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); smartlist_free(sl); @@ -2841,11 +4319,11 @@ * ones in the torrc file, but one day we may be able to learn about new * bridges on our own, and remember them in the state file. */ typedef struct { - /** IPv4 address of the bridge. */ - uint32_t addr; + /** Address of the bridge. */ + tor_addr_t addr; /** TLS port for the bridge. */ uint16_t port; - /** Expected identity digest, or all \0's if we don't know what the + /** Expected identity digest, or all zero bytes if we don't know what the * digest should be. */ char identity[DIGEST_LEN]; /** When should we next try to fetch a descriptor for this bridge? */ @@ -2870,71 +4348,77 @@ * (either by comparing keys if possible, else by comparing addr/port). * Else return NULL. */ static bridge_info_t * -routerinfo_get_configured_bridge(routerinfo_t *ri) +get_configured_bridge_by_addr_port_digest(tor_addr_t *addr, uint16_t port, + const char *digest) { if (!bridge_list) return NULL; - SMARTLIST_FOREACH(bridge_list, bridge_info_t *, bridge, + SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) { if (tor_digest_is_zero(bridge->identity) && - bridge->addr == ri->addr && bridge->port == ri->or_port) + !tor_addr_compare(&bridge->addr, addr, CMP_EXACT) && + bridge->port == port) return bridge; - if (!memcmp(bridge->identity, ri->cache_info.identity_digest, - DIGEST_LEN)) + if (!memcmp(bridge->identity, digest, DIGEST_LEN)) return bridge; - }); + } + SMARTLIST_FOREACH_END(bridge); return NULL; } +/** Wrapper around get_configured_bridge_by_addr_port_digest() to look + * it up via router descriptor ri. */ +static bridge_info_t * +get_configured_bridge_by_routerinfo(routerinfo_t *ri) +{ + tor_addr_t addr; + tor_addr_from_ipv4h(&addr, ri->addr); + return get_configured_bridge_by_addr_port_digest(&addr, + ri->or_port, ri->cache_info.identity_digest); +} + /** Return 1 if ri is one of our known bridges, else 0. */ int routerinfo_is_a_configured_bridge(routerinfo_t *ri) { - return routerinfo_get_configured_bridge(ri) ? 1 : 0; + return get_configured_bridge_by_routerinfo(ri) ? 1 : 0; +} + +/** We made a connection to a router at addr:port + * without knowing its digest. Its digest turned out to be digest. + * If it was a bridge, and we still don't know its digest, record it. + */ +void +learned_router_identity(tor_addr_t *addr, uint16_t port, const char *digest) +{ + bridge_info_t *bridge = + get_configured_bridge_by_addr_port_digest(addr, port, digest); + if (bridge && tor_digest_is_zero(bridge->identity)) { + memcpy(bridge->identity, digest, DIGEST_LEN); + log_notice(LD_DIR, "Learned fingerprint %s for bridge %s:%d", + hex_str(digest, DIGEST_LEN), fmt_addr(addr), port); + } } /** Remember a new bridge at addr:port. If digest * is set, it tells us the identity key too. */ void -bridge_add_from_config(uint32_t addr, uint16_t port, char *digest) +bridge_add_from_config(const tor_addr_t *addr, uint16_t port, char *digest) { bridge_info_t *b = tor_malloc_zero(sizeof(bridge_info_t)); - b->addr = addr; + tor_addr_copy(&b->addr, addr); b->port = port; if (digest) memcpy(b->identity, digest, DIGEST_LEN); + b->fetch_status.schedule = DL_SCHED_BRIDGE; if (!bridge_list) bridge_list = smartlist_create(); smartlist_add(bridge_list, b); } -/** Schedule the next fetch for bridge, based on - * some retry schedule. */ -static void -bridge_fetch_status_increment(bridge_info_t *bridge, time_t now) -{ - switch (bridge->fetch_status.n_download_failures) { - case 0: bridge->fetch_status.next_attempt_at = now+60*15; break; - case 1: bridge->fetch_status.next_attempt_at = now+60*15; break; - default: bridge->fetch_status.next_attempt_at = now+60*60; break; - } - if (bridge->fetch_status.n_download_failures < 10) - bridge->fetch_status.n_download_failures++; -} - -/** We just got a new descriptor for bridge. Reschedule the - * next fetch for a long time from now. */ -static void -bridge_fetch_status_arrived(bridge_info_t *bridge, time_t now) -{ - tor_assert(bridge); - bridge->fetch_status.next_attempt_at = now+60*60; - bridge->fetch_status.n_download_failures = 0; -} - /** If digest is one of our known bridges, return it. */ static bridge_info_t * -find_bridge_by_digest(char *digest) +find_bridge_by_digest(const char *digest) { SMARTLIST_FOREACH(bridge_list, bridge_info_t *, bridge, { @@ -2947,35 +4431,36 @@ /** We need to ask bridge for its server descriptor. address * is a helpful string describing this bridge. */ static void -launch_direct_bridge_descriptor_fetch(char *address, bridge_info_t *bridge) +launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge) { + char *address; + if (connection_get_by_type_addr_port_purpose( - CONN_TYPE_DIR, bridge->addr, bridge->port, + CONN_TYPE_DIR, &bridge->addr, bridge->port, DIR_PURPOSE_FETCH_SERVERDESC)) return; /* it's already on the way */ - directory_initiate_command(address, bridge->addr, + + address = tor_dup_addr(&bridge->addr); + directory_initiate_command(address, &bridge->addr, bridge->port, 0, + 0, /* does not matter */ 1, bridge->identity, DIR_PURPOSE_FETCH_SERVERDESC, ROUTER_PURPOSE_BRIDGE, 0, "authority.z", NULL, 0, 0); + tor_free(address); } /** Fetching the bridge descriptor from the bridge authority returned a * "not found". Fall back to trying a direct fetch. */ void -retry_bridge_descriptor_fetch_directly(char *digest) +retry_bridge_descriptor_fetch_directly(const char *digest) { bridge_info_t *bridge = find_bridge_by_digest(digest); - char address_buf[INET_NTOA_BUF_LEN+1]; - struct in_addr in; - if (!bridge) return; /* not found? oh well. */ - in.s_addr = htonl(bridge->addr); - tor_inet_ntoa(&in, address_buf, sizeof(address_buf)); - launch_direct_bridge_descriptor_fetch(address_buf, bridge); + launch_direct_bridge_descriptor_fetch(bridge); } /** For each bridge in our list for which we don't currently have a @@ -2984,8 +4469,6 @@ void fetch_bridge_descriptors(time_t now) { - char address_buf[INET_NTOA_BUF_LEN+1]; - struct in_addr in; or_options_t *options = get_options(); int num_bridge_auths = get_n_authorities(BRIDGE_AUTHORITY); int ask_bridge_directly; @@ -2994,16 +4477,14 @@ if (!bridge_list) return; - SMARTLIST_FOREACH(bridge_list, bridge_info_t *, bridge, + SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) { - if (bridge->fetch_status.next_attempt_at > now) + if (!download_status_is_ready(&bridge->fetch_status, now, + IMPOSSIBLE_TO_DOWNLOAD)) continue; /* don't bother, no need to retry yet */ /* schedule another fetch as if this one will fail, in case it does */ - bridge_fetch_status_increment(bridge, now); - - in.s_addr = htonl(bridge->addr); - tor_inet_ntoa(&in, address_buf, sizeof(address_buf)); + download_status_failed(&bridge->fetch_status, 0); can_use_bridge_authority = !tor_digest_is_zero(bridge->identity) && num_bridge_auths; @@ -3014,9 +4495,10 @@ !options->UpdateBridgesFromAuthority, !num_bridge_auths); if (ask_bridge_directly && - !fascist_firewall_allows_address_or(bridge->addr, bridge->port)) { + !fascist_firewall_allows_address_or(&bridge->addr, bridge->port)) { log_notice(LD_DIR, "Bridge at '%s:%d' isn't reachable by our " - "firewall policy. %s.", address_buf, bridge->port, + "firewall policy. %s.", fmt_addr(&bridge->addr), + bridge->port, can_use_bridge_authority ? "Asking bridge authority instead" : "Skipping"); if (can_use_bridge_authority) @@ -3027,7 +4509,7 @@ if (ask_bridge_directly) { /* we need to ask the bridge itself for its descriptor. */ - launch_direct_bridge_descriptor_fetch(address_buf, bridge); + launch_direct_bridge_descriptor_fetch(bridge); } else { /* We have a digest and we want to ask an authority. We could * combine all the requests into one, but that may give more @@ -3042,7 +4524,8 @@ directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC, ROUTER_PURPOSE_BRIDGE, resource, 0); } - }); + } + SMARTLIST_FOREACH_END(bridge); } /** We just learned a descriptor for a bridge. See if that @@ -3054,14 +4537,14 @@ tor_assert(ri->purpose == ROUTER_PURPOSE_BRIDGE); if (get_options()->UseBridges) { int first = !any_bridge_descriptors_known(); - bridge_info_t *bridge = routerinfo_get_configured_bridge(ri); + bridge_info_t *bridge = get_configured_bridge_by_routerinfo(ri); time_t now = time(NULL); ri->is_running = 1; if (bridge) { /* if we actually want to use this one */ /* it's here; schedule its re-fetch for a long time from now. */ if (!from_cache) - bridge_fetch_status_arrived(bridge, now); + download_status_reset(&bridge->fetch_status); add_an_entry_guard(ri, 1); log_notice(LD_DIR, "new bridge descriptor '%s' (%s)", ri->nickname, @@ -3085,6 +4568,27 @@ return choose_random_entry(NULL)!=NULL ? 1 : 0; } +/** Return 1 if there are any directory conns fetching bridge descriptors + * that aren't marked for close. We use this to guess if we should tell + * the controller that we have a problem. */ +int +any_pending_bridge_descriptor_fetches(void) +{ + smartlist_t *conns = get_connection_array(); + SMARTLIST_FOREACH(conns, connection_t *, conn, + { + if (conn->type == CONN_TYPE_DIR && + conn->purpose == DIR_PURPOSE_FETCH_SERVERDESC && + TO_DIR_CONN(conn)->router_purpose == ROUTER_PURPOSE_BRIDGE && + !conn->marked_for_close && + conn->linked && !conn->linked_conn->marked_for_close) { + log_debug(LD_DIR, "found one: %s", conn->address); + return 1; + } + }); + return 0; +} + /** Return 1 if we have at least one descriptor for a bridge and * all descriptors we know are down. Else return 0. If act is * 1, then mark the down bridges up; else just observe and report. */ @@ -3110,6 +4614,7 @@ } } }); + log_debug(LD_DIR, "any_known %d, any_running %d", any_known, any_running); return any_known && !any_running; } diff -Nru tor-0.2.0.34/src/or/circuitbuild.h tor-0.2.2.16-alpha/src/or/circuitbuild.h --- tor-0.2.0.34/src/or/circuitbuild.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/circuitbuild.h 2010-08-18 23:04:46.000000000 +0000 @@ -0,0 +1,123 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file circuitbuild.h + * \brief Header file for circuitbuild.c. + **/ + +#ifndef _TOR_CIRCUITBUILD_H +#define _TOR_CIRCUITBUILD_H + +char *circuit_list_path(origin_circuit_t *circ, int verbose); +char *circuit_list_path_for_controller(origin_circuit_t *circ); +void circuit_log_path(int severity, unsigned int domain, + origin_circuit_t *circ); +void circuit_rep_hist_note_result(origin_circuit_t *circ); +origin_circuit_t *origin_circuit_init(uint8_t purpose, int flags); +origin_circuit_t *circuit_establish_circuit(uint8_t purpose, + extend_info_t *exit, + int flags); +int circuit_handle_first_hop(origin_circuit_t *circ); +void circuit_n_conn_done(or_connection_t *or_conn, int status); +int inform_testing_reachability(void); +int circuit_send_next_onion_skin(origin_circuit_t *circ); +void circuit_note_clock_jumped(int seconds_elapsed); +int circuit_extend(cell_t *cell, circuit_t *circ); +int circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data, + int reverse); +int circuit_finish_handshake(origin_circuit_t *circ, uint8_t cell_type, + const char *reply); +int circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer); +int onionskin_answer(or_circuit_t *circ, uint8_t cell_type, + const char *payload, const char *keys); +int circuit_all_predicted_ports_handled(time_t now, int *need_uptime, + int *need_capacity); + +int circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *info); +int circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *info); +void onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop); +extend_info_t *extend_info_alloc(const char *nickname, const char *digest, + crypto_pk_env_t *onion_key, + const tor_addr_t *addr, uint16_t port); +extend_info_t *extend_info_from_router(routerinfo_t *r); +extend_info_t *extend_info_dup(extend_info_t *info); +void extend_info_free(extend_info_t *info); +routerinfo_t *build_state_get_exit_router(cpath_build_state_t *state); +const char *build_state_get_exit_nickname(cpath_build_state_t *state); + +void entry_guards_compute_status(void); +int entry_guard_register_connect_status(const char *digest, int succeeded, + int mark_relay_status, time_t now); +void entry_nodes_should_be_added(void); +int entry_list_is_constrained(or_options_t *options); +routerinfo_t *choose_random_entry(cpath_build_state_t *state); +int entry_guards_parse_state(or_state_t *state, int set, char **msg); +void entry_guards_update_state(or_state_t *state); +int getinfo_helper_entry_guards(control_connection_t *conn, + const char *question, char **answer, + const char **errmsg); + +void clear_bridge_list(void); +int routerinfo_is_a_configured_bridge(routerinfo_t *ri); +void +learned_router_identity(tor_addr_t *addr, uint16_t port, const char *digest); +void bridge_add_from_config(const tor_addr_t *addr, uint16_t port, + char *digest); +void retry_bridge_descriptor_fetch_directly(const char *digest); +void fetch_bridge_descriptors(time_t now); +void learned_bridge_descriptor(routerinfo_t *ri, int from_cache); +int any_bridge_descriptors_known(void); +int any_pending_bridge_descriptor_fetches(void); +int bridges_known_but_down(void); +void bridges_retry_all(void); + +void entry_guards_free_all(void); + +extern circuit_build_times_t circ_times; +void circuit_build_times_update_state(circuit_build_times_t *cbt, + or_state_t *state); +int circuit_build_times_parse_state(circuit_build_times_t *cbt, + or_state_t *state); +void circuit_build_times_count_timeout(circuit_build_times_t *cbt, + int did_onehop); +int circuit_build_times_count_close(circuit_build_times_t *cbt, + int did_onehop, time_t start_time); +void circuit_build_times_set_timeout(circuit_build_times_t *cbt); +int circuit_build_times_add_time(circuit_build_times_t *cbt, + build_time_t time); +int circuit_build_times_needs_circuits(circuit_build_times_t *cbt); + +int circuit_build_times_needs_circuits_now(circuit_build_times_t *cbt); +void circuit_build_times_init(circuit_build_times_t *cbt); +void circuit_build_times_new_consensus_params(circuit_build_times_t *cbt, + networkstatus_t *ns); +double circuit_build_times_timeout_rate(const circuit_build_times_t *cbt); +double circuit_build_times_close_rate(const circuit_build_times_t *cbt); + +#ifdef CIRCUIT_PRIVATE +double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt, + double quantile); +build_time_t circuit_build_times_generate_sample(circuit_build_times_t *cbt, + double q_lo, double q_hi); +void circuit_build_times_initial_alpha(circuit_build_times_t *cbt, + double quantile, double time_ms); +int circuit_build_times_update_alpha(circuit_build_times_t *cbt); +double circuit_build_times_cdf(circuit_build_times_t *cbt, double x); +void circuitbuild_running_unit_tests(void); +void circuit_build_times_reset(circuit_build_times_t *cbt); + +/* Network liveness functions */ +int circuit_build_times_network_check_changed(circuit_build_times_t *cbt); +#endif + +/* Network liveness functions */ +void circuit_build_times_network_is_live(circuit_build_times_t *cbt); +int circuit_build_times_network_check_live(circuit_build_times_t *cbt); +void circuit_build_times_network_circ_success(circuit_build_times_t *cbt); + +#endif + diff -Nru tor-0.2.0.34/src/or/circuitlist.c tor-0.2.2.16-alpha/src/or/circuitlist.c --- tor-0.2.0.34/src/or/circuitlist.c 2008-08-20 05:22:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/circuitlist.c 2010-09-17 01:30:36.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: circuitlist.c 16463 2008-08-07 20:19:38Z nickm $ */ -const char circuitlist_c_id[] = - "$Id: circuitlist.c 16463 2008-08-07 20:19:38Z nickm $"; /** * \file circuitlist.c @@ -13,6 +10,21 @@ **/ #include "or.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "connection.h" +#include "config.h" +#include "connection_edge.h" +#include "connection_or.h" +#include "control.h" +#include "networkstatus.h" +#include "onion.h" +#include "relay.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rephist.h" +#include "routerlist.h" #include "ht.h" /********* START VARIABLES **********/ @@ -34,7 +46,7 @@ typedef struct orconn_circid_circuit_map_t { HT_ENTRY(orconn_circid_circuit_map_t) node; or_connection_t *or_conn; - uint16_t circ_id; + circid_t circ_id; circuit_t *circuit; } orconn_circid_circuit_map_t; @@ -53,7 +65,7 @@ static INLINE unsigned int _orconn_circid_entry_hash(orconn_circid_circuit_map_t *a) { - return (((unsigned)a->circ_id)<<16) ^ (unsigned)(uintptr_t)(a->or_conn); + return (((unsigned)a->circ_id)<<8) ^ (unsigned)(uintptr_t)(a->or_conn); } /** Map from [orconn,circid] to circuit. */ @@ -80,13 +92,13 @@ * XXX "active" isn't an arg anymore */ static void circuit_set_circid_orconn_helper(circuit_t *circ, int direction, - uint16_t id, + circid_t id, or_connection_t *conn) { orconn_circid_circuit_map_t search; orconn_circid_circuit_map_t *found; or_connection_t *old_conn, **conn_ptr; - uint16_t old_id, *circid_ptr; + circid_t old_id, *circid_ptr; int was_active, make_active; if (direction == CELL_DIRECTION_OUT) { @@ -159,7 +171,7 @@ * with the corresponding circuit ID, and add the circuit as appropriate * to the (orconn,id)-\>circuit map. */ void -circuit_set_p_circid_orconn(or_circuit_t *circ, uint16_t id, +circuit_set_p_circid_orconn(or_circuit_t *circ, circid_t id, or_connection_t *conn) { circuit_set_circid_orconn_helper(TO_CIRCUIT(circ), CELL_DIRECTION_IN, @@ -173,7 +185,7 @@ * with the corresponding circuit ID, and add the circuit as appropriate * to the (orconn,id)-\>circuit map. */ void -circuit_set_n_circid_orconn(circuit_t *circ, uint16_t id, +circuit_set_n_circid_orconn(circuit_t *circ, circid_t id, or_connection_t *conn) { circuit_set_circid_orconn_helper(circ, CELL_DIRECTION_OUT, id, conn); @@ -231,24 +243,25 @@ if (!circuits_pending_or_conns) return; - SMARTLIST_FOREACH(circuits_pending_or_conns, circuit_t *, circ, - { + SMARTLIST_FOREACH_BEGIN(circuits_pending_or_conns, circuit_t *, circ) { if (circ->marked_for_close) continue; + if (!circ->n_hop) + continue; tor_assert(circ->state == CIRCUIT_STATE_OR_WAIT); - if (tor_digest_is_zero(circ->n_conn_id_digest)) { + if (tor_digest_is_zero(circ->n_hop->identity_digest)) { /* Look at addr/port. This is an unkeyed connection. */ - if (circ->n_addr != or_conn->_base.addr || - circ->n_port != or_conn->_base.port) + if (!tor_addr_eq(&circ->n_hop->addr, &or_conn->_base.addr) || + circ->n_hop->port != or_conn->_base.port) continue; } else { /* We expected a key. See if it's the right one. */ if (memcmp(or_conn->identity_digest, - circ->n_conn_id_digest, DIGEST_LEN)) + circ->n_hop->identity_digest, DIGEST_LEN)) continue; } smartlist_add(out, circ); - }); + } SMARTLIST_FOREACH_END(circ); } /** Return the number of circuits in state OR_WAIT, waiting for the given @@ -318,16 +331,83 @@ } } +/** Map a circuit purpose to a string suitable to be displayed to a + * controller. */ +const char * +circuit_purpose_to_controller_string(uint8_t purpose) +{ + static char buf[32]; + switch (purpose) { + case CIRCUIT_PURPOSE_OR: + case CIRCUIT_PURPOSE_INTRO_POINT: + case CIRCUIT_PURPOSE_REND_POINT_WAITING: + case CIRCUIT_PURPOSE_REND_ESTABLISHED: + return "SERVER"; /* A controller should never see these, actually. */ + + case CIRCUIT_PURPOSE_C_GENERAL: + return "GENERAL"; + case CIRCUIT_PURPOSE_C_INTRODUCING: + case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: + case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED: + return "HS_CLIENT_INTRO"; + + case CIRCUIT_PURPOSE_C_ESTABLISH_REND: + case CIRCUIT_PURPOSE_C_REND_READY: + case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: + case CIRCUIT_PURPOSE_C_REND_JOINED: + return "HS_CLIENT_REND"; + + case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: + case CIRCUIT_PURPOSE_S_INTRO: + return "HS_SERVICE_INTRO"; + + case CIRCUIT_PURPOSE_S_CONNECT_REND: + case CIRCUIT_PURPOSE_S_REND_JOINED: + return "HS_SERVICE_REND"; + + case CIRCUIT_PURPOSE_TESTING: + return "TESTING"; + case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT: + return "EXPIRED"; + case CIRCUIT_PURPOSE_CONTROLLER: + return "CONTROLLER"; + + default: + tor_snprintf(buf, sizeof(buf), "UNKNOWN_%d", (int)purpose); + return buf; + } +} + +/** Pick a reasonable package_window to start out for our circuits. + * Originally this was hard-coded at 1000, but now the consensus votes + * on the answer. See proposal 168. */ +int32_t +circuit_initial_package_window(void) +{ + int32_t num = networkstatus_get_param(NULL, "circwindow", CIRCWINDOW_START); + /* If the consensus tells us a negative number, we'd assert. */ + if (num < 0) + num = CIRCWINDOW_START; + return num; +} + /** Initialize the common elements in a circuit_t, and add it to the global * list. */ static void init_circuit_base(circuit_t *circ) { circ->timestamp_created = time(NULL); + tor_gettimeofday(&circ->highres_created); - circ->package_window = CIRCWINDOW_START; + circ->package_window = circuit_initial_package_window(); circ->deliver_window = CIRCWINDOW_START; + /* Initialize the cell_ewma_t structure */ + circ->n_cell_ewma.last_adjusted_tick = cell_ewma_get_tick(); + circ->n_cell_ewma.cell_count = 0.0; + circ->n_cell_ewma.heap_index = -1; + circ->n_cell_ewma.is_for_p_conn = 0; + circuit_add(circ); } @@ -347,16 +427,20 @@ circ->next_stream_id = crypto_rand_int(1<<16); circ->global_identifier = n_circuits_allocated++; + circ->remaining_relay_early_cells = MAX_RELAY_EARLY_CELLS_PER_CIRCUIT; + circ->remaining_relay_early_cells -= crypto_rand_int(2); init_circuit_base(TO_CIRCUIT(circ)); + circ_times.last_circ_at = approx_time(); + return circ; } /** Allocate a new or_circuit_t, connected to p_conn as * p_circ_id. If p_conn is NULL, the circuit is unattached. */ or_circuit_t * -or_circuit_new(uint16_t p_circ_id, or_connection_t *p_conn) +or_circuit_new(circid_t p_circ_id, or_connection_t *p_conn) { /* CircIDs */ or_circuit_t *circ; @@ -367,8 +451,20 @@ if (p_conn) circuit_set_p_circid_orconn(circ, p_circ_id, p_conn); + circ->remaining_relay_early_cells = MAX_RELAY_EARLY_CELLS_PER_CIRCUIT; + init_circuit_base(TO_CIRCUIT(circ)); + /* Initialize the cell_ewma_t structure */ + + /* Initialize the cell counts to 0 */ + circ->p_cell_ewma.cell_count = 0.0; + circ->p_cell_ewma.last_adjusted_tick = cell_ewma_get_tick(); + circ->p_cell_ewma.is_for_p_conn = 1; + + /* It's not in any heap yet. */ + circ->p_cell_ewma.heap_index = -1; + return circ; } @@ -379,38 +475,37 @@ { void *mem; size_t memlen; - tor_assert(circ); + if (!circ) + return; + if (CIRCUIT_IS_ORIGIN(circ)) { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); mem = ocirc; memlen = sizeof(origin_circuit_t); tor_assert(circ->magic == ORIGIN_CIRCUIT_MAGIC); if (ocirc->build_state) { - if (ocirc->build_state->chosen_exit) extend_info_free(ocirc->build_state->chosen_exit); - if (ocirc->build_state->pending_final_cpath) circuit_free_cpath_node(ocirc->build_state->pending_final_cpath); } tor_free(ocirc->build_state); circuit_free_cpath(ocirc->cpath); - if (ocirc->intro_key) - crypto_free_pk_env(ocirc->intro_key); + crypto_free_pk_env(ocirc->intro_key); + rend_data_free(ocirc->rend_data); } else { or_circuit_t *ocirc = TO_OR_CIRCUIT(circ); + /* Remember cell statistics for this circuit before deallocating. */ + if (get_options()->CellStatistics) + rep_hist_buffer_stats_add_circ(circ, time(NULL)); mem = ocirc; memlen = sizeof(or_circuit_t); tor_assert(circ->magic == OR_CIRCUIT_MAGIC); - if (ocirc->p_crypto) - crypto_free_cipher_env(ocirc->p_crypto); - if (ocirc->p_digest) - crypto_free_digest_env(ocirc->p_digest); - if (ocirc->n_crypto) - crypto_free_cipher_env(ocirc->n_crypto); - if (ocirc->n_digest) - crypto_free_digest_env(ocirc->n_digest); + crypto_free_cipher_env(ocirc->p_crypto); + crypto_free_digest_env(ocirc->p_digest); + crypto_free_cipher_env(ocirc->n_crypto); + crypto_free_digest_env(ocirc->n_digest); if (ocirc->rend_splice) { or_circuit_t *other = ocirc->rend_splice; @@ -426,6 +521,7 @@ cell_queue_clear(ô->p_conn_cells); } + extend_info_free(circ->n_hop); tor_free(circ->n_conn_onionskin); /* Remove from map. */ @@ -435,7 +531,7 @@ * "active" checks will be violated. */ cell_queue_clear(&circ->n_conn_cells); - memset(circ, 0xAA, memlen); /* poison memory */ + memset(mem, 0xAA, memlen); /* poison memory */ tor_free(mem); } @@ -478,10 +574,10 @@ circuit_free(global_circuitlist); global_circuitlist = next; } - if (circuits_pending_or_conns) { - smartlist_free(circuits_pending_or_conns); - circuits_pending_or_conns = NULL; - } + + smartlist_free(circuits_pending_or_conns); + circuits_pending_or_conns = NULL; + HT_CLEAR(orconn_circid_map, &orconn_circid_circuit_map); } @@ -489,18 +585,15 @@ static void circuit_free_cpath_node(crypt_path_t *victim) { - if (victim->f_crypto) - crypto_free_cipher_env(victim->f_crypto); - if (victim->b_crypto) - crypto_free_cipher_env(victim->b_crypto); - if (victim->f_digest) - crypto_free_digest_env(victim->f_digest); - if (victim->b_digest) - crypto_free_digest_env(victim->b_digest); - if (victim->dh_handshake_state) - crypto_dh_free(victim->dh_handshake_state); - if (victim->extend_info) - extend_info_free(victim->extend_info); + if (!victim) + return; + + crypto_free_cipher_env(victim->f_crypto); + crypto_free_cipher_env(victim->b_crypto); + crypto_free_digest_env(victim->f_digest); + crypto_free_digest_env(victim->b_digest); + crypto_dh_free(victim->dh_handshake_state); + extend_info_free(victim->extend_info); memset(victim, 0xBB, sizeof(crypt_path_t)); /* poison memory */ tor_free(victim); @@ -564,12 +657,12 @@ } } } - if (!circ->n_conn && circ->n_addr && circ->n_port && - circ->n_addr == conn->addr && - circ->n_port == conn->port && + if (!circ->n_conn && circ->n_hop && + tor_addr_eq(&circ->n_hop->addr, &conn->addr) && + circ->n_hop->port == conn->port && conn->type == CONN_TYPE_OR && - !memcmp(TO_OR_CONN(conn)->identity_digest, circ->n_conn_id_digest, - DIGEST_LEN)) { + !memcmp(TO_OR_CONN(conn)->identity_digest, + circ->n_hop->identity_digest, DIGEST_LEN)) { circuit_dump_details(severity, circ, conn->conn_array_index, (circ->state == CIRCUIT_STATE_OPEN && !CIRCUIT_IS_ORIGIN(circ)) ? @@ -603,7 +696,7 @@ * Return NULL if no such circuit exists. */ static INLINE circuit_t * -circuit_get_by_circid_orconn_impl(uint16_t circ_id, or_connection_t *conn) +circuit_get_by_circid_orconn_impl(circid_t circ_id, or_connection_t *conn) { orconn_circid_circuit_map_t search; orconn_circid_circuit_map_t *found; @@ -652,7 +745,7 @@ * Return NULL if no such circuit exists. */ circuit_t * -circuit_get_by_circid_orconn(uint16_t circ_id, or_connection_t *conn) +circuit_get_by_circid_orconn(circid_t circ_id, or_connection_t *conn) { circuit_t *circ = circuit_get_by_circid_orconn_impl(circ_id, conn); if (!circ || circ->marked_for_close) @@ -664,7 +757,7 @@ /** Return true iff the circuit ID circ_id is currently used by a * circuit, marked or not, on conn. */ int -circuit_id_in_use_on_orconn(uint16_t circ_id, or_connection_t *conn) +circuit_id_in_use_on_orconn(circid_t circ_id, or_connection_t *conn) { return circuit_get_by_circid_orconn_impl(circ_id, conn) != NULL; } @@ -713,7 +806,7 @@ } /** Return a circ such that: - * - circ-\>rend_query is equal to rend_query, and + * - circ-\>rend_data-\>query is equal to rend_query, and * - circ-\>purpose is equal to purpose. * * Return NULL if no such circuit exists. @@ -727,9 +820,13 @@ for (circ = global_circuitlist; circ; circ = circ->next) { if (!circ->marked_for_close && - circ->purpose == purpose && - !rend_cmp_service_ids(rend_query, TO_ORIGIN_CIRCUIT(circ)->rend_query)) - return TO_ORIGIN_CIRCUIT(circ); + circ->purpose == purpose) { + origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); + if (ocirc->rend_data && + !rend_cmp_service_ids(rend_query, + ocirc->rend_data->onion_address)) + return ocirc; + } } return NULL; } @@ -757,7 +854,8 @@ continue; if (!digest) return TO_ORIGIN_CIRCUIT(circ); - else if (!memcmp(TO_ORIGIN_CIRCUIT(circ)->rend_pk_digest, + else if (TO_ORIGIN_CIRCUIT(circ)->rend_data && + !memcmp(TO_ORIGIN_CIRCUIT(circ)->rend_data->rend_pk_digest, digest, DIGEST_LEN)) return TO_ORIGIN_CIRCUIT(circ); } @@ -808,24 +906,26 @@ * flags in flags, and if info is defined, does not already use info * as any of its hops; or NULL if no circuit fits this description. * + * The purpose argument (currently ignored) refers to the purpose of + * the circuit we want to create, not the purpose of the circuit we want to + * cannibalize. + * * If !CIRCLAUNCH_NEED_UPTIME, prefer returning non-uptime circuits. */ origin_circuit_t * circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info, int flags) { - /*XXXX021 arma: The purpose argument is ignored. Can that possibly be - * right? */ - /* XXXX i don't know of any actual bugs that this causes. since i - * think we only call the function for purposes where we want it to do what - * the function does. somebody should check this though. */ - circuit_t *_circ; origin_circuit_t *best=NULL; int need_uptime = (flags & CIRCLAUNCH_NEED_UPTIME) != 0; int need_capacity = (flags & CIRCLAUNCH_NEED_CAPACITY) != 0; int internal = (flags & CIRCLAUNCH_IS_INTERNAL) != 0; + /* Make sure we're not trying to create a onehop circ by + * cannibalization. */ + tor_assert(!(flags & CIRCLAUNCH_ONEHOP_TUNNEL)); + log_debug(LD_CIRC, "Hunting for a circ to cannibalize: purpose %d, uptime %d, " "capacity %d, internal %d", @@ -838,17 +938,11 @@ _circ->purpose == CIRCUIT_PURPOSE_C_GENERAL && !_circ->timestamp_dirty) { origin_circuit_t *circ = TO_ORIGIN_CIRCUIT(_circ); -#if 0 /* XXX here while roger investigates a reported RendNodes bug */ - if (_circ->purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND && - options->RendNodes) { - routerinfo_t *exit = build_state_get_exit_router(circ->build_state); - if (exit && !router_nickname_is_in_list(exit, options->RendNodes)) - continue; /* not one of our allowed RendNodes */ - } -#endif if ((!need_uptime || circ->build_state->need_uptime) && (!need_capacity || circ->build_state->need_capacity) && - (internal == circ->build_state->is_internal)) { + (internal == circ->build_state->is_internal) && + circ->remaining_relay_early_cells && + !circ->build_state->onehop_tunnel) { if (info) { /* need to make sure we don't duplicate hops */ crypt_path_t *hop = circ->cpath; @@ -1021,22 +1115,26 @@ origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); tor_assert(circ->state == CIRCUIT_STATE_OPEN); tor_assert(ocirc->build_state->chosen_exit); + tor_assert(ocirc->rend_data); /* treat this like getting a nack from it */ log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). " - "Removing from descriptor.", - safe_str(ocirc->rend_query), - safe_str(build_state_get_exit_nickname(ocirc->build_state))); + "Removing from descriptor.", + safe_str_client(ocirc->rend_data->onion_address), + safe_str_client(build_state_get_exit_nickname(ocirc->build_state))); rend_client_remove_intro_point(ocirc->build_state->chosen_exit, - ocirc->rend_query); + ocirc->rend_data); } - if (circ->n_conn) + if (circ->n_conn) { + circuit_clear_cell_queue(circ, circ->n_conn); connection_or_send_destroy(circ->n_circ_id, circ->n_conn, reason); + } if (! CIRCUIT_IS_ORIGIN(circ)) { or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); edge_connection_t *conn; for (conn=or_circ->n_streams; conn; conn=conn->next_stream) connection_edge_destroy(or_circ->p_circ_id, conn); + or_circ->n_streams = NULL; while (or_circ->resolving_streams) { conn = or_circ->resolving_streams; @@ -1045,7 +1143,7 @@ /* The client will see a DESTROY, and infer that the connections * are closing because the circuit is getting torn down. No need * to send an end cell. */ - conn->_base.edge_has_sent_end = 1; + conn->edge_has_sent_end = 1; conn->end_reason = END_STREAM_REASON_DESTROY; conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED; connection_mark_for_close(TO_CONN(conn)); @@ -1053,13 +1151,16 @@ conn->on_circuit = NULL; } - if (or_circ->p_conn) + if (or_circ->p_conn) { + circuit_clear_cell_queue(circ, or_circ->p_conn); connection_or_send_destroy(or_circ->p_circ_id, or_circ->p_conn, reason); + } } else { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); edge_connection_t *conn; for (conn=ocirc->p_streams; conn; conn=conn->next_stream) connection_edge_destroy(circ->n_circ_id, conn); + ocirc->p_streams = NULL; } circ->marked_for_close = line; @@ -1156,21 +1257,24 @@ } if (c->n_conn) { - tor_assert(!memcmp(c->n_conn->identity_digest, c->n_conn_id_digest, - DIGEST_LEN)); - if (c->n_circ_id) - tor_assert(c == circuit_get_by_circid_orconn(c->n_circ_id, c->n_conn)); + tor_assert(!c->n_hop); + + if (c->n_circ_id) { + /* We use the _impl variant here to make sure we don't fail on marked + * circuits, which would not be returned by the regular function. */ + circuit_t *c2 = circuit_get_by_circid_orconn_impl(c->n_circ_id, + c->n_conn); + tor_assert(c == c2); + } } if (or_circ && or_circ->p_conn) { - if (or_circ->p_circ_id) - tor_assert(c == circuit_get_by_circid_orconn(or_circ->p_circ_id, - or_circ->p_conn)); - } -#if 0 /* false now that rendezvous exits are attached to p_streams */ - if (origin_circ) - for (conn = origin_circ->p_streams; conn; conn = conn->next_stream) - tor_assert(conn->_base.type == CONN_TYPE_AP); -#endif + if (or_circ->p_circ_id) { + /* ibid */ + circuit_t *c2 = circuit_get_by_circid_orconn_impl(or_circ->p_circ_id, + or_circ->p_conn); + tor_assert(c == c2); + } + } if (or_circ) for (conn = or_circ->n_streams; conn; conn = conn->next_stream) tor_assert(conn->_base.type == CONN_TYPE_EXIT); diff -Nru tor-0.2.0.34/src/or/circuitlist.h tor-0.2.2.16-alpha/src/or/circuitlist.h --- tor-0.2.0.34/src/or/circuitlist.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/circuitlist.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,60 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file circuitlist.h + * \brief Header file for circuitlist.c. + **/ + +#ifndef _TOR_CIRCUITLIST_H +#define _TOR_CIRCUITLIST_H + +circuit_t * _circuit_get_global_list(void); +const char *circuit_state_to_string(int state); +const char *circuit_purpose_to_controller_string(uint8_t purpose); +void circuit_dump_by_conn(connection_t *conn, int severity); +void circuit_set_p_circid_orconn(or_circuit_t *circ, circid_t id, + or_connection_t *conn); +void circuit_set_n_circid_orconn(circuit_t *circ, circid_t id, + or_connection_t *conn); +void circuit_set_state(circuit_t *circ, uint8_t state); +void circuit_close_all_marked(void); +int32_t circuit_initial_package_window(void); +origin_circuit_t *origin_circuit_new(void); +or_circuit_t *or_circuit_new(circid_t p_circ_id, or_connection_t *p_conn); +circuit_t *circuit_get_by_circid_orconn(circid_t circ_id, + or_connection_t *conn); +int circuit_id_in_use_on_orconn(circid_t circ_id, or_connection_t *conn); +circuit_t *circuit_get_by_edge_conn(edge_connection_t *conn); +void circuit_unlink_all_from_or_conn(or_connection_t *conn, int reason); +origin_circuit_t *circuit_get_by_global_id(uint32_t id); +origin_circuit_t *circuit_get_by_rend_query_and_purpose(const char *rend_query, + uint8_t purpose); +origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start, + const char *digest, uint8_t purpose); +or_circuit_t *circuit_get_rendezvous(const char *cookie); +or_circuit_t *circuit_get_intro_point(const char *digest); +origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose, + extend_info_t *info, int flags); +void circuit_mark_all_unused_circs(void); +void circuit_expire_all_dirty_circs(void); +void _circuit_mark_for_close(circuit_t *circ, int reason, + int line, const char *file); +int circuit_get_cpath_len(origin_circuit_t *circ); +crypt_path_t *circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum); +void circuit_get_all_pending_on_or_conn(smartlist_t *out, + or_connection_t *or_conn); +int circuit_count_pending_on_or_conn(or_connection_t *or_conn); + +#define circuit_mark_for_close(c, reason) \ + _circuit_mark_for_close((c), (reason), __LINE__, _SHORT_FILE_) + +void assert_cpath_layer_ok(const crypt_path_t *cp); +void assert_circuit_ok(const circuit_t *c); +void circuit_free_all(void); + +#endif + diff -Nru tor-0.2.0.34/src/or/circuituse.c tor-0.2.2.16-alpha/src/or/circuituse.c --- tor-0.2.0.34/src/or/circuituse.c 2009-01-30 19:21:27.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/circuituse.c 2010-08-18 23:04:46.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: circuituse.c 18236 2009-01-22 16:37:09Z nickm $ */ -const char circuituse_c_id[] = - "$Id: circuituse.c 18236 2009-01-22 16:37:09Z nickm $"; /** * \file circuituse.c @@ -13,6 +10,20 @@ **/ #include "or.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "control.h" +#include "policies.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rendservice.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" /********* START VARIABLES **********/ @@ -20,9 +31,11 @@ /********* END VARIABLES ************/ -static void circuit_expire_old_circuits(time_t now); +static void circuit_expire_old_circuits_clientside(time_t now); static void circuit_increment_failure_count(void); +long int lround(double x); + /** Return 1 if circ could be returned by circuit_get_best(). * Else return 0. */ @@ -83,7 +96,7 @@ if (purpose == CIRCUIT_PURPOSE_C_GENERAL) { if (!exitrouter && !build_state->onehop_tunnel) { - log_debug(LD_CIRC,"Not considering circuit with unknown router."); + log_debug(LD_CIRC,"Not considering circuit with unknown router."); return 0; /* this circuit is screwed and doesn't know it yet, * or is a rendezvous circuit. */ } @@ -102,9 +115,10 @@ return 0; /* this is a circuit to somewhere else */ if (tor_digest_is_zero(digest)) { /* we don't know the digest; have to compare addr:port */ - struct in_addr in; - if (!tor_inet_aton(conn->socks_request->address, &in) || - build_state->chosen_exit->addr != ntohl(in.s_addr) || + tor_addr_t addr; + int r = tor_addr_from_str(&addr, conn->socks_request->address); + if (r < 0 || + !tor_addr_eq(&build_state->chosen_exit->addr, &addr) || build_state->chosen_exit->port != conn->socks_request->port) return 0; } @@ -115,13 +129,17 @@ return 0; } } - if (exitrouter && !connection_ap_can_use_exit(conn, exitrouter)) { + if (exitrouter && !connection_ap_can_use_exit(conn, exitrouter, 0)) { /* can't exit from this router */ return 0; } } else { /* not general */ - if (rend_cmp_service_ids(conn->rend_query, - TO_ORIGIN_CIRCUIT(circ)->rend_query)) { + origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); + if ((conn->rend_data && !ocirc->rend_data) || + (!conn->rend_data && ocirc->rend_data) || + (conn->rend_data && ocirc->rend_data && + rend_cmp_service_ids(conn->rend_data->onion_address, + ocirc->rend_data->onion_address))) { /* this circ is not for this conn */ return 0; } @@ -189,6 +207,7 @@ { circuit_t *circ, *best=NULL; time_t now = time(NULL); + int intro_going_on_but_too_old = 0; tor_assert(conn); @@ -201,6 +220,16 @@ need_uptime,need_internal,now)) continue; +/* XXX022 make this 15 be a function of circuit finishing times we've + * seen lately, a la Fallon Chen's GSoC work -RD */ +#define REND_PARALLEL_INTRO_DELAY 15 + if (purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT && + !must_be_open && circ->state != CIRCUIT_STATE_OPEN && + circ->timestamp_created + REND_PARALLEL_INTRO_DELAY < now) { + intro_going_on_but_too_old = 1; + continue; + } + /* now this is an acceptable circ to hand back. but that doesn't * mean it's the *best* circ to hand back. try to decide. */ @@ -208,45 +237,96 @@ best = circ; } + if (!best && intro_going_on_but_too_old) + log_info(LD_REND|LD_CIRC, "There is an intro circuit being created " + "right now, but it has already taken quite a while. Starting " + "one in parallel."); + return best ? TO_ORIGIN_CIRCUIT(best) : NULL; } +/** Check whether, according to the policies in options, the + * circuit circ makes sense. */ +/* XXXX currently only checks Exclude{Exit}Nodes. It should check more. */ +int +circuit_conforms_to_options(const origin_circuit_t *circ, + const or_options_t *options) +{ + const crypt_path_t *cpath, *cpath_next = NULL; + + for (cpath = circ->cpath; cpath && cpath_next != circ->cpath; + cpath = cpath_next) { + cpath_next = cpath->next; + + if (routerset_contains_extendinfo(options->ExcludeNodes, + cpath->extend_info)) + return 0; + + if (cpath->next == circ->cpath) { + /* This is apparently the exit node. */ + + if (routerset_contains_extendinfo(options->ExcludeExitNodes, + cpath->extend_info)) + return 0; + } + } + return 1; +} + /** Close all circuits that start at us, aren't open, and were born * at least CircuitBuildTimeout seconds ago. */ void circuit_expire_building(time_t now) { - circuit_t *victim, *circ = global_circuitlist; - time_t cutoff = now - get_options()->CircuitBuildTimeout; - time_t begindir_cutoff = now - get_options()->CircuitBuildTimeout/2; + circuit_t *victim, *next_circ = global_circuitlist; + /* circ_times.timeout is BUILD_TIMEOUT_INITIAL_VALUE if we haven't + * decided on a customized one yet */ + time_t general_cutoff = now - lround(circ_times.timeout_ms/1000); + time_t begindir_cutoff = now - lround(circ_times.timeout_ms/2000); + time_t close_cutoff = now - lround(circ_times.close_ms/1000); + time_t introcirc_cutoff = begindir_cutoff; cpath_build_state_t *build_state; - while (circ) { - victim = circ; - circ = circ->next; + while (next_circ) { + time_t cutoff; + victim = next_circ; + next_circ = next_circ->next; if (!CIRCUIT_IS_ORIGIN(victim) || /* didn't originate here */ victim->marked_for_close) /* don't mess with marked circs */ continue; build_state = TO_ORIGIN_CIRCUIT(victim)->build_state; - if (victim->timestamp_created > - ((build_state && build_state->onehop_tunnel) ? - begindir_cutoff : cutoff)) + if (build_state && build_state->onehop_tunnel) + cutoff = begindir_cutoff; + else if (victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCING) + cutoff = introcirc_cutoff; + else if (victim->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) + cutoff = close_cutoff; + else + cutoff = general_cutoff; + + if (victim->timestamp_created > cutoff) continue; /* it's still young, leave it alone */ #if 0 /* some debug logs, to help track bugs */ + if (victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCING && + victim->timestamp_created <= introcirc_cutoff && + victim->timestamp_created > general_cutoff) + log_info(LD_REND|LD_CIRC, "Timing out introduction circuit which we " + "would not have done if it had been a general circuit."); + if (victim->purpose >= CIRCUIT_PURPOSE_C_INTRODUCING && victim->purpose <= CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) { if (!victim->timestamp_dirty) - log_fn(LOG_DEBUG,"Considering %sopen purp %d to %s (circid %d)." + log_fn(LOG_DEBUG,"Considering %sopen purpose %d to %s (circid %d)." "(clean).", victim->state == CIRCUIT_STATE_OPEN ? "" : "non", victim->purpose, victim->build_state->chosen_exit_name, victim->n_circ_id); else - log_fn(LOG_DEBUG,"Considering %sopen purp %d to %s (circid %d). " + log_fn(LOG_DEBUG,"Considering %sopen purpose %d to %s (circid %d). " "%d secs since dirty.", victim->state == CIRCUIT_STATE_OPEN ? "" : "non", victim->purpose, victim->build_state->chosen_exit_name, @@ -271,7 +351,7 @@ /* c_rend_ready circs measure age since timestamp_dirty, * because that's set when they switch purposes */ - if (TO_ORIGIN_CIRCUIT(victim)->rend_query[0] || + if (TO_ORIGIN_CIRCUIT(victim)->rend_data || victim->timestamp_dirty > cutoff) continue; break; @@ -285,11 +365,48 @@ continue; break; } + } else { /* circuit not open, consider recording failure as timeout */ + int first_hop_succeeded = TO_ORIGIN_CIRCUIT(victim)->cpath && + TO_ORIGIN_CIRCUIT(victim)->cpath->state == CPATH_STATE_OPEN; + + if (TO_ORIGIN_CIRCUIT(victim)->p_streams != NULL) { + log_warn(LD_BUG, "Circuit %d (purpose %d) has timed out, " + "yet has attached streams!", + TO_ORIGIN_CIRCUIT(victim)->global_identifier, + victim->purpose); + tor_fragile_assert(); + continue; + } + + /* circuits are allowed to last longer for measurement. + * Switch their purpose and wait. */ + if (victim->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { + victim->purpose = CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT; + circuit_build_times_count_timeout(&circ_times, + first_hop_succeeded); + continue; + } + + /* + * If the circuit build time is much greater than we would have cut + * it off at, we probably had a suspend event along this codepath, + * and we should discard the value. + */ + if (now - victim->timestamp_created > 2*circ_times.close_ms/1000+1) { + log_notice(LD_CIRC, + "Extremely large value for circuit build timeout: %lds. " + "Assuming clock jump.", + (long)(now - victim->timestamp_created)); + } else if (circuit_build_times_count_close(&circ_times, + first_hop_succeeded, + victim->timestamp_created)) { + circuit_build_times_set_timeout(&circ_times); + } } if (victim->n_conn) log_info(LD_CIRC,"Abandoning circ %s:%d:%d (state %d:%s, purpose %d)", - victim->n_conn->_base.address, victim->n_port, + victim->n_conn->_base.address, victim->n_conn->_base.port, victim->n_circ_id, victim->state, circuit_state_to_string(victim->state), victim->purpose); @@ -356,7 +473,7 @@ if (exitrouter && (!need_uptime || build_state->need_uptime)) { int ok; if (conn) { - ok = connection_ap_can_use_exit(conn, exitrouter); + ok = connection_ap_can_use_exit(conn, exitrouter, 0); } else { addr_policy_result_t r = compare_addr_to_addr_policy( 0, port, exitrouter->exit_policy); @@ -373,11 +490,11 @@ } /** Don't keep more than this many unused open circuits around. */ -#define MAX_UNUSED_OPEN_CIRCUITS 12 +#define MAX_UNUSED_OPEN_CIRCUITS 14 /** Figure out how many circuits we have open that are clean. Make * sure it's enough for all the upcoming behaviors we predict we'll have. - * But if we have too many, close the not-so-useful ones. + * But put an upper bound on the total number of circuits. */ static void circuit_predict_and_launch_new(void) @@ -454,11 +571,24 @@ flags |= CIRCLAUNCH_IS_INTERNAL; log_info(LD_CIRC, "Have %d clean circs (%d uptime-internal, %d internal), need" - " another hidserv circ.", + " another hidden service circ.", num, num_uptime_internal, num_internal); circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags); return; } + + /* Finally, check to see if we still need more circuits to learn + * a good build timeout. But if we're close to our max number we + * want, don't do another -- we want to leave a few slots open so + * we can still build circuits preemptively as needed. */ + if (num < MAX_UNUSED_OPEN_CIRCUITS-2 && + circuit_build_times_needs_circuits_now(&circ_times)) { + flags = CIRCLAUNCH_NEED_CAPACITY; + log_info(LD_CIRC, + "Have %d clean circs need another buildtime test circ.", num); + circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags); + return; + } } /** Build a new test circuit every 5 minutes */ @@ -486,7 +616,7 @@ time_to_new_circuit = now + options->NewCircuitPeriod; if (proxy_mode(get_options())) addressmap_clean(now); - circuit_expire_old_circuits(now); + circuit_expire_old_circuits_clientside(now); #if 0 /* disable for now, until predict-and-launch-new can cull leftovers */ circ = circuit_get_youngest_clean_open(CIRCUIT_PURPOSE_C_GENERAL); @@ -566,17 +696,30 @@ tor_fragile_assert(); } +/** If we haven't yet decided on a good timeout value for circuit + * building, we close idles circuits aggressively so we can get more + * data points. */ +#define IDLE_TIMEOUT_WHILE_LEARNING (10*60) + /** Find each circuit that has been unused for too long, or dirty * for too long and has no streams on it: mark it for close. */ static void -circuit_expire_old_circuits(time_t now) +circuit_expire_old_circuits_clientside(time_t now) { circuit_t *circ; - time_t cutoff = now - get_options()->CircuitIdleTimeout; + time_t cutoff; + + if (circuit_build_times_needs_circuits(&circ_times)) { + /* Circuits should be shorter lived if we need more of them + * for learning a good build timeout */ + cutoff = now - IDLE_TIMEOUT_WHILE_LEARNING; + } else { + cutoff = now - get_options()->CircuitIdleTimeout; + } for (circ = global_circuitlist; circ; circ = circ->next) { - if (circ->marked_for_close || ! CIRCUIT_IS_ORIGIN(circ)) + if (circ->marked_for_close || !CIRCUIT_IS_ORIGIN(circ)) continue; /* If the circuit has been dirty for too long, and there are no streams * on it, mark it for close. @@ -584,23 +727,95 @@ if (circ->timestamp_dirty && circ->timestamp_dirty + get_options()->MaxCircuitDirtiness < now && !TO_ORIGIN_CIRCUIT(circ)->p_streams /* nothing attached */ ) { - log_debug(LD_CIRC, "Closing n_circ_id %d (dirty %d secs ago, purp %d)", + log_debug(LD_CIRC, "Closing n_circ_id %d (dirty %d secs ago, " + "purpose %d)", circ->n_circ_id, (int)(now - circ->timestamp_dirty), circ->purpose); circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); - } else if (!circ->timestamp_dirty && - circ->state == CIRCUIT_STATE_OPEN && - circ->purpose == CIRCUIT_PURPOSE_C_GENERAL) { + } else if (!circ->timestamp_dirty && circ->state == CIRCUIT_STATE_OPEN) { if (circ->timestamp_created < cutoff) { - log_debug(LD_CIRC, - "Closing circuit that has been unused for %d seconds.", - (int)(now - circ->timestamp_created)); - circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); + if (circ->purpose == CIRCUIT_PURPOSE_C_GENERAL || + circ->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT || + circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || + circ->purpose == CIRCUIT_PURPOSE_TESTING || + (circ->purpose >= CIRCUIT_PURPOSE_C_INTRODUCING && + circ->purpose <= CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) || + circ->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) { + log_debug(LD_CIRC, + "Closing circuit that has been unused for %ld seconds.", + (long)(now - circ->timestamp_created)); + circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); + } else if (!TO_ORIGIN_CIRCUIT(circ)->is_ancient) { + /* Server-side rend joined circuits can end up really old, because + * they are reused by clients for longer than normal. The client + * controls their lifespan. (They never become dirty, because + * connection_exit_begin_conn() never marks anything as dirty.) + * Similarly, server-side intro circuits last a long time. */ + if (circ->purpose != CIRCUIT_PURPOSE_S_REND_JOINED && + circ->purpose != CIRCUIT_PURPOSE_S_INTRO) { + log_notice(LD_CIRC, + "Ancient non-dirty circuit %d is still around after " + "%ld seconds. Purpose: %d", + TO_ORIGIN_CIRCUIT(circ)->global_identifier, + (long)(now - circ->timestamp_created), + circ->purpose); + /* FFFF implement a new circuit_purpose_to_string() so we don't + * just print out a number for circ->purpose */ + TO_ORIGIN_CIRCUIT(circ)->is_ancient = 1; + } + } } } } } +/** How long do we wait before killing circuits with the properties + * described below? + * + * Probably we could choose a number here as low as 5 to 10 seconds, + * since these circs are used for begindir, and a) generally you either + * ask another begindir question right after or you don't for a long time, + * b) clients at least through 0.2.1.x choose from the whole set of + * directory mirrors at each choice, and c) re-establishing a one-hop + * circuit via create-fast is a light operation assuming the TLS conn is + * still there. + * + * I expect "b" to go away one day when we move to using directory + * guards, but I think "a" and "c" are good enough reasons that a low + * number is safe even then. + */ +#define IDLE_ONE_HOP_CIRC_TIMEOUT 60 + +/** Find each non-origin circuit that has been unused for too long, + * has no streams on it, used a create_fast, and ends here: mark it + * for close. + */ +void +circuit_expire_old_circuits_serverside(time_t now) +{ + circuit_t *circ; + or_circuit_t *or_circ; + time_t cutoff = now - IDLE_ONE_HOP_CIRC_TIMEOUT; + + for (circ = global_circuitlist; circ; circ = circ->next) { + if (circ->marked_for_close || CIRCUIT_IS_ORIGIN(circ)) + continue; + or_circ = TO_OR_CIRCUIT(circ); + /* If the circuit has been idle for too long, and there are no streams + * on it, and it ends here, and it used a create_fast, mark it for close. + */ + if (or_circ->is_first_hop && !circ->n_conn && + !or_circ->n_streams && !or_circ->resolving_streams && + or_circ->p_conn && + or_circ->p_conn->timestamp_last_added_nonpadding <= cutoff) { + log_info(LD_CIRC, "Closing circ_id %d (empty %d secs ago)", + or_circ->p_circ_id, + (int)(now - or_circ->p_conn->timestamp_last_added_nonpadding)); + circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); + } + } +} + /** Number of testing circuits we want open before testing our bandwidth. */ #define NUM_PARALLEL_TESTING_CIRCS 4 @@ -647,7 +862,12 @@ static void circuit_testing_opened(origin_circuit_t *circ) { - if (have_performed_bandwidth_test) { + if (have_performed_bandwidth_test || + !check_whether_orport_reachable()) { + /* either we've already done everything we want with testing circuits, + * or this testing circuit became open due to a fluke, e.g. we picked + * a last hop where we already had the connection open due to an + * outgoing local circuit. */ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_AT_ORIGIN); } else if (circuit_enough_testing_circs()) { router_perform_bandwidth_test(NUM_PARALLEL_TESTING_CIRCS, time(NULL)); @@ -660,17 +880,12 @@ static void circuit_testing_failed(origin_circuit_t *circ, int at_last_hop) { - routerinfo_t *me = router_get_my_routerinfo(); if (server_mode(get_options()) && check_whether_orport_reachable()) return; - if (!me) - return; log_info(LD_GENERAL, "Our testing circuit (to see if your ORPort is reachable) " "has failed. I'll try again later."); - control_event_server_status(LOG_WARN, "REACHABILITY_FAILED ORADDRESS=%s:%d", - me->address, me->or_port); /* These aren't used yet. */ (void)circ; @@ -737,27 +952,26 @@ if (circ->cpath && circ->cpath->state != CPATH_STATE_OPEN) { /* We failed at the first hop. If there's an OR connection - to blame, blame it. */ - or_connection_t *n_conn = NULL; + * to blame, blame it. Also, avoid this relay for a while, and + * fail any one-hop directory fetches destined for it. */ + const char *n_conn_id = circ->cpath->extend_info->identity_digest; if (circ->_base.n_conn) { - n_conn = circ->_base.n_conn; - } else if (circ->_base.state == CIRCUIT_STATE_OR_WAIT) { - /* we have to hunt for it */ - n_conn = connection_or_get_by_identity_digest( - circ->_base.n_conn_id_digest); - } - if (n_conn) { + or_connection_t *n_conn = circ->_base.n_conn; log_info(LD_OR, "Our circuit failed to get a response from the first hop " "(%s:%d). I'm going to try to rotate to a better connection.", n_conn->_base.address, n_conn->_base.port); - n_conn->_base.or_is_obsolete = 1; - entry_guard_register_connect_status(n_conn->identity_digest, 0, - time(NULL)); - } - /* if there are any one-hop streams waiting on this circuit, fail - * them now so they can retry elsewhere. */ - connection_ap_fail_onehop(circ->_base.n_conn_id_digest, circ->build_state); + n_conn->is_bad_for_new_circs = 1; + } else { + log_info(LD_OR, + "Our circuit died before the first hop with no connection"); + } + if (n_conn_id) { + entry_guard_register_connect_status(n_conn_id, 0, 1, time(NULL)); + /* if there are any one-hop streams waiting on this circuit, fail + * them now so they can retry elsewhere. */ + connection_ap_fail_onehop(n_conn_id, circ->build_state); + } } switch (circ->_base.purpose) { @@ -834,8 +1048,8 @@ if (exit) info = extend_info_from_router(exit); circ = circuit_launch_by_extend_info(purpose, info, flags); - if (info) - extend_info_free(info); + + extend_info_free(info); return circ; } @@ -863,7 +1077,7 @@ if ((extend_info || purpose != CIRCUIT_PURPOSE_C_GENERAL) && purpose != CIRCUIT_PURPOSE_TESTING && !onehop_tunnel) { /* see if there are appropriate circs available to cannibalize. */ - /* XXX020 if we're planning to add a hop, perhaps we want to look for + /* XXX if we're planning to add a hop, perhaps we want to look for * internal circs rather than exit circs? -RD */ circ = circuit_find_to_cannibalize(purpose, extend_info, flags); if (circ) { @@ -910,25 +1124,6 @@ return circuit_establish_circuit(purpose, extend_info, flags); } -/** Launch a new circuit; see circuit_launch_by_extend_info() for - * details on arguments. */ -origin_circuit_t * -circuit_launch_by_nickname(uint8_t purpose, - const char *exit_nickname, int flags) -{ - routerinfo_t *router = NULL; - - if (exit_nickname) { - router = router_get_by_nickname(exit_nickname, 1); - if (!router) { - log_warn(LD_GENERAL, "Trying to launch circ by nickname, but " - "no such OR as '%s'", exit_nickname); - return NULL; - } - } - return circuit_launch_by_router(purpose, router, flags); -} - /** Record another failure at opening a general circuit. When we have * too many, we'll stop trying for the remainder of this minute. */ @@ -994,15 +1189,18 @@ if (!want_onehop && !router_have_minimum_dir_info()) { if (!connection_get_by_type(CONN_TYPE_DIR)) { + int severity = LOG_NOTICE; + /* FFFF if this is a tunneled directory fetch, don't yell + * as loudly. the user doesn't even know it's happening. */ if (options->UseBridges && bridges_known_but_down()) { - log_notice(LD_APP|LD_DIR, - "Application request when we're believed to be " - "offline. Optimistically trying known bridges again."); + log_fn(severity, LD_APP|LD_DIR, + "Application request when we haven't used client functionality " + "lately. Optimistically trying known bridges again."); bridges_retry_all(); } else if (!options->UseBridges || any_bridge_descriptors_known()) { - log_notice(LD_APP|LD_DIR, - "Application request when we're believed to be " - "offline. Optimistically trying directory fetches again."); + log_fn(severity, LD_APP|LD_DIR, + "Application request when we haven't used client functionality " + "lately. Optimistically trying directory fetches again."); routerlist_retry_directory_downloads(time(NULL)); } } @@ -1024,23 +1222,21 @@ conn->socks_request->port, need_uptime)) { log_notice(LD_APP, - "No Tor server exists that allows exit to %s:%d. " - "Rejecting.", - safe_str(conn->socks_request->address), + "No Tor server allows exit to %s:%d. Rejecting.", + safe_str_client(conn->socks_request->address), conn->socks_request->port); return -1; } } else { - /* XXXX021 Duplicates checks in connection_ap_handshake_attach_circuit - * XXXX021 Fix this, then backport it? */ + /* XXXX022 Duplicates checks in connection_ap_handshake_attach_circuit */ routerinfo_t *router = router_get_by_nickname(conn->chosen_exit_name, 1); - int opt = conn->_base.chosen_exit_optional; - if (router && !connection_ap_can_use_exit(conn, router)) { + int opt = conn->chosen_exit_optional; + if (router && !connection_ap_can_use_exit(conn, router, 0)) { log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, "Requested exit point '%s' would refuse request. %s.", conn->chosen_exit_name, opt ? "Trying others" : "Closing"); if (opt) { - conn->_base.chosen_exit_optional = 0; + conn->chosen_exit_optional = 0; tor_free(conn->chosen_exit_name); /* Try again. */ return circuit_get_open_circ_or_launch(conn, @@ -1063,18 +1259,19 @@ if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) { /* need to pick an intro point */ - extend_info = rend_client_get_random_intro(conn->rend_query); + tor_assert(conn->rend_data); + extend_info = rend_client_get_random_intro(conn->rend_data); if (!extend_info) { log_info(LD_REND, - "No intro points for '%s': refetching service descriptor.", - safe_str(conn->rend_query)); - rend_client_refetch_renddesc(conn->rend_query); - rend_client_refetch_v2_renddesc(conn->rend_query); + "No intro points for '%s': re-fetching service descriptor.", + safe_str_client(conn->rend_data->onion_address)); + rend_client_refetch_v2_renddesc(conn->rend_data); conn->_base.state = AP_CONN_STATE_RENDDESC_WAIT; return 0; } log_info(LD_REND,"Chose '%s' as intro point for '%s'.", - extend_info->nickname, safe_str(conn->rend_query)); + extend_info->nickname, + safe_str_client(conn->rend_data->onion_address)); } /* If we have specified a particular exit node for our @@ -1083,7 +1280,7 @@ if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_GENERAL) { if (conn->chosen_exit_name) { routerinfo_t *r; - int opt = conn->_base.chosen_exit_optional; + int opt = conn->chosen_exit_optional; r = router_get_by_nickname(conn->chosen_exit_name, 1); if (r) { extend_info = extend_info_from_router(r); @@ -1095,18 +1292,19 @@ * we don't have a routerinfo about. Make up an extend_info. */ char digest[DIGEST_LEN]; char *hexdigest = conn->chosen_exit_name+1; - struct in_addr in; + tor_addr_t addr; if (strlen(hexdigest) < HEX_DIGEST_LEN || base16_decode(digest,DIGEST_LEN,hexdigest,HEX_DIGEST_LEN)<0) { log_info(LD_DIR, "Broken exit digest on tunnel conn. Closing."); return -1; } - if (!tor_inet_aton(conn->socks_request->address, &in)) { - log_info(LD_DIR, "Broken address on tunnel conn. Closing."); + if (tor_addr_from_str(&addr, conn->socks_request->address) < 0) { + log_info(LD_DIR, "Broken address %s on tunnel conn. Closing.", + escaped_safe_str_client(conn->socks_request->address)); return -1; } extend_info = extend_info_alloc(conn->chosen_exit_name+1, - digest, NULL, ntohl(in.s_addr), + digest, NULL, &addr, conn->socks_request->port); } else { /* We will need an onion key for the router, and we @@ -1115,9 +1313,12 @@ "Requested exit point '%s' is not known. %s.", conn->chosen_exit_name, opt ? "Trying others" : "Closing"); if (opt) { - conn->_base.chosen_exit_optional = 0; + conn->chosen_exit_optional = 0; tor_free(conn->chosen_exit_name); - return 0; + /* Try again with no requested exit */ + return circuit_get_open_circ_or_launch(conn, + desired_circuit_purpose, + circp); } return -1; } @@ -1141,15 +1342,14 @@ flags); } - if (extend_info) - extend_info_free(extend_info); + extend_info_free(extend_info); if (desired_circuit_purpose != CIRCUIT_PURPOSE_C_GENERAL) { /* help predict this next time */ rep_hist_note_used_internal(time(NULL), need_uptime, 1); if (circ) { /* write the service_id into circ */ - strlcpy(circ->rend_query, conn->rend_query, sizeof(circ->rend_query)); + circ->rend_data = rend_data_dup(conn->rend_data); if (circ->_base.purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND && circ->_base.state == CIRCUIT_STATE_OPEN) rend_client_rendcirc_has_opened(circ); @@ -1222,7 +1422,8 @@ /* Search the addressmap for this conn's destination. */ /* If he's not in the address map.. */ if (!options->TrackHostExits || - addressmap_have_mapping(conn->socks_request->address)) + addressmap_have_mapping(conn->socks_request->address, + options->TrackHostExitsExpire)) return; /* nothing to track, or already mapped */ SMARTLIST_FOREACH(options->TrackHostExits, const char *, cp, { @@ -1297,11 +1498,13 @@ /** Try to find a safe live circuit for CONN_TYPE_AP connection conn. If * we don't find one: if conn cannot be handled by any known nodes, - * warn and return -1 (conn needs to die); + * warn and return -1 (conn needs to die, and is maybe already marked); * else launch new circuit (if necessary) and return 0. * Otherwise, associate conn with a safe live circuit, do the * right next step, and return 1. */ +/* XXXX this function should mark for close whenever it returns -1; + * its callers shouldn't have to worry about that. */ int connection_ap_handshake_attach_circuit(edge_connection_t *conn) { @@ -1317,11 +1520,11 @@ conn_age = (int)(time(NULL) - conn->_base.timestamp_created); if (conn_age >= get_options()->SocksTimeout) { - int severity = (!conn->_base.addr && !conn->_base.port) ? - LOG_INFO : LOG_NOTICE; + int severity = (tor_addr_is_null(&conn->_base.addr) && !conn->_base.port) ? + LOG_INFO : LOG_NOTICE; log_fn(severity, LD_APP, "Tried for %d seconds to get a connection to %s:%d. Giving up.", - conn_age, safe_str(conn->socks_request->address), + conn_age, safe_str_client(conn->socks_request->address), conn->socks_request->port); return -1; } @@ -1331,24 +1534,29 @@ if (conn->chosen_exit_name) { routerinfo_t *router = router_get_by_nickname(conn->chosen_exit_name, 1); - int opt = conn->_base.chosen_exit_optional; + int opt = conn->chosen_exit_optional; if (!router && !want_onehop) { + /* We ran into this warning when trying to extend a circuit to a + * hidden service directory for which we didn't have a router + * descriptor. See flyspray task 767 for more details. We should + * keep this in mind when deciding to use BEGIN_DIR cells for other + * directory requests as well. -KL*/ log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, "Requested exit point '%s' is not known. %s.", conn->chosen_exit_name, opt ? "Trying others" : "Closing"); if (opt) { - conn->_base.chosen_exit_optional = 0; + conn->chosen_exit_optional = 0; tor_free(conn->chosen_exit_name); return 0; } return -1; } - if (router && !connection_ap_can_use_exit(conn, router)) { + if (router && !connection_ap_can_use_exit(conn, router, 0)) { log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, "Requested exit point '%s' would refuse request. %s.", conn->chosen_exit_name, opt ? "Trying others" : "Closing"); if (opt) { - conn->_base.chosen_exit_optional = 0; + conn->chosen_exit_optional = 0; tor_free(conn->chosen_exit_name); return 0; } @@ -1359,7 +1567,7 @@ /* find the circuit that we should use, if there is one. */ retval = circuit_get_open_circ_or_launch( conn, CIRCUIT_PURPOSE_C_GENERAL, &circ); - if (retval < 1) + if (retval < 1) // XXX021 if we totally fail, this still returns 0 -RD return retval; log_debug(LD_APP|LD_CIRC, @@ -1392,7 +1600,7 @@ rendcirc->_base.n_circ_id, conn_age); /* Mark rendezvous circuits as 'newly dirty' every time you use * them, since the process of rebuilding a rendezvous circ is so - * expensive. There is a tradeoffs between linkability and + * expensive. There is a tradeoff between linkability and * feasibility, at this point. */ rendcirc->_base.timestamp_dirty = time(NULL); @@ -1418,12 +1626,27 @@ if (retval > 0) { /* one has already sent the intro. keep waiting. */ + circuit_t *c = NULL; tor_assert(introcirc); log_info(LD_REND, "Intro circ %d present and awaiting ack (rend %d). " "Stalling. (stream %d sec old)", introcirc->_base.n_circ_id, rendcirc ? rendcirc->_base.n_circ_id : 0, conn_age); + /* abort parallel intro circs, if any */ + for (c = global_circuitlist; c; c = c->next) { + if (c->purpose == CIRCUIT_PURPOSE_C_INTRODUCING && + !c->marked_for_close && CIRCUIT_IS_ORIGIN(c)) { + origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(c); + if (oc->rend_data && + !rend_cmp_service_ids(conn->rend_data->onion_address, + oc->rend_data->onion_address)) { + log_info(LD_REND|LD_CIRC, "Closing introduction circuit that we " + "built in parallel."); + circuit_mark_for_close(c, END_CIRC_REASON_TIMEOUT); + } + } + } return 0; } diff -Nru tor-0.2.0.34/src/or/circuituse.h tor-0.2.2.16-alpha/src/or/circuituse.h --- tor-0.2.0.34/src/or/circuituse.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/circuituse.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,53 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file circuituse.h + * \brief Header file for circuituse.c. + **/ + +#ifndef _TOR_CIRCUITUSE_H +#define _TOR_CIRCUITUSE_H + +void circuit_expire_building(time_t now); +void circuit_remove_handled_ports(smartlist_t *needed_ports); +int circuit_stream_is_being_handled(edge_connection_t *conn, uint16_t port, + int min); +int circuit_conforms_to_options(const origin_circuit_t *circ, + const or_options_t *options); +void circuit_build_needed_circs(time_t now); +void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn); + +void circuit_expire_old_circuits_serverside(time_t now); + +void reset_bandwidth_test(void); +int circuit_enough_testing_circs(void); + +void circuit_has_opened(origin_circuit_t *circ); +void circuit_build_failed(origin_circuit_t *circ); + +/** Flag to set when a circuit should have only a single hop. */ +#define CIRCLAUNCH_ONEHOP_TUNNEL (1<<0) +/** Flag to set when a circuit needs to be built of high-uptime nodes */ +#define CIRCLAUNCH_NEED_UPTIME (1<<1) +/** Flag to set when a circuit needs to be built of high-capacity nodes */ +#define CIRCLAUNCH_NEED_CAPACITY (1<<2) +/** Flag to set when the last hop of a circuit doesn't need to be an + * exit node. */ +#define CIRCLAUNCH_IS_INTERNAL (1<<3) +origin_circuit_t *circuit_launch_by_extend_info(uint8_t purpose, + extend_info_t *info, + int flags); +origin_circuit_t *circuit_launch_by_router(uint8_t purpose, + routerinfo_t *exit, int flags); +void circuit_reset_failure_count(int timeout); +int connection_ap_handshake_attach_chosen_circuit(edge_connection_t *conn, + origin_circuit_t *circ, + crypt_path_t *cpath); +int connection_ap_handshake_attach_circuit(edge_connection_t *conn); + +#endif + diff -Nru tor-0.2.0.34/src/or/command.c tor-0.2.2.16-alpha/src/or/command.c --- tor-0.2.0.34/src/or/command.c 2008-08-20 05:22:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/command.c 2010-09-12 02:54:22.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: command.c 16463 2008-08-07 20:19:38Z nickm $ */ -const char command_c_id[] = - "$Id: command.c 16463 2008-08-07 20:19:38Z nickm $"; /** * \file command.c @@ -19,17 +16,34 @@ */ #include "or.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "command.h" +#include "connection.h" +#include "connection_or.h" +#include "config.h" +#include "control.h" +#include "cpuworker.h" +#include "hibernate.h" +#include "onion.h" +#include "relay.h" +#include "router.h" +#include "routerlist.h" -/** Keep statistics about how many of each type of cell we've received. */ +/** How many CELL_PADDING cells have we received, ever? */ uint64_t stats_n_padding_cells_processed = 0; +/** How many CELL_CREATE cells have we received, ever? */ uint64_t stats_n_create_cells_processed = 0; +/** How many CELL_CREATED cells have we received, ever? */ uint64_t stats_n_created_cells_processed = 0; +/** How many CELL_RELAY cells have we received, ever? */ uint64_t stats_n_relay_cells_processed = 0; +/** How many CELL_DESTROY cells have we received, ever? */ uint64_t stats_n_destroy_cells_processed = 0; +/** How many CELL_VERSIONS cells have we received, ever? */ uint64_t stats_n_versions_cells_processed = 0; +/** How many CELL_NETINFO cells have we received, ever? */ uint64_t stats_n_netinfo_cells_processed = 0; -uint64_t stats_n_cert_cells_processed = 0; -uint64_t stats_n_link_auth_cells_processed = 0; /* These are the main functions for processing cells */ static void command_process_create_cell(cell_t *cell, or_connection_t *conn); @@ -274,7 +288,14 @@ /* hand it off to the cpuworkers, and then return. */ if (assign_onionskin_to_cpuworker(NULL, circ, onionskin) < 0) { - log_warn(LD_GENERAL,"Failed to hand off onionskin. Closing."); +#define WARN_HANDOFF_FAILURE_INTERVAL (6*60*60) + static ratelim_t handoff_warning = + RATELIM_INIT(WARN_HANDOFF_FAILURE_INTERVAL); + char *m; + if ((m = rate_limit_log(&handoff_warning, approx_time()))) { + log_warn(LD_GENERAL,"Failed to hand off onionskin. Closing.%s",m); + tor_free(m); + } circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); return; } @@ -353,8 +374,8 @@ } } -/** Process a 'relay' cell that just arrived from conn. Make sure - * it came in with a recognized circ_id. Pass it on to +/** Process a 'relay' or 'relay_early' cell that just arrived from + * conn. Make sure it came in with a recognized circ_id. Pass it on to * circuit_receive_relay_cell() for actual processing. */ static void @@ -390,6 +411,29 @@ else direction = CELL_DIRECTION_IN; + /* If we have a relay_early cell, make sure that it's outbound, and we've + * gotten no more than MAX_RELAY_EARLY_CELLS_PER_CIRCUIT of them. */ + if (cell->command == CELL_RELAY_EARLY) { + if (direction == CELL_DIRECTION_IN) { + /* Allow an unlimited number of inbound relay_early cells, + * for hidden service compatibility. There isn't any way to make + * a long circuit through inbound relay_early cells anyway. See + * bug 1038. -RD */ + } else { + or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); + if (or_circ->remaining_relay_early_cells == 0) { + log_fn(LOG_PROTOCOL_WARN, LD_OR, + "Received too many RELAY_EARLY cells on circ %d from %s:%d." + " Closing circuit.", + cell->circ_id, safe_str(conn->_base.address), + conn->_base.port); + circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); + return; + } + --or_circ->remaining_relay_early_cells; + } + } + if ((reason = circuit_receive_relay_cell(cell, circ, direction)) < 0) { log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL,"circuit_receive_relay_cell " "(%s) failed. Closing.", @@ -489,8 +533,10 @@ conn->link_proto = highest_supported_version; conn->handshake_state->received_versions = 1; - log_info(LD_OR, "Negotiated version %d with %s; sending NETINFO.", - highest_supported_version, safe_str(conn->_base.address)); + log_info(LD_OR, "Negotiated version %d with %s:%d; sending NETINFO.", + highest_supported_version, + safe_str_client(conn->_base.address), + conn->_base.port); tor_assert(conn->link_proto >= 2); if (connection_or_send_netinfo(conn) < 0) { @@ -523,7 +569,7 @@ } if (conn->_base.state != OR_CONN_STATE_OR_HANDSHAKING) { log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Received a NETINFO cell on a non-handshaking; dropping."); + "Received a NETINFO cell on non-handshaking connection; dropping."); return; } tor_assert(conn->handshake_state && @@ -552,22 +598,19 @@ while (n_other_addrs && cp < end-2) { /* Consider all the other addresses; if any matches, this connection is * "canonical." */ - uint8_t other_addr_type = (uint8_t) *cp++; - uint8_t other_addr_len = (uint8_t) *cp++; - if (cp + other_addr_len >= end) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Address too long in netinfo cell; closing connection."); + tor_addr_t addr; + const char *next = decode_address_from_payload(&addr, cp, (int)(end-cp)); + if (next == NULL) { + log_fn(LOG_PROTOCOL_WARN, LD_OR, + "Bad address in netinfo cell; closing connection."); connection_mark_for_close(TO_CONN(conn)); return; } - if (other_addr_type == RESOLVED_TYPE_IPV4 && other_addr_len == 4) { - uint32_t addr = ntohl(get_uint32(cp)); - if (addr == conn->real_addr) { - conn->is_canonical = 1; - break; - } + if (tor_addr_eq(&addr, &conn->real_addr)) { + conn->is_canonical = 1; + break; } - cp += other_addr_len; + cp = next; --n_other_addrs; } @@ -578,6 +621,7 @@ router_get_by_digest(conn->identity_digest)) { char dbuf[64]; int severity; + /*XXXX be smarter about when everybody says we are skewed. */ if (router_digest_is_trusted_dir(conn->identity_digest)) severity = LOG_WARN; else @@ -590,20 +634,23 @@ conn->_base.address, (int)conn->_base.port, apparent_skew>0 ? "ahead" : "behind", dbuf, apparent_skew>0 ? "behind" : "ahead"); - control_event_general_status(LOG_WARN, - "CLOCK_SKEW SKEW=%ld SOURCE=OR:%s:%d", - apparent_skew, conn->_base.address, conn->_base.port); + if (severity == LOG_WARN) /* only tell the controller if an authority */ + control_event_general_status(LOG_WARN, + "CLOCK_SKEW SKEW=%ld SOURCE=OR:%s:%d", + apparent_skew, + conn->_base.address, conn->_base.port); } - /* XXX021 maybe act on my_apparent_addr, if the source is sufficiently + /* XXX maybe act on my_apparent_addr, if the source is sufficiently * trustworthy. */ if (connection_or_set_state_open(conn)<0) connection_mark_for_close(TO_CONN(conn)); else - log_info(LD_OR, "Got good NETINFO cell from %s; OR connection is now " + log_info(LD_OR, "Got good NETINFO cell from %s:%d; OR connection is now " "open, using protocol version %d", - safe_str(conn->_base.address), (int)conn->link_proto); + safe_str_client(conn->_base.address), + conn->_base.port, (int)conn->link_proto); assert_connection_ok(TO_CONN(conn),time(NULL)); } diff -Nru tor-0.2.0.34/src/or/command.h tor-0.2.2.16-alpha/src/or/command.h --- tor-0.2.0.34/src/or/command.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/command.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,25 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file command.h + * \brief Header file for command.c. + **/ + +#ifndef _TOR_COMMAND_H +#define _TOR_COMMAND_H + +void command_process_cell(cell_t *cell, or_connection_t *conn); +void command_process_var_cell(var_cell_t *cell, or_connection_t *conn); + +extern uint64_t stats_n_padding_cells_processed; +extern uint64_t stats_n_create_cells_processed; +extern uint64_t stats_n_created_cells_processed; +extern uint64_t stats_n_relay_cells_processed; +extern uint64_t stats_n_destroy_cells_processed; + +#endif + diff -Nru tor-0.2.0.34/src/or/config.c tor-0.2.2.16-alpha/src/or/config.c --- tor-0.2.0.34/src/or/config.c 2009-01-05 02:06:16.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/config.c 2010-09-12 02:54:22.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: config.c 17718 2008-12-22 01:11:46Z kloesing $ */ -const char config_c_id[] = \ - "$Id: config.c 17718 2008-12-22 01:11:46Z kloesing $"; /** * \file config.c @@ -15,6 +12,28 @@ #define CONFIG_PRIVATE #include "or.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "connection_or.h" +#include "control.h" +#include "cpuworker.h" +#include "dirserv.h" +#include "dirvote.h" +#include "dns.h" +#include "geoip.h" +#include "hibernate.h" +#include "main.h" +#include "networkstatus.h" +#include "policies.h" +#include "relay.h" +#include "rendclient.h" +#include "rendservice.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" #ifdef MS_WINDOWS #include #endif @@ -22,12 +41,13 @@ /** Enumeration of types which option values can take */ typedef enum config_type_t { CONFIG_TYPE_STRING = 0, /**< An arbitrary string. */ + CONFIG_TYPE_FILENAME, /**< A filename: some prefixes get expanded. */ CONFIG_TYPE_UINT, /**< A non-negative integer less than MAX_INT */ CONFIG_TYPE_INTERVAL, /**< A number of seconds, with optional units*/ CONFIG_TYPE_MEMUNIT, /**< A number of bytes, with optional units*/ CONFIG_TYPE_DOUBLE, /**< A floating-point value */ CONFIG_TYPE_BOOL, /**< A boolean value, expressed as 0 or 1. */ - CONFIG_TYPE_ISOTIME, /**< An ISO-formated time relative to GMT. */ + CONFIG_TYPE_ISOTIME, /**< An ISO-formatted time relative to GMT. */ CONFIG_TYPE_CSV, /**< A list of strings, separated by commas and * optional whitespace. */ CONFIG_TYPE_LINELIST, /**< Uninterpreted config lines */ @@ -36,6 +56,8 @@ CONFIG_TYPE_LINELIST_V, /**< Catch-all "virtual" option to summarize * context-sensitive config lines when fetching. */ + CONFIG_TYPE_ROUTERSET, /**< A list of router names, addrs, and fps, + * parsed into a routerset_t. */ CONFIG_TYPE_OBSOLETE, /**< Obsolete (ignored) option. */ } config_type_t; @@ -51,7 +73,8 @@ * you can abbreviate toks as tok". */ #define PLURAL(tok) { #tok, #tok "s", 0, 0 } -/* A list of command-line abbreviations. */ +/** A list of abbreviations and aliases to map command-line options, obsolete + * option names, or alternative option names, to their current values. */ static config_abbrev_t _option_abbrevs[] = { PLURAL(ExitNode), PLURAL(EntryNode), @@ -65,6 +88,7 @@ PLURAL(RendExcludeNode), PLURAL(StrictEntryNode), PLURAL(StrictExitNode), + PLURAL(StrictNode), { "l", "Log", 1, 0}, { "AllowUnverifiedNodes", "AllowInvalidNodes", 0, 0}, { "AutomapHostSuffixes", "AutomapHostsSuffixes", 0, 0}, @@ -82,12 +106,16 @@ { "NumEntryNodes", "NumEntryGuards", 0, 0}, { "ResolvConf", "ServerDNSResolvConfFile", 0, 1}, { "SearchDomains", "ServerDNSSearchDomains", 0, 1}, + { "ServerDNSAllowBrokenResolvConf", "ServerDNSAllowBrokenConfig", 0, 0}, { "PreferTunnelledDirConns", "PreferTunneledDirConns", 0, 0}, { "BridgeAuthoritativeDirectory", "BridgeAuthoritativeDir", 0, 0}, { "HashedControlPassword", "__HashedControlSessionPassword", 1, 0}, + { "StrictEntryNodes", "StrictNodes", 0, 1}, + { "StrictExitNodes", "StrictNodes", 0, 1}, { NULL, NULL, 0, 0}, }; -/* A list of state-file abbreviations, for compatibility. */ + +/** A list of state-file "abbreviations," for compatibility. */ static config_abbrev_t _state_abbrevs[] = { { "AccountingBytesReadInterval", "AccountingBytesReadInInterval", 0, 0 }, { "HelperNode", "EntryGuard", 0, 0 }, @@ -131,8 +159,11 @@ V(AccountingMax, MEMUNIT, "0 bytes"), V(AccountingStart, STRING, NULL), V(Address, STRING, NULL), + V(AllowDotExit, BOOL, "0"), V(AllowInvalidNodes, CSV, "middle,rendezvous"), V(AllowNonRFC953Hostnames, BOOL, "0"), + V(AllowSingleHopCircuits, BOOL, "0"), + V(AllowSingleHopExits, BOOL, "0"), V(AlternateBridgeAuthority, LINELIST, NULL), V(AlternateDirAuthority, LINELIST, NULL), V(AlternateHSAuthority, LINELIST, NULL), @@ -157,10 +188,15 @@ V(BridgePassword, STRING, NULL), V(BridgeRecordUsageByCountry, BOOL, "1"), V(BridgeRelay, BOOL, "0"), - V(CircuitBuildTimeout, INTERVAL, "1 minute"), + V(CellStatistics, BOOL, "0"), + V(LearnCircuitBuildTimeout, BOOL, "1"), + V(CircuitBuildTimeout, INTERVAL, "0"), V(CircuitIdleTimeout, INTERVAL, "1 hour"), + V(CircuitStreamTimeout, INTERVAL, "0"), + V(CircuitPriorityHalflife, DOUBLE, "-100.0"), /*negative:'Use default'*/ V(ClientDNSRejectInternalAddresses, BOOL,"1"), V(ClientOnly, BOOL, "0"), + V(ConsensusParams, STRING, NULL), V(ConnLimit, UINT, "1000"), V(ConstrainedSockets, BOOL, "0"), V(ConstrainedSockSize, MEMUNIT, "8192"), @@ -171,55 +207,83 @@ V(CookieAuthentication, BOOL, "0"), V(CookieAuthFileGroupReadable, BOOL, "0"), V(CookieAuthFile, STRING, NULL), - V(DataDirectory, STRING, NULL), + V(DataDirectory, FILENAME, NULL), OBSOLETE("DebugLogFile"), V(DirAllowPrivateAddresses, BOOL, NULL), + V(TestingAuthDirTimeToLearnReachability, INTERVAL, "30 minutes"), V(DirListenAddress, LINELIST, NULL), OBSOLETE("DirFetchPeriod"), V(DirPolicy, LINELIST, NULL), V(DirPort, UINT, "0"), + V(DirPortFrontPage, FILENAME, NULL), OBSOLETE("DirPostPeriod"), + OBSOLETE("DirRecordUsageByCountry"), + OBSOLETE("DirRecordUsageGranularity"), + OBSOLETE("DirRecordUsageRetainIPs"), + OBSOLETE("DirRecordUsageSaveInterval"), + V(DirReqStatistics, BOOL, "0"), VAR("DirServer", LINELIST, DirServers, NULL), + V(DisableAllSwap, BOOL, "0"), V(DNSPort, UINT, "0"), V(DNSListenAddress, LINELIST, NULL), V(DownloadExtraInfo, BOOL, "0"), V(EnforceDistinctSubnets, BOOL, "1"), - V(EntryNodes, STRING, NULL), - V(ExcludeNodes, STRING, NULL), - V(ExitNodes, STRING, NULL), + V(EntryNodes, ROUTERSET, NULL), + V(EntryStatistics, BOOL, "0"), + V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "10 minutes"), + V(ExcludeNodes, ROUTERSET, NULL), + V(ExcludeExitNodes, ROUTERSET, NULL), + V(ExcludeSingleHopRelays, BOOL, "1"), + V(ExitNodes, ROUTERSET, NULL), V(ExitPolicy, LINELIST, NULL), V(ExitPolicyRejectPrivate, BOOL, "1"), - V(FallbackNetworkstatusFile, STRING, + V(ExitPortStatistics, BOOL, "0"), + V(ExtraInfoStatistics, BOOL, "0"), + +#if defined (WINCE) + V(FallbackNetworkstatusFile, FILENAME, "fallback-consensus"), +#else + V(FallbackNetworkstatusFile, FILENAME, SHARE_DATADIR PATH_SEPARATOR "tor" PATH_SEPARATOR "fallback-consensus"), +#endif V(FascistFirewall, BOOL, "0"), V(FirewallPorts, CSV, ""), V(FastFirstHopPK, BOOL, "1"), V(FetchDirInfoEarly, BOOL, "0"), + V(FetchDirInfoExtraEarly, BOOL, "0"), V(FetchServerDescriptors, BOOL, "1"), V(FetchHidServDescriptors, BOOL, "1"), V(FetchUselessDescriptors, BOOL, "0"), #ifdef WIN32 - V(GeoIPFile, STRING, ""), + V(GeoIPFile, FILENAME, ""), #else - V(GeoIPFile, STRING, + V(GeoIPFile, FILENAME, SHARE_DATADIR PATH_SEPARATOR "tor" PATH_SEPARATOR "geoip"), #endif OBSOLETE("Group"), V(HardwareAccel, BOOL, "0"), + V(AccelName, STRING, NULL), + V(AccelDir, FILENAME, NULL), V(HashedControlPassword, LINELIST, NULL), - V(HidServDirectoryV2, BOOL, "0"), + V(HidServDirectoryV2, BOOL, "1"), VAR("HiddenServiceDir", LINELIST_S, RendConfigLines, NULL), - VAR("HiddenServiceExcludeNodes", LINELIST_S, RendConfigLines, NULL), - VAR("HiddenServiceNodes", LINELIST_S, RendConfigLines, NULL), + OBSOLETE("HiddenServiceExcludeNodes"), + OBSOLETE("HiddenServiceNodes"), VAR("HiddenServiceOptions",LINELIST_V, RendConfigLines, NULL), VAR("HiddenServicePort", LINELIST_S, RendConfigLines, NULL), VAR("HiddenServiceVersion",LINELIST_S, RendConfigLines, NULL), + VAR("HiddenServiceAuthorizeClient",LINELIST_S,RendConfigLines, NULL), + V(HidServAuth, LINELIST, NULL), V(HSAuthoritativeDir, BOOL, "0"), - V(HSAuthorityRecordStats, BOOL, "0"), + OBSOLETE("HSAuthorityRecordStats"), V(HttpProxy, STRING, NULL), V(HttpProxyAuthenticator, STRING, NULL), V(HttpsProxy, STRING, NULL), V(HttpsProxyAuthenticator, STRING, NULL), + V(Socks4Proxy, STRING, NULL), + V(Socks5Proxy, STRING, NULL), + V(Socks5ProxyUsername, STRING, NULL), + V(Socks5ProxyPassword, STRING, NULL), OBSOLETE("IgnoreVersion"), V(KeepalivePeriod, INTERVAL, "5 minutes"), VAR("Log", LINELIST, Logs, NULL), @@ -239,6 +303,7 @@ V(NatdListenAddress, LINELIST, NULL), V(NatdPort, UINT, "0"), V(Nickname, STRING, NULL), + V(WarnUnsafeSocks, BOOL, "1"), V(NoPublish, BOOL, "0"), VAR("NodeFamily", LINELIST, NodeFamilies, NULL), V(NumCpus, UINT, "1"), @@ -247,7 +312,10 @@ V(ORPort, UINT, "0"), V(OutboundBindAddress, STRING, NULL), OBSOLETE("PathlenCoinWeight"), + V(PerConnBWBurst, MEMUNIT, "0"), + V(PerConnBWRate, MEMUNIT, "0"), V(PidFile, STRING, NULL), + V(TestingTorNetwork, BOOL, "0"), V(PreferTunneledDirConns, BOOL, "1"), V(ProtocolWarnings, BOOL, "0"), V(PublishServerDescriptor, CSV, "1"), @@ -258,20 +326,21 @@ V(RecommendedVersions, LINELIST, NULL), V(RecommendedClientVersions, LINELIST, NULL), V(RecommendedServerVersions, LINELIST, NULL), - V(RedirectExit, LINELIST, NULL), + OBSOLETE("RedirectExit"), + V(RefuseUnknownExits, BOOL, "0"), V(RejectPlaintextPorts, CSV, ""), V(RelayBandwidthBurst, MEMUNIT, "0"), V(RelayBandwidthRate, MEMUNIT, "0"), - V(RendExcludeNodes, STRING, NULL), - V(RendNodes, STRING, NULL), + OBSOLETE("RendExcludeNodes"), + OBSOLETE("RendNodes"), V(RendPostPeriod, INTERVAL, "1 hour"), V(RephistTrackTime, INTERVAL, "24 hours"), OBSOLETE("RouterFile"), V(RunAsDaemon, BOOL, "0"), V(RunTesting, BOOL, "0"), - V(SafeLogging, BOOL, "1"), + V(SafeLogging, STRING, "1"), V(SafeSocks, BOOL, "0"), - V(ServerDNSAllowBrokenResolvConf, BOOL, "1"), + V(ServerDNSAllowBrokenConfig, BOOL, "1"), V(ServerDNSAllowNonRFC953Hostnames, BOOL,"0"), V(ServerDNSDetectHijacking, BOOL, "1"), V(ServerDNSRandomizeCase, BOOL, "1"), @@ -285,11 +354,10 @@ V(SocksPort, UINT, "9050"), V(SocksTimeout, INTERVAL, "2 minutes"), OBSOLETE("StatusFetchPeriod"), - V(StrictEntryNodes, BOOL, "0"), - V(StrictExitNodes, BOOL, "0"), + V(StrictNodes, BOOL, "0"), OBSOLETE("SysLog"), V(TestSocks, BOOL, "0"), - V(TestVia, STRING, NULL), + OBSOLETE("TestVia"), V(TrackHostExits, CSV, NULL), V(TrackHostExitsExpire, INTERVAL, "30 minutes"), OBSOLETE("TrafficShaping"), @@ -303,20 +371,48 @@ VAR("V1AuthoritativeDirectory",BOOL, V1AuthoritativeDir, "0"), VAR("V2AuthoritativeDirectory",BOOL, V2AuthoritativeDir, "0"), VAR("V3AuthoritativeDirectory",BOOL, V3AuthoritativeDir, "0"), + V(TestingV3AuthInitialVotingInterval, INTERVAL, "30 minutes"), + V(TestingV3AuthInitialVoteDelay, INTERVAL, "5 minutes"), + V(TestingV3AuthInitialDistDelay, INTERVAL, "5 minutes"), V(V3AuthVotingInterval, INTERVAL, "1 hour"), V(V3AuthVoteDelay, INTERVAL, "5 minutes"), V(V3AuthDistDelay, INTERVAL, "5 minutes"), V(V3AuthNIntervalsValid, UINT, "3"), V(V3AuthUseLegacyKey, BOOL, "0"), + V(V3BandwidthsFile, FILENAME, NULL), VAR("VersioningAuthoritativeDirectory",BOOL,VersioningAuthoritativeDir, "0"), V(VirtualAddrNetwork, STRING, "127.192.0.0/10"), V(WarnPlaintextPorts, CSV, "23,109,110,143"), + VAR("__ReloadTorrcOnSIGHUP", BOOL, ReloadTorrcOnSIGHUP, "1"), VAR("__AllDirActionsPrivate", BOOL, AllDirActionsPrivate, "0"), VAR("__DisablePredictedCircuits",BOOL,DisablePredictedCircuits, "0"), VAR("__LeaveStreamsUnattached",BOOL, LeaveStreamsUnattached, "0"), VAR("__HashedControlSessionPassword", LINELIST, HashedControlSessionPassword, NULL), V(MinUptimeHidServDirectoryV2, INTERVAL, "24 hours"), + + { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } +}; + +/** Override default values with these if the user sets the TestingTorNetwork + * option. */ +static config_var_t testing_tor_network_defaults[] = { + V(ServerDNSAllowBrokenConfig, BOOL, "1"), + V(DirAllowPrivateAddresses, BOOL, "1"), + V(EnforceDistinctSubnets, BOOL, "0"), + V(AssumeReachable, BOOL, "1"), + V(AuthDirMaxServersPerAddr, UINT, "0"), + V(AuthDirMaxServersPerAuthAddr,UINT, "0"), + V(ClientDNSRejectInternalAddresses, BOOL,"0"), + V(ExitPolicyRejectPrivate, BOOL, "0"), + V(V3AuthVotingInterval, INTERVAL, "5 minutes"), + V(V3AuthVoteDelay, INTERVAL, "20 seconds"), + V(V3AuthDistDelay, INTERVAL, "20 seconds"), + V(TestingV3AuthInitialVotingInterval, INTERVAL, "5 minutes"), + V(TestingV3AuthInitialVoteDelay, INTERVAL, "20 seconds"), + V(TestingV3AuthInitialDistDelay, INTERVAL, "20 seconds"), + V(TestingAuthDirTimeToLearnReachability, INTERVAL, "0 minutes"), + V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "0 minutes"), { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } }; #undef VAR @@ -324,6 +420,8 @@ #define VAR(name,conftype,member,initvalue) \ { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(or_state_t, member), \ initvalue } + +/** Array of "state" variables saved to the ~/.tor/state file. */ static config_var_t _state_vars[] = { V(AccountingBytesReadInInterval, MEMUNIT, NULL), V(AccountingBytesWrittenInInterval, MEMUNIT, NULL), @@ -343,12 +441,23 @@ V(BWHistoryWriteEnds, ISOTIME, NULL), V(BWHistoryWriteInterval, UINT, "900"), V(BWHistoryWriteValues, CSV, ""), + V(BWHistoryDirReadEnds, ISOTIME, NULL), + V(BWHistoryDirReadInterval, UINT, "900"), + V(BWHistoryDirReadValues, CSV, ""), + V(BWHistoryDirWriteEnds, ISOTIME, NULL), + V(BWHistoryDirWriteInterval, UINT, "900"), + V(BWHistoryDirWriteValues, CSV, ""), V(TorVersion, STRING, NULL), V(LastRotatedOnionKey, ISOTIME, NULL), V(LastWritten, ISOTIME, NULL), + V(TotalBuildTimes, UINT, NULL), + V(CircuitBuildAbandonedCount, UINT, "0"), + VAR("CircuitBuildTimeBin", LINELIST_S, BuildtimeHistogram, NULL), + VAR("BuildtimeHistogram", LINELIST_V, BuildtimeHistogram, NULL), + { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } }; @@ -363,215 +472,6 @@ const char *description; } config_var_description_t; -static config_var_description_t options_description[] = { - /* ==== general options */ - { "AvoidDiskWrites", "If non-zero, try to write to disk less frequently than" - " we would otherwise." }, - { "BandwidthRate", "A token bucket limits the average incoming bandwidth on " - "this node to the specified number of bytes per second." }, - { "BandwidthBurst", "Limit the maximum token buffer size (also known as " - "burst) to the given number of bytes." }, - { "ConnLimit", "Minimum number of simultaneous sockets we must have." }, - { "ConstrainedSockets", "Shrink tx and rx buffers for sockets to avoid " - "system limits on vservers and related environments. See man page for " - "more information regarding this option." }, - { "ConstrainedSockSize", "Limit socket buffers to this size when " - "ConstrainedSockets is enabled." }, - /* ControlListenAddress */ - { "ControlPort", "If set, Tor will accept connections from the same machine " - "(localhost only) on this port, and allow those connections to control " - "the Tor process using the Tor Control Protocol (described in" - "control-spec.txt).", }, - { "CookieAuthentication", "If this option is set to 1, don't allow any " - "connections to the control port except when the connecting process " - "can read a file that Tor creates in its data directory." }, - { "DataDirectory", "Store working data, state, keys, and caches here." }, - { "DirServer", "Tor only trusts directories signed with one of these " - "servers' keys. Used to override the standard list of directory " - "authorities." }, - /* { "FastFirstHopPK", "" }, */ - /* FetchServerDescriptors, FetchHidServDescriptors, - * FetchUselessDescriptors */ - { "HardwareAccel", "If set, Tor tries to use hardware crypto accelerators " - "when it can." }, - /* HashedControlPassword */ - { "HTTPProxy", "Force Tor to make all HTTP directory requests through this " - "host:port (or host:80 if port is not set)." }, - { "HTTPProxyAuthenticator", "A username:password pair to be used with " - "HTTPProxy." }, - { "HTTPSProxy", "Force Tor to make all TLS (SSL) connectinos through this " - "host:port (or host:80 if port is not set)." }, - { "HTTPSProxyAuthenticator", "A username:password pair to be used with " - "HTTPSProxy." }, - { "KeepalivePeriod", "Send a padding cell every N seconds to keep firewalls " - "from closing our connections while Tor is not in use." }, - { "Log", "Where to send logging messages. Format is " - "minSeverity[-maxSeverity] (stderr|stdout|syslog|file FILENAME)." }, - { "OutboundBindAddress", "Make all outbound connections originate from the " - "provided IP address (only useful for multiple network interfaces)." }, - { "PIDFile", "On startup, write our PID to this file. On clean shutdown, " - "remove the file." }, - { "PreferTunneledDirConns", "If non-zero, avoid directory servers that " - "don't support tunneled connections." }, - /* PreferTunneledDirConns */ - /* ProtocolWarnings */ - /* RephistTrackTime */ - { "RunAsDaemon", "If set, Tor forks and daemonizes to the background when " - "started. Unix only." }, - { "SafeLogging", "If set to 0, Tor logs potentially sensitive strings " - "rather than replacing them with the string [scrubbed]." }, - { "TunnelDirConns", "If non-zero, when a directory server we contact " - "supports it, we will build a one-hop circuit and make an encrypted " - "connection via its ORPort." }, - { "User", "On startup, setuid to this user" }, - - /* ==== client options */ - { "AllowInvalidNodes", "Where on our circuits should Tor allow servers " - "that the directory authorities haven't called \"valid\"?" }, - { "AllowNonRFC953Hostnames", "If set to 1, we don't automatically reject " - "hostnames for having invalid characters." }, - /* CircuitBuildTimeout, CircuitIdleTimeout */ - { "ClientOnly", "If set to 1, Tor will under no circumstances run as a " - "server, even if ORPort is enabled." }, - { "EntryNodes", "A list of preferred entry nodes to use for the first hop " - "in circuits, when possible." }, - /* { "EnforceDistinctSubnets" , "" }, */ - { "ExitNodes", "A list of preferred nodes to use for the last hop in " - "circuits, when possible." }, - { "ExcludeNodes", "A list of nodes never to use when building a circuit." }, - { "FascistFirewall", "If set, Tor will only create outgoing connections to " - "servers running on the ports listed in FirewallPorts." }, - { "FirewallPorts", "A list of ports that we can connect to. Only used " - "when FascistFirewall is set." }, - { "LongLivedPorts", "A list of ports for services that tend to require " - "high-uptime connections." }, - { "MapAddress", "Force Tor to treat all requests for one address as if " - "they were for another." }, - { "NewCircuitPeriod", "Force Tor to consider whether to build a new circuit " - "every NUM seconds." }, - { "MaxCircuitDirtiness", "Do not attach new streams to a circuit that has " - "been used more than this many seconds ago." }, - /* NatdPort, NatdListenAddress */ - { "NodeFamily", "A list of servers that constitute a 'family' and should " - "never be used in the same circuit." }, - { "NumEntryGuards", "How many entry guards should we keep at a time?" }, - /* PathlenCoinWeight */ - { "ReachableAddresses", "Addresses we can connect to, as IP/bits:port-port. " - "By default, we assume all addresses are reachable." }, - /* reachablediraddresses, reachableoraddresses. */ - { "RendNodes", "A list of preferred nodes to use for a rendezvous point, " - "when possible." }, - { "RendExcludenodes", "A list of nodes never to use as rendezvous points." }, - /* SafeSOCKS */ - { "SOCKSPort", "The port where we listen for SOCKS connections from " - "applications." }, - { "SOCKSListenAddress", "Bind to this address to listen to connections from " - "SOCKS-speaking applications." }, - { "SOCKSPolicy", "Set an entry policy to limit which addresses can connect " - "to the SOCKSPort." }, - /* SocksTimeout */ - { "StrictExitNodes", "If set, Tor will fail to operate when none of the " - "configured ExitNodes can be used." }, - { "StrictEntryNodes", "If set, Tor will fail to operate when none of the " - "configured EntryNodes can be used." }, - /* TestSocks */ - { "TrackHostsExit", "Hosts and domains which should, if possible, be " - "accessed from the same exit node each time we connect to them." }, - { "TrackHostsExitExpire", "Time after which we forget which exit we were " - "using to connect to hosts in TrackHostsExit." }, - /* "TransPort", "TransListenAddress */ - { "UseEntryGuards", "Set to 0 if we want to pick from the whole set of " - "servers for the first position in each circuit, rather than picking a " - "set of 'Guards' to prevent profiling attacks." }, - - /* === server options */ - { "Address", "The advertised (external) address we should use." }, - /* Accounting* options. */ - /* AssumeReachable */ - { "ContactInfo", "Administrative contact information to advertise for this " - "server." }, - { "ExitPolicy", "Address/port ranges for which to accept or reject outgoing " - "connections on behalf of Tor users." }, - /* { "ExitPolicyRejectPrivate, "" }, */ - { "MaxAdvertisedBandwidth", "If set, we will not advertise more than this " - "amount of bandwidth for our bandwidth rate, regardless of how much " - "bandwidth we actually detect." }, - { "MaxOnionsPending", "Reject new attempts to extend circuits when we " - "already have this many pending." }, - { "MyFamily", "Declare a list of other servers as belonging to the same " - "family as this one, so that clients will not use two from the same " - "family in the same circuit." }, - { "Nickname", "Set the server nickname." }, - { "NoPublish", "{DEPRECATED}" }, - { "NumCPUs", "How many processes to use at once for public-key crypto." }, - { "ORPort", "Advertise this port to listen for connections from Tor clients " - "and servers." }, - { "ORListenAddress", "Bind to this address to listen for connections from " - "clients and servers, instead of the default 0.0.0.0:ORPort." }, - { "PublishServerDescriptor", "Set to 0 to keep the server from " - "uploading info to the directory authorities." }, - /*{ "RedirectExit", "When an outgoing connection tries to connect to a " - *"given address, redirect it to another address instead." }, - */ - /* ServerDNS: DetectHijacking, ResolvConfFile, SearchDomains */ - { "ShutdownWaitLength", "Wait this long for clients to finish when " - "shutting down because of a SIGINT." }, - /* { "TestVia", } */ - - /* === directory cache options */ - { "DirPort", "Serve directory information from this port, and act as a " - "directory cache." }, - { "DirListenAddress", "Bind to this address to listen for connections from " - "clients and servers, instead of the default 0.0.0.0:DirPort." }, - { "DirPolicy", "Set a policy to limit who can connect to the directory " - "port" }, - - /* Authority options: AuthDirBadExit, AuthDirInvalid, AuthDirReject, - * AuthDirRejectUnlisted, AuthDirListBadExits, AuthoritativeDirectory, - * DirAllowPrivateAddresses, HSAuthoritativeDir, - * NamingAuthoritativeDirectory, RecommendedVersions, - * RecommendedClientVersions, RecommendedServerVersions, RendPostPeriod, - * RunTesting, V1AuthoritativeDirectory, VersioningAuthoritativeDirectory, */ - - /* Hidden service options: HiddenService: dir,excludenodes, nodes, - * options, port. PublishHidServDescriptor */ - - /* Nonpersistent options: __LeaveStreamsUnattached, __AllDirActionsPrivate */ - { NULL, NULL }, -}; - -static config_var_description_t state_description[] = { - { "AccountingBytesReadInInterval", - "How many bytes have we read in this accounting period?" }, - { "AccountingBytesWrittenInInterval", - "How many bytes have we written in this accounting period?" }, - { "AccountingExpectedUsage", - "How many bytes did we expect to use per minute? (0 for no estimate.)" }, - { "AccountingIntervalStart", "When did this accounting period begin?" }, - { "AccountingSecondsActive", "How long have we been awake in this period?" }, - - { "BWHistoryReadEnds", "When does the last-recorded read-interval end?" }, - { "BWHistoryReadInterval", "How long is each read-interval (in seconds)?" }, - { "BWHistoryReadValues", "Number of bytes read in each interval." }, - { "BWHistoryWriteEnds", "When does the last-recorded write-interval end?" }, - { "BWHistoryWriteInterval", "How long is each write-interval (in seconds)?"}, - { "BWHistoryWriteValues", "Number of bytes written in each interval." }, - - { "EntryGuard", "One of the nodes we have chosen as a fixed entry" }, - { "EntryGuardDownSince", - "The last entry guard has been unreachable since this time." }, - { "EntryGuardUnlistedSince", - "The last entry guard has been unusable since this time." }, - - { "LastRotatedOnionKey", - "The last time at which we changed the medium-term private key used for " - "building circuits." }, - { "LastWritten", "When was this state file last regenerated?" }, - - { "TorVersion", "Which version of Tor generated this state file?" }, - { NULL, NULL }, -}; - /** Type of a callback to validate whether a given configuration is * well-formed and consistent. See options_trial_assign() for documentation * of arguments. */ @@ -590,8 +490,6 @@ config_var_t *vars; /**< List of variables we recognize, their default * values, and where we stick them in the structure. */ validate_fn_t validate_fn; /**< Function to validate config. */ - /** Documentation for configuration variables. */ - config_var_description_t *descriptions; /** If present, extra is a LINELIST variable for unrecognized * lines. Otherwise, unrecognized lines are an error. */ config_var_t *extra; @@ -637,38 +535,24 @@ static int parse_dir_server_line(const char *line, authority_type_t required_type, int validate_only); -static int parse_redirect_line(smartlist_t *result, - config_line_t *line, char **msg); -static int parse_log_severity_range(const char *range, int *min_out, - int *max_out); static int validate_data_directory(or_options_t *options); static int write_configuration_file(const char *fname, or_options_t *options); static config_line_t *get_assigned_option(config_format_t *fmt, - or_options_t *options, const char *key, - int escape_val); + void *options, const char *key, + int escape_val); static void config_init(config_format_t *fmt, void *options); static int or_state_validate(or_state_t *old_options, or_state_t *options, int from_setconf, char **msg); static int or_state_load(void); static int options_init_logs(or_options_t *options, int validate_only); +static int is_listening_on_low_port(uint16_t port_option, + const config_line_t *listen_options); + static uint64_t config_parse_memunit(const char *s, int *ok); static int config_parse_interval(const char *s, int *ok); -static void print_svn_version(void); static void init_libevent(void); static int opt_streq(const char *s1, const char *s2); -/** Versions of libevent. */ -typedef enum { - /* Note: we compare these, so it's important that "old" precede everything, - * and that "other" come last. */ - LE_OLD=0, LE_10C, LE_10D, LE_10E, LE_11, LE_11A, LE_11B, LE_12, LE_12A, - LE_13, LE_13A, LE_13B, LE_13C, LE_13D, - LE_OTHER -} le_version_t; -static le_version_t decode_libevent_version(void); -#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD) -static void check_libevent_version(const char *m, int server); -#endif /** Magic value for or_options_t. */ #define OR_OPTIONS_MAGIC 9090909 @@ -681,7 +565,6 @@ _option_abbrevs, _option_vars, (validate_fn_t)options_validate, - options_description, NULL }; @@ -702,7 +585,6 @@ _state_abbrevs, _state_vars, (validate_fn_t)or_state_validate, - state_description, &state_extra_var, }; @@ -716,6 +598,17 @@ static char *torrc_fname = NULL; /** Persistent serialized state. */ static or_state_t *global_state = NULL; +/** Configuration Options set by command line. */ +static config_line_t *global_cmdline_options = NULL; +/** Contents of most recently read DirPortFrontPage file. */ +static char *global_dirfrontpagecontents = NULL; + +/** Return the contents of our frontpage string, or NULL if not configured. */ +const char * +get_dirportfrontpage(void) +{ + return global_dirfrontpagecontents; +} /** Allocate an empty configuration object of a given format type. */ static void * @@ -737,7 +630,7 @@ /** Change the current global options to contain new_val instead of * their current value; take action based on the new value; free the old value - * as necessary. + * as necessary. Returns 0 on success, -1 on failure. */ int set_options(or_options_t *new_val, char **msg) @@ -756,25 +649,26 @@ "Acting on config options left us in a broken state. Dying."); exit(1); } - if (old_options) - config_free(&options_format, old_options); + + config_free(&options_format, old_options); return 0; } -extern const char tor_svn_revision[]; /* from tor_main.c */ +extern const char tor_git_revision[]; /* from tor_main.c */ +/** The version of this Tor process, as parsed. */ static char *_version = NULL; -/** Return the current Tor version, possibly */ +/** Return the current Tor version. */ const char * get_version(void) { if (_version == NULL) { - if (strlen(tor_svn_revision)) { - size_t len = strlen(VERSION)+strlen(tor_svn_revision)+8; + if (strlen(tor_git_revision)) { + size_t len = strlen(VERSION)+strlen(tor_git_revision)+16; _version = tor_malloc(len); - tor_snprintf(_version, len, "%s (r%s)", VERSION, tor_svn_revision); + tor_snprintf(_version, len, "%s (git-%s)", VERSION, tor_git_revision); } else { _version = tor_strdup(VERSION); } @@ -782,43 +676,89 @@ return _version; } +/** Release additional memory allocated in options + */ +static void +or_options_free(or_options_t *options) +{ + if (!options) + return; + + routerset_free(options->_ExcludeExitNodesUnion); + config_free(&options_format, options); +} + /** Release all memory and resources held by global configuration structures. */ void config_free_all(void) { - if (global_options) { - config_free(&options_format, global_options); - global_options = NULL; - } - if (global_state) { - config_free(&state_format, global_state); - global_state = NULL; - } + or_options_free(global_options); + global_options = NULL; + + config_free(&state_format, global_state); + global_state = NULL; + + config_free_lines(global_cmdline_options); + global_cmdline_options = NULL; + tor_free(torrc_fname); tor_free(_version); + tor_free(global_dirfrontpagecontents); +} + +/** Make address -- a piece of information related to our operation as + * a client -- safe to log according to the settings in options->SafeLogging, + * and return it. + * + * (We return "[scrubbed]" if SafeLogging is "1", and address otherwise.) + */ +const char * +safe_str_client(const char *address) +{ + tor_assert(address); + if (get_options()->_SafeLogging == SAFELOG_SCRUB_ALL) + return "[scrubbed]"; + else + return address; } -/** If options->SafeLogging is on, return a not very useful string, - * else return address. +/** Make address -- a piece of information of unspecified sensitivity + * -- safe to log according to the settings in options->SafeLogging, and + * return it. + * + * (We return "[scrubbed]" if SafeLogging is anything besides "0", and address + * otherwise.) */ const char * safe_str(const char *address) { tor_assert(address); - if (get_options()->SafeLogging) + if (get_options()->_SafeLogging != SAFELOG_SCRUB_NONE) return "[scrubbed]"; else return address; } +/** Equivalent to escaped(safe_str_client(address)). See reentrancy note on + * escaped(): don't use this outside the main thread, or twice in the same + * log statement. */ +const char * +escaped_safe_str_client(const char *address) +{ + if (get_options()->_SafeLogging == SAFELOG_SCRUB_ALL) + return "[scrubbed]"; + else + return escaped(address); +} + /** Equivalent to escaped(safe_str(address)). See reentrancy note on * escaped(): don't use this outside the main thread, or twice in the same * log statement. */ const char * escaped_safe_str(const char *address) { - if (get_options()->SafeLogging) + if (get_options()->_SafeLogging != SAFELOG_SCRUB_NONE) return "[scrubbed]"; else return escaped(address); @@ -831,24 +771,28 @@ { int i; const char *dirservers[] = { - "moria1 v1 orport=9001 v3ident=E2A2AF570166665D738736D0DD58169CC61D8A8B " - "128.31.0.34:9031 FFCB 46DB 1339 DA84 674C 70D7 CB58 6434 C437 0441", - "moria2 v1 orport=9002 128.31.0.34:9032 " - "719B E45D E224 B607 C537 07D0 E214 3E2D 423E 74CF", + "moria1 orport=9101 no-v2 " + "v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 " + "128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31", "tor26 v1 orport=443 v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 " "86.59.21.38:80 847B 1F85 0344 D787 6491 A548 92F9 0493 4E4E B85D", "dizum orport=443 v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 " "194.109.206.212:80 7EA6 EAD6 FD83 083C 538F 4403 8BBF A077 587D D755", - "Tonga orport=443 bridge no-v2 82.94.251.206:80 " + "Tonga orport=443 bridge no-v2 82.94.251.203:80 " "4A0C CD2D DC79 9508 3D73 F5D6 6710 0C8A 5831 F16D", "ides orport=9090 no-v2 v3ident=27B6B5996C426270A5C95488AA5BCEB6BCC86956 " "216.224.124.114:9030 F397 038A DC51 3361 35E7 B80B D99C A384 4360 292B", - "gabelmoo orport=443 no-v2 " - "v3ident=81349FC1F2DBA2C2C11B45CB9706637D480AB913 " - "80.190.246.100:80 6833 3D07 61BC F397 A587 A0C0 B963 E4A9 E99E C4D3", + "gabelmoo orport=8080 no-v2 " + "v3ident=ED03BB616EB2F60BEC80151114BB25CEF515B226 " + "80.190.246.100:8180 F204 4413 DAC2 E02E 3D6B CF47 35A1 9BCA 1DE9 7281", "dannenberg orport=443 no-v2 " "v3ident=585769C78764D58426B8B52B6651A5A71137189A " - "213.73.91.31:80 7BE6 83E6 5D48 1413 21C5 ED92 F075 C553 64AC 7123", + "193.23.244.244:80 7BE6 83E6 5D48 1413 21C5 ED92 F075 C553 64AC 7123", + "urras orport=80 no-v2 v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C " + "208.83.223.34:443 0AD3 FA88 4D18 F89E EA2D 89C0 1937 9E0E 7FD9 4417", + "maatuska orport=80 no-v2 " + "v3ident=49015F787433103580E3B66A1707A00E60F2D15B " + "213.115.239.118:443 BD6A 8292 55CB 08E6 6FBE 7D37 4836 3586 E46B 3810", NULL }; for (i=0; dirservers[i]; i++) { @@ -1013,10 +957,12 @@ } /* Launch the listeners. (We do this before we setuid, so we can bind to - * ports under 1024.) */ - if (retry_all_listeners(replaced_listeners, new_listeners) < 0) { - *msg = tor_strdup("Failed to bind one of the listener ports."); - goto rollback; + * ports under 1024.) We don't want to rebind if we're hibernating. */ + if (!we_are_hibernating()) { + if (retry_all_listeners(replaced_listeners, new_listeners) < 0) { + *msg = tor_strdup("Failed to bind one of the listener ports."); + goto rollback; + } } } @@ -1030,6 +976,15 @@ } #endif + /* Attempt to lock all current and future memory with mlockall() only once */ + if (options->DisableAllSwap) { + if (tor_mlockall() == -1) { + *msg = tor_strdup("DisableAllSwap failure. Do you have proper " + "permissions?"); + goto done; + } + } + /* Setuid/setgid as appropriate */ if (options->User) { if (switch_id(options->User) != 0) { @@ -1042,15 +997,27 @@ /* Ensure data directory is private; create if possible. */ if (check_private_dir(options->DataDirectory, running_tor ? CPD_CREATE : CPD_CHECK)<0) { - char buf[1024]; - int tmp = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "Couldn't access/create private data directory \"%s\"", options->DataDirectory); - *msg = tor_strdup(tmp >= 0 ? buf : "internal error"); goto done; /* No need to roll back, since you can't change the value. */ } + if (directory_caches_v2_dir_info(options)) { + size_t len = strlen(options->DataDirectory)+32; + char *fn = tor_malloc(len); + tor_snprintf(fn, len, "%s"PATH_SEPARATOR"cached-status", + options->DataDirectory); + if (check_private_dir(fn, running_tor ? CPD_CREATE : CPD_CHECK) < 0) { + tor_asprintf(msg, + "Couldn't access/create private data directory \"%s\"", fn); + tor_free(fn); + goto done; + } + tor_free(fn); + } + /* Bail out at this point if we're not going to be a client or server: * we don't run Tor itself. */ if (!running_tor) @@ -1066,9 +1033,12 @@ commit: r = 0; if (logs_marked) { + log_severity_list_t *severity = + tor_malloc_zero(sizeof(log_severity_list_t)); close_temp_logs(); - add_callback_log(LOG_ERR, LOG_ERR, control_event_logmsg); + add_callback_log(severity, control_event_logmsg); control_adjust_event_log_severity(); + tor_free(severity); } SMARTLIST_FOREACH(replaced_listeners, connection_t *, conn, { @@ -1106,6 +1076,57 @@ return r; } +/** If we need to have a GEOIP ip-to-country map to run with our configured + * options, return 1 and set *reason_out to a description of why. */ +int +options_need_geoip_info(or_options_t *options, const char **reason_out) +{ + int bridge_usage = + options->BridgeRelay && options->BridgeRecordUsageByCountry; + int routerset_usage = + routerset_needs_geoip(options->EntryNodes) || + routerset_needs_geoip(options->ExitNodes) || + routerset_needs_geoip(options->ExcludeExitNodes) || + routerset_needs_geoip(options->ExcludeNodes); + + if (routerset_usage && reason_out) { + *reason_out = "We've been configured to use (or avoid) nodes in certain " + "countries, and we need GEOIP information to figure out which ones they " + "are."; + } else if (bridge_usage && reason_out) { + *reason_out = "We've been configured to see which countries can access " + "us as a bridge, and we need GEOIP information to tell which countries " + "clients are in."; + } + return bridge_usage || routerset_usage; +} + +/** Return the bandwidthrate that we are going to report to the authorities + * based on the config options. */ +uint32_t +get_effective_bwrate(or_options_t *options) +{ + uint64_t bw = options->BandwidthRate; + if (bw > options->MaxAdvertisedBandwidth) + bw = options->MaxAdvertisedBandwidth; + if (options->RelayBandwidthRate > 0 && bw > options->RelayBandwidthRate) + bw = options->RelayBandwidthRate; + /* ensure_bandwidth_cap() makes sure that this cast can't overflow. */ + return (uint32_t)bw; +} + +/** Return the bandwidthburst that we are going to report to the authorities + * based on the config options. */ +uint32_t +get_effective_bwburst(or_options_t *options) +{ + uint64_t bw = options->BandwidthBurst; + if (options->RelayBandwidthBurst > 0 && bw > options->RelayBandwidthBurst) + bw = options->RelayBandwidthBurst; + /* ensure_bandwidth_cap() makes sure that this cast can't overflow. */ + return (uint32_t)bw; +} + /** Fetch the active option list, and take actions based on it. All of the * things we do should survive being done repeatedly. If present, * old_options contains the previous value of the options. @@ -1119,12 +1140,15 @@ options_act(or_options_t *old_options) { config_line_t *cl; - char *fn; - size_t len; or_options_t *options = get_options(); int running_tor = options->command == CMD_RUN_TOR; char *msg; + if (running_tor && !have_lockfile()) { + if (try_locking(options, 1) < 0) + return -1; + } + if (consider_adding_dir_authorities(options, old_options) < 0) return -1; @@ -1145,22 +1169,14 @@ return -1; } - if (running_tor && directory_caches_v2_dir_info(options)) { - len = strlen(options->DataDirectory)+32; - fn = tor_malloc(len); - tor_snprintf(fn, len, "%s"PATH_SEPARATOR"cached-status", - options->DataDirectory); - if (check_private_dir(fn, CPD_CREATE) != 0) { - log_warn(LD_CONFIG, - "Couldn't access/create private data directory \"%s\"", fn); - tor_free(fn); - return -1; - } - tor_free(fn); + if (running_tor && rend_parse_service_authorization(options, 0) < 0) { + log_warn(LD_BUG, "Previously validated client authorization for " + "hidden services could not be added!"); + return -1; } /* Load state */ - if (! global_state && options->command == CMD_RUN_TOR) { + if (! global_state && running_tor) { if (or_state_load()) return -1; rep_hist_load_mtbf_data(time(NULL)); @@ -1171,30 +1187,15 @@ if (!running_tor) return 0; - { - smartlist_t *sl = smartlist_create(); - char *errmsg = NULL; - for (cl = options->RedirectExit; cl; cl = cl->next) { - if (parse_redirect_line(sl, cl, &errmsg)<0) { - log_warn(LD_CONFIG, "%s", errmsg); - tor_free(errmsg); - SMARTLIST_FOREACH(sl, exit_redirect_t *, er, tor_free(er)); - smartlist_free(sl); - return -1; - } - } - set_exit_redirects(sl); - } - /* Finish backgrounding the process */ - if (running_tor && options->RunAsDaemon) { + if (options->RunAsDaemon) { /* We may be calling this for the n'th time (on SIGHUP), but it's safe. */ finish_daemon(options->DataDirectory); } - /* Write our pid to the pid file. If we do not have write permissions we + /* Write our PID to the PID file. If we do not have write permissions we * will log a warning */ - if (running_tor && options->PidFile) + if (options->PidFile) write_pidfile(options->PidFile); /* Register addressmap directives */ @@ -1227,15 +1228,56 @@ if (accounting_is_enabled(options)) configure_accounting(time(NULL)); + /* Change the cell EWMA settings */ + cell_ewma_set_scale_factor(options, networkstatus_get_latest_consensus()); + /* Check for transitions that need action. */ if (old_options) { - if (options->UseEntryGuards && !old_options->UseEntryGuards) { + + if ((options->UseEntryGuards && !old_options->UseEntryGuards) || + (options->ExcludeNodes && + !routerset_equal(old_options->ExcludeNodes,options->ExcludeNodes)) || + (options->ExcludeExitNodes && + !routerset_equal(old_options->ExcludeExitNodes, + options->ExcludeExitNodes)) || + (options->EntryNodes && + !routerset_equal(old_options->EntryNodes, options->EntryNodes)) || + (options->ExitNodes && + !routerset_equal(old_options->ExitNodes, options->ExitNodes)) || + options->StrictNodes != old_options->StrictNodes) { log_info(LD_CIRC, - "Switching to entry guards; abandoning previous circuits"); + "Changed to using entry guards, or changed preferred or " + "excluded node lists. Abandoning previous circuits."); circuit_mark_all_unused_circs(); circuit_expire_all_dirty_circs(); } +/* How long should we delay counting bridge stats after becoming a bridge? + * We use this so we don't count people who used our bridge thinking it is + * a relay. If you change this, don't forget to change the log message + * below. It's 4 hours (the time it takes to stop being used by clients) + * plus some extra time for clock skew. */ +#define RELAY_BRIDGE_STATS_DELAY (6 * 60 * 60) + + if (! bool_eq(options->BridgeRelay, old_options->BridgeRelay)) { + int was_relay = 0; + if (options->BridgeRelay) { + time_t int_start = time(NULL); + if (old_options->ORPort == options->ORPort) { + int_start += RELAY_BRIDGE_STATS_DELAY; + was_relay = 1; + } + geoip_bridge_stats_init(int_start); + log_info(LD_CONFIG, "We are acting as a bridge now. Starting new " + "GeoIP stats interval%s.", was_relay ? " in 6 " + "hours from now" : ""); + } else { + geoip_bridge_stats_term(); + log_info(LD_GENERAL, "We are no longer acting as a bridge. " + "Forgetting GeoIP stats."); + } + } + if (options_transition_affects_workers(old_options, options)) { log_info(LD_GENERAL, "Worker-related options changed. Rotating workers."); @@ -1258,14 +1300,19 @@ if (options->V3AuthoritativeDir && !old_options->V3AuthoritativeDir) init_keys(); + + if (options->PerConnBWRate != old_options->PerConnBWRate || + options->PerConnBWBurst != old_options->PerConnBWBurst) + connection_or_update_token_buckets(get_connection_array(), options); } /* Maybe load geoip file */ if (options->GeoIPFile && ((!old_options || !opt_streq(old_options->GeoIPFile, options->GeoIPFile)) || !geoip_is_loaded())) { - /* XXXX021 Don't use this "" junk; make our filename options + /* XXXX Don't use this "" junk; make our filename options * understand prefixes somehow. -NM */ + /* XXXX021 Reload GeoIPFile on SIGHUP. -NM */ char *actual_fname = tor_strdup(options->GeoIPFile); #ifdef WIN32 if (!strcmp(actual_fname, "")) { @@ -1279,10 +1326,67 @@ geoip_load_file(actual_fname, options); tor_free(actual_fname); } + + if (options->DirReqStatistics && !geoip_is_loaded()) { + /* Check if GeoIP database could be loaded. */ + log_warn(LD_CONFIG, "Configured to measure directory request " + "statistics, but no GeoIP database found!"); + return -1; + } + + if (options->EntryStatistics) { + if (should_record_bridge_info(options)) { + /* Don't allow measuring statistics on entry guards when configured + * as bridge. */ + log_warn(LD_CONFIG, "Bridges cannot be configured to measure " + "additional GeoIP statistics as entry guards."); + return -1; + } else if (!geoip_is_loaded()) { + /* Check if GeoIP database could be loaded. */ + log_warn(LD_CONFIG, "Configured to measure entry node statistics, " + "but no GeoIP database found!"); + return -1; + } + } + + if (options->CellStatistics || options->DirReqStatistics || + options->EntryStatistics || options->ExitPortStatistics) { + time_t now = time(NULL); + if ((!old_options || !old_options->CellStatistics) && + options->CellStatistics) + rep_hist_buffer_stats_init(now); + if ((!old_options || !old_options->DirReqStatistics) && + options->DirReqStatistics) + geoip_dirreq_stats_init(now); + if ((!old_options || !old_options->EntryStatistics) && + options->EntryStatistics) + geoip_entry_stats_init(now); + if ((!old_options || !old_options->ExitPortStatistics) && + options->ExitPortStatistics) + rep_hist_exit_stats_init(now); + if (!old_options) + log_notice(LD_CONFIG, "Configured to measure statistics. Look for " + "the *-stats files that will first be written to the " + "data directory in 24 hours from now."); + } + + if (old_options && old_options->CellStatistics && + !options->CellStatistics) + rep_hist_buffer_stats_term(); + if (old_options && old_options->DirReqStatistics && + !options->DirReqStatistics) + geoip_dirreq_stats_term(); + if (old_options && old_options->EntryStatistics && + !options->EntryStatistics) + geoip_entry_stats_term(); + if (old_options && old_options->ExitPortStatistics && + !options->ExitPortStatistics) + rep_hist_exit_stats_term(); + /* Check if we need to parse and add the EntryNodes config option. */ if (options->EntryNodes && (!old_options || - !opt_streq(old_options->EntryNodes, options->EntryNodes))) + (!routerset_equal(old_options->EntryNodes,options->EntryNodes)))) entry_nodes_should_be_added(); /* Since our options changed, we might need to regenerate and upload our @@ -1308,6 +1412,19 @@ } } + /* Load the webpage we're going to serve every time someone asks for '/' on + our DirPort. */ + tor_free(global_dirfrontpagecontents); + if (options->DirPortFrontPage) { + global_dirfrontpagecontents = + read_file_to_str(options->DirPortFrontPage, 0, NULL); + if (!global_dirfrontpagecontents) { + log_warn(LD_CONFIG, + "DirPortFrontPage file '%s' not found. Continuing anyway.", + options->DirPortFrontPage); + } + } + return 0; } @@ -1328,7 +1445,7 @@ if (! fmt->abbrevs) return option; for (i=0; fmt->abbrevs[i].abbreviated; ++i) { - /* Abbreviations are casei. */ + /* Abbreviations are case insensitive. */ if (!strcasecmp(option,fmt->abbrevs[i].abbreviated) && (command_line || !fmt->abbrevs[i].commandline_only)) { if (warn_obsolete && fmt->abbrevs[i].warn) { @@ -1338,7 +1455,10 @@ fmt->abbrevs[i].abbreviated, fmt->abbrevs[i].full); } - return fmt->abbrevs[i].full; + /* Keep going through the list in case we want to rewrite it more. + * (We could imagine recursing here, but I don't want to get the + * user into an infinite loop if we craft our list wrong.) */ + option = fmt->abbrevs[i].full; } } return option; @@ -1363,7 +1483,8 @@ } else if (!strcmp(argv[i],"--list-fingerprint") || !strcmp(argv[i],"--verify-config") || !strcmp(argv[i],"--ignore-missing-torrc") || - !strcmp(argv[i],"--quiet")) { + !strcmp(argv[i],"--quiet") || + !strcmp(argv[i],"--hush")) { i += 1; /* command-line option. ignore it. */ continue; } else if (!strcmp(argv[i],"--nt-service") || @@ -1382,13 +1503,16 @@ *new = tor_malloc_zero(sizeof(config_line_t)); s = argv[i]; - while (*s == '-') + /* Each keyword may be prefixed with one or two dashes. */ + if (*s == '-') + s++; + if (*s == '-') s++; (*new)->key = tor_strdup(expand_abbrev(&options_format, s, 1, 1)); (*new)->value = tor_strdup(argv[i+1]); (*new)->next = NULL; - log(LOG_DEBUG, LD_CONFIG, "Commandline: parsed keyword '%s', value '%s'", + log(LOG_DEBUG, LD_CONFIG, "command line: parsed keyword '%s', value '%s'", (*new)->key, (*new)->value); new = &((*new)->next); @@ -1429,9 +1553,12 @@ next = &list; do { + k = v = NULL; string = parse_config_line_from_str(string, &k, &v); if (!string) { config_free_lines(list); + tor_free(k); + tor_free(v); return -1; } if (k && v) { @@ -1471,19 +1598,6 @@ } } -/** Return the description for a given configuration variable, or NULL if no - * description exists. */ -static const char * -config_find_description(config_format_t *fmt, const char *name) -{ - int i; - for (i=0; fmt->descriptions[i].name; ++i) { - if (!strcasecmp(name, fmt->descriptions[i].name)) - return fmt->descriptions[i].description; - } - return NULL; -} - /** If key is a configuration option, return the corresponding * config_var_t. Otherwise, if key is a non-standard abbreviation, * warn, and return the corresponding config_var_t. Otherwise return NULL. @@ -1494,7 +1608,7 @@ int i; size_t keylen = strlen(key); if (!keylen) - return NULL; /* if they say "--" on the commandline, it's not an option */ + return NULL; /* if they say "--" on the command line, it's not an option */ /* First, check for an exact (case-insensitive) match */ for (i=0; fmt->vars[i].name; ++i) { if (!strcasecmp(key, fmt->vars[i].name)) { @@ -1514,6 +1628,16 @@ return NULL; } +/** Return the number of option entries in fmt. */ +static int +config_count_options(config_format_t *fmt) +{ + int i; + for (i=0; fmt->vars[i].name; ++i) + ; + return i; +} + /* * Functions to assign config options. */ @@ -1527,8 +1651,7 @@ config_assign_value(config_format_t *fmt, or_options_t *options, config_line_t *c, char **msg) { - int i, r, ok; - char buf[1024]; + int i, ok; config_var_t *var; void *lvalue; @@ -1544,10 +1667,9 @@ case CONFIG_TYPE_UINT: i = (int)tor_parse_long(c->value, 10, 0, INT_MAX, &ok, NULL); if (!ok) { - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "Int keyword '%s %s' is malformed or out of bounds.", c->key, c->value); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; } *(int *)lvalue = i; @@ -1556,10 +1678,9 @@ case CONFIG_TYPE_INTERVAL: { i = config_parse_interval(c->value, &ok); if (!ok) { - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "Interval '%s %s' is malformed or out of bounds.", c->key, c->value); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; } *(int *)lvalue = i; @@ -1569,10 +1690,9 @@ case CONFIG_TYPE_MEMUNIT: { uint64_t u64 = config_parse_memunit(c->value, &ok); if (!ok) { - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "Value '%s %s' is malformed or out of bounds.", c->key, c->value); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; } *(uint64_t *)lvalue = u64; @@ -1582,16 +1702,16 @@ case CONFIG_TYPE_BOOL: i = (int)tor_parse_long(c->value, 10, 0, 1, &ok, NULL); if (!ok) { - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "Boolean '%s %s' expects 0 or 1.", c->key, c->value); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; } *(int *)lvalue = i; break; case CONFIG_TYPE_STRING: + case CONFIG_TYPE_FILENAME: tor_free(*(char **)lvalue); *(char **)lvalue = tor_strdup(c->value); break; @@ -1602,9 +1722,20 @@ case CONFIG_TYPE_ISOTIME: if (parse_iso_time(c->value, (time_t *)lvalue)) { - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "Invalid time '%s' for keyword '%s'", c->value, c->key); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); + return -1; + } + break; + + case CONFIG_TYPE_ROUTERSET: + if (*(routerset_t**)lvalue) { + routerset_free(*(routerset_t**)lvalue); + } + *(routerset_t**)lvalue = routerset_new(); + if (routerset_parse(*(routerset_t**)lvalue, c->value, c->key)<0) { + tor_asprintf(msg, "Invalid exit list '%s' for option '%s'", + c->value, c->key); return -1; } break; @@ -1625,14 +1756,12 @@ case CONFIG_TYPE_LINELIST_S: config_line_append((config_line_t**)lvalue, c->key, c->value); break; - case CONFIG_TYPE_OBSOLETE: log_warn(LD_CONFIG, "Skipping obsolete configuration option '%s'", c->key); break; case CONFIG_TYPE_LINELIST_V: - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "You may not provide a value for virtual option '%s'", c->key); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; default: tor_assert(0); @@ -1653,7 +1782,7 @@ static int config_assign_line(config_format_t *fmt, or_options_t *options, config_line_t *c, int use_defaults, - int clear_first, char **msg) + int clear_first, bitarray_t *options_seen, char **msg) { config_var_t *var; @@ -1668,13 +1797,12 @@ config_line_append((config_line_t**)lvalue, c->key, c->value); return 0; } else { - char buf[1024]; - int tmp = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "Unknown option '%s'. Failing.", c->key); - *msg = tor_strdup(tmp >= 0 ? buf : "internal error"); return -1; } } + /* Put keyword into canonical case. */ if (strcmp(var->name, c->key)) { tor_free(c->key); @@ -1686,7 +1814,7 @@ if (!clear_first) { if (var->type == CONFIG_TYPE_LINELIST || var->type == CONFIG_TYPE_LINELIST_S) { - /* We got an empty linelist from the torrc or commandline. + /* We got an empty linelist from the torrc or command line. As a special case, call this an error. Warn and ignore. */ log_warn(LD_CONFIG, "Linelist option '%s' has no value. Skipping.", c->key); @@ -1697,6 +1825,18 @@ return 0; } + if (options_seen && (var->type != CONFIG_TYPE_LINELIST && + var->type != CONFIG_TYPE_LINELIST_S)) { + /* We're tracking which options we've seen, and this option is not + * supposed to occur more than once. */ + int var_index = (int)(var - fmt->vars); + if (bitarray_is_set(options_seen, var_index)) { + log_warn(LD_CONFIG, "Option '%s' used more than once; all but the last " + "value will be ignored.", var->name); + } + bitarray_set(options_seen, var_index); + } + if (config_assign_value(fmt, options, c, msg) < 0) return -2; return 0; @@ -1736,7 +1876,7 @@ return var ? var->name : NULL; } -/** Return a canonicalized list of the options assigned for key. +/** Return a canonical list of the options assigned for key. */ config_line_t * option_get_assignment(or_options_t *options, const char *key) @@ -1792,13 +1932,11 @@ * value needs to be quoted before it's put in a config file, quote and * escape that value. Return NULL if no such key exists. */ static config_line_t * -get_assigned_option(config_format_t *fmt, or_options_t *options, +get_assigned_option(config_format_t *fmt, void *options, const char *key, int escape_val) -/* XXXX argument is options, but fmt is provided. Inconsistent. */ { config_var_t *var; const void *value; - char buf[32]; config_line_t *result; tor_assert(options && key); @@ -1816,6 +1954,7 @@ switch (var->type) { case CONFIG_TYPE_STRING: + case CONFIG_TYPE_FILENAME: if (*(char**)value) { result->value = tor_strdup(*(char**)value); } else { @@ -1838,25 +1977,25 @@ case CONFIG_TYPE_UINT: /* This means every or_options_t uint or bool element * needs to be an int. Not, say, a uint16_t or char. */ - tor_snprintf(buf, sizeof(buf), "%d", *(int*)value); - result->value = tor_strdup(buf); + tor_asprintf(&result->value, "%d", *(int*)value); escape_val = 0; /* Can't need escape. */ break; case CONFIG_TYPE_MEMUNIT: - tor_snprintf(buf, sizeof(buf), U64_FORMAT, + tor_asprintf(&result->value, U64_FORMAT, U64_PRINTF_ARG(*(uint64_t*)value)); - result->value = tor_strdup(buf); escape_val = 0; /* Can't need escape. */ break; case CONFIG_TYPE_DOUBLE: - tor_snprintf(buf, sizeof(buf), "%f", *(double*)value); - result->value = tor_strdup(buf); + tor_asprintf(&result->value, "%f", *(double*)value); escape_val = 0; /* Can't need escape. */ break; case CONFIG_TYPE_BOOL: result->value = tor_strdup(*(int*)value ? "1" : "0"); escape_val = 0; /* Can't need escape. */ break; + case CONFIG_TYPE_ROUTERSET: + result->value = routerset_to_string(*(routerset_t**)value); + break; case CONFIG_TYPE_CSV: if (*(smartlist_t**)value) result->value = @@ -1966,6 +2105,8 @@ int use_defaults, int clear_first, char **msg) { config_line_t *p; + bitarray_t *options_seen; + const int n_options = config_count_options(fmt); CHECK(fmt, options); @@ -1985,27 +2126,31 @@ config_reset_line(fmt, options, p->key, use_defaults); } + options_seen = bitarray_init_zero(n_options); /* pass 3: assign. */ while (list) { int r; if ((r=config_assign_line(fmt, options, list, use_defaults, - clear_first, msg))) + clear_first, options_seen, msg))) { + bitarray_free(options_seen); return r; + } list = list->next; } + bitarray_free(options_seen); return 0; } /** Try assigning list to the global options. You do this by duping * options, assigning list to the new one, then validating it. If it's * ok, then throw out the old one and stick with the new one. Else, - * revert to old and return failure. Return 0 on success, -1 on bad - * keys, -2 on bad values, -3 on bad transition, and -4 on failed-to-set. + * revert to old and return failure. Return SETOPT_OK on success, or + * a setopt_err_t on failure. * * If not success, point *msg to a newly allocated string describing * what went wrong. */ -int +setopt_err_t options_trial_assign(config_line_t *list, int use_defaults, int clear_first, char **msg) { @@ -2020,21 +2165,21 @@ if (options_validate(get_options(), trial_options, 1, msg) < 0) { config_free(&options_format, trial_options); - return -2; + return SETOPT_ERR_PARSE; /*XXX make this a separate return value. */ } if (options_transition_allowed(get_options(), trial_options, msg) < 0) { config_free(&options_format, trial_options); - return -3; + return SETOPT_ERR_TRANSITION; } if (set_options(trial_options, msg)<0) { config_free(&options_format, trial_options); - return -4; + return SETOPT_ERR_SETTING; } /* we liked it. put it in place. */ - return 0; + return SETOPT_OK; } /** Reset config option var to 0, 0.0, NULL, or the equivalent. @@ -2046,6 +2191,7 @@ (void)fmt; /* unused */ switch (var->type) { case CONFIG_TYPE_STRING: + case CONFIG_TYPE_FILENAME: tor_free(*(char**)lvalue); break; case CONFIG_TYPE_DOUBLE: @@ -2053,6 +2199,7 @@ break; case CONFIG_TYPE_ISOTIME: *(time_t*)lvalue = 0; + break; case CONFIG_TYPE_INTERVAL: case CONFIG_TYPE_UINT: case CONFIG_TYPE_BOOL: @@ -2061,6 +2208,12 @@ case CONFIG_TYPE_MEMUNIT: *(uint64_t*)lvalue = 0; break; + case CONFIG_TYPE_ROUTERSET: + if (*(routerset_t**)lvalue) { + routerset_free(*(routerset_t**)lvalue); + *(routerset_t**)lvalue = NULL; + } + break; case CONFIG_TYPE_CSV: if (*(smartlist_t**)lvalue) { SMARTLIST_FOREACH(*(smartlist_t **)lvalue, char *, cp, tor_free(cp)); @@ -2113,7 +2266,7 @@ printf( "Copyright (c) 2001-2004, Roger Dingledine\n" "Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson\n" -"Copyright (c) 2007-2008, The Tor Project, Inc.\n\n" +"Copyright (c) 2007-2010, The Tor Project, Inc.\n\n" "tor -f [args]\n" "See man page for options, or https://www.torproject.org/ for " "documentation.\n"); @@ -2127,20 +2280,10 @@ smartlist_t *lines = smartlist_create(); for (i = 0; _option_vars[i].name; ++i) { config_var_t *var = &_option_vars[i]; - const char *desc; if (var->type == CONFIG_TYPE_OBSOLETE || var->type == CONFIG_TYPE_LINELIST_V) continue; - desc = config_find_description(&options_format, var->name); printf("%s\n", var->name); - if (desc) { - wrap_string(lines, desc, 76, " ", " "); - SMARTLIST_FOREACH(lines, char *, cp, { - printf("%s", cp); - tor_free(cp); - }); - smartlist_clear(lines); - } } smartlist_free(lines); } @@ -2159,7 +2302,7 @@ uint32_t *addr_out, char **hostname_out) { struct in_addr in; - struct hostent *rent; + uint32_t addr; /* host order */ char hostname[256]; int explicit_ip=1; int explicit_hostname=1; @@ -2189,9 +2332,8 @@ if (tor_inet_aton(hostname, &in) == 0) { /* then we have to resolve it */ explicit_ip = 0; - rent = (struct hostent *)gethostbyname(hostname); - if (!rent) { - uint32_t interface_ip; + if (tor_lookup_hostname(hostname, &addr)) { /* failed to resolve */ + uint32_t interface_ip; /* host order */ if (explicit_hostname) { log_fn(warn_severity, LD_CONFIG, @@ -2212,9 +2354,8 @@ log_fn(notice_severity, LD_CONFIG, "Learned IP address '%s' for " "local interface. Using that.", tmpbuf); strlcpy(hostname, "", sizeof(hostname)); - } else { - tor_assert(rent->h_length == 4); - memcpy(&in.s_addr, rent->h_addr, rent->h_length); + } else { /* resolved hostname into addr */ + in.s_addr = htonl(addr); if (!explicit_hostname && is_internal_IP(ntohl(in.s_addr), 0)) { @@ -2305,26 +2446,32 @@ return 0; } -/** Return true iff ip (in host order) is judged to be on the - * same network as us, or on a private network. +/** Return true iff addr is judged to be on the same network as us, or + * on a private network. */ int -is_local_IP(uint32_t ip) +is_local_addr(const tor_addr_t *addr) { - if (is_internal_IP(ip, 0)) + if (tor_addr_is_internal(addr, 0)) return 1; /* Check whether ip is on the same /24 as we are. */ if (get_options()->EnforceDistinctSubnets == 0) return 0; - /* It's possible that this next check will hit before the first time - * resolve_my_address actually succeeds. (For clients, it is likely that - * resolve_my_address will never be called at all). In those cases, - * last_resolved_addr will be 0, and so checking to see whether ip is on the - * same /24 as last_resolved_addr will be the same as checking whether it - * was on net 0, which is already done by is_internal_IP. - */ - if ((last_resolved_addr & 0xffffff00ul) == (ip & 0xffffff00ul)) - return 1; + if (tor_addr_family(addr) == AF_INET) { + /*XXXX022 IP6 what corresponds to an /24? */ + uint32_t ip = tor_addr_to_ipv4h(addr); + + /* It's possible that this next check will hit before the first time + * resolve_my_address actually succeeds. (For clients, it is likely that + * resolve_my_address will never be called at all). In those cases, + * last_resolved_addr will be 0, and so checking to see whether ip is on + * the same /24 as last_resolved_addr will be the same as checking whether + * it was on net 0, which is already done by is_internal_IP. + */ + if ((last_resolved_addr & (uint32_t)0xffffff00ul) + == (ip & (uint32_t)0xffffff00ul)) + return 1; + } return 0; } @@ -2382,7 +2529,10 @@ { int i; - tor_assert(options); + if (!options) + return; + + tor_assert(fmt); for (i=0; fmt->vars[i].name; ++i) option_clear(fmt, options, &(fmt->vars[i])); @@ -2474,6 +2624,37 @@ config_init(&options_format, options); } +/* Check if the port number given in port_option in combination with + * the specified port in listen_options will result in Tor actually + * opening a low port (meaning a port lower than 1024). Return 1 if + * it is, or 0 if it isn't or the concept of a low port isn't applicable for + * the platform we're on. */ +static int +is_listening_on_low_port(uint16_t port_option, + const config_line_t *listen_options) +{ +#ifdef MS_WINDOWS + (void) port_option; + (void) listen_options; + return 0; /* No port is too low for windows. */ +#else + const config_line_t *l; + uint16_t p; + if (port_option == 0) + return 0; /* We're not listening */ + if (listen_options == NULL) + return (port_option < 1024); + + for (l = listen_options; l; l = l->next) { + parse_addr_port(LOG_WARN, l->value, NULL, NULL, &p); + if (p<1024) { + return 1; + } + } + return 0; +#endif +} + /** Set all vars in the configuration object options to their default * values. */ static void @@ -2504,7 +2685,6 @@ config_line_t *line, *assigned; char *result; int i; - const char *desc; char *msg = NULL; defaults = config_alloc(fmt); @@ -2532,24 +2712,13 @@ option_is_same(fmt, options, defaults, fmt->vars[i].name)) comment_option = 1; - desc = config_find_description(fmt, fmt->vars[i].name); line = assigned = get_assigned_option(fmt, options, fmt->vars[i].name, 1); - if (line && desc) { - /* Only dump the description if there's something to describe. */ - wrap_string(elements, desc, 78, "# ", "# "); - } - for (; line; line = line->next) { - size_t len = strlen(line->key) + strlen(line->value) + 5; char *tmp; - tmp = tor_malloc(len); - if (tor_snprintf(tmp, len, "%s%s %s\n", - comment_option ? "# " : "", - line->key, line->value)<0) { - log_err(LD_BUG,"Internal error writing option value"); - tor_assert(0); - } + tor_asprintf(&tmp, "%s%s %s\n", + comment_option ? "# " : "", + line->key, line->value); smartlist_add(elements, tmp); } config_free_lines(assigned); @@ -2558,13 +2727,8 @@ if (fmt->extra) { line = *(config_line_t**)STRUCT_VAR_P(options, fmt->extra->var_offset); for (; line; line = line->next) { - size_t len = strlen(line->key) + strlen(line->value) + 3; char *tmp; - tmp = tor_malloc(len); - if (tor_snprintf(tmp, len, "%s %s\n", line->key, line->value)<0) { - log_err(LD_BUG,"Internal error writing option value"); - tor_assert(0); - } + tor_asprintf(&tmp, "%s %s\n", line->key, line->value); smartlist_add(elements, tmp); } } @@ -2580,7 +2744,7 @@ * the configuration in options. If minimal is true, do not * include options that are the same as Tor's defaults. */ -static char * +char * options_dump(or_options_t *options, int minimal) { return config_dump(&options_format, options, minimal, 0); @@ -2593,7 +2757,6 @@ validate_ports_csv(smartlist_t *sl, const char *name, char **msg) { int i; - char buf[1024]; tor_assert(name); if (!sl) @@ -2603,9 +2766,7 @@ { i = atoi(cp); if (i < 1 || i > 65535) { - int r = tor_snprintf(buf, sizeof(buf), - "Port '%s' out of range in %s", cp, name); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); + tor_asprintf(msg, "Port '%s' out of range in %s", cp, name); return -1; } }); @@ -2619,18 +2780,15 @@ static int ensure_bandwidth_cap(uint64_t *value, const char *desc, char **msg) { - int r; - char buf[1024]; if (*value > ROUTER_MAX_DECLARED_BANDWIDTH) { /* This handles an understandable special case where somebody says "2gb" * whereas our actual maximum is 2gb-1 (INT_MAX) */ --*value; } if (*value > ROUTER_MAX_DECLARED_BANDWIDTH) { - r = tor_snprintf(buf, sizeof(buf), "%s ("U64_FORMAT") must be at most %d", - desc, U64_PRINTF_ARG(*value), - ROUTER_MAX_DECLARED_BANDWIDTH); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); + tor_asprintf(msg, "%s ("U64_FORMAT") must be at most %d", + desc, U64_PRINTF_ARG(*value), + ROUTER_MAX_DECLARED_BANDWIDTH); return -1; } return 0; @@ -2681,15 +2839,14 @@ /** Highest allowable value for RendPostPeriod. */ #define MAX_DIR_PERIOD (MIN_ONION_KEY_LIFETIME/2) -/** Lowest allowable value for CircuitBuildTimeout; values too low will - * increase network load because of failing connections being retried, and - * might prevent users from connecting to the network at all. */ -#define MIN_CIRCUIT_BUILD_TIMEOUT 30 - /** Lowest allowable value for MaxCircuitDirtiness; if this is too low, Tor * will generate too many circuits and potentially overload the network. */ #define MIN_MAX_CIRCUIT_DIRTINESS 10 +/** Lowest allowable value for CircuitStreamTimeout; if this is too low, Tor + * will generate too many circuits and potentially overload the network. */ +#define MIN_CIRCUIT_STREAM_TIMEOUT 10 + /** Return 0 if every setting in options is reasonable, and a * permissible transition from old_options. Else return -1. * Should have no side effects, except for normalizing the contents of @@ -2706,10 +2863,9 @@ options_validate(or_options_t *old_options, or_options_t *options, int from_setconf, char **msg) { - int i, r; + int i; config_line_t *cl; const char *uname = get_uname(); - char buf[1024]; #define REJECT(arg) \ STMT_BEGIN *msg = tor_strdup(arg); return -1; STMT_END #define COMPLAIN(arg) STMT_BEGIN log(LOG_WARN, LD_CONFIG, arg); STMT_END @@ -2726,7 +2882,7 @@ !strcmpstart(uname, "Windows Me"))) { log(LOG_WARN, LD_CONFIG, "Tor is running as a server, but you are " "running %s; this probably won't work. See " - "http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#ServerOS " + "https://wiki.torproject.org/TheOnionRouter/TorFAQ#ServerOS " "for details.", uname); } @@ -2804,10 +2960,9 @@ } } else { if (!is_legal_nickname(options->Nickname)) { - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "Nickname '%s' is wrong length or contains illegal characters.", options->Nickname); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; } } @@ -2875,25 +3030,41 @@ REJECT("TransPort and TransListenAddress are disabled in this build."); #endif - if (options->StrictExitNodes && - (!options->ExitNodes || !strlen(options->ExitNodes)) && - (!old_options || - (old_options->StrictExitNodes != options->StrictExitNodes) || - (!opt_streq(old_options->ExitNodes, options->ExitNodes)))) - COMPLAIN("StrictExitNodes set, but no ExitNodes listed."); + if (options->AccountingMax && + (is_listening_on_low_port(options->ORPort, options->ORListenAddress) || + is_listening_on_low_port(options->DirPort, options->DirListenAddress))) + { + log(LOG_WARN, LD_CONFIG, + "You have set AccountingMax to use hibernation. You have also " + "chosen a low DirPort or OrPort. This combination can make Tor stop " + "working when it tries to re-attach the port after a period of " + "hibernation. Please choose a different port or turn off " + "hibernation unless you know this combination will work on your " + "platform."); + } - if (options->StrictEntryNodes && - (!options->EntryNodes || !strlen(options->EntryNodes)) && - (!old_options || - (old_options->StrictEntryNodes != options->StrictEntryNodes) || - (!opt_streq(old_options->EntryNodes, options->EntryNodes)))) - COMPLAIN("StrictEntryNodes set, but no EntryNodes listed."); + if (options->ExcludeExitNodes || options->ExcludeNodes) { + options->_ExcludeExitNodesUnion = routerset_new(); + routerset_union(options->_ExcludeExitNodesUnion,options->ExcludeExitNodes); + routerset_union(options->_ExcludeExitNodesUnion,options->ExcludeNodes); + } + + if (options->ExcludeNodes && options->StrictNodes) { + COMPLAIN("You have asked to exclude certain relays from all positions " + "in your circuits. Expect hidden services and other Tor " + "features to be broken in unpredictable ways."); + } + + if (options->EntryNodes && !routerset_is_list(options->EntryNodes)) { + /* XXXX fix this; see entry_guards_prepend_from_config(). */ + REJECT("IPs or countries are not yet supported in EntryNodes."); + } if (options->AuthoritativeDir) { - if (!options->ContactInfo) + if (!options->ContactInfo && !options->TestingTorNetwork) REJECT("Authoritative directory servers must set ContactInfo"); if (options->V1AuthoritativeDir && !options->RecommendedVersions) - REJECT("V1 auth dir servers must set RecommendedVersions."); + REJECT("V1 authoritative dir servers must set RecommendedVersions."); if (!options->RecommendedClientVersions) options->RecommendedClientVersions = config_lines_dup(options->RecommendedVersions); @@ -2903,7 +3074,8 @@ if (options->VersioningAuthoritativeDir && (!options->RecommendedClientVersions || !options->RecommendedServerVersions)) - REJECT("Versioning auth dir servers must set Recommended*Versions."); + REJECT("Versioning authoritative dir servers must set " + "Recommended*Versions."); if (options->UseEntryGuards) { log_info(LD_CONFIG, "Authoritative directory servers can't set " "UseEntryGuards. Disabling."); @@ -2919,6 +3091,10 @@ options->V3AuthoritativeDir)) REJECT("AuthoritativeDir is set, but none of " "(Bridge/HS/V1/V2/V3)AuthoritativeDir is set."); + /* If we have a v3bandwidthsfile and it's broken, complain on startup */ + if (options->V3BandwidthsFile && !old_options) { + dirserv_read_measured_bandwidths(options->V3BandwidthsFile, NULL); + } } if (options->AuthoritativeDir && !options->DirPort) @@ -2930,18 +3106,14 @@ if (options->AuthoritativeDir && options->ClientOnly) REJECT("Running as authoritative directory, but ClientOnly also set."); - if (options->HSAuthorityRecordStats && !options->HSAuthoritativeDir) - REJECT("HSAuthorityRecordStats is set but we're not running as " - "a hidden service authority."); - - if (options->HidServDirectoryV2 && !options->DirPort) - REJECT("Running as hidden service directory, but no DirPort set."); + if (options->FetchDirInfoExtraEarly && !options->FetchDirInfoEarly) + REJECT("FetchDirInfoExtraEarly requires that you also set " + "FetchDirInfoEarly"); if (options->ConnLimit <= 0) { - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "ConnLimit must be greater than 0, but was set to %d", options->ConnLimit); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; } @@ -3060,21 +3232,41 @@ else if (!strcasecmp(cp, "rendezvous")) options->_AllowInvalid |= ALLOW_INVALID_RENDEZVOUS; else { - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "Unrecognized value '%s' in AllowInvalidNodes", cp); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; } }); } + if (!options->SafeLogging || + !strcasecmp(options->SafeLogging, "0")) { + options->_SafeLogging = SAFELOG_SCRUB_NONE; + } else if (!strcasecmp(options->SafeLogging, "relay")) { + options->_SafeLogging = SAFELOG_SCRUB_RELAY; + } else if (!strcasecmp(options->SafeLogging, "1")) { + options->_SafeLogging = SAFELOG_SCRUB_ALL; + } else { + tor_asprintf(msg, + "Unrecognized value '%s' in SafeLogging", + escaped(options->SafeLogging)); + return -1; + } + if (compute_publishserverdescriptor(options) < 0) { - r = tor_snprintf(buf, sizeof(buf), - "Unrecognized value in PublishServerDescriptor"); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); + tor_asprintf(msg, "Unrecognized value in PublishServerDescriptor"); return -1; } + if ((options->BridgeRelay + || options->_PublishServerDescriptor & BRIDGE_AUTHORITY) + && (options->_PublishServerDescriptor + & (V1_AUTHORITY|V2_AUTHORITY|V3_AUTHORITY))) { + REJECT("Bridges are not supposed to publish router descriptors to the " + "directory authorities. Please correct your " + "PublishServerDescriptor line."); + } + if (options->MinUptimeHidServDirectoryV2 < 0) { log_warn(LD_CONFIG, "MinUptimeHidServDirectoryV2 option must be at " "least 0 seconds. Changing to 0."); @@ -3082,29 +3274,30 @@ } if (options->RendPostPeriod < MIN_REND_POST_PERIOD) { - log(LOG_WARN,LD_CONFIG,"RendPostPeriod option must be at least %d seconds." - " Clipping.", MIN_REND_POST_PERIOD); + log_warn(LD_CONFIG, "RendPostPeriod option is too short; " + "raising to %d seconds.", MIN_REND_POST_PERIOD); options->RendPostPeriod = MIN_REND_POST_PERIOD; } if (options->RendPostPeriod > MAX_DIR_PERIOD) { - log(LOG_WARN, LD_CONFIG, "RendPostPeriod is too large; clipping to %ds.", - MAX_DIR_PERIOD); + log_warn(LD_CONFIG, "RendPostPeriod is too large; clipping to %ds.", + MAX_DIR_PERIOD); options->RendPostPeriod = MAX_DIR_PERIOD; } - if (options->CircuitBuildTimeout < MIN_CIRCUIT_BUILD_TIMEOUT) { - log(LOG_WARN, LD_CONFIG, "CircuitBuildTimeout option is too short; " - "raising to %d seconds.", MIN_CIRCUIT_BUILD_TIMEOUT); - options->CircuitBuildTimeout = MIN_CIRCUIT_BUILD_TIMEOUT; - } - if (options->MaxCircuitDirtiness < MIN_MAX_CIRCUIT_DIRTINESS) { - log(LOG_WARN, LD_CONFIG, "MaxCircuitDirtiness option is too short; " - "raising to %d seconds.", MIN_MAX_CIRCUIT_DIRTINESS); + log_warn(LD_CONFIG, "MaxCircuitDirtiness option is too short; " + "raising to %d seconds.", MIN_MAX_CIRCUIT_DIRTINESS); options->MaxCircuitDirtiness = MIN_MAX_CIRCUIT_DIRTINESS; } + if (options->CircuitStreamTimeout && + options->CircuitStreamTimeout < MIN_CIRCUIT_STREAM_TIMEOUT) { + log_warn(LD_CONFIG, "CircuitStreamTimeout option is too short; " + "raising to %d seconds.", MIN_CIRCUIT_STREAM_TIMEOUT); + options->CircuitStreamTimeout = MIN_CIRCUIT_STREAM_TIMEOUT; + } + if (options->KeepalivePeriod < 1) REJECT("KeepalivePeriod option must be positive."); @@ -3123,34 +3316,37 @@ if (ensure_bandwidth_cap(&options->RelayBandwidthBurst, "RelayBandwidthBurst", msg) < 0) return -1; + if (ensure_bandwidth_cap(&options->PerConnBWRate, + "PerConnBWRate", msg) < 0) + return -1; + if (ensure_bandwidth_cap(&options->PerConnBWBurst, + "PerConnBWBurst", msg) < 0) + return -1; if (server_mode(options)) { - if (options->BandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH*2) { - r = tor_snprintf(buf, sizeof(buf), + if (options->BandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH) { + tor_asprintf(msg, "BandwidthRate is set to %d bytes/second. " "For servers, it must be at least %d.", (int)options->BandwidthRate, - ROUTER_REQUIRED_MIN_BANDWIDTH*2); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); + ROUTER_REQUIRED_MIN_BANDWIDTH); return -1; } else if (options->MaxAdvertisedBandwidth < - ROUTER_REQUIRED_MIN_BANDWIDTH) { - r = tor_snprintf(buf, sizeof(buf), + ROUTER_REQUIRED_MIN_BANDWIDTH/2) { + tor_asprintf(msg, "MaxAdvertisedBandwidth is set to %d bytes/second. " "For servers, it must be at least %d.", (int)options->MaxAdvertisedBandwidth, - ROUTER_REQUIRED_MIN_BANDWIDTH); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); + ROUTER_REQUIRED_MIN_BANDWIDTH/2); return -1; } if (options->RelayBandwidthRate && options->RelayBandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH) { - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "RelayBandwidthRate is set to %d bytes/second. " "For servers, it must be at least %d.", (int)options->RelayBandwidthRate, ROUTER_REQUIRED_MIN_BANDWIDTH); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; } } @@ -3176,7 +3372,7 @@ REJECT("Failed to parse accounting options. See logs for details."); if (options->HttpProxy) { /* parse it now */ - if (parse_addr_port(LOG_WARN, options->HttpProxy, NULL, + if (tor_addr_port_parse(options->HttpProxy, &options->HttpProxyAddr, &options->HttpProxyPort) < 0) REJECT("HttpProxy failed to parse or resolve. Please fix."); if (options->HttpProxyPort == 0) { /* give it a default */ @@ -3190,7 +3386,7 @@ } if (options->HttpsProxy) { /* parse it now */ - if (parse_addr_port(LOG_WARN, options->HttpsProxy, NULL, + if (tor_addr_port_parse(options->HttpsProxy, &options->HttpsProxyAddr, &options->HttpsProxyPort) <0) REJECT("HttpsProxy failed to parse or resolve. Please fix."); if (options->HttpsProxyPort == 0) { /* give it a default */ @@ -3203,6 +3399,45 @@ REJECT("HttpsProxyAuthenticator is too long (>= 48 chars)."); } + if (options->Socks4Proxy) { /* parse it now */ + if (tor_addr_port_parse(options->Socks4Proxy, + &options->Socks4ProxyAddr, + &options->Socks4ProxyPort) <0) + REJECT("Socks4Proxy failed to parse or resolve. Please fix."); + if (options->Socks4ProxyPort == 0) { /* give it a default */ + options->Socks4ProxyPort = 1080; + } + } + + if (options->Socks5Proxy) { /* parse it now */ + if (tor_addr_port_parse(options->Socks5Proxy, + &options->Socks5ProxyAddr, + &options->Socks5ProxyPort) <0) + REJECT("Socks5Proxy failed to parse or resolve. Please fix."); + if (options->Socks5ProxyPort == 0) { /* give it a default */ + options->Socks5ProxyPort = 1080; + } + } + + if (options->Socks4Proxy && options->Socks5Proxy) + REJECT("You cannot specify both Socks4Proxy and SOCKS5Proxy"); + + if (options->Socks5ProxyUsername) { + size_t len; + + len = strlen(options->Socks5ProxyUsername); + if (len < 1 || len > 255) + REJECT("Socks5ProxyUsername must be between 1 and 255 characters."); + + if (!options->Socks5ProxyPassword) + REJECT("Socks5ProxyPassword must be included with Socks5ProxyUsername."); + + len = strlen(options->Socks5ProxyPassword); + if (len < 1 || len > 255) + REJECT("Socks5ProxyPassword must be between 1 and 255 characters."); + } else if (options->Socks5ProxyPassword) + REJECT("Socks5ProxyPassword must be included with Socks5ProxyUsername."); + if (options->HashedControlPassword) { smartlist_t *sl = decode_hashed_passwords(options->HashedControlPassword); if (!sl) { @@ -3235,16 +3470,24 @@ if (!options->HashedControlPassword && !options->HashedControlSessionPassword && !options->CookieAuthentication) { - log_warn(LD_CONFIG, "You have a ControlListenAddress set to accept " - "connections from a non-local address. This means that " - "any program on the internet can reconfigure your Tor. " - "That's so bad that I'm closing your ControlPort for you."); + log_warn(LD_CONFIG, + "You have a ControlListenAddress set to accept " + "unauthenticated connections from a non-local address. " + "This means that programs not running on your computer " + "can reconfigure your Tor, without even having to guess a " + "password. That's so bad that I'm closing your ControlPort " + "for you. If you need to control your Tor remotely, try " + "enabling authentication and using a tool like stunnel or " + "ssh to encrypt remote access."); options->ControlPort = 0; } else { log_warn(LD_CONFIG, "You have a ControlListenAddress set to accept " "connections from a non-local address. This means that " "programs not running on your computer can reconfigure your " - "Tor. That's pretty bad!"); + "Tor. That's pretty bad, since the controller " + "protocol isn't encrypted! Maybe you should just listen on " + "127.0.0.1 and use a tool like stunnel or ssh to encrypt " + "remote connections to your control port."); } } } @@ -3258,21 +3501,16 @@ "upgrade your Tor controller as soon as possible."); } + if (options->CookieAuthFileGroupReadable && !options->CookieAuthFile) { + log_warn(LD_CONFIG, "You set the CookieAuthFileGroupReadable but did " + "not configure a the path for the cookie file via " + "CookieAuthFile. This means your cookie will not be group " + "readable."); + } + if (options->UseEntryGuards && ! options->NumEntryGuards) REJECT("Cannot enable UseEntryGuards with NumEntryGuards set to 0"); - if (check_nickname_list(options->ExitNodes, "ExitNodes", msg)) - return -1; - if (check_nickname_list(options->EntryNodes, "EntryNodes", msg)) - return -1; - if (check_nickname_list(options->ExcludeNodes, "ExcludeNodes", msg)) - return -1; - if (check_nickname_list(options->RendNodes, "RendNodes", msg)) - return -1; - if (check_nickname_list(options->RendNodes, "RendExcludeNodes", msg)) - return -1; - if (check_nickname_list(options->TestVia, "TestVia", msg)) - return -1; if (check_nickname_list(options->MyFamily, "MyFamily", msg)) return -1; for (cl = options->NodeFamilies; cl; cl = cl->next) { @@ -3283,11 +3521,6 @@ if (validate_addr_policies(options, msg) < 0) return -1; - for (cl = options->RedirectExit; cl; cl = cl->next) { - if (parse_redirect_line(NULL, cl, msg)<0) - return -1; - } - if (validate_dir_authorities(options, old_options) < 0) REJECT("Directory authority line did not parse. See logs for details."); @@ -3308,11 +3541,10 @@ if (options->ConstrainedSockSize < MIN_CONSTRAINED_TCP_BUFFER || options->ConstrainedSockSize > MAX_CONSTRAINED_TCP_BUFFER || options->ConstrainedSockSize % 1024) { - r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "ConstrainedSockSize is invalid. Must be a value between %d and %d " "in 1024 byte increments.", MIN_CONSTRAINED_TCP_BUFFER, MAX_CONSTRAINED_TCP_BUFFER); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; } if (options->DirPort) { @@ -3349,12 +3581,23 @@ if (rend_config_services(options, 1) < 0) REJECT("Failed to configure rendezvous options. See logs for details."); + /* Parse client-side authorization for hidden services. */ + if (rend_parse_service_authorization(options, 1) < 0) + REJECT("Failed to configure client authorization for hidden services. " + "See logs for details."); + if (parse_virtual_addr_network(options->VirtualAddrNetwork, 1, NULL)<0) return -1; if (options->PreferTunneledDirConns && !options->TunnelDirConns) REJECT("Must set TunnelDirConns if PreferTunneledDirConns is set."); + if ((options->Socks4Proxy || options->Socks5Proxy) && + !options->HttpProxy && !options->PreferTunneledDirConns) + REJECT("When Socks4Proxy or Socks5Proxy is configured, " + "PreferTunneledDirConns and TunnelDirConns must both be " + "set to 1, or HttpProxy must be configured."); + if (options->AutomapHostsSuffixes) { SMARTLIST_FOREACH(options->AutomapHostsSuffixes, char *, suf, { @@ -3364,6 +3607,96 @@ }); } + if (options->TestingTorNetwork && !options->DirServers) { + REJECT("TestingTorNetwork may only be configured in combination with " + "a non-default set of DirServers."); + } + + /*XXXX022 checking for defaults manually like this is a bit fragile.*/ + + /* Keep changes to hard-coded values synchronous to man page and default + * values table. */ + if (options->TestingV3AuthInitialVotingInterval != 30*60 && + !options->TestingTorNetwork) { + REJECT("TestingV3AuthInitialVotingInterval may only be changed in testing " + "Tor networks!"); + } else if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) { + REJECT("TestingV3AuthInitialVotingInterval is insanely low."); + } else if (((30*60) % options->TestingV3AuthInitialVotingInterval) != 0) { + REJECT("TestingV3AuthInitialVotingInterval does not divide evenly into " + "30 minutes."); + } + + if (options->TestingV3AuthInitialVoteDelay != 5*60 && + !options->TestingTorNetwork) { + REJECT("TestingV3AuthInitialVoteDelay may only be changed in testing " + "Tor networks!"); + } else if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) { + REJECT("TestingV3AuthInitialVoteDelay is way too low."); + } + + if (options->TestingV3AuthInitialDistDelay != 5*60 && + !options->TestingTorNetwork) { + REJECT("TestingV3AuthInitialDistDelay may only be changed in testing " + "Tor networks!"); + } else if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) { + REJECT("TestingV3AuthInitialDistDelay is way too low."); + } + + if (options->TestingV3AuthInitialVoteDelay + + options->TestingV3AuthInitialDistDelay >= + options->TestingV3AuthInitialVotingInterval/2) { + REJECT("TestingV3AuthInitialVoteDelay plus TestingV3AuthInitialDistDelay " + "must be less than half TestingV3AuthInitialVotingInterval"); + } + + if (options->TestingAuthDirTimeToLearnReachability != 30*60 && + !options->TestingTorNetwork) { + REJECT("TestingAuthDirTimeToLearnReachability may only be changed in " + "testing Tor networks!"); + } else if (options->TestingAuthDirTimeToLearnReachability < 0) { + REJECT("TestingAuthDirTimeToLearnReachability must be non-negative."); + } else if (options->TestingAuthDirTimeToLearnReachability > 2*60*60) { + COMPLAIN("TestingAuthDirTimeToLearnReachability is insanely high."); + } + + if (options->TestingEstimatedDescriptorPropagationTime != 10*60 && + !options->TestingTorNetwork) { + REJECT("TestingEstimatedDescriptorPropagationTime may only be changed in " + "testing Tor networks!"); + } else if (options->TestingEstimatedDescriptorPropagationTime < 0) { + REJECT("TestingEstimatedDescriptorPropagationTime must be non-negative."); + } else if (options->TestingEstimatedDescriptorPropagationTime > 60*60) { + COMPLAIN("TestingEstimatedDescriptorPropagationTime is insanely high."); + } + + if (options->TestingTorNetwork) { + log_warn(LD_CONFIG, "TestingTorNetwork is set. This will make your node " + "almost unusable in the public Tor network, and is " + "therefore only advised if you are building a " + "testing Tor network!"); + } + + if (options->AccelName && !options->HardwareAccel) + options->HardwareAccel = 1; + if (options->AccelDir && !options->AccelName) + REJECT("Can't use hardware crypto accelerator dir without engine name."); + + if (options->PublishServerDescriptor) + SMARTLIST_FOREACH(options->PublishServerDescriptor, const char *, pubdes, { + if (!strcmp(pubdes, "1") || !strcmp(pubdes, "0")) + if (smartlist_len(options->PublishServerDescriptor) > 1) { + COMPLAIN("You have passed a list of multiple arguments to the " + "PublishServerDescriptor option that includes 0 or 1. " + "0 or 1 should only be used as the sole argument. " + "This configuration will be rejected in a future release."); + break; + } + }); + + if (options->BridgeRelay == 1 && options->ORPort == 0) + REJECT("BridgeRelay is 1, ORPort is 0. This is an invalid combination."); + return 0; #undef REJECT #undef COMPLAIN @@ -3402,12 +3735,10 @@ } if (strcmp(old->DataDirectory,new_val->DataDirectory)!=0) { - char buf[1024]; - int r = tor_snprintf(buf, sizeof(buf), + tor_asprintf(msg, "While Tor is running, changing DataDirectory " "(\"%s\"->\"%s\") is not allowed.", old->DataDirectory, new_val->DataDirectory); - *msg = tor_strdup(r >= 0 ? buf : "internal error"); return -1; } @@ -3416,14 +3747,23 @@ return -1; } - if (!opt_streq(old->Group, new_val->Group)) { - *msg = tor_strdup("While Tor is running, changing Group is not allowed."); + if ((old->HardwareAccel != new_val->HardwareAccel) + || !opt_streq(old->AccelName, new_val->AccelName) + || !opt_streq(old->AccelDir, new_val->AccelDir)) { + *msg = tor_strdup("While Tor is running, changing OpenSSL hardware " + "acceleration engine is not allowed."); + return -1; + } + + if (old->TestingTorNetwork != new_val->TestingTorNetwork) { + *msg = tor_strdup("While Tor is running, changing TestingTorNetwork " + "is not allowed."); return -1; } - if (old->HardwareAccel != new_val->HardwareAccel) { - *msg = tor_strdup("While Tor is running, changing HardwareAccel is " - "not allowed."); + if (old->DisableAllSwap != new_val->DisableAllSwap) { + *msg = tor_strdup("While Tor is running, changing DisableAllSwap " + "is not allowed."); return -1; } @@ -3431,7 +3771,7 @@ } /** Return 1 if any change from old_options to new_options - * will require us to rotate the cpu and dns workers; else return 0. */ + * will require us to rotate the CPU and DNS workers; else return 0. */ static int options_transition_affects_workers(or_options_t *old_options, or_options_t *new_options) @@ -3458,6 +3798,8 @@ options_transition_affects_descriptor(or_options_t *old_options, or_options_t *new_options) { + /* XXX We can be smarter here. If your DirPort isn't being + * published and you just turned it off, no need to republish. Etc. */ if (!opt_streq(old_options->DataDirectory, new_options->DataDirectory) || !opt_streq(old_options->Nickname,new_options->Nickname) || !opt_streq(old_options->Address,new_options->Address) || @@ -3470,10 +3812,9 @@ old_options->NoPublish != new_options->NoPublish || old_options->_PublishServerDescriptor != new_options->_PublishServerDescriptor || - old_options->BandwidthRate != new_options->BandwidthRate || - old_options->BandwidthBurst != new_options->BandwidthBurst || - old_options->MaxAdvertisedBandwidth != - new_options->MaxAdvertisedBandwidth || + get_effective_bwrate(old_options) != get_effective_bwrate(new_options) || + get_effective_bwburst(old_options) != + get_effective_bwburst(new_options) || !opt_streq(old_options->ContactInfo, new_options->ContactInfo) || !opt_streq(old_options->MyFamily, new_options->MyFamily) || !opt_streq(old_options->AccountingStart, new_options->AccountingStart) || @@ -3491,6 +3832,7 @@ { static int is_set = 0; static char path[MAX_PATH+1]; + TCHAR tpath[MAX_PATH] = {0}; LPITEMIDLIST idl; IMalloc *m; @@ -3502,9 +3844,13 @@ /* Find X:\documents and settings\username\application data\ . * We would use SHGetSpecialFolder path, but that wasn't added until IE4. */ - if (!SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, - &idl))) { - GetCurrentDirectory(MAX_PATH, path); +#ifdef ENABLE_LOCAL_APPDATA +#define APPDATA_PATH CSIDL_LOCAL_APPDATA +#else +#define APPDATA_PATH CSIDL_APPDATA +#endif + if (!SUCCEEDED(SHGetSpecialFolderLocation(NULL, APPDATA_PATH, &idl))) { + getcwd(path,MAX_PATH); is_set = 1; log_warn(LD_CONFIG, "I couldn't find your application data folder: are you " @@ -3513,8 +3859,15 @@ return path; } /* Convert the path from an "ID List" (whatever that is!) to a path. */ - result = SHGetPathFromIDList(idl, path); - /* Now we need to free the */ + result = SHGetPathFromIDList(idl, tpath); +#ifdef UNICODE + wcstombs(path,tpath,MAX_PATH); +#else + strlcpy(path,tpath,sizeof(path)); +#endif + + /* Now we need to free the memory that the path-idl was stored in. In + * typical Windows fashion, we can't just call 'free()' on it. */ SHGetMalloc(&m); if (m) { m->lpVtbl->Free(m, idl); @@ -3543,7 +3896,7 @@ #endif } -/** Verify whether lst is a string containing valid-looking space-separated +/** Verify whether lst is a string containing valid-looking comma-separated * nicknames, or NULL. Return 0 on success. Warn and return -1 on failure. */ static int @@ -3555,14 +3908,14 @@ if (!lst) return 0; sl = smartlist_create(); - smartlist_split_string(sl, lst, ",", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + + smartlist_split_string(sl, lst, ",", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK|SPLIT_STRIP_SPACE, 0); + SMARTLIST_FOREACH(sl, const char *, s, { if (!is_legal_nickname_or_hexdigest(s)) { - char buf[1024]; - int tmp = tor_snprintf(buf, sizeof(buf), - "Invalid nickname '%s' in %s line", s, name); - *msg = tor_strdup(tmp >= 0 ? buf : "internal error"); + tor_asprintf(msg, "Invalid nickname '%s' in %s line", s, name); r = -1; break; } @@ -3572,88 +3925,29 @@ return r; } -/** Read a configuration file into options, finding the configuration - * file location based on the command line. After loading the options, - * validate them for consistency, then take actions based on them. - * Return 0 if success, -1 if failure. */ -int -options_init_from_torrc(int argc, char **argv) +/** Learn config file name from command line arguments, or use the default */ +static char * +find_torrc_filename(int argc, char **argv, + int *using_default_torrc, int *ignore_missing_torrc) { - or_options_t *oldoptions, *newoptions; - config_line_t *cl; - char *cf=NULL, *fname=NULL, *errmsg=NULL; - int i, retval; - int using_default_torrc; - int ignore_missing_torrc; - int ignore_torrc = 0; - static char **backup_argv; - static int backup_argc; - - if (argv) { /* first time we're called. save commandline args */ - backup_argv = argv; - backup_argc = argc; - oldoptions = NULL; - } else { /* we're reloading. need to clean up old options first. */ - argv = backup_argv; - argc = backup_argc; - oldoptions = get_options(); - } - if (argc > 1 && (!strcmp(argv[1], "-h") || !strcmp(argv[1],"--help"))) { - print_usage(); - exit(0); - } - if (argc > 1 && !strcmp(argv[1], "--list-torrc-options")) { - /* For documenting validating whether we've documented everything. */ - list_torrc_options(); - exit(0); - } - - if (argc > 1 && (!strcmp(argv[1],"--version"))) { - printf("Tor version %s.\n",get_version()); - if (argc > 2 && (!strcmp(argv[2],"--version"))) { - print_svn_version(); - } - exit(0); - } - - newoptions = tor_malloc_zero(sizeof(or_options_t)); - newoptions->_magic = OR_OPTIONS_MAGIC; - options_init(newoptions); + char *fname=NULL; + int i; - /* learn config file name */ - fname = NULL; - using_default_torrc = 1; - ignore_missing_torrc = 0; - newoptions->command = CMD_RUN_TOR; for (i = 1; i < argc; ++i) { if (i < argc-1 && !strcmp(argv[i],"-f")) { if (fname) { log(LOG_WARN, LD_CONFIG, "Duplicate -f options on command line."); tor_free(fname); } -#ifdef MS_WINDOWS - /* XXX one day we might want to extend expand_filename to work - * under Windows as well. */ - fname = tor_strdup(argv[i+1]); -#else fname = expand_filename(argv[i+1]); -#endif - using_default_torrc = 0; + *using_default_torrc = 0; ++i; } else if (!strcmp(argv[i],"--ignore-missing-torrc")) { - ignore_missing_torrc = 1; - } else if (!strcmp(argv[i],"--list-fingerprint")) { - newoptions->command = CMD_LIST_FINGERPRINT; - } else if (!strcmp(argv[i],"--hash-password")) { - newoptions->command = CMD_HASH_PASSWORD; - newoptions->command_arg = tor_strdup( (i < argc-1) ? argv[i+1] : ""); - ++i; - ignore_torrc = 1; - } else if (!strcmp(argv[i],"--verify-config")) { - newoptions->command = CMD_VERIFY_CONFIG; + *ignore_missing_torrc = 1; } } - if (using_default_torrc && !ignore_torrc) { + + if (*using_default_torrc) { /* didn't find one, try CONFDIR */ const char *dflt = get_default_conf_file(); if (dflt && file_status(dflt) == FN_FILE) { @@ -3673,69 +3967,262 @@ #endif } } - if (!ignore_torrc) { - tor_assert(fname); - log(LOG_DEBUG, LD_CONFIG, "Opening config file \"%s\"", fname); + return fname; +} - tor_free(torrc_fname); - torrc_fname = fname; - } +/** Load torrc from disk, setting torrc_fname if successful */ +static char * +load_torrc_from_disk(int argc, char **argv) +{ + char *fname=NULL; + char *cf = NULL; + int using_default_torrc = 1; + int ignore_missing_torrc = 0; + + fname = find_torrc_filename(argc, argv, + &using_default_torrc, &ignore_missing_torrc); + tor_assert(fname); + log(LOG_DEBUG, LD_CONFIG, "Opening config file \"%s\"", fname); - /* get config lines, assign them */ - if (ignore_torrc) { - cf = tor_strdup(""); - } else if (file_status(fname) != FN_FILE || + tor_free(torrc_fname); + torrc_fname = fname; + + /* Open config file */ + if (file_status(fname) != FN_FILE || !(cf = read_file_to_str(fname,0,NULL))) { - if (using_default_torrc == 1 || ignore_missing_torrc) { + if (using_default_torrc == 1 || ignore_missing_torrc ) { log(LOG_NOTICE, LD_CONFIG, "Configuration file \"%s\" not present, " "using reasonable defaults.", fname); tor_free(fname); /* sets fname to NULL */ torrc_fname = NULL; + cf = tor_strdup(""); } else { log(LOG_WARN, LD_CONFIG, "Unable to open configuration file \"%s\".", fname); goto err; } } - if (cf) { /* It opened successfully. use it. */ - retval = config_get_lines(cf, &cl); - tor_free(cf); - if (retval < 0) + + return cf; + err: + tor_free(fname); + torrc_fname = NULL; + return NULL; +} + +/** Read a configuration file into options, finding the configuration + * file location based on the command line. After loading the file + * call options_init_from_string() to load the config. + * Return 0 if success, -1 if failure. */ +int +options_init_from_torrc(int argc, char **argv) +{ + char *cf=NULL; + int i, retval, command; + static char **backup_argv; + static int backup_argc; + char *command_arg = NULL; + char *errmsg=NULL; + + if (argv) { /* first time we're called. save command line args */ + backup_argv = argv; + backup_argc = argc; + } else { /* we're reloading. need to clean up old options first. */ + argv = backup_argv; + argc = backup_argc; + } + if (argc > 1 && (!strcmp(argv[1], "-h") || !strcmp(argv[1],"--help"))) { + print_usage(); + exit(0); + } + if (argc > 1 && !strcmp(argv[1], "--list-torrc-options")) { + /* For documenting validating whether we've documented everything. */ + list_torrc_options(); + exit(0); + } + + if (argc > 1 && (!strcmp(argv[1],"--version"))) { + printf("Tor version %s.\n",get_version()); + exit(0); + } + if (argc > 1 && (!strcmp(argv[1],"--digests"))) { + printf("Tor version %s.\n",get_version()); + printf("%s", libor_get_digests()); + printf("%s", tor_get_digests()); + exit(0); + } + + /* Go through command-line variables */ + if (!global_cmdline_options) { + /* Or we could redo the list every time we pass this place. + * It does not really matter */ + if (config_get_commandlines(argc, argv, &global_cmdline_options) < 0) { goto err; - retval = config_assign(&options_format, newoptions, cl, 0, 0, &errmsg); - config_free_lines(cl); - if (retval < 0) + } + } + + command = CMD_RUN_TOR; + for (i = 1; i < argc; ++i) { + if (!strcmp(argv[i],"--list-fingerprint")) { + command = CMD_LIST_FINGERPRINT; + } else if (!strcmp(argv[i],"--hash-password")) { + command = CMD_HASH_PASSWORD; + command_arg = tor_strdup( (i < argc-1) ? argv[i+1] : ""); + ++i; + } else if (!strcmp(argv[i],"--verify-config")) { + command = CMD_VERIFY_CONFIG; + } + } + + if (command == CMD_HASH_PASSWORD) { + cf = tor_strdup(""); + } else { + cf = load_torrc_from_disk(argc, argv); + if (!cf) goto err; } - /* Go through command-line variables too */ - if (config_get_commandlines(argc, argv, &cl) < 0) + retval = options_init_from_string(cf, command, command_arg, &errmsg); + tor_free(cf); + if (retval < 0) + goto err; + + return 0; + + err: + if (errmsg) { + log(LOG_WARN,LD_CONFIG,"%s", errmsg); + tor_free(errmsg); + } + return -1; +} + +/** Load the options from the configuration in cf, validate + * them for consistency and take actions based on them. + * + * Return 0 if success, negative on error: + * * -1 for general errors. + * * -2 for failure to parse/validate, + * * -3 for transition not allowed + * * -4 for error while setting the new options + */ +setopt_err_t +options_init_from_string(const char *cf, + int command, const char *command_arg, + char **msg) +{ + or_options_t *oldoptions, *newoptions; + config_line_t *cl; + int retval; + setopt_err_t err = SETOPT_ERR_MISC; + tor_assert(msg); + + oldoptions = global_options; /* get_options unfortunately asserts if + this is the first time we run*/ + + newoptions = tor_malloc_zero(sizeof(or_options_t)); + newoptions->_magic = OR_OPTIONS_MAGIC; + options_init(newoptions); + newoptions->command = command; + newoptions->command_arg = command_arg; + + /* get config lines, assign them */ + retval = config_get_lines(cf, &cl); + if (retval < 0) { + err = SETOPT_ERR_PARSE; goto err; - retval = config_assign(&options_format, newoptions, cl, 0, 0, &errmsg); + } + retval = config_assign(&options_format, newoptions, cl, 0, 0, msg); config_free_lines(cl); - if (retval < 0) + if (retval < 0) { + err = SETOPT_ERR_PARSE; + goto err; + } + + /* Go through command-line variables too */ + retval = config_assign(&options_format, newoptions, + global_cmdline_options, 0, 0, msg); + if (retval < 0) { + err = SETOPT_ERR_PARSE; goto err; + } + + /* If this is a testing network configuration, change defaults + * for a list of dependent config options, re-initialize newoptions + * with the new defaults, and assign all options to it second time. */ + if (newoptions->TestingTorNetwork) { + /* XXXX this is a bit of a kludge. perhaps there's a better way to do + * this? We could, for example, make the parsing algorithm do two passes + * over the configuration. If it finds any "suite" options like + * TestingTorNetwork, it could change the defaults before its second pass. + * Not urgent so long as this seems to work, but at any sign of trouble, + * let's clean it up. -NM */ + + /* Change defaults. */ + int i; + for (i = 0; testing_tor_network_defaults[i].name; ++i) { + config_var_t *new_var = &testing_tor_network_defaults[i]; + config_var_t *old_var = + config_find_option(&options_format, new_var->name); + tor_assert(new_var); + tor_assert(old_var); + old_var->initvalue = new_var->initvalue; + } + + /* Clear newoptions and re-initialize them with new defaults. */ + config_free(&options_format, newoptions); + newoptions = tor_malloc_zero(sizeof(or_options_t)); + newoptions->_magic = OR_OPTIONS_MAGIC; + options_init(newoptions); + newoptions->command = command; + newoptions->command_arg = command_arg; + + /* Assign all options a second time. */ + retval = config_get_lines(cf, &cl); + if (retval < 0) { + err = SETOPT_ERR_PARSE; + goto err; + } + retval = config_assign(&options_format, newoptions, cl, 0, 0, msg); + config_free_lines(cl); + if (retval < 0) { + err = SETOPT_ERR_PARSE; + goto err; + } + retval = config_assign(&options_format, newoptions, + global_cmdline_options, 0, 0, msg); + if (retval < 0) { + err = SETOPT_ERR_PARSE; + goto err; + } + } /* Validate newoptions */ - if (options_validate(oldoptions, newoptions, 0, &errmsg) < 0) + if (options_validate(oldoptions, newoptions, 0, msg) < 0) { + err = SETOPT_ERR_PARSE; /*XXX make this a separate return value.*/ goto err; + } - if (options_transition_allowed(oldoptions, newoptions, &errmsg) < 0) + if (options_transition_allowed(oldoptions, newoptions, msg) < 0) { + err = SETOPT_ERR_TRANSITION; goto err; + } - if (set_options(newoptions, &errmsg)) + if (set_options(newoptions, msg)) { + err = SETOPT_ERR_SETTING; goto err; /* frees and replaces old options */ + } + + return SETOPT_OK; - return 0; err: - tor_free(fname); - torrc_fname = NULL; config_free(&options_format, newoptions); - if (errmsg) { - log(LOG_WARN,LD_CONFIG,"Failed to parse/validate config: %s", errmsg); - tor_free(errmsg); + if (*msg) { + char *old_msg = *msg; + tor_asprintf(msg, "Failed to parse/validate config: %s", old_msg); + tor_free(old_msg); } - return -1; + return err; } /** Return the location for our configuration file. @@ -3749,7 +4236,7 @@ return get_default_conf_file(); } -/** Adjust the address map mased on the MapAddress elements in the +/** Adjust the address map based on the MapAddress elements in the * configuration options */ static void @@ -3786,58 +4273,6 @@ smartlist_free(elts); } -/** If range is of the form MIN-MAX, for MIN and MAX both - * recognized log severity levels, set *min_out to MIN and - * *max_out to MAX and return 0. Else, if range is of - * the form MIN, act as if MIN-err had been specified. Else, warn and - * return -1. - */ -static int -parse_log_severity_range(const char *range, int *min_out, int *max_out) -{ - int levelMin, levelMax; - const char *cp; - cp = strchr(range, '-'); - if (cp) { - if (cp == range) { - levelMin = LOG_DEBUG; - } else { - char *tmp_sev = tor_strndup(range, cp - range); - levelMin = parse_log_level(tmp_sev); - if (levelMin < 0) { - log_warn(LD_CONFIG, "Unrecognized minimum log severity '%s': must be " - "one of err|warn|notice|info|debug", tmp_sev); - tor_free(tmp_sev); - return -1; - } - tor_free(tmp_sev); - } - if (!*(cp+1)) { - levelMax = LOG_ERR; - } else { - levelMax = parse_log_level(cp+1); - if (levelMax < 0) { - log_warn(LD_CONFIG, "Unrecognized maximum log severity '%s': must be " - "one of err|warn|notice|info|debug", cp+1); - return -1; - } - } - } else { - levelMin = parse_log_level(range); - if (levelMin < 0) { - log_warn(LD_CONFIG, "Unrecognized log severity '%s': must be one of " - "err|warn|notice|info|debug", range); - return -1; - } - levelMax = LOG_ERR; - } - - *min_out = levelMin; - *max_out = levelMax; - - return 0; -} - /** * Initialize the logs based on the configuration file. */ @@ -3858,36 +4293,54 @@ elts = smartlist_create(); for (opt = options->Logs; opt; opt = opt->next) { - int levelMin=LOG_DEBUG, levelMax=LOG_ERR; - smartlist_split_string(elts, opt->value, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3); - if (smartlist_len(elts) == 0) { - log_warn(LD_CONFIG, "No arguments to Log option 'Log %s'", opt->value); - ok = 0; goto cleanup; - } - if (parse_log_severity_range(smartlist_get(elts,0), &levelMin, - &levelMax)) { + log_severity_list_t *severity; + const char *cfg = opt->value; + severity = tor_malloc_zero(sizeof(log_severity_list_t)); + if (parse_log_severity_config(&cfg, severity) < 0) { + log_warn(LD_CONFIG, "Couldn't parse log levels in Log option 'Log %s'", + opt->value); ok = 0; goto cleanup; } - if (smartlist_len(elts) < 2) { /* only loglevels were provided */ + + smartlist_split_string(elts, cfg, NULL, + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); + + if (smartlist_len(elts) == 0) + smartlist_add(elts, tor_strdup("stdout")); + + if (smartlist_len(elts) == 1 && + (!strcasecmp(smartlist_get(elts,0), "stdout") || + !strcasecmp(smartlist_get(elts,0), "stderr"))) { + int err = smartlist_len(elts) && + !strcasecmp(smartlist_get(elts,0), "stderr"); if (!validate_only) { if (daemon) { log_warn(LD_CONFIG, - "Can't log to stdout with RunAsDaemon set; skipping stdout"); + "Can't log to %s with RunAsDaemon set; skipping stdout", + err?"stderr":"stdout"); } else { - add_stream_log(levelMin, levelMax, "", stdout); + add_stream_log(severity, err?"":"", + fileno(err?stderr:stdout)); } } goto cleanup; } - if (!strcasecmp(smartlist_get(elts,1), "file")) { - if (smartlist_len(elts) != 3) { - log_warn(LD_CONFIG, "Bad syntax on file Log option 'Log %s'", - opt->value); - ok = 0; goto cleanup; + if (smartlist_len(elts) == 1 && + !strcasecmp(smartlist_get(elts,0), "syslog")) { +#ifdef HAVE_SYSLOG_H + if (!validate_only) { + add_syslog_log(severity); } +#else + log_warn(LD_CONFIG, "Syslog is not supported on this system. Sorry."); +#endif + goto cleanup; + } + + if (smartlist_len(elts) == 2 && + !strcasecmp(smartlist_get(elts,0), "file")) { if (!validate_only) { - if (add_file_log(levelMin, levelMax, smartlist_get(elts, 2)) < 0) { + if (add_file_log(severity, smartlist_get(elts, 1)) < 0) { log_warn(LD_CONFIG, "Couldn't open file for 'Log %s': %s", opt->value, strerror(errno)); ok = 0; @@ -3895,111 +4348,21 @@ } goto cleanup; } - if (smartlist_len(elts) != 2) { - log_warn(LD_CONFIG, "Wrong number of arguments on Log option 'Log %s'", - opt->value); - ok = 0; goto cleanup; - } - if (!strcasecmp(smartlist_get(elts,1), "stdout")) { - /* Starting in 0.2.1.x, we will just decline to open the log file - * to stdout, rather than failing the whole program. But I'm leaving - * this intact for here so we can stabilize 0.2.0.x. -RD */ - if (daemon) { - log_warn(LD_CONFIG, "Can't log to stdout with RunAsDaemon set."); - ok = 0; goto cleanup; - } - if (!validate_only) { - add_stream_log(levelMin, levelMax, "", stdout); - } - } else if (!strcasecmp(smartlist_get(elts,1), "stderr")) { - if (daemon) { - log_warn(LD_CONFIG, "Can't log to stderr with RunAsDaemon set."); - ok = 0; goto cleanup; - } - if (!validate_only) { - add_stream_log(levelMin, levelMax, "", stderr); - } - } else if (!strcasecmp(smartlist_get(elts,1), "syslog")) { -#ifdef HAVE_SYSLOG_H - if (!validate_only) - add_syslog_log(levelMin, levelMax); -#else - log_warn(LD_CONFIG, "Syslog is not supported on this system. Sorry."); -#endif - } else { - log_warn(LD_CONFIG, "Unrecognized log type %s", - (const char*)smartlist_get(elts,1)); - if (strchr(smartlist_get(elts,1), '/') || - strchr(smartlist_get(elts,1), '\\')) { - log_warn(LD_CONFIG, "Did you mean to say 'Log %s file %s' ?", - (const char *)smartlist_get(elts,0), - (const char *)smartlist_get(elts,1)); - } - ok = 0; goto cleanup; - } + + log_warn(LD_CONFIG, "Bad syntax on file Log option 'Log %s'", + opt->value); + ok = 0; goto cleanup; + cleanup: SMARTLIST_FOREACH(elts, char*, cp, tor_free(cp)); smartlist_clear(elts); + tor_free(severity); } smartlist_free(elts); return ok?0:-1; } -/** Parse a single RedirectExit line's contents from line. If - * they are valid, and result is not NULL, add an element to - * result and return 0. Else if they are valid, return 0. - * Else set *msg and return -1. */ -static int -parse_redirect_line(smartlist_t *result, config_line_t *line, char **msg) -{ - smartlist_t *elements = NULL; - exit_redirect_t *r; - - tor_assert(line); - - r = tor_malloc_zero(sizeof(exit_redirect_t)); - elements = smartlist_create(); - smartlist_split_string(elements, line->value, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - if (smartlist_len(elements) != 2) { - *msg = tor_strdup("Wrong number of elements in RedirectExit line"); - goto err; - } - if (parse_addr_and_port_range(smartlist_get(elements,0),&r->addr, - &r->maskbits,&r->port_min,&r->port_max)) { - *msg = tor_strdup("Error parsing source address in RedirectExit line"); - goto err; - } - if (0==strcasecmp(smartlist_get(elements,1), "pass")) { - r->is_redirect = 0; - } else { - if (parse_addr_port(LOG_WARN, smartlist_get(elements,1),NULL, - &r->addr_dest, &r->port_dest)) { - *msg = tor_strdup("Error parsing dest address in RedirectExit line"); - goto err; - } - r->is_redirect = 1; - } - - goto done; - err: - tor_free(r); - done: - SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); - smartlist_free(elements); - if (r) { - if (result) - smartlist_add(result, r); - else - tor_free(r); - return 0; - } else { - tor_assert(*msg); - return -1; - } -} - /** Read the contents of a Bridge line from line. Return 0 * if the line is well-formed, and -1 if it isn't. If * validate_only is 0, and the line is well-formed, then add @@ -4009,8 +4372,8 @@ { smartlist_t *items = NULL; int r; - char *addrport=NULL, *address=NULL, *fingerprint=NULL; - uint32_t addr = 0; + char *addrport=NULL, *fingerprint=NULL; + tor_addr_t addr; uint16_t port = 0; char digest[DIGEST_LEN]; @@ -4023,13 +4386,15 @@ } addrport = smartlist_get(items, 0); smartlist_del_keeporder(items, 0); - if (parse_addr_port(LOG_WARN, addrport, &address, &addr, &port)<0) { + if (tor_addr_port_parse(addrport, &addr, &port)<0) { log_warn(LD_CONFIG, "Error parsing Bridge address '%s'", addrport); goto err; } if (!port) { - log_warn(LD_CONFIG, "Missing port in Bridge address '%s'",addrport); - goto err; + log_info(LD_CONFIG, + "Bridge address '%s' has no port; using default port 443.", + addrport); + port = 443; } if (smartlist_len(items)) { @@ -4045,10 +4410,10 @@ } if (!validate_only) { - log_debug(LD_DIR, "Bridge at %s:%d (%s)", address, + log_debug(LD_DIR, "Bridge at %s:%d (%s)", fmt_addr(&addr), (int)port, fingerprint ? fingerprint : "no key listed"); - bridge_add_from_config(addr, port, fingerprint ? digest : NULL); + bridge_add_from_config(&addr, port, fingerprint ? digest : NULL); } r = 0; @@ -4061,7 +4426,6 @@ SMARTLIST_FOREACH(items, char*, s, tor_free(s)); smartlist_free(items); tor_free(addrport); - tor_free(address); tor_free(fingerprint); return r; } @@ -4244,7 +4608,7 @@ } /** Check and normalize the value of options->DataDirectory; return 0 if it - * sane, -1 otherwise. */ + * is sane, -1 otherwise. */ static int validate_data_directory(or_options_t *options) { @@ -4276,26 +4640,25 @@ { char *old_val=NULL, *new_val=NULL, *new_conf=NULL; int rename_old = 0, r; - size_t len; - if (fname) { - switch (file_status(fname)) { - case FN_FILE: - old_val = read_file_to_str(fname, 0, NULL); - if (strcmpstart(old_val, GENERATED_FILE_PREFIX)) { - rename_old = 1; - } - tor_free(old_val); - break; - case FN_NOENT: - break; - case FN_ERROR: - case FN_DIR: - default: - log_warn(LD_CONFIG, - "Config file \"%s\" is not a file? Failing.", fname); - return -1; - } + tor_assert(fname); + + switch (file_status(fname)) { + case FN_FILE: + old_val = read_file_to_str(fname, 0, NULL); + if (strcmpstart(old_val, GENERATED_FILE_PREFIX)) { + rename_old = 1; + } + tor_free(old_val); + break; + case FN_NOENT: + break; + case FN_ERROR: + case FN_DIR: + default: + log_warn(LD_CONFIG, + "Config file \"%s\" is not a file? Failing.", fname); + return -1; } if (!(new_conf = options_dump(options, 1))) { @@ -4303,9 +4666,7 @@ goto err; } - len = strlen(new_conf)+256; - new_val = tor_malloc(len); - tor_snprintf(new_val, len, "%s\n%s\n\n%s", + tor_asprintf(&new_val, "%s\n%s\n\n%s", GENERATED_FILE_PREFIX, GENERATED_FILE_COMMENT, new_conf); if (rename_old) { @@ -4355,15 +4716,12 @@ int options_save_current(void) { - if (torrc_fname) { - /* This fails if we can't write to our configuration file. - * - * If we try falling back to datadirectory or something, we have a better - * chance of saving the configuration, but a better chance of doing - * something the user never expected. Let's just warn instead. */ - return write_configuration_file(torrc_fname, get_options()); - } - return write_configuration_file(get_default_conf_file(), get_options()); + /* This fails if we can't write to our configuration file. + * + * If we try falling back to datadirectory or something, we have a better + * chance of saving the configuration, but a better chance of doing + * something the user never expected. */ + return write_configuration_file(get_torrc_fname(), get_options()); } /** Mapping from a unit name to a multiplier for converting that unit into a @@ -4373,6 +4731,8 @@ uint64_t multiplier; }; +/** Table to map the names of memory units to the number of bytes they + * contain. */ static struct unit_table_t memory_units[] = { { "", 1 }, { "b", 1<< 0 }, @@ -4400,6 +4760,8 @@ { NULL, 0 }, }; +/** Table to map the names of time units to the number of seconds they + * contain. */ static struct unit_table_t time_units[] = { { "", 1 }, { "second", 1 }, @@ -4424,30 +4786,47 @@ static uint64_t config_parse_units(const char *val, struct unit_table_t *u, int *ok) { - uint64_t v; + uint64_t v = 0; + double d = 0; + int use_float = 0; char *cp; tor_assert(ok); v = tor_parse_uint64(val, 10, 0, UINT64_MAX, ok, &cp); - if (!*ok) - return 0; + if (!*ok || (cp && *cp == '.')) { + d = tor_parse_double(val, 0, UINT64_MAX, ok, &cp); + if (!*ok) + goto done; + use_float = 1; + } + if (!cp) { *ok = 1; - return v; + v = use_float ? DBL_TO_U64(d) : v; + goto done; } - while (TOR_ISSPACE(*cp)) - ++cp; + + cp = (char*) eat_whitespace(cp); + for ( ;u->unit;++u) { if (!strcasecmp(u->unit, cp)) { - v *= u->multiplier; + if (use_float) + v = u->multiplier * d; + else + v *= u->multiplier; *ok = 1; - return v; + goto done; } } log_warn(LD_CONFIG, "Unknown unit '%s'.", cp); *ok = 0; - return 0; + done: + + if (*ok) + return v; + else + return 0; } /** Parse a string in the format "number unit", where unit is a unit of @@ -4457,7 +4836,8 @@ static uint64_t config_parse_memunit(const char *s, int *ok) { - return config_parse_units(s, memory_units, ok); + uint64_t u = config_parse_units(s, memory_units, ok); + return u; } /** Parse a string in the format "number unit", where unit is a unit of time. @@ -4485,166 +4865,31 @@ static void init_libevent(void) { + const char *badness=NULL; + configure_libevent_logging(); /* If the kernel complains that some method (say, epoll) doesn't * exist, we don't care about it, since libevent will cope. */ suppress_libevent_log_msg("Function not implemented"); -#ifdef __APPLE__ - if (decode_libevent_version() < LE_11B) { - setenv("EVENT_NOKQUEUE","1",1); - } -#endif - event_init(); - suppress_libevent_log_msg(NULL); -#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD) - /* Making this a NOTICE for now so we can link bugs to a libevent versions - * or methods better. */ - log(LOG_NOTICE, LD_GENERAL, - "Initialized libevent version %s using method %s. Good.", - event_get_version(), event_get_method()); - check_libevent_version(event_get_method(), get_options()->ORPort != 0); -#else - log(LOG_NOTICE, LD_GENERAL, - "Initialized old libevent (version 1.0b or earlier)."); - log(LOG_WARN, LD_GENERAL, - "You have a *VERY* old version of libevent. It is likely to be buggy; " - "please build Tor with a more recent version."); -#endif -} -#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD) -/** Table mapping return value of event_get_version() to le_version_t. */ -static const struct { - const char *name; le_version_t version; -} le_version_table[] = { - /* earlier versions don't have get_version. */ - { "1.0c", LE_10C }, - { "1.0d", LE_10D }, - { "1.0e", LE_10E }, - { "1.1", LE_11 }, - { "1.1a", LE_11A }, - { "1.1b", LE_11B }, - { "1.2", LE_12 }, - { "1.2a", LE_12A }, - { "1.3", LE_13 }, - { "1.3a", LE_13A }, - { "1.3b", LE_13B }, - { "1.3c", LE_13C }, - { "1.3d", LE_13D }, - { NULL, LE_OTHER } -}; + tor_check_libevent_header_compatibility(); -/** Return the le_version_t for the current version of libevent. If the - * version is very new, return LE_OTHER. If the version is so old that it - * doesn't support event_get_version(), return LE_OLD. */ -static le_version_t -decode_libevent_version(void) -{ - const char *v = event_get_version(); - int i; - for (i=0; le_version_table[i].name; ++i) { - if (!strcmp(le_version_table[i].name, v)) { - return le_version_table[i].version; - } - } - return LE_OTHER; -} + tor_libevent_initialize(); -/** - * Compare the given libevent method and version to a list of versions - * which are known not to work. Warn the user as appropriate. - */ -static void -check_libevent_version(const char *m, int server) -{ - int buggy = 0, iffy = 0, slow = 0, thread_unsafe = 0; - le_version_t version; - const char *v = event_get_version(); - const char *badness = NULL; - const char *sad_os = ""; - - version = decode_libevent_version(); - - /* XXX Would it be worthwhile disabling the methods that we know - * are buggy, rather than just warning about them and then proceeding - * to use them? If so, we should probably not wrap this whole thing - * in HAVE_EVENT_GET_VERSION and HAVE_EVENT_GET_METHOD. -RD */ - /* XXXX The problem is that it's not trivial to get libevent to change it's - * method once it's initialized, and it's not trivial to tell what method it - * will use without initializing it. I guess we could preemptively disable - * buggy libevent modes based on the version _before_ initializing it, - * though, but then there's no good way (afaict) to warn "I would have used - * kqueue, but instead I'm using select." -NM */ - if (!strcmp(m, "kqueue")) { - if (version < LE_11B) - buggy = 1; - } else if (!strcmp(m, "epoll")) { - if (version < LE_11) - iffy = 1; - } else if (!strcmp(m, "poll")) { - if (version < LE_10E) - buggy = 1; - else if (version < LE_11) - slow = 1; - } else if (!strcmp(m, "select")) { - if (version < LE_11) - slow = 1; - } else if (!strcmp(m, "win32")) { - if (version < LE_11B) - buggy = 1; - } - - /* Libevent versions before 1.3b do very badly on operating systems with - * user-space threading implementations. */ -#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) - if (server && version < LE_13B) { - thread_unsafe = 1; - sad_os = "BSD variants"; - } -#elif defined(__APPLE__) || defined(__darwin__) - if (server && version < LE_13B) { - thread_unsafe = 1; - sad_os = "Mac OS X"; - } -#endif + suppress_libevent_log_msg(NULL); - if (thread_unsafe) { - log(LOG_WARN, LD_GENERAL, - "Libevent version %s often crashes when running a Tor server with %s. " - "Please use the latest version of libevent (1.3b or later)",v,sad_os); - badness = "BROKEN"; - } else if (buggy) { - log(LOG_WARN, LD_GENERAL, - "There are serious bugs in using %s with libevent %s. " - "Please use the latest version of libevent.", m, v); - badness = "BROKEN"; - } else if (iffy) { - log(LOG_WARN, LD_GENERAL, - "There are minor bugs in using %s with libevent %s. " - "You may want to use the latest version of libevent.", m, v); - badness = "BUGGY"; - } else if (slow && server) { - log(LOG_WARN, LD_GENERAL, - "libevent %s can be very slow with %s. " - "When running a server, please use the latest version of libevent.", - v,m); - badness = "SLOW"; - } + tor_check_libevent_version(tor_libevent_get_method(), + get_options()->ORPort != 0, + &badness); if (badness) { + const char *v = tor_libevent_get_version_str(); + const char *m = tor_libevent_get_method(); control_event_general_status(LOG_WARN, "BAD_LIBEVENT VERSION=%s METHOD=%s BADNESS=%s RECOVERED=NO", v, m, badness); } - -} -#else -static le_version_t -decode_libevent_version(void) -{ - return LE_OLD; } -#endif /** Return the persistent state struct for this Tor. */ or_state_t * @@ -4669,10 +4914,10 @@ * Note: Consider using the get_datadir_fname* macros in or.h. */ char * -get_datadir_fname2_suffix(const char *sub1, const char *sub2, - const char *suffix) +options_get_datadir_fname2_suffix(or_options_t *options, + const char *sub1, const char *sub2, + const char *suffix) { - or_options_t *options = get_options(); char *fname = NULL; size_t len; tor_assert(options); @@ -4726,22 +4971,61 @@ } /** Replace the current persistent state with new_state */ -static void +static int or_state_set(or_state_t *new_state) { char *err = NULL; + int ret = 0; tor_assert(new_state); - if (global_state) - config_free(&state_format, global_state); + config_free(&state_format, global_state); global_state = new_state; if (entry_guards_parse_state(global_state, 1, &err)<0) { log_warn(LD_GENERAL,"%s",err); tor_free(err); + ret = -1; } if (rep_hist_load_state(global_state, &err)<0) { log_warn(LD_GENERAL,"Unparseable bandwidth history state: %s",err); tor_free(err); + ret = -1; + } + if (circuit_build_times_parse_state(&circ_times, global_state) < 0) { + ret = -1; + } + return ret; +} + +/** + * Save a broken state file to a backup location. + */ +static void +or_state_save_broken(char *fname) +{ + int i; + file_status_t status; + size_t len = strlen(fname)+16; + char *fname2 = tor_malloc(len); + for (i = 0; i < 100; ++i) { + tor_snprintf(fname2, len, "%s.%d", fname, i); + status = file_status(fname2); + if (status == FN_NOENT) + break; + } + if (i == 100) { + log_warn(LD_BUG, "Unable to parse state in \"%s\"; too many saved bad " + "state files to move aside. Discarding the old state file.", + fname); + unlink(fname); + } else { + log_warn(LD_BUG, "Unable to parse state in \"%s\". Moving it aside " + "to \"%s\". This could be a bug in Tor; please tell " + "the developers.", fname, fname2); + if (rename(fname, fname2) < 0) { + log_warn(LD_BUG, "Weirdly, I couldn't even move the state aside. The " + "OS gave an error of %s", strerror(errno)); + } } + tor_free(fname2); } /** Reload the persistent state from disk, generating a new state as needed. @@ -4803,31 +5087,8 @@ " This is a bug in Tor."); goto done; } else if (badstate && contents) { - int i; - file_status_t status; - size_t len = strlen(fname)+16; - char *fname2 = tor_malloc(len); - for (i = 0; i < 100; ++i) { - tor_snprintf(fname2, len, "%s.%d", fname, i); - status = file_status(fname2); - if (status == FN_NOENT) - break; - } - if (i == 100) { - log_warn(LD_BUG, "Unable to parse state in \"%s\"; too many saved bad " - "state files to move aside. Discarding the old state file.", - fname); - unlink(fname); - } else { - log_warn(LD_BUG, "Unable to parse state in \"%s\". Moving it aside " - "to \"%s\". This could be a bug in Tor; please tell " - "the developers.", fname, fname2); - if (rename(fname, fname2) < 0) { - log_warn(LD_BUG, "Weirdly, I couldn't even move the state aside. The " - "OS gave an error of %s", strerror(errno)); - } - } - tor_free(fname2); + or_state_save_broken(fname); + tor_free(contents); config_free(&state_format, new_state); @@ -4839,7 +5100,9 @@ } else { log_info(LD_GENERAL, "Initialized state"); } - or_state_set(new_state); + if (or_state_set(new_state) == -1) { + or_state_save_broken(fname); + } new_state = NULL; if (!contents) { global_state->next_write = 0; @@ -4862,7 +5125,6 @@ { char *state, *contents; char tbuf[ISO_TIME_LEN+1]; - size_t len; char *fname; tor_assert(global_state); @@ -4874,20 +5136,16 @@ * to avoid redundant writes. */ entry_guards_update_state(global_state); rep_hist_update_state(global_state); + circuit_build_times_update_state(&circ_times, global_state); if (accounting_is_enabled(get_options())) accounting_run_housekeeping(now); - global_state->LastWritten = time(NULL); tor_free(global_state->TorVersion); - len = strlen(get_version())+8; - global_state->TorVersion = tor_malloc(len); - tor_snprintf(global_state->TorVersion, len, "Tor %s", get_version()); + tor_asprintf(&global_state->TorVersion, "Tor %s", get_version()); state = config_dump(&state_format, global_state, 1, 0); - len = strlen(state)+256; - contents = tor_malloc(len); format_local_iso_time(tbuf, time(NULL)); - tor_snprintf(contents, len, + tor_asprintf(&contents, "# Tor state file last generated on %s local time\n" "# Other times below are in GMT\n" "# You *do not* need to edit this file.\n\n%s", @@ -4896,10 +5154,13 @@ fname = get_datadir_fname("state"); if (write_str_to_file(fname, contents, 0)<0) { log_warn(LD_FS, "Unable to write state to file \"%s\"", fname); + global_state->LastWritten = -1; tor_free(fname); tor_free(contents); return -1; } + + global_state->LastWritten = time(NULL); log_info(LD_GENERAL, "Saved state to \"%s\"", fname); tor_free(fname); tor_free(contents); @@ -4931,26 +5192,28 @@ * types. */ int getinfo_helper_config(control_connection_t *conn, - const char *question, char **answer) + const char *question, char **answer, + const char **errmsg) { (void) conn; + (void) errmsg; if (!strcmp(question, "config/names")) { smartlist_t *sl = smartlist_create(); int i; for (i = 0; _option_vars[i].name; ++i) { config_var_t *var = &_option_vars[i]; - const char *type, *desc; + const char *type; char *line; - size_t len; - desc = config_find_description(&options_format, var->name); switch (var->type) { case CONFIG_TYPE_STRING: type = "String"; break; + case CONFIG_TYPE_FILENAME: type = "Filename"; break; case CONFIG_TYPE_UINT: type = "Integer"; break; case CONFIG_TYPE_INTERVAL: type = "TimeInterval"; break; case CONFIG_TYPE_MEMUNIT: type = "DataSize"; break; case CONFIG_TYPE_DOUBLE: type = "Float"; break; case CONFIG_TYPE_BOOL: type = "Boolean"; break; case CONFIG_TYPE_ISOTIME: type = "Time"; break; + case CONFIG_TYPE_ROUTERSET: type = "RouterList"; break; case CONFIG_TYPE_CSV: type = "CommaList"; break; case CONFIG_TYPE_LINELIST: type = "LineList"; break; case CONFIG_TYPE_LINELIST_S: type = "Dependant"; break; @@ -4961,14 +5224,7 @@ } if (!type) continue; - len = strlen(var->name)+strlen(type)+16; - if (desc) - len += strlen(desc); - line = tor_malloc(len); - if (desc) - tor_snprintf(line, len, "%s %s %s\n",var->name,type,desc); - else - tor_snprintf(line, len, "%s %s\n",var->name,type); + tor_asprintf(&line, "%s %s\n",var->name,type); smartlist_add(sl, line); } *answer = smartlist_join_strings(sl, "", 0, NULL); @@ -4978,104 +5234,3 @@ return 0; } -#include "aes.h" -#include "ht.h" -#include "test.h" - -extern const char aes_c_id[]; -extern const char compat_c_id[]; -extern const char container_c_id[]; -extern const char crypto_c_id[]; -extern const char log_c_id[]; -extern const char torgzip_c_id[]; -extern const char tortls_c_id[]; -extern const char util_c_id[]; - -extern const char buffers_c_id[]; -extern const char circuitbuild_c_id[]; -extern const char circuitlist_c_id[]; -extern const char circuituse_c_id[]; -extern const char command_c_id[]; -// extern const char config_c_id[]; -extern const char connection_c_id[]; -extern const char connection_edge_c_id[]; -extern const char connection_or_c_id[]; -extern const char control_c_id[]; -extern const char cpuworker_c_id[]; -extern const char directory_c_id[]; -extern const char dirserv_c_id[]; -extern const char dns_c_id[]; -extern const char hibernate_c_id[]; -extern const char main_c_id[]; -#ifdef NT_SERVICE -extern const char ntmain_c_id[]; -#endif -extern const char onion_c_id[]; -extern const char policies_c_id[]; -extern const char relay_c_id[]; -extern const char rendclient_c_id[]; -extern const char rendcommon_c_id[]; -extern const char rendmid_c_id[]; -extern const char rendservice_c_id[]; -extern const char rephist_c_id[]; -extern const char router_c_id[]; -extern const char routerlist_c_id[]; -extern const char routerparse_c_id[]; - -/** Dump the version of every file to the log. */ -static void -print_svn_version(void) -{ - puts(AES_H_ID); - puts(COMPAT_H_ID); - puts(CONTAINER_H_ID); - puts(CRYPTO_H_ID); - puts(HT_H_ID); - puts(TEST_H_ID); - puts(LOG_H_ID); - puts(TORGZIP_H_ID); - puts(TORINT_H_ID); - puts(TORTLS_H_ID); - puts(UTIL_H_ID); - puts(aes_c_id); - puts(compat_c_id); - puts(container_c_id); - puts(crypto_c_id); - puts(log_c_id); - puts(torgzip_c_id); - puts(tortls_c_id); - puts(util_c_id); - - puts(OR_H_ID); - puts(buffers_c_id); - puts(circuitbuild_c_id); - puts(circuitlist_c_id); - puts(circuituse_c_id); - puts(command_c_id); - puts(config_c_id); - puts(connection_c_id); - puts(connection_edge_c_id); - puts(connection_or_c_id); - puts(control_c_id); - puts(cpuworker_c_id); - puts(directory_c_id); - puts(dirserv_c_id); - puts(dns_c_id); - puts(hibernate_c_id); - puts(main_c_id); -#ifdef NT_SERVICE - puts(ntmain_c_id); -#endif - puts(onion_c_id); - puts(policies_c_id); - puts(relay_c_id); - puts(rendclient_c_id); - puts(rendcommon_c_id); - puts(rendmid_c_id); - puts(rendservice_c_id); - puts(rephist_c_id); - puts(router_c_id); - puts(routerlist_c_id); - puts(routerparse_c_id); -} - diff -Nru tor-0.2.0.34/src/or/config_codedigest.c tor-0.2.2.16-alpha/src/or/config_codedigest.c --- tor-0.2.0.34/src/or/config_codedigest.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/config_codedigest.c 2009-11-17 20:37:03.000000000 +0000 @@ -0,0 +1,11 @@ + +const char *tor_get_digests(void); + +const char * +tor_get_digests(void) +{ + return "" +#include "or_sha1.i" + ; +} + diff -Nru tor-0.2.0.34/src/or/config.h tor-0.2.2.16-alpha/src/or/config.h --- tor-0.2.0.34/src/or/config.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/config.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,78 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file config.h + * \brief Header file for config.c. + **/ + +#ifndef _TOR_CONFIG_H +#define _TOR_CONFIG_H + +const char *get_dirportfrontpage(void); +or_options_t *get_options(void); +int set_options(or_options_t *new_val, char **msg); +void config_free_all(void); +const char *safe_str_client(const char *address); +const char *safe_str(const char *address); +const char *escaped_safe_str_client(const char *address); +const char *escaped_safe_str(const char *address); +const char *get_version(void); + +int config_get_lines(const char *string, config_line_t **result); +void config_free_lines(config_line_t *front); +setopt_err_t options_trial_assign(config_line_t *list, int use_defaults, + int clear_first, char **msg); +int resolve_my_address(int warn_severity, or_options_t *options, + uint32_t *addr, char **hostname_out); +int is_local_addr(const tor_addr_t *addr) ATTR_PURE; +void options_init(or_options_t *options); +char *options_dump(or_options_t *options, int minimal); +int options_init_from_torrc(int argc, char **argv); +setopt_err_t options_init_from_string(const char *cf, + int command, const char *command_arg, char **msg); +int option_is_recognized(const char *key); +const char *option_get_canonical_name(const char *key); +config_line_t *option_get_assignment(or_options_t *options, + const char *key); +int options_save_current(void); +const char *get_torrc_fname(void); +char *options_get_datadir_fname2_suffix(or_options_t *options, + const char *sub1, const char *sub2, + const char *suffix); +#define get_datadir_fname2_suffix(sub1, sub2, suffix) \ + options_get_datadir_fname2_suffix(get_options(), (sub1), (sub2), (suffix)) +/** Return a newly allocated string containing datadir/sub1. See + * get_datadir_fname2_suffix. */ +#define get_datadir_fname(sub1) get_datadir_fname2_suffix((sub1), NULL, NULL) +/** Return a newly allocated string containing datadir/sub1/sub2. See + * get_datadir_fname2_suffix. */ +#define get_datadir_fname2(sub1,sub2) \ + get_datadir_fname2_suffix((sub1), (sub2), NULL) +/** Return a newly allocated string containing datadir/sub1suffix. See + * get_datadir_fname2_suffix. */ +#define get_datadir_fname_suffix(sub1, suffix) \ + get_datadir_fname2_suffix((sub1), NULL, (suffix)) + +or_state_t *get_or_state(void); +int or_state_save(time_t now); + +int options_need_geoip_info(or_options_t *options, const char **reason_out); +int getinfo_helper_config(control_connection_t *conn, + const char *question, char **answer, + const char **errmsg); + +const char *tor_get_digests(void); +uint32_t get_effective_bwrate(or_options_t *options); +uint32_t get_effective_bwburst(or_options_t *options); + +#ifdef CONFIG_PRIVATE +/* Used only by config.c and test.c */ +or_options_t *options_new(void); +#endif + +#endif + diff -Nru tor-0.2.0.34/src/or/connection.c tor-0.2.2.16-alpha/src/or/connection.c --- tor-0.2.0.34/src/or/connection.c 2008-12-17 22:36:01.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/connection.c 2010-09-12 02:54:22.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: connection.c 17635 2008-12-16 22:53:24Z nickm $ */ -const char connection_c_id[] = - "$Id: connection.c 17635 2008-12-16 22:53:24Z nickm $"; /** * \file connection.c @@ -14,24 +11,61 @@ **/ #include "or.h" +#include "buffers.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "connection_or.h" +#include "control.h" +#include "cpuworker.h" +#include "directory.h" +#include "dirserv.h" +#include "dns.h" +#include "dnsserv.h" +#include "geoip.h" +#include "main.h" +#include "policies.h" +#include "reasons.h" +#include "relay.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rephist.h" +#include "router.h" +#include "routerparse.h" static connection_t *connection_create_listener( - struct sockaddr *listensockaddr, int type, + struct sockaddr *listensockaddr, + socklen_t listensocklen, int type, char* address); +static void connection_init(time_t now, connection_t *conn, int type, + int socket_family); static int connection_init_accepted_conn(connection_t *conn, uint8_t listener_type); static int connection_handle_listener_read(connection_t *conn, int new_type); -static int connection_read_bucket_should_increase(or_connection_t *conn); +static int connection_bucket_should_increase(int bucket, + or_connection_t *conn); static int connection_finished_flushing(connection_t *conn); static int connection_flushed_some(connection_t *conn); static int connection_finished_connecting(connection_t *conn); static int connection_reached_eof(connection_t *conn); -static int connection_read_to_buf(connection_t *conn, int *max_to_read); +static int connection_read_to_buf(connection_t *conn, int *max_to_read, + int *socket_error); static int connection_process_inbuf(connection_t *conn, int package_partial); static void client_check_address_changed(int sock); static void set_constrained_socket_buffers(int sock, int size); +static const char *connection_proxy_state_to_string(int state); +static int connection_read_https_proxy_response(connection_t *conn); +static void connection_send_socks5_connect(connection_t *conn); + +/** The last IPv4 address that our network interface seemed to have been + * binding to, in host order. We use this to detect when our IP changes. */ static uint32_t last_interface_ip = 0; +/** A list of uint32_ts for addresses we've used in outgoing connections. + * Used to detect IP address changes. */ static smartlist_t *outgoing_addrs = NULL; /**************************************************************/ @@ -87,8 +121,7 @@ case CONN_TYPE_OR: switch (state) { case OR_CONN_STATE_CONNECTING: return "connect()ing"; - case OR_CONN_STATE_PROXY_FLUSHING: return "proxy flushing"; - case OR_CONN_STATE_PROXY_READING: return "proxy reading"; + case OR_CONN_STATE_PROXY_HANDSHAKING: return "handshaking (proxy)"; case OR_CONN_STATE_TLS_HANDSHAKING: return "handshaking (TLS)"; case OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING: return "renegotiating (TLS)"; @@ -150,8 +183,90 @@ return buf; } -/** Allocate space for a new connection_t. This function just initializes - * conn; you must call connection_add() to link it into the main array. +/** Allocate and return a new dir_connection_t, initialized as by + * connection_init(). */ +dir_connection_t * +dir_connection_new(int socket_family) +{ + dir_connection_t *dir_conn = tor_malloc_zero(sizeof(dir_connection_t)); + connection_init(time(NULL), TO_CONN(dir_conn), CONN_TYPE_DIR, socket_family); + return dir_conn; +} + +/** Allocate and return a new or_connection_t, initialized as by + * connection_init(). */ +or_connection_t * +or_connection_new(int socket_family) +{ + or_connection_t *or_conn = tor_malloc_zero(sizeof(or_connection_t)); + time_t now = time(NULL); + connection_init(now, TO_CONN(or_conn), CONN_TYPE_OR, socket_family); + + or_conn->timestamp_last_added_nonpadding = time(NULL); + or_conn->next_circ_id = crypto_rand_int(1<<15); + + or_conn->active_circuit_pqueue = smartlist_create(); + or_conn->active_circuit_pqueue_last_recalibrated = cell_ewma_get_tick(); + + return or_conn; +} + +/** Allocate and return a new edge_connection_t, initialized as by + * connection_init(). */ +edge_connection_t * +edge_connection_new(int type, int socket_family) +{ + edge_connection_t *edge_conn = tor_malloc_zero(sizeof(edge_connection_t)); + tor_assert(type == CONN_TYPE_EXIT || type == CONN_TYPE_AP); + connection_init(time(NULL), TO_CONN(edge_conn), type, socket_family); + if (type == CONN_TYPE_AP) + edge_conn->socks_request = tor_malloc_zero(sizeof(socks_request_t)); + return edge_conn; +} + +/** Allocate and return a new control_connection_t, initialized as by + * connection_init(). */ +control_connection_t * +control_connection_new(int socket_family) +{ + control_connection_t *control_conn = + tor_malloc_zero(sizeof(control_connection_t)); + connection_init(time(NULL), + TO_CONN(control_conn), CONN_TYPE_CONTROL, socket_family); + log_notice(LD_CONTROL, "New control connection opened."); + return control_conn; +} + +/** Allocate, initialize, and return a new connection_t subtype of type + * to make or receive connections of address family socket_family. The + * type should be one of the CONN_TYPE_* constants. */ +connection_t * +connection_new(int type, int socket_family) +{ + switch (type) { + case CONN_TYPE_OR: + return TO_CONN(or_connection_new(socket_family)); + + case CONN_TYPE_EXIT: + case CONN_TYPE_AP: + return TO_CONN(edge_connection_new(type, socket_family)); + + case CONN_TYPE_DIR: + return TO_CONN(dir_connection_new(socket_family)); + + case CONN_TYPE_CONTROL: + return TO_CONN(control_connection_new(socket_family)); + + default: { + connection_t *conn = tor_malloc_zero(sizeof(connection_t)); + connection_init(time(NULL), conn, type, socket_family); + return conn; + } + } +} + +/** Initializes conn. (you must call connection_add() to link it into the main + * array). * * Set conn-\>type to type. Set conn-\>s and conn-\>conn_array_index to * -1 to signify they are not yet assigned. @@ -163,42 +278,30 @@ * * Initialize conn's timestamps to now. */ -connection_t * -connection_new(int type, int socket_family) +static void +connection_init(time_t now, connection_t *conn, int type, int socket_family) { static uint64_t n_connections_allocated = 1; - connection_t *conn; - time_t now = time(NULL); - size_t length; - uint32_t magic; - switch (type) { case CONN_TYPE_OR: - length = sizeof(or_connection_t); - magic = OR_CONNECTION_MAGIC; + conn->magic = OR_CONNECTION_MAGIC; break; case CONN_TYPE_EXIT: case CONN_TYPE_AP: - length = sizeof(edge_connection_t); - magic = EDGE_CONNECTION_MAGIC; + conn->magic = EDGE_CONNECTION_MAGIC; break; case CONN_TYPE_DIR: - length = sizeof(dir_connection_t); - magic = DIR_CONNECTION_MAGIC; + conn->magic = DIR_CONNECTION_MAGIC; break; case CONN_TYPE_CONTROL: - length = sizeof(control_connection_t); - magic = CONTROL_CONNECTION_MAGIC; + conn->magic = CONTROL_CONNECTION_MAGIC; break; default: - length = sizeof(connection_t); - magic = BASE_CONNECTION_MAGIC; + conn->magic = BASE_CONNECTION_MAGIC; break; } - conn = tor_malloc_zero(length); - conn->magic = magic; conn->s = -1; /* give it a default of 'not used' */ conn->conn_array_index = -1; /* also default to 'not used' */ conn->global_identifier = n_connections_allocated++; @@ -209,20 +312,10 @@ conn->inbuf = buf_new(); conn->outbuf = buf_new(); } - if (type == CONN_TYPE_AP) { - TO_EDGE_CONN(conn)->socks_request = - tor_malloc_zero(sizeof(socks_request_t)); - } - if (type == CONN_TYPE_OR) { - TO_OR_CONN(conn)->timestamp_last_added_nonpadding = now; - TO_OR_CONN(conn)->next_circ_id = crypto_rand_int(1<<15); - } conn->timestamp_created = now; conn->timestamp_lastread = now; conn->timestamp_lastwritten = now; - - return conn; } /** Create a link between conn_a and conn_b. */ @@ -238,25 +331,6 @@ conn_b->linked_conn = conn_a; } -/** Tell libevent that we don't care about conn any more. */ -void -connection_unregister_events(connection_t *conn) -{ - if (conn->read_event) { - if (event_del(conn->read_event)) - log_warn(LD_BUG, "Error removing read event for %d", conn->s); - tor_free(conn->read_event); - } - if (conn->write_event) { - if (event_del(conn->write_event)) - log_warn(LD_BUG, "Error removing write event for %d", conn->s); - tor_free(conn->write_event); - } - if (conn->dns_server_port) { - dnsserv_close_listener(conn); - } -} - /** Deallocate memory used by conn. Deallocate its buffers if * necessary, close its socket if necessary, and mark the directory as dirty * if conn is an OR or OP connection. @@ -266,6 +340,9 @@ { void *mem; size_t memlen; + if (!conn) + return; + switch (conn->type) { case CONN_TYPE_OR: tor_assert(conn->magic == OR_CONNECTION_MAGIC); @@ -308,7 +385,7 @@ buf_free(conn->outbuf); } else { if (conn->socket_family == AF_UNIX) { - /* For now only control ports can be unix domain sockets + /* For now only control ports can be Unix domain sockets * and listeners at the same time */ tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER); @@ -323,14 +400,11 @@ if (connection_speaks_cells(conn)) { or_connection_t *or_conn = TO_OR_CONN(conn); - if (or_conn->tls) { - tor_tls_free(or_conn->tls); - or_conn->tls = NULL; - } - if (or_conn->handshake_state) { - or_handshake_state_free(or_conn->handshake_state); - or_conn->handshake_state = NULL; - } + tor_tls_free(or_conn->tls); + or_conn->tls = NULL; + or_handshake_state_free(or_conn->handshake_state); + or_conn->handshake_state = NULL; + smartlist_free(or_conn->active_circuit_pqueue); tor_free(or_conn->nickname); } if (CONN_IS_EDGE(conn)) { @@ -340,6 +414,8 @@ memset(edge_conn->socks_request, 0xcc, sizeof(socks_request_t)); tor_free(edge_conn->socks_request); } + + rend_data_free(edge_conn->rend_data); } if (conn->type == CONN_TYPE_CONTROL) { control_connection_t *control_conn = TO_CONTROL_CONN(conn); @@ -352,14 +428,15 @@ if (conn->type == CONN_TYPE_DIR) { dir_connection_t *dir_conn = TO_DIR_CONN(conn); tor_free(dir_conn->requested_resource); - if (dir_conn->zlib_state) - tor_zlib_free(dir_conn->zlib_state); + + 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); } - if (dir_conn->cached_dir) - cached_dir_decref(dir_conn->cached_dir); + + cached_dir_decref(dir_conn->cached_dir); + rend_data_free(dir_conn->rend_data); } if (conn->s >= 0) { @@ -374,7 +451,7 @@ connection_or_remove_from_identity_map(TO_OR_CONN(conn)); } - memset(conn, 0xAA, memlen); /* poison memory */ + memset(mem, 0xCC, memlen); /* poison memory */ tor_free(mem); } @@ -383,7 +460,8 @@ void connection_free(connection_t *conn) { - tor_assert(conn); + if (!conn) + return; tor_assert(!connection_is_on_closeable_list(conn)); tor_assert(!connection_in_array(conn)); if (conn->linked_conn) { @@ -409,7 +487,7 @@ } /** Call _connection_free() on every connection in our array, and release all - * storage helpd by connection.c. This is used by cpuworkers and dnsworkers + * storage held by connection.c. This is used by cpuworkers and dnsworkers * when they fork, so they don't keep resources held open (especially * sockets). * @@ -462,7 +540,8 @@ tor_assert(conn->marked_for_close); if (CONN_IS_EDGE(conn)) { - if (!conn->edge_has_sent_end) { + edge_conn = TO_EDGE_CONN(conn); + if (!edge_conn->edge_has_sent_end) { log_warn(LD_BUG, "(Harmless.) Edge connection (marked at %s:%d) " "hasn't sent end yet?", conn->marked_for_close_file, conn->marked_for_close); @@ -478,46 +557,48 @@ * failed: forget about this router, and maybe try again. */ connection_dir_request_failed(dir_conn); } - if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC) { - /* Give it a try. However, there is no re-fetching for v0 rend - * descriptors; if the response is empty or the descriptor is - * unusable, close pending connections (unless a v2 request is - * still in progress). */ - rend_client_desc_trynow(dir_conn->rend_query, 0); - } /* If we were trying to fetch a v2 rend desc and did not succeed, * retry as needed. (If a fetch is successful, the connection state * is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC to mark that * refetching is unnecessary.) */ if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 && - dir_conn->rend_query && - strlen(dir_conn->rend_query) == REND_SERVICE_ID_LEN_BASE32) - rend_client_refetch_v2_renddesc(dir_conn->rend_query); + dir_conn->rend_data && + strlen(dir_conn->rend_data->onion_address) == + REND_SERVICE_ID_LEN_BASE32) + rend_client_refetch_v2_renddesc(dir_conn->rend_data); break; case CONN_TYPE_OR: or_conn = TO_OR_CONN(conn); /* Remember why we're closing this connection. */ if (conn->state != OR_CONN_STATE_OPEN) { - if (connection_or_nonopen_was_started_here(or_conn)) { - rep_hist_note_connect_failed(or_conn->identity_digest, now); - entry_guard_register_connect_status(or_conn->identity_digest,0,now); - router_set_status(or_conn->identity_digest, 0); - control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED, - control_tls_error_to_reason(or_conn->tls_error)); - } /* Inform any pending (not attached) circs that they should * give up. */ circuit_n_conn_done(TO_OR_CONN(conn), 0); + /* now mark things down as needed */ + if (connection_or_nonopen_was_started_here(or_conn)) { + or_options_t *options = get_options(); + rep_hist_note_connect_failed(or_conn->identity_digest, now); + entry_guard_register_connect_status(or_conn->identity_digest,0, + !options->HttpsProxy, now); + if (conn->state >= OR_CONN_STATE_TLS_HANDSHAKING) { + int reason = tls_error_to_orconn_end_reason(or_conn->tls_error); + control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED, + reason); + if (!authdir_mode_tests_reachability(options)) + control_event_bootstrap_problem( + orconn_end_reason_to_control_string(reason), reason); + } + } } else if (conn->hold_open_until_flushed) { /* We only set hold_open_until_flushed when we're intentionally * closing a connection. */ rep_hist_note_disconnect(or_conn->identity_digest, now); control_event_or_conn_status(or_conn, OR_CONN_EVENT_CLOSED, - control_tls_error_to_reason(or_conn->tls_error)); - } else if (or_conn->identity_digest) { + tls_error_to_orconn_end_reason(or_conn->tls_error)); + } else if (!tor_digest_is_zero(or_conn->identity_digest)) { rep_hist_note_connection_died(or_conn->identity_digest, now); control_event_or_conn_status(or_conn, OR_CONN_EVENT_CLOSED, - control_tls_error_to_reason(or_conn->tls_error)); + tls_error_to_orconn_end_reason(or_conn->tls_error)); } /* Now close all the attached circuits on it. */ circuit_unlink_all_from_or_conn(TO_OR_CONN(conn), @@ -543,6 +624,7 @@ conn->marked_for_close_file, conn->marked_for_close); dnsserv_reject_request(edge_conn); } + control_event_stream_bandwidth(edge_conn); control_event_stream_status(edge_conn, STREAM_EVENT_CLOSED, edge_conn->end_reason); circ = circuit_get_by_edge_conn(edge_conn); @@ -671,14 +753,14 @@ * for the new structure. If no port is provided in listenaddress then * listenport is used. * - * If not NULL readable_addrress will contain a copy of the host part of + * If not NULL readable_address will contain a copy of the host part of * listenaddress. * * The listenaddr struct has to be freed by the caller. */ static struct sockaddr_in * create_inet_sockaddr(const char *listenaddress, uint16_t listenport, - char **readable_address) { + char **readable_address, socklen_t *socklen_out) { struct sockaddr_in *listenaddr = NULL; uint32_t addr; uint16_t usePort = 0; @@ -697,6 +779,8 @@ listenaddr->sin_family = AF_INET; listenaddr->sin_port = htons((uint16_t) usePort); + *socklen_out = sizeof(struct sockaddr_in); + return listenaddr; err: @@ -706,20 +790,21 @@ #ifdef HAVE_SYS_UN_H /** Create an AF_UNIX listenaddr struct. - * listenaddress provides the path to the unix socket. + * listenaddress provides the path to the Unix socket. * * Eventually listenaddress will also optionally contain user, group, * and file permissions for the new socket. But not yet. XXX * Also, since we do not create the socket here the information doesn't help * here. * - * If not NULL readable_addrress will contain a copy of the path part of + * If not NULL readable_address will contain a copy of the path part of * listenaddress. * * The listenaddr struct has to be freed by the caller. */ static struct sockaddr_un * -create_unix_sockaddr(const char *listenaddress, char **readable_address) +create_unix_sockaddr(const char *listenaddress, char **readable_address, + socklen_t *len_out) { struct sockaddr_un *sockaddr = NULL; @@ -730,20 +815,42 @@ if (readable_address) *readable_address = tor_strdup(listenaddress); + *len_out = sizeof(struct sockaddr_un); return sockaddr; } #else static struct sockaddr * -create_unix_sockaddr(const char *listenaddress, char **readable_address) +create_unix_sockaddr(const char *listenaddress, char **readable_address, + socklen_t *len_out) { (void)listenaddress; (void)readable_address; log_fn(LOG_ERR, LD_BUG, "Unix domain sockets not supported, yet we tried to create one."); - assert(0); + *len_out = 0; + tor_assert(0); }; #endif /* HAVE_SYS_UN_H */ +/** Warn that an accept or a connect has failed because we're running up + * against our ulimit. Rate-limit these warnings so that we don't spam + * the log. */ +static void +warn_too_many_conns(void) +{ +#define WARN_TOO_MANY_CONNS_INTERVAL (6*60*60) + static ratelim_t last_warned = RATELIM_INIT(WARN_TOO_MANY_CONNS_INTERVAL); + char *m; + if ((m = rate_limit_log(&last_warned, approx_time()))) { + int n_conns = get_n_open_sockets(); + log_warn(LD_NET,"Failing because we have %d connections already. Please " + "raise your ulimit -n.%s", n_conns, m); + tor_free(m); + control_event_general_status(LOG_WARN, "TOO_MANY_CONNECTIONS CURRENT=%d", + n_conns); + } +} + /** Bind a new non-blocking socket listening to the socket described * by listensockaddr. * @@ -751,21 +858,16 @@ * to the conn. */ static connection_t * -connection_create_listener(struct sockaddr *listensockaddr, int type, - char* address) +connection_create_listener(struct sockaddr *listensockaddr, socklen_t socklen, + int type, char* address) { - /*XXXX021 this function should take a socklen too. */ connection_t *conn; int s; /* the socket we're going to make */ uint16_t usePort = 0; int start_reading = 0; if (get_n_open_sockets() >= get_options()->_ConnLimit-1) { - int n_conns = get_n_open_sockets(); - log_warn(LD_NET,"Failing because we have %d connections already. Please " - "raise your ulimit -n.", n_conns); - control_event_general_status(LOG_WARN, "TOO_MANY_CONNECTIONS CURRENT=%d", - n_conns); + warn_too_many_conns(); return NULL; } @@ -800,7 +902,7 @@ (socklen_t)sizeof(one)); #endif - if (bind(s,listensockaddr,(socklen_t)sizeof(struct sockaddr_in)) < 0) { + if (bind(s,listensockaddr,socklen) < 0) { const char *helpfulhint = ""; int e = tor_socket_errno(s); if (ERRNO_IS_EADDRINUSE(e)) @@ -823,7 +925,7 @@ } else if (listensockaddr->sa_family == AF_UNIX) { start_reading = 1; - /* For now only control ports can be unix domain sockets + /* For now only control ports can be Unix domain sockets * and listeners at the same time */ tor_assert(type == CONN_TYPE_CONTROL_LISTENER); @@ -894,29 +996,61 @@ /** Do basic sanity checking on a newly received socket. Return 0 * if it looks ok, else return -1. */ static int -check_sockaddr_in(struct sockaddr *sa, int len, int level) +check_sockaddr(struct sockaddr *sa, int len, int level) { int ok = 1; - struct sockaddr_in *sin=(struct sockaddr_in*)sa; - if (len != sizeof(struct sockaddr_in)) { - log_fn(level, LD_NET, "Length of address not as expected: %d vs %d", - len,(int)sizeof(struct sockaddr_in)); - ok = 0; - } - if (sa->sa_family != AF_INET) { - log_fn(level, LD_NET, "Family of address not as expected: %d vs %d", - sa->sa_family, AF_INET); - ok = 0; - } - if (sin->sin_addr.s_addr == 0 || sin->sin_port == 0) { - log_fn(level, LD_NET, - "Address for new connection has address/port equal to zero."); + if (sa->sa_family == AF_INET) { + struct sockaddr_in *sin=(struct sockaddr_in*)sa; + if (len != sizeof(struct sockaddr_in)) { + log_fn(level, LD_NET, "Length of address not as expected: %d vs %d", + len,(int)sizeof(struct sockaddr_in)); + ok = 0; + } + if (sin->sin_addr.s_addr == 0 || sin->sin_port == 0) { + log_fn(level, LD_NET, + "Address for new connection has address/port equal to zero."); + ok = 0; + } + } else if (sa->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6=(struct sockaddr_in6*)sa; + if (len != sizeof(struct sockaddr_in6)) { + log_fn(level, LD_NET, "Length of address not as expected: %d vs %d", + len,(int)sizeof(struct sockaddr_in6)); + ok = 0; + } + if (tor_mem_is_zero((void*)sin6->sin6_addr.s6_addr, 16) || + sin6->sin6_port == 0) { + log_fn(level, LD_NET, + "Address for new connection has address/port equal to zero."); + ok = 0; + } + } else { ok = 0; } return ok ? 0 : -1; } +/** Check whether the socket family from an accepted socket got is the + * same as the one that listener is waiting for. If it isn't, log + * a useful message and return -1. Else return 0. + * + * This is annoying, but can apparently happen on some Darwins. */ +static int +check_sockaddr_family_match(sa_family_t got, connection_t *listener) +{ + if (got != listener->socket_family) { + log_info(LD_BUG, "A listener connection returned a socket with a " + "mismatched family. %s for addr_family %d gave us a socket " + "with address family %d. Dropping.", + conn_type_to_string(listener->type), + (int)listener->socket_family, + (int)got); + return -1; + } + return 0; +} + /** The listener connection conn told poll() it wanted to read. * Call accept() on conn-\>s, and add the new connection if necessary. */ @@ -926,24 +1060,22 @@ int news; /* the new socket */ connection_t *newconn; /* information about the remote peer when connecting to other routers */ - struct sockaddr_in remote; char addrbuf[256]; + struct sockaddr *remote = (struct sockaddr*)addrbuf; /* length of the remote address. Must be whatever accept() needs. */ socklen_t remotelen = (socklen_t)sizeof(addrbuf); - char tmpbuf[INET_NTOA_BUF_LEN]; or_options_t *options = get_options(); tor_assert((size_t)remotelen >= sizeof(struct sockaddr_in)); memset(addrbuf, 0, sizeof(addrbuf)); - news = tor_accept_socket(conn->s,(struct sockaddr *)&addrbuf,&remotelen); + news = tor_accept_socket(conn->s,remote,&remotelen); if (news < 0) { /* accept() error */ int e = tor_socket_errno(conn->s); if (ERRNO_IS_ACCEPT_EAGAIN(e)) { return 0; /* he hung up before we could accept(). that's fine. */ } else if (ERRNO_IS_ACCEPT_RESOURCE_LIMIT(e)) { - log_notice(LD_NET,"accept failed: %s. Dropping incoming connection.", - tor_socket_strerror(e)); + warn_too_many_conns(); return 0; } /* else there was a real error. */ @@ -961,30 +1093,25 @@ if (options->ConstrainedSockets) set_constrained_socket_buffers(news, (int)options->ConstrainedSockSize); - if (((struct sockaddr*)addrbuf)->sa_family != conn->socket_family) { - /* This is annoying, but can apparently happen on some Darwins. */ - log_info(LD_BUG, "A listener connection returned a socket with a " - "mismatched family. %s for addr_family %d gave us a socket " - "with address family %d. Dropping.", - conn_type_to_string(conn->type), - (int)conn->socket_family, - (int)((struct sockaddr*)addrbuf)->sa_family); + if (check_sockaddr_family_match(remote->sa_family, conn) < 0) { tor_close_socket(news); return 0; } - if (conn->socket_family == AF_INET) { - if (check_sockaddr_in((struct sockaddr*)addrbuf, remotelen, LOG_INFO)<0) { + if (conn->socket_family == AF_INET || conn->socket_family == AF_INET6) { + tor_addr_t addr; + uint16_t port; + if (check_sockaddr(remote, remotelen, LOG_INFO)<0) { log_info(LD_NET, "accept() returned a strange address; trying getsockname()."); - remotelen=256; + remotelen=sizeof(addrbuf); memset(addrbuf, 0, sizeof(addrbuf)); - if (getsockname(news, (struct sockaddr*)addrbuf, &remotelen)<0) { + if (getsockname(news, remote, &remotelen)<0) { int e = tor_socket_errno(news); log_warn(LD_NET, "getsockname() for new connection failed: %s", tor_socket_strerror(e)); } else { - if (check_sockaddr_in((struct sockaddr*)addrbuf, remotelen, + if (check_sockaddr((struct sockaddr*)addrbuf, remotelen, LOG_WARN) < 0) { log_warn(LD_NET,"Something's wrong with this conn. Closing it."); tor_close_socket(news); @@ -992,26 +1119,30 @@ } } } - memcpy(&remote, addrbuf, sizeof(struct sockaddr_in)); + + if (check_sockaddr_family_match(remote->sa_family, conn) < 0) { + tor_close_socket(news); + return 0; + } + + tor_addr_from_sockaddr(&addr, remote, &port); /* process entrance policies here, before we even create the connection */ if (new_type == CONN_TYPE_AP) { /* check sockspolicy to see if we should accept it */ - if (socks_policy_permits_address(ntohl(remote.sin_addr.s_addr)) == 0) { - tor_inet_ntoa(&remote.sin_addr, tmpbuf, sizeof(tmpbuf)); + if (socks_policy_permits_address(&addr) == 0) { log_notice(LD_APP, "Denying socks connection from untrusted address %s.", - tmpbuf); + fmt_addr(&addr)); tor_close_socket(news); return 0; } } if (new_type == CONN_TYPE_DIR) { /* check dirpolicy to see if we should accept it */ - if (dir_policy_permits_address(ntohl(remote.sin_addr.s_addr)) == 0) { - tor_inet_ntoa(&remote.sin_addr, tmpbuf, sizeof(tmpbuf)); + if (dir_policy_permits_address(&addr) == 0) { log_notice(LD_DIRSERV,"Denying dir connection from address %s.", - tmpbuf); + fmt_addr(&addr)); tor_close_socket(news); return 0; } @@ -1021,12 +1152,12 @@ newconn->s = news; /* remember the remote address */ - newconn->addr = ntohl(remote.sin_addr.s_addr); - newconn->port = ntohs(remote.sin_port); - newconn->address = tor_dup_addr(newconn->addr); + tor_addr_copy(&newconn->addr, &addr); + newconn->port = port; + newconn->address = tor_dup_addr(&addr); } else if (conn->socket_family == AF_UNIX) { - /* For now only control ports can be unix domain sockets + /* For now only control ports can be Unix domain sockets * and listeners at the same time */ tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER); @@ -1034,7 +1165,7 @@ newconn->s = news; /* remember the remote address -- do we have anything sane to put here? */ - newconn->addr = 0; + tor_addr_make_unspec(&newconn->addr); newconn->port = 1; newconn->address = tor_strdup(conn->address); } else { @@ -1054,7 +1185,7 @@ } /** Initialize states for newly accepted connection conn. - * If conn is an OR, start the tls handshake. + * If conn is an OR, start the TLS handshake. * If conn is a transparent AP, get its original destination * and place it in circuit_wait. */ @@ -1092,8 +1223,9 @@ } /** Take conn, make a nonblocking socket; try to connect to - * addr:port (they arrive in *host order*). If fail, return -1. Else - * assign s to conn-\>s: if connected return 1, if EAGAIN return 0. + * addr:port (they arrive in *host order*). If fail, return -1 and if + * applicable put your best guess about errno into *socket_error. + * Else assign s to conn-\>s: if connected return 1, if EAGAIN return 0. * * address is used to make the logs useful. * @@ -1101,29 +1233,34 @@ */ int connection_connect(connection_t *conn, const char *address, - uint32_t addr, uint16_t port) + const tor_addr_t *addr, uint16_t port, int *socket_error) { int s, inprogress = 0; - struct sockaddr_in dest_addr; + char addrbuf[256]; + struct sockaddr *dest_addr = (struct sockaddr*) addrbuf; + socklen_t dest_addr_len; or_options_t *options = get_options(); + int protocol_family; if (get_n_open_sockets() >= get_options()->_ConnLimit-1) { - int n_conns = get_n_open_sockets(); - log_warn(LD_NET,"Failing because we have %d connections already. Please " - "raise your ulimit -n.", n_conns); - control_event_general_status(LOG_WARN, "TOO_MANY_CONNECTIONS CURRENT=%d", - n_conns); + warn_too_many_conns(); return -1; } - s = tor_open_socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); + if (tor_addr_family(addr) == AF_INET6) + protocol_family = PF_INET6; + else + protocol_family = PF_INET; + + s = tor_open_socket(protocol_family,SOCK_STREAM,IPPROTO_TCP); if (s < 0) { + *socket_error = tor_socket_errno(-1); log_warn(LD_NET,"Error creating network socket: %s", - tor_socket_strerror(tor_socket_errno(-1))); + tor_socket_strerror(*socket_error)); return -1; } - if (options->OutboundBindAddress) { + if (options->OutboundBindAddress && !tor_addr_is_loopback(addr)) { struct sockaddr_in ext_addr; memset(&ext_addr, 0, sizeof(ext_addr)); @@ -1135,8 +1272,9 @@ } else { if (bind(s, (struct sockaddr*)&ext_addr, (socklen_t)sizeof(ext_addr)) < 0) { + *socket_error = tor_socket_errno(s); log_warn(LD_NET,"Error binding network socket: %s", - tor_socket_strerror(tor_socket_errno(s))); + tor_socket_strerror(*socket_error)); tor_close_socket(s); return -1; } @@ -1148,20 +1286,22 @@ if (options->ConstrainedSockets) set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize); - memset(&dest_addr,0,sizeof(dest_addr)); - dest_addr.sin_family = AF_INET; - dest_addr.sin_port = htons(port); - dest_addr.sin_addr.s_addr = htonl(addr); + memset(addrbuf,0,sizeof(addrbuf)); + dest_addr = (struct sockaddr*) addrbuf; + dest_addr_len = tor_addr_to_sockaddr(addr, port, dest_addr, sizeof(addrbuf)); + tor_assert(dest_addr_len > 0); - log_debug(LD_NET,"Connecting to %s:%u.",escaped_safe_str(address),port); + log_debug(LD_NET, "Connecting to %s:%u.", + escaped_safe_str_client(address), port); - if (connect(s,(struct sockaddr *)&dest_addr, - (socklen_t)sizeof(dest_addr)) < 0) { + if (connect(s, dest_addr, dest_addr_len) < 0) { int e = tor_socket_errno(s); if (!ERRNO_IS_CONN_EINPROGRESS(e)) { /* yuck. kill it. */ + *socket_error = e; log_info(LD_NET, - "connect() to %s:%u failed: %s",escaped_safe_str(address), + "connect() to %s:%u failed: %s", + escaped_safe_str_client(address), port, tor_socket_strerror(e)); tor_close_socket(s); return -1; @@ -1175,7 +1315,8 @@ /* it succeeded. we're connected. */ log_fn(inprogress?LOG_DEBUG:LOG_INFO, LD_NET, - "Connection to %s:%u %s (sock %d).",escaped_safe_str(address), + "Connection to %s:%u %s (sock %d).", + escaped_safe_str_client(address), port, inprogress?"in progress":"established", s); conn->s = s; if (connection_add(conn) < 0) /* no space, forget it */ @@ -1183,6 +1324,353 @@ return inprogress ? 0 : 1; } +/** Convert state number to string representation for logging purposes. + */ +static const char * +connection_proxy_state_to_string(int state) +{ + static const char *unknown = "???"; + static const char *states[] = { + "PROXY_NONE", + "PROXY_HTTPS_WANT_CONNECT_OK", + "PROXY_SOCKS4_WANT_CONNECT_OK", + "PROXY_SOCKS5_WANT_AUTH_METHOD_NONE", + "PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929", + "PROXY_SOCKS5_WANT_AUTH_RFC1929_OK", + "PROXY_SOCKS5_WANT_CONNECT_OK", + "PROXY_CONNECTED", + }; + + if (state < PROXY_NONE || state > PROXY_CONNECTED) + return unknown; + + return states[state]; +} + +/** Write a proxy request of type (socks4, socks5, https) to conn + * for conn->addr:conn->port, authenticating with the auth details given + * in the configuration (if available). SOCKS 5 and HTTP CONNECT proxies + * support authentication. + * + * Returns -1 if conn->addr is incompatible with the proxy protocol, and + * 0 otherwise. + * + * Use connection_read_proxy_handshake() to complete the handshake. + */ +int +connection_proxy_connect(connection_t *conn, int type) +{ + or_options_t *options; + + tor_assert(conn); + + options = get_options(); + + switch (type) { + case PROXY_CONNECT: { + char buf[1024]; + char *base64_authenticator=NULL; + const char *authenticator = options->HttpsProxyAuthenticator; + + /* Send HTTP CONNECT and authentication (if available) in + * one request */ + + if (authenticator) { + base64_authenticator = alloc_http_authenticator(authenticator); + if (!base64_authenticator) + log_warn(LD_OR, "Encoding https authenticator failed"); + } + + if (base64_authenticator) { + tor_snprintf(buf, sizeof(buf), "CONNECT %s:%d HTTP/1.1\r\n" + "Proxy-Authorization: Basic %s\r\n\r\n", + fmt_addr(&conn->addr), + conn->port, base64_authenticator); + tor_free(base64_authenticator); + } else { + tor_snprintf(buf, sizeof(buf), "CONNECT %s:%d HTTP/1.0\r\n\r\n", + fmt_addr(&conn->addr), conn->port); + } + + connection_write_to_buf(buf, strlen(buf), conn); + conn->proxy_state = PROXY_HTTPS_WANT_CONNECT_OK; + break; + } + + case PROXY_SOCKS4: { + unsigned char buf[9]; + uint16_t portn; + uint32_t ip4addr; + + /* Send a SOCKS4 connect request with empty user id */ + + if (tor_addr_family(&conn->addr) != AF_INET) { + log_warn(LD_NET, "SOCKS4 client is incompatible with IPv6"); + return -1; + } + + ip4addr = tor_addr_to_ipv4n(&conn->addr); + portn = htons(conn->port); + + buf[0] = 4; /* version */ + buf[1] = SOCKS_COMMAND_CONNECT; /* command */ + memcpy(buf + 2, &portn, 2); /* port */ + memcpy(buf + 4, &ip4addr, 4); /* addr */ + buf[8] = 0; /* userid (empty) */ + + connection_write_to_buf((char *)buf, sizeof(buf), conn); + conn->proxy_state = PROXY_SOCKS4_WANT_CONNECT_OK; + break; + } + + case PROXY_SOCKS5: { + unsigned char buf[4]; /* fields: vers, num methods, method list */ + + /* Send a SOCKS5 greeting (connect request must wait) */ + + buf[0] = 5; /* version */ + + /* number of auth methods */ + if (options->Socks5ProxyUsername) { + buf[1] = 2; + buf[2] = 0x00; /* no authentication */ + buf[3] = 0x02; /* rfc1929 Username/Passwd auth */ + conn->proxy_state = PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929; + } else { + buf[1] = 1; + buf[2] = 0x00; /* no authentication */ + conn->proxy_state = PROXY_SOCKS5_WANT_AUTH_METHOD_NONE; + } + + connection_write_to_buf((char *)buf, 2 + buf[1], conn); + break; + } + + default: + log_err(LD_BUG, "Invalid proxy protocol, %d", type); + tor_fragile_assert(); + return -1; + } + + log_debug(LD_NET, "set state %s", + connection_proxy_state_to_string(conn->proxy_state)); + + return 0; +} + +/** Read conn's inbuf. If the http response from the proxy is all + * here, make sure it's good news, then return 1. If it's bad news, + * return -1. Else return 0 and hope for better luck next time. + */ +static int +connection_read_https_proxy_response(connection_t *conn) +{ + char *headers; + char *reason=NULL; + int status_code; + time_t date_header; + + switch (fetch_from_buf_http(conn->inbuf, + &headers, MAX_HEADERS_SIZE, + NULL, NULL, 10000, 0)) { + case -1: /* overflow */ + log_warn(LD_PROTOCOL, + "Your https proxy sent back an oversized response. Closing."); + return -1; + case 0: + log_info(LD_NET,"https proxy response not all here yet. Waiting."); + return 0; + /* case 1, fall through */ + } + + if (parse_http_response(headers, &status_code, &date_header, + NULL, &reason) < 0) { + log_warn(LD_NET, + "Unparseable headers from proxy (connecting to '%s'). Closing.", + conn->address); + tor_free(headers); + return -1; + } + if (!reason) reason = tor_strdup("[no reason given]"); + + if (status_code == 200) { + log_info(LD_NET, + "HTTPS connect to '%s' successful! (200 %s) Starting TLS.", + conn->address, escaped(reason)); + tor_free(reason); + return 1; + } + /* else, bad news on the status code */ + log_warn(LD_NET, + "The https proxy sent back an unexpected status code %d (%s). " + "Closing.", + status_code, escaped(reason)); + tor_free(reason); + return -1; +} + +/** Send SOCKS5 CONNECT command to conn, copying conn->addr + * and conn->port into the request. + */ +static void +connection_send_socks5_connect(connection_t *conn) +{ + unsigned char buf[1024]; + size_t reqsize = 6; + uint16_t port = htons(conn->port); + + buf[0] = 5; /* version */ + buf[1] = SOCKS_COMMAND_CONNECT; /* command */ + buf[2] = 0; /* reserved */ + + if (tor_addr_family(&conn->addr) == AF_INET) { + uint32_t addr = tor_addr_to_ipv4n(&conn->addr); + + buf[3] = 1; + reqsize += 4; + memcpy(buf + 4, &addr, 4); + memcpy(buf + 8, &port, 2); + } else { /* AF_INET6 */ + buf[3] = 4; + reqsize += 16; + memcpy(buf + 4, tor_addr_to_in6(&conn->addr), 16); + memcpy(buf + 20, &port, 2); + } + + connection_write_to_buf((char *)buf, reqsize, conn); + + conn->proxy_state = PROXY_SOCKS5_WANT_CONNECT_OK; +} + +/** Call this from connection_*_process_inbuf() to advance the proxy + * handshake. + * + * No matter what proxy protocol is used, if this function returns 1, the + * handshake is complete, and the data remaining on inbuf may contain the + * start of the communication with the requested server. + * + * Returns 0 if the current buffer contains an incomplete response, and -1 + * on error. + */ +int +connection_read_proxy_handshake(connection_t *conn) +{ + int ret = 0; + char *reason = NULL; + + log_debug(LD_NET, "enter state %s", + connection_proxy_state_to_string(conn->proxy_state)); + + switch (conn->proxy_state) { + case PROXY_HTTPS_WANT_CONNECT_OK: + ret = connection_read_https_proxy_response(conn); + if (ret == 1) + conn->proxy_state = PROXY_CONNECTED; + break; + + case PROXY_SOCKS4_WANT_CONNECT_OK: + ret = fetch_from_buf_socks_client(conn->inbuf, + conn->proxy_state, + &reason); + if (ret == 1) + conn->proxy_state = PROXY_CONNECTED; + break; + + case PROXY_SOCKS5_WANT_AUTH_METHOD_NONE: + ret = fetch_from_buf_socks_client(conn->inbuf, + conn->proxy_state, + &reason); + /* no auth needed, do connect */ + if (ret == 1) { + connection_send_socks5_connect(conn); + ret = 0; + } + break; + + case PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929: + ret = fetch_from_buf_socks_client(conn->inbuf, + conn->proxy_state, + &reason); + + /* send auth if needed, otherwise do connect */ + if (ret == 1) { + connection_send_socks5_connect(conn); + ret = 0; + } else if (ret == 2) { + unsigned char buf[1024]; + size_t reqsize, usize, psize; + const char *user, *pass; + + user = get_options()->Socks5ProxyUsername; + pass = get_options()->Socks5ProxyPassword; + tor_assert(user && pass); + + /* XXX len of user and pass must be <= 255 !!! */ + usize = strlen(user); + psize = strlen(pass); + tor_assert(usize <= 255 && psize <= 255); + reqsize = 3 + usize + psize; + + buf[0] = 1; /* negotiation version */ + buf[1] = usize; + memcpy(buf + 2, user, usize); + buf[2 + usize] = psize; + memcpy(buf + 3 + usize, pass, psize); + + connection_write_to_buf((char *)buf, reqsize, conn); + + conn->proxy_state = PROXY_SOCKS5_WANT_AUTH_RFC1929_OK; + ret = 0; + } + break; + + case PROXY_SOCKS5_WANT_AUTH_RFC1929_OK: + ret = fetch_from_buf_socks_client(conn->inbuf, + conn->proxy_state, + &reason); + /* send the connect request */ + if (ret == 1) { + connection_send_socks5_connect(conn); + ret = 0; + } + break; + + case PROXY_SOCKS5_WANT_CONNECT_OK: + ret = fetch_from_buf_socks_client(conn->inbuf, + conn->proxy_state, + &reason); + if (ret == 1) + conn->proxy_state = PROXY_CONNECTED; + break; + + default: + log_err(LD_BUG, "Invalid proxy_state for reading, %d", + conn->proxy_state); + tor_fragile_assert(); + ret = -1; + break; + } + + log_debug(LD_NET, "leaving state %s", + connection_proxy_state_to_string(conn->proxy_state)); + + if (ret < 0) { + if (reason) { + log_warn(LD_NET, "Proxy Client: unable to connect to %s:%d (%s)", + conn->address, conn->port, escaped(reason)); + tor_free(reason); + } else { + log_warn(LD_NET, "Proxy Client: unable to connect to %s:%d", + conn->address, conn->port); + } + } else if (ret == 1) { + log_info(LD_NET, "Proxy Client: connection to %s:%d successful", + conn->address, conn->port); + } + + return ret; +} + /** * Launch any configured listener connections of type type. (A * listener is configured if port_option is non-zero. If any @@ -1294,29 +1782,30 @@ /* Now open all the listeners that are configured but not opened. */ r = 0; if (!disable_all_conns) { - SMARTLIST_FOREACH(launch, config_line_t *, cfg_line, - { + SMARTLIST_FOREACH_BEGIN(launch, config_line_t *, cfg_line) { char *address = NULL; struct sockaddr *listensockaddr; + socklen_t listensocklen = 0; switch (socket_family) { case AF_INET: listensockaddr = (struct sockaddr *) create_inet_sockaddr(cfg_line->value, (uint16_t) port_option, - &address); + &address, &listensocklen); break; case AF_UNIX: listensockaddr = (struct sockaddr *) create_unix_sockaddr(cfg_line->value, - &address); + &address, &listensocklen); break; default: tor_assert(0); } if (listensockaddr) { - conn = connection_create_listener(listensockaddr, type, address); + conn = connection_create_listener(listensockaddr, listensocklen, + type, address); tor_free(listensockaddr); tor_free(address); } else @@ -1328,7 +1817,7 @@ if (new_conns) smartlist_add(new_conns, conn); } - }); + } SMARTLIST_FOREACH_END(cfg_line); } if (free_launch_elts) { @@ -1405,7 +1894,9 @@ static int connection_is_rate_limited(connection_t *conn) { - if (conn->linked || is_internal_IP(conn->addr, 0)) + if (conn->linked || /* internal connection */ + tor_addr_family(&conn->addr) == AF_UNSPEC || /* no address */ + tor_addr_is_internal(&conn->addr, 0)) /* internal address */ return 0; else return 1; @@ -1508,6 +1999,7 @@ int base = connection_speaks_cells(conn) ? CELL_NETWORK_SIZE : RELAY_PAYLOAD_SIZE; int priority = conn->type != CONN_TYPE_DIR; + int conn_bucket = (int)conn->outbuf_flushlen; int global_bucket = global_write_bucket; if (!connection_is_rate_limited(conn)) { @@ -1515,12 +2007,22 @@ return conn->outbuf_flushlen; } + if (connection_speaks_cells(conn)) { + /* use the per-conn write limit if it's lower, but if it's less + * than zero just use zero */ + or_connection_t *or_conn = TO_OR_CONN(conn); + if (conn->state == OR_CONN_STATE_OPEN) + if (or_conn->write_bucket < conn_bucket) + conn_bucket = or_conn->write_bucket >= 0 ? + or_conn->write_bucket : 0; + } + if (connection_counts_as_relayed_traffic(conn, now) && global_relayed_write_bucket <= global_write_bucket) global_bucket = global_relayed_write_bucket; - return connection_bucket_round_robin(base, priority, global_bucket, - conn->outbuf_flushlen); + return connection_bucket_round_robin(base, priority, + global_bucket, conn_bucket); } /** Return 1 if the global write buckets are low enough that we @@ -1574,14 +2076,12 @@ return 0; } -/** We just read num_read and wrote num_written onto conn. - * Decrement buckets appropriately. */ +/** We just read num_read and wrote num_written bytes + * onto conn. Decrement buckets appropriately. */ static void connection_buckets_decrement(connection_t *conn, time_t now, size_t num_read, size_t num_written) { - if (!connection_is_rate_limited(conn)) - return; /* local IPs are free */ if (num_written >= INT_MAX || num_read >= INT_MAX) { log_err(LD_BUG, "Value out of range. num_read=%lu, num_written=%lu, " "connection type=%s, state=%s", @@ -1593,10 +2093,24 @@ tor_fragile_assert(); } - if (num_read > 0) + /* Count bytes of answering direct and tunneled directory requests */ + if (conn->type == CONN_TYPE_DIR && conn->purpose == DIR_PURPOSE_SERVER) { + if (num_read > 0) + rep_hist_note_dir_bytes_read(num_read, now); + if (num_written > 0) + rep_hist_note_dir_bytes_written(num_written, now); + } + + if (!connection_is_rate_limited(conn)) + return; /* local IPs are free */ + if (num_read > 0) { rep_hist_note_bytes_read(num_read, now); - if (num_written > 0) + } + if (num_written > 0) { rep_hist_note_bytes_written(num_written, now); + } + if (conn->type == CONN_TYPE_EXIT) + rep_hist_note_exit_bytes(conn->port, num_written, num_read); if (connection_counts_as_relayed_traffic(conn, now)) { global_relayed_read_bucket -= (int)num_read; @@ -1604,8 +2118,10 @@ } global_read_bucket -= (int)num_read; global_write_bucket -= (int)num_written; - if (connection_speaks_cells(conn) && conn->state == OR_CONN_STATE_OPEN) + if (connection_speaks_cells(conn) && conn->state == OR_CONN_STATE_OPEN) { TO_OR_CONN(conn)->read_bucket -= (int)num_read; + TO_OR_CONN(conn)->write_bucket -= (int)num_written; + } } /** If we have exhausted our global buckets, or the buckets for conn, @@ -1617,7 +2133,7 @@ if (global_read_bucket <= 0) { reason = "global read bucket exhausted. Pausing."; - } else if (connection_counts_as_relayed_traffic(conn, time(NULL)) && + } else if (connection_counts_as_relayed_traffic(conn, approx_time()) && global_relayed_read_bucket <= 0) { reason = "global relayed read bucket exhausted. Pausing."; } else if (connection_speaks_cells(conn) && @@ -1641,15 +2157,13 @@ if (global_write_bucket <= 0) { reason = "global write bucket exhausted. Pausing."; - } else if (connection_counts_as_relayed_traffic(conn, time(NULL)) && + } else if (connection_counts_as_relayed_traffic(conn, approx_time()) && global_relayed_write_bucket <= 0) { reason = "global relayed write bucket exhausted. Pausing."; -#if 0 } else if (connection_speaks_cells(conn) && conn->state == OR_CONN_STATE_OPEN && TO_OR_CONN(conn)->write_bucket <= 0) { reason = "connection write bucket exhausted. Pausing."; -#endif } else return; /* all good, no need to stop it */ @@ -1675,7 +2189,7 @@ } } -/** Refill a single bucket called name with bandwith rate +/** Refill a single bucket called name with bandwidth rate * rate and bandwidth burst burst, assuming that * seconds_elapsed seconds have passed since the last call. **/ @@ -1694,7 +2208,7 @@ if (*bucket > burst || *bucket < starting_bucket) { /* If we overflow the burst, or underflow our starting bucket, * cap the bucket value to burst. */ - /* XXXX021 this might be redundant now, but it doesn't show up + /* XXXX this might be redundant now, but it doesn't show up * in profiles. Remove it after analysis. */ *bucket = burst; } @@ -1745,14 +2259,19 @@ { if (connection_speaks_cells(conn)) { or_connection_t *or_conn = TO_OR_CONN(conn); - if (connection_read_bucket_should_increase(or_conn)) { + if (connection_bucket_should_increase(or_conn->read_bucket, or_conn)) { connection_bucket_refill_helper(&or_conn->read_bucket, or_conn->bandwidthrate, or_conn->bandwidthburst, seconds_elapsed, "or_conn->read_bucket"); - //log_fn(LOG_DEBUG,"Receiver bucket %d now %d.", i, - // conn->read_bucket); + } + if (connection_bucket_should_increase(or_conn->write_bucket, or_conn)) { + connection_bucket_refill_helper(&or_conn->write_bucket, + or_conn->bandwidthrate, + or_conn->bandwidthburst, + seconds_elapsed, + "or_conn->write_bucket"); } } @@ -1773,8 +2292,10 @@ if (conn->write_blocked_on_bw == 1 && global_write_bucket > 0 /* and we're allowed to write */ && (!connection_counts_as_relayed_traffic(conn, now) || - global_relayed_write_bucket > 0)) { - /* even if we're relayed traffic */ + global_relayed_write_bucket > 0) /* even if it's relayed traffic */ + && (!connection_speaks_cells(conn) || + conn->state != OR_CONN_STATE_OPEN || + TO_OR_CONN(conn)->write_bucket > 0)) { LOG_FN_CONN(conn, (LOG_DEBUG,LD_NET, "waking up conn (fd %d) for write", conn->s)); conn->write_blocked_on_bw = 0; @@ -1783,17 +2304,17 @@ }); } -/** Is the receiver bucket for connection conn low enough that we +/** Is the bucket for connection conn low enough that we * should add another pile of tokens to it? */ static int -connection_read_bucket_should_increase(or_connection_t *conn) +connection_bucket_should_increase(int bucket, or_connection_t *conn) { tor_assert(conn); if (conn->_base.state != OR_CONN_STATE_OPEN) return 0; /* only open connections play the rate limiting game */ - if (conn->read_bucket >= conn->bandwidthburst) + if (bucket >= conn->bandwidthburst) return 0; return 1; @@ -1811,16 +2332,17 @@ * Mark the connection and return -1 if you want to close it, else * return 0. */ -int -connection_handle_read(connection_t *conn) +static int +connection_handle_read_impl(connection_t *conn) { int max_to_read=-1, try_to_read; size_t before, n_read = 0; + int socket_error = 0; if (conn->marked_for_close) return 0; /* do nothing */ - conn->timestamp_lastread = time(NULL); + conn->timestamp_lastread = approx_time(); switch (conn->type) { case CONN_TYPE_OR_LISTENER: @@ -1839,13 +2361,19 @@ return 0; } -loop_again: + loop_again: try_to_read = max_to_read; tor_assert(!conn->marked_for_close); before = buf_datalen(conn->inbuf); - if (connection_read_to_buf(conn, &max_to_read) < 0) { + if (connection_read_to_buf(conn, &max_to_read, &socket_error) < 0) { /* There's a read error; kill the connection.*/ + if (conn->type == CONN_TYPE_OR && + conn->state == OR_CONN_STATE_CONNECTING) { + connection_or_connect_failed(TO_OR_CONN(conn), + errno_to_orconn_end_reason(socket_error), + tor_socket_strerror(socket_error)); + } if (CONN_IS_EDGE(conn)) { edge_connection_t *edge_conn = TO_EDGE_CONN(conn); connection_edge_end_errno(edge_conn); @@ -1874,23 +2402,17 @@ return -1; } if (conn->linked_conn) { - /* The other side's handle_write will never actually get called, so + /* The other side's handle_write() will never actually get called, so * we need to invoke the appropriate callbacks ourself. */ connection_t *linked = conn->linked_conn; - /* XXXX020 Do we need to ensure that this stuff is called even if - * conn dies in a way that causes us to return -1 earlier? -NM - * No idea. -RD */ - /* Actually, I'm pretty sure not. The big things here are to - * tell the linked connection, "yes, you wrote some stuff!" so that - * it can succeed as a appropriate. But if this side of the link - * returned -1, then it couldn't process the data it got. That's - * fairly rare, and doesn't really count as "success" for the other - * side. -NM - */ if (n_read) { - /* Probably a no-op, but hey. */ - connection_buckets_decrement(linked, time(NULL), 0, n_read); + /* Probably a no-op, since linked conns typically don't count for + * bandwidth rate limiting. But do it anyway so we can keep stats + * accurately. Note that since we read the bytes from conn, and + * we're writing the bytes onto the linked connection, we count + * these as written bytes. */ + connection_buckets_decrement(linked, approx_time(), 0, n_read); if (connection_flushed_some(linked) < 0) connection_mark_for_close(linked); @@ -1901,7 +2423,7 @@ if (!buf_datalen(linked->outbuf) && conn->active_on_link) connection_stop_reading_from_linked_conn(conn); } - /* If we hit the EOF, call connection_reached_eof. */ + /* If we hit the EOF, call connection_reached_eof(). */ if (!conn->marked_for_close && conn->inbuf_reached_eof && connection_reached_eof(conn) < 0) { @@ -1910,6 +2432,16 @@ return 0; } +int +connection_handle_read(connection_t *conn) +{ + int res; + + tor_gettimeofday_cache_clear(); + res = connection_handle_read_impl(conn); + return res; +} + /** Pull in new bytes from conn-\>s or conn-\>linked_conn onto conn-\>inbuf, * either directly or via TLS. Reduce the token buckets by the number of bytes * read. @@ -1921,7 +2453,7 @@ * Return -1 if we want to break conn, else return 0. */ static int -connection_read_to_buf(connection_t *conn, int *max_to_read) +connection_read_to_buf(connection_t *conn, int *max_to_read, int *socket_error) { int result; ssize_t at_most = *max_to_read; @@ -1930,8 +2462,7 @@ if (at_most == -1) { /* we need to initialize it */ /* how many bytes are we allowed to read? */ - /* XXXX020 too many calls to time(). Do they hurt? */ - at_most = connection_bucket_read_limit(conn, time(NULL)); + at_most = connection_bucket_read_limit(conn, approx_time()); } slack_in_buf = buf_slack(conn->inbuf); @@ -1944,7 +2475,7 @@ } if (connection_speaks_cells(conn) && - conn->state > OR_CONN_STATE_PROXY_READING) { + conn->state > OR_CONN_STATE_PROXY_HANDSHAKING) { int pending; or_connection_t *or_conn = TO_OR_CONN(conn); size_t initial_size; @@ -1972,7 +2503,7 @@ case TOR_TLS_CLOSE: case TOR_TLS_ERROR_IO: log_debug(LD_NET,"TLS connection closed %son read. Closing. " - "(Nickname %s, address %s", + "(Nickname %s, address %s)", result == TOR_TLS_CLOSE ? "cleanly " : "", or_conn->nickname ? or_conn->nickname : "not set", conn->address); @@ -2028,7 +2559,8 @@ /* !connection_speaks_cells, !conn->linked_conn. */ int reached_eof = 0; CONN_LOG_PROTECT(conn, - result = read_to_buf(conn->s, at_most, conn->inbuf, &reached_eof)); + result = read_to_buf(conn->s, at_most, conn->inbuf, &reached_eof, + socket_error)); if (reached_eof) conn->inbuf_reached_eof = 1; @@ -2050,7 +2582,7 @@ edge_conn->n_read += (int)n_read; } - connection_buckets_decrement(conn, time(NULL), n_read, n_written); + connection_buckets_decrement(conn, approx_time(), n_read, n_written); if (more_to_read && result == at_most) { slack_in_buf = buf_slack(conn->inbuf); @@ -2111,14 +2643,14 @@ * Mark the connection and return -1 if you want to close it, else * return 0. */ -int -connection_handle_write(connection_t *conn, int force) +static int +connection_handle_write_impl(connection_t *conn, int force) { int e; socklen_t len=(socklen_t)sizeof(e); int result; ssize_t max_to_write; - time_t now = time(NULL); + time_t now = approx_time(); size_t n_read = 0, n_written = 0; tor_assert(!connection_is_listener(conn)); @@ -2127,7 +2659,7 @@ return 0; /* do nothing */ if (conn->in_flushed_some) { - log_warn(LD_BUG, "called recursively from inside conn->in_flushed_some()"); + log_warn(LD_BUG, "called recursively from inside conn->in_flushed_some"); return 0; } @@ -2146,17 +2678,17 @@ if (e) { /* some sort of error, but maybe just inprogress still */ if (!ERRNO_IS_CONN_EINPROGRESS(e)) { - log_info(LD_NET,"in-progress connect failed. Removing."); + log_info(LD_NET,"in-progress connect failed. Removing. (%s)", + tor_socket_strerror(e)); if (CONN_IS_EDGE(conn)) connection_edge_end_errno(TO_EDGE_CONN(conn)); + if (conn->type == CONN_TYPE_OR) + connection_or_connect_failed(TO_OR_CONN(conn), + errno_to_orconn_end_reason(e), + tor_socket_strerror(e)); connection_close_immediate(conn); connection_mark_for_close(conn); - /* it's safe to pass OPs to router_set_status(), since it just - * ignores unrecognized routers - */ - if (conn->type == CONN_TYPE_OR && !get_options()->HttpsProxy) - router_set_status(TO_OR_CONN(conn)->identity_digest, 0); return -1; } else { return 0; /* no change, see if next time is better */ @@ -2171,7 +2703,7 @@ : connection_bucket_write_limit(conn, now); if (connection_speaks_cells(conn) && - conn->state > OR_CONN_STATE_PROXY_READING) { + conn->state > OR_CONN_STATE_PROXY_HANDSHAKING) { or_connection_t *or_conn = TO_OR_CONN(conn); if (conn->state == OR_CONN_STATE_TLS_HANDSHAKING || conn->state == OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING) { @@ -2190,6 +2722,13 @@ /* else open, or closing */ result = flush_buf_tls(or_conn->tls, conn->outbuf, max_to_write, &conn->outbuf_flushlen); + + /* If we just flushed the last bytes, check if this tunneled dir + * request is done. */ + if (buf_datalen(conn->outbuf) == 0 && conn->dirreq_id) + geoip_change_dirreq_state(conn->dirreq_id, DIRREQ_TUNNELED, + DIRREQ_OR_CONN_BUFFER_FLUSHED); + switch (result) { CASE_TOR_TLS_ERROR_ANY: case TOR_TLS_CLOSE: @@ -2209,8 +2748,8 @@ if (!connection_is_reading(conn)) { connection_stop_writing(conn); conn->write_blocked_on_bw = 1; - /* we'll start reading again when the next second arrives, - * and then also start writing again. + /* we'll start reading again when we get more tokens in our + * read bucket; then we'll start writing again too. */ } /* else no problem, we're already reading */ @@ -2245,7 +2784,7 @@ edge_conn->n_written += (int)n_written; } - connection_buckets_decrement(conn, time(NULL), n_read, n_written); + connection_buckets_decrement(conn, approx_time(), n_read, n_written); if (result > 0) { /* If we wrote any bytes from our buffer, then call the appropriate @@ -2272,7 +2811,16 @@ return 0; } -/** Openssl TLS record size is 16383; this is close. The goal here is to +int +connection_handle_write(connection_t *conn, int force) +{ + int res; + tor_gettimeofday_cache_clear(); + res = connection_handle_write_impl(conn, force); + return res; +} + +/** OpenSSL TLS record size is 16383; this is close. The goal here is to * push data out as soon as we know there's enough for a TLS record, so * during periods of high load we won't read entire megabytes from * input before pushing any data out. It also has the feature of not @@ -2383,14 +2931,14 @@ * or NULL if no such connection exists. */ connection_t * connection_get_by_type_addr_port_purpose(int type, - uint32_t addr, uint16_t port, + const tor_addr_t *addr, uint16_t port, int purpose) { smartlist_t *conns = get_connection_array(); SMARTLIST_FOREACH(conns, connection_t *, conn, { if (conn->type == type && - conn->addr == addr && + tor_addr_eq(&conn->addr, addr) && conn->port == port && conn->purpose == purpose && !conn->marked_for_close) @@ -2445,18 +2993,17 @@ /** Return a connection of type type that has rendquery equal * to rendquery, and that is not marked for close. If state - * is non-zero, conn must be of that state too. If rendversion is - * nonnegative, conn must be fetching that rendversion, too. + * is non-zero, conn must be of that state too. */ connection_t * connection_get_by_type_state_rendquery(int type, int state, - const char *rendquery, - int rendversion) + const char *rendquery) { smartlist_t *conns = get_connection_array(); tor_assert(type == CONN_TYPE_DIR || type == CONN_TYPE_AP || type == CONN_TYPE_EXIT); + tor_assert(rendquery); SMARTLIST_FOREACH(conns, connection_t *, conn, { @@ -2464,12 +3011,14 @@ !conn->marked_for_close && (!state || state == conn->state)) { if (type == CONN_TYPE_DIR && - (rendversion < 0 || - rendversion == TO_DIR_CONN(conn)->rend_version) && - !rend_cmp_service_ids(rendquery, TO_DIR_CONN(conn)->rend_query)) + TO_DIR_CONN(conn)->rend_data && + !rend_cmp_service_ids(rendquery, + TO_DIR_CONN(conn)->rend_data->onion_address)) return conn; else if (CONN_IS_EDGE(conn) && - !rend_cmp_service_ids(rendquery, TO_EDGE_CONN(conn)->rend_query)) + TO_EDGE_CONN(conn)->rend_data && + !rend_cmp_service_ids(rendquery, + TO_EDGE_CONN(conn)->rend_data->onion_address)) return conn; } }); @@ -2580,10 +3129,10 @@ static void client_check_address_changed(int sock) { - uint32_t iface_ip, ip_out; + uint32_t iface_ip, ip_out; /* host order */ struct sockaddr_in out_addr; socklen_t out_addr_len = (socklen_t) sizeof(out_addr); - uint32_t *ip; + uint32_t *ip; /* host order */ if (!last_interface_ip) get_interface_address(LOG_INFO, &last_interface_ip); @@ -2597,7 +3146,7 @@ return; } - /* Okay. If we've used this address previously, we're okay. */ + /* If we've used this address previously, we're okay. */ ip_out = ntohl(out_addr.sin_addr.s_addr); SMARTLIST_FOREACH(outgoing_addrs, uint32_t*, ip_ptr, if (*ip_ptr == ip_out) return; @@ -2616,7 +3165,7 @@ } else { /* The interface changed. We're a client, so we need to regenerate our * keys. First, reset the state. */ - log(LOG_NOTICE, LD_NET, "Our IP has changed. Rotating keys..."); + log(LOG_NOTICE, LD_NET, "Our IP address has changed. Rotating keys..."); last_interface_ip = iface_ip; SMARTLIST_FOREACH(outgoing_addrs, void*, ip_ptr, tor_free(ip_ptr)); smartlist_clear(outgoing_addrs); @@ -2861,14 +3410,14 @@ if (conn->linked_conn) { tor_assert(conn->linked_conn->linked_conn == conn); - tor_assert(conn->linked != 0); + tor_assert(conn->linked); } if (conn->linked) tor_assert(conn->s < 0); if (conn->outbuf_flushlen > 0) { tor_assert(connection_is_writing(conn) || conn->write_blocked_on_bw || - conn->edge_blocked_on_circ); + (CONN_IS_EDGE(conn) && TO_EDGE_CONN(conn)->edge_blocked_on_circ)); } if (conn->hold_open_until_flushed) @@ -2883,11 +3432,6 @@ assert_buf_ok(conn->outbuf); } - if (conn->chosen_exit_optional || conn->chosen_exit_retries) { - tor_assert(conn->type == CONN_TYPE_AP); - tor_assert((TO_EDGE_CONN(conn))->chosen_exit_name); - } - if (conn->type == CONN_TYPE_OR) { or_connection_t *or_conn = TO_OR_CONN(conn); if (conn->state == OR_CONN_STATE_OPEN) { @@ -2901,18 +3445,23 @@ } // tor_assert(conn->addr && conn->port); tor_assert(conn->address); - if (conn->state > OR_CONN_STATE_PROXY_READING) + if (conn->state > OR_CONN_STATE_PROXY_HANDSHAKING) tor_assert(or_conn->tls); } if (CONN_IS_EDGE(conn)) { edge_connection_t *edge_conn = TO_EDGE_CONN(conn); + if (edge_conn->chosen_exit_optional || edge_conn->chosen_exit_retries) { + tor_assert(conn->type == CONN_TYPE_AP); + tor_assert(edge_conn->chosen_exit_name); + } + /* XXX unchecked: package window, deliver window. */ if (conn->type == CONN_TYPE_AP) { tor_assert(edge_conn->socks_request); if (conn->state == AP_CONN_STATE_OPEN) { - tor_assert(edge_conn->socks_request->has_finished != 0); + tor_assert(edge_conn->socks_request->has_finished); if (!conn->marked_for_close) { tor_assert(edge_conn->cpath_layer); assert_cpath_layer_ok(edge_conn->cpath_layer); diff -Nru tor-0.2.0.34/src/or/connection_edge.c tor-0.2.2.16-alpha/src/or/connection_edge.c --- tor-0.2.0.34/src/or/connection_edge.c 2009-01-30 19:21:27.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/connection_edge.c 2010-09-17 01:30:36.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: connection_edge.c 18298 2009-01-28 16:29:58Z nickm $ */ -const char connection_edge_c_id[] = - "$Id: connection_edge.c 18298 2009-01-28 16:29:58Z nickm $"; /** * \file connection_edge.c @@ -13,6 +10,28 @@ **/ #include "or.h" +#include "buffers.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "connection_or.h" +#include "control.h" +#include "dns.h" +#include "dnsserv.h" +#include "dirserv.h" +#include "hibernate.h" +#include "main.h" +#include "policies.h" +#include "reasons.h" +#include "relay.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rendservice.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" #ifdef HAVE_LINUX_TYPES_H #include @@ -28,8 +47,8 @@ #define TRANS_PF #endif -/** List of exit_redirect_t for every configured RedirectExit. */ -static smartlist_t *redirect_exit_list = NULL; +#define SOCKS4_GRANTED 90 +#define SOCKS4_REJECT 91 static int connection_ap_handshake_process_socks(edge_connection_t *conn); static int connection_ap_process_natd(edge_connection_t *conn); @@ -47,7 +66,7 @@ int line, const char *file) { tor_assert(conn->_base.type == CONN_TYPE_AP); - conn->_base.edge_has_sent_end = 1; /* no circ yet */ + conn->edge_has_sent_end = 1; /* no circ yet */ if (conn->_base.marked_for_close) { /* This call will warn as appropriate. */ @@ -128,7 +147,7 @@ return 0; case AP_CONN_STATE_OPEN: case EXIT_CONN_STATE_OPEN: - if (connection_edge_package_raw_inbuf(conn, package_partial) < 0) { + if (connection_edge_package_raw_inbuf(conn, package_partial, NULL) < 0) { /* (We already sent an end cell if possible) */ connection_mark_for_close(TO_CONN(conn)); return -1; @@ -156,19 +175,20 @@ * Mark it for close and return 0. */ int -connection_edge_destroy(uint16_t circ_id, edge_connection_t *conn) +connection_edge_destroy(circid_t circ_id, edge_connection_t *conn) { if (!conn->_base.marked_for_close) { log_info(LD_EDGE, "CircID %d: At an edge. Marking connection for close.", circ_id); if (conn->_base.type == CONN_TYPE_AP) { connection_mark_unattached_ap(conn, END_STREAM_REASON_DESTROY); + control_event_stream_bandwidth(conn); control_event_stream_status(conn, STREAM_EVENT_CLOSED, END_STREAM_REASON_DESTROY); conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED; } else { /* closing the circuit, nothing to send an END to */ - conn->_base.edge_has_sent_end = 1; + conn->edge_has_sent_end = 1; conn->end_reason = END_STREAM_REASON_DESTROY; conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED; connection_mark_for_close(TO_CONN(conn)); @@ -180,20 +200,44 @@ return 0; } -/** Send a relay end cell from stream conn down conn's circuit. Set - * the relay end cell's reason for closing as reason. +/** Send a raw end cell to the stream with ID stream_id out over the + * circ towards the hop identified with cpath_layer. If this + * is not a client connection, set the relay end cell's reason for closing + * as reason */ +static int +relay_send_end_cell_from_edge(streamid_t stream_id, circuit_t *circ, + uint8_t reason, crypt_path_t *cpath_layer) +{ + char payload[1]; + + if (CIRCUIT_PURPOSE_IS_CLIENT(circ->purpose)) { + /* Never send the server an informative reason code; it doesn't need to + * know why the client stream is failing. */ + reason = END_STREAM_REASON_MISC; + } + + payload[0] = (char) reason; + + return relay_send_command_from_edge(stream_id, circ, RELAY_COMMAND_END, + payload, 1, cpath_layer); +} + +/** Send a relay end cell from stream conn down conn's circuit, and + * remember that we've done so. If this is not a client connection, set the + * relay end cell's reason for closing as reason. * * Return -1 if this function has already been called on this conn, * else return 0. */ int -connection_edge_end(edge_connection_t *conn, char reason) +connection_edge_end(edge_connection_t *conn, uint8_t reason) { char payload[RELAY_PAYLOAD_SIZE]; size_t payload_len=1; circuit_t *circ; + uint8_t control_reason = reason; - if (conn->_base.edge_has_sent_end) { + if (conn->edge_has_sent_end) { log_warn(LD_BUG,"(Harmless.) Calling connection_edge_end (reason %d) " "on an already ended stream?", reason); tor_fragile_assert(); @@ -207,15 +251,29 @@ return 0; } - payload[0] = reason; + circ = circuit_get_by_edge_conn(conn); + if (circ && CIRCUIT_PURPOSE_IS_CLIENT(circ->purpose)) { + /* If this is a client circuit, don't send the server an informative + * reason code; it doesn't need to know why the client stream is + * failing. */ + reason = END_STREAM_REASON_MISC; + } + + payload[0] = (char)reason; if (reason == END_STREAM_REASON_EXITPOLICY && !connection_edge_is_rendezvous_stream(conn)) { - set_uint32(payload+1, htonl(conn->_base.addr)); - set_uint32(payload+5, htonl(dns_clip_ttl(conn->address_ttl))); - payload_len += 8; + int addrlen; + if (tor_addr_family(&conn->_base.addr) == AF_INET) { + set_uint32(payload+1, tor_addr_to_ipv4n(&conn->_base.addr)); + addrlen = 4; + } else { + memcpy(payload+1, tor_addr_to_in6_addr8(&conn->_base.addr), 16); + addrlen = 16; + } + set_uint32(payload+1+addrlen, htonl(dns_clip_ttl(conn->address_ttl))); + payload_len += 4+addrlen; } - circ = circuit_get_by_edge_conn(conn); if (circ && !circ->marked_for_close) { log_debug(LD_EDGE,"Sending end on conn (fd %d).",conn->_base.s); connection_edge_send_command(conn, RELAY_COMMAND_END, @@ -225,12 +283,12 @@ conn->_base.s); } - conn->_base.edge_has_sent_end = 1; - conn->end_reason = reason; + conn->edge_has_sent_end = 1; + conn->end_reason = control_reason; return 0; } -/** An error has just occured on an operation on an edge connection +/** An error has just occurred on an operation on an edge connection * conn. Extract the errno; convert it to an end reason, and send an * appropriate relay end cell to the other end of the connection's circuit. **/ @@ -239,7 +297,7 @@ { uint8_t reason; tor_assert(conn); - reason = (uint8_t)errno_to_end_reason(tor_socket_errno(conn->_base.s)); + reason = errno_to_stream_end_reason(tor_socket_errno(conn->_base.s)); return connection_edge_end(conn, reason); } @@ -286,22 +344,21 @@ int connection_edge_finished_connecting(edge_connection_t *edge_conn) { - char valbuf[INET_NTOA_BUF_LEN]; connection_t *conn; - struct in_addr in; tor_assert(edge_conn); tor_assert(edge_conn->_base.type == CONN_TYPE_EXIT); conn = TO_CONN(edge_conn); tor_assert(conn->state == EXIT_CONN_STATE_CONNECTING); - in.s_addr = htonl(conn->addr); - tor_inet_ntoa(&in,valbuf,sizeof(valbuf)); log_info(LD_EXIT,"Exit connection to %s:%u (%s) established.", - escaped_safe_str(conn->address),conn->port,safe_str(valbuf)); + escaped_safe_str(conn->address), conn->port, + safe_str(fmt_addr(&conn->addr))); + + rep_hist_note_exit_stream_opened(conn->port); conn->state = EXIT_CONN_STATE_OPEN; - connection_watch_events(conn, EV_READ); /* stop writing, continue reading */ + connection_watch_events(conn, READ_EVENT); /* stop writing, keep reading */ if (connection_wants_to_flush(conn)) /* in case there are any queued relay * cells */ connection_start_writing(conn); @@ -311,13 +368,22 @@ RELAY_COMMAND_CONNECTED, NULL, 0) < 0) return 0; /* circuit is closed, don't continue */ } else { - char connected_payload[8]; - set_uint32(connected_payload, htonl(conn->addr)); - set_uint32(connected_payload+4, - htonl(dns_clip_ttl(edge_conn->address_ttl))); + char connected_payload[20]; + int connected_payload_len; + if (tor_addr_family(&conn->addr) == AF_INET) { + set_uint32(connected_payload, tor_addr_to_ipv4n(&conn->addr)); + set_uint32(connected_payload+4, + htonl(dns_clip_ttl(edge_conn->address_ttl))); + connected_payload_len = 8; + } else { + memcpy(connected_payload, tor_addr_to_in6_addr8(&conn->addr), 16); + set_uint32(connected_payload+16, + htonl(dns_clip_ttl(edge_conn->address_ttl))); + connected_payload_len = 20; + } if (connection_edge_send_command(edge_conn, - RELAY_COMMAND_CONNECTED, - connected_payload, 8) < 0) + RELAY_COMMAND_CONNECTED, + connected_payload, connected_payload_len) < 0) return 0; /* circuit is closed, don't continue */ } tor_assert(edge_conn->package_window > 0); @@ -333,13 +399,16 @@ static int compute_retry_timeout(edge_connection_t *conn) { + int timeout = get_options()->CircuitStreamTimeout; + if (timeout) /* if our config options override the default, use them */ + return timeout; if (conn->num_socks_retries < 2) /* try 0 and try 1 */ return 10; return 15; } /** Find all general-purpose AP streams waiting for a response that sent their - * begin/resolve cell >=15 seconds ago. Detach from their current circuit, and + * begin/resolve cell too long ago. Detach from their current circuit, and * mark their current circuit as unsuitable for new streams. Then call * connection_ap_handshake_attach_circuit() to attach to a new circuit (if * available) or launch a new one. @@ -356,25 +425,33 @@ or_options_t *options = get_options(); int severity; int cutoff; - int seconds_idle; + int seconds_idle, seconds_since_born; smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, c, - { + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, c) { if (c->type != CONN_TYPE_AP || c->marked_for_close) continue; conn = TO_EDGE_CONN(c); /* if it's an internal linked connection, don't yell its status. */ - severity = (!conn->_base.addr && !conn->_base.port) + severity = (tor_addr_is_null(&conn->_base.addr) && !conn->_base.port) ? LOG_INFO : LOG_NOTICE; seconds_idle = (int)( now - conn->_base.timestamp_lastread ); + seconds_since_born = (int)( now - conn->_base.timestamp_created ); + if (conn->_base.state == AP_CONN_STATE_OPEN) + continue; + + /* We already consider SocksTimeout in + * connection_ap_handshake_attach_circuit(), but we need to consider + * it here too because controllers that put streams in controller_wait + * state never ask Tor to attach the circuit. */ if (AP_CONN_STATE_IS_UNATTACHED(conn->_base.state)) { - if (seconds_idle >= options->SocksTimeout) { + if (seconds_since_born >= options->SocksTimeout) { log_fn(severity, LD_APP, "Tried for %d seconds to get a connection to %s:%d. " "Giving up. (%s)", - seconds_idle, safe_str(conn->socks_request->address), + seconds_since_born, + safe_str_client(conn->socks_request->address), conn->socks_request->port, conn_state_to_string(CONN_TYPE_AP, conn->_base.state)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TIMEOUT); @@ -382,9 +459,6 @@ continue; } - if (conn->_base.state == AP_CONN_STATE_OPEN) - continue; - /* We're in state connect_wait or resolve_wait now -- waiting for a * reply to our relay cell. See if we want to retry/give up. */ @@ -394,7 +468,7 @@ circ = circuit_get_by_edge_conn(conn); if (!circ) { /* it's vanished? */ log_info(LD_APP,"Conn is waiting (address %s), but lost its circ.", - safe_str(conn->socks_request->address)); + safe_str_client(conn->socks_request->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TIMEOUT); continue; } @@ -404,7 +478,7 @@ "Rend stream is %d seconds late. Giving up on address" " '%s.onion'.", seconds_idle, - safe_str(conn->socks_request->address)); + safe_str_client(conn->socks_request->address)); connection_edge_end(conn, END_STREAM_REASON_TIMEOUT); connection_mark_unattached_ap(conn, END_STREAM_REASON_TIMEOUT); } @@ -414,13 +488,14 @@ log_fn(cutoff < 15 ? LOG_INFO : severity, LD_APP, "We tried for %d seconds to connect to '%s' using exit '%s'." " Retrying on a new circuit.", - seconds_idle, safe_str(conn->socks_request->address), + seconds_idle, + safe_str_client(conn->socks_request->address), conn->cpath_layer ? conn->cpath_layer->extend_info->nickname : "*unnamed*"); /* send an end down the circuit */ connection_edge_end(conn, END_STREAM_REASON_TIMEOUT); /* un-mark it as ending, since we're going to reuse it */ - conn->_base.edge_has_sent_end = 0; + conn->edge_has_sent_end = 0; conn->end_reason = 0; /* kludge to make us not try this circuit again, yet to allow * current streams on it to survive if they can: make it @@ -434,9 +509,10 @@ /* move it back into 'pending' state, and try to attach. */ if (connection_ap_detach_retriable(conn, TO_ORIGIN_CIRCUIT(circ), END_STREAM_REASON_TIMEOUT)<0) { - connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); + if (!conn->_base.marked_for_close) + connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); } - }); /* end foreach */ + } SMARTLIST_FOREACH_END(conn); } /** Tell any AP streams that are waiting for a new circuit to try again, @@ -455,13 +531,18 @@ continue; edge_conn = TO_EDGE_CONN(conn); if (connection_ap_handshake_attach_circuit(edge_conn) < 0) { - connection_mark_unattached_ap(edge_conn, END_STREAM_REASON_CANT_ATTACH); + if (!edge_conn->_base.marked_for_close) + connection_mark_unattached_ap(edge_conn, + END_STREAM_REASON_CANT_ATTACH); } }); } -/** Tell any AP streams that are waiting for a onehop tunnel to +/** Tell any AP streams that are waiting for a one-hop tunnel to * failed_digest that they are going to fail. */ +/* XXX022 We should get rid of this function, and instead attach + * one-hop streams to circ->p_streams so they get marked in + * circuit_mark_for_close like normal p_streams. */ void connection_ap_fail_onehop(const char *failed_digest, cpath_build_state_t *build_state) @@ -469,8 +550,7 @@ edge_connection_t *edge_conn; char digest[DIGEST_LEN]; smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, conn, - { + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { if (conn->marked_for_close || conn->type != CONN_TYPE_AP || conn->state != AP_CONN_STATE_CIRCUIT_WAIT) @@ -483,19 +563,20 @@ continue; if (tor_digest_is_zero(digest)) { /* we don't know the digest; have to compare addr:port */ - struct in_addr in; + tor_addr_t addr; if (!build_state || !build_state->chosen_exit || - !edge_conn->socks_request || !edge_conn->socks_request->address || - !tor_inet_aton(edge_conn->socks_request->address, &in) || - build_state->chosen_exit->addr != ntohl(in.s_addr) || + !edge_conn->socks_request || !edge_conn->socks_request->address) + continue; + if (tor_addr_from_str(&addr, edge_conn->socks_request->address)<0 || + !tor_addr_eq(&build_state->chosen_exit->addr, &addr) || build_state->chosen_exit->port != edge_conn->socks_request->port) continue; } - log_info(LD_APP, "Closing onehop stream to '%s/%s' because the OR conn " + log_info(LD_APP, "Closing one-hop stream to '%s/%s' because the OR conn " "just failed.", edge_conn->chosen_exit_name, edge_conn->socks_request->address); connection_mark_unattached_ap(edge_conn, END_STREAM_REASON_TIMEOUT); - }); + } SMARTLIST_FOREACH_END(conn); } /** A circuit failed to finish on its last hop info. If there @@ -509,32 +590,32 @@ routerinfo_t *r1, *r2; smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, conn, - { + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { if (conn->marked_for_close || conn->type != CONN_TYPE_AP || - conn->state != AP_CONN_STATE_CIRCUIT_WAIT || - (!conn->chosen_exit_optional && - !conn->chosen_exit_retries)) + conn->state != AP_CONN_STATE_CIRCUIT_WAIT) continue; edge_conn = TO_EDGE_CONN(conn); + if (!edge_conn->chosen_exit_optional && + !edge_conn->chosen_exit_retries) + continue; r1 = router_get_by_nickname(edge_conn->chosen_exit_name, 0); r2 = router_get_by_nickname(info->nickname, 0); if (!r1 || !r2 || r1 != r2) continue; tor_assert(edge_conn->socks_request); - if (conn->chosen_exit_optional) { + if (edge_conn->chosen_exit_optional) { log_info(LD_APP, "Giving up on enclave exit '%s' for destination %s.", - safe_str(edge_conn->chosen_exit_name), - escaped_safe_str(edge_conn->socks_request->address)); - conn->chosen_exit_optional = 0; + safe_str_client(edge_conn->chosen_exit_name), + escaped_safe_str_client(edge_conn->socks_request->address)); + edge_conn->chosen_exit_optional = 0; tor_free(edge_conn->chosen_exit_name); /* clears it */ /* if this port is dangerous, warn or reject it now that we don't * think it'll be using an enclave. */ consider_plaintext_ports(edge_conn, edge_conn->socks_request->port); } - if (conn->chosen_exit_retries) { - if (--conn->chosen_exit_retries == 0) { /* give up! */ + if (edge_conn->chosen_exit_retries) { + if (--edge_conn->chosen_exit_retries == 0) { /* give up! */ clear_trackexithost_mappings(edge_conn->chosen_exit_name); tor_free(edge_conn->chosen_exit_name); /* clears it */ /* if this port is dangerous, warn or reject it now that we don't @@ -542,7 +623,7 @@ consider_plaintext_ports(edge_conn, edge_conn->socks_request->port); } } - }); + } SMARTLIST_FOREACH_END(conn); } /** The AP connection conn has just failed while attaching or @@ -579,17 +660,18 @@ * - A MapAddress command from the controller [permanent] * - An AddressMap directive in the torrc [permanent] * - When a TrackHostExits torrc directive is triggered [temporary] - * - When a dns resolve succeeds [temporary] - * - When a dns resolve fails [temporary] + * - When a DNS resolve succeeds [temporary] + * - When a DNS resolve fails [temporary] * * When an addressmap request is made but one is already registered, * the new one is replaced only if the currently registered one has - * no "new_address" (that is, it's in the process of dns resolve), + * no "new_address" (that is, it's in the process of DNS resolve), * or if the new one is permanent (expires==0 or 1). * * (We overload the 'expires' field, using "0" for mappings set via * the configuration file, "1" for mappings set from the control - * interface, and other values for DNS mappings that can expire.) + * interface, and other values for DNS and TrackHostExit mappings that can + * expire.) */ typedef struct { char *new_address; @@ -630,7 +712,11 @@ static void addressmap_ent_free(void *_ent) { - addressmap_entry_t *ent = _ent; + addressmap_entry_t *ent; + if (!_ent) + return; + + ent = _ent; tor_free(ent->new_address); tor_free(ent); } @@ -639,7 +725,11 @@ static void addressmap_virtaddress_ent_free(void *_ent) { - virtaddress_entry_t *ent = _ent; + virtaddress_entry_t *ent; + if (!_ent) + return; + + ent = _ent; tor_free(ent->ipv4_address); tor_free(ent->hostname_address); tor_free(ent); @@ -729,14 +819,11 @@ void addressmap_free_all(void) { - if (addressmap) { - strmap_free(addressmap, addressmap_ent_free); - addressmap = NULL; - } - if (virtaddress_reversemap) { - strmap_free(virtaddress_reversemap, addressmap_virtaddress_ent_free); - virtaddress_reversemap = NULL; - } + strmap_free(addressmap, addressmap_ent_free); + addressmap = NULL; + + strmap_free(virtaddress_reversemap, addressmap_virtaddress_ent_free); + virtaddress_reversemap = NULL; } /** Look at address, and rewrite it until it doesn't want any @@ -763,9 +850,9 @@ return (rewrites > 0); /* done, no rewrite needed */ } - cp = tor_strdup(escaped_safe_str(ent->new_address)); + cp = tor_strdup(escaped_safe_str_client(ent->new_address)); log_info(LD_APP, "Addressmap: rewriting %s to %s", - escaped_safe_str(address), cp); + escaped_safe_str_client(address), cp); if (ent->expires > 1 && ent->expires < expires) expires = ent->expires; tor_free(cp); @@ -773,7 +860,7 @@ } log_warn(LD_CONFIG, "Loop detected: we've rewritten %s 16 times! Using it as-is.", - escaped_safe_str(address)); + escaped_safe_str_client(address)); /* it's fine to rewrite a rewrite, but don't loop forever */ if (expires_out) *expires_out = TIME_MAX; @@ -795,9 +882,9 @@ tor_snprintf(s, len, "REVERSE[%s]", address); ent = strmap_get(addressmap, s); if (ent) { - cp = tor_strdup(escaped_safe_str(ent->new_address)); + cp = tor_strdup(escaped_safe_str_client(ent->new_address)); log_info(LD_APP, "Rewrote reverse lookup %s -> %s", - escaped_safe_str(s), cp); + escaped_safe_str_client(s), cp); tor_free(cp); strlcpy(address, ent->new_address, maxlen); r = 1; @@ -810,11 +897,19 @@ return r; } -/** Return 1 if address is already registered, else return 0 */ +/** Return 1 if address is already registered, else return 0. If address + * is already registered, and update_expires is non-zero, then update + * the expiry time on the mapping with update_expires if it is a + * mapping created by TrackHostExits. */ int -addressmap_have_mapping(const char *address) +addressmap_have_mapping(const char *address, int update_expiry) { - return strmap_get_lc(addressmap, address) ? 1 : 0; + addressmap_entry_t *ent; + if (!(ent=strmap_get_lc(addressmap, address))) + return 0; + if (update_expiry && ent->source==ADDRMAPSRC_TRACKEXIT) + ent->expires=time(NULL) + update_expiry; + return 1; } /** Register a request to map address to new_address, @@ -851,7 +946,9 @@ if (expires > 1) { log_info(LD_APP,"Temporary addressmap ('%s' to '%s') not performed, " "since it's already mapped to '%s'", - safe_str(address), safe_str(new_address), safe_str(ent->new_address)); + safe_str_client(address), + safe_str_client(new_address), + safe_str_client(ent->new_address)); tor_free(new_address); return; } @@ -870,7 +967,8 @@ ent->source = source; log_info(LD_CONFIG, "Addressmap: (re)mapped '%s' to '%s'", - safe_str(address), safe_str(ent->new_address)); + safe_str_client(address), + safe_str_client(ent->new_address)); control_event_address_mapped(address, ent->new_address, expires, NULL); } @@ -890,11 +988,12 @@ if (ent->num_resolve_failures < SHORT_MAX) ++ent->num_resolve_failures; /* don't overflow */ log_info(LD_APP, "Address %s now has %d resolve failures.", - safe_str(address), ent->num_resolve_failures); + safe_str_client(address), + ent->num_resolve_failures); return ent->num_resolve_failures; } -/** If address is in the client dns addressmap, reset +/** If address is in the client DNS addressmap, reset * the number of resolve failures we have on record for it. * This is used when we fail a stream because it won't resolve: * otherwise future attempts on that address will only try once. @@ -1169,8 +1268,10 @@ log_warn(LD_BUG, "Internal confusion: I thought that '%s' was mapped to by " "'%s', but '%s' really maps to '%s'. This is a harmless bug.", - safe_str(new_address), safe_str(*addrp), safe_str(*addrp), - ent?safe_str(ent->new_address):"(nothing)"); + safe_str_client(new_address), + safe_str_client(*addrp), + safe_str_client(*addrp), + ent?safe_str_client(ent->new_address):"(nothing)"); } tor_free(*addrp); @@ -1191,7 +1292,8 @@ (type == RESOLVED_TYPE_IPV4) ? vent->ipv4_address : vent->hostname_address)); log_info(LD_APP, "Map from %s to %s okay.", - safe_str(*addrp),safe_str(new_address)); + safe_str_client(*addrp), + safe_str_client(new_address)); } #endif @@ -1301,6 +1403,31 @@ return 0; } +/** How many times do we try connecting with an exit configured via + * TrackHostExits before concluding that it won't work any more and trying a + * different one? */ +#define TRACKHOSTEXITS_RETRIES 5 + +/** Call connection_ap_handshake_rewrite_and_attach() unless a controller + * asked us to leave streams unattached. Return 0 in that case. + * + * See connection_ap_handshake_rewrite_and_attach()'s + * documentation for arguments and return value. + */ +int +connection_ap_rewrite_and_attach_if_allowed(edge_connection_t *conn, + origin_circuit_t *circ, + crypt_path_t *cpath) +{ + or_options_t *options = get_options(); + + if (options->LeaveStreamsUnattached) { + conn->_base.state = AP_CONN_STATE_CONTROLLER_WAIT; + return 0; + } + return connection_ap_handshake_rewrite_and_attach(conn, circ, cpath); +} + /** Connection conn just finished its socks handshake, or the * controller asked us to take care of it. If circ is defined, * then that's where we'll want to attach it. Otherwise we have to @@ -1334,7 +1461,7 @@ tor_strlower(socks->address); /* normalize it */ strlcpy(orig_address, socks->address, sizeof(orig_address)); log_debug(LD_APP,"Client asked for %s:%d", - safe_str(socks->address), + safe_str_client(socks->address), socks->port); if (socks->command == SOCKS_COMMAND_RESOLVE && @@ -1351,7 +1478,8 @@ RESOLVED_TYPE_IPV4, tor_strdup(socks->address)); tor_assert(new_addr); log_info(LD_APP, "Automapping %s to %s", - escaped_safe_str(socks->address), safe_str(new_addr)); + escaped_safe_str_client(socks->address), + safe_str_client(new_addr)); strlcpy(socks->address, new_addr, sizeof(socks->address)); } } @@ -1374,17 +1502,10 @@ if (options->ClientDNSRejectInternalAddresses) { /* Don't let people try to do a reverse lookup on 10.0.0.1. */ tor_addr_t addr; - struct in_addr in; int ok; - if (!strcasecmpend(socks->address, ".in-addr.arpa")) - ok = !parse_inaddr_arpa_address(socks->address, &in); - else - ok = tor_inet_aton(socks->address, &in); - /*XXXX021 make this a function. */ - addr.family = AF_INET; - memcpy(&addr.addr.in_addr, &in, sizeof(struct in_addr)); - - if (ok && tor_addr_is_internal(&addr, 0)) { + ok = tor_addr_parse_reverse_lookup_name( + &addr, socks->address, AF_UNSPEC, 1); + if (ok == 1 && tor_addr_is_internal(&addr, 0)) { connection_ap_handshake_socks_resolved(conn, RESOLVED_TYPE_ERROR, 0, NULL, -1, TIME_MAX); connection_mark_unattached_ap(conn, @@ -1414,7 +1535,7 @@ * information. */ log_warn(LD_APP,"Missing mapping for virtual address '%s'. Refusing.", - socks->address); /* don't safe_str() this yet. */ + safe_str_client(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_INTERNAL); return -1; } @@ -1422,10 +1543,12 @@ /* Parse the address provided by SOCKS. Modify it in-place if it * specifies a hidden-service (.onion) or particular exit node (.exit). */ - addresstype = parse_extended_hostname(socks->address); + addresstype = parse_extended_hostname(socks->address, + remapped_to_exit || options->AllowDotExit); if (addresstype == BAD_HOSTNAME) { - log_warn(LD_APP, "Invalid hostname %s; rejecting", socks->address); + log_warn(LD_APP, "Invalid onion hostname %s; rejecting", + safe_str_client(socks->address)); control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", escaped(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); @@ -1434,20 +1557,18 @@ if (addresstype == EXIT_HOSTNAME) { /* foo.exit -- modify conn->chosen_exit_node to specify the exit - * node, and conn->address to hold only the address portion.*/ + * node, and conn->address to hold only the address portion. */ char *s = strrchr(socks->address,'.'); tor_assert(!automap); if (s) { if (s[1] != '\0') { conn->chosen_exit_name = tor_strdup(s+1); -/* DOCDOC */ -#define TRACKHOSTEXITS_RETRIES 5 if (remapped_to_exit) /* 5 tries before it expires the addressmap */ - TO_CONN(conn)->chosen_exit_retries = TRACKHOSTEXITS_RETRIES; + conn->chosen_exit_retries = TRACKHOSTEXITS_RETRIES; *s = 0; } else { log_warn(LD_APP,"Malformed exit address '%s.exit'. Refusing.", - safe_str(socks->address)); + safe_str_client(socks->address)); control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", escaped(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); @@ -1463,7 +1584,7 @@ } else { log_warn(LD_APP, "Unrecognized server in exit address '%s.exit'. Refusing.", - safe_str(socks->address)); + safe_str_client(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } @@ -1477,7 +1598,7 @@ escaped(socks->address)); log_warn(LD_APP, "Destination '%s' seems to be an invalid hostname. Failing.", - safe_str(socks->address)); + safe_str_client(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } @@ -1486,18 +1607,6 @@ uint32_t answer; struct in_addr in; /* Reply to resolves immediately if we can. */ - if (strlen(socks->address) > RELAY_PAYLOAD_SIZE) { - log_warn(LD_APP,"Address to be resolved is too large. Failing."); - control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", - escaped(socks->address)); - connection_ap_handshake_socks_resolved(conn, - RESOLVED_TYPE_ERROR_TRANSIENT, - 0,NULL,-1,TIME_MAX); - connection_mark_unattached_ap(conn, - END_STREAM_REASON_SOCKSPROTOCOL | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - return -1; - } if (tor_inet_aton(socks->address, &in)) { /* see if it's an IP already */ /* leave it in network order */ answer = in.s_addr; @@ -1527,12 +1636,12 @@ if (r) { log_info(LD_APP, "Redirecting address %s to exit at enclave router %s", - safe_str(socks->address), r->nickname); + safe_str_client(socks->address), r->nickname); /* use the hex digest, not nickname, in case there are two routers with this nickname */ conn->chosen_exit_name = tor_strdup(hex_str(r->cache_info.identity_digest, DIGEST_LEN)); - conn->_base.chosen_exit_optional = 1; + conn->chosen_exit_optional = 1; } } @@ -1543,7 +1652,7 @@ if (!conn->use_begindir) { /* help predict this next time */ - rep_hist_note_used_port(socks->port, now); + rep_hist_note_used_port(now, socks->port); } } else if (socks->command == SOCKS_COMMAND_RESOLVE_PTR) { rep_hist_note_used_resolve(now); /* help predict this next time */ @@ -1556,7 +1665,8 @@ conn, circ, cpath) < 0) || (!circ && connection_ap_handshake_attach_circuit(conn) < 0)) { - connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); + if (!conn->_base.marked_for_close) + connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); return -1; } return 0; @@ -1564,6 +1674,7 @@ /* it's a hidden-service request */ rend_cache_entry_t *entry; int r; + rend_service_authorization_t *client_auth; tor_assert(!automap); if (SOCKS_COMMAND_IS_RESOLVE(socks->command)) { /* if it's a resolve request, fail it right now, rather than @@ -1585,14 +1696,16 @@ return -1; } - strlcpy(conn->rend_query, socks->address, sizeof(conn->rend_query)); + conn->rend_data = tor_malloc_zero(sizeof(rend_data_t)); + strlcpy(conn->rend_data->onion_address, socks->address, + sizeof(conn->rend_data->onion_address)); log_info(LD_REND,"Got a hidden service request for ID '%s'", - safe_str(conn->rend_query)); + safe_str_client(conn->rend_data->onion_address)); /* see if we already have it cached */ - r = rend_cache_lookup_entry(conn->rend_query, -1, &entry); + r = rend_cache_lookup_entry(conn->rend_data->onion_address, -1, &entry); if (r<0) { log_warn(LD_BUG,"Invalid service name '%s'", - safe_str(conn->rend_query)); + safe_str_client(conn->rend_data->onion_address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } @@ -1601,33 +1714,28 @@ * a stable circuit yet, but we know we'll need *something*. */ rep_hist_note_used_internal(now, 0, 1); + /* Look up if we have client authorization for it. */ + client_auth = rend_client_lookup_service_authorization( + conn->rend_data->onion_address); + if (client_auth) { + log_info(LD_REND, "Using previously configured client authorization " + "for hidden service request."); + memcpy(conn->rend_data->descriptor_cookie, + client_auth->descriptor_cookie, REND_DESC_COOKIE_LEN); + conn->rend_data->auth_type = client_auth->auth_type; + } if (r==0) { conn->_base.state = AP_CONN_STATE_RENDDESC_WAIT; log_info(LD_REND, "Unknown descriptor %s. Fetching.", - safe_str(conn->rend_query)); - /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever - * arrives first. */ - rend_client_refetch_v2_renddesc(conn->rend_query); - rend_client_refetch_renddesc(conn->rend_query); + safe_str_client(conn->rend_data->onion_address)); + rend_client_refetch_v2_renddesc(conn->rend_data); } else { /* r > 0 */ -/** How long after we receive a hidden service descriptor do we consider - * it valid? */ -#define NUM_SECONDS_BEFORE_HS_REFETCH (60*15) - if (now - entry->received < NUM_SECONDS_BEFORE_HS_REFETCH) { - conn->_base.state = AP_CONN_STATE_CIRCUIT_WAIT; - log_info(LD_REND, "Descriptor is here and fresh enough. Great."); - if (connection_ap_handshake_attach_circuit(conn) < 0) { + conn->_base.state = AP_CONN_STATE_CIRCUIT_WAIT; + log_info(LD_REND, "Descriptor is here. Great."); + if (connection_ap_handshake_attach_circuit(conn) < 0) { + if (!conn->_base.marked_for_close) connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); - return -1; - } - } else { - conn->_base.state = AP_CONN_STATE_RENDDESC_WAIT; - log_info(LD_REND, "Stale descriptor %s. Refetching.", - safe_str(conn->rend_query)); - /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever - * arrives first. */ - rend_client_refetch_v2_renddesc(conn->rend_query); - rend_client_refetch_renddesc(conn->rend_query); + return -1; } } return 0; @@ -1641,7 +1749,7 @@ get_pf_socket(void) { int pf; - /* This should be opened before dropping privs. */ + /* This should be opened before dropping privileges. */ if (pf_socket >= 0) return pf_socket; @@ -1676,9 +1784,9 @@ { #ifdef TRANS_NETFILTER /* Linux 2.4+ */ - struct sockaddr_in orig_dst; + struct sockaddr_storage orig_dst; socklen_t orig_dst_len = sizeof(orig_dst); - char tmpbuf[INET_NTOA_BUF_LEN]; + tor_addr_t addr; if (getsockopt(conn->_base.s, SOL_IP, SO_ORIGINAL_DST, (struct sockaddr*)&orig_dst, &orig_dst_len) < 0) { @@ -1687,16 +1795,16 @@ return -1; } - tor_inet_ntoa(&orig_dst.sin_addr, tmpbuf, sizeof(tmpbuf)); - strlcpy(req->address, tmpbuf, sizeof(req->address)); - req->port = ntohs(orig_dst.sin_port); + tor_addr_from_sockaddr(&addr, (struct sockaddr*)&orig_dst, &req->port); + tor_addr_to_str(req->address, &addr, sizeof(req->address), 0); return 0; #elif defined(TRANS_PF) - struct sockaddr_in proxy_addr; + struct sockaddr_storage proxy_addr; socklen_t proxy_addr_len = sizeof(proxy_addr); - char tmpbuf[INET_NTOA_BUF_LEN]; + struct sockaddr *proxy_sa = (struct sockaddr*) &proxy_addr; struct pfioc_natlook pnl; + tor_addr_t addr; int pf = -1; if (getsockname(conn->_base.s, (struct sockaddr*)&proxy_addr, @@ -1708,13 +1816,28 @@ } memset(&pnl, 0, sizeof(pnl)); - pnl.af = AF_INET; pnl.proto = IPPROTO_TCP; pnl.direction = PF_OUT; - pnl.saddr.v4.s_addr = htonl(conn->_base.addr); - pnl.sport = htons(conn->_base.port); - pnl.daddr.v4.s_addr = proxy_addr.sin_addr.s_addr; - pnl.dport = proxy_addr.sin_port; + if (proxy_sa->sa_family == AF_INET) { + struct sockaddr_in *sin = (struct sockaddr_in *)proxy_sa; + pnl.af = AF_INET; + pnl.saddr.v4.s_addr = tor_addr_to_ipv4n(&conn->_base.addr); + pnl.sport = htons(conn->_base.port); + pnl.daddr.v4.s_addr = sin->sin_addr.s_addr; + pnl.dport = sin->sin_port; + } else if (proxy_sa->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)proxy_sa; + pnl.af = AF_INET6; + memcpy(&pnl.saddr.v6, tor_addr_to_in6(&conn->_base.addr), + sizeof(struct in6_addr)); + pnl.sport = htons(conn->_base.port); + memcpy(&pnl.daddr.v6, &sin6->sin6_addr, sizeof(struct in6_addr)); + pnl.dport = sin6->sin6_port; + } else { + log_warn(LD_NET, "getsockname() gave an unexpected address family (%d)", + (int)proxy_sa->sa_family); + return -1; + } pf = get_pf_socket(); if (pf<0) @@ -1725,8 +1848,16 @@ return -1; } - tor_inet_ntoa(&pnl.rdaddr.v4, tmpbuf, sizeof(tmpbuf)); - strlcpy(req->address, tmpbuf, sizeof(req->address)); + if (pnl.af == AF_INET) { + tor_addr_from_ipv4n(&addr, pnl.rdaddr.v4.s_addr); + } else if (pnl.af == AF_INET6) { + tor_addr_from_in6(&addr, &pnl.rdaddr.v6); + } else { + tor_fragile_assert(); + return -1; + } + + tor_addr_to_str(req->address, &addr, sizeof(req->address), 0); req->port = ntohs(pnl.rdport); return 0; @@ -1792,24 +1923,12 @@ return -1; } /* else socks handshake is done, continue processing */ - if (hostname_is_noconnect_address(socks->address)) - { - control_event_stream_status(conn, STREAM_EVENT_NEW, 0); - control_event_stream_status(conn, STREAM_EVENT_CLOSED, 0); - connection_mark_unattached_ap(conn, END_STREAM_REASON_DONE); - return -1; - } - if (SOCKS_COMMAND_IS_CONNECT(socks->command)) control_event_stream_status(conn, STREAM_EVENT_NEW, 0); else control_event_stream_status(conn, STREAM_EVENT_NEW_RESOLVE, 0); - if (options->LeaveStreamsUnattached) { - conn->_base.state = AP_CONN_STATE_CONTROLLER_WAIT; - return 0; - } - return connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL); + return connection_ap_rewrite_and_attach_if_allowed(conn, NULL, NULL); } /** connection_init_accepted_conn() found a new trans AP conn. @@ -1823,7 +1942,6 @@ connection_ap_process_transparent(edge_connection_t *conn) { socks_request_t *socks; - or_options_t *options = get_options(); tor_assert(conn); tor_assert(conn->_base.type == CONN_TYPE_AP); @@ -1847,11 +1965,7 @@ control_event_stream_status(conn, STREAM_EVENT_NEW, 0); - if (options->LeaveStreamsUnattached) { - conn->_base.state = AP_CONN_STATE_CONTROLLER_WAIT; - return 0; - } - return connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL); + return connection_ap_rewrite_and_attach_if_allowed(conn, NULL, NULL); } /** connection_edge_process_inbuf() found a conn in state natd_wait. See if @@ -1872,7 +1986,6 @@ size_t tlen = 30; int err, port_ok; socks_request_t *socks; - or_options_t *options = get_options(); tor_assert(conn); tor_assert(conn->_base.type == CONN_TYPE_AP); @@ -1928,26 +2041,22 @@ control_event_stream_status(conn, STREAM_EVENT_NEW, 0); - if (options->LeaveStreamsUnattached) { - conn->_base.state = AP_CONN_STATE_CONTROLLER_WAIT; - return 0; - } conn->_base.state = AP_CONN_STATE_CIRCUIT_WAIT; - return connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL); + return connection_ap_rewrite_and_attach_if_allowed(conn, NULL, NULL); } /** Iterate over the two bytes of stream_id until we get one that is not * already in use; return it. Return 0 if can't get a unique stream_id. */ -static uint16_t +static streamid_t get_unique_stream_id_by_circ(origin_circuit_t *circ) { edge_connection_t *tmpconn; - uint16_t test_stream_id; + streamid_t test_stream_id; uint32_t attempts=0; -again: + again: test_stream_id = circ->next_stream_id++; if (++attempts > 1<<16) { /* Make sure we don't loop forever if all stream_id's are used. */ @@ -2028,7 +2137,7 @@ { int payload_len, command; const char *string_addr; - char inaddr_buf[32]; + char inaddr_buf[REVERSE_LOOKUP_NAME_BUF_LEN]; origin_circuit_t *circ; tor_assert(ap_conn->on_circuit); circ = TO_ORIGIN_CIRCUIT(ap_conn->on_circuit); @@ -2044,6 +2153,7 @@ ap_conn->stream_id = get_unique_stream_id_by_circ(circ); if (ap_conn->stream_id==0) { connection_mark_unattached_ap(ap_conn, END_STREAM_REASON_INTERNAL); + /*XXXX022 _close_ the circuit because it's full? That sounds dumb. */ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); return -1; } @@ -2051,44 +2161,33 @@ if (command == SOCKS_COMMAND_RESOLVE) { string_addr = ap_conn->socks_request->address; payload_len = (int)strlen(string_addr)+1; - tor_assert(payload_len <= RELAY_PAYLOAD_SIZE); } else { - struct in_addr in; - uint32_t a; - size_t len = strlen(ap_conn->socks_request->address); - char c = 0; - /* XXXX021 This logic is a little ugly: we check for an in-addr.arpa ending - * on the address. If we have one, the address is already in the right - * order, so we'll leave it alone later. Otherwise, we reverse it and - * turn it into an in-addr.arpa address. */ - if (!strcasecmpend(ap_conn->socks_request->address, ".in-addr.arpa")) { - /* Temporarily truncate the address, so we can give it to inet_aton. */ - c = ap_conn->socks_request->address[len-13]; - ap_conn->socks_request->address[len-13] = '\0'; - } - if (tor_inet_aton(ap_conn->socks_request->address, &in) == 0) { - /* Do not mark here; every caller of - * connection_ap_attach_{chosen_}circuit() [which calls this function - * will also mark on a -1 return value. */ - // connection_mark_unattached_ap(ap_conn, END_STREAM_REASON_INTERNAL); + /* command == SOCKS_COMMAND_RESOLVE_PTR */ + const char *a = ap_conn->socks_request->address; + tor_addr_t addr; + int r; + + /* We're doing a reverse lookup. The input could be an IP address, or + * could be an .in-addr.arpa or .ip6.arpa address */ + r = tor_addr_parse_reverse_lookup_name(&addr, a, AF_INET, 1); + if (r <= 0) { + log_warn(LD_APP, "Rejecting ill-formed reverse lookup of %s", + safe_str_client(a)); + connection_mark_unattached_ap(ap_conn, END_STREAM_REASON_INTERNAL); return -1; } - if (c) { - /* this path happens on DNS. Can we unify? XXXX021 */ - ap_conn->socks_request->address[len-13] = c; - strlcpy(inaddr_buf, ap_conn->socks_request->address, sizeof(inaddr_buf)); - } else { - /* this path happens on tor-resolve. Can we unify? XXXX021 */ - a = ntohl(in.s_addr); - tor_snprintf(inaddr_buf, sizeof(inaddr_buf), "%d.%d.%d.%d.in-addr.arpa", - (int)(uint8_t)((a )&0xff), - (int)(uint8_t)((a>>8 )&0xff), - (int)(uint8_t)((a>>16)&0xff), - (int)(uint8_t)((a>>24)&0xff)); + + r = tor_addr_to_reverse_lookup_name(inaddr_buf, sizeof(inaddr_buf), &addr); + if (r < 0) { + log_warn(LD_BUG, "Couldn't generate reverse lookup hostname of %s", + safe_str_client(a)); + connection_mark_unattached_ap(ap_conn, END_STREAM_REASON_INTERNAL); + return -1; } + string_addr = inaddr_buf; payload_len = (int)strlen(inaddr_buf)+1; - tor_assert(payload_len <= RELAY_PAYLOAD_SIZE); + tor_assert(payload_len <= (int)sizeof(inaddr_buf)); } log_debug(LD_APP, @@ -2099,6 +2198,7 @@ string_addr, payload_len) < 0) return -1; /* circuit is closed, don't continue */ + tor_free(ap_conn->_base.address); /* Maybe already set by dnsserv. */ ap_conn->_base.address = tor_strdup("(Tor_internal)"); ap_conn->_base.state = AP_CONN_STATE_RESOLVE_WAIT; log_info(LD_APP,"Address sent for resolve, ap socket %d, n_circ_id %d", @@ -2120,10 +2220,11 @@ { edge_connection_t *conn; - log_info(LD_APP,"Making internal anonymized tunnel to %s:%d ...", - safe_str(address),port); + log_info(LD_APP,"Making internal %s tunnel to %s:%d ...", + want_onehop ? "direct" : "anonymized", + safe_str_client(address), port); - conn = TO_EDGE_CONN(connection_new(CONN_TYPE_AP, AF_INET)); + conn = edge_connection_new(CONN_TYPE_AP, AF_INET); conn->_base.linked = 1; /* so that we can add it safely below. */ /* populate conn->socks_request */ @@ -2146,7 +2247,7 @@ } conn->_base.address = tor_strdup("(Tor_internal)"); - conn->_base.addr = 0; + tor_addr_make_unspec(&conn->_base.addr); conn->_base.port = 0; if (connection_add(TO_CONN(conn)) < 0) { /* no space, forget it */ @@ -2160,7 +2261,8 @@ /* attaching to a dirty circuit is fine */ if (connection_ap_handshake_attach_circuit(conn) < 0) { - connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); + if (!conn->_base.marked_for_close) + connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); return NULL; } @@ -2210,7 +2312,7 @@ * certain errors or for values that didn't come via DNS. expires is * a time when the answer expires, or -1 or TIME_MAX if there's a good TTL. **/ -/* XXXX021 the use of the ttl and expires fields is nutty. Let's make this +/* XXXX022 the use of the ttl and expires fields is nutty. Let's make this * interface and those that use it less ugly. */ void connection_ap_handshake_socks_resolved(edge_connection_t *conn, @@ -2252,18 +2354,18 @@ conn->socks_request->has_finished = 1; return; } - /* XXXX020 are we freeing conn anywhere? */ + /* We shouldn't need to free conn here; it gets marked by the caller. */ } if (conn->socks_request->socks_version == 4) { buf[0] = 0x00; /* version */ if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) { - buf[1] = 90; /* "Granted" */ + buf[1] = SOCKS4_GRANTED; set_uint16(buf+2, 0); memcpy(buf+4, answer, 4); /* address */ replylen = SOCKS4_NETWORK_LEN; - } else { - buf[1] = 91; /* "error" */ + } else { /* "error" */ + buf[1] = SOCKS4_REJECT; memset(buf+2, 0, 6); replylen = SOCKS4_NETWORK_LEN; } @@ -2322,7 +2424,7 @@ { char buf[256]; socks5_reply_status_t status = - connection_edge_end_reason_socks5_response(endreason); + stream_end_reason_to_socks5_response(endreason); tor_assert(conn->socks_request); /* make sure it's an AP stream */ @@ -2342,8 +2444,6 @@ } if (conn->socks_request->socks_version == 4) { memset(buf,0,SOCKS4_NETWORK_LEN); -#define SOCKS4_GRANTED 90 -#define SOCKS4_REJECT 91 buf[1] = (status==SOCKS5_SUCCEEDED ? SOCKS4_GRANTED : SOCKS4_REJECT); /* leave version, destport, destip zero */ connection_write_to_buf(buf, SOCKS4_NETWORK_LEN, TO_CONN(conn)); @@ -2387,7 +2487,6 @@ relay_header_t rh; char *address=NULL; uint16_t port; - char end_payload[1]; or_circuit_t *or_circ = NULL; assert_circuit_ok(circ); @@ -2405,9 +2504,8 @@ circ->purpose != CIRCUIT_PURPOSE_S_REND_JOINED) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Relay begin cell at non-server. Closing."); - end_payload[0] = END_STREAM_REASON_EXITPOLICY; - relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, - end_payload, 1, NULL); + relay_send_end_cell_from_edge(rh.stream_id, circ, + END_STREAM_REASON_EXITPOLICY, NULL); return 0; } @@ -2415,51 +2513,64 @@ if (!memchr(cell->payload+RELAY_HEADER_SIZE, 0, rh.length)) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Relay begin cell has no \\0. Closing."); - end_payload[0] = END_STREAM_REASON_TORPROTOCOL; - relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, - end_payload, 1, NULL); + relay_send_end_cell_from_edge(rh.stream_id, circ, + END_STREAM_REASON_TORPROTOCOL, NULL); return 0; } if (parse_addr_port(LOG_PROTOCOL_WARN, cell->payload+RELAY_HEADER_SIZE, &address,NULL,&port)<0) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Unable to parse addr:port in relay begin cell. Closing."); - end_payload[0] = END_STREAM_REASON_TORPROTOCOL; - relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, - end_payload, 1, NULL); + relay_send_end_cell_from_edge(rh.stream_id, circ, + END_STREAM_REASON_TORPROTOCOL, NULL); return 0; } if (port==0) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Missing port in relay begin cell. Closing."); - end_payload[0] = END_STREAM_REASON_TORPROTOCOL; - relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, - end_payload, 1, NULL); + relay_send_end_cell_from_edge(rh.stream_id, circ, + END_STREAM_REASON_TORPROTOCOL, NULL); tor_free(address); return 0; } - if (or_circ && or_circ->is_first_hop) { - /* Don't let clients use us as a single-hop proxy; it attracts attackers + if (or_circ && or_circ->p_conn && !get_options()->AllowSingleHopExits && + (or_circ->is_first_hop || + (!connection_or_digest_is_known_relay( + or_circ->p_conn->identity_digest) && +// XXX022 commented out so we can test it first in 0.2.2.11 -RD +// networkstatus_get_param(NULL, "refuseunknownexits", 1)))) { + get_options()->RefuseUnknownExits))) { + /* Don't let clients use us as a single-hop proxy, unless the user + * has explicitly allowed that in the config. It attracts attackers * and users who'd be better off with, well, single-hop proxies. */ - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Attempt to open a stream on first hop of circuit. Closing."); - end_payload[0] = END_STREAM_REASON_TORPROTOCOL; - relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, - end_payload, 1, NULL); +// log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + log_notice(LD_PROTOCOL, + "Attempt by %s to open a stream %s. Closing.", + safe_str(or_circ->p_conn->_base.address), + or_circ->is_first_hop ? "on first hop of circuit" : + "from unknown relay"); + relay_send_end_cell_from_edge(rh.stream_id, circ, + or_circ->is_first_hop ? + END_STREAM_REASON_TORPROTOCOL : + END_STREAM_REASON_MISC, + NULL); tor_free(address); return 0; } } else if (rh.command == RELAY_COMMAND_BEGIN_DIR) { if (!directory_permits_begindir_requests(get_options()) || circ->purpose != CIRCUIT_PURPOSE_OR) { - end_payload[0] = END_STREAM_REASON_NOTDIRECTORY; - relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, - end_payload, 1, NULL); + relay_send_end_cell_from_edge(rh.stream_id, circ, + END_STREAM_REASON_NOTDIRECTORY, NULL); return 0; } - if (or_circ && or_circ->p_conn && or_circ->p_conn->_base.address) - address = tor_strdup(or_circ->p_conn->_base.address); + /* Make sure to get the 'real' address of the previous hop: the + * caller might want to know whether his IP address has changed, and + * we might already have corrected _base.addr[ess] for the relay's + * canonical IP address. */ + if (or_circ && or_circ->p_conn) + address = tor_dup_addr(&or_circ->p_conn->real_addr); else address = tor_strdup("127.0.0.1"); port = 1; /* XXXX This value is never actually used anywhere, and there @@ -2467,14 +2578,18 @@ * need to set it to something nonzero. */ } else { log_warn(LD_BUG, "Got an unexpected command %d", (int)rh.command); - end_payload[0] = END_STREAM_REASON_INTERNAL; - relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, - end_payload, 1, NULL); + relay_send_end_cell_from_edge(rh.stream_id, circ, + END_STREAM_REASON_INTERNAL, NULL); return 0; } log_debug(LD_EXIT,"Creating new exit connection."); - n_stream = TO_EDGE_CONN(connection_new(CONN_TYPE_EXIT, AF_INET)); + n_stream = edge_connection_new(CONN_TYPE_EXIT, AF_INET); + + /* Remember the tunneled request ID in the new edge connection, so that + * we can measure download times. */ + TO_CONN(n_stream)->dirreq_id = circ->dirreq_id; + n_stream->_base.purpose = EXIT_PURPOSE_CONNECT; n_stream->stream_id = rh.stream_id; @@ -2488,16 +2603,15 @@ log_info(LD_REND,"begin is for rendezvous. configuring stream."); n_stream->_base.address = tor_strdup("(rendezvous)"); n_stream->_base.state = EXIT_CONN_STATE_CONNECTING; - strlcpy(n_stream->rend_query, origin_circ->rend_query, - sizeof(n_stream->rend_query)); + n_stream->rend_data = rend_data_dup(origin_circ->rend_data); tor_assert(connection_edge_is_rendezvous_stream(n_stream)); assert_circuit_ok(circ); if (rend_service_set_connection_addr_port(n_stream, origin_circ) < 0) { log_info(LD_REND,"Didn't find rendezvous service (port %d)", n_stream->_base.port); - end_payload[0] = END_STREAM_REASON_EXITPOLICY; - relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, - end_payload, 1, origin_circ->cpath->prev); + relay_send_end_cell_from_edge(rh.stream_id, circ, + END_STREAM_REASON_EXITPOLICY, + origin_circ->cpath->prev); connection_free(TO_CONN(n_stream)); tor_free(address); return 0; @@ -2506,7 +2620,7 @@ log_debug(LD_REND,"Finished assigning addr/port"); n_stream->cpath_layer = origin_circ->cpath->prev; /* link it */ - /* add it into the linked list of n_streams on this circuit */ + /* add it into the linked list of p_streams on this circuit */ n_stream->next_stream = origin_circ->p_streams; n_stream->on_circuit = circ; origin_circ->p_streams = n_stream; @@ -2522,9 +2636,8 @@ /* default to failed, change in dns_resolve if it turns out not to fail */ if (we_are_hibernating()) { - end_payload[0] = END_STREAM_REASON_HIBERNATING; - relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, - end_payload, 1, NULL); + relay_send_end_cell_from_edge(rh.stream_id, circ, + END_STREAM_REASON_HIBERNATING, NULL); connection_free(TO_CONN(n_stream)); return 0; } @@ -2533,8 +2646,8 @@ if (rh.command == RELAY_COMMAND_BEGIN_DIR) { tor_assert(or_circ); - if (or_circ->p_conn && or_circ->p_conn->_base.addr) - n_stream->_base.addr = or_circ->p_conn->_base.addr; + if (or_circ->p_conn && !tor_addr_is_null(&or_circ->p_conn->real_addr)) + tor_addr_copy(&n_stream->_base.addr, &or_circ->p_conn->real_addr); return connection_exit_connect_dir(n_stream); } @@ -2548,9 +2661,8 @@ connection_exit_connect(n_stream); return 0; case -1: /* resolve failed */ - end_payload[0] = END_STREAM_REASON_RESOLVEFAILED; - relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, - end_payload, 1, NULL); + relay_send_end_cell_from_edge(rh.stream_id, circ, + END_STREAM_REASON_RESOLVEFAILED, NULL); /* n_stream got freed. don't touch it. */ break; case 0: /* resolve added to pending list */ @@ -2561,7 +2673,8 @@ } /** - * Called when we receive a RELAY_RESOLVE cell 'cell' along the circuit 'circ'; + * Called when we receive a RELAY_COMMAND_RESOLVE cell 'cell' along the + * circuit circ; * begin resolving the hostname, and (eventually) reply with a RESOLVED cell. */ int @@ -2580,7 +2693,7 @@ * resolved; but if we didn't store them in a connection like this, * the housekeeping in dns.c would get way more complicated.) */ - dummy_conn = TO_EDGE_CONN(connection_new(CONN_TYPE_EXIT, AF_INET)); + dummy_conn = edge_connection_new(CONN_TYPE_EXIT, AF_INET); dummy_conn->stream_id = rh.stream_id; dummy_conn->_base.address = tor_strndup(cell->payload+RELAY_HEADER_SIZE, rh.length); @@ -2616,46 +2729,29 @@ void connection_exit_connect(edge_connection_t *edge_conn) { - uint32_t addr; + const tor_addr_t *addr; uint16_t port; connection_t *conn = TO_CONN(edge_conn); + int socket_error = 0; if (!connection_edge_is_rendezvous_stream(edge_conn) && router_compare_to_my_exit_policy(edge_conn)) { log_info(LD_EXIT,"%s:%d failed exit policy. Closing.", - escaped_safe_str(conn->address), conn->port); + escaped_safe_str_client(conn->address), conn->port); connection_edge_end(edge_conn, END_STREAM_REASON_EXITPOLICY); circuit_detach_stream(circuit_get_by_edge_conn(edge_conn), edge_conn); connection_free(conn); return; } - addr = conn->addr; + addr = &conn->addr; port = conn->port; - if (redirect_exit_list) { - SMARTLIST_FOREACH(redirect_exit_list, exit_redirect_t *, r, - { - if (!addr_mask_cmp_bits(addr, r->addr, r->maskbits) && - (r->port_min <= port) && (port <= r->port_max)) { - struct in_addr in; - if (r->is_redirect) { - char tmpbuf[INET_NTOA_BUF_LEN]; - addr = r->addr_dest; - port = r->port_dest; - in.s_addr = htonl(addr); - tor_inet_ntoa(&in, tmpbuf, sizeof(tmpbuf)); - log_debug(LD_EXIT, "Redirecting connection from %s:%d to %s:%d", - escaped_safe_str(conn->address), conn->port, - safe_str(tmpbuf), port); - } - break; - } - }); - } log_debug(LD_EXIT,"about to try connecting"); - switch (connection_connect(conn, conn->address, addr, port)) { + switch (connection_connect(conn, conn->address, addr, port, &socket_error)) { case -1: + /* XXX021 use socket_error below rather than trying to piece things + * together from the current errno, which may have been clobbered. */ connection_edge_end_errno(edge_conn); circuit_detach_stream(circuit_get_by_edge_conn(edge_conn), edge_conn); connection_free(conn); @@ -2663,9 +2759,9 @@ case 0: conn->state = EXIT_CONN_STATE_CONNECTING; - connection_watch_events(conn, EV_WRITE | EV_READ); + connection_watch_events(conn, READ_EVENT | WRITE_EVENT); /* writable indicates finish; - * readable/error indicates broken link in windowsland. */ + * readable/error indicates broken link in windows-land. */ return; /* case 1: fall through */ } @@ -2676,7 +2772,7 @@ log_warn(LD_BUG,"newly connected conn had data waiting!"); // connection_start_writing(conn); } - connection_watch_events(conn, EV_READ); + connection_watch_events(conn, READ_EVENT); /* also, deliver a 'connected' cell back through the circuit. */ if (connection_edge_is_rendezvous_stream(edge_conn)) { @@ -2686,14 +2782,21 @@ RELAY_COMMAND_CONNECTED, NULL, 0); } else { /* normal stream */ - /* This must be the original address, not the redirected address. */ - char connected_payload[8]; - set_uint32(connected_payload, htonl(conn->addr)); - set_uint32(connected_payload+4, + char connected_payload[20]; + int connected_payload_len; + if (tor_addr_family(&conn->addr) == AF_INET) { + set_uint32(connected_payload, tor_addr_to_ipv4n(&conn->addr)); + connected_payload_len = 4; + } else { + memcpy(connected_payload, tor_addr_to_in6_addr8(&conn->addr), 16); + connected_payload_len = 16; + } + set_uint32(connected_payload+connected_payload_len, htonl(dns_clip_ttl(edge_conn->address_ttl))); + connected_payload_len += 4; connection_edge_send_command(edge_conn, RELAY_COMMAND_CONNECTED, - connected_payload, 8); + connected_payload, connected_payload_len); } } @@ -2714,15 +2817,19 @@ exitconn->_base.state = EXIT_CONN_STATE_OPEN; - dirconn = TO_DIR_CONN(connection_new(CONN_TYPE_DIR, AF_INET)); + dirconn = dir_connection_new(AF_INET); - dirconn->_base.addr = exitconn->_base.addr; + tor_addr_copy(&dirconn->_base.addr, &exitconn->_base.addr); dirconn->_base.port = 0; - dirconn->_base.address = tor_strdup(circ->p_conn->_base.address); + dirconn->_base.address = tor_strdup(exitconn->_base.address); dirconn->_base.type = CONN_TYPE_DIR; dirconn->_base.purpose = DIR_PURPOSE_SERVER; dirconn->_base.state = DIR_CONN_STATE_SERVER_COMMAND_WAIT; + /* Note that the new dir conn belongs to the same tunneled request as + * the edge conn, so that we can measure download times. */ + TO_CONN(dirconn)->dirreq_id = TO_CONN(exitconn)->dirreq_id; + connection_link_connections(TO_CONN(dirconn), TO_CONN(exitconn)); if (connection_add(TO_CONN(exitconn))<0) { @@ -2764,7 +2871,7 @@ connection_edge_is_rendezvous_stream(edge_connection_t *conn) { tor_assert(conn); - if (*conn->rend_query) /* XXX */ /* XXXX Why is this XXX? -NM */ + if (conn->rend_data) return 1; return 0; } @@ -2773,10 +2880,16 @@ * to exit from it, or 0 if it probably will not allow it. * (We might be uncertain if conn's destination address has not yet been * resolved.) + * + * If excluded_means_no is 1 and Exclude*Nodes is set and excludes + * this relay, return 0. */ int -connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit) +connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit, + int excluded_means_no) { + or_options_t *options = get_options(); + tor_assert(conn); tor_assert(conn->_base.type == CONN_TYPE_AP); tor_assert(conn->socks_request); @@ -2822,37 +2935,35 @@ if (!conn->chosen_exit_name && policy_is_reject_star(exit->exit_policy)) return 0; } - return 1; -} - -/** Make connection redirection follow the provided list of - * exit_redirect_t */ -void -set_exit_redirects(smartlist_t *lst) -{ - if (redirect_exit_list) { - SMARTLIST_FOREACH(redirect_exit_list, exit_redirect_t *, p, tor_free(p)); - smartlist_free(redirect_exit_list); - } - if (lst && smartlist_len(lst)) { - log_warn(LD_GENERAL, - "The RedirectExit option is deprecated; it will go away in a " - "future version of Tor."); + if (options->_ExcludeExitNodesUnion && + (options->StrictNodes || excluded_means_no) && + routerset_contains_router(options->_ExcludeExitNodesUnion, exit)) { + /* If we are trying to avoid this node as exit, and we have StrictNodes + * set, then this is not a suitable exit. Refuse it. + * + * If we don't have StrictNodes set, then this function gets called in + * two contexts. First, we've got a circuit open and we want to know + * whether we can use it. In that case, we somehow built this circuit + * despite having the last hop in ExcludeExitNodes, so we should be + * willing to use it. Second, we are evaluating whether this is an + * acceptable exit for a new circuit. In that case, skip it. */ + return 0; } - redirect_exit_list = lst; + + return 1; } /** If address is of the form "y.onion" with a well-formed handle y: * Put a NUL after y, lower-case it, and return ONION_HOSTNAME. * - * If address is of the form "y.exit": + * If address is of the form "y.exit" and allowdotexit is true: * Put a NUL after y and return EXIT_HOSTNAME. * * Otherwise: * Return NORMAL_HOSTNAME and change nothing. */ hostname_type_t -parse_extended_hostname(char *address) +parse_extended_hostname(char *address, int allowdotexit) { char *s; char query[REND_SERVICE_ID_LEN_BASE32+1]; @@ -2861,31 +2972,31 @@ if (!s) return NORMAL_HOSTNAME; /* no dot, thus normal */ if (!strcmp(s+1,"exit")) { - *s = 0; /* nul-terminate it */ - return EXIT_HOSTNAME; /* .exit */ + if (allowdotexit) { + *s = 0; /* NUL-terminate it */ + return EXIT_HOSTNAME; /* .exit */ + } else { + log_warn(LD_APP, "The \".exit\" notation is disabled in Tor due to " + "security risks. Set AllowDotExit in your torrc to enable " + "it."); + /* FFFF send a controller event too to notify Vidalia users */ + return BAD_HOSTNAME; + } } if (strcmp(s+1,"onion")) return NORMAL_HOSTNAME; /* neither .exit nor .onion, thus normal */ /* so it is .onion */ - *s = 0; /* nul-terminate it */ + *s = 0; /* NUL-terminate it */ if (strlcpy(query, address, REND_SERVICE_ID_LEN_BASE32+1) >= REND_SERVICE_ID_LEN_BASE32+1) goto failed; if (rend_valid_service_id(query)) { return ONION_HOSTNAME; /* success */ } -failed: + failed: /* otherwise, return to previous state and return 0 */ *s = '.'; return BAD_HOSTNAME; } -/** Check if the address is of the form "y.noconnect" - */ -int -hostname_is_noconnect_address(const char *address) -{ - return ! strcasecmpend(address, ".noconnect"); -} - diff -Nru tor-0.2.0.34/src/or/connection_edge.h tor-0.2.2.16-alpha/src/or/connection_edge.h --- tor-0.2.0.34/src/or/connection_edge.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/connection_edge.h 2010-09-17 01:30:36.000000000 +0000 @@ -0,0 +1,100 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file connection_edge.h + * \brief Header file for connection_edge.c. + **/ + +#ifndef _TOR_CONNECTION_EDGE_H +#define _TOR_CONNECTION_EDGE_H + +#define connection_mark_unattached_ap(conn, endreason) \ + _connection_mark_unattached_ap((conn), (endreason), __LINE__, _SHORT_FILE_) + +void _connection_mark_unattached_ap(edge_connection_t *conn, int endreason, + int line, const char *file); +int connection_edge_reached_eof(edge_connection_t *conn); +int connection_edge_process_inbuf(edge_connection_t *conn, + int package_partial); +int connection_edge_destroy(circid_t circ_id, edge_connection_t *conn); +int connection_edge_end(edge_connection_t *conn, uint8_t reason); +int connection_edge_end_errno(edge_connection_t *conn); +int connection_edge_finished_flushing(edge_connection_t *conn); +int connection_edge_finished_connecting(edge_connection_t *conn); + +int connection_ap_handshake_send_begin(edge_connection_t *ap_conn); +int connection_ap_handshake_send_resolve(edge_connection_t *ap_conn); + +edge_connection_t *connection_ap_make_link(char *address, uint16_t port, + const char *digest, + int use_begindir, int want_onehop); +void connection_ap_handshake_socks_reply(edge_connection_t *conn, char *reply, + size_t replylen, + int endreason); +void connection_ap_handshake_socks_resolved(edge_connection_t *conn, + int answer_type, + size_t answer_len, + const char *answer, + int ttl, + time_t expires); + +int connection_exit_begin_conn(cell_t *cell, circuit_t *circ); +int connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ); +void connection_exit_connect(edge_connection_t *conn); +int connection_edge_is_rendezvous_stream(edge_connection_t *conn); +int connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit, + int excluded_means_no); +void connection_ap_expire_beginning(void); +void connection_ap_attach_pending(void); +void connection_ap_fail_onehop(const char *failed_digest, + cpath_build_state_t *build_state); +void circuit_discard_optional_exit_enclaves(extend_info_t *info); +int connection_ap_detach_retriable(edge_connection_t *conn, + origin_circuit_t *circ, + int reason); +int connection_ap_process_transparent(edge_connection_t *conn); + +int address_is_invalid_destination(const char *address, int client); + +void addressmap_init(void); +void addressmap_clean(time_t now); +void addressmap_clear_configured(void); +void addressmap_clear_transient(void); +void addressmap_free_all(void); +int addressmap_rewrite(char *address, size_t maxlen, time_t *expires_out); +int addressmap_have_mapping(const char *address, int update_timeout); + +void addressmap_register(const char *address, char *new_address, + time_t expires, addressmap_entry_source_t source); +int parse_virtual_addr_network(const char *val, int validate_only, + char **msg); +int client_dns_incr_failures(const char *address); +void client_dns_clear_failures(const char *address); +void client_dns_set_addressmap(const char *address, uint32_t val, + const char *exitname, int ttl); +const char *addressmap_register_virtual_address(int type, char *new_address); +void addressmap_get_mappings(smartlist_t *sl, time_t min_expires, + time_t max_expires, int want_expiry); +int connection_ap_rewrite_and_attach_if_allowed(edge_connection_t *conn, + origin_circuit_t *circ, + crypt_path_t *cpath); +int connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn, + origin_circuit_t *circ, + crypt_path_t *cpath); + +/** Possible return values for parse_extended_hostname. */ +typedef enum hostname_type_t { + NORMAL_HOSTNAME, ONION_HOSTNAME, EXIT_HOSTNAME, BAD_HOSTNAME +} hostname_type_t; +hostname_type_t parse_extended_hostname(char *address, int allowdotexit); + +#if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H) +int get_pf_socket(void); +#endif + +#endif + diff -Nru tor-0.2.0.34/src/or/connection.h tor-0.2.2.16-alpha/src/or/connection.h --- tor-0.2.0.34/src/or/connection.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/connection.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,100 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file connection.h + * \brief Header file for connection.c. + **/ + +#ifndef _TOR_CONNECTION_H +#define _TOR_CONNECTION_H + +const char *conn_type_to_string(int type); +const char *conn_state_to_string(int type, int state); + +dir_connection_t *dir_connection_new(int socket_family); +or_connection_t *or_connection_new(int socket_family); +edge_connection_t *edge_connection_new(int type, int socket_family); +control_connection_t *control_connection_new(int socket_family); +connection_t *connection_new(int type, int socket_family); + +void connection_link_connections(connection_t *conn_a, connection_t *conn_b); +void connection_free(connection_t *conn); +void connection_free_all(void); +void connection_about_to_close_connection(connection_t *conn); +void connection_close_immediate(connection_t *conn); +void _connection_mark_for_close(connection_t *conn,int line, const char *file); + +#define connection_mark_for_close(c) \ + _connection_mark_for_close((c), __LINE__, _SHORT_FILE_) + +void connection_expire_held_open(void); + +int connection_connect(connection_t *conn, const char *address, + const tor_addr_t *addr, + uint16_t port, int *socket_error); + +int connection_proxy_connect(connection_t *conn, int type); +int connection_read_proxy_handshake(connection_t *conn); + +int retry_all_listeners(smartlist_t *replaced_conns, + smartlist_t *new_conns); + +ssize_t connection_bucket_write_limit(connection_t *conn, time_t now); +int global_write_bucket_low(connection_t *conn, size_t attempt, int priority); +void connection_bucket_init(void); +void connection_bucket_refill(int seconds_elapsed, time_t now); + +int connection_handle_read(connection_t *conn); + +int connection_fetch_from_buf(char *string, size_t len, connection_t *conn); + +int connection_wants_to_flush(connection_t *conn); +int connection_outbuf_too_full(connection_t *conn); +int connection_handle_write(connection_t *conn, int force); +void _connection_write_to_buf_impl(const char *string, size_t len, + connection_t *conn, int zlib); +static void connection_write_to_buf(const char *string, size_t len, + connection_t *conn); +static void connection_write_to_buf_zlib(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_impl(string, len, TO_CONN(conn), done ? -1 : 1); +} + +connection_t *connection_get_by_global_id(uint64_t id); + +connection_t *connection_get_by_type(int type); +connection_t *connection_get_by_type_purpose(int type, int purpose); +connection_t *connection_get_by_type_addr_port_purpose(int type, + const tor_addr_t *addr, + uint16_t port, int purpose); +connection_t *connection_get_by_type_state(int type, int state); +connection_t *connection_get_by_type_state_rendquery(int type, int state, + const char *rendquery); + +#define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR) +int connection_is_listener(connection_t *conn); +int connection_state_is_open(connection_t *conn); +int connection_state_is_connecting(connection_t *conn); + +char *alloc_http_authenticator(const char *authenticator); + +void assert_connection_ok(connection_t *conn, time_t now); +int connection_or_nonopen_was_started_here(or_connection_t *conn); +void connection_dump_buffer_mem_stats(int severity); +void remove_file_if_very_old(const char *fname, time_t now); + +#endif + diff -Nru tor-0.2.0.34/src/or/connection_or.c tor-0.2.2.16-alpha/src/or/connection_or.c --- tor-0.2.0.34/src/or/connection_or.c 2008-11-20 22:14:25.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/connection_or.c 2010-09-17 01:30:36.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: connection_or.c 17263 2008-11-12 14:49:17Z nickm $ */ -const char connection_or_c_id[] = - "$Id: connection_or.c 17263 2008-11-12 14:49:17Z nickm $"; /** * \file connection_or.c @@ -14,6 +11,22 @@ **/ #include "or.h" +#include "buffers.h" +#include "circuitbuild.h" +#include "command.h" +#include "config.h" +#include "connection.h" +#include "connection_or.h" +#include "control.h" +#include "dirserv.h" +#include "geoip.h" +#include "main.h" +#include "networkstatus.h" +#include "reasons.h" +#include "relay.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" static int connection_tls_finish_handshake(or_connection_t *conn); static int connection_or_process_cells_from_inbuf(or_connection_t *conn); @@ -83,10 +96,8 @@ } }); - if (orconn_identity_map) { - digestmap_free(orconn_identity_map, NULL); - orconn_identity_map = NULL; - } + digestmap_free(orconn_identity_map, NULL); + orconn_identity_map = NULL; } /** Change conn->identity_digest to digest, and add conn into @@ -158,7 +169,7 @@ var_cell_pack_header(const var_cell_t *cell, char *hdr_out) { set_uint16(hdr_out, htons(cell->circ_id)); - *(uint8_t*)(hdr_out+2) = cell->command; + set_uint8(hdr_out+2, cell->command); set_uint16(hdr_out+3, htons(cell->payload_len)); } @@ -190,66 +201,6 @@ return 0; } -/** Read conn's inbuf. If the http response from the proxy is all - * here, make sure it's good news, and begin the tls handshake. If - * it's bad news, close the connection and return -1. Else return 0 - * and hope for better luck next time. - */ -static int -connection_or_read_proxy_response(or_connection_t *or_conn) -{ - char *headers; - char *reason=NULL; - int status_code; - time_t date_header; - connection_t *conn = TO_CONN(or_conn); - - switch (fetch_from_buf_http(conn->inbuf, - &headers, MAX_HEADERS_SIZE, - NULL, NULL, 10000, 0)) { - case -1: /* overflow */ - log_warn(LD_PROTOCOL, - "Your https proxy sent back an oversized response. Closing."); - return -1; - case 0: - log_info(LD_OR,"https proxy response not all here yet. Waiting."); - return 0; - /* case 1, fall through */ - } - - if (parse_http_response(headers, &status_code, &date_header, - NULL, &reason) < 0) { - log_warn(LD_OR, - "Unparseable headers from proxy (connecting to '%s'). Closing.", - conn->address); - tor_free(headers); - return -1; - } - if (!reason) reason = tor_strdup("[no reason given]"); - - if (status_code == 200) { - log_info(LD_OR, - "HTTPS connect to '%s' successful! (200 %s) Starting TLS.", - conn->address, escaped(reason)); - tor_free(reason); - if (connection_tls_start_handshake(or_conn, 0) < 0) { - /* TLS handshaking error of some kind. */ - connection_mark_for_close(conn); - - return -1; - } - return 0; - } - /* else, bad news on the status code */ - log_warn(LD_OR, - "The https proxy sent back an unexpected status code %d (%s). " - "Closing.", - status_code, escaped(reason)); - tor_free(reason); - connection_mark_for_close(conn); - return -1; -} - /** Handle any new bytes that have come in on connection conn. * If conn is in 'open' state, hand it to * connection_or_process_cells_from_inbuf() @@ -258,11 +209,24 @@ int connection_or_process_inbuf(or_connection_t *conn) { + int ret; tor_assert(conn); switch (conn->_base.state) { - case OR_CONN_STATE_PROXY_READING: - return connection_or_read_proxy_response(conn); + case OR_CONN_STATE_PROXY_HANDSHAKING: + ret = connection_read_proxy_handshake(TO_CONN(conn)); + + /* start TLS after handshake completion, or deal with error */ + if (ret == 1) { + tor_assert(TO_CONN(conn)->proxy_state == PROXY_CONNECTED); + if (connection_tls_start_handshake(conn, 0) < 0) + ret = -1; + } + if (ret < 0) { + connection_mark_for_close(TO_CONN(conn)); + } + + return ret; case OR_CONN_STATE_OPEN: case OR_CONN_STATE_OR_HANDSHAKING: return connection_or_process_cells_from_inbuf(conn); @@ -285,12 +249,11 @@ connection_or_flushed_some(or_connection_t *conn) { size_t datalen = buf_datalen(conn->_base.outbuf); - time_t now = time(NULL); /* If we're under the low water mark, add cells until we're just over the * high water mark. */ if (datalen < OR_CONN_LOWWATER) { - ssize_t n = (OR_CONN_HIGHWATER - datalen + CELL_NETWORK_SIZE-1) - / CELL_NETWORK_SIZE; + ssize_t n = CEIL_DIV(OR_CONN_HIGHWATER - datalen, CELL_NETWORK_SIZE); + time_t now = approx_time(); while (conn->active_circuits && n > 0) { int flushed; flushed = connection_or_flush_from_first_active_circuit(conn, 1, now); @@ -315,11 +278,7 @@ assert_connection_ok(TO_CONN(conn),0); switch (conn->_base.state) { - case OR_CONN_STATE_PROXY_FLUSHING: - log_debug(LD_OR,"finished sending CONNECT to proxy."); - conn->_base.state = OR_CONN_STATE_PROXY_READING; - connection_stop_writing(TO_CONN(conn)); - break; + case OR_CONN_STATE_PROXY_HANDSHAKING: case OR_CONN_STATE_OPEN: case OR_CONN_STATE_OR_HANDSHAKING: connection_stop_writing(TO_CONN(conn)); @@ -337,40 +296,34 @@ int connection_or_finished_connecting(or_connection_t *or_conn) { + int proxy_type; connection_t *conn; tor_assert(or_conn); conn = TO_CONN(or_conn); tor_assert(conn->state == OR_CONN_STATE_CONNECTING); - log_debug(LD_OR,"OR connect() to router at %s:%u finished.", + log_debug(LD_HANDSHAKE,"OR connect() to router at %s:%u finished.", conn->address,conn->port); + control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE, 0); - if (get_options()->HttpsProxy) { - char buf[1024]; - char addrbuf[INET_NTOA_BUF_LEN]; - struct in_addr in; - char *base64_authenticator=NULL; - const char *authenticator = get_options()->HttpsProxyAuthenticator; - - in.s_addr = htonl(conn->addr); - tor_inet_ntoa(&in, addrbuf, sizeof(addrbuf)); - - if (authenticator) { - base64_authenticator = alloc_http_authenticator(authenticator); - if (!base64_authenticator) - log_warn(LD_OR, "Encoding https authenticator failed"); - } - if (base64_authenticator) { - tor_snprintf(buf, sizeof(buf), "CONNECT %s:%d HTTP/1.1\r\n" - "Proxy-Authorization: Basic %s\r\n\r\n", addrbuf, - conn->port, base64_authenticator); - tor_free(base64_authenticator); - } else { - tor_snprintf(buf, sizeof(buf), "CONNECT %s:%d HTTP/1.0\r\n\r\n", - addrbuf, conn->port); + proxy_type = PROXY_NONE; + + if (get_options()->HttpsProxy) + proxy_type = PROXY_CONNECT; + else if (get_options()->Socks4Proxy) + proxy_type = PROXY_SOCKS4; + else if (get_options()->Socks5Proxy) + proxy_type = PROXY_SOCKS5; + + if (proxy_type != PROXY_NONE) { + /* start proxy handshake */ + if (connection_proxy_connect(conn, proxy_type) < 0) { + connection_mark_for_close(conn); + return -1; } - connection_write_to_buf(buf, strlen(buf), conn); - conn->state = OR_CONN_STATE_PROXY_FLUSHING; + + connection_start_reading(conn); + conn->state = OR_CONN_STATE_PROXY_HANDSHAKING; return 0; } @@ -382,38 +335,106 @@ return 0; } +/** Return 1 if identity digest id_digest is known to be a + * currently or recently running relay. Otherwise return 0. */ +int +connection_or_digest_is_known_relay(const char *id_digest) +{ + if (router_get_consensus_status_by_id(id_digest)) + return 1; /* It's in the consensus: "yes" */ + if (router_get_by_digest(id_digest)) + return 1; /* Not in the consensus, but we have a descriptor for + * it. Probably it was in a recent consensus. "Yes". */ + return 0; +} + +/** Set the per-conn read and write limits for conn. If it's a known + * relay, we will rely on the global read and write buckets, so give it + * per-conn limits that are big enough they'll never matter. But if it's + * not a known relay, first check if we set PerConnBwRate/Burst, then + * check if the consensus sets them, else default to 'big enough'. + */ +static void +connection_or_update_token_buckets_helper(or_connection_t *conn, int reset, + or_options_t *options) +{ + int rate, burst; /* per-connection rate limiting params */ + if (connection_or_digest_is_known_relay(conn->identity_digest)) { + /* It's in the consensus, or we have a descriptor for it meaning it + * was probably in a recent consensus. It's a recognized relay: + * give it full bandwidth. */ + rate = (int)options->BandwidthRate; + burst = (int)options->BandwidthBurst; + } else { + /* Not a recognized relay. Squeeze it down based on the suggested + * bandwidth parameters in the consensus, but allow local config + * options to override. */ + rate = options->PerConnBWRate ? (int)options->PerConnBWRate : + (int)networkstatus_get_param(NULL, "perconnbwrate", + (int)options->BandwidthRate); + burst = options->PerConnBWBurst ? (int)options->PerConnBWBurst : + (int)networkstatus_get_param(NULL, "perconnbwburst", + (int)options->BandwidthBurst); + } + + conn->bandwidthrate = rate; + conn->bandwidthburst = burst; + if (reset) { /* set up the token buckets to be full */ + conn->read_bucket = conn->write_bucket = burst; + return; + } + /* If the new token bucket is smaller, take out the extra tokens. + * (If it's larger, don't -- the buckets can grow to reach the cap.) */ + if (conn->read_bucket > burst) + conn->read_bucket = burst; + if (conn->write_bucket > burst) + conn->write_bucket = burst; +} + +/** Either our set of relays or our per-conn rate limits have changed. + * Go through all the OR connections and update their token buckets. */ +void +connection_or_update_token_buckets(smartlist_t *conns, or_options_t *options) +{ + SMARTLIST_FOREACH(conns, connection_t *, conn, + { + if (connection_speaks_cells(conn)) + connection_or_update_token_buckets_helper(TO_OR_CONN(conn), 0, options); + }); +} + /** If we don't necessarily know the router we're connecting to, but we * have an addr/port/id_digest, then fill in as much as we can. Start * by checking to see if this describes a router we know. */ static void connection_or_init_conn_from_address(or_connection_t *conn, - uint32_t addr, uint16_t port, + const tor_addr_t *addr, uint16_t port, const char *id_digest, int started_here) { - or_options_t *options = get_options(); routerinfo_t *r = router_get_by_digest(id_digest); - conn->bandwidthrate = (int)options->BandwidthRate; - conn->read_bucket = conn->bandwidthburst = (int)options->BandwidthBurst; connection_or_set_identity_digest(conn, id_digest); - conn->_base.addr = addr; + connection_or_update_token_buckets_helper(conn, 1, get_options()); + conn->_base.port = port; - conn->real_addr = addr; + tor_addr_copy(&conn->_base.addr, addr); + tor_addr_copy(&conn->real_addr, addr); if (r) { - if (conn->_base.addr == r->addr) + /* XXXX proposal 118 will make this more complex. */ + if (tor_addr_eq_ipv4h(&conn->_base.addr, r->addr)) conn->is_canonical = 1; if (!started_here) { /* Override the addr/port, so our log messages will make sense. * This is dangerous, since if we ever try looking up a conn by * its actual addr/port, we won't remember. Careful! */ - /* XXXX021 arma: this is stupid, and it's the reason we need real_addr + /* XXXX arma: this is stupid, and it's the reason we need real_addr * to track is_canonical properly. What requires it? */ /* XXXX i believe the reason we did this, originally, is because * we wanted to log what OR a connection was to, and if we logged the * right IP address and port 56244, that wouldn't be as helpful. now we * log the "right" port too, so we know if it's moria1 or moria2. - */ - conn->_base.addr = r->addr; + */ + tor_addr_from_ipv4h(&conn->_base.addr, r->addr); conn->_base.port = r->or_port; } conn->nickname = tor_strdup(r->nickname); @@ -437,23 +458,83 @@ } } -/** Return the best connection of type OR with the - * digest digest that we have, or NULL if we have none. +/** Return true iff a is "better" than b for new circuits. + * + * A more canonical connection is always better than a less canonical + * connection. That aside, a connection is better if it has circuits and the + * other does not, or if it was created more recently. * - * 1) Don't return it if it's marked for close. - * 2) If there are any open conns, ignore non-open conns. - * 3) If there are any non-obsolete conns, ignore obsolete conns. - * 4) Then if there are any non-empty conns, ignore empty conns. - * 5) Of the remaining conns, prefer newer conns. + * Requires that both input connections are open; not is_bad_for_new_circs, + * and not impossibly non-canonical. + * + * If forgive_new_connections
is true, then we do not call + * abetter than b simply because b has no circuits, + * unless b is also relatively old. */ -or_connection_t * -connection_or_get_by_identity_digest(const char *digest) +static int +connection_or_is_better(time_t now, + const or_connection_t *a, + const or_connection_t *b, + int forgive_new_connections) { int newer; +/** Do not definitively deprecate a new connection with no circuits on it + * until this much time has passed. */ +#define NEW_CONN_GRACE_PERIOD (15*60) + + if (b->is_canonical && !a->is_canonical) + return 0; /* A canonical connection is better than a non-canonical + * one, no matter how new it is or which has circuits. */ + + newer = b->_base.timestamp_created < a->_base.timestamp_created; + + if ( + /* We prefer canonical connections regardless of newness. */ + (!b->is_canonical && a->is_canonical) || + /* If both have circuits we prefer the newer: */ + (b->n_circuits && a->n_circuits && newer) || + /* If neither has circuits we prefer the newer: */ + (!b->n_circuits && !a->n_circuits && newer)) + return 1; + + /* If one has no circuits and the other does... */ + if (!b->n_circuits && a->n_circuits) { + /* Then it's bad, unless it's in its grace period and we're forgiving. */ + if (forgive_new_connections && + now < b->_base.timestamp_created + NEW_CONN_GRACE_PERIOD) + return 0; + else + return 1; + } + + return 0; +} + +/** Return the OR connection we should use to extend a circuit to the router + * whose identity is digest, and whose address we believe (or have been + * told in an extend cell) is target_addr. If there is no good + * connection, set *msg_out to a message describing the connection's + * state and our next action, and set launch_out to a boolean for + * whether we should launch a new connection or not. + */ +or_connection_t * +connection_or_get_for_extend(const char *digest, + const tor_addr_t *target_addr, + const char **msg_out, + int *launch_out) +{ or_connection_t *conn, *best=NULL; + int n_inprogress_goodaddr = 0, n_old = 0, n_noncanonical = 0, n_possible = 0; + time_t now = approx_time(); - if (!orconn_identity_map) + tor_assert(msg_out); + tor_assert(launch_out); + + if (!orconn_identity_map) { + *msg_out = "Router not connected (nothing is). Connecting."; + *launch_out = 1; return NULL; + } conn = digestmap_get(orconn_identity_map, digest); @@ -463,34 +544,217 @@ tor_assert(!memcmp(conn->identity_digest, digest, DIGEST_LEN)); if (conn->_base.marked_for_close) continue; + /* Never return a non-open connection. */ + if (conn->_base.state != OR_CONN_STATE_OPEN) { + /* If the address matches, don't launch a new connection for this + * circuit. */ + if (!tor_addr_compare(&conn->real_addr, target_addr, CMP_EXACT)) + ++n_inprogress_goodaddr; + continue; + } + /* Never return a connection that shouldn't be used for circs. */ + if (conn->is_bad_for_new_circs) { + ++n_old; + continue; + } + /* Never return a non-canonical connection using a recent link protocol + * if the address is not what we wanted. + * + * (For old link protocols, we can't rely on is_canonical getting + * set properly if we're talking to the right address, since we might + * have an out-of-date descriptor, and we will get no NETINFO cell to + * tell us about the right address.) */ + if (!conn->is_canonical && conn->link_proto >= 2 && + tor_addr_compare(&conn->real_addr, target_addr, CMP_EXACT)) { + ++n_noncanonical; + continue; + } + + ++n_possible; + if (!best) { - best = conn; /* whatever it is, it's better than nothing. */ + best = conn; /* If we have no 'best' so far, this one is good enough. */ continue; } - if (best->_base.state == OR_CONN_STATE_OPEN && - conn->_base.state != OR_CONN_STATE_OPEN) - continue; /* avoid non-open conns if we can */ - newer = best->_base.timestamp_created < conn->_base.timestamp_created; - - if (best->is_canonical && !conn->is_canonical) - continue; /* A canonical connection is best. */ - - if (!best->_base.or_is_obsolete && conn->_base.or_is_obsolete) - continue; /* We never prefer obsolete over non-obsolete connections. */ - - if ( - /* We prefer non-obsolete connections: */ - (best->_base.or_is_obsolete && !conn->_base.or_is_obsolete) || - /* If both have circuits we prefer the newer: */ - (best->n_circuits && conn->n_circuits && newer) || - /* If neither has circuits we prefer the newer: */ - (!best->n_circuits && !conn->n_circuits && newer) || - /* We prefer connections with circuits: */ - (!best->n_circuits && conn->n_circuits)) { + + if (connection_or_is_better(now, conn, best, 0)) best = conn; - }; } - return best; + + if (best) { + *msg_out = "Connection is fine; using it."; + *launch_out = 0; + return best; + } else if (n_inprogress_goodaddr) { + *msg_out = "Connection in progress; waiting."; + *launch_out = 0; + return NULL; + } else if (n_old || n_noncanonical) { + *msg_out = "Connections all too old, or too non-canonical. " + " Launching a new one."; + *launch_out = 1; + return NULL; + } else { + *msg_out = "Not connected. Connecting."; + *launch_out = 1; + return NULL; + } +} + +/** How old do we let a connection to an OR get before deciding it's + * too old for new circuits? */ +#define TIME_BEFORE_OR_CONN_IS_TOO_OLD (60*60*24*7) + +/** Given the head of the linked list for all the or_connections with a given + * identity, set elements of that list as is_bad_for_new_circs() as + * appropriate. Helper for connection_or_set_bad_connections(). + */ +static void +connection_or_group_set_badness(or_connection_t *head) +{ + or_connection_t *or_conn = NULL, *best = NULL; + int n_old = 0, n_inprogress = 0, n_canonical = 0, n_other = 0; + time_t now = time(NULL); + + /* Pass 1: expire everything that's old, and see what the status of + * everything else is. */ + for (or_conn = head; or_conn; or_conn = or_conn->next_with_same_id) { + if (or_conn->_base.marked_for_close || + or_conn->is_bad_for_new_circs) + continue; + if (or_conn->_base.timestamp_created + TIME_BEFORE_OR_CONN_IS_TOO_OLD + < now) { + log_info(LD_OR, + "Marking OR conn to %s:%d as too old for new circuits " + "(fd %d, %d secs old).", + or_conn->_base.address, or_conn->_base.port, or_conn->_base.s, + (int)(now - or_conn->_base.timestamp_created)); + or_conn->is_bad_for_new_circs = 1; + } + + if (or_conn->is_bad_for_new_circs) { + ++n_old; + } else if (or_conn->_base.state != OR_CONN_STATE_OPEN) { + ++n_inprogress; + } else if (or_conn->is_canonical) { + ++n_canonical; + } else { + ++n_other; + } + } + + /* Pass 2: We know how about how good the best connection is. + * expire everything that's worse, and find the very best if we can. */ + for (or_conn = head; or_conn; or_conn = or_conn->next_with_same_id) { + if (or_conn->_base.marked_for_close || + or_conn->is_bad_for_new_circs) + continue; /* This one doesn't need to be marked bad. */ + if (or_conn->_base.state != OR_CONN_STATE_OPEN) + continue; /* Don't mark anything bad until we have seen what happens + * when the connection finishes. */ + if (n_canonical && !or_conn->is_canonical) { + /* We have at least one open canonical connection to this router, + * and this one is open but not canonical. Mark it bad. */ + log_info(LD_OR, + "Marking OR conn to %s:%d as unsuitable for new circuits: " + "(fd %d, %d secs old). It is not canonical, and we have " + "another connection to that OR that is.", + or_conn->_base.address, or_conn->_base.port, or_conn->_base.s, + (int)(now - or_conn->_base.timestamp_created)); + or_conn->is_bad_for_new_circs = 1; + continue; + } + + if (!best || connection_or_is_better(now, or_conn, best, 0)) + best = or_conn; + } + + if (!best) + return; + + /* Pass 3: One connection to OR is best. If it's canonical, mark as bad + * every other open connection. If it's non-canonical, mark as bad + * every other open connection to the same address. + * + * XXXX This isn't optimal; if we have connections to an OR at multiple + * addresses, we'd like to pick the best _for each address_, and mark as + * bad every open connection that isn't best for its address. But this + * can only occur in cases where the other OR is old (so we have no + * canonical connection to it), or where all the connections to the OR are + * at noncanonical addresses and we have no good direct connection (which + * means we aren't at risk of attaching circuits to it anyway). As + * 0.1.2.x dies out, the first case will go away, and the second one is + * "mostly harmless", so a fix can wait until somebody is bored. + */ + for (or_conn = head; or_conn; or_conn = or_conn->next_with_same_id) { + if (or_conn->_base.marked_for_close || + or_conn->is_bad_for_new_circs || + or_conn->_base.state != OR_CONN_STATE_OPEN) + continue; + if (or_conn != best && connection_or_is_better(now, best, or_conn, 1)) { + /* This isn't the best conn, _and_ the best conn is better than it, + even when we're being forgiving. */ + if (best->is_canonical) { + log_info(LD_OR, + "Marking OR conn to %s:%d as unsuitable for new circuits: " + "(fd %d, %d secs old). We have a better canonical one " + "(fd %d; %d secs old).", + or_conn->_base.address, or_conn->_base.port, or_conn->_base.s, + (int)(now - or_conn->_base.timestamp_created), + best->_base.s, (int)(now - best->_base.timestamp_created)); + or_conn->is_bad_for_new_circs = 1; + } else if (!tor_addr_compare(&or_conn->real_addr, + &best->real_addr, CMP_EXACT)) { + log_info(LD_OR, + "Marking OR conn to %s:%d as unsuitable for new circuits: " + "(fd %d, %d secs old). We have a better one with the " + "same address (fd %d; %d secs old).", + or_conn->_base.address, or_conn->_base.port, or_conn->_base.s, + (int)(now - or_conn->_base.timestamp_created), + best->_base.s, (int)(now - best->_base.timestamp_created)); + or_conn->is_bad_for_new_circs = 1; + } + } + } +} + +/** Go through all the OR connections, and set the is_bad_for_new_circs + * flag on: + * - all connections that are too old. + * - all open non-canonical connections for which a canonical connection + * exists to the same router. + * - all open canonical connections for which a 'better' canonical + * connection exists to the same router. + * - all open non-canonical connections for which a 'better' non-canonical + * connection exists to the same router at the same address. + * + * See connection_or_is_better() for our idea of what makes one OR connection + * better than another. + */ +void +connection_or_set_bad_connections(void) +{ + if (!orconn_identity_map) + return; + + DIGESTMAP_FOREACH(orconn_identity_map, identity, or_connection_t *, conn) { + connection_or_group_set_badness(conn); + } DIGESTMAP_FOREACH_END; +} + +/** conn is in the 'connecting' state, and it failed to complete + * a TCP connection. Send notifications appropriately. + * + * reason specifies the or_conn_end_reason for the failure; + * msg specifies the strerror-style error message. + */ +void +connection_or_connect_failed(or_connection_t *conn, + int reason, const char *msg) +{ + control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED, reason); + if (!authdir_mode_tests_reachability(get_options())) + control_event_bootstrap_problem(msg, reason); } /** Launch a new OR connection to addr:port and expect to @@ -508,47 +772,61 @@ * Return the launched conn, or NULL if it failed. */ or_connection_t * -connection_or_connect(uint32_t addr, uint16_t port, const char *id_digest) +connection_or_connect(const tor_addr_t *_addr, uint16_t port, + const char *id_digest) { or_connection_t *conn; or_options_t *options = get_options(); + int socket_error = 0; + int using_proxy = 0; + tor_addr_t addr; + tor_assert(_addr); tor_assert(id_digest); + tor_addr_copy(&addr, _addr); if (server_mode(options) && router_digest_is_me(id_digest)) { log_info(LD_PROTOCOL,"Client asked me to connect to myself. Refusing."); return NULL; } - conn = TO_OR_CONN(connection_new(CONN_TYPE_OR, AF_INET)); + conn = or_connection_new(AF_INET); /* set up conn so it's got all the data we need to remember */ - connection_or_init_conn_from_address(conn, addr, port, id_digest, 1); + connection_or_init_conn_from_address(conn, &addr, port, id_digest, 1); conn->_base.state = OR_CONN_STATE_CONNECTING; control_event_or_conn_status(conn, OR_CONN_EVENT_LAUNCHED, 0); + /* use a proxy server if available */ if (options->HttpsProxy) { - /* we shouldn't connect directly. use the https proxy instead. */ - addr = options->HttpsProxyAddr; + using_proxy = 1; + tor_addr_copy(&addr, &options->HttpsProxyAddr); port = options->HttpsProxyPort; + } else if (options->Socks4Proxy) { + using_proxy = 1; + tor_addr_copy(&addr, &options->Socks4ProxyAddr); + port = options->Socks4ProxyPort; + } else if (options->Socks5Proxy) { + using_proxy = 1; + tor_addr_copy(&addr, &options->Socks5ProxyAddr); + port = options->Socks5ProxyPort; } - switch (connection_connect(TO_CONN(conn), conn->_base.address, addr, port)) { + switch (connection_connect(TO_CONN(conn), conn->_base.address, + &addr, port, &socket_error)) { case -1: /* If the connection failed immediately, and we're using - * an https proxy, our https proxy is down. Don't blame the - * Tor server. */ - if (!options->HttpsProxy) { - entry_guard_register_connect_status(conn->identity_digest, 0, - time(NULL)); - router_set_status(conn->identity_digest, 0); - } - control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED, - END_OR_CONN_REASON_TCP_REFUSED); + * a proxy, our proxy is down. Don't blame the Tor server. */ + if (!using_proxy) + entry_guard_register_connect_status(conn->identity_digest, + 0, 1, time(NULL)); + connection_or_connect_failed(conn, + errno_to_orconn_end_reason(socket_error), + tor_socket_strerror(socket_error)); connection_free(TO_CONN(conn)); return NULL; case 0: - connection_watch_events(TO_CONN(conn), EV_READ | EV_WRITE); + connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT); /* writable indicates finish, readable indicates broken link, error indicates broken link on windows */ return conn; @@ -575,13 +853,14 @@ { conn->_base.state = OR_CONN_STATE_TLS_HANDSHAKING; conn->tls = tor_tls_new(conn->_base.s, receiving); - tor_tls_set_logged_address(conn->tls, escaped_safe_str(conn->_base.address)); + tor_tls_set_logged_address(conn->tls, // XXX client and relay? + escaped_safe_str(conn->_base.address)); if (!conn->tls) { log_warn(LD_BUG,"tor_tls_new failed. Closing."); return -1; } connection_start_reading(TO_CONN(conn)); - log_debug(LD_OR,"starting TLS handshake on fd %d", conn->_base.s); + log_debug(LD_HANDSHAKE,"starting TLS handshake on fd %d", conn->_base.s); note_crypto_pk_op(receiving ? TLS_HANDSHAKE_S : TLS_HANDSHAKE_C); if (connection_tls_continue_handshake(conn) < 0) { @@ -600,6 +879,7 @@ /* Don't invoke this again. */ tor_tls_set_renegotiate_callback(tls, NULL, NULL); + tor_tls_block_renegotiation(tls); if (connection_tls_finish_handshake(conn) < 0) { /* XXXX_TLS double-check that it's ok to do this from inside read. */ @@ -687,23 +967,26 @@ * return -1 if he is lying, broken, or otherwise something is wrong. * * If we initiated this connection (started_here is true), make sure - * the other side sent sent a correctly formed certificate. If I initiated the + * the other side sent a correctly formed certificate. If I initiated the * connection, make sure it's the right guy. * * Otherwise (if we _didn't_ initiate this connection), it's okay for * the certificate to be weird or absent. * * If we return 0, and the certificate is as expected, write a hash of the - * identity key into digest_rcvd, which must have DIGEST_LEN space in it. (If - * we return -1 this buffer is undefined.) If the certificate is invalid - * or missing on an incoming connection, we return 0 and set digest_rcvd to - * DIGEST_LEN 0 bytes. + * identity key into digest_rcvd_out, which must have DIGEST_LEN + * space in it. + * If the certificate is invalid or missing on an incoming connection, + * we return 0 and set digest_rcvd_out to DIGEST_LEN NUL bytes. + * (If we return -1, the contents of this buffer are undefined.) * * As side effects, * 1) Set conn->circ_id_type according to tor-spec.txt. * 2) If we're an authdirserver and we initiated the connection: drop all * descriptors that claim to be on that IP/port but that aren't * this guy; and note that this guy is reachable. + * 3) If this is a bridge and we didn't configure its identity + * fingerprint, remember the keyid we just learned. */ static int connection_or_check_valid_tls_handshake(or_connection_t *conn, @@ -714,19 +997,20 @@ or_options_t *options = get_options(); int severity = server_mode(options) ? LOG_PROTOCOL_WARN : LOG_WARN; const char *safe_address = - started_here ? conn->_base.address : safe_str(conn->_base.address); + started_here ? conn->_base.address : + safe_str_client(conn->_base.address); const char *conn_type = started_here ? "outgoing" : "incoming"; int has_cert = 0, has_identity=0; check_no_tls_errors(); has_cert = tor_tls_peer_has_cert(conn->tls); if (started_here && !has_cert) { - log_info(LD_PROTOCOL,"Tried connecting to router at %s:%d, but it didn't " + log_info(LD_HANDSHAKE,"Tried connecting to router at %s:%d, but it didn't " "send a cert! Closing.", safe_address, conn->_base.port); return -1; } else if (!has_cert) { - log_debug(LD_PROTOCOL,"Got incoming connection with no certificate. " + log_debug(LD_HANDSHAKE,"Got incoming connection with no certificate. " "That's ok."); } check_no_tls_errors(); @@ -735,15 +1019,16 @@ int v = tor_tls_verify(started_here?severity:LOG_INFO, conn->tls, &identity_rcvd); if (started_here && v<0) { - log_fn(severity,LD_OR,"Tried connecting to router at %s:%d: It" + log_fn(severity,LD_HANDSHAKE,"Tried connecting to router at %s:%d: It" " has a cert but it's invalid. Closing.", safe_address, conn->_base.port); return -1; } else if (v<0) { - log_info(LD_PROTOCOL,"Incoming connection gave us an invalid cert " + log_info(LD_HANDSHAKE,"Incoming connection gave us an invalid cert " "chain; ignoring."); } else { - log_debug(LD_OR,"The certificate seems to be valid on %s connection " + log_debug(LD_HANDSHAKE, + "The certificate seems to be valid on %s connection " "with %s:%d", conn_type, safe_address, conn->_base.port); } check_no_tls_errors(); @@ -770,9 +1055,13 @@ conn->nickname[0] = '$'; base16_encode(conn->nickname+1, HEX_DIGEST_LEN+1, conn->identity_digest, DIGEST_LEN); - log_info(LD_OR, "Connected to router %s at %s:%d without knowing " + log_info(LD_HANDSHAKE, "Connected to router %s at %s:%d without knowing " "its key. Hoping for the best.", conn->nickname, conn->_base.address, conn->_base.port); + /* if it's a bridge and we didn't know its identity fingerprint, now + * we do -- remember it for future attempts. */ + learned_router_identity(&conn->_base.addr, conn->_base.port, + digest_rcvd_out); } if (started_here) { @@ -786,14 +1075,16 @@ base16_encode(seen, sizeof(seen), digest_rcvd_out, DIGEST_LEN); base16_encode(expected, sizeof(expected), conn->identity_digest, DIGEST_LEN); - log_fn(severity, LD_OR, + log_fn(severity, LD_HANDSHAKE, "Tried connecting to router at %s:%d, but identity key was not " "as expected: wanted %s but got %s.", conn->_base.address, conn->_base.port, expected, seen); - entry_guard_register_connect_status(conn->identity_digest,0,time(NULL)); - router_set_status(conn->identity_digest, 0); + entry_guard_register_connect_status(conn->identity_digest, 0, 1, + time(NULL)); control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED, END_OR_CONN_REASON_OR_IDENTITY); + if (!authdir_mode_tests_reachability(options)) + control_event_bootstrap_problem("foo", END_OR_CONN_REASON_OR_IDENTITY); as_advertised = 0; } if (authdir_mode_tests_reachability(options)) { @@ -826,8 +1117,8 @@ char digest_rcvd[DIGEST_LEN]; int started_here = connection_or_nonopen_was_started_here(conn); - log_debug(LD_OR,"tls handshake with %s done. verifying.", - conn->_base.address); + log_debug(LD_HANDSHAKE,"tls handshake with %s done. verifying.", + safe_str_client(conn->_base.address)); directory_set_dirty(); @@ -835,19 +1126,22 @@ digest_rcvd) < 0) return -1; + circuit_build_times_network_is_live(&circ_times); + if (tor_tls_used_v1_handshake(conn->tls)) { conn->link_proto = 1; if (!started_here) { - connection_or_init_conn_from_address(conn,conn->_base.addr, + connection_or_init_conn_from_address(conn, &conn->_base.addr, conn->_base.port, digest_rcvd, 0); } + tor_tls_block_renegotiation(conn->tls); return connection_or_set_state_open(conn); } else { conn->_base.state = OR_CONN_STATE_OR_HANDSHAKING; if (connection_init_or_handshake_state(conn, started_here) < 0) return -1; if (!started_here) { - connection_or_init_conn_from_address(conn,conn->_base.addr, + connection_or_init_conn_from_address(conn, &conn->_base.addr, conn->_base.port, digest_rcvd, 0); } return connection_or_send_versions(conn); @@ -869,7 +1163,8 @@ void or_handshake_state_free(or_handshake_state_t *state) { - tor_assert(state); + if (!state) + return; memset(state, 0xBE, sizeof(or_handshake_state_t)); tor_free(state); } @@ -886,22 +1181,35 @@ control_event_or_conn_status(conn, OR_CONN_EVENT_CONNECTED, 0); if (started_here) { + circuit_build_times_network_is_live(&circ_times); rep_hist_note_connect_succeeded(conn->identity_digest, now); if (entry_guard_register_connect_status(conn->identity_digest, - 1, now) < 0) { - /* pending circs get closed in circuit_about_to_close_connection() */ + 1, 0, now) < 0) { + /* Close any circuits pending on this conn. We leave it in state + * 'open' though, because it didn't actually *fail* -- we just + * chose not to use it. (Otherwise + * connection_about_to_close_connection() will call a big pile of + * functions to indicate we shouldn't try it again.) */ + log_debug(LD_OR, "New entry guard was reachable, but closing this " + "connection so we can retry the earlier entry guards."); + circuit_n_conn_done(conn, 0); return -1; } router_set_status(conn->identity_digest, 1); } else { /* only report it to the geoip module if it's not a known router */ - if (!router_get_by_digest(conn->identity_digest)) - geoip_note_client_seen(TO_CONN(conn)->addr, now); - } - if (conn->handshake_state) { - or_handshake_state_free(conn->handshake_state); - conn->handshake_state = NULL; + if (!router_get_by_digest(conn->identity_digest)) { + if (tor_addr_family(&TO_CONN(conn)->addr) == AF_INET) { + /*XXXX IP6 support ipv6 geoip.*/ + uint32_t a = tor_addr_to_ipv4h(&TO_CONN(conn)->addr); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, a, now); + } + } } + + or_handshake_state_free(conn->handshake_state); + conn->handshake_state = NULL; + connection_start_reading(TO_CONN(conn)); circuit_n_conn_done(conn, 1); /* send the pending creates, if any. */ @@ -925,7 +1233,7 @@ connection_write_to_buf(networkcell.body, CELL_NETWORK_SIZE, TO_CONN(conn)); if (cell->command != CELL_PADDING) - conn->timestamp_last_added_nonpadding = time(NULL); + conn->timestamp_last_added_nonpadding = approx_time(); } /** Pack a variable-length cell into wire-format, and write it onto @@ -943,7 +1251,7 @@ connection_write_to_buf(hdr, sizeof(hdr), TO_CONN(conn)); connection_write_to_buf(cell->payload, cell->payload_len, TO_CONN(conn)); if (cell->command != CELL_PADDING) - conn->timestamp_last_added_nonpadding = time(NULL); + conn->timestamp_last_added_nonpadding = approx_time(); } /** See whether there's a variable-length cell waiting on conn's @@ -974,6 +1282,7 @@ if (connection_fetch_var_cell_from_buf(conn, &var_cell)) { if (!var_cell) return 0; /* not yet. */ + circuit_build_times_network_is_live(&circ_times); command_process_var_cell(var_cell, conn); var_cell_free(var_cell); } else { @@ -983,6 +1292,7 @@ available? */ return 0; /* not yet */ + circuit_build_times_network_is_live(&circ_times); connection_fetch_from_buf(buf, CELL_NETWORK_SIZE, TO_CONN(conn)); /* retrieve cell info from buf (create the host-order struct from the @@ -1001,7 +1311,7 @@ * Return 0. */ int -connection_or_send_destroy(uint16_t circ_id, or_connection_t *conn, int reason) +connection_or_send_destroy(circid_t circ_id, or_connection_t *conn, int reason) { cell_t cell; @@ -1013,10 +1323,6 @@ cell.payload[0] = (uint8_t) reason; log_debug(LD_OR,"Sending destroy (circID %d).", circ_id); - /* XXXX It's possible that under some circumstances, we want the destroy - * to take precedence over other data waiting on the circuit's cell queue. - */ - connection_or_write_cell_to_buf(&cell, conn); return 0; } @@ -1071,24 +1377,34 @@ cell_t cell; time_t now = time(NULL); routerinfo_t *me; + int len; + char *out; memset(&cell, 0, sizeof(cell_t)); cell.command = CELL_NETINFO; - /* Their address. */ + /* Timestamp. */ set_uint32(cell.payload, htonl((uint32_t)now)); - cell.payload[4] = RESOLVED_TYPE_IPV4; - cell.payload[5] = 4; - set_uint32(cell.payload+6, htonl(conn->_base.addr)); + + /* Their address. */ + out = cell.payload + 4; + len = append_address_to_payload(out, &conn->_base.addr); + if (len<0) + return -1; + out += len; /* My address. */ if ((me = router_get_my_routerinfo())) { - cell.payload[10] = 1; /* only one address is supported. */ - cell.payload[11] = RESOLVED_TYPE_IPV4; - cell.payload[12] = 4; - set_uint32(cell.payload+13, htonl(me->addr)); + tor_addr_t my_addr; + *out++ = 1; /* only one address is supported. */ + + tor_addr_from_ipv4h(&my_addr, me->addr); + len = append_address_to_payload(out, &my_addr); + if (len < 0) + return -1; + out += len; } else { - cell.payload[10] = 0; + *out++ = 0; } connection_or_write_cell_to_buf(&cell, conn); diff -Nru tor-0.2.0.34/src/or/connection_or.h tor-0.2.2.16-alpha/src/or/connection_or.h --- tor-0.2.0.34/src/or/connection_or.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/connection_or.h 2010-08-18 23:04:46.000000000 +0000 @@ -0,0 +1,57 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file connection_or.h + * \brief Header file for connection_or.c. + **/ + +#ifndef _TOR_CONNECTION_OR_H +#define _TOR_CONNECTION_OR_H + +void connection_or_remove_from_identity_map(or_connection_t *conn); +void connection_or_clear_identity_map(void); +or_connection_t *connection_or_get_for_extend(const char *digest, + const tor_addr_t *target_addr, + const char **msg_out, + int *launch_out); +void connection_or_set_bad_connections(void); + +int connection_or_reached_eof(or_connection_t *conn); +int connection_or_process_inbuf(or_connection_t *conn); +int connection_or_flushed_some(or_connection_t *conn); +int connection_or_finished_flushing(or_connection_t *conn); +int connection_or_finished_connecting(or_connection_t *conn); +int connection_or_digest_is_known_relay(const char *id_digest); +void connection_or_update_token_buckets(smartlist_t *conns, + or_options_t *options); + +void connection_or_connect_failed(or_connection_t *conn, + int reason, const char *msg); +or_connection_t *connection_or_connect(const tor_addr_t *addr, uint16_t port, + const char *id_digest); + +int connection_tls_start_handshake(or_connection_t *conn, int receiving); +int connection_tls_continue_handshake(or_connection_t *conn); + +void or_handshake_state_free(or_handshake_state_t *state); +int connection_or_set_state_open(or_connection_t *conn); +void connection_or_write_cell_to_buf(const cell_t *cell, + or_connection_t *conn); +void connection_or_write_var_cell_to_buf(const var_cell_t *cell, + or_connection_t *conn); +int connection_or_send_destroy(circid_t circ_id, or_connection_t *conn, + int reason); +int connection_or_send_netinfo(or_connection_t *conn); +int is_or_protocol_version_known(uint16_t version); + +void cell_pack(packed_cell_t *dest, const cell_t *src); +void var_cell_pack_header(const var_cell_t *cell, char *hdr_out); +var_cell_t *var_cell_new(uint16_t payload_len); +void var_cell_free(var_cell_t *cell); + +#endif + diff -Nru tor-0.2.0.34/src/or/control.c tor-0.2.2.16-alpha/src/or/control.c --- tor-0.2.0.34/src/or/control.c 2008-12-17 22:36:01.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/control.c 2010-08-18 23:04:46.000000000 +0000 @@ -1,9 +1,6 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: control.c 17635 2008-12-16 22:53:24Z nickm $ */ -const char control_c_id[] = - "$Id: control.c 17635 2008-12-16 22:53:24Z nickm $"; /** * \file control.c @@ -14,6 +11,26 @@ #define CONTROL_PRIVATE #include "or.h" +#include "buffers.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "control.h" +#include "directory.h" +#include "dirserv.h" +#include "dnsserv.h" +#include "geoip.h" +#include "hibernate.h" +#include "main.h" +#include "networkstatus.h" +#include "policies.h" +#include "reasons.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" /** Yield true iff s is the state of a control_connection_t that has * finished authentication and is accepting commands. */ @@ -44,7 +61,10 @@ #define EVENT_STATUS_GENERAL 0x0012 #define EVENT_GUARD 0x0013 #define EVENT_STREAM_BANDWIDTH_USED 0x0014 -#define _EVENT_MAX 0x0014 +#define EVENT_CLIENTS_SEEN 0x0015 +#define EVENT_NEWCONSENSUS 0x0016 +#define EVENT_BUILDTIMEOUT_SET 0x0017 +#define _EVENT_MAX 0x0017 /* If _EVENT_MAX ever hits 0x0020, we need to make the mask wider. */ /** Bitfield: The bit 1<<e is set if any open control @@ -54,8 +74,10 @@ * list to find out. **/ typedef uint32_t event_mask_t; -static event_mask_t global_event_mask1long = 0; -static event_mask_t global_event_mask1short = 0; + +/** An event mask of all the events that any controller is interested in + * receiving. */ +static event_mask_t global_event_mask = 0; /** True iff we have disabled log messages from being sent to the controller */ static int disable_log_messages = 0; @@ -63,9 +85,7 @@ /** Macro: true if any control connection is interested in events of type * e. */ #define EVENT_IS_INTERESTING(e) \ - ((global_event_mask1long|global_event_mask1short) & (1<<(e))) -#define EVENT_IS_INTERESTING1L(e) (global_event_mask1long & (1<<(e))) -#define EVENT_IS_INTERESTING1S(e) (global_event_mask1short & (1<<(e))) + (global_event_mask & (1<<(e))) /** If we're using cookie-type authentication, how long should our cookies be? */ @@ -74,14 +94,25 @@ /** If true, we've set authentication_cookie to a secret code and * stored it to disk. */ static int authentication_cookie_is_set = 0; +/** If authentication_cookie_is_set, a secret cookie that we've stored to disk + * and which we're using to authenticate controllers. (If the controller can + * read it off disk, it has permission to connect. */ static char authentication_cookie[AUTHENTICATION_COOKIE_LEN]; -#define SHORT_NAMES 1 -#define LONG_NAMES 2 -#define ALL_NAMES (SHORT_NAMES|LONG_NAMES) -#define EXTENDED_FORMAT 4 -#define NONEXTENDED_FORMAT 8 -#define ALL_FORMATS (EXTENDED_FORMAT|NONEXTENDED_FORMAT) +/** A sufficiently large size to record the last bootstrap phase string. */ +#define BOOTSTRAP_MSG_LEN 1024 + +/** What was the last bootstrap phase message we sent? We keep track + * of this so we can respond to getinfo status/bootstrap-phase queries. */ +static char last_sent_bootstrap_message[BOOTSTRAP_MSG_LEN]; + +/** Flag for event_format_t. Indicates that we should use the one standard + format. + */ +#define ALL_FORMATS 1 + +/** Bit field of flags to select how to format a controller event. Recognized + * flag is ALL_FORMATS. */ typedef int event_format_t; static void connection_printf_to_buf(control_connection_t *conn, @@ -91,22 +122,19 @@ static void send_control_event(uint16_t event, event_format_t which, const char *format, ...) CHECK_PRINTF(3,4); -static void send_control_event_extended(uint16_t event, event_format_t which, - const char *format, ...) - CHECK_PRINTF(3,4); static int handle_control_setconf(control_connection_t *conn, uint32_t len, char *body); static int handle_control_resetconf(control_connection_t *conn, uint32_t len, char *body); static int handle_control_getconf(control_connection_t *conn, uint32_t len, const char *body); +static int handle_control_loadconf(control_connection_t *conn, uint32_t len, + const char *body); static int handle_control_setevents(control_connection_t *conn, uint32_t len, const char *body); static int handle_control_authenticate(control_connection_t *conn, uint32_t len, const char *body); -static int handle_control_saveconf(control_connection_t *conn, uint32_t len, - const char *body); static int handle_control_signal(control_connection_t *conn, uint32_t len, const char *body); static int handle_control_mapaddress(control_connection_t *conn, uint32_t len, @@ -140,7 +168,7 @@ const char *body); static int write_stream_target_to_buf(edge_connection_t *conn, char *buf, size_t len); -static void orconn_target_get_name(int long_names, char *buf, size_t len, +static void orconn_target_get_name(char *buf, size_t len, or_connection_t *conn); static char *get_cookie_file(void); @@ -180,25 +208,19 @@ { smartlist_t *conns = get_connection_array(); event_mask_t old_mask, new_mask; - old_mask = global_event_mask1short; - old_mask |= global_event_mask1long; + old_mask = global_event_mask; - global_event_mask1short = 0; - global_event_mask1long = 0; + global_event_mask = 0; SMARTLIST_FOREACH(conns, connection_t *, _conn, { if (_conn->type == CONN_TYPE_CONTROL && STATE_IS_OPEN(_conn->state)) { control_connection_t *conn = TO_CONTROL_CONN(_conn); - if (conn->use_long_names) - global_event_mask1long |= conn->event_mask; - else - global_event_mask1short |= conn->event_mask; + global_event_mask |= conn->event_mask; } }); - new_mask = global_event_mask1short; - new_mask |= global_event_mask1long; + new_mask = global_event_mask; /* Handle the aftermath. Set up the log callback to tell us only what * we want to hear...*/ @@ -246,9 +268,13 @@ if (max_log_event < EVENT_ERR_MSG) max_log_event = EVENT_ERR_MSG; } - change_callback_log_severity(event_to_log_severity(min_log_event), - event_to_log_severity(max_log_event), - control_event_logmsg); + if (min_log_event <= max_log_event) + change_callback_log_severity(event_to_log_severity(min_log_event), + event_to_log_severity(max_log_event), + control_event_logmsg); + else + change_callback_log_severity(LOG_ERR, LOG_ERR, + control_event_logmsg); } /** Return true iff the event with code c is being sent to any current @@ -274,7 +300,7 @@ /** Given a len-character string in data, made of lines * terminated by CRLF, allocate a new string in *out, and copy the * contents of data into *out, adding a period before any period - * that that appears at the start of a line, and adding a period-CRLF line at + * that appears at the start of a line, and adding a period-CRLF line at * the end. Replace all LF characters sequences with CRLF. Return the number * of bytes in *out. */ @@ -364,7 +390,7 @@ return outp - *out; } -/** If the first in_len_max characters in start contain a +/** If the first in_len_max characters in start contain a * double-quoted string with escaped characters, return the length of that * string (as encoded, including quotes). Otherwise return -1. */ static INLINE int @@ -457,7 +483,7 @@ * but it will always end with a CRLF sequence. * * Currently the length of the message is limited to 1024 (including the - * ending \r\n\0. */ + * ending CR LF NUL ("\\r\\n\\0"). */ static void connection_printf_to_buf(control_connection_t *conn, const char *format, ...) { @@ -489,13 +515,13 @@ connection_write_str_to_buf("250 OK\r\n", conn); } -/* Send an event to all v1 controllers that are listening for code +/** Send an event to all v1 controllers that are listening for code * event. The event's body is given by msg. * * If which & SHORT_NAMES, the event contains short-format names: send * it to controllers that haven't enabled the VERBOSE_NAMES feature. If * which & LONG_NAMES, the event contains long-format names: send it - * to contollers that have enabled VERBOSE_NAMES. + * to controllers that have enabled VERBOSE_NAMES. * * The EXTENDED_FORMAT and NONEXTENDED_FORMAT flags behave similarly with * respect to the EXTENDED_EVENTS feature. */ @@ -504,28 +530,15 @@ const char *msg) { smartlist_t *conns = get_connection_array(); + (void)which; tor_assert(event >= _EVENT_MIN && event <= _EVENT_MAX); - SMARTLIST_FOREACH(conns, connection_t *, conn, - { + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { if (conn->type == CONN_TYPE_CONTROL && !conn->marked_for_close && conn->state == CONTROL_CONN_STATE_OPEN) { control_connection_t *control_conn = TO_CONTROL_CONN(conn); - if (control_conn->use_long_names) { - if (!(which & LONG_NAMES)) - continue; - } else { - if (!(which & SHORT_NAMES)) - continue; - } - if (control_conn->use_extended_events) { - if (!(which & EXTENDED_FORMAT)) - continue; - } else { - if (!(which & NONEXTENDED_FORMAT)) - continue; - } + if (control_conn->event_mask & (1<event. The event's body is created by the printf-style format in * format, and other arguments as provided. * - * If extended is true, and the format contains a single '@' character, - * it will be replaced with a space and all text after that character will be - * sent only to controllers that have enabled extended events. - * * Currently the length of the message is limited to 1024 (including the - * ending \n\r\0). */ + * ending \\r\\n\\0). */ static void -send_control_event_impl(uint16_t event, event_format_t which, int extended, +send_control_event_impl(uint16_t event, event_format_t which, const char *format, va_list ap) { /* This is just a little longer than the longest allowed log message */ @@ -564,7 +573,6 @@ int r; char buf[SEND_CONTROL1_EVENT_BUFFERSIZE]; size_t len; - char *cp; r = tor_vsnprintf(buf, sizeof(buf), format, ap); if (r<0) { @@ -580,50 +588,22 @@ buf[SEND_CONTROL1_EVENT_BUFFERSIZE-3] = '\r'; } - if (extended && (cp = strchr(buf, '@'))) { - which &= ~ALL_FORMATS; - *cp = ' '; - send_control_event_string(event, which|EXTENDED_FORMAT, buf); - memcpy(cp, "\r\n\0", 3); - send_control_event_string(event, which|NONEXTENDED_FORMAT, buf); - } else { - send_control_event_string(event, which|ALL_FORMATS, buf); - } + send_control_event_string(event, which|ALL_FORMATS, buf); } -/* Send an event to all v1 controllers that are listening for code +/** Send an event to all v1 controllers that are listening for code * event. The event's body is created by the printf-style format in * format, and other arguments as provided. * * Currently the length of the message is limited to 1024 (including the - * ending \n\r\0. */ + * ending \\n\\r\\0. */ static void send_control_event(uint16_t event, event_format_t which, - const char *format, ...) -{ - va_list ap; - va_start(ap, format); - send_control_event_impl(event, which, 0, format, ap); - va_end(ap); -} - -/* Send an event to all v1 controllers that are listening for code - * event. The event's body is created by the printf-style format in - * format, and other arguments as provided. - * - * If the format contains a single '@' character, it will be replaced with a - * space and all text after that character will be sent only to controllers - * that have enabled extended events. - * - * Currently the length of the message is limited to 1024 (including the - * ending \n\r\0. */ -static void -send_control_event_extended(uint16_t event, event_format_t which, - const char *format, ...) + const char *format, ...) { va_list ap; va_start(ap, format); - send_control_event_impl(event, which, 1, format, ap); + send_control_event_impl(event, which, format, ap); va_end(ap); } @@ -663,7 +643,7 @@ control_setconf_helper(control_connection_t *conn, uint32_t len, char *body, int use_defaults) { - int r; + setopt_err_t opt_err; config_line_t *lines=NULL; char *start = body; char *errstring = NULL; @@ -730,35 +710,36 @@ } tor_free(config); - if ((r=options_trial_assign(lines, use_defaults, - clear_first, &errstring)) < 0) { + opt_err = options_trial_assign(lines, use_defaults, clear_first, &errstring); + { const char *msg; - log_warn(LD_CONTROL, - "Controller gave us config lines that didn't validate: %s", - errstring); - switch (r) { - case -1: + switch (opt_err) { + case SETOPT_ERR_MISC: msg = "552 Unrecognized option"; break; - case -2: + case SETOPT_ERR_PARSE: msg = "513 Unacceptable option value"; break; - case -3: + case SETOPT_ERR_TRANSITION: msg = "553 Transition not allowed"; break; - case -4: + case SETOPT_ERR_SETTING: default: msg = "553 Unable to set option"; break; + case SETOPT_OK: + config_free_lines(lines); + send_control_done(conn); + return 0; } + log_warn(LD_CONTROL, + "Controller gave us config lines that didn't validate: %s", + errstring); connection_printf_to_buf(conn, "%s: %s\r\n", msg, errstring); config_free_lines(lines); tor_free(errstring); return 0; } - config_free_lines(lines); - send_control_done(conn); - return 0; } /** Called when we receive a SETCONF message: parse the body and try @@ -785,24 +766,21 @@ handle_control_getconf(control_connection_t *conn, uint32_t body_len, const char *body) { - smartlist_t *questions = NULL; - smartlist_t *answers = NULL; - smartlist_t *unrecognized = NULL; + smartlist_t *questions = smartlist_create(); + smartlist_t *answers = smartlist_create(); + smartlist_t *unrecognized = smartlist_create(); char *msg = NULL; size_t msg_len; or_options_t *options = get_options(); int i, len; - questions = smartlist_create(); - (void) body_len; /* body is nul-terminated; so we can ignore len. */ + (void) body_len; /* body is NUL-terminated; so we can ignore len. */ smartlist_split_string(questions, body, " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - answers = smartlist_create(); - unrecognized = smartlist_create(); - SMARTLIST_FOREACH(questions, char *, q, + SMARTLIST_FOREACH(questions, const char *, q, { if (!option_is_recognized(q)) { - smartlist_add(unrecognized, q); + smartlist_add(unrecognized, (char*) q); } else { config_line_t *answer = option_get_assignment(options,q); if (!answer) { @@ -848,20 +826,63 @@ connection_write_str_to_buf("250 OK\r\n", conn); } - if (answers) { - SMARTLIST_FOREACH(answers, char *, cp, tor_free(cp)); - smartlist_free(answers); - } - if (questions) { - SMARTLIST_FOREACH(questions, char *, cp, tor_free(cp)); - smartlist_free(questions); - } + SMARTLIST_FOREACH(answers, char *, cp, tor_free(cp)); + smartlist_free(answers); + SMARTLIST_FOREACH(questions, char *, cp, tor_free(cp)); + smartlist_free(questions); smartlist_free(unrecognized); + tor_free(msg); return 0; } +/** Called when we get a +LOADCONF message. */ +static int +handle_control_loadconf(control_connection_t *conn, uint32_t len, + const char *body) +{ + setopt_err_t retval; + char *errstring = NULL; + const char *msg = NULL; + (void) len; + + retval = options_init_from_string(body, CMD_RUN_TOR, NULL, &errstring); + + if (retval != SETOPT_OK) + log_warn(LD_CONTROL, + "Controller gave us config file that didn't validate: %s", + errstring); + + switch (retval) { + case SETOPT_ERR_PARSE: + msg = "552 Invalid config file"; + break; + case SETOPT_ERR_TRANSITION: + msg = "553 Transition not allowed"; + break; + case SETOPT_ERR_SETTING: + msg = "553 Unable to set option"; + break; + case SETOPT_ERR_MISC: + default: + msg = "550 Unable to load config"; + break; + case SETOPT_OK: + break; + } + if (msg) { + if (errstring) + connection_printf_to_buf(conn, "%s: %s\r\n", msg, errstring); + else + connection_printf_to_buf(conn, "%s\r\n", msg); + } else { + send_control_done(conn); + } + tor_free(errstring); + return 0; +} + /** Called when we get a SETEVENTS message: update conn->event_mask, * and reply with DONE or ERROR. */ static int @@ -870,17 +891,15 @@ { uint16_t event_code; uint32_t event_mask = 0; - unsigned int extended = 0; smartlist_t *events = smartlist_create(); (void) len; smartlist_split_string(events, body, " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH(events, const char *, ev, + SMARTLIST_FOREACH_BEGIN(events, const char *, ev) { if (!strcasecmp(ev, "EXTENDED")) { - extended = 1; continue; } else if (!strcasecmp(ev, "CIRC")) event_code = EVENT_CIRCUIT_STATUS; @@ -918,15 +937,14 @@ event_code = EVENT_STATUS_SERVER; else if (!strcasecmp(ev, "GUARD")) event_code = EVENT_GUARD; - else if (!strcasecmp(ev, "GUARDS")) { - /* XXXX021 This check is here to tolerate the controllers that - * depended on the buggy spec in 0.1.2.5-alpha through 0.1.2.10-rc. - * Once those versions are obsolete, stop supporting this. */ - log_warn(LD_CONTROL, "Controller used obsolete 'GUARDS' event name; " - "use GUARD instead."); - event_code = EVENT_GUARD; - } else if (!strcasecmp(ev, "STREAM_BW")) + else if (!strcasecmp(ev, "STREAM_BW")) event_code = EVENT_STREAM_BANDWIDTH_USED; + else if (!strcasecmp(ev, "CLIENTS_SEEN")) + event_code = EVENT_CLIENTS_SEEN; + else if (!strcasecmp(ev, "NEWCONSENSUS")) + event_code = EVENT_NEWCONSENSUS; + else if (!strcasecmp(ev, "BUILDTIMEOUT_SET")) + event_code = EVENT_BUILDTIMEOUT_SET; else { connection_printf_to_buf(conn, "552 Unrecognized event \"%s\"\r\n", ev); @@ -935,13 +953,12 @@ return 0; } event_mask |= (1 << event_code); - }); + } + SMARTLIST_FOREACH_END(ev); SMARTLIST_FOREACH(events, char *, e, tor_free(e)); smartlist_free(events); conn->event_mask = event_mask; - if (extended) - conn->use_extended_events = 1; control_update_global_event_mask(); send_control_done(conn); @@ -1129,10 +1146,8 @@ err: tor_free(password); - if (!errstr) - errstr = "Unknown reason."; connection_printf_to_buf(conn, "515 Authentication failed: %s\r\n", - errstr); + errstr ? errstr : "Unknown reason."); connection_mark_for_close(TO_CONN(conn)); return 0; ok: @@ -1212,7 +1227,7 @@ } /** Called when we get a MAPADDRESS command; try to bind all listed addresses, - * and report success or failrue. */ + * and report success or failure. */ static int handle_control_mapaddress(control_connection_t *conn, uint32_t len, const char *body) @@ -1222,7 +1237,7 @@ smartlist_t *reply; char *r; size_t sz; - (void) len; /* body is nul-terminated, so it's safe to ignore the length. */ + (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */ lines = smartlist_create(); elts = smartlist_create(); @@ -1254,7 +1269,7 @@ smartlist_add(reply, ans); log_warn(LD_CONTROL, "Unable to allocate address for '%s' in MapAddress msg", - safe_str(line)); + safe_str_client(line)); } else { tor_snprintf(ans, anslen, "250-%s=%s", address, to); smartlist_add(reply, ans); @@ -1271,7 +1286,8 @@ "not of expected form 'foo=bar'.", line); smartlist_add(reply, ans); log_info(LD_CONTROL, "Skipping MapAddress '%s': wrong " - "number of items.", safe_str(line)); + "number of items.", + safe_str_client(line)); } SMARTLIST_FOREACH(elts, char *, cp, tor_free(cp)); smartlist_clear(elts); @@ -1300,33 +1316,39 @@ * trivial-to-implement questions. */ static int getinfo_helper_misc(control_connection_t *conn, const char *question, - char **answer) + char **answer, const char **errmsg) { (void) conn; if (!strcmp(question, "version")) { *answer = tor_strdup(get_version()); } else if (!strcmp(question, "config-file")) { *answer = tor_strdup(get_torrc_fname()); + } else if (!strcmp(question, "config-text")) { + *answer = options_dump(get_options(), 1); } else if (!strcmp(question, "info/names")) { *answer = list_getinfo_options(); } else if (!strcmp(question, "events/names")) { *answer = tor_strdup("CIRC STREAM ORCONN BW DEBUG INFO NOTICE WARN ERR " "NEWDESC ADDRMAP AUTHDIR_NEWDESCS DESCCHANGED " "NS STATUS_GENERAL STATUS_CLIENT STATUS_SERVER " - "GUARD STREAM_BW"); + "GUARD STREAM_BW CLIENTS_SEEN NEWCONSENSUS"); } else if (!strcmp(question, "features/names")) { *answer = tor_strdup("VERBOSE_NAMES EXTENDED_EVENTS"); } else if (!strcmp(question, "address")) { uint32_t addr; - if (router_pick_published_address(get_options(), &addr) < 0) + if (router_pick_published_address(get_options(), &addr) < 0) { + *errmsg = "Address unknown"; return -1; - *answer = tor_dup_addr(addr); + } + *answer = tor_dup_ip(addr); } else if (!strcmp(question, "dir-usage")) { *answer = directory_dump_request_log(); } else if (!strcmp(question, "fingerprint")) { routerinfo_t *me = router_get_my_routerinfo(); - if (!me) + if (!me) { + *errmsg = "No routerdesc known; am I really a server?"; return -1; + } *answer = tor_malloc(HEX_DIGEST_LEN+1); base16_encode(*answer, HEX_DIGEST_LEN+1, me->cache_info.identity_digest, DIGEST_LEN); @@ -1339,7 +1361,7 @@ * ei into the resulting string. The thing you get back won't * necessarily have a valid signature. * - * New code should never use this; it's for backward compatibiliy. + * New code should never use this; it's for backward compatibility. * * NOTE: ri_body is as returned by signed_descriptor_get_body: it might * not be NUL-terminated. */ @@ -1387,8 +1409,10 @@ * directory information. */ static int getinfo_helper_dir(control_connection_t *control_conn, - const char *question, char **answer) + const char *question, char **answer, + const char **errmsg) { + (void) control_conn; if (!strcmpstart(question, "desc/id/")) { routerinfo_t *ri = router_get_by_hexdigest(question+strlen("desc/id/")); if (ri) { @@ -1462,6 +1486,8 @@ if (res) { log_warn(LD_CONTROL, "getinfo '%s': %s", question, msg); smartlist_free(descs); + tor_free(url); + *errmsg = msg; return -1; } SMARTLIST_FOREACH(descs, signed_descriptor_t *, sd, @@ -1510,12 +1536,21 @@ SMARTLIST_FOREACH(status_list, char *, s, tor_free(s)); smartlist_free(status_list); } - } else if (!strcmp(question, "network-status")) { + } else if (!strcmp(question, "dir/status-vote/current/consensus")) { /* v3 */ + if (directory_caches_dir_info(get_options())) { + const cached_dir_t *consensus = dirserv_get_consensus("ns"); + if (consensus) + *answer = tor_strdup(consensus->dir); + } + if (!*answer) { /* try loading it from disk */ + char *filename = get_datadir_fname("cached-consensus"); + *answer = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); + tor_free(filename); + } + } else if (!strcmp(question, "network-status")) { /* v1 */ routerlist_t *routerlist = router_get_routerlist(); - int verbose = control_conn->use_long_names; if (!routerlist || !routerlist->routers || - list_server_status_v1(routerlist->routers, answer, - verbose ? 2 : 1) < 0) { + list_server_status_v1(routerlist->routers, answer, 1) < 0) { return -1; } } else if (!strcmpstart(question, "extra-info/digest/")) { @@ -1549,8 +1584,10 @@ * current states of things we send events about. */ static int getinfo_helper_events(control_connection_t *control_conn, - const char *question, char **answer) + const char *question, char **answer, + const char **errmsg) { + (void) control_conn; if (!strcmp(question, "circuit-status")) { circuit_t *circ; smartlist_t *status = smartlist_create(); @@ -1558,12 +1595,12 @@ char *s, *path; size_t slen; const char *state; + const char *purpose; if (! CIRCUIT_IS_ORIGIN(circ) || circ->marked_for_close) continue; - if (control_conn->use_long_names) - path = circuit_list_path_for_controller(TO_ORIGIN_CIRCUIT(circ)); - else - path = circuit_list_path(TO_ORIGIN_CIRCUIT(circ),0); + + path = circuit_list_path_for_controller(TO_ORIGIN_CIRCUIT(circ)); + if (circ->state == CIRCUIT_STATE_OPEN) state = "BUILT"; else if (strlen(path)) @@ -1571,11 +1608,12 @@ else state = "LAUNCHED"; - slen = strlen(path)+strlen(state)+20; + purpose = circuit_purpose_to_controller_string(circ->purpose); + slen = strlen(path)+strlen(state)+strlen(purpose)+30; s = tor_malloc(slen+1); - tor_snprintf(s, slen, "%lu %s%s%s", + tor_snprintf(s, slen, "%lu %s%s%s PURPOSE=%s", (unsigned long)TO_ORIGIN_CIRCUIT(circ)->global_identifier, - state, *path ? " " : "", path); + state, *path ? " " : "", path, purpose); smartlist_add(status, s); tor_free(path); } @@ -1586,7 +1624,7 @@ smartlist_t *conns = get_connection_array(); smartlist_t *status = smartlist_create(); char buf[256]; - SMARTLIST_FOREACH(conns, connection_t *, base_conn, { + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) { const char *state; edge_connection_t *conn; char *s; @@ -1633,15 +1671,14 @@ (unsigned long)origin_circ->global_identifier : 0ul, buf); smartlist_add(status, s); - }); + } SMARTLIST_FOREACH_END(base_conn); *answer = smartlist_join_strings(status, "\r\n", 0, NULL); SMARTLIST_FOREACH(status, char *, cp, tor_free(cp)); smartlist_free(status); } else if (!strcmp(question, "orconn-status")) { smartlist_t *conns = get_connection_array(); smartlist_t *status = smartlist_create(); - SMARTLIST_FOREACH(conns, connection_t *, base_conn, - { + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) { const char *state; char *s; char name[128]; @@ -1656,24 +1693,19 @@ state = "LAUNCHED"; else state = "NEW"; - orconn_target_get_name(control_conn->use_long_names, name, sizeof(name), - conn); + orconn_target_get_name(name, sizeof(name), conn); slen = strlen(name)+strlen(state)+2; s = tor_malloc(slen+1); tor_snprintf(s, slen, "%s %s", name, state); smartlist_add(status, s); - }); + } SMARTLIST_FOREACH_END(base_conn); *answer = smartlist_join_strings(status, "\r\n", 0, NULL); SMARTLIST_FOREACH(status, char *, cp, tor_free(cp)); smartlist_free(status); - } else if (!strcmpstart(question, "addr-mappings/") || - !strcmpstart(question, "address-mappings/")) { - /* XXXX021 Warn about deprecated addr-mappings variant. */ + } else if (!strcmpstart(question, "address-mappings/")) { time_t min_e, max_e; smartlist_t *mappings; - int want_expiry = !strcmpstart(question, "address-mappings/"); - question += strlen(want_expiry ? "address-mappings/" - : "addr-mappings/"); + question += strlen("address-mappings/"); if (!strcmp(question, "all")) { min_e = 0; max_e = TIME_MAX; } else if (!strcmp(question, "cache")) { @@ -1686,7 +1718,7 @@ return 0; } mappings = smartlist_create(); - addressmap_get_mappings(mappings, min_e, max_e, want_expiry); + addressmap_get_mappings(mappings, min_e, max_e, 1); *answer = smartlist_join_strings(mappings, "\r\n", 0, NULL); SMARTLIST_FOREACH(mappings, char *, cp, tor_free(cp)); smartlist_free(mappings); @@ -1697,7 +1729,11 @@ *answer = tor_strdup(has_completed_circuit ? "1" : "0"); } else if (!strcmp(question, "status/enough-dir-info")) { *answer = tor_strdup(router_have_minimum_dir_info() ? "1" : "0"); - } else if (!strcmp(question, "status/good-server-descriptor")) { + } else if (!strcmp(question, "status/good-server-descriptor") || + !strcmp(question, "status/accepted-server-descriptor")) { + /* They're equivalent for now, until we can figure out how to make + * good-server-descriptor be what we want. See comment in + * control-spec.txt. */ *answer = tor_strdup(directories_have_accepted_server_descriptor() ? "1" : "0"); } else if (!strcmp(question, "status/reachability-succeeded/or")) { @@ -1709,6 +1745,8 @@ tor_snprintf(*answer, 16, "OR=%d DIR=%d", check_whether_orport_reachable() ? 1 : 0, check_whether_dirport_reachable() ? 1 : 0); + } else if (!strcmp(question, "status/bootstrap-phase")) { + *answer = tor_strdup(last_sent_bootstrap_message); } else if (!strcmpstart(question, "status/version/")) { int is_server = server_mode(get_options()); networkstatus_t *c = networkstatus_get_latest_consensus(); @@ -1746,6 +1784,13 @@ log_warn(LD_GENERAL, "%s is deprecated; it no longer gives useful " "information", question); } + } else if (!strcmp(question, "status/clients-seen")) { + const char *bridge_stats = geoip_get_bridge_stats_controller(time(NULL)); + if (!bridge_stats) { + *errmsg = "No bridge-client stats available"; + return -1; + } + *answer = tor_strdup(bridge_stats); } else { return 0; } @@ -1755,11 +1800,14 @@ /** Callback function for GETINFO: on a given control connection, try to * answer the question q and store the newly-allocated answer in - * *a. If there's no answer, or an error occurs, just don't set - * a. Return 0. + * *a. If an internal error occurs, return -1 and optionally set + * *error_out to point to an error message to be delivered to the + * controller. On success, _or if the key is not recognized_, return 0. Do not + * set a if the key is not recognized. */ typedef int (*getinfo_helper_t)(control_connection_t *, - const char *q, char **a); + const char *q, char **a, + const char **error_out); /** A single item for the GETINFO question-to-answer-function table. */ typedef struct getinfo_item_t { @@ -1779,6 +1827,8 @@ static const getinfo_item_t getinfo_items[] = { ITEM("version", misc, "The current version of Tor."), ITEM("config-file", misc, "Current location of the \"torrc\" file."), + ITEM("config-text", misc, + "Return the string that would be written by a saveconf command."), ITEM("accounting/bytes", accounting, "Number of bytes read/written so far in the accounting interval."), ITEM("accounting/bytes-left", accounting, @@ -1818,7 +1868,6 @@ PREFIX("ns/purpose/", networkstatus, "Brief summary of router status by purpose (v2 directory format)."), - PREFIX("unregistered-servers-", dirserv_unregistered, NULL), ITEM("network-status", dir, "Brief summary of router status (v1 directory format)"), ITEM("circuit-status", events, "List of current circuits originating here."), @@ -1830,20 +1879,16 @@ DOC("address-mappings/config", "Current address mappings from configuration."), DOC("address-mappings/control", "Current address mappings from controller."), - PREFIX("addr-mappings/", events, NULL), - DOC("addr-mappings/all", "Current address mappings without expiry times."), - DOC("addr-mappings/cache", - "Current cached DNS replies without expiry times."), - DOC("addr-mappings/config", - "Current address mappings from configuration without expiry times."), - DOC("addr-mappings/control", - "Current address mappings from controller without expiry times."), PREFIX("status/", events, NULL), DOC("status/circuit-established", "Whether we think client functionality is working."), DOC("status/enough-dir-info", "Whether we have enough up-to-date directory information to build " "circuits."), + DOC("status/bootstrap-phase", + "The last bootstrap phase status event that Tor sent."), + DOC("status/clients-seen", + "Breakdown of client countries seen by a bridge."), DOC("status/version/recommended", "List of currently recommended versions."), DOC("status/version/current", "Status of the current version."), DOC("status/version/num-versioning", "Number of versioning authorities."), @@ -1854,7 +1899,10 @@ ITEM("dir-usage", misc, "Breakdown of bytes transferred over DirPort."), PREFIX("desc-annotations/id/", dir, "Router annotations by hexdigest."), PREFIX("dir/server/", dir,"Router descriptors as retrieved from a DirPort."), - PREFIX("dir/status/", dir,"Networkstatus docs as retrieved from a DirPort."), + PREFIX("dir/status/", dir, + "v2 networkstatus docs as retrieved from a DirPort."), + ITEM("dir/status-vote/current/consensus", dir, + "v3 Networkstatus consensus as retrieved from a DirPort."), PREFIX("exit-policy/default", policies, "The default value appended to the configured exit policy."), PREFIX("ip-to-country/", geoip, "Perform a GEOIP lookup"), @@ -1866,18 +1914,18 @@ list_getinfo_options(void) { int i; - char buf[300]; + char *buf=NULL; smartlist_t *lines = smartlist_create(); char *ans; for (i = 0; getinfo_items[i].varname; ++i) { if (!getinfo_items[i].desc) continue; - tor_snprintf(buf, sizeof(buf), "%s%s -- %s\n", + tor_asprintf(&buf, "%s%s -- %s\n", getinfo_items[i].varname, getinfo_items[i].is_prefix ? "*" : "", getinfo_items[i].desc); - smartlist_add(lines, tor_strdup(buf)); + smartlist_add(lines, buf); } smartlist_sort_strings(lines); @@ -1894,7 +1942,8 @@ * internal error. */ static int handle_getinfo_helper(control_connection_t *control_conn, - const char *question, char **answer) + const char *question, char **answer, + const char **err_out) { int i; *answer = NULL; /* unrecognized key by default */ @@ -1907,7 +1956,7 @@ match = !strcmp(question, getinfo_items[i].varname); if (match) { tor_assert(getinfo_items[i].fn); - return getinfo_items[i].fn(control_conn, question, answer); + return getinfo_items[i].fn(control_conn, question, answer, err_out); } } @@ -1920,22 +1969,21 @@ handle_control_getinfo(control_connection_t *conn, uint32_t len, const char *body) { - smartlist_t *questions = NULL; - smartlist_t *answers = NULL; - smartlist_t *unrecognized = NULL; + smartlist_t *questions = smartlist_create(); + smartlist_t *answers = smartlist_create(); + smartlist_t *unrecognized = smartlist_create(); char *msg = NULL, *ans = NULL; int i; - (void) len; /* body is nul-terminated, so it's safe to ignore the length. */ + (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */ - questions = smartlist_create(); smartlist_split_string(questions, body, " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - answers = smartlist_create(); - unrecognized = smartlist_create(); - SMARTLIST_FOREACH(questions, const char *, q, - { - if (handle_getinfo_helper(conn, q, &ans) < 0) { - connection_write_str_to_buf("551 Internal error\r\n", conn); + SMARTLIST_FOREACH_BEGIN(questions, const char *, q) { + const char *errmsg = NULL; + if (handle_getinfo_helper(conn, q, &ans, &errmsg) < 0) { + if (!errmsg) + errmsg = "Internal error"; + connection_printf_to_buf(conn, "551 %s\r\n", errmsg); goto done; } if (!ans) { @@ -1944,7 +1992,7 @@ smartlist_add(answers, tor_strdup(q)); smartlist_add(answers, ans); } - }); + } SMARTLIST_FOREACH_END(q); if (smartlist_len(unrecognized)) { for (i=0; i < smartlist_len(unrecognized)-1; ++i) connection_printf_to_buf(conn, @@ -1975,14 +2023,10 @@ connection_write_str_to_buf("250 OK\r\n", conn); done: - if (answers) { - SMARTLIST_FOREACH(answers, char *, cp, tor_free(cp)); - smartlist_free(answers); - } - if (questions) { - SMARTLIST_FOREACH(questions, char *, cp, tor_free(cp)); - smartlist_free(questions); - } + SMARTLIST_FOREACH(answers, char *, cp, tor_free(cp)); + smartlist_free(answers); + SMARTLIST_FOREACH(questions, char *, cp, tor_free(cp)); + smartlist_free(questions); smartlist_free(unrecognized); tor_free(msg); @@ -1993,12 +2037,12 @@ static uint8_t circuit_purpose_from_string(const char *string) { - if (!strcmpstart(string, "purpose=")) + if (!strcasecmpstart(string, "purpose=")) string += strlen("purpose="); - if (!strcmp(string, "general")) + if (!strcasecmp(string, "general")) return CIRCUIT_PURPOSE_C_GENERAL; - else if (!strcmp(string, "controller")) + else if (!strcasecmp(string, "controller")) return CIRCUIT_PURPOSE_CONTROLLER; else return CIRCUIT_PURPOSE_UNKNOWN; @@ -2030,6 +2074,31 @@ return NULL; } +/** Helper. Return the first element of sl at index start_at or + * higher that starts with prefix, case-insensitive. Return NULL if no + * such element exists. */ +static const char * +find_element_starting_with(smartlist_t *sl, int start_at, const char *prefix) +{ + int i; + for (i = start_at; i < smartlist_len(sl); ++i) { + const char *elt = smartlist_get(sl, i); + if (!strcasecmpstart(elt, prefix)) + return elt; + } + return NULL; +} + +/** Helper. Return true iff s is an argument that we should treat as a + * key-value pair. */ +static int +is_keyval_pair(const char *s) +{ + /* An argument is a key-value pair if it has an =, and it isn't of the form + * $fingeprint=name */ + return strchr(s, '=') && s[0] != '$'; +} + /** Called when we get an EXTENDCIRCUIT message. Try to extend the listed * circuit, and report success or failure. */ static int @@ -2045,33 +2114,57 @@ router_nicknames = smartlist_create(); - args = getargs_helper("EXTENDCIRCUIT", conn, body, 2, -1); + args = getargs_helper("EXTENDCIRCUIT", conn, body, 1, -1); if (!args) goto done; zero_circ = !strcmp("0", (char*)smartlist_get(args,0)); - if (!zero_circ && !(circ = get_circ(smartlist_get(args,0)))) { - connection_printf_to_buf(conn, "552 Unknown circuit \"%s\"\r\n", - (char*)smartlist_get(args, 0)); - } - smartlist_split_string(router_nicknames, smartlist_get(args,1), ",", 0, 0); - if (zero_circ && smartlist_len(args)>2) { - char *purp = smartlist_get(args,2); - intended_purpose = circuit_purpose_from_string(purp); - if (intended_purpose == CIRCUIT_PURPOSE_UNKNOWN) { - connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", purp); + if (zero_circ) { + const char *purp = find_element_starting_with(args, 1, "PURPOSE="); + + if (purp) { + intended_purpose = circuit_purpose_from_string(purp); + if (intended_purpose == CIRCUIT_PURPOSE_UNKNOWN) { + connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", purp); + SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); + smartlist_free(args); + goto done; + } + } + + if ((smartlist_len(args) == 1) || + (smartlist_len(args) >= 2 && is_keyval_pair(smartlist_get(args, 1)))) { + // "EXTENDCIRCUIT 0" || EXTENDCIRCUIT 0 foo=bar" + circ = circuit_launch_by_router(intended_purpose, NULL, + CIRCLAUNCH_NEED_CAPACITY); + if (!circ) { + connection_write_str_to_buf("551 Couldn't start circuit\r\n", conn); + } else { + connection_printf_to_buf(conn, "250 EXTENDED %lu\r\n", + (unsigned long)circ->global_identifier); + } SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); smartlist_free(args); goto done; } + // "EXTENDCIRCUIT 0 router1,router2" || + // "EXTENDCIRCUIT 0 router1,router2 PURPOSE=foo" } - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - if (!zero_circ && !circ) { + + if (!zero_circ && !(circ = get_circ(smartlist_get(args,0)))) { + connection_printf_to_buf(conn, "552 Unknown circuit \"%s\"\r\n", + (char*)smartlist_get(args, 0)); + SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); + smartlist_free(args); goto done; } + smartlist_split_string(router_nicknames, smartlist_get(args,1), ",", 0, 0); + + SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); + smartlist_free(args); + routers = smartlist_create(); SMARTLIST_FOREACH(router_nicknames, const char *, n, { @@ -2129,8 +2222,7 @@ done: SMARTLIST_FOREACH(router_nicknames, char *, n, tor_free(n)); smartlist_free(router_nicknames); - if (routers) - smartlist_free(routers); + smartlist_free(routers); return 0; } @@ -2143,7 +2235,7 @@ origin_circuit_t *circ = NULL; uint8_t new_purpose; smartlist_t *args; - (void) len; /* body is nul-terminated, so it's safe to ignore the length. */ + (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */ args = getargs_helper("SETCIRCUITPURPOSE", conn, body, 2, -1); if (!args) @@ -2156,7 +2248,7 @@ } { - char *purp = smartlist_get(args,1); + const char *purp = find_element_starting_with(args,1,"PURPOSE="); new_purpose = circuit_purpose_from_string(purp); if (new_purpose == CIRCUIT_PURPOSE_UNKNOWN) { connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", purp); @@ -2167,7 +2259,7 @@ circ->_base.purpose = new_purpose; connection_write_str_to_buf("250 OK\r\n", conn); -done: + done: if (args) { SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); smartlist_free(args); @@ -2201,9 +2293,9 @@ } else if (!zero_circ && !(circ = get_circ(smartlist_get(args, 1)))) { connection_printf_to_buf(conn, "552 Unknown circuit \"%s\"\r\n", (char*)smartlist_get(args, 1)); - } else if (circ && smartlist_len(args) > 2) { - char *hopstring = smartlist_get(args, 2); - if (!strcasecmpstart(hopstring, "HOP=")) { + } else if (circ) { + const char *hopstring = find_element_starting_with(args,2,"HOP="); + if (hopstring) { hopstring += strlen("HOP="); hop = (int) tor_parse_ulong(hopstring, 10, 0, INT_MAX, &hop_line_ok, NULL); @@ -2231,7 +2323,7 @@ circuit_t *tmpcirc = circuit_get_by_edge_conn(ap_conn); connection_edge_end(ap_conn, END_STREAM_REASON_TIMEOUT); /* Un-mark it as ending, since we're going to reuse it. */ - ap_conn->_base.edge_has_sent_end = 0; + ap_conn->edge_has_sent_end = 0; ap_conn->end_reason = 0; if (tmpcirc) circuit_detach_stream(tmpcirc,ap_conn); @@ -2244,11 +2336,26 @@ conn); return 0; } + /* Is this a single hop circuit? */ if (circ && (circuit_get_cpath_len(circ)<2 || hop==1)) { - connection_write_str_to_buf( - "551 Can't attach stream to one-hop circuit.\r\n", conn); - return 0; + routerinfo_t *r = NULL; + char* exit_digest; + if (circ->build_state && + circ->build_state->chosen_exit && + !tor_digest_is_zero(circ->build_state->chosen_exit->identity_digest)) { + exit_digest = circ->build_state->chosen_exit->identity_digest; + r = router_get_by_digest(exit_digest); + } + /* Do both the client and relay allow one-hop exit circuits? */ + if (!r || !r->allow_single_hop_exits || + !get_options()->AllowSingleHopCircuits) { + connection_write_str_to_buf( + "551 Can't attach stream to this one-hop circuit.\r\n", conn); + return 0; + } + ap_conn->chosen_exit_name = tor_strdup(hex_str(exit_digest, DIGEST_LEN)); } + if (circ && hop>0) { /* find this hop in the circuit, and set cpath */ cpath = circuit_get_cpath_hop(circ, hop); @@ -2296,9 +2403,9 @@ } } else if (!strcasecmpstart(option, "cache=")) { option += strlen("cache="); - if (!strcmp(option, "no")) + if (!strcasecmp(option, "no")) cache = 0; - else if (!strcmp(option, "yes")) + else if (!strcasecmp(option, "yes")) cache = 1; else { connection_printf_to_buf(conn, "552 Unknown cache request \"%s\"\r\n", @@ -2472,7 +2579,7 @@ int is_reverse = 0; (void) len; /* body is nul-terminated; it's safe to ignore the length */ - if (!(conn->event_mask & (1L<event_mask & ((uint32_t)1L<use_long_names = 1; - control_update_global_event_mask(); - } - if (extended_events) - conn->use_extended_events = 1; send_control_done(conn); } @@ -2741,11 +2834,13 @@ if (last_idx+3 == conn->incoming_cmd_cur_len && !memcmp(conn->incoming_cmd + last_idx, ".\r\n", 3)) { /* Just appended ".\r\n"; we're done. Remove it. */ + conn->incoming_cmd[last_idx] = '\0'; conn->incoming_cmd_cur_len -= 3; break; } else if (last_idx+2 == conn->incoming_cmd_cur_len && !memcmp(conn->incoming_cmd + last_idx, ".\n", 2)) { /* Just appended ".\n"; we're done. Remove it. */ + conn->incoming_cmd[last_idx] = '\0'; conn->incoming_cmd_cur_len -= 2; break; } @@ -2768,10 +2863,16 @@ --data_len; } - /* Quit is always valid. */ + /* If the connection is already closing, ignore further commands */ + if (TO_CONN(conn)->marked_for_close) { + return 0; + } + + /* Otherwise, Quit is always valid. */ if (!strcasecmp(conn->incoming_cmd, "QUIT")) { connection_write_str_to_buf("250 closing connection\r\n", conn); connection_mark_for_close(TO_CONN(conn)); + conn->_base.hold_open_until_flushed = 1; return 0; } @@ -2798,6 +2899,9 @@ } else if (!strcasecmp(conn->incoming_cmd, "GETCONF")) { if (handle_control_getconf(conn, cmd_data_len, args)) return -1; + } else if (!strcasecmp(conn->incoming_cmd, "+LOADCONF")) { + if (handle_control_loadconf(conn, cmd_data_len, args)) + return -1; } else if (!strcasecmp(conn->incoming_cmd, "SETEVENTS")) { if (handle_control_setevents(conn, cmd_data_len, args)) return -1; @@ -2857,52 +2961,6 @@ goto again; } -/** Convert a numeric reason for destroying a circuit into a string for a - * CIRCUIT event. */ -static const char * -circuit_end_reason_to_string(int reason) -{ - if (reason >= 0 && reason & END_CIRC_REASON_FLAG_REMOTE) - reason &= ~END_CIRC_REASON_FLAG_REMOTE; - switch (reason) { - case END_CIRC_AT_ORIGIN: - /* This shouldn't get passed here; it's a catch-all reason. */ - return "ORIGIN"; - case END_CIRC_REASON_NONE: - /* This shouldn't get passed here; it's a catch-all reason. */ - return "NONE"; - case END_CIRC_REASON_TORPROTOCOL: - return "TORPROTOCOL"; - case END_CIRC_REASON_INTERNAL: - return "INTERNAL"; - case END_CIRC_REASON_REQUESTED: - return "REQUESTED"; - case END_CIRC_REASON_HIBERNATING: - return "HIBERNATING"; - case END_CIRC_REASON_RESOURCELIMIT: - return "RESOURCELIMIT"; - case END_CIRC_REASON_CONNECTFAILED: - return "CONNECTFAILED"; - case END_CIRC_REASON_OR_IDENTITY: - return "OR_IDENTITY"; - case END_CIRC_REASON_OR_CONN_CLOSED: - return "OR_CONN_CLOSED"; - case END_CIRC_REASON_FINISHED: - return "FINISHED"; - case END_CIRC_REASON_TIMEOUT: - return "TIMEOUT"; - case END_CIRC_REASON_DESTROYED: - return "DESTROYED"; - case END_CIRC_REASON_NOPATH: - return "NOPATH"; - case END_CIRC_REASON_NOSUCHSERVICE: - return "NOSUCHSERVICE"; - default: - log_warn(LD_BUG, "Unrecognized reason code %d", (int)reason); - return NULL; - } -} - /** Something has happened to circuit circ: tell any interested * control connections. */ int @@ -2910,16 +2968,12 @@ int reason_code) { const char *status; - char reason_buf[64]; + char extended_buf[96]; int providing_reason=0; - char *path=NULL; if (!EVENT_IS_INTERESTING(EVENT_CIRCUIT_STATUS)) return 0; tor_assert(circ); - if (EVENT_IS_INTERESTING1S(EVENT_CIRCUIT_STATUS)) - path = circuit_list_path(circ,0); - switch (tp) { case CIRC_EVENT_LAUNCHED: status = "LAUNCHED"; break; @@ -2932,9 +2986,13 @@ return 0; } + tor_snprintf(extended_buf, sizeof(extended_buf), "PURPOSE=%s", + circuit_purpose_to_controller_string(circ->_base.purpose)); + if (tp == CIRC_EVENT_FAILED || tp == CIRC_EVENT_CLOSED) { - const char *reason_str = circuit_end_reason_to_string(reason_code); + const char *reason_str = circuit_end_reason_to_control_string(reason_code); char *reason = NULL; + size_t n=strlen(extended_buf); providing_reason=1; if (!reason_str) { reason = tor_malloc(16); @@ -2942,46 +3000,25 @@ reason_str = reason; } if (reason_code > 0 && reason_code & END_CIRC_REASON_FLAG_REMOTE) { - tor_snprintf(reason_buf, sizeof(reason_buf), - "REASON=DESTROYED REMOTE_REASON=%s", reason_str); + tor_snprintf(extended_buf+n, sizeof(extended_buf)-n, + " REASON=DESTROYED REMOTE_REASON=%s", reason_str); } else { - tor_snprintf(reason_buf, sizeof(reason_buf), - "REASON=%s", reason_str); + tor_snprintf(extended_buf+n, sizeof(extended_buf)-n, + " REASON=%s", reason_str); } tor_free(reason); } - if (EVENT_IS_INTERESTING1S(EVENT_CIRCUIT_STATUS)) { - const char *sp = strlen(path) ? " " : ""; - if (providing_reason) - send_control_event_extended(EVENT_CIRCUIT_STATUS, SHORT_NAMES, - "650 CIRC %lu %s%s%s@%s\r\n", - (unsigned long)circ->global_identifier, - status, sp, path, reason_buf); - else - send_control_event_extended(EVENT_CIRCUIT_STATUS, SHORT_NAMES, - "650 CIRC %lu %s%s%s\r\n", - (unsigned long)circ->global_identifier, - status, sp, path); - } - if (EVENT_IS_INTERESTING1L(EVENT_CIRCUIT_STATUS)) { + { char *vpath = circuit_list_path_for_controller(circ); const char *sp = strlen(vpath) ? " " : ""; - if (providing_reason) - send_control_event_extended(EVENT_CIRCUIT_STATUS, LONG_NAMES, - "650 CIRC %lu %s%s%s@%s\r\n", - (unsigned long)circ->global_identifier, - status, sp, vpath, reason_buf); - else - send_control_event_extended(EVENT_CIRCUIT_STATUS, LONG_NAMES, - "650 CIRC %lu %s%s%s\r\n", - (unsigned long)circ->global_identifier, - status, sp, vpath); + send_control_event(EVENT_CIRCUIT_STATUS, ALL_FORMATS, + "650 CIRC %lu %s%s%s %s\r\n", + (unsigned long)circ->global_identifier, + status, sp, vpath, extended_buf); tor_free(vpath); } - tor_free(path); - return 0; } @@ -2996,6 +3033,8 @@ if (conn->chosen_exit_name) if (tor_snprintf(buf2, sizeof(buf2), ".%s.exit", conn->chosen_exit_name)<0) return -1; + if (!conn->socks_request) + return -1; if (tor_snprintf(buf, len, "%s%s%s:%d", conn->socks_request->address, conn->chosen_exit_name ? buf2 : "", @@ -3006,35 +3045,6 @@ return 0; } -/** Convert the reason for ending a stream reason into the format used - * in STREAM events. Return NULL if the reason is unrecognized. */ -static const char * -stream_end_reason_to_string(int reason) -{ - reason &= END_STREAM_REASON_MASK; - switch (reason) { - case END_STREAM_REASON_MISC: return "MISC"; - case END_STREAM_REASON_RESOLVEFAILED: return "RESOLVEFAILED"; - case END_STREAM_REASON_CONNECTREFUSED: return "CONNECTREFUSED"; - case END_STREAM_REASON_EXITPOLICY: return "EXITPOLICY"; - case END_STREAM_REASON_DESTROY: return "DESTROY"; - case END_STREAM_REASON_DONE: return "DONE"; - case END_STREAM_REASON_TIMEOUT: return "TIMEOUT"; - case END_STREAM_REASON_HIBERNATING: return "HIBERNATING"; - case END_STREAM_REASON_INTERNAL: return "INTERNAL"; - case END_STREAM_REASON_RESOURCELIMIT: return "RESOURCELIMIT"; - case END_STREAM_REASON_CONNRESET: return "CONNRESET"; - case END_STREAM_REASON_TORPROTOCOL: return "TORPROTOCOL"; - case END_STREAM_REASON_NOTDIRECTORY: return "NOTDIRECTORY"; - - case END_STREAM_REASON_CANT_ATTACH: return "CANT_ATTACH"; - case END_STREAM_REASON_NET_UNREACHABLE: return "NET_UNREACHABLE"; - case END_STREAM_REASON_SOCKSPROTOCOL: return "SOCKS_PROTOCOL"; - - default: return NULL; - } -} - /** Something has happened to the stream associated with AP connection * conn: tell any interested control connections. */ int @@ -3078,38 +3088,38 @@ if (reason_code && (tp == STREAM_EVENT_FAILED || tp == STREAM_EVENT_CLOSED || tp == STREAM_EVENT_FAILED_RETRIABLE)) { - const char *reason_str = stream_end_reason_to_string(reason_code); + const char *reason_str = stream_end_reason_to_control_string(reason_code); char *r = NULL; if (!reason_str) { r = tor_malloc(16); - tor_snprintf(r, 16, "UNKNOWN_%d", reason_code); + tor_snprintf(r, 16, " UNKNOWN_%d", reason_code); reason_str = r; } if (reason_code & END_STREAM_REASON_FLAG_REMOTE) tor_snprintf(reason_buf, sizeof(reason_buf), - "REASON=END REMOTE_REASON=%s", reason_str); + " REASON=END REMOTE_REASON=%s", reason_str); else tor_snprintf(reason_buf, sizeof(reason_buf), - "REASON=%s", reason_str); + " REASON=%s", reason_str); tor_free(r); } else if (reason_code && tp == STREAM_EVENT_REMAP) { switch (reason_code) { case REMAP_STREAM_SOURCE_CACHE: - strlcpy(reason_buf, "SOURCE=CACHE", sizeof(reason_buf)); + strlcpy(reason_buf, " SOURCE=CACHE", sizeof(reason_buf)); break; case REMAP_STREAM_SOURCE_EXIT: - strlcpy(reason_buf, "SOURCE=EXIT", sizeof(reason_buf)); + strlcpy(reason_buf, " SOURCE=EXIT", sizeof(reason_buf)); break; default: - tor_snprintf(reason_buf, sizeof(reason_buf), "REASON=UNKNOWN_%d", + tor_snprintf(reason_buf, sizeof(reason_buf), " REASON=UNKNOWN_%d", reason_code); + /* XXX do we want SOURCE=UNKNOWN_%d above instead? -RD */ break; } } if (tp == STREAM_EVENT_NEW) { - tor_snprintf(addrport_buf,sizeof(addrport_buf), "%sSOURCE_ADDR=%s:%d", - strlen(reason_buf) ? " " : "", + tor_snprintf(addrport_buf,sizeof(addrport_buf), " SOURCE_ADDR=%s:%d", TO_CONN(conn)->address, TO_CONN(conn)->port ); } else { addrport_buf[0] = '\0'; @@ -3138,8 +3148,8 @@ circ = circuit_get_by_edge_conn(conn); if (circ && CIRCUIT_IS_ORIGIN(circ)) origin_circ = TO_ORIGIN_CIRCUIT(circ); - send_control_event_extended(EVENT_STREAM_STATUS, ALL_NAMES, - "650 STREAM "U64_FORMAT" %s %lu %s@%s%s%s\r\n", + send_control_event(EVENT_STREAM_STATUS, ALL_FORMATS, + "650 STREAM "U64_FORMAT" %s %lu %s%s%s%s\r\n", U64_PRINTF_ARG(conn->_base.global_identifier), status, origin_circ? (unsigned long)origin_circ->global_identifier : 0ul, @@ -3152,85 +3162,21 @@ /** Figure out the best name for the target router of an OR connection * conn, and write it into the len-character buffer - * name. Use verbose names if long_names is set. */ + * name. */ static void -orconn_target_get_name(int long_names, - char *name, size_t len, or_connection_t *conn) +orconn_target_get_name(char *name, size_t len, or_connection_t *conn) { - if (! long_names) { - if (conn->nickname) - strlcpy(name, conn->nickname, len); - else - tor_snprintf(name, len, "%s:%d", - conn->_base.address, conn->_base.port); + routerinfo_t *ri = router_get_by_digest(conn->identity_digest); + if (ri) { + tor_assert(len > MAX_VERBOSE_NICKNAME_LEN); + router_get_verbose_nickname(name, ri); + } else if (! tor_digest_is_zero(conn->identity_digest)) { + name[0] = '$'; + base16_encode(name+1, len-1, conn->identity_digest, + DIGEST_LEN); } else { - routerinfo_t *ri = router_get_by_digest(conn->identity_digest); - if (ri) { - tor_assert(len > MAX_VERBOSE_NICKNAME_LEN); - router_get_verbose_nickname(name, ri); - } else if (! tor_digest_is_zero(conn->identity_digest)) { - name[0] = '$'; - base16_encode(name+1, len-1, conn->identity_digest, - DIGEST_LEN); - } else { - tor_snprintf(name, len, "%s:%d", - conn->_base.address, conn->_base.port); - } - } -} - -/** Convert a TOR_TLS_* error code into an END_OR_CONN_* reason. */ -int -control_tls_error_to_reason(int e) -{ - switch (e) { - case TOR_TLS_ERROR_IO: - return END_OR_CONN_REASON_TLS_IO_ERROR; - case TOR_TLS_ERROR_CONNREFUSED: - return END_OR_CONN_REASON_TCP_REFUSED; - case TOR_TLS_ERROR_CONNRESET: - return END_OR_CONN_REASON_TLS_CONNRESET; - case TOR_TLS_ERROR_NO_ROUTE: - return END_OR_CONN_REASON_TLS_NO_ROUTE; - case TOR_TLS_ERROR_TIMEOUT: - return END_OR_CONN_REASON_TLS_TIMEOUT; - case TOR_TLS_WANTREAD: - case TOR_TLS_WANTWRITE: - case TOR_TLS_CLOSE: - case TOR_TLS_DONE: - return END_OR_CONN_REASON_DONE; - default: - return END_OR_CONN_REASON_TLS_MISC; - } -} - -/** Convert the reason for ending an OR connection r into the format - * used in ORCONN events. Return NULL if the reason is unrecognized. */ -static const char * -or_conn_end_reason_to_string(int r) -{ - switch (r) { - case END_OR_CONN_REASON_DONE: - return "REASON=DONE"; - case END_OR_CONN_REASON_TCP_REFUSED: - return "REASON=CONNECTREFUSED"; - case END_OR_CONN_REASON_OR_IDENTITY: - return "REASON=IDENTITY"; - case END_OR_CONN_REASON_TLS_CONNRESET: - return "REASON=CONNECTRESET"; - case END_OR_CONN_REASON_TLS_TIMEOUT: - return "REASON=TIMEOUT"; - case END_OR_CONN_REASON_TLS_NO_ROUTE: - return "REASON=NOROUTE"; - case END_OR_CONN_REASON_TLS_IO_ERROR: - return "REASON=IOERROR"; - case END_OR_CONN_REASON_TLS_MISC: - return "REASON=MISC"; - case 0: - return ""; - default: - log_warn(LD_BUG, "Unrecognized or_conn reason code %d", r); - return "REASON=BOGUS"; + tor_snprintf(name, len, "%s:%d", + conn->_base.address, conn->_base.port); } } @@ -3269,19 +3215,34 @@ reason ? " " : "", ncircs); } - if (EVENT_IS_INTERESTING1S(EVENT_OR_CONN_STATUS)) { - orconn_target_get_name(0, name, sizeof(name), conn); - send_control_event_extended(EVENT_OR_CONN_STATUS, SHORT_NAMES, - "650 ORCONN %s %s@%s%s\r\n", - name, status, - or_conn_end_reason_to_string(reason), ncircs_buf); - } - if (EVENT_IS_INTERESTING1L(EVENT_OR_CONN_STATUS)) { - orconn_target_get_name(1, name, sizeof(name), conn); - send_control_event_extended(EVENT_OR_CONN_STATUS, LONG_NAMES, - "650 ORCONN %s %s@%s%s\r\n", - name, status, - or_conn_end_reason_to_string(reason), ncircs_buf); + orconn_target_get_name(name, sizeof(name), conn); + send_control_event(EVENT_OR_CONN_STATUS, ALL_FORMATS, + "650 ORCONN %s %s %s%s%s\r\n", + name, status, + reason ? "REASON=" : "", + orconn_end_reason_to_control_string(reason), + ncircs_buf); + + return 0; +} + +/** + * Print out STREAM_BW event for a single conn + */ +int +control_event_stream_bandwidth(edge_connection_t *edge_conn) +{ + if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) { + if (!edge_conn->n_read && !edge_conn->n_written) + return 0; + + send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_FORMATS, + "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n", + U64_PRINTF_ARG(edge_conn->_base.global_identifier), + (unsigned long)edge_conn->n_read, + (unsigned long)edge_conn->n_written); + + edge_conn->n_written = edge_conn->n_read = 0; } return 0; @@ -3296,21 +3257,23 @@ smartlist_t *conns = get_connection_array(); edge_connection_t *edge_conn; - SMARTLIST_FOREACH(conns, connection_t *, conn, { + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) + { if (conn->type != CONN_TYPE_AP) continue; edge_conn = TO_EDGE_CONN(conn); if (!edge_conn->n_read && !edge_conn->n_written) continue; - send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_NAMES, - "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n", - U64_PRINTF_ARG(edge_conn->_base.global_identifier), - (unsigned long)edge_conn->n_read, - (unsigned long)edge_conn->n_written); + send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_FORMATS, + "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n", + U64_PRINTF_ARG(edge_conn->_base.global_identifier), + (unsigned long)edge_conn->n_read, + (unsigned long)edge_conn->n_written); edge_conn->n_written = edge_conn->n_read = 0; - }); + } + SMARTLIST_FOREACH_END(conn); } return 0; @@ -3322,10 +3285,10 @@ control_event_bandwidth_used(uint32_t n_read, uint32_t n_written) { if (EVENT_IS_INTERESTING(EVENT_BANDWIDTH_USED)) { - send_control_event(EVENT_BANDWIDTH_USED, ALL_NAMES, - "650 BW %lu %lu\r\n", - (unsigned long)n_read, - (unsigned long)n_written); + send_control_event(EVENT_BANDWIDTH_USED, ALL_FORMATS, + "650 BW %lu %lu\r\n", + (unsigned long)n_read, + (unsigned long)n_written); } return 0; @@ -3355,6 +3318,11 @@ { int event; + /* Don't even think of trying to add stuff to a buffer from a cpuworker + * thread. */ + if (! in_main_thread()) + return; + if (disable_log_messages) return; @@ -3387,7 +3355,7 @@ default: s = "UnknownLogSeverity"; break; } ++disable_log_messages; - send_control_event(event, ALL_NAMES, "650 %s %s\r\n", s, b?b:msg); + send_control_event(event, ALL_FORMATS, "650 %s %s\r\n", s, b?b:msg); --disable_log_messages; tor_free(b); } @@ -3400,31 +3368,12 @@ int control_event_descriptors_changed(smartlist_t *routers) { - size_t len; char *msg; - smartlist_t *identities = NULL; - char buf[HEX_DIGEST_LEN+1]; if (!EVENT_IS_INTERESTING(EVENT_NEW_DESC)) return 0; - if (EVENT_IS_INTERESTING1S(EVENT_NEW_DESC)) { - identities = smartlist_create(); - SMARTLIST_FOREACH(routers, routerinfo_t *, r, - { - base16_encode(buf,sizeof(buf),r->cache_info.identity_digest,DIGEST_LEN); - smartlist_add(identities, tor_strdup(buf)); - }); - } - if (EVENT_IS_INTERESTING1S(EVENT_NEW_DESC)) { - char *ids = smartlist_join_strings(identities, " ", 0, &len); - size_t ids_len = strlen(ids)+32; - msg = tor_malloc(ids_len); - tor_snprintf(msg, ids_len, "650 NEWDESC %s\r\n", ids); - send_control_event_string(EVENT_NEW_DESC, SHORT_NAMES|ALL_FORMATS, msg); - tor_free(ids); - tor_free(msg); - } - if (EVENT_IS_INTERESTING1L(EVENT_NEW_DESC)) { + + { smartlist_t *names = smartlist_create(); char *ids; size_t names_len; @@ -3437,20 +3386,16 @@ names_len = strlen(ids)+32; msg = tor_malloc(names_len); tor_snprintf(msg, names_len, "650 NEWDESC %s\r\n", ids); - send_control_event_string(EVENT_NEW_DESC, LONG_NAMES|ALL_FORMATS, msg); + send_control_event_string(EVENT_NEW_DESC, ALL_FORMATS, msg); tor_free(ids); tor_free(msg); SMARTLIST_FOREACH(names, char *, cp, tor_free(cp)); smartlist_free(names); } - if (identities) { - SMARTLIST_FOREACH(identities, char *, cp, tor_free(cp)); - smartlist_free(identities); - } return 0; } -/** Called whenever an address mapping on from from changes to to. +/** Called when an address mapping on from from changes to to. * expires values less than 3 are special; see connection_edge.c. If * error is non-NULL, it is an error code describing the failure * mode of the mapping. @@ -3463,17 +3408,17 @@ return 0; if (expires < 3 || expires == TIME_MAX) - send_control_event_extended(EVENT_ADDRMAP, ALL_NAMES, - "650 ADDRMAP %s %s NEVER@%s\r\n", from, to, + send_control_event(EVENT_ADDRMAP, ALL_FORMATS, + "650 ADDRMAP %s %s NEVER %s\r\n", from, to, error?error:""); else { char buf[ISO_TIME_LEN+1]; char buf2[ISO_TIME_LEN+1]; format_local_iso_time(buf,expires); format_iso_time(buf2,expires); - send_control_event_extended(EVENT_ADDRMAP, ALL_NAMES, + send_control_event(EVENT_ADDRMAP, ALL_FORMATS, "650 ADDRMAP %s %s \"%s\"" - "@%s%sEXPIRES=\"%s\"\r\n", + " %s%sEXPIRES=\"%s\"\r\n", from, to, buf, error?error:"", error?" ":"", buf2); @@ -3513,9 +3458,9 @@ buf = tor_malloc(totallen); strlcpy(buf, firstline, totallen); strlcpy(buf+strlen(firstline), esc, totallen); - send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_NAMES|ALL_FORMATS, + send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_FORMATS, buf); - send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_NAMES|ALL_FORMATS, + send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_FORMATS, "650 OK\r\n"); tor_free(esc); tor_free(buf); @@ -3523,18 +3468,24 @@ return 0; } -/** Called when the routerstatus_ts statuses have changed: sends - * an NS event to any controller that cares. */ -int -control_event_networkstatus_changed(smartlist_t *statuses) +/** Helper function for NS-style events. Constructs and sends an event + * of type event with string event_string out of the set of + * networkstatuses statuses. Currently it is used for NS events + * and NEWCONSENSUS events. */ +static int +control_event_networkstatus_changed_helper(smartlist_t *statuses, + uint16_t event, + const char *event_string) { smartlist_t *strs; char *s, *esc = NULL; - if (!EVENT_IS_INTERESTING(EVENT_NS) || !smartlist_len(statuses)) + if (!EVENT_IS_INTERESTING(event) || !smartlist_len(statuses)) return 0; strs = smartlist_create(); - smartlist_add(strs, tor_strdup("650+NS\r\n")); + smartlist_add(strs, tor_strdup("650+")); + smartlist_add(strs, tor_strdup(event_string)); + smartlist_add(strs, tor_strdup("\r\n")); SMARTLIST_FOREACH(statuses, routerstatus_t *, rs, { s = networkstatus_getinfo_helper_single(rs); @@ -3547,16 +3498,84 @@ SMARTLIST_FOREACH(strs, char *, cp, tor_free(cp)); smartlist_free(strs); tor_free(s); - send_control_event_string(EVENT_NS, ALL_NAMES|ALL_FORMATS, esc); - send_control_event_string(EVENT_NS, ALL_NAMES|ALL_FORMATS, + send_control_event_string(event, ALL_FORMATS, esc); + send_control_event_string(event, ALL_FORMATS, "650 OK\r\n"); tor_free(esc); return 0; } +/** Called when the routerstatus_ts statuses have changed: sends + * an NS event to any controller that cares. */ +int +control_event_networkstatus_changed(smartlist_t *statuses) +{ + return control_event_networkstatus_changed_helper(statuses, EVENT_NS, "NS"); +} + +/** Called when we get a new consensus networkstatus. Sends a NEWCONSENSUS + * event consisting of an NS-style line for each relay in the consensus. */ +int +control_event_newconsensus(const networkstatus_t *consensus) +{ + if (!control_event_is_interesting(EVENT_NEWCONSENSUS)) + return 0; + return control_event_networkstatus_changed_helper( + consensus->routerstatus_list, EVENT_NEWCONSENSUS, "NEWCONSENSUS"); +} + +/** Called when we compute a new circuitbuildtimeout */ +int +control_event_buildtimeout_set(const circuit_build_times_t *cbt, + buildtimeout_set_event_t type) +{ + const char *type_string = NULL; + double qnt = circuit_build_times_quantile_cutoff(); + + if (!control_event_is_interesting(EVENT_BUILDTIMEOUT_SET)) + return 0; + + switch (type) { + case BUILDTIMEOUT_SET_EVENT_COMPUTED: + type_string = "COMPUTED"; + break; + case BUILDTIMEOUT_SET_EVENT_RESET: + type_string = "RESET"; + qnt = 1.0; + break; + case BUILDTIMEOUT_SET_EVENT_SUSPENDED: + type_string = "SUSPENDED"; + qnt = 1.0; + break; + case BUILDTIMEOUT_SET_EVENT_DISCARD: + type_string = "DISCARD"; + qnt = 1.0; + break; + case BUILDTIMEOUT_SET_EVENT_RESUME: + type_string = "RESUME"; + break; + default: + type_string = "UNKNOWN"; + break; + } + + send_control_event(EVENT_BUILDTIMEOUT_SET, ALL_FORMATS, + "650 BUILDTIMEOUT_SET %s TOTAL_TIMES=%lu " + "TIMEOUT_MS=%lu XM=%lu ALPHA=%lf CUTOFF_QUANTILE=%lf " + "TIMEOUT_RATE=%lf CLOSE_MS=%lu CLOSE_RATE=%lf\r\n", + type_string, (unsigned long)cbt->total_build_times, + (unsigned long)cbt->timeout_ms, + (unsigned long)cbt->Xm, cbt->alpha, qnt, + circuit_build_times_timeout_rate(cbt), + (unsigned long)cbt->close_ms, + circuit_build_times_close_rate(cbt)); + + return 0; +} + /** Called when a single local_routerstatus_t has changed: Sends an NS event - * to any countroller that cares. */ + * to any controller that cares. */ int control_event_networkstatus_changed_single(routerstatus_t *rs) { @@ -3578,7 +3597,7 @@ int control_event_my_descriptor_changed(void) { - send_control_event(EVENT_DESCCHANGED, ALL_NAMES, "650 DESCCHANGED\r\n"); + send_control_event(EVENT_DESCCHANGED, ALL_FORMATS, "650 DESCCHANGED\r\n"); return 0; } @@ -3626,7 +3645,7 @@ return -1; } - send_control_event_impl(type, ALL_NAMES|ALL_FORMATS, 0, format_buf, args); + send_control_event_impl(type, ALL_FORMATS, format_buf, args); return 0; } @@ -3690,7 +3709,7 @@ if (!EVENT_IS_INTERESTING(EVENT_GUARD)) return 0; - if (EVENT_IS_INTERESTING1L(EVENT_GUARD)) { + { char buf[MAX_VERBOSE_NICKNAME_LEN+1]; routerinfo_t *ri = router_get_by_digest(digest); if (ri) { @@ -3698,12 +3717,8 @@ } else { tor_snprintf(buf, sizeof(buf), "$%s~%s", hbuf, nickname); } - send_control_event(EVENT_GUARD, LONG_NAMES, - "650 GUARD ENTRY %s %s\r\n", buf, status); - } - if (EVENT_IS_INTERESTING1S(EVENT_GUARD)) { - send_control_event(EVENT_GUARD, SHORT_NAMES, - "650 GUARD ENTRY $%s %s\r\n", hbuf, status); + send_control_event(EVENT_GUARD, ALL_FORMATS, + "650 GUARD ENTRY %s %s\r\n", buf, status); } return 0; } @@ -3761,3 +3776,203 @@ return 0; } +/** Convert the name of a bootstrapping phase s into strings + * tag and summary suitable for display by the controller. */ +static int +bootstrap_status_to_string(bootstrap_status_t s, const char **tag, + const char **summary) +{ + switch (s) { + case BOOTSTRAP_STATUS_UNDEF: + *tag = "undef"; + *summary = "Undefined"; + break; + case BOOTSTRAP_STATUS_STARTING: + *tag = "starting"; + *summary = "Starting"; + break; + case BOOTSTRAP_STATUS_CONN_DIR: + *tag = "conn_dir"; + *summary = "Connecting to directory server"; + break; + case BOOTSTRAP_STATUS_HANDSHAKE: + *tag = "status_handshake"; + *summary = "Finishing handshake"; + break; + case BOOTSTRAP_STATUS_HANDSHAKE_DIR: + *tag = "handshake_dir"; + *summary = "Finishing handshake with directory server"; + break; + case BOOTSTRAP_STATUS_ONEHOP_CREATE: + *tag = "onehop_create"; + *summary = "Establishing an encrypted directory connection"; + break; + case BOOTSTRAP_STATUS_REQUESTING_STATUS: + *tag = "requesting_status"; + *summary = "Asking for networkstatus consensus"; + break; + case BOOTSTRAP_STATUS_LOADING_STATUS: + *tag = "loading_status"; + *summary = "Loading networkstatus consensus"; + break; + case BOOTSTRAP_STATUS_LOADING_KEYS: + *tag = "loading_keys"; + *summary = "Loading authority key certs"; + break; + case BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS: + *tag = "requesting_descriptors"; + *summary = "Asking for relay descriptors"; + break; + case BOOTSTRAP_STATUS_LOADING_DESCRIPTORS: + *tag = "loading_descriptors"; + *summary = "Loading relay descriptors"; + break; + case BOOTSTRAP_STATUS_CONN_OR: + *tag = "conn_or"; + *summary = "Connecting to the Tor network"; + break; + case BOOTSTRAP_STATUS_HANDSHAKE_OR: + *tag = "handshake_or"; + *summary = "Finishing handshake with first hop"; + break; + case BOOTSTRAP_STATUS_CIRCUIT_CREATE: + *tag = "circuit_create"; + *summary = "Establishing a Tor circuit"; + break; + case BOOTSTRAP_STATUS_DONE: + *tag = "done"; + *summary = "Done"; + break; + default: +// log_warn(LD_BUG, "Unrecognized bootstrap status code %d", s); + *tag = *summary = "unknown"; + return -1; + } + return 0; +} + +/** What percentage through the bootstrap process are we? We remember + * this so we can avoid sending redundant bootstrap status events, and + * so we can guess context for the bootstrap messages which are + * ambiguous. It starts at 'undef', but gets set to 'starting' while + * Tor initializes. */ +static int bootstrap_percent = BOOTSTRAP_STATUS_UNDEF; + +/** How many problems have we had getting to the next bootstrapping phase? + * These include failure to establish a connection to a Tor relay, + * failures to finish the TLS handshake, failures to validate the + * consensus document, etc. */ +static int bootstrap_problems = 0; + +/* We only tell the controller once we've hit a threshold of problems + * for the current phase. */ +#define BOOTSTRAP_PROBLEM_THRESHOLD 10 + +/** Called when Tor has made progress at bootstrapping its directory + * information and initial circuits. + * + * status is the new status, that is, what task we will be doing + * next. percent is zero if we just started this task, else it + * represents progress on the task. */ +void +control_event_bootstrap(bootstrap_status_t status, int progress) +{ + const char *tag, *summary; + char buf[BOOTSTRAP_MSG_LEN]; + + if (bootstrap_percent == BOOTSTRAP_STATUS_DONE) + return; /* already bootstrapped; nothing to be done here. */ + + /* special case for handshaking status, since our TLS handshaking code + * can't distinguish what the connection is going to be for. */ + if (status == BOOTSTRAP_STATUS_HANDSHAKE) { + if (bootstrap_percent < BOOTSTRAP_STATUS_CONN_OR) { + status = BOOTSTRAP_STATUS_HANDSHAKE_DIR; + } else { + status = BOOTSTRAP_STATUS_HANDSHAKE_OR; + } + } + + if (status > bootstrap_percent || + (progress && progress > bootstrap_percent)) { + bootstrap_status_to_string(status, &tag, &summary); + log(status ? LOG_NOTICE : LOG_INFO, LD_CONTROL, + "Bootstrapped %d%%: %s.", progress ? progress : status, summary); + tor_snprintf(buf, sizeof(buf), + "BOOTSTRAP PROGRESS=%d TAG=%s SUMMARY=\"%s\"", + progress ? progress : status, tag, summary); + tor_snprintf(last_sent_bootstrap_message, + sizeof(last_sent_bootstrap_message), + "NOTICE %s", buf); + control_event_client_status(LOG_NOTICE, "%s", buf); + if (status > bootstrap_percent) { + bootstrap_percent = status; /* new milestone reached */ + } + if (progress > bootstrap_percent) { + /* incremental progress within a milestone */ + bootstrap_percent = progress; + bootstrap_problems = 0; /* Progress! Reset our problem counter. */ + } + } +} + +/** Called when Tor has failed to make bootstrapping progress in a way + * that indicates a problem. warn gives a hint as to why, and + * reason provides an "or_conn_end_reason" tag. + */ +void +control_event_bootstrap_problem(const char *warn, int reason) +{ + int status = bootstrap_percent; + const char *tag, *summary; + char buf[BOOTSTRAP_MSG_LEN]; + const char *recommendation = "ignore"; + + if (bootstrap_percent == 100) + return; /* already bootstrapped; nothing to be done here. */ + + bootstrap_problems++; + + if (bootstrap_problems >= BOOTSTRAP_PROBLEM_THRESHOLD) + recommendation = "warn"; + + if (reason == END_OR_CONN_REASON_NO_ROUTE) + recommendation = "warn"; + + if (get_options()->UseBridges && + !any_bridge_descriptors_known() && + !any_pending_bridge_descriptor_fetches()) + recommendation = "warn"; + + while (status>=0 && bootstrap_status_to_string(status, &tag, &summary) < 0) + status--; /* find a recognized status string based on current progress */ + status = bootstrap_percent; /* set status back to the actual number */ + + log_fn(!strcmp(recommendation, "warn") ? LOG_WARN : LOG_INFO, + LD_CONTROL, "Problem bootstrapping. Stuck at %d%%: %s. (%s; %s; " + "count %d; recommendation %s)", + status, summary, warn, + orconn_end_reason_to_control_string(reason), + bootstrap_problems, recommendation); + tor_snprintf(buf, sizeof(buf), + "BOOTSTRAP PROGRESS=%d TAG=%s SUMMARY=\"%s\" WARNING=\"%s\" REASON=%s " + "COUNT=%d RECOMMENDATION=%s", + bootstrap_percent, tag, summary, warn, + orconn_end_reason_to_control_string(reason), bootstrap_problems, + recommendation); + tor_snprintf(last_sent_bootstrap_message, + sizeof(last_sent_bootstrap_message), + "WARN %s", buf); + control_event_client_status(LOG_WARN, "%s", buf); +} + +/** We just generated a new summary of which countries we've seen clients + * from recently. Send a copy to the controller in case it wants to + * display it for the user. */ +void +control_event_clients_seen(const char *controller_str) +{ + send_control_event(EVENT_CLIENTS_SEEN, 0, + "650 CLIENTS_SEEN %s\r\n", controller_str); +} + diff -Nru tor-0.2.0.34/src/or/control.h tor-0.2.2.16-alpha/src/or/control.h --- tor-0.2.0.34/src/or/control.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/control.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,85 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file control.h + * \brief Header file for control.c. + **/ + +#ifndef _TOR_CONTROL_H +#define _TOR_CONTROL_H + +void control_update_global_event_mask(void); +void control_adjust_event_log_severity(void); + +/** Log information about the connection conn, protecting it as with + * CONN_LOG_PROTECT. Example: + * + * LOG_FN_CONN(conn, (LOG_DEBUG, "Socket %d wants to write", conn->s)); + **/ +#define LOG_FN_CONN(conn, args) \ + CONN_LOG_PROTECT(conn, log_fn args) + +int connection_control_finished_flushing(control_connection_t *conn); +int connection_control_reached_eof(control_connection_t *conn); +int connection_control_process_inbuf(control_connection_t *conn); + +#define EVENT_AUTHDIR_NEWDESCS 0x000D +#define EVENT_NS 0x000F +int control_event_is_interesting(int event); + +int control_event_circuit_status(origin_circuit_t *circ, + circuit_status_event_t e, int reason); +int control_event_stream_status(edge_connection_t *conn, + stream_status_event_t e, + int reason); +int control_event_or_conn_status(or_connection_t *conn, + or_conn_status_event_t e, int reason); +int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written); +int control_event_stream_bandwidth(edge_connection_t *edge_conn); +int control_event_stream_bandwidth_used(void); +void control_event_logmsg(int severity, unsigned int domain, const char *msg); +int control_event_descriptors_changed(smartlist_t *routers); +int control_event_address_mapped(const char *from, const char *to, + time_t expires, const char *error); +int control_event_or_authdir_new_descriptor(const char *action, + const char *desc, + size_t desclen, + const char *msg); +int control_event_my_descriptor_changed(void); +int control_event_networkstatus_changed(smartlist_t *statuses); + +int control_event_newconsensus(const networkstatus_t *consensus); +int control_event_networkstatus_changed_single(routerstatus_t *rs); +int control_event_general_status(int severity, const char *format, ...) + CHECK_PRINTF(2,3); +int control_event_client_status(int severity, const char *format, ...) + CHECK_PRINTF(2,3); +int control_event_server_status(int severity, const char *format, ...) + CHECK_PRINTF(2,3); +int control_event_guard(const char *nickname, const char *digest, + const char *status); +int control_event_buildtimeout_set(const circuit_build_times_t *cbt, + buildtimeout_set_event_t type); + +int init_cookie_authentication(int enabled); +smartlist_t *decode_hashed_passwords(config_line_t *passwords); +void disable_control_logging(void); +void enable_control_logging(void); + +void control_event_bootstrap(bootstrap_status_t status, int progress); +void control_event_bootstrap_problem(const char *warn, int reason); + +void control_event_clients_seen(const char *controller_str); + +#ifdef CONTROL_PRIVATE +/* Used only by control.c and test.c */ +size_t write_escaped_data(const char *data, size_t len, char **out); +size_t read_escaped_data(const char *data, size_t len, char **out); +#endif + +#endif + diff -Nru tor-0.2.0.34/src/or/cpuworker.c tor-0.2.2.16-alpha/src/or/cpuworker.c --- tor-0.2.0.34/src/or/cpuworker.c 2009-01-06 19:07:31.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/cpuworker.c 2010-08-18 23:04:46.000000000 +0000 @@ -1,10 +1,7 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: cpuworker.c 17972 2009-01-06 19:07:30Z arma $ */ -const char cpuworker_c_id[] = - "$Id: cpuworker.c 17972 2009-01-06 19:07:30Z arma $"; /** * \file cpuworker.c @@ -16,6 +13,15 @@ **/ #include "or.h" +#include "buffers.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "config.h" +#include "connection.h" +#include "cpuworker.h" +#include "main.h" +#include "onion.h" +#include "router.h" /** The maximum number of cpuworker processes we will keep around. */ #define MAX_CPUWORKERS 16 @@ -63,19 +69,20 @@ /** Pack global_id and circ_id; set *tag to the result. (See note on * cpuworker_main for wire format.) */ static void -tag_pack(char *tag, uint64_t conn_id, uint16_t circ_id) +tag_pack(char *tag, uint64_t conn_id, circid_t circ_id) { - *(uint64_t*)tag = conn_id; - *(uint16_t*)(tag+8) = circ_id; + /*XXXX RETHINK THIS WHOLE MESS !!!! !NM NM NM NM*/ + set_uint64(tag, conn_id); + set_uint16(tag+8, circ_id); } /** Unpack tag into addr, port, and circ_id. */ static void -tag_unpack(const char *tag, uint64_t *conn_id, uint16_t *circ_id) +tag_unpack(const char *tag, uint64_t *conn_id, circid_t *circ_id) { - *conn_id = *(const uint64_t *)tag; - *circ_id = *(const uint16_t *)(tag+8); + *conn_id = get_uint64(tag); + *circ_id = get_uint16(tag+8); } /** Called when the onion key has changed and we need to spawn new @@ -126,7 +133,7 @@ char success; char buf[LEN_ONION_RESPONSE]; uint64_t conn_id; - uint16_t circ_id; + circid_t circ_id; connection_t *tmp_conn; or_connection_t *p_conn = NULL; circuit_t *circ; @@ -185,7 +192,7 @@ tor_assert(0); /* don't ask me to do handshakes yet */ } -done_processing: + done_processing: conn->state = CPUWORKER_STATE_IDLE; num_cpuworkers_busy--; if (conn->timestamp_created < last_rotation_time) { @@ -446,8 +453,10 @@ if (1) { if (num_cpuworkers_busy == num_cpuworkers) { log_debug(LD_OR,"No idle cpuworkers. Queuing."); - if (onion_pending_add(circ, onionskin) < 0) + if (onion_pending_add(circ, onionskin) < 0) { + tor_free(onionskin); return -1; + } return 0; } diff -Nru tor-0.2.0.34/src/or/cpuworker.h tor-0.2.2.16-alpha/src/or/cpuworker.h --- tor-0.2.0.34/src/or/cpuworker.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/cpuworker.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,25 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file cpuworker.h + * \brief Header file for cpuworker.c. + **/ + +#ifndef _TOR_CPUWORKER_H +#define _TOR_CPUWORKER_H + +void cpu_init(void); +void cpuworkers_rotate(void); +int connection_cpu_finished_flushing(connection_t *conn); +int connection_cpu_reached_eof(connection_t *conn); +int connection_cpu_process_inbuf(connection_t *conn); +int assign_onionskin_to_cpuworker(connection_t *cpuworker, + or_circuit_t *circ, + char *onionskin); + +#endif + diff -Nru tor-0.2.0.34/src/or/directory.c tor-0.2.2.16-alpha/src/or/directory.c --- tor-0.2.0.34/src/or/directory.c 2009-01-06 16:14:14.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/directory.c 2010-09-17 01:30:36.000000000 +0000 @@ -1,12 +1,29 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: directory.c 17961 2009-01-06 16:14:13Z arma $ */ -const char directory_c_id[] = - "$Id: directory.c 17961 2009-01-06 16:14:13Z arma $"; #include "or.h" +#include "buffers.h" +#include "circuitbuild.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "control.h" +#include "directory.h" +#include "dirserv.h" +#include "dirvote.h" +#include "geoip.h" +#include "main.h" +#include "networkstatus.h" +#include "policies.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" + #if defined(EXPORTMALLINFO) && defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) #ifndef OPENBSD #include @@ -39,6 +56,7 @@ static void directory_send_command(dir_connection_t *conn, int purpose, int direct, const char *resource, const char *payload, size_t payload_len, + int supports_conditional_consensus, time_t if_modified_since); static int directory_handle_command(dir_connection_t *conn); static int body_is_plausible(const char *body, size_t body_len, int purpose); @@ -49,8 +67,10 @@ static void connection_dir_download_networkstatus_failed( dir_connection_t *conn, int status_code); static void connection_dir_download_routerdesc_failed(dir_connection_t *conn); +static void connection_dir_bridge_routerdesc_failed(dir_connection_t *conn); static void connection_dir_download_cert_failed( dir_connection_t *conn, int status_code); +static void connection_dir_retry_bridges(smartlist_t *descs); static void dir_networkstatus_download_failed(smartlist_t *failed, int status_code); static void dir_routerdesc_download_failed(smartlist_t *failed, @@ -58,7 +78,24 @@ int router_purpose, int was_extrainfo, int was_descriptor_digests); -static void note_request(const char *key, size_t bytes); +static void note_client_request(int purpose, int compressed, size_t bytes); +static int client_likes_consensus(networkstatus_t *v, const char *want_url); + +static void directory_initiate_command_rend(const char *address, + const tor_addr_t *addr, + uint16_t or_port, + uint16_t dir_port, + int supports_conditional_consensus, + int supports_begindir, + const char *digest, + uint8_t dir_purpose, + uint8_t router_purpose, + int anonymized_connection, + const char *resource, + const char *payload, + size_t payload_len, + time_t if_modified_since, + const rend_data_t *rend_query); /********* START VARIABLES **********/ @@ -72,15 +109,18 @@ * kind of document we serve? */ #define FULL_DIR_CACHE_LIFETIME (60*60) #define RUNNINGROUTERS_CACHE_LIFETIME (20*60) +#define DIRPORTFRONTPAGE_CACHE_LIFETIME (20*60) #define NETWORKSTATUS_CACHE_LIFETIME (5*60) #define ROUTERDESC_CACHE_LIFETIME (30*60) #define ROUTERDESC_BY_DIGEST_CACHE_LIFETIME (48*60*60) #define ROBOTS_CACHE_LIFETIME (24*60*60) +#define MICRODESC_CACHE_LIFETIME (48*60*60) /********* END VARIABLES ************/ -/** Return true iff the directory purpose 'purpose' must use an - * anonymous connection to a directory. */ +/** Return true iff the directory purpose dir_purpose (and if it's + * fetching descriptors, it's fetching them for router_purpose) + * must use an anonymous connection to a directory. */ static int purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose) { @@ -88,12 +128,10 @@ return 1; if (router_purpose == ROUTER_PURPOSE_BRIDGE && has_completed_circuit) return 1; /* if no circuits yet, we may need this info to bootstrap. */ - if (dir_purpose == DIR_PURPOSE_FETCH_DIR || - dir_purpose == DIR_PURPOSE_UPLOAD_DIR || + if (dir_purpose == DIR_PURPOSE_UPLOAD_DIR || dir_purpose == DIR_PURPOSE_UPLOAD_VOTE || dir_purpose == DIR_PURPOSE_UPLOAD_SIGNATURES || - dir_purpose == DIR_PURPOSE_FETCH_RUNNING_LIST || - dir_purpose == DIR_PURPOSE_FETCH_NETWORKSTATUS || + dir_purpose == DIR_PURPOSE_FETCH_V2_NETWORKSTATUS || dir_purpose == DIR_PURPOSE_FETCH_STATUS_VOTE || dir_purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES || dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS || @@ -114,6 +152,8 @@ smartlist_add(lst, (void*)"V1"); if (auth & V2_AUTHORITY) smartlist_add(lst, (void*)"V2"); + if (auth & V3_AUTHORITY) + smartlist_add(lst, (void*)"V3"); if (auth & BRIDGE_AUTHORITY) smartlist_add(lst, (void*)"Bridge"); if (auth & HIDSERV_AUTHORITY) @@ -133,8 +173,6 @@ { switch (purpose) { - case DIR_PURPOSE_FETCH_DIR: - return "v1 directory fetch"; case DIR_PURPOSE_FETCH_RENDDESC: return "hidden-service descriptor fetch"; case DIR_PURPOSE_UPLOAD_DIR: @@ -145,9 +183,7 @@ return "server vote upload"; case DIR_PURPOSE_UPLOAD_SIGNATURES: return "consensus signature upload"; - case DIR_PURPOSE_FETCH_RUNNING_LIST: - return "running-routers fetch"; - case DIR_PURPOSE_FETCH_NETWORKSTATUS: + case DIR_PURPOSE_FETCH_V2_NETWORKSTATUS: return "network-status fetch"; case DIR_PURPOSE_FETCH_SERVERDESC: return "server descriptor fetch"; @@ -218,7 +254,7 @@ /** Start a connection to every suitable directory authority, using * connection purpose 'purpose' and uploading the payload 'payload' - * (length 'payload_len'). The purpose should be one of + * (length 'payload_len'). dir_purpose should be one of * 'DIR_PURPOSE_UPLOAD_DIR' or 'DIR_PURPOSE_UPLOAD_RENDDESC'. * * type specifies what sort of dir authorities (V1, V2, @@ -243,10 +279,10 @@ /* This tries dirservers which we believe to be down, but ultimately, that's * harmless, and we may as well err on the side of getting things uploaded. */ - SMARTLIST_FOREACH(dirservers, trusted_dir_server_t *, ds, - { + SMARTLIST_FOREACH_BEGIN(dirservers, trusted_dir_server_t *, ds) { routerstatus_t *rs = &(ds->fake_status); size_t upload_len = payload_len; + tor_addr_t ds_addr; if ((type & ds->type) == 0) continue; @@ -257,16 +293,17 @@ if (extrainfo_len && router_supports_extrainfo(ds->digest, 1)) { upload_len += extrainfo_len; - log_info(LD_DIR, "Uploading an extrainfo (length %d)", + log_info(LD_DIR, "Uploading an extrainfo too (length %d)", (int) extrainfo_len); } + tor_addr_from_ipv4h(&ds_addr, ds->addr); post_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose) || - !fascist_firewall_allows_address_dir(ds->addr, ds->dir_port); + !fascist_firewall_allows_address_dir(&ds_addr, ds->dir_port); directory_initiate_command_routerstatus(rs, dir_purpose, router_purpose, post_via_tor, NULL, payload, upload_len, 0); - }); + } SMARTLIST_FOREACH_END(ds); if (!found) { char *s = authority_type_to_string(type); log_warn(LD_DIR, "Publishing server descriptor to directory authorities " @@ -278,19 +315,18 @@ /** Start a connection to a random running directory server, using * connection purpose dir_purpose, intending to fetch descriptors * of purpose router_purpose, and requesting resource. - * If retry_if_no_servers, then if all the possible servers seem - * down, mark them up and try again. + * Use pds_flags as arguments to router_pick_directory_server() + * or router_pick_trusteddirserver(). */ void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, - const char *resource, int retry_if_no_servers) + const char *resource, int pds_flags) { routerstatus_t *rs = NULL; or_options_t *options = get_options(); int prefer_authority = directory_fetches_from_authorities(options); int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose); authority_type_t type; - int flags = retry_if_no_servers ? PDS_RETRY_IF_NO_SERVERS : 0; time_t if_modified_since = 0; /* FFFF we could break this switch into its own function, and call @@ -299,16 +335,14 @@ case DIR_PURPOSE_FETCH_EXTRAINFO: type = EXTRAINFO_CACHE | (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_AUTHORITY : - V2_AUTHORITY); + V3_AUTHORITY); + break; + case DIR_PURPOSE_FETCH_V2_NETWORKSTATUS: + type = V2_AUTHORITY; break; - case DIR_PURPOSE_FETCH_NETWORKSTATUS: case DIR_PURPOSE_FETCH_SERVERDESC: type = (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_AUTHORITY : - V2_AUTHORITY); - break; - case DIR_PURPOSE_FETCH_DIR: - case DIR_PURPOSE_FETCH_RUNNING_LIST: - type = V1_AUTHORITY; + V3_AUTHORITY); break; case DIR_PURPOSE_FETCH_RENDDESC: type = HIDSERV_AUTHORITY; @@ -326,7 +360,7 @@ return; } - if (DIR_PURPOSE_FETCH_CONSENSUS) { + if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) { networkstatus_t *v = networkstatus_get_latest_consensus(); if (v) if_modified_since = v->valid_after + 180; @@ -338,12 +372,17 @@ if (!get_via_tor) { if (options->UseBridges && type != BRIDGE_AUTHORITY) { /* want to ask a running bridge for which we have a descriptor. */ - /* XXX021 we assume that all of our bridges can answer any + /* XXX022 we assume that all of our bridges can answer any * possible directory question. This won't be true forever. -RD */ + /* It certainly is not true with conditional consensus downloading, + * so, for now, never assume the server supports that. */ routerinfo_t *ri = choose_random_entry(NULL); if (ri) { - directory_initiate_command(ri->address, ri->addr, + tor_addr_t addr; + tor_addr_from_ipv4h(&addr, ri->addr); + directory_initiate_command(ri->address, &addr, ri->or_port, 0, + 0, /* don't use conditional consensus url */ 1, ri->cache_info.identity_digest, dir_purpose, router_purpose, @@ -355,15 +394,31 @@ } else { if (prefer_authority || type == BRIDGE_AUTHORITY) { /* only ask authdirservers, and don't ask myself */ - rs = router_pick_trusteddirserver(type, flags); + rs = router_pick_trusteddirserver(type, pds_flags); + if (rs == NULL && (pds_flags & PDS_NO_EXISTING_SERVERDESC_FETCH)) { + /* We don't want to fetch from any authorities that we're currently + * fetching server descriptors from, and we got no match. Did we + * get no match because all the authorities have connections + * fetching server descriptors (in which case we should just + * return,) or because all the authorities are down or on fire or + * unreachable or something (in which case we should go on with + * our fallback code)? */ + pds_flags &= ~PDS_NO_EXISTING_SERVERDESC_FETCH; + rs = router_pick_trusteddirserver(type, pds_flags); + if (rs) { + log_debug(LD_DIR, "Deferring serverdesc fetch: all authorities " + "are in use."); + return; + } + } } if (!rs && type != BRIDGE_AUTHORITY) { /* anybody with a non-zero dirport will do */ - rs = router_pick_directory_server(type, flags); + rs = router_pick_directory_server(type, pds_flags); if (!rs) { log_info(LD_DIR, "No router found for %s; falling back to " "dirserver list.", dir_conn_purpose_to_string(dir_purpose)); - rs = router_pick_trusteddirserver(type, flags); + rs = router_pick_trusteddirserver(type, pds_flags); if (!rs) get_via_tor = 1; /* last resort: try routing it via Tor */ } @@ -373,12 +428,12 @@ /* Never use fascistfirewall; we're going via Tor. */ if (dir_purpose == DIR_PURPOSE_FETCH_RENDDESC) { /* only ask hidserv authorities, any of them will do */ - flags |= PDS_IGNORE_FASCISTFIREWALL|PDS_ALLOW_SELF; - rs = router_pick_trusteddirserver(HIDSERV_AUTHORITY, flags); + pds_flags |= PDS_IGNORE_FASCISTFIREWALL|PDS_ALLOW_SELF; + rs = router_pick_trusteddirserver(HIDSERV_AUTHORITY, pds_flags); } else { /* anybody with a non-zero dirport will do. Disregard firewalls. */ - flags |= PDS_IGNORE_FASCISTFIREWALL; - rs = router_pick_directory_server(type, flags); + pds_flags |= PDS_IGNORE_FASCISTFIREWALL; + rs = router_pick_directory_server(type, pds_flags); /* If we have any hope of building an indirect conn, we know some router * descriptors. If (rs==NULL), we can't build circuits anyway, so * there's no point in falling back to the authorities in this case. */ @@ -428,6 +483,48 @@ }); } +/** Same as directory_initiate_command_routerstatus(), but accepts + * rendezvous data to fetch a hidden service descriptor. */ +void +directory_initiate_command_routerstatus_rend(routerstatus_t *status, + uint8_t dir_purpose, + uint8_t router_purpose, + int anonymized_connection, + const char *resource, + const char *payload, + size_t payload_len, + time_t if_modified_since, + const rend_data_t *rend_query) +{ + routerinfo_t *router; + char address_buf[INET_NTOA_BUF_LEN+1]; + struct in_addr in; + const char *address; + tor_addr_t addr; + router = router_get_by_digest(status->identity_digest); + if (!router && anonymized_connection) { + log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we " + "don't have its router descriptor.", status->nickname); + return; + } else if (router) { + address = router->address; + } else { + in.s_addr = htonl(status->addr); + tor_inet_ntoa(&in, address_buf, sizeof(address_buf)); + address = address_buf; + } + tor_addr_from_ipv4h(&addr, status->addr); + directory_initiate_command_rend(address, &addr, + status->or_port, status->dir_port, + status->version_supports_conditional_consensus, + status->version_supports_begindir, + status->identity_digest, + dir_purpose, router_purpose, + anonymized_connection, resource, + payload, payload_len, if_modified_since, + rend_query); +} + /** Launch a new connection to the directory server status to * upload or download a server or rendezvous * descriptor. dir_purpose determines what @@ -452,29 +549,11 @@ size_t payload_len, time_t if_modified_since) { - routerinfo_t *router; - char address_buf[INET_NTOA_BUF_LEN+1]; - struct in_addr in; - const char *address; - router = router_get_by_digest(status->identity_digest); - if (!router && anonymized_connection) { - log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we " - "don't have its router descriptor.", status->nickname); - return; - } else if (router) { - address = router->address; - } else { - in.s_addr = htonl(status->addr); - tor_inet_ntoa(&in, address_buf, sizeof(address_buf)); - address = address_buf; - } - directory_initiate_command(address, status->addr, - status->or_port, status->dir_port, - status->version_supports_begindir, - status->identity_digest, - dir_purpose, router_purpose, - anonymized_connection, resource, - payload, payload_len, if_modified_since); + directory_initiate_command_routerstatus_rend(status, dir_purpose, + router_purpose, + anonymized_connection, resource, + payload, payload_len, + if_modified_since, NULL); } /** Return true iff conn is the client side of a directory connection @@ -488,7 +567,7 @@ routerinfo_t *me = router_get_my_routerinfo(); if (me && router_digest_is_me(conn->identity_digest) && - me->addr == conn->_base.addr && + tor_addr_eq_ipv4h(&conn->_base.addr, me->addr) && /*XXXX prop 118*/ me->dir_port == conn->_base.port) return 1; } @@ -503,22 +582,11 @@ connection_dir_request_failed(dir_connection_t *conn) { if (directory_conn_is_self_reachability_test(conn)) { - routerinfo_t *me = router_get_my_routerinfo(); - if (me) - control_event_server_status(LOG_WARN, - "REACHABILITY_FAILED DIRADDRESS=%s:%d", - me->address, me->dir_port); return; /* this was a test fetch. don't retry. */ } - if (entry_list_can_grow(get_options())) + if (!entry_list_is_constrained(get_options())) router_set_status(conn->identity_digest, 0); /* don't try him again */ - if (conn->_base.purpose == DIR_PURPOSE_FETCH_DIR || - conn->_base.purpose == DIR_PURPOSE_FETCH_RUNNING_LIST) { - log_info(LD_DIR, "Giving up on directory server at '%s:%d'; retrying", - conn->_base.address, conn->_base.port); - directory_get_from_dirserver(conn->_base.purpose, conn->router_purpose, - NULL, 0 /* don't retry_if_no_servers */); - } else if (conn->_base.purpose == DIR_PURPOSE_FETCH_NETWORKSTATUS) { + if (conn->_base.purpose == DIR_PURPOSE_FETCH_V2_NETWORKSTATUS) { log_info(LD_DIR, "Giving up on directory server at '%s'; retrying", conn->_base.address); connection_dir_download_networkstatus_failed(conn, -1); @@ -526,6 +594,8 @@ conn->_base.purpose == DIR_PURPOSE_FETCH_EXTRAINFO) { log_info(LD_DIR, "Giving up on directory server at '%s'; retrying", conn->_base.address); + if (conn->router_purpose == ROUTER_PURPOSE_BRIDGE) + connection_dir_bridge_routerdesc_failed(conn); connection_dir_download_routerdesc_failed(conn); } else if (conn->_base.purpose == DIR_PURPOSE_FETCH_CONSENSUS) { networkstatus_consensus_download_failed(0); @@ -570,7 +640,7 @@ * failed, and possibly retry them later.*/ smartlist_t *failed = smartlist_create(); dir_split_resource_into_fingerprints(conn->requested_resource+3, - failed, NULL, 0, 0); + failed, NULL, 0); if (smartlist_len(failed)) { dir_networkstatus_download_failed(failed, status_code); SMARTLIST_FOREACH(failed, char *, cp, tor_free(cp)); @@ -579,6 +649,24 @@ } } +/** Helper: Attempt to fetch directly the descriptors of each bridge + * listed in failed. + */ +static void +connection_dir_retry_bridges(smartlist_t *descs) +{ + char digest[DIGEST_LEN]; + SMARTLIST_FOREACH(descs, const char *, cp, + { + if (base16_decode(digest, DIGEST_LEN, cp, strlen(cp))<0) { + log_warn(LD_BUG, "Malformed fingerprint in list: %s", + escaped(cp)); + continue; + } + retry_bridge_descriptor_fetch_directly(digest); + }); +} + /** Called when an attempt to download one or more router descriptors * or extra-info documents on connection conn failed. */ @@ -589,13 +677,40 @@ * it's not their fault. */ /* No need to relaunch descriptor downloads here: we already do it - * every 10 seconds (DESCRIPTOR_RETRY_INTERVAL) in main.c. */ + * every 10 or 60 seconds (FOO_DESCRIPTOR_RETRY_INTERVAL) in main.c. */ tor_assert(conn->_base.purpose == DIR_PURPOSE_FETCH_SERVERDESC || conn->_base.purpose == DIR_PURPOSE_FETCH_EXTRAINFO); (void) conn; } +/** Called when an attempt to download a bridge's routerdesc from + * one of the authorities failed due to a network error. If + * possible attempt to download descriptors from the bridge directly. + */ +static void +connection_dir_bridge_routerdesc_failed(dir_connection_t *conn) +{ + smartlist_t *which = NULL; + + /* Requests for bridge descriptors are in the form 'fp/', so ignore + anything else. */ + if (!conn->requested_resource || strcmpstart(conn->requested_resource,"fp/")) + return; + + which = smartlist_create(); + dir_split_resource_into_fingerprints(conn->requested_resource + + strlen("fp/"), + which, NULL, 0); + + tor_assert(conn->_base.purpose != DIR_PURPOSE_FETCH_EXTRAINFO); + if (smartlist_len(which)) { + connection_dir_retry_bridges(which); + SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); + } + smartlist_free(which); +} + /** Called when an attempt to fetch a certificate fails. */ static void connection_dir_download_cert_failed(dir_connection_t *conn, int status) @@ -607,7 +722,7 @@ return; failed = smartlist_create(); dir_split_resource_into_fingerprints(conn->requested_resource+3, - failed, NULL, 1, 0); + failed, NULL, DSR_HEX); SMARTLIST_FOREACH(failed, char *, cp, { authority_cert_dl_failed(cp, status); @@ -623,11 +738,12 @@ * 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 - * publishing a bridge relay descriptor, no. + * publishing a bridge relay descriptor, no. * 3) Else yes. */ static int -directory_command_should_use_begindir(or_options_t *options, uint32_t addr, +directory_command_should_use_begindir(or_options_t *options, + const tor_addr_t *addr, int or_port, uint8_t router_purpose, int anonymized_connection) { @@ -635,7 +751,8 @@ return 0; /* We don't know an ORPort -- no chance. */ if (!anonymized_connection) if (!fascist_firewall_allows_address_or(addr, or_port) || - directory_fetches_from_authorities(options)) + directory_fetches_from_authorities(options) || + (server_mode(options) && !options->Address)) return 0; /* We're firewalled or are acting like a relay -- also no. */ if (!options->TunnelDirConns && router_purpose != ROUTER_PURPOSE_BRIDGE) @@ -649,34 +766,70 @@ * supports_begindir, and whose identity key digest is * digest. */ void -directory_initiate_command(const char *address, uint32_t addr, +directory_initiate_command(const char *address, const tor_addr_t *_addr, uint16_t or_port, uint16_t dir_port, + int supports_conditional_consensus, int supports_begindir, const char *digest, uint8_t dir_purpose, uint8_t router_purpose, int anonymized_connection, const char *resource, const char *payload, size_t payload_len, time_t if_modified_since) { + directory_initiate_command_rend(address, _addr, or_port, dir_port, + supports_conditional_consensus, + supports_begindir, digest, dir_purpose, + router_purpose, anonymized_connection, + resource, payload, payload_len, + if_modified_since, NULL); +} + +/** Same as directory_initiate_command(), but accepts rendezvous data to + * fetch a hidden service descriptor. */ +static void +directory_initiate_command_rend(const char *address, const tor_addr_t *_addr, + uint16_t or_port, uint16_t dir_port, + int supports_conditional_consensus, + int supports_begindir, const char *digest, + uint8_t dir_purpose, uint8_t router_purpose, + int anonymized_connection, + const char *resource, + const char *payload, size_t payload_len, + time_t if_modified_since, + const rend_data_t *rend_query) +{ dir_connection_t *conn; or_options_t *options = get_options(); + int socket_error = 0; int use_begindir = supports_begindir && - directory_command_should_use_begindir(options, addr, + directory_command_should_use_begindir(options, _addr, or_port, router_purpose, anonymized_connection); + tor_addr_t addr; tor_assert(address); - tor_assert(addr); + tor_assert(_addr); tor_assert(or_port || dir_port); tor_assert(digest); + tor_addr_copy(&addr, _addr); + log_debug(LD_DIR, "anonymized %d, use_begindir %d.", anonymized_connection, use_begindir); log_debug(LD_DIR, "Initiating %s", dir_conn_purpose_to_string(dir_purpose)); - conn = TO_DIR_CONN(connection_new(CONN_TYPE_DIR, AF_INET)); + /* ensure that we don't make direct connections when a SOCKS server is + * configured. */ + if (!anonymized_connection && !use_begindir && !options->HttpProxy && + (options->Socks4Proxy || options->Socks5Proxy)) { + log_warn(LD_DIR, "Cannot connect to a directory server through a " + "SOCKS proxy!"); + return; + } + + conn = dir_connection_new(AF_INET); /* set up conn so it's got all the data we need to remember */ - conn->_base.addr = addr; + tor_addr_copy(&conn->_base.addr, &addr); conn->_base.port = use_begindir ? or_port : dir_port; conn->_base.address = tor_strdup(address); memcpy(conn->identity_digest, digest, DIGEST_LEN); @@ -690,16 +843,20 @@ /* decide whether we can learn our IP address from this conn */ conn->dirconn_direct = !anonymized_connection; + /* copy rendezvous data, if any */ + if (rend_query) + conn->rend_data = rend_data_dup(rend_query); + if (!anonymized_connection && !use_begindir) { /* then we want to connect to dirport directly */ if (options->HttpProxy) { - addr = options->HttpProxyAddr; + tor_addr_copy(&addr, &options->HttpProxyAddr); dir_port = options->HttpProxyPort; } - switch (connection_connect(TO_CONN(conn), conn->_base.address, addr, - dir_port)) { + switch (connection_connect(TO_CONN(conn), conn->_base.address, &addr, + dir_port, &socket_error)) { case -1: connection_dir_request_failed(conn); /* retry if we want */ /* XXX we only pass 'conn' above, not 'resource', 'payload', @@ -713,8 +870,10 @@ case 0: /* queue the command on the outbuf */ directory_send_command(conn, dir_purpose, 1, resource, - payload, payload_len, if_modified_since); - connection_watch_events(TO_CONN(conn), EV_READ | EV_WRITE); + payload, payload_len, + supports_conditional_consensus, + if_modified_since); + connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT); /* writable indicates finish, readable indicates broken link, error indicates broken link in windowsland. */ } @@ -726,7 +885,7 @@ if (anonymized_connection && use_begindir) rep_hist_note_used_internal(time(NULL), 0, 1); else if (anonymized_connection && !use_begindir) - rep_hist_note_used_port(conn->_base.port, time(NULL)); + rep_hist_note_used_port(time(NULL), conn->_base.port); /* make an AP connection * populate it and add it at the right state @@ -750,8 +909,10 @@ 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); - connection_watch_events(TO_CONN(conn), EV_READ | EV_WRITE); + payload, payload_len, + supports_conditional_consensus, + if_modified_since); + connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); connection_start_reading(TO_CONN(linked_conn)); } } @@ -769,13 +930,76 @@ return TO_CONN(conn)->linked; } +/** Helper for sorting + * + * sort strings alphabetically + */ +static int +_compare_strs(const void **a, const void **b) +{ + const char *s1 = *a, *s2 = *b; + return strcmp(s1, s2); +} + +#define CONDITIONAL_CONSENSUS_FPR_LEN 3 +#if (CONDITIONAL_CONSENSUS_FPR_LEN > DIGEST_LEN) +#error "conditional consensus fingerprint length is larger than digest length" +#endif + +/** Return the URL we should use for a consensus download. + * + * This url depends on whether or not the server we go to + * is sufficiently new to support conditional consensus downloading, + * i.e. GET .../consensus/fpr+fpr+fpr + */ +static char * +directory_get_consensus_url(int supports_conditional_consensus) +{ + char *url; + size_t len; + + if (supports_conditional_consensus) { + char *authority_id_list; + smartlist_t *authority_digests = smartlist_create(); + + SMARTLIST_FOREACH(router_get_trusted_dir_servers(), + trusted_dir_server_t *, ds, + { + char *hex; + if (!(ds->type & V3_AUTHORITY)) + continue; + + hex = tor_malloc(2*CONDITIONAL_CONSENSUS_FPR_LEN+1); + base16_encode(hex, 2*CONDITIONAL_CONSENSUS_FPR_LEN+1, + ds->v3_identity_digest, CONDITIONAL_CONSENSUS_FPR_LEN); + smartlist_add(authority_digests, hex); + }); + smartlist_sort(authority_digests, _compare_strs); + authority_id_list = smartlist_join_strings(authority_digests, + "+", 0, NULL); + + len = strlen(authority_id_list)+64; + url = tor_malloc(len); + tor_snprintf(url, len, "/tor/status-vote/current/consensus/%s.z", + authority_id_list); + + SMARTLIST_FOREACH(authority_digests, char *, cp, tor_free(cp)); + smartlist_free(authority_digests); + tor_free(authority_id_list); + } else { + url = tor_strdup("/tor/status-vote/current/consensus.z"); + } + return url; +} + /** Queue an appropriate HTTP command on conn-\>outbuf. The other args - * are as in directory_initiate_command. + * are as in directory_initiate_command(). */ static void directory_send_command(dir_connection_t *conn, int purpose, int direct, const char *resource, const char *payload, size_t payload_len, + int supports_conditional_consensus, time_t if_modified_since) { char proxystring[256]; @@ -836,19 +1060,8 @@ } switch (purpose) { - case DIR_PURPOSE_FETCH_DIR: - tor_assert(!resource); - tor_assert(!payload); - httpcommand = "GET"; - url = tor_strdup("/tor/dir.z"); - break; - case DIR_PURPOSE_FETCH_RUNNING_LIST: - tor_assert(!resource); - tor_assert(!payload); - httpcommand = "GET"; - url = tor_strdup("/tor/running-routers"); - break; - case DIR_PURPOSE_FETCH_NETWORKSTATUS: + case DIR_PURPOSE_FETCH_V2_NETWORKSTATUS: + tor_assert(resource); httpcommand = "GET"; len = strlen(resource)+32; url = tor_malloc(len); @@ -858,7 +1071,9 @@ tor_assert(!resource); tor_assert(!payload); httpcommand = "GET"; - url = tor_strdup("/tor/status-vote/current/consensus.z"); + url = directory_get_consensus_url(supports_conditional_consensus); + log_info(LD_DIR, "Downloading consensus from %s using %s", + hoststring, url); break; case DIR_PURPOSE_FETCH_CERTIFICATE: tor_assert(resource); @@ -883,12 +1098,14 @@ url = tor_strdup("/tor/status-vote/next/consensus-signatures.z"); break; case DIR_PURPOSE_FETCH_SERVERDESC: + tor_assert(resource); httpcommand = "GET"; len = strlen(resource)+32; url = tor_malloc(len); tor_snprintf(url, len, "/tor/server/%s", resource); break; case DIR_PURPOSE_FETCH_EXTRAINFO: + tor_assert(resource); httpcommand = "GET"; len = strlen(resource)+32; url = tor_malloc(len); @@ -912,31 +1129,10 @@ httpcommand = "POST"; url = tor_strdup("/tor/post/consensus-signature"); break; - case DIR_PURPOSE_FETCH_RENDDESC: - tor_assert(resource); - tor_assert(!payload); - - /* this must be true or we wouldn't be doing the lookup */ - tor_assert(strlen(resource) <= REND_SERVICE_ID_LEN_BASE32); - /* This breaks the function abstraction. */ - strlcpy(conn->rend_query, resource, sizeof(conn->rend_query)); - conn->rend_version = 0; - - httpcommand = "GET"; - /* Request the most recent versioned descriptor. */ - // (XXXX We were going to switch this to fetch rendezvous1 descriptors, - // but that never got testing, and it wasn't a good design.) - len = strlen(resource)+32; - url = tor_malloc(len); - tor_snprintf(url, len, "/tor/rendezvous/%s", resource); - break; case DIR_PURPOSE_FETCH_RENDDESC_V2: tor_assert(resource); tor_assert(strlen(resource) <= REND_DESC_ID_V2_LEN_BASE32); - /* Remember the query to refer to it when a response arrives. */ - strlcpy(conn->rend_query, payload, sizeof(conn->rend_query)); - conn->rend_version = 2; - payload = NULL; + tor_assert(!payload); httpcommand = "GET"; len = strlen(resource) + 32; url = tor_malloc(len); @@ -1025,7 +1221,7 @@ if (s-tmp >= 3 && !strcmpstart(tmp,"://")) { tmp = strchr(tmp+3, '/'); if (tmp && tmp < s) { - log_debug(LD_DIR,"Skipping over 'http[s]://hostname' string"); + log_debug(LD_DIR,"Skipping over 'http[s]://hostname/' string"); start = tmp; } } @@ -1110,7 +1306,7 @@ parse_http_response(const char *headers, int *code, time_t *date, compress_method_t *compression, char **reason) { - int n1, n2; + unsigned n1, n2; char datestr[RFC1123_TIME_LEN+1]; smartlist_t *parsed_headers; tor_assert(headers); @@ -1118,7 +1314,7 @@ while (TOR_ISSPACE(*headers)) headers++; /* tolerate leading whitespace */ - if (sscanf(headers, "HTTP/1.%d %d", &n1, &n2) < 2 || + if (tor_sscanf(headers, "HTTP/1.%u %u", &n1, &n2) < 2 || (n1 != 0 && n1 != 1) || (n2 < 100 || n2 >= 600)) { log_warn(LD_HTTP,"Failed to parse header %s",escaped(headers)); @@ -1211,8 +1407,10 @@ * descriptors we requested: descriptor digests if descriptor_digests * is true, or identity digests otherwise. Parse the descriptors, validate * them, and annotate them as having purpose purpose and as having been - * downloaded from source. */ -static void + * downloaded from source. + * + * Return the number of routers actually added. */ +static int load_downloaded_routers(const char *body, smartlist_t *which, int descriptor_digests, int router_purpose, @@ -1220,6 +1418,7 @@ { char buf[256]; char time_buf[ISO_TIME_LEN+1]; + int added = 0; int general = router_purpose == ROUTER_PURPOSE_GENERAL; format_iso_time(time_buf, time(NULL)); tor_assert(source); @@ -1231,10 +1430,13 @@ !general ? "@purpose " : "", !general ? router_purpose_to_string(router_purpose) : "", !general ? "\n" : "")<0) - return; + return added; - router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, + added = router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, descriptor_digests, buf); + control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, + count_loading_descriptors_progress()); + return added; } /** We are a client, and we've finished reading the server's @@ -1319,8 +1521,8 @@ LD_HTTP, "Received directory with skewed time (server '%s:%d'): " "It seems that our clock is %s by %s, or that theirs is %s. " - "Tor requires an accurate clock to work: please check your time " - "and date settings.", + "Tor requires an accurate clock to work: please check your time, " + "timezone, and date settings.", conn->_base.address, conn->_base.port, delta>0 ? "ahead" : "behind", dbuf, delta>0 ? "behind" : "ahead"); @@ -1335,21 +1537,22 @@ } (void) skewed; /* skewed isn't used yet. */ - if (status_code == 503 && body_len < 16) { - routerstatus_t *rs; - trusted_dir_server_t *ds; - log_info(LD_DIR,"Received http status code %d (%s) from server " - "'%s:%d'. I'll try again soon.", - status_code, escaped(reason), conn->_base.address, - conn->_base.port); - if ((rs = router_get_consensus_status_by_id(conn->identity_digest))) - rs->last_dir_503_at = now; - if ((ds = router_get_trusteddirserver_by_digest(conn->identity_digest))) - ds->fake_status.last_dir_503_at = now; + if (status_code == 503) { + if (body_len < 16) { + routerstatus_t *rs; + trusted_dir_server_t *ds; + log_info(LD_DIR,"Received http status code %d (%s) from server " + "'%s:%d'. I'll try again soon.", + status_code, escaped(reason), conn->_base.address, + conn->_base.port); + if ((rs = router_get_consensus_status_by_id(conn->identity_digest))) + rs->last_dir_503_at = now; + if ((ds = router_get_trusteddirserver_by_digest(conn->identity_digest))) + ds->fake_status.last_dir_503_at = now; - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } else if (status_code == 503) { + tor_free(body); tor_free(headers); tor_free(reason); + return -1; + } /* XXXX022 Remove this once every server with bug 539 is obsolete. */ log_info(LD_DIR, "Server at '%s:%d' sent us a 503 response, but included " "a body anyway. We'll pretend it gave us a 200.", @@ -1416,53 +1619,12 @@ } } - if (conn->_base.purpose == DIR_PURPOSE_FETCH_DIR) { - /* fetch/process the directory to cache it. */ - log_info(LD_DIR,"Received directory (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 directory. I'll try again soon.", - status_code, escaped(reason), conn->_base.address, - conn->_base.port); - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } - if (router_parse_directory(body) < 0) { - log_notice(LD_DIR,"I failed to parse the directory I fetched from " - "'%s:%d'. Ignoring.", conn->_base.address, conn->_base.port); - } - note_request(was_compressed?"dl/dir.z":"dl/dir", orig_len); - } - - if (conn->_base.purpose == DIR_PURPOSE_FETCH_RUNNING_LIST) { - /* just update our list of running routers, if this list is new info */ - log_info(LD_DIR,"Received running-routers list (size %d)", (int)body_len); - if (status_code != 200) { - log_warn(LD_DIR,"Received http status code %d (%s) from server " - "'%s:%d' while fetching running-routers. I'll try again soon.", - status_code, escaped(reason), conn->_base.address, - conn->_base.port); - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } - if (router_parse_runningrouters(body)<0) { - log_warn(LD_DIR, - "Bad running-routers from server '%s:%d'. I'll try again soon.", - conn->_base.address, conn->_base.port); - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } - note_request(was_compressed?"dl/running-routers.z": - "dl/running-routers", orig_len); - } - - if (conn->_base.purpose == DIR_PURPOSE_FETCH_NETWORKSTATUS) { + if (conn->_base.purpose == DIR_PURPOSE_FETCH_V2_NETWORKSTATUS) { smartlist_t *which = NULL; - networkstatus_source_t source; + v2_networkstatus_source_t source; char *cp; log_info(LD_DIR,"Received networkstatus objects (size %d) from server " - "'%s:%d'",(int) body_len, conn->_base.address, conn->_base.port); + "'%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 " @@ -1473,13 +1635,12 @@ connection_dir_download_networkstatus_failed(conn, status_code); return -1; } - note_request(was_compressed?"dl/status.z":"dl/status", orig_len); if (conn->requested_resource && !strcmpstart(conn->requested_resource,"fp/")) { source = NS_FROM_DIR_BY_FP; which = smartlist_create(); dir_split_resource_into_fingerprints(conn->requested_resource+3, - which, NULL, 0, 0); + which, NULL, 0); } else if (conn->requested_resource && !strcmpstart(conn->requested_resource, "all")) { source = NS_FROM_DIR_ALL; @@ -1537,8 +1698,8 @@ return -1; } 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, 0))<0) { + "'%s:%d'", (int)body_len, conn->_base.address, conn->_base.port); + if ((r=networkstatus_set_current_consensus(body, "ns", 0))<0) { log_fn(r<-1?LOG_WARN:LOG_INFO, LD_DIR, "Unable to load consensus directory downloaded from " "server '%s:%d'. I'll try again soon.", @@ -1565,9 +1726,11 @@ return -1; } log_info(LD_DIR,"Received authority certificates (size %d) from server " - "'%s:%d'",(int) body_len, conn->_base.address, conn->_base.port); + "'%s:%d'", (int)body_len, conn->_base.address, conn->_base.port); if (trusted_dirs_load_certs_from_string(body, 0, 1)<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); @@ -1578,7 +1741,7 @@ 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); + (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 " @@ -1598,11 +1761,11 @@ 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); + (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/consensus-signatures.z\".", + "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); @@ -1624,17 +1787,13 @@ 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 (was_ei) - note_request(was_compressed?"dl/extra.z":"dl/extra", orig_len); - else - note_request(was_compressed?"dl/server.z":"dl/server", orig_len); if (conn->requested_resource && (!strcmpstart(conn->requested_resource,"d/") || !strcmpstart(conn->requested_resource,"fp/"))) { which = smartlist_create(); dir_split_resource_into_fingerprints(conn->requested_resource + (descriptor_digests ? 2 : 3), - which, NULL, 0, 0); + which, NULL, 0); n_asked_for = smartlist_len(which); } if (status_code != 200) { @@ -1678,10 +1837,10 @@ } else { //router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, // descriptor_digests, conn->router_purpose); - load_downloaded_routers(body, which, descriptor_digests, + if (load_downloaded_routers(body, which, descriptor_digests, conn->router_purpose, - conn->_base.address); - directory_info_has_arrived(now, 0); + conn->_base.address)) + directory_info_has_arrived(now, 0); } } if (which) { /* mark remaining ones as failed */ @@ -1711,8 +1870,16 @@ int rejected = 0; if (rejected_hdr) { if (!strcmp(rejected_hdr, "Yes")) { - /* XXXX021 use this information; be sure to upload next one + 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 */ + /* XXXX021 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 */ rejected = 1; } tor_free(rejected_hdr); @@ -1797,22 +1964,24 @@ } if (conn->_base.purpose == DIR_PURPOSE_FETCH_RENDDESC) { + 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: - if (rend_cache_store(body, body_len, 0) < 0) { - log_warn(LD_REND,"Failed to fetch rendezvous descriptor."); + if (rend_cache_store(body, body_len, 0) < -1) { + log_warn(LD_REND,"Failed to parse rendezvous descriptor."); /* Any pending rendezvous attempts will notice when * connection_about_to_close_connection() * cleans this dir conn up. */ /* We could retry. But since v0 descriptors are going out of * style, it isn't worth the hassle. We'll do better in v2. */ } else { - /* success. notify pending connections about this. */ + /* Success, or at least there's a v2 descriptor already + * present. Notify pending connections about this. */ conn->_base.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC; - rend_client_desc_trynow(conn->rend_query, -1); + rend_client_desc_trynow(conn->rend_data->onion_address); } break; case 404: @@ -1834,12 +2003,13 @@ } if (conn->_base.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) { + 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: - switch (rend_cache_store_v2_desc_as_client(body, NULL)) { + switch (rend_cache_store_v2_desc_as_client(body, conn->rend_data)) { case -2: log_warn(LD_REND,"Fetching v2 rendezvous descriptor failed. " "Retrying at another directory."); @@ -1858,7 +2028,7 @@ log_info(LD_REND, "Successfully fetched v2 rendezvous " "descriptor."); conn->_base.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC; - rend_client_desc_trynow(conn->rend_query, -1); + rend_client_desc_trynow(conn->rend_data->onion_address); break; } break; @@ -1901,12 +2071,6 @@ "'%s:%d'. Malformed rendezvous descriptor?", escaped(reason), conn->_base.address, conn->_base.port); break; - case 503: - log_info(LD_REND,"http status 503 (%s) response from dirserver " - "'%s:%d'. Node is (currently) not acting as v2 hidden " - "service directory.", - escaped(reason), conn->_base.address, conn->_base.port); - break; default: log_warn(LD_REND,"http status %d (%s) response unexpected (server " "'%s:%d').", @@ -1915,6 +2079,7 @@ break; } } + note_client_request(conn->_base.purpose, was_compressed, orig_len); tor_free(body); tor_free(headers); tor_free(reason); return 0; } @@ -2027,7 +2192,7 @@ tor_snprintf(cp, sizeof(tmp)-(cp-tmp), "Content-Type: %s\r\n", type); cp += strlen(cp); } - if (!is_local_IP(conn->_base.addr)) { + if (!is_local_addr(&conn->_base.addr)) { /* Don't report the source address for a nearby/private connection. * Otherwise we tend to mis-report in cases where incoming ports are * being forwarded to a Tor server running behind the firewall. */ @@ -2059,8 +2224,10 @@ strlcpy(cp, "Pragma: no-cache\r\n", sizeof(tmp)-(cp-tmp)); cp += strlen(cp); } - if (extra_headers) + if (extra_headers) { strlcpy(cp, extra_headers, sizeof(tmp)-(cp-tmp)); + cp += strlen(cp); + } if (sizeof(tmp)-(cp-tmp) > 3) memcpy(cp, "\r\n", 3); else @@ -2081,46 +2248,78 @@ cache_lifetime); } -/** Helper function: return 1 if there are any dir conns of purpose - * purpose that are going elsewhere than our own ORPort/Dirport. - * Else return 0. - */ -static int -already_fetching_directory(int purpose) +#ifdef INSTRUMENT_DOWNLOADS +typedef struct request_t { + uint64_t bytes; /**< How many bytes have we transferred? */ + uint64_t count; /**< How many requests have we made? */ +} request_t; + +/** Map used to keep track of how much data we've up/downloaded in what kind + * of request. Maps from request type to pointer to request_t. */ +static strmap_t *request_map = NULL; + +/** Record that a client request of purpose was made, and that + * bytes bytes of possibly compressed data were sent/received. + * Used to keep track of how much we've up/downloaded in what kind of + * request. */ +static void +note_client_request(int purpose, int compressed, size_t bytes) { - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, conn, - { - if (conn->type == CONN_TYPE_DIR && - conn->purpose == purpose && - !conn->marked_for_close && - !router_digest_is_me(TO_DIR_CONN(conn)->identity_digest)) - return 1; - }); - return 0; + char *key; + const char *kind = NULL; + switch (purpose) { + case DIR_PURPOSE_FETCH_V2_NETWORKSTATUS: kind = "dl/status"; break; + case DIR_PURPOSE_FETCH_CONSENSUS: kind = "dl/consensus"; break; + case DIR_PURPOSE_FETCH_CERTIFICATE: kind = "dl/cert"; break; + case DIR_PURPOSE_FETCH_STATUS_VOTE: kind = "dl/vote"; break; + case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: kind = "dl/detached_sig"; + break; + case DIR_PURPOSE_FETCH_SERVERDESC: kind = "dl/server"; break; + case DIR_PURPOSE_FETCH_EXTRAINFO: kind = "dl/extra"; break; + case DIR_PURPOSE_UPLOAD_DIR: kind = "dl/ul-dir"; break; + case DIR_PURPOSE_UPLOAD_VOTE: kind = "dl/ul-vote"; break; + case DIR_PURPOSE_UPLOAD_SIGNATURES: kind = "dl/ul-sig"; break; + case DIR_PURPOSE_FETCH_RENDDESC: kind = "dl/rend"; break; + case DIR_PURPOSE_FETCH_RENDDESC_V2: kind = "dl/rend2"; break; + case DIR_PURPOSE_UPLOAD_RENDDESC: kind = "dl/ul-rend"; break; + case DIR_PURPOSE_UPLOAD_RENDDESC_V2: kind = "dl/ul-rend2"; break; + } + if (kind) { + key = tor_malloc(256); + tor_snprintf(key, 256, "%s%s", kind, compressed?".z":""); + } else { + key = tor_malloc(256); + tor_snprintf(key, 256, "unknown purpose (%d)%s", + purpose, compressed?".z":""); + } + note_request(key, bytes); + tor_free(key); } -#ifdef INSTRUMENT_DOWNLOADS -/** Map used to keep track of how much data we've up/downloaded in what kind - * of request. Maps from request type to pointer to uint64_t. */ -static strmap_t *request_bytes_map = NULL; +/** Helper: initialize the request map to instrument downloads. */ +static void +ensure_request_map_initialized(void) +{ + if (!request_map) + request_map = strmap_new(); +} /** Called when we just transmitted or received bytes worth of data * because of a request of type key (an arbitrary identifier): adds * bytes to the total associated with key. */ -static void +void note_request(const char *key, size_t bytes) { - uint64_t *n; - if (!request_bytes_map) - request_bytes_map = strmap_new(); - - n = strmap_get(request_bytes_map, key); - if (!n) { - n = tor_malloc_zero(sizeof(uint64_t)); - strmap_set(request_bytes_map, key, n); + request_t *r; + ensure_request_map_initialized(); + + r = strmap_get(request_map, key); + if (!r) { + r = tor_malloc_zero(sizeof(request_t)); + strmap_set(request_map, key, r); } - *n += bytes; + r->bytes += bytes; + r->count++; } /** Return a newly allocated string holding a summary of bytes used per @@ -2133,21 +2332,20 @@ char *result; strmap_iter_t *iter; - if (!request_bytes_map) - request_bytes_map = strmap_new(); + ensure_request_map_initialized(); lines = smartlist_create(); - for (iter = strmap_iter_init(request_bytes_map); + for (iter = strmap_iter_init(request_map); !strmap_iter_done(iter); - iter = strmap_iter_next(request_bytes_map, iter)) { + iter = strmap_iter_next(request_map, iter)) { const char *key; void *val; - uint64_t *n; + request_t *r; strmap_iter_get(iter, &key, &val); - n = val; - tor_snprintf(tmp, sizeof(tmp), "%s "U64_FORMAT"\n", - key, U64_PRINTF_ARG(*n)); + r = val; + tor_snprintf(tmp, sizeof(tmp), "%s "U64_FORMAT" "U64_FORMAT"\n", + key, U64_PRINTF_ARG(r->bytes), U64_PRINTF_ARG(r->count)); smartlist_add(lines, tor_strdup(tmp)); } smartlist_sort_strings(lines); @@ -2158,6 +2356,14 @@ } #else static void +note_client_request(int purpose, int compressed, size_t bytes) +{ + (void)purpose; + (void)compressed; + (void)bytes; +} + +void note_request(const char *key, size_t bytes) { (void)key; @@ -2171,6 +2377,59 @@ } #endif +/** Decide whether a client would accept the consensus we have. + * + * Clients can say they only want a consensus if it's signed by more + * than half the authorities in a list. They pass this list in + * the url as "...consensus/fpr+fpr+fpr". + * + * fpr may be an abbreviated fingerprint, i.e. only a left substring + * of the full authority identity digest. (Only strings of even length, + * i.e. encodings of full bytes, are handled correctly. In the case + * of an odd number of hex digits the last one is silently ignored.) + * + * Returns 1 if more than half of the requested authorities signed the + * consensus, 0 otherwise. + */ +int +client_likes_consensus(networkstatus_t *v, const char *want_url) +{ + smartlist_t *want_authorities = smartlist_create(); + int need_at_least; + int have = 0; + + dir_split_resource_into_fingerprints(want_url, want_authorities, NULL, 0); + need_at_least = smartlist_len(want_authorities)/2+1; + SMARTLIST_FOREACH_BEGIN(want_authorities, const char *, d) { + char want_digest[DIGEST_LEN]; + size_t want_len = strlen(d)/2; + if (want_len > DIGEST_LEN) + want_len = DIGEST_LEN; + + if (base16_decode(want_digest, DIGEST_LEN, d, want_len*2) < 0) { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, + "Failed to decode requested authority digest %s.", d); + continue; + }; + + SMARTLIST_FOREACH_BEGIN(v->voters, networkstatus_voter_info_t *, vi) { + if (smartlist_len(vi->sigs) && + !memcmp(vi->identity_digest, want_digest, want_len)) { + have++; + break; + }; + } SMARTLIST_FOREACH_END(vi); + + /* early exit, if we already have enough */ + if (have >= need_at_least) + break; + } SMARTLIST_FOREACH_END(d); + + SMARTLIST_FOREACH(want_authorities, char *, d, tor_free(d)); + smartlist_free(want_authorities); + return (have >= need_at_least); +} + /** Helper function: called when a dirserver gets a complete HTTP GET * request. Look for a request for a directory or for a rendezvous * service descriptor. On finding one, write a response into @@ -2218,18 +2477,32 @@ url_len -= 2; } - if (!strcmp(url,"/tor/") || !strcmp(url,"/tor/dir")) { /* dir fetch */ + if (!strcmp(url,"/tor/")) { + const char *frontpage = get_dirportfrontpage(); + + if (frontpage) { + dlen = strlen(frontpage); + /* Let's return a disclaimer page (users shouldn't use V1 anymore, + and caches don't fetch '/', so this is safe). */ + + /* [We don't check for write_bucket_low here, since we want to serve + * this page no matter what.] */ + note_request(url, dlen); + write_http_response_header_impl(conn, dlen, "text/html", "identity", + NULL, DIRPORTFRONTPAGE_CACHE_LIFETIME); + connection_write_to_buf(frontpage, dlen, TO_CONN(conn)); + goto done; + } + /* if no disclaimer file, fall through and continue */ + } + + if (!strcmp(url,"/tor/") || !strcmp(url,"/tor/dir")) { /* v1 dir fetch */ cached_dir_t *d = dirserv_get_directory(); if (!d) { log_info(LD_DIRSERV,"Client asked for the mirrored directory, but we " "don't have a good one yet. Sending 503 Dir not available."); write_http_status_line(conn, 503, "Directory unavailable"); - /* try to get a new one now */ - if (!already_fetching_directory(DIR_PURPOSE_FETCH_DIR) && - !should_delay_dir_fetches(options)) - directory_get_from_dirserver(DIR_PURPOSE_FETCH_DIR, - ROUTER_PURPOSE_GENERAL, NULL, 1); goto done; } if (d->published < if_modified_since) { @@ -2269,11 +2542,6 @@ cached_dir_t *d = dirserv_get_runningrouters(); if (!d) { write_http_status_line(conn, 503, "Directory unavailable"); - /* try to get a new one now */ - if (!already_fetching_directory(DIR_PURPOSE_FETCH_RUNNING_LIST) && - !should_delay_dir_fetches(options)) - directory_get_from_dirserver(DIR_PURPOSE_FETCH_RUNNING_LIST, - ROUTER_PURPOSE_GENERAL, NULL, 1); goto done; } if (d->published < if_modified_since) { @@ -2298,13 +2566,16 @@ } if (!strcmpstart(url,"/tor/status/") - || !strcmp(url, "/tor/status-vote/current/consensus")) { + || !strcmpstart(url, "/tor/status-vote/current/consensus")) { /* v2 or v3 network status fetch. */ smartlist_t *dir_fps = smartlist_create(); int is_v3 = !strcmpstart(url, "/tor/status-vote"); + geoip_client_action_t act = + is_v3 ? GEOIP_CLIENT_NETWORKSTATUS : GEOIP_CLIENT_NETWORKSTATUS_V2; const char *request_type = NULL; const char *key = url + strlen("/tor/status/"); long lifetime = NETWORKSTATUS_CACHE_LIFETIME; + if (!is_v3) { dirserv_get_networkstatus_v2_fingerprints(dir_fps, key); if (!strcmpstart(key, "fp/")) @@ -2319,8 +2590,44 @@ } else { networkstatus_t *v = networkstatus_get_latest_consensus(); time_t now = time(NULL); - smartlist_add(dir_fps, tor_memdup("\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0", 20)); + const char *want_fps = NULL; + char *flavor = NULL; + #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); + } + } else { + if (!strcmpstart(url, CONSENSUS_URL_PREFIX)) + want_fps = url+strlen(CONSENSUS_URL_PREFIX); + } + + /* XXXX MICRODESC NM NM should check document of correct flavor */ + 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(act, GEOIP_REJECT_NOT_ENOUGH_SIGS); + 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); + } request_type = compressed?"v3.z":"v3"; lifetime = (v && v->fresh_until > now) ? v->fresh_until - now : 0; } @@ -2328,6 +2635,7 @@ 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(act, GEOIP_REJECT_UNAVAILABLE); goto done; } @@ -2335,11 +2643,13 @@ 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(act, 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(act, GEOIP_REJECT_NOT_MODIFIED); goto done; } @@ -2351,9 +2661,26 @@ 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(act, GEOIP_REJECT_BUSY); goto done; } + { + struct in_addr in; + if (tor_inet_aton((TO_CONN(conn))->address, &in)) { + geoip_note_client_seen(act, ntohl(in.s_addr), time(NULL)); + geoip_note_ns_response(act, GEOIP_SUCCESS); + /* Note that a request for a network status has started, so that we + * can measure the download time later on. */ + if (TO_CONN(conn)->dirreq_id) + geoip_start_dirreq(TO_CONN(conn)->dirreq_id, dlen, act, + DIRREQ_TUNNELED); + else + geoip_start_dirreq(TO_CONN(conn)->global_identifier, dlen, act, + DIRREQ_DIRECT); + } + } + // note_request(request_type,dlen); (void) request_type; write_http_response_header(conn, -1, compressed, @@ -2372,13 +2699,13 @@ !strcmpstart(url,"/tor/status-vote/next/")) { /* XXXX If-modified-since is only implemented for the current * consensus: that's probably fine, since it's the only vote document - * people fetch much.*/ + * people fetch much. */ int current; ssize_t body_len = 0; ssize_t estimated_len = 0; smartlist_t *items = smartlist_create(); smartlist_t *dir_items = smartlist_create(); - int lifetime = 60; /* XXXX021 should actually use vote intervals. */ + int lifetime = 60; /* XXXX022 should actually use vote intervals. */ url += strlen("/tor/status-vote/"); current = !strcmpstart(url, "current/"); url = strchr(url, '/'); @@ -2388,7 +2715,7 @@ const char *item; tor_assert(!current); /* we handle current consensus specially above, * since it wants to be spooled. */ - if ((item = dirvote_get_pending_consensus())) + if ((item = dirvote_get_pending_consensus(FLAV_NS))) smartlist_add(items, (char*)item); } else if (!current && !strcmp(url, "consensus-signatures")) { /* XXXX the spec says that we should implement @@ -2414,7 +2741,8 @@ flags = DGV_BY_ID | (current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING); } - dir_split_resource_into_fingerprints(url, fps, NULL, 1, 1); + dir_split_resource_into_fingerprints(url, fps, NULL, + DSR_HEX|DSR_SORT_UNIQ); SMARTLIST_FOREACH(fps, char *, fp, { if ((d = dirvote_get_vote(fp, flags))) smartlist_add(dir_items, (cached_dir_t*)d); @@ -2438,7 +2766,7 @@ } }); - if (global_write_bucket_low(TO_CONN(conn), estimated_len, 1)) { + if (global_write_bucket_low(TO_CONN(conn), estimated_len, 2)) { write_http_status_line(conn, 503, "Directory busy, try again later."); goto vote_done; } @@ -2467,10 +2795,44 @@ goto done; } + if (!strcmpstart(url, "/tor/micro/d/")) { + smartlist_t *fps = smartlist_create(); + + dir_split_resource_into_fingerprints(url+strlen("/tor/micro/d/"), + fps, NULL, + DSR_DIGEST256|DSR_BASE64|DSR_SORT_UNIQ); + + if (!dirserv_have_any_microdesc(fps)) { + write_http_status_line(conn, 404, "Not found"); + SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp)); + smartlist_free(fps); + goto done; + } + dlen = dirserv_estimate_microdesc_size(fps, compressed); + if (global_write_bucket_low(TO_CONN(conn), dlen, 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; + + if (compressed) + conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); + + connection_dirserv_flushed_some(conn); + goto done; + } + if (!strcmpstart(url,"/tor/server/") || (!options->BridgeAuthoritativeDir && - !options->BridgeRelay && - !strcmpstart(url,"/tor/extra/"))) { + !options->BridgeRelay && !strcmpstart(url,"/tor/extra/"))) { int res; const char *msg; const char *request_type = NULL; @@ -2480,7 +2842,8 @@ conn->fingerprint_stack = smartlist_create(); res = dirserv_get_routerdesc_fingerprints(conn->fingerprint_stack, url, &msg, - !connection_dir_is_encrypted(conn)); + !connection_dir_is_encrypted(conn), + is_extra); if (!strcmpstart(url, "fp/")) { request_type = compressed?"/tor/server/fp.z":"/tor/server/fp"; @@ -2548,7 +2911,8 @@ } else if (!strcmpstart(url, "/tor/keys/fp/")) { smartlist_t *fps = smartlist_create(); dir_split_resource_into_fingerprints(url+strlen("/tor/keys/fp/"), - fps, NULL, 1, 1); + fps, NULL, + DSR_HEX|DSR_SORT_UNIQ); SMARTLIST_FOREACH(fps, char *, d, { authority_cert_t *c = authority_cert_get_newest_by_id(d); if (c) smartlist_add(certs, c); @@ -2558,13 +2922,25 @@ } else if (!strcmpstart(url, "/tor/keys/sk/")) { smartlist_t *fps = smartlist_create(); dir_split_resource_into_fingerprints(url+strlen("/tor/keys/sk/"), - fps, NULL, 1, 1); + fps, NULL, + DSR_HEX|DSR_SORT_UNIQ); SMARTLIST_FOREACH(fps, char *, d, { authority_cert_t *c = authority_cert_get_by_sk_digest(d); if (c) smartlist_add(certs, c); tor_free(d); }); smartlist_free(fps); + } else if (!strcmpstart(url, "/tor/keys/fp-sk/")) { + smartlist_t *fp_sks = smartlist_create(); + dir_split_resource_into_fingerprint_pairs(url+strlen("/tor/keys/fp-sk/"), + fp_sks); + SMARTLIST_FOREACH(fp_sks, fp_pair_t *, pair, { + authority_cert_t *c = authority_cert_get_by_digests(pair->first, + pair->second); + if (c) smartlist_add(certs, c); + tor_free(pair); + }); + smartlist_free(fp_sks); } else { write_http_status_line(conn, 400, "Bad request"); goto keys_done; @@ -2584,7 +2960,7 @@ SMARTLIST_FOREACH(certs, authority_cert_t *, c, len += c->cache_info.signed_descriptor_len); - if (global_write_bucket_low(TO_CONN(conn), compressed?len/2:len, 1)) { + if (global_write_bucket_low(TO_CONN(conn), compressed?len/2:len, 2)) { write_http_status_line(conn, 503, "Directory busy, try again later."); goto keys_done; } @@ -2647,20 +3023,11 @@ "application/octet-stream", NULL, NULL, 0); note_request("/tor/rendezvous?/", desc_len); - /* need to send descp separately, because it may include nuls */ + /* need to send descp separately, because it may include NULs */ connection_write_to_buf(descp, desc_len, TO_CONN(conn)); - /* report successful fetch to statistic */ - if (options->HSAuthorityRecordStats) { - hs_usage_note_fetch_total(query, time(NULL)); - hs_usage_note_fetch_successful(query, time(NULL)); - } break; case 0: /* well-formed but not present */ write_http_status_line(conn, 404, "Not found"); - /* report (unsuccessful) fetch to statistic */ - if (options->HSAuthorityRecordStats) { - hs_usage_note_fetch_total(query, time(NULL)); - } break; case -1: /* not well-formed */ write_http_status_line(conn, 400, "Bad request"); @@ -2715,6 +3082,22 @@ goto done; } + if (!strcmp(url,"/tor/dbg-stability.txt")) { + const char *stability; + size_t len; + if (options->BridgeAuthoritativeDir || + ! authdir_mode_tests_reachability(options) || + ! (stability = rep_hist_get_router_stability_doc(time(NULL)))) { + write_http_status_line(conn, 404, "Not found."); + goto done; + } + + len = strlen(stability); + write_http_response_header(conn, len, 0, 0); + connection_write_to_buf(stability, len, TO_CONN(conn)); + goto done; + } + #if defined(EXPORTMALLINFO) && defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) #define ADD_MALLINFO_LINE(x) do { \ tor_snprintf(tmp, sizeof(tmp), "%s %d\n", #x, mi.x); \ @@ -2722,7 +3105,7 @@ }while(0); if (!strcmp(url,"/tor/mallinfo.txt") && - (conn->_base.addr == 0x7f000001ul)) { + (tor_addr_eq_ipv4h(&conn->_base.addr, 0x7f000001ul))) { char *result; size_t len; struct mallinfo mi; @@ -2800,11 +3183,11 @@ case -1: log_warn(LD_REND, "Rejected v2 rend descriptor (length %d) from %s.", (int)body_len, conn->_base.address); - write_http_status_line(conn, 400, "Invalid service descriptor " - "rejected"); + write_http_status_line(conn, 400, + "Invalid v2 service descriptor rejected"); break; default: - write_http_status_line(conn, 200, "Service descriptor stored"); + write_http_status_line(conn, 200, "Service descriptor (v2) stored"); log_info(LD_REND, "Handled v2 rendezvous descriptor post: accepted"); } goto done; @@ -2820,32 +3203,33 @@ if (authdir_mode_handles_descs(options, -1) && !strcmp(url,"/tor/")) { /* server descriptor post */ - const char *msg = NULL; + const char *msg = "[None]"; uint8_t purpose = authdir_mode_bridge(options) ? ROUTER_PURPOSE_BRIDGE : ROUTER_PURPOSE_GENERAL; - int r = dirserv_add_multiple_descriptors(body, purpose, + was_router_added_t r = dirserv_add_multiple_descriptors(body, purpose, conn->_base.address, &msg); tor_assert(msg); - if (r > 0) + if (WRA_WAS_ADDED(r)) dirserv_get_directory(); /* rebuild and write to disk */ - switch (r) { - case -1: - log_notice(LD_DIRSERV, - "Rejected router descriptor or extra-info from %s " - "(\"%s\").", - conn->_base.address, msg); - /* fall through */ - case 1: - /* malformed descriptor, or something wrong */ - write_http_status_line(conn, 400, msg); - break; - case 0: /* accepted but discarded */ - write_http_response_header_impl(conn, -1, NULL, NULL, - "X-Descriptor-Not-New: Yes\r\n", -1); - break; - case 2: /* accepted */ - write_http_status_line(conn, 200, msg); - break; + + if (r == ROUTER_ADDED_NOTIFY_GENERATOR) { + /* Accepted with a message. */ + log_info(LD_DIRSERV, + "Problematic router descriptor or extra-info from %s " + "(\"%s\").", + conn->_base.address, msg); + write_http_status_line(conn, 400, msg); + } else if (r == ROUTER_ADDED_SUCCESSFULLY) { + write_http_status_line(conn, 200, msg); + } else if (WRA_WAS_OUTDATED(r)) { + write_http_response_header_impl(conn, -1, NULL, NULL, + "X-Descriptor-Not-New: Yes\r\n", -1); + } else { + log_info(LD_DIRSERV, + "Rejected router descriptor or extra-info from %s " + "(\"%s\").", + conn->_base.address, msg); + write_http_status_line(conn, 400, msg); } goto done; } @@ -2858,9 +3242,10 @@ log_fn(LOG_PROTOCOL_WARN, LD_DIRSERV, "Rejected rend descriptor (length %d) from %s.", (int)body_len, conn->_base.address); - write_http_status_line(conn, 400, "Invalid service descriptor rejected"); + write_http_status_line(conn, 400, + "Invalid v0 service descriptor rejected"); } else { - write_http_status_line(conn, 200, "Service descriptor stored"); + write_http_status_line(conn, 200, "Service descriptor (v0) stored"); } goto done; } @@ -2919,8 +3304,8 @@ &body, &body_len, MAX_DIR_UL_SIZE, 0)) { case -1: /* overflow */ log_warn(LD_DIRSERV, - "Invalid input from address '%s'. Closing.", - conn->_base.address); + "Request too large from address '%s' to DirPort. Closing.", + safe_str(conn->_base.address)); return -1; case 0: log_debug(LD_DIRSERV,"command not all here yet."); @@ -2956,6 +3341,16 @@ tor_assert(conn); tor_assert(conn->_base.type == CONN_TYPE_DIR); + /* Note that we have finished writing the directory response. For direct + * connections this means we're done, for tunneled connections its only + * an intermediate step. */ + if (TO_CONN(conn)->dirreq_id) + geoip_change_dirreq_state(TO_CONN(conn)->dirreq_id, DIRREQ_TUNNELED, + DIRREQ_FLUSHING_DIR_CONN_FINISHED); + else + geoip_change_dirreq_state(TO_CONN(conn)->global_identifier, + DIRREQ_DIRECT, + DIRREQ_FLUSHING_DIR_CONN_FINISHED); switch (conn->_base.state) { case DIR_CONN_STATE_CLIENT_SENDING: log_debug(LD_DIR,"client finished sending command."); @@ -3015,59 +3410,85 @@ }); } +/** Schedule for when servers should download things in general. */ static const int server_dl_schedule[] = { 0, 0, 0, 60, 60, 60*2, 60*5, 60*15, INT_MAX }; +/** Schedule for when clients should download things in general. */ static const int client_dl_schedule[] = { 0, 0, 60, 60*5, 60*10, INT_MAX }; +/** Schedule for when servers should download consensuses. */ static const int server_consensus_dl_schedule[] = { 0, 0, 60, 60*5, 60*10, 60*30, 60*30, 60*30, 60*30, 60*30, 60*60, 60*60*2 }; +/** Schedule for when clients should download consensuses. */ static const int client_consensus_dl_schedule[] = { 0, 0, 60, 60*5, 60*10, 60*30, 60*60, 60*60, 60*60, 60*60*3, 60*60*6, 60*60*12 }; +/** Schedule for when clients should download bridge descriptors. */ +static const int bridge_dl_schedule[] = { + 60*60, 15*60, 15*60, 60*60 +}; -/** Called when an attempt to download dls has failed with HTTP status - * status_code. Increment the failure count (if the code indicates a - * real failure) and set dls->next_attempt_at to an appropriate time in - * the future. */ -time_t -download_status_increment_failure(download_status_t *dls, int status_code, - const char *item, int server, time_t now) +/** Decide which download schedule we want to use, and then return a + * pointer to it along with a pointer to its length. Helper function for + * download_status_increment_failure() and download_status_reset(). */ +static void +find_dl_schedule_and_len(download_status_t *dls, int server, + const int **schedule, size_t *schedule_len) { - const int *schedule; - size_t schedule_len; - int increment; - tor_assert(dls); - if (status_code != 503 || server) - ++dls->n_download_failures; - switch (dls->schedule) { case DL_SCHED_GENERIC: if (server) { - schedule = server_dl_schedule; - schedule_len = sizeof(server_dl_schedule)/sizeof(int); + *schedule = server_dl_schedule; + *schedule_len = sizeof(server_dl_schedule)/sizeof(int); } else { - schedule = client_dl_schedule; - schedule_len = sizeof(client_dl_schedule)/sizeof(int); + *schedule = client_dl_schedule; + *schedule_len = sizeof(client_dl_schedule)/sizeof(int); } break; case DL_SCHED_CONSENSUS: if (server) { - schedule = server_consensus_dl_schedule; - schedule_len = sizeof(server_consensus_dl_schedule)/sizeof(int); + *schedule = server_consensus_dl_schedule; + *schedule_len = sizeof(server_consensus_dl_schedule)/sizeof(int); } else { - schedule = client_consensus_dl_schedule; - schedule_len = sizeof(client_consensus_dl_schedule)/sizeof(int); + *schedule = client_consensus_dl_schedule; + *schedule_len = sizeof(client_consensus_dl_schedule)/sizeof(int); } break; + case DL_SCHED_BRIDGE: + *schedule = bridge_dl_schedule; + *schedule_len = sizeof(bridge_dl_schedule)/sizeof(int); + break; default: tor_assert(0); } +} + +/** Called when an attempt to download dls has failed with HTTP status + * status_code. Increment the failure count (if the code indicates a + * real failure) and set dls-\>next_attempt_at to an appropriate time + * in the future. */ +time_t +download_status_increment_failure(download_status_t *dls, int status_code, + const char *item, int server, time_t now) +{ + const int *schedule; + size_t schedule_len; + int increment; + tor_assert(dls); + if (status_code != 503 || server) { + if (dls->n_download_failures < IMPOSSIBLE_TO_DOWNLOAD-1) + ++dls->n_download_failures; + } + + find_dl_schedule_and_len(dls, server, &schedule, &schedule_len); if (dls->n_download_failures < schedule_len) increment = schedule[dls->n_download_failures]; + else if (dls->n_download_failures == IMPOSSIBLE_TO_DOWNLOAD) + increment = INT_MAX; else increment = schedule[schedule_len-1]; @@ -3077,7 +3498,7 @@ dls->next_attempt_at = TIME_MAX; if (item) { - if (dls->next_attempt_at == 0) + if (increment == 0) log_debug(LD_DIR, "%s failed %d time(s); I'll try again immediately.", item, (int)dls->n_download_failures); else if (dls->next_attempt_at < TIME_MAX) @@ -3092,12 +3513,32 @@ } /** Reset dls so that it will be considered downloadable - * immediately. */ + * immediately, and/or to show that we don't need it anymore. + * + * (We find the zeroth element of the download schedule, and set + * next_attempt_at to be the appropriate offset from 'now'. In most + * cases this means setting it to 'now', so the item will be immediately + * downloadable; in the case of bridge descriptors, the zeroth element + * is an hour from now.) */ void download_status_reset(download_status_t *dls) { + const int *schedule; + size_t schedule_len; + + find_dl_schedule_and_len(dls, get_options()->DirPort, + &schedule, &schedule_len); + dls->n_download_failures = 0; - dls->next_attempt_at = 0; + dls->next_attempt_at = time(NULL) + schedule[0]; +} + +/** Return the number of failures on dls since the last success (if + * any). */ +int +download_status_get_n_failures(const download_status_t *dls) +{ + return dls->n_download_failures; } /** Called when one or more routerdesc (or extrainfo, if was_extrainfo) @@ -3115,16 +3556,8 @@ int server = directory_fetches_from_authorities(get_options()); if (!was_descriptor_digests) { if (router_purpose == ROUTER_PURPOSE_BRIDGE) { - tor_assert(!was_extrainfo); /* not supported yet */ - SMARTLIST_FOREACH(failed, const char *, cp, - { - if (base16_decode(digest, DIGEST_LEN, cp, strlen(cp))<0) { - log_warn(LD_BUG, "Malformed fingerprint in list: %s", - escaped(cp)); - continue; - } - retry_bridge_descriptor_fetch_directly(digest); - }); + tor_assert(!was_extrainfo); + connection_dir_retry_bridges(failed); } return; /* FFFF should implement for other-than-router-purpose someday */ } @@ -3152,22 +3585,102 @@ * every 10 or 60 seconds (FOO_DESCRIPTOR_RETRY_INTERVAL) in main.c. */ } +/** Helper. Compare two fp_pair_t objects, and return -1, 0, or 1 as + * appropriate. */ +static int +_compare_pairs(const void **a, const void **b) +{ + const fp_pair_t *fp1 = *a, *fp2 = *b; + int r; + if ((r = memcmp(fp1->first, fp2->first, DIGEST_LEN))) + return r; + else + return memcmp(fp1->second, fp2->second, DIGEST_LEN); +} + +/** Divide a string res of the form FP1-FP2+FP3-FP4...[.z], where each + * FP is a hex-encoded fingerprint, into a sequence of distinct sorted + * fp_pair_t. Skip malformed pairs. On success, return 0 and add those + * fp_pair_t into pairs_out. On failure, return -1. */ +int +dir_split_resource_into_fingerprint_pairs(const char *res, + smartlist_t *pairs_out) +{ + smartlist_t *pairs_tmp = smartlist_create(); + smartlist_t *pairs_result = smartlist_create(); + + smartlist_split_string(pairs_tmp, res, "+", 0, 0); + if (smartlist_len(pairs_tmp)) { + char *last = smartlist_get(pairs_tmp,smartlist_len(pairs_tmp)-1); + size_t last_len = strlen(last); + if (last_len > 2 && !strcmp(last+last_len-2, ".z")) { + last[last_len-2] = '\0'; + } + } + SMARTLIST_FOREACH_BEGIN(pairs_tmp, char *, cp) { + if (strlen(cp) != HEX_DIGEST_LEN*2+1) { + log_info(LD_DIR, + "Skipping digest pair %s with non-standard length.", escaped(cp)); + } else if (cp[HEX_DIGEST_LEN] != '-') { + log_info(LD_DIR, + "Skipping digest pair %s with missing dash.", escaped(cp)); + } else { + fp_pair_t pair; + if (base16_decode(pair.first, DIGEST_LEN, cp, HEX_DIGEST_LEN)<0 || + base16_decode(pair.second, + DIGEST_LEN, cp+HEX_DIGEST_LEN+1, HEX_DIGEST_LEN)<0) { + log_info(LD_DIR, "Skipping non-decodable digest pair %s", escaped(cp)); + } else { + smartlist_add(pairs_result, tor_memdup(&pair, sizeof(pair))); + } + } + tor_free(cp); + } SMARTLIST_FOREACH_END(cp); + smartlist_free(pairs_tmp); + + /* Uniq-and-sort */ + smartlist_sort(pairs_result, _compare_pairs); + smartlist_uniq(pairs_result, _compare_pairs, _tor_free); + + smartlist_add_all(pairs_out, pairs_result); + smartlist_free(pairs_result); + return 0; +} + /** Given a directory resource request, containing zero * or more strings separated by plus signs, followed optionally by ".z", store * the strings, in order, into fp_out. If compressed_out is - * non-NULL, set it to 1 if the resource ends in ".z", else set it to 0. If - * decode_hex is true, then delete all elements that aren't hex digests, and - * decode the rest. If sort_uniq is true, then sort the list and remove - * all duplicates. + * non-NULL, set it to 1 if the resource ends in ".z", else set it to 0. + * + * If (flags & DSR_HEX), then delete all elements that aren't hex digests, and + * decode the rest. If (flags & DSR_BASE64), then use "-" rather than "+" as + * a separator, delete all the elements that aren't base64-encoded digests, + * and decode the rest. If (flags & DSR_DIGEST256), these digests should be + * 256 bits long; else they should be 160. + * + * If (flags & DSR_SORT_UNIQ), then sort the list and remove all duplicates. */ int dir_split_resource_into_fingerprints(const char *resource, smartlist_t *fp_out, int *compressed_out, - int decode_hex, int sort_uniq) + int flags) { + const int decode_hex = flags & DSR_HEX; + const int decode_base64 = flags & DSR_BASE64; + const int digests_are_256 = flags & DSR_DIGEST256; + const int sort_uniq = flags & DSR_SORT_UNIQ; + + const int digest_len = digests_are_256 ? DIGEST256_LEN : DIGEST_LEN; + const int hex_digest_len = digests_are_256 ? + HEX_DIGEST256_LEN : HEX_DIGEST_LEN; + const int base64_digest_len = digests_are_256 ? + BASE64_DIGEST256_LEN : BASE64_DIGEST_LEN; smartlist_t *fp_tmp = smartlist_create(); + + tor_assert(!(decode_hex && decode_base64)); tor_assert(fp_out); - smartlist_split_string(fp_tmp, resource, "+", 0, 0); + + smartlist_split_string(fp_tmp, resource, decode_base64?"-":"+", 0, 0); if (compressed_out) *compressed_out = 0; if (smartlist_len(fp_tmp)) { @@ -3179,22 +3692,25 @@ *compressed_out = 1; } } - if (decode_hex) { + if (decode_hex || decode_base64) { + const size_t encoded_len = decode_hex ? hex_digest_len : base64_digest_len; int i; char *cp, *d = NULL; for (i = 0; i < smartlist_len(fp_tmp); ++i) { cp = smartlist_get(fp_tmp, i); - if (strlen(cp) != HEX_DIGEST_LEN) { + if (strlen(cp) != encoded_len) { log_info(LD_DIR, "Skipping digest %s with non-standard length.", escaped(cp)); smartlist_del_keeporder(fp_tmp, i--); goto again; } - d = tor_malloc_zero(DIGEST_LEN); - if (base16_decode(d, DIGEST_LEN, cp, HEX_DIGEST_LEN)<0) { - log_info(LD_DIR, "Skipping non-decodable digest %s", escaped(cp)); - smartlist_del_keeporder(fp_tmp, i--); - goto again; + d = tor_malloc_zero(digest_len); + if (decode_hex ? + (base16_decode(d, digest_len, cp, hex_digest_len)<0) : + (base64_decode(d, digest_len, cp, base64_digest_len)<0)) { + log_info(LD_DIR, "Skipping non-decodable digest %s", escaped(cp)); + smartlist_del_keeporder(fp_tmp, i--); + goto again; } smartlist_set(fp_tmp, i, d); d = NULL; @@ -3204,26 +3720,18 @@ } } if (sort_uniq) { - smartlist_t *fp_tmp2 = smartlist_create(); - int i; - if (decode_hex) - smartlist_sort_digests(fp_tmp); - else + if (decode_hex || decode_base64) { + if (digests_are_256) { + smartlist_sort_digests256(fp_tmp); + smartlist_uniq_digests256(fp_tmp); + } else { + smartlist_sort_digests(fp_tmp); + smartlist_uniq_digests(fp_tmp); + } + } else { smartlist_sort_strings(fp_tmp); - if (smartlist_len(fp_tmp)) - smartlist_add(fp_tmp2, smartlist_get(fp_tmp, 0)); - for (i = 1; i < smartlist_len(fp_tmp); ++i) { - char *cp = smartlist_get(fp_tmp, i); - char *last = smartlist_get(fp_tmp2, smartlist_len(fp_tmp2)-1); - - if ((decode_hex && memcmp(cp, last, DIGEST_LEN)) - || (!decode_hex && strcasecmp(cp, last))) - smartlist_add(fp_tmp2, cp); - else - tor_free(cp); + smartlist_uniq_strings(fp_tmp); } - smartlist_free(fp_tmp); - fp_tmp = fp_tmp2; } smartlist_add_all(fp_out, fp_tmp); smartlist_free(fp_tmp); diff -Nru tor-0.2.0.34/src/or/directory.h tor-0.2.2.16-alpha/src/or/directory.h --- tor-0.2.0.34/src/or/directory.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/directory.h 2010-09-17 01:30:36.000000000 +0000 @@ -0,0 +1,110 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file directory.h + * \brief Header file for directory.c. + **/ + +#ifndef _TOR_DIRECTORY_H +#define _TOR_DIRECTORY_H + +int directories_have_accepted_server_descriptor(void); +char *authority_type_to_string(authority_type_t auth); +void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, + authority_type_t type, const char *payload, + size_t payload_len, size_t extrainfo_len); +void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, + const char *resource, + int pds_flags); +void directory_get_from_all_authorities(uint8_t dir_purpose, + uint8_t router_purpose, + const char *resource); +void directory_initiate_command_routerstatus(routerstatus_t *status, + uint8_t dir_purpose, + uint8_t router_purpose, + int anonymized_connection, + const char *resource, + const char *payload, + size_t payload_len, + time_t if_modified_since); +void directory_initiate_command_routerstatus_rend(routerstatus_t *status, + uint8_t dir_purpose, + uint8_t router_purpose, + int anonymized_connection, + const char *resource, + const char *payload, + size_t payload_len, + time_t if_modified_since, + const rend_data_t *rend_query); + +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_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_request_failed(dir_connection_t *conn); +void directory_initiate_command(const char *address, const tor_addr_t *addr, + uint16_t or_port, uint16_t dir_port, + int supports_conditional_consensus, + int supports_begindir, const char *digest, + uint8_t dir_purpose, uint8_t router_purpose, + int anonymized_connection, + 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) +#define DSR_DIGEST256 (1<<2) +#define DSR_SORT_UNIQ (1<<3) +int dir_split_resource_into_fingerprints(const char *resource, + smartlist_t *fp_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); +void note_request(const char *key, size_t bytes); +int router_supports_extrainfo(const char *identity_digest, int is_authority); + +time_t download_status_increment_failure(download_status_t *dls, + int status_code, const char *item, + int server, time_t now); +/** Increment the failure count of the download_status_t dls, with + * the optional status code sc. */ +#define download_status_failed(dls, sc) \ + download_status_increment_failure((dls), (sc), NULL, \ + get_options()->DirPort, time(NULL)) + +void download_status_reset(download_status_t *dls); +static int download_status_is_ready(download_status_t *dls, time_t now, + int max_failures); +/** Return true iff, as of now, the resource tracked by dls is + * ready to get its download reattempted. */ +static INLINE int +download_status_is_ready(download_status_t *dls, time_t now, + int max_failures) +{ + return (dls->n_download_failures <= max_failures + && dls->next_attempt_at <= now); +} + +static void download_status_mark_impossible(download_status_t *dl); +/** Mark dl as never downloadable. */ +static INLINE void +download_status_mark_impossible(download_status_t *dl) +{ + dl->n_download_failures = IMPOSSIBLE_TO_DOWNLOAD; +} + +int download_status_get_n_failures(const download_status_t *dls); + +#endif + diff -Nru tor-0.2.0.34/src/or/dirserv.c tor-0.2.2.16-alpha/src/or/dirserv.c --- tor-0.2.0.34/src/or/dirserv.c 2009-01-06 07:22:07.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/dirserv.c 2010-09-17 01:30:36.000000000 +0000 @@ -1,13 +1,26 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: dirserv.c 17947 2009-01-06 07:22:07Z arma $ */ -const char dirserv_c_id[] = - "$Id: dirserv.c 17947 2009-01-06 07:22:07Z arma $"; #define DIRSERV_PRIVATE #include "or.h" +#include "buffers.h" +#include "config.h" +#include "connection.h" +#include "connection_or.h" +#include "control.h" +#include "directory.h" +#include "dirserv.h" +#include "dirvote.h" +#include "hibernate.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "policies.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" /** * \file dirserv.c @@ -30,9 +43,13 @@ extern time_t time_of_process_start; /* from main.c */ -/** Do we need to regenerate the directory when someone asks for it? */ +/** Do we need to regenerate the v1 directory when someone asks for it? */ static time_t the_directory_is_dirty = 1; +/** Do we need to regenerate the v1 runningrouters document when somebody + * asks for it? */ static time_t runningrouters_is_dirty = 1; +/** Do we need to regenerate our v2 networkstatus document when somebody asks + * for it? */ static time_t the_v2_networkstatus_is_dirty = 1; /** Most recently generated encoded signed v1 directory. (v1 auth dirservers @@ -40,7 +57,7 @@ static cached_dir_t *the_directory = NULL; /** For authoritative directories: the current (v1) network status. */ -static cached_dir_t the_runningrouters = { NULL, NULL, 0, 0, 0, -1 }; +static cached_dir_t the_runningrouters; static void directory_remove_invalid(void); static cached_dir_t *dirserv_regenerate_directory(void); @@ -62,13 +79,16 @@ time_t publish_cutoff); static int dirserv_add_extrainfo(extrainfo_t *ei, const char **msg); +/************** Measured Bandwidth parsing code ******/ +#define MAX_MEASUREMENT_AGE (3*24*60*60) /* 3 days */ + /************** Fingerprint handling code ************/ #define FP_NAMED 1 /**< Listed in fingerprint file. */ #define FP_INVALID 2 /**< Believed invalid. */ #define FP_REJECT 4 /**< We will not publish this router. */ #define FP_BADDIR 8 /**< We'll tell clients to avoid using this as a dir. */ -#define FP_BADEXIT 16 /**< We'll tell clients not to use this as an exit. */ +#define FP_BADEXIT 16 /**< We'll tell clients not to use this as an exit. */ #define FP_UNNAMED 32 /**< Another router has this name in fingerprint file. */ /** Encapsulate a nickname and an FP_* status; target of status_by_digest @@ -98,7 +118,7 @@ return list; } -/** Add the fingerprint fp for the nickname nickname to +/** Add the fingerprint fp for nickname to * the smartlist of fingerprint_entry_t's list. Return 0 if it's * new, or 1 if we replaced the old value. */ @@ -180,8 +200,7 @@ * file. The file format is line-based, with each non-blank holding one * nickname, some space, and a fingerprint for that nickname. On success, * replace the current fingerprint list with the new list and return 0. On - * failure, leave the current fingerprint list untouched, and - * return -1. */ + * failure, leave the current fingerprint list untouched, and return -1. */ int dirserv_load_fingerprint_file(void) { @@ -221,6 +240,7 @@ fingerprint_list_new = authdir_config_new(); for (list=front; list; list=list->next) { + char digest_tmp[DIGEST_LEN]; nickname = list->key; fingerprint = list->value; if (strlen(nickname) > MAX_NICKNAME_LEN) { log_notice(LD_CONFIG, @@ -237,8 +257,10 @@ nickname); continue; } - if (strlen(fingerprint) != FINGERPRINT_LEN || - !crypto_pk_check_fingerprint_syntax(fingerprint)) { + tor_strstrip(fingerprint, " "); /* remove spaces */ + if (strlen(fingerprint) != HEX_DIGEST_LEN || + base16_decode(digest_tmp, sizeof(digest_tmp), + fingerprint, HEX_DIGEST_LEN) < 0) { log_notice(LD_CONFIG, "Invalid fingerprint (nickname '%s', " "fingerprint %s). Skipping.", @@ -364,6 +386,15 @@ strmap_size(fingerprint_list->fp_by_name), digestmap_size(fingerprint_list->status_by_digest)); + /* Tor 0.1.2.x is pretty old, but there are a lot of them running still, + * and there aren't any critical relay-side vulnerabilities. Once more + * of them die off, we should raise this minimum to 0.2.0.x. */ + if (platform && !tor_version_as_new_as(platform,"0.1.2.14")) { + if (msg) + *msg = "Tor version is far too old to work."; + return FP_REJECT; + } + result = dirserv_get_name_status(id_digest, nickname); if (result & FP_NAMED) { if (should_log) @@ -434,10 +465,6 @@ *msg = "Authdir rejects unknown routers."; return FP_REJECT; } - /* 0.1.0.2-rc was the first version that did enough self-testing that - * we're willing to take its word about whether it's running. */ - if (platform && !tor_version_as_new_as(platform,"0.1.0.2-rc")) - result |= FP_INVALID; } return result; @@ -511,7 +538,7 @@ /* Okay. Now check whether the fingerprint is recognized. */ uint32_t status = dirserv_router_get_status(ri, msg); time_t now; - int severity = complain ? LOG_NOTICE : LOG_INFO; + int severity = (complain && ri->contact_info) ? LOG_NOTICE : LOG_INFO; tor_assert(msg); if (status & FP_REJECT) return -1; /* msg is already set. */ @@ -556,15 +583,21 @@ return 0; } -/** As for dirserv_add_descriptor, but accepts multiple documents, and +/** True iff a is more severe than b. */ +static int +WRA_MORE_SEVERE(was_router_added_t a, was_router_added_t b) +{ + return a < b; +} + +/** As for dirserv_add_descriptor(), but accepts multiple documents, and * returns the most severe error that occurred for any one of them. */ -int +was_router_added_t dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose, const char *source, const char **msg) { - int r=100; /* higher than any actual return value. */ - int r_tmp; + was_router_added_t r, r_tmp; const char *msg_out; smartlist_t *list; const char *s; @@ -575,6 +608,8 @@ int general = purpose == ROUTER_PURPOSE_GENERAL; tor_assert(msg); + r=ROUTER_ADDED_SUCCESSFULLY; /*Least severe return value. */ + format_iso_time(time_buf, now); if (tor_snprintf(annotation_buf, sizeof(annotation_buf), "@uploaded-at %s\n" @@ -594,8 +629,8 @@ SMARTLIST_FOREACH(list, routerinfo_t *, ri, { msg_out = NULL; tor_assert(ri->purpose == purpose); - r_tmp = dirserv_add_descriptor(ri, &msg_out); - if (r_tmp < r) { + r_tmp = dirserv_add_descriptor(ri, &msg_out, source); + if (WRA_MORE_SEVERE(r_tmp, r)) { r = r_tmp; *msg = msg_out; } @@ -611,7 +646,7 @@ msg_out = NULL; r_tmp = dirserv_add_extrainfo(ei, &msg_out); - if (r_tmp < r) { + if (WRA_MORE_SEVERE(r_tmp, r)) { r = r_tmp; *msg = msg_out; } @@ -623,50 +658,49 @@ if (! *msg) { if (!n_parsed) { *msg = "No descriptors found in your POST."; - if (r > -1) - r = -1; + if (WRA_WAS_ADDED(r)) + r = ROUTER_WAS_NOT_NEW; } else { *msg = "(no message)"; } } - return r <= 2 ? r : 2; + return r; } /** Examine the parsed server descriptor in ri and maybe insert it into * the list of server descriptors. Set *msg to a message that should be - * passed back to the origin of this descriptor. + * passed back to the origin of this descriptor, or NULL if there is no such + * message. Use source to produce better log messages. * - * Return 2 if descriptor is well-formed and accepted; - * 1 if well-formed and accepted but origin should hear *msg; - * 0 if well-formed but redundant with one we already have; - * -1 if it is rejected and origin should hear *msg; + * Return the status of the operation * * This function is only called when fresh descriptors are posted, not when * we re-load the cache. */ -int -dirserv_add_descriptor(routerinfo_t *ri, const char **msg) +was_router_added_t +dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) { - int r; + was_router_added_t r; routerinfo_t *ri_old; - char *desc = NULL; + char *desc, *nickname; size_t desclen = 0; + *msg = NULL; /* If it's too big, refuse it now. Otherwise we'll cache it all over the * network and it'll clog everything up. */ if (ri->cache_info.signed_descriptor_len > MAX_DESCRIPTOR_UPLOAD_SIZE) { - log_notice(LD_DIR, "Somebody attempted to publish a router descriptor " - "with size %d. Either this is an attack, or the " + log_notice(LD_DIR, "Somebody attempted to publish a router descriptor '%s'" + " (source: %s) with size %d. Either this is an attack, or the " "MAX_DESCRIPTOR_UPLOAD_SIZE (%d) constant is too low.", - (int)ri->cache_info.signed_descriptor_len, + ri->nickname, source, (int)ri->cache_info.signed_descriptor_len, MAX_DESCRIPTOR_UPLOAD_SIZE); *msg = "Router descriptor was too large"; control_event_or_authdir_new_descriptor("REJECTED", ri->cache_info.signed_descriptor_body, ri->cache_info.signed_descriptor_len, *msg); routerinfo_free(ri); - return -1; + return ROUTER_AUTHDIR_REJECTS; } /* Check whether this descriptor is semantically identical to the last one @@ -678,48 +712,59 @@ && router_differences_are_cosmetic(ri_old, ri) && !router_is_me(ri)) { log_info(LD_DIRSERV, - "Not replacing descriptor from '%s'; differences are cosmetic.", - ri->nickname); + "Not replacing descriptor from '%s' (source: %s); " + "differences are cosmetic.", + ri->nickname, source); *msg = "Not replacing router descriptor; no information has changed since " "the last one with this identity."; control_event_or_authdir_new_descriptor("DROPPED", ri->cache_info.signed_descriptor_body, ri->cache_info.signed_descriptor_len, *msg); routerinfo_free(ri); - return 0; - } - if (control_event_is_interesting(EVENT_AUTHDIR_NEWDESCS)) { - /* Make a copy of desc, since router_add_to_routerlist might free - * ri and its associated signed_descriptor_t. */ - desclen = ri->cache_info.signed_descriptor_len; - desc = tor_strndup(ri->cache_info.signed_descriptor_body, desclen); + return ROUTER_WAS_NOT_NEW; } - if ((r = router_add_to_routerlist(ri, msg, 0, 0))<0) { - if (r < -1 && desc) /* unless the routerinfo was fine, just out-of-date */ + /* Make a copy of desc, since router_add_to_routerlist might free + * ri and its associated signed_descriptor_t. */ + desclen = ri->cache_info.signed_descriptor_len; + desc = tor_strndup(ri->cache_info.signed_descriptor_body, desclen); + nickname = tor_strdup(ri->nickname); + + /* Tell if we're about to need to launch a test if we add this. */ + ri->needs_retest_if_added = + dirserv_should_launch_reachability_test(ri, ri_old); + + r = router_add_to_routerlist(ri, msg, 0, 0); + if (!WRA_WAS_ADDED(r)) { + /* unless the routerinfo was fine, just out-of-date */ + if (WRA_WAS_REJECTED(r)) control_event_or_authdir_new_descriptor("REJECTED", desc, desclen, *msg); - tor_free(desc); - return r == -1 ? 0 : -1; + log_info(LD_DIRSERV, + "Did not add descriptor from '%s' (source: %s): %s.", + nickname, source, *msg ? *msg : "(no message)"); } else { smartlist_t *changed; - if (desc) - control_event_or_authdir_new_descriptor("ACCEPTED", desc, desclen, *msg); + control_event_or_authdir_new_descriptor("ACCEPTED", desc, desclen, *msg); changed = smartlist_create(); smartlist_add(changed, ri); - control_event_descriptors_changed(changed); + routerlist_descriptors_added(changed, 0); smartlist_free(changed); if (!*msg) { *msg = ri->is_valid ? "Descriptor for valid server accepted" : "Descriptor for invalid server accepted"; } - tor_free(desc); - return r == 0 ? 2 : 1; + log_info(LD_DIRSERV, + "Added descriptor from '%s' (source: %s): %s.", + nickname, source, *msg); } + tor_free(desc); + tor_free(nickname); + return r; } /** As dirserv_add_descriptor, but for an extrainfo_t ei. */ -static int +static was_router_added_t dirserv_add_extrainfo(extrainfo_t *ei, const char **msg) { routerinfo_t *ri; @@ -731,7 +776,7 @@ if (!ri) { *msg = "No corresponding router descriptor for extra-info descriptor"; extrainfo_free(ei); - return -1; + return ROUTER_BAD_EI; } /* If it's too big, refuse it now. Otherwise we'll cache it all over the @@ -744,15 +789,15 @@ MAX_EXTRAINFO_UPLOAD_SIZE); *msg = "Extrainfo document was too large"; extrainfo_free(ei); - return -1; + return ROUTER_BAD_EI; } if ((r = routerinfo_incompatible_with_extrainfo(ri, ei, NULL, msg))) { extrainfo_free(ei); - return r < 0 ? 0 : -1; + return r < 0 ? ROUTER_WAS_NOT_NEW : ROUTER_BAD_EI; } router_add_extrainfo_to_routerlist(ei, msg, 0, 0); - return 2; + return ROUTER_ADDED_SUCCESSFULLY; } /** Remove all descriptors whose nicknames or fingerprints no longer @@ -775,7 +820,7 @@ if (r & FP_REJECT) { log_info(LD_DIRSERV, "Router '%s' is now rejected: %s", ent->nickname, msg?msg:""); - routerlist_remove(rl, ent, 0); + routerlist_remove(rl, ent, 0, time(NULL)); i--; changed = 1; continue; @@ -812,46 +857,6 @@ routerlist_assert_ok(rl); } -/** Write a list of unregistered descriptors into a newly allocated - * string and return it. Used by dirserv operators to keep track of - * fast nodes that haven't registered. - */ -int -getinfo_helper_dirserv_unregistered(control_connection_t *control_conn, - const char *question, char **answer_out) -{ - smartlist_t *answerlist; - char buf[1024]; - char *answer; - int min_bw = atoi(question); - routerlist_t *rl = router_get_routerlist(); - - (void) control_conn; - - if (strcmpstart(question, "unregistered-servers-")) - return 0; - question += strlen("unregistered-servers-"); - - answerlist = smartlist_create(); - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ent, { - uint32_t r = dirserv_router_get_status(ent, NULL); - if (router_get_advertised_bandwidth(ent) >= (size_t)min_bw && - !(r & FP_NAMED)) { - /* then log this one */ - tor_snprintf(buf, sizeof(buf), - "%s: BW %d on '%s'.", - ent->nickname, router_get_advertised_bandwidth(ent), - ent->platform ? ent->platform : ""); - smartlist_add(answerlist, tor_strdup(buf)); - } - }); - answer = smartlist_join_strings(answerlist, "\r\n", 0, NULL); - SMARTLIST_FOREACH(answerlist, char *, cp, tor_free(cp)); - smartlist_free(answerlist); - *answer_out = answer; - return 0; -} - /** Mark the directory as dirty -- when we're next asked for a * directory, we will rebuild it instead of reusing the most recently * generated one. @@ -863,7 +868,8 @@ int set_v1_dirty=0; /* Regenerate stubs only every 8 hours. - * XXXX021 It would be nice to generate less often. */ + * XXXX It would be nice to generate less often, but these are just + * stubs: it doesn't matter. */ #define STUB_REGENERATE_INTERVAL (8*60*60) if (!the_directory || !the_runningrouters.dir) set_v1_dirty = 1; @@ -909,27 +915,55 @@ return tor_strdup(buf); } +static INLINE int +running_long_enough_to_decide_unreachable(void) +{ + return time_of_process_start + + get_options()->TestingAuthDirTimeToLearnReachability < approx_time(); +} + /** Each server needs to have passed a reachability test no more * than this number of seconds ago, or he is listed as down in * the directory. */ #define REACHABLE_TIMEOUT (45*60) +/** If we tested a router and found it reachable _at least this long_ after it + * declared itself hibernating, it is probably done hibernating and we just + * missed a descriptor from it. */ +#define HIBERNATION_PUBLICATION_SKEW (60*60) + /** Treat a router as alive if * - It's me, and I'm not hibernating. * or - We've found it reachable recently. */ void dirserv_set_router_is_running(routerinfo_t *router, time_t now) { + /*XXXX022 This function is a mess. Separate out the part that calculates + whether it's reachable and the part that tells rephist that the router was + unreachable. + */ int answer; - if (router_is_me(router) && !we_are_hibernating()) + if (router_is_me(router)) { + /* We always know if we are down ourselves. */ + answer = ! we_are_hibernating(); + } else if (router->is_hibernating && + (router->cache_info.published_on + + HIBERNATION_PUBLICATION_SKEW) > router->last_reachable) { + /* A hibernating router is down unless we (somehow) had contact with it + * since it declared itself to be hibernating. */ + answer = 0; + } else if (get_options()->AssumeReachable) { + /* If AssumeReachable, everybody is up unless they say they are down! */ answer = 1; - else - answer = get_options()->AssumeReachable || - now < router->last_reachable + REACHABLE_TIMEOUT; + } else { + /* Otherwise, a router counts as up if we found it reachable in the last + REACHABLE_TIMEOUT seconds. */ + answer = (now < router->last_reachable + REACHABLE_TIMEOUT); + } - if (router->is_running && !answer) { - /* it was running but now it's not. tell rephist. */ + if (!answer && running_long_enough_to_decide_unreachable()) { + /* not considered reachable. tell rephist. */ rep_hist_note_router_unreachable(router->cache_info.identity_digest, now); } @@ -941,7 +975,6 @@ * *router_status_out. Return 0 on success, -1 on failure. * * If for_controller is true, include the routers with very old descriptors. - * If for_controller is >1, use the verbose nickname format. */ int list_server_status_v1(smartlist_t *routers, char **router_status_out, @@ -961,23 +994,22 @@ rs_entries = smartlist_create(); - SMARTLIST_FOREACH(routers, routerinfo_t *, ri, - { + SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) { if (authdir) { /* Update router status in routerinfo_t. */ dirserv_set_router_is_running(ri, now); } - if (for_controller == 1 || ri->cache_info.published_on >= cutoff) - smartlist_add(rs_entries, list_single_server_status(ri, ri->is_running)); - else if (for_controller > 2) { + if (for_controller) { char name_buf[MAX_VERBOSE_NICKNAME_LEN+2]; char *cp = name_buf; if (!ri->is_running) *cp++ = '!'; router_get_verbose_nickname(cp, ri); smartlist_add(rs_entries, tor_strdup(name_buf)); + } else if (ri->cache_info.published_on >= cutoff) { + smartlist_add(rs_entries, list_single_server_status(ri, ri->is_running)); } - }); + } SMARTLIST_FOREACH_END(ri); *router_status_out = smartlist_join_strings(rs_entries, " ", 0, NULL); @@ -1095,7 +1127,8 @@ return -1; } note_crypto_pk_op(SIGN_DIR); - if (router_append_dirobj_signature(buf,buf_len,digest,private_key)<0) { + if (router_append_dirobj_signature(buf,buf_len,digest,DIGEST_LEN, + private_key)<0) { tor_free(buf); return -1; } @@ -1126,17 +1159,17 @@ return 0; if (server_mode(options) && router_pick_published_address(options, &addr)<0) return 1; /* we don't know our IP address; ask an authority. */ - if (options->DirPort == 0) + if (options->DirPort == 0 && !options->RefuseUnknownExits) return 0; if (!server_mode(options) || !advertised_server_mode()) return 0; me = router_get_my_routerinfo(); - if (!me || !me->dir_port) + if (!me || (!me->dir_port && !options->RefuseUnknownExits)) return 0; /* if dirport not advertised, return 0 too */ return 1; } -/* Return 1 if we should fetch new networkstatuses, descriptors, etc +/** Return 1 if we should fetch new networkstatuses, descriptors, etc * on the "mirror" schedule rather than the "client" schedule. */ int @@ -1145,7 +1178,7 @@ return directory_fetches_from_authorities(options); } -/* Return 1 if we should fetch new networkstatuses, descriptors, etc +/** Return 1 if we should fetch new networkstatuses, descriptors, etc * on a very passive schedule -- waiting long enough for ordinary clients * to probably have the info we want. These would include bridge users, * and maybe others in the future e.g. if a Tor client uses another Tor @@ -1171,7 +1204,11 @@ int directory_caches_dir_info(or_options_t *options) { - return options->BridgeRelay != 0 || options->DirPort != 0; + if (options->BridgeRelay || options->DirPort) + return 1; + if (!server_mode(options) || !advertised_server_mode()) + return 0; + return options->RefuseUnknownExits; } /** Return 1 if we want to allow remote people to ask us directory @@ -1208,15 +1245,20 @@ /* Used only by non-v1-auth dirservers: The v1 directory and * runningrouters we'll serve when requested. */ + +/** The v1 directory we'll serve (as a cache or as an authority) if + * requested. */ static cached_dir_t *cached_directory = NULL; -static cached_dir_t cached_runningrouters = { NULL, NULL, 0, 0, 0, -1 }; +/** The v1 runningrouters document we'll serve (as a cache or as an authority) + * if requested. */ +static cached_dir_t cached_runningrouters; /** Used for other dirservers' v2 network statuses. Map from hexdigest to * cached_dir_t. */ static digestmap_t *cached_v2_networkstatus = NULL; -/** The v3 consensus network status that we're currently serving. */ -static cached_dir_t *cached_v3_networkstatus = NULL; +/** Map from flavor name to the v3 consensuses that we're currently serving. */ +static strmap_t *cached_consensuses = NULL; /** Possibly replace the contents of d with the value of * directory published on when, unless when is older than @@ -1290,11 +1332,15 @@ static void _free_cached_dir(void *_d) { - cached_dir_t *d = (cached_dir_t *)_d; + cached_dir_t *d; + if (!_d) + return; + + d = (cached_dir_t *)_d; cached_dir_decref(d); } -/** If we have no cached directory, or it is older than published, +/** If we have no cached v1 directory, or it is older than published, * then replace it with directory, published at published. * * If published is too old, do nothing. @@ -1384,17 +1430,26 @@ } } -/** Replace the v3 consensus networkstatus that we're serving with - * networkstatus, published at published. No validation is - * performed. */ +/** Replace the v3 consensus networkstatus of type flavor_name that + * we're serving with networkstatus, published at published. No + * validation is performed. */ void -dirserv_set_cached_networkstatus_v3(const char *networkstatus, - time_t published) -{ - if (cached_v3_networkstatus) - cached_dir_decref(cached_v3_networkstatus); - cached_v3_networkstatus = new_cached_dir( - tor_strdup(networkstatus), published); +dirserv_set_cached_consensus_networkstatus(const char *networkstatus, + const char *flavor_name, + const digests_t *digests, + time_t published) +{ + cached_dir_t *new_networkstatus; + cached_dir_t *old_networkstatus; + if (!cached_consensuses) + cached_consensuses = strmap_new(); + + new_networkstatus = new_cached_dir(tor_strdup(networkstatus), published); + memcpy(&new_networkstatus->digests, digests, sizeof(digests_t)); + old_networkstatus = strmap_set(cached_consensuses, flavor_name, + new_networkstatus); + if (old_networkstatus) + cached_dir_decref(old_networkstatus); } /** Remove any v2 networkstatus from the directory cache that was published @@ -1479,7 +1534,7 @@ return dirserv_pick_cached_dir_obj(cached_directory, the_directory, the_directory_is_dirty, dirserv_regenerate_directory, - "server directory", V1_AUTHORITY); + "v1 server directory", V1_AUTHORITY); } /** Only called by v1 auth dirservers. @@ -1548,7 +1603,8 @@ goto err; } note_crypto_pk_op(SIGN_DIR); - if (router_append_dirobj_signature(s, len, digest, private_key)<0) + if (router_append_dirobj_signature(s, len, digest, DIGEST_LEN, + private_key)<0) goto err; set_cached_dir(&the_runningrouters, s, time(NULL)); @@ -1573,10 +1629,14 @@ "v1 network status list", V1_AUTHORITY); } +/** Return the latest downloaded consensus networkstatus in encoded, signed, + * optionally compressed format, suitable for sending to clients. */ cached_dir_t * -dirserv_get_consensus(void) +dirserv_get_consensus(const char *flavor_name) { - return cached_v3_networkstatus; + if (!cached_consensuses) + return NULL; + return strmap_get(cached_consensuses, flavor_name); } /** For authoritative directories: the current (v2) network status. */ @@ -1603,7 +1663,7 @@ #define MTBF_TO_GUARANTEE_STABLE (60*60*24*5) /** Similarly, we protect sufficiently fast nodes from being pushed * out of the set of Fast nodes. */ -#define BANDWIDTH_TO_GUARANTEE_FAST (100*1024) +#define BANDWIDTH_TO_GUARANTEE_FAST ROUTER_REQUIRED_MIN_BANDWIDTH /** Similarly, every node with sufficient bandwidth can be considered * for Guard status. */ #define BANDWIDTH_TO_GUARANTEE_GUARD (250*1024) @@ -1614,21 +1674,36 @@ #define TIME_KNOWN_TO_GUARANTEE_FAMILIAR (8*24*60*60) /** Similarly, every node with sufficient WFU is around enough to be a guard. */ -#define WFU_TO_GUARANTEE_GUARD (0.995) +#define WFU_TO_GUARANTEE_GUARD (0.98) /* Thresholds for server performance: set by * dirserv_compute_performance_thresholds, and used by * generate_v2_networkstatus */ -/* XXXX stick these all in a struct. */ + +/** Any router with an uptime of at least this value is stable. */ static uint32_t stable_uptime = 0; /* start at a safe value */ +/** Any router with an mtbf of at least this value is stable. */ static double stable_mtbf = 0.0; +/** If true, we have measured enough mtbf info to look at stable_mtbf rather + * than stable_uptime. */ static int enough_mtbf_info = 0; +/** Any router with a weighted fractional uptime of at least this much might + * be good as a guard. */ static double guard_wfu = 0.0; +/** Don't call a router a guard unless we've known about it for at least this + * many seconds. */ static long guard_tk = 0; +/** Any router with a bandwidth at least this high is "Fast" */ static uint32_t fast_bandwidth = 0; +/** If exits can be guards, then all guards must have a bandwidth this + * high. */ static uint32_t guard_bandwidth_including_exits = 0; +/** If exits can't be guards, then all guards must have a bandwidth this + * high. */ static uint32_t guard_bandwidth_excluding_exits = 0; +/** Total bandwidth of all the routers we're considering. */ static uint64_t total_bandwidth = 0; +/** Total bandwidth of all the exit routers we're considering. */ static uint64_t total_exit_bandwidth = 0; /** Helper: estimate the uptime of a router given its stated uptime and the @@ -1654,7 +1729,7 @@ { if (need_uptime) { if (!enough_mtbf_info) { - /* XXXX Once most authorities are on v3, we should change the rule from + /* XXX022 Once most authorities are on v3, we should change the rule from * "use uptime if we don't have mtbf data" to "don't advertise Stable on * v3 if we don't have enough mtbf data." */ long uptime = real_uptime(router, now); @@ -1664,7 +1739,8 @@ } else { double mtbf = rep_hist_get_stability(router->cache_info.identity_digest, now); - if (mtbf < stable_mtbf) + if (mtbf < stable_mtbf && + mtbf < MTBF_TO_GUARANTEE_STABLE) return 1; } } @@ -1678,7 +1754,7 @@ /** Return true iff router should be assigned the "HSDir" flag. * Right now this means it advertises support for it, it has a high - * uptime, and it's currently considered Running. + * uptime, it has a DirPort open, and it's currently considered Running. * * This function needs to be called after router-\>is_running has * been set. @@ -1688,7 +1764,11 @@ { long uptime = real_uptime(router, now); - return (router->wants_to_be_hs_dir && + /* XXX We shouldn't need to check dir_port, but we do because of + * bug 1693. In the future, once relays set wants_to_be_hs_dir + * correctly, we can revert to only checking dir_port if router's + * version is too old. */ + return (router->wants_to_be_hs_dir && router->dir_port && uptime > get_options()->MinUptimeHidServDirectoryV2 && router->is_running); } @@ -1743,7 +1823,8 @@ if (router_is_active(ri, now)) { const char *id = ri->cache_info.identity_digest; uint32_t bw; - ri->is_exit = exit_policy_is_general_exit(ri->exit_policy); + ri->is_exit = (!router_exit_policy_rejects_all(ri) && + exit_policy_is_general_exit(ri->exit_policy)); uptimes[n_active] = (uint32_t)real_uptime(ri, now); mtbfs[n_active] = rep_hist_get_stability(id, now); tks [n_active] = rep_hist_get_weighted_time_known(id, now); @@ -1768,7 +1849,7 @@ /* The 12.5th percentile bandwidth is fast. */ fast_bandwidth = find_nth_uint32(bandwidths, n_active, n_active/8); /* (Now bandwidths is sorted.) */ - if (fast_bandwidth < ROUTER_REQUIRED_MIN_BANDWIDTH) + if (fast_bandwidth < ROUTER_REQUIRED_MIN_BANDWIDTH/2) fast_bandwidth = bandwidths[n_active/4]; guard_bandwidth_including_exits = bandwidths[(n_active-1)/2]; guard_tk = find_nth_long(tks, n_active, n_active/8); @@ -1808,14 +1889,15 @@ "Cutoffs: For Stable, %lu sec uptime, %lu sec MTBF. " "For Fast: %lu bytes/sec. " "For Guard: WFU %.03lf%%, time-known %lu sec, " - "and bandwidth %lu or %lu bytes/sec.", + "and bandwidth %lu or %lu bytes/sec. We%s have enough stability data.", (unsigned long)stable_uptime, (unsigned long)stable_mtbf, (unsigned long)fast_bandwidth, guard_wfu*100, (unsigned long)guard_tk, (unsigned long)guard_bandwidth_including_exits, - (unsigned long)guard_bandwidth_excluding_exits); + (unsigned long)guard_bandwidth_excluding_exits, + enough_mtbf_info ? "" : " don't "); tor_free(uptimes); tor_free(mtbfs); @@ -1834,8 +1916,8 @@ if (platform && !strcmpstart(platform, "Tor ")) { const char *eos = find_whitespace(platform+4); if (eos && !strcmpstart(eos, " (r")) { - /* XXXX021 Unify this logic with the other version extraction - * logic */ + /* XXXX Unify this logic with the other version extraction + * logic in routerparse.c. */ eos = find_whitespace(eos+1); } if (eos) { @@ -1849,17 +1931,25 @@ * which has at least buf_len free characters. Do NUL-termination. * Use the same format as in network-status documents. If version is * non-NULL, add a "v" line for the platform. Return 0 on success, -1 on - * failure. If first_line_only is true, don't include any flags - * or version line. + * failure. + * + * The format argument has three possible values: + * NS_V2 - Output an entry suitable for a V2 NS opinion document + * NS_V3_CONSENSUS - Output the first portion of a V3 NS consensus entry + * NS_V3_CONSENSUS_MICRODESC - Output the first portion of a V3 microdesc + * consensus entry. + * NS_V3_VOTE - Output a complete V3 NS vote + * NS_CONTROL_PORT - Output a NS document for the control port */ int routerstatus_format_entry(char *buf, size_t buf_len, routerstatus_t *rs, const char *version, - int first_line_only) + routerstatus_format_type_t format) { int r; struct in_addr in; char *cp; + char *summary; char published[ISO_TIME_LEN+1]; char ipaddr[INET_NTOA_BUF_LEN]; @@ -1873,10 +1963,11 @@ tor_inet_ntoa(&in, ipaddr, sizeof(ipaddr)); r = tor_snprintf(buf, buf_len, - "r %s %s %s %s %s %d %d\n", + "r %s %s %s%s%s %s %d %d\n", rs->nickname, identity64, - digest64, + (format==NS_V3_CONSENSUS_MICRODESC)?"":digest64, + (format==NS_V3_CONSENSUS_MICRODESC)?"":" ", published, ipaddr, (int)rs->or_port, @@ -1885,8 +1976,14 @@ log_warn(LD_BUG, "Not enough space in buffer."); return -1; } - if (first_line_only) + + /* TODO: Maybe we want to pass in what we need to build the rest of + * this here, instead of in the caller. Then we could use the + * networkstatus_type_t values, with an additional control port value + * added -MP */ + if (format == NS_V3_CONSENSUS || format == NS_V3_CONSENSUS_MICRODESC) return 0; + cp = buf + strlen(buf); /* NOTE: Whenever this list expands, be sure to increase MAX_FLAG_LINE_LEN*/ r = tor_snprintf(cp, buf_len - (cp-buf), @@ -1918,6 +2015,90 @@ log_warn(LD_BUG, "Unable to print router version."); return -1; } + cp += strlen(cp); + } + + if (format != NS_V2) { + routerinfo_t* desc = router_get_by_digest(rs->identity_digest); + uint32_t bw; + + if (format != NS_CONTROL_PORT) { + /* Blow up more or less nicely if we didn't get anything or not the + * thing we expected. + */ + if (!desc) { + char id[HEX_DIGEST_LEN+1]; + char dd[HEX_DIGEST_LEN+1]; + + base16_encode(id, sizeof(id), rs->identity_digest, DIGEST_LEN); + base16_encode(dd, sizeof(dd), rs->descriptor_digest, DIGEST_LEN); + log_warn(LD_BUG, "Cannot get any descriptor for %s " + "(wanted descriptor %s).", + id, dd); + return -1; + }; + + /* This assert can fire for the control port, because + * it can request NS documents before all descriptors + * have been fetched. */ + if (memcmp(desc->cache_info.signed_descriptor_digest, + rs->descriptor_digest, + DIGEST_LEN)) { + char rl_d[HEX_DIGEST_LEN+1]; + char rs_d[HEX_DIGEST_LEN+1]; + char id[HEX_DIGEST_LEN+1]; + + base16_encode(rl_d, sizeof(rl_d), + desc->cache_info.signed_descriptor_digest, DIGEST_LEN); + base16_encode(rs_d, sizeof(rs_d), rs->descriptor_digest, DIGEST_LEN); + base16_encode(id, sizeof(id), rs->identity_digest, DIGEST_LEN); + log_err(LD_BUG, "descriptor digest in routerlist does not match " + "the one in routerstatus: %s vs %s " + "(router %s)\n", + rl_d, rs_d, id); + + tor_assert(!memcmp(desc->cache_info.signed_descriptor_digest, + rs->descriptor_digest, + DIGEST_LEN)); + }; + } + + if (format == NS_CONTROL_PORT && rs->has_bandwidth) { + bw = rs->bandwidth; + } else { + tor_assert(desc); + bw = router_get_advertised_bandwidth_capped(desc) / 1000; + } + r = tor_snprintf(cp, buf_len - (cp-buf), + "w Bandwidth=%d\n", bw); + + if (r<0) { + log_warn(LD_BUG, "Not enough space in buffer."); + return -1; + } + cp += strlen(cp); + if (format == NS_V3_VOTE && rs->has_measured_bw) { + *--cp = '\0'; /* Kill "\n" */ + r = tor_snprintf(cp, buf_len - (cp-buf), + " Measured=%d\n", rs->measured_bw); + if (r<0) { + log_warn(LD_BUG, "Not enough space in buffer for weight line."); + return -1; + } + cp += strlen(cp); + } + + if (desc) { + summary = policy_summarize(desc->exit_policy); + r = tor_snprintf(cp, buf_len - (cp-buf), "p %s\n", summary); + if (r<0) { + log_warn(LD_BUG, "Not enough space in buffer."); + tor_free(summary); + return -1; + } + cp += strlen(cp); + tor_free(summary); + } } return 0; @@ -2020,9 +2201,7 @@ /** Extract status information from ri and from other authority * functions and store it in rs>. If naming, consider setting - * the named flag in rs. If not exits_can_be_guards, never mark - * an exit as a guard. If listbadexits, consider setting the badexit - * flag. + * the named flag in rs. * * We assume that ri-\>is_running has already been set, e.g. by * dirserv_set_router_is_running(ri, now); @@ -2030,11 +2209,10 @@ void set_routerstatus_from_routerinfo(routerstatus_t *rs, routerinfo_t *ri, time_t now, - int naming, int exits_can_be_guards, - int listbadexits, int listbaddirs) + int naming, int listbadexits, + int listbaddirs) { int unstable_version = - tor_version_as_new_as(ri->platform,"0.1.1.10-alpha") && !tor_version_as_new_as(ri->platform,"0.1.1.16-rc-cvs"); memset(rs, 0, sizeof(routerstatus_t)); @@ -2061,11 +2239,10 @@ rs->is_valid = ri->is_valid; if (rs->is_fast && - (!rs->is_exit || exits_can_be_guards) && (router_get_advertised_bandwidth(ri) >= BANDWIDTH_TO_GUARANTEE_GUARD || router_get_advertised_bandwidth(ri) >= - (exits_can_be_guards ? guard_bandwidth_including_exits : - guard_bandwidth_excluding_exits))) { + MIN(guard_bandwidth_including_exits, + guard_bandwidth_excluding_exits))) { long tk = rep_hist_get_weighted_time_known( ri->cache_info.identity_digest, now); double wfu = rep_hist_get_weighted_fractional_uptime( @@ -2078,10 +2255,7 @@ rs->is_bad_exit = listbadexits && ri->is_bad_exit; ri->is_hs_dir = dirserv_thinks_router_is_hs_dir(ri, now); rs->is_hs_dir = ri->is_hs_dir; - /* 0.1.1.9-alpha is the first version to support fetch by descriptor - * hash. */ - rs->is_v2_dir = ri->dir_port && - tor_version_as_new_as(ri->platform,"0.1.1.9-alpha"); + rs->is_v2_dir = ri->dir_port != 0; if (!strcasecmp(ri->nickname, UNNAMED_ROUTER_NICKNAME)) rs->is_named = rs->is_unnamed = 0; @@ -2124,9 +2298,176 @@ router->is_bad_exit = router->is_bad_directory = 0; } -/** If we've been around for less than this amount of time, our reachability - * information is not accurate. */ -#define DIRSERV_TIME_TO_GET_REACHABILITY_INFO (30*60) +/** + * Helper function to parse out a line in the measured bandwidth file + * into a measured_bw_line_t output structure. Returns -1 on failure + * or 0 on success. + */ +int +measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line) +{ + char *line = tor_strdup(orig_line); + char *cp = line; + int got_bw = 0; + int got_node_id = 0; + char *strtok_state; /* lame sauce d'jour */ + cp = tor_strtok_r(cp, " \t", &strtok_state); + + if (!cp) { + log_warn(LD_DIRSERV, "Invalid line in bandwidth file: %s", + escaped(orig_line)); + tor_free(line); + return -1; + } + + if (orig_line[strlen(orig_line)-1] != '\n') { + log_warn(LD_DIRSERV, "Incomplete line in bandwidth file: %s", + escaped(orig_line)); + tor_free(line); + return -1; + } + + do { + if (strcmpstart(cp, "bw=") == 0) { + int parse_ok = 0; + char *endptr; + if (got_bw) { + log_warn(LD_DIRSERV, "Double bw= in bandwidth file line: %s", + escaped(orig_line)); + tor_free(line); + return -1; + } + cp+=strlen("bw="); + + out->bw = tor_parse_long(cp, 0, 0, LONG_MAX, &parse_ok, &endptr); + if (!parse_ok || (*endptr && !TOR_ISSPACE(*endptr))) { + log_warn(LD_DIRSERV, "Invalid bandwidth in bandwidth file line: %s", + escaped(orig_line)); + tor_free(line); + return -1; + } + got_bw=1; + } else if (strcmpstart(cp, "node_id=$") == 0) { + if (got_node_id) { + log_warn(LD_DIRSERV, "Double node_id= in bandwidth file line: %s", + escaped(orig_line)); + tor_free(line); + return -1; + } + cp+=strlen("node_id=$"); + + if (strlen(cp) != HEX_DIGEST_LEN || + base16_decode(out->node_id, DIGEST_LEN, cp, HEX_DIGEST_LEN)) { + log_warn(LD_DIRSERV, "Invalid node_id in bandwidth file line: %s", + escaped(orig_line)); + tor_free(line); + return -1; + } + strncpy(out->node_hex, cp, sizeof(out->node_hex)); + got_node_id=1; + } + } while ((cp = tor_strtok_r(NULL, " \t", &strtok_state))); + + if (got_bw && got_node_id) { + tor_free(line); + return 0; + } else { + log_warn(LD_DIRSERV, "Incomplete line in bandwidth file: %s", + escaped(orig_line)); + tor_free(line); + return -1; + } +} + +/** + * Helper function to apply a parsed measurement line to a list + * of bandwidth statuses. Returns true if a line is found, + * false otherwise. + */ +int +measured_bw_line_apply(measured_bw_line_t *parsed_line, + smartlist_t *routerstatuses) +{ + routerstatus_t *rs = NULL; + if (!routerstatuses) + return 0; + + rs = smartlist_bsearch(routerstatuses, parsed_line->node_id, + compare_digest_to_routerstatus_entry); + + if (rs) { + rs->has_measured_bw = 1; + rs->measured_bw = (uint32_t)parsed_line->bw; + } else { + log_info(LD_DIRSERV, "Node ID %s not found in routerstatus list", + parsed_line->node_hex); + } + + return rs != NULL; +} + +/** + * Read the measured bandwidth file and apply it to the list of + * routerstatuses. Returns -1 on error, 0 otherwise. + */ +int +dirserv_read_measured_bandwidths(const char *from_file, + smartlist_t *routerstatuses) +{ + char line[256]; + FILE *fp = fopen(from_file, "r"); + int applied_lines = 0; + time_t file_time; + int ok; + if (fp == NULL) { + log_warn(LD_CONFIG, "Can't open bandwidth file at configured location: %s", + from_file); + return -1; + } + + if (!fgets(line, sizeof(line), fp) + || !strlen(line) || line[strlen(line)-1] != '\n') { + log_warn(LD_DIRSERV, "Long or truncated time in bandwidth file: %s", + escaped(line)); + fclose(fp); + return -1; + } + + line[strlen(line)-1] = '\0'; + file_time = tor_parse_ulong(line, 10, 0, ULONG_MAX, &ok, NULL); + if (!ok) { + log_warn(LD_DIRSERV, "Non-integer time in bandwidth file: %s", + escaped(line)); + fclose(fp); + return -1; + } + + if ((time(NULL) - file_time) > MAX_MEASUREMENT_AGE) { + log_warn(LD_DIRSERV, "Bandwidth measurement file stale. Age: %u", + (unsigned)(time(NULL) - file_time)); + fclose(fp); + return -1; + } + + if (routerstatuses) + smartlist_sort(routerstatuses, compare_routerstatus_entries); + + while (!feof(fp)) { + measured_bw_line_t parsed_line; + if (fgets(line, sizeof(line), fp) && strlen(line)) { + if (measured_bw_line_parse(&parsed_line, line) != -1) { + if (measured_bw_line_apply(&parsed_line, routerstatuses) > 0) + applied_lines++; + } + } + } + + fclose(fp); + log_info(LD_DIRSERV, + "Bandwidth measurement file successfully read. " + "Applied %d measurements.", applied_lines); + return 0; +} /** Return a new networkstatus_t* containing our current opinion. (For v3 * authorities) */ @@ -2145,28 +2486,25 @@ int naming = options->NamingAuthoritativeDir; int listbadexits = options->AuthDirListBadExits; int listbaddirs = options->AuthDirListBadDirs; - int exits_can_be_guards; routerlist_t *rl = router_get_routerlist(); time_t now = time(NULL); time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; networkstatus_voter_info_t *voter = NULL; vote_timing_t timing; digestmap_t *omit_as_sybil = NULL; - int vote_on_reachability = 1; + const int vote_on_reachability = running_long_enough_to_decide_unreachable(); + smartlist_t *microdescriptors = NULL; tor_assert(private_key); tor_assert(cert); - if (now - time_of_process_start < DIRSERV_TIME_TO_GET_REACHABILITY_INFO) - vote_on_reachability = 0; - if (resolve_my_address(LOG_WARN, options, &addr, &hostname)<0) { log_warn(LD_NET, "Couldn't resolve my hostname"); return NULL; } if (!strchr(hostname, '.')) { tor_free(hostname); - hostname = tor_dup_addr(addr); + hostname = tor_dup_ip(addr); } if (crypto_pk_get_digest(private_key, signing_key_digest)<0) { log_err(LD_BUG, "Error computing signing key digest"); @@ -2194,27 +2532,24 @@ dirserv_compute_performance_thresholds(rl); - /* XXXX We should take steps to keep this from oscillating if - * total_exit_bandwidth is close to total_bandwidth/3. */ - exits_can_be_guards = total_exit_bandwidth >= (total_bandwidth / 3); - routers = smartlist_create(); smartlist_add_all(routers, rl->routers); routers_sort_by_identity(routers); omit_as_sybil = get_possible_sybil_list(routers); routerstatuses = smartlist_create(); + microdescriptors = smartlist_create(); - SMARTLIST_FOREACH(routers, routerinfo_t *, ri, { + SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) { if (ri->cache_info.published_on >= cutoff) { routerstatus_t *rs; vote_routerstatus_t *vrs; + microdesc_t *md; vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); rs = &vrs->status; set_routerstatus_from_routerinfo(rs, ri, now, - naming, exits_can_be_guards, - listbadexits, listbaddirs); + naming, listbadexits, listbaddirs); if (digestmap_get(omit_as_sybil, ri->cache_info.identity_digest)) clear_status_flags_on_sybil(rs); @@ -2223,15 +2558,42 @@ rs->is_running = 0; vrs->version = version_from_platform(ri->platform); + md = dirvote_create_microdescriptor(ri); + if (md) { + char buf[128]; + vote_microdesc_hash_t *h; + dirvote_format_microdesc_vote_line(buf, sizeof(buf), md); + h = tor_malloc(sizeof(vote_microdesc_hash_t)); + h->microdesc_hash_line = tor_strdup(buf); + h->next = NULL; + vrs->microdesc = h; + md->last_listed = now; + smartlist_add(microdescriptors, md); + } + smartlist_add(routerstatuses, vrs); } - }); + } SMARTLIST_FOREACH_END(ri); + + { + smartlist_t *added = + microdescs_add_list_to_cache(get_microdesc_cache(), + microdescriptors, SAVED_NOWHERE, 0); + smartlist_free(added); + smartlist_free(microdescriptors); + } + smartlist_free(routers); digestmap_free(omit_as_sybil, NULL); + if (options->V3BandwidthsFile) { + dirserv_read_measured_bandwidths(options->V3BandwidthsFile, + routerstatuses); + } + v3_out = tor_malloc_zero(sizeof(networkstatus_t)); - v3_out->is_vote = 1; + v3_out->type = NS_TYPE_VOTE; dirvote_get_preferred_voting_intervals(&timing); v3_out->published = now; { @@ -2243,7 +2605,7 @@ last_consensus_interval = current_consensus->fresh_until - current_consensus->valid_after; else - last_consensus_interval = DEFAULT_VOTING_INTERVAL_WHEN_NO_CONSENSUS; + last_consensus_interval = options->TestingV3AuthInitialVotingInterval; v3_out->valid_after = dirvote_get_start_of_next_interval(now, (int)last_consensus_interval); format_iso_time(tbuf, v3_out->valid_after); @@ -2278,15 +2640,22 @@ } smartlist_sort_strings(v3_out->known_flags); + if (options->ConsensusParams) { + v3_out->net_params = smartlist_create(); + smartlist_split_string(v3_out->net_params, + options->ConsensusParams, NULL, 0, 0); + smartlist_sort_strings(v3_out->net_params); + } + voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); voter->nickname = tor_strdup(options->Nickname); memcpy(voter->identity_digest, identity_digest, DIGEST_LEN); + voter->sigs = smartlist_create(); voter->address = hostname; voter->addr = addr; voter->dir_port = options->DirPort; voter->or_port = options->ORPort; voter->contact = tor_strdup(contact); - memcpy(voter->signing_key_digest, signing_key_digest, DIGEST_LEN); if (options->V3AuthUseLegacyKey) { authority_cert_t *c = get_my_v3_legacy_cert(); if (c) { @@ -2330,7 +2699,6 @@ int versioning = options->VersioningAuthoritativeDir; int listbaddirs = options->AuthDirListBadDirs; int listbadexits = options->AuthDirListBadExits; - int exits_can_be_guards; const char *contact; char *version_lines = NULL; smartlist_t *routers = NULL; @@ -2410,10 +2778,6 @@ dirserv_compute_performance_thresholds(rl); - /* XXXX We should take steps to keep this from oscillating if - * total_exit_bandwidth is close to total_bandwidth/3. */ - exits_can_be_guards = total_exit_bandwidth >= (total_bandwidth / 3); - routers = smartlist_create(); smartlist_add_all(routers, rl->routers); routers_sort_by_identity(routers); @@ -2426,13 +2790,12 @@ char *version = version_from_platform(ri->platform); set_routerstatus_from_routerinfo(&rs, ri, now, - naming, exits_can_be_guards, - listbadexits, listbaddirs); + naming, listbadexits, listbaddirs); if (digestmap_get(omit_as_sybil, ri->cache_info.identity_digest)) clear_status_flags_on_sybil(&rs); - if (routerstatus_format_entry(outp, endp-outp, &rs, version, 0)) { + if (routerstatus_format_entry(outp, endp-outp, &rs, version, NS_V2)) { log_warn(LD_BUG, "Unable to print router status."); tor_free(version); goto done; @@ -2454,7 +2817,8 @@ outp += strlen(outp); note_crypto_pk_op(SIGN_DIR); - if (router_append_dirobj_signature(outp,endp-outp,digest,private_key)<0) { + if (router_append_dirobj_signature(outp,endp-outp,digest,DIGEST_LEN, + private_key)<0) { log_warn(LD_BUG, "Unable to sign router status."); goto done; } @@ -2486,10 +2850,8 @@ tor_free(status); tor_free(hostname); tor_free(identity_pkey); - if (routers) - smartlist_free(routers); - if (omit_as_sybil) - digestmap_free(omit_as_sybil, NULL); + smartlist_free(routers); + digestmap_free(omit_as_sybil, NULL); return r; } @@ -2537,7 +2899,8 @@ log_info(LD_DIRSERV, "Client requested 'all' network status objects; we have none."); } else if (!strcmpstart(key, "fp/")) { - dir_split_resource_into_fingerprints(key+3, result, NULL, 1, 1); + dir_split_resource_into_fingerprints(key+3, result, NULL, + DSR_HEX|DSR_SORT_UNIQ); } } @@ -2583,7 +2946,8 @@ */ int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, - const char **msg, int for_unencrypted_conn) + const char **msg, int for_unencrypted_conn, + int is_extrainfo) { int by_id = 1; *msg = NULL; @@ -2601,21 +2965,27 @@ } else if (!strcmpstart(key, "d/")) { by_id = 0; key += strlen("d/"); - dir_split_resource_into_fingerprints(key, fps_out, NULL, 1, 1); + dir_split_resource_into_fingerprints(key, fps_out, NULL, + DSR_HEX|DSR_SORT_UNIQ); } else if (!strcmpstart(key, "fp/")) { key += strlen("fp/"); - dir_split_resource_into_fingerprints(key, fps_out, NULL, 1, 1); + dir_split_resource_into_fingerprints(key, fps_out, NULL, + DSR_HEX|DSR_SORT_UNIQ); } else { *msg = "Key not recognized"; return -1; } if (for_unencrypted_conn) { - /* Remove anything whose purpose isn't general. */ + /* Remove anything that insists it not be sent unencrypted. */ SMARTLIST_FOREACH(fps_out, char *, cp, { - signed_descriptor_t *sd = - by_id ? get_signed_descriptor_by_fp(cp,0,0) : - router_get_by_descriptor_digest(cp); + 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); @@ -2645,8 +3015,8 @@ * If -1 is returned *msg will be set to an appropriate error * message. * - * XXXX021 rename this function. It's only called from the controller. - * XXXX021 in fact, refactor this function, mergeing as much as possible. + * XXXX rename this function. It's only called from the controller. + * XXXX in fact, refactor this function, merging as much as possible. */ int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, @@ -2665,7 +3035,8 @@ } else if (!strcmpstart(key, "/tor/server/d/")) { smartlist_t *digests = smartlist_create(); key += strlen("/tor/server/d/"); - dir_split_resource_into_fingerprints(key, digests, NULL, 1, 1); + dir_split_resource_into_fingerprints(key, digests, NULL, + DSR_HEX|DSR_SORT_UNIQ); SMARTLIST_FOREACH(digests, const char *, d, { signed_descriptor_t *sd = router_get_by_descriptor_digest(d); @@ -2678,7 +3049,8 @@ smartlist_t *digests = smartlist_create(); time_t cutoff = time(NULL) - ROUTER_MAX_AGE_TO_PUBLISH; key += strlen("/tor/server/fp/"); - dir_split_resource_into_fingerprints(key, digests, NULL, 1, 1); + dir_split_resource_into_fingerprints(key, digests, NULL, + DSR_HEX|DSR_SORT_UNIQ); SMARTLIST_FOREACH(digests, const char *, d, { if (router_digest_is_me(d)) { @@ -2747,8 +3119,48 @@ * skip testing. */ } -/** Auth dir server only: if try_all is 1, launch connections to - * all known routers; else we want to load balance such that we only +/** Called when we, as an authority, receive a new router descriptor either as + * an upload or a download. Used to decide whether to relaunch reachability + * testing for the server. */ +int +dirserv_should_launch_reachability_test(routerinfo_t *ri, routerinfo_t *ri_old) +{ + if (!authdir_mode_handles_descs(get_options(), ri->purpose)) + return 0; + if (!ri_old) { + /* New router: Launch an immediate reachability test, so we will have an + * opinion soon in case we're generating a consensus soon */ + return 1; + } + if (ri_old->is_hibernating && !ri->is_hibernating) { + /* It just came out of hibernation; launch a reachability test */ + return 1; + } + if (! routers_have_same_or_addr(ri, ri_old)) { + /* Address or port changed; launch a reachability test */ + return 1; + } + return 0; +} + +/** Helper function for dirserv_test_reachability(). Start a TLS + * connection to router, and annotate it with when we started + * the test. */ +void +dirserv_single_reachability_test(time_t now, routerinfo_t *router) +{ + tor_addr_t router_addr; + log_debug(LD_OR,"Testing reachability of %s at %s:%u.", + router->nickname, router->address, router->or_port); + /* Remember when we started trying to determine reachability */ + if (!router->testing_since) + router->testing_since = now; + tor_addr_from_ipv4h(&router_addr, router->addr); + connection_or_connect(&router_addr, router->or_port, + router->cache_info.identity_digest); +} + +/** Auth dir server only: load balance such that we only * try a few connections per call. * * The load balancing is such that if we get called once every ten @@ -2756,7 +3168,7 @@ * bit over 20 minutes). */ void -dirserv_test_reachability(time_t now, int try_all) +dirserv_test_reachability(time_t now) { /* XXX decide what to do here; see or-talk thread "purging old router * information, revocation." -NM @@ -2771,7 +3183,7 @@ static char ctr = 0; int bridge_auth = authdir_mode_bridge(get_options()); - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, router, { + SMARTLIST_FOREACH_BEGIN(rl->routers, routerinfo_t *, router) { const char *id_digest = router->cache_info.identity_digest; if (router_is_me(router)) continue; @@ -2779,31 +3191,27 @@ continue; /* bridge authorities only test reachability on bridges */ // if (router->cache_info.published_on > cutoff) // continue; - if (try_all || (((uint8_t)id_digest[0]) % 128) == ctr) { - log_debug(LD_OR,"Testing reachability of %s at %s:%u.", - router->nickname, router->address, router->or_port); - /* Remember when we started trying to determine reachability */ - if (!router->testing_since) - router->testing_since = now; - connection_or_connect(router->addr, router->or_port, - id_digest); + if ((((uint8_t)id_digest[0]) % 128) == ctr) { + dirserv_single_reachability_test(now, router); } - }); - if (!try_all) /* increment ctr */ - ctr = (ctr + 1) % 128; + } SMARTLIST_FOREACH_END(router); + ctr = (ctr + 1) % 128; /* increment ctr */ } -/** Given a fingerprint fp which is either set if we're looking - * for a v2 status, or zeroes if we're looking for a v3 status, return - * a pointer to the appropriate cached dir object, or NULL if there isn't - * one available. */ +/** Given a fingerprint fp 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) { cached_dir_t *d = NULL; - if (tor_digest_is_zero(fp) && cached_v3_networkstatus) - d = cached_v3_networkstatus; - else if (router_digest_is_me(fp) && the_v2_networkstatus) + 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 XXXX022 */; + } else if (router_digest_is_me(fp) && the_v2_networkstatus) d = the_v2_networkstatus; else if (cached_v2_networkstatus) d = digestmap_get(cached_v2_networkstatus, fp); @@ -2862,7 +3270,7 @@ return NULL; } -/** Return true iff we have any of the docments (extrainfo or routerdesc) +/** Return true iff we have any of the documents (extrainfo or routerdesc) * specified by the fingerprints in fps and spool_src. Used to * decide whether to send a 404. */ int @@ -2889,6 +3297,18 @@ return 0; } +/** Return true iff any of the 256-bit elements in fps is the digest of + * a microdescriptor we have. */ +int +dirserv_have_any_microdesc(const smartlist_t *fps) +{ + 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; +} + /** 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 @@ -2908,7 +3328,7 @@ routerinfo_t *me = router_get_my_routerinfo(); result = (me?me->cache_info.signed_descriptor_len:2048) * n; if (compressed) - result /= 2; /* observed compressability is between 35 and 55%. */ + result /= 2; /* observed compressibility is between 35 and 55%. */ } else { result = 0; SMARTLIST_FOREACH(fps, const char *, digest, { @@ -2920,6 +3340,17 @@ 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; +} + /** When we're spooling data onto our outbuf, add more whenever we dip * below this threshold. */ #define DIRSERV_BUFFER_MIN 16384 @@ -2948,6 +3379,9 @@ static int connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn) { +#ifdef TRACK_SERVED_TIME + time_t now = time(NULL); +#endif 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 || @@ -2975,9 +3409,13 @@ * unknown bridge descriptor has shown up between then and now. */ continue; } - +#ifdef TRACK_SERVED_TIME + sd->last_served_at = now; +#endif body = signed_descriptor_get_body(sd); if (conn->zlib_state) { + /* XXXX022 This 'last' business should actually happen on the last + * routerinfo, not on the last fingerprint. */ int last = ! smartlist_len(conn->fingerprint_stack); connection_write_to_buf_zlib(body, sd->signed_descriptor_len, conn, last); @@ -3001,6 +3439,44 @@ 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) && + buf_datalen(conn->_base.outbuf) < 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) + continue; + if (conn->zlib_state) { + /* XXXX022 This 'last' business should actually happen on the last + * routerinfo, not on the last fingerprint. */ + 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)) { + conn->dir_spool_src = DIR_SPOOL_NONE; + smartlist_free(conn->fingerprint_stack); + conn->fingerprint_stack = NULL; + } + return 0; +} + /** Spooling helper: Called when we're sending a directory or networkstatus, * and the outbuf has become too empty. Pulls some bytes from * conn-\>cached_dir-\>dir_z, uncompresses them if appropriate, and @@ -3083,8 +3559,7 @@ } } else { connection_dirserv_finish_spooling(conn); - if (conn->fingerprint_stack) - smartlist_free(conn->fingerprint_stack); + smartlist_free(conn->fingerprint_stack); conn->fingerprint_stack = NULL; return 0; } @@ -3108,6 +3583,8 @@ 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: @@ -3129,10 +3606,10 @@ cached_dir_decref(the_v2_networkstatus); cached_dir_decref(cached_directory); clear_cached_dir(&cached_runningrouters); - if (cached_v2_networkstatus) { - digestmap_free(cached_v2_networkstatus, _free_cached_dir); - cached_v2_networkstatus = NULL; - } - cached_dir_decref(cached_v3_networkstatus); + + digestmap_free(cached_v2_networkstatus, _free_cached_dir); + cached_v2_networkstatus = NULL; + strmap_free(cached_consensuses, _free_cached_dir); + cached_consensuses = NULL; } diff -Nru tor-0.2.0.34/src/or/dirserv.h tor-0.2.2.16-alpha/src/or/dirserv.h --- tor-0.2.0.34/src/or/dirserv.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/dirserv.h 2010-09-17 01:30:36.000000000 +0000 @@ -0,0 +1,134 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file dirserv.h + * \brief Header file for dirserv.c. + **/ + +#ifndef _TOR_DIRSERV_H +#define _TOR_DIRSERV_H + +/** Maximum length of an exit policy summary. */ +#define MAX_EXITPOLICY_SUMMARY_LEN 1000 + +/** Maximum allowable length of a version line in a networkstatus. */ +#define MAX_V_LINE_LEN 128 +/** Length of "r Authority BadDirectory BadExit Exit Fast Guard HSDir Named + * Running Stable Unnamed V2Dir Valid\n". */ +#define MAX_FLAG_LINE_LEN 96 +/** Length of "w" line for weighting. Currently at most + * "w Bandwidth= Measured=\n" */ +#define MAX_WEIGHT_LINE_LEN (12+10+10+10+1) +/** Maximum length of an exit policy summary line. */ +#define MAX_POLICY_LINE_LEN (3+MAX_EXITPOLICY_SUMMARY_LEN) +/** Amount of space to allocate for each entry: r, s, and v lines. */ +#define RS_ENTRY_LEN \ + ( /* first line */ \ + MAX_NICKNAME_LEN+BASE64_DIGEST_LEN*2+ISO_TIME_LEN+INET_NTOA_BUF_LEN+ \ + 5*2 /* ports */ + 10 /* punctuation */ + \ + /* second line */ \ + MAX_FLAG_LINE_LEN + \ + /* weight line */ \ + MAX_WEIGHT_LINE_LEN + \ + /* p line. */ \ + MAX_POLICY_LINE_LEN + \ + /* v line. */ \ + MAX_V_LINE_LEN \ + ) + +#define UNNAMED_ROUTER_NICKNAME "Unnamed" + +int connection_dirserv_flushed_some(dir_connection_t *conn); + +int dirserv_add_own_fingerprint(const char *nickname, crypto_pk_env_t *pk); +int dirserv_load_fingerprint_file(void); +void dirserv_free_fingerprint_list(void); +const char *dirserv_get_nickname_by_digest(const char *digest); +enum was_router_added_t dirserv_add_multiple_descriptors( + const char *desc, uint8_t purpose, + const char *source, + const char **msg); +enum was_router_added_t dirserv_add_descriptor(routerinfo_t *ri, + const char **msg, + const char *source); +void dirserv_set_router_is_running(routerinfo_t *router, time_t now); +int list_server_status_v1(smartlist_t *routers, char **router_status_out, + int for_controller); +int dirserv_dump_directory_to_string(char **dir_out, + crypto_pk_env_t *private_key); + +int directory_fetches_from_authorities(or_options_t *options); +int directory_fetches_dir_info_early(or_options_t *options); +int directory_fetches_dir_info_later(or_options_t *options); +int directory_caches_v2_dir_info(or_options_t *options); +#define directory_caches_v1_dir_info(o) directory_caches_v2_dir_info(o) +int directory_caches_dir_info(or_options_t *options); +int directory_permits_begindir_requests(or_options_t *options); +int directory_permits_controller_requests(or_options_t *options); +int directory_too_idle_to_fetch_descriptors(or_options_t *options, time_t now); + +void directory_set_dirty(void); +cached_dir_t *dirserv_get_directory(void); +cached_dir_t *dirserv_get_runningrouters(void); +cached_dir_t *dirserv_get_consensus(const char *flavor_name); +void dirserv_set_cached_directory(const char *directory, time_t when, + int is_running_routers); +void dirserv_set_cached_networkstatus_v2(const char *directory, + const char *identity, + time_t published); +void dirserv_set_cached_consensus_networkstatus(const char *consensus, + const char *flavor_name, + const digests_t *digests, + time_t published); +void dirserv_clear_old_networkstatuses(time_t cutoff); +void dirserv_clear_old_v1_info(time_t now); +void dirserv_get_networkstatus_v2(smartlist_t *result, const char *key); +void dirserv_get_networkstatus_v2_fingerprints(smartlist_t *result, + const char *key); +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_routerdescs(smartlist_t *descs_out, const char *key, + const char **msg); +void dirserv_orconn_tls_done(const char *address, + uint16_t or_port, + const char *digest_rcvd, + int as_advertised); +int dirserv_should_launch_reachability_test(routerinfo_t *ri, + routerinfo_t *ri_old); +void dirserv_single_reachability_test(time_t now, routerinfo_t *router); +void dirserv_test_reachability(time_t now); +int authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, + int complain); +int dirserv_would_reject_router(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); + +int routerstatus_format_entry(char *buf, size_t buf_len, + routerstatus_t *rs, const char *platform, + routerstatus_format_type_t format); +void dirserv_free_all(void); +void cached_dir_decref(cached_dir_t *d); +cached_dir_t *new_cached_dir(char *s, time_t published); + +#ifdef DIRSERV_PRIVATE +int measured_bw_line_parse(measured_bw_line_t *out, const char *line); + +int measured_bw_line_apply(measured_bw_line_t *parsed_line, + smartlist_t *routerstatuses); +#endif + +int dirserv_read_measured_bandwidths(const char *from_file, + smartlist_t *routerstatuses); + +#endif + diff -Nru tor-0.2.0.34/src/or/dirvote.c tor-0.2.2.16-alpha/src/or/dirvote.c --- tor-0.2.0.34/src/or/dirvote.c 2008-12-02 22:41:44.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/dirvote.c 2010-08-31 21:22:13.000000000 +0000 @@ -1,34 +1,76 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: dirvote.c 17447 2008-12-02 19:16:11Z nickm $ */ -const char dirvote_c_id[] = - "$Id: dirvote.c 17447 2008-12-02 19:16:11Z nickm $"; #define DIRVOTE_PRIVATE #include "or.h" +#include "config.h" +#include "directory.h" +#include "dirserv.h" +#include "dirvote.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "policies.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" /** * \file dirvote.c * \brief Functions to compute directory consensus, and schedule voting. **/ -static int dirvote_add_signatures_to_pending_consensus( +/** A consensus that we have built and are appending signatures to. Once it's + * time to publish it, it will become an active consensus if it accumulates + * enough signatures. */ +typedef struct pending_consensus_t { + /** The body of the consensus that we're currently building. Once we + * have it built, it goes into dirserv.c */ + char *body; + /** The parsed in-progress consensus document. */ + networkstatus_t *consensus; +} pending_consensus_t; + +static int dirvote_add_signatures_to_all_pending_consensuses( const char *detached_signatures_body, const char **msg_out); +static int dirvote_add_signatures_to_pending_consensus( + pending_consensus_t *pc, + ns_detached_signatures_t *sigs, + const char **msg_out); static char *list_v3_auth_ids(void); static void dirvote_fetch_missing_votes(void); static void dirvote_fetch_missing_signatures(void); static int dirvote_perform_vote(void); static void dirvote_clear_votes(int all_votes); -static int dirvote_compute_consensus(void); +static int dirvote_compute_consensuses(void); static int dirvote_publish_consensus(void); +static char *make_consensus_method_list(int low, int high, const char *sep); + +/** The highest consensus method that we currently support. */ +#define MAX_SUPPORTED_CONSENSUS_METHOD 9 + +/** Lowest consensus method that contains a 'directory-footer' marker */ +#define MIN_METHOD_FOR_FOOTER 9 + +/** Lowest consensus method that contains bandwidth weights */ +#define MIN_METHOD_FOR_BW_WEIGHTS 9 + +/** Lowest consensus method that contains consensus params */ +#define MIN_METHOD_FOR_PARAMS 7 + +/** Lowest consensus method that generates microdescriptors */ +#define MIN_METHOD_FOR_MICRODESC 8 /* ===== * Voting * =====*/ +/* Overestimated. */ +#define MICRODESC_LINE_LEN 80 + /** Return a new string containing the string representation of the vote in * v3_ns, signed with our v3 signing key private_signing_key. * For v3 authorities. */ @@ -47,9 +89,11 @@ uint32_t addr; routerlist_t *rl = router_get_routerlist(); char *version_lines = NULL; + int r; networkstatus_voter_info_t *voter; tor_assert(private_signing_key); + tor_assert(v3_ns->type == NS_TYPE_VOTE || v3_ns->type == NS_TYPE_OPINION); voter = smartlist_get(v3_ns->voters, 0); @@ -72,20 +116,30 @@ version_lines = tor_malloc(v_len); cp = version_lines; if (client_versions) { - tor_snprintf(cp, v_len-(cp-version_lines), + r = tor_snprintf(cp, v_len-(cp-version_lines), "client-versions %s\n", client_versions); + if (r < 0) { + log_err(LD_BUG, "Insufficient memory for client-versions line"); + tor_assert(0); + } cp += strlen(cp); } - if (server_versions) - tor_snprintf(cp, v_len-(cp-version_lines), + if (server_versions) { + r = tor_snprintf(cp, v_len-(cp-version_lines), "server-versions %s\n", server_versions); + if (r < 0) { + log_err(LD_BUG, "Insufficient memory for server-versions line"); + tor_assert(0); + } + } } else { version_lines = tor_strdup(""); } len = 8192; len += strlen(version_lines); - len += (RS_ENTRY_LEN)*smartlist_len(rl->routers); + len += (RS_ENTRY_LEN+MICRODESC_LINE_LEN)*smartlist_len(rl->routers); + len += strlen("\ndirectory-footer\n"); len += v3_ns->cert->cache_info.signed_descriptor_len; status = tor_malloc(len); @@ -95,17 +149,25 @@ char fu[ISO_TIME_LEN+1]; char vu[ISO_TIME_LEN+1]; char *flags = smartlist_join_strings(v3_ns->known_flags, " ", 0, NULL); + char *params; authority_cert_t *cert = v3_ns->cert; + char *methods = + make_consensus_method_list(1, MAX_SUPPORTED_CONSENSUS_METHOD, " "); format_iso_time(published, v3_ns->published); format_iso_time(va, v3_ns->valid_after); format_iso_time(fu, v3_ns->fresh_until); format_iso_time(vu, v3_ns->valid_until); + if (v3_ns->net_params) + params = smartlist_join_strings(v3_ns->net_params, " ", 0, NULL); + else + params = tor_strdup(""); + tor_assert(cert); - tor_snprintf(status, len, + r = tor_snprintf(status, len, "network-status-version 3\n" - "vote-status vote\n" - "consensus-methods 1 2 3\n" + "vote-status %s\n" + "consensus-methods %s\n" "published %s\n" "valid-after %s\n" "fresh-until %s\n" @@ -113,23 +175,38 @@ "voting-delay %d %d\n" "%s" /* versions */ "known-flags %s\n" + "params %s\n" "dir-source %s %s %s %s %d %d\n" "contact %s\n", + v3_ns->type == NS_TYPE_VOTE ? "vote" : "opinion", + methods, published, va, fu, vu, v3_ns->vote_seconds, v3_ns->dist_seconds, version_lines, flags, + params, voter->nickname, fingerprint, voter->address, - ipaddr, voter->dir_port, voter->or_port, voter->contact); + ipaddr, voter->dir_port, voter->or_port, voter->contact); + + if (r < 0) { + log_err(LD_BUG, "Insufficient memory for network status line"); + tor_assert(0); + } + tor_free(params); tor_free(flags); + tor_free(methods); outp = status + strlen(status); endp = status + len; if (!tor_digest_is_zero(voter->legacy_id_digest)) { char fpbuf[HEX_DIGEST_LEN+1]; base16_encode(fpbuf, sizeof(fpbuf), voter->legacy_id_digest, DIGEST_LEN); - tor_snprintf(outp, endp-outp, "legacy-dir-key %s\n", fpbuf); + r = tor_snprintf(outp, endp-outp, "legacy-dir-key %s\n", fpbuf); + if (r < 0) { + log_err(LD_BUG, "Insufficient memory for legacy-dir-key line"); + tor_assert(0); + } outp += strlen(outp); } @@ -140,15 +217,32 @@ outp += cert->cache_info.signed_descriptor_len; } - SMARTLIST_FOREACH(v3_ns->routerstatus_list, vote_routerstatus_t *, vrs, - { + SMARTLIST_FOREACH_BEGIN(v3_ns->routerstatus_list, vote_routerstatus_t *, + vrs) { + vote_microdesc_hash_t *h; if (routerstatus_format_entry(outp, endp-outp, &vrs->status, - vrs->version, 0) < 0) { + vrs->version, NS_V3_VOTE) < 0) { log_warn(LD_BUG, "Unable to print router status."); goto err; } outp += strlen(outp); - }); + + for (h = vrs->microdesc; h; h = h->next) { + size_t mlen = strlen(h->microdesc_hash_line); + if (outp+mlen >= endp) { + log_warn(LD_BUG, "Can't fit microdesc line in vote."); + } + memcpy(outp, h->microdesc_hash_line, mlen+1); + outp += strlen(outp); + } + } SMARTLIST_FOREACH_END(vrs); + + r = tor_snprintf(outp, endp-outp, "directory-footer\n"); + if (r < 0) { + log_err(LD_BUG, "Insufficient memory for directory-footer line"); + tor_assert(0); + } + outp += strlen(outp); { char signing_key_fingerprint[FINGERPRINT_LEN+1]; @@ -171,10 +265,10 @@ outp += strlen(outp); } - if (router_get_networkstatus_v3_hash(status, digest)<0) + if (router_get_networkstatus_v3_hash(status, digest, DIGEST_SHA1)<0) goto err; note_crypto_pk_op(SIGN_DIR); - if (router_append_dirobj_signature(outp,endp-outp,digest, + if (router_append_dirobj_signature(outp,endp-outp,digest, DIGEST_LEN, private_signing_key)<0) { log_warn(LD_BUG, "Unable to sign networkstatus vote."); goto err; @@ -182,9 +276,11 @@ { networkstatus_t *v; - if (!(v = networkstatus_parse_vote_from_string(status, NULL, 1))) { - log_err(LD_BUG,"Generated a networkstatus vote we couldn't parse: " - "<<%s>>", status); + if (!(v = networkstatus_parse_vote_from_string(status, NULL, + v3_ns->type))) { + log_err(LD_BUG,"Generated a networkstatus %s we couldn't parse: " + "<<%s>>", + v3_ns->type == NS_TYPE_VOTE ? "vote" : "opinion", status); goto err; } networkstatus_vote_free(v); @@ -209,13 +305,30 @@ get_voter(const networkstatus_t *vote) { tor_assert(vote); - tor_assert(vote->is_vote); + tor_assert(vote->type == NS_TYPE_VOTE); tor_assert(vote->voters); tor_assert(smartlist_len(vote->voters) == 1); return smartlist_get(vote->voters, 0); } -typedef struct { +/** Return the signature made by voter using the algorithm + * alg, or NULL if none is found. */ +document_signature_t * +voter_get_sig_by_algorithm(const networkstatus_voter_info_t *voter, + digest_algorithm_t alg) +{ + if (!voter->sigs) + return NULL; + SMARTLIST_FOREACH(voter->sigs, document_signature_t *, sig, + if (sig->alg == alg) + return sig); + return NULL; +} + +/** Temporary structure used in constructing a list of dir-source entries + * for a consensus. One of these is generated for every vote, and one more + * for every legacy key in each vote. */ +typedef struct dir_src_ent_t { networkstatus_t *v; const char *digest; int is_legacy; @@ -231,6 +344,9 @@ get_voter(b)->identity_digest, DIGEST_LEN); } +/** Helper: Compare the dir_src_ent_ts in *_a and *_b by + * their identity digests, and return -1, 0, or 1 depending on their + * ordering */ static int _compare_dir_src_ents_by_authority_id(const void **_a, const void **_b) { @@ -268,34 +384,8 @@ /** Given a sorted list of strings lst, return the member that appears * most. Break ties in favor of later-occurring members. */ -static const char * -get_most_frequent_member(smartlist_t *lst) -{ - const char *most_frequent = NULL; - int most_frequent_count = 0; - - const char *cur = NULL; - int count = 0; - - SMARTLIST_FOREACH(lst, const char *, s, - { - if (cur && !strcmp(s, cur)) { - ++count; - } else { - if (count >= most_frequent_count) { - most_frequent = cur; - most_frequent_count = count; - } - cur = s; - count = 1; - } - }); - if (count >= most_frequent_count) { - most_frequent = cur; - most_frequent_count = count; - } - return most_frequent; -} +#define get_most_frequent_member(lst) \ + smartlist_get_most_frequent_string(lst) /** Return 0 if and only if a and b are routerstatuses * that come from the same routerinfo, with the same derived elements. @@ -333,15 +423,21 @@ /** Given a list of vote_routerstatus_t, all for the same router identity, * return whichever is most frequent, breaking ties in favor of more - * recently published vote_routerstatus_t. + * recently published vote_routerstatus_t and in case of ties there, + * in favor of smaller descriptor digest. */ static vote_routerstatus_t * -compute_routerstatus_consensus(smartlist_t *votes) +compute_routerstatus_consensus(smartlist_t *votes, int consensus_method, + char *microdesc_digest256_out) { vote_routerstatus_t *most = NULL, *cur = NULL; int most_n = 0, cur_n = 0; time_t most_published = 0; + /* _compare_vote_rs() sorts the items by identity digest (all the same), + * then by SD digest. That way, if we have a tie that the published_on + * date cannot tie, we use the descriptor with the smaller digest. + */ smartlist_sort(votes, _compare_vote_rs); SMARTLIST_FOREACH(votes, vote_routerstatus_t *, rs, { @@ -368,18 +464,45 @@ } tor_assert(most); + + if (consensus_method >= MIN_METHOD_FOR_MICRODESC && + microdesc_digest256_out) { + smartlist_t *digests = smartlist_create(); + const char *best_microdesc_digest; + SMARTLIST_FOREACH_BEGIN(votes, vote_routerstatus_t *, rs) { + char d[DIGEST256_LEN]; + if (compare_vote_rs(rs, most)) + continue; + if (!vote_routerstatus_find_microdesc_hash(d, rs, consensus_method, + DIGEST_SHA256)) + smartlist_add(digests, tor_memdup(d, sizeof(d))); + } SMARTLIST_FOREACH_END(rs); + smartlist_sort_digests256(digests); + best_microdesc_digest = smartlist_get_most_frequent_digest256(digests); + if (best_microdesc_digest) + memcpy(microdesc_digest256_out, best_microdesc_digest, DIGEST256_LEN); + SMARTLIST_FOREACH(digests, char *, cp, tor_free(cp)); + smartlist_free(digests); + } + return most; } -/** Given a list of strings in lst, set the DIGEST_LEN-byte digest at - * digest_out to the hash of the concatenation of those strings. */ +/** Given a list of strings in lst, set the len_out-byte digest + * at digest_out to the hash of the concatenation of those strings, + * computed with the algorithm alg. */ static void -hash_list_members(char *digest_out, smartlist_t *lst) +hash_list_members(char *digest_out, size_t len_out, + smartlist_t *lst, digest_algorithm_t alg) { - crypto_digest_env_t *d = crypto_new_digest_env(); + crypto_digest_env_t *d; + if (alg == DIGEST_SHA1) + d = crypto_new_digest_env(); + else + d = crypto_new_digest256_env(alg); SMARTLIST_FOREACH(lst, const char *, cp, crypto_digest_add_bytes(d, cp, strlen(cp))); - crypto_digest_get_digest(d, digest_out, DIGEST_LEN); + crypto_digest_get_digest(d, digest_out, len_out); crypto_free_digest_env(d); } @@ -443,7 +566,510 @@ static int consensus_method_is_supported(int method) { - return (method >= 1) && (method <= 3); + return (method >= 1) && (method <= MAX_SUPPORTED_CONSENSUS_METHOD); +} + +/** Return a newly allocated string holding the numbers between low and high + * (inclusive) that are supported consensus methods. */ +static char * +make_consensus_method_list(int low, int high, const char *separator) +{ + char *list; + + char b[32]; + int i; + smartlist_t *lst; + lst = smartlist_create(); + for (i = low; i <= high; ++i) { + if (!consensus_method_is_supported(i)) + continue; + tor_snprintf(b, sizeof(b), "%d", i); + smartlist_add(lst, tor_strdup(b)); + } + list = smartlist_join_strings(lst, separator, 0, NULL); + tor_assert(list); + SMARTLIST_FOREACH(lst, char *, cp, tor_free(cp)); + smartlist_free(lst); + return list; +} + +/** Helper: given lst, a list of version strings such that every + * version appears once for every versioning voter who recommends it, return a + * newly allocated string holding the resulting client-versions or + * server-versions list. May change contents of lst */ +static char * +compute_consensus_versions_list(smartlist_t *lst, int n_versioning) +{ + int min = n_versioning / 2; + smartlist_t *good = smartlist_create(); + char *result; + sort_version_list(lst, 0); + get_frequent_members(good, lst, min); + result = smartlist_join_strings(good, ",", 0, NULL); + smartlist_free(good); + return result; +} + +/** Helper: given a list of valid networkstatus_t, return a new string + * containing the contents of the consensus network parameter set. + */ +/* private */ char * +dirvote_compute_params(smartlist_t *votes) +{ + int i; + int32_t *vals; + + int cur_param_len; + const char *cur_param; + const char *eq; + char *result; + + const int n_votes = smartlist_len(votes); + smartlist_t *output; + smartlist_t *param_list = smartlist_create(); + + /* We require that the parameter lists in the votes are well-formed: that + is, that their keywords are unique and sorted, and that their values are + between INT32_MIN and INT32_MAX inclusive. This should be guaranteed by + the parsing code. */ + + vals = tor_malloc(sizeof(int)*n_votes); + + SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { + if (!v->net_params) + continue; + smartlist_add_all(param_list, v->net_params); + } SMARTLIST_FOREACH_END(v); + + if (smartlist_len(param_list) == 0) { + tor_free(vals); + smartlist_free(param_list); + return NULL; + } + + smartlist_sort_strings(param_list); + i = 0; + cur_param = smartlist_get(param_list, 0); + eq = strchr(cur_param, '='); + tor_assert(eq); + cur_param_len = (int)(eq+1 - cur_param); + + output = smartlist_create(); + + SMARTLIST_FOREACH_BEGIN(param_list, const char *, param) { + const char *next_param; + int ok=0; + eq = strchr(param, '='); + tor_assert(i weight_scale) { + log_warn(LD_DIR, "Bw %s: Wgg="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wgg), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + + Wgg = MAX(MIN(Wgg, weight_scale), 0); + } + if (Wgd < 0 || Wgd > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wgd="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wgd), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wgd = MAX(MIN(Wgd, weight_scale), 0); + } + if (Wmg < 0 || Wmg > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wmg="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wmg), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wmg = MAX(MIN(Wmg, weight_scale), 0); + } + if (Wme < 0 || Wme > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wme="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wme), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wme = MAX(MIN(Wme, weight_scale), 0); + } + if (Wmd < 0 || Wmd > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wmd="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wmd), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wmd = MAX(MIN(Wmd, weight_scale), 0); + } + if (Wee < 0 || Wee > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wee="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wee), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wee = MAX(MIN(Wee, weight_scale), 0); + } + if (Wed < 0 || Wed > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wed="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wed), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wed = MAX(MIN(Wed, weight_scale), 0); + } + + // Add consensus weight keywords + smartlist_add(chunks, tor_strdup("bandwidth-weights ")); + /* + * Provide Wgm=Wgg, Wmm=1, Wem=Wee, Weg=Wed. May later determine + * that middle nodes need different bandwidth weights for dirport traffic, + * or that weird exit policies need special weight, or that bridges + * need special weight. + * + * NOTE: This list is sorted. + */ + r = tor_snprintf(buf, sizeof(buf), + "Wbd=%d Wbe=%d Wbg=%d Wbm=%d " + "Wdb=%d " + "Web=%d Wed=%d Wee=%d Weg=%d Wem=%d " + "Wgb=%d Wgd=%d Wgg=%d Wgm=%d " + "Wmb=%d Wmd=%d Wme=%d Wmg=%d Wmm=%d\n", + (int)Wmd, (int)Wme, (int)Wmg, (int)weight_scale, + (int)weight_scale, + (int)weight_scale, (int)Wed, (int)Wee, (int)Wed, (int)Wee, + (int)weight_scale, (int)Wgd, (int)Wgg, (int)Wgg, + (int)weight_scale, (int)Wmd, (int)Wme, (int)Wmg, (int)weight_scale); + if (r<0) { + log_warn(LD_BUG, + "Not enough space in buffer for bandwidth-weights line."); + *buf = '\0'; + } + smartlist_add(chunks, tor_strdup(buf)); + log_notice(LD_CIRC, "Computed bandwidth weights for %s: " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); } /** Given a list of vote networkstatus_t in votes, our public @@ -460,18 +1086,26 @@ crypto_pk_env_t *identity_key, crypto_pk_env_t *signing_key, const char *legacy_id_key_digest, - crypto_pk_env_t *legacy_signing_key) + crypto_pk_env_t *legacy_signing_key, + consensus_flavor_t flavor) { smartlist_t *chunks; char *result = NULL; int consensus_method; - time_t valid_after, fresh_until, valid_until; int vote_seconds, dist_seconds; char *client_versions = NULL, *server_versions = NULL; smartlist_t *flags; + const char *flavor_name; + int64_t G=0, M=0, E=0, D=0, T=0; /* For bandwidth weights */ + const routerstatus_format_type_t rs_format = + flavor == FLAV_NS ? NS_V3_CONSENSUS : NS_V3_CONSENSUS_MICRODESC; + char *params = NULL; + tor_assert(flavor == FLAV_NS || flavor == FLAV_MICRODESC); tor_assert(total_authorities >= smartlist_len(votes)); + flavor_name = networkstatus_get_flavor_name(flavor); + if (!smartlist_len(votes)) { log_warn(LD_DIR, "Can't compute a consensus from no votes."); return NULL; @@ -501,10 +1135,9 @@ int n_versioning_clients = 0, n_versioning_servers = 0; smartlist_t *combined_client_versions = smartlist_create(); smartlist_t *combined_server_versions = smartlist_create(); - int j; - SMARTLIST_FOREACH(votes, networkstatus_t *, v, - { - tor_assert(v->is_vote); + + SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { + tor_assert(v->type == NS_TYPE_VOTE); va_times[v_sl_idx] = v->valid_after; fu_times[v_sl_idx] = v->fresh_until; vu_times[v_sl_idx] = v->valid_until; @@ -530,7 +1163,7 @@ } SMARTLIST_FOREACH(v->known_flags, const char *, cp, smartlist_add(flags, tor_strdup(cp))); - }); + } SMARTLIST_FOREACH_END(v); valid_after = median_time(va_times, n_votes); fresh_until = median_time(fu_times, n_votes); valid_until = median_time(vu_times, n_votes); @@ -542,23 +1175,15 @@ tor_assert(vote_seconds >= MIN_VOTE_SECONDS); tor_assert(dist_seconds >= MIN_DIST_SECONDS); - for (j = 0; j < 2; ++j) { - smartlist_t *lst = - j ? combined_server_versions : combined_client_versions; - int min = (j ? n_versioning_servers : n_versioning_clients) / 2; - smartlist_t *good = smartlist_create(); - char *res; - sort_version_list(lst, 0); - get_frequent_members(good, lst, min); - res = smartlist_join_strings(good, ",", 0, NULL); - if (j) - server_versions = res; - else - client_versions = res; - SMARTLIST_FOREACH(lst, char *, cp, tor_free(cp)); - smartlist_free(good); - smartlist_free(lst); - } + server_versions = compute_consensus_versions_list(combined_server_versions, + n_versioning_servers); + client_versions = compute_consensus_versions_list(combined_client_versions, + n_versioning_clients); + + SMARTLIST_FOREACH(combined_server_versions, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(combined_client_versions, char *, cp, tor_free(cp)); + smartlist_free(combined_server_versions); + smartlist_free(combined_client_versions); smartlist_sort_strings(flags); smartlist_uniq_strings(flags); @@ -573,7 +1198,7 @@ chunks = smartlist_create(); { - char buf[1024]; + char *buf=NULL; char va_buf[ISO_TIME_LEN+1], fu_buf[ISO_TIME_LEN+1], vu_buf[ISO_TIME_LEN+1]; char *flaglist; @@ -582,16 +1207,20 @@ format_iso_time(vu_buf, valid_until); flaglist = smartlist_join_strings(flags, " ", 0, NULL); - smartlist_add(chunks, tor_strdup("network-status-version 3\n" - "vote-status consensus\n")); + tor_asprintf(&buf, "network-status-version 3%s%s\n" + "vote-status consensus\n", + flavor == FLAV_NS ? "" : " ", + flavor == FLAV_NS ? "" : flavor_name); + + smartlist_add(chunks, buf); if (consensus_method >= 2) { - tor_snprintf(buf, sizeof(buf), "consensus-method %d\n", + tor_asprintf(&buf, "consensus-method %d\n", consensus_method); - smartlist_add(chunks, tor_strdup(buf)); + smartlist_add(chunks, buf); } - tor_snprintf(buf, sizeof(buf), + tor_asprintf(&buf, "valid-after %s\n" "fresh-until %s\n" "valid-until %s\n" @@ -602,18 +1231,26 @@ va_buf, fu_buf, vu_buf, vote_seconds, dist_seconds, client_versions, server_versions, flaglist); - smartlist_add(chunks, tor_strdup(buf)); + smartlist_add(chunks, buf); tor_free(flaglist); } + if (consensus_method >= MIN_METHOD_FOR_PARAMS) { + params = dirvote_compute_params(votes); + if (params) { + smartlist_add(chunks, tor_strdup("params ")); + smartlist_add(chunks, params); + smartlist_add(chunks, tor_strdup("\n")); + } + } + /* Sort the votes. */ smartlist_sort(votes, _compare_votes_by_authority_id); /* Add the authority sections. */ { smartlist_t *dir_sources = smartlist_create(); - SMARTLIST_FOREACH(votes, networkstatus_t *, v, - { + SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { dir_src_ent_t *e = tor_malloc_zero(sizeof(dir_src_ent_t)); e->v = v; e->digest = get_voter(v)->identity_digest; @@ -627,18 +1264,17 @@ e_legacy->is_legacy = 1; smartlist_add(dir_sources, e_legacy); } - }); + } SMARTLIST_FOREACH_END(v); smartlist_sort(dir_sources, _compare_dir_src_ents_by_authority_id); - SMARTLIST_FOREACH(dir_sources, const dir_src_ent_t *, e, - { - char buf[1024]; + SMARTLIST_FOREACH_BEGIN(dir_sources, const dir_src_ent_t *, e) { struct in_addr in; char ip[INET_NTOA_BUF_LEN]; char fingerprint[HEX_DIGEST_LEN+1]; char votedigest[HEX_DIGEST_LEN+1]; networkstatus_t *v = e->v; networkstatus_voter_info_t *voter = get_voter(v); + char *buf = NULL; if (e->is_legacy) tor_assert(consensus_method >= 2); @@ -649,22 +1285,22 @@ base16_encode(votedigest, sizeof(votedigest), voter->vote_digest, DIGEST_LEN); - tor_snprintf(buf, sizeof(buf), + tor_asprintf(&buf, "dir-source %s%s %s %s %s %d %d\n", voter->nickname, e->is_legacy ? "-legacy" : "", fingerprint, voter->address, ip, voter->dir_port, voter->or_port); - smartlist_add(chunks, tor_strdup(buf)); + smartlist_add(chunks, buf); if (! e->is_legacy) { - tor_snprintf(buf, sizeof(buf), + tor_asprintf(&buf, "contact %s\n" "vote-digest %s\n", voter->contact, votedigest); - smartlist_add(chunks, tor_strdup(buf)); + smartlist_add(chunks, buf); } - }); + } SMARTLIST_FOREACH_END(e); SMARTLIST_FOREACH(dir_sources, dir_src_ent_t *, e, tor_free(e)); smartlist_free(dir_sources); } @@ -679,6 +1315,12 @@ smartlist_t *matching_descs = smartlist_create(); smartlist_t *chosen_flags = smartlist_create(); smartlist_t *versions = smartlist_create(); + smartlist_t *exitsummaries = smartlist_create(); + uint32_t *bandwidths = tor_malloc(sizeof(uint32_t) * smartlist_len(votes)); + uint32_t *measured_bws = tor_malloc(sizeof(uint32_t) * + smartlist_len(votes)); + int num_bandwidths; + int num_mbws; int *n_voter_flags; /* n_voter_flags[j] is the number of flags that * votes[j] knows about. */ @@ -788,11 +1430,14 @@ const char *lowest_id = NULL; const char *chosen_version; const char *chosen_name = NULL; - int is_named = 0, is_unnamed = 0; + int exitsummary_disagreement = 0; + int is_named = 0, is_unnamed = 0, is_running = 0; + int is_guard = 0, is_exit = 0; int naming_conflict = 0; int n_listing = 0; int i; - char buf[256]; + char *buf=NULL; + char microdesc_digest[DIGEST256_LEN]; /* Of the next-to-be-considered digest in each voter, which is first? */ SMARTLIST_FOREACH(votes, networkstatus_t *, v, { @@ -810,15 +1455,17 @@ smartlist_clear(matching_descs); smartlist_clear(chosen_flags); smartlist_clear(versions); + num_bandwidths = 0; + num_mbws = 0; /* Okay, go through all the entries for this digest. */ - SMARTLIST_FOREACH(votes, networkstatus_t *, v, { + SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { if (index[v_sl_idx] >= size[v_sl_idx]) continue; /* out of entries. */ rs = smartlist_get(v->routerstatus_list, index[v_sl_idx]); if (memcmp(rs->status.identity_digest, lowest_id, DIGEST_LEN)) continue; /* doesn't include this router. */ - /* At this point, we know that we're looking at a routersatus with + /* At this point, we know that we're looking at a routerstatus with * identity "lowest". */ ++index[v_sl_idx]; @@ -841,7 +1488,14 @@ } chosen_name = rs->status.nickname; } - }); + + /* count bandwidths */ + if (rs->status.has_measured_bw) + measured_bws[num_mbws++] = rs->status.measured_bw; + + if (rs->status.has_bandwidth) + bandwidths[num_bandwidths++] = rs->status.bandwidth; + } SMARTLIST_FOREACH_END(v); /* We don't include this router at all unless more than half of * the authorities we believe in list it. */ @@ -850,7 +1504,9 @@ /* Figure out the most popular opinion of what the most recent * routerinfo and its contents are. */ - rs = compute_routerstatus_consensus(matching_descs); + memset(microdesc_digest, 0, sizeof(microdesc_digest)); + rs = compute_routerstatus_consensus(matching_descs, consensus_method, + microdesc_digest); /* Copy bits of that into rs_out. */ tor_assert(!memcmp(lowest_id, rs->status.identity_digest, DIGEST_LEN)); memcpy(rs_out.identity_digest, lowest_id, DIGEST_LEN); @@ -860,6 +1516,8 @@ rs_out.published_on = rs->status.published_on; rs_out.dir_port = rs->status.dir_port; rs_out.or_port = rs->status.or_port; + rs_out.has_bandwidth = 0; + rs_out.has_exitsummary = 0; if (chosen_name && !naming_conflict) { strlcpy(rs_out.nickname, chosen_name, sizeof(rs_out.nickname)); @@ -892,11 +1550,23 @@ if (is_unnamed) smartlist_add(chosen_flags, (char*)fl); } else { - if (flag_counts[fl_sl_idx] > n_flag_voters[fl_sl_idx]/2) + if (flag_counts[fl_sl_idx] > n_flag_voters[fl_sl_idx]/2) { smartlist_add(chosen_flags, (char*)fl); + if (!strcmp(fl, "Exit")) + is_exit = 1; + else if (!strcmp(fl, "Guard")) + is_guard = 1; + else if (!strcmp(fl, "Running")) + is_running = 1; + } } }); + /* Starting with consensus method 4 we do not list servers + * that are not running in a consensus. See Proposal 138 */ + if (consensus_method >= 4 && !is_running) + continue; + /* Pick the version. */ if (smartlist_len(versions)) { sort_version_list(versions, 0); @@ -905,11 +1575,133 @@ chosen_version = NULL; } - /* Okay!! Now we can write the descriptor... */ - /* First line goes into "buf". */ - routerstatus_format_entry(buf, sizeof(buf), &rs_out, NULL, 1); - smartlist_add(chunks, tor_strdup(buf)); - /* Second line is all flags. The "\n" is missing. */ + /* Pick a bandwidth */ + if (consensus_method >= 6 && num_mbws > 2) { + rs_out.has_bandwidth = 1; + rs_out.bandwidth = median_uint32(measured_bws, num_mbws); + } else if (consensus_method >= 5 && num_bandwidths > 0) { + rs_out.has_bandwidth = 1; + rs_out.bandwidth = median_uint32(bandwidths, num_bandwidths); + } + + if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS) { + if (rs_out.has_bandwidth) { + T += rs_out.bandwidth; + if (is_exit && is_guard) + D += rs_out.bandwidth; + else if (is_exit) + E += rs_out.bandwidth; + else if (is_guard) + G += rs_out.bandwidth; + else + M += rs_out.bandwidth; + } else { + log_warn(LD_BUG, "Missing consensus bandwidth for router %s", + rs_out.nickname); + } + } + + /* Ok, we already picked a descriptor digest we want to list + * previously. Now we want to use the exit policy summary from + * that descriptor. If everybody plays nice all the voters who + * listed that descriptor will have the same summary. If not then + * something is fishy and we'll use the most common one (breaking + * ties in favor of lexicographically larger one (only because it + * lets me reuse more existing code. + * + * The other case that can happen is that no authority that voted + * for that descriptor has an exit policy summary. That's + * probably quite unlikely but can happen. In that case we use + * the policy that was most often listed in votes, again breaking + * ties like in the previous case. + */ + if (consensus_method >= 5) { + /* Okay, go through all the votes for this router. We prepared + * that list previously */ + const char *chosen_exitsummary = NULL; + smartlist_clear(exitsummaries); + SMARTLIST_FOREACH(matching_descs, vote_routerstatus_t *, vsr, { + /* Check if the vote where this status comes from had the + * proper descriptor */ + tor_assert(!memcmp(rs_out.identity_digest, + vsr->status.identity_digest, + DIGEST_LEN)); + if (vsr->status.has_exitsummary && + !memcmp(rs_out.descriptor_digest, + vsr->status.descriptor_digest, + DIGEST_LEN)) { + tor_assert(vsr->status.exitsummary); + smartlist_add(exitsummaries, vsr->status.exitsummary); + if (!chosen_exitsummary) { + chosen_exitsummary = vsr->status.exitsummary; + } else if (strcmp(chosen_exitsummary, vsr->status.exitsummary)) { + /* Great. There's disagreement among the voters. That + * really shouldn't be */ + exitsummary_disagreement = 1; + } + } + }); + + if (exitsummary_disagreement) { + char id[HEX_DIGEST_LEN+1]; + char dd[HEX_DIGEST_LEN+1]; + base16_encode(id, sizeof(dd), rs_out.identity_digest, DIGEST_LEN); + base16_encode(dd, sizeof(dd), rs_out.descriptor_digest, DIGEST_LEN); + log_warn(LD_DIR, "The voters disagreed on the exit policy summary " + " for router %s with descriptor %s. This really shouldn't" + " have happened.", id, dd); + + smartlist_sort_strings(exitsummaries); + chosen_exitsummary = get_most_frequent_member(exitsummaries); + } else if (!chosen_exitsummary) { + char id[HEX_DIGEST_LEN+1]; + char dd[HEX_DIGEST_LEN+1]; + base16_encode(id, sizeof(dd), rs_out.identity_digest, DIGEST_LEN); + base16_encode(dd, sizeof(dd), rs_out.descriptor_digest, DIGEST_LEN); + log_warn(LD_DIR, "Not one of the voters that made us select" + "descriptor %s for router %s had an exit policy" + "summary", dd, id); + + /* Ok, none of those voting for the digest we chose had an + * exit policy for us. Well, that kinda sucks. + */ + smartlist_clear(exitsummaries); + SMARTLIST_FOREACH(matching_descs, vote_routerstatus_t *, vsr, { + if (vsr->status.has_exitsummary) + smartlist_add(exitsummaries, vsr->status.exitsummary); + }); + smartlist_sort_strings(exitsummaries); + chosen_exitsummary = get_most_frequent_member(exitsummaries); + + if (!chosen_exitsummary) + log_warn(LD_DIR, "Wow, not one of the voters had an exit " + "policy summary for %s. Wow.", id); + } + + if (chosen_exitsummary) { + rs_out.has_exitsummary = 1; + /* yea, discards the const */ + rs_out.exitsummary = (char *)chosen_exitsummary; + } + } + + { + char buf[4096]; + /* Okay!! Now we can write the descriptor... */ + /* First line goes into "buf". */ + routerstatus_format_entry(buf, sizeof(buf), &rs_out, NULL, + rs_format); + smartlist_add(chunks, tor_strdup(buf)); + } + /* Now an m line, if applicable. */ + if (flavor == FLAV_MICRODESC && + !tor_digest256_is_zero(microdesc_digest)) { + char m[BASE64_DIGEST256_LEN+1], *cp; + digest256_to_base64(m, microdesc_digest); + tor_asprintf(&cp, "m %s\n", m); + smartlist_add(chunks, cp); + } + /* Next line is all flags. The "\n" is missing. */ smartlist_add(chunks, smartlist_join_strings(chosen_flags, " ", 0, NULL)); /* Now the version line. */ @@ -918,6 +1710,18 @@ smartlist_add(chunks, tor_strdup(chosen_version)); } smartlist_add(chunks, tor_strdup("\n")); + /* Now the weight line. */ + if (rs_out.has_bandwidth) { + char *cp=NULL; + tor_asprintf(&cp, "w Bandwidth=%d\n", rs_out.bandwidth); + smartlist_add(chunks, cp); + } + + /* Now the exitpolicy summary line. */ + if (rs_out.has_exitsummary && flavor == FLAV_NS) { + tor_asprintf(&buf, "p %s\n", rs_out.exitsummary); + smartlist_add(chunks, buf); + } /* And the loop is over and we move on to the next router */ } @@ -936,34 +1740,93 @@ smartlist_free(matching_descs); smartlist_free(chosen_flags); smartlist_free(versions); + smartlist_free(exitsummaries); + tor_free(bandwidths); + tor_free(measured_bws); + } + + if (consensus_method >= MIN_METHOD_FOR_FOOTER) { + /* Starting with consensus method 9, we clearly mark the directory + * footer region */ + smartlist_add(chunks, tor_strdup("directory-footer\n")); + } + + if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS) { + int64_t weight_scale = BW_WEIGHT_SCALE; + char *bw_weight_param = NULL; + + // Parse params, extract BW_WEIGHT_SCALE if present + // DO NOT use consensus_param_bw_weight_scale() in this code! + // The consensus is not formed yet! + if (params) { + if (strcmpstart(params, "bwweightscale=") == 0) + bw_weight_param = params; + else + bw_weight_param = strstr(params, " bwweightscale="); + } + + if (bw_weight_param) { + int ok=0; + char *eq = strchr(bw_weight_param, '='); + if (eq) { + weight_scale = tor_parse_long(eq+1, 10, INT32_MIN, INT32_MAX, &ok, + NULL); + if (!ok) { + log_warn(LD_DIR, "Bad element '%s' in bw weight param", + escaped(bw_weight_param)); + weight_scale = BW_WEIGHT_SCALE; + } + } else { + log_warn(LD_DIR, "Bad element '%s' in bw weight param", + escaped(bw_weight_param)); + weight_scale = BW_WEIGHT_SCALE; + } + } + + networkstatus_compute_bw_weights_v9(chunks, G, M, E, D, T, weight_scale); } /* Add a signature. */ { - char digest[DIGEST_LEN]; + char digest[DIGEST256_LEN]; char fingerprint[HEX_DIGEST_LEN+1]; char signing_key_fingerprint[HEX_DIGEST_LEN+1]; + digest_algorithm_t digest_alg = + flavor == FLAV_NS ? DIGEST_SHA1 : DIGEST_SHA256; + size_t digest_len = + flavor == FLAV_NS ? DIGEST_LEN : DIGEST256_LEN; + const char *algname = crypto_digest_algorithm_get_name(digest_alg); + char *buf = NULL; + char sigbuf[4096]; - char buf[4096]; smartlist_add(chunks, tor_strdup("directory-signature ")); /* Compute the hash of the chunks. */ - hash_list_members(digest, chunks); + hash_list_members(digest, digest_len, chunks, digest_alg); /* Get the fingerprints */ crypto_pk_get_fingerprint(identity_key, fingerprint, 0); crypto_pk_get_fingerprint(signing_key, signing_key_fingerprint, 0); /* add the junk that will go at the end of the line. */ - tor_snprintf(buf, sizeof(buf), "%s %s\n", fingerprint, - signing_key_fingerprint); + if (flavor == FLAV_NS) { + tor_asprintf(&buf, "%s %s\n", fingerprint, + signing_key_fingerprint); + } else { + tor_asprintf(&buf, "%s %s %s\n", + algname, fingerprint, + signing_key_fingerprint); + } + smartlist_add(chunks, buf); /* And the signature. */ - if (router_append_dirobj_signature(buf, sizeof(buf), digest, + sigbuf[0] = '\0'; + if (router_append_dirobj_signature(sigbuf, sizeof(sigbuf), + digest, digest_len, signing_key)) { log_warn(LD_BUG, "Couldn't sign consensus networkstatus."); return NULL; /* This leaks, but it should never happen. */ } - smartlist_add(chunks, tor_strdup(buf)); + smartlist_add(chunks, tor_strdup(sigbuf)); if (legacy_id_key_digest && legacy_signing_key && consensus_method >= 3) { smartlist_add(chunks, tor_strdup("directory-signature ")); @@ -971,14 +1834,23 @@ legacy_id_key_digest, DIGEST_LEN); crypto_pk_get_fingerprint(legacy_signing_key, signing_key_fingerprint, 0); - tor_snprintf(buf, sizeof(buf), "%s %s\n", fingerprint, - signing_key_fingerprint); - if (router_append_dirobj_signature(buf, sizeof(buf), digest, + if (flavor == FLAV_NS) { + tor_asprintf(&buf, "%s %s\n", fingerprint, + signing_key_fingerprint); + } else { + tor_asprintf(&buf, "%s %s %s\n", + algname, fingerprint, + signing_key_fingerprint); + } + smartlist_add(chunks, buf); + sigbuf[0] = '\0'; + if (router_append_dirobj_signature(sigbuf, sizeof(sigbuf), + digest, digest_len, legacy_signing_key)) { log_warn(LD_BUG, "Couldn't sign consensus networkstatus."); return NULL; /* This leaks, but it should never happen. */ } - smartlist_add(chunks, tor_strdup(buf)); + smartlist_add(chunks, tor_strdup(sigbuf)); } } @@ -986,18 +1858,24 @@ tor_free(client_versions); tor_free(server_versions); + SMARTLIST_FOREACH(flags, char *, cp, tor_free(cp)); smartlist_free(flags); SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); smartlist_free(chunks); { networkstatus_t *c; - if (!(c = networkstatus_parse_vote_from_string(result, NULL, 0))) { - log_err(LD_BUG,"Generated a networkstatus consensus we couldn't " + if (!(c = networkstatus_parse_vote_from_string(result, NULL, + NS_TYPE_CONSENSUS))) { + log_err(LD_BUG, "Generated a networkstatus consensus we couldn't " "parse."); tor_free(result); return NULL; } + // Verify balancing parameters + if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS) { + networkstatus_verify_bw_weights(c); + } networkstatus_vote_free(c); } @@ -1007,7 +1885,7 @@ /** Given a consensus vote target and a set of detached signatures in * sigs that correspond to the same consensus, check whether there are * any new signatures in src_voter_list that should be added to - * target. (A signature should be added if we have no signature for that + * target. (A signature should be added if we have no signature for that * voter in target yet, or if we have no verifiable signature and the * new signature is verifiable.) Return the number of signatures added or * changed, or -1 if the document signed by sigs isn't the same @@ -1018,9 +1896,13 @@ const char **msg_out) { int r = 0; + const char *flavor; + smartlist_t *siglist; tor_assert(sigs); tor_assert(target); - tor_assert(!target->is_vote); + tor_assert(target->type == NS_TYPE_CONSENSUS); + + flavor = networkstatus_get_flavor_name(target->flavor); /* Do the times seem right? */ if (target->valid_after != sigs->valid_after) { @@ -1038,78 +1920,179 @@ "when adding detached signatures to consensus"; return -1; } - /* Are they the same consensus? */ - if (memcmp(target->networkstatus_digest, sigs->networkstatus_digest, - DIGEST_LEN)) { - *msg_out = "Digest mismatch when adding detached signatures to consensus"; + siglist = strmap_get(sigs->signatures, flavor); + if (!siglist) { + *msg_out = "No signatures for given consensus flavor"; return -1; } - /* For each voter in src... */ - SMARTLIST_FOREACH(sigs->signatures, networkstatus_voter_info_t *, src_voter, - { - char voter_identity[HEX_DIGEST_LEN+1]; - networkstatus_voter_info_t *target_voter = - networkstatus_get_voter_by_id(target, src_voter->identity_digest); - authority_cert_t *cert; - - base16_encode(voter_identity, sizeof(voter_identity), - src_voter->identity_digest, DIGEST_LEN); - log_info(LD_DIR, "Looking at signature from %s", voter_identity); - /* If the target doesn't know about this voter, then forget it. */ - if (!target_voter) { - log_info(LD_DIR, "We do not know about %s", voter_identity); - continue; + /** Make sure all the digests we know match, and at least one matches. */ + { + digests_t *digests = strmap_get(sigs->digests, flavor); + int n_matches = 0; + digest_algorithm_t alg; + if (!digests) { + *msg_out = "No digests for given consensus flavor"; + return -1; + } + for (alg = DIGEST_SHA1; alg < N_DIGEST_ALGORITHMS; ++alg) { + if (!tor_mem_is_zero(digests->d[alg], DIGEST256_LEN)) { + if (!memcmp(target->digests.d[alg], digests->d[alg], DIGEST256_LEN)) { + ++n_matches; + } else { + *msg_out = "Mismatched digest."; + return -1; + } } + } + if (!n_matches) { + *msg_out = "No regognized digests for given consensus flavor"; + } + } - /* If the target already has a good signature from this voter, then skip - * this one. */ - if (target_voter->good_signature) { - log_info(LD_DIR, "We already have a good signature from %s", - voter_identity); - continue; + /* For each voter in src... */ + SMARTLIST_FOREACH_BEGIN(siglist, document_signature_t *, sig) { + char voter_identity[HEX_DIGEST_LEN+1]; + networkstatus_voter_info_t *target_voter = + networkstatus_get_voter_by_id(target, sig->identity_digest); + authority_cert_t *cert = NULL; + const char *algorithm; + document_signature_t *old_sig = NULL; + + algorithm = crypto_digest_algorithm_get_name(sig->alg); + + base16_encode(voter_identity, sizeof(voter_identity), + sig->identity_digest, DIGEST_LEN); + log_info(LD_DIR, "Looking at signature from %s using %s", voter_identity, + algorithm); + /* If the target doesn't know about this voter, then forget it. */ + if (!target_voter) { + log_info(LD_DIR, "We do not know any voter with ID %s", voter_identity); + continue; + } + + old_sig = voter_get_sig_by_algorithm(target_voter, sig->alg); + + /* If the target already has a good signature from this voter, then skip + * this one. */ + if (old_sig && old_sig->good_signature) { + log_info(LD_DIR, "We already have a good signature from %s using %s", + voter_identity, algorithm); + continue; + } + + /* Try checking the signature if we haven't already. */ + if (!sig->good_signature && !sig->bad_signature) { + cert = authority_cert_get_by_digests(sig->identity_digest, + sig->signing_key_digest); + if (cert) + networkstatus_check_document_signature(target, sig, cert); + } + + /* If this signature is good, or we don't have any signature yet, + * then maybe add it. */ + if (sig->good_signature || !old_sig || old_sig->bad_signature) { + log_info(LD_DIR, "Adding signature from %s with %s", voter_identity, + algorithm); + ++r; + if (old_sig) { + smartlist_remove(target_voter->sigs, old_sig); + document_signature_free(old_sig); } + smartlist_add(target_voter->sigs, document_signature_dup(sig)); + } else { + log_info(LD_DIR, "Not adding signature from %s", voter_identity); + } + } SMARTLIST_FOREACH_END(sig); - /* Try checking the signature if we haven't already. */ - if (!src_voter->good_signature && !src_voter->bad_signature) { - cert = authority_cert_get_by_digests(src_voter->identity_digest, - src_voter->signing_key_digest); - if (cert) { - networkstatus_check_voter_signature(target, src_voter, cert); - } - } - /* If this signature is good, or we don't have any signature yet, - * then add it. */ - if (src_voter->good_signature || !target_voter->signature) { - log_info(LD_DIR, "Adding signature from %s", voter_identity); - ++r; - tor_free(target_voter->signature); - target_voter->signature = - tor_memdup(src_voter->signature, src_voter->signature_len); - memcpy(target_voter->signing_key_digest, src_voter->signing_key_digest, - DIGEST_LEN); - target_voter->signature_len = src_voter->signature_len; - target_voter->good_signature = src_voter->good_signature; - target_voter->bad_signature = src_voter->bad_signature; + return r; +} + +/** Return a newly allocated string containing all the signatures on + * consensus by all voters. If for_detached_signatures is true, + * then the signatures will be put in a detached signatures document, so + * prefix any non-NS-flavored signatures with "additional-signature" rather + * than "directory-signature". */ +static char * +networkstatus_format_signatures(networkstatus_t *consensus, + int for_detached_signatures) +{ + smartlist_t *elements; + char buf[4096]; + char *result = NULL; + int n_sigs = 0; + const consensus_flavor_t flavor = consensus->flavor; + const char *flavor_name = networkstatus_get_flavor_name(flavor); + const char *keyword; + + if (for_detached_signatures && flavor != FLAV_NS) + keyword = "additional-signature"; + else + keyword = "directory-signature"; + + elements = smartlist_create(); + + SMARTLIST_FOREACH_BEGIN(consensus->voters, networkstatus_voter_info_t *, v) { + SMARTLIST_FOREACH_BEGIN(v->sigs, document_signature_t *, sig) { + char sk[HEX_DIGEST_LEN+1]; + char id[HEX_DIGEST_LEN+1]; + if (!sig->signature || sig->bad_signature) + continue; + ++n_sigs; + base16_encode(sk, sizeof(sk), sig->signing_key_digest, DIGEST_LEN); + base16_encode(id, sizeof(id), sig->identity_digest, DIGEST_LEN); + if (flavor == FLAV_NS) { + tor_snprintf(buf, sizeof(buf), + "%s %s %s\n-----BEGIN SIGNATURE-----\n", + keyword, id, sk); } else { - log_info(LD_DIR, "Not adding signature from %s", voter_identity); + const char *digest_name = + crypto_digest_algorithm_get_name(sig->alg); + tor_snprintf(buf, sizeof(buf), + "%s%s%s %s %s %s\n-----BEGIN SIGNATURE-----\n", + keyword, + for_detached_signatures ? " " : "", + for_detached_signatures ? flavor_name : "", + digest_name, id, sk); } - }); + smartlist_add(elements, tor_strdup(buf)); + base64_encode(buf, sizeof(buf), sig->signature, sig->signature_len); + strlcat(buf, "-----END SIGNATURE-----\n", sizeof(buf)); + smartlist_add(elements, tor_strdup(buf)); + } SMARTLIST_FOREACH_END(sig); + } SMARTLIST_FOREACH_END(v); - return r; + result = smartlist_join_strings(elements, "", 0, NULL); + SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); + smartlist_free(elements); + if (!n_sigs) + tor_free(result); + return result; } /** Return a newly allocated string holding the detached-signatures document - * corresponding to the signatures on consensus. */ + * corresponding to the signatures on consensuses, which must contain + * exactly one FLAV_NS consensus, and no more than one consensus for each + * other flavor. */ char * -networkstatus_get_detached_signatures(networkstatus_t *consensus) +networkstatus_get_detached_signatures(smartlist_t *consensuses) { smartlist_t *elements; char buf[4096]; - char *result = NULL; - int n_sigs = 0; - tor_assert(consensus); - tor_assert(! consensus->is_vote); + char *result = NULL, *sigs = NULL; + networkstatus_t *consensus_ns = NULL; + tor_assert(consensuses); + + SMARTLIST_FOREACH(consensuses, networkstatus_t *, ns, { + tor_assert(ns); + tor_assert(ns->type == NS_TYPE_CONSENSUS); + if (ns && ns->flavor == FLAV_NS) + consensus_ns = ns; + }); + if (!consensus_ns) { + log_warn(LD_BUG, "No NS consensus given."); + return NULL; + } elements = smartlist_create(); @@ -1118,10 +2101,11 @@ vu_buf[ISO_TIME_LEN+1]; char d[HEX_DIGEST_LEN+1]; - base16_encode(d, sizeof(d), consensus->networkstatus_digest, DIGEST_LEN); - format_iso_time(va_buf, consensus->valid_after); - format_iso_time(fu_buf, consensus->fresh_until); - format_iso_time(vu_buf, consensus->valid_until); + base16_encode(d, sizeof(d), + consensus_ns->digests.d[DIGEST_SHA1], DIGEST_LEN); + format_iso_time(va_buf, consensus_ns->valid_after); + format_iso_time(fu_buf, consensus_ns->fresh_until); + format_iso_time(vu_buf, consensus_ns->valid_until); tor_snprintf(buf, sizeof(buf), "consensus-digest %s\n" @@ -1131,45 +2115,89 @@ smartlist_add(elements, tor_strdup(buf)); } - SMARTLIST_FOREACH(consensus->voters, networkstatus_voter_info_t *, v, - { - char sk[HEX_DIGEST_LEN+1]; - char id[HEX_DIGEST_LEN+1]; - if (!v->signature || v->bad_signature) + /* Get all the digests for the non-FLAV_NS consensuses */ + SMARTLIST_FOREACH_BEGIN(consensuses, networkstatus_t *, ns) { + const char *flavor_name = networkstatus_get_flavor_name(ns->flavor); + int alg; + if (ns->flavor == FLAV_NS) + continue; + + /* start with SHA256; we don't include SHA1 for anything but the basic + * consensus. */ + for (alg = DIGEST_SHA256; alg < N_DIGEST_ALGORITHMS; ++alg) { + char d[HEX_DIGEST256_LEN+1]; + const char *alg_name = + crypto_digest_algorithm_get_name(alg); + if (tor_mem_is_zero(ns->digests.d[alg], DIGEST256_LEN)) continue; - ++n_sigs; - base16_encode(sk, sizeof(sk), v->signing_key_digest, DIGEST_LEN); - base16_encode(id, sizeof(id), v->identity_digest, DIGEST_LEN); - tor_snprintf(buf, sizeof(buf), - "directory-signature %s %s\n-----BEGIN SIGNATURE-----\n", - id, sk); + base16_encode(d, sizeof(d), ns->digests.d[alg], DIGEST256_LEN); + tor_snprintf(buf, sizeof(buf), "additional-digest %s %s %s\n", + flavor_name, alg_name, d); smartlist_add(elements, tor_strdup(buf)); - base64_encode(buf, sizeof(buf), v->signature, v->signature_len); - strlcat(buf, "-----END SIGNATURE-----\n", sizeof(buf)); - smartlist_add(elements, tor_strdup(buf)); - }); + } + } SMARTLIST_FOREACH_END(ns); - result = smartlist_join_strings(elements, "", 0, NULL); + /* Now get all the sigs for non-FLAV_NS consensuses */ + SMARTLIST_FOREACH_BEGIN(consensuses, networkstatus_t *, ns) { + char *sigs; + if (ns->flavor == FLAV_NS) + continue; + sigs = networkstatus_format_signatures(ns, 1); + if (!sigs) { + log_warn(LD_DIR, "Couldn't format signatures"); + goto err; + } + smartlist_add(elements, sigs); + } SMARTLIST_FOREACH_END(ns); + + /* Now add the FLAV_NS consensus signatrures. */ + sigs = networkstatus_format_signatures(consensus_ns, 1); + if (!sigs) + goto err; + smartlist_add(elements, sigs); + result = smartlist_join_strings(elements, "", 0, NULL); + err: SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); smartlist_free(elements); - if (!n_sigs) - tor_free(result); return result; } +/** Return a newly allocated string holding a detached-signatures document for + * all of the in-progress consensuses in the n_flavors-element array at + * pending. */ +static char * +get_detached_signatures_from_pending_consensuses(pending_consensus_t *pending, + int n_flavors) +{ + int flav; + char *signatures; + smartlist_t *c = smartlist_create(); + for (flav = 0; flav < n_flavors; ++flav) { + if (pending[flav].consensus) + smartlist_add(c, pending[flav].consensus); + } + signatures = networkstatus_get_detached_signatures(c); + smartlist_free(c); + return signatures; +} + /** Release all storage held in s. */ void ns_detached_signatures_free(ns_detached_signatures_t *s) { + if (!s) + return; if (s->signatures) { - SMARTLIST_FOREACH(s->signatures, networkstatus_voter_info_t *, v, - { - tor_free(v->signature); - tor_free(v); - }); - smartlist_free(s->signatures); + STRMAP_FOREACH(s->signatures, flavor, smartlist_t *, sigs) { + SMARTLIST_FOREACH(sigs, document_signature_t *, sig, + document_signature_free(sig)); + smartlist_free(sigs); + } STRMAP_FOREACH_END; + strmap_free(s->signatures, NULL); + strmap_free(s->digests, _tor_free); } + tor_free(s); } @@ -1300,8 +2328,9 @@ vote_delay = consensus->vote_seconds; dist_delay = consensus->dist_seconds; } else { - interval = DEFAULT_VOTING_INTERVAL_WHEN_NO_CONSENSUS; - vote_delay = dist_delay = 300; + interval = options->TestingV3AuthInitialVotingInterval; + vote_delay = options->TestingV3AuthInitialVoteDelay; + dist_delay = options->TestingV3AuthInitialDistDelay; } tor_assert(interval > 0); @@ -1358,7 +2387,7 @@ if (voting_schedule.voting_ends < now && !voting_schedule.have_built_consensus) { log_notice(LD_DIR, "Time to compute a consensus."); - dirvote_compute_consensus(); + dirvote_compute_consensuses(); /* XXXX We will want to try again later if we haven't got enough * votes yet. Implement this if it turns out to ever happen. */ voting_schedule.have_built_consensus = 1; @@ -1395,14 +2424,13 @@ /** List of pending_vote_t for the previous vote. After we've used them to * build a consensus, the votes go here for the next period. */ static smartlist_t *previous_vote_list = NULL; -/** The body of the consensus that we're currently building. Once we - * have it built, it goes into dirserv.c */ -static char *pending_consensus_body = NULL; + +static pending_consensus_t pending_consensuses[N_CONSENSUS_FLAVORS]; + /** The detached signatures for the consensus that we're currently * building. */ static char *pending_consensus_signatures = NULL; -/** The parsed in-progress consensus document. */ -static networkstatus_t *pending_consensus = NULL; + /** List of ns_detached_signatures_t: hold signatures that get posted to us * before we have generated the consensus on our own. */ static smartlist_t *pending_consensus_signature_list = NULL; @@ -1417,6 +2445,7 @@ networkstatus_t *ns; char *contents; pending_vote_t *pending_vote; + time_t now = time(NULL); int status; const char *msg = ""; @@ -1424,6 +2453,9 @@ if (!cert || !key) { log_warn(LD_NET, "Didn't find key/certificate to generate v3 vote"); return -1; + } else if (cert->expires < now) { + log_warn(LD_NET, "Can't generate v3 vote with expired certificate"); + return -1; } if (!(ns = dirserv_generate_networkstatus_vote_obj(key, cert))) return -1; @@ -1492,15 +2524,39 @@ static void dirvote_fetch_missing_signatures(void) { - if (!pending_consensus) + int need_any = 0; + int i; + for (i=0; i < N_CONSENSUS_FLAVORS; ++i) { + networkstatus_t *consensus = pending_consensuses[i].consensus; + if (!consensus || + networkstatus_check_consensus_signature(consensus, -1) == 1) { + /* We have no consensus, or we have one that's signed by everybody. */ + continue; + } + need_any = 1; + } + if (!need_any) return; - if (networkstatus_check_consensus_signature(pending_consensus, -1) == 1) - return; /* we have a signature from everybody. */ directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, NULL); } +/** Release all storage held by pending consensuses (those waiting for + * signatures). */ +static void +dirvote_clear_pending_consensuses(void) +{ + int i; + for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { + pending_consensus_t *pc = &pending_consensuses[i]; + tor_free(pc->body); + + networkstatus_vote_free(pc->consensus); + pc->consensus = NULL; + } +} + /** Drop all currently pending votes, consensus, and detached signatures. */ static void dirvote_clear_votes(int all_votes) @@ -1538,12 +2594,8 @@ tor_free(cp)); smartlist_clear(pending_consensus_signature_list); } - tor_free(pending_consensus_body); tor_free(pending_consensus_signatures); - if (pending_consensus) { - networkstatus_vote_free(pending_consensus); - pending_consensus = NULL; - } + dirvote_clear_pending_consensuses(); } /** Return a newly allocated string containing the hex-encoded v3 authority @@ -1589,7 +2641,8 @@ *msg_out = NULL; again: - vote = networkstatus_parse_vote_from_string(vote_body, &end_of_vote, 1); + vote = networkstatus_parse_vote_from_string(vote_body, &end_of_vote, + NS_TYPE_VOTE); if (!end_of_vote) end_of_vote = vote_body + strlen(vote_body); if (!vote) { @@ -1600,7 +2653,13 @@ } tor_assert(smartlist_len(vote->voters) == 1); vi = get_voter(vote); - tor_assert(vi->good_signature == 1); + { + int any_sig_good = 0; + SMARTLIST_FOREACH(vi->sigs, document_signature_t *, sig, + if (sig->good_signature) + any_sig_good = 1); + tor_assert(any_sig_good); + } ds = trusteddirserver_get_by_v3_auth_digest(vi->identity_digest); if (!ds) { char *keys = list_v3_auth_ids(); @@ -1637,7 +2696,10 @@ goto err; } - /* Now see whether we already hvote->cert->cache_info.identity_digest, vote->cert->cache_info.identity_digest, @@ -1645,7 +2707,8 @@ networkstatus_voter_info_t *vi_old = get_voter(v->vote); if (!memcmp(vi_old->vote_digest, vi->vote_digest, DIGEST_LEN)) { /* Ah, it's the same vote. Not a problem. */ - log_info(LD_DIR, "Discarding a vote we already have."); + log_info(LD_DIR, "Discarding a vote we already have (from %s).", + vi->address); if (*status_out < 200) *status_out = 200; goto discard; @@ -1672,7 +2735,7 @@ goto err; } } - }); + }); pending_vote = tor_malloc_zero(sizeof(pending_vote_t)); pending_vote->vote_body = new_cached_dir(tor_strndup(vote_body, @@ -1696,8 +2759,7 @@ *status_out = 400; discard: - if (vote) - networkstatus_vote_free(vote); + networkstatus_vote_free(vote); if (end_of_vote && !strcmpstart(end_of_vote, "network-status-version ")) { vote_body = end_of_vote; @@ -1722,16 +2784,20 @@ /** Try to compute a v3 networkstatus consensus from the currently pending * votes. Return 0 on success, -1 on failure. Store the consensus in * pending_consensus: it won't be ready to be published until we have - * everybody else's signatures collected too. (V3 Authoritity only) */ + * everybody else's signatures collected too. (V3 Authority only) */ static int -dirvote_compute_consensus(void) +dirvote_compute_consensuses(void) { /* Have we got enough votes to try? */ - int n_votes, n_voters; - smartlist_t *votes = NULL; - char *consensus_body = NULL, *signatures = NULL; + int n_votes, n_voters, n_vote_running = 0; + smartlist_t *votes = NULL, *votestrings = NULL; + char *consensus_body = NULL, *signatures = NULL, *votefile; networkstatus_t *consensus = NULL; authority_cert_t *my_cert; + pending_consensus_t pending[N_CONSENSUS_FLAVORS]; + int flav; + + memset(pending, 0, sizeof(pending)); if (!pending_vote_list) pending_vote_list = smartlist_create(); @@ -1743,6 +2809,19 @@ "%d of %d", n_votes, n_voters/2); goto err; } + tor_assert(pending_vote_list); + SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, v, { + if (smartlist_string_isin(v->vote->known_flags, "Running")) + n_vote_running++; + }); + if (!n_vote_running) { + /* See task 1066. */ + log_warn(LD_DIR, "Nobody has voted on the Running flag. Generating " + "and publishing a consensus without Running nodes " + "would make many clients stop working. Not " + "generating a consensus!"); + goto err; + } if (!(my_cert = get_my_v3_authority_cert())) { log_warn(LD_DIR, "Can't generate consensus without a certificate."); @@ -1750,13 +2829,28 @@ } votes = smartlist_create(); + votestrings = smartlist_create(); SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, v, - smartlist_add(votes, v->vote)); + { + sized_chunk_t *c = tor_malloc(sizeof(sized_chunk_t)); + c->bytes = v->vote_body->dir; + c->len = v->vote_body->dir_len; + smartlist_add(votestrings, c); /* collect strings to write to disk */ + + smartlist_add(votes, v->vote); /* collect votes to compute consensus */ + }); + + votefile = get_datadir_fname("v3-status-votes"); + write_chunks_to_file(votefile, votestrings, 0); + tor_free(votefile); + SMARTLIST_FOREACH(votestrings, sized_chunk_t *, c, tor_free(c)); + smartlist_free(votestrings); { char legacy_dbuf[DIGEST_LEN]; crypto_pk_env_t *legacy_sign=NULL; char *legacy_id_digest = NULL; + int n_generated = 0; if (get_options()->V3AuthUseLegacyKey) { authority_cert_t *cert = get_my_v3_legacy_cert(); legacy_sign = get_my_v3_legacy_signing_key(); @@ -1765,38 +2859,58 @@ legacy_id_digest = legacy_dbuf; } } - consensus_body = networkstatus_compute_consensus( + + for (flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { + const char *flavor_name = networkstatus_get_flavor_name(flav); + consensus_body = networkstatus_compute_consensus( votes, n_voters, my_cert->identity_key, - get_my_v3_authority_signing_key(), legacy_id_digest, legacy_sign); - } - if (!consensus_body) { - log_warn(LD_DIR, "Couldn't generate a consensus at all!"); - goto err; - } - consensus = networkstatus_parse_vote_from_string(consensus_body, NULL, 0); - if (!consensus) { - log_warn(LD_DIR, "Couldn't parse consensus we generated!"); - goto err; + get_my_v3_authority_signing_key(), legacy_id_digest, legacy_sign, + flav); + + if (!consensus_body) { + log_warn(LD_DIR, "Couldn't generate a %s consensus at all!", + flavor_name); + continue; + } + consensus = networkstatus_parse_vote_from_string(consensus_body, NULL, + NS_TYPE_CONSENSUS); + if (!consensus) { + log_warn(LD_DIR, "Couldn't parse %s consensus we generated!", + flavor_name); + tor_free(consensus_body); + continue; + } + + /* 'Check' our own signature, to mark it valid. */ + networkstatus_check_consensus_signature(consensus, -1); + + pending[flav].body = consensus_body; + pending[flav].consensus = consensus; + n_generated++; + consensus_body = NULL; + consensus = NULL; + } + if (!n_generated) { + log_warn(LD_DIR, "Couldn't generate any consensus flavors at all."); + goto err; + } } - /* 'Check' our own signature, to mark it valid. */ - networkstatus_check_consensus_signature(consensus, -1); - signatures = networkstatus_get_detached_signatures(consensus); + signatures = get_detached_signatures_from_pending_consensuses( + pending, N_CONSENSUS_FLAVORS); + if (!signatures) { log_warn(LD_DIR, "Couldn't extract signatures."); goto err; } - tor_free(pending_consensus_body); - pending_consensus_body = consensus_body; + dirvote_clear_pending_consensuses(); + memcpy(pending_consensuses, pending, sizeof(pending)); + tor_free(pending_consensus_signatures); pending_consensus_signatures = signatures; - if (pending_consensus) - networkstatus_vote_free(pending_consensus); - pending_consensus = consensus; - if (pending_consensus_signature_list) { int n_sigs = 0; /* we may have gotten signatures for this consensus before we built @@ -1804,7 +2918,7 @@ SMARTLIST_FOREACH(pending_consensus_signature_list, char *, sig, { const char *msg = NULL; - int r = dirvote_add_signatures_to_pending_consensus(sig, &msg); + int r = dirvote_add_signatures_to_all_pending_consensuses(sig, &msg); if (r >= 0) n_sigs += r; else @@ -1828,10 +2942,10 @@ strlen(pending_consensus_signatures), 0); log_notice(LD_DIR, "Signature(s) posted."); + smartlist_free(votes); return 0; err: - if (votes) - smartlist_free(votes); + smartlist_free(votes); tor_free(consensus_body); tor_free(signatures); networkstatus_vote_free(consensus); @@ -1840,75 +2954,62 @@ } /** Helper: we just got the detached_signatures_body sent to us as - * signatures on the currently pending consensus. Add them to the consensus + * signatures on the currently pending consensus. Add them to pc * as appropriate. Return the number of signatures added. (?) */ static int dirvote_add_signatures_to_pending_consensus( - const char *detached_signatures_body, + pending_consensus_t *pc, + ns_detached_signatures_t *sigs, const char **msg_out) { - ns_detached_signatures_t *sigs = NULL; + const char *flavor_name; int r = -1; - tor_assert(detached_signatures_body); - tor_assert(msg_out); - /* Only call if we have a pending consensus right now. */ - tor_assert(pending_consensus); - tor_assert(pending_consensus_body); + tor_assert(pc->consensus); + tor_assert(pc->body); tor_assert(pending_consensus_signatures); + flavor_name = networkstatus_get_flavor_name(pc->consensus->flavor); *msg_out = NULL; - if (!(sigs = networkstatus_parse_detached_signatures( - detached_signatures_body, NULL))) { - *msg_out = "Couldn't parse detached signatures."; - goto err; + { + smartlist_t *sig_list = strmap_get(sigs->signatures, flavor_name); + log_info(LD_DIR, "Have %d signatures for adding to %s consensus.", + sig_list ? smartlist_len(sig_list) : 0, flavor_name); } - - log_info(LD_DIR, "Have %d signatures for adding to consensus.", - smartlist_len(sigs->signatures)); - r = networkstatus_add_detached_signatures(pending_consensus, - sigs, msg_out); + r = networkstatus_add_detached_signatures(pc->consensus, sigs, msg_out); log_info(LD_DIR,"Added %d signatures to consensus.", r); if (r >= 1) { - char *new_detached = - networkstatus_get_detached_signatures(pending_consensus); - const char *src; + char *new_signatures = + networkstatus_format_signatures(pc->consensus, 0); char *dst, *dst_end; size_t new_consensus_len; - if (!new_detached) { + if (!new_signatures) { *msg_out = "No signatures to add"; goto err; } new_consensus_len = - strlen(pending_consensus_body) + strlen(new_detached) + 1; - pending_consensus_body = tor_realloc(pending_consensus_body, - new_consensus_len); - dst_end = pending_consensus_body + new_consensus_len; - dst = strstr(pending_consensus_body, "directory-signature "); + strlen(pc->body) + strlen(new_signatures) + 1; + pc->body = tor_realloc(pc->body, new_consensus_len); + dst_end = pc->body + new_consensus_len; + dst = strstr(pc->body, "directory-signature "); tor_assert(dst); - src = strstr(new_detached, "directory-signature "); - tor_assert(src); - strlcpy(dst, src, dst_end-dst); + strlcpy(dst, new_signatures, dst_end-dst); /* We remove this block once it has failed to crash for a while. But * unless it shows up in profiles, we're probably better leaving it in, * just in case we break detached signature processing at some point. */ { - ns_detached_signatures_t *sigs = - networkstatus_parse_detached_signatures(new_detached, NULL); networkstatus_t *v = networkstatus_parse_vote_from_string( - pending_consensus_body, NULL, 0); - tor_assert(sigs); - ns_detached_signatures_free(sigs); + pc->body, NULL, + NS_TYPE_CONSENSUS); tor_assert(v); networkstatus_vote_free(v); } - tor_free(pending_consensus_signatures); - pending_consensus_signatures = new_detached; *msg_out = "Signatures added"; + tor_free(new_signatures); } else if (r == 0) { *msg_out = "Signatures ignored"; } else { @@ -1920,12 +3021,66 @@ if (!*msg_out) *msg_out = "Unrecognized error while adding detached signatures."; done: - if (sigs) - ns_detached_signatures_free(sigs); return r; } -/** Helper: we just got the deteached_signatures_body sent to us as +static int +dirvote_add_signatures_to_all_pending_consensuses( + const char *detached_signatures_body, + const char **msg_out) +{ + int r=0, i, n_added = 0, errors = 0; + ns_detached_signatures_t *sigs; + tor_assert(detached_signatures_body); + tor_assert(msg_out); + tor_assert(pending_consensus_signatures); + + if (!(sigs = networkstatus_parse_detached_signatures( + detached_signatures_body, NULL))) { + *msg_out = "Couldn't parse detached signatures."; + goto err; + } + + for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { + int res; + pending_consensus_t *pc = &pending_consensuses[i]; + if (!pc->consensus) + continue; + res = dirvote_add_signatures_to_pending_consensus(pc, sigs, msg_out); + if (res < 0) + errors++; + else + n_added += res; + } + + if (errors && !n_added) { + r = -1; + goto err; + } + + if (n_added && pending_consensuses[FLAV_NS].consensus) { + char *new_detached = + get_detached_signatures_from_pending_consensuses( + pending_consensuses, N_CONSENSUS_FLAVORS); + if (new_detached) { + tor_free(pending_consensus_signatures); + pending_consensus_signatures = new_detached; + } + } + + r = n_added; + goto done; + err: + if (!*msg_out) + *msg_out = "Unrecognized error while adding detached signatures."; + done: + ns_detached_signatures_free(sigs); + /* XXXX NM Check how return is used. We can now have an error *and* + signatures added. */ + return r; +} + +/** Helper: we just got the detached_signatures_body sent to us as * signatures on the currently pending consensus. Add them to the pending * consensus (if we have one); otherwise queue them until we have a * consensus. Return negative on failure, nonnegative on success. */ @@ -1934,14 +3089,14 @@ const char *source, const char **msg) { - if (pending_consensus) { + if (pending_consensuses[FLAV_NS].consensus) { log_notice(LD_DIR, "Got a signature from %s. " "Adding it to the pending consensus.", source); - return dirvote_add_signatures_to_pending_consensus( + return dirvote_add_signatures_to_all_pending_consensuses( detached_signatures_body, msg); } else { log_notice(LD_DIR, "Got a signature from %s. " - "Queueing it for the next consensus.", source); + "Queuing it for the next consensus.", source); if (!pending_consensus_signature_list) pending_consensus_signature_list = smartlist_create(); smartlist_add(pending_consensus_signature_list, @@ -1956,17 +3111,25 @@ static int dirvote_publish_consensus(void) { - /* Can we actually publish it yet? */ - if (!pending_consensus || - networkstatus_check_consensus_signature(pending_consensus, 1)<0) { - log_warn(LD_DIR, "Not enough info to publish pending consensus"); - return -1; - } + int i; - if (networkstatus_set_current_consensus(pending_consensus_body, 0)) - log_warn(LD_DIR, "Error publishing consensus"); - else - log_notice(LD_DIR, "Consensus published."); + /* Now remember all the other consensuses as if we were a directory cache. */ + for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { + pending_consensus_t *pending = &pending_consensuses[i]; + const char *name; + name = networkstatus_get_flavor_name(i); + tor_assert(name); + if (!pending->consensus || + networkstatus_check_consensus_signature(pending->consensus, 1)<0) { + log_warn(LD_DIR, "Not enough info to publish pending %s consensus",name); + continue; + } + + if (networkstatus_set_current_consensus(pending->body, name, 0)) + log_warn(LD_DIR, "Error publishing %s consensus", name); + else + log_notice(LD_DIR, "Published %s consensus", name); + } return 0; } @@ -1976,20 +3139,16 @@ dirvote_free_all(void) { dirvote_clear_votes(1); - /* now empty as a result of clear_pending_votes. */ + /* now empty as a result of dirvote_clear_votes(). */ smartlist_free(pending_vote_list); pending_vote_list = NULL; smartlist_free(previous_vote_list); previous_vote_list = NULL; - tor_free(pending_consensus_body); + dirvote_clear_pending_consensuses(); tor_free(pending_consensus_signatures); - if (pending_consensus) { - networkstatus_vote_free(pending_consensus); - pending_consensus = NULL; - } if (pending_consensus_signature_list) { - /* now empty as a result of clear_pending_votes. */ + /* now empty as a result of dirvote_clear_votes(). */ smartlist_free(pending_consensus_signature_list); pending_consensus_signature_list = NULL; } @@ -2001,13 +3160,14 @@ /** Return the body of the consensus that we're currently trying to build. */ const char * -dirvote_get_pending_consensus(void) +dirvote_get_pending_consensus(consensus_flavor_t flav) { - return pending_consensus_body; + tor_assert(((int)flav) >= 0 && flav < N_CONSENSUS_FLAVORS); + return pending_consensuses[flav].body; } /** Return the signatures that we know for the consensus that we're currently - * trying to build */ + * trying to build. */ const char * dirvote_get_pending_detached_signatures(void) { @@ -2053,15 +3213,147 @@ } else { if (pending_vote_list && include_pending) { SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, pv, - if (!memcmp(pv->vote->networkstatus_digest, fp, DIGEST_LEN)) + if (!memcmp(pv->vote->digests.d[DIGEST_SHA1], fp, DIGEST_LEN)) return pv->vote_body); } if (previous_vote_list && include_previous) { SMARTLIST_FOREACH(previous_vote_list, pending_vote_t *, pv, - if (!memcmp(pv->vote->networkstatus_digest, fp, DIGEST_LEN)) + if (!memcmp(pv->vote->digests.d[DIGEST_SHA1], fp, DIGEST_LEN)) return pv->vote_body); } } return NULL; } +/** Construct and return a new microdescriptor from a routerinfo ri. + * + * XXX Right now, there is only one way to generate microdescriptors from + * router descriptors. This may change in future consensus methods. If so, + * we'll need an internal way to remember which method we used, and ask for a + * particular method. + **/ +microdesc_t * +dirvote_create_microdescriptor(const routerinfo_t *ri) +{ + microdesc_t *result = NULL; + char *key = NULL, *summary = NULL, *family = NULL; + char buf[1024]; + size_t keylen; + char *out = buf, *end = buf+sizeof(buf); + + if (crypto_pk_write_public_key_to_string(ri->onion_pkey, &key, &keylen)<0) + goto done; + summary = policy_summarize(ri->exit_policy); + if (ri->declared_family) + family = smartlist_join_strings(ri->declared_family, " ", 0, NULL); + + if (tor_snprintf(out, end-out, "onion-key\n%s", key)<0) + goto done; + out += strlen(out); + if (family) { + if (tor_snprintf(out, end-out, "family %s\n", family)<0) + goto done; + out += strlen(out); + } + if (summary && strcmp(summary, "reject 1-65535")) { + if (tor_snprintf(out, end-out, "p %s\n", summary)<0) + goto done; + out += strlen(out); + } + *out = '\0'; /* Make sure it's nul-terminated. This should be a no-op */ + + { + smartlist_t *lst = microdescs_parse_from_string(buf, out, 0, 1); + if (smartlist_len(lst) != 1) { + log_warn(LD_DIR, "We generated a microdescriptor we couldn't parse."); + SMARTLIST_FOREACH(lst, microdesc_t *, md, microdesc_free(md)); + smartlist_free(lst); + goto done; + } + result = smartlist_get(lst, 0); + smartlist_free(lst); + } + + done: + tor_free(key); + tor_free(summary); + tor_free(family); + return result; +} + +/** Cached space-separated string to hold */ +static char *microdesc_consensus_methods = NULL; + +/** Format the appropriate vote line to describe the microdescriptor md + * in a consensus vote document. Write it into the out_len-byte buffer + * in out. Return -1 on failure and the number of characters written + * on success. */ +ssize_t +dirvote_format_microdesc_vote_line(char *out, size_t out_len, + const microdesc_t *md) +{ + char d64[BASE64_DIGEST256_LEN+1]; + if (!microdesc_consensus_methods) { + microdesc_consensus_methods = + make_consensus_method_list(MIN_METHOD_FOR_MICRODESC, + MAX_SUPPORTED_CONSENSUS_METHOD, + ","); + tor_assert(microdesc_consensus_methods); + } + if (digest256_to_base64(d64, md->digest)<0) + return -1; + + if (tor_snprintf(out, out_len, "m %s sha256=%s\n", + microdesc_consensus_methods, d64)<0) + return -1; + + return strlen(out); +} + +/** If vrs has a hash made for the consensus method method with + * the digest algorithm alg, decode it and copy it into + * digest256_out and return 0. Otherwise return -1. */ +int +vote_routerstatus_find_microdesc_hash(char *digest256_out, + const vote_routerstatus_t *vrs, + int method, + digest_algorithm_t alg) +{ + /* XXXX only returns the sha256 method. */ + const vote_microdesc_hash_t *h; + char mstr[64]; + size_t mlen; + char dstr[64]; + + tor_snprintf(mstr, sizeof(mstr), "%d", method); + mlen = strlen(mstr); + tor_snprintf(dstr, sizeof(dstr), " %s=", + crypto_digest_algorithm_get_name(alg)); + + for (h = vrs->microdesc; h; h = h->next) { + const char *cp = h->microdesc_hash_line; + size_t num_len; + /* cp looks like \d+(,\d+)* (digesttype=val )+ . Let's hunt for mstr in + * the first part. */ + while (1) { + num_len = strspn(cp, "1234567890"); + if (num_len == mlen && !memcmp(mstr, cp, mlen)) { + /* This is the line. */ + char buf[BASE64_DIGEST256_LEN+1]; + /* XXXX ignores extraneous stuff if the digest is too long. This + * seems harmless enough, right? */ + cp = strstr(cp, dstr); + if (!cp) + return -1; + cp += strlen(dstr); + strlcpy(buf, cp, sizeof(buf)); + return digest256_from_base64(digest256_out, buf); + } + if (num_len == 0 || cp[num_len] != ',') + break; + cp += num_len + 1; + } + } + return -1; +} + diff -Nru tor-0.2.0.34/src/or/dirvote.h tor-0.2.2.16-alpha/src/or/dirvote.h --- tor-0.2.0.34/src/or/dirvote.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/dirvote.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,93 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file dirvote.h + * \brief Header file for dirvote.c. + **/ + +#ifndef _TOR_DIRVOTE_H +#define _TOR_DIRVOTE_H + +/** Lowest allowable value for VoteSeconds. */ +#define MIN_VOTE_SECONDS 20 +/** Lowest allowable value for DistSeconds. */ +#define MIN_DIST_SECONDS 20 +/** Smallest allowable voting interval. */ +#define MIN_VOTE_INTERVAL 300 + +/** Precision multiplier for the Bw weights */ +#define BW_WEIGHT_SCALE 10000 + +void dirvote_free_all(void); + +/* vote manipulation */ +char *networkstatus_compute_consensus(smartlist_t *votes, + int total_authorities, + crypto_pk_env_t *identity_key, + crypto_pk_env_t *signing_key, + const char *legacy_identity_key_digest, + crypto_pk_env_t *legacy_signing_key, + consensus_flavor_t flavor); +int networkstatus_add_detached_signatures(networkstatus_t *target, + ns_detached_signatures_t *sigs, + const char **msg_out); +char *networkstatus_get_detached_signatures(smartlist_t *consensuses); +void ns_detached_signatures_free(ns_detached_signatures_t *s); + +/* cert manipulation */ +authority_cert_t *authority_cert_dup(authority_cert_t *cert); + +/* vote scheduling */ +void dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out); +time_t dirvote_get_start_of_next_interval(time_t now, int interval); +void dirvote_recalculate_timing(or_options_t *options, time_t now); +void dirvote_act(or_options_t *options, time_t now); + +/* invoked on timers and by outside triggers. */ +struct pending_vote_t * dirvote_add_vote(const char *vote_body, + const char **msg_out, + int *status_out); +int dirvote_add_signatures(const char *detached_signatures_body, + const char *source, + const char **msg_out); + +/* Item access */ +const char *dirvote_get_pending_consensus(consensus_flavor_t flav); +const char *dirvote_get_pending_detached_signatures(void); +#define DGV_BY_ID 1 +#define DGV_INCLUDE_PENDING 2 +#define DGV_INCLUDE_PREVIOUS 4 +const cached_dir_t *dirvote_get_vote(const char *fp, int flags); +void set_routerstatus_from_routerinfo(routerstatus_t *rs, + routerinfo_t *ri, time_t now, + int naming, int listbadexits, + int listbaddirs); +void router_clear_status_flags(routerinfo_t *ri); +networkstatus_t * +dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key, + authority_cert_t *cert); + +microdesc_t *dirvote_create_microdescriptor(const routerinfo_t *ri); +ssize_t dirvote_format_microdesc_vote_line(char *out, size_t out_len, + const microdesc_t *md); + +int vote_routerstatus_find_microdesc_hash(char *digest256_out, + const vote_routerstatus_t *vrs, + int method, + digest_algorithm_t alg); +document_signature_t *voter_get_sig_by_algorithm( + const networkstatus_voter_info_t *voter, + digest_algorithm_t alg); + +#ifdef DIRVOTE_PRIVATE +char *format_networkstatus_vote(crypto_pk_env_t *private_key, + networkstatus_t *v3_ns); +char *dirvote_compute_params(smartlist_t *votes); +#endif + +#endif + diff -Nru tor-0.2.0.34/src/or/dns.c tor-0.2.2.16-alpha/src/or/dns.c --- tor-0.2.0.34/src/or/dns.c 2009-01-14 19:58:15.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/dns.c 2010-08-11 03:14:16.000000000 +0000 @@ -1,10 +1,7 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: dns.c 18066 2009-01-10 14:49:38Z nickm $ */ -const char dns_c_id[] = - "$Id: dns.c 18066 2009-01-10 14:49:38Z nickm $"; /** * \file dns.c @@ -15,8 +12,63 @@ **/ #include "or.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "control.h" +#include "dns.h" +#include "main.h" +#include "policies.h" +#include "relay.h" +#include "router.h" #include "ht.h" +#ifdef HAVE_EVENT2_DNS_H +#include +#include +#else +#include #include "eventdns.h" +#ifndef HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS +#define HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS +#endif +#endif + +#ifndef HAVE_EVENT2_DNS_H +struct evdns_base; +struct evdns_request; +#define evdns_base_new(x,y) tor_malloc(1) +#define evdns_base_clear_nameservers_and_suspend(base) \ + evdns_clear_nameservers_and_suspend() +#define evdns_base_search_clear(base) evdns_search_clear() +#define evdns_base_set_default_outgoing_bind_address(base, a, len) \ + evdns_set_default_outgoing_bind_address((a),(len)) +#define evdns_base_resolv_conf_parse(base, options, fname) \ + evdns_resolv_conf_parse((options), (fname)) +#define evdns_base_count_nameservers(base) \ + evdns_count_nameservers() +#define evdns_base_resume(base) \ + evdns_resume() +#define evdns_base_config_windows_nameservers(base) \ + evdns_config_windows_nameservers() +#define evdns_base_set_option_(base, opt, val) \ + evdns_set_option((opt),(val),DNS_OPTIONS_ALL) +#define evdns_base_resolve_ipv4(base, addr, options, cb, ptr) \ + ((evdns_resolve_ipv4(addr, options, cb, ptr)<0) ? NULL : ((void*)1)) +#define evdns_base_resolve_reverse(base, addr, options, cb, ptr) \ + ((evdns_resolve_reverse(addr, options, cb, ptr)<0) ? NULL : ((void*)1)) +#define evdns_base_resolve_reverse_ipv6(base, addr, options, cb, ptr) \ + ((evdns_resolve_reverse_ipv6(addr, options, cb, ptr)<0) ? NULL : ((void*)1)) + +#elif defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER < 0x02000303 +#define evdns_base_set_option_(base, opt, val) \ + evdns_base_set_option((base), (opt),(val),DNS_OPTIONS_ALL) + +#else +#define evdns_base_set_option_ evdns_base_set_option + +#endif /** Longest hostname we're willing to resolve. */ #define MAX_ADDRESSLEN 256 @@ -31,6 +83,9 @@ #define DNS_RESOLVE_FAILED_PERMANENT 2 #define DNS_RESOLVE_SUCCEEDED 3 +/** Our evdns_base; this structure handles all our name lookups. */ +static struct evdns_base *the_evdns_base = NULL; + /** Have we currently configured nameservers with eventdns? */ static int nameservers_configured = 0; /** Did our most recent attempt to configure nameservers with eventdns fail? */ @@ -80,7 +135,10 @@ uint32_t magic; char address[MAX_ADDRESSLEN]; /**< The hostname to be resolved. */ union { - uint32_t addr; /**< IPv4 addr for address. */ + struct { + struct in6_addr addr6; /**< IPv6 addr for address. */ + uint32_t addr; /**< IPv4 addr for address. */ + } a; char *hostname; /**< Hostname for address (if a reverse lookup) */ } result; uint8_t state; /**< Is this cached entry pending/done/valid/failed? */ @@ -89,6 +147,8 @@ uint32_t ttl; /**< What TTL did the nameserver tell us? */ /** Connections that want to know when we get an answer for this resolve. */ pending_connection_t *pending_connections; + /** Position of this element in the heap*/ + int minheap_idx; } cached_resolve_t; static void purge_expired_resolves(time_t now); @@ -183,13 +243,12 @@ log(severity, LD_EXIT, "eventdns: %s", msg); } -/** Helper: generate a good random transaction ID. */ -static uint16_t -dns_get_transaction_id(void) -{ - uint16_t result; - crypto_rand((void*)&result, sizeof(result)); - return result; +/** Helper: passed to eventdns.c as a callback so it can generate random + * numbers for transaction IDs and 0x20-hack coding. */ +static void +_dns_randfn(char *b, size_t n) +{ + crypto_rand(b,n); } /** Initialize the DNS subsystem; called by the OR process. */ @@ -197,13 +256,11 @@ dns_init(void) { init_cache_map(); - evdns_set_transaction_id_fn(dns_get_transaction_id); - if (get_options()->ServerDNSRandomizeCase) - evdns_set_option("randomize-case:", "1", DNS_OPTIONS_ALL); - else - evdns_set_option("randomize-case:", "0", DNS_OPTIONS_ALL); - if (server_mode(get_options())) - return configure_nameservers(1); + evdns_set_random_bytes_fn(_dns_randfn); + if (server_mode(get_options())) { + int r = configure_nameservers(1); + return r; + } return 0; } @@ -214,8 +271,16 @@ { or_options_t *options = get_options(); if (! server_mode(options)) { - evdns_clear_nameservers_and_suspend(); - evdns_search_clear(); + + if (!the_evdns_base) { + if (!(the_evdns_base = evdns_base_new(tor_libevent_get_base(), 0))) { + log_err(LD_BUG, "Couldn't create an evdns_base"); + return -1; + } + } + + evdns_base_clear_nameservers_and_suspend(the_evdns_base); + evdns_base_search_clear(the_evdns_base); nameservers_configured = 0; tor_free(resolv_conf_fname); resolv_conf_mtime = 0; @@ -227,7 +292,8 @@ return 0; } -/**DOCDOC*/ +/** Return true iff the most recent attempt to initialize the DNS subsystem + * failed. */ int has_dns_init_failed(void) { @@ -264,6 +330,8 @@ static void _free_cached_resolve(cached_resolve_t *r) { + if (!r) + return; while (r->pending_connections) { pending_connection_t *victim = r->pending_connections; r->pending_connections = victim->next; @@ -305,6 +373,7 @@ resolve->expire = expires; smartlist_pqueue_add(cached_resolve_pqueue, _compare_cached_resolves_by_expiry, + STRUCT_OFFSET(cached_resolve_t, minheap_idx), resolve); } @@ -327,8 +396,7 @@ _free_cached_resolve(item); } HT_CLEAR(cache_map, &cache_root); - if (cached_resolve_pqueue) - smartlist_free(cached_resolve_pqueue); + smartlist_free(cached_resolve_pqueue); cached_resolve_pqueue = NULL; tor_free(resolv_conf_fname); } @@ -351,7 +419,8 @@ if (resolve->expire > now) break; smartlist_pqueue_pop(cached_resolve_pqueue, - _compare_cached_resolves_by_expiry); + _compare_cached_resolves_by_expiry, + STRUCT_OFFSET(cached_resolve_t, minheap_idx)); if (resolve->state == CACHE_STATE_PENDING) { log_debug(LD_EXIT, @@ -395,7 +464,7 @@ log_err(LD_BUG, "The expired resolve we purged didn't match any in" " the cache. Tried to purge %s (%p); instead got %s (%p).", resolve->address, (void*)resolve, - removed ? removed->address : "NULL", (void*)remove); + removed ? removed->address : "NULL", (void*)removed); } tor_assert(removed == resolve); } else { @@ -434,10 +503,11 @@ { case RESOLVED_TYPE_IPV4: buf[1] = 4; - set_uint32(buf+2, htonl(conn->_base.addr)); + set_uint32(buf+2, tor_addr_to_ipv4n(&conn->_base.addr)); set_uint32(buf+6, htonl(ttl)); buflen = 10; break; + /*XXXX IP6 need ipv6 implementation */ case RESOLVED_TYPE_ERROR_TRANSIENT: case RESOLVED_TYPE_ERROR: { @@ -490,49 +560,6 @@ // log_notice(LD_EXIT, "Sent"); } -/** Given a lower-case address, check to see whether it's a - * 1.2.3.4.in-addr.arpa address used for reverse lookups. If so, - * parse it and place the address in in if present. Return 1 on success; - * 0 if the address is not in in-addr.arpa format, and -1 if the address is - * malformed. */ -/* XXXX021 move this to util.c. */ -int -parse_inaddr_arpa_address(const char *address, struct in_addr *in) -{ - char buf[INET_NTOA_BUF_LEN]; - char *cp; - size_t len; - struct in_addr inaddr; - - cp = strstr(address, ".in-addr.arpa"); - if (!cp || *(cp+strlen(".in-addr.arpa"))) - return 0; /* not an .in-addr.arpa address */ - - len = cp - address; - - if (len >= INET_NTOA_BUF_LEN) - return -1; /* Too long. */ - - memcpy(buf, address, len); - buf[len] = '\0'; - if (tor_inet_aton(buf, &inaddr) == 0) - return -1; /* malformed. */ - - if (in) { - uint32_t a; - /* reverse the bytes */ - a = (uint32_t) ( ((inaddr.s_addr & 0x000000fful) << 24) - |((inaddr.s_addr & 0x0000ff00ul) << 8) - |((inaddr.s_addr & 0x00ff0000ul) >> 8) - |((inaddr.s_addr & 0xff000000ul) >> 24)); - inaddr.s_addr = a; - - memcpy(in, &inaddr, sizeof(inaddr)); - } - - return 1; -} - /** See if we have a cache entry for exitconn-\>address. if so, * if resolve valid, put it into exitconn-\>addr and return 1. * If resolve failed, free exitconn and return -1. @@ -607,7 +634,7 @@ if (!exitconn->_base.marked_for_close) { connection_free(TO_CONN(exitconn)); - //XXX020 ... and we just leak exitconn otherwise? -RD + // XXX ... and we just leak exitconn otherwise? -RD // If it's marked for close, it's on closeable_connection_lst in // main.c. If it's on the closeable list, it will get freed from // main.c. -NM @@ -642,7 +669,7 @@ cached_resolve_t search; pending_connection_t *pending_connection; routerinfo_t *me; - struct in_addr in; + tor_addr_t addr; time_t now = time(NULL); uint8_t is_reverse = 0; int r; @@ -653,11 +680,17 @@ /* first check if exitconn->_base.address is an IP. If so, we already * know the answer. */ - if (tor_inet_aton(exitconn->_base.address, &in) != 0) { - exitconn->_base.addr = ntohl(in.s_addr); - exitconn->address_ttl = DEFAULT_DNS_TTL; - return 1; + if (tor_addr_from_str(&addr, exitconn->_base.address) >= 0) { + if (tor_addr_family(&addr) == AF_INET) { + tor_addr_copy(&exitconn->_base.addr, &addr); + exitconn->address_ttl = DEFAULT_DNS_TTL; + return 1; + } else { + /* XXXX IPv6 */ + return -1; + } } + /* If we're a non-exit, don't even do DNS lookups. */ if (!(me = router_get_my_routerinfo()) || policy_is_reject_star(me->exit_policy)) { @@ -681,11 +714,12 @@ * .in-addr.arpa address but this isn't a resolve request, kill the * connection. */ - if ((r = parse_inaddr_arpa_address(exitconn->_base.address, &in)) != 0) { + if ((r = tor_addr_parse_reverse_lookup_name(&addr, exitconn->_base.address, + AF_UNSPEC, 0)) != 0) { if (r == 1) { is_reverse = 1; - if (is_internal_IP(ntohl(in.s_addr), 0)) /* internal address */ - return -1; + if (tor_addr_is_internal(&addr, 0)) /* internal address? */ + return -1; } if (!is_reverse || !is_resolve) { @@ -729,7 +763,7 @@ tor_assert(is_resolve); *hostname_out = tor_strdup(resolve->result.hostname); } else { - exitconn->_base.addr = resolve->result.addr; + tor_addr_from_ipv4h(&exitconn->_base.addr, resolve->result.a.addr); } return 1; case CACHE_STATE_CACHED_FAILED: @@ -748,6 +782,7 @@ resolve = tor_malloc_zero(sizeof(cached_resolve_t)); resolve->magic = CACHED_RESOLVE_MAGIC; resolve->state = CACHE_STATE_PENDING; + resolve->minheap_idx = -1; resolve->is_reverse = is_reverse; strlcpy(resolve->address, exitconn->_base.address, sizeof(resolve->address)); @@ -773,15 +808,25 @@ assert_connection_edge_not_dns_pending(edge_connection_t *conn) { pending_connection_t *pend; - cached_resolve_t **resolve; + cached_resolve_t search; +#if 1 + cached_resolve_t *resolve; + strlcpy(search.address, conn->_base.address, sizeof(search.address)); + resolve = HT_FIND(cache_map, &cache_root, &search); + if (!resolve) + return; + for (pend = resolve->pending_connections; pend; pend = pend->next) { + tor_assert(pend->conn != conn); + } +#else + cached_resolve_t **resolve; HT_FOREACH(resolve, cache_map, &cache_root) { - for (pend = (*resolve)->pending_connections; - pend; - pend = pend->next) { + for (pend = (*resolve)->pending_connections; pend; pend = pend->next) { tor_assert(pend->conn != conn); } } +#endif } /** Log an error and abort if any connection waiting for a DNS resolve is @@ -834,7 +879,8 @@ tor_free(pend); log_debug(LD_EXIT, "First connection (fd %d) no longer waiting " "for resolve of %s", - conn->_base.s, escaped_safe_str(conn->_base.address)); + conn->_base.s, + escaped_safe_str(conn->_base.address)); return; } else { for ( ; pend->next; pend = pend->next) { @@ -960,7 +1006,7 @@ } } else { tor_assert(!hostname); - resolve->result.addr = addr; + resolve->result.a.addr = addr; } resolve->ttl = ttl; assert_resolve_ok(resolve); @@ -1011,7 +1057,7 @@ assert_resolve_ok(resolve); if (resolve->state != CACHE_STATE_PENDING) { - /* XXXX020 Maybe update addr? or check addr for consistency? Or let + /* XXXX Maybe update addr? or check addr for consistency? Or let * VALID replace FAILED? */ int is_test_addr = is_test_address(address); if (!is_test_addr) @@ -1032,7 +1078,7 @@ pendconn = pend->conn; /* don't pass complex things to the connection_mark_for_close macro */ assert_connection_ok(TO_CONN(pendconn),time(NULL)); - pendconn->_base.addr = addr; + tor_addr_from_ipv4h(&pendconn->_base.addr, addr); pendconn->address_ttl = ttl; if (outcome != DNS_RESOLVE_SUCCEEDED) { @@ -1135,6 +1181,36 @@ conf_fname = "/etc/resolv.conf"; #endif + if (!the_evdns_base) { + if (!(the_evdns_base = evdns_base_new(tor_libevent_get_base(), 0))) { + log_err(LD_BUG, "Couldn't create an evdns_base"); + return -1; + } + } + +#ifdef HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS + if (options->OutboundBindAddress) { + tor_addr_t addr; + if (tor_addr_from_str(&addr, options->OutboundBindAddress) < 0) { + log_warn(LD_CONFIG,"Outbound bind address '%s' didn't parse. Ignoring.", + options->OutboundBindAddress); + } else { + int socklen; + struct sockaddr_storage ss; + socklen = tor_addr_to_sockaddr(&addr, 0, + (struct sockaddr *)&ss, sizeof(ss)); + if (socklen < 0) { + log_warn(LD_BUG, "Couldn't convert outbound bind address to sockaddr." + " Ignoring."); + } else { + evdns_base_set_default_outgoing_bind_address(the_evdns_base, + (struct sockaddr *)&ss, + socklen); + } + } + } +#endif + evdns_set_log_fn(evdns_log_cb); if (conf_fname) { if (stat(conf_fname, &st)) { @@ -1148,16 +1224,17 @@ return 0; } if (nameservers_configured) { - evdns_search_clear(); - evdns_clear_nameservers_and_suspend(); + evdns_base_search_clear(the_evdns_base); + evdns_base_clear_nameservers_and_suspend(the_evdns_base); } log_info(LD_EXIT, "Parsing resolver configuration in '%s'", conf_fname); - if ((r = evdns_resolv_conf_parse(DNS_OPTIONS_ALL, conf_fname))) { + if ((r = evdns_base_resolv_conf_parse(the_evdns_base, + DNS_OPTIONS_ALL, conf_fname))) { log_warn(LD_EXIT, "Unable to parse '%s', or no nameservers in '%s' (%d)", conf_fname, conf_fname, r); goto err; } - if (evdns_count_nameservers() == 0) { + if (evdns_base_count_nameservers(the_evdns_base) == 0) { log_warn(LD_EXIT, "Unable to find any nameservers in '%s'.", conf_fname); goto err; } @@ -1165,38 +1242,47 @@ resolv_conf_fname = tor_strdup(conf_fname); resolv_conf_mtime = st.st_mtime; if (nameservers_configured) - evdns_resume(); + evdns_base_resume(the_evdns_base); } #ifdef MS_WINDOWS else { if (nameservers_configured) { - evdns_search_clear(); - evdns_clear_nameservers_and_suspend(); + evdns_base_search_clear(the_evdns_base); + evdns_base_clear_nameservers_and_suspend(the_evdns_base); } - if (evdns_config_windows_nameservers()) { + if (evdns_base_config_windows_nameservers(the_evdns_base)) { log_warn(LD_EXIT,"Could not config nameservers."); goto err; } - if (evdns_count_nameservers() == 0) { + if (evdns_base_count_nameservers(the_evdns_base) == 0) { log_warn(LD_EXIT, "Unable to find any platform nameservers in " "your Windows configuration."); goto err; } if (nameservers_configured) - evdns_resume(); + evdns_base_resume(the_evdns_base); tor_free(resolv_conf_fname); resolv_conf_mtime = 0; } #endif - if (evdns_count_nameservers() == 1) { - evdns_set_option("max-timeouts:", "16", DNS_OPTIONS_ALL); - evdns_set_option("timeout:", "10", DNS_OPTIONS_ALL); +#define SET(k,v) evdns_base_set_option_(the_evdns_base, (k), (v)) + + if (evdns_base_count_nameservers(the_evdns_base) == 1) { + SET("max-timeouts:", "16"); + SET("timeout:", "10"); } else { - evdns_set_option("max-timeouts:", "3", DNS_OPTIONS_ALL); - evdns_set_option("timeout:", "5", DNS_OPTIONS_ALL); + SET("max-timeouts:", "3"); + SET("timeout:", "5"); } + if (options->ServerDNSRandomizeCase) + SET("randomize-case:", "1"); + else + SET("randomize-case:", "0"); + +#undef SET + dns_servers_relaunch_checks(); nameservers_configured = 1; @@ -1294,7 +1380,8 @@ launch_resolve(edge_connection_t *exitconn) { char *addr = tor_strdup(exitconn->_base.address); - struct in_addr in; + struct evdns_request *req = NULL; + tor_addr_t a; int r; int options = get_options()->ServerDNSSearchDomains ? 0 : DNS_QUERY_NO_SEARCH; @@ -1307,25 +1394,36 @@ } } - r = parse_inaddr_arpa_address(exitconn->_base.address, &in); + r = tor_addr_parse_reverse_lookup_name( + &a, exitconn->_base.address, AF_UNSPEC, 0); + + tor_assert(the_evdns_base); if (r == 0) { log_info(LD_EXIT, "Launching eventdns request for %s", escaped_safe_str(exitconn->_base.address)); - r = evdns_resolve_ipv4(exitconn->_base.address, options, - evdns_callback, addr); + req = evdns_base_resolve_ipv4(the_evdns_base, + exitconn->_base.address, options, + evdns_callback, addr); } else if (r == 1) { log_info(LD_EXIT, "Launching eventdns reverse request for %s", escaped_safe_str(exitconn->_base.address)); - r = evdns_resolve_reverse(&in, DNS_QUERY_NO_SEARCH, - evdns_callback, addr); + if (tor_addr_family(&a) == AF_INET) + req = evdns_base_resolve_reverse(the_evdns_base, + tor_addr_to_in(&a), DNS_QUERY_NO_SEARCH, + evdns_callback, addr); + else + req = evdns_base_resolve_reverse_ipv6(the_evdns_base, + tor_addr_to_in6(&a), DNS_QUERY_NO_SEARCH, + evdns_callback, addr); } else if (r == -1) { log_warn(LD_BUG, "Somehow a malformed in-addr.arpa address reached here."); } - if (r) { - log_warn(LD_EXIT, "eventdns rejected address %s: error %d.", - escaped_safe_str(addr), r); - r = evdns_err_is_transient(r) ? -2 : -1; + r = 0; + if (!req) { + log_warn(LD_EXIT, "eventdns rejected address %s.", + escaped_safe_str(addr)); + r = -1; tor_free(addr); /* There is no evdns request in progress; stop * addr from getting leaked. */ } @@ -1446,10 +1544,11 @@ } log(dns_wildcard_one_notice_given ? LOG_INFO : LOG_NOTICE, LD_EXIT, "Your DNS provider gave an answer for \"%s\", which " - "is not supposed to exist. Apparently they are hijacking " - "DNS failures. Trying to correct for this. We've noticed %d possibly " - "bad addresses so far.", - string_address, strmap_size(dns_wildcard_response_count)); + "is not supposed to exist. Apparently they are hijacking " + "DNS failures. Trying to correct for this. We've noticed %d " + "possibly bad address%s so far.", + string_address, strmap_size(dns_wildcard_response_count), + (strmap_size(dns_wildcard_response_count) == 1) ? "" : "es"); dns_wildcard_one_notice_given = 1; } tor_free(arg); @@ -1462,17 +1561,20 @@ launch_wildcard_check(int min_len, int max_len, const char *suffix) { char *addr; - int r; + struct evdns_request *req; addr = crypto_random_hostname(min_len, max_len, "", suffix); log_info(LD_EXIT, "Testing whether our DNS server is hijacking nonexistent " "domains with request for bogus hostname \"%s\"", addr); - r = evdns_resolve_ipv4(/* This "addr" tells us which address to resolve */ + tor_assert(the_evdns_base); + req = evdns_base_resolve_ipv4( + the_evdns_base, + /* This "addr" tells us which address to resolve */ addr, DNS_QUERY_NO_SEARCH, evdns_wildcard_check_callback, /* This "addr" is an argument to the callback*/ addr); - if (r) { + if (!req) { /* There is no evdns request in progress; stop addr from getting leaked */ tor_free(addr); } @@ -1484,6 +1586,7 @@ launch_test_addresses(int fd, short event, void *args) { or_options_t *options = get_options(); + struct evdns_request *req; (void)fd; (void)event; (void)args; @@ -1495,14 +1598,19 @@ * be an exit server.*/ if (!options->ServerDNSTestAddresses) return; - SMARTLIST_FOREACH(options->ServerDNSTestAddresses, const char *, address, - { - int r = evdns_resolve_ipv4(address, DNS_QUERY_NO_SEARCH, evdns_callback, - tor_strdup(address)); - if (r) - log_info(LD_EXIT, "eventdns rejected test address %s: error %d", - escaped_safe_str(address), r); - }); + tor_assert(the_evdns_base); + SMARTLIST_FOREACH_BEGIN(options->ServerDNSTestAddresses, + const char *, address) { + char *a = tor_strdup(address); + req = evdns_base_resolve_ipv4(the_evdns_base, + address, DNS_QUERY_NO_SEARCH, evdns_callback, a); + + if (!req) { + log_info(LD_EXIT, "eventdns rejected test address %s", + escaped_safe_str(address)); + tor_free(a); + } + } SMARTLIST_FOREACH_END(address); } #define N_WILDCARD_CHECKS 2 @@ -1543,7 +1651,7 @@ void dns_launch_correctness_checks(void) { - static struct event launch_event; + static struct event *launch_event = NULL; struct timeval timeout; if (!get_options()->ServerDNSDetectHijacking) return; @@ -1551,15 +1659,17 @@ /* Wait a while before launching requests for test addresses, so we can * get the results from checking for wildcarding. */ - evtimer_set(&launch_event, launch_test_addresses, NULL); + if (! launch_event) + launch_event = tor_evtimer_new(tor_libevent_get_base(), + launch_test_addresses, NULL); timeout.tv_sec = 30; timeout.tv_usec = 0; - if (evtimer_add(&launch_event, &timeout)<0) { + if (evtimer_add(launch_event, &timeout)<0) { log_warn(LD_BUG, "Couldn't add timer for checking for dns hijacking"); } } -/** Return true iff our DNS servers lie to us too much to be trustd. */ +/** Return true iff our DNS servers lie to us too much to be trusted. */ int dns_seems_to_be_broken(void) { @@ -1570,10 +1680,9 @@ void dns_reset_correctness_checks(void) { - if (dns_wildcard_response_count) { - strmap_free(dns_wildcard_response_count, _tor_free); - dns_wildcard_response_count = NULL; - } + strmap_free(dns_wildcard_response_count, _tor_free); + dns_wildcard_response_count = NULL; + n_wildcard_requests = 0; if (dns_wildcard_list) { @@ -1614,10 +1723,34 @@ if (resolve->is_reverse) tor_assert(!resolve->result.hostname); else - tor_assert(!resolve->result.addr); + tor_assert(!resolve->result.a.addr); } } +/** Return the number of DNS cache entries as an int */ +static int +dns_cache_entry_count(void) +{ + return HT_SIZE(&cache_root); +} + +/** Log memory information about our internal DNS cache at level 'severity'. */ +void +dump_dns_mem_usage(int severity) +{ + /* This should never be larger than INT_MAX. */ + int hash_count = dns_cache_entry_count(); + size_t hash_mem = sizeof(struct cached_resolve_t) * hash_count; + hash_mem += HT_MEM_USAGE(&cache_root); + + /* Print out the count and estimated size of our &cache_root. It undercounts + hostnames in cached reverse resolves. + */ + log(severity, LD_MM, "Our DNS cache has %d entries.", hash_count); + log(severity, LD_MM, "Our DNS cache size is approximately %u bytes.", + (unsigned)hash_mem); +} + #ifdef DEBUG_DNS_CACHE /** Exit with an assertion if the DNS cache is corrupt. */ static void @@ -1638,7 +1771,8 @@ return; smartlist_pqueue_assert_ok(cached_resolve_pqueue, - _compare_cached_resolves_by_expiry); + _compare_cached_resolves_by_expiry, + STRUCT_OFFSET(cached_resolve_t, minheap_idx)); SMARTLIST_FOREACH(cached_resolve_pqueue, cached_resolve_t *, res, { diff -Nru tor-0.2.0.34/src/or/dns.h tor-0.2.2.16-alpha/src/or/dns.h --- tor-0.2.0.34/src/or/dns.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/dns.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,31 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file dns.h + * \brief Header file for dns.c. + **/ + +#ifndef _TOR_DNS_H +#define _TOR_DNS_H + +int dns_init(void); +int has_dns_init_failed(void); +void dns_free_all(void); +uint32_t dns_clip_ttl(uint32_t ttl); +int dns_reset(void); +void connection_dns_remove(edge_connection_t *conn); +void assert_connection_edge_not_dns_pending(edge_connection_t *conn); +void assert_all_pending_dns_resolves_ok(void); +void dns_cancel_pending_resolve(const char *question); +int dns_resolve(edge_connection_t *exitconn); +void dns_launch_correctness_checks(void); +int dns_seems_to_be_broken(void); +void dns_reset_correctness_checks(void); +void dump_dns_mem_usage(int severity); + +#endif + diff -Nru tor-0.2.0.34/src/or/dnsserv.c tor-0.2.2.16-alpha/src/or/dnsserv.c --- tor-0.2.0.34/src/or/dnsserv.c 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/dnsserv.c 2010-09-17 01:30:36.000000000 +0000 @@ -1,8 +1,5 @@ -/* Copyright (c) 2007-2008, The Tor Project, Inc. */ +/* Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: dnsserv.c 13680 2008-02-22 19:09:45Z nickm $ */ -const char dnsserv_c_id[] = - "$Id: dnsserv.c 13680 2008-02-22 19:09:45Z nickm $"; /** * \file dnsserv.c \brief Implements client-side DNS proxy server code. Note: @@ -12,9 +9,23 @@ **/ #include "or.h" +#include "dnsserv.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "control.h" +#include "main.h" +#include "policies.h" +#ifdef HAVE_EVENT2_DNS_H +#include +#include +/* XXXX022 this implies we want an improved evdns */ +#include +#else #include "eventdns.h" +#endif -/* Helper function: called by evdns whenever the client sends a request to our +/** Helper function: called by evdns whenever the client sends a request to our * DNSPort. We need to eventually answer the request req. */ static void @@ -25,9 +36,9 @@ struct evdns_server_question *q = NULL; struct sockaddr_storage addr; struct sockaddr *sa; - struct sockaddr_in *sin; int addrlen; - uint32_t ipaddr; + tor_addr_t tor_addr; + uint16_t port; int err = DNS_ERR_NONE; char *q_name; @@ -46,17 +57,13 @@ } (void) addrlen; sa = (struct sockaddr*) &addr; - if (sa->sa_family != AF_INET) { - /* XXXX_IP6 Handle IPV6 */ - log_warn(LD_APP, "Requesting address wasn't ipv4."); + if (tor_addr_from_sockaddr(&tor_addr, sa, &port)<0) { + log_warn(LD_APP, "Requesting address wasn't recognized."); evdns_server_request_respond(req, DNS_ERR_SERVERFAILED); return; - } else { - sin = (struct sockaddr_in*)&addr; - ipaddr = ntohl(sin->sin_addr.s_addr); } - if (!socks_policy_permits_address(ipaddr)) { + if (!socks_policy_permits_address(&tor_addr)) { log_warn(LD_APP, "Rejecting DNS request from disallowed IP."); evdns_server_request_respond(req, DNS_ERR_REFUSED); return; @@ -76,7 +83,7 @@ "handle one question at a time for now. Skipping the extras."); } for (i = 0; i < req->nquestions; ++i) { - if (req->questions[i]->class != EVDNS_CLASS_INET) + if (req->questions[i]->dns_question_class != EVDNS_CLASS_INET) continue; switch (req->questions[i]->type) { case EVDNS_TYPE_A: @@ -92,12 +99,7 @@ evdns_server_request_respond(req, DNS_ERR_NONE); return; } - if (q->type == EVDNS_TYPE_A) { - /* Refuse any attempt to resolve a noconnect address, right now. */ - if (hostname_is_noconnect_address(q->name)) { - err = DNS_ERR_REFUSED; - } - } else { + if (q->type != EVDNS_TYPE_A) { tor_assert(q->type == EVDNS_TYPE_PTR); } @@ -112,13 +114,13 @@ } /* Make a new dummy AP connection, and attach the request to it. */ - conn = TO_EDGE_CONN(connection_new(CONN_TYPE_AP, AF_INET)); + conn = edge_connection_new(CONN_TYPE_AP, AF_INET); conn->_base.state = AP_CONN_STATE_RESOLVE_WAIT; conn->is_dns_request = 1; - TO_CONN(conn)->addr = ntohl(sin->sin_addr.s_addr); - TO_CONN(conn)->port = ntohs(sin->sin_port); - TO_CONN(conn)->address = tor_dup_addr(TO_CONN(conn)->addr); + tor_addr_copy(&TO_CONN(conn)->addr, &tor_addr); + TO_CONN(conn)->port = port; + TO_CONN(conn)->address = tor_dup_addr(&tor_addr); if (q->type == EVDNS_TYPE_A) conn->socks_request->command = SOCKS_COMMAND_RESOLVE; @@ -139,21 +141,22 @@ control_event_stream_status(conn, STREAM_EVENT_NEW, 0); - /* Now, throw the connection over to get rewritten (which will answer it - * immediately if it's in the cache, or completely bogus, or automapped), - * and then attached to a circuit. */ + /* Now, unless a controller asked us to leave streams unattached, + * throw the connection over to get rewritten (which will + * answer it immediately if it's in the cache, or completely bogus, or + * automapped), and then attached to a circuit. */ log_info(LD_APP, "Passing request for %s to rewrite_and_attach.", - escaped_safe_str(q->name)); + escaped_safe_str_client(q->name)); q_name = tor_strdup(q->name); /* q could be freed in rewrite_and_attach */ - connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL); + connection_ap_rewrite_and_attach_if_allowed(conn, NULL, NULL); /* Now, the connection is marked if it was bad. */ - log_info(LD_APP, "Passed request for %s to rewrite_and_attach.", - escaped_safe_str(q_name)); + log_info(LD_APP, "Passed request for %s to rewrite_and_attach_if_allowed.", + escaped_safe_str_client(q_name)); tor_free(q_name); } -/* Helper function: called whenever the client sends a resolve request to our +/** Helper function: called whenever the client sends a resolve request to our * controller. We need to eventually answer the request req. * Returns 0 if the controller will be getting (or has gotten) an event in * response; -1 if we couldn't launch the request. @@ -165,7 +168,7 @@ char *q_name; /* Make a new dummy AP connection, and attach the request to it. */ - conn = TO_EDGE_CONN(connection_new(CONN_TYPE_AP, AF_INET)); + conn = edge_connection_new(CONN_TYPE_AP, AF_INET); conn->_base.state = AP_CONN_STATE_RESOLVE_WAIT; if (reverse) @@ -184,17 +187,18 @@ return -1; } - /* Now, throw the connection over to get rewritten (which will answer it - * immediately if it's in the cache, or completely bogus, or automapped), - * and then attached to a circuit. */ + /* Now, unless a controller asked us to leave streams unattached, + * throw the connection over to get rewritten (which will + * answer it immediately if it's in the cache, or completely bogus, or + * automapped), and then attached to a circuit. */ log_info(LD_APP, "Passing request for %s to rewrite_and_attach.", - escaped_safe_str(name)); + escaped_safe_str_client(name)); q_name = tor_strdup(name); /* q could be freed in rewrite_and_attach */ - connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL); + connection_ap_rewrite_and_attach_if_allowed(conn, NULL, NULL); /* Now, the connection is marked if it was bad. */ - log_info(LD_APP, "Passed request for %s to rewrite_and_attach.", - escaped_safe_str(q_name)); + log_info(LD_APP, "Passed request for %s to rewrite_and_attach_if_allowed.", + escaped_safe_str_client(q_name)); tor_free(q_name); return 0; } @@ -211,6 +215,38 @@ } } +/** Look up the original name that corresponds to 'addr' in req. We use this + * to preserve case in order to facilitate people using 0x20-hacks to avoid + * DNS poisoning. */ +static const char * +evdns_get_orig_address(const struct evdns_server_request *req, + int rtype, const char *addr) +{ + int i, type; + + switch (rtype) { + case RESOLVED_TYPE_IPV4: + type = EVDNS_TYPE_A; + break; + case RESOLVED_TYPE_HOSTNAME: + type = EVDNS_TYPE_PTR; + break; + case RESOLVED_TYPE_IPV6: + type = EVDNS_TYPE_AAAA; + break; + default: + tor_fragile_assert(); + return addr; + } + + for (i = 0; i < req->nquestions; ++i) { + const struct evdns_server_question *q = req->questions[i]; + if (q->type == type && !strcasecmp(q->name, addr)) + return q->name; + } + return addr; +} + /** Tell the dns request waiting for an answer on conn that we have an * answer of type answer_type (RESOLVE_TYPE_IPV4/IPV6/ERR), of length * answer_len, in answer, with TTL ttl. Doesn't do @@ -223,11 +259,14 @@ int ttl) { struct evdns_server_request *req = conn->dns_server_request; + const char *name; int err = DNS_ERR_NONE; if (!req) return; + name = evdns_get_orig_address(req, answer_type, + conn->socks_request->address); - /* XXXX021 Re-do; this is dumb. */ + /* XXXX Re-do; this is dumb. */ if (ttl < 60) ttl = 60; @@ -240,13 +279,13 @@ } else if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4 && conn->socks_request->command == SOCKS_COMMAND_RESOLVE) { evdns_server_request_add_a_reply(req, - conn->socks_request->address, + name, 1, (char*)answer, ttl); } else if (answer_type == RESOLVED_TYPE_HOSTNAME && conn->socks_request->command == SOCKS_COMMAND_RESOLVE_PTR) { char *ans = tor_strndup(answer, answer_len); evdns_server_request_add_ptr_reply(req, NULL, - conn->socks_request->address, + name, (char*)answer, ttl); tor_free(ans); } else if (answer_type == RESOLVED_TYPE_ERROR) { @@ -260,17 +299,17 @@ conn->dns_server_request = NULL; } -/* Set up the evdns server port for the UDP socket on conn, which +/** Set up the evdns server port for the UDP socket on conn, which * must be an AP_DNS_LISTENER */ void dnsserv_configure_listener(connection_t *conn) { tor_assert(conn); - tor_assert(conn->s); + tor_assert(conn->s >= 0); tor_assert(conn->type == CONN_TYPE_AP_DNS_LISTENER); - conn->dns_server_port = evdns_add_server_port(conn->s, 0, - evdns_server_callback, NULL); + conn->dns_server_port = + tor_evdns_add_server_port(conn->s, 0, evdns_server_callback, NULL); } /** Free the evdns server port for conn, which must be an diff -Nru tor-0.2.0.34/src/or/dnsserv.h tor-0.2.2.16-alpha/src/or/dnsserv.h --- tor-0.2.0.34/src/or/dnsserv.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/dnsserv.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,26 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file dnsserv.h + * \brief Header file for dnsserv.c. + **/ + +#ifndef _TOR_DNSSERV_H +#define _TOR_DNSSERV_H + +void dnsserv_configure_listener(connection_t *conn); +void dnsserv_close_listener(connection_t *conn); +void dnsserv_resolved(edge_connection_t *conn, + int answer_type, + size_t answer_len, + const char *answer, + int ttl); +void dnsserv_reject_request(edge_connection_t *conn); +int dnsserv_launch_request(const char *name, int is_reverse); + +#endif + diff -Nru tor-0.2.0.34/src/or/eventdns.c tor-0.2.2.16-alpha/src/or/eventdns.c --- tor-0.2.0.34/src/or/eventdns.c 2009-02-09 03:12:30.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/eventdns.c 2010-09-12 02:54:22.000000000 +0000 @@ -1,5 +1,3 @@ -/* $Id: eventdns.c 18419 2009-02-09 03:12:02Z nickm $ */ - /* The original version of this module was written by Adam Langley; for * a history of modifications, check out the subversion logs. * @@ -33,6 +31,7 @@ */ #include "eventdns_tor.h" +#include "../common/util.h" #include /* #define NDEBUG */ @@ -91,6 +90,7 @@ #include #include "eventdns.h" + #ifdef WIN32 #include #include @@ -102,7 +102,7 @@ #endif #ifdef HAVE_NETINET_IN6_H -#include +#include #endif #ifdef WIN32 @@ -121,10 +121,11 @@ #endif /* for debugging possible memory leaks. */ -#define malloc(x) tor_malloc(x) -#define realloc(x,y) tor_realloc((x),(y)) -#define free(x) tor_free(x) -#define _free(x) _tor_free(x) +#define mm_malloc(x) tor_malloc(x) +#define mm_realloc(x,y) tor_realloc((x),(y)) +#define mm_free(x) tor_free(x) +#define mm_strdup(x) tor_strdup(x) +#define _mm_free(x) _tor_free(x) #undef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) @@ -147,15 +148,16 @@ /* which we bother recording */ #define TYPE_A EVDNS_TYPE_A +#define TYPE_CNAME 5 #define TYPE_PTR EVDNS_TYPE_PTR #define TYPE_AAAA EVDNS_TYPE_AAAA #define CLASS_INET EVDNS_CLASS_INET -#define CLEAR(x) do { memset((x), 0, sizeof(*(x))); } while(0) +#define CLEAR(x) do { memset((x), 0xF0, sizeof(*(x))); } while(0) -struct request { - u8 *request; /* the dns packet data */ +struct evdns_request { + u8 *request; /* the dns packet data */ unsigned int request_len; int reissue_count; int tx_count; /* the number of times that this packet has been sent */ @@ -167,11 +169,11 @@ /* elements used by the searching code */ int search_index; struct search_state *search_state; - char *search_origname; /* needs to be free()ed */ + char *search_origname; /* needs to be mm_free()ed */ int search_flags; /* these objects are kept in a circular list */ - struct request *next, *prev; + struct evdns_request *next, *prev; struct event timeout_event; @@ -206,7 +208,7 @@ struct nameserver { int socket; /* a connected UDP socket */ - u32 address; + struct sockaddr_storage address; int failed_times; /* number of times which we have given this server a chance */ int timedout; /* number of times in a row a request has timed out */ struct event event; @@ -220,7 +222,7 @@ char write_waiting; /* true if we are waiting for EV_WRITE events */ }; -static struct request *req_head = NULL, *req_waiting_head = NULL; +static struct evdns_request *req_head = NULL, *req_waiting_head = NULL; static struct nameserver *server_head = NULL; /* Represents a local port where we're listening for DNS requests. Right now, */ @@ -307,7 +309,7 @@ /* number of timeouts in a row before we consider this server to be down */ static int global_max_nameserver_timeout = 3; -/* DOCDOC */ +/* true iff we should use the 0x20 hack. */ static int global_randomize_case = 1; /* These are the timeout values for nameservers. If we find a nameserver is down */ @@ -316,18 +318,18 @@ static const int global_nameserver_timeouts_length = (int)(sizeof(global_nameserver_timeouts)/sizeof(struct timeval)); static struct nameserver *nameserver_pick(void); -static void evdns_request_insert(struct request *req, struct request **head); +static void evdns_request_insert(struct evdns_request *req, struct evdns_request **head); static void nameserver_ready_callback(int fd, short events, void *arg); static int evdns_transmit(void); -static int evdns_request_transmit(struct request *req); +static int evdns_request_transmit(struct evdns_request *req); static void nameserver_send_probe(struct nameserver *const ns); -static void search_request_finished(struct request *const); -static int search_try_next(struct request *const req); +static void search_request_finished(struct evdns_request *const); +static int search_try_next(struct evdns_request *const req); static int search_request_new(int type, const char *const name, int flags, evdns_callback_type user_callback, void *user_arg); static void evdns_requests_pump_waiting_queue(void); static u16 transaction_id_pick(void); -static struct request *request_new(int type, const char *name, int flags, evdns_callback_type callback, void *ptr); -static void request_submit(struct request *req); +static struct evdns_request *request_new(int type, const char *name, int flags, evdns_callback_type callback, void *ptr); +static void request_submit(struct evdns_request *req); static int server_request_free(struct server_request *req); static void server_request_free_answers(struct server_request *req); @@ -384,6 +386,22 @@ (int)(u8)((a )&0xff)); return buf; } +static const char * +debug_ntop(const struct sockaddr *sa) +{ + if (sa->sa_family == AF_INET) { + struct sockaddr_in *sin = (struct sockaddr_in *) sa; + return debug_ntoa(sin->sin_addr.s_addr); + } + if (sa->sa_family == AF_INET6) { + /* Tor-specific. In libevent, add more check code. */ + static char buf[128]; + struct sockaddr_in6 *sin = (struct sockaddr_in6 *) sa; + tor_inet_ntop(AF_INET6, &sin->sin6_addr, buf, sizeof(buf)); + return buf; + } + return ""; +} #endif static evdns_debug_log_fn_type evdns_log_fn = NULL; @@ -421,12 +439,50 @@ #define log _evdns_log +static int +sockaddr_eq(const struct sockaddr *sa1, const struct sockaddr *sa2, + int include_port) +{ + if (sa1->sa_family != sa2->sa_family) + return 0; + if (sa1->sa_family == AF_INET) { + const struct sockaddr_in *sin1, *sin2; + sin1 = (const struct sockaddr_in *)sa1; + sin2 = (const struct sockaddr_in *)sa2; + if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) + return 0; + else if (include_port && sin1->sin_port != sin2->sin_port) + return 0; + else + return 1; + } +#ifdef AF_INET6 + if (sa1->sa_family == AF_INET6) { + const struct sockaddr_in6 *sin1, *sin2; + sin1 = (const struct sockaddr_in6 *)sa1; + sin2 = (const struct sockaddr_in6 *)sa2; + if (memcmp(sin1->sin6_addr.s6_addr, sin2->sin6_addr.s6_addr, 16)) + return 0; + else if (include_port && sin1->sin6_port != sin2->sin6_port) + return 0; + else + return 1; + } +#endif + return 1; +} + +#define add_timeout_event(s, to) \ + (event_add(&(s)->timeout_event, (to))) +#define del_timeout_event(s) \ + (event_del(&(s)->timeout_event)) + /* This walks the list of inflight requests to find the */ /* one with a matching transaction id. Returns NULL on */ /* failure */ -static struct request * +static struct evdns_request * request_find_from_trans_id(u16 trans_id) { - struct request *req = req_head, *const started_at = req_head; + struct evdns_request *req = req_head, *const started_at = req_head; if (req) { do { @@ -455,8 +511,8 @@ static void nameserver_probe_failed(struct nameserver *const ns) { const struct timeval * timeout; - (void) evtimer_del(&ns->timeout_event); - CLEAR(&ns->timeout_event); + del_timeout_event(ns); + if (ns->state == 1) { /* This can happen if the nameserver acts in a way which makes us mark */ /* it as bad and then starts sending good replies. */ @@ -468,11 +524,10 @@ global_nameserver_timeouts_length - 1)]; ns->failed_times++; - evtimer_set(&ns->timeout_event, nameserver_prod_callback, ns); - if (evtimer_add(&ns->timeout_event, (struct timeval *) timeout) < 0) { + if (add_timeout_event(ns, (struct timeval *) timeout) < 0) { log(EVDNS_LOG_WARN, "Error from libevent when adding timer event for %s", - debug_ntoa(ns->address)); + debug_ntop((struct sockaddr *)&ns->address)); /* ???? Do more? */ } } @@ -481,13 +536,13 @@ /* many packets have timed out etc */ static void nameserver_failed(struct nameserver *const ns, const char *msg) { - struct request *req, *started_at; + struct evdns_request *req, *started_at; /* if this nameserver has already been marked as failed */ /* then don't do anything */ if (!ns->state) return; log(EVDNS_LOG_WARN, "Nameserver %s has failed: %s", - debug_ntoa(ns->address), msg); + debug_ntop((struct sockaddr *)&ns->address), msg); global_good_nameservers--; assert(global_good_nameservers >= 0); if (global_good_nameservers == 0) { @@ -497,11 +552,10 @@ ns->state = 0; ns->failed_times = 1; - evtimer_set(&ns->timeout_event, nameserver_prod_callback, ns); - if (evtimer_add(&ns->timeout_event, (struct timeval *) &global_nameserver_timeouts[0]) < 0) { + if (add_timeout_event(ns, (struct timeval *) &global_nameserver_timeouts[0]) < 0) { log(EVDNS_LOG_WARN, "Error from libevent when adding timer event for %s", - debug_ntoa(ns->address)); + debug_ntop((struct sockaddr *)&ns->address)); /* ???? Do more? */ } @@ -531,9 +585,8 @@ nameserver_up(struct nameserver *const ns) { if (ns->state) return; log(EVDNS_LOG_WARN, "Nameserver %s is back up", - debug_ntoa(ns->address)); - evtimer_del(&ns->timeout_event); - CLEAR(&ns->timeout_event); + debug_ntop((struct sockaddr *)&ns->address)); + del_timeout_event(ns); ns->state = 1; ns->failed_times = 0; ns->timedout = 0; @@ -541,7 +594,7 @@ } static void -request_trans_id_set(struct request *const req, const u16 trans_id) { +request_trans_id_set(struct evdns_request *const req, const u16 trans_id) { req->trans_id = trans_id; *((u16 *) req->request) = htons(trans_id); } @@ -550,7 +603,7 @@ /* head is a pointer to the head of the list it should be */ /* removed from or NULL if the request isn't in a list. */ static void -request_finished(struct request *const req, struct request **head) { +request_finished(struct evdns_request *const req, struct evdns_request **head) { if (head) { if (req->next == req) { /* only item in the list */ @@ -564,22 +617,21 @@ log(EVDNS_LOG_DEBUG, "Removing timeout for request %lx", (unsigned long) req); - evtimer_del(&req->timeout_event); - CLEAR(&req->timeout_event); + del_timeout_event(req); search_request_finished(req); global_requests_inflight--; if (!req->request_appended) { /* need to free the request data on it's own */ - free(req->request); + mm_free(req->request); } else { /* the request data is appended onto the header */ - /* so everything gets free()ed when we: */ + /* so everything gets mm_free()ed when we: */ } CLEAR(req); - _free(req); + _mm_free(req); evdns_requests_pump_waiting_queue(); } @@ -591,7 +643,7 @@ /* 0 ok */ /* 1 failed/reissue is pointless */ static int -request_reissue(struct request *req) { +request_reissue(struct evdns_request *req) { const struct nameserver *const last_ns = req->ns; /* the last nameserver should have been marked as failing */ /* by the caller of this function, therefore pick will try */ @@ -617,7 +669,7 @@ evdns_requests_pump_waiting_queue(void) { while (global_requests_inflight < global_max_requests_inflight && global_requests_waiting) { - struct request *req; + struct evdns_request *req; /* move a request from the waiting queue to the inflight queue */ assert(req_waiting_head); if (req_waiting_head->next == req_waiting_head) { @@ -644,7 +696,7 @@ } static void -reply_callback(struct request *const req, u32 ttl, u32 err, struct reply *reply) { +reply_callback(struct evdns_request *const req, u32 ttl, u32 err, struct reply *reply) { switch (req->request_type) { case TYPE_A: if (reply) @@ -680,7 +732,7 @@ /* this processes a parsed reply packet */ static void -reply_handle(struct request *const req, u16 flags, u32 ttl, struct reply *reply) { +reply_handle(struct evdns_request *const req, u16 flags, u32 ttl, struct reply *reply) { int error; static const int error_codes[] = {DNS_ERR_FORMAT, DNS_ERR_SERVERFAILED, DNS_ERR_NOTEXIST, DNS_ERR_NOTIMPL, DNS_ERR_REFUSED}; @@ -717,7 +769,7 @@ /*XXXX refactor the parts of */ log(EVDNS_LOG_DEBUG, "Got a SERVERFAILED from nameserver %s; " "will allow the request to time out.", - debug_ntoa(req->ns->address)); + debug_ntop((struct sockaddr *)&req->ns->address)); break; default: /* we got a good reply from the nameserver */ @@ -815,7 +867,7 @@ u16 flags = 0; u32 ttl, ttl_r = 0xffffffff; struct reply reply; - struct request *req = NULL; + struct evdns_request *req = NULL; unsigned int i; int name_matches = 0; @@ -843,28 +895,27 @@ /* if (!answers) return; */ /* must have an answer of some form */ /* This macro skips a name in the DNS reply. */ -#define GET_NAME \ - do { tmp_name[0] = '\0'; \ - if (name_parse(packet, length, &j, tmp_name, sizeof(tmp_name))<0) \ - goto err; \ - } while(0); -#define TEST_NAME \ - do { tmp_name[0] = '\0'; \ - cmp_name[0] = '\0'; \ - k = j; \ - if (name_parse(packet, length, &j, tmp_name, sizeof(tmp_name))<0) \ - goto err; \ - if (name_parse(req->request, req->request_len, &k, cmp_name, sizeof(cmp_name))<0) \ - goto err; \ - if (global_randomize_case) { \ - if (strcmp(tmp_name, cmp_name) == 0) \ - name_matches = 1; /* we ignore mismatching names */ \ - } else { \ - if (strcasecmp(tmp_name, cmp_name) == 0) \ - name_matches = 1; \ - } \ +#define GET_NAME \ + do { tmp_name[0] = '\0'; \ + if (name_parse(packet, length, &j, tmp_name, sizeof(tmp_name))<0)\ + goto err; \ + } while(0) +#define TEST_NAME \ + do { tmp_name[0] = '\0'; \ + cmp_name[0] = '\0'; \ + k = j; \ + if (name_parse(packet, length, &j, tmp_name, sizeof(tmp_name))<0)\ + goto err; \ + if (name_parse(req->request, req->request_len, &k, cmp_name, sizeof(cmp_name))<0) \ + goto err; \ + if (global_randomize_case) { \ + if (strcmp(tmp_name, cmp_name) == 0) \ + name_matches = 1; /* we ignore mismatching names */ \ + } else { \ + if (strcasecmp(tmp_name, cmp_name) == 0) \ + name_matches = 1; \ + } \ } while(0) - reply.type = req->request_type; @@ -873,7 +924,7 @@ /* the question looks like * */ - TEST_NAME; + TEST_NAME; j += 4; if (j >= length) goto err; } @@ -888,8 +939,6 @@ for (i = 0; i < answers; ++i) { u16 type, class; - /* XXX I'd be more comfortable if we actually checked the name */ - /* here. -NM */ GET_NAME; GET16(type); GET16(class); @@ -911,17 +960,17 @@ if (j + 4*addrtocopy > length) goto err; memcpy(&reply.data.a.addresses[reply.data.a.addrcount], packet + j, 4*addrtocopy); - j += 4*addrtocopy; reply.data.a.addrcount += addrtocopy; reply.have_answer = 1; if (reply.data.a.addrcount == MAX_ADDRS) break; + j += 4*addrtocopy; } else if (type == TYPE_PTR && class == CLASS_INET) { if (req->request_type != TYPE_PTR) { j += datalength; continue; } - if (name_parse(packet, length, &j, reply.data.ptr.name, - sizeof(reply.data.ptr.name))<0) - goto err; + GET_NAME; + strlcpy(reply.data.ptr.name, tmp_name, + sizeof(reply.data.ptr.name)); ttl_r = MIN(ttl_r, ttl); reply.have_answer = 1; break; @@ -941,9 +990,9 @@ memcpy(&reply.data.aaaa.addresses[reply.data.aaaa.addrcount], packet + j, 16*addrtocopy); reply.data.aaaa.addrcount += addrtocopy; - j += 16*addrtocopy; reply.have_answer = 1; if (reply.data.aaaa.addrcount == MAX_ADDRS) break; + j += 16*addrtocopy; } else { /* skip over any other type of resource */ j += datalength; @@ -986,7 +1035,7 @@ if (length > INT_MAX) return -1; - server_req = malloc(sizeof(struct server_request)); + server_req = mm_malloc(sizeof(struct server_request)); if (server_req == NULL) return -1; memset(server_req, 0, sizeof(struct server_request)); @@ -996,7 +1045,7 @@ server_req->base.flags = flags; server_req->base.nquestions = 0; - server_req->base.questions = malloc(sizeof(struct evdns_server_question *) * questions); + server_req->base.questions = mm_malloc(sizeof(struct evdns_server_question *) * questions); if (server_req->base.questions == NULL) goto err; @@ -1009,11 +1058,11 @@ GET16(type); GET16(class); namelen = strlen(tmp_name); - q = malloc(sizeof(struct evdns_server_question) + namelen); + q = mm_malloc(sizeof(struct evdns_server_question) + namelen); if (!q) goto err; q->type = type; - q->class = class; + q->dns_question_class = class; memcpy(q->name, tmp_name, namelen+1); server_req->base.questions[server_req->base.nquestions++] = q; } @@ -1036,11 +1085,11 @@ if (server_req) { if (server_req->base.questions) { for (i = 0; i < server_req->base.nquestions; ++i) - free(server_req->base.questions[i]); - free(server_req->base.questions); + mm_free(server_req->base.questions[i]); + mm_free(server_req->base.questions); } CLEAR(server_req); - free(server_req); + mm_free(server_req); } return -1; @@ -1088,6 +1137,29 @@ static uint16_t (*trans_id_function)(void) = default_transaction_id_fn; +static void +default_random_bytes_fn(char *buf, size_t n) +{ + unsigned i; + for (i = 0; i < n; i += 2) { + u16 tid = trans_id_function(); + buf[i] = (tid >> 8) & 0xff; + if (i+1> 8) & 0xff; - if (i+1socket, packet,(socklen_t)sizeof(packet), 0, + (int)recvfrom(ns->socket, packet, (socklen_t)sizeof(packet), 0, sa, &addrlen); if (r < 0) { int err = last_error(ns->socket); if (error_is_eagain(err)) return; - nameserver_failed(ns, strerror(err)); - return; - } - if (sa->sa_family != AF_INET) { - log(EVDNS_LOG_WARN, - "Address family mismatch on received DNS packet."); + nameserver_failed(ns, tor_socket_strerror(err)); return; } - sin = (struct sockaddr_in *)sa; - if (sin->sin_addr.s_addr != ns->address) { + /* XXX Match port too? */ + if (!sockaddr_eq(sa, (struct sockaddr*)&ns->address, 0)) { log(EVDNS_LOG_WARN, - "Address mismatch on received DNS packet. Address was %s.", - debug_ntoa(sin->sin_addr.s_addr)); + "Address mismatch on received DNS packet. Address was %s", + debug_ntop(sa)); return; } ns->timedout = 0; @@ -1221,7 +1282,7 @@ int err = last_error(s->socket); if (error_is_eagain(err)) return; log(EVDNS_LOG_WARN, "Error %s (%d) while reading request.", - strerror(err), err); + tor_socket_strerror(err), err); return; } request_parse(packet, r, s, (struct sockaddr*) &addr, addrlen); @@ -1232,19 +1293,22 @@ static void server_port_flush(struct evdns_server_port *port) { - while (port->pending_replies) { - struct server_request *req = port->pending_replies; + struct server_request *req = port->pending_replies; + while (req) { ssize_t r = sendto(port->socket, req->response, req->response_len, 0, (struct sockaddr*) &req->addr, (socklen_t)req->addrlen); if (r < 0) { int err = last_error(port->socket); if (error_is_eagain(err)) return; - log(EVDNS_LOG_WARN, "Error %s (%d) while writing response to port; dropping", strerror(err), err); + log(EVDNS_LOG_WARN, "Error %s (%d) while writing response to port; dropping", tor_socket_strerror(err), err); } if (server_request_free(req)) { /* we released the last reference to req->port. */ return; + } else { + assert(port->pending_replies != req); + req = port->pending_replies; } } @@ -1273,7 +1337,7 @@ nameserver_ready_callback, ns); if (event_add(&ns->event, NULL) < 0) { log(EVDNS_LOG_WARN, "Error from libevent when adding event for %s", - debug_ntoa(ns->address)); + debug_ntop((struct sockaddr *)&ns->address)); /* ???? Do more? */ } } @@ -1336,7 +1400,7 @@ { int i; for (i = 0; i < table->n_labels; ++i) - free(table->labels[i].v); + mm_free(table->labels[i].v); table->n_labels = 0; } @@ -1365,7 +1429,7 @@ int p; if (table->n_labels == MAX_LABELS) return (-1); - v = strdup(label); + v = mm_strdup(label); if (v == NULL) return (-1); p = table->n_labels++; @@ -1498,7 +1562,7 @@ evdns_add_server_port(int socket, int is_tcp, evdns_request_callback_fn_type cb, void *user_data) { struct evdns_server_port *port; - if (!(port = malloc(sizeof(struct evdns_server_port)))) + if (!(port = mm_malloc(sizeof(struct evdns_server_port)))) return NULL; memset(port, 0, sizeof(struct evdns_server_port)); @@ -1514,7 +1578,7 @@ event_set(&port->event, port->socket, EV_READ | EV_PERSIST, server_port_ready_callback, port); if (event_add(&port->event, NULL)<0) { - free(port); + mm_free(port); return NULL; } return port; @@ -1524,9 +1588,9 @@ void evdns_close_server_port(struct evdns_server_port *port) { + port->closing = 1; if (--port->refcnt == 0) server_port_free(port); - port->closing = 1; } /* exported function */ @@ -1559,14 +1623,14 @@ while (*itemp) { itemp = &((*itemp)->next); } - item = malloc(sizeof(struct server_reply_item)); + item = mm_malloc(sizeof(struct server_reply_item)); if (!item) return -1; CLEAR(item); item->next = NULL; - if (!(item->name = strdup(name))) { + if (!(item->name = mm_strdup(name))) { CLEAR(item); - free(item); + mm_free(item); return -1; } item->type = type; @@ -1577,18 +1641,18 @@ item->data = NULL; if (data) { if (item->is_name) { - if (!(item->data = strdup(data))) { - free(item->name); + if (!(item->data = mm_strdup(data))) { + mm_free(item->name); CLEAR(item); - free(item); + mm_free(item); return -1; } item->datalen = (u16)-1; } else { - if (!(item->data = malloc(datalen))) { - free(item->name); + if (!(item->data = mm_malloc(datalen))) { + mm_free(item->name); CLEAR(item); - free(item); + mm_free(item); return -1; } item->datalen = datalen; @@ -1646,7 +1710,7 @@ evdns_server_request_add_cname_reply(struct evdns_server_request *req, const char *name, const char *cname, int ttl) { return evdns_server_request_add_reply( - req, EVDNS_ANSWER_SECTION, name, TYPE_A, CLASS_INET, + req, EVDNS_ANSWER_SECTION, name, TYPE_CNAME, CLASS_INET, ttl, -1, 1, cname); } @@ -1687,7 +1751,7 @@ return (int) j; } APPEND16(req->base.questions[i]->type); - APPEND16(req->base.questions[i]->class); + APPEND16(req->base.questions[i]->dns_question_class); } /* Add answer, authority, and additional sections. */ @@ -1732,12 +1796,12 @@ if (j > 512) { overflow: j = 512; - buf[3] |= 0x02; /* set the truncated bit. */ + buf[2] |= 0x02; /* set the truncated bit. */ } req->response_len = (size_t)j; - if (!(req->response = malloc(req->response_len))) { + if (!(req->response = mm_malloc(req->response_len))) { server_request_free_answers(req); dnslabel_clear(&table); return (-1); @@ -1815,10 +1879,10 @@ victim = *list; while (victim) { next = victim->next; - free(victim->name); + mm_free(victim->name); if (victim->data) - free(victim->data); - free(victim); + mm_free(victim->data); + mm_free(victim); victim = next; } *list = NULL; @@ -1833,8 +1897,8 @@ int i, rc=1; if (req->base.questions) { for (i = 0; i < req->base.nquestions; ++i) - free(req->base.questions[i]); - free(req->base.questions); + mm_free(req->base.questions[i]); + mm_free(req->base.questions); } if (req->port) { @@ -1848,7 +1912,7 @@ } if (req->response) { - free(req->response); + mm_free(req->response); } server_request_free_answers(req); @@ -1861,15 +1925,16 @@ if (rc == 0) { server_port_free(req->port); CLEAR(req); - free(req); + mm_free(req); return (1); } CLEAR(req); - free(req); + mm_free(req); return (0); } -/* Free all storage held by an evdns_server_port. Only called when */ +/* Free all storage held by an evdns_server_port. Only called when the + * reference count is down to 0. */ static void server_port_free(struct evdns_server_port *port) { @@ -1882,8 +1947,8 @@ } (void) event_del(&port->event); CLEAR(&port->event); - /* XXXX021 actually free the port? -NM */ - /* XXXX yes, and fix up evdns_close_server_port to dtrt. -NM */ + CLEAR(port); + mm_free(port); } /* exported function */ @@ -1913,7 +1978,7 @@ /* has timed out. */ static void evdns_request_timeout_callback(int fd, short events, void *arg) { - struct request *const req = (struct request *) arg; + struct evdns_request *const req = (struct evdns_request *) arg; (void) fd; (void) events; @@ -1925,14 +1990,16 @@ nameserver_failed(req->ns, "request timed out."); } - (void) evtimer_del(&req->timeout_event); - CLEAR(&req->timeout_event); if (req->tx_count >= global_max_retransmits) { /* this request has failed */ reply_callback(req, 0, DNS_ERR_TIMEOUT, NULL); request_finished(req, &req_head); } else { /* retransmit it */ + /* Stop waiting for the timeout. No need to do this in + * request_finished; that one already deletes the timeout event. + * XXXX021 port this change to libevent. */ + del_timeout_event(req); evdns_request_transmit(req); } } @@ -1944,12 +2011,12 @@ /* 1 temporary failure */ /* 2 other failure */ static int -evdns_request_transmit_to(struct request *req, struct nameserver *server) { +evdns_request_transmit_to(struct evdns_request *req, struct nameserver *server) { const ssize_t r = send(server->socket, req->request, req->request_len, 0); if (r < 0) { int err = last_error(server->socket); if (error_is_eagain(err)) return 1; - nameserver_failed(req->ns, strerror(err)); + nameserver_failed(req->ns, tor_socket_strerror(err)); return 2; } else if (r != (ssize_t)req->request_len) { return 1; /* short write */ @@ -1965,7 +2032,7 @@ /* 0 ok */ /* 1 failed */ static int -evdns_request_transmit(struct request *req) { +evdns_request_transmit(struct evdns_request *req) { int retcode = 0, r; /* if we fail to send this packet then this flag marks it */ @@ -1987,51 +2054,71 @@ nameserver_write_waiting(req->ns, 1); return 1; case 2: - /* failed in some other way */ + /* failed to transmit the request entirely. */ retcode = 1; - break; + /* fall through: we'll set a timeout, which will time out, + * and make us retransmit the request anyway. */ default: /* transmitted; we need to check for timeout. */ log(EVDNS_LOG_DEBUG, "Setting timeout for request %lx", (unsigned long) req); - evtimer_set(&req->timeout_event, evdns_request_timeout_callback, req); - if (evtimer_add(&req->timeout_event, &global_timeout) < 0) { + + if (add_timeout_event(req, &global_timeout) < 0) { log(EVDNS_LOG_WARN, "Error from libevent when adding timer for request %lx", (unsigned long) req); /* ???? Do more? */ } + req->tx_count++; + req->transmit_me = 0; + return retcode; } - - req->tx_count++; - req->transmit_me = 0; - return retcode; } static void nameserver_probe_callback(int result, char type, int count, int ttl, void *addresses, void *arg) { - struct nameserver *const ns = (struct nameserver *) arg; + struct sockaddr *addr = arg; + struct nameserver *server; (void) type; (void) count; (void) ttl; (void) addresses; - if (result == DNS_ERR_NONE || result == DNS_ERR_NOTEXIST) { - /* this is a good reply */ - nameserver_up(ns); - } else nameserver_probe_failed(ns); + for (server = server_head; server; server = server->next) { + if (sockaddr_eq(addr, (struct sockaddr*) &server->address, 1)) { + if (result == DNS_ERR_NONE || result == DNS_ERR_NOTEXIST) { + /* this is a good reply */ + nameserver_up(server); + } else { + nameserver_probe_failed(server); + } + } + if (server->next == server_head) + break; + } + + mm_free(addr); } static void nameserver_send_probe(struct nameserver *const ns) { - struct request *req; + struct evdns_request *req; + struct sockaddr_storage *addr; /* here we need to send a probe to a given nameserver */ /* in the hope that it is up now. */ - log(EVDNS_LOG_DEBUG, "Sending probe to %s", debug_ntoa(ns->address)); - - req = request_new(TYPE_A, "www.google.com", DNS_QUERY_NO_SEARCH, nameserver_probe_callback, ns); - if (!req) return; + /* We identify the nameserver by its address, in case it is removed before + * our probe comes back. */ + addr = mm_malloc(sizeof(struct sockaddr_storage)); + memcpy(addr, &ns->address, sizeof(struct sockaddr_storage)); + + log(EVDNS_LOG_DEBUG, "Sending probe to %s", debug_ntop((struct sockaddr *)&ns->address)); + + req = request_new(TYPE_A, "www.google.com", DNS_QUERY_NO_SEARCH, nameserver_probe_callback, addr); + if (!req) { + mm_free(addr); + return; + } /* we force this into the inflight queue no matter what */ request_trans_id_set(req, transaction_id_pick()); req->ns = ns; @@ -2046,7 +2133,7 @@ char did_try_to_transmit = 0; if (req_head) { - struct request *const started_at = req_head, *req = req_head; + struct evdns_request *const started_at = req_head, *req = req_head; /* first transmit all the requests which are currently waiting */ do { if (req->transmit_me) { @@ -2081,7 +2168,7 @@ evdns_clear_nameservers_and_suspend(void) { struct nameserver *server = server_head, *started_at = server_head; - struct request *req = req_head, *req_started_at = req_head; + struct evdns_request *req = req_head, *req_started_at = req_head; if (!server) return 0; @@ -2089,12 +2176,11 @@ struct nameserver *next = server->next; (void) event_del(&server->event); CLEAR(&server->event); - (void) evtimer_del(&server->timeout_event); - CLEAR(&server->timeout_event); + del_timeout_event(server); if (server->socket >= 0) CLOSE_SOCKET(server->socket); CLEAR(server); - free(server); + mm_free(server); if (next == started_at) break; server = next; @@ -2103,12 +2189,11 @@ global_good_nameservers = 0; while (req) { - struct request *next = req->next; + struct evdns_request *next = req->next; req->tx_count = req->reissue_count = 0; req->ns = NULL; /* ???? What to do about searches? */ - (void) evtimer_del(&req->timeout_event); - CLEAR(&req->timeout_event); + del_timeout_event(req); req->trans_id = 0; req->transmit_me = 0; @@ -2130,6 +2215,23 @@ return 0; } +static struct sockaddr_storage global_bind_address; +static socklen_t global_bind_addrlen = 0; +static int global_bind_addr_is_set = 0; +void +evdns_set_default_outgoing_bind_address(const struct sockaddr *addr, + socklen_t addrlen) +{ + memset(&global_bind_address, 0, sizeof(global_bind_address)); + if (addr) { + assert(addrlen <= (socklen_t)sizeof(global_bind_address)); + memcpy(&global_bind_address, addr, addrlen); + global_bind_addrlen = addrlen; + global_bind_addr_is_set = 1; + } else { + global_bind_addr_is_set = 0; + } +} /* exported function */ int @@ -2140,25 +2242,50 @@ } static int -_evdns_nameserver_add_impl(u32 address, int port) { +sockaddr_is_loopback(const struct sockaddr *addr) +{ + static const char LOOPBACK_S6[16] = + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1"; + if (addr->sa_family == AF_INET) { + struct sockaddr_in *sin = (struct sockaddr_in *)addr; + return (ntohl(sin->sin_addr.s_addr) & 0xff000000) == 0x7f000000; + } else if (addr->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr; + return !memcmp(sin6->sin6_addr.s6_addr, LOOPBACK_S6, 16); + } + return 0; +} + +static int +_evdns_nameserver_add_impl(const struct sockaddr *address, + socklen_t addrlen) { /* first check to see if we already have this nameserver */ const struct nameserver *server = server_head, *const started_at = server_head; struct nameserver *ns; - struct sockaddr_in sin; + int err = 0; if (server) { do { - if (server->address == address) return 3; + if (sockaddr_eq(address, (struct sockaddr *)&server->address, 1)) { + log(EVDNS_LOG_DEBUG, "Duplicate nameserver."); + return 3; + } server = server->next; } while (server != started_at); } + if (addrlen > (int)sizeof(ns->address)) { + log(EVDNS_LOG_DEBUG, "Addrlen %d too long.", (int)addrlen); + return 2; + } - ns = (struct nameserver *) malloc(sizeof(struct nameserver)); + ns = (struct nameserver *) mm_malloc(sizeof(struct nameserver)); if (!ns) return -1; memset(ns, 0, sizeof(struct nameserver)); + evtimer_set(&ns->timeout_event, nameserver_prod_callback, ns); + ns->socket = socket(PF_INET, SOCK_DGRAM, 0); if (ns->socket < 0) { err = 1; goto out1; } #ifdef WIN32 @@ -2169,25 +2296,33 @@ #else fcntl(ns->socket, F_SETFL, O_NONBLOCK); #endif - memset(&sin, 0, sizeof(sin)); - sin.sin_addr.s_addr = address; - sin.sin_port = htons(port); - sin.sin_family = AF_INET; - if (connect(ns->socket, (struct sockaddr *) &sin, - (socklen_t)sizeof(sin)) != 0) { + + if (global_bind_addr_is_set && + !sockaddr_is_loopback((struct sockaddr*)&global_bind_address)) { + if (bind(ns->socket, (struct sockaddr *)&global_bind_address, + global_bind_addrlen) < 0) { + log(EVDNS_LOG_DEBUG, "Couldn't bind to outgoing address."); + err = 2; + goto out2; + } + } + + if (connect(ns->socket, address, addrlen) != 0) { + log(EVDNS_LOG_DEBUG, "Couldn't open socket to nameserver."); err = 2; goto out2; } - ns->address = address; + memcpy(&ns->address, address, addrlen); ns->state = 1; event_set(&ns->event, ns->socket, EV_READ | EV_PERSIST, nameserver_ready_callback, ns); if (event_add(&ns->event, NULL) < 0) { + log(EVDNS_LOG_DEBUG, "Couldn't add event for nameserver."); err = 2; goto out2; } - log(EVDNS_LOG_DEBUG, "Added nameserver %s", debug_ntoa(address)); + log(EVDNS_LOG_DEBUG, "Added nameserver %s", debug_ntop(address)); /* insert this nameserver into the list of them */ if (!server_head) { @@ -2210,50 +2345,135 @@ CLOSE_SOCKET(ns->socket); out1: CLEAR(ns); - free(ns); - log(EVDNS_LOG_WARN, "Unable to add nameserver %s: error %d", debug_ntoa(address), err); + mm_free(ns); + log(EVDNS_LOG_WARN, "Unable to add nameserver %s: error %d", debug_ntop(address), err); return err; } /* exported function */ int -evdns_nameserver_add(unsigned long int address) { - return _evdns_nameserver_add_impl((u32)address, 53); +evdns_nameserver_add(uint32_t address) { + struct sockaddr_in sin; + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; +#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN + sin.sin_len = sizeof(sin); +#endif + sin.sin_addr.s_addr = htonl(address); + sin.sin_port = 53; + return _evdns_nameserver_add_impl((struct sockaddr*) &sin, sizeof(sin)); } /* exported function */ int evdns_nameserver_ip_add(const char *ip_as_string) { - struct in_addr ina; int port; - char buf[20]; - const char *cp; + char buf[128]; + const char *cp, *addr_part, *port_part; + int is_ipv6; + /* recognized formats are: + * [ipv6]:port + * ipv6 + * [ipv6] + * ipv4:port + * ipv4 + */ + + log(EVDNS_LOG_DEBUG, "Trying to add nameserver <%s>", ip_as_string); + cp = strchr(ip_as_string, ':'); - if (! cp) { - cp = ip_as_string; - port = 53; - } else { - port = strtoint(cp+1); - if (port < 0 || port > 65535) { + if (*ip_as_string == '[') { + size_t len; + if (!(cp = strchr(ip_as_string, ']'))) { + log(EVDNS_LOG_DEBUG, "Nameserver missing closing ]"); return 4; } - if ((cp-ip_as_string) >= (int)sizeof(buf)) { + len = cp-(ip_as_string + 1); + if (len > sizeof(buf)-1) { + log(EVDNS_LOG_DEBUG, "[Nameserver] does not fit in buffer."); + return 4; + } + memcpy(buf, ip_as_string+1, len); + buf[len] = '\0'; + addr_part = buf; + if (cp[1] == ':') + port_part = cp+2; + else + port_part = NULL; + is_ipv6 = 1; + } else if (cp && strchr(cp+1, ':')) { + is_ipv6 = 1; + addr_part = ip_as_string; + port_part = NULL; + } else if (cp) { + is_ipv6 = 0; + if (cp - ip_as_string > (int)sizeof(buf)-1) { + log(EVDNS_LOG_DEBUG, "Nameserver does not fit in buffer."); return 4; } - assert(cp >= ip_as_string); memcpy(buf, ip_as_string, cp-ip_as_string); buf[cp-ip_as_string] = '\0'; - cp = buf; + addr_part = buf; + port_part = cp+1; + } else { + addr_part = ip_as_string; + port_part = NULL; + is_ipv6 = 0; + } + + if (port_part == NULL) { + port = 53; + } else { + port = strtoint(port_part); + if (port <= 0 || port > 65535) { + log(EVDNS_LOG_DEBUG, "Nameserver port <%s> out of range", + port_part); + return 4; + } } - if (!inet_aton(cp, &ina)) { - return 4; + + /* Tor-only. needs a more general fix. */ + assert(addr_part); + if (is_ipv6) { + struct sockaddr_in6 sin6; + memset(&sin6, 0, sizeof(sin6)); +#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN + sin6.sin6_len = sizeof(sin6); +#endif + sin6.sin6_family = AF_INET6; + sin6.sin6_port = htons(port); + if (1 != tor_inet_pton(AF_INET6, addr_part, &sin6.sin6_addr)) { + log(EVDNS_LOG_DEBUG, "inet_pton(%s) failed", addr_part); + return 4; + } + return _evdns_nameserver_add_impl((struct sockaddr*)&sin6, + sizeof(sin6)); + } else { + struct sockaddr_in sin; + memset(&sin, 0, sizeof(sin)); +#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN + sin.sin_len = sizeof(sin); +#endif + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + if (!inet_aton(addr_part, &sin.sin_addr)) { + log(EVDNS_LOG_DEBUG, "inet_pton(%s) failed", addr_part); + return 4; + } + return _evdns_nameserver_add_impl((struct sockaddr*)&sin, + sizeof(sin)); } - return _evdns_nameserver_add_impl(ina.s_addr, port); +} + +int +evdns_nameserver_sockaddr_add(const struct sockaddr *sa, socklen_t len) +{ + return _evdns_nameserver_add_impl(sa, len); } /* insert into the tail of the queue */ static void -evdns_request_insert(struct request *req, struct request **head) { +evdns_request_insert(struct evdns_request *req, struct evdns_request **head) { if (!*head) { *head = req; req->next = req->prev = req; @@ -2276,7 +2496,7 @@ return count; } -static struct request * +static struct evdns_request * request_new(int type, const char *name, int flags, evdns_callback_type callback, void *user_ptr) { const char issuing_now = @@ -2286,8 +2506,8 @@ const size_t request_max_len = evdns_request_len(name_len); const u16 trans_id = issuing_now ? transaction_id_pick() : 0xffff; /* the request data is alloced in a single block with the header */ - struct request *const req = - (struct request *) malloc(sizeof(struct request) + request_max_len); + struct evdns_request *const req = + (struct evdns_request *) mm_malloc(sizeof(struct evdns_request) + request_max_len); char namebuf[256]; int rlen; (void) flags; @@ -2295,17 +2515,19 @@ if (!req) return NULL; if (name_len >= sizeof(namebuf)) { - _free(req); + _mm_free(req); return NULL; } - memset(req, 0, sizeof(struct request)); + memset(req, 0, sizeof(struct evdns_request)); + + evtimer_set(&req->timeout_event, evdns_request_timeout_callback, req); if (global_randomize_case) { unsigned i; char randbits[32]; strlcpy(namebuf, name, sizeof(namebuf)); - get_random_bytes(randbits, (name_len+7)/8); + rand_bytes_function(randbits, (name_len+7)/8); for (i = 0; i < name_len; ++i) { if (ISALPHA(namebuf[i])) { if ((randbits[i >> 3] & (1<<(i%7)))) @@ -2318,8 +2540,8 @@ } /* request data lives just after the header */ - req->request = ((u8 *) req) + sizeof(struct request); - /* denotes that the request data shouldn't be free()ed */ + req->request = ((u8 *) req) + sizeof(struct evdns_request); + /* denotes that the request data shouldn't be mm_free()ed */ req->request_appended = 1; rlen = evdns_request_data_build(name, name_len, trans_id, type, CLASS_INET, req->request, request_max_len); @@ -2337,12 +2559,12 @@ return req; err1: CLEAR(req); - _free(req); + _mm_free(req); return NULL; } static void -request_submit(struct request *const req) { +request_submit(struct evdns_request *const req) { if (req->ns) { /* if it has a nameserver assigned then this is going */ /* straight into the inflight queue */ @@ -2360,7 +2582,7 @@ evdns_callback_type callback, void *ptr) { log(EVDNS_LOG_DEBUG, "Resolve requested for %s", name); if (flags & DNS_QUERY_NO_SEARCH) { - struct request *const req = + struct evdns_request *const req = request_new(TYPE_A, name, flags, callback, ptr); if (req == NULL) return (1); @@ -2376,7 +2598,7 @@ evdns_callback_type callback, void *ptr) { log(EVDNS_LOG_DEBUG, "Resolve requested for %s", name); if (flags & DNS_QUERY_NO_SEARCH) { - struct request *const req = + struct evdns_request *const req = request_new(TYPE_AAAA, name, flags, callback, ptr); if (req == NULL) return (1); @@ -2387,9 +2609,9 @@ } } -int evdns_resolve_reverse(struct in_addr *in, int flags, evdns_callback_type callback, void *ptr) { +int evdns_resolve_reverse(const struct in_addr *in, int flags, evdns_callback_type callback, void *ptr) { char buf[32]; - struct request *req; + struct evdns_request *req; u32 a; assert(in); a = ntohl(in->s_addr); @@ -2405,11 +2627,11 @@ return 0; } -int evdns_resolve_reverse_ipv6(struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr) { +int evdns_resolve_reverse_ipv6(const struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr) { /* 32 nybbles, 32 periods, "ip6.arpa", NUL. */ char buf[73]; char *cp; - struct request *req; + struct evdns_request *req; int i; assert(in); cp = buf; @@ -2466,16 +2688,16 @@ for (dom = state->head; dom; dom = next) { next = dom->next; CLEAR(dom); - _free(dom); + _mm_free(dom); } CLEAR(state); - _free(state); + _mm_free(state); } } static struct search_state * search_state_new(void) { - struct search_state *state = (struct search_state *) malloc(sizeof(struct search_state)); + struct search_state *state = (struct search_state *) mm_malloc(sizeof(struct search_state)); if (!state) return NULL; memset(state, 0, sizeof(struct search_state)); state->refcount = 1; @@ -2508,7 +2730,7 @@ if (!global_search_state) return; global_search_state->num_domains++; - sdomain = (struct search_domain *) malloc(sizeof(struct search_domain) + domain_len); + sdomain = (struct search_domain *) mm_malloc(sizeof(struct search_domain) + domain_len); if (!sdomain) return; memcpy( ((u8 *) sdomain) + sizeof(struct search_domain), domain, domain_len); sdomain->next = global_search_state->head; @@ -2571,7 +2793,7 @@ /* the actual postfix string is kept at the end of the structure */ const u8 *const postfix = ((u8 *) dom) + sizeof(struct search_domain); const size_t postfix_len = dom->len; - char *const newname = (char *) malloc(base_len + need_to_append_dot + postfix_len + 1); + char *const newname = (char *) mm_malloc(base_len + need_to_append_dot + postfix_len + 1); if (!newname) return NULL; memcpy(newname, base_name, base_len); if (need_to_append_dot) newname[base_len] = '.'; @@ -2593,7 +2815,7 @@ global_search_state && global_search_state->num_domains) { /* we have some domains to search */ - struct request *req; + struct evdns_request *req; if (string_num_dots(name) >= global_search_state->ndots) { req = request_new(type, name, flags, user_callback, user_arg); if (!req) return 1; @@ -2602,18 +2824,18 @@ char *const new_name = search_make_new(global_search_state, 0, name); if (!new_name) return 1; req = request_new(type, new_name, flags, user_callback, user_arg); - _free(new_name); + _mm_free(new_name); if (!req) return 1; req->search_index = 0; } - req->search_origname = strdup(name); + req->search_origname = mm_strdup(name); req->search_state = global_search_state; req->search_flags = flags; global_search_state->refcount++; request_submit(req); return 0; } else { - struct request *const req = request_new(type, name, flags, user_callback, user_arg); + struct evdns_request *const req = request_new(type, name, flags, user_callback, user_arg); if (!req) return 1; request_submit(req); return 0; @@ -2626,18 +2848,18 @@ /* 0 another request has been submitted */ /* 1 no more requests needed */ static int -search_try_next(struct request *const req) { +search_try_next(struct evdns_request *const req) { if (req->search_state) { /* it is part of a search */ char *new_name; - struct request *newreq; + struct evdns_request *newreq; req->search_index++; if (req->search_index >= req->search_state->num_domains) { /* no more postfixes to try, however we may need to try */ /* this name without a postfix */ if (string_num_dots(req->search_origname) < req->search_state->ndots) { /* yep, we need to try it raw */ - struct request *const newreq = request_new(req->request_type, req->search_origname, req->search_flags, req->user_callback, req->user_pointer); + struct evdns_request *const newreq = request_new(req->request_type, req->search_origname, req->search_flags, req->user_callback, req->user_pointer); log(EVDNS_LOG_DEBUG, "Search: trying raw query %s", req->search_origname); if (newreq) { request_submit(newreq); @@ -2651,7 +2873,7 @@ if (!new_name) return 1; log(EVDNS_LOG_DEBUG, "Search: now trying %s (%d)", new_name, req->search_index); newreq = request_new(req->request_type, new_name, req->search_flags, req->user_callback, req->user_pointer); - free(new_name); + mm_free(new_name); if (!newreq) return 1; newreq->search_origname = req->search_origname; req->search_origname = NULL; @@ -2666,13 +2888,13 @@ } static void -search_request_finished(struct request *const req) { +search_request_finished(struct evdns_request *const req) { if (req->search_state) { search_state_decref(req->search_state); req->search_state = NULL; } if (req->search_origname) { - free(req->search_origname); + mm_free(req->search_origname); req->search_origname = NULL; } } @@ -2687,14 +2909,6 @@ if (flags & DNS_OPTION_NAMESERVERS) evdns_nameserver_ip_add("127.0.0.1"); } -#ifndef HAVE_STRTOK_R -static char * -strtok_r(char *s, const char *delim, char **state) { - (void)state; - return strtok(s, delim); -} -#endif - /* helper version of atoi which returns -1 on error */ static int strtoint(const char *const str) { @@ -2764,7 +2978,6 @@ log(EVDNS_LOG_DEBUG, "Setting randomize_case to %d", randcase); global_randomize_case = randcase; } - return 0; } @@ -2772,19 +2985,14 @@ resolv_conf_parse_line(char *const start, int flags) { char *strtok_state; static const char *const delims = " \t"; -#define NEXT_TOKEN strtok_r(NULL, delims, &strtok_state) +#define NEXT_TOKEN tor_strtok_r(NULL, delims, &strtok_state) - char *const first_token = strtok_r(start, delims, &strtok_state); + char *const first_token = tor_strtok_r(start, delims, &strtok_state); if (!first_token) return; if (!strcmp(first_token, "nameserver") && (flags & DNS_OPTION_NAMESERVERS)) { const char *const nameserver = NEXT_TOKEN; - struct in_addr ina; - - if (inet_aton(nameserver, &ina)) { - /* address is valid */ - evdns_nameserver_add(ina.s_addr); - } + evdns_nameserver_ip_add(nameserver); } else if (!strcmp(first_token, "domain") && (flags & DNS_OPTION_SEARCH)) { const char *const domain = NEXT_TOKEN; if (domain) { @@ -2841,7 +3049,7 @@ } if (st.st_size > 65535) { err = 3; goto out1; } /* no resolv.conf should be any bigger */ - resolv = (u8 *) malloc((size_t)st.st_size + 1); + resolv = (u8 *) mm_malloc((size_t)st.st_size + 1); if (!resolv) { err = 4; goto out1; } n = 0; @@ -2877,7 +3085,7 @@ } out2: - free(resolv); + mm_free(resolv); out1: close(fd); return err; @@ -2894,14 +3102,14 @@ while (ISSPACE(*ips) || *ips == ',' || *ips == '\t') ++ips; addr = ips; - while (ISDIGIT(*ips) || *ips == '.' || *ips == ':') + while (ISDIGIT(*ips) || *ips == '.' || *ips == ':' || *ips == '[' || *ips == ']') ++ips; - buf = malloc(ips-addr+1); + buf = mm_malloc(ips-addr+1); if (!buf) return 4; memcpy(buf, addr, ips-addr); buf[ips-addr] = '\0'; r = evdns_nameserver_ip_add(buf); - free(buf); + mm_free(buf); if (r) return r; } return 0; @@ -2924,20 +3132,20 @@ GetNetworkParams_fn_t fn; /* XXXX Possibly, we should hardcode the location of this DLL. */ - if (!(handle = LoadLibrary("iphlpapi.dll"))) { + if (!(handle = LoadLibrary(TEXT("iphlpapi.dll"))) { log(EVDNS_LOG_WARN, "Could not open iphlpapi.dll"); /* right now status = 0, doesn't that mean "good" - mikec */ status = -1; goto done; } - if (!(fn = (GetNetworkParams_fn_t) GetProcAddress(handle, "GetNetworkParams"))) { + if (!(fn = (GetNetworkParams_fn_t) GetProcAddress(handle, TEXT("GetNetworkParams")))) { log(EVDNS_LOG_WARN, "Could not get address of function."); /* same as above */ status = -1; goto done; } - buf = malloc(size); + buf = mm_malloc(size); if (!buf) { status = 4; goto done; } fixed = buf; r = fn(fixed, &size); @@ -2946,8 +3154,8 @@ goto done; } if (r != ERROR_SUCCESS) { - free(buf); - buf = malloc(size); + mm_free(buf); + buf = mm_malloc(size); if (!buf) { status = 4; goto done; } fixed = buf; r = fn(fixed, &size); @@ -2964,33 +3172,36 @@ while (ns) { r = evdns_nameserver_ip_add_line(ns->IpAddress.String); if (r) { - log(EVDNS_LOG_DEBUG,"Could not add nameserver %s to list,error: %d", - (ns->IpAddress.String),(int)GetLastError()); + log(EVDNS_LOG_DEBUG,"Could not add nameserver %s to list, " + "error: %d; status: %d", + (ns->IpAddress.String),(int)GetLastError(), r); status = r; - goto done; } else { - log(EVDNS_LOG_DEBUG,"Succesfully added %s as nameserver",ns->IpAddress.String); + log(EVDNS_LOG_DEBUG,"Successfully added %s as nameserver",ns->IpAddress.String); + added_any++; } - added_any++; ns = ns->Next; } if (!added_any) { log(EVDNS_LOG_DEBUG, "No nameservers added."); - status = -1; + if (status == 0) + status = -1; + } else { + status = 0; } done: if (buf) - free(buf); + mm_free(buf); if (handle) FreeLibrary(handle); return status; } static int -config_nameserver_from_reg_key(HKEY key, const char *subkey) +config_nameserver_from_reg_key(HKEY key, const TCHAR *subkey) { char *buf; DWORD bufsz = 0, type = 0; @@ -2999,29 +3210,35 @@ if (RegQueryValueEx(key, subkey, 0, &type, NULL, &bufsz) != ERROR_MORE_DATA) return -1; - if (!(buf = malloc(bufsz))) + if (!(buf = mm_malloc(bufsz))) return -1; if (RegQueryValueEx(key, subkey, 0, &type, (LPBYTE)buf, &bufsz) == ERROR_SUCCESS && bufsz > 1) { + wcstombs(ansibuf,(wchar_t*)buf,MAX_PATH);/*XXXX UNICODE */ status = evdns_nameserver_ip_add_line(buf); } - free(buf); + mm_free(buf); return status; } -#define SERVICES_KEY "System\\CurrentControlSet\\Services\\" -#define WIN_NS_9X_KEY SERVICES_KEY "VxD\\MSTCP" -#define WIN_NS_NT_KEY SERVICES_KEY "Tcpip\\Parameters" +#define SERVICES_KEY TEXT("System\\CurrentControlSet\\Services\\") +#define WIN_NS_9X_KEY SERVICES_KEY TEXT("VxD\\MSTCP") +#define WIN_NS_NT_KEY SERVICES_KEY TEXT("Tcpip\\Parameters") static int load_nameservers_from_registry(void) { int found = 0; int r; + OSVERSIONINFO info; + memset(&info, 0, sizeof(info)); + info.dwOSVersionInfoSize = sizeof (info); + GetVersionEx(&info); + #define TRY(k, name) \ - if (!found && config_nameserver_from_reg_key(k,name) == 0) { \ + if (!found && config_nameserver_from_reg_key(k,TEXT(name)) == 0) { \ log(EVDNS_LOG_DEBUG,"Found nameservers in %s/%s",#k,name); \ found = 1; \ } else if (!found) { \ @@ -3029,7 +3246,7 @@ #k,#name); \ } - if (((int)GetVersion()) > 0) { /* NT */ + if (info.dwMajorVersion >= 5) { /* NT */ HKEY nt_key = 0, interfaces_key = 0; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, @@ -3037,7 +3254,7 @@ log(EVDNS_LOG_DEBUG,"Couldn't open nt key, %d",(int)GetLastError()); return -1; } - r = RegOpenKeyEx(nt_key, "Interfaces", 0, + r = RegOpenKeyEx(nt_key, Text("Interfaces"), 0, KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS, &interfaces_key); if (r != ERROR_SUCCESS) { @@ -3133,10 +3350,9 @@ if (server->socket >= 0) CLOSE_SOCKET(server->socket); (void) event_del(&server->event); - if (server->state == 0) - (void) event_del(&server->timeout_event); + del_timeout_event(server); CLEAR(server); - free(server); + mm_free(server); if (server_next == server_head) break; } @@ -3147,10 +3363,10 @@ for (dom = global_search_state->head; dom; dom = dom_next) { dom_next = dom->next; CLEAR(dom); - free(dom); + mm_free(dom); } CLEAR(global_search_state); - free(global_search_state); + mm_free(global_search_state); global_search_state = NULL; } evdns_log_fn = NULL; @@ -3184,20 +3400,20 @@ for (i = 0; i < req->nquestions; ++i) { u32 ans = htonl(0xc0a80b0bUL); if (req->questions[i]->type == EVDNS_TYPE_A && - req->questions[i]->class == EVDNS_CLASS_INET) { + req->questions[i]->dns_question_class == EVDNS_CLASS_INET) { printf(" -- replying for %s (A)\n", req->questions[i]->name); r = evdns_server_request_add_a_reply(req, req->questions[i]->name, 1, &ans, 10); if (r<0) printf("eeep, didn't work.\n"); } else if (req->questions[i]->type == EVDNS_TYPE_PTR && - req->questions[i]->class == EVDNS_CLASS_INET) { + req->questions[i]->dns_question_class == EVDNS_CLASS_INET) { printf(" -- replying for %s (PTR)\n", req->questions[i]->name); r = evdns_server_request_add_ptr_reply(req, NULL, req->questions[i]->name, "foo.bar.example.com", 10); } else { printf(" -- skipping %s [%d %d]\n", req->questions[i]->name, - req->questions[i]->type, req->questions[i]->class); + req->questions[i]->type, req->questions[i]->dns_question_class); } } diff -Nru tor-0.2.0.34/src/or/eventdns.h tor-0.2.2.16-alpha/src/or/eventdns.h --- tor-0.2.0.34/src/or/eventdns.h 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/eventdns.h 2009-11-17 20:37:03.000000000 +0000 @@ -112,7 +112,7 @@ * * API reference: * - * int evdns_nameserver_add(unsigned long int address) + * int evdns_nameserver_add(uint32_t address) * Add a nameserver. The address should be an IP address in * network byte order. The type of address is chosen so that * it matches in_addr.s_addr. @@ -209,8 +209,8 @@ * with the next probe. */ -#ifndef EVENTDNS_H -#define EVENTDNS_H +#ifndef _TOR_EVENTDNS_H +#define _TOR_EVENTDNS_H /* Error codes 0-5 are as described in RFC 1035. */ #define DNS_ERR_NONE 0 @@ -258,17 +258,19 @@ int evdns_init(void); void evdns_shutdown(int fail_requests); const char *evdns_err_to_string(int err); -int evdns_nameserver_add(unsigned long int address); +int evdns_nameserver_add(uint32_t address); int evdns_count_nameservers(void); int evdns_clear_nameservers_and_suspend(void); int evdns_resume(void); int evdns_nameserver_ip_add(const char *ip_as_string); +int evdns_nameserver_sockaddr_add(const struct sockaddr *sa, socklen_t len); +void evdns_set_default_outgoing_bind_address(const struct sockaddr *addr, socklen_t addrlen); int evdns_resolve_ipv4(const char *name, int flags, evdns_callback_type callback, void *ptr); int evdns_resolve_ipv6(const char *name, int flags, evdns_callback_type callback, void *ptr); struct in_addr; struct in6_addr; -int evdns_resolve_reverse(struct in_addr *in, int flags, evdns_callback_type callback, void *ptr); -int evdns_resolve_reverse_ipv6(struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr); +int evdns_resolve_reverse(const struct in_addr *in, int flags, evdns_callback_type callback, void *ptr); +int evdns_resolve_reverse_ipv6(const struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr); int evdns_set_option(const char *option, const char *val, int flags); int evdns_resolv_conf_parse(int flags, const char *); #ifdef MS_WINDOWS @@ -282,6 +284,7 @@ void evdns_set_log_fn(evdns_debug_log_fn_type fn); void evdns_set_transaction_id_fn(uint16_t (*fn)(void)); +void evdns_set_random_bytes_fn(void (*fn)(char *, size_t)); #define DNS_NO_SEARCH 1 @@ -294,7 +297,7 @@ }; struct evdns_server_question { int type; - int class; + int dns_question_class; char name[1]; }; typedef void (*evdns_request_callback_fn_type)(struct evdns_server_request *, void *); diff -Nru tor-0.2.0.34/src/or/eventdns_tor.h tor-0.2.2.16-alpha/src/or/eventdns_tor.h --- tor-0.2.0.34/src/or/eventdns_tor.h 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/eventdns_tor.h 2010-03-07 04:03:28.000000000 +0000 @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2008, The Tor Project, Inc. */ +/* Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff -Nru tor-0.2.0.34/src/or/geoip.c tor-0.2.2.16-alpha/src/or/geoip.c --- tor-0.2.0.34/src/or/geoip.c 2008-06-04 08:50:39.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/geoip.c 2010-08-18 23:04:46.000000000 +0000 @@ -1,20 +1,25 @@ -/* Copyright (c) 2007-2008, The Tor Project, Inc. */ +/* Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: /tor/trunk/src/or/networkstatus.c 15493 2007-12-16T18:33:25.055570Z nickm $ */ -const char geoip_c_id[] = - "$Id: /tor/trunk/src/or/networkstatus.c 15493 2007-12-16T18:33:25.055570Z nickm $"; /** * \file geoip.c - * \brief Functions related to maintaining an IP-to-country database and to - * summarizing client connections by country. + * \brief Functions related to maintaining an IP-to-country database; + * to summarizing client connections by country to entry guards, bridges, + * and directory servers; and for statistics on answering network status + * requests. */ #define GEOIP_PRIVATE #include "or.h" #include "ht.h" +#include "config.h" +#include "control.h" +#include "dnsserv.h" +#include "geoip.h" +#include "routerlist.h" static void clear_geoip_db(void); +static void init_geoip_countries(void); /** An entry from the GeoIP file: maps an IP range to a country. */ typedef struct geoip_entry_t { @@ -23,7 +28,14 @@ intptr_t country; /**< An index into geoip_countries */ } geoip_entry_t; -/** A list of lowercased two-letter country codes. */ +/** A per-country record for GeoIP request history. */ +typedef struct geoip_country_t { + char countrycode[3]; + uint32_t n_v2_ns_requests; + uint32_t n_v3_ns_requests; +} geoip_country_t; + +/** A list of geoip_country_t */ static smartlist_t *geoip_countries = NULL; /** A map from lowercased country codes to their position in geoip_countries. * The index is encoded in the pointer, and 1 is added so that NULL can mean @@ -32,6 +44,23 @@ /** A list of all known geoip_entry_t, sorted by ip_low. */ static smartlist_t *geoip_entries = NULL; +/** Return the index of the country's entry in the GeoIP DB + * if it is a valid 2-letter country code, otherwise return -1. + */ +country_t +geoip_get_country(const char *country) +{ + void *_idxplus1; + intptr_t idx; + + _idxplus1 = strmap_get_lc(country_idxplus1_by_lc_code, country); + if (!_idxplus1) + return -1; + + idx = ((uintptr_t)_idxplus1)-1; + return (country_t)idx; +} + /** Add an entry to the GeoIP table, mapping all IPs between low and * high, inclusive, to the 2-letter country code country. */ @@ -48,15 +77,19 @@ _idxplus1 = strmap_get_lc(country_idxplus1_by_lc_code, country); if (!_idxplus1) { - char *c = tor_strdup(country); - tor_strlower(c); + geoip_country_t *c = tor_malloc_zero(sizeof(geoip_country_t)); + strlcpy(c->countrycode, country, sizeof(c->countrycode)); + tor_strlower(c->countrycode); smartlist_add(geoip_countries, c); idx = smartlist_len(geoip_countries) - 1; strmap_set_lc(country_idxplus1_by_lc_code, country, (void*)(idx+1)); } else { idx = ((uintptr_t)_idxplus1)-1; } - tor_assert(!strcasecmp(smartlist_get(geoip_countries, idx), country)); + { + geoip_country_t *c = smartlist_get(geoip_countries, idx); + tor_assert(!strcasecmp(c->countrycode, country)); + } ent = tor_malloc_zero(sizeof(geoip_entry_t)); ent->ip_low = low; ent->ip_high = high; @@ -65,17 +98,17 @@ } /** Add an entry to the GeoIP table, parsing it from line. The - * format is as for geoip_load_file. */ + * format is as for geoip_load_file(). */ /*private*/ int geoip_parse_entry(const char *line) { unsigned int low, high; char b[3]; - if (!geoip_countries) { - geoip_countries = smartlist_create(); + if (!geoip_countries) + init_geoip_countries(); + if (!geoip_entries) geoip_entries = smartlist_create(); - country_idxplus1_by_lc_code = strmap_new(); - } + while (TOR_ISSPACE(*line)) ++line; if (*line == '#') @@ -130,6 +163,24 @@ return options->BridgeRelay && options->BridgeRecordUsageByCountry; } +/** Set up a new list of geoip countries with no countries (yet) set in it, + * except for the unknown country. + */ +static void +init_geoip_countries(void) +{ + geoip_country_t *geoip_unresolved; + geoip_countries = smartlist_create(); + /* Add a geoip_country_t for requests that could not be resolved to a + * country as first element (index 0) to geoip_countries. */ + geoip_unresolved = tor_malloc_zero(sizeof(geoip_country_t)); + strlcpy(geoip_unresolved->countrycode, "??", + sizeof(geoip_unresolved->countrycode)); + smartlist_add(geoip_countries, geoip_unresolved); + country_idxplus1_by_lc_code = strmap_new(); + strmap_set_lc(country_idxplus1_by_lc_code, "??", (void*)(1)); +} + /** Clear the GeoIP database and reload it from the file * filename. Return 0 on success, -1 on failure. * @@ -139,21 +190,30 @@ * "INTIPLOW","INTIPHIGH","CC","CC3","COUNTRY NAME" * where INTIPLOW and INTIPHIGH are IPv4 addresses encoded as 4-byte unsigned * integers, and CC is a country code. + * + * It also recognizes, and skips over, blank lines and lines that start + * with '#' (comments). */ int geoip_load_file(const char *filename, or_options_t *options) { FILE *f; - int severity = should_record_bridge_info(options) ? LOG_WARN : LOG_INFO; + const char *msg = ""; + int severity = options_need_geoip_info(options, &msg) ? LOG_WARN : LOG_INFO; clear_geoip_db(); if (!(f = fopen(filename, "r"))) { - log_fn(severity, LD_GENERAL, "Failed to open GEOIP file %s.", filename); + log_fn(severity, LD_GENERAL, "Failed to open GEOIP file %s. %s", + filename, msg); return -1; } - geoip_countries = smartlist_create(); + if (!geoip_countries) + init_geoip_countries(); + if (geoip_entries) { + SMARTLIST_FOREACH(geoip_entries, geoip_entry_t *, e, tor_free(e)); + smartlist_free(geoip_entries); + } geoip_entries = smartlist_create(); - country_idxplus1_by_lc_code = strmap_new(); - log_info(LD_GENERAL, "Parsing GEOIP file."); + log_notice(LD_GENERAL, "Parsing GEOIP file."); while (!feof(f)) { char buf[512]; if (fgets(buf, (int)sizeof(buf), f) == NULL) @@ -161,17 +221,23 @@ /* FFFF track full country name. */ geoip_parse_entry(buf); } - /*XXXX020 abort and return -1 if no entries/illformed?*/ + /*XXXX abort and return -1 if no entries/illformed?*/ fclose(f); smartlist_sort(geoip_entries, _geoip_compare_entries); + + /* Okay, now we need to maybe change our mind about what is in which + * country. */ + refresh_all_country_info(); + return 0; } /** Given an IP address in host order, return a number representing the - * country to which that address belongs, or -1 for unknown. The return value - * will always be less than geoip_get_n_countries(). To decode it, - * call geoip_get_country_name(). + * country to which that address belongs, -1 for "No geoip information + * available", or 0 for the 'unknown country'. The return value will always + * be less than geoip_get_n_countries(). To decode it, call + * geoip_get_country_name(). */ int geoip_get_country_by_ip(uint32_t ipaddr) @@ -180,7 +246,7 @@ if (!geoip_entries) return -1; ent = smartlist_bsearch(geoip_entries, &ipaddr, _geoip_compare_key_to_entry); - return ent ? (int)ent->country : -1; + return ent ? (int)ent->country : 0; } /** Return the number of countries recognized by the GeoIP database. */ @@ -193,11 +259,12 @@ /** Return the two-letter country code associated with the number num, * or "??" for an unknown value. */ const char * -geoip_get_country_name(int num) +geoip_get_country_name(country_t num) { - if (geoip_countries && num >= 0 && num < smartlist_len(geoip_countries)) - return smartlist_get(geoip_countries, num); - else + if (geoip_countries && num >= 0 && num < smartlist_len(geoip_countries)) { + geoip_country_t *c = smartlist_get(geoip_countries, num); + return c->countrycode; + } else return "??"; } @@ -214,14 +281,15 @@ typedef struct clientmap_entry_t { HT_ENTRY(clientmap_entry_t) node; uint32_t ipaddr; - time_t last_seen; + unsigned int last_seen_in_minutes:30; + unsigned int action:2; } clientmap_entry_t; +#define ACTION_MASK 3 + /** Map from client IP address to last time seen. */ static HT_HEAD(clientmap, clientmap_entry_t) client_history = HT_INITIALIZER(); -/** Time at which we started tracking client history. */ -static time_t client_history_starts = 0; /** Hashtable helper: compute a hash of a clientmap_entry_t. */ static INLINE unsigned @@ -233,7 +301,7 @@ static INLINE int clientmap_entries_eq(const clientmap_entry_t *a, const clientmap_entry_t *b) { - return a->ipaddr == b->ipaddr; + return a->ipaddr == b->ipaddr && a->action == b->action; } HT_PROTOTYPE(clientmap, clientmap_entry_t, node, clientmap_entry_hash, @@ -241,27 +309,134 @@ HT_GENERATE(clientmap, clientmap_entry_t, node, clientmap_entry_hash, clientmap_entries_eq, 0.6, malloc, realloc, free); +/** Clear history of connecting clients used by entry and bridge stats. */ +static void +client_history_clear(void) +{ + clientmap_entry_t **ent, **next, *this; + for (ent = HT_START(clientmap, &client_history); ent != NULL; + ent = next) { + if ((*ent)->action == GEOIP_CLIENT_CONNECT) { + this = *ent; + next = HT_NEXT_RMV(clientmap, &client_history, ent); + tor_free(this); + } else { + next = HT_NEXT(clientmap, &client_history, ent); + } + } +} + +/** How often do we update our estimate which share of v2 and v3 directory + * requests is sent to us? We could as well trigger updates of shares from + * network status updates, but that means adding a lot of calls into code + * that is independent from geoip stats (and keeping them up-to-date). We + * are perfectly fine with an approximation of 15-minute granularity. */ +#define REQUEST_SHARE_INTERVAL (15 * 60) + +/** When did we last determine which share of v2 and v3 directory requests + * is sent to us? */ +static time_t last_time_determined_shares = 0; + +/** Sum of products of v2 shares times the number of seconds for which we + * consider these shares as valid. */ +static double v2_share_times_seconds; + +/** Sum of products of v3 shares times the number of seconds for which we + * consider these shares as valid. */ +static double v3_share_times_seconds; + +/** Number of seconds we are determining v2 and v3 shares. */ +static int share_seconds; + +/** Try to determine which fraction of v2 and v3 directory requests aimed at + * caches will be sent to us at time now and store that value in + * order to take a mean value later on. */ +static void +geoip_determine_shares(time_t now) +{ + double v2_share = 0.0, v3_share = 0.0; + if (router_get_my_share_of_directory_requests(&v2_share, &v3_share) < 0) + return; + if (last_time_determined_shares) { + v2_share_times_seconds += v2_share * + ((double) (now - last_time_determined_shares)); + v3_share_times_seconds += v3_share * + ((double) (now - last_time_determined_shares)); + share_seconds += (int)(now - last_time_determined_shares); + } + last_time_determined_shares = now; +} + +/** Calculate which fraction of v2 and v3 directory requests aimed at caches + * have been sent to us since the last call of this function up to time + * now. Set *v2_share_out and *v3_share_out to the + * fractions of v2 and v3 protocol shares we expect to have seen. Reset + * counters afterwards. Return 0 on success, -1 on failure (e.g. when zero + * seconds have passed since the last call).*/ +static int +geoip_get_mean_shares(time_t now, double *v2_share_out, + double *v3_share_out) +{ + geoip_determine_shares(now); + if (!share_seconds) + return -1; + *v2_share_out = v2_share_times_seconds / ((double) share_seconds); + *v3_share_out = v3_share_times_seconds / ((double) share_seconds); + v2_share_times_seconds = v3_share_times_seconds = 0.0; + share_seconds = 0; + return 0; +} + /** Note that we've seen a client connect from the IP addr (host order) - * at time now. Ignored by all but bridges. */ + * at time now. Ignored by all but bridges and directories if + * configured accordingly. */ void -geoip_note_client_seen(uint32_t addr, time_t now) +geoip_note_client_seen(geoip_client_action_t action, + uint32_t addr, time_t now) { or_options_t *options = get_options(); clientmap_entry_t lookup, *ent; - if (!should_record_bridge_info(options)) - return; + if (action == GEOIP_CLIENT_CONNECT) { + /* Only remember statistics as entry guard or as bridge. */ + if (!options->EntryStatistics && + (!(options->BridgeRelay && options->BridgeRecordUsageByCountry))) + return; + } else { + if (options->BridgeRelay || options->BridgeAuthoritativeDir || + !options->DirReqStatistics) + return; + } + lookup.ipaddr = addr; + lookup.action = (int)action; ent = HT_FIND(clientmap, &client_history, &lookup); if (ent) { - ent->last_seen = now; + ent->last_seen_in_minutes = now / 60; } else { ent = tor_malloc_zero(sizeof(clientmap_entry_t)); ent->ipaddr = addr; - ent->last_seen = now; + ent->last_seen_in_minutes = now / 60; + ent->action = (int)action; HT_INSERT(clientmap, &client_history, ent); } - if (!client_history_starts) - client_history_starts = now; + + if (action == GEOIP_CLIENT_NETWORKSTATUS || + action == GEOIP_CLIENT_NETWORKSTATUS_V2) { + int country_idx = geoip_get_country_by_ip(addr); + if (country_idx < 0) + country_idx = 0; /** unresolved requests are stored at index 0. */ + if (country_idx >= 0 && country_idx < smartlist_len(geoip_countries)) { + geoip_country_t *country = smartlist_get(geoip_countries, country_idx); + if (action == GEOIP_CLIENT_NETWORKSTATUS) + ++country->n_v3_ns_requests; + else + ++country->n_v2_ns_requests; + } + + /* Periodically determine share of requests that we should see */ + if (last_time_determined_shares + REQUEST_SHARE_INTERVAL < now) + geoip_determine_shares(now); + } } /** HT_FOREACH helper: remove a clientmap_entry_t from the hashtable if it's @@ -269,8 +444,8 @@ static int _remove_old_client_helper(struct clientmap_entry_t *ent, void *_cutoff) { - time_t cutoff = *(time_t*)_cutoff; - if (ent->last_seen < cutoff) { + time_t cutoff = *(time_t*)_cutoff / 60; + if (ent->last_seen_in_minutes < cutoff) { tor_free(ent); return 1; } else { @@ -285,28 +460,51 @@ clientmap_HT_FOREACH_FN(&client_history, _remove_old_client_helper, &cutoff); - if (client_history_starts < cutoff) - client_history_starts = cutoff; +} + +/** How many responses are we giving to clients requesting v2 network + * statuses? */ +static uint32_t ns_v2_responses[GEOIP_NS_RESPONSE_NUM]; + +/** How many responses are we giving to clients requesting v3 network + * statuses? */ +static uint32_t ns_v3_responses[GEOIP_NS_RESPONSE_NUM]; + +/** Note that we've rejected a client's request for a v2 or v3 network + * status, encoded in action for reason reason at time + * now. */ +void +geoip_note_ns_response(geoip_client_action_t action, + geoip_ns_response_t response) +{ + static int arrays_initialized = 0; + if (!get_options()->DirReqStatistics) + return; + if (!arrays_initialized) { + memset(ns_v2_responses, 0, sizeof(ns_v2_responses)); + memset(ns_v3_responses, 0, sizeof(ns_v3_responses)); + arrays_initialized = 1; + } + tor_assert(action == GEOIP_CLIENT_NETWORKSTATUS || + action == GEOIP_CLIENT_NETWORKSTATUS_V2); + tor_assert(response < GEOIP_NS_RESPONSE_NUM); + if (action == GEOIP_CLIENT_NETWORKSTATUS) + ns_v3_responses[response]++; + else + ns_v2_responses[response]++; } /** Do not mention any country from which fewer than this number of IPs have * connected. This conceivably avoids reporting information that could * deanonymize users, though analysis is lacking. */ -#define MIN_IPS_TO_NOTE_COUNTRY 0 +#define MIN_IPS_TO_NOTE_COUNTRY 1 /** Do not report any geoip data at all if we have fewer than this number of * IPs to report about. */ -#define MIN_IPS_TO_NOTE_ANYTHING 0 +#define MIN_IPS_TO_NOTE_ANYTHING 1 /** When reporting geoip data about countries, round up to the nearest * multiple of this value. */ #define IP_GRANULARITY 8 -/** Return the time at which we started recording geoip data. */ -time_t -geoip_get_history_start(void) -{ - return client_history_starts; -} - /** Helper type: used to sort per-country totals by value. */ typedef struct c_hist_t { char country[3]; /**< Two-letter country code. */ @@ -328,95 +526,795 @@ return strcmp(a->country, b->country); } -/** Return a newly allocated comma-separated string containing entries for all - * the countries from which we've seen enough clients connect. The entry - * format is cc=num where num is the number of IPs we've seen connecting from - * that country, and cc is a lowercased country code. Returns NULL if we don't - * want to export geoip data yet. */ +/** When there are incomplete directory requests at the end of a 24-hour + * period, consider those requests running for longer than this timeout as + * failed, the others as still running. */ +#define DIRREQ_TIMEOUT (10*60) + +/** Entry in a map from either conn->global_identifier for direct requests + * or a unique circuit identifier for tunneled requests to request time, + * response size, and completion time of a network status request. Used to + * measure download times of requests to derive average client + * bandwidths. */ +typedef struct dirreq_map_entry_t { + HT_ENTRY(dirreq_map_entry_t) node; + /** Unique identifier for this network status request; this is either the + * conn->global_identifier of the dir conn (direct request) or a new + * locally unique identifier of a circuit (tunneled request). This ID is + * only unique among other direct or tunneled requests, respectively. */ + uint64_t dirreq_id; + unsigned int state:3; /**< State of this directory request. */ + unsigned int type:1; /**< Is this a direct or a tunneled request? */ + unsigned int completed:1; /**< Is this request complete? */ + unsigned int action:2; /**< Is this a v2 or v3 request? */ + /** When did we receive the request and started sending the response? */ + struct timeval request_time; + size_t response_size; /**< What is the size of the response in bytes? */ + struct timeval completion_time; /**< When did the request succeed? */ +} dirreq_map_entry_t; + +/** Map of all directory requests asking for v2 or v3 network statuses in + * the current geoip-stats interval. Values are + * of type *dirreq_map_entry_t. */ +static HT_HEAD(dirreqmap, dirreq_map_entry_t) dirreq_map = + HT_INITIALIZER(); + +static int +dirreq_map_ent_eq(const dirreq_map_entry_t *a, + const dirreq_map_entry_t *b) +{ + return a->dirreq_id == b->dirreq_id && a->type == b->type; +} + +static unsigned +dirreq_map_ent_hash(const dirreq_map_entry_t *entry) +{ + unsigned u = (unsigned) entry->dirreq_id; + u += entry->type << 20; + return u; +} + +HT_PROTOTYPE(dirreqmap, dirreq_map_entry_t, node, dirreq_map_ent_hash, + dirreq_map_ent_eq); +HT_GENERATE(dirreqmap, dirreq_map_entry_t, node, dirreq_map_ent_hash, + dirreq_map_ent_eq, 0.6, malloc, realloc, free); + +/** Helper: Put entry into map of directory requests using + * type and dirreq_id as key parts. If there is + * already an entry for that key, print out a BUG warning and return. */ +static void +_dirreq_map_put(dirreq_map_entry_t *entry, dirreq_type_t type, + uint64_t dirreq_id) +{ + dirreq_map_entry_t *old_ent; + tor_assert(entry->type == type); + tor_assert(entry->dirreq_id == dirreq_id); + + /* XXXX022 once we're sure the bug case never happens, we can switch + * to HT_INSERT */ + old_ent = HT_REPLACE(dirreqmap, &dirreq_map, entry); + if (old_ent && old_ent != entry) { + log_warn(LD_BUG, "Error when putting directory request into local " + "map. There was already an entry for the same identifier."); + return; + } +} + +/** Helper: Look up and return an entry in the map of directory requests + * using type and dirreq_id as key parts. If there + * is no such entry, return NULL. */ +static dirreq_map_entry_t * +_dirreq_map_get(dirreq_type_t type, uint64_t dirreq_id) +{ + dirreq_map_entry_t lookup; + lookup.type = type; + lookup.dirreq_id = dirreq_id; + return HT_FIND(dirreqmap, &dirreq_map, &lookup); +} + +/** Note that an either direct or tunneled (see type) directory + * request for a network status with unique ID dirreq_id of size + * response_size and action action (either v2 or v3) has + * started. */ +void +geoip_start_dirreq(uint64_t dirreq_id, size_t response_size, + geoip_client_action_t action, dirreq_type_t type) +{ + dirreq_map_entry_t *ent; + if (!get_options()->DirReqStatistics) + return; + ent = tor_malloc_zero(sizeof(dirreq_map_entry_t)); + ent->dirreq_id = dirreq_id; + tor_gettimeofday(&ent->request_time); + ent->response_size = response_size; + ent->action = action; + ent->type = type; + _dirreq_map_put(ent, type, dirreq_id); +} + +/** Change the state of the either direct or tunneled (see type) + * directory request with dirreq_id to new_state and + * possibly mark it as completed. If no entry can be found for the given + * key parts (e.g., if this is a directory request that we are not + * measuring, or one that was started in the previous measurement period), + * or if the state cannot be advanced to new_state, do nothing. */ +void +geoip_change_dirreq_state(uint64_t dirreq_id, dirreq_type_t type, + dirreq_state_t new_state) +{ + dirreq_map_entry_t *ent; + if (!get_options()->DirReqStatistics) + return; + ent = _dirreq_map_get(type, dirreq_id); + if (!ent) + return; + if (new_state == DIRREQ_IS_FOR_NETWORK_STATUS) + return; + if (new_state - 1 != ent->state) + return; + ent->state = new_state; + if ((type == DIRREQ_DIRECT && + new_state == DIRREQ_FLUSHING_DIR_CONN_FINISHED) || + (type == DIRREQ_TUNNELED && + new_state == DIRREQ_OR_CONN_BUFFER_FLUSHED)) { + tor_gettimeofday(&ent->completion_time); + ent->completed = 1; + } +} + +/** Return a newly allocated comma-separated string containing statistics + * on network status downloads. The string contains the number of completed + * requests, timeouts, and still running requests as well as the download + * times by deciles and quartiles. Return NULL if we have not observed + * requests for long enough. */ +static char * +geoip_get_dirreq_history(geoip_client_action_t action, + dirreq_type_t type) +{ + char *result = NULL; + smartlist_t *dirreq_completed = NULL; + uint32_t complete = 0, timeouts = 0, running = 0; + int bufsize = 1024, written; + dirreq_map_entry_t **ptr, **next, *ent; + struct timeval now; + + tor_gettimeofday(&now); + if (action != GEOIP_CLIENT_NETWORKSTATUS && + action != GEOIP_CLIENT_NETWORKSTATUS_V2) + return NULL; + dirreq_completed = smartlist_create(); + for (ptr = HT_START(dirreqmap, &dirreq_map); ptr; ptr = next) { + ent = *ptr; + if (ent->action != action || ent->type != type) { + next = HT_NEXT(dirreqmap, &dirreq_map, ptr); + continue; + } else { + if (ent->completed) { + smartlist_add(dirreq_completed, ent); + complete++; + next = HT_NEXT_RMV(dirreqmap, &dirreq_map, ptr); + } else { + if (tv_mdiff(&ent->request_time, &now) / 1000 > DIRREQ_TIMEOUT) + timeouts++; + else + running++; + next = HT_NEXT_RMV(dirreqmap, &dirreq_map, ptr); + tor_free(ent); + } + } + } +#define DIR_REQ_GRANULARITY 4 + complete = round_uint32_to_next_multiple_of(complete, + DIR_REQ_GRANULARITY); + timeouts = round_uint32_to_next_multiple_of(timeouts, + DIR_REQ_GRANULARITY); + running = round_uint32_to_next_multiple_of(running, + DIR_REQ_GRANULARITY); + result = tor_malloc_zero(bufsize); + written = tor_snprintf(result, bufsize, "complete=%u,timeout=%u," + "running=%u", complete, timeouts, running); + if (written < 0) { + tor_free(result); + goto done; + } + +#define MIN_DIR_REQ_RESPONSES 16 + if (complete >= MIN_DIR_REQ_RESPONSES) { + uint32_t *dltimes; + /* We may have rounded 'completed' up. Here we want to use the + * real value. */ + complete = smartlist_len(dirreq_completed); + dltimes = tor_malloc_zero(sizeof(uint32_t) * complete); + SMARTLIST_FOREACH_BEGIN(dirreq_completed, dirreq_map_entry_t *, ent) { + uint32_t bytes_per_second; + uint32_t time_diff = (uint32_t) tv_mdiff(&ent->request_time, + &ent->completion_time); + if (time_diff == 0) + time_diff = 1; /* Avoid DIV/0; "instant" answers are impossible + * by law of nature or something, but a milisecond + * is a bit greater than "instantly" */ + bytes_per_second = (uint32_t)(1000 * ent->response_size / time_diff); + dltimes[ent_sl_idx] = bytes_per_second; + } SMARTLIST_FOREACH_END(ent); + median_uint32(dltimes, complete); /* sorts as a side effect. */ + written = tor_snprintf(result + written, bufsize - written, + ",min=%u,d1=%u,d2=%u,q1=%u,d3=%u,d4=%u,md=%u," + "d6=%u,d7=%u,q3=%u,d8=%u,d9=%u,max=%u", + dltimes[0], + dltimes[1*complete/10-1], + dltimes[2*complete/10-1], + dltimes[1*complete/4-1], + dltimes[3*complete/10-1], + dltimes[4*complete/10-1], + dltimes[5*complete/10-1], + dltimes[6*complete/10-1], + dltimes[7*complete/10-1], + dltimes[3*complete/4-1], + dltimes[8*complete/10-1], + dltimes[9*complete/10-1], + dltimes[complete-1]); + if (written<0) + tor_free(result); + tor_free(dltimes); + } + done: + SMARTLIST_FOREACH(dirreq_completed, dirreq_map_entry_t *, ent, + tor_free(ent)); + smartlist_free(dirreq_completed); + return result; +} + +/** Return a newly allocated comma-separated string containing entries for + * all the countries from which we've seen enough clients connect as a + * bridge, directory server, or entry guard. The entry format is cc=num + * where num is the number of IPs we've seen connecting from that country, + * and cc is a lowercased country code. Returns NULL if we don't want + * to export geoip data yet. */ char * -geoip_get_client_history(time_t now) +geoip_get_client_history(geoip_client_action_t action) { char *result = NULL; + unsigned granularity = IP_GRANULARITY; + smartlist_t *chunks = NULL; + smartlist_t *entries = NULL; + int n_countries = geoip_get_n_countries(); + int i; + clientmap_entry_t **ent; + unsigned *counts = NULL; + unsigned total = 0; + if (!geoip_is_loaded()) return NULL; - if (client_history_starts < (now - 12*60*60)) { - char buf[32]; - smartlist_t *chunks = NULL; - smartlist_t *entries = NULL; - int n_countries = geoip_get_n_countries(); - int i; - clientmap_entry_t **ent; - unsigned *counts = tor_malloc_zero(sizeof(unsigned)*n_countries); - unsigned total = 0; - HT_FOREACH(ent, clientmap, &client_history) { - int country = geoip_get_country_by_ip((*ent)->ipaddr); - if (country < 0) - continue; - tor_assert(0 <= country && country < n_countries); - ++counts[country]; - ++total; + + counts = tor_malloc_zero(sizeof(unsigned)*n_countries); + HT_FOREACH(ent, clientmap, &client_history) { + int country; + if ((*ent)->action != (int)action) + continue; + country = geoip_get_country_by_ip((*ent)->ipaddr); + if (country < 0) + country = 0; /** unresolved requests are stored at index 0. */ + tor_assert(0 <= country && country < n_countries); + ++counts[country]; + ++total; + } + /* Don't record anything if we haven't seen enough IPs. */ + if (total < MIN_IPS_TO_NOTE_ANYTHING) + goto done; + /* Make a list of c_hist_t */ + entries = smartlist_create(); + for (i = 0; i < n_countries; ++i) { + unsigned c = counts[i]; + const char *countrycode; + c_hist_t *ent; + /* Only report a country if it has a minimum number of IPs. */ + if (c >= MIN_IPS_TO_NOTE_COUNTRY) { + c = round_to_next_multiple_of(c, granularity); + countrycode = geoip_get_country_name(i); + ent = tor_malloc(sizeof(c_hist_t)); + strlcpy(ent->country, countrycode, sizeof(ent->country)); + ent->total = c; + smartlist_add(entries, ent); } - /* Don't record anything if we haven't seen enough IPs. */ -#if MIN_IPS_TO_NOTE_ANYTHING > 0 - if (total < MIN_IPS_TO_NOTE_ANYTHING) - goto done; -#endif - /* Make a list of c_hist_t */ - entries = smartlist_create(); - for (i = 0; i < n_countries; ++i) { - unsigned c = counts[i]; - const char *countrycode; + } + /* Sort entries. Note that we must do this _AFTER_ rounding, or else + * the sort order could leak info. */ + smartlist_sort(entries, _c_hist_compare); + + /* Build the result. */ + chunks = smartlist_create(); + SMARTLIST_FOREACH(entries, c_hist_t *, ch, { + char *buf=NULL; + tor_asprintf(&buf, "%s=%u", ch->country, ch->total); + smartlist_add(chunks, buf); + }); + result = smartlist_join_strings(chunks, ",", 0, NULL); + done: + tor_free(counts); + if (chunks) { + SMARTLIST_FOREACH(chunks, char *, c, tor_free(c)); + smartlist_free(chunks); + } + if (entries) { + SMARTLIST_FOREACH(entries, c_hist_t *, c, tor_free(c)); + smartlist_free(entries); + } + return result; +} + +/** Return a newly allocated string holding the per-country request history + * for action in a format suitable for an extra-info document, or NULL + * on failure. */ +char * +geoip_get_request_history(geoip_client_action_t action) +{ + smartlist_t *entries, *strings; + char *result; + unsigned granularity = IP_GRANULARITY; + + if (action != GEOIP_CLIENT_NETWORKSTATUS && + action != GEOIP_CLIENT_NETWORKSTATUS_V2) + return NULL; + if (!geoip_countries) + return NULL; + + entries = smartlist_create(); + SMARTLIST_FOREACH(geoip_countries, geoip_country_t *, c, { + uint32_t tot = 0; c_hist_t *ent; - /* Only report a country if it has a minimum number of IPs. */ -#if MIN_IPS_TO_NOTE_COUNTRY > 0 - if (c >= MIN_IPS_TO_NOTE_COUNTRY) { -#else - if (c > 0) { -#endif - /* Round up to the next multiple of IP_GRANULARITY */ - c += IP_GRANULARITY-1; - c -= c % IP_GRANULARITY; - countrycode = geoip_get_country_name(i); - ent = tor_malloc(sizeof(c_hist_t)); - strlcpy(ent->country, countrycode, sizeof(ent->country)); - ent->total = c; - smartlist_add(entries, ent); + tot = (action == GEOIP_CLIENT_NETWORKSTATUS) ? + c->n_v3_ns_requests : c->n_v2_ns_requests; + if (!tot) + continue; + ent = tor_malloc_zero(sizeof(c_hist_t)); + strlcpy(ent->country, c->countrycode, sizeof(ent->country)); + ent->total = round_to_next_multiple_of(tot, granularity); + smartlist_add(entries, ent); + }); + smartlist_sort(entries, _c_hist_compare); + + strings = smartlist_create(); + SMARTLIST_FOREACH(entries, c_hist_t *, ent, { + char *buf = NULL; + tor_asprintf(&buf, "%s=%u", ent->country, ent->total); + smartlist_add(strings, buf); + }); + result = smartlist_join_strings(strings, ",", 0, NULL); + SMARTLIST_FOREACH(strings, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(entries, c_hist_t *, ent, tor_free(ent)); + smartlist_free(strings); + smartlist_free(entries); + return result; +} + +/** Start time of directory request stats or 0 if we're not collecting + * directory request statistics. */ +static time_t start_of_dirreq_stats_interval; + +/** Initialize directory request stats. */ +void +geoip_dirreq_stats_init(time_t now) +{ + start_of_dirreq_stats_interval = now; +} + +/** Stop collecting directory request stats in a way that we can re-start + * doing so in geoip_dirreq_stats_init(). */ +void +geoip_dirreq_stats_term(void) +{ + SMARTLIST_FOREACH(geoip_countries, geoip_country_t *, c, { + c->n_v2_ns_requests = c->n_v3_ns_requests = 0; + }); + { + clientmap_entry_t **ent, **next, *this; + for (ent = HT_START(clientmap, &client_history); ent != NULL; + ent = next) { + if ((*ent)->action == GEOIP_CLIENT_NETWORKSTATUS || + (*ent)->action == GEOIP_CLIENT_NETWORKSTATUS_V2) { + this = *ent; + next = HT_NEXT_RMV(clientmap, &client_history, ent); + tor_free(this); + } else { + next = HT_NEXT(clientmap, &client_history, ent); } } - /* Sort entries. Note that we must do this _AFTER_ rounding, or else - * the sort order could leak info. */ - smartlist_sort(entries, _c_hist_compare); - - /* Build the result. */ - chunks = smartlist_create(); - SMARTLIST_FOREACH(entries, c_hist_t *, ch, { - tor_snprintf(buf, sizeof(buf), "%s=%u", ch->country, ch->total); - smartlist_add(chunks, tor_strdup(buf)); - }); - result = smartlist_join_strings(chunks, ",", 0, NULL); -#if MIN_IPS_TO_NOTE_ANYTHING > 0 - done: -#endif - tor_free(counts); - if (chunks) { - SMARTLIST_FOREACH(chunks, char *, c, tor_free(c)); - smartlist_free(chunks); + } + v2_share_times_seconds = v3_share_times_seconds = 0.0; + last_time_determined_shares = 0; + share_seconds = 0; + memset(ns_v2_responses, 0, sizeof(ns_v2_responses)); + memset(ns_v3_responses, 0, sizeof(ns_v3_responses)); + { + dirreq_map_entry_t **ent, **next, *this; + for (ent = HT_START(dirreqmap, &dirreq_map); ent != NULL; ent = next) { + this = *ent; + next = HT_NEXT_RMV(dirreqmap, &dirreq_map, ent); + tor_free(this); } - if (entries) { - SMARTLIST_FOREACH(entries, c_hist_t *, c, tor_free(c)); - smartlist_free(entries); + } + start_of_dirreq_stats_interval = 0; +} + +/** Write dirreq statistics to $DATADIR/stats/dirreq-stats and return when + * we would next want to write. */ +time_t +geoip_dirreq_stats_write(time_t now) +{ + char *statsdir = NULL, *filename = NULL; + char *data_v2 = NULL, *data_v3 = NULL; + char written[ISO_TIME_LEN+1]; + open_file_t *open_file = NULL; + double v2_share = 0.0, v3_share = 0.0; + FILE *out; + int i; + + if (!start_of_dirreq_stats_interval) + return 0; /* Not initialized. */ + if (start_of_dirreq_stats_interval + WRITE_STATS_INTERVAL > now) + goto done; /* Not ready to write. */ + + /* Discard all items in the client history that are too old. */ + geoip_remove_old_clients(start_of_dirreq_stats_interval); + + statsdir = get_datadir_fname("stats"); + if (check_private_dir(statsdir, CPD_CREATE) < 0) + goto done; + filename = get_datadir_fname2("stats", "dirreq-stats"); + data_v2 = geoip_get_client_history(GEOIP_CLIENT_NETWORKSTATUS_V2); + data_v3 = geoip_get_client_history(GEOIP_CLIENT_NETWORKSTATUS); + format_iso_time(written, now); + out = start_writing_to_stdio_file(filename, OPEN_FLAGS_APPEND, + 0600, &open_file); + if (!out) + goto done; + if (fprintf(out, "dirreq-stats-end %s (%d s)\ndirreq-v3-ips %s\n" + "dirreq-v2-ips %s\n", written, + (unsigned) (now - start_of_dirreq_stats_interval), + data_v3 ? data_v3 : "", data_v2 ? data_v2 : "") < 0) + goto done; + tor_free(data_v2); + tor_free(data_v3); + + data_v2 = geoip_get_request_history(GEOIP_CLIENT_NETWORKSTATUS_V2); + data_v3 = geoip_get_request_history(GEOIP_CLIENT_NETWORKSTATUS); + if (fprintf(out, "dirreq-v3-reqs %s\ndirreq-v2-reqs %s\n", + data_v3 ? data_v3 : "", data_v2 ? data_v2 : "") < 0) + goto done; + tor_free(data_v2); + tor_free(data_v3); + SMARTLIST_FOREACH(geoip_countries, geoip_country_t *, c, { + c->n_v2_ns_requests = c->n_v3_ns_requests = 0; + }); +#define RESPONSE_GRANULARITY 8 + for (i = 0; i < GEOIP_NS_RESPONSE_NUM; i++) { + ns_v2_responses[i] = round_uint32_to_next_multiple_of( + ns_v2_responses[i], RESPONSE_GRANULARITY); + ns_v3_responses[i] = round_uint32_to_next_multiple_of( + ns_v3_responses[i], RESPONSE_GRANULARITY); + } +#undef RESPONSE_GRANULARITY + if (fprintf(out, "dirreq-v3-resp ok=%u,not-enough-sigs=%u,unavailable=%u," + "not-found=%u,not-modified=%u,busy=%u\n", + ns_v3_responses[GEOIP_SUCCESS], + ns_v3_responses[GEOIP_REJECT_NOT_ENOUGH_SIGS], + ns_v3_responses[GEOIP_REJECT_UNAVAILABLE], + ns_v3_responses[GEOIP_REJECT_NOT_FOUND], + ns_v3_responses[GEOIP_REJECT_NOT_MODIFIED], + ns_v3_responses[GEOIP_REJECT_BUSY]) < 0) + goto done; + if (fprintf(out, "dirreq-v2-resp ok=%u,unavailable=%u," + "not-found=%u,not-modified=%u,busy=%u\n", + ns_v2_responses[GEOIP_SUCCESS], + ns_v2_responses[GEOIP_REJECT_UNAVAILABLE], + ns_v2_responses[GEOIP_REJECT_NOT_FOUND], + ns_v2_responses[GEOIP_REJECT_NOT_MODIFIED], + ns_v2_responses[GEOIP_REJECT_BUSY]) < 0) + goto done; + memset(ns_v2_responses, 0, sizeof(ns_v2_responses)); + memset(ns_v3_responses, 0, sizeof(ns_v3_responses)); + if (!geoip_get_mean_shares(now, &v2_share, &v3_share)) { + if (fprintf(out, "dirreq-v2-share %0.2lf%%\n", v2_share*100) < 0) + goto done; + if (fprintf(out, "dirreq-v3-share %0.2lf%%\n", v3_share*100) < 0) + goto done; + } + + data_v2 = geoip_get_dirreq_history(GEOIP_CLIENT_NETWORKSTATUS_V2, + DIRREQ_DIRECT); + data_v3 = geoip_get_dirreq_history(GEOIP_CLIENT_NETWORKSTATUS, + DIRREQ_DIRECT); + if (fprintf(out, "dirreq-v3-direct-dl %s\ndirreq-v2-direct-dl %s\n", + data_v3 ? data_v3 : "", data_v2 ? data_v2 : "") < 0) + goto done; + tor_free(data_v2); + tor_free(data_v3); + data_v2 = geoip_get_dirreq_history(GEOIP_CLIENT_NETWORKSTATUS_V2, + DIRREQ_TUNNELED); + data_v3 = geoip_get_dirreq_history(GEOIP_CLIENT_NETWORKSTATUS, + DIRREQ_TUNNELED); + if (fprintf(out, "dirreq-v3-tunneled-dl %s\ndirreq-v2-tunneled-dl %s\n", + data_v3 ? data_v3 : "", data_v2 ? data_v2 : "") < 0) + goto done; + + finish_writing_to_file(open_file); + open_file = NULL; + + start_of_dirreq_stats_interval = now; + + done: + if (open_file) + abort_writing_to_file(open_file); + tor_free(filename); + tor_free(statsdir); + tor_free(data_v2); + tor_free(data_v3); + return start_of_dirreq_stats_interval + WRITE_STATS_INTERVAL; +} + +/** Start time of bridge stats or 0 if we're not collecting bridge + * statistics. */ +static time_t start_of_bridge_stats_interval; + +/** Initialize bridge stats. */ +void +geoip_bridge_stats_init(time_t now) +{ + start_of_bridge_stats_interval = now; +} + +/** Stop collecting bridge stats in a way that we can re-start doing so in + * geoip_bridge_stats_init(). */ +void +geoip_bridge_stats_term(void) +{ + client_history_clear(); + start_of_bridge_stats_interval = 0; +} + +/** Parse the bridge statistics as they are written to extra-info + * descriptors for being returned to controller clients. Return the + * controller string if successful, or NULL otherwise. */ +static char * +parse_bridge_stats_controller(const char *stats_str, time_t now) +{ + char stats_end_str[ISO_TIME_LEN+1], stats_start_str[ISO_TIME_LEN+1], + *controller_str, *eos, *eol, *summary; + + const char *BRIDGE_STATS_END = "bridge-stats-end "; + const char *BRIDGE_IPS = "bridge-ips "; + const char *BRIDGE_IPS_EMPTY_LINE = "bridge-ips\n"; + const char *tmp; + time_t stats_end_time; + int seconds; + tor_assert(stats_str); + + /* Parse timestamp and number of seconds from + "bridge-stats-end YYYY-MM-DD HH:MM:SS (N s)" */ + tmp = find_str_at_start_of_line(stats_str, BRIDGE_STATS_END); + if (!tmp) + return NULL; + tmp += strlen(BRIDGE_STATS_END); + + if (strlen(tmp) < ISO_TIME_LEN + 6) + return NULL; + strlcpy(stats_end_str, tmp, sizeof(stats_end_str)); + if (parse_iso_time(stats_end_str, &stats_end_time) < 0) + return NULL; + if (stats_end_time < now - (25*60*60) || + stats_end_time > now + (1*60*60)) + return NULL; + seconds = (int)strtol(tmp + ISO_TIME_LEN + 2, &eos, 10); + if (!eos || seconds < 23*60*60) + return NULL; + format_iso_time(stats_start_str, stats_end_time - seconds); + + /* Parse: "bridge-ips CC=N,CC=N,..." */ + tmp = find_str_at_start_of_line(stats_str, BRIDGE_IPS); + if (tmp) { + tmp += strlen(BRIDGE_IPS); + tmp = eat_whitespace_no_nl(tmp); + eol = strchr(tmp, '\n'); + if (eol) + summary = tor_strndup(tmp, eol-tmp); + else + summary = tor_strdup(tmp); + } else { + /* Look if there is an empty "bridge-ips" line */ + tmp = find_str_at_start_of_line(stats_str, BRIDGE_IPS_EMPTY_LINE); + if (!tmp) + return NULL; + summary = tor_strdup(""); + } + + tor_asprintf(&controller_str, + "TimeStarted=\"%s\" CountrySummary=%s", + stats_start_str, summary); + tor_free(summary); + return controller_str; +} + +/** Most recent bridge statistics formatted to be written to extra-info + * descriptors. */ +static char *bridge_stats_extrainfo = NULL; + +/** Most recent bridge statistics formatted to be returned to controller + * clients. */ +static char *bridge_stats_controller = NULL; + +/** Write bridge statistics to $DATADIR/stats/bridge-stats and return + * when we should next try to write statistics. */ +time_t +geoip_bridge_stats_write(time_t now) +{ + char *statsdir = NULL, *filename = NULL, *data = NULL, + written[ISO_TIME_LEN+1], *out = NULL, *controller_str; + size_t len; + + /* Check if 24 hours have passed since starting measurements. */ + if (now < start_of_bridge_stats_interval + WRITE_STATS_INTERVAL) + return start_of_bridge_stats_interval + WRITE_STATS_INTERVAL; + + /* Discard all items in the client history that are too old. */ + geoip_remove_old_clients(start_of_bridge_stats_interval); + + statsdir = get_datadir_fname("stats"); + if (check_private_dir(statsdir, CPD_CREATE) < 0) + goto done; + filename = get_datadir_fname2("stats", "bridge-stats"); + data = geoip_get_client_history(GEOIP_CLIENT_CONNECT); + format_iso_time(written, now); + len = strlen("bridge-stats-end (999999 s)\nbridge-ips \n") + + ISO_TIME_LEN + (data ? strlen(data) : 0) + 42; + out = tor_malloc(len); + if (tor_snprintf(out, len, "bridge-stats-end %s (%u s)\nbridge-ips %s\n", + written, (unsigned) (now - start_of_bridge_stats_interval), + data ? data : "") < 0) + goto done; + write_str_to_file(filename, out, 0); + controller_str = parse_bridge_stats_controller(out, now); + if (!controller_str) + goto done; + start_of_bridge_stats_interval = now; + tor_free(bridge_stats_extrainfo); + tor_free(bridge_stats_controller); + bridge_stats_extrainfo = out; + out = NULL; + bridge_stats_controller = controller_str; + control_event_clients_seen(controller_str); + done: + tor_free(filename); + tor_free(statsdir); + tor_free(data); + tor_free(out); + return start_of_bridge_stats_interval + + WRITE_STATS_INTERVAL; +} + +/** Try to load the most recent bridge statistics from disk, unless we + * have finished a measurement interval lately. */ +static void +load_bridge_stats(time_t now) +{ + char *statsdir, *fname=NULL, *contents, *controller_str; + if (bridge_stats_extrainfo) + return; + statsdir = get_datadir_fname("stats"); + if (check_private_dir(statsdir, CPD_CREATE) < 0) + goto done; + fname = get_datadir_fname2("stats", "bridge-stats"); + contents = read_file_to_str(fname, RFTS_IGNORE_MISSING, NULL); + if (contents) { + controller_str = parse_bridge_stats_controller(contents, now); + if (controller_str) { + bridge_stats_extrainfo = contents; + bridge_stats_controller = controller_str; + } else { + tor_free(contents); } } - return result; + done: + tor_free(fname); + tor_free(statsdir); +} + +/** Return most recent bridge statistics for inclusion in extra-info + * descriptors, or NULL if we don't have recent bridge statistics. */ +const char * +geoip_get_bridge_stats_extrainfo(time_t now) +{ + load_bridge_stats(now); + return bridge_stats_extrainfo; +} + +/** Return most recent bridge statistics to be returned to controller + * clients, or NULL if we don't have recent bridge statistics. */ +const char * +geoip_get_bridge_stats_controller(time_t now) +{ + load_bridge_stats(now); + return bridge_stats_controller; +} + +/** Start time of entry stats or 0 if we're not collecting entry + * statistics. */ +static time_t start_of_entry_stats_interval; + +/** Initialize entry stats. */ +void +geoip_entry_stats_init(time_t now) +{ + start_of_entry_stats_interval = now; +} + +/** Stop collecting entry stats in a way that we can re-start doing so in + * geoip_entry_stats_init(). */ +void +geoip_entry_stats_term(void) +{ + client_history_clear(); + start_of_entry_stats_interval = 0; +} + +/** Write entry statistics to $DATADIR/stats/entry-stats and return time + * when we would next want to write. */ +time_t +geoip_entry_stats_write(time_t now) +{ + char *statsdir = NULL, *filename = NULL; + char *data = NULL; + char written[ISO_TIME_LEN+1]; + open_file_t *open_file = NULL; + FILE *out; + + if (!start_of_entry_stats_interval) + return 0; /* Not initialized. */ + if (start_of_entry_stats_interval + WRITE_STATS_INTERVAL > now) + goto done; /* Not ready to write. */ + + /* Discard all items in the client history that are too old. */ + geoip_remove_old_clients(start_of_entry_stats_interval); + + statsdir = get_datadir_fname("stats"); + if (check_private_dir(statsdir, CPD_CREATE) < 0) + goto done; + filename = get_datadir_fname2("stats", "entry-stats"); + data = geoip_get_client_history(GEOIP_CLIENT_CONNECT); + format_iso_time(written, now); + out = start_writing_to_stdio_file(filename, OPEN_FLAGS_APPEND, + 0600, &open_file); + if (!out) + goto done; + if (fprintf(out, "entry-stats-end %s (%u s)\nentry-ips %s\n", + written, (unsigned) (now - start_of_entry_stats_interval), + data ? data : "") < 0) + goto done; + + start_of_entry_stats_interval = now; + + finish_writing_to_file(open_file); + open_file = NULL; + done: + if (open_file) + abort_writing_to_file(open_file); + tor_free(filename); + tor_free(statsdir); + tor_free(data); + return start_of_entry_stats_interval + WRITE_STATS_INTERVAL; } /** Helper used to implement GETINFO ip-to-country/... controller command. */ int getinfo_helper_geoip(control_connection_t *control_conn, - const char *question, char **answer) + const char *question, char **answer, + const char **errmsg) { (void)control_conn; - if (geoip_is_loaded() && !strcmpstart(question, "ip-to-country/")) { + if (!geoip_is_loaded()) { + *errmsg = "GeoIP data not loaded"; + return -1; + } + if (!strcmpstart(question, "ip-to-country/")) { int c; uint32_t ip; struct in_addr in; @@ -435,11 +1333,11 @@ clear_geoip_db(void) { if (geoip_countries) { - SMARTLIST_FOREACH(geoip_countries, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(geoip_countries, geoip_country_t *, c, tor_free(c)); smartlist_free(geoip_countries); } - if (country_idxplus1_by_lc_code) - strmap_free(country_idxplus1_by_lc_code, NULL); + + strmap_free(country_idxplus1_by_lc_code, NULL); if (geoip_entries) { SMARTLIST_FOREACH(geoip_entries, geoip_entry_t *, ent, tor_free(ent)); smartlist_free(geoip_entries); @@ -453,13 +1351,24 @@ void geoip_free_all(void) { - clientmap_entry_t **ent, **next, *this; - for (ent = HT_START(clientmap, &client_history); ent != NULL; ent = next) { - this = *ent; - next = HT_NEXT_RMV(clientmap, &client_history, ent); - tor_free(this); + { + clientmap_entry_t **ent, **next, *this; + for (ent = HT_START(clientmap, &client_history); ent != NULL; ent = next) { + this = *ent; + next = HT_NEXT_RMV(clientmap, &client_history, ent); + tor_free(this); + } + HT_CLEAR(clientmap, &client_history); + } + { + dirreq_map_entry_t **ent, **next, *this; + for (ent = HT_START(dirreqmap, &dirreq_map); ent != NULL; ent = next) { + this = *ent; + next = HT_NEXT_RMV(dirreqmap, &dirreq_map, ent); + tor_free(this); + } + HT_CLEAR(dirreqmap, &dirreq_map); } - HT_CLEAR(clientmap, &client_history); clear_geoip_db(); } diff -Nru tor-0.2.0.34/src/or/geoip.h tor-0.2.2.16-alpha/src/or/geoip.h --- tor-0.2.0.34/src/or/geoip.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/geoip.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,57 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file geoip.h + * \brief Header file for geoip.c. + **/ + +#ifndef _TOR_GEOIP_H +#define _TOR_GEOIP_H + +#ifdef GEOIP_PRIVATE +int geoip_parse_entry(const char *line); +#endif +int should_record_bridge_info(or_options_t *options); +int geoip_load_file(const char *filename, or_options_t *options); +int geoip_get_country_by_ip(uint32_t ipaddr); +int geoip_get_n_countries(void); +const char *geoip_get_country_name(country_t num); +int geoip_is_loaded(void); +country_t geoip_get_country(const char *countrycode); + +void geoip_note_client_seen(geoip_client_action_t action, + uint32_t addr, time_t now); +void geoip_remove_old_clients(time_t cutoff); + +void geoip_note_ns_response(geoip_client_action_t action, + geoip_ns_response_t response); +char *geoip_get_client_history(geoip_client_action_t action); +char *geoip_get_request_history(geoip_client_action_t action); +int getinfo_helper_geoip(control_connection_t *control_conn, + const char *question, char **answer, + const char **errmsg); +void geoip_free_all(void); + +void geoip_start_dirreq(uint64_t dirreq_id, size_t response_size, + geoip_client_action_t action, dirreq_type_t type); +void geoip_change_dirreq_state(uint64_t dirreq_id, dirreq_type_t type, + dirreq_state_t new_state); + +void geoip_dirreq_stats_init(time_t now); +time_t geoip_dirreq_stats_write(time_t now); +void geoip_dirreq_stats_term(void); +void geoip_entry_stats_init(time_t now); +time_t geoip_entry_stats_write(time_t now); +void geoip_entry_stats_term(void); +void geoip_bridge_stats_init(time_t now); +time_t geoip_bridge_stats_write(time_t now); +void geoip_bridge_stats_term(void); +const char *geoip_get_bridge_stats_extrainfo(time_t); +const char *geoip_get_bridge_stats_controller(time_t); + +#endif + diff -Nru tor-0.2.0.34/src/or/hibernate.c tor-0.2.2.16-alpha/src/or/hibernate.c --- tor-0.2.0.34/src/or/hibernate.c 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/hibernate.c 2010-08-11 03:14:16.000000000 +0000 @@ -1,9 +1,6 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: hibernate.c 13680 2008-02-22 19:09:45Z nickm $ */ -const char hibernate_c_id[] = - "$Id: hibernate.c 13680 2008-02-22 19:09:45Z nickm $"; /** * \file hibernate.c @@ -25,6 +22,12 @@ */ #include "or.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "hibernate.h" +#include "main.h" +#include "router.h" /** Possible values of hibernate_state */ typedef enum { @@ -103,11 +106,12 @@ static uint64_t expected_bandwidth_usage = 0; /** What unit are we using for our accounting? */ static time_unit_t cfg_unit = UNIT_MONTH; + /** How many days,hours,minutes into each unit does our accounting interval * start? */ -static int cfg_start_day = 0; -static int cfg_start_hour = 0; -static int cfg_start_min = 0; +static int cfg_start_day = 0, + cfg_start_hour = 0, + cfg_start_min = 0; static void reset_accounting(time_t now); static int read_bandwidth_usage(void); @@ -184,6 +188,9 @@ case UNIT_DAY: d = 0; break; + /* Coverity dislikes unreachable default cases; some compilers warn on + * switch statements missing a case. Tell Coverity not to worry. */ + /* coverity[dead_error_begin] */ default: tor_assert(0); } @@ -582,13 +589,13 @@ } if (!state) - return 0; + return -1; /* Okay; it looks like the state file is more up-to-date than the - * bw_accounting file, or the bw_accounting file is nonexistant, + * bw_accounting file, or the bw_accounting file is nonexistent, * or the bw_accounting file is corrupt. */ - log_info(LD_ACCT, "Reading bandwdith accounting data from state file"); + log_info(LD_ACCT, "Reading bandwidth accounting data from state file"); n_bytes_read_in_interval = state->AccountingBytesReadInInterval; n_bytes_written_in_interval = state->AccountingBytesWrittenInInterval; n_seconds_active_in_interval = state->AccountingSecondsActive; @@ -653,7 +660,7 @@ if (new_state == HIBERNATE_STATE_EXITING && hibernate_state != HIBERNATE_STATE_LIVE) { - log_notice(LD_GENERAL,"Sigint received %s; exiting now.", + log_notice(LD_GENERAL,"SIGINT received %s; exiting now.", hibernate_state == HIBERNATE_STATE_EXITING ? "a second time" : "while hibernating"); tor_cleanup(); @@ -862,9 +869,11 @@ * NULL. */ int getinfo_helper_accounting(control_connection_t *conn, - const char *question, char **answer) + const char *question, char **answer, + const char **errmsg) { (void) conn; + (void) errmsg; if (!strcmp(question, "accounting/enabled")) { *answer = tor_strdup(accounting_is_enabled(get_options()) ? "1" : "0"); } else if (!strcmp(question, "accounting/hibernating")) { diff -Nru tor-0.2.0.34/src/or/hibernate.h tor-0.2.2.16-alpha/src/or/hibernate.h --- tor-0.2.0.34/src/or/hibernate.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/hibernate.h 2010-08-18 23:04:46.000000000 +0000 @@ -0,0 +1,29 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file hibernate.h + * \brief Header file for hibernate.c. + **/ + +#ifndef _TOR_HIBERNATE_H +#define _TOR_HIBERNATE_H + +int accounting_parse_options(or_options_t *options, int validate_only); +int accounting_is_enabled(or_options_t *options); +void configure_accounting(time_t now); +void accounting_run_housekeeping(time_t now); +void accounting_add_bytes(size_t n_read, size_t n_written, int seconds); +int accounting_record_bandwidth_usage(time_t now, or_state_t *state); +void hibernate_begin_shutdown(void); +int we_are_hibernating(void); +void consider_hibernation(time_t now); +int getinfo_helper_accounting(control_connection_t *conn, + const char *question, char **answer, + const char **errmsg); + +#endif + diff -Nru tor-0.2.0.34/src/or/main.c tor-0.2.2.16-alpha/src/or/main.c --- tor-0.2.0.34/src/or/main.c 2009-01-30 19:21:27.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/main.c 2010-09-12 02:54:22.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: main.c 18236 2009-01-22 16:37:09Z nickm $ */ -const char main_c_id[] = - "$Id: main.c 18236 2009-01-22 16:37:09Z nickm $"; /** * \file main.c @@ -15,8 +12,48 @@ #define MAIN_PRIVATE #include "or.h" +#include "buffers.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "command.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "connection_or.h" +#include "control.h" +#include "cpuworker.h" +#include "directory.h" +#include "dirserv.h" +#include "dirvote.h" +#include "dns.h" +#include "dnsserv.h" +#include "geoip.h" +#include "hibernate.h" +#include "main.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "ntmain.h" +#include "onion.h" +#include "policies.h" +#include "relay.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rendservice.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" #ifdef USE_DMALLOC #include +#include +#endif +#include "memarea.h" + +#ifdef HAVE_EVENT2_EVENT_H +#include +#else +#include #endif void evdns_shutdown(int); @@ -28,7 +65,7 @@ static void conn_read_callback(int fd, short event, void *_conn); static void conn_write_callback(int fd, short event, void *_conn); static void signal_callback(int fd, short events, void *arg); -static void second_elapsed_callback(int fd, short event, void *args); +static void second_elapsed_callback(periodic_timer_t *timer, void *args); static int conn_close_if_marked(int i); static void connection_start_reading_from_linked_conn(connection_t *conn); static int connection_should_read_from_linked_conn(connection_t *conn); @@ -43,15 +80,16 @@ /** Max number of relayed (bandwidth class 1) bytes I can write this second. */ int global_relayed_write_bucket; -/** What was the read bucket before the last call to prepare_for_pool? +/** What was the read bucket before the last second_elapsed_callback() call? * (used to determine how many bytes we've read). */ static int stats_prev_global_read_bucket; -/** What was the write bucket before the last call to prepare_for_pool? +/** What was the write bucket before the last second_elapsed_callback() call? * (used to determine how many bytes we've written). */ static int stats_prev_global_write_bucket; /* XXX we might want to keep stats about global_relayed_*_bucket too. Or not.*/ -/** How many bytes have we read/written since we started the process? */ +/** How many bytes have we read since we started the process? */ static uint64_t stats_n_bytes_read = 0; +/** How many bytes have we written since we started the process? */ static uint64_t stats_n_bytes_written = 0; /** What time did this process start up? */ time_t time_of_process_start = 0; @@ -96,9 +134,6 @@ /** How long do we let a directory connection stall before expiring it? */ #define DIR_CONN_MAX_STALL (5*60) -/** How old do we let a connection to an OR get before deciding it's - * obsolete? */ -#define TIME_BEFORE_OR_CONN_IS_OBSOLETE (60*60*24*7) /** How long do we let OR connections handshake before we decide that * they are obsolete? */ #define TLS_HANDSHAKE_TIMEOUT (60) @@ -130,21 +165,38 @@ smartlist_add(connection_array, conn); if (conn->s >= 0 || conn->linked) { - conn->read_event = tor_malloc_zero(sizeof(struct event)); - conn->write_event = tor_malloc_zero(sizeof(struct event)); - event_set(conn->read_event, conn->s, EV_READ|EV_PERSIST, - conn_read_callback, conn); - event_set(conn->write_event, conn->s, EV_WRITE|EV_PERSIST, - conn_write_callback, conn); + conn->read_event = tor_event_new(tor_libevent_get_base(), + conn->s, EV_READ|EV_PERSIST, conn_read_callback, conn); + conn->write_event = tor_event_new(tor_libevent_get_base(), + conn->s, EV_WRITE|EV_PERSIST, conn_write_callback, conn); } - log_debug(LD_NET,"new conn type %s, socket %d, n_conns %d.", - conn_type_to_string(conn->type), conn->s, + log_debug(LD_NET,"new conn type %s, socket %d, address %s, n_conns %d.", + conn_type_to_string(conn->type), conn->s, conn->address, smartlist_len(connection_array)); return 0; } +/** Tell libevent that we don't care about conn any more. */ +void +connection_unregister_events(connection_t *conn) +{ + if (conn->read_event) { + if (event_del(conn->read_event)) + log_warn(LD_BUG, "Error removing read event for %d", conn->s); + tor_free(conn->read_event); + } + if (conn->write_event) { + if (event_del(conn->write_event)) + log_warn(LD_BUG, "Error removing write event for %d", conn->s); + tor_free(conn->write_event); + } + if (conn->dns_server_port) { + dnsserv_close_listener(conn); + } +} + /** Remove the connection from the global list, and remove the * corresponding poll entry. Calling this function will shift the last * connection (if any) into the position occupied by conn. @@ -243,21 +295,23 @@ smartlist_t * get_connection_array(void) { + if (!connection_array) + connection_array = smartlist_create(); return connection_array; } /** Set the event mask on conn to events. (The event - * mask is a bitmask whose bits are EV_READ and EV_WRITE.) + * mask is a bitmask whose bits are READ_EVENT and WRITE_EVENT) */ void -connection_watch_events(connection_t *conn, short events) +connection_watch_events(connection_t *conn, watchable_events_t events) { - if (events & EV_READ) + if (events & READ_EVENT) connection_start_reading(conn); else connection_stop_reading(conn); - if (events & EV_WRITE) + if (events & WRITE_EVENT) connection_start_writing(conn); else connection_stop_writing(conn); @@ -394,11 +448,11 @@ smartlist_add(active_linked_connection_lst, conn); if (!called_loop_once) { /* This is the first event on the list; we won't be in LOOP_ONCE mode, - * so we need to make sure that the event_loop() actually exits at the - * end of its run through the current connections and - * lets us activate read events for linked connections. */ + * so we need to make sure that the event_base_loop() actually exits at + * the end of its run through the current connections and lets us + * activate read events for linked connections. */ struct timeval tv = { 0, 0 }; - event_loopexit(&tv); + tor_event_base_loopexit(tor_libevent_get_base(), &tv); } } else { tor_assert(smartlist_isin(active_linked_connection_lst, conn)); @@ -452,7 +506,7 @@ log_debug(LD_NET,"socket %d wants to read.",conn->s); - assert_connection_ok(conn, time(NULL)); + /* assert_connection_ok(conn, time(NULL)); */ if (connection_handle_read(conn) < 0) { if (!conn->marked_for_close) { @@ -484,7 +538,7 @@ LOG_FN_CONN(conn, (LOG_DEBUG, LD_NET, "socket %d wants to write.",conn->s)); - assert_connection_ok(conn, time(NULL)); + /* assert_connection_ok(conn, time(NULL)); */ if (connection_handle_write(conn, 0) < 0) { if (!conn->marked_for_close) { @@ -498,7 +552,7 @@ edge_connection_t *edge_conn = TO_EDGE_CONN(conn); if (!edge_conn->end_reason) edge_conn->end_reason = END_STREAM_REASON_INTERNAL; - conn->edge_has_sent_end = 1; + edge_conn->edge_has_sent_end = 1; } connection_close_immediate(conn); /* So we don't try to flush. */ connection_mark_for_close(conn); @@ -530,7 +584,7 @@ return 0; /* nothing to see here, move along */ now = time(NULL); assert_connection_ok(conn, now); - assert_all_pending_dns_resolves_ok(); + /* assert_all_pending_dns_resolves_ok(); */ log_debug(LD_NET,"Cleaning up connection (fd %d).",conn->s); if ((conn->s >= 0 || conn->linked_conn) && connection_wants_to_flush(conn)) { @@ -541,7 +595,7 @@ log_info(LD_NET, "Conn (addr %s, fd %d, type %s, state %d) marked, but wants " "to flush %d bytes. (Marked at %s:%d)", - escaped_safe_str(conn->address), + escaped_safe_str_client(conn->address), conn->s, conn_type_to_string(conn->type), conn->state, (int)conn->outbuf_flushlen, conn->marked_for_close_file, conn->marked_for_close); @@ -594,8 +648,8 @@ "something is wrong with theirs. " "(fd %d, type %s, state %d, marked at %s:%d).", (int)buf_datalen(conn->outbuf), - escaped_safe_str(conn->address), conn->s, - conn_type_to_string(conn->type), conn->state, + escaped_safe_str_client(conn->address), + conn->s, conn_type_to_string(conn->type), conn->state, conn->marked_for_close_file, conn->marked_for_close); } @@ -624,7 +678,7 @@ log_notice(LD_NET, "Is your network connection down? " "Failing connection to '%s:%d'.", - safe_str(edge_conn->socks_request->address), + safe_str_client(edge_conn->socks_request->address), edge_conn->socks_request->port); connection_mark_unattached_ap(edge_conn, END_STREAM_REASON_NET_UNREACHABLE); @@ -647,6 +701,9 @@ update_router_descriptor_downloads(now); return; } else { + if (directory_fetches_from_authorities(options)) + update_router_descriptor_downloads(now); + /* if we have enough dir info, then update our guard status with * whatever we just learned. */ entry_guards_compute_status(); @@ -661,6 +718,15 @@ consider_testing_reachability(1, 1); } +/** How long do we wait before killing OR connections with no circuits? + * In Tor versions up to 0.2.1.25 and 0.2.2.12-alpha, we waited 15 minutes + * before cancelling these connections, which caused fast relays to accrue + * many many idle connections. Hopefully 3 minutes is low enough that + * it kills most idle connections, without being so low that we cause + * clients to bounce on and off. + */ +#define IDLE_OR_CONN_TIMEOUT 180 + /** Perform regular maintenance tasks for a single connection. This * function gets run once per second per connection by run_scheduled_events. */ @@ -671,6 +737,8 @@ connection_t *conn = smartlist_get(connection_array, i); or_options_t *options = get_options(); or_connection_t *or_conn; + int past_keepalive = + now >= conn->timestamp_lastwritten + options->KeepalivePeriod; if (conn->outbuf && !buf_datalen(conn->outbuf) && conn->type == CONN_TYPE_OR) TO_OR_CONN(conn)->timestamp_lastempty = now; @@ -705,99 +773,68 @@ if (!connection_speaks_cells(conn)) return; /* we're all done here, the rest is just for OR conns */ - or_conn = TO_OR_CONN(conn); + /* If we haven't written to an OR connection for a while, then either nuke + the connection or send a keepalive, depending. */ - if (!conn->or_is_obsolete) { - if (conn->timestamp_created + TIME_BEFORE_OR_CONN_IS_OBSOLETE < now) { - log_info(LD_OR, - "Marking OR conn to %s:%d obsolete (fd %d, %d secs old).", - conn->address, conn->port, conn->s, - (int)(now - conn->timestamp_created)); - conn->or_is_obsolete = 1; - } else { - or_connection_t *best = - connection_or_get_by_identity_digest(or_conn->identity_digest); - if (best && best != or_conn && - (conn->state == OR_CONN_STATE_OPEN || - now > conn->timestamp_created + TLS_HANDSHAKE_TIMEOUT)) { - /* We only mark as obsolete connections that already are in - * OR_CONN_STATE_OPEN, i.e. that have finished their TLS handshaking. - * This is necessary because authorities judge whether a router is - * reachable based on whether they were able to TLS handshake with it - * recently. Without this check we would expire connections too - * early for router->last_reachable to be updated. - */ - log_info(LD_OR, - "Marking duplicate conn to %s:%d obsolete " - "(fd %d, %d secs old).", - conn->address, conn->port, conn->s, - (int)(now - conn->timestamp_created)); - conn->or_is_obsolete = 1; - } - } - } + or_conn = TO_OR_CONN(conn); + tor_assert(conn->outbuf); - if (conn->or_is_obsolete && !or_conn->n_circuits) { - /* no unmarked circs -- mark it now */ + if (or_conn->is_bad_for_new_circs && !or_conn->n_circuits) { + /* It's bad for new circuits, and has no unmarked circuits on it: + * mark it now. */ log_info(LD_OR, - "Expiring non-used OR connection to fd %d (%s:%d) [Obsolete].", + "Expiring non-used OR connection to fd %d (%s:%d) [Too old].", conn->s, conn->address, conn->port); + if (conn->state == OR_CONN_STATE_CONNECTING) + connection_or_connect_failed(TO_OR_CONN(conn), + END_OR_CONN_REASON_TIMEOUT, + "Tor gave up on the connection"); connection_mark_for_close(conn); conn->hold_open_until_flushed = 1; - return; - } - - /* If we haven't written to an OR connection for a while, then either nuke - the connection or send a keepalive, depending. */ - if (now >= conn->timestamp_lastwritten + options->KeepalivePeriod) { - routerinfo_t *router = router_get_by_digest(or_conn->identity_digest); - int maxCircuitlessPeriod = options->MaxCircuitDirtiness*3/2; - if (!connection_state_is_open(conn)) { + } else if (!connection_state_is_open(conn)) { + if (past_keepalive) { /* We never managed to actually get this connection open and happy. */ log_info(LD_OR,"Expiring non-open OR connection to fd %d (%s:%d).", conn->s,conn->address, conn->port); connection_mark_for_close(conn); - conn->hold_open_until_flushed = 1; - } else if (we_are_hibernating() && !or_conn->n_circuits && - !buf_datalen(conn->outbuf)) { - /* We're hibernating, there's no circuits, and nothing to flush.*/ - log_info(LD_OR,"Expiring non-used OR connection to fd %d (%s:%d) " - "[Hibernating or exiting].", - conn->s,conn->address, conn->port); - connection_mark_for_close(conn); - conn->hold_open_until_flushed = 1; - } else if (!clique_mode(options) && !or_conn->n_circuits && - now >= or_conn->timestamp_last_added_nonpadding + - maxCircuitlessPeriod && - (!router || !server_mode(options) || - !router_is_clique_mode(router))) { - log_info(LD_OR,"Expiring non-used OR connection to fd %d (%s:%d) " - "[Not in clique mode].", - conn->s,conn->address, conn->port); - connection_mark_for_close(conn); - conn->hold_open_until_flushed = 1; - } else if ( - now >= or_conn->timestamp_lastempty + options->KeepalivePeriod*10 && - now >= conn->timestamp_lastwritten + options->KeepalivePeriod*10) { - log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL, - "Expiring stuck OR connection to fd %d (%s:%d). (%d bytes to " - "flush; %d seconds since last write)", - conn->s, conn->address, conn->port, - (int)buf_datalen(conn->outbuf), - (int)(now-conn->timestamp_lastwritten)); - connection_mark_for_close(conn); - } else if (!buf_datalen(conn->outbuf)) { - /* either in clique mode, or we've got a circuit. send a padding cell. */ - log_fn(LOG_DEBUG,LD_OR,"Sending keepalive to (%s:%d)", - conn->address, conn->port); - memset(&cell,0,sizeof(cell_t)); - cell.command = CELL_PADDING; - connection_or_write_cell_to_buf(&cell, or_conn); } + } else if (we_are_hibernating() && !or_conn->n_circuits && + !buf_datalen(conn->outbuf)) { + /* We're hibernating, there's no circuits, and nothing to flush.*/ + log_info(LD_OR,"Expiring non-used OR connection to fd %d (%s:%d) " + "[Hibernating or exiting].", + conn->s,conn->address, conn->port); + connection_mark_for_close(conn); + conn->hold_open_until_flushed = 1; + } else if (!or_conn->n_circuits && + now >= or_conn->timestamp_last_added_nonpadding + + IDLE_OR_CONN_TIMEOUT) { + log_info(LD_OR,"Expiring non-used OR connection to fd %d (%s:%d) " + "[idle %d].", conn->s,conn->address, conn->port, + (int)(now - or_conn->timestamp_last_added_nonpadding)); + connection_mark_for_close(conn); + conn->hold_open_until_flushed = 1; + } else if ( + now >= or_conn->timestamp_lastempty + options->KeepalivePeriod*10 && + now >= conn->timestamp_lastwritten + options->KeepalivePeriod*10) { + log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL, + "Expiring stuck OR connection to fd %d (%s:%d). (%d bytes to " + "flush; %d seconds since last write)", + conn->s, conn->address, conn->port, + (int)buf_datalen(conn->outbuf), + (int)(now-conn->timestamp_lastwritten)); + connection_mark_for_close(conn); + } else if (past_keepalive && !buf_datalen(conn->outbuf)) { + /* send a padding cell */ + log_fn(LOG_DEBUG,LD_OR,"Sending keepalive to (%s:%d)", + conn->address, conn->port); + memset(&cell,0,sizeof(cell_t)); + cell.command = CELL_PADDING; + connection_or_write_cell_to_buf(&cell, or_conn); } } -/** Honor a NEWNYM request: make future requests unlinkability to past +/** Honor a NEWNYM request: make future requests unlinkable to past * requests. */ static void signewnym_impl(time_t now) @@ -809,13 +846,11 @@ } /** Perform regular maintenance tasks. This function gets run once per - * second by prepare_for_poll. + * second by second_elapsed_callback(). */ static void run_scheduled_events(time_t now) { - static time_t time_to_fetch_directory = 0; - static time_t time_to_fetch_running_routers = 0; static time_t last_rotated_x509_certificate = 0; static time_t time_to_check_v3_certificate = 0; static time_t time_to_check_listeners = 0; @@ -825,13 +860,15 @@ static time_t time_to_try_getting_descriptors = 0; static time_t time_to_reset_descriptor_failures = 0; static time_t time_to_add_entropy = 0; - static time_t time_to_write_hs_statistics = 0; static time_t time_to_write_bridge_status_file = 0; static time_t time_to_downrate_stability = 0; static time_t time_to_save_stability = 0; static time_t time_to_clean_caches = 0; static time_t time_to_recheck_bandwidth = 0; static time_t time_to_check_for_expired_networkstatus = 0; + static time_t time_to_write_stats_files = 0; + static time_t time_to_write_bridge_stats = 0; + static int should_init_bridge_stats = 1; static time_t time_to_retry_dns_init = 0; or_options_t *options = get_options(); int i; @@ -895,14 +932,14 @@ } last_rotated_x509_certificate = now; /* We also make sure to rotate the TLS connections themselves if they've - * been up for too long -- but that's done via or_is_obsolete in + * been up for too long -- but that's done via is_bad_for_new_circs in * connection_run_housekeeping() above. */ } if (time_to_add_entropy < now) { if (time_to_add_entropy) { /* We already seeded once, so don't die on failure. */ - crypto_seed_rng(); + crypto_seed_rng(0); } /** How often do we add more entropy to OpenSSL's RNG pool? */ #define ENTROPY_INTERVAL (60*60) @@ -917,7 +954,7 @@ if (now % 10 == 0 && (authdir_mode_tests_reachability(options)) && !we_are_hibernating()) { /* try to determine reachability of the other Tor relays */ - dirserv_test_reachability(now, 0); + dirserv_test_reachability(now); } /** 1d. Periodically, we discount older stability information so that new @@ -927,7 +964,7 @@ time_to_downrate_stability = rep_hist_downrate_old_runs(now); if (authdir_mode_tests_reachability(options)) { if (time_to_save_stability < now) { - if (time_to_save_stability && rep_hist_record_mtbf_data()<0) { + if (time_to_save_stability && rep_hist_record_mtbf_data(now, 1)<0) { log_warn(LD_GENERAL, "Couldn't store mtbf data."); } #define SAVE_STABILITY_INTERVAL (30*60) @@ -935,7 +972,7 @@ } } - /* 1e. Periodicaly, if we're a v3 authority, we check whether our cert is + /* 1e. Periodically, if we're a v3 authority, we check whether our cert is * close to expiring and warn the admin if it is. */ if (time_to_check_v3_certificate < now) { v3_authority_check_key_expiry(); @@ -947,7 +984,7 @@ */ if (time_to_check_for_expired_networkstatus < now) { networkstatus_t *ns = networkstatus_get_latest_consensus(); - /*XXXX020 this value needs to be the same as REASONABLY_LIVE_TIME in + /*XXXX RD: This value needs to be the same as REASONABLY_LIVE_TIME in * networkstatus_get_reasonably_live_consensus(), but that value is way * way too high. Arma: is the bridge issue there resolved yet? -NM */ #define NS_EXPIRY_SLOP (24*60*60) @@ -959,31 +996,56 @@ time_to_check_for_expired_networkstatus = now + CHECK_EXPIRED_NS_INTERVAL; } - /** 2. Periodically, we consider getting a new directory, getting a - * new running-routers list, and/or force-uploading our descriptor - * (if we've passed our internal checks). */ - if (time_to_fetch_directory < now) { - /* Only caches actually need to fetch v1 directories now. */ - if (directory_fetches_dir_info_early(options) && - !authdir_mode_v1(options) && any_trusted_dir_is_v1_authority() && - !should_delay_dir_fetches(options)) - directory_get_from_dirserver(DIR_PURPOSE_FETCH_DIR, - ROUTER_PURPOSE_GENERAL, NULL, 1); -/** How often do we (as a cache) fetch a new V1 directory? */ -#define V1_DIR_FETCH_PERIOD (12*60*60) - time_to_fetch_directory = now + V1_DIR_FETCH_PERIOD; - } - - /* Caches need to fetch running_routers; directory clients don't. */ - if (time_to_fetch_running_routers < now) { - if (directory_fetches_dir_info_early(options) && - !authdir_mode_v1(options) && any_trusted_dir_is_v1_authority() && - !should_delay_dir_fetches(options)) - directory_get_from_dirserver(DIR_PURPOSE_FETCH_RUNNING_LIST, - ROUTER_PURPOSE_GENERAL, NULL, 1); -/** How often do we (as a cache) fetch a new V1 runningrouters document? */ -#define V1_RUNNINGROUTERS_FETCH_PERIOD (12*60*60) - time_to_fetch_running_routers = now + V1_RUNNINGROUTERS_FETCH_PERIOD; + /* 1g. Check whether we should write statistics to disk. + */ + if (time_to_write_stats_files < now) { +#define CHECK_WRITE_STATS_INTERVAL (60*60) + time_t next_time_to_write_stats_files = (time_to_write_stats_files > 0 ? + time_to_write_stats_files : now) + CHECK_WRITE_STATS_INTERVAL; + if (options->CellStatistics) { + time_t next_write = + rep_hist_buffer_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } + if (options->DirReqStatistics) { + time_t next_write = geoip_dirreq_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } + if (options->EntryStatistics) { + time_t next_write = geoip_entry_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } + if (options->ExitPortStatistics) { + time_t next_write = rep_hist_exit_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } + time_to_write_stats_files = next_time_to_write_stats_files; + } + + /* 1h. Check whether we should write bridge statistics to disk. + */ + if (should_record_bridge_info(options)) { + if (time_to_write_bridge_stats < now) { + if (should_init_bridge_stats) { + /* (Re-)initialize bridge statistics. */ + geoip_bridge_stats_init(now); + time_to_write_bridge_stats = now + WRITE_STATS_INTERVAL; + should_init_bridge_stats = 0; + } else { + /* Possibly write bridge statistics to disk and ask when to write + * them next time. */ + time_to_write_bridge_stats = geoip_bridge_stats_write( + time_to_write_bridge_stats); + } + } + } else if (!should_init_bridge_stats) { + /* Bridge mode was turned off. Ensure that stats are re-initialized + * next time bridge mode is turned on. */ + should_init_bridge_stats = 1; } /* Remove old information from rephist and the rend cache. */ @@ -1003,6 +1065,9 @@ dns_init(); } + /** 2. Periodically, we consider force-uploading our descriptor + * (if we've passed our internal checks). */ + /** How often do we check whether part of our router info has changed in a way * that would require an upload? */ #define CHECK_DESCRIPTOR_INTERVAL (60) @@ -1099,7 +1164,12 @@ if (have_dir_info && !we_are_hibernating()) circuit_build_needed_circs(now); + /* every 10 seconds, but not at the same second as other such events */ + if (now % 10 == 5) + circuit_expire_old_circuits_serverside(now); + /** 5. We do housekeeping for each connection... */ + connection_or_set_bad_connections(); for (i=0;i for equality for hash-table purposes. */ +static INLINE int +_microdesc_eq(microdesc_t *a, microdesc_t *b) +{ + return !memcmp(a->digest, b->digest, DIGEST256_LEN); +} + +HT_PROTOTYPE(microdesc_map, microdesc_t, node, + _microdesc_hash, _microdesc_eq); +HT_GENERATE(microdesc_map, microdesc_t, node, + _microdesc_hash, _microdesc_eq, 0.6, + malloc, realloc, free); + +/** Write the body of md into f, with appropriate annotations. + * On success, return the total number of bytes written, and set + * *annotation_len_out to the number of bytes written as + * annotations. */ +static ssize_t +dump_microdescriptor(FILE *f, microdesc_t *md, size_t *annotation_len_out) +{ + ssize_t r = 0; + size_t written; + /* XXXX drops unkown annotations. */ + if (md->last_listed) { + char buf[ISO_TIME_LEN+1]; + char annotation[ISO_TIME_LEN+32]; + format_iso_time(buf, md->last_listed); + tor_snprintf(annotation, sizeof(annotation), "@last-listed %s\n", buf); + fputs(annotation, f); + r += strlen(annotation); + *annotation_len_out = r; + } else { + *annotation_len_out = 0; + } + + md->off = (off_t) ftell(f); + written = fwrite(md->body, 1, md->bodylen, f); + if (written != md->bodylen) { + log_warn(LD_DIR, + "Couldn't dump microdescriptor (wrote %lu out of %lu): %s", + (unsigned long)written, (unsigned long)md->bodylen, + strerror(ferror(f))); + return -1; + } + r += md->bodylen; + return r; +} + +/** Holds a pointer to the current microdesc_cache_t object, or NULL if no + * such object has been allocated. */ +static microdesc_cache_t *the_microdesc_cache = NULL; + +/** Return a pointer to the microdescriptor cache, loading it if necessary. */ +microdesc_cache_t * +get_microdesc_cache(void) +{ + if (PREDICT_UNLIKELY(the_microdesc_cache==NULL)) { + microdesc_cache_t *cache = tor_malloc_zero(sizeof(microdesc_cache_t)); + HT_INIT(microdesc_map, &cache->map); + cache->cache_fname = get_datadir_fname("cached-microdescs"); + cache->journal_fname = get_datadir_fname("cached-microdescs.new"); + microdesc_cache_reload(cache); + the_microdesc_cache = cache; + } + return the_microdesc_cache; +} + +/* There are three sources of microdescriptors: + 1) Generated by us while acting as a directory authority. + 2) Loaded from the cache on disk. + 3) Downloaded. +*/ + +/** Decode the microdescriptors from the string starting at s and + * ending at eos, and store them in cache. If no-save, + * mark them as non-writable to disk. If where is SAVED_IN_CACHE, + * leave their bodies as pointers to the mmap'd cache. If where is + * SAVED_NOWHERE, do not allow annotations. Return a list of the added + * microdescriptors. */ +smartlist_t * +microdescs_add_to_cache(microdesc_cache_t *cache, + const char *s, const char *eos, saved_location_t where, + int no_save) +{ + /*XXXX need an argument that sets last_listed as appropriate. */ + + smartlist_t *descriptors, *added; + const int allow_annotations = (where != SAVED_NOWHERE); + const int copy_body = (where != SAVED_IN_CACHE); + + descriptors = microdescs_parse_from_string(s, eos, + allow_annotations, + copy_body); + + added = microdescs_add_list_to_cache(cache, descriptors, where, no_save); + smartlist_free(descriptors); + return added; +} + +/* As microdescs_add_to_cache, but takes a list of micrdescriptors instead of + * a string to encode. Frees any members of descriptors that it does + * not add. */ +smartlist_t * +microdescs_add_list_to_cache(microdesc_cache_t *cache, + smartlist_t *descriptors, saved_location_t where, + int no_save) +{ + smartlist_t *added; + open_file_t *open_file = NULL; + FILE *f = NULL; + // int n_added = 0; + ssize_t size = 0; + + if (where == SAVED_NOWHERE && !no_save) { + f = start_writing_to_stdio_file(cache->journal_fname, + OPEN_FLAGS_APPEND|O_BINARY, + 0600, &open_file); + if (!f) { + log_warn(LD_DIR, "Couldn't append to journal in %s: %s", + cache->journal_fname, strerror(errno)); + return NULL; + } + } + + added = smartlist_create(); + SMARTLIST_FOREACH_BEGIN(descriptors, microdesc_t *, md) { + microdesc_t *md2; + md2 = HT_FIND(microdesc_map, &cache->map, md); + if (md2) { + /* We already had this one. */ + if (md2->last_listed < md->last_listed) + md2->last_listed = md->last_listed; + microdesc_free(md); + continue; + } + + /* Okay, it's a new one. */ + if (f) { + size_t annotation_len; + size = dump_microdescriptor(f, md, &annotation_len); + if (size < 0) { + /* XXX handle errors from dump_microdescriptor() */ + /* log? return -1? die? coredump the universe? */ + continue; + } + md->saved_location = SAVED_IN_JOURNAL; + cache->journal_len += size; + } else { + md->saved_location = where; + } + + md->no_save = no_save; + + HT_INSERT(microdesc_map, &cache->map, md); + smartlist_add(added, md); + ++cache->n_seen; + cache->total_len_seen += md->bodylen; + } SMARTLIST_FOREACH_END(md); + + if (f) + finish_writing_to_file(open_file); /*XXX Check me.*/ + + { + size_t old_content_len = + cache->cache_content ? cache->cache_content->size : 0; + if (cache->journal_len > 16384 + old_content_len && + cache->journal_len > old_content_len * 2) { + microdesc_cache_rebuild(cache); + } + } + + return added; +} + +/** Remove every microdescriptor in cache. */ +void +microdesc_cache_clear(microdesc_cache_t *cache) +{ + microdesc_t **entry, **next; + for (entry = HT_START(microdesc_map, &cache->map); entry; entry = next) { + microdesc_t *md = *entry; + next = HT_NEXT_RMV(microdesc_map, &cache->map, entry); + microdesc_free(md); + } + HT_CLEAR(microdesc_map, &cache->map); + if (cache->cache_content) { + tor_munmap_file(cache->cache_content); + cache->cache_content = NULL; + } + cache->total_len_seen = 0; + cache->n_seen = 0; +} + +/** Reload the contents of cache from disk. If it is empty, load it + * for the first time. Return 0 on success, -1 on failure. */ +int +microdesc_cache_reload(microdesc_cache_t *cache) +{ + struct stat st; + char *journal_content; + smartlist_t *added; + tor_mmap_t *mm; + int total = 0; + + microdesc_cache_clear(cache); + + mm = cache->cache_content = tor_mmap_file(cache->cache_fname); + if (mm) { + added = microdescs_add_to_cache(cache, mm->data, mm->data+mm->size, + SAVED_IN_CACHE, 0); + if (added) { + total += smartlist_len(added); + smartlist_free(added); + } + } + + journal_content = read_file_to_str(cache->journal_fname, + RFTS_IGNORE_MISSING, &st); + if (journal_content) { + added = microdescs_add_to_cache(cache, journal_content, + journal_content+st.st_size, + SAVED_IN_JOURNAL, 0); + if (added) { + total += smartlist_len(added); + smartlist_free(added); + } + tor_free(journal_content); + } + log_notice(LD_DIR, "Reloaded microdescriptor cache. Found %d descriptors.", + total); + return 0; +} + +/** Regenerate the main cache file for cache, clear the journal file, + * and update every microdesc_t in the cache with pointers to its new + * location. */ +int +microdesc_cache_rebuild(microdesc_cache_t *cache) +{ + open_file_t *open_file; + FILE *f; + microdesc_t **mdp; + smartlist_t *wrote; + ssize_t size; + off_t off = 0; + int orig_size, new_size; + + log_info(LD_DIR, "Rebuilding the microdescriptor cache..."); + orig_size = (int)(cache->cache_content ? cache->cache_content->size : 0); + orig_size += (int)cache->journal_len; + + f = start_writing_to_stdio_file(cache->cache_fname, + OPEN_FLAGS_REPLACE|O_BINARY, + 0600, &open_file); + if (!f) + return -1; + + wrote = smartlist_create(); + + HT_FOREACH(mdp, microdesc_map, &cache->map) { + microdesc_t *md = *mdp; + size_t annotation_len; + if (md->no_save) + continue; + + size = dump_microdescriptor(f, md, &annotation_len); + if (size < 0) { + /* XXX handle errors from dump_microdescriptor() */ + /* log? return -1? die? coredump the universe? */ + continue; + } + md->off = off + annotation_len; + off += size; + if (md->saved_location != SAVED_IN_CACHE) { + tor_free(md->body); + md->saved_location = SAVED_IN_CACHE; + } + smartlist_add(wrote, md); + } + + finish_writing_to_file(open_file); /*XXX Check me.*/ + + if (cache->cache_content) + tor_munmap_file(cache->cache_content); + cache->cache_content = tor_mmap_file(cache->cache_fname); + + if (!cache->cache_content && smartlist_len(wrote)) { + log_err(LD_DIR, "Couldn't map file that we just wrote to %s!", + cache->cache_fname); + smartlist_free(wrote); + return -1; + } + SMARTLIST_FOREACH_BEGIN(wrote, microdesc_t *, md) { + tor_assert(md->saved_location == SAVED_IN_CACHE); + md->body = (char*)cache->cache_content->data + md->off; + tor_assert(!memcmp(md->body, "onion-key", 9)); + } SMARTLIST_FOREACH_END(md); + + smartlist_free(wrote); + + write_str_to_file(cache->journal_fname, "", 1); + cache->journal_len = 0; + + new_size = (int)cache->cache_content->size; + log_info(LD_DIR, "Done rebuilding microdesc cache. " + "Saved %d bytes; %d still used.", + orig_size-new_size, new_size); + + return 0; +} + +/** Deallocate a single microdescriptor. Note: the microdescriptor MUST have + * previously been removed from the cache if it had ever been inserted. */ +void +microdesc_free(microdesc_t *md) +{ + if (!md) + return; + /* Must be removed from hash table! */ + if (md->onion_pkey) + crypto_free_pk_env(md->onion_pkey); + if (md->body && md->saved_location != SAVED_IN_CACHE) + tor_free(md->body); + + if (md->family) { + SMARTLIST_FOREACH(md->family, char *, cp, tor_free(cp)); + smartlist_free(md->family); + } + tor_free(md->exitsummary); + + tor_free(md); +} + +/** Free all storage held in the microdesc.c module. */ +void +microdesc_free_all(void) +{ + if (the_microdesc_cache) { + microdesc_cache_clear(the_microdesc_cache); + tor_free(the_microdesc_cache->cache_fname); + tor_free(the_microdesc_cache->journal_fname); + tor_free(the_microdesc_cache); + } +} + +/** If there is a microdescriptor in cache whose sha256 digest is + * d, return it. Otherwise return NULL. */ +microdesc_t * +microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, const char *d) +{ + microdesc_t *md, search; + if (!cache) + cache = get_microdesc_cache(); + memcpy(search.digest, d, DIGEST256_LEN); + md = HT_FIND(microdesc_map, &cache->map, &search); + return md; +} + +/** Return the mean size of decriptors added to cache 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); +} + diff -Nru tor-0.2.0.34/src/or/microdesc.h tor-0.2.2.16-alpha/src/or/microdesc.h --- tor-0.2.0.34/src/or/microdesc.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/microdesc.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,37 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file microdesc.h + * \brief Header file for microdesc.c. + **/ + +#ifndef _TOR_MICRODESC_H +#define _TOR_MICRODESC_H + +microdesc_cache_t *get_microdesc_cache(void); + +smartlist_t *microdescs_add_to_cache(microdesc_cache_t *cache, + const char *s, const char *eos, saved_location_t where, + int no_save); +smartlist_t *microdescs_add_list_to_cache(microdesc_cache_t *cache, + smartlist_t *descriptors, saved_location_t where, + int no_save); + +int microdesc_cache_rebuild(microdesc_cache_t *cache); +int microdesc_cache_reload(microdesc_cache_t *cache); +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); + +void microdesc_free(microdesc_t *md); +void microdesc_free_all(void); + +#endif + diff -Nru tor-0.2.0.34/src/or/micro-revision.i tor-0.2.2.16-alpha/src/or/micro-revision.i --- tor-0.2.0.34/src/or/micro-revision.i 2009-02-09 03:15:39.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/micro-revision.i 2010-09-17 06:10:19.000000000 +0000 @@ -1 +1 @@ -"18423" +"61e0079ab25db6c3" diff -Nru tor-0.2.0.34/src/or/networkstatus.c tor-0.2.2.16-alpha/src/or/networkstatus.c --- tor-0.2.0.34/src/or/networkstatus.c 2009-01-20 08:10:49.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/networkstatus.c 2010-09-17 01:30:36.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: networkstatus.c 18187 2009-01-20 08:10:48Z arma $ */ -const char networkstatus_c_id[] = - "$Id: networkstatus.c 18187 2009-01-20 08:10:48Z arma $"; /** * \file networkstatus.c @@ -14,6 +11,20 @@ */ #include "or.h" +#include "circuitbuild.h" +#include "config.h" +#include "connection.h" +#include "connection_or.h" +#include "control.h" +#include "directory.h" +#include "dirserv.h" +#include "dirvote.h" +#include "main.h" +#include "networkstatus.h" +#include "relay.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" /* For tracking v2 networkstatus documents. Only caches do this now. */ @@ -38,10 +49,22 @@ /** A v3 consensus networkstatus that we've received, but which we don't * have enough certificates to be happy about. */ -static networkstatus_t *consensus_waiting_for_certs = NULL; -static char *consensus_waiting_for_certs_body = NULL; -static time_t consensus_waiting_for_certs_set_at = 0; -static int consensus_waiting_for_certs_dl_failed = 0; +typedef struct consensus_waiting_for_certs_t { + /** The consensus itself. */ + networkstatus_t *consensus; + /** The encoded version of the consensus, nul-terminated. */ + char *body; + /** When did we set the current value of consensus_waiting_for_certs? If + * this is too recent, we shouldn't try to fetch a new consensus for a + * little while, to give ourselves time to get certificates for this one. */ + time_t set_at; + /** Set to 1 if we've been holding on to it for so long we should maybe + * treat it as being bad. */ + int dl_failed; +} consensus_waiting_for_certs_t; + +static consensus_waiting_for_certs_t + consensus_waiting_for_certs[N_CONSENSUS_FLAVORS]; /** The last time we tried to download a networkstatus, or 0 for "never". We * use this to rate-limit download attempts for directory caches (including @@ -53,11 +76,8 @@ * before the current consensus becomes invalid. */ static time_t time_to_download_next_consensus = 0; /** Download status for the current consensus networkstatus. */ -static download_status_t consensus_dl_status = { 0, 0, DL_SCHED_CONSENSUS }; +static download_status_t consensus_dl_status[N_CONSENSUS_FLAVORS]; -/** True iff we have logged a warning about this OR not being valid or - * not being named. */ -static int have_warned_about_invalid_status = 0; /** True iff we have logged a warning about this OR's version being older than * listed by the authorities. */ static int have_warned_about_old_version = 0; @@ -79,7 +99,6 @@ rs->name_lookup_warned = 0); } - have_warned_about_invalid_status = 0; have_warned_about_old_version = 0; have_warned_about_new_version = 0; } @@ -90,6 +109,7 @@ void networkstatus_reset_download_failures(void) { + int i; const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list(); SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns, SMARTLIST_FOREACH(ns->entries, routerstatus_t *, rs, @@ -98,7 +118,8 @@ rs->need_to_mirror = 1; }));; - download_status_reset(&consensus_dl_status); + for (i=0; i < N_CONSENSUS_FLAVORS; ++i) + download_status_reset(&consensus_dl_status[i]); if (v2_download_status_map) { digestmap_iter_t *iter; digestmap_t *map = v2_download_status_map; @@ -135,6 +156,7 @@ } else if (!smartlist_len(entries) && maybe_delete) { rmdir(filename); tor_free(filename); + smartlist_free(entries); return 0; } tor_free(filename); @@ -170,7 +192,7 @@ return 0; } -/** Read the cached v3 consensus networkstatus from the disk. */ +/** Read every cached v3 consensus networkstatus from the disk. */ int router_reload_consensus_networkstatus(void) { @@ -179,31 +201,46 @@ struct stat st; or_options_t *options = get_options(); const unsigned int flags = NSSET_FROM_CACHE | NSSET_DONT_DOWNLOAD_CERTS; + int flav; - /* XXXX020 Suppress warnings if cached consensus is bad. */ + /* 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); + if (s) { + if (networkstatus_set_current_consensus(s, flavor, flags) < -1) { + log_warn(LD_FS, "Couldn't load consensus %s networkstatus from \"%s\"", + flavor, filename); + } + tor_free(s); + } + tor_free(filename); - filename = get_datadir_fname("cached-consensus"); - s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); - if (s) { - if (networkstatus_set_current_consensus(s, flags)) { - log_warn(LD_FS, "Couldn't load consensus networkstatus from \"%s\"", - 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); } - tor_free(s); - } - tor_free(filename); - filename = get_datadir_fname("unverified-consensus"); - s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); - if (s) { - if (networkstatus_set_current_consensus(s, + s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); + if (s) { + if (networkstatus_set_current_consensus(s, flavor, flags|NSSET_WAS_WAITING_FOR_CERTS)) { - log_info(LD_FS, "Couldn't load consensus networkstatus from \"%s\"", - filename); + log_info(LD_FS, "Couldn't load consensus %s networkstatus from \"%s\"", + flavor, filename); } - tor_free(s); + tor_free(s); + } + tor_free(filename); } - tor_free(filename); if (!current_consensus || (stat(options->FallbackNetworkstatusFile, &st)==0 && @@ -211,7 +248,7 @@ s = read_file_to_str(options->FallbackNetworkstatusFile, RFTS_IGNORE_MISSING, NULL); if (s) { - if (networkstatus_set_current_consensus(s, + if (networkstatus_set_current_consensus(s, "ns", flags|NSSET_ACCEPT_OBSOLETE)) { log_info(LD_FS, "Couldn't load consensus networkstatus from \"%s\"", options->FallbackNetworkstatusFile); @@ -238,10 +275,30 @@ return 0; } +/** Free all storage held by the vote_routerstatus object rs. */ +static void +vote_routerstatus_free(vote_routerstatus_t *rs) +{ + vote_microdesc_hash_t *h, *next; + if (!rs) + return; + tor_free(rs->version); + tor_free(rs->status.exitsummary); + for (h = rs->microdesc; h; h = next) { + tor_free(h->microdesc_hash_line); + next = h->next; + tor_free(h); + } + tor_free(rs); +} + /** Free all storage held by the routerstatus object rs. */ void routerstatus_free(routerstatus_t *rs) { + if (!rs) + return; + tor_free(rs->exitsummary); tor_free(rs); } @@ -249,6 +306,8 @@ void networkstatus_v2_free(networkstatus_v2_t *ns) { + if (!ns) + return; tor_free(ns->source_address); tor_free(ns->contact); if (ns->signing_key) @@ -263,7 +322,25 @@ tor_free(ns); } -/** Clear all storage held in ns. */ +/** Free all storage held in sig */ +void +document_signature_free(document_signature_t *sig) +{ + tor_free(sig->signature); + tor_free(sig); +} + +/** Return a newly allocated copy of sig */ +document_signature_t * +document_signature_dup(const document_signature_t *sig) +{ + document_signature_t *r = tor_memdup(sig, sizeof(document_signature_t)); + if (r->signature) + r->signature = tor_memdup(sig->signature, sig->signature_len); + return r; +} + +/** Free all storage held in ns. */ void networkstatus_vote_free(networkstatus_t *ns) { @@ -276,40 +353,47 @@ SMARTLIST_FOREACH(ns->known_flags, char *, c, tor_free(c)); smartlist_free(ns->known_flags); } + if (ns->weight_params) { + SMARTLIST_FOREACH(ns->weight_params, char *, c, tor_free(c)); + smartlist_free(ns->weight_params); + } + if (ns->net_params) { + SMARTLIST_FOREACH(ns->net_params, char *, c, tor_free(c)); + smartlist_free(ns->net_params); + } if (ns->supported_methods) { SMARTLIST_FOREACH(ns->supported_methods, char *, c, tor_free(c)); smartlist_free(ns->supported_methods); } if (ns->voters) { - SMARTLIST_FOREACH(ns->voters, networkstatus_voter_info_t *, voter, - { + SMARTLIST_FOREACH_BEGIN(ns->voters, networkstatus_voter_info_t *, voter) { tor_free(voter->nickname); tor_free(voter->address); tor_free(voter->contact); - tor_free(voter->signature); + if (voter->sigs) { + SMARTLIST_FOREACH(voter->sigs, document_signature_t *, sig, + document_signature_free(sig)); + smartlist_free(voter->sigs); + } tor_free(voter); - }); + } SMARTLIST_FOREACH_END(voter); smartlist_free(ns->voters); } - if (ns->cert) - authority_cert_free(ns->cert); + authority_cert_free(ns->cert); if (ns->routerstatus_list) { - if (ns->is_vote) { + if (ns->type == NS_TYPE_VOTE || ns->type == NS_TYPE_OPINION) { SMARTLIST_FOREACH(ns->routerstatus_list, vote_routerstatus_t *, rs, - { - tor_free(rs->version); - tor_free(rs); - }); + vote_routerstatus_free(rs)); } else { SMARTLIST_FOREACH(ns->routerstatus_list, routerstatus_t *, rs, - tor_free(rs)); + routerstatus_free(rs)); } smartlist_free(ns->routerstatus_list); } - if (ns->desc_digest_map) - digestmap_free(ns->desc_digest_map, NULL); + + digestmap_free(ns->desc_digest_map, NULL); memset(ns, 11, sizeof(*ns)); tor_free(ns); @@ -330,34 +414,38 @@ return NULL; } -/** Check whether the signature on voter is correctly signed by - * the signing key of cert. Return -1 if cert doesn't match the +/** Check whether the signature sig is correctly signed with the + * signing key in cert. Return -1 if cert doesn't match the * signing key; otherwise set the good_signature or bad_signature flag on * voter, and return 0. */ -/* (private; exposed for testing.) */ int -networkstatus_check_voter_signature(networkstatus_t *consensus, - networkstatus_voter_info_t *voter, - authority_cert_t *cert) +networkstatus_check_document_signature(const networkstatus_t *consensus, + document_signature_t *sig, + const authority_cert_t *cert) { - char d[DIGEST_LEN]; + char key_digest[DIGEST_LEN]; + const int dlen = sig->alg == DIGEST_SHA1 ? DIGEST_LEN : DIGEST256_LEN; char *signed_digest; size_t signed_digest_len; - if (crypto_pk_get_digest(cert->signing_key, d)<0) + + if (crypto_pk_get_digest(cert->signing_key, key_digest)<0) return -1; - if (memcmp(voter->signing_key_digest, d, DIGEST_LEN)) + if (memcmp(sig->signing_key_digest, key_digest, DIGEST_LEN) || + memcmp(sig->identity_digest, cert->cache_info.identity_digest, + DIGEST_LEN)) return -1; + signed_digest_len = crypto_pk_keysize(cert->signing_key); signed_digest = tor_malloc(signed_digest_len); if (crypto_pk_public_checksig(cert->signing_key, signed_digest, - voter->signature, - voter->signature_len) != DIGEST_LEN || - memcmp(signed_digest, consensus->networkstatus_digest, DIGEST_LEN)) { + sig->signature, + sig->signature_len) < dlen || + memcmp(signed_digest, consensus->digests.d[sig->alg], dlen)) { log_warn(LD_DIR, "Got a bad signature on a networkstatus vote"); - voter->bad_signature = 1; + sig->bad_signature = 1; } else { - voter->good_signature = 1; + sig->good_signature = 1; } tor_free(signed_digest); return 0; @@ -376,7 +464,7 @@ int warn) { int n_good = 0; - int n_missing_key = 0; + int n_missing_key = 0, n_dl_failed_key = 0; int n_bad = 0; int n_unknown = 0; int n_no_signature = 0; @@ -386,40 +474,62 @@ smartlist_t *unrecognized = smartlist_create(); smartlist_t *missing_authorities = smartlist_create(); int severity; + time_t now = time(NULL); - tor_assert(! consensus->is_vote); + tor_assert(consensus->type == NS_TYPE_CONSENSUS); - SMARTLIST_FOREACH(consensus->voters, networkstatus_voter_info_t *, voter, - { - if (!voter->good_signature && !voter->bad_signature && voter->signature) { - /* we can try to check the signature. */ - int is_v3_auth = trusteddirserver_get_by_v3_auth_digest( - voter->identity_digest) != NULL; - authority_cert_t *cert = - authority_cert_get_by_digests(voter->identity_digest, - voter->signing_key_digest); - if (!is_v3_auth) { - smartlist_add(unrecognized, voter); - ++n_unknown; - continue; - } else if (!cert) { - smartlist_add(need_certs_from, voter); - ++n_missing_key; - continue; - } - if (networkstatus_check_voter_signature(consensus, voter, cert) < 0) { - smartlist_add(need_certs_from, voter); - ++n_missing_key; - continue; + SMARTLIST_FOREACH_BEGIN(consensus->voters, networkstatus_voter_info_t *, + voter) { + int good_here = 0; + int bad_here = 0; + int missing_key_here = 0, dl_failed_key_here = 0; + SMARTLIST_FOREACH_BEGIN(voter->sigs, document_signature_t *, sig) { + if (!sig->good_signature && !sig->bad_signature && + sig->signature) { + /* we can try to check the signature. */ + int is_v3_auth = trusteddirserver_get_by_v3_auth_digest( + sig->identity_digest) != NULL; + authority_cert_t *cert = + authority_cert_get_by_digests(sig->identity_digest, + sig->signing_key_digest); + tor_assert(!memcmp(sig->identity_digest, voter->identity_digest, + DIGEST_LEN)); + + if (!is_v3_auth) { + smartlist_add(unrecognized, voter); + ++n_unknown; + continue; + } else if (!cert || cert->expires < now) { + smartlist_add(need_certs_from, voter); + ++missing_key_here; + if (authority_cert_dl_looks_uncertain(sig->identity_digest)) + ++dl_failed_key_here; + continue; + } + if (networkstatus_check_document_signature(consensus, sig, cert) < 0) { + smartlist_add(need_certs_from, voter); + ++missing_key_here; + if (authority_cert_dl_looks_uncertain(sig->identity_digest)) + ++dl_failed_key_here; + continue; + } } - } - if (voter->good_signature) + if (sig->good_signature) + ++good_here; + else if (sig->bad_signature) + ++bad_here; + } SMARTLIST_FOREACH_END(sig); + if (good_here) ++n_good; - else if (voter->bad_signature) + else if (bad_here) ++n_bad; - else + else if (missing_key_here) { + ++n_missing_key; + if (dl_failed_key_here) + ++n_dl_failed_key; + } else ++n_no_signature; - }); + } SMARTLIST_FOREACH_END(voter); /* Now see whether we're missing any voters entirely. */ SMARTLIST_FOREACH(router_get_trusted_dir_servers(), @@ -430,39 +540,71 @@ smartlist_add(missing_authorities, ds); }); - if (warn > 1 || (warn >= 0 && n_good < n_required)) + if (warn > 1 || (warn >= 0 && + (n_good + n_missing_key - n_dl_failed_key < n_required))) { severity = LOG_WARN; - else + } else { severity = LOG_INFO; + } if (warn >= 0) { SMARTLIST_FOREACH(unrecognized, networkstatus_voter_info_t *, voter, { - log_info(LD_DIR, "Consensus includes unrecognized authority '%s' " - "at %s:%d (contact %s; identity %s)", + log(severity, LD_DIR, "Consensus includes unrecognized authority " + "'%s' at %s:%d (contact %s; identity %s)", voter->nickname, voter->address, (int)voter->dir_port, voter->contact?voter->contact:"n/a", hex_str(voter->identity_digest, DIGEST_LEN)); }); SMARTLIST_FOREACH(need_certs_from, networkstatus_voter_info_t *, voter, { - log_info(LD_DIR, "Looks like we need to download a new certificate " - "from authority '%s' at %s:%d (contact %s; identity %s)", + log(severity, LD_DIR, "Looks like we need to download a new " + "certificate from authority '%s' at %s:%d (contact %s; " + "identity %s)", voter->nickname, voter->address, (int)voter->dir_port, voter->contact?voter->contact:"n/a", hex_str(voter->identity_digest, DIGEST_LEN)); }); SMARTLIST_FOREACH(missing_authorities, trusted_dir_server_t *, ds, { - log_info(LD_DIR, "Consensus does not include configured " + log(severity, LD_DIR, "Consensus does not include configured " "authority '%s' at %s:%d (identity %s)", ds->nickname, ds->address, (int)ds->dir_port, hex_str(ds->v3_identity_digest, DIGEST_LEN)); }); - log(severity, LD_DIR, - "%d unknown, %d missing key, %d good, %d bad, %d no signature, " - "%d required", n_unknown, n_missing_key, n_good, n_bad, - n_no_signature, n_required); + { + smartlist_t *sl = smartlist_create(); + char *cp; + tor_asprintf(&cp, "A consensus needs %d good signatures from recognized " + "authorities for us to accept it. This one has %d.", + n_required, n_good); + smartlist_add(sl,cp); + if (n_no_signature) { + tor_asprintf(&cp, "%d of the authorities we know didn't sign it.", + n_no_signature); + smartlist_add(sl,cp); + } + if (n_unknown) { + tor_asprintf(&cp, "It has %d signatures from authorities we don't " + "recognize.", n_unknown); + smartlist_add(sl,cp); + } + if (n_bad) { + tor_asprintf(&cp, "%d of the signatures on it didn't verify " + "correctly.", n_bad); + smartlist_add(sl,cp); + } + if (n_missing_key) { + tor_asprintf(&cp, "We were unable to check %d of the signatures, " + "because we were missing the keys.", n_missing_key); + smartlist_add(sl,cp); + } + cp = smartlist_join_strings(sl, " ", 0, NULL); + log(severity, LD_DIR, "%s", cp); + tor_free(cp); + SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); + smartlist_free(sl); + } } smartlist_free(unrecognized); @@ -508,7 +650,7 @@ * appropriate. */ static int add_networkstatus_to_cache(const char *s, - networkstatus_source_t source, + v2_networkstatus_source_t source, networkstatus_v2_t *ns) { if (source != NS_FROM_CACHE) { @@ -553,7 +695,8 @@ */ int router_set_networkstatus_v2(const char *s, time_t arrived_at, - networkstatus_source_t source, smartlist_t *requested_fingerprints) + v2_networkstatus_source_t source, + smartlist_t *requested_fingerprints) { networkstatus_v2_t *ns; int i, found; @@ -699,11 +842,24 @@ if (!found) smartlist_add(networkstatus_v2_list, ns); - SMARTLIST_FOREACH(ns->entries, routerstatus_t *, rs, +/** Retain any routerinfo mentioned in a V2 networkstatus for at least this + * long. */ +#define V2_NETWORKSTATUS_ROUTER_LIFETIME (3*60*60) + + { + time_t live_until = ns->published_on + V2_NETWORKSTATUS_ROUTER_LIFETIME; + SMARTLIST_FOREACH(ns->entries, routerstatus_t *, rs, { - if (!router_get_by_descriptor_digest(rs->descriptor_digest)) + signed_descriptor_t *sd = + router_get_by_descriptor_digest(rs->descriptor_digest); + if (sd) { + if (sd->last_listed_as_valid_until < live_until) + sd->last_listed_as_valid_until = live_until; + } else { rs->need_to_mirror = 1; + } }); + } log_info(LD_DIR, "Setting networkstatus %s %s (published %s)", source == NS_FROM_CACHE?"cached from": @@ -711,7 +867,6 @@ "downloaded from":"generated for"), trusted_dir->description, published); networkstatus_v2_list_has_changed = 1; - router_dir_info_changed(); smartlist_sort(networkstatus_v2_list, _compare_networkstatus_v2_published_on); @@ -749,7 +904,6 @@ dirserv_set_cached_networkstatus_v2(NULL, ns->identity_digest, 0); } networkstatus_v2_free(ns); - router_dir_info_changed(); } /* And now go through the directory cache for any cached untrusted @@ -760,8 +914,8 @@ /** Helper for bsearching a list of routerstatus_t pointers: compare a * digest in the key to the identity digest of a routerstatus_t. */ -static int -_compare_digest_to_routerstatus_entry(const void *_key, const void **_member) +int +compare_digest_to_routerstatus_entry(const void *_key, const void **_member) { const char *key = _key; const routerstatus_t *rs = *_member; @@ -774,7 +928,7 @@ networkstatus_v2_find_entry(networkstatus_v2_t *ns, const char *digest) { return smartlist_bsearch(ns->entries, digest, - _compare_digest_to_routerstatus_entry); + compare_digest_to_routerstatus_entry); } /** Return the entry in ns for the identity digest digest, or @@ -783,7 +937,7 @@ networkstatus_vote_find_entry(networkstatus_t *ns, const char *digest) { return smartlist_bsearch(ns->routerstatus_list, digest, - _compare_digest_to_routerstatus_entry); + compare_digest_to_routerstatus_entry); } /*XXXX make this static once functions are moved into this file. */ @@ -795,7 +949,7 @@ const char *digest, int *found_out) { return smartlist_bsearch_idx(ns->routerstatus_list, digest, - _compare_digest_to_routerstatus_entry, + compare_digest_to_routerstatus_entry, found_out); } @@ -848,7 +1002,7 @@ if (!current_consensus) return NULL; return smartlist_bsearch(current_consensus->routerstatus_list, digest, - _compare_digest_to_routerstatus_entry); + compare_digest_to_routerstatus_entry); } /** Given a nickname (possibly verbose, possibly a hexadecimal digest), return @@ -893,7 +1047,7 @@ /* This name is not canonical for any server; go through the list and * see who it matches. */ - /*XXXX021 This is inefficient. */ + /*XXXX This is inefficient; optimize it if it matters. */ matches = smartlist_create(); SMARTLIST_FOREACH(current_consensus->routerstatus_list, routerstatus_t *, lrs, @@ -927,7 +1081,7 @@ }); if (any_unwarned) { log_warn(LD_CONFIG,"There are multiple matches for the nickname \"%s\"," - " but none is listed as named by the directory authorites. " + " but none is listed as named by the directory authorities. " "Choosing one arbitrarily.", nickname); } } else if (warn_if_unnamed && best && !best->name_lookup_warned) { @@ -996,17 +1150,20 @@ if (authority) { /* An authority launches a separate connection for everybody. */ - SMARTLIST_FOREACH(trusted_dir_servers, trusted_dir_server_t *, ds, - { + SMARTLIST_FOREACH_BEGIN(trusted_dir_servers, trusted_dir_server_t *, ds) + { char resource[HEX_DIGEST_LEN+6]; /* fp/hexdigit.z\0 */ + tor_addr_t addr; if (!(ds->type & V2_AUTHORITY)) continue; if (router_digest_is_me(ds->digest)) continue; + tor_addr_from_ipv4h(&addr, ds->addr); + /* Is this quite sensible with IPv6 or multiple addresses? */ if (connection_get_by_type_addr_port_purpose( - CONN_TYPE_DIR, ds->addr, ds->dir_port, - DIR_PURPOSE_FETCH_NETWORKSTATUS)) { - /* XXX020 the above dir_port won't be accurate if we're + CONN_TYPE_DIR, &addr, ds->dir_port, + DIR_PURPOSE_FETCH_V2_NETWORKSTATUS)) { + /* XXX the above dir_port won't be accurate if we're * doing a tunneled conn. In that case it should be or_port. * How to guess from here? Maybe make the function less general * and have it know that it's looking for dir conns. -RD */ @@ -1019,20 +1176,22 @@ base16_encode(resource+3, sizeof(resource)-3, ds->digest, DIGEST_LEN); strlcat(resource, ".z", sizeof(resource)); directory_initiate_command_routerstatus( - &ds->fake_status, DIR_PURPOSE_FETCH_NETWORKSTATUS, + &ds->fake_status, DIR_PURPOSE_FETCH_V2_NETWORKSTATUS, ROUTER_PURPOSE_GENERAL, 0, /* Not private */ resource, NULL, 0 /* No payload. */, 0 /* No I-M-S. */); - }); + } + SMARTLIST_FOREACH_END(ds); } else { /* A non-authority cache launches one connection to a random authority. */ /* (Check whether we're currently fetching network-status objects.) */ if (!connection_get_by_type_purpose(CONN_TYPE_DIR, - DIR_PURPOSE_FETCH_NETWORKSTATUS)) - directory_get_from_dirserver(DIR_PURPOSE_FETCH_NETWORKSTATUS, - ROUTER_PURPOSE_GENERAL, "all.z",1); + DIR_PURPOSE_FETCH_V2_NETWORKSTATUS)) + directory_get_from_dirserver(DIR_PURPOSE_FETCH_V2_NETWORKSTATUS, + ROUTER_PURPOSE_GENERAL, "all.z", + PDS_RETRY_IF_NO_SERVERS); } } @@ -1047,35 +1206,38 @@ static void update_consensus_networkstatus_downloads(time_t now) { - or_options_t *options = get_options(); + int i; if (!networkstatus_get_live_consensus(now)) time_to_download_next_consensus = now; /* No live consensus? Get one now!*/ if (time_to_download_next_consensus > now) return; /* Wait until the current consensus is older. */ - if (authdir_mode_v3(options)) - return; /* Authorities never fetch a consensus */ - if (!download_status_is_ready(&consensus_dl_status, now, + /* XXXXNM Microdescs: may need to download more types. */ + if (!download_status_is_ready(&consensus_dl_status[FLAV_NS], now, CONSENSUS_NETWORKSTATUS_MAX_DL_TRIES)) return; /* We failed downloading a consensus too recently. */ if (connection_get_by_type_purpose(CONN_TYPE_DIR, DIR_PURPOSE_FETCH_CONSENSUS)) return; /* There's an in-progress download.*/ - if (consensus_waiting_for_certs) { - /* XXXX020 make sure this doesn't delay sane downloads. */ - if (consensus_waiting_for_certs_set_at + DELAY_WHILE_FETCHING_CERTS > now) - return; /* We're still getting certs for this one. */ - else { - if (!consensus_waiting_for_certs_dl_failed) { - download_status_failed(&consensus_dl_status, 0); - consensus_waiting_for_certs_dl_failed=1; + for (i=0; i < N_CONSENSUS_FLAVORS; ++i) { + consensus_waiting_for_certs_t *waiting = &consensus_waiting_for_certs[i]; + if (waiting->consensus) { + /* XXXX make sure this doesn't delay sane downloads. */ + if (waiting->set_at + DELAY_WHILE_FETCHING_CERTS > now) + return; /* We're still getting certs for this one. */ + else { + if (!waiting->dl_failed) { + download_status_failed(&consensus_dl_status[FLAV_NS], 0); + waiting->dl_failed=1; + } } } } log_info(LD_DIR, "Launching networkstatus consensus download."); directory_get_from_dirserver(DIR_PURPOSE_FETCH_CONSENSUS, - ROUTER_PURPOSE_GENERAL, NULL, 1); + ROUTER_PURPOSE_GENERAL, NULL, + PDS_RETRY_IF_NO_SERVERS); } /** Called when an attempt to download a consensus fails: note that the @@ -1083,7 +1245,8 @@ void networkstatus_consensus_download_failed(int status_code) { - download_status_failed(&consensus_dl_status, status_code); + /* XXXXNM Microdescs: may need to handle more types. */ + download_status_failed(&consensus_dl_status[FLAV_NS], status_code); /* Retry immediately, if appropriate. */ update_consensus_networkstatus_downloads(time(NULL)); } @@ -1102,13 +1265,30 @@ if (c) { long dl_interval; long interval = c->fresh_until - c->valid_after; + long min_sec_before_caching = CONSENSUS_MIN_SECONDS_BEFORE_CACHING; time_t start; + + if (min_sec_before_caching > interval/16) { + /* Usually we allow 2-minutes slop factor in case clocks get + desynchronized a little. If we're on a private network with + a crazy-fast voting interval, though, 2 minutes may be too + much. */ + min_sec_before_caching = interval/16; + } + if (directory_fetches_dir_info_early(options)) { /* We want to cache the next one at some point after this one * is no longer fresh... */ - start = c->fresh_until + CONSENSUS_MIN_SECONDS_BEFORE_CACHING; - /* But only in the first half-interval after that. */ - dl_interval = interval/2; + start = c->fresh_until + min_sec_before_caching; + /* Some clients may need the consensus sooner than others. */ + if (options->FetchDirInfoExtraEarly || authdir_mode_v3(options)) { + dl_interval = 60; + if (min_sec_before_caching + dl_interval > interval) + dl_interval = interval/2; + } else { + /* But only in the first half-interval after that. */ + dl_interval = interval/2; + } } else { /* We're an ordinary client or a bridge. Give all the caches enough * time to download the consensus. */ @@ -1120,15 +1300,14 @@ * to choose the rest of the interval *after* them. */ if (directory_fetches_dir_info_later(options)) { /* Give all the *clients* enough time to download the consensus. */ - start = start + dl_interval + CONSENSUS_MIN_SECONDS_BEFORE_CACHING; + start = start + dl_interval + min_sec_before_caching; /* But try to get it before ours actually expires. */ - dl_interval = (c->valid_until - start) - - CONSENSUS_MIN_SECONDS_BEFORE_CACHING; + dl_interval = (c->valid_until - start) - min_sec_before_caching; } } if (dl_interval < 1) dl_interval = 1; - /* We must not try to replace c while it's still the most valid: */ + /* We must not try to replace c while it's still fresh: */ tor_assert(c->fresh_until < start); /* We must download the next one before c is invalid: */ tor_assert(start+dl_interval < c->valid_until); @@ -1149,7 +1328,6 @@ time_to_download_next_consensus = now; log_info(LD_DIR, "No live consensus; we should fetch one immediately."); } - } /** Return 1 if there's a reason we shouldn't try any directory @@ -1184,10 +1362,23 @@ void update_certificate_downloads(time_t now) { - if (consensus_waiting_for_certs) - authority_certs_fetch_missing(consensus_waiting_for_certs, now); - else - authority_certs_fetch_missing(current_consensus, now); + int i; + for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { + if (consensus_waiting_for_certs[i].consensus) + authority_certs_fetch_missing(consensus_waiting_for_certs[i].consensus, + now); + } + + authority_certs_fetch_missing(current_consensus, now); +} + +/** Return 1 if we have a consensus but we don't have enough certificates + * to start using it yet. */ +int +consensus_is_waiting_for_certs(void) +{ + return consensus_waiting_for_certs[USABLE_CONSENSUS_FLAVOR].consensus + ? 1 : 0; } /** Return the network status with a given identity digest. */ @@ -1223,7 +1414,7 @@ return NULL; } -/* XXXX020 remove this in favor of get_live_consensus. But actually, +/* XXXX remove this in favor of get_live_consensus. But actually, * leave something like it for bridge users, who need to not totally * lose if they spend a while fetching a new consensus. */ /** As networkstatus_get_live_consensus(), but is way more tolerant of expired @@ -1269,6 +1460,8 @@ a->version_supports_begindir != b->version_supports_begindir || a->version_supports_extrainfo_upload != b->version_supports_extrainfo_upload || + a->version_supports_conditional_consensus != + b->version_supports_conditional_consensus || a->version_supports_v3_dir != b->version_supports_v3_dir; } @@ -1278,34 +1471,31 @@ notify_control_networkstatus_changed(const networkstatus_t *old_c, const networkstatus_t *new_c) { - int idx = 0; - int old_remain = old_c && smartlist_len(old_c->routerstatus_list); - const routerstatus_t *rs_old = NULL; smartlist_t *changed; if (old_c == new_c) return; + + /* tell the controller exactly which relays are still listed, as well + * as what they're listed as */ + control_event_newconsensus(new_c); + + if (!control_event_is_interesting(EVENT_NS)) + return; + + if (!old_c) { + control_event_networkstatus_changed(new_c->routerstatus_list); + return; + } changed = smartlist_create(); - if (old_remain) - rs_old = smartlist_get(old_c->routerstatus_list, idx); - SMARTLIST_FOREACH(new_c->routerstatus_list, routerstatus_t *, rs_new, - { - if (!old_remain) { + SMARTLIST_FOREACH_JOIN(old_c->routerstatus_list, routerstatus_t *, rs_old, + new_c->routerstatus_list, routerstatus_t *, rs_new, + memcmp(rs_old->identity_digest, + rs_new->identity_digest, DIGEST_LEN), + smartlist_add(changed, rs_new)) { + if (routerstatus_has_changed(rs_old, rs_new)) smartlist_add(changed, rs_new); - } else { - int r; - while ((r = memcmp(rs_old->identity_digest, rs_new->identity_digest, - DIGEST_LEN)) < 0) { - if (++idx == smartlist_len(old_c->routerstatus_list)) { - old_remain = 0; - break; - } - rs_old = smartlist_get(old_c->routerstatus_list, idx); - } - if (r || (!r && routerstatus_has_changed(rs_old, rs_new))) - smartlist_add(changed, rs_new); - } - }); + } SMARTLIST_FOREACH_JOIN_END(rs_old, rs_new); control_event_networkstatus_changed(changed); smartlist_free(changed); @@ -1317,27 +1507,16 @@ networkstatus_copy_old_consensus_info(networkstatus_t *new_c, const networkstatus_t *old_c) { - int idx = 0; - const routerstatus_t *rs_old; if (old_c == new_c) return; - if (!smartlist_len(old_c->routerstatus_list)) + if (!old_c || !smartlist_len(old_c->routerstatus_list)) return; - rs_old = smartlist_get(old_c->routerstatus_list, idx); - SMARTLIST_FOREACH(new_c->routerstatus_list, routerstatus_t *, rs_new, - { - int r; - while ((r = memcmp(rs_old->identity_digest, rs_new->identity_digest, - DIGEST_LEN))<0) { - if (++idx == smartlist_len(old_c->routerstatus_list)) - goto done; - rs_old = smartlist_get(old_c->routerstatus_list, idx); - } - if (r>0) - continue; - tor_assert(r==0); - + SMARTLIST_FOREACH_JOIN(old_c->routerstatus_list, routerstatus_t *, rs_old, + new_c->routerstatus_list, routerstatus_t *, rs_new, + memcmp(rs_old->identity_digest, + rs_new->identity_digest, DIGEST_LEN), + STMT_NIL) { /* Okay, so we're looking at the same identity. */ rs_new->name_lookup_warned = rs_old->name_lookup_warned; rs_new->last_dir_503_at = rs_old->last_dir_503_at; @@ -1347,16 +1526,20 @@ /* And the same descriptor too! */ memcpy(&rs_new->dl_status, &rs_old->dl_status,sizeof(download_status_t)); } - }); - - done: - return; + } SMARTLIST_FOREACH_JOIN_END(rs_old, rs_new); } /** Try to replace the current cached v3 networkstatus with the one in * consensus. If we don't have enough certificates to validate it, * store it in consensus_waiting_for_certs and launch a certificate fetch. * + * If flags & NSSET_FROM_CACHE, this networkstatus has come from the disk + * cache. If flags & NSSET_WAS_WAITING_FOR_CERTS, this networkstatus was + * already received, but we were waiting for certificates on it. If flags & + * NSSET_DONT_DOWNLOAD_CERTS, do not launch certificate downloads as needed. + * If flags & NSSET_ACCEPT_OBSOLETE, then we should be willing to take this + * consensus, even if it comes from many days in the past. + * * Return 0 on success, <0 on failure. On failure, caller should increment * the failure count as appropriate. * @@ -1364,52 +1547,102 @@ * user, and -2 for more serious problems. */ int -networkstatus_set_current_consensus(const char *consensus, unsigned flags) +networkstatus_set_current_consensus(const char *consensus, + const char *flavor, + unsigned flags) { - networkstatus_t *c; + networkstatus_t *c=NULL; int r, result = -1; time_t now = time(NULL); + or_options_t *options = get_options(); char *unverified_fname = NULL, *consensus_fname = NULL; + int flav = networkstatus_parse_flavor_name(flavor); const unsigned from_cache = flags & NSSET_FROM_CACHE; const unsigned was_waiting_for_certs = flags & NSSET_WAS_WAITING_FOR_CERTS; const unsigned dl_certs = !(flags & NSSET_DONT_DOWNLOAD_CERTS); const unsigned accept_obsolete = flags & NSSET_ACCEPT_OBSOLETE; + const unsigned require_flavor = flags & NSSET_REQUIRE_FLAVOR; + const digests_t *current_digests = NULL; + consensus_waiting_for_certs_t *waiting = NULL; + time_t current_valid_after = 0; + + if (flav < 0) { + /* XXXX we don't handle unrecognized flavors yet. */ + log_warn(LD_BUG, "Unrecognized consensus flavor %s", flavor); + return -2; + } /* Make sure it's parseable. */ - c = networkstatus_parse_vote_from_string(consensus, NULL, 0); + c = networkstatus_parse_vote_from_string(consensus, NULL, NS_TYPE_CONSENSUS); if (!c) { log_warn(LD_DIR, "Unable to parse networkstatus consensus"); result = -2; goto done; } + if ((int)c->flavor != flav) { + /* This wasn't the flavor we thought we were getting. */ + if (require_flavor) { + log_warn(LD_DIR, "Got consensus with unexpected flavor %s (wanted %s)", + networkstatus_get_flavor_name(c->flavor), flavor); + goto done; + } + flav = c->flavor; + flavor = networkstatus_get_flavor_name(flav); + } + + if (flav != USABLE_CONSENSUS_FLAVOR && + !directory_caches_dir_info(options)) { + /* This consensus is totally boring to us: we won't use it, and we won't + * serve it. Drop it. */ + goto done; + } + if (from_cache && !accept_obsolete && c->valid_until < now-OLD_ROUTER_DESC_MAX_AGE) { /* XXX022 when we try to make fallbackconsensus work again, we should * consider taking this out. Until then, believing obsolete consensuses * is causing more harm than good. See also bug 887. */ - log_info(LD_DIR, "Loaded an obsolete consensus. Discarding."); + log_info(LD_DIR, "Loaded an expired consensus. Discarding."); goto done; } - if (current_consensus && - !memcmp(c->networkstatus_digest, current_consensus->networkstatus_digest, - DIGEST_LEN)) { + if (!strcmp(flavor, "ns")) { + consensus_fname = get_datadir_fname("cached-consensus"); + unverified_fname = get_datadir_fname("unverified-consensus"); + if (current_consensus) { + current_digests = ¤t_consensus->digests; + current_valid_after = current_consensus->valid_after; + } + } else { + cached_dir_t *cur; + char buf[128]; + tor_snprintf(buf, sizeof(buf), "cached-%s-consensus", flavor); + consensus_fname = get_datadir_fname(buf); + tor_snprintf(buf, sizeof(buf), "unverified-%s-consensus", flavor); + unverified_fname = get_datadir_fname(buf); + cur = dirserv_get_consensus(flavor); + if (cur) { + current_digests = &cur->digests; + current_valid_after = cur->published; + } + } + + if (current_digests && + !memcmp(&c->digests, current_digests, sizeof(c->digests))) { /* We already have this one. That's a failure. */ - log_info(LD_DIR, "Got a consensus we already have"); + log_info(LD_DIR, "Got a %s consensus we already have", flavor); goto done; } - if (current_consensus && c->valid_after <= current_consensus->valid_after) { + if (current_valid_after && c->valid_after <= current_valid_after) { /* We have a newer one. There's no point in accepting this one, * even if it's great. */ - log_info(LD_DIR, "Got a consensus at least as old as the one we have"); + log_info(LD_DIR, "Got a %s consensus at least as old as the one we have", + flavor); goto done; } - consensus_fname = get_datadir_fname("cached-consensus"); - unverified_fname = get_datadir_fname("unverified-consensus"); - /* Make sure it's signed enough. */ if ((r=networkstatus_check_consensus_signature(c, 1))<0) { if (r == -1) { @@ -1418,16 +1651,16 @@ log_info(LD_DIR, "Not enough certificates to check networkstatus consensus"); } - if (!current_consensus || - c->valid_after > current_consensus->valid_after) { - if (consensus_waiting_for_certs) - networkstatus_vote_free(consensus_waiting_for_certs); - tor_free(consensus_waiting_for_certs_body); - consensus_waiting_for_certs = c; + if (!current_valid_after || + c->valid_after > current_valid_after) { + waiting = &consensus_waiting_for_certs[flav]; + networkstatus_vote_free(waiting->consensus); + tor_free(waiting->body); + waiting->consensus = c; c = NULL; /* Prevent free. */ - consensus_waiting_for_certs_body = tor_strdup(consensus); - consensus_waiting_for_certs_set_at = now; - consensus_waiting_for_certs_dl_failed = 0; + waiting->body = tor_strdup(consensus); + waiting->set_at = now; + waiting->dl_failed = 0; if (!from_cache) { write_str_to_file(unverified_fname, consensus, 0); } @@ -1456,54 +1689,71 @@ } } + if (!from_cache && flav == USABLE_CONSENSUS_FLAVOR) + control_event_client_status(LOG_NOTICE, "CONSENSUS_ARRIVED"); + /* Are we missing any certificates at all? */ if (r != 1 && dl_certs) authority_certs_fetch_missing(c, now); - if (control_event_is_interesting(EVENT_NS)) + if (flav == USABLE_CONSENSUS_FLAVOR) { notify_control_networkstatus_changed(current_consensus, c); - if (current_consensus) { - networkstatus_copy_old_consensus_info(c, current_consensus); - networkstatus_vote_free(current_consensus); + if (current_consensus) { + networkstatus_copy_old_consensus_info(c, current_consensus); + networkstatus_vote_free(current_consensus); + } } - if (consensus_waiting_for_certs && - consensus_waiting_for_certs->valid_after <= c->valid_after) { - networkstatus_vote_free(consensus_waiting_for_certs); - consensus_waiting_for_certs = NULL; - if (consensus != consensus_waiting_for_certs_body) - tor_free(consensus_waiting_for_certs_body); + waiting = &consensus_waiting_for_certs[flav]; + if (waiting->consensus && + waiting->consensus->valid_after <= c->valid_after) { + networkstatus_vote_free(waiting->consensus); + waiting->consensus = NULL; + if (consensus != waiting->body) + tor_free(waiting->body); else - consensus_waiting_for_certs_body = NULL; - consensus_waiting_for_certs_set_at = 0; - consensus_waiting_for_certs_dl_failed = 0; + waiting->body = NULL; + waiting->set_at = 0; + waiting->dl_failed = 0; unlink(unverified_fname); } /* Reset the failure count only if this consensus is actually valid. */ if (c->valid_after <= now && now <= c->valid_until) { - download_status_reset(&consensus_dl_status); + download_status_reset(&consensus_dl_status[flav]); } else { if (!from_cache) - download_status_failed(&consensus_dl_status, 0); + download_status_failed(&consensus_dl_status[flav], 0); } - current_consensus = c; - c = NULL; /* Prevent free. */ + if (directory_caches_dir_info(options)) { + dirserv_set_cached_consensus_networkstatus(consensus, + flavor, + &c->digests, + c->valid_after); + } - update_consensus_networkstatus_fetch_time(now); - dirvote_recalculate_timing(get_options(), now); - routerstatus_list_update_named_server_map(); + if (flav == USABLE_CONSENSUS_FLAVOR) { + current_consensus = c; + c = NULL; /* Prevent free. */ + + /* XXXXNM Microdescs: needs a non-ns variant. */ + update_consensus_networkstatus_fetch_time(now); + dirvote_recalculate_timing(options, now); + routerstatus_list_update_named_server_map(); + cell_ewma_set_scale_factor(options, current_consensus); + + /* XXX022 where is the right place to put this call? */ + connection_or_update_token_buckets(get_connection_array(), options); + + circuit_build_times_new_consensus_params(&circ_times, current_consensus); + } if (!from_cache) { write_str_to_file(consensus_fname, consensus, 0); } - if (directory_caches_dir_info(get_options())) - dirserv_set_cached_networkstatus_v3(consensus, - current_consensus->valid_after); - if (ftime_definitely_before(now, current_consensus->valid_after)) { char tbuf[ISO_TIME_LEN+1]; char dbuf[64]; @@ -1522,8 +1772,7 @@ result = 0; done: - if (c) - networkstatus_vote_free(c); + networkstatus_vote_free(c); tor_free(consensus_fname); tor_free(unverified_fname); return result; @@ -1534,13 +1783,17 @@ void networkstatus_note_certs_arrived(void) { - if (consensus_waiting_for_certs) { - if (networkstatus_check_consensus_signature( - consensus_waiting_for_certs, 0)>=0) { + int i; + for (i=0; iconsensus) + continue; + if (networkstatus_check_consensus_signature(waiting->consensus, 0)>=0) { if (!networkstatus_set_current_consensus( - consensus_waiting_for_certs_body, + waiting->body, + networkstatus_get_flavor_name(i), NSSET_WAS_WAITING_FOR_CERTS)) { - tor_free(consensus_waiting_for_certs_body); + tor_free(waiting->body); } } } @@ -1554,10 +1807,8 @@ void routers_update_all_from_networkstatus(time_t now, int dir_version) { - routerinfo_t *me; routerlist_t *rl = router_get_routerlist(); networkstatus_t *consensus = networkstatus_get_live_consensus(now); - or_options_t *options = get_options(); if (networkstatus_v2_list_has_changed) download_status_map_update_from_v2_networkstatus(); @@ -1565,39 +1816,16 @@ if (!consensus || dir_version < 3) /* nothing more we should do */ return; - /* More routers may be up or down now: we need to recalc whether there's - * enough directory info. */ - router_dir_info_changed(); - + /* calls router_dir_info_changed() when it's done -- more routers + * might be up or down now, which might affect whether there's enough + * directory info. */ routers_update_status_from_consensus_networkstatus(rl->routers, 0); + SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, ri->cache_info.routerlist_index = ri_sl_idx); if (rl->old_routers) signed_descs_update_status_from_consensus_networkstatus(rl->old_routers); - /* XXX020 these warnings don't help anymore; we should disable them -RD */ - me = router_get_my_routerinfo(); - if (me && !have_warned_about_invalid_status) { - routerstatus_t *rs = networkstatus_vote_find_entry(consensus, - me->cache_info.identity_digest); - - if (!rs) { - log_info(LD_GENERAL, "The latest consensus does not list us." - "Are you misconfigured?"); - have_warned_about_invalid_status = 1; - } else if (rs->is_unnamed) { - /* Maybe upgrade this to notice? XXXX020 */ - log_info(LD_GENERAL, "The directory have assigned the nickname " - "you're using (%s) to a different identity; you may want to " - "choose a different nickname.", options->Nickname); - have_warned_about_invalid_status = 1; - } else if (!rs->is_named) { - log_debug(LD_GENERAL, "The directory authorities do not currently " - "recognize your nickname."); - have_warned_about_invalid_status = 1; - } - } - if (!have_warned_about_old_version) { int is_server = server_mode(get_options()); version_status_t status; @@ -1651,10 +1879,8 @@ v2_download_status_map = digestmap_new(); dl_status = digestmap_new(); - SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns, - { - SMARTLIST_FOREACH(ns->entries, routerstatus_t *, rs, - { + SMARTLIST_FOREACH_BEGIN(networkstatus_v2_list, networkstatus_v2_t *, ns) { + SMARTLIST_FOREACH_BEGIN(ns->entries, routerstatus_t *, rs) { const char *d = rs->descriptor_digest; download_status_t *s; if (digestmap_get(dl_status, d)) @@ -1663,8 +1889,8 @@ s = tor_malloc_zero(sizeof(download_status_t)); } digestmap_set(dl_status, d, s); - }); - }); + } SMARTLIST_FOREACH_END(rs); + } SMARTLIST_FOREACH_END(ns); digestmap_free(v2_download_status_map, _tor_free); v2_download_status_map = dl_status; networkstatus_v2_list_has_changed = 0; @@ -1678,11 +1904,9 @@ if (!current_consensus) return; - if (named_server_map) - strmap_free(named_server_map, _tor_free); + strmap_free(named_server_map, _tor_free); named_server_map = strmap_new(); - if (unnamed_server_map) - strmap_free(unnamed_server_map, NULL); + strmap_free(unnamed_server_map, NULL); unnamed_server_map = strmap_new(); SMARTLIST_FOREACH(current_consensus->routerstatus_list, routerstatus_t *, rs, { @@ -1704,43 +1928,32 @@ int reset_failures) { trusted_dir_server_t *ds; - routerstatus_t *rs; or_options_t *options = get_options(); int authdir = authdir_mode_v2(options) || authdir_mode_v3(options); int namingdir = authdir && options->NamingAuthoritativeDir; networkstatus_t *ns = current_consensus; - int idx; if (!ns || !smartlist_len(ns->routerstatus_list)) return; + if (!networkstatus_v2_list) + networkstatus_v2_list = smartlist_create(); routers_sort_by_identity(routers); - /* Now routers and ns->routerstatus_list are both in ascending order - * of identity digest. */ - idx = 0; - rs = smartlist_get(ns->routerstatus_list, idx); - SMARTLIST_FOREACH(routers, routerinfo_t *, router, + SMARTLIST_FOREACH_JOIN(ns->routerstatus_list, routerstatus_t *, rs, + routers, routerinfo_t *, router, + memcmp(rs->identity_digest, + router->cache_info.identity_digest, DIGEST_LEN), { - const char *digest = router->cache_info.identity_digest; - int r; - while ((r = memcmp(rs->identity_digest, digest, DIGEST_LEN))<0) { - if (++idx == smartlist_len(ns->routerstatus_list)) { - /* We're out of routerstatuses. Bail. */ - goto done; - } - rs = smartlist_get(ns->routerstatus_list, idx); - } - if (r>0) { - /* We have no routerstatus for this router. Clear flags and skip it. */ - if (!namingdir) - router->is_named = 0; - if (!authdir) { - if (router->purpose == ROUTER_PURPOSE_GENERAL) - router_clear_status_flags(router); - } - continue; + /* We have no routerstatus for this router. Clear flags and skip it. */ + if (!namingdir) + router->is_named = 0; + if (!authdir) { + if (router->purpose == ROUTER_PURPOSE_GENERAL) + router_clear_status_flags(router); } - tor_assert(r==0); + }) { + /* We have a routerstatus for this router. */ + const char *digest = router->cache_info.identity_digest; ds = router_get_trusteddirserver_by_digest(digest); @@ -1750,6 +1963,7 @@ else router->is_named = 0; } + /* Is it the same descriptor, or only the same identity? */ if (!memcmp(router->cache_info.signed_descriptor_digest, rs->descriptor_digest, DIGEST_LEN)) { if (ns->valid_until > router->cache_info.last_listed_as_valid_until) @@ -1767,6 +1981,15 @@ router->is_bad_directory = rs->is_bad_directory; router->is_bad_exit = rs->is_bad_exit; router->is_hs_dir = rs->is_hs_dir; + } else { + /* If we _are_ an authority, we should check whether this router + * is one that will cause us to need a reachability test. */ + routerinfo_t *old_router = + router_get_by_digest(router->cache_info.identity_digest); + if (old_router != router) { + router->needs_retest_if_added = + dirserv_should_launch_reachability_test(router, old_router); + } } if (router->is_running && ds) { download_status_reset(&ds->v2_ns_dl_status); @@ -1774,9 +1997,25 @@ if (reset_failures) { download_status_reset(&rs->dl_status); } + } SMARTLIST_FOREACH_JOIN_END(rs, router); + + /* Now update last_listed_as_valid_until from v2 networkstatuses. */ + /* XXXX If this is slow, we need to rethink the code. */ + SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns, { + time_t live_until = ns->published_on + V2_NETWORKSTATUS_ROUTER_LIFETIME; + SMARTLIST_FOREACH_JOIN(ns->entries, routerstatus_t *, rs, + routers, routerinfo_t *, ri, + memcmp(rs->identity_digest, + ri->cache_info.identity_digest, DIGEST_LEN), + STMT_NIL) { + if (!memcmp(ri->cache_info.signed_descriptor_digest, + rs->descriptor_digest, DIGEST_LEN)) { + if (live_until > ri->cache_info.last_listed_as_valid_until) + ri->cache_info.last_listed_as_valid_until = live_until; + } + } SMARTLIST_FOREACH_JOIN_END(rs, ri); }); - done: router_dir_info_changed(); } @@ -1813,7 +2052,7 @@ networkstatus_getinfo_helper_single(routerstatus_t *rs) { char buf[RS_ENTRY_LEN+1]; - routerstatus_format_entry(buf, sizeof(buf), rs, NULL, 0); + routerstatus_format_entry(buf, sizeof(buf), rs, NULL, NS_CONTROL_PORT); return tor_strdup(buf); } @@ -1850,7 +2089,7 @@ if (bridge_auth && ri->purpose == ROUTER_PURPOSE_BRIDGE) dirserv_set_router_is_running(ri, now); /* then generate and write out status lines for each of them */ - set_routerstatus_from_routerinfo(&rs, ri, now, 0, 0, 0, 0); + set_routerstatus_from_routerinfo(&rs, ri, now, 0, 0, 0); smartlist_add(statuses, networkstatus_getinfo_helper_single(&rs)); }); @@ -1875,13 +2114,96 @@ tor_free(status); } +int32_t +get_net_param_from_list(smartlist_t *net_params, const char *param_name, + int default_val) +{ + size_t name_len = strlen(param_name); + + SMARTLIST_FOREACH_BEGIN(net_params, const char *, p) { + if (!strcmpstart(p, param_name) && p[name_len] == '=') { + int ok=0; + long v = tor_parse_long(p+name_len+1, 10, INT32_MIN, + INT32_MAX, &ok, NULL); + if (ok) + return (int32_t) v; + } + } SMARTLIST_FOREACH_END(p); + + return default_val; +} + +/** Return the value of a integer parameter from the networkstatus ns + * whose name is param_name. If ns is NULL, try loading the + * latest consensus ourselves. Return default_val if no latest + * consensus, or if it has no parameter called param_name. */ +int32_t +networkstatus_get_param(networkstatus_t *ns, const char *param_name, + int32_t default_val) +{ + if (!ns) /* if they pass in null, go find it ourselves */ + ns = networkstatus_get_latest_consensus(); + + if (!ns || !ns->net_params) + return default_val; + + return get_net_param_from_list(ns->net_params, param_name, default_val); +} + +/** Return the value of a integer bw weight parameter from the networkstatus + * ns whose name is weight_name. If ns is NULL, try + * loading the latest consensus ourselves. Return default_val if no + * latest consensus, or if it has no parameter called param_name. */ +int32_t +networkstatus_get_bw_weight(networkstatus_t *ns, const char *weight_name, + int32_t default_val) +{ + if (!ns) /* if they pass in null, go find it ourselves */ + ns = networkstatus_get_latest_consensus(); + + if (!ns || !ns->weight_params) + return default_val; + + return get_net_param_from_list(ns->weight_params, weight_name, default_val); +} + +/** Return the name of the consensus flavor flav as used to identify + * the flavor in directory documents. */ +const char * +networkstatus_get_flavor_name(consensus_flavor_t flav) +{ + switch (flav) { + case FLAV_NS: + return "ns"; + case FLAV_MICRODESC: + return "microdesc"; + default: + tor_fragile_assert(); + return "??"; + } +} + +/** Return the consensus_flavor_t value for the flavor called flavname, + * or -1 if the flavor is not recognized. */ +int +networkstatus_parse_flavor_name(const char *flavname) +{ + if (!strcmp(flavname, "ns")) + return FLAV_NS; + else if (!strcmp(flavname, "microdesc")) + return FLAV_MICRODESC; + else + return -1; +} + /** If question is a string beginning with "ns/" in a format the * control interface expects for a GETINFO question, set *answer to a * newly-allocated string containing networkstatus lines for the appropriate * ORs. Return 0 on success, -1 on unrecognized question format. */ int getinfo_helper_networkstatus(control_connection_t *conn, - const char *question, char **answer) + const char *question, char **answer, + const char **errmsg) { routerstatus_t *status; (void) conn; @@ -1905,8 +2227,10 @@ } else if (!strcmpstart(question, "ns/id/")) { char d[DIGEST_LEN]; - if (base16_decode(d, DIGEST_LEN, question+6, strlen(question+6))) + if (base16_decode(d, DIGEST_LEN, question+6, strlen(question+6))) { + *errmsg = "Data not decodeable as hex"; return -1; + } status = router_get_consensus_status_by_id(d); } else if (!strcmpstart(question, "ns/name/")) { status = router_get_consensus_status_by_nickname(question+8, 0); @@ -1914,7 +2238,7 @@ *answer = networkstatus_getinfo_by_purpose(question+11, time(NULL)); return *answer ? 0 : -1; } else { - return -1; + return 0; } if (status) @@ -1926,30 +2250,29 @@ void networkstatus_free_all(void) { + int i; if (networkstatus_v2_list) { SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns, networkstatus_v2_free(ns)); smartlist_free(networkstatus_v2_list); networkstatus_v2_list = NULL; } - if (v2_download_status_map) { - digestmap_free(v2_download_status_map, _tor_free); - v2_download_status_map = NULL; - } - if (current_consensus) { - networkstatus_vote_free(current_consensus); - current_consensus = NULL; - } - if (consensus_waiting_for_certs) { - networkstatus_vote_free(consensus_waiting_for_certs); - consensus_waiting_for_certs = NULL; - } - tor_free(consensus_waiting_for_certs_body); - if (named_server_map) { - strmap_free(named_server_map, _tor_free); - } - if (unnamed_server_map) { - strmap_free(unnamed_server_map, NULL); + + digestmap_free(v2_download_status_map, _tor_free); + v2_download_status_map = NULL; + networkstatus_vote_free(current_consensus); + current_consensus = NULL; + + for (i=0; i < N_CONSENSUS_FLAVORS; ++i) { + consensus_waiting_for_certs_t *waiting = &consensus_waiting_for_certs[i]; + if (waiting->consensus) { + networkstatus_vote_free(waiting->consensus); + waiting->consensus = NULL; + } + tor_free(waiting->body); } + + strmap_free(named_server_map, _tor_free); + strmap_free(unnamed_server_map, NULL); } diff -Nru tor-0.2.0.34/src/or/networkstatus.h tor-0.2.2.16-alpha/src/or/networkstatus.h --- tor-0.2.0.34/src/or/networkstatus.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/networkstatus.h 2010-08-18 23:04:46.000000000 +0000 @@ -0,0 +1,100 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file networkstatus.h + * \brief Header file for networkstatus.c. + **/ + +#ifndef _TOR_NETWORKSTATUS_H +#define _TOR_NETWORKSTATUS_H + +/** How old do we allow a v2 network-status to get before removing it + * completely? */ +#define MAX_NETWORKSTATUS_AGE (10*24*60*60) + +void networkstatus_reset_warnings(void); +void networkstatus_reset_download_failures(void); +int router_reload_v2_networkstatus(void); +int router_reload_consensus_networkstatus(void); +void routerstatus_free(routerstatus_t *rs); +void networkstatus_v2_free(networkstatus_v2_t *ns); +void networkstatus_vote_free(networkstatus_t *ns); +networkstatus_voter_info_t *networkstatus_get_voter_by_id( + networkstatus_t *vote, + const char *identity); +int networkstatus_check_consensus_signature(networkstatus_t *consensus, + int warn); +int networkstatus_check_document_signature(const networkstatus_t *consensus, + document_signature_t *sig, + const authority_cert_t *cert); +char *networkstatus_get_cache_filename(const char *identity_digest); +int router_set_networkstatus_v2(const char *s, time_t arrived_at, + v2_networkstatus_source_t source, + smartlist_t *requested_fingerprints); +void networkstatus_v2_list_clean(time_t now); +int compare_digest_to_routerstatus_entry(const void *_key, + const void **_member); +routerstatus_t *networkstatus_v2_find_entry(networkstatus_v2_t *ns, + const char *digest); +routerstatus_t *networkstatus_vote_find_entry(networkstatus_t *ns, + const char *digest); +int networkstatus_vote_find_entry_idx(networkstatus_t *ns, + const char *digest, int *found_out); +const smartlist_t *networkstatus_get_v2_list(void); +download_status_t *router_get_dl_status_by_descriptor_digest(const char *d); +routerstatus_t *router_get_consensus_status_by_id(const char *digest); +routerstatus_t *router_get_consensus_status_by_descriptor_digest( + const char *digest); +routerstatus_t *router_get_consensus_status_by_nickname(const char *nickname, + int warn_if_unnamed); +const char *networkstatus_get_router_digest_by_nickname(const char *nickname); +int networkstatus_nickname_is_unnamed(const char *nickname); +void networkstatus_consensus_download_failed(int status_code); +void update_consensus_networkstatus_fetch_time(time_t now); +int should_delay_dir_fetches(or_options_t *options); +void update_networkstatus_downloads(time_t now); +void update_certificate_downloads(time_t now); +int consensus_is_waiting_for_certs(void); +networkstatus_v2_t *networkstatus_v2_get_by_digest(const char *digest); +networkstatus_t *networkstatus_get_latest_consensus(void); +networkstatus_t *networkstatus_get_live_consensus(time_t now); +networkstatus_t *networkstatus_get_reasonably_live_consensus(time_t now); +#define NSSET_FROM_CACHE 1 +#define NSSET_WAS_WAITING_FOR_CERTS 2 +#define NSSET_DONT_DOWNLOAD_CERTS 4 +#define NSSET_ACCEPT_OBSOLETE 8 +#define NSSET_REQUIRE_FLAVOR 16 +int networkstatus_set_current_consensus(const char *consensus, + const char *flavor, + unsigned flags); +void networkstatus_note_certs_arrived(void); +void routers_update_all_from_networkstatus(time_t now, int dir_version); +void routers_update_status_from_consensus_networkstatus(smartlist_t *routers, + int reset_failures); +void signed_descs_update_status_from_consensus_networkstatus( + smartlist_t *descs); + +char *networkstatus_getinfo_helper_single(routerstatus_t *rs); +char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now); +void networkstatus_dump_bridge_status_to_file(time_t now); +int32_t get_net_param_from_list(smartlist_t *net_params, const char *name, + int default_val); +int32_t networkstatus_get_param(networkstatus_t *ns, const char *param_name, + int32_t default_val); +int getinfo_helper_networkstatus(control_connection_t *conn, + const char *question, char **answer, + const char **errmsg); +int32_t networkstatus_get_bw_weight(networkstatus_t *ns, const char *weight, + int32_t default_val); +const char *networkstatus_get_flavor_name(consensus_flavor_t flav); +int networkstatus_parse_flavor_name(const char *flavname); +void document_signature_free(document_signature_t *sig); +document_signature_t *document_signature_dup(const document_signature_t *sig); +void networkstatus_free_all(void); + +#endif + diff -Nru tor-0.2.0.34/src/or/ntmain.c tor-0.2.2.16-alpha/src/or/ntmain.c --- tor-0.2.0.34/src/or/ntmain.c 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/ntmain.c 2010-09-12 02:54:22.000000000 +0000 @@ -1,21 +1,26 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: ntmain.c 13484 2008-02-12 20:20:52Z nickm $ */ #define MAIN_PRIVATE #include "or.h" - -const char ntmain_c_id[] = - "$Id: ntmain.c 13484 2008-02-12 20:20:52Z nickm $"; - -#include -#define GENSRV_SERVICENAME TEXT("tor") -#define GENSRV_DISPLAYNAME TEXT("Tor Win32 Service") +#include "config.h" +#include "main.h" +#include "ntmain.h" + +#ifdef HAVE_EVENT2_EVENT_H +#include +#else +#include +#endif + +#include +#define GENSRV_SERVICENAME "tor" +#define GENSRV_DISPLAYNAME "Tor Win32 Service" #define GENSRV_DESCRIPTION \ - TEXT("Provides an anonymous Internet communication system") -#define GENSRV_USERACCT TEXT("NT AUTHORITY\\LocalService") + "Provides an anonymous Internet communication system" +#define GENSRV_USERACCT "NT AUTHORITY\\LocalService" // Cheating: using the pre-defined error codes, tricks Windows into displaying // a semi-related human-readable error message if startup fails as @@ -31,7 +36,6 @@ * to the NT service functions. */ static char **backup_argv; static int backup_argc; -static char* nt_strerror(uint32_t errnum); static void nt_service_control(DWORD request); static void nt_service_body(int argc, char **argv); @@ -65,30 +69,30 @@ SC_HANDLE (WINAPI *CreateServiceA_fn)( SC_HANDLE hSCManager, - LPCTSTR lpServiceName, - LPCTSTR lpDisplayName, + LPCSTR lpServiceName, + LPCSTR lpDisplayName, DWORD dwDesiredAccess, DWORD dwServiceType, DWORD dwStartType, DWORD dwErrorControl, - LPCTSTR lpBinaryPathName, - LPCTSTR lpLoadOrderGroup, + LPCSTR lpBinaryPathName, + LPCSTR lpLoadOrderGroup, LPDWORD lpdwTagId, - LPCTSTR lpDependencies, - LPCTSTR lpServiceStartName, - LPCTSTR lpPassword); + LPCSTR lpDependencies, + LPCSTR lpServiceStartName, + LPCSTR lpPassword); BOOL (WINAPI *DeleteService_fn)( SC_HANDLE hService); SC_HANDLE (WINAPI *OpenSCManagerA_fn)( - LPCTSTR lpMachineName, - LPCTSTR lpDatabaseName, + LPCSTR lpMachineName, + LPCSTR lpDatabaseName, DWORD dwDesiredAccess); SC_HANDLE (WINAPI *OpenServiceA_fn)( SC_HANDLE hSCManager, - LPCTSTR lpServiceName, + LPCSTR lpServiceName, DWORD dwDesiredAccess); BOOL (WINAPI *QueryServiceStatus_fn)( @@ -96,23 +100,23 @@ LPSERVICE_STATUS lpServiceStatus); SERVICE_STATUS_HANDLE (WINAPI *RegisterServiceCtrlHandlerA_fn)( - LPCTSTR lpServiceName, + LPCSTR lpServiceName, LPHANDLER_FUNCTION lpHandlerProc); BOOL (WINAPI *SetServiceStatus_fn)(SERVICE_STATUS_HANDLE, LPSERVICE_STATUS); BOOL (WINAPI *StartServiceCtrlDispatcherA_fn)( - const SERVICE_TABLE_ENTRY* lpServiceTable); + const SERVICE_TABLE_ENTRYA* lpServiceTable); BOOL (WINAPI *StartServiceA_fn)( SC_HANDLE hService, DWORD dwNumServiceArgs, - LPCTSTR* lpServiceArgVectors); + LPCSTR* lpServiceArgVectors); BOOL (WINAPI *LookupAccountNameA_fn)( - LPCTSTR lpSystemName, - LPCTSTR lpAccountName, + LPCSTR lpSystemName, + LPCSTR lpAccountName, PSID Sid, LPDWORD cbSid, LPTSTR ReferencedDomainName, @@ -135,7 +139,7 @@ return; /* XXXX Possibly, we should hardcode the location of this DLL. */ - if (!(library = LoadLibrary("advapi32.dll"))) { + if (!(library = LoadLibrary(TEXT("advapi32.dll")))) { log_err(LD_GENERAL, "Couldn't open advapi32.dll. Are you trying to use " "NT services on Windows 98? That doesn't work."); goto err; @@ -222,7 +226,7 @@ log_notice(LD_GENERAL, "Got stop/shutdown request; shutting down cleanly."); service_status.dwCurrentState = SERVICE_STOP_PENDING; - event_loopexit(&exit_now); + event_base_loopexit(tor_libevent_get_base(), &exit_now); return; } service_fns.SetServiceStatus_fn(hStatus, &service_status); @@ -279,20 +283,20 @@ static void nt_service_main(void) { - SERVICE_TABLE_ENTRY table[2]; + SERVICE_TABLE_ENTRYA table[2]; DWORD result = 0; char *errmsg; nt_service_loadlibrary(); table[0].lpServiceName = (char*)GENSRV_SERVICENAME; - table[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)nt_service_body; + table[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA)nt_service_body; table[1].lpServiceName = NULL; table[1].lpServiceProc = NULL; if (!service_fns.StartServiceCtrlDispatcherA_fn(table)) { result = GetLastError(); - errmsg = nt_strerror(result); + errmsg = format_win32_error(result); printf("Service error %d : %s\n", (int) result, errmsg); - LocalFree(errmsg); + tor_free(errmsg); if (result == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { if (tor_init(backup_argc, backup_argv) < 0) return; @@ -301,13 +305,10 @@ do_main_loop(); break; case CMD_LIST_FINGERPRINT: - do_list_fingerprint(); - break; case CMD_HASH_PASSWORD: - do_hash_password(); - break; case CMD_VERIFY_CONFIG: - printf("Configuration was valid\n"); + log_err(LD_CONFIG, "Unsupported command (--list-fingerprint, " + "--hash-password, or --verify-config) in NT service."); break; case CMD_RUN_UNITTESTS: default: @@ -330,9 +331,9 @@ nt_service_loadlibrary(); if ((hSCManager = service_fns.OpenSCManagerA_fn( NULL, NULL, SC_MANAGER_CREATE_SERVICE)) == NULL) { - errmsg = nt_strerror(GetLastError()); + errmsg = format_win32_error(GetLastError()); printf("OpenSCManager() failed : %s\n", errmsg); - LocalFree(errmsg); + tor_free(errmsg); } return hSCManager; } @@ -347,9 +348,9 @@ nt_service_loadlibrary(); if ((hService = service_fns.OpenServiceA_fn(hSCManager, GENSRV_SERVICENAME, SERVICE_ALL_ACCESS)) == NULL) { - errmsg = nt_strerror(GetLastError()); + errmsg = format_win32_error(GetLastError()); printf("OpenService() failed : %s\n", errmsg); - LocalFree(errmsg); + tor_free(errmsg); } return hService; } @@ -381,14 +382,14 @@ printf("Service started successfully\n"); return 0; } else { - errmsg = nt_strerror(service_status.dwWin32ExitCode); + errmsg = format_win32_error(service_status.dwWin32ExitCode); printf("Service failed to start : %s\n", errmsg); - LocalFree(errmsg); + tor_free(errmsg); } } else { - errmsg = nt_strerror(GetLastError()); + errmsg = format_win32_error(GetLastError()); printf("StartService() failed : %s\n", errmsg); - LocalFree(errmsg); + tor_free(errmsg); } return -1; } @@ -425,14 +426,14 @@ } else if (wait_time == MAX_SERVICE_WAIT_TIME) { printf("Service did not stop within %d seconds.\n", wait_time); } else { - errmsg = nt_strerror(GetLastError()); + errmsg = format_win32_error(GetLastError()); printf("QueryServiceStatus() failed : %s\n",errmsg); - LocalFree(errmsg); + tor_free(errmsg); } } else { - errmsg = nt_strerror(GetLastError()); + errmsg = format_win32_error(GetLastError()); printf("ControlService() failed : %s\n", errmsg); - LocalFree(errmsg); + tor_free(errmsg); } return -1; } @@ -446,6 +447,7 @@ nt_service_command_line(int *using_default_torrc) { TCHAR tor_exe[MAX_PATH+1]; + char tor_exe_ascii[MAX_PATH+1]; char *command, *options=NULL; smartlist_t *sl; int i, cmdlen; @@ -471,18 +473,25 @@ options = smartlist_join_strings(sl,"\" \"",0,NULL); smartlist_free(sl); +#ifdef UNICODE + wcstombs(tor_exe_ascii, tor_exe, sizeof(tor_exe_ascii)); +#else + strlcpy(tor_exe_ascii, tor_exe, sizeof(tor_exe_ascii)); +#endif + /* Allocate a string for the NT service command line */ - cmdlen = strlen(tor_exe) + (options?strlen(options):0) + 32; + cmdlen = strlen(tor_exe_ascii) + (options?strlen(options):0) + 32; command = tor_malloc(cmdlen); /* Format the service command */ if (options) { if (tor_snprintf(command, cmdlen, "\"%s\" --nt-service \"%s\"", - tor_exe, options)<0) { + tor_exe_ascii, options)<0) { tor_free(command); /* sets command to NULL. */ } } else { /* ! options */ - if (tor_snprintf(command, cmdlen, "\"%s\" --nt-service", tor_exe)<0) { + if (tor_snprintf(command, cmdlen, "\"%s\" --nt-service", + tor_exe_ascii)<0) { tor_free(command); /* sets command to NULL. */ } } @@ -507,7 +516,7 @@ SC_HANDLE hSCManager = NULL; SC_HANDLE hService = NULL; - SERVICE_DESCRIPTION sdBuff; + SERVICE_DESCRIPTIONA sdBuff; char *command; char *errmsg; const char *user_acct = GENSRV_USERACCT; @@ -597,10 +606,10 @@ SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, command, NULL, NULL, NULL, user_acct, password)) == NULL) { - errmsg = nt_strerror(GetLastError()); + errmsg = format_win32_error(GetLastError()); printf("CreateService() failed : %s\n", errmsg); service_fns.CloseServiceHandle_fn(hSCManager); - LocalFree(errmsg); + tor_free(errmsg); tor_free(command); return -1; } @@ -641,9 +650,9 @@ nt_service_stop(hService); if (service_fns.DeleteService_fn(hService) == FALSE) { - errmsg = nt_strerror(GetLastError()); + errmsg = format_win32_error(GetLastError()); printf("DeleteService() failed : %s\n", errmsg); - LocalFree(errmsg); + tor_free(errmsg); service_fns.CloseServiceHandle_fn(hService); service_fns.CloseServiceHandle_fn(hSCManager); return -1; @@ -700,20 +709,6 @@ return stop; } -/** Given a Win32 error code, this attempts to make Windows - * return a human-readable error message. The char* returned - * is allocated by Windows, but should be freed with LocalFree() - * when finished with it. */ -static char* -nt_strerror(uint32_t errnum) -{ - char *msgbuf; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, errnum, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPSTR)&msgbuf, 0, NULL); - return msgbuf; -} - int nt_service_parse_options(int argc, char **argv, int *should_exit) { diff -Nru tor-0.2.0.34/src/or/ntmain.h tor-0.2.2.16-alpha/src/or/ntmain.h --- tor-0.2.0.34/src/or/ntmain.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/ntmain.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,30 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file ntmain.h + * \brief Header file for ntmain.c. + **/ + +#ifndef _TOR_NTMAIN_H +#define _TOR_NTMAIN_H + +#ifdef MS_WINDOWS +#if !defined (WINCE) +#define NT_SERVICE +#endif +#endif + +#ifdef NT_SERVICE +int nt_service_parse_options(int argc, char **argv, int *should_exit); +int nt_service_is_stopping(void); +void nt_service_set_state(DWORD state); +#else +#define nt_service_is_stopping() 0 +#endif + +#endif + diff -Nru tor-0.2.0.34/src/or/onion.c tor-0.2.2.16-alpha/src/or/onion.c --- tor-0.2.0.34/src/or/onion.c 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/onion.c 2010-09-12 02:54:22.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: onion.c 13680 2008-02-22 19:09:45Z nickm $ */ -const char onion_c_id[] = - "$Id: onion.c 13680 2008-02-22 19:09:45Z nickm $"; /** * \file onion.c @@ -14,6 +11,10 @@ **/ #include "or.h" +#include "circuitlist.h" +#include "config.h" +#include "onion.h" +#include "rephist.h" /** Type for a linked list of circuits that are waiting for a free CPU worker * to process a waiting onion handshake. */ @@ -61,11 +62,18 @@ tor_assert(!ol_tail->next); if (ol_length >= get_options()->MaxOnionsPending) { - log_warn(LD_GENERAL, - "Your computer is too slow to handle this many circuit " - "creation requests! Please consider using the " - "MaxAdvertisedBandwidth config option or choosing a more " - "restricted exit policy."); +#define WARN_TOO_MANY_CIRC_CREATIONS_INTERVAL (60) + static ratelim_t last_warned = + RATELIM_INIT(WARN_TOO_MANY_CIRC_CREATIONS_INTERVAL); + char *m; + if ((m = rate_limit_log(&last_warned, approx_time()))) { + log_warn(LD_GENERAL, + "Your computer is too slow to handle this many circuit " + "creation requests! Please consider using the " + "MaxAdvertisedBandwidth config option or choosing a more " + "restricted exit policy.%s",m); + tor_free(m); + } tor_free(tmp); return -1; } @@ -78,7 +86,7 @@ circ = ol_list->circ; onion_pending_remove(ol_list->circ); log_info(LD_CIRC, - "Circuit create request is too old; cancelling due to overload."); + "Circuit create request is too old; canceling due to overload."); circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); } return 0; @@ -187,21 +195,6 @@ if (crypto_dh_get_public(dh, challenge, dhbytes)) goto err; -#ifdef DEBUG_ONION_SKINS -#define PA(a,n) \ - { int _i; for (_i = 0; _i #endif +#ifdef HAVE_NETINET_IN_H +#include +#endif #ifdef HAVE_ARPA_INET_H #include #endif @@ -73,15 +83,13 @@ #define snprintf _snprintf #endif -#include "crypto.h" #include "tortls.h" -#include "log.h" -#include "compat.h" +#include "../common/torlog.h" #include "container.h" -#include "util.h" #include "torgzip.h" - -#include +#include "address.h" +#include "compat_libevent.h" +#include "ht.h" /* These signals are defined to help control_signal_act work. */ @@ -125,12 +133,12 @@ /** Maximum size, in bytes, for any directory object that we've downloaded. */ #define MAX_DIR_DL_SIZE MAX_BUF_SIZE -/** For http parsing: Maximum number of bytes we'll accept in the headers +/** For HTTP parsing: Maximum number of bytes we'll accept in the headers * of an HTTP request or response. */ #define MAX_HEADERS_SIZE 50000 /** Maximum size, in bytes, for any directory object that we're accepting * as an upload. */ -#define MAX_DIR_UL_SIZE 500000 +#define MAX_DIR_UL_SIZE MAX_BUF_SIZE /** Maximum size, in bytes, of a single router descriptor uploaded to us * as a directory authority. Caches and clients fetch whatever descriptors @@ -150,7 +158,7 @@ #define MAX_DNS_TTL (3*60*60) /** How small can a TTL be before we stop believing it? Provides rudimentary * pinning. */ -#define MIN_DNS_TTL (60) +#define MIN_DNS_TTL 60 /** How often do we rotate onion keys? */ #define MIN_ONION_KEY_LIFETIME (7*24*60*60) @@ -210,6 +218,22 @@ /* !!!! If _CONN_TYPE_MAX is ever over 15, we must grow the type field in * connection_t. */ +/* Proxy client types */ +#define PROXY_NONE 0 +#define PROXY_CONNECT 1 +#define PROXY_SOCKS4 2 +#define PROXY_SOCKS5 3 + +/* Proxy client handshake states */ +#define PROXY_HTTPS_WANT_CONNECT_OK 1 +#define PROXY_SOCKS4_WANT_CONNECT_OK 2 +#define PROXY_SOCKS5_WANT_AUTH_METHOD_NONE 3 +#define PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929 4 +#define PROXY_SOCKS5_WANT_AUTH_RFC1929_OK 5 +#define PROXY_SOCKS5_WANT_CONNECT_OK 6 +#define PROXY_CONNECTED 7 + +/** True iff x is an edge connection. */ #define CONN_IS_EDGE(x) \ ((x)->type == CONN_TYPE_EXIT || (x)->type == CONN_TYPE_AP) @@ -229,29 +253,27 @@ #define _OR_CONN_STATE_MIN 1 /** State for a connection to an OR: waiting for connect() to finish. */ #define OR_CONN_STATE_CONNECTING 1 -/** State for a connection to an OR: waiting for proxy command to flush. */ -#define OR_CONN_STATE_PROXY_FLUSHING 2 -/** State for a connection to an OR: waiting for proxy response. */ -#define OR_CONN_STATE_PROXY_READING 3 +/** State for a connection to an OR: waiting for proxy handshake to complete */ +#define OR_CONN_STATE_PROXY_HANDSHAKING 2 /** State for a connection to an OR or client: SSL is handshaking, not done * yet. */ -#define OR_CONN_STATE_TLS_HANDSHAKING 4 +#define OR_CONN_STATE_TLS_HANDSHAKING 3 /** State for a connection to an OR: We're doing a second SSL handshake for * renegotiation purposes. */ -#define OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING 5 +#define OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING 4 /** State for a connection at an OR: We're waiting for the client to * renegotiate. */ -#define OR_CONN_STATE_TLS_SERVER_RENEGOTIATING 6 +#define OR_CONN_STATE_TLS_SERVER_RENEGOTIATING 5 /** State for a connection to an OR: We're done with our SSL handshake, but we * haven't yet negotiated link protocol versions and sent a netinfo cell. */ -#define OR_CONN_STATE_OR_HANDSHAKING 7 +#define OR_CONN_STATE_OR_HANDSHAKING 6 /** State for a connection to an OR: Ready to send/receive cells. */ -#define OR_CONN_STATE_OPEN 8 -#define _OR_CONN_STATE_MAX 8 +#define OR_CONN_STATE_OPEN 7 +#define _OR_CONN_STATE_MAX 7 #define _EXIT_CONN_STATE_MIN 1 -/** State for an exit connection: waiting for response from dns farm. */ +/** State for an exit connection: waiting for response from DNS farm. */ #define EXIT_CONN_STATE_RESOLVING 1 /** State for an exit connection: waiting for connect() to finish. */ #define EXIT_CONN_STATE_CONNECTING 2 @@ -316,12 +338,7 @@ #define CONTROL_CONN_STATE_NEEDAUTH 2 #define _CONTROL_CONN_STATE_MAX 2 -#define _DIR_PURPOSE_MIN 1 -/** A connection to a directory server: download a directory. */ -#define DIR_PURPOSE_FETCH_DIR 1 -/** A connection to a directory server: download just the list - * of running routers. */ -#define DIR_PURPOSE_FETCH_RUNNING_LIST 2 +#define _DIR_PURPOSE_MIN 3 /** A connection to a directory server: download a rendezvous * descriptor. */ #define DIR_PURPOSE_FETCH_RENDDESC 3 @@ -330,7 +347,7 @@ #define DIR_PURPOSE_HAS_FETCHED_RENDDESC 4 /** A connection to a directory server: download one or more v2 * network-status objects */ -#define DIR_PURPOSE_FETCH_NETWORKSTATUS 5 +#define DIR_PURPOSE_FETCH_V2_NETWORKSTATUS 5 /** A connection to a directory server: download one or more server * descriptors. */ #define DIR_PURPOSE_FETCH_SERVERDESC 6 @@ -346,17 +363,17 @@ #define DIR_PURPOSE_UPLOAD_VOTE 10 /** A connection to a directory server: upload a v3 consensus signature */ #define DIR_PURPOSE_UPLOAD_SIGNATURES 11 -/** A connection to a directory server: download one or more network-status - * objects */ +/** A connection to a directory server: download one or more v3 networkstatus + * votes. */ #define DIR_PURPOSE_FETCH_STATUS_VOTE 12 -/** A connection to a directory server: download one or more network-status - * objects */ +/** A connection to a directory server: download a v3 detached signatures + * object for a consensus. */ #define DIR_PURPOSE_FETCH_DETACHED_SIGNATURES 13 -/** A connection to a directory server: download one or more network-status - * objects */ +/** A connection to a directory server: download a v3 networkstatus + * consensus. */ #define DIR_PURPOSE_FETCH_CONSENSUS 14 -/** A connection to a directory server: download one or more network-status - * objects */ +/** A connection to a directory server: download one or more directory + * authority certificates. */ #define DIR_PURPOSE_FETCH_CERTIFICATE 15 /** Purpose for connection at a directory server. */ @@ -369,6 +386,8 @@ #define DIR_PURPOSE_FETCH_RENDDESC_V2 18 #define _DIR_PURPOSE_MAX 18 +/** True iff p 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_RENDDESC || \ @@ -382,7 +401,7 @@ #define EXIT_PURPOSE_RESOLVE 2 #define _EXIT_PURPOSE_MAX 2 -/* !!!! If any connection purpose is ever over over 31, we must grow the type +/* !!!! If any connection purpose is ever over 31, we must grow the type * field in connection_t. */ /** Circuit state: I'm the origin, still haven't done all my handshakes. */ @@ -448,21 +467,23 @@ #define CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED 11 /** Client-side circuit purpose: at Alice, rendezvous established. */ #define CIRCUIT_PURPOSE_C_REND_JOINED 12 - +/** This circuit is used for build time measurement only */ +#define CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT 13 +#define _CIRCUIT_PURPOSE_C_MAX 13 /** Hidden-service-side circuit purpose: at Bob, waiting for introductions. */ -#define CIRCUIT_PURPOSE_S_ESTABLISH_INTRO 13 +#define CIRCUIT_PURPOSE_S_ESTABLISH_INTRO 14 /** Hidden-service-side circuit purpose: at Bob, successfully established * intro. */ -#define CIRCUIT_PURPOSE_S_INTRO 14 +#define CIRCUIT_PURPOSE_S_INTRO 15 /** Hidden-service-side circuit purpose: at Bob, connecting to rend point. */ -#define CIRCUIT_PURPOSE_S_CONNECT_REND 15 +#define CIRCUIT_PURPOSE_S_CONNECT_REND 16 /** Hidden-service-side circuit purpose: at Bob, rendezvous established. */ -#define CIRCUIT_PURPOSE_S_REND_JOINED 16 +#define CIRCUIT_PURPOSE_S_REND_JOINED 17 /** A testing circuit; not meant to be used for actual traffic. */ -#define CIRCUIT_PURPOSE_TESTING 17 +#define CIRCUIT_PURPOSE_TESTING 18 /** A controller made this circuit and Tor should not use it. */ -#define CIRCUIT_PURPOSE_CONTROLLER 18 -#define _CIRCUIT_PURPOSE_MAX 18 +#define CIRCUIT_PURPOSE_CONTROLLER 19 +#define _CIRCUIT_PURPOSE_MAX 19 /** A catch-all for unrecognized purposes. Currently we don't expect * to make or see any circuits with this purpose. */ #define CIRCUIT_PURPOSE_UNKNOWN 255 @@ -470,12 +491,25 @@ /** True iff the circuit purpose p is for a circuit that * originated at this node. */ #define CIRCUIT_PURPOSE_IS_ORIGIN(p) ((p)>_CIRCUIT_PURPOSE_OR_MAX) +/** True iff the circuit purpose p is for a circuit that originated + * here to serve as a client. (Hidden services don't count here.) */ +#define CIRCUIT_PURPOSE_IS_CLIENT(p) \ + ((p)> _CIRCUIT_PURPOSE_OR_MAX && \ + (p)<=_CIRCUIT_PURPOSE_C_MAX) +/** True iff the circuit_t c is actually an origin_circuit_t. */ #define CIRCUIT_IS_ORIGIN(c) (CIRCUIT_PURPOSE_IS_ORIGIN((c)->purpose)) +/** True iff the circuit purpose p is for an established rendezvous + * circuit. */ +#define CIRCUIT_PURPOSE_IS_ESTABLISHED_REND(p) \ + ((p) == CIRCUIT_PURPOSE_C_REND_JOINED || \ + (p) == CIRCUIT_PURPOSE_S_REND_JOINED) /** How many circuits do we want simultaneously in-progress to handle * a given stream? */ #define MIN_CIRCUITS_HANDLING_STREAM 2 +/* These RELAY_COMMAND constants define values for relay cell commands, and +* must match those defined in tor-spec.txt. */ #define RELAY_COMMAND_BEGIN 1 #define RELAY_COMMAND_DATA 2 #define RELAY_COMMAND_END 3 @@ -500,18 +534,19 @@ #define RELAY_COMMAND_RENDEZVOUS_ESTABLISHED 39 #define RELAY_COMMAND_INTRODUCE_ACK 40 -/* Reasons why an OR connection is closed */ -#define END_OR_CONN_REASON_DONE 1 -#define END_OR_CONN_REASON_TCP_REFUSED 2 -#define END_OR_CONN_REASON_OR_IDENTITY 3 -#define END_OR_CONN_REASON_TLS_CONNRESET 4 /* tls connection reset by peer */ -#define END_OR_CONN_REASON_TLS_TIMEOUT 5 -#define END_OR_CONN_REASON_TLS_NO_ROUTE 6 /* no route to host/net */ -#define END_OR_CONN_REASON_TLS_IO_ERROR 7 /* tls read/write error */ -#define END_OR_CONN_REASON_TLS_MISC 8 +/* Reasons why an OR connection is closed. */ +#define END_OR_CONN_REASON_DONE 1 +#define END_OR_CONN_REASON_REFUSED 2 /* connection refused */ +#define END_OR_CONN_REASON_OR_IDENTITY 3 +#define END_OR_CONN_REASON_CONNRESET 4 /* connection reset by peer */ +#define END_OR_CONN_REASON_TIMEOUT 5 +#define END_OR_CONN_REASON_NO_ROUTE 6 /* no route to host/net */ +#define END_OR_CONN_REASON_IO_ERROR 7 /* read/write error */ +#define END_OR_CONN_REASON_RESOURCE_LIMIT 8 /* sockets, buffers, etc */ +#define END_OR_CONN_REASON_MISC 9 /* Reasons why we (or a remote OR) might close a stream. See tor-spec.txt for - * documentation of these. */ + * documentation of these. The values must match. */ #define END_STREAM_REASON_MISC 1 #define END_STREAM_REASON_RESOLVEFAILED 2 #define END_STREAM_REASON_CONNECTREFUSED 3 @@ -519,7 +554,7 @@ #define END_STREAM_REASON_DESTROY 5 #define END_STREAM_REASON_DONE 6 #define END_STREAM_REASON_TIMEOUT 7 -/* 8 is unallocated for historical reasons. */ +#define END_STREAM_REASON_NOROUTE 8 #define END_STREAM_REASON_HIBERNATING 9 #define END_STREAM_REASON_INTERNAL 10 #define END_STREAM_REASON_RESOURCELIMIT 11 @@ -610,6 +645,9 @@ /** Length of 'y' portion of 'y.onion' URL. */ #define REND_SERVICE_ID_LEN_BASE32 16 +/** Length of 'y.onion' including '.onion' URL. */ +#define REND_SERVICE_ADDRESS_LEN (16+1+5) + /** Length of a binary-encoded rendezvous service ID. */ #define REND_SERVICE_ID_LEN 10 @@ -638,8 +676,87 @@ * identity key. */ #define REND_INTRO_POINT_ID_LEN_BASE32 32 -#define CELL_DIRECTION_IN 1 -#define CELL_DIRECTION_OUT 2 +/** Length of the descriptor cookie that is used for client authorization + * to hidden services. */ +#define REND_DESC_COOKIE_LEN 16 + +/** Length of the base64-encoded descriptor cookie that is used for + * exchanging client authorization between hidden service and client. */ +#define REND_DESC_COOKIE_LEN_BASE64 22 + +/** Length of client identifier in encrypted introduction points for hidden + * service authorization type 'basic'. */ +#define REND_BASIC_AUTH_CLIENT_ID_LEN 4 + +/** Multiple of the number of clients to which the real number of clients + * is padded with fake clients for hidden service authorization type + * 'basic'. */ +#define REND_BASIC_AUTH_CLIENT_MULTIPLE 16 + +/** Length of client entry consisting of client identifier and encrypted + * session key for hidden service authorization type 'basic'. */ +#define REND_BASIC_AUTH_CLIENT_ENTRY_LEN (REND_BASIC_AUTH_CLIENT_ID_LEN \ + + CIPHER_KEY_LEN) + +/** Maximum size of v2 hidden service descriptors. */ +#define REND_DESC_MAX_SIZE (20 * 1024) + +/** Legal characters for use in authorized client names for a hidden + * service. */ +#define REND_LEGAL_CLIENTNAME_CHARACTERS \ + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-_" + +/** Maximum length of authorized client names for a hidden service. */ +#define REND_CLIENTNAME_MAX_LEN 16 + +/** Length of the rendezvous cookie that is used to connect circuits at the + * rendezvous point. */ +#define REND_COOKIE_LEN DIGEST_LEN + +/** Client authorization type that a hidden service performs. */ +typedef enum rend_auth_type_t { + REND_NO_AUTH = 0, + REND_BASIC_AUTH = 1, + REND_STEALTH_AUTH = 2, +} rend_auth_type_t; + +/** Client-side configuration of authorization for a hidden service. */ +typedef struct rend_service_authorization_t { + char descriptor_cookie[REND_DESC_COOKIE_LEN]; + char onion_address[REND_SERVICE_ADDRESS_LEN+1]; + rend_auth_type_t auth_type; +} rend_service_authorization_t; + +/** Client- and server-side data that is used for hidden service connection + * establishment. Not all fields contain data depending on where this struct + * is used. */ +typedef struct rend_data_t { + /** Onion address (without the .onion part) that a client requests. */ + char onion_address[REND_SERVICE_ID_LEN_BASE32+1]; + + /** (Optional) descriptor cookie that is used by a client. */ + char descriptor_cookie[REND_DESC_COOKIE_LEN]; + + /** Authorization type for accessing a service used by a client. */ + rend_auth_type_t auth_type; + + /** Hash of the hidden service's PK used by a service. */ + char rend_pk_digest[DIGEST_LEN]; + + /** Rendezvous cookie used by both, client and service. */ + char rend_cookie[REND_COOKIE_LEN]; +} rend_data_t; + +/** Time interval for tracking possible replays of INTRODUCE2 cells. + * Incoming cells with timestamps half of this interval in the past or + * future are dropped immediately. */ +#define REND_REPLAY_TIME_INTERVAL (60 * 60) + +/** Used to indicate which way a cell is going on a circuit. */ +typedef enum { + CELL_DIRECTION_IN=1, /**< The cell is moving towards the origin. */ + CELL_DIRECTION_OUT=2, /**< The cell is moving away from the origin. */ +} cell_direction_t; /** Initial value for both sides of a circuit transmission window when the * circuit is initialized. Measured in cells. */ @@ -652,7 +769,7 @@ /** Amount to increment a stream window when we get a stream SENDME. */ #define STREAMWINDOW_INCREMENT 50 -/* cell commands */ +/* Cell commands. These values are defined in tor-spec.txt. */ #define CELL_PADDING 0 #define CELL_CREATE 1 #define CELL_CREATED 2 @@ -664,6 +781,8 @@ #define CELL_NETINFO 8 #define CELL_RELAY_EARLY 9 +/** True iff the cell command x is one that implies a variable-length + * cell. */ #define CELL_COMMAND_IS_VAR_LENGTH(x) ((x) == CELL_VERSIONS) /** How long to test reachability before complaining to the user. */ @@ -673,25 +792,13 @@ #define LEGAL_NICKNAME_CHARACTERS \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -/** Name to use in client TLS certificates if no nickname is given. */ +/** Name to use in client TLS certificates if no nickname is given. Once + * Tor 0.1.2.x is obsolete, we can remove this. */ #define DEFAULT_CLIENT_NICKNAME "client" /** Number of bytes in a SOCKS4 header. */ #define SOCKS4_NETWORK_LEN 8 -/** Specified SOCKS5 status codes. */ -typedef enum { - SOCKS5_SUCCEEDED = 0x00, - SOCKS5_GENERAL_ERROR = 0x01, - SOCKS5_NOT_ALLOWED = 0x02, - SOCKS5_NET_UNREACHABLE = 0x03, - SOCKS5_HOST_UNREACHABLE = 0x04, - SOCKS5_CONNECTION_REFUSED = 0x05, - SOCKS5_TTL_EXPIRED = 0x06, - SOCKS5_COMMAND_NOT_SUPPORTED = 0x07, - SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED = 0x08, -} socks5_reply_status_t; - /* * Relay payload: * Relay command [1 byte] @@ -707,6 +814,7 @@ /** Number of bytes in a cell transmitted over the network. */ #define CELL_NETWORK_SIZE 512 +/** Length of a header on a variable-length cell. */ #define VAR_CELL_HEADER_SIZE 5 /** Number of bytes in a relay cell's header (not including general cell @@ -715,10 +823,15 @@ /** Largest number of bytes that can fit in a relay cell payload. */ #define RELAY_PAYLOAD_SIZE (CELL_PAYLOAD_SIZE-RELAY_HEADER_SIZE) +/** Identifies a circuit on an or_connection */ +typedef uint16_t circid_t; +/** Identifies a stream on a circuit */ +typedef uint16_t streamid_t; + /** Parsed onion routing cell. All communication between nodes * is via cells. */ typedef struct cell_t { - uint16_t circ_id; /**< Circuit which received the cell. */ + circid_t circ_id; /**< Circuit which received the cell. */ uint8_t command; /**< Type of the cell: one of CELL_PADDING, CELL_CREATE, * CELL_DESTROY, etc */ char payload[CELL_PAYLOAD_SIZE]; /**< Cell body. */ @@ -727,7 +840,7 @@ /** Parsed variable-length onion routing cell. */ typedef struct var_cell_t { uint8_t command; - uint16_t circ_id; + circid_t circ_id; uint16_t payload_len; char payload[1]; } var_cell_t; @@ -738,19 +851,35 @@ char body[CELL_NETWORK_SIZE]; /**< Cell as packed for network. */ } packed_cell_t; +/** Number of cells added to a circuit queue including their insertion + * time on 10 millisecond detail; used for buffer statistics. */ +typedef struct insertion_time_elem_t { + struct insertion_time_elem_t *next; /**< Next element in queue. */ + uint32_t insertion_time; /**< When were cells inserted (in 10 ms steps + * starting at 0:00 of the current day)? */ + unsigned counter; /**< How many cells were inserted? */ +} insertion_time_elem_t; + +/** Queue of insertion times. */ +typedef struct insertion_time_queue_t { + struct insertion_time_elem_t *first; /**< First element in queue. */ + struct insertion_time_elem_t *last; /**< Last element in queue. */ +} insertion_time_queue_t; + /** A queue of cells on a circuit, waiting to be added to the * or_connection_t's outbuf. */ typedef struct cell_queue_t { packed_cell_t *head; /**< The first cell, or NULL if the queue is empty. */ packed_cell_t *tail; /**< The last cell, or NULL if the queue is empty. */ int n; /**< The number of cells in the queue. */ + insertion_time_queue_t *insertion_times; /**< Insertion times of cells. */ } cell_queue_t; /** Beginning of a RELAY cell payload. */ typedef struct { uint8_t command; /**< The end-to-end relay command. */ uint16_t recognized; /**< Used to tell whether cell is for us. */ - uint16_t stream_id; /**< Which stream is this cell associated with? */ + streamid_t stream_id; /**< Which stream is this cell associated with? */ char integrity[4]; /**< Used to tell whether cell is corrupted. */ uint16_t length; /**< How long is the payload body? */ } relay_header_t; @@ -799,29 +928,12 @@ * again once the bandwidth throttler allows it? */ unsigned int write_blocked_on_bw:1; /**< Boolean: should we start writing * again once the bandwidth throttler allows - * reads? */ + * writes? */ unsigned int hold_open_until_flushed:1; /**< Despite this connection's being * marked for close, do we flush it * before closing it? */ unsigned int inbuf_reached_eof:1; /**< Boolean: did read() return 0 on this * conn? */ - unsigned int edge_has_sent_end:1; /**< For debugging; only used on edge - * connections. Set once we've set the stream end, - * and check in connection_about_to_close_connection(). - */ - /** Edge connections only: true if we've blocked reading until the - * circuit has fewer queued cells. */ - unsigned int edge_blocked_on_circ:1; - /** Used for OR conns that shouldn't get any new circs attached to them. */ - unsigned int or_is_obsolete:1; - /** For AP connections only. If 1, and we fail to reach the chosen exit, - * stop requiring it. */ - unsigned int chosen_exit_optional:1; - /** For AP connections only. If non-zero, this exit node was picked as - * a result of the TrackHostExit, and the value decrements every time - * we fail to complete a circuit to our chosen exit -- if it reaches - * zero, abandon the associated mapaddress. */ - unsigned int chosen_exit_retries:3; /** Set to 1 when we're inside connection_flushed_some to keep us from * calling connection_handle_write() recursively. */ unsigned int in_flushed_some:1; @@ -841,8 +953,11 @@ * connection. */ unsigned int linked_conn_is_closed:1; - int s; /**< Our socket; -1 if this connection is closed, or has no - * socket. */ + /** CONNECT/SOCKS proxy client handshake state (for outgoing connections). */ + unsigned int proxy_state:4; + + /** Our socket; -1 if this connection is closed, or has no socket. */ + evutil_socket_t s; int conn_array_index; /**< Index into the global connection array. */ struct event *read_event; /**< Libevent event structure. */ struct event *write_event; /**< Libevent event structure. */ @@ -856,13 +971,13 @@ * could write? */ time_t timestamp_created; /**< When was this connection_t created? */ - /* XXXX_IP6 make this ipv6-capable */ + /* XXXX_IP6 make this IPv6-capable */ int socket_family; /**< Address family of this connection's socket. Usually * AF_INET, but it can also be AF_UNIX, or in the future * AF_INET6 */ - uint32_t addr; /**< IP of the other side of the connection; used to identify - * routers, along with port. */ - uint16_t port; /**< If non-zero, port on the other end + tor_addr_t addr; /**< IP of the other side of the connection; used to + * identify routers, along with port. */ + uint16_t port; /**< If non-zero, port on the other end * of the connection. */ uint16_t marked_for_close; /**< Should we close this conn on the next * iteration of the main loop? (If true, holds @@ -871,16 +986,21 @@ const char *marked_for_close_file; /**< For debugging: in which file were * we marked for close? */ char *address; /**< FQDN (or IP) of the guy on the other end. - * strdup into this, because free_connection frees it. */ + * strdup into this, because free_connection() frees it. */ /** Another connection that's connected to this one in lieu of a socket. */ struct connection_t *linked_conn; - /** Unique identifier for this connection. */ + /** Unique identifier for this connection on this Tor instance. */ uint64_t global_identifier; - /* XXXX021 move this into a subtype. */ + /* XXXX022 move this field, and all the listener-only fields (just + socket_family, I think), into a new listener_connection_t subtype. */ + /** If the connection is a CONN_TYPE_AP_DNS_LISTENER, this field points + * to the evdns_server_port is uses to listen to and answer connections. */ struct evdns_server_port *dns_server_port; + /** Unique ID for measuring tunneled network status requests. */ + uint64_t dirreq_id; } connection_t; /** Stores flags and information related to the portion of a v2 Tor OR @@ -912,7 +1032,7 @@ * recent, we can rate limit it further. */ time_t client_used; - uint32_t real_addr; /**< The actual address that this connection came from + tor_addr_t real_addr; /**< The actual address that this connection came from * or went to. The addr field is prone to * getting overridden by the address from the router * descriptor matching identity_digest. */ @@ -926,9 +1046,13 @@ * address listed in a server descriptor, or because an authenticated * NETINFO cell listed the address we're connected to as recognized. */ unsigned int is_canonical:1; + /** True iff this connection shouldn't get any new circs attached to it, + * because the connection is too old, or because there's a better one, etc. + */ + unsigned int is_bad_for_new_circs:1; uint8_t link_proto; /**< What protocol version are we using? 0 for * "none negotiated yet." */ - uint16_t next_circ_id; /**< Which circ_id do we try to use next on + circid_t next_circ_id; /**< Which circ_id do we try to use next on * this connection? This is always in the * range 0..1<<15-1. */ @@ -938,12 +1062,13 @@ time_t timestamp_last_added_nonpadding; /** When did we last add a * non-padding cell to the outbuf? */ - /* bandwidth* and read_bucket only used by ORs in OPEN state: */ + /* bandwidth* and *_bucket only used by ORs in OPEN state: */ int bandwidthrate; /**< Bytes/s added to the bucket. (OPEN ORs only.) */ int bandwidthburst; /**< Max bucket size for this conn. (OPEN ORs only.) */ int read_bucket; /**< When this hits 0, stop receiving. Every second we * add 'bandwidthrate' to this, capping it at * bandwidthburst. (OPEN ORs only) */ + int write_bucket; /**< When this hits 0, stop writing. Like read_bucket. */ int n_circuits; /**< How many circuits use this connection as p_conn or * n_conn ? */ @@ -951,6 +1076,17 @@ * free up on this connection's outbuf. Every time we pull cells from a * circuit, we advance this pointer to the next circuit in the ring. */ struct circuit_t *active_circuits; + /** Priority queue of cell_ewma_t for circuits with queued cells waiting for + * room to free up on this connection's outbuf. Kept in heap order + * according to EWMA. + * + * This is redundant with active_circuits; if we ever decide only to use the + * cell_ewma algorithm for choosing circuits, we can remove active_circuits. + */ + smartlist_t *active_circuit_pqueue; + /** The tick on which the cell_ewma_ts in active_circuit_pqueue last had + * their ewma values rescaled. */ + unsigned active_circuit_pqueue_last_recalibrated; struct or_connection_t *next_with_same_id; /**< Next connection with same * identity digest as this one. */ } or_connection_t; @@ -979,8 +1115,8 @@ uint32_t address_ttl; /**< TTL for address-to-addr mapping on exit * connection. Exit connections only. */ - uint16_t stream_id; /**< The stream ID used for this edge connection on its - * circuit */ + streamid_t stream_id; /**< The stream ID used for this edge connection on its + * circuit */ /** The reason why this connection is closing; passed to the controller. */ uint16_t end_reason; @@ -992,14 +1128,14 @@ uint32_t n_written; /** What rendezvous service are we querying for? (AP only) */ - char rend_query[REND_SERVICE_ID_LEN_BASE32+1]; + rend_data_t *rend_data; /** Number of times we've reassigned this application connection to * a new circuit. We keep track because the timeout is longer if we've * already retried several times. */ uint8_t num_socks_retries; - /** True iff this connection is for a dnsserv request only. */ + /** True iff this connection is for a DNS request only. */ unsigned int is_dns_request:1; /** True iff this stream must attach to a one-hop circuit (e.g. for @@ -1009,6 +1145,22 @@ * itself rather than BEGIN (either via onehop or via a whole circuit). */ unsigned int use_begindir:1; + unsigned int edge_has_sent_end:1; /**< For debugging; only used on edge + * connections. Set once we've set the stream end, + * and check in connection_about_to_close_connection(). + */ + /** True iff we've blocked reading until the circuit has fewer queued + * cells. */ + unsigned int edge_blocked_on_circ:1; + /** For AP connections only. If 1, and we fail to reach the chosen exit, + * stop requiring it. */ + unsigned int chosen_exit_optional:1; + /** For AP connections only. If non-zero, this exit node was picked as + * a result of the TrackHostExit, and the value decrements every time + * we fail to complete a circuit to our chosen exit -- if it reaches + * zero, abandon the associated mapaddress. */ + unsigned int chosen_exit_retries:3; + /** If this is a DNSPort connection, this field holds the pending DNS * request that we're going to try to answer. */ struct evdns_server_request *dns_server_request; @@ -1031,12 +1183,13 @@ 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_CACHED_DIR, DIR_SPOOL_NETWORKSTATUS, + DIR_SPOOL_MICRODESC, /* NOTE: if we add another entry, add another bit. */ } 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 desriptors to be spooled. */ + /** 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; @@ -1045,11 +1198,8 @@ /** The zlib object doing on-the-fly compression for spooled data. */ tor_zlib_state_t *zlib_state; - /** What hidden service descriptor are we fetching, if any? */ - int rend_version; - /** What rendezvous service are we querying for? */ - char rend_query[REND_SERVICE_ID_LEN_BASE32+1]; + rend_data_t *rend_data; char identity_digest[DIGEST_LEN]; /**< Hash of the public RSA key for * the directory server's signing key. */ @@ -1062,21 +1212,17 @@ uint32_t event_mask; /**< Bitfield: which events does this controller * care about? */ - unsigned int use_long_names:1; /**< True if we should use long nicknames - * on this (v1) connection. Only settable - * via v1 controllers. */ - /** For control connections only. If set, we send extended info with control - * events as appropriate. */ - unsigned int use_extended_events:1; /** True if we have sent a protocolinfo reply on this connection. */ unsigned int have_sent_protocolinfo:1; + /** Amount of space allocated in incoming_cmd. */ uint32_t incoming_cmd_len; + /** Number of bytes currently stored in incoming_cmd. */ uint32_t incoming_cmd_cur_len; + /** A control command that we're reading from the inbuf, but which has not + * yet arrived completely. */ char *incoming_cmd; - /* Used only by control v0 connections */ - uint16_t incoming_cmd_type; } control_connection_t; /** Cast a connection_t subtype pointer to a connection_t **/ @@ -1118,6 +1264,7 @@ return DOWNCAST(control_connection_t, c); } +/** What action type does an address policy indicate: accept or reject? */ typedef enum { ADDR_POLICY_ACCEPT=1, ADDR_POLICY_REJECT=2, @@ -1135,8 +1282,7 @@ maskbits_t maskbits; /**< Accept/reject all addresses a such that the * first maskbits bits of a match * addr. */ - /* XXXX_IP6 make this ipv6-capable */ - uint32_t addr; /**< Base address to accept or reject. */ + tor_addr_t addr; /**< Base address to accept or reject. */ uint16_t prt_min; /**< Lowest port number to accept/reject. */ uint16_t prt_max; /**< Highest port number to accept/reject. */ } addr_policy_t; @@ -1144,11 +1290,12 @@ /** A cached_dir_t represents a cacheable directory object, along with its * compressed form. */ typedef struct cached_dir_t { - char *dir; /**< Contents of this object */ + char *dir; /**< Contents of this object, NUL-terminated. */ char *dir_z; /**< Compressed contents of this object. */ - size_t dir_len; /**< Length of dir */ - size_t dir_z_len; /**< Length of dir_z */ - time_t published; /**< When was this object published */ + size_t dir_len; /**< Length of dir (not counting its NUL). */ + size_t dir_z_len; /**< Length of dir_z. */ + time_t published; /**< When was this object published. */ + digests_t digests; /**< Digests of this object (networkstatus only) */ int refcnt; /**< Reference count for this cached_dir_t. */ } cached_dir_t; @@ -1171,11 +1318,12 @@ SAVED_IN_JOURNAL } saved_location_t; -/** Enumeration: what kind of downlaod schedule are we using for a given +/** Enumeration: what kind of download schedule are we using for a given * object? */ typedef enum { DL_SCHED_GENERIC = 0, DL_SCHED_CONSENSUS = 1, + DL_SCHED_BRIDGE = 2, } download_schedule_t; /** Information about our plans for retrying downloads for a downloadable @@ -1188,6 +1336,9 @@ download_schedule_t schedule : 8; } download_status_t; +/** If n_download_failures is this high, the download can never happen. */ +#define IMPOSSIBLE_TO_DOWNLOAD 255 + /** The max size we expect router descriptor annotations we create to * be. We'll accept larger ones if we see them on disk, but we won't * create any that are larger than this. */ @@ -1199,7 +1350,7 @@ * necessarily NUL-terminated. If saved_location is SAVED_IN_CACHE, this * pointer is null. */ char *signed_descriptor_body; - /** Length of the annotations preceeding the server descriptor. */ + /** Length of the annotations preceding the server descriptor. */ size_t annotations_len; /** Length of the server descriptor. */ size_t signed_descriptor_len; @@ -1224,8 +1375,15 @@ * routerlist->old_routers? -1 for none. */ int routerlist_index; /** The valid-until time of the most recent consensus that listed this - * descriptor. 0 for "never listed in a consensus, so far as we know." */ + * descriptor, or a bit after the publication time of the most recent v2 + * networkstatus that listed it. 0 for "never listed in a consensus or + * status, so far as we know." */ time_t last_listed_as_valid_until; +#ifdef TRACK_SERVED_TIME + /** The last time we served anybody this descriptor. Used for internal + * testing to see whether we're holding on to descriptors too long. */ + time_t last_served_at; /*XXXX remove if not useful. */ +#endif /* If true, we do not ever try to save this object in the cache. */ unsigned int do_not_cache : 1; /* If true, this item is meant to represent an extrainfo. */ @@ -1237,6 +1395,9 @@ unsigned int send_unencrypted : 1; } signed_descriptor_t; +/** A signed integer representing a country code. */ +typedef int16_t country_t; + /** Information about another onion router in the network. */ typedef struct { signed_descriptor_t cache_info; @@ -1270,6 +1431,8 @@ * dnsworker code. */ unsigned int caches_extra_info:1; /**< Whether the router caches and serves * extrainfo documents. */ + unsigned int allow_single_hop_exits:1; /**< Whether the router allows + * single hop exits. */ /* local info */ unsigned int is_running:1; /**< As far as we know, is this OR currently @@ -1291,6 +1454,11 @@ * a hidden service directory. */ unsigned int is_hs_dir:1; /**< True iff this router is a hidden service * directory according to the authorities. */ + unsigned int policy_is_reject_star:1; /**< True iff the exit policy for this + * router rejects everything. */ + /** True if, after we have added this router, we should re-launch + * tests for it. */ + unsigned int needs_retest_if_added:1; /** Tor can use this router for general positions in circuits. */ #define ROUTER_PURPOSE_GENERAL 0 @@ -1310,7 +1478,8 @@ time_t last_reachable; /** When did we start testing reachability for this OR? */ time_t testing_since; - + /** According to the geoip db what country is this router in? */ + country_t country; } routerinfo_t; /** Information needed to keep and cache a signed extra-info document. */ @@ -1360,7 +1529,7 @@ * an exit node. */ unsigned int is_bad_directory:1; /**< Do we think this directory is junky, * underpowered, or otherwise useless? */ - unsigned int is_hs_dir:1; /** True iff this router is a v2-or-later hidden + unsigned int is_hs_dir:1; /**< True iff this router is a v2-or-later hidden * service directory. */ /** True iff we know version info for this router. (i.e., a "v" entry was * included.) We'll replace all these with a big tor_version_t or a char[] @@ -1368,12 +1537,26 @@ unsigned int version_known:1; /** True iff this router is a version that supports BEGIN_DIR cells. */ unsigned int version_supports_begindir:1; + /** True iff this router is a version that supports conditional consensus + * downloads (signed by list of authorities). */ + unsigned int version_supports_conditional_consensus:1; /** True iff this router is a version that we can post extrainfo docs to. */ unsigned int version_supports_extrainfo_upload:1; /** True iff this router is a version that, if it caches directory info, * we can get v3 downloads from. */ unsigned int version_supports_v3_dir: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 has_measured_bw:1; /**< The vote/consensus had a measured bw */ + + uint32_t measured_bw; /**< Measured bandwidth (capacity) of the router */ + + uint32_t bandwidth; /**< Bandwidth (capacity) of the router as reported in + * the vote/consensus, in kilobytes/sec. */ + char *exitsummary; /**< exit policy summary - + * XXX weasel: this probably should not stay a string. */ + /* ---- The fields below aren't derived from the networkstatus; they * hold local information only. */ @@ -1392,6 +1575,52 @@ } routerstatus_t; +/** A microdescriptor is the smallest amount of information needed to build a + * circuit through a router. They are generated by the directory authorities, + * using information from the uploaded routerinfo documents. They are not + * self-signed, but are rather authenticated by having their hash in a signed + * networkstatus document. */ +typedef struct microdesc_t { + /** Hashtable node, used to look up the microdesc by its digest. */ + HT_ENTRY(microdesc_t) node; + + /* Cache information */ + + /** When was this microdescriptor last listed in a consensus document? + * Once a microdesc has been unlisted long enough, we can drop it. + */ + time_t last_listed; + /** Where is this microdescriptor currently stored? */ + saved_location_t saved_location : 3; + /** If true, do not attempt to cache this microdescriptor on disk. */ + unsigned int no_save : 1; + /** If saved_location == SAVED_IN_CACHE, this field holds the offset of the + * microdescriptor in the cache. */ + off_t off; + + /* The string containing the microdesc. */ + + /** A pointer to the encoded body of the microdescriptor. If the + * saved_location is SAVED_IN_CACHE, then the body is a pointer into an + * mmap'd region. Otherwise, it is a malloc'd string. The string might not + * be NUL-terminated; take the length from bodylen. */ + char *body; + /** The length of the microdescriptor in body. */ + size_t bodylen; + /** A SHA256-digest of the microdescriptor. */ + char digest[DIGEST256_LEN]; + + /* Fields in the microdescriptor. */ + + /** As routerinfo_t.onion_pkey */ + crypto_pk_env_t *onion_pkey; + /** As routerinfo_t.family */ + smartlist_t *family; + /** Encoded exit policy summary */ + char *exitsummary; /**< exit policy summary - + * XXX this probably should not stay a string. */ +} microdesc_t; + /** How many times will we try to download a router's descriptor before giving * up? */ #define MAX_ROUTERDESC_DOWNLOAD_FAILURES 8 @@ -1404,9 +1633,6 @@ /** What was the digest of the document? */ char networkstatus_digest[DIGEST_LEN]; - unsigned int is_recent; /**< Is this recent enough to influence running - * status? */ - /* These fields come from the actual network-status document.*/ time_t published_on; /**< Declared publication date. */ @@ -1437,7 +1663,12 @@ * sorted by identity_digest. */ } networkstatus_v2_t; -/** The claim about a single router, make in a vote. */ +typedef struct vote_microdesc_hash_t { + struct vote_microdesc_hash_t *next; + char *microdesc_hash_line; +} vote_microdesc_hash_t; + +/** The claim about a single router, made in a vote. */ typedef struct vote_routerstatus_t { routerstatus_t status; /**< Underlying 'status' object for this router. * Flags are redundant. */ @@ -1445,36 +1676,74 @@ * networkstatus_t.known_flags. */ char *version; /**< The version that the authority says this router is * running. */ + vote_microdesc_hash_t *microdesc; } vote_routerstatus_t; +/** A signature of some document by an authority. */ +typedef struct document_signature_t { + /** Declared SHA-1 digest of this voter's identity key */ + char identity_digest[DIGEST_LEN]; + /** Declared SHA-1 digest of signing key used by this voter. */ + char signing_key_digest[DIGEST_LEN]; + /** Algorithm used to compute the digest of the document. */ + digest_algorithm_t alg; + /** Signature of the signed thing. */ + char *signature; + /** Length of signature */ + int signature_len; + unsigned int bad_signature : 1; /**< Set to true if we've tried to verify + * the sig, and we know it's bad. */ + unsigned int good_signature : 1; /**< Set to true if we've verified the sig + * as good. */ +} document_signature_t; + /** Information about a single voter in a vote or a consensus. */ typedef struct networkstatus_voter_info_t { + /** Declared SHA-1 digest of this voter's identity key */ + char identity_digest[DIGEST_LEN]; char *nickname; /**< Nickname of this voter */ - char identity_digest[DIGEST_LEN]; /**< Digest of this voter's identity key */ + /** Digest of this voter's "legacy" identity key, if any. In vote only; for + * consensuses, we treat legacy keys as additional signers. */ + char legacy_id_digest[DIGEST_LEN]; char *address; /**< Address of this voter, in string format. */ uint32_t addr; /**< Address of this voter, in IPv4, in host order. */ uint16_t dir_port; /**< Directory port of this voter */ uint16_t or_port; /**< OR port of this voter */ char *contact; /**< Contact information for this voter. */ char vote_digest[DIGEST_LEN]; /**< Digest of this voter's vote, as signed. */ - char legacy_id_digest[DIGEST_LEN]; /**< From vote only. DOCDOC */ /* Nothing from here on is signed. */ - char signing_key_digest[DIGEST_LEN]; /**< Declared digest of signing key - * used by this voter. */ - char *signature; /**< Signature from this voter. */ - int signature_len; /**< Length of signature */ - unsigned int bad_signature : 1; /**< Set to true if we've verified the sig - * as good. */ - unsigned int good_signature : 1; /**< Set to true if we've tried to verify - * the sig, and we know it's bad. */ + /** The signature of the document and the signature's status. */ + smartlist_t *sigs; } networkstatus_voter_info_t; +/** Enumerates the possible seriousness values of a networkstatus document. */ +typedef enum { + NS_TYPE_VOTE, + NS_TYPE_CONSENSUS, + NS_TYPE_OPINION, +} networkstatus_type_t; + +/** Enumerates recognized flavors of a consensus networkstatus document. All + * flavors of a consensus are generated from the same set of votes, but they + * present different types information to different versions of Tor. */ +typedef enum { + FLAV_NS = 0, + FLAV_MICRODESC = 1, +} consensus_flavor_t; + +/** Which consensus flavor do we actually want to use to build circuits? */ +#define USABLE_CONSENSUS_FLAVOR FLAV_NS + +/** How many different consensus flavors are there? */ +#define N_CONSENSUS_FLAVORS ((int)(FLAV_MICRODESC)+1) + /** A common structure to hold a v3 network status vote, or a v3 network * status consensus. */ typedef struct networkstatus_t { - int is_vote; /**< True if this is a vote; false if it is a consensus. */ - time_t published; /**< Vote only: Tiem when vote was written. */ + networkstatus_type_t type : 8; /**< Vote, consensus, or opinion? */ + consensus_flavor_t flavor : 8; /**< If a consensus, what kind? */ + time_t published; /**< Vote only: Time when vote was written. */ time_t valid_after; /**< Time after which this vote or consensus applies. */ time_t fresh_until; /**< Time before which this is the most recent vote or * consensus. */ @@ -1489,7 +1758,7 @@ /** How long does this vote/consensus claim that authorities take to * distribute their votes to one another? */ int vote_seconds; - /** How long does this vote/consensus claim that authorites take to + /** How long does this vote/consensus claim that authorities take to * distribute their consensus signatures to one another? */ int dist_seconds; @@ -1501,6 +1770,14 @@ * not listed here, the voter has no opinion on what its value should be. */ smartlist_t *known_flags; + /** List of key=value strings for the parameters in this vote or + * consensus, sorted by key. */ + smartlist_t *net_params; + + /** List of key=value strings for the bw weight parameters in the + * consensus. */ + smartlist_t *weight_params; + /** List of networkstatus_voter_info_t. For a vote, only one element * is included. For a consensus, one element is included for every voter * whose vote contributed to the consensus. */ @@ -1508,8 +1785,8 @@ struct authority_cert_t *cert; /**< Vote only: the voter's certificate. */ - /** Digest of this document, as signed. */ - char networkstatus_digest[DIGEST_LEN]; + /** Digests of this document, as signed. */ + digests_t digests; /** List of router statuses, sorted by identity digest. For a vote, * the elements are vote_routerstatus_t; for a consensus, the elements @@ -1521,14 +1798,15 @@ digestmap_t *desc_digest_map; } networkstatus_t; -/** A set of signatures for a networkstatus consensus. All fields are as for - * networkstatus_t. */ +/** A set of signatures for a networkstatus consensus. Unless otherwise + * noted, all fields are as for networkstatus_t. */ typedef struct ns_detached_signatures_t { time_t valid_after; time_t fresh_until; time_t valid_until; - char networkstatus_digest[DIGEST_LEN]; - smartlist_t *signatures; /* list of networkstatus_voter_info_t */ + strmap_t *digests; /**< Map from flavor name to digestset_t */ + strmap_t *signatures; /**< Map from flavor name to list of + * document_signature_t */ } ns_detached_signatures_t; /** Allowable types of desc_store_t. */ @@ -1600,32 +1878,49 @@ * display. */ char identity_digest[DIGEST_LEN]; /**< Hash of this router's identity key. */ uint16_t port; /**< OR port. */ - uint32_t addr; /**< IP address in host order. */ + tor_addr_t addr; /**< IP address. */ crypto_pk_env_t *onion_key; /**< Current onionskin key. */ } extend_info_t; /** Certificate for v3 directory protocol: binds long-term authority identity * keys to medium-term authority signing keys. */ typedef struct authority_cert_t { + /** Information relating to caching this cert on disk and looking it up. */ signed_descriptor_t cache_info; + /** This authority's long-term authority identity key. */ crypto_pk_env_t *identity_key; + /** This authority's medium-term signing key. */ crypto_pk_env_t *signing_key; + /** The digest of signing_key */ char signing_key_digest[DIGEST_LEN]; + /** The listed expiration time of this certificate. */ time_t expires; + /** This authority's IPv4 address, in host order. */ uint32_t addr; + /** This authority's directory port. */ uint16_t dir_port; + /** True iff this certificate was cross-certified by signing the identity + * key with the signing key. */ + uint8_t is_cross_certified; } authority_cert_t; /** Bitfield enum type listing types of directory authority/directory * server. */ typedef enum { NO_AUTHORITY = 0, + /** Serves/signs v1 directory information: Big lists of routers, and short + * routerstatus documents. */ V1_AUTHORITY = 1 << 0, + /** Serves/signs v2 directory information: i.e. v2 networkstatus documents */ V2_AUTHORITY = 1 << 1, + /** Serves/signs v3 directory information: votes, consensuses, certs */ V3_AUTHORITY = 1 << 2, + /** Serves hidden service descriptors. */ HIDSERV_AUTHORITY = 1 << 3, + /** Serves bridge descriptors. */ BRIDGE_AUTHORITY = 1 << 4, - EXTRAINFO_CACHE = 1 << 5, /* not precisely an authority type. */ + /** Serves extrainfo documents. (XXX Not precisely an authority type)*/ + EXTRAINFO_CACHE = 1 << 5, } authority_type_t; #define CRYPT_PATH_MAGIC 0x70127012u @@ -1678,9 +1973,9 @@ struct crypt_path_t *prev; /**< Link to previous crypt_path_t in the * circuit. */ - int package_window; /**< How many bytes are we allowed to originate ending + int package_window; /**< How many cells are we allowed to originate ending * at this step? */ - int deliver_window; /**< How many bytes are we willing to deliver originating + int deliver_window; /**< How many cells are we willing to deliver originating * at this step? */ } crypt_path_t; @@ -1691,7 +1986,6 @@ CIPHER_KEY_LEN+\ DH_KEY_LEN) #define ONIONSKIN_REPLY_LEN (DH_KEY_LEN+DIGEST_LEN) -#define REND_COOKIE_LEN DIGEST_LEN /** Information used to build a circuit. */ typedef struct { @@ -1717,11 +2011,32 @@ time_t expiry_time; } cpath_build_state_t; +/** + * The cell_ewma_t structure keeps track of how many cells a circuit has + * transferred recently. It keeps an EWMA (exponentially weighted moving + * average) of the number of cells flushed from the circuit queue onto a + * connection in connection_or_flush_from_first_active_circuit(). + */ +typedef struct { + /** The last 'tick' at which we recalibrated cell_count. + * + * A cell sent at exactly the start of this tick has weight 1.0. Cells sent + * since the start of this tick have weight greater than 1.0; ones sent + * earlier have less weight. */ + unsigned last_adjusted_tick; + /** The EWMA of the cell count. */ + double cell_count; + /** True iff this is the cell count for a circuit's previous + * connection. */ + unsigned int is_for_p_conn : 1; + /** The position of the circuit within the OR connection's priority + * queue. */ + int heap_index; +} cell_ewma_t; + #define ORIGIN_CIRCUIT_MAGIC 0x35315243u #define OR_CIRCUIT_MAGIC 0x98ABC04Fu -typedef uint16_t circid_t; - /** * A circuit is a path over the onion routing * network. Applications can connect to one end of the circuit, and can @@ -1753,14 +2068,12 @@ cell_queue_t n_conn_cells; /** The OR connection that is next in this circuit. */ or_connection_t *n_conn; - /** The identity hash of n_conn. */ - char n_conn_id_digest[DIGEST_LEN]; /** The circuit_id used in the next (forward) hop of this circuit. */ - uint16_t n_circ_id; - /** The port for the OR that is next in this circuit. */ - uint16_t n_port; - /** The IPv4 address of the OR that is next in this circuit. */ - uint32_t n_addr; + circid_t n_circ_id; + + /** The hop to which we want to extend this circuit. Should be NULL if + * the circuit has attached to a connection. */ + extend_info_t *n_hop; /** True iff we are waiting for n_conn_cells to become less full before * allowing p_streams to add any more cells. (Origin circuit only.) */ @@ -1790,6 +2103,7 @@ time_t timestamp_created; /**< When was this circuit created? */ time_t timestamp_dirty; /**< When the circuit was first used, or 0 if the * circuit is clean. */ + struct timeval highres_created; /**< When exactly was the circuit created? */ uint16_t marked_for_close; /**< Should we close this circuit at the end of * the main loop? (If true, holds the line number @@ -1806,8 +2120,20 @@ * linked to an OR connection. */ struct circuit_t *prev_active_on_n_conn; struct circuit_t *next; /**< Next circuit in linked list of all circuits. */ + + /** Unique ID for measuring tunneled network status requests. */ + uint64_t dirreq_id; + + /** The EWMA count for the number of cells flushed from the + * n_conn_cells queue. Used to determine which circuit to flush from next. + */ + cell_ewma_t n_cell_ewma; } circuit_t; +/** Largest number of relay_early cells that we can send on a given + * circuit. */ +#define MAX_RELAY_EARLY_CELLS_PER_CIRCUIT 8 + /** An origin_circuit_t holds data necessary to build and use a circuit. */ typedef struct origin_circuit_t { @@ -1827,38 +2153,33 @@ */ crypt_path_t *cpath; - /** The rend_pk_digest field holds a hash of location-hidden service's - * PK if purpose is S_ESTABLISH_INTRO or S_RENDEZVOUSING. - */ - char rend_pk_digest[DIGEST_LEN]; + /** Holds all rendezvous data on either client or service side. */ + rend_data_t *rend_data; - /** Holds rendezvous cookie if purpose is C_ESTABLISH_REND. Filled with - * zeroes otherwise. - */ - char rend_cookie[REND_COOKIE_LEN]; + /** How many more relay_early cells can we send on this circuit, according + * to the specification? */ + unsigned int remaining_relay_early_cells : 4; + + /** Set if this circuit insanely old and if we already informed the user */ + unsigned int is_ancient : 1; + + /** What commands were sent over this circuit that decremented the + * RELAY_EARLY counter? This is for debugging task 878. */ + uint8_t relay_early_commands[MAX_RELAY_EARLY_CELLS_PER_CIRCUIT]; + + /** How many RELAY_EARLY cells have been sent over this circuit? This is + * for debugging task 878, too. */ + int relay_early_cells_sent; - /** - * The rend_query field holds the y portion of y.onion (nul-terminated) - * if purpose is C_INTRODUCING or C_ESTABLISH_REND, or is a C_GENERAL - * for a hidden service, or is S_*. - */ - char rend_query[REND_SERVICE_ID_LEN_BASE32+1]; - - /** Stores the rendezvous descriptor version if purpose is S_*. Used to - * distinguish introduction and rendezvous points belonging to the same - * rendezvous service ID, but different descriptor versions. - */ - uint8_t rend_desc_version; + /** The next stream_id that will be tried when we're attempting to + * construct a new AP stream originating at this circuit. */ + streamid_t next_stream_id; /* The intro key replaces the hidden service's public key if purpose is * S_ESTABLISH_INTRO or S_INTRO, provided that no unversioned rendezvous * descriptor is used. */ crypto_pk_env_t *intro_key; - /** The next stream_id that will be tried when we're attempting to - * construct a new AP stream originating at this circuit. */ - uint16_t next_stream_id; - /** Quasi-global identifier for this circuit; used for control.c */ /* XXXX NM This can get re-used after 2**32 circuits. */ uint32_t global_identifier; @@ -1890,7 +2211,7 @@ /** Linked list of Exit streams associated with this circuit that are * still being resolved. */ edge_connection_t *resolving_streams; - /** The cipher used by intermediate hops for cells heading toward the + /** The cipher used by intermediate hops for cells heading toward the * OP. */ crypto_cipher_env_t *p_crypto; /** The cipher used by intermediate hops for cells heading away from @@ -1926,8 +2247,25 @@ /* ???? move to a subtype or adjunct structure? Wastes 20 bytes -NM */ char handshake_digest[DIGEST_LEN]; /**< Stores KH for the handshake. */ + /** How many more relay_early cells can we send on this circuit, according + * to the specification? */ + unsigned int remaining_relay_early_cells : 4; + /** True iff this circuit was made with a CREATE_FAST cell. */ unsigned int is_first_hop : 1; + + /** Number of cells that were removed from circuit queue; reset every + * time when writing buffer stats to disk. */ + uint32_t processed_cells; + + /** Total time in milliseconds that cells spent in both app-ward and + * exit-ward queues of this circuit; reset every time when writing + * buffer stats to disk. */ + uint64_t total_cell_waiting_time; + + /** The EWMA count for the number of cells flushed from the + * p_conn_cells queue. */ + cell_ewma_t p_cell_ewma; } or_circuit_t; /** Convert a circuit subtype to a circuit_t.*/ @@ -1951,26 +2289,14 @@ return DOWNCAST(origin_circuit_t, x); } -#define ALLOW_INVALID_ENTRY 1 -#define ALLOW_INVALID_EXIT 2 -#define ALLOW_INVALID_MIDDLE 4 -#define ALLOW_INVALID_RENDEZVOUS 8 -#define ALLOW_INVALID_INTRODUCTION 16 - -/** An entry specifying a set of addresses and ports that should be remapped - * to another address and port before exiting this exit node. */ -typedef struct exit_redirect_t { - /* XXXX_IP6 make this whole mess ipv6-capable. (Does anybody use it? */ - - uint32_t addr; - uint16_t port_min; - uint16_t port_max; - maskbits_t maskbits; - - uint32_t addr_dest; - uint16_t port_dest; - unsigned int is_redirect:1; -} exit_redirect_t; +/** Bitfield type: things that we're willing to use invalid routers for. */ +typedef enum invalid_router_usage_t { + ALLOW_INVALID_ENTRY =1, + ALLOW_INVALID_EXIT =2, + ALLOW_INVALID_MIDDLE =4, + ALLOW_INVALID_RENDEZVOUS =8, + ALLOW_INVALID_INTRODUCTION=16, +} invalid_router_usage_t; /* limits for TCP send and recv buffer size used for constrained sockets */ #define MIN_CONSTRAINED_TCP_BUFFER 2048 @@ -1983,6 +2309,8 @@ struct config_line_t *next; } config_line_t; +typedef struct routerset_t routerset_t; + /** Configuration options for a Tor process. */ typedef struct { uint32_t _magic; @@ -2003,32 +2331,40 @@ char *Address; /**< OR only: configured address for this onion router. */ char *PidFile; /**< Where to store PID of Tor process. */ - char *ExitNodes; /**< Comma-separated list of nicknames of ORs to consider - * as exits. */ - char *EntryNodes; /**< Comma-separated list of nicknames of ORs to consider - * as entry points. */ - int StrictExitNodes; /**< Boolean: When none of our ExitNodes are up, do we - * stop building circuits? */ - int StrictEntryNodes; /**< Boolean: When none of our EntryNodes are up, do we - * stop building circuits? */ - char *ExcludeNodes; /**< Comma-separated list of nicknames of ORs not to - * use in circuits. */ - - char *RendNodes; /**< Comma-separated list of nicknames used as introduction - * points. */ - char *RendExcludeNodes; /**< Comma-separated list of nicknames not to use - * as introduction points. */ + routerset_t *ExitNodes; /**< Structure containing nicknames, digests, + * country codes and IP address patterns of ORs to + * consider as exits. */ + routerset_t *EntryNodes;/**< Structure containing nicknames, digests, + * country codes and IP address patterns of ORs to + * consider as entry points. */ + int StrictNodes; /**< Boolean: When none of our EntryNodes or ExitNodes + * are up, or we need to access a node in ExcludeNodes, + * do we just fail instead? */ + routerset_t *ExcludeNodes;/**< Structure containing nicknames, digests, + * country codes and IP address patterns of ORs + * not to use in circuits. But see StrictNodes + * above. */ + routerset_t *ExcludeExitNodes;/**< Structure containing nicknames, digests, + * country codes and IP address patterns of + * ORs not to consider as exits. */ + + /** Union of ExcludeNodes and ExcludeExitNodes */ + struct routerset_t *_ExcludeExitNodesUnion; + + int DisableAllSwap; /**< Boolean: Attempt to call mlockall() on our + * process for all current and future memory. */ /** List of "entry", "middle", "exit", "introduction", "rendezvous". */ smartlist_t *AllowInvalidNodes; - int _AllowInvalid; /**< Bitmask; derived from AllowInvalidNodes. */ + /** Bitmask; derived from AllowInvalidNodes. */ + invalid_router_usage_t _AllowInvalid; config_line_t *ExitPolicy; /**< Lists of exit policy components. */ int ExitPolicyRejectPrivate; /**< Should we not exit to local addresses? */ config_line_t *SocksPolicy; /**< Lists of socks policy components */ config_line_t *DirPolicy; /**< Lists of dir policy components */ /** Addresses to bind for listening for SOCKS connections. */ config_line_t *SocksListenAddress; - /** Addresses to bind for listening for transparent pf/nefilter + /** Addresses to bind for listening for transparent pf/netfilter * connections. */ config_line_t *TransListenAddress; /** Addresses to bind for listening for transparent natd connections */ @@ -2072,8 +2408,6 @@ * for version 3 directories? */ int HSAuthoritativeDir; /**< Boolean: does this an authoritative directory * handle hidden service requests? */ - int HSAuthorityRecordStats; /**< Boolean: does this HS authoritative - * directory record statistics? */ int NamingAuthoritativeDir; /**< Boolean: is this an authoritative directory * that's willing to bind names? */ int VersioningAuthoritativeDir; /**< Boolean: is this an authoritative @@ -2134,6 +2468,11 @@ int ConstrainedSockets; /**< Shrink xmit and recv socket buffers. */ uint64_t ConstrainedSockSize; /**< Size of constrained buffers. */ + /** Whether we should drop exit streams from Tors that we don't know + * are relays. XXX022 In here for 0.2.2.11 as a temporary test before + * we switch over to putting it in consensusparams. -RD */ + int RefuseUnknownExits; + /** Application ports that require all nodes in circ to have sufficient * uptime. */ smartlist_t *LongLivedPorts; @@ -2163,10 +2502,18 @@ * connections alive? */ int SocksTimeout; /**< How long do we let a socks connection wait * unattached before we fail it? */ - int CircuitBuildTimeout; /**< Cull non-open circuits that were born - * at least this many seconds ago. */ + int LearnCircuitBuildTimeout; /**< If non-zero, we attempt to learn a value + * for CircuitBuildTimeout based on timeout + * history */ + int CircuitBuildTimeout; /**< Cull non-open circuits that were born at + * least this many seconds ago. Used until + * adaptive algorithm learns a new value. */ int CircuitIdleTimeout; /**< Cull open clean circuits that were born * at least this many seconds ago. */ + int CircuitStreamTimeout; /**< If non-zero, detach streams from circuits + * and try a new circuit if the stream has been + * waiting for this many seconds. If zero, use + * our default internal timeout schedule. */ int MaxOnionsPending; /**< How many circuit CREATE requests do we allow * to wait simultaneously before we start dropping * them? */ @@ -2184,24 +2531,37 @@ * willing to use for all relayed conns? */ uint64_t RelayBandwidthBurst; /**< How much bandwidth, at maximum, will we * use in a second for all relayed conns? */ + uint64_t PerConnBWRate; /**< Long-term bw on a single TLS conn, if set. */ + uint64_t PerConnBWBurst; /**< Allowed burst on a single TLS conn, if set. */ int NumCpus; /**< How many CPUs should we try to use? */ int RunTesting; /**< If true, create testing circuits to measure how well the * other ORs are running. */ - char *TestVia; /**< When reachability testing, use these as middle hop. */ config_line_t *RendConfigLines; /**< List of configuration lines * for rendezvous services. */ + config_line_t *HidServAuth; /**< List of configuration lines for client-side + * authorizations for hidden services */ char *ContactInfo; /**< Contact info to be published in the directory. */ char *HttpProxy; /**< hostname[:port] to use as http proxy, if any. */ - uint32_t HttpProxyAddr; /**< Parsed IPv4 addr for http proxy, if any. */ + tor_addr_t HttpProxyAddr; /**< Parsed IPv4 addr for http proxy, if any. */ uint16_t HttpProxyPort; /**< Parsed port for http proxy, if any. */ char *HttpProxyAuthenticator; /**< username:password string, if any. */ char *HttpsProxy; /**< hostname[:port] to use as https proxy, if any. */ - uint32_t HttpsProxyAddr; /**< Parsed IPv4 addr for https proxy, if any. */ + tor_addr_t HttpsProxyAddr; /**< Parsed addr for https proxy, if any. */ uint16_t HttpsProxyPort; /**< Parsed port for https proxy, if any. */ char *HttpsProxyAuthenticator; /**< username:password string, if any. */ + char *Socks4Proxy; /**< hostname:port to use as a SOCKS4 proxy, if any. */ + tor_addr_t Socks4ProxyAddr; /**< Derived from Socks4Proxy. */ + uint16_t Socks4ProxyPort; /**< Derived from Socks4Proxy. */ + + char *Socks5Proxy; /**< hostname:port to use as a SOCKS5 proxy, if any. */ + tor_addr_t Socks5ProxyAddr; /**< Derived from Sock5Proxy. */ + uint16_t Socks5ProxyPort; /**< Derived from Socks5Proxy. */ + char *Socks5ProxyUsername; /**< Username for SOCKS5 authentication, if any */ + char *Socks5ProxyPassword; /**< Password for SOCKS5 authentication, if any */ + /** List of configuration lines for replacement directory authorities. * If you just want to replace one class of authority at a time, * use the "Alternate*Authority" options below instead. */ @@ -2220,9 +2580,6 @@ char *MyFamily; /**< Declared family for this OR. */ config_line_t *NodeFamilies; /**< List of config lines for * node families */ - config_line_t *RedirectExit; /**< List of config lines for simple - * addr/port redirection */ - smartlist_t *RedirectExitList; /**< List of exit_redirect_t */ config_line_t *AuthDirBadDir; /**< Address policy for descriptors to * mark as bad dir mirrors. */ config_line_t *AuthDirBadExit; /**< Address policy for descriptors to @@ -2266,8 +2623,13 @@ * or not (1)? */ int ShutdownWaitLength; /**< When we get a SIGINT and we're a server, how * long do we wait before exiting? */ - int SafeLogging; /**< Boolean: are we allowed to log sensitive strings - * such as addresses (0), or do we scrub them first (1)? */ + char *SafeLogging; /**< Contains "relay", "1", "0" (meaning no scrubbing). */ + + /* Derived from SafeLogging */ + enum { + SAFELOG_SCRUB_ALL, SAFELOG_SCRUB_RELAY, SAFELOG_SCRUB_NONE + } _SafeLogging; + int SafeSocks; /**< Boolean: should we outright refuse application * connections that use socks4 or socks5-with-local-dns? */ #define LOG_PROTOCOL_WARN (get_options()->ProtocolWarnings ? \ @@ -2278,6 +2640,8 @@ * log whether it was DNS-leaking or not? */ int HardwareAccel; /**< Boolean: Should we enable OpenSSL hardware * acceleration where available? */ + char *AccelName; /**< Optional hardware acceleration engine name. */ + char *AccelDir; /**< Optional hardware acceleration engine search dir. */ int UseEntryGuards; /**< Boolean: Do we try to enter from a smallish number * of fixed nodes? */ int NumEntryGuards; /**< How many entry guards do we try to establish? */ @@ -2288,7 +2652,8 @@ * means directly from the authorities) no matter our other config? */ int FetchDirInfoEarly; - smartlist_t *reachable_addr_policy; /**< Parsed from ReachableAddresses */ + /** Should we fetch our dir info at the start of the consensus period? */ + int FetchDirInfoExtraEarly; char *VirtualAddrNetwork; /**< Address and mask to hand out for virtual * MAPADDRESS requests. */ @@ -2302,12 +2667,16 @@ char *ServerDNSResolvConfFile; /**< If provided, we configure our internal * resolver from the file here rather than from * /etc/resolv.conf (Unix) or the registry (Windows). */ + char *DirPortFrontPage; /**< This is a full path to a file with an html + disclaimer. This allows a server administrator to show + that they're running Tor and anyone visiting their server + will know this without any specialized knowledge. */ /** Boolean: if set, we start even if our resolv.conf file is missing * or broken. */ - int ServerDNSAllowBrokenResolvConf; + int ServerDNSAllowBrokenConfig; smartlist_t *ServerDNSTestAddresses; /**< A list of addresses that definitely - * should be resolveable. Used for + * should be resolvable. Used for * testing our DNS server. */ int EnforceDistinctSubnets; /**< If true, don't allow multiple routers in the * same network zone in the same circuit. */ @@ -2324,6 +2693,43 @@ * if we are a cache). For authorities, this is always true. */ int DownloadExtraInfo; + /** If true, and we are acting as a relay, allow exit circuits even when + * we are the first hop of a circuit. */ + int AllowSingleHopExits; + /** If true, don't allow relays with AllowSingleHopExits=1 to be used in + * circuits that we build. */ + int ExcludeSingleHopRelays; + /** If true, and the controller tells us to use a one-hop circuit, and the + * exit allows it, we use it. */ + int AllowSingleHopCircuits; + + /** If true, we convert "www.google.com.foo.exit" addresses on the + * socks/trans/natd ports into "www.google.com" addresses that + * exit from the node "foo". Disabled by default since attacking + * websites and exit relays can use it to manipulate your path + * selection. */ + int AllowDotExit; + + /** If true, we will warn if a user gives us only an IP address + * instead of a hostname. */ + int WarnUnsafeSocks; + + /** If true, the user wants us to collect statistics on clients + * requesting network statuses from us as directory. */ + int DirReqStatistics; + + /** If true, the user wants us to collect statistics on port usage. */ + int ExitPortStatistics; + + /** If true, the user wants us to collect cell statistics. */ + int CellStatistics; + + /** If true, the user wants us to collect statistics as entry node. */ + int EntryStatistics; + + /** If true, include statistics file contents in extra-info documents. */ + int ExtraInfoStatistics; + /** If true, do not believe anybody who tells us that a domain resolves * to an internal address, or that an internal address has a PTR mapping. * Helps avoid some cross-site attacks. */ @@ -2342,6 +2748,40 @@ * migration purposes? */ int V3AuthUseLegacyKey; + /** Location of bandwidth measurement file */ + char *V3BandwidthsFile; + + /** Authority only: key=value pairs that we add to our networkstatus + * consensus vote on the 'params' line. */ + char *ConsensusParams; + + /** The length of time that we think an initial consensus should be fresh. + * Only altered on testing networks. */ + int TestingV3AuthInitialVotingInterval; + + /** The length of time we think it will take to distribute initial votes. + * Only altered on testing networks. */ + int TestingV3AuthInitialVoteDelay; + + /** The length of time we think it will take to distribute initial + * signatures. Only altered on testing networks.*/ + int TestingV3AuthInitialDistDelay; + + /** If an authority has been around for less than this amount of time, it + * does not believe its reachability information is accurate. Only + * altered on testing networks. */ + int TestingAuthDirTimeToLearnReachability; + + /** Clients don't download any descriptor this recent, since it will + * probably not have propagated to enough caches. Only altered on testing + * networks. */ + int TestingEstimatedDescriptorPropagationTime; + + /** If true, we take part in a testing network. Change the defaults of a + * couple of other configuration options and allow to change the values + * of certain configuration options. */ + int TestingTorNetwork; + /** File to check for a consensus networkstatus, if we don't have one * cached. */ char *FallbackNetworkstatusFile; @@ -2350,16 +2790,36 @@ * count of how many client addresses have contacted us so that we can help * the bridge authority guess which countries have blocked access to us. */ int BridgeRecordUsageByCountry; + /** Optionally, a file with GeoIP data. */ char *GeoIPFile; + /** If true, SIGHUP should reload the torrc. Sometimes controllers want + * to make this false. */ + int ReloadTorrcOnSIGHUP; + + /* The main parameter for picking circuits within a connection. + * + * If this value is positive, when picking a cell to relay on a connection, + * we always relay from the circuit whose weighted cell count is lowest. + * Cells are weighted exponentially such that if one cell is sent + * 'CircuitPriorityHalflife' seconds before another, it counts for half as + * much. + * + * If this value is zero, we're disabling the cell-EWMA algorithm. + * + * If this value is negative, we're using the default approach + * according to either Tor or a parameter set in the consensus. + */ + double CircuitPriorityHalflife; + } or_options_t; /** Persistent state for an onion router, as saved to disk. */ typedef struct { uint32_t _magic; /** The time at which we next plan to write the state to the disk. Equal to - * TIME_MAX if there are no saveable changes, 0 if there are changes that + * TIME_MAX if there are no savable changes, 0 if there are changes that * should be saved right away. */ time_t next_write; @@ -2388,6 +2848,17 @@ time_t BWHistoryWriteEnds; int BWHistoryWriteInterval; smartlist_t *BWHistoryWriteValues; + time_t BWHistoryDirReadEnds; + int BWHistoryDirReadInterval; + smartlist_t *BWHistoryDirReadValues; + time_t BWHistoryDirWriteEnds; + int BWHistoryDirWriteInterval; + smartlist_t *BWHistoryDirWriteValues; + + /** Build time histogram */ + config_line_t * BuildtimeHistogram; + unsigned int TotalBuildTimes; + unsigned int CircuitBuildAbandonedCount; /** What version of Tor wrote this state file? */ char *TorVersion; @@ -2449,456 +2920,182 @@ /* all the function prototypes go here */ -/********************************* buffers.c ***************************/ +/********************************* circuitbuild.c **********************/ -buf_t *buf_new(void); -buf_t *buf_new_with_capacity(size_t size); -void buf_free(buf_t *buf); -void buf_clear(buf_t *buf); -void buf_shrink(buf_t *buf); -void buf_shrink_freelists(int free_all); -void buf_dump_freelist_sizes(int severity); - -size_t buf_datalen(const buf_t *buf); -size_t buf_allocation(const buf_t *buf); -size_t buf_slack(const buf_t *buf); -const char *_buf_peek_raw_buffer(const buf_t *buf); - -int read_to_buf(int s, size_t at_most, buf_t *buf, int *reached_eof); -int read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf); - -int flush_buf(int 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 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); -int fetch_from_buf_http(buf_t *buf, - char **headers_out, size_t max_headerlen, - char **body_out, size_t *body_used, size_t max_bodylen, - int force_complete); -int fetch_from_buf_socks(buf_t *buf, socks_request_t *req, - int log_sockstype, int safe_socks); -int fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len); +/** How many hops does a general-purpose circuit have by default? */ +#define DEFAULT_ROUTE_LEN 3 -int peek_buf_has_control0_command(buf_t *buf); +/* Circuit Build Timeout "public" structures. */ -void assert_buf_ok(buf_t *buf); +/** Total size of the circuit timeout history to accumulate. + * 1000 is approx 2.5 days worth of continual-use circuits. */ +#define CBT_NCIRCUITS_TO_OBSERVE 1000 -#ifdef BUFFERS_PRIVATE -int buf_find_string_offset(const buf_t *buf, const char *s, size_t n); -#endif +/** Width of the histogram bins in milliseconds */ +#define CBT_BIN_WIDTH ((build_time_t)50) -/********************************* circuitbuild.c **********************/ +/** Number of modes to use in the weighted-avg computation of Xm */ +#define CBT_DEFAULT_NUM_XM_MODES 3 -char *circuit_list_path(origin_circuit_t *circ, int verbose); -char *circuit_list_path_for_controller(origin_circuit_t *circ); -void circuit_log_path(int severity, unsigned int domain, - origin_circuit_t *circ); -void circuit_rep_hist_note_result(origin_circuit_t *circ); -origin_circuit_t *origin_circuit_init(uint8_t purpose, int flags); -origin_circuit_t *circuit_establish_circuit(uint8_t purpose, - extend_info_t *exit, - int flags); -int circuit_handle_first_hop(origin_circuit_t *circ); -void circuit_n_conn_done(or_connection_t *or_conn, int status); -int inform_testing_reachability(void); -int circuit_send_next_onion_skin(origin_circuit_t *circ); -void circuit_note_clock_jumped(int seconds_elapsed); -int circuit_extend(cell_t *cell, circuit_t *circ); -int circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data, - int reverse); -int circuit_finish_handshake(origin_circuit_t *circ, uint8_t cell_type, - const char *reply); -int circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer); -int onionskin_answer(or_circuit_t *circ, uint8_t cell_type, - const char *payload, const char *keys); -int circuit_all_predicted_ports_handled(time_t now, int *need_uptime, - int *need_capacity); - -int circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *info); -int circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *info); -void onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop); -extend_info_t *extend_info_alloc(const char *nickname, const char *digest, - crypto_pk_env_t *onion_key, - uint32_t addr, uint16_t port); -extend_info_t *extend_info_from_router(routerinfo_t *r); -extend_info_t *extend_info_dup(extend_info_t *info); -void extend_info_free(extend_info_t *info); -routerinfo_t *build_state_get_exit_router(cpath_build_state_t *state); -const char *build_state_get_exit_nickname(cpath_build_state_t *state); - -void entry_guards_compute_status(void); -int entry_guard_register_connect_status(const char *digest, int succeeded, - time_t now); -void entry_nodes_should_be_added(void); -int entry_list_can_grow(or_options_t *options); -routerinfo_t *choose_random_entry(cpath_build_state_t *state); -int entry_guards_parse_state(or_state_t *state, int set, char **msg); -void entry_guards_update_state(or_state_t *state); -int getinfo_helper_entry_guards(control_connection_t *conn, - const char *question, char **answer); - -void clear_bridge_list(void); -int routerinfo_is_a_configured_bridge(routerinfo_t *ri); -void bridge_add_from_config(uint32_t addr, uint16_t port, char *digest); -void retry_bridge_descriptor_fetch_directly(char *digest); -void fetch_bridge_descriptors(time_t now); -void learned_bridge_descriptor(routerinfo_t *ri, int from_cache); -int any_bridge_descriptors_known(void); -int bridges_known_but_down(void); -void bridges_retry_all(void); - -void entry_guards_free_all(void); - -/********************************* circuitlist.c ***********************/ - -circuit_t * _circuit_get_global_list(void); -const char *circuit_state_to_string(int state); -void circuit_dump_by_conn(connection_t *conn, int severity); -void circuit_set_p_circid_orconn(or_circuit_t *circ, uint16_t id, - or_connection_t *conn); -void circuit_set_n_circid_orconn(circuit_t *circ, uint16_t id, - or_connection_t *conn); -void circuit_set_state(circuit_t *circ, uint8_t state); -void circuit_close_all_marked(void); -origin_circuit_t *origin_circuit_new(void); -or_circuit_t *or_circuit_new(uint16_t p_circ_id, or_connection_t *p_conn); -circuit_t *circuit_get_by_circid_orconn(uint16_t circ_id, - or_connection_t *conn); -int circuit_id_in_use_on_orconn(uint16_t circ_id, or_connection_t *conn); -circuit_t *circuit_get_by_edge_conn(edge_connection_t *conn); -void circuit_unlink_all_from_or_conn(or_connection_t *conn, int reason); -origin_circuit_t *circuit_get_by_global_id(uint32_t id); -origin_circuit_t *circuit_get_by_rend_query_and_purpose(const char *rend_query, - uint8_t purpose); -origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start, - const char *digest, uint8_t purpose); -or_circuit_t *circuit_get_rendezvous(const char *cookie); -or_circuit_t *circuit_get_intro_point(const char *digest); -origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose, - extend_info_t *info, int flags); -void circuit_mark_all_unused_circs(void); -void circuit_expire_all_dirty_circs(void); -void _circuit_mark_for_close(circuit_t *circ, int reason, - int line, const char *file); -int circuit_get_cpath_len(origin_circuit_t *circ); -crypt_path_t *circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum); -void circuit_get_all_pending_on_or_conn(smartlist_t *out, - or_connection_t *or_conn); -int circuit_count_pending_on_or_conn(or_connection_t *or_conn); - -#define circuit_mark_for_close(c, reason) \ - _circuit_mark_for_close((c), (reason), __LINE__, _SHORT_FILE_) - -void assert_cpath_layer_ok(const crypt_path_t *cp); -void assert_circuit_ok(const circuit_t *c); -void circuit_free_all(void); - -/********************************* circuituse.c ************************/ - -void circuit_expire_building(time_t now); -void circuit_remove_handled_ports(smartlist_t *needed_ports); -int circuit_stream_is_being_handled(edge_connection_t *conn, uint16_t port, - int min); -void circuit_build_needed_circs(time_t now); -void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn); - -void reset_bandwidth_test(void); -int circuit_enough_testing_circs(void); - -void circuit_has_opened(origin_circuit_t *circ); -void circuit_build_failed(origin_circuit_t *circ); - -/** Flag to set when a circuit should have only a single hop. */ -#define CIRCLAUNCH_ONEHOP_TUNNEL (1<<0) -/** Flag to set when a circuit needs to be built of high-uptime nodes */ -#define CIRCLAUNCH_NEED_UPTIME (1<<1) -/** Flag to set when a circuit needs to be build of high-capcity nodes */ -#define CIRCLAUNCH_NEED_CAPACITY (1<<2) -/** Flag to set when the last hop of a circuit doesn't need to be an - * exit node. */ -#define CIRCLAUNCH_IS_INTERNAL (1<<3) -origin_circuit_t *circuit_launch_by_nickname(uint8_t purpose, - const char *exit_nickname, - int flags); -origin_circuit_t *circuit_launch_by_extend_info(uint8_t purpose, - extend_info_t *info, - int flags); -origin_circuit_t *circuit_launch_by_router(uint8_t purpose, - routerinfo_t *exit, int flags); -void circuit_reset_failure_count(int timeout); -int connection_ap_handshake_attach_chosen_circuit(edge_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath); -int connection_ap_handshake_attach_circuit(edge_connection_t *conn); - -/********************************* command.c ***************************/ - -void command_process_cell(cell_t *cell, or_connection_t *conn); -void command_process_var_cell(var_cell_t *cell, or_connection_t *conn); - -extern uint64_t stats_n_padding_cells_processed; -extern uint64_t stats_n_create_cells_processed; -extern uint64_t stats_n_created_cells_processed; -extern uint64_t stats_n_relay_cells_processed; -extern uint64_t stats_n_destroy_cells_processed; +/** A build_time_t is milliseconds */ +typedef uint32_t build_time_t; -/********************************* config.c ***************************/ +/** + * CBT_BUILD_ABANDONED is our flag value to represent a force-closed + * circuit (Aka a 'right-censored' pareto value). + */ +#define CBT_BUILD_ABANDONED ((build_time_t)(INT32_MAX-1)) +#define CBT_BUILD_TIME_MAX ((build_time_t)(INT32_MAX)) -or_options_t *get_options(void); -int set_options(or_options_t *new_val, char **msg); -void config_free_all(void); -const char *safe_str(const char *address); -const char *escaped_safe_str(const char *address); -const char *get_version(void); - -int config_get_lines(const char *string, config_line_t **result); -void config_free_lines(config_line_t *front); -int options_trial_assign(config_line_t *list, int use_defaults, - int clear_first, char **msg); -int resolve_my_address(int warn_severity, or_options_t *options, - uint32_t *addr, char **hostname_out); -int is_local_IP(uint32_t ip) ATTR_PURE; -void options_init(or_options_t *options); -int options_init_from_torrc(int argc, char **argv); -int option_is_recognized(const char *key); -const char *option_get_canonical_name(const char *key); -config_line_t *option_get_assignment(or_options_t *options, - const char *key); -int options_save_current(void); -const char *get_torrc_fname(void); -char *get_datadir_fname2_suffix(const char *sub1, const char *sub2, - const char *suffix); -/** Return a newly allocated string containing datadir/sub1. See - * get_datadir_fname2_suffix. */ -#define get_datadir_fname(sub1) get_datadir_fname2_suffix((sub1), NULL, NULL) -/** Return a newly allocated string containing datadir/sub1/sub2. See - * get_datadir_fname2_suffix. */ -#define get_datadir_fname2(sub1,sub2) \ - get_datadir_fname2_suffix((sub1), (sub2), NULL) -/** Return a newly allocated string containing datadir/sub1suffix. See - * get_datadir_fname2_suffix. */ -#define get_datadir_fname_suffix(sub1, suffix) \ - get_datadir_fname2_suffix((sub1), NULL, (suffix)) - -or_state_t *get_or_state(void); -int or_state_save(time_t now); - -int getinfo_helper_config(control_connection_t *conn, - const char *question, char **answer); - -#ifdef CONFIG_PRIVATE -/* Used only by config.c and test.c */ -or_options_t *options_new(void); -#endif +/** Save state every 10 circuits */ +#define CBT_SAVE_STATE_EVERY 10 -/********************************* connection.c ***************************/ +/* Circuit Build Timeout network liveness constants */ -const char *conn_type_to_string(int type); -const char *conn_state_to_string(int type, int state); +/** + * Have we received a cell in the last N circ attempts? + * + * This tells us when to temporarily switch back to + * BUILD_TIMEOUT_INITIAL_VALUE until we start getting cells, + * at which point we switch back to computing the timeout from + * our saved history. + */ +#define CBT_NETWORK_NONLIVE_TIMEOUT_COUNT 3 -connection_t *connection_new(int type, int socket_family); -void connection_link_connections(connection_t *conn_a, connection_t *conn_b); -void connection_unregister_events(connection_t *conn); -void connection_free(connection_t *conn); -void connection_free_all(void); -void connection_about_to_close_connection(connection_t *conn); -void connection_close_immediate(connection_t *conn); -void _connection_mark_for_close(connection_t *conn,int line, const char *file); - -#define connection_mark_for_close(c) \ - _connection_mark_for_close((c), __LINE__, _SHORT_FILE_) - -void connection_expire_held_open(void); - -int connection_connect(connection_t *conn, const char *address, uint32_t addr, - uint16_t port); -int retry_all_listeners(smartlist_t *replaced_conns, - smartlist_t *new_conns); - -ssize_t connection_bucket_write_limit(connection_t *conn, time_t now); -int global_write_bucket_low(connection_t *conn, size_t attempt, int priority); -void connection_bucket_init(void); -void connection_bucket_refill(int seconds_elapsed, time_t now); - -int connection_handle_read(connection_t *conn); - -int connection_fetch_from_buf(char *string, size_t len, connection_t *conn); - -int connection_wants_to_flush(connection_t *conn); -int connection_outbuf_too_full(connection_t *conn); -int connection_handle_write(connection_t *conn, int force); -void _connection_write_to_buf_impl(const char *string, size_t len, - connection_t *conn, int zlib); -static void connection_write_to_buf(const char *string, size_t len, - connection_t *conn); -static void connection_write_to_buf_zlib(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_impl(string, len, TO_CONN(conn), done ? -1 : 1); -} +/** + * This tells us when to toss out the last streak of N timeouts. + * + * If instead we start getting cells, we switch back to computing the timeout + * from our saved history. + */ +#define CBT_NETWORK_NONLIVE_DISCARD_COUNT (CBT_NETWORK_NONLIVE_TIMEOUT_COUNT*2) -connection_t *connection_get_by_global_id(uint64_t id); +/* Circuit build times consensus parameters */ -connection_t *connection_get_by_type(int type); -connection_t *connection_get_by_type_purpose(int type, int purpose); -connection_t *connection_get_by_type_addr_port_purpose(int type, uint32_t addr, - uint16_t port, int purpose); -connection_t *connection_get_by_type_state(int type, int state); -connection_t *connection_get_by_type_state_rendquery(int type, int state, - const char *rendquery, - int rendversion); - -#define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR) -int connection_is_listener(connection_t *conn); -int connection_state_is_open(connection_t *conn); -int connection_state_is_connecting(connection_t *conn); - -char *alloc_http_authenticator(const char *authenticator); - -void assert_connection_ok(connection_t *conn, time_t now); -int connection_or_nonopen_was_started_here(or_connection_t *conn); -void connection_dump_buffer_mem_stats(int severity); -void remove_file_if_very_old(const char *fname, time_t now); +/** + * How long to wait before actually closing circuits that take too long to + * build in terms of CDF quantile. + */ +#define CBT_DEFAULT_CLOSE_QUANTILE 95 -/********************************* connection_edge.c *************************/ +/** + * How many circuits count as recent when considering if the + * connection has gone gimpy or changed. + */ +#define CBT_DEFAULT_RECENT_CIRCUITS 20 -#define connection_mark_unattached_ap(conn, endreason) \ - _connection_mark_unattached_ap((conn), (endreason), __LINE__, _SHORT_FILE_) +/** + * Maximum count of timeouts that finish the first hop in the past + * RECENT_CIRCUITS before calculating a new timeout. + * + * This tells us to abandon timeout history and set + * the timeout back to BUILD_TIMEOUT_INITIAL_VALUE. + */ +#define CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT (CBT_DEFAULT_RECENT_CIRCUITS*9/10) -void _connection_mark_unattached_ap(edge_connection_t *conn, int endreason, - int line, const char *file); -int connection_edge_reached_eof(edge_connection_t *conn); -int connection_edge_process_inbuf(edge_connection_t *conn, - int package_partial); -int connection_edge_destroy(uint16_t circ_id, edge_connection_t *conn); -int connection_edge_end(edge_connection_t *conn, char reason); -int connection_edge_end_errno(edge_connection_t *conn); -int connection_edge_finished_flushing(edge_connection_t *conn); -int connection_edge_finished_connecting(edge_connection_t *conn); - -int connection_ap_handshake_send_begin(edge_connection_t *ap_conn); -int connection_ap_handshake_send_resolve(edge_connection_t *ap_conn); - -edge_connection_t *connection_ap_make_link(char *address, uint16_t port, - const char *digest, - int use_begindir, int want_onehop); -void connection_ap_handshake_socks_reply(edge_connection_t *conn, char *reply, - size_t replylen, - int endreason); -void connection_ap_handshake_socks_resolved(edge_connection_t *conn, - int answer_type, - size_t answer_len, - const char *answer, - int ttl, - time_t expires); - -int connection_exit_begin_conn(cell_t *cell, circuit_t *circ); -int connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ); -void connection_exit_connect(edge_connection_t *conn); -int connection_edge_is_rendezvous_stream(edge_connection_t *conn); -int connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit); -void connection_ap_expire_beginning(void); -void connection_ap_attach_pending(void); -void connection_ap_fail_onehop(const char *failed_digest, - cpath_build_state_t *build_state); -void circuit_discard_optional_exit_enclaves(extend_info_t *info); -int connection_ap_detach_retriable(edge_connection_t *conn, - origin_circuit_t *circ, - int reason); -int connection_ap_process_transparent(edge_connection_t *conn); - -int address_is_invalid_destination(const char *address, int client); - -void addressmap_init(void); -void addressmap_clean(time_t now); -void addressmap_clear_configured(void); -void addressmap_clear_transient(void); -void addressmap_free_all(void); -int addressmap_rewrite(char *address, size_t maxlen, time_t *expires_out); -int addressmap_have_mapping(const char *address); -typedef enum { - ADDRMAPSRC_CONTROLLER, ADDRMAPSRC_TORRC, ADDRMAPSRC_TRACKEXIT, - ADDRMAPSRC_DNS, -} addressmap_entry_source_t; -void addressmap_register(const char *address, char *new_address, - time_t expires, addressmap_entry_source_t source); -int parse_virtual_addr_network(const char *val, int validate_only, - char **msg); -int client_dns_incr_failures(const char *address); -void client_dns_clear_failures(const char *address); -void client_dns_set_addressmap(const char *address, uint32_t val, - const char *exitname, int ttl); -const char *addressmap_register_virtual_address(int type, char *new_address); -void addressmap_get_mappings(smartlist_t *sl, time_t min_expires, - time_t max_expires, int want_expiry); -int connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath); -int hostname_is_noconnect_address(const char *address); - -void set_exit_redirects(smartlist_t *lst); -typedef enum hostname_type_t { - NORMAL_HOSTNAME, ONION_HOSTNAME, EXIT_HOSTNAME, BAD_HOSTNAME -} hostname_type_t; -hostname_type_t parse_extended_hostname(char *address); +/** Minimum circuits before estimating a timeout */ +#define CBT_DEFAULT_MIN_CIRCUITS_TO_OBSERVE 100 + +/** Cutoff percentile on the CDF for our timeout estimation. */ +#define CBT_DEFAULT_QUANTILE_CUTOFF 80 +double circuit_build_times_quantile_cutoff(void); + +/** How often in seconds should we build a test circuit */ +#define CBT_DEFAULT_TEST_FREQUENCY 60 + +/** Lowest allowable value for CircuitBuildTimeout in milliseconds */ +#define CBT_DEFAULT_TIMEOUT_MIN_VALUE (2*1000) -#if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H) -int get_pf_socket(void); +/** Initial circuit build timeout in milliseconds */ +#define CBT_DEFAULT_TIMEOUT_INITIAL_VALUE (60*1000) +int32_t circuit_build_times_initial_timeout(void); + +#if CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT < 1 || \ + CBT_NETWORK_NONLIVE_DISCARD_COUNT < 1 || \ + CBT_NETWORK_NONLIVE_TIMEOUT_COUNT < 1 +#error "RECENT_CIRCUITS is set too low." #endif -/********************************* connection_or.c ***************************/ +/** Information about the state of our local network connection */ +typedef struct { + /** The timestamp we last completed a TLS handshake or received a cell */ + time_t network_last_live; + /** If the network is not live, how many timeouts has this caused? */ + int nonlive_timeouts; + /** If the network is not live, have we yet discarded our history? */ + int nonlive_discarded; + /** Circular array of circuits that have made it to the first hop. Slot is + * 1 if circuit timed out, 0 if circuit succeeded */ + int8_t *timeouts_after_firsthop; + /** Number of elements allocated for the above array */ + int num_recent_circs; + /** Index into circular array. */ + int after_firsthop_idx; + /** Timeout gathering is suspended if non-zero. The old timeout value + * is stored here in that case. */ + double suspended_timeout; + /** Timeout gathering is suspended if non-zero. The old close value + * is stored here in that case. */ + double suspended_close_timeout; +} network_liveness_t; -void connection_or_remove_from_identity_map(or_connection_t *conn); -void connection_or_clear_identity_map(void); -or_connection_t *connection_or_get_by_identity_digest(const char *digest); - -int connection_or_reached_eof(or_connection_t *conn); -int connection_or_process_inbuf(or_connection_t *conn); -int connection_or_flushed_some(or_connection_t *conn); -int connection_or_finished_flushing(or_connection_t *conn); -int connection_or_finished_connecting(or_connection_t *conn); - -or_connection_t *connection_or_connect(uint32_t addr, uint16_t port, - const char *id_digest); - -int connection_tls_start_handshake(or_connection_t *conn, int receiving); -int connection_tls_continue_handshake(or_connection_t *conn); - -void or_handshake_state_free(or_handshake_state_t *state); -int connection_or_set_state_open(or_connection_t *conn); -void connection_or_write_cell_to_buf(const cell_t *cell, - or_connection_t *conn); -void connection_or_write_var_cell_to_buf(const var_cell_t *cell, - or_connection_t *conn); -int connection_or_send_destroy(uint16_t circ_id, or_connection_t *conn, - int reason); -int connection_or_send_netinfo(or_connection_t *conn); -int connection_or_send_cert(or_connection_t *conn); -int connection_or_send_link_auth(or_connection_t *conn); -int connection_or_compute_link_auth_hmac(or_connection_t *conn, - char *hmac_out); -int is_or_protocol_version_known(uint16_t version); - -void cell_pack(packed_cell_t *dest, const cell_t *src); -void var_cell_pack_header(const var_cell_t *cell, char *hdr_out); -var_cell_t *var_cell_new(uint16_t payload_len); -void var_cell_free(var_cell_t *cell); +/** Structure for circuit build times history */ +typedef struct { + /** The circular array of recorded build times in milliseconds */ + build_time_t circuit_build_times[CBT_NCIRCUITS_TO_OBSERVE]; + /** Current index in the circuit_build_times circular array */ + int build_times_idx; + /** Total number of build times accumulated. Max CBT_NCIRCUITS_TO_OBSERVE */ + int total_build_times; + /** Information about the state of our local network connection */ + network_liveness_t liveness; + /** Last time we built a circuit. Used to decide to build new test circs */ + time_t last_circ_at; + /** "Minimum" value of our pareto distribution (actually mode) */ + build_time_t Xm; + /** alpha exponent for pareto dist. */ + double alpha; + /** Have we computed a timeout? */ + int have_computed_timeout; + /** The exact value for that timeout in milliseconds. Stored as a double + * to maintain precision from calculations to and from quantile value. */ + double timeout_ms; + /** How long we wait before actually closing the circuit. */ + double close_ms; +} circuit_build_times_t; + +/********************************* config.c ***************************/ + +/** An error from options_trial_assign() or options_init_from_string(). */ +typedef enum setopt_err_t { + SETOPT_OK = 0, + SETOPT_ERR_MISC = -1, + SETOPT_ERR_PARSE = -2, + SETOPT_ERR_TRANSITION = -3, + SETOPT_ERR_SETTING = -4, +} setopt_err_t; + +/********************************* connection_edge.c *************************/ + +/** Enumerates possible origins of a client-side address mapping. */ +typedef enum { + /** We're remapping this address because the controller told us to. */ + ADDRMAPSRC_CONTROLLER, + /** We're remapping this address because our configuration (via torrc, the + * command line, or a SETCONF command) told us to. */ + ADDRMAPSRC_TORRC, + /** We're remapping this address because we have TrackHostExit configured, + * and we want to remember to use the same exit next time. */ + ADDRMAPSRC_TRACKEXIT, + /** We're remapping this address because we got a DNS resolution from a + * Tor server that told us what its value was. */ + ADDRMAPSRC_DNS, +} addressmap_entry_source_t; /********************************* control.c ***************************/ +/** Used to indicate the type of a circuit event passed to the controller. + * The various types are defined in control-spec.txt */ typedef enum circuit_status_event_t { CIRC_EVENT_LAUNCHED = 0, CIRC_EVENT_BUILT = 1, @@ -2907,6 +3104,8 @@ CIRC_EVENT_CLOSED = 4, } circuit_status_event_t; +/** Used to indicate the type of a stream event passed to the controller. + * The various types are defined in control-spec.txt */ typedef enum stream_status_event_t { STREAM_EVENT_SENT_CONNECT = 0, STREAM_EVENT_SENT_RESOLVE = 1, @@ -2919,6 +3118,8 @@ STREAM_EVENT_REMAP = 8 } stream_status_event_t; +/** Used to indicate the type of an OR connection event passed to the + * controller. The various types are defined in control-spec.txt */ typedef enum or_conn_status_event_t { OR_CONN_EVENT_LAUNCHED = 0, OR_CONN_EVENT_CONNECTED = 1, @@ -2927,8 +3128,14 @@ OR_CONN_EVENT_NEW = 4, } or_conn_status_event_t; -void control_update_global_event_mask(void); -void control_adjust_event_log_severity(void); +/** Used to indicate the type of a buildtime event */ +typedef enum buildtimeout_set_event_t { + BUILDTIMEOUT_SET_EVENT_COMPUTED = 0, + BUILDTIMEOUT_SET_EVENT_RESET = 1, + BUILDTIMEOUT_SET_EVENT_SUSPENDED = 2, + BUILDTIMEOUT_SET_EVENT_DISCARD = 3, + BUILDTIMEOUT_SET_EVENT_RESUME = 4 +} buildtimeout_set_event_t; /** Execute the statement stmt, which may log events concerning the * connection conn. To prevent infinite loops, disable log messages @@ -2946,256 +3153,50 @@ enable_control_logging(); \ STMT_END -/** Log information about the connection conn, protecting it as with - * CONN_LOG_PROTECT. Example: - * - * LOG_FN_CONN(conn, (LOG_DEBUG, "Socket %d wants to write", conn->s)); - **/ -#define LOG_FN_CONN(conn, args) \ - CONN_LOG_PROTECT(conn, log_fn args) - -int connection_control_finished_flushing(control_connection_t *conn); -int connection_control_reached_eof(control_connection_t *conn); -int connection_control_process_inbuf(control_connection_t *conn); - -#define EVENT_AUTHDIR_NEWDESCS 0x000D -#define EVENT_NS 0x000F -int control_event_is_interesting(int event); - -int control_event_circuit_status(origin_circuit_t *circ, - circuit_status_event_t e, int reason); -int control_event_stream_status(edge_connection_t *conn, - stream_status_event_t e, - int reason); -int control_tls_error_to_reason(int e); -int control_event_or_conn_status(or_connection_t *conn, - or_conn_status_event_t e, int reason); -int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written); -int control_event_stream_bandwidth_used(void); -void control_event_logmsg(int severity, unsigned int domain, const char *msg); -int control_event_descriptors_changed(smartlist_t *routers); -int control_event_address_mapped(const char *from, const char *to, - time_t expires, const char *error); -int control_event_or_authdir_new_descriptor(const char *action, - const char *desc, - size_t desclen, - const char *msg); -int control_event_my_descriptor_changed(void); -int control_event_networkstatus_changed(smartlist_t *statuses); -int control_event_networkstatus_changed_single(routerstatus_t *rs); -int control_event_general_status(int severity, const char *format, ...) - CHECK_PRINTF(2,3); -int control_event_client_status(int severity, const char *format, ...) - CHECK_PRINTF(2,3); -int control_event_server_status(int severity, const char *format, ...) - CHECK_PRINTF(2,3); -int control_event_guard(const char *nickname, const char *digest, - const char *status); - -int init_cookie_authentication(int enabled); -smartlist_t *decode_hashed_passwords(config_line_t *passwords); -void disable_control_logging(void); -void enable_control_logging(void); - -#ifdef CONTROL_PRIVATE -/* Used only by control.c and test.c */ -size_t write_escaped_data(const char *data, size_t len, char **out); -size_t read_escaped_data(const char *data, size_t len, char **out); -#endif - -/********************************* cpuworker.c *****************************/ - -void cpu_init(void); -void cpuworkers_rotate(void); -int connection_cpu_finished_flushing(connection_t *conn); -int connection_cpu_reached_eof(connection_t *conn); -int connection_cpu_process_inbuf(connection_t *conn); -int assign_onionskin_to_cpuworker(connection_t *cpuworker, - or_circuit_t *circ, - char *onionskin); +/** Enum describing various stages of bootstrapping, for use with controller + * bootstrap status events. The values range from 0 to 100. */ +typedef enum { + BOOTSTRAP_STATUS_UNDEF=-1, + BOOTSTRAP_STATUS_STARTING=0, + BOOTSTRAP_STATUS_CONN_DIR=5, + BOOTSTRAP_STATUS_HANDSHAKE=-2, + BOOTSTRAP_STATUS_HANDSHAKE_DIR=10, + BOOTSTRAP_STATUS_ONEHOP_CREATE=15, + BOOTSTRAP_STATUS_REQUESTING_STATUS=20, + BOOTSTRAP_STATUS_LOADING_STATUS=25, + BOOTSTRAP_STATUS_LOADING_KEYS=40, + BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS=45, + BOOTSTRAP_STATUS_LOADING_DESCRIPTORS=50, + BOOTSTRAP_STATUS_CONN_OR=80, + BOOTSTRAP_STATUS_HANDSHAKE_OR=85, + BOOTSTRAP_STATUS_CIRCUIT_CREATE=90, + BOOTSTRAP_STATUS_DONE=100 +} bootstrap_status_t; /********************************* directory.c ***************************/ -int directories_have_accepted_server_descriptor(void); -char *authority_type_to_string(authority_type_t auth); -void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, - authority_type_t type, const char *payload, - size_t payload_len, size_t extrainfo_len); -void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, - const char *resource, - int retry_if_no_servers); -void directory_get_from_all_authorities(uint8_t dir_purpose, - uint8_t router_purpose, - const char *resource); -void directory_initiate_command_routerstatus(routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - int anonymized_connection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since); - -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_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_request_failed(dir_connection_t *conn); -void directory_initiate_command(const char *address, uint32_t addr, - uint16_t or_port, uint16_t dir_port, - int supports_begindir, const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, - int anonymized_connection, - const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since); - -int dir_split_resource_into_fingerprints(const char *resource, - smartlist_t *fp_out, int *compresseed_out, - int decode_hex, int sort_uniq); -char *directory_dump_request_log(void); -int router_supports_extrainfo(const char *identity_digest, int is_authority); - -time_t download_status_increment_failure(download_status_t *dls, - int status_code, const char *item, - int server, time_t now); -#define download_status_failed(dls, sc) \ - download_status_increment_failure((dls), (sc), NULL, \ - get_options()->DirPort, time(NULL)) - -void download_status_reset(download_status_t *dls); -static int download_status_is_ready(download_status_t *dls, time_t now, - int max_failures); -/** Return true iff, as of now, the resource tracked by dls is - * ready to get its download reattempted. */ -static INLINE int -download_status_is_ready(download_status_t *dls, time_t now, - int max_failures) -{ - return (dls->n_download_failures <= max_failures - && dls->next_attempt_at <= now); -} +/** A pair of digests created by dir_split_resource_info_fingerprint_pairs() */ +typedef struct { + char first[DIGEST_LEN]; + char second[DIGEST_LEN]; +} fp_pair_t; /********************************* dirserv.c ***************************/ -/** Maximum allowable length of a version line in a networkstatus. */ -#define MAX_V_LINE_LEN 128 -/** Length of "r Authority BadDirectory BadExit Exit Fast Guard HSDir Named - * Running Stable Unnamed V2Dir Valid\n". */ -#define MAX_FLAG_LINE_LEN 96 -/** Amount of space to allocate for each entry: r, s, and v lines. */ -#define RS_ENTRY_LEN \ - ( /* first line */ \ - MAX_NICKNAME_LEN+BASE64_DIGEST_LEN*2+ISO_TIME_LEN+INET_NTOA_BUF_LEN+ \ - 5*2 /* ports */ + 10 /* punctuation */ + \ - /* second line */ \ - MAX_FLAG_LINE_LEN + \ - /* v line. */ \ - MAX_V_LINE_LEN \ - ) -#define UNNAMED_ROUTER_NICKNAME "Unnamed" - -int connection_dirserv_flushed_some(dir_connection_t *conn); - -int dirserv_add_own_fingerprint(const char *nickname, crypto_pk_env_t *pk); -int dirserv_load_fingerprint_file(void); -void dirserv_free_fingerprint_list(void); -const char *dirserv_get_nickname_by_digest(const char *digest); -int dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose, - const char *source, - const char **msg); -int dirserv_add_descriptor(routerinfo_t *ri, const char **msg); -int getinfo_helper_dirserv_unregistered(control_connection_t *conn, - const char *question, char **answer); -void dirserv_free_descriptors(void); -void dirserv_set_router_is_running(routerinfo_t *router, time_t now); -int list_server_status_v1(smartlist_t *routers, char **router_status_out, - int for_controller); -int dirserv_dump_directory_to_string(char **dir_out, - crypto_pk_env_t *private_key); - -int directory_fetches_from_authorities(or_options_t *options); -int directory_fetches_dir_info_early(or_options_t *options); -int directory_fetches_dir_info_later(or_options_t *options); -int directory_caches_v2_dir_info(or_options_t *options); -#define directory_caches_v1_dir_info(o) directory_caches_v2_dir_info(o) -int directory_caches_dir_info(or_options_t *options); -int directory_permits_begindir_requests(or_options_t *options); -int directory_permits_controller_requests(or_options_t *options); -int directory_too_idle_to_fetch_descriptors(or_options_t *options, time_t now); - -void directory_set_dirty(void); -cached_dir_t *dirserv_get_directory(void); -cached_dir_t *dirserv_get_runningrouters(void); -cached_dir_t *dirserv_get_consensus(void); -void dirserv_set_cached_directory(const char *directory, time_t when, - int is_running_routers); -void dirserv_set_cached_networkstatus_v2(const char *directory, - const char *identity, - time_t published); -void dirserv_set_cached_networkstatus_v3(const char *consensus, - time_t published); -void dirserv_clear_old_networkstatuses(time_t cutoff); -void dirserv_clear_old_v1_info(time_t now); -void dirserv_get_networkstatus_v2(smartlist_t *result, const char *key); -void dirserv_get_networkstatus_v2_fingerprints(smartlist_t *result, - const char *key); -int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, - const char **msg, - int for_unencrypted_conn); -int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, - const char **msg); -void dirserv_orconn_tls_done(const char *address, - uint16_t or_port, - const char *digest_rcvd, - int as_advertised); -void dirserv_test_reachability(time_t now, int try_all); -int authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, - int complain); -int dirserv_would_reject_router(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); -size_t dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, - int compressed); -int routerstatus_format_entry(char *buf, size_t buf_len, - routerstatus_t *rs, const char *platform, - int first_line_only); -void dirserv_free_all(void); -void cached_dir_decref(cached_dir_t *d); -cached_dir_t *new_cached_dir(char *s, time_t published); - -/********************************* dirvote.c ************************/ +typedef enum { + NS_V2, NS_V3_CONSENSUS, NS_V3_VOTE, NS_CONTROL_PORT, + NS_V3_CONSENSUS_MICRODESC +} routerstatus_format_type_t; + +#ifdef DIRSERV_PRIVATE +typedef struct measured_bw_line_t { + char node_id[DIGEST_LEN]; + char node_hex[MAX_HEX_NICKNAME_LEN+1]; + long int bw; +} measured_bw_line_t; -/** Lowest allowable value for VoteSeconds. */ -#define MIN_VOTE_SECONDS 20 -/** Lowest allowable value for DistSeconds. */ -#define MIN_DIST_SECONDS 20 -/** Smallest allowable voting interval. */ -#define MIN_VOTE_INTERVAL 300 - -/** If there is no consensus, what interval do we default to? */ -#define DEFAULT_VOTING_INTERVAL_WHEN_NO_CONSENSUS (30*60) - -void dirvote_free_all(void); - -/* vote manipulation */ -char *networkstatus_compute_consensus(smartlist_t *votes, - int total_authorities, - crypto_pk_env_t *identity_key, - crypto_pk_env_t *signing_key, - const char *legacy_identity_key_digest, - crypto_pk_env_t *legacy_signing_key); -int networkstatus_add_detached_signatures(networkstatus_t *target, - ns_detached_signatures_t *sigs, - const char **msg_out); -char *networkstatus_get_detached_signatures(networkstatus_t *consensus); -void ns_detached_signatures_free(ns_detached_signatures_t *s); +#endif -/* cert manipulation */ -authority_cert_t *authority_cert_dup(authority_cert_t *cert); +/********************************* dirvote.c ************************/ /** Describes the schedule by which votes should be generated. */ typedef struct vote_timing_t { @@ -3204,158 +3205,93 @@ int vote_delay; int dist_delay; } vote_timing_t; -/* vote scheduling */ -void dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out); -time_t dirvote_get_start_of_next_interval(time_t now, int interval); -void dirvote_recalculate_timing(or_options_t *options, time_t now); -void dirvote_act(or_options_t *options, time_t now); - -/* invoked on timers and by outside triggers. */ -struct pending_vote_t * dirvote_add_vote(const char *vote_body, - const char **msg_out, - int *status_out); -int dirvote_add_signatures(const char *detached_signatures_body, - const char *source, - const char **msg_out); - -/* Item access */ -const char *dirvote_get_pending_consensus(void); -const char *dirvote_get_pending_detached_signatures(void); -#define DGV_BY_ID 1 -#define DGV_INCLUDE_PENDING 2 -#define DGV_INCLUDE_PREVIOUS 4 -const cached_dir_t *dirvote_get_vote(const char *fp, int flags); -void set_routerstatus_from_routerinfo(routerstatus_t *rs, - routerinfo_t *ri, time_t now, - int naming, int exits_can_be_guards, - int listbadexits, int listbaddirs); -void router_clear_status_flags(routerinfo_t *ri); -networkstatus_t * -dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key, - authority_cert_t *cert); - -#ifdef DIRVOTE_PRIVATE -char * -format_networkstatus_vote(crypto_pk_env_t *private_key, - networkstatus_t *v3_ns); -#endif -/********************************* dns.c ***************************/ +/********************************* geoip.c **************************/ -int dns_init(void); -int has_dns_init_failed(void); -void dns_free_all(void); -uint32_t dns_clip_ttl(uint32_t ttl); -int dns_reset(void); -void connection_dns_remove(edge_connection_t *conn); -void assert_connection_edge_not_dns_pending(edge_connection_t *conn); -void assert_all_pending_dns_resolves_ok(void); -void dns_cancel_pending_resolve(const char *question); -int dns_resolve(edge_connection_t *exitconn); -void dns_launch_correctness_checks(void); -int dns_seems_to_be_broken(void); -void dns_reset_correctness_checks(void); -int parse_inaddr_arpa_address(const char *address, struct in_addr *in); - -/********************************* dnsserv.c ************************/ - -void dnsserv_configure_listener(connection_t *conn); -void dnsserv_close_listener(connection_t *conn); -void dnsserv_resolved(edge_connection_t *conn, - int answer_type, - size_t answer_len, - const char *answer, - int ttl); -void dnsserv_reject_request(edge_connection_t *conn); -int dnsserv_launch_request(const char *name, int is_reverse); +/** Round all GeoIP results to the next multiple of this value, to avoid + * leaking information. */ +#define DIR_RECORD_USAGE_GRANULARITY 8 +/** Time interval: Flush geoip data to disk this often. */ +#define DIR_ENTRY_RECORD_USAGE_RETAIN_IPS (24*60*60) +/** How long do we have to have observed per-country request history before + * we are willing to talk about it? */ +#define DIR_RECORD_USAGE_MIN_OBSERVATION_TIME (12*60*60) + +/** Indicates an action that we might be noting geoip statistics on. + * Note that if we're noticing CONNECT, we're a bridge, and if we're noticing + * the others, we're not. + */ +typedef enum { + /** We've noticed a connection as a bridge relay or entry guard. */ + GEOIP_CLIENT_CONNECT = 0, + /** We've served a networkstatus consensus as a directory server. */ + GEOIP_CLIENT_NETWORKSTATUS = 1, + /** We've served a v2 networkstatus consensus as a directory server. */ + GEOIP_CLIENT_NETWORKSTATUS_V2 = 2, +} geoip_client_action_t; +/** Indicates either a positive reply or a reason for rejectng a network + * status request that will be included in geoip statistics. */ +typedef enum { + /** Request is answered successfully. */ + GEOIP_SUCCESS = 0, + /** V3 network status is not signed by a sufficient number of requested + * authorities. */ + GEOIP_REJECT_NOT_ENOUGH_SIGS = 1, + /** Requested network status object is unavailable. */ + GEOIP_REJECT_UNAVAILABLE = 2, + /** Requested network status not found. */ + GEOIP_REJECT_NOT_FOUND = 3, + /** Network status has not been modified since If-Modified-Since time. */ + GEOIP_REJECT_NOT_MODIFIED = 4, + /** Directory is busy. */ + GEOIP_REJECT_BUSY = 5, +} geoip_ns_response_t; +#define GEOIP_NS_RESPONSE_NUM 6 -/********************************* geoip.c **************************/ +/** Directory requests that we are measuring can be either direct or + * tunneled. */ +typedef enum { + DIRREQ_DIRECT = 0, + DIRREQ_TUNNELED = 1, +} dirreq_type_t; -#ifdef GEOIP_PRIVATE -int geoip_parse_entry(const char *line); -#endif -int should_record_bridge_info(or_options_t *options); -int geoip_load_file(const char *filename, or_options_t *options); -int geoip_get_country_by_ip(uint32_t ipaddr); -int geoip_get_n_countries(void); -const char *geoip_get_country_name(int num); -int geoip_is_loaded(void); -void geoip_note_client_seen(uint32_t addr, time_t now); -void geoip_remove_old_clients(time_t cutoff); -time_t geoip_get_history_start(void); -char *geoip_get_client_history(time_t now); -int getinfo_helper_geoip(control_connection_t *control_conn, - const char *question, char **answer); -void geoip_free_all(void); - -/********************************* hibernate.c **********************/ - -int accounting_parse_options(or_options_t *options, int validate_only); -int accounting_is_enabled(or_options_t *options); -void configure_accounting(time_t now); -void accounting_run_housekeeping(time_t now); -void accounting_add_bytes(size_t n_read, size_t n_written, int seconds); -int accounting_record_bandwidth_usage(time_t now, or_state_t *state); -void hibernate_begin_shutdown(void); -int we_are_hibernating(void); -void consider_hibernation(time_t now); -int getinfo_helper_accounting(control_connection_t *conn, - const char *question, char **answer); -void accounting_set_bandwidth_usage_from_state(or_state_t *state); - -/********************************* main.c ***************************/ - -extern int has_completed_circuit; - -int connection_add(connection_t *conn); -int connection_remove(connection_t *conn); -int connection_in_array(connection_t *conn); -void add_connection_to_closeable_list(connection_t *conn); -int connection_is_on_closeable_list(connection_t *conn); - -smartlist_t *get_connection_array(void); - -void connection_watch_events(connection_t *conn, short events); -int connection_is_reading(connection_t *conn); -void connection_stop_reading(connection_t *conn); -void connection_start_reading(connection_t *conn); - -int connection_is_writing(connection_t *conn); -void connection_stop_writing(connection_t *conn); -void connection_start_writing(connection_t *conn); - -void connection_stop_reading_from_linked_conn(connection_t *conn); - -void directory_all_unreachable(time_t now); -void directory_info_has_arrived(time_t now, int from_cache); - -void ip_address_changed(int at_interface); -void dns_servers_relaunch_checks(void); - -void control_signal_act(int the_signal); -void handle_signals(int is_parent); -void tor_cleanup(void); -void tor_free_all(int postfork); - -int tor_main(int argc, char *argv[]); - -#ifdef MAIN_PRIVATE -int do_main_loop(void); -int do_list_fingerprint(void); -void do_hash_password(void); -int tor_init(int argc, char **argv); -#endif +/** Possible states for either direct or tunneled directory requests that + * are relevant for determining network status download times. */ +typedef enum { + /** Found that the client requests a network status; applies to both + * direct and tunneled requests; initial state of a request that we are + * measuring. */ + DIRREQ_IS_FOR_NETWORK_STATUS = 0, + /** Finished writing a network status to the directory connection; + * applies to both direct and tunneled requests; completes a direct + * request. */ + DIRREQ_FLUSHING_DIR_CONN_FINISHED = 1, + /** END cell sent to circuit that initiated a tunneled request. */ + DIRREQ_END_CELL_SENT = 2, + /** Flushed last cell from queue of the circuit that initiated a + * tunneled request to the outbuf of the OR connection. */ + DIRREQ_CIRC_QUEUE_FLUSHED = 3, + /** Flushed last byte from buffer of the OR connection belonging to the + * circuit that initiated a tunneled request; completes a tunneled + * request. */ + DIRREQ_OR_CONN_BUFFER_FLUSHED = 4 +} dirreq_state_t; -/********************************* networkstatus.c *********************/ +#define WRITE_STATS_INTERVAL (24*60*60) + +/********************************* microdesc.c *************************/ -/** How old do we allow a v2 network-status to get before removing it - * completely? */ -#define MAX_NETWORKSTATUS_AGE (10*24*60*60) +typedef struct microdesc_cache_t microdesc_cache_t; +/********************************* networkstatus.c *********************/ + +/** Location where we found a v2 networkstatus. */ typedef enum { NS_FROM_CACHE, NS_FROM_DIR_BY_FP, NS_FROM_DIR_ALL, NS_GENERATED -} networkstatus_source_t; +} v2_networkstatus_source_t; +/** Possible statuses of a version of Tor, given opinions from the directory + * servers. */ typedef enum version_status_t { VS_RECOMMENDED=0, /**< This version is listed as recommended. */ VS_OLD=1, /**< This version is older than any recommended version. */ @@ -3368,248 +3304,24 @@ VS_UNKNOWN, /**< We have no idea. */ } version_status_t; -void networkstatus_reset_warnings(void); -void networkstatus_reset_download_failures(void); -int router_reload_v2_networkstatus(void); -int router_reload_consensus_networkstatus(void); -void routerstatus_free(routerstatus_t *rs); -void networkstatus_v2_free(networkstatus_v2_t *ns); -void networkstatus_vote_free(networkstatus_t *ns); -networkstatus_voter_info_t *networkstatus_get_voter_by_id( - networkstatus_t *vote, - const char *identity); -int networkstatus_check_consensus_signature(networkstatus_t *consensus, - int warn); -int networkstatus_check_voter_signature(networkstatus_t *consensus, - networkstatus_voter_info_t *voter, - authority_cert_t *cert); -char *networkstatus_get_cache_filename(const char *identity_digest); -int router_set_networkstatus_v2(const char *s, time_t arrived_at, - networkstatus_source_t source, - smartlist_t *requested_fingerprints); -void networkstatus_v2_list_clean(time_t now); -routerstatus_t *networkstatus_v2_find_entry(networkstatus_v2_t *ns, - const char *digest); -routerstatus_t *networkstatus_vote_find_entry(networkstatus_t *ns, - const char *digest); -int networkstatus_vote_find_entry_idx(networkstatus_t *ns, - const char *digest, int *found_out); -const smartlist_t *networkstatus_get_v2_list(void); -download_status_t *router_get_dl_status_by_descriptor_digest(const char *d); -routerstatus_t *router_get_consensus_status_by_id(const char *digest); -routerstatus_t *router_get_consensus_status_by_descriptor_digest( - const char *digest); -routerstatus_t *router_get_consensus_status_by_nickname(const char *nickname, - int warn_if_unnamed); -const char *networkstatus_get_router_digest_by_nickname(const char *nickname); -int networkstatus_nickname_is_unnamed(const char *nickname); -void networkstatus_consensus_download_failed(int status_code); -void update_consensus_networkstatus_fetch_time(time_t now); -int should_delay_dir_fetches(or_options_t *options); -void update_networkstatus_downloads(time_t now); -void update_certificate_downloads(time_t now); -networkstatus_v2_t *networkstatus_v2_get_by_digest(const char *digest); -networkstatus_t *networkstatus_get_latest_consensus(void); -networkstatus_t *networkstatus_get_live_consensus(time_t now); -networkstatus_t *networkstatus_get_reasonably_live_consensus(time_t now); -#define NSSET_FROM_CACHE 1 -#define NSSET_WAS_WAITING_FOR_CERTS 2 -#define NSSET_DONT_DOWNLOAD_CERTS 4 -#define NSSET_ACCEPT_OBSOLETE 8 -int networkstatus_set_current_consensus(const char *consensus, unsigned flags); -void networkstatus_note_certs_arrived(void); -void routers_update_all_from_networkstatus(time_t now, int dir_version); -void routerstatus_list_update_from_consensus_networkstatus(time_t now); -void routers_update_status_from_consensus_networkstatus(smartlist_t *routers, - int reset_failures); -void signed_descs_update_status_from_consensus_networkstatus( - smartlist_t *descs); - -char *networkstatus_getinfo_helper_single(routerstatus_t *rs); -char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now); -void networkstatus_dump_bridge_status_to_file(time_t now); -int getinfo_helper_networkstatus(control_connection_t *conn, - const char *question, char **answer); -void networkstatus_free_all(void); - -/********************************* ntmain.c ***************************/ -#ifdef MS_WINDOWS -#define NT_SERVICE -#endif - -#ifdef NT_SERVICE -int nt_service_parse_options(int argc, char **argv, int *should_exit); -int nt_service_is_stopping(void); -void nt_service_set_state(DWORD state); -#else -#define nt_service_is_stopping() (0) -#endif - -/********************************* onion.c ***************************/ - -int onion_pending_add(or_circuit_t *circ, char *onionskin); -or_circuit_t *onion_next_task(char **onionskin_out); -void onion_pending_remove(or_circuit_t *circ); - -int onion_skin_create(crypto_pk_env_t *router_key, - crypto_dh_env_t **handshake_state_out, - char *onion_skin_out); - -int onion_skin_server_handshake(const char *onion_skin, - crypto_pk_env_t *private_key, - crypto_pk_env_t *prev_private_key, - char *handshake_reply_out, - char *key_out, - size_t key_out_len); - -int onion_skin_client_handshake(crypto_dh_env_t *handshake_state, - const char *handshake_reply, - char *key_out, - size_t key_out_len); - -int fast_server_handshake(const char *key_in, - char *handshake_reply_out, - char *key_out, - size_t key_out_len); - -int fast_client_handshake(const char *handshake_state, - const char *handshake_reply_out, - char *key_out, - size_t key_out_len); - -void clear_pending_onions(void); - /********************************* policies.c ************************/ -/* (length of "accept 255.255.255.255/255.255.255.255:65535-65535\n" plus a - * nul.) - */ -#define POLICY_BUF_LEN 52 - +/** Outcome of applying an address policy to an address. */ typedef enum { + /** The address was accepted */ ADDR_POLICY_ACCEPTED=0, + /** The address was rejected */ ADDR_POLICY_REJECTED=-1, + /** Part of the address was unknown, but as far as we can tell, it was + * accepted. */ ADDR_POLICY_PROBABLY_ACCEPTED=1, + /** Part of the address was unknown, but as far as we can tell, it was + * rejected. */ ADDR_POLICY_PROBABLY_REJECTED=2 } addr_policy_result_t; -int firewall_is_fascist_or(void); -int fascist_firewall_allows_address_or(uint32_t addr, uint16_t port); -int fascist_firewall_allows_address_dir(uint32_t addr, uint16_t port); -int dir_policy_permits_address(uint32_t addr); -int socks_policy_permits_address(uint32_t addr); -int authdir_policy_permits_address(uint32_t addr, uint16_t port); -int authdir_policy_valid_address(uint32_t addr, uint16_t port); -int authdir_policy_baddir_address(uint32_t addr, uint16_t port); -int authdir_policy_badexit_address(uint32_t addr, uint16_t port); - -int validate_addr_policies(or_options_t *options, char **msg); -void policy_expand_private(smartlist_t **policy); -int policies_parse_from_options(or_options_t *options); - -addr_policy_t *addr_policy_get_canonical_entry(addr_policy_t *ent); -int cmp_addr_policies(smartlist_t *a, smartlist_t *b); -addr_policy_result_t compare_addr_to_addr_policy(uint32_t addr, - uint16_t port, smartlist_t *policy); -int policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest, - int rejectprivate, const char *local_address); -void policies_set_router_exitpolicy_to_reject_all(routerinfo_t *exitrouter); -int exit_policy_is_general_exit(smartlist_t *policy); -int policy_is_reject_star(smartlist_t *policy); -int getinfo_helper_policies(control_connection_t *conn, - const char *question, char **answer); -int policy_write_item(char *buf, size_t buflen, addr_policy_t *item); - -void addr_policy_list_free(smartlist_t *p); -void addr_policy_free(addr_policy_t *p); -void policies_free_all(void); - -/********************************* relay.c ***************************/ - -extern uint64_t stats_n_relay_cells_relayed; -extern uint64_t stats_n_relay_cells_delivered; - -int circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, - int cell_direction); - -void relay_header_pack(char *dest, const relay_header_t *src); -void relay_header_unpack(relay_header_t *dest, const char *src); -int relay_send_command_from_edge(uint16_t stream_id, circuit_t *circ, - uint8_t relay_command, const char *payload, - size_t payload_len, crypt_path_t *cpath_layer); -int connection_edge_send_command(edge_connection_t *fromconn, - uint8_t relay_command, const char *payload, - size_t payload_len); -int connection_edge_package_raw_inbuf(edge_connection_t *conn, - int package_partial); -void connection_edge_consider_sending_sendme(edge_connection_t *conn); -socks5_reply_status_t connection_edge_end_reason_socks5_response(int reason); -int errno_to_end_reason(int e); - -extern uint64_t stats_n_data_cells_packaged; -extern uint64_t stats_n_data_bytes_packaged; -extern uint64_t stats_n_data_cells_received; -extern uint64_t stats_n_data_bytes_received; - -void init_cell_pool(void); -void free_cell_pool(void); -void clean_cell_pool(void); -void dump_cell_pool_usage(int severity); - -void cell_queue_clear(cell_queue_t *queue); -void cell_queue_append(cell_queue_t *queue, packed_cell_t *cell); -void cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell); - -void append_cell_to_circuit_queue(circuit_t *circ, or_connection_t *orconn, - cell_t *cell, int direction); -void connection_or_unlink_all_active_circs(or_connection_t *conn); -int connection_or_flush_from_first_active_circuit(or_connection_t *conn, - int max, time_t now); -void assert_active_circuits_ok(or_connection_t *orconn); -void make_circuit_inactive_on_conn(circuit_t *circ, or_connection_t *conn); -void make_circuit_active_on_conn(circuit_t *circ, or_connection_t *conn); - /********************************* rephist.c ***************************/ -void rep_hist_init(void); -void rep_hist_note_connect_failed(const char* nickname, time_t when); -void rep_hist_note_connect_succeeded(const char* nickname, time_t when); -void rep_hist_note_disconnect(const char* nickname, time_t when); -void rep_hist_note_connection_died(const char* nickname, time_t when); -void rep_hist_note_extend_succeeded(const char *from_name, - const char *to_name); -void rep_hist_note_extend_failed(const char *from_name, const char *to_name); -void rep_hist_dump_stats(time_t now, int severity); -void rep_hist_note_bytes_read(size_t num_bytes, time_t when); -void rep_hist_note_bytes_written(size_t num_bytes, time_t when); -int rep_hist_bandwidth_assess(void); -char *rep_hist_get_bandwidth_lines(int for_extrainfo); -void rep_hist_update_state(or_state_t *state); -int rep_hist_load_state(or_state_t *state, char **err); -void rep_history_clean(time_t before); - -void rep_hist_note_router_reachable(const char *id, time_t when); -void rep_hist_note_router_unreachable(const char *id, time_t when); -int rep_hist_record_mtbf_data(void); -int rep_hist_load_mtbf_data(time_t now); - -time_t rep_hist_downrate_old_runs(time_t now); -double rep_hist_get_stability(const char *id, time_t when); -double rep_hist_get_weighted_fractional_uptime(const char *id, time_t when); -long rep_hist_get_weighted_time_known(const char *id, time_t when); -int rep_hist_have_measured_enough_stability(void); - -void rep_hist_note_used_port(uint16_t port, time_t now); -smartlist_t *rep_hist_get_predicted_ports(time_t now); -void rep_hist_note_used_resolve(time_t now); -void rep_hist_note_used_internal(time_t now, int need_uptime, - int need_capacity); -int rep_hist_get_predicted_internal(time_t now, int *need_uptime, - int *need_capacity); - -int any_predicted_circuits(time_t now); -int rep_hist_circbuilding_dormant(time_t now); - /** Possible public/private key operations in Tor: used to keep track of where * we're spending our time. */ typedef enum { @@ -3619,42 +3331,16 @@ TLS_HANDSHAKE_C, TLS_HANDSHAKE_S, REND_CLIENT, REND_MID, REND_SERVER, } pk_op_t; -void note_crypto_pk_op(pk_op_t operation); -void dump_pk_ops(int severity); - -void rep_hist_free_all(void); - -/* for hidden service usage statistics */ -void hs_usage_note_publish_total(const char *service_id, time_t now); -void hs_usage_note_publish_novel(const char *service_id, time_t now); -void hs_usage_note_fetch_total(const char *service_id, time_t now); -void hs_usage_note_fetch_successful(const char *service_id, time_t now); -void hs_usage_write_statistics_to_file(time_t now); -void hs_usage_free_all(void); - -/********************************* rendclient.c ***************************/ - -void rend_client_introcirc_has_opened(origin_circuit_t *circ); -void rend_client_rendcirc_has_opened(origin_circuit_t *circ); -int rend_client_introduction_acked(origin_circuit_t *circ, const char *request, - size_t request_len); -void rend_client_refetch_renddesc(const char *query); -void rend_client_refetch_v2_renddesc(const char *query); -int rend_client_remove_intro_point(extend_info_t *failed_intro, - const char *query); -int rend_client_rendezvous_acked(origin_circuit_t *circ, const char *request, - size_t request_len); -int rend_client_receive_rendezvous(origin_circuit_t *circ, const char *request, - size_t request_len); -void rend_client_desc_trynow(const char *query, int rend_version); - -extend_info_t *rend_client_get_random_intro(const char *query); - -int rend_client_send_introduction(origin_circuit_t *introcirc, - origin_circuit_t *rendcirc); /********************************* rendcommon.c ***************************/ +/** Hidden-service side configuration of client authorization. */ +typedef struct rend_authorized_client_t { + char *client_name; + char descriptor_cookie[REND_DESC_COOKIE_LEN]; + crypto_pk_env_t *client_key; +} rend_authorized_client_t; + /** ASCII-encoded v2 hidden service descriptor. */ typedef struct rend_encoded_v2_service_descriptor_t { char desc_id[DIGEST_LEN]; /**< Descriptor ID. */ @@ -3687,23 +3373,6 @@ smartlist_t *successful_uploads; } rend_service_descriptor_t; -int rend_cmp_service_ids(const char *one, const char *two); - -void rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint, - int command, size_t length, const char *payload); - -void rend_service_descriptor_free(rend_service_descriptor_t *desc); -int rend_encode_service_descriptor(rend_service_descriptor_t *desc, - crypto_pk_env_t *key, - char **str_out, - size_t *len_out); -rend_service_descriptor_t *rend_parse_service_descriptor(const char *str, - size_t len); -int rend_get_service_id(crypto_pk_env_t *pk, char *out); -void rend_encoded_v2_service_descriptor_free( - rend_encoded_v2_service_descriptor_t *desc); -void rend_intro_point_free(rend_intro_point_t *intro); - /** A cached rendezvous descriptor. */ typedef struct rend_cache_entry_t { size_t len; /**< Length of desc */ @@ -3712,147 +3381,6 @@ rend_service_descriptor_t *parsed; /**< Parsed value of 'desc' */ } rend_cache_entry_t; -void rend_cache_init(void); -void rend_cache_clean(void); -void rend_cache_clean_v2_descs_as_dir(void); -void rend_cache_free_all(void); -int rend_valid_service_id(const char *query); -int rend_cache_lookup_desc(const char *query, int version, const char **desc, - size_t *desc_len); -int rend_cache_lookup_entry(const char *query, int version, - rend_cache_entry_t **entry_out); -int rend_cache_lookup_v2_desc_as_dir(const char *query, const char **desc); -int rend_cache_store(const char *desc, size_t desc_len, int published); -int rend_cache_store_v2_desc_as_client(const char *desc, - const char *descriptor_cookie); -int rend_cache_store_v2_desc_as_dir(const char *desc); -int rend_cache_size(void); -int rend_encode_v2_descriptors(smartlist_t *descs_out, - rend_service_descriptor_t *desc, time_t now, - const char *descriptor_cookie, uint8_t period); -int rend_compute_v2_desc_id(char *desc_id_out, const char *service_id, - const char *descriptor_cookie, - time_t now, uint8_t replica); -int rend_id_is_in_interval(const char *a, const char *b, const char *c); -void rend_get_descriptor_id_bytes(char *descriptor_id_out, - const char *service_id, - const char *secret_id_part); - -/********************************* rendservice.c ***************************/ - -int num_rend_services(void); -int rend_config_services(or_options_t *options, int validate_only); -int rend_service_load_keys(void); -void rend_services_init(void); -void rend_services_introduce(void); -void rend_consider_services_upload(time_t now); -void rend_hsdir_routers_changed(void); -void rend_consider_descriptor_republication(void); - -void rend_service_intro_has_opened(origin_circuit_t *circuit); -int rend_service_intro_established(origin_circuit_t *circuit, - const char *request, - size_t request_len); -void rend_service_rendezvous_has_opened(origin_circuit_t *circuit); -int rend_service_introduce(origin_circuit_t *circuit, const char *request, - size_t request_len); -void rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc); -int rend_service_set_connection_addr_port(edge_connection_t *conn, - origin_circuit_t *circ); -void rend_service_dump_stats(int severity); -void rend_service_free_all(void); - -/********************************* rendmid.c *******************************/ -int rend_mid_establish_intro(or_circuit_t *circ, const char *request, - size_t request_len); -int rend_mid_introduce(or_circuit_t *circ, const char *request, - size_t request_len); -int rend_mid_establish_rendezvous(or_circuit_t *circ, const char *request, - size_t request_len); -int rend_mid_rendezvous(or_circuit_t *circ, const char *request, - size_t request_len); - -/********************************* router.c ***************************/ - -crypto_pk_env_t *get_onion_key(void); -time_t get_onion_key_set_at(void); -void set_identity_key(crypto_pk_env_t *k); -crypto_pk_env_t *get_identity_key(void); -int identity_key_is_set(void); -authority_cert_t *get_my_v3_authority_cert(void); -crypto_pk_env_t *get_my_v3_authority_signing_key(void); -authority_cert_t *get_my_v3_legacy_cert(void); -crypto_pk_env_t *get_my_v3_legacy_signing_key(void); -void dup_onion_keys(crypto_pk_env_t **key, crypto_pk_env_t **last); -void rotate_onion_key(void); -crypto_pk_env_t *init_key_from_file(const char *fname, int generate, - int severity); -void v3_authority_check_key_expiry(void); - -int init_keys(void); - -int check_whether_orport_reachable(void); -int check_whether_dirport_reachable(void); -void consider_testing_reachability(int test_or, int test_dir); -void router_orport_found_reachable(void); -void router_dirport_found_reachable(void); -void router_perform_bandwidth_test(int num_circs, time_t now); - -int authdir_mode(or_options_t *options); -int authdir_mode_v1(or_options_t *options); -int authdir_mode_v2(or_options_t *options); -int authdir_mode_v3(or_options_t *options); -int authdir_mode_any_main(or_options_t *options); -int authdir_mode_any_nonhidserv(or_options_t *options); -int authdir_mode_handles_descs(or_options_t *options, int purpose); -int authdir_mode_publishes_statuses(or_options_t *options); -int authdir_mode_tests_reachability(or_options_t *options); -int authdir_mode_bridge(or_options_t *options); - -int clique_mode(or_options_t *options); -int server_mode(or_options_t *options); -int advertised_server_mode(void); -int proxy_mode(or_options_t *options); -void consider_publishable_server(int force); - -int router_is_clique_mode(routerinfo_t *router); -void router_upload_dir_desc_to_dirservers(int force); -void mark_my_descriptor_dirty_if_older_than(time_t when); -void mark_my_descriptor_dirty(void); -void check_descriptor_bandwidth_changed(time_t now); -void check_descriptor_ipaddress_changed(time_t now); -void router_new_address_suggestion(const char *suggestion, - const dir_connection_t *d_conn); -int router_compare_to_my_exit_policy(edge_connection_t *conn); -routerinfo_t *router_get_my_routerinfo(void); -extrainfo_t *router_get_my_extrainfo(void); -const char *router_get_my_descriptor(void); -int router_digest_is_me(const char *digest); -int router_extrainfo_digest_is_me(const char *digest); -int router_is_me(routerinfo_t *router); -int router_fingerprint_is_me(const char *fp); -int router_pick_published_address(or_options_t *options, uint32_t *addr); -int router_rebuild_descriptor(int force); -int router_dump_router_to_string(char *s, size_t maxlen, routerinfo_t *router, - crypto_pk_env_t *ident_key); -int extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo, - crypto_pk_env_t *ident_key); -int is_legal_nickname(const char *s); -int is_legal_nickname_or_hexdigest(const char *s); -int is_legal_hexdigest(const char *s); -void router_get_verbose_nickname(char *buf, routerinfo_t *router); -void router_reset_warnings(void); -void router_reset_reachability(void); -void router_free_all(void); - -const char *router_purpose_to_string(uint8_t p); -uint8_t router_purpose_from_string(const char *s); - -#ifdef ROUTER_PRIVATE -/* Used only by router.c and test.c */ -void get_platform_str(char *platform, size_t len); -#endif - /********************************* routerlist.c ***************************/ /** Represents information about a single trusted directory server. */ @@ -3888,132 +3416,68 @@ **/ } trusted_dir_server_t; -#define ROUTER_REQUIRED_MIN_BANDWIDTH 10000 +#define ROUTER_REQUIRED_MIN_BANDWIDTH (20*1024) #define ROUTER_MAX_DECLARED_BANDWIDTH INT32_MAX -int get_n_authorities(authority_type_t type); -int trusted_dirs_reload_certs(void); -int trusted_dirs_load_certs_from_string(const char *contents, int from_store, - int flush); -void trusted_dirs_flush_certs_to_disk(void); -authority_cert_t *authority_cert_get_newest_by_id(const char *id_digest); -authority_cert_t *authority_cert_get_by_sk_digest(const char *sk_digest); -authority_cert_t *authority_cert_get_by_digests(const char *id_digest, - const char *sk_digest); -void authority_cert_get_all(smartlist_t *certs_out); -void authority_cert_dl_failed(const char *id_digest, int status); -void authority_certs_fetch_missing(networkstatus_t *status, time_t now); -int router_reload_router_list(void); -smartlist_t *router_get_trusted_dir_servers(void); - /* Flags for pick_directory_server and pick_trusteddirserver. */ +/** Flag to indicate that we should not automatically be willing to use + * ourself to answer a directory request. + * Passed to router_pick_directory_server (et al).*/ #define PDS_ALLOW_SELF (1<<0) +/** Flag to indicate that if no servers seem to be up, we should mark all + * directory servers as up and try again. + * Passed to router_pick_directory_server (et al).*/ #define PDS_RETRY_IF_NO_SERVERS (1<<1) +/** Flag to indicate that we should not exclude directory servers that + * our ReachableAddress settings would exclude. This usually means that + * we're going to connect to the server over Tor, and so we don't need to + * worry about our firewall telling us we can't. + * Passed to router_pick_directory_server (et al).*/ #define PDS_IGNORE_FASCISTFIREWALL (1<<2) +/** Flag to indicate that we should not use any directory authority to which + * we have an existing directory connection for downloading server descriptors + * or extrainfo documents. + * + * Passed to router_pick_directory_server (et al) + * + * [XXXX NOTE: This option is only implemented for pick_trusteddirserver, + * not pick_directory_server. If we make it work on pick_directory_server + * too, we could conservatively make it only prevent multiple fetches to + * the same authority, or we could aggressively make it prevent multiple + * fetches to _any_ single directory server.] + */ +#define PDS_NO_EXISTING_SERVERDESC_FETCH (1<<3) #define _PDS_PREFER_TUNNELED_DIR_CONNS (1<<16) -routerstatus_t *router_pick_directory_server(authority_type_t type, int flags); -trusted_dir_server_t *router_get_trusteddirserver_by_digest(const char *d); -trusted_dir_server_t *trusteddirserver_get_by_v3_auth_digest(const char *d); -routerstatus_t *router_pick_trusteddirserver(authority_type_t type, int flags); -void router_reset_status_download_failures(void); -void routerlist_add_family(smartlist_t *sl, routerinfo_t *router); -int routers_in_same_family(routerinfo_t *r1, routerinfo_t *r2); -void add_nickname_list_to_smartlist(smartlist_t *sl, const char *list, - int must_be_running); -int router_nickname_is_in_list(routerinfo_t *router, const char *list); -routerinfo_t *routerlist_find_my_routerinfo(void); -routerinfo_t *router_find_exact_exit_enclave(const char *address, - uint16_t port); -int router_is_unreliable(routerinfo_t *router, int need_uptime, - int need_capacity, int need_guard); -uint32_t router_get_advertised_bandwidth(routerinfo_t *router); -typedef enum { - NO_WEIGHTING, WEIGHT_FOR_EXIT, WEIGHT_FOR_GUARD +/** Possible ways to weight routers when choosing one randomly. See + * routerlist_sl_choose_by_bandwidth() for more information.*/ +typedef enum bandwidth_weight_rule_t { + NO_WEIGHTING, WEIGHT_FOR_EXIT, WEIGHT_FOR_MID, WEIGHT_FOR_GUARD, + WEIGHT_FOR_DIR } bandwidth_weight_rule_t; -routerinfo_t *routerlist_sl_choose_by_bandwidth(smartlist_t *sl, - bandwidth_weight_rule_t rule); -routerstatus_t *routerstatus_sl_choose_by_bandwidth(smartlist_t *sl); -routerinfo_t *router_choose_random_node(const char *preferred, - const char *excluded, - smartlist_t *excludedsmartlist, - int need_uptime, int need_capacity, - int need_guard, - int allow_invalid, int strict, - int weight_for_exit); -routerinfo_t *router_get_by_nickname(const char *nickname, - int warn_if_unnamed); -int router_digest_version_as_new_as(const char *digest, const char *cutoff); -int router_digest_is_trusted_dir_type(const char *digest, - authority_type_t type); -#define router_digest_is_trusted_dir(d) \ - router_digest_is_trusted_dir_type((d), NO_AUTHORITY) - -int router_addr_is_trusted_dir(uint32_t addr); -int hexdigest_to_digest(const char *hexdigest, char *digest); -routerinfo_t *router_get_by_hexdigest(const char *hexdigest); -routerinfo_t *router_get_by_digest(const char *digest); -signed_descriptor_t *router_get_by_descriptor_digest(const char *digest); -signed_descriptor_t *router_get_by_extrainfo_digest(const char *digest); -signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest); -const char *signed_descriptor_get_body(signed_descriptor_t *desc); -const char *signed_descriptor_get_annotations(signed_descriptor_t *desc); -routerlist_t *router_get_routerlist(void); -void routerinfo_free(routerinfo_t *router); -void extrainfo_free(extrainfo_t *extrainfo); -void routerlist_free(routerlist_t *rl); -void dump_routerlist_mem_usage(int severity); -void routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old); -void routerlist_free_all(void); -void routerlist_reset_warnings(void); -void router_set_status(const char *digest, int up); -int router_add_to_routerlist(routerinfo_t *router, const char **msg, - int from_cache, int from_fetch); -int router_add_extrainfo_to_routerlist(extrainfo_t *ei, const char **msg, - int from_cache, int from_fetch); -void routerlist_remove_old_routers(void); -int router_load_single_router(const char *s, uint8_t purpose, int cache, - const char **msg); -void router_load_routers_from_string(const char *s, const char *eos, - saved_location_t saved_location, - smartlist_t *requested_fingerprints, - int descriptor_digests, - const char *prepend_annotations); -void router_load_extrainfo_from_string(const char *s, const char *eos, - saved_location_t saved_location, - smartlist_t *requested_fingerprints, - int descriptor_digests); -void routerlist_retry_directory_downloads(time_t now); -int router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port, - int need_uptime); -int router_exit_policy_rejects_all(routerinfo_t *router); -trusted_dir_server_t *add_trusted_dir_server(const char *nickname, - const char *address, - uint16_t dir_port, uint16_t or_port, - const char *digest, const char *v3_auth_digest, - authority_type_t type); -void authority_cert_free(authority_cert_t *cert); -void clear_trusted_dir_servers(void); -int any_trusted_dir_is_v1_authority(void); -void update_router_descriptor_downloads(time_t now); -void update_extrainfo_downloads(time_t now); -int router_have_minimum_dir_info(void); -void router_dir_info_changed(void); -const char *get_dir_info_status_string(void); -void router_reset_descriptor_download_failures(void); -int router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2); -int routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei, - signed_descriptor_t *sd, - const char **msg); -void routerlist_assert_ok(routerlist_t *rl); -const char *esc_router_info(routerinfo_t *router); -void routers_sort_by_identity(smartlist_t *routers); - -int hid_serv_get_responsible_directories(smartlist_t *responsible_dirs, - const char *id); -int hid_serv_acting_as_directory(void); -int hid_serv_responsible_for_desc_id(const char *id); + +/** Flags to be passed to control router_choose_random_node() to indicate what + * kind of nodes to pick according to what algorithm. */ +typedef enum { + CRN_NEED_UPTIME = 1<<0, + CRN_NEED_CAPACITY = 1<<1, + CRN_NEED_GUARD = 1<<2, + CRN_ALLOW_INVALID = 1<<3, + /* XXXX not used, apparently. */ + CRN_WEIGHT_AS_EXIT = 1<<5 +} router_crn_flags_t; + +/** Return value for router_add_to_routerlist() and dirserv_add_descriptor() */ +typedef enum was_router_added_t { + ROUTER_ADDED_SUCCESSFULLY = 1, + ROUTER_ADDED_NOTIFY_GENERATOR = 0, + ROUTER_BAD_EI = -1, + ROUTER_WAS_NOT_NEW = -2, + ROUTER_NOT_IN_CONSENSUS = -3, + ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS = -4, + ROUTER_AUTHDIR_REJECTS = -5, +} was_router_added_t; /********************************* routerparse.c ************************/ @@ -4033,66 +3497,10 @@ int patchlevel; char status_tag[MAX_STATUS_TAG_LEN]; int svn_revision; -} tor_version_t; -int router_get_router_hash(const char *s, char *digest); -int router_get_dir_hash(const char *s, char *digest); -int router_get_runningrouters_hash(const char *s, char *digest); -int router_get_networkstatus_v2_hash(const char *s, char *digest); -int router_get_networkstatus_v3_hash(const char *s, char *digest); -int router_get_extrainfo_hash(const char *s, char *digest); -int router_append_dirobj_signature(char *buf, size_t buf_len, - const char *digest, - crypto_pk_env_t *private_key); -int router_parse_list_from_string(const char **s, const char *eos, - smartlist_t *dest, - saved_location_t saved_location, - int is_extrainfo, - int allow_annotations, - const char *prepend_annotations); -int router_parse_routerlist_from_directory(const char *s, - routerlist_t **dest, - crypto_pk_env_t *pkey, - int check_version, - int write_to_cache); -int router_parse_runningrouters(const char *str); -int router_parse_directory(const char *str); -routerinfo_t *router_parse_entry_from_string(const char *s, const char *end, - int cache_copy, - int allow_annotations, - const char *prepend_annotations); -extrainfo_t *extrainfo_parse_entry_from_string(const char *s, const char *end, - int cache_copy, struct digest_ri_map_t *routermap); -addr_policy_t *router_parse_addr_policy_item_from_string(const char *s, - int assume_action); -version_status_t tor_version_is_obsolete(const char *myversion, - const char *versionlist); -int tor_version_parse(const char *s, tor_version_t *out); -int tor_version_as_new_as(const char *platform, const char *cutoff); -int tor_version_compare(tor_version_t *a, tor_version_t *b); -void sort_version_list(smartlist_t *lst, int remove_duplicates); -void assert_addr_policy_ok(smartlist_t *t); -void dump_distinct_digest_count(int severity); - -networkstatus_v2_t *networkstatus_v2_parse_from_string(const char *s); -networkstatus_t *networkstatus_parse_vote_from_string(const char *s, - const char **eos_out, - int is_vote); -ns_detached_signatures_t *networkstatus_parse_detached_signatures( - const char *s, const char *eos); - -authority_cert_t *authority_cert_parse_from_string(const char *s, - const char **end_of_string); -int rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, - char *desc_id_out, - char **intro_points_encrypted_out, - size_t *intro_points_encrypted_size_out, - size_t *encoded_size_out, - const char **next_out, const char *desc); -int rend_decrypt_introduction_points(rend_service_descriptor_t *parsed, - const char *descriptor_cookie, - const char *intro_content, - size_t intro_size); + int git_tag_len; + char git_tag[DIGEST_LEN]; +} tor_version_t; #endif diff -Nru tor-0.2.0.34/src/or/or_sha1.i tor-0.2.2.16-alpha/src/or/or_sha1.i --- tor-0.2.0.34/src/or/or_sha1.i 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/or_sha1.i 2010-03-07 07:38:11.000000000 +0000 @@ -0,0 +1 @@ +"13d61202fcde47f2566e4ca138a34ff7a03c60e6 tor_main.c\n" diff -Nru tor-0.2.0.34/src/or/policies.c tor-0.2.2.16-alpha/src/or/policies.c --- tor-0.2.0.34/src/or/policies.c 2008-04-23 21:03:34.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/policies.c 2010-08-18 23:04:46.000000000 +0000 @@ -1,10 +1,7 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: policies.c 14432 2008-04-23 20:48:14Z nickm $ */ -const char policies_c_id[] = \ - "$Id: policies.c 14432 2008-04-23 20:48:14Z nickm $"; /** * \file policies.c @@ -12,6 +9,10 @@ **/ #include "or.h" +#include "config.h" +#include "dirserv.h" +#include "policies.h" +#include "routerparse.h" #include "ht.h" /** Policy that addresses for incoming SOCKS connections must match. */ @@ -38,20 +39,38 @@ * to directories at. */ static smartlist_t *reachable_dir_addr_policy = NULL; +/** Element of an exit policy summary */ +typedef struct policy_summary_item_t { + uint16_t prt_min; /**< Lowest port number to accept/reject. */ + uint16_t prt_max; /**< Highest port number to accept/reject. */ + uint64_t reject_count; /**< Number of IP-Addresses that are rejected to + this port range. */ + int accepted:1; /** Has this port already been accepted */ +} policy_summary_item_t; + +/** Private networks. This list is used in two places, once to expand the + * "private" keyword when parsing our own exit policy, secondly to ignore + * just such networks when building exit policy summaries. It is important + * that all authorities agree on that list when creating summaries, so don't + * just change this without a proper migration plan and a proposal and stuff. + */ +static const char *private_nets[] = { + "0.0.0.0/8", "169.254.0.0/16", + "127.0.0.0/8", "192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12", + // "fc00::/7", "fe80::/10", "fec0::/10", "::/127", + NULL }; + /** Replace all "private" entries in *policy with their expanded * equivalents. */ void policy_expand_private(smartlist_t **policy) { - static const char *private_nets[] = { - "0.0.0.0/8", "169.254.0.0/16", - "127.0.0.0/8", "192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12", NULL }; uint16_t port_min, port_max; int i; smartlist_t *tmp; - if (!*policy) + if (!*policy) /*XXXX disallow NULL policies? */ return; tmp = smartlist_create(); @@ -67,9 +86,8 @@ memcpy(&policy, p, sizeof(addr_policy_t)); policy.is_private = 0; policy.is_canonical = 0; - if (parse_addr_and_port_range(private_nets[i], - &policy.addr, - &policy.maskbits, &port_min, &port_max)) { + if (tor_addr_parse_mask_ports(private_nets[i], &policy.addr, + &policy.maskbits, &port_min, &port_max)<0) { tor_assert(0); } smartlist_add(tmp, addr_policy_get_canonical_entry(&policy)); @@ -85,6 +103,10 @@ * Given a linked list of config lines containing "allow" and "deny" * tokens, parse them and append the result to dest. Return -1 * if any tokens are malformed (and don't append any), else return 0. + * + * If assume_action is nonnegative, then insert its action + * (ADDR_POLICY_ACCEPT or ADDR_POLICY_REJECT) for items that specify no + * action. */ static int parse_addr_policy(config_line_t *cfg, smartlist_t **dest, @@ -196,11 +218,11 @@ * connection to addr:port. */ static int -addr_policy_permits_address(uint32_t addr, uint16_t port, +addr_policy_permits_tor_addr(const tor_addr_t *addr, uint16_t port, smartlist_t *policy) { addr_policy_result_t p; - p = compare_addr_to_addr_policy(addr, port, policy); + p = compare_tor_addr_to_addr_policy(addr, port, policy); switch (p) { case ADDR_POLICY_PROBABLY_ACCEPTED: case ADDR_POLICY_ACCEPTED: @@ -214,40 +236,64 @@ } } +/** Return true iff policy (possibly NULL) will allow a connection to + * addr:port. addr is an IPv4 address given in host + * order. */ +/* XXXX deprecate when possible. */ +static int +addr_policy_permits_address(uint32_t addr, uint16_t port, + smartlist_t *policy) +{ + tor_addr_t a; + tor_addr_from_ipv4h(&a, addr); + return addr_policy_permits_tor_addr(&a, port, policy); +} + /** Return true iff we think our firewall will let us make an OR connection to * addr:port. */ int -fascist_firewall_allows_address_or(uint32_t addr, uint16_t port) +fascist_firewall_allows_address_or(const tor_addr_t *addr, uint16_t port) { - return addr_policy_permits_address(addr, port, + return addr_policy_permits_tor_addr(addr, port, reachable_or_addr_policy); } +/** Return true iff we think our firewall will let us make an OR connection to + * ri. */ +int +fascist_firewall_allows_or(routerinfo_t *ri) +{ + /* XXXX proposal 118 */ + tor_addr_t addr; + tor_addr_from_ipv4h(&addr, ri->addr); + return fascist_firewall_allows_address_or(&addr, ri->or_port); +} + /** Return true iff we think our firewall will let us make a directory * connection to addr:port. */ int -fascist_firewall_allows_address_dir(uint32_t addr, uint16_t port) +fascist_firewall_allows_address_dir(const tor_addr_t *addr, uint16_t port) { - return addr_policy_permits_address(addr, port, - reachable_dir_addr_policy); + return addr_policy_permits_tor_addr(addr, port, + reachable_dir_addr_policy); } /** Return 1 if addr is permitted to connect to our dir port, * based on dir_policy. Else return 0. */ int -dir_policy_permits_address(uint32_t addr) +dir_policy_permits_address(const tor_addr_t *addr) { - return addr_policy_permits_address(addr, 1, dir_policy); + return addr_policy_permits_tor_addr(addr, 1, dir_policy); } /** Return 1 if addr is permitted to connect to our socks port, * based on socks_policy. Else return 0. */ int -socks_policy_permits_address(uint32_t addr) +socks_policy_permits_address(const tor_addr_t *addr) { - return addr_policy_permits_address(addr, 1, socks_policy); + return addr_policy_permits_tor_addr(addr, 1, socks_policy); } /** Return 1 if addr:port is permitted to publish to our @@ -302,7 +348,8 @@ *msg = NULL; if (policies_parse_exit_policy(options->ExitPolicy, &addr_policy, - options->ExitPolicyRejectPrivate, NULL)) + options->ExitPolicyRejectPrivate, NULL, + !options->BridgeRelay)) REJECT("Error in ExitPolicy entry."); /* The rest of these calls *append* to addr_policy. So don't actually @@ -333,14 +380,8 @@ if (parse_addr_policy(options->ReachableDirAddresses, &addr_policy, ADDR_POLICY_ACCEPT)) REJECT("Error in ReachableDirAddresses entry."); - if (parse_addr_policy(options->AuthDirReject, &addr_policy, - ADDR_POLICY_REJECT)) - REJECT("Error in AuthDirReject entry."); - if (parse_addr_policy(options->AuthDirInvalid, &addr_policy, - ADDR_POLICY_REJECT)) - REJECT("Error in AuthDirInvalid entry."); -err: + err: addr_policy_list_free(addr_policy); return *msg ? -1 : 0; #undef REJECT @@ -362,11 +403,19 @@ return -1; } if (*policy) { - SMARTLIST_FOREACH(*policy, addr_policy_t *, n, { - /* ports aren't used. */ - n->prt_min = 1; - n->prt_max = 65535; - }); + SMARTLIST_FOREACH_BEGIN(*policy, addr_policy_t *, n) { + /* ports aren't used in these. */ + if (n->prt_min > 1 || n->prt_max != 65535) { + addr_policy_t newp, *c; + memcpy(&newp, n, sizeof(newp)); + newp.prt_min = 1; + newp.prt_max = 65535; + newp.is_canonical = 0; + c = addr_policy_get_canonical_entry(&newp); + SMARTLIST_REPLACE_CURRENT(*policy, n, c); + addr_policy_free(n); + } + } SMARTLIST_FOREACH_END(n); } return 0; } @@ -408,7 +457,7 @@ return r; if ((r=((int)a->is_private - (int)b->is_private))) return r; - if ((r=((int)a->addr - (int)b->addr))) + if ((r=tor_addr_compare(&a->addr, &b->addr, CMP_EXACT))) return r; if ((r=((int)a->maskbits - (int)b->maskbits))) return r; @@ -464,7 +513,7 @@ if (a->is_private) r = 0x1234abcd; else - r = (unsigned int)a->addr; + r = tor_addr_hash(&a->addr); r += a->prt_min << 8; r += a->prt_max << 16; r += a->maskbits; @@ -504,85 +553,147 @@ return found->policy; } -/** Decide whether a given addr:port is definitely accepted, - * definitely rejected, probably accepted, or probably rejected by a - * given policy. If addr is 0, we don't know the IP of the - * target address. If port is 0, we don't know the port of the - * target address. - * - * For now, the algorithm is pretty simple: we look for definite and - * uncertain matches. The first definite match is what we guess; if - * it was preceded by no uncertain matches of the opposite policy, - * then the guess is definite; otherwise it is probable. (If we - * have a known addr and port, all matches are definite; if we have an - * unknown addr/port, any address/port ranges other than "all" are - * uncertain.) - * - * We could do better by assuming that some ranges never match typical - * addresses (127.0.0.1, and so on). But we'll try this for now. - */ +/** As compare_tor_addr_to_addr_policy, but instead of a tor_addr_t, takes + * in host order. */ addr_policy_result_t compare_addr_to_addr_policy(uint32_t addr, uint16_t port, - smartlist_t *policy) + const smartlist_t *policy) { - int maybe_reject = 0; - int maybe_accept = 0; - int match = 0; - int maybe = 0; - int i, len; - len = policy ? smartlist_len(policy) : 0; - - for (i = 0; i < len; ++i) { - addr_policy_t *tmpe = smartlist_get(policy, i); - maybe = 0; - if (!addr) { - /* Address is unknown. */ - if ((port >= tmpe->prt_min && port <= tmpe->prt_max) || - (!port && tmpe->prt_min<=1 && tmpe->prt_max>=65535)) { - /* The port definitely matches. */ - if (tmpe->maskbits == 0) { - match = 1; - } else { - maybe = 1; - } - } else if (!port) { - /* The port maybe matches. */ - maybe = 1; + /*XXXX deprecate this function when possible. */ + tor_addr_t a; + tor_addr_from_ipv4h(&a, addr); + return compare_tor_addr_to_addr_policy(&a, port, policy); +} + +/** Helper for compare_tor_addr_to_addr_policy. Implements the case where + * addr and port are both known. */ +static addr_policy_result_t +compare_known_tor_addr_to_addr_policy(const tor_addr_t *addr, uint16_t port, + const smartlist_t *policy) +{ + /* We know the address and port, and we know the policy, so we can just + * compute an exact match. */ + SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, tmpe) { + /* Address is known */ + if (!tor_addr_compare_masked(addr, &tmpe->addr, tmpe->maskbits, + CMP_EXACT)) { + if (port >= tmpe->prt_min && port <= tmpe->prt_max) { + /* Exact match for the policy */ + return tmpe->policy_type == ADDR_POLICY_ACCEPT ? + ADDR_POLICY_ACCEPTED : ADDR_POLICY_REJECTED; } - } else { - /* Address is known */ - if (!addr_mask_cmp_bits(addr, tmpe->addr, tmpe->maskbits)) { - if (port >= tmpe->prt_min && port <= tmpe->prt_max) { - /* Exact match for the policy */ - match = 1; - } else if (!port) { - maybe = 1; + } + } SMARTLIST_FOREACH_END(tmpe); + + /* accept all by default. */ + return ADDR_POLICY_ACCEPTED; +} + +/** Helper for compare_tor_addr_to_addr_policy. Implements the case where + * addr is known but port is not. */ +static addr_policy_result_t +compare_known_tor_addr_to_addr_policy_noport(const tor_addr_t *addr, + const smartlist_t *policy) +{ + /* We look to see if there's a definite match. If so, we return that + match's value, unless there's an intervening possible match that says + something different. */ + int maybe_accept = 0, maybe_reject = 0; + + SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, tmpe) { + if (!tor_addr_compare_masked(addr, &tmpe->addr, tmpe->maskbits, + CMP_EXACT)) { + if (tmpe->prt_min <= 1 && tmpe->prt_max >= 65535) { + /* Definitely matches, since it covers all ports. */ + if (tmpe->policy_type == ADDR_POLICY_ACCEPT) { + /* If we already hit a clause that might trigger a 'reject', than we + * can't be sure of this certain 'accept'.*/ + return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : + ADDR_POLICY_ACCEPTED; + } else { + return maybe_accept ? ADDR_POLICY_PROBABLY_REJECTED : + ADDR_POLICY_REJECTED; } + } else { + /* Might match. */ + if (tmpe->policy_type == ADDR_POLICY_REJECT) + maybe_reject = 1; + else + maybe_accept = 1; } } - if (maybe) { - if (tmpe->policy_type == ADDR_POLICY_REJECT) - maybe_reject = 1; - else - maybe_accept = 1; - } - if (match) { - if (tmpe->policy_type == ADDR_POLICY_ACCEPT) { - /* If we already hit a clause that might trigger a 'reject', than we - * can't be sure of this certain 'accept'.*/ - return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : - ADDR_POLICY_ACCEPTED; + } SMARTLIST_FOREACH_END(tmpe); + + /* accept all by default. */ + return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : ADDR_POLICY_ACCEPTED; +} + +/** Helper for compare_tor_addr_to_addr_policy. Implements the case where + * port is known but address is not. */ +static addr_policy_result_t +compare_unknown_tor_addr_to_addr_policy(uint16_t port, + const smartlist_t *policy) +{ + /* We look to see if there's a definite match. If so, we return that + match's value, unless there's an intervening possible match that says + something different. */ + int maybe_accept = 0, maybe_reject = 0; + + SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, tmpe) { + if (tmpe->prt_min <= port && port <= tmpe->prt_max) { + if (tmpe->maskbits == 0) { + /* Definitely matches, since it covers all addresses. */ + if (tmpe->policy_type == ADDR_POLICY_ACCEPT) { + /* If we already hit a clause that might trigger a 'reject', than we + * can't be sure of this certain 'accept'.*/ + return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : + ADDR_POLICY_ACCEPTED; + } else { + return maybe_accept ? ADDR_POLICY_PROBABLY_REJECTED : + ADDR_POLICY_REJECTED; + } } else { - return maybe_accept ? ADDR_POLICY_PROBABLY_REJECTED : - ADDR_POLICY_REJECTED; + /* Might match. */ + if (tmpe->policy_type == ADDR_POLICY_REJECT) + maybe_reject = 1; + else + maybe_accept = 1; } } - } + } SMARTLIST_FOREACH_END(tmpe); /* accept all by default. */ return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : ADDR_POLICY_ACCEPTED; } +/** Decide whether a given addr:port is definitely accepted, + * definitely rejected, probably accepted, or probably rejected by a + * given policy. If addr is 0, we don't know the IP of the + * target address. If port is 0, we don't know the port of the + * target address. (At least one of addr and port must be + * provided. If you want to know whether a policy would definitely reject + * an unknown address:port, use policy_is_reject_star().) + * + * We could do better by assuming that some ranges never match typical + * addresses (127.0.0.1, and so on). But we'll try this for now. + */ +addr_policy_result_t +compare_tor_addr_to_addr_policy(const tor_addr_t *addr, uint16_t port, + const smartlist_t *policy) +{ + if (!policy) { + /* no policy? accept all. */ + return ADDR_POLICY_ACCEPTED; + } else if (tor_addr_is_null(addr)) { + tor_assert(port != 0); + return compare_unknown_tor_addr_to_addr_policy(port, policy); + } else if (port == 0) { + return compare_known_tor_addr_to_addr_policy_noport(addr, policy); + } else { + return compare_known_tor_addr_to_addr_policy(addr, port, policy); + } +} + /** Return true iff the address policy a covers every case that * would be covered by b, so that a,b is redundant. */ static int @@ -594,7 +705,7 @@ /* a has more fixed bits than b; it can't possibly cover b. */ return 0; } - if (addr_mask_cmp_bits(a->addr, b->addr, a->maskbits)) { + if (tor_addr_compare_masked(&a->addr, &b->addr, a->maskbits, CMP_EXACT)) { /* There's a fixed bit in a that's set differently in b. */ return 0; } @@ -617,7 +728,7 @@ minbits = a->maskbits; else minbits = b->maskbits; - if (addr_mask_cmp_bits(a->addr, b->addr, minbits)) + if (tor_addr_compare_masked(&a->addr, &b->addr, minbits, CMP_EXACT)) return 0; if (a->prt_max < b->prt_min || b->prt_max < a->prt_min) return 0; @@ -669,8 +780,8 @@ tor_assert(j > i); if (addr_policy_covers(ap, tmp)) { char p1[POLICY_BUF_LEN], p2[POLICY_BUF_LEN]; - policy_write_item(p1, sizeof(p1), tmp); - policy_write_item(p2, sizeof(p2), ap); + policy_write_item(p1, sizeof(p1), tmp, 0); + policy_write_item(p2, sizeof(p2), ap, 0); log(LOG_DEBUG, LD_CONFIG, "Removing exit policy %s (%d). It is made " "redundant by %s (%d).", p1, j, p2, i); smartlist_del_keeporder(dest, j--); @@ -684,7 +795,7 @@ * (accept/reject), A is a subset of B, and there is no other entry of * different type in between those two that intersects with A. * - * Anybody want to doublecheck the logic here? XXX + * Anybody want to double-check the logic here? XXX */ for (i = 0; i < smartlist_len(dest)-1; ++i) { ap = smartlist_get(dest, i); @@ -698,8 +809,8 @@ } else { /* policy_types are equal. */ if (addr_policy_covers(tmp, ap)) { char p1[POLICY_BUF_LEN], p2[POLICY_BUF_LEN]; - policy_write_item(p1, sizeof(p1), ap); - policy_write_item(p2, sizeof(p2), tmp); + policy_write_item(p1, sizeof(p1), ap, 0); + policy_write_item(p2, sizeof(p2), tmp, 0); log(LOG_DEBUG, LD_CONFIG, "Removing exit policy %s. It is already " "covered by %s.", p1, p2); smartlist_del_keeporder(dest, i--); @@ -713,19 +824,20 @@ #define DEFAULT_EXIT_POLICY \ "reject *:25,reject *:119,reject *:135-139,reject *:445," \ - "reject *:465,reject *:563,reject *:587," \ - "reject *:1214,reject *:4661-4666," \ + "reject *:563,reject *:1214,reject *:4661-4666," \ "reject *:6346-6429,reject *:6699,reject *:6881-6999,accept *:*" /** Parse the exit policy cfg into the linked list *dest. If - * cfg doesn't end in an absolute accept or reject, add the default exit + * cfg doesn't end in an absolute accept or reject and if + * add_default_policy is true, add the default exit * policy afterwards. If rejectprivate is true, prepend * "reject private:*" to the policy. Return -1 if we can't parse cfg, * else return 0. */ int policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest, - int rejectprivate, const char *local_address) + int rejectprivate, const char *local_address, + int add_default_policy) { if (rejectprivate) { append_exit_policy_string(dest, "reject private:*"); @@ -737,8 +849,10 @@ } if (parse_addr_policy(cfg, dest, -1)) return -1; - append_exit_policy_string(dest, DEFAULT_EXIT_POLICY); - + if (add_default_policy) + append_exit_policy_string(dest, DEFAULT_EXIT_POLICY); + else + append_exit_policy_string(dest, "reject *:*"); exit_policy_remove_redundancies(*dest); return 0; @@ -755,6 +869,49 @@ smartlist_add(r->exit_policy, item); } +/** Return 1 if there is at least one /8 subnet in policy that + * allows exiting to port. Otherwise, return 0. */ +static int +exit_policy_is_general_exit_helper(smartlist_t *policy, int port) +{ + uint32_t mask, ip, i; + /* Is this /8 rejected (1), or undecided (0)? */ + char subnet_status[256]; + + memset(subnet_status, 0, sizeof(subnet_status)); + SMARTLIST_FOREACH(policy, addr_policy_t *, p, { + if (p->prt_min > port || p->prt_max < port) + continue; /* Doesn't cover our port. */ + mask = 0; + tor_assert(p->maskbits <= 32); + + if (p->maskbits) + mask = UINT32_MAX<<(32-p->maskbits); + ip = tor_addr_to_ipv4h(&p->addr); + + /* Calculate the first and last subnet that this exit policy touches + * and set it as loop boundaries. */ + for (i = ((mask & ip)>>24); i <= (~((mask & ip) ^ mask)>>24); ++i) { + tor_addr_t addr; + if (subnet_status[i] != 0) + continue; /* We already reject some part of this /8 */ + tor_addr_from_ipv4h(&addr, i<<24); + if (tor_addr_is_internal(&addr, 0)) + continue; /* Local or non-routable addresses */ + if (p->policy_type == ADDR_POLICY_ACCEPT) { + if (p->maskbits > 8) + continue; /* Narrower than a /8. */ + /* We found an allowed subnet of at least size /8. Done + * for this port! */ + return 1; + } else if (p->policy_type == ADDR_POLICY_REJECT) { + subnet_status[i] = 1; + } + } + }); + return 0; +} + /** Return true iff ri is "useful as an exit node", meaning * it allows exit to at least one /8 address space for at least * two of ports 80, 443, and 6667. */ @@ -764,23 +921,11 @@ static const int ports[] = { 80, 443, 6667 }; int n_allowed = 0; int i; - if (!policy) + if (!policy) /*XXXX disallow NULL policies? */ return 0; for (i = 0; i < 3; ++i) { - SMARTLIST_FOREACH(policy, addr_policy_t *, p, { - if (p->prt_min > ports[i] || p->prt_max < ports[i]) - continue; /* Doesn't cover our port. */ - if (p->maskbits > 8) - continue; /* Narrower than a /8. */ - if ((p->addr & 0xff000000ul) == 0x7f000000ul) - continue; /* 127.x */ - /* We have a match that is at least a /8. */ - if (p->policy_type == ADDR_POLICY_ACCEPT) { - ++n_allowed; - break; /* stop considering this port */ - } - }); + n_allowed += exit_policy_is_general_exit_helper(policy, ports[i]); } return n_allowed >= 2; } @@ -788,9 +933,9 @@ /** Return false if policy might permit access to some addr:port; * otherwise if we are certain it rejects everything, return true. */ int -policy_is_reject_star(smartlist_t *policy) +policy_is_reject_star(const smartlist_t *policy) { - if (!policy) + if (!policy) /*XXXX disallow NULL policies? */ return 1; SMARTLIST_FOREACH(policy, addr_policy_t *, p, { if (p->policy_type == ADDR_POLICY_ACCEPT) @@ -806,16 +951,18 @@ /** Write a single address policy to the buf_len byte buffer at buf. Return * the number of characters written, or -1 on failure. */ int -policy_write_item(char *buf, size_t buflen, addr_policy_t *policy) +policy_write_item(char *buf, size_t buflen, addr_policy_t *policy, + int format_for_desc) { - struct in_addr in; size_t written = 0; - char addrbuf[INET_NTOA_BUF_LEN]; + char addrbuf[TOR_ADDR_BUF_LEN]; const char *addrpart; int result; + const int is_accept = policy->policy_type == ADDR_POLICY_ACCEPT; + const int is_ip6 = tor_addr_family(&policy->addr) == AF_INET6; + + tor_addr_to_str(addrbuf, &policy->addr, sizeof(addrbuf), 1); - in.s_addr = htonl(policy->addr); - tor_inet_ntoa(&in, addrbuf, sizeof(addrbuf)); /* write accept/reject 1.2.3.4 */ if (policy->is_private) addrpart = "private"; @@ -823,8 +970,11 @@ addrpart = "*"; else addrpart = addrbuf; - result = tor_snprintf(buf, buflen, "%s %s", - policy->policy_type == ADDR_POLICY_ACCEPT ? "accept" : "reject", + + result = tor_snprintf(buf, buflen, "%s%s%s %s", + (is_ip6&&format_for_desc)?"opt ":"", + is_accept ? "accept" : "reject", + (is_ip6&&format_for_desc)?"6":"", addrpart); if (result < 0) return -1; @@ -864,13 +1014,289 @@ return (int)written; } +/** Create a new exit policy summary, initially only with a single + * port 1-64k item */ +/* XXXX This entire thing will do most stuff in O(N^2), or worse. Use an + * RB-tree if that turns out to matter. */ +static smartlist_t * +policy_summary_create(void) +{ + smartlist_t *summary; + policy_summary_item_t* item; + + item = tor_malloc_zero(sizeof(policy_summary_item_t)); + item->prt_min = 1; + item->prt_max = 65535; + item->reject_count = 0; + item->accepted = 0; + + summary = smartlist_create(); + smartlist_add(summary, item); + + return summary; +} + +/** Split the summary item in item at the port new_starts. + * The current item is changed to end at new-starts - 1, the new item + * copies reject_count and accepted from the old item, + * starts at new_starts and ends at the port where the original item + * previously ended. + */ +static policy_summary_item_t* +policy_summary_item_split(policy_summary_item_t* old, uint16_t new_starts) +{ + policy_summary_item_t* new; + + new = tor_malloc_zero(sizeof(policy_summary_item_t)); + new->prt_min = new_starts; + new->prt_max = old->prt_max; + new->reject_count = old->reject_count; + new->accepted = old->accepted; + + old->prt_max = new_starts-1; + + tor_assert(old->prt_min <= old->prt_max); + tor_assert(new->prt_min <= new->prt_max); + return new; +} + +/* XXXX Nick says I'm going to hell for this. If he feels charitably towards + * my immortal soul, he can clean it up himself. */ +#define AT(x) ((policy_summary_item_t*)smartlist_get(summary, x)) + +#define REJECT_CUTOFF_COUNT (1<<25) +/** Split an exit policy summary so that prt_min and prt_max + * fall at exactly the start and end of an item respectively. + */ +static int +policy_summary_split(smartlist_t *summary, + uint16_t prt_min, uint16_t prt_max) +{ + int start_at_index; + + int i = 0; + /* XXXX Do a binary search if run time matters */ + while (AT(i)->prt_max < prt_min) + i++; + if (AT(i)->prt_min != prt_min) { + policy_summary_item_t* new_item; + new_item = policy_summary_item_split(AT(i), prt_min); + smartlist_insert(summary, i+1, new_item); + i++; + } + start_at_index = i; + + while (AT(i)->prt_max < prt_max) + i++; + if (AT(i)->prt_max != prt_max) { + policy_summary_item_t* new_item; + new_item = policy_summary_item_split(AT(i), prt_max+1); + smartlist_insert(summary, i+1, new_item); + } + + return start_at_index; +} + +/** Mark port ranges as accepted if they are below the reject_count */ +static void +policy_summary_accept(smartlist_t *summary, + uint16_t prt_min, uint16_t prt_max) +{ + int i = policy_summary_split(summary, prt_min, prt_max); + while (i < smartlist_len(summary) && + AT(i)->prt_max <= prt_max) { + if (!AT(i)->accepted && + AT(i)->reject_count <= REJECT_CUTOFF_COUNT) + AT(i)->accepted = 1; + i++; + } + tor_assert(i < smartlist_len(summary) || prt_max==65535); +} + +/** Count the number of addresses in a network with prefixlen maskbits + * against the given portrange. */ +static void +policy_summary_reject(smartlist_t *summary, + maskbits_t maskbits, + uint16_t prt_min, uint16_t prt_max) +{ + int i = policy_summary_split(summary, prt_min, prt_max); + /* XXX: ipv4 specific */ + uint64_t count = (U64_LITERAL(1) << (32-maskbits)); + while (i < smartlist_len(summary) && + AT(i)->prt_max <= prt_max) { + AT(i)->reject_count += count; + i++; + } + tor_assert(i < smartlist_len(summary) || prt_max==65535); +} + +/** Add a single exit policy item to our summary: + * If it is an accept ignore it unless it is for all IP addresses + * ("*"), i.e. it's prefixlen/maskbits is 0, else call + * policy_summary_accept(). + * If it's a reject ignore it if it is about one of the private + * networks, else call policy_summary_reject(). + */ +static void +policy_summary_add_item(smartlist_t *summary, addr_policy_t *p) +{ + if (p->policy_type == ADDR_POLICY_ACCEPT) { + if (p->maskbits == 0) { + policy_summary_accept(summary, p->prt_min, p->prt_max); + } + } else if (p->policy_type == ADDR_POLICY_REJECT) { + + int is_private = 0; + int i; + for (i = 0; private_nets[i]; ++i) { + tor_addr_t addr; + maskbits_t maskbits; + if (tor_addr_parse_mask_ports(private_nets[i], &addr, + &maskbits, NULL, NULL)<0) { + tor_assert(0); + } + if (tor_addr_compare(&p->addr, &addr, CMP_EXACT) == 0 && + p->maskbits == maskbits) { + is_private = 1; + break; + } + } + + if (!is_private) { + policy_summary_reject(summary, p->maskbits, p->prt_min, p->prt_max); + } + } else + tor_assert(0); +} + +/** Create a string representing a summary for an exit policy. + * The summary will either be an "accept" plus a comma-separated list of port + * ranges or a "reject" plus port-ranges, depending on which is shorter. + * + * If no exits are allowed at all then NULL is returned, if no ports + * are blocked instead of "reject " we return "accept 1-65535" (this + * is an exception to the shorter-representation-wins rule). + */ +char * +policy_summarize(smartlist_t *policy) +{ + smartlist_t *summary = policy_summary_create(); + smartlist_t *accepts, *rejects; + int i, last, start_prt; + size_t accepts_len, rejects_len, shorter_len, final_size; + char *accepts_str = NULL, *rejects_str = NULL, *shorter_str, *result; + const char *prefix; + + tor_assert(policy); + + /* Create the summary list */ + SMARTLIST_FOREACH(policy, addr_policy_t *, p, { + policy_summary_add_item(summary, p); + }); + + /* Now create two lists of strings, one for accepted and one + * for rejected ports. We take care to merge ranges so that + * we avoid getting stuff like "1-4,5-9,10", instead we want + * "1-10" + */ + i = 0; + start_prt = 1; + accepts = smartlist_create(); + rejects = smartlist_create(); + while (1) { + last = i == smartlist_len(summary)-1; + if (last || + AT(i)->accepted != AT(i+1)->accepted) { + char buf[POLICY_BUF_LEN]; + + if (start_prt == AT(i)->prt_max) + tor_snprintf(buf, sizeof(buf), "%d", start_prt); + else + tor_snprintf(buf, sizeof(buf), "%d-%d", start_prt, AT(i)->prt_max); + + if (AT(i)->accepted) + smartlist_add(accepts, tor_strdup(buf)); + else + smartlist_add(rejects, tor_strdup(buf)); + + if (last) + break; + + start_prt = AT(i+1)->prt_min; + }; + i++; + }; + + /* Figure out which of the two stringlists will be shorter and use + * that to build the result + */ + if (smartlist_len(accepts) == 0) { /* no exits at all */ + result = tor_strdup("reject 1-65535"); + goto cleanup; + } + if (smartlist_len(rejects) == 0) { /* no rejects at all */ + result = tor_strdup("accept 1-65535"); + goto cleanup; + } + + accepts_str = smartlist_join_strings(accepts, ",", 0, &accepts_len); + rejects_str = smartlist_join_strings(rejects, ",", 0, &rejects_len); + + if (rejects_len > MAX_EXITPOLICY_SUMMARY_LEN && + accepts_len > MAX_EXITPOLICY_SUMMARY_LEN) { + char *c; + shorter_str = accepts_str; + prefix = "accept"; + + c = shorter_str + (MAX_EXITPOLICY_SUMMARY_LEN-strlen(prefix)-1); + while (*c != ',' && c >= shorter_str) + c--; + tor_assert(c >= shorter_str); + tor_assert(*c == ','); + *c = '\0'; + + shorter_len = strlen(shorter_str); + } else if (rejects_len < accepts_len) { + shorter_str = rejects_str; + shorter_len = rejects_len; + prefix = "reject"; + } else { + shorter_str = accepts_str; + shorter_len = accepts_len; + prefix = "accept"; + } + + final_size = strlen(prefix)+1+shorter_len+1; + tor_assert(final_size <= MAX_EXITPOLICY_SUMMARY_LEN+1); + result = tor_malloc(final_size); + tor_snprintf(result, final_size, "%s %s", prefix, shorter_str); + + cleanup: + /* cleanup */ + SMARTLIST_FOREACH(summary, policy_summary_item_t *, s, tor_free(s)); + smartlist_free(summary); + + tor_free(accepts_str); + SMARTLIST_FOREACH(accepts, char *, s, tor_free(s)); + smartlist_free(accepts); + + tor_free(rejects_str); + SMARTLIST_FOREACH(rejects, char *, s, tor_free(s)); + smartlist_free(rejects); + + return result; +} + /** Implementation for GETINFO control command: knows the answer for questions * about "exit-policy/..." */ int getinfo_helper_policies(control_connection_t *conn, - const char *question, char **answer) + const char *question, char **answer, + const char **errmsg) { (void) conn; + (void) errmsg; if (!strcmp(question, "exit-policy/default")) { *answer = tor_strdup(DEFAULT_EXIT_POLICY); } @@ -881,7 +1307,8 @@ void addr_policy_list_free(smartlist_t *lst) { - if (!lst) return; + if (!lst) + return; SMARTLIST_FOREACH(lst, addr_policy_t *, policy, addr_policy_free(policy)); smartlist_free(lst); } @@ -890,19 +1317,20 @@ void addr_policy_free(addr_policy_t *p) { - if (p) { - if (--p->refcnt <= 0) { - if (p->is_canonical) { - policy_map_ent_t search, *found; - search.policy = p; - found = HT_REMOVE(policy_map, &policy_root, &search); - if (found) { - tor_assert(p == found->policy); - tor_free(found); - } + if (!p) + return; + + if (--p->refcnt <= 0) { + if (p->is_canonical) { + policy_map_ent_t search, *found; + search.policy = p; + found = HT_REMOVE(policy_map, &policy_root, &search); + if (found) { + tor_assert(p == found->policy); + tor_free(found); } - tor_free(p); } + tor_free(p); } } @@ -927,8 +1355,23 @@ addr_policy_list_free(authdir_badexit_policy); authdir_badexit_policy = NULL; - if (!HT_EMPTY(&policy_root)) - log_warn(LD_MM, "Still had some address policies cached at shutdown."); + if (!HT_EMPTY(&policy_root)) { + policy_map_ent_t **ent; + int n = 0; + char buf[POLICY_BUF_LEN]; + + log_warn(LD_MM, "Still had %d address policies cached at shutdown.", + (int)HT_SIZE(&policy_root)); + + /* Note the first 10 cached policies to try to figure out where they + * might be coming from. */ + HT_FOREACH(ent, policy_map, &policy_root) { + if (++n > 10) + break; + if (policy_write_item(buf, sizeof(buf), (*ent)->policy, 0) >= 0) + log_warn(LD_MM," %d [%d]: %s", n, (*ent)->policy->refcnt, buf); + } + } HT_CLEAR(policy_map, &policy_root); } diff -Nru tor-0.2.0.34/src/or/policies.h tor-0.2.2.16-alpha/src/or/policies.h --- tor-0.2.0.34/src/or/policies.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/policies.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,60 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file policies.h + * \brief Header file for policies.c. + **/ + +#ifndef _TOR_POLICIES_H +#define _TOR_POLICIES_H + +/* (length of "accept 255.255.255.255/255.255.255.255:65535-65535\n" plus a + * NUL.) + */ +#define POLICY_BUF_LEN 52 + +int firewall_is_fascist_or(void); +int fascist_firewall_allows_address_or(const tor_addr_t *addr, uint16_t port); +int fascist_firewall_allows_or(routerinfo_t *ri); +int fascist_firewall_allows_address_dir(const tor_addr_t *addr, uint16_t port); +int dir_policy_permits_address(const tor_addr_t *addr); +int socks_policy_permits_address(const tor_addr_t *addr); +int authdir_policy_permits_address(uint32_t addr, uint16_t port); +int authdir_policy_valid_address(uint32_t addr, uint16_t port); +int authdir_policy_baddir_address(uint32_t addr, uint16_t port); +int authdir_policy_badexit_address(uint32_t addr, uint16_t port); + +int validate_addr_policies(or_options_t *options, char **msg); +void policy_expand_private(smartlist_t **policy); +int policies_parse_from_options(or_options_t *options); + +addr_policy_t *addr_policy_get_canonical_entry(addr_policy_t *ent); +int cmp_addr_policies(smartlist_t *a, smartlist_t *b); +addr_policy_result_t compare_tor_addr_to_addr_policy(const tor_addr_t *addr, + uint16_t port, const smartlist_t *policy); +addr_policy_result_t compare_addr_to_addr_policy(uint32_t addr, + uint16_t port, const smartlist_t *policy); +int policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest, + int rejectprivate, const char *local_address, + int add_default_policy); +void policies_set_router_exitpolicy_to_reject_all(routerinfo_t *exitrouter); +int exit_policy_is_general_exit(smartlist_t *policy); +int policy_is_reject_star(const smartlist_t *policy); +int getinfo_helper_policies(control_connection_t *conn, + const char *question, char **answer, + const char **errmsg); +int policy_write_item(char *buf, size_t buflen, addr_policy_t *item, + int format_for_desc); + +void addr_policy_list_free(smartlist_t *p); +void addr_policy_free(addr_policy_t *p); +void policies_free_all(void); + +char *policy_summarize(smartlist_t *policy); + +#endif + diff -Nru tor-0.2.0.34/src/or/reasons.c tor-0.2.2.16-alpha/src/or/reasons.c --- tor-0.2.0.34/src/or/reasons.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/reasons.c 2010-08-19 20:08:47.000000000 +0000 @@ -0,0 +1,409 @@ +/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file reasons.c + * \brief Convert circuit, stream, and orconn error reasons to and/or from + * strings and errno values. + **/ + +#include "or.h" +#include "config.h" +#include "reasons.h" + +/***************************** Edge (stream) reasons **********************/ + +/** Convert the reason for ending a stream reason into the format used + * in STREAM events. Return NULL if the reason is unrecognized. */ +const char * +stream_end_reason_to_control_string(int reason) +{ + reason &= END_STREAM_REASON_MASK; + switch (reason) { + case END_STREAM_REASON_MISC: return "MISC"; + case END_STREAM_REASON_RESOLVEFAILED: return "RESOLVEFAILED"; + case END_STREAM_REASON_CONNECTREFUSED: return "CONNECTREFUSED"; + case END_STREAM_REASON_EXITPOLICY: return "EXITPOLICY"; + case END_STREAM_REASON_DESTROY: return "DESTROY"; + case END_STREAM_REASON_DONE: return "DONE"; + case END_STREAM_REASON_TIMEOUT: return "TIMEOUT"; + case END_STREAM_REASON_NOROUTE: return "NOROUTE"; + case END_STREAM_REASON_HIBERNATING: return "HIBERNATING"; + case END_STREAM_REASON_INTERNAL: return "INTERNAL"; + case END_STREAM_REASON_RESOURCELIMIT: return "RESOURCELIMIT"; + case END_STREAM_REASON_CONNRESET: return "CONNRESET"; + case END_STREAM_REASON_TORPROTOCOL: return "TORPROTOCOL"; + case END_STREAM_REASON_NOTDIRECTORY: return "NOTDIRECTORY"; + + case END_STREAM_REASON_CANT_ATTACH: return "CANT_ATTACH"; + case END_STREAM_REASON_NET_UNREACHABLE: return "NET_UNREACHABLE"; + case END_STREAM_REASON_SOCKSPROTOCOL: return "SOCKS_PROTOCOL"; + + default: return NULL; + } +} + +/** Translate reason, which came from a relay 'end' cell, + * into a static const string describing why the stream is closing. + * reason is -1 if no reason was provided. + */ +const char * +stream_end_reason_to_string(int reason) +{ + switch (reason) { + case -1: + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "End cell arrived with length 0. Should be at least 1."); + return "MALFORMED"; + case END_STREAM_REASON_MISC: return "misc error"; + case END_STREAM_REASON_RESOLVEFAILED: return "resolve failed"; + case END_STREAM_REASON_CONNECTREFUSED: return "connection refused"; + case END_STREAM_REASON_EXITPOLICY: return "exit policy failed"; + case END_STREAM_REASON_DESTROY: return "destroyed"; + case END_STREAM_REASON_DONE: return "closed normally"; + case END_STREAM_REASON_TIMEOUT: return "gave up (timeout)"; + case END_STREAM_REASON_NOROUTE: return "no route to host"; + case END_STREAM_REASON_HIBERNATING: return "server is hibernating"; + case END_STREAM_REASON_INTERNAL: return "internal error at server"; + case END_STREAM_REASON_RESOURCELIMIT: return "server out of resources"; + case END_STREAM_REASON_CONNRESET: return "connection reset"; + case END_STREAM_REASON_TORPROTOCOL: return "Tor protocol error"; + case END_STREAM_REASON_NOTDIRECTORY: return "not a directory"; + default: + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Reason for ending (%d) not recognized.",reason); + return "unknown"; + } +} + +/** Translate reason (as from a relay 'end' cell) into an + * appropriate SOCKS5 reply code. + * + * A reason of 0 means that we're not actually expecting to send + * this code back to the socks client; we just call it 'succeeded' + * to keep things simple. + */ +socks5_reply_status_t +stream_end_reason_to_socks5_response(int reason) +{ + switch (reason & END_STREAM_REASON_MASK) { + case 0: + return SOCKS5_SUCCEEDED; + case END_STREAM_REASON_MISC: + return SOCKS5_GENERAL_ERROR; + case END_STREAM_REASON_RESOLVEFAILED: + return SOCKS5_HOST_UNREACHABLE; + case END_STREAM_REASON_CONNECTREFUSED: + return SOCKS5_CONNECTION_REFUSED; + case END_STREAM_REASON_ENTRYPOLICY: + return SOCKS5_NOT_ALLOWED; + case END_STREAM_REASON_EXITPOLICY: + return SOCKS5_NOT_ALLOWED; + case END_STREAM_REASON_DESTROY: + return SOCKS5_GENERAL_ERROR; + case END_STREAM_REASON_DONE: + return SOCKS5_SUCCEEDED; + case END_STREAM_REASON_TIMEOUT: + return SOCKS5_TTL_EXPIRED; + case END_STREAM_REASON_NOROUTE: + return SOCKS5_HOST_UNREACHABLE; + case END_STREAM_REASON_RESOURCELIMIT: + return SOCKS5_GENERAL_ERROR; + case END_STREAM_REASON_HIBERNATING: + return SOCKS5_GENERAL_ERROR; + case END_STREAM_REASON_INTERNAL: + return SOCKS5_GENERAL_ERROR; + case END_STREAM_REASON_CONNRESET: + return SOCKS5_CONNECTION_REFUSED; + case END_STREAM_REASON_TORPROTOCOL: + return SOCKS5_GENERAL_ERROR; + + case END_STREAM_REASON_CANT_ATTACH: + return SOCKS5_GENERAL_ERROR; + case END_STREAM_REASON_NET_UNREACHABLE: + return SOCKS5_NET_UNREACHABLE; + case END_STREAM_REASON_SOCKSPROTOCOL: + return SOCKS5_GENERAL_ERROR; + default: + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Reason for ending (%d) not recognized; " + "sending generic socks error.", reason); + return SOCKS5_GENERAL_ERROR; + } +} + +/* We need to use a few macros to deal with the fact that Windows + * decided that their sockets interface should be a permakludge. + * E_CASE is for errors where windows has both a EFOO and a WSAEFOO + * version, and S_CASE is for errors where windows has only a WSAEFOO + * version. (The E is for 'error', the S is for 'socket'). */ +#ifdef MS_WINDOWS +#define E_CASE(s) case s: case WSA ## s +#define S_CASE(s) case WSA ## s +#else +#define E_CASE(s) case s +#define S_CASE(s) case s +#endif + +/** Given an errno from a failed exit connection, return a reason code + * appropriate for use in a RELAY END cell. */ +uint8_t +errno_to_stream_end_reason(int e) +{ + /* To add new errors here, find out if they exist on Windows, and if a WSA* + * equivalent exists on windows. Add a case, an S_CASE, or an E_CASE as + * appropriate. */ + switch (e) { + case EPIPE: + return END_STREAM_REASON_DONE; + E_CASE(EBADF): + E_CASE(EFAULT): + E_CASE(EINVAL): + S_CASE(EISCONN): + S_CASE(ENOTSOCK): + S_CASE(EPROTONOSUPPORT): + S_CASE(EAFNOSUPPORT): + E_CASE(EACCES): + S_CASE(ENOTCONN): + S_CASE(ENETUNREACH): + return END_STREAM_REASON_INTERNAL; + S_CASE(EHOSTUNREACH): + /* XXXX022 + * The correct behavior is END_STREAM_REASON_NOROUTE, but older + * clients don't recognize it. So we're going to continue sending + * "MISC" until 0.2.1.27 or later is "well established". + */ + /* return END_STREAM_REASON_NOROUTE; */ + return END_STREAM_REASON_MISC; + S_CASE(ECONNREFUSED): + return END_STREAM_REASON_CONNECTREFUSED; + S_CASE(ECONNRESET): + return END_STREAM_REASON_CONNRESET; + S_CASE(ETIMEDOUT): + return END_STREAM_REASON_TIMEOUT; + S_CASE(ENOBUFS): + case ENOMEM: + case ENFILE: + E_CASE(EMFILE): + return END_STREAM_REASON_RESOURCELIMIT; + default: + log_info(LD_EXIT, "Didn't recognize errno %d (%s); telling the client " + "that we are ending a stream for 'misc' reason.", + e, tor_socket_strerror(e)); + return END_STREAM_REASON_MISC; + } +} + +/***************************** ORConn reasons *****************************/ + +/** Convert the reason for ending an OR connection r into the format + * used in ORCONN events. Return "UNKNOWN" if the reason is unrecognized. */ +const char * +orconn_end_reason_to_control_string(int r) +{ + /* To add new errors here, find out if they exist on Windows, and if a WSA* + * equivalent exists on windows. Add a case, an S_CASE, or an E_CASE as + * appropriate. */ + switch (r) { + case END_OR_CONN_REASON_DONE: + return "DONE"; + case END_OR_CONN_REASON_REFUSED: + return "CONNECTREFUSED"; + case END_OR_CONN_REASON_OR_IDENTITY: + return "IDENTITY"; + case END_OR_CONN_REASON_CONNRESET: + return "CONNECTRESET"; + case END_OR_CONN_REASON_TIMEOUT: + return "TIMEOUT"; + case END_OR_CONN_REASON_NO_ROUTE: + return "NOROUTE"; + case END_OR_CONN_REASON_IO_ERROR: + return "IOERROR"; + case END_OR_CONN_REASON_RESOURCE_LIMIT: + return "RESOURCELIMIT"; + case END_OR_CONN_REASON_MISC: + return "MISC"; + case 0: + return ""; + default: + log_warn(LD_BUG, "Unrecognized or_conn reason code %d", r); + return "UNKNOWN"; + } +} + +/** Convert a TOR_TLS_* error code into an END_OR_CONN_* reason. */ +int +tls_error_to_orconn_end_reason(int e) +{ + switch (e) { + case TOR_TLS_ERROR_IO: + return END_OR_CONN_REASON_IO_ERROR; + case TOR_TLS_ERROR_CONNREFUSED: + return END_OR_CONN_REASON_REFUSED; + case TOR_TLS_ERROR_CONNRESET: + return END_OR_CONN_REASON_CONNRESET; + case TOR_TLS_ERROR_NO_ROUTE: + return END_OR_CONN_REASON_NO_ROUTE; + case TOR_TLS_ERROR_TIMEOUT: + return END_OR_CONN_REASON_TIMEOUT; + case TOR_TLS_WANTREAD: + case TOR_TLS_WANTWRITE: + case TOR_TLS_CLOSE: + case TOR_TLS_DONE: + return END_OR_CONN_REASON_DONE; + default: + return END_OR_CONN_REASON_MISC; + } +} + +/** Given an errno from a failed ORConn connection, return a reason code + * appropriate for use in the controller orconn events. */ +int +errno_to_orconn_end_reason(int e) +{ + switch (e) { + case EPIPE: + return END_OR_CONN_REASON_DONE; + S_CASE(ENOTCONN): + S_CASE(ENETUNREACH): + S_CASE(ENETDOWN): + S_CASE(EHOSTUNREACH): + return END_OR_CONN_REASON_NO_ROUTE; + S_CASE(ECONNREFUSED): + return END_OR_CONN_REASON_REFUSED; + S_CASE(ECONNRESET): + return END_OR_CONN_REASON_CONNRESET; + S_CASE(ETIMEDOUT): + return END_OR_CONN_REASON_TIMEOUT; + S_CASE(ENOBUFS): + case ENOMEM: + case ENFILE: + E_CASE(EMFILE): + E_CASE(EACCES): + E_CASE(EBADF): + E_CASE(EFAULT): + E_CASE(EINVAL): + return END_OR_CONN_REASON_RESOURCE_LIMIT; + default: + log_info(LD_OR, "Didn't recognize errno %d (%s).", + e, tor_socket_strerror(e)); + return END_OR_CONN_REASON_MISC; + } +} + +/***************************** Circuit reasons *****************************/ + +/** Convert a numeric reason for destroying a circuit into a string for a + * CIRCUIT event. */ +const char * +circuit_end_reason_to_control_string(int reason) +{ + if (reason >= 0 && reason & END_CIRC_REASON_FLAG_REMOTE) + reason &= ~END_CIRC_REASON_FLAG_REMOTE; + switch (reason) { + case END_CIRC_AT_ORIGIN: + /* This shouldn't get passed here; it's a catch-all reason. */ + return "ORIGIN"; + case END_CIRC_REASON_NONE: + /* This shouldn't get passed here; it's a catch-all reason. */ + return "NONE"; + case END_CIRC_REASON_TORPROTOCOL: + return "TORPROTOCOL"; + case END_CIRC_REASON_INTERNAL: + return "INTERNAL"; + case END_CIRC_REASON_REQUESTED: + return "REQUESTED"; + case END_CIRC_REASON_HIBERNATING: + return "HIBERNATING"; + case END_CIRC_REASON_RESOURCELIMIT: + return "RESOURCELIMIT"; + case END_CIRC_REASON_CONNECTFAILED: + return "CONNECTFAILED"; + case END_CIRC_REASON_OR_IDENTITY: + return "OR_IDENTITY"; + case END_CIRC_REASON_OR_CONN_CLOSED: + return "OR_CONN_CLOSED"; + case END_CIRC_REASON_FINISHED: + return "FINISHED"; + case END_CIRC_REASON_TIMEOUT: + return "TIMEOUT"; + case END_CIRC_REASON_DESTROYED: + return "DESTROYED"; + case END_CIRC_REASON_NOPATH: + return "NOPATH"; + case END_CIRC_REASON_NOSUCHSERVICE: + return "NOSUCHSERVICE"; + default: + log_warn(LD_BUG, "Unrecognized reason code %d", (int)reason); + return NULL; + } +} + +/** Return a string corresponding to a SOCKS4 reponse code. */ +const char * +socks4_response_code_to_string(uint8_t code) +{ + switch (code) { + case 0x5a: + return "connection accepted"; + case 0x5b: + return "server rejected connection"; + case 0x5c: + return "server cannot connect to identd on this client"; + case 0x5d: + return "user id does not match identd"; + default: + return "invalid SOCKS 4 response code"; + } +} + +/** Return a string corresponding to a SOCKS5 reponse code. */ +const char * +socks5_response_code_to_string(uint8_t code) +{ + switch (code) { + case 0x00: + return "connection accepted"; + case 0x01: + return "general SOCKS server failure"; + case 0x02: + return "connection not allowed by ruleset"; + case 0x03: + return "Network unreachable"; + case 0x04: + return "Host unreachable"; + case 0x05: + return "Connection refused"; + case 0x06: + return "TTL expired"; + case 0x07: + return "Command not supported"; + case 0x08: + return "Address type not supported"; + default: + return "unknown reason"; + } +} + +/** Return a string corresponding to a bandwidht_weight_rule_t */ +const char * +bandwidth_weight_rule_to_string(bandwidth_weight_rule_t rule) +{ + switch (rule) + { + case NO_WEIGHTING: + return "no weighting"; + case WEIGHT_FOR_EXIT: + return "weight as exit"; + case WEIGHT_FOR_MID: + return "weight as middle node"; + case WEIGHT_FOR_GUARD: + return "weight as guard"; + case WEIGHT_FOR_DIR: + return "weight as directory"; + default: + return "unknown rule"; + } +} + diff -Nru tor-0.2.0.34/src/or/reasons.h tor-0.2.2.16-alpha/src/or/reasons.h --- tor-0.2.0.34/src/or/reasons.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/reasons.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,31 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file reasons.h + * \brief Header file for reasons.c. + **/ + +#ifndef _TOR_REASONS_H +#define _TOR_REASONS_H + +const char *stream_end_reason_to_control_string(int reason); +const char *stream_end_reason_to_string(int reason); +socks5_reply_status_t stream_end_reason_to_socks5_response(int reason); +uint8_t errno_to_stream_end_reason(int e); + +const char *orconn_end_reason_to_control_string(int r); +int tls_error_to_orconn_end_reason(int e); +int errno_to_orconn_end_reason(int e); + +const char *circuit_end_reason_to_control_string(int reason); +const char *socks4_response_code_to_string(uint8_t code); +const char *socks5_response_code_to_string(uint8_t code); + +const char *bandwidth_weight_rule_to_string(enum bandwidth_weight_rule_t rule); + +#endif + diff -Nru tor-0.2.0.34/src/or/relay.c tor-0.2.2.16-alpha/src/or/relay.c --- tor-0.2.0.34/src/or/relay.c 2009-01-05 02:06:16.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/relay.c 2010-09-17 01:30:36.000000000 +0000 @@ -1,41 +1,83 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: relay.c 17869 2009-01-04 03:03:45Z nickm $ */ -const char relay_c_id[] = - "$Id: relay.c 17869 2009-01-04 03:03:45Z nickm $"; /** * \file relay.c * \brief Handle relay cell encryption/decryption, plus packaging and - * receiving from circuits, plus queueing on circuits. + * receiving from circuits, plus queuing on circuits. **/ +#include #include "or.h" +#include "buffers.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "connection_or.h" +#include "control.h" +#include "geoip.h" +#include "main.h" #include "mempool.h" - -static int relay_crypt(circuit_t *circ, cell_t *cell, int cell_direction, - crypt_path_t **layer_hint, char *recognized); +#include "networkstatus.h" +#include "policies.h" +#include "reasons.h" +#include "relay.h" +#include "rendcommon.h" +#include "routerlist.h" +#include "routerparse.h" + +static int relay_crypt(circuit_t *circ, cell_t *cell, + cell_direction_t cell_direction, + crypt_path_t **layer_hint, char *recognized); static edge_connection_t *relay_lookup_conn(circuit_t *circ, cell_t *cell, - int cell_direction, + cell_direction_t cell_direction, crypt_path_t *layer_hint); -static int -connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, - edge_connection_t *conn, - crypt_path_t *layer_hint); -static void -circuit_consider_sending_sendme(circuit_t *circ, crypt_path_t *layer_hint); +static int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, + edge_connection_t *conn, + crypt_path_t *layer_hint); +static void circuit_consider_sending_sendme(circuit_t *circ, + crypt_path_t *layer_hint); +static void circuit_resume_edge_reading(circuit_t *circ, + crypt_path_t *layer_hint); +static int circuit_resume_edge_reading_helper(edge_connection_t *conn, + circuit_t *circ, + crypt_path_t *layer_hint); +static int circuit_consider_stop_edge_reading(circuit_t *circ, + crypt_path_t *layer_hint); +static int circuit_queue_streams_are_blocked(circuit_t *circ); + +/** Cache the current hi-res time; the cache gets reset when libevent + * calls us. */ + +static struct timeval cached_time_hires = {0, 0}; + +/** Stop reading on edge connections when we have this many cells + * waiting on the appropriate queue. */ +#define CELL_QUEUE_HIGHWATER_SIZE 256 +/** Start reading from edge connections again when we get down to this many + * cells. */ +#define CELL_QUEUE_LOWWATER_SIZE 64 + static void -circuit_resume_edge_reading(circuit_t *circ, crypt_path_t *layer_hint); -static int -circuit_resume_edge_reading_helper(edge_connection_t *conn, - circuit_t *circ, - crypt_path_t *layer_hint); -static int -circuit_consider_stop_edge_reading(circuit_t *circ, crypt_path_t *layer_hint); +tor_gettimeofday_cached(struct timeval *tv) +{ + if (cached_time_hires.tv_sec == 0) { + tor_gettimeofday(&cached_time_hires); + } + *tv = cached_time_hires; +} + +void +tor_gettimeofday_cache_clear(void) +{ + cached_time_hires.tv_sec = 0; +} /** Stats: how many relay cells have originated at this hop, or have * been relayed onward (not recognized at this hop)? @@ -141,7 +183,8 @@ * Return -reason on failure. */ int -circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, int cell_direction) +circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, + cell_direction_t cell_direction) { or_connection_t *or_conn=NULL; crypt_path_t *layer_hint=NULL; @@ -209,6 +252,7 @@ tor_assert(circ->purpose == CIRCUIT_PURPOSE_REND_ESTABLISHED); tor_assert(splice->_base.purpose == CIRCUIT_PURPOSE_REND_ESTABLISHED); cell->circ_id = splice->p_circ_id; + cell->command = CELL_RELAY; /* can't be relay_early anyway */ if ((reason = circuit_receive_relay_cell(cell, TO_CIRCUIT(splice), CELL_DIRECTION_IN)) < 0) { log_warn(LD_REND, "Error relaying cell across rendezvous; closing " @@ -230,7 +274,7 @@ * we might kill the circ before we relay * the cells. */ - append_cell_to_circuit_queue(circ, or_conn, cell, cell_direction); + append_cell_to_circuit_queue(circ, or_conn, cell, cell_direction, 0); return 0; } @@ -252,7 +296,7 @@ * else return 0. */ static int -relay_crypt(circuit_t *circ, cell_t *cell, int cell_direction, +relay_crypt(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction, crypt_path_t **layer_hint, char *recognized) { relay_header_t rh; @@ -326,8 +370,8 @@ */ static int circuit_package_relay_cell(cell_t *cell, circuit_t *circ, - int cell_direction, - crypt_path_t *layer_hint) + cell_direction_t cell_direction, + crypt_path_t *layer_hint, streamid_t on_stream) { or_connection_t *conn; /* where to send the cell */ @@ -338,6 +382,7 @@ log_warn(LD_BUG,"outgoing relay cell has n_conn==NULL. Dropping."); return 0; /* just drop it */ } + relay_set_digest(layer_hint->f_digest, cell); thishop = layer_hint; @@ -370,7 +415,7 @@ } ++stats_n_relay_cells_relayed; - append_cell_to_circuit_queue(circ, conn, cell, cell_direction); + append_cell_to_circuit_queue(circ, conn, cell, cell_direction, on_stream); return 0; } @@ -378,8 +423,8 @@ * attached to circ, return that conn, else return NULL. */ static edge_connection_t * -relay_lookup_conn(circuit_t *circ, cell_t *cell, int cell_direction, - crypt_path_t *layer_hint) +relay_lookup_conn(circuit_t *circ, cell_t *cell, + cell_direction_t cell_direction, crypt_path_t *layer_hint) { edge_connection_t *tmpconn; relay_header_t rh; @@ -455,6 +500,38 @@ dest->length = ntohs(get_uint16(src+9)); } +/** Convert the relay command into a human-readable string. */ +static const char * +relay_command_to_string(uint8_t command) +{ + switch (command) { + case RELAY_COMMAND_BEGIN: return "BEGIN"; + case RELAY_COMMAND_DATA: return "DATA"; + case RELAY_COMMAND_END: return "END"; + case RELAY_COMMAND_CONNECTED: return "CONNECTED"; + case RELAY_COMMAND_SENDME: return "SENDME"; + case RELAY_COMMAND_EXTEND: return "EXTEND"; + case RELAY_COMMAND_EXTENDED: return "EXTENDED"; + case RELAY_COMMAND_TRUNCATE: return "TRUNCATE"; + case RELAY_COMMAND_TRUNCATED: return "TRUNCATED"; + case RELAY_COMMAND_DROP: return "DROP"; + case RELAY_COMMAND_RESOLVE: return "RESOLVE"; + case RELAY_COMMAND_RESOLVED: return "RESOLVED"; + case RELAY_COMMAND_BEGIN_DIR: return "BEGIN_DIR"; + case RELAY_COMMAND_ESTABLISH_INTRO: return "ESTABLISH_INTRO"; + case RELAY_COMMAND_ESTABLISH_RENDEZVOUS: return "ESTABLISH_RENDEZVOUS"; + case RELAY_COMMAND_INTRODUCE1: return "INTRODUCE1"; + case RELAY_COMMAND_INTRODUCE2: return "INTRODUCE2"; + case RELAY_COMMAND_RENDEZVOUS1: return "RENDEZVOUS1"; + case RELAY_COMMAND_RENDEZVOUS2: return "RENDEZVOUS2"; + case RELAY_COMMAND_INTRO_ESTABLISHED: return "INTRO_ESTABLISHED"; + case RELAY_COMMAND_RENDEZVOUS_ESTABLISHED: + return "RENDEZVOUS_ESTABLISHED"; + case RELAY_COMMAND_INTRODUCE_ACK: return "INTRODUCE_ACK"; + default: return "(unrecognized)"; + } +} + /** Make a relay cell out of relay_command and payload, and send * it onto the open circuit circ. stream_id is the ID on * circ for the stream that's sending the relay cell, or 0 if it's a @@ -465,13 +542,13 @@ * return 0. */ int -relay_send_command_from_edge(uint16_t stream_id, circuit_t *circ, +relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ, uint8_t relay_command, const char *payload, size_t payload_len, crypt_path_t *cpath_layer) { cell_t cell; relay_header_t rh; - int cell_direction; + cell_direction_t cell_direction; /* XXXX NM Split this function into a separate versions per circuit type? */ tor_assert(circ); @@ -500,14 +577,61 @@ log_debug(LD_OR,"delivering %d cell %s.", relay_command, cell_direction == CELL_DIRECTION_OUT ? "forward" : "backward"); + /* If we are sending an END cell and this circuit is used for a tunneled + * directory request, advance its state. */ + if (relay_command == RELAY_COMMAND_END && circ->dirreq_id) + geoip_change_dirreq_state(circ->dirreq_id, DIRREQ_TUNNELED, + DIRREQ_END_CELL_SENT); + if (cell_direction == CELL_DIRECTION_OUT && circ->n_conn) { /* if we're using relaybandwidthrate, this conn wants priority */ - /* XXXX021 the call to time() seems little too frequent */ - circ->n_conn->client_used = time(NULL); + circ->n_conn->client_used = approx_time(); } - if (circuit_package_relay_cell(&cell, circ, cell_direction, cpath_layer) - < 0) { + if (cell_direction == CELL_DIRECTION_OUT) { + origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ); + if (origin_circ->remaining_relay_early_cells > 0 && + (relay_command == RELAY_COMMAND_EXTEND || + (cpath_layer != origin_circ->cpath && + !CIRCUIT_PURPOSE_IS_ESTABLISHED_REND(circ->purpose)))) { + /* If we've got any relay_early cells left, and we're sending + * an extend cell or (we're not talking to the first hop and we're + * not talking to a rendezvous circuit), use one of them. + * Don't worry about the conn protocol version: + * append_cell_to_circuit_queue will fix it up. */ + /* XXX For now, clients don't use RELAY_EARLY cells when sending + * relay cells on rendezvous circuits. See bug 1038. Once no relays + * (and thus no rendezvous points) are running 0.2.1.3-alpha through + * 0.2.1.18, we can take out that exception. -RD */ + cell.command = CELL_RELAY_EARLY; + --origin_circ->remaining_relay_early_cells; + log_debug(LD_OR, "Sending a RELAY_EARLY cell; %d remaining.", + (int)origin_circ->remaining_relay_early_cells); + /* Memorize the command that is sent as RELAY_EARLY cell; helps debug + * task 878. */ + origin_circ->relay_early_commands[ + origin_circ->relay_early_cells_sent++] = relay_command; + } else if (relay_command == RELAY_COMMAND_EXTEND) { + /* If no RELAY_EARLY cells can be sent over this circuit, log which + * commands have been sent as RELAY_EARLY cells before; helps debug + * task 878. */ + smartlist_t *commands_list = smartlist_create(); + int i = 0; + char *commands = NULL; + for (; i < origin_circ->relay_early_cells_sent; i++) + smartlist_add(commands_list, (char *) + relay_command_to_string(origin_circ->relay_early_commands[i])); + commands = smartlist_join_strings(commands_list, ",", 0, NULL); + log_warn(LD_BUG, "Uh-oh. We're sending a RELAY_COMMAND_EXTEND cell, " + "but we have run out of RELAY_EARLY cells on that circuit. " + "Commands sent before: %s", commands); + tor_free(commands); + smartlist_free(commands_list); + } + } + + if (circuit_package_relay_cell(&cell, circ, cell_direction, cpath_layer, + stream_id) < 0) { log_warn(LD_BUG,"circuit_package_relay_cell failed. Closing."); circuit_mark_for_close(circ, END_CIRC_REASON_INTERNAL); return -1; @@ -548,7 +672,7 @@ connection_mark_unattached_ap(fromconn, END_STREAM_REASON_INTERNAL); } else { log_info(LD_EXIT,"no circ. Closing conn."); - fromconn->_base.edge_has_sent_end = 1; /* no circ to send to */ + fromconn->edge_has_sent_end = 1; /* no circ to send to */ fromconn->end_reason = END_STREAM_REASON_INTERNAL; connection_mark_for_close(TO_CONN(fromconn)); } @@ -560,144 +684,6 @@ payload_len, fromconn->cpath_layer); } -/** Translate reason, which came from a relay 'end' cell, - * into a static const string describing why the stream is closing. - * reason is -1 if no reason was provided. - */ -static const char * -connection_edge_end_reason_str(int reason) -{ - switch (reason) { - case -1: - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "End cell arrived with length 0. Should be at least 1."); - return "MALFORMED"; - case END_STREAM_REASON_MISC: return "misc error"; - case END_STREAM_REASON_RESOLVEFAILED: return "resolve failed"; - case END_STREAM_REASON_CONNECTREFUSED: return "connection refused"; - case END_STREAM_REASON_EXITPOLICY: return "exit policy failed"; - case END_STREAM_REASON_DESTROY: return "destroyed"; - case END_STREAM_REASON_DONE: return "closed normally"; - case END_STREAM_REASON_TIMEOUT: return "gave up (timeout)"; - case END_STREAM_REASON_HIBERNATING: return "server is hibernating"; - case END_STREAM_REASON_INTERNAL: return "internal error at server"; - case END_STREAM_REASON_RESOURCELIMIT: return "server out of resources"; - case END_STREAM_REASON_CONNRESET: return "connection reset"; - case END_STREAM_REASON_TORPROTOCOL: return "Tor protocol error"; - case END_STREAM_REASON_NOTDIRECTORY: return "not a directory"; - default: - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Reason for ending (%d) not recognized.",reason); - return "unknown"; - } -} - -/** Translate reason (as from a relay 'end' cell) into an - * appropriate SOCKS5 reply code. - * - * A reason of 0 means that we're not actually expecting to send - * this code back to the socks client; we just call it 'succeeded' - * to keep things simple. - */ -socks5_reply_status_t -connection_edge_end_reason_socks5_response(int reason) -{ - switch (reason & END_STREAM_REASON_MASK) { - case 0: - return SOCKS5_SUCCEEDED; - case END_STREAM_REASON_MISC: - return SOCKS5_GENERAL_ERROR; - case END_STREAM_REASON_RESOLVEFAILED: - return SOCKS5_HOST_UNREACHABLE; - case END_STREAM_REASON_CONNECTREFUSED: - return SOCKS5_CONNECTION_REFUSED; - case END_STREAM_REASON_ENTRYPOLICY: - return SOCKS5_NOT_ALLOWED; - case END_STREAM_REASON_EXITPOLICY: - return SOCKS5_NOT_ALLOWED; - case END_STREAM_REASON_DESTROY: - return SOCKS5_GENERAL_ERROR; - case END_STREAM_REASON_DONE: - return SOCKS5_SUCCEEDED; - case END_STREAM_REASON_TIMEOUT: - return SOCKS5_TTL_EXPIRED; - case END_STREAM_REASON_RESOURCELIMIT: - return SOCKS5_GENERAL_ERROR; - case END_STREAM_REASON_HIBERNATING: - return SOCKS5_GENERAL_ERROR; - case END_STREAM_REASON_INTERNAL: - return SOCKS5_GENERAL_ERROR; - case END_STREAM_REASON_CONNRESET: - return SOCKS5_CONNECTION_REFUSED; - case END_STREAM_REASON_TORPROTOCOL: - return SOCKS5_GENERAL_ERROR; - - case END_STREAM_REASON_CANT_ATTACH: - return SOCKS5_GENERAL_ERROR; - case END_STREAM_REASON_NET_UNREACHABLE: - return SOCKS5_NET_UNREACHABLE; - case END_STREAM_REASON_SOCKSPROTOCOL: - return SOCKS5_GENERAL_ERROR; - default: - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Reason for ending (%d) not recognized; " - "sending generic socks error.", reason); - return SOCKS5_GENERAL_ERROR; - } -} - -/* We need to use a few macros to deal with the fact that Windows - * decided that their sockets interface should be a permakludge. - * E_CASE is for errors where windows has both a EFOO and a WSAEFOO - * version, and S_CASE is for errors where windows has only a WSAEFOO - * version. (The E is for 'error', the S is for 'socket'). */ -#ifdef MS_WINDOWS -#define E_CASE(s) case s: case WSA ## s -#define S_CASE(s) case WSA ## s -#else -#define E_CASE(s) case s -#define S_CASE(s) case s -#endif - -/** Given an errno from a failed exit connection, return a reason code - * appropriate for use in a RELAY END cell. - */ -int -errno_to_end_reason(int e) -{ - switch (e) { - case EPIPE: - return END_STREAM_REASON_DONE; - E_CASE(EBADF): - E_CASE(EFAULT): - E_CASE(EINVAL): - S_CASE(EISCONN): - S_CASE(ENOTSOCK): - S_CASE(EPROTONOSUPPORT): - S_CASE(EAFNOSUPPORT): - E_CASE(EACCES): - S_CASE(ENOTCONN): - S_CASE(ENETUNREACH): - return END_STREAM_REASON_INTERNAL; - S_CASE(ECONNREFUSED): - return END_STREAM_REASON_CONNECTREFUSED; - S_CASE(ECONNRESET): - return END_STREAM_REASON_CONNRESET; - S_CASE(ETIMEDOUT): - return END_STREAM_REASON_TIMEOUT; - S_CASE(ENOBUFS): - case ENOMEM: - case ENFILE: - E_CASE(EMFILE): - return END_STREAM_REASON_RESOURCELIMIT; - default: - log_info(LD_EXIT, "Didn't recognize errno %d (%s); telling the client " - "that we are ending a stream for 'misc' reason.", - e, tor_socket_strerror(e)); - return END_STREAM_REASON_MISC; - } -} - /** How many times will I retry a stream that fails due to DNS * resolve failure or misc error? */ @@ -712,14 +698,16 @@ reason == END_STREAM_REASON_RESOURCELIMIT || reason == END_STREAM_REASON_EXITPOLICY || reason == END_STREAM_REASON_RESOLVEFAILED || - reason == END_STREAM_REASON_MISC; + reason == END_STREAM_REASON_MISC || + reason == END_STREAM_REASON_NOROUTE; } -/** Called when we receive an END cell on a stream that isn't open yet. +/** Called when we receive an END cell on a stream that isn't open yet, + * from the client side. * Arguments are as for connection_edge_process_relay_cell(). */ static int -connection_edge_process_end_not_open( +connection_ap_process_end_not_open( relay_header_t *rh, cell_t *cell, origin_circuit_t *circ, edge_connection_t *conn, crypt_path_t *layer_hint) { @@ -730,10 +718,11 @@ (void) layer_hint; /* unused */ if (rh->length > 0 && edge_reason_is_retriable(reason) && - conn->_base.type == CONN_TYPE_AP) { + !connection_edge_is_rendezvous_stream(conn) /* avoid retry if rend */ + ) { log_info(LD_APP,"Address '%s' refused due to '%s'. Considering retrying.", safe_str(conn->socks_request->address), - connection_edge_end_reason_str(reason)); + stream_end_reason_to_string(reason)); exitrouter = router_get_by_digest(circ->build_state->chosen_exit->identity_digest); switch (reason) { @@ -752,10 +741,15 @@ else ttl = -1; - if (!(get_options()->ClientDNSRejectInternalAddresses && - is_internal_IP(addr, 0))) - client_dns_set_addressmap(conn->socks_request->address, addr, - conn->chosen_exit_name, ttl); + if (get_options()->ClientDNSRejectInternalAddresses && + is_internal_IP(addr, 0)) { + log_info(LD_APP,"Address '%s' resolved to internal. Closing,", + safe_str(conn->socks_request->address)); + connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); + return 0; + } + client_dns_set_addressmap(conn->socks_request->address, addr, + conn->chosen_exit_name, ttl); } /* check if he *ought* to have allowed it */ if (exitrouter && @@ -774,10 +768,10 @@ NULL)) { control_event_stream_status(conn, STREAM_EVENT_REMAP, 0); } - if (conn->_base.chosen_exit_optional || - conn->_base.chosen_exit_retries) { + if (conn->chosen_exit_optional || + conn->chosen_exit_retries) { /* stop wanting a specific exit */ - conn->_base.chosen_exit_optional = 0; + conn->chosen_exit_optional = 0; /* A non-zero chosen_exit_retries can happen if we set a * TrackHostExits for this address under a port that the exit * relay allows, but then try the same address with a different @@ -785,7 +779,7 @@ * the mapping, since it is probably still wanted on the * original port. But now we give away to the exit relay that * we probably have a TrackHostExits on it. So be it. */ - conn->_base.chosen_exit_retries = 0; + conn->chosen_exit_retries = 0; tor_free(conn->chosen_exit_name); /* clears it */ } if (connection_ap_detach_retriable(conn, circ, control_reason) >= 0) @@ -793,13 +787,14 @@ /* else, conn will get closed below */ break; case END_STREAM_REASON_CONNECTREFUSED: - if (!conn->_base.chosen_exit_optional) + if (!conn->chosen_exit_optional) break; /* break means it'll close, below */ /* Else fall through: expire this circuit, clear the * chosen_exit_name field, and try again. */ case END_STREAM_REASON_RESOLVEFAILED: case END_STREAM_REASON_TIMEOUT: case END_STREAM_REASON_MISC: + case END_STREAM_REASON_NOROUTE: if (client_dns_incr_failures(conn->socks_request->address) < MAX_RESOLVE_FAILURES) { /* We haven't retried too many times; reattach the connection. */ @@ -807,9 +802,9 @@ tor_assert(circ->_base.timestamp_dirty); circ->_base.timestamp_dirty -= get_options()->MaxCircuitDirtiness; - if (conn->_base.chosen_exit_optional) { + if (conn->chosen_exit_optional) { /* stop wanting a specific exit */ - conn->_base.chosen_exit_optional = 0; + conn->chosen_exit_optional = 0; tor_free(conn->chosen_exit_name); /* clears it */ } if (connection_ap_detach_retriable(conn, circ, control_reason) >= 0) @@ -830,9 +825,9 @@ if (exitrouter) { policies_set_router_exitpolicy_to_reject_all(exitrouter); } - if (conn->_base.chosen_exit_optional) { + if (conn->chosen_exit_optional) { /* stop wanting a specific exit */ - conn->_base.chosen_exit_optional = 0; + conn->chosen_exit_optional = 0; tor_free(conn->chosen_exit_name); /* clears it */ } if (connection_ap_detach_retriable(conn, circ, control_reason) >= 0) @@ -845,16 +840,11 @@ log_info(LD_APP, "Edge got end (%s) before we're connected. Marking for close.", - connection_edge_end_reason_str(rh->length > 0 ? reason : -1)); - if (conn->_base.type == CONN_TYPE_AP) { - circuit_log_path(LOG_INFO,LD_APP,circ); + stream_end_reason_to_string(rh->length > 0 ? reason : -1)); + circuit_log_path(LOG_INFO,LD_APP,circ); + /* need to test because of detach_retriable */ + if (!conn->_base.marked_for_close) connection_mark_unattached_ap(conn, control_reason); - } else { - /* we just got an 'end', don't need to send one */ - conn->_base.edge_has_sent_end = 1; - conn->end_reason = control_reason; - connection_mark_for_close(TO_CONN(conn)); - } return 0; } @@ -886,13 +876,13 @@ edge_connection_t *conn, crypt_path_t *layer_hint) { if (rh->command == RELAY_COMMAND_END) { - if (CIRCUIT_IS_ORIGIN(circ)) - return connection_edge_process_end_not_open(rh, cell, - TO_ORIGIN_CIRCUIT(circ), conn, - layer_hint); - else { + if (CIRCUIT_IS_ORIGIN(circ) && conn->_base.type == CONN_TYPE_AP) { + return connection_ap_process_end_not_open(rh, cell, + TO_ORIGIN_CIRCUIT(circ), conn, + layer_hint); + } else { /* we just got an 'end', don't need to send one */ - conn->_base.edge_has_sent_end = 1; + conn->edge_has_sent_end = 1; conn->end_reason = *(cell->payload+RELAY_HEADER_SIZE) | END_STREAM_REASON_FLAG_REMOTE; connection_mark_for_close(TO_CONN(conn)); @@ -939,8 +929,31 @@ /* don't send a socks reply to transparent conns */ if (!conn->socks_request->has_finished) connection_ap_handshake_socks_reply(conn, NULL, 0, 0); + + /* Was it a linked dir conn? If so, a dir request just started to + * fetch something; this could be a bootstrap status milestone. */ + log_debug(LD_APP, "considering"); + if (TO_CONN(conn)->linked_conn && + TO_CONN(conn)->linked_conn->type == CONN_TYPE_DIR) { + connection_t *dirconn = TO_CONN(conn)->linked_conn; + log_debug(LD_APP, "it is! %d", dirconn->purpose); + switch (dirconn->purpose) { + case DIR_PURPOSE_FETCH_CERTIFICATE: + if (consensus_is_waiting_for_certs()) + control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_KEYS, 0); + break; + case DIR_PURPOSE_FETCH_CONSENSUS: + control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_STATUS, 0); + break; + case DIR_PURPOSE_FETCH_SERVERDESC: + control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, + count_loading_descriptors_progress()); + break; + } + } + /* handle anything that might have queued */ - if (connection_edge_package_raw_inbuf(conn, 1) < 0) { + if (connection_edge_package_raw_inbuf(conn, 1, NULL) < 0) { /* (We already sent an end cell if possible) */ connection_mark_for_close(TO_CONN(conn)); return 0; @@ -971,7 +984,7 @@ 2+answer_len)); else ttl = -1; - if (answer_type == RESOLVED_TYPE_IPV4 && answer_len >= 4) { + if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) { uint32_t addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+2)); if (get_options()->ClientDNSRejectInternalAddresses && is_internal_IP(addr, 0)) { @@ -993,7 +1006,7 @@ cell->payload+RELAY_HEADER_SIZE+2, /*answer*/ ttl, -1); - if (answer_type == RESOLVED_TYPE_IPV4) { + if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) { uint32_t addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+2)); remap_event_helper(conn, addr); } @@ -1038,7 +1051,8 @@ relay_header_unpack(&rh, cell->payload); // log_fn(LOG_DEBUG,"command %d stream %d", rh.command, rh.stream_id); num_seen++; - log_debug(domain, "Now seen %d relay cells here.", num_seen); + log_debug(domain, "Now seen %d relay cells here (command %d, stream %d).", + num_seen, rh.command, rh.stream_id); if (rh.length > RELAY_PAYLOAD_SIZE) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, @@ -1065,11 +1079,28 @@ "Relay begin request unsupported at AP. Dropping."); return 0; } + if (circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED && + layer_hint != TO_ORIGIN_CIRCUIT(circ)->cpath->prev) { + log_fn(LOG_PROTOCOL_WARN, LD_APP, + "Relay begin request to Hidden Service " + "from intermediary node. Dropping."); + return 0; + } if (conn) { log_fn(LOG_PROTOCOL_WARN, domain, "Begin cell for known stream. Dropping."); return 0; } + if (rh.command == RELAY_COMMAND_BEGIN_DIR) { + /* Assign this circuit and its app-ward OR connection a unique ID, + * so that we can measure download times. The local edge and dir + * connection will be assigned the same ID when they are created + * and linked. */ + static uint64_t next_id = 0; + circ->dirreq_id = ++next_id; + TO_CONN(TO_OR_CIRCUIT(circ)->p_conn)->dirreq_id = circ->dirreq_id; + } + return connection_exit_begin_conn(cell, circ); case RELAY_COMMAND_DATA: ++stats_n_data_cells_received; @@ -1087,7 +1118,8 @@ circuit_consider_sending_sendme(circ, layer_hint); if (!conn) { - log_info(domain,"data cell dropped, unknown stream."); + log_info(domain,"data cell dropped, unknown stream (streamid %d).", + rh.stream_id); return 0; } @@ -1107,19 +1139,19 @@ *(uint8_t *)(cell->payload+RELAY_HEADER_SIZE) : END_STREAM_REASON_MISC; if (!conn) { log_info(domain,"end cell (%s) dropped, unknown stream.", - connection_edge_end_reason_str(reason)); + stream_end_reason_to_string(reason)); return 0; } /* XXX add to this log_fn the exit node's nickname? */ log_info(domain,"%d: end cell (%s) for stream %d. Removing stream.", conn->_base.s, - connection_edge_end_reason_str(reason), + stream_end_reason_to_string(reason), conn->stream_id); if (conn->socks_request && !conn->socks_request->has_finished) log_warn(LD_BUG, "open stream hasn't sent socks answer yet? Closing."); /* We just *got* an end; no reason to send one. */ - conn->_base.edge_has_sent_end = 1; + conn->edge_has_sent_end = 1; if (!conn->end_reason) conn->end_reason = reason | END_STREAM_REASON_FLAG_REMOTE; if (!conn->_base.marked_for_close) { @@ -1162,6 +1194,7 @@ } if (circ->n_conn) { uint8_t trunc_reason = *(uint8_t*)(cell->payload + RELAY_HEADER_SIZE); + circuit_clear_cell_queue(circ, circ->n_conn); connection_or_send_destroy(circ->n_circ_id, circ->n_conn, trunc_reason); circuit_set_n_circid_orconn(circ, 0, NULL); @@ -1210,9 +1243,13 @@ conn->package_window += STREAMWINDOW_INCREMENT; log_debug(domain,"stream-level sendme, packagewindow now %d.", conn->package_window); + if (circuit_queue_streams_are_blocked(circ)) { + /* Still waiting for queue to flush; don't touch conn */ + return 0; + } connection_start_reading(TO_CONN(conn)); /* handle whatever might still be on the inbuf */ - if (connection_edge_package_raw_inbuf(conn, 1) < 0) { + if (connection_edge_package_raw_inbuf(conn, 1, NULL) < 0) { /* (We already sent an end cell if possible) */ connection_mark_for_close(TO_CONN(conn)); return 0; @@ -1265,20 +1302,32 @@ return 0; /* for forward compatibility, don't kill the circuit */ } +/** How many relay_data cells have we built, ever? */ uint64_t stats_n_data_cells_packaged = 0; +/** How many bytes of data have we put in relay_data cells have we built, + * ever? This would be RELAY_PAYLOAD_SIZE*stats_n_data_cells_packaged if + * every relay cell we ever sent were completely full of data. */ uint64_t stats_n_data_bytes_packaged = 0; +/** How many relay_data cells have we received, ever? */ uint64_t stats_n_data_cells_received = 0; +/** How many bytes of data have we received relay_data cells, ever? This would + * be RELAY_PAYLOAD_SIZE*stats_n_data_cells_packaged if every relay cell we + * ever received were completely full of data. */ uint64_t stats_n_data_bytes_received = 0; -/** While conn->inbuf has an entire relay payload of bytes on it, - * and the appropriate package windows aren't empty, grab a cell - * and send it down the circuit. +/** If conn has an entire relay payload of bytes on its inbuf (or + * package_partial is true), and the appropriate package windows aren't + * empty, grab a cell and send it down the circuit. * - * Return -1 (and send a RELAY_END cell if necessary) if conn should + * If *max_cells is given, package no more than max_cells. Decrement + * *max_cells by the number of cells packaged. + * + * Return -1 (and send a RELAY_COMMAND_END cell if necessary) if conn should * be marked for close, else return 0. */ int -connection_edge_package_raw_inbuf(edge_connection_t *conn, int package_partial) +connection_edge_package_raw_inbuf(edge_connection_t *conn, int package_partial, + int *max_cells) { size_t amount_to_process, length; char payload[CELL_PAYLOAD_SIZE]; @@ -1294,7 +1343,10 @@ return 0; } -repeat_connection_edge_package_raw_inbuf: + if (max_cells && *max_cells <= 0) + return 0; + + repeat_connection_edge_package_raw_inbuf: circ = circuit_get_by_edge_conn(conn); if (!circ) { @@ -1355,6 +1407,12 @@ } log_debug(domain,"conn->package_window is now %d",conn->package_window); + if (max_cells) { + *max_cells -= 1; + if (*max_cells <= 0) + return 0; + } + /* handle more if there's more, or return 0 if there isn't */ goto repeat_connection_edge_package_raw_inbuf; } @@ -1381,9 +1439,9 @@ return; } - while (conn->deliver_window < STREAMWINDOW_START - STREAMWINDOW_INCREMENT) { + while (conn->deliver_window <= STREAMWINDOW_START - STREAMWINDOW_INCREMENT) { log_debug(conn->cpath_layer?LD_APP:LD_EXIT, - "Outbuf %d, Queueing stream sendme.", + "Outbuf %d, Queuing stream sendme.", (int)conn->_base.outbuf_flushlen); conn->deliver_window += STREAMWINDOW_INCREMENT; if (connection_edge_send_command(conn, RELAY_COMMAND_SENDME, @@ -1402,7 +1460,10 @@ static void circuit_resume_edge_reading(circuit_t *circ, crypt_path_t *layer_hint) { - + if (circuit_queue_streams_are_blocked(circ)) { + log_debug(layer_hint?LD_APP:LD_EXIT,"Too big queue, no resuming"); + return; + } log_debug(layer_hint?LD_APP:LD_EXIT,"resuming"); if (CIRCUIT_IS_ORIGIN(circ)) @@ -1418,31 +1479,100 @@ * of a linked list of edge streams that should each be considered. */ static int -circuit_resume_edge_reading_helper(edge_connection_t *conn, +circuit_resume_edge_reading_helper(edge_connection_t *first_conn, circuit_t *circ, crypt_path_t *layer_hint) { - for ( ; conn; conn=conn->next_stream) { - if (conn->_base.marked_for_close) + edge_connection_t *conn; + int n_streams, n_streams_left; + int packaged_this_round; + int cells_on_queue; + int cells_per_conn; + + /* How many cells do we have space for? It will be the minimum of + * the number needed to exhaust the package window, and the minimum + * needed to fill the cell queue. */ + int max_to_package = circ->package_window; + if (CIRCUIT_IS_ORIGIN(circ)) { + cells_on_queue = circ->n_conn_cells.n; + } else { + or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); + cells_on_queue = or_circ->p_conn_cells.n; + } + if (CELL_QUEUE_HIGHWATER_SIZE - cells_on_queue < max_to_package) + max_to_package = CELL_QUEUE_HIGHWATER_SIZE - cells_on_queue; + + /* Count how many non-marked streams there are that have anything on + * their inbuf, and enable reading on all of the connections. */ + n_streams = 0; + for (conn=first_conn; conn; conn=conn->next_stream) { + if (conn->_base.marked_for_close || conn->package_window <= 0) continue; - if ((!layer_hint && conn->package_window > 0) || - (layer_hint && conn->package_window > 0 && - conn->cpath_layer == layer_hint)) { + if (!layer_hint || conn->cpath_layer == layer_hint) { connection_start_reading(TO_CONN(conn)); + + if (buf_datalen(conn->_base.inbuf) > 0) + ++n_streams; + } + } + + if (n_streams == 0) /* avoid divide-by-zero */ + return 0; + + again: + + cells_per_conn = CEIL_DIV(max_to_package, n_streams); + + packaged_this_round = 0; + n_streams_left = 0; + + /* Iterate over all connections. Package up to cells_per_conn cells on + * each. Update packaged_this_round with the total number of cells + * packaged, and n_streams_left with the number that still have data to + * package. + */ + for (conn=first_conn; conn; conn=conn->next_stream) { + if (conn->_base.marked_for_close || conn->package_window <= 0) + continue; + if (!layer_hint || conn->cpath_layer == layer_hint) { + int n = cells_per_conn, r; /* handle whatever might still be on the inbuf */ - if (connection_edge_package_raw_inbuf(conn, 1)<0) { - /* (We already sent an end cell if possible) */ + r = connection_edge_package_raw_inbuf(conn, 1, &n); + + /* Note how many we packaged */ + packaged_this_round += (cells_per_conn-n); + + if (r<0) { + /* Problem while packaging. (We already sent an end cell if + * possible) */ connection_mark_for_close(TO_CONN(conn)); continue; } + /* If there's still data to read, we'll be coming back to this stream. */ + if (buf_datalen(conn->_base.inbuf)) + ++n_streams_left; + /* If the circuit won't accept any more data, return without looking * at any more of the streams. Any connections that should be stopped * have already been stopped by connection_edge_package_raw_inbuf. */ if (circuit_consider_stop_edge_reading(circ, layer_hint)) return -1; + /* XXXX should we also stop immediately if we fill up the cell queue? + * Probably. */ } } + + /* If we made progress, and we are willing to package more, and there are + * any streams left that want to package stuff... try again! + */ + if (packaged_this_round && packaged_this_round < max_to_package && + n_streams_left) { + max_to_package -= packaged_this_round; + n_streams = n_streams_left; + goto again; + } + return 0; } @@ -1495,9 +1625,9 @@ { // log_fn(LOG_INFO,"Considering: layer_hint is %s", // layer_hint ? "defined" : "null"); - while ((layer_hint ? layer_hint->deliver_window : circ->deliver_window) < + while ((layer_hint ? layer_hint->deliver_window : circ->deliver_window) <= CIRCWINDOW_START - CIRCWINDOW_INCREMENT) { - log_debug(LD_CIRC,"Queueing circuit sendme."); + log_debug(LD_CIRC,"Queuing circuit sendme."); if (layer_hint) layer_hint->deliver_window += CIRCWINDOW_INCREMENT; else @@ -1511,13 +1641,6 @@ } } -/** Stop reading on edge connections when we have this many cells - * waiting on the appropriate queue. */ -#define CELL_QUEUE_HIGHWATER_SIZE 256 -/** Start reading from edge connections again when we get down to this many - * cells. */ -#define CELL_QUEUE_LOWWATER_SIZE 64 - #ifdef ACTIVE_CIRCUITS_PARANOIA #define assert_active_circuits_ok_paranoid(conn) \ assert_active_circuits_ok(conn) @@ -1528,10 +1651,13 @@ /** The total number of cells we have allocated from the memory pool. */ static int total_cells_allocated = 0; -#ifdef ENABLE_CELL_POOL /* Defined in ./configure. True by default. */ -/* XXX021 make cell pools the only option once we know they work and improve - * matters? -RD */ +/** A memory pool to allocate packed_cell_t objects. */ static mp_pool_t *cell_pool = NULL; + +/** Memory pool to allocate insertion_time_elem_t objects used for cell + * statistics. */ +static mp_pool_t *it_pool = NULL; + /** Allocate structures to hold cells. */ void init_cell_pool(void) @@ -1540,7 +1666,8 @@ cell_pool = mp_pool_new(sizeof(packed_cell_t), 128*1024); } -/** Free all storage used to hold cells. */ +/** Free all storage used to hold cells (and insertion times if we measure + * cell statistics). */ void free_cell_pool(void) { @@ -1549,6 +1676,10 @@ mp_pool_destroy(cell_pool); cell_pool = NULL; } + if (it_pool) { + mp_pool_destroy(it_pool); + it_pool = NULL; + } } /** Free excess storage in cell pool. */ @@ -1561,7 +1692,7 @@ /** Release storage held by cell. */ static INLINE void -packed_cell_free(packed_cell_t *cell) +packed_cell_free_unchecked(packed_cell_t *cell) { --total_cells_allocated; mp_pool_release(cell); @@ -1574,6 +1705,9 @@ ++total_cells_allocated; return mp_pool_get(cell_pool); } + +/** Log current statistics for cell pool allocation at log level + * severity. */ void dump_cell_pool_usage(int severity) { @@ -1590,43 +1724,6 @@ n_cells, n_circs, total_cells_allocated - n_cells); mp_pool_log_status(cell_pool, severity); } -#else -/* ENABLE_CELL_POOL isn't defined: here are some stubs to use tor_malloc() - * and tor_free() instead. */ -void -init_cell_pool(void) -{ -} - -void -free_cell_pool(void) -{ -} - -void -clean_cell_pool(void) -{ -} - -static INLINE void -packed_cell_free(packed_cell_t *cell) -{ - --total_cells_allocated; - tor_free(cell); -} - -static INLINE packed_cell_t * -packed_cell_alloc(void) -{ - ++total_cells_allocated; - return tor_malloc(sizeof(packed_cell_t)); -} -void -dump_cell_pool_usage(int severity) -{ - (void) severity; -} -#endif /** Allocate a new copy of packed cell. */ static INLINE packed_cell_t * @@ -1657,7 +1754,38 @@ void cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell) { - cell_queue_append(queue, packed_cell_copy(cell)); + packed_cell_t *copy = packed_cell_copy(cell); + /* Remember the time when this cell was put in the queue. */ + if (get_options()->CellStatistics) { + struct timeval now; + uint32_t added; + insertion_time_queue_t *it_queue = queue->insertion_times; + if (!it_pool) + it_pool = mp_pool_new(sizeof(insertion_time_elem_t), 1024); + tor_gettimeofday_cached(&now); +#define SECONDS_IN_A_DAY 86400L + added = (uint32_t)(((now.tv_sec % SECONDS_IN_A_DAY) * 100L) + + ((uint32_t)now.tv_usec / (uint32_t)10000L)); + if (!it_queue) { + it_queue = tor_malloc_zero(sizeof(insertion_time_queue_t)); + queue->insertion_times = it_queue; + } + if (it_queue->last && it_queue->last->insertion_time == added) { + it_queue->last->counter++; + } else { + insertion_time_elem_t *elem = mp_pool_get(it_pool); + elem->next = NULL; + elem->insertion_time = added; + elem->counter = 1; + if (it_queue->last) { + it_queue->last->next = elem; + it_queue->last = elem; + } else { + it_queue->first = it_queue->last = elem; + } + } + } + cell_queue_append(queue, copy); } /** Remove and free every cell in queue. */ @@ -1668,11 +1796,19 @@ cell = queue->head; while (cell) { next = cell->next; - packed_cell_free(cell); + packed_cell_free_unchecked(cell); cell = next; } queue->head = queue->tail = NULL; queue->n = 0; + if (queue->insertion_times) { + while (queue->insertion_times->first) { + insertion_time_elem_t *elem = queue->insertion_times->first; + queue->insertion_times->first = elem->next; + mp_pool_release(elem); + } + tor_free(queue->insertion_times); + } } /** Extract and return the cell at the head of queue; return NULL if @@ -1724,8 +1860,226 @@ } } +/** Helper for sorting cell_ewma_t values in their priority queue. */ +static int +compare_cell_ewma_counts(const void *p1, const void *p2) +{ + const cell_ewma_t *e1=p1, *e2=p2; + if (e1->cell_count < e2->cell_count) + return -1; + else if (e1->cell_count > e2->cell_count) + return 1; + else + return 0; +} + +/** Given a cell_ewma_t, return a pointer to the circuit containing it. */ +static circuit_t * +cell_ewma_to_circuit(cell_ewma_t *ewma) +{ + if (ewma->is_for_p_conn) { + /* This is an or_circuit_t's p_cell_ewma. */ + or_circuit_t *orcirc = SUBTYPE_P(ewma, or_circuit_t, p_cell_ewma); + return TO_CIRCUIT(orcirc); + } else { + /* This is some circuit's n_cell_ewma. */ + return SUBTYPE_P(ewma, circuit_t, n_cell_ewma); + } +} + +/* ==== Functions for scaling cell_ewma_t ==== + + When choosing which cells to relay first, we favor circuits that have been + quiet recently. This gives better latency on connections that aren't + pushing lots of data, and makes the network feel more interactive. + + Conceptually, we take an exponentially weighted mean average of the number + of cells a circuit has sent, and allow active circuits (those with cells to + relay) to send cells in reverse order of their exponentially-weighted mean + average (EWMA) cell count. [That is, a cell sent N seconds ago 'counts' + F^N times as much as a cell sent now, for 0now, compute the cell_ewma tick in which it occurs + * and the fraction of the tick that has elapsed between the start of the tick + * and now. Return the former and store the latter in + * *remainder_out. + * + * These tick values are not meant to be shared between Tor instances, or used + * for other purposes. */ +static unsigned +cell_ewma_tick_from_timeval(const struct timeval *now, + double *remainder_out) +{ + unsigned res = (unsigned) (now->tv_sec / EWMA_TICK_LEN); + /* rem */ + double rem = (now->tv_sec % EWMA_TICK_LEN) + + ((double)(now->tv_usec)) / 1.0e6; + *remainder_out = rem / EWMA_TICK_LEN; + return res; +} + +/** Compute and return the current cell_ewma tick. */ +unsigned +cell_ewma_get_tick(void) +{ + return ((unsigned)approx_time() / EWMA_TICK_LEN); +} + +/** The per-tick scale factor to be used when computing cell-count EWMA + * values. (A cell sent N ticks before the start of the current tick + * has value ewma_scale_factor ** N.) + */ +static double ewma_scale_factor = 0.1; +static int ewma_enabled = 0; + +#define EPSILON 0.00001 +#define LOG_ONEHALF -0.69314718055994529 + +/** Adjust the global cell scale factor based on options */ +void +cell_ewma_set_scale_factor(or_options_t *options, networkstatus_t *consensus) +{ + int32_t halflife_ms; + double halflife; + const char *source; + if (options && options->CircuitPriorityHalflife >= -EPSILON) { + halflife = options->CircuitPriorityHalflife; + source = "CircuitPriorityHalflife in configuration"; + } else if (consensus && + (halflife_ms = networkstatus_get_param( + consensus, "CircuitPriorityHalflifeMsec", -1)) >= 0) { + halflife = ((double)halflife_ms)/1000.0; + source = "CircuitPriorityHalflifeMsec in consensus"; + } else { + halflife = EWMA_DEFAULT_HALFLIFE; + source = "Default value"; + } + + if (halflife <= EPSILON) { + /* The cell EWMA algorithm is disabled. */ + ewma_scale_factor = 0.1; + ewma_enabled = 0; + log_info(LD_OR, + "Disabled cell_ewma algorithm because of value in %s", + source); + } else { + /* convert halflife into halflife-per-tick. */ + halflife /= EWMA_TICK_LEN; + /* compute per-tick scale factor. */ + ewma_scale_factor = exp( LOG_ONEHALF / halflife ); + ewma_enabled = 1; + log_info(LD_OR, + "Enabled cell_ewma algorithm because of value in %s; " + "scale factor is %lf per %d seconds", + source, ewma_scale_factor, EWMA_TICK_LEN); + } +} + +/** Return the multiplier necessary to convert the value of a cell sent in + * 'from_tick' to one sent in 'to_tick'. */ +static INLINE double +get_scale_factor(unsigned from_tick, unsigned to_tick) +{ + /* This math can wrap around, but that's okay: unsigned overflow is + well-defined */ + int diff = (int)(to_tick - from_tick); + return pow(ewma_scale_factor, diff); +} + +/** Adjust the cell count of ewma so that it is scaled with respect to + * cur_tick */ +static void +scale_single_cell_ewma(cell_ewma_t *ewma, unsigned cur_tick) +{ + double factor = get_scale_factor(ewma->last_adjusted_tick, cur_tick); + ewma->cell_count *= factor; + ewma->last_adjusted_tick = cur_tick; +} + +/** Adjust the cell count of every active circuit on conn so + * that they are scaled with respect to cur_tick */ +static void +scale_active_circuits(or_connection_t *conn, unsigned cur_tick) +{ + + double factor = get_scale_factor( + conn->active_circuit_pqueue_last_recalibrated, + cur_tick); + /** Ordinarily it isn't okay to change the value of an element in a heap, + * but it's okay here, since we are preserving the order. */ + SMARTLIST_FOREACH(conn->active_circuit_pqueue, cell_ewma_t *, e, { + tor_assert(e->last_adjusted_tick == + conn->active_circuit_pqueue_last_recalibrated); + e->cell_count *= factor; + e->last_adjusted_tick = cur_tick; + }); + conn->active_circuit_pqueue_last_recalibrated = cur_tick; +} + +/** Rescale ewma to the same scale as conn, and add it to + * conn's priority queue of active circuits */ +static void +add_cell_ewma_to_conn(or_connection_t *conn, cell_ewma_t *ewma) +{ + tor_assert(ewma->heap_index == -1); + scale_single_cell_ewma(ewma, + conn->active_circuit_pqueue_last_recalibrated); + + smartlist_pqueue_add(conn->active_circuit_pqueue, + compare_cell_ewma_counts, + STRUCT_OFFSET(cell_ewma_t, heap_index), + ewma); +} + +/** Remove ewma from conn's priority queue of active circuits */ +static void +remove_cell_ewma_from_conn(or_connection_t *conn, cell_ewma_t *ewma) +{ + tor_assert(ewma->heap_index != -1); + smartlist_pqueue_remove(conn->active_circuit_pqueue, + compare_cell_ewma_counts, + STRUCT_OFFSET(cell_ewma_t, heap_index), + ewma); +} + +/** Remove and return the first cell_ewma_t from conn's priority queue of + * active circuits. Requires that the priority queue is nonempty. */ +static cell_ewma_t * +pop_first_cell_ewma_from_conn(or_connection_t *conn) +{ + return smartlist_pqueue_pop(conn->active_circuit_pqueue, + compare_cell_ewma_counts, + STRUCT_OFFSET(cell_ewma_t, heap_index)); +} + /** Add circ to the list of circuits with pending cells on - * conn. No effect if circ is already unlinked. */ + * conn. No effect if circ is already linked. */ void make_circuit_active_on_conn(circuit_t *circ, or_connection_t *conn) { @@ -1737,6 +2091,8 @@ return; } + assert_active_circuits_ok_paranoid(conn); + if (! conn->active_circuits) { conn->active_circuits = circ; *prevp = *nextp = circ; @@ -1748,10 +2104,19 @@ *prev_circ_on_conn_p(head, conn) = circ; *prevp = old_tail; } + + if (circ->n_conn == conn) { + add_cell_ewma_to_conn(conn, &circ->n_cell_ewma); + } else { + or_circuit_t *orcirc = TO_OR_CIRCUIT(circ); + tor_assert(conn == orcirc->p_conn); + add_cell_ewma_to_conn(conn, &orcirc->p_cell_ewma); + } + assert_active_circuits_ok_paranoid(conn); } -/** Remove circ to the list of circuits with pending cells on +/** Remove circ from the list of circuits with pending cells on * conn. No effect if circ is already unlinked. */ void make_circuit_inactive_on_conn(circuit_t *circ, or_connection_t *conn) @@ -1765,6 +2130,8 @@ return; } + assert_active_circuits_ok_paranoid(conn); + tor_assert(next && prev); tor_assert(*prev_circ_on_conn_p(next, conn) == circ); tor_assert(*next_circ_on_conn_p(prev, conn) == circ); @@ -1778,6 +2145,15 @@ conn->active_circuits = next; } *prevp = *nextp = NULL; + + if (circ->n_conn == conn) { + remove_cell_ewma_from_conn(conn, &circ->n_cell_ewma); + } else { + or_circuit_t *orcirc = TO_OR_CIRCUIT(circ); + tor_assert(conn == orcirc->p_conn); + remove_cell_ewma_from_conn(conn, &orcirc->p_cell_ewma); + } + assert_active_circuits_ok_paranoid(conn); } @@ -1797,16 +2173,27 @@ cur = next; } while (cur != head); orconn->active_circuits = NULL; + + SMARTLIST_FOREACH(orconn->active_circuit_pqueue, cell_ewma_t *, e, + e->heap_index = -1); + smartlist_clear(orconn->active_circuit_pqueue); } /** Block (if block is true) or unblock (if block is false) * every edge connection that is using circ to write to orconn, - * and start or stop reading as appropriate. */ -static void + * and start or stop reading as appropriate. + * + * If stream_id is nonzero, block only the edge connection whose + * stream_id matches it. + * + * Returns the number of streams whose status we changed. + */ +static int set_streams_blocked_on_circ(circuit_t *circ, or_connection_t *orconn, - int block) + int block, streamid_t stream_id) { edge_connection_t *edge = NULL; + int n = 0; if (circ->n_conn == orconn) { circ->streams_blocked_on_n_conn = block; if (CIRCUIT_IS_ORIGIN(circ)) @@ -1819,7 +2206,13 @@ for (; edge; edge = edge->next_stream) { connection_t *conn = TO_CONN(edge); - conn->edge_blocked_on_circ = block; + if (stream_id && edge->stream_id != stream_id) + continue; + + if (edge->edge_blocked_on_circ != block) { + ++n; + edge->edge_blocked_on_circ = block; + } if (!conn->read_event) { /* This connection is a placeholder for something; probably a DNS @@ -1836,23 +2229,51 @@ connection_start_reading(conn); } } + + return n; } /** Pull as many cells as possible (but no more than max) from the - * queue of the first active circuit on conn, and write then to + * queue of the first active circuit on conn, and write them to * conn->outbuf. Return the number of cells written. Advance * the active circuit pointer to the next active circuit in the ring. */ int -connection_or_flush_from_first_active_circuit(or_connection_t *conn, - int max, time_t now) +connection_or_flush_from_first_active_circuit(or_connection_t *conn, int max, + time_t now) { int n_flushed; cell_queue_t *queue; circuit_t *circ; int streams_blocked; + + /* The current (hi-res) time */ + struct timeval now_hires; + + /* The EWMA cell counter for the circuit we're flushing. */ + cell_ewma_t *cell_ewma = NULL; + double ewma_increment = -1; + circ = conn->active_circuits; if (!circ) return 0; assert_active_circuits_ok_paranoid(conn); + + /* See if we're doing the ewma circuit selection algorithm. */ + if (ewma_enabled) { + unsigned tick; + double fractional_tick; + tor_gettimeofday_cached(&now_hires); + tick = cell_ewma_tick_from_timeval(&now_hires, &fractional_tick); + + if (tick != conn->active_circuit_pqueue_last_recalibrated) { + scale_active_circuits(conn, tick); + } + + ewma_increment = pow(ewma_scale_factor, -fractional_tick); + + cell_ewma = smartlist_get(conn->active_circuit_pqueue, 0); + circ = cell_ewma_to_circuit(cell_ewma); + } + if (circ->n_conn == conn) { queue = &circ->n_conn_cells; streams_blocked = circ->streams_blocked_on_n_conn; @@ -1866,10 +2287,60 @@ packed_cell_t *cell = cell_queue_pop(queue); tor_assert(*next_circ_on_conn_p(circ,conn)); + /* Calculate the exact time that this cell has spent in the queue. */ + if (get_options()->CellStatistics && !CIRCUIT_IS_ORIGIN(circ)) { + struct timeval now; + uint32_t flushed; + uint32_t cell_waiting_time; + insertion_time_queue_t *it_queue = queue->insertion_times; + tor_gettimeofday_cached(&now); + flushed = (uint32_t)((now.tv_sec % SECONDS_IN_A_DAY) * 100L + + (uint32_t)now.tv_usec / (uint32_t)10000L); + if (!it_queue || !it_queue->first) { + log_info(LD_GENERAL, "Cannot determine insertion time of cell. " + "Looks like the CellStatistics option was " + "recently enabled."); + } else { + or_circuit_t *orcirc = TO_OR_CIRCUIT(circ); + insertion_time_elem_t *elem = it_queue->first; + cell_waiting_time = + (uint32_t)((flushed * 10L + SECONDS_IN_A_DAY * 1000L - + elem->insertion_time * 10L) % + (SECONDS_IN_A_DAY * 1000L)); +#undef SECONDS_IN_A_DAY + elem->counter--; + if (elem->counter < 1) { + it_queue->first = elem->next; + if (elem == it_queue->last) + it_queue->last = NULL; + mp_pool_release(elem); + } + orcirc->total_cell_waiting_time += cell_waiting_time; + orcirc->processed_cells++; + } + } + + /* If we just flushed our queue and this circuit is used for a + * tunneled directory request, possibly advance its state. */ + if (queue->n == 0 && TO_CONN(conn)->dirreq_id) + geoip_change_dirreq_state(TO_CONN(conn)->dirreq_id, + DIRREQ_TUNNELED, + DIRREQ_CIRC_QUEUE_FLUSHED); + connection_write_to_buf(cell->body, CELL_NETWORK_SIZE, TO_CONN(conn)); - packed_cell_free(cell); + packed_cell_free_unchecked(cell); ++n_flushed; + if (cell_ewma) { + cell_ewma_t *tmp; + cell_ewma->cell_count += ewma_increment; + /* We pop and re-add the cell_ewma_t here, not above, since we need to + * re-add it immediately to keep the priority queue consistent with + * the linked-list implementation */ + tmp = pop_first_cell_ewma_from_conn(conn); + tor_assert(tmp == cell_ewma); + add_cell_ewma_to_conn(conn, cell_ewma); + } if (circ != conn->active_circuits) { /* If this happens, the current circuit just got made inactive by * a call in connection_write_to_buf(). That's nothing to worry about: @@ -1887,9 +2358,9 @@ /* Is the cell queue low enough to unblock all the streams that are waiting * to write to this circuit? */ if (streams_blocked && queue->n <= CELL_QUEUE_LOWWATER_SIZE) - set_streams_blocked_on_circ(circ, conn, 0); /* unblock streams */ + set_streams_blocked_on_circ(circ, conn, 0, 0); /* unblock streams */ - /* Did we just ran out of cells on this queue? */ + /* Did we just run out of cells on this circuit's queue? */ if (queue->n == 0) { log_debug(LD_GENERAL, "Made a circuit inactive."); make_circuit_inactive_on_conn(circ, conn); @@ -1904,10 +2375,14 @@ * transmitting in direction. */ void append_cell_to_circuit_queue(circuit_t *circ, or_connection_t *orconn, - cell_t *cell, int direction) + cell_t *cell, cell_direction_t direction, + streamid_t fromstream) { cell_queue_t *queue; int streams_blocked; + if (circ->marked_for_close) + return; + if (direction == CELL_DIRECTION_OUT) { queue = &circ->n_conn_cells; streams_blocked = circ->streams_blocked_on_n_conn; @@ -1926,7 +2401,12 @@ /* If we have too many cells on the circuit, we should stop reading from * the edge streams for a while. */ if (!streams_blocked && queue->n >= CELL_QUEUE_HIGHWATER_SIZE) - set_streams_blocked_on_circ(circ, orconn, 1); /* block streams */ + set_streams_blocked_on_circ(circ, orconn, 1, 0); /* block streams */ + + if (streams_blocked && fromstream) { + /* This edge connection is apparently not blocked; block it. */ + set_streams_blocked_on_circ(circ, orconn, 1, fromstream); + } if (queue->n == 1) { /* This was the first cell added to the queue. We need to make this @@ -1941,8 +2421,87 @@ * get called, and we can start putting more data onto the buffer then. */ log_debug(LD_GENERAL, "Primed a buffer."); - connection_or_flush_from_first_active_circuit(orconn, 1, time(NULL)); + connection_or_flush_from_first_active_circuit(orconn, 1, approx_time()); + } +} + +/** Append an encoded value of addr to payload_out, which must + * have at least 18 bytes of free space. The encoding is, as specified in + * tor-spec.txt: + * RESOLVED_TYPE_IPV4 or RESOLVED_TYPE_IPV6 [1 byte] + * LENGTH [1 byte] + * ADDRESS [length bytes] + * Return the number of bytes added, or -1 on error */ +int +append_address_to_payload(char *payload_out, const tor_addr_t *addr) +{ + uint32_t a; + switch (tor_addr_family(addr)) { + case AF_INET: + payload_out[0] = RESOLVED_TYPE_IPV4; + payload_out[1] = 4; + a = tor_addr_to_ipv4n(addr); + memcpy(payload_out+2, &a, 4); + return 6; + case AF_INET6: + payload_out[0] = RESOLVED_TYPE_IPV6; + payload_out[1] = 16; + memcpy(payload_out+2, tor_addr_to_in6_addr8(addr), 16); + return 18; + case AF_UNSPEC: + default: + return -1; + } +} + +/** Given payload_len bytes at payload, starting with an address + * encoded as by append_address_to_payload(), try to decode the address into + * *addr_out. Return the next byte in the payload after the address on + * success, or NULL on failure. */ +const char * +decode_address_from_payload(tor_addr_t *addr_out, const char *payload, + int payload_len) +{ + if (payload_len < 2) + return NULL; + if (payload_len < 2+(uint8_t)payload[1]) + return NULL; + + switch (payload[0]) { + case RESOLVED_TYPE_IPV4: + if (payload[1] != 4) + return NULL; + tor_addr_from_ipv4n(addr_out, get_uint32(payload+2)); + break; + case RESOLVED_TYPE_IPV6: + if (payload[1] != 16) + return NULL; + tor_addr_from_ipv6_bytes(addr_out, payload+2); + break; + default: + tor_addr_make_unspec(addr_out); + break; + } + return payload + 2 + (uint8_t)payload[1]; +} + +/** Remove all the cells queued on circ for orconn. */ +void +circuit_clear_cell_queue(circuit_t *circ, or_connection_t *orconn) +{ + cell_queue_t *queue; + if (circ->n_conn == orconn) { + queue = &circ->n_conn_cells; + } else { + or_circuit_t *orcirc = TO_OR_CIRCUIT(circ); + tor_assert(orcirc->p_conn == orconn); + queue = &orcirc->p_conn_cells; } + + if (queue->n) + make_circuit_inactive_on_conn(circ,orconn); + + cell_queue_clear(queue); } /** Fail with an assert if the active circuits ring on orconn is @@ -1952,16 +2511,44 @@ { circuit_t *head = orconn->active_circuits; circuit_t *cur = head; + int n = 0; if (! head) return; do { circuit_t *next = *next_circ_on_conn_p(cur, orconn); circuit_t *prev = *prev_circ_on_conn_p(cur, orconn); + cell_ewma_t *ewma; tor_assert(next); tor_assert(prev); tor_assert(*next_circ_on_conn_p(prev, orconn) == cur); tor_assert(*prev_circ_on_conn_p(next, orconn) == cur); + if (orconn == cur->n_conn) { + ewma = &cur->n_cell_ewma; + tor_assert(!ewma->is_for_p_conn); + } else { + ewma = &TO_OR_CIRCUIT(cur)->p_cell_ewma; + tor_assert(ewma->is_for_p_conn); + } + tor_assert(ewma->heap_index != -1); + tor_assert(ewma == smartlist_get(orconn->active_circuit_pqueue, + ewma->heap_index)); + n++; cur = next; } while (cur != head); + + tor_assert(n == smartlist_len(orconn->active_circuit_pqueue)); +} + +/** Return 1 if we shouldn't restart reading on this circuit, even if + * we get a SENDME. Else return 0. +*/ +static int +circuit_queue_streams_are_blocked(circuit_t *circ) +{ + if (CIRCUIT_IS_ORIGIN(circ)) { + return circ->streams_blocked_on_n_conn; + } else { + return circ->streams_blocked_on_p_conn; + } } diff -Nru tor-0.2.0.34/src/or/relay.h tor-0.2.2.16-alpha/src/or/relay.h --- tor-0.2.0.34/src/or/relay.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/relay.h 2010-09-17 01:30:36.000000000 +0000 @@ -0,0 +1,68 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file relay.h + * \brief Header file for relay.c. + **/ + +#ifndef _TOR_RELAY_H +#define _TOR_RELAY_H + +extern uint64_t stats_n_relay_cells_relayed; +extern uint64_t stats_n_relay_cells_delivered; + +int circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, + cell_direction_t cell_direction); + +void relay_header_pack(char *dest, const relay_header_t *src); +void relay_header_unpack(relay_header_t *dest, const char *src); +int relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ, + uint8_t relay_command, const char *payload, + size_t payload_len, crypt_path_t *cpath_layer); +int connection_edge_send_command(edge_connection_t *fromconn, + uint8_t relay_command, const char *payload, + size_t payload_len); +int connection_edge_package_raw_inbuf(edge_connection_t *conn, + int package_partial, + int *max_cells); +void connection_edge_consider_sending_sendme(edge_connection_t *conn); + +extern uint64_t stats_n_data_cells_packaged; +extern uint64_t stats_n_data_bytes_packaged; +extern uint64_t stats_n_data_cells_received; +extern uint64_t stats_n_data_bytes_received; + +void init_cell_pool(void); +void free_cell_pool(void); +void clean_cell_pool(void); +void dump_cell_pool_usage(int severity); + +void cell_queue_clear(cell_queue_t *queue); +void cell_queue_append(cell_queue_t *queue, packed_cell_t *cell); +void cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell); + +void append_cell_to_circuit_queue(circuit_t *circ, or_connection_t *orconn, + cell_t *cell, cell_direction_t direction, + streamid_t fromstream); +void connection_or_unlink_all_active_circs(or_connection_t *conn); +int connection_or_flush_from_first_active_circuit(or_connection_t *conn, + int max, time_t now); +void assert_active_circuits_ok(or_connection_t *orconn); +void make_circuit_inactive_on_conn(circuit_t *circ, or_connection_t *conn); +void make_circuit_active_on_conn(circuit_t *circ, or_connection_t *conn); + +int append_address_to_payload(char *payload_out, const tor_addr_t *addr); +const char *decode_address_from_payload(tor_addr_t *addr_out, + const char *payload, + int payload_len); +unsigned cell_ewma_get_tick(void); +void cell_ewma_set_scale_factor(or_options_t *options, + networkstatus_t *consensus); +void circuit_clear_cell_queue(circuit_t *circ, or_connection_t *orconn); + +#endif + diff -Nru tor-0.2.0.34/src/or/rendclient.c tor-0.2.2.16-alpha/src/or/rendclient.c --- tor-0.2.0.34/src/or/rendclient.c 2008-11-20 22:14:26.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/rendclient.c 2010-09-10 19:14:30.000000000 +0000 @@ -1,9 +1,6 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: rendclient.c 17260 2008-11-12 14:26:38Z kloesing $ */ -const char rendclient_c_id[] = - "$Id: rendclient.c 17260 2008-11-12 14:26:38Z kloesing $"; /** * \file rendclient.c @@ -11,6 +8,19 @@ **/ #include "or.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "directory.h" +#include "main.h" +#include "relay.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rephist.h" +#include "routerlist.h" /** Called when we've established a circuit to an introduction point: * send the introduction request. */ @@ -31,16 +41,18 @@ rend_client_send_establish_rendezvous(origin_circuit_t *circ) { tor_assert(circ->_base.purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND); + tor_assert(circ->rend_data); log_info(LD_REND, "Sending an ESTABLISH_RENDEZVOUS cell"); - if (crypto_rand(circ->rend_cookie, REND_COOKIE_LEN) < 0) { + if (crypto_rand(circ->rend_data->rend_cookie, REND_COOKIE_LEN) < 0) { log_warn(LD_BUG, "Internal error: Couldn't produce random cookie."); circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); return -1; } if (relay_send_command_from_edge(0, TO_CIRCUIT(circ), RELAY_COMMAND_ESTABLISH_RENDEZVOUS, - circ->rend_cookie, REND_COOKIE_LEN, + circ->rend_data->rend_cookie, + REND_COOKIE_LEN, circ->cpath->prev)<0) { /* circ is already marked for close */ log_warn(LD_GENERAL, "Couldn't send ESTABLISH_RENDEZVOUS cell"); @@ -58,43 +70,45 @@ origin_circuit_t *rendcirc) { size_t payload_len; - int r; + int r, v3_shift = 0; char payload[RELAY_PAYLOAD_SIZE]; char tmp[RELAY_PAYLOAD_SIZE]; rend_cache_entry_t *entry; crypt_path_t *cpath; off_t dh_offset; - crypto_pk_env_t *intro_key; /* either Bob's public key or an intro key. */ + crypto_pk_env_t *intro_key = NULL; tor_assert(introcirc->_base.purpose == CIRCUIT_PURPOSE_C_INTRODUCING); tor_assert(rendcirc->_base.purpose == CIRCUIT_PURPOSE_C_REND_READY); - tor_assert(!rend_cmp_service_ids(introcirc->rend_query, - rendcirc->rend_query)); + tor_assert(introcirc->rend_data); + tor_assert(rendcirc->rend_data); + tor_assert(!rend_cmp_service_ids(introcirc->rend_data->onion_address, + rendcirc->rend_data->onion_address)); - if (rend_cache_lookup_entry(introcirc->rend_query, -1, &entry) < 1) { + if (rend_cache_lookup_entry(introcirc->rend_data->onion_address, -1, + &entry) < 1) { log_warn(LD_REND, "query %s didn't have valid rend desc in cache. Failing.", - escaped_safe_str(introcirc->rend_query)); + escaped_safe_str_client(introcirc->rend_data->onion_address)); goto err; } - /* first 20 bytes of payload are the hash of bob's pk */ - if (entry->parsed->version == 0) { /* unversioned descriptor */ - intro_key = entry->parsed->pk; - } else { /* versioned descriptor */ - intro_key = NULL; - SMARTLIST_FOREACH(entry->parsed->intro_nodes, rend_intro_point_t *, - intro, { - if (!memcmp(introcirc->build_state->chosen_exit->identity_digest, - intro->extend_info->identity_digest, DIGEST_LEN)) { - intro_key = intro->intro_key; - break; - } - }); - if (!intro_key) { - log_warn(LD_BUG, "Internal error: could not find intro key."); - goto err; + /* first 20 bytes of payload are the hash of the intro key */ + intro_key = NULL; + SMARTLIST_FOREACH(entry->parsed->intro_nodes, rend_intro_point_t *, + intro, { + if (!memcmp(introcirc->build_state->chosen_exit->identity_digest, + intro->extend_info->identity_digest, DIGEST_LEN)) { + intro_key = intro->intro_key; + break; } + }); + if (!intro_key) { + log_info(LD_REND, "Our introduction point knowledge changed in " + "mid-connect! Could not find intro key; we only have a " + "v2 rend desc with %d intro points. Giving up.", + smartlist_len(entry->parsed->intro_nodes)); + goto err; } if (crypto_pk_get_digest(intro_key, payload)<0) { log_warn(LD_BUG, "Internal error: couldn't hash public key."); @@ -117,27 +131,45 @@ } } + /* If version is 3, write (optional) auth data and timestamp. */ + if (entry->parsed->protocols & (1<<3)) { + tmp[0] = 3; /* version 3 of the cell format */ + tmp[1] = (uint8_t)introcirc->rend_data->auth_type; /* auth type, if any */ + v3_shift = 1; + if (introcirc->rend_data->auth_type != REND_NO_AUTH) { + set_uint16(tmp+2, htons(REND_DESC_COOKIE_LEN)); + memcpy(tmp+4, introcirc->rend_data->descriptor_cookie, + REND_DESC_COOKIE_LEN); + v3_shift += 2+REND_DESC_COOKIE_LEN; + } + set_uint32(tmp+v3_shift+1, htonl((uint32_t)time(NULL))); + v3_shift += 4; + } /* if version 2 only write version number */ + else if (entry->parsed->protocols & (1<<2)) { + tmp[0] = 2; /* version 2 of the cell format */ + } + /* write the remaining items into tmp */ - if (entry->parsed->protocols & (1<<2)) { + if (entry->parsed->protocols & (1<<3) || entry->parsed->protocols & (1<<2)) { /* version 2 format */ extend_info_t *extend_info = rendcirc->build_state->chosen_exit; int klen; - tmp[0] = 2; /* version 2 of the cell format */ /* nul pads */ - set_uint32(tmp+1, htonl(extend_info->addr)); - set_uint16(tmp+5, htons(extend_info->port)); - memcpy(tmp+7, extend_info->identity_digest, DIGEST_LEN); - klen = crypto_pk_asn1_encode(extend_info->onion_key, tmp+7+DIGEST_LEN+2, - sizeof(tmp)-(7+DIGEST_LEN+2)); - set_uint16(tmp+7+DIGEST_LEN, htons(klen)); - memcpy(tmp+7+DIGEST_LEN+2+klen, rendcirc->rend_cookie, + set_uint32(tmp+v3_shift+1, tor_addr_to_ipv4h(&extend_info->addr)); + set_uint16(tmp+v3_shift+5, htons(extend_info->port)); + memcpy(tmp+v3_shift+7, extend_info->identity_digest, DIGEST_LEN); + klen = crypto_pk_asn1_encode(extend_info->onion_key, + tmp+v3_shift+7+DIGEST_LEN+2, + sizeof(tmp)-(v3_shift+7+DIGEST_LEN+2)); + set_uint16(tmp+v3_shift+7+DIGEST_LEN, htons(klen)); + memcpy(tmp+v3_shift+7+DIGEST_LEN+2+klen, rendcirc->rend_data->rend_cookie, REND_COOKIE_LEN); - dh_offset = 7+DIGEST_LEN+2+klen+REND_COOKIE_LEN; + dh_offset = v3_shift+7+DIGEST_LEN+2+klen+REND_COOKIE_LEN; } else { /* Version 0. */ strncpy(tmp, rendcirc->build_state->chosen_exit->nickname, (MAX_NICKNAME_LEN+1)); /* nul pads */ - memcpy(tmp+MAX_NICKNAME_LEN+1, rendcirc->rend_cookie, + memcpy(tmp+MAX_NICKNAME_LEN+1, rendcirc->rend_data->rend_cookie, REND_COOKIE_LEN); dh_offset = MAX_NICKNAME_LEN+1+REND_COOKIE_LEN; } @@ -177,7 +209,7 @@ introcirc->_base.purpose = CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT; return 0; -err: + err: circuit_mark_for_close(TO_CIRCUIT(introcirc), END_CIRC_REASON_INTERNAL); circuit_mark_for_close(TO_CIRCUIT(rendcirc), END_CIRC_REASON_INTERNAL); return -1; @@ -216,6 +248,7 @@ } tor_assert(circ->build_state->chosen_exit); + tor_assert(circ->rend_data); if (request_len == 0) { /* It's an ACK; the introduction point relayed our introduction request. */ @@ -224,7 +257,7 @@ */ log_info(LD_REND,"Received ack. Telling rend circ..."); rendcirc = circuit_get_by_rend_query_and_purpose( - circ->rend_query, CIRCUIT_PURPOSE_C_REND_READY); + circ->rend_data->onion_address, CIRCUIT_PURPOSE_C_REND_READY); if (rendcirc) { /* remember the ack */ rendcirc->_base.purpose = CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED; } else { @@ -241,25 +274,43 @@ * If none remain, refetch the service descriptor. */ if (rend_client_remove_intro_point(circ->build_state->chosen_exit, - circ->rend_query) > 0) { + circ->rend_data) > 0) { /* There are introduction points left. Re-extend the circuit to * another intro point and try again. */ extend_info_t *extend_info; int result; - extend_info = rend_client_get_random_intro(circ->rend_query); + extend_info = rend_client_get_random_intro(circ->rend_data); if (!extend_info) { log_warn(LD_REND, "No introduction points left for %s. Closing.", - escaped_safe_str(circ->rend_query)); + escaped_safe_str_client(circ->rend_data->onion_address)); circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); return -1; } - log_info(LD_REND, - "Got nack for %s from %s. Re-extending circ %d, " - "this time to %s.", - escaped_safe_str(circ->rend_query), - circ->build_state->chosen_exit->nickname, circ->_base.n_circ_id, - extend_info->nickname); - result = circuit_extend_to_new_exit(circ, extend_info); + if (circ->remaining_relay_early_cells) { + log_info(LD_REND, + "Got nack for %s from %s. Re-extending circ %d, " + "this time to %s.", + escaped_safe_str_client(circ->rend_data->onion_address), + circ->build_state->chosen_exit->nickname, + circ->_base.n_circ_id, extend_info->nickname); + result = circuit_extend_to_new_exit(circ, extend_info); + } else { + log_info(LD_REND, + "Got nack for %s from %s. Building a new introduction " + "circuit, this time to %s.", + escaped_safe_str_client(circ->rend_data->onion_address), + circ->build_state->chosen_exit->nickname, + extend_info->nickname); + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED); + if (!circuit_launch_by_extend_info(CIRCUIT_PURPOSE_C_INTRODUCING, + extend_info, + CIRCLAUNCH_IS_INTERNAL)) { + log_warn(LD_REND, "Building introduction circuit failed."); + result = -1; + } else { + result = 0; + } + } extend_info_free(extend_info); return result; } @@ -294,9 +345,12 @@ tor_snprintf(hsdir_desc_comb_id, sizeof(hsdir_desc_comb_id), "%s%s", hsdir_id_base32, desc_id_base32); if (set) { - last_request_ptr = tor_malloc_zero(sizeof(time_t *)); + time_t *oldptr; + last_request_ptr = tor_malloc_zero(sizeof(time_t)); *last_request_ptr = now; - strmap_set(last_hid_serv_requests, hsdir_desc_comb_id, last_request_ptr); + oldptr = strmap_set(last_hid_serv_requests, hsdir_desc_comb_id, + last_request_ptr); + tor_free(oldptr); } else last_request_ptr = strmap_get_lc(last_hid_serv_requests, hsdir_desc_comb_id); @@ -337,15 +391,15 @@ * descriptor, return 0, and in case of a failure -1. query is only * passed for pretty log statements. */ static int -directory_get_from_hs_dir(const char *desc_id, const char *query) +directory_get_from_hs_dir(const char *desc_id, const rend_data_t *rend_query) { smartlist_t *responsible_dirs = smartlist_create(); routerstatus_t *hs_dir; char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; time_t now = time(NULL); + char descriptor_cookie_base64[3*REND_DESC_COOKIE_LEN_BASE64]; tor_assert(desc_id); - tor_assert(query); - tor_assert(strlen(query) == REND_SERVICE_ID_LEN_BASE32); + tor_assert(rend_query); /* Determine responsible dirs. Even if we can't get all we want, * work with the ones we have. If it's empty, we'll notice below. */ (int) hid_serv_get_responsible_directories(responsible_dirs, desc_id); @@ -377,54 +431,52 @@ * directory now. */ lookup_last_hid_serv_request(hs_dir, desc_id_base32, now, 1); - /* Send fetch request. (Pass query as payload to write it to the directory - * connection so that it can be referred to when the response arrives.) */ - directory_initiate_command_routerstatus(hs_dir, + /* Encode descriptor cookie for logging purposes. */ + if (rend_query->auth_type != REND_NO_AUTH) { + if (base64_encode(descriptor_cookie_base64, + sizeof(descriptor_cookie_base64), + rend_query->descriptor_cookie, REND_DESC_COOKIE_LEN)<0) { + log_warn(LD_BUG, "Could not base64-encode descriptor cookie."); + return 0; + } + /* Remove == signs and newline. */ + descriptor_cookie_base64[strlen(descriptor_cookie_base64)-3] = '\0'; + } else { + strlcpy(descriptor_cookie_base64, "(none)", + sizeof(descriptor_cookie_base64)); + } + + /* 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, - 1, desc_id_base32, query, 0, 0); + 1, desc_id_base32, NULL, 0, 0, + rend_query); log_info(LD_REND, "Sending fetch request for v2 descriptor for " - "service '%s' with descriptor ID '%s' to hidden " - "service directory '%s' on port %d.", - safe_str(query), safe_str(desc_id_base32), hs_dir->nickname, - hs_dir->dir_port); + "service '%s' with descriptor ID '%s', auth type %d, " + "and descriptor cookie '%s' to hidden service " + "directory '%s' on port %d.", + rend_query->onion_address, desc_id_base32, + rend_query->auth_type, + (rend_query->auth_type == REND_NO_AUTH ? "[none]" : + escaped_safe_str_client(descriptor_cookie_base64)), + hs_dir->nickname, hs_dir->dir_port); return 1; } -/** If we are not currently fetching a rendezvous service descriptor - * for the service ID query, start a directory connection to fetch a - * new one. - */ -void -rend_client_refetch_renddesc(const char *query) -{ - if (!get_options()->FetchHidServDescriptors) - return; - log_info(LD_REND, "Fetching rendezvous descriptor for service %s", - escaped_safe_str(query)); - if (connection_get_by_type_state_rendquery(CONN_TYPE_DIR, 0, query, 0)) { - log_info(LD_REND,"Would fetch a new renddesc here (for %s), but one is " - "already in progress.", escaped_safe_str(query)); - } else { - /* not one already; initiate a dir rend desc lookup */ - directory_get_from_dirserver(DIR_PURPOSE_FETCH_RENDDESC, - ROUTER_PURPOSE_GENERAL, query, 1); - } -} - -/** Start a connection to a hidden service directory to fetch a v2 - * rendezvous service descriptor for the base32-encoded service ID - * query. - */ +/** Unless we already have a descriptor for rend_query with at least + * one (possibly) working introduction point in it, start a connection to a + * hidden service directory to fetch a v2 rendezvous service descriptor. */ void -rend_client_refetch_v2_renddesc(const char *query) +rend_client_refetch_v2_renddesc(const rend_data_t *rend_query) { char descriptor_id[DIGEST_LEN]; int replicas_left_to_try[REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS]; int i, tries_left; rend_cache_entry_t *e = NULL; - tor_assert(query); - tor_assert(strlen(query) == REND_SERVICE_ID_LEN_BASE32); + tor_assert(rend_query); /* Are we configured to fetch descriptors? */ if (!get_options()->FetchHidServDescriptors) { log_warn(LD_REND, "We received an onion address for a v2 rendezvous " @@ -432,13 +484,13 @@ return; } /* Before fetching, check if we already have the descriptor here. */ - if (rend_cache_lookup_entry(query, -1, &e) > 0) { + if (rend_cache_lookup_entry(rend_query->onion_address, -1, &e) > 0) { log_info(LD_REND, "We would fetch a v2 rendezvous descriptor, but we " "already have that descriptor here. Not fetching."); return; } log_debug(LD_REND, "Fetching v2 rendezvous descriptor for service %s", - safe_str(query)); + safe_str_client(rend_query->onion_address)); /* Randomly iterate over the replicas until a descriptor can be fetched * from one of the consecutive nodes, or no options are left. */ tries_left = REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; @@ -449,21 +501,23 @@ int chosen_replica = replicas_left_to_try[rand]; replicas_left_to_try[rand] = replicas_left_to_try[--tries_left]; - if (rend_compute_v2_desc_id(descriptor_id, query, NULL, time(NULL), - chosen_replica) < 0) { + if (rend_compute_v2_desc_id(descriptor_id, rend_query->onion_address, + rend_query->auth_type == REND_STEALTH_AUTH ? + rend_query->descriptor_cookie : NULL, + time(NULL), chosen_replica) < 0) { log_warn(LD_REND, "Internal error: Computing v2 rendezvous " "descriptor ID did not succeed."); return; } - if (directory_get_from_hs_dir(descriptor_id, query) != 0) + if (directory_get_from_hs_dir(descriptor_id, rend_query) != 0) return; /* either success or failure, but we're done */ } /* If we come here, there are no hidden service directories left. */ log_info(LD_REND, "Could not pick one of the responsible hidden " "service directories to fetch descriptors, because " "we already tried them all unsuccessfully."); - /* Close pending connections (unless a v0 request is still going on). */ - rend_client_desc_trynow(query, 2); + /* Close pending connections. */ + rend_client_desc_trynow(rend_query->onion_address); return; } @@ -474,24 +528,23 @@ * unrecognized, 1 if recognized and some intro points remain. */ int -rend_client_remove_intro_point(extend_info_t *failed_intro, const char *query) +rend_client_remove_intro_point(extend_info_t *failed_intro, + const rend_data_t *rend_query) { int i, r; rend_cache_entry_t *ent; connection_t *conn; - r = rend_cache_lookup_entry(query, -1, &ent); + r = rend_cache_lookup_entry(rend_query->onion_address, -1, &ent); if (r<0) { - log_warn(LD_BUG, "Malformed service ID %s.", escaped_safe_str(query)); + log_warn(LD_BUG, "Malformed service ID %s.", + escaped_safe_str_client(rend_query->onion_address)); return -1; } if (r==0) { log_info(LD_REND, "Unknown service %s. Re-fetching descriptor.", - escaped_safe_str(query)); - /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever - * arrives first. */ - rend_client_refetch_v2_renddesc(query); - rend_client_refetch_renddesc(query); + escaped_safe_str_client(rend_query->onion_address)); + rend_client_refetch_v2_renddesc(rend_query); return 0; } @@ -508,22 +561,21 @@ if (smartlist_len(ent->parsed->intro_nodes) == 0) { log_info(LD_REND, "No more intro points remain for %s. Re-fetching descriptor.", - escaped_safe_str(query)); - /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever - * arrives first. */ - rend_client_refetch_v2_renddesc(query); - rend_client_refetch_renddesc(query); + escaped_safe_str_client(rend_query->onion_address)); + rend_client_refetch_v2_renddesc(rend_query); /* move all pending streams back to renddesc_wait */ while ((conn = connection_get_by_type_state_rendquery(CONN_TYPE_AP, - AP_CONN_STATE_CIRCUIT_WAIT, query, -1))) { + AP_CONN_STATE_CIRCUIT_WAIT, + rend_query->onion_address))) { conn->state = AP_CONN_STATE_RENDDESC_WAIT; } return 0; } log_info(LD_REND,"%d options left for %s.", - smartlist_len(ent->parsed->intro_nodes), escaped_safe_str(query)); + smartlist_len(ent->parsed->intro_nodes), + escaped_safe_str_client(rend_query->onion_address)); return 1; } @@ -546,6 +598,9 @@ log_info(LD_REND,"Got rendezvous ack. This circuit is now ready for " "rendezvous."); circ->_base.purpose = CIRCUIT_PURPOSE_C_REND_READY; + /* XXXX022 This is a pretty brute-force approach. It'd be better to + * attach only the connections that are waiting on this circuit, rather + * than trying to attach them all. See comments bug 743. */ /* If we already have the introduction circuit built, make sure we send * the INTRODUCE cell _now_ */ connection_ap_attach_pending(); @@ -582,8 +637,9 @@ tor_assert(circ->build_state->pending_final_cpath); hop = circ->build_state->pending_final_cpath; tor_assert(hop->dh_handshake_state); - if (crypto_dh_compute_secret(hop->dh_handshake_state, request, DH_KEY_LEN, - keys, DIGEST_LEN+CPATH_KEY_MATERIAL_LEN)<0) { + if (crypto_dh_compute_secret(LOG_PROTOCOL_WARN, hop->dh_handshake_state, + request, DH_KEY_LEN, keys, + DIGEST_LEN+CPATH_KEY_MATERIAL_LEN)<0) { log_warn(LD_GENERAL, "Couldn't complete DH handshake."); goto err; } @@ -606,11 +662,14 @@ /* set the windows to default. these are the windows * that alice thinks bob has. */ - hop->package_window = CIRCWINDOW_START; + hop->package_window = circuit_initial_package_window(); hop->deliver_window = CIRCWINDOW_START; onion_append_to_cpath(&circ->cpath, hop); - circ->build_state->pending_final_cpath = NULL; /* prevent doublee-free */ + circ->build_state->pending_final_cpath = NULL; /* prevent double-free */ + /* XXXX022 This is a pretty brute-force approach. It'd be better to + * attach only the connections that are waiting on this circuit, rather + * than trying to attach them all. See comments bug 743. */ connection_ap_attach_pending(); return 0; err: @@ -618,33 +677,30 @@ return -1; } -/** Find all the apconns in state AP_CONN_STATE_RENDDESC_WAIT that - * are waiting on query. If there's a working cache entry here - * with at least one intro point, move them to the next state. If - * rend_version is non-negative, fail connections that have - * requested query unless there are still descriptor fetch - * requests in progress for other descriptor versions than - * rend_version. - */ +/** Find all the apconns in state AP_CONN_STATE_RENDDESC_WAIT that are + * waiting on query. If there's a working cache entry here with at + * least one intro point, move them to the next state. */ void -rend_client_desc_trynow(const char *query, int rend_version) +rend_client_desc_trynow(const char *query) { edge_connection_t *conn; rend_cache_entry_t *entry; time_t now = time(NULL); smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, _conn, - { + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, _conn) { if (_conn->type != CONN_TYPE_AP || _conn->state != AP_CONN_STATE_RENDDESC_WAIT || _conn->marked_for_close) continue; conn = TO_EDGE_CONN(_conn); - if (rend_cmp_service_ids(query, conn->rend_query)) + if (!conn->rend_data) + continue; + if (rend_cmp_service_ids(query, conn->rend_data->onion_address)) continue; assert_connection_ok(TO_CONN(conn), now); - if (rend_cache_lookup_entry(conn->rend_query, -1, &entry) == 1 && + if (rend_cache_lookup_entry(conn->rend_data->onion_address, -1, + &entry) == 1 && smartlist_len(entry->parsed->intro_nodes) > 0) { /* either this fetch worked, or it failed but there was a * valid entry from before which we should reuse */ @@ -660,20 +716,16 @@ if (connection_ap_handshake_attach_circuit(conn) < 0) { /* it will never work */ log_warn(LD_REND,"Rendezvous attempt failed. Closing."); - connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); + if (!conn->_base.marked_for_close) + connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); } } else { /* 404, or fetch didn't get that far */ - /* Unless there are requests for another descriptor version pending, - * close the connection. */ - if (rend_version >= 0 && - !connection_get_by_type_state_rendquery(CONN_TYPE_DIR, 0, query, - rend_version == 0 ? 2 : 0)) { - log_notice(LD_REND,"Closing stream for '%s.onion': hidden service is " - "unavailable (try again later).", safe_str(query)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_RESOLVEFAILED); - } + log_notice(LD_REND,"Closing stream for '%s.onion': hidden service is " + "unavailable (try again later).", + safe_str_client(query)); + connection_mark_unattached_ap(conn, END_STREAM_REASON_RESOLVEFAILED); } - }); + } SMARTLIST_FOREACH_END(_conn); } /** Return a newly allocated extend_info_t* for a randomly chosen introduction @@ -681,17 +733,17 @@ * have been tried and failed. */ extend_info_t * -rend_client_get_random_intro(const char *query) +rend_client_get_random_intro(const rend_data_t *rend_query) { int i; rend_cache_entry_t *entry; rend_intro_point_t *intro; routerinfo_t *router; - if (rend_cache_lookup_entry(query, -1, &entry) < 1) { + if (rend_cache_lookup_entry(rend_query->onion_address, -1, &entry) < 1) { log_warn(LD_REND, "Query '%s' didn't have valid rend desc in cache. Failing.", - safe_str(query)); + safe_str_client(rend_query->onion_address)); return NULL; } @@ -717,3 +769,139 @@ return extend_info_dup(intro->extend_info); } +/** Client-side authorizations for hidden services; map of onion address to + * rend_service_authorization_t*. */ +static strmap_t *auth_hid_servs = NULL; + +/** Look up the client-side authorization for the hidden service with + * onion_address. Return NULL if no authorization is available for + * that address. */ +rend_service_authorization_t* +rend_client_lookup_service_authorization(const char *onion_address) +{ + tor_assert(onion_address); + if (!auth_hid_servs) return NULL; + return strmap_get(auth_hid_servs, onion_address); +} + +/** Helper: Free storage held by rend_service_authorization_t. */ +static void +rend_service_authorization_free(rend_service_authorization_t *auth) +{ + tor_free(auth); +} + +/** Helper for strmap_free. */ +static void +rend_service_authorization_strmap_item_free(void *service_auth) +{ + rend_service_authorization_free(service_auth); +} + +/** Release all the storage held in auth_hid_servs. + */ +void +rend_service_authorization_free_all(void) +{ + if (!auth_hid_servs) { + return; + } + strmap_free(auth_hid_servs, rend_service_authorization_strmap_item_free); + auth_hid_servs = NULL; +} + +/** Parse config_line as a client-side authorization for a hidden + * service and add it to the local map of hidden service authorizations. + * Return 0 for success and -1 for failure. */ +int +rend_parse_service_authorization(or_options_t *options, int validate_only) +{ + config_line_t *line; + int res = -1; + strmap_t *parsed = strmap_new(); + smartlist_t *sl = smartlist_create(); + rend_service_authorization_t *auth = NULL; + + for (line = options->HidServAuth; line; line = line->next) { + char *onion_address, *descriptor_cookie; + char descriptor_cookie_tmp[REND_DESC_COOKIE_LEN+2]; + char descriptor_cookie_base64ext[REND_DESC_COOKIE_LEN_BASE64+2+1]; + int auth_type_val = 0; + auth = NULL; + SMARTLIST_FOREACH(sl, char *, c, tor_free(c);); + smartlist_clear(sl); + smartlist_split_string(sl, line->value, " ", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3); + if (smartlist_len(sl) < 2) { + log_warn(LD_CONFIG, "Configuration line does not consist of " + "\"onion-address authorization-cookie [service-name]\": " + "'%s'", line->value); + goto err; + } + auth = tor_malloc_zero(sizeof(rend_service_authorization_t)); + /* Parse onion address. */ + onion_address = smartlist_get(sl, 0); + if (strlen(onion_address) != REND_SERVICE_ADDRESS_LEN || + strcmpend(onion_address, ".onion")) { + log_warn(LD_CONFIG, "Onion address has wrong format: '%s'", + onion_address); + goto err; + } + strlcpy(auth->onion_address, onion_address, REND_SERVICE_ID_LEN_BASE32+1); + if (!rend_valid_service_id(auth->onion_address)) { + log_warn(LD_CONFIG, "Onion address has wrong format: '%s'", + onion_address); + goto err; + } + /* Parse descriptor cookie. */ + descriptor_cookie = smartlist_get(sl, 1); + if (strlen(descriptor_cookie) != REND_DESC_COOKIE_LEN_BASE64) { + log_warn(LD_CONFIG, "Authorization cookie has wrong length: '%s'", + descriptor_cookie); + goto err; + } + /* Add trailing zero bytes (AA) to make base64-decoding happy. */ + tor_snprintf(descriptor_cookie_base64ext, + REND_DESC_COOKIE_LEN_BASE64+2+1, + "%sAA", descriptor_cookie); + if (base64_decode(descriptor_cookie_tmp, sizeof(descriptor_cookie_tmp), + descriptor_cookie_base64ext, + strlen(descriptor_cookie_base64ext)) < 0) { + log_warn(LD_CONFIG, "Decoding authorization cookie failed: '%s'", + descriptor_cookie); + goto err; + } + auth_type_val = (descriptor_cookie_tmp[16] >> 4) + 1; + if (auth_type_val < 1 || auth_type_val > 2) { + log_warn(LD_CONFIG, "Authorization cookie has unknown authorization " + "type encoded."); + goto err; + } + auth->auth_type = auth_type_val == 1 ? REND_BASIC_AUTH : REND_STEALTH_AUTH; + memcpy(auth->descriptor_cookie, descriptor_cookie_tmp, + REND_DESC_COOKIE_LEN); + if (strmap_get(parsed, auth->onion_address)) { + log_warn(LD_CONFIG, "Duplicate authorization for the same hidden " + "service."); + goto err; + } + strmap_set(parsed, auth->onion_address, auth); + auth = NULL; + } + res = 0; + goto done; + err: + res = -1; + done: + rend_service_authorization_free(auth); + SMARTLIST_FOREACH(sl, char *, c, tor_free(c);); + smartlist_free(sl); + if (!validate_only && res == 0) { + rend_service_authorization_free_all(); + auth_hid_servs = parsed; + } else { + strmap_free(parsed, rend_service_authorization_strmap_item_free); + } + return res; +} + diff -Nru tor-0.2.0.34/src/or/rendclient.h tor-0.2.2.16-alpha/src/or/rendclient.h --- tor-0.2.0.34/src/or/rendclient.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/rendclient.h 2010-08-11 03:14:16.000000000 +0000 @@ -0,0 +1,40 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file rendclient.h + * \brief Header file for rendclient.c. + **/ + +#ifndef _TOR_RENDCLIENT_H +#define _TOR_RENDCLIENT_H + +void rend_client_introcirc_has_opened(origin_circuit_t *circ); +void rend_client_rendcirc_has_opened(origin_circuit_t *circ); +int rend_client_introduction_acked(origin_circuit_t *circ, const char *request, + size_t request_len); +void rend_client_refetch_v2_renddesc(const rend_data_t *rend_query); +int rend_client_remove_intro_point(extend_info_t *failed_intro, + const rend_data_t *rend_query); +int rend_client_rendezvous_acked(origin_circuit_t *circ, const char *request, + size_t request_len); +int rend_client_receive_rendezvous(origin_circuit_t *circ, const char *request, + size_t request_len); +void rend_client_desc_trynow(const char *query); + +extend_info_t *rend_client_get_random_intro(const rend_data_t *rend_query); + +int rend_client_send_introduction(origin_circuit_t *introcirc, + origin_circuit_t *rendcirc); +int rend_parse_service_authorization(or_options_t *options, + int validate_only); +rend_service_authorization_t *rend_client_lookup_service_authorization( + const char *onion_address); +void rend_service_authorization_free_all(void); +rend_data_t *rend_data_dup(const rend_data_t *request); + +#endif + diff -Nru tor-0.2.0.34/src/or/rendcommon.c tor-0.2.2.16-alpha/src/or/rendcommon.c --- tor-0.2.0.34/src/or/rendcommon.c 2009-01-05 02:06:16.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/rendcommon.c 2010-08-11 03:14:16.000000000 +0000 @@ -1,9 +1,6 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: rendcommon.c 17869 2009-01-04 03:03:45Z nickm $ */ -const char rendcommon_c_id[] = - "$Id: rendcommon.c 17869 2009-01-04 03:03:45Z nickm $"; /** * \file rendcommon.c @@ -12,6 +9,15 @@ **/ #include "or.h" +#include "circuitbuild.h" +#include "config.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rendmid.h" +#include "rendservice.h" +#include "rephist.h" +#include "routerlist.h" +#include "routerparse.h" /** Return 0 if one and two are the same service ids, else -1 or 1 */ int @@ -25,6 +31,8 @@ void rend_service_descriptor_free(rend_service_descriptor_t *desc) { + if (!desc) + return; if (desc->pk) crypto_free_pk_env(desc->pk); if (desc->intro_nodes) { @@ -128,7 +136,8 @@ if (!service_id || strlen(service_id) != REND_SERVICE_ID_LEN_BASE32) { log_warn(LD_REND, "Could not compute v2 descriptor ID: " - "Illegal service ID: %s", safe_str(service_id)); + "Illegal service ID: %s", + safe_str(service_id)); return -1; } if (replica >= REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS) { @@ -141,7 +150,7 @@ service_id, REND_SERVICE_ID_LEN_BASE32) < 0) { log_warn(LD_REND, "Could not compute v2 descriptor ID: " "Illegal characters in service ID: %s", - safe_str(service_id)); + safe_str_client(service_id)); return -1; } /* Calculate current time-period. */ @@ -154,15 +163,11 @@ return 0; } -/* Encode the introduction points in desc, optionally encrypt them with - * an optional descriptor_cookie of length REND_DESC_COOKIE_LEN, - * encode it in base64, and write it to a newly allocated string, and write a - * pointer to it to *ipos_base64. Return 0 for success, -1 - * otherwise. */ +/** Encode the introduction points in desc and write the result to a + * newly allocated string pointed to by encoded. Return 0 for + * success, -1 otherwise. */ static int -rend_encode_v2_intro_points(char **ipos_base64, - rend_service_descriptor_t *desc, - const char *descriptor_cookie) +rend_encode_v2_intro_points(char **encoded, rend_service_descriptor_t *desc) { size_t unenc_len; char *unenc = NULL; @@ -170,7 +175,6 @@ int i; int r = -1; /* Assemble unencrypted list of introduction points. */ - *ipos_base64 = NULL; unenc_len = smartlist_len(desc->intro_nodes) * 1000; /* too long, but ok. */ unenc = tor_malloc_zero(unenc_len); for (i = 0; i < smartlist_len(desc->intro_nodes); i++) { @@ -204,7 +208,7 @@ goto done; } /* Assemble everything for this introduction point. */ - address = tor_dup_addr(info->addr); + address = tor_dup_addr(&info->addr); res = tor_snprintf(unenc + unenc_written, unenc_len - unenc_written, "introduction-point %s\n" "ip-address %s\n" @@ -235,37 +239,163 @@ } unenc[unenc_written++] = '\n'; unenc[unenc_written++] = 0; - /* If a descriptor cookie is passed, encrypt introduction points. */ - if (descriptor_cookie) { - char *enc = tor_malloc_zero(unenc_written + CIPHER_IV_LEN); - crypto_cipher_env_t *cipher = - crypto_create_init_cipher(descriptor_cookie, 1); - int enclen = crypto_cipher_encrypt_with_iv(cipher, enc, - unenc_written + CIPHER_IV_LEN, - unenc, unenc_written); + *encoded = unenc; + r = 0; + done: + if (r<0) + tor_free(unenc); + return r; +} + +/** Encrypt the encoded introduction points in encoded using + * authorization type 'basic' with client_cookies and write the + * result to a newly allocated string pointed to by encrypted_out of + * length encrypted_len_out. Return 0 for success, -1 otherwise. */ +static int +rend_encrypt_v2_intro_points_basic(char **encrypted_out, + size_t *encrypted_len_out, + const char *encoded, + smartlist_t *client_cookies) +{ + int r = -1, i, pos, enclen, client_blocks; + size_t len, client_entries_len; + char *enc = NULL, iv[CIPHER_IV_LEN], *client_part = NULL, + session_key[CIPHER_KEY_LEN]; + smartlist_t *encrypted_session_keys = NULL; + crypto_digest_env_t *digest; + crypto_cipher_env_t *cipher; + tor_assert(encoded); + tor_assert(client_cookies && smartlist_len(client_cookies) > 0); + + /* Generate session key. */ + if (crypto_rand(session_key, CIPHER_KEY_LEN) < 0) { + log_warn(LD_REND, "Unable to generate random session key to encrypt " + "introduction point string."); + goto done; + } + + /* Determine length of encrypted introduction points including session + * keys. */ + client_blocks = 1 + ((smartlist_len(client_cookies) - 1) / + REND_BASIC_AUTH_CLIENT_MULTIPLE); + client_entries_len = client_blocks * REND_BASIC_AUTH_CLIENT_MULTIPLE * + REND_BASIC_AUTH_CLIENT_ENTRY_LEN; + len = 2 + client_entries_len + CIPHER_IV_LEN + strlen(encoded); + if (client_blocks >= 256) { + log_warn(LD_REND, "Too many clients in introduction point string."); + goto done; + } + enc = tor_malloc_zero(len); + enc[0] = 0x01; /* type of authorization. */ + enc[1] = (uint8_t)client_blocks; + + /* Encrypt with random session key. */ + cipher = crypto_create_init_cipher(session_key, 1); + enclen = crypto_cipher_encrypt_with_iv(cipher, + enc + 2 + client_entries_len, + CIPHER_IV_LEN + strlen(encoded), encoded, strlen(encoded)); + crypto_free_cipher_env(cipher); + if (enclen < 0) { + log_warn(LD_REND, "Could not encrypt introduction point string."); + goto done; + } + memcpy(iv, enc + 2 + client_entries_len, CIPHER_IV_LEN); + + /* Encrypt session key for cookies, determine client IDs, and put both + * in a smartlist. */ + encrypted_session_keys = smartlist_create(); + SMARTLIST_FOREACH_BEGIN(client_cookies, const char *, cookie) { + client_part = tor_malloc_zero(REND_BASIC_AUTH_CLIENT_ENTRY_LEN); + /* Encrypt session key. */ + cipher = crypto_create_init_cipher(cookie, 1); + if (crypto_cipher_encrypt(cipher, client_part + + REND_BASIC_AUTH_CLIENT_ID_LEN, + session_key, CIPHER_KEY_LEN) < 0) { + log_warn(LD_REND, "Could not encrypt session key for client."); + crypto_free_cipher_env(cipher); + tor_free(client_part); + goto done; + } crypto_free_cipher_env(cipher); - if (enclen < 0) { - log_warn(LD_REND, "Could not encrypt introduction point string."); - tor_free(enc); + + /* Determine client ID. */ + digest = crypto_new_digest_env(); + crypto_digest_add_bytes(digest, cookie, REND_DESC_COOKIE_LEN); + crypto_digest_add_bytes(digest, iv, CIPHER_IV_LEN); + crypto_digest_get_digest(digest, client_part, + REND_BASIC_AUTH_CLIENT_ID_LEN); + crypto_free_digest_env(digest); + + /* Put both together. */ + smartlist_add(encrypted_session_keys, client_part); + } SMARTLIST_FOREACH_END(cookie); + + /* Add some fake client IDs and encrypted session keys. */ + for (i = (smartlist_len(client_cookies) - 1) % + REND_BASIC_AUTH_CLIENT_MULTIPLE; + i < REND_BASIC_AUTH_CLIENT_MULTIPLE - 1; i++) { + client_part = tor_malloc_zero(REND_BASIC_AUTH_CLIENT_ENTRY_LEN); + if (crypto_rand(client_part, REND_BASIC_AUTH_CLIENT_ENTRY_LEN) < 0) { + log_warn(LD_REND, "Unable to generate fake client entry."); + tor_free(client_part); goto done; } - /* Replace original string with the encrypted one. */ - tor_free(unenc); - unenc = enc; - unenc_written = enclen; + smartlist_add(encrypted_session_keys, client_part); } - /* Base64-encode introduction points. */ - *ipos_base64 = tor_malloc_zero(unenc_written * 2); - if (base64_encode(*ipos_base64, unenc_written * 2, unenc, unenc_written)<0) { - log_warn(LD_REND, "Could not encode introduction point string to " - "base64."); + /* Sort smartlist and put elements in result in order. */ + smartlist_sort_digests(encrypted_session_keys); + pos = 2; + SMARTLIST_FOREACH(encrypted_session_keys, const char *, entry, { + memcpy(enc + pos, entry, REND_BASIC_AUTH_CLIENT_ENTRY_LEN); + pos += REND_BASIC_AUTH_CLIENT_ENTRY_LEN; + }); + *encrypted_out = enc; + *encrypted_len_out = len; + enc = NULL; /* prevent free. */ + r = 0; + done: + tor_free(enc); + if (encrypted_session_keys) { + SMARTLIST_FOREACH(encrypted_session_keys, char *, d, tor_free(d);); + smartlist_free(encrypted_session_keys); + } + return r; +} + +/** Encrypt the encoded introduction points in encoded using + * authorization type 'stealth' with descriptor_cookie of length + * REND_DESC_COOKIE_LEN and write the result to a newly allocated string + * pointed to by encrypted_out of length encrypted_len_out. + * Return 0 for success, -1 otherwise. */ +static int +rend_encrypt_v2_intro_points_stealth(char **encrypted_out, + size_t *encrypted_len_out, + const char *encoded, + const char *descriptor_cookie) +{ + int r = -1, enclen; + crypto_cipher_env_t *cipher; + char *enc; + tor_assert(encoded); + tor_assert(descriptor_cookie); + + enc = tor_malloc_zero(1 + CIPHER_IV_LEN + strlen(encoded)); + enc[0] = 0x02; /* Auth type */ + cipher = crypto_create_init_cipher(descriptor_cookie, 1); + enclen = crypto_cipher_encrypt_with_iv(cipher, enc + 1, + CIPHER_IV_LEN+strlen(encoded), + encoded, strlen(encoded)); + crypto_free_cipher_env(cipher); + if (enclen < 0) { + log_warn(LD_REND, "Could not encrypt introduction point string."); goto done; } + *encrypted_out = enc; + *encrypted_len_out = enclen; + enc = NULL; /* prevent free */ r = 0; done: - if (r<0) - tor_free(*ipos_base64); - tor_free(unenc); + tor_free(enc); return r; } @@ -285,8 +415,7 @@ &test_intro_size, &test_encoded_size, &test_next, desc->desc_str); - if (test_parsed) - rend_service_descriptor_free(test_parsed); + rend_service_descriptor_free(test_parsed); tor_free(test_intro_content); return (res >= 0); } @@ -296,6 +425,8 @@ rend_encoded_v2_service_descriptor_free( rend_encoded_v2_service_descriptor_t *desc) { + if (!desc) + return; tor_free(desc->desc_str); tor_free(desc); } @@ -304,46 +435,106 @@ void rend_intro_point_free(rend_intro_point_t *intro) { - if (intro->extend_info) - extend_info_free(intro->extend_info); - if (intro->intro_key) - crypto_free_pk_env(intro->intro_key); + if (!intro) + return; + + extend_info_free(intro->extend_info); + crypto_free_pk_env(intro->intro_key); tor_free(intro); } /** Encode a set of rend_encoded_v2_service_descriptor_t's for desc - * at time now using descriptor_cookie (may be NULL if - * introduction points shall not be encrypted) and period (e.g. 0 - * for the current period, 1 for the next period, etc.) and add them to - * the existing list descs_out; return the number of seconds that - * the descriptors will be found by clients, or -1 if the encoding was not - * successful. */ + * at time now using service_key, depending on + * auth_type a descriptor_cookie and a list of + * client_cookies (which are both NULL if no client + * authorization is performed), and period (e.g. 0 for the current + * period, 1 for the next period, etc.) and add them to the existing list + * descs_out; return the number of seconds that the descriptors will + * be found by clients, or -1 if the encoding was not successful. */ int rend_encode_v2_descriptors(smartlist_t *descs_out, rend_service_descriptor_t *desc, time_t now, - const char *descriptor_cookie, uint8_t period) + uint8_t period, rend_auth_type_t auth_type, + crypto_pk_env_t *client_key, + smartlist_t *client_cookies) { char service_id[DIGEST_LEN]; uint32_t time_period; - char *ipos_base64 = NULL; + char *ipos_base64 = NULL, *ipos = NULL, *ipos_encrypted = NULL, + *descriptor_cookie = NULL; + size_t ipos_len = 0, ipos_encrypted_len = 0; int k; uint32_t seconds_valid; + crypto_pk_env_t *service_key; if (!desc) { - log_warn(LD_REND, "Could not encode v2 descriptor: No desc given."); + log_warn(LD_BUG, "Could not encode v2 descriptor: No desc given."); return -1; } + service_key = (auth_type == REND_STEALTH_AUTH) ? client_key : desc->pk; + tor_assert(service_key); + if (auth_type == REND_STEALTH_AUTH) { + descriptor_cookie = smartlist_get(client_cookies, 0); + tor_assert(descriptor_cookie); + } /* Obtain service_id from public key. */ - crypto_pk_get_digest(desc->pk, service_id); + crypto_pk_get_digest(service_key, service_id); /* Calculate current time-period. */ time_period = get_time_period(now, period, service_id); /* Determine how many seconds the descriptor will be valid. */ seconds_valid = period * REND_TIME_PERIOD_V2_DESC_VALIDITY + get_seconds_valid(now, service_id); /* Assemble, possibly encrypt, and encode introduction points. */ - if (smartlist_len(desc->intro_nodes) > 0 && - rend_encode_v2_intro_points(&ipos_base64, desc, descriptor_cookie) < 0) { - log_warn(LD_REND, "Encoding of introduction points did not succeed."); - return -1; + if (smartlist_len(desc->intro_nodes) > 0) { + if (rend_encode_v2_intro_points(&ipos, desc) < 0) { + log_warn(LD_REND, "Encoding of introduction points did not succeed."); + return -1; + } + switch (auth_type) { + case REND_NO_AUTH: + ipos_len = strlen(ipos); + break; + case REND_BASIC_AUTH: + if (rend_encrypt_v2_intro_points_basic(&ipos_encrypted, + &ipos_encrypted_len, ipos, + client_cookies) < 0) { + log_warn(LD_REND, "Encrypting of introduction points did not " + "succeed."); + tor_free(ipos); + return -1; + } + tor_free(ipos); + ipos = ipos_encrypted; + ipos_len = ipos_encrypted_len; + break; + case REND_STEALTH_AUTH: + if (rend_encrypt_v2_intro_points_stealth(&ipos_encrypted, + &ipos_encrypted_len, ipos, + descriptor_cookie) < 0) { + log_warn(LD_REND, "Encrypting of introduction points did not " + "succeed."); + tor_free(ipos); + return -1; + } + tor_free(ipos); + ipos = ipos_encrypted; + ipos_len = ipos_encrypted_len; + break; + default: + log_warn(LD_REND|LD_BUG, "Unrecognized authorization type %d", + (int)auth_type); + tor_free(ipos); + return -1; + } + /* Base64-encode introduction points. */ + ipos_base64 = tor_malloc_zero(ipos_len * 2); + if (base64_encode(ipos_base64, ipos_len * 2, ipos, ipos_len)<0) { + log_warn(LD_REND, "Could not encode introduction point string to " + "base64. length=%d", (int)ipos_len); + tor_free(ipos_base64); + tor_free(ipos); + return -1; + } + tor_free(ipos); } /* Encode REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS descriptors. */ for (k = 0; k < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; k++) { @@ -373,7 +564,7 @@ base32_encode(desc_id_base32, sizeof(desc_id_base32), enc->desc_id, DIGEST_LEN); /* PEM-encode the public key */ - if (crypto_pk_write_public_key_to_string(desc->pk, &permanent_key, + if (crypto_pk_write_public_key_to_string(service_key, &permanent_key, &permanent_key_len) < 0) { log_warn(LD_BUG, "Could not write public key to string."); rend_encoded_v2_service_descriptor_free(enc); @@ -441,7 +632,8 @@ } if (router_append_dirobj_signature(desc_str + written, desc_len - written, - desc_digest, desc->pk) < 0) { + desc_digest, DIGEST_LEN, + service_key) < 0) { log_warn(LD_BUG, "Couldn't sign desc."); rend_encoded_v2_service_descriptor_free(enc); goto err; @@ -478,57 +670,6 @@ return seconds_valid; } -/** Encode a service descriptor for desc, and sign it with - * key. Store the descriptor in *str_out, and set - * *len_out to its length. - */ -int -rend_encode_service_descriptor(rend_service_descriptor_t *desc, - crypto_pk_env_t *key, - char **str_out, size_t *len_out) -{ - char *cp; - char *end; - int i, r; - size_t asn1len; - size_t buflen = - PK_BYTES*2*(smartlist_len(desc->intro_nodes)+2);/*Too long, but ok*/ - cp = *str_out = tor_malloc(buflen); - end = cp + PK_BYTES*2*(smartlist_len(desc->intro_nodes)+1); - r = crypto_pk_asn1_encode(desc->pk, cp+2, end-(cp+2)); - if (r < 0) { - tor_free(*str_out); - return -1; - } - asn1len = r; - set_uint16(cp, htons((uint16_t)asn1len)); - cp += 2+asn1len; - set_uint32(cp, htonl((uint32_t)desc->timestamp)); - cp += 4; - set_uint16(cp, htons((uint16_t)smartlist_len(desc->intro_nodes))); - cp += 2; - for (i=0; i < smartlist_len(desc->intro_nodes); ++i) { - rend_intro_point_t *intro = smartlist_get(desc->intro_nodes, i); - char ipoint[HEX_DIGEST_LEN+2]; - ipoint[0] = '$'; - base16_encode(ipoint+1, HEX_DIGEST_LEN+1, - intro->extend_info->identity_digest, - DIGEST_LEN); - tor_assert(buflen + *str_out >= cp); /* XXX021 This assert is a kludge. */ - strlcpy(cp, ipoint, buflen-(cp-*str_out)); - cp += strlen(ipoint)+1; - } - note_crypto_pk_op(REND_SERVER); - r = crypto_pk_private_sign_digest(key, cp, *str_out, cp-*str_out); - if (r<0) { - tor_free(*str_out); - return -1; - } - cp += r; - *len_out = (size_t)(cp-*str_out); - return 0; -} - /** Parse a service descriptor at str (len bytes). On * success, return a newly alloced service_descriptor_t. On failure, * return NULL. @@ -645,14 +786,21 @@ /** Helper: free storage held by a single service descriptor cache entry. */ static void -_rend_cache_entry_free(void *p) +rend_cache_entry_free(rend_cache_entry_t *e) { - rend_cache_entry_t *e = p; + if (!e) + return; rend_service_descriptor_free(e->parsed); tor_free(e->desc); tor_free(e); } +static void +_rend_cache_entry_free(void *p) +{ + rend_cache_entry_free(p); +} + /** Free all storage held by the service descriptor cache. */ void rend_cache_free_all(void) @@ -679,7 +827,7 @@ ent = (rend_cache_entry_t*)val; if (ent->parsed->timestamp < cutoff) { iter = strmap_iter_next_rmv(rend_cache, iter); - _rend_cache_entry_free(ent); + rend_cache_entry_free(ent); } else { iter = strmap_iter_next(rend_cache, iter); } @@ -705,9 +853,9 @@ char key_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; base32_encode(key_base32, sizeof(key_base32), key, DIGEST_LEN); log_info(LD_REND, "Removing descriptor with ID '%s' from cache", - safe_str(key_base32)); + safe_str_client(key_base32)); iter = digestmap_iter_next_rmv(rend_cache_v2_dir, iter); - _rend_cache_entry_free(ent); + rend_cache_entry_free(ent); } else { iter = digestmap_iter_next(rend_cache_v2_dir, iter); } @@ -783,6 +931,11 @@ } if (!*e) return 0; + tor_assert((*e)->parsed && (*e)->parsed->intro_nodes); + /* XXX022 hack for now, to return "not found" if there are no intro + * points remaining. See bug 997. */ + if (smartlist_len((*e)->parsed->intro_nodes) == 0) + return 0; return 1; } @@ -845,9 +998,12 @@ * If we are acting as client due to the published flag and have any v2 * descriptor with the same ID, reject this one in order to not get * confused with having both versions for the same service. - * Return -1 if it's malformed or otherwise rejected; return 0 if - * it's the same or older than one we've already got; return 1 if - * it's novel. The published flag tells us if we store the descriptor + * + * Return -2 if it's malformed or otherwise rejected; return -1 if we + * already have a v2 descriptor here; return 0 if it's the same or older + * than one we've already got; return 1 if it's novel. + * + * The published flag tells us if we store the descriptor * in our role as directory (1) or if we cache it as client (0). */ int @@ -858,54 +1014,52 @@ char query[REND_SERVICE_ID_LEN_BASE32+1]; char key[REND_SERVICE_ID_LEN_BASE32+2]; /* 0\0 */ time_t now; - or_options_t *options = get_options(); tor_assert(rend_cache); parsed = rend_parse_service_descriptor(desc,desc_len); if (!parsed) { log_warn(LD_PROTOCOL,"Couldn't parse service descriptor."); - return -1; + return -2; } if (rend_get_service_id(parsed->pk, query)<0) { log_warn(LD_BUG,"Couldn't compute service ID."); rend_service_descriptor_free(parsed); - return -1; + return -2; } now = time(NULL); if (parsed->timestamp < now-REND_CACHE_MAX_AGE-REND_CACHE_MAX_SKEW) { log_fn(LOG_PROTOCOL_WARN, LD_REND, - "Service descriptor %s is too old.", safe_str(query)); + "Service descriptor %s is too old.", + safe_str_client(query)); rend_service_descriptor_free(parsed); - return -1; + return -2; } if (parsed->timestamp > now+REND_CACHE_MAX_SKEW) { log_fn(LOG_PROTOCOL_WARN, LD_REND, - "Service descriptor %s is too far in the future.", safe_str(query)); + "Service descriptor %s is too far in the future.", + safe_str_client(query)); rend_service_descriptor_free(parsed); - return -1; + return -2; } /* Do we have a v2 descriptor and fetched this descriptor as a client? */ tor_snprintf(key, sizeof(key), "2%s", query); if (!published && strmap_get_lc(rend_cache, key)) { log_info(LD_REND, "We already have a v2 descriptor for service %s.", - safe_str(query)); + safe_str_client(query)); rend_service_descriptor_free(parsed); return -1; } - /* report novel publication to statistics */ - if (published && options->HSAuthorityRecordStats) { - hs_usage_note_publish_total(query, now); - } tor_snprintf(key, sizeof(key), "0%s", query); e = (rend_cache_entry_t*) strmap_get_lc(rend_cache, key); if (e && e->parsed->timestamp > parsed->timestamp) { log_info(LD_REND,"We already have a newer service descriptor %s with the " - "same ID and version.", safe_str(query)); + "same ID and version.", + safe_str_client(query)); rend_service_descriptor_free(parsed); return 0; } if (e && e->len == desc_len && !memcmp(desc,e->desc,desc_len)) { log_info(LD_REND,"We already have this service descriptor %s.", - safe_str(query)); + safe_str_client(query)); e->received = time(NULL); rend_service_descriptor_free(parsed); return 0; @@ -913,10 +1067,6 @@ if (!e) { e = tor_malloc_zero(sizeof(rend_cache_entry_t)); strmap_set_lc(rend_cache, key, e); - /* report novel publication to statistics */ - if (published && options->HSAuthorityRecordStats) { - hs_usage_note_publish_novel(query, now); - } } else { rend_service_descriptor_free(e->parsed); tor_free(e->desc); @@ -928,7 +1078,7 @@ memcpy(e->desc, desc, desc_len); log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.", - safe_str(query), (int)desc_len); + safe_str_client(query), (int)desc_len); return 1; } @@ -979,7 +1129,7 @@ if (!hid_serv_responsible_for_desc_id(desc_id)) { log_info(LD_REND, "Service descriptor with desc ID %s is not in " "interval that we are responsible for.", - safe_str(desc_id_base32)); + safe_str_client(desc_id_base32)); goto skip; } /* Is descriptor too old? */ @@ -1061,7 +1211,7 @@ */ int rend_cache_store_v2_desc_as_client(const char *desc, - const char *descriptor_cookie) + const rend_data_t *rend_query) { /*XXXX this seems to have a bit of duplicate code with * rend_cache_store_v2_desc_as_dir(). Fix that. */ @@ -1088,34 +1238,55 @@ char key[REND_SERVICE_ID_LEN_BASE32+2]; char service_id[REND_SERVICE_ID_LEN_BASE32+1]; rend_cache_entry_t *e; + int retval; tor_assert(rend_cache); tor_assert(desc); /* Parse the descriptor. */ if (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content, &intro_size, &encoded_size, &next_desc, desc) < 0) { - if (parsed) rend_service_descriptor_free(parsed); - tor_free(intro_content); log_warn(LD_REND, "Could not parse descriptor."); - return -2; + retval = -2; + goto err; } /* Compute service ID from public key. */ if (rend_get_service_id(parsed->pk, service_id)<0) { log_warn(LD_REND, "Couldn't compute service ID."); - rend_service_descriptor_free(parsed); - tor_free(intro_content); - return -2; + retval = -2; + goto err; } /* Decode/decrypt introduction points. */ if (intro_content) { - if (rend_decrypt_introduction_points(parsed, descriptor_cookie, - intro_content, intro_size) < 0) { - log_warn(LD_PROTOCOL,"Couldn't decode/decrypt introduction points."); - rend_service_descriptor_free(parsed); - tor_free(intro_content); - return -2; + if (rend_query->auth_type != REND_NO_AUTH && + !tor_mem_is_zero(rend_query->descriptor_cookie, + sizeof(rend_query->descriptor_cookie))) { + char *ipos_decrypted = NULL; + size_t ipos_decrypted_size; + if (rend_decrypt_introduction_points(&ipos_decrypted, + &ipos_decrypted_size, + rend_query->descriptor_cookie, + intro_content, + intro_size) < 0) { + log_warn(LD_REND, "Failed to decrypt introduction points. We are " + "probably unable to parse the encoded introduction points."); + } else { + /* Replace encrypted with decrypted introduction points. */ + log_info(LD_REND, "Successfully decrypted introduction points."); + tor_free(intro_content); + intro_content = ipos_decrypted; + intro_size = ipos_decrypted_size; + } + } + if (rend_parse_introduction_points(parsed, intro_content, + intro_size) <= 0) { + log_warn(LD_REND, "Failed to parse introduction points. Either the " + "service has published a corrupt descriptor or you have " + "provided invalid authorization data."); + retval = -2; + goto err; } } else { + log_info(LD_REND, "Descriptor does not contain any introduction points."); parsed->intro_nodes = smartlist_create(); } /* We don't need the encoded/encrypted introduction points any longer. */ @@ -1123,24 +1294,24 @@ /* Is descriptor too old? */ if (parsed->timestamp < now - REND_CACHE_MAX_AGE-REND_CACHE_MAX_SKEW) { log_warn(LD_REND, "Service descriptor with service ID %s is too old.", - safe_str(service_id)); - rend_service_descriptor_free(parsed); - return -2; + safe_str_client(service_id)); + retval = -2; + goto err; } /* Is descriptor too far in the future? */ if (parsed->timestamp > now + REND_CACHE_MAX_SKEW) { log_warn(LD_REND, "Service descriptor with service ID %s is too far in " - "the future.", safe_str(service_id)); - rend_service_descriptor_free(parsed); - return -2; + "the future.", safe_str_client(service_id)); + retval = -2; + goto err; } /* Do we have a v0 descriptor? */ tor_snprintf(key, sizeof(key), "0%s", service_id); if (strmap_get_lc(rend_cache, key)) { log_info(LD_REND, "We already have a v0 descriptor for service ID %s.", - safe_str(service_id)); - rend_service_descriptor_free(parsed); - return -1; + safe_str_client(service_id)); + retval = -1; + goto err; } /* Do we already have a newer descriptor? */ tor_snprintf(key, sizeof(key), "2%s", service_id); @@ -1148,17 +1319,17 @@ if (e && e->parsed->timestamp > parsed->timestamp) { log_info(LD_REND, "We already have a newer service descriptor for " "service ID %s with the same desc ID and version.", - safe_str(service_id)); - rend_service_descriptor_free(parsed); - return 0; + safe_str_client(service_id)); + retval = 0; + goto err; } /* Do we already have this descriptor? */ if (e && !strcmp(desc, e->desc)) { log_info(LD_REND,"We already have this service descriptor %s.", - safe_str(service_id)); + safe_str_client(service_id)); e->received = time(NULL); - rend_service_descriptor_free(parsed); - return 0; + retval = 0; + goto err; } if (!e) { e = tor_malloc_zero(sizeof(rend_cache_entry_t)); @@ -1173,8 +1344,13 @@ strlcpy(e->desc, desc, encoded_size + 1); e->len = encoded_size; log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.", - safe_str(service_id), (int)encoded_size); + safe_str_client(service_id), (int)encoded_size); return 1; + + err: + rend_service_descriptor_free(parsed); + tor_free(intro_content); + return retval; } /** Called when we get a rendezvous-related relay cell on circuit @@ -1252,3 +1428,12 @@ return strmap_size(rend_cache); } +/** Allocate and return a new rend_data_t with the same + * contents as query. */ +rend_data_t * +rend_data_dup(const rend_data_t *data) +{ + tor_assert(data); + return tor_memdup(data, sizeof(rend_data_t)); +} + diff -Nru tor-0.2.0.34/src/or/rendcommon.h tor-0.2.2.16-alpha/src/or/rendcommon.h --- tor-0.2.0.34/src/or/rendcommon.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/rendcommon.h 2010-08-11 03:14:17.000000000 +0000 @@ -0,0 +1,64 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file rendcommon.h + * \brief Header file for rendcommon.c. + **/ + +#ifndef _TOR_RENDCOMMON_H +#define _TOR_RENDCOMMON_H + +/** Free all storage associated with data */ +static INLINE void +rend_data_free(rend_data_t *data) +{ + tor_free(data); +} + +int rend_cmp_service_ids(const char *one, const char *two); + +void rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint, + int command, size_t length, const char *payload); + +void rend_service_descriptor_free(rend_service_descriptor_t *desc); +rend_service_descriptor_t *rend_parse_service_descriptor(const char *str, + size_t len); +int rend_get_service_id(crypto_pk_env_t *pk, char *out); +void rend_encoded_v2_service_descriptor_free( + rend_encoded_v2_service_descriptor_t *desc); +void rend_intro_point_free(rend_intro_point_t *intro); + +void rend_cache_init(void); +void rend_cache_clean(void); +void rend_cache_clean_v2_descs_as_dir(void); +void rend_cache_free_all(void); +int rend_valid_service_id(const char *query); +int rend_cache_lookup_desc(const char *query, int version, const char **desc, + size_t *desc_len); +int rend_cache_lookup_entry(const char *query, int version, + rend_cache_entry_t **entry_out); +int rend_cache_lookup_v2_desc_as_dir(const char *query, const char **desc); +int rend_cache_store(const char *desc, size_t desc_len, int published); +int rend_cache_store_v2_desc_as_client(const char *desc, + const rend_data_t *rend_query); +int rend_cache_store_v2_desc_as_dir(const char *desc); +int rend_cache_size(void); +int rend_encode_v2_descriptors(smartlist_t *descs_out, + rend_service_descriptor_t *desc, time_t now, + uint8_t period, rend_auth_type_t auth_type, + crypto_pk_env_t *client_key, + smartlist_t *client_cookies); +int rend_compute_v2_desc_id(char *desc_id_out, const char *service_id, + const char *descriptor_cookie, + time_t now, uint8_t replica); +int rend_id_is_in_interval(const char *a, const char *b, const char *c); +void rend_get_descriptor_id_bytes(char *descriptor_id_out, + const char *service_id, + const char *secret_id_part); + +#endif + diff -Nru tor-0.2.0.34/src/or/rendmid.c tor-0.2.2.16-alpha/src/or/rendmid.c --- tor-0.2.0.34/src/or/rendmid.c 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/rendmid.c 2010-08-11 03:14:17.000000000 +0000 @@ -1,9 +1,6 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: rendmid.c 13412 2008-02-07 05:31:47Z nickm $ */ -const char rendmid_c_id[] = - "$Id: rendmid.c 13412 2008-02-07 05:31:47Z nickm $"; /** * \file rendmid.c @@ -11,6 +8,11 @@ **/ #include "or.h" +#include "circuitlist.h" +#include "config.h" +#include "relay.h" +#include "rendmid.h" +#include "rephist.h" /** Respond to an ESTABLISH_INTRO cell by checking the signed data and * setting the circuit's purpose and service pk digest. diff -Nru tor-0.2.0.34/src/or/rendmid.h tor-0.2.2.16-alpha/src/or/rendmid.h --- tor-0.2.0.34/src/or/rendmid.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/rendmid.h 2010-08-11 03:14:17.000000000 +0000 @@ -0,0 +1,25 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file rendmid.h + * \brief Header file for rendmid.c. + **/ + +#ifndef _TOR_RENDMID_H +#define _TOR_RENDMID_H + +int rend_mid_establish_intro(or_circuit_t *circ, const char *request, + size_t request_len); +int rend_mid_introduce(or_circuit_t *circ, const char *request, + size_t request_len); +int rend_mid_establish_rendezvous(or_circuit_t *circ, const char *request, + size_t request_len); +int rend_mid_rendezvous(or_circuit_t *circ, const char *request, + size_t request_len); + +#endif + diff -Nru tor-0.2.0.34/src/or/rendservice.c tor-0.2.2.16-alpha/src/or/rendservice.c --- tor-0.2.0.34/src/or/rendservice.c 2009-01-05 02:06:16.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/rendservice.c 2010-08-11 03:14:17.000000000 +0000 @@ -1,9 +1,6 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: rendservice.c 17883 2009-01-04 18:52:54Z nickm $ */ -const char rendservice_c_id[] = - "$Id: rendservice.c 17883 2009-01-04 18:52:54Z nickm $"; /** * \file rendservice.c @@ -11,10 +8,23 @@ **/ #include "or.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "directory.h" +#include "networkstatus.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rendservice.h" +#include "router.h" +#include "relay.h" +#include "rephist.h" +#include "routerlist.h" +#include "routerparse.h" static origin_circuit_t *find_intro_circuit(rend_intro_point_t *intro, - const char *pk_digest, - int desc_version); + const char *pk_digest); /** Represents the mapping from a virtual port of a rendezvous service to * a real port on some IP. @@ -22,7 +32,7 @@ typedef struct rend_service_port_config_t { uint16_t virtual_port; uint16_t real_port; - uint32_t real_addr; + tor_addr_t real_addr; } rend_service_port_config_t; /** Try to maintain this many intro points per service if possible. */ @@ -45,10 +55,11 @@ /* Fields specified in config file */ char *directory; /**< where in the filesystem it stores it */ smartlist_t *ports; /**< List of rend_service_port_config_t */ - char *intro_prefer_nodes; /**< comma-separated list of nicknames */ - char *intro_exclude_nodes; /**< comma-separated list of nicknames */ - int descriptor_version; /**< Rendezvous descriptor version that will be - * published. */ + rend_auth_type_t auth_type; /**< Client authorization type or 0 if no client + * authorization is performed. */ + smartlist_t *clients; /**< List of rend_authorized_client_t's of + * clients that may access our service. Can be NULL + * if no client authorization is performed. */ /* Other fields */ crypto_pk_env_t *private_key; /**< Permanent hidden-service key. */ char service_id[REND_SERVICE_ID_LEN_BASE32+1]; /**< Onion address without @@ -58,7 +69,7 @@ * or are trying to establish. */ time_t intro_period_started; /**< Start of the current period to build * introduction points. */ - int n_intro_circuits_launched; /**< count of intro circuits we have + int n_intro_circuits_launched; /**< Count of intro circuits we have * established in this period. */ rend_service_descriptor_t *desc; /**< Current hidden service descriptor. */ time_t desc_is_dirty; /**< Time at which changes to the hidden service @@ -66,6 +77,11 @@ * up-to-date. */ time_t next_upload_time; /**< Scheduled next hidden service descriptor * upload time. */ + /** Map from digests of Diffie-Hellman values INTRODUCE2 to time_t of when + * they were received; used to prevent replays. */ + digestmap_t *accepted_intros; + /** Time at which we last removed expired values from accepted_intros. */ + time_t last_cleaned_accepted_intros; } rend_service_t; /** A list of rend_service_t's for services run on this OP. @@ -81,12 +97,33 @@ return smartlist_len(rend_service_list); } +/** Helper: free storage held by a single service authorized client entry. */ +static void +rend_authorized_client_free(rend_authorized_client_t *client) +{ + if (!client) + return; + if (client->client_key) + crypto_free_pk_env(client->client_key); + tor_free(client->client_name); + tor_free(client); +} + +/** Helper for strmap_free. */ +static void +rend_authorized_client_strmap_item_free(void *authorized_client) +{ + rend_authorized_client_free(authorized_client); +} + /** Release the storage held by service. */ static void rend_service_free(rend_service_t *service) { - if (!service) return; + if (!service) + return; + tor_free(service->directory); SMARTLIST_FOREACH(service->ports, void*, p, tor_free(p)); smartlist_free(service->ports); @@ -97,10 +134,14 @@ rend_intro_point_free(intro);); smartlist_free(service->intro_nodes); } - tor_free(service->intro_prefer_nodes); - tor_free(service->intro_exclude_nodes); - if (service->desc) - rend_service_descriptor_free(service->desc); + + rend_service_descriptor_free(service->desc); + if (service->clients) { + SMARTLIST_FOREACH(service->clients, rend_authorized_client_t *, c, + rend_authorized_client_free(c);); + smartlist_free(service->clients); + } + digestmap_free(service->accepted_intros, _tor_free); tor_free(service); } @@ -109,9 +150,9 @@ void rend_service_free_all(void) { - if (!rend_service_list) { + if (!rend_service_list) return; - } + SMARTLIST_FOREACH(rend_service_list, rend_service_t*, ptr, rend_service_free(ptr)); smartlist_free(rend_service_list); @@ -125,33 +166,15 @@ { int i; rend_service_port_config_t *p; - struct in_addr addr; - if (!service->intro_prefer_nodes) - service->intro_prefer_nodes = tor_strdup(""); - if (!service->intro_exclude_nodes) - service->intro_exclude_nodes = tor_strdup(""); service->intro_nodes = smartlist_create(); - /* If the service is configured to publish unversioned (v0) and versioned - * descriptors (v2 or higher), split it up into two separate services. */ - if (service->descriptor_version == -1) { - rend_service_t *v0_service = tor_malloc_zero(sizeof(rend_service_t)); - v0_service->directory = tor_strdup(service->directory); - v0_service->ports = smartlist_create(); - SMARTLIST_FOREACH(service->ports, rend_service_port_config_t *, p, { - rend_service_port_config_t *copy = - tor_malloc_zero(sizeof(rend_service_port_config_t)); - memcpy(copy, p, sizeof(rend_service_port_config_t)); - smartlist_add(v0_service->ports, copy); - }); - v0_service->intro_prefer_nodes = tor_strdup(service->intro_prefer_nodes); - v0_service->intro_exclude_nodes = tor_strdup(service->intro_exclude_nodes); - v0_service->intro_period_started = service->intro_period_started; - v0_service->descriptor_version = 0; /* Unversioned descriptor. */ - rend_add_service(v0_service); - - service->descriptor_version = 2; /* Versioned descriptor. */ + if (service->auth_type != REND_NO_AUTH && + smartlist_len(service->clients) == 0) { + log_warn(LD_CONFIG, "Hidden service with client authorization but no " + "clients; ignoring."); + rend_service_free(service); + return; } if (!smartlist_len(service->ports)) { @@ -162,12 +185,9 @@ log_debug(LD_REND,"Configuring service with directory \"%s\"", service->directory); for (i = 0; i < smartlist_len(service->ports); ++i) { - char addrbuf[INET_NTOA_BUF_LEN]; p = smartlist_get(service->ports, i); - addr.s_addr = htonl(p->real_addr); - tor_inet_ntoa(&addr, addrbuf, sizeof(addrbuf)); log_debug(LD_REND,"Service maps port %d to %s:%d", - p->virtual_port, addrbuf, p->real_port); + p->virtual_port, fmt_addr(&p->real_addr), p->real_port); } } } @@ -186,7 +206,7 @@ int virtport; int realport; uint16_t p; - uint32_t addr; + tor_addr_t addr; const char *addrport; rend_service_port_config_t *result = NULL; @@ -208,11 +228,11 @@ if (smartlist_len(sl) == 1) { /* No addr:port part; use default. */ realport = virtport; - addr = 0x7F000001u; /* 127.0.0.1 */ + tor_addr_from_ipv4h(&addr, 0x7F000001u); /* 127.0.0.1 */ } else { addrport = smartlist_get(sl,1); if (strchr(addrport, ':') || strchr(addrport, '.')) { - if (parse_addr_port(LOG_WARN, addrport, NULL, &addr, &p)<0) { + if (tor_addr_port_parse(addrport, &addr, &p)<0) { log_warn(LD_CONFIG,"Unparseable address in hidden service port " "configuration."); goto err; @@ -226,14 +246,14 @@ "service port configuration.", escaped(addrport)); goto err; } - addr = 0x7F000001u; /* Default to 127.0.0.1 */ + tor_addr_from_ipv4h(&addr, 0x7F000001u); /* Default to 127.0.0.1 */ } } result = tor_malloc(sizeof(rend_service_port_config_t)); result->virtual_port = virtport; result->real_port = realport; - result->real_addr = addr; + tor_addr_copy(&result->real_addr, &addr); err: SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); smartlist_free(sl); @@ -260,7 +280,7 @@ for (line = options->RendConfigLines; line; line = line->next) { if (!strcasecmp(line->key, "HiddenServiceDir")) { - if (service) { + if (service) { /* register the one we just finished parsing */ if (validate_only) rend_service_free(service); else @@ -270,7 +290,6 @@ service->directory = tor_strdup(line->value); service->ports = smartlist_create(); service->intro_period_started = time(NULL); - service->descriptor_version = -1; /**< All descriptor versions. */ continue; } if (!service) { @@ -286,54 +305,123 @@ return -1; } smartlist_add(service->ports, portcfg); - } else if (!strcasecmp(line->key, "HiddenServiceNodes")) { - if (service->intro_prefer_nodes) { - log_warn(LD_CONFIG, - "Got multiple HiddenServiceNodes lines for a single " - "service."); + } else if (!strcasecmp(line->key, "HiddenServiceAuthorizeClient")) { + /* Parse auth type and comma-separated list of client names and add a + * rend_authorized_client_t for each client to the service's list + * of authorized clients. */ + smartlist_t *type_names_split, *clients; + const char *authname; + int num_clients; + if (service->auth_type != REND_NO_AUTH) { + log_warn(LD_CONFIG, "Got multiple HiddenServiceAuthorizeClient " + "lines for a single service."); rend_service_free(service); return -1; } - service->intro_prefer_nodes = tor_strdup(line->value); - } else if (!strcasecmp(line->key, "HiddenServiceExcludeNodes")) { - if (service->intro_exclude_nodes) { - log_warn(LD_CONFIG, - "Got multiple HiddenServiceExcludedNodes lines for " - "a single service."); + type_names_split = smartlist_create(); + smartlist_split_string(type_names_split, line->value, " ", 0, 2); + if (smartlist_len(type_names_split) < 1) { + log_warn(LD_BUG, "HiddenServiceAuthorizeClient has no value. This " + "should have been prevented when parsing the " + "configuration."); + smartlist_free(type_names_split); rend_service_free(service); return -1; } - service->intro_exclude_nodes = tor_strdup(line->value); - } else { - smartlist_t *versions; - char *version_str; - int i, version, ver_ok=1, versions_bitmask = 0; - tor_assert(!strcasecmp(line->key, "HiddenServiceVersion")); - versions = smartlist_create(); - smartlist_split_string(versions, line->value, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - for (i = 0; i < smartlist_len(versions); i++) { - version_str = smartlist_get(versions, i); - if (strlen(version_str) != 1 || strspn(version_str, "02") != 1) { - log_warn(LD_CONFIG, - "HiddenServiceVersion can only be 0 and/or 2."); - SMARTLIST_FOREACH(versions, char *, cp, tor_free(cp)); - smartlist_free(versions); + authname = smartlist_get(type_names_split, 0); + if (!strcasecmp(authname, "basic")) { + service->auth_type = REND_BASIC_AUTH; + } else if (!strcasecmp(authname, "stealth")) { + service->auth_type = REND_STEALTH_AUTH; + } else { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains " + "unrecognized auth-type '%s'. Only 'basic' or 'stealth' " + "are recognized.", + (char *) smartlist_get(type_names_split, 0)); + SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); + smartlist_free(type_names_split); + rend_service_free(service); + return -1; + } + service->clients = smartlist_create(); + if (smartlist_len(type_names_split) < 2) { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains " + "auth-type '%s', but no client names.", + service->auth_type == REND_BASIC_AUTH ? "basic" : "stealth"); + SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); + smartlist_free(type_names_split); + continue; + } + clients = smartlist_create(); + smartlist_split_string(clients, smartlist_get(type_names_split, 1), + ",", SPLIT_SKIP_SPACE, 0); + SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); + smartlist_free(type_names_split); + /* Remove duplicate client names. */ + num_clients = smartlist_len(clients); + smartlist_sort_strings(clients); + smartlist_uniq_strings(clients); + if (smartlist_len(clients) < num_clients) { + log_info(LD_CONFIG, "HiddenServiceAuthorizeClient contains %d " + "duplicate client name(s); removing.", + num_clients - smartlist_len(clients)); + num_clients = smartlist_len(clients); + } + SMARTLIST_FOREACH_BEGIN(clients, const char *, client_name) + { + rend_authorized_client_t *client; + size_t len = strlen(client_name); + if (len < 1 || len > REND_CLIENTNAME_MAX_LEN) { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains an " + "illegal client name: '%s'. Length must be " + "between 1 and %d characters.", + client_name, REND_CLIENTNAME_MAX_LEN); + SMARTLIST_FOREACH(clients, char *, cp, tor_free(cp)); + smartlist_free(clients); rend_service_free(service); return -1; } - version = (int)tor_parse_long(version_str, 10, 0, INT_MAX, &ver_ok, - NULL); - if (!ver_ok) - continue; - versions_bitmask |= 1 << version; + if (strspn(client_name, REND_LEGAL_CLIENTNAME_CHARACTERS) != len) { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains an " + "illegal client name: '%s'. Valid " + "characters are [A-Za-z0-9+-_].", + client_name); + SMARTLIST_FOREACH(clients, char *, cp, tor_free(cp)); + smartlist_free(clients); + rend_service_free(service); + return -1; + } + client = tor_malloc_zero(sizeof(rend_authorized_client_t)); + client->client_name = tor_strdup(client_name); + smartlist_add(service->clients, client); + log_debug(LD_REND, "Adding client name '%s'", client_name); + } + SMARTLIST_FOREACH_END(client_name); + SMARTLIST_FOREACH(clients, char *, cp, tor_free(cp)); + smartlist_free(clients); + /* Ensure maximum number of clients. */ + if ((service->auth_type == REND_BASIC_AUTH && + smartlist_len(service->clients) > 512) || + (service->auth_type == REND_STEALTH_AUTH && + smartlist_len(service->clients) > 16)) { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains %d " + "client authorization entries, but only a " + "maximum of %d entries is allowed for " + "authorization type '%s'.", + smartlist_len(service->clients), + service->auth_type == REND_BASIC_AUTH ? 512 : 16, + service->auth_type == REND_BASIC_AUTH ? "basic" : "stealth"); + rend_service_free(service); + return -1; + } + } else { + tor_assert(!strcasecmp(line->key, "HiddenServiceVersion")); + if (strcmp(line->value, "2")) { + log_warn(LD_CONFIG, + "The only supported HiddenServiceVersion is 2."); + rend_service_free(service); + return -1; } - /* If exactly one version is set, change descriptor_version to that - * value; otherwise leave it at -1. */ - if (versions_bitmask == 1 << 0) service->descriptor_version = 0; - if (versions_bitmask == 1 << 2) service->descriptor_version = 2; - SMARTLIST_FOREACH(versions, char *, cp, tor_free(cp)); - smartlist_free(versions); } } if (service) { @@ -355,8 +443,7 @@ * probably ok? */ SMARTLIST_FOREACH(rend_service_list, rend_service_t *, new, { SMARTLIST_FOREACH(old_service_list, rend_service_t *, old, { - if (!strcmp(old->directory, new->directory) && - old->descriptor_version == new->descriptor_version) { + if (!strcmp(old->directory, new->directory)) { smartlist_add_all(new->intro_nodes, old->intro_nodes); smartlist_clear(old->intro_nodes); smartlist_add(surviving_services, old); @@ -376,21 +463,19 @@ circ->purpose == CIRCUIT_PURPOSE_S_INTRO)) { origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); int keep_it = 0; + tor_assert(oc->rend_data); SMARTLIST_FOREACH(surviving_services, rend_service_t *, ptr, { - if (!memcmp(ptr->pk_digest, oc->rend_pk_digest, - DIGEST_LEN) && - ptr->descriptor_version == oc->rend_desc_version) { + if (!memcmp(ptr->pk_digest, oc->rend_data->rend_pk_digest, + DIGEST_LEN)) { keep_it = 1; break; } }); if (keep_it) continue; - log_info(LD_REND, "Closing intro point %s for service %s.onion " - "version %d.", - safe_str(oc->build_state->chosen_exit->nickname), - oc->rend_query, - oc->rend_desc_version); + log_info(LD_REND, "Closing intro point %s for service %s.", + safe_str_client(oc->build_state->chosen_exit->nickname), + oc->rend_data->onion_address); circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); /* XXXX Is there another reason we should use here? */ } @@ -413,23 +498,21 @@ rend_service_descriptor_t *d; origin_circuit_t *circ; int i; - if (service->desc) { - rend_service_descriptor_free(service->desc); - service->desc = NULL; - } + + rend_service_descriptor_free(service->desc); + service->desc = NULL; + d = service->desc = tor_malloc_zero(sizeof(rend_service_descriptor_t)); d->pk = crypto_pk_dup_key(service->private_key); d->timestamp = time(NULL); - d->version = service->descriptor_version; d->intro_nodes = smartlist_create(); - /* Whoever understands descriptor version 2 also understands intro - * protocol 2. So we only support 2. */ - d->protocols = 1 << 2; + /* Support intro protocols 2 and 3. */ + d->protocols = (1 << 2) + (1 << 3); for (i = 0; i < smartlist_len(service->intro_nodes); ++i) { rend_intro_point_t *intro_svc = smartlist_get(service->intro_nodes, i); rend_intro_point_t *intro_desc; - circ = find_intro_circuit(intro_svc, service->pk_digest, d->version); + circ = find_intro_circuit(intro_svc, service->pk_digest); if (!circ || circ->_base.purpose != CIRCUIT_PURPOSE_S_INTRO) continue; @@ -442,19 +525,18 @@ } } -/** Load and/or generate private keys for all hidden services. Return 0 on - * success, -1 on failure. +/** Load and/or generate private keys for all hidden services, possibly + * including keys for client authorization. Return 0 on success, -1 on + * failure. */ int rend_service_load_keys(void) { - int i; - rend_service_t *s; + int r = 0; char fname[512]; - char buf[128]; + char buf[1500]; - for (i=0; i < smartlist_len(rend_service_list); ++i) { - s = smartlist_get(rend_service_list,i); + SMARTLIST_FOREACH_BEGIN(rend_service_list, rend_service_t *, s) { if (s->private_key) continue; log_info(LD_REND, "Loading hidden-service keys from \"%s\"", @@ -493,23 +575,193 @@ return -1; } tor_snprintf(buf, sizeof(buf),"%s.onion\n", s->service_id); - if (write_str_to_file(fname,buf,0)<0) + if (write_str_to_file(fname,buf,0)<0) { + log_warn(LD_CONFIG, "Could not write onion address to hostname file."); return -1; - } - return 0; + } + + /* If client authorization is configured, load or generate keys. */ + if (s->auth_type != REND_NO_AUTH) { + char *client_keys_str = NULL; + strmap_t *parsed_clients = strmap_new(); + char cfname[512]; + FILE *cfile, *hfile; + open_file_t *open_cfile = NULL, *open_hfile = NULL; + + /* Load client keys and descriptor cookies, if available. */ + if (tor_snprintf(cfname, sizeof(cfname), "%s"PATH_SEPARATOR"client_keys", + s->directory)<0) { + log_warn(LD_CONFIG, "Directory name too long to store client keys " + "file: \"%s\".", s->directory); + goto err; + } + client_keys_str = read_file_to_str(cfname, RFTS_IGNORE_MISSING, NULL); + if (client_keys_str) { + if (rend_parse_client_keys(parsed_clients, client_keys_str) < 0) { + log_warn(LD_CONFIG, "Previously stored client_keys file could not " + "be parsed."); + goto err; + } else { + log_info(LD_CONFIG, "Parsed %d previously stored client entries.", + strmap_size(parsed_clients)); + tor_free(client_keys_str); + } + } + + /* Prepare client_keys and hostname files. */ + if (!(cfile = start_writing_to_stdio_file(cfname, OPEN_FLAGS_REPLACE, + 0600, &open_cfile))) { + log_warn(LD_CONFIG, "Could not open client_keys file %s", + escaped(cfname)); + goto err; + } + if (!(hfile = start_writing_to_stdio_file(fname, OPEN_FLAGS_REPLACE, + 0600, &open_hfile))) { + log_warn(LD_CONFIG, "Could not open hostname file %s", escaped(fname)); + goto err; + } + + /* Either use loaded keys for configured clients or generate new + * ones if a client is new. */ + SMARTLIST_FOREACH_BEGIN(s->clients, rend_authorized_client_t *, client) + { + char desc_cook_out[3*REND_DESC_COOKIE_LEN_BASE64+1]; + char service_id[16+1]; + rend_authorized_client_t *parsed = + strmap_get(parsed_clients, client->client_name); + int written; + size_t len; + /* Copy descriptor cookie from parsed entry or create new one. */ + if (parsed) { + memcpy(client->descriptor_cookie, parsed->descriptor_cookie, + REND_DESC_COOKIE_LEN); + } else { + crypto_rand(client->descriptor_cookie, REND_DESC_COOKIE_LEN); + } + if (base64_encode(desc_cook_out, 3*REND_DESC_COOKIE_LEN_BASE64+1, + client->descriptor_cookie, + REND_DESC_COOKIE_LEN) < 0) { + log_warn(LD_BUG, "Could not base64-encode descriptor cookie."); + strmap_free(parsed_clients, rend_authorized_client_strmap_item_free); + return -1; + } + /* Copy client key from parsed entry or create new one if required. */ + if (parsed && parsed->client_key) { + client->client_key = crypto_pk_dup_key(parsed->client_key); + } else if (s->auth_type == REND_STEALTH_AUTH) { + /* Create private key for client. */ + crypto_pk_env_t *prkey = NULL; + if (!(prkey = crypto_new_pk_env())) { + log_warn(LD_BUG,"Error constructing client key"); + goto err; + } + if (crypto_pk_generate_key(prkey)) { + log_warn(LD_BUG,"Error generating client key"); + crypto_free_pk_env(prkey); + goto err; + } + if (crypto_pk_check_key(prkey) <= 0) { + log_warn(LD_BUG,"Generated client key seems invalid"); + crypto_free_pk_env(prkey); + goto err; + } + client->client_key = prkey; + } + /* Add entry to client_keys file. */ + desc_cook_out[strlen(desc_cook_out)-1] = '\0'; /* Remove newline. */ + written = tor_snprintf(buf, sizeof(buf), + "client-name %s\ndescriptor-cookie %s\n", + client->client_name, desc_cook_out); + if (written < 0) { + log_warn(LD_BUG, "Could not write client entry."); + goto err; + } + if (client->client_key) { + char *client_key_out = NULL; + crypto_pk_write_private_key_to_string(client->client_key, + &client_key_out, &len); + if (rend_get_service_id(client->client_key, service_id)<0) { + log_warn(LD_BUG, "Internal error: couldn't encode service ID."); + tor_free(client_key_out); + goto err; + } + written = tor_snprintf(buf + written, sizeof(buf) - written, + "client-key\n%s", client_key_out); + tor_free(client_key_out); + if (written < 0) { + log_warn(LD_BUG, "Could not write client entry."); + goto err; + } + } + + if (fputs(buf, cfile) < 0) { + log_warn(LD_FS, "Could not append client entry to file: %s", + strerror(errno)); + goto err; + } + + /* Add line to hostname file. */ + if (s->auth_type == REND_BASIC_AUTH) { + /* Remove == signs (newline has been removed above). */ + desc_cook_out[strlen(desc_cook_out)-2] = '\0'; + tor_snprintf(buf, sizeof(buf),"%s.onion %s # client: %s\n", + s->service_id, desc_cook_out, client->client_name); + } else { + char extended_desc_cookie[REND_DESC_COOKIE_LEN+1]; + memcpy(extended_desc_cookie, client->descriptor_cookie, + REND_DESC_COOKIE_LEN); + extended_desc_cookie[REND_DESC_COOKIE_LEN] = + ((int)s->auth_type - 1) << 4; + if (base64_encode(desc_cook_out, 3*REND_DESC_COOKIE_LEN_BASE64+1, + extended_desc_cookie, + REND_DESC_COOKIE_LEN+1) < 0) { + log_warn(LD_BUG, "Could not base64-encode descriptor cookie."); + goto err; + } + desc_cook_out[strlen(desc_cook_out)-3] = '\0'; /* Remove A= and + newline. */ + tor_snprintf(buf, sizeof(buf),"%s.onion %s # client: %s\n", + service_id, desc_cook_out, client->client_name); + } + + if (fputs(buf, hfile)<0) { + log_warn(LD_FS, "Could not append host entry to file: %s", + strerror(errno)); + goto err; + } + } + SMARTLIST_FOREACH_END(client); + + goto done; + err: + r = -1; + done: + tor_free(client_keys_str); + strmap_free(parsed_clients, rend_authorized_client_strmap_item_free); + if (r<0) { + if (open_cfile) + abort_writing_to_file(open_cfile); + if (open_hfile) + abort_writing_to_file(open_hfile); + return r; + } else { + finish_writing_to_file(open_cfile); + finish_writing_to_file(open_hfile); + } + } + } SMARTLIST_FOREACH_END(s); + return r; } -/** Return the service whose public key has a digest of digest and - * which publishes the given descriptor version. Return NULL if no - * such service exists. +/** Return the service whose public key has a digest of digest, or + * NULL if no such service exists. */ static rend_service_t * -rend_service_get_by_pk_digest_and_version(const char* digest, - uint8_t version) +rend_service_get_by_pk_digest(const char* digest) { SMARTLIST_FOREACH(rend_service_list, rend_service_t*, s, - if (!memcmp(s->pk_digest,digest,DIGEST_LEN) && - s->descriptor_version == version) return s); + if (!memcmp(s->pk_digest,digest,DIGEST_LEN)) + return s); return NULL; } @@ -531,6 +783,64 @@ return 0; } +/** Check client authorization of a given descriptor_cookie for + * service. Return 1 for success and 0 for failure. */ +static int +rend_check_authorization(rend_service_t *service, + const char *descriptor_cookie) +{ + rend_authorized_client_t *auth_client = NULL; + tor_assert(service); + tor_assert(descriptor_cookie); + if (!service->clients) { + log_warn(LD_BUG, "Can't check authorization for a service that has no " + "authorized clients configured."); + return 0; + } + + /* Look up client authorization by descriptor cookie. */ + SMARTLIST_FOREACH(service->clients, rend_authorized_client_t *, client, { + if (!memcmp(client->descriptor_cookie, descriptor_cookie, + REND_DESC_COOKIE_LEN)) { + auth_client = client; + break; + } + }); + if (!auth_client) { + char descriptor_cookie_base64[3*REND_DESC_COOKIE_LEN_BASE64]; + base64_encode(descriptor_cookie_base64, sizeof(descriptor_cookie_base64), + descriptor_cookie, REND_DESC_COOKIE_LEN); + log_info(LD_REND, "No authorization found for descriptor cookie '%s'! " + "Dropping cell!", + descriptor_cookie_base64); + return 0; + } + + /* Allow the request. */ + log_debug(LD_REND, "Client %s authorized for service %s.", + auth_client->client_name, service->service_id); + return 1; +} + +/** Remove elements from service's replay cache that are old enough to + * be noticed by timestamp checking. */ +static void +clean_accepted_intros(rend_service_t *service, time_t now) +{ + const time_t cutoff = now - REND_REPLAY_TIME_INTERVAL; + + service->last_cleaned_accepted_intros = now; + if (!service->accepted_intros) + return; + + DIGESTMAP_FOREACH_MODIFY(service->accepted_intros, digest, time_t *, t) { + if (*t < cutoff) { + tor_free(t); + MAP_DEL_CURRENT(digest); + } + } DIGESTMAP_FOREACH_END; +} + /****** * Handle cells ******/ @@ -547,7 +857,7 @@ char buf[RELAY_PAYLOAD_SIZE]; char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN]; /* Holds KH, Df, Db, Kf, Kb */ rend_service_t *service; - int r, i; + int r, i, v3_shift = 0; size_t len, keylen; crypto_dh_env_t *dh = NULL; origin_circuit_t *launched = NULL; @@ -558,9 +868,17 @@ int reason = END_CIRC_REASON_TORPROTOCOL; crypto_pk_env_t *intro_key; char intro_key_digest[DIGEST_LEN]; + int auth_type; + size_t auth_len = 0; + char auth_data[REND_DESC_COOKIE_LEN]; + crypto_digest_env_t *digest = NULL; + time_t now = time(NULL); + char diffie_hellman_hash[DIGEST_LEN]; + time_t *access_time; + tor_assert(circuit->rend_data); base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, - circuit->rend_pk_digest, REND_SERVICE_ID_LEN); + circuit->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN); log_info(LD_REND, "Received INTRODUCE2 cell for service %s on circ %d.", escaped(serviceid), circuit->_base.n_circ_id); @@ -580,20 +898,16 @@ } /* look up service depending on circuit. */ - service = rend_service_get_by_pk_digest_and_version( - circuit->rend_pk_digest, circuit->rend_desc_version); + service = rend_service_get_by_pk_digest( + circuit->rend_data->rend_pk_digest); if (!service) { log_warn(LD_REND, "Got an INTRODUCE2 cell for an unrecognized service %s.", escaped(serviceid)); return -1; } - /* if descriptor version is 2, use intro key instead of service key. */ - if (circuit->rend_desc_version == 0) { - intro_key = service->private_key; - } else { - intro_key = circuit->intro_key; - } + /* use intro key instead of service key. */ + intro_key = circuit->intro_key; /* first DIGEST_LEN bytes of request is intro or service pk digest */ crypto_pk_get_digest(intro_key, intro_key_digest); @@ -621,33 +935,69 @@ return -1; } len = r; - if (*buf == 2) { + if (*buf == 3) { + /* Version 3 INTRODUCE2 cell. */ + time_t ts = 0; + v3_shift = 1; + auth_type = buf[1]; + switch (auth_type) { + case REND_BASIC_AUTH: + /* fall through */ + case REND_STEALTH_AUTH: + auth_len = ntohs(get_uint16(buf+2)); + if (auth_len != REND_DESC_COOKIE_LEN) { + log_info(LD_REND, "Wrong auth data size %d, should be %d.", + (int)auth_len, REND_DESC_COOKIE_LEN); + return -1; + } + memcpy(auth_data, buf+4, sizeof(auth_data)); + v3_shift += 2+REND_DESC_COOKIE_LEN; + break; + case REND_NO_AUTH: + break; + default: + log_info(LD_REND, "Unknown authorization type '%d'", auth_type); + } + + /* Check timestamp. */ + ts = ntohl(get_uint32(buf+1+v3_shift)); + v3_shift += 4; + if ((now - ts) < -1 * REND_REPLAY_TIME_INTERVAL / 2 || + (now - ts) > REND_REPLAY_TIME_INTERVAL / 2) { + log_warn(LD_REND, "INTRODUCE2 cell is too %s. Discarding.", + (now - ts) < 0 ? "old" : "new"); + return -1; + } + } + if (*buf == 2 || *buf == 3) { /* Version 2 INTRODUCE2 cell. */ int klen; extend_info = tor_malloc_zero(sizeof(extend_info_t)); - extend_info->addr = ntohl(get_uint32(buf+1)); - extend_info->port = ntohs(get_uint16(buf+5)); - memcpy(extend_info->identity_digest, buf+7, DIGEST_LEN); + tor_addr_from_ipv4n(&extend_info->addr, get_uint32(buf+v3_shift+1)); + extend_info->port = ntohs(get_uint16(buf+v3_shift+5)); + memcpy(extend_info->identity_digest, buf+v3_shift+7, + DIGEST_LEN); extend_info->nickname[0] = '$'; base16_encode(extend_info->nickname+1, sizeof(extend_info->nickname)-1, extend_info->identity_digest, DIGEST_LEN); - klen = ntohs(get_uint16(buf+7+DIGEST_LEN)); - if ((int)len != 7+DIGEST_LEN+2+klen+20+128) { - log_warn(LD_PROTOCOL, "Bad length %u for version 2 INTRODUCE2 cell.", - (int)len); + klen = ntohs(get_uint16(buf+v3_shift+7+DIGEST_LEN)); + if ((int)len != v3_shift+7+DIGEST_LEN+2+klen+20+128) { + log_warn(LD_PROTOCOL, "Bad length %u for version %d INTRODUCE2 cell.", + (int)len, *buf); reason = END_CIRC_REASON_TORPROTOCOL; goto err; } - extend_info->onion_key = crypto_pk_asn1_decode(buf+7+DIGEST_LEN+2, klen); + extend_info->onion_key = + crypto_pk_asn1_decode(buf+v3_shift+7+DIGEST_LEN+2, klen); if (!extend_info->onion_key) { - log_warn(LD_PROTOCOL, - "Error decoding onion key in version 2 INTRODUCE2 cell."); + log_warn(LD_PROTOCOL, "Error decoding onion key in version %d " + "INTRODUCE2 cell.", *buf); reason = END_CIRC_REASON_TORPROTOCOL; goto err; } - ptr = buf+7+DIGEST_LEN+2+klen; - len -= 7+DIGEST_LEN+2+klen; + ptr = buf+v3_shift+7+DIGEST_LEN+2+klen; + len -= v3_shift+7+DIGEST_LEN+2+klen; } else { char *rp_nickname; size_t nickname_field_len; @@ -681,7 +1031,7 @@ router = router_get_by_nickname(rp_nickname, 0); if (!router) { log_info(LD_REND, "Couldn't find router %s named in introduce2 cell.", - escaped_safe_str(rp_nickname)); + escaped_safe_str_client(rp_nickname)); /* XXXX Add a no-such-router reason? */ reason = END_CIRC_REASON_TORPROTOCOL; goto err; @@ -699,6 +1049,55 @@ r_cookie = ptr; base16_encode(hexcookie,9,r_cookie,4); + /* Determine hash of Diffie-Hellman, part 1 to detect replays. */ + digest = crypto_new_digest_env(); + crypto_digest_add_bytes(digest, ptr+REND_COOKIE_LEN, DH_KEY_LEN); + crypto_digest_get_digest(digest, diffie_hellman_hash, DIGEST_LEN); + crypto_free_digest_env(digest); + + /* Check whether there is a past request with the same Diffie-Hellman, + * part 1. */ + if (!service->accepted_intros) + service->accepted_intros = digestmap_new(); + + access_time = digestmap_get(service->accepted_intros, diffie_hellman_hash); + if (access_time != NULL) { + log_warn(LD_REND, "Possible replay detected! We received an " + "INTRODUCE2 cell with same first part of " + "Diffie-Hellman handshake %d seconds ago. Dropping " + "cell.", + (int) (now - *access_time)); + goto err; + } + + /* Add request to access history, including time and hash of Diffie-Hellman, + * part 1, and possibly remove requests from the history that are older than + * one hour. */ + access_time = tor_malloc(sizeof(time_t)); + *access_time = now; + digestmap_set(service->accepted_intros, diffie_hellman_hash, access_time); + if (service->last_cleaned_accepted_intros + REND_REPLAY_TIME_INTERVAL < now) + clean_accepted_intros(service, now); + + /* If the service performs client authorization, check included auth data. */ + if (service->clients) { + if (auth_len > 0) { + if (rend_check_authorization(service, auth_data)) { + log_info(LD_REND, "Authorization data in INTRODUCE2 cell are valid."); + } else { + log_info(LD_REND, "The authorization data that are contained in " + "the INTRODUCE2 cell are invalid. Dropping cell."); + reason = END_CIRC_REASON_CONNECTFAILED; + goto err; + } + } else { + log_info(LD_REND, "INTRODUCE2 cell does not contain authentication " + "data, but we require client authorization. Dropping cell."); + reason = END_CIRC_REASON_CONNECTFAILED; + goto err; + } + } + /* Try DH handshake... */ dh = crypto_dh_new(); if (!dh || crypto_dh_generate_public(dh)<0) { @@ -707,7 +1106,8 @@ reason = END_CIRC_REASON_INTERNAL; goto err; } - if (crypto_dh_compute_secret(dh, ptr+REND_COOKIE_LEN, DH_KEY_LEN, keys, + if (crypto_dh_compute_secret(LOG_PROTOCOL_WARN, dh, ptr+REND_COOKIE_LEN, + DH_KEY_LEN, keys, DIGEST_LEN+CPATH_KEY_MATERIAL_LEN)<0) { log_warn(LD_BUG, "Internal error: couldn't complete DH handshake"); reason = END_CIRC_REASON_INTERNAL; @@ -717,7 +1117,7 @@ circ_needs_uptime = rend_service_requires_uptime(service); /* help predict this next time */ - rep_hist_note_used_internal(time(NULL), circ_needs_uptime, 1); + rep_hist_note_used_internal(now, circ_needs_uptime, 1); /* Launch a circuit to alice's chosen rendezvous point. */ @@ -733,26 +1133,29 @@ if (!launched) { /* give up */ log_warn(LD_REND, "Giving up launching first hop of circuit to rendezvous " "point %s for service %s.", - escaped_safe_str(extend_info->nickname), serviceid); + escaped_safe_str_client(extend_info->nickname), + serviceid); reason = END_CIRC_REASON_CONNECTFAILED; goto err; } log_info(LD_REND, "Accepted intro; launching circuit to %s " "(cookie %s) for service %s.", - escaped_safe_str(extend_info->nickname), hexcookie, serviceid); + escaped_safe_str_client(extend_info->nickname), + hexcookie, serviceid); tor_assert(launched->build_state); /* Fill in the circuit's state. */ - memcpy(launched->rend_pk_digest, circuit->rend_pk_digest, + launched->rend_data = tor_malloc_zero(sizeof(rend_data_t)); + memcpy(launched->rend_data->rend_pk_digest, + circuit->rend_data->rend_pk_digest, DIGEST_LEN); - memcpy(launched->rend_cookie, r_cookie, REND_COOKIE_LEN); - strlcpy(launched->rend_query, service->service_id, - sizeof(launched->rend_query)); - launched->rend_desc_version = service->descriptor_version; + memcpy(launched->rend_data->rend_cookie, r_cookie, REND_COOKIE_LEN); + strlcpy(launched->rend_data->onion_address, service->service_id, + sizeof(launched->rend_data->onion_address)); launched->build_state->pending_final_cpath = cpath = tor_malloc_zero(sizeof(crypt_path_t)); cpath->magic = CRYPT_PATH_MAGIC; - launched->build_state->expiry_time = time(NULL) + MAX_REND_TIMEOUT; + launched->build_state->expiry_time = now + MAX_REND_TIMEOUT; cpath->dh_handshake_state = dh; dh = NULL; @@ -820,13 +1223,7 @@ newstate->pending_final_cpath = oldstate->pending_final_cpath; oldstate->pending_final_cpath = NULL; - memcpy(newcirc->rend_query, oldcirc->rend_query, - REND_SERVICE_ID_LEN_BASE32+1); - memcpy(newcirc->rend_pk_digest, oldcirc->rend_pk_digest, - DIGEST_LEN); - memcpy(newcirc->rend_cookie, oldcirc->rend_cookie, - REND_COOKIE_LEN); - newcirc->rend_desc_version = oldcirc->rend_desc_version; + newcirc->rend_data = rend_data_dup(oldcirc->rend_data); } /** Launch a circuit to serve as an introduction point for the service @@ -840,7 +1237,7 @@ log_info(LD_REND, "Launching circuit to introduction point %s for service %s", - escaped_safe_str(intro->extend_info->nickname), + escaped_safe_str_client(intro->extend_info->nickname), service->service_id); rep_hist_note_used_internal(time(NULL), 1, 0); @@ -853,7 +1250,7 @@ if (!launched) { log_info(LD_REND, "Can't launch circuit to establish introduction at %s.", - escaped_safe_str(intro->extend_info->nickname)); + escaped_safe_str_client(intro->extend_info->nickname)); return -1; } @@ -872,17 +1269,37 @@ intro->extend_info = extend_info_dup(launched->build_state->chosen_exit); } - strlcpy(launched->rend_query, service->service_id, - sizeof(launched->rend_query)); - memcpy(launched->rend_pk_digest, service->pk_digest, DIGEST_LEN); - launched->rend_desc_version = service->descriptor_version; - if (service->descriptor_version == 2) - launched->intro_key = crypto_pk_dup_key(intro->intro_key); + launched->rend_data = tor_malloc_zero(sizeof(rend_data_t)); + strlcpy(launched->rend_data->onion_address, service->service_id, + sizeof(launched->rend_data->onion_address)); + memcpy(launched->rend_data->rend_pk_digest, service->pk_digest, DIGEST_LEN); + launched->intro_key = crypto_pk_dup_key(intro->intro_key); if (launched->_base.state == CIRCUIT_STATE_OPEN) rend_service_intro_has_opened(launched); return 0; } +/** Return the number of introduction points that are or have been + * established for the given service address in query. */ +static int +count_established_intro_points(const char *query) +{ + int num_ipos = 0; + circuit_t *circ; + for (circ = _circuit_get_global_list(); circ; circ = circ->next) { + if (!circ->marked_for_close && + circ->state == CIRCUIT_STATE_OPEN && + (circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || + circ->purpose == CIRCUIT_PURPOSE_S_INTRO)) { + origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); + if (oc->rend_data && + !rend_cmp_service_ids(query, oc->rend_data->onion_address)) + num_ipos++; + } + } + return num_ipos; +} + /** Called when we're done building a circuit to an introduction point: * sends a RELAY_ESTABLISH_INTRO cell. */ @@ -900,12 +1317,13 @@ tor_assert(circuit->_base.purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO); tor_assert(circuit->cpath); + tor_assert(circuit->rend_data); base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, - circuit->rend_pk_digest, REND_SERVICE_ID_LEN); + circuit->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN); - service = rend_service_get_by_pk_digest_and_version( - circuit->rend_pk_digest, circuit->rend_desc_version); + service = rend_service_get_by_pk_digest( + circuit->rend_data->rend_pk_digest); if (!service) { log_warn(LD_REND, "Unrecognized service ID %s on introduction circuit %d.", serviceid, circuit->_base.n_circ_id); @@ -913,17 +1331,23 @@ goto err; } + /* If we already have enough introduction circuits for this service, + * redefine this one as a general circuit. */ + if (count_established_intro_points(serviceid) > NUM_INTRO_POINTS) { + log_info(LD_CIRC|LD_REND, "We have just finished an introduction " + "circuit, but we already have enough. Redefining purpose to " + "general."); + TO_CIRCUIT(circuit)->purpose = CIRCUIT_PURPOSE_C_GENERAL; + circuit_has_opened(circuit); + return; + } + log_info(LD_REND, "Established circuit %d as introduction point for service %s", circuit->_base.n_circ_id, serviceid); - /* If the introduction point will not be used in an unversioned - * descriptor, use the intro key instead of the service key in - * ESTABLISH_INTRO. */ - if (service->descriptor_version == 0) - intro_key = service->private_key; - else - intro_key = circuit->intro_key; + /* Use the intro key instead of the service key in ESTABLISH_INTRO. */ + intro_key = circuit->intro_key; /* Build the payload for a RELAY_ESTABLISH_INTRO cell. */ r = crypto_pk_asn1_encode(intro_key, buf+2, RELAY_PAYLOAD_SIZE-2); @@ -981,8 +1405,9 @@ "received INTRO_ESTABLISHED cell on non-intro circuit."); goto err; } - service = rend_service_get_by_pk_digest_and_version( - circuit->rend_pk_digest, circuit->rend_desc_version); + tor_assert(circuit->rend_data); + service = rend_service_get_by_pk_digest( + circuit->rend_data->rend_pk_digest); if (!service) { log_warn(LD_REND, "Unknown service on introduction circuit %d.", circuit->_base.n_circ_id); @@ -992,7 +1417,7 @@ circuit->_base.purpose = CIRCUIT_PURPOSE_S_INTRO; base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32 + 1, - circuit->rend_pk_digest, REND_SERVICE_ID_LEN); + circuit->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN); log_info(LD_REND, "Received INTRO_ESTABLISHED cell on circuit %d for service %s", circuit->_base.n_circ_id, serviceid); @@ -1019,20 +1444,21 @@ tor_assert(circuit->_base.purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); tor_assert(circuit->cpath); tor_assert(circuit->build_state); + tor_assert(circuit->rend_data); hop = circuit->build_state->pending_final_cpath; tor_assert(hop); - base16_encode(hexcookie,9,circuit->rend_cookie,4); + base16_encode(hexcookie,9,circuit->rend_data->rend_cookie,4); base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, - circuit->rend_pk_digest, REND_SERVICE_ID_LEN); + circuit->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN); log_info(LD_REND, "Done building circuit %d to rendezvous with " "cookie %s for service %s", circuit->_base.n_circ_id, hexcookie, serviceid); - service = rend_service_get_by_pk_digest_and_version( - circuit->rend_pk_digest, circuit->rend_desc_version); + service = rend_service_get_by_pk_digest( + circuit->rend_data->rend_pk_digest); if (!service) { log_warn(LD_GENERAL, "Internal error: unrecognized service ID on " "introduction circuit."); @@ -1041,7 +1467,7 @@ } /* All we need to do is send a RELAY_RENDEZVOUS1 cell... */ - memcpy(buf, circuit->rend_cookie, REND_COOKIE_LEN); + memcpy(buf, circuit->rend_data->rend_cookie, REND_COOKIE_LEN); if (crypto_dh_get_public(hop->dh_handshake_state, buf+REND_COOKIE_LEN, DH_KEY_LEN)<0) { log_warn(LD_GENERAL,"Couldn't get DH public key."); @@ -1069,7 +1495,7 @@ /* set the windows to default. these are the windows * that bob thinks alice has. */ - hop->package_window = CIRCWINDOW_START; + hop->package_window = circuit_initial_package_window(); hop->deliver_window = CIRCWINDOW_START; onion_append_to_cpath(&circuit->cpath, hop); @@ -1088,13 +1514,12 @@ */ /** Return the (possibly non-open) introduction circuit ending at - * intro for the service whose public key is pk_digest and - * which publishes descriptor of version desc_version. Return - * NULL if no such service is found. + * intro for the service whose public key is pk_digest. + * (desc_version is ignored). Return NULL if no such service is + * found. */ static origin_circuit_t * -find_intro_circuit(rend_intro_point_t *intro, const char *pk_digest, - int desc_version) +find_intro_circuit(rend_intro_point_t *intro, const char *pk_digest) { origin_circuit_t *circ = NULL; @@ -1103,7 +1528,7 @@ CIRCUIT_PURPOSE_S_INTRO))) { if (!memcmp(circ->build_state->chosen_exit->identity_digest, intro->extend_info->identity_digest, DIGEST_LEN) && - circ->rend_desc_version == desc_version) { + circ->rend_data) { return circ; } } @@ -1113,7 +1538,7 @@ CIRCUIT_PURPOSE_S_ESTABLISH_INTRO))) { if (!memcmp(circ->build_state->chosen_exit->identity_digest, intro->extend_info->identity_digest, DIGEST_LEN) && - circ->rend_desc_version == desc_version) { + circ->rend_data) { return circ; } } @@ -1146,6 +1571,7 @@ } for (j = 0; j < smartlist_len(responsible_dirs); j++) { char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + char *hs_dir_ip; hs_dir = smartlist_get(responsible_dirs, j); if (smartlist_digest_isin(renddesc->successful_uploads, hs_dir->identity_digest)) @@ -1154,7 +1580,7 @@ if (!router_get_by_digest(hs_dir->identity_digest)) { log_info(LD_REND, "Not sending publish request for v2 descriptor to " "hidden service directory '%s'; we don't have its " - "router descriptor. Queueing for later upload.", + "router descriptor. Queuing for later upload.", hs_dir->nickname); failed_upload = -1; continue; @@ -1167,15 +1593,18 @@ strlen(desc->desc_str), 0); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc->desc_id, DIGEST_LEN); + hs_dir_ip = tor_dup_ip(hs_dir->addr); log_info(LD_REND, "Sending publish request for v2 descriptor for " "service '%s' with descriptor ID '%s' with validity " "of %d seconds to hidden service directory '%s' on " - "port %d.", - safe_str(service_id), - safe_str(desc_id_base32), + "%s:%d.", + safe_str_client(service_id), + safe_str_client(desc_id_base32), seconds_valid, hs_dir->nickname, - hs_dir->dir_port); + hs_dir_ip, + hs_dir->or_port); + tor_free(hs_dir_ip); /* Remember successful upload to this router for next time. */ if (!smartlist_digest_isin(successful_uploads, hs_dir->identity_digest)) smartlist_add(successful_uploads, hs_dir->identity_digest); @@ -1186,6 +1615,7 @@ if (renddesc->successful_uploads) { SMARTLIST_FOREACH(renddesc->successful_uploads, char *, c, tor_free(c);); smartlist_free(renddesc->successful_uploads); + renddesc->successful_uploads = NULL; } renddesc->all_uploads_performed = 1; } else { @@ -1193,10 +1623,9 @@ * descriptor to them again. */ if (!renddesc->successful_uploads) renddesc->successful_uploads = smartlist_create(); - SMARTLIST_FOREACH(successful_uploads, char *, c, { + SMARTLIST_FOREACH(successful_uploads, const char *, c, { if (!smartlist_digest_isin(renddesc->successful_uploads, c)) { - char *hsdir_id = tor_malloc_zero(DIGEST_LEN); - memcpy(hsdir_id, c, DIGEST_LEN); + char *hsdir_id = tor_memdup(c, DIGEST_LEN); smartlist_add(renddesc->successful_uploads, hsdir_id); } }); @@ -1205,9 +1634,8 @@ smartlist_free(successful_uploads); } -/** Encode and sign up-to-date v0 and/or v2 service descriptors for - * service, and upload it/them to all the dirservers/to the - * responsible hidden service directories. +/** Encode and sign an up-to-date service descriptor for service, + * and upload it/them to the responsible hidden service directories. */ static void upload_service_descriptor(rend_service_t *service) @@ -1219,85 +1647,92 @@ rendpostperiod = get_options()->RendPostPeriod; - /* Upload unversioned (v0) descriptor? */ - if (service->descriptor_version == 0 && - get_options()->PublishHidServDescriptors) { - char *desc; - size_t desc_len; - /* Encode the descriptor. */ - if (rend_encode_service_descriptor(service->desc, - service->private_key, - &desc, &desc_len)<0) { - log_warn(LD_BUG, "Internal error: couldn't encode service descriptor; " - "not uploading."); - return; - } - - /* Post it to the dirservers */ - rend_get_service_id(service->desc->pk, serviceid); - log_info(LD_REND, "Sending publish request for hidden service %s", - serviceid); - directory_post_to_dirservers(DIR_PURPOSE_UPLOAD_RENDDESC, - ROUTER_PURPOSE_GENERAL, - HIDSERV_AUTHORITY, desc, desc_len, 0); - tor_free(desc); - service->next_upload_time = now + rendpostperiod; - uploaded = 1; - } - - /* Upload v2 descriptor? */ - if (service->descriptor_version == 2 && - get_options()->PublishHidServDescriptors) { + /* Upload descriptor? */ + if (get_options()->PublishHidServDescriptors) { networkstatus_t *c = networkstatus_get_latest_consensus(); if (c && smartlist_len(c->routerstatus_list) > 0) { - int seconds_valid; + int seconds_valid, i, j, num_descs; smartlist_t *descs = smartlist_create(); - int i; - /* Encode the current descriptor. */ - seconds_valid = rend_encode_v2_descriptors(descs, service->desc, now, - NULL, 0); - if (seconds_valid < 0) { - log_warn(LD_BUG, "Internal error: couldn't encode service descriptor; " - "not uploading."); - smartlist_free(descs); - return; - } - /* Post the current descriptors to the hidden service directories. */ - rend_get_service_id(service->desc->pk, serviceid); - log_info(LD_REND, "Sending publish request for hidden service %s", - serviceid); - directory_post_to_hs_dir(service->desc, descs, serviceid, - seconds_valid); - /* Free memory for descriptors. */ - for (i = 0; i < smartlist_len(descs); i++) - rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i)); - smartlist_clear(descs); - /* Update next upload time. */ - if (seconds_valid - REND_TIME_PERIOD_OVERLAPPING_V2_DESCS - > rendpostperiod) - service->next_upload_time = now + rendpostperiod; - else if (seconds_valid < REND_TIME_PERIOD_OVERLAPPING_V2_DESCS) - service->next_upload_time = now + seconds_valid + 1; - else - service->next_upload_time = now + seconds_valid - - REND_TIME_PERIOD_OVERLAPPING_V2_DESCS + 1; - /* Post also the next descriptors, if necessary. */ - if (seconds_valid < REND_TIME_PERIOD_OVERLAPPING_V2_DESCS) { + smartlist_t *client_cookies = smartlist_create(); + /* Either upload a single descriptor (including replicas) or one + * descriptor for each authorized client in case of authorization + * type 'stealth'. */ + num_descs = service->auth_type == REND_STEALTH_AUTH ? + smartlist_len(service->clients) : 1; + for (j = 0; j < num_descs; j++) { + crypto_pk_env_t *client_key = NULL; + rend_authorized_client_t *client = NULL; + smartlist_clear(client_cookies); + switch (service->auth_type) { + case REND_NO_AUTH: + /* Do nothing here. */ + break; + case REND_BASIC_AUTH: + SMARTLIST_FOREACH(service->clients, rend_authorized_client_t *, + cl, smartlist_add(client_cookies, cl->descriptor_cookie)); + break; + case REND_STEALTH_AUTH: + client = smartlist_get(service->clients, j); + client_key = client->client_key; + smartlist_add(client_cookies, client->descriptor_cookie); + break; + } + /* Encode the current descriptor. */ seconds_valid = rend_encode_v2_descriptors(descs, service->desc, - now, NULL, 1); + now, 0, + service->auth_type, + client_key, + client_cookies); if (seconds_valid < 0) { log_warn(LD_BUG, "Internal error: couldn't encode service " "descriptor; not uploading."); smartlist_free(descs); + smartlist_free(client_cookies); return; } + /* Post the current descriptors to the hidden service directories. */ + rend_get_service_id(service->desc->pk, serviceid); + log_info(LD_REND, "Sending publish request for hidden service %s", + serviceid); directory_post_to_hs_dir(service->desc, descs, serviceid, seconds_valid); /* Free memory for descriptors. */ for (i = 0; i < smartlist_len(descs); i++) rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i)); + smartlist_clear(descs); + /* Update next upload time. */ + if (seconds_valid - REND_TIME_PERIOD_OVERLAPPING_V2_DESCS + > rendpostperiod) + service->next_upload_time = now + rendpostperiod; + else if (seconds_valid < REND_TIME_PERIOD_OVERLAPPING_V2_DESCS) + service->next_upload_time = now + seconds_valid + 1; + else + service->next_upload_time = now + seconds_valid - + REND_TIME_PERIOD_OVERLAPPING_V2_DESCS + 1; + /* Post also the next descriptors, if necessary. */ + if (seconds_valid < REND_TIME_PERIOD_OVERLAPPING_V2_DESCS) { + seconds_valid = rend_encode_v2_descriptors(descs, service->desc, + now, 1, + service->auth_type, + client_key, + client_cookies); + if (seconds_valid < 0) { + log_warn(LD_BUG, "Internal error: couldn't encode service " + "descriptor; not uploading."); + smartlist_free(descs); + smartlist_free(client_cookies); + return; + } + directory_post_to_hs_dir(service->desc, descs, serviceid, + seconds_valid); + /* Free memory for descriptors. */ + for (i = 0; i < smartlist_len(descs); i++) + rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i)); + smartlist_clear(descs); + } } smartlist_free(descs); + smartlist_free(client_cookies); uploaded = 1; log_info(LD_REND, "Successfully uploaded v2 rend descriptors!"); } @@ -1323,11 +1758,11 @@ rend_service_t *service; rend_intro_point_t *intro; int changed, prev_intro_nodes; - smartlist_t *intro_routers, *exclude_routers; + smartlist_t *intro_routers; time_t now; + or_options_t *options = get_options(); intro_routers = smartlist_create(); - exclude_routers = smartlist_create(); now = time(NULL); for (i=0; i < smartlist_len(rend_service_list); ++i) { @@ -1352,16 +1787,27 @@ for (j=0; j < smartlist_len(service->intro_nodes); ++j) { intro = smartlist_get(service->intro_nodes, j); router = router_get_by_digest(intro->extend_info->identity_digest); - if (!router || !find_intro_circuit(intro, service->pk_digest, - service->descriptor_version)) { + if (!router || !find_intro_circuit(intro, service->pk_digest)) { log_info(LD_REND,"Giving up on %s as intro point for %s.", intro->extend_info->nickname, service->service_id); + if (service->desc) { + SMARTLIST_FOREACH(service->desc->intro_nodes, rend_intro_point_t *, + dintro, { + if (!memcmp(dintro->extend_info->identity_digest, + intro->extend_info->identity_digest, DIGEST_LEN)) { + log_info(LD_REND, "The intro point we are giving up on was " + "included in the last published descriptor. " + "Marking current descriptor as dirty."); + service->desc_is_dirty = now; + } + }); + } rend_intro_point_free(intro); smartlist_del(service->intro_nodes,j--); changed = 1; - service->desc_is_dirty = now; } - smartlist_add(intro_routers, router); + if (router) + smartlist_add(intro_routers, router); } /* We have enough intro points, and the intro points we thought we had were @@ -1377,14 +1823,24 @@ /* Remember how many introduction circuits we started with. */ prev_intro_nodes = smartlist_len(service->intro_nodes); - - smartlist_add_all(exclude_routers, intro_routers); - /* The directory is now here. Pick three ORs as intro points. */ - for (j=prev_intro_nodes; j < NUM_INTRO_POINTS; ++j) { - router = router_choose_random_node(service->intro_prefer_nodes, - service->intro_exclude_nodes, exclude_routers, 1, 0, 0, - get_options()->_AllowInvalid & ALLOW_INVALID_INTRODUCTION, - 0, 0); + /* We have enough directory information to start establishing our + * intro points. We want to end up with three intro points, but if + * we're just starting, we launch five and pick the first three that + * complete. + * + * The ones after the first three will be converted to 'general' + * internal circuits in rend_service_intro_has_opened(), and then + * we'll drop them from the list of intro points next time we + * go through the above "find out which introduction points we have + * in progress" loop. */ +#define NUM_INTRO_POINTS_INIT (NUM_INTRO_POINTS + 2) + for (j=prev_intro_nodes; j < (prev_intro_nodes == 0 ? + NUM_INTRO_POINTS_INIT : NUM_INTRO_POINTS); ++j) { + router_crn_flags_t flags = CRN_NEED_UPTIME; + if (get_options()->_AllowInvalid & ALLOW_INVALID_INTRODUCTION) + flags |= CRN_ALLOW_INVALID; + router = router_choose_random_node(intro_routers, + options->ExcludeNodes, flags); if (!router) { log_warn(LD_REND, "Could only establish %d introduction points for %s.", @@ -1393,21 +1849,15 @@ } changed = 1; smartlist_add(intro_routers, router); - smartlist_add(exclude_routers, router); intro = tor_malloc_zero(sizeof(rend_intro_point_t)); intro->extend_info = extend_info_from_router(router); - if (service->descriptor_version == 2) { - intro->intro_key = crypto_new_pk_env(); - tor_assert(!crypto_pk_generate_key(intro->intro_key)); - } + intro->intro_key = crypto_new_pk_env(); + tor_assert(!crypto_pk_generate_key(intro->intro_key)); smartlist_add(service->intro_nodes, intro); log_info(LD_REND, "Picked router %s as an intro point for %s.", router->nickname, service->service_id); } - /* Reset exclude_routers, for the next time around the loop. */ - smartlist_clear(exclude_routers); - /* If there's no need to launch new circuits, stop here. */ if (!changed) continue; @@ -1423,7 +1873,6 @@ } } smartlist_free(intro_routers); - smartlist_free(exclude_routers); } /** Regenerate and upload rendezvous service descriptors for all @@ -1447,8 +1896,10 @@ for (i=0; i < smartlist_len(rend_service_list); ++i) { service = smartlist_get(rend_service_list, i); if (!service->next_upload_time) { /* never been uploaded yet */ + /* The fixed lower bound of 30 seconds ensures that the descriptor + * is stable before being published. See comment below. */ service->next_upload_time = - now + crypto_rand_int(2*rendpostperiod); + now + 30 + crypto_rand_int(2*rendpostperiod); } if (service->next_upload_time < now || (service->desc_is_dirty && @@ -1494,8 +1945,7 @@ for (i=0; i < smartlist_len(rend_service_list); ++i) { service = smartlist_get(rend_service_list, i); - if (service->descriptor_version && service->desc && - !service->desc->all_uploads_performed) { + if (service->desc && !service->desc->all_uploads_performed) { /* If we failed in uploading a descriptor last time, try again *without* * updating the descriptor's contents. */ upload_service_descriptor(service); @@ -1521,10 +1971,9 @@ service->directory); for (j=0; j < smartlist_len(service->intro_nodes); ++j) { intro = smartlist_get(service->intro_nodes, j); - safe_name = safe_str(intro->extend_info->nickname); + safe_name = safe_str_client(intro->extend_info->nickname); - circ = find_intro_circuit(intro, service->pk_digest, - service->descriptor_version); + circ = find_intro_circuit(intro, service->pk_digest); if (!circ) { log(severity, LD_GENERAL, " Intro point %d at %s: no circuit", j, safe_name); @@ -1551,11 +2000,12 @@ rend_service_port_config_t *chosen_port; tor_assert(circ->_base.purpose == CIRCUIT_PURPOSE_S_REND_JOINED); + tor_assert(circ->rend_data); log_debug(LD_REND,"beginning to hunt for addr/port"); base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, - circ->rend_pk_digest, REND_SERVICE_ID_LEN); - service = rend_service_get_by_pk_digest_and_version(circ->rend_pk_digest, - circ->rend_desc_version); + circ->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN); + service = rend_service_get_by_pk_digest( + circ->rend_data->rend_pk_digest); if (!service) { log_warn(LD_REND, "Couldn't find any service associated with pk %s on " "rendezvous circuit %d; closing.", @@ -1572,7 +2022,7 @@ chosen_port = smartlist_choose(matching_ports); smartlist_free(matching_ports); if (chosen_port) { - conn->_base.addr = chosen_port->real_addr; + tor_addr_copy(&conn->_base.addr, &chosen_port->real_addr); conn->_base.port = chosen_port->real_port; return 0; } diff -Nru tor-0.2.0.34/src/or/rendservice.h tor-0.2.2.16-alpha/src/or/rendservice.h --- tor-0.2.0.34/src/or/rendservice.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/rendservice.h 2010-08-18 23:04:46.000000000 +0000 @@ -0,0 +1,37 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file rendservice.h + * \brief Header file for rendservice.c. + **/ + +#ifndef _TOR_RENDSERVICE_H +#define _TOR_RENDSERVICE_H + +int num_rend_services(void); +int rend_config_services(or_options_t *options, int validate_only); +int rend_service_load_keys(void); +void rend_services_introduce(void); +void rend_consider_services_upload(time_t now); +void rend_hsdir_routers_changed(void); +void rend_consider_descriptor_republication(void); + +void rend_service_intro_has_opened(origin_circuit_t *circuit); +int rend_service_intro_established(origin_circuit_t *circuit, + const char *request, + size_t request_len); +void rend_service_rendezvous_has_opened(origin_circuit_t *circuit); +int rend_service_introduce(origin_circuit_t *circuit, const char *request, + size_t request_len); +void rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc); +int rend_service_set_connection_addr_port(edge_connection_t *conn, + origin_circuit_t *circ); +void rend_service_dump_stats(int severity); +void rend_service_free_all(void); + +#endif + diff -Nru tor-0.2.0.34/src/or/rephist.c tor-0.2.2.16-alpha/src/or/rephist.c --- tor-0.2.0.34/src/or/rephist.c 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/rephist.c 2010-08-18 23:04:46.000000000 +0000 @@ -1,23 +1,26 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: rephist.c 13662 2008-02-21 21:15:31Z nickm $ */ -const char rephist_c_id[] = - "$Id: rephist.c 13662 2008-02-21 21:15:31Z nickm $"; /** * \file rephist.c * \brief Basic history and "reputation" functionality to remember * which servers have worked in the past, how much bandwidth we've - * been using, which ports we tend to want, and so on. + * been using, which ports we tend to want, and so on; further, + * exit port statistics and cell statistics. **/ #include "or.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" #include "ht.h" static void bw_arrays_init(void); static void predicted_ports_init(void); -static void hs_usage_init(void); /** Total number of bytes currently allocated in fields used by rephist.c. */ uint64_t rephist_total_alloc=0; @@ -27,7 +30,7 @@ /** If the total weighted run count of all runs for a router ever falls * below this amount, the router can be treated as having 0 MTBF. */ #define STABILITY_EPSILON 0.0001 -/** Value by which to discount all old intervals for MTBF purposses. This +/** Value by which to discount all old intervals for MTBF purposes. This * is compounded every STABILITY_INTERVAL. */ #define STABILITY_ALPHA 0.95 /** Interval at which to discount all old intervals for MTBF purposes. */ @@ -188,7 +191,6 @@ history_map = digestmap_new(); bw_arrays_init(); predicted_ports_init(); - hs_usage_init(); } /** Helper: note that we are no longer connected to the router with history @@ -284,21 +286,43 @@ hist->changed = when; } -/** We have just decided that this router is reachable, meaning - * we will give it a "Running" flag for the next while. */ +/** We have just decided that this router with identity digest id is + * reachable, meaning we will give it a "Running" flag for the next while. */ void rep_hist_note_router_reachable(const char *id, time_t when) { or_history_t *hist = get_or_history(id); + int was_in_run = 1; + char tbuf[ISO_TIME_LEN+1]; + + tor_assert(hist); + if (!started_tracking_stability) started_tracking_stability = time(NULL); - if (hist && !hist->start_of_run) { + if (!hist->start_of_run) { hist->start_of_run = when; + was_in_run = 0; } - if (hist && hist->start_of_downtime) { - long down_length = when - hist->start_of_downtime; + if (hist->start_of_downtime) { + long down_length; + + format_local_iso_time(tbuf, hist->start_of_downtime); + log_info(LD_HIST, "Router %s is now Running; it had been down since %s.", + hex_str(id, DIGEST_LEN), tbuf); + if (was_in_run) + log_info(LD_HIST, " (Paradoxically, it was already Running too.)"); + + down_length = when - hist->start_of_downtime; hist->total_weighted_time += down_length; hist->start_of_downtime = 0; + } else { + format_local_iso_time(tbuf, hist->start_of_run); + if (was_in_run) + log_debug(LD_HIST, "Router %s is still Running; it has been Running " + "since %s", hex_str(id, DIGEST_LEN), tbuf); + else + log_info(LD_HIST,"Router %s is now Running; it was previously untracked", + hex_str(id, DIGEST_LEN)); } } @@ -308,21 +332,43 @@ rep_hist_note_router_unreachable(const char *id, time_t when) { or_history_t *hist = get_or_history(id); + char tbuf[ISO_TIME_LEN+1]; + int was_running = 0; if (!started_tracking_stability) started_tracking_stability = time(NULL); - if (hist && hist->start_of_run) { + + tor_assert(hist); + if (hist->start_of_run) { /*XXXX We could treat failed connections differently from failed - * conect attempts. */ + * connect attempts. */ long run_length = when - hist->start_of_run; + format_local_iso_time(tbuf, hist->start_of_run); + hist->weighted_run_length += run_length; hist->total_run_weights += 1.0; hist->start_of_run = 0; - hist->weighted_uptime += run_length; hist->total_weighted_time += run_length; + + was_running = 1; + log_info(LD_HIST, "Router %s is now non-Running: it had previously been " + "Running since %s. Its total weighted uptime is %lu/%lu.", + hex_str(id, DIGEST_LEN), tbuf, hist->weighted_uptime, + hist->total_weighted_time); } - if (hist && !hist->start_of_downtime) { + if (!hist->start_of_downtime) { hist->start_of_downtime = when; + + if (!was_running) + log_info(LD_HIST, "Router %s is now non-Running; it was previously " + "untracked.", hex_str(id, DIGEST_LEN)); + } else { + if (!was_running) { + format_local_iso_time(tbuf, hist->start_of_downtime); + + log_info(LD_HIST, "Router %s is still non-Running; it has been " + "non-Running since %s.", hex_str(id, DIGEST_LEN), tbuf); + } } } @@ -350,6 +396,9 @@ alpha *= STABILITY_ALPHA; } + log_info(LD_HIST, "Discounting all old stability info by a factor of %lf", + alpha); + /* Multiply every w_r_l, t_r_w pair by alpha. */ for (orhist_it = digestmap_iter_init(history_map); !digestmap_iter_done(orhist_it); @@ -419,6 +468,14 @@ } else if (hist->start_of_downtime) { total += (when - hist->start_of_downtime); } + + if (!total) { + /* Avoid calling anybody's uptime infinity (which should be impossible if + * the code is working), or NaN (which can happen for any router we haven't + * observed up or down yet). */ + return 0.0; + } + return ((double) up) / total; } @@ -449,7 +506,7 @@ /** Return a number representing how long we've known about the router whose * digest is id. Return 0 if the router is unknown. * - * Be careful: this measure incresases monotonically as we know the router for + * Be careful: this measure increases monotonically as we know the router for * longer and longer, but it doesn't increase linearly. */ long @@ -526,7 +583,7 @@ rep_history_clean(now - get_options()->RephistTrackTime); - log(severity, LD_GENERAL, "--------------- Dumping history information:"); + log(severity, LD_HIST, "--------------- Dumping history information:"); for (orhist_it = digestmap_iter_init(history_map); !digestmap_iter_done(orhist_it); @@ -551,7 +608,7 @@ } else { uptime=1.0; } - log(severity, LD_GENERAL, + log(severity, LD_HIST, "OR %s [%s]: %ld/%ld good connections; uptime %ld/%ld sec (%.2f%%); " "wmtbf %lu:%02lu:%02lu", name1, hexdigest1, @@ -582,7 +639,7 @@ else len += ret; } - log(severity, LD_GENERAL, "%s", buffer); + log(severity, LD_HIST, "%s", buffer); } } } @@ -631,9 +688,13 @@ } } -/** Write MTBF data to disk. Returns 0 on success, negative on failure. */ +/** Write MTBF data to disk. Return 0 on success, negative on failure. + * + * If missing_means_down, then if we're about to write an entry + * that is still considered up but isn't in our routerlist, consider it + * to be down. */ int -rep_hist_record_mtbf_data(void) +rep_hist_record_mtbf_data(time_t now, int missing_means_down) { char time_buf[ISO_TIME_LEN+1]; @@ -681,7 +742,7 @@ PUT("data\n"); - /* XXX021 Nick: now bridge auths record this for all routers too. + /* XXX Nick: now bridge auths record this for all routers too. * Should we make them record it only for bridge routers? -RD * Not for 0.2.0. -NM */ for (orhist_it = digestmap_iter_init(history_map); @@ -693,6 +754,18 @@ hist = (or_history_t*) or_history_p; base16_encode(dbuf, sizeof(dbuf), digest, DIGEST_LEN); + + if (missing_means_down && hist->start_of_run && + !router_get_by_digest(digest)) { + /* We think this relay is running, but it's not listed in our + * routerlist. Somehow it fell out without telling us it went + * down. Complain and also correct it. */ + log_info(LD_HIST, + "Relay '%s' is listed as up in rephist, but it's not in " + "our routerlist. Correcting.", dbuf); + rep_hist_note_router_unreachable(digest, now); + } + PRINTF((f, "R %s\n", dbuf)); if (hist->start_of_run > 0) { format_iso_time(time_buf, hist->start_of_run); @@ -722,6 +795,124 @@ return -1; } +/** Format the current tracked status of the router in hist at time + * now for analysis; return it in a newly allocated string. */ +static char * +rep_hist_format_router_status(or_history_t *hist, time_t now) +{ + char sor_buf[ISO_TIME_LEN+1]; + char sod_buf[ISO_TIME_LEN+1]; + double wfu; + double mtbf; + int up = 0, down = 0; + char *cp = NULL; + + if (hist->start_of_run) { + format_iso_time(sor_buf, hist->start_of_run); + up = 1; + } + if (hist->start_of_downtime) { + format_iso_time(sod_buf, hist->start_of_downtime); + down = 1; + } + + wfu = get_weighted_fractional_uptime(hist, now); + mtbf = get_stability(hist, now); + tor_asprintf(&cp, + "%s%s%s" + "%s%s%s" + "wfu %0.3lf\n" + " weighted-time %lu\n" + " weighted-uptime %lu\n" + "mtbf %0.1lf\n" + " weighted-run-length %lu\n" + " total-run-weights %lf\n", + up?"uptime-started ":"", up?sor_buf:"", up?" UTC\n":"", + down?"downtime-started ":"", down?sod_buf:"", down?" UTC\n":"", + wfu, + hist->total_weighted_time, + hist->weighted_uptime, + mtbf, + hist->weighted_run_length, + hist->total_run_weights + ); + return cp; +} + +/** The last stability analysis document that we created, or NULL if we never + * have created one. */ +static char *last_stability_doc = NULL; +/** The last time we created a stability analysis document, or 0 if we never + * have created one. */ +static time_t built_last_stability_doc_at = 0; +/** Shortest allowable time between building two stability documents. */ +#define MAX_STABILITY_DOC_BUILD_RATE (3*60) + +/** Return a pointer to a NUL-terminated document describing our view of the + * stability of the routers we've been tracking. Return NULL on failure. */ +const char * +rep_hist_get_router_stability_doc(time_t now) +{ + char *result; + smartlist_t *chunks; + if (built_last_stability_doc_at + MAX_STABILITY_DOC_BUILD_RATE > now) + return last_stability_doc; + + if (!history_map) + return NULL; + + tor_free(last_stability_doc); + chunks = smartlist_create(); + + if (rep_hist_have_measured_enough_stability()) { + smartlist_add(chunks, tor_strdup("we-have-enough-measurements\n")); + } else { + smartlist_add(chunks, tor_strdup("we-do-not-have-enough-measurements\n")); + } + + DIGESTMAP_FOREACH(history_map, id, or_history_t *, hist) { + routerinfo_t *ri; + char dbuf[BASE64_DIGEST_LEN+1]; + char header_buf[512]; + char *info; + digest_to_base64(dbuf, id); + ri = router_get_by_digest(id); + if (ri) { + char *ip = tor_dup_ip(ri->addr); + char tbuf[ISO_TIME_LEN+1]; + format_iso_time(tbuf, ri->cache_info.published_on); + tor_snprintf(header_buf, sizeof(header_buf), + "router %s %s %s\n" + "published %s\n" + "relevant-flags %s%s%s\n" + "declared-uptime %ld\n", + dbuf, ri->nickname, ip, + tbuf, + ri->is_running ? "Running " : "", + ri->is_valid ? "Valid " : "", + ri->is_hibernating ? "Hibernating " : "", + ri->uptime); + tor_free(ip); + } else { + tor_snprintf(header_buf, sizeof(header_buf), + "router %s {no descriptor}\n", dbuf); + } + smartlist_add(chunks, tor_strdup(header_buf)); + info = rep_hist_format_router_status(hist, now); + if (info) + smartlist_add(chunks, info); + + } DIGESTMAP_FOREACH_END; + + result = smartlist_join_strings(chunks, "", 0, NULL); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_free(chunks); + + last_stability_doc = result; + built_last_stability_doc_at = time(NULL); + return result; +} + /** Helper: return the first j >= i such that !strcmpstart(sl[j], prefix) and * such that no line sl[k] with i <= k < j starts with "R ". Return -1 if no * such line exists. */ @@ -815,7 +1006,7 @@ } } if (format != 1 && format != 2) { - log_warn(LD_GENERAL, + log_warn(LD_HIST, "Unrecognized format in mtbf history file. Skipping."); goto err; } @@ -825,17 +1016,17 @@ break; if (!strcmpstart(line, "last-downrated ")) { if (parse_iso_time(line+strlen("last-downrated "), &last_downrated)<0) - log_warn(LD_GENERAL,"Couldn't parse downrate time in mtbf " + log_warn(LD_HIST,"Couldn't parse downrate time in mtbf " "history file."); } if (!strcmpstart(line, "stored-at ")) { if (parse_iso_time(line+strlen("stored-at "), &stored_at)<0) - log_warn(LD_GENERAL,"Couldn't parse stored time in mtbf " + log_warn(LD_HIST,"Couldn't parse stored time in mtbf " "history file."); } if (!strcmpstart(line, "tracked-since ")) { if (parse_iso_time(line+strlen("tracked-since "), &tracked_since)<0) - log_warn(LD_GENERAL,"Couldn't parse started-tracking time in mtbf " + log_warn(LD_HIST,"Couldn't parse started-tracking time in mtbf " "history file."); } } @@ -845,7 +1036,7 @@ tracked_since = now; if (!stored_at) { - log_warn(LD_GENERAL, "No stored time recorded."); + log_warn(LD_HIST, "No stored time recorded."); goto err; } @@ -878,7 +1069,7 @@ n = sscanf(line, "%40s %ld %lf S=%10s %8s", hexbuf, &wrl, &trw, mtbf_timebuf, mtbf_timebuf+11); if (n != 3 && n != 5) { - log_warn(LD_GENERAL, "Couldn't scan line %s", escaped(line)); + log_warn(LD_HIST, "Couldn't scan line %s", escaped(line)); continue; } have_mtbf = 1; @@ -897,7 +1088,7 @@ if (n == 2 || n == 4) { have_mtbf = 1; } else { - log_warn(LD_GENERAL, "Couldn't scan +MTBF line %s", + log_warn(LD_HIST, "Couldn't scan +MTBF line %s", escaped(mtbfline)); } } @@ -909,7 +1100,7 @@ if (n == 2 || n == 4) { have_wfu = 1; } else { - log_warn(LD_GENERAL, "Couldn't scan +WFU line %s", escaped(wfuline)); + log_warn(LD_HIST, "Couldn't scan +WFU line %s", escaped(wfuline)); } } if (wfu_idx > i) @@ -918,7 +1109,7 @@ i = mtbf_idx; } if (base16_decode(digest, DIGEST_LEN, hexbuf, HEX_DIGEST_LEN) < 0) { - log_warn(LD_GENERAL, "Couldn't hex string %s", escaped(hexbuf)); + log_warn(LD_HIST, "Couldn't hex string %s", escaped(hexbuf)); continue; } hist = get_or_history(digest); @@ -929,7 +1120,7 @@ if (mtbf_timebuf[0]) { mtbf_timebuf[10] = ' '; if (parse_possibly_bad_iso_time(mtbf_timebuf, &start_of_run)<0) - log_warn(LD_GENERAL, "Couldn't parse time %s", + log_warn(LD_HIST, "Couldn't parse time %s", escaped(mtbf_timebuf)); } hist->start_of_run = correct_time(start_of_run, now, stored_at, @@ -944,7 +1135,7 @@ if (wfu_timebuf[0]) { wfu_timebuf[10] = ' '; if (parse_possibly_bad_iso_time(wfu_timebuf, &start_of_downtime)<0) - log_warn(LD_GENERAL, "Couldn't parse time %s", escaped(wfu_timebuf)); + log_warn(LD_HIST, "Couldn't parse time %s", escaped(wfu_timebuf)); } } hist->start_of_downtime = correct_time(start_of_downtime, now, stored_at, @@ -953,7 +1144,7 @@ hist->total_weighted_time = total_wt_time; } if (strcmp(line, ".")) - log_warn(LD_GENERAL, "Truncated MTBF file."); + log_warn(LD_HIST, "Truncated MTBF file."); if (tracked_since < 86400*365) /* Recover from insanely early value. */ tracked_since = latest_possible_start; @@ -1089,15 +1280,25 @@ return b; } +/** Recent history of bandwidth observations for read operations. */ static bw_array_t *read_array = NULL; +/** Recent history of bandwidth observations for write operations. */ static bw_array_t *write_array = NULL; +/** Recent history of bandwidth observations for read operations for the + directory protocol. */ +static bw_array_t *dir_read_array = NULL; +/** Recent history of bandwidth observations for write operations for the + directory protocol. */ +static bw_array_t *dir_write_array = NULL; -/** Set up read_array and write_array. */ +/** Set up [dir-]read_array and [dir-]write_array. */ static void bw_arrays_init(void) { read_array = bw_array_new(); write_array = bw_array_new(); + dir_read_array = bw_array_new(); + dir_write_array = bw_array_new(); } /** We read num_bytes more bytes in second when. @@ -1131,6 +1332,24 @@ add_obs(read_array, when, num_bytes); } +/** We wrote num_bytes more directory bytes in second when. + * (like rep_hist_note_bytes_written() above) + */ +void +rep_hist_note_dir_bytes_written(size_t num_bytes, time_t when) +{ + add_obs(dir_write_array, when, num_bytes); +} + +/** We read num_bytes more directory bytes in second when. + * (like rep_hist_note_bytes_written() above) + */ +void +rep_hist_note_dir_bytes_read(size_t num_bytes, time_t when) +{ + add_obs(dir_read_array, when, num_bytes); +} + /** Helper: Return the largest value in b->maxima. (This is equal to the * most bandwidth used in any NUM_SECS_ROLLING_MEASURE period for the last * NUM_SECS_BW_SUM_IS_VALID seconds.) @@ -1166,9 +1385,9 @@ return (int)(U64_TO_DBL(r)/NUM_SECS_ROLLING_MEASURE); } -/** Print the bandwidth history of b (either read_array or write_array) - * into the buffer pointed to by buf. The format is simply comma - * separated numbers, from oldest to newest. +/** Print the bandwidth history of b (either [dir-]read_array or + * [dir-]write_array) into the buffer pointed to by buf. The format is + * simply comma separated numbers, from oldest to newest. * * It returns the number of bytes written. */ @@ -1226,20 +1445,37 @@ char *buf, *cp; char t[ISO_TIME_LEN+1]; int r; - bw_array_t *b; + bw_array_t *b = NULL; + const char *desc = NULL; size_t len; - /* opt (read|write)-history yyyy-mm-dd HH:MM:SS (n s) n,n,n,n,n... */ - len = (60+20*NUM_TOTALS)*2; + /* opt [dirreq-](read|write)-history yyyy-mm-dd HH:MM:SS (n s) n,n,n... */ + len = (67+21*NUM_TOTALS)*4; buf = tor_malloc_zero(len); cp = buf; - for (r=0;r<2;++r) { - b = r?read_array:write_array; + for (r=0;r<4;++r) { + switch (r) { + case 0: + b = write_array; + desc = "write-history"; + break; + case 1: + b = read_array; + desc = "read-history"; + break; + case 2: + b = dir_write_array; + desc = "dirreq-write-history"; + break; + case 3: + b = dir_read_array; + desc = "dirreq-read-history"; + break; + } tor_assert(b); format_iso_time(t, b->next_period-NUM_SECS_BW_SUM_INTERVAL); tor_snprintf(cp, len-(cp-buf), "%s%s %s (%d s) ", - for_extrainfo ? "" : "opt ", - r ? "read-history" : "write-history", t, + for_extrainfo ? "" : "opt ", desc, t, NUM_SECS_BW_SUM_INTERVAL); cp += strlen(cp); cp += rep_hist_fill_bandwidth_history(cp, len-(cp-buf), b); @@ -1255,20 +1491,41 @@ { int len, r; char *buf, *cp; - smartlist_t **s_values; - time_t *s_begins; - int *s_interval; - bw_array_t *b; + smartlist_t **s_values = NULL; + time_t *s_begins = NULL; + int *s_interval = NULL; + bw_array_t *b = NULL; len = 20*NUM_TOTALS+1; buf = tor_malloc_zero(len); - for (r=0;r<2;++r) { - b = r?read_array:write_array; - s_begins = r?&state->BWHistoryReadEnds :&state->BWHistoryWriteEnds; - s_interval= r?&state->BWHistoryReadInterval:&state->BWHistoryWriteInterval; - s_values = r?&state->BWHistoryReadValues :&state->BWHistoryWriteValues; - + for (r=0;r<4;++r) { + switch (r) { + case 0: + b = write_array; + s_begins = &state->BWHistoryWriteEnds; + s_interval = &state->BWHistoryWriteInterval; + s_values = &state->BWHistoryWriteValues; + break; + case 1: + b = read_array; + s_begins = &state->BWHistoryReadEnds; + s_interval = &state->BWHistoryReadInterval; + s_values = &state->BWHistoryReadValues; + break; + case 2: + b = dir_write_array; + s_begins = &state->BWHistoryDirWriteEnds; + s_interval = &state->BWHistoryDirWriteInterval; + s_values = &state->BWHistoryDirWriteValues; + break; + case 3: + b = dir_read_array; + s_begins = &state->BWHistoryDirReadEnds; + s_interval = &state->BWHistoryDirReadInterval; + s_values = &state->BWHistoryDirReadValues; + break; + } if (*s_values) { SMARTLIST_FOREACH(*s_values, char *, val, tor_free(val)); smartlist_free(*s_values); @@ -1308,23 +1565,45 @@ int rep_hist_load_state(or_state_t *state, char **err) { - time_t s_begins, start; + time_t s_begins = 0, start; time_t now = time(NULL); uint64_t v; int r,i,ok; int all_ok = 1; - int s_interval; - smartlist_t *s_values; - bw_array_t *b; + int s_interval = 0; + smartlist_t *s_values = NULL; + bw_array_t *b = NULL; /* Assert they already have been malloced */ tor_assert(read_array && write_array); - for (r=0;r<2;++r) { - b = r?read_array:write_array; - s_begins = r?state->BWHistoryReadEnds:state->BWHistoryWriteEnds; - s_interval = r?state->BWHistoryReadInterval:state->BWHistoryWriteInterval; - s_values = r?state->BWHistoryReadValues:state->BWHistoryWriteValues; + for (r=0;r<4;++r) { + switch (r) { + case 0: + b = write_array; + s_begins = state->BWHistoryWriteEnds; + s_interval = state->BWHistoryWriteInterval; + s_values = state->BWHistoryWriteValues; + break; + case 1: + b = read_array; + s_begins = state->BWHistoryReadEnds; + s_interval = state->BWHistoryReadInterval; + s_values = state->BWHistoryReadValues; + break; + case 2: + b = dir_write_array; + s_begins = state->BWHistoryDirWriteEnds; + s_interval = state->BWHistoryDirWriteInterval; + s_values = state->BWHistoryDirWriteValues; + break; + case 3: + b = dir_read_array; + s_begins = state->BWHistoryDirReadEnds; + s_interval = state->BWHistoryDirReadInterval; + s_values = state->BWHistoryDirReadValues; + break; + } if (s_values && s_begins >= now - NUM_SECS_BW_SUM_INTERVAL*NUM_TOTALS) { start = s_begins - s_interval*(smartlist_len(s_values)); if (start > now) @@ -1335,7 +1614,7 @@ v = tor_parse_uint64(cp, 10, 0, UINT64_MAX, &ok, NULL); if (!ok) { all_ok=0; - log_notice(LD_GENERAL, "Could not parse '%s' into a number.'", cp); + log_notice(LD_HIST, "Could not parse '%s' into a number.'", cp); } if (start < now) { add_obs(b, start, v); @@ -1380,7 +1659,7 @@ * some circuits open that will exit to this port. */ static void -add_predicted_port(uint16_t port, time_t now) +add_predicted_port(time_t now, uint16_t port) { /* XXXX we could just use uintptr_t here, I think. */ uint16_t *tmp_port = tor_malloc(sizeof(uint16_t)); @@ -1401,7 +1680,7 @@ { predicted_ports_list = smartlist_create(); predicted_ports_times = smartlist_create(); - add_predicted_port(80, time(NULL)); /* add one to kickstart us */ + add_predicted_port(time(NULL), 80); /* add one to kickstart us */ } /** Free whatever memory is needed for predicting which ports will @@ -1423,7 +1702,7 @@ * future and making exit circuits to anticipate that. */ void -rep_hist_note_used_port(uint16_t port, time_t now) +rep_hist_note_used_port(time_t now, uint16_t port) { int i; uint16_t *tmp_port; @@ -1444,7 +1723,7 @@ } } /* it's not there yet; we need to add it */ - add_predicted_port(port, now); + add_predicted_port(now, port); } /** For this long after we've seen a request for a given port, assume that @@ -1484,14 +1763,14 @@ } /** The user asked us to do a resolve. Rather than keeping track of - * timings and such of resolves, we fake it for now by making treating + * timings and such of resolves, we fake it for now by treating * it the same way as a connection to port 80. This way we will continue * to have circuits lying around if the user only uses Tor for resolves. */ void rep_hist_note_used_resolve(time_t now) { - rep_hist_note_used_port(80, now); + rep_hist_note_used_port(now, 80); } /** The last time at which we needed an internal circ. */ @@ -1526,8 +1805,8 @@ return 0; /* too long ago */ if (predicted_internal_uptime_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now) *need_uptime = 1; - if (predicted_internal_capacity_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now) - *need_capacity = 1; + // Always predict that we need capacity. + *need_capacity = 1; return 1; } @@ -1557,17 +1836,31 @@ return 1; } -static uint32_t n_signed_dir_objs = 0; -static uint32_t n_signed_routerdescs = 0; -static uint32_t n_verified_dir_objs = 0; -static uint32_t n_verified_routerdescs = 0; -static uint32_t n_onionskins_encrypted = 0; -static uint32_t n_onionskins_decrypted = 0; -static uint32_t n_tls_client_handshakes = 0; -static uint32_t n_tls_server_handshakes = 0; -static uint32_t n_rend_client_ops = 0; -static uint32_t n_rend_mid_ops = 0; -static uint32_t n_rend_server_ops = 0; +/** Structure to track how many times we've done each public key operation. */ +static struct { + /** How many directory objects have we signed? */ + unsigned long n_signed_dir_objs; + /** How many routerdescs have we signed? */ + unsigned long n_signed_routerdescs; + /** How many directory objects have we verified? */ + unsigned long n_verified_dir_objs; + /** How many routerdescs have we verified */ + unsigned long n_verified_routerdescs; + /** How many onionskins have we encrypted to build circuits? */ + unsigned long n_onionskins_encrypted; + /** How many onionskins have we decrypted to do circuit build requests? */ + unsigned long n_onionskins_decrypted; + /** How many times have we done the TLS handshake as a client? */ + unsigned long n_tls_client_handshakes; + /** How many times have we done the TLS handshake as a server? */ + unsigned long n_tls_server_handshakes; + /** How many PK operations have we done as a hidden service client? */ + unsigned long n_rend_client_ops; + /** How many PK operations have we done as a hidden service midpoint? */ + unsigned long n_rend_mid_ops; + /** How many PK operations have we done as a hidden service provider? */ + unsigned long n_rend_server_ops; +} pk_op_counts = {0,0,0,0,0,0,0,0,0,0,0}; /** Increment the count of the number of times we've done operation. */ void @@ -1576,37 +1869,37 @@ switch (operation) { case SIGN_DIR: - n_signed_dir_objs++; + pk_op_counts.n_signed_dir_objs++; break; case SIGN_RTR: - n_signed_routerdescs++; + pk_op_counts.n_signed_routerdescs++; break; case VERIFY_DIR: - n_verified_dir_objs++; + pk_op_counts.n_verified_dir_objs++; break; case VERIFY_RTR: - n_verified_routerdescs++; + pk_op_counts.n_verified_routerdescs++; break; case ENC_ONIONSKIN: - n_onionskins_encrypted++; + pk_op_counts.n_onionskins_encrypted++; break; case DEC_ONIONSKIN: - n_onionskins_decrypted++; + pk_op_counts.n_onionskins_decrypted++; break; case TLS_HANDSHAKE_C: - n_tls_client_handshakes++; + pk_op_counts.n_tls_client_handshakes++; break; case TLS_HANDSHAKE_S: - n_tls_server_handshakes++; + pk_op_counts.n_tls_server_handshakes++; break; case REND_CLIENT: - n_rend_client_ops++; + pk_op_counts.n_rend_client_ops++; break; case REND_MID: - n_rend_mid_ops++; + pk_op_counts.n_rend_mid_ops++; break; case REND_SERVER: - n_rend_server_ops++; + pk_op_counts.n_rend_server_ops++; break; default: log_warn(LD_BUG, "Unknown pk operation %d", operation); @@ -1617,7 +1910,7 @@ void dump_pk_ops(int severity) { - log(severity, LD_GENERAL, + log(severity, LD_HIST, "PK operations: %lu directory objects signed, " "%lu directory objects verified, " "%lu routerdescs signed, " @@ -1629,560 +1922,472 @@ "%lu rendezvous client operations, " "%lu rendezvous middle operations, " "%lu rendezvous server operations.", - (unsigned long) n_signed_dir_objs, - (unsigned long) n_verified_dir_objs, - (unsigned long) n_signed_routerdescs, - (unsigned long) n_verified_routerdescs, - (unsigned long) n_onionskins_encrypted, - (unsigned long) n_onionskins_decrypted, - (unsigned long) n_tls_client_handshakes, - (unsigned long) n_tls_server_handshakes, - (unsigned long) n_rend_client_ops, - (unsigned long) n_rend_mid_ops, - (unsigned long) n_rend_server_ops); + pk_op_counts.n_signed_dir_objs, + pk_op_counts.n_verified_dir_objs, + pk_op_counts.n_signed_routerdescs, + pk_op_counts.n_verified_routerdescs, + pk_op_counts.n_onionskins_encrypted, + pk_op_counts.n_onionskins_decrypted, + pk_op_counts.n_tls_client_handshakes, + pk_op_counts.n_tls_server_handshakes, + pk_op_counts.n_rend_client_ops, + pk_op_counts.n_rend_mid_ops, + pk_op_counts.n_rend_server_ops); +} + +/*** Exit port statistics ***/ + +/* Some constants */ +/** To what multiple should byte numbers be rounded up? */ +#define EXIT_STATS_ROUND_UP_BYTES 1024 +/** To what multiple should stream counts be rounded up? */ +#define EXIT_STATS_ROUND_UP_STREAMS 4 +/** Number of TCP ports */ +#define EXIT_STATS_NUM_PORTS 65536 +/** Reciprocal of threshold (= 0.01%) of total bytes that a port needs to + * see in order to be included in exit stats. */ +#define EXIT_STATS_THRESHOLD_RECIPROCAL 10000 + +/* The following data structures are arrays and no fancy smartlists or maps, + * so that all write operations can be done in constant time. This comes at + * the price of some memory (1.25 MB) and linear complexity when writing + * stats for measuring relays. */ +/** Number of bytes read in current period by exit port */ +static uint64_t *exit_bytes_read = NULL; +/** Number of bytes written in current period by exit port */ +static uint64_t *exit_bytes_written = NULL; +/** Number of streams opened in current period by exit port */ +static uint32_t *exit_streams = NULL; + +/** Start time of exit stats or 0 if we're not collecting exit stats. */ +static time_t start_of_exit_stats_interval; + +/** Initialize exit port stats. */ +void +rep_hist_exit_stats_init(time_t now) +{ + start_of_exit_stats_interval = now; + exit_bytes_read = tor_malloc_zero(EXIT_STATS_NUM_PORTS * + sizeof(uint64_t)); + exit_bytes_written = tor_malloc_zero(EXIT_STATS_NUM_PORTS * + sizeof(uint64_t)); + exit_streams = tor_malloc_zero(EXIT_STATS_NUM_PORTS * + sizeof(uint32_t)); +} + +/** Reset counters for exit port statistics. */ +void +rep_hist_reset_exit_stats(time_t now) +{ + start_of_exit_stats_interval = now; + memset(exit_bytes_read, 0, EXIT_STATS_NUM_PORTS * sizeof(uint64_t)); + memset(exit_bytes_written, 0, EXIT_STATS_NUM_PORTS * sizeof(uint64_t)); + memset(exit_streams, 0, EXIT_STATS_NUM_PORTS * sizeof(uint32_t)); +} + +/** Stop collecting exit port stats in a way that we can re-start doing + * so in rep_hist_exit_stats_init(). */ +void +rep_hist_exit_stats_term(void) +{ + start_of_exit_stats_interval = 0; + tor_free(exit_bytes_read); + tor_free(exit_bytes_written); + tor_free(exit_streams); } -/** Free all storage held by the OR/link history caches, by the - * bandwidth history arrays, or by the port history. */ -void -rep_hist_free_all(void) +/** Return a newly allocated string containing the exit port statistics + * until now, or NULL if we're not collecting exit stats. */ +char * +rep_hist_format_exit_stats(time_t now) { - digestmap_free(history_map, free_or_history); - tor_free(read_array); - tor_free(write_array); - predicted_ports_free(); -} - -/****************** hidden service usage statistics ******************/ - -/** How large are the intervals for which we track and report hidden service - * use? */ -#define NUM_SECS_HS_USAGE_SUM_INTERVAL (15*60) -/** How far in the past do we remember and publish hidden service use? */ -#define NUM_SECS_HS_USAGE_SUM_IS_VALID (24*60*60) -/** How many hidden service usage intervals do we remember? (derived) */ -#define NUM_TOTALS_HS_USAGE (NUM_SECS_HS_USAGE_SUM_IS_VALID/ \ - NUM_SECS_HS_USAGE_SUM_INTERVAL) - -/** List element containing a service id and the count. */ -typedef struct hs_usage_list_elem_t { - /** Service id of this elem. */ - char service_id[REND_SERVICE_ID_LEN_BASE32+1]; - /** Number of occurrences for the given service id. */ - uint32_t count; - /* Pointer to next list elem */ - struct hs_usage_list_elem_t *next; -} hs_usage_list_elem_t; - -/** Ordered list that stores service ids and the number of observations. It is - * ordered by the number of occurrences in descending order. Its purpose is to - * calculate the frequency distribution when the period is over. */ -typedef struct hs_usage_list_t { - /* Pointer to the first element in the list. */ - hs_usage_list_elem_t *start; - /* Number of total occurrences for all list elements. */ - uint32_t total_count; - /* Number of service ids, i.e. number of list elements. */ - uint32_t total_service_ids; -} hs_usage_list_t; - -/** Tracks service-related observations in the current period and their - * history. */ -typedef struct hs_usage_service_related_observation_t { - /** Ordered list that stores service ids and the number of observations in - * the current period. It is ordered by the number of occurrences in - * descending order. Its purpose is to calculate the frequency distribution - * when the period is over. */ - hs_usage_list_t *list; - /** Circular arrays that store the history of observations. totals stores all - * observations, twenty (ten, five) the number of observations related to a - * service id being accounted for the top 20 (10, 5) percent of all - * observations. */ - uint32_t totals[NUM_TOTALS_HS_USAGE]; - uint32_t five[NUM_TOTALS_HS_USAGE]; - uint32_t ten[NUM_TOTALS_HS_USAGE]; - uint32_t twenty[NUM_TOTALS_HS_USAGE]; -} hs_usage_service_related_observation_t; - -/** Tracks the history of general period-related observations, i.e. those that - * cannot be related to a specific service id. */ -typedef struct hs_usage_general_period_related_observations_t { - /** Circular array that stores the history of observations. */ - uint32_t totals[NUM_TOTALS_HS_USAGE]; -} hs_usage_general_period_related_observations_t; - -/** Keeps information about the current observation period and its relation to - * the histories of observations. */ -typedef struct hs_usage_current_observation_period_t { - /** Where do we write the next history entry? */ - int next_idx; - /** How many values in history have been set ever? (upper bound!) */ - int num_set; - /** When did this period begin? */ - time_t start_of_current_period; - /** When does the next period begin? */ - time_t start_of_next_period; -} hs_usage_current_observation_period_t; + int i; + uint64_t total_bytes = 0, threshold_bytes, other_read = 0, + other_written = 0; + uint32_t other_streams = 0; + char *buf; + smartlist_t *written_strings, *read_strings, *streams_strings; + char *written_string, *read_string, *streams_string; + char t[ISO_TIME_LEN+1]; + char *result; -static hs_usage_current_observation_period_t *current_period = NULL; -static hs_usage_service_related_observation_t *publish_total = NULL; -static hs_usage_service_related_observation_t *publish_novel = NULL; -static hs_usage_service_related_observation_t *fetch_total = NULL; -static hs_usage_service_related_observation_t *fetch_successful = NULL; -static hs_usage_general_period_related_observations_t *descs = NULL; - -/** Creates an empty ordered list element. */ -static hs_usage_list_elem_t * -hs_usage_list_elem_new(void) -{ - hs_usage_list_elem_t *e; - e = tor_malloc_zero(sizeof(hs_usage_list_elem_t)); - rephist_total_alloc += sizeof(hs_usage_list_elem_t); - e->count = 1; - e->next = NULL; - return e; -} - -/** Creates an empty ordered list. */ -static hs_usage_list_t * -hs_usage_list_new(void) -{ - hs_usage_list_t *l; - l = tor_malloc_zero(sizeof(hs_usage_list_t)); - rephist_total_alloc += sizeof(hs_usage_list_t); - l->start = NULL; - l->total_count = 0; - l->total_service_ids = 0; - return l; -} - -/** Creates an empty structure for storing service-related observations. */ -static hs_usage_service_related_observation_t * -hs_usage_service_related_observation_new(void) -{ - hs_usage_service_related_observation_t *h; - h = tor_malloc_zero(sizeof(hs_usage_service_related_observation_t)); - rephist_total_alloc += sizeof(hs_usage_service_related_observation_t); - h->list = hs_usage_list_new(); - return h; -} - -/** Creates an empty structure for storing general period-related - * observations. */ -static hs_usage_general_period_related_observations_t * -hs_usage_general_period_related_observations_new(void) -{ - hs_usage_general_period_related_observations_t *p; - p = tor_malloc_zero(sizeof(hs_usage_general_period_related_observations_t)); - rephist_total_alloc+= sizeof(hs_usage_general_period_related_observations_t); - return p; -} - -/** Creates an empty structure for storing period-specific information. */ -static hs_usage_current_observation_period_t * -hs_usage_current_observation_period_new(void) -{ - hs_usage_current_observation_period_t *c; - time_t now; - c = tor_malloc_zero(sizeof(hs_usage_current_observation_period_t)); - rephist_total_alloc += sizeof(hs_usage_current_observation_period_t); - now = time(NULL); - c->start_of_current_period = now; - c->start_of_next_period = now + NUM_SECS_HS_USAGE_SUM_INTERVAL; - return c; -} + if (!start_of_exit_stats_interval) + return NULL; /* Not initialized. */ -/** Initializes the structures for collecting hidden service usage data. */ -static void -hs_usage_init(void) + /* Count total number of bytes, so that we can attribute observations + * below or equal to a threshold of 1 / EXIT_STATS_THRESHOLD_RECIPROCAL + * of all bytes to a special port 'other'. */ + for (i = 1; i < EXIT_STATS_NUM_PORTS; i++) { + total_bytes += exit_bytes_read[i]; + total_bytes += exit_bytes_written[i]; + } + threshold_bytes = total_bytes / EXIT_STATS_THRESHOLD_RECIPROCAL; + + /* Add observations of all ports above the threshold to smartlists and + * join them to single strings. Also count bytes and streams of ports + * below or equal to the threshold. */ + written_strings = smartlist_create(); + read_strings = smartlist_create(); + streams_strings = smartlist_create(); + for (i = 1; i < EXIT_STATS_NUM_PORTS; i++) { + if (exit_bytes_read[i] + exit_bytes_written[i] > threshold_bytes) { + if (exit_bytes_written[i] > 0) { + uint64_t num = round_uint64_to_next_multiple_of( + exit_bytes_written[i], EXIT_STATS_ROUND_UP_BYTES); + num /= 1024; + buf = NULL; + tor_asprintf(&buf, "%d="U64_FORMAT, i, U64_PRINTF_ARG(num)); + smartlist_add(written_strings, buf); + } + if (exit_bytes_read[i] > 0) { + uint64_t num = round_uint64_to_next_multiple_of( + exit_bytes_read[i], EXIT_STATS_ROUND_UP_BYTES); + num /= 1024; + buf = NULL; + tor_asprintf(&buf, "%d="U64_FORMAT, i, U64_PRINTF_ARG(num)); + smartlist_add(read_strings, buf); + } + if (exit_streams[i] > 0) { + uint32_t num = round_uint32_to_next_multiple_of(exit_streams[i], + EXIT_STATS_ROUND_UP_STREAMS); + buf = NULL; + tor_asprintf(&buf, "%d=%u", i, num); + smartlist_add(streams_strings, buf); + } + } else { + other_read += exit_bytes_read[i]; + other_written += exit_bytes_written[i]; + other_streams += exit_streams[i]; + } + } + other_written = round_uint64_to_next_multiple_of(other_written, + EXIT_STATS_ROUND_UP_BYTES); + other_written /= 1024; + buf = NULL; + tor_asprintf(&buf, "other="U64_FORMAT, U64_PRINTF_ARG(other_written)); + smartlist_add(written_strings, buf); + other_read = round_uint64_to_next_multiple_of(other_read, + EXIT_STATS_ROUND_UP_BYTES); + other_read /= 1024; + buf = NULL; + tor_asprintf(&buf, "other="U64_FORMAT, U64_PRINTF_ARG(other_read)); + smartlist_add(read_strings, buf); + other_streams = round_uint32_to_next_multiple_of(other_streams, + EXIT_STATS_ROUND_UP_STREAMS); + buf = NULL; + tor_asprintf(&buf, "other=%u", other_streams); + smartlist_add(streams_strings, buf); + written_string = smartlist_join_strings(written_strings, ",", 0, NULL); + read_string = smartlist_join_strings(read_strings, ",", 0, NULL); + streams_string = smartlist_join_strings(streams_strings, ",", 0, NULL); + SMARTLIST_FOREACH(written_strings, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(read_strings, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(streams_strings, char *, cp, tor_free(cp)); + smartlist_free(written_strings); + smartlist_free(read_strings); + smartlist_free(streams_strings); + + /* Put everything together. */ + format_iso_time(t, now); + tor_asprintf(&result, "exit-stats-end %s (%d s)\n" + "exit-kibibytes-written %s\n" + "exit-kibibytes-read %s\n" + "exit-streams-opened %s\n", + t, (unsigned) (now - start_of_exit_stats_interval), + written_string, + read_string, + streams_string); + tor_free(written_string); + tor_free(read_string); + tor_free(streams_string); + return result; +} + +/** If 24 hours have passed since the beginning of the current exit port + * stats period, write exit stats to $DATADIR/stats/exit-stats (possibly + * overwriting an existing file) and reset counters. Return when we would + * next want to write exit stats or 0 if we never want to write. */ +time_t +rep_hist_exit_stats_write(time_t now) { - current_period = hs_usage_current_observation_period_new(); - publish_total = hs_usage_service_related_observation_new(); - publish_novel = hs_usage_service_related_observation_new(); - fetch_total = hs_usage_service_related_observation_new(); - fetch_successful = hs_usage_service_related_observation_new(); - descs = hs_usage_general_period_related_observations_new(); -} + char *statsdir = NULL, *filename = NULL, *str = NULL; -/** Clears the given ordered list by resetting its attributes and releasing - * the memory allocated by its elements. */ -static void -hs_usage_list_clear(hs_usage_list_t *lst) -{ - /* walk through elements and free memory */ - hs_usage_list_elem_t *current = lst->start; - hs_usage_list_elem_t *tmp; - while (current != NULL) { - tmp = current->next; - rephist_total_alloc -= sizeof(hs_usage_list_elem_t); - tor_free(current); - current = tmp; - } - /* reset attributes */ - lst->start = NULL; - lst->total_count = 0; - lst->total_service_ids = 0; - return; -} + if (!start_of_exit_stats_interval) + return 0; /* Not initialized. */ + if (start_of_exit_stats_interval + WRITE_STATS_INTERVAL > now) + goto done; /* Not ready to write. */ -/** Frees the memory used by the given list. */ -static void -hs_usage_list_free(hs_usage_list_t *lst) -{ - if (!lst) - return; - hs_usage_list_clear(lst); - rephist_total_alloc -= sizeof(hs_usage_list_t); - tor_free(lst); -} + log_info(LD_HIST, "Writing exit port statistics to disk."); -/** Frees the memory used by the given service-related observations. */ -static void -hs_usage_service_related_observation_free( - hs_usage_service_related_observation_t *s) -{ - if (!s) - return; - hs_usage_list_free(s->list); - rephist_total_alloc -= sizeof(hs_usage_service_related_observation_t); - tor_free(s); -} + /* Generate history string. */ + str = rep_hist_format_exit_stats(now); -/** Frees the memory used by the given period-specific observations. */ -static void -hs_usage_general_period_related_observations_free( - hs_usage_general_period_related_observations_t *s) -{ - rephist_total_alloc-=sizeof(hs_usage_general_period_related_observations_t); - tor_free(s); -} + /* Reset counters. */ + rep_hist_reset_exit_stats(now); -/** Frees the memory used by period-specific information. */ -static void -hs_usage_current_observation_period_free( - hs_usage_current_observation_period_t *s) -{ - rephist_total_alloc -= sizeof(hs_usage_current_observation_period_t); - tor_free(s); + /* Try to write to disk. */ + statsdir = get_datadir_fname("stats"); + if (check_private_dir(statsdir, CPD_CREATE) < 0) { + log_warn(LD_HIST, "Unable to create stats/ directory!"); + goto done; + } + filename = get_datadir_fname2("stats", "exit-stats"); + if (write_str_to_file(filename, str, 0) < 0) + log_warn(LD_HIST, "Unable to write exit port statistics to disk!"); + + done: + tor_free(str); + tor_free(statsdir); + tor_free(filename); + return start_of_exit_stats_interval + WRITE_STATS_INTERVAL; } -/** Frees all memory that was used for collecting hidden service usage data. */ +/** Note that we wrote num_written bytes and read num_read + * bytes to/from an exit connection to port. */ void -hs_usage_free_all(void) +rep_hist_note_exit_bytes(uint16_t port, size_t num_written, + size_t num_read) { - hs_usage_general_period_related_observations_free(descs); - descs = NULL; - hs_usage_service_related_observation_free(fetch_successful); - hs_usage_service_related_observation_free(fetch_total); - hs_usage_service_related_observation_free(publish_novel); - hs_usage_service_related_observation_free(publish_total); - fetch_successful = fetch_total = publish_novel = publish_total = NULL; - hs_usage_current_observation_period_free(current_period); - current_period = NULL; + if (!start_of_exit_stats_interval) + return; /* Not initialized. */ + exit_bytes_written[port] += num_written; + exit_bytes_read[port] += num_read; + log_debug(LD_HIST, "Written %lu bytes and read %lu bytes to/from an " + "exit connection to port %d.", + (unsigned long)num_written, (unsigned long)num_read, port); } -/** Inserts a new occurrence for the given service id to the given ordered - * list. */ -static void -hs_usage_insert_value(hs_usage_list_t *lst, const char *service_id) +/** Note that we opened an exit stream to port. */ +void +rep_hist_note_exit_stream_opened(uint16_t port) { - /* search if there is already an elem with same service_id in list */ - hs_usage_list_elem_t *current = lst->start; - hs_usage_list_elem_t *previous = NULL; - while (current != NULL && strcasecmp(current->service_id,service_id)) { - previous = current; - current = current->next; - } - /* found an element with same service_id? */ - if (current == NULL) { - /* not found! append to end (which could also be the end of a zero-length - * list), don't need to sort (1 is smallest value). */ - /* create elem */ - hs_usage_list_elem_t *e = hs_usage_list_elem_new(); - /* update list attributes (one new elem, one new occurrence) */ - lst->total_count++; - lst->total_service_ids++; - /* copy service id to elem */ - strlcpy(e->service_id,service_id,sizeof(e->service_id)); - /* let either l->start or previously last elem point to new elem */ - if (lst->start == NULL) { - /* this is the first elem */ - lst->start = e; - } else { - /* there were elems in the list before */ - previous->next = e; - } - } else { - /* found! add occurrence to elem and consider resorting */ - /* update list attributes (no new elem, but one new occurrence) */ - lst->total_count++; - /* add occurrence to elem */ - current->count++; - /* is it another than the first list elem? and has previous elem fewer - * count than current? then we need to resort */ - if (previous != NULL && previous->count < current->count) { - /* yes! we need to resort */ - /* remove current elem first */ - previous->next = current->next; - /* can we prepend elem to all other elements? */ - if (lst->start->count <= current->count) { - /* yes! prepend elem */ - current->next = lst->start; - lst->start = current; - } else { - /* no! walk through list a second time and insert at correct place */ - hs_usage_list_elem_t *insert_current = lst->start->next; - hs_usage_list_elem_t *insert_previous = lst->start; - while (insert_current != NULL && - insert_current->count > current->count) { - insert_previous = insert_current; - insert_current = insert_current->next; - } - /* insert here */ - current->next = insert_current; - insert_previous->next = current; - } - } - } + if (!start_of_exit_stats_interval) + return; /* Not initialized. */ + exit_streams[port]++; + log_debug(LD_HIST, "Opened exit stream to port %d", port); } -/** Writes the current service-related observations to the history array and - * clears the observations of the current period. */ -static void -hs_usage_write_service_related_observations_to_history( - hs_usage_current_observation_period_t *p, - hs_usage_service_related_observation_t *h) -{ - /* walk through the first 20 % of list elements and calculate frequency - * distributions */ - /* maximum indices for the three frequencies */ - int five_percent_idx = h->list->total_service_ids/20; - int ten_percent_idx = h->list->total_service_ids/10; - int twenty_percent_idx = h->list->total_service_ids/5; - /* temp values */ - uint32_t five_percent = 0; - uint32_t ten_percent = 0; - uint32_t twenty_percent = 0; - /* walk through list */ - hs_usage_list_elem_t *current = h->list->start; - int i=0; - while (current != NULL && i <= twenty_percent_idx) { - twenty_percent += current->count; - if (i <= ten_percent_idx) - ten_percent += current->count; - if (i <= five_percent_idx) - five_percent += current->count; - current = current->next; - i++; - } - /* copy frequencies */ - h->twenty[p->next_idx] = twenty_percent; - h->ten[p->next_idx] = ten_percent; - h->five[p->next_idx] = five_percent; - /* copy total number of observations */ - h->totals[p->next_idx] = h->list->total_count; - /* free memory of old list */ - hs_usage_list_clear(h->list); -} +/*** cell statistics ***/ -/** Advances to next observation period. */ -static void -hs_usage_advance_current_observation_period(void) -{ - /* aggregate observations to history, including frequency distribution - * arrays */ - hs_usage_write_service_related_observations_to_history( - current_period, publish_total); - hs_usage_write_service_related_observations_to_history( - current_period, publish_novel); - hs_usage_write_service_related_observations_to_history( - current_period, fetch_total); - hs_usage_write_service_related_observations_to_history( - current_period, fetch_successful); - /* write current number of descriptors to descs history */ - descs->totals[current_period->next_idx] = rend_cache_size(); - /* advance to next period */ - current_period->next_idx++; - if (current_period->next_idx == NUM_TOTALS_HS_USAGE) - current_period->next_idx = 0; - if (current_period->num_set < NUM_TOTALS_HS_USAGE) - ++current_period->num_set; - current_period->start_of_current_period=current_period->start_of_next_period; - current_period->start_of_next_period += NUM_SECS_HS_USAGE_SUM_INTERVAL; -} +/** Start of the current buffer stats interval or 0 if we're not + * collecting buffer statistics. */ +static time_t start_of_buffer_stats_interval; -/** Checks if the current period is up to date, and if not, advances it. */ -static void -hs_usage_check_if_current_period_is_up_to_date(time_t now) +/** Initialize buffer stats. */ +void +rep_hist_buffer_stats_init(time_t now) { - while (now > current_period->start_of_next_period) { - hs_usage_advance_current_observation_period(); - } + start_of_buffer_stats_interval = now; } -/** Adds a service-related observation, maybe after advancing to next - * observation period. */ -static void -hs_usage_add_service_related_observation( - hs_usage_service_related_observation_t *h, - time_t now, - const char *service_id) -{ - if (now < current_period->start_of_current_period) { - /* don't record old data */ - return; - } - /* check if we are up-to-date */ - hs_usage_check_if_current_period_is_up_to_date(now); - /* add observation */ - hs_usage_insert_value(h->list, service_id); -} +typedef struct circ_buffer_stats_t { + uint32_t processed_cells; + double mean_num_cells_in_queue; + double mean_time_cells_in_queue; + uint32_t local_circ_id; +} circ_buffer_stats_t; -/** Adds the observation of storing a rendezvous service descriptor to our - * cache in our role as HS authoritative directory. */ -void -hs_usage_note_publish_total(const char *service_id, time_t now) -{ - hs_usage_add_service_related_observation(publish_total, now, service_id); -} +/** Holds stats. */ +smartlist_t *circuits_for_buffer_stats = NULL; -/** Adds the observation of storing a novel rendezvous service descriptor to - * our cache in our role as HS authoritative directory. */ +/** Remember cell statistics for circuit circ at time + * end_of_interval and reset cell counters in case the circuit + * remains open in the next measurement interval. */ void -hs_usage_note_publish_novel(const char *service_id, time_t now) +rep_hist_buffer_stats_add_circ(circuit_t *circ, time_t end_of_interval) { - hs_usage_add_service_related_observation(publish_novel, now, service_id); + circ_buffer_stats_t *stat; + time_t start_of_interval; + int interval_length; + or_circuit_t *orcirc; + if (CIRCUIT_IS_ORIGIN(circ)) + return; + orcirc = TO_OR_CIRCUIT(circ); + if (!orcirc->processed_cells) + return; + if (!circuits_for_buffer_stats) + circuits_for_buffer_stats = smartlist_create(); + start_of_interval = circ->timestamp_created > + start_of_buffer_stats_interval ? + circ->timestamp_created : + start_of_buffer_stats_interval; + interval_length = (int) (end_of_interval - start_of_interval); + stat = tor_malloc_zero(sizeof(circ_buffer_stats_t)); + stat->processed_cells = orcirc->processed_cells; + /* 1000.0 for s -> ms; 2.0 because of app-ward and exit-ward queues */ + stat->mean_num_cells_in_queue = interval_length == 0 ? 0.0 : + (double) orcirc->total_cell_waiting_time / + (double) interval_length / 1000.0 / 2.0; + stat->mean_time_cells_in_queue = + (double) orcirc->total_cell_waiting_time / + (double) orcirc->processed_cells; + smartlist_add(circuits_for_buffer_stats, stat); + orcirc->total_cell_waiting_time = 0; + orcirc->processed_cells = 0; } -/** Adds the observation of being requested for a rendezvous service descriptor - * in our role as HS authoritative directory. */ -void -hs_usage_note_fetch_total(const char *service_id, time_t now) +/** Sorting helper: return -1, 1, or 0 based on comparison of two + * circ_buffer_stats_t */ +static int +_buffer_stats_compare_entries(const void **_a, const void **_b) { - hs_usage_add_service_related_observation(fetch_total, now, service_id); + const circ_buffer_stats_t *a = *_a, *b = *_b; + if (a->processed_cells < b->processed_cells) + return 1; + else if (a->processed_cells > b->processed_cells) + return -1; + else + return 0; } -/** Adds the observation of being requested for a rendezvous service descriptor - * in our role as HS authoritative directory and being able to answer that - * request successfully. */ +/** Stop collecting cell stats in a way that we can re-start doing so in + * rep_hist_buffer_stats_init(). */ void -hs_usage_note_fetch_successful(const char *service_id, time_t now) -{ - hs_usage_add_service_related_observation(fetch_successful, now, service_id); -} - -/** Writes the given circular array to a string. */ -static size_t -hs_usage_format_history(char *buf, size_t len, uint32_t *data) +rep_hist_buffer_stats_term(void) { - char *cp = buf; /* pointer where we are in the buffer */ - int i, n; - if (current_period->num_set <= current_period->next_idx) { - i = 0; /* not been through circular array */ - } else { - i = current_period->next_idx; - } - for (n = 0; n < current_period->num_set; ++n,++i) { - if (i >= NUM_TOTALS_HS_USAGE) - i -= NUM_TOTALS_HS_USAGE; - tor_assert(i < NUM_TOTALS_HS_USAGE); - if (n == (current_period->num_set-1)) - tor_snprintf(cp, len-(cp-buf), "%d", data[i]); - else - tor_snprintf(cp, len-(cp-buf), "%d,", data[i]); - cp += strlen(cp); - } - return cp-buf; + start_of_buffer_stats_interval = 0; + if (!circuits_for_buffer_stats) + circuits_for_buffer_stats = smartlist_create(); + SMARTLIST_FOREACH(circuits_for_buffer_stats, circ_buffer_stats_t *, + stat, tor_free(stat)); + smartlist_clear(circuits_for_buffer_stats); } -/** Writes the complete usage history as hidden service authoritative directory - * to a string. */ -static char * -hs_usage_format_statistics(void) +/** Write buffer statistics to $DATADIR/stats/buffer-stats and return when + * we would next want to write exit stats. */ +time_t +rep_hist_buffer_stats_write(time_t now) { - char *buf, *cp, *s = NULL; - char t[ISO_TIME_LEN+1]; - int r; - uint32_t *data = NULL; - size_t len; - len = (70+20*NUM_TOTALS_HS_USAGE)*11; - buf = tor_malloc_zero(len); - cp = buf; - for (r = 0; r < 11; ++r) { - switch (r) { - case 0: - s = (char*) "publish-total-history"; - data = publish_total->totals; - break; - case 1: - s = (char*) "publish-novel-history"; - data = publish_novel->totals; - break; - case 2: - s = (char*) "publish-top-5-percent-history"; - data = publish_total->five; - break; - case 3: - s = (char*) "publish-top-10-percent-history"; - data = publish_total->ten; - break; - case 4: - s = (char*) "publish-top-20-percent-history"; - data = publish_total->twenty; - break; - case 5: - s = (char*) "fetch-total-history"; - data = fetch_total->totals; - break; - case 6: - s = (char*) "fetch-successful-history"; - data = fetch_successful->totals; - break; - case 7: - s = (char*) "fetch-top-5-percent-history"; - data = fetch_total->five; - break; - case 8: - s = (char*) "fetch-top-10-percent-history"; - data = fetch_total->ten; - break; - case 9: - s = (char*) "fetch-top-20-percent-history"; - data = fetch_total->twenty; - break; - case 10: - s = (char*) "desc-total-history"; - data = descs->totals; - break; - } - format_iso_time(t, current_period->start_of_current_period); - tor_snprintf(cp, len-(cp-buf), "%s %s (%d s) ", s, t, - NUM_SECS_HS_USAGE_SUM_INTERVAL); - cp += strlen(cp); - cp += hs_usage_format_history(cp, len-(cp-buf), data); - strlcat(cp, "\n", len-(cp-buf)); - ++cp; - } - return buf; + char *statsdir = NULL, *filename = NULL; + char written[ISO_TIME_LEN+1]; + open_file_t *open_file = NULL; + FILE *out; +#define SHARES 10 + int processed_cells[SHARES], circs_in_share[SHARES], + number_of_circuits, i; + double queued_cells[SHARES], time_in_queue[SHARES]; + smartlist_t *str_build = smartlist_create(); + char *str = NULL, *buf=NULL; + circuit_t *circ; + + if (!start_of_buffer_stats_interval) + return 0; /* Not initialized. */ + if (start_of_buffer_stats_interval + WRITE_STATS_INTERVAL > now) + goto done; /* Not ready to write */ + + /* add current circuits to stats */ + for (circ = _circuit_get_global_list(); circ; circ = circ->next) + rep_hist_buffer_stats_add_circ(circ, now); + /* calculate deciles */ + memset(processed_cells, 0, SHARES * sizeof(int)); + memset(circs_in_share, 0, SHARES * sizeof(int)); + memset(queued_cells, 0, SHARES * sizeof(double)); + memset(time_in_queue, 0, SHARES * sizeof(double)); + if (!circuits_for_buffer_stats) + circuits_for_buffer_stats = smartlist_create(); + smartlist_sort(circuits_for_buffer_stats, + _buffer_stats_compare_entries); + number_of_circuits = smartlist_len(circuits_for_buffer_stats); + if (number_of_circuits < 1) { + log_info(LD_HIST, "Attempt to write cell statistics to disk failed. " + "We haven't seen a single circuit to report about."); + goto done; + } + i = 0; + SMARTLIST_FOREACH_BEGIN(circuits_for_buffer_stats, + circ_buffer_stats_t *, stat) + { + int share = i++ * SHARES / number_of_circuits; + processed_cells[share] += stat->processed_cells; + queued_cells[share] += stat->mean_num_cells_in_queue; + time_in_queue[share] += stat->mean_time_cells_in_queue; + circs_in_share[share]++; + } + SMARTLIST_FOREACH_END(stat); + /* clear buffer stats history */ + SMARTLIST_FOREACH(circuits_for_buffer_stats, circ_buffer_stats_t *, + stat, tor_free(stat)); + smartlist_clear(circuits_for_buffer_stats); + /* write to file */ + statsdir = get_datadir_fname("stats"); + if (check_private_dir(statsdir, CPD_CREATE) < 0) + goto done; + filename = get_datadir_fname2("stats", "buffer-stats"); + out = start_writing_to_stdio_file(filename, OPEN_FLAGS_APPEND, + 0600, &open_file); + if (!out) + goto done; + format_iso_time(written, now); + if (fprintf(out, "cell-stats-end %s (%d s)\n", written, + (unsigned) (now - start_of_buffer_stats_interval)) < 0) + goto done; + for (i = 0; i < SHARES; i++) { + tor_asprintf(&buf,"%d", !circs_in_share[i] ? 0 : + processed_cells[i] / circs_in_share[i]); + smartlist_add(str_build, buf); + } + str = smartlist_join_strings(str_build, ",", 0, NULL); + if (fprintf(out, "cell-processed-cells %s\n", str) < 0) + goto done; + tor_free(str); + SMARTLIST_FOREACH(str_build, char *, c, tor_free(c)); + smartlist_clear(str_build); + for (i = 0; i < SHARES; i++) { + tor_asprintf(&buf, "%.2f", circs_in_share[i] == 0 ? 0.0 : + queued_cells[i] / (double) circs_in_share[i]); + smartlist_add(str_build, buf); + } + str = smartlist_join_strings(str_build, ",", 0, NULL); + if (fprintf(out, "cell-queued-cells %s\n", str) < 0) + goto done; + tor_free(str); + SMARTLIST_FOREACH(str_build, char *, c, tor_free(c)); + smartlist_clear(str_build); + for (i = 0; i < SHARES; i++) { + tor_asprintf(&buf, "%.0f", circs_in_share[i] == 0 ? 0.0 : + time_in_queue[i] / (double) circs_in_share[i]); + smartlist_add(str_build, buf); + } + str = smartlist_join_strings(str_build, ",", 0, NULL); + if (fprintf(out, "cell-time-in-queue %s\n", str) < 0) + goto done; + tor_free(str); + SMARTLIST_FOREACH(str_build, char *, c, tor_free(c)); + smartlist_free(str_build); + str_build = NULL; + if (fprintf(out, "cell-circuits-per-decile %d\n", + (number_of_circuits + SHARES - 1) / SHARES) < 0) + goto done; + finish_writing_to_file(open_file); + open_file = NULL; + start_of_buffer_stats_interval = now; + done: + if (open_file) + abort_writing_to_file(open_file); + tor_free(filename); + tor_free(statsdir); + if (str_build) { + SMARTLIST_FOREACH(str_build, char *, c, tor_free(c)); + smartlist_free(str_build); + } + tor_free(str); +#undef SHARES + return start_of_buffer_stats_interval + WRITE_STATS_INTERVAL; } -/** Write current statistics about hidden service usage to file. */ +/** Free all storage held by the OR/link history caches, by the + * bandwidth history arrays, by the port history, or by statistics . */ void -hs_usage_write_statistics_to_file(time_t now) +rep_hist_free_all(void) { - char *buf; - size_t len; - char *fname; - or_options_t *options = get_options(); - /* check if we are up-to-date */ - hs_usage_check_if_current_period_is_up_to_date(now); - buf = hs_usage_format_statistics(); - len = strlen(options->DataDirectory) + 16; - fname = tor_malloc(len); - tor_snprintf(fname, len, "%s"PATH_SEPARATOR"hsusage", - options->DataDirectory); - write_str_to_file(fname,buf,0); - tor_free(buf); - tor_free(fname); + digestmap_free(history_map, free_or_history); + tor_free(read_array); + tor_free(write_array); + tor_free(last_stability_doc); + tor_free(exit_bytes_read); + tor_free(exit_bytes_written); + tor_free(exit_streams); + built_last_stability_doc_at = 0; + predicted_ports_free(); } diff -Nru tor-0.2.0.34/src/or/rephist.h tor-0.2.2.16-alpha/src/or/rephist.h --- tor-0.2.0.34/src/or/rephist.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/rephist.h 2010-08-18 23:04:46.000000000 +0000 @@ -0,0 +1,80 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file rephist.h + * \brief Header file for rephist.c. + **/ + +#ifndef _TOR_REPHIST_H +#define _TOR_REPHIST_H + +void rep_hist_init(void); +void rep_hist_note_connect_failed(const char* nickname, time_t when); +void rep_hist_note_connect_succeeded(const char* nickname, time_t when); +void rep_hist_note_disconnect(const char* nickname, time_t when); +void rep_hist_note_connection_died(const char* nickname, time_t when); +void rep_hist_note_extend_succeeded(const char *from_name, + const char *to_name); +void rep_hist_note_extend_failed(const char *from_name, const char *to_name); +void rep_hist_dump_stats(time_t now, int severity); +void rep_hist_note_bytes_read(size_t num_bytes, time_t when); +void rep_hist_note_bytes_written(size_t num_bytes, time_t when); + +void rep_hist_note_dir_bytes_read(size_t num_bytes, time_t when); +void rep_hist_note_dir_bytes_written(size_t num_bytes, time_t when); + +int rep_hist_bandwidth_assess(void); +char *rep_hist_get_bandwidth_lines(int for_extrainfo); +void rep_hist_update_state(or_state_t *state); +int rep_hist_load_state(or_state_t *state, char **err); +void rep_history_clean(time_t before); + +void rep_hist_note_router_reachable(const char *id, time_t when); +void rep_hist_note_router_unreachable(const char *id, time_t when); +int rep_hist_record_mtbf_data(time_t now, int missing_means_down); +int rep_hist_load_mtbf_data(time_t now); + +time_t rep_hist_downrate_old_runs(time_t now); +double rep_hist_get_stability(const char *id, time_t when); +double rep_hist_get_weighted_fractional_uptime(const char *id, time_t when); +long rep_hist_get_weighted_time_known(const char *id, time_t when); +int rep_hist_have_measured_enough_stability(void); +const char *rep_hist_get_router_stability_doc(time_t now); + +void rep_hist_note_used_port(time_t now, uint16_t port); +smartlist_t *rep_hist_get_predicted_ports(time_t now); +void rep_hist_note_used_resolve(time_t now); +void rep_hist_note_used_internal(time_t now, int need_uptime, + int need_capacity); +int rep_hist_get_predicted_internal(time_t now, int *need_uptime, + int *need_capacity); + +int any_predicted_circuits(time_t now); +int rep_hist_circbuilding_dormant(time_t now); + +void note_crypto_pk_op(pk_op_t operation); +void dump_pk_ops(int severity); + +void rep_hist_free_all(void); + +void rep_hist_exit_stats_init(time_t now); +void rep_hist_reset_exit_stats(time_t now); +void rep_hist_exit_stats_term(void); +char *rep_hist_format_exit_stats(time_t now); +time_t rep_hist_exit_stats_write(time_t now); +void rep_hist_note_exit_bytes(uint16_t port, size_t num_written, + size_t num_read); +void rep_hist_note_exit_stream_opened(uint16_t port); + +void rep_hist_buffer_stats_init(time_t now); +void rep_hist_buffer_stats_add_circ(circuit_t *circ, + time_t end_of_interval); +time_t rep_hist_buffer_stats_write(time_t now); +void rep_hist_buffer_stats_term(void); + +#endif + diff -Nru tor-0.2.0.34/src/or/router.c tor-0.2.2.16-alpha/src/or/router.c --- tor-0.2.0.34/src/or/router.c 2009-01-05 02:06:16.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/router.c 2010-08-11 03:14:17.000000000 +0000 @@ -1,15 +1,29 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: router.c 17675 2008-12-18 05:47:34Z nickm $ */ -const char router_c_id[] = - "$Id: router.c 17675 2008-12-18 05:47:34Z nickm $"; #define ROUTER_PRIVATE #include "or.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "connection.h" +#include "control.h" +#include "directory.h" +#include "dirserv.h" +#include "dns.h" +#include "geoip.h" +#include "hibernate.h" +#include "main.h" +#include "policies.h" +#include "relay.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" /** * \file router.c @@ -31,7 +45,7 @@ static time_t onionkey_set_at=0; /**< When was onionkey last changed? */ /** Current private onionskin decryption key: used to decode CREATE cells. */ static crypto_pk_env_t *onionkey=NULL; -/** Previous private onionskin decription key: used to decode CREATE cells +/** Previous private onionskin decryption key: used to decode CREATE cells * generated by clients that have an older version of our descriptor. */ static crypto_pk_env_t *lastonionkey=NULL; /** Private "identity key": used to sign directory info and TLS @@ -45,7 +59,11 @@ * authorities. */ static authority_cert_t *authority_key_certificate = NULL; +/** For emergency V3 authority key migration: An extra signing key that we use + * with our old (obsolete) identity key for a while. */ static crypto_pk_env_t *legacy_signing_key = NULL; +/** For emergency V3 authority key migration: An extra certificate to + * authenticate legacy_signing_key with our obsolete identity key.*/ static authority_cert_t *legacy_key_certificate = NULL; /* (Note that v3 authorities also have a separate "authority identity key", @@ -53,15 +71,14 @@ * used by tor-gencert to sign new signing keys and make new key * certificates. */ -/** Replace the current onion key with k. Does not affect lastonionkey; - * to update onionkey correctly, call rotate_onion_key(). +/** Replace the current onion key with k. Does not affect + * lastonionkey; to update lastonionkey correctly, call rotate_onion_key(). */ static void set_onion_key(crypto_pk_env_t *k) { tor_mutex_acquire(key_lock); - if (onionkey) - crypto_free_pk_env(onionkey); + crypto_free_pk_env(onionkey); onionkey = k; onionkey_set_at = time(NULL); tor_mutex_release(key_lock); @@ -110,8 +127,7 @@ void set_identity_key(crypto_pk_env_t *k) { - if (identitykey) - crypto_free_pk_env(identitykey); + crypto_free_pk_env(identitykey); identitykey = k; crypto_pk_get_digest(identitykey, identitykey_digest); } @@ -149,12 +165,17 @@ return authority_signing_key; } +/** If we're an authority, and we're using a legacy authority identity key for + * emergency migration purposes, return the certificate associated with that + * key. */ authority_cert_t * get_my_v3_legacy_cert(void) { return legacy_key_certificate; } +/** If we're an authority, and we're using a legacy authority identity key for + * emergency migration purposes, return that key. */ crypto_pk_env_t * get_my_v3_legacy_signing_key(void) { @@ -195,8 +216,7 @@ } log_info(LD_GENERAL, "Rotating onion key"); tor_mutex_acquire(key_lock); - if (lastonionkey) - crypto_free_pk_env(lastonionkey); + crypto_free_pk_env(lastonionkey); lastonionkey = onionkey; onionkey = prkey; now = time(NULL); @@ -223,7 +243,6 @@ init_key_from_file(const char *fname, int generate, int severity) { crypto_pk_env_t *prkey = NULL; - FILE *file = NULL; if (!(prkey = crypto_new_pk_env())) { log(severity, LD_GENERAL,"Error constructing key"); @@ -237,6 +256,17 @@ goto error; case FN_NOENT: if (generate) { + if (!have_lockfile()) { + if (try_locking(get_options(), 0)<0) { + /* Make sure that --list-fingerprint only creates new keys + * if there is no possibility for a deadlock. */ + log(severity, LD_FS, "Another Tor process has locked \"%s\". Not " + "writing any new keys.", fname); + /*XXXX The 'other process' might make a key in a second or two; + * maybe we should wait for it. */ + goto error; + } + } log_info(LD_GENERAL, "No key found in \"%s\"; generating fresh key.", fname); if (crypto_pk_generate_key(prkey)) { @@ -270,14 +300,17 @@ error: if (prkey) crypto_free_pk_env(prkey); - if (file) - fclose(file); return NULL; } +/** Try to load the vote-signing private key and certificate for being a v3 + * directory authority, and make sure they match. If legacy, load a + * legacy key/cert set for emergency key migration; otherwise load the regular + * key/cert set. On success, store them into *key_out and + * *cert_out respectively, and return 0. On failure, return -1. */ static int load_authority_keyset(int legacy, crypto_pk_env_t **key_out, - authority_cert_t **cert_out) + authority_cert_t **cert_out) { int r = -1; char *fname = NULL, *cert = NULL; @@ -311,14 +344,10 @@ "certificate"); goto done; } - parsed->cache_info.signed_descriptor_body = cert; - parsed->cache_info.signed_descriptor_len = eos-cert; - cert = NULL; - - if (*key_out) - crypto_free_pk_env(*key_out); - if (*cert_out) - authority_cert_free(*cert_out); + + crypto_free_pk_env(*key_out); + authority_cert_free(*cert_out); + *key_out = signing_key; *cert_out = parsed; r = 0; @@ -328,10 +357,8 @@ done: tor_free(fname); tor_free(cert); - if (signing_key) - crypto_free_pk_env(signing_key); - if (parsed) - authority_cert_free(parsed); + crypto_free_pk_env(signing_key); + authority_cert_free(parsed); return r; } @@ -425,6 +452,14 @@ if (!key_lock) key_lock = tor_mutex_new(); + /* There are a couple of paths that put us here before */ + if (crypto_global_init(get_options()->HardwareAccel, + get_options()->AccelName, + get_options()->AccelDir)) { + log_err(LD_BUG, "Unable to initialize OpenSSL. Exiting."); + return -1; + } + /* OP's don't need persistent keys; just make up an identity and * initialize the TLS context. */ if (!server_mode(options)) { @@ -522,7 +557,7 @@ /* Must be called after keys are initialized. */ mydesc = router_get_my_descriptor(); if (authdir_mode(options)) { - const char *m; + const char *m = NULL; routerinfo_t *ri; /* We need to add our own fingerprint so it gets recognized. */ if (dirserv_add_own_fingerprint(options->Nickname, get_identity_key())) { @@ -535,7 +570,7 @@ log_err(LD_GENERAL,"Generated a routerinfo we couldn't parse."); return -1; } - if (dirserv_add_descriptor(ri, &m) < 0) { + if (!WRA_WAS_ADDED(dirserv_add_descriptor(ri, &m, "self"))) { log_err(LD_GENERAL,"Unable to add own descriptor to directory: %s", m?m:""); return -1; @@ -546,7 +581,7 @@ /* 5. Dump fingerprint to 'fingerprint' */ keydir = get_datadir_fname("fingerprint"); log_info(LD_GENERAL,"Dumping fingerprint to \"%s\"...",keydir); - if (crypto_pk_get_fingerprint(get_identity_key(), fingerprint, 1)<0) { + if (crypto_pk_get_fingerprint(get_identity_key(), fingerprint, 0)<0) { log_err(LD_GENERAL,"Error computing fingerprint"); tor_free(keydir); return -1; @@ -566,6 +601,7 @@ if (write_str_to_file(keydir, fingerprint_line, 0)) { log_err(LD_FS, "Error writing fingerprint line to file"); tor_free(keydir); + tor_free(cp); return -1; } } @@ -738,6 +774,7 @@ { routerinfo_t *me = router_get_my_routerinfo(); int orport_reachable = check_whether_orport_reachable(); + tor_addr_t addr; if (!me) return; @@ -747,26 +784,21 @@ me->address, me->or_port); circuit_launch_by_router(CIRCUIT_PURPOSE_TESTING, me, CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL); - control_event_server_status(LOG_NOTICE, - "CHECKING_REACHABILITY ORADDRESS=%s:%d", - me->address, me->or_port); } + tor_addr_from_ipv4h(&addr, me->addr); if (test_dir && !check_whether_dirport_reachable() && !connection_get_by_type_addr_port_purpose( - CONN_TYPE_DIR, me->addr, me->dir_port, + CONN_TYPE_DIR, &addr, me->dir_port, DIR_PURPOSE_FETCH_SERVERDESC)) { /* ask myself, via tor, for my server descriptor. */ - directory_initiate_command(me->address, me->addr, + directory_initiate_command(me->address, &addr, me->or_port, me->dir_port, + 0, /* does not matter */ 0, me->cache_info.identity_digest, DIR_PURPOSE_FETCH_SERVERDESC, ROUTER_PURPOSE_GENERAL, 1, "authority.z", NULL, 0, 0); - - control_event_server_status(LOG_NOTICE, - "CHECKING_REACHABILITY DIRADDRESS=%s:%d", - me->address, me->dir_port); } } @@ -782,8 +814,11 @@ " Publishing server descriptor." : ""); can_reach_or_port = 1; mark_my_descriptor_dirty(); - if (!me) + if (!me) { /* should never happen */ + log_warn(LD_BUG, "ORPort found reachable, but I have no routerinfo " + "yet. Failing to inform controller of success."); return; + } control_event_server_status(LOG_NOTICE, "REACHABILITY_SUCCEEDED ORADDRESS=%s:%d", me->address, me->or_port); @@ -801,8 +836,11 @@ can_reach_dir_port = 1; if (!me || decide_to_advertise_dirport(get_options(), me->dir_port)) mark_my_descriptor_dirty(); - if (!me) + if (!me) { /* should never happen */ + log_warn(LD_BUG, "DirPort found reachable, but I have no routerinfo " + "yet. Failing to inform controller of success."); return; + } control_event_server_status(LOG_NOTICE, "REACHABILITY_SUCCEEDED DIRADDRESS=%s:%d", me->address, me->dir_port); @@ -927,16 +965,6 @@ { return authdir_mode(options) && options->BridgeAuthoritativeDir != 0; } -/** Return true iff we once tried to stay connected to all ORs at once. - * FFFF this function, and the notion of staying connected to ORs, is - * nearly obsolete. One day there will be a proposal for getting rid of - * it. - */ -int -clique_mode(or_options_t *options) -{ - return authdir_mode_tests_reachability(options); -} /** Return true iff we are trying to be a server. */ @@ -1031,20 +1059,6 @@ } /* - * Clique maintenance -- to be phased out. - */ - -/** Return true iff we believe this OR tries to keep connections open - * to all other ORs. */ -int -router_is_clique_mode(routerinfo_t *router) -{ - if (router_digest_is_trusted_dir(router->cache_info.identity_digest)) - return 1; - return 0; -} - -/* * OR descriptor generation. */ @@ -1112,10 +1126,14 @@ /* make sure it's resolved to something. this way we can't get a 'maybe' below. */ - if (!conn->_base.addr) + if (tor_addr_is_null(&conn->_base.addr)) return -1; - return compare_addr_to_addr_policy(conn->_base.addr, conn->_base.port, + /* XXXX IPv6 */ + if (tor_addr_family(&conn->_base.addr) != AF_INET) + return -1; + + return compare_tor_addr_to_addr_policy(&conn->_base.addr, conn->_base.port, desc_routerinfo->exit_policy) != ADDR_POLICY_ACCEPTED; } @@ -1189,7 +1207,7 @@ return body; } -/* Return the extrainfo document for this OR, or NULL if we have none. +/** Return the extrainfo document for this OR, or NULL if we have none. * Rebuilt it (and the server descriptor) if necessary. */ extrainfo_t * router_get_my_extrainfo(void) @@ -1238,6 +1256,7 @@ uint32_t addr; char platform[256]; int hibernating = we_are_hibernating(); + size_t ei_size; or_options_t *options = get_options(); if (desc_clean_since && !force) @@ -1253,7 +1272,7 @@ ri = tor_malloc_zero(sizeof(routerinfo_t)); ri->cache_info.routerlist_index = -1; - ri->address = tor_dup_addr(addr); + ri->address = tor_dup_ip(addr); ri->nickname = tor_strdup(options->Nickname); ri->addr = addr; ri->or_port = options->ORPort; @@ -1271,24 +1290,16 @@ ri->platform = tor_strdup(platform); /* compute ri->bandwidthrate as the min of various options */ - ri->bandwidthrate = (int)options->BandwidthRate; - if (ri->bandwidthrate > options->MaxAdvertisedBandwidth) - ri->bandwidthrate = (int)options->MaxAdvertisedBandwidth; - if (options->RelayBandwidthRate > 0 && - ri->bandwidthrate > options->RelayBandwidthRate) - ri->bandwidthrate = (int)options->RelayBandwidthRate; + ri->bandwidthrate = get_effective_bwrate(options); /* and compute ri->bandwidthburst similarly */ - ri->bandwidthburst = (int)options->BandwidthBurst; - if (options->RelayBandwidthBurst > 0 && - ri->bandwidthburst > options->RelayBandwidthBurst) - ri->bandwidthburst = (int)options->RelayBandwidthBurst; + ri->bandwidthburst = get_effective_bwburst(options); ri->bandwidthcapacity = hibernating ? 0 : rep_hist_bandwidth_assess(); policies_parse_exit_policy(options->ExitPolicy, &ri->exit_policy, options->ExitPolicyRejectPrivate, - ri->address); + ri->address, !options->BridgeRelay); if (desc_routerinfo) { /* inherit values */ ri->is_valid = desc_routerinfo->is_valid; @@ -1304,7 +1315,7 @@ family = smartlist_create(); ri->declared_family = smartlist_create(); smartlist_split_string(family, options->MyFamily, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + SPLIT_SKIP_SPACE|SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); SMARTLIST_FOREACH(family, char *, name, { routerinfo_t *member; @@ -1359,10 +1370,12 @@ ei->cache_info.published_on = ri->cache_info.published_on; memcpy(ei->cache_info.identity_digest, ri->cache_info.identity_digest, DIGEST_LEN); - ei->cache_info.signed_descriptor_body = tor_malloc(8192); - if (extrainfo_dump_to_string(ei->cache_info.signed_descriptor_body, 8192, - ei, get_identity_key()) < 0) { + ei_size = options->ExtraInfoStatistics ? MAX_EXTRAINFO_UPLOAD_SIZE : 8192; + ei->cache_info.signed_descriptor_body = tor_malloc(ei_size); + if (extrainfo_dump_to_string(ei->cache_info.signed_descriptor_body, + ei_size, ei, get_identity_key()) < 0) { log_warn(LD_BUG, "Couldn't generate extra-info descriptor."); + routerinfo_free(ri); extrainfo_free(ei); return -1; } @@ -1379,6 +1392,8 @@ if (router_dump_router_to_string(ri->cache_info.signed_descriptor_body, 8192, ri, get_identity_key())<0) { log_warn(LD_BUG, "Couldn't generate router descriptor."); + routerinfo_free(ri); + extrainfo_free(ei); return -1; } ri->cache_info.signed_descriptor_len = @@ -1386,21 +1401,24 @@ ri->purpose = options->BridgeRelay ? ROUTER_PURPOSE_BRIDGE : ROUTER_PURPOSE_GENERAL; - if (!options->BridgeRelay) { - ri->cache_info.send_unencrypted = 1; + ri->cache_info.send_unencrypted = 1; + /* Let bridges serve their own descriptors unencrypted, so they can + * pass reachability testing. (If they want to be harder to notice, + * they can always leave the DirPort off). */ + if (!options->BridgeRelay) ei->cache_info.send_unencrypted = 1; - } router_get_router_hash(ri->cache_info.signed_descriptor_body, + strlen(ri->cache_info.signed_descriptor_body), ri->cache_info.signed_descriptor_digest); + routerinfo_set_country(ri); + tor_assert(! routerinfo_incompatible_with_extrainfo(ri, ei, NULL, NULL)); - if (desc_routerinfo) - routerinfo_free(desc_routerinfo); + routerinfo_free(desc_routerinfo); desc_routerinfo = ri; - if (desc_extrainfo) - extrainfo_free(desc_extrainfo); + extrainfo_free(desc_extrainfo); desc_extrainfo = ei; desc_clean_since = time(NULL); @@ -1455,7 +1473,8 @@ /** Note at log level severity that our best guess of address has changed from * prev to cur. */ static void -log_addr_has_changed(int severity, uint32_t prev, uint32_t cur) +log_addr_has_changed(int severity, uint32_t prev, uint32_t cur, + const char *source) { char addrbuf_prev[INET_NTOA_BUF_LEN]; char addrbuf_cur[INET_NTOA_BUF_LEN]; @@ -1471,12 +1490,12 @@ if (prev) log_fn(severity, LD_GENERAL, "Our IP Address has changed from %s to %s; " - "rebuilding descriptor.", - addrbuf_prev, addrbuf_cur); + "rebuilding descriptor (source: %s).", + addrbuf_prev, addrbuf_cur, source); else log_notice(LD_GENERAL, - "Guessed our IP address as %s.", - addrbuf_cur); + "Guessed our IP address as %s (source: %s).", + addrbuf_cur, source); } /** Check whether our own address as defined by the Address configuration @@ -1499,7 +1518,7 @@ } if (prev != cur) { - log_addr_has_changed(LOG_INFO, prev, cur); + log_addr_has_changed(LOG_NOTICE, prev, cur, "resolve"); ip_address_changed(0); } } @@ -1544,7 +1563,7 @@ /* Don't believe anybody who says our IP is, say, 127.0.0.1. */ return; } - if (addr == d_conn->_base.addr) { + if (tor_addr_eq_ipv4h(&d_conn->_base.addr, addr)) { /* Don't believe anybody who says our IP is their IP. */ log_debug(LD_DIR, "A directory server told us our IP address is %s, " "but he's just reporting his own IP address. Ignoring.", @@ -1559,7 +1578,8 @@ control_event_server_status(LOG_NOTICE, "EXTERNAL_ADDRESS ADDRESS=%s METHOD=DIRSERV", suggestion); - log_addr_has_changed(LOG_NOTICE, last_guessed_ip, addr); + log_addr_has_changed(LOG_NOTICE, last_guessed_ip, addr, + d_conn->_base.address); ip_address_changed(0); last_guessed_ip = addr; /* router_rebuild_descriptor() will fetch it */ } @@ -1579,8 +1599,6 @@ return -1; } -extern const char tor_svn_revision[]; /* from main.c */ - /** Set platform (max length len) to a NUL-terminated short * string describing the version of Tor and the operating system we're * currently running on. @@ -1639,7 +1657,7 @@ return -1; } - /* PEM-encode the identity key key */ + /* PEM-encode the identity key */ if (crypto_pk_write_public_key_to_string(router->identity_pkey, &identity_pkey,&identity_pkeylen)<0) { log_warn(LD_BUG,"write identity_pkey to string failed!"); @@ -1676,7 +1694,7 @@ "opt extra-info-digest %s\n%s" "onion-key\n%s" "signing-key\n%s" - "%s%s%s", + "%s%s%s%s", router->nickname, router->address, router->or_port, @@ -1693,7 +1711,8 @@ onion_pkey, identity_pkey, family_line, we_are_hibernating() ? "opt hibernating 1\n" : "", - options->HidServDirectoryV2 ? "opt hidden-service-dir\n" : ""); + options->HidServDirectoryV2 ? "opt hidden-service-dir\n" : "", + options->AllowSingleHopExits ? "opt allow-single-hop-exits\n" : ""); tor_free(family_line); tor_free(onion_pkey); @@ -1729,7 +1748,7 @@ int i; for (i = 0; i < smartlist_len(router->exit_policy); ++i) { tmpe = smartlist_get(router->exit_policy, i); - result = policy_write_item(s+written, maxlen-written, tmpe); + result = policy_write_item(s+written, maxlen-written, tmpe, 1); if (result < 0) { log_warn(LD_BUG,"descriptor policy_write_item ran out of room!"); return -1; @@ -1749,17 +1768,17 @@ return -1; } - /* Sign the directory */ + /* Sign the descriptor */ strlcpy(s+written, "router-signature\n", maxlen-written); written += strlen(s+written); s[written] = '\0'; - if (router_get_router_hash(s, digest) < 0) { + if (router_get_router_hash(s, strlen(s), digest) < 0) { return -1; } note_crypto_pk_op(SIGN_RTR); if (router_append_dirobj_signature(s+written,maxlen-written, - digest,ident_key)<0) { + digest,DIGEST_LEN,ident_key)<0) { log_warn(LD_BUG, "Couldn't sign router descriptor"); return -1; } @@ -1794,6 +1813,57 @@ return (int)written+1; } +/** Load the contents of filename, find the last line starting with + * end_line, ensure that its timestamp is not more than 25 hours in + * the past or more than 1 hour in the future with respect to now, + * and write the file contents starting with that line to *out. + * Return 1 for success, 0 if the file does not exist, or -1 if the file + * does not contain a line matching these criteria or other failure. */ +static int +load_stats_file(const char *filename, const char *end_line, time_t now, + char **out) +{ + int r = -1; + char *fname = get_datadir_fname(filename); + char *contents, *start = NULL, *tmp, timestr[ISO_TIME_LEN+1]; + time_t written; + switch (file_status(fname)) { + case FN_FILE: + /* X022 Find an alternative to reading the whole file to memory. */ + if ((contents = read_file_to_str(fname, 0, NULL))) { + tmp = strstr(contents, end_line); + /* Find last block starting with end_line */ + while (tmp) { + start = tmp; + tmp = strstr(tmp + 1, end_line); + } + if (!start) + goto notfound; + if (strlen(start) < strlen(end_line) + 1 + sizeof(timestr)) + goto notfound; + strlcpy(timestr, start + 1 + strlen(end_line), sizeof(timestr)); + if (parse_iso_time(timestr, &written) < 0) + goto notfound; + if (written < now - (25*60*60) || written > now + (1*60*60)) + goto notfound; + *out = tor_strdup(start); + r = 1; + } + notfound: + tor_free(contents); + break; + case FN_NOENT: + r = 0; + break; + case FN_ERROR: + case FN_DIR: + default: + break; + } + tor_free(fname); + return r; +} + /** Write the contents of extrainfo to the maxlen-byte string * s, signing them with ident_key. Return 0 on success, * negative on failure. */ @@ -1808,6 +1878,8 @@ char *bandwidth_usage; int result; size_t len; + static int write_stats_to_extrainfo = 1; + time_t now = time(NULL); base16_encode(identity, sizeof(identity), extrainfo->cache_info.identity_digest, DIGEST_LEN); @@ -1819,29 +1891,79 @@ "published %s\n%s", extrainfo->nickname, identity, published, bandwidth_usage); + tor_free(bandwidth_usage); if (result<0) return -1; - if (should_record_bridge_info(options)) { - static time_t last_purged_at = 0; - char *geoip_summary; - time_t now = time(NULL); - if (now > last_purged_at+48*60*60) { - geoip_remove_old_clients(now-48*60*60); - last_purged_at = now; - } - geoip_summary = geoip_get_client_history(time(NULL)); - if (geoip_summary) { - char geoip_start[ISO_TIME_LEN+1]; - format_iso_time(geoip_start, geoip_get_history_start()); - result = tor_snprintf(s+strlen(s), maxlen-strlen(s), - "geoip-start-time %s\n" - "geoip-client-origins %s\n", - geoip_start, geoip_summary); - tor_free(geoip_summary); - if (result<0) - return -1; + if (options->ExtraInfoStatistics && write_stats_to_extrainfo) { + char *contents = NULL; + log_info(LD_GENERAL, "Adding stats to extra-info descriptor."); + if (options->DirReqStatistics && + load_stats_file("stats"PATH_SEPARATOR"dirreq-stats", + "dirreq-stats-end", now, &contents) > 0) { + size_t pos = strlen(s); + if (strlcpy(s + pos, contents, maxlen - strlen(s)) != + strlen(contents)) { + log_warn(LD_DIR, "Could not write dirreq-stats to extra-info " + "descriptor."); + s[pos] = '\0'; + write_stats_to_extrainfo = 0; + } + tor_free(contents); + } + if (options->EntryStatistics && + load_stats_file("stats"PATH_SEPARATOR"entry-stats", + "entry-stats-end", now, &contents) > 0) { + size_t pos = strlen(s); + if (strlcpy(s + pos, contents, maxlen - strlen(s)) != + strlen(contents)) { + log_warn(LD_DIR, "Could not write entry-stats to extra-info " + "descriptor."); + s[pos] = '\0'; + write_stats_to_extrainfo = 0; + } + tor_free(contents); + } + if (options->CellStatistics && + load_stats_file("stats"PATH_SEPARATOR"buffer-stats", + "cell-stats-end", now, &contents) > 0) { + size_t pos = strlen(s); + if (strlcpy(s + pos, contents, maxlen - strlen(s)) != + strlen(contents)) { + log_warn(LD_DIR, "Could not write buffer-stats to extra-info " + "descriptor."); + s[pos] = '\0'; + write_stats_to_extrainfo = 0; + } + tor_free(contents); + } + if (options->ExitPortStatistics && + load_stats_file("stats"PATH_SEPARATOR"exit-stats", + "exit-stats-end", now, &contents) > 0) { + size_t pos = strlen(s); + if (strlcpy(s + pos, contents, maxlen - strlen(s)) != + strlen(contents)) { + log_warn(LD_DIR, "Could not write exit-stats to extra-info " + "descriptor."); + s[pos] = '\0'; + write_stats_to_extrainfo = 0; + } + tor_free(contents); + } + } + + if (should_record_bridge_info(options) && write_stats_to_extrainfo) { + const char *bridge_stats = geoip_get_bridge_stats_extrainfo(now); + if (bridge_stats) { + size_t pos = strlen(s); + if (strlcpy(s + pos, bridge_stats, maxlen - strlen(s)) != + strlen(bridge_stats)) { + log_warn(LD_DIR, "Could not write bridge-stats to extra-info " + "descriptor."); + s[pos] = '\0'; + write_stats_to_extrainfo = 0; + } } } @@ -1850,10 +1972,10 @@ len += strlen(s+len); if (router_get_extrainfo_hash(s, digest)<0) return -1; - if (router_append_dirobj_signature(s+len, maxlen-len, digest, ident_key)<0) + if (router_append_dirobj_signature(s+len, maxlen-len, digest, DIGEST_LEN, + ident_key)<0) return -1; -#ifdef DEBUG_ROUTER_DUMP_ROUTER_TO_STRING { char *cp, *s_dup; extrainfo_t *ei_tmp; @@ -1863,12 +1985,30 @@ log_err(LD_BUG, "We just generated an extrainfo descriptor we can't parse."); log_err(LD_BUG, "Descriptor was: <<%s>>", s); + tor_free(s_dup); return -1; } tor_free(s_dup); extrainfo_free(ei_tmp); } -#endif + + if (options->ExtraInfoStatistics && write_stats_to_extrainfo) { + char *cp, *s_dup; + extrainfo_t *ei_tmp; + cp = s_dup = tor_strdup(s); + ei_tmp = extrainfo_parse_entry_from_string(cp, NULL, 1, NULL); + if (!ei_tmp) { + log_warn(LD_GENERAL, + "We just generated an extra-info descriptor with " + "statistics that we can't parse. Not adding statistics to " + "this or any future extra-info descriptors. Descriptor " + "was:\n%s", s); + write_stats_to_extrainfo = 0; + extrainfo_dump_to_string(s, maxlen, extrainfo, ident_key); + } + tor_free(s_dup); + extrainfo_free(ei_tmp); + } return (int)strlen(s)+1; } @@ -1925,7 +2065,7 @@ * The router's nickname. **/ void -router_get_verbose_nickname(char *buf, routerinfo_t *router) +router_get_verbose_nickname(char *buf, const routerinfo_t *router) { buf[0] = '$'; base16_encode(buf+1, HEX_DIGEST_LEN+1, router->cache_info.identity_digest, @@ -1934,6 +2074,23 @@ strlcpy(buf+1+HEX_DIGEST_LEN+1, router->nickname, MAX_NICKNAME_LEN+1); } +/** Set buf (which must have MAX_VERBOSE_NICKNAME_LEN+1 bytes) to the + * verbose representation of the identity of router. The format is: + * A dollar sign. + * The upper-case hexadecimal encoding of the SHA1 hash of router's identity. + * A "=" if the router is named; a "~" if it is not. + * The router's nickname. + **/ +void +routerstatus_get_verbose_nickname(char *buf, const routerstatus_t *router) +{ + buf[0] = '$'; + base16_encode(buf+1, HEX_DIGEST_LEN+1, router->identity_digest, + DIGEST_LEN); + buf[1+HEX_DIGEST_LEN] = router->is_named ? '=' : '~'; + strlcpy(buf+1+HEX_DIGEST_LEN+1, router->nickname, MAX_NICKNAME_LEN+1); +} + /** Forget that we have issued any router-related warnings, so that we'll * warn again if we see the same errors. */ void @@ -1980,26 +2137,16 @@ void router_free_all(void) { - if (onionkey) - crypto_free_pk_env(onionkey); - if (lastonionkey) - crypto_free_pk_env(lastonionkey); - if (identitykey) - crypto_free_pk_env(identitykey); - if (key_lock) - tor_mutex_free(key_lock); - if (desc_routerinfo) - routerinfo_free(desc_routerinfo); - if (desc_extrainfo) - extrainfo_free(desc_extrainfo); - if (authority_signing_key) - crypto_free_pk_env(authority_signing_key); - if (authority_key_certificate) - authority_cert_free(authority_key_certificate); - if (legacy_signing_key) - crypto_free_pk_env(legacy_signing_key); - if (legacy_key_certificate) - authority_cert_free(legacy_key_certificate); + crypto_free_pk_env(onionkey); + crypto_free_pk_env(lastonionkey); + crypto_free_pk_env(identitykey); + tor_mutex_free(key_lock); + routerinfo_free(desc_routerinfo); + extrainfo_free(desc_extrainfo); + crypto_free_pk_env(authority_signing_key); + authority_cert_free(authority_key_certificate); + crypto_free_pk_env(legacy_signing_key); + authority_cert_free(legacy_key_certificate); if (warned_nonexistent_family) { SMARTLIST_FOREACH(warned_nonexistent_family, char *, cp, tor_free(cp)); diff -Nru tor-0.2.0.34/src/or/router.h tor-0.2.2.16-alpha/src/or/router.h --- tor-0.2.0.34/src/or/router.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/router.h 2010-08-11 03:14:17.000000000 +0000 @@ -0,0 +1,95 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file router.h + * \brief Header file for router.c. + **/ + +#ifndef _TOR_ROUTER_H +#define _TOR_ROUTER_H + +crypto_pk_env_t *get_onion_key(void); +time_t get_onion_key_set_at(void); +void set_identity_key(crypto_pk_env_t *k); +crypto_pk_env_t *get_identity_key(void); +int identity_key_is_set(void); +authority_cert_t *get_my_v3_authority_cert(void); +crypto_pk_env_t *get_my_v3_authority_signing_key(void); +authority_cert_t *get_my_v3_legacy_cert(void); +crypto_pk_env_t *get_my_v3_legacy_signing_key(void); +void dup_onion_keys(crypto_pk_env_t **key, crypto_pk_env_t **last); +void rotate_onion_key(void); +crypto_pk_env_t *init_key_from_file(const char *fname, int generate, + int severity); +void v3_authority_check_key_expiry(void); + +int init_keys(void); + +int check_whether_orport_reachable(void); +int check_whether_dirport_reachable(void); +void consider_testing_reachability(int test_or, int test_dir); +void router_orport_found_reachable(void); +void router_dirport_found_reachable(void); +void router_perform_bandwidth_test(int num_circs, time_t now); + +int authdir_mode(or_options_t *options); +int authdir_mode_v1(or_options_t *options); +int authdir_mode_v2(or_options_t *options); +int authdir_mode_v3(or_options_t *options); +int authdir_mode_any_main(or_options_t *options); +int authdir_mode_any_nonhidserv(or_options_t *options); +int authdir_mode_handles_descs(or_options_t *options, int purpose); +int authdir_mode_publishes_statuses(or_options_t *options); +int authdir_mode_tests_reachability(or_options_t *options); +int authdir_mode_bridge(or_options_t *options); + +int server_mode(or_options_t *options); +int advertised_server_mode(void); +int proxy_mode(or_options_t *options); +void consider_publishable_server(int force); + +void router_upload_dir_desc_to_dirservers(int force); +void mark_my_descriptor_dirty_if_older_than(time_t when); +void mark_my_descriptor_dirty(void); +void check_descriptor_bandwidth_changed(time_t now); +void check_descriptor_ipaddress_changed(time_t now); +void router_new_address_suggestion(const char *suggestion, + const dir_connection_t *d_conn); +int router_compare_to_my_exit_policy(edge_connection_t *conn); +routerinfo_t *router_get_my_routerinfo(void); +extrainfo_t *router_get_my_extrainfo(void); +const char *router_get_my_descriptor(void); +int router_digest_is_me(const char *digest); +int router_extrainfo_digest_is_me(const char *digest); +int router_is_me(routerinfo_t *router); +int router_fingerprint_is_me(const char *fp); +int router_pick_published_address(or_options_t *options, uint32_t *addr); +int router_rebuild_descriptor(int force); +int router_dump_router_to_string(char *s, size_t maxlen, routerinfo_t *router, + crypto_pk_env_t *ident_key); +int extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo, + crypto_pk_env_t *ident_key); +int is_legal_nickname(const char *s); +int is_legal_nickname_or_hexdigest(const char *s); +int is_legal_hexdigest(const char *s); +void router_get_verbose_nickname(char *buf, const routerinfo_t *router); +void routerstatus_get_verbose_nickname(char *buf, + const routerstatus_t *router); +void router_reset_warnings(void); +void router_reset_reachability(void); +void router_free_all(void); + +const char *router_purpose_to_string(uint8_t p); +uint8_t router_purpose_from_string(const char *s); + +#ifdef ROUTER_PRIVATE +/* Used only by router.c and test.c */ +void get_platform_str(char *platform, size_t len); +#endif + +#endif + diff -Nru tor-0.2.0.34/src/or/routerlist.c tor-0.2.2.16-alpha/src/or/routerlist.c --- tor-0.2.0.34/src/or/routerlist.c 2009-01-20 08:10:49.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/routerlist.c 2010-09-17 01:30:36.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: routerlist.c 18187 2009-01-20 08:10:48Z arma $ */ -const char routerlist_c_id[] = - "$Id: routerlist.c 18187 2009-01-20 08:10:48Z arma $"; /** * \file routerlist.c @@ -15,6 +12,25 @@ **/ #include "or.h" +#include "circuitbuild.h" +#include "config.h" +#include "connection.h" +#include "control.h" +#include "directory.h" +#include "dirserv.h" +#include "dirvote.h" +#include "geoip.h" +#include "hibernate.h" +#include "main.h" +#include "networkstatus.h" +#include "policies.h" +#include "reasons.h" +#include "rendcommon.h" +#include "rendservice.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" // #define DEBUG_ROUTERLIST @@ -24,13 +40,13 @@ static routerstatus_t *router_pick_directory_server_impl( authority_type_t auth, int flags); static routerstatus_t *router_pick_trusteddirserver_impl( - authority_type_t auth, int flags); + authority_type_t auth, int flags, int *n_busy_out); static void mark_all_trusteddirservers_up(void); static int router_nickname_matches(routerinfo_t *router, const char *nickname); static void trusted_dir_server_free(trusted_dir_server_t *ds); static void launch_router_descriptor_downloads(smartlist_t *downloadable, + routerstatus_t *source, time_t now); -static void update_consensus_router_descriptor_downloads(time_t now); static int signed_desc_digest_is_recognized(signed_descriptor_t *desc); static void update_router_have_minimum_dir_info(void); static const char *signed_descriptor_get_body_impl(signed_descriptor_t *desc, @@ -80,6 +96,13 @@ * download is low. */ static time_t last_routerdesc_download_attempted = 0; +/** When we last computed the weights to use for bandwidths on directory + * requests, what were the total weighted bandwidth, and our share of that + * bandwidth? Used to determine what fraction of directory requests we should + * expect to see. */ +static uint64_t sl_last_total_weighted_bw = 0, + sl_last_weighted_bw_of_me = 0; + /** Return the number of directory authorities whose type matches some bit set * in type */ int @@ -107,6 +130,7 @@ cl = digestmap_get(trusted_dir_certs, id_digest); if (!cl) { cl = tor_malloc_zero(sizeof(cert_list_t)); + cl->dl_status.schedule = DL_SCHED_CONSENSUS; cl->certs = smartlist_create(); digestmap_set(trusted_dir_certs, id_digest, cl); } @@ -151,21 +175,24 @@ /** Load a bunch of new key certificates from the string contents. If * from_store is true, the certificates are from the cache, and we - * don't need to flush them to disk. If from_store is false, we need - * to flush any changed certificates to disk. Return 0 on success, -1 on - * failure. */ + * don't need to flush them to disk. If flush is true, we need + * to flush any changed certificates to disk now. Return 0 on success, -1 + * if any certs fail to parse. */ int trusted_dirs_load_certs_from_string(const char *contents, int from_store, int flush) { trusted_dir_server_t *ds; const char *s, *eos; + int failure_code = 0; for (s = contents; *s; s = eos) { authority_cert_t *cert = authority_cert_parse_from_string(s, &eos); cert_list_t *cl; - if (!cert) + if (!cert) { + failure_code = -1; break; + } ds = trusteddirserver_get_by_v3_auth_digest( cert->cache_info.identity_digest); log_debug(LD_DIR, "Parsed certificate for %s", @@ -176,7 +203,18 @@ log_info(LD_DIR, "Skipping %s certificate for %s that we " "already have.", from_store ? "cached" : "downloaded", - ds ? ds->nickname : "??"); + ds ? ds->nickname : "an old or new authority"); + + /* a duplicate on a download should be treated as a failure, since it + * probably means we wanted a different secret key or we are trying to + * replace an expired cert that has not in fact been updated. */ + if (!from_store) { + log_warn(LD_DIR, "Got a certificate for %s, but we already have it. " + "Maybe they haven't updated it. Waiting for a while.", + ds ? ds->nickname : "an old or new authority"); + authority_cert_dl_failed(cert->cache_info.identity_digest, 404); + } + authority_cert_free(cert); continue; } @@ -186,10 +224,16 @@ "signing key %s", from_store ? "cached" : "downloaded", ds->nickname, hex_str(cert->signing_key_digest,DIGEST_LEN)); } else { - log_info(LD_DIR, "Adding %s certificate for unrecognized directory " + int adding = directory_caches_dir_info(get_options()); + log_info(LD_DIR, "%s %s certificate for unrecognized directory " "authority with signing key %s", + adding ? "Adding" : "Not adding", from_store ? "cached" : "downloaded", hex_str(cert->signing_key_digest,DIGEST_LEN)); + if (!adding) { + authority_cert_free(cert); + continue; + } } cl = get_cert_list(cert->cache_info.identity_digest); @@ -200,9 +244,9 @@ if (cert->addr && cert->dir_port && (ds->addr != cert->addr || ds->dir_port != cert->dir_port)) { - char *a = tor_dup_addr(cert->addr); + char *a = tor_dup_ip(cert->addr); log_notice(LD_DIR, "Updating address for directory authority %s " - "from %s:%d to %s:%d based on in certificate.", + "from %s:%d to %s:%d based on certificate.", ds->nickname, ds->address, (int)ds->dir_port, a, cert->dir_port); tor_free(a); @@ -219,8 +263,11 @@ if (flush) trusted_dirs_flush_certs_to_disk(); + /* call this even if failure_code is <0, since some certs might have + * succeeded. */ networkstatus_note_certs_arrived(); - return 0; + + return failure_code; } /** Save all v3 key certificates to the cached-certs file. */ @@ -262,7 +309,9 @@ static void trusted_dirs_remove_old_certs(void) { -#define OLD_CERT_LIFETIME (48*60*60) + time_t now = time(NULL); +#define DEAD_CERT_LIFETIME (2*24*60*60) +#define OLD_CERT_LIFETIME (7*24*60*60) if (!trusted_dir_certs) return; @@ -272,13 +321,26 @@ if (!newest || (cert->cache_info.published_on > newest->cache_info.published_on)) newest = cert); - SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert, - if (newest && (newest->cache_info.published_on > - cert->cache_info.published_on + OLD_CERT_LIFETIME)) { - SMARTLIST_DEL_CURRENT(cl->certs, cert); - authority_cert_free(cert); - trusted_dir_servers_certs_changed = 1; - }); + if (newest) { + const time_t newest_published = newest->cache_info.published_on; + SMARTLIST_FOREACH_BEGIN(cl->certs, authority_cert_t *, cert) { + int expired; + time_t cert_published; + if (newest == cert) + continue; + expired = ftime_definitely_after(now, cert->expires); + cert_published = cert->cache_info.published_on; + /* Store expired certs for 48 hours after a newer arrives; + */ + if (expired ? + (newest_published + DEAD_CERT_LIFETIME < now) : + (cert_published + OLD_CERT_LIFETIME < newest_published)) { + SMARTLIST_DEL_CURRENT(cl->certs, cert); + authority_cert_free(cert); + trusted_dir_servers_certs_changed = 1; + } + } SMARTLIST_FOREACH_END(cert); + } } DIGESTMAP_FOREACH_END; #undef OLD_CERT_LIFETIME @@ -306,7 +368,7 @@ } /** Return the newest v3 authority certificate whose directory signing key has - * giest . Return NULL if no such certificate is known. + * digest sk_digest. Return NULL if no such certificate is known. */ authority_cert_t * authority_cert_get_by_sk_digest(const char *sk_digest) @@ -378,6 +440,23 @@ download_status_failed(&cl->dl_status, status); } +/** Return true iff when we've been getting enough failures when trying to + * download the certificate with ID digest id_digest that we're willing + * to start bugging the user about it. */ +int +authority_cert_dl_looks_uncertain(const char *id_digest) +{ +#define N_AUTH_CERT_DL_FAILURES_TO_BUG_USER 2 + cert_list_t *cl; + int n_failures; + if (!trusted_dir_certs || + !(cl = digestmap_get(trusted_dir_certs, id_digest))) + return 0; + + n_failures = download_status_get_n_failures(&cl->dl_status); + return n_failures >= N_AUTH_CERT_DL_FAILURES_TO_BUG_USER; +} + /** How many times will we try to fetch a certificate before giving up? */ #define MAX_CERT_DL_FAILURES 8 @@ -391,6 +470,7 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now) { digestmap_t *pending; + authority_cert_t *cert; smartlist_t *missing_digests; char *resource = NULL; cert_list_t *cl; @@ -404,54 +484,58 @@ list_pending_downloads(pending, DIR_PURPOSE_FETCH_CERTIFICATE, "fp/"); if (status) { - SMARTLIST_FOREACH(status->voters, networkstatus_voter_info_t *, voter, - { - if (tor_digest_is_zero(voter->signing_key_digest)) - continue; /* This authority never signed this consensus, so don't - * go looking for a cert with key digest 0000000000. */ - if (!cache && - !trusteddirserver_get_by_v3_auth_digest(voter->identity_digest)) - continue; /* We are not a cache, and we don't know this authority.*/ - cl = get_cert_list(voter->identity_digest); - if (authority_cert_get_by_digests(voter->identity_digest, - voter->signing_key_digest)) { - download_status_reset(&cl->dl_status); + SMARTLIST_FOREACH_BEGIN(status->voters, networkstatus_voter_info_t *, + voter) { + if (!smartlist_len(voter->sigs)) + continue; /* This authority never signed this consensus, so don't + * go looking for a cert with key digest 0000000000. */ + if (!cache && + !trusteddirserver_get_by_v3_auth_digest(voter->identity_digest)) + continue; /* We are not a cache, and we don't know this authority.*/ + cl = get_cert_list(voter->identity_digest); + SMARTLIST_FOREACH_BEGIN(voter->sigs, document_signature_t *, sig) { + cert = authority_cert_get_by_digests(voter->identity_digest, + sig->signing_key_digest); + if (cert) { + if (now < cert->expires) + download_status_reset(&cl->dl_status); continue; } if (download_status_is_ready(&cl->dl_status, now, - MAX_CERT_DL_FAILURES)) { + MAX_CERT_DL_FAILURES) && + !digestmap_get(pending, voter->identity_digest)) { log_notice(LD_DIR, "We're missing a certificate from authority " "with signing key %s: launching request.", - hex_str(voter->signing_key_digest, DIGEST_LEN)); - smartlist_add(missing_digests, voter->identity_digest); + hex_str(sig->signing_key_digest, DIGEST_LEN)); + smartlist_add(missing_digests, sig->identity_digest); } - }); + } SMARTLIST_FOREACH_END(sig); + } SMARTLIST_FOREACH_END(voter); } - SMARTLIST_FOREACH(trusted_dir_servers, trusted_dir_server_t *, ds, - { - int found = 0; - if (!(ds->type & V3_AUTHORITY)) - continue; - if (smartlist_digest_isin(missing_digests, ds->v3_identity_digest)) - continue; - cl = get_cert_list(ds->v3_identity_digest); - SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert, - { - if (!ftime_definitely_after(now, cert->expires)) { - /* It's not expired, and we weren't looking for something to - * verify a consensus with. Call it done. */ - download_status_reset(&cl->dl_status); - found = 1; - break; - } - }); - if (!found && download_status_is_ready(&cl->dl_status, now, - MAX_CERT_DL_FAILURES)) { - log_notice(LD_DIR, "No current certificate known for authority %s; " - "launching request.", ds->nickname); - smartlist_add(missing_digests, ds->v3_identity_digest); + SMARTLIST_FOREACH_BEGIN(trusted_dir_servers, trusted_dir_server_t *, ds) { + int found = 0; + if (!(ds->type & V3_AUTHORITY)) + continue; + if (smartlist_digest_isin(missing_digests, ds->v3_identity_digest)) + continue; + cl = get_cert_list(ds->v3_identity_digest); + SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert, { + if (!ftime_definitely_after(now, cert->expires)) { + /* It's not expired, and we weren't looking for something to + * verify a consensus with. Call it done. */ + download_status_reset(&cl->dl_status); + found = 1; + break; } }); + if (!found && + download_status_is_ready(&cl->dl_status, now,MAX_CERT_DL_FAILURES) && + !digestmap_get(pending, ds->v3_identity_digest)) { + log_notice(LD_DIR, "No current certificate known for authority %s; " + "launching request.", ds->nickname); + smartlist_add(missing_digests, ds->v3_identity_digest); + } + } SMARTLIST_FOREACH_END(ds); if (!smartlist_len(missing_digests)) { goto done; @@ -480,7 +564,7 @@ smartlist_free(fps); } directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0, - resource, 1); + resource, PDS_RETRY_IF_NO_SERVERS); done: tor_free(resource); @@ -513,6 +597,8 @@ return store->journal_len > (1<<15); } +/** Return the desc_store_t in rl that should be used to store + * sd. */ static INLINE desc_store_t * desc_get_store(routerlist_t *rl, signed_descriptor_t *sd) { @@ -533,8 +619,6 @@ const char *body = signed_descriptor_get_body_impl(desc,1); size_t len = desc->signed_descriptor_len + desc->annotations_len; - tor_assert(len == strlen(body)); - if (append_bytes_to_file(fname, body, len, 1)) { log_warn(LD_FS, "Unable to store router descriptor"); tor_free(fname); @@ -562,12 +646,11 @@ #define RRS_FORCE 1 #define RRS_DONT_REMOVE_OLD 2 -/** If the journal is too long, or if RRS_FORCE is set in flags, then - * atomically replace the router store with the routers currently in our - * routerlist, and clear the journal. Return 0 on success, -1 on failure. - * - * If extrainfo is true, rebuild the extrainfo store; else rebuild the - * router descriptor store. +/** If the journal of store is too long, or if RRS_FORCE is set in + * flags, then atomically replace the saved router store with the + * routers currently in our routerlist, and clear the journal. Unless + * RRS_DONT_REMOVE_OLD is set in flags, delete expired routers before + * rebuilding the store. Return 0 on success, -1 on failure. */ static int router_rebuild_store(int flags, desc_store_t *store) @@ -582,10 +665,14 @@ int had_any; int force = flags & RRS_FORCE; - if (!force && !router_should_rebuild_store(store)) - return 0; - if (!routerlist) - return 0; + if (!force && !router_should_rebuild_store(store)) { + r = 0; + goto done; + } + if (!routerlist) { + r = 0; + goto done; + } if (store->type == EXTRAINFO_STORE) had_any = !eimap_isempty(routerlist->extra_info_map); @@ -704,12 +791,13 @@ store->journal_len = 0; store->bytes_dropped = 0; done: - if (signed_descriptors) - smartlist_free(signed_descriptors); + smartlist_free(signed_descriptors); tor_free(fname); tor_free(fname_tmp); - SMARTLIST_FOREACH(chunk_list, sized_chunk_t *, c, tor_free(c)); - smartlist_free(chunk_list); + if (chunk_list) { + SMARTLIST_FOREACH(chunk_list, sized_chunk_t *, c, tor_free(c)); + smartlist_free(chunk_list); + } return r; } @@ -859,22 +947,48 @@ mark_all_trusteddirservers_up(); /* try again */ choice = router_pick_directory_server_impl(type, flags); - if (choice) - return choice; + return choice; +} - /* XXXX021 arma: what's the point of *reloading* and trying again?? -NM */ - /* XXXX021 once upon a time, reloading set the is_running back - to 1. i think. i bet it has no purpose now. */ - /* XXXX021 Let's stop reloading in 0.2.1.x, then, and see if anything - * breaks -NM */ - log_info(LD_DIR,"Still no %s router entries. Reloading and trying again.", - (flags & PDS_IGNORE_FASCISTFIREWALL) ? "known" : "reachable"); - if (router_reload_router_list()) { - return NULL; +/** Try to determine which fraction of v2 and v3 directory requests aimed at + * caches will be sent to us. Set *v2_share_out and + * *v3_share_out to the fractions of v2 and v3 protocol shares we + * expect to see, respectively. Return 0 on success, negative on failure. */ +int +router_get_my_share_of_directory_requests(double *v2_share_out, + double *v3_share_out) +{ + routerinfo_t *me = router_get_my_routerinfo(); + routerstatus_t *rs; + const int pds_flags = PDS_ALLOW_SELF|PDS_IGNORE_FASCISTFIREWALL; + *v2_share_out = *v3_share_out = 0.0; + if (!me) + return -1; + rs = router_get_consensus_status_by_id(me->cache_info.identity_digest); + if (!rs) + return -1; + + /* Calling for side effect */ + /* XXXX This is a bit of a kludge */ + if (rs->is_v2_dir) { + sl_last_total_weighted_bw = 0; + router_pick_directory_server(V2_AUTHORITY, pds_flags); + if (sl_last_total_weighted_bw != 0) { + *v2_share_out = U64_TO_DBL(sl_last_weighted_bw_of_me) / + U64_TO_DBL(sl_last_total_weighted_bw); + } } - /* give it one last try */ - choice = router_pick_directory_server_impl(type, flags); - return choice; + + if (rs->version_supports_v3_dir) { + sl_last_total_weighted_bw = 0; + router_pick_directory_server(V3_AUTHORITY, pds_flags); + if (sl_last_total_weighted_bw != 0) { + *v3_share_out = U64_TO_DBL(sl_last_weighted_bw_of_me) / + U64_TO_DBL(sl_last_total_weighted_bw); + } + } + + return 0; } /** Return the trusted_dir_server_t for the directory authority whose identity @@ -895,8 +1009,9 @@ return NULL; } -/** Return the trusted_dir_server_t for the directory authority whose identity - * key hashes to digest, or NULL if no such authority is known. +/** Return the trusted_dir_server_t for the directory authority whose + * v3 identity key hashes to digest, or NULL if no such authority + * is known. */ trusted_dir_server_t * trusteddirserver_get_by_v3_auth_digest(const char *digest) @@ -921,17 +1036,25 @@ router_pick_trusteddirserver(authority_type_t type, int flags) { routerstatus_t *choice; + int busy = 0; if (get_options()->PreferTunneledDirConns) flags |= _PDS_PREFER_TUNNELED_DIR_CONNS; - choice = router_pick_trusteddirserver_impl(type, flags); + choice = router_pick_trusteddirserver_impl(type, flags, &busy); if (choice || !(flags & PDS_RETRY_IF_NO_SERVERS)) return choice; + if (busy) { + /* If the reason that we got no server is that servers are "busy", + * we must be excluding good servers because we already have serverdesc + * fetches with them. Do not mark down servers up because of this. */ + tor_assert((flags & PDS_NO_EXISTING_SERVERDESC_FETCH)); + return NULL; + } log_info(LD_DIR, "No trusted dirservers are reachable. Trying them all again."); mark_all_trusteddirservers_up(); - return router_pick_trusteddirserver_impl(type, flags); + return router_pick_trusteddirserver_impl(type, flags, NULL); } /** How long do we avoid using a directory server after it's given us a 503? */ @@ -968,10 +1091,11 @@ overloaded_tunnel = smartlist_create(); /* Find all the running dirservers we know about. */ - SMARTLIST_FOREACH(consensus->routerstatus_list, routerstatus_t *, status, - { + SMARTLIST_FOREACH_BEGIN(consensus->routerstatus_list, routerstatus_t *, + status) { int is_trusted; int is_overloaded = status->last_dir_503_at + DIR_503_TIMEOUT > now; + tor_addr_t addr; if (!status->is_running || !status->dir_port || !status->is_valid) continue; if (status->is_bad_directory) @@ -990,23 +1114,27 @@ if ((type & EXTRAINFO_CACHE) && !router_supports_extrainfo(status->identity_digest, 0)) continue; + + /* XXXX IP6 proposal 118 */ + tor_addr_from_ipv4h(&addr, status->addr); + if (prefer_tunnel && status->version_supports_begindir && (!fascistfirewall || - fascist_firewall_allows_address_or(status->addr, status->or_port))) + fascist_firewall_allows_address_or(&addr, status->or_port))) smartlist_add(is_trusted ? trusted_tunnel : is_overloaded ? overloaded_tunnel : tunnel, status); else if (!fascistfirewall || - fascist_firewall_allows_address_dir(status->addr, - status->dir_port)) + fascist_firewall_allows_address_dir(&addr, status->dir_port)) smartlist_add(is_trusted ? trusted_direct : is_overloaded ? overloaded_direct : direct, status); - }); + } SMARTLIST_FOREACH_END(status); if (smartlist_len(tunnel)) { - result = routerstatus_sl_choose_by_bandwidth(tunnel); + result = routerstatus_sl_choose_by_bandwidth(tunnel, WEIGHT_FOR_DIR); } else if (smartlist_len(overloaded_tunnel)) { - result = routerstatus_sl_choose_by_bandwidth(overloaded_tunnel); + result = routerstatus_sl_choose_by_bandwidth(overloaded_tunnel, + WEIGHT_FOR_DIR); } else if (smartlist_len(trusted_tunnel)) { /* FFFF We don't distinguish between trusteds and overloaded trusteds * yet. Maybe one day we should. */ @@ -1014,9 +1142,10 @@ * is a feature, but it could easily be a bug. -RD */ result = smartlist_choose(trusted_tunnel); } else if (smartlist_len(direct)) { - result = routerstatus_sl_choose_by_bandwidth(direct); + result = routerstatus_sl_choose_by_bandwidth(direct, WEIGHT_FOR_DIR); } else if (smartlist_len(overloaded_direct)) { - result = routerstatus_sl_choose_by_bandwidth(overloaded_direct); + result = routerstatus_sl_choose_by_bandwidth(overloaded_direct, + WEIGHT_FOR_DIR); } else { result = smartlist_choose(trusted_direct); } @@ -1033,16 +1162,19 @@ * are as for router_pick_directory_server_impl(). */ static routerstatus_t * -router_pick_trusteddirserver_impl(authority_type_t type, int flags) +router_pick_trusteddirserver_impl(authority_type_t type, int flags, + int *n_busy_out) { smartlist_t *direct, *tunnel; smartlist_t *overloaded_direct, *overloaded_tunnel; routerinfo_t *me = router_get_my_routerinfo(); routerstatus_t *result; time_t now = time(NULL); - int requireother = ! (flags & PDS_ALLOW_SELF); - int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL); - int prefer_tunnel = (flags & _PDS_PREFER_TUNNELED_DIR_CONNS); + const int requireother = ! (flags & PDS_ALLOW_SELF); + const int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL); + const int prefer_tunnel = (flags & _PDS_PREFER_TUNNELED_DIR_CONNS); + const int no_serverdesc_fetching =(flags & PDS_NO_EXISTING_SERVERDESC_FETCH); + int n_busy = 0; if (!trusted_dir_servers) return NULL; @@ -1052,10 +1184,11 @@ overloaded_direct = smartlist_create(); overloaded_tunnel = smartlist_create(); - SMARTLIST_FOREACH(trusted_dir_servers, trusted_dir_server_t *, d, + SMARTLIST_FOREACH_BEGIN(trusted_dir_servers, trusted_dir_server_t *, d) { int is_overloaded = d->fake_status.last_dir_503_at + DIR_503_TIMEOUT > now; + tor_addr_t addr; if (!d->is_running) continue; if ((type & d->type) == 0) continue; @@ -1064,17 +1197,34 @@ continue; if (requireother && me && router_digest_is_me(d->digest)) continue; + + /* XXXX IP6 proposal 118 */ + tor_addr_from_ipv4h(&addr, d->addr); + + if (no_serverdesc_fetching) { + if (connection_get_by_type_addr_port_purpose( + CONN_TYPE_DIR, &addr, d->dir_port, DIR_PURPOSE_FETCH_SERVERDESC) + || connection_get_by_type_addr_port_purpose( + CONN_TYPE_DIR, &addr, d->dir_port, DIR_PURPOSE_FETCH_EXTRAINFO)) { + //log_debug(LD_DIR, "We have an existing connection to fetch " + // "descriptor from %s; delaying",d->description); + ++n_busy; + continue; + } + } + if (prefer_tunnel && d->or_port && (!fascistfirewall || - fascist_firewall_allows_address_or(d->addr, d->or_port))) + fascist_firewall_allows_address_or(&addr, d->or_port))) smartlist_add(is_overloaded ? overloaded_tunnel : tunnel, &d->fake_status); else if (!fascistfirewall || - fascist_firewall_allows_address_dir(d->addr, d->dir_port)) + fascist_firewall_allows_address_dir(&addr, d->dir_port)) smartlist_add(is_overloaded ? overloaded_direct : direct, &d->fake_status); - }); + } + SMARTLIST_FOREACH_END(d); if (smartlist_len(tunnel)) { result = smartlist_choose(tunnel); @@ -1086,6 +1236,9 @@ result = smartlist_choose(overloaded_direct); } + if (n_busy_out) + *n_busy_out = n_busy; + smartlist_free(direct); smartlist_free(tunnel); smartlist_free(overloaded_direct); @@ -1121,6 +1274,13 @@ router_dir_info_changed(); } +/** Return true iff r1 and r2 have the same address and OR port. */ +int +routers_have_same_or_addr(const routerinfo_t *r1, const routerinfo_t *r2) +{ + return r1->addr == r2->addr && r1->or_port == r2->or_port; +} + /** Reset all internal variables used to count failed downloads of network * status objects. */ void @@ -1151,7 +1311,8 @@ } /** Add all the family of router to the smartlist sl. - * This is used to make sure we don't pick siblings in a single path. + * This is used to make sure we don't pick siblings in a single path, + * or pick more than one relay from a family for our entry guard list. */ void routerlist_add_family(smartlist_t *sl, routerinfo_t *router) @@ -1288,7 +1449,7 @@ nickname_list = smartlist_create(); smartlist_split_string(nickname_list, list, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + SPLIT_SKIP_SPACE|SPLIT_STRIP_SPACE|SPLIT_IGNORE_BLANK, 0); SMARTLIST_FOREACH(nickname_list, const char *, cp, if (router_nickname_matches(router, cp)) {v=1;break;}); SMARTLIST_FOREACH(nickname_list, char *, cp, tor_free(cp)); @@ -1346,16 +1507,19 @@ { uint32_t addr; struct in_addr in; + tor_addr_t a; if (!tor_inet_aton(address, &in)) return NULL; /* it's not an IP already */ addr = ntohl(in.s_addr); + tor_addr_from_ipv4h(&a, addr); + SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, router, { - if (router->is_running && - router->addr == addr && - compare_addr_to_addr_policy(addr, port, router->exit_policy) == + if (router->addr == addr && + router->is_running && + compare_tor_addr_to_addr_policy(&a, port, router->exit_policy) == ADDR_POLICY_ACCEPTED) return router; }); @@ -1395,15 +1559,234 @@ * routers by bandwidth. */ #define DEFAULT_MAX_BELIEVABLE_BANDWIDTH 10000000 /* 10 MB/sec */ -/** Eventually, the number we return will come from the directory - * consensus, so clients can dynamically update to better numbers. - * - * But for now, or in case there is no consensus available, just return - * a sufficient default. */ -static uint32_t -get_max_believable_bandwidth(void) +/** Return the smaller of the router's configured BandwidthRate + * and its advertised capacity, capped by max-believe-bw. */ +uint32_t +router_get_advertised_bandwidth_capped(routerinfo_t *router) +{ + uint32_t result = router->bandwidthcapacity; + if (result > router->bandwidthrate) + result = router->bandwidthrate; + if (result > DEFAULT_MAX_BELIEVABLE_BANDWIDTH) + result = DEFAULT_MAX_BELIEVABLE_BANDWIDTH; + return result; +} + +/** Return bw*1000, unless bw*1000 would overflow, in which case return + * INT32_MAX. */ +static INLINE int32_t +kb_to_bytes(uint32_t bw) { - return DEFAULT_MAX_BELIEVABLE_BANDWIDTH; + return (bw > (INT32_MAX/1000)) ? INT32_MAX : bw*1000; +} + +/** Helper function: + * choose a random element of smartlist sl, weighted by + * the advertised bandwidth of each element using the consensus + * bandwidth weights. + * + * If statuses is zero, then sl is a list of + * routerinfo_t's. Otherwise it's a list of routerstatus_t's. + * + * If rule==WEIGHT_FOR_EXIT. we're picking an exit node: consider all + * nodes' bandwidth equally regardless of their Exit status, since there may + * be some in the list because they exit to obscure ports. If + * rule==NO_WEIGHTING, we're picking a non-exit node: weight + * exit-node's bandwidth less depending on the smallness of the fraction of + * Exit-to-total bandwidth. If rule==WEIGHT_FOR_GUARD, we're picking a + * guard node: consider all guard's bandwidth equally. Otherwise, weight + * guards proportionally less. + */ +static void * +smartlist_choose_by_bandwidth_weights(smartlist_t *sl, + bandwidth_weight_rule_t rule, + int statuses) +{ + int64_t weight_scale; + int64_t rand_bw; + double Wg = -1, Wm = -1, We = -1, Wd = -1; + double Wgb = -1, Wmb = -1, Web = -1, Wdb = -1; + double weighted_bw = 0; + double *bandwidths; + double tmp = 0; + unsigned int i; + + /* Can't choose exit and guard at same time */ + tor_assert(rule == NO_WEIGHTING || + rule == WEIGHT_FOR_EXIT || + rule == WEIGHT_FOR_GUARD || + rule == WEIGHT_FOR_MID || + rule == WEIGHT_FOR_DIR); + + if (smartlist_len(sl) == 0) { + log_info(LD_CIRC, + "Empty routerlist passed in to consensus weight node " + "selection for rule %s", + bandwidth_weight_rule_to_string(rule)); + return NULL; + } + + weight_scale = networkstatus_get_param(NULL, "bwweightscale", + BW_WEIGHT_SCALE); + + if (rule == WEIGHT_FOR_GUARD) { + Wg = networkstatus_get_bw_weight(NULL, "Wgg", -1); + Wm = networkstatus_get_bw_weight(NULL, "Wgm", -1); /* Bridges */ + We = 0; + Wd = networkstatus_get_bw_weight(NULL, "Wgd", -1); + + Wgb = networkstatus_get_bw_weight(NULL, "Wgb", -1); + Wmb = networkstatus_get_bw_weight(NULL, "Wmb", -1); + Web = networkstatus_get_bw_weight(NULL, "Web", -1); + Wdb = networkstatus_get_bw_weight(NULL, "Wdb", -1); + } else if (rule == WEIGHT_FOR_MID) { + Wg = networkstatus_get_bw_weight(NULL, "Wmg", -1); + Wm = networkstatus_get_bw_weight(NULL, "Wmm", -1); + We = networkstatus_get_bw_weight(NULL, "Wme", -1); + Wd = networkstatus_get_bw_weight(NULL, "Wmd", -1); + + Wgb = networkstatus_get_bw_weight(NULL, "Wgb", -1); + Wmb = networkstatus_get_bw_weight(NULL, "Wmb", -1); + Web = networkstatus_get_bw_weight(NULL, "Web", -1); + Wdb = networkstatus_get_bw_weight(NULL, "Wdb", -1); + } else if (rule == WEIGHT_FOR_EXIT) { + // Guards CAN be exits if they have weird exit policies + // They are d then I guess... + We = networkstatus_get_bw_weight(NULL, "Wee", -1); + Wm = networkstatus_get_bw_weight(NULL, "Wem", -1); /* Odd exit policies */ + Wd = networkstatus_get_bw_weight(NULL, "Wed", -1); + Wg = networkstatus_get_bw_weight(NULL, "Weg", -1); /* Odd exit policies */ + + Wgb = networkstatus_get_bw_weight(NULL, "Wgb", -1); + Wmb = networkstatus_get_bw_weight(NULL, "Wmb", -1); + Web = networkstatus_get_bw_weight(NULL, "Web", -1); + Wdb = networkstatus_get_bw_weight(NULL, "Wdb", -1); + } else if (rule == WEIGHT_FOR_DIR) { + We = networkstatus_get_bw_weight(NULL, "Wbe", -1); + Wm = networkstatus_get_bw_weight(NULL, "Wbm", -1); + Wd = networkstatus_get_bw_weight(NULL, "Wbd", -1); + Wg = networkstatus_get_bw_weight(NULL, "Wbg", -1); + + Wgb = Wmb = Web = Wdb = weight_scale; + } else if (rule == NO_WEIGHTING) { + Wg = Wm = We = Wd = weight_scale; + Wgb = Wmb = Web = Wdb = weight_scale; + } + + if (Wg < 0 || Wm < 0 || We < 0 || Wd < 0 || Wgb < 0 || Wmb < 0 || Wdb < 0 + || Web < 0) { + log_debug(LD_CIRC, + "Got negative bandwidth weights. Defaulting to old selection" + " algorithm."); + return NULL; // Use old algorithm. + } + + Wg /= weight_scale; + Wm /= weight_scale; + We /= weight_scale; + Wd /= weight_scale; + + Wgb /= weight_scale; + Wmb /= weight_scale; + Web /= weight_scale; + Wdb /= weight_scale; + + bandwidths = tor_malloc_zero(sizeof(double)*smartlist_len(sl)); + + // Cycle through smartlist and total the bandwidth. + for (i = 0; i < (unsigned)smartlist_len(sl); ++i) { + int is_exit = 0, is_guard = 0, is_dir = 0, this_bw = 0, is_me = 0; + double weight = 1; + if (statuses) { + routerstatus_t *status = smartlist_get(sl, i); + is_exit = status->is_exit; + is_guard = status->is_possible_guard; + is_dir = (status->dir_port != 0); + if (!status->has_bandwidth) { + tor_free(bandwidths); + /* This should never happen, unless all the authorites downgrade + * to 0.2.0 or rogue routerstatuses get inserted into our consensus. */ + log_warn(LD_BUG, + "Consensus is not listing bandwidths. Defaulting back to " + "old router selection algorithm."); + return NULL; + } + this_bw = kb_to_bytes(status->bandwidth); + if (router_digest_is_me(status->identity_digest)) + is_me = 1; + } else { + routerstatus_t *rs; + routerinfo_t *router = smartlist_get(sl, i); + rs = router_get_consensus_status_by_id( + router->cache_info.identity_digest); + is_exit = router->is_exit; + is_guard = router->is_possible_guard; + is_dir = (router->dir_port != 0); + if (rs && rs->has_bandwidth) { + this_bw = kb_to_bytes(rs->bandwidth); + } else { /* bridge or other descriptor not in our consensus */ + this_bw = router_get_advertised_bandwidth_capped(router); + } + if (router_digest_is_me(router->cache_info.identity_digest)) + is_me = 1; + } + if (is_guard && is_exit) { + weight = (is_dir ? Wdb*Wd : Wd); + } else if (is_guard) { + weight = (is_dir ? Wgb*Wg : Wg); + } else if (is_exit) { + weight = (is_dir ? Web*We : We); + } else { // middle + weight = (is_dir ? Wmb*Wm : Wm); + } + + bandwidths[i] = weight*this_bw; + weighted_bw += weight*this_bw; + if (is_me) + sl_last_weighted_bw_of_me = weight*this_bw; + } + + /* XXXX022 this is a kludge to expose these values. */ + sl_last_total_weighted_bw = weighted_bw; + + log_debug(LD_CIRC, "Choosing node for rule %s based on weights " + "Wg=%lf Wm=%lf We=%lf Wd=%lf with total bw %lf", + bandwidth_weight_rule_to_string(rule), + Wg, Wm, We, Wd, weighted_bw); + + /* If there is no bandwidth, choose at random */ + if (DBL_TO_U64(weighted_bw) == 0) { + log_warn(LD_CIRC, + "Weighted bandwidth is %lf in node selection for rule %s", + weighted_bw, bandwidth_weight_rule_to_string(rule)); + tor_free(bandwidths); + return smartlist_choose(sl); + } + + rand_bw = crypto_rand_uint64(DBL_TO_U64(weighted_bw)); + rand_bw++; /* crypto_rand_uint64() counts from 0, and we need to count + * from 1 below. See bug 1203 for details. */ + + /* Last, count through sl until we get to the element we picked */ + tmp = 0.0; + for (i=0; i < (unsigned)smartlist_len(sl); i++) { + tmp += bandwidths[i]; + if (tmp >= rand_bw) + break; + } + + if (i == (unsigned)smartlist_len(sl)) { + /* This was once possible due to round-off error, but shouldn't be able + * to occur any longer. */ + tor_fragile_assert(); + --i; + log_warn(LD_BUG, "Round-off error in computing bandwidth had an effect on " + " which router we chose. Please tell the developers. " + "%lf " U64_FORMAT " %lf", tmp, U64_PRINTF_ARG(rand_bw), + weighted_bw); + } + tor_free(bandwidths); + return smartlist_get(sl, i); } /** Helper function: @@ -1440,13 +1823,26 @@ int n_unknown = 0; bitarray_t *exit_bits; bitarray_t *guard_bits; - uint32_t max_believable_bw = get_max_believable_bandwidth(); + int me_idx = -1; + + // This function does not support WEIGHT_FOR_DIR + // or WEIGHT_FOR_MID + if (rule == WEIGHT_FOR_DIR || rule == WEIGHT_FOR_MID) { + rule = NO_WEIGHTING; + } /* Can't choose exit and guard at same time */ tor_assert(rule == NO_WEIGHTING || rule == WEIGHT_FOR_EXIT || rule == WEIGHT_FOR_GUARD); + if (smartlist_len(sl) == 0) { + log_info(LD_CIRC, + "Empty routerlist passed in to old node selection for rule %s", + bandwidth_weight_rule_to_string(rule)); + return NULL; + } + /* First count the total bandwidth weight, and make a list * of each value. <0 means "unknown; no routerinfo." We use the * bits of negative values to remember whether the router was fast (-x)&1 @@ -1462,44 +1858,50 @@ int32_t flags = 0; uint32_t this_bw = 0; if (statuses) { - /* need to extract router info */ status = smartlist_get(sl, i); + if (router_digest_is_me(status->identity_digest)) + me_idx = i; router = router_get_by_digest(status->identity_digest); is_exit = status->is_exit; is_guard = status->is_possible_guard; - if (router) { - this_bw = router_get_advertised_bandwidth(router); + if (status->has_bandwidth) { + this_bw = kb_to_bytes(status->bandwidth); } else { /* guess */ + /* XXX022 once consensuses always list bandwidths, we can take + * this guessing business out. -RD */ is_known = 0; flags = status->is_fast ? 1 : 0; flags |= is_exit ? 2 : 0; flags |= is_guard ? 4 : 0; } } else { + routerstatus_t *rs; router = smartlist_get(sl, i); + rs = router_get_consensus_status_by_id( + router->cache_info.identity_digest); + if (router_digest_is_me(router->cache_info.identity_digest)) + me_idx = i; is_exit = router->is_exit; is_guard = router->is_possible_guard; - this_bw = router_get_advertised_bandwidth(router); + if (rs && rs->has_bandwidth) { + this_bw = kb_to_bytes(rs->bandwidth); + } else if (rs) { /* guess; don't trust the descriptor */ + /* XXX022 once consensuses always list bandwidths, we can take + * this guessing business out. -RD */ + is_known = 0; + flags = router->is_fast ? 1 : 0; + flags |= is_exit ? 2 : 0; + flags |= is_guard ? 4 : 0; + } else /* bridge or other descriptor not in our consensus */ + this_bw = router_get_advertised_bandwidth_capped(router); } if (is_exit) bitarray_set(exit_bits, i); if (is_guard) bitarray_set(guard_bits, i); - /* if they claim something huge, don't believe it */ - if (this_bw > max_believable_bw) { - char fp[HEX_DIGEST_LEN+1]; - base16_encode(fp, sizeof(fp), statuses ? - status->identity_digest : - router->cache_info.identity_digest, - DIGEST_LEN); - log_fn(LOG_PROTOCOL_WARN, LD_DIR, - "Bandwidth %d for router %s (%s) exceeds allowed max %d, capping", - this_bw, router ? router->nickname : "(null)", - fp, max_believable_bw); - this_bw = max_believable_bw; - } if (is_known) { bandwidths[i] = (int32_t) this_bw; // safe since MAX_BELIEVABLE= 0); if (is_guard) total_guard_bw += this_bw; else @@ -1562,12 +1964,12 @@ * For detailed derivation of this formula, see * http://archives.seul.org/or/dev/Jul-2007/msg00056.html */ - if (rule == WEIGHT_FOR_EXIT) + if (rule == WEIGHT_FOR_EXIT || !total_exit_bw) exit_weight = 1.0; else exit_weight = 1.0 - all_bw/(3.0*exit_bw); - if (rule == WEIGHT_FOR_GUARD) + if (rule == WEIGHT_FOR_GUARD || !total_guard_bw) guard_weight = 1.0; else guard_weight = 1.0 - all_bw/(3.0*guard_bw); @@ -1579,19 +1981,28 @@ guard_weight = 0.0; total_bw = 0; + sl_last_weighted_bw_of_me = 0; for (i=0; i < (unsigned)smartlist_len(sl); i++) { + uint64_t bw; is_exit = bitarray_is_set(exit_bits, i); is_guard = bitarray_is_set(guard_bits, i); if (is_exit && is_guard) - total_bw += ((uint64_t)(bandwidths[i] * exit_weight * guard_weight)); + bw = ((uint64_t)(bandwidths[i] * exit_weight * guard_weight)); else if (is_guard) - total_bw += ((uint64_t)(bandwidths[i] * guard_weight)); + bw = ((uint64_t)(bandwidths[i] * guard_weight)); else if (is_exit) - total_bw += ((uint64_t)(bandwidths[i] * exit_weight)); + bw = ((uint64_t)(bandwidths[i] * exit_weight)); else - total_bw += bandwidths[i]; + bw = bandwidths[i]; + total_bw += bw; + if (i == (unsigned) me_idx) + sl_last_weighted_bw_of_me = bw; } } + + /* XXXX022 this is a kludge to expose these values. */ + sl_last_total_weighted_bw = total_bw; + log_debug(LD_CIRC, "Total weighted bw = "U64_FORMAT ", exit bw = "U64_FORMAT ", nonexit bw = "U64_FORMAT", exit weight = %lf " @@ -1607,6 +2018,8 @@ /* Almost done: choose a random value from the bandwidth weights. */ rand_bw = crypto_rand_uint64(total_bw); + rand_bw++; /* crypto_rand_uint64() counts from 0, and we need to count + * from 1 below. See bug 1203 for details. */ /* Last, count through sl until we get to the element we picked */ tmp = 0; @@ -1650,120 +2063,120 @@ routerlist_sl_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule) { - return smartlist_choose_by_bandwidth(sl, rule, 0); + routerinfo_t *ret; + if ((ret = smartlist_choose_by_bandwidth_weights(sl, rule, 0))) { + return ret; + } else { + return smartlist_choose_by_bandwidth(sl, rule, 0); + } } /** Choose a random element of status list sl, weighted by * the advertised bandwidth of each status. */ routerstatus_t * -routerstatus_sl_choose_by_bandwidth(smartlist_t *sl) +routerstatus_sl_choose_by_bandwidth(smartlist_t *sl, + bandwidth_weight_rule_t rule) { /* We are choosing neither exit nor guard here. Weight accordingly. */ - return smartlist_choose_by_bandwidth(sl, NO_WEIGHTING, 1); + routerstatus_t *ret; + if ((ret = smartlist_choose_by_bandwidth_weights(sl, rule, 1))) { + return ret; + } else { + return smartlist_choose_by_bandwidth(sl, rule, 1); + } } -/** Return a random running router from the routerlist. If any node - * named in preferred is available, pick one of those. Never - * pick a node named in excluded, or whose routerinfo is in - * excludedsmartlist, even if they are the only nodes - * available. If strict is true, never pick any node besides - * those in preferred. - * If need_uptime is non-zero and any router has more than +/** Return a random running router from the routerlist. Never + * pick a node whose routerinfo is in + * excludedsmartlist, or whose routerinfo matches excludedset, + * even if they are the only nodes available. + * If CRN_NEED_UPTIME is set in flags and any router has more than * a minimum uptime, return one of those. - * If need_capacity is non-zero, weight your choice by the + * If CRN_NEED_CAPACITY is set in flags, weight your choice by the * advertised capacity of each router. - * If ! allow_invalid, consider only Valid routers. - * If need_guard, consider only Guard routers. - * If weight_for_exit, we weight bandwidths as if picking an exit node, - * otherwise we weight bandwidths for picking a relay node (that is, possibly - * discounting exit nodes). + * If CRN_ALLOW_INVALID is not set in flags, consider only Valid + * routers. + * If CRN_NEED_GUARD is set in flags, consider only Guard routers. + * If CRN_WEIGHT_AS_EXIT is set in flags, we weight bandwidths as if + * picking an exit node, otherwise we weight bandwidths for picking a relay + * node (that is, possibly discounting exit nodes). */ routerinfo_t * -router_choose_random_node(const char *preferred, - const char *excluded, - smartlist_t *excludedsmartlist, - int need_uptime, int need_capacity, - int need_guard, - int allow_invalid, int strict, - int weight_for_exit) -{ - smartlist_t *sl, *excludednodes; +router_choose_random_node(smartlist_t *excludedsmartlist, + routerset_t *excludedset, + router_crn_flags_t flags) +{ + const int need_uptime = (flags & CRN_NEED_UPTIME) != 0; + const int need_capacity = (flags & CRN_NEED_CAPACITY) != 0; + const int need_guard = (flags & CRN_NEED_GUARD) != 0; + const int allow_invalid = (flags & CRN_ALLOW_INVALID) != 0; + const int weight_for_exit = (flags & CRN_WEIGHT_AS_EXIT) != 0; + + smartlist_t *sl=smartlist_create(), + *excludednodes=smartlist_create(); routerinfo_t *choice = NULL, *r; bandwidth_weight_rule_t rule; tor_assert(!(weight_for_exit && need_guard)); rule = weight_for_exit ? WEIGHT_FOR_EXIT : - (need_guard ? WEIGHT_FOR_GUARD : NO_WEIGHTING); + (need_guard ? WEIGHT_FOR_GUARD : WEIGHT_FOR_MID); - excludednodes = smartlist_create(); - add_nickname_list_to_smartlist(excludednodes,excluded,0); + /* Exclude relays that allow single hop exit circuits, if the user + * wants to (such relays might be risky) */ + if (get_options()->ExcludeSingleHopRelays) { + routerlist_t *rl = router_get_routerlist(); + SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, + if (r->allow_single_hop_exits) { + smartlist_add(excludednodes, r); + }); + } if ((r = routerlist_find_my_routerinfo())) { smartlist_add(excludednodes, r); routerlist_add_family(excludednodes, r); } - /* Try the preferred nodes first. Ignore need_uptime and need_capacity - * and need_guard, since the user explicitly asked for these nodes. */ - if (preferred) { - sl = smartlist_create(); - add_nickname_list_to_smartlist(sl,preferred,1); - smartlist_subtract(sl,excludednodes); - if (excludedsmartlist) - smartlist_subtract(sl,excludedsmartlist); - choice = smartlist_choose(sl); - smartlist_free(sl); - } - if (!choice && !strict) { - /* Then give up on our preferred choices: any node - * will do that has the required attributes. */ - sl = smartlist_create(); - router_add_running_routers_to_smartlist(sl, allow_invalid, - need_uptime, need_capacity, - need_guard); - smartlist_subtract(sl,excludednodes); - if (excludedsmartlist) - smartlist_subtract(sl,excludedsmartlist); - - if (need_capacity || need_guard) - choice = routerlist_sl_choose_by_bandwidth(sl, rule); - else - choice = smartlist_choose(sl); - - smartlist_free(sl); - if (!choice && (need_uptime || need_capacity || need_guard)) { - /* try once more -- recurse but with fewer restrictions. */ - log_info(LD_CIRC, - "We couldn't find any live%s%s%s routers; falling back " - "to list of all routers.", - need_capacity?", fast":"", - need_uptime?", stable":"", - need_guard?", guard":""); - choice = router_choose_random_node( - NULL, excluded, excludedsmartlist, - 0, 0, 0, allow_invalid, 0, weight_for_exit); - } + router_add_running_routers_to_smartlist(sl, allow_invalid, + need_uptime, need_capacity, + need_guard); + smartlist_subtract(sl,excludednodes); + if (excludedsmartlist) + smartlist_subtract(sl,excludedsmartlist); + if (excludedset) + routerset_subtract_routers(sl,excludedset); + + // Always weight by bandwidth + choice = routerlist_sl_choose_by_bandwidth(sl, rule); + + smartlist_free(sl); + if (!choice && (need_uptime || need_capacity || need_guard)) { + /* try once more -- recurse but with fewer restrictions. */ + log_info(LD_CIRC, + "We couldn't find any live%s%s%s routers; falling back " + "to list of all routers.", + need_capacity?", fast":"", + need_uptime?", stable":"", + need_guard?", guard":""); + flags &= ~ (CRN_NEED_UPTIME|CRN_NEED_CAPACITY|CRN_NEED_GUARD); + choice = router_choose_random_node( + excludedsmartlist, excludedset, flags); } smartlist_free(excludednodes); if (!choice) { - if (strict) { - log_warn(LD_CIRC, "All preferred nodes were down when trying to choose " - "node, and the Strict[...]Nodes option is set. Failing."); - } else { - log_warn(LD_CIRC, - "No available nodes when trying to choose node. Failing."); - } + log_warn(LD_CIRC, + "No available nodes when trying to choose node. Failing."); } return choice; } -/** Return true iff the digest of router's identity key, - * encoded in hexadecimal, matches hexdigest (which is - * optionally prefixed with a single dollar sign). Return false if +/** Helper: Return true iff the identity_digest and nickname + * combination of a router, encoded in hexadecimal, matches hexdigest + * (which is optionally prefixed with a single dollar sign). Return false if * hexdigest is malformed, or it doesn't match. */ static INLINE int -router_hex_digest_matches(routerinfo_t *router, const char *hexdigest) +hex_digest_matches(const char *hexdigest, const char *identity_digest, + const char *nickname, int is_named) { char digest[DIGEST_LEN]; size_t len; @@ -1777,15 +2190,26 @@ else if (len > HEX_DIGEST_LEN && (hexdigest[HEX_DIGEST_LEN] == '=' || hexdigest[HEX_DIGEST_LEN] == '~')) { - if (strcasecmp(hexdigest+HEX_DIGEST_LEN+1, router->nickname)) + if (strcasecmp(hexdigest+HEX_DIGEST_LEN+1, nickname)) return 0; - if (hexdigest[HEX_DIGEST_LEN] == '=' && !router->is_named) + if (hexdigest[HEX_DIGEST_LEN] == '=' && !is_named) return 0; } if (base16_decode(digest, DIGEST_LEN, hexdigest, HEX_DIGEST_LEN)<0) return 0; - return (!memcmp(digest, router->cache_info.identity_digest, DIGEST_LEN)); + return (!memcmp(digest, identity_digest, DIGEST_LEN)); +} + +/** Return true iff the digest of router's identity key, + * encoded in hexadecimal, matches hexdigest (which is + * optionally prefixed with a single dollar sign). Return false if + * hexdigest is malformed, or it doesn't match. */ +static INLINE int +router_hex_digest_matches(routerinfo_t *router, const char *hexdigest) +{ + return hex_digest_matches(hexdigest, router->cache_info.identity_digest, + router->nickname, router->is_named); } /** Return true if router's nickname matches nickname @@ -2201,6 +2625,9 @@ static void signed_descriptor_free(signed_descriptor_t *sd) { + if (!sd) + return; + tor_free(sd->signed_descriptor_body); /* XXXX remove this once more bugs go away. */ @@ -2232,7 +2659,8 @@ void routerlist_free(routerlist_t *rl) { - tor_assert(rl); + if (!rl) + return; rimap_free(rl->identity_map, NULL); sdmap_free(rl->desc_digest_map, NULL); sdmap_free(rl->desc_by_eid_map, NULL); @@ -2266,13 +2694,17 @@ SMARTLIST_FOREACH(routerlist->old_routers, signed_descriptor_t *, sd, olddescs += sd->signed_descriptor_len); - log(severity, LD_GENERAL, + log(severity, LD_DIR, "In %d live descriptors: "U64_FORMAT" bytes. " "In %d old descriptors: "U64_FORMAT" bytes.", smartlist_len(routerlist->routers), U64_PRINTF_ARG(livedescs), smartlist_len(routerlist->old_routers), U64_PRINTF_ARG(olddescs)); } +/** Debugging helper: If idx is nonnegative, assert that ri is + * in sl at position idx. Otherwise, search sl for + * ri. Return the index of ri in sl, or -1 if ri + * is not in sl. */ static INLINE int _routerlist_find_elt(smartlist_t *sl, void *ri, int idx) { @@ -2414,7 +2846,7 @@ * If make_old is true, instead of deleting the router, we try adding * it to rl->old_routers. */ void -routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old) +routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old, time_t now) { routerinfo_t *ri_tmp; extrainfo_t *ei_tmp; @@ -2422,6 +2854,9 @@ tor_assert(0 <= idx && idx < smartlist_len(rl->routers)); tor_assert(smartlist_get(rl->routers, idx) == ri); + /* make sure the rephist module knows that it's not running */ + rep_hist_note_router_unreachable(ri->cache_info.identity_digest, now); + ri->cache_info.routerlist_index = -1; smartlist_del(rl->routers, idx); if (idx < smartlist_len(rl->routers)) { @@ -2465,7 +2900,7 @@ } /** Remove a signed_descriptor_t sd from rl-\>old_routers, and - * adjust rl as appropriate. idx is -1, or the index of + * adjust rl as appropriate. idx is -1, or the index of * sd. */ static void routerlist_remove_old(routerlist_t *rl, signed_descriptor_t *sd, int idx) @@ -2479,7 +2914,7 @@ tor_assert(0 <= idx && idx < smartlist_len(rl->old_routers)); /* XXXX edmanm's bridge relay triggered the following assert while * running 0.2.0.12-alpha. If anybody triggers this again, see if we - * can ge a backtrace. */ + * can get a backtrace. */ tor_assert(smartlist_get(rl->old_routers, idx) == sd); tor_assert(idx == sd->routerlist_index); @@ -2633,8 +3068,7 @@ void routerlist_free_all(void) { - if (routerlist) - routerlist_free(routerlist); + routerlist_free(routerlist); routerlist = NULL; if (warned_nicknames) { SMARTLIST_FOREACH(warned_nicknames, char *, cp, tor_free(cp)); @@ -2647,7 +3081,6 @@ smartlist_free(trusted_dir_servers); trusted_dir_servers = NULL; } - if (trusted_dir_certs) { DIGESTMAP_FOREACH(trusted_dir_certs, key, cert_list_t *, cl) { SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert, @@ -2711,16 +3144,8 @@ * router after subsequent calls with other routerinfo's -- they * might cause the original routerinfo to get freed. * - * Returns >= 0 if the router was added; less than 0 if it was not. - * - * If we're returning non-zero, then assign to *msg a static string - * describing the reason for not liking the routerinfo. - * - * If the return value is less than -1, there was a problem with the - * routerinfo. If the return value is equal to -1, then the routerinfo was - * fine, but out-of-date. If the return value is equal to 1, the - * routerinfo was accepted, but we should notify the generator of the - * descriptor using the message *msg. + * Returns the status for the operation. Might set *msg if it wants + * the poster of the router to know something. * * If from_cache, this descriptor came from our disk cache. If * from_fetch, we received it in response to a request we made. @@ -2731,7 +3156,7 @@ * routers_update_status_from_consensus_networkstatus; subsequently, you * should call router_rebuild_store and routerlist_descriptors_added. */ -int +was_router_added_t router_add_to_routerlist(routerinfo_t *router, const char **msg, int from_cache, int from_fetch) { @@ -2750,15 +3175,25 @@ id_digest = router->cache_info.identity_digest; + old_router = router_get_by_digest(id_digest); + /* Make sure that we haven't already got this exact descriptor. */ if (sdmap_get(routerlist->desc_digest_map, router->cache_info.signed_descriptor_digest)) { - log_info(LD_DIR, - "Dropping descriptor that we already have for router '%s'", - router->nickname); - *msg = "Router descriptor was not new."; - routerinfo_free(router); - return -1; + /* If we have this descriptor already and the new descriptor is a bridge + * descriptor, replace it. If we had a bridge descriptor before and the + * new one is not a bridge descriptor, don't replace it. */ + tor_assert(old_router); + if (! (routerinfo_is_a_configured_bridge(router) && + (router->purpose == ROUTER_PURPOSE_BRIDGE || + old_router->purpose != ROUTER_PURPOSE_BRIDGE))) { + log_info(LD_DIR, + "Dropping descriptor that we already have for router '%s'", + router->nickname); + *msg = "Router descriptor was not new."; + routerinfo_free(router); + return ROUTER_WAS_NOT_NEW; + } } if (authdir) { @@ -2766,7 +3201,7 @@ !from_cache && !from_fetch)) { tor_assert(*msg); routerinfo_free(router); - return -2; + return ROUTER_AUTHDIR_REJECTS; } authdir_believes_valid = router->is_valid; } else if (from_fetch) { @@ -2787,7 +3222,7 @@ signed_desc_append_to_journal(&router->cache_info, &routerlist->desc_store); routerlist_insert_old(routerlist, router); - return -1; + return ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS; } } @@ -2795,15 +3230,14 @@ SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns, { routerstatus_t *rs = - networkstatus_v2_find_entry(ns, router->cache_info.identity_digest); + networkstatus_v2_find_entry(ns, id_digest); if (rs && !memcmp(rs->descriptor_digest, router->cache_info.signed_descriptor_digest, DIGEST_LEN)) rs->need_to_mirror = 0; }); if (consensus) { - routerstatus_t *rs = networkstatus_vote_find_entry(consensus, - router->cache_info.identity_digest); + routerstatus_t *rs = networkstatus_vote_find_entry(consensus, id_digest); if (rs && !memcmp(rs->descriptor_digest, router->cache_info.signed_descriptor_digest, DIGEST_LEN)) { @@ -2821,17 +3255,15 @@ &routerlist->desc_store); routerlist_insert_old(routerlist, router); *msg = "Skipping router descriptor: not in consensus."; - return -1; + return ROUTER_NOT_IN_CONSENSUS; } /* If we have a router with the same identity key, choose the newer one. */ - old_router = rimap_get(routerlist->identity_map, - router->cache_info.identity_digest); if (old_router) { if (!in_consensus && (router->cache_info.published_on <= old_router->cache_info.published_on)) { /* Same key, but old. This one is not listed in the consensus. */ - log_debug(LD_DIR, "Skipping not-new descriptor for router '%s'", + log_debug(LD_DIR, "Not-new descriptor for router '%s'", router->nickname); /* Only journal this desc if we'll be serving it. */ if (!from_cache && should_cache_old_descriptors()) @@ -2839,14 +3271,13 @@ &routerlist->desc_store); routerlist_insert_old(routerlist, router); *msg = "Router descriptor was not new."; - return -1; + return ROUTER_WAS_NOT_NEW; } else { /* Same key, and either new, or listed in the consensus. */ log_debug(LD_DIR, "Replacing entry for router '%s/%s' [%s]", router->nickname, old_router->nickname, hex_str(id_digest,DIGEST_LEN)); - if (router->addr == old_router->addr && - router->or_port == old_router->or_port) { + if (routers_have_same_or_addr(router, old_router)) { /* these carry over when the address and orport are unchanged. */ router->last_reachable = old_router->last_reachable; router->testing_since = old_router->testing_since; @@ -2860,37 +3291,40 @@ *msg = authdir_believes_valid ? "Valid server updated" : ("Invalid server updated. (This dirserver is marking your " "server as unapproved.)"); - return 0; + return ROUTER_ADDED_SUCCESSFULLY; } } if (!in_consensus && from_cache && router->cache_info.published_on < time(NULL) - OLD_ROUTER_DESC_MAX_AGE) { *msg = "Router descriptor was really old."; - return -1; + routerinfo_free(router); + return ROUTER_WAS_NOT_NEW; } /* We haven't seen a router with this identity before. Add it to the end of * the list. */ routerlist_insert(routerlist, router); - if (!from_cache) + if (!from_cache) { signed_desc_append_to_journal(&router->cache_info, &routerlist->desc_store); + } directory_set_dirty(); - return 0; + return ROUTER_ADDED_SUCCESSFULLY; } /** Insert ei into the routerlist, or free it. Other arguments are - * as for router_add_to_routerlist(). Return true iff we actually inserted - * it. + * as for router_add_to_routerlist(). Return ROUTER_ADDED_SUCCESSFULLY iff + * we actually inserted it, ROUTER_BAD_EI otherwise. */ -int +was_router_added_t router_add_extrainfo_to_routerlist(extrainfo_t *ei, const char **msg, int from_cache, int from_fetch) { int inserted; (void)from_fetch; if (msg) *msg = NULL; + /*XXXX022 Do something with msg */ inserted = extrainfo_insert(router_get_routerlist(), ei); @@ -2898,7 +3332,10 @@ signed_desc_append_to_journal(&ei->cache_info, &routerlist->extrainfo_store); - return inserted; + if (inserted) + return ROUTER_ADDED_SUCCESSFULLY; + else + return ROUTER_BAD_EI; } /** Sorting helper: return <0, 0, or >0 depending on whether the @@ -2943,7 +3380,7 @@ static void routerlist_remove_old_cached_routers_with_id(time_t now, time_t cutoff, int lo, int hi, - digestmap_t *retain) + digestset_t *retain) { int i, n = hi-lo+1; unsigned n_extra, n_rmv = 0; @@ -2960,10 +3397,9 @@ tor_assert(!memcmp(ident, r->identity_digest, DIGEST_LEN)); } #endif - /* Check whether we need to do anything at all. */ { - int mdpr = directory_caches_dir_info(get_options()) ? 5 : 2; + int mdpr = directory_caches_dir_info(get_options()) ? 2 : 1; if (n <= mdpr) return; n_extra = n - mdpr; @@ -2979,7 +3415,7 @@ signed_descriptor_t *r_next; lifespans[i-lo].idx = i; if (r->last_listed_as_valid_until >= now || - (retain && digestmap_get(retain, r->signed_descriptor_digest))) { + (retain && digestset_isin(retain, r->signed_descriptor_digest))) { must_keep[i-lo] = 1; } if (i < hi) { @@ -3035,10 +3471,11 @@ time_t cutoff; routerinfo_t *router; signed_descriptor_t *sd; - digestmap_t *retain; + digestset_t *retain; int caches = directory_caches_dir_info(get_options()); const networkstatus_t *consensus = networkstatus_get_latest_consensus(); const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list(); + int have_enough_v2; trusted_dirs_remove_old_certs(); @@ -3047,10 +3484,29 @@ // routerlist_assert_ok(routerlist); - retain = digestmap_new(); + /* We need to guess how many router descriptors we will wind up wanting to + retain, so that we can be sure to allocate a large enough Bloom filter + to hold the digest set. Overestimating is fine; underestimating is bad. + */ + { + /* We'll probably retain everything in the consensus. */ + int n_max_retain = smartlist_len(consensus->routerstatus_list); + if (caches && networkstatus_v2_list) { + /* If we care about v2 statuses, we'll retain at most as many as are + listed any of the v2 statues. This will be at least the length of + the largest v2 networkstatus, and in the worst case, this set will be + equal to the sum of the lengths of all v2 consensuses. Take the + worst case. + */ + SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns, + n_max_retain += smartlist_len(ns->entries)); + } + retain = digestset_new(n_max_retain); + } + cutoff = now - OLD_ROUTER_DESC_MAX_AGE; /* Build a list of all the descriptors that _anybody_ lists. */ - if (caches) { + if (caches && networkstatus_v2_list) { SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns, { /* XXXX The inner loop here gets pretty expensive, and actually shows up @@ -3063,7 +3519,7 @@ * system will obsolete this whole thing in 0.2.0.x. */ SMARTLIST_FOREACH(ns->entries, routerstatus_t *, rs, if (rs->published_on >= cutoff) - digestmap_set(retain, rs->descriptor_digest, (void*)1)); + digestset_add(retain, rs->descriptor_digest)); }); } @@ -3071,28 +3527,34 @@ if (consensus) { SMARTLIST_FOREACH(consensus->routerstatus_list, routerstatus_t *, rs, if (rs->published_on >= cutoff) - digestmap_set(retain, rs->descriptor_digest, (void*)1)); + digestset_add(retain, rs->descriptor_digest)); } - /* If we have a bunch of networkstatuses, we should consider pruning current - * routers that are too old and that nobody recommends. (If we don't have - * enough networkstatuses, then we should get more before we decide to kill + /* If we have a consensus, and nearly as many v2 networkstatuses as we want, + * we should consider pruning current routers that are too old and that + * nobody recommends. (If we don't have a consensus or enough v2 + * networkstatuses, then we should get more before we decide to kill * routers.) */ - if (!caches || - smartlist_len(networkstatus_v2_list) > get_n_v2_authorities() / 2) { + /* we set this to true iff we don't care about v2 info, or we have enough. */ + have_enough_v2 = !caches || + (networkstatus_v2_list && + smartlist_len(networkstatus_v2_list) > get_n_v2_authorities() / 2); + + if (have_enough_v2 && consensus) { cutoff = now - ROUTER_MAX_AGE; /* Remove too-old unrecommended members of routerlist->routers. */ for (i = 0; i < smartlist_len(routerlist->routers); ++i) { router = smartlist_get(routerlist->routers, i); if (router->cache_info.published_on <= cutoff && router->cache_info.last_listed_as_valid_until < now && - !digestmap_get(retain,router->cache_info.signed_descriptor_digest)) { + !digestset_isin(retain, + router->cache_info.signed_descriptor_digest)) { /* Too old: remove it. (If we're a cache, just move it into * old_routers.) */ log_info(LD_DIR, "Forgetting obsolete (too old) routerinfo for router '%s'", router->nickname); - routerlist_remove(routerlist, router, 1); + routerlist_remove(routerlist, router, 1, now); i--; } } @@ -3106,7 +3568,7 @@ sd = smartlist_get(routerlist->old_routers, i); if (sd->published_on <= cutoff && sd->last_listed_as_valid_until < now && - !digestmap_get(retain, sd->signed_descriptor_digest)) { + !digestset_isin(retain, sd->signed_descriptor_digest)) { /* Too old. Remove it. */ routerlist_remove_old(routerlist, sd, i--); } @@ -3114,11 +3576,9 @@ //routerlist_assert_ok(routerlist); - log_info(LD_DIR, "We have %d live routers and %d old router descriptors. " - "At most %d must be retained because of networkstatuses.", + log_info(LD_DIR, "We have %d live routers and %d old router descriptors.", smartlist_len(routerlist->routers), - smartlist_len(routerlist->old_routers), - digestmap_size(retain)); + smartlist_len(routerlist->old_routers)); /* Now we might have to look at routerlist->old_routers for extraneous * members. (We'd keep all the members if we could, but we need to save @@ -3127,9 +3587,10 @@ * total number doesn't approach max_descriptors_per_router()*len(router). */ if (smartlist_len(routerlist->old_routers) < - smartlist_len(routerlist->routers) * (caches?4:2)) + smartlist_len(routerlist->routers)) goto done; + /* Sort by identity, then fix indices. */ smartlist_sort(routerlist->old_routers, _compare_old_routers_by_identity); /* Fix indices. */ for (i = 0; i < smartlist_len(routerlist->old_routers); ++i) { @@ -3157,22 +3618,26 @@ //routerlist_assert_ok(routerlist); done: - digestmap_free(retain, NULL); + digestset_free(retain); router_rebuild_store(RRS_DONT_REMOVE_OLD, &routerlist->desc_store); router_rebuild_store(RRS_DONT_REMOVE_OLD,&routerlist->extrainfo_store); } /** We just added a new set of descriptors. Take whatever extra steps * we need. */ -static void +void routerlist_descriptors_added(smartlist_t *sl, int from_cache) { tor_assert(sl); control_event_descriptors_changed(sl); - SMARTLIST_FOREACH(sl, routerinfo_t *, ri, + SMARTLIST_FOREACH_BEGIN(sl, routerinfo_t *, ri) { if (ri->purpose == ROUTER_PURPOSE_BRIDGE) learned_bridge_descriptor(ri, from_cache); - ); + if (ri->needs_retest_if_added) { + ri->needs_retest_if_added = 0; + dirserv_single_reachability_test(approx_time(), ri); + } + } SMARTLIST_FOREACH_END(ri); } /** @@ -3192,7 +3657,7 @@ const char **msg) { routerinfo_t *ri; - int r; + was_router_added_t r; smartlist_t *lst; char annotation_buf[ROUTER_ANNOTATION_BUF_LEN]; tor_assert(msg); @@ -3222,10 +3687,11 @@ smartlist_add(lst, ri); routers_update_status_from_consensus_networkstatus(lst, 0); - if ((r=router_add_to_routerlist(ri, msg, 0, 0))<0) { + r = router_add_to_routerlist(ri, msg, 0, 0); + if (!WRA_WAS_ADDED(r)) { /* we've already assigned to *msg now, and ri is already freed */ tor_assert(*msg); - if (r < -1) + if (r == ROUTER_AUTHDIR_REJECTS) log_warn(LD_DIR, "Couldn't add router to list: %s Dropping.", *msg); smartlist_free(lst); return 0; @@ -3242,6 +3708,8 @@ * are in response to a query to the network: cache them by adding them to * the journal. * + * Return the number of routers actually added. + * * If requested_fingerprints is provided, it must contain a list of * uppercased fingerprints. Do not update any router whose * fingerprint is not on the list; after updating a router, remove its @@ -3250,7 +3718,7 @@ * If descriptor_digests is non-zero, then the requested_fingerprints * are descriptor digests. Otherwise they are identity digests. */ -void +int router_load_routers_from_string(const char *s, const char *eos, saved_location_t saved_location, smartlist_t *requested_fingerprints, @@ -3271,8 +3739,9 @@ log_info(LD_DIR, "%d elements to add", smartlist_len(routers)); - SMARTLIST_FOREACH(routers, routerinfo_t *, ri, - { + SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) { + was_router_added_t r; + char d[DIGEST_LEN]; if (requested_fingerprints) { base16_encode(fp, sizeof(fp), descriptor_digests ? ri->cache_info.signed_descriptor_digest : @@ -3293,13 +3762,23 @@ } } - if (router_add_to_routerlist(ri, &msg, from_cache, !from_cache) >= 0) { - any_changed = 1; + memcpy(d, ri->cache_info.signed_descriptor_digest, DIGEST_LEN); + r = router_add_to_routerlist(ri, &msg, from_cache, !from_cache); + if (WRA_WAS_ADDED(r)) { + any_changed++; smartlist_add(changed, ri); routerlist_descriptors_added(changed, from_cache); smartlist_clear(changed); + } else if (WRA_WAS_REJECTED(r)) { + download_status_t *dl_status; + dl_status = router_get_dl_status_by_descriptor_digest(d); + if (dl_status) { + log_info(LD_GENERAL, "Marking router %s as never downloadable", + hex_str(d, DIGEST_LEN)); + download_status_mark_impossible(dl_status); + } } - }); + } SMARTLIST_FOREACH_END(ri); routerlist_assert_ok(routerlist); @@ -3308,6 +3787,8 @@ smartlist_free(routers); smartlist_free(changed); + + return any_changed; } /** Parse one or more extrainfos from s (ending immediately before @@ -3329,9 +3810,9 @@ log_info(LD_DIR, "%d elements to add", smartlist_len(extrainfo_list)); SMARTLIST_FOREACH(extrainfo_list, extrainfo_t *, ei, { - int added = + was_router_added_t added = router_add_extrainfo_to_routerlist(ei, &msg, from_cache, !from_cache); - if (added && requested_fingerprints) { + if (WRA_WAS_ADDED(added) && requested_fingerprints) { char fp[HEX_DIGEST_LEN+1]; base16_encode(fp, sizeof(fp), descriptor_digests ? ei->cache_info.signed_descriptor_digest : @@ -3417,14 +3898,13 @@ int router_exit_policy_rejects_all(routerinfo_t *router) { - return compare_addr_to_addr_policy(0, 0, router->exit_policy) - == ADDR_POLICY_REJECTED; + return router->policy_is_reject_star; } -/** Add to the list of authorized directory servers one at +/** Add to the list of authoritative directory servers one at * address:port, with identity key digest. If - * address is NULL, add ourself. Return 0 if success, -1 if - * we couldn't add it. */ + * address is NULL, add ourself. Return the new trusted directory + * server entry on success or NULL if we couldn't add it. */ trusted_dir_server_t * add_trusted_dir_server(const char *nickname, const char *address, uint16_t dir_port, uint16_t or_port, @@ -3489,6 +3969,8 @@ if (ent->or_port) ent->fake_status.version_supports_begindir = 1; + ent->fake_status.version_supports_conditional_consensus = 1; + smartlist_add(trusted_dir_servers, ent); router_dir_info_changed(); return ent; @@ -3502,10 +3984,8 @@ return; tor_free(cert->cache_info.signed_descriptor_body); - if (cert->signing_key) - crypto_free_pk_env(cert->signing_key); - if (cert->identity_key) - crypto_free_pk_env(cert->identity_key); + crypto_free_pk_env(cert->signing_key); + crypto_free_pk_env(cert->identity_key); tor_free(cert); } @@ -3514,6 +3994,9 @@ static void trusted_dir_server_free(trusted_dir_server_t *ds) { + if (!ds) + return; + tor_free(ds->nickname); tor_free(ds->description); tor_free(ds->address); @@ -3567,7 +4050,7 @@ const char *resource = TO_DIR_CONN(conn)->requested_resource; if (!strcmpstart(resource, prefix)) dir_split_resource_into_fingerprints(resource + p_len, - tmp, NULL, 1, 0); + tmp, NULL, DSR_HEX); } }); SMARTLIST_FOREACH(tmp, char *, d, @@ -3598,7 +4081,7 @@ initiate_descriptor_downloads(routerstatus_t *source, int purpose, smartlist_t *digests, - int lo, int hi) + int lo, int hi, int pds_flags) { int i, n = hi-lo; char *resource, *cp; @@ -3629,15 +4112,12 @@ 0, /* not private */ resource, NULL, 0, 0); } else { - directory_get_from_dirserver(purpose, ROUTER_PURPOSE_GENERAL, resource, 1); + directory_get_from_dirserver(purpose, ROUTER_PURPOSE_GENERAL, resource, + pds_flags); } tor_free(resource); } -/** Clients don't download any descriptor this recent, since it will probably - * not have propagated to enough caches. */ -#define ESTIMATED_PROPAGATION_TIME (10*60) - /** Return 0 if this routerstatus is obsolete, too new, isn't * running, or otherwise not a descriptor that we would make any * use of even if we had it. Else return 1. */ @@ -3649,7 +4129,8 @@ * But, if we want to have a complete list, fetch it anyway. */ return 0; } - if (rs->published_on + ESTIMATED_PROPAGATION_TIME > now) { + if (rs->published_on + options->TestingEstimatedDescriptorPropagationTime + > now) { /* Most caches probably don't have this descriptor yet. */ return 0; } @@ -3671,7 +4152,7 @@ * this number per server. */ #define MIN_DL_PER_REQUEST 4 /** To prevent a single screwy cache from confusing us by selective reply, - * try to split our requests into at least this this many requests. */ + * try to split our requests into at least this many requests. */ #define MIN_REQUESTS 3 /** If we want fewer than this many descriptors, wait until we * want more, or until MAX_CLIENT_INTERVAL_WITHOUT_REQUEST has @@ -3685,7 +4166,8 @@ * whether to delay fetching until we have more. If we don't want to delay, * launch one or more requests to the appropriate directory authorities. */ static void -launch_router_descriptor_downloads(smartlist_t *downloadable, time_t now) +launch_router_descriptor_downloads(smartlist_t *downloadable, + routerstatus_t *source, time_t now) { int should_delay = 0, n_downloadable; or_options_t *options = get_options(); @@ -3722,7 +4204,23 @@ if (! should_delay && n_downloadable) { int i, n_per_request; const char *req_plural = "", *rtr_plural = ""; - n_per_request = (n_downloadable+MIN_REQUESTS-1) / MIN_REQUESTS; + int pds_flags = PDS_RETRY_IF_NO_SERVERS; + if (! authdir_mode_any_nonhidserv(options)) { + /* If we wind up going to the authorities, we want to only open one + * connection to each authority at a time, so that we don't overload + * them. We do this by setting PDS_NO_EXISTING_SERVERDESC_FETCH + * regardless of whether we're a cache or not; it gets ignored if we're + * not calling router_pick_trusteddirserver. + * + * Setting this flag can make initiate_descriptor_downloads() ignore + * requests. We need to make sure that we do in fact call + * update_router_descriptor_downloads() later on, once the connections + * have succeeded or failed. + */ + pds_flags |= PDS_NO_EXISTING_SERVERDESC_FETCH; + } + + n_per_request = CEIL_DIV(n_downloadable, MIN_REQUESTS); if (n_per_request > MAX_DL_PER_REQUEST) n_per_request = MAX_DL_PER_REQUEST; if (n_per_request < MIN_DL_PER_REQUEST) @@ -3735,12 +4233,13 @@ log_info(LD_DIR, "Launching %d request%s for %d router%s, %d at a time", - (n_downloadable+n_per_request-1)/n_per_request, + CEIL_DIV(n_downloadable, n_per_request), req_plural, n_downloadable, rtr_plural, n_per_request); smartlist_sort_digests(downloadable); for (i=0; i < n_downloadable; i += n_per_request) { - initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_SERVERDESC, - downloadable, i, i+n_per_request); + initiate_descriptor_downloads(source, DIR_PURPOSE_FETCH_SERVERDESC, + downloadable, i, i+n_per_request, + pds_flags); } last_routerdesc_download_attempted = now; } @@ -3866,8 +4365,12 @@ trusted_dir_server_t *ds = router_get_trusteddirserver_by_digest(ns->identity_digest); smartlist_t *dl = download_from[i]; + int pds_flags = PDS_RETRY_IF_NO_SERVERS; + if (! authdir_mode_any_nonhidserv(options)) + pds_flags |= PDS_NO_EXISTING_SERVERDESC_FETCH; /* XXXX ignored*/ + if (!ds) { - log_warn(LD_BUG, "Networkstatus with no corresponding authority!"); + log_info(LD_DIR, "Networkstatus with no corresponding authority!"); continue; } if (! smartlist_len(dl)) @@ -3877,7 +4380,7 @@ for (j=0; j < smartlist_len(dl); j += MAX_DL_PER_REQUEST) { initiate_descriptor_downloads(&(ds->fake_status), DIR_PURPOSE_FETCH_SERVERDESC, dl, j, - j+MAX_DL_PER_REQUEST); + j+MAX_DL_PER_REQUEST, pds_flags); } } @@ -3890,18 +4393,18 @@ digestmap_free(map,NULL); } -/** For any descriptor that we want that's currently listed in the live - * consensus, download it as appropriate. */ -static void -update_consensus_router_descriptor_downloads(time_t now) +/** For any descriptor that we want that's currently listed in + * consensus, download it as appropriate. */ +void +update_consensus_router_descriptor_downloads(time_t now, int is_vote, + networkstatus_t *consensus) { or_options_t *options = get_options(); digestmap_t *map = NULL; smartlist_t *no_longer_old = smartlist_create(); smartlist_t *downloadable = smartlist_create(); + routerstatus_t *source = NULL; int authdir = authdir_mode(options); - networkstatus_t *consensus = - networkstatus_get_reasonably_live_consensus(now); int n_delayed=0, n_have=0, n_would_reject=0, n_wouldnt_use=0, n_inprogress=0, n_in_oldrouters=0; @@ -3910,10 +4413,24 @@ if (!consensus) goto done; + if (is_vote) { + /* where's it from, so we know whom to ask for descriptors */ + trusted_dir_server_t *ds; + networkstatus_voter_info_t *voter = smartlist_get(consensus->voters, 0); + tor_assert(voter); + ds = trusteddirserver_get_by_v3_auth_digest(voter->identity_digest); + if (ds) + source = &(ds->fake_status); + else + log_warn(LD_DIR, "couldn't lookup source from vote?"); + } + map = digestmap_new(); list_pending_descriptor_downloads(map, 0); - SMARTLIST_FOREACH(consensus->routerstatus_list, routerstatus_t *, rs, + SMARTLIST_FOREACH(consensus->routerstatus_list, void *, rsp, { + routerstatus_t *rs = + is_vote ? &(((vote_routerstatus_t *)rsp)->status) : rsp; signed_descriptor_t *sd; if ((sd = router_get_by_descriptor_digest(rs->descriptor_digest))) { routerinfo_t *ri; @@ -3948,6 +4465,18 @@ ++n_wouldnt_use; continue; /* We would never use it ourself. */ } + if (is_vote && source) { + char time_bufnew[ISO_TIME_LEN+1]; + char time_bufold[ISO_TIME_LEN+1]; + routerinfo_t *oldrouter = router_get_by_digest(rs->identity_digest); + format_iso_time(time_bufnew, rs->published_on); + if (oldrouter) + format_iso_time(time_bufold, oldrouter->cache_info.published_on); + log_info(LD_DIR, "Learned about %s (%s vs %s) from %s's vote (%s)", + rs->nickname, time_bufnew, + oldrouter ? time_bufold : "none", + source->nickname, oldrouter ? "known" : "unknown"); + } smartlist_add(downloadable, rs->descriptor_digest); }); @@ -3959,14 +4488,14 @@ smartlist_len(no_longer_old)); SMARTLIST_FOREACH(no_longer_old, signed_descriptor_t *, sd, { const char *msg; - int r; + was_router_added_t r; routerinfo_t *ri = routerlist_reparse_old(rl, sd); if (!ri) { log_warn(LD_BUG, "Failed to re-parse a router."); continue; } r = router_add_to_routerlist(ri, &msg, 1, 0); - if (r == -1) { + if (WRA_WAS_OUTDATED(r)) { log_warn(LD_DIR, "Couldn't add re-parsed router: %s", msg?msg:"???"); } @@ -3981,7 +4510,7 @@ smartlist_len(downloadable), n_delayed, n_have, n_in_oldrouters, n_would_reject, n_wouldnt_use, n_inprogress); - launch_router_descriptor_downloads(downloadable, now); + launch_router_descriptor_downloads(downloadable, source, now); digestmap_free(map, NULL); done: @@ -4006,7 +4535,8 @@ if (directory_fetches_dir_info_early(options)) { update_router_descriptor_cache_downloads_v2(now); } - update_consensus_router_descriptor_downloads(now); + update_consensus_router_descriptor_downloads(now, 0, + networkstatus_get_reasonably_live_consensus(now)); /* XXXX021 we could be smarter here; see notes on bug 652. */ /* If we're a server that doesn't have a configured address, we rely on @@ -4018,7 +4548,8 @@ last_dummy_download + DUMMY_DOWNLOAD_INTERVAL < now) { last_dummy_download = now; directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC, - ROUTER_PURPOSE_GENERAL, "authority.z", 1); + ROUTER_PURPOSE_GENERAL, "authority.z", + PDS_RETRY_IF_NO_SERVERS); } } @@ -4088,7 +4619,8 @@ smartlist_shuffle(wanted); for (i = 0; i < smartlist_len(wanted); i += MAX_DL_PER_REQUEST) { initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_EXTRAINFO, - wanted, i, i + MAX_DL_PER_REQUEST); + wanted, i, i + MAX_DL_PER_REQUEST, + PDS_RETRY_IF_NO_SERVERS|PDS_NO_EXISTING_SERVERDESC_FETCH); } smartlist_free(wanted); @@ -4138,6 +4670,59 @@ return dir_info_status; } +/** Iterate over the servers listed in consensus, and count how many of + * them seem like ones we'd use, and how many of those we have + * descriptors for. Store the former in *num_usable and the latter in + * *num_present. */ +static void +count_usable_descriptors(int *num_present, int *num_usable, + const networkstatus_t *consensus, + or_options_t *options, time_t now) +{ + *num_present = 0, *num_usable=0; + + SMARTLIST_FOREACH(consensus->routerstatus_list, routerstatus_t *, rs, + { + if (client_would_use_router(rs, now, options)) { + ++*num_usable; /* the consensus says we want it. */ + if (router_get_by_descriptor_digest(rs->descriptor_digest)) { + /* we have the descriptor listed in the consensus. */ + ++*num_present; + } + } + }); + + log_debug(LD_DIR, "%d usable, %d present.", *num_usable, *num_present); +} + +/** We just fetched a new set of descriptors. Compute how far through + * the "loading descriptors" bootstrapping phase we are, so we can inform + * the controller of our progress. */ +int +count_loading_descriptors_progress(void) +{ + int num_present = 0, num_usable=0; + time_t now = time(NULL); + const networkstatus_t *consensus = + networkstatus_get_reasonably_live_consensus(now); + double fraction; + + if (!consensus) + return 0; /* can't count descriptors if we have no list of them */ + + count_usable_descriptors(&num_present, &num_usable, + consensus, get_options(), now); + + if (num_usable == 0) + return 0; /* don't div by 0 */ + fraction = num_present / (num_usable/4.); + if (fraction > 1.0) + return 0; /* it's not the number of descriptors holding us back */ + return BOOTSTRAP_STATUS_LOADING_DESCRIPTORS + (int) + (fraction*(BOOTSTRAP_STATUS_CONN_OR-1 - + BOOTSTRAP_STATUS_LOADING_DESCRIPTORS)); +} + /** Change the value of have_min_dir_info, setting it true iff we have enough * network and router information to build circuits. Clear the value of * need_to_update_have_min_dir_info. */ @@ -4170,24 +4755,17 @@ goto done; } - SMARTLIST_FOREACH(consensus->routerstatus_list, routerstatus_t *, rs, - { - if (client_would_use_router(rs, now, options)) { - ++num_usable; - if (router_get_by_descriptor_digest(rs->descriptor_digest)) { - ++num_present; - } - } - }); + count_usable_descriptors(&num_present, &num_usable, consensus, options, now); if (num_present < num_usable/4) { tor_snprintf(dir_info_status, sizeof(dir_info_status), "We have only %d/%d usable descriptors.", num_present, num_usable); res = 0; + control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS, 0); } else if (num_present < 2) { tor_snprintf(dir_info_status, sizeof(dir_info_status), - "Only %d usable descriptor%s known!", num_present, - num_present ? "" : "s"); + "Only %d descriptor%s here and believed reachable!", + num_present, num_present ? "" : "s"); res = 0; } else { res = 1; @@ -4198,6 +4776,7 @@ log(LOG_NOTICE, LD_DIR, "We now have enough directory information to build circuits."); control_event_client_status(LOG_NOTICE, "ENOUGH_DIR_INFO"); + control_event_bootstrap(BOOTSTRAP_STATUS_CONN_OR, 0); } if (!res && have_min_dir_info) { int quiet = directory_too_idle_to_fetch_descriptors(options, now); @@ -4290,6 +4869,11 @@ (r2->bandwidthcapacity < r1->bandwidthcapacity/2)) return 0; + /* Did the bandwidthrate or bandwidthburst change? */ + if ((r1->bandwidthrate != r2->bandwidthrate) || + (r1->bandwidthburst != r2->bandwidthburst)) + return 0; + /* Did more than 12 hours pass? */ if (r1->cache_info.published_on + ROUTER_MAX_COSMETIC_TIME_DIFFERENCE < r2->cache_info.published_on) @@ -4403,7 +4987,7 @@ r->cache_info.signed_descriptor_digest); tor_assert(&(r->cache_info) == sd2); tor_assert(r->cache_info.routerlist_index == r_sl_idx); - /* XXXX021. + /* XXXX * * Hoo boy. We need to fix this one, and the fix is a bit tricky, so * commenting this out is just a band-aid. @@ -4420,7 +5004,6 @@ * reset our retry count for an extrainfo, but that's not the end * of the world. Changing the representation in 0.2.0.x would just * destabilize the codebase. - if (!tor_digest_is_zero(r->cache_info.extra_info_digest)) { signed_descriptor_t *sd3 = sdmap_get(rl->desc_by_eid_map, r->cache_info.extra_info_digest); @@ -4435,7 +5018,7 @@ sd2 = sdmap_get(rl->desc_digest_map, sd->signed_descriptor_digest); tor_assert(sd == sd2); tor_assert(sd->routerlist_index == sd_sl_idx); - /* XXXX021 see above. + /* XXXX see above. if (!tor_digest_is_zero(sd->extra_info_digest)) { signed_descriptor_t *sd3 = sdmap_get(rl->desc_by_eid_map, sd->extra_info_digest); @@ -4461,7 +5044,7 @@ d, DIGEST_LEN)); sd = sdmap_get(rl->desc_by_eid_map, ei->cache_info.signed_descriptor_digest); - // tor_assert(sd); // XXXX021 see above + // tor_assert(sd); // XXXX see above if (sd) { tor_assert(!memcmp(ei->cache_info.signed_descriptor_digest, sd->extra_info_digest, DIGEST_LEN)); @@ -4485,8 +5068,8 @@ static char *info=NULL; char *esc_contact, *esc_platform; size_t len; - if (info) - tor_free(info); + tor_free(info); + if (!router) return NULL; /* we're exiting; just free the memory we use */ @@ -4521,6 +5104,467 @@ smartlist_sort(routers, _compare_routerinfo_by_id_digest); } +/** A routerset specifies constraints on a set of possible routerinfos, based + * on their names, identities, or addresses. It is optimized for determining + * whether a router is a member or not, in O(1+P) time, where P is the number + * of address policy constraints. */ +struct routerset_t { + /** A list of strings for the elements of the policy. Each string is either + * a nickname, a hexadecimal identity fingerprint, or an address policy. A + * router belongs to the set if its nickname OR its identity OR its address + * matches an entry here. */ + smartlist_t *list; + /** A map from lowercase nicknames of routers in the set to (void*)1 */ + strmap_t *names; + /** A map from identity digests routers in the set to (void*)1 */ + digestmap_t *digests; + /** An address policy for routers in the set. For implementation reasons, + * a router belongs to the set if it is _rejected_ by this policy. */ + smartlist_t *policies; + + /** A human-readable description of what this routerset is for. Used in + * log messages. */ + char *description; + + /** A list of the country codes in this set. */ + smartlist_t *country_names; + /** Total number of countries we knew about when we built countries.*/ + int n_countries; + /** Bit array mapping the return value of geoip_get_country() to 1 iff the + * country is a member of this routerset. Note that we MUST call + * routerset_refresh_countries() whenever the geoip country list is + * reloaded. */ + bitarray_t *countries; +}; + +/** Return a new empty routerset. */ +routerset_t * +routerset_new(void) +{ + routerset_t *result = tor_malloc_zero(sizeof(routerset_t)); + result->list = smartlist_create(); + result->names = strmap_new(); + result->digests = digestmap_new(); + result->policies = smartlist_create(); + result->country_names = smartlist_create(); + return result; +} + +/** If c is a country code in the form {cc}, return a newly allocated + * string holding the "cc" part. Else, return NULL. */ +static char * +routerset_get_countryname(const char *c) +{ + char *country; + + if (strlen(c) < 4 || c[0] !='{' || c[3] !='}') + return NULL; + + country = tor_strndup(c+1, 2); + tor_strlower(country); + return country; +} + +#if 0 +/** Add the GeoIP database's integer index (+1) of a valid two-character + * country code to the routerset's countries bitarray. Return the + * integer index if the country code is valid, -1 otherwise.*/ +static int +routerset_add_country(const char *c) +{ + char country[3]; + country_t cc; + + /* XXXX: Country codes must be of the form \{[a-z\?]{2}\} but this accepts + \{[.]{2}\}. Do we need to be strict? -RH */ + /* Nope; if the country code is bad, we'll get 0 when we look it up. */ + + if (!geoip_is_loaded()) { + log(LOG_WARN, LD_CONFIG, "GeoIP database not loaded: Cannot add country" + "entry %s, ignoring.", c); + return -1; + } + + memcpy(country, c+1, 2); + country[2] = '\0'; + tor_strlower(country); + + if ((cc=geoip_get_country(country))==-1) { + log(LOG_WARN, LD_CONFIG, "Country code '%s' is not valid, ignoring.", + country); + } + return cc; +} +#endif + +/** Update the routerset's countries bitarray_t. Called whenever + * the GeoIP database is reloaded. + */ +void +routerset_refresh_countries(routerset_t *target) +{ + int cc; + bitarray_free(target->countries); + + if (!geoip_is_loaded()) { + target->countries = NULL; + target->n_countries = 0; + return; + } + target->n_countries = geoip_get_n_countries(); + target->countries = bitarray_init_zero(target->n_countries); + SMARTLIST_FOREACH_BEGIN(target->country_names, const char *, country) { + cc = geoip_get_country(country); + if (cc >= 0) { + tor_assert(cc < target->n_countries); + bitarray_set(target->countries, cc); + } else { + log(LOG_WARN, LD_CONFIG, "Country code '%s' is not recognized.", + country); + } + } SMARTLIST_FOREACH_END(country); +} + +/** Parse the string s to create a set of routerset entries, and add + * them to target. In log messages, refer to the string as + * description. Return 0 on success, -1 on failure. + * + * Three kinds of elements are allowed in routersets: nicknames, IP address + * patterns, and fingerprints. They may be surrounded by optional space, and + * must be separated by commas. + */ +int +routerset_parse(routerset_t *target, const char *s, const char *description) +{ + int r = 0; + int added_countries = 0; + char *countryname; + smartlist_t *list = smartlist_create(); + smartlist_split_string(list, s, ",", + SPLIT_SKIP_SPACE | SPLIT_IGNORE_BLANK, 0); + SMARTLIST_FOREACH_BEGIN(list, char *, nick) { + addr_policy_t *p; + if (is_legal_hexdigest(nick)) { + char d[DIGEST_LEN]; + if (*nick == '$') + ++nick; + log_debug(LD_CONFIG, "Adding identity %s to %s", nick, description); + base16_decode(d, sizeof(d), nick, HEX_DIGEST_LEN); + digestmap_set(target->digests, d, (void*)1); + } else if (is_legal_nickname(nick)) { + log_debug(LD_CONFIG, "Adding nickname %s to %s", nick, description); + strmap_set_lc(target->names, nick, (void*)1); + } else if ((countryname = routerset_get_countryname(nick)) != NULL) { + log_debug(LD_CONFIG, "Adding country %s to %s", nick, + description); + smartlist_add(target->country_names, countryname); + added_countries = 1; + } else if ((strchr(nick,'.') || strchr(nick, '*')) && + (p = router_parse_addr_policy_item_from_string( + nick, ADDR_POLICY_REJECT))) { + log_debug(LD_CONFIG, "Adding address %s to %s", nick, description); + smartlist_add(target->policies, p); + } else { + log_warn(LD_CONFIG, "Entry '%s' in %s is misformed.", nick, + description); + r = -1; + tor_free(nick); + SMARTLIST_DEL_CURRENT(list, nick); + } + } SMARTLIST_FOREACH_END(nick); + smartlist_add_all(target->list, list); + smartlist_free(list); + if (added_countries) + routerset_refresh_countries(target); + return r; +} + +/** Called when we change a node set, or when we reload the geoip list: + * recompute all country info in all configuration node sets and in the + * routerlist. */ +void +refresh_all_country_info(void) +{ + or_options_t *options = get_options(); + + if (options->EntryNodes) + routerset_refresh_countries(options->EntryNodes); + if (options->ExitNodes) + routerset_refresh_countries(options->ExitNodes); + if (options->ExcludeNodes) + routerset_refresh_countries(options->ExcludeNodes); + if (options->ExcludeExitNodes) + routerset_refresh_countries(options->ExcludeExitNodes); + if (options->_ExcludeExitNodesUnion) + routerset_refresh_countries(options->_ExcludeExitNodesUnion); + + routerlist_refresh_countries(); +} + +/** Add all members of the set source to target. */ +void +routerset_union(routerset_t *target, const routerset_t *source) +{ + char *s; + tor_assert(target); + if (!source || !source->list) + return; + s = routerset_to_string(source); + routerset_parse(target, s, "other routerset"); + tor_free(s); +} + +/** Return true iff set lists only nicknames and digests, and includes + * no IP ranges or countries. */ +int +routerset_is_list(const routerset_t *set) +{ + return smartlist_len(set->country_names) == 0 && + smartlist_len(set->policies) == 0; +} + +/** Return true iff we need a GeoIP IP-to-country database to make sense of + * set. */ +int +routerset_needs_geoip(const routerset_t *set) +{ + return set && smartlist_len(set->country_names); +} + +/** Return true iff there are no entries in set. */ +static int +routerset_is_empty(const routerset_t *set) +{ + return !set || smartlist_len(set->list) == 0; +} + +/** Helper. Return true iff set contains a router based on the other + * provided fields. Return higher values for more specific subentries: a + * single router is more specific than an address range of routers, which is + * more specific in turn than a country code. + * + * (If country is -1, then we take the country + * from addr.) */ +static int +routerset_contains(const routerset_t *set, const tor_addr_t *addr, + uint16_t orport, + const char *nickname, const char *id_digest, int is_named, + country_t country) +{ + if (!set || !set->list) return 0; + (void) is_named; /* not supported */ + if (nickname && strmap_get_lc(set->names, nickname)) + return 4; + if (id_digest && digestmap_get(set->digests, id_digest)) + return 4; + if (addr && compare_tor_addr_to_addr_policy(addr, orport, set->policies) + == ADDR_POLICY_REJECTED) + return 3; + if (set->countries) { + if (country < 0 && addr) + country = geoip_get_country_by_ip(tor_addr_to_ipv4h(addr)); + + if (country >= 0 && country < set->n_countries && + bitarray_is_set(set->countries, country)) + return 2; + } + return 0; +} + +/** Return true iff we can tell that ei is a member of set. */ +int +routerset_contains_extendinfo(const routerset_t *set, const extend_info_t *ei) +{ + return routerset_contains(set, + &ei->addr, + ei->port, + ei->nickname, + ei->identity_digest, + -1, /*is_named*/ + -1 /*country*/); +} + +/** Return true iff ri is in set. */ +int +routerset_contains_router(const routerset_t *set, routerinfo_t *ri) +{ + tor_addr_t addr; + tor_addr_from_ipv4h(&addr, ri->addr); + return routerset_contains(set, + &addr, + ri->or_port, + ri->nickname, + ri->cache_info.identity_digest, + ri->is_named, + ri->country); +} + +/** Return true iff rs is in set. */ +int +routerset_contains_routerstatus(const routerset_t *set, routerstatus_t *rs) +{ + tor_addr_t addr; + tor_addr_from_ipv4h(&addr, rs->addr); + return routerset_contains(set, + &addr, + rs->or_port, + rs->nickname, + rs->identity_digest, + rs->is_named, + -1); +} + +/** Add every known routerinfo_t that is a member of routerset to + * out. If running_only, only add the running ones. */ +void +routerset_get_all_routers(smartlist_t *out, const routerset_t *routerset, + int running_only) +{ + tor_assert(out); + if (!routerset || !routerset->list) + return; + if (!warned_nicknames) + warned_nicknames = smartlist_create(); + if (routerset_is_list(routerset)) { + + /* No routers are specified by type; all are given by name or digest. + * we can do a lookup in O(len(list)). */ + SMARTLIST_FOREACH(routerset->list, const char *, name, { + routerinfo_t *router = router_get_by_nickname(name, 1); + if (router) { + if (!running_only || router->is_running) + smartlist_add(out, router); + } + }); + } else { + /* We need to iterate over the routerlist to get all the ones of the + * right kind. */ + routerlist_t *rl = router_get_routerlist(); + SMARTLIST_FOREACH(rl->routers, routerinfo_t *, router, { + if (running_only && !router->is_running) + continue; + if (routerset_contains_router(routerset, router)) + smartlist_add(out, router); + }); + } +} + +/** Add to target every routerinfo_t from source except: + * + * 1) Don't add it if include is non-empty and the relay isn't in + * include; and + * 2) Don't add it if exclude is non-empty and the relay is + * excluded in a more specific fashion by exclude. + * 3) If running_only, don't add non-running routers. + */ +void +routersets_get_disjunction(smartlist_t *target, + const smartlist_t *source, + const routerset_t *include, + const routerset_t *exclude, int running_only) +{ + SMARTLIST_FOREACH(source, routerinfo_t *, router, { + int include_result; + if (running_only && !router->is_running) + continue; + if (!routerset_is_empty(include)) + include_result = routerset_contains_router(include, router); + else + include_result = 1; + + if (include_result) { + int exclude_result = routerset_contains_router(exclude, router); + if (include_result >= exclude_result) + smartlist_add(target, router); + } + }); +} + +/** Remove every routerinfo_t from lst that is in routerset. */ +void +routerset_subtract_routers(smartlist_t *lst, const routerset_t *routerset) +{ + tor_assert(lst); + if (!routerset) + return; + SMARTLIST_FOREACH(lst, routerinfo_t *, r, { + if (routerset_contains_router(routerset, r)) { + //log_debug(LD_DIR, "Subtracting %s",r->nickname); + SMARTLIST_DEL_CURRENT(lst, r); + } + }); +} + +/** Return a new string that when parsed by routerset_parse_string() will + * yield set. */ +char * +routerset_to_string(const routerset_t *set) +{ + if (!set || !set->list) + return tor_strdup(""); + return smartlist_join_strings(set->list, ",", 0, NULL); +} + +/** Helper: return true iff old and new are both NULL, or both non-NULL + * equal routersets. */ +int +routerset_equal(const routerset_t *old, const routerset_t *new) +{ + if (old == NULL && new == NULL) + return 1; + else if (old == NULL || new == NULL) + return 0; + + if (smartlist_len(old->list) != smartlist_len(new->list)) + return 0; + + SMARTLIST_FOREACH(old->list, const char *, cp1, { + const char *cp2 = smartlist_get(new->list, cp1_sl_idx); + if (strcmp(cp1, cp2)) + return 0; + }); + + return 1; +} + +/** Free all storage held in routerset. */ +void +routerset_free(routerset_t *routerset) +{ + if (!routerset) + return; + + SMARTLIST_FOREACH(routerset->list, char *, cp, tor_free(cp)); + smartlist_free(routerset->list); + SMARTLIST_FOREACH(routerset->policies, addr_policy_t *, p, + addr_policy_free(p)); + smartlist_free(routerset->policies); + SMARTLIST_FOREACH(routerset->country_names, char *, cp, tor_free(cp)); + smartlist_free(routerset->country_names); + + strmap_free(routerset->names, NULL); + digestmap_free(routerset->digests, NULL); + bitarray_free(routerset->countries); + tor_free(routerset); +} + +/** Refresh the country code of ri. This function MUST be called on + * each router when the GeoIP database is reloaded, and on all new routers. */ +void +routerinfo_set_country(routerinfo_t *ri) +{ + ri->country = geoip_get_country_by_ip(ri->addr); +} + +/** Set the country code of all routers in the routerlist. */ +void +routerlist_refresh_countries(void) +{ + routerlist_t *rl = router_get_routerlist(); + SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, + routerinfo_set_country(ri)); +} + /** Determine the routers that are responsible for id (binary) and * add pointers to those routers' routerstatus_t to responsible_dirs. * Return -1 if we're returning an empty smartlist, else return 0. @@ -4531,6 +5575,7 @@ { int start, found, n_added = 0, i; networkstatus_t *c = networkstatus_get_latest_consensus(); + int use_begindir = get_options()->TunnelDirConns; if (!c || !smartlist_len(c->routerstatus_list)) { log_warn(LD_REND, "We don't have a consensus, so we can't perform v2 " "rendezvous operations."); @@ -4543,9 +5588,14 @@ do { routerstatus_t *r = smartlist_get(c->routerstatus_list, i); if (r->is_hs_dir) { - smartlist_add(responsible_dirs, r); + if (r->dir_port || use_begindir) + smartlist_add(responsible_dirs, r); + else + log_info(LD_REND, "Not adding router '%s' to list of responsible " + "hidden service directories, because we have no way of " + "reaching it.", r->nickname); if (++n_added == REND_NUMBER_OF_CONSECUTIVE_REPLICAS) - return 0; + break; } if (++i == smartlist_len(c->routerstatus_list)) i = 0; diff -Nru tor-0.2.0.34/src/or/routerlist.h tor-0.2.2.16-alpha/src/or/routerlist.h --- tor-0.2.0.34/src/or/routerlist.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/routerlist.h 2010-09-17 01:30:36.000000000 +0000 @@ -0,0 +1,196 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file routerlist.h + * \brief Header file for routerlist.c. + **/ + +#ifndef _TOR_ROUTERLIST_H +#define _TOR_ROUTERLIST_H + +int get_n_authorities(authority_type_t type); +int trusted_dirs_reload_certs(void); +int trusted_dirs_load_certs_from_string(const char *contents, int from_store, + int flush); +void trusted_dirs_flush_certs_to_disk(void); +authority_cert_t *authority_cert_get_newest_by_id(const char *id_digest); +authority_cert_t *authority_cert_get_by_sk_digest(const char *sk_digest); +authority_cert_t *authority_cert_get_by_digests(const char *id_digest, + const char *sk_digest); +void authority_cert_get_all(smartlist_t *certs_out); +void authority_cert_dl_failed(const char *id_digest, int status); +void authority_certs_fetch_missing(networkstatus_t *status, time_t now); +int router_reload_router_list(void); +int authority_cert_dl_looks_uncertain(const char *id_digest); +smartlist_t *router_get_trusted_dir_servers(void); + +routerstatus_t *router_pick_directory_server(authority_type_t type, int flags); +trusted_dir_server_t *router_get_trusteddirserver_by_digest(const char *d); +trusted_dir_server_t *trusteddirserver_get_by_v3_auth_digest(const char *d); +routerstatus_t *router_pick_trusteddirserver(authority_type_t type, int flags); +int router_get_my_share_of_directory_requests(double *v2_share_out, + double *v3_share_out); +void router_reset_status_download_failures(void); +void routerlist_add_family(smartlist_t *sl, routerinfo_t *router); +int routers_in_same_family(routerinfo_t *r1, routerinfo_t *r2); +int routers_have_same_or_addr(const routerinfo_t *r1, const routerinfo_t *r2); +void add_nickname_list_to_smartlist(smartlist_t *sl, const char *list, + int must_be_running); +int router_nickname_is_in_list(routerinfo_t *router, const char *list); +routerinfo_t *routerlist_find_my_routerinfo(void); +routerinfo_t *router_find_exact_exit_enclave(const char *address, + uint16_t port); +int router_is_unreliable(routerinfo_t *router, int need_uptime, + int need_capacity, int need_guard); +uint32_t router_get_advertised_bandwidth(routerinfo_t *router); +uint32_t router_get_advertised_bandwidth_capped(routerinfo_t *router); + +routerinfo_t *routerlist_sl_choose_by_bandwidth(smartlist_t *sl, + bandwidth_weight_rule_t rule); +routerstatus_t *routerstatus_sl_choose_by_bandwidth(smartlist_t *sl, + bandwidth_weight_rule_t rule); + +routerinfo_t *router_choose_random_node(smartlist_t *excludedsmartlist, + struct routerset_t *excludedset, + router_crn_flags_t flags); + +routerinfo_t *router_get_by_nickname(const char *nickname, + int warn_if_unnamed); +int router_digest_version_as_new_as(const char *digest, const char *cutoff); +int router_digest_is_trusted_dir_type(const char *digest, + authority_type_t type); +#define router_digest_is_trusted_dir(d) \ + router_digest_is_trusted_dir_type((d), NO_AUTHORITY) + +int router_addr_is_trusted_dir(uint32_t addr); +int hexdigest_to_digest(const char *hexdigest, char *digest); +routerinfo_t *router_get_by_hexdigest(const char *hexdigest); +routerinfo_t *router_get_by_digest(const char *digest); +signed_descriptor_t *router_get_by_descriptor_digest(const char *digest); +signed_descriptor_t *router_get_by_extrainfo_digest(const char *digest); +signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest); +const char *signed_descriptor_get_body(signed_descriptor_t *desc); +const char *signed_descriptor_get_annotations(signed_descriptor_t *desc); +routerlist_t *router_get_routerlist(void); +void routerinfo_free(routerinfo_t *router); +void extrainfo_free(extrainfo_t *extrainfo); +void routerlist_free(routerlist_t *rl); +void dump_routerlist_mem_usage(int severity); +void routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old, + time_t now); +void routerlist_free_all(void); +void routerlist_reset_warnings(void); +void router_set_status(const char *digest, int up); + +static int WRA_WAS_ADDED(was_router_added_t s); +static int WRA_WAS_OUTDATED(was_router_added_t s); +static int WRA_WAS_REJECTED(was_router_added_t s); +/** Return true iff the descriptor was added. It might still be necessary to + * check whether the descriptor generator should be notified. + */ +static INLINE int +WRA_WAS_ADDED(was_router_added_t s) { + return s == ROUTER_ADDED_SUCCESSFULLY || s == ROUTER_ADDED_NOTIFY_GENERATOR; +} +/** Return true iff the descriptor was not added because it was either: + * - not in the consensus + * - neither in the consensus nor in any networkstatus document + * - it was outdated. + */ +static INLINE int WRA_WAS_OUTDATED(was_router_added_t s) +{ + return (s == ROUTER_WAS_NOT_NEW || + s == ROUTER_NOT_IN_CONSENSUS || + s == ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS); +} +static INLINE int WRA_WAS_REJECTED(was_router_added_t s) +{ + return (s == ROUTER_AUTHDIR_REJECTS); +} +was_router_added_t router_add_to_routerlist(routerinfo_t *router, + const char **msg, + int from_cache, + int from_fetch); +was_router_added_t router_add_extrainfo_to_routerlist( + extrainfo_t *ei, const char **msg, + int from_cache, int from_fetch); +void routerlist_descriptors_added(smartlist_t *sl, int from_cache); +void routerlist_remove_old_routers(void); +int router_load_single_router(const char *s, uint8_t purpose, int cache, + const char **msg); +int router_load_routers_from_string(const char *s, const char *eos, + saved_location_t saved_location, + smartlist_t *requested_fingerprints, + int descriptor_digests, + const char *prepend_annotations); +void router_load_extrainfo_from_string(const char *s, const char *eos, + saved_location_t saved_location, + smartlist_t *requested_fingerprints, + int descriptor_digests); + +void routerlist_retry_directory_downloads(time_t now); +int router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port, + int need_uptime); +int router_exit_policy_rejects_all(routerinfo_t *router); +trusted_dir_server_t *add_trusted_dir_server(const char *nickname, + const char *address, + uint16_t dir_port, uint16_t or_port, + const char *digest, const char *v3_auth_digest, + authority_type_t type); +void authority_cert_free(authority_cert_t *cert); +void clear_trusted_dir_servers(void); +int any_trusted_dir_is_v1_authority(void); +void update_consensus_router_descriptor_downloads(time_t now, int is_vote, + networkstatus_t *consensus); +void update_router_descriptor_downloads(time_t now); +void update_extrainfo_downloads(time_t now); +int router_have_minimum_dir_info(void); +void router_dir_info_changed(void); +const char *get_dir_info_status_string(void); +int count_loading_descriptors_progress(void); +void router_reset_descriptor_download_failures(void); +int router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2); +int routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei, + signed_descriptor_t *sd, + const char **msg); + +void routerlist_assert_ok(routerlist_t *rl); +const char *esc_router_info(routerinfo_t *router); +void routers_sort_by_identity(smartlist_t *routers); + +routerset_t *routerset_new(void); +int routerset_parse(routerset_t *target, const char *s, + const char *description); +void routerset_union(routerset_t *target, const routerset_t *source); +int routerset_is_list(const routerset_t *set); +int routerset_needs_geoip(const routerset_t *set); +int routerset_contains_router(const routerset_t *set, routerinfo_t *ri); +int routerset_contains_routerstatus(const routerset_t *set, + routerstatus_t *rs); +int routerset_contains_extendinfo(const routerset_t *set, + const extend_info_t *ei); +void routerset_get_all_routers(smartlist_t *out, const routerset_t *routerset, + int running_only); +void routersets_get_disjunction(smartlist_t *target, const smartlist_t *source, + const routerset_t *include, + const routerset_t *exclude, int running_only); +void routerset_subtract_routers(smartlist_t *out, + const routerset_t *routerset); +char *routerset_to_string(const routerset_t *routerset); +void routerset_refresh_countries(routerset_t *target); +int routerset_equal(const routerset_t *old, const routerset_t *new); +void routerset_free(routerset_t *routerset); +void routerinfo_set_country(routerinfo_t *ri); +void routerlist_refresh_countries(void); +void refresh_all_country_info(void); + +int hid_serv_get_responsible_directories(smartlist_t *responsible_dirs, + const char *id); +int hid_serv_acting_as_directory(void); +int hid_serv_responsible_for_desc_id(const char *id); + +#endif + diff -Nru tor-0.2.0.34/src/or/routerparse.c tor-0.2.2.16-alpha/src/or/routerparse.c --- tor-0.2.0.34/src/or/routerparse.c 2009-02-09 03:21:04.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/routerparse.c 2010-08-11 03:14:17.000000000 +0000 @@ -1,11 +1,8 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: routerparse.c 18424 2009-02-09 03:21:04Z arma $ */ -const char routerparse_c_id[] = - "$Id: routerparse.c 18424 2009-02-09 03:21:04Z arma $"; /** * \file routerparse.c @@ -13,6 +10,20 @@ **/ #include "or.h" +#include "config.h" +#include "dirserv.h" +#include "dirvote.h" +#include "policies.h" +#include "rendcommon.h" +#include "router.h" +#include "routerlist.h" +#include "memarea.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "rephist.h" +#include "routerparse.h" +#undef log +#include /****************************************************************************/ @@ -22,9 +33,11 @@ */ typedef enum { K_ACCEPT = 0, + K_ACCEPT6, K_DIRECTORY_SIGNATURE, K_RECOMMENDED_SOFTWARE, K_REJECT, + K_REJECT6, K_ROUTER, K_SIGNED_DIRECTORY, K_SIGNING_KEY, @@ -36,7 +49,6 @@ K_PLATFORM, K_OPT, K_BANDWIDTH, - K_PORTS, K_CONTACT, K_NETWORK_STATUS, K_UPTIME, @@ -51,20 +63,50 @@ K_DIR_OPTIONS, K_CLIENT_VERSIONS, K_SERVER_VERSIONS, + K_P, K_R, K_S, K_V, + K_W, + K_M, K_EVENTDNS, K_EXTRA_INFO, K_EXTRA_INFO_DIGEST, K_CACHES_EXTRA_INFO, K_HIDDEN_SERVICE_DIR, + K_ALLOW_SINGLE_HOP_EXITS, + + K_DIRREQ_END, + K_DIRREQ_V2_IPS, + K_DIRREQ_V3_IPS, + K_DIRREQ_V2_REQS, + K_DIRREQ_V3_REQS, + K_DIRREQ_V2_SHARE, + K_DIRREQ_V3_SHARE, + K_DIRREQ_V2_RESP, + K_DIRREQ_V3_RESP, + K_DIRREQ_V2_DIR, + K_DIRREQ_V3_DIR, + K_DIRREQ_V2_TUN, + K_DIRREQ_V3_TUN, + K_ENTRY_END, + K_ENTRY_IPS, + K_CELL_END, + K_CELL_PROCESSED, + K_CELL_QUEUED, + K_CELL_TIME, + K_CELL_CIRCS, + K_EXIT_END, + K_EXIT_WRITTEN, + K_EXIT_READ, + K_EXIT_OPENED, K_DIR_KEY_CERTIFICATE_VERSION, K_DIR_IDENTITY_KEY, K_DIR_KEY_PUBLISHED, K_DIR_KEY_EXPIRES, K_DIR_KEY_CERTIFICATION, + K_DIR_KEY_CROSSCERT, K_DIR_ADDRESS, K_VOTE_STATUS, @@ -74,13 +116,19 @@ K_VOTING_DELAY, K_KNOWN_FLAGS, + K_PARAMS, + K_BW_WEIGHTS, K_VOTE_DIGEST, K_CONSENSUS_DIGEST, + K_ADDITIONAL_DIGEST, + K_ADDITIONAL_SIGNATURE, K_CONSENSUS_METHODS, K_CONSENSUS_METHOD, K_LEGACY_DIR_KEY, + K_DIRECTORY_FOOTER, A_PURPOSE, + A_LAST_LISTED, _A_UNKNOWN, R_RENDEZVOUS_SERVICE_DESCRIPTOR, @@ -98,7 +146,10 @@ R_IPO_ONION_KEY, R_IPO_SERVICE_KEY, - _UNRECOGNIZED, + C_CLIENT_NAME, + C_DESCRIPTOR_COOKIE, + C_CLIENT_KEY, + _ERR, _EOF, _NIL @@ -113,15 +164,21 @@ * of a keyword, a line full of arguments, and a binary object. The * arguments and object are both optional, depending on the keyword * type. + * + * This structure is only allocated in memareas; do not allocate it on + * the heap, or token_clear() won't work. */ typedef struct directory_token_t { directory_keyword tp; /**< Type of the token. */ - int n_args; /**< Number of elements in args */ + int n_args:30; /**< Number of elements in args */ char **args; /**< Array of arguments from keyword line. */ + char *object_type; /**< -----BEGIN [object_type]-----*/ size_t object_size; /**< Bytes in object_body */ char *object_body; /**< Contents of object, base64-decoded. */ - crypto_pk_env_t *key; /**< For public keys only. */ + + crypto_pk_env_t *key; /**< For public keys only. Heap-allocated. */ + char *error; /**< For _ERR tokens only. */ } directory_token_t; @@ -133,6 +190,7 @@ typedef enum { NO_OBJ, /**< No object, ever. */ NEED_OBJ, /**< Object is required. */ + NEED_SKEY_1024,/**< Object is required, and must be a 1024 bit private key */ NEED_KEY_1024, /**< Object is required, and must be a 1024 bit public key */ NEED_KEY, /**< Object is required, and must be a public key. */ OBJ_OK, /**< Object is optional. */ @@ -154,7 +212,7 @@ /** If true, we concatenate all arguments for this item into a single * string. */ int concat_args; - /** Requirments on object syntax for this item. */ + /** Requirements on object syntax for this item. */ obj_syntax os; /** Lowest number of times this item may appear in a document. */ int min_cnt; @@ -191,7 +249,7 @@ /** An item that must appear no more than once */ #define T01(s,t,a,o) { s, t, a, o, 0, 1, 0, 0 } /** An annotation that must appear no more than once */ -#define A01(s,t,a,o) { s, t, a, o, 0, 1, 0, 0 } +#define A01(s,t,a,o) { s, t, a, o, 0, 1, 0, 1 } /* Argument multiplicity: any number of arguments. */ #define ARGS 0,INT_MAX,0 @@ -204,11 +262,13 @@ /* Argument multiplicity: exactly n arguments. */ #define EQ(n) n,n,0 -/** List of tokens allowable in router derscriptors */ +/** List of tokens allowable in router descriptors */ static token_rule_t routerdesc_token_table[] = { T0N("reject", K_REJECT, ARGS, NO_OBJ ), T0N("accept", K_ACCEPT, ARGS, NO_OBJ ), - T1_START( "router", K_ROUTER, GE(5), NO_OBJ ), + T0N("reject6", K_REJECT6, ARGS, NO_OBJ ), + T0N("accept6", K_ACCEPT6, ARGS, NO_OBJ ), + T1_START( "router", K_ROUTER, GE(5), NO_OBJ ), T1( "signing-key", K_SIGNING_KEY, NO_ARGS, NEED_KEY_1024 ), T1( "onion-key", K_ONION_KEY, NO_ARGS, NEED_KEY_1024 ), T1_END( "router-signature", K_ROUTER_SIGNATURE, NO_ARGS, NEED_OBJ ), @@ -222,6 +282,7 @@ T01("write-history", K_WRITE_HISTORY, ARGS, NO_OBJ ), T01("extra-info-digest", K_EXTRA_INFO_DIGEST, GE(1), NO_OBJ ), T01("hidden-service-dir", K_HIDDEN_SERVICE_DIR, NO_ARGS, NO_OBJ ), + T01("allow-single-hop-exits",K_ALLOW_SINGLE_HOP_EXITS, NO_ARGS, NO_OBJ ), T01("family", K_FAMILY, ARGS, NO_OBJ ), T01("caches-extra-info", K_CACHES_EXTRA_INFO, NO_ARGS, NO_OBJ ), @@ -241,6 +302,31 @@ T0N("opt", K_OPT, CONCAT_ARGS, OBJ_OK ), T01("read-history", K_READ_HISTORY, ARGS, NO_OBJ ), T01("write-history", K_WRITE_HISTORY, ARGS, NO_OBJ ), + T01("dirreq-stats-end", K_DIRREQ_END, ARGS, NO_OBJ ), + T01("dirreq-v2-ips", K_DIRREQ_V2_IPS, ARGS, NO_OBJ ), + T01("dirreq-v3-ips", K_DIRREQ_V3_IPS, ARGS, NO_OBJ ), + T01("dirreq-v2-reqs", K_DIRREQ_V2_REQS, ARGS, NO_OBJ ), + T01("dirreq-v3-reqs", K_DIRREQ_V3_REQS, ARGS, NO_OBJ ), + T01("dirreq-v2-share", K_DIRREQ_V2_SHARE, ARGS, NO_OBJ ), + T01("dirreq-v3-share", K_DIRREQ_V3_SHARE, ARGS, NO_OBJ ), + T01("dirreq-v2-resp", K_DIRREQ_V2_RESP, ARGS, NO_OBJ ), + T01("dirreq-v3-resp", K_DIRREQ_V3_RESP, ARGS, NO_OBJ ), + T01("dirreq-v2-direct-dl", K_DIRREQ_V2_DIR, ARGS, NO_OBJ ), + T01("dirreq-v3-direct-dl", K_DIRREQ_V3_DIR, ARGS, NO_OBJ ), + T01("dirreq-v2-tunneled-dl", K_DIRREQ_V2_TUN, ARGS, NO_OBJ ), + T01("dirreq-v3-tunneled-dl", K_DIRREQ_V3_TUN, ARGS, NO_OBJ ), + T01("entry-stats-end", K_ENTRY_END, ARGS, NO_OBJ ), + T01("entry-ips", K_ENTRY_IPS, ARGS, NO_OBJ ), + T01("cell-stats-end", K_CELL_END, ARGS, NO_OBJ ), + T01("cell-processed-cells", K_CELL_PROCESSED, ARGS, NO_OBJ ), + T01("cell-queued-cells", K_CELL_QUEUED, ARGS, NO_OBJ ), + T01("cell-time-in-queue", K_CELL_TIME, ARGS, NO_OBJ ), + T01("cell-circuits-per-decile", K_CELL_CIRCS, ARGS, NO_OBJ ), + T01("exit-stats-end", K_EXIT_END, ARGS, NO_OBJ ), + T01("exit-kibibytes-written", K_EXIT_WRITTEN, ARGS, NO_OBJ ), + T01("exit-kibibytes-read", K_EXIT_READ, ARGS, NO_OBJ ), + T01("exit-streams-opened", K_EXIT_OPENED, ARGS, NO_OBJ ), + T1_START( "extra-info", K_EXTRA_INFO, GE(2), NO_OBJ ), END_OF_TABLE @@ -249,9 +335,12 @@ /** List of tokens allowable in the body part of v2 and v3 networkstatus * documents. */ static token_rule_t rtrstatus_token_table[] = { - T1( "r", K_R, GE(8), NO_OBJ ), + T01("p", K_P, CONCAT_ARGS, NO_OBJ ), + T1( "r", K_R, GE(7), NO_OBJ ), T1( "s", K_S, ARGS, NO_OBJ ), T01("v", K_V, CONCAT_ARGS, NO_OBJ ), + T01("w", K_W, ARGS, NO_OBJ ), + T0N("m", K_M, CONCAT_ARGS, NO_OBJ ), T0N("opt", K_OPT, CONCAT_ARGS, OBJ_OK ), END_OF_TABLE }; @@ -300,6 +389,7 @@ END_OF_TABLE }; +/** List of tokens common to V3 authority certificates and V3 consensuses. */ #define CERTIFICATE_MEMBERS \ T1("dir-key-certificate-version", K_DIR_KEY_CERTIFICATE_VERSION, \ GE(1), NO_OBJ ), \ @@ -307,10 +397,12 @@ T1("dir-key-published",K_DIR_KEY_PUBLISHED, CONCAT_ARGS, NO_OBJ), \ T1("dir-key-expires", K_DIR_KEY_EXPIRES, CONCAT_ARGS, NO_OBJ), \ T1("dir-signing-key", K_DIR_SIGNING_KEY, NO_ARGS, NEED_KEY ),\ + T01("dir-key-crosscert", K_DIR_KEY_CROSSCERT, NO_ARGS, NEED_OBJ ),\ T1("dir-key-certification", K_DIR_KEY_CERTIFICATION, \ NO_ARGS, NEED_OBJ), \ T01("dir-address", K_DIR_ADDRESS, GE(1), NO_OBJ), +/** List of tokens allowable in V3 authority certificates. */ static token_rule_t dir_key_certificate_table[] = { CERTIFICATE_MEMBERS T1("fingerprint", K_FINGERPRINT, CONCAT_ARGS, NO_OBJ ), @@ -342,8 +434,18 @@ END_OF_TABLE }; +/** List of tokens allowed in the (possibly encrypted) list of introduction + * points of rendezvous service descriptors */ +static token_rule_t client_keys_token_table[] = { + T1_START("client-name", C_CLIENT_NAME, CONCAT_ARGS, NO_OBJ), + T1("descriptor-cookie", C_DESCRIPTOR_COOKIE, EQ(1), NO_OBJ), + T01("client-key", C_CLIENT_KEY, NO_ARGS, NEED_SKEY_1024), + END_OF_TABLE +}; + +/** List of tokens allowed in V3 networkstatus votes. */ static token_rule_t networkstatus_token_table[] = { - T1("network-status-version", K_NETWORK_STATUS_VERSION, + T1_START("network-status-version", K_NETWORK_STATUS_VERSION, GE(1), NO_OBJ ), T1("vote-status", K_VOTE_STATUS, GE(1), NO_OBJ ), T1("published", K_PUBLISHED, CONCAT_ARGS, NO_OBJ ), @@ -352,6 +454,7 @@ T1("valid-until", K_VALID_UNTIL, CONCAT_ARGS, NO_OBJ ), T1("voting-delay", K_VOTING_DELAY, GE(2), NO_OBJ ), T1("known-flags", K_KNOWN_FLAGS, ARGS, NO_OBJ ), + T01("params", K_PARAMS, ARGS, NO_OBJ ), T( "fingerprint", K_FINGERPRINT, CONCAT_ARGS, NO_OBJ ), CERTIFICATE_MEMBERS @@ -367,8 +470,10 @@ END_OF_TABLE }; + +/** List of tokens allowed in V3 networkstatus consensuses. */ static token_rule_t networkstatus_consensus_token_table[] = { - T1("network-status-version", K_NETWORK_STATUS_VERSION, + T1_START("network-status-version", K_NETWORK_STATUS_VERSION, GE(1), NO_OBJ ), T1("vote-status", K_VOTE_STATUS, GE(1), NO_OBJ ), T1("valid-after", K_VALID_AFTER, CONCAT_ARGS, NO_OBJ ), @@ -378,7 +483,7 @@ T0N("opt", K_OPT, CONCAT_ARGS, OBJ_OK ), - T1N("dir-source", K_DIR_SOURCE, GE(3), NO_OBJ ), + T1N("dir-source", K_DIR_SOURCE, GE(6), NO_OBJ ), T1N("contact", K_CONTACT, CONCAT_ARGS, NO_OBJ ), T1N("vote-digest", K_VOTE_DIGEST, GE(1), NO_OBJ ), @@ -387,6 +492,7 @@ T01("client-versions", K_CLIENT_VERSIONS, CONCAT_ARGS, NO_OBJ ), T01("server-versions", K_SERVER_VERSIONS, CONCAT_ARGS, NO_OBJ ), T01("consensus-method", K_CONSENSUS_METHOD, EQ(1), NO_OBJ), + T01("params", K_PARAMS, ARGS, NO_OBJ ), END_OF_TABLE }; @@ -394,16 +500,29 @@ /** List of tokens allowable in the footer of v1/v2 directory/networkstatus * footers. */ static token_rule_t networkstatus_vote_footer_token_table[] = { - T( "directory-signature", K_DIRECTORY_SIGNATURE, GE(2), NEED_OBJ ), + T01("directory-footer", K_DIRECTORY_FOOTER, NO_ARGS, NO_OBJ ), + T01("bandwidth-weights", K_BW_WEIGHTS, ARGS, NO_OBJ ), + T( "directory-signature", K_DIRECTORY_SIGNATURE, GE(2), NEED_OBJ ), END_OF_TABLE }; +/** List of tokens allowable in detached networkstatus signature documents. */ static token_rule_t networkstatus_detached_signature_token_table[] = { T1_START("consensus-digest", K_CONSENSUS_DIGEST, GE(1), NO_OBJ ), + T("additional-digest", K_ADDITIONAL_DIGEST,GE(3), NO_OBJ ), T1("valid-after", K_VALID_AFTER, CONCAT_ARGS, NO_OBJ ), T1("fresh-until", K_FRESH_UNTIL, CONCAT_ARGS, NO_OBJ ), T1("valid-until", K_VALID_UNTIL, CONCAT_ARGS, NO_OBJ ), - T1N("directory-signature", K_DIRECTORY_SIGNATURE, GE(2), NEED_OBJ ), + T("additional-signature", K_ADDITIONAL_SIGNATURE, GE(4), NEED_OBJ ), + T1N("directory-signature", K_DIRECTORY_SIGNATURE, GE(2), NEED_OBJ ), + END_OF_TABLE +}; + +static token_rule_t microdesc_token_table[] = { + T1_START("onion-key", K_ONION_KEY, NO_ARGS, NEED_KEY_1024), + T01("family", K_FAMILY, ARGS, NO_OBJ ), + T01("p", K_P, CONCAT_ARGS, NO_OBJ ), + A01("@last-listed", A_LAST_LISTED, CONCAT_ARGS, NO_OBJ ), END_OF_TABLE }; @@ -414,49 +533,107 @@ static addr_policy_t *router_parse_addr_policy(directory_token_t *tok); static addr_policy_t *router_parse_addr_policy_private(directory_token_t *tok); -static int router_get_hash_impl(const char *s, char *digest, +static int router_get_hash_impl(const char *s, size_t s_len, char *digest, const char *start_str, const char *end_str, - char end_char); -static void token_free(directory_token_t *tok); + char end_char, + digest_algorithm_t alg); +static int router_get_hashes_impl(const char *s, size_t s_len, + digests_t *digests, + const char *start_str, const char *end_str, + char end_char); +static void token_clear(directory_token_t *tok); static smartlist_t *find_all_exitpolicy(smartlist_t *s); -static directory_token_t *find_first_by_keyword(smartlist_t *s, - directory_keyword keyword); +static directory_token_t *_find_by_keyword(smartlist_t *s, + directory_keyword keyword, + const char *keyword_str); +#define find_by_keyword(s, keyword) _find_by_keyword((s), (keyword), #keyword) +static directory_token_t *find_opt_by_keyword(smartlist_t *s, + directory_keyword keyword); + #define TS_ANNOTATIONS_OK 1 #define TS_NOCHECK 2 #define TS_NO_NEW_ANNOTATIONS 4 -static int tokenize_string(const char *start, const char *end, +static int tokenize_string(memarea_t *area, + const char *start, const char *end, smartlist_t *out, token_rule_t *table, int flags); -static directory_token_t *get_next_token(const char **s, +static directory_token_t *get_next_token(memarea_t *area, + const char **s, const char *eos, token_rule_t *table); +#define CST_CHECK_AUTHORITY (1<<0) +#define CST_NO_CHECK_OBJTYPE (1<<1) static int check_signature_token(const char *digest, + ssize_t digest_len, directory_token_t *tok, crypto_pk_env_t *pkey, - int check_authority, + int flags, const char *doctype); static crypto_pk_env_t *find_dir_signing_key(const char *str, const char *eos); static int tor_version_same_series(tor_version_t *a, tor_version_t *b); +#undef DEBUG_AREA_ALLOC + +#ifdef DEBUG_AREA_ALLOC +#define DUMP_AREA(a,name) STMT_BEGIN \ + size_t alloc=0, used=0; \ + memarea_get_stats((a),&alloc,&used); \ + log_debug(LD_MM, "Area for %s has %lu allocated; using %lu.", \ + name, (unsigned long)alloc, (unsigned long)used); \ + STMT_END +#else +#define DUMP_AREA(a,name) STMT_NIL +#endif + +/** Last time we dumped a descriptor to disk. */ +static time_t last_desc_dumped = 0; + +/** For debugging purposes, dump unparseable descriptor *desc of + * type *type to file $DATADIR/unparseable-desc. Do not write more + * than one descriptor to disk per minute. If there is already such a + * file in the data directory, overwrite it. */ +static void +dump_desc(const char *desc, const char *type) +{ + time_t now = time(NULL); + tor_assert(desc); + tor_assert(type); + if (!last_desc_dumped || last_desc_dumped + 60 < now) { + char *debugfile = get_datadir_fname("unparseable-desc"); + size_t filelen = 50 + strlen(type) + strlen(desc); + char *content = tor_malloc_zero(filelen); + tor_snprintf(content, filelen, "Unable to parse descriptor of type " + "%s:\n%s", type, desc); + write_str_to_file(debugfile, content, 0); + log_info(LD_DIR, "Unable to parse descriptor of type %s. See file " + "unparseable-desc in data directory for details.", type); + tor_free(content); + tor_free(debugfile); + last_desc_dumped = now; + } +} + /** Set digest to the SHA-1 digest of the hash of the directory in * s. Return 0 on success, -1 on failure. */ int router_get_dir_hash(const char *s, char *digest) { - return router_get_hash_impl(s,digest, - "signed-directory","\ndirectory-signature",'\n'); + return router_get_hash_impl(s, strlen(s), digest, + "signed-directory","\ndirectory-signature",'\n', + DIGEST_SHA1); } /** Set digest to the SHA-1 digest of the hash of the first router in * s. Return 0 on success, -1 on failure. */ int -router_get_router_hash(const char *s, char *digest) +router_get_router_hash(const char *s, size_t s_len, char *digest) { - return router_get_hash_impl(s,digest, - "router ","\nrouter-signature", '\n'); + return router_get_hash_impl(s, s_len, digest, + "router ","\nrouter-signature", '\n', + DIGEST_SHA1); } /** Set digest to the SHA-1 digest of the hash of the running-routers @@ -465,8 +642,9 @@ int router_get_runningrouters_hash(const char *s, char *digest) { - return router_get_hash_impl(s,digest, - "network-status","\ndirectory-signature", '\n'); + return router_get_hash_impl(s, strlen(s), digest, + "network-status","\ndirectory-signature", '\n', + DIGEST_SHA1); } /** Set digest to the SHA-1 digest of the hash of the network-status @@ -474,19 +652,33 @@ int router_get_networkstatus_v2_hash(const char *s, char *digest) { - return router_get_hash_impl(s,digest, + return router_get_hash_impl(s, strlen(s), digest, "network-status-version","\ndirectory-signature", - '\n'); + '\n', + DIGEST_SHA1); +} + +/** Set digests to all the digests of the consensus document in + * s */ +int +router_get_networkstatus_v3_hashes(const char *s, digests_t *digests) +{ + return router_get_hashes_impl(s,strlen(s),digests, + "network-status-version", + "\ndirectory-signature", + ' '); } /** Set digest to the SHA-1 digest of the hash of the network-status * string in s. Return 0 on success, -1 on failure. */ int -router_get_networkstatus_v3_hash(const char *s, char *digest) +router_get_networkstatus_v3_hash(const char *s, char *digest, + digest_algorithm_t alg) { - return router_get_hash_impl(s,digest, - "network-status-version","\ndirectory-signature", - ' '); + return router_get_hash_impl(s, strlen(s), digest, + "network-status-version", + "\ndirectory-signature", + ' ', alg); } /** Set digest to the SHA-1 digest of the hash of the extrainfo @@ -494,7 +686,8 @@ int router_get_extrainfo_hash(const char *s, char *digest) { - return router_get_hash_impl(s,digest,"extra-info","\nrouter-signature",'\n'); + return router_get_hash_impl(s, strlen(s), digest, "extra-info", + "\nrouter-signature",'\n', DIGEST_SHA1); } /** Helper: used to generate signatures for routers, directories and @@ -506,14 +699,15 @@ */ int router_append_dirobj_signature(char *buf, size_t buf_len, const char *digest, - crypto_pk_env_t *private_key) + size_t digest_len, crypto_pk_env_t *private_key) { char *signature; size_t i; + int siglen; signature = tor_malloc(crypto_pk_keysize(private_key)); - if (crypto_pk_private_sign(private_key, signature, digest, DIGEST_LEN) < 0) { - + siglen = crypto_pk_private_sign(private_key, signature, digest, digest_len); + if (siglen < 0) { log_warn(LD_BUG,"Couldn't sign digest."); goto err; } @@ -521,7 +715,7 @@ goto truncated; i = strlen(buf); - if (base64_encode(buf+i, buf_len-i, signature, 128) < 0) { + if (base64_encode(buf+i, buf_len-i, signature, siglen) < 0) { log_warn(LD_BUG,"couldn't base64-encode signature"); goto err; } @@ -545,7 +739,7 @@ * versionlist is newer than myversion. Else, return * VS_NEW_IN_SERIES if there is at least one member of versionlist in * the same series (major.minor.micro) as myversion, but no such member - * is newer than myversion.. Else, return VS_NEW if every memeber of + * is newer than myversion.. Else, return VS_NEW if every member of * versionlist is older than myversion. Else, return * VS_UNRECOMMENDED. * @@ -628,9 +822,10 @@ char digest[DIGEST_LEN]; time_t published_on; int r; - const char *end, *cp; + const char *end, *cp, *str_dup = str; smartlist_t *tokens = NULL; crypto_pk_env_t *declared_key = NULL; + memarea_t *area = memarea_new(); /* XXXX This could be simplified a lot, but it will all go away * once pre-0.1.1.8 is obsolete, and for now it's better not to @@ -651,7 +846,7 @@ } ++cp; tokens = smartlist_create(); - if (tokenize_string(cp,strchr(cp,'\0'),tokens,dir_token_table,0)) { + if (tokenize_string(area,cp,strchr(cp,'\0'),tokens,dir_token_table,0)) { log_warn(LD_DIR, "Error tokenizing directory signature"); goto err; } if (smartlist_len(tokens) != 1) { @@ -663,12 +858,13 @@ } declared_key = find_dir_signing_key(str, str+strlen(str)); note_crypto_pk_op(VERIFY_DIR); - if (check_signature_token(digest, tok, declared_key, 1, "directory")<0) + if (check_signature_token(digest, DIGEST_LEN, tok, declared_key, + CST_CHECK_AUTHORITY, "directory")<0) goto err; - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); - smartlist_free(tokens); - tokens = NULL; + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); + smartlist_clear(tokens); + memarea_clear(area); /* Now try to parse the first part of the directory. */ if ((end = strstr(str,"\nrouter "))) { @@ -679,13 +875,11 @@ end = str + strlen(str); } - tokens = smartlist_create(); - if (tokenize_string(str,end,tokens,dir_token_table,0)) { + if (tokenize_string(area,str,end,tokens,dir_token_table,0)) { log_warn(LD_DIR, "Error tokenizing directory"); goto err; } - tok = find_first_by_keyword(tokens, K_PUBLISHED); - tor_assert(tok); + tok = find_by_keyword(tokens, K_PUBLISHED); tor_assert(tok->n_args == 1); if (parse_iso_time(tok->args[0], &published_on) < 0) { @@ -701,13 +895,18 @@ r = 0; goto done; err: + dump_desc(str_dup, "v1 directory"); r = -1; done: if (declared_key) crypto_free_pk_env(declared_key); if (tokens) { - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); } + if (area) { + DUMP_AREA(area, "v1 directory"); + memarea_drop_all(area); + } return r; } @@ -723,14 +922,16 @@ int r = -1; crypto_pk_env_t *declared_key = NULL; smartlist_t *tokens = NULL; - const char *eos = str + strlen(str); + const char *eos = str + strlen(str), *str_dup = str; + memarea_t *area = NULL; if (router_get_runningrouters_hash(str, digest)) { log_warn(LD_DIR, "Unable to compute digest of running-routers"); goto err; } + area = memarea_new(); tokens = smartlist_create(); - if (tokenize_string(str,eos,tokens,dir_token_table,0)) { + if (tokenize_string(area,str,eos,tokens,dir_token_table,0)) { log_warn(LD_DIR, "Error tokenizing running-routers"); goto err; } tok = smartlist_get(tokens,0); @@ -739,19 +940,19 @@ goto err; } - tok = find_first_by_keyword(tokens, K_PUBLISHED); - tor_assert(tok); + tok = find_by_keyword(tokens, K_PUBLISHED); tor_assert(tok->n_args == 1); if (parse_iso_time(tok->args[0], &published_on) < 0) { goto err; } - if (!(tok = find_first_by_keyword(tokens, K_DIRECTORY_SIGNATURE))) { + if (!(tok = find_opt_by_keyword(tokens, K_DIRECTORY_SIGNATURE))) { log_warn(LD_DIR, "Missing signature on running-routers"); goto err; } declared_key = find_dir_signing_key(str, eos); note_crypto_pk_op(VERIFY_DIR); - if (check_signature_token(digest, tok, declared_key, 1, "running-routers") + if (check_signature_token(digest, DIGEST_LEN, tok, declared_key, + CST_CHECK_AUTHORITY, "running-routers") < 0) goto err; @@ -762,11 +963,16 @@ r = 0; err: + dump_desc(str_dup, "v1 running-routers"); if (declared_key) crypto_free_pk_env(declared_key); if (tokens) { - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); } + if (area) { + DUMP_AREA(area, "v1 running-routers"); + memarea_drop_all(area); + } return r; } @@ -779,6 +985,7 @@ const char *cp; directory_token_t *tok; crypto_pk_env_t *key = NULL; + memarea_t *area = NULL; tor_assert(str); tor_assert(eos); @@ -790,10 +997,11 @@ return NULL; ++cp; /* Now cp points to the start of the token. */ - tok = get_next_token(&cp, eos, dir_token_table); + area = memarea_new(); + tok = get_next_token(area, &cp, eos, dir_token_table); if (!tok) { log_warn(LD_DIR, "Unparseable dir-signing-key token"); - return NULL; + goto done; } if (tok->tp != K_DIR_SIGNING_KEY) { log_warn(LD_DIR, "Dir-signing-key token did not parse as expected"); @@ -808,7 +1016,11 @@ } done: - if (tok) token_free(tok); + if (tok) token_clear(tok); + if (area) { + DUMP_AREA(area, "dir-signing-key token"); + memarea_drop_all(area); + } return key; } @@ -832,18 +1044,23 @@ /** Check whether the object body of the token in tok has a good * signature for digest using key pkey. If - * check_authority is set, make sure that pkey is the key of a - * directory authority. Use doctype as the type of the document when - * generating log messages. Return 0 on success, negative on failure. + * CST_CHECK_AUTHORITY is set, make sure that pkey is the key of + * a directory authority. If CST_NO_CHECK_OBJTYPE is set, do not check + * the object type of the signature object. Use doctype as the type of + * the document when generating log messages. Return 0 on success, negative + * on failure. */ static int check_signature_token(const char *digest, + ssize_t digest_len, directory_token_t *tok, crypto_pk_env_t *pkey, - int check_authority, + int flags, const char *doctype) { char *signed_digest; + const int check_authority = (flags & CST_CHECK_AUTHORITY); + const int check_objtype = ! (flags & CST_NO_CHECK_OBJTYPE); tor_assert(pkey); tor_assert(tok); @@ -856,22 +1073,24 @@ return -1; } - if (strcmp(tok->object_type, "SIGNATURE")) { - log_warn(LD_DIR, "Bad object type on %s signature", doctype); - return -1; + if (check_objtype) { + if (strcmp(tok->object_type, "SIGNATURE")) { + log_warn(LD_DIR, "Bad object type on %s signature", doctype); + return -1; + } } signed_digest = tor_malloc(tok->object_size); if (crypto_pk_public_checksig(pkey, signed_digest, tok->object_body, tok->object_size) - != DIGEST_LEN) { + < digest_len) { log_warn(LD_DIR, "Error reading %s: invalid signature.", doctype); tor_free(signed_digest); return -1; } // log_debug(LD_DIR,"Signed %s hash starts %s", doctype, // hex_str(signed_digest,4)); - if (memcmp(digest, signed_digest, DIGEST_LEN)) { + if (memcmp(digest, signed_digest, digest_len)) { log_warn(LD_DIR, "Error reading %s: signature does not match.", doctype); tor_free(signed_digest); return -1; @@ -1037,6 +1256,8 @@ * s through end into the signed_descriptor_body of the resulting * routerinfo_t. * + * If end is NULL, s must be properly NULL-terminated. + * * If allow_annotations, it's okay to encounter annotations in s * before the router; if it's false, reject the router if it's annotated. If * prepend_annotations is set, it should contain some annotations: @@ -1055,9 +1276,10 @@ smartlist_t *tokens = NULL, *exit_policy_tokens = NULL; directory_token_t *tok; struct in_addr in; - const char *start_of_annotations, *cp; + const char *start_of_annotations, *cp, *s_dup = s; size_t prepend_len = prepend_annotations ? strlen(prepend_annotations) : 0; int ok = 1; + memarea_t *area = NULL; tor_assert(!allow_annotations || !prepend_annotations); @@ -1069,9 +1291,10 @@ while (end > s+2 && *(end-1) == '\n' && *(end-2) == '\n') --end; + area = memarea_new(); tokens = smartlist_create(); if (prepend_annotations) { - if (tokenize_string(prepend_annotations,NULL,tokens, + if (tokenize_string(area,prepend_annotations,NULL,tokens, routerdesc_token_table,TS_NOCHECK)) { log_warn(LD_DIR, "Error tokenizing router descriptor (annotations)."); goto err; @@ -1090,14 +1313,14 @@ } if (allow_annotations && start_of_annotations != s) { - if (tokenize_string(start_of_annotations,s,tokens, + if (tokenize_string(area,start_of_annotations,s,tokens, routerdesc_token_table,TS_NOCHECK)) { log_warn(LD_DIR, "Error tokenizing router descriptor (annotations)."); goto err; } } - if (router_get_router_hash(s, digest) < 0) { + if (router_get_router_hash(s, end - s, digest) < 0) { log_warn(LD_DIR, "Couldn't compute router hash."); goto err; } @@ -1108,7 +1331,7 @@ if (prepend_annotations) flags |= TS_ANNOTATIONS_OK|TS_NO_NEW_ANNOTATIONS; - if (tokenize_string(s,end,tokens,routerdesc_token_table, flags)) { + if (tokenize_string(area,s,end,tokens,routerdesc_token_table, flags)) { log_warn(LD_DIR, "Error tokenizing router descriptor."); goto err; } @@ -1119,10 +1342,11 @@ goto err; } - tok = find_first_by_keyword(tokens, K_ROUTER); + tok = find_by_keyword(tokens, K_ROUTER); tor_assert(tok->n_args >= 5); router = tor_malloc_zero(sizeof(routerinfo_t)); + router->country = -1; router->cache_info.routerlist_index = -1; router->cache_info.annotations_len = s-start_of_annotations + prepend_len; router->cache_info.signed_descriptor_len = end-s; @@ -1174,8 +1398,8 @@ goto err; } - tok = find_first_by_keyword(tokens, K_BANDWIDTH); - tor_assert(tok && tok->n_args >= 3); + tok = find_by_keyword(tokens, K_BANDWIDTH); + tor_assert(tok->n_args >= 3); router->bandwidthrate = (int) tor_parse_long(tok->args[0],10,1,INT_MAX,&ok,NULL); @@ -1197,7 +1421,7 @@ goto err; } - if ((tok = find_first_by_keyword(tokens, A_PURPOSE))) { + if ((tok = find_opt_by_keyword(tokens, A_PURPOSE))) { tor_assert(tok->n_args); router->purpose = router_purpose_from_string(tok->args[0]); } else { @@ -1206,7 +1430,7 @@ router->cache_info.send_unencrypted = (router->purpose == ROUTER_PURPOSE_GENERAL) ? 1 : 0; - if ((tok = find_first_by_keyword(tokens, K_UPTIME))) { + if ((tok = find_opt_by_keyword(tokens, K_UPTIME))) { tor_assert(tok->n_args >= 1); router->uptime = tor_parse_long(tok->args[0],10,0,LONG_MAX,&ok,NULL); if (!ok) { @@ -1215,25 +1439,22 @@ } } - if ((tok = find_first_by_keyword(tokens, K_HIBERNATING))) { + if ((tok = find_opt_by_keyword(tokens, K_HIBERNATING))) { tor_assert(tok->n_args >= 1); router->is_hibernating = (tor_parse_long(tok->args[0],10,0,LONG_MAX,NULL,NULL) != 0); } - tok = find_first_by_keyword(tokens, K_PUBLISHED); - tor_assert(tok); + tok = find_by_keyword(tokens, K_PUBLISHED); tor_assert(tok->n_args == 1); if (parse_iso_time(tok->args[0], &router->cache_info.published_on) < 0) goto err; - tok = find_first_by_keyword(tokens, K_ONION_KEY); - tor_assert(tok); + tok = find_by_keyword(tokens, K_ONION_KEY); router->onion_pkey = tok->key; tok->key = NULL; /* Prevent free */ - tok = find_first_by_keyword(tokens, K_SIGNING_KEY); - tor_assert(tok); + tok = find_by_keyword(tokens, K_SIGNING_KEY); router->identity_pkey = tok->key; tok->key = NULL; /* Prevent free */ if (crypto_pk_get_digest(router->identity_pkey, @@ -1241,7 +1462,7 @@ log_warn(LD_DIR, "Couldn't calculate key digest"); goto err; } - if ((tok = find_first_by_keyword(tokens, K_FINGERPRINT))) { + if ((tok = find_opt_by_keyword(tokens, K_FINGERPRINT))) { /* If there's a fingerprint line, it must match the identity digest. */ char d[DIGEST_LEN]; tor_assert(tok->n_args == 1); @@ -1258,15 +1479,15 @@ } } - if ((tok = find_first_by_keyword(tokens, K_PLATFORM))) { + if ((tok = find_opt_by_keyword(tokens, K_PLATFORM))) { router->platform = tor_strdup(tok->args[0]); } - if ((tok = find_first_by_keyword(tokens, K_CONTACT))) { + if ((tok = find_opt_by_keyword(tokens, K_CONTACT))) { router->contact_info = tor_strdup(tok->args[0]); } - if ((tok = find_first_by_keyword(tokens, K_EVENTDNS))) { + if ((tok = find_opt_by_keyword(tokens, K_EVENTDNS))) { router->has_old_dnsworkers = tok->n_args && !strcmp(tok->args[0], "0"); } else if (router->platform) { if (! tor_version_as_new_as(router->platform, "0.1.2.2-alpha")) @@ -1284,8 +1505,10 @@ goto err; }); policy_expand_private(&router->exit_policy); + if (policy_is_reject_star(router->exit_policy)) + router->policy_is_reject_star = 1; - if ((tok = find_first_by_keyword(tokens, K_FAMILY)) && tok->n_args) { + if ((tok = find_opt_by_keyword(tokens, K_FAMILY)) && tok->n_args) { int i; router->declared_family = smartlist_create(); for (i=0;in_args;++i) { @@ -1298,10 +1521,13 @@ } } - if ((tok = find_first_by_keyword(tokens, K_CACHES_EXTRA_INFO))) + if ((tok = find_opt_by_keyword(tokens, K_CACHES_EXTRA_INFO))) router->caches_extra_info = 1; - if ((tok = find_first_by_keyword(tokens, K_EXTRA_INFO_DIGEST))) { + if ((tok = find_opt_by_keyword(tokens, K_ALLOW_SINGLE_HOP_EXITS))) + router->allow_single_hop_exits = 1; + + if ((tok = find_opt_by_keyword(tokens, K_EXTRA_INFO_DIGEST))) { tor_assert(tok->n_args >= 1); if (strlen(tok->args[0]) == HEX_DIGEST_LEN) { base16_decode(router->cache_info.extra_info_digest, @@ -1311,22 +1537,23 @@ } } - if ((tok = find_first_by_keyword(tokens, K_HIDDEN_SERVICE_DIR))) { + if ((tok = find_opt_by_keyword(tokens, K_HIDDEN_SERVICE_DIR))) { router->wants_to_be_hs_dir = 1; } - tok = find_first_by_keyword(tokens, K_ROUTER_SIGNATURE); - tor_assert(tok); + tok = find_by_keyword(tokens, K_ROUTER_SIGNATURE); note_crypto_pk_op(VERIFY_RTR); #ifdef COUNT_DISTINCT_DIGESTS if (!verified_digests) verified_digests = digestmap_new(); digestmap_set(verified_digests, signed_digest, (void*)(uintptr_t)1); #endif - if (check_signature_token(digest, tok, router->identity_pkey, 0, + if (check_signature_token(digest, DIGEST_LEN, tok, router->identity_pkey, 0, "router descriptor") < 0) goto err; + routerinfo_set_country(router); + if (!router->or_port) { log_warn(LD_DIR,"or_port unreadable or 0. Failing."); goto err; @@ -1339,15 +1566,18 @@ goto done; err: + dump_desc(s_dup, "router descriptor"); routerinfo_free(router); router = NULL; done: if (tokens) { - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); } - if (exit_policy_tokens) { - smartlist_free(exit_policy_tokens); + smartlist_free(exit_policy_tokens); + if (area) { + DUMP_AREA(area, "routerinfo"); + memarea_drop_all(area); } return router; } @@ -1368,6 +1598,8 @@ directory_token_t *tok; crypto_pk_env_t *key = NULL; routerinfo_t *router = NULL; + memarea_t *area = NULL; + const char *s_dup = s; if (!end) { end = s + strlen(s); @@ -1379,10 +1611,11 @@ if (router_get_extrainfo_hash(s, digest) < 0) { log_warn(LD_DIR, "Couldn't compute router hash."); - return NULL; + goto err; } tokens = smartlist_create(); - if (tokenize_string(s,end,tokens,extrainfo_token_table,0)) { + area = memarea_new(); + if (tokenize_string(area,s,end,tokens,extrainfo_token_table,0)) { log_warn(LD_DIR, "Error tokenizing extra-info document."); goto err; } @@ -1419,8 +1652,7 @@ goto err; } - tok = find_first_by_keyword(tokens, K_PUBLISHED); - tor_assert(tok); + tok = find_by_keyword(tokens, K_PUBLISHED); if (parse_iso_time(tok->args[0], &extrainfo->cache_info.published_on)) { log_warn(LD_DIR,"Invalid published time %s on \"extra-info\"", escaped(tok->args[0])); @@ -1433,8 +1665,7 @@ key = router->identity_pkey; } - tok = find_first_by_keyword(tokens, K_ROUTER_SIGNATURE); - tor_assert(tok); + tok = find_by_keyword(tokens, K_ROUTER_SIGNATURE); if (strcmp(tok->object_type, "SIGNATURE") || tok->object_size < 128 || tok->object_size > 512) { log_warn(LD_DIR, "Bad object type or length on extra-info signature"); @@ -1443,7 +1674,8 @@ if (key) { note_crypto_pk_op(VERIFY_RTR); - if (check_signature_token(digest, tok, key, 0, "extra-info") < 0) + if (check_signature_token(digest, DIGEST_LEN, tok, key, 0, + "extra-info") < 0) goto err; if (router) @@ -1457,14 +1689,18 @@ goto done; err: - if (extrainfo) - extrainfo_free(extrainfo); + dump_desc(s_dup, "extra-info descriptor"); + extrainfo_free(extrainfo); extrainfo = NULL; done: if (tokens) { - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); } + if (area) { + DUMP_AREA(area, "extrainfo"); + memarea_drop_all(area); + } return extrainfo; } @@ -1481,6 +1717,8 @@ char *eos; size_t len; int found; + memarea_t *area = NULL; + const char *s_dup = s; s = eat_whitespace(s); eos = strstr(s, "\ndir-key-certification"); @@ -1499,12 +1737,13 @@ len = eos - s; tokens = smartlist_create(); - if (tokenize_string(s, eos, tokens, dir_key_certificate_table, 0) < 0) { + area = memarea_new(); + if (tokenize_string(area,s, eos, tokens, dir_key_certificate_table, 0) < 0) { log_warn(LD_DIR, "Error tokenizing key certificate"); goto err; } - if (router_get_hash_impl(s, digest, "dir-key-certificate-version", - "\ndir-key-certification", '\n') < 0) + if (router_get_hash_impl(s, strlen(s), digest, "dir-key-certificate-version", + "\ndir-key-certification", '\n', DIGEST_SHA1) < 0) goto err; tok = smartlist_get(tokens, 0); if (tok->tp != K_DIR_KEY_CERTIFICATE_VERSION || strcmp(tok->args[0], "3")) { @@ -1516,20 +1755,20 @@ cert = tor_malloc_zero(sizeof(authority_cert_t)); memcpy(cert->cache_info.signed_descriptor_digest, digest, DIGEST_LEN); - tok = find_first_by_keyword(tokens, K_DIR_SIGNING_KEY); - tor_assert(tok && tok->key); + tok = find_by_keyword(tokens, K_DIR_SIGNING_KEY); + tor_assert(tok->key); cert->signing_key = tok->key; tok->key = NULL; if (crypto_pk_get_digest(cert->signing_key, cert->signing_key_digest)) goto err; - tok = find_first_by_keyword(tokens, K_DIR_IDENTITY_KEY); - tor_assert(tok && tok->key); + tok = find_by_keyword(tokens, K_DIR_IDENTITY_KEY); + tor_assert(tok->key); cert->identity_key = tok->key; tok->key = NULL; - tok = find_first_by_keyword(tokens, K_FINGERPRINT); - tor_assert(tok && tok->n_args); + tok = find_by_keyword(tokens, K_FINGERPRINT); + tor_assert(tok->n_args); if (base16_decode(fp_declared, DIGEST_LEN, tok->args[0], strlen(tok->args[0]))) { log_warn(LD_DIR, "Couldn't decode key certificate fingerprint %s", @@ -1547,11 +1786,12 @@ goto err; } - tok = find_first_by_keyword(tokens, K_DIR_ADDRESS); + tok = find_opt_by_keyword(tokens, K_DIR_ADDRESS); if (tok) { struct in_addr in; char *address = NULL; tor_assert(tok->n_args); + /* XXX021 use tor_addr_port_parse() below instead. -RD */ if (parse_addr_port(LOG_WARN, tok->args[0], &address, NULL, &cert->dir_port)<0 || tor_inet_aton(address, &in) == 0) { @@ -1563,13 +1803,11 @@ tor_free(address); } - tok = find_first_by_keyword(tokens, K_DIR_KEY_PUBLISHED); - tor_assert(tok); + tok = find_by_keyword(tokens, K_DIR_KEY_PUBLISHED); if (parse_iso_time(tok->args[0], &cert->cache_info.published_on) < 0) { goto err; } - tok = find_first_by_keyword(tokens, K_DIR_KEY_EXPIRES); - tor_assert(tok); + tok = find_by_keyword(tokens, K_DIR_KEY_EXPIRES); if (parse_iso_time(tok->args[0], &cert->expires) < 0) { goto err; } @@ -1594,13 +1832,28 @@ log_debug(LD_DIR, "We already checked the signature on this " "certificate; no need to do so again."); found = 1; + cert->is_cross_certified = old_cert->is_cross_certified; } } if (!found) { - if (check_signature_token(digest, tok, cert->identity_key, 0, + if (check_signature_token(digest, DIGEST_LEN, tok, cert->identity_key, 0, "key certificate")) { goto err; } + + if ((tok = find_opt_by_keyword(tokens, K_DIR_KEY_CROSSCERT))) { + /* XXXX Once all authorities generate cross-certified certificates, + * make this field mandatory. */ + if (check_signature_token(cert->cache_info.identity_digest, + DIGEST_LEN, + tok, + cert->signing_key, + CST_NO_CHECK_OBJTYPE, + "key cross-certification")) { + goto err; + } + cert->is_cross_certified = 1; + } } cert->cache_info.signed_descriptor_len = len; @@ -1612,35 +1865,49 @@ if (end_of_string) { *end_of_string = eat_whitespace(eos); } - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); + if (area) { + DUMP_AREA(area, "authority cert"); + memarea_drop_all(area); + } return cert; err: + dump_desc(s_dup, "authority cert"); authority_cert_free(cert); - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); + if (area) { + DUMP_AREA(area, "authority cert"); + memarea_drop_all(area); + } return NULL; } /** Helper: given a string s, return the start of the next router-status * object (starting with "r " at the start of a line). If none is found, - * return the start of the next directory signature. If none is found, return - * the end of the string. */ + * return the start of the directory footer, or the next directory signature. + * If none is found, return the end of the string. */ static INLINE const char * find_start_of_next_routerstatus(const char *s) { - const char *eos = strstr(s, "\nr "); - if (eos) { - const char *eos2 = tor_memstr(s, eos-s, "\ndirectory-signature"); - if (eos2 && eos2 < eos) - return eos2; - else - return eos+1; - } else { - if ((eos = strstr(s, "\ndirectory-signature"))) - return eos+1; - return s + strlen(s); - } + const char *eos, *footer, *sig; + if ((eos = strstr(s, "\nr "))) + ++eos; + else + eos = s + strlen(s); + + footer = tor_memstr(s, eos-s, "\ndirectory-footer"); + sig = tor_memstr(s, eos-s, "\ndirectory-signature"); + + if (footer && sig) + return MIN(footer, sig) + 1; + else if (footer) + return footer+1; + else if (sig) + return sig+1; + else + return eos; } /** Given a string at *s, containing a routerstatus object, and an @@ -1654,24 +1921,32 @@ * If consensus_method is nonzero, this routerstatus is part of a * consensus, and we should parse it according to the method used to * make that consensus. + * + * Parse according to the syntax used by the consensus flavor flav. **/ static routerstatus_t * -routerstatus_parse_entry_from_string(const char **s, smartlist_t *tokens, +routerstatus_parse_entry_from_string(memarea_t *area, + const char **s, smartlist_t *tokens, networkstatus_t *vote, vote_routerstatus_t *vote_rs, - int consensus_method) + int consensus_method, + consensus_flavor_t flav) { - const char *eos; + const char *eos, *s_dup = *s; routerstatus_t *rs = NULL; directory_token_t *tok; char timebuf[ISO_TIME_LEN+1]; struct in_addr in; + int offset = 0; tor_assert(tokens); tor_assert(bool_eq(vote, vote_rs)); + if (!consensus_method) + flav = FLAV_NS; + eos = find_start_of_next_routerstatus(*s); - if (tokenize_string(*s, eos, tokens, rtrstatus_token_table,0)) { + if (tokenize_string(area,*s, eos, tokens, rtrstatus_token_table,0)) { log_warn(LD_DIR, "Error tokenizing router status"); goto err; } @@ -1679,9 +1954,16 @@ log_warn(LD_DIR, "Impossibly short router status"); goto err; } - tok = find_first_by_keyword(tokens, K_R); - tor_assert(tok); - tor_assert(tok->n_args >= 8); + tok = find_by_keyword(tokens, K_R); + tor_assert(tok->n_args >= 7); + if (flav == FLAV_NS) { + if (tok->n_args < 8) { + log_warn(LD_DIR, "Too few arguments to r"); + goto err; + } + } else { + offset = -1; + } if (vote_rs) { rs = &vote_rs->status; } else { @@ -1702,31 +1984,36 @@ goto err; } - if (digest_from_base64(rs->descriptor_digest, tok->args[2])) { - log_warn(LD_DIR, "Error decoding descriptor digest %s", - escaped(tok->args[2])); - goto err; + if (flav == FLAV_NS) { + if (digest_from_base64(rs->descriptor_digest, tok->args[2])) { + log_warn(LD_DIR, "Error decoding descriptor digest %s", + escaped(tok->args[2])); + goto err; + } } if (tor_snprintf(timebuf, sizeof(timebuf), "%s %s", - tok->args[3], tok->args[4]) < 0 || + tok->args[3+offset], tok->args[4+offset]) < 0 || parse_iso_time(timebuf, &rs->published_on)<0) { - log_warn(LD_DIR, "Error parsing time '%s %s'", - tok->args[3], tok->args[4]); + log_warn(LD_DIR, "Error parsing time '%s %s' [%d %d]", + tok->args[3+offset], tok->args[4+offset], + offset, (int)flav); goto err; } - if (tor_inet_aton(tok->args[5], &in) == 0) { + if (tor_inet_aton(tok->args[5+offset], &in) == 0) { log_warn(LD_DIR, "Error parsing router address in network-status %s", - escaped(tok->args[5])); + escaped(tok->args[5+offset])); goto err; } rs->addr = ntohl(in.s_addr); - rs->or_port =(uint16_t) tor_parse_long(tok->args[6],10,0,65535,NULL,NULL); - rs->dir_port = (uint16_t) tor_parse_long(tok->args[7],10,0,65535,NULL,NULL); + rs->or_port = (uint16_t) tor_parse_long(tok->args[6+offset], + 10,0,65535,NULL,NULL); + rs->dir_port = (uint16_t) tor_parse_long(tok->args[7+offset], + 10,0,65535,NULL,NULL); - tok = find_first_by_keyword(tokens, K_S); + tok = find_opt_by_keyword(tokens, K_S); if (tok && vote) { int i; vote_rs->flags = 0; @@ -1774,12 +2061,13 @@ } } } - if ((tok = find_first_by_keyword(tokens, K_V))) { + if ((tok = find_opt_by_keyword(tokens, K_V))) { tor_assert(tok->n_args == 1); rs->version_known = 1; if (strcmpstart(tok->args[0], "Tor ")) { rs->version_supports_begindir = 1; rs->version_supports_extrainfo_upload = 1; + rs->version_supports_conditional_consensus = 1; } else { rs->version_supports_begindir = tor_version_as_new_as(tok->args[0], "0.2.0.1-alpha"); @@ -1787,32 +2075,96 @@ tor_version_as_new_as(tok->args[0], "0.2.0.0-alpha-dev (r10070)"); rs->version_supports_v3_dir = tor_version_as_new_as(tok->args[0], "0.2.0.8-alpha"); + rs->version_supports_conditional_consensus = + tor_version_as_new_as(tok->args[0], "0.2.1.1-alpha"); } if (vote_rs) { - vote_rs->version = tok->args[0]; - tok->args[0] = NULL; /* suppress free() */ + vote_rs->version = tor_strdup(tok->args[0]); } } + /* handle weighting/bandwidth info */ + if ((tok = find_opt_by_keyword(tokens, K_W))) { + int i; + for (i=0; i < tok->n_args; ++i) { + if (!strcmpstart(tok->args[i], "Bandwidth=")) { + int ok; + rs->bandwidth = (uint32_t)tor_parse_ulong(strchr(tok->args[i], '=')+1, + 10, 0, UINT32_MAX, + &ok, NULL); + if (!ok) { + log_warn(LD_DIR, "Invalid Bandwidth %s", escaped(tok->args[i])); + goto err; + } + rs->has_bandwidth = 1; + } else if (!strcmpstart(tok->args[i], "Measured=")) { + int ok; + rs->measured_bw = + (uint32_t)tor_parse_ulong(strchr(tok->args[i], '=')+1, + 10, 0, UINT32_MAX, &ok, NULL); + if (!ok) { + log_warn(LD_DIR, "Invalid Measured Bandwidth %s", + escaped(tok->args[i])); + goto err; + } + rs->has_measured_bw = 1; + } + } + } + + /* parse exit policy summaries */ + if ((tok = find_opt_by_keyword(tokens, K_P))) { + tor_assert(tok->n_args == 1); + if (strcmpstart(tok->args[0], "accept ") && + strcmpstart(tok->args[0], "reject ")) { + log_warn(LD_DIR, "Unknown exit policy summary type %s.", + escaped(tok->args[0])); + goto err; + } + /* XXX weasel: parse this into ports and represent them somehow smart, + * maybe not here but somewhere on if we need it for the client. + * we should still parse it here to check it's valid tho. + */ + rs->exitsummary = tor_strdup(tok->args[0]); + rs->has_exitsummary = 1; + } + + if (vote_rs) { + SMARTLIST_FOREACH_BEGIN(tokens, directory_token_t *, t) { + if (t->tp == K_M && t->n_args) { + vote_microdesc_hash_t *line = + tor_malloc(sizeof(vote_microdesc_hash_t)); + line->next = vote_rs->microdesc; + line->microdesc_hash_line = tor_strdup(t->args[0]); + vote_rs->microdesc = line; + } + } SMARTLIST_FOREACH_END(t); + } + if (!strcasecmp(rs->nickname, UNNAMED_ROUTER_NICKNAME)) rs->is_named = 0; goto done; err: + dump_desc(s_dup, "routerstatus entry"); if (rs && !vote_rs) routerstatus_free(rs); rs = NULL; done: - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_clear(tokens); + if (area) { + DUMP_AREA(area, "routerstatus entry"); + memarea_clear(area); + } *s = eos; return rs; } /** Helper to sort a smartlist of pointers to routerstatus_t */ -static int -_compare_routerstatus_entries(const void **_a, const void **_b) +int +compare_routerstatus_entries(const void **_a, const void **_b) { const routerstatus_t *a = *_a, *b = *_b; return memcmp(a->identity_digest, b->identity_digest, DIGEST_LEN); @@ -1836,7 +2188,7 @@ networkstatus_v2_t * networkstatus_v2_parse_from_string(const char *s) { - const char *eos; + const char *eos, *s_dup = s; smartlist_t *tokens = smartlist_create(); smartlist_t *footer_tokens = smartlist_create(); networkstatus_v2_t *ns = NULL; @@ -1845,32 +2197,33 @@ struct in_addr in; directory_token_t *tok; int i; + memarea_t *area = NULL; if (router_get_networkstatus_v2_hash(s, ns_digest)) { log_warn(LD_DIR, "Unable to compute digest of network-status"); goto err; } + area = memarea_new(); eos = find_start_of_next_routerstatus(s); - if (tokenize_string(s, eos, tokens, netstatus_token_table,0)) { + if (tokenize_string(area, s, eos, tokens, netstatus_token_table,0)) { log_warn(LD_DIR, "Error tokenizing network-status header."); goto err; } ns = tor_malloc_zero(sizeof(networkstatus_v2_t)); memcpy(ns->networkstatus_digest, ns_digest, DIGEST_LEN); - tok = find_first_by_keyword(tokens, K_NETWORK_STATUS_VERSION); - tor_assert(tok && tok->n_args >= 1); + tok = find_by_keyword(tokens, K_NETWORK_STATUS_VERSION); + tor_assert(tok->n_args >= 1); if (strcmp(tok->args[0], "2")) { log_warn(LD_BUG, "Got a non-v2 networkstatus. Version was " "%s", escaped(tok->args[0])); goto err; } - tok = find_first_by_keyword(tokens, K_DIR_SOURCE); - tor_assert(tok); + tok = find_by_keyword(tokens, K_DIR_SOURCE); tor_assert(tok->n_args >= 3); - ns->source_address = tok->args[0]; tok->args[0] = NULL; + ns->source_address = tor_strdup(tok->args[0]); if (tor_inet_aton(tok->args[1], &in) == 0) { log_warn(LD_DIR, "Error parsing network-status source address %s", escaped(tok->args[1])); @@ -1884,8 +2237,7 @@ goto err; } - tok = find_first_by_keyword(tokens, K_FINGERPRINT); - tor_assert(tok); + tok = find_by_keyword(tokens, K_FINGERPRINT); tor_assert(tok->n_args); if (base16_decode(ns->identity_digest, DIGEST_LEN, tok->args[0], strlen(tok->args[0]))) { @@ -1894,14 +2246,13 @@ goto err; } - if ((tok = find_first_by_keyword(tokens, K_CONTACT))) { + if ((tok = find_opt_by_keyword(tokens, K_CONTACT))) { tor_assert(tok->n_args); - ns->contact = tok->args[0]; - tok->args[0] = NULL; + ns->contact = tor_strdup(tok->args[0]); } - tok = find_first_by_keyword(tokens, K_DIR_SIGNING_KEY); - tor_assert(tok && tok->key); + tok = find_by_keyword(tokens, K_DIR_SIGNING_KEY); + tor_assert(tok->key); ns->signing_key = tok->key; tok->key = NULL; @@ -1915,7 +2266,7 @@ goto err; } - if ((tok = find_first_by_keyword(tokens, K_DIR_OPTIONS))) { + if ((tok = find_opt_by_keyword(tokens, K_DIR_OPTIONS))) { for (i=0; i < tok->n_args; ++i) { if (!strcmp(tok->args[i], "Names")) ns->binds_names = 1; @@ -1929,24 +2280,21 @@ } if (ns->recommends_versions) { - if (!(tok = find_first_by_keyword(tokens, K_CLIENT_VERSIONS))) { + if (!(tok = find_opt_by_keyword(tokens, K_CLIENT_VERSIONS))) { log_warn(LD_DIR, "Missing client-versions on versioning directory"); goto err; } - ns->client_versions = tok->args[0]; - tok->args[0] = NULL; + ns->client_versions = tor_strdup(tok->args[0]); - if (!(tok = find_first_by_keyword(tokens, K_SERVER_VERSIONS)) || + if (!(tok = find_opt_by_keyword(tokens, K_SERVER_VERSIONS)) || tok->n_args<1) { log_warn(LD_DIR, "Missing server-versions on versioning directory"); goto err; } - ns->server_versions = tok->args[0]; - tok->args[0] = NULL; + ns->server_versions = tor_strdup(tok->args[0]); } - tok = find_first_by_keyword(tokens, K_PUBLISHED); - tor_assert(tok); + tok = find_by_keyword(tokens, K_PUBLISHED); tor_assert(tok->n_args == 1); if (parse_iso_time(tok->args[0], &ns->published_on) < 0) { goto err; @@ -1954,18 +2302,20 @@ ns->entries = smartlist_create(); s = eos; - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_clear(tokens); + memarea_clear(area); while (!strcmpstart(s, "r ")) { routerstatus_t *rs; - if ((rs = routerstatus_parse_entry_from_string(&s, tokens, NULL, NULL, 0))) + if ((rs = routerstatus_parse_entry_from_string(area, &s, tokens, + NULL, NULL, 0, 0))) smartlist_add(ns->entries, rs); } - smartlist_sort(ns->entries, _compare_routerstatus_entries); - smartlist_uniq(ns->entries, _compare_routerstatus_entries, + smartlist_sort(ns->entries, compare_routerstatus_entries); + smartlist_uniq(ns->entries, compare_routerstatus_entries, _free_duplicate_routerstatus_entry); - if (tokenize_string(s, NULL, footer_tokens, dir_footer_token_table,0)) { + if (tokenize_string(area,s, NULL, footer_tokens, dir_footer_token_table,0)) { log_warn(LD_DIR, "Error tokenizing network-status footer."); goto err; } @@ -1981,62 +2331,475 @@ } note_crypto_pk_op(VERIFY_DIR); - if (check_signature_token(ns_digest, tok, ns->signing_key, 0, + if (check_signature_token(ns_digest, DIGEST_LEN, tok, ns->signing_key, 0, "network-status") < 0) goto err; goto done; err: - if (ns) - networkstatus_v2_free(ns); + dump_desc(s_dup, "v2 networkstatus"); + networkstatus_v2_free(ns); ns = NULL; done: - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); - SMARTLIST_FOREACH(footer_tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(footer_tokens, directory_token_t *, t, token_clear(t)); smartlist_free(footer_tokens); - + if (area) { + DUMP_AREA(area, "v2 networkstatus"); + memarea_drop_all(area); + } return ns; } -/** Parse a v3 networkstatus vote (if is_vote is true) or a v3 - * networkstatus consensus (if is_vote is false) from s, and - * return the result. Return NULL on failure. */ +/** Verify the bandwidth weights of a network status document */ +int +networkstatus_verify_bw_weights(networkstatus_t *ns) +{ + int64_t weight_scale; + int64_t G=0, M=0, E=0, D=0, T=0; + double Wgg, Wgm, Wgd, Wmg, Wmm, Wme, Wmd, Weg, Wem, Wee, Wed; + double Gtotal=0, Mtotal=0, Etotal=0; + const char *casename = NULL; + int valid = 1; + + weight_scale = networkstatus_get_param(ns, "bwweightscale", BW_WEIGHT_SCALE); + Wgg = networkstatus_get_bw_weight(ns, "Wgg", -1); + Wgm = networkstatus_get_bw_weight(ns, "Wgm", -1); + Wgd = networkstatus_get_bw_weight(ns, "Wgd", -1); + Wmg = networkstatus_get_bw_weight(ns, "Wmg", -1); + Wmm = networkstatus_get_bw_weight(ns, "Wmm", -1); + Wme = networkstatus_get_bw_weight(ns, "Wme", -1); + Wmd = networkstatus_get_bw_weight(ns, "Wmd", -1); + Weg = networkstatus_get_bw_weight(ns, "Weg", -1); + Wem = networkstatus_get_bw_weight(ns, "Wem", -1); + Wee = networkstatus_get_bw_weight(ns, "Wee", -1); + Wed = networkstatus_get_bw_weight(ns, "Wed", -1); + + if (Wgg<0 || Wgm<0 || Wgd<0 || Wmg<0 || Wmm<0 || Wme<0 || Wmd<0 || Weg<0 + || Wem<0 || Wee<0 || Wed<0) { + log_warn(LD_BUG, "No bandwidth weights produced in consensus!"); + return 0; + } + + // First, sanity check basic summing properties that hold for all cases + // We use > 1 as the check for these because they are computed as integers. + // Sometimes there are rounding errors. + if (fabs(Wmm - weight_scale) > 1) { + log_warn(LD_BUG, "Wmm=%lf != "I64_FORMAT, + Wmm, I64_PRINTF_ARG(weight_scale)); + valid = 0; + } + + if (fabs(Wem - Wee) > 1) { + log_warn(LD_BUG, "Wem=%lf != Wee=%lf", Wem, Wee); + valid = 0; + } + + if (fabs(Wgm - Wgg) > 1) { + log_warn(LD_BUG, "Wgm=%lf != Wgg=%lf", Wgm, Wgg); + valid = 0; + } + + if (fabs(Weg - Wed) > 1) { + log_warn(LD_BUG, "Wed=%lf != Weg=%lf", Wed, Weg); + valid = 0; + } + + if (fabs(Wgg + Wmg - weight_scale) > 0.001*weight_scale) { + log_warn(LD_BUG, "Wgg=%lf != "I64_FORMAT" - Wmg=%lf", Wgg, + I64_PRINTF_ARG(weight_scale), Wmg); + valid = 0; + } + + if (fabs(Wee + Wme - weight_scale) > 0.001*weight_scale) { + log_warn(LD_BUG, "Wee=%lf != "I64_FORMAT" - Wme=%lf", Wee, + I64_PRINTF_ARG(weight_scale), Wme); + valid = 0; + } + + if (fabs(Wgd + Wmd + Wed - weight_scale) > 0.001*weight_scale) { + log_warn(LD_BUG, "Wgd=%lf + Wmd=%lf + Wed=%lf != "I64_FORMAT, + Wgd, Wmd, Wed, I64_PRINTF_ARG(weight_scale)); + valid = 0; + } + + Wgg /= weight_scale; + Wgm /= weight_scale; + Wgd /= weight_scale; + + Wmg /= weight_scale; + Wmm /= weight_scale; + Wme /= weight_scale; + Wmd /= weight_scale; + + Weg /= weight_scale; + Wem /= weight_scale; + Wee /= weight_scale; + Wed /= weight_scale; + + // Then, gather G, M, E, D, T to determine case + SMARTLIST_FOREACH_BEGIN(ns->routerstatus_list, routerstatus_t *, rs) { + if (rs->has_bandwidth) { + T += rs->bandwidth; + if (rs->is_exit && rs->is_possible_guard) { + D += rs->bandwidth; + Gtotal += Wgd*rs->bandwidth; + Mtotal += Wmd*rs->bandwidth; + Etotal += Wed*rs->bandwidth; + } else if (rs->is_exit) { + E += rs->bandwidth; + Mtotal += Wme*rs->bandwidth; + Etotal += Wee*rs->bandwidth; + } else if (rs->is_possible_guard) { + G += rs->bandwidth; + Gtotal += Wgg*rs->bandwidth; + Mtotal += Wmg*rs->bandwidth; + } else { + M += rs->bandwidth; + Mtotal += Wmm*rs->bandwidth; + } + } else { + log_warn(LD_BUG, "Missing consensus bandwidth for router %s", + rs->nickname); + } + } SMARTLIST_FOREACH_END(rs); + + // Finally, check equality conditions depending upon case 1, 2 or 3 + // Full equality cases: 1, 3b + // Partial equality cases: 2b (E=G), 3a (M=E) + // Fully unknown: 2a + if (3*E >= T && 3*G >= T) { + // Case 1: Neither are scarce + casename = "Case 1"; + if (fabs(Etotal-Mtotal) > 0.01*MAX(Etotal,Mtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Etotal %lf != Mtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Etotal, Mtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + if (fabs(Etotal-Gtotal) > 0.01*MAX(Etotal,Gtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Etotal %lf != Gtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Etotal, Gtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + if (fabs(Gtotal-Mtotal) > 0.01*MAX(Gtotal,Mtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Mtotal %lf != Gtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Mtotal, Gtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + } else if (3*E < T && 3*G < T) { + int64_t R = MIN(E, G); + int64_t S = MAX(E, G); + /* + * Case 2: Both Guards and Exits are scarce + * Balance D between E and G, depending upon + * D capacity and scarcity. Devote no extra + * bandwidth to middle nodes. + */ + if (R+D < S) { // Subcase a + double Rtotal, Stotal; + if (E < G) { + Rtotal = Etotal; + Stotal = Gtotal; + } else { + Rtotal = Gtotal; + Stotal = Etotal; + } + casename = "Case 2a"; + // Rtotal < Stotal + if (Rtotal > Stotal) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Rtotal %lf > Stotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Rtotal, Stotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + // Rtotal < T/3 + if (3*Rtotal > T) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: 3*Rtotal %lf > T " + I64_FORMAT". G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT + " D="I64_FORMAT" T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Rtotal*3, I64_PRINTF_ARG(T), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + // Stotal < T/3 + if (3*Stotal > T) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: 3*Stotal %lf > T " + I64_FORMAT". G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT + " D="I64_FORMAT" T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Stotal*3, I64_PRINTF_ARG(T), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + // Mtotal > T/3 + if (3*Mtotal < T) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: 3*Mtotal %lf < T " + I64_FORMAT". " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Mtotal*3, I64_PRINTF_ARG(T), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + } else { // Subcase b: R+D > S + casename = "Case 2b"; + + /* Check the rare-M redirect case. */ + if (D != 0 && 3*M < T) { + casename = "Case 2b (balanced)"; + if (fabs(Etotal-Mtotal) > 0.01*MAX(Etotal,Mtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Etotal %lf != Mtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Etotal, Mtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + if (fabs(Etotal-Gtotal) > 0.01*MAX(Etotal,Gtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Etotal %lf != Gtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Etotal, Gtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + if (fabs(Gtotal-Mtotal) > 0.01*MAX(Gtotal,Mtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Mtotal %lf != Gtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Mtotal, Gtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + } else { + if (fabs(Etotal-Gtotal) > 0.01*MAX(Etotal,Gtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Etotal %lf != Gtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Etotal, Gtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + } + } + } else { // if (E < T/3 || G < T/3) { + int64_t S = MIN(E, G); + int64_t NS = MAX(E, G); + if (3*(S+D) < T) { // Subcase a: + double Stotal; + double NStotal; + if (G < E) { + casename = "Case 3a (G scarce)"; + Stotal = Gtotal; + NStotal = Etotal; + } else { // if (G >= E) { + casename = "Case 3a (E scarce)"; + NStotal = Gtotal; + Stotal = Etotal; + } + // Stotal < T/3 + if (3*Stotal > T) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: 3*Stotal %lf > T " + I64_FORMAT". G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT + " D="I64_FORMAT" T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Stotal*3, I64_PRINTF_ARG(T), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + if (NS >= M) { + if (fabs(NStotal-Mtotal) > 0.01*MAX(NStotal,Mtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: NStotal %lf != Mtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, NStotal, Mtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + } else { + // if NS < M, NStotal > T/3 because only one of G or E is scarce + if (3*NStotal < T) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: 3*NStotal %lf < T " + I64_FORMAT". G="I64_FORMAT" M="I64_FORMAT + " E="I64_FORMAT" D="I64_FORMAT" T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, NStotal*3, I64_PRINTF_ARG(T), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + } + } else { // Subcase b: S+D >= T/3 + casename = "Case 3b"; + if (fabs(Etotal-Mtotal) > 0.01*MAX(Etotal,Mtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Etotal %lf != Mtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Etotal, Mtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + if (fabs(Etotal-Gtotal) > 0.01*MAX(Etotal,Gtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Etotal %lf != Gtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Etotal, Gtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + if (fabs(Gtotal-Mtotal) > 0.01*MAX(Gtotal,Mtotal)) { + log_warn(LD_DIR, + "Bw Weight Failure for %s: Mtotal %lf != Gtotal %lf. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT". " + "Wgg=%lf Wgd=%lf Wmg=%lf Wme=%lf Wmd=%lf Wee=%lf Wed=%lf", + casename, Mtotal, Gtotal, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), + Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed); + valid = 0; + } + } + } + + if (valid) + log_notice(LD_DIR, "Bandwidth-weight %s is verified and valid.", + casename); + + return valid; +} + +/** Parse a v3 networkstatus vote, opinion, or consensus (depending on + * ns_type), from s, and return the result. Return NULL on failure. */ networkstatus_t * networkstatus_parse_vote_from_string(const char *s, const char **eos_out, - int is_vote) + networkstatus_type_t ns_type) { smartlist_t *tokens = smartlist_create(); smartlist_t *rs_tokens = NULL, *footer_tokens = NULL; networkstatus_voter_info_t *voter = NULL; networkstatus_t *ns = NULL; - char ns_digest[DIGEST_LEN]; - const char *cert, *end_of_header, *end_of_footer; + digests_t ns_digests; + const char *cert, *end_of_header, *end_of_footer, *s_dup = s; directory_token_t *tok; int ok; struct in_addr in; int i, inorder, n_signatures = 0; + memarea_t *area = NULL, *rs_area = NULL; + consensus_flavor_t flav = FLAV_NS; + + tor_assert(s); if (eos_out) *eos_out = NULL; - if (router_get_networkstatus_v3_hash(s, ns_digest)) { + if (router_get_networkstatus_v3_hashes(s, &ns_digests)) { log_warn(LD_DIR, "Unable to compute digest of network-status"); goto err; } + area = memarea_new(); end_of_header = find_start_of_next_routerstatus(s); - if (tokenize_string(s, end_of_header, tokens, - is_vote ? networkstatus_token_table : - networkstatus_consensus_token_table, 0)) { - log_warn(LD_DIR, "Error tokenizing network-status vote header."); + if (tokenize_string(area, s, end_of_header, tokens, + (ns_type == NS_TYPE_CONSENSUS) ? + networkstatus_consensus_token_table : + networkstatus_token_table, 0)) { + log_warn(LD_DIR, "Error tokenizing network-status vote header"); goto err; } ns = tor_malloc_zero(sizeof(networkstatus_t)); - memcpy(ns->networkstatus_digest, ns_digest, DIGEST_LEN); + memcpy(&ns->digests, &ns_digests, sizeof(ns_digests)); + + tok = find_by_keyword(tokens, K_NETWORK_STATUS_VERSION); + tor_assert(tok); + if (tok->n_args > 1) { + int flavor = networkstatus_parse_flavor_name(tok->args[1]); + if (flavor < 0) { + log_warn(LD_DIR, "Can't parse document with unknown flavor %s", + escaped(tok->args[2])); + goto err; + } + ns->flavor = flav = flavor; + } + if (flav != FLAV_NS && ns_type != NS_TYPE_CONSENSUS) { + log_warn(LD_DIR, "Flavor found on non-consenus networkstatus."); + goto err; + } - if (is_vote) { + if (ns_type != NS_TYPE_CONSENSUS) { const char *end_of_cert = NULL; if (!(cert = strstr(s, "\ndir-key-certificate-version"))) goto err; @@ -2046,39 +2809,39 @@ goto err; } - tok = find_first_by_keyword(tokens, K_VOTE_STATUS); - tor_assert(tok); + tok = find_by_keyword(tokens, K_VOTE_STATUS); tor_assert(tok->n_args); if (!strcmp(tok->args[0], "vote")) { - ns->is_vote = 1; + ns->type = NS_TYPE_VOTE; } else if (!strcmp(tok->args[0], "consensus")) { - ns->is_vote = 0; + ns->type = NS_TYPE_CONSENSUS; + } else if (!strcmp(tok->args[0], "opinion")) { + ns->type = NS_TYPE_OPINION; } else { log_warn(LD_DIR, "Unrecognized vote status %s in network-status", escaped(tok->args[0])); goto err; } - if (!bool_eq(ns->is_vote, is_vote)) { + if (ns_type != ns->type) { log_warn(LD_DIR, "Got the wrong kind of v3 networkstatus."); goto err; } - if (ns->is_vote) { - tok = find_first_by_keyword(tokens, K_PUBLISHED); + if (ns->type == NS_TYPE_VOTE || ns->type == NS_TYPE_OPINION) { + tok = find_by_keyword(tokens, K_PUBLISHED); if (parse_iso_time(tok->args[0], &ns->published)) goto err; ns->supported_methods = smartlist_create(); - tok = find_first_by_keyword(tokens, K_CONSENSUS_METHODS); + tok = find_opt_by_keyword(tokens, K_CONSENSUS_METHODS); if (tok) { for (i=0; i < tok->n_args; ++i) - smartlist_add(ns->supported_methods, tok->args[i]); - tok->n_args = 0; /* Prevent double free. */ + smartlist_add(ns->supported_methods, tor_strdup(tok->args[i])); } else { smartlist_add(ns->supported_methods, tor_strdup("1")); } } else { - tok = find_first_by_keyword(tokens, K_CONSENSUS_METHOD); + tok = find_opt_by_keyword(tokens, K_CONSENSUS_METHOD); if (tok) { ns->consensus_method = (int)tor_parse_long(tok->args[0], 10, 1, INT_MAX, &ok, NULL); @@ -2089,19 +2852,19 @@ } } - tok = find_first_by_keyword(tokens, K_VALID_AFTER); + tok = find_by_keyword(tokens, K_VALID_AFTER); if (parse_iso_time(tok->args[0], &ns->valid_after)) goto err; - tok = find_first_by_keyword(tokens, K_FRESH_UNTIL); + tok = find_by_keyword(tokens, K_FRESH_UNTIL); if (parse_iso_time(tok->args[0], &ns->fresh_until)) goto err; - tok = find_first_by_keyword(tokens, K_VALID_UNTIL); + tok = find_by_keyword(tokens, K_VALID_UNTIL); if (parse_iso_time(tok->args[0], &ns->valid_until)) goto err; - tok = find_first_by_keyword(tokens, K_VOTING_DELAY); + tok = find_by_keyword(tokens, K_VOTING_DELAY); tor_assert(tok->n_args >= 2); ns->vote_seconds = (int) tor_parse_long(tok->args[0], 10, 0, INT_MAX, &ok, NULL); @@ -2128,35 +2891,59 @@ goto err; } - if ((tok = find_first_by_keyword(tokens, K_CLIENT_VERSIONS))) { - ns->client_versions = tok->args[0]; - tok->args[0] = NULL; + if ((tok = find_opt_by_keyword(tokens, K_CLIENT_VERSIONS))) { + ns->client_versions = tor_strdup(tok->args[0]); } - if ((tok = find_first_by_keyword(tokens, K_SERVER_VERSIONS))) { - ns->server_versions = tok->args[0]; - tok->args[0] = NULL; + if ((tok = find_opt_by_keyword(tokens, K_SERVER_VERSIONS))) { + ns->server_versions = tor_strdup(tok->args[0]); } - tok = find_first_by_keyword(tokens, K_KNOWN_FLAGS); + tok = find_by_keyword(tokens, K_KNOWN_FLAGS); ns->known_flags = smartlist_create(); inorder = 1; for (i = 0; i < tok->n_args; ++i) { - smartlist_add(ns->known_flags, tok->args[i]); + smartlist_add(ns->known_flags, tor_strdup(tok->args[i])); if (i>0 && strcmp(tok->args[i-1], tok->args[i])>= 0) { log_warn(LD_DIR, "%s >= %s", tok->args[i-1], tok->args[i]); inorder = 0; } } - tok->n_args = 0; /* suppress free of args members, but not of args itself. */ if (!inorder) { log_warn(LD_DIR, "known-flags not in order"); goto err; } + tok = find_opt_by_keyword(tokens, K_PARAMS); + if (tok) { + inorder = 1; + ns->net_params = smartlist_create(); + for (i = 0; i < tok->n_args; ++i) { + int ok=0; + char *eq = strchr(tok->args[i], '='); + if (!eq) { + log_warn(LD_DIR, "Bad element '%s' in params", escaped(tok->args[i])); + goto err; + } + tor_parse_long(eq+1, 10, INT32_MIN, INT32_MAX, &ok, NULL); + if (!ok) { + log_warn(LD_DIR, "Bad element '%s' in params", escaped(tok->args[i])); + goto err; + } + if (i > 0 && strcmp(tok->args[i-1], tok->args[i]) >= 0) { + log_warn(LD_DIR, "%s >= %s", tok->args[i-1], tok->args[i]); + inorder = 0; + } + smartlist_add(ns->net_params, tor_strdup(tok->args[i])); + } + if (!inorder) { + log_warn(LD_DIR, "params not in order"); + goto err; + } + } + ns->voters = smartlist_create(); - SMARTLIST_FOREACH(tokens, directory_token_t *, _tok, - { + SMARTLIST_FOREACH_BEGIN(tokens, directory_token_t *, _tok) { tok = _tok; if (tok->tp == K_DIR_SOURCE) { tor_assert(tok->n_args >= 6); @@ -2164,8 +2951,9 @@ if (voter) smartlist_add(ns->voters, voter); voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); - if (is_vote) - memcpy(voter->vote_digest, ns_digest, DIGEST_LEN); + voter->sigs = smartlist_create(); + if (ns->type != NS_TYPE_CONSENSUS) + memcpy(voter->vote_digest, ns_digests.d[DIGEST_SHA1], DIGEST_LEN); voter->nickname = tor_strdup(tok->args[0]); if (strlen(tok->args[1]) != HEX_DIGEST_LEN || @@ -2175,8 +2963,9 @@ "network-status vote.", escaped(tok->args[1])); goto err; } - if (is_vote && memcmp(ns->cert->cache_info.identity_digest, - voter->identity_digest, DIGEST_LEN)) { + if (ns->type != NS_TYPE_CONSENSUS && + memcmp(ns->cert->cache_info.identity_digest, + voter->identity_digest, DIGEST_LEN)) { log_warn(LD_DIR,"Mismatch between identities in certificate and vote"); goto err; } @@ -2187,12 +2976,12 @@ goto err; } voter->addr = ntohl(in.s_addr); - voter->dir_port = (uint64_t) - (int) tor_parse_long(tok->args[4], 10, 0, 65535, &ok, NULL); + voter->dir_port = (uint16_t) + tor_parse_long(tok->args[4], 10, 0, 65535, &ok, NULL); if (!ok) goto err; - voter->or_port = (uint64_t) - (int) tor_parse_long(tok->args[5], 10, 0, 65535, &ok, NULL); + voter->or_port = (uint16_t) + tor_parse_long(tok->args[5], 10, 0, 65535, &ok, NULL); if (!ok) goto err; } else if (tok->tp == K_CONTACT) { @@ -2202,7 +2991,7 @@ } voter->contact = tor_strdup(tok->args[0]); } else if (tok->tp == K_VOTE_DIGEST) { - tor_assert(!is_vote); + tor_assert(ns->type == NS_TYPE_CONSENSUS); tor_assert(tok->n_args >= 1); if (!voter || ! tor_digest_is_zero(voter->vote_digest)) { log_warn(LD_DIR, "vote-digest element is out of place."); @@ -2212,11 +3001,11 @@ base16_decode(voter->vote_digest, sizeof(voter->vote_digest), tok->args[0], HEX_DIGEST_LEN) < 0) { log_warn(LD_DIR, "Error decoding vote digest %s in " - "network-status consensus.", escaped(tok->args[1])); + "network-status consensus.", escaped(tok->args[0])); goto err; } } - }); + } SMARTLIST_FOREACH_END(_tok); if (voter) { smartlist_add(ns->voters, voter); voter = NULL; @@ -2224,13 +3013,13 @@ if (smartlist_len(ns->voters) == 0) { log_warn(LD_DIR, "Missing dir-source elements in a vote networkstatus."); goto err; - } else if (is_vote && smartlist_len(ns->voters) != 1) { + } else if (ns->type != NS_TYPE_CONSENSUS && smartlist_len(ns->voters) != 1) { log_warn(LD_DIR, "Too many dir-source elements in a vote networkstatus."); goto err; } - if (is_vote && - (tok = find_first_by_keyword(tokens, K_LEGACY_DIR_KEY))) { + if (ns->type != NS_TYPE_CONSENSUS && + (tok = find_opt_by_keyword(tokens, K_LEGACY_DIR_KEY))) { int bad = 1; if (strlen(tok->args[0]) == HEX_DIGEST_LEN) { networkstatus_voter_info_t *voter = smartlist_get(ns->voters, 0); @@ -2248,13 +3037,15 @@ /* Parse routerstatus lines. */ rs_tokens = smartlist_create(); + rs_area = memarea_new(); s = end_of_header; ns->routerstatus_list = smartlist_create(); while (!strcmpstart(s, "r ")) { - if (is_vote) { + if (ns->type != NS_TYPE_CONSENSUS) { vote_routerstatus_t *rs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - if (routerstatus_parse_entry_from_string(&s, rs_tokens, ns, rs, 0)) + if (routerstatus_parse_entry_from_string(rs_area, &s, rs_tokens, ns, + rs, 0, 0)) smartlist_add(ns->routerstatus_list, rs); else { tor_free(rs->version); @@ -2262,14 +3053,16 @@ } } else { routerstatus_t *rs; - if ((rs = routerstatus_parse_entry_from_string(&s, rs_tokens, NULL, NULL, - ns->consensus_method))) + if ((rs = routerstatus_parse_entry_from_string(rs_area, &s, rs_tokens, + NULL, NULL, + ns->consensus_method, + flav))) smartlist_add(ns->routerstatus_list, rs); } } for (i = 1; i < smartlist_len(ns->routerstatus_list); ++i) { routerstatus_t *rs1, *rs2; - if (is_vote) { + if (ns->type != NS_TYPE_CONSENSUS) { vote_routerstatus_t *a = smartlist_get(ns->routerstatus_list, i-1); vote_routerstatus_t *b = smartlist_get(ns->routerstatus_list, i); rs1 = &a->status; rs2 = &b->status; @@ -2290,20 +3083,79 @@ ++end_of_footer; else end_of_footer = s + strlen(s); - if (tokenize_string(s, end_of_footer, footer_tokens, + if (tokenize_string(area,s, end_of_footer, footer_tokens, networkstatus_vote_footer_token_table, 0)) { log_warn(LD_DIR, "Error tokenizing network-status vote footer."); goto err; } - SMARTLIST_FOREACH(footer_tokens, directory_token_t *, _tok, { + int found_sig = 0; + SMARTLIST_FOREACH_BEGIN(footer_tokens, directory_token_t *, _tok) { + tok = _tok; + if (tok->tp == K_DIRECTORY_SIGNATURE) + found_sig = 1; + else if (found_sig) { + log_warn(LD_DIR, "Extraneous token after first directory-signature"); + goto err; + } + } SMARTLIST_FOREACH_END(_tok); + } + + if ((tok = find_opt_by_keyword(footer_tokens, K_DIRECTORY_FOOTER))) { + if (tok != smartlist_get(footer_tokens, 0)) { + log_warn(LD_DIR, "Misplaced directory-footer token"); + goto err; + } + } + + tok = find_opt_by_keyword(footer_tokens, K_BW_WEIGHTS); + if (tok) { + ns->weight_params = smartlist_create(); + for (i = 0; i < tok->n_args; ++i) { + int ok=0; + char *eq = strchr(tok->args[i], '='); + if (!eq) { + log_warn(LD_DIR, "Bad element '%s' in weight params", + escaped(tok->args[i])); + goto err; + } + tor_parse_long(eq+1, 10, INT32_MIN, INT32_MAX, &ok, NULL); + if (!ok) { + log_warn(LD_DIR, "Bad element '%s' in params", escaped(tok->args[i])); + goto err; + } + smartlist_add(ns->weight_params, tor_strdup(tok->args[i])); + } + } + + SMARTLIST_FOREACH_BEGIN(footer_tokens, directory_token_t *, _tok) { char declared_identity[DIGEST_LEN]; networkstatus_voter_info_t *v; + document_signature_t *sig; + const char *id_hexdigest = NULL; + const char *sk_hexdigest = NULL; + digest_algorithm_t alg = DIGEST_SHA1; tok = _tok; if (tok->tp != K_DIRECTORY_SIGNATURE) continue; tor_assert(tok->n_args >= 2); + if (tok->n_args == 2) { + id_hexdigest = tok->args[0]; + sk_hexdigest = tok->args[1]; + } else { + const char *algname = tok->args[0]; + int a; + id_hexdigest = tok->args[1]; + sk_hexdigest = tok->args[2]; + a = crypto_digest_algorithm_parse_name(algname); + if (a<0) { + log_warn(LD_DIR, "Unknown digest algorithm %s; skipping", + escaped(algname)); + continue; + } + alg = a; + } if (!tok->object_type || strcmp(tok->object_type, "SIGNATURE") || @@ -2312,11 +3164,11 @@ goto err; } - if (strlen(tok->args[0]) != HEX_DIGEST_LEN || + if (strlen(id_hexdigest) != HEX_DIGEST_LEN || base16_decode(declared_identity, sizeof(declared_identity), - tok->args[0], HEX_DIGEST_LEN) < 0) { + id_hexdigest, HEX_DIGEST_LEN) < 0) { log_warn(LD_DIR, "Error decoding declared identity %s in " - "network-status vote.", escaped(tok->args[0])); + "network-status vote.", escaped(id_hexdigest)); goto err; } if (!(v = networkstatus_get_voter_by_id(ns, declared_identity))) { @@ -2324,40 +3176,66 @@ "any declared directory source."); goto err; } - if (strlen(tok->args[1]) != HEX_DIGEST_LEN || - base16_decode(v->signing_key_digest, sizeof(v->signing_key_digest), - tok->args[1], HEX_DIGEST_LEN) < 0) { - log_warn(LD_DIR, "Error decoding declared digest %s in " - "network-status vote.", escaped(tok->args[1])); + sig = tor_malloc_zero(sizeof(document_signature_t)); + memcpy(sig->identity_digest, v->identity_digest, DIGEST_LEN); + sig->alg = alg; + if (strlen(sk_hexdigest) != HEX_DIGEST_LEN || + base16_decode(sig->signing_key_digest, sizeof(sig->signing_key_digest), + sk_hexdigest, HEX_DIGEST_LEN) < 0) { + log_warn(LD_DIR, "Error decoding declared signing key digest %s in " + "network-status vote.", escaped(sk_hexdigest)); + tor_free(sig); goto err; } - if (is_vote) { + if (ns->type != NS_TYPE_CONSENSUS) { if (memcmp(declared_identity, ns->cert->cache_info.identity_digest, DIGEST_LEN)) { log_warn(LD_DIR, "Digest mismatch between declared and actual on " "network-status vote."); + tor_free(sig); goto err; } } - if (is_vote) { - if (check_signature_token(ns_digest, tok, ns->cert->signing_key, 0, - "network-status vote")) + if (voter_get_sig_by_algorithm(v, sig->alg)) { + /* We already parsed a vote with this algorithm from this voter. Use the + first one. */ + log_fn(LOG_PROTOCOL_WARN, LD_DIR, "We received a networkstatus " + "that contains two votes from the same voter with the same " + "algorithm. Ignoring the second vote."); + tor_free(sig); + continue; + } + + if (ns->type != NS_TYPE_CONSENSUS) { + if (check_signature_token(ns_digests.d[DIGEST_SHA1], DIGEST_LEN, + tok, ns->cert->signing_key, 0, + "network-status vote")) { + tor_free(sig); goto err; - v->good_signature = 1; + } + sig->good_signature = 1; } else { - if (tok->object_size >= INT_MAX) + if (tok->object_size >= INT_MAX) { + tor_free(sig); goto err; - v->signature = tor_memdup(tok->object_body, tok->object_size); - v->signature_len = (int) tok->object_size; + } + sig->signature = tor_memdup(tok->object_body, tok->object_size); + sig->signature_len = (int) tok->object_size; } + smartlist_add(v->sigs, sig); + ++n_signatures; - }); + } SMARTLIST_FOREACH_END(_tok); if (! n_signatures) { log_warn(LD_DIR, "No signatures on networkstatus vote."); goto err; + } else if (ns->type == NS_TYPE_VOTE && n_signatures != 1) { + log_warn(LD_DIR, "Received more than one signature on a " + "network-status vote."); + goto err; } if (eos_out) @@ -2365,137 +3243,270 @@ goto done; err: - if (ns) - networkstatus_vote_free(ns); + dump_desc(s_dup, "v3 networkstatus"); + networkstatus_vote_free(ns); ns = NULL; done: if (tokens) { - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); } if (voter) { + if (voter->sigs) { + SMARTLIST_FOREACH(voter->sigs, document_signature_t *, sig, + document_signature_free(sig)); + smartlist_free(voter->sigs); + } tor_free(voter->nickname); tor_free(voter->address); tor_free(voter->contact); - tor_free(voter->signature); tor_free(voter); } if (rs_tokens) { - SMARTLIST_FOREACH(rs_tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(rs_tokens, directory_token_t *, t, token_clear(t)); smartlist_free(rs_tokens); } if (footer_tokens) { - SMARTLIST_FOREACH(footer_tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(footer_tokens, directory_token_t *, t, token_clear(t)); smartlist_free(footer_tokens); } + if (area) { + DUMP_AREA(area, "v3 networkstatus"); + memarea_drop_all(area); + } + if (rs_area) + memarea_drop_all(rs_area); return ns; } +/** Return the digests_t that holds the digests of the + * flavor_name-flavored networkstatus according to the detached + * signatures document sigs, allocating a new digests_t as neeeded. */ +static digests_t * +detached_get_digests(ns_detached_signatures_t *sigs, const char *flavor_name) +{ + digests_t *d = strmap_get(sigs->digests, flavor_name); + if (!d) { + d = tor_malloc_zero(sizeof(digests_t)); + strmap_set(sigs->digests, flavor_name, d); + } + return d; +} + +/** Return the list of signatures of the flavor_name-flavored + * networkstatus according to the detached signatures document sigs, + * allocating a new digests_t as neeeded. */ +static smartlist_t * +detached_get_signatures(ns_detached_signatures_t *sigs, + const char *flavor_name) +{ + smartlist_t *sl = strmap_get(sigs->signatures, flavor_name); + if (!sl) { + sl = smartlist_create(); + strmap_set(sigs->signatures, flavor_name, sl); + } + return sl; +} + /** Parse a detached v3 networkstatus signature document between s and * eos and return the result. Return -1 on failure. */ ns_detached_signatures_t * networkstatus_parse_detached_signatures(const char *s, const char *eos) { - /* XXXX there is too much duplicate code here. */ + /* XXXX there is too much duplicate shared between this function and + * networkstatus_parse_vote_from_string(). */ directory_token_t *tok; + memarea_t *area = NULL; + digests_t *digests; smartlist_t *tokens = smartlist_create(); ns_detached_signatures_t *sigs = tor_malloc_zero(sizeof(ns_detached_signatures_t)); + sigs->digests = strmap_new(); + sigs->signatures = strmap_new(); if (!eos) eos = s + strlen(s); - if (tokenize_string(s, eos, tokens, + area = memarea_new(); + if (tokenize_string(area,s, eos, tokens, networkstatus_detached_signature_token_table, 0)) { log_warn(LD_DIR, "Error tokenizing detached networkstatus signatures"); goto err; } - tok = find_first_by_keyword(tokens, K_CONSENSUS_DIGEST); - if (strlen(tok->args[0]) != HEX_DIGEST_LEN) { - log_warn(LD_DIR, "Wrong length on consensus-digest in detached " - "networkstatus signatures"); - goto err; - } - if (base16_decode(sigs->networkstatus_digest, DIGEST_LEN, - tok->args[0], strlen(tok->args[0])) < 0) { - log_warn(LD_DIR, "Bad encoding on on consensus-digest in detached " - "networkstatus signatures"); - goto err; - } + /* Grab all the digest-like tokens. */ + SMARTLIST_FOREACH_BEGIN(tokens, directory_token_t *, _tok) { + const char *algname; + digest_algorithm_t alg; + const char *flavor; + const char *hexdigest; + size_t expected_length; + + tok = _tok; + + if (tok->tp == K_CONSENSUS_DIGEST) { + algname = "sha1"; + alg = DIGEST_SHA1; + flavor = "ns"; + hexdigest = tok->args[0]; + } else if (tok->tp == K_ADDITIONAL_DIGEST) { + int a = crypto_digest_algorithm_parse_name(tok->args[1]); + if (a<0) { + log_warn(LD_DIR, "Unrecognized algorithm name %s", tok->args[0]); + continue; + } + alg = (digest_algorithm_t) a; + flavor = tok->args[0]; + algname = tok->args[1]; + hexdigest = tok->args[2]; + } else { + continue; + } - tok = find_first_by_keyword(tokens, K_VALID_AFTER); + expected_length = + (alg == DIGEST_SHA1) ? HEX_DIGEST_LEN : HEX_DIGEST256_LEN; + + if (strlen(hexdigest) != expected_length) { + log_warn(LD_DIR, "Wrong length on consensus-digest in detached " + "networkstatus signatures"); + goto err; + } + digests = detached_get_digests(sigs, flavor); + tor_assert(digests); + if (!tor_mem_is_zero(digests->d[alg], DIGEST256_LEN)) { + log_warn(LD_DIR, "Multiple digests for %s with %s on detached " + "signatures document", flavor, algname); + continue; + } + if (base16_decode(digests->d[alg], DIGEST256_LEN, + hexdigest, strlen(hexdigest)) < 0) { + log_warn(LD_DIR, "Bad encoding on consensus-digest in detached " + "networkstatus signatures"); + goto err; + } + } SMARTLIST_FOREACH_END(_tok); + + tok = find_by_keyword(tokens, K_VALID_AFTER); if (parse_iso_time(tok->args[0], &sigs->valid_after)) { log_warn(LD_DIR, "Bad valid-after in detached networkstatus signatures"); goto err; } - tok = find_first_by_keyword(tokens, K_FRESH_UNTIL); + tok = find_by_keyword(tokens, K_FRESH_UNTIL); if (parse_iso_time(tok->args[0], &sigs->fresh_until)) { log_warn(LD_DIR, "Bad fresh-until in detached networkstatus signatures"); goto err; } - tok = find_first_by_keyword(tokens, K_VALID_UNTIL); + tok = find_by_keyword(tokens, K_VALID_UNTIL); if (parse_iso_time(tok->args[0], &sigs->valid_until)) { log_warn(LD_DIR, "Bad valid-until in detached networkstatus signatures"); goto err; } - sigs->signatures = smartlist_create(); - SMARTLIST_FOREACH(tokens, directory_token_t *, _tok, - { - char id_digest[DIGEST_LEN]; - char sk_digest[DIGEST_LEN]; - networkstatus_voter_info_t *voter; + SMARTLIST_FOREACH_BEGIN(tokens, directory_token_t *, _tok) { + const char *id_hexdigest; + const char *sk_hexdigest; + const char *algname; + const char *flavor; + digest_algorithm_t alg; + + char id_digest[DIGEST_LEN]; + char sk_digest[DIGEST_LEN]; + smartlist_t *siglist; + document_signature_t *sig; + int is_duplicate; - tok = _tok; - if (tok->tp != K_DIRECTORY_SIGNATURE) - continue; + tok = _tok; + if (tok->tp == K_DIRECTORY_SIGNATURE) { tor_assert(tok->n_args >= 2); + flavor = "ns"; + algname = "sha1"; + id_hexdigest = tok->args[0]; + sk_hexdigest = tok->args[1]; + } else if (tok->tp == K_ADDITIONAL_SIGNATURE) { + tor_assert(tok->n_args >= 4); + flavor = tok->args[0]; + algname = tok->args[1]; + id_hexdigest = tok->args[2]; + sk_hexdigest = tok->args[3]; + } else { + continue; + } - if (!tok->object_type || - strcmp(tok->object_type, "SIGNATURE") || - tok->object_size < 128 || tok->object_size > 512) { - log_warn(LD_DIR, "Bad object type or length on directory-signature"); - goto err; + { + int a = crypto_digest_algorithm_parse_name(algname); + if (a<0) { + log_warn(LD_DIR, "Unrecognized algorithm name %s", algname); + continue; } + alg = (digest_algorithm_t) a; + } - if (strlen(tok->args[0]) != HEX_DIGEST_LEN || - base16_decode(id_digest, sizeof(id_digest), - tok->args[0], HEX_DIGEST_LEN) < 0) { - log_warn(LD_DIR, "Error decoding declared identity %s in " - "network-status vote.", escaped(tok->args[0])); - goto err; - } - if (strlen(tok->args[1]) != HEX_DIGEST_LEN || - base16_decode(sk_digest, sizeof(sk_digest), - tok->args[1], HEX_DIGEST_LEN) < 0) { - log_warn(LD_DIR, "Error decoding declared digest %s in " - "network-status vote.", escaped(tok->args[1])); - goto err; - } + if (!tok->object_type || + strcmp(tok->object_type, "SIGNATURE") || + tok->object_size < 128 || tok->object_size > 512) { + log_warn(LD_DIR, "Bad object type or length on directory-signature"); + goto err; + } - voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); - memcpy(voter->identity_digest, id_digest, DIGEST_LEN); - memcpy(voter->signing_key_digest, sk_digest, DIGEST_LEN); - if (tok->object_size >= INT_MAX) - goto err; - voter->signature = tor_memdup(tok->object_body, tok->object_size); - voter->signature_len = (int) tok->object_size; + if (strlen(id_hexdigest) != HEX_DIGEST_LEN || + base16_decode(id_digest, sizeof(id_digest), + id_hexdigest, HEX_DIGEST_LEN) < 0) { + log_warn(LD_DIR, "Error decoding declared identity %s in " + "network-status vote.", escaped(id_hexdigest)); + goto err; + } + if (strlen(sk_hexdigest) != HEX_DIGEST_LEN || + base16_decode(sk_digest, sizeof(sk_digest), + sk_hexdigest, HEX_DIGEST_LEN) < 0) { + log_warn(LD_DIR, "Error decoding declared signing key digest %s in " + "network-status vote.", escaped(sk_hexdigest)); + goto err; + } - smartlist_add(sigs->signatures, voter); + siglist = detached_get_signatures(sigs, flavor); + is_duplicate = 0; + SMARTLIST_FOREACH(siglist, document_signature_t *, s, { + if (s->alg == alg && + !memcmp(id_digest, s->identity_digest, DIGEST_LEN) && + !memcmp(sk_digest, s->signing_key_digest, DIGEST_LEN)) { + is_duplicate = 1; + } }); + if (is_duplicate) { + log_warn(LD_DIR, "Two signatures with identical keys and algorithm " + "found."); + continue; + } + + sig = tor_malloc_zero(sizeof(document_signature_t)); + sig->alg = alg; + memcpy(sig->identity_digest, id_digest, DIGEST_LEN); + memcpy(sig->signing_key_digest, sk_digest, DIGEST_LEN); + if (tok->object_size >= INT_MAX) { + tor_free(sig); + goto err; + } + sig->signature = tor_memdup(tok->object_body, tok->object_size); + sig->signature_len = (int) tok->object_size; + + smartlist_add(siglist, sig); + } SMARTLIST_FOREACH_END(_tok); goto done; err: ns_detached_signatures_free(sigs); sigs = NULL; done: - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); + if (area) { + DUMP_AREA(area, "detached signatures"); + memarea_drop_all(area); + } return sigs; } @@ -2513,6 +3524,7 @@ * accept and the address:mask/port element. */ char line[TOR_ADDR_BUF_LEN*2 + 32]; addr_policy_t *r; + memarea_t *area = NULL; s = eat_whitespace(s); if ((*s == '*' || TOR_ISDIGIT(*s)) && assume_action >= 0) { @@ -2528,23 +3540,28 @@ } eos = cp + strlen(cp); - tok = get_next_token(&cp, eos, routerdesc_token_table); + area = memarea_new(); + tok = get_next_token(area, &cp, eos, routerdesc_token_table); if (tok->tp == _ERR) { log_warn(LD_DIR, "Error reading address policy: %s", tok->error); goto err; } - if (tok->tp != K_ACCEPT && tok->tp != K_REJECT) { + if (tok->tp != K_ACCEPT && tok->tp != K_ACCEPT6 && + tok->tp != K_REJECT && tok->tp != K_REJECT6) { log_warn(LD_DIR, "Expected 'accept' or 'reject'."); goto err; } - /* Now that we've gotten an addr policy, add it to the router. */ r = router_parse_addr_policy(tok); goto done; err: r = NULL; done: - token_free(tok); + token_clear(tok); + if (area) { + DUMP_AREA(area, "policy item"); + memarea_drop_all(area); + } return r; } @@ -2560,6 +3577,17 @@ if (! router->exit_policy) router->exit_policy = smartlist_create(); + if (((tok->tp == K_ACCEPT6 || tok->tp == K_REJECT6) && + tor_addr_family(&newe->addr) == AF_INET) + || + ((tok->tp == K_ACCEPT || tok->tp == K_REJECT) && + tor_addr_family(&newe->addr) == AF_INET6)) { + log_warn(LD_DIR, "Mismatch between field type and address type in exit " + "policy"); + addr_policy_free(newe); + return -1; + } + smartlist_add(router->exit_policy, newe); return 0; @@ -2573,7 +3601,8 @@ addr_policy_t newe; char *arg; - tor_assert(tok->tp == K_REJECT || tok->tp == K_ACCEPT); + tor_assert(tok->tp == K_REJECT || tok->tp == K_REJECT6 || + tok->tp == K_ACCEPT || tok->tp == K_ACCEPT6); if (tok->n_args != 1) return NULL; @@ -2584,18 +3613,18 @@ memset(&newe, 0, sizeof(newe)); - newe.policy_type = (tok->tp == K_REJECT) ? ADDR_POLICY_REJECT - : ADDR_POLICY_ACCEPT; + if (tok->tp == K_REJECT || tok->tp == K_REJECT6) + newe.policy_type = ADDR_POLICY_REJECT; + else + newe.policy_type = ADDR_POLICY_ACCEPT; - if (parse_addr_and_port_range(arg, &newe.addr, &newe.maskbits, - &newe.prt_min, &newe.prt_max)) - goto policy_read_failed; + if (tor_addr_parse_mask_ports(arg, &newe.addr, &newe.maskbits, + &newe.prt_min, &newe.prt_max) < 0) { + log_warn(LD_DIR,"Couldn't parse line %s. Dropping", escaped(arg)); + return NULL; + } return addr_policy_get_canonical_entry(&newe); - -policy_read_failed: - log_warn(LD_DIR,"Couldn't parse line %s. Dropping", escaped(arg)); - return NULL; } /** Parse an exit policy line of the format "accept/reject private:...". @@ -2622,8 +3651,10 @@ return NULL; memset(&result, 0, sizeof(result)); - result.policy_type = (tok->tp == K_REJECT) ? ADDR_POLICY_REJECT - : ADDR_POLICY_ACCEPT; + if (tok->tp == K_REJECT || tok->tp == K_REJECT6) + result.policy_type = ADDR_POLICY_REJECT; + else + result.policy_type = ADDR_POLICY_ACCEPT; result.is_private = 1; result.prt_min = port_min; result.prt_max = port_max; @@ -2649,40 +3680,39 @@ /** Free all resources allocated for tok */ static void -token_free(directory_token_t *tok) +token_clear(directory_token_t *tok) { - int i; - tor_assert(tok); - if (tok->args) { - for (i = 0; i < tok->n_args; ++i) { - tor_free(tok->args[i]); - } - tor_free(tok->args); - } - tor_free(tok->object_type); - tor_free(tok->object_body); - tor_free(tok->error); if (tok->key) crypto_free_pk_env(tok->key); - tor_free(tok); } +#define ALLOC_ZERO(sz) memarea_alloc_zero(area,sz) +#define ALLOC(sz) memarea_alloc(area,sz) +#define STRDUP(str) memarea_strdup(area,str) +#define STRNDUP(str,n) memarea_strndup(area,(str),(n)) + #define RET_ERR(msg) \ STMT_BEGIN \ - if (tok) token_free(tok); \ - tok = tor_malloc_zero(sizeof(directory_token_t)); \ + if (tok) token_clear(tok); \ + tok = ALLOC_ZERO(sizeof(directory_token_t)); \ tok->tp = _ERR; \ - tok->error = tor_strdup(msg); \ + tok->error = STRDUP(msg); \ goto done_tokenizing; \ STMT_END +/** Helper: make sure that the token tok with keyword kwd obeys + * the object syntax of o_syn. Allocate all storage in area. + * Return tok on success, or a new _ERR token if the token didn't + * conform to the syntax we wanted. + **/ static INLINE directory_token_t * -token_check_object(const char *kwd, +token_check_object(memarea_t *area, const char *kwd, directory_token_t *tok, obj_syntax o_syn) { char ebuf[128]; switch (o_syn) { case NO_OBJ: + /* No object is allowed for this token. */ if (tok->object_body) { tor_snprintf(ebuf, sizeof(ebuf), "Unexpected object for %s", kwd); RET_ERR(ebuf); @@ -2693,24 +3723,41 @@ } break; case NEED_OBJ: + /* There must be a (non-key) object. */ if (!tok->object_body) { tor_snprintf(ebuf, sizeof(ebuf), "Missing object for %s", kwd); RET_ERR(ebuf); } break; - case NEED_KEY_1024: + case NEED_KEY_1024: /* There must be a 1024-bit public key. */ + case NEED_SKEY_1024: /* There must be a 1024-bit private key. */ if (tok->key && crypto_pk_keysize(tok->key) != PK_BYTES) { tor_snprintf(ebuf, sizeof(ebuf), "Wrong size on key for %s: %d bits", kwd, (int)crypto_pk_keysize(tok->key)); RET_ERR(ebuf); } /* fall through */ - case NEED_KEY: + case NEED_KEY: /* There must be some kind of key. */ if (!tok->key) { tor_snprintf(ebuf, sizeof(ebuf), "Missing public key for %s", kwd); + RET_ERR(ebuf); + } + if (o_syn != NEED_SKEY_1024) { + if (crypto_pk_key_is_private(tok->key)) { + tor_snprintf(ebuf, sizeof(ebuf), + "Private key given for %s, which wants a public key", kwd); + RET_ERR(ebuf); + } + } else { /* o_syn == NEED_SKEY_1024 */ + if (!crypto_pk_key_is_private(tok->key)) { + tor_snprintf(ebuf, sizeof(ebuf), + "Public key given for %s, which wants a private key", kwd); + RET_ERR(ebuf); + } } break; case OBJ_OK: + /* Anything goes with this token. */ break; } @@ -2718,31 +3765,55 @@ return tok; } +/** Helper: parse space-separated arguments from the string s ending at + * eol, and store them in the args field of tok. Store the + * number of parsed elements into the n_args field of tok. Allocate + * all storage in area. Return the number of arguments parsed, or + * return -1 if there was an insanely high number of arguments. */ +static INLINE int +get_token_arguments(memarea_t *area, directory_token_t *tok, + const char *s, const char *eol) +{ +/** Largest number of arguments we'll accept to any token, ever. */ +#define MAX_ARGS 512 + char *mem = memarea_strndup(area, s, eol-s); + char *cp = mem; + int j = 0; + char *args[MAX_ARGS]; + while (*cp) { + if (j == MAX_ARGS) + return -1; + args[j++] = cp; + cp = (char*)find_whitespace(cp); + if (!cp || !*cp) + break; /* End of the line. */ + *cp++ = '\0'; + cp = (char*)eat_whitespace(cp); + } + tok->n_args = j; + tok->args = memarea_memdup(area, args, j*sizeof(char*)); + return j; +#undef MAX_ARGS +} + /** Helper function: read the next token from *s, advance *s to the end of the * token, and return the parsed token. Parse *s according to the list * of tokens in table. */ static directory_token_t * -get_next_token(const char **s, const char *eos, token_rule_t *table) +get_next_token(memarea_t *area, + const char **s, const char *eos, token_rule_t *table) { const char *next, *eol, *obstart; - int i, j, allocated; size_t obname_len; + int i; directory_token_t *tok; obj_syntax o_syn = NO_OBJ; char ebuf[128]; const char *kwd = ""; -#define RET_ERR(msg) \ - STMT_BEGIN \ - if (tok) token_free(tok); \ - tok = tor_malloc_zero(sizeof(directory_token_t)); \ - tok->tp = _ERR; \ - tok->error = tor_strdup(msg); \ - goto done_tokenizing; \ - STMT_END - - tok = tor_malloc_zero(sizeof(directory_token_t)); + tor_assert(area); + tok = ALLOC_ZERO(sizeof(directory_token_t)); tok->tp = _ERR; /* Set *s to first token, eol to end-of-line, next to after first token */ @@ -2770,29 +3841,20 @@ tok->tp = table[i].v; o_syn = table[i].os; *s = eat_whitespace_eos_no_nl(next, eol); - next = find_whitespace_eos(*s, eol); /* We go ahead whether there are arguments or not, so that tok->args is * always set if we want arguments. */ if (table[i].concat_args) { /* The keyword takes the line as a single argument */ - tok->args = tor_malloc(sizeof(char*)); - tok->args[0] = tor_strndup(*s,eol-*s); /* Grab everything on line */ + tok->args = ALLOC(sizeof(char*)); + tok->args[0] = STRNDUP(*s,eol-*s); /* Grab everything on line */ tok->n_args = 1; } else { /* This keyword takes multiple arguments. */ - j = 0; - allocated = 16; - tok->args = tor_malloc(sizeof(char*)*allocated); - while (*s < eol) { /* While not at eol, store the next token */ - if (j == allocated) { - allocated *= 2; - tok->args = tor_realloc(tok->args,sizeof(char*)*allocated); - } - tok->args[j++] = tor_strndup(*s, next-*s); - *s = eat_whitespace_eos_no_nl(next, eol); /* eat intra-line ws */ - next = find_whitespace_eos(*s, eol); /* find end of token at *s */ + if (get_token_arguments(area, tok, *s, eol)<0) { + tor_snprintf(ebuf, sizeof(ebuf),"Far too many arguments to %s", kwd); + RET_ERR(ebuf); } - tok->n_args = j; + *s = eol; } if (tok->n_args < table[i].min_args) { tor_snprintf(ebuf, sizeof(ebuf), "Too few arguments to %s", kwd); @@ -2811,8 +3873,8 @@ tok->tp = _A_UNKNOWN; else tok->tp = K_OPT; - tok->args = tor_malloc(sizeof(char*)); - tok->args[0] = tor_strndup(*s, eol-*s); + tok->args = ALLOC(sizeof(char*)); + tok->args[0] = STRNDUP(*s, eol-*s); tok->n_args = 1; o_syn = OBJ_OK; } @@ -2825,12 +3887,11 @@ goto check_object; obstart = *s; /* Set obstart to start of object spec */ - tor_assert(eol >= (*s+16)); - if (*s+11 >= eol-5 || memchr(*s+11,'\0',eol-*s-16) || /* no short lines, */ + if (*s+16 >= eol || memchr(*s+11,'\0',eol-*s-16) || /* no short lines, */ strcmp_len(eol-5, "-----", 5)) { /* nuls or invalid endings */ RET_ERR("Malformed object: bad begin line"); } - tok->object_type = tor_strndup(*s+11, eol-*s-16); + tok->object_type = STRNDUP(*s+11, eol-*s-16); obname_len = eol-*s-16; /* store objname length here to avoid a strlen() */ *s = eol+1; /* Set *s to possible start of object data (could be eos) */ @@ -2852,13 +3913,17 @@ ebuf[sizeof(ebuf)-1] = '\0'; RET_ERR(ebuf); } - if (!strcmp(tok->object_type, "RSA PUBLIC KEY")) { /* If it's a key... */ + if (!strcmp(tok->object_type, "RSA PUBLIC KEY")) { /* If it's a public key */ tok->key = crypto_new_pk_env(); if (crypto_pk_read_public_key_from_string(tok->key, obstart, eol-obstart)) RET_ERR("Couldn't parse public key."); + } else if (!strcmp(tok->object_type, "RSA PRIVATE KEY")) { /* private key */ + tok->key = crypto_new_pk_env(); + if (crypto_pk_read_private_key_from_string(tok->key, obstart)) + RET_ERR("Couldn't parse private key."); } else { /* If it's something else, try to base64-decode it */ int r; - tok->object_body = tor_malloc(next-*s); /* really, this is too much RAM. */ + tok->object_body = ALLOC(next-*s); /* really, this is too much RAM. */ r = base64_decode(tok->object_body, next-*s, *s, next-*s); if (r<0) RET_ERR("Malformed object: bad base64-encoded data"); @@ -2867,12 +3932,16 @@ *s = eol; check_object: - tok = token_check_object(kwd, tok, o_syn); + tok = token_check_object(area, kwd, tok, o_syn); done_tokenizing: return tok; #undef RET_ERR +#undef ALLOC +#undef ALLOC_ZERO +#undef STRDUP +#undef STRNDUP } /** Read all tokens from a string between start and end, and add @@ -2881,7 +3950,8 @@ * entire string. */ static int -tokenize_string(const char *start, const char *end, smartlist_t *out, +tokenize_string(memarea_t *area, + const char *start, const char *end, smartlist_t *out, token_rule_t *table, int flags) { const char **s; @@ -2890,6 +3960,7 @@ int i; int first_nonannotation; int prev_len = smartlist_len(out); + tor_assert(area); s = &start; if (!end) @@ -2897,10 +3968,10 @@ for (i = 0; i < _NIL; ++i) counts[i] = 0; while (*s < end && (!tok || tok->tp != _EOF)) { - tok = get_next_token(s, end, table); + tok = get_next_token(area, s, end, table); if (tok->tp == _ERR) { log_warn(LD_DIR, "parse error: %s", tok->error); - token_free(tok); + token_clear(tok); return -1; } ++counts[tok->tp]; @@ -2933,7 +4004,7 @@ } if ((flags & TS_NO_NEW_ANNOTATIONS)) { if (first_nonannotation != prev_len) { - log_warn(LD_DIR, "parse error: Unexpectd annotations."); + log_warn(LD_DIR, "parse error: Unexpected annotations."); return -1; } } @@ -2978,12 +4049,28 @@ * NULL if no such keyword is found. */ static directory_token_t * -find_first_by_keyword(smartlist_t *s, directory_keyword keyword) +find_opt_by_keyword(smartlist_t *s, directory_keyword keyword) { SMARTLIST_FOREACH(s, directory_token_t *, t, if (t->tp == keyword) return t); return NULL; } +/** Find the first token in s whose keyword is keyword; fail + * with an assert if no such keyword is found. + */ +static directory_token_t * +_find_by_keyword(smartlist_t *s, directory_keyword keyword, + const char *keyword_as_string) +{ + directory_token_t *tok = find_opt_by_keyword(s, keyword); + if (PREDICT_UNLIKELY(!tok)) { + log_err(LD_BUG, "Missing %s [%d] in directory object that should have " + "been validated. Internal error.", keyword_as_string, (int)keyword); + tor_assert(tok); + } + return tok; +} + /** Return a newly allocated smartlist of all accept or reject tokens in * s. */ @@ -2992,25 +4079,20 @@ { smartlist_t *out = smartlist_create(); SMARTLIST_FOREACH(s, directory_token_t *, t, - if (t->tp == K_ACCEPT || t->tp == K_REJECT) - smartlist_add(out,t)); + if (t->tp == K_ACCEPT || t->tp == K_ACCEPT6 || + t->tp == K_REJECT || t->tp == K_REJECT6) + smartlist_add(out,t)); return out; } -/** Compute the SHA-1 digest of the substring of s taken from the first - * occurrence of start_str through the first instance of c after the - * first subsequent occurrence of end_str; store the 20-byte result in - * digest; return 0 on success. - * - * If no such substring exists, return -1. - */ static int -router_get_hash_impl(const char *s, char *digest, - const char *start_str, - const char *end_str, char end_c) +router_get_hash_impl_helper(const char *s, size_t s_len, + const char *start_str, + const char *end_str, char end_c, + const char **start_out, const char **end_out) { - char *start, *end; - start = strstr(s, start_str); + 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); return -1; @@ -3021,26 +4103,227 @@ start_str); return -1; } - end = strstr(start+strlen(start_str), end_str); + 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); return -1; } - end = strchr(end+strlen(end_str), end_c); + 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"); return -1; } ++end; - if (crypto_digest(digest, start, end-start)) { - log_warn(LD_BUG,"couldn't compute digest"); + *start_out = start; + *end_out = end; + return 0; +} + +/** Compute the digest of the substring of s taken from the first + * occurrence of start_str through the first instance of c after the + * first subsequent occurrence of end_str; store the 20-byte result in + * digest; return 0 on success. + * + * If no such substring exists, return -1. + */ +static int +router_get_hash_impl(const char *s, size_t s_len, char *digest, + const char *start_str, + const char *end_str, char end_c, + 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, + &start,&end)<0) + return -1; + + if (alg == DIGEST_SHA1) { + if (crypto_digest(digest, start, end-start)) { + log_warn(LD_BUG,"couldn't compute digest"); + return -1; + } + } else { + if (crypto_digest256(digest, start, end-start, alg)) { + log_warn(LD_BUG,"couldn't compute digest"); + return -1; + } + } + + return 0; +} + +/** As router_get_hash_impl, but compute all hashes. */ +static int +router_get_hashes_impl(const char *s, size_t s_len, digests_t *digests, + const char *start_str, + 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, + &start,&end)<0) + return -1; + + if (crypto_digest_all(digests, start, end-start)) { + log_warn(LD_BUG,"couldn't compute digests"); return -1; } return 0; } +/** Assuming that s starts with a microdesc, return the start of the + * *NEXT* one. Return NULL on "not found." */ +static const char * +find_start_of_next_microdesc(const char *s, const char *eos) +{ + int started_with_annotations; + s = eat_whitespace_eos(s, eos); + if (!s) + return NULL; + +#define CHECK_LENGTH() STMT_BEGIN \ + if (s+32 > eos) \ + return NULL; \ + STMT_END + +#define NEXT_LINE() STMT_BEGIN \ + s = memchr(s, '\n', eos-s); \ + if (!s || s+1 >= eos) \ + return NULL; \ + s++; \ + STMT_END + + CHECK_LENGTH(); + + started_with_annotations = (*s == '@'); + + if (started_with_annotations) { + /* Start by advancing to the first non-annotation line. */ + while (*s == '@') + NEXT_LINE(); + } + CHECK_LENGTH(); + + /* Now we should be pointed at an onion-key line. If we are, then skip + * it. */ + if (!strcmpstart(s, "onion-key")) + NEXT_LINE(); + + /* Okay, now we're pointed at the first line of the microdescriptor which is + not an annotation or onion-key. The next line that _is_ an annotation or + onion-key is the start of the next microdescriptor. */ + while (s+32 < eos) { + if (*s == '@' || !strcmpstart(s, "onion-key")) + return s; + NEXT_LINE(); + } + return NULL; + +#undef CHECK_LENGTH +#undef NEXT_LINE +} + +/** Parse as many microdescriptors as are found from the string starting at + * s and ending at eos. If allow_annotations is set, read any + * annotations we recognize and ignore ones we don't. If copy_body is + * true, then strdup the bodies of the microdescriptors. Return all newly + * parsed microdescriptors in a newly allocated smartlist_t. */ +smartlist_t * +microdescs_parse_from_string(const char *s, const char *eos, + int allow_annotations, int copy_body) +{ + smartlist_t *tokens; + smartlist_t *result; + microdesc_t *md = NULL; + memarea_t *area; + const char *start = s; + const char *start_of_next_microdesc; + int flags = allow_annotations ? TS_ANNOTATIONS_OK : 0; + + directory_token_t *tok; + + if (!eos) + eos = s + strlen(s); + + s = eat_whitespace_eos(s, eos); + area = memarea_new(); + result = smartlist_create(); + tokens = smartlist_create(); + + while (s < eos) { + start_of_next_microdesc = find_start_of_next_microdesc(s, eos); + if (!start_of_next_microdesc) + start_of_next_microdesc = eos; + + if (tokenize_string(area, s, start_of_next_microdesc, tokens, + microdesc_token_table, flags)) { + log_warn(LD_DIR, "Unparseable microdescriptor"); + goto next; + } + + md = tor_malloc_zero(sizeof(microdesc_t)); + { + const char *cp = tor_memstr(s, start_of_next_microdesc-s, + "onion-key"); + tor_assert(cp); + + md->bodylen = start_of_next_microdesc - cp; + if (copy_body) + md->body = tor_strndup(cp, md->bodylen); + else + md->body = (char*)cp; + md->off = cp - start; + } + + if ((tok = find_opt_by_keyword(tokens, A_LAST_LISTED))) { + if (parse_iso_time(tok->args[0], &md->last_listed)) { + log_warn(LD_DIR, "Bad last-listed time in microdescriptor"); + goto next; + } + } + + tok = find_by_keyword(tokens, K_ONION_KEY); + md->onion_pkey = tok->key; + tok->key = NULL; + + if ((tok = find_opt_by_keyword(tokens, K_FAMILY))) { + int i; + md->family = smartlist_create(); + for (i=0;in_args;++i) { + if (!is_legal_nickname_or_hexdigest(tok->args[i])) { + log_warn(LD_DIR, "Illegal nickname %s in family line", + escaped(tok->args[i])); + goto next; + } + smartlist_add(md->family, tor_strdup(tok->args[i])); + } + } + + if ((tok = find_opt_by_keyword(tokens, K_P))) { + md->exitsummary = tor_strdup(tok->args[0]); + } + + crypto_digest256(md->digest, md->body, md->bodylen, DIGEST_SHA256); + + smartlist_add(result, md); + + md = NULL; + next: + microdesc_free(md); + + memarea_clear(area); + smartlist_clear(tokens); + s = start_of_next_microdesc; + } + + memarea_drop_all(area); + smartlist_free(tokens); + + return result; +} + /** Parse the Tor version of the platform string platform, * and compare it to the version in cutoff. Return 1 if * the router is at least as new as the cutoff, else return 0. @@ -3065,7 +4348,7 @@ if (!*start) return 0; s = (char *)find_whitespace(start); /* also finds '\0', which is fine */ s2 = (char*)eat_whitespace(s); - if (!strcmpstart(s2, "(r")) + if (!strcmpstart(s2, "(r") || !strcmpstart(s2, "(git-")) s = (char*)find_whitespace(s2); if ((size_t)(s-start+1) >= sizeof(tmp)) /* too big, no */ @@ -3161,6 +4444,23 @@ if (!strcmpstart(cp, "(r")) { cp += 2; out->svn_revision = (int) strtol(cp,&eos,10); + } else if (!strcmpstart(cp, "(git-")) { + char *close_paren = strchr(cp, ')'); + int hexlen; + char digest[DIGEST_LEN]; + if (! close_paren) + return -1; + cp += 5; + if (close_paren-cp > HEX_DIGEST_LEN) + return -1; + hexlen = (int)(close_paren-cp); + memset(digest, 0, sizeof(digest)); + if ( hexlen == 0 || (hexlen % 2) == 1) + return -1; + if (base16_decode(digest, hexlen/2, cp, hexlen)) + return -1; + memcpy(out->git_tag, digest, hexlen/2); + out->git_tag_len = hexlen/2; } return 0; @@ -3186,8 +4486,14 @@ return i; else if ((i = strcmp(a->status_tag, b->status_tag))) return i; + else if ((i = a->svn_revision - b->svn_revision)) + return i; + else if ((i = a->git_tag_len - b->git_tag_len)) + return i; + else if (a->git_tag_len) + return memcmp(a->git_tag, b->git_tag, a->git_tag_len); else - return a->svn_revision - b->svn_revision; + return 0; } /** Return true iff versions a and b belong to the same series. @@ -3203,7 +4509,7 @@ } /** Helper: Given pointers to two strings describing tor versions, return -1 - * if _a precedes _b, 1 if _b preceeds _a, and 0 if they are equivalent. + * if _a precedes _b, 1 if _b precedes _a, and 0 if they are equivalent. * Used to sort a list of versions. */ static int _compare_tor_version_str_ptr(const void **_a, const void **_b) @@ -3265,6 +4571,7 @@ smartlist_t *versions; char public_key_hash[DIGEST_LEN]; char test_desc_id[DIGEST_LEN]; + memarea_t *area = NULL; tor_assert(desc); /* Check if desc starts correctly. */ if (strncmp(desc, "rendezvous-service-descriptor ", @@ -3273,9 +4580,9 @@ goto err; } /* Compute descriptor hash for later validation. */ - if (router_get_hash_impl(desc, desc_hash, + if (router_get_hash_impl(desc, strlen(desc), desc_hash, "rendezvous-service-descriptor ", - "\nsignature", '\n') < 0) { + "\nsignature", '\n', DIGEST_SHA1) < 0) { log_warn(LD_REND, "Couldn't compute descriptor hash."); goto err; } @@ -3285,8 +4592,16 @@ eos = desc + strlen(desc); else eos = eos + 1; + /* Check length. */ + if (strlen(desc) > REND_DESC_MAX_SIZE) { + log_warn(LD_REND, "Descriptor length is %i which exceeds " + "maximum rendezvous descriptor size of %i kilobytes.", + (int)strlen(desc), REND_DESC_MAX_SIZE); + goto err; + } /* Tokenize descriptor. */ - if (tokenize_string(desc, eos, tokens, desc_token_table, 0)) { + area = memarea_new(); + if (tokenize_string(area, desc, eos, tokens, desc_token_table, 0)) { log_warn(LD_REND, "Error tokenizing descriptor."); goto err; } @@ -3300,8 +4615,7 @@ goto err; } /* Parse base32-encoded descriptor ID. */ - tok = find_first_by_keyword(tokens, R_RENDEZVOUS_SERVICE_DESCRIPTOR); - tor_assert(tok); + tok = find_by_keyword(tokens, R_RENDEZVOUS_SERVICE_DESCRIPTOR); tor_assert(tok == smartlist_get(tokens, 0)); tor_assert(tok->n_args == 1); if (strlen(tok->args[0]) != REND_DESC_ID_V2_LEN_BASE32 || @@ -3316,8 +4630,7 @@ goto err; } /* Parse descriptor version. */ - tok = find_first_by_keyword(tokens, R_VERSION); - tor_assert(tok); + tok = find_by_keyword(tokens, R_VERSION); tor_assert(tok->n_args == 1); result->version = (int) tor_parse_long(tok->args[0], 10, 0, INT_MAX, &num_ok, NULL); @@ -3331,13 +4644,11 @@ goto err; } /* Parse public key. */ - tok = find_first_by_keyword(tokens, R_PERMANENT_KEY); - tor_assert(tok); + tok = find_by_keyword(tokens, R_PERMANENT_KEY); result->pk = tok->key; tok->key = NULL; /* Prevent free */ /* Parse secret ID part. */ - tok = find_first_by_keyword(tokens, R_SECRET_ID_PART); - tor_assert(tok); + tok = find_by_keyword(tokens, R_SECRET_ID_PART); tor_assert(tok->n_args == 1); if (strlen(tok->args[0]) != REND_SECRET_ID_PART_LEN_BASE32 || strspn(tok->args[0], BASE32_CHARS) != REND_SECRET_ID_PART_LEN_BASE32) { @@ -3351,16 +4662,14 @@ } /* Parse publication time -- up-to-date check is done when storing the * descriptor. */ - tok = find_first_by_keyword(tokens, R_PUBLICATION_TIME); - tor_assert(tok); + tok = find_by_keyword(tokens, R_PUBLICATION_TIME); tor_assert(tok->n_args == 1); if (parse_iso_time(tok->args[0], &result->timestamp) < 0) { log_warn(LD_REND, "Invalid publication time: '%s'", tok->args[0]); goto err; } /* Parse protocol versions. */ - tok = find_first_by_keyword(tokens, R_PROTOCOL_VERSIONS); - tor_assert(tok); + tok = find_by_keyword(tokens, R_PROTOCOL_VERSIONS); tor_assert(tok->n_args == 1); versions = smartlist_create(); smartlist_split_string(versions, tok->args[0], ",", @@ -3375,25 +4684,24 @@ SMARTLIST_FOREACH(versions, char *, cp, tor_free(cp)); smartlist_free(versions); /* Parse encrypted introduction points. Don't verify. */ - tok = find_first_by_keyword(tokens, R_INTRODUCTION_POINTS); + tok = find_opt_by_keyword(tokens, R_INTRODUCTION_POINTS); if (tok) { if (strcmp(tok->object_type, "MESSAGE")) { log_warn(LD_DIR, "Bad object type: introduction points should be of " "type MESSAGE"); goto err; } - *intro_points_encrypted_out = tok->object_body; + *intro_points_encrypted_out = tor_memdup(tok->object_body, + tok->object_size); *intro_points_encrypted_size_out = tok->object_size; - tok->object_body = NULL; /* Prevent free. */ } else { *intro_points_encrypted_out = NULL; *intro_points_encrypted_size_out = 0; } /* Parse and verify signature. */ - tok = find_first_by_keyword(tokens, R_SIGNATURE); - tor_assert(tok); + tok = find_by_keyword(tokens, R_SIGNATURE); note_crypto_pk_op(VERIFY_RTR); - if (check_signature_token(desc_hash, tok, result->pk, 0, + if (check_signature_token(desc_hash, DIGEST_LEN, tok, result->pk, 0, "v2 rendezvous service descriptor") < 0) goto err; /* Verify that descriptor ID belongs to public key and secret ID part. */ @@ -3407,86 +4715,178 @@ } goto done; err: - if (result) - rend_service_descriptor_free(result); + rend_service_descriptor_free(result); result = NULL; done: if (tokens) { - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); } + if (area) + memarea_drop_all(area); *parsed_out = result; if (result) return 0; return -1; } -/** Decrypt and decode the introduction points in - * intro_points_encrypted of length - * intro_points_encrypted_size using descriptor_cookie - * (which may also be NULL if no decryption, but only parsing is - * required), parse the introduction points, and write the result to - * parsed; return the number of successfully parsed introduction - * points or -1 in case of a failure. - */ +/** Decrypt the encrypted introduction points in ipos_encrypted of + * length ipos_encrypted_size using descriptor_cookie and + * write the result to a newly allocated string that is pointed to by + * ipos_decrypted and its length to ipos_decrypted_size. + * Return 0 if decryption was successful and -1 otherwise. */ int -rend_decrypt_introduction_points(rend_service_descriptor_t *parsed, +rend_decrypt_introduction_points(char **ipos_decrypted, + size_t *ipos_decrypted_size, const char *descriptor_cookie, - const char *intro_points_encrypted, - size_t intro_points_encrypted_size) + const char *ipos_encrypted, + size_t ipos_encrypted_size) { - char *ipos_decrypted = NULL; - const char **current_ipo; + tor_assert(ipos_encrypted); + tor_assert(descriptor_cookie); + if (ipos_encrypted_size < 2) { + log_warn(LD_REND, "Size of encrypted introduction points is too " + "small."); + return -1; + } + if (ipos_encrypted[0] == (int)REND_BASIC_AUTH) { + char iv[CIPHER_IV_LEN], client_id[REND_BASIC_AUTH_CLIENT_ID_LEN], + session_key[CIPHER_KEY_LEN], *dec; + int declen, client_blocks; + size_t pos = 0, len, client_entries_len; + crypto_digest_env_t *digest; + crypto_cipher_env_t *cipher; + client_blocks = (int) ipos_encrypted[1]; + client_entries_len = client_blocks * REND_BASIC_AUTH_CLIENT_MULTIPLE * + REND_BASIC_AUTH_CLIENT_ENTRY_LEN; + if (ipos_encrypted_size < 2 + client_entries_len + CIPHER_IV_LEN + 1) { + log_warn(LD_REND, "Size of encrypted introduction points is too " + "small."); + return -1; + } + memcpy(iv, ipos_encrypted + 2 + client_entries_len, CIPHER_IV_LEN); + digest = crypto_new_digest_env(); + crypto_digest_add_bytes(digest, descriptor_cookie, REND_DESC_COOKIE_LEN); + crypto_digest_add_bytes(digest, iv, CIPHER_IV_LEN); + crypto_digest_get_digest(digest, client_id, + REND_BASIC_AUTH_CLIENT_ID_LEN); + crypto_free_digest_env(digest); + for (pos = 2; pos < 2 + client_entries_len; + pos += REND_BASIC_AUTH_CLIENT_ENTRY_LEN) { + if (!memcmp(ipos_encrypted + pos, client_id, + REND_BASIC_AUTH_CLIENT_ID_LEN)) { + /* Attempt to decrypt introduction points. */ + cipher = crypto_create_init_cipher(descriptor_cookie, 0); + if (crypto_cipher_decrypt(cipher, session_key, ipos_encrypted + + pos + REND_BASIC_AUTH_CLIENT_ID_LEN, + CIPHER_KEY_LEN) < 0) { + log_warn(LD_REND, "Could not decrypt session key for client."); + crypto_free_cipher_env(cipher); + return -1; + } + crypto_free_cipher_env(cipher); + cipher = crypto_create_init_cipher(session_key, 0); + len = ipos_encrypted_size - 2 - client_entries_len - CIPHER_IV_LEN; + dec = tor_malloc(len); + declen = crypto_cipher_decrypt_with_iv(cipher, dec, len, + ipos_encrypted + 2 + client_entries_len, + ipos_encrypted_size - 2 - client_entries_len); + crypto_free_cipher_env(cipher); + if (declen < 0) { + log_warn(LD_REND, "Could not decrypt introduction point string."); + tor_free(dec); + return -1; + } + if (memcmpstart(dec, declen, "introduction-point ")) { + log_warn(LD_REND, "Decrypted introduction points don't " + "look like we could parse them."); + tor_free(dec); + continue; + } + *ipos_decrypted = dec; + *ipos_decrypted_size = declen; + return 0; + } + } + log_warn(LD_REND, "Could not decrypt introduction points. Please " + "check your authorization for this service!"); + return -1; + } else if (ipos_encrypted[0] == (int)REND_STEALTH_AUTH) { + crypto_cipher_env_t *cipher; + char *dec; + int declen; + dec = tor_malloc_zero(ipos_encrypted_size - CIPHER_IV_LEN - 1); + cipher = crypto_create_init_cipher(descriptor_cookie, 0); + declen = crypto_cipher_decrypt_with_iv(cipher, dec, + ipos_encrypted_size - + CIPHER_IV_LEN - 1, + ipos_encrypted + 1, + ipos_encrypted_size - 1); + crypto_free_cipher_env(cipher); + if (declen < 0) { + log_warn(LD_REND, "Decrypting introduction points failed!"); + tor_free(dec); + return -1; + } + *ipos_decrypted = dec; + *ipos_decrypted_size = declen; + return 0; + } else { + log_warn(LD_REND, "Unknown authorization type number: %d", + ipos_encrypted[0]); + return -1; + } +} + +/** Parse the encoded introduction points in intro_points_encoded of + * length intro_points_encoded_size and write the result to the + * descriptor in parsed; return the number of successfully parsed + * introduction points or -1 in case of a failure. */ +int +rend_parse_introduction_points(rend_service_descriptor_t *parsed, + const char *intro_points_encoded, + size_t intro_points_encoded_size) +{ + const char *current_ipo, *end_of_intro_points; smartlist_t *tokens; directory_token_t *tok; rend_intro_point_t *intro; extend_info_t *info; - struct in_addr ip; int result, num_ok=1; + memarea_t *area = NULL; tor_assert(parsed); /** Function may only be invoked once. */ tor_assert(!parsed->intro_nodes); - tor_assert(intro_points_encrypted); - tor_assert(intro_points_encrypted_size > 0); - /* Decrypt introduction points, if required. */ - if (descriptor_cookie) { - crypto_cipher_env_t *cipher; - int unenclen; - ipos_decrypted = tor_malloc_zero(intro_points_encrypted_size - 16); - cipher = crypto_create_init_cipher(descriptor_cookie, 0); - unenclen = crypto_cipher_decrypt_with_iv(cipher, ipos_decrypted, - intro_points_encrypted_size - 16, - intro_points_encrypted, - intro_points_encrypted_size); - crypto_free_cipher_env(cipher); - if (unenclen < 0) { - tor_free(ipos_decrypted); - return -1; - } - intro_points_encrypted = ipos_decrypted; - intro_points_encrypted_size = unenclen; - } + tor_assert(intro_points_encoded); + tor_assert(intro_points_encoded_size > 0); /* Consider one intro point after the other. */ - current_ipo = &intro_points_encrypted; + current_ipo = intro_points_encoded; + end_of_intro_points = intro_points_encoded + intro_points_encoded_size; tokens = smartlist_create(); parsed->intro_nodes = smartlist_create(); - while (!strcmpstart(*current_ipo, "introduction-point ")) { + area = memarea_new(); + + while (!memcmpstart(current_ipo, end_of_intro_points-current_ipo, + "introduction-point ")) { /* Determine end of string. */ - const char *eos = strstr(*current_ipo, "\nintroduction-point "); + const char *eos = tor_memstr(current_ipo, end_of_intro_points-current_ipo, + "\nintroduction-point "); if (!eos) - eos = *current_ipo+strlen(*current_ipo); + eos = end_of_intro_points; else eos = eos+1; + tor_assert(eos <= intro_points_encoded+intro_points_encoded_size); /* Free tokens and clear token list. */ - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_clear(tokens); + memarea_clear(area); /* Tokenize string. */ - if (tokenize_string(*current_ipo, eos, tokens, ipo_token_table, 0)) { - log_warn(LD_REND, "Error tokenizing introduction point."); + if (tokenize_string(area, current_ipo, eos, tokens, ipo_token_table, 0)) { + log_warn(LD_REND, "Error tokenizing introduction point"); goto err; } /* Advance to next introduction point, if available. */ - *current_ipo = eos; + current_ipo = eos; /* Check minimum allowed length of introduction point. */ if (smartlist_len(tokens) < 5) { log_warn(LD_REND, "Impossibly short introduction point."); @@ -3496,8 +4896,7 @@ intro = tor_malloc_zero(sizeof(rend_intro_point_t)); info = intro->extend_info = tor_malloc_zero(sizeof(extend_info_t)); /* Parse identifier. */ - tok = find_first_by_keyword(tokens, R_IPO_IDENTIFIER); - tor_assert(tok); + tok = find_by_keyword(tokens, R_IPO_IDENTIFIER); if (base32_decode(info->identity_digest, DIGEST_LEN, tok->args[0], REND_INTRO_POINT_ID_LEN_BASE32) < 0) { log_warn(LD_REND, "Identity digest contains illegal characters: %s", @@ -3510,15 +4909,20 @@ base16_encode(info->nickname + 1, sizeof(info->nickname) - 1, info->identity_digest, DIGEST_LEN); /* Parse IP address. */ - tok = find_first_by_keyword(tokens, R_IPO_IP_ADDRESS); - if (tor_inet_aton(tok->args[0], &ip) == 0) { - log_warn(LD_REND, "Could not parse IP address."); + tok = find_by_keyword(tokens, R_IPO_IP_ADDRESS); + if (tor_addr_from_str(&info->addr, tok->args[0])<0) { + log_warn(LD_REND, "Could not parse introduction point address."); + rend_intro_point_free(intro); + goto err; + } + if (tor_addr_family(&info->addr) != AF_INET) { + log_warn(LD_REND, "Introduction point address was not ipv4."); rend_intro_point_free(intro); goto err; } - info->addr = ntohl(ip.s_addr); + /* Parse onion port. */ - tok = find_first_by_keyword(tokens, R_IPO_ONION_PORT); + tok = find_by_keyword(tokens, R_IPO_ONION_PORT); info->port = (uint16_t) tor_parse_long(tok->args[0],10,1,65535, &num_ok,NULL); if (!info->port || !num_ok) { @@ -3528,11 +4932,11 @@ goto err; } /* Parse onion key. */ - tok = find_first_by_keyword(tokens, R_IPO_ONION_KEY); + tok = find_by_keyword(tokens, R_IPO_ONION_KEY); info->onion_key = tok->key; tok->key = NULL; /* Prevent free */ /* Parse service key. */ - tok = find_first_by_keyword(tokens, R_IPO_SERVICE_KEY); + tok = find_by_keyword(tokens, R_IPO_SERVICE_KEY); intro->intro_key = tok->key; tok->key = NULL; /* Prevent free */ /* Add extend info to list of introduction points. */ @@ -3546,9 +4950,121 @@ done: /* Free tokens and clear token list. */ - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_free(t)); + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); + if (area) + memarea_drop_all(area); + + return result; +} + +/** Parse the content of a client_key file in ckstr and add + * rend_authorized_client_t's for each parsed client to + * parsed_clients. Return the number of parsed clients as result + * or -1 for failure. */ +int +rend_parse_client_keys(strmap_t *parsed_clients, const char *ckstr) +{ + int result = -1; + smartlist_t *tokens; + directory_token_t *tok; + const char *current_entry = NULL; + memarea_t *area = NULL; + if (!ckstr || strlen(ckstr) == 0) + return -1; + tokens = smartlist_create(); + /* Begin parsing with first entry, skipping comments or whitespace at the + * beginning. */ + area = memarea_new(); + current_entry = eat_whitespace(ckstr); + while (!strcmpstart(current_entry, "client-name ")) { + rend_authorized_client_t *parsed_entry; + size_t len; + char descriptor_cookie_base64[REND_DESC_COOKIE_LEN_BASE64+2+1]; + char descriptor_cookie_tmp[REND_DESC_COOKIE_LEN+2]; + /* Determine end of string. */ + const char *eos = strstr(current_entry, "\nclient-name "); + if (!eos) + eos = current_entry + strlen(current_entry); + else + eos = eos + 1; + /* Free tokens and clear token list. */ + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); + smartlist_clear(tokens); + memarea_clear(area); + /* Tokenize string. */ + if (tokenize_string(area, current_entry, eos, tokens, + client_keys_token_table, 0)) { + log_warn(LD_REND, "Error tokenizing client keys file."); + goto err; + } + /* Advance to next entry, if available. */ + current_entry = eos; + /* Check minimum allowed length of token list. */ + if (smartlist_len(tokens) < 2) { + log_warn(LD_REND, "Impossibly short client key entry."); + goto err; + } + /* Parse client name. */ + tok = find_by_keyword(tokens, C_CLIENT_NAME); + tor_assert(tok == smartlist_get(tokens, 0)); + tor_assert(tok->n_args == 1); + len = strlen(tok->args[0]); + if (len < 1 || len > 19 || + strspn(tok->args[0], REND_LEGAL_CLIENTNAME_CHARACTERS) != len) { + log_warn(LD_CONFIG, "Illegal client name: %s. (Length must be " + "between 1 and 19, and valid characters are " + "[A-Za-z0-9+-_].)", tok->args[0]); + goto err; + } + /* Check if client name is duplicate. */ + if (strmap_get(parsed_clients, tok->args[0])) { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains a " + "duplicate client name: '%s'. Ignoring.", tok->args[0]); + goto err; + } + parsed_entry = tor_malloc_zero(sizeof(rend_authorized_client_t)); + parsed_entry->client_name = tor_strdup(tok->args[0]); + strmap_set(parsed_clients, parsed_entry->client_name, parsed_entry); + /* Parse client key. */ + tok = find_opt_by_keyword(tokens, C_CLIENT_KEY); + if (tok) { + parsed_entry->client_key = tok->key; + tok->key = NULL; /* Prevent free */ + } + + /* Parse descriptor cookie. */ + tok = find_by_keyword(tokens, C_DESCRIPTOR_COOKIE); + tor_assert(tok->n_args == 1); + if (strlen(tok->args[0]) != REND_DESC_COOKIE_LEN_BASE64 + 2) { + log_warn(LD_REND, "Descriptor cookie has illegal length: %s", + escaped(tok->args[0])); + goto err; + } + /* The size of descriptor_cookie_tmp needs to be REND_DESC_COOKIE_LEN+2, + * because a base64 encoding of length 24 does not fit into 16 bytes in all + * cases. */ + if ((base64_decode(descriptor_cookie_tmp, REND_DESC_COOKIE_LEN+2, + tok->args[0], REND_DESC_COOKIE_LEN_BASE64+2+1) + != REND_DESC_COOKIE_LEN)) { + log_warn(LD_REND, "Descriptor cookie contains illegal characters: " + "%s", descriptor_cookie_base64); + goto err; + } + memcpy(parsed_entry->descriptor_cookie, descriptor_cookie_tmp, + REND_DESC_COOKIE_LEN); + } + result = strmap_size(parsed_clients); + goto done; + err: + result = -1; + done: + /* Free tokens and clear token list. */ + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); + smartlist_free(tokens); + if (area) + memarea_drop_all(area); return result; } diff -Nru tor-0.2.0.34/src/or/routerparse.h tor-0.2.2.16-alpha/src/or/routerparse.h --- tor-0.2.0.34/src/or/routerparse.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/routerparse.h 2010-08-18 23:04:46.000000000 +0000 @@ -0,0 +1,87 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file routerpase.h + * \brief Header file for routerparse.c. + **/ + +#ifndef _TOR_ROUTERPARSE_H +#define _TOR_ROUTERPARSE_H + +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_runningrouters_hash(const char *s, char *digest); +int router_get_networkstatus_v2_hash(const char *s, char *digest); +int router_get_networkstatus_v3_hash(const char *s, char *digest, + digest_algorithm_t algorithm); +int router_get_networkstatus_v3_hashes(const char *s, digests_t *digests); +int router_get_extrainfo_hash(const char *s, char *digest); +int router_append_dirobj_signature(char *buf, size_t buf_len, + const char *digest, + size_t digest_len, + crypto_pk_env_t *private_key); +int router_parse_list_from_string(const char **s, const char *eos, + smartlist_t *dest, + saved_location_t saved_location, + int is_extrainfo, + int allow_annotations, + const char *prepend_annotations); +int router_parse_runningrouters(const char *str); +int router_parse_directory(const char *str); + +routerinfo_t *router_parse_entry_from_string(const char *s, const char *end, + int cache_copy, + int allow_annotations, + const char *prepend_annotations); +extrainfo_t *extrainfo_parse_entry_from_string(const char *s, const char *end, + int cache_copy, struct digest_ri_map_t *routermap); +addr_policy_t *router_parse_addr_policy_item_from_string(const char *s, + int assume_action); +version_status_t tor_version_is_obsolete(const char *myversion, + const char *versionlist); +int tor_version_parse(const char *s, tor_version_t *out); +int tor_version_as_new_as(const char *platform, const char *cutoff); +int tor_version_compare(tor_version_t *a, tor_version_t *b); +void sort_version_list(smartlist_t *lst, int remove_duplicates); +void assert_addr_policy_ok(smartlist_t *t); +void dump_distinct_digest_count(int severity); + +int compare_routerstatus_entries(const void **_a, const void **_b); +networkstatus_v2_t *networkstatus_v2_parse_from_string(const char *s); +int networkstatus_verify_bw_weights(networkstatus_t *ns); +networkstatus_t *networkstatus_parse_vote_from_string(const char *s, + const char **eos_out, + networkstatus_type_t ns_type); +ns_detached_signatures_t *networkstatus_parse_detached_signatures( + const char *s, const char *eos); + +smartlist_t *microdescs_parse_from_string(const char *s, const char *eos, + int allow_annotations, + int copy_body); + +authority_cert_t *authority_cert_parse_from_string(const char *s, + const char **end_of_string); +int rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, + char *desc_id_out, + char **intro_points_encrypted_out, + size_t *intro_points_encrypted_size_out, + size_t *encoded_size_out, + const char **next_out, const char *desc); +int rend_decrypt_introduction_points(char **ipos_decrypted, + size_t *ipos_decrypted_size, + const char *descriptor_cookie, + const char *ipos_encrypted, + size_t ipos_encrypted_size); +int rend_parse_introduction_points(rend_service_descriptor_t *parsed, + const char *intro_points_encoded, + size_t intro_points_encoded_size); +int rend_parse_client_keys(strmap_t *parsed_clients, const char *str); + +void tor_gettimeofday_cache_clear(void); + +#endif + diff -Nru tor-0.2.0.34/src/or/test.c tor-0.2.2.16-alpha/src/or/test.c --- tor-0.2.0.34/src/or/test.c 2009-01-05 02:06:16.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/test.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,3652 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -/* $Id: test.c 17719 2008-12-22 01:16:14Z kloesing $ */ -const char test_c_id[] = - "$Id: test.c 17719 2008-12-22 01:16:14Z kloesing $"; - -const char tor_svn_revision[] = ""; - -/** - * \file test.c - * \brief Unit tests for many pieces of the lower level Tor modules. - **/ - -#include "orconfig.h" -#include -#ifdef HAVE_FCNTL_H -#include -#endif - -#ifdef MS_WINDOWS -/* For mkdir() */ -#include -#else -#include -#endif - -/* These macros pull in declarations for some functions and structures that - * are typically file-private. */ -#define BUFFERS_PRIVATE -#define CONFIG_PRIVATE -#define CONTROL_PRIVATE -#define CRYPTO_PRIVATE -#define DIRSERV_PRIVATE -#define DIRVOTE_PRIVATE -#define GEOIP_PRIVATE -#define MEMPOOL_PRIVATE -#define ROUTER_PRIVATE - -#include "or.h" -#include "test.h" -#include "torgzip.h" -#include "mempool.h" - -int have_failed = 0; - -static char temp_dir[256]; - -static void -setup_directory(void) -{ - static int is_setup = 0; - int r; - if (is_setup) return; - -#ifdef MS_WINDOWS - // XXXX - tor_snprintf(temp_dir, sizeof(temp_dir), - "c:\\windows\\temp\\tor_test_%d", (int)getpid()); - r = mkdir(temp_dir); -#else - tor_snprintf(temp_dir, sizeof(temp_dir), "/tmp/tor_test_%d", (int) getpid()); - r = mkdir(temp_dir, 0700); -#endif - if (r) { - fprintf(stderr, "Can't create directory %s:", temp_dir); - perror(""); - exit(1); - } - is_setup = 1; -} - -static const char * -get_fname(const char *name) -{ - static char buf[1024]; - setup_directory(); - tor_snprintf(buf,sizeof(buf),"%s/%s",temp_dir,name); - return buf; -} - -static void -remove_directory(void) -{ - smartlist_t *elements = tor_listdir(temp_dir); - if (elements) { - SMARTLIST_FOREACH(elements, const char *, cp, - { - size_t len = strlen(cp)+strlen(temp_dir)+16; - char *tmp = tor_malloc(len); - tor_snprintf(tmp, len, "%s"PATH_SEPARATOR"%s", temp_dir, cp); - unlink(tmp); - tor_free(tmp); - }); - SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); - smartlist_free(elements); - } - rmdir(temp_dir); -} - -static crypto_pk_env_t * -pk_generate(int idx) -{ - static crypto_pk_env_t *pregen[5] = {NULL, NULL, NULL, NULL, NULL}; - tor_assert(idx < (int)(sizeof(pregen)/sizeof(pregen[0]))); - if (! pregen[idx]) { - pregen[idx] = crypto_new_pk_env(); - tor_assert(!crypto_pk_generate_key(pregen[idx])); - } - return crypto_pk_dup_key(pregen[idx]); -} - -static void -test_buffers(void) -{ - char str[256]; - char str2[256]; - - buf_t *buf, *buf2; - const char *cp; - - int j; - size_t r; - - /**** - * buf_new - ****/ - if (!(buf = buf_new())) - test_fail(); - - //test_eq(buf_capacity(buf), 4096); - test_eq(buf_datalen(buf), 0); - - /**** - * General pointer frobbing - */ - for (j=0;j<256;++j) { - str[j] = (char)j; - } - write_to_buf(str, 256, buf); - write_to_buf(str, 256, buf); - test_eq(buf_datalen(buf), 512); - fetch_from_buf(str2, 200, buf); - test_memeq(str, str2, 200); - test_eq(buf_datalen(buf), 312); - memset(str2, 0, sizeof(str2)); - - fetch_from_buf(str2, 256, buf); - test_memeq(str+200, str2, 56); - test_memeq(str, str2+56, 200); - test_eq(buf_datalen(buf), 56); - memset(str2, 0, sizeof(str2)); - /* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add - * another 3584 bytes, we hit the end. */ - for (j=0;j<15;++j) { - write_to_buf(str, 256, buf); - } - assert_buf_ok(buf); - test_eq(buf_datalen(buf), 3896); - fetch_from_buf(str2, 56, buf); - test_eq(buf_datalen(buf), 3840); - test_memeq(str+200, str2, 56); - for (j=0;j<15;++j) { - memset(str2, 0, sizeof(str2)); - fetch_from_buf(str2, 256, buf); - test_memeq(str, str2, 256); - } - test_eq(buf_datalen(buf), 0); - buf_free(buf); - - /* Okay, now make sure growing can work. */ - buf = buf_new_with_capacity(16); - //test_eq(buf_capacity(buf), 16); - write_to_buf(str+1, 255, buf); - //test_eq(buf_capacity(buf), 256); - fetch_from_buf(str2, 254, buf); - test_memeq(str+1, str2, 254); - //test_eq(buf_capacity(buf), 256); - assert_buf_ok(buf); - write_to_buf(str, 32, buf); - //test_eq(buf_capacity(buf), 256); - assert_buf_ok(buf); - write_to_buf(str, 256, buf); - assert_buf_ok(buf); - //test_eq(buf_capacity(buf), 512); - test_eq(buf_datalen(buf), 33+256); - fetch_from_buf(str2, 33, buf); - test_eq(*str2, str[255]); - - test_memeq(str2+1, str, 32); - //test_eq(buf_capacity(buf), 512); - test_eq(buf_datalen(buf), 256); - fetch_from_buf(str2, 256, buf); - test_memeq(str, str2, 256); - - /* now try shrinking: case 1. */ - buf_free(buf); - buf = buf_new_with_capacity(33668); - for (j=0;j<67;++j) { - write_to_buf(str,255, buf); - } - //test_eq(buf_capacity(buf), 33668); - test_eq(buf_datalen(buf), 17085); - for (j=0; j < 40; ++j) { - fetch_from_buf(str2, 255,buf); - test_memeq(str2, str, 255); - } - - /* now try shrinking: case 2. */ - buf_free(buf); - buf = buf_new_with_capacity(33668); - for (j=0;j<67;++j) { - write_to_buf(str,255, buf); - } - for (j=0; j < 20; ++j) { - fetch_from_buf(str2, 255,buf); - test_memeq(str2, str, 255); - } - for (j=0;j<80;++j) { - write_to_buf(str,255, buf); - } - //test_eq(buf_capacity(buf),33668); - for (j=0; j < 120; ++j) { - fetch_from_buf(str2, 255,buf); - test_memeq(str2, str, 255); - } - - /* Move from buf to buf. */ - buf_free(buf); - buf = buf_new_with_capacity(4096); - buf2 = buf_new_with_capacity(4096); - for (j=0;j<100;++j) - write_to_buf(str, 255, buf); - test_eq(buf_datalen(buf), 25500); - for (j=0;j<100;++j) { - r = 10; - move_buf_to_buf(buf2, buf, &r); - test_eq(r, 0); - } - test_eq(buf_datalen(buf), 24500); - test_eq(buf_datalen(buf2), 1000); - for (j=0;j<3;++j) { - fetch_from_buf(str2, 255, buf2); - test_memeq(str2, str, 255); - } - r = 8192; /*big move*/ - move_buf_to_buf(buf2, buf, &r); - test_eq(r, 0); - r = 30000; /* incomplete move */ - move_buf_to_buf(buf2, buf, &r); - test_eq(r, 13692); - for (j=0;j<97;++j) { - fetch_from_buf(str2, 255, buf2); - test_memeq(str2, str, 255); - } - buf_free(buf); - buf_free(buf2); - - buf = buf_new_with_capacity(5); - cp = "Testing. This is a moderately long Testing string."; - for (j = 0; cp[j]; j++) - write_to_buf(cp+j, 1, buf); - test_eq(0, buf_find_string_offset(buf, "Testing", 7)); - test_eq(1, buf_find_string_offset(buf, "esting", 6)); - test_eq(1, buf_find_string_offset(buf, "est", 3)); - test_eq(39, buf_find_string_offset(buf, "ing str", 7)); - test_eq(35, buf_find_string_offset(buf, "Testing str", 11)); - test_eq(32, buf_find_string_offset(buf, "ng ", 3)); - test_eq(43, buf_find_string_offset(buf, "string.", 7)); - test_eq(-1, buf_find_string_offset(buf, "shrdlu", 6)); - test_eq(-1, buf_find_string_offset(buf, "Testing thing", 13)); - test_eq(-1, buf_find_string_offset(buf, "ngx", 3)); - buf_free(buf); - -#if 0 - { - int s; - int eof; - int i; - buf_t *buf2; - /**** - * read_to_buf - ****/ - s = open(get_fname("data"), O_WRONLY|O_CREAT|O_TRUNC, 0600); - write(s, str, 256); - close(s); - - s = open(get_fname("data"), O_RDONLY, 0); - eof = 0; - errno = 0; /* XXXX */ - i = read_to_buf(s, 10, buf, &eof); - printf("%s\n", strerror(errno)); - test_eq(i, 10); - test_eq(eof, 0); - //test_eq(buf_capacity(buf), 4096); - test_eq(buf_datalen(buf), 10); - - test_memeq(str, (char*)_buf_peek_raw_buffer(buf), 10); - - /* Test reading 0 bytes. */ - i = read_to_buf(s, 0, buf, &eof); - //test_eq(buf_capacity(buf), 512*1024); - test_eq(buf_datalen(buf), 10); - test_eq(eof, 0); - test_eq(i, 0); - - /* Now test when buffer is filled exactly. */ - buf2 = buf_new_with_capacity(6); - i = read_to_buf(s, 6, buf2, &eof); - //test_eq(buf_capacity(buf2), 6); - test_eq(buf_datalen(buf2), 6); - test_eq(eof, 0); - test_eq(i, 6); - test_memeq(str+10, (char*)_buf_peek_raw_buffer(buf2), 6); - buf_free(buf2); - - /* Now test when buffer is filled with more data to read. */ - buf2 = buf_new_with_capacity(32); - i = read_to_buf(s, 128, buf2, &eof); - //test_eq(buf_capacity(buf2), 128); - test_eq(buf_datalen(buf2), 32); - test_eq(eof, 0); - test_eq(i, 32); - buf_free(buf2); - - /* Now read to eof. */ - test_assert(buf_capacity(buf) > 256); - i = read_to_buf(s, 1024, buf, &eof); - test_eq(i, (256-32-10-6)); - test_eq(buf_capacity(buf), MAX_BUF_SIZE); - test_eq(buf_datalen(buf), 256-6-32); - test_memeq(str, (char*)_buf_peek_raw_buffer(buf), 10); /* XXX Check rest. */ - test_eq(eof, 0); - - i = read_to_buf(s, 1024, buf, &eof); - test_eq(i, 0); - test_eq(buf_capacity(buf), MAX_BUF_SIZE); - test_eq(buf_datalen(buf), 256-6-32); - test_eq(eof, 1); - } -#endif -} - -static void -test_crypto_dh(void) -{ - crypto_dh_env_t *dh1, *dh2; - char p1[DH_BYTES]; - char p2[DH_BYTES]; - char s1[DH_BYTES]; - char s2[DH_BYTES]; - int s1len, s2len; - - dh1 = crypto_dh_new(); - dh2 = crypto_dh_new(); - test_eq(crypto_dh_get_bytes(dh1), DH_BYTES); - test_eq(crypto_dh_get_bytes(dh2), DH_BYTES); - - memset(p1, 0, DH_BYTES); - memset(p2, 0, DH_BYTES); - test_memeq(p1, p2, DH_BYTES); - test_assert(! crypto_dh_get_public(dh1, p1, DH_BYTES)); - test_memneq(p1, p2, DH_BYTES); - test_assert(! crypto_dh_get_public(dh2, p2, DH_BYTES)); - test_memneq(p1, p2, DH_BYTES); - - memset(s1, 0, DH_BYTES); - memset(s2, 0xFF, DH_BYTES); - s1len = crypto_dh_compute_secret(dh1, p2, DH_BYTES, s1, 50); - s2len = crypto_dh_compute_secret(dh2, p1, DH_BYTES, s2, 50); - test_assert(s1len > 0); - test_eq(s1len, s2len); - test_memeq(s1, s2, s1len); - - crypto_dh_free(dh1); - crypto_dh_free(dh2); -} - -static void -test_crypto(void) -{ - crypto_cipher_env_t *env1, *env2; - crypto_pk_env_t *pk1, *pk2; - char *data1, *data2, *data3, *cp; - int i, j, p, len, idx; - size_t size; - - data1 = tor_malloc(1024); - data2 = tor_malloc(1024); - data3 = tor_malloc(1024); - test_assert(data1 && data2 && data3); - - /* Try out RNG. */ - test_assert(! crypto_seed_rng()); - crypto_rand(data1, 100); - crypto_rand(data2, 100); - test_memneq(data1,data2,100); - - /* Now, test encryption and decryption with stream cipher. */ - data1[0]='\0'; - for (i = 1023; i>0; i -= 35) - strncat(data1, "Now is the time for all good onions", i); - - memset(data2, 0, 1024); - memset(data3, 0, 1024); - env1 = crypto_new_cipher_env(); - test_neq(env1, 0); - env2 = crypto_new_cipher_env(); - test_neq(env2, 0); - j = crypto_cipher_generate_key(env1); - crypto_cipher_set_key(env2, crypto_cipher_get_key(env1)); - crypto_cipher_encrypt_init_cipher(env1); - crypto_cipher_decrypt_init_cipher(env2); - - /* Try encrypting 512 chars. */ - crypto_cipher_encrypt(env1, data2, data1, 512); - crypto_cipher_decrypt(env2, data3, data2, 512); - test_memeq(data1, data3, 512); - test_memneq(data1, data2, 512); - - /* Now encrypt 1 at a time, and get 1 at a time. */ - for (j = 512; j < 560; ++j) { - crypto_cipher_encrypt(env1, data2+j, data1+j, 1); - } - for (j = 512; j < 560; ++j) { - crypto_cipher_decrypt(env2, data3+j, data2+j, 1); - } - test_memeq(data1, data3, 560); - /* Now encrypt 3 at a time, and get 5 at a time. */ - for (j = 560; j < 1024-5; j += 3) { - crypto_cipher_encrypt(env1, data2+j, data1+j, 3); - } - for (j = 560; j < 1024-5; j += 5) { - crypto_cipher_decrypt(env2, data3+j, data2+j, 5); - } - test_memeq(data1, data3, 1024-5); - /* Now make sure that when we encrypt with different chunk sizes, we get - the same results. */ - crypto_free_cipher_env(env2); - - memset(data3, 0, 1024); - env2 = crypto_new_cipher_env(); - test_neq(env2, 0); - crypto_cipher_set_key(env2, crypto_cipher_get_key(env1)); - crypto_cipher_encrypt_init_cipher(env2); - for (j = 0; j < 1024-16; j += 17) { - crypto_cipher_encrypt(env2, data3+j, data1+j, 17); - } - for (j= 0; j < 1024-16; ++j) { - if (data2[j] != data3[j]) { - printf("%d: %d\t%d\n", j, (int) data2[j], (int) data3[j]); - } - } - test_memeq(data2, data3, 1024-16); - crypto_free_cipher_env(env1); - crypto_free_cipher_env(env2); - - /* Test vectors for stream ciphers. */ - /* XXXX Look up some test vectors for the ciphers and make sure we match. */ - - /* Test SHA-1 with a test vector from the specification. */ - i = crypto_digest(data1, "abc", 3); - test_memeq(data1, - "\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E\x25\x71\x78" - "\x50\xC2\x6C\x9C\xD0\xD8\x9D", 20); - - /* Test HMAC-SHA-1 with test cases from RFC2202. */ - { - char key[80]; - char digest[20]; - char data[50]; - - /* Case 1. */ - memset(key, 0x0b, 20); - crypto_hmac_sha1(digest, key, 20, "Hi There", 8); - test_streq(hex_str(digest, 20), - "B617318655057264E28BC0B6FB378C8EF146BE00"); - - /* Case 2. */ - crypto_hmac_sha1(digest, "Jefe", 4, "what do ya want for nothing?", 28); - test_streq(hex_str(digest, 20), - "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79"); - - /* Case 4. */ - base16_decode(key, 25, - "0102030405060708090a0b0c0d0e0f10111213141516171819", 50); - memset(data, 0xcd, 50); - crypto_hmac_sha1(digest, key, 25, data, 50); - test_streq(hex_str(digest, 20), - "4C9007F4026250C6BC8414F9BF50C86C2D7235DA"); - - /* Case . */ - memset(key, 0xaa, 80); - crypto_hmac_sha1(digest, key, 80, - "Test Using Larger Than Block-Size Key - Hash Key First", - 54); - test_streq(hex_str(digest, 20), - "AA4AE5E15272D00E95705637CE8A3B55ED402112"); - - } - - /* Public-key ciphers */ - pk1 = pk_generate(0); - pk2 = crypto_new_pk_env(); - test_assert(pk1 && pk2); - test_assert(! crypto_pk_write_public_key_to_string(pk1, &cp, &size)); - test_assert(! crypto_pk_read_public_key_from_string(pk2, cp, size)); - test_eq(0, crypto_pk_cmp_keys(pk1, pk2)); - tor_free(cp); - - test_eq(128, crypto_pk_keysize(pk1)); - test_eq(128, crypto_pk_keysize(pk2)); - - test_eq(128, crypto_pk_public_encrypt(pk2, data1, "Hello whirled.", 15, - PK_PKCS1_OAEP_PADDING)); - test_eq(128, crypto_pk_public_encrypt(pk1, data2, "Hello whirled.", 15, - PK_PKCS1_OAEP_PADDING)); - /* oaep padding should make encryption not match */ - test_memneq(data1, data2, 128); - test_eq(15, crypto_pk_private_decrypt(pk1, data3, data1, 128, - PK_PKCS1_OAEP_PADDING,1)); - test_streq(data3, "Hello whirled."); - memset(data3, 0, 1024); - test_eq(15, crypto_pk_private_decrypt(pk1, data3, data2, 128, - PK_PKCS1_OAEP_PADDING,1)); - test_streq(data3, "Hello whirled."); - /* Can't decrypt with public key. */ - test_eq(-1, crypto_pk_private_decrypt(pk2, data3, data2, 128, - PK_PKCS1_OAEP_PADDING,1)); - /* Try again with bad padding */ - memcpy(data2+1, "XYZZY", 5); /* This has fails ~ once-in-2^40 */ - test_eq(-1, crypto_pk_private_decrypt(pk1, data3, data2, 128, - PK_PKCS1_OAEP_PADDING,1)); - - /* File operations: save and load private key */ - test_assert(! crypto_pk_write_private_key_to_filename(pk1, - get_fname("pkey1"))); - - test_assert(! crypto_pk_read_private_key_from_filename(pk2, - get_fname("pkey1"))); - test_eq(15, crypto_pk_private_decrypt(pk2, data3, data1, 128, - PK_PKCS1_OAEP_PADDING,1)); - - /* Now try signing. */ - strlcpy(data1, "Ossifrage", 1024); - test_eq(128, crypto_pk_private_sign(pk1, data2, data1, 10)); - test_eq(10, crypto_pk_public_checksig(pk1, data3, data2, 128)); - test_streq(data3, "Ossifrage"); - /* Try signing digests. */ - test_eq(128, crypto_pk_private_sign_digest(pk1, data2, data1, 10)); - test_eq(20, crypto_pk_public_checksig(pk1, data3, data2, 128)); - test_eq(0, crypto_pk_public_checksig_digest(pk1, data1, 10, data2, 128)); - test_eq(-1, crypto_pk_public_checksig_digest(pk1, data1, 11, data2, 128)); - /*XXXX test failed signing*/ - - /* Try encoding */ - crypto_free_pk_env(pk2); - pk2 = NULL; - i = crypto_pk_asn1_encode(pk1, data1, 1024); - test_assert(i>0); - pk2 = crypto_pk_asn1_decode(data1, i); - test_assert(crypto_pk_cmp_keys(pk1,pk2) == 0); - - /* Try with hybrid encryption wrappers. */ - crypto_rand(data1, 1024); - for (i = 0; i < 3; ++i) { - for (j = 85; j < 140; ++j) { - memset(data2,0,1024); - memset(data3,0,1024); - if (i == 0 && j < 129) - continue; - p = (i==0)?PK_NO_PADDING: - (i==1)?PK_PKCS1_PADDING:PK_PKCS1_OAEP_PADDING; - len = crypto_pk_public_hybrid_encrypt(pk1,data2,data1,j,p,0); - test_assert(len>=0); - len = crypto_pk_private_hybrid_decrypt(pk1,data3,data2,len,p,1); - test_eq(len,j); - test_memeq(data1,data3,j); - } - } - crypto_free_pk_env(pk1); - crypto_free_pk_env(pk2); - - /* Base64 tests */ - memset(data1, 6, 1024); - for (idx = 0; idx < 10; ++idx) { - i = base64_encode(data2, 1024, data1, idx); - j = base64_decode(data3, 1024, data2, i); - test_eq(j,idx); - test_memeq(data3, data1, idx); - } - - strlcpy(data1, "Test string that contains 35 chars.", 1024); - strlcat(data1, " 2nd string that contains 35 chars.", 1024); - - i = base64_encode(data2, 1024, data1, 71); - j = base64_decode(data3, 1024, data2, i); - test_eq(j, 71); - test_streq(data3, data1); - test_assert(data2[i] == '\0'); - - crypto_rand(data1, DIGEST_LEN); - memset(data2, 100, 1024); - digest_to_base64(data2, data1); - test_eq(BASE64_DIGEST_LEN, strlen(data2)); - test_eq(100, data2[BASE64_DIGEST_LEN+2]); - memset(data3, 99, 1024); - test_eq(digest_from_base64(data3, data2), 0); - test_memeq(data1, data3, DIGEST_LEN); - test_eq(99, data3[DIGEST_LEN+1]); - - /* Base32 tests */ - strlcpy(data1, "5chrs", 1024); - /* bit pattern is: [35 63 68 72 73] -> - * [00110101 01100011 01101000 01110010 01110011] - * By 5s: [00110 10101 10001 10110 10000 11100 10011 10011] - */ - base32_encode(data2, 9, data1, 5); - test_streq(data2, "gvrwq4tt"); - - strlcpy(data1, "\xFF\xF5\x6D\x44\xAE\x0D\x5C\xC9\x62\xC4", 1024); - base32_encode(data2, 30, data1, 10); - test_streq(data2, "772w2rfobvomsywe"); - - /* Base16 tests */ - strlcpy(data1, "6chrs\xff", 1024); - base16_encode(data2, 13, data1, 6); - test_streq(data2, "3663687273FF"); - - strlcpy(data1, "f0d678affc000100", 1024); - i = base16_decode(data2, 8, data1, 16); - test_eq(i,0); - test_memeq(data2, "\xf0\xd6\x78\xaf\xfc\x00\x01\x00",8); - - /* now try some failing base16 decodes */ - test_eq(-1, base16_decode(data2, 8, data1, 15)); /* odd input len */ - test_eq(-1, base16_decode(data2, 7, data1, 16)); /* dest too short */ - strlcpy(data1, "f0dz!8affc000100", 1024); - test_eq(-1, base16_decode(data2, 8, data1, 16)); - - tor_free(data1); - tor_free(data2); - tor_free(data3); - - /* Add spaces to fingerprint */ - { - data1 = tor_strdup("ABCD1234ABCD56780000ABCD1234ABCD56780000"); - test_eq(strlen(data1), 40); - data2 = tor_malloc(FINGERPRINT_LEN+1); - add_spaces_to_fp(data2, FINGERPRINT_LEN+1, data1); - test_streq(data2, "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000"); - tor_free(data1); - tor_free(data2); - } -} - -static void -test_crypto_s2k(void) -{ - char buf[29]; - char buf2[29]; - char *buf3; - int i; - - memset(buf, 0, sizeof(buf)); - memset(buf2, 0, sizeof(buf2)); - buf3 = tor_malloc(65536); - memset(buf3, 0, 65536); - - secret_to_key(buf+9, 20, "", 0, buf); - crypto_digest(buf2+9, buf3, 1024); - test_memeq(buf, buf2, 29); - - memcpy(buf,"vrbacrda",8); - memcpy(buf2,"vrbacrda",8); - buf[8] = 96; - buf2[8] = 96; - secret_to_key(buf+9, 20, "12345678", 8, buf); - for (i = 0; i < 65536; i += 16) { - memcpy(buf3+i, "vrbacrda12345678", 16); - } - crypto_digest(buf2+9, buf3, 65536); - test_memeq(buf, buf2, 29); - tor_free(buf3); -} - -static int -_compare_strs(const void **a, const void **b) -{ - const char *s1 = *a, *s2 = *b; - return strcmp(s1, s2); -} - -static int -_compare_without_first_ch(const void *a, const void **b) -{ - const char *s1 = a, *s2 = *b; - return strcasecmp(s1+1, s2); -} - -static void -test_util(void) -{ - struct timeval start, end; - struct tm a_time; - char timestr[RFC1123_TIME_LEN+1]; - char buf[1024]; - time_t t_res; - int i; - uint32_t u32; - uint16_t u16; - char *cp, *k, *v; - const char *str; - - start.tv_sec = 5; - start.tv_usec = 5000; - - end.tv_sec = 5; - end.tv_usec = 5000; - - test_eq(0L, tv_udiff(&start, &end)); - - end.tv_usec = 7000; - - test_eq(2000L, tv_udiff(&start, &end)); - - end.tv_sec = 6; - - test_eq(1002000L, tv_udiff(&start, &end)); - - end.tv_usec = 0; - - test_eq(995000L, tv_udiff(&start, &end)); - - end.tv_sec = 4; - - test_eq(-1005000L, tv_udiff(&start, &end)); - - end.tv_usec = 999990; - start.tv_sec = 1; - start.tv_usec = 500; - - /* The test values here are confirmed to be correct on a platform - * with a working timegm. */ - a_time.tm_year = 2003-1900; - a_time.tm_mon = 7; - a_time.tm_mday = 30; - a_time.tm_hour = 6; - a_time.tm_min = 14; - a_time.tm_sec = 55; - test_eq((time_t) 1062224095UL, tor_timegm(&a_time)); - a_time.tm_year = 2004-1900; /* Try a leap year, after feb. */ - test_eq((time_t) 1093846495UL, tor_timegm(&a_time)); - a_time.tm_mon = 1; /* Try a leap year, in feb. */ - a_time.tm_mday = 10; - test_eq((time_t) 1076393695UL, tor_timegm(&a_time)); - - format_rfc1123_time(timestr, 0); - test_streq("Thu, 01 Jan 1970 00:00:00 GMT", timestr); - format_rfc1123_time(timestr, (time_t)1091580502UL); - test_streq("Wed, 04 Aug 2004 00:48:22 GMT", timestr); - - t_res = 0; - i = parse_rfc1123_time(timestr, &t_res); - test_eq(i,0); - test_eq(t_res, (time_t)1091580502UL); - test_eq(-1, parse_rfc1123_time("Wed, zz Aug 2004 99-99x99 GMT", &t_res)); - tor_gettimeofday(&start); - - /* Test tor_strstrip() */ - strlcpy(buf, "Testing 1 2 3", sizeof(buf)); - tor_strstrip(buf, ",!"); - test_streq(buf, "Testing 1 2 3"); - strlcpy(buf, "!Testing 1 2 3?", sizeof(buf)); - tor_strstrip(buf, "!? "); - test_streq(buf, "Testing123"); - - /* Test parse_addr_port */ - cp = NULL; u32 = 3; u16 = 3; - test_assert(!parse_addr_port(LOG_WARN, "1.2.3.4", &cp, &u32, &u16)); - test_streq(cp, "1.2.3.4"); - test_eq(u32, 0x01020304u); - test_eq(u16, 0); - tor_free(cp); - test_assert(!parse_addr_port(LOG_WARN, "4.3.2.1:99", &cp, &u32, &u16)); - test_streq(cp, "4.3.2.1"); - test_eq(u32, 0x04030201u); - test_eq(u16, 99); - tor_free(cp); - test_assert(!parse_addr_port(LOG_WARN, "nonexistent.address:4040", - &cp, NULL, &u16)); - test_streq(cp, "nonexistent.address"); - test_eq(u16, 4040); - tor_free(cp); - test_assert(!parse_addr_port(LOG_WARN, "localhost:9999", &cp, &u32, &u16)); - test_streq(cp, "localhost"); - test_eq(u32, 0x7f000001u); - test_eq(u16, 9999); - tor_free(cp); - u32 = 3; - test_assert(!parse_addr_port(LOG_WARN, "localhost", NULL, &u32, &u16)); - test_eq(cp, NULL); - test_eq(u32, 0x7f000001u); - test_eq(u16, 0); - tor_free(cp); - test_eq(0, addr_mask_get_bits(0x0u)); - test_eq(32, addr_mask_get_bits(0xFFFFFFFFu)); - test_eq(16, addr_mask_get_bits(0xFFFF0000u)); - test_eq(31, addr_mask_get_bits(0xFFFFFFFEu)); - test_eq(1, addr_mask_get_bits(0x80000000u)); - - /* Test tor_parse_long. */ - test_eq(10L, tor_parse_long("10",10,0,100,NULL,NULL)); - test_eq(0L, tor_parse_long("10",10,50,100,NULL,NULL)); - test_eq(-50L, tor_parse_long("-50",10,-100,100,NULL,NULL)); - - /* Test tor_parse_ulong */ - test_eq(10UL, tor_parse_ulong("10",10,0,100,NULL,NULL)); - test_eq(0UL, tor_parse_ulong("10",10,50,100,NULL,NULL)); - - /* Test tor_parse_uint64. */ - test_assert(U64_LITERAL(10) == tor_parse_uint64("10 x",10,0,100, &i, &cp)); - test_assert(i == 1); - test_streq(cp, " x"); - test_assert(U64_LITERAL(12345678901) == - tor_parse_uint64("12345678901",10,0,UINT64_MAX, &i, &cp)); - test_assert(i == 1); - test_streq(cp, ""); - test_assert(U64_LITERAL(0) == - tor_parse_uint64("12345678901",10,500,INT32_MAX, &i, &cp)); - test_assert(i == 0); - - /* Test printf with uint64 */ - tor_snprintf(buf, sizeof(buf), "x!"U64_FORMAT"!x", - U64_PRINTF_ARG(U64_LITERAL(12345678901))); - test_streq(buf, "x!12345678901!x"); - - /* Test parse_config_line_from_str */ - strlcpy(buf, "k v\n" " key value with spaces \n" "keykey val\n" - "k2\n" - "k3 \n" "\n" " \n" "#comment\n" - "k4#a\n" "k5#abc\n" "k6 val #with comment\n" - "kseven \"a quoted 'string\"\n" - "k8 \"a \\x71uoted\\n\\\"str\\\\ing\\t\\001\\01\\1\\\"\"\n" - , sizeof(buf)); - str = buf; - - str = parse_config_line_from_str(str, &k, &v); - test_streq(k, "k"); - test_streq(v, "v"); - tor_free(k); tor_free(v); - test_assert(!strcmpstart(str, "key value with")); - - str = parse_config_line_from_str(str, &k, &v); - test_streq(k, "key"); - test_streq(v, "value with spaces"); - tor_free(k); tor_free(v); - test_assert(!strcmpstart(str, "keykey")); - - str = parse_config_line_from_str(str, &k, &v); - test_streq(k, "keykey"); - test_streq(v, "val"); - tor_free(k); tor_free(v); - test_assert(!strcmpstart(str, "k2\n")); - - str = parse_config_line_from_str(str, &k, &v); - test_streq(k, "k2"); - test_streq(v, ""); - tor_free(k); tor_free(v); - test_assert(!strcmpstart(str, "k3 \n")); - - str = parse_config_line_from_str(str, &k, &v); - test_streq(k, "k3"); - test_streq(v, ""); - tor_free(k); tor_free(v); - test_assert(!strcmpstart(str, "#comment")); - - str = parse_config_line_from_str(str, &k, &v); - test_streq(k, "k4"); - test_streq(v, ""); - tor_free(k); tor_free(v); - test_assert(!strcmpstart(str, "k5#abc")); - - str = parse_config_line_from_str(str, &k, &v); - test_streq(k, "k5"); - test_streq(v, ""); - tor_free(k); tor_free(v); - test_assert(!strcmpstart(str, "k6")); - - str = parse_config_line_from_str(str, &k, &v); - test_streq(k, "k6"); - test_streq(v, "val"); - tor_free(k); tor_free(v); - test_assert(!strcmpstart(str, "kseven")); - - str = parse_config_line_from_str(str, &k, &v); - test_streq(k, "kseven"); - test_streq(v, "a quoted 'string"); - tor_free(k); tor_free(v); - test_assert(!strcmpstart(str, "k8 ")); - - str = parse_config_line_from_str(str, &k, &v); - test_streq(k, "k8"); - test_streq(v, "a quoted\n\"str\\ing\t\x01\x01\x01\""); - tor_free(k); tor_free(v); - test_streq(str, ""); - - /* Test for strcmpstart and strcmpend. */ - test_assert(strcmpstart("abcdef", "abcdef")==0); - test_assert(strcmpstart("abcdef", "abc")==0); - test_assert(strcmpstart("abcdef", "abd")<0); - test_assert(strcmpstart("abcdef", "abb")>0); - test_assert(strcmpstart("ab", "abb")<0); - - test_assert(strcmpend("abcdef", "abcdef")==0); - test_assert(strcmpend("abcdef", "def")==0); - test_assert(strcmpend("abcdef", "deg")<0); - test_assert(strcmpend("abcdef", "dee")>0); - test_assert(strcmpend("ab", "abb")<0); - - test_assert(strcasecmpend("AbcDEF", "abcdef")==0); - test_assert(strcasecmpend("abcdef", "dEF")==0); - test_assert(strcasecmpend("abcDEf", "deg")<0); - test_assert(strcasecmpend("abcdef", "DEE")>0); - test_assert(strcasecmpend("ab", "abB")<0); - - /* Test mem_is_zero */ - memset(buf,0,128); - buf[128] = 'x'; - test_assert(tor_digest_is_zero(buf)); - test_assert(tor_mem_is_zero(buf, 10)); - test_assert(tor_mem_is_zero(buf, 20)); - test_assert(tor_mem_is_zero(buf, 128)); - test_assert(!tor_mem_is_zero(buf, 129)); - buf[60] = (char)255; - test_assert(!tor_mem_is_zero(buf, 128)); - buf[0] = (char)1; - test_assert(!tor_mem_is_zero(buf, 10)); - - /* Test inet_ntop */ - { - char tmpbuf[TOR_ADDR_BUF_LEN]; - const char *ip = "176.192.208.224"; - struct in_addr in; - tor_inet_pton(AF_INET, ip, &in); - tor_inet_ntop(AF_INET, &in, tmpbuf, sizeof(tmpbuf)); - test_streq(tmpbuf, ip); - } - - /* Test 'escaped' */ - test_streq("\"\"", escaped("")); - test_streq("\"abcd\"", escaped("abcd")); - test_streq("\"\\\\\\n\\r\\t\\\"\\'\"", escaped("\\\n\r\t\"\'")); - test_streq("\"z\\001abc\\277d\"", escaped("z\001abc\277d")); - test_assert(NULL == escaped(NULL)); - - /* Test strndup and memdup */ - { - const char *s = "abcdefghijklmnopqrstuvwxyz"; - cp = tor_strndup(s, 30); - test_streq(cp, s); /* same string, */ - test_neq(cp, s); /* but different pointers. */ - tor_free(cp); - - cp = tor_strndup(s, 5); - test_streq(cp, "abcde"); - tor_free(cp); - - s = "a\0b\0c\0d\0e\0"; - cp = tor_memdup(s,10); - test_memeq(cp, s, 10); /* same ram, */ - test_neq(cp, s); /* but different pointers. */ - tor_free(cp); - } - - /* Test str-foo functions */ - cp = tor_strdup("abcdef"); - test_assert(tor_strisnonupper(cp)); - cp[3] = 'D'; - test_assert(!tor_strisnonupper(cp)); - tor_strupper(cp); - test_streq(cp, "ABCDEF"); - test_assert(tor_strisprint(cp)); - cp[3] = 3; - test_assert(!tor_strisprint(cp)); - tor_free(cp); - - /* Test eat_whitespace. */ - { - const char *s = " \n a"; - test_eq_ptr(eat_whitespace(s), s+4); - s = "abcd"; - test_eq_ptr(eat_whitespace(s), s); - s = "#xyz\nab"; - test_eq_ptr(eat_whitespace(s), s+5); - } - - /* Test memmem */ - { - const char *haystack = "abcde"; - tor_assert(!tor_memmem(haystack, 5, "ef", 2)); - test_eq_ptr(tor_memmem(haystack, 5, "cd", 2), haystack + 2); - test_eq_ptr(tor_memmem(haystack, 5, "cde", 3), haystack + 2); - haystack = "ababcad"; - test_eq_ptr(tor_memmem(haystack, 7, "abc", 3), haystack + 2); - } - - /* Test wrap_string */ - { - smartlist_t *sl = smartlist_create(); - wrap_string(sl, "This is a test of string wrapping functionality: woot.", - 10, "", ""); - cp = smartlist_join_strings(sl, "", 0, NULL); - test_streq(cp, - "This is a\ntest of\nstring\nwrapping\nfunctional\nity: woot.\n"); - tor_free(cp); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - wrap_string(sl, "This is a test of string wrapping functionality: woot.", - 16, "### ", "# "); - cp = smartlist_join_strings(sl, "", 0, NULL); - test_streq(cp, - "### This is a\n# test of string\n# wrapping\n# functionality:\n" - "# woot.\n"); - - tor_free(cp); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_free(sl); - } - - /* now make sure time works. */ - tor_gettimeofday(&end); - /* We might've timewarped a little. */ - test_assert(tv_udiff(&start, &end) >= -5000); - - /* Test tor_log2(). */ - test_eq(tor_log2(64), 6); - test_eq(tor_log2(65), 6); - test_eq(tor_log2(63), 5); - test_eq(tor_log2(1), 0); - test_eq(tor_log2(2), 1); - test_eq(tor_log2(3), 1); - test_eq(tor_log2(4), 2); - test_eq(tor_log2(5), 2); - test_eq(tor_log2(U64_LITERAL(40000000000000000)), 55); - test_eq(tor_log2(UINT64_MAX), 63); - - /* Test round_to_power_of_2 */ - test_eq(round_to_power_of_2(120), 128); - test_eq(round_to_power_of_2(128), 128); - test_eq(round_to_power_of_2(130), 128); - test_eq(round_to_power_of_2(U64_LITERAL(40000000000000000)), - U64_LITERAL(1)<<55); - test_eq(round_to_power_of_2(0), 2); -} - -/** Helper: assert that IPv6 addresses a and b are the same. On - * failure, reports an error, describing the addresses as e1 and - * e2, and reporting the line number as line. */ -static void -_test_eq_ip6(struct in6_addr *a, struct in6_addr *b, const char *e1, - const char *e2, int line) -{ - int i; - int ok = 1; - for (i = 0; i < 16; ++i) { - if (a->s6_addr[i] != b->s6_addr[i]) { - ok = 0; - break; - } - } - if (ok) { - printf("."); fflush(stdout); - } else { - char buf1[128], *cp1; - char buf2[128], *cp2; - have_failed = 1; - cp1 = buf1; cp2 = buf2; - for (i=0; i<16; ++i) { - tor_snprintf(cp1, sizeof(buf1)-(cp1-buf1), "%02x", a->s6_addr[i]); - tor_snprintf(cp2, sizeof(buf2)-(cp2-buf2), "%02x", b->s6_addr[i]); - cp1 += 2; cp2 += 2; - if ((i%2)==1 && i != 15) { - *cp1++ = ':'; - *cp2++ = ':'; - } - } - *cp1 = *cp2 = '\0'; - printf("Line %d: assertion failed: (%s == %s)\n" - " %s != %s\n", line, e1, e2, buf1, buf2); - fflush(stdout); - } -} - -/** Helper: Assert that two strings both decode as IPv6 addresses with - * tor_inet_pton(), and both decode to the same address. */ -#define test_pton6_same(a,b) STMT_BEGIN \ - test_eq(tor_inet_pton(AF_INET6, a, &a1), 1); \ - test_eq(tor_inet_pton(AF_INET6, b, &a2), 1); \ - _test_eq_ip6(&a1,&a2,#a,#b,__LINE__); \ - STMT_END - -/** Helper: Assert that a is recognized as a bad IPv6 address by - * tor_inet_pton(). */ -#define test_pton6_bad(a) \ - test_eq(0, tor_inet_pton(AF_INET6, a, &a1)) - -/** Helper: assert that a, when parsed by tor_inet_pton() and displayed - * with tor_inet_ntop(), yields b. Also assert that b parses to - * the same value as a. */ -#define test_ntop6_reduces(a,b) STMT_BEGIN \ - test_eq(tor_inet_pton(AF_INET6, a, &a1), 1); \ - test_streq(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)), b); \ - test_eq(tor_inet_pton(AF_INET6, b, &a2), 1); \ - _test_eq_ip6(&a1, &a2, a, b, __LINE__); \ - STMT_END - -/** Helper: assert that a parses by tor_inet_pton() into a address that - * passes tor_addr_is_internal() with for_listening */ -#define test_internal_ip(a,for_listening) STMT_BEGIN \ - test_eq(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), 1); \ - t1.family = AF_INET6; \ - if (!tor_addr_is_internal(&t1, for_listening)) \ - test_fail_msg( a "was not internal."); \ - STMT_END - -/** Helper: assert that a parses by tor_inet_pton() into a address that - * does not pass tor_addr_is_internal() with for_listening. */ -#define test_external_ip(a,for_listening) STMT_BEGIN \ - test_eq(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), 1); \ - t1.family = AF_INET6; \ - if (tor_addr_is_internal(&t1, for_listening)) \ - test_fail_msg(a "was not external."); \ - STMT_END - -/** Helper: Assert that a and b, when parsed by - * tor_inet_pton(), give addresses that compare in the order defined by - * op with tor_addr_compare(). */ -#define test_addr_compare(a, op, b) STMT_BEGIN \ - test_eq(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), 1); \ - test_eq(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), 1); \ - t1.family = t2.family = AF_INET6; \ - r = tor_addr_compare(&t1,&t2); \ - if (!(r op 0)) \ - test_fail_msg("failed: tor_addr_compare("a","b") "#op" 0"); \ - STMT_END - -/** Helper: Assert that a and b, when parsed by - * tor_inet_pton(), give addresses that compare in the order defined by - * op with tor_addr_compare_masked() with m masked. */ -#define test_addr_compare_masked(a, op, b, m) STMT_BEGIN \ - test_eq(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), 1); \ - test_eq(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), 1); \ - t1.family = t2.family = AF_INET6; \ - r = tor_addr_compare_masked(&t1,&t2,m); \ - if (!(r op 0)) \ - test_fail_msg("failed: tor_addr_compare_masked("a","b","#m") "#op" 0"); \ - STMT_END - -/** Helper: assert that xx is parseable as a masked IPv6 address with - * ports by tor_parse_mask_addr_ports(), with family f, IP address - * as 4 32-bit words ip1...ip4, mask bits as mm, and port range - * as pt1..pt2. */ -#define test_addr_mask_ports_parse(xx, f, ip1, ip2, ip3, ip4, mm, pt1, pt2) \ - STMT_BEGIN \ - test_eq(tor_addr_parse_mask_ports(xx, &t1, &mask, &port1, &port2), f); \ - p1=tor_inet_ntop(AF_INET6, &t1.addr.in6_addr, bug, sizeof(bug)); \ - test_eq(htonl(ip1), IN6_ADDRESS32(&t1)[0]); \ - test_eq(htonl(ip2), IN6_ADDRESS32(&t1)[1]); \ - test_eq(htonl(ip3), IN6_ADDRESS32(&t1)[2]); \ - test_eq(htonl(ip4), IN6_ADDRESS32(&t1)[3]); \ - test_eq(mask, mm); \ - test_eq(port1, pt1); \ - test_eq(port2, pt2); \ - STMT_END - -static void -test_util_ip6_helpers(void) -{ - char buf[TOR_ADDR_BUF_LEN], bug[TOR_ADDR_BUF_LEN]; - struct in6_addr a1, a2; - tor_addr_t t1, t2; - int r, i; - uint16_t port1, port2; - maskbits_t mask; - const char *p1; - - // struct in_addr b1, b2; - /* Test tor_inet_ntop and tor_inet_pton: IPv6 */ - - /* === Test pton: valid af_inet6 */ - /* Simple, valid parsing. */ - r = tor_inet_pton(AF_INET6, - "0102:0304:0506:0708:090A:0B0C:0D0E:0F10", &a1); - test_assert(r==1); - for (i=0;i<16;++i) { test_eq(i+1, (int)a1.s6_addr[i]); } - /* ipv4 ending. */ - test_pton6_same("0102:0304:0506:0708:090A:0B0C:0D0E:0F10", - "0102:0304:0506:0708:090A:0B0C:13.14.15.16"); - /* shortened words. */ - test_pton6_same("0001:0099:BEEF:0000:0123:FFFF:0001:0001", - "1:99:BEEF:0:0123:FFFF:1:1"); - /* zeros at the beginning */ - test_pton6_same("0000:0000:0000:0000:0009:C0A8:0001:0001", - "::9:c0a8:1:1"); - test_pton6_same("0000:0000:0000:0000:0009:C0A8:0001:0001", - "::9:c0a8:0.1.0.1"); - /* zeros in the middle. */ - test_pton6_same("fe80:0000:0000:0000:0202:1111:0001:0001", - "fe80::202:1111:1:1"); - /* zeros at the end. */ - test_pton6_same("1000:0001:0000:0007:0000:0000:0000:0000", - "1000:1:0:7::"); - - /* === Test ntop: af_inet6 */ - test_ntop6_reduces("0:0:0:0:0:0:0:0", "::"); - - test_ntop6_reduces("0001:0099:BEEF:0006:0123:FFFF:0001:0001", - "1:99:beef:6:123:ffff:1:1"); - - //test_ntop6_reduces("0:0:0:0:0:0:c0a8:0101", "::192.168.1.1"); - test_ntop6_reduces("0:0:0:0:0:ffff:c0a8:0101", "::ffff:192.168.1.1"); - test_ntop6_reduces("002:0:0000:0:3::4", "2::3:0:0:4"); - test_ntop6_reduces("0:0::1:0:3", "::1:0:3"); - test_ntop6_reduces("008:0::0", "8::"); - test_ntop6_reduces("0:0:0:0:0:ffff::1", "::ffff:0.0.0.1"); - test_ntop6_reduces("abcd:0:0:0:0:0:7f00::", "abcd::7f00:0"); - test_ntop6_reduces("0000:0000:0000:0000:0009:C0A8:0001:0001", - "::9:c0a8:1:1"); - test_ntop6_reduces("fe80:0000:0000:0000:0202:1111:0001:0001", - "fe80::202:1111:1:1"); - test_ntop6_reduces("1000:0001:0000:0007:0000:0000:0000:0000", - "1000:1:0:7::"); - - /* === Test pton: invalid in6. */ - test_pton6_bad("foobar."); - test_pton6_bad("55555::"); - test_pton6_bad("9:-60::"); - test_pton6_bad("1:2:33333:4:0002:3::"); - //test_pton6_bad("1:2:3333:4:00002:3::");// BAD, but glibc doesn't say so. - test_pton6_bad("1:2:3333:4:fish:3::"); - test_pton6_bad("1:2:3:4:5:6:7:8:9"); - test_pton6_bad("1:2:3:4:5:6:7"); - test_pton6_bad("1:2:3:4:5:6:1.2.3.4.5"); - test_pton6_bad("1:2:3:4:5:6:1.2.3"); - test_pton6_bad("::1.2.3"); - test_pton6_bad("::1.2.3.4.5"); - test_pton6_bad("99"); - test_pton6_bad(""); - test_pton6_bad("1::2::3:4"); - test_pton6_bad("a:::b:c"); - test_pton6_bad(":::a:b:c"); - test_pton6_bad("a:b:c:::"); - - /* test internal checking */ - test_external_ip("fbff:ffff::2:7", 0); - test_internal_ip("fc01::2:7", 0); - test_internal_ip("fdff:ffff::f:f", 0); - test_external_ip("fe00::3:f", 0); - - test_external_ip("fe7f:ffff::2:7", 0); - test_internal_ip("fe80::2:7", 0); - test_internal_ip("febf:ffff::f:f", 0); - - test_internal_ip("fec0::2:7:7", 0); - test_internal_ip("feff:ffff::e:7:7", 0); - test_external_ip("ff00::e:7:7", 0); - - test_internal_ip("::", 0); - test_internal_ip("::1", 0); - test_internal_ip("::1", 1); - test_internal_ip("::", 0); - test_external_ip("::", 1); - test_external_ip("::2", 0); - test_external_ip("2001::", 0); - test_external_ip("ffff::", 0); - - test_external_ip("::ffff:0.0.0.0", 1); - test_internal_ip("::ffff:0.0.0.0", 0); - test_internal_ip("::ffff:0.255.255.255", 0); - test_external_ip("::ffff:1.0.0.0", 0); - - test_external_ip("::ffff:9.255.255.255", 0); - test_internal_ip("::ffff:10.0.0.0", 0); - test_internal_ip("::ffff:10.255.255.255", 0); - test_external_ip("::ffff:11.0.0.0", 0); - - test_external_ip("::ffff:126.255.255.255", 0); - test_internal_ip("::ffff:127.0.0.0", 0); - test_internal_ip("::ffff:127.255.255.255", 0); - test_external_ip("::ffff:128.0.0.0", 0); - - test_external_ip("::ffff:172.15.255.255", 0); - test_internal_ip("::ffff:172.16.0.0", 0); - test_internal_ip("::ffff:172.31.255.255", 0); - test_external_ip("::ffff:172.32.0.0", 0); - - test_external_ip("::ffff:192.167.255.255", 0); - test_internal_ip("::ffff:192.168.0.0", 0); - test_internal_ip("::ffff:192.168.255.255", 0); - test_external_ip("::ffff:192.169.0.0", 0); - - test_external_ip("::ffff:169.253.255.255", 0); - test_internal_ip("::ffff:169.254.0.0", 0); - test_internal_ip("::ffff:169.254.255.255", 0); - test_external_ip("::ffff:169.255.0.0", 0); - - /* tor_addr_compare(tor_addr_t x2) */ - test_addr_compare("ffff::", ==, "ffff::0"); - test_addr_compare("0::3:2:1", >, "0::ffff:0.3.2.1"); - test_addr_compare("0::2:2:1", >, "0::ffff:0.3.2.1"); - test_addr_compare("0::ffff:0.3.2.1", <, "0::0:0:0"); - test_addr_compare("0::ffff:5.2.2.1", <, "::ffff:6.0.0.0"); /* XXXX wrong. */ - tor_addr_parse_mask_ports("[::ffff:2.3.4.5]", &t1, NULL, NULL, NULL); - tor_addr_parse_mask_ports("2.3.4.5", &t2, NULL, NULL, NULL); - test_assert(tor_addr_compare(&t1, &t2) == 0); - tor_addr_parse_mask_ports("[::ffff:2.3.4.4]", &t1, NULL, NULL, NULL); - tor_addr_parse_mask_ports("2.3.4.5", &t2, NULL, NULL, NULL); - test_assert(tor_addr_compare(&t1, &t2) < 0); - - /* test compare_masked */ - test_addr_compare_masked("ffff::", ==, "ffff::0", 128); - test_addr_compare_masked("ffff::", ==, "ffff::0", 64); - test_addr_compare_masked("0::2:2:1", <, "0::8000:2:1", 81); - test_addr_compare_masked("0::2:2:1", ==, "0::8000:2:1", 80); - - /* test tor_addr_parse_mask_ports */ - test_addr_mask_ports_parse("[::f]/17:47-95", AF_INET6, - 0, 0, 0, 0x0000000f, 17, 47, 95); - //test_addr_parse("[::fefe:4.1.1.7/120]:999-1000"); - //test_addr_parse_check("::fefe:401:107", 120, 999, 1000); - test_addr_mask_ports_parse("[::ffff:4.1.1.7]/120:443", AF_INET6, - 0, 0, 0x0000ffff, 0x04010107, 120, 443, 443); - test_addr_mask_ports_parse("[abcd:2::44a:0]:2-65000", AF_INET6, - 0xabcd0002, 0, 0, 0x044a0000, 128, 2, 65000); - - r=tor_addr_parse_mask_ports("[fefef::]/112", &t1, NULL, NULL, NULL); - test_assert(r == -1); - r=tor_addr_parse_mask_ports("efef::/112", &t1, NULL, NULL, NULL); - test_assert(r == -1); - r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f::]", &t1, NULL, NULL, NULL); - test_assert(r == -1); - r=tor_addr_parse_mask_ports("[::f:f:f:f:f:f:f:f]", &t1, NULL, NULL, NULL); - test_assert(r == -1); - r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f:f]", &t1, NULL, NULL, NULL); - test_assert(r == -1); - /* Test for V4-mapped address with mask < 96. (arguably not valid) */ - r=tor_addr_parse_mask_ports("[::ffff:1.1.2.2/33]", &t1, &mask, NULL, NULL); - test_assert(r == -1); - r=tor_addr_parse_mask_ports("1.1.2.2/33", &t1, &mask, NULL, NULL); - test_assert(r == -1); - r=tor_addr_parse_mask_ports("1.1.2.2/31", &t1, &mask, NULL, NULL); - test_assert(r == AF_INET); - r=tor_addr_parse_mask_ports("[efef::]/112", &t1, &mask, &port1, &port2); - test_assert(r == AF_INET6); - test_assert(port1 == 1); - test_assert(port2 == 65535); - - /* make sure inet address lengths >= max */ - test_assert(INET_NTOA_BUF_LEN >= sizeof("255.255.255.255")); - test_assert(TOR_ADDR_BUF_LEN >= - sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")); - - test_assert(sizeof(tor_addr_t) >= sizeof(struct in6_addr)); - - /* get interface addresses */ - r = get_interface_address6(LOG_DEBUG, AF_INET, &t1); - i = get_interface_address6(LOG_DEBUG, AF_INET6, &t2); -#if 0 - tor_inet_ntop(AF_INET, &t1.sa.sin_addr, buf, sizeof(buf)); - printf("\nv4 address: %s (family=%i)", buf, IN_FAMILY(&t1)); - tor_inet_ntop(AF_INET6, &t2.sa6.sin6_addr, buf, sizeof(buf)); - printf("\nv6 address: %s (family=%i)", buf, IN_FAMILY(&t2)); -#endif -} - -static void -test_util_smartlist(void) -{ - smartlist_t *sl; - char *cp; - - /* XXXX test sort_digests, uniq_strings, uniq_digests */ - - /* Test smartlist add, del_keeporder, insert, get. */ - sl = smartlist_create(); - smartlist_add(sl, (void*)1); - smartlist_add(sl, (void*)2); - smartlist_add(sl, (void*)3); - smartlist_add(sl, (void*)4); - smartlist_del_keeporder(sl, 1); - smartlist_insert(sl, 1, (void*)22); - smartlist_insert(sl, 0, (void*)0); - smartlist_insert(sl, 5, (void*)555); - test_eq_ptr((void*)0, smartlist_get(sl,0)); - test_eq_ptr((void*)1, smartlist_get(sl,1)); - test_eq_ptr((void*)22, smartlist_get(sl,2)); - test_eq_ptr((void*)3, smartlist_get(sl,3)); - test_eq_ptr((void*)4, smartlist_get(sl,4)); - test_eq_ptr((void*)555, smartlist_get(sl,5)); - /* Try deleting in the middle. */ - smartlist_del(sl, 1); - test_eq_ptr((void*)555, smartlist_get(sl, 1)); - /* Try deleting at the end. */ - smartlist_del(sl, 4); - test_eq(4, smartlist_len(sl)); - - /* test isin. */ - test_assert(smartlist_isin(sl, (void*)3)); - test_assert(!smartlist_isin(sl, (void*)99)); - - /* Test split and join */ - smartlist_clear(sl); - test_eq(0, smartlist_len(sl)); - smartlist_split_string(sl, "abc", ":", 0, 0); - test_eq(1, smartlist_len(sl)); - test_streq("abc", smartlist_get(sl, 0)); - smartlist_split_string(sl, "a::bc::", "::", 0, 0); - test_eq(4, smartlist_len(sl)); - test_streq("a", smartlist_get(sl, 1)); - test_streq("bc", smartlist_get(sl, 2)); - test_streq("", smartlist_get(sl, 3)); - cp = smartlist_join_strings(sl, "", 0, NULL); - test_streq(cp, "abcabc"); - tor_free(cp); - cp = smartlist_join_strings(sl, "!", 0, NULL); - test_streq(cp, "abc!a!bc!"); - tor_free(cp); - cp = smartlist_join_strings(sl, "XY", 0, NULL); - test_streq(cp, "abcXYaXYbcXY"); - tor_free(cp); - cp = smartlist_join_strings(sl, "XY", 1, NULL); - test_streq(cp, "abcXYaXYbcXYXY"); - tor_free(cp); - cp = smartlist_join_strings(sl, "", 1, NULL); - test_streq(cp, "abcabc"); - tor_free(cp); - - smartlist_split_string(sl, "/def/ /ghijk", "/", 0, 0); - test_eq(8, smartlist_len(sl)); - test_streq("", smartlist_get(sl, 4)); - test_streq("def", smartlist_get(sl, 5)); - test_streq(" ", smartlist_get(sl, 6)); - test_streq("ghijk", smartlist_get(sl, 7)); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - smartlist_split_string(sl, "a,bbd,cdef", ",", SPLIT_SKIP_SPACE, 0); - test_eq(3, smartlist_len(sl)); - test_streq("a", smartlist_get(sl,0)); - test_streq("bbd", smartlist_get(sl,1)); - test_streq("cdef", smartlist_get(sl,2)); - smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", - SPLIT_SKIP_SPACE, 0); - test_eq(8, smartlist_len(sl)); - test_streq("z", smartlist_get(sl,3)); - test_streq("zhasd", smartlist_get(sl,4)); - test_streq("", smartlist_get(sl,5)); - test_streq("bnud", smartlist_get(sl,6)); - test_streq("", smartlist_get(sl,7)); - - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - smartlist_split_string(sl, " ab\tc \td ef ", NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - test_eq(4, smartlist_len(sl)); - test_streq("ab", smartlist_get(sl,0)); - test_streq("c", smartlist_get(sl,1)); - test_streq("d", smartlist_get(sl,2)); - test_streq("ef", smartlist_get(sl,3)); - smartlist_split_string(sl, "ghi\tj", NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - test_eq(6, smartlist_len(sl)); - test_streq("ghi", smartlist_get(sl,4)); - test_streq("j", smartlist_get(sl,5)); - - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - cp = smartlist_join_strings(sl, "XY", 0, NULL); - test_streq(cp, ""); - tor_free(cp); - cp = smartlist_join_strings(sl, "XY", 1, NULL); - test_streq(cp, "XY"); - tor_free(cp); - - smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - test_eq(3, smartlist_len(sl)); - test_streq("z", smartlist_get(sl, 0)); - test_streq("zhasd", smartlist_get(sl, 1)); - test_streq("bnud", smartlist_get(sl, 2)); - smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); - test_eq(5, smartlist_len(sl)); - test_streq("z", smartlist_get(sl, 3)); - test_streq("zhasd <> <> bnud<>", smartlist_get(sl, 4)); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - smartlist_split_string(sl, "abcd\n", "\n", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - test_eq(1, smartlist_len(sl)); - test_streq("abcd", smartlist_get(sl, 0)); - smartlist_split_string(sl, "efgh", "\n", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - test_eq(2, smartlist_len(sl)); - test_streq("efgh", smartlist_get(sl, 1)); - - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* Test swapping, shuffling, and sorting. */ - smartlist_split_string(sl, "the,onion,router,by,arma,and,nickm", ",", 0, 0); - test_eq(7, smartlist_len(sl)); - smartlist_sort(sl, _compare_strs); - cp = smartlist_join_strings(sl, ",", 0, NULL); - test_streq(cp,"and,arma,by,nickm,onion,router,the"); - tor_free(cp); - smartlist_swap(sl, 1, 5); - cp = smartlist_join_strings(sl, ",", 0, NULL); - test_streq(cp,"and,router,by,nickm,onion,arma,the"); - tor_free(cp); - smartlist_shuffle(sl); - test_eq(7, smartlist_len(sl)); - test_assert(smartlist_string_isin(sl, "and")); - test_assert(smartlist_string_isin(sl, "router")); - test_assert(smartlist_string_isin(sl, "by")); - test_assert(smartlist_string_isin(sl, "nickm")); - test_assert(smartlist_string_isin(sl, "onion")); - test_assert(smartlist_string_isin(sl, "arma")); - test_assert(smartlist_string_isin(sl, "the")); - - /* Test bsearch. */ - smartlist_sort(sl, _compare_strs); - test_streq("nickm", smartlist_bsearch(sl, "zNicKM", - _compare_without_first_ch)); - test_streq("and", smartlist_bsearch(sl, " AND", _compare_without_first_ch)); - test_eq_ptr(NULL, smartlist_bsearch(sl, " ANz", _compare_without_first_ch)); - - /* Test bsearch_idx */ - { - int f; - test_eq(0, smartlist_bsearch_idx(sl," aaa",_compare_without_first_ch,&f)); - test_eq(f, 0); - test_eq(0, smartlist_bsearch_idx(sl," and",_compare_without_first_ch,&f)); - test_eq(f, 1); - test_eq(1, smartlist_bsearch_idx(sl," arm",_compare_without_first_ch,&f)); - test_eq(f, 0); - test_eq(1, smartlist_bsearch_idx(sl," arma",_compare_without_first_ch,&f)); - test_eq(f, 1); - test_eq(2, smartlist_bsearch_idx(sl," armb",_compare_without_first_ch,&f)); - test_eq(f, 0); - test_eq(7, smartlist_bsearch_idx(sl," zzzz",_compare_without_first_ch,&f)); - test_eq(f, 0); - } - - /* Test reverse() and pop_last() */ - smartlist_reverse(sl); - cp = smartlist_join_strings(sl, ",", 0, NULL); - test_streq(cp,"the,router,onion,nickm,by,arma,and"); - tor_free(cp); - cp = smartlist_pop_last(sl); - test_streq(cp, "and"); - tor_free(cp); - test_eq(smartlist_len(sl), 6); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* Test uniq() */ - smartlist_split_string(sl, - "50,noon,radar,a,man,a,plan,a,canal,panama,radar,noon,50", - ",", 0, 0); - smartlist_sort(sl, _compare_strs); - smartlist_uniq(sl, _compare_strs, _tor_free); - cp = smartlist_join_strings(sl, ",", 0, NULL); - test_streq(cp, "50,a,canal,man,noon,panama,plan,radar"); - tor_free(cp); - - /* Test string_isin and isin_case and num_isin */ - test_assert(smartlist_string_isin(sl, "noon")); - test_assert(!smartlist_string_isin(sl, "noonoon")); - test_assert(smartlist_string_isin_case(sl, "nOOn")); - test_assert(!smartlist_string_isin_case(sl, "nooNooN")); - test_assert(smartlist_string_num_isin(sl, 50)); - test_assert(!smartlist_string_num_isin(sl, 60)); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* Test string_remove and remove and join_strings2 */ - smartlist_split_string(sl, - "Some say the Earth will end in ice and some in fire", - " ", 0, 0); - cp = smartlist_get(sl, 4); - test_streq(cp, "will"); - smartlist_add(sl, cp); - smartlist_remove(sl, cp); - tor_free(cp); - cp = smartlist_join_strings(sl, ",", 0, NULL); - test_streq(cp, "Some,say,the,Earth,fire,end,in,ice,and,some,in"); - tor_free(cp); - smartlist_string_remove(sl, "in"); - cp = smartlist_join_strings2(sl, "+XX", 1, 0, NULL); - test_streq(cp, "Some+say+the+Earth+fire+end+some+ice+and"); - tor_free(cp); - - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - { - smartlist_t *ints = smartlist_create(); - smartlist_t *odds = smartlist_create(); - smartlist_t *evens = smartlist_create(); - smartlist_t *primes = smartlist_create(); - int i; - for (i=1; i < 10; i += 2) - smartlist_add(odds, (void*)(uintptr_t)i); - for (i=0; i < 10; i += 2) - smartlist_add(evens, (void*)(uintptr_t)i); - - /* add_all */ - smartlist_add_all(ints, odds); - smartlist_add_all(ints, evens); - test_eq(smartlist_len(ints), 10); - - smartlist_add(primes, (void*)2); - smartlist_add(primes, (void*)3); - smartlist_add(primes, (void*)5); - smartlist_add(primes, (void*)7); - - /* overlap */ - test_assert(smartlist_overlap(ints, odds)); - test_assert(smartlist_overlap(odds, primes)); - test_assert(smartlist_overlap(evens, primes)); - test_assert(!smartlist_overlap(odds, evens)); - - /* intersect */ - smartlist_add_all(sl, odds); - smartlist_intersect(sl, primes); - test_eq(smartlist_len(sl), 3); - test_assert(smartlist_isin(sl, (void*)3)); - test_assert(smartlist_isin(sl, (void*)5)); - test_assert(smartlist_isin(sl, (void*)7)); - - /* subtract */ - smartlist_add_all(sl, primes); - smartlist_subtract(sl, odds); - test_eq(smartlist_len(sl), 1); - test_assert(smartlist_isin(sl, (void*)2)); - - smartlist_free(odds); - smartlist_free(evens); - smartlist_free(ints); - smartlist_free(primes); - smartlist_clear(sl); - } - - smartlist_free(sl); -} - -static void -test_util_bitarray(void) -{ - bitarray_t *ba; - int i, j, ok=1; - - ba = bitarray_init_zero(1); - test_assert(! bitarray_is_set(ba, 0)); - bitarray_set(ba, 0); - test_assert(bitarray_is_set(ba, 0)); - bitarray_clear(ba, 0); - test_assert(! bitarray_is_set(ba, 0)); - bitarray_free(ba); - - ba = bitarray_init_zero(1023); - for (i = 1; i < 64; ) { - for (j = 0; j < 1023; ++j) { - if (j % i) - bitarray_set(ba, j); - else - bitarray_clear(ba, j); - } - for (j = 0; j < 1023; ++j) { - if (!bool_eq(bitarray_is_set(ba, j), j%i)) - ok = 0; - } - test_assert(ok); - if (i < 7) - ++i; - else if (i == 28) - i = 32; - else - i += 7; - } - bitarray_free(ba); -} - -/* stop threads running at once. */ -static tor_mutex_t *_thread_test_mutex = NULL; -/* make sure that threads have to run at the same time. */ -static tor_mutex_t *_thread_test_start1 = NULL; -static tor_mutex_t *_thread_test_start2 = NULL; -static strmap_t *_thread_test_strmap = NULL; - -static void _thread_test_func(void* _s) ATTR_NORETURN; - -static int t1_count = 0; -static int t2_count = 0; - -static void -_thread_test_func(void* _s) -{ - char *s = _s; - int i, *count; - tor_mutex_t *m; - char buf[64]; - char *cp; - if (!strcmp(s, "thread 1")) { - m = _thread_test_start1; - count = &t1_count; - } else { - m = _thread_test_start2; - count = &t2_count; - } - tor_mutex_acquire(m); - - tor_snprintf(buf, sizeof(buf), "%lu", tor_get_thread_id()); - cp = tor_strdup(buf); - - for (i=0; i<10000; ++i) { - tor_mutex_acquire(_thread_test_mutex); - strmap_set(_thread_test_strmap, "last to run", cp); - ++*count; - tor_mutex_release(_thread_test_mutex); - } - tor_mutex_acquire(_thread_test_mutex); - strmap_set(_thread_test_strmap, s, tor_strdup(buf)); - tor_mutex_release(_thread_test_mutex); - - tor_mutex_release(m); - - spawn_exit(); -} - -static void -test_util_threads(void) -{ - char *s1, *s2; - int done = 0, timedout = 0; - time_t started; -#ifndef TOR_IS_MULTITHREADED - /* Skip this test if we aren't threading. We should be threading most - * everywhere by now. */ - if (1) - return; -#endif - _thread_test_mutex = tor_mutex_new(); - _thread_test_start1 = tor_mutex_new(); - _thread_test_start2 = tor_mutex_new(); - _thread_test_strmap = strmap_new(); - s1 = tor_strdup("thread 1"); - s2 = tor_strdup("thread 2"); - tor_mutex_acquire(_thread_test_start1); - tor_mutex_acquire(_thread_test_start2); - spawn_func(_thread_test_func, s1); - spawn_func(_thread_test_func, s2); - tor_mutex_release(_thread_test_start2); - tor_mutex_release(_thread_test_start1); - started = time(NULL); - while (!done) { - tor_mutex_acquire(_thread_test_mutex); - strmap_assert_ok(_thread_test_strmap); - if (strmap_get(_thread_test_strmap, "thread 1") && - strmap_get(_thread_test_strmap, "thread 2")) { - done = 1; - } else if (time(NULL) > started + 25) { - timedout = done = 1; - } - tor_mutex_release(_thread_test_mutex); - } - tor_mutex_free(_thread_test_mutex); - - if (timedout) { - printf("\nTimed out: %d %d", t1_count, t2_count); - test_assert(strmap_get(_thread_test_strmap, "thread 1")); - test_assert(strmap_get(_thread_test_strmap, "thread 2")); - test_assert(!timedout); - } - - /* different thread IDs. */ - test_assert(strcmp(strmap_get(_thread_test_strmap, "thread 1"), - strmap_get(_thread_test_strmap, "thread 2"))); - test_assert(!strcmp(strmap_get(_thread_test_strmap, "thread 1"), - strmap_get(_thread_test_strmap, "last to run")) || - !strcmp(strmap_get(_thread_test_strmap, "thread 2"), - strmap_get(_thread_test_strmap, "last to run"))); - - strmap_free(_thread_test_strmap, _tor_free); - - tor_free(s1); - tor_free(s2); -} - -static int -_compare_strings_for_pqueue(const void *s1, const void *s2) -{ - return strcmp((const char*)s1, (const char*)s2); -} - -static void -test_util_pqueue(void) -{ - smartlist_t *sl; - int (*cmp)(const void *, const void*); -#define OK() smartlist_pqueue_assert_ok(sl, cmp) - - cmp = _compare_strings_for_pqueue; - - sl = smartlist_create(); - smartlist_pqueue_add(sl, cmp, (char*)"cows"); - smartlist_pqueue_add(sl, cmp, (char*)"zebras"); - smartlist_pqueue_add(sl, cmp, (char*)"fish"); - smartlist_pqueue_add(sl, cmp, (char*)"frogs"); - smartlist_pqueue_add(sl, cmp, (char*)"apples"); - smartlist_pqueue_add(sl, cmp, (char*)"squid"); - smartlist_pqueue_add(sl, cmp, (char*)"daschunds"); - smartlist_pqueue_add(sl, cmp, (char*)"eggplants"); - smartlist_pqueue_add(sl, cmp, (char*)"weissbier"); - smartlist_pqueue_add(sl, cmp, (char*)"lobsters"); - smartlist_pqueue_add(sl, cmp, (char*)"roquefort"); - - OK(); - - test_eq(smartlist_len(sl), 11); - test_streq(smartlist_get(sl, 0), "apples"); - test_streq(smartlist_pqueue_pop(sl, cmp), "apples"); - test_eq(smartlist_len(sl), 10); - OK(); - test_streq(smartlist_pqueue_pop(sl, cmp), "cows"); - test_streq(smartlist_pqueue_pop(sl, cmp), "daschunds"); - smartlist_pqueue_add(sl, cmp, (char*)"chinchillas"); - OK(); - smartlist_pqueue_add(sl, cmp, (char*)"fireflies"); - OK(); - test_streq(smartlist_pqueue_pop(sl, cmp), "chinchillas"); - test_streq(smartlist_pqueue_pop(sl, cmp), "eggplants"); - test_streq(smartlist_pqueue_pop(sl, cmp), "fireflies"); - OK(); - test_streq(smartlist_pqueue_pop(sl, cmp), "fish"); - test_streq(smartlist_pqueue_pop(sl, cmp), "frogs"); - test_streq(smartlist_pqueue_pop(sl, cmp), "lobsters"); - test_streq(smartlist_pqueue_pop(sl, cmp), "roquefort"); - OK(); - test_eq(smartlist_len(sl), 3); - test_streq(smartlist_pqueue_pop(sl, cmp), "squid"); - test_streq(smartlist_pqueue_pop(sl, cmp), "weissbier"); - test_streq(smartlist_pqueue_pop(sl, cmp), "zebras"); - test_eq(smartlist_len(sl), 0); - OK(); -#undef OK - smartlist_free(sl); -} - -static void -test_util_gzip(void) -{ - char *buf1, *buf2=NULL, *buf3=NULL, *cp1, *cp2; - const char *ccp2; - size_t len1, len2; - tor_zlib_state_t *state; - - buf1 = tor_strdup("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ"); - test_assert(detect_compression_method(buf1, strlen(buf1)) == UNKNOWN_METHOD); - if (is_gzip_supported()) { - test_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, - GZIP_METHOD)); - test_assert(buf2); - test_assert(!memcmp(buf2, "\037\213", 2)); /* Gzip magic. */ - test_assert(detect_compression_method(buf2, len1) == GZIP_METHOD); - - test_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1, - GZIP_METHOD, 1, LOG_INFO)); - test_assert(buf3); - test_streq(buf1,buf3); - - tor_free(buf2); - tor_free(buf3); - } - - test_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, - ZLIB_METHOD)); - test_assert(buf2); - test_assert(!memcmp(buf2, "\x78\xDA", 2)); /* deflate magic. */ - test_assert(detect_compression_method(buf2, len1) == ZLIB_METHOD); - - test_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1, - ZLIB_METHOD, 1, LOG_INFO)); - test_assert(buf3); - test_streq(buf1,buf3); - - /* Check whether we can uncompress concatenated, compresed strings. */ - tor_free(buf3); - buf2 = tor_realloc(buf2, len1*2); - memcpy(buf2+len1, buf2, len1); - test_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1*2, - ZLIB_METHOD, 1, LOG_INFO)); - test_eq(len2, (strlen(buf1)+1)*2); - test_memeq(buf3, - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0", - (strlen(buf1)+1)*2); - - 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."); - test_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, - ZLIB_METHOD)); - tor_assert(len1>16); - /* when we allow an uncomplete string, we should succeed.*/ - tor_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1-16, - ZLIB_METHOD, 0, LOG_INFO)); - buf3[len2]='\0'; - tor_assert(len2 > 5); - tor_assert(!strcmpstart(buf1, buf3)); - - /* when we demand a complete string, this must fail. */ - tor_free(buf3); - tor_assert(tor_gzip_uncompress(&buf3, &len2, buf2, len1-16, - ZLIB_METHOD, 1, LOG_INFO)); - tor_assert(!buf3); - - /* Now, try streaming compression. */ - tor_free(buf1); - tor_free(buf2); - tor_free(buf3); - state = tor_zlib_new(1, ZLIB_METHOD); - tor_assert(state); - cp1 = buf1 = tor_malloc(1024); - len1 = 1024; - ccp2 = "ABCDEFGHIJABCDEFGHIJ"; - len2 = 21; - test_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 0) - == TOR_ZLIB_OK); - test_eq(len2, 0); /* Make sure we compressed it all. */ - test_assert(cp1 > buf1); - - len2 = 0; - cp2 = cp1; - test_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 1) - == TOR_ZLIB_DONE); - test_eq(len2, 0); - test_assert(cp1 > cp2); /* Make sure we really added something. */ - - tor_assert(!tor_gzip_uncompress(&buf3, &len2, buf1, 1024-len1, - ZLIB_METHOD, 1, LOG_WARN)); - test_streq(buf3, "ABCDEFGHIJABCDEFGHIJ"); /*Make sure it compressed right.*/ - tor_free(buf3); - - tor_zlib_free(state); - - tor_free(buf2); - tor_free(buf3); - tor_free(buf1); -} - -static void -test_util_strmap(void) -{ - strmap_t *map; - strmap_iter_t *iter; - const char *k; - void *v; - char *visited; - smartlist_t *found_keys; - - map = strmap_new(); - v = strmap_set(map, "K1", (void*)99); - test_eq(v, NULL); - v = strmap_set(map, "K2", (void*)101); - test_eq(v, NULL); - v = strmap_set(map, "K1", (void*)100); - test_eq(v, (void*)99); - test_eq_ptr(strmap_get(map,"K1"), (void*)100); - test_eq_ptr(strmap_get(map,"K2"), (void*)101); - test_eq_ptr(strmap_get(map,"K-not-there"), NULL); - strmap_assert_ok(map); - - v = strmap_remove(map,"K2"); - strmap_assert_ok(map); - test_eq_ptr(v, (void*)101); - test_eq_ptr(strmap_get(map,"K2"), NULL); - test_eq_ptr(strmap_remove(map,"K2"), NULL); - - strmap_set(map, "K2", (void*)101); - strmap_set(map, "K3", (void*)102); - strmap_set(map, "K4", (void*)103); - strmap_assert_ok(map); - strmap_set(map, "K5", (void*)104); - strmap_set(map, "K6", (void*)105); - strmap_assert_ok(map); - - /* Test iterator. */ - iter = strmap_iter_init(map); - found_keys = smartlist_create(); - while (!strmap_iter_done(iter)) { - strmap_iter_get(iter,&k,&v); - smartlist_add(found_keys, tor_strdup(k)); - test_eq_ptr(v, strmap_get(map, k)); - - if (!strcmp(k, "K2")) { - iter = strmap_iter_next_rmv(map,iter); - } else { - iter = strmap_iter_next(map,iter); - } - } - - /* Make sure we removed K2, but not the others. */ - test_eq_ptr(strmap_get(map, "K2"), NULL); - test_eq_ptr(strmap_get(map, "K5"), (void*)104); - /* Make sure we visited everyone once */ - smartlist_sort_strings(found_keys); - visited = smartlist_join_strings(found_keys, ":", 0, NULL); - test_streq(visited, "K1:K2:K3:K4:K5:K6"); - tor_free(visited); - SMARTLIST_FOREACH(found_keys, char *, cp, tor_free(cp)); - smartlist_free(found_keys); - - strmap_assert_ok(map); - /* Clean up after ourselves. */ - strmap_free(map, NULL); - - /* Now try some lc functions. */ - map = strmap_new(); - strmap_set_lc(map,"Ab.C", (void*)1); - test_eq_ptr(strmap_get(map,"ab.c"), (void*)1); - strmap_assert_ok(map); - test_eq_ptr(strmap_get_lc(map,"AB.C"), (void*)1); - test_eq_ptr(strmap_get(map,"AB.C"), NULL); - test_eq_ptr(strmap_remove_lc(map,"aB.C"), (void*)1); - strmap_assert_ok(map); - test_eq_ptr(strmap_get_lc(map,"AB.C"), NULL); - strmap_free(map,NULL); -} - -static void -test_util_mmap(void) -{ - char *fname1 = tor_strdup(get_fname("mapped_1")); - char *fname2 = tor_strdup(get_fname("mapped_2")); - char *fname3 = tor_strdup(get_fname("mapped_3")); - const size_t buflen = 17000; - char *buf = tor_malloc(17000); - tor_mmap_t *mapping; - - crypto_rand(buf, buflen); - - write_str_to_file(fname1, "Short file.", 1); - write_bytes_to_file(fname2, buf, buflen, 1); - write_bytes_to_file(fname3, buf, 16384, 1); - - mapping = tor_mmap_file(fname1); - test_assert(mapping); - test_eq(mapping->size, strlen("Short file.")); - test_streq(mapping->data, "Short file."); -#ifdef MS_WINDOWS - tor_munmap_file(mapping); - test_assert(unlink(fname1) == 0); -#else - /* make sure we can unlink. */ - test_assert(unlink(fname1) == 0); - test_streq(mapping->data, "Short file."); - tor_munmap_file(mapping); -#endif - - /* Make sure that we fail to map a no-longer-existent file. */ - mapping = tor_mmap_file(fname1); - test_assert(mapping == NULL); - - /* Now try a big file that stretches across a few pages and isn't aligned */ - mapping = tor_mmap_file(fname2); - test_assert(mapping); - test_eq(mapping->size, buflen); - test_memeq(mapping->data, buf, buflen); - tor_munmap_file(mapping); - - /* Now try a big aligned file. */ - mapping = tor_mmap_file(fname3); - test_assert(mapping); - test_eq(mapping->size, 16384); - test_memeq(mapping->data, buf, 16384); - tor_munmap_file(mapping); - - /* fname1 got unlinked above */ - unlink(fname2); - unlink(fname3); - - tor_free(fname1); - tor_free(fname2); - tor_free(fname3); - tor_free(buf); -} - -static void -test_util_control_formats(void) -{ - char *out; - const char *inp = - "..This is a test\r\nof the emergency \nbroadcast\r\n..system.\r\nZ.\r\n"; - size_t sz; - - sz = read_escaped_data(inp, strlen(inp), &out); - test_streq(out, - ".This is a test\nof the emergency \nbroadcast\n.system.\nZ.\n"); - test_eq(sz, strlen(out)); - - tor_free(out); -} - -static void -test_onion_handshake(void) -{ - /* client-side */ - crypto_dh_env_t *c_dh = NULL; - char c_buf[ONIONSKIN_CHALLENGE_LEN]; - char c_keys[40]; - - /* server-side */ - char s_buf[ONIONSKIN_REPLY_LEN]; - char s_keys[40]; - - /* shared */ - crypto_pk_env_t *pk = NULL; - - pk = pk_generate(0); - - /* client handshake 1. */ - memset(c_buf, 0, ONIONSKIN_CHALLENGE_LEN); - test_assert(! onion_skin_create(pk, &c_dh, c_buf)); - - /* server handshake */ - memset(s_buf, 0, ONIONSKIN_REPLY_LEN); - memset(s_keys, 0, 40); - test_assert(! onion_skin_server_handshake(c_buf, pk, NULL, - s_buf, s_keys, 40)); - - /* client handshake 2 */ - memset(c_keys, 0, 40); - test_assert(! onion_skin_client_handshake(c_dh, s_buf, c_keys, 40)); - - crypto_dh_free(c_dh); - - if (memcmp(c_keys, s_keys, 40)) { - puts("Aiiiie"); - exit(1); - } - test_memeq(c_keys, s_keys, 40); - memset(s_buf, 0, 40); - test_memneq(c_keys, s_buf, 40); - crypto_free_pk_env(pk); -} - -extern smartlist_t *fingerprint_list; - -static void -test_dir_format(void) -{ - char buf[8192], buf2[8192]; - char platform[256]; - char fingerprint[FINGERPRINT_LEN+1]; - char *pk1_str = NULL, *pk2_str = NULL, *pk3_str = NULL, *cp; - size_t pk1_str_len, pk2_str_len, pk3_str_len; - routerinfo_t *r1, *r2; - crypto_pk_env_t *pk1 = NULL, *pk2 = NULL, *pk3 = NULL; - routerinfo_t *rp1 = NULL, *rp2 = NULL; - addr_policy_t *ex1, *ex2; - routerlist_t *dir1 = NULL, *dir2 = NULL; - tor_version_t ver1; - - pk1 = pk_generate(0); - pk2 = pk_generate(1); - pk3 = pk_generate(2); - - test_assert( is_legal_nickname("a")); - test_assert(!is_legal_nickname("")); - test_assert(!is_legal_nickname("abcdefghijklmnopqrst")); /* 20 chars */ - test_assert(!is_legal_nickname("hyphen-")); /* bad char */ - test_assert( is_legal_nickname("abcdefghijklmnopqrs")); /* 19 chars */ - test_assert(!is_legal_nickname("$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA")); - /* valid */ - test_assert( is_legal_nickname_or_hexdigest( - "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA")); - test_assert( is_legal_nickname_or_hexdigest( - "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA=fred")); - test_assert( is_legal_nickname_or_hexdigest( - "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA~fred")); - /* too short */ - test_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); - /* illegal char */ - test_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); - /* hex part too long */ - test_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); - test_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=fred")); - /* Bad nickname */ - test_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")); - test_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~")); - test_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~hyphen-")); - test_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~" - "abcdefghijklmnoppqrst")); - /* Bad extra char. */ - test_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!")); - test_assert(is_legal_nickname_or_hexdigest("xyzzy")); - test_assert(is_legal_nickname_or_hexdigest("abcdefghijklmnopqrs")); - test_assert(!is_legal_nickname_or_hexdigest("abcdefghijklmnopqrst")); - - get_platform_str(platform, sizeof(platform)); - r1 = tor_malloc_zero(sizeof(routerinfo_t)); - r1->address = tor_strdup("18.244.0.1"); - r1->addr = 0xc0a80001u; /* 192.168.0.1 */ - r1->cache_info.published_on = 0; - r1->or_port = 9000; - r1->dir_port = 9003; - r1->onion_pkey = crypto_pk_dup_key(pk1); - r1->identity_pkey = crypto_pk_dup_key(pk2); - r1->bandwidthrate = 1000; - r1->bandwidthburst = 5000; - r1->bandwidthcapacity = 10000; - r1->exit_policy = NULL; - r1->nickname = tor_strdup("Magri"); - r1->platform = tor_strdup(platform); - - ex1 = tor_malloc_zero(sizeof(addr_policy_t)); - ex2 = tor_malloc_zero(sizeof(addr_policy_t)); - ex1->policy_type = ADDR_POLICY_ACCEPT; - ex1->addr = 0; - ex1->maskbits = 0; - ex1->prt_min = ex1->prt_max = 80; - ex2->policy_type = ADDR_POLICY_REJECT; - ex2->addr = 18 << 24; - ex2->maskbits = 8; - ex2->prt_min = ex2->prt_max = 24; - r2 = tor_malloc_zero(sizeof(routerinfo_t)); - r2->address = tor_strdup("1.1.1.1"); - r2->addr = 0x0a030201u; /* 10.3.2.1 */ - r2->platform = tor_strdup(platform); - r2->cache_info.published_on = 5; - r2->or_port = 9005; - r2->dir_port = 0; - r2->onion_pkey = crypto_pk_dup_key(pk2); - r2->identity_pkey = crypto_pk_dup_key(pk1); - r2->bandwidthrate = r2->bandwidthburst = r2->bandwidthcapacity = 3000; - r2->exit_policy = smartlist_create(); - smartlist_add(r2->exit_policy, ex2); - smartlist_add(r2->exit_policy, ex1); - r2->nickname = tor_strdup("Fred"); - - test_assert(!crypto_pk_write_public_key_to_string(pk1, &pk1_str, - &pk1_str_len)); - test_assert(!crypto_pk_write_public_key_to_string(pk2 , &pk2_str, - &pk2_str_len)); - test_assert(!crypto_pk_write_public_key_to_string(pk3 , &pk3_str, - &pk3_str_len)); - - memset(buf, 0, 2048); - test_assert(router_dump_router_to_string(buf, 2048, r1, pk2)>0); - - strlcpy(buf2, "router Magri 18.244.0.1 9000 0 9003\n" - "platform Tor "VERSION" on ", sizeof(buf2)); - strlcat(buf2, get_uname(), sizeof(buf2)); - strlcat(buf2, "\n" - "opt protocols Link 1 2 Circuit 1\n" - "published 1970-01-01 00:00:00\n" - "opt fingerprint ", sizeof(buf2)); - test_assert(!crypto_pk_get_fingerprint(pk2, fingerprint, 1)); - strlcat(buf2, fingerprint, sizeof(buf2)); - strlcat(buf2, "\nuptime 0\n" - /* XXX the "0" above is hardcoded, but even if we made it reflect - * uptime, that still wouldn't make it right, because the two - * descriptors might be made on different seconds... hm. */ - "bandwidth 1000 5000 10000\n" - "opt extra-info-digest 0000000000000000000000000000000000000000\n" - "onion-key\n", sizeof(buf2)); - strlcat(buf2, pk1_str, sizeof(buf2)); - strlcat(buf2, "signing-key\n", sizeof(buf2)); - strlcat(buf2, pk2_str, sizeof(buf2)); - strlcat(buf2, "reject *:*\nrouter-signature\n", sizeof(buf2)); - buf[strlen(buf2)] = '\0'; /* Don't compare the sig; it's never the same - * twice */ - - test_streq(buf, buf2); - - test_assert(router_dump_router_to_string(buf, 2048, r1, pk2)>0); - cp = buf; - rp1 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL); - test_assert(rp1); - test_streq(rp1->address, r1->address); - test_eq(rp1->or_port, r1->or_port); - //test_eq(rp1->dir_port, r1->dir_port); - test_eq(rp1->bandwidthrate, r1->bandwidthrate); - test_eq(rp1->bandwidthburst, r1->bandwidthburst); - test_eq(rp1->bandwidthcapacity, r1->bandwidthcapacity); - test_assert(crypto_pk_cmp_keys(rp1->onion_pkey, pk1) == 0); - test_assert(crypto_pk_cmp_keys(rp1->identity_pkey, pk2) == 0); - test_assert(smartlist_len(rp1->exit_policy) == 1); - -#if 0 - /* XXX Once we have exit policies, test this again. XXX */ - strlcpy(buf2, "router tor.tor.tor 9005 0 0 3000\n", sizeof(buf2)); - strlcat(buf2, pk2_str, sizeof(buf2)); - strlcat(buf2, "signing-key\n", sizeof(buf2)); - strlcat(buf2, pk1_str, sizeof(buf2)); - strlcat(buf2, "accept *:80\nreject 18.*:24\n\n", sizeof(buf2)); - test_assert(router_dump_router_to_string(buf, 2048, &r2, pk2)>0); - test_streq(buf, buf2); - - cp = buf; - rp2 = router_parse_entry_from_string(&cp,1); - test_assert(rp2); - test_streq(rp2->address, r2.address); - test_eq(rp2->or_port, r2.or_port); - test_eq(rp2->dir_port, r2.dir_port); - test_eq(rp2->bandwidth, r2.bandwidth); - test_assert(crypto_pk_cmp_keys(rp2->onion_pkey, pk2) == 0); - test_assert(crypto_pk_cmp_keys(rp2->identity_pkey, pk1) == 0); - test_eq(rp2->exit_policy->policy_type, EXIT_POLICY_ACCEPT); - test_streq(rp2->exit_policy->string, "accept *:80"); - test_streq(rp2->exit_policy->address, "*"); - test_streq(rp2->exit_policy->port, "80"); - test_eq(rp2->exit_policy->next->policy_type, EXIT_POLICY_REJECT); - test_streq(rp2->exit_policy->next->string, "reject 18.*:24"); - test_streq(rp2->exit_policy->next->address, "18.*"); - test_streq(rp2->exit_policy->next->port, "24"); - test_assert(rp2->exit_policy->next->next == NULL); - - /* Okay, now for the directories. */ - { - fingerprint_list = smartlist_create(); - crypto_pk_get_fingerprint(pk2, buf, 1); - add_fingerprint_to_dir("Magri", buf, fingerprint_list); - crypto_pk_get_fingerprint(pk1, buf, 1); - add_fingerprint_to_dir("Fred", buf, fingerprint_list); - } - - { - char d[DIGEST_LEN]; - const char *m; - /* XXXX NM re-enable. */ - /* Make sure routers aren't too far in the past any more. */ - r1->cache_info.published_on = time(NULL); - r2->cache_info.published_on = time(NULL)-3*60*60; - test_assert(router_dump_router_to_string(buf, 2048, r1, pk2)>0); - test_eq(dirserv_add_descriptor(buf,&m), 2); - test_assert(router_dump_router_to_string(buf, 2048, r2, pk1)>0); - test_eq(dirserv_add_descriptor(buf,&m), 2); - get_options()->Nickname = tor_strdup("DirServer"); - test_assert(!dirserv_dump_directory_to_string(&cp,pk3, 0)); - crypto_pk_get_digest(pk3, d); - test_assert(!router_parse_directory(cp)); - test_eq(2, smartlist_len(dir1->routers)); - tor_free(cp); - } -#endif - dirserv_free_fingerprint_list(); - - tor_free(pk1_str); - tor_free(pk2_str); - tor_free(pk3_str); - if (pk1) crypto_free_pk_env(pk1); - if (pk2) crypto_free_pk_env(pk2); - if (pk3) crypto_free_pk_env(pk3); - if (rp1) routerinfo_free(rp1); - if (rp2) routerinfo_free(rp2); - tor_free(dir1); /* XXXX And more !*/ - tor_free(dir2); /* And more !*/ - routerinfo_free(r1); - routerinfo_free(r2); - - /* Try out version parsing functionality */ - test_eq(0, tor_version_parse("0.3.4pre2-cvs", &ver1)); - test_eq(0, ver1.major); - test_eq(3, ver1.minor); - test_eq(4, ver1.micro); - test_eq(VER_PRE, ver1.status); - test_eq(2, ver1.patchlevel); - test_eq(0, tor_version_parse("0.3.4rc1", &ver1)); - test_eq(0, ver1.major); - test_eq(3, ver1.minor); - test_eq(4, ver1.micro); - test_eq(VER_RC, ver1.status); - test_eq(1, ver1.patchlevel); - test_eq(0, tor_version_parse("1.3.4", &ver1)); - test_eq(1, ver1.major); - test_eq(3, ver1.minor); - test_eq(4, ver1.micro); - test_eq(VER_RELEASE, ver1.status); - test_eq(0, ver1.patchlevel); - test_eq(0, tor_version_parse("1.3.4.999", &ver1)); - test_eq(1, ver1.major); - test_eq(3, ver1.minor); - test_eq(4, ver1.micro); - test_eq(VER_RELEASE, ver1.status); - test_eq(999, ver1.patchlevel); - test_eq(0, tor_version_parse("0.1.2.4-alpha", &ver1)); - test_eq(0, ver1.major); - test_eq(1, ver1.minor); - test_eq(2, ver1.micro); - test_eq(4, ver1.patchlevel); - test_eq(VER_RELEASE, ver1.status); - test_streq("alpha", ver1.status_tag); - test_eq(0, tor_version_parse("0.1.2.4", &ver1)); - test_eq(0, ver1.major); - test_eq(1, ver1.minor); - test_eq(2, ver1.micro); - test_eq(4, ver1.patchlevel); - test_eq(VER_RELEASE, ver1.status); - test_streq("", ver1.status_tag); - -#define test_eq_vs(vs1, vs2) test_eq_type(version_status_t, "%d", (vs1), (vs2)) -#define test_v_i_o(val, ver, lst) \ - test_eq_vs(val, tor_version_is_obsolete(ver, lst)) - - /* make sure tor_version_is_obsolete() works */ - test_v_i_o(VS_OLD, "0.0.1", "Tor 0.0.2"); - test_v_i_o(VS_OLD, "0.0.1", "0.0.2, Tor 0.0.3"); - test_v_i_o(VS_OLD, "0.0.1", "0.0.2,Tor 0.0.3"); - test_v_i_o(VS_OLD, "0.0.1","0.0.3,BetterTor 0.0.1"); - test_v_i_o(VS_RECOMMENDED, "0.0.2", "Tor 0.0.2,Tor 0.0.3"); - test_v_i_o(VS_NEW_IN_SERIES, "0.0.2", "Tor 0.0.2pre1,Tor 0.0.3"); - test_v_i_o(VS_OLD, "0.0.2", "Tor 0.0.2.1,Tor 0.0.3"); - test_v_i_o(VS_NEW, "0.1.0", "Tor 0.0.2,Tor 0.0.3"); - test_v_i_o(VS_RECOMMENDED, "0.0.7rc2", "0.0.7,Tor 0.0.7rc2,Tor 0.0.8"); - test_v_i_o(VS_OLD, "0.0.5.0", "0.0.5.1-cvs"); - test_v_i_o(VS_NEW_IN_SERIES, "0.0.5.1-cvs", "0.0.5, 0.0.6"); - /* Not on list, but newer than any in same series. */ - test_v_i_o(VS_NEW_IN_SERIES, "0.1.0.3", - "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - /* Series newer than any on list. */ - test_v_i_o(VS_NEW, "0.1.2.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - /* Series older than any on list. */ - test_v_i_o(VS_OLD, "0.0.1.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - /* Not on list, not newer than any on same series. */ - test_v_i_o(VS_UNRECOMMENDED, "0.1.0.1", - "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - /* On list, not newer than any on same series. */ - test_v_i_o(VS_UNRECOMMENDED, - "0.1.0.1", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - test_eq(0, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs")); - test_eq(1, tor_version_as_new_as( - "Tor 0.0.8 on Darwin 64-121-192-100.c3-0." - "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", - "0.0.8rc2")); - test_eq(0, tor_version_as_new_as( - "Tor 0.0.8 on Darwin 64-121-192-100.c3-0." - "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8.2")); - - /* Now try svn revisions. */ - test_eq(1, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", - "Tor 0.2.1.0-dev (r99)")); - test_eq(1, tor_version_as_new_as("Tor 0.2.1.0-dev (r100) on Banana Jr", - "Tor 0.2.1.0-dev (r99) on Hal 9000")); - test_eq(1, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", - "Tor 0.2.1.0-dev on Colossus")); - test_eq(0, tor_version_as_new_as("Tor 0.2.1.0-dev (r99)", - "Tor 0.2.1.0-dev (r100)")); - test_eq(0, tor_version_as_new_as("Tor 0.2.1.0-dev (r99) on MCP", - "Tor 0.2.1.0-dev (r100) on AM")); - test_eq(0, tor_version_as_new_as("Tor 0.2.1.0-dev", - "Tor 0.2.1.0-dev (r99)")); - test_eq(1, tor_version_as_new_as("Tor 0.2.1.1", - "Tor 0.2.1.0-dev (r99)")); -} - -extern const char AUTHORITY_CERT_1[]; -extern const char AUTHORITY_SIGNKEY_1[]; -extern const char AUTHORITY_CERT_2[]; -extern const char AUTHORITY_SIGNKEY_2[]; -extern const char AUTHORITY_CERT_3[]; -extern const char AUTHORITY_SIGNKEY_3[]; - -static void -test_same_voter(networkstatus_voter_info_t *v1, - networkstatus_voter_info_t *v2) -{ - test_streq(v1->nickname, v2->nickname); - test_memeq(v1->identity_digest, v2->identity_digest, DIGEST_LEN); - test_streq(v1->address, v2->address); - test_eq(v1->addr, v2->addr); - test_eq(v1->dir_port, v2->dir_port); - test_eq(v1->or_port, v2->or_port); - test_streq(v1->contact, v2->contact); - test_memeq(v1->vote_digest, v2->vote_digest, DIGEST_LEN); -} - -static void -test_util_order_functions(void) -{ - int lst[25], n = 0; - // int a=12,b=24,c=25,d=60,e=77; - -#define median() median_int(lst, n) - - lst[n++] = 12; - test_eq(12, median()); /* 12 */ - lst[n++] = 77; - //smartlist_shuffle(sl); - test_eq(12, median()); /* 12, 77 */ - lst[n++] = 77; - //smartlist_shuffle(sl); - test_eq(77, median()); /* 12, 77, 77 */ - lst[n++] = 24; - test_eq(24, median()); /* 12,24,77,77 */ - lst[n++] = 60; - lst[n++] = 12; - lst[n++] = 25; - //smartlist_shuffle(sl); - test_eq(25, median()); /* 12,12,24,25,60,77,77 */ -#undef median -} - -static void -test_v3_networkstatus(void) -{ - authority_cert_t *cert1, *cert2, *cert3; - crypto_pk_env_t *sign_skey_1, *sign_skey_2, *sign_skey_3; - crypto_pk_env_t *sign_skey_leg1; - - time_t now = time(NULL); - networkstatus_voter_info_t *voter; - networkstatus_t *vote, *v1, *v2, *v3, *con; - vote_routerstatus_t *vrs; - routerstatus_t *rs; - char *v1_text, *v2_text, *v3_text, *consensus_text, *cp; - smartlist_t *votes = smartlist_create(); - - /* Parse certificates and keys. */ - cert1 = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); - test_assert(cert1); - cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL); - test_assert(cert2); - cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL); - test_assert(cert3); - sign_skey_1 = crypto_new_pk_env(); - sign_skey_2 = crypto_new_pk_env(); - sign_skey_3 = crypto_new_pk_env(); - sign_skey_leg1 = pk_generate(4); - - test_assert(!crypto_pk_read_private_key_from_string(sign_skey_1, - AUTHORITY_SIGNKEY_1)); - test_assert(!crypto_pk_read_private_key_from_string(sign_skey_2, - AUTHORITY_SIGNKEY_2)); - test_assert(!crypto_pk_read_private_key_from_string(sign_skey_3, - AUTHORITY_SIGNKEY_3)); - - test_assert(!crypto_pk_cmp_keys(sign_skey_1, cert1->signing_key)); - test_assert(!crypto_pk_cmp_keys(sign_skey_2, cert2->signing_key)); - - /* - * Set up a vote; generate it; try to parse it. - */ - vote = tor_malloc_zero(sizeof(networkstatus_t)); - vote->is_vote = 1; - vote->published = now; - vote->valid_after = now+1000; - vote->fresh_until = now+2000; - vote->valid_until = now+3000; - vote->vote_seconds = 100; - vote->dist_seconds = 200; - vote->supported_methods = smartlist_create(); - smartlist_split_string(vote->supported_methods, "1 2 3", NULL, 0, -1); - vote->client_versions = tor_strdup("0.1.2.14,0.1.2.15"); - vote->server_versions = tor_strdup("0.1.2.14,0.1.2.15,0.1.2.16"); - vote->known_flags = smartlist_create(); - smartlist_split_string(vote->known_flags, - "Authority Exit Fast Guard Running Stable V2Dir Valid", - 0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - vote->voters = smartlist_create(); - voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); - voter->nickname = tor_strdup("Voter1"); - voter->address = tor_strdup("1.2.3.4"); - voter->addr = 0x01020304; - voter->dir_port = 80; - voter->or_port = 9000; - voter->contact = tor_strdup("voter@example.com"); - crypto_pk_get_digest(cert1->identity_key, voter->identity_digest); - smartlist_add(vote->voters, voter); - vote->cert = authority_cert_dup(cert1); - vote->routerstatus_list = smartlist_create(); - /* add the first routerstatus. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.1.2.14"); - rs->published_on = now-1500; - strlcpy(rs->nickname, "router2", sizeof(rs->nickname)); - memset(rs->identity_digest, 3, DIGEST_LEN); - memset(rs->descriptor_digest, 78, DIGEST_LEN); - rs->addr = 0x99008801; - rs->or_port = 443; - rs->dir_port = 8000; - /* all flags cleared */ - smartlist_add(vote->routerstatus_list, vrs); - /* add the second routerstatus. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.2.0.5"); - rs->published_on = now-1000; - strlcpy(rs->nickname, "router1", sizeof(rs->nickname)); - memset(rs->identity_digest, 5, DIGEST_LEN); - memset(rs->descriptor_digest, 77, DIGEST_LEN); - rs->addr = 0x99009901; - rs->or_port = 443; - rs->dir_port = 0; - rs->is_exit = rs->is_stable = rs->is_fast = rs->is_running = - rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1; - smartlist_add(vote->routerstatus_list, vrs); - /* add the third routerstatus. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.1.0.3"); - rs->published_on = now-1000; - strlcpy(rs->nickname, "router3", sizeof(rs->nickname)); - memset(rs->identity_digest, 33, DIGEST_LEN); - memset(rs->descriptor_digest, 78, DIGEST_LEN); - rs->addr = 0xAA009901; - rs->or_port = 400; - rs->dir_port = 9999; - rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast = - rs->is_running = rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1; - smartlist_add(vote->routerstatus_list, vrs); - - /* dump the vote and try to parse it. */ - v1_text = format_networkstatus_vote(sign_skey_1, vote); - test_assert(v1_text); - v1 = networkstatus_parse_vote_from_string(v1_text, NULL, 1); - test_assert(v1); - - /* Make sure the parsed thing was right. */ - test_eq(v1->is_vote, 1); - test_eq(v1->published, vote->published); - test_eq(v1->valid_after, vote->valid_after); - test_eq(v1->fresh_until, vote->fresh_until); - test_eq(v1->valid_until, vote->valid_until); - test_eq(v1->vote_seconds, vote->vote_seconds); - test_eq(v1->dist_seconds, vote->dist_seconds); - test_streq(v1->client_versions, vote->client_versions); - test_streq(v1->server_versions, vote->server_versions); - test_assert(v1->voters && smartlist_len(v1->voters)); - voter = smartlist_get(v1->voters, 0); - test_streq(voter->nickname, "Voter1"); - test_streq(voter->address, "1.2.3.4"); - test_eq(voter->addr, 0x01020304); - test_eq(voter->dir_port, 80); - test_eq(voter->or_port, 9000); - test_streq(voter->contact, "voter@example.com"); - test_assert(v1->cert); - test_assert(!crypto_pk_cmp_keys(sign_skey_1, v1->cert->signing_key)); - cp = smartlist_join_strings(v1->known_flags, ":", 0, NULL); - test_streq(cp, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid"); - tor_free(cp); - test_eq(smartlist_len(v1->routerstatus_list), 3); - /* Check the first routerstatus. */ - vrs = smartlist_get(v1->routerstatus_list, 0); - rs = &vrs->status; - test_streq(vrs->version, "0.1.2.14"); - test_eq(rs->published_on, now-1500); - test_streq(rs->nickname, "router2"); - test_memeq(rs->identity_digest, - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", - DIGEST_LEN); - test_memeq(rs->descriptor_digest, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); - test_eq(rs->addr, 0x99008801); - test_eq(rs->or_port, 443); - test_eq(rs->dir_port, 8000); - test_eq(vrs->flags, U64_LITERAL(0)); - /* Check the second routerstatus. */ - vrs = smartlist_get(v1->routerstatus_list, 1); - rs = &vrs->status; - test_streq(vrs->version, "0.2.0.5"); - test_eq(rs->published_on, now-1000); - test_streq(rs->nickname, "router1"); - test_memeq(rs->identity_digest, - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", - DIGEST_LEN); - test_memeq(rs->descriptor_digest, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); - test_eq(rs->addr, 0x99009901); - test_eq(rs->or_port, 443); - test_eq(rs->dir_port, 0); - test_eq(vrs->flags, U64_LITERAL(254)); // all flags except "authority." - - /* Generate second vote. It disagrees on some of the times, - * and doesn't list versions, and knows some crazy flags */ - vote->published = now+1; - vote->fresh_until = now+3005; - vote->dist_seconds = 300; - authority_cert_free(vote->cert); - vote->cert = authority_cert_dup(cert2); - tor_free(vote->client_versions); - tor_free(vote->server_versions); - voter = smartlist_get(vote->voters, 0); - tor_free(voter->nickname); - tor_free(voter->address); - voter->nickname = tor_strdup("Voter2"); - voter->address = tor_strdup("2.3.4.5"); - voter->addr = 0x02030405; - crypto_pk_get_digest(cert2->identity_key, voter->identity_digest); - smartlist_add(vote->known_flags, tor_strdup("MadeOfCheese")); - smartlist_add(vote->known_flags, tor_strdup("MadeOfTin")); - smartlist_sort_strings(vote->known_flags); - vrs = smartlist_get(vote->routerstatus_list, 2); - smartlist_del_keeporder(vote->routerstatus_list, 2); - tor_free(vrs->version); - tor_free(vrs); - vrs = smartlist_get(vote->routerstatus_list, 0); - vrs->status.is_fast = 1; - /* generate and parse. */ - v2_text = format_networkstatus_vote(sign_skey_2, vote); - test_assert(v2_text); - v2 = networkstatus_parse_vote_from_string(v2_text, NULL, 1); - test_assert(v2); - /* Check that flags come out right.*/ - cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL); - test_streq(cp, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" - "Running:Stable:V2Dir:Valid"); - tor_free(cp); - vrs = smartlist_get(v2->routerstatus_list, 1); - /* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) */ - test_eq(vrs->flags, U64_LITERAL(974)); - - /* Generate the third vote. */ - vote->published = now; - vote->fresh_until = now+2003; - vote->dist_seconds = 250; - authority_cert_free(vote->cert); - vote->cert = authority_cert_dup(cert3); - smartlist_add(vote->supported_methods, tor_strdup("4")); - vote->client_versions = tor_strdup("0.1.2.14,0.1.2.17"); - vote->server_versions = tor_strdup("0.1.2.10,0.1.2.15,0.1.2.16"); - voter = smartlist_get(vote->voters, 0); - tor_free(voter->nickname); - tor_free(voter->address); - voter->nickname = tor_strdup("Voter3"); - voter->address = tor_strdup("3.4.5.6"); - voter->addr = 0x03040506; - crypto_pk_get_digest(cert3->identity_key, voter->identity_digest); - /* This one has a legacy id. */ - memset(voter->legacy_id_digest, (int)'A', DIGEST_LEN); - vrs = smartlist_get(vote->routerstatus_list, 0); - smartlist_del_keeporder(vote->routerstatus_list, 0); - tor_free(vrs->version); - tor_free(vrs); - vrs = smartlist_get(vote->routerstatus_list, 0); - memset(vrs->status.descriptor_digest, (int)'Z', DIGEST_LEN); - - v3_text = format_networkstatus_vote(sign_skey_3, vote); - test_assert(v3_text); - - v3 = networkstatus_parse_vote_from_string(v3_text, NULL, 1); - test_assert(v3); - - /* Compute a consensus as voter 3. */ - smartlist_add(votes, v3); - smartlist_add(votes, v1); - smartlist_add(votes, v2); - consensus_text = networkstatus_compute_consensus(votes, 3, - cert3->identity_key, - sign_skey_3, - "AAAAAAAAAAAAAAAAAAAA", - sign_skey_leg1); - test_assert(consensus_text); - con = networkstatus_parse_vote_from_string(consensus_text, NULL, 0); - test_assert(con); - //log_notice(LD_GENERAL, "<<%s>>\n<<%s>>\n<<%s>>\n", - // v1_text, v2_text, v3_text); - - /* Check consensus contents. */ - test_assert(!con->is_vote); - test_eq(con->published, 0); /* this field only appears in votes. */ - test_eq(con->valid_after, now+1000); - test_eq(con->fresh_until, now+2003); /* median */ - test_eq(con->valid_until, now+3000); - test_eq(con->vote_seconds, 100); - test_eq(con->dist_seconds, 250); /* median */ - test_streq(con->client_versions, "0.1.2.14"); - test_streq(con->server_versions, "0.1.2.15,0.1.2.16"); - cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL); - test_streq(cp, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" - "Running:Stable:V2Dir:Valid"); - tor_free(cp); - test_eq(4, smartlist_len(con->voters)); /*3 voters, 1 legacy key.*/ - /* The voter id digests should be in this order. */ - test_assert(memcmp(cert2->cache_info.identity_digest, - cert3->cache_info.identity_digest,DIGEST_LEN)<0); - test_assert(memcmp(cert3->cache_info.identity_digest, - cert1->cache_info.identity_digest,DIGEST_LEN)<0); - test_same_voter(smartlist_get(con->voters, 1), - smartlist_get(v2->voters, 0)); - test_same_voter(smartlist_get(con->voters, 2), - smartlist_get(v3->voters, 0)); - test_same_voter(smartlist_get(con->voters, 3), - smartlist_get(v1->voters, 0)); - - test_assert(!con->cert); - test_eq(2, smartlist_len(con->routerstatus_list)); - /* There should be two listed routers: one with identity 3, one with - * identity 5. */ - /* This one showed up in 2 digests. */ - rs = smartlist_get(con->routerstatus_list, 0); - test_memeq(rs->identity_digest, - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", - DIGEST_LEN); - test_memeq(rs->descriptor_digest, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); - test_assert(!rs->is_authority); - test_assert(!rs->is_exit); - test_assert(!rs->is_fast); - test_assert(!rs->is_possible_guard); - test_assert(!rs->is_stable); - test_assert(!rs->is_running); - test_assert(!rs->is_v2_dir); - test_assert(!rs->is_valid); - test_assert(!rs->is_named); - /* XXXX check version */ - - rs = smartlist_get(con->routerstatus_list, 1); - /* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'. */ - test_memeq(rs->identity_digest, - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", - DIGEST_LEN); - test_streq(rs->nickname, "router1"); - test_memeq(rs->descriptor_digest, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); - test_eq(rs->published_on, now-1000); - test_eq(rs->addr, 0x99009901); - test_eq(rs->or_port, 443); - test_eq(rs->dir_port, 0); - test_assert(!rs->is_authority); - test_assert(rs->is_exit); - test_assert(rs->is_fast); - test_assert(rs->is_possible_guard); - test_assert(rs->is_stable); - test_assert(rs->is_running); - test_assert(rs->is_v2_dir); - test_assert(rs->is_valid); - test_assert(!rs->is_named); - /* XXXX check version */ - - /* Check signatures. the first voter is pseudo. The second one hasn't - signed. The third one has signed: validate it. */ - voter = smartlist_get(con->voters, 1); - test_assert(!voter->signature); - test_assert(!voter->good_signature); - test_assert(!voter->bad_signature); - - voter = smartlist_get(con->voters, 2); - test_assert(voter->signature); - test_assert(!voter->good_signature); - test_assert(!voter->bad_signature); - test_assert(!networkstatus_check_voter_signature(con, - smartlist_get(con->voters, 2), - cert3)); - test_assert(voter->signature); - test_assert(voter->good_signature); - test_assert(!voter->bad_signature); - - { - char *consensus_text2, *consensus_text3; - networkstatus_t *con2, *con3; - char *detached_text1, *detached_text2; - ns_detached_signatures_t *dsig1, *dsig2; - const char *msg=NULL; - /* Compute the other two signed consensuses. */ - smartlist_shuffle(votes); - consensus_text2 = networkstatus_compute_consensus(votes, 3, - cert2->identity_key, - sign_skey_2, NULL,NULL); - smartlist_shuffle(votes); - consensus_text3 = networkstatus_compute_consensus(votes, 3, - cert1->identity_key, - sign_skey_1, NULL,NULL); - test_assert(consensus_text2); - test_assert(consensus_text3); - con2 = networkstatus_parse_vote_from_string(consensus_text2, NULL, 0); - con3 = networkstatus_parse_vote_from_string(consensus_text3, NULL, 0); - test_assert(con2); - test_assert(con3); - - /* All three should have the same digest. */ - test_memeq(con->networkstatus_digest, con2->networkstatus_digest, - DIGEST_LEN); - test_memeq(con->networkstatus_digest, con3->networkstatus_digest, - DIGEST_LEN); - - /* Extract a detached signature from con3. */ - detached_text1 = networkstatus_get_detached_signatures(con3); - tor_assert(detached_text1); - /* Try to parse it. */ - dsig1 = networkstatus_parse_detached_signatures(detached_text1, NULL); - tor_assert(dsig1); - - /* Are parsed values as expected? */ - test_eq(dsig1->valid_after, con3->valid_after); - test_eq(dsig1->fresh_until, con3->fresh_until); - test_eq(dsig1->valid_until, con3->valid_until); - test_memeq(dsig1->networkstatus_digest, con3->networkstatus_digest, - DIGEST_LEN); - test_eq(1, smartlist_len(dsig1->signatures)); - voter = smartlist_get(dsig1->signatures, 0); - test_memeq(voter->identity_digest, cert1->cache_info.identity_digest, - DIGEST_LEN); - - /* Try adding it to con2. */ - detached_text2 = networkstatus_get_detached_signatures(con2); - test_eq(1, networkstatus_add_detached_signatures(con2, dsig1, &msg)); - tor_free(detached_text2); - detached_text2 = networkstatus_get_detached_signatures(con2); - //printf("\n<%s>\n", detached_text2); - dsig2 = networkstatus_parse_detached_signatures(detached_text2, NULL); - test_assert(dsig2); - /* - printf("\n"); - SMARTLIST_FOREACH(dsig2->signatures, networkstatus_voter_info_t *, vi, { - char hd[64]; - base16_encode(hd, sizeof(hd), vi->identity_digest, DIGEST_LEN); - printf("%s\n", hd); - }); - */ - test_eq(2, smartlist_len(dsig2->signatures)); - - /* Try adding to con2 twice; verify that nothing changes. */ - test_eq(0, networkstatus_add_detached_signatures(con2, dsig1, &msg)); - - /* Add to con. */ - test_eq(2, networkstatus_add_detached_signatures(con, dsig2, &msg)); - /* Check signatures */ - test_assert(!networkstatus_check_voter_signature(con, - smartlist_get(con->voters, 1), - cert2)); - test_assert(!networkstatus_check_voter_signature(con, - smartlist_get(con->voters, 3), - cert1)); - - networkstatus_vote_free(con2); - networkstatus_vote_free(con3); - tor_free(consensus_text2); - tor_free(consensus_text3); - tor_free(detached_text1); - tor_free(detached_text2); - ns_detached_signatures_free(dsig1); - ns_detached_signatures_free(dsig2); - } - - smartlist_free(votes); - tor_free(v1_text); - tor_free(v2_text); - tor_free(v3_text); - tor_free(consensus_text); - networkstatus_vote_free(vote); - networkstatus_vote_free(v1); - networkstatus_vote_free(v2); - networkstatus_vote_free(v3); - networkstatus_vote_free(con); - crypto_free_pk_env(sign_skey_1); - crypto_free_pk_env(sign_skey_2); - crypto_free_pk_env(sign_skey_3); - authority_cert_free(cert1); - authority_cert_free(cert2); - authority_cert_free(cert3); -} - -static void -test_policies(void) -{ - smartlist_t *policy, *policy2; - addr_policy_t *p; - tor_addr_t tar; - config_line_t line; - - policy = smartlist_create(); - - p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",-1); - test_eq(ADDR_POLICY_REJECT, p->policy_type); - tor_addr_from_ipv4(&tar, 0xc0a80000u); - test_assert(p->addr == 0xc0a80000u); - test_eq(16, p->maskbits); - test_eq(1, p->prt_min); - test_eq(65535, p->prt_max); - - smartlist_add(policy, p); - - test_assert(ADDR_POLICY_ACCEPTED == - compare_addr_to_addr_policy(0x01020304u, 2, policy)); - test_assert(ADDR_POLICY_PROBABLY_ACCEPTED == - compare_addr_to_addr_policy(0, 2, policy)); - test_assert(ADDR_POLICY_REJECTED == - compare_addr_to_addr_policy(0xc0a80102, 2, policy)); - test_assert(ADDR_POLICY_ACCEPTED == - compare_addr_to_addr_policy(0x01020304u, 2, NULL)); - - policy2 = NULL; - test_assert(0 == policies_parse_exit_policy(NULL, &policy2, 1, NULL)); - test_assert(policy2); - - test_assert(!exit_policy_is_general_exit(policy)); - test_assert(exit_policy_is_general_exit(policy2)); - test_assert(!exit_policy_is_general_exit(NULL)); - - test_assert(cmp_addr_policies(policy, policy2)); - test_assert(cmp_addr_policies(policy, NULL)); - test_assert(!cmp_addr_policies(policy2, policy2)); - test_assert(!cmp_addr_policies(NULL, NULL)); - - test_assert(!policy_is_reject_star(policy2)); - test_assert(policy_is_reject_star(policy)); - test_assert(policy_is_reject_star(NULL)); - - addr_policy_list_free(policy); - addr_policy_list_free(policy2); - - /* make sure compacting logic works. */ - policy = NULL; - line.key = (char*)"foo"; - line.value = (char*)"accept *:80,reject private:*,reject *:*"; - line.next = NULL; - test_assert(0 == policies_parse_exit_policy(&line, &policy, 0, NULL)); - test_assert(policy); - //test_streq(policy->string, "accept *:80"); - //test_streq(policy->next->string, "reject *:*"); - test_eq(smartlist_len(policy), 2); - - addr_policy_list_free(policy); -} - -static void -test_rend_fns(void) -{ - char address1[] = "fooaddress.onion"; - char address2[] = "aaaaaaaaaaaaaaaa.onion"; - char address3[] = "fooaddress.exit"; - char address4[] = "www.torproject.org"; - rend_service_descriptor_t *d1, *d2; - char *encoded; - size_t len; - crypto_pk_env_t *pk1, *pk2; - time_t now; - int i; - pk1 = pk_generate(0); - pk2 = pk_generate(1); - - /* Test unversioned (v0) descriptor */ - d1 = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - d1->pk = crypto_pk_dup_key(pk1); - now = time(NULL); - d1->timestamp = now; - d1->version = 0; - d1->intro_nodes = smartlist_create(); - for (i = 0; i < 3; i++) { - rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t)); - intro->extend_info = tor_malloc_zero(sizeof(extend_info_t)); - crypto_rand(intro->extend_info->identity_digest, DIGEST_LEN); - intro->extend_info->nickname[0] = '$'; - base16_encode(intro->extend_info->nickname+1, HEX_DIGEST_LEN+1, - intro->extend_info->identity_digest, DIGEST_LEN); - smartlist_add(d1->intro_nodes, intro); - } - test_assert(! rend_encode_service_descriptor(d1, pk1, &encoded, &len)); - d2 = rend_parse_service_descriptor(encoded, len); - test_assert(d2); - - test_assert(!crypto_pk_cmp_keys(d1->pk, d2->pk)); - test_eq(d2->timestamp, now); - test_eq(d2->version, 0); - test_eq(d2->protocols, 1<<2); - test_eq(smartlist_len(d2->intro_nodes), 3); - for (i = 0; i < 3; i++) { - rend_intro_point_t *intro1 = smartlist_get(d1->intro_nodes, i); - rend_intro_point_t *intro2 = smartlist_get(d2->intro_nodes, i); - test_streq(intro1->extend_info->nickname, - intro2->extend_info->nickname); - } - - rend_service_descriptor_free(d1); - rend_service_descriptor_free(d2); - tor_free(encoded); - - test_assert(BAD_HOSTNAME == parse_extended_hostname(address1)); - test_assert(ONION_HOSTNAME == parse_extended_hostname(address2)); - test_assert(EXIT_HOSTNAME == parse_extended_hostname(address3)); - test_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4)); - - crypto_free_pk_env(pk1); - crypto_free_pk_env(pk2); -} - -static void -bench_aes(void) -{ - int len, i; - char *b1, *b2; - crypto_cipher_env_t *c; - struct timeval start, end; - const int iters = 100000; - uint64_t nsec; - c = crypto_new_cipher_env(); - crypto_cipher_generate_key(c); - crypto_cipher_encrypt_init_cipher(c); - for (len = 1; len <= 8192; len *= 2) { - b1 = tor_malloc_zero(len); - b2 = tor_malloc_zero(len); - tor_gettimeofday(&start); - for (i = 0; i < iters; ++i) { - crypto_cipher_encrypt(c, b1, b2, len); - } - tor_gettimeofday(&end); - tor_free(b1); - tor_free(b2); - nsec = (uint64_t) tv_udiff(&start,&end); - nsec *= 1000; - nsec /= (iters*len); - printf("%d bytes: "U64_FORMAT" nsec per byte\n", len, - U64_PRINTF_ARG(nsec)); - } - crypto_free_cipher_env(c); -} - -static void -test_util_mempool(void) -{ - mp_pool_t *pool; - smartlist_t *allocated; - int i; - - pool = mp_pool_new(1, 100); - test_assert(pool->new_chunk_capacity >= 100); - test_assert(pool->item_alloc_size >= sizeof(void*)+1); - mp_pool_destroy(pool); - - pool = mp_pool_new(241, 2500); - test_assert(pool->new_chunk_capacity >= 10); - test_assert(pool->item_alloc_size >= sizeof(void*)+241); - test_eq(pool->item_alloc_size & 0x03, 0); - test_assert(pool->new_chunk_capacity < 60); - - allocated = smartlist_create(); - for (i = 0; i < 100000; ++i) { - if (smartlist_len(allocated) < 20 || crypto_rand_int(2)) { - void *m = mp_pool_get(pool); - memset(m, 0x09, 241); - smartlist_add(allocated, m); - //printf("%d: %p\n", i, m); - //mp_pool_assert_ok(pool); - } else { - int idx = crypto_rand_int(smartlist_len(allocated)); - void *m = smartlist_get(allocated, idx); - //printf("%d: free %p\n", i, m); - smartlist_del(allocated, idx); - mp_pool_release(m); - //mp_pool_assert_ok(pool); - } - if (crypto_rand_int(777)==0) - mp_pool_clean(pool, 1, 1); - - if (i % 777) - mp_pool_assert_ok(pool); - } - SMARTLIST_FOREACH(allocated, void *, m, mp_pool_release(m)); - mp_pool_assert_ok(pool); - mp_pool_clean(pool, 0, 0); - mp_pool_assert_ok(pool); - mp_pool_destroy(pool); - smartlist_free(allocated); -} - -static void -test_util_datadir(void) -{ - char buf[1024]; - char *f; - - f = get_datadir_fname(NULL); - test_streq(f, temp_dir); - tor_free(f); - f = get_datadir_fname("state"); - tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"state", temp_dir); - test_streq(f, buf); - tor_free(f); - f = get_datadir_fname2("cache", "thingy"); - tor_snprintf(buf, sizeof(buf), - "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy", temp_dir); - test_streq(f, buf); - tor_free(f); - f = get_datadir_fname2_suffix("cache", "thingy", ".foo"); - tor_snprintf(buf, sizeof(buf), - "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy.foo", temp_dir); - test_streq(f, buf); - tor_free(f); - f = get_datadir_fname_suffix("cache", ".foo"); - tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"cache.foo", - temp_dir); - test_streq(f, buf); - tor_free(f); -} - -/* Test AES-CTR encryption and decryption with IV. */ -static void -test_crypto_aes_iv(void) -{ - crypto_cipher_env_t *cipher; - char *plain, *encrypted1, *encrypted2, *decrypted1, *decrypted2; - char plain_1[1], plain_15[15], plain_16[16], plain_17[17]; - char key1[16], key2[16]; - size_t encrypted_size, decrypted_size; - plain = tor_malloc(4095); - encrypted1 = tor_malloc(4095 + 1 + 16); - encrypted2 = tor_malloc(4095 + 1 + 16); - decrypted1 = tor_malloc(4095 + 1); - decrypted2 = tor_malloc(4095 + 1); - crypto_rand(plain, 4095); - crypto_rand(key1, 16); - crypto_rand(key2, 16); - crypto_rand(plain_1, 1); - crypto_rand(plain_15, 15); - crypto_rand(plain_16, 16); - crypto_rand(plain_17, 17); - key1[0] = key2[0] + 128; /* Make sure that contents are different. */ - /* Encrypt and decrypt with the same key. */ - cipher = crypto_create_init_cipher(key1, 1); - encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 4095, - plain, 4095); - crypto_free_cipher_env(cipher); - test_eq(encrypted_size, 16 + 4095); - cipher = crypto_create_init_cipher(key1, 0); - decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 4095, - encrypted1, encrypted_size); - crypto_free_cipher_env(cipher); - test_eq(decrypted_size, 4095); - test_memeq(plain, decrypted1, 4095); - /* Encrypt a second time (with a new random initialization vector). */ - cipher = crypto_create_init_cipher(key1, 1); - encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted2, 16 + 4095, - plain, 4095); - crypto_free_cipher_env(cipher); - test_eq(encrypted_size, 16 + 4095); - cipher = crypto_create_init_cipher(key1, 0); - decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted2, 4095, - encrypted2, encrypted_size); - crypto_free_cipher_env(cipher); - test_eq(decrypted_size, 4095); - test_memeq(plain, decrypted2, 4095); - test_memneq(encrypted1, encrypted2, encrypted_size); - /* Decrypt with the wrong key. */ - cipher = crypto_create_init_cipher(key2, 0); - decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted2, 4095, - encrypted1, encrypted_size); - crypto_free_cipher_env(cipher); - test_memneq(plain, decrypted2, encrypted_size); - /* Alter the initialization vector. */ - encrypted1[0] += 42; - cipher = crypto_create_init_cipher(key1, 0); - decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 4095, - encrypted1, encrypted_size); - crypto_free_cipher_env(cipher); - test_memneq(plain, decrypted2, 4095); - /* Special length case: 1. */ - cipher = crypto_create_init_cipher(key1, 1); - encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 1, - plain_1, 1); - crypto_free_cipher_env(cipher); - test_eq(encrypted_size, 16 + 1); - cipher = crypto_create_init_cipher(key1, 0); - decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 1, - encrypted1, encrypted_size); - crypto_free_cipher_env(cipher); - test_eq(decrypted_size, 1); - test_memeq(plain_1, decrypted1, 1); - /* Special length case: 15. */ - cipher = crypto_create_init_cipher(key1, 1); - encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 15, - plain_15, 15); - crypto_free_cipher_env(cipher); - test_eq(encrypted_size, 16 + 15); - cipher = crypto_create_init_cipher(key1, 0); - decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 15, - encrypted1, encrypted_size); - crypto_free_cipher_env(cipher); - test_eq(decrypted_size, 15); - test_memeq(plain_15, decrypted1, 15); - /* Special length case: 16. */ - cipher = crypto_create_init_cipher(key1, 1); - encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 16, - plain_16, 16); - crypto_free_cipher_env(cipher); - test_eq(encrypted_size, 16 + 16); - cipher = crypto_create_init_cipher(key1, 0); - decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 16, - encrypted1, encrypted_size); - crypto_free_cipher_env(cipher); - test_eq(decrypted_size, 16); - test_memeq(plain_16, decrypted1, 16); - /* Special length case: 17. */ - cipher = crypto_create_init_cipher(key1, 1); - encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 17, - plain_17, 17); - crypto_free_cipher_env(cipher); - test_eq(encrypted_size, 16 + 17); - cipher = crypto_create_init_cipher(key1, 0); - decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 17, - encrypted1, encrypted_size); - crypto_free_cipher_env(cipher); - test_eq(decrypted_size, 17); - test_memeq(plain_17, decrypted1, 17); - /* Free memory. */ - tor_free(plain); - tor_free(encrypted1); - tor_free(encrypted2); - tor_free(decrypted1); - tor_free(decrypted2); -} - -/* Test base32 decoding. */ -static void -test_crypto_base32_decode(void) -{ - char plain[60], encoded[96 + 1], decoded[60]; - int res; - crypto_rand(plain, 60); - /* Encode and decode a random string. */ - base32_encode(encoded, 96 + 1, plain, 60); - res = base32_decode(decoded, 60, encoded, 96); - test_eq(res, 0); - test_memeq(plain, decoded, 60); - /* Encode, uppercase, and decode a random string. */ - base32_encode(encoded, 96 + 1, plain, 60); - tor_strupper(encoded); - res = base32_decode(decoded, 60, encoded, 96); - test_eq(res, 0); - test_memeq(plain, decoded, 60); - /* Change encoded string and decode. */ - if (encoded[0] == 'A' || encoded[0] == 'a') - encoded[0] = 'B'; - else - encoded[0] = 'A'; - res = base32_decode(decoded, 60, encoded, 96); - test_eq(res, 0); - test_memneq(plain, decoded, 60); -} - -/* Test encoding and parsing of v2 rendezvous service descriptors. */ -static void -test_rend_fns_v2(void) -{ - rend_service_descriptor_t *generated, *parsed; - char service_id[DIGEST_LEN]; - char service_id_base32[REND_SERVICE_ID_LEN_BASE32+1]; - const char *next_desc; - smartlist_t *descs = smartlist_create(); - char computed_desc_id[DIGEST_LEN]; - char parsed_desc_id[DIGEST_LEN]; - crypto_pk_env_t *pk1, *pk2; - time_t now; - char *intro_points_encrypted; - size_t intro_points_size; - size_t encoded_size; - int i; - pk1 = pk_generate(0); - pk2 = pk_generate(1); - generated = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - generated->pk = crypto_pk_dup_key(pk1); - crypto_pk_get_digest(generated->pk, service_id); - base32_encode(service_id_base32, REND_SERVICE_ID_LEN_BASE32+1, - service_id, REND_SERVICE_ID_LEN); - now = time(NULL); - generated->timestamp = now; - generated->version = 2; - generated->protocols = 42; - generated->intro_nodes = smartlist_create(); - for (i = 0; i < 3; i++) { - rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t)); - crypto_pk_env_t *okey = pk_generate(2 + i); - intro->extend_info = tor_malloc_zero(sizeof(extend_info_t)); - intro->extend_info->onion_key = crypto_pk_dup_key(okey); - crypto_pk_get_digest(intro->extend_info->onion_key, - intro->extend_info->identity_digest); - //crypto_rand(info->identity_digest, DIGEST_LEN); /* Would this work? */ - intro->extend_info->nickname[0] = '$'; - base16_encode(intro->extend_info->nickname + 1, - sizeof(intro->extend_info->nickname) - 1, - intro->extend_info->identity_digest, DIGEST_LEN); - intro->extend_info->addr = crypto_rand_int(65536); /* Does not cover all - * IP addresses. */ - intro->extend_info->port = crypto_rand_int(65536); - intro->intro_key = crypto_pk_dup_key(pk2); - smartlist_add(generated->intro_nodes, intro); - } - test_assert(rend_encode_v2_descriptors(descs, generated, now, - NULL, 0) > 0); - test_assert(rend_compute_v2_desc_id(computed_desc_id, service_id_base32, - NULL, now, 0) == 0); - test_memeq(((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0))->desc_id, computed_desc_id, DIGEST_LEN); - test_assert(rend_parse_v2_service_descriptor(&parsed, parsed_desc_id, - &intro_points_encrypted, - &intro_points_size, - &encoded_size, - &next_desc, - ((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0))->desc_str) == 0); - test_assert(parsed); - test_memeq(((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0))->desc_id, parsed_desc_id, DIGEST_LEN); - test_assert(rend_decrypt_introduction_points(parsed, NULL, - intro_points_encrypted, - intro_points_size) == 3); - test_assert(!crypto_pk_cmp_keys(generated->pk, parsed->pk)); - test_eq(parsed->timestamp, now); - test_eq(parsed->version, 2); - test_eq(parsed->protocols, 42); - test_eq(smartlist_len(parsed->intro_nodes), 3); - for (i = 0; i < smartlist_len(parsed->intro_nodes); i++) { - rend_intro_point_t *par_intro = smartlist_get(parsed->intro_nodes, i), - *gen_intro = smartlist_get(generated->intro_nodes, i); - extend_info_t *par_info = par_intro->extend_info; - extend_info_t *gen_info = gen_intro->extend_info; - test_assert(!crypto_pk_cmp_keys(gen_info->onion_key, par_info->onion_key)); - test_memeq(gen_info->identity_digest, par_info->identity_digest, - DIGEST_LEN); - test_streq(gen_info->nickname, par_info->nickname); - test_eq(gen_info->addr, par_info->addr); - test_eq(gen_info->port, par_info->port); - } - tor_free(intro_points_encrypted); - for (i = 0; i < smartlist_len(descs); i++) - rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i)); - smartlist_free(descs); - rend_service_descriptor_free(parsed); - rend_service_descriptor_free(generated); -} - -static void -test_geoip(void) -{ - int i, j; - time_t now = time(NULL); - char *s; - - /* Populate the DB a bit. Add these in order, since we can't do the final - * 'sort' step. These aren't very good IP addresses, but they're perfectly - * fine uint32_t values. */ - test_eq(0, geoip_parse_entry("10,50,AB")); - test_eq(0, geoip_parse_entry("52,90,XY")); - test_eq(0, geoip_parse_entry("95,100,AB")); - test_eq(0, geoip_parse_entry("\"105\",\"140\",\"ZZ\"")); - test_eq(0, geoip_parse_entry("\"150\",\"190\",\"XY\"")); - test_eq(0, geoip_parse_entry("\"200\",\"250\",\"AB\"")); - - /* We should have 3 countries: ab, xy, zz. */ - test_eq(3, geoip_get_n_countries()); - /* Make sure that country ID actually works. */ -#define NAMEFOR(x) geoip_get_country_name(geoip_get_country_by_ip(x)) - test_streq("ab", NAMEFOR(32)); - test_streq("??", NAMEFOR(5)); - test_streq("??", NAMEFOR(51)); - test_streq("xy", NAMEFOR(150)); - test_streq("xy", NAMEFOR(190)); - test_streq("??", NAMEFOR(2000)); -#undef NAMEFOR - - get_options()->BridgeRelay = 1; - get_options()->BridgeRecordUsageByCountry = 1; - /* Put 9 observations in AB... */ - for (i=32; i < 40; ++i) - geoip_note_client_seen(i, now); - geoip_note_client_seen(225, now); - /* and 3 observations in XY, several times. */ - for (j=0; j < 10; ++j) - for (i=52; i < 55; ++i) - geoip_note_client_seen(i, now-3600); - /* and 17 observations in ZZ... */ - for (i=110; i < 127; ++i) - geoip_note_client_seen(i, now-7200); - s = geoip_get_client_history(now+5*24*60*60); - test_assert(s); - test_streq("zz=24,ab=16,xy=8", s); - tor_free(s); - - /* Now clear out all the zz observations. */ - geoip_remove_old_clients(now-6000); - s = geoip_get_client_history(now+5*24*60*60); - test_assert(s); - test_streq("ab=16,xy=8", s); - tor_free(s); -} - -#define ENT(x) { #x, test_ ## x, 0, 0 } -#define SUBENT(x,y) { #x "/" #y, test_ ## x ## _ ## y, 1, 0 } - -static struct { - const char *test_name; - void (*test_fn)(void); - int is_subent; - int selected; -} test_array[] = { - ENT(buffers), - ENT(crypto), - SUBENT(crypto, dh), - SUBENT(crypto, s2k), - SUBENT(crypto, aes_iv), - SUBENT(crypto, base32_decode), - ENT(util), - SUBENT(util, ip6_helpers), - SUBENT(util, gzip), - SUBENT(util, datadir), - SUBENT(util, smartlist), - SUBENT(util, bitarray), - SUBENT(util, mempool), - SUBENT(util, strmap), - SUBENT(util, control_formats), - SUBENT(util, pqueue), - SUBENT(util, mmap), - SUBENT(util, threads), - SUBENT(util, order_functions), - ENT(onion_handshake), - ENT(dir_format), - ENT(v3_networkstatus), - ENT(policies), - ENT(rend_fns), - SUBENT(rend_fns, v2), - ENT(geoip), - { NULL, NULL, 0, 0 }, -}; - -static void syntax(void) ATTR_NORETURN; -static void -syntax(void) -{ - int i; - printf("Syntax:\n" - " test [-v|--verbose] [--warn|--notice|--info|--debug]\n" - " [testname...]\n" - "Recognized tests are:\n"); - for (i = 0; test_array[i].test_name; ++i) { - printf(" %s\n", test_array[i].test_name); - } - - exit(0); -} - -int -main(int c, char**v) -{ - or_options_t *options = options_new(); - char *errmsg = NULL; - int i; - int verbose = 0, any_selected = 0; - int loglevel = LOG_ERR; - - tor_threads_init(); - init_logging(); - - for (i = 1; i < c; ++i) { - if (!strcmp(v[i], "-v") || !strcmp(v[i], "--verbose")) - verbose++; - else if (!strcmp(v[i], "--warn")) - loglevel = LOG_WARN; - else if (!strcmp(v[i], "--notice")) - loglevel = LOG_NOTICE; - else if (!strcmp(v[i], "--info")) - loglevel = LOG_INFO; - else if (!strcmp(v[i], "--debug")) - loglevel = LOG_DEBUG; - else if (!strcmp(v[i], "--help") || !strcmp(v[i], "-h") || v[i][0] == '-') - syntax(); - else { - int j, found=0; - for (j = 0; test_array[j].test_name; ++j) { - if (!strcmp(v[i], test_array[j].test_name) || - (test_array[j].is_subent && - !strcmpstart(test_array[j].test_name, v[i]) && - test_array[j].test_name[strlen(v[i])] == '/') || - (v[i][0] == '=' && !strcmp(v[i]+1, test_array[j].test_name))) { - test_array[j].selected = 1; - any_selected = 1; - found = 1; - } - } - if (!found) { - printf("Unknown test: %s\n", v[i]); - syntax(); - } - } - } - - if (!any_selected) { - for (i = 0; test_array[i].test_name; ++i) { - test_array[i].selected = 1; - } - } - - add_stream_log(loglevel, LOG_ERR, "", stdout); - - options->command = CMD_RUN_UNITTESTS; - rep_hist_init(); - network_init(); - setup_directory(); - options_init(options); - options->DataDirectory = tor_strdup(temp_dir); - if (set_options(options, &errmsg) < 0) { - printf("Failed to set initial options: %s\n", errmsg); - tor_free(errmsg); - return 1; - } - - crypto_seed_rng(); - - if (0) { - bench_aes(); - return 0; - } - - atexit(remove_directory); - - printf("Running Tor unit tests on %s\n", get_uname()); - - for (i = 0; test_array[i].test_name; ++i) { - if (!test_array[i].selected) - continue; - if (!test_array[i].is_subent) { - printf("\n============================== %s\n",test_array[i].test_name); - } else if (test_array[i].is_subent && verbose) { - printf("\n%s", test_array[i].test_name); - } - test_array[i].test_fn(); - } - puts(""); - - if (have_failed) - return 1; - else - return 0; -} - diff -Nru tor-0.2.0.34/src/or/test_data.c tor-0.2.2.16-alpha/src/or/test_data.c --- tor-0.2.0.34/src/or/test_data.c 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/test_data.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,164 +0,0 @@ -/* Copyright 2001-2004 Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -/* $Id: /tor/trunk/src/or/test.c 13338 2007-06-10T19:13:32.101740Z nickm $ */ -const char test_data_c_id[] = - "$Id: /tor/trunk/src/or/test.c 13338 2007-06-10T19:13:32.101740Z nickm $"; - -const char AUTHORITY_CERT_1[] = -"dir-key-certificate-version 3\n" -"fingerprint F810C0CB4974A9C407A8D8F5B0394E3D87BF4794\n" -"dir-key-published 2007-06-13 16:52:25\n" -"dir-key-expires 2008-06-13 16:52:25\n" -"dir-identity-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIIBigKCAYEAwqvEOhA+aSNp0JQFd0bZ2OIdamIS6EGVuhOHFkmIS4P2hw99Nkx/\n" -"YJGXPbHB5uLxMYE539DHKuGztIHOanIqczG8P501F+sGfi1q00rzjYfliGuGnQRQ\n" -"5+A7Iu6am+KeEP/cnWZt63kiPV2Jt9D8qwlnZTKqMQvnhOz10QCApV0LgFHr/2VO\n" -"1jEO/Ve+EMO/+fZf8a6graw4ur1foVjLAwUW1fo0QUo0342WSlTA1VouyhZv1LsH\n" -"LTmA0VFTQnsNnG9V1sPAuqaPDeNntSS3bAWmCAUA6eQS4LF7Pz4OAsRtAurMf98z\n" -"Pz/thkNa9OBJfLH1zaAmaiUTdEqMNwoT1YHwqav4994tyO7oadV6PdVIAcXD2I4S\n" -"9tf0NPfaIHwfJPDUY9loKIrGNbrfBLTECrQ3QLNtU3yrYkEyQjcgT8FlBGDcDGqj\n" -"r8diBPlz+K5iXfl0lIudie4hAFZK+uDu7yQ4y7+N5fVuoBdQDt8S0eMho/PO3Hoe\n" -"638jhngjy5L5AgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBALQJryeKty8evkxsG1xrj3hezAt3qbTSfigptATGdd2CH+VvMKVdY7EM\n" -"UiiFNuYp3iZTptIKiiUtbmEGUgPsOaL6Ab9aoY80oXWxZ/shBFoIaAjOmn1qNQiA\n" -"jPNH7YVbJGjZiuJydT+ZuZabqh58ij8mMgdJnflFO7wG39q3QBrdAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-key-certification\n" -"-----BEGIN SIGNATURE-----\n" -"Hp6PuryATzAOM0PsmhlxsxTqoxKcI8lv6ti2/4Gnyug4lTx1rPweoZdt4GGttFAe\n" -"Td9zcUfLUlC0R5eDIlWpR+rxJsRLxuHcVTSr+P0N/Y5xoFzPAqPsVYz6lnvb7vIG\n" -"9XtixG9jXvVhEqpCZUwoRyPXXwjJoEZE1EuyuvPmlEny8O5thAx1gvZIwUk9hGLU\n" -"xcErXkajDgfWEGmFWgcs+uk/Sa6n+vjPBwJD9k2hGcoCVZhelU0duCORJaz33twU\n" -"tebJ/iPMAEkMBIlMvnnr+lKXk548rwE6GHUXWtu/Tho4piV58A0hKAHKpGbVUYEF\n" -"+11x7n5klsYkUedltrCMajtjB8oawWmRPZZp+sUBmnEtunlCGaBnJNQ3pnCvAalJ\n" -"yPCSGeQhrW8ZKGWE4aZ8xzyUc5K0zF0KEefPFyHpK61ZDaXr/6TQPz3UF4ndxVjS\n" -"sxRWj3HyMv6Ax5bASOLgP2ikdXGnZLHau93yKJ6N8U57JjCTavxMlRXONbLS0qYe\n" -"-----END SIGNATURE-----\n"; - -const char AUTHORITY_SIGNKEY_1[] = -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXAIBAAKBgQC0Ca8nircvHr5MbBtca494XswLd6m00n4oKbQExnXdgh/lbzCl\n" -"XWOxDFIohTbmKd4mU6bSCoolLW5hBlID7Dmi+gG/WqGPNKF1sWf7IQRaCGgIzpp9\n" -"ajUIgIzzR+2FWyRo2YricnU/mbmWm6oefIo/JjIHSZ35RTu8Bt/at0Aa3QIDAQAB\n" -"AoGAKujz+jSxnGVzbbuGeeyY8VOGxmTq6dIRh3kJEupKRVUyTPjHW2J61EPfgRDf\n" -"GNR5wiDF7eHdMyc026MqAQ1YXv007K9D22cABhe8BivCbibhzUrmcv76vQHIRgp/\n" -"AbT9fRjhmB/NqjLf6NkBHzx2UAWKbmxcO4pAGSQIY+TnXXECQQDkqTPxUrg2y8kC\n" -"nvEa2O1yYSCU0cB1EmPaIg0cH5vV/lA/EFbhLIBbA+CUsbX0qxuEBX6B9c36y3AO\n" -"UOAi7NXnAkEAyZA8rKBIjhHFur9e/U9ApDAjvW1BSy7nDP5GKqw2ayLIt1hfnxZd\n" -"0YXb53iAsf/YHT/wk4+nBYtQ83xL2U2omwJAfgRaIgcqithoYU9jJR6kTcMFh77J\n" -"SDvoV9EoVHV/FsJfS0If/1zdKEvMu2XtF3gtY+b7P3hOGod/rAQaYmUPxQJBALz4\n" -"2JmzsDJaITpDXwg4PE9yvp9DBjs5nu9EmX46dM6fDvUuCoA5VP4x9IigJnA7gF9z\n" -"6dY+kQWWpu+QcgAqWc8CQDYRUK/qhdbBLdv30CyGrU6Pu0Iij6KZXLGW/zavSDmw\n" -"4FgbRYYTjukvSs3zUX+52znjYn7wTngIm312A37pHUU=\n" -"-----END RSA PRIVATE KEY-----\n"; - -const char AUTHORITY_CERT_2[] = -"dir-key-certificate-version 3\n" -"fingerprint 4D44AE0470B9E88FD4558EFEC82698FB33715400\n" -"dir-key-published 2007-06-13 16:52:32\n" -"dir-key-expires 2008-06-13 16:52:32\n" -"dir-identity-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIIBigKCAYEAqukDwQRm1Oy1pPY+7GNRnRNFJzEVPUBfJwC4tBH19tkvdRQPuIGI\n" -"2jiTy/rmZ6CLcl1G0oulSgxfKEX75QdptOasZu+rKUrRRSxx0QrXhs9a7up0rpXh\n" -"13fw3mh1Vl/As3rJYF30Hjk01BTOJMxi/HY2y0ALQytFWjiMGY74A9Y6+uDcHkB2\n" -"KflBjxIl8zpCsXsTTnUhN5kXqaOOnK46XaUShSpXsyOxTMJXuJEtgLz9XCyA8XjW\n" -"d75QLHucEnlTqxUAdI5YSN2KIlIJiySCVnAorDpJey2mE9VncpHQWMCv/FPFdnSU\n" -"EMMPUc4bBShcoNFf0mMJeV2sv+dBkgKAL0GLM19PuJIThJhfN/B6+YQTxw4HEpPV\n" -"plfUqYRN0fYC+5hCTS6rroO/uCfDR7NBtoeDNm9dQrvjfk3b/Mywah1rdWNjnVqs\n" -"tPJaz3fc/CVBOUUexhmyktgLuwSNEYIQilQ+BydkWN/4RObhV+YSV5BgekEDVaoS\n" -"RHw4IbYBDHVxAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAOu3dgrQth3iqvi/UzfywaANw0bBUuMOBhnMBeiLEcRLneJHUJkVvrpR\n" -"/EDQkdMov1e7CX6aqBKygVnbDNYjJ+bcQej8MKpuuW+zIknnz5lfnAVZO5uAmo3Y\n" -"DpG574oQ2FFMdkWHSBloIRxSj/E4Jn1M2qJjElBXP0E33Ka/Noo7AgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-key-certification\n" -"-----BEGIN SIGNATURE-----\n" -"Fv0Li68QUdAiChY3OklZOakHzwXAUfCzDNxkqe+HLC0n6ZECE9ZCvLVo69XmgVhH\n" -"L5qYr2rxT6QpF+9yuOHbN9gWn8EsDcli06MlhX9TUt/IYVxHa/9tJwNoTfEw2w2D\n" -"tyHhWm94IfOK7/Sea6jHnjckl80X+kk0ZNtAGs3/6fP4iltKNGXnvBwfgLpEgW7X\n" -"NpDl0OLeDuA79zem2GogwQZQdoDbePByU0TJVx9jYi2Bzx2Nb2H0hRTPP6+dY0HQ\n" -"MHb7yyyTQRad5iAUnExKhhyt22p7X3a6lgkAhq4YrNn/zVPkpnT2dzjsOydTHOW8\n" -"2BQs33QlGNe095i47pJBDYsUgmJaXfqB/RG6dFg7jwIsc3/7dZcvcqfxY7wKcD/T\n" -"wtogCIKxDvWbZn7f0hqYkT6uQC8Zom8bcnedmyzufOZCyA2SqQ2wvio6lznR4RIB\n" -"a8qDHR0tPS9/VkqTPcvUWCZeY3UiDeWPjoK1nea1pz6DHDWglKPx86a0amjjayZQ\n" -"-----END SIGNATURE-----\n"; - -const char AUTHORITY_SIGNKEY_2[] = -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXgIBAAKBgQDrt3YK0LYd4qr4v1M38sGgDcNGwVLjDgYZzAXoixHES53iR1CZ\n" -"Fb66UfxA0JHTKL9Xuwl+mqgSsoFZ2wzWIyfm3EHo/DCqbrlvsyJJ58+ZX5wFWTub\n" -"gJqN2A6Rue+KENhRTHZFh0gZaCEcUo/xOCZ9TNqiYxJQVz9BN9ymvzaKOwIDAQAB\n" -"AoGAJ+I9/ex8tCfTSA2PdisEKiHKBeHWNYb870Z/RW6qje1BhLUOZSixwfL3XLwt\n" -"wG3nml+SZrKid69uhZaz4FPIf0tqCgURf6dDrF5vuzzr7VLVqkZHYSBp0vE6bu0R\n" -"Sgc5QNxI2talgc4bsp0O0C+Zd4n3Yto0pXl/I6NHVAxlFBECQQD2mahkY+QEHWPV\n" -"yRY3w3HhRmWBcrkY2zVyvPpqfn/sdHRPYW/yj4Xr/d1CO9VyFmEs4k324lIvu6LT\n" -"WDdpPlcJAkEA9LOZv5aNeAm8ckvvXH7iv8KiONiSz0n9wlisxMhNYTEkOCo1g7jG\n" -"AX5ZknRC9s4sWCPOBpMhloUvemdQ5FCEIwJBAMqCFwoSCf7jD8hRcUBr7QodoF/0\n" -"kVJ7OeI2lMJ9jZnlbFp/3snn2Qeam2e38SnWfQi582KKKwnt4eIDMMXpntkCQQDI\n" -"v1Lh11wl3y7nQZ6T7lCNatp08k+2mQgCWYcbRQweMRd6sD4I2xwt+372ZETPfyLo\n" -"CC+sOyYx+v+RVpMJS3irAkEA6l98nMteZKmhOgyKSjdolP+ahpZunb+WnCdAtP97\n" -"rjZyXmEZS3oe7TRCDD28GAGMmxSDvNfOOpyn14ishEs5AQ==\n" -"-----END RSA PRIVATE KEY-----\n"; - -const char AUTHORITY_CERT_3[] = -"dir-key-certificate-version 3\n" -"fingerprint ED3719BF554DE9D7D59F5CA5A4F5AD121D020ED9\n" -"dir-key-published 2007-06-13 16:52:40\n" -"dir-key-expires 2008-06-13 16:52:40\n" -"dir-identity-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIIBigKCAYEAtB+yw4BNxtZAG4cPaedkhWNmeij7IuNWmXjh58ZYEGurvGyHs1w4\n" -"QlwNYI2UftSIeIGdWZ5fJ17h9P3xvO6eeJuOt4KPrNOxUbSGrELEx1Lje1fDAJ1X\n" -"SvN+dvptusxtyFUr8afgTPrFIvYuazQ6q/Rw+NDagjmDx3h/A/enihpBnjwzeH8j\n" -"Xzu7b+HKnzFnNfveTDdvSy0NSC6tCOnrfXo31XbXRXtlesnMIpbJClUcAv55eyai\n" -"/PrVPCCUz8mk0sQnn2Xhv1YJmwOlQTGMfg0a0kWLmh+UWcHsGQ4VWxBZJcuzgFHG\n" -"hu2/Fz6DXSpX5Q6B9HKoGmnH1oBh24l0kUW1jL8BxPY4YDU1Lt5t3qgcDn9dXYcI\n" -"o8VvyI0ecSc26Q2PYFWX1hpN4VIBZ8uGaW3IpyTdNiRq0g3iMGRFEXcDlWuyMB9E\n" -"EbSM7m/79V/z7SjDd75EP8Z0qDPESEVB8a8LbuSJtzFVE0KHd7RzkIEN5sorXspZ\n" -"/THukftSmkIvAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBANrSZlUq38Boz3iuUOydYTJV57rTbq1bz805FP2QG2Z+2bwpgKIOZag/\n" -"gN2A1ySJaIYLgZIg9irxrLkqlY/UAjC23y6V9fJXP1S3TXoqLmHleW8PsaDLuwTo\n" -"hCWaR61Mx9WG7IXcodn2Z7RiCfZpSW4Rztbk5WtjQa5jPXSFOuBJAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-key-certification\n" -"-----BEGIN SIGNATURE-----\n" -"UNXZy+4OQ8iat+gw+vg2ynvKj2BYbqZt+EAZAV3rmw6gux44U9TLRECRd6LsA08N\n" -"4+Vz01TU81xqMgfrUy94ei2YvcfpO8art9/muWHTP9SmOX8S1uqDqLWA+n723C9A\n" -"HyVXn4aINncO2081gJcIW5+Ul8WTCeZe/n3LVPTCKbTdqxvmrPUdCWlJTQUmb19M\n" -"T+kcCjaEfgQGLC+Y2MHqYe/nxz+aBKqpjiWUDdjc35va6r/2e3c0jGi1B1xRZxN1\n" -"xThPZ+CifjDoWBxJdDGlIfZRK1lMnOCJY9w9ibTXQ1UnvE4whFvmB55/t9/XLq4q\n" -"3pnZz0H7funey3+ilmTxDohoAYT1GX+4a+3xYH07UmAFqlTzqKClj84XEHn+Cer7\n" -"Nun9kJlJFuBgUpQjwCkzedFZKKLOHgB2h7trJfnqcBpAM8Rup1Bb5u/RcBx9gy1q\n" -"pMc65FviIrc/Q5TUku6NNbCbnGll1599PvWuUzkG42lJ17V6psKHIsqGtVdHlCUc\n" -"-----END SIGNATURE-----\n"; - -const char AUTHORITY_SIGNKEY_3[] = -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXgIBAAKBgQDa0mZVKt/AaM94rlDsnWEyVee6026tW8/NORT9kBtmftm8KYCi\n" -"DmWoP4DdgNckiWiGC4GSIPYq8ay5KpWP1AIwtt8ulfXyVz9Ut016Ki5h5XlvD7Gg\n" -"y7sE6IQlmketTMfVhuyF3KHZ9me0Ygn2aUluEc7W5OVrY0GuYz10hTrgSQIDAQAB\n" -"AoGBAIyoeG1AnQmildKeQpiGZackf0uhg2BeRwpFKg//5Q0Sd0Wza+M/2+q1v1Ei\n" -"86ihxxV7KfPTykk6hmuUSwVkI28Z+5J9NYTr35EzPiUlqpo0iclTkFqrlbqSPULx\n" -"9fQhvcOGv1c0m5CnYrHsM8eu3tagLg+6OE4abLOYX4Az5pkxAkEA/NwHhVaVJrXH\n" -"lGDrRAfGtaD5Tzeeg1H9DNZi5lmFiSNR0O11sgDLkiZNP5oM8knyqo8Gq08hwxEb\n" -"yqMXM3XtJQJBAN2KJbFhOjDIkvJyYvbmcP6P7vV2c9j+oUTKkFMF7vvfWunxMi9j\n" -"ghbdUKgl7tU0VFpw7ufDDD0pkN6sua3gp1UCQQCvNzTK861U7p/GtMYyFQVf9JTt\n" -"jMf9jYHBNInBvwTme6AFG5bz6tMlif77dJ9GAXHzODrR2Hq3thJA/3RjR3M1AkBg\n" -"+6M4ncmtpYC+5lhwob0Bk90WU/6vFflfdhXsYoKWfNb95vsDR9qhS82Nbt25NClh\n" -"VmMfzoFDHTkwYgj/F4PpAkEA+RaaSRP7BmbvFNqvlm8J/m0RVdAH4+p/Q5Z5u6Yo\n" -"N7xC/gFi0qFPGKsDvD2CncAYmt+KNsd8S0JGDN4eieKn+Q==\n" -"-----END RSA PRIVATE KEY-----\n"; - diff -Nru tor-0.2.0.34/src/or/tor_main.c tor-0.2.2.16-alpha/src/or/tor_main.c --- tor-0.2.0.34/src/or/tor_main.c 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/or/tor_main.c 2010-03-07 04:03:28.000000000 +0000 @@ -1,12 +1,13 @@ /* Copyright 2001-2004 Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2008, The Tor Project, Inc. */ + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: tor_main.c 13412 2008-02-07 05:31:47Z nickm $ */ -const char tor_main_c_id[] = - "$Id: tor_main.c 13412 2008-02-07 05:31:47Z nickm $"; -const char tor_svn_revision[] = +/** String describing which Tor subversion repository version the source was + * built from. This string is generated by a bit of shell kludging int + * src/or/Makefile.am, and is usually right. + */ +const char tor_git_revision[] = #ifndef _MSC_VER #include "micro-revision.i" #endif diff -Nru tor-0.2.0.34/src/test/Makefile.am tor-0.2.2.16-alpha/src/test/Makefile.am --- tor-0.2.0.34/src/test/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/Makefile.am 2010-04-15 15:03:22.000000000 +0000 @@ -0,0 +1,30 @@ +TESTS = test + +noinst_PROGRAMS = test + +AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \ + -DLOCALSTATEDIR="\"$(localstatedir)\"" \ + -DBINDIR="\"$(bindir)\"" \ + -I"$(top_srcdir)/src/or" + +# -L flags need to go in LDFLAGS. -l flags need to go in LDADD. +# This seems to matter nowhere but on windows, but I assure you that it +# matters a lot there, and is quite hard to debug if you forget to do it. + +test_SOURCES = \ + test_data.c \ + test.c \ + test_addr.c \ + test_crypto.c \ + test_dir.c \ + test_containers.c \ + test_util.c \ + tinytest.c + +test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ + @TOR_LDFLAGS_libevent@ +test_LDADD = ../or/libtor.a ../common/libor.a ../common/libor-crypto.a \ + ../common/libor-event.a \ + @TOR_ZLIB_LIBS@ -lm @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ + +noinst_HEADERS = tinytest.h tinytest_macros.h test.h diff -Nru tor-0.2.0.34/src/test/Makefile.in tor-0.2.2.16-alpha/src/test/Makefile.in --- tor-0.2.0.34/src/test/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/Makefile.in 2010-09-17 06:08:41.000000000 +0000 @@ -0,0 +1,532 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +TESTS = test$(EXEEXT) +noinst_PROGRAMS = test$(EXEEXT) +subdir = src/test +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/orconfig.h +CONFIG_CLEAN_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_test_OBJECTS = test_data.$(OBJEXT) test.$(OBJEXT) \ + test_addr.$(OBJEXT) test_crypto.$(OBJEXT) test_dir.$(OBJEXT) \ + test_containers.$(OBJEXT) test_util.$(OBJEXT) \ + tinytest.$(OBJEXT) +test_OBJECTS = $(am_test_OBJECTS) +test_DEPENDENCIES = ../or/libtor.a ../common/libor.a \ + ../common/libor-crypto.a ../common/libor-event.a +test_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(test_LDFLAGS) $(LDFLAGS) \ + -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(test_SOURCES) +DIST_SOURCES = $(test_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BINDIR = @BINDIR@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFDIR = @CONFDIR@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LOCALSTATEDIR = @LOCALSTATEDIR@ +LOGFACILITY = @LOGFACILITY@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TORGROUP = @TORGROUP@ +TORUSER = @TORUSER@ +TOR_CPPFLAGS_libevent = @TOR_CPPFLAGS_libevent@ +TOR_CPPFLAGS_openssl = @TOR_CPPFLAGS_openssl@ +TOR_CPPFLAGS_zlib = @TOR_CPPFLAGS_zlib@ +TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ +TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ +TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ +TOR_LIB_GDI = @TOR_LIB_GDI@ +TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \ + -DLOCALSTATEDIR="\"$(localstatedir)\"" \ + -DBINDIR="\"$(bindir)\"" \ + -I"$(top_srcdir)/src/or" + + +# -L flags need to go in LDFLAGS. -l flags need to go in LDADD. +# This seems to matter nowhere but on windows, but I assure you that it +# matters a lot there, and is quite hard to debug if you forget to do it. +test_SOURCES = \ + test_data.c \ + test.c \ + test_addr.c \ + test_crypto.c \ + test_dir.c \ + test_containers.c \ + test_util.c \ + tinytest.c + +test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ + @TOR_LDFLAGS_libevent@ + +test_LDADD = ../or/libtor.a ../common/libor.a ../common/libor-crypto.a \ + ../common/libor-event.a \ + @TOR_ZLIB_LIBS@ -lm @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ + +noinst_HEADERS = tinytest.h tinytest_macros.h test.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/test/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/test/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) + @rm -f test$(EXEEXT) + $(test_LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_addr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_containers.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_crypto.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_data.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dir.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_util.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinytest.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-generic clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru tor-0.2.0.34/src/test/test_addr.c tor-0.2.2.16-alpha/src/test/test_addr.c --- tor-0.2.0.34/src/test/test_addr.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/test_addr.c 2010-03-07 04:03:28.000000000 +0000 @@ -0,0 +1,497 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" +#include "test.h" + +static void +test_addr_basic(void) +{ + uint32_t u32; + uint16_t u16; + char *cp; + + /* Test parse_addr_port */ + cp = NULL; u32 = 3; u16 = 3; + test_assert(!parse_addr_port(LOG_WARN, "1.2.3.4", &cp, &u32, &u16)); + test_streq(cp, "1.2.3.4"); + test_eq(u32, 0x01020304u); + test_eq(u16, 0); + tor_free(cp); + test_assert(!parse_addr_port(LOG_WARN, "4.3.2.1:99", &cp, &u32, &u16)); + test_streq(cp, "4.3.2.1"); + test_eq(u32, 0x04030201u); + test_eq(u16, 99); + tor_free(cp); + test_assert(!parse_addr_port(LOG_WARN, "nonexistent.address:4040", + &cp, NULL, &u16)); + test_streq(cp, "nonexistent.address"); + test_eq(u16, 4040); + tor_free(cp); + test_assert(!parse_addr_port(LOG_WARN, "localhost:9999", &cp, &u32, &u16)); + test_streq(cp, "localhost"); + test_eq(u32, 0x7f000001u); + test_eq(u16, 9999); + tor_free(cp); + u32 = 3; + test_assert(!parse_addr_port(LOG_WARN, "localhost", NULL, &u32, &u16)); + test_eq(cp, NULL); + test_eq(u32, 0x7f000001u); + test_eq(u16, 0); + tor_free(cp); + test_eq(0, addr_mask_get_bits(0x0u)); + test_eq(32, addr_mask_get_bits(0xFFFFFFFFu)); + test_eq(16, addr_mask_get_bits(0xFFFF0000u)); + test_eq(31, addr_mask_get_bits(0xFFFFFFFEu)); + test_eq(1, addr_mask_get_bits(0x80000000u)); + + /* Test inet_ntop */ + { + char tmpbuf[TOR_ADDR_BUF_LEN]; + const char *ip = "176.192.208.224"; + struct in_addr in; + tor_inet_pton(AF_INET, ip, &in); + tor_inet_ntop(AF_INET, &in, tmpbuf, sizeof(tmpbuf)); + test_streq(tmpbuf, ip); + } + + done: + ; +} + +#define _test_op_ip6(a,op,b,e1,e2) \ + STMT_BEGIN \ + tt_assert_test_fmt_type(a,b,e1" "#op" "e2,struct in6_addr*, \ + (memcmp(_val1->s6_addr, _val2->s6_addr, 16) op 0), \ + char *, "%s", \ + { int i; char *cp; \ + cp = _print = tor_malloc(64); \ + for (i=0;i<16;++i) { \ + tor_snprintf(cp, 3,"%02x", (unsigned)_value->s6_addr[i]);\ + cp += 2; \ + if (i != 15) *cp++ = ':'; \ + } \ + }, { tor_free(_print); } \ + ); \ + STMT_END + +/** Helper: Assert that two strings both decode as IPv6 addresses with + * tor_inet_pton(), and both decode to the same address. */ +#define test_pton6_same(a,b) STMT_BEGIN \ + test_eq(tor_inet_pton(AF_INET6, a, &a1), 1); \ + test_eq(tor_inet_pton(AF_INET6, b, &a2), 1); \ + _test_op_ip6(&a1,==,&a2,#a,#b); \ + STMT_END + +/** Helper: Assert that a is recognized as a bad IPv6 address by + * tor_inet_pton(). */ +#define test_pton6_bad(a) \ + test_eq(0, tor_inet_pton(AF_INET6, a, &a1)) + +/** Helper: assert that a, when parsed by tor_inet_pton() and displayed + * with tor_inet_ntop(), yields b. Also assert that b parses to + * the same value as a. */ +#define test_ntop6_reduces(a,b) STMT_BEGIN \ + test_eq(tor_inet_pton(AF_INET6, a, &a1), 1); \ + test_streq(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)), b); \ + test_eq(tor_inet_pton(AF_INET6, b, &a2), 1); \ + _test_op_ip6(&a1, ==, &a2, a, b); \ + STMT_END + +/** Helper: assert that a parses by tor_inet_pton() into a address that + * passes tor_addr_is_internal() with for_listening. */ +#define test_internal_ip(a,for_listening) STMT_BEGIN \ + test_eq(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), 1); \ + t1.family = AF_INET6; \ + if (!tor_addr_is_internal(&t1, for_listening)) \ + test_fail_msg( a "was not internal."); \ + STMT_END + +/** Helper: assert that a parses by tor_inet_pton() into a address that + * does not pass tor_addr_is_internal() with for_listening. */ +#define test_external_ip(a,for_listening) STMT_BEGIN \ + test_eq(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), 1); \ + t1.family = AF_INET6; \ + if (tor_addr_is_internal(&t1, for_listening)) \ + test_fail_msg(a "was not external."); \ + STMT_END + +/** Helper: Assert that a and b, when parsed by + * tor_inet_pton(), give addresses that compare in the order defined by + * op with tor_addr_compare(). */ +#define test_addr_compare(a, op, b) STMT_BEGIN \ + test_eq(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), 1); \ + test_eq(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), 1); \ + t1.family = t2.family = AF_INET6; \ + r = tor_addr_compare(&t1,&t2,CMP_SEMANTIC); \ + if (!(r op 0)) \ + test_fail_msg("failed: tor_addr_compare("a","b") "#op" 0"); \ + STMT_END + +/** Helper: Assert that a and b, when parsed by + * tor_inet_pton(), give addresses that compare in the order defined by + * op with tor_addr_compare_masked() with m masked. */ +#define test_addr_compare_masked(a, op, b, m) STMT_BEGIN \ + test_eq(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), 1); \ + test_eq(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), 1); \ + t1.family = t2.family = AF_INET6; \ + r = tor_addr_compare_masked(&t1,&t2,m,CMP_SEMANTIC); \ + if (!(r op 0)) \ + test_fail_msg("failed: tor_addr_compare_masked("a","b","#m") "#op" 0"); \ + STMT_END + +/** Helper: assert that xx is parseable as a masked IPv6 address with + * ports by tor_parse_mask_addr_ports(), with family f, IP address + * as 4 32-bit words ip1...ip4, mask bits as mm, and port range + * as pt1..pt2. */ +#define test_addr_mask_ports_parse(xx, f, ip1, ip2, ip3, ip4, mm, pt1, pt2) \ + STMT_BEGIN \ + test_eq(tor_addr_parse_mask_ports(xx, &t1, &mask, &port1, &port2), f); \ + p1=tor_inet_ntop(AF_INET6, &t1.addr.in6_addr, bug, sizeof(bug)); \ + test_eq(htonl(ip1), tor_addr_to_in6_addr32(&t1)[0]); \ + test_eq(htonl(ip2), tor_addr_to_in6_addr32(&t1)[1]); \ + test_eq(htonl(ip3), tor_addr_to_in6_addr32(&t1)[2]); \ + test_eq(htonl(ip4), tor_addr_to_in6_addr32(&t1)[3]); \ + test_eq(mask, mm); \ + test_eq(port1, pt1); \ + test_eq(port2, pt2); \ + STMT_END + +/** Run unit tests for IPv6 encoding/decoding/manipulation functions. */ +static void +test_addr_ip6_helpers(void) +{ + char buf[TOR_ADDR_BUF_LEN], bug[TOR_ADDR_BUF_LEN]; + struct in6_addr a1, a2; + tor_addr_t t1, t2; + int r, i; + uint16_t port1, port2; + maskbits_t mask; + const char *p1; + struct sockaddr_storage sa_storage; + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; + + // struct in_addr b1, b2; + /* Test tor_inet_ntop and tor_inet_pton: IPv6 */ + + /* ==== Converting to and from sockaddr_t. */ + sin = (struct sockaddr_in *)&sa_storage; + sin->sin_family = AF_INET; + sin->sin_port = 9090; + sin->sin_addr.s_addr = htonl(0x7f7f0102); /*127.127.1.2*/ + tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, NULL); + test_eq(tor_addr_family(&t1), AF_INET); + test_eq(tor_addr_to_ipv4h(&t1), 0x7f7f0102); + + memset(&sa_storage, 0, sizeof(sa_storage)); + test_eq(sizeof(struct sockaddr_in), + tor_addr_to_sockaddr(&t1, 1234, (struct sockaddr *)&sa_storage, + sizeof(sa_storage))); + test_eq(1234, ntohs(sin->sin_port)); + test_eq(0x7f7f0102, ntohl(sin->sin_addr.s_addr)); + + memset(&sa_storage, 0, sizeof(sa_storage)); + sin6 = (struct sockaddr_in6 *)&sa_storage; + sin6->sin6_family = AF_INET6; + sin6->sin6_port = htons(7070); + sin6->sin6_addr.s6_addr[0] = 128; + tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin6, NULL); + test_eq(tor_addr_family(&t1), AF_INET6); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0); + test_streq(p1, "8000::"); + + memset(&sa_storage, 0, sizeof(sa_storage)); + test_eq(sizeof(struct sockaddr_in6), + tor_addr_to_sockaddr(&t1, 9999, (struct sockaddr *)&sa_storage, + sizeof(sa_storage))); + test_eq(AF_INET6, sin6->sin6_family); + test_eq(9999, ntohs(sin6->sin6_port)); + test_eq(0x80000000, ntohl(S6_ADDR32(sin6->sin6_addr)[0])); + + /* ==== tor_addr_lookup: static cases. (Can't test dns without knowing we + * have a good resolver. */ + test_eq(0, tor_addr_lookup("127.128.129.130", AF_UNSPEC, &t1)); + test_eq(AF_INET, tor_addr_family(&t1)); + test_eq(tor_addr_to_ipv4h(&t1), 0x7f808182); + + test_eq(0, tor_addr_lookup("9000::5", AF_UNSPEC, &t1)); + test_eq(AF_INET6, tor_addr_family(&t1)); + test_eq(0x90, tor_addr_to_in6_addr8(&t1)[0]); + test_assert(tor_mem_is_zero((char*)tor_addr_to_in6_addr8(&t1)+1, 14)); + test_eq(0x05, tor_addr_to_in6_addr8(&t1)[15]); + + /* === Test pton: valid af_inet6 */ + /* Simple, valid parsing. */ + r = tor_inet_pton(AF_INET6, + "0102:0304:0506:0708:090A:0B0C:0D0E:0F10", &a1); + test_assert(r==1); + for (i=0;i<16;++i) { test_eq(i+1, (int)a1.s6_addr[i]); } + /* ipv4 ending. */ + test_pton6_same("0102:0304:0506:0708:090A:0B0C:0D0E:0F10", + "0102:0304:0506:0708:090A:0B0C:13.14.15.16"); + /* shortened words. */ + test_pton6_same("0001:0099:BEEF:0000:0123:FFFF:0001:0001", + "1:99:BEEF:0:0123:FFFF:1:1"); + /* zeros at the beginning */ + test_pton6_same("0000:0000:0000:0000:0009:C0A8:0001:0001", + "::9:c0a8:1:1"); + test_pton6_same("0000:0000:0000:0000:0009:C0A8:0001:0001", + "::9:c0a8:0.1.0.1"); + /* zeros in the middle. */ + test_pton6_same("fe80:0000:0000:0000:0202:1111:0001:0001", + "fe80::202:1111:1:1"); + /* zeros at the end. */ + test_pton6_same("1000:0001:0000:0007:0000:0000:0000:0000", + "1000:1:0:7::"); + + /* === Test ntop: af_inet6 */ + test_ntop6_reduces("0:0:0:0:0:0:0:0", "::"); + + test_ntop6_reduces("0001:0099:BEEF:0006:0123:FFFF:0001:0001", + "1:99:beef:6:123:ffff:1:1"); + + //test_ntop6_reduces("0:0:0:0:0:0:c0a8:0101", "::192.168.1.1"); + test_ntop6_reduces("0:0:0:0:0:ffff:c0a8:0101", "::ffff:192.168.1.1"); + test_ntop6_reduces("002:0:0000:0:3::4", "2::3:0:0:4"); + test_ntop6_reduces("0:0::1:0:3", "::1:0:3"); + test_ntop6_reduces("008:0::0", "8::"); + test_ntop6_reduces("0:0:0:0:0:ffff::1", "::ffff:0.0.0.1"); + test_ntop6_reduces("abcd:0:0:0:0:0:7f00::", "abcd::7f00:0"); + test_ntop6_reduces("0000:0000:0000:0000:0009:C0A8:0001:0001", + "::9:c0a8:1:1"); + test_ntop6_reduces("fe80:0000:0000:0000:0202:1111:0001:0001", + "fe80::202:1111:1:1"); + test_ntop6_reduces("1000:0001:0000:0007:0000:0000:0000:0000", + "1000:1:0:7::"); + + /* === Test pton: invalid in6. */ + test_pton6_bad("foobar."); + test_pton6_bad("55555::"); + test_pton6_bad("9:-60::"); + test_pton6_bad("1:2:33333:4:0002:3::"); + //test_pton6_bad("1:2:3333:4:00002:3::");// BAD, but glibc doesn't say so. + test_pton6_bad("1:2:3333:4:fish:3::"); + test_pton6_bad("1:2:3:4:5:6:7:8:9"); + test_pton6_bad("1:2:3:4:5:6:7"); + test_pton6_bad("1:2:3:4:5:6:1.2.3.4.5"); + test_pton6_bad("1:2:3:4:5:6:1.2.3"); + test_pton6_bad("::1.2.3"); + test_pton6_bad("::1.2.3.4.5"); + test_pton6_bad("99"); + test_pton6_bad(""); + test_pton6_bad("1::2::3:4"); + test_pton6_bad("a:::b:c"); + test_pton6_bad(":::a:b:c"); + test_pton6_bad("a:b:c:::"); + + /* test internal checking */ + test_external_ip("fbff:ffff::2:7", 0); + test_internal_ip("fc01::2:7", 0); + test_internal_ip("fdff:ffff::f:f", 0); + test_external_ip("fe00::3:f", 0); + + test_external_ip("fe7f:ffff::2:7", 0); + test_internal_ip("fe80::2:7", 0); + test_internal_ip("febf:ffff::f:f", 0); + + test_internal_ip("fec0::2:7:7", 0); + test_internal_ip("feff:ffff::e:7:7", 0); + test_external_ip("ff00::e:7:7", 0); + + test_internal_ip("::", 0); + test_internal_ip("::1", 0); + test_internal_ip("::1", 1); + test_internal_ip("::", 0); + test_external_ip("::", 1); + test_external_ip("::2", 0); + test_external_ip("2001::", 0); + test_external_ip("ffff::", 0); + + test_external_ip("::ffff:0.0.0.0", 1); + test_internal_ip("::ffff:0.0.0.0", 0); + test_internal_ip("::ffff:0.255.255.255", 0); + test_external_ip("::ffff:1.0.0.0", 0); + + test_external_ip("::ffff:9.255.255.255", 0); + test_internal_ip("::ffff:10.0.0.0", 0); + test_internal_ip("::ffff:10.255.255.255", 0); + test_external_ip("::ffff:11.0.0.0", 0); + + test_external_ip("::ffff:126.255.255.255", 0); + test_internal_ip("::ffff:127.0.0.0", 0); + test_internal_ip("::ffff:127.255.255.255", 0); + test_external_ip("::ffff:128.0.0.0", 0); + + test_external_ip("::ffff:172.15.255.255", 0); + test_internal_ip("::ffff:172.16.0.0", 0); + test_internal_ip("::ffff:172.31.255.255", 0); + test_external_ip("::ffff:172.32.0.0", 0); + + test_external_ip("::ffff:192.167.255.255", 0); + test_internal_ip("::ffff:192.168.0.0", 0); + test_internal_ip("::ffff:192.168.255.255", 0); + test_external_ip("::ffff:192.169.0.0", 0); + + test_external_ip("::ffff:169.253.255.255", 0); + test_internal_ip("::ffff:169.254.0.0", 0); + test_internal_ip("::ffff:169.254.255.255", 0); + test_external_ip("::ffff:169.255.0.0", 0); + test_assert(is_internal_IP(0x7f000001, 0)); + + /* tor_addr_compare(tor_addr_t x2) */ + test_addr_compare("ffff::", ==, "ffff::0"); + test_addr_compare("0::3:2:1", <, "0::ffff:0.3.2.1"); + test_addr_compare("0::2:2:1", <, "0::ffff:0.3.2.1"); + test_addr_compare("0::ffff:0.3.2.1", >, "0::0:0:0"); + test_addr_compare("0::ffff:5.2.2.1", <, "::ffff:6.0.0.0"); /* XXXX wrong. */ + tor_addr_parse_mask_ports("[::ffff:2.3.4.5]", &t1, NULL, NULL, NULL); + tor_addr_parse_mask_ports("2.3.4.5", &t2, NULL, NULL, NULL); + test_assert(tor_addr_compare(&t1, &t2, CMP_SEMANTIC) == 0); + tor_addr_parse_mask_ports("[::ffff:2.3.4.4]", &t1, NULL, NULL, NULL); + tor_addr_parse_mask_ports("2.3.4.5", &t2, NULL, NULL, NULL); + test_assert(tor_addr_compare(&t1, &t2, CMP_SEMANTIC) < 0); + + /* test compare_masked */ + test_addr_compare_masked("ffff::", ==, "ffff::0", 128); + test_addr_compare_masked("ffff::", ==, "ffff::0", 64); + test_addr_compare_masked("0::2:2:1", <, "0::8000:2:1", 81); + test_addr_compare_masked("0::2:2:1", ==, "0::8000:2:1", 80); + + /* Test decorated addr_to_string. */ + test_eq(AF_INET6, tor_addr_from_str(&t1, "[123:45:6789::5005:11]")); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); + test_streq(p1, "[123:45:6789::5005:11]"); + test_eq(AF_INET, tor_addr_from_str(&t1, "18.0.0.1")); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); + test_streq(p1, "18.0.0.1"); + + /* Test tor_addr_parse_reverse_lookup_name */ + i = tor_addr_parse_reverse_lookup_name(&t1, "Foobar.baz", AF_UNSPEC, 0); + test_eq(0, i); + i = tor_addr_parse_reverse_lookup_name(&t1, "Foobar.baz", AF_UNSPEC, 1); + test_eq(0, i); + i = tor_addr_parse_reverse_lookup_name(&t1, "1.0.168.192.in-addr.arpa", + AF_UNSPEC, 1); + test_eq(1, i); + test_eq(tor_addr_family(&t1), AF_INET); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); + test_streq(p1, "192.168.0.1"); + i = tor_addr_parse_reverse_lookup_name(&t1, "192.168.0.99", AF_UNSPEC, 0); + test_eq(0, i); + i = tor_addr_parse_reverse_lookup_name(&t1, "192.168.0.99", AF_UNSPEC, 1); + test_eq(1, i); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); + test_streq(p1, "192.168.0.99"); + memset(&t1, 0, sizeof(t1)); + i = tor_addr_parse_reverse_lookup_name(&t1, + "0.1.2.3.4.5.6.7.8.9.a.b.c.d.e.f." + "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." + "ip6.ARPA", + AF_UNSPEC, 0); + test_eq(1, i); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); + test_streq(p1, "[9dee:effe:ebe1:beef:fedc:ba98:7654:3210]"); + /* Failing cases. */ + i = tor_addr_parse_reverse_lookup_name(&t1, + "6.7.8.9.a.b.c.d.e.f." + "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." + "ip6.ARPA", + AF_UNSPEC, 0); + test_eq(i, -1); + i = tor_addr_parse_reverse_lookup_name(&t1, + "6.7.8.9.a.b.c.d.e.f.a.b.c.d.e.f.0." + "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." + "ip6.ARPA", + AF_UNSPEC, 0); + test_eq(i, -1); + i = tor_addr_parse_reverse_lookup_name(&t1, + "6.7.8.9.a.b.c.d.e.f.X.0.0.0.0.9." + "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." + "ip6.ARPA", + AF_UNSPEC, 0); + test_eq(i, -1); + i = tor_addr_parse_reverse_lookup_name(&t1, "32.1.1.in-addr.arpa", + AF_UNSPEC, 0); + test_eq(i, -1); + i = tor_addr_parse_reverse_lookup_name(&t1, ".in-addr.arpa", + AF_UNSPEC, 0); + test_eq(i, -1); + i = tor_addr_parse_reverse_lookup_name(&t1, "1.2.3.4.5.in-addr.arpa", + AF_UNSPEC, 0); + test_eq(i, -1); + i = tor_addr_parse_reverse_lookup_name(&t1, "1.2.3.4.5.in-addr.arpa", + AF_INET6, 0); + test_eq(i, -1); + i = tor_addr_parse_reverse_lookup_name(&t1, + "6.7.8.9.a.b.c.d.e.f.a.b.c.d.e.0." + "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." + "ip6.ARPA", + AF_INET, 0); + test_eq(i, -1); + + /* test tor_addr_parse_mask_ports */ + test_addr_mask_ports_parse("[::f]/17:47-95", AF_INET6, + 0, 0, 0, 0x0000000f, 17, 47, 95); + //test_addr_parse("[::fefe:4.1.1.7/120]:999-1000"); + //test_addr_parse_check("::fefe:401:107", 120, 999, 1000); + test_addr_mask_ports_parse("[::ffff:4.1.1.7]/120:443", AF_INET6, + 0, 0, 0x0000ffff, 0x04010107, 120, 443, 443); + test_addr_mask_ports_parse("[abcd:2::44a:0]:2-65000", AF_INET6, + 0xabcd0002, 0, 0, 0x044a0000, 128, 2, 65000); + + r=tor_addr_parse_mask_ports("[fefef::]/112", &t1, NULL, NULL, NULL); + test_assert(r == -1); + r=tor_addr_parse_mask_ports("efef::/112", &t1, NULL, NULL, NULL); + test_assert(r == -1); + r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f::]", &t1, NULL, NULL, NULL); + test_assert(r == -1); + r=tor_addr_parse_mask_ports("[::f:f:f:f:f:f:f:f]", &t1, NULL, NULL, NULL); + test_assert(r == -1); + r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f:f]", &t1, NULL, NULL, NULL); + test_assert(r == -1); + /* Test for V4-mapped address with mask < 96. (arguably not valid) */ + r=tor_addr_parse_mask_ports("[::ffff:1.1.2.2/33]", &t1, &mask, NULL, NULL); + test_assert(r == -1); + r=tor_addr_parse_mask_ports("1.1.2.2/33", &t1, &mask, NULL, NULL); + test_assert(r == -1); + r=tor_addr_parse_mask_ports("1.1.2.2/31", &t1, &mask, NULL, NULL); + test_assert(r == AF_INET); + r=tor_addr_parse_mask_ports("[efef::]/112", &t1, &mask, &port1, &port2); + test_assert(r == AF_INET6); + test_assert(port1 == 1); + test_assert(port2 == 65535); + + /* make sure inet address lengths >= max */ + test_assert(INET_NTOA_BUF_LEN >= sizeof("255.255.255.255")); + test_assert(TOR_ADDR_BUF_LEN >= + sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")); + + test_assert(sizeof(tor_addr_t) >= sizeof(struct in6_addr)); + + /* get interface addresses */ + r = get_interface_address6(LOG_DEBUG, AF_INET, &t1); + i = get_interface_address6(LOG_DEBUG, AF_INET6, &t2); +#if 0 + tor_inet_ntop(AF_INET, &t1.sa.sin_addr, buf, sizeof(buf)); + printf("\nv4 address: %s (family=%i)", buf, IN_FAMILY(&t1)); + tor_inet_ntop(AF_INET6, &t2.sa6.sin6_addr, buf, sizeof(buf)); + printf("\nv6 address: %s (family=%i)", buf, IN_FAMILY(&t2)); +#endif + + done: + ; +} + +#define ADDR_LEGACY(name) \ + { #name, legacy_test_helper, 0, &legacy_setup, test_addr_ ## name } + +struct testcase_t addr_tests[] = { + ADDR_LEGACY(basic), + ADDR_LEGACY(ip6_helpers), + END_OF_TESTCASES +}; + diff -Nru tor-0.2.0.34/src/test/test.c tor-0.2.2.16-alpha/src/test/test.c --- tor-0.2.0.34/src/test/test.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/test.c 2010-09-12 02:54:22.000000000 +0000 @@ -0,0 +1,1283 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/* Ordinarily defined in tor_main.c; this bit is just here to provide one + * since we're not linking to tor_main.c */ +const char tor_git_revision[] = ""; + +/** + * \file test.c + * \brief Unit tests for many pieces of the lower level Tor modules. + **/ + +#include "orconfig.h" + +#include +#ifdef HAVE_FCNTL_H +#include +#endif + +#ifdef MS_WINDOWS +/* For mkdir() */ +#include +#else +#include +#endif + +/* These macros pull in declarations for some functions and structures that + * are typically file-private. */ +#define BUFFERS_PRIVATE +#define CONFIG_PRIVATE +#define GEOIP_PRIVATE +#define ROUTER_PRIVATE +#define CIRCUIT_PRIVATE + +/* + * Linux doesn't provide lround in math.h by default, but mac os does... + * It's best just to leave math.h out of the picture entirely. + */ +//#include +long int lround(double x); +double fabs(double x); + +#include "or.h" +#include "buffers.h" +#include "circuitbuild.h" +#include "config.h" +#include "connection_edge.h" +#include "geoip.h" +#include "rendcommon.h" +#include "test.h" +#include "torgzip.h" +#include "mempool.h" +#include "memarea.h" +#include "onion.h" +#include "policies.h" +#include "rephist.h" +#include "routerparse.h" + +#ifdef USE_DMALLOC +#include +#include +#include "main.h" +#endif + +/** Set to true if any unit test has failed. Mostly, this is set by the macros + * in test.h */ +int have_failed = 0; + +/** Temporary directory (set up by setup_directory) under which we store all + * our files during testing. */ +static char temp_dir[256]; +static pid_t temp_dir_setup_in_pid = 0; + +/** Select and create the temporary directory we'll use to run our unit tests. + * Store it in temp_dir. Exit immediately if we can't create it. + * idempotent. */ +static void +setup_directory(void) +{ + static int is_setup = 0; + int r; + if (is_setup) return; + +#ifdef MS_WINDOWS + // XXXX + tor_snprintf(temp_dir, sizeof(temp_dir), + "c:\\windows\\temp\\tor_test_%d", (int)getpid()); + r = mkdir(temp_dir); +#else + tor_snprintf(temp_dir, sizeof(temp_dir), "/tmp/tor_test_%d", (int) getpid()); + r = mkdir(temp_dir, 0700); +#endif + if (r) { + fprintf(stderr, "Can't create directory %s:", temp_dir); + perror(""); + exit(1); + } + is_setup = 1; + temp_dir_setup_in_pid = getpid(); +} + +/** Return a filename relative to our testing temporary directory */ +const char * +get_fname(const char *name) +{ + static char buf[1024]; + setup_directory(); + if (!name) + return temp_dir; + tor_snprintf(buf,sizeof(buf),"%s/%s",temp_dir,name); + return buf; +} + +/** Remove all files stored under the temporary directory, and the directory + * itself. Called by atexit(). */ +static void +remove_directory(void) +{ + smartlist_t *elements; + if (getpid() != temp_dir_setup_in_pid) { + /* Only clean out the tempdir when the main process is exiting. */ + return; + } + elements = tor_listdir(temp_dir); + if (elements) { + SMARTLIST_FOREACH(elements, const char *, cp, + { + size_t len = strlen(cp)+strlen(temp_dir)+16; + char *tmp = tor_malloc(len); + tor_snprintf(tmp, len, "%s"PATH_SEPARATOR"%s", temp_dir, cp); + unlink(tmp); + tor_free(tmp); + }); + SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); + smartlist_free(elements); + } + rmdir(temp_dir); +} + +/** Define this if unit tests spend too much time generating public keys*/ +#undef CACHE_GENERATED_KEYS + +static crypto_pk_env_t *pregen_keys[5] = {NULL, NULL, NULL, NULL, NULL}; +#define N_PREGEN_KEYS ((int)(sizeof(pregen_keys)/sizeof(pregen_keys[0]))) + +/** Generate and return a new keypair for use in unit tests. If we're using + * the key cache optimization, we might reuse keys: we only guarantee that + * keys made with distinct values for idx are different. The value of + * idx must be at least 0, and less than N_PREGEN_KEYS. */ +crypto_pk_env_t * +pk_generate(int idx) +{ +#ifdef CACHE_GENERATED_KEYS + tor_assert(idx < N_PREGEN_KEYS); + if (! pregen_keys[idx]) { + pregen_keys[idx] = crypto_new_pk_env(); + tor_assert(!crypto_pk_generate_key(pregen_keys[idx])); + } + return crypto_pk_dup_key(pregen_keys[idx]); +#else + crypto_pk_env_t *result; + (void) idx; + result = crypto_new_pk_env(); + tor_assert(!crypto_pk_generate_key(result)); + return result; +#endif +} + +/** Free all storage used for the cached key optimization. */ +static void +free_pregenerated_keys(void) +{ + unsigned idx; + for (idx = 0; idx < N_PREGEN_KEYS; ++idx) { + if (pregen_keys[idx]) { + crypto_free_pk_env(pregen_keys[idx]); + pregen_keys[idx] = NULL; + } + } +} + +/** Run unit tests for buffers.c */ +static void +test_buffers(void) +{ + char str[256]; + char str2[256]; + + buf_t *buf = NULL, *buf2 = NULL; + const char *cp; + + int j; + size_t r; + + /**** + * buf_new + ****/ + if (!(buf = buf_new())) + test_fail(); + + //test_eq(buf_capacity(buf), 4096); + test_eq(buf_datalen(buf), 0); + + /**** + * General pointer frobbing + */ + for (j=0;j<256;++j) { + str[j] = (char)j; + } + write_to_buf(str, 256, buf); + write_to_buf(str, 256, buf); + test_eq(buf_datalen(buf), 512); + fetch_from_buf(str2, 200, buf); + test_memeq(str, str2, 200); + test_eq(buf_datalen(buf), 312); + memset(str2, 0, sizeof(str2)); + + fetch_from_buf(str2, 256, buf); + test_memeq(str+200, str2, 56); + test_memeq(str, str2+56, 200); + test_eq(buf_datalen(buf), 56); + memset(str2, 0, sizeof(str2)); + /* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add + * another 3584 bytes, we hit the end. */ + for (j=0;j<15;++j) { + write_to_buf(str, 256, buf); + } + assert_buf_ok(buf); + test_eq(buf_datalen(buf), 3896); + fetch_from_buf(str2, 56, buf); + test_eq(buf_datalen(buf), 3840); + test_memeq(str+200, str2, 56); + for (j=0;j<15;++j) { + memset(str2, 0, sizeof(str2)); + fetch_from_buf(str2, 256, buf); + test_memeq(str, str2, 256); + } + test_eq(buf_datalen(buf), 0); + buf_free(buf); + buf = NULL; + + /* Okay, now make sure growing can work. */ + buf = buf_new_with_capacity(16); + //test_eq(buf_capacity(buf), 16); + write_to_buf(str+1, 255, buf); + //test_eq(buf_capacity(buf), 256); + fetch_from_buf(str2, 254, buf); + test_memeq(str+1, str2, 254); + //test_eq(buf_capacity(buf), 256); + assert_buf_ok(buf); + write_to_buf(str, 32, buf); + //test_eq(buf_capacity(buf), 256); + assert_buf_ok(buf); + write_to_buf(str, 256, buf); + assert_buf_ok(buf); + //test_eq(buf_capacity(buf), 512); + test_eq(buf_datalen(buf), 33+256); + fetch_from_buf(str2, 33, buf); + test_eq(*str2, str[255]); + + test_memeq(str2+1, str, 32); + //test_eq(buf_capacity(buf), 512); + test_eq(buf_datalen(buf), 256); + fetch_from_buf(str2, 256, buf); + test_memeq(str, str2, 256); + + /* now try shrinking: case 1. */ + buf_free(buf); + buf = buf_new_with_capacity(33668); + for (j=0;j<67;++j) { + write_to_buf(str,255, buf); + } + //test_eq(buf_capacity(buf), 33668); + test_eq(buf_datalen(buf), 17085); + for (j=0; j < 40; ++j) { + fetch_from_buf(str2, 255,buf); + test_memeq(str2, str, 255); + } + + /* now try shrinking: case 2. */ + buf_free(buf); + buf = buf_new_with_capacity(33668); + for (j=0;j<67;++j) { + write_to_buf(str,255, buf); + } + for (j=0; j < 20; ++j) { + fetch_from_buf(str2, 255,buf); + test_memeq(str2, str, 255); + } + for (j=0;j<80;++j) { + write_to_buf(str,255, buf); + } + //test_eq(buf_capacity(buf),33668); + for (j=0; j < 120; ++j) { + fetch_from_buf(str2, 255,buf); + test_memeq(str2, str, 255); + } + + /* Move from buf to buf. */ + buf_free(buf); + buf = buf_new_with_capacity(4096); + buf2 = buf_new_with_capacity(4096); + for (j=0;j<100;++j) + write_to_buf(str, 255, buf); + test_eq(buf_datalen(buf), 25500); + for (j=0;j<100;++j) { + r = 10; + move_buf_to_buf(buf2, buf, &r); + test_eq(r, 0); + } + test_eq(buf_datalen(buf), 24500); + test_eq(buf_datalen(buf2), 1000); + for (j=0;j<3;++j) { + fetch_from_buf(str2, 255, buf2); + test_memeq(str2, str, 255); + } + r = 8192; /*big move*/ + move_buf_to_buf(buf2, buf, &r); + test_eq(r, 0); + r = 30000; /* incomplete move */ + move_buf_to_buf(buf2, buf, &r); + test_eq(r, 13692); + for (j=0;j<97;++j) { + fetch_from_buf(str2, 255, buf2); + test_memeq(str2, str, 255); + } + buf_free(buf); + buf_free(buf2); + buf = buf2 = NULL; + + buf = buf_new_with_capacity(5); + cp = "Testing. This is a moderately long Testing string."; + for (j = 0; cp[j]; j++) + write_to_buf(cp+j, 1, buf); + test_eq(0, buf_find_string_offset(buf, "Testing", 7)); + test_eq(1, buf_find_string_offset(buf, "esting", 6)); + test_eq(1, buf_find_string_offset(buf, "est", 3)); + test_eq(39, buf_find_string_offset(buf, "ing str", 7)); + test_eq(35, buf_find_string_offset(buf, "Testing str", 11)); + test_eq(32, buf_find_string_offset(buf, "ng ", 3)); + test_eq(43, buf_find_string_offset(buf, "string.", 7)); + test_eq(-1, buf_find_string_offset(buf, "shrdlu", 6)); + test_eq(-1, buf_find_string_offset(buf, "Testing thing", 13)); + test_eq(-1, buf_find_string_offset(buf, "ngx", 3)); + buf_free(buf); + buf = NULL; + + done: + if (buf) + buf_free(buf); + if (buf2) + buf_free(buf2); +} + +/** Run unit tests for the onion handshake code. */ +static void +test_onion_handshake(void) +{ + /* client-side */ + crypto_dh_env_t *c_dh = NULL; + char c_buf[ONIONSKIN_CHALLENGE_LEN]; + char c_keys[40]; + + /* server-side */ + char s_buf[ONIONSKIN_REPLY_LEN]; + char s_keys[40]; + + /* shared */ + crypto_pk_env_t *pk = NULL; + + pk = pk_generate(0); + + /* client handshake 1. */ + memset(c_buf, 0, ONIONSKIN_CHALLENGE_LEN); + test_assert(! onion_skin_create(pk, &c_dh, c_buf)); + + /* server handshake */ + memset(s_buf, 0, ONIONSKIN_REPLY_LEN); + memset(s_keys, 0, 40); + test_assert(! onion_skin_server_handshake(c_buf, pk, NULL, + s_buf, s_keys, 40)); + + /* client handshake 2 */ + memset(c_keys, 0, 40); + test_assert(! onion_skin_client_handshake(c_dh, s_buf, c_keys, 40)); + + if (memcmp(c_keys, s_keys, 40)) { + puts("Aiiiie"); + exit(1); + } + test_memeq(c_keys, s_keys, 40); + memset(s_buf, 0, 40); + test_memneq(c_keys, s_buf, 40); + + done: + if (c_dh) + crypto_dh_free(c_dh); + if (pk) + crypto_free_pk_env(pk); +} + +static void +test_circuit_timeout(void) +{ + /* Plan: + * 1. Generate 1000 samples + * 2. Estimate parameters + * 3. If difference, repeat + * 4. Save state + * 5. load state + * 6. Estimate parameters + * 7. compare differences + */ + circuit_build_times_t initial; + circuit_build_times_t estimate; + circuit_build_times_t final; + double timeout1, timeout2; + or_state_t state; + int i, runs; + double close_ms; + circuit_build_times_init(&initial); + circuit_build_times_init(&estimate); + circuit_build_times_init(&final); + + memset(&state, 0, sizeof(or_state_t)); + + circuitbuild_running_unit_tests(); +#define timeout0 (build_time_t)(30*1000.0) + initial.Xm = 3000; + circuit_build_times_initial_alpha(&initial, + CBT_DEFAULT_QUANTILE_CUTOFF/100.0, + timeout0); + close_ms = MAX(circuit_build_times_calculate_timeout(&initial, + CBT_DEFAULT_CLOSE_QUANTILE/100.0), + CBT_DEFAULT_TIMEOUT_INITIAL_VALUE); + do { + for (i=0; i < CBT_DEFAULT_MIN_CIRCUITS_TO_OBSERVE; i++) { + build_time_t sample = circuit_build_times_generate_sample(&initial,0,1); + + if (sample > close_ms) { + circuit_build_times_add_time(&estimate, CBT_BUILD_ABANDONED); + } else { + circuit_build_times_add_time(&estimate, sample); + } + } + circuit_build_times_update_alpha(&estimate); + timeout1 = circuit_build_times_calculate_timeout(&estimate, + CBT_DEFAULT_QUANTILE_CUTOFF/100.0); + circuit_build_times_set_timeout(&estimate); + log_notice(LD_CIRC, "Timeout1 is %lf, Xm is %d", timeout1, estimate.Xm); + /* 2% error */ + } while (fabs(circuit_build_times_cdf(&initial, timeout0) - + circuit_build_times_cdf(&initial, timeout1)) > 0.02); + + test_assert(estimate.total_build_times <= CBT_NCIRCUITS_TO_OBSERVE); + + circuit_build_times_update_state(&estimate, &state); + test_assert(circuit_build_times_parse_state(&final, &state) == 0); + + circuit_build_times_update_alpha(&final); + timeout2 = circuit_build_times_calculate_timeout(&final, + CBT_DEFAULT_QUANTILE_CUTOFF/100.0); + + circuit_build_times_set_timeout(&final); + log_notice(LD_CIRC, "Timeout2 is %lf, Xm is %d", timeout2, final.Xm); + + /* 5% here because some accuracy is lost due to histogram conversion */ + test_assert(fabs(circuit_build_times_cdf(&initial, timeout0) - + circuit_build_times_cdf(&initial, timeout2)) < 0.05); + + for (runs = 0; runs < 50; runs++) { + int build_times_idx = 0; + int total_build_times = 0; + + final.close_ms = final.timeout_ms = CBT_DEFAULT_TIMEOUT_INITIAL_VALUE; + estimate.close_ms = estimate.timeout_ms + = CBT_DEFAULT_TIMEOUT_INITIAL_VALUE; + + for (i = 0; i < CBT_DEFAULT_RECENT_CIRCUITS*2; i++) { + circuit_build_times_network_circ_success(&estimate); + circuit_build_times_add_time(&estimate, + circuit_build_times_generate_sample(&estimate, 0, + CBT_DEFAULT_QUANTILE_CUTOFF/100.0)); + + circuit_build_times_network_circ_success(&estimate); + circuit_build_times_add_time(&final, + circuit_build_times_generate_sample(&final, 0, + CBT_DEFAULT_QUANTILE_CUTOFF/100.0)); + } + + test_assert(!circuit_build_times_network_check_changed(&estimate)); + test_assert(!circuit_build_times_network_check_changed(&final)); + + /* Reset liveness to be non-live */ + final.liveness.network_last_live = 0; + estimate.liveness.network_last_live = 0; + + build_times_idx = estimate.build_times_idx; + total_build_times = estimate.total_build_times; + for (i = 0; i < CBT_NETWORK_NONLIVE_TIMEOUT_COUNT; i++) { + test_assert(circuit_build_times_network_check_live(&estimate)); + test_assert(circuit_build_times_network_check_live(&final)); + + circuit_build_times_count_close(&estimate, 0, + (time_t)(approx_time()-estimate.close_ms/1000.0-1)); + circuit_build_times_count_close(&final, 0, + (time_t)(approx_time()-final.close_ms/1000.0-1)); + } + + test_assert(!circuit_build_times_network_check_live(&estimate)); + test_assert(!circuit_build_times_network_check_live(&final)); + + for ( ; i < CBT_NETWORK_NONLIVE_DISCARD_COUNT; i++) { + circuit_build_times_count_close(&estimate, 0, + (time_t)(approx_time()-estimate.close_ms/1000.0-1)); + + if (i < CBT_NETWORK_NONLIVE_DISCARD_COUNT-1) { + circuit_build_times_count_close(&final, 0, + (time_t)(approx_time()-final.close_ms/1000.0-1)); + } + } + + test_assert(!circuit_build_times_network_check_live(&estimate)); + test_assert(!circuit_build_times_network_check_live(&final)); + + log_info(LD_CIRC, "idx: %d %d, tot: %d %d", + build_times_idx, estimate.build_times_idx, + total_build_times, estimate.total_build_times); + + /* Check rollback index. Should match top of loop. */ + test_assert(build_times_idx == estimate.build_times_idx); + // This can fail if estimate.total_build_times == 1000, because + // in that case, rewind actually causes us to lose timeouts + if (total_build_times != CBT_NCIRCUITS_TO_OBSERVE) + test_assert(total_build_times == estimate.total_build_times); + + /* Now simulate that the network has become live and we need + * a change */ + circuit_build_times_network_is_live(&estimate); + circuit_build_times_network_is_live(&final); + + for (i = 0; i < CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT; i++) { + circuit_build_times_count_timeout(&estimate, 1); + + if (i < CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT-1) { + circuit_build_times_count_timeout(&final, 1); + } + } + + test_assert(estimate.liveness.after_firsthop_idx == 0); + test_assert(final.liveness.after_firsthop_idx == + CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT-1); + + test_assert(circuit_build_times_network_check_live(&estimate)); + test_assert(circuit_build_times_network_check_live(&final)); + + circuit_build_times_count_timeout(&final, 1); + } + + done: + return; +} + +/** Helper: Parse the exit policy string in policy_str, and make sure + * that policies_summarize() produces the string expected_summary from + * it. */ +static void +test_policy_summary_helper(const char *policy_str, + const char *expected_summary) +{ + config_line_t line; + smartlist_t *policy = smartlist_create(); + char *summary = NULL; + int r; + + line.key = (char*)"foo"; + line.value = (char *)policy_str; + line.next = NULL; + + r = policies_parse_exit_policy(&line, &policy, 0, NULL, 1); + test_eq(r, 0); + summary = policy_summarize(policy); + + test_assert(summary != NULL); + test_streq(summary, expected_summary); + + done: + tor_free(summary); + if (policy) + addr_policy_list_free(policy); +} + +/** Run unit tests for generating summary lines of exit policies */ +static void +test_policies(void) +{ + int i; + smartlist_t *policy = NULL, *policy2 = NULL, *policy3 = NULL, + *policy4 = NULL, *policy5 = NULL, *policy6 = NULL, + *policy7 = NULL; + addr_policy_t *p; + tor_addr_t tar; + config_line_t line; + smartlist_t *sm = NULL; + char *policy_str = NULL; + + policy = smartlist_create(); + + p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",-1); + test_assert(p != NULL); + test_eq(ADDR_POLICY_REJECT, p->policy_type); + tor_addr_from_ipv4h(&tar, 0xc0a80000u); + test_eq(0, tor_addr_compare(&p->addr, &tar, CMP_EXACT)); + test_eq(16, p->maskbits); + test_eq(1, p->prt_min); + test_eq(65535, p->prt_max); + + smartlist_add(policy, p); + + test_assert(ADDR_POLICY_ACCEPTED == + compare_addr_to_addr_policy(0x01020304u, 2, policy)); + test_assert(ADDR_POLICY_PROBABLY_ACCEPTED == + compare_addr_to_addr_policy(0, 2, policy)); + test_assert(ADDR_POLICY_REJECTED == + compare_addr_to_addr_policy(0xc0a80102, 2, policy)); + + test_assert(0 == policies_parse_exit_policy(NULL, &policy2, 1, NULL, 1)); + test_assert(policy2); + + policy3 = smartlist_create(); + p = router_parse_addr_policy_item_from_string("reject *:*",-1); + test_assert(p != NULL); + smartlist_add(policy3, p); + p = router_parse_addr_policy_item_from_string("accept *:*",-1); + test_assert(p != NULL); + smartlist_add(policy3, p); + + policy4 = smartlist_create(); + p = router_parse_addr_policy_item_from_string("accept *:443",-1); + test_assert(p != NULL); + smartlist_add(policy4, p); + p = router_parse_addr_policy_item_from_string("accept *:443",-1); + test_assert(p != NULL); + smartlist_add(policy4, p); + + policy5 = smartlist_create(); + p = router_parse_addr_policy_item_from_string("reject 0.0.0.0/8:*",-1); + test_assert(p != NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 169.254.0.0/16:*",-1); + test_assert(p != NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 127.0.0.0/8:*",-1); + test_assert(p != NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",-1); + test_assert(p != NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 10.0.0.0/8:*",-1); + test_assert(p != NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 172.16.0.0/12:*",-1); + test_assert(p != NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 80.190.250.90:*",-1); + test_assert(p != NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject *:1-65534",-1); + test_assert(p != NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject *:65535",-1); + test_assert(p != NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("accept *:1-65535",-1); + test_assert(p != NULL); + smartlist_add(policy5, p); + + policy6 = smartlist_create(); + p = router_parse_addr_policy_item_from_string("accept 43.3.0.0/9:*",-1); + test_assert(p != NULL); + smartlist_add(policy6, p); + + policy7 = smartlist_create(); + p = router_parse_addr_policy_item_from_string("accept 0.0.0.0/8:*",-1); + test_assert(p != NULL); + smartlist_add(policy7, p); + + test_assert(!exit_policy_is_general_exit(policy)); + test_assert(exit_policy_is_general_exit(policy2)); + test_assert(!exit_policy_is_general_exit(NULL)); + test_assert(!exit_policy_is_general_exit(policy3)); + test_assert(!exit_policy_is_general_exit(policy4)); + test_assert(!exit_policy_is_general_exit(policy5)); + test_assert(!exit_policy_is_general_exit(policy6)); + test_assert(!exit_policy_is_general_exit(policy7)); + + test_assert(cmp_addr_policies(policy, policy2)); + test_assert(cmp_addr_policies(policy, NULL)); + test_assert(!cmp_addr_policies(policy2, policy2)); + test_assert(!cmp_addr_policies(NULL, NULL)); + + test_assert(!policy_is_reject_star(policy2)); + test_assert(policy_is_reject_star(policy)); + test_assert(policy_is_reject_star(NULL)); + + addr_policy_list_free(policy); + policy = NULL; + + /* make sure compacting logic works. */ + policy = NULL; + line.key = (char*)"foo"; + line.value = (char*)"accept *:80,reject private:*,reject *:*"; + line.next = NULL; + test_assert(0 == policies_parse_exit_policy(&line, &policy, 0, NULL, 1)); + test_assert(policy); + //test_streq(policy->string, "accept *:80"); + //test_streq(policy->next->string, "reject *:*"); + test_eq(smartlist_len(policy), 2); + + /* test policy summaries */ + /* check if we properly ignore private IP addresses */ + test_policy_summary_helper("reject 192.168.0.0/16:*," + "reject 0.0.0.0/8:*," + "reject 10.0.0.0/8:*," + "accept *:10-30," + "accept *:90," + "reject *:*", + "accept 10-30,90"); + /* check all accept policies, and proper counting of rejects */ + test_policy_summary_helper("reject 11.0.0.0/9:80," + "reject 12.0.0.0/9:80," + "reject 13.0.0.0/9:80," + "reject 14.0.0.0/9:80," + "accept *:*", "accept 1-65535"); + test_policy_summary_helper("reject 11.0.0.0/9:80," + "reject 12.0.0.0/9:80," + "reject 13.0.0.0/9:80," + "reject 14.0.0.0/9:80," + "reject 15.0.0.0:81," + "accept *:*", "accept 1-65535"); + test_policy_summary_helper("reject 11.0.0.0/9:80," + "reject 12.0.0.0/9:80," + "reject 13.0.0.0/9:80," + "reject 14.0.0.0/9:80," + "reject 15.0.0.0:80," + "accept *:*", + "reject 80"); + /* no exits */ + test_policy_summary_helper("accept 11.0.0.0/9:80," + "reject *:*", + "reject 1-65535"); + /* port merging */ + test_policy_summary_helper("accept *:80," + "accept *:81," + "accept *:100-110," + "accept *:111," + "reject *:*", + "accept 80-81,100-111"); + /* border ports */ + test_policy_summary_helper("accept *:1," + "accept *:3," + "accept *:65535," + "reject *:*", + "accept 1,3,65535"); + /* holes */ + test_policy_summary_helper("accept *:1," + "accept *:3," + "accept *:5," + "accept *:7," + "reject *:*", + "accept 1,3,5,7"); + test_policy_summary_helper("reject *:1," + "reject *:3," + "reject *:5," + "reject *:7," + "accept *:*", + "reject 1,3,5,7"); + + /* truncation ports */ + sm = smartlist_create(); + for (i=1; i<2000; i+=2) { + char buf[POLICY_BUF_LEN]; + tor_snprintf(buf, sizeof(buf), "reject *:%d", i); + smartlist_add(sm, tor_strdup(buf)); + } + smartlist_add(sm, tor_strdup("accept *:*")); + policy_str = smartlist_join_strings(sm, ",", 0, NULL); + test_policy_summary_helper( policy_str, + "accept 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44," + "46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90," + "92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128," + "130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164," + "166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200," + "202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236," + "238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272," + "274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308," + "310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344," + "346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380," + "382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416," + "418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452," + "454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488," + "490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522"); + + done: + addr_policy_list_free(policy); + addr_policy_list_free(policy2); + addr_policy_list_free(policy3); + addr_policy_list_free(policy4); + addr_policy_list_free(policy5); + addr_policy_list_free(policy6); + addr_policy_list_free(policy7); + tor_free(policy_str); + if (sm) { + SMARTLIST_FOREACH(sm, char *, s, tor_free(s)); + smartlist_free(sm); + } +} + +/** Run AES performance benchmarks. */ +static void +bench_aes(void) +{ + int len, i; + char *b1, *b2; + crypto_cipher_env_t *c; + struct timeval start, end; + const int iters = 100000; + uint64_t nsec; + c = crypto_new_cipher_env(); + crypto_cipher_generate_key(c); + crypto_cipher_encrypt_init_cipher(c); + for (len = 1; len <= 8192; len *= 2) { + b1 = tor_malloc_zero(len); + b2 = tor_malloc_zero(len); + tor_gettimeofday(&start); + for (i = 0; i < iters; ++i) { + crypto_cipher_encrypt(c, b1, b2, len); + } + tor_gettimeofday(&end); + tor_free(b1); + tor_free(b2); + nsec = (uint64_t) tv_udiff(&start,&end); + nsec *= 1000; + nsec /= (iters*len); + printf("%d bytes: "U64_FORMAT" nsec per byte\n", len, + U64_PRINTF_ARG(nsec)); + } + crypto_free_cipher_env(c); +} + +/** Run digestmap_t performance benchmarks. */ +static void +bench_dmap(void) +{ + smartlist_t *sl = smartlist_create(); + smartlist_t *sl2 = smartlist_create(); + struct timeval start, end, pt2, pt3, pt4; + const int iters = 10000; + const int elts = 4000; + const int fpostests = 1000000; + char d[20]; + int i,n=0, fp = 0; + digestmap_t *dm = digestmap_new(); + digestset_t *ds = digestset_new(elts); + + for (i = 0; i < elts; ++i) { + crypto_rand(d, 20); + smartlist_add(sl, tor_memdup(d, 20)); + } + for (i = 0; i < elts; ++i) { + crypto_rand(d, 20); + smartlist_add(sl2, tor_memdup(d, 20)); + } + printf("nbits=%d\n", ds->mask+1); + + tor_gettimeofday(&start); + for (i = 0; i < iters; ++i) { + SMARTLIST_FOREACH(sl, const char *, cp, digestmap_set(dm, cp, (void*)1)); + } + tor_gettimeofday(&pt2); + for (i = 0; i < iters; ++i) { + SMARTLIST_FOREACH(sl, const char *, cp, digestmap_get(dm, cp)); + SMARTLIST_FOREACH(sl2, const char *, cp, digestmap_get(dm, cp)); + } + tor_gettimeofday(&pt3); + for (i = 0; i < iters; ++i) { + SMARTLIST_FOREACH(sl, const char *, cp, digestset_add(ds, cp)); + } + tor_gettimeofday(&pt4); + for (i = 0; i < iters; ++i) { + SMARTLIST_FOREACH(sl, const char *, cp, n += digestset_isin(ds, cp)); + SMARTLIST_FOREACH(sl2, const char *, cp, n += digestset_isin(ds, cp)); + } + tor_gettimeofday(&end); + + for (i = 0; i < fpostests; ++i) { + crypto_rand(d, 20); + if (digestset_isin(ds, d)) ++fp; + } + + printf("%ld\n",(unsigned long)tv_udiff(&start, &pt2)); + printf("%ld\n",(unsigned long)tv_udiff(&pt2, &pt3)); + printf("%ld\n",(unsigned long)tv_udiff(&pt3, &pt4)); + printf("%ld\n",(unsigned long)tv_udiff(&pt4, &end)); + printf("-- %d\n", n); + printf("++ %f\n", fp/(double)fpostests); + digestmap_free(dm, NULL); + digestset_free(ds); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp)); + smartlist_free(sl); + smartlist_free(sl2); +} + +/** Test encoding and parsing of rendezvous service descriptors. */ +static void +test_rend_fns(void) +{ + rend_service_descriptor_t *generated = NULL, *parsed = NULL; + char service_id[DIGEST_LEN]; + char service_id_base32[REND_SERVICE_ID_LEN_BASE32+1]; + const char *next_desc; + smartlist_t *descs = smartlist_create(); + char computed_desc_id[DIGEST_LEN]; + char parsed_desc_id[DIGEST_LEN]; + crypto_pk_env_t *pk1 = NULL, *pk2 = NULL; + time_t now; + char *intro_points_encrypted = NULL; + size_t intro_points_size; + size_t encoded_size; + int i; + char address1[] = "fooaddress.onion"; + char address2[] = "aaaaaaaaaaaaaaaa.onion"; + char address3[] = "fooaddress.exit"; + char address4[] = "www.torproject.org"; + + test_assert(BAD_HOSTNAME == parse_extended_hostname(address1, 1)); + test_assert(ONION_HOSTNAME == parse_extended_hostname(address2, 1)); + test_assert(EXIT_HOSTNAME == parse_extended_hostname(address3, 1)); + test_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4, 1)); + + pk1 = pk_generate(0); + pk2 = pk_generate(1); + generated = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + generated->pk = crypto_pk_dup_key(pk1); + crypto_pk_get_digest(generated->pk, service_id); + base32_encode(service_id_base32, REND_SERVICE_ID_LEN_BASE32+1, + service_id, REND_SERVICE_ID_LEN); + now = time(NULL); + generated->timestamp = now; + generated->version = 2; + generated->protocols = 42; + generated->intro_nodes = smartlist_create(); + + for (i = 0; i < 3; i++) { + rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t)); + crypto_pk_env_t *okey = pk_generate(2 + i); + intro->extend_info = tor_malloc_zero(sizeof(extend_info_t)); + intro->extend_info->onion_key = okey; + crypto_pk_get_digest(intro->extend_info->onion_key, + intro->extend_info->identity_digest); + //crypto_rand(info->identity_digest, DIGEST_LEN); /* Would this work? */ + intro->extend_info->nickname[0] = '$'; + base16_encode(intro->extend_info->nickname + 1, + sizeof(intro->extend_info->nickname) - 1, + intro->extend_info->identity_digest, DIGEST_LEN); + /* Does not cover all IP addresses. */ + tor_addr_from_ipv4h(&intro->extend_info->addr, crypto_rand_int(65536)); + intro->extend_info->port = 1 + crypto_rand_int(65535); + intro->intro_key = crypto_pk_dup_key(pk2); + smartlist_add(generated->intro_nodes, intro); + } + test_assert(rend_encode_v2_descriptors(descs, generated, now, 0, + REND_NO_AUTH, NULL, NULL) > 0); + test_assert(rend_compute_v2_desc_id(computed_desc_id, service_id_base32, + NULL, now, 0) == 0); + test_memeq(((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0))->desc_id, computed_desc_id, DIGEST_LEN); + test_assert(rend_parse_v2_service_descriptor(&parsed, parsed_desc_id, + &intro_points_encrypted, + &intro_points_size, + &encoded_size, + &next_desc, + ((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0))->desc_str) == 0); + test_assert(parsed); + test_memeq(((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0))->desc_id, parsed_desc_id, DIGEST_LEN); + test_eq(rend_parse_introduction_points(parsed, intro_points_encrypted, + intro_points_size), 3); + test_assert(!crypto_pk_cmp_keys(generated->pk, parsed->pk)); + test_eq(parsed->timestamp, now); + test_eq(parsed->version, 2); + test_eq(parsed->protocols, 42); + test_eq(smartlist_len(parsed->intro_nodes), 3); + for (i = 0; i < smartlist_len(parsed->intro_nodes); i++) { + rend_intro_point_t *par_intro = smartlist_get(parsed->intro_nodes, i), + *gen_intro = smartlist_get(generated->intro_nodes, i); + extend_info_t *par_info = par_intro->extend_info; + extend_info_t *gen_info = gen_intro->extend_info; + test_assert(!crypto_pk_cmp_keys(gen_info->onion_key, par_info->onion_key)); + test_memeq(gen_info->identity_digest, par_info->identity_digest, + DIGEST_LEN); + test_streq(gen_info->nickname, par_info->nickname); + test_assert(tor_addr_eq(&gen_info->addr, &par_info->addr)); + test_eq(gen_info->port, par_info->port); + } + + rend_service_descriptor_free(parsed); + rend_service_descriptor_free(generated); + parsed = generated = NULL; + + done: + if (descs) { + for (i = 0; i < smartlist_len(descs); i++) + rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i)); + smartlist_free(descs); + } + if (parsed) + rend_service_descriptor_free(parsed); + if (generated) + rend_service_descriptor_free(generated); + if (pk1) + crypto_free_pk_env(pk1); + if (pk2) + crypto_free_pk_env(pk2); + tor_free(intro_points_encrypted); +} + +/** Run unit tests for GeoIP code. */ +static void +test_geoip(void) +{ + int i, j; + time_t now = time(NULL); + char *s = NULL; + + /* Populate the DB a bit. Add these in order, since we can't do the final + * 'sort' step. These aren't very good IP addresses, but they're perfectly + * fine uint32_t values. */ + test_eq(0, geoip_parse_entry("10,50,AB")); + test_eq(0, geoip_parse_entry("52,90,XY")); + test_eq(0, geoip_parse_entry("95,100,AB")); + test_eq(0, geoip_parse_entry("\"105\",\"140\",\"ZZ\"")); + test_eq(0, geoip_parse_entry("\"150\",\"190\",\"XY\"")); + test_eq(0, geoip_parse_entry("\"200\",\"250\",\"AB\"")); + + /* We should have 4 countries: ??, ab, xy, zz. */ + test_eq(4, geoip_get_n_countries()); + /* Make sure that country ID actually works. */ +#define NAMEFOR(x) geoip_get_country_name(geoip_get_country_by_ip(x)) + test_streq("??", NAMEFOR(3)); + test_eq(0, geoip_get_country_by_ip(3)); + test_streq("ab", NAMEFOR(32)); + test_streq("??", NAMEFOR(5)); + test_streq("??", NAMEFOR(51)); + test_streq("xy", NAMEFOR(150)); + test_streq("xy", NAMEFOR(190)); + test_streq("??", NAMEFOR(2000)); +#undef NAMEFOR + + get_options()->BridgeRelay = 1; + get_options()->BridgeRecordUsageByCountry = 1; + /* Put 9 observations in AB... */ + for (i=32; i < 40; ++i) + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now-7200); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, 225, now-7200); + /* and 3 observations in XY, several times. */ + for (j=0; j < 10; ++j) + for (i=52; i < 55; ++i) + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now-3600); + /* and 17 observations in ZZ... */ + for (i=110; i < 127; ++i) + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now); + s = geoip_get_client_history(GEOIP_CLIENT_CONNECT); + test_assert(s); + test_streq("zz=24,ab=16,xy=8", s); + tor_free(s); + + /* Now clear out all the AB observations. */ + geoip_remove_old_clients(now-6000); + s = geoip_get_client_history(GEOIP_CLIENT_CONNECT); + test_assert(s); + test_streq("zz=24,xy=8", s); + + done: + tor_free(s); +} + +/** Run unit tests for stats code. */ +static void +test_stats(void) +{ + time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */ + char *s = NULL; + + /* We shouldn't collect exit stats without initializing them. */ + rep_hist_note_exit_stream_opened(80); + rep_hist_note_exit_bytes(80, 100, 10000); + s = rep_hist_format_exit_stats(now + 86400); + test_assert(!s); + + /* Initialize stats, note some streams and bytes, and generate history + * string. */ + rep_hist_exit_stats_init(now); + rep_hist_note_exit_stream_opened(80); + rep_hist_note_exit_bytes(80, 100, 10000); + rep_hist_note_exit_stream_opened(443); + rep_hist_note_exit_bytes(443, 100, 10000); + rep_hist_note_exit_bytes(443, 100, 10000); + s = rep_hist_format_exit_stats(now + 86400); + test_streq("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "exit-kibibytes-written 80=1,443=1,other=0\n" + "exit-kibibytes-read 80=10,443=20,other=0\n" + "exit-streams-opened 80=4,443=4,other=0\n", s); + tor_free(s); + + /* Stop collecting stats, add some bytes, and ensure we don't generate + * a history string. */ + rep_hist_exit_stats_term(); + rep_hist_note_exit_bytes(80, 100, 10000); + s = rep_hist_format_exit_stats(now + 86400); + test_assert(!s); + + /* Re-start stats, add some bytes, reset stats, and see what history we + * get when observing no streams or bytes at all. */ + rep_hist_exit_stats_init(now); + rep_hist_note_exit_stream_opened(80); + rep_hist_note_exit_bytes(80, 100, 10000); + rep_hist_reset_exit_stats(now); + s = rep_hist_format_exit_stats(now + 86400); + test_streq("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "exit-kibibytes-written other=0\n" + "exit-kibibytes-read other=0\n" + "exit-streams-opened other=0\n", s); + + done: + tor_free(s); +} + +static void * +legacy_test_setup(const struct testcase_t *testcase) +{ + return testcase->setup_data; +} + +void +legacy_test_helper(void *data) +{ + void (*fn)(void) = data; + fn(); +} + +static int +legacy_test_cleanup(const struct testcase_t *testcase, void *ptr) +{ + (void)ptr; + (void)testcase; + return 1; +} + +const struct testcase_setup_t legacy_setup = { + legacy_test_setup, legacy_test_cleanup +}; + +#define ENT(name) \ + { #name, legacy_test_helper, 0, &legacy_setup, test_ ## name } +#define SUBENT(group, name) \ + { #group "_" #name, legacy_test_helper, 0, &legacy_setup, \ + test_ ## group ## _ ## name } +#define DISABLED(name) \ + { #name, legacy_test_helper, TT_SKIP, &legacy_setup, name } +#define FORK(name) \ + { #name, legacy_test_helper, TT_FORK, &legacy_setup, test_ ## name } + +static struct testcase_t test_array[] = { + ENT(buffers), + ENT(onion_handshake), + ENT(circuit_timeout), + ENT(policies), + ENT(rend_fns), + ENT(geoip), + FORK(stats), + + DISABLED(bench_aes), + DISABLED(bench_dmap), + END_OF_TESTCASES +}; + +extern struct testcase_t addr_tests[]; +extern struct testcase_t crypto_tests[]; +extern struct testcase_t container_tests[]; +extern struct testcase_t util_tests[]; +extern struct testcase_t dir_tests[]; + +static struct testgroup_t testgroups[] = { + { "", test_array }, + { "addr/", addr_tests }, + { "crypto/", crypto_tests }, + { "container/", container_tests }, + { "util/", util_tests }, + { "dir/", dir_tests }, + END_OF_GROUPS +}; + +/** Main entry point for unit test code: parse the command line, and run + * some unit tests. */ +int +main(int c, const char **v) +{ + or_options_t *options; + char *errmsg = NULL; + int i, i_out; + int loglevel = LOG_ERR; + +#ifdef USE_DMALLOC + { + int r = CRYPTO_set_mem_ex_functions(_tor_malloc, _tor_realloc, _tor_free); + tor_assert(r); + } +#endif + + update_approx_time(time(NULL)); + options = options_new(); + tor_threads_init(); + init_logging(); + + for (i_out = i = 1; i < c; ++i) { + if (!strcmp(v[i], "--warn")) { + loglevel = LOG_WARN; + } else if (!strcmp(v[i], "--notice")) { + loglevel = LOG_NOTICE; + } else if (!strcmp(v[i], "--info")) { + loglevel = LOG_INFO; + } else if (!strcmp(v[i], "--debug")) { + loglevel = LOG_DEBUG; + } else { + v[i_out++] = v[i]; + } + } + c = i_out; + + { + log_severity_list_t s; + memset(&s, 0, sizeof(s)); + set_log_severity_config(loglevel, LOG_ERR, &s); + add_stream_log(&s, "", fileno(stdout)); + } + + options->command = CMD_RUN_UNITTESTS; + crypto_global_init(0, NULL, NULL); + rep_hist_init(); + network_init(); + setup_directory(); + options_init(options); + options->DataDirectory = tor_strdup(temp_dir); + options->EntryStatistics = 1; + if (set_options(options, &errmsg) < 0) { + printf("Failed to set initial options: %s\n", errmsg); + tor_free(errmsg); + return 1; + } + + crypto_seed_rng(1); + + atexit(remove_directory); + + have_failed = (tinytest_main(c, v, testgroups) != 0); + + free_pregenerated_keys(); +#ifdef USE_DMALLOC + tor_free_all(0); + dmalloc_log_unfreed(); +#endif + + if (have_failed) + return 1; + else + return 0; +} + diff -Nru tor-0.2.0.34/src/test/test_containers.c tor-0.2.2.16-alpha/src/test/test_containers.c --- tor-0.2.0.34/src/test/test_containers.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/test_containers.c 2010-03-07 04:03:28.000000000 +0000 @@ -0,0 +1,765 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" +#include "test.h" + +/** Helper: return a tristate based on comparing the strings in *a and + * *b. */ +static int +_compare_strs(const void **a, const void **b) +{ + const char *s1 = *a, *s2 = *b; + return strcmp(s1, s2); +} + +/** Helper: return a tristate based on comparing the strings in *a and + * *b, excluding a's first character, and ignoring case. */ +static int +_compare_without_first_ch(const void *a, const void **b) +{ + const char *s1 = a, *s2 = *b; + return strcasecmp(s1+1, s2); +} + +/** Run unit tests for basic dynamic-sized array functionality. */ +static void +test_container_smartlist_basic(void) +{ + smartlist_t *sl; + + /* XXXX test sort_digests, uniq_strings, uniq_digests */ + + /* Test smartlist add, del_keeporder, insert, get. */ + sl = smartlist_create(); + smartlist_add(sl, (void*)1); + smartlist_add(sl, (void*)2); + smartlist_add(sl, (void*)3); + smartlist_add(sl, (void*)4); + smartlist_del_keeporder(sl, 1); + smartlist_insert(sl, 1, (void*)22); + smartlist_insert(sl, 0, (void*)0); + smartlist_insert(sl, 5, (void*)555); + test_eq_ptr((void*)0, smartlist_get(sl,0)); + test_eq_ptr((void*)1, smartlist_get(sl,1)); + test_eq_ptr((void*)22, smartlist_get(sl,2)); + test_eq_ptr((void*)3, smartlist_get(sl,3)); + test_eq_ptr((void*)4, smartlist_get(sl,4)); + test_eq_ptr((void*)555, smartlist_get(sl,5)); + /* Try deleting in the middle. */ + smartlist_del(sl, 1); + test_eq_ptr((void*)555, smartlist_get(sl, 1)); + /* Try deleting at the end. */ + smartlist_del(sl, 4); + test_eq(4, smartlist_len(sl)); + + /* test isin. */ + test_assert(smartlist_isin(sl, (void*)3)); + test_assert(!smartlist_isin(sl, (void*)99)); + + done: + smartlist_free(sl); +} + +/** Run unit tests for smartlist-of-strings functionality. */ +static void +test_container_smartlist_strings(void) +{ + smartlist_t *sl = smartlist_create(); + char *cp=NULL, *cp_alloc=NULL; + size_t sz; + + /* Test split and join */ + test_eq(0, smartlist_len(sl)); + smartlist_split_string(sl, "abc", ":", 0, 0); + test_eq(1, smartlist_len(sl)); + test_streq("abc", smartlist_get(sl, 0)); + smartlist_split_string(sl, "a::bc::", "::", 0, 0); + test_eq(4, smartlist_len(sl)); + test_streq("a", smartlist_get(sl, 1)); + test_streq("bc", smartlist_get(sl, 2)); + test_streq("", smartlist_get(sl, 3)); + cp_alloc = smartlist_join_strings(sl, "", 0, NULL); + test_streq(cp_alloc, "abcabc"); + tor_free(cp_alloc); + cp_alloc = smartlist_join_strings(sl, "!", 0, NULL); + test_streq(cp_alloc, "abc!a!bc!"); + tor_free(cp_alloc); + cp_alloc = smartlist_join_strings(sl, "XY", 0, NULL); + test_streq(cp_alloc, "abcXYaXYbcXY"); + tor_free(cp_alloc); + cp_alloc = smartlist_join_strings(sl, "XY", 1, NULL); + test_streq(cp_alloc, "abcXYaXYbcXYXY"); + tor_free(cp_alloc); + cp_alloc = smartlist_join_strings(sl, "", 1, NULL); + test_streq(cp_alloc, "abcabc"); + tor_free(cp_alloc); + + smartlist_split_string(sl, "/def/ /ghijk", "/", 0, 0); + test_eq(8, smartlist_len(sl)); + test_streq("", smartlist_get(sl, 4)); + test_streq("def", smartlist_get(sl, 5)); + test_streq(" ", smartlist_get(sl, 6)); + test_streq("ghijk", smartlist_get(sl, 7)); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + smartlist_split_string(sl, "a,bbd,cdef", ",", SPLIT_SKIP_SPACE, 0); + test_eq(3, smartlist_len(sl)); + test_streq("a", smartlist_get(sl,0)); + test_streq("bbd", smartlist_get(sl,1)); + test_streq("cdef", smartlist_get(sl,2)); + smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", + SPLIT_SKIP_SPACE, 0); + test_eq(8, smartlist_len(sl)); + test_streq("z", smartlist_get(sl,3)); + test_streq("zhasd", smartlist_get(sl,4)); + test_streq("", smartlist_get(sl,5)); + test_streq("bnud", smartlist_get(sl,6)); + test_streq("", smartlist_get(sl,7)); + + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + smartlist_split_string(sl, " ab\tc \td ef ", NULL, + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + test_eq(4, smartlist_len(sl)); + test_streq("ab", smartlist_get(sl,0)); + test_streq("c", smartlist_get(sl,1)); + test_streq("d", smartlist_get(sl,2)); + test_streq("ef", smartlist_get(sl,3)); + smartlist_split_string(sl, "ghi\tj", NULL, + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + test_eq(6, smartlist_len(sl)); + test_streq("ghi", smartlist_get(sl,4)); + test_streq("j", smartlist_get(sl,5)); + + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + cp_alloc = smartlist_join_strings(sl, "XY", 0, NULL); + test_streq(cp_alloc, ""); + tor_free(cp_alloc); + cp_alloc = smartlist_join_strings(sl, "XY", 1, NULL); + test_streq(cp_alloc, "XY"); + tor_free(cp_alloc); + + smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + test_eq(3, smartlist_len(sl)); + test_streq("z", smartlist_get(sl, 0)); + test_streq("zhasd", smartlist_get(sl, 1)); + test_streq("bnud", smartlist_get(sl, 2)); + smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); + test_eq(5, smartlist_len(sl)); + test_streq("z", smartlist_get(sl, 3)); + test_streq("zhasd <> <> bnud<>", smartlist_get(sl, 4)); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + smartlist_split_string(sl, "abcd\n", "\n", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + test_eq(1, smartlist_len(sl)); + test_streq("abcd", smartlist_get(sl, 0)); + smartlist_split_string(sl, "efgh", "\n", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + test_eq(2, smartlist_len(sl)); + test_streq("efgh", smartlist_get(sl, 1)); + + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Test swapping, shuffling, and sorting. */ + smartlist_split_string(sl, "the,onion,router,by,arma,and,nickm", ",", 0, 0); + test_eq(7, smartlist_len(sl)); + smartlist_sort(sl, _compare_strs); + cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); + test_streq(cp_alloc,"and,arma,by,nickm,onion,router,the"); + tor_free(cp_alloc); + smartlist_swap(sl, 1, 5); + cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); + test_streq(cp_alloc,"and,router,by,nickm,onion,arma,the"); + tor_free(cp_alloc); + smartlist_shuffle(sl); + test_eq(7, smartlist_len(sl)); + test_assert(smartlist_string_isin(sl, "and")); + test_assert(smartlist_string_isin(sl, "router")); + test_assert(smartlist_string_isin(sl, "by")); + test_assert(smartlist_string_isin(sl, "nickm")); + test_assert(smartlist_string_isin(sl, "onion")); + test_assert(smartlist_string_isin(sl, "arma")); + test_assert(smartlist_string_isin(sl, "the")); + + /* Test bsearch. */ + smartlist_sort(sl, _compare_strs); + test_streq("nickm", smartlist_bsearch(sl, "zNicKM", + _compare_without_first_ch)); + test_streq("and", smartlist_bsearch(sl, " AND", _compare_without_first_ch)); + test_eq_ptr(NULL, smartlist_bsearch(sl, " ANz", _compare_without_first_ch)); + + /* Test bsearch_idx */ + { + int f; + test_eq(0, smartlist_bsearch_idx(sl," aaa",_compare_without_first_ch,&f)); + test_eq(f, 0); + test_eq(0, smartlist_bsearch_idx(sl," and",_compare_without_first_ch,&f)); + test_eq(f, 1); + test_eq(1, smartlist_bsearch_idx(sl," arm",_compare_without_first_ch,&f)); + test_eq(f, 0); + test_eq(1, smartlist_bsearch_idx(sl," arma",_compare_without_first_ch,&f)); + test_eq(f, 1); + test_eq(2, smartlist_bsearch_idx(sl," armb",_compare_without_first_ch,&f)); + test_eq(f, 0); + test_eq(7, smartlist_bsearch_idx(sl," zzzz",_compare_without_first_ch,&f)); + test_eq(f, 0); + } + + /* Test reverse() and pop_last() */ + smartlist_reverse(sl); + cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); + test_streq(cp_alloc,"the,router,onion,nickm,by,arma,and"); + tor_free(cp_alloc); + cp_alloc = smartlist_pop_last(sl); + test_streq(cp_alloc, "and"); + tor_free(cp_alloc); + test_eq(smartlist_len(sl), 6); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + cp_alloc = smartlist_pop_last(sl); + test_eq(cp_alloc, NULL); + + /* Test uniq() */ + smartlist_split_string(sl, + "50,noon,radar,a,man,a,plan,a,canal,panama,radar,noon,50", + ",", 0, 0); + smartlist_sort(sl, _compare_strs); + smartlist_uniq(sl, _compare_strs, _tor_free); + cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); + test_streq(cp_alloc, "50,a,canal,man,noon,panama,plan,radar"); + tor_free(cp_alloc); + + /* Test string_isin and isin_case and num_isin */ + test_assert(smartlist_string_isin(sl, "noon")); + test_assert(!smartlist_string_isin(sl, "noonoon")); + test_assert(smartlist_string_isin_case(sl, "nOOn")); + test_assert(!smartlist_string_isin_case(sl, "nooNooN")); + test_assert(smartlist_string_num_isin(sl, 50)); + test_assert(!smartlist_string_num_isin(sl, 60)); + + /* Test smartlist_choose */ + { + int i; + int allsame = 1; + int allin = 1; + void *first = smartlist_choose(sl); + test_assert(smartlist_isin(sl, first)); + for (i = 0; i < 100; ++i) { + void *second = smartlist_choose(sl); + if (second != first) + allsame = 0; + if (!smartlist_isin(sl, second)) + allin = 0; + } + test_assert(!allsame); + test_assert(allin); + } + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Test string_remove and remove and join_strings2 */ + smartlist_split_string(sl, + "Some say the Earth will end in ice and some in fire", + " ", 0, 0); + cp = smartlist_get(sl, 4); + test_streq(cp, "will"); + smartlist_add(sl, cp); + smartlist_remove(sl, cp); + tor_free(cp); + cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); + test_streq(cp_alloc, "Some,say,the,Earth,fire,end,in,ice,and,some,in"); + tor_free(cp_alloc); + smartlist_string_remove(sl, "in"); + cp_alloc = smartlist_join_strings2(sl, "+XX", 1, 0, &sz); + test_streq(cp_alloc, "Some+say+the+Earth+fire+end+some+ice+and"); + test_eq((int)sz, 40); + + done: + + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_free(sl); + tor_free(cp_alloc); +} + +/** Run unit tests for smartlist set manipulation functions. */ +static void +test_container_smartlist_overlap(void) +{ + smartlist_t *sl = smartlist_create(); + smartlist_t *ints = smartlist_create(); + smartlist_t *odds = smartlist_create(); + smartlist_t *evens = smartlist_create(); + smartlist_t *primes = smartlist_create(); + int i; + for (i=1; i < 10; i += 2) + smartlist_add(odds, (void*)(uintptr_t)i); + for (i=0; i < 10; i += 2) + smartlist_add(evens, (void*)(uintptr_t)i); + + /* add_all */ + smartlist_add_all(ints, odds); + smartlist_add_all(ints, evens); + test_eq(smartlist_len(ints), 10); + + smartlist_add(primes, (void*)2); + smartlist_add(primes, (void*)3); + smartlist_add(primes, (void*)5); + smartlist_add(primes, (void*)7); + + /* overlap */ + test_assert(smartlist_overlap(ints, odds)); + test_assert(smartlist_overlap(odds, primes)); + test_assert(smartlist_overlap(evens, primes)); + test_assert(!smartlist_overlap(odds, evens)); + + /* intersect */ + smartlist_add_all(sl, odds); + smartlist_intersect(sl, primes); + test_eq(smartlist_len(sl), 3); + test_assert(smartlist_isin(sl, (void*)3)); + test_assert(smartlist_isin(sl, (void*)5)); + test_assert(smartlist_isin(sl, (void*)7)); + + /* subtract */ + smartlist_add_all(sl, primes); + smartlist_subtract(sl, odds); + test_eq(smartlist_len(sl), 1); + test_assert(smartlist_isin(sl, (void*)2)); + + done: + smartlist_free(odds); + smartlist_free(evens); + smartlist_free(ints); + smartlist_free(primes); + smartlist_free(sl); +} + +/** Run unit tests for smartlist-of-digests functions. */ +static void +test_container_smartlist_digests(void) +{ + smartlist_t *sl = smartlist_create(); + + /* digest_isin. */ + smartlist_add(sl, tor_memdup("AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN)); + smartlist_add(sl, tor_memdup("\00090AAB2AAAAaasdAAAAA", DIGEST_LEN)); + smartlist_add(sl, tor_memdup("\00090AAB2AAAAaasdAAAAA", DIGEST_LEN)); + test_eq(0, smartlist_digest_isin(NULL, "AAAAAAAAAAAAAAAAAAAA")); + test_assert(smartlist_digest_isin(sl, "AAAAAAAAAAAAAAAAAAAA")); + test_assert(smartlist_digest_isin(sl, "\00090AAB2AAAAaasdAAAAA")); + test_eq(0, smartlist_digest_isin(sl, "\00090AAB2AAABaasdAAAAA")); + + /* sort digests */ + smartlist_sort_digests(sl); + test_memeq(smartlist_get(sl, 0), "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); + test_memeq(smartlist_get(sl, 1), "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); + test_memeq(smartlist_get(sl, 2), "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN); + test_eq(3, smartlist_len(sl)); + + /* uniq_digests */ + smartlist_uniq_digests(sl); + test_eq(2, smartlist_len(sl)); + test_memeq(smartlist_get(sl, 0), "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); + test_memeq(smartlist_get(sl, 1), "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN); + + done: + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_free(sl); +} + +/** Run unit tests for concatenate-a-smartlist-of-strings functions. */ +static void +test_container_smartlist_join(void) +{ + smartlist_t *sl = smartlist_create(); + smartlist_t *sl2 = smartlist_create(), *sl3 = smartlist_create(), + *sl4 = smartlist_create(); + char *joined=NULL; + /* unique, sorted. */ + smartlist_split_string(sl, + "Abashments Ambush Anchorman Bacon Banks Borscht " + "Bunks Inhumane Insurance Knish Know Manners " + "Maraschinos Stamina Sunbonnets Unicorns Wombats", + " ", 0, 0); + /* non-unique, sorted. */ + smartlist_split_string(sl2, + "Ambush Anchorman Anchorman Anemias Anemias Bacon " + "Crossbowmen Inhumane Insurance Knish Know Manners " + "Manners Maraschinos Wombats Wombats Work", + " ", 0, 0); + SMARTLIST_FOREACH_JOIN(sl, char *, cp1, + sl2, char *, cp2, + strcmp(cp1,cp2), + smartlist_add(sl3, cp2)) { + test_streq(cp1, cp2); + smartlist_add(sl4, cp1); + } SMARTLIST_FOREACH_JOIN_END(cp1, cp2); + + SMARTLIST_FOREACH(sl3, const char *, cp, + test_assert(smartlist_isin(sl2, cp) && + !smartlist_string_isin(sl, cp))); + SMARTLIST_FOREACH(sl4, const char *, cp, + test_assert(smartlist_isin(sl, cp) && + smartlist_string_isin(sl2, cp))); + joined = smartlist_join_strings(sl3, ",", 0, NULL); + test_streq(joined, "Anemias,Anemias,Crossbowmen,Work"); + tor_free(joined); + joined = smartlist_join_strings(sl4, ",", 0, NULL); + test_streq(joined, "Ambush,Anchorman,Anchorman,Bacon,Inhumane,Insurance," + "Knish,Know,Manners,Manners,Maraschinos,Wombats,Wombats"); + tor_free(joined); + + done: + smartlist_free(sl4); + smartlist_free(sl3); + SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp)); + smartlist_free(sl2); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_free(sl); + tor_free(joined); +} + +/** Run unit tests for bitarray code */ +static void +test_container_bitarray(void) +{ + bitarray_t *ba = NULL; + int i, j, ok=1; + + ba = bitarray_init_zero(1); + test_assert(ba); + test_assert(! bitarray_is_set(ba, 0)); + bitarray_set(ba, 0); + test_assert(bitarray_is_set(ba, 0)); + bitarray_clear(ba, 0); + test_assert(! bitarray_is_set(ba, 0)); + bitarray_free(ba); + + ba = bitarray_init_zero(1023); + for (i = 1; i < 64; ) { + for (j = 0; j < 1023; ++j) { + if (j % i) + bitarray_set(ba, j); + else + bitarray_clear(ba, j); + } + for (j = 0; j < 1023; ++j) { + if (!bool_eq(bitarray_is_set(ba, j), j%i)) + ok = 0; + } + test_assert(ok); + if (i < 7) + ++i; + else if (i == 28) + i = 32; + else + i += 7; + } + + done: + if (ba) + bitarray_free(ba); +} + +/** Run unit tests for digest set code (implemented as a hashtable or as a + * bloom filter) */ +static void +test_container_digestset(void) +{ + smartlist_t *included = smartlist_create(); + char d[DIGEST_LEN]; + int i; + int ok = 1; + int false_positives = 0; + digestset_t *set = NULL; + + for (i = 0; i < 1000; ++i) { + crypto_rand(d, DIGEST_LEN); + smartlist_add(included, tor_memdup(d, DIGEST_LEN)); + } + set = digestset_new(1000); + SMARTLIST_FOREACH(included, const char *, cp, + if (digestset_isin(set, cp)) + ok = 0); + test_assert(ok); + SMARTLIST_FOREACH(included, const char *, cp, + digestset_add(set, cp)); + SMARTLIST_FOREACH(included, const char *, cp, + if (!digestset_isin(set, cp)) + ok = 0); + test_assert(ok); + for (i = 0; i < 1000; ++i) { + crypto_rand(d, DIGEST_LEN); + if (digestset_isin(set, d)) + ++false_positives; + } + test_assert(false_positives < 50); /* Should be far lower. */ + + done: + if (set) + digestset_free(set); + SMARTLIST_FOREACH(included, char *, cp, tor_free(cp)); + smartlist_free(included); +} + +typedef struct pq_entry_t { + const char *val; + int idx; +} pq_entry_t; + +/** Helper: return a tristate based on comparing two pq_entry_t values. */ +static int +_compare_strings_for_pqueue(const void *p1, const void *p2) +{ + const pq_entry_t *e1=p1, *e2=p2; + return strcmp(e1->val, e2->val); +} + +/** Run unit tests for heap-based priority queue functions. */ +static void +test_container_pqueue(void) +{ + smartlist_t *sl = smartlist_create(); + int (*cmp)(const void *, const void*); + const int offset = STRUCT_OFFSET(pq_entry_t, idx); +#define ENTRY(s) pq_entry_t s = { #s, -1 } + ENTRY(cows); + ENTRY(zebras); + ENTRY(fish); + ENTRY(frogs); + ENTRY(apples); + ENTRY(squid); + ENTRY(daschunds); + ENTRY(eggplants); + ENTRY(weissbier); + ENTRY(lobsters); + ENTRY(roquefort); + ENTRY(chinchillas); + ENTRY(fireflies); + +#define OK() smartlist_pqueue_assert_ok(sl, cmp, offset) + + cmp = _compare_strings_for_pqueue; + smartlist_pqueue_add(sl, cmp, offset, &cows); + smartlist_pqueue_add(sl, cmp, offset, &zebras); + smartlist_pqueue_add(sl, cmp, offset, &fish); + smartlist_pqueue_add(sl, cmp, offset, &frogs); + smartlist_pqueue_add(sl, cmp, offset, &apples); + smartlist_pqueue_add(sl, cmp, offset, &squid); + smartlist_pqueue_add(sl, cmp, offset, &daschunds); + smartlist_pqueue_add(sl, cmp, offset, &eggplants); + smartlist_pqueue_add(sl, cmp, offset, &weissbier); + smartlist_pqueue_add(sl, cmp, offset, &lobsters); + smartlist_pqueue_add(sl, cmp, offset, &roquefort); + + OK(); + + test_eq(smartlist_len(sl), 11); + test_eq_ptr(smartlist_get(sl, 0), &apples); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &apples); + test_eq(smartlist_len(sl), 10); + OK(); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &cows); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &daschunds); + smartlist_pqueue_add(sl, cmp, offset, &chinchillas); + OK(); + smartlist_pqueue_add(sl, cmp, offset, &fireflies); + OK(); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &chinchillas); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &eggplants); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &fireflies); + OK(); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &fish); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &frogs); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &lobsters); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &roquefort); + OK(); + test_eq(smartlist_len(sl), 3); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &squid); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &weissbier); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &zebras); + test_eq(smartlist_len(sl), 0); + OK(); + + /* Now test remove. */ + smartlist_pqueue_add(sl, cmp, offset, &cows); + smartlist_pqueue_add(sl, cmp, offset, &fish); + smartlist_pqueue_add(sl, cmp, offset, &frogs); + smartlist_pqueue_add(sl, cmp, offset, &apples); + smartlist_pqueue_add(sl, cmp, offset, &squid); + smartlist_pqueue_add(sl, cmp, offset, &zebras); + test_eq(smartlist_len(sl), 6); + OK(); + smartlist_pqueue_remove(sl, cmp, offset, &zebras); + test_eq(smartlist_len(sl), 5); + OK(); + smartlist_pqueue_remove(sl, cmp, offset, &cows); + test_eq(smartlist_len(sl), 4); + OK(); + smartlist_pqueue_remove(sl, cmp, offset, &apples); + test_eq(smartlist_len(sl), 3); + OK(); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &fish); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &frogs); + test_eq_ptr(smartlist_pqueue_pop(sl, cmp, offset), &squid); + test_eq(smartlist_len(sl), 0); + OK(); + +#undef OK + + done: + + smartlist_free(sl); +} + +/** Run unit tests for string-to-void* map functions */ +static void +test_container_strmap(void) +{ + strmap_t *map; + strmap_iter_t *iter; + const char *k; + void *v; + char *visited = NULL; + smartlist_t *found_keys = NULL; + + map = strmap_new(); + test_assert(map); + test_eq(strmap_size(map), 0); + test_assert(strmap_isempty(map)); + v = strmap_set(map, "K1", (void*)99); + test_eq(v, NULL); + test_assert(!strmap_isempty(map)); + v = strmap_set(map, "K2", (void*)101); + test_eq(v, NULL); + v = strmap_set(map, "K1", (void*)100); + test_eq(v, (void*)99); + test_eq_ptr(strmap_get(map,"K1"), (void*)100); + test_eq_ptr(strmap_get(map,"K2"), (void*)101); + test_eq_ptr(strmap_get(map,"K-not-there"), NULL); + strmap_assert_ok(map); + + v = strmap_remove(map,"K2"); + strmap_assert_ok(map); + test_eq_ptr(v, (void*)101); + test_eq_ptr(strmap_get(map,"K2"), NULL); + test_eq_ptr(strmap_remove(map,"K2"), NULL); + + strmap_set(map, "K2", (void*)101); + strmap_set(map, "K3", (void*)102); + strmap_set(map, "K4", (void*)103); + test_eq(strmap_size(map), 4); + strmap_assert_ok(map); + strmap_set(map, "K5", (void*)104); + strmap_set(map, "K6", (void*)105); + strmap_assert_ok(map); + + /* Test iterator. */ + iter = strmap_iter_init(map); + found_keys = smartlist_create(); + while (!strmap_iter_done(iter)) { + strmap_iter_get(iter,&k,&v); + smartlist_add(found_keys, tor_strdup(k)); + test_eq_ptr(v, strmap_get(map, k)); + + if (!strcmp(k, "K2")) { + iter = strmap_iter_next_rmv(map,iter); + } else { + iter = strmap_iter_next(map,iter); + } + } + + /* Make sure we removed K2, but not the others. */ + test_eq_ptr(strmap_get(map, "K2"), NULL); + test_eq_ptr(strmap_get(map, "K5"), (void*)104); + /* Make sure we visited everyone once */ + smartlist_sort_strings(found_keys); + visited = smartlist_join_strings(found_keys, ":", 0, NULL); + test_streq(visited, "K1:K2:K3:K4:K5:K6"); + + strmap_assert_ok(map); + /* Clean up after ourselves. */ + strmap_free(map, NULL); + map = NULL; + + /* Now try some lc functions. */ + map = strmap_new(); + strmap_set_lc(map,"Ab.C", (void*)1); + test_eq_ptr(strmap_get(map,"ab.c"), (void*)1); + strmap_assert_ok(map); + test_eq_ptr(strmap_get_lc(map,"AB.C"), (void*)1); + test_eq_ptr(strmap_get(map,"AB.C"), NULL); + test_eq_ptr(strmap_remove_lc(map,"aB.C"), (void*)1); + strmap_assert_ok(map); + test_eq_ptr(strmap_get_lc(map,"AB.C"), NULL); + + done: + if (map) + strmap_free(map,NULL); + if (found_keys) { + SMARTLIST_FOREACH(found_keys, char *, cp, tor_free(cp)); + smartlist_free(found_keys); + } + tor_free(visited); +} + +/** Run unit tests for getting the median of a list. */ +static void +test_container_order_functions(void) +{ + int lst[25], n = 0; + // int a=12,b=24,c=25,d=60,e=77; + +#define median() median_int(lst, n) + + lst[n++] = 12; + test_eq(12, median()); /* 12 */ + lst[n++] = 77; + //smartlist_shuffle(sl); + test_eq(12, median()); /* 12, 77 */ + lst[n++] = 77; + //smartlist_shuffle(sl); + test_eq(77, median()); /* 12, 77, 77 */ + lst[n++] = 24; + test_eq(24, median()); /* 12,24,77,77 */ + lst[n++] = 60; + lst[n++] = 12; + lst[n++] = 25; + //smartlist_shuffle(sl); + test_eq(25, median()); /* 12,12,24,25,60,77,77 */ +#undef median + + done: + ; +} + +#define CONTAINER_LEGACY(name) \ + { #name, legacy_test_helper, 0, &legacy_setup, test_container_ ## name } + +struct testcase_t container_tests[] = { + CONTAINER_LEGACY(smartlist_basic), + CONTAINER_LEGACY(smartlist_strings), + CONTAINER_LEGACY(smartlist_overlap), + CONTAINER_LEGACY(smartlist_digests), + CONTAINER_LEGACY(smartlist_join), + CONTAINER_LEGACY(bitarray), + CONTAINER_LEGACY(digestset), + CONTAINER_LEGACY(strmap), + CONTAINER_LEGACY(pqueue), + CONTAINER_LEGACY(order_functions), + END_OF_TESTCASES +}; + diff -Nru tor-0.2.0.34/src/test/test_crypto.c tor-0.2.2.16-alpha/src/test/test_crypto.c --- tor-0.2.0.34/src/test/test_crypto.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/test_crypto.c 2010-07-13 01:37:00.000000000 +0000 @@ -0,0 +1,788 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define CRYPTO_PRIVATE +#include "or.h" +#include "test.h" + +/** Run unit tests for Diffie-Hellman functionality. */ +static void +test_crypto_dh(void) +{ + crypto_dh_env_t *dh1 = crypto_dh_new(); + crypto_dh_env_t *dh2 = crypto_dh_new(); + char p1[DH_BYTES]; + char p2[DH_BYTES]; + char s1[DH_BYTES]; + char s2[DH_BYTES]; + ssize_t s1len, s2len; + + test_eq(crypto_dh_get_bytes(dh1), DH_BYTES); + test_eq(crypto_dh_get_bytes(dh2), DH_BYTES); + + memset(p1, 0, DH_BYTES); + memset(p2, 0, DH_BYTES); + test_memeq(p1, p2, DH_BYTES); + test_assert(! crypto_dh_get_public(dh1, p1, DH_BYTES)); + test_memneq(p1, p2, DH_BYTES); + test_assert(! crypto_dh_get_public(dh2, p2, DH_BYTES)); + test_memneq(p1, p2, DH_BYTES); + + memset(s1, 0, DH_BYTES); + memset(s2, 0xFF, DH_BYTES); + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p2, DH_BYTES, s1, 50); + s2len = crypto_dh_compute_secret(LOG_WARN, dh2, p1, DH_BYTES, s2, 50); + test_assert(s1len > 0); + test_eq(s1len, s2len); + test_memeq(s1, s2, s1len); + + { + /* XXXX Now fabricate some bad values and make sure they get caught, + * Check 0, 1, N-1, >= N, etc. + */ + } + + done: + crypto_dh_free(dh1); + crypto_dh_free(dh2); +} + +/** Run unit tests for our random number generation function and its wrappers. + */ +static void +test_crypto_rng(void) +{ + int i, j, allok; + char data1[100], data2[100]; + double d; + + /* Try out RNG. */ + test_assert(! crypto_seed_rng(0)); + crypto_rand(data1, 100); + crypto_rand(data2, 100); + test_memneq(data1,data2,100); + allok = 1; + for (i = 0; i < 100; ++i) { + uint64_t big; + char *host; + j = crypto_rand_int(100); + if (i < 0 || i >= 100) + allok = 0; + big = crypto_rand_uint64(U64_LITERAL(1)<<40); + if (big >= (U64_LITERAL(1)<<40)) + allok = 0; + big = crypto_rand_uint64(U64_LITERAL(5)); + if (big >= 5) + allok = 0; + d = crypto_rand_double(); + test_assert(d >= 0); + test_assert(d < 1.0); + host = crypto_random_hostname(3,8,"www.",".onion"); + if (strcmpstart(host,"www.") || + strcmpend(host,".onion") || + strlen(host) < 13 || + strlen(host) > 18) + allok = 0; + tor_free(host); + } + test_assert(allok); + done: + ; +} + +/** Run unit tests for our AES functionality */ +static void +test_crypto_aes(void) +{ + char *data1 = NULL, *data2 = NULL, *data3 = NULL; + crypto_cipher_env_t *env1 = NULL, *env2 = NULL; + int i, j; + char *mem_op_hex_tmp=NULL; + + data1 = tor_malloc(1024); + data2 = tor_malloc(1024); + data3 = tor_malloc(1024); + + /* Now, test encryption and decryption with stream cipher. */ + data1[0]='\0'; + for (i = 1023; i>0; i -= 35) + strncat(data1, "Now is the time for all good onions", i); + + memset(data2, 0, 1024); + memset(data3, 0, 1024); + env1 = crypto_new_cipher_env(); + test_neq(env1, 0); + env2 = crypto_new_cipher_env(); + test_neq(env2, 0); + j = crypto_cipher_generate_key(env1); + crypto_cipher_set_key(env2, crypto_cipher_get_key(env1)); + crypto_cipher_encrypt_init_cipher(env1); + crypto_cipher_decrypt_init_cipher(env2); + + /* Try encrypting 512 chars. */ + crypto_cipher_encrypt(env1, data2, data1, 512); + crypto_cipher_decrypt(env2, data3, data2, 512); + test_memeq(data1, data3, 512); + test_memneq(data1, data2, 512); + + /* Now encrypt 1 at a time, and get 1 at a time. */ + for (j = 512; j < 560; ++j) { + crypto_cipher_encrypt(env1, data2+j, data1+j, 1); + } + for (j = 512; j < 560; ++j) { + crypto_cipher_decrypt(env2, data3+j, data2+j, 1); + } + test_memeq(data1, data3, 560); + /* Now encrypt 3 at a time, and get 5 at a time. */ + for (j = 560; j < 1024-5; j += 3) { + crypto_cipher_encrypt(env1, data2+j, data1+j, 3); + } + for (j = 560; j < 1024-5; j += 5) { + crypto_cipher_decrypt(env2, data3+j, data2+j, 5); + } + test_memeq(data1, data3, 1024-5); + /* Now make sure that when we encrypt with different chunk sizes, we get + the same results. */ + crypto_free_cipher_env(env2); + env2 = NULL; + + memset(data3, 0, 1024); + env2 = crypto_new_cipher_env(); + test_neq(env2, 0); + crypto_cipher_set_key(env2, crypto_cipher_get_key(env1)); + crypto_cipher_encrypt_init_cipher(env2); + for (j = 0; j < 1024-16; j += 17) { + crypto_cipher_encrypt(env2, data3+j, data1+j, 17); + } + for (j= 0; j < 1024-16; ++j) { + if (data2[j] != data3[j]) { + printf("%d: %d\t%d\n", j, (int) data2[j], (int) data3[j]); + } + } + test_memeq(data2, data3, 1024-16); + crypto_free_cipher_env(env1); + env1 = NULL; + crypto_free_cipher_env(env2); + env2 = NULL; + + /* NIST test vector for aes. */ + env1 = crypto_new_cipher_env(); /* IV starts at 0 */ + crypto_cipher_set_key(env1, "\x80\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00"); + crypto_cipher_encrypt_init_cipher(env1); + crypto_cipher_encrypt(env1, data1, + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00", 16); + test_memeq_hex(data1, "0EDD33D3C621E546455BD8BA1418BEC8"); + + /* Now test rollover. All these values are originally from a python + * script. */ + crypto_cipher_set_iv(env1, "\x00\x00\x00\x00\x00\x00\x00\x00" + "\xff\xff\xff\xff\xff\xff\xff\xff"); + memset(data2, 0, 1024); + crypto_cipher_encrypt(env1, data1, data2, 32); + test_memeq_hex(data1, "335fe6da56f843199066c14a00a40231" + "cdd0b917dbc7186908a6bfb5ffd574d3"); + + crypto_cipher_set_iv(env1, "\x00\x00\x00\x00\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xff\xff\xff"); + memset(data2, 0, 1024); + crypto_cipher_encrypt(env1, data1, data2, 32); + test_memeq_hex(data1, "e627c6423fa2d77832a02b2794094b73" + "3e63c721df790d2c6469cc1953a3ffac"); + + crypto_cipher_set_iv(env1, "\xff\xff\xff\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xff\xff\xff"); + memset(data2, 0, 1024); + crypto_cipher_encrypt(env1, data1, data2, 32); + test_memeq_hex(data1, "2aed2bff0de54f9328efd070bf48f70a" + "0EDD33D3C621E546455BD8BA1418BEC8"); + + /* Now check rollover on inplace cipher. */ + crypto_cipher_set_iv(env1, "\xff\xff\xff\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xff\xff\xff"); + crypto_cipher_crypt_inplace(env1, data2, 64); + test_memeq_hex(data2, "2aed2bff0de54f9328efd070bf48f70a" + "0EDD33D3C621E546455BD8BA1418BEC8" + "93e2c5243d6839eac58503919192f7ae" + "1908e67cafa08d508816659c2e693191"); + crypto_cipher_set_iv(env1, "\xff\xff\xff\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xff\xff\xff"); + crypto_cipher_crypt_inplace(env1, data2, 64); + test_assert(tor_mem_is_zero(data2, 64)); + + done: + tor_free(mem_op_hex_tmp); + if (env1) + crypto_free_cipher_env(env1); + if (env2) + crypto_free_cipher_env(env2); + tor_free(data1); + tor_free(data2); + tor_free(data3); +} + +/** Run unit tests for our SHA-1 functionality */ +static void +test_crypto_sha(void) +{ + crypto_digest_env_t *d1 = NULL, *d2 = NULL; + int i; + char key[80]; + char digest[32]; + char data[50]; + char d_out1[DIGEST_LEN], d_out2[DIGEST256_LEN]; + char *mem_op_hex_tmp=NULL; + + /* Test SHA-1 with a test vector from the specification. */ + i = crypto_digest(data, "abc", 3); + test_memeq_hex(data, "A9993E364706816ABA3E25717850C26C9CD0D89D"); + + /* Test SHA-256 with a test vector from the specification. */ + i = crypto_digest256(data, "abc", 3, DIGEST_SHA256); + test_memeq_hex(data, "BA7816BF8F01CFEA414140DE5DAE2223B00361A3" + "96177A9CB410FF61F20015AD"); + + /* Test HMAC-SHA-1 with test cases from RFC2202. */ + + /* Case 1. */ + memset(key, 0x0b, 20); + crypto_hmac_sha1(digest, key, 20, "Hi There", 8); + test_streq(hex_str(digest, 20), + "B617318655057264E28BC0B6FB378C8EF146BE00"); + /* Case 2. */ + crypto_hmac_sha1(digest, "Jefe", 4, "what do ya want for nothing?", 28); + test_streq(hex_str(digest, 20), + "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79"); + + /* Case 4. */ + base16_decode(key, 25, + "0102030405060708090a0b0c0d0e0f10111213141516171819", 50); + memset(data, 0xcd, 50); + crypto_hmac_sha1(digest, key, 25, data, 50); + test_streq(hex_str(digest, 20), + "4C9007F4026250C6BC8414F9BF50C86C2D7235DA"); + + /* Case 5. */ + memset(key, 0xaa, 80); + crypto_hmac_sha1(digest, key, 80, + "Test Using Larger Than Block-Size Key - Hash Key First", + 54); + test_streq(hex_str(digest, 20), + "AA4AE5E15272D00E95705637CE8A3B55ED402112"); + + /* Incremental digest code. */ + d1 = crypto_new_digest_env(); + test_assert(d1); + crypto_digest_add_bytes(d1, "abcdef", 6); + d2 = crypto_digest_dup(d1); + test_assert(d2); + crypto_digest_add_bytes(d2, "ghijkl", 6); + crypto_digest_get_digest(d2, d_out1, sizeof(d_out1)); + crypto_digest(d_out2, "abcdefghijkl", 12); + test_memeq(d_out1, d_out2, DIGEST_LEN); + crypto_digest_assign(d2, d1); + crypto_digest_add_bytes(d2, "mno", 3); + crypto_digest_get_digest(d2, d_out1, sizeof(d_out1)); + crypto_digest(d_out2, "abcdefmno", 9); + test_memeq(d_out1, d_out2, DIGEST_LEN); + crypto_digest_get_digest(d1, d_out1, sizeof(d_out1)); + crypto_digest(d_out2, "abcdef", 6); + test_memeq(d_out1, d_out2, DIGEST_LEN); + crypto_free_digest_env(d1); + crypto_free_digest_env(d2); + + /* Incremental digest code with sha256 */ + d1 = crypto_new_digest256_env(DIGEST_SHA256); + test_assert(d1); + crypto_digest_add_bytes(d1, "abcdef", 6); + d2 = crypto_digest_dup(d1); + test_assert(d2); + crypto_digest_add_bytes(d2, "ghijkl", 6); + crypto_digest_get_digest(d2, d_out1, sizeof(d_out1)); + crypto_digest256(d_out2, "abcdefghijkl", 12, DIGEST_SHA256); + test_memeq(d_out1, d_out2, DIGEST_LEN); + crypto_digest_assign(d2, d1); + crypto_digest_add_bytes(d2, "mno", 3); + crypto_digest_get_digest(d2, d_out1, sizeof(d_out1)); + crypto_digest256(d_out2, "abcdefmno", 9, DIGEST_SHA256); + test_memeq(d_out1, d_out2, DIGEST_LEN); + crypto_digest_get_digest(d1, d_out1, sizeof(d_out1)); + crypto_digest256(d_out2, "abcdef", 6, DIGEST_SHA256); + test_memeq(d_out1, d_out2, DIGEST_LEN); + + done: + if (d1) + crypto_free_digest_env(d1); + if (d2) + crypto_free_digest_env(d2); + tor_free(mem_op_hex_tmp); +} + +/** Run unit tests for our public key crypto functions */ +static void +test_crypto_pk(void) +{ + crypto_pk_env_t *pk1 = NULL, *pk2 = NULL; + char *encoded = NULL; + char data1[1024], data2[1024], data3[1024]; + size_t size; + int i, j, p, len; + + /* Public-key ciphers */ + pk1 = pk_generate(0); + pk2 = crypto_new_pk_env(); + test_assert(pk1 && pk2); + test_assert(! crypto_pk_write_public_key_to_string(pk1, &encoded, &size)); + test_assert(! crypto_pk_read_public_key_from_string(pk2, encoded, size)); + test_eq(0, crypto_pk_cmp_keys(pk1, pk2)); + + test_eq(128, crypto_pk_keysize(pk1)); + test_eq(128, crypto_pk_keysize(pk2)); + + test_eq(128, crypto_pk_public_encrypt(pk2, data1, "Hello whirled.", 15, + PK_PKCS1_OAEP_PADDING)); + test_eq(128, crypto_pk_public_encrypt(pk1, data2, "Hello whirled.", 15, + PK_PKCS1_OAEP_PADDING)); + /* oaep padding should make encryption not match */ + test_memneq(data1, data2, 128); + test_eq(15, crypto_pk_private_decrypt(pk1, data3, data1, 128, + PK_PKCS1_OAEP_PADDING,1)); + test_streq(data3, "Hello whirled."); + memset(data3, 0, 1024); + test_eq(15, crypto_pk_private_decrypt(pk1, data3, data2, 128, + PK_PKCS1_OAEP_PADDING,1)); + test_streq(data3, "Hello whirled."); + /* Can't decrypt with public key. */ + test_eq(-1, crypto_pk_private_decrypt(pk2, data3, data2, 128, + PK_PKCS1_OAEP_PADDING,1)); + /* Try again with bad padding */ + memcpy(data2+1, "XYZZY", 5); /* This has fails ~ once-in-2^40 */ + test_eq(-1, crypto_pk_private_decrypt(pk1, data3, data2, 128, + PK_PKCS1_OAEP_PADDING,1)); + + /* File operations: save and load private key */ + test_assert(! crypto_pk_write_private_key_to_filename(pk1, + get_fname("pkey1"))); + /* failing case for read: can't read. */ + test_assert(crypto_pk_read_private_key_from_filename(pk2, + get_fname("xyzzy")) < 0); + write_str_to_file(get_fname("xyzzy"), "foobar", 6); + /* Failing case for read: no key. */ + test_assert(crypto_pk_read_private_key_from_filename(pk2, + get_fname("xyzzy")) < 0); + test_assert(! crypto_pk_read_private_key_from_filename(pk2, + get_fname("pkey1"))); + test_eq(15, crypto_pk_private_decrypt(pk2, data3, data1, 128, + PK_PKCS1_OAEP_PADDING,1)); + + /* Now try signing. */ + strlcpy(data1, "Ossifrage", 1024); + test_eq(128, crypto_pk_private_sign(pk1, data2, data1, 10)); + test_eq(10, crypto_pk_public_checksig(pk1, data3, data2, 128)); + test_streq(data3, "Ossifrage"); + /* Try signing digests. */ + test_eq(128, crypto_pk_private_sign_digest(pk1, data2, data1, 10)); + test_eq(20, crypto_pk_public_checksig(pk1, data3, data2, 128)); + test_eq(0, crypto_pk_public_checksig_digest(pk1, data1, 10, data2, 128)); + test_eq(-1, crypto_pk_public_checksig_digest(pk1, data1, 11, data2, 128)); + /*XXXX test failed signing*/ + + /* Try encoding */ + crypto_free_pk_env(pk2); + pk2 = NULL; + i = crypto_pk_asn1_encode(pk1, data1, 1024); + test_assert(i>0); + pk2 = crypto_pk_asn1_decode(data1, i); + test_assert(crypto_pk_cmp_keys(pk1,pk2) == 0); + + /* Try with hybrid encryption wrappers. */ + crypto_rand(data1, 1024); + for (i = 0; i < 3; ++i) { + for (j = 85; j < 140; ++j) { + memset(data2,0,1024); + memset(data3,0,1024); + if (i == 0 && j < 129) + continue; + p = (i==0)?PK_NO_PADDING: + (i==1)?PK_PKCS1_PADDING:PK_PKCS1_OAEP_PADDING; + len = crypto_pk_public_hybrid_encrypt(pk1,data2,data1,j,p,0); + test_assert(len>=0); + len = crypto_pk_private_hybrid_decrypt(pk1,data3,data2,len,p,1); + test_eq(len,j); + test_memeq(data1,data3,j); + } + } + + /* Try copy_full */ + crypto_free_pk_env(pk2); + pk2 = crypto_pk_copy_full(pk1); + test_assert(pk2 != NULL); + test_neq_ptr(pk1, pk2); + test_assert(crypto_pk_cmp_keys(pk1,pk2) == 0); + + done: + if (pk1) + crypto_free_pk_env(pk1); + if (pk2) + crypto_free_pk_env(pk2); + tor_free(encoded); +} + +/** Run unit tests for misc crypto formatting functionality (base64, base32, + * fingerprints, etc) */ +static void +test_crypto_formats(void) +{ + char *data1 = NULL, *data2 = NULL, *data3 = NULL; + int i, j, idx; + + data1 = tor_malloc(1024); + data2 = tor_malloc(1024); + data3 = tor_malloc(1024); + test_assert(data1 && data2 && data3); + + /* Base64 tests */ + memset(data1, 6, 1024); + for (idx = 0; idx < 10; ++idx) { + i = base64_encode(data2, 1024, data1, idx); + test_assert(i >= 0); + j = base64_decode(data3, 1024, data2, i); + test_eq(j,idx); + test_memeq(data3, data1, idx); + } + + strlcpy(data1, "Test string that contains 35 chars.", 1024); + strlcat(data1, " 2nd string that contains 35 chars.", 1024); + + i = base64_encode(data2, 1024, data1, 71); + test_assert(i >= 0); + j = base64_decode(data3, 1024, data2, i); + test_eq(j, 71); + test_streq(data3, data1); + test_assert(data2[i] == '\0'); + + crypto_rand(data1, DIGEST_LEN); + memset(data2, 100, 1024); + digest_to_base64(data2, data1); + test_eq(BASE64_DIGEST_LEN, strlen(data2)); + test_eq(100, data2[BASE64_DIGEST_LEN+2]); + memset(data3, 99, 1024); + test_eq(digest_from_base64(data3, data2), 0); + test_memeq(data1, data3, DIGEST_LEN); + test_eq(99, data3[DIGEST_LEN+1]); + + test_assert(digest_from_base64(data3, "###") < 0); + + /* Encoding SHA256 */ + crypto_rand(data2, DIGEST256_LEN); + memset(data2, 100, 1024); + digest256_to_base64(data2, data1); + test_eq(BASE64_DIGEST256_LEN, strlen(data2)); + test_eq(100, data2[BASE64_DIGEST256_LEN+2]); + memset(data3, 99, 1024); + test_eq(digest256_from_base64(data3, data2), 0); + test_memeq(data1, data3, DIGEST256_LEN); + test_eq(99, data3[DIGEST256_LEN+1]); + + /* Base32 tests */ + strlcpy(data1, "5chrs", 1024); + /* bit pattern is: [35 63 68 72 73] -> + * [00110101 01100011 01101000 01110010 01110011] + * By 5s: [00110 10101 10001 10110 10000 11100 10011 10011] + */ + base32_encode(data2, 9, data1, 5); + test_streq(data2, "gvrwq4tt"); + + strlcpy(data1, "\xFF\xF5\x6D\x44\xAE\x0D\x5C\xC9\x62\xC4", 1024); + base32_encode(data2, 30, data1, 10); + test_streq(data2, "772w2rfobvomsywe"); + + /* Base16 tests */ + strlcpy(data1, "6chrs\xff", 1024); + base16_encode(data2, 13, data1, 6); + test_streq(data2, "3663687273FF"); + + strlcpy(data1, "f0d678affc000100", 1024); + i = base16_decode(data2, 8, data1, 16); + test_eq(i,0); + test_memeq(data2, "\xf0\xd6\x78\xaf\xfc\x00\x01\x00",8); + + /* now try some failing base16 decodes */ + test_eq(-1, base16_decode(data2, 8, data1, 15)); /* odd input len */ + test_eq(-1, base16_decode(data2, 7, data1, 16)); /* dest too short */ + strlcpy(data1, "f0dz!8affc000100", 1024); + test_eq(-1, base16_decode(data2, 8, data1, 16)); + + tor_free(data1); + tor_free(data2); + tor_free(data3); + + /* Add spaces to fingerprint */ + { + data1 = tor_strdup("ABCD1234ABCD56780000ABCD1234ABCD56780000"); + test_eq(strlen(data1), 40); + data2 = tor_malloc(FINGERPRINT_LEN+1); + add_spaces_to_fp(data2, FINGERPRINT_LEN+1, data1); + test_streq(data2, "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000"); + tor_free(data1); + tor_free(data2); + } + + /* Check fingerprint */ + { + test_assert(crypto_pk_check_fingerprint_syntax( + "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000")); + test_assert(!crypto_pk_check_fingerprint_syntax( + "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 000")); + test_assert(!crypto_pk_check_fingerprint_syntax( + "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 00000")); + test_assert(!crypto_pk_check_fingerprint_syntax( + "ABCD 1234 ABCD 5678 0000 ABCD1234 ABCD 5678 0000")); + test_assert(!crypto_pk_check_fingerprint_syntax( + "ABCD 1234 ABCD 5678 0000 ABCD1234 ABCD 5678 00000")); + test_assert(!crypto_pk_check_fingerprint_syntax( + "ACD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 00000")); + } + + done: + tor_free(data1); + tor_free(data2); + tor_free(data3); +} + +/** Run unit tests for our secret-to-key passphrase hashing functionality. */ +static void +test_crypto_s2k(void) +{ + char buf[29]; + char buf2[29]; + char *buf3 = NULL; + int i; + + memset(buf, 0, sizeof(buf)); + memset(buf2, 0, sizeof(buf2)); + buf3 = tor_malloc(65536); + memset(buf3, 0, 65536); + + secret_to_key(buf+9, 20, "", 0, buf); + crypto_digest(buf2+9, buf3, 1024); + test_memeq(buf, buf2, 29); + + memcpy(buf,"vrbacrda",8); + memcpy(buf2,"vrbacrda",8); + buf[8] = 96; + buf2[8] = 96; + secret_to_key(buf+9, 20, "12345678", 8, buf); + for (i = 0; i < 65536; i += 16) { + memcpy(buf3+i, "vrbacrda12345678", 16); + } + crypto_digest(buf2+9, buf3, 65536); + test_memeq(buf, buf2, 29); + + done: + tor_free(buf3); +} + +/** Test AES-CTR encryption and decryption with IV. */ +static void +test_crypto_aes_iv(void) +{ + crypto_cipher_env_t *cipher; + char *plain, *encrypted1, *encrypted2, *decrypted1, *decrypted2; + char plain_1[1], plain_15[15], plain_16[16], plain_17[17]; + char key1[16], key2[16]; + ssize_t encrypted_size, decrypted_size; + + plain = tor_malloc(4095); + encrypted1 = tor_malloc(4095 + 1 + 16); + encrypted2 = tor_malloc(4095 + 1 + 16); + decrypted1 = tor_malloc(4095 + 1); + decrypted2 = tor_malloc(4095 + 1); + + crypto_rand(plain, 4095); + crypto_rand(key1, 16); + crypto_rand(key2, 16); + crypto_rand(plain_1, 1); + crypto_rand(plain_15, 15); + crypto_rand(plain_16, 16); + crypto_rand(plain_17, 17); + key1[0] = key2[0] + 128; /* Make sure that contents are different. */ + /* Encrypt and decrypt with the same key. */ + cipher = crypto_create_init_cipher(key1, 1); + encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 4095, + plain, 4095); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(encrypted_size, 16 + 4095); + tor_assert(encrypted_size > 0); /* This is obviously true, since 4111 is + * greater than 0, but its truth is not + * obvious to all analysis tools. */ + cipher = crypto_create_init_cipher(key1, 0); + decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 4095, + encrypted1, encrypted_size); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(decrypted_size, 4095); + tor_assert(decrypted_size > 0); + test_memeq(plain, decrypted1, 4095); + /* Encrypt a second time (with a new random initialization vector). */ + cipher = crypto_create_init_cipher(key1, 1); + encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted2, 16 + 4095, + plain, 4095); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(encrypted_size, 16 + 4095); + tor_assert(encrypted_size > 0); + cipher = crypto_create_init_cipher(key1, 0); + decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted2, 4095, + encrypted2, encrypted_size); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(decrypted_size, 4095); + tor_assert(decrypted_size > 0); + test_memeq(plain, decrypted2, 4095); + test_memneq(encrypted1, encrypted2, encrypted_size); + /* Decrypt with the wrong key. */ + cipher = crypto_create_init_cipher(key2, 0); + decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted2, 4095, + encrypted1, encrypted_size); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_memneq(plain, decrypted2, encrypted_size); + /* Alter the initialization vector. */ + encrypted1[0] += 42; + cipher = crypto_create_init_cipher(key1, 0); + decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 4095, + encrypted1, encrypted_size); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_memneq(plain, decrypted2, 4095); + /* Special length case: 1. */ + cipher = crypto_create_init_cipher(key1, 1); + encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 1, + plain_1, 1); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(encrypted_size, 16 + 1); + tor_assert(encrypted_size > 0); + cipher = crypto_create_init_cipher(key1, 0); + decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 1, + encrypted1, encrypted_size); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(decrypted_size, 1); + tor_assert(decrypted_size > 0); + test_memeq(plain_1, decrypted1, 1); + /* Special length case: 15. */ + cipher = crypto_create_init_cipher(key1, 1); + encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 15, + plain_15, 15); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(encrypted_size, 16 + 15); + tor_assert(encrypted_size > 0); + cipher = crypto_create_init_cipher(key1, 0); + decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 15, + encrypted1, encrypted_size); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(decrypted_size, 15); + tor_assert(decrypted_size > 0); + test_memeq(plain_15, decrypted1, 15); + /* Special length case: 16. */ + cipher = crypto_create_init_cipher(key1, 1); + encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 16, + plain_16, 16); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(encrypted_size, 16 + 16); + tor_assert(encrypted_size > 0); + cipher = crypto_create_init_cipher(key1, 0); + decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 16, + encrypted1, encrypted_size); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(decrypted_size, 16); + tor_assert(decrypted_size > 0); + test_memeq(plain_16, decrypted1, 16); + /* Special length case: 17. */ + cipher = crypto_create_init_cipher(key1, 1); + encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 17, + plain_17, 17); + crypto_free_cipher_env(cipher); + cipher = NULL; + test_eq(encrypted_size, 16 + 17); + tor_assert(encrypted_size > 0); + cipher = crypto_create_init_cipher(key1, 0); + decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 17, + encrypted1, encrypted_size); + test_eq(decrypted_size, 17); + tor_assert(decrypted_size > 0); + test_memeq(plain_17, decrypted1, 17); + + done: + /* Free memory. */ + tor_free(plain); + tor_free(encrypted1); + tor_free(encrypted2); + tor_free(decrypted1); + tor_free(decrypted2); + if (cipher) + crypto_free_cipher_env(cipher); +} + +/** Test base32 decoding. */ +static void +test_crypto_base32_decode(void) +{ + char plain[60], encoded[96 + 1], decoded[60]; + int res; + crypto_rand(plain, 60); + /* Encode and decode a random string. */ + base32_encode(encoded, 96 + 1, plain, 60); + res = base32_decode(decoded, 60, encoded, 96); + test_eq(res, 0); + test_memeq(plain, decoded, 60); + /* Encode, uppercase, and decode a random string. */ + base32_encode(encoded, 96 + 1, plain, 60); + tor_strupper(encoded); + res = base32_decode(decoded, 60, encoded, 96); + test_eq(res, 0); + test_memeq(plain, decoded, 60); + /* Change encoded string and decode. */ + if (encoded[0] == 'A' || encoded[0] == 'a') + encoded[0] = 'B'; + else + encoded[0] = 'A'; + res = base32_decode(decoded, 60, encoded, 96); + test_eq(res, 0); + test_memneq(plain, decoded, 60); + /* Bad encodings. */ + encoded[0] = '!'; + res = base32_decode(decoded, 60, encoded, 96); + test_assert(res < 0); + + done: + ; +} + +#define CRYPTO_LEGACY(name) \ + { #name, legacy_test_helper, 0, &legacy_setup, test_crypto_ ## name } + +struct testcase_t crypto_tests[] = { + CRYPTO_LEGACY(formats), + CRYPTO_LEGACY(rng), + CRYPTO_LEGACY(aes), + CRYPTO_LEGACY(sha), + CRYPTO_LEGACY(pk), + CRYPTO_LEGACY(dh), + CRYPTO_LEGACY(s2k), + CRYPTO_LEGACY(aes_iv), + CRYPTO_LEGACY(base32_decode), + END_OF_TESTCASES +}; + diff -Nru tor-0.2.0.34/src/test/test_data.c tor-0.2.2.16-alpha/src/test/test_data.c --- tor-0.2.0.34/src/test/test_data.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/test_data.c 2010-03-07 04:03:28.000000000 +0000 @@ -0,0 +1,173 @@ +/* Copyright 2001-2004 Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** First of 3 example authority certificates for unit testing. */ +const char AUTHORITY_CERT_1[] = +"dir-key-certificate-version 3\n" +"fingerprint D867ACF56A9D229B35C25F0090BC9867E906BE69\n" +"dir-key-published 2008-12-12 18:07:24\n" +"dir-key-expires 2009-12-12 18:07:24\n" +"dir-identity-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIIBigKCAYEAveMpKlw8oD1YqFqpJchuwSR82BDhutbqgHiez3QO9FmzOctJpV+Y\n" +"mpTYIJLS/qC+4GBKFF1VK0C4SoBrS3zri0qdXdE+vBGcyrxrjMklpxoqSKRY2011\n" +"4eqYPghKlo5RzuqteBclGCHyNxWjUJeRKDWgvh+U/gr2uYM6fRm5q0fCzg4aECE7\n" +"VP6fDGZrMbQI8jHpiMSoC9gkUASNEa6chLInlnP8/H5qUEW4TB9CN/q095pefuwL\n" +"P+F+1Nz5hnM7fa5XmeMB8iM4RriUmOQlLBZgpQBMpEfWMIPcR9F1Gh3MxERqqUcH\n" +"tmij+IZdeXg9OkCXykcabaYIhZD3meErn9Tax4oA/THduLfgli9zM0ExwzH1OooN\n" +"L8rIcJ+2eBo3bQiQUbdYW71sl9w7nSPtircbJUa1mUvWYLPWQxFliPiQSetgJLMj\n" +"VQqtPmV2hvN2Xk3lLfJO50qMTK7w7Gsaw8UtV4YDM1Hcjp/hQaIB1xfwhXgl+eUU\n" +"btUa4c+cUTjHAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBALPSUInyuEu6NV3NjozplaniIEBzQXEjv1x9/+mqnwZABpYVmuy9A8nx\n" +"eoyY3sZFsnYwNW/IZjAgG23pEmevu3F+L4myMjjaa6ORl3MgRYQ4gmuFqpefrGdm\n" +"ywRCleh2JerkQ4VxOuq10dn/abITzLyaZzMw30KXWp5pxKXOLtxFAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-key-crosscert\n" +"-----BEGIN ID SIGNATURE-----\n" +"FTBJNR/Hlt4T53yUMp1r/QCSMCpkHJCbYBT0R0pvYqhqFfYN5qHRSICRXaFFImIF\n" +"0DGWmwRza6DxPKNzkm5/b7I0de9zJW1jNNdQAQK5xppAtQcAafRdu8cBonnmh9KX\n" +"k1NrAK/X00FYywju3yl/SxCn1GddVNkHYexEudmJMPM=\n" +"-----END ID SIGNATURE-----\n" +"dir-key-certification\n" +"-----BEGIN SIGNATURE-----\n" +"pjWguLFBfELZDc6DywL6Do21SCl7LcutfpM92MEn4WYeSNcTXNR6lRX7reOEJk4e\n" +"NwEaMt+Hl7slgeR5wjnW3OmMmRPZK9bquNWbfD+sAOV9bRFZTpXIdleAQFPlwvMF\n" +"z/Gzwspzn4i2Yh6hySShrctMmW8YL3OM8LsBXzBhp/rG2uHlsxmIsc13DA6HWt61\n" +"ffY72uNE6KckDGsQ4wPGP9q69y6g+X+TNio1KPbsILbePv6EjbO+rS8FiS4njPlg\n" +"SPYry1RaUvxzxTkswIzdE1tjJrUiqpbWlTGxrH9N4OszoLm45Pc784KLULrjKIoi\n" +"Q+vRsGrcMBAa+kDowWU6H1ryKR7KOhzRTcf2uqLE/W3ezaRwmOG+ETmoVFwbhk2X\n" +"OlbXEM9fWP+INvFkr6Z93VYL2jGkCjV7e3xXmre/Lb92fUcYi6t5dwzfV8gJnIoG\n" +"eCHd0K8NrQK0ipVk/7zcPDKOPeo9Y5aj/f6X/pDHtb+Dd5sT+l82G/Tqy4DIYUYR\n" +"-----END SIGNATURE-----\n"; + +/** The private signing key for AUTHORITY_CERT_1 */ +const char AUTHORITY_SIGNKEY_1[] = +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICWwIBAAKBgQCz0lCJ8rhLujVdzY6M6ZWp4iBAc0FxI79cff/pqp8GQAaWFZrs\n" +"vQPJ8XqMmN7GRbJ2MDVvyGYwIBtt6RJnr7txfi+JsjI42mujkZdzIEWEOIJrhaqX\n" +"n6xnZssEQpXodiXq5EOFcTrqtdHZ/2myE8y8mmczMN9Cl1qeacSlzi7cRQIDAQAB\n" +"AoGASpzUkDinIbzU0eQt5ugxEnliOnvYRpK3nzAk1JbYPyan1PSIAPz4qn1JBTeV\n" +"EB3xS7r7ITO8uvFHkFZqLZ2sH1uE6e4sAytJGO+kyqnlkiDTPEXpcGe99j8PH1yj\n" +"xUOrHRlAYWjG8NEkQi+APA+HZkswE3L/viFwR2AARoE2ac0CQQDsOLdNJa+mqn6N\n" +"1L76nEl/YgXHtKUks+beOR3IgknKEjcsJJEUHyiu0wjbXZV6gTtyQvcAePglUUD1\n" +"R2OkOOADAkEAwuCxvHEAPeQbVt8fSvxw74vqew6LITP2Utb1dQK0E26IRPF36BsJ\n" +"buO/gqMZv6ALq+/KxpA/pUsApbgog9uUFwJAYvHCvbrKX1pM1iXFtP1fv86UMzlU\n" +"bxI34t8zvXftZonIuGG8rxv6E3hr3k7NvNmCx/KKuZTyA9eMCPFVKEV2dwJACn8j\n" +"06yagLrqphE6lEVop953cM1lvRIZcHjXm8fbfzhy6pO/C6d5KJnn1NeIKYQrXMV7\n" +"vJpEc1jI3iQ/Omr3XQJAEBIt5MlP2wlrX9om7B+32XBygUssY3cw/bXybZrtSU0/\n" +"Yx4lqK0ca5IkTp3HevwnlWaJgbaOTUspCVshzJBhDA==\n" +"-----END RSA PRIVATE KEY-----\n"; + +/** Second of 3 example authority certificates for unit testing. */ +const char AUTHORITY_CERT_2[] = +"dir-key-certificate-version 3\n" +"fingerprint 4D44AE0470B9E88FD4558EFEC82698FB33715400\n" +"dir-key-published 2007-06-13 16:52:32\n" +"dir-key-expires 2008-06-13 16:52:32\n" +"dir-identity-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIIBigKCAYEAqukDwQRm1Oy1pPY+7GNRnRNFJzEVPUBfJwC4tBH19tkvdRQPuIGI\n" +"2jiTy/rmZ6CLcl1G0oulSgxfKEX75QdptOasZu+rKUrRRSxx0QrXhs9a7up0rpXh\n" +"13fw3mh1Vl/As3rJYF30Hjk01BTOJMxi/HY2y0ALQytFWjiMGY74A9Y6+uDcHkB2\n" +"KflBjxIl8zpCsXsTTnUhN5kXqaOOnK46XaUShSpXsyOxTMJXuJEtgLz9XCyA8XjW\n" +"d75QLHucEnlTqxUAdI5YSN2KIlIJiySCVnAorDpJey2mE9VncpHQWMCv/FPFdnSU\n" +"EMMPUc4bBShcoNFf0mMJeV2sv+dBkgKAL0GLM19PuJIThJhfN/B6+YQTxw4HEpPV\n" +"plfUqYRN0fYC+5hCTS6rroO/uCfDR7NBtoeDNm9dQrvjfk3b/Mywah1rdWNjnVqs\n" +"tPJaz3fc/CVBOUUexhmyktgLuwSNEYIQilQ+BydkWN/4RObhV+YSV5BgekEDVaoS\n" +"RHw4IbYBDHVxAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAOu3dgrQth3iqvi/UzfywaANw0bBUuMOBhnMBeiLEcRLneJHUJkVvrpR\n" +"/EDQkdMov1e7CX6aqBKygVnbDNYjJ+bcQej8MKpuuW+zIknnz5lfnAVZO5uAmo3Y\n" +"DpG574oQ2FFMdkWHSBloIRxSj/E4Jn1M2qJjElBXP0E33Ka/Noo7AgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-key-certification\n" +"-----BEGIN SIGNATURE-----\n" +"Fv0Li68QUdAiChY3OklZOakHzwXAUfCzDNxkqe+HLC0n6ZECE9ZCvLVo69XmgVhH\n" +"L5qYr2rxT6QpF+9yuOHbN9gWn8EsDcli06MlhX9TUt/IYVxHa/9tJwNoTfEw2w2D\n" +"tyHhWm94IfOK7/Sea6jHnjckl80X+kk0ZNtAGs3/6fP4iltKNGXnvBwfgLpEgW7X\n" +"NpDl0OLeDuA79zem2GogwQZQdoDbePByU0TJVx9jYi2Bzx2Nb2H0hRTPP6+dY0HQ\n" +"MHb7yyyTQRad5iAUnExKhhyt22p7X3a6lgkAhq4YrNn/zVPkpnT2dzjsOydTHOW8\n" +"2BQs33QlGNe095i47pJBDYsUgmJaXfqB/RG6dFg7jwIsc3/7dZcvcqfxY7wKcD/T\n" +"wtogCIKxDvWbZn7f0hqYkT6uQC8Zom8bcnedmyzufOZCyA2SqQ2wvio6lznR4RIB\n" +"a8qDHR0tPS9/VkqTPcvUWCZeY3UiDeWPjoK1nea1pz6DHDWglKPx86a0amjjayZQ\n" +"-----END SIGNATURE-----\n"; + +/** The private signing key for AUTHORITY_CERT_2 */ +const char AUTHORITY_SIGNKEY_2[] = +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXgIBAAKBgQDrt3YK0LYd4qr4v1M38sGgDcNGwVLjDgYZzAXoixHES53iR1CZ\n" +"Fb66UfxA0JHTKL9Xuwl+mqgSsoFZ2wzWIyfm3EHo/DCqbrlvsyJJ58+ZX5wFWTub\n" +"gJqN2A6Rue+KENhRTHZFh0gZaCEcUo/xOCZ9TNqiYxJQVz9BN9ymvzaKOwIDAQAB\n" +"AoGAJ+I9/ex8tCfTSA2PdisEKiHKBeHWNYb870Z/RW6qje1BhLUOZSixwfL3XLwt\n" +"wG3nml+SZrKid69uhZaz4FPIf0tqCgURf6dDrF5vuzzr7VLVqkZHYSBp0vE6bu0R\n" +"Sgc5QNxI2talgc4bsp0O0C+Zd4n3Yto0pXl/I6NHVAxlFBECQQD2mahkY+QEHWPV\n" +"yRY3w3HhRmWBcrkY2zVyvPpqfn/sdHRPYW/yj4Xr/d1CO9VyFmEs4k324lIvu6LT\n" +"WDdpPlcJAkEA9LOZv5aNeAm8ckvvXH7iv8KiONiSz0n9wlisxMhNYTEkOCo1g7jG\n" +"AX5ZknRC9s4sWCPOBpMhloUvemdQ5FCEIwJBAMqCFwoSCf7jD8hRcUBr7QodoF/0\n" +"kVJ7OeI2lMJ9jZnlbFp/3snn2Qeam2e38SnWfQi582KKKwnt4eIDMMXpntkCQQDI\n" +"v1Lh11wl3y7nQZ6T7lCNatp08k+2mQgCWYcbRQweMRd6sD4I2xwt+372ZETPfyLo\n" +"CC+sOyYx+v+RVpMJS3irAkEA6l98nMteZKmhOgyKSjdolP+ahpZunb+WnCdAtP97\n" +"rjZyXmEZS3oe7TRCDD28GAGMmxSDvNfOOpyn14ishEs5AQ==\n" +"-----END RSA PRIVATE KEY-----\n"; + +/** Third of 3 example authority certificates for unit testing. */ +const char AUTHORITY_CERT_3[] = +"dir-key-certificate-version 3\n" +"fingerprint ED3719BF554DE9D7D59F5CA5A4F5AD121D020ED9\n" +"dir-key-published 2007-06-13 16:52:40\n" +"dir-key-expires 2008-06-13 16:52:40\n" +"dir-identity-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIIBigKCAYEAtB+yw4BNxtZAG4cPaedkhWNmeij7IuNWmXjh58ZYEGurvGyHs1w4\n" +"QlwNYI2UftSIeIGdWZ5fJ17h9P3xvO6eeJuOt4KPrNOxUbSGrELEx1Lje1fDAJ1X\n" +"SvN+dvptusxtyFUr8afgTPrFIvYuazQ6q/Rw+NDagjmDx3h/A/enihpBnjwzeH8j\n" +"Xzu7b+HKnzFnNfveTDdvSy0NSC6tCOnrfXo31XbXRXtlesnMIpbJClUcAv55eyai\n" +"/PrVPCCUz8mk0sQnn2Xhv1YJmwOlQTGMfg0a0kWLmh+UWcHsGQ4VWxBZJcuzgFHG\n" +"hu2/Fz6DXSpX5Q6B9HKoGmnH1oBh24l0kUW1jL8BxPY4YDU1Lt5t3qgcDn9dXYcI\n" +"o8VvyI0ecSc26Q2PYFWX1hpN4VIBZ8uGaW3IpyTdNiRq0g3iMGRFEXcDlWuyMB9E\n" +"EbSM7m/79V/z7SjDd75EP8Z0qDPESEVB8a8LbuSJtzFVE0KHd7RzkIEN5sorXspZ\n" +"/THukftSmkIvAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBANrSZlUq38Boz3iuUOydYTJV57rTbq1bz805FP2QG2Z+2bwpgKIOZag/\n" +"gN2A1ySJaIYLgZIg9irxrLkqlY/UAjC23y6V9fJXP1S3TXoqLmHleW8PsaDLuwTo\n" +"hCWaR61Mx9WG7IXcodn2Z7RiCfZpSW4Rztbk5WtjQa5jPXSFOuBJAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-key-certification\n" +"-----BEGIN SIGNATURE-----\n" +"UNXZy+4OQ8iat+gw+vg2ynvKj2BYbqZt+EAZAV3rmw6gux44U9TLRECRd6LsA08N\n" +"4+Vz01TU81xqMgfrUy94ei2YvcfpO8art9/muWHTP9SmOX8S1uqDqLWA+n723C9A\n" +"HyVXn4aINncO2081gJcIW5+Ul8WTCeZe/n3LVPTCKbTdqxvmrPUdCWlJTQUmb19M\n" +"T+kcCjaEfgQGLC+Y2MHqYe/nxz+aBKqpjiWUDdjc35va6r/2e3c0jGi1B1xRZxN1\n" +"xThPZ+CifjDoWBxJdDGlIfZRK1lMnOCJY9w9ibTXQ1UnvE4whFvmB55/t9/XLq4q\n" +"3pnZz0H7funey3+ilmTxDohoAYT1GX+4a+3xYH07UmAFqlTzqKClj84XEHn+Cer7\n" +"Nun9kJlJFuBgUpQjwCkzedFZKKLOHgB2h7trJfnqcBpAM8Rup1Bb5u/RcBx9gy1q\n" +"pMc65FviIrc/Q5TUku6NNbCbnGll1599PvWuUzkG42lJ17V6psKHIsqGtVdHlCUc\n" +"-----END SIGNATURE-----\n"; + +/** The private signing key for AUTHORITY_CERT_3 */ +const char AUTHORITY_SIGNKEY_3[] = +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXgIBAAKBgQDa0mZVKt/AaM94rlDsnWEyVee6026tW8/NORT9kBtmftm8KYCi\n" +"DmWoP4DdgNckiWiGC4GSIPYq8ay5KpWP1AIwtt8ulfXyVz9Ut016Ki5h5XlvD7Gg\n" +"y7sE6IQlmketTMfVhuyF3KHZ9me0Ygn2aUluEc7W5OVrY0GuYz10hTrgSQIDAQAB\n" +"AoGBAIyoeG1AnQmildKeQpiGZackf0uhg2BeRwpFKg//5Q0Sd0Wza+M/2+q1v1Ei\n" +"86ihxxV7KfPTykk6hmuUSwVkI28Z+5J9NYTr35EzPiUlqpo0iclTkFqrlbqSPULx\n" +"9fQhvcOGv1c0m5CnYrHsM8eu3tagLg+6OE4abLOYX4Az5pkxAkEA/NwHhVaVJrXH\n" +"lGDrRAfGtaD5Tzeeg1H9DNZi5lmFiSNR0O11sgDLkiZNP5oM8knyqo8Gq08hwxEb\n" +"yqMXM3XtJQJBAN2KJbFhOjDIkvJyYvbmcP6P7vV2c9j+oUTKkFMF7vvfWunxMi9j\n" +"ghbdUKgl7tU0VFpw7ufDDD0pkN6sua3gp1UCQQCvNzTK861U7p/GtMYyFQVf9JTt\n" +"jMf9jYHBNInBvwTme6AFG5bz6tMlif77dJ9GAXHzODrR2Hq3thJA/3RjR3M1AkBg\n" +"+6M4ncmtpYC+5lhwob0Bk90WU/6vFflfdhXsYoKWfNb95vsDR9qhS82Nbt25NClh\n" +"VmMfzoFDHTkwYgj/F4PpAkEA+RaaSRP7BmbvFNqvlm8J/m0RVdAH4+p/Q5Z5u6Yo\n" +"N7xC/gFi0qFPGKsDvD2CncAYmt+KNsd8S0JGDN4eieKn+Q==\n" +"-----END RSA PRIVATE KEY-----\n"; + diff -Nru tor-0.2.0.34/src/test/test_dir.c tor-0.2.2.16-alpha/src/test/test_dir.c --- tor-0.2.0.34/src/test/test_dir.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/test_dir.c 2010-08-18 23:04:46.000000000 +0000 @@ -0,0 +1,1318 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define DIRSERV_PRIVATE +#define DIRVOTE_PRIVATE +#define ROUTER_PRIVATE +#include "or.h" +#include "directory.h" +#include "dirserv.h" +#include "dirvote.h" +#include "networkstatus.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" +#include "test.h" + +static void +test_dir_nicknames(void) +{ + test_assert( is_legal_nickname("a")); + test_assert(!is_legal_nickname("")); + test_assert(!is_legal_nickname("abcdefghijklmnopqrst")); /* 20 chars */ + test_assert(!is_legal_nickname("hyphen-")); /* bad char */ + test_assert( is_legal_nickname("abcdefghijklmnopqrs")); /* 19 chars */ + test_assert(!is_legal_nickname("$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA")); + /* valid */ + test_assert( is_legal_nickname_or_hexdigest( + "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA")); + test_assert( is_legal_nickname_or_hexdigest( + "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA=fred")); + test_assert( is_legal_nickname_or_hexdigest( + "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA~fred")); + /* too short */ + test_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); + /* illegal char */ + test_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); + /* hex part too long */ + test_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); + test_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=fred")); + /* Bad nickname */ + test_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")); + test_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~")); + test_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~hyphen-")); + test_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~" + "abcdefghijklmnoppqrst")); + /* Bad extra char. */ + test_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!")); + test_assert(is_legal_nickname_or_hexdigest("xyzzy")); + test_assert(is_legal_nickname_or_hexdigest("abcdefghijklmnopqrs")); + test_assert(!is_legal_nickname_or_hexdigest("abcdefghijklmnopqrst")); + done: + ; +} + +/** Run unit tests for router descriptor generation logic. */ +static void +test_dir_formats(void) +{ + char buf[8192], buf2[8192]; + char platform[256]; + char fingerprint[FINGERPRINT_LEN+1]; + char *pk1_str = NULL, *pk2_str = NULL, *pk3_str = NULL, *cp; + size_t pk1_str_len, pk2_str_len, pk3_str_len; + routerinfo_t *r1=NULL, *r2=NULL; + crypto_pk_env_t *pk1 = NULL, *pk2 = NULL, *pk3 = NULL; + routerinfo_t *rp1 = NULL; + addr_policy_t *ex1, *ex2; + routerlist_t *dir1 = NULL, *dir2 = NULL; + + pk1 = pk_generate(0); + pk2 = pk_generate(1); + pk3 = pk_generate(2); + + test_assert(pk1 && pk2 && pk3); + + get_platform_str(platform, sizeof(platform)); + r1 = tor_malloc_zero(sizeof(routerinfo_t)); + r1->address = tor_strdup("18.244.0.1"); + r1->addr = 0xc0a80001u; /* 192.168.0.1 */ + r1->cache_info.published_on = 0; + r1->or_port = 9000; + r1->dir_port = 9003; + r1->onion_pkey = crypto_pk_dup_key(pk1); + r1->identity_pkey = crypto_pk_dup_key(pk2); + r1->bandwidthrate = 1000; + r1->bandwidthburst = 5000; + r1->bandwidthcapacity = 10000; + r1->exit_policy = NULL; + r1->nickname = tor_strdup("Magri"); + r1->platform = tor_strdup(platform); + + ex1 = tor_malloc_zero(sizeof(addr_policy_t)); + ex2 = tor_malloc_zero(sizeof(addr_policy_t)); + ex1->policy_type = ADDR_POLICY_ACCEPT; + tor_addr_from_ipv4h(&ex1->addr, 0); + ex1->maskbits = 0; + ex1->prt_min = ex1->prt_max = 80; + ex2->policy_type = ADDR_POLICY_REJECT; + tor_addr_from_ipv4h(&ex2->addr, 18<<24); + ex2->maskbits = 8; + ex2->prt_min = ex2->prt_max = 24; + r2 = tor_malloc_zero(sizeof(routerinfo_t)); + r2->address = tor_strdup("1.1.1.1"); + r2->addr = 0x0a030201u; /* 10.3.2.1 */ + r2->platform = tor_strdup(platform); + r2->cache_info.published_on = 5; + r2->or_port = 9005; + r2->dir_port = 0; + r2->onion_pkey = crypto_pk_dup_key(pk2); + r2->identity_pkey = crypto_pk_dup_key(pk1); + r2->bandwidthrate = r2->bandwidthburst = r2->bandwidthcapacity = 3000; + r2->exit_policy = smartlist_create(); + smartlist_add(r2->exit_policy, ex2); + smartlist_add(r2->exit_policy, ex1); + r2->nickname = tor_strdup("Fred"); + + test_assert(!crypto_pk_write_public_key_to_string(pk1, &pk1_str, + &pk1_str_len)); + test_assert(!crypto_pk_write_public_key_to_string(pk2 , &pk2_str, + &pk2_str_len)); + test_assert(!crypto_pk_write_public_key_to_string(pk3 , &pk3_str, + &pk3_str_len)); + + memset(buf, 0, 2048); + test_assert(router_dump_router_to_string(buf, 2048, r1, pk2)>0); + + strlcpy(buf2, "router Magri 18.244.0.1 9000 0 9003\n" + "platform Tor "VERSION" on ", sizeof(buf2)); + strlcat(buf2, get_uname(), sizeof(buf2)); + strlcat(buf2, "\n" + "opt protocols Link 1 2 Circuit 1\n" + "published 1970-01-01 00:00:00\n" + "opt fingerprint ", sizeof(buf2)); + test_assert(!crypto_pk_get_fingerprint(pk2, fingerprint, 1)); + strlcat(buf2, fingerprint, sizeof(buf2)); + strlcat(buf2, "\nuptime 0\n" + /* XXX the "0" above is hard-coded, but even if we made it reflect + * uptime, that still wouldn't make it right, because the two + * descriptors might be made on different seconds... hm. */ + "bandwidth 1000 5000 10000\n" + "opt extra-info-digest 0000000000000000000000000000000000000000\n" + "onion-key\n", sizeof(buf2)); + strlcat(buf2, pk1_str, sizeof(buf2)); + strlcat(buf2, "signing-key\n", sizeof(buf2)); + strlcat(buf2, pk2_str, sizeof(buf2)); + strlcat(buf2, "opt hidden-service-dir\n", sizeof(buf2)); + strlcat(buf2, "reject *:*\nrouter-signature\n", sizeof(buf2)); + buf[strlen(buf2)] = '\0'; /* Don't compare the sig; it's never the same + * twice */ + + test_streq(buf, buf2); + + test_assert(router_dump_router_to_string(buf, 2048, r1, pk2)>0); + cp = buf; + rp1 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL); + test_assert(rp1); + test_streq(rp1->address, r1->address); + test_eq(rp1->or_port, r1->or_port); + //test_eq(rp1->dir_port, r1->dir_port); + test_eq(rp1->bandwidthrate, r1->bandwidthrate); + test_eq(rp1->bandwidthburst, r1->bandwidthburst); + test_eq(rp1->bandwidthcapacity, r1->bandwidthcapacity); + test_assert(crypto_pk_cmp_keys(rp1->onion_pkey, pk1) == 0); + test_assert(crypto_pk_cmp_keys(rp1->identity_pkey, pk2) == 0); + //test_assert(rp1->exit_policy == NULL); + +#if 0 + /* XXX Once we have exit policies, test this again. XXX */ + strlcpy(buf2, "router tor.tor.tor 9005 0 0 3000\n", sizeof(buf2)); + strlcat(buf2, pk2_str, sizeof(buf2)); + strlcat(buf2, "signing-key\n", sizeof(buf2)); + strlcat(buf2, pk1_str, sizeof(buf2)); + strlcat(buf2, "accept *:80\nreject 18.*:24\n\n", sizeof(buf2)); + test_assert(router_dump_router_to_string(buf, 2048, &r2, pk2)>0); + test_streq(buf, buf2); + + cp = buf; + rp2 = router_parse_entry_from_string(&cp,1); + test_assert(rp2); + test_streq(rp2->address, r2.address); + test_eq(rp2->or_port, r2.or_port); + test_eq(rp2->dir_port, r2.dir_port); + test_eq(rp2->bandwidth, r2.bandwidth); + test_assert(crypto_pk_cmp_keys(rp2->onion_pkey, pk2) == 0); + test_assert(crypto_pk_cmp_keys(rp2->identity_pkey, pk1) == 0); + test_eq(rp2->exit_policy->policy_type, EXIT_POLICY_ACCEPT); + test_streq(rp2->exit_policy->string, "accept *:80"); + test_streq(rp2->exit_policy->address, "*"); + test_streq(rp2->exit_policy->port, "80"); + test_eq(rp2->exit_policy->next->policy_type, EXIT_POLICY_REJECT); + test_streq(rp2->exit_policy->next->string, "reject 18.*:24"); + test_streq(rp2->exit_policy->next->address, "18.*"); + test_streq(rp2->exit_policy->next->port, "24"); + test_assert(rp2->exit_policy->next->next == NULL); + + /* Okay, now for the directories. */ + { + fingerprint_list = smartlist_create(); + crypto_pk_get_fingerprint(pk2, buf, 1); + add_fingerprint_to_dir("Magri", buf, fingerprint_list); + crypto_pk_get_fingerprint(pk1, buf, 1); + add_fingerprint_to_dir("Fred", buf, fingerprint_list); + } + + { + char d[DIGEST_LEN]; + const char *m; + /* XXXX NM re-enable. */ + /* Make sure routers aren't too far in the past any more. */ + r1->cache_info.published_on = time(NULL); + r2->cache_info.published_on = time(NULL)-3*60*60; + test_assert(router_dump_router_to_string(buf, 2048, r1, pk2)>0); + test_eq(dirserv_add_descriptor(buf,&m,""), ROUTER_ADDED_NOTIFY_GENERATOR); + test_assert(router_dump_router_to_string(buf, 2048, r2, pk1)>0); + test_eq(dirserv_add_descriptor(buf,&m,""), ROUTER_ADDED_NOTIFY_GENERATOR); + get_options()->Nickname = tor_strdup("DirServer"); + test_assert(!dirserv_dump_directory_to_string(&cp,pk3, 0)); + crypto_pk_get_digest(pk3, d); + test_assert(!router_parse_directory(cp)); + test_eq(2, smartlist_len(dir1->routers)); + tor_free(cp); + } +#endif + dirserv_free_fingerprint_list(); + + done: + if (r1) + routerinfo_free(r1); + if (r2) + routerinfo_free(r2); + + tor_free(pk1_str); + tor_free(pk2_str); + tor_free(pk3_str); + if (pk1) crypto_free_pk_env(pk1); + if (pk2) crypto_free_pk_env(pk2); + if (pk3) crypto_free_pk_env(pk3); + if (rp1) routerinfo_free(rp1); + tor_free(dir1); /* XXXX And more !*/ + tor_free(dir2); /* And more !*/ +} + +static void +test_dir_versions(void) +{ + tor_version_t ver1; + + /* Try out version parsing functionality */ + test_eq(0, tor_version_parse("0.3.4pre2-cvs", &ver1)); + test_eq(0, ver1.major); + test_eq(3, ver1.minor); + test_eq(4, ver1.micro); + test_eq(VER_PRE, ver1.status); + test_eq(2, ver1.patchlevel); + test_eq(0, tor_version_parse("0.3.4rc1", &ver1)); + test_eq(0, ver1.major); + test_eq(3, ver1.minor); + test_eq(4, ver1.micro); + test_eq(VER_RC, ver1.status); + test_eq(1, ver1.patchlevel); + test_eq(0, tor_version_parse("1.3.4", &ver1)); + test_eq(1, ver1.major); + test_eq(3, ver1.minor); + test_eq(4, ver1.micro); + test_eq(VER_RELEASE, ver1.status); + test_eq(0, ver1.patchlevel); + test_eq(0, tor_version_parse("1.3.4.999", &ver1)); + test_eq(1, ver1.major); + test_eq(3, ver1.minor); + test_eq(4, ver1.micro); + test_eq(VER_RELEASE, ver1.status); + test_eq(999, ver1.patchlevel); + test_eq(0, tor_version_parse("0.1.2.4-alpha", &ver1)); + test_eq(0, ver1.major); + test_eq(1, ver1.minor); + test_eq(2, ver1.micro); + test_eq(4, ver1.patchlevel); + test_eq(VER_RELEASE, ver1.status); + test_streq("alpha", ver1.status_tag); + test_eq(0, tor_version_parse("0.1.2.4", &ver1)); + test_eq(0, ver1.major); + test_eq(1, ver1.minor); + test_eq(2, ver1.micro); + test_eq(4, ver1.patchlevel); + test_eq(VER_RELEASE, ver1.status); + test_streq("", ver1.status_tag); + +#define tt_versionstatus_op(vs1, op, vs2) \ + tt_assert_test_type(vs1,vs2,#vs1" "#op" "#vs2,version_status_t, \ + (_val1 op _val2),"%d") +#define test_v_i_o(val, ver, lst) \ + tt_versionstatus_op(val, ==, tor_version_is_obsolete(ver, lst)) + + /* make sure tor_version_is_obsolete() works */ + test_v_i_o(VS_OLD, "0.0.1", "Tor 0.0.2"); + test_v_i_o(VS_OLD, "0.0.1", "0.0.2, Tor 0.0.3"); + test_v_i_o(VS_OLD, "0.0.1", "0.0.2,Tor 0.0.3"); + test_v_i_o(VS_OLD, "0.0.1","0.0.3,BetterTor 0.0.1"); + test_v_i_o(VS_RECOMMENDED, "0.0.2", "Tor 0.0.2,Tor 0.0.3"); + test_v_i_o(VS_NEW_IN_SERIES, "0.0.2", "Tor 0.0.2pre1,Tor 0.0.3"); + test_v_i_o(VS_OLD, "0.0.2", "Tor 0.0.2.1,Tor 0.0.3"); + test_v_i_o(VS_NEW, "0.1.0", "Tor 0.0.2,Tor 0.0.3"); + test_v_i_o(VS_RECOMMENDED, "0.0.7rc2", "0.0.7,Tor 0.0.7rc2,Tor 0.0.8"); + test_v_i_o(VS_OLD, "0.0.5.0", "0.0.5.1-cvs"); + test_v_i_o(VS_NEW_IN_SERIES, "0.0.5.1-cvs", "0.0.5, 0.0.6"); + /* Not on list, but newer than any in same series. */ + test_v_i_o(VS_NEW_IN_SERIES, "0.1.0.3", + "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); + /* Series newer than any on list. */ + test_v_i_o(VS_NEW, "0.1.2.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); + /* Series older than any on list. */ + test_v_i_o(VS_OLD, "0.0.1.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); + /* Not on list, not newer than any on same series. */ + test_v_i_o(VS_UNRECOMMENDED, "0.1.0.1", + "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); + /* On list, not newer than any on same series. */ + test_v_i_o(VS_UNRECOMMENDED, + "0.1.0.1", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); + test_eq(0, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs")); + test_eq(1, tor_version_as_new_as( + "Tor 0.0.8 on Darwin 64-121-192-100.c3-0." + "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", + "0.0.8rc2")); + test_eq(0, tor_version_as_new_as( + "Tor 0.0.8 on Darwin 64-121-192-100.c3-0." + "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8.2")); + + /* Now try svn revisions. */ + test_eq(1, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", + "Tor 0.2.1.0-dev (r99)")); + test_eq(1, tor_version_as_new_as("Tor 0.2.1.0-dev (r100) on Banana Jr", + "Tor 0.2.1.0-dev (r99) on Hal 9000")); + test_eq(1, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", + "Tor 0.2.1.0-dev on Colossus")); + test_eq(0, tor_version_as_new_as("Tor 0.2.1.0-dev (r99)", + "Tor 0.2.1.0-dev (r100)")); + test_eq(0, tor_version_as_new_as("Tor 0.2.1.0-dev (r99) on MCP", + "Tor 0.2.1.0-dev (r100) on AM")); + test_eq(0, tor_version_as_new_as("Tor 0.2.1.0-dev", + "Tor 0.2.1.0-dev (r99)")); + test_eq(1, tor_version_as_new_as("Tor 0.2.1.1", + "Tor 0.2.1.0-dev (r99)")); + + /* Now try git revisions */ + test_eq(0, tor_version_parse("0.5.6.7 (git-ff00ff)", &ver1)); + test_eq(0, ver1.major); + test_eq(5, ver1.minor); + test_eq(6, ver1.micro); + test_eq(7, ver1.patchlevel); + test_eq(3, ver1.git_tag_len); + test_memeq(ver1.git_tag, "\xff\x00\xff", 3); + test_eq(-1, tor_version_parse("0.5.6.7 (git-ff00xx)", &ver1)); + test_eq(-1, tor_version_parse("0.5.6.7 (git-ff00fff)", &ver1)); + test_eq(0, tor_version_parse("0.5.6.7 (git ff00fff)", &ver1)); + done: + ; +} + +/** Run unit tests for directory fp_pair functions. */ +static void +test_dir_fp_pairs(void) +{ + smartlist_t *sl = smartlist_create(); + fp_pair_t *pair; + + dir_split_resource_into_fingerprint_pairs( + /* Two pairs, out of order, with one duplicate. */ + "73656372657420646174612E0000000000FFFFFF-" + "557365204145532d32353620696e73746561642e+" + "73656372657420646174612E0000000000FFFFFF-" + "557365204145532d32353620696e73746561642e+" + "48657861646563696d616c2069736e277420736f-" + "676f6f6420666f7220686964696e6720796f7572.z", sl); + + test_eq(smartlist_len(sl), 2); + pair = smartlist_get(sl, 0); + test_memeq(pair->first, "Hexadecimal isn't so", DIGEST_LEN); + test_memeq(pair->second, "good for hiding your", DIGEST_LEN); + pair = smartlist_get(sl, 1); + test_memeq(pair->first, "secret data.\0\0\0\0\0\xff\xff\xff", DIGEST_LEN); + test_memeq(pair->second, "Use AES-256 instead.", DIGEST_LEN); + + done: + SMARTLIST_FOREACH(sl, fp_pair_t *, pair, tor_free(pair)); + smartlist_free(sl); +} + +static void +test_dir_split_fps(void *testdata) +{ + smartlist_t *sl = smartlist_create(); + char *mem_op_hex_tmp = NULL; + (void)testdata; + + /* Some example hex fingerprints and their base64 equivalents */ +#define HEX1 "Fe0daff89127389bc67558691231234551193EEE" +#define HEX2 "Deadbeef99999991111119999911111111f00ba4" +#define HEX3 "b33ff00db33ff00db33ff00db33ff00db33ff00d" +#define HEX256_1 \ + "f3f3f3f3fbbbbf3f3f3f3fbbbf3f3f3f3fbbbbf3f3f3f3fbbbf3f3f3f3fbbbbf" +#define HEX256_2 \ + "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccCCc" +#define HEX256_3 \ + "0123456789ABCdef0123456789ABCdef0123456789ABCdef0123456789ABCdef" +#define B64_1 "/g2v+JEnOJvGdVhpEjEjRVEZPu4" +#define B64_2 "3q2+75mZmZERERmZmRERERHwC6Q" +#define B64_3 "sz/wDbM/8A2zP/ANsz/wDbM/8A0" +#define B64_256_1 "8/Pz8/u7vz8/Pz+7vz8/Pz+7u/Pz8/P7u/Pz8/P7u78" +#define B64_256_2 "zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMw" +#define B64_256_3 "ASNFZ4mrze8BI0VniavN7wEjRWeJq83vASNFZ4mrze8" + + /* no flags set */ + dir_split_resource_into_fingerprints("A+C+B", sl, NULL, 0); + tt_int_op(smartlist_len(sl), ==, 3); + tt_str_op(smartlist_get(sl, 0), ==, "A"); + tt_str_op(smartlist_get(sl, 1), ==, "C"); + tt_str_op(smartlist_get(sl, 2), ==, "B"); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* uniq strings. */ + dir_split_resource_into_fingerprints("A+C+B+A+B+B", sl, NULL, DSR_SORT_UNIQ); + tt_int_op(smartlist_len(sl), ==, 3); + tt_str_op(smartlist_get(sl, 0), ==, "A"); + tt_str_op(smartlist_get(sl, 1), ==, "B"); + tt_str_op(smartlist_get(sl, 2), ==, "C"); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode hex. */ + dir_split_resource_into_fingerprints(HEX1"+"HEX2, sl, NULL, DSR_HEX); + tt_int_op(smartlist_len(sl), ==, 2); + test_mem_op_hex(smartlist_get(sl, 0), ==, HEX1); + test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* decode hex and drop weirdness. */ + dir_split_resource_into_fingerprints(HEX1"+bogus+"HEX2"+"HEX256_1, + sl, NULL, DSR_HEX); + tt_int_op(smartlist_len(sl), ==, 2); + test_mem_op_hex(smartlist_get(sl, 0), ==, HEX1); + test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode long hex */ + dir_split_resource_into_fingerprints(HEX256_1"+"HEX256_2"+"HEX2"+"HEX256_3, + sl, NULL, DSR_HEX|DSR_DIGEST256); + tt_int_op(smartlist_len(sl), ==, 3); + test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_1); + test_mem_op_hex(smartlist_get(sl, 1), ==, HEX256_2); + test_mem_op_hex(smartlist_get(sl, 2), ==, HEX256_3); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode hex and sort. */ + dir_split_resource_into_fingerprints(HEX1"+"HEX2"+"HEX3"+"HEX2, + sl, NULL, DSR_HEX|DSR_SORT_UNIQ); + tt_int_op(smartlist_len(sl), ==, 3); + test_mem_op_hex(smartlist_get(sl, 0), ==, HEX3); + test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2); + test_mem_op_hex(smartlist_get(sl, 2), ==, HEX1); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode long hex and sort */ + dir_split_resource_into_fingerprints(HEX256_1"+"HEX256_2"+"HEX256_3 + "+"HEX256_1, + sl, NULL, + DSR_HEX|DSR_DIGEST256|DSR_SORT_UNIQ); + tt_int_op(smartlist_len(sl), ==, 3); + test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_3); + test_mem_op_hex(smartlist_get(sl, 1), ==, HEX256_2); + test_mem_op_hex(smartlist_get(sl, 2), ==, HEX256_1); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode base64 */ + dir_split_resource_into_fingerprints(B64_1"-"B64_2, sl, NULL, DSR_BASE64); + tt_int_op(smartlist_len(sl), ==, 2); + test_mem_op_hex(smartlist_get(sl, 0), ==, HEX1); + test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode long base64 */ + dir_split_resource_into_fingerprints(B64_256_1"-"B64_256_2, + sl, NULL, DSR_BASE64|DSR_DIGEST256); + tt_int_op(smartlist_len(sl), ==, 2); + test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_1); + test_mem_op_hex(smartlist_get(sl, 1), ==, HEX256_2); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + dir_split_resource_into_fingerprints(B64_256_1, + sl, NULL, DSR_BASE64|DSR_DIGEST256); + tt_int_op(smartlist_len(sl), ==, 1); + test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_1); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + done: + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_free(sl); + tor_free(mem_op_hex_tmp); +} + +static void +test_dir_measured_bw(void) +{ + measured_bw_line_t mbwl; + int i; + const char *lines_pass[] = { + "node_id=$557365204145532d32353620696e73746561642e bw=1024\n", + "node_id=$557365204145532d32353620696e73746561642e\t bw=1024 \n", + " node_id=$557365204145532d32353620696e73746561642e bw=1024\n", + "\tnoise\tnode_id=$557365204145532d32353620696e73746561642e " + "bw=1024 junk=007\n", + "misc=junk node_id=$557365204145532d32353620696e73746561642e " + "bw=1024 junk=007\n", + "end" + }; + const char *lines_fail[] = { + /* Test possible python stupidity on input */ + "node_id=None bw=1024\n", + "node_id=$None bw=1024\n", + "node_id=$557365204145532d32353620696e73746561642e bw=None\n", + "node_id=$557365204145532d32353620696e73746561642e bw=1024.0\n", + "node_id=$557365204145532d32353620696e73746561642e bw=.1024\n", + "node_id=$557365204145532d32353620696e73746561642e bw=1.024\n", + "node_id=$557365204145532d32353620696e73746561642e bw=1024 bw=0\n", + "node_id=$557365204145532d32353620696e73746561642e bw=1024 bw=None\n", + "node_id=$557365204145532d32353620696e73746561642e bw=-1024\n", + /* Test incomplete writes due to race conditions, partial copies, etc */ + "node_i", + "node_i\n", + "node_id=", + "node_id=\n", + "node_id=$557365204145532d32353620696e73746561642e bw=", + "node_id=$557365204145532d32353620696e73746561642e bw=1024", + "node_id=$557365204145532d32353620696e73746561642e bw=\n", + "node_id=$557365204145532d32353620696e7374", + "node_id=$557365204145532d32353620696e7374\n", + "", + "\n", + " \n ", + " \n\n", + /* Test assorted noise */ + " node_id= ", + "node_id==$557365204145532d32353620696e73746561642e bw==1024\n", + "node_id=$55736520414552d32353620696e73746561642e bw=1024\n", + "node_id=557365204145532d32353620696e73746561642e bw=1024\n", + "node_id= $557365204145532d32353620696e73746561642e bw=0.23\n", + "end" + }; + + for (i = 0; strcmp(lines_fail[i], "end"); i++) { + //fprintf(stderr, "Testing: %s\n", lines_fail[i]); + test_assert(measured_bw_line_parse(&mbwl, lines_fail[i]) == -1); + } + + for (i = 0; strcmp(lines_pass[i], "end"); i++) { + //fprintf(stderr, "Testing: %s %d\n", lines_pass[i], TOR_ISSPACE('\n')); + test_assert(measured_bw_line_parse(&mbwl, lines_pass[i]) == 0); + test_assert(mbwl.bw == 1024); + test_assert(strcmp(mbwl.node_hex, + "557365204145532d32353620696e73746561642e") == 0); + } + + done: + return; +} + +static void +test_dir_param_voting(void) +{ + networkstatus_t vote1, vote2, vote3, vote4; + smartlist_t *votes = smartlist_create(); + char *res = NULL; + + /* dirvote_compute_params only looks at the net_params field of the votes, + so that's all we need to set. + */ + memset(&vote1, 0, sizeof(vote1)); + memset(&vote2, 0, sizeof(vote2)); + memset(&vote3, 0, sizeof(vote3)); + memset(&vote4, 0, sizeof(vote4)); + vote1.net_params = smartlist_create(); + vote2.net_params = smartlist_create(); + vote3.net_params = smartlist_create(); + vote4.net_params = smartlist_create(); + smartlist_split_string(vote1.net_params, + "ab=90 abcd=20 cw=50 x-yz=-99", NULL, 0, 0); + smartlist_split_string(vote2.net_params, + "ab=27 cw=5 x-yz=88", NULL, 0, 0); + smartlist_split_string(vote3.net_params, + "abcd=20 c=60 cw=500 x-yz=-9 zzzzz=101", NULL, 0, 0); + smartlist_split_string(vote4.net_params, + "ab=900 abcd=200 c=1 cw=51 x-yz=100", NULL, 0, 0); + test_eq(100, networkstatus_get_param(&vote4, "x-yz", 50)); + test_eq(222, networkstatus_get_param(&vote4, "foobar", 222)); + + smartlist_add(votes, &vote1); + smartlist_add(votes, &vote2); + smartlist_add(votes, &vote3); + smartlist_add(votes, &vote4); + + res = dirvote_compute_params(votes); + test_streq(res, + "ab=90 abcd=20 c=1 cw=50 x-yz=-9 zzzzz=101"); + + done: + tor_free(res); + SMARTLIST_FOREACH(vote1.net_params, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(vote2.net_params, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(vote3.net_params, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(vote4.net_params, char *, cp, tor_free(cp)); + smartlist_free(vote1.net_params); + smartlist_free(vote2.net_params); + smartlist_free(vote3.net_params); + smartlist_free(vote4.net_params); + smartlist_free(votes); + + return; +} + +extern const char AUTHORITY_CERT_1[]; +extern const char AUTHORITY_SIGNKEY_1[]; +extern const char AUTHORITY_CERT_2[]; +extern const char AUTHORITY_SIGNKEY_2[]; +extern const char AUTHORITY_CERT_3[]; +extern const char AUTHORITY_SIGNKEY_3[]; + +/** Helper: Test that two networkstatus_voter_info_t do in fact represent the + * same voting authority, and that they do in fact have all the same + * information. */ +static void +test_same_voter(networkstatus_voter_info_t *v1, + networkstatus_voter_info_t *v2) +{ + test_streq(v1->nickname, v2->nickname); + test_memeq(v1->identity_digest, v2->identity_digest, DIGEST_LEN); + test_streq(v1->address, v2->address); + test_eq(v1->addr, v2->addr); + test_eq(v1->dir_port, v2->dir_port); + test_eq(v1->or_port, v2->or_port); + test_streq(v1->contact, v2->contact); + test_memeq(v1->vote_digest, v2->vote_digest, DIGEST_LEN); + done: + ; +} + +/** Helper: Make a new routerinfo containing the right information for a + * given vote_routerstatus_t. */ +static routerinfo_t * +generate_ri_from_rs(const vote_routerstatus_t *vrs) +{ + routerinfo_t *r; + const routerstatus_t *rs = &vrs->status; + static time_t published = 0; + + r = tor_malloc_zero(sizeof(routerinfo_t)); + memcpy(r->cache_info.identity_digest, rs->identity_digest, DIGEST_LEN); + memcpy(r->cache_info.signed_descriptor_digest, rs->descriptor_digest, + DIGEST_LEN); + r->cache_info.do_not_cache = 1; + r->cache_info.routerlist_index = -1; + r->cache_info.signed_descriptor_body = + tor_strdup("123456789012345678901234567890123"); + r->cache_info.signed_descriptor_len = + strlen(r->cache_info.signed_descriptor_body); + r->exit_policy = smartlist_create(); + r->cache_info.published_on = ++published + time(NULL); + return r; +} + +/** Helper: get a detached signatures document for one or two + * consensuses. */ +static char * +get_detached_sigs(networkstatus_t *ns, networkstatus_t *ns2) +{ + char *r; + smartlist_t *sl; + tor_assert(ns && ns->flavor == FLAV_NS); + sl = smartlist_create(); + smartlist_add(sl,ns); + if (ns2) + smartlist_add(sl,ns2); + r = networkstatus_get_detached_signatures(sl); + smartlist_free(sl); + return r; +} + +/** Run unit tests for generating and parsing V3 consensus networkstatus + * documents. */ +static void +test_dir_v3_networkstatus(void) +{ + authority_cert_t *cert1=NULL, *cert2=NULL, *cert3=NULL; + crypto_pk_env_t *sign_skey_1=NULL, *sign_skey_2=NULL, *sign_skey_3=NULL; + crypto_pk_env_t *sign_skey_leg1=NULL; + const char *msg=NULL; + + time_t now = time(NULL); + networkstatus_voter_info_t *voter; + document_signature_t *sig; + networkstatus_t *vote=NULL, *v1=NULL, *v2=NULL, *v3=NULL, *con=NULL, + *con_md=NULL; + vote_routerstatus_t *vrs; + routerstatus_t *rs; + char *v1_text=NULL, *v2_text=NULL, *v3_text=NULL, *consensus_text=NULL, *cp; + smartlist_t *votes = smartlist_create(); + + /* For generating the two other consensuses. */ + char *detached_text1=NULL, *detached_text2=NULL; + char *consensus_text2=NULL, *consensus_text3=NULL; + char *consensus_text_md2=NULL, *consensus_text_md3=NULL; + char *consensus_text_md=NULL; + networkstatus_t *con2=NULL, *con_md2=NULL, *con3=NULL, *con_md3=NULL; + ns_detached_signatures_t *dsig1=NULL, *dsig2=NULL; + + /* Parse certificates and keys. */ + cert1 = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); + test_assert(cert1); + test_assert(cert1->is_cross_certified); + cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL); + test_assert(cert2); + cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL); + test_assert(cert3); + sign_skey_1 = crypto_new_pk_env(); + sign_skey_2 = crypto_new_pk_env(); + sign_skey_3 = crypto_new_pk_env(); + sign_skey_leg1 = pk_generate(4); + + test_assert(!crypto_pk_read_private_key_from_string(sign_skey_1, + AUTHORITY_SIGNKEY_1)); + test_assert(!crypto_pk_read_private_key_from_string(sign_skey_2, + AUTHORITY_SIGNKEY_2)); + test_assert(!crypto_pk_read_private_key_from_string(sign_skey_3, + AUTHORITY_SIGNKEY_3)); + + test_assert(!crypto_pk_cmp_keys(sign_skey_1, cert1->signing_key)); + test_assert(!crypto_pk_cmp_keys(sign_skey_2, cert2->signing_key)); + + /* + * Set up a vote; generate it; try to parse it. + */ + vote = tor_malloc_zero(sizeof(networkstatus_t)); + vote->type = NS_TYPE_VOTE; + vote->published = now; + vote->valid_after = now+1000; + vote->fresh_until = now+2000; + vote->valid_until = now+3000; + vote->vote_seconds = 100; + vote->dist_seconds = 200; + vote->supported_methods = smartlist_create(); + smartlist_split_string(vote->supported_methods, "1 2 3", NULL, 0, -1); + vote->client_versions = tor_strdup("0.1.2.14,0.1.2.15"); + vote->server_versions = tor_strdup("0.1.2.14,0.1.2.15,0.1.2.16"); + vote->known_flags = smartlist_create(); + smartlist_split_string(vote->known_flags, + "Authority Exit Fast Guard Running Stable V2Dir Valid", + 0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + vote->voters = smartlist_create(); + voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); + voter->nickname = tor_strdup("Voter1"); + voter->address = tor_strdup("1.2.3.4"); + voter->addr = 0x01020304; + voter->dir_port = 80; + voter->or_port = 9000; + voter->contact = tor_strdup("voter@example.com"); + crypto_pk_get_digest(cert1->identity_key, voter->identity_digest); + smartlist_add(vote->voters, voter); + vote->cert = authority_cert_dup(cert1); + vote->net_params = smartlist_create(); + smartlist_split_string(vote->net_params, "circuitwindow=101 foo=990", + NULL, 0, 0); + vote->routerstatus_list = smartlist_create(); + /* add the first routerstatus. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.1.2.14"); + rs->published_on = now-1500; + strlcpy(rs->nickname, "router2", sizeof(rs->nickname)); + memset(rs->identity_digest, 3, DIGEST_LEN); + memset(rs->descriptor_digest, 78, DIGEST_LEN); + rs->addr = 0x99008801; + rs->or_port = 443; + rs->dir_port = 8000; + /* all flags but running cleared */ + rs->is_running = 1; + smartlist_add(vote->routerstatus_list, vrs); + test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0); + + /* add the second routerstatus. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.2.0.5"); + rs->published_on = now-1000; + strlcpy(rs->nickname, "router1", sizeof(rs->nickname)); + memset(rs->identity_digest, 5, DIGEST_LEN); + memset(rs->descriptor_digest, 77, DIGEST_LEN); + rs->addr = 0x99009901; + rs->or_port = 443; + rs->dir_port = 0; + rs->is_exit = rs->is_stable = rs->is_fast = rs->is_running = + rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1; + smartlist_add(vote->routerstatus_list, vrs); + test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0); + + /* add the third routerstatus. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.1.0.3"); + rs->published_on = now-1000; + strlcpy(rs->nickname, "router3", sizeof(rs->nickname)); + memset(rs->identity_digest, 33, DIGEST_LEN); + memset(rs->descriptor_digest, 79, DIGEST_LEN); + rs->addr = 0xAA009901; + rs->or_port = 400; + rs->dir_port = 9999; + rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast = + rs->is_running = rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1; + smartlist_add(vote->routerstatus_list, vrs); + test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0); + + /* add a fourth routerstatus that is not running. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.1.6.3"); + rs->published_on = now-1000; + strlcpy(rs->nickname, "router4", sizeof(rs->nickname)); + memset(rs->identity_digest, 34, DIGEST_LEN); + memset(rs->descriptor_digest, 47, DIGEST_LEN); + rs->addr = 0xC0000203; + rs->or_port = 500; + rs->dir_port = 1999; + /* Running flag (and others) cleared */ + smartlist_add(vote->routerstatus_list, vrs); + test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0); + + /* dump the vote and try to parse it. */ + v1_text = format_networkstatus_vote(sign_skey_1, vote); + test_assert(v1_text); + v1 = networkstatus_parse_vote_from_string(v1_text, NULL, NS_TYPE_VOTE); + test_assert(v1); + + /* Make sure the parsed thing was right. */ + test_eq(v1->type, NS_TYPE_VOTE); + test_eq(v1->published, vote->published); + test_eq(v1->valid_after, vote->valid_after); + test_eq(v1->fresh_until, vote->fresh_until); + test_eq(v1->valid_until, vote->valid_until); + test_eq(v1->vote_seconds, vote->vote_seconds); + test_eq(v1->dist_seconds, vote->dist_seconds); + test_streq(v1->client_versions, vote->client_versions); + test_streq(v1->server_versions, vote->server_versions); + test_assert(v1->voters && smartlist_len(v1->voters)); + voter = smartlist_get(v1->voters, 0); + test_streq(voter->nickname, "Voter1"); + test_streq(voter->address, "1.2.3.4"); + test_eq(voter->addr, 0x01020304); + test_eq(voter->dir_port, 80); + test_eq(voter->or_port, 9000); + test_streq(voter->contact, "voter@example.com"); + test_assert(v1->cert); + test_assert(!crypto_pk_cmp_keys(sign_skey_1, v1->cert->signing_key)); + cp = smartlist_join_strings(v1->known_flags, ":", 0, NULL); + test_streq(cp, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid"); + tor_free(cp); + test_eq(smartlist_len(v1->routerstatus_list), 4); + /* Check the first routerstatus. */ + vrs = smartlist_get(v1->routerstatus_list, 0); + rs = &vrs->status; + test_streq(vrs->version, "0.1.2.14"); + test_eq(rs->published_on, now-1500); + test_streq(rs->nickname, "router2"); + test_memeq(rs->identity_digest, + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", + DIGEST_LEN); + test_memeq(rs->descriptor_digest, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); + test_eq(rs->addr, 0x99008801); + test_eq(rs->or_port, 443); + test_eq(rs->dir_port, 8000); + test_eq(vrs->flags, U64_LITERAL(16)); // no flags except "running" + /* Check the second routerstatus. */ + vrs = smartlist_get(v1->routerstatus_list, 1); + rs = &vrs->status; + test_streq(vrs->version, "0.2.0.5"); + test_eq(rs->published_on, now-1000); + test_streq(rs->nickname, "router1"); + test_memeq(rs->identity_digest, + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", + DIGEST_LEN); + test_memeq(rs->descriptor_digest, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); + test_eq(rs->addr, 0x99009901); + test_eq(rs->or_port, 443); + test_eq(rs->dir_port, 0); + test_eq(vrs->flags, U64_LITERAL(254)); // all flags except "authority." + + { + measured_bw_line_t mbw; + memset(mbw.node_id, 33, sizeof(mbw.node_id)); + mbw.bw = 1024; + test_assert(measured_bw_line_apply(&mbw, + v1->routerstatus_list) == 1); + vrs = smartlist_get(v1->routerstatus_list, 2); + test_assert(vrs->status.has_measured_bw && + vrs->status.measured_bw == 1024); + } + + /* Generate second vote. It disagrees on some of the times, + * and doesn't list versions, and knows some crazy flags */ + vote->published = now+1; + vote->fresh_until = now+3005; + vote->dist_seconds = 300; + authority_cert_free(vote->cert); + vote->cert = authority_cert_dup(cert2); + vote->net_params = smartlist_create(); + smartlist_split_string(vote->net_params, "bar=2000000000 circuitwindow=20", + NULL, 0, 0); + tor_free(vote->client_versions); + tor_free(vote->server_versions); + voter = smartlist_get(vote->voters, 0); + tor_free(voter->nickname); + tor_free(voter->address); + voter->nickname = tor_strdup("Voter2"); + voter->address = tor_strdup("2.3.4.5"); + voter->addr = 0x02030405; + crypto_pk_get_digest(cert2->identity_key, voter->identity_digest); + smartlist_add(vote->known_flags, tor_strdup("MadeOfCheese")); + smartlist_add(vote->known_flags, tor_strdup("MadeOfTin")); + smartlist_sort_strings(vote->known_flags); + vrs = smartlist_get(vote->routerstatus_list, 2); + smartlist_del_keeporder(vote->routerstatus_list, 2); + tor_free(vrs->version); + tor_free(vrs); + vrs = smartlist_get(vote->routerstatus_list, 0); + vrs->status.is_fast = 1; + /* generate and parse. */ + v2_text = format_networkstatus_vote(sign_skey_2, vote); + test_assert(v2_text); + v2 = networkstatus_parse_vote_from_string(v2_text, NULL, NS_TYPE_VOTE); + test_assert(v2); + /* Check that flags come out right.*/ + cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL); + test_streq(cp, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" + "Running:Stable:V2Dir:Valid"); + tor_free(cp); + vrs = smartlist_get(v2->routerstatus_list, 1); + /* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) */ + test_eq(vrs->flags, U64_LITERAL(974)); + + /* Generate the third vote. */ + vote->published = now; + vote->fresh_until = now+2003; + vote->dist_seconds = 250; + authority_cert_free(vote->cert); + vote->cert = authority_cert_dup(cert3); + vote->net_params = smartlist_create(); + smartlist_split_string(vote->net_params, "circuitwindow=80 foo=660", + NULL, 0, 0); + smartlist_add(vote->supported_methods, tor_strdup("4")); + vote->client_versions = tor_strdup("0.1.2.14,0.1.2.17"); + vote->server_versions = tor_strdup("0.1.2.10,0.1.2.15,0.1.2.16"); + voter = smartlist_get(vote->voters, 0); + tor_free(voter->nickname); + tor_free(voter->address); + voter->nickname = tor_strdup("Voter3"); + voter->address = tor_strdup("3.4.5.6"); + voter->addr = 0x03040506; + crypto_pk_get_digest(cert3->identity_key, voter->identity_digest); + /* This one has a legacy id. */ + memset(voter->legacy_id_digest, (int)'A', DIGEST_LEN); + vrs = smartlist_get(vote->routerstatus_list, 0); + smartlist_del_keeporder(vote->routerstatus_list, 0); + tor_free(vrs->version); + tor_free(vrs); + vrs = smartlist_get(vote->routerstatus_list, 0); + memset(vrs->status.descriptor_digest, (int)'Z', DIGEST_LEN); + test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0); + + v3_text = format_networkstatus_vote(sign_skey_3, vote); + test_assert(v3_text); + + v3 = networkstatus_parse_vote_from_string(v3_text, NULL, NS_TYPE_VOTE); + test_assert(v3); + + /* Compute a consensus as voter 3. */ + smartlist_add(votes, v3); + smartlist_add(votes, v1); + smartlist_add(votes, v2); + consensus_text = networkstatus_compute_consensus(votes, 3, + cert3->identity_key, + sign_skey_3, + "AAAAAAAAAAAAAAAAAAAA", + sign_skey_leg1, + FLAV_NS); + test_assert(consensus_text); + con = networkstatus_parse_vote_from_string(consensus_text, NULL, + NS_TYPE_CONSENSUS); + test_assert(con); + //log_notice(LD_GENERAL, "<<%s>>\n<<%s>>\n<<%s>>\n", + // v1_text, v2_text, v3_text); + consensus_text_md = networkstatus_compute_consensus(votes, 3, + cert3->identity_key, + sign_skey_3, + "AAAAAAAAAAAAAAAAAAAA", + sign_skey_leg1, + FLAV_MICRODESC); + test_assert(consensus_text_md); + con_md = networkstatus_parse_vote_from_string(consensus_text_md, NULL, + NS_TYPE_CONSENSUS); + test_assert(con_md); + test_eq(con_md->flavor, FLAV_MICRODESC); + + /* Check consensus contents. */ + test_assert(con->type == NS_TYPE_CONSENSUS); + test_eq(con->published, 0); /* this field only appears in votes. */ + test_eq(con->valid_after, now+1000); + test_eq(con->fresh_until, now+2003); /* median */ + test_eq(con->valid_until, now+3000); + test_eq(con->vote_seconds, 100); + test_eq(con->dist_seconds, 250); /* median */ + test_streq(con->client_versions, "0.1.2.14"); + test_streq(con->server_versions, "0.1.2.15,0.1.2.16"); + cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL); + test_streq(cp, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" + "Running:Stable:V2Dir:Valid"); + tor_free(cp); + cp = smartlist_join_strings(con->net_params, ":", 0, NULL); + test_streq(cp, "bar=2000000000:circuitwindow=80:foo=660"); + tor_free(cp); + + test_eq(4, smartlist_len(con->voters)); /*3 voters, 1 legacy key.*/ + /* The voter id digests should be in this order. */ + test_assert(memcmp(cert2->cache_info.identity_digest, + cert1->cache_info.identity_digest,DIGEST_LEN)<0); + test_assert(memcmp(cert1->cache_info.identity_digest, + cert3->cache_info.identity_digest,DIGEST_LEN)<0); + test_same_voter(smartlist_get(con->voters, 1), + smartlist_get(v2->voters, 0)); + test_same_voter(smartlist_get(con->voters, 2), + smartlist_get(v1->voters, 0)); + test_same_voter(smartlist_get(con->voters, 3), + smartlist_get(v3->voters, 0)); + + test_assert(!con->cert); + test_eq(2, smartlist_len(con->routerstatus_list)); + /* There should be two listed routers: one with identity 3, one with + * identity 5. */ + /* This one showed up in 2 digests. */ + rs = smartlist_get(con->routerstatus_list, 0); + test_memeq(rs->identity_digest, + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", + DIGEST_LEN); + test_memeq(rs->descriptor_digest, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); + test_assert(!rs->is_authority); + test_assert(!rs->is_exit); + test_assert(!rs->is_fast); + test_assert(!rs->is_possible_guard); + test_assert(!rs->is_stable); + test_assert(rs->is_running); /* If it wasn't running it wouldn't be here */ + test_assert(!rs->is_v2_dir); + test_assert(!rs->is_valid); + test_assert(!rs->is_named); + /* XXXX check version */ + + rs = smartlist_get(con->routerstatus_list, 1); + /* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'. */ + test_memeq(rs->identity_digest, + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", + DIGEST_LEN); + test_streq(rs->nickname, "router1"); + test_memeq(rs->descriptor_digest, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); + test_eq(rs->published_on, now-1000); + test_eq(rs->addr, 0x99009901); + test_eq(rs->or_port, 443); + test_eq(rs->dir_port, 0); + test_assert(!rs->is_authority); + test_assert(rs->is_exit); + test_assert(rs->is_fast); + test_assert(rs->is_possible_guard); + test_assert(rs->is_stable); + test_assert(rs->is_running); + test_assert(rs->is_v2_dir); + test_assert(rs->is_valid); + test_assert(!rs->is_named); + /* XXXX check version */ + + /* Check signatures. the first voter is a pseudo-entry with a legacy key. + * The second one hasn't signed. The fourth one has signed: validate it. */ + voter = smartlist_get(con->voters, 1); + test_eq(smartlist_len(voter->sigs), 0); + + voter = smartlist_get(con->voters, 3); + test_eq(smartlist_len(voter->sigs), 1); + sig = smartlist_get(voter->sigs, 0); + test_assert(sig->signature); + test_assert(!sig->good_signature); + test_assert(!sig->bad_signature); + + test_assert(!networkstatus_check_document_signature(con, sig, cert3)); + test_assert(sig->signature); + test_assert(sig->good_signature); + test_assert(!sig->bad_signature); + + { + const char *msg=NULL; + /* Compute the other two signed consensuses. */ + smartlist_shuffle(votes); + consensus_text2 = networkstatus_compute_consensus(votes, 3, + cert2->identity_key, + sign_skey_2, NULL,NULL, + FLAV_NS); + consensus_text_md2 = networkstatus_compute_consensus(votes, 3, + cert2->identity_key, + sign_skey_2, NULL,NULL, + FLAV_MICRODESC); + smartlist_shuffle(votes); + consensus_text3 = networkstatus_compute_consensus(votes, 3, + cert1->identity_key, + sign_skey_1, NULL,NULL, + FLAV_NS); + consensus_text_md3 = networkstatus_compute_consensus(votes, 3, + cert1->identity_key, + sign_skey_1, NULL,NULL, + FLAV_MICRODESC); + test_assert(consensus_text2); + test_assert(consensus_text3); + test_assert(consensus_text_md2); + test_assert(consensus_text_md3); + con2 = networkstatus_parse_vote_from_string(consensus_text2, NULL, + NS_TYPE_CONSENSUS); + con3 = networkstatus_parse_vote_from_string(consensus_text3, NULL, + NS_TYPE_CONSENSUS); + con_md2 = networkstatus_parse_vote_from_string(consensus_text_md2, NULL, + NS_TYPE_CONSENSUS); + con_md3 = networkstatus_parse_vote_from_string(consensus_text_md3, NULL, + NS_TYPE_CONSENSUS); + test_assert(con2); + test_assert(con3); + test_assert(con_md2); + test_assert(con_md3); + + /* All three should have the same digest. */ + test_memeq(&con->digests, &con2->digests, sizeof(digests_t)); + test_memeq(&con->digests, &con3->digests, sizeof(digests_t)); + + test_memeq(&con_md->digests, &con_md2->digests, sizeof(digests_t)); + test_memeq(&con_md->digests, &con_md3->digests, sizeof(digests_t)); + + /* Extract a detached signature from con3. */ + detached_text1 = get_detached_sigs(con3, con_md3); + tor_assert(detached_text1); + /* Try to parse it. */ + dsig1 = networkstatus_parse_detached_signatures(detached_text1, NULL); + tor_assert(dsig1); + + /* Are parsed values as expected? */ + test_eq(dsig1->valid_after, con3->valid_after); + test_eq(dsig1->fresh_until, con3->fresh_until); + test_eq(dsig1->valid_until, con3->valid_until); + { + digests_t *dsig_digests = strmap_get(dsig1->digests, "ns"); + test_assert(dsig_digests); + test_memeq(dsig_digests->d[DIGEST_SHA1], con3->digests.d[DIGEST_SHA1], + DIGEST_LEN); + dsig_digests = strmap_get(dsig1->digests, "microdesc"); + test_assert(dsig_digests); + test_memeq(dsig_digests->d[DIGEST_SHA256], + con_md3->digests.d[DIGEST_SHA256], + DIGEST256_LEN); + } + { + smartlist_t *dsig_signatures = strmap_get(dsig1->signatures, "ns"); + test_assert(dsig_signatures); + test_eq(1, smartlist_len(dsig_signatures)); + sig = smartlist_get(dsig_signatures, 0); + test_memeq(sig->identity_digest, cert1->cache_info.identity_digest, + DIGEST_LEN); + test_eq(sig->alg, DIGEST_SHA1); + + dsig_signatures = strmap_get(dsig1->signatures, "microdesc"); + test_assert(dsig_signatures); + test_eq(1, smartlist_len(dsig_signatures)); + sig = smartlist_get(dsig_signatures, 0); + test_memeq(sig->identity_digest, cert1->cache_info.identity_digest, + DIGEST_LEN); + test_eq(sig->alg, DIGEST_SHA256); + } + + /* Try adding it to con2. */ + detached_text2 = get_detached_sigs(con2,con_md2); + test_eq(1, networkstatus_add_detached_signatures(con2, dsig1, &msg)); + tor_free(detached_text2); + test_eq(1, networkstatus_add_detached_signatures(con_md2, dsig1, &msg)); + tor_free(detached_text2); + detached_text2 = get_detached_sigs(con2,con_md2); + //printf("\n<%s>\n", detached_text2); + dsig2 = networkstatus_parse_detached_signatures(detached_text2, NULL); + test_assert(dsig2); + /* + printf("\n"); + SMARTLIST_FOREACH(dsig2->signatures, networkstatus_voter_info_t *, vi, { + char hd[64]; + base16_encode(hd, sizeof(hd), vi->identity_digest, DIGEST_LEN); + printf("%s\n", hd); + }); + */ + test_eq(2, + smartlist_len((smartlist_t*)strmap_get(dsig2->signatures, "ns"))); + test_eq(2, + smartlist_len((smartlist_t*)strmap_get(dsig2->signatures, + "microdesc"))); + + /* Try adding to con2 twice; verify that nothing changes. */ + test_eq(0, networkstatus_add_detached_signatures(con2, dsig1, &msg)); + + /* Add to con. */ + test_eq(2, networkstatus_add_detached_signatures(con, dsig2, &msg)); + /* Check signatures */ + voter = smartlist_get(con->voters, 1); + sig = smartlist_get(voter->sigs, 0); + test_assert(sig); + test_assert(!networkstatus_check_document_signature(con, sig, cert2)); + voter = smartlist_get(con->voters, 2); + sig = smartlist_get(voter->sigs, 0); + test_assert(sig); + test_assert(!networkstatus_check_document_signature(con, sig, cert1)); + } + + done: + smartlist_free(votes); + tor_free(v1_text); + tor_free(v2_text); + tor_free(v3_text); + tor_free(consensus_text); + tor_free(consensus_text_md); + + if (vote) + networkstatus_vote_free(vote); + if (v1) + networkstatus_vote_free(v1); + if (v2) + networkstatus_vote_free(v2); + if (v3) + networkstatus_vote_free(v3); + if (con) + networkstatus_vote_free(con); + if (con_md) + networkstatus_vote_free(con_md); + if (sign_skey_1) + crypto_free_pk_env(sign_skey_1); + if (sign_skey_2) + crypto_free_pk_env(sign_skey_2); + if (sign_skey_3) + crypto_free_pk_env(sign_skey_3); + if (sign_skey_leg1) + crypto_free_pk_env(sign_skey_leg1); + if (cert1) + authority_cert_free(cert1); + if (cert2) + authority_cert_free(cert2); + if (cert3) + authority_cert_free(cert3); + + tor_free(consensus_text2); + tor_free(consensus_text3); + tor_free(consensus_text_md2); + tor_free(consensus_text_md3); + tor_free(detached_text1); + tor_free(detached_text2); + if (con2) + networkstatus_vote_free(con2); + if (con3) + networkstatus_vote_free(con3); + if (con_md2) + networkstatus_vote_free(con_md2); + if (con_md3) + networkstatus_vote_free(con_md3); + if (dsig1) + ns_detached_signatures_free(dsig1); + if (dsig2) + ns_detached_signatures_free(dsig2); +} + +#define DIR_LEGACY(name) \ + { #name, legacy_test_helper, 0, &legacy_setup, test_dir_ ## name } + +#define DIR(name) \ + { #name, test_dir_##name, 0, NULL, NULL } + +struct testcase_t dir_tests[] = { + DIR_LEGACY(nicknames), + DIR_LEGACY(formats), + DIR_LEGACY(versions), + DIR_LEGACY(fp_pairs), + DIR(split_fps), + DIR_LEGACY(measured_bw), + DIR_LEGACY(param_voting), + DIR_LEGACY(v3_networkstatus), + END_OF_TESTCASES +}; + diff -Nru tor-0.2.0.34/src/test/test.h tor-0.2.2.16-alpha/src/test/test.h --- tor-0.2.0.34/src/test/test.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/test.h 2010-03-07 04:03:28.000000000 +0000 @@ -0,0 +1,75 @@ +/* Copyright (c) 2001-2003, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef _TOR_TEST_H +#define _TOR_TEST_H + +/** + * \file test.h + * \brief Macros and functions used by unit tests. + */ + +#include "compat.h" +#include "tinytest.h" +#define TT_EXIT_TEST_FUNCTION STMT_BEGIN goto done; STMT_END +#include "tinytest_macros.h" + +#ifdef __GNUC__ +#define PRETTY_FUNCTION __PRETTY_FUNCTION__ +#else +#define PRETTY_FUNCTION "" +#endif + +#define test_fail_msg(msg) TT_DIE((msg)) + +#define test_fail() test_fail_msg("Assertion failed.") + +#define test_assert(expr) tt_assert(expr) + +#define test_eq(expr1, expr2) tt_int_op((expr1), ==, (expr2)) +#define test_eq_ptr(expr1, expr2) tt_ptr_op((expr1), ==, (expr2)) +#define test_neq(expr1, expr2) tt_int_op((expr1), !=, (expr2)) +#define test_neq_ptr(expr1, expr2) tt_ptr_op((expr1), !=, (expr2)) +#define test_streq(expr1, expr2) tt_str_op((expr1), ==, (expr2)) +#define test_strneq(expr1, expr2) tt_str_op((expr1), !=, (expr2)) +#define test_streq(expr1, expr2) tt_str_op((expr1), ==, (expr2)) + +#define test_mem_op(expr1, op, expr2, len) \ + tt_assert_test_fmt_type(expr1,expr2,#expr1" "#op" "#expr2, \ + const char *, \ + (memcmp(_val1, _val2, len) op 0), \ + char *, "%s", \ + { size_t printlen = (len)*2+1; \ + _print = tor_malloc(printlen); \ + base16_encode(_print, printlen, _value, \ + (len)); }, \ + { tor_free(_print); } \ + ); + +#define test_memeq(expr1, expr2, len) test_mem_op((expr1), ==, (expr2), len) +#define test_memneq(expr1, expr2, len) test_mem_op((expr1), !=, (expr2), len) + +/* As test_mem_op, but decodes 'hex' before comparing. There must be a + * local char* variable called mem_op_hex_tmp for this to work. */ +#define test_mem_op_hex(expr1, op, hex) \ + STMT_BEGIN \ + size_t length = strlen(hex); \ + tor_free(mem_op_hex_tmp); \ + mem_op_hex_tmp = tor_malloc(length/2); \ + tor_assert((length&1)==0); \ + base16_decode(mem_op_hex_tmp, length/2, hex, length); \ + test_mem_op(expr1, op, mem_op_hex_tmp, length/2); \ + STMT_END + +#define test_memeq_hex(expr1, hex) test_mem_op_hex(expr1, ==, hex) + +const char *get_fname(const char *name); +crypto_pk_env_t *pk_generate(int idx); + +void legacy_test_helper(void *data); +extern const struct testcase_setup_t legacy_setup; + +#endif + diff -Nru tor-0.2.0.34/src/test/test_util.c tor-0.2.2.16-alpha/src/test/test_util.c --- tor-0.2.0.34/src/test/test_util.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/test_util.c 2010-09-12 02:54:22.000000000 +0000 @@ -0,0 +1,1167 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define CONTROL_PRIVATE +#define MEMPOOL_PRIVATE +#include "or.h" +#include "config.h" +#include "control.h" +#include "test.h" +#include "mempool.h" +#include "memarea.h" + +static void +test_util_time(void) +{ + struct timeval start, end; + struct tm a_time; + char timestr[RFC1123_TIME_LEN+1]; + time_t t_res; + int i; + + start.tv_sec = 5; + start.tv_usec = 5000; + + end.tv_sec = 5; + end.tv_usec = 5000; + + test_eq(0L, tv_udiff(&start, &end)); + + end.tv_usec = 7000; + + test_eq(2000L, tv_udiff(&start, &end)); + + end.tv_sec = 6; + + test_eq(1002000L, tv_udiff(&start, &end)); + + end.tv_usec = 0; + + test_eq(995000L, tv_udiff(&start, &end)); + + end.tv_sec = 4; + + test_eq(-1005000L, tv_udiff(&start, &end)); + + end.tv_usec = 999990; + start.tv_sec = 1; + start.tv_usec = 500; + + /* The test values here are confirmed to be correct on a platform + * with a working timegm. */ + a_time.tm_year = 2003-1900; + a_time.tm_mon = 7; + a_time.tm_mday = 30; + a_time.tm_hour = 6; + a_time.tm_min = 14; + a_time.tm_sec = 55; + test_eq((time_t) 1062224095UL, tor_timegm(&a_time)); + a_time.tm_year = 2004-1900; /* Try a leap year, after feb. */ + test_eq((time_t) 1093846495UL, tor_timegm(&a_time)); + a_time.tm_mon = 1; /* Try a leap year, in feb. */ + a_time.tm_mday = 10; + test_eq((time_t) 1076393695UL, tor_timegm(&a_time)); + + format_rfc1123_time(timestr, 0); + test_streq("Thu, 01 Jan 1970 00:00:00 GMT", timestr); + format_rfc1123_time(timestr, (time_t)1091580502UL); + test_streq("Wed, 04 Aug 2004 00:48:22 GMT", timestr); + + t_res = 0; + i = parse_rfc1123_time(timestr, &t_res); + test_eq(i,0); + test_eq(t_res, (time_t)1091580502UL); + test_eq(-1, parse_rfc1123_time("Wed, zz Aug 2004 99-99x99 GMT", &t_res)); + + tor_gettimeofday(&start); + /* now make sure time works. */ + tor_gettimeofday(&end); + /* We might've timewarped a little. */ + tt_int_op(tv_udiff(&start, &end), >=, -5000); + + done: + ; +} + +static void +test_util_config_line(void) +{ + char buf[1024]; + char *k=NULL, *v=NULL; + const char *str; + + /* Test parse_config_line_from_str */ + strlcpy(buf, "k v\n" " key value with spaces \n" "keykey val\n" + "k2\n" + "k3 \n" "\n" " \n" "#comment\n" + "k4#a\n" "k5#abc\n" "k6 val #with comment\n" + "kseven \"a quoted 'string\"\n" + "k8 \"a \\x71uoted\\n\\\"str\\\\ing\\t\\001\\01\\1\\\"\"\n" + , sizeof(buf)); + str = buf; + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "k"); + test_streq(v, "v"); + tor_free(k); tor_free(v); + test_assert(!strcmpstart(str, "key value with")); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "key"); + test_streq(v, "value with spaces"); + tor_free(k); tor_free(v); + test_assert(!strcmpstart(str, "keykey")); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "keykey"); + test_streq(v, "val"); + tor_free(k); tor_free(v); + test_assert(!strcmpstart(str, "k2\n")); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "k2"); + test_streq(v, ""); + tor_free(k); tor_free(v); + test_assert(!strcmpstart(str, "k3 \n")); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "k3"); + test_streq(v, ""); + tor_free(k); tor_free(v); + test_assert(!strcmpstart(str, "#comment")); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "k4"); + test_streq(v, ""); + tor_free(k); tor_free(v); + test_assert(!strcmpstart(str, "k5#abc")); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "k5"); + test_streq(v, ""); + tor_free(k); tor_free(v); + test_assert(!strcmpstart(str, "k6")); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "k6"); + test_streq(v, "val"); + tor_free(k); tor_free(v); + test_assert(!strcmpstart(str, "kseven")); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "kseven"); + test_streq(v, "a quoted \'string"); + tor_free(k); tor_free(v); + test_assert(!strcmpstart(str, "k8 ")); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "k8"); + test_streq(v, "a quoted\n\"str\\ing\t\x01\x01\x01\""); + tor_free(k); tor_free(v); + test_streq(str, ""); + done: + tor_free(k); + tor_free(v); +} + +/** Test basic string functionality. */ +static void +test_util_strmisc(void) +{ + char buf[1024]; + int i; + char *cp; + + /* Tests for corner cases of strl operations */ + test_eq(5, strlcpy(buf, "Hello", 0)); + strlcpy(buf, "Hello", sizeof(buf)); + test_eq(10, strlcat(buf, "Hello", 5)); + + /* Test tor_strstrip() */ + strlcpy(buf, "Testing 1 2 3", sizeof(buf)); + tor_strstrip(buf, ",!"); + test_streq(buf, "Testing 1 2 3"); + strlcpy(buf, "!Testing 1 2 3?", sizeof(buf)); + tor_strstrip(buf, "!? "); + test_streq(buf, "Testing123"); + + /* Test tor_parse_long. */ + test_eq(10L, tor_parse_long("10",10,0,100,NULL,NULL)); + test_eq(0L, tor_parse_long("10",10,50,100,NULL,NULL)); + test_eq(-50L, tor_parse_long("-50",10,-100,100,NULL,NULL)); + + /* Test tor_parse_ulong */ + test_eq(10UL, tor_parse_ulong("10",10,0,100,NULL,NULL)); + test_eq(0UL, tor_parse_ulong("10",10,50,100,NULL,NULL)); + + /* Test tor_parse_uint64. */ + test_assert(U64_LITERAL(10) == tor_parse_uint64("10 x",10,0,100, &i, &cp)); + test_assert(i == 1); + test_streq(cp, " x"); + test_assert(U64_LITERAL(12345678901) == + tor_parse_uint64("12345678901",10,0,UINT64_MAX, &i, &cp)); + test_assert(i == 1); + test_streq(cp, ""); + test_assert(U64_LITERAL(0) == + tor_parse_uint64("12345678901",10,500,INT32_MAX, &i, &cp)); + test_assert(i == 0); + + { + /* Test tor_parse_double. */ + double d = tor_parse_double("10", 0, UINT64_MAX,&i,NULL); + test_assert(i == 1); + test_assert(DBL_TO_U64(d) == 10); + d = tor_parse_double("0", 0, UINT64_MAX,&i,NULL); + test_assert(i == 1); + test_assert(DBL_TO_U64(d) == 0); + d = tor_parse_double(" ", 0, UINT64_MAX,&i,NULL); + test_assert(i == 0); + d = tor_parse_double(".0a", 0, UINT64_MAX,&i,NULL); + test_assert(i == 0); + d = tor_parse_double(".0a", 0, UINT64_MAX,&i,&cp); + test_assert(i == 1); + d = tor_parse_double("-.0", 0, UINT64_MAX,&i,NULL); + test_assert(i == 1); + } + + /* Test failing snprintf cases */ + test_eq(-1, tor_snprintf(buf, 0, "Foo")); + test_eq(-1, tor_snprintf(buf, 2, "Foo")); + + /* Test printf with uint64 */ + tor_snprintf(buf, sizeof(buf), "x!"U64_FORMAT"!x", + U64_PRINTF_ARG(U64_LITERAL(12345678901))); + test_streq(buf, "x!12345678901!x"); + + /* Test for strcmpstart and strcmpend. */ + test_assert(strcmpstart("abcdef", "abcdef")==0); + test_assert(strcmpstart("abcdef", "abc")==0); + test_assert(strcmpstart("abcdef", "abd")<0); + test_assert(strcmpstart("abcdef", "abb")>0); + test_assert(strcmpstart("ab", "abb")<0); + + test_assert(strcmpend("abcdef", "abcdef")==0); + test_assert(strcmpend("abcdef", "def")==0); + test_assert(strcmpend("abcdef", "deg")<0); + test_assert(strcmpend("abcdef", "dee")>0); + test_assert(strcmpend("ab", "abb")<0); + + test_assert(strcasecmpend("AbcDEF", "abcdef")==0); + test_assert(strcasecmpend("abcdef", "dEF")==0); + test_assert(strcasecmpend("abcDEf", "deg")<0); + test_assert(strcasecmpend("abcdef", "DEE")>0); + test_assert(strcasecmpend("ab", "abB")<0); + + /* Test mem_is_zero */ + memset(buf,0,128); + buf[128] = 'x'; + test_assert(tor_digest_is_zero(buf)); + test_assert(tor_mem_is_zero(buf, 10)); + test_assert(tor_mem_is_zero(buf, 20)); + test_assert(tor_mem_is_zero(buf, 128)); + test_assert(!tor_mem_is_zero(buf, 129)); + buf[60] = (char)255; + test_assert(!tor_mem_is_zero(buf, 128)); + buf[0] = (char)1; + test_assert(!tor_mem_is_zero(buf, 10)); + + /* Test 'escaped' */ + test_streq("\"\"", escaped("")); + test_streq("\"abcd\"", escaped("abcd")); + test_streq("\"\\\\\\n\\r\\t\\\"\\'\"", escaped("\\\n\r\t\"\'")); + test_streq("\"z\\001abc\\277d\"", escaped("z\001abc\277d")); + test_assert(NULL == escaped(NULL)); + + /* Test strndup and memdup */ + { + const char *s = "abcdefghijklmnopqrstuvwxyz"; + cp = tor_strndup(s, 30); + test_streq(cp, s); /* same string, */ + test_neq(cp, s); /* but different pointers. */ + tor_free(cp); + + cp = tor_strndup(s, 5); + test_streq(cp, "abcde"); + tor_free(cp); + + s = "a\0b\0c\0d\0e\0"; + cp = tor_memdup(s,10); + test_memeq(cp, s, 10); /* same ram, */ + test_neq(cp, s); /* but different pointers. */ + tor_free(cp); + } + + /* Test str-foo functions */ + cp = tor_strdup("abcdef"); + test_assert(tor_strisnonupper(cp)); + cp[3] = 'D'; + test_assert(!tor_strisnonupper(cp)); + tor_strupper(cp); + test_streq(cp, "ABCDEF"); + test_assert(tor_strisprint(cp)); + cp[3] = 3; + test_assert(!tor_strisprint(cp)); + tor_free(cp); + + /* Test eat_whitespace. */ + { + const char *s = " \n a"; + test_eq_ptr(eat_whitespace(s), s+4); + s = "abcd"; + test_eq_ptr(eat_whitespace(s), s); + s = "#xyz\nab"; + test_eq_ptr(eat_whitespace(s), s+5); + } + + /* Test memmem and memstr */ + { + const char *haystack = "abcde"; + tor_assert(!tor_memmem(haystack, 5, "ef", 2)); + test_eq_ptr(tor_memmem(haystack, 5, "cd", 2), haystack + 2); + test_eq_ptr(tor_memmem(haystack, 5, "cde", 3), haystack + 2); + haystack = "ababcad"; + test_eq_ptr(tor_memmem(haystack, 7, "abc", 3), haystack + 2); + test_eq_ptr(tor_memstr(haystack, 7, "abc"), haystack + 2); + test_assert(!tor_memstr(haystack, 7, "fe")); + test_assert(!tor_memstr(haystack, 7, "longerthantheoriginal")); + } + + /* Test wrap_string */ + { + smartlist_t *sl = smartlist_create(); + wrap_string(sl, "This is a test of string wrapping functionality: woot.", + 10, "", ""); + cp = smartlist_join_strings(sl, "", 0, NULL); + test_streq(cp, + "This is a\ntest of\nstring\nwrapping\nfunctional\nity: woot.\n"); + tor_free(cp); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + wrap_string(sl, "This is a test of string wrapping functionality: woot.", + 16, "### ", "# "); + cp = smartlist_join_strings(sl, "", 0, NULL); + test_streq(cp, + "### This is a\n# test of string\n# wrapping\n# functionality:\n" + "# woot.\n"); + + tor_free(cp); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_free(sl); + } + done: + ; +} + +static void +test_util_pow2(void) +{ + /* Test tor_log2(). */ + test_eq(tor_log2(64), 6); + test_eq(tor_log2(65), 6); + test_eq(tor_log2(63), 5); + test_eq(tor_log2(1), 0); + test_eq(tor_log2(2), 1); + test_eq(tor_log2(3), 1); + test_eq(tor_log2(4), 2); + test_eq(tor_log2(5), 2); + test_eq(tor_log2(U64_LITERAL(40000000000000000)), 55); + test_eq(tor_log2(UINT64_MAX), 63); + + /* Test round_to_power_of_2 */ + test_eq(round_to_power_of_2(120), 128); + test_eq(round_to_power_of_2(128), 128); + test_eq(round_to_power_of_2(130), 128); + test_eq(round_to_power_of_2(U64_LITERAL(40000000000000000)), + U64_LITERAL(1)<<55); + test_eq(round_to_power_of_2(0), 2); + + done: + ; +} + +/** mutex for thread test to stop the threads hitting data at the same time. */ +static tor_mutex_t *_thread_test_mutex = NULL; +/** mutexes for the thread test to make sure that the threads have to + * interleave somewhat. */ +static tor_mutex_t *_thread_test_start1 = NULL, + *_thread_test_start2 = NULL; +/** Shared strmap for the thread test. */ +static strmap_t *_thread_test_strmap = NULL; +/** The name of thread1 for the thread test */ +static char *_thread1_name = NULL; +/** The name of thread2 for the thread test */ +static char *_thread2_name = NULL; + +static void _thread_test_func(void* _s) ATTR_NORETURN; + +/** How many iterations have the threads in the unit test run? */ +static int t1_count = 0, t2_count = 0; + +/** Helper function for threading unit tests: This function runs in a + * subthread. It grabs its own mutex (start1 or start2) to make sure that it + * should start, then it repeatedly alters _test_thread_strmap protected by + * _thread_test_mutex. */ +static void +_thread_test_func(void* _s) +{ + char *s = _s; + int i, *count; + tor_mutex_t *m; + char buf[64]; + char **cp; + if (!strcmp(s, "thread 1")) { + m = _thread_test_start1; + cp = &_thread1_name; + count = &t1_count; + } else { + m = _thread_test_start2; + cp = &_thread2_name; + count = &t2_count; + } + + tor_snprintf(buf, sizeof(buf), "%lu", tor_get_thread_id()); + *cp = tor_strdup(buf); + + tor_mutex_acquire(m); + + for (i=0; i<10000; ++i) { + tor_mutex_acquire(_thread_test_mutex); + strmap_set(_thread_test_strmap, "last to run", *cp); + ++*count; + tor_mutex_release(_thread_test_mutex); + } + tor_mutex_acquire(_thread_test_mutex); + strmap_set(_thread_test_strmap, s, *cp); + tor_mutex_release(_thread_test_mutex); + + tor_mutex_release(m); + + spawn_exit(); +} + +/** Run unit tests for threading logic. */ +static void +test_util_threads(void) +{ + char *s1 = NULL, *s2 = NULL; + int done = 0, timedout = 0; + time_t started; +#ifndef MS_WINDOWS + struct timeval tv; + tv.tv_sec=0; + tv.tv_usec=10; +#endif +#ifndef TOR_IS_MULTITHREADED + /* Skip this test if we aren't threading. We should be threading most + * everywhere by now. */ + if (1) + return; +#endif + _thread_test_mutex = tor_mutex_new(); + _thread_test_start1 = tor_mutex_new(); + _thread_test_start2 = tor_mutex_new(); + _thread_test_strmap = strmap_new(); + s1 = tor_strdup("thread 1"); + s2 = tor_strdup("thread 2"); + tor_mutex_acquire(_thread_test_start1); + tor_mutex_acquire(_thread_test_start2); + spawn_func(_thread_test_func, s1); + spawn_func(_thread_test_func, s2); + tor_mutex_release(_thread_test_start2); + tor_mutex_release(_thread_test_start1); + started = time(NULL); + while (!done) { + tor_mutex_acquire(_thread_test_mutex); + strmap_assert_ok(_thread_test_strmap); + if (strmap_get(_thread_test_strmap, "thread 1") && + strmap_get(_thread_test_strmap, "thread 2")) { + done = 1; + } else if (time(NULL) > started + 25) { + timedout = done = 1; + } + tor_mutex_release(_thread_test_mutex); +#ifndef MS_WINDOWS + /* Prevent the main thread from starving the worker threads. */ + select(0, NULL, NULL, NULL, &tv); +#endif + } + tor_mutex_acquire(_thread_test_start1); + tor_mutex_release(_thread_test_start1); + tor_mutex_acquire(_thread_test_start2); + tor_mutex_release(_thread_test_start2); + + tor_mutex_free(_thread_test_mutex); + + if (timedout) { + printf("\nTimed out: %d %d", t1_count, t2_count); + test_assert(strmap_get(_thread_test_strmap, "thread 1")); + test_assert(strmap_get(_thread_test_strmap, "thread 2")); + test_assert(!timedout); + } + + /* different thread IDs. */ + test_assert(strcmp(strmap_get(_thread_test_strmap, "thread 1"), + strmap_get(_thread_test_strmap, "thread 2"))); + test_assert(!strcmp(strmap_get(_thread_test_strmap, "thread 1"), + strmap_get(_thread_test_strmap, "last to run")) || + !strcmp(strmap_get(_thread_test_strmap, "thread 2"), + strmap_get(_thread_test_strmap, "last to run"))); + + done: + tor_free(s1); + tor_free(s2); + tor_free(_thread1_name); + tor_free(_thread2_name); + if (_thread_test_strmap) + strmap_free(_thread_test_strmap, NULL); + if (_thread_test_start1) + tor_mutex_free(_thread_test_start1); + if (_thread_test_start2) + tor_mutex_free(_thread_test_start2); +} + +/** Run unit tests for compression functions */ +static void +test_util_gzip(void) +{ + char *buf1=NULL, *buf2=NULL, *buf3=NULL, *cp1, *cp2; + const char *ccp2; + size_t len1, len2; + tor_zlib_state_t *state = NULL; + + buf1 = tor_strdup("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ"); + test_assert(detect_compression_method(buf1, strlen(buf1)) == UNKNOWN_METHOD); + if (is_gzip_supported()) { + test_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, + GZIP_METHOD)); + test_assert(buf2); + test_assert(!memcmp(buf2, "\037\213", 2)); /* Gzip magic. */ + test_assert(detect_compression_method(buf2, len1) == GZIP_METHOD); + + test_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1, + GZIP_METHOD, 1, LOG_INFO)); + test_assert(buf3); + test_streq(buf1,buf3); + + tor_free(buf2); + tor_free(buf3); + } + + test_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, + ZLIB_METHOD)); + test_assert(buf2); + test_assert(!memcmp(buf2, "\x78\xDA", 2)); /* deflate magic. */ + test_assert(detect_compression_method(buf2, len1) == ZLIB_METHOD); + + test_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1, + ZLIB_METHOD, 1, LOG_INFO)); + test_assert(buf3); + test_streq(buf1,buf3); + + /* Check whether we can uncompress concatenated, compressed strings. */ + tor_free(buf3); + buf2 = tor_realloc(buf2, len1*2); + memcpy(buf2+len1, buf2, len1); + test_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1*2, + ZLIB_METHOD, 1, LOG_INFO)); + test_eq(len2, (strlen(buf1)+1)*2); + test_memeq(buf3, + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0", + (strlen(buf1)+1)*2); + + 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."); + test_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, + ZLIB_METHOD)); + tor_assert(len1>16); + /* when we allow an incomplete string, we should succeed.*/ + tor_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1-16, + ZLIB_METHOD, 0, LOG_INFO)); + buf3[len2]='\0'; + tor_assert(len2 > 5); + tor_assert(!strcmpstart(buf1, buf3)); + + /* when we demand a complete string, this must fail. */ + tor_free(buf3); + tor_assert(tor_gzip_uncompress(&buf3, &len2, buf2, len1-16, + ZLIB_METHOD, 1, LOG_INFO)); + tor_assert(!buf3); + + /* Now, try streaming compression. */ + tor_free(buf1); + tor_free(buf2); + tor_free(buf3); + state = tor_zlib_new(1, ZLIB_METHOD); + tor_assert(state); + cp1 = buf1 = tor_malloc(1024); + len1 = 1024; + ccp2 = "ABCDEFGHIJABCDEFGHIJ"; + len2 = 21; + test_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 0) + == TOR_ZLIB_OK); + test_eq(len2, 0); /* Make sure we compressed it all. */ + test_assert(cp1 > buf1); + + len2 = 0; + cp2 = cp1; + test_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 1) + == TOR_ZLIB_DONE); + test_eq(len2, 0); + test_assert(cp1 > cp2); /* Make sure we really added something. */ + + tor_assert(!tor_gzip_uncompress(&buf3, &len2, buf1, 1024-len1, + ZLIB_METHOD, 1, LOG_WARN)); + test_streq(buf3, "ABCDEFGHIJABCDEFGHIJ"); /*Make sure it compressed right.*/ + + done: + if (state) + tor_zlib_free(state); + tor_free(buf2); + tor_free(buf3); + tor_free(buf1); +} + +/** Run unit tests for mmap() wrapper functionality. */ +static void +test_util_mmap(void) +{ + char *fname1 = tor_strdup(get_fname("mapped_1")); + char *fname2 = tor_strdup(get_fname("mapped_2")); + char *fname3 = tor_strdup(get_fname("mapped_3")); + const size_t buflen = 17000; + char *buf = tor_malloc(17000); + tor_mmap_t *mapping = NULL; + + crypto_rand(buf, buflen); + + mapping = tor_mmap_file(fname1); + test_assert(! mapping); + + write_str_to_file(fname1, "Short file.", 1); + write_bytes_to_file(fname2, buf, buflen, 1); + write_bytes_to_file(fname3, buf, 16384, 1); + + mapping = tor_mmap_file(fname1); + test_assert(mapping); + test_eq(mapping->size, strlen("Short file.")); + test_streq(mapping->data, "Short file."); +#ifdef MS_WINDOWS + tor_munmap_file(mapping); + mapping = NULL; + test_assert(unlink(fname1) == 0); +#else + /* make sure we can unlink. */ + test_assert(unlink(fname1) == 0); + test_streq(mapping->data, "Short file."); + tor_munmap_file(mapping); + mapping = NULL; +#endif + + /* Now a zero-length file. */ + write_str_to_file(fname1, "", 1); + mapping = tor_mmap_file(fname1); + test_eq(mapping, NULL); + test_eq(ERANGE, errno); + unlink(fname1); + + /* Make sure that we fail to map a no-longer-existent file. */ + mapping = tor_mmap_file(fname1); + test_assert(mapping == NULL); + + /* Now try a big file that stretches across a few pages and isn't aligned */ + mapping = tor_mmap_file(fname2); + test_assert(mapping); + test_eq(mapping->size, buflen); + test_memeq(mapping->data, buf, buflen); + tor_munmap_file(mapping); + mapping = NULL; + + /* Now try a big aligned file. */ + mapping = tor_mmap_file(fname3); + test_assert(mapping); + test_eq(mapping->size, 16384); + test_memeq(mapping->data, buf, 16384); + tor_munmap_file(mapping); + mapping = NULL; + + done: + unlink(fname1); + unlink(fname2); + unlink(fname3); + + tor_free(fname1); + tor_free(fname2); + tor_free(fname3); + tor_free(buf); + + if (mapping) + tor_munmap_file(mapping); +} + +/** Run unit tests for escaping/unescaping data for use by controllers. */ +static void +test_util_control_formats(void) +{ + char *out = NULL; + const char *inp = + "..This is a test\r\nof the emergency \nbroadcast\r\n..system.\r\nZ.\r\n"; + size_t sz; + + sz = read_escaped_data(inp, strlen(inp), &out); + test_streq(out, + ".This is a test\nof the emergency \nbroadcast\n.system.\nZ.\n"); + test_eq(sz, strlen(out)); + + done: + tor_free(out); +} + +static void +test_util_sscanf(void) +{ + unsigned u1, u2, u3; + char s1[10], s2[10], s3[10], ch; + int r; + + r = tor_sscanf("hello world", "hello world"); /* String match: success */ + test_eq(r, 0); + r = tor_sscanf("hello world 3", "hello worlb %u", &u1); /* String fail */ + test_eq(r, 0); + r = tor_sscanf("12345", "%u", &u1); /* Simple number */ + test_eq(r, 1); + test_eq(u1, 12345u); + r = tor_sscanf("", "%u", &u1); /* absent number */ + test_eq(r, 0); + r = tor_sscanf("A", "%u", &u1); /* bogus number */ + test_eq(r, 0); + r = tor_sscanf("4294967295", "%u", &u1); /* UINT32_MAX should work. */ + test_eq(r, 1); + test_eq(u1, 4294967295u); + r = tor_sscanf("4294967296", "%u", &u1); /* Always say -1 at 32 bits. */ + test_eq(r, 0); + r = tor_sscanf("123456", "%2u%u", &u1, &u2); /* Width */ + test_eq(r, 2); + test_eq(u1, 12u); + test_eq(u2, 3456u); + r = tor_sscanf("!12:3:456", "!%2u:%2u:%3u", &u1, &u2, &u3); /* separators */ + test_eq(r, 3); + test_eq(u1, 12u); + test_eq(u2, 3u); + test_eq(u3, 456u); + r = tor_sscanf("12:3:045", "%2u:%2u:%3u", &u1, &u2, &u3); /* 0s */ + test_eq(r, 3); + test_eq(u1, 12u); + test_eq(u2, 3u); + test_eq(u3, 45u); + /* %u does not match space.*/ + r = tor_sscanf("12:3: 45", "%2u:%2u:%3u", &u1, &u2, &u3); + test_eq(r, 2); + /* %u does not match negative numbers. */ + r = tor_sscanf("12:3:-4", "%2u:%2u:%3u", &u1, &u2, &u3); + test_eq(r, 2); + /* Arbitrary amounts of 0-padding are okay */ + r = tor_sscanf("12:03:000000000000000099", "%2u:%2u:%u", &u1, &u2, &u3); + test_eq(r, 3); + test_eq(u1, 12u); + test_eq(u2, 3u); + test_eq(u3, 99u); + + r = tor_sscanf("99% fresh", "%3u%% fresh", &u1); /* percents are scannable.*/ + test_eq(r, 1); + test_eq(u1, 99); + + r = tor_sscanf("hello", "%s", s1); /* %s needs a number. */ + test_eq(r, -1); + + r = tor_sscanf("hello", "%3s%7s", s1, s2); /* %s matches characters. */ + test_eq(r, 2); + test_streq(s1, "hel"); + test_streq(s2, "lo"); + r = tor_sscanf("WD40", "%2s%u", s3, &u1); /* %s%u */ + test_eq(r, 2); + test_streq(s3, "WD"); + test_eq(u1, 40); + r = tor_sscanf("76trombones", "%6u%9s", &u1, s1); /* %u%s */ + test_eq(r, 2); + test_eq(u1, 76); + test_streq(s1, "trombones"); + r = tor_sscanf("hello world", "%9s %9s", s1, s2); /* %s doesn't eat space. */ + test_eq(r, 2); + test_streq(s1, "hello"); + test_streq(s2, "world"); + r = tor_sscanf("hi", "%9s%9s%3s", s1, s2, s3); /* %s can be empty. */ + test_eq(r, 3); + test_streq(s1, "hi"); + test_streq(s2, ""); + test_streq(s3, ""); + + r = tor_sscanf("1.2.3", "%u.%u.%u%c", &u1, &u2, &u3, &ch); + test_eq(r, 3); + r = tor_sscanf("1.2.3 foobar", "%u.%u.%u%c", &u1, &u2, &u3, &ch); + test_eq(r, 4); + + done: + ; +} + +/** Run unittests for memory pool allocator */ +static void +test_util_mempool(void) +{ + mp_pool_t *pool = NULL; + smartlist_t *allocated = NULL; + int i; + + pool = mp_pool_new(1, 100); + test_assert(pool); + test_assert(pool->new_chunk_capacity >= 100); + test_assert(pool->item_alloc_size >= sizeof(void*)+1); + mp_pool_destroy(pool); + pool = NULL; + + pool = mp_pool_new(241, 2500); + test_assert(pool); + test_assert(pool->new_chunk_capacity >= 10); + test_assert(pool->item_alloc_size >= sizeof(void*)+241); + test_eq(pool->item_alloc_size & 0x03, 0); + test_assert(pool->new_chunk_capacity < 60); + + allocated = smartlist_create(); + for (i = 0; i < 20000; ++i) { + if (smartlist_len(allocated) < 20 || crypto_rand_int(2)) { + void *m = mp_pool_get(pool); + memset(m, 0x09, 241); + smartlist_add(allocated, m); + //printf("%d: %p\n", i, m); + //mp_pool_assert_ok(pool); + } else { + int idx = crypto_rand_int(smartlist_len(allocated)); + void *m = smartlist_get(allocated, idx); + //printf("%d: free %p\n", i, m); + smartlist_del(allocated, idx); + mp_pool_release(m); + //mp_pool_assert_ok(pool); + } + if (crypto_rand_int(777)==0) + mp_pool_clean(pool, 1, 1); + + if (i % 777) + mp_pool_assert_ok(pool); + } + + done: + if (allocated) { + SMARTLIST_FOREACH(allocated, void *, m, mp_pool_release(m)); + mp_pool_assert_ok(pool); + mp_pool_clean(pool, 0, 0); + mp_pool_assert_ok(pool); + smartlist_free(allocated); + } + + if (pool) + mp_pool_destroy(pool); +} + +/** Run unittests for memory area allocator */ +static void +test_util_memarea(void) +{ + memarea_t *area = memarea_new(); + char *p1, *p2, *p3, *p1_orig; + void *malloced_ptr = NULL; + int i; + + test_assert(area); + + p1_orig = p1 = memarea_alloc(area,64); + p2 = memarea_alloc_zero(area,52); + p3 = memarea_alloc(area,11); + + test_assert(memarea_owns_ptr(area, p1)); + test_assert(memarea_owns_ptr(area, p2)); + test_assert(memarea_owns_ptr(area, p3)); + /* Make sure we left enough space. */ + test_assert(p1+64 <= p2); + test_assert(p2+52 <= p3); + /* Make sure we aligned. */ + test_eq(((uintptr_t)p1) % sizeof(void*), 0); + test_eq(((uintptr_t)p2) % sizeof(void*), 0); + test_eq(((uintptr_t)p3) % sizeof(void*), 0); + test_assert(!memarea_owns_ptr(area, p3+8192)); + test_assert(!memarea_owns_ptr(area, p3+30)); + test_assert(tor_mem_is_zero(p2, 52)); + /* Make sure we don't overalign. */ + p1 = memarea_alloc(area, 1); + p2 = memarea_alloc(area, 1); + test_eq(p1+sizeof(void*), p2); + { + malloced_ptr = tor_malloc(64); + test_assert(!memarea_owns_ptr(area, malloced_ptr)); + tor_free(malloced_ptr); + } + + /* memarea_memdup */ + { + malloced_ptr = tor_malloc(64); + crypto_rand((char*)malloced_ptr, 64); + p1 = memarea_memdup(area, malloced_ptr, 64); + test_assert(p1 != malloced_ptr); + test_memeq(p1, malloced_ptr, 64); + tor_free(malloced_ptr); + } + + /* memarea_strdup. */ + p1 = memarea_strdup(area,""); + p2 = memarea_strdup(area, "abcd"); + test_assert(p1); + test_assert(p2); + test_streq(p1, ""); + test_streq(p2, "abcd"); + + /* memarea_strndup. */ + { + const char *s = "Ad ogni porta batte la morte e grida: il nome!"; + /* (From Turandot, act 3.) */ + size_t len = strlen(s); + p1 = memarea_strndup(area, s, 1000); + p2 = memarea_strndup(area, s, 10); + test_streq(p1, s); + test_assert(p2 >= p1 + len + 1); + test_memeq(s, p2, 10); + test_eq(p2[10], '\0'); + p3 = memarea_strndup(area, s, len); + test_streq(p3, s); + p3 = memarea_strndup(area, s, len-1); + test_memeq(s, p3, len-1); + test_eq(p3[len-1], '\0'); + } + + memarea_clear(area); + p1 = memarea_alloc(area, 1); + test_eq(p1, p1_orig); + memarea_clear(area); + + /* Check for running over an area's size. */ + for (i = 0; i < 512; ++i) { + p1 = memarea_alloc(area, crypto_rand_int(5)+1); + test_assert(memarea_owns_ptr(area, p1)); + } + memarea_assert_ok(area); + /* Make sure we can allocate a too-big object. */ + p1 = memarea_alloc_zero(area, 9000); + p2 = memarea_alloc_zero(area, 16); + test_assert(memarea_owns_ptr(area, p1)); + test_assert(memarea_owns_ptr(area, p2)); + + done: + memarea_drop_all(area); + tor_free(malloced_ptr); +} + +/** Run unit tests for utility functions to get file names relative to + * the data directory. */ +static void +test_util_datadir(void) +{ + char buf[1024]; + char *f = NULL; + char *temp_dir = NULL; + + temp_dir = get_datadir_fname(NULL); + f = get_datadir_fname("state"); + tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"state", temp_dir); + test_streq(f, buf); + tor_free(f); + f = get_datadir_fname2("cache", "thingy"); + tor_snprintf(buf, sizeof(buf), + "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy", temp_dir); + test_streq(f, buf); + tor_free(f); + f = get_datadir_fname2_suffix("cache", "thingy", ".foo"); + tor_snprintf(buf, sizeof(buf), + "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy.foo", temp_dir); + test_streq(f, buf); + tor_free(f); + f = get_datadir_fname_suffix("cache", ".foo"); + tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"cache.foo", + temp_dir); + test_streq(f, buf); + + done: + tor_free(f); + tor_free(temp_dir); +} + +static void +test_util_strtok(void) +{ + char buf[128]; + char buf2[128]; + char *cp1, *cp2; + strlcpy(buf, "Graved on the dark in gestures of descent", sizeof(buf)); + strlcpy(buf2, "they.seemed;their!own;most.perfect;monument", sizeof(buf2)); + /* -- "Year's End", Richard Wilbur */ + + test_streq("Graved", tor_strtok_r_impl(buf, " ", &cp1)); + test_streq("they", tor_strtok_r_impl(buf2, ".!..;!", &cp2)); +#define S1() tor_strtok_r_impl(NULL, " ", &cp1) +#define S2() tor_strtok_r_impl(NULL, ".!..;!", &cp2) + test_streq("on", S1()); + test_streq("the", S1()); + test_streq("dark", S1()); + test_streq("seemed", S2()); + test_streq("their", S2()); + test_streq("own", S2()); + test_streq("in", S1()); + test_streq("gestures", S1()); + test_streq("of", S1()); + test_streq("most", S2()); + test_streq("perfect", S2()); + test_streq("descent", S1()); + test_streq("monument", S2()); + test_assert(NULL == S1()); + test_assert(NULL == S2()); + done: + ; +} + +static void +test_util_find_str_at_start_of_line(void *ptr) +{ + const char *long_string = + "hello world. hello world. hello hello. howdy.\n" + "hello hello world\n"; + + (void)ptr; + + /* not-found case. */ + tt_assert(! find_str_at_start_of_line(long_string, "fred")); + + /* not-found case where haystack doesn't end with \n */ + tt_assert(! find_str_at_start_of_line("foobar\nbaz", "fred")); + + /* start-of-string case */ + tt_assert(long_string == + find_str_at_start_of_line(long_string, "hello world.")); + + /* start-of-line case */ + tt_assert(strchr(long_string,'\n')+1 == + find_str_at_start_of_line(long_string, "hello hello")); + done: + ; +} + +static void +test_util_asprintf(void *ptr) +{ +#define LOREMIPSUM \ + "Lorem ipsum dolor sit amet, consectetur adipisicing elit" + char *cp=NULL, *cp2=NULL; + int r; + (void)ptr; + + /* empty string. */ + r = tor_asprintf(&cp, "%s", ""); + tt_assert(cp); + tt_int_op(r, ==, strlen(cp)); + tt_str_op(cp, ==, ""); + + /* Short string with some printing in it. */ + r = tor_asprintf(&cp2, "First=%d, Second=%d", 101, 202); + tt_assert(cp2); + tt_int_op(r, ==, strlen(cp2)); + tt_str_op(cp2, ==, "First=101, Second=202"); + tt_assert(cp != cp2); + tor_free(cp); + tor_free(cp2); + + /* Glass-box test: a string exactly 128 characters long. */ + r = tor_asprintf(&cp, "Lorem1: %sLorem2: %s", LOREMIPSUM, LOREMIPSUM); + tt_assert(cp); + tt_int_op(r, ==, 128); + tt_assert(cp[128] == '\0'); + tt_str_op(cp, ==, + "Lorem1: "LOREMIPSUM"Lorem2: "LOREMIPSUM); + tor_free(cp); + + /* String longer than 128 characters */ + r = tor_asprintf(&cp, "1: %s 2: %s 3: %s", + LOREMIPSUM, LOREMIPSUM, LOREMIPSUM); + tt_assert(cp); + tt_int_op(r, ==, strlen(cp)); + tt_str_op(cp, ==, "1: "LOREMIPSUM" 2: "LOREMIPSUM" 3: "LOREMIPSUM); + + done: + tor_free(cp); + tor_free(cp2); +} + +static void +test_util_listdir(void *ptr) +{ + smartlist_t *dir_contents = NULL; + char *fname1=NULL, *fname2=NULL, *dirname=NULL; + (void)ptr; + + fname1 = tor_strdup(get_fname("hopscotch")); + fname2 = tor_strdup(get_fname("mumblety-peg")); + dirname = tor_strdup(get_fname(NULL)); + + tt_int_op(write_str_to_file(fname1, "X\n", 0), ==, 0); + tt_int_op(write_str_to_file(fname2, "Y\n", 0), ==, 0); + + dir_contents = tor_listdir(dirname); + tt_assert(dir_contents); + /* make sure that each filename is listed. */ + tt_assert(smartlist_string_isin_case(dir_contents, "hopscotch")); + tt_assert(smartlist_string_isin_case(dir_contents, "mumblety-peg")); + + tt_assert(!smartlist_string_isin(dir_contents, ".")); + tt_assert(!smartlist_string_isin(dir_contents, "..")); + + done: + tor_free(fname1); + tor_free(fname2); + tor_free(dirname); + if (dir_contents) { + SMARTLIST_FOREACH(dir_contents, char *, cp, tor_free(cp)); + smartlist_free(dir_contents); + } +} + +#define UTIL_LEGACY(name) \ + { #name, legacy_test_helper, 0, &legacy_setup, test_util_ ## name } + +#define UTIL_TEST(name, flags) \ + { #name, test_util_ ## name, flags, NULL, NULL } + +struct testcase_t util_tests[] = { + UTIL_LEGACY(time), + UTIL_LEGACY(config_line), + UTIL_LEGACY(strmisc), + UTIL_LEGACY(pow2), + UTIL_LEGACY(gzip), + UTIL_LEGACY(datadir), + UTIL_LEGACY(mempool), + UTIL_LEGACY(memarea), + UTIL_LEGACY(control_formats), + UTIL_LEGACY(mmap), + UTIL_LEGACY(threads), + UTIL_LEGACY(sscanf), + UTIL_LEGACY(strtok), + UTIL_TEST(find_str_at_start_of_line, 0), + UTIL_TEST(asprintf, 0), + UTIL_TEST(listdir, 0), + END_OF_TESTCASES +}; + diff -Nru tor-0.2.0.34/src/test/tinytest.c tor-0.2.2.16-alpha/src/test/tinytest.c --- tor-0.2.0.34/src/test/tinytest.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/tinytest.c 2010-09-12 02:54:22.000000000 +0000 @@ -0,0 +1,380 @@ +/* tinytest.c -- Copyright 2009-2010 Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#ifdef WIN32 +#include +#else +#include +#include +#include +#endif + +#ifndef __GNUC__ +#define __attribute__(x) +#endif + +#ifdef TINYTEST_LOCAL +#include "tinytest_local.h" +#endif +#include "tinytest.h" +#include "tinytest_macros.h" + +#define LONGEST_TEST_NAME 16384 + +static int in_tinytest_main = 0; /**< true if we're in tinytest_main().*/ +static int n_ok = 0; /**< Number of tests that have passed */ +static int n_bad = 0; /**< Number of tests that have failed. */ +static int n_skipped = 0; /**< Number of tests that have been skipped. */ + +static int opt_forked = 0; /**< True iff we're called from inside a win32 fork*/ +static int opt_nofork = 0; /**< Suppress calls to fork() for debugging. */ +static int opt_verbosity = 1; /**< -==quiet,0==terse,1==normal,2==verbose */ +const char *verbosity_flag = ""; + +enum outcome { SKIP=2, OK=1, FAIL=0 }; +static enum outcome cur_test_outcome = 0; +const char *cur_test_prefix = NULL; /**< prefix of the current test group */ +/** Name of the current test, if we haven't logged is yet. Used for --quiet */ +const char *cur_test_name = NULL; + +#ifdef WIN32 +/** Pointer to argv[0] for win32. */ +static const char *commandname = NULL; +#endif + +static void usage(struct testgroup_t *groups, int list_groups) + __attribute__((noreturn)); + +static enum outcome +_testcase_run_bare(const struct testcase_t *testcase) +{ + void *env = NULL; + int outcome; + if (testcase->setup) { + env = testcase->setup->setup_fn(testcase); + if (!env) + return FAIL; + else if (env == (void*)TT_SKIP) + return SKIP; + } + + cur_test_outcome = OK; + testcase->fn(env); + outcome = cur_test_outcome; + + if (testcase->setup) { + if (testcase->setup->cleanup_fn(testcase, env) == 0) + outcome = FAIL; + } + + return outcome; +} + +#define MAGIC_EXITCODE 42 + +static enum outcome +_testcase_run_forked(const struct testgroup_t *group, + const struct testcase_t *testcase) +{ +#ifdef WIN32 + /* Fork? On Win32? How primitive! We'll do what the smart kids do: + we'll invoke our own exe (whose name we recall from the command + line) with a command line that tells it to run just the test we + want, and this time without forking. + + (No, threads aren't an option. The whole point of forking is to + share no state between tests.) + */ + int ok; + char buffer[LONGEST_TEST_NAME+256]; + STARTUPINFOA si; + PROCESS_INFORMATION info; + DWORD exitcode; + + if (!in_tinytest_main) { + printf("\nERROR. On Windows, _testcase_run_forked must be" + " called from within tinytest_main.\n"); + abort(); + } + if (opt_verbosity>0) + printf("[forking] "); + + snprintf(buffer, sizeof(buffer), "%s --RUNNING-FORKED %s %s%s", + commandname, verbosity_flag, group->prefix, testcase->name); + + memset(&si, 0, sizeof(si)); + memset(&info, 0, sizeof(info)); + si.cb = sizeof(si); + + ok = CreateProcessA(commandname, buffer, NULL, NULL, 0, + 0, NULL, NULL, &si, &info); + if (!ok) { + printf("CreateProcess failed!\n"); + return 0; + } + WaitForSingleObject(info.hProcess, INFINITE); + GetExitCodeProcess(info.hProcess, &exitcode); + CloseHandle(info.hProcess); + CloseHandle(info.hThread); + if (exitcode == 0) + return OK; + else if (exitcode == MAGIC_EXITCODE) + return SKIP; + else + return FAIL; +#else + int outcome_pipe[2]; + pid_t pid; + (void)group; + + if (pipe(outcome_pipe)) + perror("opening pipe"); + + if (opt_verbosity>0) + printf("[forking] "); + pid = fork(); + if (!pid) { + /* child. */ + int test_r, write_r; + char b[1]; + close(outcome_pipe[0]); + test_r = _testcase_run_bare(testcase); + assert(0<=(int)test_r && (int)test_r<=2); + b[0] = "NYS"[test_r]; + write_r = (int)write(outcome_pipe[1], b, 1); + if (write_r != 1) { + perror("write outcome to pipe"); + exit(1); + } + exit(0); + } else { + /* parent */ + int status, r; + char b[1]; + /* Close this now, so that if the other side closes it, + * our read fails. */ + close(outcome_pipe[1]); + r = (int)read(outcome_pipe[0], b, 1); + if (r == 0) { + printf("[Lost connection!] "); + return 0; + } else if (r != 1) { + perror("read outcome from pipe"); + } + waitpid(pid, &status, 0); + close(outcome_pipe[0]); + return b[0]=='Y' ? OK : (b[0]=='S' ? SKIP : FAIL); + } +#endif +} + +int +testcase_run_one(const struct testgroup_t *group, + const struct testcase_t *testcase) +{ + enum outcome outcome; + + if (testcase->flags & TT_SKIP) { + if (opt_verbosity>0) + printf("%s%s: SKIPPED\n", + group->prefix, testcase->name); + ++n_skipped; + return SKIP; + } + + if (opt_verbosity>0 && !opt_forked) { + printf("%s%s: ", group->prefix, testcase->name); + } else { + if (opt_verbosity==0) printf("."); + cur_test_prefix = group->prefix; + cur_test_name = testcase->name; + } + + if ((testcase->flags & TT_FORK) && !(opt_forked||opt_nofork)) { + outcome = _testcase_run_forked(group, testcase); + } else { + outcome = _testcase_run_bare(testcase); + } + + if (outcome == OK) { + ++n_ok; + if (opt_verbosity>0 && !opt_forked) + puts(opt_verbosity==1?"OK":""); + } else if (outcome == SKIP) { + ++n_skipped; + if (opt_verbosity>0 && !opt_forked) + puts("SKIPPED"); + } else { + ++n_bad; + if (!opt_forked) + printf("\n [%s FAILED]\n", testcase->name); + } + + if (opt_forked) { + exit(outcome==OK ? 0 : (outcome==SKIP?MAGIC_EXITCODE : 1)); + } else { + return (int)outcome; + } +} + +int +_tinytest_set_flag(struct testgroup_t *groups, const char *arg, unsigned long flag) +{ + int i, j; + size_t length = LONGEST_TEST_NAME; + char fullname[LONGEST_TEST_NAME]; + int found=0; + if (strstr(arg, "..")) + length = strstr(arg,"..")-arg; + for (i=0; groups[i].prefix; ++i) { + for (j=0; groups[i].cases[j].name; ++j) { + snprintf(fullname, sizeof(fullname), "%s%s", + groups[i].prefix, groups[i].cases[j].name); + if (!flag) /* Hack! */ + printf(" %s\n", fullname); + if (!strncmp(fullname, arg, length)) { + groups[i].cases[j].flags |= flag; + ++found; + } + } + } + return found; +} + +static void +usage(struct testgroup_t *groups, int list_groups) +{ + puts("Options are: [--verbose|--quiet|--terse] [--no-fork]"); + puts(" Specify tests by name, or using a prefix ending with '..'"); + puts(" To skip a test, list give its name prefixed with a colon."); + puts(" Use --list-tests for a list of tests."); + if (list_groups) { + puts("Known tests are:"); + _tinytest_set_flag(groups, "..", 0); + } + exit(0); +} + +int +tinytest_main(int c, const char **v, struct testgroup_t *groups) +{ + int i, j, n=0; + +#ifdef WIN32 + commandname = v[0]; +#endif + for (i=1; i= 1) + printf("%d tests ok. (%d skipped)\n", n_ok, n_skipped); + + return (n_bad == 0) ? 0 : 1; +} + +int +_tinytest_get_verbosity(void) +{ + return opt_verbosity; +} + +void +_tinytest_set_test_failed(void) +{ + if (opt_verbosity <= 0 && cur_test_name) { + if (opt_verbosity==0) puts(""); + printf("%s%s: ", cur_test_prefix, cur_test_name); + cur_test_name = NULL; + } + cur_test_outcome = 0; +} + +void +_tinytest_set_test_skipped(void) +{ + if (cur_test_outcome==OK) + cur_test_outcome = SKIP; +} + diff -Nru tor-0.2.0.34/src/test/tinytest.h tor-0.2.2.16-alpha/src/test/tinytest.h --- tor-0.2.0.34/src/test/tinytest.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/tinytest.h 2010-09-12 02:54:22.000000000 +0000 @@ -0,0 +1,87 @@ +/* tinytest.h -- Copyright 2009-2010 Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _TINYTEST_H +#define _TINYTEST_H + +/** Flag for a test that needs to run in a subprocess. */ +#define TT_FORK (1<<0) +/** Runtime flag for a test we've decided to skip. */ +#define TT_SKIP (1<<1) +/** Internal runtime flag for a test we've decided to run. */ +#define _TT_ENABLED (1<<2) +/** If you add your own flags, make them start at this point. */ +#define TT_FIRST_USER_FLAG (1<<3) + +typedef void (*testcase_fn)(void *); + +struct testcase_t; + +/** Functions to initialize/teardown a structure for a testcase. */ +struct testcase_setup_t { + /** Return a new structure for use by a given testcase. */ + void *(*setup_fn)(const struct testcase_t *); + /** Clean/free a structure from setup_fn. Return 1 if ok, 0 on err. */ + int (*cleanup_fn)(const struct testcase_t *, void *); +}; + +/** A single test-case that you can run. */ +struct testcase_t { + const char *name; /**< An identifier for this case. */ + testcase_fn fn; /**< The function to run to implement this case. */ + unsigned long flags; /**< Bitfield of TT_* flags. */ + const struct testcase_setup_t *setup; /**< Optional setup/cleanup fns*/ + void *setup_data; /**< Extra data usable by setup function */ +}; +#define END_OF_TESTCASES { NULL, NULL, 0, NULL, NULL } + +/** A group of tests that are selectable together. */ +struct testgroup_t { + const char *prefix; /**< Prefix to prepend to testnames. */ + struct testcase_t *cases; /** Array, ending with END_OF_TESTCASES */ +}; +#define END_OF_GROUPS { NULL, NULL} + +/** Implementation: called from a test to indicate failure, before logging. */ +void _tinytest_set_test_failed(void); +/** Implementation: called from a test to indicate that we're skipping. */ +void _tinytest_set_test_skipped(void); +/** Implementation: return 0 for quiet, 1 for normal, 2 for loud. */ +int _tinytest_get_verbosity(void); +/** Implementation: Set a flag on tests matching a name; returns number + * of tests that matched. */ +int _tinytest_set_flag(struct testgroup_t *, const char *, unsigned long); + +/** Set all tests in 'groups' matching the name 'named' to be skipped. */ +#define tinytest_skip(groups, named) \ + _tinytest_set_flag(groups, named, TT_SKIP) + +/** Run a single testcase in a single group. */ +int testcase_run_one(const struct testgroup_t *,const struct testcase_t *); +/** Run a set of testcases from an END_OF_GROUPS-terminated array of groups, + as selected from the command line. */ +int tinytest_main(int argc, const char **argv, struct testgroup_t *groups); + +#endif diff -Nru tor-0.2.0.34/src/test/tinytest_macros.h tor-0.2.2.16-alpha/src/test/tinytest_macros.h --- tor-0.2.0.34/src/test/tinytest_macros.h 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/test/tinytest_macros.h 2010-09-12 02:54:22.000000000 +0000 @@ -0,0 +1,167 @@ +/* tinytest_macros.h -- Copyright 2009-2010 Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _TINYTEST_MACROS_H +#define _TINYTEST_MACROS_H + +/* Helpers for defining statement-like macros */ +#define TT_STMT_BEGIN do { +#define TT_STMT_END } while (0) + +/* Redefine this if your test functions want to abort with something besides + * "goto end;" */ +#ifndef TT_EXIT_TEST_FUNCTION +#define TT_EXIT_TEST_FUNCTION TT_STMT_BEGIN goto end; TT_STMT_END +#endif + +/* Redefine this if you want to note success/failure in some different way. */ +#ifndef TT_DECLARE +#define TT_DECLARE(prefix, args) \ + TT_STMT_BEGIN \ + printf("\n %s %s:%d: ",prefix,__FILE__,__LINE__); \ + printf args ; \ + TT_STMT_END +#endif + +/* Announce a failure. Args are parenthesized printf args. */ +#define TT_GRIPE(args) TT_DECLARE("FAIL", args) + +/* Announce a non-failure if we're verbose. */ +#define TT_BLATHER(args) \ + TT_STMT_BEGIN \ + if (_tinytest_get_verbosity()>1) TT_DECLARE(" OK", args); \ + TT_STMT_END + +#define TT_DIE(args) \ + TT_STMT_BEGIN \ + _tinytest_set_test_failed(); \ + TT_GRIPE(args); \ + TT_EXIT_TEST_FUNCTION; \ + TT_STMT_END + +#define TT_FAIL(args) \ + TT_STMT_BEGIN \ + _tinytest_set_test_failed(); \ + TT_GRIPE(args); \ + TT_STMT_END + +/* Fail and abort the current test for the reason in msg */ +#define tt_abort_printf(msg) TT_DIE(msg) +#define tt_abort_perror(op) TT_DIE(("%s: %s [%d]",(op),strerror(errno), errno)) +#define tt_abort_msg(msg) TT_DIE(("%s", msg)) +#define tt_abort() TT_DIE(("%s", "(Failed.)")) + +/* Fail but do not abort the current test for the reason in msg. */ +#define tt_fail_printf(msg) TT_FAIL(msg) +#define tt_fail_perror(op) TT_FAIL(("%s: %s [%d]",(op),strerror(errno), errno)) +#define tt_fail_msg(msg) TT_FAIL(("%s", msg)) +#define tt_fail() TT_FAIL(("%s", "(Failed.)")) + +/* End the current test, and indicate we are skipping it. */ +#define tt_skip() \ + TT_STMT_BEGIN \ + _tinytest_set_test_skipped(); \ + TT_EXIT_TEST_FUNCTION; \ + TT_STMT_END + +#define _tt_want(b, msg, fail) \ + TT_STMT_BEGIN \ + if (!(b)) { \ + _tinytest_set_test_failed(); \ + TT_GRIPE((msg)); \ + fail; \ + } else { \ + TT_BLATHER((msg)); \ + } \ + TT_STMT_END + +/* Assert b, but do not stop the test if b fails. Log msg on failure. */ +#define tt_want_msg(b, msg) \ + _tt_want(b, msg, ); + +/* Assert b and stop the test if b fails. Log msg on failure. */ +#define tt_assert_msg(b, msg) \ + _tt_want(b, msg, TT_EXIT_TEST_FUNCTION); + +/* Assert b, but do not stop the test if b fails. */ +#define tt_want(b) tt_want_msg( (b), "want("#b")") +/* Assert b, and stop the test if b fails. */ +#define tt_assert(b) tt_assert_msg((b), "assert("#b")") + +#define tt_assert_test_fmt_type(a,b,str_test,type,test,printf_type,printf_fmt, \ + setup_block,cleanup_block) \ + TT_STMT_BEGIN \ + type _val1 = (type)(a); \ + type _val2 = (type)(b); \ + int _tt_status = (test); \ + if (!_tt_status || _tinytest_get_verbosity()>1) { \ + printf_type _print; \ + printf_type _print1; \ + printf_type _print2; \ + type _value = _val1; \ + setup_block; \ + _print1 = _print; \ + _value = _val2; \ + setup_block; \ + _print2 = _print; \ + TT_DECLARE(_tt_status?" OK":"FAIL", \ + ("assert(%s): "printf_fmt" vs "printf_fmt, \ + str_test, _print1, _print2)); \ + _print = _print1; \ + cleanup_block; \ + _print = _print2; \ + cleanup_block; \ + if (!_tt_status) { \ + _tinytest_set_test_failed(); \ + TT_EXIT_TEST_FUNCTION; \ + } \ + } \ + TT_STMT_END + +#define tt_assert_test_type(a,b,str_test,type,test,fmt) \ + tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \ + {_print=_value;},{}) + +/* Helper: assert that a op b, when cast to type. Format the values with + * printf format fmt on failure. */ +#define tt_assert_op_type(a,op,b,type,fmt) \ + tt_assert_test_type(a,b,#a" "#op" "#b,type,(_val1 op _val2),fmt) + +#define tt_int_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,long,(_val1 op _val2),"%ld") + +#define tt_uint_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long, \ + (_val1 op _val2),"%lu") + +#define tt_ptr_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,void*, \ + (_val1 op _val2),"%p") + +#define tt_str_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,const char *, \ + (strcmp(_val1,_val2) op 0),"<%s>") + +#endif diff -Nru tor-0.2.0.34/src/tools/Makefile.am tor-0.2.2.16-alpha/src/tools/Makefile.am --- tor-0.2.0.34/src/tools/Makefile.am 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/tools/Makefile.am 2010-04-15 15:03:22.000000000 +0000 @@ -1,12 +1,18 @@ bin_PROGRAMS = tor-resolve tor-gencert +noinst_PROGRAMS = tor-checkkey tor_resolve_SOURCES = tor-resolve.c tor_resolve_LDFLAGS = @TOR_LDFLAGS_libevent@ -tor_resolve_LDADD = ../common/libor.a -levent @TOR_LIB_WS32@ +tor_resolve_LDADD = ../common/libor.a -lm @TOR_LIBEVENT_LIBS@ @TOR_LIB_WS32@ tor_gencert_SOURCES = tor-gencert.c tor_gencert_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ @TOR_LDFLAGS_libevent@ tor_gencert_LDADD = ../common/libor.a ../common/libor-crypto.a \ - -lz -lcrypto -levent @TOR_LIB_WS32@ @TOR_LIB_GDI@ + -lm @TOR_ZLIB_LIBS@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ +tor_checkkey_SOURCES = tor-checkkey.c +tor_checkkey_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ + @TOR_LDFLAGS_libevent@ +tor_checkkey_LDADD = ../common/libor.a ../common/libor-crypto.a \ + -lm @TOR_ZLIB_LIBS@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ diff -Nru tor-0.2.0.34/src/tools/Makefile.in tor-0.2.2.16-alpha/src/tools/Makefile.in --- tor-0.2.0.34/src/tools/Makefile.in 2009-02-09 03:31:02.000000000 +0000 +++ tor-0.2.2.16-alpha/src/tools/Makefile.in 2010-09-17 06:08:41.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -33,6 +33,7 @@ build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = tor-resolve$(EXEEXT) tor-gencert$(EXEEXT) +noinst_PROGRAMS = tor-checkkey$(EXEEXT) subdir = src/tools DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -45,7 +46,12 @@ CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(bin_PROGRAMS) +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am_tor_checkkey_OBJECTS = tor-checkkey.$(OBJEXT) +tor_checkkey_OBJECTS = $(am_tor_checkkey_OBJECTS) +tor_checkkey_DEPENDENCIES = ../common/libor.a ../common/libor-crypto.a +tor_checkkey_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(tor_checkkey_LDFLAGS) $(LDFLAGS) -o $@ am_tor_gencert_OBJECTS = tor-gencert.$(OBJEXT) tor_gencert_OBJECTS = $(am_tor_gencert_OBJECTS) tor_gencert_DEPENDENCIES = ../common/libor.a ../common/libor-crypto.a @@ -56,20 +62,24 @@ tor_resolve_DEPENDENCIES = ../common/libor.a tor_resolve_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(tor_resolve_LDFLAGS) $(LDFLAGS) -o $@ -DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(tor_gencert_SOURCES) $(tor_resolve_SOURCES) -DIST_SOURCES = $(tor_gencert_SOURCES) $(tor_resolve_SOURCES) +SOURCES = $(tor_checkkey_SOURCES) $(tor_gencert_SOURCES) \ + $(tor_resolve_SOURCES) +DIST_SOURCES = $(tor_checkkey_SOURCES) $(tor_gencert_SOURCES) \ + $(tor_resolve_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -104,6 +114,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -112,7 +123,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -123,8 +136,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -177,13 +193,20 @@ top_srcdir = @top_srcdir@ tor_resolve_SOURCES = tor-resolve.c tor_resolve_LDFLAGS = @TOR_LDFLAGS_libevent@ -tor_resolve_LDADD = ../common/libor.a -levent @TOR_LIB_WS32@ +tor_resolve_LDADD = ../common/libor.a -lm @TOR_LIBEVENT_LIBS@ @TOR_LIB_WS32@ tor_gencert_SOURCES = tor-gencert.c tor_gencert_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ @TOR_LDFLAGS_libevent@ tor_gencert_LDADD = ../common/libor.a ../common/libor-crypto.a \ - -lz -lcrypto -levent @TOR_LIB_WS32@ @TOR_LIB_GDI@ + -lm @TOR_ZLIB_LIBS@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ + +tor_checkkey_SOURCES = tor-checkkey.c +tor_checkkey_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ + @TOR_LDFLAGS_libevent@ + +tor_checkkey_LDADD = ../common/libor.a ../common/libor-crypto.a \ + -lm @TOR_ZLIB_LIBS@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ all: all-am @@ -241,6 +264,12 @@ clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +tor-checkkey$(EXEEXT): $(tor_checkkey_OBJECTS) $(tor_checkkey_DEPENDENCIES) + @rm -f tor-checkkey$(EXEEXT) + $(tor_checkkey_LINK) $(tor_checkkey_OBJECTS) $(tor_checkkey_LDADD) $(LIBS) tor-gencert$(EXEEXT): $(tor_gencert_OBJECTS) $(tor_gencert_DEPENDENCIES) @rm -f tor-gencert$(EXEEXT) $(tor_gencert_LINK) $(tor_gencert_OBJECTS) $(tor_gencert_LDADD) $(LIBS) @@ -254,6 +283,7 @@ distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tor-checkkey.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tor-gencert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tor-resolve.Po@am__quote@ @@ -276,8 +306,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS @@ -289,8 +319,8 @@ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ @@ -300,13 +330,12 @@ CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique @@ -378,7 +407,8 @@ @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-binPROGRAMS clean-generic mostlyclean-am +clean-am: clean-binPROGRAMS clean-generic clean-noinstPROGRAMS \ + mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -436,17 +466,17 @@ .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic ctags distclean distclean-compile \ - distclean-generic distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-binPROGRAMS \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-binPROGRAMS + clean-generic clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff -Nru tor-0.2.0.34/src/tools/tor-checkkey.c tor-0.2.2.16-alpha/src/tools/tor-checkkey.c --- tor-0.2.0.34/src/tools/tor-checkkey.c 1970-01-01 00:00:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/tools/tor-checkkey.c 2010-07-13 01:37:00.000000000 +0000 @@ -0,0 +1,80 @@ + +#define CRYPTO_PRIVATE + +#include "orconfig.h" + +#include +#include +#include "crypto.h" +#include "torlog.h" +#include "../common/util.h" +#include "compat.h" +#include +#include + +int +main(int c, char **v) +{ + crypto_pk_env_t *env; + char *str; + RSA *rsa; + int wantdigest=0; + int fname_idx; + char *fname=NULL; + init_logging(); + + 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_new_pk_env(); + 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_env_get_rsa(env); + str = BN_bn2hex(rsa->n); + + printf("%s\n", str); + } + + return 0; +} + diff -Nru tor-0.2.0.34/src/tools/tor-gencert.c tor-0.2.2.16-alpha/src/tools/tor-gencert.c --- tor-0.2.0.34/src/tools/tor-gencert.c 2008-03-10 05:00:45.000000000 +0000 +++ tor-0.2.2.16-alpha/src/tools/tor-gencert.c 2010-07-13 01:37:00.000000000 +0000 @@ -1,6 +1,5 @@ -/* Copyright (c) 2007-2008 The Tor Project, Inc. */ +/* Copyright (c) 2007-2010 The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: /tor/trunk/src/tools/tor-resolve.c 12481 2007-04-21T17:27:19.371353Z nickm $ */ #include "orconfig.h" @@ -14,6 +13,7 @@ #include #include +#include #include #include #include @@ -28,9 +28,10 @@ #define CRYPTO_PRIVATE #include "compat.h" -#include "util.h" -#include "log.h" +#include "../common/util.h" +#include "../common/torlog.h" #include "crypto.h" +#include "address.h" #define IDENTITY_KEY_BITS 3072 #define SIGNING_KEY_BITS 1024 @@ -63,14 +64,13 @@ "[-c certificate_file]\n" " [-m lifetime_in_months] [-a address:port] " "[--passphrase-fd ]\n"); - } /* XXXX copied from crypto.c */ static void crypto_log_errors(int severity, const char *doing) { - unsigned int err; + unsigned long err; const char *msg, *lib, *func; while ((err = ERR_get_error()) != 0) { msg = (const char*)ERR_reason_error_string(err); @@ -94,7 +94,7 @@ { char *cp; char buf[1024]; /* "Ought to be enough for anybody." */ - int n = read_all(passphrase_fd, buf, sizeof(buf), 0); + ssize_t n = read_all(passphrase_fd, buf, sizeof(buf), 0); if (n < 0) { log_err(LD_GENERAL, "Couldn't read from passphrase fd: %s", strerror(errno)); @@ -123,6 +123,7 @@ parse_commandline(int argc, char **argv) { int i; + log_severity_list_t s; for (i = 1; i < argc; ++i) { if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) { show_help(); @@ -188,11 +189,12 @@ } } - if (verbose) { - add_stream_log(LOG_INFO, LOG_ERR, "", stderr); - } else { - add_stream_log(LOG_NOTICE, LOG_ERR, "", stderr); - } + memset(&s, 0, sizeof(s)); + if (verbose) + set_log_severity_config(LOG_DEBUG, LOG_ERR, &s); + else + set_log_severity_config(LOG_WARN, LOG_ERR, &s); + add_stream_log(&s, "", fileno(stderr)); if (!identity_key_file) { identity_key_file = tor_strdup("./authority_identity_key"); @@ -216,6 +218,20 @@ return 0; } +static RSA * +generate_key(int bits) +{ + RSA *rsa = NULL; + crypto_pk_env_t *env = crypto_new_pk_env(); + if (crypto_pk_generate_key_with_bits(env,bits)<0) + goto done; + rsa = _crypto_pk_env_get_rsa(env); + rsa = RSAPrivateKey_dup(rsa); + done: + crypto_free_pk_env(env); + return rsa; +} + /** Try to read the identity key from identity_key_file. If no such * file exists and create_identity_key is set, make a new identity key and * store it. Return 0 on success, nonzero on failure. @@ -236,7 +252,7 @@ } log_notice(LD_GENERAL, "Generating %d-bit RSA identity key.", IDENTITY_KEY_BITS); - if (!(key = RSA_generate_key(IDENTITY_KEY_BITS, 65537, NULL, NULL))) { + if (!(key = generate_key(IDENTITY_KEY_BITS))) { log_err(LD_GENERAL, "Couldn't generate identity key."); crypto_log_errors(LOG_ERR, "Generating identity key"); return 1; @@ -321,7 +337,7 @@ RSA *key; log_notice(LD_GENERAL, "Generating %d-bit RSA signing key.", SIGNING_KEY_BITS); - if (!(key = RSA_generate_key(SIGNING_KEY_BITS, 65537, NULL, NULL))) { + if (!(key = generate_key(SIGNING_KEY_BITS))) { log_err(LD_GENERAL, "Couldn't generate signing key."); crypto_log_errors(LOG_ERR, "Generating signing key"); return 1; @@ -391,6 +407,19 @@ return r; } +/** Set out to the hex-encoded fingerprint of pkey. */ +static int +get_digest(EVP_PKEY *pkey, char *out) +{ + int r = 1; + crypto_pk_env_t *pk = _crypto_new_pk_env_rsa(EVP_PKEY_get1_RSA(pkey)); + if (pk) { + r = crypto_pk_get_digest(pk, out); + crypto_free_pk_env(pk); + } + return r; +} + /** Generate a new certificate for our loaded or generated keys, and write it * to disk. Return 0 on success, nonzero on failure. */ static int @@ -401,6 +430,7 @@ struct tm tm; char published[ISO_TIME_LEN+1]; char expires[ISO_TIME_LEN+1]; + char id_digest[DIGEST_LEN]; char fingerprint[FINGERPRINT_LEN+1]; char *ident = key_to_string(identity_key); char *signing = key_to_string(signing_key); @@ -411,6 +441,7 @@ int r; get_fingerprint(identity_key, fingerprint); + get_digest(identity_key, id_digest); tor_localtime_r(&now, &tm); tm.tm_mon += months_lifetime; @@ -426,11 +457,26 @@ "dir-key-expires %s\n" "dir-identity-key\n%s" "dir-signing-key\n%s" - "dir-key-certification\n", + "dir-key-crosscert\n" + "-----BEGIN ID SIGNATURE-----\n", address?"\ndir-address ":"", address?address:"", - fingerprint, published, expires, ident, signing); + fingerprint, published, expires, ident, signing + ); tor_free(ident); tor_free(signing); + + /* Append a cross-certification */ + r = RSA_private_encrypt(DIGEST_LEN, (unsigned char*)id_digest, + (unsigned char*)signature, + EVP_PKEY_get1_RSA(signing_key), + RSA_PKCS1_PADDING); + signed_len = strlen(buf); + base64_encode(buf+signed_len, sizeof(buf)-signed_len, signature, r); + + strlcat(buf, + "-----END ID SIGNATURE-----\n" + "dir-key-certification\n", sizeof(buf)); + signed_len = strlen(buf); SHA1((const unsigned char*)buf,signed_len,(unsigned char*)digest); @@ -454,7 +500,6 @@ return 0; } - /** Entry point to tor-gencert */ int main(int argc, char **argv) @@ -463,11 +508,11 @@ init_logging(); /* Don't bother using acceleration. */ - if (crypto_global_init(0)) { + if (crypto_global_init(0, NULL, NULL)) { fprintf(stderr, "Couldn't initialize crypto library.\n"); return 1; } - if (crypto_seed_rng()) { + if (crypto_seed_rng(1)) { fprintf(stderr, "Couldn't seed RNG.\n"); goto done; } diff -Nru tor-0.2.0.34/src/tools/tor-resolve.c tor-0.2.2.16-alpha/src/tools/tor-resolve.c --- tor-0.2.0.34/src/tools/tor-resolve.c 2008-02-26 19:56:28.000000000 +0000 +++ tor-0.2.2.16-alpha/src/tools/tor-resolve.c 2010-07-13 01:37:00.000000000 +0000 @@ -1,14 +1,14 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson - * Copyright (c) 2007-2008, The Tor Project, Inc. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* $Id: tor-resolve.c 13412 2008-02-07 05:31:47Z nickm $ */ #include "orconfig.h" #include "compat.h" -#include "util.h" -#include "log.h" +#include "../common/util.h" +#include "address.h" +#include "../common/torlog.h" #include #include @@ -51,7 +51,7 @@ /** Set *out to a newly allocated SOCKS4a resolve request with * username and hostname as provided. Return the number * of bytes in the request. */ -static int +static ssize_t build_socks_resolve_request(char **out, const char *username, const char *hostname, @@ -107,7 +107,8 @@ * Return 0 on success, -1 on error. */ static int -parse_socks4a_resolve_response(const char *response, size_t len, +parse_socks4a_resolve_response(const char *hostname, + const char *response, size_t len, uint32_t *addr_out) { uint8_t status; @@ -129,6 +130,13 @@ } if (status != 90) { log_warn(LD_NET,"Got status response '%d': socks request failed.", status); + if (!strcasecmpend(hostname, ".onion")) { + log_warn(LD_NET, + "%s is a hidden service; those don't have IP addresses. " + "To connect to a hidden service, you need to send the hostname " + "to Tor; we suggest an application that uses SOCKS 4a.",hostname); + return -1; + } return -1; } @@ -136,6 +144,34 @@ return 0; } +/* It would be nice to let someone know what SOCKS5 issue a user may have */ +static const char * +socks5_reason_to_string(char reason) +{ + switch (reason) { + case SOCKS5_SUCCEEDED: + return "succeeded"; + case SOCKS5_GENERAL_ERROR: + return "general error"; + case SOCKS5_NOT_ALLOWED: + return "not allowed"; + case SOCKS5_NET_UNREACHABLE: + return "network is unreachable"; + case SOCKS5_HOST_UNREACHABLE: + return "host is unreachable"; + case SOCKS5_CONNECTION_REFUSED: + return "connection refused"; + case SOCKS5_TTL_EXPIRED: + return "ttl expired"; + case SOCKS5_COMMAND_NOT_SUPPORTED: + return "command not supported"; + case SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED: + return "address type not supported"; + default: + return "unknown SOCKS5 code"; + } +} + /** Send a resolve request for hostname to the Tor listening on * sockshost:socksport. Store the resulting IPv4 * address (in host order) into *result_addr. @@ -148,7 +184,7 @@ int s; struct sockaddr_in socksaddr; char *req = NULL; - int len = 0; + ssize_t len = 0; tor_assert(hostname); tor_assert(result_addr); @@ -213,8 +249,9 @@ log_err(LD_NET, "Error reading SOCKS4 response."); return -1; } - if (parse_socks4a_resolve_response(reply_buf, RESPONSE_LEN_4, - result_addr)<0){ + if (parse_socks4a_resolve_response(hostname, + reply_buf, RESPONSE_LEN_4, + result_addr)<0) { return -1; } } else { @@ -227,9 +264,18 @@ log_err(LD_NET, "Bad SOCKS5 reply version."); return -1; } + /* Give a user some useful feedback about SOCKS5 errors */ if (reply_buf[1] != 0) { - log_warn(LD_NET,"Got status response '%u': SOCKS5 request failed.", - (unsigned)reply_buf[1]); + log_warn(LD_NET,"Got SOCKS5 status response '%u': %s", + (unsigned)reply_buf[1], + socks5_reason_to_string(reply_buf[1])); + if (reply_buf[1] == 4 && !strcasecmpend(hostname, ".onion")) { + log_warn(LD_NET, + "%s is a hidden service; those don't have IP addresses. " + "To connect to a hidden service, you need to send the hostname " + "to Tor; we suggest an application that uses SOCKS 4a.", + hostname); + } return -1; } if (reply_buf[3] == 1) { @@ -262,7 +308,7 @@ static void usage(void) { - puts("Syntax: tor-resolve [-4] [-v] [-x] [-F] " + puts("Syntax: tor-resolve [-4] [-v] [-x] [-F] [-p port] " "hostname [sockshost:socksport]"); exit(1); } @@ -272,7 +318,7 @@ main(int argc, char **argv) { uint32_t sockshost; - uint16_t socksport; + uint16_t socksport = 0, port_option = 0; int isSocks4 = 0, isVerbose = 0, isReverse = 0, force = 0; char **arg; int n_args; @@ -280,6 +326,7 @@ uint32_t result = 0; char *result_hostname = NULL; char buf[INET_NTOA_BUF_LEN]; + log_severity_list_t *s = tor_malloc_zero(sizeof(log_severity_list_t)); init_logging(); @@ -304,7 +351,21 @@ isReverse = 1; else if (!strcmp("-F", arg[0])) force = 1; - else { + else if (!strcmp("-p", arg[0])) { + int p; + if (n_args < 2) { + fprintf(stderr, "No arguments given to -p\n"); + usage(); + } + p = atoi(arg[1]); + if (p<1 || p > 65535) { + fprintf(stderr, "-p requires a number between 1 and 65535\n"); + usage(); + } + port_option = (uint16_t) p; + ++arg; /* skip the port */ + --n_args; + } else { fprintf(stderr, "Unrecognized flag '%s'\n", arg[0]); usage(); } @@ -317,21 +378,33 @@ usage(); } - if (isVerbose) { - add_stream_log(LOG_DEBUG, LOG_ERR, "", stderr); - } else { - add_stream_log(LOG_WARN, LOG_ERR, "", stderr); - } + if (isVerbose) + set_log_severity_config(LOG_DEBUG, LOG_ERR, s); + else + set_log_severity_config(LOG_WARN, LOG_ERR, s); + add_stream_log(s, "", fileno(stderr)); + if (n_args == 1) { - log_debug(LD_CONFIG, "defaulting to localhost:9050"); + log_debug(LD_CONFIG, "defaulting to localhost"); sockshost = 0x7f000001u; /* localhost */ - socksport = 9050; /* 9050 */ + if (port_option) { + log_debug(LD_CONFIG, "Using port %d", (int)port_option); + socksport = port_option; + } else { + log_debug(LD_CONFIG, "defaulting to port 9050"); + socksport = 9050; /* 9050 */ + } } else if (n_args == 2) { if (parse_addr_port(LOG_WARN, arg[1], NULL, &sockshost, &socksport)<0) { fprintf(stderr, "Couldn't parse/resolve address %s", arg[1]); return 1; } - if (socksport == 0) { + if (socksport && port_option && socksport != port_option) { + log_warn(LD_CONFIG, "Conflicting ports; using %d, not %d", + (int)socksport, (int)port_option); + } else if (port_option) { + socksport = port_option; + } else if (!socksport) { log_debug(LD_CONFIG, "defaulting to port 9050"); socksport = 9050; } @@ -339,14 +412,6 @@ usage(); } - if (!strcasecmpend(arg[0], ".onion") && !force) { - fprintf(stderr, - "%s is a hidden service; those don't have IP addresses.\n\n" - "To connect to a hidden service, you need to send the hostname\n" - "to Tor; we suggest an application that uses SOCKS 4a.\n", arg[0]); - return 1; - } - if (network_init()<0) { log_err(LD_BUG,"Error initializing network; exiting."); return 1; diff -Nru tor-0.2.0.34/src/win32/Makefile.in tor-0.2.2.16-alpha/src/win32/Makefile.in --- tor-0.2.0.34/src/win32/Makefile.in 2009-02-09 03:31:03.000000000 +0000 +++ tor-0.2.2.16-alpha/src/win32/Makefile.in 2010-09-17 06:08:41.000000000 +0000 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -44,8 +44,10 @@ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -80,6 +82,7 @@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ +OPENSSL = @OPENSSL@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -88,7 +91,9 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SED = @SED@ SET_MAKE = @SET_MAKE@ +SHA1SUM = @SHA1SUM@ SHELL = @SHELL@ STRIP = @STRIP@ TORGROUP = @TORGROUP@ @@ -99,8 +104,11 @@ TOR_LDFLAGS_libevent = @TOR_LDFLAGS_libevent@ TOR_LDFLAGS_openssl = @TOR_LDFLAGS_openssl@ TOR_LDFLAGS_zlib = @TOR_LDFLAGS_zlib@ +TOR_LIBEVENT_LIBS = @TOR_LIBEVENT_LIBS@ TOR_LIB_GDI = @TOR_LIB_GDI@ TOR_LIB_WS32 = @TOR_LIB_WS32@ +TOR_OPENSSL_LIBS = @TOR_OPENSSL_LIBS@ +TOR_ZLIB_LIBS = @TOR_ZLIB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ diff -Nru tor-0.2.0.34/src/win32/orconfig.h tor-0.2.2.16-alpha/src/win32/orconfig.h --- tor-0.2.0.34/src/win32/orconfig.h 2009-02-09 03:27:00.000000000 +0000 +++ tor-0.2.2.16-alpha/src/win32/orconfig.h 2010-09-17 06:08:30.000000000 +0000 @@ -1,4 +1,3 @@ -/* $Id */ /* orconfig.h for Windows -- This file is *not* generated by autoconf. * Instead, it has to be hand-edited to keep Win32 happy. */ @@ -89,11 +88,18 @@ #define HAVE_STRING_H /* Define to 1 if you have the `strlcat' function. */ +#if defined (WINCE) +#define HAVE_STRLCAT +#else #undef HAVE_STRLCAT +#endif /* Define to 1 if you have the `strlcpy' function. */ +#if defined (WINCE) +#define HAVE_STRLCPY +#else #undef HAVE_STRLCPY - +#endif /* Define to 1 if you have the `strptime' function. */ #undef HAVE_STRPTIME @@ -227,6 +233,5 @@ #define USING_TWOS_COMPLEMENT /* Version number of package */ -#define VERSION "0.2.0.34" - +#define VERSION "0.2.2.16-alpha" diff -Nru tor-0.2.0.34/tor.spec tor-0.2.2.16-alpha/tor.spec --- tor-0.2.0.34/tor.spec 2009-02-09 03:31:41.000000000 +0000 +++ tor-0.2.2.16-alpha/tor.spec 2010-09-17 06:09:14.000000000 +0000 @@ -15,37 +15,19 @@ %define toruser _tor %define torgroup _tor -## Target a specific arch and OS -# -# default is i386 linux -%define target gnu -%define target_cpu i386 -%define target_os linux - -## Override any system rpm macros -# -%define _arch %{target_cpu} -%define _build_arch %{target_cpu} -%define _vendor %{target_os} -%define _host %{target_cpu}-pc-%{target_os}-%{target} -%define _host_cpu %{target_cpu} -%define _host_vendor %{target_os} -%define optflags -march=%{target_cpu} -mtune=%{target_cpu} -O2 - ## Version song and dance # # This should be the Tor version number, as it appears on the tarball, # including any "pre" or "rc" suffix. This gets massaged to # create the RPM version number, in a way that depends on the Tor # numbering scheme. -%define native_version 0.2.0.34 +%define native_version 0.2.2.16-alpha %define version %(echo %{native_version} | sed -e 's/-/./g') ## Define output filename # # This creates filenames based upon the value of target_cpu defined above -%define _build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%{target_cpu}.rpm ## Release and OS identification song and dance # @@ -61,24 +43,26 @@ %define is_fc %(test -e /etc/fedora-release && echo 1 || echo 0) %define is_mdk %(test -e /etc/mandrake-release && echo 1 || echo 0) %define is_suse %(test -e /etc/SuSE-release && echo 1 || echo 0) +%define is_rfl %(test -e /etc/redflag-release && echo 1 || echo 0) %if %{is_fc} %define ostag %(sed -e 's/^.*release /fc/' -e 's/ .*$//' -e 's/\\./_/g' < /etc/fedora-release) -%else +%endif + %if %{is_rh} %define ostag %(sed -e 's/^.*release /rh/' -e 's/ .*$//' -e 's/\\./_/g' < /etc/redhat-release) %endif -%endif - -# These are probably wrong... just placeholders should we actually -# end up supporting these distributions %if %{is_mdk} %define ostag mdk %endif %if %{is_suse} -%define ostag suse +%define ostag suse%(grep openSUSE /etc/SuSE-release | awk '{print $2}' | sed -e 's/\\./_/') +%endif + +%if %{is_rfl} +%define ostag %(sed -e 's/^.*Desktop /redflag/' -e 's/ .*$//' -e 's/\\./_/g' < /etc/redflag-release) %endif # Using the build date ensures that every build really does get @@ -120,16 +104,16 @@ URL: https://www.torproject.org/ Group: System Environment/Daemons -License: BSD-like -Vendor: R. Dingledine -Packager: Andrew Lewman +License: 3-clause BSD +Vendor: The Tor Project (https://torproject.org) +Packager: Erinn Clark %if %{is_suse} -Requires: openssl >= 0.9.6 -BuildRequires: openssl-devel >= 0.9.6, rpm >= 4.0, zlib-devel +Requires: openssl >= 0.9.7 +BuildRequires: openssl-devel >= 0.9.7, rpm >= 4.0, zlib-devel %else -Requires: openssl >= 0.9.6 -BuildRequires: openssl-devel >= 0.9.6, libevent-devel >= 1.1a +Requires: openssl >= 0.9.7 +BuildRequires: openssl-devel >= 0.9.7 %endif %if %{is_fc} BuildRequires: rpm-build >= 4.0 @@ -150,17 +134,17 @@ is rebooted. Applications connect to the local Tor proxy using the SOCKS -protocol. The local proxy chooses a path through a set of relays, in +protocol. The tor client chooses a path through a set of relays, in which each relay knows its predecessor and successor, but no others. Traffic flowing down the circuit is unwrapped by a symmetric key at each relay, which reveals the downstream relay. Warnings: Tor does no protocol cleaning. That means there is a danger that application protocols and associated programs can be induced to -reveal information about the initiator. Tor depends on Privoxy and +reveal information about the initiator. Tor depends on Privoxy or similar protocol cleaners to solve this problem. This is alpha code, and is even more likely than released code to have anonymity-spoiling -bugs. The present network is very small -- this further reduces the +bugs. The present network is small -- this further reduces the strength of the anonymity provided. Tor is not presently suitable for high-stakes anonymity. @@ -169,11 +153,9 @@ %build %if %{is_suse} -%configure --with-tor-user=%{toruser} --with-tor-group=%{torgroup} \ - --build=%{_host} --host=%{_host} --target=%{_host} +%configure --with-tor-user=%{toruser} --with-tor-group=%{torgroup} %else -%configure --with-tor-user=%{toruser} --with-tor-group=%{torgroup} \ - --build=%{_host} --host=%{_host} --target=%{_host} +%configure --with-tor-user=%{toruser} --with-tor-group=%{torgroup} %endif %make @@ -190,7 +172,7 @@ %__install -p -m 755 contrib/torctl ${RPM_BUILD_ROOT}%{_bindir} # Set up config file; "sample" file implements a basic user node. -%__install -p -m 644 src/config/torrc.sample ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/torrc.sample +%__install -p -m 644 ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/torrc.sample ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/torrc # Install the logrotate control file. %__mkdir_p -m 755 ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d @@ -280,8 +262,9 @@ %files %defattr(-,root,root) -%doc AUTHORS INSTALL LICENSE README ChangeLog doc/HACKING doc/TODO +%doc INSTALL LICENSE README ChangeLog doc/HACKING doc/TODO %{_mandir}/man*/* +%{_docdir}/tor/* %{_bindir}/tor %{_bindir}/torctl %{_bindir}/torify @@ -297,6 +280,19 @@ %attr(0750,%{toruser},%{torgroup}) %dir %{_localstatedir}/log/%{name} %changelog +* Mon Feb 22 2010 Erinn Clark +- remove AUTHORS from %doc line since it no longer exists upstream +- switch maintainers + +* Fri May 01 2009 Andrew Lewman +- clean up distro detection and remove dead comment blocks + +* Sun Feb 22 2009 Andrew Lewman +- update the description, vendor, and packager + +* Thu Sep 11 2008 Andrew Lewman +- See r16867 +- http://archives.seul.org/or/cvs/Sep-2008/msg00156.html * Tue Feb 27 2007 Andrew Lewman - Fix a potential race condition in how we determine the running state of tor. Found by Stefan Nordhausen. diff -Nru tor-0.2.0.34/tor.spec.in tor-0.2.2.16-alpha/tor.spec.in --- tor-0.2.0.34/tor.spec.in 2008-08-26 04:08:41.000000000 +0000 +++ tor-0.2.2.16-alpha/tor.spec.in 2010-08-11 03:14:17.000000000 +0000 @@ -15,23 +15,6 @@ %define toruser @TORUSER@ %define torgroup @TORGROUP@ -## Target a specific arch and OS -# -# default is i386 linux -%define target gnu -%define target_cpu i386 -%define target_os linux - -## Override any system rpm macros -# -%define _arch %{target_cpu} -%define _build_arch %{target_cpu} -%define _vendor %{target_os} -%define _host %{target_cpu}-pc-%{target_os}-%{target} -%define _host_cpu %{target_cpu} -%define _host_vendor %{target_os} -%define optflags -march=%{target_cpu} -mtune=%{target_cpu} -O2 - ## Version song and dance # # This should be the Tor version number, as it appears on the tarball, @@ -45,7 +28,6 @@ ## Define output filename # # This creates filenames based upon the value of target_cpu defined above -%define _build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%{target_cpu}.rpm ## Release and OS identification song and dance # @@ -61,24 +43,26 @@ %define is_fc %(test -e /etc/fedora-release && echo 1 || echo 0) %define is_mdk %(test -e /etc/mandrake-release && echo 1 || echo 0) %define is_suse %(test -e /etc/SuSE-release && echo 1 || echo 0) +%define is_rfl %(test -e /etc/redflag-release && echo 1 || echo 0) %if %{is_fc} %define ostag %(sed -e 's/^.*release /fc/' -e 's/ .*$//' -e 's/\\./_/g' < /etc/fedora-release) -%else +%endif + %if %{is_rh} %define ostag %(sed -e 's/^.*release /rh/' -e 's/ .*$//' -e 's/\\./_/g' < /etc/redhat-release) %endif -%endif - -# These are probably wrong... just placeholders should we actually -# end up supporting these distributions %if %{is_mdk} %define ostag mdk %endif %if %{is_suse} -%define ostag suse +%define ostag suse%(grep openSUSE /etc/SuSE-release | awk '{print $2}' | sed -e 's/\\./_/') +%endif + +%if %{is_rfl} +%define ostag %(sed -e 's/^.*Desktop /redflag/' -e 's/ .*$//' -e 's/\\./_/g' < /etc/redflag-release) %endif # Using the build date ensures that every build really does get @@ -120,16 +104,16 @@ URL: https://www.torproject.org/ Group: System Environment/Daemons -License: BSD-like -Vendor: R. Dingledine -Packager: Andrew Lewman +License: 3-clause BSD +Vendor: The Tor Project (https://torproject.org) +Packager: Erinn Clark %if %{is_suse} -Requires: openssl >= 0.9.6 -BuildRequires: openssl-devel >= 0.9.6, rpm >= 4.0, zlib-devel +Requires: openssl >= 0.9.7 +BuildRequires: openssl-devel >= 0.9.7, rpm >= 4.0, zlib-devel %else -Requires: openssl >= 0.9.6 -BuildRequires: openssl-devel >= 0.9.6, libevent-devel >= 1.1a +Requires: openssl >= 0.9.7 +BuildRequires: openssl-devel >= 0.9.7 %endif %if %{is_fc} BuildRequires: rpm-build >= 4.0 @@ -150,17 +134,17 @@ is rebooted. Applications connect to the local Tor proxy using the SOCKS -protocol. The local proxy chooses a path through a set of relays, in +protocol. The tor client chooses a path through a set of relays, in which each relay knows its predecessor and successor, but no others. Traffic flowing down the circuit is unwrapped by a symmetric key at each relay, which reveals the downstream relay. Warnings: Tor does no protocol cleaning. That means there is a danger that application protocols and associated programs can be induced to -reveal information about the initiator. Tor depends on Privoxy and +reveal information about the initiator. Tor depends on Privoxy or similar protocol cleaners to solve this problem. This is alpha code, and is even more likely than released code to have anonymity-spoiling -bugs. The present network is very small -- this further reduces the +bugs. The present network is small -- this further reduces the strength of the anonymity provided. Tor is not presently suitable for high-stakes anonymity. @@ -169,11 +153,9 @@ %build %if %{is_suse} -%configure --with-tor-user=%{toruser} --with-tor-group=%{torgroup} \ - --build=%{_host} --host=%{_host} --target=%{_host} +%configure --with-tor-user=%{toruser} --with-tor-group=%{torgroup} %else -%configure --with-tor-user=%{toruser} --with-tor-group=%{torgroup} \ - --build=%{_host} --host=%{_host} --target=%{_host} +%configure --with-tor-user=%{toruser} --with-tor-group=%{torgroup} %endif %make @@ -190,7 +172,7 @@ %__install -p -m 755 contrib/torctl ${RPM_BUILD_ROOT}%{_bindir} # Set up config file; "sample" file implements a basic user node. -%__install -p -m 644 src/config/torrc.sample ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/torrc.sample +%__install -p -m 644 ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/torrc.sample ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/torrc # Install the logrotate control file. %__mkdir_p -m 755 ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d @@ -280,8 +262,9 @@ %files %defattr(-,root,root) -%doc AUTHORS INSTALL LICENSE README ChangeLog doc/HACKING doc/TODO +%doc INSTALL LICENSE README ChangeLog doc/HACKING doc/TODO %{_mandir}/man*/* +%{_docdir}/tor/* %{_bindir}/tor %{_bindir}/torctl %{_bindir}/torify @@ -297,6 +280,19 @@ %attr(0750,%{toruser},%{torgroup}) %dir %{_localstatedir}/log/%{name} %changelog +* Mon Feb 22 2010 Erinn Clark +- remove AUTHORS from %doc line since it no longer exists upstream +- switch maintainers + +* Fri May 01 2009 Andrew Lewman +- clean up distro detection and remove dead comment blocks + +* Sun Feb 22 2009 Andrew Lewman +- update the description, vendor, and packager + +* Thu Sep 11 2008 Andrew Lewman +- See r16867 +- http://archives.seul.org/or/cvs/Sep-2008/msg00156.html * Tue Feb 27 2007 Andrew Lewman - Fix a potential race condition in how we determine the running state of tor. Found by Stefan Nordhausen.