aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/README.md2
-rw-r--r--contrib/debian/copyright2
-rw-r--r--contrib/debian/examples/bitcoin.conf7
-rw-r--r--contrib/devtools/README.md8
-rwxr-xr-xcontrib/devtools/check-doc.py2
-rwxr-xr-xcontrib/devtools/clang-format-diff.py4
-rwxr-xr-xcontrib/devtools/clang-format.py62
-rwxr-xr-xcontrib/devtools/github-merge.py63
-rwxr-xr-xcontrib/devtools/optimize-pngs.py2
-rwxr-xr-xcontrib/devtools/test-security-check.py1
-rwxr-xr-xcontrib/devtools/update-translations.py8
-rwxr-xr-xcontrib/gitian-build.sh2
-rw-r--r--contrib/gitian-descriptors/gitian-linux.yml2
-rw-r--r--contrib/gitian-descriptors/gitian-osx.yml2
-rw-r--r--contrib/gitian-descriptors/gitian-win.yml2
-rw-r--r--contrib/gitian-keys/jtimon-key.pgpbin0 -> 10892 bytes
-rw-r--r--contrib/linearize/README.md10
-rw-r--r--contrib/linearize/example-linearize.cfg15
-rwxr-xr-xcontrib/linearize/linearize-data.py42
-rwxr-xr-xcontrib/linearize/linearize-hashes.py1
-rwxr-xr-xcontrib/macdeploy/macdeployqtplus4
-rw-r--r--contrib/qos/README.md4
-rw-r--r--contrib/qos/tc.sh30
-rw-r--r--contrib/rpm/README.md2
-rw-r--r--contrib/seeds/README.md14
-rwxr-xr-xcontrib/seeds/generate-seeds.py6
-rwxr-xr-xcontrib/seeds/makeseeds.py16
-rw-r--r--contrib/seeds/nodes_main.txt1831
-rw-r--r--contrib/testgen/base58.py1
-rwxr-xr-xcontrib/testgen/gen_base58_test_vectors.py1
-rw-r--r--contrib/verify-commits/allow-revsig-commits104
-rwxr-xr-xcontrib/verify-commits/gpg.sh40
-rw-r--r--contrib/verify-commits/trusted-keys4
-rw-r--r--contrib/verify-commits/trusted-sha512-root-commit1
-rwxr-xr-xcontrib/verify-commits/verify-commits.sh72
-rwxr-xr-xcontrib/zmq/zmq_sub.py100
-rwxr-xr-xcontrib/zmq/zmq_sub3.4.py89
37 files changed, 1568 insertions, 988 deletions
diff --git a/contrib/README.md b/contrib/README.md
index 4ea9700f59..6f750106e4 100644
--- a/contrib/README.md
+++ b/contrib/README.md
@@ -3,7 +3,7 @@ Repository Tools
### [Developer tools](/contrib/devtools) ###
Specific tools for developers working on this repository.
-Contains the script `github-merge.py` for merging github pull requests securely and signing them using GPG.
+Contains the script `github-merge.py` for merging GitHub pull requests securely and signing them using GPG.
### [Verify-Commits](/contrib/verify-commits) ###
Tool to verify that every merge commit was signed by a developer using the above `github-merge.py` script.
diff --git a/contrib/debian/copyright b/contrib/debian/copyright
index 0fa06f1aa9..72d64ce62d 100644
--- a/contrib/debian/copyright
+++ b/contrib/debian/copyright
@@ -5,7 +5,7 @@ Upstream-Contact: Satoshi Nakamoto <satoshin@gmx.com>
Source: https://github.com/bitcoin/bitcoin
Files: *
-Copyright: 2009-2016, Bitcoin Core Developers
+Copyright: 2009-2017, Bitcoin Core Developers
License: Expat
Comment: The Bitcoin Core Developers encompasses the current developers listed on bitcoin.org,
as well as the numerous contributors to the project.
diff --git a/contrib/debian/examples/bitcoin.conf b/contrib/debian/examples/bitcoin.conf
index afbc7882e0..923ab75314 100644
--- a/contrib/debian/examples/bitcoin.conf
+++ b/contrib/debian/examples/bitcoin.conf
@@ -116,12 +116,7 @@
# running on another host using this option:
#rpcconnect=127.0.0.1
-# Transaction Fee Changes in 0.10.0
-
-# Send transactions as zero-fee transactions if possible (default: 0)
-#sendfreetransactions=0
-
-# Create transactions that have enough fees (or priority) so they are likely to begin confirmation within n blocks (default: 1).
+# Create transactions that have enough fees so they are likely to begin confirmation within n blocks (default: 6).
# This setting is over-ridden by the -paytxfee option.
#txconfirmtarget=n
diff --git a/contrib/devtools/README.md b/contrib/devtools/README.md
index 6c0047833f..67c5e15a15 100644
--- a/contrib/devtools/README.md
+++ b/contrib/devtools/README.md
@@ -8,11 +8,6 @@ check-doc.py
Check if all command line args are documented. The return value indicates the
number of undocumented args.
-clang-format.py
-===============
-
-A script to format cpp source code according to [.clang-format](../../src/.clang-format). This should only be applied to new files or files which are currently not actively developed on. Also, git subtrees are not subject to formatting.
-
clang-format-diff.py
===================
@@ -24,6 +19,7 @@ the script should be called from the git root folder as follows.
```
git diff -U0 HEAD~1.. | ./contrib/devtools/clang-format-diff.py -p1 -i -v
```
+
copyright\_header.py
====================
@@ -129,7 +125,7 @@ check or whatever).
This means that there are no potential race conditions (where a
pullreq gets updated while you're reviewing it, but before you click
-merge), and when using GPG signatures, that even a compromised github
+merge), and when using GPG signatures, that even a compromised GitHub
couldn't mess with the sources.
Setup
diff --git a/contrib/devtools/check-doc.py b/contrib/devtools/check-doc.py
index 249214e931..445175ec2b 100755
--- a/contrib/devtools/check-doc.py
+++ b/contrib/devtools/check-doc.py
@@ -21,7 +21,7 @@ CMD_GREP_DOCS = r"egrep -r -I 'HelpMessageOpt\(\"\-[^\"=]+?(=|\")' %s" % (CMD_RO
REGEX_ARG = re.compile(r'(?:map(?:Multi)?Args(?:\.count\(|\[)|Get(?:Bool)?Arg\()\"(\-[^\"]+?)\"')
REGEX_DOC = re.compile(r'HelpMessageOpt\(\"(\-[^\"=]+?)(?:=|\")')
# list unsupported, deprecated and duplicate args as they need no documentation
-SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-prematurewitness', '-walletprematurewitness', '-promiscuousmempoolflags', '-blockminsize'])
+SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-prematurewitness', '-walletprematurewitness', '-promiscuousmempoolflags', '-blockminsize', '-sendfreetransactions'])
def main():
used = check_output(CMD_GREP_ARGS, shell=True)
diff --git a/contrib/devtools/clang-format-diff.py b/contrib/devtools/clang-format-diff.py
index 13d2573b9f..7ea49b65e1 100755
--- a/contrib/devtools/clang-format-diff.py
+++ b/contrib/devtools/clang-format-diff.py
@@ -128,7 +128,7 @@ def main():
line_count = int(match.group(3))
if line_count == 0:
continue
- end_line = start_line + line_count - 1;
+ end_line = start_line + line_count - 1
lines_by_file.setdefault(filename, []).extend(
['-lines', str(start_line) + ':' + str(end_line)])
@@ -147,7 +147,7 @@ def main():
stderr=None, stdin=subprocess.PIPE)
stdout, stderr = p.communicate()
if p.returncode != 0:
- sys.exit(p.returncode);
+ sys.exit(p.returncode)
if not args.i:
with open(filename) as f:
diff --git a/contrib/devtools/clang-format.py b/contrib/devtools/clang-format.py
deleted file mode 100755
index cee99047ac..0000000000
--- a/contrib/devtools/clang-format.py
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env python
-'''
-Wrapper script for clang-format
-
-Copyright (c) 2015 MarcoFalke
-Copyright (c) 2015 The Bitcoin Core developers
-Distributed under the MIT software license, see the accompanying
-file COPYING or http://www.opensource.org/licenses/mit-license.php.
-'''
-
-import os
-import sys
-import subprocess
-
-tested_versions = ['3.6.0', '3.6.1', '3.6.2'] # A set of versions known to produce the same output
-accepted_file_extensions = ('.h', '.cpp') # Files to format
-
-def check_clang_format_version(clang_format_exe):
- try:
- output = subprocess.check_output([clang_format_exe, '-version'])
- for ver in tested_versions:
- if ver in output:
- print "Detected clang-format version " + ver
- return
- raise RuntimeError("Untested version: " + output)
- except Exception as e:
- print 'Could not verify version of ' + clang_format_exe + '.'
- raise e
-
-def check_command_line_args(argv):
- required_args = ['{clang-format-exe}', '{files}']
- example_args = ['clang-format-3.x', 'src/main.cpp', 'src/wallet/*']
-
- if(len(argv) < len(required_args) + 1):
- for word in (['Usage:', argv[0]] + required_args):
- print word,
- print ''
- for word in (['E.g:', argv[0]] + example_args):
- print word,
- print ''
- sys.exit(1)
-
-def run_clang_format(clang_format_exe, files):
- for target in files:
- if os.path.isdir(target):
- for path, dirs, files in os.walk(target):
- run_clang_format(clang_format_exe, (os.path.join(path, f) for f in files))
- elif target.endswith(accepted_file_extensions):
- print "Format " + target
- subprocess.check_call([clang_format_exe, '-i', '-style=file', target], stdout=open(os.devnull, 'wb'), stderr=subprocess.STDOUT)
- else:
- print "Skip " + target
-
-def main(argv):
- check_command_line_args(argv)
- clang_format_exe = argv[1]
- files = argv[2:]
- check_clang_format_version(clang_format_exe)
- run_clang_format(clang_format_exe, files)
-
-if __name__ == "__main__":
- main(sys.argv)
diff --git a/contrib/devtools/github-merge.py b/contrib/devtools/github-merge.py
index aae966a8f6..f1b6a12fd0 100755
--- a/contrib/devtools/github-merge.py
+++ b/contrib/devtools/github-merge.py
@@ -15,9 +15,10 @@
# In case of a clean merge that is accepted by the user, the local branch with
# name $BRANCH is overwritten with the merged result, and optionally pushed.
from __future__ import division,print_function,unicode_literals
-import os,sys
+import os
from sys import stdin,stdout,stderr
import argparse
+import hashlib
import subprocess
import json,codecs
try:
@@ -69,6 +70,35 @@ def ask_prompt(text):
print("",file=stderr)
return reply
+def get_symlink_files():
+ files = sorted(subprocess.check_output([GIT, 'ls-tree', '--full-tree', '-r', 'HEAD']).splitlines())
+ ret = []
+ for f in files:
+ if (int(f.decode('utf-8').split(" ")[0], 8) & 0o170000) == 0o120000:
+ ret.append(f.decode('utf-8').split("\t")[1])
+ return ret
+
+def tree_sha512sum():
+ files = sorted(subprocess.check_output([GIT, 'ls-tree', '--full-tree', '-r', '--name-only', 'HEAD']).splitlines())
+ overall = hashlib.sha512()
+ for f in files:
+ intern = hashlib.sha512()
+ fi = open(f, 'rb')
+ while True:
+ piece = fi.read(65536)
+ if piece:
+ intern.update(piece)
+ else:
+ break
+ fi.close()
+ dig = intern.hexdigest()
+ overall.update(dig.encode("utf-8"))
+ overall.update(" ".encode("utf-8"))
+ overall.update(f)
+ overall.update("\n".encode("utf-8"))
+ return overall.hexdigest()
+
+
def parse_arguments():
epilog = '''
In addition, you can set the following git configuration variables:
@@ -157,6 +187,9 @@ def main():
subprocess.check_call([GIT,'checkout','-q','-b',local_merge_branch])
try:
+ # Go up to the repository's root.
+ toplevel = subprocess.check_output([GIT,'rev-parse','--show-toplevel']).strip()
+ os.chdir(toplevel)
# Create unsigned merge commit.
if title:
firstline = 'Merge #%s: %s' % (pull,title)
@@ -175,14 +208,31 @@ def main():
print("ERROR: Creating merge failed (already merged?).",file=stderr)
exit(4)
+ symlink_files = get_symlink_files()
+ for f in symlink_files:
+ print("ERROR: File %s was a symlink" % f)
+ if len(symlink_files) > 0:
+ exit(4)
+
+ # Put tree SHA512 into the message
+ try:
+ first_sha512 = tree_sha512sum()
+ message += '\n\nTree-SHA512: ' + first_sha512
+ except subprocess.CalledProcessError as e:
+ printf("ERROR: Unable to compute tree hash")
+ exit(4)
+ try:
+ subprocess.check_call([GIT,'commit','--amend','-m',message.encode('utf-8')])
+ except subprocess.CalledProcessError as e:
+ printf("ERROR: Cannot update message.",file=stderr)
+ exit(4)
+
print('%s#%s%s %s %sinto %s%s' % (ATTR_RESET+ATTR_PR,pull,ATTR_RESET,title,ATTR_RESET+ATTR_PR,branch,ATTR_RESET))
subprocess.check_call([GIT,'log','--graph','--topo-order','--pretty=format:'+COMMIT_FORMAT,base_branch+'..'+head_branch])
print()
+
# Run test command if configured.
if testcmd:
- # Go up to the repository's root.
- toplevel = subprocess.check_output([GIT,'rev-parse','--show-toplevel']).strip()
- os.chdir(toplevel)
if subprocess.call(testcmd,shell=True):
print("ERROR: Running %s failed." % testcmd,file=stderr)
exit(5)
@@ -218,6 +268,11 @@ def main():
print("ERROR: Merge rejected.",file=stderr)
exit(7)
+ second_sha512 = tree_sha512sum()
+ if first_sha512 != second_sha512:
+ print("ERROR: Tree hash changed unexpectedly",file=stderr)
+ exit(8)
+
# Sign the merge commit.
reply = ask_prompt("Type 's' to sign off on the merge.")
if reply == 's':
diff --git a/contrib/devtools/optimize-pngs.py b/contrib/devtools/optimize-pngs.py
index 0f653e010b..9286ab731f 100755
--- a/contrib/devtools/optimize-pngs.py
+++ b/contrib/devtools/optimize-pngs.py
@@ -39,7 +39,7 @@ for folder in folders:
if extension.lower() == '.png':
print("optimizing "+file+"..."),
file_path = os.path.join(absFolder, file)
- fileMetaMap = {'file' : file, 'osize': os.path.getsize(file_path), 'sha256Old' : file_hash(file_path)};
+ fileMetaMap = {'file' : file, 'osize': os.path.getsize(file_path), 'sha256Old' : file_hash(file_path)}
fileMetaMap['contentHashPre'] = content_hash(file_path)
pngCrushOutput = ""
diff --git a/contrib/devtools/test-security-check.py b/contrib/devtools/test-security-check.py
index c0f120392e..18f9835faa 100755
--- a/contrib/devtools/test-security-check.py
+++ b/contrib/devtools/test-security-check.py
@@ -7,7 +7,6 @@ Test script for security-check.py
'''
from __future__ import division,print_function
import subprocess
-import sys
import unittest
def write_testcode(filename):
diff --git a/contrib/devtools/update-translations.py b/contrib/devtools/update-translations.py
index 78b9f9d179..2011841005 100755
--- a/contrib/devtools/update-translations.py
+++ b/contrib/devtools/update-translations.py
@@ -65,6 +65,14 @@ def split_format_specifiers(specifiers):
else:
other.append(s)
+ # If both numeric format specifiers and "others" are used, assume we're dealing
+ # with a Qt-formatted message. In the case of Qt formatting (see https://doc.qt.io/qt-5/qstring.html#arg)
+ # only numeric formats are replaced at all. This means "(percentage: %1%)" is valid, without needing
+ # any kind of escaping that would be necessary for strprintf. Without this, this function
+ # would wrongly detect '%)' as a printf format specifier.
+ if numeric:
+ other = []
+
# numeric (Qt) can be present in any order, others (strprintf) must be in specified order
return set(numeric),other
diff --git a/contrib/gitian-build.sh b/contrib/gitian-build.sh
index 53c24e3a87..6ee5df4703 100755
--- a/contrib/gitian-build.sh
+++ b/contrib/gitian-build.sh
@@ -41,7 +41,7 @@ Options:
-c|--commit Indicate that the version argument is for a commit or branch
-u|--url Specify the URL of the repository. Default is https://github.com/bitcoin/bitcoin
-v|--verify Verify the gitian build
--b|--build Do a gitiain build
+-b|--build Do a gitian build
-s|--sign Make signed binaries for Windows and Mac OSX
-B|--buildsign Build both signed and unsigned binaries
-o|--os Specify which Operating Systems the build is for. Default is lwx. l for linux, w for windows, x for osx
diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml
index 6f43119ba2..00af4bdc6f 100644
--- a/contrib/gitian-descriptors/gitian-linux.yml
+++ b/contrib/gitian-descriptors/gitian-linux.yml
@@ -1,5 +1,5 @@
---
-name: "bitcoin-linux-0.13"
+name: "bitcoin-linux-0.15"
enable_cache: true
suites:
- "trusty"
diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml
index 991976d59e..05cc65414f 100644
--- a/contrib/gitian-descriptors/gitian-osx.yml
+++ b/contrib/gitian-descriptors/gitian-osx.yml
@@ -1,5 +1,5 @@
---
-name: "bitcoin-osx-0.13"
+name: "bitcoin-osx-0.15"
enable_cache: true
suites:
- "trusty"
diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml
index fe01b5b957..6fead7c208 100644
--- a/contrib/gitian-descriptors/gitian-win.yml
+++ b/contrib/gitian-descriptors/gitian-win.yml
@@ -1,5 +1,5 @@
---
-name: "bitcoin-win-0.13"
+name: "bitcoin-win-0.15"
enable_cache: true
suites:
- "trusty"
diff --git a/contrib/gitian-keys/jtimon-key.pgp b/contrib/gitian-keys/jtimon-key.pgp
new file mode 100644
index 0000000000..88d0de1503
--- /dev/null
+++ b/contrib/gitian-keys/jtimon-key.pgp
Binary files differ
diff --git a/contrib/linearize/README.md b/contrib/linearize/README.md
index adc9a559cc..0971e7816b 100644
--- a/contrib/linearize/README.md
+++ b/contrib/linearize/README.md
@@ -32,8 +32,11 @@ Required configuration file settings:
* `output`: Output directory for linearized `blocks/blkNNNNN.dat` output.
Optional config file setting for linearize-data:
-* `file_timestamp`: Set each file's last-modified time to that of the most
-recent block in that file.
+* `debug_output`: Some printouts may not always be desired. If true, such output
+will be printed.
+* `file_timestamp`: Set each file's last-accessed and last-modified times,
+respectively, to the current time and to the timestamp of the most recent block
+written to the script's blockchain.
* `genesis`: The hash of the genesis block in the blockchain.
* `input`: bitcoind blocks/ directory containing blkNNNNN.dat
* `hashlist`: text file containing list of block hashes created by
@@ -41,6 +44,9 @@ linearize-hashes.py.
* `max_out_sz`: Maximum size for files created by the `output_file` option.
(Default: `1000*1000*1000 bytes`)
* `netmagic`: Network magic number.
+* `out_of_order_cache_sz`: If out-of-order blocks are being read, the block can
+be written to a cache so that the blockchain doesn't have to be seeked again.
+This option specifies the cache size. (Default: `100*1000*1000 bytes`)
* `rev_hash_bytes`: If true, the block hash list written by linearize-hashes.py
will be byte-reversed when read by linearize-data.py. See the linearize-hashes
entry for more information.
diff --git a/contrib/linearize/example-linearize.cfg b/contrib/linearize/example-linearize.cfg
index cccdd79213..2cc910edfe 100644
--- a/contrib/linearize/example-linearize.cfg
+++ b/contrib/linearize/example-linearize.cfg
@@ -1,4 +1,3 @@
-
# bitcoind RPC settings (linearize-hashes)
rpcuser=someuser
rpcpassword=somepassword
@@ -21,11 +20,23 @@ input=/home/example/.bitcoin/blocks
#genesis=000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
#input=/home/example/.bitcoin/testnet3/blocks
+# "output" option causes blockchain files to be written to the given location,
+# with "output_file" ignored. If not used, "output_file" is used instead.
+# output=/home/example/blockchain_directory
output_file=/home/example/Downloads/bootstrap.dat
hashlist=hashlist.txt
-# Maxmimum size in bytes of out-of-order blocks cache in memory
+# Maximum size in bytes of out-of-order blocks cache in memory
out_of_order_cache_sz = 100000000
# Do we want the reverse the hash bytes coming from getblockhash?
rev_hash_bytes = False
+
+# On a new month, do we want to set the access and modify times of the new
+# blockchain file?
+file_timestamp = 0
+# Do we want to split the blockchain files given a new month or specific height?
+split_timestamp = 0
+
+# Do we want debug printouts?
+debug_output = False
diff --git a/contrib/linearize/linearize-data.py b/contrib/linearize/linearize-data.py
index 043bf2e814..afcec2b60a 100755
--- a/contrib/linearize/linearize-data.py
+++ b/contrib/linearize/linearize-data.py
@@ -8,16 +8,10 @@
#
from __future__ import print_function, division
-try: # Python 3
- import http.client as httplib
-except ImportError: # Python 2
- import httplib
-import json
import struct
import re
import os
import os.path
-import base64
import sys
import hashlib
import datetime
@@ -140,7 +134,7 @@ class BlockDataCopier:
if not self.fileOutput and ((self.outsz + blockSizeOnDisk) > self.maxOutSz):
self.outF.close()
if self.setFileTime:
- os.utime(outFname, (int(time.time()), highTS))
+ os.utime(self.outFname, (int(time.time()), self.highTS))
self.outF = None
self.outFname = None
self.outFn = self.outFn + 1
@@ -148,12 +142,12 @@ class BlockDataCopier:
(blkDate, blkTS) = get_blk_dt(blk_hdr)
if self.timestampSplit and (blkDate > self.lastDate):
- print("New month " + blkDate.strftime("%Y-%m") + " @ " + hash_str)
- lastDate = blkDate
- if outF:
- outF.close()
- if setFileTime:
- os.utime(outFname, (int(time.time()), highTS))
+ print("New month " + blkDate.strftime("%Y-%m") + " @ " + self.hash_str)
+ self.lastDate = blkDate
+ if self.outF:
+ self.outF.close()
+ if self.setFileTime:
+ os.utime(self.outFname, (int(time.time()), self.highTS))
self.outF = None
self.outFname = None
self.outFn = self.outFn + 1
@@ -161,11 +155,11 @@ class BlockDataCopier:
if not self.outF:
if self.fileOutput:
- outFname = self.settings['output_file']
+ self.outFname = self.settings['output_file']
else:
- outFname = os.path.join(self.settings['output'], "blk%05d.dat" % self.outFn)
- print("Output file " + outFname)
- self.outF = open(outFname, "wb")
+ self.outFname = os.path.join(self.settings['output'], "blk%05d.dat" % self.outFn)
+ print("Output file " + self.outFname)
+ self.outF = open(self.outFname, "wb")
self.outF.write(inhdr)
self.outF.write(blk_hdr)
@@ -229,13 +223,16 @@ class BlockDataCopier:
blk_hdr = self.inF.read(80)
inExtent = BlockExtent(self.inFn, self.inF.tell(), inhdr, blk_hdr, inLen)
- hash_str = calc_hash_str(blk_hdr)
- if not hash_str in blkmap:
- print("Skipping unknown block " + hash_str)
+ self.hash_str = calc_hash_str(blk_hdr)
+ if not self.hash_str in blkmap:
+ # Because blocks can be written to files out-of-order as of 0.10, the script
+ # may encounter blocks it doesn't know about. Treat as debug output.
+ if settings['debug_output'] == 'true':
+ print("Skipping unknown block " + self.hash_str)
self.inF.seek(inLen, os.SEEK_CUR)
continue
- blkHeight = self.blkmap[hash_str]
+ blkHeight = self.blkmap[self.hash_str]
self.blkCountIn += 1
if self.blkCountOut == blkHeight:
@@ -301,12 +298,15 @@ if __name__ == '__main__':
settings['max_out_sz'] = 1000 * 1000 * 1000
if 'out_of_order_cache_sz' not in settings:
settings['out_of_order_cache_sz'] = 100 * 1000 * 1000
+ if 'debug_output' not in settings:
+ settings['debug_output'] = 'false'
settings['max_out_sz'] = int(settings['max_out_sz'])
settings['split_timestamp'] = int(settings['split_timestamp'])
settings['file_timestamp'] = int(settings['file_timestamp'])
settings['netmagic'] = unhexlify(settings['netmagic'].encode('utf-8'))
settings['out_of_order_cache_sz'] = int(settings['out_of_order_cache_sz'])
+ settings['debug_output'] = settings['debug_output'].lower()
if 'output_file' not in settings and 'output' not in settings:
print("Missing output file / directory")
diff --git a/contrib/linearize/linearize-hashes.py b/contrib/linearize/linearize-hashes.py
index f749da5396..00a54d0820 100755
--- a/contrib/linearize/linearize-hashes.py
+++ b/contrib/linearize/linearize-hashes.py
@@ -13,7 +13,6 @@ try: # Python 3
except ImportError: # Python 2
import httplib
import json
-import struct
import re
import base64
import sys
diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus
index 73d4f159d8..5995f9f438 100755
--- a/contrib/macdeploy/macdeployqtplus
+++ b/contrib/macdeploy/macdeployqtplus
@@ -340,7 +340,7 @@ def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploym
# install_name_tool the new id into the binary
changeInstallName(framework.installName, framework.deployedInstallName, binaryPath, verbose)
- # Copy farmework to app bundle.
+ # Copy framework to app bundle.
deployedBinaryPath = copyFramework(framework, bundlePath, verbose)
# Skip the rest if already was deployed.
if deployedBinaryPath is None:
@@ -492,7 +492,7 @@ ap.add_argument("-no-strip", dest="strip", action="store_false", default=True, h
ap.add_argument("-sign", dest="sign", action="store_true", default=False, help="sign .app bundle with codesign tool")
ap.add_argument("-dmg", nargs="?", const="", metavar="basename", help="create a .dmg disk image; if basename is not specified, a camel-cased version of the app name is used")
ap.add_argument("-fancy", nargs=1, metavar="plist", default=[], help="make a fancy looking disk image using the given plist file with instructions; requires -dmg to work")
-ap.add_argument("-add-qt-tr", nargs=1, metavar="languages", default=[], help="add Qt translation files to the bundle's ressources; the language list must be separated with commas, not with whitespace")
+ap.add_argument("-add-qt-tr", nargs=1, metavar="languages", default=[], help="add Qt translation files to the bundle's resources; the language list must be separated with commas, not with whitespace")
ap.add_argument("-translations-dir", nargs=1, metavar="path", default=None, help="Path to Qt's translation files")
ap.add_argument("-add-resources", nargs="+", metavar="path", default=[], help="list of additional files or folders to be copied into the bundle's resources; must be the last argument")
ap.add_argument("-volname", nargs=1, metavar="volname", default=[], help="custom volume name for dmg")
diff --git a/contrib/qos/README.md b/contrib/qos/README.md
index 5e0a975fc6..0ded87c58f 100644
--- a/contrib/qos/README.md
+++ b/contrib/qos/README.md
@@ -1,5 +1,5 @@
-### Qos ###
+### QoS (Quality of service) ###
-This is a Linux bash script that will set up tc to limit the outgoing bandwidth for connections to the Bitcoin network. It limits outbound TCP traffic with a source or destination port of 8333, but not if the destination IP is within a LAN (defined as 192.168.x.x).
+This is a Linux bash script that will set up tc to limit the outgoing bandwidth for connections to the Bitcoin network. It limits outbound TCP traffic with a source or destination port of 8333, but not if the destination IP is within a LAN.
This means one can have an always-on bitcoind instance running, and another local bitcoind/bitcoin-qt instance which connects to this node and receives blocks from it.
diff --git a/contrib/qos/tc.sh b/contrib/qos/tc.sh
index aaf5e1fa11..0d1dd65b4f 100644
--- a/contrib/qos/tc.sh
+++ b/contrib/qos/tc.sh
@@ -1,4 +1,4 @@
-# Copyright (c) 2013 The Bitcoin Core developers
+# Copyright (c) 2017 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -8,8 +8,10 @@ IF="eth0"
LINKCEIL="1gbit"
#limit outbound Bitcoin protocol traffic to this rate
LIMIT="160kbit"
-#defines the address space for which you wish to disable rate limiting
-LOCALNET="192.168.0.0/16"
+#defines the IPv4 address space for which you wish to disable rate limiting
+LOCALNET_V4="192.168.0.0/16"
+#defines the IPv6 address space for which you wish to disable rate limiting
+LOCALNET_V6="fe80::/10"
#delete existing rules
tc qdisc del dev ${IF} root
@@ -28,6 +30,12 @@ tc class add dev ${IF} parent 1:1 classid 1:11 htb rate ${LIMIT} ceil ${LIMIT} p
tc filter add dev ${IF} parent 1: protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev ${IF} parent 1: protocol ip prio 2 handle 2 fw classid 1:11
+if [ ! -z "${LOCALNET_V6}" ] ; then
+ # v6 cannot have the same priority value as v4
+ tc filter add dev ${IF} parent 1: protocol ipv6 prio 3 handle 1 fw classid 1:10
+ tc filter add dev ${IF} parent 1: protocol ipv6 prio 4 handle 2 fw classid 1:11
+fi
+
#delete any existing rules
#disable for now
#ret=0
@@ -37,9 +45,15 @@ tc filter add dev ${IF} parent 1: protocol ip prio 2 handle 2 fw classid 1:11
#done
#limit outgoing traffic to and from port 8333. but not when dealing with a host on the local network
-# (defined by $LOCALNET)
-# --set-mark marks packages matching these criteria with the number "2"
-# these packages are filtered by the tc filter with "handle 2"
+# (defined by $LOCALNET_V4 and $LOCALNET_V6)
+# --set-mark marks packages matching these criteria with the number "2" (v4)
+# --set-mark marks packages matching these criteria with the number "4" (v6)
+# these packets are filtered by the tc filter with "handle 2"
# this filter sends the packages into the 1:11 class, and this class is limited to ${LIMIT}
-iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d ${LOCALNET} -j MARK --set-mark 0x2
-iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d ${LOCALNET} -j MARK --set-mark 0x2
+iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2
+iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2
+
+if [ ! -z "${LOCALNET_V6}" ] ; then
+ ip6tables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4
+ ip6tables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4
+fi
diff --git a/contrib/rpm/README.md b/contrib/rpm/README.md
index aecb3ba84f..e1fd0b317b 100644
--- a/contrib/rpm/README.md
+++ b/contrib/rpm/README.md
@@ -31,7 +31,7 @@ through `Source23` are used.
Sources 30-39 should be reserved for SELinux related files. Currently only
`Source30` through `Source32` are used. Until those files are in a tagged
release, the full URL specified in the RPM spec file will not work. You can get
-them from the git ropository where you retrieved this file.
+them from the git repository where you retrieved this file.
Sources 100+ are for files that are not source tarballs and are not maintained
in the bitcoin git repository. At present only an SVG version of the Bitcoin
diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md
index c595f83eb9..afe902fd7f 100644
--- a/contrib/seeds/README.md
+++ b/contrib/seeds/README.md
@@ -1,11 +1,19 @@
-### Seeds ###
+# Seeds
Utility to generate the seeds.txt list that is compiled into the client
(see [src/chainparamsseeds.h](/src/chainparamsseeds.h) and other utilities in [contrib/seeds](/contrib/seeds)).
+Be sure to update `PATTERN_AGENT` in `makeseeds.py` to include the current version,
+and remove old versions as necessary.
+
The seeds compiled into the release are created from sipa's DNS seed data, like this:
curl -s http://bitcoin.sipa.be/seeds.txt > seeds_main.txt
- python makeseeds.py < seeds_main.txt > nodes_main.txt
- python generate-seeds.py . > ../../src/chainparamsseeds.h
+ python3 makeseeds.py < seeds_main.txt > nodes_main.txt
+ python3 generate-seeds.py . > ../../src/chainparamsseeds.h
+
+## Dependencies
+
+Ubuntu:
+ sudo apt-get install python3-dnspython
diff --git a/contrib/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py
index f43dc0b218..b0ac92ae03 100755
--- a/contrib/seeds/generate-seeds.py
+++ b/contrib/seeds/generate-seeds.py
@@ -1,5 +1,5 @@
-#!/usr/bin/env python
-# Copyright (c) 2014 Wladimir J. van der Laan
+#!/usr/bin/env python3
+# Copyright (c) 2014-2017 Wladimir J. van der Laan
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
'''
@@ -31,7 +31,7 @@ The output will be two data structures with the peers in binary format:
These should be pasted into `src/chainparamsseeds.h`.
'''
-from __future__ import print_function, division
+
from base64 import b32decode
from binascii import a2b_hex
import sys, os
diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py
index 95498d20e2..34f0f57671 100755
--- a/contrib/seeds/makeseeds.py
+++ b/contrib/seeds/makeseeds.py
@@ -1,5 +1,5 @@
-#!/usr/bin/env python
-# Copyright (c) 2013-2016 The Bitcoin Core developers
+#!/usr/bin/env python3
+# Copyright (c) 2013-2017 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
#
@@ -14,13 +14,13 @@ MIN_BLOCKS = 337600
# These are hosts that have been observed to be behaving strangely (e.g.
# aggressively connecting to every node).
-SUSPICIOUS_HOSTS = set([
+SUSPICIOUS_HOSTS = {
"130.211.129.106", "178.63.107.226",
"83.81.130.26", "88.198.17.7", "148.251.238.178", "176.9.46.6",
"54.173.72.127", "54.174.10.182", "54.183.64.54", "54.194.231.211",
"54.66.214.167", "54.66.220.137", "54.67.33.14", "54.77.251.214",
"54.94.195.96", "54.94.200.247"
-])
+}
import re
import sys
@@ -30,7 +30,7 @@ import collections
PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):(\d+)$")
PATTERN_IPV6 = re.compile(r"^\[([0-9a-z:]+)\]:(\d+)$")
PATTERN_ONION = re.compile(r"^([abcdefghijklmnopqrstuvwxyz234567]{16}\.onion):(\d+)$")
-PATTERN_AGENT = re.compile(r"^(\/Satoshi:0\.8\.6\/|\/Satoshi:0\.9\.(2|3|4|5)\/|\/Satoshi:0\.10\.\d{1,2}\/|\/Satoshi:0\.11\.\d{1,2}\/)$")
+PATTERN_AGENT = re.compile(r"^(/Satoshi:0.12.(0|1|99)/|/Satoshi:0.13.(0|1|2|99)/)$")
def parseline(line):
sline = line.split()
@@ -104,7 +104,7 @@ def filtermultiport(ips):
hist = collections.defaultdict(list)
for ip in ips:
hist[ip['sortkey']].append(ip)
- return [value[0] for (key,value) in hist.items() if len(value)==1]
+ return [value[0] for (key,value) in list(hist.items()) if len(value)==1]
# Based on Greg Maxwell's seed_filter.py
def filterbyasn(ips, max_per_asn, max_total):
@@ -164,9 +164,9 @@ def main():
for ip in ips:
if ip['net'] == 'ipv6':
- print '[%s]:%i' % (ip['ip'], ip['port'])
+ print('[%s]:%i' % (ip['ip'], ip['port']))
else:
- print '%s:%i' % (ip['ip'], ip['port'])
+ print('%s:%i' % (ip['ip'], ip['port']))
if __name__ == '__main__':
main()
diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt
index f1854b27f9..0451771dae 100644
--- a/contrib/seeds/nodes_main.txt
+++ b/contrib/seeds/nodes_main.txt
@@ -1,937 +1,1168 @@
-5.2.145.201:8333
-5.22.142.214:8333
-5.53.172.197:8333
-5.189.161.164:8333
-5.230.140.166:8333
-5.231.3.130:8333
-5.255.80.103:8333
-14.202.230.49:8333
-18.85.11.130:8333
-23.91.97.25:8333
-23.94.100.122:8333
-23.95.99.132:8333
-24.115.8.206:8333
-24.127.128.191:8333
-24.154.178.25:8333
-24.207.103.43:8333
-24.207.104.105:8333
-24.210.230.150:8333
-24.224.18.84:8333
-24.246.168.106:8333
-27.254.64.47:8333
-31.6.71.123:8333
-31.6.71.124:8333
-31.14.134.13:8333
-31.30.36.220:8333
-31.164.6.104:8333
+2.7.8.12:8333
+2.228.70.198:8333
+5.39.64.7:8333
+5.45.80.34:38333
+5.51.160.38:8333
+5.61.33.33:8333
+5.61.37.12:8333
+5.95.80.47:8333
+5.102.164.173:8333
+5.175.71.130:8333
+5.189.165.22:8333
+5.199.130.228:8333
+5.228.100.222:8333
+5.255.64.231:8333
+13.93.6.133:8333
+18.85.34.10:8333
+18.241.0.63:8333
+23.28.128.65:8333
+23.248.113.52:8333
+23.253.151.73:8333
+24.4.96.121:8333
+24.69.65.191:8333
+24.87.8.43:8333
+24.150.224.110:8333
+24.227.69.146:8333
+27.0.235.33:8333
31.170.106.203:8333
-31.185.134.201:8333
-31.204.128.99:8333
-31.204.128.219:8333
-37.1.219.88:8333
-37.97.132.109:8333
-37.120.160.55:8333
+31.184.197.96:8333
+31.214.240.56:8333
+37.1.202.134:8333
+37.18.74.232:8333
+37.34.48.17:8333
+37.48.64.140:8333
+37.97.141.116:8333
+37.120.164.16:8333
37.120.169.123:8333
-37.139.32.46:8333
-37.221.163.218:8333
-38.130.192.72:8333
-41.75.96.80:8333
-45.3.0.49:8333
-45.33.72.185:8333
-45.33.96.129:8333
-45.56.4.63:8333
-45.79.0.127:8333
-45.79.80.102:8333
-45.79.97.30:8333
-45.79.132.219:8333
-46.21.97.135:8333
-46.28.205.67:8333
-46.28.206.188:8333
-46.29.20.209:8333
-46.50.234.179:8333
-46.101.160.168:8333
-46.166.161.35:8333
-46.166.161.103:8333
-46.182.132.100:8333
-46.218.227.92:8333
-46.226.109.20:8333
-46.227.66.132:8333
-46.227.66.138:8333
-46.229.165.154:8333
-46.229.165.155:8333
+37.143.9.128:8333
+37.153.172.227:8333
+37.193.227.16:8333
+37.205.8.78:8333
+37.220.0.114:8333
+37.232.218.199:8333
+38.140.161.53:8333
+40.87.70.120:8333
+41.162.163.93:8333
+42.2.198.48:8333
+45.20.67.1:8333
+45.55.197.77:8333
+45.56.97.63:8333
+45.58.38.162:8333
+45.63.1.33:8333
+45.79.2.70:8333
+46.16.240.98:8333
+46.19.137.74:8333
+46.28.206.146:8333
+46.32.252.197:8333
+46.59.13.59:8333
+46.59.39.195:8333
+46.148.16.210:8333
+46.160.195.121:8333
+46.166.142.21:8333
+46.166.160.29:8330
+46.188.44.20:8333
46.229.238.187:8333
-46.234.104.48:8333
-46.239.107.74:8333
-46.244.0.138:8333
-46.254.72.195:8333
-50.5.13.44:8333
-50.7.37.114:8333
-50.30.37.103:8333
-50.39.105.60:8333
-50.106.40.231:8333
-52.29.0.37:8333
-52.76.192.246:8333
-54.152.192.179:8333
-54.169.64.174:8333
-54.175.160.22:8333
-54.199.128.0:8333
-58.96.171.129:8333
-58.161.238.57:8333
-60.251.195.221:8333
-61.35.225.19:8333
+46.231.16.149:8333
+47.88.100.130:8333
+47.89.192.134:8333
+47.185.194.160:8333
+47.189.129.218:8333
+49.65.2.140:8333
+50.3.72.129:8333
+50.31.99.225:8333
+51.175.33.95:8333
+52.1.165.219:8333
+52.10.170.186:8333
+52.51.128.216:8333
+54.197.130.244:8333
+58.59.2.22:8333
+58.84.6.81:8333
+59.125.8.143:8333
+59.167.130.139:8333
+61.47.2.20:8333
62.43.130.178:8333
-62.65.39.12:8333
+62.76.96.6:8333
62.107.200.30:8333
+62.133.15.58:8333
62.133.194.2:8333
-62.181.238.186:8333
-62.183.22.50:8333
-62.210.85.120:8333
-62.210.162.89:8333
+62.133.194.156:8333
+62.138.1.95:8333
+62.216.238.3:8333
62.238.34.125:8333
-64.25.171.73:8333
-64.27.166.30:8333
-64.53.137.101:8333
-64.71.72.44:8333
+63.137.40.207:8333
+63.231.96.109:8333
+64.78.240.150:8333
64.83.225.146:8333
-64.121.3.163:8333
-64.203.102.86:8333
-65.94.131.59:8333
-65.188.136.233:8333
-66.11.162.218:8333
-66.23.228.133:8333
-66.90.137.89:8333
-66.114.33.49:8333
-66.150.105.77:8333
+64.137.236.68:8833
+64.156.193.120:8333
+66.79.160.82:8333
+66.91.230.231:8333
+66.135.128.121:8333
66.172.10.4:8333
66.194.38.250:8333
66.194.38.253:8333
-66.194.38.254:8333
-66.231.97.172:8333
+66.215.34.26:8333
66.240.237.155:8333
-67.159.13.34:8333
-67.205.74.206:8333
+67.205.96.108:8333
+67.205.128.5:8333
+67.219.233.140:8333
67.221.193.55:8333
-67.227.72.17:8333
-68.65.120.53:8333
-68.65.205.226:9000
-68.144.4.34:8333
-69.39.49.199:8333
+68.100.196.118:8333
+68.132.193.222:8333
+68.168.118.234:8333
+69.11.97.43:8333
+69.30.229.10:8333
69.50.171.205:8333
-69.65.41.21:8333
-69.113.98.61:8333
-69.119.97.39:8333
-69.146.70.124:8333
-69.193.71.2:8333
-70.46.10.237:8333
-70.80.200.187:8333
-70.185.97.117:8333
-71.254.160.25:8333
-72.28.203.5:8333
-72.52.130.110:8333
-72.83.194.122:8333
-72.128.32.167:8333
-72.179.136.80:8333
-72.235.38.70:8333
-74.50.44.193:8333
-74.72.60.83:8333
-74.80.234.116:8333
-74.207.233.193:8333
-75.112.233.128:8333
-75.118.166.197:8333
-75.140.0.241:8333
-75.159.240.66:8333
-75.174.5.26:8333
-76.72.160.252:8333
-76.72.160.254:8333
-76.74.170.112:8333
-76.79.201.54:8333
-76.175.166.164:8333
-76.179.105.27:8333
-77.68.37.200:8333
-77.234.49.196:8333
-77.247.229.93:8333
-78.24.72.78:8333
-78.47.32.147:8333
-78.84.100.95:8333
-78.121.69.23:8333
-78.129.167.5:8333
-78.193.96.155:8333
-79.19.37.179:8333
+69.125.193.145:8333
+69.162.139.125:8333
+70.35.98.39:8333
+70.112.32.29:8333
+71.126.181.146:8333
+72.180.32.105:8333
+73.226.64.145:8333
+74.83.140.242:8333
+74.84.128.158:9333
+74.122.237.124:8333
+74.215.133.145:8333
+75.76.101.169:8333
+75.85.13.8:8333
+75.86.168.13:8333
+75.170.97.25:8333
+75.177.137.134:8333
+76.76.227.136:8333
+77.53.136.6:8333
+77.110.11.52:8333
+78.25.32.206:8333
+78.34.8.120:8333
+78.46.32.99:8333
+78.56.9.214:8333
+78.56.229.177:8333
+78.129.237.245:8333
+78.196.172.45:8333
79.132.230.144:8333
-79.133.43.63:8333
-79.134.201.66:8333
79.169.35.235:8333
-80.57.227.14:8333
+79.172.194.219:8333
80.64.65.87:8333
-80.86.92.70:8333
-80.100.203.151:8333
-80.101.32.121:8333
-80.161.178.73:8333
-80.240.129.170:8333
-81.7.11.50:8333
-81.7.11.55:8333
-81.17.17.40:9333
-81.30.39.83:8333
-81.90.36.7:9444
-81.136.224.77:8333
-81.162.231.211:8333
-81.184.0.143:8333
-81.198.128.86:8333
+80.89.137.115:8333
+80.93.36.173:8333
+80.101.167.100:8333
+80.114.34.158:8333
+80.127.136.50:8333
+80.188.139.82:8333
+80.222.39.77:8333
+80.223.105.69:8333
+80.229.151.187:8333
+80.240.129.221:8333
+81.7.10.238:8333
+81.7.13.84:8333
+81.27.96.92:8333
+81.35.143.98:8333
+81.82.201.5:8333
+81.83.96.5:8333
+81.169.227.36:8333
+81.171.2.119:8333
+81.171.38.130:8333
+81.175.255.118:8333
+81.207.8.49:8333
+81.228.194.187:8333
+82.9.1.77:8333
82.11.33.229:8333
-82.79.128.134:8333
-82.118.233.111:8333
-82.135.139.30:8333
+82.102.13.117:8333
+82.116.203.240:8333
+82.130.103.16:8333
+82.136.65.227:8333
+82.158.227.238:8333
+82.197.212.25:8333
82.199.102.10:8333
-82.221.106.17:8333
-82.221.108.21:8333
+82.200.204.41:8333
+82.200.204.119:8333
+82.221.105.223:8333
82.221.108.27:8333
-83.137.41.3:8333
-83.142.197.168:8333
+82.221.111.136:8333
+82.221.139.97:8333
+83.137.41.10:8333
83.143.130.19:8333
83.150.9.196:8333
-83.183.17.191:8333
-83.227.173.83:8333
-83.230.5.15:8333
-83.233.105.151:443
-83.246.75.8:8333
-83.250.133.158:8333
-83.255.66.118:8334
-84.24.69.59:8333
+83.169.2.43:8333
+83.217.203.130:8333
+83.249.88.52:8333
+84.26.162.92:8333
84.42.193.6:8333
-84.45.98.87:8333
-84.54.128.11:8333
-84.212.200.24:8333
-84.215.198.109:8333
-84.230.4.177:8333
-85.95.228.83:8333
-85.95.228.123:8333
-85.114.128.134:8333
-85.214.66.168:8333
-85.214.147.162:8333
-85.243.168.4:8333
-86.1.0.18:8333
-87.79.77.106:8333
-87.91.156.110:8333
-87.236.196.222:8333
-88.85.75.152:8333
-88.87.1.230:8333
-88.87.92.102:8333
-88.89.69.202:8333
-88.97.72.229:8333
-88.164.117.99:8333
-88.198.32.131:8333
+84.134.194.115:8333
+84.201.32.115:8333
+84.212.232.71:8333
+84.238.140.176:8333
+85.10.104.34:8333
+85.21.144.226:8333
+85.25.194.12:8333
+85.144.79.190:8333
+85.145.228.192:8333
+85.194.238.130:8333
+85.228.201.80:8333
+85.229.228.174:8333
+85.236.233.87:8333
+86.80.204.185:8333
+86.105.227.190:8333
+86.135.39.40:8333
+87.106.139.127:8333
+87.120.8.5:8333
+87.120.37.230:8333
+87.239.101.102:8333
+87.243.197.82:8333
+88.112.112.173:8333
+88.150.192.17:8333
+88.185.155.134:8333
+88.202.202.221:8333
88.202.230.87:8333
-88.214.193.154:8343
-88.214.194.226:8343
-89.10.155.88:8333
-89.46.101.44:8333
-89.163.224.212:8333
-89.174.248.20:8333
-89.202.231.198:8333
-89.212.75.6:8333
+88.208.39.182:8333
+89.34.99.41:8333
+89.163.224.187:8333
+89.169.233.150:8333
+89.184.65.85:8333
+89.212.91.219:8333
+89.249.178.36:8333
90.149.38.172:8333
-90.169.106.139:8333
-91.64.101.150:8333
-91.65.196.179:8333
-91.121.80.17:8333
-91.126.77.77:8333
-91.145.76.156:8333
-91.152.150.35:8333
-91.192.137.17:8333
-91.196.170.110:8333
+91.65.97.157:8333
+91.107.64.143:8333
+91.114.35.107:8333
+91.135.0.187:8333
+91.145.110.95:8333
+91.157.38.151:8333
91.197.44.133:8333
-91.207.68.144:8333
-91.210.105.28:8333
-91.211.102.101:8333
-91.211.106.34:8333
-91.214.200.205:8333
-91.220.43.146:8333
-91.222.71.89:8333
-91.224.140.242:8333
-91.229.76.14:8333
+91.205.176.54:8333
+91.206.203.10:8333
+91.206.203.18:8333
+91.215.35.130:8333
+91.219.239.159:8333
+91.223.133.2:8333
+91.223.133.40:8333
+91.226.10.90:8333
+91.240.141.169:8333
92.27.7.209:8333
-92.51.167.88:8333
-92.247.229.163:8333
-93.84.114.106:8333
-93.113.36.172:8333
+92.89.67.207:8333
+92.221.201.138:8333
+93.95.187.122:8333
+93.103.73.187:8333
+93.123.80.47:8333
93.188.224.253:8333
-94.75.239.69:8333
-94.190.227.112:8333
-94.214.2.74:8333
-94.224.162.65:8333
-94.236.198.253:8333
+93.190.69.242:8333
+94.19.12.244:8333
+94.156.128.116:8333
+94.177.171.73:8333
+94.181.44.104:8333
+94.237.26.173:8333
94.242.229.158:8333
-95.84.138.99:8333
-95.95.168.87:8333
+94.255.128.98:8333
+95.79.35.50:8333
+95.91.41.39:8333
95.110.234.93:8333
-95.130.9.200:8333
-95.165.168.168:8333
-95.170.235.254:8333
-95.211.130.154:8333
-96.46.68.104:8333
-96.127.202.148:8333
-97.76.171.35:8333
-98.160.160.67:8333
-99.126.197.187:8333
-99.198.173.1:8333
-101.100.174.138:8333
-101.164.201.208:8333
-103.224.165.48:8333
-104.128.225.223:8333
+95.128.48.209:8333
+95.183.48.71:8333
+96.23.67.85:8333
+97.64.177.10:8333
+97.104.201.95:8333
+98.29.197.149:8333
+98.169.2.107:8333
+99.232.48.72:8333
+101.100.141.55:8333
+103.7.32.40:8333
+103.53.225.69:8333
+103.249.106.74:8333
+104.128.224.13:8333
104.128.228.252:8333
-104.131.192.94:8333
-104.155.45.201:8334
-104.194.28.195:8663
-104.211.1.27:8333
-104.221.38.177:8333
-104.236.9.79:8333
-104.236.129.178:8333
-104.236.186.249:8333
-104.236.194.15:8333
-104.238.128.214:8333
+104.155.1.158:8333
+104.168.128.50:8333
+104.199.160.228:8333
+104.204.109.11:8333
+104.219.251.118:8333
+104.223.3.129:8333
+104.223.3.219:8333
104.238.130.182:8333
-106.38.234.84:8333
-106.185.36.204:8333
-106.185.38.67:8333
-107.6.4.145:8333
-107.150.2.6:8333
-107.150.40.234:8333
-107.170.13.184:8333
-107.181.250.216:8333
-107.191.101.111:8333
-107.191.106.115:8333
+104.245.99.227:8333
+106.38.234.89:8333
+106.104.134.218:8333
+107.136.6.71:8333
+107.150.45.210:8333
+107.151.144.103:8333
+107.170.44.99:8333
+107.181.137.133:8333
+107.191.102.13:8333
+108.58.252.82:8333
+108.59.9.167:8333
108.59.12.163:8333
-108.161.129.247:8333
-109.193.160.140:8333
-109.197.13.54:8333
-109.230.7.248:8333
-109.234.106.191:8333
-109.236.137.80:8333
-109.251.161.121:8333
-112.65.231.226:8333
-115.70.166.57:8333
-115.159.42.80:8333
-117.18.73.34:8333
-118.67.201.40:8333
-118.100.86.246:8333
-118.110.104.152:8333
-119.224.64.141:8333
+108.162.106.215:8333
+108.168.133.164:8333
+108.173.202.101:8333
+108.180.110.190:8333
+109.29.75.40:8333
+109.120.194.136:8333
+109.230.230.88:8333
+109.235.67.115:8333
+109.235.69.120:8333
+109.236.90.199:8333
+109.255.0.107:8333
+110.10.130.12:8333
+110.10.176.94:8333
+110.132.172.251:8333
+111.90.158.17:8333
+115.66.205.171:8333
+116.31.123.139:8333
+118.192.48.46:8333
+118.193.164.98:8333
+119.29.156.231:8333
+119.63.44.133:19980
+119.81.99.27:8333
+119.106.12.169:8333
+119.147.137.155:19980
+119.185.1.182:8333
120.55.193.136:8333
-122.106.169.178:8333
-123.203.174.15:8333
-123.255.232.94:8333
-124.148.165.165:8333
-124.232.141.31:8333
-128.30.92.69:8333
-128.39.141.182:8333
-128.84.167.20:8333
-128.111.73.10:8333
-128.127.38.195:8333
+121.254.173.23:8333
+121.254.173.40:8333
+123.56.129.45:8333
+123.203.163.128:8333
+123.206.32.198:8333
+124.189.160.221:8333
+124.189.192.232:8333
128.140.224.162:8333
-128.199.101.104:8333
-128.233.224.35:8333
-128.253.3.193:20020
-130.180.228.138:8333
-130.185.144.213:8333
-130.255.73.207:8333
-133.218.233.11:8333
-134.249.128.23:8333
-136.159.234.234:8333
-137.116.160.176:8333
-139.162.2.145:8333
-139.162.23.117:8333
-141.134.69.253:8333
-141.255.162.215:8333
-144.122.163.187:8333
-145.131.3.54:8333
-145.255.4.94:8333
-146.0.32.101:8337
-147.83.72.91:8333
-148.103.28.68:8333
-149.5.32.102:8333
-149.210.164.195:8333
-150.101.163.241:8333
-151.236.11.189:8333
-152.3.136.56:8333
-154.20.208.25:8333
-158.181.104.149:8333
-159.253.96.226:8333
-160.36.130.180:8333
+128.199.68.205:8333
+130.234.207.115:8333
+131.113.41.123:8333
+131.114.72.104:8333
+132.204.108.155:8333
+134.119.13.230:8333
+134.213.133.206:8333
+134.213.133.207:8333
+135.23.5.3:8333
+137.74.0.66:8333
+138.68.1.45:8333
+138.68.2.194:8333
+138.68.64.19:8333
+138.68.64.28:8333
+139.59.42.248:8333
+139.220.240.153:8333
+140.112.107.118:8333
+140.186.224.112:8333
+141.52.64.141:8333
+142.68.237.107:8333
+142.217.12.106:8333
+146.60.204.92:8333
+146.185.161.209:8333
+148.103.7.119:8333
+149.210.133.244:8333
+150.229.0.143:8333
+151.231.238.25:8333
+151.248.160.227:8333
+153.230.228.15:8333
+155.133.43.249:8333
+158.58.238.145:8333
+158.109.79.13:34821
+159.203.70.208:8333
+160.16.206.31:8333
162.209.1.233:8333
162.209.4.125:8333
-162.209.106.123:8333
-162.210.198.184:8333
-162.248.99.164:53011
+162.216.192.231:8333
+162.243.100.111:8333
+162.246.11.194:8333
162.248.102.117:8333
-162.251.108.53:8333
-163.44.2.48:8333
-163.158.36.17:8333
-166.230.71.67:8333
-167.160.36.62:8333
-167.160.169.92:8333
-168.93.129.220:8333
-169.55.99.84:8333
-169.228.66.43:8333
-172.9.169.242:8333
-173.32.11.194:8333
-173.230.228.136:8333
-173.246.107.34:8333
-173.254.235.34:8333
-174.0.128.222:8333
-174.25.130.148:8333
-174.50.64.101:8333
-175.140.232.141:8333
-176.36.37.62:8333
-176.46.9.96:8333
-176.124.110.27:8333
-177.39.16.102:8333
-178.17.173.2:8333
-178.62.5.248:8333
-178.62.70.16:8333
+162.252.46.83:8333
+163.172.33.78:8333
+163.172.194.30:8333
+169.229.198.106:8333
+170.75.195.168:8333
+172.103.205.197:8333
+172.245.225.126:8333
+173.179.37.8:8333
+173.208.203.74:8333
+173.252.46.16:8333
+174.117.141.124:8333
+175.126.38.158:8333
+175.126.38.177:8333
+175.139.106.119:8333
+175.140.232.66:8333
+176.9.117.100:8333
+176.36.33.121:8333
+176.36.99.222:8333
+176.56.227.36:8333
+176.100.100.206:8333
+176.106.144.183:8333
+176.123.7.148:8333
+176.126.167.10:8333
+176.223.201.198:8333
+178.62.68.62:8333
+178.62.102.56:8333
178.62.203.185:8333
-178.79.160.118:8333
-178.169.206.244:8333
-178.193.234.62:8333
-178.199.96.108:8333
-178.254.18.96:8333
+178.124.197.101:8333
+178.170.138.202:8333
+178.175.129.18:8333
+178.188.47.62:8333
+178.199.240.22:8333
+178.218.209.162:8333
+178.237.35.34:8333
+178.238.224.242:8333
+178.254.34.144:8333
178.254.34.161:8333
-178.255.41.123:8333
-180.210.34.58:9801
-182.92.226.212:8333
-182.171.246.142:8333
-184.23.8.9:8333
-184.58.162.35:8333
-184.154.9.170:8333
-185.8.238.165:8333
+179.43.183.2:8333
+180.200.128.58:8333
+182.93.34.130:8333
+185.8.238.197:8333
+185.11.139.172:8333
185.24.97.11:8333
-185.31.137.139:8333
-185.38.44.64:8333
-185.53.128.180:8333
-185.53.129.244:8333
-185.77.129.119:8333
-185.77.129.156:8333
-185.82.203.92:8333
-188.20.97.18:8333
-188.126.8.14:8333
-188.138.33.239:8333
-188.155.136.70:8333
+185.24.233.100:8333
+185.25.48.71:8333
+185.25.48.114:8333
+185.28.76.179:8333
+185.70.105.152:8339
+185.77.128.69:8333
+185.77.128.241:8333
+185.86.79.87:8333
+185.89.102.2:3333
+185.89.102.53:3333
+185.109.144.155:8333
+185.117.75.50:8333
+185.121.173.223:8333
+185.128.41.157:8333
+185.130.226.106:8333
+185.145.130.76:8333
+188.63.192.104:8333
+188.113.164.231:8333
188.166.229.112:8333
-188.182.108.129:8333
-188.226.225.174:8010
-188.242.171.8:8333
-188.243.4.139:8333
-190.10.9.234:8333
-190.10.10.147:8333
+188.214.128.77:8333
+190.10.8.211:8333
190.81.160.184:8333
-190.85.201.37:8333
-192.34.227.230:8333
-192.77.189.200:8333
-192.124.224.7:8333
-192.146.137.1:8333
-192.203.228.71:8333
-192.206.202.20:8333
-193.0.109.3:8333
-193.41.229.130:8333
-193.41.229.156:8333
+190.111.231.19:8333
+192.131.44.93:8333
+192.206.202.6:8333
+192.227.245.133:8333
+192.241.74.123:8333
+192.241.74.126:8333
+192.254.71.222:8333
+193.10.64.85:8333
+193.46.80.101:8333
193.49.43.219:8333
-193.147.71.120:8333
-193.179.65.233:8333
+193.93.79.215:8333
193.183.99.46:8333
-193.192.37.135:8333
193.234.224.195:8333
-194.58.108.213:8333
-194.187.96.2:8333
-194.255.31.59:8333
-195.36.6.101:8333
-195.58.238.243:8333
-195.197.175.190:8333
-195.239.1.66:8333
-198.48.196.230:8333
-198.50.192.160:8333
-198.57.210.27:8333
-198.84.195.179:8333
-198.167.140.8:8333
+193.239.80.155:8333
+194.63.140.208:8333
+194.87.1.232:8333
+194.187.227.18:8333
+194.247.12.136:8333
+195.91.176.86:8333
+196.28.98.20:8333
+198.44.249.35:8333
+198.84.172.252:8333
198.204.224.106:8333
-199.127.226.245:8333
-199.201.110.8:8333
-199.233.234.90:8333
+198.211.97.46:8333
+199.66.64.198:8333
+199.101.100.58:8333
+199.101.100.59:8333
+199.127.224.50:8333
+200.46.241.71:8333
200.116.98.185:8333
-202.60.70.18:8333
-203.151.140.14:8333
-204.112.203.52:8333
+203.9.225.13:8333
+203.177.142.37:8333
205.200.247.149:8333
-207.226.141.253:8333
-207.255.42.202:8333
-208.53.164.19:8333
-208.66.68.127:8333
-208.66.68.130:8333
-208.71.171.232:8341
-208.76.200.200:8333
-208.82.98.189:8333
-208.85.193.31:8333
-208.111.48.41:8333
-208.111.48.45:8333
-209.34.232.72:8333
-209.81.9.223:8333
-209.90.224.2:8333
+205.209.131.150:13838
+206.53.64.74:8333
+206.72.192.69:8333
+206.123.112.180:8333
+208.66.208.153:8333
+208.68.174.76:8333
+208.107.97.242:8333
+208.111.48.132:8333
+208.118.235.190:8333
+209.6.205.126:8333
+209.40.96.121:8333
+209.58.130.137:8333
+209.73.142.226:8333
209.90.224.4:8333
-209.126.98.174:8333
-209.136.72.69:8333
-209.195.4.74:8333
-209.197.13.62:8333
-211.72.227.8:8333
-212.51.144.42:8333
-212.71.233.127:8333
-212.126.14.122:8333
-212.159.44.50:8333
-213.5.36.58:8333
-213.57.33.10:8333
-213.66.205.194:8333
-213.136.73.125:8333
-213.155.3.216:8333
-213.155.7.24:8333
-213.167.17.6:8333
-213.223.138.13:8333
-216.15.78.182:8333
-216.38.129.164:8333
-216.48.168.8:8333
-216.169.141.169:8333
-216.245.206.181:8333
-216.249.204.161:8333
-216.250.138.230:8333
+209.126.69.243:8333
+209.126.108.91:8333
+209.195.4.18:8333
+209.250.6.190:8333
+210.54.37.225:8333
+210.223.3.44:8333
+211.149.234.109:8333
+212.51.140.183:8333
+212.90.179.206:8333
+212.93.226.90:8333
+212.110.171.118:8333
+212.202.132.17:8333
+213.91.205.134:8333
+213.165.68.218:8333
+213.196.200.213:8333
+216.59.4.212:8333
+216.74.32.109:8333
+216.158.225.70:8333
+216.164.138.13:8333
+216.167.236.247:8333
+216.197.79.74:8333
217.11.225.189:8333
-217.12.34.158:8333
-217.12.202.33:8333
-217.20.171.43:8333
-217.23.1.126:8333
-217.23.11.138:8333
+217.12.199.207:8333
+217.20.130.72:8333
+217.23.6.148:8333
+217.23.140.103:8333
+217.28.96.180:8333
+217.35.130.42:8333
217.111.66.79:8333
-217.155.202.191:8333
217.158.9.102:8333
-217.172.32.18:20993
-220.245.196.37:8333
-[2001:1291:2bf:1::100]:8333
+217.168.143.169:8333
+217.209.32.219:8333
+218.161.33.165:8333
+221.121.144.138:8333
+[2001:0:4137:9e76:2048:3a84:bb91:e846]:8333
+[2001:0:4137:9e76:2066:e9e:b489:f8b8]:8333
+[2001:0:4137:9e76:3854:1211:b5ac:a96b]:8333
+[2001:0:4137:9e76:4e3:1f66:cd4c:829f]:8333
+[2001:0:4137:9e76:ad:1f4:9ea9:fa2e]:8333
+[2001:0:4137:9e76:e5:baa:b66f:f418]:8333
+[2001:0:53aa:64c:20a2:59c4:ad22:93ea]:8333
+[2001:0:53aa:64c:59:617f:a10d:e0]:8333
+[2001:0:5ef5:79fb:200f:3ae5:3cbc:74c9]:8333
+[2001:0:5ef5:79fb:38f2:13b4:b208:5604]:8333
+[2001:0:5ef5:79fd:200b:22a7:cc50:f52d]:8333
+[2001:0:5ef5:79fd:24ef:1aef:a994:303d]:8333
+[2001:0:5ef5:79fd:24fc:b5d:ad4f:4db2]:8333
+[2001:0:5ef5:79fd:28bf:2d23:e02e:c3ef]:8333
+[2001:0:5ef5:79fd:3cd0:3c2e:da44:a759]:8333
+[2001:0:5ef5:79fd:87e:fd7:b1c2:1b4]:8333
+[2001:0:9d38:6ab8:18db:3bda:ab90:e81e]:8333
+[2001:0:9d38:6ab8:4e7:1660:862f:a6d7]:8333
+[2001:0:9d38:6ab8:6:2b:5074:9588]:8333
+[2001:0:9d38:6abd:10f8:a7d7:bb90:f524]:8333
+[2001:13d8:1c01:1000::11]:8333
+[2001:15c0:65ff:610::2]:8333
+[2001:1608:10:156:ae::4adb]:8333
+[2001:1620:b1b:8888:20d:b9ff:fe41:6710]:8333
+[2001:1620:b1b:face:20d:b9ff:fe41:6710]:8333
[2001:1620:f00:282::2]:8333
[2001:1620:f00:8282::1]:8333
-[2001:19f0:5000:8de8:5400:ff:fe12:55e4]:8333
-[2001:19f0:6c00:9103:5400:ff:fe10:a8d3]:8333
-[2001:1b60:3:172:142b:6dff:fe7a:117]:8333
-[2001:410:a000:4050:8463:90b0:fffb:4e58]:8333
+[2001:1680:101:1ae::1]:8333
+[2001:16d8:ff00:85de:20c:29ff:fe52:9594]:8333
+[2001:19f0:4400:434d:5400:ff:fe42:2678]:8333
+[2001:19f0:5000:8c8b:5400:ff:fe1f:c023]:8333
+[2001:19f0:5000:8ce6:5400:ff:fe1b:24a9]:8333
+[2001:19f0:5:314:5400:ff:fe2c:42e8]:8333
+[2001:19f0:5:51b:5400:ff:fe49:fe5b]:8333
+[2001:19f0:5:bc:5400:ff:fe3b:9339]:8333
+[2001:1af8:4020:a020:5::]:8333
+[2001:1bc8:1a0:590e:2e0:f4ff:fe16:3a39]:8333
+[2001:1c04:1401:8f00:f4fe:4fff:fe0c:df40]:8333
+[2001:4128:6135:10:20c:29ff:fe69:9e81]:8333
[2001:4128:6135:2010:21e:bff:fee8:a3c0]:8333
-[2001:41d0:1008:761::17c]:8333
+[2001:4128:6135:e001:5054:ff:fe37:e9eb]:8333
+[2001:41d0:1000:1024::]:8333
+[2001:41d0:1000:1433::]:8333
+[2001:41d0:1004:22ae::]:8333
+[2001:41d0:1004:2996::]:8333
+[2001:41d0:1008:11e0::1a5c:6d9d]:8333
+[2001:41d0:1008:11e0::b74:baf7]:8333
+[2001:41d0:1008:237a::]:8333
+[2001:41d0:1008:2752::]:8333
+[2001:41d0:1008:494::]:8333
[2001:41d0:1:45d8::1]:8333
-[2001:41d0:1:6cd3::]:8333
+[2001:41d0:1:5630::1]:8333
+[2001:41d0:1:6f57::1]:8333
+[2001:41d0:1:801e::1]:8333
+[2001:41d0:1:8852::1]:8333
[2001:41d0:1:8b26::1]:8333
-[2001:41d0:1:afda::]:8200
+[2001:41d0:1:a5b8::1]:8333
[2001:41d0:1:b26b::1]:8333
[2001:41d0:1:c139::1]:8333
[2001:41d0:1:c8d7::1]:8333
-[2001:41d0:1:f59f::33]:8333
-[2001:41d0:1:f7cc::1]:8333
-[2001:41d0:2:1021::1]:8333
-[2001:41d0:2:37c3::]:8200
-[2001:41d0:2:4797:2323:2323:2323:2323]:8333
-[2001:41d0:2:53df::]:8333
+[2001:41d0:1:d227::]:8333
+[2001:41d0:1:dbc4::1]:8333
+[2001:41d0:1:dc5d::1]:8333
+[2001:41d0:1:e13b::1]:8333
+[2001:41d0:1:ef5b::1]:8333
+[2001:41d0:2:16be::1]:8333
+[2001:41d0:2:203c::1]:8333
+[2001:41d0:2:38c5::1]:8333
+[2001:41d0:2:519::]:8333
[2001:41d0:2:9c94::1]:8333
-[2001:41d0:2:9d3e::1]:8333
-[2001:41d0:2:a24f::]:8333
-[2001:41d0:2:a35a::]:8333
-[2001:41d0:2:b2b8::]:8333
-[2001:41d0:2:c1d9::]:8333
-[2001:41d0:2:c6e::]:8333
+[2001:41d0:2:b792::]:8333
+[2001:41d0:2:bf2a::]:8333
+[2001:41d0:2:c793::]:8333
[2001:41d0:2:c9bf::]:8333
-[2001:41d0:2:f1a5::]:8333
-[2001:41d0:52:a00::105f]:8333
-[2001:41d0:52:cff::6f5]:8333
-[2001:41d0:52:d00::6e2]:8333
-[2001:41d0:8:3e75::1]:8333
-[2001:41d0:8:62ab::1]:8333
+[2001:41d0:303:4f0::]:8333
+[2001:41d0:8:1a8a::1]:8333
+[2001:41d0:8:3fa9::1]:8333
+[2001:41d0:8:4670::1]:8333
+[2001:41d0:8:4f48::1]:8333
[2001:41d0:8:6728::]:8333
-[2001:41d0:8:b30a::1]:8333
-[2001:41d0:8:bc26::1]:8333
-[2001:41d0:8:be9a::1]:8333
-[2001:41d0:8:d984::]:8333
-[2001:41d0:8:eb8b::]:8333
-[2001:41d0:a:13a2::1]:8333
-[2001:41d0:a:2b18::1]:8333
-[2001:41d0:a:2d14::]:8333
-[2001:41d0:a:4558::1df2:76d3]:8333
-[2001:41d0:a:4aaa::]:8333
-[2001:41d0:a:635b::1]:8333
-[2001:41d0:a:63d8::1]:8333
+[2001:41d0:8:72c2:d:242:ac11:2]:8333
+[2001:41d0:8:8007::]:8333
+[2001:41d0:8:a71c::]:8333
+[2001:41d0:8:bccc::1]:8333
+[2001:41d0:8:bd45::1]:8333
+[2001:41d0:8:c67c::]:8333
+[2001:41d0:8:de3d::1]:8333
+[2001:41d0:8:e257::1]:8333
+[2001:41d0:8:e3e4::1]:8333
+[2001:41d0:a:14cc::1]:8333
+[2001:41d0:a:15b2::1]:8333
+[2001:41d0:a:1ac9::1]:8333
+[2001:41d0:a:2496::1]:8333
+[2001:41d0:a:308c::]:8333
+[2001:41d0:a:5879::]:8333
+[2001:41d0:a:6810::1]:8333
+[2001:41d0:a:682d::1]:8333
[2001:41d0:a:6c29::1]:8333
-[2001:41d0:a:f9cd::1]:8333
-[2001:41d0:d:20a4::]:8333
+[2001:41d0:a:f52a::1]:8333
+[2001:41d0:d:111c::]:8333
+[2001:41d0:e:1388::1]:8333
[2001:41d0:e:26b::1]:8333
+[2001:41d0:e:f73::1]:8333
[2001:41d0:fc8c:a200:7a24:afff:fe9d:c69b]:8333
+[2001:41f0:61:0:72f3:95ff:fe09:7521]:8333
[2001:41f0:61::7]:8333
-[2001:41f0::2]:8333
-[2001:44b8:41bd:6101:148e:4022:4950:e861]:8333
-[2001:470:1:2f9:0:1:107a:a301]:8333
-[2001:470:1f0b:ad6::2]:8333
-[2001:470:1f11:12d5::ae1:5611]:8333
+[2001:4428:200:8171:db6:2ff4:9c0e:a2da]:8333
+[2001:470:1f07:151c:baac:6fff:feb7:3ba9]:8333
+[2001:470:1f0b:ad6:a60:6eff:fec6:2323]:8333
+[2001:470:1f11:617::10f]:8333
+[2001:470:1f14:73e::2]:8333
[2001:470:1f14:7d::2]:8333
-[2001:470:27:ce::2]:8333
+[2001:470:1f15:11f8::10]:8333
+[2001:470:1f15:1b95:2c3e:8a9a:24e1:7084]:8333
+[2001:470:1f15:e9b::3ef]:8333
+[2001:470:1f1d:3a9::10]:8333
+[2001:470:25:482::2]:8333
+[2001:470:27:19f::2]:8333
+[2001:470:27:665::2]:8333
+[2001:470:28:365::4]:8333
[2001:470:41:6::2]:8333
-[2001:470:507d:0:6ab5:99ff:fe73:ac18]:8333
-[2001:470:583e::2a]:8333
-[2001:470:5f:5f::232]:8333
-[2001:470:66:119::2]:8333
-[2001:470:6c4f::cafe]:8333
-[2001:470:6f:327:913b:7fe:8545:a4f5]:8333
-[2001:470:7dda:1::1]:8333
-[2001:470:95c1::2]:8333
-[2001:470:b1d0:ffff::1000]:8333
-[2001:470:d00d:0:3664:a9ff:fe9a:5150]:8333
-[2001:470:fab7:1::1]:8333
-[2001:4800:7819:104:be76:4eff:fe05:c828]:8333
-[2001:4800:7819:104:be76:4eff:fe05:c9a0]:8333
+[2001:470:727b::11:14]:8333
+[2001:470:7:2f0::2]:8333
+[2001:470:7:65::2]:8333
+[2001:470:7f85::2]:8333
+[2001:470:8:2e1:5825:39df:3e4c:54a8]:8333
+[2001:470:8:2e1::43]:8333
+[2001:470:8:2e1:ae2a:e257:4470:6350]:8333
+[2001:470:a:c13::2]:8333
[2001:4801:7819:74:b745:b9d5:ff10:a61a]:8333
[2001:4801:7819:74:b745:b9d5:ff10:aaec]:8333
[2001:4801:7828:104:be76:4eff:fe10:1325]:8333
-[2001:4802:7800:1:be76:4eff:fe20:f023]:8333
[2001:4802:7800:2:30d7:1775:ff20:1858]:8333
-[2001:4802:7800:2:be76:4eff:fe20:6c26]:8333
-[2001:4802:7802:101:be76:4eff:fe20:256]:8333
-[2001:4802:7802:103:be76:4eff:fe20:2de8]:8333
-[2001:4830:1100:2e8::2]:8333
-[2001:4b98:dc2:41:216:3eff:fe56:f659]:8333
-[2001:4ba0:fffa:5d::93]:8333
-[2001:4ba0:ffff:1be:1:1005:0:1]:8333
-[2001:4dd0:ff00:867f::3]:8333
+[2001:4ba0:babe:832::]:8333
+[2001:4ba0:cafe:379::1]:8333
+[2001:4ba0:ffee:33::10]:8333
[2001:4dd0:ff00:9a67::9]:8333
-[2001:5c0:1400:b::3cc7]:8333
[2001:610:1b19::3]:8333
[2001:610:600:a41::2]:8333
-[2001:67c:26b4::]:8333
-[2001:8d8:840:500::39:1ae]:8333
-[2001:8d8:965:4a00::10:9343]:8333
-[2001:980:4650:1:2e0:53ff:fe13:2449]:8333
+[2001:678:174:4021::2:8333]:8333
+[2001:67c:16dc:1201:5054:ff:fe17:4dac]:8333
+[2001:67c:2128:ffff:6062:36ff:fe30:6532]:8333
+[2001:67c:2564:331:3547:6e28:85a4:fb27]:8333
+[2001:6a0:200:368::2]:8333
+[2001:718:801:311:5054:ff:fe19:c483]:8333
+[2001:7b8:2ff:8f::2]:8333
+[2001:8d8:8a6:4400::3f:86c]:8333
+[2001:8d8:923:8400::87:ebd]:8333
+[2001:960:66d::2]:8333
[2001:981:46:1:ba27:ebff:fe5b:edee]:8333
-[2001:9c8:53e9:369a:226:2dff:fe1b:7472]:8333
-[2001:9d8:cafe:3::87]:8333
-[2001:b10:11:21:3e07:54ff:fe48:7248]:8333
-[2001:ba8:1f1:f34c::2]:8333
-[2001:bc8:2310:100::1]:8333
-[2001:bc8:3427:101:7a4f:8be:2611:6e79]:8333
-[2001:bc8:3505:200::1]:8333
-[2001:cc0:a004::30:1d]:8333
-[2001:e42:102:1209:153:121:76:171]:8333
-[2002:17ea:14eb::17ea:14eb]:8333
-[2002:2f8:2bc5::2f8:2bc5]:8333
-[2002:4047:482c::4047:482c]:8333
-[2002:45c3:8cca::45c3:8cca]:8333
-[2002:46bb:8a41:0:226:b0ff:feed:5f12]:8888
-[2002:46bb:8c3c:0:8d55:8fbb:15fa:f4e0]:8765
-[2002:4c48:a0fe::4c48:a0fe]:8333
-[2002:4d44:25c8::4d44:25c8]:8333
-[2002:505f:aaa2::505f:aaa2]:8333
-[2002:5bc1:799d::5bc1:799d]:8333
-[2002:6dec:5472::6dec:5472]:8333
-[2002:8c6d:6521:9617:12bf:48ff:fed8:1724]:8333
-[2002:ac52:94e2::ac52:94e2]:8333
-[2002:af7e:3eca::af7e:3eca]:8333
-[2002:b009:20c5::b009:20c5]:8333
-[2002:c06f:39a0::c06f:39a0]:8333
-[2002:c23a:738a::c23a:738a]:8333
-[2002:c70f:7442::c70f:7442]:8333
-[2002:cec5:be4f::cec5:be4f]:8333
-[2002:d149:9e3a::d149:9e3a]:8333
+[2001:ba8:1f1:f069::2]:8333
+[2001:bc8:225f:10e:505:6573:7573:d0a]:8333
+[2001:bc8:2706::1]:8333
+[2001:bc8:323c:100::53]:8333
+[2001:bc8:323c:100::80:4]:8333
+[2001:bc8:323c:100::cafe]:8333
+[2001:bc8:3680:4242::1]:8333
+[2001:bc8:399f:f000::1]:8333
+[2001:bc8:3cbf::5]:8333
+[2001:bc8:4700:2300::19:807]:8333
+[2001:e42:102:1805:160:16:206:31]:8333
+[2002:12f1:3f::12f1:3f]:8333
+[2002:1e2:5349::1e2:5349]:8333
+[2002:1e2:5588::1e2:5588]:8333
+[2002:2501:cf62::2501:cf62]:8333
+[2002:268c:a135::268c:a135]:8333
+[2002:2a33:99db::2a33:99db]:8332
+[2002:2ebc:2c14::7]:8333
+[2002:2f59:2c9c::2f59:2c9c]:11885
+[2002:2f5a:3619::2f5a:3619]:8333
+[2002:2f5a:36a4::2f5a:36a4]:8333
+[2002:2f5a:429::2f5a:429]:8333
+[2002:2f5a:562a::2f5a:562a]:8333
+[2002:3a3b:216::3a3b:216]:8333
+[2002:3dfa:5d23::3dfa:5d23]:8333
+[2002:424f:a052::424f:a052]:8333
+[2002:451e:e922::451e:e922]:8333
+[2002:4540:4b30::4540:4b30]:8333
+[2002:51ab:7cc::51ab:7cc]:8333
+[2002:527:de11::527:de11]:8333
+[2002:5395:7d01::5395:7d01]:8333
+[2002:5395:7d2a::5395:7d2a]:8333
+[2002:5669:e3be::5669:e3be]:8333
+[2002:566a:5d6d::566a:5d6d]:8333
+[2002:59b9:f820::59b9:f820]:8333
+[2002:59f8:ac69::59f8:ac69]:8333
+[2002:5bd4:b65a::5bd4:b65a]:8333
+[2002:5c3f:39db::5c3f:39db]:8333
+[2002:5d33:8d03::5d33:8d03]:8333
+[2002:5d67:49bb::5d67:49bb]:8333
+[2002:5dae:5d5f::5dae:5d5f]:8333
+[2002:5dbe:8cc6::5dbe:8cc6]:8333
+[2002:5dbe:9503::5dbe:9503]:8333
+[2002:5fd3:8944::5fd3:8944]:8333
+[2002:5fd3:9467::5fd3:9467]:8333
+[2002:67f9:6a48::67f9:6a48]:8333
+[2002:67f9:6a4a::67f9:6a4a]:8333
+[2002:67f9:6a95::67f9:6a95]:8333
+[2002:6a0e:3ea8::6a0e:3ea8]:10011
+[2002:6b96:375a::6b96:375a]:8333
+[2002:6ca8:cffb::6ca8:cffb]:8333
+[2002:6caf:234::6caf:234]:8333
+[2002:6dec:58f5::6dec:58f5]:8333
+[2002:6dec:5ac7::6dec:5ac7]:8333
+[2002:7237:4a02::7237:4a02]:20033
+[2002:7237:94fd::7237:94fd]:10011
+[2002:7237:e428::7237:e428]:8333
+[2002:7237:fcf6::7237:fcf6]:20188
+[2002:76c0:96e6::76c0:96e6]:8333
+[2002:7819:7e80::7819:7e80]:7743
+[2002:781a:ea86::781a:ea86]:8333
+[2002:781a:f3c2::781a:f3c2]:14475
+[2002:784c:c2c0::784c:c2c0]:8333
+[2002:784c:ec97::784c:ec97]:8333
+[2002:792b:261a::792b:261a]:8333
+[2002:88f3:8cca::88f3:8cca]:8333
+[2002:88f3:a83c::88f3:a83c]:8333
+[2002:8ac9:516f::8ac9:516f]:8333
+[2002:8b81:6d78::8b81:6d78]:50344
+[2002:8b81:6e5c::8b81:6e5c]:38176
+[2002:8bc4:90a6::8bc4:90a6]:8333
+[2002:ac52:b854::ac52:b854]:8333
+[2002:add0:c14a::add0:c14a]:8333
+[2002:b07e:a70a::b07e:a70a]:8333
+[2002:b27c:c565:1::250]:8333
+[2002:b27c:c565::1]:8333
+[2002:b94d:80f1::b94d:80f1]:8333
+[2002:b982:e26a::b982:e26a]:8333
+[2002:bcd5:3145::bcd5:3145]:8333
+[2002:c08a:d22b::c08a:d22b]:8333
+[2002:c0c7:f8e3::c0c7:f8e3]:32771
+[2002:c1a9:fc5a::c1a9:fc5a]:8333
+[2002:c23f:8fc5::c23f:8fc5]:8333
+[2002:d395:ea6d::d395:ea6d]:8333
[2002:d917:ca5::d917:ca5]:8333
-[2400:8900::f03c:91ff:fe50:153f]:8333
-[2400:8900::f03c:91ff:fe6e:823e]:8333
-[2400:8900::f03c:91ff:fea8:1934]:8333
-[2400:8901::f03c:91ff:fe26:c4d6]:8333
+[2002:d917:e91::d917:e91]:8333
+[2002:db71:f434::db71:f434]:8333
+[2400:2651:161:1000:6847:d40f:aaa3:4848]:8333
[2400:8901::f03c:91ff:fec8:4280]:8333
-[2400:8901::f03c:91ff:fec8:660f]:8333
-[2401:1800:7800:102:be76:4eff:fe1c:559]:8333
[2401:1800:7800:102:be76:4eff:fe1c:a7d]:8333
+[2401:2500:203:10:153:120:156:83]:8333
+[2401:a400:3200:5600:14ee:f361:4bdc:1f7c]:8333
+[2403:4200:403:2::ff]:8333
[2405:aa00:2::40]:8333
-[2600:3c00::f03c:91ff:fe18:59b2]:8333
-[2600:3c00::f03c:91ff:fe26:bfb6]:8333
-[2600:3c00::f03c:91ff:fe33:88e3]:8333
-[2600:3c00::f03c:91ff:fe6e:7297]:8333
-[2600:3c00::f03c:91ff:fe84:8a6e]:8333
+[240b:10:ca20:f0:224:e8ff:fe1f:60d9]:8333
+[240b:250:1e0:2400:b9ef:8fe3:a69a:7378]:8333
+[240d:1a:302:8600:8876:a36d:12ee:f285]:8333
+[2600:3c00::f03c:91ff:fe91:3e49]:8333
+[2600:3c00::f03c:91ff:febb:981e]:8333
[2600:3c01::f03c:91ff:fe18:6adf]:8333
-[2600:3c01::f03c:91ff:fe26:c4b8]:8333
-[2600:3c01::f03c:91ff:fe3b:1f76]:8333
-[2600:3c01::f03c:91ff:fe50:5e06]:8333
-[2600:3c01::f03c:91ff:fe61:289b]:8333
[2600:3c01::f03c:91ff:fe69:89e9]:8333
-[2600:3c01::f03c:91ff:fe84:ac15]:8333
-[2600:3c01::f03c:91ff:fe98:68bb]:8333
-[2600:3c02::f03c:91ff:fe26:713]:8333
-[2600:3c02::f03c:91ff:fe26:c49e]:8333
-[2600:3c02::f03c:91ff:fe84:97d8]:8333
-[2600:3c02::f03c:91ff:fec8:8feb]:8333
+[2600:3c01::f03c:91ff:fe91:6a29]:8333
+[2600:3c01::f03c:91ff:fef1:1eaa]:8333
[2600:3c03::f03c:91ff:fe18:da80]:8333
-[2600:3c03::f03c:91ff:fe26:c49b]:8333
-[2600:3c03::f03c:91ff:fe50:5fa7]:8333
+[2600:3c03::f03c:91ff:fe28:1445]:8333
[2600:3c03::f03c:91ff:fe67:d2e]:8333
-[2600:3c03::f03c:91ff:fe6e:1803]:8333
-[2600:3c03::f03c:91ff:fec8:4bbe]:8333
-[2600:3c03::f03c:91ff:fee4:4e16]:8333
-[2601:18d:8300:58a6::2e4]:8333
-[2601:240:4600:40c0:250:56ff:fea4:6305]:8333
-[2601:581:c200:a719:542c:9cd5:4852:f7d9]:8333
-[2601:647:4900:85f1:ca2a:14ff:fe51:bb35]:8333
-[2601:c2:c002:b300:54a0:15b5:19f7:530d]:8333
-[2602:306:ccff:ad7f:b116:52be:64ba:db3a]:8333
-[2602:ae:1982:9400:846:f78c:fec:4d57]:8333
+[2600:3c03::f03c:91ff:fe89:116f]:8333
+[2600:3c03::f03c:91ff:feb0:5fc4]:8333
+[2600:3c03::f03c:91ff:fee0:233e]:8333
+[2600:3c03::f03c:91ff:fee0:51]:8333
+[2600:8805:2400:14e:226:4aff:fe02:2ba4]:8333
+[2600:8807:5080:3301:1487:83b7:33d7:eb97]:8333
+[2601:186:c100:6bcd:16bd:cea1:235d:1c19]:8333
+[2601:18c:4200:28d0:e4d:e9ff:fec5:76d0]:8333
+[2601:247:8201:6251:30e6:7b95:69bf:9248]:8333
+[2601:602:9980:f78:211:11ff:fec5:1ae]:8333
+[2602:ae:1993:de00:2c50:9a44:8f11:77a5]:8333
+[2602:ff68:0:1:21e:bff:feca:db72]:8333
+[2602:ff68:0:1:2bd:27ff:feb0:adf8]:8333
+[2602:ff68:0:1::5]:8333
+[2602:ff68:0:5:2bd:27ff:feb0:adf8]:8333
[2602:ffc5:1f::1f:2d61]:8333
[2602:ffc5:1f::1f:9211]:8333
-[2602:ffc5::75d5:c1c3]:8333
+[2602:ffc5::9e63:27a2]:8333
+[2602:ffc5::c30:1c75]:8333
[2602:ffc5::ffc5:b844]:8333
[2602:ffe8:100:2::457:936b]:8333
-[2602:ffe8:100:2::9d20:2e3c]:8333
-[2602:ffea:1001:72b::578b]:8333
-[2602:ffea:a::24c4:d9fd]:8333
-[2604:0:c1:100:1ec1:deff:fe54:2235]:8333
-[2604:180:1:1af::42a9]:8333
-[2604:180:3:702::c9de]:8333
-[2604:4080:1114:0:3285:a9ff:fe93:850c]:8333
-[2604:6000:ffc0:3c:64a3:94d0:4f1d:1da8]:8333
-[2605:6000:f380:9a01:ba09:8aff:fed4:3511]:8333
-[2605:6001:e00f:7b00:c587:6d91:6eff:eeba]:8333
-[2605:f700:c0:1::25c3:2a3e]:8333
-[2606:6000:a441:9903:5054:ff:fe78:66ff]:8333
-[2607:5300:100:200::1c83]:9334
-[2607:5300:10::a1]:8333
-[2607:5300:60:1c2f::1]:8333
-[2607:5300:60:2b90::1]:8333
-[2607:5300:60:3320::1]:8333
-[2607:5300:60:385::1]:8333
-[2607:5300:60:4a85::]:8333
-[2607:5300:60:65e4::]:8333
-[2607:5300:60:6918::]:8333
-[2607:5300:60:711a:78::a7b5]:8333
-[2607:5300:60:714::1]:8333
-[2607:5300:60:870::1]:8333
-[2607:5300:60:952e:3733::1414]:8333
-[2607:f1c0:848:1000::48:943c]:8333
-[2607:f2e0:f:5df::2]:8333
-[2607:f748:1200:f8:21e:67ff:fe99:8f07]:8333
-[2607:f948:0:1::7]:8333
-[2607:ff68:100:36::131]:8333
-[2803:6900:1::117]:8333
-[2a00:1098:0:80:1000:25:0:1]:8333
-[2a00:1178:2:43:5054:ff:fe84:f86f]:8333
-[2a00:1178:2:43:5054:ff:fee7:2eb6]:8333
-[2a00:1178:2:43:8983:cc27:d72:d97a]:8333
-[2a00:1328:e100:cc42:230:48ff:fe92:55c]:8333
+[2604:180:2:eee::ca46]:8333
+[2604:880:d:85::be37]:8333
+[2604:9a00:2100:a009:2::]:8333
+[2604:a880:2:d0::301:8001]:8333
+[2604:a880:2:d0::4a9:1001]:8333
+[2604:a880:2:d0::53a:c001]:8333
+[2604:a880:400:d0::ad7:e001]:8333
+[2604:a880:400:d0::dcf:f001]:8333
+[2605:4d00::50]:8333
+[2605:6000:edc8:300::ddfe]:8333
+[2605:6000:ffc0:70:74d5:225c:f553:5bb8]:8333
+[2606:6000:c148:7003:5054:ff:fe78:66ff]:8333
+[2606:6000:e6d6:d701:d428:5e44:a2c9:3ff6]:8333
+[2606:c680:1:4a:2016:d1ff:fe93:52a7]:8333
+[2607:5300:203:118:3733::1414]:8333
+[2607:5300:60:13bb::1]:8333
+[2607:5300:60:1966::1]:8333
+[2607:5300:60:2218::]:8333
+[2607:5300:60:3775::]:8333
+[2607:5300:60:3ddf::]:8333
+[2607:5300:60:a654::]:8333
+[2607:5300:60:a7a3::]:8333
+[2607:5300:60:ac0::1]:8333
+[2607:5300:60:cf97::]:8333
+[2607:f0d0:1901:19::6]:8333
+[2607:f128:40:1202:69:162:139:125]:8333
+[2607:f128:40:1703::2]:8333
+[2607:f178:0:8::106]:8333
+[2607:f1c0:84d:8900::7e:cad]:8333
+[2607:f948:0:1::1:40]:8333
+[2607:fcd0:100:2302::6094:635a]:8333
+[2607:fcd0:100:6a00::3a96:1]:8333
+[2607:fcd0:100:6a02::7ff0:1]:8333
+[2607:fcd0:100:8203::8c58:dbc]:8333
+[2607:fea8:1360:9c2:221a:6ff:fe47:776d]:8333
+[2607:fea8:4da0:9ce:5114:a8ec:20f5:a50b]:8333
+[2607:fea8:5df:fda0:feaa:14ff:feda:c79a]:8333
+[2607:fea8:84c0:163:f42c:baff:fecc:6bbf]:8333
+[2607:ff10:c5:502:225:90ff:fe32:d446]:8333
+[2607:ff48:aa81:800::96cf:1]:8333
+[2620:11c:5001:1118:d267:e5ff:fee9:e673]:8333
+[2620:b8:4000:1000::93:1]:8333
+[2800:1a0::9]:8333
+[2a00:1178:2:43:19fd:d43e:b77:edeb]:8333
+[2a00:1178:2:43:b4e3:e562:f811:d761]:8333
[2a00:14f0:e000:80d2:cd1a::1]:8333
+[2a00:1630:14::101]:8333
[2a00:1630:2:1802:188:122:91:11]:8333
-[2a00:18e0:0:1800::1]:8333
-[2a00:18e0:0:dcc5:109:234:106:191]:8333
-[2a00:1a28:1157:87::94c7]:8333
+[2a00:1630:2:500::4]:8333
+[2a00:1768:2001:24::148:218]:8333
+[2a00:1768:2001:27::142:21]:8333
+[2a00:1a48:7810:101:be76:4eff:fe08:c774]:8333
[2a00:1ca8:37::a5fc:40d1]:8333
[2a00:1ca8:37::ab6d:ce2c]:8333
-[2a00:7143:100:0:216:3eff:fe2e:74a3]:8333
-[2a00:7143:100:0:216:3eff:fed3:5c21]:8333
-[2a00:7c80:0:45::123]:8333
+[2a00:1dc0:2255:10::2]:8333
+[2a00:7c80:0:71::8]:8333
+[2a00:7c80:0:97::7]:8333
+[2a00:bbe0:0:42:222:64ff:fe9a:e206]:8333
+[2a00:c98:2050:a020:3::110]:8333
+[2a00:dcc0:eda:98:183:193:1d24:b53a]:8333
[2a00:dcc0:eda:98:183:193:c382:6bdb]:8333
[2a00:dcc0:eda:98:183:193:f72e:d943]:8333
-[2a00:f820:17::4af:1]:8333
-[2a00:f940:2:1:2::101d]:8333
-[2a00:f940:2:1:2::6ac]:8333
-[2a01:1b0:7999:402::131]:8333
-[2a01:238:42dd:f900:7a6c:2bc6:4041:c43]:8333
-[2a01:238:4313:6300:2189:1c97:696b:5ea]:8333
-[2a01:488:66:1000:5c33:91f9:0:1]:8333
-[2a01:488:66:1000:b01c:178d:0:1]:8333
+[2a00:f90:ff0:c100:53c4:97a7:8b59:796a]:8333
+[2a01:238:435c:de00:b110:38cf:192d:b2c]:28333
+[2a01:348:6:7cf::2]:8333
+[2a01:368:e012:8888:216:3eff:fe24:1162]:8333
+[2a01:488:66:1000:53a9:22b:0:1]:8333
+[2a01:488:67:1000:523:ffa7:0:1]:8333
+[2a01:488:67:1000:b01c:3379:0:1]:8333
[2a01:4f8:100:34ce::2]:8333
-[2a01:4f8:100:34e4::2]:8333
[2a01:4f8:100:44e7::2]:8333
-[2a01:4f8:100:510e::2]:8333
-[2a01:4f8:100:5128::2]:8333
-[2a01:4f8:110:5105::2]:8333
-[2a01:4f8:110:516c::2]:8333
+[2a01:4f8:10a:2e4::2]:8333
+[2a01:4f8:10a:34e::2]:8333
+[2a01:4f8:10a:51d::2]:8333
+[2a01:4f8:10a:622::2]:8333
+[2a01:4f8:10a:85f::2]:8333
+[2a01:4f8:10a:864::2]:8333
+[2a01:4f8:10a:d04::2]:8333
+[2a01:4f8:110:334c::2]:8333
+[2a01:4f8:110:536e::2]:8333
[2a01:4f8:120:43e4::2]:8333
-[2a01:4f8:120:62e6::2]:8333
[2a01:4f8:120:702e::2]:8333
-[2a01:4f8:120:8203::2]:8333
-[2a01:4f8:121:234d::2]:8333
-[2a01:4f8:121:261::2]:8333
-[2a01:4f8:130:11ea::2]:8333
+[2a01:4f8:121:4346::2]:8333
[2a01:4f8:130:3332::2]:8333
-[2a01:4f8:130:40ab::2]:8333
-[2a01:4f8:130:632c::2]:8333
-[2a01:4f8:130:6366::2]:8333
-[2a01:4f8:130:934f::2]:8333
+[2a01:4f8:131:33ad::2]:8333
[2a01:4f8:131:33ad:fea1::666]:8333
-[2a01:4f8:140:2195::2]:8333
-[2a01:4f8:140:6333::2]:8333
-[2a01:4f8:140:930d::2]:8333
+[2a01:4f8:140:31b0::2]:8333
+[2a01:4f8:140:4088::2]:8333
+[2a01:4f8:140:931a::2]:8333
[2a01:4f8:140:93b0::2]:8333
-[2a01:4f8:141:1167::2]:8333
+[2a01:4f8:141:13ad::c451]:8333
[2a01:4f8:141:186::2]:8333
-[2a01:4f8:141:53f0::2]:8333
-[2a01:4f8:150:336a::2]:8333
-[2a01:4f8:150:72ee::4202]:8333
-[2a01:4f8:150:8324::2]:9001
-[2a01:4f8:151:21ca::2]:8333
-[2a01:4f8:151:41c2:0:5404:a67e:f250]:8333
-[2a01:4f8:151:5128::2]:8333
+[2a01:4f8:141:22ae::2]:8333
+[2a01:4f8:141:322c::2]:8333
+[2a01:4f8:150:11d4::2]:8333
+[2a01:4f8:150:440f::2]:8333
+[2a01:4f8:150:61ee::2]:8333
+[2a01:4f8:150:726b::2]:8333
+[2a01:4f8:151:30c9::2]:15000
+[2a01:4f8:151:41a2::2]:8333
+[2a01:4f8:151:41cc::2]:8333
[2a01:4f8:151:52c6::154]:8333
-[2a01:4f8:151:6347::2]:9001
-[2a01:4f8:160:5136::2]:8333
-[2a01:4f8:160:72c5::2858:e1c5]:8333
-[2a01:4f8:160:72c5::593b:60d5]:8333
+[2a01:4f8:151:600b::1:1]:8333
+[2a01:4f8:151:7175::2]:8333
+[2a01:4f8:160:41f0::1:33]:8333
+[2a01:4f8:160:5328::27f0:187a]:8333
[2a01:4f8:160:814f::2]:8333
-[2a01:4f8:161:13d0::2]:8333
-[2a01:4f8:161:228f::2]:8333
-[2a01:4f8:161:51c4::2]:8333
-[2a01:4f8:161:60a7::2]:8333
+[2a01:4f8:161:21ad::333:30]:8333
[2a01:4f8:161:7026::2]:8333
-[2a01:4f8:161:9184::2]:8333
-[2a01:4f8:162:2108::2]:8333
-[2a01:4f8:162:218c::2]:8333
-[2a01:4f8:162:4443::2]:8333
-[2a01:4f8:162:51a3::2]:8333
+[2a01:4f8:162:4110::2]:8333
+[2a01:4f8:162:4348::2]:8333
+[2a01:4f8:171:1c1b::2]:8333
+[2a01:4f8:171:1c3::2]:8333
+[2a01:4f8:171:2258::2]:8333
+[2a01:4f8:171:2a70::2]:8333
+[2a01:4f8:171:2e1b::2]:8333
+[2a01:4f8:171:2f28::2]:8333
+[2a01:4f8:171:3248::2]:8333
+[2a01:4f8:171:380c::2]:8333
[2a01:4f8:171:b93::2]:8333
-[2a01:4f8:190:1483::1]:8333
-[2a01:4f8:190:4495::2]:8333
-[2a01:4f8:190:64c9::2]:8333
+[2a01:4f8:171:d0a::2]:8333
+[2a01:4f8:172:116c::2]:8333
+[2a01:4f8:172:1287::2]:8333
+[2a01:4f8:172:17a9::2]:8333
+[2a01:4f8:172:1ca7::2]:8333
+[2a01:4f8:172:2159::2]:8333
+[2a01:4f8:172:3a41::2]:8333
+[2a01:4f8:172:3b42::2]:8333
+[2a01:4f8:172:3ec1::2]:8333
+[2a01:4f8:172:3ec2::2]:8333
+[2a01:4f8:172:aeb::2]:8333
+[2a01:4f8:172:aec::2]:8333
+[2a01:4f8:173:10ab::2]:8333
+[2a01:4f8:173:1551::2]:8333
+[2a01:4f8:173:1bca::2]:8333
+[2a01:4f8:173:1e2e::2]:8333
+[2a01:4f8:173:2162::2]:8333
+[2a01:4f8:173:21e6::2]:8333
+[2a01:4f8:173:42::2]:8333
+[2a01:4f8:173:cc1::2]:8333
+[2a01:4f8:190:1253::2]:8333
+[2a01:4f8:190:24eb::2]:8333
+[2a01:4f8:190:34f0::2]:8333
+[2a01:4f8:190:528d::2]:8333
[2a01:4f8:190:91ce::2]:8333
[2a01:4f8:191:2194::83]:8333
[2a01:4f8:191:40e8::2]:8333
-[2a01:4f8:191:44b4::2]:8333
-[2a01:4f8:191:8242::2]:8333
-[2a01:4f8:191:83a2::2]:8333
-[2a01:4f8:192:11b2::2]:8333
+[2a01:4f8:191:8165::2]:22556
+[2a01:4f8:191:81b7::2]:8333
+[2a01:4f8:191:8328::3]:8333
+[2a01:4f8:192:11b2::2]:8343
[2a01:4f8:192:216c::2]:8333
-[2a01:4f8:192:22b3::2]:8333
+[2a01:4f8:192:22af::2]:8333
+[2a01:4f8:192:2422::2]:8333
+[2a01:4f8:192:34d0::2]:8333
[2a01:4f8:192:440b::2]:8333
+[2a01:4f8:192:5230::2]:8333
[2a01:4f8:192:db::2]:8333
[2a01:4f8:200:1012::2]:8333
-[2a01:4f8:200:23d1::dead:beef]:8333
-[2a01:4f8:200:506d::2]:8333
-[2a01:4f8:200:51f0::2]:8333
-[2a01:4f8:200:5389::2]:8333
-[2a01:4f8:200:53e3::2]:8333
-[2a01:4f8:200:6344::2]:8333
-[2a01:4f8:200:6396::2]:8333
-[2a01:4f8:200:63af::119]:8333
-[2a01:4f8:200:71e3:78b4:f3ff:fead:e8cf]:8333
-[2a01:4f8:201:214c::2]:8333
-[2a01:4f8:201:233:1::3]:8333
-[2a01:4f8:201:3e3::2]:8333
+[2a01:4f8:200:414e::2]:8333
+[2a01:4f8:200:416a::2]:8333
+[2a01:4f8:201:21a7::2]:8333
+[2a01:4f8:201:4017::11]:8333
[2a01:4f8:201:6011::4]:8333
[2a01:4f8:201:60d5::2]:8333
-[2a01:4f8:202:265::2]:8333
-[2a01:4f8:202:3115::2]:8333
+[2a01:4f8:202:12d6::2]:8333
[2a01:4f8:202:31e3::2]:8333
-[2a01:4f8:202:31ef::2]:8333
-[2a01:4f8:202:3392::2]:8333
+[2a01:4f8:202:32c6::2]:8333
[2a01:4f8:202:53c3::2]:8333
-[2a01:4f8:202:63f4::2]:8333
-[2a01:4f8:202:7227::2]:8333
-[2a01:4f8:210:2227::2]:8333
-[2a01:4f8:210:24aa::2]:8333
[2a01:4f8:211:14cf::2]:8333
-[2a01:4f8:211:181b::2]:8333
-[2a01:4f8:212:289e::2]:8333
-[2a01:4f8:212:33db::2]:18333
-[2a01:4f8:a0:112f::2]:8333
-[2a01:4f8:a0:3174::2]:8333
-[2a01:4f8:a0:328c::2]:8333
-[2a01:4f8:a0:5243::2]:8333
-[2a01:4f8:c17:19b9::2]:8333
-[2a01:4f8:c17:1a41::2]:8333
-[2a01:4f8:c17:1a92::2]:8333
-[2a01:4f8:c17:273::2]:8333
-[2a01:4f8:c17:435::2]:8333
-[2a01:4f8:c17:755::2]:8333
-[2a01:4f8:c17:b54::2]:8333
-[2a01:4f8:d16:9384::2]:8333
+[2a01:4f8:211:1ec5::2]:8333
+[2a01:4f8:211:483::2]:8333
+[2a01:4f8:211:d99::8]:8333
+[2a01:4f8:212:1826::2]:8333
+[2a01:4f8:212:27a8::2]:8333
+[2a01:4f8:221:801::2]:8333
+[2a01:4f8:a0:12cc::2]:8333
+[2a01:4f8:a0:746a:101:1:1:2]:8333
+[2a01:4f8:a0:828a::2]:8333
+[2a01:4f8:c17:2eef::2]:8333
+[2a01:4f8:c17:2f3c::2]:3333
+[2a01:4f8:c17:3b02::2]:8333
+[2a01:4f8:c17:4245::2]:8333
+[2a01:4f8:c17:464f::2]:8333
+[2a01:4f8:c17:4a1c::2]:8333
+[2a01:4f8:c17:4c5d::2]:8333
+[2a01:4f8:c17:67f8::2]:8333
+[2a01:4f8:c17:6dd0::2]:8333
+[2a01:4f8:c17:710b::2]:8333
+[2a01:4f8:c17:714::2]:8333
+[2a01:4f8:c17:72c6::2]:8333
[2a01:608:ffff:a009:8bf5:879d:e51a:f837]:8333
-[2a01:680:10:10:f2de:f1ff:fec9:dc0]:8333
-[2a01:7c8:aaac:1f6:5054:ff:fe30:e585]:8333
-[2a01:7c8:aaac:20b:5054:ff:fe24:435e]:8333
+[2a01:680:10:10::1]:8333
+[2a01:6f0:ffff:120::8dcb]:8333
+[2a01:79c:cebc:857c:98c1:88ff:fef5:90de]:8333
+[2a01:79d:7377:2629:7e57:7e57:1:1]:8333
[2a01:7c8:aaac:43d:5054:ff:fe4e:3dd4]:8333
-[2a01:7c8:aaad:256::1]:8333
-[2a01:7c8:aab6:ea:5054:ff:feff:eac3]:8333
-[2a01:7c8:aab9:5a:5054:ff:fe89:7b26]:8333
-[2a01:7c8:aabc:2c8:5054:ff:fe35:6581]:8333
-[2a01:7e00::f03c:91ff:fe18:301e]:8333
-[2a01:7e00::f03c:91ff:fe18:3942]:8333
+[2a01:7c8:aab5:3e6:5054:ff:fed7:4e54]:8333
+[2a01:7c8:aabd:3d5:5054:ff:fe95:f586]:8333
+[2a01:7c8:aac1:453:d0d2:af96:fa88:5d0e]:8333
+[2a01:7c8:aac3:663:5054:ff:fe25:8c69]:8333
+[2a01:7c8:aac3:97:5054:ff:fea7:3780]:8333
+[2a01:7c8:aac4:567:5054:ff:fedc:518a]:8333
[2a01:7e00::f03c:91ff:fe26:8c87]:8333
-[2a01:7e00::f03c:91ff:fe50:6206]:8333
-[2a01:7e00::f03c:91ff:fe67:559d]:8333
-[2a01:7e00::f03c:91ff:fe84:434f]:8333
+[2a01:7e00::f03c:91ff:fe50:94b8]:8333
+[2a01:7e00::f03c:91ff:fe55:2c]:8333
[2a01:7e00::f03c:91ff:fe89:1143]:8333
-[2a01:7e00::f03c:91ff:fe98:2505]:8333
-[2a01:7e00::f03c:91ff:fedb:352e]:8333
-[2a01:7e01::f03c:91ff:fec8:d7b5]:8333
-[2a01:e34:ee33:1640:c504:f677:b28a:ba42]:8333
-[2a01:e35:2e7e:bc0:e079:f55e:cef3:b5d7]:8333
+[2a01:7e00::f03c:91ff:fe89:53fd]:8333
+[2a01:7e00::f03c:91ff:fedf:b70f]:8333
+[2a01:b000::4166:515b:ef9e:b3]:8333
+[2a01:b2e0:2::40]:8333
+[2a01:e34:ec29:24c0:f3:ddaf:9f59:586f]:8333
+[2a01:e34:eed7:6670:ec1b:bf7c:b012:6069]:8333
[2a01:e35:2ee5:610:21f:d0ff:fe4e:7460]:8333
[2a01:e35:8a3f:47c0:c617:feff:fe3c:9fbd]:8333
-[2a01:e35:8aca:6a0:211:aff:fe5e:295e]:8333
-[2a02:180:a:18:81:7:11:50]:8333
-[2a02:1810:1d87:6a00:5604:a6ff:fe60:d87d]:8333
-[2a02:2168:1144:5c01:d63d:7eff:fedd:4f8e]:8333
-[2a02:2498:6d7b:7001:b508:b39d:2cea:5b7a]:8333
-[2a02:2528:503:2::15]:8333
-[2a02:2528:fa:1a56:216:44ff:fe6a:d112]:8333
-[2a02:27f8:2012:0:e9f7:268f:c441:6129]:8333
+[2a01:e35:8bff:70b0:1e1b:dff:fe0b:236d]:8333
+[2a02:1205:34c3:a4e0:d63d:7eff:fe98:10c8]:8333
+[2a02:1205:34da:aa00:5882:249d:ddbf:bc43]:8333
+[2a02:1205:5051:a640:d6ae:52ff:fea3:ac]:8333
+[2a02:1205:c689:d980:baae:edff:feea:9445]:8333
+[2a02:120b:2c2a:5ec0:10dd:31ff:fe42:5079]:8333
+[2a02:120b:2c35:69d0:219:99ff:fe6b:4ec3]:8333
+[2a02:120b:c3c2:ff60:21f:5bff:fec3:a7ad]:24312
+[2a02:13b8:4000:1000:216:e6ff:fe92:8619]:8333
+[2a02:13b8:4000:1000::27]:8333
+[2a02:17d0:2a:4400:40f:3dd4:b053:47ad]:8333
+[2a02:180:1:1::517:afb]:8333
+[2a02:180:6:1::18]:8333
+[2a02:1810:1d11:f900:6872:f28e:8126:f635]:8333
+[2a02:27a8:0:1:52e5:49ff:fee3:3b49]:8333
[2a02:348:86:3011::1]:8333
-[2a02:4780:1:1::1:8a01]:8333
-[2a02:578:5002:116::2]:8333
+[2a02:390:9000:0:218:7dff:fe10:be33]:8333
+[2a02:582:78c1:7600:2d49:6212:29d3:abb]:8333
[2a02:6080::1:190b:69e3]:8333
-[2a02:6080::1:e893:d9d6]:8333
-[2a02:770:4000::139]:8333
+[2a02:750:7:3305::575]:8333
+[2a02:752:100:3::53]:8333
+[2a02:7aa0:1201::7501:d950]:8333
[2a02:7aa0:1201::deb3:81a2]:8333
-[2a02:8010:b001::5860:59b5]:8333
-[2a02:810d:21c0:f00:a248:1cff:feb8:5348]:8333
-[2a02:a50::21b:24ff:fe93:4e39]:8333
-[2a02:a80:0:1200::2]:8333
-[2a02:c200:0:10:2:1:5830:1]:8333
-[2a02:c200:0:10:2:5:4692:1]:8333
-[2a02:c200:0:10:3:0:7158:1]:8333
-[2a02:c200:0:10::2244:1]:8333
-[2a02:c200:1:10:2:3:3339:1]:8333
-[2a02:c200:1:10:2:3:7844:1]:8333
-[2a02:c200:1:10:2:5:6288:1]:8333
-[2a02:c200:1:10:3:0:5912:1]:8333
+[2a02:7aa0:1619::a037:69a6]:8333
+[2a02:810d:14c0:8694:d250:99ff:fe81:23d9]:8333
+[2a02:a50::dacb:8aff:fe36:8d2d]:8333
+[2a02:c200:0:10:3:0:2591:1]:8333
+[2a02:c200:1:10:2:5:9982:1]:8333
+[2a02:c200:1:10:3:0:9290:1]:8333
+[2a02:c205:3000:7158::1]:8333
+[2a02:c205:3001:4522::1]:8333
+[2a02:c205:3001:6549::1]:8333
+[2a02:c207:2008:3772::1]:8333
+[2a02:c207:2008:6519::1]:8333
+[2a02:c207:2009:213::1]:8333
+[2a02:c207:2009:7858::1]:8333
+[2a02:c207:2010:302::1]:8333
+[2a02:c207:3001:5824::1]:8333
+[2a02:ce80:0:20::1]:8333
[2a03:4000:2:496::8]:8333
+[2a03:4000:6:416c::53]:8333
[2a03:4000:6:8009::1]:8333
-[2a03:4000:6:8063::bcd0]:8333
-[2a03:4900:fffc:b::2]:8333
-[2a03:b0c0:1:d0::d:5001]:8333
+[2a03:4000:9:8e::1]:8333
+[2a03:7380:2140:17:51fe:3519:b571:4a13]:8333
+[2a03:b0c0:0:1010::7a3:1001]:8333
+[2a03:b0c0:0:1010::7aa:4001]:8333
+[2a03:b0c0:3:d0::1b99:c001]:8333
+[2a03:b0c0:3:d0::1b99:e001]:8333
+[2a03:b0c0:3:d0::1b9a:3001]:8333
+[2a03:b0c0:3:d0::2208:6001]:8333
+[2a03:b0c0:3:d0::23f7:1001]:8333
+[2a03:b0c0:3:d0::23f7:9001]:8333
+[2a03:b0c0:3:d0::23fb:2001]:8333
+[2a03:b0c0:3:d0::23fb:3001]:8333
+[2a03:b0c0:3:d0::23fb:5001]:8333
+[2a03:b0c0:3:d0::23fb:7001]:8333
+[2a03:b0c0:3:d0::2400:1]:8333
+[2a03:b0c0:3:d0::2400:3001]:8333
+[2a03:b0c0:3:d0::2400:e001]:8333
+[2a03:b0c0:3:d0::2401:e001]:8333
+[2a03:b0c0:3:d0::2402:2001]:8333
+[2a03:b0c0:3:d0::2402:8001]:8333
+[2a03:b0c0:3:d0::2402:9001]:8333
+[2a03:b0c0:3:d0::2402:b001]:8333
+[2a03:b0c0:3:d0::2402:d001]:8333
+[2a03:b0c0:3:d0::2403:1001]:8333
+[2a03:b0c0:3:d0::2403:2001]:8333
+[2a03:b0c0:3:d0::2403:4001]:8333
+[2a03:b0c0:3:d0::2403:6001]:8333
+[2a03:b0c0:3:d0::2403:a001]:8333
+[2a03:b0c0:3:d0::2403:b001]:8333
+[2a03:b0c0:3:d0::2403:f001]:8333
+[2a03:b0c0:3:d0::2404:6001]:8333
+[2a03:b0c0:3:d0::2404:b001]:8333
[2a03:f80:ed15:149:154:155:235:1]:8333
-[2a03:f80:ed15:149:154:155:241:1]:8333
-[2a03:f80:ed16:ca7:ea75:b12d:2af:9e2a]:8333
-[2a04:1980:3100:1aab:290:faff:fe70:a3d8]:8333
-[2a04:1980:3100:1aab:e61d:2dff:fe29:f590]:8333
-[2a04:2f80:6:200::89]:8333
-[2a04:ac00:1:4a0b:5054:ff:fe00:5af5]:8333
-[2a04:ad80:0:68::35da]:8333
-3ffk7iumtx3cegbi.onion:8333
+[2a04:1980:3100:1aac:e61d:2dff:fe29:f241]:8333
+[2a04:1980:3100:1aac:e61d:2dff:fe29:f251]:8333
+[2a04:2180:0:1::5a49:3c06]:8333
+[2a04:2180:1:7::3]:8333
+[2a04:2e00:5:2e:9a4b:e1ff:fe62:6dc0]:8333
+[2a04:3542:1000:910:8492:b8ff:fe91:711d]:8333
+[2a04:dbc3:fffe:0:e61f:13ff:fe95:8401]:8333
+[2a06:9fc0:2a06:9fc0:2a06:9fc1:67c:e706]:8333
+[2c0f:f738:2004:82::]:8333
+2hryb3uh3tzwgnya.onion:8333
3nmbbakinewlgdln.onion:8333
-4j77gihpokxu2kj4.onion:8333
-546esc6botbjfbxb.onion:8333
-5at7sq5nm76xijkd.onion:8333
-77mx2jsxaoyesz2p.onion:8333
-7g7j54btiaxhtsiy.onion:8333
-a6obdgzn67l7exu3.onion:8333
-ab64h7olpl7qpxci.onion:8333
-am2a4rahltfuxz6l.onion:8333
-azuxls4ihrr2mep7.onion:8333
-bitcoin7bi4op7wb.onion:8333
-bitcoinostk4e4re.onion:8333
+3qeri3tmhzmpegyv.onion:8333
+4wdknmecghcmclq5.onion:8333
+53tsjt6zq3iasv5q.onion:8333
+5cg7qeywvwo6vxpt.onion:8333
+5gbcrgqxcbxj253s.onion:8333
+6cn4ilbwkrkh7gwo.onion:8333
+6e4jrnn7igeqxmlf.onion:8333
+6ymgbvnn6d5nfmv4.onion:8333
+6zsh3bfduhpo7ldl.onion:8333
+72fq6phv4fg4rhvh.onion:8333
+7gdqp6npusk4lfwk.onion:8333
+a7emxol55e623lqc.onion:8333
+assbiydziq77zaki.onion:8333
+bafk5ioatlgt7dgl.onion:8333
bk7yp6epnmcllq72.onion:8333
-bmutjfrj5btseddb.onion:8333
-ceeji4qpfs3ms3zc.onion:8333
-clexmzqio7yhdao4.onion:8333
+brwqezn6le54w2bb.onion:8333
+bs4bq6s6qkvt5hpi.onion:8333
+bup5n5e3kurvjzf3.onion:8333
+c2tpqkaz4ihjzwgb.onion:8333
+cernrmrk5zomzozn.onion:8333
+cfyegj64ht3jpodr.onion:8333
+cg5vg54cazzpvoug.onion:8333
+cgk4u2lxrvml4jvb.onion:8333
+cjygd7pu5lqkky5j.onion:8333
+d6wubsdtr46dd5ki.onion:8333
+dfq6yjc3aelplwr4.onion:8333
+dqpxwlpnv3z3hznl.onion:8333
+eamfospuveabaimd.onion:8333
+ep2mjzox3kvb6ax4.onion:8333
+fpbxb4wjudiw2w5a.onion:8333
+fu5hfsbbf5jwsvhv.onion:8333
+g4freoibsczujle3.onion:8333
gb5ypqt63du3wfhn.onion:8333
-h2vlpudzphzqxutd.onion:8333
-n42h7r6oumcfsbrs.onion:4176
-ncwk3lutemffcpc4.onion:8333
+ggdy2pb2avlbtjwq.onion:8333
+gh2aiddzxmvyrnue.onion:8333
+gnxgylbgzvaazkq7.onion:8333
+hnizdxnejel64ubk.onion:8333
+htvdcmlc3abji2ab.onion:8443
+hwuboois4gslupgx.onion:8333
+hxz6gowludlj6d5a.onion:8333
+j6umo4bnsztpsonc.onion:8333
+jdunmaocwbbnw565.onion:8333
+ktv3qlxl7xvmdlf4.onion:8333
+kvd44sw7skb5folw.onion:8333
+kwimnzm6vd4zakvl.onion:8333
+la5xhk3lprxzxmz2.onion:8333
+lc7cx67end26uutp.onion:8352
+mwu5og2agcspmgkx.onion:8333
+mzxkipiyekaoh7my.onion:8333
+n6rwlrtwpqc7qwo7.onion:8333
+nj36424yccqph62z.onion:8333
+o256w7t3vcgktmxk.onion:8333
+o4sl5na6jeqgi3l6.onion:8333
okdzjarwekbshnof.onion:8333
-pjghcivzkoersesd.onion:8333
-rw7ocjltix26mefn.onion:8333
-uws7itep7o3yinxo.onion:8333
-vk3qjdehyy4dwcxw.onion:8333
+oyebydl2pacx6v26.onion:8333
+p5mx2imj75dpmime.onion:8333
+psco6bxjewljrczx.onion:8333
+pxtgswet6tlgrbwj.onion:8333
+rb4v3fhgx2zr4rre.onion:8333
+rjlnp3hwvrsmap6e.onion:8333
+rlafimkctvz63llg.onion:8333
+rxjvy5eyttep5tts.onion:8333
+seoskudzk6vn6mqz.onion:8333
+tpgdufxxsw3jkrdf.onion:8333
+tuiyvqgi3o675pjb.onion:8333
+tx4zd7d5exonnblh.onion:8333
+uokg6avfgbhofls3.onion:8333
+v3gjphgqy5hygcml.onion:8333
+vhdoxqq63xr53ol7.onion:8333
+visevrizz3quyagj.onion:8333
vqpye2k5rcqvj5mq.onion:8333
-wpi7rpvhnndl52ee.onion:8333
+wfsx2gi7djhy22hk.onion:8333
+wg6vwmbrzyyzapun.onion:8333
+xub4w3w4wwk56xiq.onion:8333
+ycivnom44dmxx4ob.onion:8333
+ywskufc62bf2fum4.onion:8333
+z4fax2vxg23t2ddf.onion:8333
+zo5dklwelmdrpo5n.onion:8333
diff --git a/contrib/testgen/base58.py b/contrib/testgen/base58.py
index bb0aeaff05..0d09692b36 100644
--- a/contrib/testgen/base58.py
+++ b/contrib/testgen/base58.py
@@ -84,7 +84,6 @@ def b58decode_chk(v):
result = b58decode(v)
if result is None:
return None
- h3 = checksum(result[:-4])
if result[-4:] == checksum(result[:-4]):
return result[:-4]
else:
diff --git a/contrib/testgen/gen_base58_test_vectors.py b/contrib/testgen/gen_base58_test_vectors.py
index 7e475b7a36..ac0701e6be 100755
--- a/contrib/testgen/gen_base58_test_vectors.py
+++ b/contrib/testgen/gen_base58_test_vectors.py
@@ -45,7 +45,6 @@ def is_valid(v):
result = b58decode_chk(v)
if result is None:
return False
- valid = False
for template in templates:
prefix = str(bytearray(template[0]))
suffix = str(bytearray(template[2]))
diff --git a/contrib/verify-commits/allow-revsig-commits b/contrib/verify-commits/allow-revsig-commits
index e69de29bb2..f0088cdca4 100644
--- a/contrib/verify-commits/allow-revsig-commits
+++ b/contrib/verify-commits/allow-revsig-commits
@@ -0,0 +1,104 @@
+a06ede9a138d0fb86b0de17c42b936d9fe6e2158
+923dc447eaa8e017985b2afbbb12dd1283fbea0e
+71148b8947fe8b4d756822420a7f31c380159425
+6696b4635ceb9b47aaa63244bff9032fa7b08354
+812714fd80e96e28cd288c553c83838cecbfc2d9
+8a445c5651edb9a1f51497055b7ddf4402be9188
+e126d0c12ca66278d9e7b12187c5ff4fc02a7e6c
+3908fc4728059719bed0e1c7b1c8b388c2d4a8da
+8b66bf74e2a349e71eaa183af81fa63eaee76ad2
+05950427d310654774031764a7141a1a4fd9c6e4
+07fd147b9f12e9205afd66a624edce357977d615
+12e31127948fa4bb01c3bddc1b8c85b432f7465b
+8c87f175d335e9d9e93f987d871ae9f05f6a10a7
+46b249e578e8a3dfbe85bc7253a12e82ef4b658b
+a55716abe5662ec74c2f8af93023f1e7cca901fc
+f646275b90b1de93bc62b4c4d045d75ac0b96eee
+c252685aa5867631e9a5ef07ccae7c7c25cae8ff
+a7d55c93385359952d85decd5037843ac70ba3d4
+7dac1e5e9e887f5f6ff146e812a05bd3bf281eae
+2a524b8e8fe69ef487fd8ea1b4f7a03f473ed201
+ce5c1f4acae43477989cdf9a82ed33703919cda2
+2db4cbcc437f51f5dac82cc4de46f383b92e6f11
+7aa700424cbda387536373d8dfec88aee43f950e
+b99a093afed880f23fb279c443cc6ae5e379cc43
+b83264d9c7a8ddb79f64bd9540caddc8632ef31f
+57e337d40e94ba33d8cd265c134d6ef857b32b59
+a1dcf2e1087beaf3981739fd2bb74f35ecad630a
+d38b0d7a6b6056cba26999b702815775e2437d87
+815640ec6af9a38d6a2da4a4400056e2f4105080
+09c4fd157c5b88df2d97fad4826c79b094db90c9
+2efcfa5acfacb958973d9e8125e1d81f102e2dfd
+dc6dee41f7cf2ba93fcd0fea7c157e4b2775d439
+ad826b3df9f763b49f1e3e3d50c4efdd438c7547
+c1a52276848d8caa9a9789dff176408c1aa6b1ed
+3bf06e9bac57b5b5a746677b75e297a7b154bdbd
+72ae6f8cf0224370e8121d6769b21e612ca15d6f
+a143b88dbd4971ecfdd1d39a494489c8f2db0344
+76fec09d878d6dbf214bdb6228d480bd9195db4c
+93566e0c37c5ae104095474fea89f00dcb40f551
+407d9232ef5cb1ebf6cff21f3d13e07ea4158eeb
+9346f8429957e356d21c665bab59fe45bcf1f74e
+6eeac6e30d65f9a972067c1ea8c49978c8e631ac
+dc6b9406bdfab2af8c86cb080cb3e6cf8f2385d8
+9f554e03ebe5701c1b75ff03b3d6152095c0cad3
+05009935f9ac070197113954d680bc2c9150b9b3
+508404de98a8a5435f52916cef8f328e82651961
+ed0cc50afed146c27f6d8129c683c225fb940093
+6429cfa8a70308241c576aeb92ffe3db5203b2ef
+6898213409811b140843c3d89af43328c3b22fad
+5b2ea29cf4fd298346437bb16a54407f8c1f9dca
+e2a1a1ee895149c544d4ae295466611f0cec3094
+e82fb872ff5cc8fd22d43327c1ee3e755f61c562
+19b0f33de0efd9da788e8e4f3fdc2a9e159abdb1
+89de1538ce1f8c00f80e8d11f43e1b77e24d7dea
+de07fdcf77e97b8613091285e4d0a734f5de7492
+01680195f8aa586c55c44767397380def3a23b54
+05e1c85fb687c82ae477c72d4a7e2d6b0c692167
+c072b8fd95cd4fa84f08189a0cd8b173ea2dbb8e
+9a0ed08b40b15ae2b791aa8549b53e69934b4ea7
+53f8f226bd1d627c4a6dec5862a1d4ea5a933e45
+9d0f43b7ca7241d8a018fd35dd3bc01555235ec6
+f12d2b5a8ac397e4bcaefcc19898f8ff5705dea5
+8250de13587ed05ca45df3e12c5dc9bcb1500e2c
+d727f77e390426e9e463336bda08d50c451c7086
+484312bda2d43e3ea60047be076332299463adf8
+c7e05b35ab0a791c7a8e2d863e716fdec6f3f671
+b9c1cd81848da9de1baf9c2f29c19c50e549de13
+8ea7d31e384975019733b5778feabbd9955c79d8
+f798b891bcecea9548eedacae70eeb9906c1ddbf
+ebefe7a00b46579cdd1e033a8c7fd8ce9aa578e4
+ad087638ee4864d6244ec9381ff764bfa6ee5086
+66db2d62d59817320c9182fc18e75a93b76828ea
+7ce9ac5c83b1844a518ef2e12e87aae3cacdfe58
+4286f43025149cf44207c3ad98e4a1f068520ada
+cd0c5135ab2291aaa5410ac919bad3fc87249a4a
+66ed450d771a8fc01c159a8402648ebd1c35eb4c
+a82f03393a32842d49236e8666ee57805ca701f8
+f972b04d63eb8af79ff3cec1dc561ed13dfa6053
+ec45cc5e27668171b55271b0c735194c70e7da41
+715e9fd7454f7a48d7adba7d42f662c20a3e3367
+2e0a99037dcc35bc63ba0d54371bc678af737c8e
+7fa8d758598407f3bf0beb0118dc122ea5340736
+6a22373771edbc3c7513cacb9355f880c73c2cbf
+b89ef131147f71a96152a7b5c4374266cdf539b2
+01d8359983e2f77b5118fede3ffa947072c666c8
+58f0c929a3d70a4bff79cc200f1c186f71ef1675
+950be19727a581970591d8f8138dfe4725750382
+425278d17bd0edf8a3a7cc81e55016f7fd8e7726
+c028c7b7557da2baff7af8840108e8be4db8e0c6
+47a7cfb0aa2498f6801026d258a59f9de48f60b0
+f6b7df3155ddb4cedfbcf5d3eb3383d4614b3a85
+d72098038f3b55a714ed8adb34fab547b15eb0d5
+c49c825bd9f4764536b45df5a684d97173673fc7
+33799afe83eec4200ff140e9bf5eae83701a4d7f
+5c3f8ddcaa1164079105c452429fccf8127b01b6
+1f01443567b03ac75a91c810f1733f5c21b5699d
+b3e42b6d02e8d19658a9135e427ebceab5367779
+69b3a6dd9d9a0adf5506c8b9fde42187356bd4a8
+bafd075c5e6a1088ef0f1aa0b0b224e026a3d3e0
+7daa3adb242d9c8728fdb15c6af6596aaad5502f
+514993554c370f4cf30a109ac28d5d64893dbf0a
+c8d2473e6cb042e7275a10c49d3f6a4a91bf0166
+386f4385ab04b0b2c3d47bddc0dc0f2de7354964
+9f33dba05c01ecc5c56eb1284ab7d64d42f55171
diff --git a/contrib/verify-commits/gpg.sh b/contrib/verify-commits/gpg.sh
index 09ff237544..b01e2a6d39 100755
--- a/contrib/verify-commits/gpg.sh
+++ b/contrib/verify-commits/gpg.sh
@@ -8,21 +8,43 @@ VALID=false
REVSIG=false
IFS='
'
-for LINE in $(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null); do
+if [ "$BITCOIN_VERIFY_COMMITS_ALLOW_SHA1" = 1 ]; then
+ GPG_RES="$(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null)"
+else
+ # Note how we've disabled SHA1 with the --weak-digest option, disabling
+ # signatures - including selfsigs - that use SHA1. While you might think that
+ # collision attacks shouldn't be an issue as they'd be an attack on yourself,
+ # in fact because what's being signed is a commit object that's
+ # semi-deterministically generated by untrusted input (the pull-req) in theory
+ # an attacker could construct a pull-req that results in a commit object that
+ # they've created a collision for. Not the most likely attack, but preventing
+ # it is pretty easy so we do so as a "belt-and-suspenders" measure.
+ GPG_RES=""
+ for LINE in "$(gpg --version)"; do
+ case "$LINE" in
+ "gpg (GnuPG) 1.4.1"*|"gpg (GnuPG) 2.0."*)
+ echo "Please upgrade to at least gpg 2.1.10 to check for weak signatures" > /dev/stderr
+ GPG_RES="$(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null)"
+ ;;
+ # We assume if you're running 2.1+, you're probably running 2.1.10+
+ # gpg will fail otherwise
+ # We assume if you're running 1.X, it is either 1.4.1X or 1.4.20+
+ # gpg will fail otherwise
+ esac
+ done
+ [ "$GPG_RES" = "" ] && GPG_RES="$(echo "$INPUT" | gpg --trust-model always --weak-digest sha1 "$@" 2>/dev/null)"
+fi
+for LINE in $(echo "$GPG_RES"); do
case "$LINE" in
"[GNUPG:] VALIDSIG "*)
while read KEY; do
- case "$LINE" in "[GNUPG:] VALIDSIG $KEY "*) VALID=true;; esac
+ [ "${LINE#?GNUPG:? VALIDSIG * * * * * * * * * }" = "$KEY" ] && VALID=true
done < ./contrib/verify-commits/trusted-keys
;;
"[GNUPG:] REVKEYSIG "*)
[ "$BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG" != 1 ] && exit 1
- while read KEY; do
- case "$LINE" in "[GNUPG:] REVKEYSIG ${KEY#????????????????????????} "*)
- REVSIG=true
- GOODREVSIG="[GNUPG:] GOODSIG ${KEY#????????????????????????} "
- esac
- done < ./contrib/verify-commits/trusted-keys
+ REVSIG=true
+ GOODREVSIG="[GNUPG:] GOODSIG ${LINE#* * *}"
;;
esac
done
@@ -30,7 +52,7 @@ if ! $VALID; then
exit 1
fi
if $VALID && $REVSIG; then
- echo "$INPUT" | gpg --trust-model always "$@" | grep "\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)" 2>/dev/null
+ echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null | grep "\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)"
echo "$GOODREVSIG"
else
echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null
diff --git a/contrib/verify-commits/trusted-keys b/contrib/verify-commits/trusted-keys
index 75242c2a97..5610692616 100644
--- a/contrib/verify-commits/trusted-keys
+++ b/contrib/verify-commits/trusted-keys
@@ -1,4 +1,4 @@
71A3B16735405025D447E8F274810B012346C9A6
-3F1888C6DCA92A6499C4911FDBA1A67379A1A931
+133EAC179436F14A5CF1B794860FEB804E669320
32EE5C4C3FA15CCADB46ABE529D4BCB6416F53EC
-FE09B823E6D83A3BC7983EAA2D7F2372E50FE137
+B8B3F1C0E58C15DB6A81D30C3648A882F4316B9B
diff --git a/contrib/verify-commits/trusted-sha512-root-commit b/contrib/verify-commits/trusted-sha512-root-commit
new file mode 100644
index 0000000000..c28f50ff78
--- /dev/null
+++ b/contrib/verify-commits/trusted-sha512-root-commit
@@ -0,0 +1 @@
+f7ec7cfd38b543ba81ac7bed5b77f9a19739460b
diff --git a/contrib/verify-commits/verify-commits.sh b/contrib/verify-commits/verify-commits.sh
index cfe4f11a0b..40c9341445 100755
--- a/contrib/verify-commits/verify-commits.sh
+++ b/contrib/verify-commits/verify-commits.sh
@@ -9,7 +9,10 @@
DIR=$(dirname "$0")
[ "/${DIR#/}" != "$DIR" ] && DIR=$(dirname "$(pwd)/$0")
+echo "Using verify-commits data from ${DIR}"
+
VERIFIED_ROOT=$(cat "${DIR}/trusted-git-root")
+VERIFIED_SHA512_ROOT=$(cat "${DIR}/trusted-sha512-root-commit")
REVSIG_ALLOWED=$(cat "${DIR}/allow-revsig-commits")
HAVE_FAILED=false
@@ -17,20 +20,78 @@ IS_SIGNED () {
if [ $1 = $VERIFIED_ROOT ]; then
return 0;
fi
+
+ VERIFY_TREE=$2
+ NO_SHA1=$3
+ if [ $1 = $VERIFIED_SHA512_ROOT ]; then
+ if [ "$VERIFY_TREE" = "1" ]; then
+ echo "All Tree-SHA512s matched up to $VERIFIED_SHA512_ROOT" > /dev/stderr
+ fi
+ VERIFY_TREE=0
+ NO_SHA1=0
+ fi
+
+ if [ "$NO_SHA1" = "1" ]; then
+ export BITCOIN_VERIFY_COMMITS_ALLOW_SHA1=0
+ else
+ export BITCOIN_VERIFY_COMMITS_ALLOW_SHA1=1
+ fi
+
if [ "${REVSIG_ALLOWED#*$1}" != "$REVSIG_ALLOWED" ]; then
export BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG=1
else
export BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG=0
fi
- if ! git -c "gpg.program=${DIR}/gpg.sh" verify-commit $1 > /dev/null 2>&1; then
+
+ if ! git -c "gpg.program=${DIR}/gpg.sh" verify-commit $1 > /dev/null; then
return 1;
fi
+
+ # We set $4 to 1 on the first call, always verifying the top of the tree
+ if [ "$VERIFY_TREE" = 1 -o "$4" = "1" ]; then
+ IFS_CACHE="$IFS"
+ IFS='
+'
+ for LINE in $(git ls-tree --full-tree -r $1); do
+ case "$LINE" in
+ "12"*)
+ echo "Repo contains symlinks" > /dev/stderr
+ IFS="$IFS_CACHE"
+ return 1
+ ;;
+ esac
+ done
+ IFS="$IFS_CACHE"
+
+ FILE_HASHES=""
+ for FILE in $(git ls-tree --full-tree -r --name-only $1 | LC_ALL=C sort); do
+ HASH=$(git cat-file blob $1:"$FILE" | sha512sum | { read FIRST OTHER; echo $FIRST; } )
+ [ "$FILE_HASHES" != "" ] && FILE_HASHES="$FILE_HASHES"'
+'
+ FILE_HASHES="$FILE_HASHES$HASH $FILE"
+ done
+ HASH_MATCHES=0
+ MSG="$(git show -s --format=format:%B $1 | tail -n1)"
+
+ case "$MSG -" in
+ "Tree-SHA512: $(echo "$FILE_HASHES" | sha512sum)")
+ HASH_MATCHES=1;;
+ esac
+
+ if [ "$HASH_MATCHES" = "0" ]; then
+ echo "Tree-SHA512 did not match for commit $1" > /dev/stderr
+ HAVE_FAILED=true
+ return 1
+ fi
+ fi
+
local PARENTS
PARENTS=$(git show -s --format=format:%P $1)
for PARENT in $PARENTS; do
- if IS_SIGNED $PARENT > /dev/null; then
+ if IS_SIGNED $PARENT $VERIFY_TREE $NO_SHA1 0; then
return 0;
fi
+ break
done
if ! "$HAVE_FAILED"; then
echo "No parent of $1 was signed with a trusted key!" > /dev/stderr
@@ -49,7 +110,12 @@ else
TEST_COMMIT="$1"
fi
-IS_SIGNED "$TEST_COMMIT"
+DO_CHECKOUT_TEST=0
+if [ x"$2" = "x--tree-checks" ]; then
+ DO_CHECKOUT_TEST=1
+fi
+
+IS_SIGNED "$TEST_COMMIT" "$DO_CHECKOUT_TEST" 1 1
RES=$?
if [ "$RES" = 1 ]; then
if ! "$HAVE_FAILED"; then
diff --git a/contrib/zmq/zmq_sub.py b/contrib/zmq/zmq_sub.py
index 3dea5e3c14..ea398a27ea 100755
--- a/contrib/zmq/zmq_sub.py
+++ b/contrib/zmq/zmq_sub.py
@@ -1,44 +1,84 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
# Copyright (c) 2014-2016 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-import array
+"""
+ ZMQ example using python3's asyncio
+
+ Bitcoin should be started with the command line arguments:
+ bitcoind -testnet -daemon \
+ -zmqpubhashblock=tcp://127.0.0.1:28332 \
+ -zmqpubrawtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashblock=tcp://127.0.0.1:28332
+
+ We use the asyncio library here. `self.handle()` installs itself as a
+ future at the end of the function. Since it never returns with the event
+ loop having an empty stack of futures, this creates an infinite loop. An
+ alternative is to wrap the contents of `handle` inside `while True`.
+
+ A blocking example using python 2.7 can be obtained from the git history:
+ https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py
+"""
+
import binascii
+import asyncio
import zmq
+import zmq.asyncio
+import signal
import struct
+import sys
+
+if not (sys.version_info.major >= 3 and sys.version_info.minor >= 5):
+ print("This example only works with Python 3.5 and greater")
+ exit(1)
port = 28332
-zmqContext = zmq.Context()
-zmqSubSocket = zmqContext.socket(zmq.SUB)
-zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "hashblock")
-zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "hashtx")
-zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "rawblock")
-zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "rawtx")
-zmqSubSocket.connect("tcp://127.0.0.1:%i" % port)
-
-try:
- while True:
- msg = zmqSubSocket.recv_multipart()
- topic = str(msg[0])
+class ZMQHandler():
+ def __init__(self):
+ self.loop = zmq.asyncio.install()
+ self.zmqContext = zmq.asyncio.Context()
+
+ self.zmqSubSocket = self.zmqContext.socket(zmq.SUB)
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashblock")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashtx")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawblock")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawtx")
+ self.zmqSubSocket.connect("tcp://127.0.0.1:%i" % port)
+
+ async def handle(self) :
+ msg = await self.zmqSubSocket.recv_multipart()
+ topic = msg[0]
body = msg[1]
- sequence = "Unknown";
+ sequence = "Unknown"
if len(msg[-1]) == 4:
msgSequence = struct.unpack('<I', msg[-1])[-1]
sequence = str(msgSequence)
- if topic == "hashblock":
- print '- HASH BLOCK ('+sequence+') -'
- print binascii.hexlify(body)
- elif topic == "hashtx":
- print '- HASH TX ('+sequence+') -'
- print binascii.hexlify(body)
- elif topic == "rawblock":
- print '- RAW BLOCK HEADER ('+sequence+') -'
- print binascii.hexlify(body[:80])
- elif topic == "rawtx":
- print '- RAW TX ('+sequence+') -'
- print binascii.hexlify(body)
-
-except KeyboardInterrupt:
- zmqContext.destroy()
+ if topic == b"hashblock":
+ print('- HASH BLOCK ('+sequence+') -')
+ print(binascii.hexlify(body))
+ elif topic == b"hashtx":
+ print('- HASH TX ('+sequence+') -')
+ print(binascii.hexlify(body))
+ elif topic == b"rawblock":
+ print('- RAW BLOCK HEADER ('+sequence+') -')
+ print(binascii.hexlify(body[:80]))
+ elif topic == b"rawtx":
+ print('- RAW TX ('+sequence+') -')
+ print(binascii.hexlify(body))
+ # schedule ourselves to receive the next message
+ asyncio.ensure_future(self.handle())
+
+ def start(self):
+ self.loop.add_signal_handler(signal.SIGINT, self.stop)
+ self.loop.create_task(self.handle())
+ self.loop.run_forever()
+
+ def stop(self):
+ self.loop.stop()
+ self.zmqContext.destroy()
+
+daemon = ZMQHandler()
+daemon.start()
diff --git a/contrib/zmq/zmq_sub3.4.py b/contrib/zmq/zmq_sub3.4.py
new file mode 100755
index 0000000000..a2ff64b29b
--- /dev/null
+++ b/contrib/zmq/zmq_sub3.4.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+# Copyright (c) 2014-2016 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+"""
+ ZMQ example using python3's asyncio
+
+ Bitcoin should be started with the command line arguments:
+ bitcoind -testnet -daemon \
+ -zmqpubhashblock=tcp://127.0.0.1:28332 \
+ -zmqpubrawtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashblock=tcp://127.0.0.1:28332
+
+ We use the asyncio library here. `self.handle()` installs itself as a
+ future at the end of the function. Since it never returns with the event
+ loop having an empty stack of futures, this creates an infinite loop. An
+ alternative is to wrap the contents of `handle` inside `while True`.
+
+ The `@asyncio.coroutine` decorator and the `yield from` syntax found here
+ was introduced in python 3.4 and has been deprecated in favor of the `async`
+ and `await` keywords respectively.
+
+ A blocking example using python 2.7 can be obtained from the git history:
+ https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py
+"""
+
+import binascii
+import asyncio
+import zmq
+import zmq.asyncio
+import signal
+import struct
+import sys
+
+if not (sys.version_info.major >= 3 and sys.version_info.minor >= 4):
+ print("This example only works with Python 3.4 and greater")
+ exit(1)
+
+port = 28332
+
+class ZMQHandler():
+ def __init__(self):
+ self.loop = zmq.asyncio.install()
+ self.zmqContext = zmq.asyncio.Context()
+
+ self.zmqSubSocket = self.zmqContext.socket(zmq.SUB)
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashblock")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashtx")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawblock")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawtx")
+ self.zmqSubSocket.connect("tcp://127.0.0.1:%i" % port)
+
+ @asyncio.coroutine
+ def handle(self) :
+ msg = yield from self.zmqSubSocket.recv_multipart()
+ topic = msg[0]
+ body = msg[1]
+ sequence = "Unknown";
+ if len(msg[-1]) == 4:
+ msgSequence = struct.unpack('<I', msg[-1])[-1]
+ sequence = str(msgSequence)
+ if topic == b"hashblock":
+ print('- HASH BLOCK ('+sequence+') -')
+ print(binascii.hexlify(body))
+ elif topic == b"hashtx":
+ print('- HASH TX ('+sequence+') -')
+ print(binascii.hexlify(body))
+ elif topic == b"rawblock":
+ print('- RAW BLOCK HEADER ('+sequence+') -')
+ print(binascii.hexlify(body[:80]))
+ elif topic == b"rawtx":
+ print('- RAW TX ('+sequence+') -')
+ print(binascii.hexlify(body))
+ # schedule ourselves to receive the next message
+ asyncio.ensure_future(self.handle())
+
+ def start(self):
+ self.loop.add_signal_handler(signal.SIGINT, self.stop)
+ self.loop.create_task(self.handle())
+ self.loop.run_forever()
+
+ def stop(self):
+ self.loop.stop()
+ self.zmqContext.destroy()
+
+daemon = ZMQHandler()
+daemon.start()